diff --git a/boards.txt b/boards.txt index c5d08ec..bc30f8c 100644 --- a/boards.txt +++ b/boards.txt @@ -21,13 +21,15 @@ star_otto.upload.altID=0 star_otto.build.mcu=cortex-m4 star_otto.build.board=STM32_STAR_OTTO star_otto.build.f_cpu=180000000L +star_otto.build.vid=0x2A03 +star_otto.build.pid=0x0058 star_otto.build.core=arduino star_otto.build.esp_ch_uart_br=460800 -star_otto.build.extra_flags=-DSTM32F469xx -DMCU_STM32F469NI -mthumb -DSTM32_HIGH_DENSITY -DESP_CH_UART -DESP_CH_UART_BR={build.esp_ch_uart_br} -star_otto.build.ldscript=link-tools/jtag.ld +star_otto.build.series=STM32F4xx star_otto.build.variant=otto -star_otto.build.variant_system_lib=libstm32f4_otto_gcc_rel.a -star_otto.build.vect=VECT_TAB_BASE -star_otto.build.density=STM32_HIGH_DENSITY +star_otto.build.cmsis_lib_gcc=arm_cortexM4l_math +#To enable USB add '-DUSBCON' +#To enable CDC add also '-DUSBD_USE_CDC' +star_otto.build.extra_flags=-DSTM32F469xx -DUSE_USB_FS -DUSBCON -DUSBD_USE_CDC {build.usb_flags} -DESP_CH_UART -DESP_CH_UART_BR={build.esp_ch_uart_br} ############################################################## diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h old mode 100755 new mode 100644 index a60b0e1..e544f0b --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -17,24 +17,68 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - - #ifndef Arduino_h #define Arduino_h -#include "WProgram.h" + +#include +#include +#include +#include +#include + +#include "binary.h" +#include "itoa.h" + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +// Includes CMSIS +#include + +#include "wiring_constants.h" + +#define clockCyclesPerMicrosecond() ( SystemCoreClock / 1000000L ) +#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (SystemCoreClock / 1000L) ) +#define microsecondsToClockCycles(a) ( (a) * (SystemCoreClock / 1000000L) ) + +void yield(void); + +/* sketch */ +extern void setup( void ) ; +extern void loop( void ) ; + +/* Define attribute */ +#if defined ( __CC_ARM ) /* Keil uVision 4 */ + #define WEAK (__attribute__ ((weak))) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ + #define WEAK __weak +#elif defined ( __GNUC__ ) /* GCC CS */ + #define WEAK __attribute__ ((weak)) #endif -typedef uint8 boolean; -typedef uint8 byte; +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus -#include "variant.h" -#include "Tone.h" +#ifdef __cplusplus #include "WCharacter.h" +#include "WString.h" +#include "Tone.h" #include "WMath.h" +#include "HardwareSerial.h" +#include "wiring_pulse.h" +#include "usb_serial.h" +#endif // __cplusplus + + +// Include board variant +#include "pins_arduino.h" + +#include "wiring.h" +#include "wiring_digital.h" +#include "wiring_analog.h" +#include "wiring_shift.h" +#include "WInterrupts.h" + +#endif // Arduino_h diff --git a/cores/arduino/Client.h b/cores/arduino/Client.h old mode 100755 new mode 100644 diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp old mode 100755 new mode 100644 index 2b37d3b..9bb2050 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -1,262 +1,190 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardwareSerial.cpp - * @brief Wirish serial port implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "gpio.h" -#include "timer.h" - +/* + HardwareSerial.cpp - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus + Modified 3 December 2013 by Matthijs Kooijman +*/ + +#include +#include +#include +#include +#include "Arduino.h" #include "HardwareSerial.h" -#include "boards.h" - -/* UART handler declaration */ -UART_HandleTypeDef UartHandle; -HardwareSerial Serial(UART4_dev);//Serial0(UART4_dev); -HardwareSerial Serial1(USART3_dev); -HardwareSerial Serial2(USART2_dev); -HardwareSerial Serial3(USART6_dev); -HardwareSerial SerialWiFi(USART3_dev); -HardwareSerial::HardwareSerial(usart_dev *usart_device) +// Constructors //////////////////////////////////////////////////////////////// +HardwareSerial::HardwareSerial(PinName _rx, PinName _tx) { - this->usart_device = usart_device; + _serial.pin_rx = _rx; + _serial.pin_tx = _tx; + _serial.rx_buff = _rx_buffer; + _serial.rx_head = 0; + _serial.rx_tail = 0; + _serial.tx_buff = _tx_buffer; + _serial.tx_head = 0; + _serial.tx_tail = 0; } -void HardwareSerial::begin(uint32 baud) -{ - ASSERT(baud <= usart_device->max_baud); - - if (baud > usart_device->max_baud) - { - return; - } - - if (usart_device == USART1_dev) // Arduino OTTO not use this device - { - - // USART 1 pin definition - - // USART1 TX - gpio_set_mode(USART1_TX_GPIO_DEV, USART1_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART1_TX_GPIO_DEV, USART1_TX_GPIO_PIN, USART1_TX_AF); - - // USART1 RX - gpio_set_mode(USART1_RX_GPIO_DEV, USART1_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART1_RX_GPIO_DEV, USART1_RX_GPIO_PIN, USART1_RX_AF); - - // enable USART1 clock - *((uint32_t*)(RCC_APB2ENR)) |= (1 << RCC_APB2ENR_USART1EN_BIT); - - } - - else if (usart_device == USART2_dev) - { - // USART 2 pin definition - - // USART2 TX - gpio_set_mode(USART2_TX_GPIO_DEV, USART2_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART2_TX_GPIO_DEV, USART2_TX_GPIO_PIN, USART2_TX_AF); - - // USART2 RX - gpio_set_mode(USART2_RX_GPIO_DEV, USART2_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART2_RX_GPIO_DEV, USART2_RX_GPIO_PIN, USART2_RX_AF); - - // enable USART2 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_USART2EN_BIT); - } - - else if (usart_device == USART3_dev) - { - // USART 3 pin definition (Used also for ESP8266) - // USART3 TX - gpio_set_mode(USART3_TX_GPIO_DEV, USART3_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART3_TX_GPIO_DEV, USART3_TX_GPIO_PIN, USART3_TX_AF); - - // USART3 RX - gpio_set_mode(USART3_RX_GPIO_DEV, USART3_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART3_RX_GPIO_DEV, USART3_RX_GPIO_PIN, USART3_RX_AF); - - // enable USART3 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_USART3EN_BIT); - } - - else if (usart_device == UART4_dev) - { - // USART 4 pin definition - - // USART4 TX - gpio_set_mode(UART4_TX_GPIO_DEV, UART4_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART4_TX_GPIO_DEV, UART4_TX_GPIO_PIN, UART4_TX_AF); - - // USART4 RX - gpio_set_mode(UART4_RX_GPIO_DEV, UART4_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART4_RX_GPIO_DEV, UART4_RX_GPIO_PIN, UART4_RX_AF); - - // enable UART4 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_UART4EN_BIT); - } - - else if (usart_device == UART5_dev) // Arduino OTTO not use this device - { - // UART 5 pin definition - - // UART5 TX - gpio_set_mode(UART5_TX_GPIO_DEV, UART5_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART5_TX_GPIO_DEV, UART5_TX_GPIO_PIN, UART5_TX_AF); +// Actual interrupt handlers ////////////////////////////////////////////////////////////// - // UART5 RX - gpio_set_mode(UART5_RX_GPIO_DEV, UART5_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART5_RX_GPIO_DEV, UART5_RX_GPIO_PIN, UART5_RX_AF); - - // enable UART5 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_UART5EN_BIT); - } - - else if (usart_device == USART6_dev) - { - // USART 6 pin definition - - // USART6 TX - gpio_set_mode(USART6_TX_GPIO_DEV, USART6_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART6_TX_GPIO_DEV, USART6_TX_GPIO_PIN, USART6_TX_AF); - - // USART6 RX - gpio_set_mode(USART6_RX_GPIO_DEV, USART6_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(USART6_RX_GPIO_DEV, USART6_RX_GPIO_PIN, USART6_RX_AF); +void HardwareSerial::_rx_complete_irq(serial_t* obj) +{ + // No Parity error, read byte and store it in the buffer if there is + // room + unsigned char c = uart_getc(obj); + + rx_buffer_index_t i = (unsigned int)(obj->rx_head + 1) % SERIAL_RX_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != obj->rx_tail) { + obj->rx_buff[obj->rx_head] = c; + obj->rx_head = i; + } +} - // enable USART6 clock - *((uint32_t*)(RCC_APB2ENR)) |= (1 << RCC_APB2ENR_USART6EN_BIT); - } +// Actual interrupt handlers ////////////////////////////////////////////////////////////// - else if (usart_device == UART7_dev) // Arduino OTTO not use this device - { - // UART 7 pin definition +int HardwareSerial::_tx_complete_irq(serial_t* obj) +{ + // If interrupts are enabled, there must be more data in the output + // buffer. Send the next byte + unsigned char c = obj->tx_buff[obj->tx_tail]; + obj->tx_tail = (obj->tx_tail + 1) % SERIAL_TX_BUFFER_SIZE; - // UART7 TX - gpio_set_mode(UART7_TX_GPIO_DEV, UART7_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART7_TX_GPIO_DEV, UART7_TX_GPIO_PIN, UART7_TX_AF); + if (obj->tx_head == obj->tx_tail) { + return -1; + } - // UART7 RX - gpio_set_mode(UART7_RX_GPIO_DEV, UART7_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART7_RX_GPIO_DEV, UART7_RX_GPIO_PIN, UART7_RX_AF); + return c; +} - // enable UART7 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_UART7EN_BIT); - } +// Public Methods ////////////////////////////////////////////////////////////// - else if (usart_device == UART8_dev) // Arduino OTTO not use this device - { - // UART 8 pin definition - - // UART8 TX - gpio_set_mode(UART8_TX_GPIO_DEV, UART8_TX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART8_TX_GPIO_DEV, UART8_TX_GPIO_PIN, UART8_TX_AF); - - // UART8 RX - gpio_set_mode(UART8_RX_GPIO_DEV, UART8_RX_GPIO_PIN, GPIO_AF_OUTPUT_PP); - gpio_set_af_mode(UART8_RX_GPIO_DEV, UART8_RX_GPIO_PIN, UART8_RX_AF); - - // enable UART8 clock - *((uint32_t*)(RCC_APB1ENR)) |= (1 << RCC_APB1ENR_UART8EN_BIT); - } - -#if 0 - if (txi->timer_device != NULL) - { - /* Turn off any PWM if there's a conflict on this GPIO bit. */ - timer_set_mode(txi->timer_device, txi->timer_channel, TIMER_DISABLED); - } -#endif - - - UartHandle.Instance = (USART_TypeDef*)usart_device->regs; - - UartHandle.Init.BaudRate = baud; - UartHandle.Init.WordLength = UART_WORDLENGTH_8B; - UartHandle.Init.StopBits = UART_STOPBITS_1; - UartHandle.Init.Parity = UART_PARITY_NONE; - UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; - UartHandle.Init.Mode = UART_MODE_TX_RX; - UartHandle.Init.OverSampling = UART_OVERSAMPLING_16; - - HAL_UART_Init(&UartHandle); - usart_init(usart_device); - usart_enable(usart_device); +void HardwareSerial::begin(unsigned long baud, byte config) +{ + _serial.baudrate = (uint32_t)baud; + + // Could be 8 or 9 bits. Could match with Arduino small data length? + _serial.databits = UART_WORDLENGTH_8B; + + if((config & 0x30) == 0x30) { + _serial.parity = UART_PARITY_ODD; + } else if((config & 0x20) == 0x20) { + _serial.parity = UART_PARITY_EVEN; + } else { + _serial.parity = UART_PARITY_NONE; + } + + if((config & 0x08) == 0x08) { + _serial.stopbits = UART_STOPBITS_2; + } else { + _serial.stopbits = UART_STOPBITS_1; + } + + uart_init(&_serial); + uart_attach_rx_callback(&_serial, _rx_complete_irq); } -void HardwareSerial::end(void) +void HardwareSerial::end() { - usart_disable(usart_device); -} + // wait for transmission of outgoing data + flush(); + uart_deinit(&_serial); -int HardwareSerial::read(void) -{ - if(usart_data_available(usart_device) > 0) - { - return usart_getc(usart_device); - } - else - { - return -1; - } + // clear any received data + _serial.rx_head = _serial.rx_tail; } int HardwareSerial::available(void) { - return usart_data_available(usart_device); + return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _serial.rx_head - _serial.rx_tail)) % SERIAL_RX_BUFFER_SIZE; } int HardwareSerial::peek(void) { - return usart_peek(usart_device); + if (_serial.rx_head == _serial.rx_tail) { + return -1; + } else { + return _serial.rx_buff[_serial.rx_tail]; + } +} + +int HardwareSerial::read(void) +{ + // if the head isn't ahead of the tail, we don't have any characters + if (_serial.rx_head == _serial.rx_tail) { + return -1; + } else { + unsigned char c = _serial.rx_buff[_serial.rx_tail]; + _serial.rx_tail = (rx_buffer_index_t)(_serial.rx_tail + 1) % SERIAL_RX_BUFFER_SIZE; + return c; + } } -uint32 HardwareSerial::pending(void) +int HardwareSerial::availableForWrite(void) { - return usart_data_pending(usart_device); + tx_buffer_index_t head = _serial.tx_head; + tx_buffer_index_t tail = _serial.tx_tail; + + if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail; + return tail - head - 1; } -size_t HardwareSerial::write(unsigned char ch) +void HardwareSerial::flush() { - usart_putc(usart_device, ch); - return 1; + // If we have never written a byte, no need to flush. This special + // case is needed since there is no way to force the TXC (transmit + // complete) bit to 1 during initialization + if (!_written) + return; + + while((_serial.tx_head != _serial.tx_tail)) { + // nop, the interrupt handler will free up space for us + } + // If we get here, nothing is queued anymore (DRIE is disabled) and + // the hardware finished tranmission (TXC is set). } -void HardwareSerial::flush(void) +size_t HardwareSerial::write(uint8_t c) { - usart_reset_rx(usart_device); + _written = true; + + tx_buffer_index_t i = (_serial.tx_head + 1) % SERIAL_TX_BUFFER_SIZE; + + // If the output buffer is full, there's nothing for it other than to + // wait for the interrupt handler to empty it a bit + while (i == _serial.tx_tail) { + // nop, the interrupt handler will free up space for us + } + + _serial.tx_buff[_serial.tx_head] = c; + _serial.tx_head = i; + + if(!serial_tx_active(&_serial)) { + uart_attach_tx_callback(&_serial, _tx_complete_irq); + } + + return 1; } diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h old mode 100755 new mode 100644 index b2c3ad9..69ce30b --- a/cores/arduino/HardwareSerial.h +++ b/cores/arduino/HardwareSerial.h @@ -1,94 +1,124 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file HardwareSerial.h - * @brief Wirish serial port interface. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _HARDWARESERIAL_H_ -#define _HARDWARESERIAL_H_ - -#include "types.h" -#include "usart.h" +/* + HardwareSerial.h - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus + Modified 3 December 2013 by Matthijs Kooijman +*/ + +#ifndef HardwareSerial_h +#define HardwareSerial_h + +#include #include "Stream.h" -/* - * IMPORTANT: - * - * This class documented "by hand" (i.e., not using Doxygen) in the - * leaflabs-docs/ repository. - * - * If you alter the public HardwareSerial interface, you MUST update - * the documentation accordingly. - */ - -class HardwareSerial : public Stream { -public: - HardwareSerial(usart_dev *usart_device); - - /* Set up/tear down */ - void begin(uint32 baud); - void end(void); - - /* I/O */ +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +// NOTE: a "power of 2" buffer size is reccomended to dramatically +// optimize all the modulo operations for ring buffers. +// WARNING: When buffer sizes are increased to > 256, the buffer index +// variables are automatically increased in size, but the extra +// atomicity guards needed for that are not implemented. This will +// often work, but occasionally a race condition can occur that makes +// Serial behave erratically. See https://github.com/arduino/Arduino/issues/2405 +#if !defined(SERIAL_TX_BUFFER_SIZE) +#define SERIAL_TX_BUFFER_SIZE 64 +#endif +#if !defined(SERIAL_RX_BUFFER_SIZE) +#define SERIAL_RX_BUFFER_SIZE 64 +#endif +#if (SERIAL_TX_BUFFER_SIZE>256) +typedef uint16_t tx_buffer_index_t; +#else +typedef uint8_t tx_buffer_index_t; +#endif +#if (SERIAL_RX_BUFFER_SIZE>256) +typedef uint16_t rx_buffer_index_t; +#else +typedef uint8_t rx_buffer_index_t; +#endif + +// Define config for Serial.begin(baud, config); +#define SERIAL_5N1 0x00 +#define SERIAL_6N1 0x02 +#define SERIAL_7N1 0x04 +#define SERIAL_8N1 0x06 +#define SERIAL_5N2 0x08 +#define SERIAL_6N2 0x0A +#define SERIAL_7N2 0x0C +#define SERIAL_8N2 0x0E +#define SERIAL_5E1 0x20 +#define SERIAL_6E1 0x22 +#define SERIAL_7E1 0x24 +#define SERIAL_8E1 0x26 +#define SERIAL_5E2 0x28 +#define SERIAL_6E2 0x2A +#define SERIAL_7E2 0x2C +#define SERIAL_8E2 0x2E +#define SERIAL_5O1 0x30 +#define SERIAL_6O1 0x32 +#define SERIAL_7O1 0x34 +#define SERIAL_8O1 0x36 +#define SERIAL_5O2 0x38 +#define SERIAL_6O2 0x3A +#define SERIAL_7O2 0x3C +#define SERIAL_8O2 0x3E + +class HardwareSerial : public Stream +{ + protected: + // Has any byte been written to the UART since begin() + bool _written; + + // Don't put any members after these buffers, since only the first + // 32 bytes of this struct can be accessed quickly using the ldd + // instruction. + unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE]; + unsigned char _tx_buffer[SERIAL_TX_BUFFER_SIZE]; + + serial_t _serial; + + public: + HardwareSerial(PinName _rx, PinName _tx); + void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } + void begin(unsigned long, uint8_t); + void end(); virtual int available(void); virtual int peek(void); - virtual void flush(void); - uint32 pending(void); virtual int read(void); - virtual size_t write(unsigned char); - using Print::write; - operator bool() { return true; }; - int txPin(void) { return this->tx_pin; } - int rxPin(void) { return this->rx_pin; } - + int availableForWrite(void); + virtual void flush(void); + virtual size_t write(uint8_t); + inline size_t write(unsigned long n) { return write((uint8_t)n); } + inline size_t write(long n) { return write((uint8_t)n); } + inline size_t write(unsigned int n) { return write((uint8_t)n); } + inline size_t write(int n) { return write((uint8_t)n); } + using Print::write; // pull in write(str) and write(buf, size) from Print + operator bool() { return true; } -private: - usart_dev *usart_device; - uint8 tx_pin; - uint8 rx_pin; + // Interrupt handlers + static void _rx_complete_irq(serial_t* obj); + static int _tx_complete_irq(serial_t* obj); }; -extern HardwareSerial Serial;//Serial0; -extern HardwareSerial Serial1; -extern HardwareSerial Serial2; -extern HardwareSerial Serial3; -extern HardwareSerial Serial4; -extern HardwareSerial Serial5; -extern HardwareSerial Serial6; -extern HardwareSerial Serial7; -extern HardwareSerial Serial8; -extern HardwareSerial SerialWiFi; - -extern HardwareSerial &SerialDebug; +extern void serialEventRun(void) __attribute__((weak)); + #endif diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp deleted file mode 100755 index 2e7953f..0000000 --- a/cores/arduino/HardwareTimer.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "HardwareTimer.h" -#include "boards.h" // for CYCLES_PER_MICROSECOND -//#include "wiring_math.h" -#include "WMath.h" - - -#define NR_TIMERS 14 - -#define MAX_RELOAD ((1 << 16) - 1) - -HardwareTimer::HardwareTimer(uint8 timerNum) { - if (timerNum > NR_TIMERS) { - ASSERT(0); - } - timer_dev *devs[] = { - TIMER1, - TIMER2, - TIMER3, - TIMER4, - TIMER5, - TIMER6, - TIMER7, - TIMER8, - TIMER9, - TIMER10, - TIMER11, - TIMER12, - TIMER13, - TIMER14, - }; - this->dev = devs[timerNum - 1]; -} - -void HardwareTimer::pause(void) { - timer_pause(this->dev); -} - -void HardwareTimer::resume(void) { - timer_resume(this->dev); -} - -uint32 HardwareTimer::getPrescaleFactor(void) { - return timer_get_prescaler(this->dev) + 1; -} - -uint32 HardwareTimer::getClockSpeed(void) { - return rcc_dev_timer_clk_speed(this->dev->clk_id); -} - -void HardwareTimer::setPrescaleFactor(uint32 factor) { - timer_set_prescaler(this->dev, (uint16)(factor - 1)); -} - -uint16 HardwareTimer::getOverflow() { - return timer_get_reload(this->dev); -} - -void HardwareTimer::setOverflow(uint16 val) { - timer_set_reload(this->dev, val); -} - -uint16 HardwareTimer::getCount(void) { - return timer_get_count(this->dev); -} - -void HardwareTimer::setCount(uint16 val) { - uint16 ovf = this->getOverflow(); - timer_set_count(this->dev, min(val, ovf)); -} - -uint16 HardwareTimer::setPeriod(uint32 microseconds) { - if (!microseconds) { - this->setPrescaleFactor(1); - this->setOverflow(1); - return this->getOverflow(); - } - uint32 period_cyc = microseconds * CYCLES_PER_MICROSECOND; - uint16 prescaler = (uint16)(period_cyc / MAX_RELOAD + 1); - uint16 overflow = (uint16)round(period_cyc / prescaler); - this->setPrescaleFactor(prescaler); - this->setOverflow(overflow); - return overflow; -} - -void HardwareTimer::setMode(int channel, timer_mode mode) { - timer_set_mode(this->dev, (uint8)channel, (timer_mode)mode); -} - -uint16 HardwareTimer::getCompare(int channel) { - return timer_get_compare(this->dev, (uint8)channel); -} - -void HardwareTimer::setCompare(int channel, uint16 val) { - uint16 ovf = this->getOverflow(); - timer_set_compare(this->dev, (uint8)channel, min(val, ovf)); -} - -void HardwareTimer::attachInterrupt(int channel, voidFuncPtr handler) { - timer_attach_interrupt(this->dev, (uint8)channel, handler); -} - -void HardwareTimer::toneAttachInterrupt(int channel, voidFuncPtr handler) { - tone_attach_interrupt(this->dev, (uint8)channel, handler); -} - -void HardwareTimer::detachInterrupt(int channel) { - timer_detach_interrupt(this->dev, (uint8)channel); -} - -void HardwareTimer::refresh(void) { - timer_generate_update(this->dev); -} diff --git a/cores/arduino/HardwareTimer.h b/cores/arduino/HardwareTimer.h deleted file mode 100755 index b1e2b89..0000000 --- a/cores/arduino/HardwareTimer.h +++ /dev/null @@ -1,225 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Wirish timer class. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _HARDWARETIMER_H_ -#define _HARDWARETIMER_H_ - -// TODO [0.1.0] Remove deprecated pieces, pick a better API - -#include "timer.h" - -/** Timer mode. */ -typedef timer_mode TimerMode; - -/** @brief Deprecated; use TIMER_OUTPUT_COMPARE instead. */ -#define TIMER_OUTPUTCOMPARE TIMER_OUTPUT_COMPARE - -/** - * @brief Interface to one of the 16-bit timer peripherals. - */ -class HardwareTimer { -private: - timer_dev *dev; - -public: - /** - * @brief Construct a new HardwareTimer instance. - * @param timerNum number of the timer to control. - */ - HardwareTimer(uint8 timerNum); - - /** - * @brief Stop the counter, without affecting its configuration. - * - * @see HardwareTimer::resume() - */ - void pause(void); - - /** - * @brief Resume a paused timer, without affecting its configuration. - * - * The timer will resume counting and firing interrupts as - * appropriate. - * - * Note that there is some function call overhead associated with - * using this method, so using it in concert with - * HardwareTimer::pause() is not a robust way to align multiple - * timers to the same count value. - * - * @see HardwareTimer::pause() - */ - void resume(void); - - /** - * @brief Get the timer's clock speed. - * @return Timer input clock speed in Hz/second - */ - uint32 getClockSpeed(void); - - /** - * @brief Get the timer's prescale factor. - * @return Timer prescaler, from 1 to 65,536. - * @see HardwareTimer::setPrescaleFactor() - */ - uint32 getPrescaleFactor(); - - /** - * @brief Set the timer's prescale factor. - * - * The new value won't take effect until the next time the counter - * overflows. You can force the counter to reset using - * HardwareTimer::refresh(). - * - * @param factor The new prescale value to set, from 1 to 65,536. - * @see HardwareTimer::refresh() - */ - void setPrescaleFactor(uint32 factor); - - /** - * @brief Get the timer overflow value. - * @see HardwareTimer::setOverflow() - */ - uint16 getOverflow(); - - /** - * @brief Set the timer overflow (or "reload") value. - * - * The new value won't take effect until the next time the counter - * overflows. You can force the counter to reset using - * HardwareTimer::refresh(). - * - * @param val The new overflow value to set - * @see HardwareTimer::refresh() - */ - void setOverflow(uint16 val); - - /** - * @brief Get the current timer count. - * - * @return The timer's current count value - */ - uint16 getCount(void); - - /** - * @brief Set the current timer count. - * - * @param val The new count value to set. If this value exceeds - * the timer's overflow value, it is truncated to the - * overflow value. - */ - void setCount(uint16 val); - - /** - * @brief Set the timer's period in microseconds. - * - * Configures the prescaler and overflow values to generate a timer - * reload with a period as close to the given number of - * microseconds as possible. - * - * @param microseconds The desired period of the timer. This must be - * greater than zero. - * @return The new overflow value. - */ - uint16 setPeriod(uint32 microseconds); - - /** - * @brief Configure a timer channel's mode. - * @param channel Timer channel, from 1 to 4 - * @param mode Mode to set - */ - void setMode(int channel, timer_mode mode); - - /** - * @brief Get the compare value for the given channel. - * @see HardwareTimer::setCompare() - */ - uint16 getCompare(int channel); - - /** - * @brief Set the compare value for the given channel. - * - * @param channel the channel whose compare to set, from 1 to 4. - * @param compare The compare value to set. If greater than this - * timer's overflow value, it will be truncated to - * the overflow value. - * - * @see timer_mode - * @see HardwareTimer::setMode() - * @see HardwareTimer::attachInterrupt() - */ - void setCompare(int channel, uint16 compare); - - /** - * @brief Attach an interrupt handler to the given channel. - * - * This interrupt handler will be called when the timer's counter - * reaches the given channel compare value. - * - * @param channel the channel to attach the ISR to, from 1 to 4. - * @param handler The ISR to attach to the given channel. - * @see voidFuncPtr - */ - void attachInterrupt(int channel, voidFuncPtr handler); - void toneAttachInterrupt(int channel, voidFuncPtr handler); // alfran : used for tone - - /** - * @brief Remove the interrupt handler attached to the given - * channel, if any. - * - * The handler will no longer be called by this timer. - * - * @param channel the channel whose interrupt to detach, from 1 to 4. - * @see HardwareTimer::attachInterrupt() - */ - void detachInterrupt(int channel); - - /** - * @brief Reset the counter, and update the prescaler and overflow - * values. - * - * This will reset the counter to 0 in upcounting mode (the - * default). It will also update the timer's prescaler and - * overflow, if you have set them up to be changed using - * HardwareTimer::setPrescaleFactor() or - * HardwareTimer::setOverflow(). - * - * @see HardwareTimer::setPrescaleFactor() - * @see HardwareTimer::setOverflow() - */ - void refresh(void); - -}; - -#endif diff --git a/cores/arduino/IPAddress.cpp b/cores/arduino/IPAddress.cpp old mode 100755 new mode 100644 index b196aad..76aefa8 --- a/cores/arduino/IPAddress.cpp +++ b/cores/arduino/IPAddress.cpp @@ -19,7 +19,6 @@ #include #include -#include IPAddress::IPAddress() { @@ -44,6 +43,48 @@ IPAddress::IPAddress(const uint8_t *address) memcpy(_address.bytes, address, sizeof(_address.bytes)); } +bool IPAddress::fromString(const char *address) +{ + // TODO: add support for "a", "a.b", "a.b.c" formats + + uint16_t acc = 0; // Accumulator + uint8_t dots = 0; + + while (*address) + { + char c = *address++; + if (c >= '0' && c <= '9') + { + acc = acc * 10 + (c - '0'); + if (acc > 255) { + // Value out of [0..255] range + return false; + } + } + else if (c == '.') + { + if (dots == 3) { + // Too much dots (there must be 3 dots) + return false; + } + _address.bytes[dots++] = acc; + acc = 0; + } + else + { + // Invalid char + return false; + } + } + + if (dots != 3) { + // Too few dots (there must be 3 dots) + return false; + } + _address.bytes[3] = acc; + return true; +} + IPAddress& IPAddress::operator=(const uint8_t *address) { memcpy(_address.bytes, address, sizeof(_address.bytes)); @@ -73,15 +114,3 @@ size_t IPAddress::printTo(Print& p) const return n; } -String IPAddress::toString() -{ - String str = String(_address.bytes[0]); - str += "."; - str += String(_address.bytes[1]); - str += "."; - str += String(_address.bytes[2]); - str += "."; - str += String(_address.bytes[3]); - return str; -} - diff --git a/cores/arduino/IPAddress.h b/cores/arduino/IPAddress.h old mode 100755 new mode 100644 index 4ef167e..d762f2c --- a/cores/arduino/IPAddress.h +++ b/cores/arduino/IPAddress.h @@ -21,8 +21,8 @@ #define IPAddress_h #include -#include -#include +#include "Printable.h" +#include "WString.h" // A class to make it easier to handle and pass around IP addresses @@ -46,6 +46,9 @@ class IPAddress : public Printable { IPAddress(uint32_t address); IPAddress(const uint8_t *address); + bool fromString(const char *address); + bool fromString(const String &address) { return fromString(address.c_str()); } + // Overloaded cast operator to allow IPAddress objects to be used where a pointer // to a four-byte uint8_t array is expected operator uint32_t() const { return _address.dword; }; @@ -61,7 +64,6 @@ class IPAddress : public Printable { IPAddress& operator=(uint32_t address); virtual size_t printTo(Print& p) const; - String toString(); friend class EthernetClass; friend class UDP; @@ -73,5 +75,4 @@ class IPAddress : public Printable { const IPAddress INADDR_NONE(0,0,0,0); - #endif diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index 1190b9b..1d70a86 100644 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis + Modified 03 August 2015 by Chuck Todd */ #include @@ -24,6 +25,7 @@ #include #include #include "Arduino.h" + #include "Print.h" // Public Methods ////////////////////////////////////////////////////////////// @@ -33,7 +35,8 @@ size_t Print::write(const uint8_t *buffer, size_t size) { size_t n = 0; while (size--) { - n += write(*buffer++); + if (write(*buffer++)) n++; + else break; } return n; } @@ -114,7 +117,7 @@ size_t Print::print(const Printable& x) size_t Print::println(void) { - return write("\r\n"); + return write("\r\n"); } size_t Print::println(const String &s) @@ -252,3 +255,56 @@ size_t Print::printFloat(double number, uint8_t digits) return n; } + +#ifdef SUPPORT_LONGLONG + +void Print::println(int64_t n, uint8_t base) +{ + print(n, base); + println(); +} + +void Print::print(int64_t n, uint8_t base) +{ + if (n < 0) + { + print((char)'-'); + n = -n; + } + if (base < 2) base = 2; + print((uint64_t)n, base); +} + +void Print::println(uint64_t n, uint8_t base) +{ + print(n, base); + println(); +} + +void Print::print(uint64_t n, uint8_t base) +{ + if (base < 2) base = 2; + printLLNumber(n, base); +} + +void Print::printLLNumber(uint64_t n, uint8_t base) +{ + unsigned char buf[16 * sizeof(long)]; + unsigned int i = 0; + + if (n == 0) + { + print((char)'0'); + return; + } + + while (n > 0) + { + buf[i++] = n % base; + n /= base; + } + + for (; i > 0; i--) + print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); +} +#endif diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h index 736cff3..6266c0f 100644 --- a/cores/arduino/Print.h +++ b/cores/arduino/Print.h @@ -1,51 +1,56 @@ /* - * Print.h - Base class that provides print() and println() - * Copyright (c) 2008 David A. Mellis. All right reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA. - * - * Modified 12 April 2011 by Marti Bolivar - */ + Print.h - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. -#ifndef _wiring_PRINT_H_ -#define _wiring_PRINT_H_ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Print_h +#define Print_h + +#include +#include // for size_t -#include #include "WString.h" #include "Printable.h" - #define DEC 10 +#define DEC 10 #define HEX 16 #define OCT 8 #define BIN 2 +// uncomment next line to support printing of 64 bit ints. +#define SUPPORT_LONGLONG + class Print { private: int write_error; size_t printNumber(unsigned long, uint8_t); +#ifdef SUPPORT_LONGLONG + void printLLNumber(uint64_t, uint8_t ); +#endif size_t printFloat(double, uint8_t); protected: void setWriteError(int err = 1) { write_error = err; } public: Print() : write_error(0) {} - + int getWriteError() { return write_error; } void clearWriteError() { setWriteError(0); } - + virtual size_t write(uint8_t) = 0; size_t write(const char *str) { if (str == NULL) return 0; @@ -55,7 +60,7 @@ class Print size_t write(const char *buffer, size_t size) { return write((const uint8_t *)buffer, size); } - + size_t print(const __FlashStringHelper *); size_t print(const String &); size_t print(const char[]); @@ -80,6 +85,12 @@ class Print size_t println(double, int = 2); size_t println(const Printable&); size_t println(void); +#ifdef SUPPORT_LONGLONG + void println(int64_t, uint8_t = DEC); + void print(int64_t, uint8_t = DEC); + void println(uint64_t, uint8_t = DEC); + void print(uint64_t, uint8_t = DEC); +#endif }; #endif diff --git a/cores/arduino/Printable.h b/cores/arduino/Printable.h old mode 100755 new mode 100644 index d2cc503..2a1b2e9 --- a/cores/arduino/Printable.h +++ b/cores/arduino/Printable.h @@ -37,3 +37,4 @@ class Printable }; #endif + diff --git a/cores/arduino/RingBuffer.cpp b/cores/arduino/RingBuffer.cpp new file mode 100644 index 0000000..d9931c9 --- /dev/null +++ b/cores/arduino/RingBuffer.cpp @@ -0,0 +1,43 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "RingBuffer.h" +#include + +RingBuffer::RingBuffer( void ) +{ + memset( (void *)_aucBuffer, 0, SERIAL_BUFFER_SIZE ) ; + _iHead=0 ; + _iTail=0 ; +} + +void RingBuffer::store_char( uint8_t c ) +{ + int i = (uint32_t)(_iHead + 1) % SERIAL_BUFFER_SIZE ; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if ( i != _iTail ) + { + _aucBuffer[_iHead] = c ; + _iHead = i ; + } +} + diff --git a/cores/arduino/RingBuffer.h b/cores/arduino/RingBuffer.h new file mode 100644 index 0000000..6041430 --- /dev/null +++ b/cores/arduino/RingBuffer.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _RING_BUFFER_ +#define _RING_BUFFER_ + +#include + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer, in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#define SERIAL_BUFFER_SIZE 128 + +class RingBuffer +{ + public: + volatile uint8_t _aucBuffer[SERIAL_BUFFER_SIZE] ; + volatile int _iHead ; + volatile int _iTail ; + + public: + RingBuffer( void ) ; + void store_char( uint8_t c ) ; +} ; + +#endif /* _RING_BUFFER_ */ diff --git a/cores/arduino/SPI.cpp b/cores/arduino/SPI.cpp deleted file mode 100644 index c0e3531..0000000 --- a/cores/arduino/SPI.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2010 by Cristian Maglie - * Copyright (c) 2014 by Paul Stoffregen (Transaction API) - * Copyright (c) 2014 by Matthijs Kooijman (SPISettings AVR) - * Copyright (c) 2014 by Andrew J. Kroll (atomicity fixes) - * SPI Master library for arduino. - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of either the GNU General Public License version 2 - * or the GNU Lesser General Public License version 2.1, both as - * published by the Free Software Foundation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -extern "C" { - #include - #include - #include - #include "stm32f4xx_hal.h" -} - -#include "SPI.h" - -SPIClass::SPIClass(SPI_TypeDef *spiInstance) -{ - hSPIx.Instance = spiInstance; -} - -/** - * @brief Configure SPI, configure relatives IOs and enable SPI2 - * @param None - * @retval None - */ -void SPIClass::begin() -{ - if(hSPIx.Instance == SPI2) - { - GPIO_InitTypeDef GPIO_InitStruct; - - /* Enable GPIO clock */ - SPI2_SCK_CLK_ENABLE(); - SPI2_MISO_CLK_ENABLE(); - SPI2_MOSI_CLK_ENABLE(); - - /* Enable SPI2 clock */ - SPI2_CLK_ENABLE(); - - /* Configure SPI2 SCK PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI2_SCK_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = SPI2_SCK_AF; - HAL_GPIO_Init(SPI2_SCK_GPIO_PORT, &GPIO_InitStruct); - - /* Configure SPI2 MISO PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI2_MISO_PIN; - GPIO_InitStruct.Alternate = SPI2_MISO_AF; - HAL_GPIO_Init(SPI2_MISO_GPIO_PORT, &GPIO_InitStruct); - - /* Configure SPI2 MOSI PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI2_MOSI_PIN; - GPIO_InitStruct.Alternate = SPI2_MOSI_AF; - HAL_GPIO_Init(SPI2_MOSI_GPIO_PORT, &GPIO_InitStruct); - } - else if (hSPIx.Instance == SPI1) - { - GPIO_InitTypeDef GPIO_InitStruct; - - /* Enable GPIO clock */ - SPI1_SCK_CLK_ENABLE(); - SPI1_MISO_CLK_ENABLE(); - SPI1_MOSI_CLK_ENABLE(); - SPI1_NSS_CLK_ENABLE(); - - /* Enable SPI1 clock */ - SPI1_CLK_ENABLE(); - - /* Configure SPI1 SCK PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI1_SCK_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = SPI1_SCK_AF; - HAL_GPIO_Init(SPI1_SCK_GPIO_PORT, &GPIO_InitStruct); - - /* Configure SPI1 MISO PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI1_MISO_PIN; - GPIO_InitStruct.Alternate = SPI1_MISO_AF; - HAL_GPIO_Init(SPI1_MISO_GPIO_PORT, &GPIO_InitStruct); - - /* Configure SPI1 MOSI PIN defined in SPI.h */ - GPIO_InitStruct.Pin = SPI1_MOSI_PIN; - GPIO_InitStruct.Alternate = SPI1_MOSI_AF; - HAL_GPIO_Init(SPI1_MOSI_GPIO_PORT, &GPIO_InitStruct); - - /* Put SPI1 NSS pin as Output pin in order to be used as normal GPIO in Master mode */ - GPIO_InitStruct.Pin = SPI1_NSS_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(SPI1_NSS_GPIO_PORT, &GPIO_InitStruct); - } - - /* SPI general configuration */ - hSPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; - hSPIx.Init.Direction = SPI_DIRECTION_2LINES; - hSPIx.Init.CLKPhase = SPI_PHASE_1EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_LOW; - hSPIx.Init.DataSize = SPI_DATASIZE_8BIT; - hSPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; - hSPIx.Init.TIMode = SPI_TIMODE_DISABLE; - hSPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hSPIx.Init.CRCPolynomial = 7; - hSPIx.Init.NSS = SPI_NSS_SOFT; - hSPIx.Init.Mode = SPI_MODE_MASTER; - - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief Configure SPI, configure relatives IOs and enable SPIx - * @param slaveSelectPin: IO to configure - * @retval None - */ -void SPIClass::begin(uint8_t slaveSelectPin) -{ - /* SPIx configuration */ - begin(); - pinMode(slaveSelectPin, OUTPUT); -} - -/** - * @brief Configure SPI with parameters clock, bitOrder and dataMode - * defined within settings object - * @param settings: object containing parameters clock, bitOrder and dataMode - * @retval None - */ -void SPIClass::beginTransaction(SPISettings settings) -{ - hSPIx.Init.FirstBit = settings.FirstBit; - hSPIx.Init.CLKPhase = settings.CLKPhase; - hSPIx.Init.CLKPolarity = settings.CLKPolarity; - hSPIx.Init.BaudRatePrescaler = settings.BaudRatePrescaler; - - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief End SPI transaction - * @param None - * @retval None - */ -void SPIClass::endTransaction() -{ - /* Go back to default settings */ - hSPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; - hSPIx.Init.CLKPhase = SPI_PHASE_1EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_LOW; - hSPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief Transmit and Receive one byte of data in blocking mode - * @param data: data to be transmitted - * @retval Byte received - */ -uint8_t SPIClass::transfer(uint8_t data) -{ - uint8_t rxdata; - HAL_SPI_TransmitReceive(&hSPIx, (uint8_t*)&data, (uint8_t*)&rxdata, 1,5000); - return rxdata; -} - -/** - * @brief Transmit and Receive 2 bytes of data in blocking mode - * @param data: data to be transmitted - * @retval Bytes received - */ -uint16_t SPIClass::transfer16(uint16_t data) -{ - uint16_t rxdata; - HAL_SPI_TransmitReceive(&hSPIx, (uint8_t*)&data, (uint8_t*)&rxdata, 2,5000); - return rxdata; -} - -/** - * @brief Transmit and Receive an amount of data in blocking mode - * @param buf: pointer to transmission data buffer - * @param count: number of data in byte to be transmitted - * @retval None - */ -void SPIClass::transfer(void *buf, size_t count) -{ - uint8_t rxdata; - int i; - - for(i = 0; i < count; i++) - { - HAL_SPI_TransmitReceive(&hSPIx, ((uint8_t*)buf + i), (uint8_t*)&rxdata, 1,5000); - *((uint8_t*)buf + i) = rxdata; - } -} - -/** - * @brief Transmit and Receive one byte of data in blocking mode - * @param data: data to be transmitted - * @retval Byte received - */ -uint8_t SPIClass::transfer(uint8_t slaveSelectPin, uint8_t val, SPITransferMode transferMode) -{ - uint8_t rxdata; - digitalWrite(slaveSelectPin,LOW); - HAL_SPI_TransmitReceive(&hSPIx, (uint8_t *)&val, (uint8_t*)&rxdata, 1,5000); - - /* If transferMode is SPI_CONTINUE we need to hold CS GPIO pin low */ - /* If transferMode is SPI_LAST we need to put CS GPIO pin high */ - if(transferMode == SPI_LAST) - { - digitalWrite(slaveSelectPin, HIGH); - } - - return rxdata; -} - -/** - * @brief Set the bit order to LSB of MSB first - * @param bitOrder: LSBFIRST or MSBFIRST - * @retval None - */ -void SPIClass::setBitOrder(uint8_t bitOrder) -{ - if(bitOrder == LSBFIRST) - { - bitOrder = SPI_FIRSTBIT_LSB; - } - else - { - bitOrder = SPI_FIRSTBIT_MSB; - } - hSPIx.Init.FirstBit = bitOrder; - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief Set mode to control clock polarity and phase - * @param dataMode: This parameter can be one of the following values - * SPI_MODE0 - * SPI_MODE1 - * SPI_MODE2 - * SPI_MODE3 - * @retval None - */ -void SPIClass::setDataMode(uint8_t dataMode) -{ - if(dataMode == SPI_MODE0) - { - hSPIx.Init.CLKPhase = SPI_PHASE_1EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_LOW; - } - else if(dataMode == SPI_MODE1) - { - hSPIx.Init.CLKPhase = SPI_PHASE_2EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_LOW; - } - else if(dataMode == SPI_MODE2) - { - hSPIx.Init.CLKPhase = SPI_PHASE_1EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; - } - else - { - hSPIx.Init.CLKPhase = SPI_PHASE_2EDGE; - hSPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; - } - - /* Change CPOL and CPHASE */ - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief Set clock divider - * @param clockDiv: clock divider - * @retval None - */ -void SPIClass::setClockDivider(uint8_t clockDiv) -{ - hSPIx.Init.BaudRatePrescaler = clockDiv; - HAL_SPI_Init(&hSPIx); -} - -/** - * @brief Disable SPIx peripheral. - * @param None - * @retval None - */ -void SPIClass::end() -{ - if(hSPIx.Instance == SPI2) - { - /*##-1- Reset peripherals ##################################################*/ - SPI2_FORCE_RESET(); - SPI2_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure SPI2 SCK as alternate function */ - HAL_GPIO_DeInit(SPI2_SCK_GPIO_PORT, SPI2_SCK_PIN); - /* Configure SPI2 MISO as alternate function */ - HAL_GPIO_DeInit(SPI2_MISO_GPIO_PORT, SPI2_MISO_PIN); - /* Configure SPI2 MOSI as alternate function */ - HAL_GPIO_DeInit(SPI2_MOSI_GPIO_PORT, SPI2_MOSI_PIN); - } - else if (hSPIx.Instance == SPI1) - { - /*##-1- Reset peripherals ##################################################*/ - SPI1_FORCE_RESET(); - SPI1_RELEASE_RESET(); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* Configure SPI1 SCK as alternate function */ - HAL_GPIO_DeInit(SPI1_SCK_GPIO_PORT, SPI1_SCK_PIN); - /* Configure SPI1 MISO as alternate function */ - HAL_GPIO_DeInit(SPI1_MISO_GPIO_PORT, SPI1_MISO_PIN); - /* Configure SPI1 MOSI as alternate function */ - HAL_GPIO_DeInit(SPI1_MOSI_GPIO_PORT, SPI1_MOSI_PIN); - } - - HAL_SPI_DeInit(&hSPIx); -} - -/** - * @brief Disable SPIx peripheral and SS pin. - * @param None - * @retval None - */ -void SPIClass::end(uint8_t slaveSelectPin) -{ - pinMode(slaveSelectPin, INPUT); - end(); -} - -SPIClass SPI = SPIClass(SPI2); -SPIClass SPI7 = SPIClass(SPI1); diff --git a/cores/arduino/SPI.h b/cores/arduino/SPI.h deleted file mode 100644 index 457754a..0000000 --- a/cores/arduino/SPI.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 2010 by Cristian Maglie - * Copyright (c) 2014 by Paul Stoffregen (Transaction API) - * Copyright (c) 2014 by Matthijs Kooijman (SPISettings AVR) - * Copyright (c) 2014 by Andrew J. Kroll (atomicity fixes) - * SPI Master library for arduino. - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of either the GNU General Public License version 2 - * or the GNU Lesser General Public License version 2.1, both as - * published by the Free Software Foundation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _SPI_H_INCLUDED -#define _SPI_H_INCLUDED - -#include - -#define SPI2_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE() -#define SPI2_SCK_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define SPI2_MISO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define SPI2_MOSI_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() - -#define SPI2_FORCE_RESET() __HAL_RCC_SPI2_FORCE_RESET() -#define SPI2_RELEASE_RESET() __HAL_RCC_SPI2_RELEASE_RESET() - -/* Definition for SPI2 Pins */ -#define SPI2_SCK_PIN GPIO_PIN_3 -#define SPI2_SCK_GPIO_PORT GPIOD -#define SPI2_SCK_AF GPIO_AF5_SPI2 -#define SPI2_MISO_PIN GPIO_PIN_14 -#define SPI2_MISO_GPIO_PORT GPIOB -#define SPI2_MISO_AF GPIO_AF5_SPI2 -#define SPI2_MOSI_PIN GPIO_PIN_3 -#define SPI2_MOSI_GPIO_PORT GPIOC -#define SPI2_MOSI_AF GPIO_AF5_SPI2 - -#define SPI1_CLK_ENABLE() __HAL_RCC_SPI1_CLK_ENABLE() -#define SPI1_SCK_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define SPI1_MISO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define SPI1_MOSI_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define SPI1_NSS_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() - -#define SPI1_FORCE_RESET() __HAL_RCC_SPI1_FORCE_RESET() -#define SPI1_RELEASE_RESET() __HAL_RCC_SPI1_RELEASE_RESET() - -/* Definition for SPI2 Pins */ -#define SPI1_SCK_PIN GPIO_PIN_3 -#define SPI1_SCK_GPIO_PORT GPIOB -#define SPI1_SCK_AF GPIO_AF5_SPI1 -#define SPI1_MISO_PIN GPIO_PIN_4 -#define SPI1_MISO_GPIO_PORT GPIOB -#define SPI1_MISO_AF GPIO_AF5_SPI1 -#define SPI1_MOSI_PIN GPIO_PIN_5 -#define SPI1_MOSI_GPIO_PORT GPIOB -#define SPI1_MOSI_AF GPIO_AF5_SPI1 - -#define SPI1_NSS_PIN GPIO_PIN_15 -#define SPI1_NSS_GPIO_PORT GPIOA -#define SPI1_NSS_AF GPIO_AF5_SPI1 - -#ifndef LSBFIRST -#define LSBFIRST 0 -#endif -#ifndef MSBFIRST -#define MSBFIRST 1 -#endif - -#define SPI_CLOCK_DIV2 SPI_BAUDRATEPRESCALER_2 -#define SPI_CLOCK_DIV4 SPI_BAUDRATEPRESCALER_4 -#define SPI_CLOCK_DIV8 SPI_BAUDRATEPRESCALER_8 -#define SPI_CLOCK_DIV16 SPI_BAUDRATEPRESCALER_16 -#define SPI_CLOCK_DIV32 SPI_BAUDRATEPRESCALER_32 -#define SPI_CLOCK_DIV64 SPI_BAUDRATEPRESCALER_64 -#define SPI_CLOCK_DIV128 SPI_BAUDRATEPRESCALER_128 -#define SPI_CLOCK_DIV256 SPI_BAUDRATEPRESCALER_256 - -#define SPI_MODE0 0x00 -#define SPI_MODE1 0x04 -#define SPI_MODE2 0x08 -#define SPI_MODE3 0x0C - -enum SPITransferMode { - SPI_CONTINUE, - SPI_LAST -}; - -class SPISettings { -public: - SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) - { - init_AlwaysInline(clock, bitOrder, dataMode); - } - SPISettings() - { - init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); - } -private: - void init_AlwaysInline(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) - __attribute__((__always_inline__)) { - - /* Select the Bit Order */ - if(bitOrder == LSBFIRST) - { - FirstBit = SPI_FIRSTBIT_LSB; - } - else - { - FirstBit = SPI_FIRSTBIT_MSB; - } - - /* Select the SPI Communication Mode */ - if(dataMode == SPI_MODE0) - { - CLKPhase = SPI_PHASE_1EDGE; - CLKPolarity = SPI_POLARITY_LOW; - } - else if(dataMode == SPI_MODE1) - { - CLKPhase = SPI_PHASE_2EDGE; - CLKPolarity = SPI_POLARITY_LOW; - } - else if(dataMode == SPI_MODE2) - { - CLKPhase = SPI_PHASE_1EDGE; - CLKPolarity = SPI_POLARITY_HIGH; - } - else - { - CLKPhase = SPI_PHASE_2EDGE; - CLKPolarity = SPI_POLARITY_HIGH; - } - - /* Select the Clock Divider */ - BaudRatePrescaler = (((HAL_RCC_GetPCLK1Freq()) / 2 ) < clock) ? SPI_CLOCK_DIV2 - : (((HAL_RCC_GetPCLK1Freq()) / 4 ) < clock) ? SPI_CLOCK_DIV4 - : (((HAL_RCC_GetPCLK1Freq()) / 8 ) < clock) ? SPI_CLOCK_DIV8 - : (((HAL_RCC_GetPCLK1Freq()) / 16 ) < clock) ? SPI_CLOCK_DIV16 - : (((HAL_RCC_GetPCLK1Freq()) / 32 ) < clock) ? SPI_CLOCK_DIV32 - : (((HAL_RCC_GetPCLK1Freq()) / 64 ) < clock) ? SPI_CLOCK_DIV64 - : (((HAL_RCC_GetPCLK1Freq()) / 128) < clock) ? SPI_CLOCK_DIV128 - : SPI_CLOCK_DIV256; - } - - uint32_t FirstBit; - uint32_t CLKPhase; - uint32_t CLKPolarity; - uint32_t BaudRatePrescaler; - - friend class SPIClass; -}; - -class SPIClass { -public: - /* Constructor */ - SPIClass(SPI_TypeDef *spiInstance); - /* Initialize the SPI peripheral */ - void begin(); - - /* Initialize the SPI peripheral and SS pin */ - void begin(uint8_t slaveSelectPin); - - /* Initialize the SPI peripheral with settings */ - void beginTransaction(SPISettings settings); - - /* Initialize the SPI peripheral */ - void endTransaction(); - - /* Begin the transfer */ - uint8_t transfer(uint8_t data); - uint16_t transfer16(uint16_t data); - void transfer(void *buf, size_t count); - uint8_t transfer(uint8_t slaveSelectPin, uint8_t val, SPITransferMode transferMode); - - /* End the transfer */ - void end(); - - void end(uint8_t slaveSelectPin); - - /* Set Bit Order */ - void setBitOrder(uint8_t bitOrder); - - /* Set Clock Divider */ - void setClockDivider(uint8_t clockDiv); - - /* Set Communication Mode */ - void setDataMode(uint8_t dataMode); - -private: - - SPI_HandleTypeDef hSPIx; - -}; - -extern SPIClass SPI; -extern SPIClass SPI7; - -#endif diff --git a/cores/arduino/Server.h b/cores/arduino/Server.h old mode 100755 new mode 100644 diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp old mode 100755 new mode 100644 index 9dceeb4..d018c31 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -18,13 +18,14 @@ Created July 2011 parsing functions based on TextFinder library by Michael Margolis + + findMulti/findUntil routines written by Jim Leonard/Xuth */ #include "Arduino.h" #include "Stream.h" #define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait -#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field // private method to read stream with timeout int Stream::timedRead() @@ -52,14 +53,30 @@ int Stream::timedPeek() // returns peek of the next digit in the stream or -1 if timeout // discards non-numeric characters -int Stream::peekNextDigit() +int Stream::peekNextDigit(LookaheadMode lookahead, bool detectDecimal ) { int c; while (1) { c = timedPeek(); - if (c < 0) return c; // timeout - if (c == '-') return c; - if (c >= '0' && c <= '9') return c; + + if( c < 0 || + c == '-' || + (c >= '0' && c <= '9') || + (detectDecimal && c == '.')) return c; + + switch( lookahead ){ + case SKIP_NONE: return -1; // Fail code. + case SKIP_WHITESPACE: + switch( c ){ + case ' ': + case '\t': + case '\r': + case '\n': break; + default: return -1; // Fail code. + } + case SKIP_ALL: + break; + } read(); // discard non-numeric } } @@ -75,7 +92,7 @@ void Stream::setTimeout(unsigned long timeout) // sets the maximum number of mi // find returns true if the target string is found bool Stream::find(char *target) { - return findUntil(target, (char*)""); + return findUntil(target, strlen(target), NULL, 0); } // reads data from the stream until the target string of given length is found @@ -96,58 +113,34 @@ bool Stream::findUntil(char *target, char *terminator) // returns true if target string is found, false if terminated or timed out bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen) { - size_t index = 0; // maximum target string length is 64k bytes! - size_t termIndex = 0; - int c; - - if( *target == 0) - return true; // return true if target is a null string - while( (c = timedRead()) > 0){ - - if(c != target[index]) - index = 0; // reset index if any char does not match - - if( c == target[index]){ - if(++index >= targetLen){ // return true if all chars in the target match - return true; - } - } - - if(termLen > 0 && c == terminator[termIndex]){ - if(++termIndex >= termLen) - return false; // return false if terminate string found before target string - } - else - termIndex = 0; + if (terminator == NULL) { + MultiTarget t[1] = {{target, targetLen, 0}}; + return findMulti(t, 1) == 0 ? true : false; + } else { + MultiTarget t[2] = {{target, targetLen, 0}, {terminator, termLen, 0}}; + return findMulti(t, 2) == 0 ? true : false; } - return false; } - // returns the first valid (long) integer value from the current position. -// initial characters that are not digits (or the minus sign) are skipped -// function is terminated by the first character that is not a digit. -long Stream::parseInt() -{ - return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) -} - -// as above but a given skipChar is ignored -// this allows format characters (typically commas) in values to be ignored -long Stream::parseInt(char skipChar) +// lookahead determines how parseInt looks ahead in the stream. +// See LookaheadMode enumeration at the top of the file. +// Lookahead is terminated by the first character that is not a valid part of an integer. +// Once parsing commences, 'ignore' will be skipped in the stream. +long Stream::parseInt(LookaheadMode lookahead, char ignore) { - boolean isNegative = false; + bool isNegative = false; long value = 0; int c; - c = peekNextDigit(); + c = peekNextDigit(lookahead, false); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ - if(c == skipChar) - ; // ignore this charactor + if(c == ignore) + ; // ignore this character else if(c == '-') isNegative = true; else if(c >= '0' && c <= '9') // is c a digit? @@ -155,36 +148,29 @@ long Stream::parseInt(char skipChar) read(); // consume the character we got with peek c = timedPeek(); } - while( (c >= '0' && c <= '9') || c == skipChar ); + while( (c >= '0' && c <= '9') || c == ignore ); if(isNegative) value = -value; return value; } - // as parseInt but returns a floating point value -float Stream::parseFloat() +float Stream::parseFloat(LookaheadMode lookahead, char ignore) { - return parseFloat(NO_SKIP_CHAR); -} - -// as above but the given skipChar is ignored -// this allows format characters (typically commas) in values to be ignored -float Stream::parseFloat(char skipChar){ - boolean isNegative = false; - boolean isFraction = false; + bool isNegative = false; + bool isFraction = false; long value = 0; int c; float fraction = 1.0; - c = peekNextDigit(); + c = peekNextDigit(lookahead, true); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ - if(c == skipChar) + if(c == ignore) ; // ignore else if(c == '-') isNegative = true; @@ -198,7 +184,7 @@ float Stream::parseFloat(char skipChar){ read(); // consume the character we got with peek c = timedPeek(); } - while( (c >= '0' && c <= '9') || c == '.' || c == skipChar ); + while( (c >= '0' && c <= '9') || (c == '.' && !isFraction) || c == ignore ); if(isNegative) value = -value; @@ -266,3 +252,68 @@ String Stream::readStringUntil(char terminator) } return ret; } + +int Stream::findMulti( struct Stream::MultiTarget *targets, int tCount) { + // any zero length target string automatically matches and would make + // a mess of the rest of the algorithm. + for (struct MultiTarget *t = targets; t < targets+tCount; ++t) { + if (t->len <= 0) + return t - targets; + } + + while (1) { + int c = timedRead(); + if (c < 0) + return -1; + + for (struct MultiTarget *t = targets; t < targets+tCount; ++t) { + // the simple case is if we match, deal with that first. + if (c == t->str[t->index]) { + if (++t->index == t->len) + return t - targets; + else + continue; + } + + // if not we need to walk back and see if we could have matched further + // down the stream (ie '1112' doesn't match the first position in '11112' + // but it will match the second position so we can't just reset the current + // index to 0 when we find a mismatch. + if (t->index == 0) + continue; + + int origIndex = t->index; + do { + --t->index; + // first check if current char works against the new current index + if (c != t->str[t->index]) + continue; + + // if it's the only char then we're good, nothing more to check + if (t->index == 0) { + t->index++; + break; + } + + // otherwise we need to check the rest of the found string + int diff = origIndex - t->index; + size_t i; + for (i = 0; i < t->index; ++i) { + if (t->str[i] != t->str[i + diff]) + break; + } + + // if we successfully got through the previous loop then our current + // index is good. + if (i == t->index) { + t->index++; + break; + } + + // otherwise we just try the next index + } while (t->index); + } + } + // unreachable + return -1; +} diff --git a/cores/arduino/Stream.h b/cores/arduino/Stream.h old mode 100755 new mode 100644 index 5cf5ddf..db71bb6 --- a/cores/arduino/Stream.h +++ b/cores/arduino/Stream.h @@ -28,13 +28,24 @@ // compatability macros for testing /* #define getInt() parseInt() -#define getInt(skipChar) parseInt(skipchar) +#define getInt(ignore) parseInt(ignore) #define getFloat() parseFloat() -#define getFloat(skipChar) parseFloat(skipChar) +#define getFloat(ignore) parseFloat(ignore) #define getString( pre_string, post_string, buffer, length) readBytesBetween( pre_string, terminator, buffer, length) */ +// This enumeration provides the lookahead options for parseInt(), parseFloat() +// The rules set out here are used until either the first valid character is found +// or a time out occurs due to lack of input. +enum LookaheadMode{ + SKIP_ALL, // All invalid characters are ignored. + SKIP_NONE, // Nothing is skipped, and the stream is not touched unless the first waiting character is valid. + SKIP_WHITESPACE // Only tabs, spaces, line feeds & carriage returns are skipped. +}; + +#define NO_IGNORE_CHAR '\x01' // a char not found in a valid ASCII numeric field + class Stream : public Print { protected: @@ -42,7 +53,7 @@ class Stream : public Print unsigned long _startMillis; // used for timeout measurement int timedRead(); // private method to read stream with timeout int timedPeek(); // private method to peek stream with timeout - int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout + int peekNextDigit(LookaheadMode lookahead, bool detectDecimal); // returns the next numeric digit in the stream or -1 if timeout public: virtual int available() = 0; @@ -64,18 +75,23 @@ class Stream : public Print bool find(uint8_t *target, size_t length) { return find ((char *)target, length); } // returns true if target string is found, false if timed out + bool find(char target) { return find (&target, 1); } + bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found bool findUntil(uint8_t *target, char *terminator) { return findUntil((char *)target, terminator); } bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found bool findUntil(uint8_t *target, size_t targetLen, char *terminate, size_t termLen) {return findUntil((char *)target, targetLen, terminate, termLen); } + long parseInt(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR); + // returns the first valid (long) integer value from the current position. + // lookahead determines how parseInt looks ahead in the stream. + // See LookaheadMode enumeration at the top of the file. + // Lookahead is terminated by the first character that is not a valid part of an integer. + // Once parsing commences, 'ignore' will be skipped in the stream. - long parseInt(); // returns the first valid (long) integer value from the current position. - // initial characters that are not digits (or the minus sign) are skipped - // integer is terminated by the first character that is not a digit. - - float parseFloat(); // float version of parseInt + float parseFloat(LookaheadMode lookahead = SKIP_ALL, char ignore = NO_IGNORE_CHAR); + // float version of parseInt size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer size_t readBytes( uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); } @@ -92,11 +108,22 @@ class Stream : public Print String readStringUntil(char terminator); protected: - long parseInt(char skipChar); // as above but the given skipChar is ignored - // as above but the given skipChar is ignored - // this allows format characters (typically commas) in values to be ignored - - float parseFloat(char skipChar); // as above but the given skipChar is ignored + long parseInt(char ignore) { return parseInt(SKIP_ALL, ignore); } + float parseFloat(char ignore) { return parseFloat(SKIP_ALL, ignore); } + // These overload exists for compatibility with any class that has derived + // Stream and used parseFloat/Int with a custom ignore character. To keep + // the public API simple, these overload remains protected. + + struct MultiTarget { + const char *str; // string you're searching for + size_t len; // length of string you're searching for + size_t index; // index used by the search routine. + }; + + // This allows you to search for an arbitrary number of strings. + // Returns index of the target that is found first or -1 if timeout occurs. + int findMulti(struct MultiTarget *targets, int tCount); }; +#undef NO_IGNORE_CHAR #endif diff --git a/cores/arduino/Tone.cpp b/cores/arduino/Tone.cpp old mode 100755 new mode 100644 index da255e5..9d587d8 --- a/cores/arduino/Tone.cpp +++ b/cores/arduino/Tone.cpp @@ -17,76 +17,34 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ -Version Modified By Date Comments -------- ----------- -------- -------- -0001 B Hagman 09/08/02 Initial coding -0002 B Hagman 09/08/18 Multiple pins -0003 B Hagman 09/08/18 Moved initialization from constructor to begin() -0004 B Hagman 09/09/26 Fixed problems with ATmega8 -0005 B Hagman 09/11/23 Scanned prescalars for best fit on 8 bit timers - 09/11/25 Changed pin toggle method to XOR - 09/11/25 Fixed timer0 from being excluded -0006 D Mellis 09/12/29 Replaced objects with functions -0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register -0008 S Kanemoto 12/06/22 Fixed for Leonardo by @maris_HY -0009 Arduino.org 15/06/30 Add M0/M0 Pro support -0010 F Alessi 16/06/09 Add Star OTTO support -*************************************************/ - -#include "HardwareTimer.h" #include "Arduino.h" -#include "Tone.h" -volatile static int toggle_count=0; -static int tone_pin; -int timer_CH = 5; +PinName g_lastPin = NC; +static stimer_t _timer; -HardwareTimer timer(timer_CH); +// frequency (in hertz) and duration (in milliseconds). -void tone(uint8_t pin, unsigned int frequency, unsigned long duration) +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) { - timer.pause(); - pinMode(pin,OUTPUT); - tone_pin = pin; - if (duration > 0 ) toggle_count = 2 * frequency * duration / 1000; - else toggle_count = -1; - timer.setPrescaleFactor(CYCLES_PER_MICROSECOND); // microseconds - timer.setOverflow(1000000/frequency/16); - timer.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE); - timer.setCompare(TIMER_CH1, 1); // Interrupt 1 count after each update - timer.toneAttachInterrupt(TIMER_CH1, handler_tone); - timer.refresh(); // start it up - timer.resume(); - - return; + PinName p = digitalPinToPinName(_pin); + if(p != NC) { + if((g_lastPin == NC) || (g_lastPin == p)) { + _timer.pin = p; + TimerPinInit(&_timer, frequency, duration); + g_lastPin = p; + } + } } -void noTone(uint8_t pin) -{ - timer.pause(); - timer.setPrescaleFactor(1); - timer.setOverflow(0xFFFF); - timer.setMode(TIMER_CH1, TIMER_PWM); - timer.refresh(); - timer.resume(); - gpio_write_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, 0); - pinMode(pin,INPUT); //to fix dfu issue - - return; -} -/* -void set_timer(int ch) -{ - HardwareTimer timer(ch); - timer_CH = ch; -} -*/ -void handler_tone(void) +void noTone(uint8_t _pin) { - if (toggle_count != 0){ - gpio_toggle_bit(PIN_MAP[tone_pin].gpio_device, PIN_MAP[tone_pin].gpio_bit); - if (toggle_count > 0) toggle_count--; - } else noTone(tone_pin); + PinName p = digitalPinToPinName(_pin); + if(p != NC) { + TimerPinDeinit(&_timer); + digitalWrite(_pin, 0); + g_lastPin = NC; + } } diff --git a/cores/arduino/Tone.h b/cores/arduino/Tone.h old mode 100755 new mode 100644 index ca7c38d..932a875 --- a/cores/arduino/Tone.h +++ b/cores/arduino/Tone.h @@ -8,7 +8,7 @@ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public @@ -19,17 +19,28 @@ #ifndef _WIRING_TONE_ #define _WIRING_TONE_ -#include -#include -#include - -void tone(uint8_t pin, unsigned int frequency, unsigned long duration = 0); -void noTone(uint8_t pin); -void set_timer(int ch); -void handler_tone(void); - - +#ifdef __cplusplus +extern "C" { +#endif +/* + * \brief Generate a tone to a pin. + * + * \param _pin + * \param frequency Tone frequency (in hertz) + * \param duration Tone duration (in milliseconds) + */ +extern void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); +/* + * \brief Stop tone generation on pin. + * + * \param _pin + */ +extern void noTone(uint8_t _pin); + +#ifdef __cplusplus +} +#endif #endif /* _WIRING_TONE_ */ diff --git a/cores/arduino/Udp.h b/cores/arduino/Udp.h old mode 100755 new mode 100644 diff --git a/cores/arduino/WCharacter.h b/cores/arduino/WCharacter.h index 3781bec..e84b348 100644 --- a/cores/arduino/WCharacter.h +++ b/cores/arduino/WCharacter.h @@ -19,9 +19,15 @@ #ifndef Character_h #define Character_h + #include +#ifdef __cplusplus +extern "C" { +#endif + // WCharacter.h prototypes +#if defined ( __GNUC__ ) inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); inline boolean isAlpha(int c) __attribute__((always_inline)); inline boolean isAscii(int c) __attribute__((always_inline)); @@ -38,7 +44,8 @@ inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); inline int toAscii(int c) __attribute__((always_inline)); inline int toLowerCase(int c) __attribute__((always_inline)); inline int toUpperCase(int c)__attribute__((always_inline)); - +#elif defined ( __ICCARM__ ) +#endif // Checks for an alphanumeric character. // It is equivalent to (isalpha(c) || isdigit(c)). @@ -60,7 +67,8 @@ inline boolean isAlpha(int c) // that fits into the ASCII character set. inline boolean isAscii(int c) { - return ( isascii (c) == 0 ? false : true); +/* return ( isascii(c) == 0 ? false : true); */ + return ( (c & ~0x7f) != 0 ? false : true); } @@ -142,7 +150,8 @@ inline boolean isHexadecimalDigit(int c) // ASCII character set, by clearing the high-order bits. inline int toAscii(int c) { - return toascii (c); +/* return toascii (c); */ + return (c & 0x7f); } @@ -164,4 +173,8 @@ inline int toUpperCase(int c) return toupper (c); } +#ifdef __cplusplus +} +#endif + #endif diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c new file mode 100644 index 0000000..a0b5a7c --- /dev/null +++ b/cores/arduino/WInterrupts.c @@ -0,0 +1,59 @@ +/* + Copyright (c) 2011-2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "WInterrupts.h" + +#ifdef __cplusplus + extern "C" { +#endif + +void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode) +{ + uint32_t it_mode; + PinName p = digitalPinToPinName(pin); + GPIO_TypeDef* port = set_GPIO_Port_Clock(STM_PORT(p)); + if (port == NC) + return; + + switch(mode) { + case CHANGE : + it_mode = GPIO_MODE_IT_RISING_FALLING; + break; + case FALLING : + case LOW : + it_mode = GPIO_MODE_IT_FALLING; + break; + case RISING : + case HIGH : + it_mode = GPIO_MODE_IT_RISING; + break; + default: + it_mode = GPIO_MODE_IT_RISING; + break; + } + stm32_interrupt_enable(port, STM_GPIO_PIN(p), callback, it_mode); +} + +void detachInterrupt(uint32_t pin) +{ + PinName p = digitalPinToPinName(pin); + GPIO_TypeDef* port = get_GPIO_Port(STM_PORT(p)); + if (port == NC) + return; + stm32_interrupt_disable(port, STM_GPIO_PIN(p)); +} diff --git a/cores/arduino/WInterrupts.h b/cores/arduino/WInterrupts.h new file mode 100644 index 0000000..a76588e --- /dev/null +++ b/cores/arduino/WInterrupts.h @@ -0,0 +1,36 @@ +/* + Copyright (c) 2011-2012 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_INTERRUPTS_ +#define _WIRING_INTERRUPTS_ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode); + +void detachInterrupt(uint32_t pin); + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_INTERRUPTS_ */ diff --git a/cores/arduino/WMath.cpp b/cores/arduino/WMath.cpp index 34bf341..ec2e29b 100644 --- a/cores/arduino/WMath.cpp +++ b/cores/arduino/WMath.cpp @@ -8,7 +8,7 @@ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public diff --git a/cores/arduino/WMath.h b/cores/arduino/WMath.h index 063229d..05779ea 100644 --- a/cores/arduino/WMath.h +++ b/cores/arduino/WMath.h @@ -8,7 +8,7 @@ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public @@ -29,19 +29,5 @@ extern uint16_t makeWord( uint8_t h, uint8_t l ) ; #define word(...) makeWord(__VA_ARGS__) -#define min(a,b) ((a)<(b)?(a):(b)) -#define max(a,b) ((a)>(b)?(a):(b)) -#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) -#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) -#define radians(deg) ((deg)*DEG_TO_RAD) -#define degrees(rad) ((rad)*RAD_TO_DEG) -#define sq(x) ((x)*(x)) - -/* undefine stdlib's abs if encountered */ -#ifdef abs -#undef abs -#endif -#define abs(x) (((x) > 0) ? (x) : -(x)) - #endif /* _WIRING_MATH_ */ diff --git a/cores/arduino/WProgram.h b/cores/arduino/WProgram.h deleted file mode 100755 index 8294cdf..0000000 --- a/cores/arduino/WProgram.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#include "wiring.h" - -void setup(); -void loop(); diff --git a/cores/arduino/WString.cpp b/cores/arduino/WString.cpp old mode 100755 new mode 100644 index a1a560e..a6432f2 --- a/cores/arduino/WString.cpp +++ b/cores/arduino/WString.cpp @@ -45,7 +45,7 @@ String::String(const __FlashStringHelper *pstr) *this = pstr; } -#ifdef __GXX_EXPERIMENTAL_CXX0X__ +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String::String(String &&rval) { init(); @@ -191,7 +191,7 @@ String & String::copy(const __FlashStringHelper *pstr, unsigned int length) return *this; } -#ifdef __GXX_EXPERIMENTAL_CXX0X__ +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) void String::move(String &rhs) { if (buffer) { @@ -223,7 +223,7 @@ String & String::operator = (const String &rhs) return *this; } -#ifdef __GXX_EXPERIMENTAL_CXX0X__ +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String & String::operator = (String &&rval) { if (this != &rval) move(rval); @@ -621,7 +621,7 @@ String String::substring(unsigned int left, unsigned int right) const left = temp; } String out; - if (left > len) return out; + if (left >= len) return out; if (right > len) right = len; char temp = buffer[right]; // save the replaced character buffer[right] = '\0'; @@ -686,15 +686,16 @@ void String::replace(const String& find, const String& replace) } void String::remove(unsigned int index){ - if (index >= len) { return; } - int count = len - index; - remove(index, count); + // Pass the biggest integer as the count. The remove method + // below will take care of truncating it at the end of the + // string. + remove(index, (unsigned int)-1); } void String::remove(unsigned int index, unsigned int count){ if (index >= len) { return; } if (count <= 0) { return; } - if (index + count > len) { count = len - index; } + if (count > len - index) { count = len - index; } char *writeTo = buffer + index; len = len - count; strncpy(writeTo, buffer + index + count,len - index); diff --git a/cores/arduino/WString.h b/cores/arduino/WString.h old mode 100755 new mode 100644 index 363000e..5618c0c --- a/cores/arduino/WString.h +++ b/cores/arduino/WString.h @@ -59,7 +59,7 @@ class String String(const char *cstr = ""); String(const String &str); String(const __FlashStringHelper *str); - #ifdef __GXX_EXPERIMENTAL_CXX0X__ + #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String(String &&rval); String(StringSumHelper &&rval); #endif @@ -86,7 +86,7 @@ class String String & operator = (const String &rhs); String & operator = (const char *cstr); String & operator = (const __FlashStringHelper *str); - #ifdef __GXX_EXPERIMENTAL_CXX0X__ + #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) String & operator = (String &&rval); String & operator = (StringSumHelper &&rval); #endif @@ -200,7 +200,7 @@ class String // copy and move String & copy(const char *cstr, unsigned int length); String & copy(const __FlashStringHelper *pstr, unsigned int length); - #ifdef __GXX_EXPERIMENTAL_CXX0X__ + #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) void move(String &rhs); #endif }; diff --git a/cores/arduino/Wire.cpp b/cores/arduino/Wire.cpp deleted file mode 100755 index 81d4443..0000000 --- a/cores/arduino/Wire.cpp +++ /dev/null @@ -1,842 +0,0 @@ -/* - TwoWire.cpp - TWI/I2C library for Wiring & Arduino - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts -*/ - -/* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -extern "C" { - #include - #include - #include - #include "stm32f4xx_hal.h" -} - -#include "Wire.h" - -#define FLAG_TIMEOUT ((int)0x1000) -#define LONG_TIMEOUT ((int)0x8000) - -// Constructors //////////////////////////////////////////////////////////////// -TwoWire::TwoWire(I2C_TypeDef *twi) -{ - I2cHandle.Instance = twi; - memset(rxBuffer, 0, BUFFER_LENGTH); - rxBufferIndex = 0; - rxBufferLength = 0; - txAddress = 0; - txBufferIndex = 0; - txBufferLength = 0; - transmitting = 0; - defaultAddress = 0x00; -} - -// Public Methods ////////////////////////////////////////////////////////////// - -void TwoWire::begin(void) -{ - GPIO_InitTypeDef GPIO_InitStruct; - I2C_TypeDef *twi = (I2C_TypeDef *)I2cHandle.Instance; - - rxBufferIndex = 0; - rxBufferLength = 0; - - txBufferIndex = 0; - txBufferLength = 0; - - //twi_init(); - if(twi == I2C3) - { - /* Enable GPIO TX/RX clock */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /* Enable I2Cx clock */ - __HAL_RCC_I2C3_CLK_ENABLE(); - - /* I2C SCL GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; - HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); - - /* I2C SDA GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; - HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); - - HAL_NVIC_SetPriority(I2C3_ER_IRQn, 0, 1); - HAL_NVIC_EnableIRQ(I2C3_ER_IRQn); - HAL_NVIC_SetPriority(I2C3_EV_IRQn, 0, 2); - HAL_NVIC_EnableIRQ(I2C3_EV_IRQn); - } - else if(twi == I2C2) - { - /* Enable GPIO TX/RX clock */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /* Enable I2Cx clock */ - __HAL_RCC_I2C2_CLK_ENABLE(); - - /* I2C SCL GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_4; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; - HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); - - /* I2C SDA GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; - HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); - - HAL_NVIC_SetPriority(I2C2_ER_IRQn, 0, 1); - HAL_NVIC_EnableIRQ(I2C2_ER_IRQn); - HAL_NVIC_SetPriority(I2C2_EV_IRQn, 0, 2); - HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); - } - else if(twi == I2C1) - { - /* Enable GPIO TX/RX clock */ - __HAL_RCC_GPIOB_CLK_ENABLE(); - - /* Enable I2Cx clock */ - __HAL_RCC_I2C1_CLK_ENABLE(); - - /* I2C SCL GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C SDA GPIO pin configuration */ - GPIO_InitStruct.Pin = GPIO_PIN_7; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 1); - HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); - HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 2); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); - } else - { - // Do nothing - } - - /*##-1- Configure the I2C peripheral ######################################*/ - I2cHandle.Init.ClockSpeed = 100000; - I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2; - I2cHandle.Init.OwnAddress1 = defaultAddress; - I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - I2cHandle.Init.OwnAddress2 = 0x0; - I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - - HAL_I2C_Init(&I2cHandle); - - /*##-3- Put I2C peripheral in listen mode process ###########################*/ - HAL_I2C_EnableListen_IT(&I2cHandle); -} - -void TwoWire::begin(uint8_t address) -{ - defaultAddress = (address << 1); - begin(); -} - -void TwoWire::begin(int address) -{ - begin((uint8_t)address); -} - -void TwoWire::setClock(uint32_t frequency) -{ - // wait before init - int timeout = LONG_TIMEOUT; - while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0)); - - //TWBR = ((F_CPU / frequency) - 16) / 2; - I2cHandle.Init.ClockSpeed = frequency; - I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2; - I2cHandle.Init.OwnAddress1 = defaultAddress; - I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - I2cHandle.Init.OwnAddress2 = 0x0; - I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - HAL_I2C_Init(&I2cHandle); -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) -{ - uint8_t ret_val; - - disableInterrupt(); - - // clamp to buffer length - if(quantity > BUFFER_LENGTH){ - quantity = BUFFER_LENGTH; - } - // perform blocking read into buffer - int read = i2c_master_read((address << 1), (char *)rxBuffer, quantity, sendStop); - - if(read < 0) - { - ret_val = 0; - }else - { - ret_val = read; - } - - // set rx buffer iterator vars - rxBufferIndex = 0; - rxBufferLength = ret_val; - - enableInterrupt(); - - return ret_val; -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) -{ - return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); -} - -uint8_t TwoWire::requestFrom(int address, int quantity) -{ - return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); -} - -uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) -{ - return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)sendStop); -} - -void TwoWire::beginTransmission(uint8_t address) -{ - // indicate that we are transmitting - transmitting = 1; - // set address of targeted slave - txAddress = address; - // reset tx buffer iterator vars - txBufferIndex = 0; - txBufferLength = 0; -} - -void TwoWire::beginTransmission(int address) -{ - beginTransmission((uint8_t)address); -} - -// -// Originally, 'endTransmission' was an f(void) function. -// It has been modified to take one parameter indicating -// whether or not a STOP should be performed on the bus. -// Calling endTransmission(false) allows a sketch to -// perform a repeated start. -// -// WARNING: Nothing in the library keeps track of whether -// the bus tenure has been properly ended with a STOP. It -// is very possible to leave the bus in a hung state if -// no call to endTransmission(true) is made. Some I2C -// devices will behave oddly if they do not see a STOP. -// -uint8_t TwoWire::endTransmission(uint8_t sendStop) -{ - // transmit buffer (blocking) - disableInterrupt(); - - int8_t ret = i2c_master_write((txAddress << 1), (const char *)txBuffer, txBufferLength, sendStop); - // reset tx buffer iterator vars - txBufferIndex = 0; - txBufferLength = 0; - // indicate that we are done transmitting - transmitting = 0; - - enableInterrupt(); - - return ret; -} - -// This provides backwards compatibility with the original -// definition, and expected behaviour, of endTransmission -// -uint8_t TwoWire::endTransmission(void) -{ - return endTransmission(true); -} - -// must be called in: -// slave tx event callback -// or after beginTransmission(address) -size_t TwoWire::write(uint8_t data) -{ - if(transmitting){ - // in master transmitter mode - // don't bother if buffer is full - if(txBufferLength >= BUFFER_LENGTH){ - return 0; - } - // put byte in tx buffer - txBuffer[txBufferIndex] = data; - ++txBufferIndex; - // update amount in buffer - txBufferLength = txBufferIndex; - }else{ - // in slave send mode - // transmit buffer (blocking) - disableInterrupt(); - - // reply to master - i2c_slave_write((const char *)&data, 1); - - enableInterrupt(); - - HAL_I2C_EnableListen_IT(&I2cHandle); - } - return 1; -} - -// must be called in: -// slave tx event callback -// or after beginTransmission(address) -size_t TwoWire::write(const uint8_t *data, size_t quantity) -{ - if(transmitting){ - // in master transmitter mode - for(size_t i = 0; i < quantity; ++i){ - write(data[i]); - } - }else{ - // in slave send mode - // reply to master - disableInterrupt(); - - i2c_slave_write((const char *)data, quantity); - - enableInterrupt(); - - HAL_I2C_EnableListen_IT(&I2cHandle); - } - return quantity; -} - -// must be called in: -// slave rx event callback -// or after requestFrom(address, numBytes) -int TwoWire::available(void) -{ - return rxBufferLength - rxBufferIndex; -} - -// must be called in: -// slave rx event callback -// or after requestFrom(address, numBytes) -int TwoWire::read(void) -{ - int value = -1; - - // get each successive byte on each call - if(rxBufferIndex < rxBufferLength){ - value = rxBuffer[rxBufferIndex]; - ++rxBufferIndex; - } - - return value; -} - -// must be called in: -// slave rx event callback -// or after requestFrom(address, numBytes) -int TwoWire::peek(void) -{ - int value = -1; - - if(rxBufferIndex < rxBufferLength){ - value = rxBuffer[rxBufferIndex]; - } - - return value; -} - -void TwoWire::flush(void) -{ - // XXX: to be implemented. -} - -// sets function called on slave write -void TwoWire::onReceive( void (*function)(int) ) -{ - user_onReceive = function; -} - -// sets function called on slave read -void TwoWire::onRequest( void (*function)(void) ) -{ - user_onRequest = function; -} - -int TwoWire::i2c_master_start() -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - - int timeout; - - // Clear Acknowledge failure flag - __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_AF); - - // Wait the STOP condition has been previously correctly sent - // This timeout can be avoid in some specific cases by simply clearing the STOP bit - timeout = FLAG_TIMEOUT; - while ((i2c->CR1 & I2C_CR1_STOP) == I2C_CR1_STOP) { - if ((timeout--) == 0) { - return 1; - } - } - - // Generate the START condition - i2c->CR1 |= I2C_CR1_START; - - // Wait the START condition has been correctly sent - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) { - if ((timeout--) == 0) { - return 1; - } - } - - return 0; -} - -int TwoWire::i2c_master_stop() -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - - // Generate the STOP condition - i2c->CR1 |= I2C_CR1_STOP; - - return 0; -} - -int TwoWire::i2c_master_read(uint8_t address, char *data, uint8_t length, uint8_t stop) -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - int timeout; - int count; - int value; - int ret; - - i2c_master_start(); - - // Wait until SB flag is set - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) { - timeout--; - if (timeout == 0) { - return -1; - } - } - - i2c->DR = __HAL_I2C_7BIT_ADD_READ(address); - - // Wait address is acknowledged - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) { - timeout--; - if (timeout == 0) { - return -1; - } - } - __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle); - - // Read all bytes except last one - for (count = 0; count < (length - 1); count++) { - ret = i2c_master_byte_read(&value, 0); - if(ret) - { - return -1; - } - data[count] = (char)value; - } - - // If not repeated start, send stop. - // Warning: must be done BEFORE the data is read. - if (stop) { - i2c_master_stop(); - } - - // Read the last byte - ret = i2c_master_byte_read(&value, 1); - if(ret) - { - return -1; - } - data[count] = (char)value; - - return length; -} - -int TwoWire::i2c_master_write(int address, const char *data, int length, int stop) -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - int timeout; - int count; - - i2c_master_start(); - - // Wait until SB flag is set - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) { - timeout--; - if (timeout == 0) { - return 4; - } - } - - i2c->DR = __HAL_I2C_7BIT_ADD_WRITE(address); - - // Wait address is acknowledged - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) { - timeout--; - if (timeout == 0) { - return 2; - } - } - __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle); - - for (count = 0; count < length; count++) { - if (i2c_master_byte_write(data[count]) != 1) { - return 3; - } - } - - // If not repeated start, send stop. - if (stop) { - i2c_master_stop(); - } - - return 0; -} - -int TwoWire::i2c_master_byte_read(int *value, int last) -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - int timeout; - - if (last) { - // Don't acknowledge the last byte - i2c->CR1 &= ~I2C_CR1_ACK; - } else { - // Acknowledge the byte - i2c->CR1 |= I2C_CR1_ACK; - } - - // Wait until the byte is received - timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) { - if ((timeout--) == 0) { - return -1; - } - } - - *value = (int)i2c->DR; - - return 0; -} - -int TwoWire::i2c_master_byte_write(int data) -{ - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - int timeout; - - i2c->DR = (uint8_t)data; - - // Wait until the byte is transmitted - timeout = FLAG_TIMEOUT; - while ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) && - (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == RESET)) { - if ((timeout--) == 0) { - return 0; - } - } - - return 1; -} - -int TwoWire::i2c_slave_write(const char *data, int length) -{ - uint32_t Timeout; - int size = 0; - - I2C_TypeDef *i2c = (I2C_TypeDef *)I2cHandle.Instance; - - while (length > 0) { - /* Wait until TXE flag is set */ - Timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) { - Timeout--; - if (Timeout == 0) { - return -1; - } - } - - /* Write data to DR */ - i2c->DR = (*data++); - length--; - size++; - - if ((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BTF) == SET) && (length != 0)) { - /* Write data to DR */ - i2c->DR = (*data++); - length--; - size++; - } - } - - /* Wait until AF flag is set */ - Timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_AF) == RESET) { - Timeout--; - if (Timeout == 0) { - return -1; - } - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_AF); - - /* Wait until BUSY flag is reset */ - Timeout = FLAG_TIMEOUT; - while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == SET) { - Timeout--; - if (Timeout == 0) { - return -1; - } - } - - I2cHandle.State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(&I2cHandle); - - return size; -} - -void TwoWire::handleInterrupt(uint8_t TransferDirection, uint16_t AddrMatchCode) -{ - if(AddrMatchCode == defaultAddress) - { - /* First of all, check the transfer direction to call the correct Slave Interface */ - if(TransferDirection == I2C_DIRECTION_TRANSMIT) - { - // don't bother if user hasn't registered a callback - if(!user_onReceive){ - return; - } - - HAL_I2C_Slave_Sequential_Receive_IT(&I2cHandle, &(rxBuffer[rxBufferLength]), 1, I2C_FIRST_FRAME); - } - else - { - // don't bother if user hasn't registered a callback - if(!user_onRequest){ - return; - } - // reset tx buffer iterator vars - // !!! this will kill any pending pre-master sendTo() activity - txBufferIndex = 0; - txBufferLength = 0; - - // alert user program - user_onRequest(); - } - } -} - -void TwoWire::enableInterrupt(void) -{ - if(I2cHandle.Instance == I2C3) - { - HAL_NVIC_EnableIRQ(I2C3_ER_IRQn); - HAL_NVIC_EnableIRQ(I2C3_EV_IRQn); - } - else if(I2cHandle.Instance == I2C2) - { - HAL_NVIC_EnableIRQ(I2C2_ER_IRQn); - HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); - } - else if (I2cHandle.Instance == I2C1) - { - HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); - HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); - } else - { - // Do Nothing - } -} - -void TwoWire::disableInterrupt(void) -{ - if(I2cHandle.Instance == I2C3) - { - HAL_NVIC_DisableIRQ(I2C3_ER_IRQn); - HAL_NVIC_DisableIRQ(I2C3_EV_IRQn); - } - else if(I2cHandle.Instance == I2C2) - { - HAL_NVIC_DisableIRQ(I2C2_ER_IRQn); - HAL_NVIC_DisableIRQ(I2C2_EV_IRQn); - } - else if (I2cHandle.Instance == I2C1) - { - HAL_NVIC_DisableIRQ(I2C1_ER_IRQn); - HAL_NVIC_DisableIRQ(I2C1_EV_IRQn); - } else - { - // Do Nothing - } -} - -#ifdef __cplusplus -extern "C" { -#endif - -void __irq_i2c1_ev(void) -{ - //while(1) - //{ - //} - HAL_I2C_EV_IRQHandler(&(Wire.I2cHandle)); -} - -void __irq_i2c1_er(void) -{ - HAL_I2C_ER_IRQHandler(&(Wire.I2cHandle)); -} - -void __irq_i2c2_ev(void) -{ - HAL_I2C_EV_IRQHandler(&(Wire1.I2cHandle)); -} - -void __irq_i2c2_er(void) -{ - HAL_I2C_ER_IRQHandler(&(Wire1.I2cHandle)); -} - -void __irq_I2C3_EV_IRQHandler(void) -{ - HAL_I2C_EV_IRQHandler(&(Wire2.I2cHandle)); -} - -void __irq_I2C3_ER_IRQHandler(void) -{ - HAL_I2C_ER_IRQHandler(&(Wire2.I2cHandle)); -} - -void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) -{ - if(hi2c->Instance == I2C1) - { - Wire.handleInterrupt(TransferDirection, AddrMatchCode); - } else if (hi2c->Instance == I2C2) - { - Wire1.handleInterrupt(TransferDirection, AddrMatchCode); - } else if (hi2c->Instance == I2C3) - { - Wire2.handleInterrupt(TransferDirection, AddrMatchCode); - } else - { - // Do nothing, but it is strange if you enter here - } -} - - -void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->Instance == I2C3) - { - Wire2.rxBufferLength++; - HAL_I2C_Slave_Sequential_Receive_IT(&(Wire2.I2cHandle), &(Wire2.rxBuffer[Wire2.rxBufferLength]), 1, I2C_FIRST_FRAME); - } - else if(hi2c->Instance == I2C2) - { - Wire1.rxBufferLength++; - HAL_I2C_Slave_Sequential_Receive_IT(&(Wire1.I2cHandle), &(Wire1.rxBuffer[Wire1.rxBufferLength]), 1, I2C_FIRST_FRAME); - } - else if (hi2c->Instance == I2C1) - { - Wire.rxBufferLength++; - HAL_I2C_Slave_Sequential_Receive_IT(&(Wire.I2cHandle), &(Wire.rxBuffer[Wire.rxBufferLength]), 1, I2C_FIRST_FRAME); - } else - { - // Do Nothing - } -} - -void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->Instance == I2C3) - { - Wire2.rxBufferIndex = 0; - Wire2.user_onReceive(Wire2.rxBufferLength); - Wire2.rxBufferIndex = 0; - Wire2.rxBufferLength = 0; - HAL_I2C_EnableListen_IT(&(Wire2.I2cHandle)); - } - else if(hi2c->Instance == I2C2) - { - Wire1.rxBufferIndex = 0; - Wire1.user_onReceive(Wire1.rxBufferLength); - Wire1.rxBufferIndex = 0; - Wire1.rxBufferLength = 0; - HAL_I2C_EnableListen_IT(&(Wire1.I2cHandle)); - } - else if (hi2c->Instance == I2C1) - { - Wire.rxBufferIndex = 0; - Wire.user_onReceive(Wire.rxBufferLength); - Wire.rxBufferIndex = 0; - Wire.rxBufferLength = 0; - HAL_I2C_EnableListen_IT(&(Wire.I2cHandle)); - } else - { - // Do Nothing - } -} - - -#ifdef __cplusplus -} -#endif - -// Preinstantiate Objects ////////////////////////////////////////////////////// - -TwoWire Wire = TwoWire(I2C1); -TwoWire Wire1 = TwoWire(I2C2); -TwoWire Wire2 = TwoWire(I2C3); diff --git a/cores/arduino/abi.cpp b/cores/arduino/abi.cpp new file mode 100644 index 0000000..962f601 --- /dev/null +++ b/cores/arduino/abi.cpp @@ -0,0 +1,37 @@ +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include + +extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__)); +extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__)); + +void __cxa_pure_virtual(void) { + // We might want to write some diagnostics to uart in this case + //std::terminate(); + while (1) + ; +} + +void __cxa_deleted_virtual(void) { + // We might want to write some diagnostics to uart in this case + //std::terminate(); + while (1) + ; +} + diff --git a/cores/arduino/adc.c b/cores/arduino/adc.c deleted file mode 100755 index 31f3d52..0000000 --- a/cores/arduino/adc.c +++ /dev/null @@ -1,188 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file adc.c - * - * @brief Analog to digital converter routines - * - * IMPORTANT: maximum external impedance must be below 0.4kOhms for 1.5 - * sample conversion time. - * - * At 55.5 cycles/sample, the external input impedance < 50kOhms. - * - * See STM32 manual RM0008 for how to calculate this. - */ - -/* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "rcc.h" -#include "adc.h" - -/* ADC1 device. */ -static adc_dev adc1 = { - .regs = ADC1_BASE, - .clk_id = RCC_ADC1 -}; - -const adc_dev *ADC1_dev = &adc1; - -/* ADC2 device. */ -static adc_dev adc2 = { - .regs = ADC2_BASE, - .clk_id = RCC_ADC2 -}; - -const adc_dev *ADC2_dev = &adc2; - -/* ADC3 device. */ -adc_dev adc3 = { - .regs = ADC3_BASE, - .clk_id = RCC_ADC3 -}; - -const adc_dev *ADC3_dev = &adc3; - - -/** - * @brief Initialize an ADC peripheral. - * - * Initializes the RCC clock line for the given peripheral. Resets - * ADC device registers. - * - * @param dev ADC peripheral to initialize - */ -void adc_init(const adc_dev *dev) { - rcc_clk_enable(dev->clk_id); - - if(dev->clk_id == RCC_ADC1) { - rcc_reset_dev(dev->clk_id); - } -} - -/** - * @brief Set external event select for regular group - * @param dev ADC device - * @param event Event used to trigger the start of conversion. - * @see adc_extsel_event - */ -void adc_set_extsel(const adc_dev *dev, adc_extsel_event event) { - uint32 cr2 = dev->regs->CR2; - cr2 &= ~ADC_CR2_EXTSEL; - cr2 |= event; - dev->regs->CR2 = cr2; -} - -/** - * @brief Call a function on all ADC devices. - * @param fn Function to call on each ADC device. - */ -void adc_foreach(void (*fn)(const adc_dev*)) { - fn(ADC1_dev); - fn(ADC2_dev); - fn(ADC3_dev); -} - -/** - * @brief Turn the given sample rate into values for ADC_SMPRx. Don't - * call this during conversion. - * @param dev adc device - * @param smp_rate sample rate to set - * @see adc_smp_rate - */ -void adc_set_sample_rate(const adc_dev *dev, adc_smp_rate smp_rate) { - uint32 adc_smpr1_val = 0, adc_smpr2_val = 0; - int i; - - for (i = 0; i < 10; i++) { - if (i < 8) { - /* ADC_SMPR1 determines sample time for channels [10,17] */ - adc_smpr1_val |= smp_rate << (i * 3); - } - /* ADC_SMPR2 determines sample time for channels [0,9] */ - adc_smpr2_val |= smp_rate << (i * 3); - } - - dev->regs->SMPR1 = adc_smpr1_val; - dev->regs->SMPR2 = adc_smpr2_val; -} - -/** - * @brief Calibrate an ADC peripheral - * @param dev adc device - */ -void adc_calibrate(const adc_dev *dev) { - // do nothing -} - -/** - * @brief Perform a single synchronous software triggered conversion on a - * channel. - * @param dev ADC device to use for reading. - * @param channel channel to convert - * @return conversion result - */ -uint16 adc_read(const adc_dev *dev, uint8 channel) { - adc_reg_map *regs = dev->regs; - - adc_set_reg_seqlen(dev, 1); - - regs->SQR3 = channel; - regs->CR2 |= ADC_CR2_SWSTART; - while(!(regs->SR & ADC_SR_EOC)); - - return (uint16)(regs->DR & ADC_DR_DATA); -} - -void setupADC() { - - uint32 tmpreg1 = 0; - - tmpreg1 = ADC_COMMON->CCR; - - /* Clear MULTI, DELAY, DMA and ADCPRE bits */ - #define CR_CLEAR_MASK ((uint32)0xFFFC30E0) - tmpreg1 &= CR_CLEAR_MASK; - - /* Configure ADCx: Multi mode, Delay between two sampling time, ADC prescaler, and DMA access mode for multimode */ - /* Set MULTI bits according to ADC_Mode value */ - /* Set ADCPRE bits according to ADC_Prescaler value */ - /* Set DMA bits according to ADC_DMAAccessMode value */ - /* Set DELAY bits according to ADC_TwoSamplingDelay value */ - #define ADC_Mode_Independent 0 - #define ADC_Prescaler_Div2 0 - #define ADC_DMAAccessMode_Disabled 0 /* DMA mode disabled */ - #define ADC_TwoSamplingDelay_5Cycles 0 - - tmpreg1 |= ADC_Mode_Independent | ADC_Prescaler_Div2 | ADC_DMAAccessMode_Disabled | ADC_TwoSamplingDelay_5Cycles; - - /* Write to ADC CCR */ - ADC_COMMON->CCR = tmpreg1; -} diff --git a/cores/arduino/adc.h b/cores/arduino/adc.h deleted file mode 100755 index 478fe6f..0000000 --- a/cores/arduino/adc.h +++ /dev/null @@ -1,364 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file adc.h - * - * @brief Analog-to-Digital Conversion (ADC) header. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _ADC_H_ -#define _ADC_H_ - -#include "memory.h" -#include "bitband.h" -#include "rcc.h" -#include "stm32f4xx_hal.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -#define ADC_COMMON ((ADC_Common_TypeDef *) 0x40012300) - -/** ADC register map type. */ -typedef struct adc_reg_map { - __io uint32 SR; // Status register - __io uint32 CR1; // Control register 1 - __io uint32 CR2; // Control register 2 - __io uint32 SMPR1; // Sample time register 1 - __io uint32 SMPR2; // Sample time register 2 - __io uint32 JOFR1; // Injected channel data offset register 1 - __io uint32 JOFR2; // Injected channel data offset register 2 - __io uint32 JOFR3; // Injected channel data offset register 3 - __io uint32 JOFR4; // Injected channel data offset register 4 - __io uint32 HTR; // Watchdog high threshold register - __io uint32 LTR; // Watchdog low threshold register - __io uint32 SQR1; // Regular sequence register 1 - __io uint32 SQR2; // Regular sequence register 2 - __io uint32 SQR3; // Regular sequence register 3 - __io uint32 JSQR; // Injected sequence register - __io uint32 JDR1; // Injected data register 1 - __io uint32 JDR2; // Injected data register 2 - __io uint32 JDR3; // Injected data register 3 - __io uint32 JDR4; // Injected data register 4 - __io uint32 DR; // Regular data register -} adc_reg_map; - -/** ADC device type. */ -typedef struct adc_dev { - adc_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ -} adc_dev; - -extern const adc_dev *ADC1_dev; -extern const adc_dev *ADC2_dev; -extern const adc_dev *ADC3_dev; - -/* - * Register map base pointers - */ - -#define ADC1_BASE ((struct adc_reg_map*)0x40012000) -#define ADC2_BASE ((struct adc_reg_map*)0x40012100) -#define ADC3_BASE ((struct adc_reg_map*)0x40012200) - -/* - * Register bit definitions - */ - -/* Status register */ - -#define ADC_SR_AWD_BIT 0 -#define ADC_SR_EOC_BIT 1 -#define ADC_SR_JEOC_BIT 2 -#define ADC_SR_JSTRT_BIT 3 -#define ADC_SR_STRT_BIT 4 - -#define ADC_SR_AWD BIT(ADC_SR_AWD_BIT) -#define ADC_SR_EOC BIT(ADC_SR_EOC_BIT) -#define ADC_SR_JEOC BIT(ADC_SR_JEOC_BIT) -#define ADC_SR_JSTRT BIT(ADC_SR_JSTRT_BIT) -#define ADC_SR_STRT BIT(ADC_SR_STRT_BIT) - -/* Control register 1 */ - -#define ADC_CR1_EOCIE_BIT 5 -#define ADC_CR1_AWDIE_BIT 6 -#define ADC_CR1_JEOCIE_BIT 7 -#define ADC_CR1_SCAN_BIT 8 -#define ADC_CR1_AWDSGL_BIT 9 -#define ADC_CR1_JAUTO_BIT 10 -#define ADC_CR1_DISCEN_BIT 11 -#define ADC_CR1_JDISCEN_BIT 12 -#define ADC_CR1_JAWDEN_BIT 22 -#define ADC_CR1_AWDEN_BIT 23 - -#define ADC_CR1_AWDCH (0x1F) -#define ADC_CR1_EOCIE BIT(ADC_CR1_EOCIE_BIT) -#define ADC_CR1_AWDIE BIT(ADC_CR1_AWDIE_BIT) -#define ADC_CR1_JEOCIE BIT(ADC_CR1_JEOCIE_BIT) -#define ADC_CR1_SCAN BIT(ADC_CR1_SCAN_BIT) -#define ADC_CR1_AWDSGL BIT(ADC_CR1_AWDSGL_BIT) -#define ADC_CR1_JAUTO BIT(ADC_CR1_JAUTO_BIT) -#define ADC_CR1_DISCEN BIT(ADC_CR1_DISCEN_BIT) -#define ADC_CR1_JDISCEN BIT(ADC_CR1_JDISCEN_BIT) -#define ADC_CR1_DISCNUM (0xE000) -#define ADC_CR1_JAWDEN BIT(ADC_CR1_JAWDEN_BIT) -#define ADC_CR1_AWDEN BIT(ADC_CR1_AWDEN_BIT) - -/* Control register 2 */ - -#define ADC_CR2_ADON_BIT 0 -#define ADC_CR2_CONT_BIT 1 -#define ADC_CR2_CAL_BIT 2 -#define ADC_CR2_RSTCAL_BIT 3 -#define ADC_CR2_DMA_BIT 8 -#define ADC_CR2_ALIGN_BIT 11 -#define ADC_CR2_JEXTTRIG_BIT 15 -#define ADC_CR2_EXTTRIG_BIT 20 -#define ADC_CR2_TSEREFE_BIT 23 -#define ADC_CR2_JSWSTART_BIT 22 -#define ADC_CR2_SWSTART_BIT 30 -#define ADC_CR2_EXTSEL (0x0F000000) -#define ADC_CR2_JEXTSEL (0x000F0000) - -#define ADC_CR2_ADON BIT(ADC_CR2_ADON_BIT) -#define ADC_CR2_CONT BIT(ADC_CR2_CONT_BIT) -#define ADC_CR2_CAL BIT(ADC_CR2_CAL_BIT) -#define ADC_CR2_RSTCAL BIT(ADC_CR2_RSTCAL_BIT) -#define ADC_CR2_DMA BIT(ADC_CR2_DMA_BIT) -#define ADC_CR2_ALIGN BIT(ADC_CR2_ALIGN_BIT) -#define ADC_CR2_JEXTTRIG BIT(ADC_CR2_JEXTTRIG_BIT) -#define ADC_CR2_EXTTRIG BIT(ADC_CR2_EXTTRIG_BIT) -#define ADC_CR2_JSWSTART BIT(ADC_CR2_JSWSTART_BIT) -#define ADC_CR2_SWSTART BIT(ADC_CR2_SWSTART_BIT) -#define ADC_CR2_TSEREFE BIT(ADC_CR2_TSEREFE_BIT) - -/* Sample time register 1 */ - -#define ADC_SMPR1_SMP17 (0x7 << 21) -#define ADC_SMPR1_SMP16 (0x7 << 18) -#define ADC_SMPR1_SMP15 (0x7 << 15) -#define ADC_SMPR1_SMP14 (0x7 << 12) -#define ADC_SMPR1_SMP13 (0x7 << 9) -#define ADC_SMPR1_SMP12 (0x7 << 6) -#define ADC_SMPR1_SMP11 (0x7 << 3) -#define ADC_SMPR1_SMP10 0x7 - -/* Sample time register 2 */ - -#define ADC_SMPR2_SMP9 (0x7 << 27) -#define ADC_SMPR2_SMP8 (0x7 << 24) -#define ADC_SMPR2_SMP7 (0x7 << 21) -#define ADC_SMPR2_SMP6 (0x7 << 18) -#define ADC_SMPR2_SMP5 (0x7 << 15) -#define ADC_SMPR2_SMP4 (0x7 << 12) -#define ADC_SMPR2_SMP3 (0x7 << 9) -#define ADC_SMPR2_SMP2 (0x7 << 6) -#define ADC_SMPR2_SMP1 (0x7 << 3) -#define ADC_SMPR2_SMP0 0x7 - -/* Injected channel data offset register */ - -#define ADC_JOFR_JOFFSET 0x3FF - -/* Watchdog high threshold register */ - -#define ADC_HTR_HT 0x3FF - -/* Watchdog low threshold register */ - -#define ADC_LTR_LT 0x3FF - -/* Regular sequence register 1 */ - -#define ADC_SQR1_L (0x1F << 20) -#define ADC_SQR1_SQ16 (0x1F << 15) -#define ADC_SQR1_SQ15 (0x1F << 10) -#define ADC_SQR1_SQ14 (0x1F << 5) -#define ADC_SQR1_SQ13 0x1F - -/* Regular sequence register 2 */ - -#define ADC_SQR2_SQ12 (0x1F << 25) -#define ADC_SQR2_SQ11 (0x1F << 20) -#define ADC_SQR2_SQ10 (0x1F << 16) -#define ADC_SQR2_SQ9 (0x1F << 10) -#define ADC_SQR2_SQ8 (0x1F << 5) -#define ADC_SQR2_SQ7 0x1F - -/* Regular sequence register 3 */ - -#define ADC_SQR3_SQ6 (0x1F << 25) -#define ADC_SQR3_SQ5 (0x1F << 20) -#define ADC_SQR3_SQ4 (0x1F << 16) -#define ADC_SQR3_SQ3 (0x1F << 10) -#define ADC_SQR3_SQ2 (0x1F << 5) -#define ADC_SQR3_SQ1 0x1F - -/* Injected sequence register */ - -#define ADC_JSQR_JL (0x3 << 20) -#define ADC_JSQR_JL_1CONV (0x0 << 20) -#define ADC_JSQR_JL_2CONV (0x1 << 20) -#define ADC_JSQR_JL_3CONV (0x2 << 20) -#define ADC_JSQR_JL_4CONV (0x3 << 20) -#define ADC_JSQR_JSQ4 (0x1F << 15) -#define ADC_JSQR_JSQ3 (0x1F << 10) -#define ADC_JSQR_JSQ2 (0x1F << 5) -#define ADC_JSQR_JSQ1 0x1F - -/* Injected data registers */ - -#define ADC_JDR_JDATA 0xFFFF - -/* Regular data register */ - -#define ADC_DR_ADC2DATA (0xFFFF << 16) -#define ADC_DR_DATA 0xFFFF - -void adc_init(const adc_dev *dev); - -/** - * @brief External event selector for regular group conversion. - * @see adc_set_extsel - */ -typedef enum adc_extsel_event { - ADC_ADC12_TIM1_CC1 = (0 << 17), // ADC1 and ADC2: Timer 1 CC1 event - ADC_ADC12_TIM1_CC2 = (1 << 17), // ADC1 and ADC2: Timer 1 CC2 event - ADC_ADC12_TIM1_CC3 = (2 << 17), // ADC1 and ADC2: Timer 1 CC3 event - ADC_ADC12_TIM2_CC2 = (3 << 17), // ADC1 and ADC2: Timer 2 CC2 event - ADC_ADC12_TIM3_TRGO = (4 << 17), // ADC1 and ADC2: Timer 3 TRGO event - ADC_ADC12_TIM4_CC4 = (5 << 17), // ADC1 and ADC2: Timer 4 CC4 event - ADC_ADC12_EXTI11 = (6 << 17), // ADC1 and ADC2: EXTI11 event - ADC_ADC12_TIM8_TRGO = (6 << 17), // ADC1 and ADC2: Timer 8 TRGO event - ADC_ADC12_SWSTART = (7 << 17), // ADC1 and ADC2: Software start - - ADC_ADC3_TIM3_CC1 = (0 << 17), // ADC3: Timer 3 CC1 event - ADC_ADC3_TIM2_CC3 = (1 << 17), // ADC3: Timer 2 CC3 event - ADC_ADC3_TIM1_CC3 = (2 << 17), // ADC3: Timer 1 CC3 event - ADC_ADC3_TIM8_CC1 = (3 << 17), // ADC3: Timer 8 CC1 event - ADC_ADC3_TIM8_TRGO = (4 << 17), // ADC3: Timer 8 TRGO event - ADC_ADC3_TIM5_CC1 = (5 << 17), // ADC3: Timer 5 CC1 event - ADC_ADC3_TIM5_CC3 = (6 << 17), // ADC3: Timer 5 CC3 event - ADC_ADC3_SWSTART = (7 << 17), // ADC3: Software start - - ADC_SWSTART = (7 << 17) // ADC1, ADC2, ADC3: Software start -} adc_extsel_event; - -void adc_set_extsel(const adc_dev *dev, adc_extsel_event event); - -void adc_foreach(void (*fn)(const adc_dev*)); - -/** - * @brief ADC sample times, in ADC clock cycles - * - * These control the amount of time spent sampling the input voltage. - */ -typedef enum { - ADC_SMPR_1_5, // 1.5 ADC cycles - ADC_SMPR_7_5, // 7.5 ADC cycles - ADC_SMPR_13_5, // 13.5 ADC cycles - ADC_SMPR_28_5, // 28.5 ADC cycles - ADC_SMPR_41_5, // 41.5 ADC cycles - ADC_SMPR_55_5, // 55.5 ADC cycles - ADC_SMPR_71_5, // 71.5 ADC cycles - ADC_SMPR_239_5 // 239.5 ADC cycles -} adc_smp_rate; - -void adc_set_sample_rate(const adc_dev *dev, adc_smp_rate smp_rate); - -void adc_calibrate(const adc_dev *dev); - -uint16 adc_read(const adc_dev *dev, uint8 channel); - -/** - * @brief Set the regular channel sequence length. - * - * Defines the total number of conversions in the regular channel - * conversion sequence. - * - * @param dev ADC device. - * @param length Regular channel sequence length, from 1 to 16. - */ -static inline void adc_set_reg_seqlen(const adc_dev *dev, uint8 length) -{ - uint32 tmp = dev->regs->SQR1; - tmp &= ~ADC_SQR1_L; - tmp |= (length - 1) << 20; - dev->regs->SQR1 = tmp; -} - -/** - * @brief Set external trigger conversion mode event for regular channels - * @param dev ADC device - * @param enable If 1, conversion on external events is enabled; if 0, - * disabled. - */ -static inline void adc_set_exttrig(const adc_dev *dev, uint8 enable) -{ - *bb_perip(&dev->regs->CR2, ADC_CR2_EXTTRIG_BIT) = !!enable; -} - -/** - * @brief Enable an adc peripheral - * @param dev ADC device to enable - */ -static inline void adc_enable(const adc_dev *dev) -{ - *bb_perip(&dev->regs->CR2, ADC_CR2_ADON_BIT) = 1; -} - -/** - * @brief Disable an ADC peripheral - * @param dev ADC device to disable - */ -static inline void adc_disable(const adc_dev *dev) -{ - *bb_perip(&dev->regs->CR2, ADC_CR2_ADON_BIT) = 0; -} - -/** - * @brief Disable all ADC peripherals. - */ -static inline void adc_disable_all(void) -{ - adc_foreach(adc_disable); -} - -void setupADC(); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/avr/dtostrf.c b/cores/arduino/avr/dtostrf.c old mode 100755 new mode 100644 index 7f90154..1012ecd --- a/cores/arduino/avr/dtostrf.c +++ b/cores/arduino/avr/dtostrf.c @@ -1,7 +1,7 @@ /* dtostrf - Emulation for dtostrf function from avr-libc Copyright (c) 2013 Arduino. All rights reserved. - Written by Cristian Maglie + Written by Cristian Maglie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,9 +21,43 @@ #include char *dtostrf (double val, signed char width, unsigned char prec, char *sout) { - char fmt[20]; + //Commented code is the original version + /*char fmt[20]; sprintf(fmt, "%%%d.%df", width, prec); sprintf(sout, fmt, val); + return sout;*/ + + // Handle negative numbers + unsigned int negative = 0; + if (val < 0.0) + { + negative = 1; + val = -val; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (int i=0; i + Written by Cristian Maglie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/cores/arduino/avr/pgmspace.h b/cores/arduino/avr/pgmspace.h old mode 100755 new mode 100644 index 9b344c9..1a88e30 --- a/cores/arduino/avr/pgmspace.h +++ b/cores/arduino/avr/pgmspace.h @@ -1,3 +1,29 @@ +/* + pgmspace.h - Definitions for compatibility with AVR pgmspace macros + + Copyright (c) 2015 Arduino LLC + + Based on work of Paul Stoffregen on Teensy 3 (http://pjrc.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE +*/ + #ifndef __PGMSPACE_H_ #define __PGMSPACE_H_ 1 diff --git a/cores/arduino/binary.h b/cores/arduino/binary.h new file mode 100644 index 0000000..aec4c73 --- /dev/null +++ b/cores/arduino/binary.h @@ -0,0 +1,534 @@ +/* + binary.h - Definitions for binary constants + Copyright (c) 2006 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Binary_h +#define Binary_h + +#define B0 0 +#define B00 0 +#define B000 0 +#define B0000 0 +#define B00000 0 +#define B000000 0 +#define B0000000 0 +#define B00000000 0 +#define B1 1 +#define B01 1 +#define B001 1 +#define B0001 1 +#define B00001 1 +#define B000001 1 +#define B0000001 1 +#define B00000001 1 +#define B10 2 +#define B010 2 +#define B0010 2 +#define B00010 2 +#define B000010 2 +#define B0000010 2 +#define B00000010 2 +#define B11 3 +#define B011 3 +#define B0011 3 +#define B00011 3 +#define B000011 3 +#define B0000011 3 +#define B00000011 3 +#define B100 4 +#define B0100 4 +#define B00100 4 +#define B000100 4 +#define B0000100 4 +#define B00000100 4 +#define B101 5 +#define B0101 5 +#define B00101 5 +#define B000101 5 +#define B0000101 5 +#define B00000101 5 +#define B110 6 +#define B0110 6 +#define B00110 6 +#define B000110 6 +#define B0000110 6 +#define B00000110 6 +#define B111 7 +#define B0111 7 +#define B00111 7 +#define B000111 7 +#define B0000111 7 +#define B00000111 7 +#define B1000 8 +#define B01000 8 +#define B001000 8 +#define B0001000 8 +#define B00001000 8 +#define B1001 9 +#define B01001 9 +#define B001001 9 +#define B0001001 9 +#define B00001001 9 +#define B1010 10 +#define B01010 10 +#define B001010 10 +#define B0001010 10 +#define B00001010 10 +#define B1011 11 +#define B01011 11 +#define B001011 11 +#define B0001011 11 +#define B00001011 11 +#define B1100 12 +#define B01100 12 +#define B001100 12 +#define B0001100 12 +#define B00001100 12 +#define B1101 13 +#define B01101 13 +#define B001101 13 +#define B0001101 13 +#define B00001101 13 +#define B1110 14 +#define B01110 14 +#define B001110 14 +#define B0001110 14 +#define B00001110 14 +#define B1111 15 +#define B01111 15 +#define B001111 15 +#define B0001111 15 +#define B00001111 15 +#define B10000 16 +#define B010000 16 +#define B0010000 16 +#define B00010000 16 +#define B10001 17 +#define B010001 17 +#define B0010001 17 +#define B00010001 17 +#define B10010 18 +#define B010010 18 +#define B0010010 18 +#define B00010010 18 +#define B10011 19 +#define B010011 19 +#define B0010011 19 +#define B00010011 19 +#define B10100 20 +#define B010100 20 +#define B0010100 20 +#define B00010100 20 +#define B10101 21 +#define B010101 21 +#define B0010101 21 +#define B00010101 21 +#define B10110 22 +#define B010110 22 +#define B0010110 22 +#define B00010110 22 +#define B10111 23 +#define B010111 23 +#define B0010111 23 +#define B00010111 23 +#define B11000 24 +#define B011000 24 +#define B0011000 24 +#define B00011000 24 +#define B11001 25 +#define B011001 25 +#define B0011001 25 +#define B00011001 25 +#define B11010 26 +#define B011010 26 +#define B0011010 26 +#define B00011010 26 +#define B11011 27 +#define B011011 27 +#define B0011011 27 +#define B00011011 27 +#define B11100 28 +#define B011100 28 +#define B0011100 28 +#define B00011100 28 +#define B11101 29 +#define B011101 29 +#define B0011101 29 +#define B00011101 29 +#define B11110 30 +#define B011110 30 +#define B0011110 30 +#define B00011110 30 +#define B11111 31 +#define B011111 31 +#define B0011111 31 +#define B00011111 31 +#define B100000 32 +#define B0100000 32 +#define B00100000 32 +#define B100001 33 +#define B0100001 33 +#define B00100001 33 +#define B100010 34 +#define B0100010 34 +#define B00100010 34 +#define B100011 35 +#define B0100011 35 +#define B00100011 35 +#define B100100 36 +#define B0100100 36 +#define B00100100 36 +#define B100101 37 +#define B0100101 37 +#define B00100101 37 +#define B100110 38 +#define B0100110 38 +#define B00100110 38 +#define B100111 39 +#define B0100111 39 +#define B00100111 39 +#define B101000 40 +#define B0101000 40 +#define B00101000 40 +#define B101001 41 +#define B0101001 41 +#define B00101001 41 +#define B101010 42 +#define B0101010 42 +#define B00101010 42 +#define B101011 43 +#define B0101011 43 +#define B00101011 43 +#define B101100 44 +#define B0101100 44 +#define B00101100 44 +#define B101101 45 +#define B0101101 45 +#define B00101101 45 +#define B101110 46 +#define B0101110 46 +#define B00101110 46 +#define B101111 47 +#define B0101111 47 +#define B00101111 47 +#define B110000 48 +#define B0110000 48 +#define B00110000 48 +#define B110001 49 +#define B0110001 49 +#define B00110001 49 +#define B110010 50 +#define B0110010 50 +#define B00110010 50 +#define B110011 51 +#define B0110011 51 +#define B00110011 51 +#define B110100 52 +#define B0110100 52 +#define B00110100 52 +#define B110101 53 +#define B0110101 53 +#define B00110101 53 +#define B110110 54 +#define B0110110 54 +#define B00110110 54 +#define B110111 55 +#define B0110111 55 +#define B00110111 55 +#define B111000 56 +#define B0111000 56 +#define B00111000 56 +#define B111001 57 +#define B0111001 57 +#define B00111001 57 +#define B111010 58 +#define B0111010 58 +#define B00111010 58 +#define B111011 59 +#define B0111011 59 +#define B00111011 59 +#define B111100 60 +#define B0111100 60 +#define B00111100 60 +#define B111101 61 +#define B0111101 61 +#define B00111101 61 +#define B111110 62 +#define B0111110 62 +#define B00111110 62 +#define B111111 63 +#define B0111111 63 +#define B00111111 63 +#define B1000000 64 +#define B01000000 64 +#define B1000001 65 +#define B01000001 65 +#define B1000010 66 +#define B01000010 66 +#define B1000011 67 +#define B01000011 67 +#define B1000100 68 +#define B01000100 68 +#define B1000101 69 +#define B01000101 69 +#define B1000110 70 +#define B01000110 70 +#define B1000111 71 +#define B01000111 71 +#define B1001000 72 +#define B01001000 72 +#define B1001001 73 +#define B01001001 73 +#define B1001010 74 +#define B01001010 74 +#define B1001011 75 +#define B01001011 75 +#define B1001100 76 +#define B01001100 76 +#define B1001101 77 +#define B01001101 77 +#define B1001110 78 +#define B01001110 78 +#define B1001111 79 +#define B01001111 79 +#define B1010000 80 +#define B01010000 80 +#define B1010001 81 +#define B01010001 81 +#define B1010010 82 +#define B01010010 82 +#define B1010011 83 +#define B01010011 83 +#define B1010100 84 +#define B01010100 84 +#define B1010101 85 +#define B01010101 85 +#define B1010110 86 +#define B01010110 86 +#define B1010111 87 +#define B01010111 87 +#define B1011000 88 +#define B01011000 88 +#define B1011001 89 +#define B01011001 89 +#define B1011010 90 +#define B01011010 90 +#define B1011011 91 +#define B01011011 91 +#define B1011100 92 +#define B01011100 92 +#define B1011101 93 +#define B01011101 93 +#define B1011110 94 +#define B01011110 94 +#define B1011111 95 +#define B01011111 95 +#define B1100000 96 +#define B01100000 96 +#define B1100001 97 +#define B01100001 97 +#define B1100010 98 +#define B01100010 98 +#define B1100011 99 +#define B01100011 99 +#define B1100100 100 +#define B01100100 100 +#define B1100101 101 +#define B01100101 101 +#define B1100110 102 +#define B01100110 102 +#define B1100111 103 +#define B01100111 103 +#define B1101000 104 +#define B01101000 104 +#define B1101001 105 +#define B01101001 105 +#define B1101010 106 +#define B01101010 106 +#define B1101011 107 +#define B01101011 107 +#define B1101100 108 +#define B01101100 108 +#define B1101101 109 +#define B01101101 109 +#define B1101110 110 +#define B01101110 110 +#define B1101111 111 +#define B01101111 111 +#define B1110000 112 +#define B01110000 112 +#define B1110001 113 +#define B01110001 113 +#define B1110010 114 +#define B01110010 114 +#define B1110011 115 +#define B01110011 115 +#define B1110100 116 +#define B01110100 116 +#define B1110101 117 +#define B01110101 117 +#define B1110110 118 +#define B01110110 118 +#define B1110111 119 +#define B01110111 119 +#define B1111000 120 +#define B01111000 120 +#define B1111001 121 +#define B01111001 121 +#define B1111010 122 +#define B01111010 122 +#define B1111011 123 +#define B01111011 123 +#define B1111100 124 +#define B01111100 124 +#define B1111101 125 +#define B01111101 125 +#define B1111110 126 +#define B01111110 126 +#define B1111111 127 +#define B01111111 127 +#define B10000000 128 +#define B10000001 129 +#define B10000010 130 +#define B10000011 131 +#define B10000100 132 +#define B10000101 133 +#define B10000110 134 +#define B10000111 135 +#define B10001000 136 +#define B10001001 137 +#define B10001010 138 +#define B10001011 139 +#define B10001100 140 +#define B10001101 141 +#define B10001110 142 +#define B10001111 143 +#define B10010000 144 +#define B10010001 145 +#define B10010010 146 +#define B10010011 147 +#define B10010100 148 +#define B10010101 149 +#define B10010110 150 +#define B10010111 151 +#define B10011000 152 +#define B10011001 153 +#define B10011010 154 +#define B10011011 155 +#define B10011100 156 +#define B10011101 157 +#define B10011110 158 +#define B10011111 159 +#define B10100000 160 +#define B10100001 161 +#define B10100010 162 +#define B10100011 163 +#define B10100100 164 +#define B10100101 165 +#define B10100110 166 +#define B10100111 167 +#define B10101000 168 +#define B10101001 169 +#define B10101010 170 +#define B10101011 171 +#define B10101100 172 +#define B10101101 173 +#define B10101110 174 +#define B10101111 175 +#define B10110000 176 +#define B10110001 177 +#define B10110010 178 +#define B10110011 179 +#define B10110100 180 +#define B10110101 181 +#define B10110110 182 +#define B10110111 183 +#define B10111000 184 +#define B10111001 185 +#define B10111010 186 +#define B10111011 187 +#define B10111100 188 +#define B10111101 189 +#define B10111110 190 +#define B10111111 191 +#define B11000000 192 +#define B11000001 193 +#define B11000010 194 +#define B11000011 195 +#define B11000100 196 +#define B11000101 197 +#define B11000110 198 +#define B11000111 199 +#define B11001000 200 +#define B11001001 201 +#define B11001010 202 +#define B11001011 203 +#define B11001100 204 +#define B11001101 205 +#define B11001110 206 +#define B11001111 207 +#define B11010000 208 +#define B11010001 209 +#define B11010010 210 +#define B11010011 211 +#define B11010100 212 +#define B11010101 213 +#define B11010110 214 +#define B11010111 215 +#define B11011000 216 +#define B11011001 217 +#define B11011010 218 +#define B11011011 219 +#define B11011100 220 +#define B11011101 221 +#define B11011110 222 +#define B11011111 223 +#define B11100000 224 +#define B11100001 225 +#define B11100010 226 +#define B11100011 227 +#define B11100100 228 +#define B11100101 229 +#define B11100110 230 +#define B11100111 231 +#define B11101000 232 +#define B11101001 233 +#define B11101010 234 +#define B11101011 235 +#define B11101100 236 +#define B11101101 237 +#define B11101110 238 +#define B11101111 239 +#define B11110000 240 +#define B11110001 241 +#define B11110010 242 +#define B11110011 243 +#define B11110100 244 +#define B11110101 245 +#define B11110110 246 +#define B11110111 247 +#define B11111000 248 +#define B11111001 249 +#define B11111010 250 +#define B11111011 251 +#define B11111100 252 +#define B11111101 253 +#define B11111110 254 +#define B11111111 255 + +#endif diff --git a/cores/arduino/bit_constants.h b/cores/arduino/bit_constants.h deleted file mode 100755 index 8accc6b..0000000 --- a/cores/arduino/bit_constants.h +++ /dev/null @@ -1,579 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief BIT[n] and binary literal defines, for Arduino - * compatibility. - */ - -#ifndef _BIT_CONSTANTS_H_ -#define _BIT_CONSTANTS_H_ - -#define BIT0 (1 << 0) -#define BIT1 (1 << 1) -#define BIT2 (1 << 2) -#define BIT3 (1 << 3) -#define BIT4 (1 << 4) -#define BIT5 (1 << 5) -#define BIT6 (1 << 6) -#define BIT7 (1 << 7) -#define BIT8 (1 << 8) -#define BIT9 (1 << 9) -#define BIT10 (1 << 10) -#define BIT11 (1 << 11) -#define BIT12 (1 << 12) -#define BIT13 (1 << 13) -#define BIT14 (1 << 14) -#define BIT15 (1 << 15) -#define BIT16 (1 << 16) -#define BIT17 (1 << 17) -#define BIT18 (1 << 18) -#define BIT19 (1 << 19) -#define BIT20 (1 << 20) -#define BIT21 (1 << 21) -#define BIT22 (1 << 22) -#define BIT23 (1 << 23) -#define BIT24 (1 << 24) -#define BIT25 (1 << 25) -#define BIT26 (1 << 26) -#define BIT27 (1 << 27) -#define BIT28 (1 << 28) -#define BIT29 (1 << 29) -#define BIT30 (1 << 30) -#define BIT31 (1 << 31) - -#define B0 0 -#define B00 0 -#define B000 0 -#define B0000 0 -#define B00000 0 -#define B000000 0 -#define B0000000 0 -#define B00000000 0 -#define B1 1 -#define B01 1 -#define B001 1 -#define B0001 1 -#define B00001 1 -#define B000001 1 -#define B0000001 1 -#define B00000001 1 -#define B10 2 -#define B010 2 -#define B0010 2 -#define B00010 2 -#define B000010 2 -#define B0000010 2 -#define B00000010 2 -#define B11 3 -#define B011 3 -#define B0011 3 -#define B00011 3 -#define B000011 3 -#define B0000011 3 -#define B00000011 3 -#define B100 4 -#define B0100 4 -#define B00100 4 -#define B000100 4 -#define B0000100 4 -#define B00000100 4 -#define B101 5 -#define B0101 5 -#define B00101 5 -#define B000101 5 -#define B0000101 5 -#define B00000101 5 -#define B110 6 -#define B0110 6 -#define B00110 6 -#define B000110 6 -#define B0000110 6 -#define B00000110 6 -#define B111 7 -#define B0111 7 -#define B00111 7 -#define B000111 7 -#define B0000111 7 -#define B00000111 7 -#define B1000 8 -#define B01000 8 -#define B001000 8 -#define B0001000 8 -#define B00001000 8 -#define B1001 9 -#define B01001 9 -#define B001001 9 -#define B0001001 9 -#define B00001001 9 -#define B1010 10 -#define B01010 10 -#define B001010 10 -#define B0001010 10 -#define B00001010 10 -#define B1011 11 -#define B01011 11 -#define B001011 11 -#define B0001011 11 -#define B00001011 11 -#define B1100 12 -#define B01100 12 -#define B001100 12 -#define B0001100 12 -#define B00001100 12 -#define B1101 13 -#define B01101 13 -#define B001101 13 -#define B0001101 13 -#define B00001101 13 -#define B1110 14 -#define B01110 14 -#define B001110 14 -#define B0001110 14 -#define B00001110 14 -#define B1111 15 -#define B01111 15 -#define B001111 15 -#define B0001111 15 -#define B00001111 15 -#define B10000 16 -#define B010000 16 -#define B0010000 16 -#define B00010000 16 -#define B10001 17 -#define B010001 17 -#define B0010001 17 -#define B00010001 17 -#define B10010 18 -#define B010010 18 -#define B0010010 18 -#define B00010010 18 -#define B10011 19 -#define B010011 19 -#define B0010011 19 -#define B00010011 19 -#define B10100 20 -#define B010100 20 -#define B0010100 20 -#define B00010100 20 -#define B10101 21 -#define B010101 21 -#define B0010101 21 -#define B00010101 21 -#define B10110 22 -#define B010110 22 -#define B0010110 22 -#define B00010110 22 -#define B10111 23 -#define B010111 23 -#define B0010111 23 -#define B00010111 23 -#define B11000 24 -#define B011000 24 -#define B0011000 24 -#define B00011000 24 -#define B11001 25 -#define B011001 25 -#define B0011001 25 -#define B00011001 25 -#define B11010 26 -#define B011010 26 -#define B0011010 26 -#define B00011010 26 -#define B11011 27 -#define B011011 27 -#define B0011011 27 -#define B00011011 27 -#define B11100 28 -#define B011100 28 -#define B0011100 28 -#define B00011100 28 -#define B11101 29 -#define B011101 29 -#define B0011101 29 -#define B00011101 29 -#define B11110 30 -#define B011110 30 -#define B0011110 30 -#define B00011110 30 -#define B11111 31 -#define B011111 31 -#define B0011111 31 -#define B00011111 31 -#define B100000 32 -#define B0100000 32 -#define B00100000 32 -#define B100001 33 -#define B0100001 33 -#define B00100001 33 -#define B100010 34 -#define B0100010 34 -#define B00100010 34 -#define B100011 35 -#define B0100011 35 -#define B00100011 35 -#define B100100 36 -#define B0100100 36 -#define B00100100 36 -#define B100101 37 -#define B0100101 37 -#define B00100101 37 -#define B100110 38 -#define B0100110 38 -#define B00100110 38 -#define B100111 39 -#define B0100111 39 -#define B00100111 39 -#define B101000 40 -#define B0101000 40 -#define B00101000 40 -#define B101001 41 -#define B0101001 41 -#define B00101001 41 -#define B101010 42 -#define B0101010 42 -#define B00101010 42 -#define B101011 43 -#define B0101011 43 -#define B00101011 43 -#define B101100 44 -#define B0101100 44 -#define B00101100 44 -#define B101101 45 -#define B0101101 45 -#define B00101101 45 -#define B101110 46 -#define B0101110 46 -#define B00101110 46 -#define B101111 47 -#define B0101111 47 -#define B00101111 47 -#define B110000 48 -#define B0110000 48 -#define B00110000 48 -#define B110001 49 -#define B0110001 49 -#define B00110001 49 -#define B110010 50 -#define B0110010 50 -#define B00110010 50 -#define B110011 51 -#define B0110011 51 -#define B00110011 51 -#define B110100 52 -#define B0110100 52 -#define B00110100 52 -#define B110101 53 -#define B0110101 53 -#define B00110101 53 -#define B110110 54 -#define B0110110 54 -#define B00110110 54 -#define B110111 55 -#define B0110111 55 -#define B00110111 55 -#define B111000 56 -#define B0111000 56 -#define B00111000 56 -#define B111001 57 -#define B0111001 57 -#define B00111001 57 -#define B111010 58 -#define B0111010 58 -#define B00111010 58 -#define B111011 59 -#define B0111011 59 -#define B00111011 59 -#define B111100 60 -#define B0111100 60 -#define B00111100 60 -#define B111101 61 -#define B0111101 61 -#define B00111101 61 -#define B111110 62 -#define B0111110 62 -#define B00111110 62 -#define B111111 63 -#define B0111111 63 -#define B00111111 63 -#define B1000000 64 -#define B01000000 64 -#define B1000001 65 -#define B01000001 65 -#define B1000010 66 -#define B01000010 66 -#define B1000011 67 -#define B01000011 67 -#define B1000100 68 -#define B01000100 68 -#define B1000101 69 -#define B01000101 69 -#define B1000110 70 -#define B01000110 70 -#define B1000111 71 -#define B01000111 71 -#define B1001000 72 -#define B01001000 72 -#define B1001001 73 -#define B01001001 73 -#define B1001010 74 -#define B01001010 74 -#define B1001011 75 -#define B01001011 75 -#define B1001100 76 -#define B01001100 76 -#define B1001101 77 -#define B01001101 77 -#define B1001110 78 -#define B01001110 78 -#define B1001111 79 -#define B01001111 79 -#define B1010000 80 -#define B01010000 80 -#define B1010001 81 -#define B01010001 81 -#define B1010010 82 -#define B01010010 82 -#define B1010011 83 -#define B01010011 83 -#define B1010100 84 -#define B01010100 84 -#define B1010101 85 -#define B01010101 85 -#define B1010110 86 -#define B01010110 86 -#define B1010111 87 -#define B01010111 87 -#define B1011000 88 -#define B01011000 88 -#define B1011001 89 -#define B01011001 89 -#define B1011010 90 -#define B01011010 90 -#define B1011011 91 -#define B01011011 91 -#define B1011100 92 -#define B01011100 92 -#define B1011101 93 -#define B01011101 93 -#define B1011110 94 -#define B01011110 94 -#define B1011111 95 -#define B01011111 95 -#define B1100000 96 -#define B01100000 96 -#define B1100001 97 -#define B01100001 97 -#define B1100010 98 -#define B01100010 98 -#define B1100011 99 -#define B01100011 99 -#define B1100100 100 -#define B01100100 100 -#define B1100101 101 -#define B01100101 101 -#define B1100110 102 -#define B01100110 102 -#define B1100111 103 -#define B01100111 103 -#define B1101000 104 -#define B01101000 104 -#define B1101001 105 -#define B01101001 105 -#define B1101010 106 -#define B01101010 106 -#define B1101011 107 -#define B01101011 107 -#define B1101100 108 -#define B01101100 108 -#define B1101101 109 -#define B01101101 109 -#define B1101110 110 -#define B01101110 110 -#define B1101111 111 -#define B01101111 111 -#define B1110000 112 -#define B01110000 112 -#define B1110001 113 -#define B01110001 113 -#define B1110010 114 -#define B01110010 114 -#define B1110011 115 -#define B01110011 115 -#define B1110100 116 -#define B01110100 116 -#define B1110101 117 -#define B01110101 117 -#define B1110110 118 -#define B01110110 118 -#define B1110111 119 -#define B01110111 119 -#define B1111000 120 -#define B01111000 120 -#define B1111001 121 -#define B01111001 121 -#define B1111010 122 -#define B01111010 122 -#define B1111011 123 -#define B01111011 123 -#define B1111100 124 -#define B01111100 124 -#define B1111101 125 -#define B01111101 125 -#define B1111110 126 -#define B01111110 126 -#define B1111111 127 -#define B01111111 127 -#define B10000000 128 -#define B10000001 129 -#define B10000010 130 -#define B10000011 131 -#define B10000100 132 -#define B10000101 133 -#define B10000110 134 -#define B10000111 135 -#define B10001000 136 -#define B10001001 137 -#define B10001010 138 -#define B10001011 139 -#define B10001100 140 -#define B10001101 141 -#define B10001110 142 -#define B10001111 143 -#define B10010000 144 -#define B10010001 145 -#define B10010010 146 -#define B10010011 147 -#define B10010100 148 -#define B10010101 149 -#define B10010110 150 -#define B10010111 151 -#define B10011000 152 -#define B10011001 153 -#define B10011010 154 -#define B10011011 155 -#define B10011100 156 -#define B10011101 157 -#define B10011110 158 -#define B10011111 159 -#define B10100000 160 -#define B10100001 161 -#define B10100010 162 -#define B10100011 163 -#define B10100100 164 -#define B10100101 165 -#define B10100110 166 -#define B10100111 167 -#define B10101000 168 -#define B10101001 169 -#define B10101010 170 -#define B10101011 171 -#define B10101100 172 -#define B10101101 173 -#define B10101110 174 -#define B10101111 175 -#define B10110000 176 -#define B10110001 177 -#define B10110010 178 -#define B10110011 179 -#define B10110100 180 -#define B10110101 181 -#define B10110110 182 -#define B10110111 183 -#define B10111000 184 -#define B10111001 185 -#define B10111010 186 -#define B10111011 187 -#define B10111100 188 -#define B10111101 189 -#define B10111110 190 -#define B10111111 191 -#define B11000000 192 -#define B11000001 193 -#define B11000010 194 -#define B11000011 195 -#define B11000100 196 -#define B11000101 197 -#define B11000110 198 -#define B11000111 199 -#define B11001000 200 -#define B11001001 201 -#define B11001010 202 -#define B11001011 203 -#define B11001100 204 -#define B11001101 205 -#define B11001110 206 -#define B11001111 207 -#define B11010000 208 -#define B11010001 209 -#define B11010010 210 -#define B11010011 211 -#define B11010100 212 -#define B11010101 213 -#define B11010110 214 -#define B11010111 215 -#define B11011000 216 -#define B11011001 217 -#define B11011010 218 -#define B11011011 219 -#define B11011100 220 -#define B11011101 221 -#define B11011110 222 -#define B11011111 223 -#define B11100000 224 -#define B11100001 225 -#define B11100010 226 -#define B11100011 227 -#define B11100100 228 -#define B11100101 229 -#define B11100110 230 -#define B11100111 231 -#define B11101000 232 -#define B11101001 233 -#define B11101010 234 -#define B11101011 235 -#define B11101100 236 -#define B11101101 237 -#define B11101110 238 -#define B11101111 239 -#define B11110000 240 -#define B11110001 241 -#define B11110010 242 -#define B11110011 243 -#define B11110100 244 -#define B11110101 245 -#define B11110110 246 -#define B11110111 247 -#define B11111000 248 -#define B11111001 249 -#define B11111010 250 -#define B11111011 251 -#define B11111100 252 -#define B11111101 253 -#define B11111110 254 -#define B11111111 255 - -#endif /* _BIT_CONSTANTS_H_ */ diff --git a/cores/arduino/bitband.h b/cores/arduino/bitband.h deleted file mode 100755 index 40e17da..0000000 --- a/cores/arduino/bitband.h +++ /dev/null @@ -1,128 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file bitband.h - * - * @brief Bit-banding utility functions - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#include "types.h" - -#ifndef _BITBAND_H_ -#define _BITBAND_H_ - -#define BB_SRAM_REF 0x20000000 -#define BB_SRAM_BASE 0x22000000 -#define BB_PERI_REF 0x40000000 -#define BB_PERI_BASE 0x42000000 - -static inline volatile uint32* __bb_addr(volatile void*, - uint32, - uint32, - uint32); - -/** - * @brief Obtain a pointer to the bit-band address corresponding to a - * bit in a volatile SRAM address. - * @param address Address in the bit-banded SRAM region - * @param bit Bit in address to bit-band - */ -static inline volatile uint32* bb_sramp(volatile void *address, uint32 bit) { - return __bb_addr(address, bit, BB_SRAM_BASE, BB_SRAM_REF); -} - -/** - * @brief Get a bit from an address in the SRAM bit-band region. - * @param address Address in the SRAM bit-band region to read from - * @param bit Bit in address to read - * @return bit's value in address. - */ -static inline uint8 bb_sram_get_bit(volatile void *address, uint32 bit) { - return *bb_sramp(address, bit); -} - -/** - * @brief Set a bit in an address in the SRAM bit-band region. - * @param address Address in the SRAM bit-band region to write to - * @param bit Bit in address to write to - * @param val Value to write for bit, either 0 or 1. - */ -static inline void bb_sram_set_bit(volatile void *address, - uint32 bit, - uint8 val) { - *bb_sramp(address, bit) = val; -} - -/** - * @brief Obtain a pointer to the bit-band address corresponding to a - * bit in a peripheral address. - * @param address Address in the bit-banded peripheral region - * @param bit Bit in address to bit-band - */ -static inline volatile uint32* bb_perip(volatile void *address, uint32 bit) { - return __bb_addr(address, bit, BB_PERI_BASE, BB_PERI_REF); -} - -/** - * @brief Get a bit from an address in the peripheral bit-band region. - * @param address Address in the peripheral bit-band region to read from - * @param bit Bit in address to read - * @return bit's value in address. - */ -static inline uint8 bb_peri_get_bit(volatile void *address, uint32 bit) { - return *bb_perip(address, bit); -} - -/** - * @brief Set a bit in an address in the peripheral bit-band region. - * @param address Address in the peripheral bit-band region to write to - * @param bit Bit in address to write to - * @param val Value to write for bit, either 0 or 1. - */ -static inline void bb_peri_set_bit(volatile void *address, - uint32 bit, - uint8 val) { - *bb_perip(address, bit) = val; -} - -static inline volatile uint32* __bb_addr(volatile void *address, - uint32 bit, - uint32 bb_base, - uint32 bb_ref) { - return (volatile uint32*)(bb_base + ((uint32)address - bb_ref) * 32 + - bit * 4); -} - -#endif /* _BITBAND_H_ */ diff --git a/cores/arduino/bits.h b/cores/arduino/bits.h deleted file mode 100755 index 3e755b7..0000000 --- a/cores/arduino/bits.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* Note: Use of this header file is deprecated. Use bit_constants.h - instead. */ - -#include "bit_constants.h" diff --git a/cores/arduino/boards.cpp b/cores/arduino/boards.cpp deleted file mode 100755 index adb64c9..0000000 --- a/cores/arduino/boards.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Generic board initialization routines. - * - * By default, we bring up all Maple boards to 72MHz, clocked off the - * PLL, driven by the 8MHz external crystal. AHB and APB2 are clocked - * at 72MHz. APB1 is clocked at 36MHz. - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#include "boards.h" - -#include "flash.h" -#include "rcc.h" -#include "nvic.h" -#include "systick.h" -#include "gpio.h" -#include "adc.h" -#include "timer.h" - -extern "C" {void enterSysROM(void);} - -static void setupFlash(void); -static void setupClocks(void); -static void setupNVIC(void); -static void startADC(void); -static void setupTimers(void); - -extern "C" {void enterSysROM(void);} - -void init(void) { - /* Check if we are coming from a DFU enter request (see usbd_cdc_if.c) - * This MUST be done before any other board configuration - */ - - /* Check if we are coming from a DFU enter request (see usbd_cdc_if.c) */ - - if(*((unsigned int*)0x2004FFF0) == 0xb311a21a) { - *((unsigned int*)0x2004FFF0) = 0; - enterSysROM(); - } - - setupFlash(); - setupClocks(); - setupNVIC(); - systick_init(SYSTICK_RELOAD_VAL); - gpio_init_all(); - rcc_clk_enable(RCC_SYSCFG); - //boardInit(); - startADC(); - setupTimers(); - HAL_Init(); -} - -/* You could farm this out to the files in boards/ if e.g. it takes - * too long to test on Maple Native (all those FSMC pins...). */ -bool boardUsesPin(uint8 pin) { - for (int i = 0; i < BOARD_NR_USED_PINS; i++) { - if (pin == boardUsedPins[i]) { - return true; - } - } - return false; -} - -static void setupFlash(void) { - // do nothing -} - -/* - * Clock setup. Note that some of this only takes effect if we're - * running bare metal and the bootloader hasn't done it for us - * already. - * - * If you change this function, you MUST change the file-level Doxygen - * comment above. - */ -static void setupClocks() { - rcc_clk_init(RCC_CLKSRC_PLL, RCC_PLLSRC_HSE, RCC_PLLMUL_9); - rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); - rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); - rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); -} - -static void setupNVIC() { -#ifdef VECT_TAB_FLASH - nvic_init(USER_ADDR_ROM, 0); -#elif defined VECT_TAB_RAM - nvic_init(USER_ADDR_RAM, 0); -#elif defined VECT_TAB_BASE - nvic_init((uint32)0x08000000, 0); -#else -#error "You must select a base address for the vector table." -#endif -} - -static void adcDefaultConfig(const adc_dev* dev); - -static void startADC() { - setupADC(); - adc_foreach(adcDefaultConfig); -} - -static void timerDefaultConfig(timer_dev*); - -static void setupTimers() { - timer_foreach(timerDefaultConfig); -} - -static void adcDefaultConfig(const adc_dev *dev) { - adc_init(dev); - - adc_set_extsel(dev, ADC_SWSTART); - adc_set_exttrig(dev, true); - - adc_enable(dev); - adc_calibrate(dev); - adc_set_sample_rate(dev, ADC_SMPR_55_5); -} - -static void timerDefaultConfig(timer_dev *dev) { - timer_adv_reg_map *regs = (dev->regs).adv; - const uint16 full_overflow = 0xFFFF; - const uint16 half_duty = 0x8FFF; - - timer_init(dev); - timer_pause(dev); - - regs->CR1 = TIMER_CR1_ARPE; - regs->PSC = 1; - regs->SR = 0; - regs->DIER = 0; - regs->EGR = TIMER_EGR_UG; - - switch (dev->type) { - case TIMER_ADVANCED: - regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; - // fall-through - case TIMER_GENERAL: - timer_set_reload(dev, full_overflow); - for (int channel = 1; channel <= 4; channel++) { - timer_set_compare(dev, channel, half_duty); - timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_2, TIMER_OC_PE); - } - // fall-through - case TIMER_BASIC: - break; - } - - timer_resume(dev); -} diff --git a/cores/arduino/boards.h b/cores/arduino/boards.h deleted file mode 100755 index 1b74211..0000000 --- a/cores/arduino/boards.h +++ /dev/null @@ -1,154 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file boards.h - * @author Bryan Newbold , - * Marti Bolivar - * @brief Board-specific pin information. - * - * To add a new board type, add a new pair of files to - * /wirish/boards/, update the section below with a new "BOARD" type, - * and update /wirish/rules.mk to include your boards/your_board.cpp - * file in the top-level Makefile build. - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#ifndef _BOARDS_H_ -#define _BOARDS_H_ - -#include "memory.h" -#include "gpio.h" -#include "timer.h" -#include "wiring_types.h" -#include "variant.h" - -/* Set of all possible pin names; not all boards have all these (note - * that we use the Dx convention since all of the Maple's pins are - * "digital" pins (e.g. can be used with digitalRead() and - * digitalWrite()), but not all of them are connected to ADCs. */ -enum { - D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, - D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, - D32, D33, D34, D35, D36, D37, D38, D39, D40, D41, D42, D43, D44, D45, D46, - D47, D48, D49, D50, D51, D52, D53, D54, D55, D56, D57, D58, D59, D60, D61, - D62, D63, D64, D65, D66, D67, D68, D69, D70, D71, D72, D73, D74, D75, D76, - D77, D78, D79, D80, D81}; - -/** - * @brief Maps each pin to a corresponding stm32_pin_info. - * @see stm32_pin_info - */ -extern const stm32_pin_info PIN_MAP[]; - -/** - * @brief Pins capable of PWM output. - * - * Its length is BOARD_NR_PWM_PINS. - */ -extern const uint8 boardPWMPins[]; - -/** - * @brief Array of pins capable of analog input. - * - * Its length is BOARD_NR_ADC_PINS. - */ -extern const uint8 boardADCPins[]; - -/** - * @brief Pins which are connected to external hardware. - * - * For example, on Maple boards, it always at least includes - * BOARD_LED_PIN. Its length is BOARD_NR_USED_PINS. - */ -extern const uint8 boardUsedPins[]; - -/** - * @brief Generic board initialization function. - * - * This function is called before main(). It ensures that the clocks - * and peripherals are configured properly for use with wirish, then - * calls boardInit(). - * - * @see boardInit() - */ -void init(void); - -/** - * @brief Board-specific initialization function. - * - * This function is called from init() after all generic board - * initialization has been performed. Each board is required to - * define its own. - * - * @see init() - */ -//extern void boardInit(void); // alfran: commented to new pin management - -/** - * @brief Test if a pin is used for a special purpose on your board. - * @param pin Pin to test - * @return true if the given pin is in boardUsedPins, and false otherwise. - * @see boardUsedPins - */ -bool boardUsesPin(uint8 pin); - -/* Include the appropriate private header from boards/: */ - -/* FIXME HACK put boards/ before these paths once IDE uses make. */ - - -/* - * **NOT** MAPLE REV6. This the **Maple RET6 EDITION**, which is a - * Maple with an STM32F103RET6 (...RET6) instead of an STM32F103RBT6 - * (...RBT6) on it. Maple Rev6 (as of March 2011) DOES NOT EXIST. - */ - -/* - * TODO turn this into a warning so people can: - * - * #include "my_board_config.h" - * #include "wiring.h" - * - * This will enable third-party board support without requiring that - * anybody hack around in libmaple itself. - */ -// #error "Board type has not been selected correctly." -// #endif - -/* Set derived definitions */ - -#define CLOCK_SPEED_MHZ CYCLES_PER_MICROSECOND -#define CLOCK_SPEED_HZ (CLOCK_SPEED_MHZ * 1000000UL) - -#endif diff --git a/cores/arduino/chip.h b/cores/arduino/chip.h new file mode 100644 index 0000000..df828d9 --- /dev/null +++ b/cores/arduino/chip.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _CHIP_H_ +#define _CHIP_H_ + +/* + * Core and peripherals registers definitions + */ +#include "hw_config.h" +#include "digital_io.h" +#include "clock.h" +#include "hal_uart_emul.h" +#include "uart.h" +#include "uart_emul.h" +#include "analog.h" +#include "interrupt.h" +#include "spi_com.h" +#include "timer.h" +#include "twi.h" +#include "stm32_eeprom.h" +#ifdef USBCON +#include "usb_interface.h" +#endif //USBCON + +/* Define attribute */ +#if defined ( __GNUC__ ) /* GCC CS3 */ + #define WEAK __attribute__ ((weak)) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ + #define WEAK __weak +#endif + +/* Define NO_INIT attribute */ +#if defined ( __GNUC__ ) + #define NO_INIT +#elif defined ( __ICCARM__ ) + #define NO_INIT __no_init +#endif + +/* + * Peripherals + */ + + +#endif /* _CHIP_H_ */ diff --git a/cores/arduino/cxxabi-compat.cpp b/cores/arduino/cxxabi-compat.cpp deleted file mode 100755 index 516b112..0000000 --- a/cores/arduino/cxxabi-compat.cpp +++ /dev/null @@ -1,6 +0,0 @@ -/* We compile with nodefaultlibs, so we need to provide an error - * handler for an empty pure virtual function */ -extern "C" void __cxa_pure_virtual(void) { - while(1) - ; -} diff --git a/cores/arduino/dac.c b/cores/arduino/dac.c deleted file mode 100755 index 2a242c2..0000000 --- a/cores/arduino/dac.c +++ /dev/null @@ -1,159 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dac.c - * @brief Digital to analog converter support. - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - - -#include "memory.h" -#include "gpio.h" -#include "dac.h" - -/** - * @brief DAC peripheral routines. - */ -/* DAC device */ -dac_dev dac = { - .regs = DAC_BASE, -}; -const dac_dev *DAC_dev = &dac; - -/** - * @brief Initialize the digital to analog converter - * @param dev DAC device - * @param flags Flags: - * DAC_CH1: Enable channel 1 - * DAC_CH2: Enable channel 2 - */ -void dac_init(const dac_dev *dev, uint32 flags) { - /* First turn on the clock */ - rcc_clk_enable(RCC_DAC); - rcc_reset_dev(RCC_DAC); - - if (flags & DAC_CH1) { - dac_enable_channel(dev, 1); - } - - if (flags & DAC_CH2) { - dac_enable_channel(dev, 2); - } -} - -/** - * @brief Initialize the output buffer of the digital to analog converter - * @param dev DAC device - * @param flags Flags: - * DAC_CH1: Select channel 1 - * DAC_CH2: Select channel 2 - * @param status Status: - * 1: enable buffer - * 0: disable buffer - */ -void dac_enable_buffer(const dac_dev *dev, uint32 flags, int status) { - if (flags & DAC_CH1) { - if(status) { - dev->regs->CR &= ~DAC_CR_BOFF1; - } - else { - dev->regs->CR |= DAC_CR_BOFF1; - } - } - - if (flags & DAC_CH2) { - if(status) { - dev->regs->CR &= ~DAC_CR_BOFF2; - } - else { - dev->regs->CR |= DAC_CR_BOFF2; - } - } -} - - -/** - * @brief Write a 12-bit value to the DAC to output - * @param dev DAC device - * @param channel channel to select (1 or 2) - * @param val value to write - */ -void dac_write_channel(const dac_dev *dev, uint8 channel, uint16 val) { - switch(channel) { - case 1: - dev->regs->DHR12R1 = DAC_DHR12R1_DACC1DHR & val; - break; - case 2: - dev->regs->DHR12R2 = DAC_DHR12R2_DACC2DHR & val; - break; - } -} - -/** - * @brief Enable a DAC channel - * @param dev DAC device - * @param channel channel to enable, either 1 or 2 - */ -void dac_enable_channel(const dac_dev *dev, uint8 channel) { - /* - * Setup ANALOG mode on PA4 and PA5. This mapping is consistent across - * all STM32 chips with a DAC. See RM0008 12.2. - */ - switch (channel) { - case 1: - gpio_set_mode(GPIOB_dev, 7, GPIO_INPUT_ANALOG); - dev->regs->CR |= DAC_CR_EN1; - break; - case 2: - gpio_set_mode(GPIOB_dev, 6, GPIO_INPUT_ANALOG); - dev->regs->CR |= DAC_CR_EN2; - break; - } -} - -/** - * @brief Disable a DAC channel - * @param dev DAC device - * @param channel channel to disable, either 1 or 2 - */ -void dac_disable_channel(const dac_dev *dev, uint8 channel) { - switch (channel) { - case 1: - dev->regs->CR &= ~DAC_CR_EN1; - break; - case 2: - dev->regs->CR &= ~DAC_CR_EN2; - break; - } -} diff --git a/cores/arduino/dac.h b/cores/arduino/dac.h deleted file mode 100755 index 83f69c7..0000000 --- a/cores/arduino/dac.h +++ /dev/null @@ -1,169 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dac.h - * @brief Digital to analog converter support. - */ - -/* See notes/dac.txt for more info */ - -#ifndef _DAC_H_ -#define _DAC_H_ - -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** DAC register map. */ -typedef struct dac_reg_map { - __io uint32 CR; /**< Control register */ - __io uint32 SWTRIGR; /**< Software trigger register */ - __io uint32 DHR12R1; /**< Channel 1 12-bit right-aligned data - holding register */ - __io uint32 DHR12L1; /**< Channel 1 12-bit left-aligned data - holding register */ - __io uint32 DHR8R1; /**< Channel 1 8-bit left-aligned data - holding register */ - __io uint32 DHR12R2; /**< Channel 2 12-bit right-aligned data - holding register */ - __io uint32 DHR12L2; /**< Channel 2 12-bit left-aligned data - holding register */ - __io uint32 DHR8R2; /**< Channel 2 8-bit left-aligned data - holding register */ - __io uint32 DHR12RD; /**< Dual DAC 12-bit right-aligned data - holding register */ - __io uint32 DHR12LD; /**< Dual DAC 12-bit left-aligned data - holding register */ - __io uint32 DHR8RD; /**< Dual DAC 8-bit right-aligned data holding - register */ - __io uint32 DOR1; /**< Channel 1 data output register */ - __io uint32 DOR2; /**< Channel 2 data output register */ -} dac_reg_map; - -/** DAC register map base address */ -#define DAC_BASE ((struct dac_reg_map*)0x40007400) - -/* - * Devices - */ - -/** DAC device type. */ -typedef struct dac_dev { - dac_reg_map *regs; /**< Register map */ -} dac_dev; - -extern const dac_dev *DAC_dev; - -/* - * Register bit definitions - */ - -/* Control register */ -/* Channel 1 control */ -#define DAC_CR_EN1 BIT(0) /* Enable */ -#define DAC_CR_BOFF1 BIT(1) /* Output buffer disable */ -#define DAC_CR_TEN1 BIT(2) /* Trigger enable */ -#define DAC_CR_TSEL1 (0x7 << 3) /* Trigger selection */ -#define DAC_CR_WAVE1 (0x3 << 6) /* Noise/triangle wave enable */ -#define DAC_CR_MAMP1 (0xF << 8) /* Mask/amplitude selector */ -#define DAC_CR_DMAEN1 BIT(12) /* DMA enable */ -/* Channel 2 control */ -#define DAC_CR_EN2 BIT(16) /* Enable */ -#define DAC_CR_BOFF2 BIT(17) /* Output buffer disable */ -#define DAC_CR_TEN2 BIT(18) /* Trigger enable */ -#define DAC_CR_TSEL2 (0x7 << 19) /* Trigger selection */ -#define DAC_CR_WAVE2 (0x3 << 22) /* Noise/triangle wave generation*/ -#define DAC_CR_MAMP2 (0xF << 24) /* Mask/amplitude selector */ -#define DAC_CR_DMAEN2 BIT(28) /* DMA enable */ - -/* Software trigger register */ -#define DAC_SWTRIGR_SWTRIG1 BIT(0) /* Channel 1 software trigger */ -#define DAC_SWTRIGR_SWTRIG2 BIT(1) /* Channel 2 software trigger */ - -/* Channel 1 12-bit right-aligned data holding register */ -#define DAC_DHR12R1_DACC1DHR 0x00000FFF - -/* Channel 1 12-bit left-aligned data holding register */ -#define DAC_DHR12L1_DACC1DHR 0x0000FFF0 - -/* Channel 1 8-bit left-aligned data holding register */ -#define DAC_DHR8R1_DACC1DHR 0x000000FF - -/* Channel 2 12-bit right-aligned data holding register */ -#define DAC_DHR12R2_DACC2DHR 0x00000FFF - -/* Channel 2 12-bit left-aligned data holding register */ -#define DAC_DHR12L2_DACC2DHR 0x0000FFF0 - -/* Channel 2 8-bit left-aligned data holding register */ -#define DAC_DHR8R2_DACC2DHR 0x000000FF - -/* Dual DAC 12-bit right-aligned data holding register */ -#define DAC_DHR12RD_DACC1DHR 0x00000FFF -#define DAC_DHR12RD_DACC2DHR 0x0FFF0000 - -/* Dual DAC 12-bit left-aligned data holding register */ -#define DAC_DHR12LD_DACC1DHR 0x0000FFF0 -#define DAC_DHR12LD_DACC2DHR 0xFFF00000 - -/* Dual DAC 8-bit left-aligned data holding register */ -#define DAC_DHR8RD_DACC1DHR 0x000000FF -#define DAC_DHR8RD_DACC2DHR 0x0000FF00 - -/* Channel 1 data output register */ -#define DAC_DOR1_DACC1DOR 0x00000FFF - -/* Channel 1 data output register */ -#define DAC_DOR2_DACC2DOR 0x00000FFF - -/* - * Convenience functions - */ - -/* We take the dev argument in these convenience functions for - * future-proofing */ - -#define DAC_CH1 0x1 -#define DAC_CH2 0x2 -void dac_init(const dac_dev *dev, uint32 flags); - -void dac_write_channel(const dac_dev *dev, uint8 channel, uint16 val); -void dac_enable_channel(const dac_dev *dev, uint8 channel); -void dac_disable_channel(const dac_dev *dev, uint8 channel); -void dac_enable_buffer(const dac_dev *dev, uint32 flags, int status); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/delay.h b/cores/arduino/delay.h deleted file mode 100755 index 997ce6c..0000000 --- a/cores/arduino/delay.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (c) 2014 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/** - * @file delay.h - * @brief Delay implementation - */ - -#include "types.h" -#include "stm32.h" - -#ifndef _DELAY_H_ -#define _DELAY_H_ - -/** - * @brief Delay the given number of microseconds. - * - * @param us Number of microseconds to delay. - */ -static inline void delay_us(uint32 us) { - us *= STM32_DELAY_US_MULT; - - /* fudge for function call overhead */ - //us--; - asm volatile(" mov r0, %[us] \n\t" - "1: subs r0, #1 \n\t" - " bhi 1b \n\t" - : - : [us] "r" (us) - : "r0"); -} - -static inline void delay_ns100(uint32 us) { - us *= STM32_DELAY_US_MULT; - us /= 10; - - /* fudge for function call overhead */ - //us--; - asm volatile(" mov r0, %[us] \n\t" - "1: subs r0, #1 \n\t" - " bhi 1b \n\t" - : - : [us] "r" (us) - : "r0"); -} -#endif diff --git a/cores/arduino/dma.c b/cores/arduino/dma.c deleted file mode 100755 index 0ff77a9..0000000 --- a/cores/arduino/dma.c +++ /dev/null @@ -1,231 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dmaF2.c - * @brief Direct Memory Access peripheral support - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "dma.h" -#include "bitband.h" -#include "util.h" - -/** DMA controller register map base pointers */ -#define DMA1_BASE ((struct dma_reg_map*)0x40026000) -#define DMA2_BASE ((struct dma_reg_map*)0x40026400) - -/* - * Devices - */ - -/** DMA1 device */ -static dma_dev dma1 = { - .regs = DMA1_BASE, - .clk_id = RCC_DMA1, - .handlers = {{ .handler = NULL, .irq_line = 11 }, - { .handler = NULL, .irq_line = 12 }, - { .handler = NULL, .irq_line = 13 }, - { .handler = NULL, .irq_line = 14 }, - { .handler = NULL, .irq_line = 15 }, - { .handler = NULL, .irq_line = 16 }, - { .handler = NULL, .irq_line = 17 }, - { .handler = NULL, .irq_line = 47 }} -}; - -dma_dev *DMA1_dev = &dma1; - -/** DMA2 device */ -static dma_dev dma2 = { - .regs = DMA2_BASE, - .clk_id = RCC_DMA2, - .handlers = {{ .handler = NULL, .irq_line = 56 }, - { .handler = NULL, .irq_line = 57 }, - { .handler = NULL, .irq_line = 58 }, - { .handler = NULL, .irq_line = 59 }, - { .handler = NULL, .irq_line = 60 }, - { .handler = NULL, .irq_line = 68 }, - { .handler = NULL, .irq_line = 69 }, - { .handler = NULL, .irq_line = 70 }} /* !@#$ */ -}; - -dma_dev *DMA2_dev = &dma2; - -/* - * Convenience routines - */ - -/** - * @brief Initialize a DMA device. - * @param dev Device to initialize. - */ -void dma_init(dma_dev *dev) { - rcc_clk_enable(dev->clk_id); -} - -/** - * @brief Attach an interrupt to a DMA transfer. - * - * Interrupts are enabled using appropriate mode flags in - * dma_setup_transfer(). - * - * @param dev DMA device - * @param stream Stream to attach handler to - * @param handler Interrupt handler to call when channel interrupt fires. - * @see dma_setup_transfer() - * @see dma_detach_interrupt() - */ -void dma_attach_interrupt(dma_dev *dev, - dma_stream stream, - void (*handler)(void)) { - dev->handlers[stream].handler = handler; - nvic_irq_enable(dev->handlers[stream].irq_line); -} - -/** - * @brief Detach a DMA transfer interrupt handler. - * - * After calling this function, the given channel's interrupts will be - * disabled. - * - * @param dev DMA device - * @param stream Stream whose handler to detach - * @sideeffect Clears interrupt enable bits in the channel's CCR register. - * @see dma_attach_interrupt() - */ -void dma_detach_interrupt(dma_dev *dev, dma_stream stream) { - nvic_irq_disable(dev->handlers[stream].irq_line); - dev->handlers[stream].handler = NULL; -} - -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream) { - switch (stream) { - case 0: - dev->regs->LIFCR|=0x0000003d; - break; - case 1: - dev->regs->LIFCR|=0x00000f40; - break; - case 2: - dev->regs->LIFCR|=0x003d0000; - break; - case 3: - dev->regs->LIFCR|=0x0f400000; - break; - case 4: - dev->regs->HIFCR|=0x0000003d; - break; - case 5: - dev->regs->HIFCR|=0x00000f40; - break; - case 6: - dev->regs->HIFCR|=0x003d0000; - break; - case 7: - dev->regs->HIFCR|=0x0f400000; - break; - } -} - -/* - * IRQ handlers - */ - -static inline void dispatch_handler(dma_dev *dev, dma_stream stream) { - void (*handler)(void) = dev->handlers[stream].handler; - if (handler) { - handler(); - } - dma_clear_isr_bits(dev, stream); /* in case handler doesn't */ -} - -void __irq_dma1_channel1(void) { - dispatch_handler(DMA1_dev, DMA_STREAM0); -} - -void __irq_dma1_channel2(void) { - dispatch_handler(DMA1_dev, DMA_STREAM1); -} - -void __irq_dma1_channel3(void) { - dispatch_handler(DMA1_dev, DMA_STREAM2); -} - -void __irq_dma1_channel4(void) { - dispatch_handler(DMA1_dev, DMA_STREAM3); -} - -void __irq_dma1_channel5(void) { - dispatch_handler(DMA1_dev, DMA_STREAM4); -} - -void __irq_dma1_channel6(void) { - dispatch_handler(DMA1_dev, DMA_STREAM5); -} - -void __irq_dma1_channel7(void) { - dispatch_handler(DMA1_dev, DMA_STREAM6); -} - -void __irq_adc3(void) { - dispatch_handler(DMA1_dev, DMA_STREAM7); -} - -void __irq_dma2_channel1(void) { - dispatch_handler(DMA2_dev, DMA_STREAM0); -} - -void __irq_dma2_channel2(void) { - dispatch_handler(DMA2_dev, DMA_STREAM1); -} - -void __irq_dma2_channel3(void) { - dispatch_handler(DMA2_dev, DMA_STREAM2); -} - -void __irq_dma2_channel4_5(void) { - dispatch_handler(DMA2_dev, DMA_STREAM3); -} - -void __irq_DMA2_Stream4_IRQHandler(void) { - dispatch_handler(DMA2_dev, DMA_STREAM4); -} - -void __irq_DMA2_Stream5_IRQHandler(void) { - dispatch_handler(DMA2_dev, DMA_STREAM5); -} - -void __irq_DMA2_Stream6_IRQHandler(void) { - dispatch_handler(DMA2_dev, DMA_STREAM6); -} - -void __irq_DMA2_Stream7_IRQHandler(void) { - dispatch_handler(DMA2_dev, DMA_STREAM7); -} diff --git a/cores/arduino/dma.h b/cores/arduino/dma.h deleted file mode 100755 index 94cc305..0000000 --- a/cores/arduino/dma.h +++ /dev/null @@ -1,297 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file dma.h - * - * @author Marti Bolivar ; - * Original implementation by Michael Hope - * - * @brief Direct Memory Access peripheral support - */ - -/* - * See /notes/dma.txt for more information. - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#ifndef _DMA_H_ -#define _DMA_H_ - -#include "types.h" -#include "rcc.h" -#include "nvic.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps - */ - -/** - * @brief DMA stream type. - * - */ -typedef struct dma_stream_t { - __io uint32 CR; /**< Stream configuration register */ - __io uint32 NDTR; /**< Stream number of data register */ - __io uint32 PAR; /**< Stream peripheral address register */ - __io uint32 M0AR; /**< Stream memory address register 0 */ - __io uint32 M1AR; /**< Stream memory address register 1 */ - __io uint32 FCR; /**< Stream FIFO configuration register */ -} dma_stream_t; -/** - * @brief DMA register map type. - * - */ -typedef struct dma_reg_map { - __io uint32 LISR; /**< Low interrupt status register */ - __io uint32 HISR; /**< High interrupt status register */ - __io uint32 LIFCR; /**< Low interrupt flag clear register */ - __io uint32 HIFCR; /**< High interrupt flag clear register */ - dma_stream_t STREAM[8]; -} dma_reg_map; - -/* - * Register bit definitions - */ - -/* Channel configuration register */ - -#define DMA_CR_CH0 (0x0 << 25) -#define DMA_CR_CH1 (0x1 << 25) -#define DMA_CR_CH2 (0x2 << 25) -#define DMA_CR_CH3 (0x3 << 25) -#define DMA_CR_CH4 (0x4 << 25) -#define DMA_CR_CH5 (0x5 << 25) -#define DMA_CR_CH6 (0x6 << 25) -#define DMA_CR_CH7 (0x7 << 25) -#define DMA_CR_MBURST0 (0x0 << 23) -#define DMA_CR_MBURST4 (0x1 << 23) -#define DMA_CR_MBURST8 (0x2 << 23) -#define DMA_CR_MBURST16 (0x3 << 23) -#define DMA_CR_PBURST0 (0x0 << 21) -#define DMA_CR_PBURST4 (0x1 << 21) -#define DMA_CR_PBURST8 (0x2 << 21) -#define DMA_CR_PBURST16 (0x3 << 21) -#define DMA_CR_CT0 (0x0 << 19) -#define DMA_CR_CT1 (0x1 << 19) -#define DMA_CR_DBM (0x1 << 18) - -#define DMA_CR_PL_LOW (0x0 << 16) -#define DMA_CR_PL_MEDIUM (0x1 << 16) -#define DMA_CR_PL_HIGH (0x2 << 16) -#define DMA_CR_PL_VERY_HIGH (0x3 << 16) -#define DMA_CR_PL_MASK (0x3 << 16) - -#define DMA_CR_PINCOS (0x1 << 15) - -#define DMA_CR_MSIZE_8BITS (0x0 << 13) -#define DMA_CR_MSIZE_16BITS (0x1 << 13) -#define DMA_CR_MSIZE_32BITS (0x2 << 13) - -#define DMA_CR_PSIZE_8BITS (0x0 << 11) -#define DMA_CR_PSIZE_16BITS (0x1 << 11) -#define DMA_CR_PSIZE_32BITS (0x2 << 11) - -#define DMA_CR_MINC (0x1 << 10) -#define DMA_CR_PINC (0x1 << 9) -#define DMA_CR_CIRC (0x1 << 8) -#define DMA_CR_DIR_P2M (0x0 << 6) -#define DMA_CR_DIR_M2P (0x1 << 6) -#define DMA_CR_DIR_M2M (0x2 << 6) - -#define DMA_CR_PFCTRL (0x1 << 5) -#define DMA_CR_TCIE (0x1 << 4) -#define DMA_CR_HTIE (0x1 << 3) -#define DMA_CR_TEIE (0x1 << 2) -#define DMA_CR_DMEIE (0x1 << 1) -#define DMA_CR_EN (0x1) - -/* - * Devices - */ - -/** Encapsulates state related to a DMA channel interrupt. */ -typedef struct dma_handler_config { - void (*handler)(void); /**< User-specified channel interrupt - handler */ - nvic_irq_num irq_line; /**< Channel's NVIC interrupt number */ -} dma_handler_config; - -/** DMA device type */ -typedef struct dma_dev { - dma_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< Clock ID */ - dma_handler_config handlers[]; /**< - * @brief IRQ handlers and NVIC numbers. - * - * @see dma_attach_interrupt() - * @see dma_detach_interrupt() - */ -} dma_dev; - -extern dma_dev *DMA1_dev; -extern dma_dev *DMA2_dev; - -/* - * Convenience functions - */ - -void dma_init(dma_dev *dev); - -/** Flags for DMA transfer configuration. */ -typedef enum dma_mode_flags { - DMA_MEM_2_MEM = 1 << 14, /**< Memory to memory mode */ - DMA_MINC_MODE = 1 << 7, /**< Auto-increment memory address */ - DMA_PINC_MODE = 1 << 6, /**< Auto-increment peripheral address */ - DMA_CIRC_MODE = 1 << 5, /**< Circular mode */ - DMA_FROM_MEM = 1 << 4, /**< Read from memory to peripheral */ - DMA_TRNS_ERR = 1 << 3, /**< Interrupt on transfer error */ - DMA_HALF_TRNS = 1 << 2, /**< Interrupt on half-transfer */ - DMA_TRNS_CMPLT = 1 << 1 /**< Interrupt on transfer completion */ -} dma_mode_flags; - -/** Source and destination transfer sizes. */ -typedef enum dma_xfer_size { - DMA_SIZE_8BITS = 0, /**< 8-bit transfers */ - DMA_SIZE_16BITS = 1, /**< 16-bit transfers */ - DMA_SIZE_32BITS = 2 /**< 32-bit transfers */ -} dma_xfer_size; - -/** DMA channel */ -typedef enum dma_stream { - DMA_STREAM0 = 0, /**< Stream 0 */ - DMA_STREAM1 = 1, /**< Stream 1 */ - DMA_STREAM2 = 2, /**< Stream 2 */ - DMA_STREAM3 = 3, /**< Stream 3 */ - DMA_STREAM4 = 4, /**< Stream 4 */ - DMA_STREAM5 = 5, /**< Stream 5 */ - DMA_STREAM6 = 6, /**< Stream 6 */ - DMA_STREAM7 = 7, /**< Stream 7 */ -} dma_stream; - -static inline void dma_setup_transfer(dma_dev *dev, - dma_stream stream, - __io void *peripheral_address, - __io void *memory_address0, - __io void *memory_address1, - uint32 flags, - uint32 fifo_flags) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; // disable - dev->regs->STREAM[stream].PAR = (uint32)peripheral_address; - dev->regs->STREAM[stream].M0AR = (uint32)memory_address0; - dev->regs->STREAM[stream].M1AR = (uint32)memory_address1; - dev->regs->STREAM[stream].FCR = fifo_flags & 0x87; // mask out reserved bits - dev->regs->STREAM[stream].CR = flags & 0x0feffffe; // mask out reserved - // and enable -} - -static inline void dma_set_num_transfers(dma_dev *dev, - dma_stream stream, - uint16 num_transfers) { - dev->regs->STREAM[stream].NDTR = num_transfers; -} - -void dma_attach_interrupt(dma_dev *dev, - dma_stream stream, - void (*handler)(void)); - -void dma_detach_interrupt(dma_dev *dev, dma_stream stream); - -static inline void dma_enable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR |= DMA_CR_EN; -} - -static inline void dma_disable(dma_dev *dev, dma_stream stream) { - dev->regs->STREAM[stream].CR &= ~DMA_CR_EN; -} - -/** - * @brief Check if a DMA stream is enabled - * @param dev DMA device - * @param stream Stream whose enabled bit to check. - */ -static inline uint8 dma_is_stream_enabled(dma_dev *dev, dma_stream stream) { - return (uint8)(dev->regs->STREAM[stream].CR & DMA_CR_EN); -} - -/** - * @brief Get the ISR status bits for a DMA stream. - * - * The bits are returned right-aligned, in the following order: - * transfer error flag, half-transfer flag, transfer complete flag, - * global interrupt flag. - * - * @param dev DMA device - * @param stream Stream whose ISR bits to return. - */ -uint8 dma_get_isr_bits(dma_dev *dev, dma_stream stream); - -/** - * @brief Clear the ISR status bits for a given DMA stream. - * - * @param dev DMA device - * @param stream Stream whose ISR bits to clear. - */ -void dma_clear_isr_bits(dma_dev *dev, dma_stream stream); - -struct dma_reg_map; - -/** - * @brief DMA channels - * - * Notes: - * - This is also the dma_tube type for STM32F1. - * - Channel 0 is not available on all STM32 series. - * - * @see dma_tube - */ -typedef enum dma_channel { - DMA_CH0 = 0, /**< Channel 0 */ - DMA_CH1 = 1, /**< Channel 1 */ - DMA_CH2 = 2, /**< Channel 2 */ - DMA_CH3 = 3, /**< Channel 3 */ - DMA_CH4 = 4, /**< Channel 4 */ - DMA_CH5 = 5, /**< Channel 5 */ - DMA_CH6 = 6, /**< Channel 6 */ - DMA_CH7 = 7, /**< Channel 7 */ -} dma_channel; - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/exti.c b/cores/arduino/exti.c deleted file mode 100755 index b42b433..0000000 --- a/cores/arduino/exti.c +++ /dev/null @@ -1,241 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file exti.c - * @brief External interrupt control routines - */ - - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#include "exti.h" -#include "memory.h" -#include "nvic.h" -#include "bitband.h" - -static inline void dispatch_single_exti(uint32 exti_num); -static inline void dispatch_extis(uint32 start, uint32 stop); - -/* - * Internal state - */ - -typedef struct exti_channel { - void (*handler)(void); - uint32 irq_line; -} exti_channel; - -static exti_channel exti_channels[] = { - { .handler = NULL, .irq_line = NVIC_EXTI0 }, // EXTI0 - { .handler = NULL, .irq_line = NVIC_EXTI1 }, // EXTI1 - { .handler = NULL, .irq_line = NVIC_EXTI2 }, // EXTI2 - { .handler = NULL, .irq_line = NVIC_EXTI3 }, // EXTI3 - { .handler = NULL, .irq_line = NVIC_EXTI4 }, // EXTI4 - { .handler = NULL, .irq_line = NVIC_EXTI_9_5 }, // EXTI5 - { .handler = NULL, .irq_line = NVIC_EXTI_9_5 }, // EXTI6 - { .handler = NULL, .irq_line = NVIC_EXTI_9_5 }, // EXTI7 - { .handler = NULL, .irq_line = NVIC_EXTI_9_5 }, // EXTI8 - { .handler = NULL, .irq_line = NVIC_EXTI_9_5 }, // EXTI9 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI10 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI11 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI12 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI13 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI14 - { .handler = NULL, .irq_line = NVIC_EXTI_15_10 }, // EXTI15 -}; - -/* - * Convenience routines - */ - -/** - * @brief Register a handler to run upon external interrupt. - * - * This function assumes that the interrupt request corresponding to - * the given external interrupt is masked. - * - * @param num External interrupt line number. - * @param port Port to use as source input for external interrupt. - * @param handler Function handler to execute when interrupt is triggered. - * @param mode Type of transition to trigger on, one of: - * EXTI_RISING, EXTI_FALLING, EXTI_RISING_FALLING. - * @see afio_exti_num - * @see afio_exti_port - * @see voidFuncPtr - * @see exti_trigger_mode - */ -void exti_attach_interrupt(afio_exti_num num, - afio_exti_port port, - voidFuncPtr handler, - exti_trigger_mode mode) { - ASSERT(handler); - #ifdef ENABLE_STAR_TS_IRQ - // Reserved for StAr TS irq - if (num == 0) - return - #endif - - /* Register the handler */ - exti_channels[num].handler = handler; - - /* Set trigger mode */ - switch (mode) { - case EXTI_RISING: - bb_peri_set_bit(&EXTI_BASE->RTSR, num, 1); - break; - case EXTI_FALLING: - bb_peri_set_bit(&EXTI_BASE->FTSR, num, 1); - break; - case EXTI_RISING_FALLING: - bb_peri_set_bit(&EXTI_BASE->RTSR, num, 1); - bb_peri_set_bit(&EXTI_BASE->FTSR, num, 1); - break; - } - - /* Map num to port */ - afio_exti_select(num, port); - - /* Unmask external interrupt request */ - bb_peri_set_bit(&EXTI_BASE->IMR, num, 1); - - /* Enable the interrupt line */ - nvic_irq_enable(exti_channels[num].irq_line); -} - -/** - * @brief Unregister an external interrupt handler - * @param num Number of the external interrupt line to disable. - * @see afio_exti_num - */ -void exti_detach_interrupt(afio_exti_num num) { - #ifdef ENABLE_STAR_TS_IRQ - // Reserved for StAr TS irq - if (num == 0) - return - #endif - - /* First, mask the interrupt request */ - bb_peri_set_bit(&EXTI_BASE->IMR, num, 0); - - /* Then, clear the trigger selection registers */ - bb_peri_set_bit(&EXTI_BASE->FTSR, num, 0); - bb_peri_set_bit(&EXTI_BASE->RTSR, num, 0); - - /* Finally, unregister the user's handler */ - exti_channels[num].handler = NULL; -} - -/* - * Interrupt handlers - */ - -//#if !defined(ENABLE_STAR_TS_IRQ) -#ifndef ENABLE_STAR_TS_IRQ -void __irq_exti0(void) { - dispatch_single_exti(AFIO_EXTI_0); -} -#endif - -void __irq_exti1(void) { - dispatch_single_exti(AFIO_EXTI_1); -} - -void __irq_exti2(void) { - dispatch_single_exti(AFIO_EXTI_2); -} - -void __irq_exti3(void) { - dispatch_single_exti(AFIO_EXTI_3); -} - -void __irq_exti4(void) { - dispatch_single_exti(AFIO_EXTI_4); -} - -void __irq_exti9_5(void) { - dispatch_extis(5, 9); -} - -void __irq_exti15_10(void) { - dispatch_extis(10, 15); -} - -/* - * Auxiliary functions - */ - -/* Clear the pending bits for EXTIs whose bits are set in exti_msk. - * - * If a pending bit is cleared as the last instruction in an ISR, it - * won't actually be cleared in time and the ISR will fire again. To - * compensate, this function NOPs for 2 cycles after clearing the - * pending bits to ensure it takes effect. */ -static inline void clear_pending_msk(uint32 exti_msk) { - EXTI_BASE->PR = exti_msk; - asm volatile("nop"); - asm volatile("nop"); -} - -/* This dispatch routine is for non-multiplexed EXTI lines only; i.e., - * it doesn't check EXTI_PR. */ -static inline void dispatch_single_exti(uint32 exti) { - voidFuncPtr handler = exti_channels[exti].handler; - - if (!handler) { - return; - } - - handler(); - clear_pending_msk(BIT(exti)); -} - -/* Dispatch routine for EXTIs which share an IRQ. */ -static inline void dispatch_extis(uint32 start, uint32 stop) { - uint32 pr = EXTI_BASE->PR; - uint32 handled_msk = 0; - uint32 exti; - - /* Dispatch user handlers for pending EXTIs. */ - for (exti = start; exti <= stop; exti++) { - uint32 eb = BIT(exti); - if (pr & eb) { - voidFuncPtr handler = exti_channels[exti].handler; - if (handler) { - handler(); - handled_msk |= eb; - } - } - } - - /* Clear the pending bits for handled EXTIs. */ - clear_pending_msk(handled_msk); -} diff --git a/cores/arduino/exti.h b/cores/arduino/exti.h deleted file mode 100755 index 07ad9b1..0000000 --- a/cores/arduino/exti.h +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file exti.h - * @brief External interrupt control prototypes and defines - */ - -/* See notes/exti.txt for more info */ - -/* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - */ - -#include "memory.h" -#include "gpio.h" - -#ifndef _EXTI_H_ -#define _EXTI_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** EXTI register map type */ -typedef struct exti_reg_map { - __io uint32 IMR; /**< Interrupt mask register */ - __io uint32 EMR; /**< Event mask register */ - __io uint32 RTSR; /**< Rising trigger selection register */ - __io uint32 FTSR; /**< Falling trigger selection register */ - __io uint32 SWIER; /**< Software interrupt event register */ - __io uint32 PR; /**< Pending register */ -} exti_reg_map; - -/** EXTI register map base pointer */ -#define EXTI_BASE ((struct exti_reg_map*)0x40013C00) - -/** External interrupt trigger mode */ -typedef enum exti_trigger_mode { - EXTI_RISING, /**< Trigger on the rising edge */ - EXTI_FALLING, /**< Trigger on the falling edge */ - EXTI_RISING_FALLING /**< Trigger on both the rising and falling edges */ -} exti_trigger_mode; - -void exti_attach_interrupt(afio_exti_num num, - afio_exti_port port, - voidFuncPtr handler, - exti_trigger_mode mode); -void exti_detach_interrupt(afio_exti_num num); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/flash.c b/cores/arduino/flash.c deleted file mode 100755 index 0473d07..0000000 --- a/cores/arduino/flash.c +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file flash.c - * @brief Flash management functions - */ - -/* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "flash.h" -#include "bitband.h" - -/** - * @brief Turn on the hardware prefetcher. - */ -void flash_enable_prefetch(void) { - *bb_perip(&FLASH_BASE->ACR, FLASH_ACR_PRFTBE_BIT) = 1; -} - -/** - * @brief Set flash wait states - * - * See ST PM0042, section 3.1 for restrictions on the acceptable value - * of wait_states for a given SYSCLK configuration. - * - * @param wait_states number of wait states (one of - * FLASH_WAIT_STATE_0, FLASH_WAIT_STATE_1, - * FLASH_WAIT_STATE_2). - */ -void flash_set_latency(uint32 wait_states) { - uint32 val = FLASH_BASE->ACR; - - val &= ~FLASH_ACR_LATENCY; - val |= wait_states; - - FLASH_BASE->ACR = val; -} diff --git a/cores/arduino/flash.h b/cores/arduino/flash.h deleted file mode 100755 index 86f789c..0000000 --- a/cores/arduino/flash.h +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file flash.h - * @brief STM32 Medium and high density Flash register map and setup - * routines - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "types.h" - -#ifndef _FLASH_H_ -#define _FLASH_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** Flash register map type */ -typedef struct flash_reg_map { - __io uint32 ACR; /**< Access control register */ - __io uint32 KEYR; /**< Key register */ - __io uint32 OPTKEYR; /**< OPTKEY register */ - __io uint32 SR; /**< Status register */ - __io uint32 CR; /**< Control register */ - __io uint32 AR; /**< Address register */ - __io uint32 OBR; /**< Option byte register */ - __io uint32 WRPR; /**< Write protection register */ -} flash_reg_map; - -/** Flash register map base pointer */ -#define FLASH_BASE ((struct flash_reg_map*)0x40022000) - -/* - * Register bit definitions - */ - -/* Access control register */ - -#define FLASH_ACR_PRFTBS_BIT 5 -#define FLASH_ACR_PRFTBE_BIT 4 -#define FLASH_ACR_HLFCYA_BIT 3 - -#define FLASH_ACR_PRFTBS BIT(FLASH_ACR_PRFTBS_BIT) -#define FLASH_ACR_PRFTBE BIT(FLASH_ACR_PRFTBE_BIT) -#define FLASH_ACR_HLFCYA BIT(FLASH_ACR_HLFCYA_BIT) -#define FLASH_ACR_LATENCY 0x7 - -/* Status register */ - -#define FLASH_SR_EOP_BIT 5 -#define FLASH_SR_WRPRTERR_BIT 4 -#define FLASH_SR_PGERR_BIT 2 -#define FLASH_SR_BSY_BIT 0 - -#define FLASH_SR_EOP BIT(FLASH_SR_EOP_BIT) -#define FLASH_SR_WRPRTERR BIT(FLASH_SR_WRPRTERR_BIT) -#define FLASH_SR_PGERR BIT(FLASH_SR_PGERR_BIT) -#define FLASH_SR_BSY BIT(FLASH_SR_BSY_BIT) - -/* Control register */ - -#define FLASH_CR_EOPIE_BIT 12 -#define FLASH_CR_ERRIE_BIT 10 -#define FLASH_CR_OPTWRE_BIT 9 -#define FLASH_CR_LOCK_BIT 7 -#define FLASH_CR_STRT_BIT 6 -#define FLASH_CR_OPTER_BIT 5 -#define FLASH_CR_OPTPG_BIT 4 -#define FLASH_CR_MER_BIT 2 -#define FLASH_CR_PER_BIT 1 -#define FLASH_CR_PG_BIT 0 - -#define FLASH_CR_EOPIE BIT(FLASH_CR_EOPIE_BIT) -#define FLASH_CR_ERRIE BIT(FLASH_CR_ERRIE_BIT) -#define FLASH_CR_OPTWRE BIT(FLASH_CR_OPTWRE_BIT) -#define FLASH_CR_LOCK BIT(FLASH_CR_LOCK_BIT) -#define FLASH_CR_STRT BIT(FLASH_CR_STRT_BIT) -#define FLASH_CR_OPTER BIT(FLASH_CR_OPTER_BIT) -#define FLASH_CR_OPTPG BIT(FLASH_CR_OPTPG_BIT) -#define FLASH_CR_MER BIT(FLASH_CR_MER_BIT) -#define FLASH_CR_PER BIT(FLASH_CR_PER_BIT) -#define FLASH_CR_PG BIT(FLASH_CR_PG_BIT) - -/* Option byte register */ - -#define FLASH_OBR_nRST_STDBY_BIT 4 -#define FLASH_OBR_nRST_STOP_BIT 3 -#define FLASH_OBR_WDG_SW_BIT 2 -#define FLASH_OBR_RDPRT_BIT 1 -#define FLASH_OBR_OPTERR_BIT 0 - -#define FLASH_OBR_DATA1 (0xFF << 18) -#define FLASH_OBR_DATA0 (0xFF << 10) -#define FLASH_OBR_USER 0x3FF -#define FLASH_OBR_nRST_STDBY BIT(FLASH_OBR_nRST_STDBY_BIT) -#define FLASH_OBR_nRST_STOP BIT(FLASH_OBR_nRST_STOP_BIT) -#define FLASH_OBR_WDG_SW BIT(FLASH_OBR_WDG_SW_BIT) -#define FLASH_OBR_RDPRT BIT(FLASH_OBR_RDPRT_BIT) -#define FLASH_OBR_OPTERR BIT(FLASH_OBR_OPTERR_BIT) - -/* - * Setup routines - */ - -#define FLASH_WAIT_STATE_0 0x0 -#define FLASH_WAIT_STATE_1 0x1 -#define FLASH_WAIT_STATE_2 0x2 - -void flash_enable_prefetch(void); -void flash_set_latency(uint32 wait_states); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/cores/arduino/fsmc.c b/cores/arduino/fsmc.c deleted file mode 100755 index 5e2ad53..0000000 --- a/cores/arduino/fsmc.c +++ /dev/null @@ -1,94 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file fsmc.c - * @brief Flexible static memory controller support. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "fsmc.h" -#include "gpio.h" - -/** - * Configure FSMC GPIOs for use with SRAM. - */ -void fsmc_sram_init_gpios(void) { - /* Data lines... */ - gpio_set_mode(GPIOD_dev, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 7, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 8, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 9, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 10, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOE_dev, 15, GPIO_AF_OUTPUT_PP); - - /* Address lines... */ - gpio_set_mode(GPIOD_dev, 11, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOD_dev, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 5, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 12, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 13, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 14, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOF_dev, 15, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 0, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 1, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 2, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 3, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 4, GPIO_AF_OUTPUT_PP); - gpio_set_mode(GPIOG_dev, 5, GPIO_AF_OUTPUT_PP); - - /* And control lines... */ - gpio_set_mode(GPIOD_dev, 4, GPIO_AF_OUTPUT_PP); // NOE - gpio_set_mode(GPIOD_dev, 5, GPIO_AF_OUTPUT_PP); // NWE - - gpio_set_mode(GPIOD_dev, 7, GPIO_AF_OUTPUT_PP); // NE1 - gpio_set_mode(GPIOG_dev, 9, GPIO_AF_OUTPUT_PP); // NE2 - gpio_set_mode(GPIOG_dev, 10, GPIO_AF_OUTPUT_PP); // NE3 - gpio_set_mode(GPIOG_dev, 12, GPIO_AF_OUTPUT_PP); // NE4 - - gpio_set_mode(GPIOE_dev, 0, GPIO_AF_OUTPUT_PP); // NBL0 - gpio_set_mode(GPIOE_dev, 1, GPIO_AF_OUTPUT_PP); // NBL1 -} diff --git a/cores/arduino/fsmc.h b/cores/arduino/fsmc.h deleted file mode 100755 index 02d6840..0000000 --- a/cores/arduino/fsmc.h +++ /dev/null @@ -1,322 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Bryan Newbold. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file fsmc.h - * @brief Flexible static memory controller support. - */ - -/* - * See ../notes/fsmc.txt for more info - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - - -#include "types.h" - -/** - * @file fsmc.h - */ - -#ifndef _FSMC_H_ -#define _FSMC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps and devices - */ - -/** FSMC register map type */ -typedef struct fsmc_reg_map { - __io uint32 BCR1; /**< SRAM/NOR-Flash chip-select control register 1 */ - __io uint32 BTR1; /**< SRAM/NOR-Flash chip-select timing register 1 */ - __io uint32 BCR2; /**< SRAM/NOR-Flash chip-select control register 2 */ - __io uint32 BTR2; /**< SRAM/NOR-Flash chip-select timing register 2 */ - __io uint32 BCR3; /**< SRAM/NOR-Flash chip-select control register 3 */ - __io uint32 BTR3; /**< SRAM/NOR-Flash chip-select timing register 3 */ - __io uint32 BCR4; /**< SRAM/NOR-Flash chip-select control register 4 */ - __io uint32 BTR4; /**< SRAM/NOR-Flash chip-select timing register 4 */ - const uint8 RESERVED1[64]; /**< Reserved */ - __io uint32 PCR2; /**< PC Card/NAND Flash control register 2 */ - __io uint32 SR2; /**< FIFO status and interrupt register 2 */ - __io uint32 PMEM2; /**< Common memory space timing register 2 */ - __io uint32 PATT2; /**< Attribute memory space timing register 2 */ - const uint8 RESERVED2[4]; /**< Reserved */ - __io uint32 ECCR2; /**< ECC result register 2 */ - const uint8 RESERVED3[2]; - __io uint32 PCR3; /**< PC Card/NAND Flash control register 3 */ - __io uint32 SR3; /**< FIFO status and interrupt register 3 */ - __io uint32 PMEM3; /**< Common memory space timing register 3 */ - __io uint32 PATT3; /**< Attribute memory space timing register 3 */ - const uint32 RESERVED4; /**< Reserved */ - __io uint32 ECCR3; /**< ECC result register 3 */ - const uint8 RESERVED5[8]; /**< Reserved */ - __io uint32 PCR4; /**< PC Card/NAND Flash control register 4 */ - __io uint32 SR4; /**< FIFO status and interrupt register 4 */ - __io uint32 PMEM4; /**< Common memory space timing register 4 */ - __io uint32 PATT4; /**< Attribute memory space timing register 4 */ - __io uint32 PIO4; /**< I/O space timing register 4 */ - const uint8 RESERVED6[80]; /**< Reserved */ - __io uint32 BWTR1; /**< SRAM/NOR-Flash write timing register 1 */ - const uint32 RESERVED7; /**< Reserved */ - __io uint32 BWTR2; /**< SRAM/NOR-Flash write timing register 2 */ - const uint32 RESERVED8; /**< Reserved */ - __io uint32 BWTR3; /**< SRAM/NOR-Flash write timing register 3 */ - const uint32 RESERVED9; /**< Reserved */ - __io uint32 BWTR4; /**< SRAM/NOR-Flash write timing register 4 */ -} __attribute__((packed)) fsmc_reg_map; - -#define __FSMCB 0xA0000000 - -/** FSMC register map base pointer */ -#define FSMC_BASE ((struct fsmc_reg_map*)__FSMCB) - -/** FSMC NOR/PSRAM register map type */ -typedef struct fsmc_nor_psram_reg_map { - __io uint32 BCR; /**< Chip-select control register */ - __io uint32 BTR; /**< Chip-select timing register */ - const uint8 RESERVED[252]; /**< Reserved */ - __io uint32 BWTR; /**< Write timing register */ -} fsmc_nor_psram_reg_map; - -/** FSMC NOR/PSRAM base pointer 1 */ -#define FSMC_NOR_PSRAM1_BASE ((struct fsmc_nor_psram_reg_map*)__FSMCB) - -/** FSMC NOR/PSRAM base pointer 2 */ -#define FSMC_NOR_PSRAM2_BASE ((struct fsmc_nor_psram_reg_map*)(__FSMCB + 0x8)) - -/** FSMC NOR/PSRAM base pointer 3 */ -#define FSMC_NOR_PSRAM3_BASE ((struct fsmc_nor_psram_reg_map*)(__FSMCB + 0x10)) - -/** FSMC NOR/PSRAM base pointer 4 */ -#define FSMC_NOR_PSRAM4_BASE ((struct fsmc_nor_psram_reg_map*)(__FSMCB + 0x18)) - -/* - * Register bit definitions - */ - -/* NOR/PSRAM chip-select control registers */ - -#define FSMC_BCR_CBURSTRW_BIT 19 -#define FSMC_BCR_ASYNCWAIT_BIT 15 -#define FSMC_BCR_EXTMOD_BIT 14 -#define FSMC_BCR_WAITEN_BIT 13 -#define FSMC_BCR_WREN_BIT 12 -#define FSMC_BCR_WAITCFG_BIT 11 -#define FSMC_BCR_WRAPMOD_BIT 10 -#define FSMC_BCR_WAITPOL_BIT 9 -#define FSMC_BCR_BURSTEN_BIT 8 -#define FSMC_BCR_FACCEN_BIT 6 -#define FSMC_BCR_MUXEN_BIT 1 -#define FSMC_BCR_MBKEN_BIT 0 - -#define FSMC_BCR_CBURSTRW BIT(FSMC_BCR_CBURSTRW_BIT) -#define FSMC_BCR_ASYNCWAIT BIT(FSMC_BCR_ASYNCWAIT_BIT) -#define FSMC_BCR_EXTMOD BIT(FSMC_BCR_EXTMOD_BIT) -#define FSMC_BCR_WAITEN BIT(FSMC_BCR_WAITEN_BIT) -#define FSMC_BCR_WREN BIT(FSMC_BCR_WREN_BIT) -#define FSMC_BCR_WAITCFG BIT(FSMC_BCR_WAITCFG_BIT) -#define FSMC_BCR_WRAPMOD BIT(FSMC_BCR_WRAPMOD_BIT) -#define FSMC_BCR_WAITPOL BIT(FSMC_BCR_WAITPOL_BIT) -#define FSMC_BCR_BURSTEN BIT(FSMC_BCR_BURSTEN_BIT) -#define FSMC_BCR_FACCEN BIT(FSMC_BCR_FACCEN_BIT) -#define FSMC_BCR_MWID (0x3 << 4) -#define FSMC_BCR_MWID_8BITS (0x0 << 4) -#define FSMC_BCR_MWID_16BITS (0x1 << 4) -#define FSMC_BCR_MTYP (0x3 << 2) -#define FSMC_BCR_MTYP_SRAM (0x0 << 2) -#define FSMC_BCR_MTYP_PSRAM (0x1 << 2) -#define FSMC_BCR_MTYP_NOR_FLASH (0x2 << 2) -#define FSMC_BCR_MUXEN BIT(FSMC_BCR_MUXEN_BIT) -#define FSMC_BCR_MBKEN BIT(FSMC_BCR_MBKEN_BIT) - -/* SRAM/NOR-Flash chip-select timing registers */ - -#define FSMC_BTR_ACCMOD (0x3 << 28) -#define FSMC_BTR_ACCMOD_A (0x0 << 28) -#define FSMC_BTR_ACCMOD_B (0x1 << 28) -#define FSMC_BTR_ACCMOD_C (0x2 << 28) -#define FSMC_BTR_ACCMOD_D (0x3 << 28) -#define FSMC_BTR_DATLAT (0xF << 24) -#define FSMC_BTR_CLKDIV (0xF << 20) -#define FSMC_BTR_BUSTURN (0xF << 16) -#define FSMC_BTR_DATAST (0xFF << 8) -#define FSMC_BTR_ADDHLD (0xF << 4) -#define FSMC_BTR_ADDSET 0xF - -/* SRAM/NOR-Flash write timing registers */ - -#define FSMC_BWTR_ACCMOD (0x3 << 28) -#define FSMC_BWTR_ACCMOD_A (0x0 << 28) -#define FSMC_BWTR_ACCMOD_B (0x1 << 28) -#define FSMC_BWTR_ACCMOD_C (0x2 << 28) -#define FSMC_BWTR_ACCMOD_D (0x3 << 28) -#define FSMC_BWTR_DATLAT (0xF << 24) -#define FSMC_BWTR_CLKDIV (0xF << 20) -#define FSMC_BWTR_DATAST (0xFF << 8) -#define FSMC_BWTR_ADDHLD (0xF << 4) -#define FSMC_BWTR_ADDSET 0xF - -/* NAND Flash/PC Card controller registers */ - -#define FSMC_PCR_ECCEN_BIT 6 -#define FSMC_PCR_PTYP_BIT 3 -#define FSMC_PCR_PBKEN_BIT 2 -#define FSMC_PCR_PWAITEN_BIT 1 - -#define FSMC_PCR_ECCPS (0x7 << 17) -#define FSMC_PCR_ECCPS_256B (0x0 << 17) -#define FSMC_PCR_ECCPS_512B (0x1 << 17) -#define FSMC_PCR_ECCPS_1024B (0x2 << 17) -#define FSMC_PCR_ECCPS_2048B (0x3 << 17) -#define FSMC_PCR_ECCPS_4096B (0x4 << 17) -#define FSMC_PCR_ECCPS_8192B (0x5 << 17) -#define FSMC_PCR_TAR (0xF << 13) -#define FSMC_PCR_TCLR (0xF << 9) -#define FSMC_PCR_ECCEN BIT(FSMC_PCR_ECCEN_BIT) -#define FSMC_PCR_PWID (0x3 << 4) -#define FSMC_PCR_PWID_8BITS (0x0 << 4) -#define FSMC_PCR_PWID_16BITS (0x1 << 4) -#define FSMC_PCR_PTYP BIT(FSMC_PCR_PTYP_BIT) -#define FSMC_PCR_PTYP_PC_CF_PCMCIA (0x0 << FSMC_PCR_PTYP_BIT) -#define FSMC_PCR_PTYP_NAND (0x1 << FSMC_PCR_PTYP_BIT) -#define FSMC_PCR_PBKEN BIT(FSMC_PCR_PBKEN_BIT) -#define FSMC_PCR_PWAITEN BIT(FSMC_PCR_PWAITEN_BIT) - -/* FIFO status and interrupt registers */ - -#define FSMC_SR_FEMPT_BIT 6 -#define FSMC_SR_IFEN_BIT 5 -#define FSMC_SR_ILEN_BIT 4 -#define FSMC_SR_IREN_BIT 3 -#define FSMC_SR_IFS_BIT 2 -#define FSMC_SR_ILS_BIT 1 -#define FSMC_SR_IRS_BIT 0 - -#define FSMC_SR_FEMPT BIT(FSMC_SR_FEMPT_BIT) -#define FSMC_SR_IFEN BIT(FSMC_SR_IFEN_BIT) -#define FSMC_SR_ILEN BIT(FSMC_SR_ILEN_BIT) -#define FSMC_SR_IREN BIT(FSMC_SR_IREN_BIT) -#define FSMC_SR_IFS BIT(FSMC_SR_IFS_BIT) -#define FSMC_SR_ILS BIT(FSMC_SR_ILS_BIT) -#define FSMC_SR_IRS BIT(FSMC_SR_IRS_BIT) - -/* Common memory space timing registers */ - -#define FSMC_PMEM_MEMHIZ (0xFF << 24) -#define FSMC_PMEM_MEMHOLD (0xFF << 16) -#define FSMC_PMEM_MEMWAIT (0xFF << 8) -#define FSMC_PMEM_MEMSET 0xFF - -/* Attribute memory space timing registers */ - -#define FSMC_PATT_ATTHIZ (0xFF << 24) -#define FSMC_PATT_ATTHOLD (0xFF << 16) -#define FSMC_PATT_ATTWAIT (0xFF << 8) -#define FSMC_PATT_ATTSET 0xFF - -/* I/O space timing register 4 */ - -#define FSMC_PIO_IOHIZ (0xFF << 24) -#define FSMC_PIO_IOHOLD (0xFF << 16) -#define FSMC_PIO_IOWAIT (0xFF << 8) -#define FSMC_PIO_IOSET 0xFF - -/* - * Memory bank boundary addresses - */ - -/** Pointer to base address of FSMC memory bank 1 (split into 4 - * regions, each supporting 1 NOR Flash, SRAM, or PSRAM chip) */ -#define FSMC_BANK1 ((void*)0x60000000) - -/** Pointer to base address of FSMC memory bank 1, region 1 (for NOR/PSRAM) */ -#define FSMC_NOR_PSRAM_REGION1 FSMC_BANK1 - -/** Pointer to base address of FSMC memory bank 1, region 2 (for NOR/PSRAM) */ -#define FSMC_NOR_PSRAM_REGION2 ((void*)0x64000000) - -/** Pointer to base address of FSMC memory bank 1, region 3 (for NOR/PSRAM) */ -#define FSMC_NOR_PSRAM_REGION3 ((void*)0x68000000) - -/** Pointer to base address of FSMC memory bank 1, region 4 (for NOR/PSRAM) */ -#define FSMC_NOR_PSRAM_REGION4 ((void*)0x6C000000) - -/** Pointer to base address of FSMC memory bank 2 (for NAND Flash) */ -#define FSMC_BANK2 ((void*)0x70000000) - -/** Pointer to base address of FSMC memory bank 3 (for NAND Flash) */ -#define FSMC_BANK3 ((void*)0x80000000) - -/** Pointer to base address of FSMC memory bank 4 (for PC card devices */ -#define FSMC_BANK4 ((void*)0x90000000) - -/* - * SRAM/NOR Flash routines - */ - -void fsmc_sram_init_gpios(void); - -/** - * Set the DATAST bits in the given NOR/PSRAM register map's - * chip-select timing register (FSMC_BTR). - * - * @param regs NOR Flash/PSRAM register map whose chip-select timing - * register to set. - * @param datast Value to use for DATAST bits. - */ -static inline void fsmc_nor_psram_set_datast(fsmc_nor_psram_reg_map *regs, - uint8 datast) { - regs->BTR &= ~FSMC_BTR_DATAST; - regs->BTR |= datast << 8; -} - -/** - * Set the ADDHLD bits in the given NOR/PSRAM register map's chip - * select timing register (FSMC_BTRx). - * - * @param regs NOR Flash/PSRAM register map whose chip-select timing - * register to set. - * @param addset Value to use for ADDSET bits. - */ -static inline void fsmc_nor_psram_set_addset(fsmc_nor_psram_reg_map *regs, - uint8 addset) { - regs->BTR &= ~FSMC_BTR_ADDSET; - regs->BTR |= addset & 0xF; -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/cores/arduino/gpio.c b/cores/arduino/gpio.c deleted file mode 100755 index b07fa28..0000000 --- a/cores/arduino/gpio.c +++ /dev/null @@ -1,246 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file gpio.c - * @brief GPIO initialization routine - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - - -#include "gpio.h" -#include "rcc.h" - -/* - * GPIO devices - */ - -/** GPIO port A device. */ -gpio_dev gpioa = { - .regs = GPIOA_BASE, - .clk_id = RCC_GPIOA, - .exti_port = AFIO_EXTI_PA, -}; -gpio_dev* const GPIOA_dev = &gpioa; - -/** GPIO port B device. */ -gpio_dev gpiob = { - .regs = GPIOB_BASE, - .clk_id = RCC_GPIOB, - .exti_port = AFIO_EXTI_PB, -}; -gpio_dev* const GPIOB_dev = &gpiob; - -/** GPIO port C device. */ -gpio_dev gpioc = { - .regs = GPIOC_BASE, - .clk_id = RCC_GPIOC, - .exti_port = AFIO_EXTI_PC, -}; -gpio_dev* const GPIOC_dev = &gpioc; - -/** GPIO port D device. */ -gpio_dev gpiod = { - .regs = GPIOD_BASE, - .clk_id = RCC_GPIOD, - .exti_port = AFIO_EXTI_PD, -}; -gpio_dev* const GPIOD_dev = &gpiod; - -#ifdef STM32_HIGH_DENSITY - -/** GPIO port E device. */ -gpio_dev gpioe = { - .regs = GPIOE_BASE, - .clk_id = RCC_GPIOE, - .exti_port = AFIO_EXTI_PE, -}; -gpio_dev* const GPIOE_dev = &gpioe; - -/** GPIO port F device. */ -gpio_dev gpiof = { - .regs = GPIOF_BASE, - .clk_id = RCC_GPIOF, - .exti_port = AFIO_EXTI_PF, -}; -gpio_dev* const GPIOF_dev = &gpiof; - -/** GPIO port G device. */ -gpio_dev gpiog = { - .regs = GPIOG_BASE, - .clk_id = RCC_GPIOG, - .exti_port = AFIO_EXTI_PG, -}; -gpio_dev* const GPIOG_dev = &gpiog; - -/** GPIO port H device. */ -gpio_dev gpioh = { - .regs = GPIOH_BASE, - .clk_id = RCC_GPIOH, - .exti_port = AFIO_EXTI_PH, -}; -gpio_dev* const GPIOH_dev = &gpioh; - -/** GPIO port I device. */ -gpio_dev gpioi = { - .regs = GPIOI_BASE, - .clk_id = RCC_GPIOI, - .exti_port = AFIO_EXTI_PI, -}; -gpio_dev* const GPIOI_dev = &gpioi; - -/** GPIO port J device. */ -gpio_dev gpioj = { - .regs = GPIOJ_BASE, - .clk_id = RCC_GPIOJ, - .exti_port = AFIO_EXTI_PJ, -}; -gpio_dev* const GPIOJ_dev = &gpioj; - -/** GPIO port K device. */ -gpio_dev gpiok = { - .regs = GPIOK_BASE, - .clk_id = RCC_GPIOK, - .exti_port = AFIO_EXTI_PK, -}; -gpio_dev* const GPIOK_dev = &gpiok; - -#endif - -/* - * GPIO convenience routines - */ - -/** - * Initialize a GPIO device. - * - * Enables the clock for and resets the given device. - * - * @param dev GPIO device to initialize. - */ -void gpio_init(gpio_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * Initialize and reset all available GPIO devices. - */ -void gpio_init_all(void) { - gpio_init(GPIOA_dev); - gpio_init(GPIOB_dev); - gpio_init(GPIOC_dev); - gpio_init(GPIOD_dev); - gpio_init(GPIOE_dev); - gpio_init(GPIOF_dev); - gpio_init(GPIOG_dev); - gpio_init(GPIOH_dev); - gpio_init(GPIOI_dev); - gpio_init(GPIOJ_dev); - gpio_init(GPIOK_dev); -} - -/** - * Set the mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode General purpose or alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode) { - gpio_reg_map *regs = dev->regs; - - regs->MODER = (regs->MODER & ~( 3 << (2*pin))) | (((mode >> 0) & 3) << (2*pin)); - regs->PUPDR = (regs->PUPDR & ~( 3 << (2*pin))) | (((mode >> 2) & 3) << (2*pin)); - regs->OSPEEDR = (regs->OSPEEDR & ~( 3 << (2*pin))) | (((mode >> 4) & 3) << (2*pin)); - regs->OTYPER = (regs->OTYPER & ~( 1 << (1*pin))) | (((mode >> 6) & 1) << (1*pin)); -} - -/** - * Set the alternate function mode of a GPIO pin. - * - * @param dev GPIO device. - * @param pin Pin on the device whose mode to set, 0--15. - * @param mode alternate function mode to set the pin to. - * @see gpio_pin_mode - */ -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { - gpio_reg_map *regs = dev->regs; - - regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); -} - -/* - * AFIO - */ - -/** - * @brief Initialize the AFIO clock, and reset the AFIO registers. - */ -void afio_init(void) { - // do nothing -} - -#define AFIO_EXTI_SEL_MASK 0xF - -/** - * @brief Select a source input for an external interrupt. - * - * @param exti External interrupt. - * @param gpio_port Port which contains pin to use as source input. - * @see afio_exti_num - * @see afio_exti_port - */ -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) { - __io uint32 *exti_cr = &SYSCFG_BASE->EXTICR1 + exti / 4; - uint32 shift = 4 * (exti % 4); - uint32 cr = *exti_cr; - - cr &= ~(AFIO_EXTI_SEL_MASK << shift); - cr |= gpio_port << shift; - *exti_cr = cr; -} - -/** - * @brief Perform an alternate function remap. - * @param remapping Remapping to perform. - */ -#if 0 -void afio_remap(afio_remap_peripheral remapping) { - if (remapping & AFIO_REMAP_USE_MAPR2) { - remapping &= ~AFIO_REMAP_USE_MAPR2; - AFIO_BASE->MAPR2 |= remapping; - } else { - AFIO_BASE->MAPR |= remapping; - } -} -#endif - diff --git a/cores/arduino/gpio.h b/cores/arduino/gpio.h deleted file mode 100755 index 4c8b9da..0000000 --- a/cores/arduino/gpio.h +++ /dev/null @@ -1,712 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file gpio.h - * - * @brief General purpose I/O (GPIO) and Alternate Function I/O - * (AFIO) prototypes, defines, and inlined access functions. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#include "memory.h" -#include "rcc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * GPIO register maps and devices - */ - -/** GPIO register map type */ -typedef struct gpio_reg_map { - __io uint32 MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __io uint32 OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __io uint32 OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __io uint32 PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __io uint32 IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __io uint32 ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __io uint16 BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ - __io uint16 BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ - __io uint32 LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __io uint32 AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x24-0x28 */ -} gpio_reg_map; - - - -/** - * @brief External interrupt line port selector. - * - * Used to determine which GPIO port to map an external interrupt line - * onto. */ -/* (See AFIO sections, below) */ -typedef enum afio_exti_port { - AFIO_EXTI_PA, /**< Use port A (PAx) pin. */ - AFIO_EXTI_PB, /**< Use port B (PBx) pin. */ - AFIO_EXTI_PC, /**< Use port C (PCx) pin. */ - AFIO_EXTI_PD, /**< Use port D (PDx) pin. */ - AFIO_EXTI_PE, /**< Use port E (PEx) pin. */ - AFIO_EXTI_PF, /**< Use port F (PFx) pin. */ - AFIO_EXTI_PG, /**< Use port G (PGx) pin. */ - AFIO_EXTI_PH, /**< Use port G (PGx) pin. */ - AFIO_EXTI_PI, /**< Use port G (PGx) pin. */ - AFIO_EXTI_PJ, /**< Use port G (PGx) pin. */ - AFIO_EXTI_PK, /**< Use port G (PGx) pin. */ -} afio_exti_port; - -/** GPIO device type */ -typedef struct gpio_dev { - gpio_reg_map *regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - afio_exti_port exti_port; /**< AFIO external interrupt port value */ -} gpio_dev; - -extern gpio_dev gpioa; -extern gpio_dev* const GPIOA_dev; -extern gpio_dev gpiob; -extern gpio_dev* const GPIOB_dev; -extern gpio_dev gpioc; -extern gpio_dev* const GPIOC_dev; -extern gpio_dev gpiod; -extern gpio_dev* const GPIOD_dev; -extern gpio_dev gpioe; -extern gpio_dev* const GPIOE_dev; -extern gpio_dev gpiof; -extern gpio_dev* const GPIOF_dev; -extern gpio_dev gpiog; -extern gpio_dev* const GPIOG_dev; -extern gpio_dev gpioh; -extern gpio_dev* const GPIOH_dev; -extern gpio_dev gpioi; -extern gpio_dev* const GPIOI_dev; -extern gpio_dev gpioj; -extern gpio_dev* const GPIOJ_dev; -extern gpio_dev gpiok; -extern gpio_dev* const GPIOK_dev; - -/** GPIO port register map base pointer */ -#define GPIOA_BASE ((struct gpio_reg_map*)0x40020000) -#define GPIOB_BASE ((struct gpio_reg_map*)0x40020400) -#define GPIOC_BASE ((struct gpio_reg_map*)0x40020800) -#define GPIOD_BASE ((struct gpio_reg_map*)0x40020C00) -#define GPIOE_BASE ((struct gpio_reg_map*)0x40021000) -#define GPIOF_BASE ((struct gpio_reg_map*)0x40021400) -#define GPIOG_BASE ((struct gpio_reg_map*)0x40021800) -#define GPIOH_BASE ((struct gpio_reg_map*)0x40021C00) -#define GPIOI_BASE ((struct gpio_reg_map*)0x40022000) -#define GPIOJ_BASE ((struct gpio_reg_map*)0x40022400) -#define GPIOK_BASE ((struct gpio_reg_map*)0x40022800) - -/* - * GPIO register bit definitions - */ - -#define GPIO_MODE_INPUT 0 -#define GPIO_MODE_OUTPUT 1 -#define GPIO_MODE_AF 2 -#define GPIO_MODE_ANALOG 3 - -#define GPIO_PUPD_INPUT_FLOATING (0 << 2) -#define GPIO_PUPD_INPUT_PU (1 << 2) -#define GPIO_PUPD_INPUT_PD (2 << 2) - -#define GPIO_OSPEED_2MHZ (0 << 4) -#define GPIO_OSPEED_25MHZ (1 << 4) -#define GPIO_OSPEED_50MHZ (2 << 4) -#define GPIO_OSPEED_100MHZ (3 << 4) - -#define GPIO_OTYPE_PP (0 << 6) -#define GPIO_OTYPE_OD (1 << 6) - -// IO port register definition - -// Offset definition -#define MODER_offset 0x00 -#define OTYPER_offset 0x04 -#define OSPEEDR_offset 0x08 -#define PUPDR_offset 0x0C -#define IDR_offset 0x10 -#define ODR_offset 0x14 -#define BSRR_offset 0x18 -#define LCKR_offset 0x1C -#define AFRL_offset 0x20 -#define AFRH_offset 0x24 - -/* -MODER -00: Input (reset state) -01: General purpose output mode -10: Alternate function mode -11: Analog mode - -OTYPER -0: Output push-pull (reset state) -1: Output open-drain - -OSPEEDR -00: 2 MHz Low speed -01: 25 MHz Medium speed -10: 50 MHz Fast speed -11: 100 MHz High speed on 30 pF (80 MHz Output max speed on 15 pF) - -PUPDR -00: No pull-up, pull-down -01: Pull-up -10: Pull-down - -AFRL 4 bit AF00-AF15 -AFRH 4 bit AF00-AF15 -*/ - -// GPIOA - -#define GPIOA_MODER (uint32_t)GPIOA_BASE+(uint32_t)MODER_offset -#define GPIOA_OTYPER (uint32_t)GPIOA_BASE+(uint32_t)OTYPER_offset -#define GPIOA_OSPEEDR (uint32_t)GPIOA_BASE+(uint32_t)OSPEEDR_offset -#define GPIOA_PUPDR (uint32_t)GPIOA_BASE+(uint32_t)PUPDR_offset -#define GPIOA_IDR (uint32_t)GPIOA_BASE+(uint32_t)IDR_offset -#define GPIOA_ODR (uint32_t)GPIOA_BASE+(uint32_t)ODR_offset -#define GPIOA_BSRR (uint32_t)GPIOA_BASE+(uint32_t)BSRR_offset -#define GPIOA_LCKR (uint32_t)GPIOA_BASE+(uint32_t)LCKR_offset -#define GPIOA_AFRL (uint32_t)GPIOA_BASE+(uint32_t)AFRL_offset -#define GPIOA_AFRH (uint32_t)GPIOA_BASE+(uint32_t)AFRH_offset - -// GPIOB - -#define GPIOB_MODER (uint32_t)GPIOB_BASE+(uint32_t)MODER_offset -#define GPIOB_OTYPER (uint32_t)GPIOB_BASE+(uint32_t)OTYPER_offset -#define GPIOB_OSPEEDR (uint32_t)GPIOB_BASE+(uint32_t)OSPEEDR_offset -#define GPIOB_PUPDR (uint32_t)GPIOB_BASE+(uint32_t)PUPDR_offset -#define GPIOB_IDR (uint32_t)GPIOB_BASE+(uint32_t)IDR_offset -#define GPIOB_ODR (uint32_t)GPIOB_BASE+(uint32_t)ODR_offset -#define GPIOB_BSRR (uint32_t)GPIOB_BASE+(uint32_t)BSRR_offset -#define GPIOB_LCKR (uint32_t)GPIOB_BASE+(uint32_t)LCKR_offset -#define GPIOB_AFRL (uint32_t)GPIOB_BASE+(uint32_t)AFRL_offset -#define GPIOB_AFRH (uint32_t)GPIOB_BASE+(uint32_t)AFRH_offset - -// GPIOC - -#define GPIOC_MODER (uint32_t)GPIOC_BASE+(uint32_t)MODER_offset -#define GPIOC_OTYPER (uint32_t)GPIOC_BASE+(uint32_t)OTYPER_offset -#define GPIOC_OSPEEDR (uint32_t)GPIOC_BASE+(uint32_t)OSPEEDR_offset -#define GPIOC_PUPDR (uint32_t)GPIOC_BASE+(uint32_t)PUPDR_offset -#define GPIOC_IDR (uint32_t)GPIOC_BASE+(uint32_t)IDR_offset -#define GPIOC_ODR (uint32_t)GPIOC_BASE+(uint32_t)ODR_offset -#define GPIOC_BSRR (uint32_t)GPIOC_BASE+(uint32_t)BSRR_offset -#define GPIOC_LCKR (uint32_t)GPIOC_BASE+(uint32_t)LCKR_offset -#define GPIOC_AFRL (uint32_t)GPIOC_BASE+(uint32_t)AFRL_offset -#define GPIOC_AFRH (uint32_t)GPIOC_BASE+(uint32_t)AFRH_offset - -// GPIOD - -#define GPIOD_MODER (uint32_t)GPIOD_BASE+(uint32_t)MODER_offset -#define GPIOD_OTYPER (uint32_t)GPIOD_BASE+(uint32_t)OTYPER_offset -#define GPIOD_OSPEEDR (uint32_t)GPIOD_BASE+(uint32_t)OSPEEDR_offset -#define GPIOD_PUPDR (uint32_t)GPIOD_BASE+(uint32_t)PUPDR_offset -#define GPIOD_IDR (uint32_t)GPIOD_BASE+(uint32_t)IDR_offset -#define GPIOD_ODR (uint32_t)GPIOD_BASE+(uint32_t)ODR_offset -#define GPIOD_BSRR (uint32_t)GPIOD_BASE+(uint32_t)BSRR_offset -#define GPIOD_LCKR (uint32_t)GPIOD_BASE+(uint32_t)LCKR_offset -#define GPIOD_AFRL (uint32_t)GPIOD_BASE+(uint32_t)AFRL_offset -#define GPIOD_AFRH (uint32_t)GPIOD_BASE+(uint32_t)AFRH_offset - -// GPIOE - -#define GPIOE_MODER (uint32_t)GPIOE_BASE+(uint32_t)MODER_offset -#define GPIOE_OTYPER (uint32_t)GPIOE_BASE+(uint32_t)OTYPER_offset -#define GPIOE_OSPEEDR (uint32_t)GPIOE_BASE+(uint32_t)OSPEEDR_offset -#define GPIOE_PUPDR (uint32_t)GPIOE_BASE+(uint32_t)PUPDR_offset -#define GPIOE_IDR (uint32_t)GPIOE_BASE+(uint32_t)IDR_offset -#define GPIOE_ODR (uint32_t)GPIOE_BASE+(uint32_t)ODR_offset -#define GPIOE_BSRR (uint32_t)GPIOE_BASE+(uint32_t)BSRR_offset -#define GPIOE_LCKR (uint32_t)GPIOE_BASE+(uint32_t)LCKR_offset -#define GPIOE_AFRL (uint32_t)GPIOE_BASE+(uint32_t)AFRL_offset -#define GPIOE_AFRH (uint32_t)GPIOE_BASE+(uint32_t)AFRH_offset - -// GPIOF - -#define GPIOF_MODER (uint32_t)GPIOF_BASE+(uint32_t)MODER_offset -#define GPIOF_OTYPER (uint32_t)GPIOF_BASE+(uint32_t)OTYPER_offset -#define GPIOF_OSPEEDR (uint32_t)GPIOF_BASE+(uint32_t)OSPEEDR_offset -#define GPIOF_PUPDR (uint32_t)GPIOF_BASE+(uint32_t)PUPDR_offset -#define GPIOF_IDR (uint32_t)GPIOF_BASE+(uint32_t)IDR_offset -#define GPIOF_ODR (uint32_t)GPIOF_BASE+(uint32_t)ODR_offset -#define GPIOF_BSRR (uint32_t)GPIOF_BASE+(uint32_t)BSRR_offset -#define GPIOF_LCKR (uint32_t)GPIOF_BASE+(uint32_t)LCKR_offset -#define GPIOF_AFRL (uint32_t)GPIOF_BASE+(uint32_t)AFRL_offset -#define GPIOF_AFRH (uint32_t)GPIOF_BASE+(uint32_t)AFRH_offset - -// GPIOG - -#define GPIOG_MODER (uint32_t)GPIOG_BASE+(uint32_t)MODER_offset -#define GPIOG_OTYPER (uint32_t)GPIOG_BASE+(uint32_t)OTYPER_offset -#define GPIOG_OSPEEDR (uint32_t)GPIOG_BASE+(uint32_t)OSPEEDR_offset -#define GPIOG_PUPDR (uint32_t)GPIOG_BASE+(uint32_t)PUPDR_offset -#define GPIOG_IDR (uint32_t)GPIOG_BASE+(uint32_t)IDR_offset -#define GPIOG_ODR (uint32_t)GPIOG_BASE+(uint32_t)ODR_offset -#define GPIOG_BSRR (uint32_t)GPIOG_BASE+(uint32_t)BSRR_offset -#define GPIOG_LCKR (uint32_t)GPIOG_BASE+(uint32_t)LCKR_offset -#define GPIOG_AFRL (uint32_t)GPIOG_BASE+(uint32_t)AFRL_offset -#define GPIOG_AFRH (uint32_t)GPIOG_BASE+(uint32_t)AFRH_offset - -// GPIOH - -#define GPIOH_MODER (uint32_t)GPIOH_BASE+(uint32_t)MODER_offset -#define GPIOH_OTYPER (uint32_t)GPIOH_BASE+(uint32_t)OTYPER_offset -#define GPIOH_OSPEEDR (uint32_t)GPIOH_BASE+(uint32_t)OSPEEDR_offset -#define GPIOH_PUPDR (uint32_t)GPIOH_BASE+(uint32_t)PUPDR_offset -#define GPIOH_IDR (uint32_t)GPIOH_BASE+(uint32_t)IDR_offset -#define GPIOH_ODR (uint32_t)GPIOH_BASE+(uint32_t)ODR_offset -#define GPIOH_BSRR (uint32_t)GPIOH_BASE+(uint32_t)BSRR_offset -#define GPIOH_LCKR (uint32_t)GPIOH_BASE+(uint32_t)LCKR_offset -#define GPIOH_AFRL (uint32_t)GPIOH_BASE+(uint32_t)AFRL_offset -#define GPIOH_AFRH (uint32_t)GPIOH_BASE+(uint32_t)AFRH_offset - -// GPIOI - -#define GPIOI_MODER (uint32_t)GPIOI_BASE+(uint32_t)MODER_offset -#define GPIOI_OTYPER (uint32_t)GPIOI_BASE+(uint32_t)OTYPER_offset -#define GPIOI_OSPEEDR (uint32_t)GPIOI_BASE+(uint32_t)OSPEEDR_offset -#define GPIOI_PUPDR (uint32_t)GPIOI_BASE+(uint32_t)PUPDR_offset -#define GPIOI_IDR (uint32_t)GPIOI_BASE+(uint32_t)IDR_offset -#define GPIOI_ODR (uint32_t)GPIOI_BASE+(uint32_t)ODR_offset -#define GPIOI_BSRR (uint32_t)GPIOI_BASE+(uint32_t)BSRR_offset -#define GPIOI_LCKR (uint32_t)GPIOI_BASE+(uint32_t)LCKR_offset -#define GPIOI_AFRL (uint32_t)GPIOI_BASE+(uint32_t)AFRL_offset -#define GPIOI_AFRH (uint32_t)GPIOI_BASE+(uint32_t)AFRH_offset - -// GPIOJ - -#define GPIOJ_MODER (uint32_t)GPIOJ_BASE+(uint32_t)MODER_offset -#define GPIOJ_OTYPER (uint32_t)GPIOJ_BASE+(uint32_t)OTYPER_offset -#define GPIOJ_OSPEEDR (uint32_t)GPIOJ_BASE+(uint32_t)OSPEEDR_offset -#define GPIOJ_PUPDR (uint32_t)GPIOJ_BASE+(uint32_t)PUPDR_offset -#define GPIOJ_IDR (uint32_t)GPIOJ_BASE+(uint32_t)IDR_offset -#define GPIOJ_ODR (uint32_t)GPIOJ_BASE+(uint32_t)ODR_offset -#define GPIOJ_BSRR (uint32_t)GPIOJ_BASE+(uint32_t)BSRR_offset -#define GPIOJ_LCKR (uint32_t)GPIOJ_BASE+(uint32_t)LCKR_offset -#define GPIOJ_AFRL (uint32_t)GPIOJ_BASE+(uint32_t)AFRL_offset -#define GPIOJ_AFRH (uint32_t)GPIOJ_BASE+(uint32_t)AFRH_offset - -// GPIOK - -#define GPIOK_MODER (uint32_t)GPIOK_BASE+(uint32_t)MODER_offset -#define GPIOK_OTYPER (uint32_t)GPIOK_BASE+(uint32_t)OTYPER_offset -#define GPIOK_OSPEEDR (uint32_t)GPIOK_BASE+(uint32_t)OSPEEDR_offset -#define GPIOK_PUPDR (uint32_t)GPIOK_BASE+(uint32_t)PUPDR_offset -#define GPIOK_IDR (uint32_t)GPIOK_BASE+(uint32_t)IDR_offset -#define GPIOK_ODR (uint32_t)GPIOK_BASE+(uint32_t)ODR_offset -#define GPIOK_BSRR (uint32_t)GPIOK_BASE+(uint32_t)BSRR_offset -#define GPIOK_LCKR (uint32_t)GPIOK_BASE+(uint32_t)LCKR_offset -#define GPIOK_AFRL (uint32_t)GPIOK_BASE+(uint32_t)AFRL_offset -#define GPIOK_AFRH (uint32_t)GPIOK_BASE+(uint32_t)AFRH_offset - -/** - * @brief GPIO Pin modes. - * - * These only allow for 50MHZ max output speeds; if you want slower, - * use direct register access. - */ -typedef enum gpio_pin_mode { - /**< Output push-pull. */ - GPIO_OUTPUT_PP = (GPIO_MODE_OUTPUT | GPIO_OTYPE_PP | GPIO_OSPEED_50MHZ), - /**< Output open-drain. */ - GPIO_OUTPUT_OD = (GPIO_MODE_OUTPUT | GPIO_OTYPE_OD | GPIO_OSPEED_50MHZ), - /**< Alternate function output push-pull. */ - GPIO_AF_OUTPUT_PP = (GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_50MHZ), - /**< Alternate function output open drain. */ - GPIO_AF_OUTPUT_OD = (GPIO_MODE_AF | GPIO_OTYPE_OD | GPIO_OSPEED_50MHZ), - /**< Analog input. */ - GPIO_INPUT_ANALOG = (GPIO_MODE_ANALOG), - /**< Input floating. */ - GPIO_INPUT_FLOATING = (GPIO_MODE_INPUT | GPIO_PUPD_INPUT_FLOATING), - /**< Input pull-down. */ - GPIO_INPUT_PD = (GPIO_MODE_INPUT | GPIO_PUPD_INPUT_PD), - /**< Input pull-up. */ - GPIO_INPUT_PU = (GPIO_MODE_INPUT | GPIO_PUPD_INPUT_PU), - /**< Input pull-down. */ - GPIO_AF_INPUT_PD = (GPIO_MODE_AF | GPIO_PUPD_INPUT_PD), - GPIO_BIGNUMBER = 0xfff -} gpio_pin_mode; - -/* - * GPIO Convenience routines - */ - -void gpio_init(gpio_dev *dev); -void gpio_init_all(void); -void gpio_set_mode(gpio_dev *dev, uint8 pin, gpio_pin_mode mode); -void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode); - -/** - * @brief Get a GPIO port's corresponding afio_exti_port. - * @param dev GPIO device whose afio_exti_port to return. - */ -static inline afio_exti_port gpio_exti_port(gpio_dev *dev) { - return dev->exti_port; -} - -/** - * Set or reset a GPIO pin. - * - * Pin must have previously been configured to output mode. - * - * @param dev GPIO device whose pin to set. - * @param pin Pin on to set or reset - * @param val If true, set the pin. If false, reset the pin. - */ -static inline void gpio_write_bit(gpio_dev *dev, uint8 pin, uint8 val) { - if (val) { - dev->regs->BSRRL = BIT(pin); - } else { - dev->regs->BSRRH = BIT(pin); - } -} - -/** - * Determine whether or not a GPIO pin is set. - * - * Pin must have previously been configured to input mode. - * - * @param dev GPIO device whose pin to test. - * @param pin Pin on dev to test. - * @return True if the pin is set, false otherwise. - */ -static inline uint32 gpio_read_bit(gpio_dev *dev, uint8 pin) { - return dev->regs->IDR & BIT(pin); -} - -/** - * Toggle a pin configured as output push-pull. - * @param dev GPIO device. - * @param pin Pin on dev to toggle. - */ -static inline void gpio_toggle_bit(gpio_dev *dev, uint8 pin) { - dev->regs->ODR = dev->regs->ODR ^ BIT(pin); -} - -/* - * AFIO register map - */ - -/** AFIO register map */ -typedef struct syscfg_reg_map { - __io uint32 MEMRM; /**< memory remap register */ - __io uint32 PMC; /**< peripheral mode configuration register */ - __io uint32 EXTICR1; /**< External interrupt configuration register 1. */ - __io uint32 EXTICR2; /**< External interrupt configuration register 2. */ - __io uint32 EXTICR3; /**< External interrupt configuration register 3. */ - __io uint32 EXTICR4; /**< External interrupt configuration register 4. */ - __io uint32 CMPCR; /**< Compensation cell control register */ -} syscfg_reg_map; - -/** AFIO register map base pointer. */ -#define SYSCFG_BASE ((struct syscfg_reg_map *)0x40013800) - -/* - * AFIO register bit definitions - */ - -/* Event control register */ - -#define AFIO_EVCR_EVOE (0x1 << 7) -#define AFIO_EVCR_PORT_PA (0x0 << 4) -#define AFIO_EVCR_PORT_PB (0x1 << 4) -#define AFIO_EVCR_PORT_PC (0x2 << 4) -#define AFIO_EVCR_PORT_PD (0x3 << 4) -#define AFIO_EVCR_PORT_PE (0x4 << 4) -#define AFIO_EVCR_PIN_0 0x0 -#define AFIO_EVCR_PIN_1 0x1 -#define AFIO_EVCR_PIN_2 0x2 -#define AFIO_EVCR_PIN_3 0x3 -#define AFIO_EVCR_PIN_4 0x4 -#define AFIO_EVCR_PIN_5 0x5 -#define AFIO_EVCR_PIN_6 0x6 -#define AFIO_EVCR_PIN_7 0x7 -#define AFIO_EVCR_PIN_8 0x8 -#define AFIO_EVCR_PIN_9 0x9 -#define AFIO_EVCR_PIN_10 0xA -#define AFIO_EVCR_PIN_11 0xB -#define AFIO_EVCR_PIN_12 0xC -#define AFIO_EVCR_PIN_13 0xD -#define AFIO_EVCR_PIN_14 0xE -#define AFIO_EVCR_PIN_15 0xF - -/* AF remap and debug I/O configuration register */ - -#define AFIO_MAPR_SWJ_CFG (0x7 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ (0x0 << 24) -#define AFIO_MAPR_SWJ_CFG_FULL_SWJ_NO_NJRST (0x1 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) -#define AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW (0x4 << 24) -#define AFIO_MAPR_ADC2_ETRGREG_REMAP BIT(20) -#define AFIO_MAPR_ADC2_ETRGINJ_REMAP BIT(19) -#define AFIO_MAPR_ADC1_ETRGREG_REMAP BIT(18) -#define AFIO_MAPR_ADC1_ETRGINJ_REMAP BIT(17) -#define AFIO_MAPR_TIM5CH4_IREMAP BIT(16) -#define AFIO_MAPR_PD01_REMAP BIT(15) -#define AFIO_MAPR_CAN_REMAP (0x3 << 13) -#define AFIO_MAPR_CAN_REMAP_NONE (0x0 << 13) -#define AFIO_MAPR_CAN_REMAP_PB8_PB9 (0x2 << 13) -#define AFIO_MAPR_CAN_REMAP_PD0_PD1 (0x3 << 13) -#define AFIO_MAPR_TIM4_REMAP BIT(12) -#define AFIO_MAPR_TIM3_REMAP (0x3 << 10) -#define AFIO_MAPR_TIM3_REMAP_NONE (0x0 << 10) -#define AFIO_MAPR_TIM3_REMAP_PARTIAL (0x2 << 10) -#define AFIO_MAPR_TIM3_REMAP_FULL (0x3 << 10) -#define AFIO_MAPR_TIM2_REMAP (0x3 << 8) -#define AFIO_MAPR_TIM2_REMAP_NONE (0x0 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA15_PB3_PA2_PA3 (0x1 << 8) -#define AFIO_MAPR_TIM2_REMAP_PA0_PA1_PB10_PB11 (0x2 << 8) -#define AFIO_MAPR_TIM2_REMAP_FULL (0x3 << 8) -#define AFIO_MAPR_TIM1_REMAP (0x3 << 6) -#define AFIO_MAPR_TIM1_REMAP_NONE (0x0 << 6) -#define AFIO_MAPR_TIM1_REMAP_PARTIAL (0x1 << 6) -#define AFIO_MAPR_TIM1_REMAP_FULL (0x3 << 6) -#define AFIO_MAPR_USART3_REMAP (0x3 << 4) -#define AFIO_MAPR_USART3_REMAP_NONE (0x0 << 4) -#define AFIO_MAPR_USART3_REMAP_PARTIAL (0x1 << 4) -#define AFIO_MAPR_USART3_REMAP_FULL (0x3 << 4) -#define AFIO_MAPR_USART2_REMAP BIT(3) -#define AFIO_MAPR_USART1_REMAP BIT(2) -#define AFIO_MAPR_I2C1_REMAP BIT(1) -#define AFIO_MAPR_SPI1_REMAP BIT(0) - -/* External interrupt configuration register 1 */ - -#define AFIO_EXTICR1_EXTI3 (0xF << 12) -#define AFIO_EXTICR1_EXTI3_PA (0x0 << 12) -#define AFIO_EXTICR1_EXTI3_PB (0x1 << 12) -#define AFIO_EXTICR1_EXTI3_PC (0x2 << 12) -#define AFIO_EXTICR1_EXTI3_PD (0x3 << 12) -#define AFIO_EXTICR1_EXTI3_PE (0x4 << 12) -#define AFIO_EXTICR1_EXTI3_PF (0x5 << 12) -#define AFIO_EXTICR1_EXTI3_PG (0x6 << 12) -#define AFIO_EXTICR1_EXTI2 (0xF << 8) -#define AFIO_EXTICR1_EXTI2_PA (0x0 << 8) -#define AFIO_EXTICR1_EXTI2_PB (0x1 << 8) -#define AFIO_EXTICR1_EXTI2_PC (0x2 << 8) -#define AFIO_EXTICR1_EXTI2_PD (0x3 << 8) -#define AFIO_EXTICR1_EXTI2_PE (0x4 << 8) -#define AFIO_EXTICR1_EXTI2_PF (0x5 << 8) -#define AFIO_EXTICR1_EXTI2_PG (0x6 << 8) -#define AFIO_EXTICR1_EXTI1 (0xF << 4) -#define AFIO_EXTICR1_EXTI1_PA (0x0 << 4) -#define AFIO_EXTICR1_EXTI1_PB (0x1 << 4) -#define AFIO_EXTICR1_EXTI1_PC (0x2 << 4) -#define AFIO_EXTICR1_EXTI1_PD (0x3 << 4) -#define AFIO_EXTICR1_EXTI1_PE (0x4 << 4) -#define AFIO_EXTICR1_EXTI1_PF (0x5 << 4) -#define AFIO_EXTICR1_EXTI1_PG (0x6 << 4) -#define AFIO_EXTICR1_EXTI0 0xF -#define AFIO_EXTICR1_EXTI0_PA 0x0 -#define AFIO_EXTICR1_EXTI0_PB 0x1 -#define AFIO_EXTICR1_EXTI0_PC 0x2 -#define AFIO_EXTICR1_EXTI0_PD 0x3 -#define AFIO_EXTICR1_EXTI0_PE 0x4 -#define AFIO_EXTICR1_EXTI0_PF 0x5 -#define AFIO_EXTICR1_EXTI0_PG 0x6 - -/* External interrupt configuration register 2 */ - -#define AFIO_EXTICR2_EXTI7 (0xF << 12) -#define AFIO_EXTICR2_EXTI7_PA (0x0 << 12) -#define AFIO_EXTICR2_EXTI7_PB (0x1 << 12) -#define AFIO_EXTICR2_EXTI7_PC (0x2 << 12) -#define AFIO_EXTICR2_EXTI7_PD (0x3 << 12) -#define AFIO_EXTICR2_EXTI7_PE (0x4 << 12) -#define AFIO_EXTICR2_EXTI7_PF (0x5 << 12) -#define AFIO_EXTICR2_EXTI7_PG (0x6 << 12) -#define AFIO_EXTICR2_EXTI6 (0xF << 8) -#define AFIO_EXTICR2_EXTI6_PA (0x0 << 8) -#define AFIO_EXTICR2_EXTI6_PB (0x1 << 8) -#define AFIO_EXTICR2_EXTI6_PC (0x2 << 8) -#define AFIO_EXTICR2_EXTI6_PD (0x3 << 8) -#define AFIO_EXTICR2_EXTI6_PE (0x4 << 8) -#define AFIO_EXTICR2_EXTI6_PF (0x5 << 8) -#define AFIO_EXTICR2_EXTI6_PG (0x6 << 8) -#define AFIO_EXTICR2_EXTI5 (0xF << 4) -#define AFIO_EXTICR2_EXTI5_PA (0x0 << 4) -#define AFIO_EXTICR2_EXTI5_PB (0x1 << 4) -#define AFIO_EXTICR2_EXTI5_PC (0x2 << 4) -#define AFIO_EXTICR2_EXTI5_PD (0x3 << 4) -#define AFIO_EXTICR2_EXTI5_PE (0x4 << 4) -#define AFIO_EXTICR2_EXTI5_PF (0x5 << 4) -#define AFIO_EXTICR2_EXTI5_PG (0x6 << 4) -#define AFIO_EXTICR2_EXTI4 0xF -#define AFIO_EXTICR2_EXTI4_PA 0x0 -#define AFIO_EXTICR2_EXTI4_PB 0x1 -#define AFIO_EXTICR2_EXTI4_PC 0x2 -#define AFIO_EXTICR2_EXTI4_PD 0x3 -#define AFIO_EXTICR2_EXTI4_PE 0x4 -#define AFIO_EXTICR2_EXTI4_PF 0x5 -#define AFIO_EXTICR2_EXTI4_PG 0x6 - -/* AF remap and debug I/O configuration register 2 */ - -#define AFIO_MAPR2_FSMC_NADV BIT(10) -#define AFIO_MAPR2_TIM14_REMAP BIT(9) -#define AFIO_MAPR2_TIM13_REMAP BIT(8) -#define AFIO_MAPR2_TIM11_REMAP BIT(7) -#define AFIO_MAPR2_TIM10_REMAP BIT(6) -#define AFIO_MAPR2_TIM9_REMAP BIT(5) - -/* - * AFIO convenience routines - */ - -void afio_init(void); - -/** - * External interrupt line numbers. - */ -typedef enum afio_exti_num { - AFIO_EXTI_0, /**< External interrupt line 0. */ - AFIO_EXTI_1, /**< External interrupt line 1. */ - AFIO_EXTI_2, /**< External interrupt line 2. */ - AFIO_EXTI_3, /**< External interrupt line 3. */ - AFIO_EXTI_4, /**< External interrupt line 4. */ - AFIO_EXTI_5, /**< External interrupt line 5. */ - AFIO_EXTI_6, /**< External interrupt line 6. */ - AFIO_EXTI_7, /**< External interrupt line 7. */ - AFIO_EXTI_8, /**< External interrupt line 8. */ - AFIO_EXTI_9, /**< External interrupt line 9. */ - AFIO_EXTI_10, /**< External interrupt line 10. */ - AFIO_EXTI_11, /**< External interrupt line 11. */ - AFIO_EXTI_12, /**< External interrupt line 12. */ - AFIO_EXTI_13, /**< External interrupt line 13. */ - AFIO_EXTI_14, /**< External interrupt line 14. */ - AFIO_EXTI_15, /**< External interrupt line 15. */ -} afio_exti_num; - -void afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port); - -/* HACK: Use upper bit to denote MAPR2, Bit 31 is reserved and - * not used in either MAPR or MAPR2 */ -#define AFIO_REMAP_USE_MAPR2 (1 << 31) - -/** - * @brief Available peripheral remaps. - * @see afio_remap() - */ -typedef enum afio_remap_peripheral { - /**= GPIO_PINS || !handler) { - return; - } - - exti_trigger_mode outMode = exti_out_mode(mode); - - exti_attach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit), - gpio_exti_port(PIN_MAP[pin].gpio_device), - handler, - outMode); -} - -/** - * @brief Disable any external interrupt attached to a pin. - * @param pin Pin number to detach any interrupt from. - */ -void detachInterrupt(uint8 pin) { - if (pin >= GPIO_PINS) { - return; - } - - exti_detach_interrupt((afio_exti_num)(PIN_MAP[pin].gpio_bit)); -} - -static inline exti_trigger_mode exti_out_mode(ExtIntTriggerMode mode) { - switch (mode) { - case RISING: - return EXTI_RISING; - case FALLING: - return EXTI_FALLING; - case CHANGE: - return EXTI_RISING_FALLING; - } - // Can't happen - ASSERT(0); - return (exti_trigger_mode)0; -} diff --git a/cores/arduino/interrupts.h b/cores/arduino/interrupts.h deleted file mode 100755 index 481858e..0000000 --- a/cores/arduino/interrupts.h +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -#include "types.h" -#include "nvic.h" - -/** - * @file interrupts.h - * - * @brief Wiring-like external interrupt prototypes and types. - */ - -#ifndef _interruptS_H_ -#define _interruptS_H_ - -/** - * The kind of transition on an external pin which should trigger an - * interrupt. - */ -typedef enum ExtIntTriggerMode { - RISING, /**< To trigger an interrupt when the pin transitions LOW - to HIGH */ - FALLING, /**< To trigger an interrupt when the pin transitions - HIGH to LOW */ - CHANGE /**< To trigger an interrupt when the pin transitions from - LOW to HIGH or HIGH to LOW (i.e., when the pin - changes). */ -} ExtIntTriggerMode; - -/** - * @brief Registers an interrupt handler on a pin. - * - * The interrupt will be triggered on a given transition on the pin, - * as specified by the mode parameter. The handler runs in interrupt - * context. The new handler will replace whatever handler is - * currently registered for the pin, if any. - * - * @param pin Maple pin number - * @param handler Function to run upon external interrupt trigger. - * The handler should take no arguments, and have void return type. - * @param mode Type of transition to trigger on, e.g. falling, rising, etc. - * - * @sideeffect Registers a handler - * @see detachInterrupt() - */ -void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode); - -/** - * @brief Disable any registered external interrupt. - * @param pin Maple pin number - * @sideeffect unregisters external interrupt handler - * @see attachInterrupt() - */ -void detachInterrupt(uint8 pin); - -/** - * Re-enable interrupts. - * - * Call this after noInterrupts() to re-enable interrupt handling, - * after you have finished with a timing-critical section of code. - * - * @see noInterrupts() - */ -static inline void interrupts() { - nvic_globalirq_enable(); -} - -/** - * Disable interrupts. - * - * After calling this function, all user-programmable interrupts will - * be disabled. You can call this function before a timing-critical - * section of code, then call interrupts() to re-enable interrupt - * handling. - * - * @see interrupts() - */ -static inline void noInterrupts() { - nvic_globalirq_disable(); -} - -#endif - diff --git a/cores/arduino/io.h b/cores/arduino/io.h deleted file mode 100755 index b81ca2e..0000000 --- a/cores/arduino/io.h +++ /dev/null @@ -1,130 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file io.h - * - * @brief Arduino-compatible digital pin I/O interface. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - - -#ifndef _IO_H_ -#define _IO_H_ - -#include "gpio.h" -#include "adc.h" - -#include "wiring_time.h" -#include "wiring_constants.h" - -/** - * Configure behavior of a GPIO pin. - * - * @param pin Number of pin to configure. - * @param mode Mode corresponding to desired pin behavior. - * @see PinMode - */ -void pinMode(uint8 pin, uint8 mode); - -/** - * Writes a (digital) value to a pin. The pin must have its - * mode set to OUTPUT or OUTPUT_OPEN_DRAIN. - * - * @param pin Pin to write to. - * @param value Either LOW (write a 0) or HIGH (write a 1). - * @see pinMode() - */ -void digitalWrite(uint8 pin, uint8 value); - -/** - * Read a digital value from a pin. The pin must have its mode set to - * one of INPUT, INPUT_PULLUP, and INPUT_PULLDOWN. - * - * @param pin Pin to read from. - * @return LOW or HIGH. - * @see pinMode() - */ -uint32 digitalRead(uint8 pin); - -/** - * Read an analog value from pin. This function blocks during ADC - * conversion, and has 12 bits of resolution. The pin must have its - * mode set to INPUT_ANALOG. - * - * @param pin Pin to read from. - * @return Converted voltage, in the range 0--4095, (i.e. a 12-bit ADC - * conversion). - * @see pinMode() - */ -uint16 analogRead(uint8 pin); - -/** - * Toggles the digital value at the given pin. - * - * The pin must have its mode set to OUTPUT. - * - * @param pin the pin to toggle. If the pin is HIGH, set it LOW. If - * it is LOW, set it HIGH. - * - * @see pinMode() - */ -void togglePin(uint8 pin); - -/** - * Shift out a byte of data, one bit at a time. - * - * This function starts at either the most significant or least - * significant bit in a byte value, and shifts out each byte in order - * onto a data pin. After each bit is written to the data pin, a - * separate clock pin is pulsed to indicate that the new bit is - * available. - * - * @param dataPin Pin to shift data out on - * @param clockPin Pin to pulse after each bit is shifted out - * @param bitOrder Either MSBFIRST (big-endian) or LSBFIRST (little-endian). - * @param value Value to shift out - */ -void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 value); - -/** -* This function is used to set the DAC operation -* @param DACChanne Pin used by DAC -*/ - -void setDac(uint8 pin); - -void analogReadResolution (int resolution); - -uint32_t pulseIn( uint8 pin, uint32_t state, uint32_t timeout = 1000000); - -#define microsecondsToClockCycles(a) ( (a) * (SystemCoreClock / 1000000L) ) - -#endif diff --git a/cores/arduino/itoa.c b/cores/arduino/itoa.c old mode 100755 new mode 100644 index fc35766..ee74f82 --- a/cores/arduino/itoa.c +++ b/cores/arduino/itoa.c @@ -120,8 +120,12 @@ extern char* ltoa( long value, char *string, int radix ) return string; } - +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) +#else extern char* utoa( unsigned long value, char *string, int radix ) +#endif { return ultoa( value, string, radix ) ; } diff --git a/cores/arduino/itoa.h b/cores/arduino/itoa.h old mode 100755 new mode 100644 index 59af109..b88204c --- a/cores/arduino/itoa.h +++ b/cores/arduino/itoa.h @@ -31,7 +31,12 @@ extern void itoa( int n, char s[] ) ; extern char* itoa( int value, char *string, int radix ) ; extern char* ltoa( long value, char *string, int radix ) ; +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ > 9 || \ + (__GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ > 2))) +extern char* utoa( unsigned value, char *string, int radix ) ; +#else extern char* utoa( unsigned long value, char *string, int radix ) ; +#endif extern char* ultoa( unsigned long value, char *string, int radix ) ; #endif /* 0 */ diff --git a/cores/arduino/iwdg.c b/cores/arduino/iwdg.c deleted file mode 100755 index 63c1b2b..0000000 --- a/cores/arduino/iwdg.c +++ /dev/null @@ -1,62 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file iwdg.c - * @brief Independent watchdog (IWDG) support - */ - -#include "iwdg.h" - -/** - * @brief Initialise and start the watchdog - * - * The prescaler and reload set the timeout. For example, a prescaler - * of IWDG_PRE_32 divides the 40 kHz clock by 32 and gives roughly 1 - * ms per reload. - * - * @param prescaler Prescaler for the 40 kHz IWDG clock. - * @param reload Independent watchdog counter reload value. - */ -void iwdg_init(iwdg_prescaler prescaler, uint16 reload) { - IWDG_BASE->KR = IWDG_KR_UNLOCK; - IWDG_BASE->PR = prescaler; - IWDG_BASE->RLR = reload; - - /* Start things off */ - IWDG_BASE->KR = IWDG_KR_START; - iwdg_feed(); -} - -/** - * @brief Reset the IWDG counter. - * - * Calling this function will cause the IWDG counter to be reset to - * its reload value. - */ -void iwdg_feed(void) { - IWDG_BASE->KR = IWDG_KR_FEED; -} diff --git a/cores/arduino/iwdg.h b/cores/arduino/iwdg.h deleted file mode 100755 index e61e51c..0000000 --- a/cores/arduino/iwdg.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Michael Hope. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file iwdg.h - * @author Michael Hope, Marti Bolivar - * @brief Independent watchdog support. - * - * To use the independent watchdog, first call iwdg_init() with the - * appropriate prescaler and IWDG counter reload values for your - * application. Afterwards, you must periodically call iwdg_feed() - * before the IWDG counter reaches 0 to reset the counter to its - * reload value. If you do not, the chip will reset. - * - * Once started, the independent watchdog cannot be turned off. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _IWDG_H_ -#define _IWDG_H_ - -#include "types.h" -#include "util.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register map - */ - -/** Independent watchdog register map type. */ -typedef struct iwdg_reg_map { - __io uint32 KR; /**< Key register. */ - __io uint32 PR; /**< Prescaler register. */ - __io uint32 RLR; /**< Reload register. */ - __io uint32 SR; /**< Status register */ -} iwdg_reg_map; - -/** Independent watchdog base pointer */ -#define IWDG_BASE ((struct iwdg_reg_map*)0x40003000) - -/* - * Register bit definitions - */ - -/* Key register */ - -#define IWDG_KR_UNLOCK 0x5555 -#define IWDG_KR_FEED 0xAAAA -#define IWDG_KR_START 0xCCCC - -/* Prescaler register */ - -#define IWDG_PR_DIV_4 0x0 -#define IWDG_PR_DIV_8 0x1 -#define IWDG_PR_DIV_16 0x2 -#define IWDG_PR_DIV_32 0x3 -#define IWDG_PR_DIV_64 0x4 -#define IWDG_PR_DIV_128 0x5 -#define IWDG_PR_DIV_256 0x6 - -/* Status register */ - -#define IWDG_SR_RVU_BIT 1 -#define IWDG_SR_PVU_BIT 0 - -#define IWDG_SR_RVU BIT(IWDG_SR_RVU_BIT) -#define IWDG_SR_PVU BIT(IWDG_SR_PVU_BIT) - -/** - * @brief Independent watchdog prescalers. - * - * These divide the 40 kHz IWDG clock. - */ -typedef enum iwdg_prescaler { - IWDG_PRE_4 = IWDG_PR_DIV_4, /**< Divide by 4 */ - IWDG_PRE_8 = IWDG_PR_DIV_8, /**< Divide by 8 */ - IWDG_PRE_16 = IWDG_PR_DIV_16, /**< Divide by 16 */ - IWDG_PRE_32 = IWDG_PR_DIV_32, /**< Divide by 32 */ - IWDG_PRE_64 = IWDG_PR_DIV_64, /**< Divide by 64 */ - IWDG_PRE_128 = IWDG_PR_DIV_128, /**< Divide by 128 */ - IWDG_PRE_256 = IWDG_PR_DIV_256 /**< Divide by 256 */ -} iwdg_prescaler; - -void iwdg_init(iwdg_prescaler prescaler, uint16 reload); -void iwdg_feed(void); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp old mode 100755 new mode 100644 index 2044961..1508162 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -1,72 +1,56 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ +/* + main.cpp - Main loop for Arduino sketches + Copyright (c) 2005-2013 Arduino Team. All right reserved. - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -#include "usb_device.h" -#include "usbd_core.h" -#include "usbd_cdc_if.h" -#include "io.h" + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -extern void setup(void); -extern void loop(void); -extern void init(void); + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#define ARDUINO_MAIN +#include "Arduino.h" -extern USBD_HandleTypeDef hUsbDeviceFS; +// Weak empty variant initialization function. +// May be redefined by variant files. +void initVariant() __attribute__((weak)); +void initVariant() { } -// Force init to be called *first*, i.e. before static object allocation. -// Otherwise, statically allocated objects that need libmaple may fail. - __attribute__(( constructor )) void premain() { - init(); -} +/* + * \brief Main entry point of Arduino application + */ +int main( void ) +{ + init(); -int main(void) { + initVariant(); - /* Initialize USB device stack */ - uint8_t ttBuf[1]={9}; - MX_USB_DEVICE_Init(); + delay(1); - /* Enable FPU - * Note: this should have already been done in SystemInit() in HAL/src/system_stm32f4xx.c */ - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - analogReadResolution(10); - - // Set MIC Connected to CODEC - pinMode(MIC_SEL, OUTPUT); - digitalWrite(MIC_SEL, CODEC); +#if defined(USBCON) + usbd_interface_init(); +#endif + // Set MIC Connected to CODEC + pinMode(MIC_SEL, OUTPUT); + digitalWrite(MIC_SEL, CODEC); setup(); - while (1) { + for (;;) + { loop(); + if (serialEventRun) serialEventRun(); } + return 0; } diff --git a/cores/arduino/memory.h b/cores/arduino/memory.h deleted file mode 100755 index 52394be..0000000 --- a/cores/arduino/memory.h +++ /dev/null @@ -1,44 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file memory.h - * @brief General include file for libmaple - */ - -#ifndef _MEMORY_H_ -#define _MEMORY_H_ - -#include "types.h" -#include "stm32.h" -#include "util.h" -#include "delay.h" - -#define USER_ADDR_ROM 0x08005000 -#define USER_ADDR_RAM 0x20000C00 -#define STACK_TOP 0x20000800 - -#endif diff --git a/cores/arduino/new.cpp b/cores/arduino/new.cpp new file mode 100644 index 0000000..f189775 --- /dev/null +++ b/cores/arduino/new.cpp @@ -0,0 +1,36 @@ +/* + Copyright (c) 2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#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); +} + diff --git a/cores/arduino/nvic.c b/cores/arduino/nvic.c deleted file mode 100755 index 3be5a5a..0000000 --- a/cores/arduino/nvic.c +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file nvic.c - * @brief Nested vector interrupt controller support. - */ - -#include "nvic.h" -#include "scb.h" -#include "stm32.h" - -/** - * @brief Set interrupt priority for an interrupt line - * - * Note: The STM32 only implements 4 bits of priority, ignoring the - * lower 4 bits. This means there are only 16 levels of priority. - * Bits[3:0] read as zero and ignore writes. - * - * @param irqn device to set - * @param priority Priority to set, 0 being highest priority and 15 - * being lowest. - */ -void nvic_irq_set_priority(nvic_irq_num irqn, uint8 priority) { - if (irqn < 0) { - /* This interrupt is in the system handler block */ - SCB_BASE->SHP[((uint32)irqn & 0xF) - 4] = (priority & 0xF) << 4; - } else { - NVIC_BASE->IP[irqn] = (priority & 0xF) << 4; - } -} - -/** - * @brief Initialize the NVIC - * @param vector_table_address Vector table base address. - * @param offset Offset from vector_table_address. Some restrictions - * apply to the use of nonzero offsets; see ST RM0008 - * and the ARM Cortex M3 Technical Reference Manual. - */ -void nvic_init(uint32 vector_table_address, uint32 offset) { - uint32 i; - - nvic_set_vector_table(vector_table_address, offset); - - /* - * Lower priority level for all peripheral interrupts to lowest - * possible. - */ - for (i = 0; i < STM32_NR_INTERRUPTS; i++) { - nvic_irq_set_priority((nvic_irq_num)i, 0xF); - } - - /* Lower systick interrupt priority to lowest level */ - nvic_irq_set_priority(NVIC_SYSTICK, 0xF); -} - -/** - * Reset the vector table address. - */ -void nvic_set_vector_table(uint32 addr, uint32 offset) { - SCB_BASE->VTOR = addr | (offset & 0x1FFFFF80); -} diff --git a/cores/arduino/nvic.h b/cores/arduino/nvic.h deleted file mode 100755 index 0899c9c..0000000 --- a/cores/arduino/nvic.h +++ /dev/null @@ -1,279 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file nvic.h - * @brief Nested vector interrupt controller support. - * - * Basic usage: - * - * @code - * // Initialise the interrupt controller and point to the vector - * // table at the start of flash. - * nvic_init(0x08000000, 0); - * // Bind in a timer interrupt handler - * timer_attach_interrupt(TIMER_CC1_INTERRUPT, handler); - * // Optionally set the priority - * nvic_irq_set_priority(NVIC_TIMER1_CC, 5); - * // All done, enable all interrupts - * nvic_globalirq_enable(); - * @endcode - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _NVIC_H_ -#define _NVIC_H_ - -#include "types.h" -#include "util.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/** NVIC register map type. */ -typedef struct nvic_reg_map { - __io uint32 ISER[8]; /**< Interrupt Set Enable Registers */ - uint32 RESERVED0[24]; /**< Reserved */ - __io uint32 ICER[8]; /**< Interrupt Clear Enable Registers */ - uint32 RSERVED1[24]; /**< Reserved */ - __io uint32 ISPR[8]; /**< Interrupt Set Pending Registers */ - uint32 RESERVED2[24]; /**< Reserved */ - __io uint32 ICPR[8]; /**< Interrupt Clear Pending Registers */ - uint32 RESERVED3[24]; /**< Reserved */ - __io uint32 IABR[8]; /**< Interrupt Active bit Registers */ - uint32 RESERVED4[56]; /**< Reserved */ - __io uint8 IP[240]; /**< Interrupt Priority Registers */ - uint32 RESERVED5[644]; /**< Reserved */ - __io uint32 STIR; /**< Software Trigger Interrupt Registers */ -} nvic_reg_map; - -/** NVIC register map base pointer. */ -#define NVIC_BASE ((struct nvic_reg_map*)0xE000E100) - -/** - * @brief Interrupt vector table interrupt numbers. - * - * Each positive-valued enumerator is the position of the - * corresponding interrupt in the vector table. Negative-valued - * enumerators correspond to interrupts controlled by the system - * handler block. - * - * @see scb.h - */ -typedef enum nvic_irq_num { - -// NVIC_RESERVED = -// NVIC_RESET = -15 /**< Reset */ - NVIC_NMI = -14, /**< Non-maskable interrupt */ - NVIC_HARDFAULT = -13, /**< Hard fault (all class of fault) */ - NVIC_MEM_MANAGE = -12, /**< Memory management */ - NVIC_BUS_FAULT = -11, /**< Bus fault: prefetch fault, memory access fault. */ - NVIC_USAGE_FAULT = -10, /**< Usage fault: Undefined instruction or illegal state. */ -// NVIC_RESERVED = - NVIC_SVC = -5, /**< System service call via SWI insruction */ - NVIC_DEBUG_MON = -4, /**< Debug monitor */ -// NVIC_RESERVED = - NVIC_PEND_SVC = -2, /**< Pendable request for system service */ - NVIC_SYSTICK = -1, /**< System tick timer */ - NVIC_WWDG = 0, /**< Window watchdog interrupt */ - NVIC_PVD = 1, /**< PVD through EXTI line detection */ - NVIC_TAMPER = 2, /**< Tamper */ - NVIC_RTC = 3, /**< Real-time clock */ - NVIC_FLASH = 4, /**< Flash */ - NVIC_RCC = 5, /**< Reset and clock control */ - NVIC_EXTI0 = 6, /**< EXTI line 0 */ - NVIC_EXTI1 = 7, /**< EXTI line 1 */ - NVIC_EXTI2 = 8, /**< EXTI line 2 */ - NVIC_EXTI3 = 9, /**< EXTI line 3 */ - NVIC_EXTI4 = 10, /**< EXTI line 4 */ - NVIC_DMA_CH1 = 11, /**< DMA1 channel 1 (stream 0) */ - NVIC_DMA_CH2 = 12, /**< DMA1 channel 2 (stream 1) */ - NVIC_DMA_CH3 = 13, /**< DMA1 channel 3 (stream 2) */ - NVIC_DMA_CH4 = 14, /**< DMA1 channel 4 (stream 3) */ - NVIC_DMA_CH5 = 15, /**< DMA1 channel 5 (stream 4) */ - NVIC_DMA_CH6 = 16, /**< DMA1 channel 6 (stream 5) */ - NVIC_DMA_CH7 = 17, /**< DMA1 channel 7 (stream 6) */ - NVIC_ADC_1_2 = 18, /**< ADC1 and ADC2 (and 3) */ - NVIC_USB_HP_CAN_TX = 19, /**< USB high priority or CAN TX */ - NVIC_USB_LP_CAN_RX0 = 20, /**< USB low priority or CAN RX0 */ - NVIC_CAN_RX1 = 21, /**< CAN RX1 */ - NVIC_CAN_SCE = 22, /**< CAN SCE */ - NVIC_EXTI_9_5 = 23, /**< EXTI line [9:5] */ - NVIC_TIMER1_BRK = 24, /**< Timer 1 break Timer 9 global*/ - NVIC_TIMER1_UP = 25, /**< Timer 1 update */ - NVIC_TIMER1_TRG_COM = 26, /**< Timer 1 trigger and commutation Timer 11 global*/ - NVIC_TIMER1_CC = 27, /**< Timer 1 capture/compare */ - NVIC_TIMER2 = 28, /**< Timer 2 */ - NVIC_TIMER3 = 29, /**< Timer 3 */ - NVIC_TIMER4 = 30, /**< Timer 4 */ - NVIC_I2C1_EV = 31, /**< I2C1 event */ - NVIC_I2C1_ER = 32, /**< I2C1 error */ - NVIC_I2C2_EV = 33, /**< I2C2 event */ - NVIC_I2C2_ER = 34, /**< I2C2 error */ - NVIC_SPI1 = 35, /**< SPI1 */ - NVIC_SPI2 = 36, /**< SPI2 */ - NVIC_USART1 = 37, /**< USART1 */ - NVIC_USART2 = 38, /**< USART2 */ - NVIC_USART3 = 39, /**< USART3 */ - NVIC_EXTI_15_10 = 40, /**< EXTI line [15:10] */ - NVIC_RTCALARM = 41, /**< RTC alarm through EXTI line */ - NVIC_USBWAKEUP = 42, /**< USB wakeup from suspend through EXTI line */ - NVIC_TIMER8_BRK = 43, /**< Timer 8 break Timer 12 global */ - NVIC_TIMER8_UP = 44, /**< Timer 8 update Timer 13 global */ - NVIC_TIMER8_TRG_COM = 45, /**< Timer 8 trigger and commutation Timer 14 global*/ - NVIC_TIMER8_CC = 46, /**< Timer 8 capture/compare */ - NVIC_DMA1_CH8 = 46, /**< DMA1 channel 8 (stream 7) */ - NVIC_FSMC = 48, /**< FSMC */ - NVIC_SDIO = 49, /**< SDIO */ - NVIC_TIMER5 = 50, /**< Timer 5 */ - NVIC_SPI3 = 51, /**< SPI3 */ - NVIC_UART4 = 52, /**< UART4 */ - NVIC_UART5 = 53, /**< UART5 */ - NVIC_TIMER6 = 54, /**< Timer 6 and DAC1 and DAC2 underrun error */ - NVIC_TIMER7 = 55, /**< Timer 7 */ - NVIC_DMA2_CH1 = 56, /**< DMA2 channel 1 (stream 0) */ - NVIC_DMA2_CH2 = 57, /**< DMA2 channel 2 (stream 1) */ - NVIC_DMA2_CH3 = 58, /**< DMA2 channel 3 (stream 2) */ - NVIC_DMA2_CH4 = 59, /**< DMA2 channels 4 (stream 3) */ - NVIC_DMA2_CH5 = 60, /**< DMA2 channel 5 (stream 4) */ - NVIC_ETH = 61, /**< ETH Global Interrupt */ - NVIC_ETHWAKEUP = 62, /**< ETH Wakeup through EXTI line */ - NVIC_CAN2_TX = 63, /**< CAN2 TX */ - NVIC_CAN2_RX0 = 64, /**< CAN2 RX0 */ - NVIC_CAN2_RX1 = 65, /**< CAN2 RX1 */ - NVIC_CAN2_SCE = 66, /**< CAN2 SCE */ - NVIC_OTG_FS = 67, /**< USB OTG */ - NVIC_DMA2_CH6 = 68, /**< DMA2 channel 6 (stream 5) */ - NVIC_DMA2_CH7 = 69, /**< DMA2 channel 7 (stream 6) */ - NVIC_DMA2_CH8 = 70, /**< DMA2 channel 8 (stream 7) */ - NVIC_USART6 = 71, /**< USART6 */ - NVIC_I2C3_EV = 72, /**< I2C3 event */ - NVIC_I2C3_ER = 73, /**< I2C3 error */ - NVIC_OTG_HS_EP1_OUT = 74, /**< USB OTG HS End Point 1 Out */ - NVIC_OTG_HS_EP1_IN = 75, /**< USB OTG HS End Point 1 In */ - NVIC_OTG_HS_WKUP = 76, /**< USB OTG HS Wakeup Throught EXTI */ - NVIC_OTG_HS = 77, /**< USB OTG HS */ - NVIC_DCMI = 78, /**< DCMI */ - NVIC_CRYP = 79, /**< CRYP crypto */ - NVIC_HASH_RNG = 80, /**< Hash and RNG */ - NVIC_FPU = 81, /**< FPU */ - NVIC_UART7 = 82, /**< UART7 */ - NVIC_UART8 = 83, /**< UART8 */ - NVIC_SPI4 = 84, /**< SPI4 */ - NVIC_SPI5 = 85, /**< SPI5 */ - NVIC_SPI6 = 86, /**< SPI 6 */ - NVIC_SAI1 = 87, /**< SAI1 */ - NVIC_LCDTFT = 88, /**< LTDC */ - NVIC_LCDTFT_ER = 89, /**< LTDC global Error */ - NVIC_DMA2D = 90, /**< DMA2D */ - NVIC_QUADSPI = 91, /**< QuadSPI */ - NVIC_DSI = 92 /**< DSI */ - -} nvic_irq_num; - -/* - * Initialises the interrupt controller and sets all interrupts to the - * lowest priority. - * - * For stand-alone products, the base address is normally the start of - * flash (0x08000000). - * - * @param vector_table_address base address of the vector table - */ -void nvic_init(uint32 vector_table_address, uint32 offset); - -/** - * Sets the base address of the vector table. - */ -void nvic_set_vector_table(uint32 address, uint32 offset); - -void nvic_irq_set_priority(nvic_irq_num irqn, uint8 priority); - -/** - * Enables interrupts and configurable fault handlers (clear PRIMASK). - */ -static inline void nvic_globalirq_enable() { - asm volatile("cpsie i"); -} - -/** - * Disable interrupts and configurable fault handlers (set PRIMASK). - */ -static inline void nvic_globalirq_disable() { - asm volatile("cpsid i"); -} - -/** - * @brief Enable interrupt irq_num - * @param irq_num Interrupt to enable - */ -static inline void nvic_irq_enable(nvic_irq_num irq_num) { - if (irq_num < 0) { - return; - } - NVIC_BASE->ISER[irq_num / 32] = BIT(irq_num % 32); -} - -/** - * @brief Disable interrupt irq_num - * @param irq_num Interrupt to disable - */ -static inline void nvic_irq_disable(nvic_irq_num irq_num) { - if (irq_num < 0) { - return; - } - NVIC_BASE->ICER[irq_num / 32] = BIT(irq_num % 32); -} - -/** - * @brief Quickly disable all interrupts. - * - * Calling this function is significantly faster than calling - * nvic_irq_disable() in a loop. - */ -static inline void nvic_irq_disable_all(void) { - /* Note: This only works up to XL density. The fix for - * connectivity line is: - * - * NVIC_BASE->ICER[2] = 0xF; - * - * We don't support connectivity line devices (yet), so leave it - * alone for now. - */ - NVIC_BASE->ICER[0] = 0xFFFFFFFF; - NVIC_BASE->ICER[1] = 0xFFFFFFFF; -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/variants/otto/pins_arduino.h b/cores/arduino/pins_arduino.c similarity index 74% rename from variants/otto/pins_arduino.h rename to cores/arduino/pins_arduino.c index 4e279aa..936c25a 100644 --- a/variants/otto/pins_arduino.h +++ b/cores/arduino/pins_arduino.c @@ -16,6 +16,21 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -// API compatibility -#include "variant.h" +#include "pins_arduino.h" +void __libc_init_array(void); + +WEAK uint32_t pinNametoDigitalPin(PinName p) +{ + uint32_t i = 0; + for(i = 0; i < NUM_DIGITAL_PINS; i++) { + if (digitalPin[i] == p) + break; + } + return i; +} + +WEAK void init( void ) +{ + hw_config_init(); +} \ No newline at end of file diff --git a/cores/arduino/pins_arduino.h b/cores/arduino/pins_arduino.h new file mode 100644 index 0000000..014ac84 --- /dev/null +++ b/cores/arduino/pins_arduino.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#ifndef _PINS_ARDUINO_H_ +#define _PINS_ARDUINO_H_ + +/** + * Libc porting layers + */ +#if defined ( __GNUC__ ) /* GCC CS3 */ +# include /** RedHat Newlib minimal stub */ +#endif + +// API compatibility +#include "variant.h" + +#define NUM_DIGITAL_PINS DEND +#define NUM_ANALOG_INPUTS (AEND-A0) + +// Convert a digital pin number Dxx to a PinName Pxy +// Note: Analog pin is also a digital pin. +#define digitalPinToPinName(p) ((p < NUM_DIGITAL_PINS) ? digitalPin[p] : (STM_VALID_PINNAME(p))? (PinName)p : NC) +// Convert a PinName Pxy to a digital pin number +uint32_t pinNametoDigitalPin(PinName p); + +// Convert an analog pin number to a digital pin number +// Used by analogRead api to have A0 == 0 +#define analogInputToDigitalPin(p) ((p < NUM_ANALOG_INPUTS) ? (p+A0) : p) +// Convert an analog pin number Axx to a PinName Pxy +#define analogInputToPinName(p) (digitalPinToPinName(analogInputToDigitalPin(p))) +// All pins could manage EXTI +#define digitalPinToInterrupt(p) (p) + +#define digitalPinToPort(p) ( get_GPIO_Port(digitalPinToPinName(p)) ) +#define digitalPinToBitMask(p) ( STM_GPIO_PIN(digitalPinToPinName(p)) ) + +#endif /*_PINS_ARDUINO_H_*/ \ No newline at end of file diff --git a/cores/arduino/pwm.cpp b/cores/arduino/pwm.cpp deleted file mode 100755 index 86f192d..0000000 --- a/cores/arduino/pwm.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Arduino-style PWM implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "types.h" -#include "timer.h" - -#include "boards.h" -#include "pwm.h" - -#include "dac.h" -#include "Arduino.h" - -// alfran TO DO: change this -extern bool ADC0_Status = false; -extern bool ADC1_Status = false; -extern uint16 MaxRes_val= 255; - -void analogWrite(uint8 pin, uint16 passed_val) -{ - if ((pin == DAC0) | (pin == DAC1)) - { - uint16 duty_cycle = passed_val; - if ((!ADC0_Status) && (pin == DAC0)) setDac(pin); - if ((!ADC1_Status) && (pin == DAC1)) setDac(pin); - - - - if (pin == DAC0) dac_write_channel(DAC_dev,1,duty_cycle); - - if (pin == DAC1) dac_write_channel(DAC_dev,2,duty_cycle); - } - else - { - uint16 duty_cycle = map(passed_val, 0, MaxRes_val, 65535, 0); - timer_dev *dev = PIN_MAP[pin].timer_device; - if (pin >= GPIO_PINS || dev == NULL || dev->type == TIMER_BASIC) - { - return; - } - if (PIN_MAP[pin].alternate_function != AFx) - { - gpio_set_af_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, PIN_MAP[pin].alternate_function); - } - timer_set_compare(dev, PIN_MAP[pin].timer_channel, duty_cycle); - timer_cc_enable(dev, PIN_MAP[pin].timer_channel); - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_OUTPUT_PP); - - } -} - -void setDac (uint8 pin) -{ - // enabling DAC - if (pin == DAC0) - { - if (ADC1_Status) - { - // Enablin all channel - ADC0_Status = true; - dac_init(DAC_dev, DAC_CH1 | DAC_CH2); - } - else - { - // Enabling DAC0 (port A4) - ADC0_Status = true; - dac_init(DAC_dev, DAC_CH1); - } - } - if (pin == DAC1) - { - if (ADC0_Status) - { - // Enabling all channel - ADC1_Status = true; - dac_init(DAC_dev, DAC_CH1 | DAC_CH2); - } - else - { - // Enablink DAC1 (port A5) - ADC1_Status = true; - dac_init(DAC_dev, DAC_CH2); - } - } -} - -void analogWriteResolution(int resolution) -{ - - MaxRes_val=1; - for (int i = 1 ; i <= resolution ; i++) - { - MaxRes_val=(2*MaxRes_val); - } - MaxRes_val = MaxRes_val - 1; -} diff --git a/cores/arduino/pwm.h b/cores/arduino/pwm.h deleted file mode 100755 index 8210a20..0000000 --- a/cores/arduino/pwm.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file pwm.h - * - * @brief Arduino-compatible PWM interface. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _PWM_H_ -#define _PWM_H_ - -void setDac(uint8 pin); -void analogWriteResolution(int resolution); - -/** - * Set the PWM duty on the given pin. - * - * @param pin PWM output pin - * @param duty_cycle Duty cycle to set. - */ - -void analogWrite(uint8 pin, uint16 duty_cycle); - - -#endif diff --git a/cores/arduino/pwr.c b/cores/arduino/pwr.c deleted file mode 100755 index ead8b64..0000000 --- a/cores/arduino/pwr.c +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file pwr.c - * @brief Power control (PWR) support. - */ - -#include "pwr.h" -#include "rcc.h" - -/** - * Enables the power interface clock, and resets the power device. - */ -void pwr_init(void) { - rcc_clk_enable(RCC_PWR); - rcc_reset_dev(RCC_PWR); -} diff --git a/cores/arduino/pwr.h b/cores/arduino/pwr.h deleted file mode 100755 index cb9a763..0000000 --- a/cores/arduino/pwr.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file pwr.h - * @brief Power control (PWR) defines. - */ - -#include "memory.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Power interface register map. */ -typedef struct pwr_reg_map { - __io uint32 CR; /**< Control register */ - __io uint32 CSR; /**< Control and status register */ -} pwr_reg_map; - -/** Power peripheral register map base pointer. */ -#define PWR_BASE ((struct pwr_reg_map*)0x40007000) - -/* - * Register bit definitions - */ - -/* Control register */ - -/** Disable backup domain write protection bit */ -#define PWR_CR_DBP 8 -/** Power voltage detector enable bit */ -#define PWR_CR_PVDE 4 -/** Clear standby flag bit */ -#define PWR_CR_CSBF 3 -/** Clear wakeup flag bit */ -#define PWR_CR_CWUF 2 -/** Power down deepsleep bit */ -#define PWR_CR_PDDS 1 -/** Low-power deepsleep bit */ -#define PWR_CR_LPDS 0 - -/* Control and status register */ - -/** Enable wakeup pin bit */ -#define PWR_CSR_EWUP 8 -/** PVD output bit */ -#define PWR_CSR_PVDO 2 -/** Standby flag bit */ -#define PWR_CSR_SBF 1 -/** Wakeup flag bit */ -#define PWR_CSR_WUF 0 - -/* - * Convenience functions - */ - -void pwr_init(void); - -#ifdef __cplusplus -} -#endif diff --git a/cores/arduino/rcc.c b/cores/arduino/rcc.c deleted file mode 100755 index 74d64a3..0000000 --- a/cores/arduino/rcc.c +++ /dev/null @@ -1,530 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.c - * @brief Implements pretty much only the basic clock setup on the - * stm32, clock enable/disable and peripheral reset commands. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "flash.h" -#include "gpio.h" -#include "rcc.h" -#include "bitband.h" - -#define APB1 RCC_APB1 -#define APB2 RCC_APB2 -#define AHB1 RCC_AHB1 -#define AHB2 RCC_AHB2 -#define AHB3 RCC_AHB3 - -struct rcc_dev_info { - const rcc_clk_domain clk_domain; - const uint8 line_num; -}; - -static uint32 rcc_dev_clk_speed_table[AHB3]; - -/* Device descriptor table, maps rcc_clk_id onto bus and enable/reset - * register bit numbers. */ -static const struct rcc_dev_info rcc_dev_table[] = { - -// AHB3 - - [RCC_FMC] = { .clk_domain = AHB3, .line_num = 0 }, - [RCC_QSPI] = { .clk_domain = AHB3, .line_num = 1 }, - - // AHB2 - [RCC_DCMI] = { .clk_domain = AHB2, .line_num = 0 }, - - [RCC_CRYP] = { .clk_domain = AHB2, .line_num = 4 }, - [RCC_HASH] = { .clk_domain = AHB2, .line_num = 5 }, - [RCC_RNG] = { .clk_domain = AHB2, .line_num = 6 }, - [RCC_OTGFS] = { .clk_domain = AHB2, .line_num = 7 }, - [RCC_USBFS] = { .clk_domain = AHB2, .line_num = 7 }, //for compatibility - -// AHB1 - [RCC_GPIOA] = { .clk_domain = AHB1, .line_num = 0 }, - [RCC_GPIOB] = { .clk_domain = AHB1, .line_num = 1 }, - [RCC_GPIOC] = { .clk_domain = AHB1, .line_num = 2 }, - [RCC_GPIOD] = { .clk_domain = AHB1, .line_num = 3 }, - [RCC_GPIOE] = { .clk_domain = AHB1, .line_num = 4 }, - [RCC_GPIOF] = { .clk_domain = AHB1, .line_num = 5 }, - [RCC_GPIOG] = { .clk_domain = AHB1, .line_num = 6 }, - [RCC_GPIOH] = { .clk_domain = AHB1, .line_num = 7 }, - [RCC_GPIOI] = { .clk_domain = AHB1, .line_num = 8 }, - [RCC_GPIOJ] = { .clk_domain = AHB1, .line_num = 9 }, - [RCC_GPIOK] = { .clk_domain = AHB1, .line_num = 10 }, - - [RCC_CRC] = { .clk_domain = AHB1, .line_num = 12 }, - - [RCC_FLITFLP] = { .clk_domain = AHB1, .line_num = 15 }, - [RCC_SRAM1LP] = { .clk_domain = AHB1, .line_num = 16 }, - [RCC_SRAM2LP] = { .clk_domain = AHB1, .line_num = 17 }, - - [RCC_BKP] = { .clk_domain = AHB1, .line_num = 18 }, - [RCC_SRAM3LP] = { .clk_domain = AHB1, .line_num = 19 }, - [RCC_CCDATARAM] = { .clk_domain = AHB1, .line_num = 20 }, - [RCC_DMA1] = { .clk_domain = AHB1, .line_num = 21 }, - [RCC_DMA2] = { .clk_domain = AHB1, .line_num = 22 }, - [RCC_DMA2D] = { .clk_domain = AHB1, .line_num = 23 }, - - [RCC_ETH] = { .clk_domain = AHB1, .line_num = 25 }, - [RCC_ETHTX] = { .clk_domain = AHB1, .line_num = 26 }, - [RCC_ETHRX] = { .clk_domain = AHB1, .line_num = 27 }, - [RCC_ETHPTP] = { .clk_domain = AHB1, .line_num = 28 }, - [RCC_OTGHS] = { .clk_domain = AHB1, .line_num = 29 }, - [RCC_OTGHSULPI] = { .clk_domain = AHB1, .line_num = 30 }, - -// APB2 - - [RCC_TIMER1] = { .clk_domain = APB2, .line_num = 0 }, - [RCC_TIMER8] = { .clk_domain = APB2, .line_num = 1 }, - - [RCC_USART1] = { .clk_domain = APB2, .line_num = 4 }, - [RCC_USART6] = { .clk_domain = APB2, .line_num = 5}, - - [RCC_ADC1] = { .clk_domain = APB2, .line_num = 8 }, - [RCC_ADC2] = { .clk_domain = APB2, .line_num = 9 }, - [RCC_ADC3] = { .clk_domain = APB2, .line_num = 10 }, - [RCC_SDIO] = { .clk_domain = APB2, .line_num = 11 }, - [RCC_SPI1] = { .clk_domain = APB2, .line_num = 12 }, - [RCC_SPI4] = { .clk_domain = APB2, .line_num = 13 }, - [RCC_SYSCFG] = { .clk_domain = APB2, .line_num = 14 }, - - [RCC_TIMER9] = { .clk_domain = APB2, .line_num = 16 }, - [RCC_TIMER10] = { .clk_domain = APB2, .line_num = 17 }, - [RCC_TIMER11] = { .clk_domain = APB2, .line_num = 18 }, - - [RCC_SPI5] = { .clk_domain = APB2, .line_num = 20 }, - [RCC_SPI6] = { .clk_domain = APB2, .line_num = 21 }, - [RCC_SAI1] = { .clk_domain = APB2, .line_num = 22 }, - - [RCC_LTDC] = { .clk_domain = APB2, .line_num = 26 }, - [RCC_DSI] = { .clk_domain = APB2, .line_num = 27 }, - - -// APB1 - - [RCC_TIMER2] = { .clk_domain = APB1, .line_num = 0 }, - [RCC_TIMER3] = { .clk_domain = APB1, .line_num = 1 }, - [RCC_TIMER4] = { .clk_domain = APB1, .line_num = 2 }, - [RCC_TIMER5] = { .clk_domain = APB1, .line_num = 3 }, - [RCC_TIMER6] = { .clk_domain = APB1, .line_num = 4 }, - [RCC_TIMER7] = { .clk_domain = APB1, .line_num = 5 }, - [RCC_TIMER12] = { .clk_domain = APB1, .line_num = 6 }, - [RCC_TIMER13] = { .clk_domain = APB1, .line_num = 7 }, - [RCC_TIMER14] = { .clk_domain = APB1, .line_num = 8 }, - - [RCC_WWDG] = { .clk_domain = APB1, .line_num = 11 }, - - [RCC_SPI2] = { .clk_domain = APB1, .line_num = 14 }, - [RCC_SPI3] = { .clk_domain = APB1, .line_num = 15 }, - - [RCC_USART2] = { .clk_domain = APB1, .line_num = 17 }, - [RCC_USART3] = { .clk_domain = APB1, .line_num = 18 }, - [RCC_UART4] = { .clk_domain = APB1, .line_num = 19 }, - [RCC_UART5] = { .clk_domain = APB1, .line_num = 20 }, - [RCC_I2C1] = { .clk_domain = APB1, .line_num = 21 }, - [RCC_I2C2] = { .clk_domain = APB1, .line_num = 22 }, - [RCC_I2C3] = { .clk_domain = APB1, .line_num = 23 }, - - [RCC_CAN1] = { .clk_domain = APB1, .line_num = 25 }, - [RCC_CAN2] = { .clk_domain = APB1, .line_num = 26 }, - - [RCC_PWR] = { .clk_domain = APB1, .line_num = 28}, - [RCC_DAC] = { .clk_domain = APB1, .line_num = 29 }, - [RCC_UART7] = { .clk_domain = APB1, .line_num = 30 }, - [RCC_UART8] = { .clk_domain = APB1, .line_num = 31 }, - -}; - -/** - * @brief Initialize the clock control system. Initializes the system - * clock source to use the PLL driven by an external oscillator - * @param sysclk_src system clock source, must be PLL - * @param pll_src pll clock source, must be HSE - * @param pll_mul pll multiplier - */ - -#define HSE_STARTUP_TIMEOUT ((uint16)0x05000) /*!< Time out for HSE start up */ -#define RCC_CFGR_HPRE_DIV1 ((uint32)0x00000000) /*!< SYSCLK not divided */ -#define RCC_CFGR_PPRE1_DIV2 ((uint32)0x00001000) /*!< HCLK divided by 2 */ -#define RCC_CFGR_PPRE1_DIV4 ((uint32)0x00001400) /*!< HCLK divided by 4 */ -#define RCC_CFGR_PPRE2_DIV1 ((uint32)0x00000000) /*!< HCLK not divided */ -#define RCC_CFGR_PPRE2_DIV2 ((uint32)0x00008000) /*!< HCLK divided by 2 */ - -#define RCC_PLLCFGR_PLLSRC_HSE ((uint32)0x00400000) - -/******************* Bits definition for FLASH_ACR register *****************/ -//#define FLASH_ACR_LATENCY ((uint32_t)0x00000007) -#define FLASH_ACR_LATENCY_0WS ((uint32)0x00000000) -#define FLASH_ACR_LATENCY_1WS ((uint32)0x00000001) -#define FLASH_ACR_LATENCY_2WS ((uint32)0x00000002) -#define FLASH_ACR_LATENCY_3WS ((uint32)0x00000003) -#define FLASH_ACR_LATENCY_4WS ((uint32)0x00000004) -#define FLASH_ACR_LATENCY_5WS ((uint32)0x00000005) -#define FLASH_ACR_LATENCY_6WS ((uint32)0x00000006) -#define FLASH_ACR_LATENCY_7WS ((uint32)0x00000007) - -#define FLASH_ACR_PRFTEN ((uint32)0x00000100) -#define FLASH_ACR_ICEN ((uint32)0x00000200) -#define FLASH_ACR_DCEN ((uint32)0x00000400) -#define FLASH_ACR_ICRST ((uint32)0x00000800) -#define FLASH_ACR_DCRST ((uint32)0x00001000) -#define FLASH_ACR_BYTE0_ADDRESS ((uint32)0x40023C00) -#define FLASH_ACR_BYTE2_ADDRESS ((uint32)0x40023C03) - -#define PWR_BASE (0x40007000) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define PWR_CR_VOS ((uint16)0x4000) /*!< Regulator voltage scaling output selection */ - -#define FLASH_R_BASE (0x40023C00) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define RESET 0 - -void InitMCO1() -{ - rcc_reg_map *rcc = RCC_BASE; - // Turn MCO1 Master Clock Output mode - rcc->CFGR &= RCC_CFGR_MCO1_RESET_MASK; - rcc->CFGR |= RCC_CFGR_MCO1Source_PLLCLK | RCC_CFGR_MCO1Div_1; - // PA8 Output the Master Clock MCO1 - gpio_set_af_mode(GPIOA_dev, 8, 0); - gpio_set_mode(GPIOA_dev, 8, GPIO_MODE_AF | GPIO_OTYPE_PP | GPIO_OSPEED_100MHZ); -} - -void SetupClock() -{ - - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; - HAL_StatusTypeDef ret = HAL_OK; - - /* Enable Power Control clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - - /* The voltage scaling allows optimizing the power consumption when the device is - clocked below the maximum system frequency, to update the voltage scaling value - regarding system frequency refer to product datasheet. */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /* Enable HSE Oscillator and activate PLL with HSE as source */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; -#ifdef ARDUINO_STM32F4_NETDUINO2PLUS - RCC_OscInitStruct.PLL.PLLM = 25; -#else - RCC_OscInitStruct.PLL.PLLM = 4; -#endif - RCC_OscInitStruct.PLL.PLLN = 180; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 3; - RCC_OscInitStruct.PLL.PLLR = 2; - - ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); - if(ret != HAL_OK) - { - while(1) { ; } - } - - /* Activate the OverDrive to reach the 180 MHz Frequency */ - ret = HAL_PWREx_EnableOverDrive(); - if(ret != HAL_OK) - { - while(1) { ; } - } - - /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV16; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); - if(ret != HAL_OK) - { - while(1) { ; } - } - - - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; - PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8; - PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLSAIP; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); - - HAL_RCC_EnableCSS(); - - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; - PeriphClkInitStruct.PLLSAI.PLLSAIR = 7; - PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); - - InitMCO1(); - - // save bus clock values - rcc_dev_clk_speed_table[RCC_AHB1] = (SystemCoreClock/1); - rcc_dev_clk_speed_table[RCC_APB2] = (SystemCoreClock/2); - rcc_dev_clk_speed_table[RCC_APB1] = (SystemCoreClock/4); -} - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - SetupClock(); -} - -#define PLL_M 8 -#define PLL_N 240 -/* SYSCLK = PLL_VCO / PLL_P */ -#define PLL_P 2 - -/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ -#define PLL_Q 5 - - -void rcc_clk_init2(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul) { - -/******************************************************************************/ -/* PLL (clocked by HSE) used as System clock source */ -/******************************************************************************/ - uint32 StartUpCounter = 0, HSEStatus = 0; - rcc_reg_map *pRCC = RCC_BASE; - - /* Enable HSE */ - pRCC->CR |= RCC_CR_HSEON; - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = pRCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((pRCC->CR & RCC_CR_HSERDY) != 0) - { - HSEStatus = 0x01; - } - else - { - HSEStatus = 0x00; - } - - if (HSEStatus == 0x01) - { - /* HCLK = SYSCLK / 1*/ - pRCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 2*/ - pRCC->CFGR |= RCC_CFGR_PPRE2_DIV2; - - /* PCLK1 = HCLK / 4*/ - pRCC->CFGR |= RCC_CFGR_PPRE1_DIV4; - - /* Configure the main PLL */ - pRCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - pRCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((pRCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - ((FLASH_TypeDef*)FLASH)->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_3WS; - - /* Select the main PLL as system clock source */ - pRCC->CFGR &= ~RCC_CFGR_SW; - pRCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((pRCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } - -#if 0 - uint32 cfgr = 0; - uint32 cr; - - /* Assume that we're going to clock the chip off the PLL, fed by - * the HSE */ - ASSERT(sysclk_src == RCC_CLKSRC_PLL && - pll_src == RCC_PLLSRC_HSE); - - RCC_BASE->CFGR = pll_src | pll_mul; - - /* Turn on the HSE */ - cr = RCC_BASE->CR; - cr |= RCC_CR_HSEON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_HSERDY)) - ; - - /* Now the PLL */ - cr |= RCC_CR_PLLON; - RCC_BASE->CR = cr; - while (!(RCC_BASE->CR & RCC_CR_PLLRDY)) - ; - - /* Finally, let's switch over to the PLL */ - cfgr &= ~RCC_CFGR_SW; - cfgr |= RCC_CFGR_SW_PLL; - RCC_BASE->CFGR = cfgr; - while ((RCC_BASE->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) - ; -#endif -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_enable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB1] = &RCC_BASE->AHB1ENR, - [AHB2] = &RCC_BASE->AHB2ENR, - [AHB3] = &RCC_BASE->AHB3ENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 1); -} - -/** - * @brief Turn on the clock line on a peripheral - * @param id Clock ID of the peripheral to turn on. - */ -void rcc_clk_disable(rcc_clk_id id) { - static const __io uint32* enable_regs[] = { - [APB1] = &RCC_BASE->APB1ENR, - [APB2] = &RCC_BASE->APB2ENR, - [AHB1] = &RCC_BASE->AHB1ENR, - [AHB2] = &RCC_BASE->AHB2ENR, - [AHB3] = &RCC_BASE->AHB3ENR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io uint32* enr = (__io uint32*)enable_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(enr, lnum, 0); -} - -/** - * @brief Reset a peripheral. - * @param id Clock ID of the peripheral to reset. - */ -void rcc_reset_dev(rcc_clk_id id) { - static const __io uint32* reset_regs[] = { - [APB1] = &RCC_BASE->APB1RSTR, - [APB2] = &RCC_BASE->APB2RSTR, - [AHB1] = &RCC_BASE->AHB1RSTR, - [AHB2] = &RCC_BASE->AHB2RSTR, - [AHB3] = &RCC_BASE->AHB3RSTR, - }; - - rcc_clk_domain clk_domain = rcc_dev_clk(id); - __io void* addr = (__io void*)reset_regs[clk_domain]; - uint8 lnum = rcc_dev_table[id].line_num; - - bb_peri_set_bit(addr, lnum, 1); - bb_peri_set_bit(addr, lnum, 0); -} - -/** - * @brief Get a peripheral's clock domain - * @param id Clock ID of the peripheral whose clock domain to return - * @return Clock source for the given clock ID - */ -rcc_clk_domain rcc_dev_clk(rcc_clk_id id) { - return rcc_dev_table[id].clk_domain; -} - -/** - * @brief Get a peripheral's clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_clk_speed(rcc_clk_id id) { - return rcc_dev_clk_speed_table[rcc_dev_clk(id)]; -} - -/** - * @brief Get a peripheral's timer clock domain speed - * @param id Clock ID of the peripheral whose clock domain speed to return - * @return Clock speed for the given clock ID - */ -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id) { - return 2*rcc_dev_clk_speed(id); -} - -/** - * @brief Set the divider on a peripheral prescaler - * @param prescaler prescaler to set - * @param divider prescaler divider - */ -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) { -#if 0 - static const uint32 masks[] = { - [RCC_PRESCALER_AHB] = RCC_CFGR_HPRE, - [RCC_PRESCALER_APB1] = RCC_CFGR_PPRE1, - [RCC_PRESCALER_APB2] = RCC_CFGR_PPRE2, - [RCC_PRESCALER_USB] = RCC_CFGR_USBPRE, - [RCC_PRESCALER_ADC] = RCC_CFGR_ADCPRE, - }; - - uint32 cfgr = RCC_BASE->CFGR; - cfgr &= ~masks[prescaler]; - cfgr |= divider; - RCC_BASE->CFGR = cfgr; -#endif -} diff --git a/cores/arduino/rcc.h b/cores/arduino/rcc.h deleted file mode 100755 index bcb9365..0000000 --- a/cores/arduino/rcc.h +++ /dev/null @@ -1,1210 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file rcc.h - * @brief reset and clock control definitions and prototypes - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "types.h" -#include "stm32f4xx_hal.h" - -#ifndef _RCC_H_ -#define _RCC_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/** RCC register map type */ -typedef struct -{ - __io uint32 CR; /*!< RCC clock control register, Address offset: 0x00 */ - __io uint32 PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __io uint32 CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __io uint32 CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __io uint32 AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __io uint32 AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __io uint32 AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32 RESERVED0; /*!< Reserved, 0x1C */ - __io uint32 APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __io uint32 APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32 RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __io uint32 AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __io uint32 AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __io uint32 AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32 RESERVED2; /*!< Reserved, 0x3C */ - __io uint32 APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __io uint32 APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32 RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __io uint32 AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __io uint32 AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __io uint32 AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32 RESERVED4; /*!< Reserved, 0x5C */ - __io uint32 APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __io uint32 APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32 RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __io uint32 BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __io uint32 CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32 RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __io uint32 SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __io uint32 PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - - __io uint32 PLLSAICFGR; /*!< RCC PLLSAI clock output configuration, Address offset: 0x88 */ - __io uint32 DCKCFGR; /*!< RCC PLLSAI PLLI2S clock and prescale configuration Address offset: 0x8C */ - -} rcc_reg_map; - -/** RCC register map base pointer */ -#define RCC_BASE ((rcc_reg_map*)0x40023800) -/* - * Register bit definitions - */ - -/* -PWR power control register (PWR_CR) -Address offset: 0x00 -Reset value: 0x0000 C000 (reset by wakeup from Standby mode) -*/ - -#define PWR_CR_ODSWEN_BIT 17 -#define PWR_CR_ODEN_BIT 16 -#define PWR_CR_ADCDC1_BIT 13 -#define PWR_CR_MRUDS_BIT 11 -#define PWR_CR_LPUDS_BIT 10 -#define PWR_CR_FPDS_BIT 9 -#define PWR_CR_DBP_BIT 8 -#define PWR_CR_PVDE_BIT 4 -#define PWR_CR_CSBF_BIT 3 -#define PWR_CR_CWUF_BIT 2 -#define PWR_CR_PDDS_BIT 1 -#define PWR_CR_LPDS_BIT 0 - -#define PWR_CR_UDEN (0b00 << 18) -#define PWR_CR_ODSWEN BIT(PWR_CR_ODSWEN_BIT) -#define PWR_CR_ODEN BIT(PWR_CR_ODEN_BIT) -#define PWR_CR_VOS (0b11 << 14) -#define PWR_CR_ADCDC1 BIT(PWR_CR_ADCDC1_BIT) -#define PWR_CR_MRUDS BIT(PWR_CR_MRUDS_BIT) -#define PWR_CR_LPUDS BIT(PWR_CR_LPUDS_BIT) -#define PWR_CR_FPDS BIT(PWR_CR_FPDS_BIT) -#define PWR_CR_DBP BIT(PWR_CR_DBP_BIT) -#define PWR_CR_PLS (0b000 << 5) -#define PWR_CR_PVDE BIT(PWR_CR_PVDE_BIT) -#define PWR_CR_CSBF BIT(PWR_CR_CSBF_BIT) -#define PWR_CR_CWUF BIT(PWR_CR_CWUF_BIT) -#define PWR_CR_PDDS BIT(PWR_CR_PDDS_BIT) -#define PWR_CR_LPDS BIT(PWR_CR_LPDS_BIT) - -/* -PWR power control/status register (PWR_CSR) -Address offset: 0x04 -Reset value: 0x0000 0000 (not reset by wakeup from Standby mode) -Additional APB cycles are needed to read this register versus a standard APB read. -*/ - -#define PWR_CSR_ODSWRDY_BIT 17 -#define PWR_CSR_ODRDY_BIT 16 -#define PWR_CSR_VOSRDY_BIT 14 -#define PWR_CSR_BRE_BIT 9 -#define PWR_CSR_EWUP_BIT 8 -#define PWR_CSR_BRR_BIT 3 -#define PWR_CSR_PVDO_BIT 2 -#define PWR_CSR_SBF_BIT 1 -#define PWR_CSR_WUPF_BIT 0 - -#define PWR_CSR_UDRDY (0b00 << 18) -#define PWR_CSR_ODSWRDY BIT(PWR_CSR_ODSWRDY_BIT) -#define PWR_CSR_ODRDY BIT(PWR_CSR_ODRDY_BIT) -#define PWR_CSR_VOSRDY BIT(PWR_CSR_VOSRDY_BIT) -#define PWR_CSR_BRE BIT(PWR_CSR_BRE_BIT) -#define PWR_CSR_EWUP BIT(PWR_CSR_EWUP_BIT) -#define PWR_CSR_BRR BIT(PWR_CSR_BRR_BIT) -#define PWR_CSR_PVDO BIT(PWR_CSR_PVDO_BIT) -#define PWR_CSR_SBF BIT(PWR_CSR_SBF_BIT) -#define PWR_CSR_WUPF BIT(PWR_CSR_WUPF_BIT) - -/* -RCC clock control register (RCC_CR) -Address offset: 0x00 -Reset value: 0x0000 XX83 where X is undefined. -Access: no wait state, word, half-word and byte access -*/ - -#define RCC_CR_PLLSAIRDY_BIT 29 -#define RCC_CR_PLLSAION_BIT 28 -#define RCC_CR_PLLI2SRDY_BIT 27 -#define RCC_CR_PLLI2SON_BIT 26 -#define RCC_CR_PLLRDY_BIT 25 -#define RCC_CR_PLLON_BIT 24 -#define RCC_CR_CSSON_BIT 19 -#define RCC_CR_HSEBYP_BIT 18 -#define RCC_CR_HSERDY_BIT 17 -#define RCC_CR_HSEON_BIT 16 -#define RCC_CR_HSIRDY_BIT 1 -#define RCC_CR_HSION_BIT 0 - -#define RCC_CR_PLLSAIRDY BIT(RCC_CR_PLLSAIRDY_BIT) -#define RCC_CR_PLLSAION BIT(RCC_CR_PLLSAION_BIT) -#define RCC_CR_PLLI2SRDY BIT(RCC_CR_PLLI2SRDY_BIT) -#define RCC_CR_PLLI2SON BIT(RCC_CR_PLLI2SON_BIT) -#define RCC_CR_PLLRDY BIT(RCC_CR_PLLRDY_BIT) -#define RCC_CR_PLLON BIT(RCC_CR_PLLON_BIT) -#define RCC_CR_CSSON BIT(RCC_CR_CSSON_BIT) -#define RCC_CR_HSEBYP BIT(RCC_CR_HSEBYP_BIT) -#define RCC_CR_HSERDY BIT(RCC_CR_HSERDY_BIT) -#define RCC_CR_HSEON BIT(RCC_CR_HSEON_BIT) -#define RCC_CR_HSICAL (0xFF << 8) -#define RCC_CR_HSITRIM (0x1F << 3) -#define RCC_CR_HSIRDY BIT(RCC_CR_HSIRDY_BIT) -#define RCC_CR_HSION BIT(RCC_CR_HSION_BIT) - -/* -RCC PLL configuration register (RCC_PLLCFGR) -Address offset: 0x04 -Reset value: 0x2400 3010 -Access: no wait state, word, half-word and byte access. -This register is used to configure the PLL clock outputs according to the formulas: -• f(VCO clock) = f(PLL clock input) × (PLLN / PLLM) -• f(PLL general clock output) = f(VCO clock) / PLLP -• f(USB OTG FS, SDMMC) = f(VCO clock) / PLLQ -• f(PLL DSI clock output) = f(VCO clock) / PLLR -*/ - -/* -#define RCC_PLLCFGR_PLLSCR_BIT 22 - -#define RCC_PLLCFGR_PLLR (0x << 28) // to be configured according the paragraph 6.3.2 of Reference manual RM0386 -#define RCC_PLLCFGR_PLLQ (0x << 24) // to be configured according the paragraph 6.3.2 of Reference manual RM0386 -#define RCC_PLLCFGR_PLLP (0x << 16) // to be configured according the paragraph 6.3.2 of Reference manual RM0386 -#define RCC_PLLCFGR_PLLN (0x << 6) // to be configured according the paragraph 6.3.2 of Reference manual RM0386 -#define RCC_PLLCFGR_PLLM (0x << 0) // to be configured according the paragraph 6.3.2 of Reference manual RM0386 -*/ - -/* -RCC clock configuration register (RCC_CFGR) -Address offset: 0x08 -Reset value: 0x0000 0000 -Access: 0 ≤ wait state ≤ 2, word, half-word and byte access -1 or 2 wait states inserted only if the access occurs during a clock source switch. -*/ - -#define RCC_CFGR_USBPRE_BIT 22 -#define RCC_CFGR_PLLXTPRE_BIT 17 -#define RCC_CFGR_PLLSRC_BIT 16 - -#define RCC_CFGR_MCO (0x3 << 24) -#define RCC_CFGR_USBPRE BIT(RCC_CFGR_USBPRE_BIT) -#define RCC_CFGR_PLLMUL (0xF << 18) -#define RCC_CFGR_PLLXTPRE BIT(RCC_CFGR_PLLXTPRE_BIT) -#define RCC_CFGR_PLLSRC BIT(RCC_CFGR_PLLSRC_BIT) -#define RCC_CFGR_ADCPRE (0x3 << 14) -#define RCC_CFGR_PPRE2 (0x7 << 11) -#define RCC_CFGR_PPRE1 (0x7 << 8) -#define RCC_CFGR_HPRE (0xF << 4) -#define RCC_CFGR_SWS (0x3 << 2) -#define RCC_CFGR_SWS_PLL (0x2 << 2) -#define RCC_CFGR_SWS_HSE (0x1 << 2) -#define RCC_CFGR_SW 0x3 -#define RCC_CFGR_SW_PLL 0x2 -#define RCC_CFGR_SW_HSE 0x1 -#define RCC_CFGR_MCO1 (0x2 << 22) - -#define RCC_CFGR_MCO1Source_HSI ((uint32_t)0x00000000) -#define RCC_CFGR_MCO1Source_LSE ((uint32_t)0x00200000) -#define RCC_CFGR_MCO1Source_HSE ((uint32_t)0x00400000) -#define RCC_CFGR_MCO1Source_PLLCLK ((uint32_t)0x00600000) -#define RCC_CFGR_MCO1Div_1 ((uint32_t)0x00000000) -#define RCC_CFGR_MCO1Div_2 ((uint32_t)0x04000000) -#define RCC_CFGR_MCO1Div_3 ((uint32_t)0x05000000) -#define RCC_CFGR_MCO1Div_4 ((uint32_t)0x06000000) -#define RCC_CFGR_MCO1Div_5 ((uint32_t)0x07000000) -#define RCC_CFGR_MCO1_RESET_MASK ((uint32_t)0xF89FFFFF) - -/* -RCC clock interrupt register (RCC_CIR) -Address offset: 0x0C -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access -*/ - -#define RCC_CIR_CSSC_BIT 23 -#define RCC_CIR_PLLSAIRDYC_BIT 22 -#define RCC_CIR_PLLI2S_RDYC_BIT 21 -#define RCC_CIR_PLLRDYC_BIT 20 -#define RCC_CIR_HSERDYC_BIT 19 -#define RCC_CIR_HSIRDYC_BIT 18 -#define RCC_CIR_LSERDYC_BIT 17 -#define RCC_CIR_LSIRDYC_BIT 16 -#define RCC_CIR_PLLRDYIE_BIT 12 -#define RCC_CIR_PLLSAIRDYIE_BIT 14 -#define RCC_CIR_PLLI2SRDYIE_BIT 13 -#define RCC_CIR_HSERDYIE_BIT 11 -#define RCC_CIR_HSIRDYIE_BIT 10 -#define RCC_CIR_LSERDYIE_BIT 9 -#define RCC_CIR_LSIRDYIE_BIT 8 -#define RCC_CIR_CSSF_BIT 7 -#define RCC_CIR_PLLSAIRDYF_BIT 6 -#define RCC_CIR_PLLI2SRDYF_BIT 5 -#define RCC_CIR_PLLRDYF_BIT 4 -#define RCC_CIR_HSERDYF_BIT 3 -#define RCC_CIR_HSIRDYF_BIT 2 -#define RCC_CIR_LSERDYF_BIT 1 -#define RCC_CIR_LSIRDYF_BIT 0 - -#define RCC_CIR_CSSC BIT(RCC_CIR_CSSC_BIT) -#define RCC_CIR_PLLSAIRDYC BIT(RCC_CIR_PLLSAIRDYC_BIT) -#define RCC_CIR_PLLI2S_RDYC BIT(RCC_CIR_PLLI2S_RDYC_BIT) -#define RCC_CIR_PLLRDYC BIT(RCC_CIR_PLLRDYC_BIT) -#define RCC_CIR_HSERDYC BIT(RCC_CIR_HSERDYC_BIT) -#define RCC_CIR_HSIRDYC BIT(RCC_CIR_HSIRDYC_BIT) -#define RCC_CIR_LSERDYC BIT(RCC_CIR_LSERDYC_BIT) -#define RCC_CIR_LSIRDYC BIT(RCC_CIR_LSIRDYC_BIT) -#define RCC_CIR_PLLRDYIE BIT(RCC_CIR_PLLRDYIE_BIT) -#define RCC_CIR_PLLSAIRDYIE BIT(RCC_CIR_PLLSAIRDYIE_BIT) -#define RCC_CIR_PLLI2SRDYIE BIT(RCC_CIR_PLLSAIRDYIE_BIT) -#define RCC_CIR_HSERDYIE BIT(RCC_CIR_HSERDYIE_BIT) -#define RCC_CIR_HSIRDYIE BIT(RCC_CIR_HSIRDYIE_BIT) -#define RCC_CIR_LSERDYIE BIT(RCC_CIR_LSERDYIE_BIT) -#define RCC_CIR_LSIRDYIE BIT(RCC_CIR_LSIRDYIE_BIT) -#define RCC_CIR_CSSF BIT(RCC_CIR_CSSF_BIT) -#define RCC_CIR_PLLSAIRDYF BIT(RCC_CIR_PLLSAIRDYF_BIT) -#define RCC_CIR_PLLI2SRDYF BIT(RCC_CIR_PLLI2SRDYF_BIT) -#define RCC_CIR_PLLRDYF BIT(RCC_CIR_PLLRDYF_BIT) -#define RCC_CIR_HSERDYF BIT(RCC_CIR_HSERDYF_BIT) -#define RCC_CIR_HSIRDYF BIT(RCC_CIR_HSIRDYF_BIT) -#define RCC_CIR_LSERDYF BIT(RCC_CIR_LSERDYF_BIT) -#define RCC_CIR_LSIRDYF BIT(RCC_CIR_LSIRDYF_BIT) - -/* -RCC AHB1 peripheral reset register (RCC_AHB1RSTR) -Address offset: 0x10 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB1RSTR_OTGHSRST_BIT 29 -#define RCC_AHB1RSTR_ETMACRST_BIT 25 -#define RCC_AHB1RSTR_DMA2DRST_BIT 23 -#define RCC_AHB1RSTR_DMA2RST_BIT 22 -#define RCC_AHB1RSTR_DMA1RST_BIT 21 -#define RCC_AHB1RSTR_CRCRST_BIT 12 -#define RCC_AHB1RSTR_GPIOKRST_BIT 10 -#define RCC_AHB1RSTR_GPIOJRST_BIT 9 -#define RCC_AHB1RSTR_GPIOIRST_BIT 8 -#define RCC_AHB1RSTR_GPIOHRST_BIT 7 -#define RCC_AHB1RSTR_GPIOGRST_BIT 6 -#define RCC_AHB1RSTR_GPIOFRST_BIT 5 -#define RCC_AHB1RSTR_GPIOERST_BIT 4 -#define RCC_AHB1RSTR_GPIODRST_BIT 3 -#define RCC_AHB1RSTR_GPIOCRST_BIT 2 -#define RCC_AHB1RSTR_GPIOBRST_BIT 1 -#define RCC_AHB1RSTR_GPIOARST_BIT 0 - -/* -RCC AHB2 peripheral reset register (RCC_AHB2RSTR) -Address offset: 0x14 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access -*/ - -#define RCC_AHB2RSTR_OTGFSRST_BIT 7 -#define RCC_AHB1RSTR_RNGRST_BIT 6 -#define RCC_AHB1RSTR_HASHRST_BIT 5 -#define RCC_AHB1RSTR_CRYPRST_BIT 4 -#define RCC_AHB1RSTR_DCMIRST_BIT 0 - -/* -RCC AHB3 peripheral reset register (RCC_AHB3RSTR) -Address offset: 0x18 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB3RSTR_QSPIRST_BIT 1 -#define RCC_AHB3RSTR_FMCRST_BIT 0 - -/* -RCC APB1 peripheral reset register (RCC_APB1RSTR) -Address offset: 0x20 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_APB1RSTR_UART8RST_BIT 31 -#define RCC_APB1RSTR_UART7RST_BIT 30 -#define RCC_APB1RSTR_DACRST_BIT 29 -#define RCC_APB1RSTR_PWRRST_BIT 28 -#define RCC_APB1RSTR_CAN2RST_BIT 26 -#define RCC_APB1RSTR_CANR1ST_BIT 25 -#define RCC_APB1RSTR_CANRST_BIT 25 // only for compatibility -#define RCC_APB1RSTR_I2C3RST_BIT 23 -#define RCC_APB1RSTR_I2C2RST_BIT 22 -#define RCC_APB1RSTR_I2C1RST_BIT 21 -#define RCC_APB1RSTR_UART5RST_BIT 20 -#define RCC_APB1RSTR_UART4RST_BIT 19 -#define RCC_APB1RSTR_USART3RST_BIT 18 -#define RCC_APB1RSTR_USART2RST_BIT 17 -#define RCC_APB1RSTR_SPI3RST_BIT 15 -#define RCC_APB1RSTR_SPI2RST_BIT 14 -#define RCC_APB1RSTR_WWDGRST_BIT 11 -#define RCC_APB1RSTR_TIM14RST_BIT 8 -#define RCC_APB1RSTR_TIM13RST_BIT 7 -#define RCC_APB1RSTR_TIM12RST_BIT 6 -#define RCC_APB1RSTR_TIM7RST_BIT 5 -#define RCC_APB1RSTR_TIM6RST_BIT 4 -#define RCC_APB1RSTR_TIM5RST_BIT 3 -#define RCC_APB1RSTR_TIM4RST_BIT 2 -#define RCC_APB1RSTR_TIM3RST_BIT 1 -#define RCC_APB1RSTR_TIM2RST_BIT 0 - -#define RCC_APB1RSTR_UART8RST BIT(RCC_APB1RSTR_UART8RST_BIT) -#define RCC_APB1RSTR_UART7RST BIT(RCC_APB1RSTR_UART7RST) -#define RCC_APB1RSTR_DACRST BIT(RCC_APB1RSTR_DACRST_BIT) -#define RCC_APB1RSTR_PWRRST BIT(RCC_APB1RSTR_PWRRST_BIT) - -#define RCC_APB1RSTR_CAN2RST BIT(RCC_APB1RSTR_CAN2RST_BIT) -#define RCC_APB1RSTR_CAN1RST BIT(RCC_APB1RSTR_CAN1RST_BIT) -#define RCC_APB1RSTR_CANRST BIT(RCC_APB1RSTR_CANRST_BIT) //only for compatibility - -#define RCC_APB1RSTR_I2C3RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C2RST BIT(RCC_APB1RSTR_I2C2RST_BIT) -#define RCC_APB1RSTR_I2C1RST BIT(RCC_APB1RSTR_I2C1RST_BIT) -#define RCC_APB1RSTR_UART5RST BIT(RCC_APB1RSTR_UART5RST_BIT) -#define RCC_APB1RSTR_UART4RST BIT(RCC_APB1RSTR_UART4RST_BIT) -#define RCC_APB1RSTR_USART3RST BIT(RCC_APB1RSTR_USART3RST_BIT) -#define RCC_APB1RSTR_USART2RST BIT(RCC_APB1RSTR_USART2RST_BIT) -#define RCC_APB1RSTR_SPI3RST BIT(RCC_APB1RSTR_SPI3RST_BIT) -#define RCC_APB1RSTR_SPI2RST BIT(RCC_APB1RSTR_SPI2RST_BIT) -#define RCC_APB1RSTR_WWDRST BIT(RCC_APB1RSTR_WWDRST_BIT) -#define RCC_APB1RSTR_TIM14RST BIT(RCC_APB1RSTR_TIM14RST_BIT) -#define RCC_APB1RSTR_TIM13RST BIT(RCC_APB1RSTR_TIM13RST_BIT) -#define RCC_APB1RSTR_TIM12RST BIT(RCC_APB1RSTR_TIM12RST_BIT) -#define RCC_APB1RSTR_TIM7RST BIT(RCC_APB1RSTR_TIM7RST_BIT) -#define RCC_APB1RSTR_TIM6RST BIT(RCC_APB1RSTR_TIM6RST_BIT) -#define RCC_APB1RSTR_TIM5RST BIT(RCC_APB1RSTR_TIM5RST_BIT) -#define RCC_APB1RSTR_TIM4RST BIT(RCC_APB1RSTR_TIM4RST_BIT) -#define RCC_APB1RSTR_TIM3RST BIT(RCC_APB1RSTR_TIM3RST_BIT) -#define RCC_APB1RSTR_TIM2RST BIT(RCC_APB1RSTR_TIM2RST_BIT) - -/* -RCC APB2 peripheral reset register (RCC_APB2RSTR) -Address offset: 0x24 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_APB2RSTR_DSIRST_BIT 27 -#define RCC_APB2RSTR_LTDCRST_BIT 26 -#define RCC_APB2RSTR_SAI1RST_BIT 22 -#define RCC_APB2RSTR_SPI6RST_BIT 21 -#define RCC_APB2RSTR_SPI5RST_BIT 20 -#define RCC_APB2RSTR_TIM11RST_BIT 18 -#define RCC_APB2RSTR_TIM10RST_BIT 17 -#define RCC_APB2RSTR_TIM9RST_BIT 16 -#define RCC_APB2RSTR_SYSCFGRST_BIT 14 -#define RCC_APB2RSTR_SPI4RST_BIT 13 -#define RCC_APB2RSTR_SPI1RST_BIT 12 -#define RCC_APB2RSTR_SDIORST_BIT 11 -#define RCC_APB2RSTR_ADCRST_BIT 8 -#define RCC_APB2RSTR_USART6RST_BIT 5 -#define RCC_APB2RSTR_USART1RST_BIT 4 -#define RCC_APB2RSTR_TIM8RST_BIT 2 -#define RCC_APB2RSTR_TIM1RST_BIT 1 - -#define RCC_APB2RSTR_DSIRST BIT(RCC_APB2RSTR_DSIRST_BIT) -#define RCC_APB2RSTR_LTDCRST BIT(RCC_APB2RSTR_LTDCRST_BIT) -#define RCC_APB2RSTR_SAI1RST BIT(RCC_APB2RSTR_SAI1RST_BIT) -#define RCC_APB2RSTR_SPI6RST BIT(RCC_APB2RSTR_SPI6RST_BIT) -#define RCC_APB2RSTR_SPI5RST BIT(RCC_APB2RSTR_SPI5RST_BIT) -#define RCC_APB2RSTR_TIM11RST BIT(RCC_APB2RSTR_TIM11RST_BIT) -#define RCC_APB2RSTR_TIM10RST BIT(RCC_APB2RSTR_TIM10RST_BIT) -#define RCC_APB2RSTR_TIM9RST BIT(RCC_APB2RSTR_TIM9RST_BIT) -#define RCC_APB2RSTR_SYSCFGRST BIT(RCC_APB2RSTR_SYSCFGRST_BIT) -#define RCC_APB2RSTR_SPI4RST BIT(RCC_APB2RSTR_SPI4RST_BIT) -#define RCC_APB2RSTR_SPI1RST BIT(RCC_APB2RSTR_SPI1RST_BIT) -#define RCC_APB2RSTR_SDIORST BIT(RCC_APB2RSTR_SDIORST_BIT) -#define RCC_APB2RSTR_ADCRST BIT(RCC_APB2RSTR_ADCRST_BIT) -#define RCC_APB2RSTR_USART6RST BIT(RCC_APB2RSTR_USART6RST_BIT) -#define RCC_APB2RSTR_USART1RST BIT(RCC_APB2RSTR_USART1RST_BIT) -#define RCC_APB2RSTR_TIM8RST BIT(RCC_APB2RSTR_TIM8RST_BIT) -#define RCC_APB2RSTR_TIM1RST BIT(RCC_APB2RSTR_TIM1RST_BIT) - -/* -RCC AHB1 peripheral clock enable register (RCC_AHB1ENR) -Address offset: 0x30 -Reset value: 0x0010 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB1ENR_OTGHSULPIEN_BIT 30 -#define RCC_AHB1ENR_OTGHSEN_BIT 29 -#define RCC_AHB1ENR_ETHMACPTPEN_BIT 28 -#define RCC_AHB1ENR_ETHMACRXEN_BIT 27 -#define RCC_AHB1ENR_ETHMACXTEN_BIT 26 -#define RCC_AHB1ENR_ETHMACEN_BIT 25 -#define RCC_AHB1ENR_DMA2DEN_BIT 23 -#define RCC_AHB1ENR_DMA2EN_BIT 22 -#define RCC_AHB1ENR_DMA1EN_BIT 21 -#define RCC_AHB1ENR_CCMDATARAMEN_BIT 20 -#define RCC_AHB1ENR_BKPSRAMEN_BIT 18 -#define RCC_AHB1ENR_CRCEN_BIT 12 -#define RCC_AHB1ENR_GPIOK_BIT 10 -#define RCC_AHB1ENR_GPIOJ_BIT 9 -#define RCC_AHB1ENR_GPIOI_BIT 8 -#define RCC_AHB1ENR_GPIOH_BIT 7 -#define RCC_AHB1ENR_GPIOG_BIT 6 -#define RCC_AHB1ENR_GPIOF_BIT 5 -#define RCC_AHB1ENR_GPIOE_BIT 4 -#define RCC_AHB1ENR_GPIOD_BIT 3 -#define RCC_AHB1ENR_GPIOC_BIT 2 -#define RCC_AHB1ENR_GPIOB_BIT 1 -#define RCC_AHB1ENR_GPIOA_BIT 0 - -/* -RCC AHB2 peripheral clock enable register (RCC_AHB2ENR) -Address offset: 0x34 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB2ENR_OTGFSEN_BIT 7 -#define RCC_AHB2ENR_RNGEN_BIT 6 -#define RCC_AHB2ENR_HASHEN_BIT 5 -#define RCC_AHB2ENR_CRYPEN_BIT 4 -#define RCC_AHB2ENR_DCMIEN_BIT 0 - -/* -RCC AHB3 peripheral clock enable register (RCC_AHB3ENR) -Address offset: 0x38 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB3ENR_QSPIEN_BIT 1 -#define RCC_AHB3ENR_FMCEN_BIT 0 - -/* -RCC APB1 peripheral clock enable register (RCC_APB1ENR) -Address offset: 0x40 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ -#define RCC_APB1ENR 0x40023840 -#define RCC_APB1ENR_UART8EN_BIT 31 -#define RCC_APB1ENR_UART7EN_BIT 30 -#define RCC_APB1ENR_DACEN_BIT 29 -#define RCC_APB1ENR_PWREN_BIT 28 - -#define RCC_APB1ENR_CAN2EN_BIT 26 -#define RCC_APB1ENR_CAN1EN_BIT 25 -#define RCC_APB1ENR_CANEN_BIT 25 // only for compatibility - -#define RCC_APB1ENR_I2C3EWN_BIT 23 -#define RCC_APB1ENR_I2C2EN_BIT 22 -#define RCC_APB1ENR_I2C1EN_BIT 21 -#define RCC_APB1ENR_UART5EN_BIT 20 -#define RCC_APB1ENR_UART4EN_BIT 19 -#define RCC_APB1ENR_USART3EN_BIT 18 -#define RCC_APB1ENR_USART2EN_BIT 17 -#define RCC_APB1ENR_SPI3EN_BIT 15 -#define RCC_APB1ENR_SPI2EN_BIT 14 -#define RCC_APB1ENR_WWDEN_BIT 11 -#define RCC_APB1ENR_TIM14EN_BIT 8 -#define RCC_APB1ENR_TIM13EN_BIT 7 -#define RCC_APB1ENR_TIM12EN_BIT 6 -#define RCC_APB1ENR_TIM7EN_BIT 5 -#define RCC_APB1ENR_TIM6EN_BIT 4 -#define RCC_APB1ENR_TIM5EN_BIT 3 -#define RCC_APB1ENR_TIM4EN_BIT 2 -#define RCC_APB1ENR_TIM3EN_BIT 1 -#define RCC_APB1ENR_TIM2EN_BIT 0 - -#define RCC_APB1ENR_UART8EN BIT(RCC_APB1ENR_UART8EN_BIT) -#define RCC_APB1ENR_UART7EN BIT(RCC_APB1ENR_UART7EN_BIT) -#define RCC_APB1ENR_DACEN BIT(RCC_APB1ENR_DACEN_BIT) -#define RCC_APB1ENR_PWREN BIT(RCC_APB1ENR_PWREN_BIT) - -#define RCC_APB1ENR_CAN2EN BIT(RCC_APB1ENR_CAN2EN_BIT) -#define RCC_APB1ENR_CAN1EN BIT(RCC_APB1ENR_CAN1EN_BIT) -#define RCC_APB1ENR_CANEN BIT(RCC_APB1ENR_CANEN_BIT) // only for compatibility - -#define RCC_APB1ENR_I2C3EN BIT(RCC_APB1ENR_I2C3EN_BIT) -#define RCC_APB1ENR_I2C2EN BIT(RCC_APB1ENR_I2C2EN_BIT) -#define RCC_APB1ENR_I2C1EN BIT(RCC_APB1ENR_I2C1EN_BIT) -#define RCC_APB1ENR_UART5EN BIT(RCC_APB1ENR_UART5EN_BIT) -#define RCC_APB1ENR_UART4EN BIT(RCC_APB1ENR_UART4EN_BIT) -#define RCC_APB1ENR_USART3EN BIT(RCC_APB1ENR_USART3EN_BIT) -#define RCC_APB1ENR_USART2EN BIT(RCC_APB1ENR_USART2EN_BIT) -#define RCC_APB1ENR_SPI3EN BIT(RCC_APB1ENR_SPI3EN_BIT) -#define RCC_APB1ENR_SPI2EN BIT(RCC_APB1ENR_SPI2EN_BIT) -#define RCC_APB1ENR_WWDEN BIT(RCC_APB1ENR_WWDEN_BIT) -#define RCC_APB1ENR_TIM14EN BIT(RCC_APB1ENR_TIM14EN_BIT) -#define RCC_APB1ENR_TIM13EN BIT(RCC_APB1ENR_TIM13EN_BIT) -#define RCC_APB1ENR_TIM12EN BIT(RCC_APB1ENR_TIM12EN_BIT) -#define RCC_APB1ENR_TIM7EN BIT(RCC_APB1ENR_TIM7EN_BIT) -#define RCC_APB1ENR_TIM6EN BIT(RCC_APB1ENR_TIM6EN_BIT) -#define RCC_APB1ENR_TIM5EN BIT(RCC_APB1ENR_TIM5EN_BIT) -#define RCC_APB1ENR_TIM4EN BIT(RCC_APB1ENR_TIM4EN_BIT) -#define RCC_APB1ENR_TIM3EN BIT(RCC_APB1ENR_TIM3EN_BIT) -#define RCC_APB1ENR_TIM2EN BIT(RCC_APB1ENR_TIM2EN_BIT) - -/* -RCC APB2 peripheral clock enable register (RCC_APB2ENR) -Address offset: 0x44 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ -#define RCC_APB2ENR 0x40023844 -#define RCC_APB2ENR_DSIEN_BIT 27 -#define RCC_APB2ENR_LTDCEN_BIT 26 -#define RCC_APB2ENR_SAI1EN_BIT 22 -#define RCC_APB2ENR_SPI6EN_BIT 21 -#define RCC_APB2ENR_SPI5EN_BIT 20 -#define RCC_APB2ENR_TIM11EN_BIT 18 -#define RCC_APB2ENR_TIM10EN_BIT 17 -#define RCC_APB2ENR_TIM9EN_BIT 16 -#define RCC_APB2ENR_SYSCFGEN_BIT 14 -#define RCC_APB2ENR_SPI4EN_BIT 13 -#define RCC_APB2ENR_SPI1EN_BIT 12 -#define RCC_APB2ENR_SDIOEN_BIT 11 -#define RCC_APB2ENR_ADC3EN_BIT 10 -#define RCC_APB2ENR_ADC2EN_BIT 9 -#define RCC_APB2ENR_ADC1EN_BIT 8 -#define RCC_APB2ENR_USART6EN_BIT 5 -#define RCC_APB2ENR_USART1EN_BIT 4 -#define RCC_APB2ENR_TIM8EN_BIT 1 -#define RCC_APB2ENR_TIM1EN_BIT 0 - -#define RCC_APB2ENR_DSIEN BIT(RCC_APB2ENR_DSIEN_BIT) -#define RCC_APB2ENR_LTDCEN BIT(RCC_APB2ENR_LTDCEN_BIT) -#define RCC_APB2ENR_SAI1EN BIT(RCC_APB2ENR_SAI1EN_BIT) -#define RCC_APB2ENR_SPI6EN BIT(RCC_APB2ENR_SPI6EN_BIT) -#define RCC_APB2ENR_SPI5EN BIT(RCC_APB2ENR_SPI5EN_BIT) -#define RCC_APB2ENR_TIM11EN BIT(RCC_APB2ENR_TIM11EN_BIT) -#define RCC_APB2ENR_TIM10EN BIT(RCC_APB2ENR_TIM10EN_BIT) -#define RCC_APB2ENR_TIM9EN BIT(RCC_APB2ENR_TIM9EN_BIT) -#define RCC_APB2ENR_SYSCFGEN BIT(RCC_APB2ENR_SYSCFGEN_BIT) -#define RCC_APB2ENR_SPI4EN BIT(RCC_APB2ENR_SPI4EN_BIT) -#define RCC_APB2ENR_SPI1EN BIT(RCC_APB2ENR_SPI1EN_BIT) -#define RCC_APB2ENR_SDIOEN BIT(RCC_APB2ENR_SDIOEN_BIT) -#define RCC_APB2ENR_ADC3EN BIT(RCC_APB2ENR_ADC3EN_BIT) -#define RCC_APB2ENR_ADC2EN BIT(RCC_APB2ENR_ADC2EN_BIT) -#define RCC_APB2ENR_ADC1EN BIT(RCC_APB2ENR_ADC1EN_BIT) -#define RCC_APB2ENR_USART6EN BIT(RCC_APB2ENR_USART6EN_BIT) -#define RCC_APB2ENR_USART1EN BIT(RCC_APB2ENR_USART1EN_BIT) -#define RCC_APB2ENR_TIM8EN BIT(IRCC_APB2ENR_TIM8EN_BIT) -#define RCC_APB2ENR_TIM1EN BIT(RCC_APB2ENR_TIM1EN_BIT) - -/* -RCC AHB1 peripheral clock enable in low power mode register -(RCC_AHB1LPENR) -Address offset: 0x50 -Reset value: 0x7EEF 97FF -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB1LPENR_OTGHSULPILPEN_BIT 30 -#define RCC_AHB1LPENR_OTGHSLPEN_BIT 29 -#define RCC_AHB1LPENR_ETHPTPLPEN_BIT 28 -#define RCC_AHB1LPENR_ETHRXLPEN_BIT 27 -#define RCC_AHB1LPENR_ETHTXLPEN_BIT 26 -#define RCC_AHB1LPENR_ETHMACLPEN_BIT 25 -#define RCC_AHB1LPENR_DMA2DLPEN_BIT 23 -#define RCC_AHB1LPENR_DMA2LPEN_BIT 22 -#define RCC_AHB1LPENR_DMA1LPEN_BIT 21 -#define RCC_AHB1LPENR_SRAM3LPEN_BIT 19 -#define RCC_AHB1LPENR_BKPSRAMLPEN_BIT 18 -#define RCC_AHB1LPENR_SRAM2LPEN_BIT 17 -#define RCC_AHB1LPENR_SRAM1LPEN_BIT 16 -#define RCC_AHB1LPENR_FLITFLPEN_BIT 15 -#define RCC_AHB1LPENR_CRCLPEN_BIT 12 -#define RCC_AHB1LPENR_GPIOK_BIT 10 -#define RCC_AHB1LPENR_GPIOJ_BIT 9 -#define RCC_AHB1LPENR_GPIOI_BIT 8 -#define RCC_AHB1LPENR_GPIOH_BIT 7 -#define RCC_AHB1LPENR_GPIOG_BIT 6 -#define RCC_AHB1LPENR_GPIOF_BIT 5 -#define RCC_AHB1LPENR_GPIOE_BIT 4 -#define RCC_AHB1LPENR_GPIOD_BIT 3 -#define RCC_AHB1LPENR_GPIOC_BIT 2 -#define RCC_AHB1LPENR_GPIOB_BIT 1 -#define RCC_AHB1LPENR_GPIOA_BIT 0 - -#define RCC_AHB1LPENR_OTGHSULPILPEN BIT(RCC_AHB1LPENR_OTGHSULPILPEN_BIT) -#define RCC_AHB1LPENR_OTGHSLPEN BIT(RCC_AHB1LPENR_OTGHSLPEN_BIT) -#define RCC_AHB1LPENR_ETHPTPLPEN BIT(RCC_AHB1LPENR_ETHPTPLPEN_BIT) -#define RCC_AHB1LPENR_ETHRXLPEN BIT(RCC_AHB1LPENR_ETHRXLPEN_BIT) -#define RCC_AHB1LPENR_ETHTXLPEN BIT(RCC_AHB1LPENR_ETHTXLPEN_BIT) -#define RCC_AHB1LPENR_ETHMACLPEN BIT(RCC_AHB1LPENR_ETHMACLPEN_BIT) -#define RCC_AHB1LPENR_DMA2DLPEN BIT(RCC_AHB1LPENR_DMA2DLPEN_BIT) -#define RCC_AHB1LPENR_DMA2LPEN BIT(RCC_AHB1LPENR_DMA2LPEN_BIT) -#define RCC_AHB1LPENR_DMA1LPEN BIT(CC_AHB1LPENR_DMA1LPEN_BIT) -#define RCC_AHB1LPENR_SRAM3LPEN BIT(RCC_AHB1LPENR_SRAM3LPEN_BIT) -#define RCC_AHB1LPENR_BKPSRAMLPEN BIT(RCC_AHB1LPENR_BKPSRAMLPEN_BIT) -#define RCC_AHB1LPENR_SRAM2LPEN BIT(RCC_AHB1LPENR_SRAM2LPEN_BIT) -#define RCC_AHB1LPENR_SRAM1LPEN BIT(RCC_AHB1LPENR_SRAM1LPEN_BIT) -#define RCC_AHB1LPENR_FLITFLPEN BIT(RCC_AHB1LPENR_FLITFLPEN_BIT) -#define RCC_AHB1LPENR_CRCLPEN BIT(RCC_AHB1LPENR_CRCLPEN_BIT) -#define RCC_AHB1LPENR_GPIOKLPEN BIT(RCC_AHB1LPENR_GPIOKLPEN_BIT) -#define RCC_AHB1LPENR_GPIOJLPEN BIT(RCC_AHB1LPENR_GPIOJLPEN_BIT) -#define RCC_AHB1LPENR_GPIOILPEN BIT(RCC_AHB1LPENR_GPIOILPEN_BIT) -#define RCC_AHB1LPENR_GPIOHLPEN BIT(RCC_AHB1LPENR_GPIOHLPEN_BIT) -#define RCC_AHB1LPENR_GPIOGLPEN BIT(RCC_AHB1LPENR_GPIOGLPEN_BIT) -#define RCC_AHB1LPENR_GPIOFLPEN BIT(RCC_AHB1LPENR_GPIOFLPEN_BIT) -#define RCC_AHB1LPENR_GPIOELPEN BIT(RCC_AHB1LPENR_GPIOELPEN_BIT) -#define RCC_AHB1LPENR_GPIODLPEN BIT(RCC_AHB1LPENR_GPIODLPEN_BIT) -#define RCC_AHB1LPENR_GPIOCLPEN BIT(RCC_AHB1LPENR_GPIOCLPEN_BIT) -#define RCC_AHB1LPENR_GPIOBLPEN BIT(RCC_AHB1LPENR_GPIOBLPEN_BIT) -#define RCC_AHB1LPENR_GPIOALPEN BIT(RCC_AHB1LPENR_GPIOALPEN_BIT) - -/* -RCC AHB2 peripheral clock enable in low power mode register -(RCC_AHB2LPENR) -Address offset: 0x54 -Reset value: 0x0000 00F1 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB2LPENR_OTGFSLPEN_BIT 7 -#define RCC_AHB2LPENR_RNGLPEN_BIT 6 -#define RCC_AHB2LPENR_HASHLPEN_BIT 5 -#define RCC_AHB2LPENR_CRYPLPEN_BIT 4 -#define RCC_AHB2LPENR_DCMILPEN_BIT 0 - -#define RCC_AHB2LPENR_OTGFSLPEN BIT(RCC_AHB2LPENR_OTGFSLPEN_BIT) -#define RCC_AHB2LPENR_RNGLPEN BIT(RCC_AHB2LPENR_RNGLPEN_BIT) -#define RCC_AHB2LPENR_HASHLPEN BIT(RCC_AHB2LPENR_HASHLPEN_BIT) -#define RCC_AHB2LPENR_CRYPLPEN BIT(RCC_AHB2LPENR_CRYPLPEN_BIT) -#define RCC_AHB2LPENR_DCMILPEN BIT(RCC_AHB2LPENR_DCMILPEN_BIT) - -/* -RCC AHB3 peripheral clock enable in low power mode register -(RCC_AHB3LPENR) -Address offset: 0x58 -Reset value: 0x0000 0003 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_AHB3LPENR_QSPILPEN_BIT 1 -#define RCC_AHB3LPENR_FMCLPEN_BIT 0 - -#define RCC_AHB3LPENR_QSPILPEN BIT(RCC_AHB3LPENR_QSPILPEN_BIT) -#define RCC_AHB3LPENR_FMCLPEN BIT(RCC_AHB3LPENR_FMCLPEN_BIT) - -/* -RCC APB1 peripheral clock enable in low power mode register -(RCC_APB1LPENR) -Address offset: 0x60 -Reset value: 0xF6FE C9FF -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_APB1LPENR_UART8LPEN_BIT 31 -#define RCC_APB1LPENR_UART7LPEN_BIT 30 -#define RCC_APB1LPENR_DACLPEN_BIT 29 -#define RCC_APB1LPENR_PWRLPEN_BIT 28 - -#define RCC_APB1LPENR_CAN2LPEN_BIT 26 -#define RCC_APB1LPENR_CAN1LPEN_BIT 25 -#define RCC_APB1LPENR_CANLPEN_BIT 25 // only for compatibility - -#define RCC_APB1LPENR_I2C3LPEN_BIT 23 -#define RCC_APB1LPENR_I2C2LPEN_BIT 22 -#define RCC_APB1LPENR_I2C1LPEN_BIT 21 -#define RCC_APB1LPENR_UART5LPEN_BIT 20 -#define RCC_APB1LPENR_UART4LPEN_BIT 19 -#define RCC_APB1LPENR_USART3LPEN_BIT 18 -#define RCC_APB1LPENR_USART2LPEN_BIT 17 -#define RCC_APB1LPENR_SPI3LPEN_BIT 15 -#define RCC_APB1LPENR_SPI2LPEN_BIT 14 -#define RCC_APB1LPENR_WWDLPEN_BIT 11 -#define RCC_APB1LPENR_TIM14LPEN_BIT 8 -#define RCC_APB1LPENR_TIM13LPEN_BIT 7 -#define RCC_APB1LPENR_TIM12LPEN_BIT 6 -#define RCC_APB1LPENR_TIM7LPEN_BIT 5 -#define RCC_APB1LPENR_TIM6LPEN_BIT 4 -#define RCC_APB1LPENR_TIM5LPEN_BIT 3 -#define RCC_APB1LPENR_TIM4LPEN_BIT 2 -#define RCC_APB1LPENR_TIM3LPEN_BIT 1 -#define RCC_APB1LPENR_TIM2LPEN_BIT 0 - -#define RCC_APB1LPENR_UART8LPEN_BIT BIT(RCC_APB1LPENR_UART8LPEN_BIT) -#define RCC_APB1LPENR_UART7LPEN BIT(RCC_APB1LPENR_UART7LPEN_BIT) -#define RCC_APB1LPENR_DACLPEN BIT(RCC_APB1LPENR_DACLPEN_BIT) -#define RCC_APB1LPENR_PWRLPEN BIT(RCC_APB1LPENR_PWRLPEN_BIT) -#define RCC_APB1LPENR_CAN2LPEN BIT(RCC_APB1LPENR_CAN2LPEN_BIT) -#define RCC_APB1LPENR_CAN1LPEN BIT(RCC_APB1LPENR_CAN1LPEN_BIT) -#define RCC_APB1LPENR_CANLPEN BIT(RCC_APB1LPENR_CANLPEN_BIT) // only for compatibilit -#define RCC_APB1LPENR_I2C3LPEN BIT(RCC_APB1LPENR_I2C3LPEN_BIT) -#define RCC_APB1LPENR_I2C2LPEN BIT(RCC_APB1LPENR_I2C2LPEN_BIT) -#define RCC_APB1LPENR_I2C1LPEN BIT(RCC_APB1LPENR_I2C1LPEN_BIT) -#define RCC_APB1LPENR_UART5LPEN BIT(RCC_APB1LPENR_UART5LPEN_BIT) -#define RCC_APB1LPENR_UART4LPEN BIT(RCC_APB1LPENR_UART4LPEN_BIT) -#define RCC_APB1LPENR_USART3LPEN BIT(RCC_APB1LPENR_USART3LPEN_BIT) -#define RCC_APB1LPENR_USART2LPEN BIT(RCC_APB1LPENR_USART2LPEN_BIT) -#define RCC_APB1LPENR_SPI3LPEN BIT(RCC_APB1LPENR_SPI3LPEN_BIT) -#define RCC_APB1LPENR_SPI2LPEN BIT(RCC_APB1LPENR_SPI2LPEN_BIT) -#define RCC_APB1LPENR_WWDLPEN BIT(RCC_APB1LPENR_WWDLPEN_BIT) -#define RCC_APB1LPENR_TIM14LPEN BIT(RCC_APB1LPENR_TIM14LPEN_BIT) -#define RCC_APB1LPENR_TIM13LPEN BIT(RCC_APB1LPENR_TIM13LPEN_BIT) -#define RCC_APB1LPENR_TIM12LPEN BIT(RCC_APB1LPENR_TIM12LPEN_BIT) -#define RCC_APB1LPENR_TIM7LPEN BIT(RCC_APB1LPENR_TIM7LPEN_BIT) -#define RCC_APB1LPENR_TIM6LPEN BIT(RCC_APB1LPENR_TIM6LPEN_BIT) -#define RCC_APB1LPENR_TIM5LPEN BIT(RCC_APB1LPENR_TIM5LPEN_BIT) -#define RCC_APB1LPENR_TIM4LPEN BIT(RCC_APB1LPENR_TIM4LPEN_BIT) -#define RCC_APB1LPENR_TIM3LPEN BIT(RCC_APB1LPENR_TIM3LPEN_BIT) -#define RCC_APB1LPENR_TIM2LPEN BIT(RCC_APB1LPENR_TIM2LPEN_BIT) - - -/* -RCC APB2 peripheral clock enabled in low power mode register -(RCC_APB2LPENR) -Address offset: 0x64 -Reset value: 0x0C77 7F33 -Access: no wait state, word, half-word and byte access. -*/ - - -#define RCC_APB2LPENR_DSILPEN_BIT 27 -#define RCC_APB2LPENR_LTDCLPEN_BIT 26 -#define RCC_APB2LPENR_SAI1LPEN_BIT 22 -#define RCC_APB2LPENR_SPI6LPEN_BIT 21 -#define RCC_APB2LPENR_SPI5LPEN_BIT 20 -#define RCC_APB2LPENR_TIM11LPEN_BIT 18 -#define RCC_APB2LPENR_TIM10LPEN_BIT 17 -#define RCC_APB2LPENR_TIM9LPEN_BIT 16 -#define RCC_APB2LPENR_SYSCFGLPEN_BIT 14 -#define RCC_APB2LPENR_SPI4LPEN_BIT 13 -#define RCC_APB2LPENR_SPI1LPEN_BIT 12 -#define RCC_APB2LPENR_SDIOLPEN_BIT 11 -#define RCC_APB2LPENR_ADC3LPEN_BIT 10 -#define RCC_APB2LPENR_ADC2LPEN_BIT 9 -#define RCC_APB2LPENR_ADC1LPEN_BIT 8 -#define RCC_APB2LPENR_USART6LPEN_BIT 5 -#define RCC_APB2LPENR_USART1LPEN_BIT 4 -#define RCC_APB2LPENR_TIM8LPEN_BIT 1 -#define RCC_APB2LPENR_TIM1LPEN_BIT 0 - -#define RCC_APB2LPENR_DSILPEN BIT(RCC_APB2LPENR_DSILPEN_BIT) -#define RCC_APB2LPENR_LTDCLPEN BIT(RCC_APB2LPENR_LTDCLPEN_BIT) -#define RCC_APB2LPENR_SAI1LPEN BIT(RCC_APB2LPENR_SAI1LPEN_BIT) -#define RCC_APB2LPENR_SPI6LPEN BIT(RCC_APB2LPENR_SPI6LPEN_BIT) -#define RCC_APB2LPENR_SPI5LPEN BIT(RCC_APB2LPENR_SPI5LPEN_BIT) -#define RCC_APB2LPENR_TIM11LPEN BIT(RCC_APB2LPENR_TIM11LPEN_BIT) -#define RCC_APB2LPENR_TIM10LPEN BIT(RCC_APB2LPENR_TIM10LPEN_BIT) -#define RCC_APB2LPENR_TIM9LPEN BIT(RCC_APB2LPENR_TIM9LPEN_BIT) -#define RCC_APB2LPENR_SYSCFGLPEN BIT(RCC_APB2LPENR_SYSCFGLPEN_BIT) -#define RCC_APB2LPENR_SPI4LPEN BIT(RCC_APB2LPENR_SPI4LPEN_BIT) -#define RCC_APB2LPENR_SPI1LPEN BIT(RCC_APB2LPENR_SPI1LPEN_BIT) -#define RCC_APB2LPENR_SDIOLPEN BIT(RCC_APB2LPENR_SDIOLPEN_BIT) -#define RCC_APB2LPENR_ADC3LPEN BIT(RCC_APB2LPENR_ADC3LPEN_BIT) -#define RCC_APB2LPENR_ADC2LPEN BIT(RCC_APB2LPENR_ADC2LPEN_BIT) -#define RCC_APB2LPENR_ADC1LPEN BIT(RCC_APB2LPENR_ADC1LPEN_BIT) -#define RCC_APB2LPENR_USART6LPEN BIT(RCC_APB2LPENR_USART6LPEN_BIT) -#define RCC_APB2LPENR_USART1LPEN BIT(RCC_APB2LPENR_USART1LPEN_BIT) -#define RCC_APB2LPENR_TIM8LPEN BIT(IRCC_APB2LPENR_TIM8LPEN_BIT) -#define RCC_APB2LPENR_TIM1LPEN BIT(RCC_APB2LPENR_TIM1LPEN_BIT) - -/* -Address offset: 0x70 -Reset value: 0x0000 0000, reset by Backup domain reset. -Access: 0 ≤ wait state ≤ 3, word, half-word and byte access -Wait states are inserted in case of successive accesses to this register. -*/ - -#define RCC_BDCR_BDRST_BIT 16 -#define RCC_BDCR_RTCEN_BIT 15 -#define RCC_BDCR_LSEMOD_BIT 3 -#define RCC_BDCR_LSEBYP_BIT 2 -#define RCC_BDCR_LSERDY_BIT 1 -#define RCC_BDCR_LSEON_BIT 0 - -#define RCC_BDCR_BDRST BIT(RCC_BDCR_BDRST_BIT) -#define RCC_BDCR_RTCEN BIT(RCC_BDCR_RTC_BIT) -#define RCC_BDCR_RTCSEL (0x3 << 8) -#define RCC_BDCR_RTCSEL_NONE (0x0 << 8) -#define RCC_BDCR_RTCSEL_LSE (0x1 << 8) -#define RCC_BDCR_RTCSEL_HSE (0x3 << 8) -#define RCC_BDCR_LSEMOD BIT(RCC_BDCR_LSEMOD_BIT) -#define RCC_BDCR_LSEBYP BIT(RCC_BDCR_LSEBYP_BIT) -#define RCC_BDCR_LSERDY BIT(RCC_BDCR_LSERDY_BIT) -#define RCC_BDCR_LSEON BIT(RCC_BDCR_LSEON_BIT) - -/* -RCC clock control & status register (RCC_CSR) -Address offset: 0x74 -Reset value: 0x0E00 0000, reset by system reset, except reset flags by power reset only. -Access: 0 ≤ wait state ≤ 3, word, half-word and byte access -Wait states are inserted in case of successive accesses to this register. -*/ - -#define RCC_CSR_LPWRRSTF_BIT 31 -#define RCC_CSR_WWDGRSTF_BIT 30 -#define RCC_CSR_IWDGRSTF_BIT 29 -#define RCC_CSR_SFTRSTF_BIT 28 -#define RCC_CSR_PORRSTF_BIT 27 -#define RCC_CSR_PINRSTF_BIT 26 -#define RCC_CSR_BORRSTF_BIT 25 -#define RCC_CSR_RMVF_BIT 24 -#define RCC_CSR_LSIRDY_BIT 1 -#define RCC_CSR_LSION_BIT 0 - -#define RCC_CSR_LPWRRSTF BIT(RCC_CSR_LPWRRSTF_BIT) -#define RCC_CSR_WWDGRSTF BIT(RCC_CSR_WWDGRSTF_BIT) -#define RCC_CSR_IWDGRSTF BIT(RCC_CSR_IWDGRSTF_BIT) -#define RCC_CSR_SFTRSTF BIT(RCC_CSR_SFTRSTF_BIT) -#define RCC_CSR_PORRSTF BIT(RCC_CSR_PORRSTF_BIT) -#define RCC_CSR_PINRSTF BIT(RCC_CSR_PINRSTF_BIT) -#define RCC_CSR_BORRSTF BIT(RCC_CSR_BORRSTF_BIT) -#define RCC_CSR_RMVF BIT(RCC_CSR_RMVF_BIT) -#define RCC_CSR_LSIRDY BIT(RCC_CSR_LSIRDY_BIT) -#define RCC_CSR_LSION BIT(RCC_CSR_LSION_BIT) - -/* -RCC spread spectrum clock generation register (RCC_SSCGR) -Address offset: 0x80 -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -The spread spectrum clock generation is available only for the main PLL. -The RCC_SSCGR register must be written either before the main PLL is enabled or after -the main PLL disabled. -*/ - -#define RCC_SSCGR_SSCGEN_BIT 31 -#define RCC_SSCGR_SPREADSEL_BIT 30 - -#define RCC_SSCGR_SSCGEN BIT(RCC_SSCGR_SSCGEN_BIT) -#define RCC_SSCGR_SPREADSEL BIT(RCC_SSCGR_SPREADSEL_BIT) -#define RCC_SSCGR_INCSTEP (0x00 << 13) -#define RCC_SSCGR_MODPER (0x00 << 0) - -/* -RCC PLLI2S configuration register (RCC_PLLI2SCFGR) -Address offset: 0x84 -Reset value: 0x2400 3000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_PLLI2SCFGR_PLLI2SR (0b010 << 28) // alfran: to be setted -#define RCC_PLLI2SCFGR_PLLI2SQ (0b0010 << 24) // alfran: to be setted -#define RCC_PLLI2SCFGR_PLLI2SN (0b001100010 <<6) // alfran: to be setted - -/* -RCC PLL configuration register (RCC_PLLSAICFGR) -Address offset: 0x88 -Reset value: 0x2400 3000 -Access: no wait state, word, half-word and byte access. -This register is used to configure the PLLSAI clock outputs according to the formulas: -*/ - -#define RCC_PLLSAICFGR_PLLSAIR (0b010 << 28) // alfran: to be setted -#define RCC_PLLSAICFGR_PLLSAIQ (0b0010 << 24) // alfran: to be setted -#define RCC_PLLSAICFGR_PLLSAIP (0b00 << 16) // alfran: to be setted -#define RCC_PLLSAICFGR_PLLSAIN (0b001100010 << 6) // alfran: to be setted - -/* -RCC Dedicated Clock Configuration Register (RCC_DCKCFGR) -Address offset: 0x8C -Reset value: 0x0000 0000 -Access: no wait state, word, half-word and byte access. -*/ - -#define RCC_DCKCFGR_DSISEL_BIT 29 -#define RCC_DCKCFGR_SDMMCSEL_BIT 28 -#define RCC_DCKCFGR_48MSEL_BIT 27 -#define RCC_DCKCFGR_TIMPRE_BIT 24 - -#define RCC_DCKCFGR_DSISEL BIT(RCC_DCKCFGR_DSISEL_BIT) -#define RCC_DCKCFGR_SDMMCSEL BIT(RCC_DCKCFGR_SDMMCSEL_BIT) -#define RCC_DCKCFGR_48MSEL BIT(RCC_DCKCFGR_48MSEL_BIT) -#define RCC_DCKCFGR_TIMPRE BIT(RCC_DCKCFGR_TIMPRE_BIT) -#define RCC_DCKCFGR_SAI1BSRC (0b00 << 22) // alfran: to be setted -#define RCC_DCKCFGR_SAI1ARSR (0b00 << 20) // alfran: to be setted -#define RCC_DCKCFGR_PLLSAIDIVR (0b00 << 16) // alfran: no configuration reported in datasheet -#define RCC_DCKCFGR_PLLSAIDIVQ (0b00000 << 8)// alfran: to be setted -#define RCC_DCKCFGR_PLLIS2DIVQ (0b00000 << 0)// alfran: to be setted - -/* - * Convenience routines - */ - -/** - * SYSCLK sources - * @see rcc_clk_init() - */ -typedef enum rcc_sysclk_src { - RCC_CLKSRC_HSI = 0x0, - RCC_CLKSRC_HSE = 0x1, - RCC_CLKSRC_PLL = 0x2, -} rcc_sysclk_src; - -/** - * PLL entry clock source - * @see rcc_clk_init() - */ -typedef enum rcc_pllsrc { - RCC_PLLSRC_HSE = (0x1 << 16), - RCC_PLLSRC_HSI_DIV_2 = (0x0 << 16) -} rcc_pllsrc; - -/** - * PLL multipliers - * @see rcc_clk_init() - */ -typedef enum rcc_pll_multiplier { - RCC_PLLMUL_2 = (0x0 << 18), - RCC_PLLMUL_3 = (0x1 << 18), - RCC_PLLMUL_4 = (0x2 << 18), - RCC_PLLMUL_5 = (0x3 << 18), - RCC_PLLMUL_6 = (0x4 << 18), - RCC_PLLMUL_7 = (0x5 << 18), - RCC_PLLMUL_8 = (0x6 << 18), - RCC_PLLMUL_9 = (0x7 << 18), - RCC_PLLMUL_10 = (0x8 << 18), - RCC_PLLMUL_11 = (0x9 << 18), - RCC_PLLMUL_12 = (0xA << 18), - RCC_PLLMUL_13 = (0xB << 18), - RCC_PLLMUL_14 = (0xC << 18), - RCC_PLLMUL_15 = (0xD << 18), - RCC_PLLMUL_16 = (0xE << 18), -} rcc_pll_multiplier; - -/** - * @brief Identifies bus and clock line for a peripheral. - * - * Also generally useful as a unique identifier for that peripheral - * (or its corresponding device struct). - */ -typedef enum rcc_clk_id { - - // AHB3 - - RCC_FMC, - RCC_QSPI, - - // AHB2 - RCC_DCMI, - - RCC_CRYP, - RCC_HASH, - RCC_RNG, - RCC_OTGFS, - RCC_USBFS, //for compatibility - - // AHB1 - RCC_GPIOA, - RCC_GPIOB, - RCC_GPIOC, - RCC_GPIOD, - RCC_GPIOE, - RCC_GPIOF, - RCC_GPIOG, - RCC_GPIOH, - RCC_GPIOI, - RCC_GPIOJ, - RCC_GPIOK, - - RCC_CRC, - - RCC_FLITFLP, - RCC_SRAM1LP, - RCC_SRAM2LP, - - RCC_BKP, - RCC_SRAM3LP, - RCC_CCDATARAM, - RCC_DMA1, - RCC_DMA2, - RCC_DMA2D, - - RCC_ETH, - RCC_ETHTX, - RCC_ETHRX, - RCC_ETHPTP, - RCC_OTGHS, - RCC_OTGHSULPI, - - // APB2 - - RCC_TIMER1, - RCC_TIMER8, - - RCC_USART1, - RCC_USART6, - - RCC_ADC1, - RCC_ADC2, - RCC_ADC3, - RCC_SDIO, - RCC_SPI1, - RCC_SPI4, - RCC_SYSCFG, - - RCC_TIMER9, - RCC_TIMER10, - RCC_TIMER11, - - RCC_SPI5, - RCC_SPI6, - RCC_SAI1, - - RCC_LTDC, - RCC_DSI, - - - // APB1 - - RCC_TIMER2, - RCC_TIMER3, - RCC_TIMER4, - RCC_TIMER5, - RCC_TIMER6, - RCC_TIMER7, - RCC_TIMER12, - RCC_TIMER13, - RCC_TIMER14, - - RCC_WWDG, - - RCC_SPI2, - RCC_SPI3, - - RCC_USART2, - RCC_USART3, - RCC_UART4, - RCC_UART5, - RCC_I2C1, - RCC_I2C2, - RCC_I2C3, - - RCC_CAN1, - RCC_CAN2, - - RCC_PWR, - RCC_DAC, - RCC_UART7, - RCC_UART8 -} rcc_clk_id; - -void rcc_clk_init(rcc_sysclk_src sysclk_src, - rcc_pllsrc pll_src, - rcc_pll_multiplier pll_mul); -void rcc_clk_disable(rcc_clk_id device); -void rcc_clk_enable(rcc_clk_id device); -void rcc_reset_dev(rcc_clk_id device); - -void SetupClock(); - -typedef enum rcc_clk_domain { - RCC_APB1, - RCC_APB2, - RCC_AHB1, - RCC_AHB2, - RCC_AHB3 -} rcc_clk_domain; - -rcc_clk_domain rcc_dev_clk(rcc_clk_id device); - -uint32 rcc_dev_clk_speed(rcc_clk_id id); -uint32 rcc_dev_timer_clk_speed(rcc_clk_id id); - -/** - * Prescaler identifiers - * @see rcc_set_prescaler() - */ -typedef enum rcc_prescaler { - RCC_PRESCALER_AHB, - RCC_PRESCALER_APB1, - RCC_PRESCALER_APB2, - RCC_PRESCALER_USB, - RCC_PRESCALER_ADC -} rcc_prescaler; - -/** - * ADC prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_adc_divider { - RCC_ADCPRE_PCLK_DIV_2 = 0x0 << 14, - RCC_ADCPRE_PCLK_DIV_4 = 0x1 << 14, - RCC_ADCPRE_PCLK_DIV_6 = 0x2 << 14, - RCC_ADCPRE_PCLK_DIV_8 = 0x3 << 14, -} rcc_adc_divider; - -/** - * APB1 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb1_divider { - RCC_APB1_HCLK_DIV_1 = 0x0 << 8, - RCC_APB1_HCLK_DIV_2 = 0x4 << 8, - RCC_APB1_HCLK_DIV_4 = 0x5 << 8, - RCC_APB1_HCLK_DIV_8 = 0x6 << 8, - RCC_APB1_HCLK_DIV_16 = 0x7 << 8, -} rcc_apb1_divider; - -/** - * APB2 prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_apb2_divider { - RCC_APB2_HCLK_DIV_1 = 0x0 << 11, - RCC_APB2_HCLK_DIV_2 = 0x4 << 11, - RCC_APB2_HCLK_DIV_4 = 0x5 << 11, - RCC_APB2_HCLK_DIV_8 = 0x6 << 11, - RCC_APB2_HCLK_DIV_16 = 0x7 << 11, -} rcc_apb2_divider; - -/** - * AHB prescaler dividers - * @see rcc_set_prescaler() - */ -typedef enum rcc_ahb_divider { - RCC_AHB_SYSCLK_DIV_1 = 0x0 << 4, - RCC_AHB_SYSCLK_DIV_2 = 0x8 << 4, - RCC_AHB_SYSCLK_DIV_4 = 0x9 << 4, - RCC_AHB_SYSCLK_DIV_8 = 0xA << 4, - RCC_AHB_SYSCLK_DIV_16 = 0xB << 4, - RCC_AHB_SYSCLK_DIV_32 = 0xC << 4, - RCC_AHB_SYSCLK_DIV_64 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_128 = 0xD << 4, - RCC_AHB_SYSCLK_DIV_256 = 0xE << 4, - RCC_AHB_SYSCLK_DIV_512 = 0xF << 4, -} rcc_ahb_divider; - -void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider); - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/ring_buffer.h b/cores/arduino/ring_buffer.h deleted file mode 100755 index 360a4ff..0000000 --- a/cores/arduino/ring_buffer.h +++ /dev/null @@ -1,212 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file ring_buffer.h - * @brief Simple circular buffer - * - * This implementation is not thread-safe. In particular, none of - * these functions is guaranteed re-entrant. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _RING_BUFFER_H_ -#define _RING_BUFFER_H_ - -#include "types.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/** - * Ring buffer type. - * - * The buffer is empty when head == tail. - * - * The buffer is full when the head is one byte in front of the tail, - * modulo buffer length. - * - * One byte is left free to distinguish empty from full. */ -typedef struct ring_buffer { - volatile uint8 *buf; /**< Buffer items are stored into */ - uint16 head; /**< Index of the next item to remove */ - uint16 tail; /**< Index where the next item will get inserted */ - uint16 size; /**< Buffer capacity minus one */ -} ring_buffer; - -/** - * Initialise a ring buffer. - * - * @param rb Instance to initialise - * - * @param size Number of items in buf. The ring buffer will always - * leave one element unoccupied, so the maximum number of - * elements it can store will be size - 1. Thus, size - * must be at least 2. - * - * @param buf Buffer to store items into - */ -static inline void rb_init(ring_buffer *rb, uint16 size, uint8 *buf) { - rb->head = 0; - rb->tail = 0; - rb->size = size - 1; - rb->buf = buf; -} - -/** - * @brief Return the number of elements stored in the ring buffer. - * @param rb Buffer whose elements to count. - */ -static inline uint16 rb_full_count(ring_buffer *rb) { - __io ring_buffer *arb = rb; - int32 size = arb->tail - arb->head; - if (arb->tail < arb->head) { - size += arb->size + 1; - } - return (uint16)size; -} - -/** - * @brief Returns true if and only if the ring buffer is full. - * @param rb Buffer to test. - */ -static inline int rb_is_full(ring_buffer *rb) { - return (rb->tail + 1 == rb->head) || - (rb->tail == rb->size && rb->head == 0); -} - -/** - * @brief Returns true if and only if the ring buffer is empty. - * @param rb Buffer to test. - */ -static inline int rb_is_empty(ring_buffer *rb) { - return rb->head == rb->tail; -} - -/** - * Append element onto the end of a ring buffer. - * @param rb Buffer to append onto. - * @param element Value to append. - */ -static inline void rb_insert(ring_buffer *rb, uint8 element) { - rb->buf[rb->tail] = element; - rb->tail = (rb->tail == rb->size) ? 0 : rb->tail + 1; -} - -/** - * @brief Remove and return the first item from a ring buffer. - * @param rb Buffer to remove from, must contain at least one element. - */ -static inline uint8 rb_remove(ring_buffer *rb) { - uint8 ch = rb->buf[rb->head]; - rb->head = (rb->head == rb->size) ? 0 : rb->head + 1; - return ch; -} - -/* - * Roger Clark. 20141125, - * added peek function. - * @brief Return the first item from a ring buffer, without removing it - * @param rb Buffer to remove from, must contain at least one element. - */ -static inline int rb_peek(ring_buffer *rb) -{ - if (rb->head == rb->tail) - { - return -1; - } - else - { - return rb->buf[rb->head]; - } -} - - -/** - * @brief Attempt to remove the first item from a ring buffer. - * - * If the ring buffer is nonempty, removes and returns its first item. - * If it is empty, does nothing and returns a negative value. - * - * @param rb Buffer to attempt to remove from. - */ -static inline int16 rb_safe_remove(ring_buffer *rb) { - return rb_is_empty(rb) ? -1 : rb_remove(rb); -} - -/** - * @brief Attempt to insert an element into a ring buffer. - * - * @param rb Buffer to insert into. - * @param element Value to insert into rb. - * @sideeffect If rb is not full, appends element onto buffer. - * @return If element was appended, then true; otherwise, false. */ -static inline int rb_safe_insert(ring_buffer *rb, uint8 element) { - if (rb_is_full(rb)) { - return 0; - } - rb_insert(rb, element); - return 1; -} - -/** - * @brief Append an item onto the end of a non-full ring buffer. - * - * If the buffer is full, removes its first item, then inserts the new - * element at the end. - * - * @param rb Ring buffer to insert into. - * @param element Value to insert into ring buffer. - * @return On success, returns -1. If an element was popped, returns - * the popped value. - */ -static inline int rb_push_insert(ring_buffer *rb, uint8 element) { - int ret = -1; - if (rb_is_full(rb)) { - ret = rb_remove(rb); - } - rb_insert(rb, element); - return ret; -} - -/** - * @brief Discard all items from a ring buffer. - * @param rb Ring buffer to discard all items from. - */ -static inline void rb_reset(ring_buffer *rb) { - rb->tail = rb->head; -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/scb.h b/cores/arduino/scb.h deleted file mode 100755 index 2de7602..0000000 --- a/cores/arduino/scb.h +++ /dev/null @@ -1,69 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file scb.h - * @brief System control block header - */ - -/* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "types.h" - -#ifndef _SCB_H_ -#define _SCB_H_ - -/** System control block register map type */ -typedef struct scb_reg_map { - __io uint32 CPUID; /**< CPU ID Base Register */ - __io uint32 ICSR; /**< Interrupt Control State Register */ - __io uint32 VTOR; /**< Vector Table Offset Register */ - __io uint32 AIRCR; /**< Application Interrupt / Reset Control Register */ - __io uint32 SCR; /**< System Control Register */ - __io uint32 CCR; /**< Configuration Control Register */ - __io uint8 SHP[12]; /**< System Handlers Priority Registers - (4-7, 8-11, 12-15) */ - __io uint32 SHCSR; /**< System Handler Control and State Register */ - __io uint32 CFSR; /**< Configurable Fault Status Register */ - __io uint32 HFSR; /**< Hard Fault Status Register */ - __io uint32 DFSR; /**< Debug Fault Status Register */ - __io uint32 MMFAR; /**< Mem Manage Address Register */ - __io uint32 BFAR; /**< Bus Fault Address Register */ - __io uint32 AFSR; /**< Auxiliary Fault Status Register */ - __io uint32 PFR[2]; /**< Processor Feature Register */ - __io uint32 DFR; /**< Debug Feature Register */ - __io uint32 ADR; /**< Auxiliary Feature Register */ - __io uint32 MMFR[4]; /**< Memory Model Feature Register */ - __io uint32 ISAR[5]; /**< ISA Feature Register */ -} scb_reg_map; - -/** System control block register map base pointer */ -#define SCB_BASE ((struct scb_reg_map*)0xE000ED00) - -#endif diff --git a/cores/arduino/stm32.h b/cores/arduino/stm32.h deleted file mode 100755 index 44e0606..0000000 --- a/cores/arduino/stm32.h +++ /dev/null @@ -1,61 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file stm32.h - * @brief STM32 chip-specific definitions - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _STM32_H_ -#define _STM32_H_ - -#ifndef STM32_PCLK1 -#define STM32_PCLK1 36000000U -#endif -#define PCLK1 STM32_PCLK1 - -#ifndef STM32_PCLK2 -#define STM32_PCLK2 72000000U -#endif - -#define PCLK2 STM32_PCLK2 - -#define STM32_NR_INTERRUPTS 13 - -#define NR_INTERRUPTS STM32_NR_INTERRUPTS -#define STM32_TICKS_PER_US 180 -#define STM32_NR_GPIO_PORTS 11 -#define STM32_DELAY_US_MULT (STM32_TICKS_PER_US/3) -#define STM32_SRAM_END ((void*)0x2002FFFF) -#define NR_GPIO_PORTS STM32_NR_GPIO_PORTS -#define DELAY_US_MULT STM32_DELAY_US_MULT - -#endif /* _STM32_H_ */ diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal.c b/cores/arduino/stm32/HAL/stm32yyxx_hal.c new file mode 100644 index 0000000..3d0c11f --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_adc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_adc.c new file mode 100644 index 0000000..d0ed153 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_adc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_adc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_adc_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_adc_ex.c new file mode 100644 index 0000000..5dc8435 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_adc_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_adc_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_can.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_can.c new file mode 100644 index 0000000..0a77cf7 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_can.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_can.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_cec.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_cec.c new file mode 100644 index 0000000..dba58e1 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_cec.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_cec.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_comp.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_comp.c new file mode 100644 index 0000000..6e378e3 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_comp.c @@ -0,0 +1,23 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ + + diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_cortex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_cortex.c new file mode 100644 index 0000000..998f07e --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_cortex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_cortex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_crc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_crc.c new file mode 100644 index 0000000..22a2193 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_crc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_crc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp.c new file mode 100644 index 0000000..4bf7797 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_cryp.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp_ex.c new file mode 100644 index 0000000..551bdbd --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_cryp_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_cryp_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dac.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dac.c new file mode 100644 index 0000000..49f2fd7 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dac.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dac.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dac_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dac_ex.c new file mode 100644 index 0000000..8c10fb0 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dac_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dac_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi.c new file mode 100644 index 0000000..a30c30d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dcmi.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi_ex.c new file mode 100644 index 0000000..9c1f035 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dcmi_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dcmi_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dfsdm.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dfsdm.c new file mode 100644 index 0000000..25cd0ed --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dfsdm.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dfsdm.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dma.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma.c new file mode 100644 index 0000000..fd6aa59 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dma.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dma2d.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma2d.c new file mode 100644 index 0000000..c99212d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma2d.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dma2d.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dma_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma_ex.c new file mode 100644 index 0000000..0e685cb --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dma_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dma_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_dsi.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_dsi.c new file mode 100644 index 0000000..460a3aa --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_dsi.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_dsi.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_eth.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_eth.c new file mode 100644 index 0000000..5f85765 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_eth.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_eth.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_flash.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash.c new file mode 100644 index 0000000..f92e6ff --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_flash.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ex.c new file mode 100644 index 0000000..72250cd --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_flash_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ramfunc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ramfunc.c new file mode 100644 index 0000000..7faaad9 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_flash_ramfunc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_flash_ramfunc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c.c new file mode 100644 index 0000000..694618f --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_fmpi2c.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c_ex.c new file mode 100644 index 0000000..94b76d5 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_fmpi2c_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_fmpi2c_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_gpio.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_gpio.c new file mode 100644 index 0000000..142519c --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_gpio.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_gpio.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_hash.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_hash.c new file mode 100644 index 0000000..fa24106 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_hash.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_hash.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_hash_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_hash_ex.c new file mode 100644 index 0000000..4e229b4 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_hash_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_hash_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_hcd.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_hcd.c new file mode 100644 index 0000000..4927094 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_hcd.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_hcd.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c.c new file mode 100644 index 0000000..a3f2208 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_i2c.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c_ex.c new file mode 100644 index 0000000..4378717 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2c_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_i2c_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s.c new file mode 100644 index 0000000..f0d4877 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_i2s.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s_ex.c new file mode 100644 index 0000000..a0def53 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_i2s_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_i2s_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_irda.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_irda.c new file mode 100644 index 0000000..d638336 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_irda.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_irda.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_iwdg.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_iwdg.c new file mode 100644 index 0000000..58c806c --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_iwdg.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_iwdg.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_lptim.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_lptim.c new file mode 100644 index 0000000..36f0dbe --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_lptim.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_lptim.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc.c new file mode 100644 index 0000000..852fe40 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc.c @@ -0,0 +1,6 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_ltdc.c" +#endif + diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc_ex.c new file mode 100644 index 0000000..de6eef2 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_ltdc_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_ltdc_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_mmc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_mmc.c new file mode 100644 index 0000000..50af3a3 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_mmc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_mmc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_msp_template.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_msp_template.c new file mode 100644 index 0000000..e975fd3 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_msp_template.c @@ -0,0 +1,7 @@ +#include "stm32_def_build.h" + +#if 0 +#ifdef STM32F4xx +#include "stm32f4xx_hal_msp_template.c" +#endif +#endif //0 diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_nand.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_nand.c new file mode 100644 index 0000000..be6a9c1 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_nand.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_nand.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_nor.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_nor.c new file mode 100644 index 0000000..659e453 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_nor.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_nor.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_pccard.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_pccard.c new file mode 100644 index 0000000..3311b4e --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_pccard.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_pccard.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd.c new file mode 100644 index 0000000..4e3664b --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_pcd.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd_ex.c new file mode 100644 index 0000000..4f8a6fb --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_pcd_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_pcd_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr.c new file mode 100644 index 0000000..0470371 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_pwr.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr_ex.c new file mode 100644 index 0000000..720960d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_pwr_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_pwr_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_qspi.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_qspi.c new file mode 100644 index 0000000..1f90e43 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_qspi.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_qspi.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc.c new file mode 100644 index 0000000..3fad44d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_rcc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc_ex.c new file mode 100644 index 0000000..a673153 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_rcc_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_rcc_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_rng.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_rng.c new file mode 100644 index 0000000..c0c8d8d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_rng.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_rng.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc.c new file mode 100644 index 0000000..be36065 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_rtc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc_ex.c new file mode 100644 index 0000000..e872781 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_rtc_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_rtc_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_sai.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_sai.c new file mode 100644 index 0000000..62bb11a --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_sai.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_sai.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_sai_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_sai_ex.c new file mode 100644 index 0000000..8f15d24 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_sai_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_sai_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_sd.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_sd.c new file mode 100644 index 0000000..c7067fa --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_sd.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_sd.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_sdram.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_sdram.c new file mode 100644 index 0000000..5827a94 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_sdram.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_sdram.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_spdifrx.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_spdifrx.c new file mode 100644 index 0000000..0d31f9f --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_spdifrx.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_spdifrx.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_spi.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_spi.c new file mode 100644 index 0000000..512b879 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_spi.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_spi.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_sram.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_sram.c new file mode 100644 index 0000000..0447525 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_sram.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_sram.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_tim.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_tim.c new file mode 100644 index 0000000..21fc62d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_tim.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_tim.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_tim_ex.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_tim_ex.c new file mode 100644 index 0000000..39b761b --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_tim_ex.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_tim_ex.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_alarm_template.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_alarm_template.c new file mode 100644 index 0000000..a1b59f3 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_alarm_template.c @@ -0,0 +1,7 @@ +#include "stm32_def_build.h" + +#if 0 +#ifdef STM32F4xx +#include "stm32f4xx_hal_timebase_rtc_alarm_template.c" +#endif +#endif //0 diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_wakeup_template.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_wakeup_template.c new file mode 100644 index 0000000..30583c5 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_rtc_wakeup_template.c @@ -0,0 +1,7 @@ +#include "stm32_def_build.h" + +#if 0 +#ifdef STM32F4xx +#include "stm32f4xx_hal_timebase_rtc_wakeup_template.c" +#endif +#endif //0 diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_tim_template.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_tim_template.c new file mode 100644 index 0000000..6ae629b --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_timebase_tim_template.c @@ -0,0 +1,7 @@ +#include "stm32_def_build.h" + +#if 0 +#ifdef STM32F4xx +#include "stm32f4xx_hal_tim_template.c" +#endif +#endif //0 diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_uart.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_uart.c new file mode 100644 index 0000000..6428057 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_uart.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_uart.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_usart.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_usart.c new file mode 100644 index 0000000..fa2eb82 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_usart.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_usart.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_hal_wwdg.c b/cores/arduino/stm32/HAL/stm32yyxx_hal_wwdg.c new file mode 100644 index 0000000..1d16a6c --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_hal_wwdg.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_hal_wwdg.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_adc.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_adc.c new file mode 100644 index 0000000..d47aa29 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_adc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_adc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_crc.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_crc.c new file mode 100644 index 0000000..206db73 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_crc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_crc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_dac.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_dac.c new file mode 100644 index 0000000..ef0f672 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_dac.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_dac.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_dma.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_dma.c new file mode 100644 index 0000000..29b989d --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_dma.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_dma.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_dma2d.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_dma2d.c new file mode 100644 index 0000000..22b1ecb --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_dma2d.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_dma2d.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_fmc.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_fmc.c new file mode 100644 index 0000000..6661fbc --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_fmc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_fmc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_fsmc.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_fsmc.c new file mode 100644 index 0000000..3c8d74e --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_fsmc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_fsmc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_sdmmc.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_sdmmc.c new file mode 100644 index 0000000..b0a9c11 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_sdmmc.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_sdmmc.c" +#endif diff --git a/cores/arduino/stm32/HAL/stm32yyxx_ll_usb.c b/cores/arduino/stm32/HAL/stm32yyxx_ll_usb.c new file mode 100644 index 0000000..8f785e0 --- /dev/null +++ b/cores/arduino/stm32/HAL/stm32yyxx_ll_usb.c @@ -0,0 +1,5 @@ +#include "stm32_def_build.h" + +#ifdef STM32F4xx +#include "stm32f4xx_ll_usb.c" +#endif diff --git a/cores/arduino/stm32/PeripheralPins.h b/cores/arduino/stm32/PeripheralPins.h new file mode 100644 index 0000000..c039b97 --- /dev/null +++ b/cores/arduino/stm32/PeripheralPins.h @@ -0,0 +1,69 @@ +/* + ******************************************************************************* + * Copyright (c) 2014, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef _PERIPHERALPINS_H +#define _PERIPHERALPINS_H + +#include "pinmap.h" + +//*** ADC *** +extern const PinMap PinMap_ADC[]; + +//*** DAC *** +extern const PinMap PinMap_DAC[]; + +//*** I2C *** +extern const PinMap PinMap_I2C_SDA[]; +extern const PinMap PinMap_I2C_SCL[]; + +//*** PWM *** +extern const PinMap PinMap_PWM[]; + +//*** SERIAL *** +extern const PinMap PinMap_UART_TX[]; +extern const PinMap PinMap_UART_RX[]; +extern const PinMap PinMap_UART_RTS[]; +extern const PinMap PinMap_UART_CTS[]; + +//*** SPI *** +extern const PinMap PinMap_SPI_MOSI[]; +extern const PinMap PinMap_SPI_MISO[]; +extern const PinMap PinMap_SPI_SCLK[]; +extern const PinMap PinMap_SPI_SSEL[]; + +//*** CAN *** +extern const PinMap PinMap_CAN_RD[]; +extern const PinMap PinMap_CAN_TD[]; + +//*** TIMER *** +extern const TimerMap TimerMap_CONFIG[]; + +#endif + diff --git a/cores/arduino/stm32/PinConfigured.c b/cores/arduino/stm32/PinConfigured.c new file mode 100644 index 0000000..024219c --- /dev/null +++ b/cores/arduino/stm32/PinConfigured.c @@ -0,0 +1,46 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#include "PinConfigured.h" + +bool is_pin_configured(PinName pin, uint32_t* map) { + uint32_t index = PINCONF_INDEX(pin); + return PINCONF_VAL(pin, map[index]); +} + +void set_pin_configured(PinName pin, uint32_t* map) { + uint32_t index = PINCONF_INDEX(pin); + map[index] = map[index] | PINCONF_BIT(pin); +} + +void reset_pin_configured(PinName pin, uint32_t* map) { + uint32_t index = PINCONF_INDEX(pin); + map[index] = map[index] & (~PINCONF_BIT(pin)); +} + diff --git a/cores/arduino/stm32/PinConfigured.h b/cores/arduino/stm32/PinConfigured.h new file mode 100644 index 0000000..7b7d393 --- /dev/null +++ b/cores/arduino/stm32/PinConfigured.h @@ -0,0 +1,56 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#ifndef _PINCONFIGURED_H +#define _PINCONFIGURED_H + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define PINCONF_INDEX(X) (STM_PORT(X)-FirstPort) + +#define PINCONF_MASK 0x01 +#define PINCONF_SHIFT(X) (STM_PIN(X)) +#define PINCONF_BIT(X) (PINCONF_MASK << PINCONF_SHIFT(X)) + +#define PINCONF_VAL(X, Y) ((Y >> PINCONF_SHIFT(X)) & PINCONF_MASK) + + +bool is_pin_configured(PinName pin, uint32_t* map); +void set_pin_configured(PinName pin, uint32_t* map); +void reset_pin_configured(PinName pin, uint32_t* map); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cores/arduino/stm32/PinNames.h b/cores/arduino/stm32/PinNames.h new file mode 100644 index 0000000..abff99e --- /dev/null +++ b/cores/arduino/stm32/PinNames.h @@ -0,0 +1,233 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifndef _PINNAMES_H +#define _PINNAMES_H + +#include "PinNamesTypes.h" +#include "PortNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + + PA0 = (PortA << 4) + 0x00, + PA1 = (PortA << 4) + 0x01, + PA2 = (PortA << 4) + 0x02, + PA3 = (PortA << 4) + 0x03, + PA4 = (PortA << 4) + 0x04, + PA5 = (PortA << 4) + 0x05, + PA6 = (PortA << 4) + 0x06, + PA7 = (PortA << 4) + 0x07, + PA8 = (PortA << 4) + 0x08, + PA9 = (PortA << 4) + 0x09, + PA10 = (PortA << 4) + 0x0A, + PA11 = (PortA << 4) + 0x0B, + PA12 = (PortA << 4) + 0x0C, + PA13 = (PortA << 4) + 0x0D, + PA14 = (PortA << 4) + 0x0E, + PA15 = (PortA << 4) + 0x0F, + + PB0 = (PortB << 4) + 0x00, + PB1 = (PortB << 4) + 0x01, + PB2 = (PortB << 4) + 0x02, + PB3 = (PortB << 4) + 0x03, + PB4 = (PortB << 4) + 0x04, + PB5 = (PortB << 4) + 0x05, + PB6 = (PortB << 4) + 0x06, + PB7 = (PortB << 4) + 0x07, + PB8 = (PortB << 4) + 0x08, + PB9 = (PortB << 4) + 0x09, + PB10 = (PortB << 4) + 0x0A, + PB11 = (PortB << 4) + 0x0B, + PB12 = (PortB << 4) + 0x0C, + PB13 = (PortB << 4) + 0x0D, + PB14 = (PortB << 4) + 0x0E, + PB15 = (PortB << 4) + 0x0F, +#if defined GPIOC_BASE + PC0 = (PortC << 4) + 0x00, + PC1 = (PortC << 4) + 0x01, + PC2 = (PortC << 4) + 0x02, + PC3 = (PortC << 4) + 0x03, + PC4 = (PortC << 4) + 0x04, + PC5 = (PortC << 4) + 0x05, + PC6 = (PortC << 4) + 0x06, + PC7 = (PortC << 4) + 0x07, + PC8 = (PortC << 4) + 0x08, + PC9 = (PortC << 4) + 0x09, + PC10 = (PortC << 4) + 0x0A, + PC11 = (PortC << 4) + 0x0B, + PC12 = (PortC << 4) + 0x0C, + PC13 = (PortC << 4) + 0x0D, + PC14 = (PortC << 4) + 0x0E, + PC15 = (PortC << 4) + 0x0F, +#endif +#if defined GPIOD_BASE + PD0 = (PortD << 4) + 0x00, + PD1 = (PortD << 4) + 0x01, + PD2 = (PortD << 4) + 0x02, + PD3 = (PortD << 4) + 0x03, + PD4 = (PortD << 4) + 0x04, + PD5 = (PortD << 4) + 0x05, + PD6 = (PortD << 4) + 0x06, + PD7 = (PortD << 4) + 0x07, + PD8 = (PortD << 4) + 0x08, + PD9 = (PortD << 4) + 0x09, + PD10 = (PortD << 4) + 0x0A, + PD11 = (PortD << 4) + 0x0B, + PD12 = (PortD << 4) + 0x0C, + PD13 = (PortD << 4) + 0x0D, + PD14 = (PortD << 4) + 0x0E, + PD15 = (PortD << 4) + 0x0F, +#endif +#if defined GPIOE_BASE + PE0 = (PortE << 4) + 0x00, + PE1 = (PortE << 4) + 0x01, + PE2 = (PortE << 4) + 0x02, + PE3 = (PortE << 4) + 0x03, + PE4 = (PortE << 4) + 0x04, + PE5 = (PortE << 4) + 0x05, + PE6 = (PortE << 4) + 0x06, + PE7 = (PortE << 4) + 0x07, + PE8 = (PortE << 4) + 0x08, + PE9 = (PortE << 4) + 0x09, + PE10 = (PortE << 4) + 0x0A, + PE11 = (PortE << 4) + 0x0B, + PE12 = (PortE << 4) + 0x0C, + PE13 = (PortE << 4) + 0x0D, + PE14 = (PortE << 4) + 0x0E, + PE15 = (PortE << 4) + 0x0F, +#endif +#if defined GPIOF_BASE + PF0 = (PortF << 4) + 0x00, + PF1 = (PortF << 4) + 0x01, + PF2 = (PortF << 4) + 0x02, + PF3 = (PortF << 4) + 0x03, + PF4 = (PortF << 4) + 0x04, + PF5 = (PortF << 4) + 0x05, + PF6 = (PortF << 4) + 0x06, + PF7 = (PortF << 4) + 0x07, + PF8 = (PortF << 4) + 0x08, + PF9 = (PortF << 4) + 0x09, + PF10 = (PortF << 4) + 0x0A, + PF11 = (PortF << 4) + 0x0B, + PF12 = (PortF << 4) + 0x0C, + PF13 = (PortF << 4) + 0x0D, + PF14 = (PortF << 4) + 0x0E, + PF15 = (PortF << 4) + 0x0F, +#endif +#if defined GPIOG_BASE + PG0 = (PortG << 4) + 0x00, + PG1 = (PortG << 4) + 0x01, + PG2 = (PortG << 4) + 0x02, + PG3 = (PortG << 4) + 0x03, + PG4 = (PortG << 4) + 0x04, + PG5 = (PortG << 4) + 0x05, + PG6 = (PortG << 4) + 0x06, + PG7 = (PortG << 4) + 0x07, + PG8 = (PortG << 4) + 0x08, + PG9 = (PortG << 4) + 0x09, + PG10 = (PortG << 4) + 0x0A, + PG11 = (PortG << 4) + 0x0B, + PG12 = (PortG << 4) + 0x0C, + PG13 = (PortG << 4) + 0x0D, + PG14 = (PortG << 4) + 0x0E, + PG15 = (PortG << 4) + 0x0F, +#endif +#if defined GPIOH_BASE + PH0 = (PortH << 4) + 0x00, + PH1 = (PortH << 4) + 0x01, + PH2 = (PortH << 4) + 0x02, + PH3 = (PortH << 4) + 0x03, + PH4 = (PortH << 4) + 0x04, + PH5 = (PortH << 4) + 0x05, + PH6 = (PortH << 4) + 0x06, + PH7 = (PortH << 4) + 0x07, + PH8 = (PortH << 4) + 0x08, + PH9 = (PortH << 4) + 0x09, + PH10 = (PortH << 4) + 0x0A, + PH11 = (PortH << 4) + 0x0B, + PH12 = (PortH << 4) + 0x0C, + PH13 = (PortH << 4) + 0x0D, + PH14 = (PortH << 4) + 0x0E, + PH15 = (PortH << 4) + 0x0F, +#endif +#if defined GPIOI_BASE + PI0 = (PortI << 4) + 0x00, + PI1 = (PortI << 4) + 0x01, + PI2 = (PortI << 4) + 0x02, + PI3 = (PortI << 4) + 0x03, + PI4 = (PortI << 4) + 0x04, + PI5 = (PortI << 4) + 0x05, + PI6 = (PortI << 4) + 0x06, + PI7 = (PortI << 4) + 0x07, + PI8 = (PortI << 4) + 0x08, + PI9 = (PortI << 4) + 0x09, + PI10 = (PortI << 4) + 0x0A, + PI11 = (PortI << 4) + 0x0B, + PI12 = (PortI << 4) + 0x0C, + PI13 = (PortI << 4) + 0x0D, + PI14 = (PortI << 4) + 0x0E, + PI15 = (PortI << 4) + 0x0F, +#endif +#if defined GPIOJ_BASE + PJ0 = (PortJ << 4) + 0x00, + PJ1 = (PortJ << 4) + 0x01, + PJ2 = (PortJ << 4) + 0x02, + PJ3 = (PortJ << 4) + 0x03, + PJ4 = (PortJ << 4) + 0x04, + PJ5 = (PortJ << 4) + 0x05, + PJ6 = (PortJ << 4) + 0x06, + PJ7 = (PortJ << 4) + 0x07, + PJ8 = (PortJ << 4) + 0x08, + PJ9 = (PortJ << 4) + 0x09, + PJ10 = (PortJ << 4) + 0x0A, + PJ11 = (PortJ << 4) + 0x0B, + PJ12 = (PortJ << 4) + 0x0C, + PJ13 = (PortJ << 4) + 0x0D, + PJ14 = (PortJ << 4) + 0x0E, + PJ15 = (PortJ << 4) + 0x0F, +#endif +#if defined GPIOK_BASE + PK3 = (PortK << 4) + 0x03, + PK4 = (PortK << 4) + 0x04, + PK5 = (PortK << 4) + 0x05, + PK6 = (PortK << 4) + 0x06, + PK7 = (PortK << 4) + 0x07, + PK8 = (PortK << 4) + 0x08, + PK9 = (PortK << 4) + 0x09, + PK10 = (PortK << 4) + 0x0A, + PK11 = (PortK << 4) + 0x0B, + PK12 = (PortK << 4) + 0x0C, + PK13 = (PortK << 4) + 0x0D, + PK14 = (PortK << 4) + 0x0E, + PK15 = (PortK << 4) + 0x0F, +#endif + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cores/arduino/stm32/PinNamesTypes.h b/cores/arduino/stm32/PinNamesTypes.h new file mode 100644 index 0000000..1014d67 --- /dev/null +++ b/cores/arduino/stm32/PinNamesTypes.h @@ -0,0 +1,160 @@ +/* ******************************************************************************* + * Copyright (c) 2016, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#ifndef _PINNAMESTYPES_H +#define _PINNAMESTYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* STM PIN data as used in pin_function is coded on 32 bits as below + * [2:0] Function (like in MODER reg) : Input / Output / Alt / Analog + * [3] Output Push-Pull / Open Drain (as in OTYPER reg) + * [5:4] as in PUPDR reg: No Pull, Pull-up, Pull-Donc + * [7:6] Reserved for speed config (as in OSPEEDR), but not used yet + * [11:8] Alternate Num (as in AFRL/AFRG reg) + * [16:12] Channel (Analog/Timer specific) + * [17] Inverted (Analog/Timer specific) + * [18] Analog ADC control - Only valid for specific families + * [32:19] Reserved + */ + +#define STM_PIN_FUNCTION_MASK 0x07 +#define STM_PIN_FUNCTION_SHIFT 0 +#define STM_PIN_FUNCTION_BITS (STM_PIN_FUNCTION_MASK << STM_PIN_FUNCTION_SHIFT) + +#define STM_PIN_OD_MASK 0x01 +#define STM_PIN_OD_SHIFT 3 +#define STM_PIN_OD_BITS (STM_PIN_OD_MASK << STM_PIN_OD_SHIFT) + +#define STM_PIN_PUPD_MASK 0x03 +#define STM_PIN_PUPD_SHIFT 4 +#define STM_PIN_PUPD_BITS (STM_PIN_PUPD_MASK << STM_PIN_PUPD_SHIFT) + +#define STM_PIN_SPEED_MASK 0x03 +#define STM_PIN_SPEED_SHIFT 6 +#define STM_PIN_SPEED_BITS (STM_PIN_SPEED_MASK << STM_PIN_SPEED_SHIFT) + +#define STM_PIN_AFNUM_MASK 0x0F +#define STM_PIN_AFNUM_SHIFT 8 +#define STM_PIN_AFNUM_BITS (STM_PIN_AFNUM_MASK << STM_PIN_AFNUM_SHIFT) + +#define STM_PIN_CHAN_MASK 0x1F +#define STM_PIN_CHAN_SHIFT 12 +#define STM_PIN_CHANNEL_BIT (STM_PIN_CHAN_MASK << STM_PIN_CHAN_SHIFT) + +#define STM_PIN_INV_MASK 0x01 +#define STM_PIN_INV_SHIFT 17 +#define STM_PIN_INV_BIT (STM_PIN_INV_MASK << STM_PIN_INV_SHIFT) + +#define STM_PIN_AN_CTRL_MASK 0x01 +#define STM_PIN_AN_CTRL_SHIFT 18 +#define STM_PIN_ANALOG_CONTROL_BIT (STM_PIN_AN_CTRL_MASK << STM_PIN_AN_CTRL_SHIFT) + +#define STM_PIN_FUNCTION(X) (((X) >> STM_PIN_FUNCTION_SHIFT) & STM_PIN_FUNCTION_MASK) +#define STM_PIN_OD(X) (((X) >> STM_PIN_OD_SHIFT) & STM_PIN_OD_MASK) +#define STM_PIN_PUPD(X) (((X) >> STM_PIN_PUPD_SHIFT) & STM_PIN_PUPD_MASK) +#define STM_PIN_SPEED(X) (((X) >> STM_PIN_SPEED_SHIFT) & STM_PIN_SPEED_MASK) +#define STM_PIN_AFNUM(X) (((X) >> STM_PIN_AFNUM_SHIFT) & STM_PIN_AFNUM_MASK) +#define STM_PIN_CHANNEL(X) (((X) >> STM_PIN_CHAN_SHIFT) & STM_PIN_CHAN_MASK) +#define STM_PIN_INVERTED(X) (((X) >> STM_PIN_INV_SHIFT) & STM_PIN_INV_MASK) +#define STM_PIN_ANALOG_CONTROL(X) (((X) >> STM_PIN_AN_CTRL_SHIFT) & STM_PIN_AN_CTRL_MASK) +#define STM_PIN_MODE(X) ((STM_PIN_OD((X)) << 4) | \ + (STM_PIN_FUNCTION((X)) & (~STM_PIN_OD_BITS))) + +#define STM_PIN_DEFINE(FUNC_OD, PUPD, AFNUM) ((int)(FUNC_OD) |\ + ((PUPD & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\ + ((AFNUM & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT)) + +#define STM_PIN_DEFINE_EXT(FUNC_OD, PUPD, AFNUM, CHAN, INV) \ + ((int)(FUNC_OD) |\ + ((PUPD & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\ + ((AFNUM & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT) |\ + ((CHAN & STM_PIN_CHAN_MASK) << STM_PIN_CHAN_SHIFT) |\ + ((INV & STM_PIN_INV_MASK) << STM_PIN_INV_SHIFT)) + +/* + * MACROS to support the legacy definition of PIN formats + * The STM_MODE_ defines contain the function and the Push-pull/OpenDrain + * configuration (legacy inheritance). + */ +#define STM_PIN_DATA(FUNC_OD, PUPD, AFNUM) \ + STM_PIN_DEFINE(FUNC_OD, PUPD, AFNUM) +#define STM_PIN_DATA_EXT(FUNC_OD, PUPD, AFNUM, CHANNEL, INVERTED) \ + STM_PIN_DEFINE_EXT(FUNC_OD, PUPD, AFNUM, CHANNEL, INVERTED) + +typedef enum { + STM_PIN_INPUT = 0, + STM_PIN_OUTPUT = 1, + STM_PIN_ALTERNATE = 2, + STM_PIN_ANALOG = 3, +} StmPinFunction; + +#define STM_MODE_INPUT (STM_PIN_INPUT) +#define STM_MODE_OUTPUT_PP (STM_PIN_OUTPUT) +#define STM_MODE_OUTPUT_OD (STM_PIN_OUTPUT | STM_PIN_OD_BITS) +#define STM_MODE_AF_PP (STM_PIN_ALTERNATE) +#define STM_MODE_AF_OD (STM_PIN_ALTERNATE | STM_PIN_OD_BITS) +#define STM_MODE_ANALOG (STM_PIN_ANALOG) +#define STM_MODE_ANALOG_ADC_CONTROL (STM_PIN_ANALOG | STM_PIN_ANALOG_CONTROL_BIT) + +// High nibble = port number (FirstPort <= PortName <= LastPort) +// Low nibble = pin number +#define STM_PORT(X) (((uint32_t)(X) >> 4) & 0xF) +#define STM_PIN(X) ((uint32_t)(X) & 0xF) +// Check PinName is valid: FirstPort <= PortName <= LastPort +#define STM_VALID_PINNAME(X) ((STM_PORT(X) >= FirstPort) && (STM_PORT(X) <= LastPort)) + +#define STM_GPIO_PIN(X) ((uint16_t)(1<
© COPYRIGHT(c) 2016 STMicroelectronics
+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_def.h" +#include "hw_config.h" +#include "analog.h" +#include "timer.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ +#if defined(ADC_SAMPLETIME_15CYCLES) +#define SAMPLINGTIME ADC_SAMPLETIME_15CYCLES; +#elif defined(ADC_SAMPLETIME_13CYCLES_5) +#define SAMPLINGTIME ADC_SAMPLETIME_13CYCLES_5; +#elif defined(ADC_SAMPLETIME_19CYCLES_5) +#define SAMPLINGTIME ADC_SAMPLETIME_19CYCLES_5; +#elif defined(ADC_SAMPLETIME_16CYCLES) +#define SAMPLINGTIME ADC_SAMPLETIME_16CYCLES; +#elif defined(ADC_SAMPLETIME_12CYCLES_5) +#define SAMPLINGTIME ADC_SAMPLETIME_12CYCLES_5; +#else +#error "ADC SAMPLINGTIME could not be defined" +#endif + +#ifdef ADC_CLOCK_SYNC_PCLK_DIV2 +#define ADC_CLOCK_DIV ADC_CLOCK_SYNC_PCLK_DIV2 +#elif defined(ADC_CLOCK_ASYNC_DIV1) +#define ADC_CLOCK_DIV ADC_CLOCK_ASYNC_DIV1 +#elif defined(ADC_CLOCKPRESCALER_PCLK_DIV2) +#define ADC_CLOCK_DIV ADC_CLOCKPRESCALER_PCLK_DIV2 +#else +#error "ADC_CLOCK_DIV could not be defined" +#endif + +#define ADC_REGULAR_RANK_1 1 +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +static PinName g_current_pin = NC; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ +static uint32_t get_adc_channel(PinName pin) +{ + uint32_t function = pinmap_function(pin, PinMap_ADC); + uint32_t channel = 0; + switch(STM_PIN_CHANNEL(function)) { +#ifdef ADC_CHANNEL_0 + case 0: + channel = ADC_CHANNEL_0; + break; +#endif + case 1: + channel = ADC_CHANNEL_1; + break; + case 2: + channel = ADC_CHANNEL_2; + break; + case 3: + channel = ADC_CHANNEL_3; + break; + case 4: + channel = ADC_CHANNEL_4; + break; + case 5: + channel = ADC_CHANNEL_5; + break; + case 6: + channel = ADC_CHANNEL_6; + break; + case 7: + channel = ADC_CHANNEL_7; + break; + case 8: + channel = ADC_CHANNEL_8; + break; + case 9: + channel = ADC_CHANNEL_9; + break; + case 10: + channel = ADC_CHANNEL_10; + break; + case 11: + channel = ADC_CHANNEL_11; + break; + case 12: + channel = ADC_CHANNEL_12; + break; + case 13: + channel = ADC_CHANNEL_13; + break; + case 14: + channel = ADC_CHANNEL_14; + break; + case 15: + channel = ADC_CHANNEL_15; + break; + case 16: + channel = ADC_CHANNEL_TEMPSENSOR; + break; + case 17: + channel = ADC_CHANNEL_VREFINT; + break; +#ifdef ADC_CHANNEL_VBAT + case 18: + channel = ADC_CHANNEL_VBAT; + break; +#endif + default: + channel = 0; + break; + } + return channel; +} + +static uint32_t get_dac_channel(PinName pin) +{ + uint32_t function = pinmap_function(pin, PinMap_DAC); + uint32_t channel = 0; + switch(STM_PIN_CHANNEL(function)) { +#ifdef DAC_CHANNEL_0 + case 0: + channel = DAC_CHANNEL_0; + break; +#endif + case 1: + channel = DAC_CHANNEL_1; + break; +#ifdef DAC_CHANNEL_2 + case 2: + channel = DAC_CHANNEL_2; + break; +#endif + default: + channel = 0; + break; + } + return channel; +} + +static uint32_t get_pwm_channel(PinName pin) +{ + uint32_t function = pinmap_function(pin, PinMap_PWM); + uint32_t channel = 0; + switch(STM_PIN_CHANNEL(function)) { + case 1: + channel = TIM_CHANNEL_1; + break; + case 2: + channel = TIM_CHANNEL_2; + break; + case 3: + channel = TIM_CHANNEL_3; + break; + case 4: + channel = TIM_CHANNEL_4; + break; + default: + channel = 0; + break; + } + return channel; +} +////////////////////////// DAC INTERFACE FUNCTIONS ///////////////////////////// + +/** + * @brief DAC MSP Initialization + * This function configures the hardware resources used in this example: + * - Peripheral's clock enable + * - Peripheral's GPIO Configuration + * @param hdac: DAC handle pointer + * @retval None + */ +void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac) +{ + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* Enable GPIO clock ****************************************/ + port = set_GPIO_Port_Clock(STM_PORT(g_current_pin)); + + /* DAC Periph clock enable */ +#ifdef __HAL_RCC_DAC1_CLK_ENABLE + __HAL_RCC_DAC1_CLK_ENABLE(); +#endif +#ifdef __HAL_RCC_DAC_CLK_ENABLE + __HAL_RCC_DAC_CLK_ENABLE(); +#endif + /*##-2- Configure peripheral GPIO ##########################################*/ + /* DAC Channel1 GPIO pin configuration */ + GPIO_InitStruct.Pin = STM_GPIO_PIN(g_current_pin); + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(port, &GPIO_InitStruct); +} + + +/** + * @brief This function will set the DAC to the required value + * @param port : the gpio port to use + * @param pin : the gpio pin to use + * @param value : the value to push on the adc output + * @param do_init : if set to 1 the initialization of the adc is done + * @retval None + */ +void dac_write_value(PinName pin, uint32_t value, uint8_t do_init) +{ + DAC_HandleTypeDef DacHandle = {}; + DAC_ChannelConfTypeDef dacChannelConf = {}; + uint32_t dacChannel; + + DacHandle.Instance = pinmap_peripheral(pin, PinMap_DAC); + if (DacHandle.Instance == NC) return; + dacChannel = get_dac_channel(pin); + if (!IS_DAC_CHANNEL(dacChannel)) return; + if(do_init == 1) { + + if (HAL_DAC_DeInit(&DacHandle) != HAL_OK) + { + /* DeInitialization Error */ + return; + } + + /*##-1- Configure the DAC peripheral #######################################*/ + g_current_pin = pin; + if (HAL_DAC_Init(&DacHandle) != HAL_OK) + { + /* Initialization Error */ + return; + } + + dacChannelConf.DAC_Trigger = DAC_TRIGGER_NONE; + dacChannelConf.DAC_OutputBuffer=DAC_OUTPUTBUFFER_ENABLE; + /*##-2- Configure DAC channel1 #############################################*/ + if (HAL_DAC_ConfigChannel(&DacHandle, &dacChannelConf, dacChannel) != HAL_OK) + { + /* Channel configuration Error */ + return; + } + } + + /*##-3- Set DAC Channel1 DHR register ######################################*/ + if (HAL_DAC_SetValue(&DacHandle, dacChannel, DAC_ALIGN_12B_R, value) != HAL_OK) + { + /* Setting value Error */ + return; + } + + /*##-4- Enable DAC Channel1 ################################################*/ + HAL_DAC_Start(&DacHandle, dacChannel); +} + +/** + * @brief DeInitialize the DAC MSP. + * @param hdac: pointer to a DAC_HandleTypeDef structure that contains + * the configuration information for the specified DAC. + * @retval None + */ +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) +{ + /* DAC Periph clock disable */ +#ifdef __HAL_RCC_DAC1_CLK_DISABLE + __HAL_RCC_DAC1_CLK_DISABLE(); +#endif +#ifdef __HAL_RCC_DAC_CLK_DISABLE + __HAL_RCC_DAC_CLK_DISABLE(); +#endif +} + +/** + * @brief This function will stop the DAC + * @param port : the gpio port to use + * @param pin : the gpio pin to use + * @retval None + */ +void dac_stop(PinName pin) +{ + DAC_HandleTypeDef DacHandle; + uint32_t dacChannel; + + DacHandle.Instance = pinmap_peripheral(pin, PinMap_DAC); + if (DacHandle.Instance == NC) return; + dacChannel = get_dac_channel(pin); + if (!IS_DAC_CHANNEL(dacChannel)) return; + + HAL_DAC_Stop(&DacHandle, dacChannel); + + if (HAL_DAC_DeInit(&DacHandle) != HAL_OK) + { + /* DeInitialization Error */ + return; + } +} + + +////////////////////////// ADC INTERFACE FUNCTIONS ///////////////////////////// + +/** + * @brief ADC MSP Initialization + * This function configures the hardware resources used in this example: + * - Peripheral's clock enable + * - Peripheral's GPIO Configuration + * @param hadc: ADC handle pointer + * @retval None + */ +void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* ADC Periph clock enable */ + if(hadc->Instance == ADC1) { +#ifdef __HAL_RCC_ADC1_CLK_ENABLE + __HAL_RCC_ADC1_CLK_ENABLE(); +#endif +#ifdef __HAL_RCC_ADC12_CLK_ENABLE + __HAL_RCC_ADC12_CLK_ENABLE(); +#endif + } +#ifdef ADC2 + else if(hadc->Instance == ADC2) { +#ifdef __HAL_RCC_ADC2_CLK_ENABLE + __HAL_RCC_ADC2_CLK_ENABLE(); +#endif +#ifdef __HAL_RCC_ADC12_CLK_ENABLE + __HAL_RCC_ADC12_CLK_ENABLE(); +#endif + } +#endif +#ifdef ADC3 + else if(hadc->Instance == ADC3) { +#ifdef __HAL_RCC_ADC3_CLK_ENABLE + __HAL_RCC_ADC3_CLK_ENABLE(); +#endif +#ifdef __HAL_RCC_ADC34_CLK_ENABLE + __HAL_RCC_ADC34_CLK_ENABLE(); +#endif + } +#endif +#ifdef ADC4 + else if(hadc->Instance == ADC4) { + __HAL_RCC_ADC34_CLK_ENABLE(); + } +#endif + +#ifdef __HAL_RCC_ADC_CLK_ENABLE + __HAL_RCC_ADC_CLK_ENABLE(); +#endif +#ifdef __HAL_RCC_ADC_CONFIG + /* ADC Periph interface clock configuration */ + __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK); +#endif + + /* Enable GPIO clock ****************************************/ + port = set_GPIO_Port_Clock(STM_PORT(g_current_pin)); + + /*##-2- Configure peripheral GPIO ##########################################*/ + /* ADC Channel GPIO pin configuration */ + GPIO_InitStruct.Pin = STM_GPIO_PIN(g_current_pin); +#ifdef GPIO_MODE_ANALOG_ADC_CONTROL + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; +#else + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; +#endif + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(port, &GPIO_InitStruct); +} + +/** + * @brief DeInitializes the ADC MSP. + * @param hadc: ADC handle + * @retval None + */ +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ +#ifdef __HAL_RCC_ADC_FORCE_RESET + __HAL_RCC_ADC_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC_RELEASE_RESET + __HAL_RCC_ADC_RELEASE_RESET(); +#endif + + if(hadc->Instance == ADC1) { +#ifdef __HAL_RCC_ADC1_FORCE_RESET + __HAL_RCC_ADC1_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC1_RELEASE_RESET + __HAL_RCC_ADC1_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC12_FORCE_RESET + __HAL_RCC_ADC12_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC12_RELEASE_RESET + __HAL_RCC_ADC12_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC1_CLK_DISABLE + __HAL_RCC_ADC1_CLK_DISABLE(); +#endif +#ifdef __HAL_RCC_ADC12_CLK_DISABLE + __HAL_RCC_ADC12_CLK_DISABLE(); +#endif + } +#ifdef ADC2 + else if(hadc->Instance == ADC2) { +#ifdef __HAL_RCC_ADC2_FORCE_RESET + __HAL_RCC_ADC2_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC2_RELEASE_RESET + __HAL_RCC_ADC2_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC12_FORCE_RESET + __HAL_RCC_ADC12_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC12_RELEASE_RESET + __HAL_RCC_ADC12_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC2_CLK_DISABLE + __HAL_RCC_ADC2_CLK_DISABLE(); +#endif +#ifdef __HAL_RCC_ADC2_CLK_DISABLE + __HAL_RCC_ADC2_CLK_DISABLE(); +#endif + } +#endif +#ifdef ADC3 + else if(hadc->Instance == ADC3) { +#ifdef __HAL_RCC_ADC3_FORCE_RESET + __HAL_RCC_ADC3_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC3_RELEASE_RESET + __HAL_RCC_ADC3_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC34_FORCE_RESET + __HAL_RCC_ADC34_FORCE_RESET(); +#endif +#ifdef __HAL_RCC_ADC34_RELEASE_RESET + __HAL_RCC_ADC34_RELEASE_RESET(); +#endif +#ifdef __HAL_RCC_ADC3_CLK_DISABLE + __HAL_RCC_ADC3_CLK_DISABLE(); +#endif +#ifdef __HAL_RCC_ADC34_CLK_DISABLE + __HAL_RCC_ADC34_CLK_DISABLE(); +#endif + } +#endif +#ifdef ADC4 + else if(hadc->Instance == ADC4) { + __HAL_RCC_ADC34_FORCE_RESET(); + __HAL_RCC_ADC34_RELEASE_RESET(); + __HAL_RCC_ADC34_CLK_DISABLE(); + } +#endif +#ifdef __HAL_RCC_ADC_CLK_DISABLE + __HAL_RCC_ADC_CLK_DISABLE(); +#endif +} + +/** + * @brief This function will set the ADC to the required value + * @param pin : the pin to use + * @retval the value of the adc + */ +uint16_t adc_read_value(PinName pin) +{ + ADC_HandleTypeDef AdcHandle = {}; + ADC_ChannelConfTypeDef AdcChannelConf = {}; + __IO uint16_t uhADCxConvertedValue = 0; + + AdcHandle.Instance = pinmap_peripheral(pin, PinMap_ADC); + + if (AdcHandle.Instance == NC) return 0; + + AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* Asynchronous clock mode, input ADC clock divided */ + AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */ + AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */ + AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */ + AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag picked-up to indicate conversion end */ + AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous mode disabled to have only 1 conversion at each conversion trig */ + AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter discarded because sequencer is disabled */ + AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* Software start to trig the 1st conversion manually, without external event */ + AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */ + AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */ + AdcHandle.State = HAL_ADC_STATE_RESET; +#if defined (STM32F0xx) || defined (STM32L0xx) + AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ + AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */ + AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is overwritten with the last conversion result in case of overrun */ +#ifdef STM32F0xx + AdcHandle.Init.SamplingTimeCommon = SAMPLINGTIME; +#else // STM32L0 + //LowPowerFrequencyMode to enable if clk freq < 2.8Mhz + AdcHandle.Init.SamplingTime = SAMPLINGTIME; +#endif +#else +#ifdef STM32F3xx + AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed conversion feature disabled */ +#endif + AdcHandle.Init.NbrOfConversion = 1; /* Specifies the number of ranks that will be converted within the regular group sequencer. */ + AdcHandle.Init.NbrOfDiscConversion = 0; /* Parameter discarded because sequencer is disabled */ +#endif + + g_current_pin = pin; /* Needed for HAL_ADC_MspInit*/ + + if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { + return 0; + } + + AdcChannelConf.Channel = get_adc_channel(pin); /* Specifies the channel to configure into ADC */ +#ifdef STM32L4xx + if (!IS_ADC_CHANNEL(&AdcHandle, AdcChannelConf.Channel)) return 0; +#else + if (!IS_ADC_CHANNEL(AdcChannelConf.Channel)) return 0; +#endif + AdcChannelConf.Rank = ADC_REGULAR_RANK_1; /* Specifies the rank in the regular group sequencer */ +#ifndef STM32L0xx + AdcChannelConf.SamplingTime = SAMPLINGTIME; /* Sampling time value to be set for the selected channel */ +#endif + /*##-2- Configure ADC regular channel ######################################*/ + if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) + { + /* Channel Configuration Error */ + return 0; + } + +#if defined (STM32F3xx) || defined (STM32L4xx) + /*##-2.1- Calibrate ADC then Start the conversion process ####################*/ + if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK) + { + /* ADC Calibration Error */ + return 0; + } +#endif + + /*##-3- Start the conversion process ####################*/ + if (HAL_ADC_Start(&AdcHandle) != HAL_OK) + { + /* Start Conversation Error */ + return 0; + } + + /*##-4- Wait for the end of conversion #####################################*/ + /* For simplicity reasons, this example is just waiting till the end of the + conversion, but application may perform other tasks while conversion + operation is ongoing. */ + if (HAL_ADC_PollForConversion(&AdcHandle, 10) != HAL_OK) + { + /* End Of Conversion flag not set on time */ + return 0; + } + + /* Check if the continous conversion of regular channel is finished */ + if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) + { + /*##-5- Get the converted value of regular channel ########################*/ + uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle); + } + + if (HAL_ADC_Stop(&AdcHandle) != HAL_OK) + { + /* Stop Conversation Error */ + return 0; + } + + if(HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { + return 0; + } + + return uhADCxConvertedValue; +} + +////////////////////////// PWM INTERFACE FUNCTIONS ///////////////////////////// + + +/** + * @brief TIM MSP Initialization + * This function configures the hardware resources used in this example: + * - Peripheral's clock enable + * - Peripheral's GPIO Configuration + * @param htim: TIM handle pointer + * @retval None + */ +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + uint32_t function = pinmap_function(g_current_pin, PinMap_PWM); + /*##-1- Enable peripherals and GPIO Clocks #################################*/ + /* TIMx Peripheral clock enable */ + timer_enable_clock(htim); + + /* Enable GPIO Channels Clock */ + /* Enable GPIO clock ****************************************/ + port = set_GPIO_Port_Clock(STM_PORT(g_current_pin)); + + /* Common configuration for all channels */ + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(function); + GPIO_InitStruct.Pin = STM_GPIO_PIN(g_current_pin); + + HAL_GPIO_Init(port, &GPIO_InitStruct); +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + timer_disable_clock(htim); +} + +/** + * @brief This function will set the PWM to the required value + * @param port : the gpio port to use + * @param pin : the gpio pin to use + * @param clock_freq : frequency of the tim clock + * @param period : period of the tim counter + * @param value : the value to push on the PWM output + * @param do_init : if set to 1 the initialization of the PWM is done + * @retval None + */ +void pwm_start(PinName pin, uint32_t clock_freq, + uint32_t period, uint32_t value, uint8_t do_init) +{ + TIM_HandleTypeDef timHandle = {}; + TIM_OC_InitTypeDef timConfig = {}; + uint32_t timChannel; + + /* Compute the prescaler value to have TIM counter clock equal to clock_freq Hz */ + timHandle.Instance = pinmap_peripheral(pin, PinMap_PWM); + if (timHandle.Instance == NC) return 0; + timHandle.Init.Prescaler = (uint32_t)(getTimerClkFreq(timHandle.Instance) / clock_freq) - 1; + timHandle.Init.Period = period -1; + timHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timHandle.Init.CounterMode = TIM_COUNTERMODE_UP; +#ifndef STM32L0xx + timHandle.Init.RepetitionCounter = 0; +#endif + timHandle.State= HAL_TIM_STATE_RESET; + // TBC: is timHandle.State field should be saved ? + + if (do_init == 1) { + g_current_pin = pin; + if (HAL_TIM_PWM_Init(&timHandle) != HAL_OK) { + return; + } + } + timChannel = get_pwm_channel(pin); + if (!IS_TIM_CHANNELS(timChannel)) return; + //HAL_TIM_PWM_Stop(&timHandle, timChannel); + + /*##-2- Configure the PWM channels #########################################*/ + /* Common configuration for all channels */ + timConfig.OCMode = TIM_OCMODE_PWM1; + timConfig.OCPolarity = TIM_OCPOLARITY_HIGH; + timConfig.OCFastMode = TIM_OCFAST_DISABLE; +#ifndef STM32L0xx + timConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; + timConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; + timConfig.OCIdleState = TIM_OCIDLESTATE_RESET; +#endif + timConfig.Pulse = value; + + if (HAL_TIM_PWM_ConfigChannel(&timHandle, &timConfig, timChannel) != HAL_OK) + { + /*##-2- Configure the PWM channels #########################################*/ + return; + } + +#ifndef STM32L0xx + if(STM_PIN_INVERTED(pinmap_function(pin, PinMap_PWM))) { + HAL_TIMEx_PWMN_Start(&timHandle, timChannel); + } else +#endif + { + HAL_TIM_PWM_Start(&timHandle, timChannel); + } +} + +/** + * @brief This function will disable the PWM + * @param port : the gpio port to use + * @param pin : the gpio pin to use + * @retval None + */ +void pwm_stop(PinName pin) +{ + TIM_HandleTypeDef timHandle; + uint32_t timChannel; + + timHandle.Instance = pinmap_peripheral(pin, PinMap_PWM); + if (timHandle.Instance == NC) return 0; + timChannel = get_pwm_channel(pin); + if (!IS_TIM_CHANNELS(timChannel)) return 0; + +#ifndef STM32L0xx + if (STM_PIN_INVERTED(pinmap_function(pin, PinMap_PWM))) { + HAL_TIMEx_PWMN_Stop(&timHandle, timChannel); + } else +#endif + { + HAL_TIM_PWM_Stop(&timHandle, timChannel); + } + + HAL_TIM_PWM_DeInit(&timHandle); +} + + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/analog.h b/cores/arduino/stm32/analog.h new file mode 100644 index 0000000..4d8d0d7 --- /dev/null +++ b/cores/arduino/stm32/analog.h @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @file analog.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for analog module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __ANALOG_H +#define __ANALOG_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void dac_write_value(PinName pin, uint32_t value, uint8_t do_init); +void dac_stop(PinName pin); +uint16_t adc_read_value(PinName pin); +void pwm_start(PinName pin, uint32_t clock_freq, uint32_t period, uint32_t value, uint8_t do_init); +void pwm_stop(PinName pin); + +#ifdef __cplusplus +} +#endif + +#endif /* __ANALOG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/clock.c b/cores/arduino/stm32/clock.c new file mode 100644 index 0000000..a224827 --- /dev/null +++ b/cores/arduino/stm32/clock.c @@ -0,0 +1,188 @@ +/** + ****************************************************************************** + * @file clock.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide clock services for time purpose + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_def.h" +#include "hw_config.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** + * @brief Function called to read the current micro second + * @param None + * @retval None + */ +uint32_t GetCurrentMicro(void) +{ + uint32_t m0 = HAL_GetTick(); + uint32_t u0 = SysTick->LOAD - SysTick->VAL; + uint32_t m1 = HAL_GetTick(); + uint32_t u1 = SysTick->LOAD - SysTick->VAL; + + if (m1 > m0) { + return ( m1 * 1000 + (u1 * 1000) / SysTick->LOAD); + } else { + return ( m0 * 1000 + (u0 * 1000) / SysTick->LOAD); + } +} + +/** + * @brief Function called wto read the current millisecond + * @param None + * @retval None + */ +uint32_t GetCurrentMilli(void) +{ + return HAL_GetTick(); +} + +/** + * @brief Function called when t he tick interruption falls + * @param None + * @retval None + */ +void SysTick_Handler(void) +{ + HAL_IncTick(); +} + +/** + * @brief Function provides us delay (required by some arduino libraries). + * Can be called inside an interrupt. + * @param None + * @retval None + */ +void delayInsideIT(uint32_t delay_us) +{ + uint32_t nb_loop; +#if defined (STM32F0xx) || defined (STM32L0xx) + nb_loop = (((HAL_RCC_GetHCLKFreq() / 1000000)/5)*delay_us)+1; /* uS (divide by 4 because each loop take about 4 cycles including nop +1 is here to avoid delay of 0 */ + __asm__ volatile( + "1: " "\n\t" + " nop " "\n\t" + " sub %0, %0, #1 " "\n\t" + " bne 1b " "\n\t" + : "=r" (nb_loop) + : "0"(nb_loop) + : "r3" + ); +#else + nb_loop = (((HAL_RCC_GetHCLKFreq() / 1000000)/4)*delay_us)+1; /* uS (divide by 4 because each loop take about 4 cycles including nop +1 is here to avoid delay of 0 */ + __asm__ volatile( + "1: " "\n\t" + " nop " "\n\t" + " subs.w %0, %0, #1 " "\n\t" + " bne 1b " "\n\t" + : "=r" (nb_loop) + : "0"(nb_loop) + : "r3" + ); +#endif +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usb_device.h b/cores/arduino/stm32/clock.h similarity index 53% rename from variants/otto/usb/usb_device.h rename to cores/arduino/stm32/clock.h index cfa94df..995e618 100644 --- a/variants/otto/usb/usb_device.h +++ b/cores/arduino/stm32/clock.h @@ -1,21 +1,25 @@ /** ****************************************************************************** - * @file : USB_DEVICE - * @version : v1.0_Cube - * @brief : Header for usb_device file. + * @file clock.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for clock.c module ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -29,35 +33,31 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** -*/ + */ + /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __usb_device_H -#define __usb_device_H -#ifdef __cplusplus - extern "C" { -#endif +#ifndef __CLOCK_H +#define __CLOCK_H /* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" -#include "usbd_def.h" +#include "stm32_def.h" -extern USBD_HandleTypeDef hUsbDeviceFS; +#ifdef __cplusplus + extern "C" { +#endif -/* USB_Device init function */ -void MX_USB_DEVICE_Init(void); +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint32_t GetCurrentMilli(void); +uint32_t GetCurrentMicro(void); +void delayInsideIT(uint32_t delay_us); #ifdef __cplusplus } #endif -#endif /*__usb_device_H */ -/** - * @} - */ - -/** - * @} - */ +#endif /* __CLOCK_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/digital_io.c b/cores/arduino/stm32/digital_io.c new file mode 100644 index 0000000..9a788dd --- /dev/null +++ b/cores/arduino/stm32/digital_io.c @@ -0,0 +1,162 @@ +/** + ****************************************************************************** + * @file digital_io.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Provide an interface to configure hw ios + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "digital_io.h" +#include "stm32_def.h" +#include "hw_config.h" + +#ifdef __cplusplus + extern "C" { +#endif +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + + +/** + * @brief This function initialize the IO + * @param port : one of the gpio port + * @param pin : one of the gpio pin + * @param mode : one of the gpio mode (cf hal_gpio.h) + * @param pull : one of the pullup/down mode (cf hal_gpio.h) + * @retval None + */ +void digital_io_init(PinName pin, uint32_t mode, uint32_t pull) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_TypeDef *port = set_GPIO_Port_Clock(STM_PORT(pin));; + GPIO_InitStructure.Pin = STM_GPIO_PIN(pin); + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Mode = mode; + GPIO_InitStructure.Pull = pull; + HAL_GPIO_Init(port, &GPIO_InitStructure); +} + +/** + * @brief This function set a value to an IO + * @param port : one of the gpio port + * @param pin : one of the gpio pin + * @param val : 0 to set to low, any other value to set to high + * @retval None + */ +void digital_io_write(GPIO_TypeDef *port, uint32_t pin, uint32_t val) +{ + if(val) { + HAL_GPIO_WritePin(port, pin, GPIO_PIN_SET); + } else { + HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET); + } +} + + +/** + * @brief This function set a value to an IO + * @param port : one of the gpio port + * @param pin : one of the gpio pin + * @retval The pin state (LOW or HIGH) + */ +uint32_t digital_io_read(GPIO_TypeDef *port, uint32_t pin) +{ + return (uint32_t)HAL_GPIO_ReadPin(port, pin); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/digital_io.h b/cores/arduino/stm32/digital_io.h new file mode 100644 index 0000000..941f3c7 --- /dev/null +++ b/cores/arduino/stm32/digital_io.h @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * @file digital_io.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for digital_io module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DIGITAL_IO_H +#define __DIGITAL_IO_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void digital_io_init(PinName pin, uint32_t mode, uint32_t pull); +void digital_io_write(GPIO_TypeDef *port, uint32_t pin, uint32_t val); +uint32_t digital_io_read(GPIO_TypeDef *port, uint32_t pin); + +#ifdef __cplusplus +} +#endif + +#endif /* __DIGITAL_IO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/hal_uart_emul.c b/cores/arduino/stm32/hal_uart_emul.c new file mode 100644 index 0000000..0da6b2c --- /dev/null +++ b/cores/arduino/stm32/hal_uart_emul.c @@ -0,0 +1,1237 @@ +/** + ****************************************************************************** + * @file hal_uart_emul.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Adaptation from stm32f4xx_hal_uart_emul.c + * UART Emulation HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter (UART Emulation): + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State and Errors functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The UART Emulation HAL driver can be used as follows: + + (#) Declare a UART_Emul_HandleTypeDef handle structure. + + (#) Initialize the UART Emulation low level resources by implementing the HAL_UART_Emul_MspInit() API: + (##) Enable the UART_EMUL clock + (##) UART Emulation port declaration + (+++) UART pins configuration: TxPinNumber and RxPinNumber + (+++) Enable the clock for the GPIOs + + (#) Program the Baud Rate, Word Length, Stop Bit, Parity, + and Mode(Receiver/Transmitter) in the huart Emul Init structure. + + (#) Initialize the UART Emulation registers software by calling the HAL_UART_Emul_Init() API. + + -@- The specific UART Emulaion Handle (Transmission complete, Reception complete + and Transfer Error) will be managed using the macros HAL_UART_Emul_TxCpltCallback(), + HAL_UART_Emul_RxCpltCallback() and __HAL_UART_Emul_TranferError() inside the transmit + and receive process. + + -@- These API's(HAL_UART_Emul_Init() configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + by calling the customed HAL_UART_Emul_MspInit() API. + + (#) Three modes of operations are available within this driver: + + *** UART Emulation mode IO operation *** + =================================== + [..] + (+) Send an amount of data in non blocking mode (IT) using HAL_UART_Emul_Transmit() + (+) At transmission end of transfer HAL_UART_Emul_TxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_Emul_TxCpltCallback + (+) Receive an amount of data in non blocking mode (IT) using HAL_UART_Emul_Receive() + + (+) At reception end of transfer HAL_UART_Emul_RxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_Emul_RxCpltCallback + (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_UART_Emul_ErrorCallback + + *** UART Emulation HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in UART Emulation HAL driver. + + (+) __HAL_UART_EMUL_GET_FLAG : Checks whether the specified UART Emulation flag is set or not + (+) __HAL_UART_EMUL_CLEAR_FLAG : Clears the specified UART Emulation pending flag + (+) __HAL_UART_EMUL_SET_FLAG : Set the specified UART Emulation flag + + [..] + (@) You can refer to the UART Emulation HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(TIM1_BASE) && defined(UART_EMUL_RX) && defined(UART_EMUL_TX) +/* Includes ------------------------------------------------------------------*/ +#include "hal_uart_emul.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup UART_EMUL_HAL_Driver + * @brief HAL UART Emulation module driver + * @{ + */ +//#ifdef HAL_UART_EMUL_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* DMA Handle declaration */ +static DMA_HandleTypeDef hdma_tx; +static DMA_HandleTypeDef hdma_rx; +/* Timer handler declaration */ +static TIM_HandleTypeDef TimHandle; + +/* UART Emulation Handle */ +static UART_Emul_HandleTypeDef *huart_emul; + +/* First Buffer for format data in reception mode */ +static uint32_t *pFirstBuffer_Rx[RX_BUFFER_SIZE]; + +/* Second Buffer for format data in reception mode */ +static uint32_t *pSecondBuffer_Rx[RX_BUFFER_SIZE]; + +/* First Buffer for format data in transmission mode */ +static uint32_t *pFirstBuffer_Tx[TX_BUFFER_SIZE]; + +/* Second Buffer for format data in transmission mode */ +static uint32_t *pSecondBuffer_Tx[TX_BUFFER_SIZE]; + +/* Private function prototypes -----------------------------------------------*/ +static void UART_Emul_SetConfig (UART_Emul_HandleTypeDef *huart); +static void UART_Emul_SetConfig_DMATx(void); +static void UART_Emul_SetConfig_DMARx(void); +static void UART_Emul_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void UART_Emul_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void UART_Emul_DMAError(DMA_HandleTypeDef *hdma); +static void UART_Emul_TransmitFrame(UART_Emul_HandleTypeDef *huart); +static void UART_Emul_ReceiveFrame(UART_Emul_HandleTypeDef *huart, uint32_t *pData); +static void UART_Emul_TransmitFormatFrame(UART_Emul_HandleTypeDef *huart , uint8_t pData, uint32_t *pBuffer_Tx); +static uint8_t UART_Emul_ReceiveFormatFrame(UART_Emul_HandleTypeDef *huart, uint32_t *pBuffer, uint8_t pFrame); + + +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup UART_Private_Functions + * @{ + */ + +/** @defgroup UART_Emulation_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + This subsection provides a set of functions allowing to initialize the UART Emulation + in asynchronous mode. + (+) For the asynchronous mode only these parameters can be configured: + (++) Baud Rate (4800 up 115200) + (++) Word Length (5 bit up 9 bit) + (++) Stop Bit (1 or 2 stop bit) + (++) Parity: If the parity is enabled, then the MSB bit of the data to be transmitted + is changed by the parity bit. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the UART Emulation mode according to the specified parameters in + * the UART_Emul_InitTypeDef and create the associated handle. + * @param huart: UART Emulation handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Emul_Init(UART_Emul_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + if (huart->State == HAL_UART_EMUL_STATE_RESET) + { + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_Emul_MspInit(huart); + } + + /* Get Structure for uart emul Handle */ + huart_emul = huart; + + /* Set the TIM state */ + huart->State = HAL_UART_EMUL_STATE_BUSY; + + /* Set the UART Emulation Communication parameters */ + UART_Emul_SetConfig(huart); + + /* Initialize the UART Emulation state */ + huart->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + huart->State = HAL_UART_EMUL_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the UART Emulation . + * @param huart: UART Emulation handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Emul_DeInit(UART_Emul_HandleTypeDef *huart) +{ + /* Check the UART Emulation handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + huart->State = HAL_UART_EMUL_STATE_BUSY; + + /* DeInit the low level hardware */ + HAL_UART_Emul_MspDeInit(huart); + + huart->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + huart->State = HAL_UART_EMUL_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief Initializes the UART Emulation MSP. + * @param huart: UART Emulation Handle + * @retval None + */ +__weak void HAL_UART_Emul_MspInit(UART_Emul_HandleTypeDef *huart) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_UART_Emul_MspInit could be implemented in the user file + */ +} + +/** + * @brief UART Emulation MSP DeInit. + * @param huart: UART Emulation handle + * @retval None + */ +__weak void HAL_UART_Emul_MspDeInit(UART_Emul_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART_Emul_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup UART_Emulation_Group2 IO operation functions + * @brief UART Emulation Transmit and Receive functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + ============================================================================== + This subsection provides a set of functions allowing to manage the UART asynchronous + and Half duplex data transfers. + + (#) There is one mode of transfer: + (++) Non-Blocking mode: The communication is performed using DMA, + this APIs returns the HAL status. + The end of the data processing will be indicated through the + DMA IRQ + + The HAL_UART_Emul_TxCpltCallback(), HAL_UART_Emul_RxCpltCallback() user callbacks + will be executed respectivelly at the end of the transmit or receive process. + The HAL_UART_Emul_ErrorCallback() user callback will be executed when + a communication error is detected. + + (#) Non Blocking mode functions with DMA are: + (++) HAL_UART_Emul_Transmit_DMA() + (++) HAL_UART_Emul_Receive_DMA() + + (#) A set of Transfer Complete Callbacks are provided in Non Blocking mode: + (++) HAL_UART_Emul_TxCpltCallback() + (++) HAL_UART_Emul_RxCpltCallback() + (++) HAL_UART_Emul_ErrorCallback() + + [..] + +@endverbatim + * @{ + */ +/** + * @brief Sends an amount of data + * @param huart: UART Emulation handle + * @param pData: Pointer to data buffer + * @param Size: Amount of data to be sent + * @retval HAL status +*/ +HAL_StatusTypeDef HAL_UART_Emul_Transmit_DMA(UART_Emul_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + uint32_t tmp = 0; + + tmp = huart->State; + if ((tmp == HAL_UART_EMUL_STATE_READY) || (tmp == HAL_UART_EMUL_STATE_BUSY_RX)) + { + if ((pData == NULL ) || (Size == 0)) + { + return HAL_ERROR; + } + + huart->TxXferSize = Size; + huart->pTxBuffPtr = pData; + huart->TxXferCount = 1; + huart->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + + /* Check if a receive process is ongoing or not */ + if (huart->State == HAL_UART_EMUL_STATE_BUSY_RX) + { + huart->State = HAL_UART_EMUL_STATE_BUSY_TX_RX; + } + else + { + huart->State = HAL_UART_EMUL_STATE_BUSY_TX; + } + + /* Set the UART Emulation DMA transfer complete callback */ + TimHandle.hdma[TIM_DMA_Handle_Tx]->XferCpltCallback = UART_Emul_DMATransmitCplt; + + /* Set the DMA error callback */ + TimHandle.hdma[TIM_DMA_Handle_Tx]->XferErrorCallback = UART_Emul_DMAError; + + /* Format first Frame to be sent */ + if (huart->TxXferCount == FIRST_BYTE) + { + /* Format Frame to be sent */ + UART_Emul_TransmitFormatFrame(huart, *(pData), (uint32_t*)pFirstBuffer_Tx); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(UART_EMUL_TX_TIMER_INSTANCE, TIM_Channel_Tx, TIM_CCx_ENABLE); + + /* Send Frames */ + UART_Emul_TransmitFrame(huart); + } + + if ((huart->TxXferCount == FIRST_BYTE) && (huart->TxXferCount < Size)) + { + /* Format Second Frame to be sent */ + UART_Emul_TransmitFormatFrame(huart, *(pData + huart->TxXferCount), (uint32_t*)pSecondBuffer_Tx); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in non blocking mode. + * @param huart: UART Emulation handle + * @param pData: Data to be received + * @param Size: Amount of data to be received + * @retval HAL status +*/ +HAL_StatusTypeDef HAL_UART_Emul_Receive_DMA(UART_Emul_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + uint32_t tmp = 0; + + tmp = huart->State; + if ((tmp == HAL_UART_EMUL_STATE_READY) || (tmp == HAL_UART_EMUL_STATE_BUSY_TX)) + { + if ((pData == NULL ) || (Size == 0)) + { + return HAL_ERROR; + } + + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + huart->RxXferCount = 1; + + huart->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + + /* Check if a transmit process is ongoing or not */ + if (huart->State == HAL_UART_EMUL_STATE_BUSY_TX) + { + huart->State = HAL_UART_EMUL_STATE_BUSY_TX_RX; + } + else + { + huart->State = HAL_UART_EMUL_STATE_BUSY_RX; + } + + /* Set the UART Emulation DMA transfer complete callback */ + TimHandle.hdma[TIM_DMA_Handle_Rx]->XferCpltCallback = UART_Emul_DMAReceiveCplt; + + /* Set the DMA error callback */ + TimHandle.hdma[TIM_DMA_Handle_Rx]->XferErrorCallback = UART_Emul_DMAError; + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(UART_EMUL_RX_TIMER_INSTANCE, TIM_Channel_Rx, TIM_CCx_ENABLE); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Initializes the UART Emulation Transfer Complete. + * @param huart: UART Emulation Handle + * @retval None + */ +__weak void HAL_UART_Emul_RxCpltCallback(UART_Emul_HandleTypeDef *huart) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_UART_Emul_TransferComplet could be implemented in the user file + */ +} + +/** + * @} + */ +/*=============================================================================== + ##### Interrupt Handlers used in UART Emulation ##### + =============================================================================== +*/ + +/** +* @brief This function handles DMA interrupt request for TC. +* @param None +* @retval None +*/ +void UART_EMUL_RX_DMA_IRQHandler(void) +{ + /* Increment Counter of Frame */ + huart_emul->RxXferCount ++; + + /* Enable External interrupt for next Frame */ + EXTI->IMR |= huart_emul->Init.RxPinNumber; + + if (__HAL_DMA_GET_FLAG(TimHandle.hdma[TIM_DMA_Handle_Rx], __HAL_DMA_GET_TE_FLAG_INDEX(TimHandle.hdma[TIM_DMA_Handle_Rx])) != RESET) + { + UART_Emul_DMAError(&hdma_rx); + } + + /* Clear the transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(TimHandle.hdma[TIM_DMA_Handle_Rx], __HAL_DMA_GET_TC_FLAG_INDEX(TimHandle.hdma[TIM_DMA_Handle_Rx])); + + /* Transfer complete callback */ + TimHandle.hdma[TIM_DMA_Handle_Rx]->XferCpltCallback(TimHandle.hdma[TIM_DMA_Handle_Rx]); +} + +/** + * @brief EXTI line detection callbacks + * @param GPIO_Pin: Specifies the pins connected EXTI line + * @retval None + */ +void UART_EMUL_EXTI_RX(void/*uint16_t GPIO_Pin*/) +{ + uint32_t tmpreceive = 0; + uint32_t tmpformat = 0; + uint32_t tmpdata = 0; + + /* Disable EXTI line Rx */ + EXTI->IMR &= ~huart_emul->Init.RxPinNumber; + + if ((huart_emul->RxXferCount % 2) != 0) + { + tmpreceive = (uint32_t)pFirstBuffer_Rx; + tmpformat = (uint32_t)pSecondBuffer_Rx; + } + else + { + tmpreceive = (uint32_t)pSecondBuffer_Rx; + tmpformat = (uint32_t)pFirstBuffer_Rx; + } + + /* Start receiver mode in the reference point*/ + UART_Emul_ReceiveFrame(huart_emul, (uint32_t*)tmpreceive); + + if (huart_emul->RxXferCount > 1) +{ + /* Format frame */ + *(uint8_t*)((huart_emul->pRxBuffPtr) + (huart_emul->RxXferCount - 2)) = UART_Emul_ReceiveFormatFrame(huart_emul, (uint32_t*)tmpformat, (uint8_t)tmpdata); + } +} + +/** +* @brief This function handles DMA interrupt request for TC. +* @param None +* @retval None +*/ +void UART_EMUL_TX_DMA_IRQHandler(void) +{ + if (__HAL_DMA_GET_FLAG(TimHandle.hdma[TIM_DMA_Handle_Tx], __HAL_DMA_GET_TE_FLAG_INDEX(TimHandle.hdma[TIM_DMA_Handle_Tx])) != RESET) + { + UART_Emul_DMAError(&hdma_tx); + } + + /* Clear the transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(TimHandle.hdma[TIM_DMA_Handle_Tx], __HAL_DMA_GET_TC_FLAG_INDEX(TimHandle.hdma[TIM_DMA_Handle_Tx])); + + /* Transfer complete callback */ + TimHandle.hdma[TIM_DMA_Handle_Tx]->XferCpltCallback(TimHandle.hdma[TIM_DMA_Handle_Tx]); +} + +/** + * @brief This function handles UART Emulation request. + * @param huart: UART Emulation handle + * @retval None + */ +void HAL_UART_Emul_IRQHandler(UART_Emul_HandleTypeDef *huart) +{ + uint32_t tmp = 0; + + tmp = __HAL_UART_EMUL_GET_FLAG(huart, UART_EMUL_FLAG_PE); + /* UART Emulation parity error occurred */ + if (tmp != RESET) + { + __HAL_UART_EMUL_CLEAR_FLAG(huart, UART_EMUL_FLAG_PE); + + huart->ErrorCode |= HAL_UART_EMUL_ERROR_PE; + } + + tmp = __HAL_UART_EMUL_GET_FLAG(huart, UART_EMUL_FLAG_FE); + /* UART Emulation frame error occurred */ + if (tmp != RESET) + { + __HAL_UART_EMUL_CLEAR_FLAG(huart, UART_EMUL_FLAG_FE); + + huart->ErrorCode |= HAL_UART_EMUL_ERROR_FE; + } + + tmp = __HAL_UART_EMUL_GET_FLAG(huart, UART_EMUL_FLAG_TC); + /* UART Emulation in mode Transmitter */ + if ((tmp != RESET)) + { + __HAL_UART_EMUL_CLEAR_FLAG(huart, UART_EMUL_FLAG_TC); + } + + tmp = __HAL_UART_EMUL_GET_FLAG(huart, UART_EMUL_FLAG_RC); + /* UART Emulation in mode Receiver */ + if ((tmp != RESET)) + { + __HAL_UART_EMUL_CLEAR_FLAG(huart, UART_EMUL_FLAG_RC); + } + + if (huart->ErrorCode != HAL_UART_EMUL_ERROR_NONE) + { + /* Set the UART Emulation state ready to be able to start again the process */ + huart->State = HAL_UART_EMUL_STATE_READY; + + HAL_UART_Emul_ErrorCallback(huart); + } +} + +/** + * @} + */ + +/** @defgroup UART_Emulation_Group3 Peripheral State and Errors functions + * @brief UART Emulation State and Errors functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Errors functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to return the State of + UART Emulation communication process, return Peripheral Errors occured during communication + process + (+) HAL_UART_Emul_GetState() API can be helpful to check in run-time the state of the UART Emulation. + (+) HAL_UART_Emul_GetError() check in run-time errors that could be occured durung communication. + +@endverbatim + * @{ + */ + +/** + * @brief Returns the UART Emulation state. + * @param huart: UART Emulation handle + * @retval HAL state + */ +HAL_UART_Emul_StateTypeDef HAL_UART_Emul_GetState(UART_Emul_HandleTypeDef *huart) +{ + return huart->State; +} + +/** +* @brief Return the UART Emulation error code +* @param huart : pointer to UART_Emul_HandleTypeDef structure that contains + * the configuration information for the specified UART Emulation. +* @retval UART Emulation Error Code +*/ +uint32_t HAL_UART_Emul_GetError(UART_Emul_HandleTypeDef *huart) +{ + return huart->ErrorCode; +} + +/** + * @} + */ +/*=============================================================================== + ##### Private function for UART Emulation ##### + =============================================================================== +*/ + +/** + * @brief This function is executed in case of Receive Complete for last frame. + * @param None + * @retval None + */ +static void UART_Emul_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + uint32_t tmpformat = 0; + uint32_t tmpdata = 0; + if (huart_emul->RxXferCount > huart_emul->RxXferSize) + { + /*Enable EXTI line Rx */ + //EXTI->IMR |= huart_emul->Init.RxPinNumber; + + /* Disable the Peripheral */ + __HAL_DMA_DISABLE(&hdma_rx); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(&TimHandle, TIM_DMA_source_Rx); + + if ((huart_emul->RxXferCount % 2) == 0) + { + tmpformat = (uint32_t)pFirstBuffer_Rx; + } + + else + { + tmpformat = (uint32_t)pSecondBuffer_Rx; + } + + /* Formatted Last Frame */ + *(uint8_t*)((huart_emul->pRxBuffPtr) + (huart_emul->RxXferCount - 2)) = UART_Emul_ReceiveFormatFrame(huart_emul, (uint32_t*)tmpformat, (uint8_t)tmpdata); + + /* Set RC flag receiver complete */ + __HAL_UART_EMUL_SET_FLAG(huart_emul, UART_EMUL_FLAG_RC); + + /* De_Initialize counter frame for Rx */ + huart_emul->RxXferCount = 0; + + /* Initialize the UART Emulation state */ + huart_emul->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + + /* Check if a transmit process is ongoing or not */ + if (huart_emul->State == HAL_UART_EMUL_STATE_BUSY_TX_RX) + { + huart_emul->State = HAL_UART_EMUL_STATE_BUSY_TX; + } + else + { + huart_emul->State = HAL_UART_EMUL_STATE_READY; + } + + /* Handle for UART Emulation Receive Complete */ + HAL_UART_Emul_RxCpltCallback(huart_emul); + } +} + +/** + * @brief Receives an amount of Frames. + * @param huart: UART Emulation handle + * @param pData: Frame to be Received + * @retval None +*/ +static void UART_Emul_ReceiveFrame(UART_Emul_HandleTypeDef *huart, uint32_t *pData) +{ + uint32_t tmp_sr =0; + uint32_t tmp_ds =0; + uint32_t tmp_size =0; + uint32_t tmp_arr =0; + + tmp_arr = UART_EMUL_RX_TIMER_INSTANCE->ARR; + tmp_ds = (uint32_t)pData; + tmp_sr = (uint32_t) & (huart->RxPortName->IDR); + tmp_size = __HAL_UART_EMUL_FRAME_LENGTH(huart); + + /* Enable the transfer complete interrupt */ + __HAL_DMA_ENABLE_IT(&hdma_rx, DMA_IT_TC); + + /* Enable the transfer Error interrupt */ + __HAL_DMA_ENABLE_IT(&hdma_rx, DMA_IT_TE); + +#if defined (STM32F0xx) || defined (STM32F3xx) + /* Configure DMA Stream data length */ + hdma_rx.Instance->CNDTR = tmp_size; + + /* Configure DMA Stream source address */ + hdma_rx.Instance->CPAR = tmp_sr; + + /* Configure DMA Stream destination address */ + hdma_rx.Instance->CMAR = tmp_ds; +#else + /* Configure DMA Stream data length */ + hdma_rx.Instance->NDTR = tmp_size; + + /* Configure DMA Stream source address */ + hdma_rx.Instance->PAR = tmp_sr; + + /* Configure DMA Stream destination address */ + hdma_rx.Instance->M0AR = tmp_ds; +#endif + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(&hdma_rx); + + if ((huart_emul->RxXferCount == 1)||(huart->State != HAL_UART_EMUL_STATE_BUSY_TX_RX)) + { + UART_EMUL_RX_TIMER_INSTANCE->CCR2 = ((UART_EMUL_RX_TIMER_INSTANCE->CNT + (tmp_arr / 2)) % tmp_arr); + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(&TimHandle, TIM_DMA_source_Rx); + + /* Enable Timer */ + __HAL_TIM_ENABLE(&TimHandle); +} + +/** + * @brief Configures the UART Emulation peripheral + + Enable clock for all peripherals Timer, GPIO + + DMA Configuration channel, Stream, Mode,... + * @param huart: UART Emulation handle + * @retval None + */ +static void UART_Emul_SetConfig (UART_Emul_HandleTypeDef *huart) +{ + uint32_t bit_time = 0; + + /* Check the parameters */ + assert_param(IS_UART_EMUL_BAUDRATE(huart->Init.BaudRate)); + assert_param(IS_UART_EMUL_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_EMUL_STOPBITS(huart->Init.StopBits)); + assert_param(IS_UART_EMUL_MODE(huart->Init.Mode)); + assert_param(IS_UART_EMUL_MODE(huart->Init.Parity)); + + /* Init Bit Time */ + if((HAL_RCC_GetSysClockFreq()/HAL_RCC_GetPCLK2Freq()== 1) | (HAL_RCC_GetSysClockFreq()/HAL_RCC_GetPCLK2Freq()== 2)) + { + bit_time = ((uint32_t) ((HAL_RCC_GetSysClockFreq()/huart->Init.BaudRate) - 1)); + } + else + { + bit_time = ((uint32_t) (((HAL_RCC_GetPCLK2Freq()*2)/huart->Init.BaudRate) - 1)); + } + + /*##-1- Configure the Timer peripheral in Bit Delay ##############*/ + /* Initialize TIM peripheral as follow: + + Period = TimerPeriod + + Prescaler = 0 + + ClockDivision = 0 + + Counter direction = Up + */ + TimHandle.Instance = UART_EMUL_TX_TIMER_INSTANCE; + TimHandle.Init.Period = bit_time; + TimHandle.Init.Prescaler = 0; + TimHandle.Init.ClockDivision = 0; + TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + HAL_TIM_Base_Init(&TimHandle); + + if (huart->Init.Mode == UART_EMUL_MODE_TX) + { + /* Configure UART Emulation in Transmission mode */ + UART_Emul_SetConfig_DMATx(); + } + else if (huart->Init.Mode == UART_EMUL_MODE_RX) + { + /* Configure UART Emulation in Reception mode */ + UART_Emul_SetConfig_DMARx(); + } + else + { + /* Configure UART Emulation in full-duplex mode */ + UART_Emul_SetConfig_DMATx(); + UART_Emul_SetConfig_DMARx(); + } +} + +/** + * @brief Configures the DMA for UART Emulation transmission. + + DMA Configuration channel, Stream, Mode, ... + * @param None + * @retval None + */ +static void UART_Emul_SetConfig_DMATx(void) +{ + /* Init Idle */ + HAL_GPIO_WritePin((huart_emul->TxPortName), (huart_emul->Init.TxPinNumber), GPIO_PIN_SET); + + /*##-1- Configure DMA For UART Emulation TX #############################*/ + /* Set the parameters to be configured */ + hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; /* Transfer mode */ + hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Disable */ + hdma_tx.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */ + hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD ; /* Peripheral data alignment : Word */ + hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD ; /* memory data alignment : Word */ + hdma_tx.Init.Mode = DMA_NORMAL; /* Normal DMA mode */ + hdma_tx.Init.Priority = DMA_PRIORITY_HIGH; /* Priority level : High */ +#ifdef STM32F4xx + hdma_tx.Init.Channel = DMA_Channel_Tx; /* Channel used */ + hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* FIFO mode disable */ + hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* FIFO threshold level */ + hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE; /* Memory Burst transfer */ + hdma_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; /* Periph Burst transfer */ +#endif + + /* Set hdma_tim instance */ + hdma_tx.Instance = DMA_Stream_Tx; + hdma_tx.Parent = TimHandle.hdma[TIM_DMA_Handle_Tx]; + /* Link hdma_tim to hdma[ ] ( channel Tx or Rx) */ + __HAL_LINKDMA(&TimHandle, hdma[TIM_DMA_Handle_Tx] , hdma_tx); + + /* Initialize TIMx DMA handle */ + HAL_DMA_Init(TimHandle.hdma[TIM_DMA_Handle_Tx]); + + /*##-2- NVIC configuration for DMA transfer complete interrupt ###########*/ + HAL_NVIC_SetPriority(UART_EMUL_TX_DMA_IRQn, 3, 3); + HAL_NVIC_EnableIRQ(UART_EMUL_TX_DMA_IRQn); +} + +/** + * @brief Configures the DMA for UART Emulation reception. + + DMA Configuration channel, Stream, Mode, ... + * @param None + * @retval None + */ +static void UART_Emul_SetConfig_DMARx(void) +{ + /*##-1- Configure DMA For UART Emulation RX #############################*/ + /* Set the parameters to be configured */ + hdma_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; /* Transfer mode */ + hdma_rx.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Disable */ + hdma_rx.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */ + hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD ; /* Peripheral data alignment : Word */ + hdma_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD ; /* memory data alignment : Word */ + hdma_rx.Init.Mode = DMA_NORMAL; /* Normal DMA mode */ + hdma_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; /* Priority level : very High */ +#if defined(STM32F4xx) + hdma_rx.Init.Channel = DMA_Channel_Rx; /* Channel used */ + hdma_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* FIFO mode disable */ + hdma_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* FIFO threshold level */ + hdma_rx.Init.MemBurst = DMA_MBURST_SINGLE; /* Memory Burst transfer */ + hdma_rx.Init.PeriphBurst = DMA_PBURST_SINGLE; /* Periph Burst transfer */ +#endif + /* Set hdma_tim instance */ + hdma_rx.Instance = DMA_Stream_Rx; + + /* Link hdma_tim to hdma[ ] ( channel Tx or Rx) */ + __HAL_LINKDMA(&TimHandle, hdma[TIM_DMA_Handle_Rx], hdma_rx); + + /* Initialize TIMx DMA handle */ + HAL_DMA_Init(TimHandle.hdma[TIM_DMA_Handle_Rx]); + + /*##-2- NVIC configuration for DMA transfer complete interrupt ###########*/ + HAL_NVIC_SetPriority(UART_EMUL_RX_DMA_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(UART_EMUL_RX_DMA_IRQn); +} + +/** + * @brief Format Frame in Receiver mode. + * @param huart: UART Emulation handle + * @param pBuffer: pointer of receiver Buffer + * @param pFrame: pointer of Frame + * @retval None +*/ +static uint8_t UART_Emul_ReceiveFormatFrame(UART_Emul_HandleTypeDef *huart, uint32_t *pBuf, uint8_t Data) +{ + uint32_t counter = 0; + uint32_t length = 0; + uint32_t tmp = 0; + uint32_t cntparity = 0; + + if (huart->Init.Parity != UART_EMUL_PARITY_NONE) + { + /* Get Length of frame */ + length = huart->Init.WordLength -1 ; + } + else + { + /* Get Length of frame */ + length = huart->Init.WordLength; + } + + if ((pBuf[huart->Init.WordLength+1]&huart->Init.RxPinNumber) != huart->Init.RxPinNumber) + { + /* UART Emulation frame error occurred */ + __HAL_UART_EMUL_SET_FLAG(huart_emul, UART_EMUL_FLAG_FE); + + huart->ErrorCode |= HAL_UART_EMUL_ERROR_FE; + + /* Disable External interrupt for next Frame */ + EXTI->IMR &= ~huart_emul->Init.RxPinNumber; + + /* Handle for UART Emulation Error */ + HAL_UART_Emul_ErrorCallback(huart); + + tmp = RESET; + } + else + { + /* format data */ + for (counter = 0; counter < length; counter++) + { + if ((pBuf[counter+1]&(huart->Init.RxPinNumber)) == (huart->Init.RxPinNumber)) + { + Data = (0x01 << counter) | Data; + cntparity ++; + } + } + /* Parity Bit */ + if (huart->Init.Parity == UART_EMUL_PARITY_ODD) + { + + if (((cntparity % 2) != SET) && ((pBuf[length+1]&huart->Init.RxPinNumber) != huart->Init.RxPinNumber)) + { + /* Set flag PE */ + __HAL_UART_EMUL_SET_FLAG(huart, UART_EMUL_FLAG_PE); + + HAL_UART_Emul_ErrorCallback(huart); + } + } + if (huart->Init.Parity == UART_EMUL_PARITY_EVEN) + { + + if (((cntparity % 2) != RESET) && ((pBuf[length+1]&huart->Init.RxPinNumber) != huart->Init.RxPinNumber)) + { + /* UART Emulation parity error occurred */ + __HAL_UART_EMUL_SET_FLAG(huart, UART_EMUL_FLAG_PE); + + huart->ErrorCode |= HAL_UART_EMUL_ERROR_PE; + + HAL_UART_Emul_ErrorCallback(huart); + } + } + + /* Reset counter parity */ + cntparity = 0; + + tmp = Data; + } + + return tmp; +} + +/** + * @brief This function formats one Frame + * @param UART Emulation Handle + * @param pdata pinteur in data + * @retval None + */ +static void UART_Emul_TransmitFormatFrame(UART_Emul_HandleTypeDef *huart , uint8_t Data, uint32_t *pBuffer_Tx) +{ + uint32_t counter = 0; + uint32_t bitmask = 0; + uint32_t length = 0; + uint32_t cntparity = 0; + + length = huart->Init.WordLength; + + /* Get the Pin Number */ + bitmask = (uint32_t)huart->Init.TxPinNumber; + + /* with no parity */ + if(huart->Init.Parity == 0x00) + { + for (counter = 0; counter < length; counter++) + { + if (((Data >> counter)&BitMask) != 0) + { + pBuffer_Tx[counter+1] = bitmask; + } + else + { + pBuffer_Tx[counter+1] = (bitmask << 16); + } + } + } + /* with parity */ + else + { + for (counter = 0; counter < length-1; counter++) + { + if (((Data >> counter)&BitMask) != 0) + { + pBuffer_Tx[counter+1] = bitmask; + cntparity ++; + } + else + { + pBuffer_Tx[counter+1] = (bitmask << 16); + } + } + } + + switch (huart->Init.Parity) + { + case UART_EMUL_PARITY_ODD: + { + /* Initialize Parity Bit */ + if ((cntparity % 2) != SET) + { + pBuffer_Tx[length] = bitmask; + } + else + { + pBuffer_Tx[length] = (bitmask << 16); + } + + } + break; + case UART_EMUL_PARITY_EVEN: + { + /* Initialize Parity Bit */ + if ((cntparity % 2) != SET) + { + pBuffer_Tx[length] = (bitmask << 16); + } + else + { + pBuffer_Tx[length] = bitmask; + } + } + break; + default: + break; + } + /* Initialize Bit Start */ + pBuffer_Tx[0] = (bitmask << 16); + + if (huart->Init.StopBits == UART_EMUL_STOPBITS_1) + { + /* Initialize Bit Stop */ + pBuffer_Tx[length+1] = bitmask; + } + else + { + /* Initialize Bit Stop */ + pBuffer_Tx[length+1] = bitmask; + pBuffer_Tx[length+2] = bitmask; + } + /* Reset counter parity */ + cntparity = 0; +} + +/** + * @brief Sends an amount of Frames + * @param huart: UART Emulation handle + * @param pData: Frame to be sent + * @retval None + */ +static void UART_Emul_TransmitFrame(UART_Emul_HandleTypeDef *huart) +{ + uint32_t tmp_sr = 0; + uint32_t tmp_ds = 0; + uint32_t tmp_size = 0; + + + if ((huart_emul->TxXferCount % 2 ) != 0) + { + tmp_sr = (uint32_t)pFirstBuffer_Tx; + } + else + { + tmp_sr = (uint32_t)pSecondBuffer_Tx; + } + + tmp_ds = (uint32_t) & ((huart->TxPortName)->BSRR); + + tmp_size = __HAL_UART_EMUL_FRAME_LENGTH(huart); + +#if defined (STM32F0xx) || defined (STM32F3xx) + /* Configure DMA Stream data length */ + hdma_rx.Instance->CNDTR = tmp_size; + + /* Configure DMA Stream source address */ + hdma_rx.Instance->CPAR = tmp_sr; + + /* Configure DMA Stream destination address */ + hdma_rx.Instance->CMAR = tmp_ds; +#else + /* Configure DMA Stream data length */ + hdma_tx.Instance->NDTR = tmp_size; + + /* Configure DMA Stream destination address */ + hdma_tx.Instance->PAR = tmp_ds; + + /* Configure DMA Stream source address */ + hdma_tx.Instance->M0AR = tmp_sr; +#endif + + /* Enable the transfer complete interrupt */ + __HAL_DMA_ENABLE_IT(&hdma_tx, DMA_IT_TC); + + /* Enable the transfer Error interrupt */ + __HAL_DMA_ENABLE_IT(&hdma_tx, DMA_IT_TE); + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(&hdma_tx); + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(&TimHandle, TIM_DMA_source_Tx); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(&TimHandle); +} + +/** + * @brief This function is executed in case of Transfer Complete of a Frame. + * @param None + * @retval None + */ +static void UART_Emul_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + uint32_t tmpbuffer = 0; + + /* Incremente Counter of frame */ + huart_emul->TxXferCount++; + + if (huart_emul->TxXferCount <= huart_emul->TxXferSize) + { + /* Call UART Emulation Transmit frame for next Frame */ + UART_Emul_TransmitFrame(huart_emul); + + if ((huart_emul->TxXferCount % 2 ) != 0) + { + tmpbuffer = (uint32_t)pSecondBuffer_Tx; + } + else + { + tmpbuffer = (uint32_t)pFirstBuffer_Tx; + } + /* Format second Data to be sent */ + UART_Emul_TransmitFormatFrame(huart_emul, *(huart_emul->pTxBuffPtr + huart_emul->TxXferCount), (uint32_t*)tmpbuffer); + } + else + { + /* Disable the transfer complete interrupt */ + __HAL_DMA_DISABLE_IT(TimHandle.hdma[TIM_DMA_Handle_Tx], DMA_IT_TC); + + /* Set TC flag in the status register software */ + __HAL_UART_EMUL_SET_FLAG(huart_emul, UART_EMUL_FLAG_TC); + + /* Disable the Peripheral */ + __HAL_DMA_DISABLE(&hdma_tx); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(&TimHandle, TIM_DMA_source_Tx); + + /* De_Initialize counter frame for Tx */ + huart_emul->TxXferCount = 0; + + /* Initialize the UART Emulation state */ + huart_emul->ErrorCode = HAL_UART_EMUL_ERROR_NONE; + + /* Check if a receive process is ongoing or not */ + if (huart_emul->State == HAL_UART_EMUL_STATE_BUSY_TX_RX) + { + huart_emul->State = HAL_UART_EMUL_STATE_BUSY_RX; + } + else + { + huart_emul->State = HAL_UART_EMUL_STATE_READY; + } + /* Handle for UART Emulation Transfer Complete */ + HAL_UART_Emul_TxCpltCallback(huart_emul); + } +} + +/** + * @brief This function is executed in case of error of Transfer occurrence. + * @param hdma : DMA Handle + * @retval None + */ +static void UART_Emul_DMAError(DMA_HandleTypeDef *hdma) +{ + /* UART Emulation frame error occurred */ + __HAL_UART_EMUL_SET_FLAG(huart_emul, UART_EMUL_FLAG_FE); + + huart_emul->ErrorCode |= HAL_UART_EMUL_ERROR_FE; + + HAL_UART_Emul_ErrorCallback(huart_emul); +} + +/** + * @brief Initializes the UART Emulation Transfer Complete. + * @param huart: UART Emulation Handle + * @retval None + */ +__weak void HAL_UART_Emul_TxCpltCallback(UART_Emul_HandleTypeDef *huart) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_UART_Emul_TransferComplete could be implemented in the user file + */ +} + +/** + * @brief UART Emulation error callbacks. + * @param huart: UART Emulation handle + * @retval None + */ +__weak void HAL_UART_Emul_ErrorCallback(UART_Emul_HandleTypeDef *huart) +{ + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_UART_ErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +//#endif /* HAL_UART_EMUL_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ +#endif //TIM1_BASE && UART_EMUL_RX && UART_EMUL_TX +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/hal_uart_emul.h b/cores/arduino/stm32/hal_uart_emul.h new file mode 100644 index 0000000..8046333 --- /dev/null +++ b/cores/arduino/stm32/hal_uart_emul.h @@ -0,0 +1,417 @@ +/** + ****************************************************************************** + * @file hal_uart_emul.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Adaptation from stm32f4xx_hal_uart_emul.h + * Header file of UART Emulation HAL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __HAL_UART_EMUL_H +#define __HAL_UART_EMUL_H + +#if defined(TIM1_BASE) +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup UART_EMUL_HAL_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief UART Emulation Init Structure definition + */ +typedef struct +{ + uint8_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref UART_Emul_Mode */ + + uint32_t BaudRate; /*!< This member configures the UART communication baud rate.*/ + + + uint8_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref UART_Emul_Word_Length */ + + uint8_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref UART_Emul_Stop_Bits */ + + + uint8_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref UART_Emul_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data*/ + + uint16_t RxPinNumber; /*!< Specifies the number of Receiver Pin. + This parameter can be a value of @ref GPIO_pins_define */ + + uint16_t TxPinNumber; /*!< Specifies the number of Transmitter Pin. + his parameter can be a value of @ref GPIO_pins_define */ +}UART_Emul_InitTypeDef; + +/** + * @brief HAL UART Emulation State structures definition + */ +typedef enum +{ + HAL_UART_EMUL_STATE_RESET = 0x00, /*!< Peripheral is not yet Initialized */ + HAL_UART_EMUL_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */ + HAL_UART_EMUL_STATE_BUSY = 0x02, /*!< An internal process is ongoing */ + HAL_UART_EMUL_STATE_BUSY_TX = 0x04, /*!< Data Transmission process is ongoing */ + HAL_UART_EMUL_STATE_BUSY_RX = 0x08, /*!< Data Reception process is ongoing */ + HAL_UART_EMUL_STATE_BUSY_TX_RX = 0x10, /*!< Data Transmission and Reception process is ongoing */ + HAL_UART_EMUL_STATE_ERROR = 0x20 /*!< Error */ + +}HAL_UART_Emul_StateTypeDef; + +/** + * @brief HAL UART Emulation Error Code structure definition + */ +typedef enum +{ + HAL_UART_EMUL_ERROR_NONE = 0x00, /*!< No error */ + HAL_UART_EMUL_ERROR_FE = 0x01, /*!< frame error */ + HAL_UART_EMUL_ERROR_RE = 0x02, /*!< receiver error */ + HAL_UART_EMUL_ERROR_PE = 0x04 /*!< transfer error */ +}HAL_UART_Emul_ErrorTypeDef; + +/** + * @brief Universal Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint8_t SR; /*!< UART Emulation Status register software */ + +} UART_Emul_TypeDef; + +/** + * @brief UART Emulation handle Structure definition + */ +typedef struct +{ + UART_Emul_TypeDef Instance; /* Instance for UART Emulation register */ + + UART_Emul_InitTypeDef Init; /* UART Emulation communication parameters */ + + uint8_t *pTxBuffPtr; /* Pointer to UART Emulation Tx transfer Buffer */ + + uint16_t TxXferSize; /* UART Emulation Tx Transfer size */ + + uint16_t TxXferCount; /* UART Emulation Tx Transfer Counter */ + + uint8_t *pRxBuffPtr; /* Pointer to UART Emulation Rx transfer Buffer */ + + uint16_t RxXferSize; /* UART Emulation Rx Transfer size */ + + uint16_t RxXferCount; /* UART Emulation Rx Transfer Counter */ + + GPIO_TypeDef *RxPortName; /* UART Emulation Rx port name */ + + GPIO_TypeDef *TxPortName; /* UART Emulation Tx port name */ + + __IO HAL_UART_Emul_StateTypeDef State; /* UART Emulation communication state */ + + __IO HAL_UART_Emul_ErrorTypeDef ErrorCode; /* UART Emulation Error code */ + +}UART_Emul_HandleTypeDef; + + + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UART_Emulation_Exported_Constants + * @{ + */ + +/** @defgroup UART_Emul_Word_Length + * @{ + */ + +#define UART_EMUL_WORDLENGTH_5B ((uint8_t)0x05) +#define UART_EMUL_WORDLENGTH_6B ((uint8_t)0x06) +#define UART_EMUL_WORDLENGTH_7B ((uint8_t)0x07) +#define UART_EMUL_WORDLENGTH_8B ((uint8_t)0x08) +#define UART_EMUL_WORDLENGTH_9B ((uint8_t)0x09) +#define IS_UART_EMUL_WORD_LENGTH(LENGTH) (((LENGTH) == UART_EMUL_WORDLENGTH_5B)||\ + ((LENGTH) == UART_EMUL_WORDLENGTH_6B)||\ + ((LENGTH) == UART_EMUL_WORDLENGTH_7B)||\ + ((LENGTH) == UART_EMUL_WORDLENGTH_8B)||\ + ((LENGTH) == UART_EMUL_WORDLENGTH_9B)) +/** + * @} + */ + +/** @defgroup UART_Emul_Stop_Bits + * @{ + */ +#define UART_EMUL_STOPBITS_1 ((uint8_t)0x01) +#define UART_EMUL_STOPBITS_2 ((uint8_t)0x02) +#define IS_UART_EMUL_STOPBITS(STOPBITS) (((STOPBITS) == UART_EMUL_STOPBITS_1)||\ + ((STOPBITS) == UART_EMUL_STOPBITS_2)) + +/** + * @} + */ + +/** @defgroup UART_Emul_Parity + * @{ + */ +#define UART_EMUL_PARITY_NONE ((uint8_t)0x00) +#define UART_EMUL_PARITY_EVEN ((uint8_t)0x01) +#define UART_EMUL_PARITY_ODD ((uint8_t)0x02) +#define IS_UART_EMUL_PARITY(PARITY) (((PARITY) == UART_EMUL_PARITY_NONE) || \ + ((PARITY) == UART_EMUL_PARITY_EVEN) || \ + ((PARITY) == UART_EMUL_PARITY_ODD)) +/** + * @} + */ + +/** @defgroup UART_Emul_Mode + * @{ + */ +#define UART_EMUL_MODE_RX ((uint8_t)0x01) +#define UART_EMUL_MODE_TX ((uint8_t)0x02) +#define UART_EMUL_MODE_TX_RX ((uint8_t)0x03) +#define IS_UART_EMUL_MODE(MODE) (((MODE) == UART_EMUL_MODE_RX) || \ + ((MODE) == UART_EMUL_MODE_TX ) || \ + ((MODE) == UART_EMUL_MODE_TX_RX )) +/** + * @} + */ + +/** @defgroup UART_Emul_Flags + * Elements values convention: 0xXX + * - 0xXX : Flag mask in the SR register software + * @{ + */ +#define UART_EMUL_FLAG_RC ((uint8_t)0x01) +#define UART_EMUL_FLAG_TC ((uint8_t)0x02) +#define UART_EMUL_FLAG_FE ((uint8_t)0x04) +#define UART_EMUL_FLAG_PE ((uint8_t)0x08) + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup Baudrate_Constants + * @{ + */ + +/** + * + */ +#define BAUDRATE_4800 ((uint32_t)0x12C0) /* Baudrate Selection 4800 */ +#define BAUDRATE_9600 ((uint32_t)0x2580) /* Baudrate Selection 9600 */ +#define BAUDRATE_14400 ((uint32_t)0x3840) /* Baudrate Selection 14400 */ +#define BAUDRATE_19200 ((uint32_t)0x4b00) /* Baudrate Selection 19200 */ +#define BAUDRATE_38400 ((uint32_t)0x9600) /* Baudrate Selection 38400 */ +#define BAUDRATE_57600 ((uint32_t)0xE100) /* Baudrate Selection 57600 */ +#define BAUDRATE_115200 ((uint32_t)0x1C200) /* Baudrate Selection 115200 */ +#define IS_UART_EMUL_BAUDRATE(BaudRate) (((BaudRate) == BAUDRATE_4800 ) || \ + ((BaudRate) == BAUDRATE_9600 ) || \ + ((BaudRate) == BAUDRATE_14400 ) || \ + ((BaudRate) == BAUDRATE_19200 ) || \ + ((BaudRate) == BAUDRATE_38400 ) || \ + ((BaudRate) == BAUDRATE_57600 ) || \ + ((BaudRate) == BAUDRATE_115200)) +/** + * @} + */ + + /** @defgroup UART Emulation constant + * @{ + */ + +#define FIRST_BYTE ((uint8_t)0x01) +#define BitMask ((uint8_t)0x01) +#define RX_BUFFER_SIZE ((uint8_t)0x0C) +#define TX_BUFFER_SIZE ((uint8_t)0x0C) + +/* Definition Handler for UART Emulation receive mode */ + +#ifdef STM32F0xx +#define UART_EMUL_TX_DMA_IRQHandler DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler +#define UART_EMUL_RX_DMA_IRQHandler DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler + +#define UART_EMUL_TX_DMA_IRQn DMA1_Ch2_3_DMA2_Ch1_2_IRQn +#define UART_EMUL_RX_DMA_IRQn DMA1_Ch4_7_DMA2_Ch3_5_IRQn +#elif defined(STM32F3xx) +#define UART_EMUL_TX_DMA_IRQHandler DMA2_Channel1_IRQHandler +#define UART_EMUL_RX_DMA_IRQHandler DMA2_Channel3_IRQHandler + +#define UART_EMUL_TX_DMA_IRQn DMA2_Channel1_IRQn +#define UART_EMUL_RX_DMA_IRQn DMA2_Channel3_IRQn +#elif defined(STM32F4xx) +#define UART_EMUL_TX_DMA_IRQHandler DMA2_Stream1_IRQHandler +#define UART_EMUL_RX_DMA_IRQHandler DMA2_Stream2_IRQHandler + +#define UART_EMUL_TX_DMA_IRQn DMA2_Stream1_IRQn +#define UART_EMUL_RX_DMA_IRQn DMA2_Stream2_IRQn +#endif + +/* Defenition of UART Emulation timer */ +#define UART_EMUL_TX_TIMER_INSTANCE TIM1 +#define UART_EMUL_RX_TIMER_INSTANCE TIM1 + +#define TIM_DMA_Handle_Tx TIM_DMA_ID_CC1 +#define TIM_DMA_Handle_Rx TIM_DMA_ID_CC2 + +#define TIM_Channel_Tx TIM_CHANNEL_1 +#define TIM_Channel_Rx TIM_CHANNEL_2 + +#define TIM_DMA_source_Tx TIM_DMA_CC1 +#define TIM_DMA_source_Rx TIM_DMA_CC2 + +#ifdef STM32F4xx +#define DMA_Channel_Tx DMA_CHANNEL_6 +#define DMA_Channel_Rx DMA_CHANNEL_6 +#endif + +#ifdef DMA2_Stream1 +#define DMA_Stream_Tx DMA2_Stream1 +#define DMA_Stream_Rx DMA2_Stream2 +#else +#define DMA_Stream_Tx DMA2_Channel1 +#define DMA_Stream_Rx DMA2_Channel3 +#endif +/* Exported macro ------------------------------------------------------------*/ + +/** @brief Checks whether the specified UART Emulation flag is set or not. + * @param __HANDLE__: specifies the UART Emulation Handle. + * @param __FLAG__: specifies the flag to check. + * This parameter can be one of the following values: + * @arg UART_EMUL_FLAG_RC: Receiver Complete flag + * @arg UART_EMUL_FLAG_TC: Transmission Complete flag + * @arg UART_EMUL_FLAG_FE: Framing Error flag + * @arg UART_EMUL_FLAG_PE: Parity Error flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_UART_EMUL_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance.SR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clears the specified UART Emulation flag. + * @param __HANDLE__: specifies the UART Emulation Handle. + * + * @param __FLAG__: specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg UART_EMUL_FLAG_RC : Receiver Complet. + * @arg UART_EMUL_FLAG_TC : Transmitter Complet. + * @arg UART_EMUL_FLAG_FE : Frame Error. + * @arg UART_EMUL_FLAG_PE : Parity Error. + * + * @retval None + */ +#define __HAL_UART_EMUL_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance.SR &= ~(__FLAG__)) + +/** @brief Set the specified UART Emulation flag. + * @param __HANDLE__: specifies the UART Emulation Handle. + * + * @param __FLAG__: specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg UART_EMUL_FLAG_RC : Receiver Complete. + * @arg UART_EMUL_FLAG_TC : Transmitter Complete. + * @arg UART_EMUL_FLAG_FE : Frame Error. + * @arg UART_EMUL_FLAG_PE : Parity Error. + * + * @retval None + */ +#define __HAL_UART_EMUL_SET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance.SR |= (__FLAG__)) + +/** @brief Determinate the length for the frame . + * @param __HANDLE__: specifies the UART Emulation Handle. + * @param None + * @retval None + */ +#define __HAL_UART_EMUL_FRAME_LENGTH(__HANDLE__) (uint16_t)((__HANDLE__)->Init.WordLength + (__HANDLE__)->Init.StopBits + 1) + +/** @brief Enable the clock for UART Emulation. + * clock in the peripherique used in this driver Timer and DMA + * @param None + * @retval None + */ +#define __UART_EMUL_CLK_ENABLE() __TIM1_CLK_ENABLE();\ + __HAL_RCC_DMA2_CLK_ENABLE(); + +/** @brief Disable the clock for UART Emulation. + * clock in the peripherique used in this emulation Timer and DMA + * @param None + * @retval None + */ +#define __UART_EMUL_CLK_DISABLE() __TIM1_CLK_DISABLE();\ + __HAL_RCC_DMA2_CLK_DISABLE(); + + +/* Exported functions --------------------------------------------------------*/ +/* Initialization/de-initialization functions **********************************/ +HAL_StatusTypeDef HAL_UART_Emul_Init(UART_Emul_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_Emul_DeInit(UART_Emul_HandleTypeDef *huart); +void HAL_UART_Emul_MspInit(UART_Emul_HandleTypeDef *huart); +void HAL_UART_Emul_MspDeInit(UART_Emul_HandleTypeDef *huart); + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_UART_Emul_Transmit_DMA(UART_Emul_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Emul_Receive_DMA(UART_Emul_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +void HAL_UART_Emul_IRQHandler(UART_Emul_HandleTypeDef *huart); +void HAL_UART_Emul_RxCpltCallback(UART_Emul_HandleTypeDef *huart); +void HAL_UART_Emul_TxCpltCallback(UART_Emul_HandleTypeDef *huart); +void HAL_UART_Emul_ErrorCallback(UART_Emul_HandleTypeDef *huart); +void UART_EMUL_EXTI_RX(void); + +/* Peripheral State functions **************************************************/ +HAL_UART_Emul_StateTypeDef HAL_UART_Emul_GetState(UART_Emul_HandleTypeDef *huart); +uint32_t HAL_UART_Emul_GetError(UART_Emul_HandleTypeDef *huart); +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif +#endif //TIM1_BASE +#endif /* __HAL_UART_EMUL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/hw_config.c b/cores/arduino/stm32/hw_config.c new file mode 100644 index 0000000..df772fb --- /dev/null +++ b/cores/arduino/stm32/hw_config.c @@ -0,0 +1,250 @@ +/** + ****************************************************************************** + * @file hw_config.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide some hw interface for the Arduino interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "hw_config.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + + /** + * @brief CPU L1-Cache enable. + * @param None + * @retval None + */ +__weak void CPU_CACHE_Enable(void) +{ + /* NOTE : could be implemented in the variant if supported + */ +} + + +/** + * @brief This function performs the global init of the system (HAL, IOs...) + * @param None + * @retval None + */ +void hw_config_init(void) +{ + /* Enable the CPU Cache */ + CPU_CACHE_Enable(); + + /* Initialize the HAL*/ + HAL_Init(); + + /* Configure the system clock */ + SystemClock_Config(); +} + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ + +/** +* @brief This function handles Non maskable interrupt. +*/ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ + +} + +/** +* @brief This function handles Hard fault interrupt. +*/ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + } + /* USER CODE BEGIN HardFault_IRQn 1 */ + + /* USER CODE END HardFault_IRQn 1 */ +} + +/** +* @brief This function handles Memory management fault. +*/ +void MemManage_Handler(void) +{ + + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + } + /* USER CODE BEGIN MemoryManagement_IRQn 1 */ + + /* USER CODE END MemoryManagement_IRQn 1 */ +} + +/** +* @brief This function handles Pre-fetch fault, memory access fault. +*/ +void BusFault_Handler(void) +{ + + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + } + /* USER CODE BEGIN BusFault_IRQn 1 */ + + /* USER CODE END BusFault_IRQn 1 */ +} + +/** +* @brief This function handles Undefined instruction or illegal state. +*/ +void UsageFault_Handler(void) +{ + + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + } + /* USER CODE BEGIN UsageFault_IRQn 1 */ + + /* USER CODE END UsageFault_IRQn 1 */ +} + +/** +* @brief This function handles Debug monitor. +*/ +void DebugMon_Handler(void) +{ + + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + while (1) + { + } + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/stm32f4xx_it.h b/cores/arduino/stm32/hw_config.h similarity index 87% rename from variants/otto/usb/stm32f4xx_it.h rename to cores/arduino/stm32/hw_config.h index f89c960..688f8bb 100644 --- a/variants/otto/usb/stm32f4xx_it.h +++ b/cores/arduino/stm32/hw_config.h @@ -1,10 +1,14 @@ /** ****************************************************************************** - * @file stm32f4xx_it.h - * @brief This file contains the headers of the interrupt handlers. + * @file hw_config.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for hw_config module ****************************************************************************** + * @attention * - * COPYRIGHT(c) 2016 STMicroelectronics + *

© COPYRIGHT(c) 2016 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -32,26 +36,27 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H +#ifndef __HW_CONFIG_H +#define __HW_CONFIG_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" #ifdef __cplusplus extern "C" { #endif -/* Includes ------------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ -void SysTick_Handler(void); -void OTG_FS_IRQHandler(void); +void hw_config_init(void); #ifdef __cplusplus } #endif -#endif /* __STM32F4xx_IT_H */ +#endif /* __HW_CONFIG_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/interrupt.c b/cores/arduino/stm32/interrupt.c new file mode 100644 index 0000000..b46b7c5 --- /dev/null +++ b/cores/arduino/stm32/interrupt.c @@ -0,0 +1,368 @@ +/** + ****************************************************************************** + * @file interrupt.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide an interface to enable/disable interruptions + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_def.h" +#include "hw_config.h" +#include "interrupt.h" + +#ifdef __cplusplus + extern "C" { +#endif +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/*As we can have only one interrupt/pin id, don't need to get the port info*/ +typedef struct { + uint32_t pin; + uint32_t irqnb; + void (*callback)(void); + uint32_t mode; +}gpio_irq_conf_str; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ +#define NB_EXTI (16) +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +static gpio_irq_conf_str gpio_irq_conf[NB_EXTI] = { +#if defined (STM32F0xx) || defined (STM32L0xx) + {.pin = GPIO_PIN_0, .irqnb = EXTI0_1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_1, .irqnb = EXTI0_1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_2, .irqnb = EXTI2_3_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_3, .irqnb = EXTI2_3_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_4, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_5, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_6, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_7, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_8, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_9, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_10, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_11, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_12, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_13, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_14, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_15, .irqnb = EXTI4_15_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING} +#else + {.pin = GPIO_PIN_0, .irqnb = EXTI0_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_1, .irqnb = EXTI1_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_2, .irqnb = EXTI2_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_3, .irqnb = EXTI3_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_4, .irqnb = EXTI4_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_5, .irqnb = EXTI9_5_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_6, .irqnb = EXTI9_5_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_7, .irqnb = EXTI9_5_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_8, .irqnb = EXTI9_5_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_9, .irqnb = EXTI9_5_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_10, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_11, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_12, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_13, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_14, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING}, + {.pin = GPIO_PIN_15, .irqnb = EXTI15_10_IRQn, .callback = NULL, .mode = GPIO_MODE_IT_RISING} +#endif +}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +static uint8_t get_pin_id(uint16_t pin); + +/** + * @} + */ +/** + * @brief This function returns the pin ID function of the HAL PIN definition + * @param pin : one of the gpio pin + * @retval None + */ +uint8_t get_pin_id(uint16_t pin) +{ + uint8_t id = 0; + + while(pin != 0x0001) { + pin=pin>>1; + id++; + } + + return id; +} +/** + * @brief This function enable the interruption on the selected port/pin + * @param port : one of the gpio port + * @param pin : one of the gpio pin + **@param callback : callback to call when the interrupt falls + * @param mode : one of the supported interrupt mode defined in stm32_hal_gpio + * @retval None + */ +void stm32_interrupt_enable(GPIO_TypeDef *port, uint16_t pin, void (*callback)(void), uint32_t mode) +{ + GPIO_InitTypeDef GPIO_InitStruct; + uint32_t pull; + uint8_t id = get_pin_id(pin); + // GPIO pin configuration + GPIO_InitStruct.Pin = pin; + GPIO_InitStruct.Mode = mode; + + //read the pull mode directly in the register as no function exists to get it. + //Do it in case the user already defines the IO through the digital io + //interface + pull = port->PUPDR; +#ifdef GPIO_PUPDR_PUPD0 + pull &=(GPIO_PUPDR_PUPD0<<(id*2)); + GPIO_InitStruct.Pull = (GPIO_PUPDR_PUPD0 & (pull>>(id*2))); +#else + pull &=(GPIO_PUPDR_PUPDR0<<(id*2)); + GPIO_InitStruct.Pull = (GPIO_PUPDR_PUPDR0 & (pull>>(id*2))); +#endif + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + + HAL_GPIO_Init(port, &GPIO_InitStruct); + + gpio_irq_conf[id].callback = callback; + + // Enable and set Button EXTI Interrupt to the lowest priority + HAL_NVIC_SetPriority(gpio_irq_conf[id].irqnb, 0x06, 0); + HAL_NVIC_EnableIRQ(gpio_irq_conf[id].irqnb); +} + +/** + * @brief This function disable the interruption on the selected port/pin + * @param port : one of the gpio port + * @param pin : one of the gpio pin + * @retval None + */ +void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin) +{ + uint8_t id = get_pin_id(pin); + gpio_irq_conf[id].callback = NULL; + + for(int i = 0; i < NB_EXTI; i++) { + if (gpio_irq_conf[id].irqnb == gpio_irq_conf[i].irqnb + && gpio_irq_conf[i].callback != NULL) { + return; + } + } + HAL_NVIC_DisableIRQ(gpio_irq_conf[id].irqnb); +} + +/** + * @brief This function his called by the HAL if the IRQ is valid + * @param GPIO_Pin : one of the gpio pin + * @retval None + */ +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + uint8_t irq_id = get_pin_id(GPIO_Pin); + + if(gpio_irq_conf[irq_id].callback != NULL) { + gpio_irq_conf[irq_id].callback(); + } +} + +#if defined (STM32F0xx) || defined (STM32L0xx) +/** + * @brief This function handles external line 0 to 1 interrupt request. + * @param None + * @retval None + */ +void EXTI0_1_IRQHandler(void) +{ + uint32_t pin; + for(pin = GPIO_PIN_0; pin <= GPIO_PIN_1; pin=pin<<1) { + HAL_GPIO_EXTI_IRQHandler(pin); + } +} + + +/** + * @brief This function handles external line 2 to 3 interrupt request. + * @param None + * @retval None + */ +void EXTI2_3_IRQHandler(void) +{ + uint32_t pin; + for(pin = GPIO_PIN_2; pin <= GPIO_PIN_3; pin=pin<<1) { + HAL_GPIO_EXTI_IRQHandler(pin); + } +} + +/** + * @brief This function handles external line 4 to 15 interrupt request. + * @param None + * @retval None + */ +void EXTI4_15_IRQHandler(void) +{ + uint32_t pin; + for(pin = GPIO_PIN_4; pin <= GPIO_PIN_15; pin=pin<<1) { + HAL_GPIO_EXTI_IRQHandler(pin); + } +} +#else +/** + * @brief This function handles external line 0 interrupt request. + * @param None + * @retval None + */ +void EXTI0_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); +} + +/** + * @brief This function handles external line 1 interrupt request. + * @param None + * @retval None + */ +void EXTI1_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); +} + +/** + * @brief This function handles external line 2 interrupt request. + * @param None + * @retval None + */ +void EXTI2_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); +} + +/** + * @brief This function handles external line 3 interrupt request. + * @param None + * @retval None + */ +void EXTI3_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); +} + +/** + * @brief This function handles external line 4 interrupt request. + * @param None + * @retval None + */ +void EXTI4_IRQHandler(void) +{ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); +} + + +/** + * @brief This function handles external line 5 to 9 interrupt request. + * @param None + * @retval None + */ +void EXTI9_5_IRQHandler(void) +{ + uint32_t pin; + for(pin = GPIO_PIN_5; pin <= GPIO_PIN_9; pin=pin<<1) { + HAL_GPIO_EXTI_IRQHandler(pin); + } +} + +/** + * @brief This function handles external line 10 to 15 interrupt request. + * @param None + * @retval None + */ +void EXTI15_10_IRQHandler(void) +{ + uint32_t pin; + for(pin = GPIO_PIN_10; pin <= GPIO_PIN_15; pin=pin<<1) { + HAL_GPIO_EXTI_IRQHandler(pin); + } +} +#endif +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/interrupt.h b/cores/arduino/stm32/interrupt.h new file mode 100644 index 0000000..29ab3cb --- /dev/null +++ b/cores/arduino/stm32/interrupt.h @@ -0,0 +1,62 @@ +/** + ****************************************************************************** + * @file interrupt.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for interrupt module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __INTERRUPT_H +#define __INTERRUPT_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PinNames.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void stm32_interrupt_enable(GPIO_TypeDef *port, uint16_t pin, void (*callback)(void), uint32_t mode); +void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin); +#ifdef __cplusplus +} +#endif + +#endif /* __INTERRUPT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/pinmap.c b/cores/arduino/stm32/pinmap.c new file mode 100644 index 0000000..97bd937 --- /dev/null +++ b/cores/arduino/stm32/pinmap.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2006-2013 ARM Limited + * + * 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. + */ +//Based on mbed-os/hal/mbed_pinmap_common.c + +#include "pinmap.h" + +uint32_t pinmap_find_peripheral(PinName pin, const PinMap* map) { + while (map->pin != NC) { + if (map->pin == pin) + return map->peripheral; + map++; + } + return (uint32_t)NC; +} + +uint32_t pinmap_peripheral(PinName pin, const PinMap* map) { + uint32_t peripheral = (uint32_t)NC; + + if (pin == (PinName)NC) + return (uint32_t)NC; + peripheral = pinmap_find_peripheral(pin, map); + //if ((uint32_t)NC == peripheral) // no mapping available + // error("pinmap not found for peripheral"); + return peripheral; +} + +uint32_t pinmap_find_function(PinName pin, const PinMap* map) { + while (map->pin != NC) { + if (map->pin == pin) + return map->function; + map++; + } + return (uint32_t)NC; +} + +uint32_t pinmap_function(PinName pin, const PinMap* map) { + uint32_t function = (uint32_t)NC; + + if (pin == (PinName)NC) + return (uint32_t)NC; + function = pinmap_find_function(pin, map); + //if ((uint32_t)NC == function) // no mapping available + // error("pinmap not found for function"); + return function; +} + +bool pin_in_pinmap(PinName pin, const PinMap* map) { + if (pin != (PinName)NC) { + while (map->pin != NC) { + if (map->pin == pin) + return true; + map++; + } + } + return false; +} + +uint32_t pinmap_merge(uint32_t a, uint32_t b) { + // both are the same (inc both NC) + if (a == b) + return a; + + // one (or both) is not connected + if (a == (uint32_t)NC) + return b; + if (b == (uint32_t)NC) + return a; + + // mis-match error case + // error("pinmap mis-match"); + return (uint32_t)NC; +} + +uint32_t timermap_irq(TIM_TypeDef *tim, const TimerMap* map) { + while (map->timer != NULL) { + if (map->timer == tim) + return map->irq; + map++; + } + return (uint32_t)0; +} + +uint32_t timermap_clkSrc(TIM_TypeDef *tim, const TimerMap* map) { + while (map->timer != NULL) { + if (map->timer == tim) + return map->clk_src; + map++; + } + return (uint32_t)0; +} diff --git a/cores/arduino/stm32/pinmap.h b/cores/arduino/stm32/pinmap.h new file mode 100644 index 0000000..42f43c7 --- /dev/null +++ b/cores/arduino/stm32/pinmap.h @@ -0,0 +1,60 @@ + +/** \addtogroup hal */ +/** @{*/ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * 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 _PINMAP_H +#define _PINMAP_H + +#include "PinNames.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PinName pin; + int peripheral; + int function; +} PinMap; + +typedef struct { + TIM_TypeDef *timer; + IRQn_Type irq; + uint8_t clk_src; +} TimerMap; + +bool pin_in_pinmap(PinName pin, const PinMap* map); +void pin_function(PinName pin, int function); + +uint32_t pinmap_peripheral(PinName pin, const PinMap* map); +uint32_t pinmap_function(PinName pin, const PinMap* map); +uint32_t pinmap_find_peripheral(PinName pin, const PinMap* map); +uint32_t pinmap_find_function(PinName pin, const PinMap* map); +uint32_t pinmap_merge(uint32_t a, uint32_t b); + +uint32_t timermap_irq(TIM_TypeDef *tim, const TimerMap* map); +uint32_t timermap_clkSrc(TIM_TypeDef *tim, const TimerMap* map); + +#ifdef __cplusplus +} +#endif + +#endif + +/** @}*/ diff --git a/cores/arduino/stm32/spi_com.c b/cores/arduino/stm32/spi_com.c new file mode 100644 index 0000000..281c2b7 --- /dev/null +++ b/cores/arduino/stm32/spi_com.c @@ -0,0 +1,497 @@ +/** + ****************************************************************************** + * @file spi_com.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide the SPI interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_def.h" +#include "hw_config.h" +#include "spi_com.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ +/** + * @brief return clock freq of an SPI instance + * @param spi_inst : SPI instance + * @retval clock freq of the instance else SystemCoreClock + */ +uint32_t spi_getClkFreqInst(SPI_TypeDef * spi_inst) +{ + uint32_t spi_freq = SystemCoreClock; + +#ifdef STM32F0xx + /* SPIx source CLK is PCKL1 */ + spi_freq = HAL_RCC_GetPCLK1Freq(); +#else + if(spi_inst != (SPI_TypeDef *)NC) { + /* Get source clock depending on SPI instance */ + switch ((uint32_t)spi_inst) { + case (uint32_t)SPI1: +#if defined SPI4_BASE + case (uint32_t)SPI4: +#endif +#if defined SPI5_BASE + case (uint32_t)SPI5: +#endif +#if defined SPI6_BASE + case (uint32_t)SPI6: +#endif + /* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */ + spi_freq = HAL_RCC_GetPCLK2Freq(); + break; + case (uint32_t)SPI2: +#if defined SPI3_BASE + case (uint32_t)SPI3: +#endif + /* SPI_2 and SPI_3. Source CLK is PCKL1 */ + spi_freq = HAL_RCC_GetPCLK1Freq(); + break; + default: + printf("CLK: SPI instance not set"); + break; + } + } +#endif + return spi_freq; +} + +/** + * @brief return clock freq of an SPI instance + * @param obj : pointer to spi_t structure + * @retval clock freq of the instance else SystemCoreClock + */ +uint32_t spi_getClkFreq(spi_t *obj) +{ + uint32_t spi_inst = NC; + uint32_t spi_freq = SystemCoreClock; + + if(obj != NULL) { + spi_inst = pinmap_peripheral(obj->pin_sclk, PinMap_SPI_SCLK); + + if(spi_inst != NC) { + spi_freq = spi_getClkFreqInst(spi_inst); + } + } + return spi_freq; +} + +/** + * @brief SPI initialization function + * @param obj : pointer to spi_t structure + * @param speed : spi output speed + * @param mode : one of the spi modes + * @param msb : set to 1 in msb first + * @retval None + */ +void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb) +{ + if(obj == NULL) + return; + + SPI_HandleTypeDef *handle = &(obj->handle); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + uint32_t spi_freq = 0; + + // Determine the SPI to use + uint32_t spi_mosi = pinmap_peripheral(obj->pin_mosi, PinMap_SPI_MOSI); + uint32_t spi_miso = pinmap_peripheral(obj->pin_miso, PinMap_SPI_MISO); + uint32_t spi_sclk = pinmap_peripheral(obj->pin_sclk, PinMap_SPI_SCLK); + uint32_t spi_ssel = pinmap_peripheral(obj->pin_ssel, PinMap_SPI_SSEL); + + /* Pins MOSI/MISO/SCLK must not be NC. ssel can be NC. */ + if(spi_mosi == NC || spi_miso == NC || spi_sclk == NC) { + return; + } + + uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso); + uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel); + + obj->spi = (SPI_TypeDef *)pinmap_merge(spi_data, spi_cntl); + + // Are all pins connected to the same SPI instance? + if(obj->spi == (SPI_TypeDef *)NC) { + printf("ERROR: SPI pins mismatch\n"); + return; + } + + // Configure the SPI pins + if (obj->pin_ssel != NC) { + handle->Init.NSS = SPI_NSS_HARD_OUTPUT; + } else { + handle->Init.NSS = SPI_NSS_SOFT; + } + + /* Fill default value */ + handle->Instance = obj->spi; + handle->Init.Mode = SPI_MODE_MASTER; + + spi_freq = spi_getClkFreqInst(obj->spi); + if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV2_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + } else if(speed >= (spi_freq/SPI_SPEED_CLOCK_DIV4_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV8_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV16_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV32_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV64_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV128_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + } else if (speed >= (spi_freq/SPI_SPEED_CLOCK_DIV256_MHZ)) { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; + } else { + handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + } + + handle->Init.Direction = SPI_DIRECTION_2LINES; + + if((mode == SPI_MODE_0)||(mode == SPI_MODE_2)) { + handle->Init.CLKPhase = SPI_PHASE_1EDGE; + } else { + handle->Init.CLKPhase = SPI_PHASE_2EDGE; + } + + if((mode == SPI_MODE_0)||(mode == SPI_MODE_1)) { + handle->Init.CLKPolarity = SPI_POLARITY_LOW; + } else { + handle->Init.CLKPolarity = SPI_POLARITY_HIGH; + } + + handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; + handle->Init.CRCPolynomial = 7; + handle->Init.DataSize = SPI_DATASIZE_8BIT; + + if(msb == 0) { + handle->Init.FirstBit = SPI_FIRSTBIT_LSB; + } else { + handle->Init.FirstBit = SPI_FIRSTBIT_MSB; + } + + handle->Init.TIMode = SPI_TIMODE_DISABLED; + + if(obj->pin_mosi != NC) { + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_mosi)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_mosi); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI)); + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_mosi,PinMap_SPI_MOSI)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + } + + if(obj->pin_miso != NC) { + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_miso)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_miso); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_miso,PinMap_SPI_MISO)); + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_miso,PinMap_SPI_MISO)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_miso,PinMap_SPI_MISO)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + } + + if(obj->pin_sclk != NC) { + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_sclk)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_sclk); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_sclk,PinMap_SPI_SCLK)); + /* + * According the STM32 Datasheet for SPI peripheral we need to PULLDOWN + * or PULLUP the SCK pin according the polarity used. + */ + if(handle->Init.CLKPolarity == SPI_POLARITY_LOW) { + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + } else { + GPIO_InitStruct.Pull = GPIO_PULLUP; + } + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_sclk,PinMap_SPI_SCLK)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + } + + if(obj->pin_ssel != NC) { + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_ssel)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_ssel); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL)); + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_ssel,PinMap_SPI_SSEL)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + } + +#if defined SPI1_BASE + // Enable SPI clock + if (handle->Instance == SPI1) { + __HAL_RCC_SPI1_CLK_ENABLE(); + } +#endif + +#if defined SPI2_BASE + if (handle->Instance == SPI2) { + __HAL_RCC_SPI2_CLK_ENABLE(); + } +#endif + +#if defined SPI3_BASE + if (handle->Instance == SPI3) { + __HAL_RCC_SPI3_CLK_ENABLE(); + } +#endif + +#if defined SPI4_BASE + if (handle->Instance == SPI4) { + __HAL_RCC_SPI4_CLK_ENABLE(); + } +#endif + +#if defined SPI5_BASE + if (handle->Instance == SPI5) { + __HAL_RCC_SPI5_CLK_ENABLE(); + } +#endif + +#if defined SPI6_BASE + if (handle->Instance == SPI6) { + __HAL_RCC_SPI6_CLK_ENABLE(); + } +#endif + + HAL_SPI_Init(handle); + + /* In order to set correctly the SPI polarity we need to enable the peripheral */ + __HAL_SPI_ENABLE(handle); +} + +/** + * @brief This function is implemented to deinitialize the SPI interface + * (IOs + SPI block) + * @param obj : pointer to spi_t structure + * @retval None + */ +void spi_deinit(spi_t *obj) +{ + if(obj == NULL) + return; + + SPI_HandleTypeDef *handle = &(obj->handle); + + HAL_SPI_DeInit(handle); + +#if defined SPI1_BASE + // Reset SPI and disable clock + if (handle->Instance == SPI1) { + __HAL_RCC_SPI1_FORCE_RESET(); + __HAL_RCC_SPI1_RELEASE_RESET(); + __HAL_RCC_SPI1_CLK_DISABLE(); + } +#endif +#if defined SPI2_BASE + if (handle->Instance == SPI2) { + __HAL_RCC_SPI2_FORCE_RESET(); + __HAL_RCC_SPI2_RELEASE_RESET(); + __HAL_RCC_SPI2_CLK_DISABLE(); + } +#endif + +#if defined SPI3_BASE + if (handle->Instance == SPI3) { + __HAL_RCC_SPI3_FORCE_RESET(); + __HAL_RCC_SPI3_RELEASE_RESET(); + __HAL_RCC_SPI3_CLK_DISABLE(); + } +#endif + +#if defined SPI4_BASE + if (handle->Instance == SPI4) { + __HAL_RCC_SPI4_FORCE_RESET(); + __HAL_RCC_SPI4_RELEASE_RESET(); + __HAL_RCC_SPI4_CLK_DISABLE(); + } +#endif + +#if defined SPI5_BASE + if (handle->Instance == SPI5) { + __HAL_RCC_SPI5_FORCE_RESET(); + __HAL_RCC_SPI5_RELEASE_RESET(); + __HAL_RCC_SPI5_CLK_DISABLE(); + } +#endif + +#if defined SPI6_BASE + if (handle->Instance == SPI6) { + __HAL_RCC_SPI6_FORCE_RESET(); + __HAL_RCC_SPI6_RELEASE_RESET(); + __HAL_RCC_SPI6_CLK_DISABLE(); + } +#endif +} + +/** + * @brief This function is implemented by user to send data over SPI interface + * @param obj : pointer to spi_t structure + * @param Data : data to be sent + * @param len : length in bytes of the data to be sent + * @param Timeout: Timeout duration in tick + * @retval status of the send operation (0) in case of error + */ +spi_status_e spi_send(spi_t *obj, uint8_t *Data, uint16_t len, uint32_t Timeout) +{ + spi_status_e ret = SPI_OK; + HAL_StatusTypeDef hal_status; + + if((obj == NULL) || (len == 0)) { + return SPI_ERROR; + } + + hal_status = HAL_SPI_Transmit(&(obj->handle), Data, len, Timeout); + + if(hal_status == HAL_TIMEOUT) { + ret = SPI_TIMEOUT; + } else if(hal_status != HAL_OK) { + ret = SPI_ERROR; + } + + return ret; +} + +/** + * @brief This function is implemented by user to send/receive data over + * SPI interface + * @param obj : pointer to spi_t structure + * @param tx_buffer : tx data to send before reception + * @param rx_buffer : data to receive + * @param len : length in byte of the data to send and receive + * @param Timeout: Timeout duration in tick + * @retval status of the send operation (0) in case of error + */ +spi_status_e spi_transfer(spi_t *obj, uint8_t * tx_buffer, + uint8_t * rx_buffer, uint16_t len, uint32_t Timeout) +{ + spi_status_e ret = SPI_OK; + HAL_StatusTypeDef hal_status; + + if((obj == NULL) || (len == 0)) { + return SPI_ERROR; + } + + hal_status = HAL_SPI_TransmitReceive(&(obj->handle), tx_buffer, rx_buffer, len, Timeout); + + if(hal_status == HAL_TIMEOUT) { + ret = SPI_TIMEOUT; + } else if(hal_status != HAL_OK) { + ret = SPI_ERROR; + } + + return ret; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/spi_com.h b/cores/arduino/stm32/spi_com.h new file mode 100644 index 0000000..8d9e50d --- /dev/null +++ b/cores/arduino/stm32/spi_com.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file spi_com.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for spi module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_COM_H +#define __SPI_COM_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ + +struct spi_s { + SPI_HandleTypeDef handle; + SPI_TypeDef *spi; + PinName pin_miso; + PinName pin_mosi; + PinName pin_sclk; + PinName pin_ssel; +}; + +typedef struct spi_s spi_t; + + +///@brief specifies the SPI speed bus in HZ. +#define SPI_SPEED_CLOCK_DEFAULT 4000000 + +#define SPI_SPEED_CLOCK_DIV2_MHZ ((uint32_t)2) +#define SPI_SPEED_CLOCK_DIV4_MHZ ((uint32_t)4) +#define SPI_SPEED_CLOCK_DIV8_MHZ ((uint32_t)8) +#define SPI_SPEED_CLOCK_DIV16_MHZ ((uint32_t)16) +#define SPI_SPEED_CLOCK_DIV32_MHZ ((uint32_t)32) +#define SPI_SPEED_CLOCK_DIV64_MHZ ((uint32_t)64) +#define SPI_SPEED_CLOCK_DIV128_MHZ ((uint32_t)128) +#define SPI_SPEED_CLOCK_DIV256_MHZ ((uint32_t)256) + +///@brief speficies the SPI mode to use +//Mode Clock Polarity (CPOL) Clock Phase (CPHA) +//SPI_MODE0 0 0 +//SPI_MODE1 0 1 +//SPI_MODE2 1 0 +//SPI_MODE3 1 1 +//enum definitions coming from SPI.h of SAM +typedef enum { + SPI_MODE_0 = 0x00, + SPI_MODE_1 = 0x01, + SPI_MODE_2 = 0x02, + SPI_MODE_3 = 0x03 +}spi_mode_e; + +///@brief SPI errors +typedef enum { + SPI_OK = 0, + SPI_TIMEOUT = 1, + SPI_ERROR = 2 +}spi_status_e; + +/* Exported constants --------------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb); +void spi_deinit(spi_t *obj); +spi_status_e spi_send(spi_t *obj, uint8_t *Data, uint16_t len, uint32_t Timeout); +spi_status_e spi_transfer(spi_t *obj, uint8_t * tx_buffer, + uint8_t * rx_buffer, uint16_t len, uint32_t Timeout); +uint32_t spi_getClkFreq(spi_t *obj); + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_COM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/startup_stm32yyxx.S b/cores/arduino/stm32/startup_stm32yyxx.S new file mode 100644 index 0000000..144772c --- /dev/null +++ b/cores/arduino/stm32/startup_stm32yyxx.S @@ -0,0 +1,25 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#include "stm32_def_build.h" + +#include CMSIS_STARTUP_FILE + diff --git a/cores/arduino/stm32/stm32_def.h b/cores/arduino/stm32/stm32_def.h new file mode 100644 index 0000000..e05d181 --- /dev/null +++ b/cores/arduino/stm32/stm32_def.h @@ -0,0 +1,33 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifndef _STM32_DEF_ +#define _STM32_DEF_ + +#define USE_HAL_DRIVER + +#ifdef STM32F4xx +#include "stm32f4xx.h" +#else +#error "STM32YYxx chip series is not defined in boards.txt." +#endif + +#endif //_STM32_DEF_ diff --git a/cores/arduino/stm32/stm32_def_build.h b/cores/arduino/stm32/stm32_def_build.h new file mode 100644 index 0000000..8d57409 --- /dev/null +++ b/cores/arduino/stm32/stm32_def_build.h @@ -0,0 +1,30 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifndef _STM32_DEF_BUILD_ +#define _STM32_DEF_BUILD_ + +#if defined(STM32F469xx) +#define CMSIS_STARTUP_FILE "startup_stm32f469xx.s" +#else +#error UNKNOWN CHIP +#endif +#endif //_STM32_DEF_BUILD_ diff --git a/cores/arduino/stm32/stm32_eeprom.c b/cores/arduino/stm32/stm32_eeprom.c new file mode 100644 index 0000000..b832568 --- /dev/null +++ b/cores/arduino/stm32/stm32_eeprom.c @@ -0,0 +1,261 @@ +/** + ****************************************************************************** + * @file eeprom.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide emulated eeprom from flash + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_eeprom.h" +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ +// We use the last page of the flash to store data (to prevent code overwrite). +#ifdef STM32F0xx +// Flash base address (Bank2, page 256) +#define FLASH_BASE_ADDRESS 0x0803F800 +#elif defined (STM32F3xx) +#define FLASH_BASE_ADDRESS ((uint32_t)((0x0807FFFF + 1) - FLASH_PAGE_SIZE)) //0x0807F800 +#elif defined (STM32F4xx) +// Use the last 16 page of the second bank (sector 15) +#define FLASH_BASE_ADDRESS ((uint32_t)(0x0810C000)) +#define FLASH_DATA_SECTOR 15 +#elif defined (STM32F7xx) +#define FLASH_BASE_ADDRESS ((uint32_t)(0x08018000)) +#define FLASH_DATA_SECTOR 3 +#elif defined (STM32L0xx) +#define FLASH_BASE_ADDRESS ((uint32_t)(DATA_EEPROM_BASE)) /* 0x08080000 */ +#elif defined (STM32L4xx) +// Flash base address (Bank2, page 256) +#define FLASH_BASE_ADDRESS 0x080FF800 +#define FLASH_PAGE_NUMBER 255 +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +static uint8_t tmpEE[E2END] = {0}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ +void get_data_from_flash(void); +void set_data_to_flash(void); + +/** + * @} + */ + +/** + * @brief Function read a byte from eeprom + * @param __p : address to read + * @retval byte : data read from eeprom + */ +uint8_t eeprom_read_byte(const uint16_t __p) +{ + uint8_t byte = 0; + + get_data_from_flash(); + byte = tmpEE[__p]; + + return byte; +} + +/** + * @brief Function write a byte to eeprom + * @param __p : address to write + * @param __value : value to write + * @retval none + */ +void eeprom_write_byte(uint16_t __p, uint8_t __value) +{ + tmpEE[__p] = __value; + set_data_to_flash(); +} + +/** + * @brief The function read into the flash. + * @param none + * @retval none + */ +void get_data_from_flash(void) +{ + memcpy(tmpEE, (uint8_t*)(FLASH_BASE_ADDRESS), E2END); +} + +/** + * @brief The function write into the flash. + * @param none + * @retval none + */ +void set_data_to_flash(void) +{ + //copy in flash + FLASH_EraseInitTypeDef EraseInitStruct; + uint32_t offset = 0; + uint32_t address = FLASH_BASE_ADDRESS; + uint32_t address_end = FLASH_BASE_ADDRESS + E2END; +#if defined (STM32F0xx) || defined (STM32F3xx) || defined (STM32L0xx) || defined(STM32L4xx) + uint32_t pageError = 0; + uint64_t data = 0; + + // ERASING page + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; +#ifdef STM32L4xx + EraseInitStruct.Banks = FLASH_BANK_2; + EraseInitStruct.Page = FLASH_PAGE_NUMBER; +#else // STM32F4xx + EraseInitStruct.PageAddress = FLASH_BASE_ADDRESS; + EraseInitStruct.NbPages = 1; +#endif + + if(HAL_FLASH_Unlock() == HAL_OK) { +#ifdef STM32L0xx + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGAERR|\ + FLASH_FLAG_SIZERR|FLASH_FLAG_OPTVERR|FLASH_FLAG_RDERR|\ + FLASH_FLAG_FWWERR|FLASH_FLAG_NOTZEROERR); +#elif defined (STM32L4xx) + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); +#else + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR); +#endif + if(HAL_FLASHEx_Erase(&EraseInitStruct, &pageError) == HAL_OK) { + while(address < address_end) { +#ifdef STM32L0xx + memcpy(&data, tmpEE + offset, sizeof(uint32_t)); + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) { + address += 4; + offset += 4; +#else + data = *((uint64_t*)(((uint8_t*)tmpEE + offset))); + + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, data) == HAL_OK) { + address += 8; + offset += 8; +#endif + } else { + address = address_end+1; + } + } + } + HAL_FLASH_Lock(); + } +#else + uint32_t SectorError = 0; + uint32_t data = 0; + + // ERASING page + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; + EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; + EraseInitStruct.Sector = FLASH_DATA_SECTOR; + EraseInitStruct.NbSectors = 1; + + HAL_FLASH_Unlock(); + + if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) == HAL_OK) + { + while(address < address_end) { + memcpy(&data, tmpEE + offset, sizeof(uint32_t)); + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) { + address += 4; + offset += 4; + } else { + address = address_end+1; + } + } + } + HAL_FLASH_Lock(); +#endif +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/stm32f4xx_it.c b/cores/arduino/stm32/stm32_eeprom.h similarity index 56% rename from variants/otto/usb/stm32f4xx_it.c rename to cores/arduino/stm32/stm32_eeprom.h index 64247be..56809a1 100644 --- a/variants/otto/usb/stm32f4xx_it.c +++ b/cores/arduino/stm32/stm32_eeprom.h @@ -1,10 +1,14 @@ /** ****************************************************************************** - * @file stm32f4xx_it.c - * @brief Interrupt Service Routines. + * @file stm32_eeprom.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for eeprom module ****************************************************************************** + * @attention * - * COPYRIGHT(c) 2016 STMicroelectronics + *

© COPYRIGHT(c) 2016 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -30,50 +34,33 @@ * ****************************************************************************** */ -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" -#include "stm32f4xx.h" -#include "stm32f4xx_it.h" -/* USER CODE BEGIN 0 */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_EEPROM_H +#define __STM32_EEPROM_H -/* USER CODE END 0 */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" -/* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd; +#ifdef __cplusplus + extern "C" { +#endif -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +#define FLASH_SECTOR_SIZE ((uint32_t)(16*1024)) //16kB page +#define E2END FLASH_SECTOR_SIZE -/******************************************************************************/ -/* STM32F4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32f4xx.s). */ -/******************************************************************************/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ -/** -* @brief This function handles USB On The Go FS global interrupt. -*/ -void OTG_FS_IRQHandler(void) -{ - /* USER CODE BEGIN OTG_FS_IRQn 0 */ -//while(1); - /* USER CODE END OTG_FS_IRQn 0 */ - //HAL_PCD_IRQHandler(&hpcd); - /* USER CODE BEGIN OTG_FS_IRQn 1 */ +uint8_t eeprom_read_byte(const uint16_t __p); +void eeprom_write_byte(uint16_t __p, uint8_t __value); - /* USER CODE END OTG_FS_IRQn 1 */ +#ifdef __cplusplus } +#endif -/* USER CODE BEGIN 1 */ -/* USB ISR as per vector table */ -void __irq_OTG_FS_IRQHandler(void) -{ - //OTG_FS_IRQHandler(); - HAL_PCD_IRQHandler(&hpcd); -} +#endif /* __STM32_EEPROM_H */ -/* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/system_stm32yyxx.c b/cores/arduino/stm32/system_stm32yyxx.c new file mode 100644 index 0000000..d14a681 --- /dev/null +++ b/cores/arduino/stm32/system_stm32yyxx.c @@ -0,0 +1,49 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ + +#ifdef STM32F0xx +#include "system_stm32f0xx.c" +#endif +#ifdef STM32F1xx +#include "system_stm32f1xx.c" +#endif +#ifdef STM32F2xx +#include "system_stm32f2xx.c" +#endif +#ifdef STM32F3xx +#include "system_stm32f3xx.c" +#endif +#ifdef STM32F4xx +#include "system_stm32f4xx.c" +#endif +#ifdef STM32F7xx +#include "system_stm32f7xx.c" +#endif +#ifdef STM32L0xx +#include "system_stm32l0xx.c" +#endif +#ifdef STM32L1xx +#include "system_stm32l1xx.c" +#endif +#ifdef STM32L4xx +#include "system_stm32l4xx.c" +#endif diff --git a/cores/arduino/stm32/timer.c b/cores/arduino/stm32/timer.c new file mode 100644 index 0000000..c7573b7 --- /dev/null +++ b/cores/arduino/stm32/timer.c @@ -0,0 +1,1011 @@ +/** + ****************************************************************************** + * @file timer.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide timer services + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "stm32_def.h" +#include "hw_config.h" +#include "timer.h" +#include "digital_io.h" +#include "clock.h" +#include "analog.h" +#include "variant.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes +* @{ +*/ +static void HAL_TIMx_PeriodElapsedCallback(stimer_t *obj); + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +#define TIMER_NUM (22) +static TIM_HandleTypeDef* timer_handles[TIMER_NUM] = {NULL}; + + +/** + * @} + */ + +/** + * @brief Enable the timer clock + * @param htim : one of the defined timer + * @retval None + */ +void timer_enable_clock(TIM_HandleTypeDef *htim) +{ +// Enable TIM clock +#if defined(TIM1_BASE) + if (htim->Instance == TIM1){ + __HAL_RCC_TIM1_CLK_ENABLE(); + timer_handles[0] = htim; + } +#endif +#if defined(TIM2_BASE) + if (htim->Instance == TIM2) { + __HAL_RCC_TIM2_CLK_ENABLE(); + timer_handles[1] = htim; + } +#endif +#if defined(TIM3_BASE) + if (htim->Instance == TIM3) { + __HAL_RCC_TIM3_CLK_ENABLE(); + timer_handles[2] = htim; + } +#endif +#if defined(TIM4_BASE) + if (htim->Instance == TIM4) { + __HAL_RCC_TIM4_CLK_ENABLE(); + timer_handles[3] = htim; + } +#endif +#if defined(TIM5_BASE) + if (htim->Instance == TIM5) { + __HAL_RCC_TIM5_CLK_ENABLE(); + timer_handles[4] = htim; + } +#endif +#if defined(TIM6_BASE) + if (htim->Instance == TIM6) { + __HAL_RCC_TIM6_CLK_ENABLE(); + timer_handles[5] = htim; + } +#endif +#if defined(TIM7_BASE) + if (htim->Instance == TIM7) { + __HAL_RCC_TIM7_CLK_ENABLE(); + timer_handles[6] = htim; + } +#endif +#if defined(TIM8_BASE) + if (htim->Instance == TIM8) { + __HAL_RCC_TIM8_CLK_ENABLE(); + timer_handles[7] = htim; + } +#endif +#if defined(TIM9_BASE) + if (htim->Instance == TIM9) { + __HAL_RCC_TIM9_CLK_ENABLE(); + timer_handles[8] = htim; + } +#endif +#if defined(TIM10_BASE) + if (htim->Instance == TIM10) { + __HAL_RCC_TIM10_CLK_ENABLE(); + timer_handles[9] = htim; + } +#endif +#if defined(TIM11_BASE) + if (htim->Instance == TIM11) { + __HAL_RCC_TIM11_CLK_ENABLE(); + timer_handles[10] = htim; + } +#endif +#if defined(TIM12_BASE) + if (htim->Instance == TIM12) { + __HAL_RCC_TIM12_CLK_ENABLE(); + timer_handles[11] = htim; + } +#endif +#if defined(TIM13_BASE) + if (htim->Instance == TIM13) { + __HAL_RCC_TIM13_CLK_ENABLE(); + timer_handles[12] = htim; + } +#endif +#if defined(TIM14_BASE) + if (htim->Instance == TIM14) { + __HAL_RCC_TIM14_CLK_ENABLE(); + timer_handles[13] = htim; + } +#endif +#if defined(TIM15_BASE) + if (htim->Instance == TIM15) { + __HAL_RCC_TIM15_CLK_ENABLE(); + timer_handles[14] = htim; + } +#endif +#if defined(TIM16_BASE) + if (htim->Instance == TIM16) { + __HAL_RCC_TIM16_CLK_ENABLE(); + timer_handles[15] = htim; + } +#endif +#if defined(TIM17_BASE) + if (htim->Instance == TIM17) { + __HAL_RCC_TIM17_CLK_ENABLE(); + timer_handles[16] = htim; + } +#endif +#if defined(TIM20_BASE) + if (htim->Instance == TIM20) { + __HAL_RCC_TIM20_CLK_ENABLE(); + timer_handles[19] = htim; + } +#endif +#if defined(TIM21_BASE) + if (htim->Instance == TIM21) { + __HAL_RCC_TIM21_CLK_ENABLE(); + timer_handles[20] = htim; + } +#endif +#if defined(TIM22_BASE) + if (htim->Instance == TIM22) { + __HAL_RCC_TIM22_CLK_ENABLE(); + timer_handles[21] = htim; + } +#endif +} + +/** + * @brief Disable the timer clock + * @param htim : one of the defined timer + * @retval None + */ +void timer_disable_clock(TIM_HandleTypeDef *htim) +{ +// Enable TIM clock +#if defined(TIM1_BASE) + if (htim->Instance == TIM1){ + __HAL_RCC_TIM1_CLK_DISABLE(); + } +#endif +#if defined(TIM2_BASE) + if (htim->Instance == TIM2) { + __HAL_RCC_TIM2_CLK_DISABLE(); + } +#endif +#if defined(TIM3_BASE) + if (htim->Instance == TIM3) { + __HAL_RCC_TIM3_CLK_DISABLE(); + } +#endif +#if defined(TIM4_BASE) + if (htim->Instance == TIM4) { + __HAL_RCC_TIM4_CLK_DISABLE(); + } +#endif +#if defined(TIM5_BASE) + if (htim->Instance == TIM5) { + __HAL_RCC_TIM5_CLK_DISABLE(); + } +#endif +#if defined(TIM6_BASE) + if (htim->Instance == TIM6) { + __HAL_RCC_TIM6_CLK_DISABLE(); + } +#endif +#if defined(TIM7_BASE) + if (htim->Instance == TIM7) { + __HAL_RCC_TIM7_CLK_DISABLE(); + } +#endif +#if defined(TIM8_BASE) + if (htim->Instance == TIM8) { + __HAL_RCC_TIM8_CLK_DISABLE(); + } +#endif +#if defined(TIM9_BASE) + if (htim->Instance == TIM9) { + __HAL_RCC_TIM9_CLK_DISABLE(); + } +#endif +#if defined(TIM10_BASE) + if (htim->Instance == TIM10) { + __HAL_RCC_TIM10_CLK_DISABLE(); + } +#endif +#if defined(TIM11_BASE) + if (htim->Instance == TIM11) { + __HAL_RCC_TIM11_CLK_DISABLE(); + } +#endif +#if defined(TIM12_BASE) + if (htim->Instance == TIM12) { + __HAL_RCC_TIM12_CLK_DISABLE(); + } +#endif +#if defined(TIM13_BASE) + if (htim->Instance == TIM13) { + __HAL_RCC_TIM13_CLK_DISABLE(); + } +#endif +#if defined(TIM14_BASE) + if (htim->Instance == TIM14) { + __HAL_RCC_TIM14_CLK_DISABLE(); + } +#endif +#if defined(TIM15_BASE) + if (htim->Instance == TIM15) { + __HAL_RCC_TIM15_CLK_DISABLE(); + } +#endif +#if defined(TIM16_BASE) + if (htim->Instance == TIM16) { + __HAL_RCC_TIM16_CLK_DISABLE(); + } +#endif +#if defined(TIM17_BASE) + if (htim->Instance == TIM17) { + __HAL_RCC_TIM17_CLK_DISABLE(); + } +#endif +#if defined(TIM20_BASE) + if (htim->Instance == TIM20) { + __HAL_RCC_TIM20_CLK_DISABLE(); + } +#endif +#if defined(TIM21_BASE) + if (htim->Instance == TIM21) { + __HAL_RCC_TIM21_CLK_DISABLE(); + } +#endif +#if defined(TIM22_BASE) + if (htim->Instance == TIM22) { + __HAL_RCC_TIM22_CLK_DISABLE(); + } +#endif +} + +/** + * @brief TIMER Initialization - clock init and nvic init + * @param htim_base : one of the defined timer + * @retval None + */ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base) +{ + timer_enable_clock(htim_base); + + HAL_NVIC_SetPriority(timermap_irq(htim_base->Instance, TimerMap_CONFIG), 15 ,0); + HAL_NVIC_EnableIRQ(timermap_irq(htim_base->Instance, TimerMap_CONFIG)); +} + +/** + * @brief TIMER Deinitialization - clock and nvic + * @param htim_base : one of the defined timer + * @retval None + */ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim_base) +{ + timer_disable_clock(htim_base); + HAL_NVIC_DisableIRQ(timermap_irq(htim_base->Instance, TimerMap_CONFIG)); +} + +/** + * @brief This function will set the timer to the required value + * @param timer_id : timer_id_e + * @param period : Timer period in milliseconds + * @param prescaler : clock divider + * @retval None + */ +void TimerHandleInit(stimer_t *obj, uint16_t period, uint16_t prescaler) +{ + if(obj == NULL) + return; + + TIM_HandleTypeDef *handle = &(obj->handle); + + handle->Instance = obj->timer; + handle->Init.Prescaler = prescaler; + handle->Init.CounterMode = TIM_COUNTERMODE_UP; + handle->Init.Period = period; + handle->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; +#ifndef STM32L0xx + handle->Init.RepetitionCounter = 0x0000; +#endif + if(HAL_TIM_Base_Init(handle) != HAL_OK){ + return; + } + + if(HAL_TIM_Base_Start_IT(handle) != HAL_OK){ + return; + } +} + +/** + * @brief This function will reset the timer + * @param timer_id : timer_id_e + * @retval None + */ +void TimerHandleDeinit(stimer_t *obj) +{ + HAL_TIM_Base_Stop_IT(&(obj->handle)); + HAL_TIM_Base_DeInit(&(obj->handle)); +} + +/** + * @brief This function return the timer clock source. + * @param tim: timer instance + * @retval 1 = PCLK1 or 2 = PCLK2 or 0 = unknown + */ +uint8_t getTimerClkSrc(TIM_TypeDef* tim) +{ + return (uint8_t)timermap_clkSrc(tim, TimerMap_CONFIG); +} + +/** + * @brief This function return the timer clock frequency. + * @param tim: timer instance + * @retval frequency in Hz + */ +uint32_t getTimerClkFreq(TIM_TypeDef* tim) +{ + RCC_ClkInitTypeDef clkconfig = {}; + uint32_t pFLatency = 0U; + uint32_t uwTimclock, uwAPBxPrescaler = 0U; + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + switch(getTimerClkSrc(tim)) { + case 1: + uwAPBxPrescaler = clkconfig.APB1CLKDivider; + uwTimclock = HAL_RCC_GetPCLK1Freq(); + break; +#ifndef STM32F0xx + case 2: + uwAPBxPrescaler = clkconfig.APB2CLKDivider; + uwTimclock = HAL_RCC_GetPCLK2Freq(); + break; +#endif + default: + case 0: + break; + } +/* When TIMPRE bit of the RCC_DCKCFGR register is reset, + * if APBx prescaler is 1, then TIMxCLK = PCLKx, + * otherwise TIMxCLK = 2x PCLKx. + * When TIMPRE bit in the RCC_DCKCFGR register is set, + * if APBx prescaler is 1,2 or 4, then TIMxCLK =HCLK, + * otherwise TIMxCLK = 4x PCLKx + */ +#if defined(STM32F4xx) || defined(STM32F7xx) +#if !defined(STM32F405xx) && !defined(STM32F415xx) &&\ + !defined(STM32F407xx) && !defined(STM32F417xx) + RCC_PeriphCLKInitTypeDef PeriphClkConfig = {}; + HAL_RCCEx_GetPeriphCLKConfig(&PeriphClkConfig); + + if (PeriphClkConfig.TIMPresSelection == RCC_TIMPRES_ACTIVATED) + switch (uwAPBxPrescaler) { + default: + case RCC_HCLK_DIV1: + case RCC_HCLK_DIV2: + case RCC_HCLK_DIV4: + uwTimclock=HAL_RCC_GetHCLKFreq(); + break; + case RCC_HCLK_DIV8: + case RCC_HCLK_DIV16: + uwTimclock*=4; + break; + } + else +#endif +#endif + switch (uwAPBxPrescaler) { + default: + case RCC_HCLK_DIV1: + // uwTimclock*=1; + break; + case RCC_HCLK_DIV2: + case RCC_HCLK_DIV4: + case RCC_HCLK_DIV8: + case RCC_HCLK_DIV16: + uwTimclock*=2; + break; + } + return uwTimclock; +} + +/** + * @brief This function will set the timer to generate pulse in interrupt mode with a particular duty cycle + * @param timer_id : timer_id_e + * @param period : timer period in microseconds + * @param pulseWidth : pulse width in microseconds + * @param irqHandle : interrupt routine to call + * @retval None + */ +void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*irqHandle)(stimer_t*, uint32_t)) +{ + TIM_OC_InitTypeDef sConfig = {}; + TIM_HandleTypeDef *handle = &(obj->handle); + + obj->timer = TIMER_SERVO; + + //min pulse = 1us - max pulse = 65535us + handle->Instance = obj->timer; + handle->Init.Period = period; + handle->Init.Prescaler = (uint32_t)(getTimerClkFreq(obj->timer) / (1000000)) - 1; + handle->Init.ClockDivision = 0; + handle->Init.CounterMode = TIM_COUNTERMODE_UP; +#ifndef STM32L0xx + handle->Init.RepetitionCounter = 0; +#endif + obj->irqHandleOC = irqHandle; + + sConfig.OCMode = TIM_OCMODE_TIMING; + sConfig.Pulse = pulseWidth; + sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfig.OCFastMode = TIM_OCFAST_DISABLE; +#ifndef STM32L0xx + sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; +#endif + HAL_NVIC_SetPriority(timermap_irq(obj->timer, TimerMap_CONFIG), 14, 0); + HAL_NVIC_EnableIRQ(timermap_irq(obj->timer, TimerMap_CONFIG)); + + if(HAL_TIM_OC_Init(handle) != HAL_OK) return; + + if(HAL_TIM_OC_ConfigChannel(handle, &sConfig, TIM_CHANNEL_1) != HAL_OK) return; + if(HAL_TIM_OC_Start_IT(handle, TIM_CHANNEL_1) != HAL_OK) return; +} + +/** + * @brief This function will reset the pulse generation + * @param timer_id : timer_id_e + * @retval None + */ +void TimerPulseDeinit(stimer_t *obj) +{ + TIM_HandleTypeDef *handle = &(obj->handle); + + obj->irqHandleOC = NULL; + + HAL_NVIC_DisableIRQ(timermap_irq(obj->timer, TimerMap_CONFIG)); + + if(HAL_TIM_OC_DeInit(handle) != HAL_OK) return; + if(HAL_TIM_OC_Stop_IT(handle, TIM_CHANNEL_1) != HAL_OK) return; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim: TIM handle + * @retval None + */ +void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + timer_enable_clock(htim); +} + +/** + * @brief DeInitialize TIM Output Compare MSP. + * @param htim: TIM handle + * @retval None + */ +void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + timer_disable_clock(htim); +} + +/* Aim of the function is to get timer_s pointer using htim pointer */ +/* Highly inspired from magical linux kernel's "container_of" */ +/* (which was not directly used since not compatible with IAR toolchain) */ +stimer_t *get_timer_obj(TIM_HandleTypeDef *htim){ + struct timer_s *obj_s; + stimer_t *obj; + + obj_s = (struct timer_s *)( (char *)htim - offsetof(struct timer_s,handle)); + obj = (stimer_t *)( (char *)obj_s - offsetof(stimer_t,timer)); + + return (obj); +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim : TIM OC handle + * @retval None + */ +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + uint32_t channel = 0; + stimer_t *obj = get_timer_obj(htim); + + if(obj->irqHandleOC != NULL) { + switch(htim->Channel) { + case HAL_TIM_ACTIVE_CHANNEL_1: + channel = TIM_CHANNEL_1 / 4; + break; + default: + return; + break; + } + obj->irqHandleOC(obj, channel); + } +} + +/** + * @brief Period elapsed callback in non-blocking mode + * @param timer_id : id of the timer + * @retval None + */ +void HAL_TIMx_PeriodElapsedCallback(stimer_t *obj) +{ + + if(get_GPIO_Port(STM_PORT(obj->pin)) != NULL) { + if(obj->pinInfo.count > 0){ + obj->pinInfo.count--; + + if(obj->pinInfo.state == 0) { + obj->pinInfo.state = 1; + digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 1); + } + else { + obj->pinInfo.state = 0; + digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0); + } + } + else if(obj->pinInfo.count == -1) { + if(obj->pinInfo.state == 0) { + obj->pinInfo.state = 1; + digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 1); + } + else { + obj->pinInfo.state = 0; + digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0); + } + } + else { + digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0); + } + } +} + +/** + * @brief Period elapsed callback in non-blocking mode + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + stimer_t *obj = get_timer_obj(htim); + + if(obj->irqHandle != NULL) { + obj->irqHandle(obj); + } +} + +/** + * @brief This function will set the tone timer to the required value and + * configure the pin to toggle. + * @param port : pointer to GPIO_TypeDef + * @param pin : pin number to toggle + * @param frequency : toggle frequency (in hertz) + * @param duration : toggle time + * @retval None + */ +void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration) +{ + uint8_t end = 0; + uint32_t timClkFreq = 0; + // TIMER_TONE freq is twice frequency + uint32_t timFreq = 2*frequency; + uint32_t prescaler = 1; + uint32_t period = 0; + + if(frequency > MAX_FREQ) + return; + + obj->timer = TIMER_TONE; + obj->pinInfo.state = 0; + + //Calculate the toggle count + if (duration > 0) { + obj->pinInfo.count = ((timFreq * duration) / 1000); + } + else { + obj->pinInfo.count = -1; + } + + digital_io_init(obj->pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL); + timClkFreq = getTimerClkFreq(obj->timer); + + while(end == 0) { + period = ((uint32_t)( timClkFreq / timFreq / prescaler)) - 1; + + if((period >= 0xFFFF) && (prescaler < 0xFFFF)) + prescaler++; //prescaler *= 2; + + else + end = 1; + } + + if((period < 0xFFFF) && (prescaler < 0xFFFF)) { + obj->irqHandle = HAL_TIMx_PeriodElapsedCallback; + TimerHandleInit(obj, period, prescaler-1); + } + else { + TimerHandleDeinit(obj); + } +} + +/** + * @brief This function will reset the tone timer + * @param port : pointer to port + * @param pin : pin number to toggle + * @retval None + */ +void TimerPinDeinit(stimer_t *obj) +{ + TimerHandleDeinit(obj); +} + +/** + * @brief Get the counter value. + * @param timer_id : id of the timer + * @retval Counter value + */ +uint32_t getTimerCounter(stimer_t *obj) +{ + return __HAL_TIM_GET_COUNTER(&(obj->handle)); +} + +/** + * @brief Set the counter value. + * @param timer_id : id of the timer + * @param value : counter value + * @retval None + */ +void setTimerCounter(stimer_t *obj, uint32_t value) +{ + __HAL_TIM_SET_COUNTER(&(obj->handle), value); +} + +/** + * @brief Set the TIM Capture Compare Register value. + * @param timer_id : id of the timer + * @param channel : TIM Channels to be configured. + * @param value : register new register. + * @retval None + */ +void setCCRRegister(stimer_t *obj, uint32_t channel, uint32_t value) +{ + __HAL_TIM_SET_COMPARE(&(obj->handle), channel*4, value); +} + +/** + * @brief Set the TIM Capture Compare Register value. + * @param timer_id : id of the timer + * @param channel : TIM Channels to be configured. + * @retval CRR value. + */ +uint32_t getCCRRegister(stimer_t *obj, uint32_t channel) +{ + return __HAL_TIM_GET_COMPARE(&(obj->handle), channel); +} + +/** + * @brief Attached an interrupt handler + * @param timer_id : id of the timer + * @param irqHandle : interrupt handler + * @retval none + */ +void attachIntHandle(stimer_t *obj, void (*irqHandle)(stimer_t *)) +{ + obj->irqHandle = irqHandle; +} + +/** + * @brief Attached an interrupt handler + * @param htim : TIM handle + * @param irqHandle : interrupt handler + * @retval none + */ +void timer_attach_interrupt_handle(TIM_HandleTypeDef *htim, void (*irqHandle)(stimer_t *)) +{ + stimer_t *obj = get_timer_obj(htim); + obj->irqHandle = irqHandle; +} + +/******************************************************************************/ +/* TIMx IRQ HANDLER */ +/******************************************************************************/ + +/** + * @brief TIM1 & TIM10 irq handler + * @param None + * @retval None + */ +void TIM1_UP_TIM10_IRQHandler(void) +{ + if(timer_handles[0] != NULL) { + HAL_TIM_IRQHandler(timer_handles[0]); + } + + if(timer_handles[9] != NULL) { + HAL_TIM_IRQHandler(timer_handles[9]); + } +} + + +/** + * @brief TIM1 & TIM9 irq handler + * @param None + * @retval None + */ +void TIM1_BRK_TIM9_IRQHandler(void) +{ + if(timer_handles[0] != NULL) { + HAL_TIM_IRQHandler(timer_handles[0]); + } + + if(timer_handles[8] != NULL) { + HAL_TIM_IRQHandler(timer_handles[8]); + } +} + +/** + * @brief TIM1 & TIM11 irq handler + * @param None + * @retval None + */ +void TIM1_TRG_COM_TIM11_IRQHandler(void) +{ + if(timer_handles[0] != NULL) { + HAL_TIM_IRQHandler(timer_handles[0]); + } + + if(timer_handles[10] != NULL) { + HAL_TIM_IRQHandler(timer_handles[10]); + } +} + +/** + * @brief TIM1 irq handler + * @param None + * @retval None + */ +void TIM1_CC_IRQHandler(void) +{ + if(timer_handles[0] != NULL) { + HAL_TIM_IRQHandler(timer_handles[0]); + } +} + +/** + * @brief TIM2 irq handler + * @param None + * @retval None + */ +void TIM2_IRQHandler(void) +{ + if(timer_handles[1] != NULL) { + HAL_TIM_IRQHandler(timer_handles[1]); + } +} + +/** + * @brief TIM3 irq handler + * @param None + * @retval None + */ +void TIM3_IRQHandler(void) +{ + if(timer_handles[2] != NULL) { + HAL_TIM_IRQHandler(timer_handles[2]); + } +} + +/** + * @brief TIM4 irq handler + * @param None + * @retval None + */ +void TIM4_IRQHandler(void) +{ + if(timer_handles[3] != NULL) { + HAL_TIM_IRQHandler(timer_handles[3]); + } +} + +/** + * @brief TIM5 irq handler + * @param None + * @retval None + */ +void TIM5_IRQHandler(void) +{ + if(timer_handles[4] != NULL) { + HAL_TIM_IRQHandler(timer_handles[4]); + } +} + +/** + * @brief TIM6 irq handler + * @param None + * @retval None + */ +void TIM6_DAC_IRQHandler(void) +{ + if(timer_handles[5] != NULL) { + HAL_TIM_IRQHandler(timer_handles[5]); + } +} + +/** + * @brief TIM7 irq handler + * @param None + * @retval None + */ +void TIM7_IRQHandler(void) +{ + if(timer_handles[6] != NULL) { + HAL_TIM_IRQHandler(timer_handles[6]); + } +} + +/** + * @brief TIM8 & TIM13 irq handler + * @param None + * @retval None + */ +void TIM8_UP_TIM13_IRQHandler(void) +{ + if(timer_handles[7] != NULL) { + HAL_TIM_IRQHandler(timer_handles[7]); + } + + if(timer_handles[12] != NULL) { + HAL_TIM_IRQHandler(timer_handles[12]); + } +} + + +/** + * @brief TIM8 & TIM12 irq handler + * @param None + * @retval None + */ +void TIM8_BRK_TIM12_IRQHandler(void) +{ + if(timer_handles[7] != NULL) { + HAL_TIM_IRQHandler(timer_handles[7]); + } + + if(timer_handles[11] != NULL) { + HAL_TIM_IRQHandler(timer_handles[11]); + } +} + +/** + * @brief TIM8 & TIM14 irq handler + * @param None + * @retval None + */ +void TIM8_TRG_COM_TIM14_IRQHandler(void) +{ + if(timer_handles[7] != NULL) { + HAL_TIM_IRQHandler(timer_handles[7]); + } + + if(timer_handles[13] != NULL) { + HAL_TIM_IRQHandler(timer_handles[13]); + } +} + +/** + * @brief TIM8 irq handler + * @param None + * @retval None + */ +void TIM8_CC_IRQHandler(void) +{ + if(timer_handles[7] != NULL) { + HAL_TIM_IRQHandler(timer_handles[7]); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/timer.h b/cores/arduino/stm32/timer.h new file mode 100644 index 0000000..85e4a84 --- /dev/null +++ b/cores/arduino/stm32/timer.h @@ -0,0 +1,110 @@ +/** + ****************************************************************************** + * @file timer.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for timer module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TIMER_H +#define __TIMER_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +#define OFFSETOF(type, member) ((uint32_t) (&(((type *)(0))->member))) + +typedef struct{ + int32_t count; + uint8_t state; +}timerPinInfo_t; + +typedef struct timer_s stimer_t; + +struct timer_s{ + /* The 1st 2 members TIM_TypeDef *timer + * and TIM_HandleTypeDef handle should + * be kept as the first members of this struct + * to have get_timer_obj() function work as expected + */ + TIM_TypeDef *timer; + TIM_HandleTypeDef handle; + uint8_t idx; + void (*irqHandle)(stimer_t *); + void (*irqHandleOC)(stimer_t *, uint32_t); + PinName pin; + volatile timerPinInfo_t pinInfo; +}; + +/* Exported constants --------------------------------------------------------*/ +#define MAX_FREQ 65535 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void timer_enable_clock(TIM_HandleTypeDef *htim); +void timer_disable_clock(TIM_HandleTypeDef *htim); +void timer_attach_interrupt_handle(TIM_HandleTypeDef *htim, void (*irqHandle)(stimer_t *)); + +void TimerHandleInit(stimer_t *obj, uint16_t period, uint16_t prescaler); +void TimerHandleDeinit(stimer_t *obj); + +void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration); +void TimerPinDeinit(stimer_t *obj); + +void TimerPulseInit(stimer_t *obj, uint16_t period, uint16_t pulseWidth, void (*irqHandle)(stimer_t *, uint32_t)); +void TimerPulseDeinit(stimer_t *obj); + +uint32_t getTimerCounter(stimer_t *obj); +void setTimerCounter(stimer_t *obj, uint32_t value); +void setCCRRegister(stimer_t *obj, uint32_t channel, uint32_t value); +uint32_t getCCRRegister(stimer_t *obj, uint32_t channel); + +uint8_t getTimerClkSrc(TIM_TypeDef* tim); +uint32_t getTimerClkFreq(TIM_TypeDef* tim); + +void attachIntHandle(stimer_t *obj, void (*irqHandle)(stimer_t *)); + +#ifdef __cplusplus +} +#endif + +#endif /* __TIMER_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/twi.c b/cores/arduino/stm32/twi.c new file mode 100644 index 0000000..9fa54ae --- /dev/null +++ b/cores/arduino/stm32/twi.c @@ -0,0 +1,587 @@ +/** + ****************************************************************************** + * @file twi.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide the TWI interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + +#include "stm32_def.h" +#include "hw_config.h" +#include "twi.h" + +/** + * @} + */ + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/// @brief I2C timout in tick unit +#define I2C_TIMEOUT_TICK 100 + +#define SLAVE_MODE_TRANSMIT 0 +#define SLAVE_MODE_RECEIVE 1 + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + +/* Family specific description for I2C */ +#define I2C_NUM (5) +static I2C_HandleTypeDef* i2c_handles[I2C_NUM]; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + + +/** + * @brief Default init and setup GPIO and I2C peripheral + * @param obj : pointer to i2c_t structure + * @retval none + */ +void i2c_init(i2c_t *obj) +{ + i2c_custom_init(obj, I2C_100KHz, I2C_ADDRESSINGMODE_7BIT, 0x33, 1); +} + +/** + * @brief Initialize and setup GPIO and I2C peripheral + * @param obj : pointer to i2c_t structure + * @param timing : one of the i2c_timing_e + * @param addressingMode : I2C_ADDRESSINGMODE_7BIT or I2C_ADDRESSINGMODE_10BIT + * @param ownAddress : device address + * @param master : set to 1 to choose the master mode + * @retval none + */ +void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, uint32_t ownAddress, uint8_t master) +{ + if(obj == NULL) + return; + + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + I2C_HandleTypeDef *handle = &(obj->handle); + + // Determine the I2C to use + uint32_t i2c_sda = pinmap_peripheral(obj->sda, PinMap_I2C_SDA); + uint32_t i2c_scl = pinmap_peripheral(obj->scl, PinMap_I2C_SCL); + + obj->i2c = (I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl); + + if(obj->i2c == (I2C_TypeDef *)NC) { + printf("ERROR: I2C pins mismatch\n"); + return; + } + +#if defined I2C1_BASE + // Enable I2C1 clock if not done + if (obj->i2c == I2C1) { + __HAL_RCC_I2C1_CLK_ENABLE(); + __HAL_RCC_I2C1_FORCE_RESET(); + __HAL_RCC_I2C1_RELEASE_RESET(); + obj->irq = I2C1_EV_IRQn; + i2c_handles[0] = handle; + } +#endif +#if defined I2C2_BASE + // Enable I2C2 clock if not done + if (obj->i2c == I2C2) { + __HAL_RCC_I2C2_CLK_ENABLE(); + __HAL_RCC_I2C2_FORCE_RESET(); + __HAL_RCC_I2C2_RELEASE_RESET(); +#ifdef STM32F0xx + obj->irq = I2C2_IRQn; +#else + obj->irq = I2C2_EV_IRQn; +#endif + i2c_handles[1] = handle; + } +#endif +#if defined I2C3_BASE + // Enable I2C3 clock if not done + if (obj->i2c == I2C3) { + __HAL_RCC_I2C3_CLK_ENABLE(); + __HAL_RCC_I2C3_FORCE_RESET(); + __HAL_RCC_I2C3_RELEASE_RESET(); + obj->irq = I2C3_EV_IRQn; + i2c_handles[2] = handle; + } +#endif +#if defined I2C4_BASE + // Enable I2C3 clock if not done + if (obj->i2c == I2C4) { + __HAL_RCC_I2C4_CLK_ENABLE(); + __HAL_RCC_I2C4_FORCE_RESET(); + __HAL_RCC_I2C4_RELEASE_RESET(); + obj->irq = I2C4_EV_IRQn; + i2c_handles[3] = handle; + } +#endif + + //SCL + port = set_GPIO_Port_Clock(STM_PORT(obj->scl)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->scl); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->scl,PinMap_I2C_SCL)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->scl,PinMap_I2C_SCL)); + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->scl,PinMap_I2C_SCL)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + + //SDA + port = set_GPIO_Port_Clock(STM_PORT(obj->sda)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->sda); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->sda,PinMap_I2C_SDA)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->sda,PinMap_I2C_SDA)); + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->sda,PinMap_I2C_SDA)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + + handle->Instance = obj->i2c; +#if defined (STM32F0xx) || defined (STM32F3xx) || defined (STM32F7xx) ||\ + defined (STM32L0xx) || defined (STM32L4xx) + handle->Init.Timing = timing; +#else + handle->Init.ClockSpeed = timing; + handle->Init.DutyCycle = I2C_DUTYCYCLE_2;//16_9; +#endif + handle->Init.OwnAddress1 = ownAddress; + handle->Init.OwnAddress2 = 0xFF; + handle->Init.AddressingMode = addressingMode; + handle->Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; + handle->Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; + handle->Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; + + if(master == 0) { + HAL_NVIC_SetPriority(obj->irq, 0, 1); + HAL_NVIC_EnableIRQ(obj->irq); + } + + // Init the I2C + HAL_I2C_Init(handle); +} + +/** + * @brief Initialize and setup GPIO and I2C peripheral + * @param obj : pointer to i2c_t structure + * @retval none + */ +void i2c_deinit(i2c_t *obj) +{ + HAL_NVIC_DisableIRQ(obj->irq); + HAL_I2C_DeInit(&(obj->handle)); +} + +/** + * @brief Setup transmission speed. I2C must be configured before. + * @param obj : pointer to i2c_t structure + * @param frequency : i2c transmission speed + * @retval none + */ +void i2c_setTiming(i2c_t *obj, uint32_t frequency) +{ + uint32_t f = I2C_10KHz; + __HAL_I2C_DISABLE(&(obj->handle)); + + if(frequency <= 10000) + f = I2C_10KHz; + else if(frequency <= 50000) + f = I2C_50KHz; + else if(frequency <= 100000) + f = I2C_100KHz; + else if(frequency <= 200000) + f = I2C_200KHz; + else if(frequency <= 400000) + f = I2C_400KHz; + +#if defined (STM32F0xx) || defined (STM32F3xx) || defined (STM32F7xx) ||\ + defined (STM32L0xx) || defined (STM32L4xx) + obj->handle.Init.Timing = f; +#else + obj->handle.Init.ClockSpeed = f; +#endif +/* + else if(frequency <= 600000) + g_i2c_init_info[i2c_id].i2c_handle.Init.ClockSpeed = I2C_600KHz; + else if(frequency <= 800000) + g_i2c_init_info[i2c_id].i2c_handle.Init.ClockSpeed = I2C_800KHz; + else + g_i2c_init_info[i2c_id].i2c_handle.Init.ClockSpeed = I2C_1000KHz; +*/ + HAL_I2C_Init(&(obj->handle)); + __HAL_I2C_ENABLE(&(obj->handle)); +} + +/** + * @brief Write bytes at a given address + * @param obj : pointer to i2c_t structure + * @param dev_address: specifies the address of the device. + * @param data: pointer to data to be write + * @param size: number of bytes to be write. + * @retval read status + */ +i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address, + uint8_t *data, uint8_t size) + +{ + i2c_status_e ret = I2C_ERROR; + HAL_StatusTypeDef status = HAL_OK; + + // Check the communication status + status = HAL_I2C_Master_Transmit(&(obj->handle), dev_address, data, size, I2C_TIMEOUT_TICK); + + if(status == HAL_OK) + ret = I2C_OK; + else if(status == HAL_TIMEOUT) + ret = I2C_TIMEOUT; + else + ret = I2C_ERROR; + + return ret; +} + +/** + * @brief Write bytes to master + * @param obj : pointer to i2c_t structure + * @param data: pointer to data to be write + * @param size: number of bytes to be write. + * @retval none + */ +void i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint8_t size) +{ + uint8_t i = 0; + + // Check the communication status + for(i = 0; i < size; i++) { + obj->i2cTxRxBuffer[i] = *(data+i); + obj->i2cTxRxBufferSize++; + } +} + +/** + * @brief read bytes in master mode at a given address + * @param obj : pointer to i2c_t structure + * @param dev_address: specifies the address of the device. + * @param data: pointer to data to be read + * @param size: number of bytes to be read. + * @retval read status + */ +i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uint8_t size) +{ + i2c_status_e ret = I2C_ERROR; + + if(HAL_I2C_Master_Receive(&(obj->handle), dev_address, data, size, I2C_TIMEOUT_TICK) == HAL_OK) { + ret = I2C_OK; + } + + return ret; +} + +/** + * @brief Checks if target device is ready for communication + * @param obj : pointer to i2c_t structure + * @param devAddr: specifies the address of the device. + * @param trials : Number of trials. + * @retval status + */ +i2c_status_e i2c_IsDeviceReady(i2c_t *obj, uint8_t devAddr, uint32_t trials) +{ + i2c_status_e ret = HAL_OK; + + if(HAL_I2C_IsDeviceReady( &(obj->handle), devAddr, trials, I2C_TIMEOUT_TICK) != HAL_OK) { + ret = I2C_BUSY; + } + + return ret; +} + +/* Aim of the function is to get i2c_s pointer using hi2c pointer */ +/* Highly inspired from magical linux kernel's "container_of" */ +/* (which was not directly used since not compatible with IAR toolchain) */ +i2c_t *get_i2c_obj(I2C_HandleTypeDef *hi2c){ + struct i2c_s *obj_s; + i2c_t *obj; + + obj_s = (struct i2c_s *)( (char *)hi2c - offsetof(struct i2c_s,handle)); + obj = (i2c_t *)( (char *)obj_s - offsetof(i2c_t,i2c)); + + return (obj); +} + +/** @brief sets function called before a slave read operation + * @param obj : pointer to i2c_t structure + * @param function: callback function to use + * @retval None + */ +void i2c_attachSlaveRxEvent(i2c_t *obj, void (*function)(uint8_t*, int) ) +{ + obj->i2c_onSlaveReceive = function; + HAL_I2C_EnableListen_IT(&(obj->handle)); +} + +/** @brief sets function called before a slave write operation + * @param obj : pointer to i2c_t structure + * @param function: callback function to use + * @retval None + */ +void i2c_attachSlaveTxEvent(i2c_t *obj, void (*function)(void) ) +{ + obj->i2c_onSlaveTransmit = function; + HAL_I2C_EnableListen_IT(&(obj->handle)); +} + +/** + * @brief Slave Address Match callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param TransferDirection: Master request Transfer Direction (Write/Read), value of @ref I2C_XferOptions_definition + * @param AddrMatchCode: Address Match Code + * @retval None + */ +void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) +{ + i2c_t *obj = get_i2c_obj(hi2c); + + if(AddrMatchCode == hi2c->Init.OwnAddress1) { + if(TransferDirection == I2C_DIRECTION_RECEIVE) { + + obj->i2cTxRxBufferSize = 0; + obj->slaveMode = SLAVE_MODE_TRANSMIT; + + if(obj->i2c_onSlaveTransmit != NULL) { + obj->i2c_onSlaveTransmit(); + } + HAL_I2C_Slave_Sequential_Transmit_IT(hi2c, obj->i2cTxRxBuffer, + obj->i2cTxRxBufferSize, I2C_LAST_FRAME); + } else { + obj->slaveMode = SLAVE_MODE_RECEIVE; + HAL_I2C_Slave_Sequential_Receive_IT(hi2c, obj->i2cTxRxBuffer, + I2C_TXRX_BUFFER_SIZE, I2C_LAST_FRAME); + } + } +} + +/** + * @brief Listen Complete callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) +{ + uint8_t nbData = 0; + i2c_t *obj = get_i2c_obj(hi2c); + + if((obj->i2c_onSlaveReceive != NULL) && + (obj->slaveMode == SLAVE_MODE_RECEIVE)) { + nbData = I2C_TXRX_BUFFER_SIZE - obj->handle.XferCount; + if(nbData != 0) { + obj->i2c_onSlaveReceive(obj->i2cTxRxBuffer, nbData); + } + } + HAL_I2C_EnableListen_IT(hi2c); +} + +/** + * @brief I2C error callback. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @retval None + */ +void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) +{ + HAL_I2C_EnableListen_IT(hi2c); +} + +/** +* @brief This function handles I2C1 interrupt. +* @param None +* @retval None +*/ +void I2C1_EV_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[0]; + HAL_I2C_EV_IRQHandler(handle); +} + +/** +* @brief This function handles I2C1 interrupt. +* @param None +* @retval None +*/ +void I2C1_ER_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[0]; + HAL_I2C_ER_IRQHandler(handle); +} + +/** +* @brief This function handles I2C2 interrupt. +* @param None +* @retval None +*/ +void I2C2_EV_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[1]; + HAL_I2C_EV_IRQHandler(handle); +} + +/** +* @brief This function handles I2C2 interrupt. +* @param None +* @retval None +*/ +void I2C2_ER_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[1]; + HAL_I2C_ER_IRQHandler(handle); +} + +/** +* @brief This function handles I2C3 interrupt. +* @param None +* @retval None +*/ +void I2C3_EV_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[2]; + HAL_I2C_EV_IRQHandler(handle); +} + +/** +* @brief This function handles I2C3 interrupt. +* @param None +* @retval None +*/ +void I2C3_ER_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[2]; + HAL_I2C_ER_IRQHandler(handle); +} + +/** +* @brief This function handles I2C4 interrupt. +* @param None +* @retval None +*/ +void I2C4_EV_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[3]; + HAL_I2C_EV_IRQHandler(handle); +} + +/** +* @brief This function handles I2C4 interrupt. +* @param None +* @retval None +*/ +void I2C4_ER_IRQHandler(void) +{ + I2C_HandleTypeDef * handle = i2c_handles[3]; + HAL_I2C_ER_IRQHandler(handle); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/twi.h b/cores/arduino/stm32/twi.h new file mode 100644 index 0000000..348a992 --- /dev/null +++ b/cores/arduino/stm32/twi.h @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * @file twi.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for twi module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TWI_H__ +#define __TWI_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* offsetof is a gcc built-in function, this is the manual implementation */ +#define OFFSETOF(type, member) ((uint32_t) (&(((type *)(0))->member))) + +#define I2C_TXRX_BUFFER_SIZE 32 + +typedef struct i2c_s i2c_t; + +struct i2c_s { + /* The 1st 2 members I2CName i2c + * and I2C_HandleTypeDef handle should + * be kept as the first members of this struct + * to have get_i2c_obj() function work as expected + */ + I2C_TypeDef *i2c; + I2C_HandleTypeDef handle; + PinName sda; + PinName scl; + IRQn_Type irq; + uint8_t slaveMode; + void (*i2c_onSlaveReceive)(uint8_t *, int); + void (*i2c_onSlaveTransmit)(void); + uint8_t i2cTxRxBuffer[I2C_TXRX_BUFFER_SIZE]; + uint8_t i2cTxRxBufferSize; +}; + +///@brief I2C state +typedef enum { + I2C_OK = 0, + I2C_TIMEOUT = 1, + I2C_ERROR = 2, + I2C_BUSY = 3 +}i2c_status_e; + +typedef enum { +#if defined (STM32F0xx) || defined (STM32F3xx) || defined (STM32L0xx) +//calculated with SYSCLK = 64MHz at +/*https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiC4q6O7ojMAhWCOhoKHYlyBtIQFggmMAE&url=http%3A%2F%2Fuglyduck.ath.cx%2FPDF%2FSTMicro%2FARM%2FSTM32F0%2FI2C_Timing_Configuration_V1.0.1.xls&usg=AFQjCNGGjPSUAzVUdbUqMUxPub8Ojzhh9w&sig2=4YgzXFixj15GhqkAzVS4tA*/ + I2C_10KHz = 0xE010A9FF, + I2C_50KHz = 0x2070A8FD, + I2C_100KHz = 0x10B07EBA, + I2C_200KHz = 0x00C034FF, + I2C_400KHz = 0x00C0246F, + I2C_600KHz = 0x00900E50, + I2C_800KHz = 0x00900E35, + I2C_1000KHz = 0x00900E25 +#elif defined (STM32L4xx) + I2C_10KHz = 0xF010F3FE, + I2C_50KHz = 0x30608CFF, + I2C_100KHz = 0x10D0A4E4, + I2C_200KHz = 0x00F082FF, + I2C_400KHz = 0x00F02E8B, + I2C_600KHz = 0x00B01265, + I2C_800KHz = 0x00B01243, + I2C_1000KHz = 0x00B0122F +#else //STM32F4xx + I2C_10KHz = 10000, + I2C_50KHz = 50000, + I2C_100KHz = 100000, + I2C_200KHz = 200000, + I2C_400KHz = 400000, +/* I2C_600KHz = 600000, + I2C_800KHz = 800000, + I2C_1000KHz = 1000000*/ //Not supported +#endif +}i2c_timing_e; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void i2c_init(i2c_t *obj); +void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, + uint32_t ownAddress, uint8_t master); +void i2c_deinit(i2c_t *obj); +void i2c_setTiming(i2c_t *obj, uint32_t frequency); +i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address, uint8_t *data, uint8_t size); +void i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint8_t size); +i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uint8_t size); + +i2c_status_e i2c_IsDeviceReady(i2c_t *obj, uint8_t devAddr,uint32_t trials); + +void i2c_attachSlaveRxEvent(i2c_t *obj, void (*function)(uint8_t*, int) ); +void i2c_attachSlaveTxEvent(i2c_t *obj, void (*function)(void) ); + +#ifdef __cplusplus +} +#endif + +#endif /* __TWI_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/uart.c b/cores/arduino/stm32/uart.c new file mode 100644 index 0000000..9b43187 --- /dev/null +++ b/cores/arduino/stm32/uart.c @@ -0,0 +1,662 @@ +/** + ****************************************************************************** + * @file uart.c + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief provide the UART interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "hw_config.h" +#include "uart.h" +#include "digital_io.h" +#include "interrupt.h" +#include "variant.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +/// @brief uart caracteristics +#define UART_NUM (8) +static UART_HandleTypeDef *uart_handlers[UART_NUM] = {NULL}; +static void (*rx_callback[UART_NUM])(serial_t*); +static serial_t *rx_callback_obj[UART_NUM]; +static int (*tx_callback[UART_NUM])(serial_t*); +static serial_t *tx_callback_obj[UART_NUM]; + +static uint8_t rx_buffer[1] = {0}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Function called to initialize the uart interface + * @param obj : pointer to serial_t structure + * @retval None + */ +void uart_init(serial_t *obj) +{ + if(obj == NULL) { + return; + } + + UART_HandleTypeDef *huart = &(obj->handle); + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port; + + // Determine the UART to use (UART_1, UART_2, ...) + uint32_t uart_tx = (uint32_t)pinmap_peripheral(obj->pin_tx, PinMap_UART_TX); + uint32_t uart_rx = (uint32_t)pinmap_peripheral(obj->pin_rx, PinMap_UART_RX); + + // Get the peripheral name (UART_1, UART_2, ...) from the pin and assign it to the object + obj->uart = (USART_TypeDef *)pinmap_merge(uart_tx, uart_rx); + + if(obj->uart == (USART_TypeDef *)NC) { + printf("ERROR: UART pins mismatch\n"); + return; + } + + // Enable USART clock + if(obj->uart == USART1) { + __HAL_RCC_USART1_FORCE_RESET(); + __HAL_RCC_USART1_RELEASE_RESET(); + __HAL_RCC_USART1_CLK_ENABLE(); + obj->index = 0; + obj->irq = USART1_IRQn; + } else if(obj->uart == USART2) { + __HAL_RCC_USART2_FORCE_RESET(); + __HAL_RCC_USART2_RELEASE_RESET(); + __HAL_RCC_USART2_CLK_ENABLE(); + obj->index = 1; + obj->irq = USART2_IRQn; + } +#if defined(USART3_BASE) + else if(obj->uart == USART3) { + __HAL_RCC_USART3_FORCE_RESET(); + __HAL_RCC_USART3_RELEASE_RESET(); + __HAL_RCC_USART3_CLK_ENABLE(); + obj->index = 2; + obj->irq = USART3_IRQn; + } +#endif +#if defined(UART4_BASE) + else if(obj->uart == UART4) { + __HAL_RCC_UART4_FORCE_RESET(); + __HAL_RCC_UART4_RELEASE_RESET(); + __HAL_RCC_UART4_CLK_ENABLE(); + obj->index = 3; + obj->irq = UART4_IRQn; + } +#endif +#if defined(UART5_BASE) + else if(obj->uart == UART5) { + __HAL_RCC_UART5_FORCE_RESET(); + __HAL_RCC_UART5_RELEASE_RESET(); + __HAL_RCC_UART5_CLK_ENABLE(); + obj->index = 4; + obj->irq = UART5_IRQn; + } +#endif +#if defined(USART6_BASE) + else if(obj->uart == USART6) { + __HAL_RCC_USART6_FORCE_RESET(); + __HAL_RCC_USART6_RELEASE_RESET(); + __HAL_RCC_USART6_CLK_ENABLE(); + obj->index = 5; + obj->irq = USART6_IRQn; + } +#endif +#if defined(UART7_BASE) + else if(obj->uart == UART7) { + __HAL_RCC_UART7_FORCE_RESET(); + __HAL_RCC_UART7_RELEASE_RESET(); + __HAL_RCC_UART7_CLK_ENABLE(); + obj->index = 6; + obj->irq = UART7_IRQn; + } +#endif +#if defined(UART8_BASE) + else if(obj->uart == UART8) { + __HAL_RCC_UART8_FORCE_RESET(); + __HAL_RCC_UART8_RELEASE_RESET(); + __HAL_RCC_UART8_CLK_ENABLE(); + obj->index = 7; + obj->irq = UART8_IRQn; + } +#endif + + //Configure GPIOs + //RX + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_rx)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_rx); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_rx,PinMap_UART_RX)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_rx,PinMap_UART_RX)); + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_rx,PinMap_UART_RX)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + + //TX + port = set_GPIO_Port_Clock(STM_PORT(obj->pin_tx)); + GPIO_InitStruct.Pin = STM_GPIO_PIN(obj->pin_tx); + GPIO_InitStruct.Mode = STM_PIN_MODE(pinmap_function(obj->pin_tx,PinMap_UART_TX)); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Pull = STM_PIN_PUPD(pinmap_function(obj->pin_tx,PinMap_UART_TX)); + GPIO_InitStruct.Alternate = STM_PIN_AFNUM(pinmap_function(obj->pin_tx,PinMap_UART_TX)); + HAL_GPIO_Init(port, &GPIO_InitStruct); + + //Configure uart + uart_handlers[obj->index] = huart; + huart->Instance = (USART_TypeDef *)(obj->uart); + huart->Init.BaudRate = obj->baudrate; + huart->Init.WordLength = obj->databits; + huart->Init.StopBits = obj->stopbits; + huart->Init.Parity = obj->parity; + huart->Init.Mode = UART_MODE_TX_RX; + huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart->Init.OverSampling = UART_OVERSAMPLING_16; + // huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + + if(HAL_UART_Init(huart) != HAL_OK) { + return; + } +} + +/** + * @brief Function called to deinitialize the uart interface + * @param obj : pointer to serial_t structure + * @retval None + */ +void uart_deinit(serial_t *obj) +{ + // Reset UART and disable clock + switch (obj->index) { + case 0: + __USART1_FORCE_RESET(); + __USART1_RELEASE_RESET(); + __USART1_CLK_DISABLE(); + break; + case 1: + __USART2_FORCE_RESET(); + __USART2_RELEASE_RESET(); + __USART2_CLK_DISABLE(); + break; +#if defined(USART3_BASE) + case 2: + __USART3_FORCE_RESET(); + __USART3_RELEASE_RESET(); + __USART3_CLK_DISABLE(); + break; +#endif +#if defined(UART4_BASE) + case 3: + __UART4_FORCE_RESET(); + __UART4_RELEASE_RESET(); + __UART4_CLK_DISABLE(); + break; +#endif +#if defined(UART5_BASE) + case 4: + __UART5_FORCE_RESET(); + __UART5_RELEASE_RESET(); + __UART5_CLK_DISABLE(); + break; +#endif +#if defined(USART6_BASE) + case 5: + __USART6_FORCE_RESET(); + __USART6_RELEASE_RESET(); + __USART6_CLK_DISABLE(); + break; +#endif +#if defined(UART7_BASE) + case 6: + __UART7_FORCE_RESET(); + __UART7_RELEASE_RESET(); + __UART7_CLK_DISABLE(); + break; +#endif +#if defined(UART8_BASE) + case 7: + __UART8_FORCE_RESET(); + __UART8_RELEASE_RESET(); + __UART8_CLK_DISABLE(); + break; +#endif + } + + HAL_UART_DeInit(uart_handlers[obj->index]); +} + +/** + * @brief write the data on the uart + * @param obj : pointer to serial_t structure + * @param data : byte to write + * @param size : number of data to write + * @retval The number of bytes written + */ +size_t uart_write(serial_t *obj, uint8_t data, uint16_t size) +{ + if(HAL_UART_Transmit(uart_handlers[obj->index], &data, size, TX_TIMEOUT) == HAL_OK) { + return size; + } else { + return 0; + } +} + +/** + * @brief write the data on the uart: used by printf for debug only (syscalls) + * @param obj : pointer to serial_t structure + * @param data : bytes to write + * @param size : number of data to write + * @retval The number of bytes written + */ +size_t uart_debug_write(uint8_t *data, uint32_t size) +{ + uint8_t index = 0; + uint32_t tickstart = HAL_GetTick(); + + for(index = 0; index < UART_NUM; index++) { + if(uart_handlers[index] != NULL) { + if(DEBUG_UART == uart_handlers[index]->Instance) { + break; + } + } + } + + if(index >= UART_NUM) { + return 0; + } + + while(HAL_UART_Transmit(uart_handlers[index], data, size, TX_TIMEOUT) != HAL_OK) { + if((HAL_GetTick() - tickstart) >= TX_TIMEOUT) { + return 0; + } + } + + return size; +} + +/** + * Attempts to determine if the serial peripheral is already in use for RX + * + * @param obj The serial object + * @return Non-zero if the RX transaction is ongoing, 0 otherwise + */ +uint8_t serial_rx_active(serial_t *obj) +{ + return ((obj == NULL) ? 1 : (HAL_UART_GetState(uart_handlers[obj->index]) == HAL_UART_STATE_BUSY_RX)); +} + +/** + * Attempts to determine if the serial peripheral is already in use for TX + * + * @param obj The serial object + * @return Non-zero if the TX transaction is ongoing, 0 otherwise + */ +uint8_t serial_tx_active(serial_t *obj) +{ + return ((obj == NULL) ? 1 : (HAL_UART_GetState(uart_handlers[obj->index]) == HAL_UART_STATE_BUSY_TX)); +} + +/** + * @brief Read receive byte from uart + * @param obj : pointer to serial_t structure + * @retval last character received + */ +int uart_getc(serial_t *obj) +{ + if(obj == NULL) { + return -1; + } + + if (serial_rx_active(obj)) { + return -1; // transaction ongoing + } + + // Restart RX irq + UART_HandleTypeDef *huart = uart_handlers[obj->index]; + HAL_UART_Receive_IT(huart, rx_buffer, 1); + + return rx_buffer[0]; +} + +/** + * Begin asynchronous RX transfer (enable interrupt for data collecting) + * + * @param obj : pointer to serial_t structure + * @param callback : function call at the end of reception + * @retval none + */ +void uart_attach_rx_callback(serial_t *obj, void (*callback)(serial_t*)) +{ + if(obj == NULL) { + return; + } + + // Exit if a reception is already on-going + if (serial_rx_active(obj)) { + return; + } + + rx_callback[obj->index] = callback; + rx_callback_obj[obj->index] = obj; + + HAL_NVIC_SetPriority(obj->irq, 0, 1); + HAL_NVIC_EnableIRQ(obj->irq); + + if(HAL_UART_Receive_IT(uart_handlers[obj->index], rx_buffer, 1) != HAL_OK) { + return; + } +} + +/** + * Begin asynchronous TX transfer. + * + * @param obj : pointer to serial_t structure + * @param callback : function call at the end of transmission + * @retval none + */ +void uart_attach_tx_callback(serial_t *obj, int (*callback)(serial_t*)) +{ + if(obj == NULL) { + return; + } + + tx_callback[obj->index] = callback; + tx_callback_obj[obj->index] = obj; + + // Enable interrupt + HAL_NVIC_SetPriority(obj->irq, 0, 2); + HAL_NVIC_EnableIRQ(obj->irq); + + // the following function will enable UART_IT_TXE and error interrupts + if (HAL_UART_Transmit_IT(uart_handlers[obj->index], &obj->tx_buff[obj->tx_tail], 1) != HAL_OK) { + return; + } +} + +/** + * @brief Return index of the serial handler + * @param UartHandle pointer on the uart reference + * @retval index + */ +uint8_t uart_index(UART_HandleTypeDef *huart) +{ + uint8_t i = 0; + if(huart == NULL) { + return UART_NUM; + } + + for(i = 0; i < UART_NUM; i++) { + if(huart == uart_handlers[i]) { + break; + } + } + + return i; +} + +/** + * @brief Rx Transfer completed callback + * @param UartHandle pointer on the uart reference + * @retval None + */ +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + uint8_t index = uart_index(huart); + + if(index < UART_NUM) { + rx_callback[index](rx_callback_obj[index]); + } +} + +/** + * @brief Tx Transfer completed callback + * @param UartHandle pointer on the uart reference + * @retval None + */ +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { + uint8_t index = uart_index(huart); + serial_t *obj = tx_callback_obj[index]; + + if(index < UART_NUM) { + if(tx_callback[index](obj) != -1) { + if (HAL_UART_Transmit_IT(uart_handlers[obj->index], &obj->tx_buff[obj->tx_tail], 1) != HAL_OK) { + return; + } + } + } +} + +/** + * @brief error callback from UART + * @param UartHandle pointer on the uart reference + * @retval None + */ +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + volatile uint32_t tmpval; +#ifdef STM32F4xx + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) { + tmpval = huart->Instance->DR; // Clear PE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) { + tmpval = huart->Instance->DR; // Clear FE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) { + tmpval = huart->Instance->DR; // Clear NE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) { + tmpval = huart->Instance->DR; // Clear ORE flag + } +#else + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) { + tmpval = huart->Instance->RDR; // Clear PE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) { + tmpval = huart->Instance->RDR; // Clear FE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) { + tmpval = huart->Instance->RDR; // Clear NE flag + } else if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) { + tmpval = huart->Instance->RDR; // Clear ORE flag + } +#endif + + UNUSED(tmpval); +} + +/** + * @brief USART 1 IRQ handler + * @param None + * @retval None + */ +void USART1_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(USART1_IRQn); + HAL_UART_IRQHandler(uart_handlers[0]); +} + +/** + * @brief USART 2 IRQ handler + * @param None + * @retval None + */ +void USART2_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(USART2_IRQn); + HAL_UART_IRQHandler(uart_handlers[1]); +} + +/** + * @brief USART 3 IRQ handler + * @param None + * @retval None + */ +#if defined(USART3_BASE) +void USART3_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(USART3_IRQn); + HAL_UART_IRQHandler(uart_handlers[2]); +} +#endif + +/** + * @brief UART 4 IRQ handler + * @param None + * @retval None + */ +#if defined(UART4_BASE) +void UART4_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(UART4_IRQn); + HAL_UART_IRQHandler(uart_handlers[3]); +} +#endif + +/** + * @brief USART 3 IRQ handler + * @param None + * @retval None + */ +#if defined(UART5_BASE) +void UART5_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(UART5_IRQn); + HAL_UART_IRQHandler(uart_handlers[4]); +} +#endif + +/** + * @brief USART 6 IRQ handler + * @param None + * @retval None + */ +#if defined(USART6_BASE) +void USART6_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(USART6_IRQn); + HAL_UART_IRQHandler(uart_handlers[5]); +} +#endif + +/** + * @brief UART 7 IRQ handler + * @param None + * @retval None + */ +#if defined(UART7_BASE) +void UART7_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(UART7_IRQn); + HAL_UART_IRQHandler(uart_handlers[6]); +} +#endif + +/** + * @brief UART 8 IRQ handler + * @param None + * @retval None + */ +#if defined(UART8_BASE) +void UART8_IRQHandler(void) +{ + HAL_NVIC_ClearPendingIRQ(UART8_IRQn); + HAL_UART_IRQHandler(uart_handlers[7]); +} +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/uart.h b/cores/arduino/stm32/uart.h new file mode 100644 index 0000000..ce7e447 --- /dev/null +++ b/cores/arduino/stm32/uart.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * @file uart.h + * @author WI6LABS + * @version V1.0.0 + * @date 01-August-2016 + * @brief Header for uart module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __UART_H +#define __UART_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "PeripheralPins.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +typedef struct serial_s serial_t; + +struct serial_s { + USART_TypeDef *uart; + UART_HandleTypeDef handle; + int index; + uint32_t baudrate; + uint32_t databits; + uint32_t stopbits; + uint32_t parity; + PinName pin_tx; + PinName pin_rx; + IRQn_Type irq; + uint8_t *rx_buff; + volatile uint16_t rx_head; + uint16_t rx_tail; + uint8_t *tx_buff; + uint16_t tx_head; + volatile uint16_t tx_tail; +}; + +/* Exported constants --------------------------------------------------------*/ +#define TX_TIMEOUT 1000 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void uart_init(serial_t *obj); +void uart_deinit(serial_t *obj); +size_t uart_write(serial_t *obj, uint8_t data, uint16_t size); +int uart_getc(serial_t *obj); +void uart_attach_rx_callback(serial_t *obj, void (*callback)(serial_t*)); +void uart_attach_tx_callback(serial_t *obj, int (*callback)(serial_t*)); + +uint8_t serial_tx_active(serial_t *obj); +uint8_t serial_rx_active(serial_t *obj); + +size_t uart_debug_write(uint8_t *data, uint32_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* __UART_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/uart_emul.c b/cores/arduino/stm32/uart_emul.c new file mode 100644 index 0000000..74234d7 --- /dev/null +++ b/cores/arduino/stm32/uart_emul.c @@ -0,0 +1,422 @@ +/** + ****************************************************************************** + * @file uart_emul.c + * @author WI6LABS + * @version V1.0.0 + * @date 25-April-2017 + * @brief provide the UART Emulation interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "hw_config.h" +#include "uart_emul.h" +#include "digital_io.h" +#include "interrupt.h" +#include "variant.h" + +#if defined(TIM1_BASE) && defined(UART_EMUL_RX) && defined(UART_EMUL_TX) +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/// @brief number of received characters +#define EMUL_TIMER_PERIOD 100 + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/// @brief defines the global attributes of the UART +typedef struct { + UART_Emul_TypeDef uartEmul_typedef; + PinName pin_tx; + PinName pin_rx; + void (*uart_rx_irqHandle)(void); + uint8_t rxpData[UART_RCV_SIZE]; + volatile uint32_t data_available; + volatile uint8_t begin; + volatile uint8_t end; + uart_option_e uart_option; + stimer_t *_timer; +}uart_emul_conf_t; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +/// @brief uart caracteristics +static UART_Emul_HandleTypeDef g_UartEmulHandle[NB_UART_EMUL_MANAGED]; + +static uart_emul_conf_t g_uartEmul_config[NB_UART_EMUL_MANAGED] = { + { + .uartEmul_typedef = {UART1_EMUL_E}, + .pin_tx = UART_EMUL_TX, .pin_rx = UART_EMUL_RX, + .uart_rx_irqHandle = NULL, + .data_available = 0, + .begin = 0, + .end = 0, + .uart_option = EMULATED_UART_E, + ._timer = NULL + } +}; + +//@brief just a simple buffer for the uart reception +uint8_t g_rx_data[1]; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ +static void uart_emul_timer_irq(stimer_t *obj) {g_uartEmul_config[UART1_EMUL_E].uart_rx_irqHandle();} + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/******************************* EMULATED UART ********************************/ +/** + * @brief Initializes the UART Emulation MSP. + * @param huart: UART Emulation Handle + * @retval None + */ +void HAL_UART_Emul_MspInit(UART_Emul_HandleTypeDef *huart) +{ + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_TypeDef *port_rx; + GPIO_TypeDef *port_tx; + + // Enable GPIO clock + port_rx = set_GPIO_Port_Clock(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_rx)); + port_tx = set_GPIO_Port_Clock(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_tx)); + + // Enable GPIO TX/RX clock + __UART_EMUL_CLK_ENABLE(); + + // Enable GPIO TX/RX clock + GPIO_InitStruct.Pin = STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_tx); + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + + // UART TX GPIO pin configuration + HAL_GPIO_Init(port_tx, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_rx); + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + + // UART RX GPIO pin configuration + HAL_GPIO_Init(port_rx, &GPIO_InitStruct); + stm32_interrupt_enable(port_rx, STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_rx), + UART_EMUL_EXTI_RX, GPIO_MODE_IT_FALLING); + /*HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);*/ +} + +/** + * @brief UART Emulation MSP DeInit. + * @param huart: UART Emulation handle + * @retval None + */ +void HAL_UART_Emul_MspDeInit(UART_Emul_HandleTypeDef *huart) +{ + GPIO_TypeDef *port_rx = get_GPIO_Port(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_rx)); + GPIO_TypeDef *port_tx = get_GPIO_Port(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_tx)); + + __UART_EMUL_CLK_DISABLE(); + + HAL_GPIO_DeInit(port_tx, STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_tx)); + HAL_GPIO_DeInit(port_rx, STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_rx)); + + stm32_interrupt_disable(port_rx, STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_rx)); +} + +/** + * @brief Function called to initialize the emulated uart interface + * @param serial_id : one of the defined serial interface + * @param baudRate : baudrate to apply to the uart : 4800 or 9600 //TODO bug if baud rate > 9600 + * @retval None + */ +void uart_emul_init(uart_emul_id_e uart_id, uint32_t baudRate) +{ + GPIO_TypeDef *port_tx = get_GPIO_Port(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_tx)); + if(uart_id>=NB_UART_EMUL_MANAGED) { + return; + } + + g_UartEmulHandle[uart_id].Init.Mode = UART_EMUL_MODE_TX_RX; + g_UartEmulHandle[uart_id].Init.BaudRate = baudRate; + g_UartEmulHandle[uart_id].Init.WordLength = UART_EMUL_WORDLENGTH_8B; + g_UartEmulHandle[uart_id].Init.StopBits = UART_EMUL_STOPBITS_1; + g_UartEmulHandle[uart_id].Init.Parity = UART_EMUL_PARITY_NONE; + g_UartEmulHandle[uart_id].Init.RxPinNumber = STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_rx); + g_UartEmulHandle[uart_id].Init.TxPinNumber = STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_tx); + g_UartEmulHandle[uart_id].RxPortName = get_GPIO_Port(STM_PORT(g_uartEmul_config[UART1_EMUL_E].pin_rx)); + g_UartEmulHandle[uart_id].TxPortName = port_tx; + + if(HAL_UART_Emul_Init(&g_UartEmulHandle[uart_id])!= HAL_OK) { + return; + } + + if (HAL_UART_Emul_Receive_DMA(&g_UartEmulHandle[uart_id], g_rx_data, 1) != HAL_OK) { + return; + } + + uart_emul_flush(uart_id); + + HAL_GPIO_WritePin(port_tx, STM_GPIO_PIN(g_uartEmul_config[UART1_EMUL_E].pin_tx), GPIO_PIN_SET); +} + +/** + * @brief Function called to deinitialize the emulated uart interface + * @param serial_id : one of the defined serial interface + * @retval None + */ +void uart_emul_deinit(uart_emul_id_e uart_id) +{ + if(uart_id>=NB_UART_EMUL_MANAGED) { + return; + } + + HAL_UART_Emul_DeInit(&g_UartEmulHandle[uart_id]); +} + +/** + * @brief Function returns the amount of data available + * @param serial_id : one of the defined serial interface + * @retval The number of serial data available - int + */ +int uart_emul_available(uart_emul_id_e uart_id) +{ + if(uart_id>=NB_UART_EMUL_MANAGED) { + return 0; + } + + return g_uartEmul_config[uart_id].data_available; +} + +/** + * @brief Return the first element of the rx buffer + * @param serial_id : one of the defined serial interface + * @retval The first byte of incoming serial data available (or -1 if no data is available) - int + */ +int8_t uart_emul_read(uart_emul_id_e uart_id) +{ + int8_t data = -1; + + if(uart_id>=NB_UART_EMUL_MANAGED) { + return data; + } + + if(g_uartEmul_config[uart_id].data_available > 0) { + + data = g_uartEmul_config[uart_id].rxpData[g_uartEmul_config[uart_id].begin++]; + + if(g_uartEmul_config[uart_id].begin >= UART_RCV_SIZE) { + g_uartEmul_config[uart_id].begin = 0; + } + + g_uartEmul_config[uart_id].data_available--; + } + + return data; +} + +/** + * @brief write the data on the uart + * @param serial_id : one of the defined serial interface + * @param data : byte to write + * @retval The number of bytes written + */ +size_t uart_emul_write(uart_emul_id_e uart_id, uint8_t data) +{ + if(uart_id>=NB_UART_EMUL_MANAGED) { + return 0; + } + + while(HAL_UART_Emul_Transmit_DMA(&g_UartEmulHandle[uart_id], &data, 1) != HAL_OK); + return 1; +} + +/** + * @brief Return the first element of the rx buffer without removing it from + * the buffer + * @param serial_id : one of the defined serial interface + * @retval The first byte of incoming serial data available (or -1 if no data is available) - int + */ +int8_t uart_emul_peek(uart_emul_id_e uart_id) +{ + int8_t data = -1; + + if(uart_id>=NB_UART_EMUL_MANAGED) { + return data; + } + + if(g_uartEmul_config[uart_id].data_available > 0) { + data = g_uartEmul_config[uart_id].rxpData[g_uartEmul_config[uart_id].begin]; + } + + return data; +} + +/** + * @brief Flush the content of the RX buffer + * @param serial_id : one of the defined serial interface + * @retval None + */ +void uart_emul_flush(uart_emul_id_e uart_id) +{ + if(uart_id>=NB_UART_EMUL_MANAGED) { + return; + } + + g_uartEmul_config[uart_id].data_available = 0; + g_uartEmul_config[uart_id].end = 0; + g_uartEmul_config[uart_id].begin = 0; +} + +/** + * @brief Read receive byte from uart + * @param UartHandle : pointer on the uart reference + * @param byte : byte to read + * @retval None + */ +static void uart_emul_getc(uart_emul_id_e uart_id, uint8_t byte) +{ + if((uart_id >= NB_UART_EMUL_MANAGED) || + (g_uartEmul_config[uart_id].data_available >= UART_RCV_SIZE)) { + return; + } + + g_uartEmul_config[uart_id].rxpData[g_uartEmul_config[uart_id].end++] = byte; + if(g_uartEmul_config[uart_id].end >= UART_RCV_SIZE) { + g_uartEmul_config[uart_id].end = 0; + } + g_uartEmul_config[uart_id].data_available++; +} + +/** + * @brief + * @param irq : pointer to function to call + * @retval None + */ +void uart_emul_attached_handler(stimer_t *obj, void (*irqHandle)(void)) +{ + obj->timer = TIMER_UART_EMULATED; + TimerHandleInit(obj, EMUL_TIMER_PERIOD - 1, (uint16_t)(HAL_RCC_GetHCLKFreq() / 1000) - 1); //50ms + g_uartEmul_config[UART1_EMUL_E].uart_rx_irqHandle = irqHandle; + g_uartEmul_config[UART1_EMUL_E]._timer = obj; + attachIntHandle(obj, uart_emul_timer_irq); +} + +/** + * @brief Initializes the UART Emulation Transfer Complete. + * @param huart: UART Emulation Handle + * @retval None + */ +void HAL_UART_Emul_RxCpltCallback(UART_Emul_HandleTypeDef *huart) +{ + uart_emul_getc(UART1_EMUL_E, *huart->pRxBuffPtr); + HAL_UART_Emul_Receive_DMA(&g_UartEmulHandle[UART1_EMUL_E], g_rx_data, 1); + + if(g_uartEmul_config[UART1_EMUL_E].uart_rx_irqHandle != NULL) { + if(uart_emul_available(UART1_EMUL_E) < (UART_RCV_SIZE / 2)) { + setTimerCounter(g_uartEmul_config[UART1_EMUL_E]._timer->timer, 0); + } + else if(uart_emul_available(UART1_EMUL_E) < (UART_RCV_SIZE/4*3)) { + setTimerCounter(g_uartEmul_config[UART1_EMUL_E]._timer->timer, EMUL_TIMER_PERIOD - 1); + } + else { + g_uartEmul_config[UART1_EMUL_E].uart_rx_irqHandle(); + } + } +} + +/*void HAL_UART_Emul_ErrorCallback(UART_Emul_HandleTypeDef *huart) +{ + printf("UART EMUL RX ERROR\n"); +}*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif +#endif //TIM1_BASE && UART_EMUL_RX && UART_EMUL_TX +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/uart_emul.h b/cores/arduino/stm32/uart_emul.h new file mode 100644 index 0000000..0ea5582 --- /dev/null +++ b/cores/arduino/stm32/uart_emul.h @@ -0,0 +1,82 @@ +/** + ****************************************************************************** + * @file uart_emul.h + * @author WI6LABS + * @version V1.0.0 + * @date 25-April-2017 + * @brief Header for uart emulation module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __UART_EMUL_H +#define __UART_EMUL_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" +#include "timer.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +typedef enum { + UART1_EMUL_E = 0, + NB_UART_EMUL_MANAGED +} uart_emul_id_e; + +typedef enum { + NATIVE_UART_E = 0, + EMULATED_UART_E = 1, + NB_UART_OPTION +} uart_option_e; + +/* Exported constants --------------------------------------------------------*/ +#define UART_RCV_SIZE 128 + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void uart_emul_init(uart_emul_id_e uart_id, uint32_t baudRate); +void uart_emul_deinit(uart_emul_id_e uart_id); +int uart_emul_available(uart_emul_id_e uart_id); +int8_t uart_emul_read(uart_emul_id_e uart_id); +size_t uart_emul_write(uart_emul_id_e uart_id, uint8_t data); +int8_t uart_emul_peek(uart_emul_id_e uart_id); +void uart_emul_flush(uart_emul_id_e uart_id); +void uart_emul_attached_handler(stimer_t *obj, void (*irqHandle)(void)); + +#ifdef __cplusplus +} +#endif + +#endif /* __UART_EMUL_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb_device_cdc.c b/cores/arduino/stm32/usb_device_cdc.c new file mode 100644 index 0000000..7090300 --- /dev/null +++ b/cores/arduino/stm32/usb_device_cdc.c @@ -0,0 +1,28 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifdef USBCON + +#ifdef USBD_USE_CDC +#include "usbd_cdc.c" +#endif // USBD_USE_CDC + +#endif //USBCON diff --git a/cores/arduino/stm32/usb_device_core.c b/cores/arduino/stm32/usb_device_core.c new file mode 100644 index 0000000..6b3f636 --- /dev/null +++ b/cores/arduino/stm32/usb_device_core.c @@ -0,0 +1,26 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifdef USBCON + +#include "usbd_core.c" + +#endif //USBCON diff --git a/cores/arduino/stm32/usb_device_ctlreq.c b/cores/arduino/stm32/usb_device_ctlreq.c new file mode 100644 index 0000000..b39b985 --- /dev/null +++ b/cores/arduino/stm32/usb_device_ctlreq.c @@ -0,0 +1,26 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifdef USBCON + +#include "usbd_ctlreq.c" + +#endif //USBCON diff --git a/cores/arduino/stm32/usb_device_ioreq.c b/cores/arduino/stm32/usb_device_ioreq.c new file mode 100644 index 0000000..be8041a --- /dev/null +++ b/cores/arduino/stm32/usb_device_ioreq.c @@ -0,0 +1,26 @@ +/* + * + * + * Copyright (C) 2017, STMicroelectronics - All Rights Reserved + * Author: YOUR NAME <> for STMicroelectronics. + * + * License type: GPLv2 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see + * . + */ +#ifdef USBCON + +#include "usbd_ioreq.c" + +#endif //USBCON diff --git a/cores/arduino/stm32/usb_interface.c b/cores/arduino/stm32/usb_interface.c new file mode 100644 index 0000000..73a222a --- /dev/null +++ b/cores/arduino/stm32/usb_interface.c @@ -0,0 +1,197 @@ +/** + ****************************************************************************** + * @file usb_interface.c + * @author WI6LABS + * @version V1.0.0 + * @date 27-October-2016 + * @brief provide the usb interface + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ +#include "usb_interface.h" + +/** + * @} + */ + +#ifdef __cplusplus + extern "C" { +#endif +#ifdef USBCON +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ +/* USB Device Core handle declaration */ +#ifdef USBD_USE_HID_COMPOSITE +static USBD_HandleTypeDef hUSBD_Device_HID; +#endif //USBD_USE_HID_COMPOSITE +#ifdef USBD_USE_CDC +volatile USBD_HandleTypeDef hUSBD_Device_CDC; +#endif //USBD_USE_CDC + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief initialize the USB HID interface + * @param HID_Desc : usb HID descriptor callbacks + * @retval none + */ +void usbd_interface_init(void) +{ +#ifdef USBD_USE_HID_COMPOSITE && USBD_USE_CDC +#error "Only one of USBD_USE_HID_COMPOSITE or USBD_USE_CDC could be defined!" +#endif +#ifdef USBD_USE_HID_COMPOSITE + /* Init Device Library */ + USBD_Init(&hUSBD_Device_HID, &HID_Desc, DEVICE_FS); + + /* Add Supported Class */ + USBD_RegisterClass(&hUSBD_Device_HID, USBD_COMPOSITE_HID_CLASS); + + /* Start Device Process */ + USBD_Start(&hUSBD_Device_HID); +#endif // USBD_USE_HID_COMPOSITE +#ifdef USBD_USE_CDC + /* Init Device Library */ + if (USBD_Init(&hUSBD_Device_CDC, &CDC_Desc, DEVICE_FS) == USBD_OK) { + + /* Add Supported Class */ + if (USBD_RegisterClass(&hUSBD_Device_CDC, USBD_CDC_CLASS) == USBD_OK) { + + /* Add CDC Interface Class */ + if (USBD_CDC_RegisterInterface(&hUSBD_Device_CDC, &USBD_Interface_fops_FS) == USBD_OK) { + + /* Start Device Process */ + USBD_Start(&hUSBD_Device_CDC); + } + } + } +#endif //USBD_USE_CDC + +} + +/** + * @brief initialize the USB HID interface + * @param HID_Desc : usb HID descriptor callbacks + * @retval none + */ +void usbd_interface_mouse_sendReport(uint8_t *report, uint16_t len) +{ +#ifdef USBD_USE_HID_COMPOSITE + USBD_HID_MOUSE_SendReport(&hUSBD_Device_HID, report, len); +#endif // USBD_USE_HID_COMPOSITE +} + +/** + * @brief initialize the USB HID interface + * @param HID_Desc : usb HID descriptor callbacks + * @retval none + */ +void usbd_interface_keyboard_sendReport(uint8_t *report, uint16_t len) +{ +#ifdef USBD_USE_HID_COMPOSITE + USBD_HID_KEYBOARD_SendReport(&hUSBD_Device_HID, report, len); +#endif // USBD_USE_HID_COMPOSITE +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif // USBCON +#ifdef __cplusplus +} +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb_interface.h b/cores/arduino/stm32/usb_interface.h new file mode 100644 index 0000000..d69d555 --- /dev/null +++ b/cores/arduino/stm32/usb_interface.h @@ -0,0 +1,69 @@ +/** + ****************************************************************************** + * @file usb_interface.h + * @author WI6LABS + * @version V1.0.0 + * @date 27-October-2016 + * @brief Header for usb interface + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_INTERFACE_H +#define __USB_INTERFACE_H +#ifdef USBCON + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_desc.h" +#include "usbd_hid_composite.h" +#include "usbd_cdc_if.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported variables --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void usbd_interface_init(void); + +void usbd_interface_mouse_sendReport(uint8_t *report, uint16_t len); +void usbd_interface_keyboard_sendReport(uint8_t *report, uint16_t len); + +#ifdef __cplusplus +} +#endif +#endif // USBCON + +#endif /* __USB_INTERFACE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usbd_cdc_if.c b/cores/arduino/stm32/usbd_cdc_if.c similarity index 69% rename from variants/otto/usb/usbd_cdc_if.c rename to cores/arduino/stm32/usbd_cdc_if.c index 2676ffd..4bbb4f2 100644 --- a/variants/otto/usb/usbd_cdc_if.c +++ b/cores/arduino/stm32/usbd_cdc_if.c @@ -29,7 +29,8 @@ * ****************************************************************************** */ - +#ifdef USBCON +#ifdef USBD_USE_CDC /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc_if.h" #include "stm32f4xx_hal.h" @@ -38,9 +39,6 @@ extern "C" { #endif -/* USER CODE BEGIN INCLUDE */ -/* USER CODE END INCLUDE */ - /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ @@ -53,8 +51,6 @@ /** @defgroup USBD_CDC_Private_TypesDefinitions * @{ */ -/* USER CODE BEGIN PRIVATE TYPES */ -/* USER CODE END PRIVATE TYPES */ /** * @} */ @@ -62,10 +58,8 @@ /** @defgroup USBD_CDC_Private_Defines * @{ */ -/* USER CODE BEGIN PRIVATE DEFINES */ /* Define size for the receive and transmit buffer over CDC */ /* It's up to user to redefine and/or remove those define */ -/* USER CODE END PRIVATE DEFINES */ /** * @} */ @@ -73,8 +67,6 @@ /** @defgroup USBD_CDC_Private_Macros * @{ */ -/* USER CODE BEGIN PRIVATE_MACRO */ -/* USER CODE END PRIVATE_MACRO */ /** * @} @@ -85,6 +77,7 @@ */ /* Create buffer for reception and transmission */ /* It's up to user to redefine and/or remove those define */ +extern USBD_HandleTypeDef hUSBD_Device_CDC; /* Received Data over USB are stored in this buffer */ __IO uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; __IO uint8_t StackRxBufferFS[APP_RX_DATA_SIZE]; @@ -114,21 +107,19 @@ uint8_t USBPackSize; /* Default configuration: 115200, 8N1 */ uint8_t lineSetup[] = {0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x08}; -#define CDC_POLLING_INTERVAL 1 /* in ms. The max is 65 and the min is 1 */ +#define CDC_POLLING_INTERVAL 2 /* in ms. The max is 65 and the min is 1 */ -TIM_HandleTypeDef TimHandle; +stimer_t TimHandle; volatile uint8_t dfu_request = 0; /* For a bug in some Linux 64 bit PC we need to delay the reset of the CPU of 500ms seconds */ -int counter_dfu_reset = 500; /* the unit is equal to CDC_POLLING_INTERVAL that is 1ms by default */ +int counter_dfu_reset = 250; /* the unit is equal to CDC_POLLING_INTERVAL that is 2ms by default */ static void TIM_Config(void); /* USB handler declaration */ /* Handle for USB Full Speed IP */ // USBD_HandleTypeDef *hUsbDevice_0; -/* USER CODE BEGIN PRIVATE_VARIABLES */ -/* USER CODE END PRIVATE VARIABLES */ /** * @} @@ -137,9 +128,6 @@ static void TIM_Config(void); /** @defgroup USBD_CDC_IF_Exported_Variables * @{ */ -extern USBD_HandleTypeDef hUsbDeviceFS; -/* USER CODE BEGIN EXPORTED_VARIABLES */ -/* USER CODE END EXPORTED_VARIABLES */ /** * @} @@ -153,9 +141,6 @@ static int8_t CDC_DeInit_FS (void); static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length); static int8_t CDC_Receive_FS (uint8_t* pbuf, uint32_t *Len); -/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ -/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ - /** * @} */ @@ -177,19 +162,14 @@ USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = */ static int8_t CDC_Init_FS(void) { - /*##-3- Configure the TIM Base generation #################################*/ + /*##-3- Configure and start the TIM Base generation #################################*/ TIM_Config(); - /*##-4- Start the TIM Base generation in interrupt mode ####################*/ - /* Start Channel1 */ - HAL_TIM_Base_Start_IT(&TimHandle); -// /* USER CODE BEGIN 3 */ -// /* Set Application Buffers */ - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 1); - USBD_CDC_SetRxBuffer(&hUsbDeviceFS, StackRxBufferFS); + /* Set Application Buffers */ + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, UserTxBufferFS, 1); + USBD_CDC_SetRxBuffer(&hUSBD_Device_CDC, StackRxBufferFS); return (USBD_OK); - /* USER CODE END 3 */ } /** @@ -200,9 +180,7 @@ static int8_t CDC_Init_FS(void) */ static int8_t CDC_DeInit_FS(void) { - /* USER CODE BEGIN 4 */ return (USBD_OK); - /* USER CODE END 4 */ } /** @@ -215,7 +193,6 @@ static int8_t CDC_DeInit_FS(void) */ static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length) { - /* USER CODE BEGIN 5 */ switch (cmd) { case CDC_SEND_ENCAPSULATED_COMMAND: @@ -257,11 +234,9 @@ static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length) /*******************************************************************************/ case CDC_SET_LINE_CODING: memcpy(lineSetup, pbuf, 7); - if(*((uint32_t*)pbuf) == 1200){ dfu_request = 1; } - break; case CDC_GET_LINE_CODING: @@ -283,7 +258,6 @@ static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length) } return (USBD_OK); - /* USER CODE END 5 */ } /** @@ -304,15 +278,12 @@ static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length) static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) { - /* USER CODE BEGIN 6 */ /* Initiate next USB packet transfer once a packet is received */ USBPackSize = *Len; memcpy(USBBuffer, Buf, USBPackSize); USB_received = 1; - return (USBD_OK); - /* USER CODE END 6 */ } /** @@ -329,11 +300,8 @@ static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result = USBD_OK; - /* USER CODE BEGIN 7 */ - //USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len); - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 1); - result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - /* USER CODE END 7 */ + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, UserTxBufferFS, 1); + result = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); return result; } @@ -341,40 +309,44 @@ void CDC_flush(void) { uint8_t status; - if(UserTxBufPtrOut != UserTxBufPtrIn) + if (!(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))) { - if(UserTxBufPtrOut > UserTxBufPtrIn) /* Roll-back */ + if(UserTxBufPtrOut != UserTxBufPtrIn) { - memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut)); + if(UserTxBufPtrOut > UserTxBufPtrIn) /* Roll-back */ + { + memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut)); - memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn); + memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn); - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&StackTxBufferFS[0], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn)); + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&StackTxBufferFS[0], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn)); - do - { - status = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - } while(status == USBD_BUSY); + do { + status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); + } while(status == USBD_BUSY && !(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))); - if(status == USBD_OK) - { - UserTxBufPtrOut = UserTxBufPtrIn; + if(status == USBD_OK) + { + UserTxBufPtrOut = UserTxBufPtrIn; + } } - } - else - { - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (UserTxBufPtrIn - UserTxBufPtrOut)); - - do + else { - status = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - } while(status == USBD_BUSY); + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (UserTxBufPtrIn - UserTxBufPtrOut)); - if(status == USBD_OK) - { - UserTxBufPtrOut = UserTxBufPtrIn; + do { + status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); + } while(status == USBD_BUSY && !(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))); + + if(status == USBD_OK) + { + UserTxBufPtrOut = UserTxBufPtrIn; + } } } + } else + { + UserTxBufPtrOut = UserTxBufPtrIn; } } @@ -391,113 +363,84 @@ void CDC_enable_TIM_Interrupt(void) static void TIM_Config(void) { /* Set TIMx instance */ - TimHandle.Instance = TIM6; - + TimHandle.timer = TIM6; /* Initialize TIM6 peripheral as follow: + Period = 10000 - 1 + Prescaler = ((SystemCoreClock/2)/10000) - 1 + ClockDivision = 0 + Counter direction = Up */ - TimHandle.Init.Period = (CDC_POLLING_INTERVAL*1000) - 1; - TimHandle.Init.Prescaler = 84-1; - TimHandle.Init.ClockDivision = 0; - TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandleInit(&TimHandle, (uint16_t)((CDC_POLLING_INTERVAL*1000) - 1), ((uint32_t)(getTimerClkFreq(TIM6) / (1000000)) - 1)); //CDC_POLLING_INTERVAL - /*##-6- Enable TIM peripherals Clock #######################################*/ - __HAL_RCC_TIM6_CLK_ENABLE(); - - /*##-7- Configure the NVIC for TIMx ########################################*/ - /* Set Interrupt Group Priority */ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 6, 0); - /* Enable the TIMx global Interrupt */ - HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); - - HAL_TIM_Base_Init(&TimHandle); + timer_attach_interrupt_handle(&TimHandle.handle, TIM6_PeriodElapsedCallback); } -void __irq_tim6(void) -{ - HAL_TIM_IRQHandler(&TimHandle); -} - -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +void TIM6_PeriodElapsedCallback(stimer_t *htim) { uint8_t status; - if(dfu_request) - { + if(dfu_request) { counter_dfu_reset--; - if(counter_dfu_reset == 0) - { + if(counter_dfu_reset == 0) { dfu_request = 0; /* Set magic number in SRAM so application enters DFU after reset */ *((unsigned int*)0x2004FFF0) = 0xb311a21a; NVIC_SystemReset(); } } - - if(USB_received) - { + if(USB_received) { USB_received = 0; - if((USBPackSize > 0)) - { - if(UserRxBufPtrIn + USBPackSize > APP_RX_DATA_SIZE) - { + if((USBPackSize > 0)) { + if(UserRxBufPtrIn + USBPackSize > APP_RX_DATA_SIZE) { memcpy(&UserRxBufferFS[UserRxBufPtrIn], &USBBuffer[0], (APP_RX_DATA_SIZE - UserRxBufPtrIn)); memcpy(&UserRxBufferFS[0], &USBBuffer[(APP_RX_DATA_SIZE - UserRxBufPtrIn)], (USBPackSize - (APP_RX_DATA_SIZE - UserRxBufPtrIn))); UserRxBufPtrIn = ((UserRxBufPtrIn + USBPackSize) % APP_RX_DATA_SIZE); - } else - { + } else { memcpy(&UserRxBufferFS[UserRxBufPtrIn], USBBuffer, USBPackSize); UserRxBufPtrIn = ((UserRxBufPtrIn + USBPackSize) % APP_RX_DATA_SIZE); } } - USBD_CDC_ReceivePacket(&hUsbDeviceFS); + USBD_CDC_ReceivePacket(&hUSBD_Device_CDC); } - if(UserTxBufPtrOut != UserTxBufPtrIn) - { - if(UserTxBufPtrOut > UserTxBufPtrIn) /* Roll-back */ - { - memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut)); + if (!(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))) { + if(UserTxBufPtrOut != UserTxBufPtrIn) { + if(UserTxBufPtrOut > UserTxBufPtrIn) { /* Roll-back */ + memcpy((uint8_t*)&StackTxBufferFS[0], (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (APP_TX_DATA_SIZE - UserTxBufPtrOut)); - memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn); + memcpy((uint8_t*)&StackTxBufferFS[APP_TX_DATA_SIZE - UserTxBufPtrOut], (uint8_t*)&UserTxBufferFS[0], UserTxBufPtrIn); - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&StackTxBufferFS[0], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn)); - do - { - status = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - } while(status == USBD_BUSY); + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&StackTxBufferFS[0], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn)); - if(status == USBD_OK) - { - UserTxBufPtrOut = UserTxBufPtrIn; + do { + status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); + } while(status == USBD_BUSY && !(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))); + + if(status == USBD_OK) { + UserTxBufPtrOut = UserTxBufPtrIn; + } } - } - else - { - USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (UserTxBufPtrIn - UserTxBufPtrOut)); + else { + USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, (uint8_t*)&UserTxBufferFS[UserTxBufPtrOut], (UserTxBufPtrIn - UserTxBufPtrOut)); - do - { - status = USBD_CDC_TransmitPacket(&hUsbDeviceFS); - } while(status == USBD_BUSY); + do { + status = USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); + } while(status == USBD_BUSY && !(((&hUSBD_Device_CDC)->dev_state != USBD_STATE_CONFIGURED) || ((&hUSBD_Device_CDC)->ep0_state == USBD_EP0_STATUS_IN))); - if(status == USBD_OK) - { - UserTxBufPtrOut = UserTxBufPtrIn; + if(status == USBD_OK) { + UserTxBufPtrOut = UserTxBufPtrIn; + } } } + } else { + UserTxBufPtrOut = UserTxBufPtrIn; } } -/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ -/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ - /** * @} */ @@ -505,9 +448,9 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) /** * @} */ - #ifdef __cplusplus } #endif - +#endif // USBD_USE_CDC +#endif // USBCON /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usbd_cdc_if.h b/cores/arduino/stm32/usbd_cdc_if.h similarity index 85% rename from variants/otto/usb/usbd_cdc_if.h rename to cores/arduino/stm32/usbd_cdc_if.h index d7aa4a9..20a9e8b 100644 --- a/variants/otto/usb/usbd_cdc_if.h +++ b/cores/arduino/stm32/usbd_cdc_if.h @@ -34,13 +34,14 @@ #ifndef __USBD_CDC_IF_H #define __USBD_CDC_IF_H +#ifdef USBCON + #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc.h" -/* USER CODE BEGIN INCLUDE */ -/* USER CODE END INCLUDE */ +#include "timer.h" /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ @@ -54,8 +55,6 @@ /** @defgroup USBD_CDC_IF_Exported_Defines * @{ */ -/* USER CODE BEGIN EXPORTED_DEFINES */ -/* USER CODE END EXPORTED_DEFINES */ #define APP_RX_DATA_SIZE 256 #define APP_TX_DATA_SIZE 256 @@ -66,8 +65,6 @@ /** @defgroup USBD_CDC_IF_Exported_Types * @{ */ -/* USER CODE BEGIN EXPORTED_TYPES */ -/* USER CODE END EXPORTED_TYPES */ /** * @} @@ -76,21 +73,16 @@ /** @defgroup USBD_CDC_IF_Exported_Macros * @{ */ -/* USER CODE BEGIN EXPORTED_MACRO */ -/* USER CODE END EXPORTED_MACRO */ /** * @} */ -/** @defgroup USBD_AUDIO_IF_Exported_Variables +/** @defgroup USBD_CDC_IF_Exported_Variables * @{ */ extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; -/* USER CODE BEGIN EXPORTED_VARIABLES */ -/* USER CODE END EXPORTED_VARIABLES */ - /** * @} */ @@ -103,9 +95,8 @@ uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); void CDC_flush(void); void CDC_disable_TIM_Interrupt(void); void CDC_enable_TIM_Interrupt(void); +void TIM6_PeriodElapsedCallback(stimer_t *htim); -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ -/* USER CODE END EXPORTED_FUNCTIONS */ /** * @} */ @@ -117,11 +108,10 @@ void CDC_enable_TIM_Interrupt(void); /** * @} */ - #ifdef __cplusplus } #endif - +#endif // USBCON #endif /* __USBD_CDC_IF_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usbd_hid_composite.c b/cores/arduino/stm32/usbd_hid_composite.c new file mode 100644 index 0000000..c9f28a5 --- /dev/null +++ b/cores/arduino/stm32/usbd_hid_composite.c @@ -0,0 +1,746 @@ +/** + ****************************************************************************** + * @file usbd_hid.c + * @author MCD Application Team + * @version V2.4.2 + * @date 11-December-2015 + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * HID Class Description + * =================================================================== + * This module manages the HID class V1.11 following the "Device Class Definition + * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". + * This driver implements the following aspects of the specification: + * - The Boot Interface Subclass + * - The Mouse protocol + * - Usage Page : Generic Desktop + * - Usage : Joystick + * - Collection : Application + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 + * + * 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. + * + ****************************************************************************** + */ + +#ifdef USBCON +#ifdef USBD_USE_HID_COMPOSITE + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_hid_composite.h" +#include "usbd_desc.h" +#include "usbd_ctlreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_HID + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_HID_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Macros + * @{ + */ +/** + * @} + */ + + + + +/** @defgroup USBD_HID_Private_FunctionPrototypes + * @{ + */ + +static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_HID_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_COMPOSITE_HID_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t USBD_HID_MOUSE_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t USBD_HID_KEYBOARD_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t *USBD_HID_GetCfgDesc (uint16_t *length); + +static uint8_t *USBD_HID_GetDeviceQualifierDesc (uint16_t *length); + +static uint8_t USBD_HID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); +/** + * @} + */ + +/** @defgroup USBD_HID_Private_Variables + * @{ + */ + +USBD_ClassTypeDef USBD_COMPOSITE_HID = +{ + USBD_HID_Init, + USBD_HID_DeInit, + USBD_COMPOSITE_HID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_HID_DataIn, /*DataIn*/ + NULL, /*DataOut*/ + NULL, /*SOF */ + NULL, + NULL, + USBD_HID_GetCfgDesc, + USBD_HID_GetCfgDesc, + USBD_HID_GetCfgDesc, + USBD_HID_GetDeviceQualifierDesc, +}; + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_COMPOSITE_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + LOBYTE(USB_COMPOSITE_HID_CONFIG_DESC_SIZ), /* wTotalLength bytes*/ + HIBYTE(USB_COMPOSITE_HID_CONFIG_DESC_SIZ), + 0x02, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + + + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + HID_MOUSE_INTERFACE, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x01, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + + HID_MOUSE_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_MOUSE_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */ + 0x00, + HID_FS_BINTERVAL, /*bInterval: Polling Interval (10 ms)*/ + + /******************************************************************** + Keyboard + *********************************************************************/ + /************** Descriptor of HID Keyboard interface ****************/ + /* 34 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + HID_KEYBOARD_INTERFACE, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x01, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0x00, /*iInterface: Index of string descriptor*/ + /******************** HID Descriptor ********************/ + /* 43 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_KEYBOARD_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Keyboard endpoint ********************/ + /* 52 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + HID_KEYBOARD_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_KEYBOARD_EPIN_SIZE, /*wMaxPacketSize: 8 Byte max */ + 0x00, + HID_FS_BINTERVAL /*bInterval: Polling Interval (10 ms)*/ + /* 59 */ +} ; + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_MOUSE_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END = +{ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00 +}; + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_KEYBOARD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END = +{ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_KEYBOARD_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x05, 0x01, + 0x09, 0x02, + 0xA1, 0x01, + 0x09, 0x01, + + 0xA1, 0x00, + 0x05, 0x09, + 0x19, 0x01, + 0x29, 0x03, + + 0x15, 0x00, + 0x25, 0x01, + 0x95, 0x03, + 0x75, 0x01, + + 0x81, 0x02, + 0x95, 0x01, + 0x75, 0x05, + 0x81, 0x01, + + 0x05, 0x01, + 0x09, 0x30, + 0x09, 0x31, + 0x09, 0x38, + + 0x15, 0x81, + 0x25, 0x7F, + 0x75, 0x08, + 0x95, 0x03, + + 0x81, 0x06, + 0xC0, 0x09, + 0x3c, 0x05, + 0xff, 0x09, + + 0x01, 0x15, + 0x00, 0x25, + 0x01, 0x75, + 0x01, 0x95, + + 0x02, 0xb1, + 0x22, 0x75, + 0x06, 0x95, + 0x01, 0xb1, + + 0x01, 0xc0 +}; + +__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection (Application) + + 0x05, 0x07, // Usage Page (Key Codes) + 0x19, 0xE0, // Usage Minimum (224) + 0x29, 0xE7, // Usage Maximum (231) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x02, // Logical Maximum (2) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data, Variable, Absolute) + + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input (Constant) + + 0x05, 0x07, // Usage Page (Key Codes) + 0x19, 0x00, // Usage Minimum (0) + 0x29, 0x65, // Usage Maximum (101) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum(101) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x81, 0x00, // Input (Data, Array) + + 0xC0 // End Collection +}; + +/** + * @} + */ + +/** @defgroup USBD_HID_Private_Functions + * @{ + */ + +/** + * @brief USBD_HID_Init + * Initialize the HID interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + uint8_t ret = 0; + + /* Open EP IN */ + USBD_LL_OpenEP(pdev, + HID_MOUSE_EPIN_ADDR, + USBD_EP_TYPE_INTR, + HID_MOUSE_EPIN_SIZE); + + /* Open EP IN */ + USBD_LL_OpenEP(pdev, + HID_KEYBOARD_EPIN_ADDR, + USBD_EP_TYPE_INTR, + HID_KEYBOARD_EPIN_SIZE); + + pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef)); + + if(pdev->pClassData == NULL) + { + ret = 1; + } + else + { + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->Mousestate = HID_IDLE; + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->Keyboardstate = HID_IDLE; + } + return ret; +} + +/** + * @brief USBD_HID_Init + * DeInitialize the HID layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_DeInit (USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + /* Close HID EPs */ + USBD_LL_CloseEP(pdev, + HID_MOUSE_EPIN_ADDR); + + USBD_LL_CloseEP(pdev, + HID_KEYBOARD_EPIN_ADDR); + + /* FRee allocated memory */ + if(pdev->pClassData != NULL) + { + USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + + return USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_HID_Setup + * Handle the HID specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_COMPOSITE_HID_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + /* Check which interface is targetted by this request */ + if ((req->wIndex & 0x00FF) == HID_KEYBOARD_INTERFACE) + { + return USBD_HID_KEYBOARD_Setup (pdev, req); + } + else + { + return USBD_HID_MOUSE_Setup (pdev, req); + } +} + +/** + * @brief USBD_HID_MOUSE_Setup + * Handle the HID specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_HID_MOUSE_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + uint16_t len = 0; + uint8_t *pbuf = NULL; + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*) pdev->pClassData; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + + + case HID_REQ_SET_PROTOCOL: + hhid->Protocol = (uint8_t)(req->wValue); + break; + + case HID_REQ_GET_PROTOCOL: + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->Protocol, + 1); + break; + + case HID_REQ_SET_IDLE: + hhid->IdleState = (uint8_t)(req->wValue >> 8); + break; + + case HID_REQ_GET_IDLE: + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->IdleState, + 1); + break; + + default: + USBD_CtlError (pdev, req); + return USBD_FAIL; + } + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( req->wValue >> 8 == HID_REPORT_DESC) + { + len = MIN(HID_MOUSE_REPORT_DESC_SIZE , req->wLength); + pbuf = HID_MOUSE_ReportDesc; + } + else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) + { + pbuf = USBD_MOUSE_HID_Desc; + len = MIN(USB_HID_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->AltSetting, + 1); + break; + + case USB_REQ_SET_INTERFACE : + hhid->AltSetting = (uint8_t)(req->wValue); + break; + } + } + return USBD_OK; +} + +/** + * @brief USBD_HID_KEYBOARD_Setup + * Handle the HID specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_HID_KEYBOARD_Setup (USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + uint16_t len = 0; + uint8_t *pbuf = NULL; + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*) pdev->pClassData; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + + + case HID_REQ_SET_PROTOCOL: + hhid->Protocol = (uint8_t)(req->wValue); + break; + + case HID_REQ_GET_PROTOCOL: + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->Protocol, + 1); + break; + + case HID_REQ_SET_IDLE: + hhid->IdleState = (uint8_t)(req->wValue >> 8); + break; + + case HID_REQ_GET_IDLE: + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->IdleState, + 1); + break; + + default: + USBD_CtlError (pdev, req); + return USBD_FAIL; + } + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( req->wValue >> 8 == HID_REPORT_DESC) + { + len = MIN(HID_KEYBOARD_REPORT_DESC_SIZE , req->wLength); + pbuf = HID_KEYBOARD_ReportDesc; + } + else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE) + { + pbuf = USBD_MOUSE_HID_Desc; + len = MIN(USB_HID_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&hhid->AltSetting, + 1); + break; + + case USB_REQ_SET_INTERFACE : + hhid->AltSetting = (uint8_t)(req->wValue); + break; + } + } + return USBD_OK; +} + +/** + * @brief USBD_HID_SendReport + * Send HID Report + * @param pdev: device instance + * @param buff: pointer to report + * @retval status + */ +uint8_t USBD_HID_MOUSE_SendReport (USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len) +{ + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData; + + if (pdev->dev_state == USBD_STATE_CONFIGURED ) + { + if(hhid->Mousestate == HID_IDLE) + { + hhid->Mousestate = HID_BUSY; + USBD_LL_Transmit (pdev, + HID_MOUSE_EPIN_ADDR, + report, + len); + } + } + return USBD_OK; +} + +/** + * @brief USBD_HID_SendReport + * Send HID Report + * @param pdev: device instance + * @param buff: pointer to report + * @retval status + */ +uint8_t USBD_HID_KEYBOARD_SendReport (USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len) +{ + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData; + + if (pdev->dev_state == USBD_STATE_CONFIGURED ) + { + if(hhid->Keyboardstate == HID_IDLE) + { + hhid->Keyboardstate = HID_BUSY; + USBD_LL_Transmit (pdev, + HID_KEYBOARD_EPIN_ADDR, + report, + len); + } + } + return USBD_OK; +} + +/** + * @brief USBD_HID_GetPollingInterval + * return polling interval from endpoint descriptor + * @param pdev: device instance + * @retval polling interval + */ +uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev) +{ + uint32_t polling_interval = 0; + + /* HIGH-speed endpoints */ + if(pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Sets the data transfer polling interval for high speed transfers. + Values between 1..16 are allowed. Values correspond to interval + of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */ + polling_interval = (((1 <<(HID_HS_BINTERVAL - 1)))/8); + } + else /* LOW and FULL-speed endpoints */ + { + /* Sets the data transfer polling interval for low and full + speed transfers */ + polling_interval = HID_FS_BINTERVAL; + } + + return ((uint32_t)(polling_interval)); +} + +/** + * @brief USBD_HID_GetCfgDesc + * return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_HID_GetCfgDesc (uint16_t *length) +{ + *length = sizeof (USBD_HID_CfgDesc); + return USBD_HID_CfgDesc; +} + + +/** + * @brief USBD_HID_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_HID_DataIn (USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + + /* Ensure that the FIFO is empty before a new transfer, this condition could + be caused by a new transfer before the end of the previous transfer */ + if(epnum == (HID_KEYBOARD_EPIN_ADDR & 0x7F)) + { + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->Keyboardstate = HID_IDLE; + } + else if(epnum == (HID_MOUSE_EPIN_ADDR & 0x7F)) + { + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->Mousestate = HID_IDLE; + } + return USBD_OK; +} + + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +static uint8_t *USBD_HID_GetDeviceQualifierDesc (uint16_t *length) +{ + *length = sizeof (USBD_HID_DeviceQualifierDesc); + return USBD_HID_DeviceQualifierDesc; +} +#endif // USBD_USE_HID_COMPOSITE +#endif // USBCON +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usbd_hid_composite.h b/cores/arduino/stm32/usbd_hid_composite.h new file mode 100644 index 0000000..39d870f --- /dev/null +++ b/cores/arduino/stm32/usbd_hid_composite.h @@ -0,0 +1,160 @@ +/** + ****************************************************************************** + * @file usbd_hid.h + * @author MCD Application Team + * @version V2.4.2 + * @date 11-December-2015 + * @brief Header file for the usbd_hid_core.c file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 + * + * 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_HID_COMPOSITE_H +#define __USB_HID_COMPOSITE_H + +#ifdef USBCON +#ifdef USBD_USE_HID_COMPOSITE + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ +/** @defgroup USBD_HID + * @brief This file is the Header file for usbd_hid.c + * @{ + */ + + +/** @defgroup USBD_HID_Exported_Defines + * @{ + */ +#define USB_COMPOSITE_HID_CONFIG_DESC_SIZ 59 + +#define HID_MOUSE_INTERFACE 0x00 +#define HID_KEYBOARD_INTERFACE 0x01 + +#define HID_MOUSE_EPIN_ADDR 0x81 +#define HID_MOUSE_EPIN_SIZE 0x04 + +#define HID_KEYBOARD_EPIN_ADDR 0x82 +#define HID_KEYBOARD_EPIN_SIZE 0x08 + +#define USB_HID_DESC_SIZ 9 +#define HID_MOUSE_REPORT_DESC_SIZE 74 +#define HID_KEYBOARD_REPORT_DESC_SIZE 45 + +#define HID_DESCRIPTOR_TYPE 0x21 +#define HID_REPORT_DESC 0x22 + +#define HID_HS_BINTERVAL 0x07 +#define HID_FS_BINTERVAL 0x0A +#define HID_POLLING_INTERVAL 0x0A + +#define HID_REQ_SET_PROTOCOL 0x0B +#define HID_REQ_GET_PROTOCOL 0x03 + +#define HID_REQ_SET_IDLE 0x0A +#define HID_REQ_GET_IDLE 0x02 + +#define HID_REQ_SET_REPORT 0x09 +#define HID_REQ_GET_REPORT 0x01 +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ +typedef enum +{ + HID_IDLE = 0, + HID_BUSY, +} +HID_StateTypeDef; + + +typedef struct +{ + uint32_t Protocol; + uint32_t IdleState; + uint32_t AltSetting; + HID_StateTypeDef Mousestate; + HID_StateTypeDef Keyboardstate; +} +USBD_HID_HandleTypeDef; +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_ClassTypeDef USBD_COMPOSITE_HID; +#define USBD_COMPOSITE_HID_CLASS &USBD_COMPOSITE_HID +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t USBD_HID_MOUSE_SendReport (USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len); +uint8_t USBD_HID_KEYBOARD_SendReport (USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len); + +uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev); + +#ifdef __cplusplus +} +#endif + +#endif // USBD_USE_HID_COMPOSITE +#endif // USBCON +#endif /* __USB_HID_COMPOSITE_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/syscalls.c b/cores/arduino/syscalls.c deleted file mode 100755 index a33eaa4..0000000 --- a/cores/arduino/syscalls.c +++ /dev/null @@ -1,171 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file syscalls.c - * @brief Low level system routines used by Newlib for basic I/O and - * memory allocation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" - -#include -#include - -/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then - * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by - * the linker */ -#ifndef CONFIG_HEAP_START -extern char _lm_heap_start; -#define CONFIG_HEAP_START ((caddr_t)&_lm_heap_start) -#endif -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) -#endif - -/* - * _sbrk -- Increment the program break. - * - * Get incr bytes more RAM (for use by the heap). malloc() and - * friends call this function behind the scenes. - */ -caddr_t _sbrk(int incr) { - static caddr_t pbreak = NULL; /* current program break */ - caddr_t ret; - - if (pbreak == NULL) { - pbreak = CONFIG_HEAP_START; - } - - if ((CONFIG_HEAP_END - pbreak < incr) || - (pbreak - CONFIG_HEAP_START < -incr)) { - errno = ENOMEM; - return (caddr_t)-1; - } - - ret = pbreak; - pbreak += incr; - return ret; -} - -int _open(const char *path, int flags, ...) { - return 1; -} - -int _close(int fd) { - return 0; -} - -int _fstat(int fd, struct stat *st) { - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int fd) { - return 1; -} - -int isatty(int fd) { - return 1; -} - -int _lseek(int fd, off_t pos, int whence) { - return -1; -} - -unsigned char getch(void) { - return 0; -} - - -int _read(int fd, char *buf, size_t cnt) { - *buf = getch(); - - return 1; -} - -void putch(unsigned char c) { -} - -void cgets(char *s, int bufsize) { - char *p; - int c; - int i; - - for (i = 0; i < bufsize; i++) { - *(s+i) = 0; - } - - p = s; - - for (p = s; p < s + bufsize-1;) { - c = getch(); - switch (c) { - case '\r' : - case '\n' : - putch('\r'); - putch('\n'); - *p = '\n'; - return; - - case '\b' : - if (p > s) { - *p-- = 0; - putch('\b'); - putch(' '); - putch('\b'); - } - break; - - default : - putch(c); - *p++ = c; - break; - } - } - return; -} - -int _write(int fd, const char *buf, size_t cnt) { - int i; - - for (i = 0; i < cnt; i++) - putch(buf[i]); - - return cnt; -} - -/* Override fgets() in newlib with a version that does line editing */ -char *fgets(char *s, int bufsize, void *f) { - cgets(s, bufsize); - return s; -} diff --git a/cores/arduino/syscalls.h b/cores/arduino/syscalls.h new file mode 100644 index 0000000..845b4b5 --- /dev/null +++ b/cores/arduino/syscalls.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * \file syscalls.h + * + * Implementation of newlib syscall. + * + */ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ +#include +#include +#include +#include + +/*---------------------------------------------------------------------------- + * Exported functions + *----------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif + +extern caddr_t _sbrk( int incr ) ; + +extern int link( char *cOld, char *cNew ) ; + +extern int _close( int file ) ; + +extern int _fstat( int file, struct stat *st ) ; + +extern int _isatty( int file ) ; + +extern int _lseek( int file, int ptr, int dir ) ; + +extern int _read(int file, char *ptr, int len) ; + +extern int _write( int file, char *ptr, int len ) ; + +#ifdef __cplusplus +} +#endif + diff --git a/cores/arduino/syscalls_stm32.c b/cores/arduino/syscalls_stm32.c new file mode 100644 index 0000000..960d95b --- /dev/null +++ b/cores/arduino/syscalls_stm32.c @@ -0,0 +1,135 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/** + * \file syscalls_sam3.c + * + * Implementation of newlib syscall. + * + */ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + + +#include "syscalls.h" + +#include +#include +#if defined ( __GNUC__ ) /* GCC CS3 */ + #include + #include +#endif + +#include "Arduino.h" + +// Helper macro to mark unused parameters and prevent compiler warnings. +// Appends _UNUSED to the variable name to prevent accidentally using them. +#ifdef __GNUC__ +#define UNUSED(x) x ## _UNUSED __attribute__((__unused__)) +#else +#define UNUSED(x) x ## _UNUSED +#endif + +/*---------------------------------------------------------------------------- + * Exported variables + *----------------------------------------------------------------------------*/ + +#undef errno +extern int errno ; +extern int _end ; + +/*---------------------------------------------------------------------------- + * Exported functions + *----------------------------------------------------------------------------*/ +extern void _exit( int status ) ; +extern void _kill( int pid, int sig ) ; +extern int _getpid ( void ) ; + +extern caddr_t _sbrk ( int incr ) +{ + static unsigned char *heap = NULL ; + unsigned char *prev_heap ; + + if ( heap == NULL ) + { + heap = (unsigned char *)&_end ; + } + prev_heap = heap; + + heap += incr ; + + return (caddr_t) prev_heap ; +} + +extern int link( UNUSED(char *cOld), UNUSED(char *cNew) ) +{ + return -1 ; +} + +extern int _close( UNUSED(int file) ) +{ + return -1 ; +} + +extern int _fstat( UNUSED(int file), struct stat *st ) +{ + st->st_mode = S_IFCHR ; + + return 0 ; +} + +extern int _isatty( UNUSED(int file) ) +{ + return 1 ; +} + +extern int _lseek( UNUSED(int file), UNUSED(int ptr), UNUSED(int dir) ) +{ + return 0 ; +} + +extern int _read(UNUSED(int file), UNUSED(char *ptr), UNUSED(int len) ) +{ + return 0 ; +} + +extern int _write( UNUSED(int file), char *ptr, int len ) +{ + uart_debug_write(ptr, len); + + return len ; +} + +extern void _exit( int status ) +{ + printf( "Exiting with status %d.\n", status ) ; + + for ( ; ; ) ; +} + +extern void _kill( UNUSED(int pid), UNUSED(int sig) ) +{ + return ; +} + +extern int _getpid ( void ) +{ + return -1 ; +} diff --git a/cores/arduino/systick.c b/cores/arduino/systick.c deleted file mode 100755 index bc19b61..0000000 --- a/cores/arduino/systick.c +++ /dev/null @@ -1,94 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file systick.c - * @brief System timer interrupt handler and initialization routines - */ - -#include "systick.h" -#include "nvic.h" -volatile uint32 systick_uptime_millis; -static void (*systick_user_callback)(void); - -/** - * @brief Initialize and enable SysTick. - * - * Clocks the system timer with the core clock, turns it on, and - * enables interrupts. - * - * @param reload_val Appropriate reload counter to tick every 1 ms. - */ -void systick_init(uint32 reload_val) { - SYSTICK_BASE->RVR = reload_val; - systick_enable(); -} - -/** - * Clock the system timer with the core clock, but don't turn it - * on or enable interrupt. - */ -void systick_disable() { - SYSTICK_BASE->CSR = SYSTICK_CSR_CLKSOURCE_CORE; -} - -/** - * Clock the system timer with the core clock and turn it on; - * interrupt every 1 ms, for systick_timer_millis. - */ -void systick_enable() { - /* re-enables init registers without changing reload val */ - SYSTICK_BASE->CSR = (SYSTICK_CSR_CLKSOURCE_CORE | - SYSTICK_CSR_ENABLE | - SYSTICK_CSR_TICKINT_PEND); -} - -/** - * @brief Attach a callback to be called from the SysTick exception handler. - * - * To detach a callback, call this function again with a null argument. - */ -void systick_attach_callback(void (*callback)(void)) { - systick_user_callback = callback; -} - -/* - * SysTick ISR - */ - -void __exc_systick(void) { - - HAL_IncTick(); - - nvic_globalirq_disable(); - systick_check_underflow(); - systick_uptime_millis++; - nvic_globalirq_enable(); - - if (systick_user_callback) { - systick_user_callback(); - } -} diff --git a/cores/arduino/systick.h b/cores/arduino/systick.h deleted file mode 100755 index bbe2943..0000000 --- a/cores/arduino/systick.h +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file systick.h - * - * @brief Various system timer definitions - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _SYSTICK_H_ -#define _SYSTICK_H_ - -#include "types.h" -#include "util.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/** SysTick register map type */ -typedef struct systick_reg_map { - __io uint32 CSR; /**< Control and status register */ - __io uint32 RVR; /**< Reload value register */ - __io uint32 CNT; /**< Current value register ("count") */ - __io uint32 CVR; /**< Calibration value register */ -} systick_reg_map; - -/** SysTick register map base pointer */ -#define SYSTICK_BASE ((struct systick_reg_map*)0xE000E010) - -/* - * Register bit definitions. - */ - -/* Control and status register */ - -#define SYSTICK_CSR_COUNTFLAG BIT(16) -#define SYSTICK_CSR_CLKSOURCE BIT(2) -#define SYSTICK_CSR_CLKSOURCE_EXTERNAL 0 -#define SYSTICK_CSR_CLKSOURCE_CORE BIT(2) -#define SYSTICK_CSR_TICKINT BIT(1) -#define SYSTICK_CSR_TICKINT_PEND BIT(1) -#define SYSTICK_CSR_TICKINT_NO_PEND 0 -#define SYSTICK_CSR_ENABLE BIT(0) -#define SYSTICK_CSR_ENABLE_MULTISHOT BIT(0) -#define SYSTICK_CSR_ENABLE_DISABLED 0 - -/* Calibration value register */ - -#define SYSTICK_CVR_NOREF BIT(31) -#define SYSTICK_CVR_SKEW BIT(30) -#define SYSTICK_CVR_TENMS 0xFFFFFF - -/** System elapsed time, in milliseconds */ -extern volatile uint32 systick_uptime_millis; - -/** - * @brief Returns the system uptime, in milliseconds. - */ -static inline uint32 systick_uptime(void) { - return systick_uptime_millis; -} - - -void systick_init(uint32 reload_val); -void systick_disable(); -void systick_enable(); - -/** - * @brief Returns the current value of the SysTick counter. - */ -static inline uint32 systick_get_count(void) { - return SYSTICK_BASE->CNT; -} - -/** - * @brief Check for underflow. - * - * This function returns 1 if the SysTick timer has counted to 0 since - * the last time it was called. However, any reads of any part of the - * SysTick Control and Status Register SYSTICK_BASE->CSR will - * interfere with this functionality. See the ARM Cortex M3 Technical - * Reference Manual for more details (e.g. Table 8-3 in revision r1p1). - */ -static inline uint32 systick_check_underflow(void) { - return SYSTICK_BASE->CSR & SYSTICK_CSR_COUNTFLAG; -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/timer.c b/cores/arduino/timer.c deleted file mode 100755 index f1ee55b..0000000 --- a/cores/arduino/timer.c +++ /dev/null @@ -1,737 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file timer.c - * @author Marti Bolivar - * @brief New-style timer interface - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "timer.h" - -/* Just like the corresponding DIER bits: - * [0] = Update handler; - * [1,2,3,4] = capture/compare 1,2,3,4 handlers, respectively; - * [5] = COM; - * [6] = TRG; - * [7] = BRK. */ -#define NR_ADV_HANDLERS 8//2 -/* Update, capture/compare 1,2,3,4; ; trigger. */ -#define NR_GEN_HANDLERS 4//10 -/* Update only. */ -#define NR_BAS_HANDLERS 2 - -/** Timer 1 device (advanced) */ -static timer_dev timer1 = { - .regs = { .adv = TIMER1_BASE }, - .clk_id = RCC_TIMER1, - .type = TIMER_ADVANCED, - .handlers = { [NR_ADV_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER1 = &timer1; - -/** Timer 2 device (general-purpose) */ -static timer_dev timer2 = { - .regs = { .gen = TIMER2_BASE }, - .clk_id = RCC_TIMER2, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER2 = &timer2; - -/** Timer 3 device (general-purpose) */ -static timer_dev timer3 = { - .regs = { .gen = TIMER3_BASE }, - .clk_id = RCC_TIMER3, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER3 = &timer3; - -/** Timer 4 device (general-purpose) */ -static timer_dev timer4 = { - .regs = { .gen = TIMER4_BASE }, - .clk_id = RCC_TIMER4, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER4 = &timer4; - -/** Timer 5 device (general-purpose) */ -static timer_dev timer5 = { - .regs = { .gen = TIMER5_BASE }, - .clk_id = RCC_TIMER5, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER5 = &timer5; - -/** Timer 6 device (basic) */ // Used for USB Serial -static timer_dev timer6 = { - .regs = { .bas = TIMER6_BASE }, - .clk_id = RCC_TIMER6, - .type = TIMER_BASIC, - .handlers = { [NR_BAS_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER6 = &timer6; - -/** Timer 7 device (basic) */ -static timer_dev timer7 = { - .regs = { .bas = TIMER7_BASE }, - .clk_id = RCC_TIMER7, - .type = TIMER_BASIC, - .handlers = { [NR_BAS_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER7 = &timer7; - -/** Timer 8 device (advanced) */ -static timer_dev timer8 = { - .regs = { .adv = TIMER8_BASE }, - .clk_id = RCC_TIMER8, - .type = TIMER_ADVANCED, - .handlers = { [NR_ADV_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER8 = &timer8; - -/** Timer 9 device (advanced) */ -static timer_dev timer9 = { - .regs = { .adv = TIMER9_BASE }, - .clk_id = RCC_TIMER9, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER9 = &timer9; - -/** Timer 10 device (advanced) */ -static timer_dev timer10 = { - .regs = { .adv = TIMER10_BASE }, - .clk_id = RCC_TIMER10, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER10 = &timer10; - -/** Timer 11 device (advanced) */ -static timer_dev timer11 = { - .regs = { .adv = TIMER11_BASE }, - .clk_id = RCC_TIMER11, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER11 = &timer11; - -/** Timer 12 device (advanced) */ -static timer_dev timer12 = { - .regs = { .adv = TIMER12_BASE }, - .clk_id = RCC_TIMER12, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER12 = &timer12; - -/** Timer 13 device (advanced) */ -static timer_dev timer13 = { - .regs = { .adv = TIMER13_BASE }, - .clk_id = RCC_TIMER13, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER13 = &timer13; - -/** Timer 14 device (advanced) */ -static timer_dev timer14 = { - .regs = { .adv = TIMER14_BASE }, - .clk_id = RCC_TIMER14, - .type = TIMER_GENERAL, - .handlers = { [NR_GEN_HANDLERS - 1] = 0 }, -}; - -timer_dev *TIMER14 = &timer14; - -/* - * Convenience routines - */ - -static void disable_channel(timer_dev *dev, uint8 channel); -static void pwm_mode(timer_dev *dev, uint8 channel); -static void output_compare_mode(timer_dev *dev, uint8 channel); - -static inline void enable_irq(timer_dev *dev, uint8 interrupt); - -/** - * Initialize a timer, and reset its register map. - * @param dev Timer to initialize - */ -void timer_init(timer_dev *dev) { - rcc_clk_enable(dev->clk_id); - rcc_reset_dev(dev->clk_id); -} - -/** - * @brief Disable a timer. - * - * The timer will stop counting, all DMA requests and interrupts will - * be disabled, and no state changes will be output. - * - * @param dev Timer to disable. - */ -void timer_disable(timer_dev *dev) { - (dev->regs).bas->CR1 = 0; - (dev->regs).bas->DIER = 0; - switch (dev->type) { - case TIMER_ADVANCED: /* fall-through */ - case TIMER_GENERAL: - (dev->regs).gen->CCER = 0; - break; - case TIMER_BASIC: - break; - } -} - -/** - * Sets the mode of an individual timer channel. - * - * Note that not all timers can be configured in every mode. For - * example, basic timers cannot be configured to output compare mode. - * Be sure to use a timer which is appropriate for the mode you want. - * - * @param dev Timer whose channel mode to set - * @param channel Relevant channel - * @param mode New timer mode for channel - */ -void timer_set_mode(timer_dev *dev, uint8 channel, timer_mode mode) { - ASSERT_FAULT(channel > 0 && channel <= 7); - - /* TODO decide about the basic timers */ - ASSERT(dev->type != TIMER_BASIC); - if (dev->type == TIMER_BASIC) - return; - - switch (mode) { - case TIMER_DISABLED: - disable_channel(dev, channel); - break; - case TIMER_PWM: - pwm_mode(dev, channel); - break; - case TIMER_OUTPUT_COMPARE: - output_compare_mode(dev, channel); - break; - } -} - -/** - * @brief Call a function on timer devices. - * @param fn Function to call on each timer device. - */ -void timer_foreach(void (*fn)(timer_dev*)) { - fn(TIMER1); - fn(TIMER2); - fn(TIMER3); - fn(TIMER4); - fn(TIMER5); - fn(TIMER6); // Used for USB Serial - fn(TIMER7); - fn(TIMER8); - fn(TIMER9); - fn(TIMER10); - fn(TIMER11); - fn(TIMER12); - fn(TIMER13); - fn(TIMER14); - - // --- Timer 1 Preset - (TIMER1->regs).gen->PSC = 2; - *bb_perip(&(TIMER1->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 2 Preset - (TIMER2->regs).gen->PSC = 0; - *bb_perip(&(TIMER2->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 3 Preset - (TIMER3->regs).gen->PSC = 0; - *bb_perip(&(TIMER3->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 4 Preset - (TIMER4->regs).gen->PSC = 0; - *bb_perip(&(TIMER4->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 5 Preset - (TIMER5->regs).gen->PSC = 0; - *bb_perip(&(TIMER5->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 6 Preset // Used for USB Serial - //(TIMER6->regs).gen->PSC = 0; - //*bb_perip(&(TIMER6->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 7 Preset - (TIMER7->regs).gen->PSC = 0; - *bb_perip(&(TIMER7->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 8 Preset - (TIMER8->regs).gen->PSC = 2; - *bb_perip(&(TIMER8->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 9 Preset - (TIMER9->regs).gen->PSC = 2; - *bb_perip(&(TIMER9->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 10 Preset - (TIMER10->regs).gen->PSC = 2; - *bb_perip(&(TIMER10->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 11 Preset - (TIMER11->regs).gen->PSC = 2; - *bb_perip(&(TIMER11->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 12 Preset - (TIMER12->regs).gen->PSC = 0; - *bb_perip(&(TIMER12->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 13 Preset - (TIMER13->regs).gen->PSC = 0; - *bb_perip(&(TIMER13->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - - // --- Timer 14 Preset - (TIMER14->regs).gen->PSC = 0; - *bb_perip(&(TIMER14->regs).gen->EGR, TIMER_EGR_UG_BIT) = 1; - -} - -/** - * @brief Attach a timer interrupt. - * @param dev Timer device - * @param interrupt Interrupt number to attach to; this may be any - * timer_interrupt_id or timer_channel value appropriate - * for the timer. - * @param handler Handler to attach to the given interrupt. - * @see timer_interrupt_id - * @see timer_channel - */ -void timer_attach_interrupt(timer_dev *dev, - uint8 interrupt, - voidFuncPtr handler) { - dev->handlers[interrupt-1] = handler; - timer_enable_irq(dev, interrupt); - enable_irq(dev, interrupt); -} - -void tone_attach_interrupt(timer_dev *dev, - uint8 interrupt, - voidFuncPtr handler) { - dev->handlers[interrupt] = handler; - timer_enable_irq(dev, interrupt); - enable_irq(dev, interrupt); -} - -/** - * @brief Detach a timer interrupt. - * @param dev Timer device - * @param interrupt Interrupt number to detach; this may be any - * timer_interrupt_id or timer_channel value appropriate - * for the timer. - * @see timer_interrupt_id - * @see timer_channel - */ -void timer_detach_interrupt(timer_dev *dev, uint8 interrupt) { - timer_disable_irq(dev, interrupt); - dev->handlers[interrupt-1] = NULL; -} - -void tone_detach_interrupt(timer_dev *dev, uint8 interrupt) { - timer_disable_irq(dev, interrupt); - dev->handlers[interrupt-1] = NULL; -} - -/* - * IRQ handlers - */ - -static inline void dispatch_adv_brk(timer_dev *dev); -static inline void dispatch_adv_up(timer_dev *dev); -static inline void dispatch_adv_trg_com(timer_dev *dev); -static inline void dispatch_adv_cc(timer_dev *dev); -static inline void dispatch_general(timer_dev *dev); -static inline void dispatch_basic(timer_dev *dev); - -void __irq_tim1_brk(void) { - dispatch_adv_brk(TIMER1); -} - -void __irq_tim1_up(void) { - dispatch_adv_up(TIMER1); -} - -void __irq_tim1_trg_com(void) { - dispatch_adv_trg_com(TIMER1); -} - -void __irq_tim1_cc(void) { - dispatch_adv_cc(TIMER1); -} - -void __irq_tim2(void) { - dispatch_general(TIMER2); -} - -void __irq_tim3(void) { - dispatch_general(TIMER3); -} - -void __irq_tim4(void) { - dispatch_general(TIMER4); -} - -void __irq_tim5(void) { - dispatch_general(TIMER5); -} - -/* TIM6 reserved for USB Serial */ -/* -void __irq_tim6(void) { - dispatch_basic(TIMER6); -} -*/ - -void __irq_tim7(void) { - dispatch_basic(TIMER7); -} - -void __irq_tim8_brk(void) { - dispatch_adv_brk(TIMER8); -} - -void __irq_tim8_up(void) { - dispatch_adv_up(TIMER8); -} - -void __irq_tim8_trg_com(void) { - dispatch_adv_trg_com(TIMER8); -} - -void __irq_tim8_cc(void) { - dispatch_adv_cc(TIMER8); -} - -void __irq_tim9_brk(void) { - dispatch_adv_brk(TIMER9); -} - -void __irq_tim9_up(void) { - dispatch_adv_up(TIMER9); -} - -void __irq_tim9_trg_com(void) { - dispatch_adv_trg_com(TIMER9); -} - -void __irq_tim9_cc(void) { - dispatch_adv_cc(TIMER9); -} - -void __irq_tim10_brk(void) { - dispatch_adv_brk(TIMER10); -} - -void __irq_tim10_up(void) { - dispatch_adv_up(TIMER10); -} - -void __irq_tim10_trg_com(void) { - dispatch_adv_trg_com(TIMER10); -} - -void __irq_tim10_cc(void) { - dispatch_adv_cc(TIMER10); -} - -void __irq_tim11_brk(void) { - dispatch_adv_brk(TIMER11); -} - -void __irq_tim11_up(void) { - dispatch_adv_up(TIMER11); -} - -void __irq_tim11_trg_com(void) { - dispatch_adv_trg_com(TIMER11); -} - -void __irq_tim11_cc(void) { - dispatch_adv_cc(TIMER11); -} - -void __irq_tim12_brk(void) { - dispatch_adv_brk(TIMER12); -} - -void __irq_tim12_up(void) { - dispatch_adv_up(TIMER12); -} - -void __irq_tim12_trg_com(void) { - dispatch_adv_trg_com(TIMER12); -} - -void __irq_tim12_cc(void) { - dispatch_adv_cc(TIMER12); -} - -void __irq_tim13_brk(void) { - dispatch_adv_brk(TIMER13); -} - -void __irq_tim13_up(void) { - dispatch_adv_up(TIMER13); -} - -void __irq_tim13_trg_com(void) { - dispatch_adv_trg_com(TIMER13); -} - -void __irq_tim13_cc(void) { - dispatch_adv_cc(TIMER13); -} - -void __irq_tim14_brk(void) { - dispatch_adv_brk(TIMER14); -} - -void __irq_tim14_up(void) { - dispatch_adv_up(TIMER14); -} - -void __irq_tim14_trg_com(void) { - dispatch_adv_trg_com(TIMER14); -} - -void __irq_tim14_cc(void) { - dispatch_adv_cc(TIMER14); -} - -/* Note: the following dispatch routines make use of the fact that - * DIER interrupt enable bits and SR interrupt flags have common bit - * positions. Thus, ANDing DIER and SR lets us check if an interrupt - * is enabled and if it has occurred simultaneously. - */ - -/* A special-case dispatch routine for single-interrupt NVIC lines. - * This function assumes that the interrupt corresponding to `iid' has - * in fact occurred (i.e., it doesn't check DIER & SR). */ -static inline void dispatch_single_irq(timer_dev *dev, - timer_interrupt_id iid, - uint32 irq_mask) { - timer_bas_reg_map *regs = (dev->regs).bas; - void (*handler)(void) = dev->handlers[iid]; - if (handler) { - handler(); - regs->SR &= ~irq_mask; - } -} - -/* For dispatch routines which service multiple interrupts. */ -#define handle_irq(dier_sr, irq_mask, handlers, iid, handled_irq) do { \ - if ((dier_sr) & (irq_mask)) { \ - void (*__handler)(void) = (handlers)[iid]; \ - if (__handler) { \ - __handler(); \ - handled_irq |= (irq_mask); \ - } \ - } \ - } while (0) - -static inline void dispatch_adv_brk(timer_dev *dev) { - dispatch_single_irq(dev, TIMER_BREAK_INTERRUPT, TIMER_SR_BIF); -} - -static inline void dispatch_adv_up(timer_dev *dev) { - dispatch_single_irq(dev, TIMER_UPDATE_INTERRUPT, TIMER_SR_UIF); -} - -static inline void dispatch_adv_trg_com(timer_dev *dev) { - timer_adv_reg_map *regs = (dev->regs).adv; - uint32 dsr = regs->DIER & regs->SR; - void (**hs)(void) = dev->handlers; - uint32 handled = 0; /* Logical OR of SR interrupt flags we end up - * handling. We clear these. User handlers - * must clear overcapture flags, to avoid - * wasting time in output mode. */ - - handle_irq(dsr, TIMER_SR_TIF, hs, TIMER_TRG_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_COMIF, hs, TIMER_COM_INTERRUPT, handled); - - regs->SR &= ~handled; -} - -static inline void dispatch_adv_cc(timer_dev *dev) { - timer_adv_reg_map *regs = (dev->regs).adv; - uint32 dsr = regs->DIER & regs->SR; - void (**hs)(void) = dev->handlers; - uint32 handled = 0; - - handle_irq(dsr, TIMER_SR_CC4IF, hs, TIMER_CC4_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC3IF, hs, TIMER_CC3_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC2IF, hs, TIMER_CC2_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC1IF, hs, TIMER_CC1_INTERRUPT, handled); - - regs->SR &= ~handled; -} - -static inline void dispatch_general(timer_dev *dev) { - timer_gen_reg_map *regs = (dev->regs).gen; - uint32 dsr = regs->DIER & regs->SR; - void (**hs)(void) = dev->handlers; - uint32 handled = 0; - - handle_irq(dsr, TIMER_SR_TIF, hs, TIMER_TRG_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC4IF, hs, TIMER_CC4_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC3IF, hs, TIMER_CC3_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC2IF, hs, TIMER_CC2_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_CC1IF, hs, TIMER_CC1_INTERRUPT, handled); - handle_irq(dsr, TIMER_SR_UIF, hs, TIMER_UPDATE_INTERRUPT, handled); - - regs->SR &= ~handled; -} - -static inline void dispatch_basic(timer_dev *dev) { - dispatch_single_irq(dev, TIMER_UPDATE_INTERRUPT, TIMER_SR_UIF); -} - -/* - * Utilities - */ - -static void disable_channel(timer_dev *dev, uint8 channel) { - timer_detach_interrupt(dev, channel); - timer_cc_disable(dev, channel); -} - -static void pwm_mode(timer_dev *dev, uint8 channel) { - timer_disable_irq(dev, channel); - timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, TIMER_OC_PE); - timer_generate_update(dev); -} - -static void output_compare_mode(timer_dev *dev, uint8 channel) { - timer_oc_set_mode(dev, channel, TIMER_OC_MODE_ACTIVE_ON_MATCH, 0); - timer_cc_enable(dev, channel); -} - -static void enable_advanced_irq(timer_dev *dev, timer_interrupt_id id); -static void enable_nonmuxed_irq(timer_dev *dev); - -static inline void enable_irq(timer_dev *dev, timer_interrupt_id iid) { - if (dev->type == TIMER_ADVANCED) { - enable_advanced_irq(dev, iid); - } else { - enable_nonmuxed_irq(dev); - } -} - -static void enable_advanced_irq(timer_dev *dev, timer_interrupt_id id) { - uint8 is_timer1 = dev->clk_id == RCC_TIMER1; - - switch (id) { - case TIMER_UPDATE_INTERRUPT: - nvic_irq_enable(is_timer1 ? NVIC_TIMER1_UP : NVIC_TIMER8_UP); - break; - case TIMER_CC1_INTERRUPT: - case TIMER_CC2_INTERRUPT: - case TIMER_CC3_INTERRUPT: - case TIMER_CC4_INTERRUPT: - nvic_irq_enable(is_timer1 ? NVIC_TIMER1_CC : NVIC_TIMER8_CC); - break; - case TIMER_COM_INTERRUPT: - case TIMER_TRG_INTERRUPT: - nvic_irq_enable(is_timer1 ? NVIC_TIMER1_TRG_COM : NVIC_TIMER8_TRG_COM); - break; - case TIMER_BREAK_INTERRUPT: - nvic_irq_enable(is_timer1 ? NVIC_TIMER1_BRK : NVIC_TIMER8_BRK); - break; - } -} - -static void enable_nonmuxed_irq(timer_dev *dev) { - switch (dev->clk_id) { - case RCC_TIMER2: - nvic_irq_enable(NVIC_TIMER2); - break; - case RCC_TIMER3: - nvic_irq_enable(NVIC_TIMER3); - break; - case RCC_TIMER4: - nvic_irq_enable(NVIC_TIMER4); - break; - case RCC_TIMER5: - nvic_irq_enable(NVIC_TIMER5); - break; - case RCC_TIMER6: - nvic_irq_enable(NVIC_TIMER6); - break; - case RCC_TIMER7: - nvic_irq_enable(NVIC_TIMER7); - break; - case RCC_TIMER9: - nvic_irq_enable(NVIC_TIMER1_BRK); - break; - case RCC_TIMER10: - nvic_irq_enable(NVIC_TIMER1_UP); - break; - case RCC_TIMER11: - nvic_irq_enable(NVIC_TIMER1_TRG_COM); - break; - case RCC_TIMER12: - nvic_irq_enable(NVIC_TIMER8_BRK); - break; - case RCC_TIMER13: - nvic_irq_enable(NVIC_TIMER8_UP); - break; - case RCC_TIMER14: - nvic_irq_enable(NVIC_TIMER8_TRG_COM); - break; - default: - ASSERT_FAULT(0); - break; - } -} diff --git a/cores/arduino/timer.h b/cores/arduino/timer.h deleted file mode 100755 index ff5bb17..0000000 --- a/cores/arduino/timer.h +++ /dev/null @@ -1,1074 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file timer.h - * @author Marti Bolivar - * @brief New-style timer interface. - * - * Replaces old timers.h implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _TIMERS_H_ -#define _TIMERS_H_ - -#include "memory.h" -#include "rcc.h" -#include "nvic.h" -#include "bitband.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps and devices - */ - -/** Advanced control timer register map type */ -typedef struct timer_adv_reg_map { - __io uint32 CR1; /**< Control register 1 */ - __io uint32 CR2; /**< Control register 2 */ - __io uint32 SMCR; /**< Slave mode control register */ - __io uint32 DIER; /**< DMA/Interrupt enable register */ - __io uint32 SR; /**< Status register */ - __io uint32 EGR; /**< Event generation register */ - __io uint32 CCMR1; /**< Capture/compare mode register 1 */ - __io uint32 CCMR2; /**< Capture/compare mode register 2 */ - __io uint32 CCER; /**< Capture/compare enable register */ - __io uint32 CNT; /**< Counter */ - __io uint32 PSC; /**< Prescaler */ - __io uint32 ARR; /**< Auto-reload register */ - __io uint32 RCR; /**< Repetition counter register */ - __io uint32 CCR1; /**< Capture/compare register 1 */ - __io uint32 CCR2; /**< Capture/compare register 2 */ - __io uint32 CCR3; /**< Capture/compare register 3 */ - __io uint32 CCR4; /**< Capture/compare register 4 */ - __io uint32 BDTR; /**< Break and dead-time register */ - __io uint32 DCR; /**< DMA control register */ - __io uint32 DMAR; /**< DMA address for full transfer */ - __io uint32 OR; /**< Option Register */ -} timer_adv_reg_map; - -/** General purpose timer register map type */ -typedef struct timer_gen_reg_map { - __io uint32 CR1; /**< Control register 1 */ - __io uint32 CR2; /**< Control register 2 */ - __io uint32 SMCR; /**< Slave mode control register */ - __io uint32 DIER; /**< DMA/Interrupt enable register */ - __io uint32 SR; /**< Status register */ - __io uint32 EGR; /**< Event generation register */ - __io uint32 CCMR1; /**< Capture/compare mode register 1 */ - __io uint32 CCMR2; /**< Capture/compare mode register 2 */ - __io uint32 CCER; /**< Capture/compare enable register */ - __io uint32 CNT; /**< Counter */ - __io uint32 PSC; /**< Prescaler */ - __io uint32 ARR; /**< Auto-reload register */ - const uint32 RESERVED1; /**< Reserved */ - __io uint32 CCR1; /**< Capture/compare register 1 */ - __io uint32 CCR2; /**< Capture/compare register 2 */ - __io uint32 CCR3; /**< Capture/compare register 3 */ - __io uint32 CCR4; /**< Capture/compare register 4 */ - const uint32 RESERVED2; /**< Reserved */ - __io uint32 DCR; /**< DMA control register */ - __io uint32 DMAR; /**< DMA address for full transfer */ - __io uint32 OR; /**< Option Register */ -} timer_gen_reg_map; - -/** Basic timer register map type */ -typedef struct timer_bas_reg_map { - __io uint32 CR1; /**< Control register 1 */ - __io uint32 CR2; /**< Control register 2 */ - const uint32 RESERVED1; /**< Reserved */ - __io uint32 DIER; /**< DMA/Interrupt enable register */ - __io uint32 SR; /**< Status register */ - __io uint32 EGR; /**< Event generation register */ - const uint32 RESERVED2; /**< Reserved */ - const uint32 RESERVED3; /**< Reserved */ - const uint32 RESERVED4; /**< Reserved */ - __io uint32 CNT; /**< Counter */ - __io uint32 PSC; /**< Prescaler */ - __io uint32 ARR; /**< Auto-reload register */ -} timer_bas_reg_map; - -/** Timer 1 register map base pointer */ -#define TIMER1_BASE ((struct timer_adv_reg_map*)0x40010000) -/** Timer 2 register map base pointer */ -#define TIMER2_BASE ((struct timer_gen_reg_map*)0x40000000) -/** Timer 3 register map base pointer */ -#define TIMER3_BASE ((struct timer_gen_reg_map*)0x40000400) -/** Timer 4 register map base pointer */ -#define TIMER4_BASE ((struct timer_gen_reg_map*)0x40000800) -/** Timer 5 register map base pointer */ -#define TIMER5_BASE ((struct timer_gen_reg_map*)0x40000C00) -/** Timer 6 register map base pointer */ -#define TIMER6_BASE ((struct timer_bas_reg_map*)0x40001000) -/** Timer 7 register map base pointer */ -#define TIMER7_BASE ((struct timer_bas_reg_map*)0x40001400) -/** Timer 8 register map base pointer */ -#define TIMER8_BASE ((struct timer_adv_reg_map*)0x40010400) -/** Timer 9 register map base pointer */ -#define TIMER9_BASE ((struct timer_adv_reg_map*)0x40014000) -/** Timer 10 register map base pointer */ -#define TIMER10_BASE ((struct timer_adv_reg_map*)0x40014400) -/** Timer 11 register map base pointer */ -#define TIMER11_BASE ((struct timer_adv_reg_map*)0x40014800) -/** Timer 12 register map base pointer */ -#define TIMER12_BASE ((struct timer_adv_reg_map*)0x40001800) -/** Timer 13 register map base pointer */ -#define TIMER13_BASE ((struct timer_adv_reg_map*)0x40001C00) -/** Timer 14 register map base pointer */ -#define TIMER14_BASE ((struct timer_adv_reg_map*)0x40002000) - - -/* - * Timer devices - */ - -/** - * @brief Timer register map type. - * - * Just holds a pointer to the correct type of register map, based on - * the timer's type. - */ -typedef union timer_reg_map { - timer_adv_reg_map *adv; /**< Advanced register map */ - timer_gen_reg_map *gen; /**< General purpose register map */ - timer_bas_reg_map *bas; /**< Basic register map */ -} timer_reg_map; - -/** - * @brief Timer type - * - * Type marker for timer_dev. - * - * @see timer_dev - */ -typedef enum timer_type { - TIMER_ADVANCED, /**< Advanced type */ - TIMER_GENERAL, /**< General purpose type */ - TIMER_BASIC /**< Basic type */ -} timer_type; - -/** Timer device type */ -typedef struct timer_dev { - timer_reg_map regs; /**< Register map */ - rcc_clk_id clk_id; /**< RCC clock information */ - timer_type type; /**< Timer's type */ - voidFuncPtr handlers[]; /**< User IRQ handlers */ -} timer_dev; - -extern timer_dev *TIMER1; -extern timer_dev *TIMER2; -extern timer_dev *TIMER3; -extern timer_dev *TIMER4; -extern timer_dev *TIMER5; -extern timer_dev *TIMER6; -extern timer_dev *TIMER7; -extern timer_dev *TIMER8; -extern timer_dev *TIMER9; -extern timer_dev *TIMER10; -extern timer_dev *TIMER11; -extern timer_dev *TIMER12; -extern timer_dev *TIMER13; -extern timer_dev *TIMER14; - -/* - * Register bit definitions - */ - -/* Control register 1 (CR1) */ - -#define TIMER_CR1_ARPE_BIT 7 -#define TIMER_CR1_DIR_BIT 4 -#define TIMER_CR1_OPM_BIT 3 -#define TIMER_CR1_URS_BIT 2 -#define TIMER_CR1_UDIS_BIT 1 -#define TIMER_CR1_CEN_BIT 0 - -#define TIMER_CR1_CKD (0x3 << 8) -#define TIMER_CR1_CKD_1TCKINT (0x0 << 8) -#define TIMER_CR1_CKD_2TCKINT (0x1 << 8) -#define TIMER_CR1_CKD_4TICKINT (0x2 << 8) -#define TIMER_CR1_ARPE BIT(TIMER_CR1_ARPE_BIT) -#define TIMER_CR1_CKD_CMS (0x3 << 5) -#define TIMER_CR1_CKD_CMS_EDGE (0x0 << 5) -#define TIMER_CR1_CKD_CMS_CENTER1 (0x1 << 5) -#define TIMER_CR1_CKD_CMS_CENTER2 (0x2 << 5) -#define TIMER_CR1_CKD_CMS_CENTER3 (0x3 << 5) -#define TIMER_CR1_DIR BIT(TIMER_CR1_DIR_BIT) -#define TIMER_CR1_OPM BIT(TIMER_CR1_OPM_BIT) -#define TIMER_CR1_URS BIT(TIMER_CR1_URS_BIT) -#define TIMER_CR1_UDIS BIT(TIMER_CR1_UDIS_BIT) -#define TIMER_CR1_CEN BIT(TIMER_CR1_CEN_BIT) - -/* Control register 2 (CR2) */ - -#define TIMER_CR2_OIS4_BIT 14 -#define TIMER_CR2_OIS3N_BIT 13 -#define TIMER_CR2_OIS3_BIT 12 -#define TIMER_CR2_OIS2N_BIT 11 -#define TIMER_CR2_OIS2_BIT 10 -#define TIMER_CR2_OIS1N_BIT 9 -#define TIMER_CR2_OIS1_BIT 8 -#define TIMER_CR2_TI1S_BIT 7 /* tills? yikes */ -#define TIMER_CR2_CCDS_BIT 3 -#define TIMER_CR2_CCUS_BIT 2 -#define TIMER_CR2_CCPC_BIT 0 - -#define TIMER_CR2_OIS4 BIT(TIMER_CR2_OIS4_BIT) -#define TIMER_CR2_OIS3N BIT(TIMER_CR2_OIS3N_BIT) -#define TIMER_CR2_OIS3 BIT(TIMER_CR2_OIS3_BIT) -#define TIMER_CR2_OIS2N BIT(TIMER_CR2_OIS2N_BIT) -#define TIMER_CR2_OIS2 BIT(TIMER_CR2_OIS2_BIT) -#define TIMER_CR2_OIS1N BIT(TIMER_CR2_OIS1N_BIT) -#define TIMER_CR2_OIS1 BIT(TIMER_CR2_OIS1_BIT) -#define TIMER_CR2_TI1S BIT(TIMER_CR2_TI1S_BIT) -#define TIMER_CR2_MMS (0x7 << 4) -#define TIMER_CR2_MMS_RESET (0x0 << 4) -#define TIMER_CR2_MMS_ENABLE (0x1 << 4) -#define TIMER_CR2_MMS_UPDATE (0x2 << 4) -#define TIMER_CR2_MMS_COMPARE_PULSE (0x3 << 4) -#define TIMER_CR2_MMS_COMPARE_OC1REF (0x4 << 4) -#define TIMER_CR2_MMS_COMPARE_OC2REF (0x5 << 4) -#define TIMER_CR2_MMS_COMPARE_OC3REF (0x6 << 4) -#define TIMER_CR2_MMS_COMPARE_OC4REF (0x7 << 4) -#define TIMER_CR2_CCDS BIT(TIMER_CR2_CCDS_BIT) -#define TIMER_CR2_CCUS BIT(TIMER_CR2_CCUS_BIT) -#define TIMER_CR2_CCPC BIT(TIMER_CR2_CCPC_BIT) - -/* Slave mode control register (SMCR) */ - -#define TIMER_SMCR_ETP_BIT 15 -#define TIMER_SMCR_ECE_BIT 14 -#define TIMER_SMCR_MSM_BIT 7 - -#define TIMER_SMCR_ETP BIT(TIMER_SMCR_ETP_BIT) -#define TIMER_SMCR_ECE BIT(TIMER_SMCR_ECE_BIT) -#define TIMER_SMCR_ETPS (0x3 << 12) -#define TIMER_SMCR_ETPS_OFF (0x0 << 12) -#define TIMER_SMCR_ETPS_DIV2 (0x1 << 12) -#define TIMER_SMCR_ETPS_DIV4 (0x2 << 12) -#define TIMER_SMCR_ETPS_DIV8 (0x3 << 12) -#define TIMER_SMCR_ETF (0xF << 12) -#define TIMER_SMCR_MSM BIT(TIMER_SMCR_MSM_BIT) -#define TIMER_SMCR_TS (0x3 << 4) -#define TIMER_SMCR_TS_ITR0 (0x0 << 4) -#define TIMER_SMCR_TS_ITR1 (0x1 << 4) -#define TIMER_SMCR_TS_ITR2 (0x2 << 4) -#define TIMER_SMCR_TS_ITR3 (0x3 << 4) -#define TIMER_SMCR_TS_TI1F_ED (0x4 << 4) -#define TIMER_SMCR_TS_TI1FP1 (0x5 << 4) -#define TIMER_SMCR_TS_TI2FP2 (0x6 << 4) -#define TIMER_SMCR_TS_ETRF (0x7 << 4) -#define TIMER_SMCR_SMS 0x3 -#define TIMER_SMCR_SMS_DISABLED 0x0 -#define TIMER_SMCR_SMS_ENCODER1 0x1 -#define TIMER_SMCR_SMS_ENCODER2 0x2 -#define TIMER_SMCR_SMS_ENCODER3 0x3 -#define TIMER_SMCR_SMS_RESET 0x4 -#define TIMER_SMCR_SMS_GATED 0x5 -#define TIMER_SMCR_SMS_TRIGGER 0x6 -#define TIMER_SMCR_SMS_EXTERNAL 0x7 - -/* DMA/Interrupt enable register (DIER) */ - -#define TIMER_DIER_TDE_BIT 14 -#define TIMER_DIER_CC4DE_BIT 12 -#define TIMER_DIER_CC3DE_BIT 11 -#define TIMER_DIER_CC2DE_BIT 10 -#define TIMER_DIER_CC1DE_BIT 9 -#define TIMER_DIER_UDE_BIT 8 -#define TIMER_DIER_TIE_BIT 6 -#define TIMER_DIER_CC4IE_BIT 4 -#define TIMER_DIER_CC3IE_BIT 3 -#define TIMER_DIER_CC2IE_BIT 2 -#define TIMER_DIER_CC1IE_BIT 1 -#define TIMER_DIER_UIE_BIT 0 - -#define TIMER_DIER_TDE BIT(TIMER_DIER_TDE_BIT) -#define TIMER_DIER_CC4DE BIT(TIMER_DIER_CC4DE_BIT) -#define TIMER_DIER_CC3DE BIT(TIMER_DIER_CC3DE_BIT) -#define TIMER_DIER_CC2DE BIT(TIMER_DIER_CC2DE_BIT) -#define TIMER_DIER_CC1DE BIT(TIMER_DIER_CC1DE_BIT) -#define TIMER_DIER_UDE BIT(TIMER_DIER_UDE_BIT) -#define TIMER_DIER_TIE BIT(TIMER_DIER_TIE_BIT) -#define TIMER_DIER_CC4IE BIT(TIMER_DIER_CC4IE_BIT) -#define TIMER_DIER_CC3IE BIT(TIMER_DIER_CC3IE_BIT) -#define TIMER_DIER_CC2IE BIT(TIMER_DIER_CC2IE_BIT) -#define TIMER_DIER_CC1IE BIT(TIMER_DIER_CC1IE_BIT) -#define TIMER_DIER_UIE BIT(TIMER_DIER_UIE_BIT) - -/* Status register (SR) */ - -#define TIMER_SR_CC4OF_BIT 12 -#define TIMER_SR_CC3OF_BIT 11 -#define TIMER_SR_CC2OF_BIT 10 -#define TIMER_SR_CC1OF_BIT 9 -#define TIMER_SR_BIF_BIT 7 -#define TIMER_SR_TIF_BIT 6 -#define TIMER_SR_COMIF_BIT 5 -#define TIMER_SR_CC4IF_BIT 4 -#define TIMER_SR_CC3IF_BIT 3 -#define TIMER_SR_CC2IF_BIT 2 -#define TIMER_SR_CC1IF_BIT 1 -#define TIMER_SR_UIF_BIT 0 - -#define TIMER_SR_CC4OF BIT(TIMER_SR_CC4OF_BIT) -#define TIMER_SR_CC3OF BIT(TIMER_SR_CC3OF_BIT) -#define TIMER_SR_CC2OF BIT(TIMER_SR_CC2OF_BIT) -#define TIMER_SR_CC1OF BIT(TIMER_SR_CC1OF_BIT) -#define TIMER_SR_BIF BIT(TIMER_SR_BIF_BIT) -#define TIMER_SR_TIF BIT(TIMER_SR_TIF_BIT) -#define TIMER_SR_COMIF BIT(TIMER_SR_COMIF_BIT) -#define TIMER_SR_CC4IF BIT(TIMER_SR_CC4IF_BIT) -#define TIMER_SR_CC3IF BIT(TIMER_SR_CC3IF_BIT) -#define TIMER_SR_CC2IF BIT(TIMER_SR_CC2IF_BIT) -#define TIMER_SR_CC1IF BIT(TIMER_SR_CC1IF_BIT) -#define TIMER_SR_UIF BIT(TIMER_SR_UIF_BIT) - -/* Event generation register (EGR) */ - -#define TIMER_EGR_BG_BIT 7 -#define TIMER_EGR_COMG_BIT 5 -#define TIMER_EGR_TG_BIT 6 -#define TIMER_EGR_CC4G_BIT 4 -#define TIMER_EGR_CC3G_BIT 3 -#define TIMER_EGR_CC2G_BIT 2 -#define TIMER_EGR_CC1G_BIT 1 -#define TIMER_EGR_UG_BIT 0 - -#define TIMER_EGR_TG BIT(TIMER_EGR_TG_BIT) -#define TIMER_EGR_CC4G BIT(TIMER_EGR_CC4G_BIT) -#define TIMER_EGR_CC3G BIT(TIMER_EGR_CC3G_BIT) -#define TIMER_EGR_CC2G BIT(TIMER_EGR_CC2G_BIT) -#define TIMER_EGR_CC1G BIT(TIMER_EGR_CC1G_BIT) -#define TIMER_EGR_UG BIT(TIMER_EGR_UG_BIT) - -/* Capture/compare mode registers, common values */ - -#define TIMER_CCMR_CCS_OUTPUT 0x0 -#define TIMER_CCMR_CCS_INPUT_TI1 0x1 -#define TIMER_CCMR_CCS_INPUT_TI2 0x2 -#define TIMER_CCMR_CCS_INPUT_TRC 0x3 - -/* Capture/compare mode register 1 (CCMR1) */ - -#define TIMER_CCMR1_OC2CE_BIT 15 -#define TIMER_CCMR1_OC2PE_BIT 11 -#define TIMER_CCMR1_OC2FE_BIT 10 -#define TIMER_CCMR1_OC1CE_BIT 7 -#define TIMER_CCMR1_OC1PE_BIT 3 -#define TIMER_CCMR1_OC1FE_BIT 2 - -#define TIMER_CCMR1_OC2CE BIT(TIMER_CCMR1_OC2CE_BIT) -#define TIMER_CCMR1_OC2M (0x3 << 12) -#define TIMER_CCMR1_IC2F (0xF << 12) -#define TIMER_CCMR1_OC2PE BIT(TIMER_CCMR1_OC2PE_BIT) -#define TIMER_CCMR1_OC2FE BIT(TIMER_CCMR1_OC2FE_BIT) -#define TIMER_CCMR1_IC2PSC (0x3 << 10) -#define TIMER_CCMR1_CC2S (0x3 << 8) -#define TIMER_CCMR1_CC2S_OUTPUT (TIMER_CCMR_CCS_OUTPUT << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI1 (TIMER_CCMR_CCS_INPUT_TI1 << 8) -#define TIMER_CCMR1_CC2S_INPUT_TI2 (TIMER_CCMR_CCS_INPUT_TI2 << 8) -#define TIMER_CCMR1_CC2S_INPUT_TRC (TIMER_CCMR_CCS_INPUT_TRC << 8) -#define TIMER_CCMR1_OC1CE BIT(TIMER_CCMR1_OC1CE_BIT) -#define TIMER_CCMR1_OC1M (0x3 << 4) -#define TIMER_CCMR1_IC1F (0xF << 4) -#define TIMER_CCMR1_OC1PE BIT(TIMER_CCMR1_OC1PE_BIT) -#define TIMER_CCMR1_OC1FE BIT(TIMER_CCMR1_OC1FE_BIT) -#define TIMER_CCMR1_IC1PSC (0x3 << 2) -#define TIMER_CCMR1_CC1S 0x3 -#define TIMER_CCMR1_CC1S_OUTPUT TIMER_CCMR_CCS_OUTPUT -#define TIMER_CCMR1_CC1S_INPUT_TI1 TIMER_CCMR_CCS_INPUT_TI1 -#define TIMER_CCMR1_CC1S_INPUT_TI2 TIMER_CCMR_CCS_INPUT_TI2 -#define TIMER_CCMR1_CC1S_INPUT_TRC TIMER_CCMR_CCS_INPUT_TRC - -/* Capture/compare mode register 2 (CCMR2) */ - -#define TIMER_CCMR2_OC4CE_BIT 15 -#define TIMER_CCMR2_OC4PE_BIT 11 -#define TIMER_CCMR2_OC4FE_BIT 10 -#define TIMER_CCMR2_OC3CE_BIT 7 -#define TIMER_CCMR2_OC3PE_BIT 3 -#define TIMER_CCMR2_OC3FE_BIT 2 - -#define TIMER_CCMR2_OC4CE BIT(TIMER_CCMR2_OC4CE_BIT) -#define TIMER_CCMR2_OC4M (0x3 << 12) -#define TIMER_CCMR2_IC2F (0xF << 12) -#define TIMER_CCMR2_OC4PE BIT(TIMER_CCMR2_OC4PE_BIT) -#define TIMER_CCMR2_OC4FE BIT(TIMER_CCMR2_OC4FE_BIT) -#define TIMER_CCMR2_IC2PSC (0x3 << 10) -#define TIMER_CCMR2_CC4S (0x3 << 8) -#define TIMER_CCMR1_CC4S_OUTPUT (TIMER_CCMR_CCS_OUTPUT << 8) -#define TIMER_CCMR1_CC4S_INPUT_TI1 (TIMER_CCMR_CCS_INPUT_TI1 << 8) -#define TIMER_CCMR1_CC4S_INPUT_TI2 (TIMER_CCMR_CCS_INPUT_TI2 << 8) -#define TIMER_CCMR1_CC4S_INPUT_TRC (TIMER_CCMR_CCS_INPUT_TRC << 8) -#define TIMER_CCMR2_OC3CE BIT(TIMER_CCMR2_OC3CE_BIT) -#define TIMER_CCMR2_OC3M (0x3 << 4) -#define TIMER_CCMR2_IC1F (0xF << 4) -#define TIMER_CCMR2_OC3PE BIT(TIMER_CCMR2_OC3PE_BIT) -#define TIMER_CCMR2_OC3FE BIT(TIMER_CCMR2_OC3FE_BIT) -#define TIMER_CCMR2_IC1PSC (0x3 << 2) -#define TIMER_CCMR2_CC3S 0x3 -#define TIMER_CCMR1_CC3S_OUTPUT TIMER_CCMR_CCS_OUTPUT -#define TIMER_CCMR1_CC3S_INPUT_TI1 TIMER_CCMR_CCS_INPUT_TI1 -#define TIMER_CCMR1_CC3S_INPUT_TI2 TIMER_CCMR_CCS_INPUT_TI2 -#define TIMER_CCMR1_CC3S_INPUT_TRC TIMER_CCMR_CCS_INPUT_TRC - -/* Capture/compare enable register (CCER) */ - -#define TIMER_CCER_CC4P_BIT 13 -#define TIMER_CCER_CC4E_BIT 12 -#define TIMER_CCER_CC3P_BIT 9 -#define TIMER_CCER_CC3E_BIT 8 -#define TIMER_CCER_CC2P_BIT 5 -#define TIMER_CCER_CC2E_BIT 4 -#define TIMER_CCER_CC1P_BIT 1 -#define TIMER_CCER_CC1E_BIT 0 - -#define TIMER_CCER_CC4P BIT(TIMER_CCER_CC4P_BIT) -#define TIMER_CCER_CC4E BIT(TIMER_CCER_CC4E_BIT) -#define TIMER_CCER_CC3P BIT(TIMER_CCER_CC3P_BIT) -#define TIMER_CCER_CC3E BIT(TIMER_CCER_CC3E_BIT) -#define TIMER_CCER_CC2P BIT(TIMER_CCER_CC2P_BIT) -#define TIMER_CCER_CC2E BIT(TIMER_CCER_CC2E_BIT) -#define TIMER_CCER_CC1P BIT(TIMER_CCER_CC1P_BIT) -#define TIMER_CCER_CC1E BIT(TIMER_CCER_CC1E_BIT) - -/* Break and dead-time register (BDTR) */ - -#define TIMER_BDTR_MOE_BIT 15 -#define TIMER_BDTR_AOE_BIT 14 -#define TIMER_BDTR_BKP_BIT 13 -#define TIMER_BDTR_BKE_BIT 12 -#define TIMER_BDTR_OSSR_BIT 11 -#define TIMER_BDTR_OSSI_BIT 10 - -#define TIMER_BDTR_MOE BIT(TIMER_BDTR_MOE_BIT) -#define TIMER_BDTR_AOE BIT(TIMER_BDTR_AOE_BIT) -#define TIMER_BDTR_BKP BIT(TIMER_BDTR_BKP_BIT) -#define TIMER_BDTR_BKE BIT(TIMER_BDTR_BKE_BIT) -#define TIMER_BDTR_OSSR BIT(TIMER_BDTR_OSSR_BIT) -#define TIMER_BDTR_OSSI BIT(TIMER_BDTR_OSSI_BIT) -#define TIMER_BDTR_LOCK (0x3 << 8) -#define TIMER_BDTR_LOCK_OFF (0x0 << 8) -#define TIMER_BDTR_LOCK_LEVEL1 (0x1 << 8) -#define TIMER_BDTR_LOCK_LEVEL2 (0x2 << 8) -#define TIMER_BDTR_LOCK_LEVEL3 (0x3 << 8) -#define TIMER_BDTR_DTG 0xFF - -/* DMA control register (DCR) */ - -#define TIMER_DCR_DBL (0x1F << 8) -#define TIMER_DCR_DBL_1BYTE (0x0 << 8) -#define TIMER_DCR_DBL_2BYTE (0x1 << 8) -#define TIMER_DCR_DBL_3BYTE (0x2 << 8) -#define TIMER_DCR_DBL_4BYTE (0x3 << 8) -#define TIMER_DCR_DBL_5BYTE (0x4 << 8) -#define TIMER_DCR_DBL_6BYTE (0x5 << 8) -#define TIMER_DCR_DBL_7BYTE (0x6 << 8) -#define TIMER_DCR_DBL_8BYTE (0x7 << 8) -#define TIMER_DCR_DBL_9BYTE (0x8 << 8) -#define TIMER_DCR_DBL_10BYTE (0x9 << 8) -#define TIMER_DCR_DBL_11BYTE (0xA << 8) -#define TIMER_DCR_DBL_12BYTE (0xB << 8) -#define TIMER_DCR_DBL_13BYTE (0xC << 8) -#define TIMER_DCR_DBL_14BYTE (0xD << 8) -#define TIMER_DCR_DBL_15BYTE (0xE << 8) -#define TIMER_DCR_DBL_16BYTE (0xF << 8) -#define TIMER_DCR_DBL_17BYTE (0x10 << 8) -#define TIMER_DCR_DBL_18BYTE (0x11 << 8) -#define TIMER_DCR_DBA 0x1F -#define TIMER_DCR_DBA_CR1 0x0 -#define TIMER_DCR_DBA_CR2 0x1 -#define TIMER_DCR_DBA_SMCR 0x2 -#define TIMER_DCR_DBA_DIER 0x3 -#define TIMER_DCR_DBA_SR 0x4 -#define TIMER_DCR_DBA_EGR 0x5 -#define TIMER_DCR_DBA_CCMR1 0x6 -#define TIMER_DCR_DBA_CCMR2 0x7 -#define TIMER_DCR_DBA_CCER 0x8 -#define TIMER_DCR_DBA_CNT 0x9 -#define TIMER_DCR_DBA_PSC 0xA -#define TIMER_DCR_DBA_ARR 0xB -#define TIMER_DCR_DBA_RCR 0xC -#define TIMER_DCR_DBA_CCR1 0xD -#define TIMER_DCR_DBA_CCR2 0xE -#define TIMER_DCR_DBA_CCR3 0xF -#define TIMER_DCR_DBA_CCR4 0x10 -#define TIMER_DCR_DBA_BDTR 0x11 -#define TIMER_DCR_DBA_DCR 0x12 -#define TIMER_DCR_DBA_DMAR 0x13 - -/* - * Convenience routines - */ - -/** - * Used to configure the behavior of a timer channel. Note that not - * all timers can be configured in every mode. - */ -/* TODO TIMER_PWM_CENTER_ALIGNED, TIMER_INPUT_CAPTURE, TIMER_ONE_PULSE */ -typedef enum timer_mode { - TIMER_DISABLED, /**< In this mode, the timer stops counting, - channel interrupts are detached, and no state - changes are output. */ - TIMER_PWM, /**< PWM output mode. This is the default mode for pins - after initialization. */ - /* TIMER_PWM_CENTER_ALIGNED, /\**< Center-aligned PWM output mode. *\/ */ - TIMER_OUTPUT_COMPARE, /**< In this mode, the timer counts from 0 - to its reload value repeatedly; every - time the counter value reaches one of - the channel compare values, the - corresponding interrupt is fired. */ - /* TIMER_INPUT_CAPTURE, /\**< In this mode, the timer can measure the */ - /* pulse lengths of input signals. *\/ */ - /* TIMER_ONE_PULSE /\**< In this mode, the timer can generate a single */ - /* pulse on a GPIO pin for a specified amount of */ - /* time. *\/ */ -} timer_mode; - -/** Timer channel numbers */ -typedef enum timer_channel { - TIMER_CH1 = 1, /**< Channel 1 */ - TIMER_CH2 = 2, /**< Channel 2 */ - TIMER_CH3 = 3, /**< Channel 3 */ - TIMER_CH4 = 4 /**< Channel 4 */ -} timer_channel; - -/* - * Note: Don't require timer_channel arguments! We want to be able to say - * - * for (int channel = 1; channel <= 4; channel++) { - * ... - * } - * - * without the compiler yelling at us. - */ - -void timer_init(timer_dev *dev); -void timer_disable(timer_dev *dev); -void timer_set_mode(timer_dev *dev, uint8 channel, timer_mode mode); -void timer_foreach(void (*fn)(timer_dev*)); - -/** - * @brief Timer interrupt number. - * - * Not all timers support all of these values; see the descriptions - * for each value. - */ -typedef enum timer_interrupt_id { - TIMER_UPDATE_INTERRUPT, /**< Update interrupt, available on all timers. */ - TIMER_CC1_INTERRUPT, /**< Capture/compare 1 interrupt, available - on general and advanced timers only. */ - TIMER_CC2_INTERRUPT, /**< Capture/compare 2 interrupt, general and - advanced timers only. */ - TIMER_CC3_INTERRUPT, /**< Capture/compare 3 interrupt, general and - advanced timers only. */ - TIMER_CC4_INTERRUPT, /**< Capture/compare 4 interrupt, general and - advanced timers only. */ - TIMER_COM_INTERRUPT, /**< COM interrupt, advanced timers only */ - TIMER_TRG_INTERRUPT, /**< Trigger interrupt, general and advanced - timers only */ - TIMER_BREAK_INTERRUPT /**< Break interrupt, advanced timers only. */ -} timer_interrupt_id; - -void timer_attach_interrupt(timer_dev *dev, - uint8 interrupt, - voidFuncPtr handler); - -void tone_attach_interrupt(timer_dev *dev, - uint8 interrupt, - voidFuncPtr handler); - -void timer_detach_interrupt(timer_dev *dev, uint8 interrupt); - -/** - * Initialize all timer devices on the chip. - */ -static inline void timer_init_all(void) { - timer_foreach(timer_init); -} - -/** - * Disables all timers on the device. - */ -static inline void timer_disable_all(void) { - timer_foreach(timer_disable); -} - -/** - * @brief Stop a timer's counter from changing. - * - * Does not affect the timer's mode or other settings. - * - * @param dev Device whose counter to pause. - */ -static inline void timer_pause(timer_dev *dev) { - *bb_perip(&(dev->regs).bas->CR1, TIMER_CR1_CEN_BIT) = 0; -} - -/** - * @brief Start a timer's counter. - * - * Does not affect the timer's mode or other settings. - * - * @param dev Device whose counter to resume - */ -static inline void timer_resume(timer_dev *dev) { - *bb_perip(&(dev->regs).bas->CR1, TIMER_CR1_CEN_BIT) = 1; -} - -/** - * @brief Returns the timer's counter value. - * - * This value is likely to be inaccurate if the counter is running - * with a low prescaler. - * - * @param dev Timer whose counter to return - */ -static inline uint16 timer_get_count(timer_dev *dev) { - return (uint16)(dev->regs).bas->CNT; -} - -/** - * @brief Sets the counter value for the given timer. - * @param dev Timer whose counter to set - * @param value New counter value - */ -static inline void timer_set_count(timer_dev *dev, uint16 value) { - (dev->regs).bas->CNT = value; -} - -/** - * @brief Returns the given timer's prescaler. - * - * Note that if the timer's prescaler is set (e.g. via - * timer_set_prescaler() or accessing a TIMx_PSC register), the value - * returned by this function will reflect the new setting, but the - * timer's counter will only reflect the new prescaler at the next - * update event. - * - * @param dev Timer whose prescaler to return - * @see timer_generate_update() - */ -static inline uint16 timer_get_prescaler(timer_dev *dev) { - return (uint16)(dev->regs).bas->PSC; -} - -/** - * @brief Set a timer's prescale value. - * - * Divides the input clock by (PSC+1). The new value will not take - * effect until the next update event. - * - * @param dev Timer whose prescaler to set - * @param psc New prescaler value - * @see timer_generate_update() - */ -static inline void timer_set_prescaler(timer_dev *dev, uint16 psc) { - (dev->regs).bas->PSC = psc; -} - -/** - * @brief Returns a timer's reload value. - * @param dev Timer whose reload value to return - */ -static inline uint16 timer_get_reload(timer_dev *dev) { - return (uint16)(dev->regs).bas->ARR; -} - -/** - * @brief Set a timer's reload value. - * @param dev Timer whose reload value to set - * @param arr New reload value to use. Takes effect at next update event. - * @see timer_generate_update() - */ -static inline void timer_set_reload(timer_dev *dev, uint16 arr) { - (dev->regs).bas->ARR = arr; -} - -/** - * @brief Get the compare value for the given timer channel. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel whose compare value to get. - */ -static inline uint16 timer_get_compare(timer_dev *dev, uint8 channel) { - if(channel > 4) - channel -= 4; - __io uint32 *ccr = &(dev->regs).gen->CCR1 + (channel - 1); - return *ccr; -} - -/** - * @brief Set the compare value for the given timer channel. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel whose compare value to set. - * @param value New compare value. - */ -static inline void timer_set_compare (timer_dev *dev, - uint8 channel, - uint16 value) { - if(channel > 4) - channel -= 4; - __io uint32 *ccr = &(dev->regs).gen->CCR1 + (channel - 1); - *ccr = value; -} - -/** - * @brief Generate an update event for the given timer. - * - * Normally, this will cause the prescaler and auto-reload values in - * the PSC and ARR registers to take immediate effect. However, this - * function will do nothing if the UDIS bit is set in the timer's CR1 - * register (UDIS is cleared by default). - * - * @param dev Timer device to generate an update for. - */ -static inline void timer_generate_update(timer_dev *dev) { - *bb_perip(&(dev->regs).bas->EGR, TIMER_EGR_UG_BIT) = 1; -} - -/** - * @brief Enable a timer's trigger DMA request - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL - */ -static inline void timer_dma_enable_trg_req(timer_dev *dev) { - *bb_perip(&(dev->regs).gen->DIER, TIMER_DIER_TDE_BIT) = 1; -} - -/** - * @brief Disable a timer's trigger DMA request - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL - */ -static inline void timer_dma_disable_trg_req(timer_dev *dev) { - *bb_perip(&(dev->regs).gen->DIER, TIMER_DIER_TDE_BIT) = 0; -} - -/** - * @brief Enable a timer channel's DMA request. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL - * @param channel Channel whose DMA request to enable. - */ -static inline void timer_dma_enable_req(timer_dev *dev, uint8 channel) { - *bb_perip(&(dev->regs).gen->DIER, channel + 8) = 1; -} - -/** - * @brief Disable a timer channel's DMA request. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel whose DMA request to disable. - */ -static inline void timer_dma_disable_req(timer_dev *dev, uint8 channel) { - *bb_perip(&(dev->regs).gen->DIER, channel + 8) = 0; -} - -/** - * @brief Enable a timer interrupt. - * @param dev Timer device. - * @param interrupt Interrupt number to enable; this may be any - * timer_interrupt_id value appropriate for the timer. - * @see timer_interrupt_id - * @see timer_channel - */ -static inline void timer_enable_irq(timer_dev *dev, uint8 interrupt) { - *bb_perip(&(dev->regs).adv->DIER, interrupt) = 1; -} - -/** - * @brief Disable a timer interrupt. - * @param dev Timer device. - * @param interrupt Interrupt number to disable; this may be any - * timer_interrupt_id value appropriate for the timer. - * @see timer_interrupt_id - * @see timer_channel - */ -static inline void timer_disable_irq(timer_dev *dev, uint8 interrupt) { - *bb_perip(&(dev->regs).adv->DIER, interrupt) = 0; -} - -/** - * @brief Enable a timer channel's capture/compare signal. - * - * If the channel is configured as output, the corresponding output - * compare signal will be output on the corresponding output pin. If - * the channel is configured as input, enables capture of the counter - * value into the input capture/compare register. - * Generate update event beforehand to make sure correct ARR and CNT - * values are used. - * - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel to enable, from 1 to 4. - */ -static inline void timer_cc_enable(timer_dev *dev, uint8 channel) { - if(channel <=4){ - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1)) = 1; - } - else{ - channel -= 4; - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 2) = 1; - } -} - -/** - * @brief Disable a timer channel's output compare or input capture signal. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel to disable, from 1 to 4. - * @see timer_cc_enable() - */ -static inline void timer_cc_disable(timer_dev *dev, uint8 channel) { - if(channel <=4){ - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1)) = 0; - } - else{ - channel -= 4; - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 2) = 0; - } -} - -/** - * @brief Get a channel's capture/compare output polarity - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel whose capture/compare output polarity to get. - * @return Polarity, either 0 or 1. - * @see timer_cc_set_polarity() - */ -static inline uint8 timer_cc_get_pol(timer_dev *dev, uint8 channel) { - if(channel <=4){ - return *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 1); - } - else{ - channel -= 4; - return *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 3); - } -} - -/** - * @brief Set a timer channel's capture/compare output polarity. - * - * If the timer channel is configured as output: polarity == 0 means - * the output channel will be active high; polarity == 1 means active - * low. - * - * If the timer channel is configured as input: polarity == 0 means - * capture is done on the rising edge of ICn; when used as an external - * trigger, ICn is non-inverted. polarity == 1 means capture is done - * on the falling edge of ICn; when used as an external trigger, ICn - * is inverted. - * - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel whose capture/compare output polarity to set. - * @param pol New polarity, 0 or 1. - */ -static inline void timer_cc_set_pol(timer_dev *dev, uint8 channel, uint8 pol) { - if(channel <=4){ - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 1) = pol; - } - else{ - channel -= 4; - *bb_perip(&(dev->regs).gen->CCER, 4 * (channel - 1) + 3) = pol; - } -} - -/** - * @brief Get a timer's DMA burst length. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @return Number of bytes to be transferred per DMA request, from 1 to 18. - */ -static inline uint8 timer_dma_get_burst_len(timer_dev *dev) { - uint32 dbl = ((dev->regs).gen->DCR & TIMER_DCR_DBL) >> 8; - return dbl + 1; /* 0 means 1 byte, etc. */ -} - -/** - * @brief Set a timer's DMA burst length. - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param length DMA burst length; i.e., number of bytes to transfer - * per DMA request, from 1 to 18. - */ -static inline void timer_dma_set_burst_len(timer_dev *dev, uint8 length) { - uint32 tmp = (dev->regs).gen->DCR; - tmp &= ~TIMER_DCR_DBL; - tmp |= (length - 1) << 8; - (dev->regs).gen->DCR = tmp; -} - -/** - * @brief Timer DMA base address. - * - * Defines the base address for DMA transfers. - */ -typedef enum timer_dma_base_addr { - TIMER_DMA_BASE_CR1 = TIMER_DCR_DBA_CR1, /**< Base is control register 1 */ - TIMER_DMA_BASE_CR2 = TIMER_DCR_DBA_CR2, /**< Base is control register 2 */ - TIMER_DMA_BASE_SMCR = TIMER_DCR_DBA_SMCR, /**< Base is slave mode - control register */ - TIMER_DMA_BASE_DIER = TIMER_DCR_DBA_DIER, /**< Base is DMA interrupt enable - register */ - TIMER_DMA_BASE_SR = TIMER_DCR_DBA_SR, /**< Base is status register */ - TIMER_DMA_BASE_EGR = TIMER_DCR_DBA_EGR, /**< Base is event generation - register */ - TIMER_DMA_BASE_CCMR1 = TIMER_DCR_DBA_CCMR1, /**< Base is capture/compare - mode register 1 */ - TIMER_DMA_BASE_CCMR2 = TIMER_DCR_DBA_CCMR2, /**< Base is capture/compare - mode register 2 */ - TIMER_DMA_BASE_CCER = TIMER_DCR_DBA_CCER, /**< Base is capture/compare - enable register */ - TIMER_DMA_BASE_CNT = TIMER_DCR_DBA_CNT, /**< Base is counter */ - TIMER_DMA_BASE_PSC = TIMER_DCR_DBA_PSC, /**< Base is prescaler */ - TIMER_DMA_BASE_ARR = TIMER_DCR_DBA_ARR, /**< Base is auto-reload - register */ - TIMER_DMA_BASE_RCR = TIMER_DCR_DBA_RCR, /**< Base is repetition - counter register */ - TIMER_DMA_BASE_CCR1 = TIMER_DCR_DBA_CCR1, /**< Base is capture/compare - register 1 */ - TIMER_DMA_BASE_CCR2 = TIMER_DCR_DBA_CCR2, /**< Base is capture/compare - register 2 */ - TIMER_DMA_BASE_CCR3 = TIMER_DCR_DBA_CCR3, /**< Base is capture/compare - register 3 */ - TIMER_DMA_BASE_CCR4 = TIMER_DCR_DBA_CCR4, /**< Base is capture/compare - register 4 */ - TIMER_DMA_BASE_BDTR = TIMER_DCR_DBA_BDTR, /**< Base is break and - dead-time register */ - TIMER_DMA_BASE_DCR = TIMER_DCR_DBA_DCR, /**< Base is DMA control - register */ - TIMER_DMA_BASE_DMAR = TIMER_DCR_DBA_DMAR /**< Base is DMA address for - full transfer */ -} timer_dma_base_addr; - -/** - * @brief Get the timer's DMA base address. - * - * Some restrictions apply; see ST RM0008. - * - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @return DMA base address - */ -static inline timer_dma_base_addr timer_dma_get_base_addr(timer_dev *dev) { - uint32 dcr = (dev->regs).gen->DCR; - return (timer_dma_base_addr)(dcr & TIMER_DCR_DBA); -} - -/** - * @brief Set the timer's DMA base address. - * - * Some restrictions apply; see ST RM0008. - * - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param dma_base DMA base address. - */ -static inline void timer_dma_set_base_addr(timer_dev *dev, - timer_dma_base_addr dma_base) { - uint32 tmp = (dev->regs).gen->DCR; - tmp &= ~TIMER_DCR_DBA; - tmp |= dma_base; - (dev->regs).gen->DCR = tmp; -} - -/** - * Timer output compare modes. - */ -typedef enum timer_oc_mode { - TIMER_OC_MODE_FROZEN = 0 << 4, /**< Frozen: comparison between output - compare register and counter has no - effect on the outputs. */ - TIMER_OC_MODE_ACTIVE_ON_MATCH = 1 << 4, /**< OCxREF signal is forced - high when the count matches - the channel capture/compare - register. */ - TIMER_OC_MODE_INACTIVE_ON_MATCH = 2 << 4, /**< OCxREF signal is forced - low when the counter matches - the channel capture/compare - register. */ - TIMER_OC_MODE_TOGGLE = 3 << 4, /**< OCxREF toggles when counter - matches the cannel capture/compare - register. */ - TIMER_OC_MODE_FORCE_INACTIVE = 4 << 4, /**< OCxREF is forced low. */ - TIMER_OC_MODE_FORCE_ACTIVE = 5 << 4, /**< OCxREF is forced high. */ - TIMER_OC_MODE_PWM_1 = 6 << 4, /**< PWM mode 1. In upcounting, channel is - active as long as count is less than - channel capture/compare register, else - inactive. In downcounting, channel is - inactive as long as count exceeds - capture/compare register, else - active. */ - TIMER_OC_MODE_PWM_2 = 7 << 4 /**< PWM mode 2. In upcounting, channel is - inactive as long as count is less than - capture/compare register, else active. - In downcounting, channel is active as - long as count exceeds capture/compare - register, else inactive. */ -} timer_oc_mode; - -/** - * Timer output compare mode flags. - * @see timer_oc_set_mode() - */ -typedef enum timer_oc_mode_flags { - TIMER_OC_CE = BIT(7), /**< Output compare clear enable. */ - TIMER_OC_PE = BIT(3), /**< Output compare preload enable. */ - TIMER_OC_FE = BIT(2) /**< Output compare fast enable. */ -} timer_oc_mode_flags; - -/** - * @brief Configure a channel's output compare mode. - * - * @param dev Timer device, must have type TIMER_ADVANCED or TIMER_GENERAL. - * @param channel Channel to configure in output compare mode. - * @param mode Timer mode to set. - * @param flags OR of timer_oc_mode_flags. - * @see timer_oc_mode - * @see timer_oc_mode_flags - */ -static inline void timer_oc_set_mode(timer_dev *dev, - uint8 channel, - timer_oc_mode mode, - uint8 flags) { - uint8 bit0 = channel & 1; - //uint8 bit1 = (channel >> 1) & 1; // original - uint8 bit1 = ((channel-1) >> 1) & 1; // fixed - /* channel == 1,2 -> CCMR1; channel == 3,4 -> CCMR2 */ - __io uint32 *ccmr = &(dev->regs).gen->CCMR1 + bit1; - /* channel == 1,3 -> shift = 0, channel == 2,4 -> shift = 8 */ - uint8 shift = 8 * (1 - bit0); - - uint32 tmp = *ccmr; - tmp &= ~(0xFF << shift); - tmp |= (mode | flags | TIMER_CCMR_CCS_OUTPUT) << shift; - *ccmr = tmp; -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/types.h b/cores/arduino/types.h deleted file mode 100755 index 1885f83..0000000 --- a/cores/arduino/types.h +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file types.h - * - * @brief libmaple types - */ - -#ifndef _TYPES_H_ -#define _TYPES_H_ - -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; -typedef unsigned long long uint64; - -typedef signed char int8; -typedef short int16; -typedef int int32; -typedef long long int64; - -typedef void (*voidFuncPtr)(void); - -#define __io volatile -#define __attr_flash __attribute__((section (".USER_FLASH"))) - -#define __always_inline inline __attribute__((always_inline)) - -#ifndef NULL -#define NULL 0 -#endif - -#endif diff --git a/cores/arduino/usart.c b/cores/arduino/usart.c deleted file mode 100755 index c8feaa6..0000000 --- a/cores/arduino/usart.c +++ /dev/null @@ -1,343 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file usart.c - * @author Marti Bolivar , - * Perry Hung - * @brief USART control routines - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "usart.h" -#define USART_TX_IRQ - -/* - * Devices - */ - -/** USART1 device */ -static usart_dev usart1 = { - .regs = USART1_BASE, - .max_baud = 4500000UL, - .clk_id = RCC_USART1, - .irq_num = NVIC_USART1 -}; - -usart_dev *USART1_dev = &usart1; - -/** USART2 device */ -static usart_dev usart2 = { - .regs = USART2_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_USART2, - .irq_num = NVIC_USART2 -}; - -usart_dev *USART2_dev = &usart2; - -/** USART3 device */ -static usart_dev usart3 = { - .regs = USART3_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_USART3, - .irq_num = NVIC_USART3 -}; - -usart_dev *USART3_dev = &usart3; - -/** UART4 device */ -static usart_dev uart4 = { - .regs = UART4_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_UART4, - .irq_num = NVIC_UART4 -}; - -usart_dev *UART4_dev = &uart4; - -/** UART5 device */ -static usart_dev uart5 = { - .regs = UART5_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_UART5, - .irq_num = NVIC_UART5 -}; - -usart_dev *UART5_dev = &uart5; - -/** USART6 device */ -static usart_dev usart6 = { - .regs = USART6_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_USART6, - .irq_num = NVIC_USART6 -}; - -usart_dev *USART6_dev = &usart6; - -/** UART7 device */ -static usart_dev uart7 = { - .regs = UART7_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_UART7, - .irq_num = NVIC_UART7 -}; - -usart_dev *UART7_dev = &uart7; - -/** UART8 device */ -static usart_dev uart8 = { - .regs = UART8_BASE, - .max_baud = 2250000UL, - .clk_id = RCC_UART8, - .irq_num = NVIC_UART8 -}; - -usart_dev *UART8_dev = &uart8; - -/** - * @brief Initialize a serial port. - * @param dev Serial port to be initialized - */ -void usart_init(usart_dev *dev) { - rb_init(&dev->rbRX, USART_RX_BUF_SIZE, dev->rx_buf); - rb_init(&dev->rbTX, USART_TX_BUF_SIZE, dev->tx_buf); - rcc_clk_enable(dev->clk_id); - nvic_irq_enable(dev->irq_num); -} - -/** - * @brief Configure a serial port's baud rate. - * - * @param dev Serial port to be configured - * @param clock_speed Clock speed, in megahertz. - * @param baud Baud rate for transmit/receive. - */ -void usart_set_baud_rate(usart_dev *dev, uint32 baud) { - uint32 integer_part; - uint32 fractional_part; - uint32 tmp; - - uint32 clock_speed = rcc_dev_clk_speed(dev->clk_id); - - /* See ST RM0008 for the details on configuring the baud rate register */ - integer_part = (25 * clock_speed) / (4 * baud); - tmp = (integer_part / 100) << 4; - fractional_part = integer_part - (100 * (tmp >> 4)); - tmp |= (((fractional_part * 16) + 50) / 100) & ((uint8)0x0F); - - dev->regs->BRR = (uint16)tmp; -} - -/** - * @brief Enable a serial port. - * - * USART is enabled in single buffer transmission mode, multibuffer - * receiver mode, 8n1. - * - * Serial port must have a baud rate configured to work properly. - * - * @param dev Serial port to enable. - * @see usart_set_baud_rate() - */ -void usart_enable(usart_dev *dev) { - usart_reg_map *regs = dev->regs; - regs->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE; - regs->CR1 |= USART_CR1_UE; -} - - -/** - * @brief Enable serial port tx interrupt. - * - * @param dev Serial port. - */ -void usart_tx_irq_enable(usart_dev *dev) { - bb_peri_set_bit(&dev->regs->CR1, USART_CR1_TXEIE_BIT, 1); -} - -/** - * @brief Disable serial port tx interrupt. - * - * @param dev Serial port. - */ -void usart_tx_irq_disable(usart_dev *dev) { - bb_peri_set_bit(&dev->regs->CR1, USART_CR1_TXEIE_BIT, 0); -} - -/** - * @brief Turn off a serial port. - * @param dev Serial port to be disabled - */ -void usart_disable(usart_dev *dev) { - /* FIXME this misbehaves if you try to use PWM on TX afterwards */ - usart_reg_map *regs = dev->regs; - - // flush output buffer - while(usart_data_pending(dev) > 0) - ; - - /* TC bit must be high before disabling the USART */ - while((regs->CR1 & USART_CR1_UE) && !(regs->SR & USART_SR_TC)) - ; - - /* Disable UE */ - regs->CR1 &= ~USART_CR1_UE; - - /* Clean up buffer */ - usart_reset_rx(dev); -} - -/** - * @brief Call a function on each USART. - * @param fn Function to call. - */ -void usart_foreach(void (*fn)(usart_dev*)) { - fn(USART1_dev); - fn(USART2_dev); - fn(USART3_dev); - fn(UART4_dev); - fn(UART5_dev); - fn(USART6_dev); - fn(UART7_dev); - fn(UART8_dev); -} - -/** - * @brief Nonblocking USART transmit - * @param dev Serial port to transmit over - * @param buf Buffer to transmit - * @param len Maximum number of bytes to transmit - * @return Number of bytes transmitted - */ -uint32 usart_tx(usart_dev *dev, const uint8 *buf, uint32 len) { - uint32 txed = 0; -#ifdef USART_TX_IRQ - while (txed < len && rb_safe_insert(&dev->rbTX, buf[txed])) { - usart_tx_irq_enable(dev); - txed++; - } - -#else - usart_reg_map *regs = dev->regs; - while ((regs->SR & USART_SR_TXE) && (txed < len)) { - regs->DR = buf[txed++]; - } -#endif - - return txed; -} - -/** - * @brief Transmit an unsigned integer to the specified serial port in - * decimal format. - * - * This function blocks until the integer's digits have been - * completely transmitted. - * - * @param dev Serial port to send on - * @param val Number to print - */ -void usart_putudec(usart_dev *dev, uint32 val) { - char digits[12]; - int i = 0; - - do { - digits[i++] = val % 10 + '0'; - val /= 10; - } while (val > 0); - - while (--i >= 0) { - usart_putc(dev, digits[i]); - } -} - -/* - * Interrupt handlers. - */ -static inline void usart_irq(usart_dev *dev) { - volatile int sr = dev->regs->SR; - if(sr & USART_SR_RXNE) { -#ifdef USART_SAFE_INSERT - /* If the buffer is full and the user defines USART_SAFE_INSERT, - * ignore new bytes. */ - rb_safe_insert(&dev->rbRX, (uint8)dev->regs->DR); -#else - /* By default, push bytes around in the ring buffer. */ - rb_push_insert(&dev->rbRX, (uint8)dev->regs->DR); -#endif - -#ifdef USART_TX_IRQ - } else if(sr & USART_SR_TXE) { - if(rb_full_count(&dev->rbTX) > 0) { - dev->regs->DR = rb_remove(&dev->rbTX); - } else { - usart_tx_irq_disable(dev); // disable tx irq - // nops needed to deactivate the irq before irq handler is left - asm volatile("nop"); - asm volatile("nop"); - } -#endif - - } -} - -void __irq_usart1(void) { - usart_irq(USART1_dev); -} - -void __irq_usart2(void) { - usart_irq(USART2_dev); -} - -void __irq_usart3(void) { - usart_irq(USART3_dev); -} - -void __irq_uart4(void) { - usart_irq(UART4_dev); -} - -void __irq_uart5(void) { - usart_irq(UART5_dev); -} - -void __irq_USART6_IRQHandler(void) { - usart_irq(USART6_dev); -} - -void __irq_UART7_IRQHandler(void) { - usart_irq(UART7_dev); -} - -void __irq_UART8_IRQHandler(void) { - usart_irq(UART8_dev); -} diff --git a/cores/arduino/usart.h b/cores/arduino/usart.h deleted file mode 100755 index 33bcaa1..0000000 --- a/cores/arduino/usart.h +++ /dev/null @@ -1,459 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file usart.h - * @author Marti Bolivar , - * Perry Hung - * @brief USART definitions and prototypes - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef _USART_H_ -#define _USART_H_ - -#include "types.h" -#include "util.h" -#include "rcc.h" -#include "nvic.h" -#include "ring_buffer.h" -#include "bitband.h" - - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Register maps and devices - */ - -/** USART register map type */ -typedef struct usart_reg_map { - __io uint32 SR; /**< Status register */ - __io uint32 DR; /**< Data register */ - __io uint32 BRR; /**< Baud rate register */ - __io uint32 CR1; /**< Control register 1 */ - __io uint32 CR2; /**< Control register 2 */ - __io uint32 CR3; /**< Control register 3 */ - __io uint32 GTPR; /**< Guard time and prescaler register */ -} usart_reg_map; - -/** USART1 register map base pointer */ -#define USART1_BASE ((struct usart_reg_map*)0x40011000) -/** USART2 register map base pointer */ -#define USART2_BASE ((struct usart_reg_map*)0x40004400) -/** USART3 register map base pointer */ -#define USART3_BASE ((struct usart_reg_map*)0x40004800) -/** UART4 register map base pointer */ -#define UART4_BASE ((struct usart_reg_map*)0x40004C00) -/** UART5 register map base pointer */ -#define UART5_BASE ((struct usart_reg_map*)0x40005000) -/** USART6 register map base pointer */ -#define USART6_BASE ((struct usart_reg_map*)0x40011400) -/** UART7 register map base pointer */ -#define UART7_BASE ((struct usart_reg_map*)0x40007800) -/** UART8 register map base pointer */ -#define UART8_BASE ((struct usart_reg_map*)0x40007C00) - -/* - * Register bit definitions - */ - -/* Status register */ - -#define USART_SR_CTS_BIT 9 -#define USART_SR_LBD_BIT 8 -#define USART_SR_TXE_BIT 7 -#define USART_SR_TC_BIT 6 -#define USART_SR_RXNE_BIT 5 -#define USART_SR_IDLE_BIT 4 -#define USART_SR_ORE_BIT 3 -#define USART_SR_NE_BIT 2 -#define USART_SR_FE_BIT 1 -#define USART_SR_PE_BIT 0 - -#define USART_SR_CTS BIT(USART_SR_CTS_BIT) -#define USART_SR_LBD BIT(USART_SR_LBD_BIT) -#define USART_SR_TXE BIT(USART_SR_TXE_BIT) -#define USART_SR_TC BIT(USART_SR_TC_BIT) -#define USART_SR_RXNE BIT(USART_SR_RXNE_BIT) -#define USART_SR_IDLE BIT(USART_SR_IDLE_BIT) -#define USART_SR_ORE BIT(USART_SR_ORE_BIT) -#define USART_SR_NE BIT(USART_SR_NE_BIT) -#define USART_SR_FE BIT(USART_SR_FE_BIT) -#define USART_SR_PE BIT(USART_SR_PE_BIT) - -/* Data register */ - -#define USART_DR_DR 0xFF - -/* Baud rate register */ - -#define USART_BRR_DIV_MANTISSA (0xFFF << 4) -#define USART_BRR_DIV_FRACTION 0xF - -/* Control register 1 */ - -#define USART_CR1_UE_BIT 13 -#define USART_CR1_M_BIT 12 -#define USART_CR1_WAKE_BIT 11 -#define USART_CR1_PCE_BIT 10 -#define USART_CR1_PS_BIT 9 -#define USART_CR1_PEIE_BIT 8 -#define USART_CR1_TXEIE_BIT 7 -#define USART_CR1_TCIE_BIT 6 -#define USART_CR1_RXNEIE_BIT 5 -#define USART_CR1_IDLEIE_BIT 4 -#define USART_CR1_TE_BIT 3 -#define USART_CR1_RE_BIT 2 -#define USART_CR1_RWU_BIT 1 -#define USART_CR1_SBK_BIT 0 - -#define USART_CR1_UE BIT(USART_CR1_UE_BIT) -#define USART_CR1_M BIT(USART_CR1_M_BIT) -#define USART_CR1_WAKE BIT(USART_CR1_WAKE_BIT) -#define USART_CR1_WAKE_IDLE (0 << USART_CR1_WAKE_BIT) -#define USART_CR1_WAKE_ADDR (1 << USART_CR1_WAKE_BIT) -#define USART_CR1_PCE BIT(USART_CR1_PCE_BIT) -#define USART_CR1_PS BIT(USART_CR1_PS_BIT) -#define USART_CR1_PS_EVEN (0 << USART_CR1_PS_BIT) -#define USART_CR1_PS_ODD (1 << USART_CR1_PS_BIT) -#define USART_CR1_PEIE BIT(USART_CR1_PEIE_BIT) -#define USART_CR1_TXEIE BIT(USART_CR1_TXEIE_BIT) -#define USART_CR1_TCIE BIT(USART_CR1_TCIE_BIT) -#define USART_CR1_RXNEIE BIT(USART_CR1_RXNEIE_BIT) -#define USART_CR1_IDLEIE BIT(USART_CR1_IDLEIE_BIT) -#define USART_CR1_TE BIT(USART_CR1_TE_BIT) -#define USART_CR1_RE BIT(USART_CR1_RE_BIT) -#define USART_CR1_RWU BIT(USART_CR1_RWU_BIT) -#define USART_CR1_RWU_ACTIVE (0 << USART_CR1_RWU_BIT) -#define USART_CR1_RWU_MUTE (1 << USART_CR1_RWU_BIT) -#define USART_CR1_SBK BIT(USART_CR1_SBK_BIT) - -/* Control register 2 */ - -#define USART_CR2_LINEN_BIT 14 -#define USART_CR2_CLKEN_BIT 11 -#define USART_CR2_CPOL_BIT 10 -#define USART_CR2_CPHA_BIT 9 -#define USART_CR2_LBCL_BIT 8 -#define USART_CR2_LBDIE_BIT 6 -#define USART_CR2_LBDL_BIT 5 - -#define USART_CR2_LINEN BIT(USART_CR2_LINEN_BIT) -#define USART_CR2_STOP (0x3 << 12) -#define USART_CR2_STOP_BITS_1 (0x0 << 12) -/* Not on UART4, UART5 */ -#define USART_CR2_STOP_BITS_POINT_5 (0x1 << 12) -/* Not on UART4, UART5 */ -#define USART_CR2_STOP_BITS_1_POINT_5 (0x3 << 12) -#define USART_CR2_STOP_BITS_2 (0x2 << 12) -#define USART_CR2_CLKEN BIT(USART_CR2_CLKEN_BIT) -/* Not on UART4, UART5 */ -#define USART_CR2_CPOL BIT(USART_CR2_CPOL_BIT) -#define USART_CR2_CPOL_LOW (0x0 << USART_CR2_CLKEN_BIT) -#define USART_CR2_CPOL_HIGH (0x1 << USART_CR2_CLKEN_BIT) -/* Not on UART4, UART5 */ -#define USART_CR2_CPHA BIT(USART_CR2_CPHA_BIT) -#define USART_CR2_CPHA_FIRST (0x0 << USART_CR2_CPHA_BIT) -#define USART_CR2_CPHA_SECOND (0x1 << USART_CR2_CPHA_BIT) -/* Not on UART4, UART5 */ -#define USART_CR2_LBCL BIT(USART_CR2_LBCL_BIT) -#define USART_CR2_LBDIE BIT(USART_CR2_LBDIE_BIT) -#define USART_CR2_LBDL BIT(USART_CR2_LBDL_BIT) -#define USART_CR2_LBDL_10_BIT (0 << USART_CR2_LBDL_BIT) -#define USART_CR2_LBDL_11_BIT (1 << USART_CR2_LBDL_BIT) -#define USART_CR2_ADD 0xF - -/* Control register 3 */ - -#define USART_CR3_CTSIE_BIT 10 -#define USART_CR3_CTSE_BIT 9 -#define USART_CR3_RTSE_BIT 8 -#define USART_CR3_DMAT_BIT 7 -#define USART_CR3_DMAR_BIT 6 -#define USART_CR3_SCEN_BIT 5 -#define USART_CR3_NACK_BIT 4 -#define USART_CR3_HDSEL_BIT 3 -#define USART_CR3_IRLP_BIT 2 -#define USART_CR3_IREN_BIT 1 -#define USART_CR3_EIE_BIT 0 - -/* Not on UART4, UART5 */ -#define USART_CR3_CTSIE BIT(USART_CR3_CTSIE_BIT) -/* Not on UART4, UART5 */ -#define USART_CR3_CTSE BIT(USART_CR3_CTSE_BIT) -/* Not on UART4, UART5 */ -#define USART_CR3_RTSE BIT(USART_CR3_RTSE_BIT) -/* Not on UART5 */ -#define USART_CR3_DMAT BIT(USART_CR3_DMAT_BIT) -/* Not on UART5 */ -#define USART_CR3_DMAR BIT(USART_CR3_DMAR_BIT) -/* Not on UART4, UART5 */ -#define USART_CR3_SCEN BIT(USART_CR3_SCEN_BIT) -/* Not on UART4, UART5 */ -#define USART_CR3_NACK BIT(USART_CR3_NACK_BIT) -#define USART_CR3_HDSEL BIT(USART_CR3_HDSEL_BIT) -#define USART_CR3_IRLP BIT(USART_CR3_IRLP_BIT) -#define USART_CR3_IRLP_NORMAL (0 << USART_CR3_IRLP_BIT) -#define USART_CR3_IRLP_LOW_POWER (1 << USART_CR3_IRLP_BIT) -#define USART_CR3_IREN BIT(USART_CR3_IREN_BIT) -#define USART_CR3_EIE BIT(USART_CR3_EIE_BIT) - -/* Guard time and prescaler register */ - -/* Not on UART4, UART5 */ -#define USART_GTPR_GT (0xFF << 8) -/* Not on UART4, UART5 */ -#define USART_GTPR_PSC 0xFF - -/* - * Devices - */ - -#ifndef USART_RX_BUF_SIZE -#define USART_RX_BUF_SIZE 256 -#endif - -#ifndef USART_TX_BUF_SIZE -#define USART_TX_BUF_SIZE 256 -#endif - -// USART register offset -#define USART_SR_offset 0x00 -#define USART_DR_offset 0x04 -#define USART_BRR_offset 0x08 -#define USART_CR1_offset 0x0C -#define USART_CR2_offset 0x10 -#define USART_CR3_offset 0x14 -#define USART_GTPR_offset 0x18 - -// UART register offset -#define UART_SR_offset 0x00 -#define UART_DR_offset 0x04 -#define UART_BRR_offset 0x08 -#define UART_CR1_offset 0x0C -#define UART_CR2_offset 0x10 -#define UART_CR3_offset 0x14 -#define UART_GTPR_offset 0x18 - -// USART & UART register map base pointer - -// USART1 - #define USART1_SR USART1_BASE+USART_SR_offset - #define USART1_DR USART1_BASE+USART_DR_offset - #define USART1_BRR USART1_BASE+USART_BRR_offset - #define USART1_CR1 USART1_BASE+USART_CR1_offset - #define USART1_CR2 USART1_BASE+USART_CR2_offset - #define USART1_CR3 USART1_BASE+USART_CR3_offset - #define USART1_GTPR USART1_BASE+USART_GTPR_offset -// USART2 - #define USART2_SR USART2_BASE+USART_SR_offset - #define USART2_DR USART2_BASE+USART_DR_offset - #define USART2_BRR USART2_BASE+USART_BRR_offset - #define USART2_CR1 USART2_BASE+USART_CR1_offset - #define USART2_CR2 USART2_BASE+USART_CR2_offset - #define USART2_CR3 USART2_BASE+USART_CR3_offset - #define USART2_GTPR USART2_BASE+USART_GTPR_offset -// USART3 - #define USART3_SR USART3_BASE+USART_SR_offset - #define USART3_DR USART3_BASE+USART_DR_offset - #define USART3_BRR USART3_BASE+USART_BRR_offset - #define USART3_CR1 USART3_BASE+USART_CR1_offset - #define USART3_CR2 USART3_BASE+USART_CR2_offset - #define USART3_CR3 USART3_BASE+USART_CR3_offset - #define USART3_GTPR USART3_BASE+USART_GTPR_offset -// UART4 - #define UART4_SR UART4_BASE+UART_SR_offset - #define UART4_DR UART4_BASE+UART_DR_offset - #define UART4_BRR UART4_BASE+UART_BRR_offset - #define UART4_CR1 UART4_BASE+UART_CR1_offset - #define UART4_CR2 UART4_BASE+UART_CR2_offset - #define UART4_CR3 UART4_BASE+UART_CR3_offset - #define UART4_GTPR UART4_BASE+UART_GTPR_offset -// UART5 - #define UART5_SR UART5_BASE+UART_SR_offset - #define UART5_DR UART5_BASE+UART_DR_offset - #define UART5_BRR UART5_BASE+UART_BRR_offset - #define UART5_CR1 UART5_BASE+UART_CR1_offset - #define UART5_CR2 UART5_BASE+UART_CR2_offset - #define UART5_CR3 UART5_BASE+UART_CR3_offset - #define UART5_GTPR UART5_BASE+UART_GTPR_offset -// USART6 - #define USART6_SR USART6_BASE+USART_SR_offset - #define USART6_DR USART6_BASE+USART_DR_offset - #define USART6_BRR USART6_BASE+USART_BRR_offset - #define USART6_CR1 USART6_BASE+USART_CR1_offset - #define USART6_CR2 USART6_BASE+USART_CR2_offset - #define USART6_CR3 USART6_BASE+USART_CR3_offset - #define USART6_GTPR USART6_BASE+USART_GTPR_offset -// UART7 - #define UART7_SR UART7_BASE+UART_SR_offset - #define UART7_DR UART7_BASE+UART_DR_offset - #define UART7_BRR UART7_BASE+UART_BRR_offset - #define UART7_CR1 UART7_BASE+UART_CR1_offset - #define UART7_CR2 UART7_BASE+UART_CR2_offset - #define UART7_CR3 UART7_BASE+UART_CR3_offset - #define UART7_GTPR UART7_BASE+UART_GTPR_offset -// UART8 - #define UART8_SR UART8_BASE+UART_SR_offset - #define UART8_DR UART8_BASE+UART_DR_offset - #define UART8_BRR UART8_BASE+UART_BRR_offset - #define UART8_CR1 UART8_BASE+UART_CR1_offset - #define UART8_CR2 UART8_BASE+UART_CR2_offset - #define UART8_CR3 UART8_BASE+UART_CR3_offset - #define UART8_GTPR UART8_BASE+UART_GTPR_offset - -/** USART device type */ -typedef struct usart_dev { - usart_reg_map *regs; /**< Register map */ - ring_buffer rbRX; /**< RX ring buffer */ - ring_buffer rbTX; /**< RX ring buffer */ - uint32 max_baud; /**< Maximum baud */ - uint8 rx_buf[USART_RX_BUF_SIZE]; /**< @brief Deprecated. - * Actual RX buffer used by rb. - * This field will be removed in - * a future release. */ - uint8 tx_buf[USART_TX_BUF_SIZE]; - rcc_clk_id clk_id; /**< RCC clock information */ - nvic_irq_num irq_num; /**< USART NVIC interrupt */ -} usart_dev; - -extern usart_dev *USART1_dev; -extern usart_dev *USART2_dev; -extern usart_dev *USART3_dev; -extern usart_dev *UART4_dev; -extern usart_dev *UART5_dev; -extern usart_dev *USART6_dev; -extern usart_dev *UART7_dev; -extern usart_dev *UART8_dev; - -void usart_init(usart_dev *dev); -void usart_set_baud_rate(usart_dev *dev, uint32 baud); -void usart_enable(usart_dev *dev); -void usart_disable(usart_dev *dev); -void usart_foreach(void (*fn)(usart_dev *dev)); -uint32 usart_tx(usart_dev *dev, const uint8 *buf, uint32 len); -void usart_putudec(usart_dev *dev, uint32 val); - -/** - * @brief Disable all serial ports. - */ -static inline void usart_disable_all(void) { - usart_foreach(usart_disable); -} - -/** - * @brief Transmit one character on a serial port. - * - * This function blocks until the character has been successfully - * transmitted. - * - * @param dev Serial port to send on. - * @param byte Byte to transmit. - */ -static inline void usart_putc(usart_dev* dev, uint8 byte) { - while (!usart_tx(dev, &byte, 1)) - ; -} - -/** - * @brief Transmit a character string on a serial port. - * - * This function blocks until str is completely transmitted. - * - * @param dev Serial port to send on - * @param str String to send - */ -static inline void usart_putstr(usart_dev *dev, const char* str) { - uint32 i = 0; - while (str[i] != '\0') { - usart_putc(dev, str[i++]); - } -} - -/** - * @brief Read one character from a serial port. - * - * It's not safe to call this function if the serial port has no data - * available. - * - * @param dev Serial port to read from - * @return byte read - * @see usart_data_available() - */ -static inline uint8 usart_getc(usart_dev *dev) { - return rb_remove(&dev->rbRX); -} - -/* - * Roger Clark. 20141125, - * added peek function. - * @param dev Serial port to read from - * @return byte read - */ -static inline int usart_peek(usart_dev *dev) -{ - return rb_peek(&dev->rbRX); -} - - -/** - * @brief Return the amount of data available in a serial port's RX buffer. - * @param dev Serial port to check - * @return Number of bytes in dev's RX buffer. - */ -static inline uint32 usart_data_available(usart_dev *dev) { - return rb_full_count(&dev->rbRX); -} - -/** - * @brief Return the amount of data available in a serial port's TX buffer. - * @param dev Serial port to check - * @return Number of bytes in dev's TX buffer. - */ -static inline uint32 usart_data_pending(usart_dev *dev) { - return rb_full_count(&dev->rbTX); -} - -/** - * @brief Discard the contents of a serial port's RX buffer. - * @param dev Serial port whose buffer to empty. - */ -static inline void usart_reset_rx(usart_dev *dev) { - rb_reset(&dev->rbRX); -} - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif // _USART_H_ diff --git a/cores/arduino/usb_serial.cpp b/cores/arduino/usb_serial.cpp index ebe220d..8bbec6b 100644 --- a/cores/arduino/usb_serial.cpp +++ b/cores/arduino/usb_serial.cpp @@ -33,20 +33,23 @@ * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org */ +#ifdef USBCON +#ifdef USBD_USE_CDC + #include #include "wiring.h" #include "usb_serial.h" -#include "usb_device.h" + +#include "usb_interface.h" #include "usbd_core.h" #include "usbd_desc.h" #include "usbd_cdc.h" #include "usbd_cdc_if.h" #define USB_TIMEOUT 50 - /* USB Device Core handle declaration */ -USBD_HandleTypeDef hUsbDeviceFS; +extern USBD_HandleTypeDef hUSBD_Device_CDC; extern __IO uint32_t device_connection_status; extern __IO uint32_t lineState; extern __IO uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; @@ -57,7 +60,6 @@ extern __IO uint32_t UserRxBufPtrIn; extern __IO uint32_t UserRxBufPtrOut; __IO uint32_t usbEnableBlockingTx; -//USBSerial Serial; USBSerial SerialUSB; @@ -73,7 +75,7 @@ void USBSerial::begin(int) { void USBSerial::end(void) { - USBD_LL_DeInit(&hUsbDeviceFS); + USBD_LL_DeInit(&hUSBD_Device_CDC); } int USBSerial::availableForWrite(void) @@ -170,23 +172,23 @@ void USBSerial::flush(void) #if 0 /* Flush EP1 for data IN */ - USBD_LL_FlushEP(&hUsbDeviceFS, CDC_IN_EP); + USBD_LL_FlushEP(&hUSBD_Device_CDC, CDC_IN_EP); /* Flush EP1 for data OUT */ - USBD_LL_FlushEP(&hUsbDeviceFS, CDC_IN_EP); + USBD_LL_FlushEP(&hUSBD_Device_CDC, CDC_IN_EP); /* Flush EP1 for CDC commands */ - USBD_LL_FlushEP(&hUsbDeviceFS, CDC_IN_EP); + USBD_LL_FlushEP(&hUSBD_Device_CDC, CDC_IN_EP); return; #endif } -uint8 USBSerial::pending(void) { +uint8_t USBSerial::pending(void) { // return usbGetPending(); // No equivalent in HAL } -uint8 USBSerial::isConnected(void) { +uint8_t USBSerial::isConnected(void) { if(device_connection_status == 1) { @@ -198,11 +200,11 @@ uint8 USBSerial::isConnected(void) { } } -uint8 USBSerial::getDTR(void) { +uint8_t USBSerial::getDTR(void) { // return usbGetDTR(); } -uint8 USBSerial::getRTS(void) { +uint8_t USBSerial::getRTS(void) { // return usbGetRTS(); } @@ -213,3 +215,5 @@ USBSerial::operator bool() { delay(10); return result; } +#endif // USBD_USE_CDC +#endif // USBCON diff --git a/cores/arduino/usb_serial.h b/cores/arduino/usb_serial.h old mode 100755 new mode 100644 index e9bafe4..ad374cc --- a/cores/arduino/usb_serial.h +++ b/cores/arduino/usb_serial.h @@ -36,8 +36,10 @@ #ifndef _USB_SERIAL_H_ #define _USB_SERIAL_H_ +#if !defined (USBCON) || !defined (USBD_USE_CDC) +#warning "Using legacy CDC core (non pluggable)" +#else #include "Stream.h" - /** * @brief Virtual serial terminal. */ @@ -62,16 +64,15 @@ class USBSerial : public Stream { inline size_t write(int n) { return write((uint8_t)n); } using Print::write; - uint8 getRTS(); - uint8 getDTR(); - uint8 isConnected(); - uint8 pending(); + uint8_t getRTS(); + uint8_t getDTR(); + uint8_t isConnected(); + uint8_t pending(); virtual operator bool(void); }; -//extern USBSerial Serial; extern USBSerial SerialUSB; - +#endif #endif diff --git a/cores/arduino/util.c b/cores/arduino/util.c deleted file mode 100755 index 4dd6c00..0000000 --- a/cores/arduino/util.c +++ /dev/null @@ -1,151 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file util.c - * @brief Utility procedures for debugging, mostly an error LED fade - * and messages dumped over a UART for failed asserts. - */ - -#include "memory.h" -#include "usart.h" -#include "gpio.h" -#include "nvic.h" -#include "adc.h" -#include "timer.h" - -/* Failed ASSERT()s send out a message using this USART config. */ -#ifndef ERROR_USART -#define ERROR_USART USART2_dev -#define ERROR_USART_CLK_SPEED STM32_PCLK1 -#define ERROR_USART_BAUD 115200 -#define ERROR_TX_PORT GPIOA_dev -#define ERROR_TX_PIN 2 -#endif - -/* If you define ERROR_LED_PORT and ERROR_LED_PIN, then a failed - * ASSERT() will also throb() an LED connected to that port and pin. - */ -#if defined(ERROR_LED_PORT) && defined(ERROR_LED_PIN) -#define HAVE_ERROR_LED -#endif - -/** - * @brief Disables all peripheral interrupts except USB and fades the - * error LED. - */ -/* (Called from exc.S with global interrupts disabled.) */ -void __error(int num) { - nvic_globalirq_enable(); - usart_putstr(ERROR_USART, "\r\nexception: "); - usart_putudec(ERROR_USART, num); - usart_putc(ERROR_USART, '\n'); - usart_putc(ERROR_USART, '\r'); - for(;;); - throb(); - - /* Turn off peripheral interrupts */ - nvic_irq_disable_all(); - - /* Turn off timers */ - timer_disable_all(); - - /* Turn off ADC */ - adc_disable_all(); - - /* Turn off all USARTs */ - usart_disable_all(); - - /* Turn the USB interrupt back on so the bootloader keeps on functioning */ - nvic_irq_enable(NVIC_USB_HP_CAN_TX); - nvic_irq_enable(NVIC_USB_LP_CAN_RX0); - - /* Reenable global interrupts */ - nvic_globalirq_enable(); - throb(); -} - -/** - * @brief Print an error message on a UART upon a failed assertion - * and throb the error LED, if there is one defined. - * @param file Source file of failed assertion - * @param line Source line of failed assertion - * @param exp String representation of failed assertion - * @sideeffect Turns of all peripheral interrupts except USB. - */ -void _fail(const char* file, int line, const char* exp) { - /* Initialize the error USART */ - //gpio_set_mode(ERROR_TX_PORT, ERROR_TX_PIN, GPIO_AF_OUTPUT_PP); - //usart_init(ERROR_USART); - //usart_set_baud_rate(ERROR_USART, ERROR_USART_CLK_SPEED, ERROR_USART_BAUD); - usart_set_baud_rate(ERROR_USART, ERROR_USART_BAUD); - - /* Print failed assert message */ - usart_putstr(ERROR_USART, "ERROR: FAILED ASSERT("); - usart_putstr(ERROR_USART, exp); - usart_putstr(ERROR_USART, "): "); - usart_putstr(ERROR_USART, file); - usart_putstr(ERROR_USART, ": "); - usart_putudec(ERROR_USART, line); - usart_putc(ERROR_USART, '\n'); - usart_putc(ERROR_USART, '\r'); - - /* Error fade */ - __error(-1); -} - -/** - * @brief Fades the error LED on and off - * @sideeffect Sets output push-pull on ERROR_LED_PIN. - */ -void throb(void) { -#ifdef HAVE_ERROR_LED - int32 slope = 1; - uint32 CC = 0x0000; - uint32 TOP_CNT = 0x0800; - uint32 i = 0; - - //gpio_set_mode(ERROR_LED_PORT, ERROR_LED_PIN, GPIO_OUTPUT_PP); - /* Error fade. */ - while (1) { - if (CC == TOP_CNT) { - slope = -1; - } else if (CC == 0) { - slope = 1; - } - - if (i == TOP_CNT) { - CC += slope; - i = 0; - } - i++; - } -#else - /* No error LED is defined; do nothing. */ - while (1) - ; -#endif -} diff --git a/cores/arduino/util.h b/cores/arduino/util.h deleted file mode 100755 index 52b8e1c..0000000 --- a/cores/arduino/util.h +++ /dev/null @@ -1,111 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file util.h - * @brief Miscellaneous utility macros and procedures. - */ - -#include "types.h" - -#ifndef _UTIL_H_ -#define _UTIL_H_ - -#ifdef __cplusplus -extern "C"{ -#endif - -/* - * Bit manipulation - */ - -/** 1 << the bit number */ -#define BIT(shift) (1UL << (shift)) -/** Mask shifted left by 'shift' */ -#define BIT_MASK_SHIFT(mask, shift) ((mask) << (shift)) -/** Bits m to n of x */ -#define GET_BITS(x, m, n) ((((uint32)x) << (31 - (n))) >> ((31 - (n)) + (m))) -/** True if v is a power of two (1, 2, 4, 8, ...) */ -#define IS_POWER_OF_TWO(v) ((v) && !((v) & ((v) - 1))) - -/* - * Failure routines - */ - -void __error(int num); -void _fail(const char*, int, const char*); -void throb(void); - -/* - * Asserts and debug levels - */ - -#define DEBUG_NONE 0 -#define DEBUG_FAULT 1 -#define DEBUG_ALL 2 - -/** - * \def DEBUG_LEVEL - * - * Controls the level of assertion checking. - * - * The higher the debug level, the more assertions will be compiled - * in. This increases the amount of debugging information, but slows - * down (and increases the size of) the binary. - * - * The debug levels, from lowest to highest, are DEBUG_NONE, - * DEBUG_FAULT, and DEBUG_ALL. The default level is DEBUG_ALL. - */ - -#ifndef DEBUG_LEVEL -#define DEBUG_LEVEL DEBUG_ALL -#endif - -#if DEBUG_LEVEL >= DEBUG_ALL -#define ASSERT(exp) \ - if (exp) { \ - } else { \ - _fail(__FILE__, __LINE__, #exp); \ - } -#else -#define ASSERT(exp) (void)((0)) -#endif - -#if DEBUG_LEVEL >= DEBUG_FAULT -#define ASSERT_FAULT(exp) \ - if (exp) { \ - } else { \ - _fail(__FILE__, __LINE__, #exp); \ - } -#else -#define ASSERT_FAULT(exp) (void)((0)) -#endif - -#ifdef __cplusplus -} // extern "C" -#endif - -#endif diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c new file mode 100644 index 0000000..619778f --- /dev/null +++ b/cores/arduino/wiring.c @@ -0,0 +1,64 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +uint32_t millis( void ) +{ + // todo: ensure no interrupts + return GetCurrentMilli() ; +} + +// Interrupt-compatible version of micros +uint32_t micros( void ) +{ + return GetCurrentMicro(); +} + +void delay( uint32_t ms ) +{ + if (ms == 0) + return; + uint32_t start = GetCurrentMilli(); + do { + yield(); + } while (GetCurrentMilli() - start < ms); +} + +#if defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +extern signed int putchar( signed int c ) ; +/** + * \brief + * + * \param c Character to output. + * + * \return The character that was output. + */ +extern WEAK signed int putchar( signed int c ) +{ + return c ; +} +#endif /* __ICCARM__ */ + +#ifdef __cplusplus +} +#endif diff --git a/cores/arduino/wiring.h b/cores/arduino/wiring.h old mode 100755 new mode 100644 index 38c4fea..3f7435d --- a/cores/arduino/wiring.h +++ b/cores/arduino/wiring.h @@ -1,80 +1,80 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ +/* + Copyright (c) 2011 Arduino. All right reserved. + Copyright (c) 2013 by Paul Stoffregen (delayMicroseconds) -/** - * @brief Main include file for the Wirish core. - * - * Includes various Arduino wiring macros and bit defines - */ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. -#ifndef _wiring_H_ -#define _wiring_H_ + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ -#include -#include "memory.h" +#ifndef _WIRING_ +#define _WIRING_ -#include "wiring_types.h" -#include "boards.h" -#include "io.h" -#include "bits.h" -#include "pwm.h" -#include "interrupts.h" -#include "wiring_debug.h" -#include "WMath.h" +#include -#include "wiring_time.h" -#include -#include "SPI.h" -#include "HardwareSerial.h" -#include "HardwareTimer.h" -#include "usb_serial.h" -#include "Wire.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * + */ +extern void initVariant( void ) ; +extern void init( void ) ; + +/** + * \brief Returns the number of milliseconds since the Arduino board began running the current program. + * + * This number will overflow (go back to zero), after approximately 50 days. + * + * \return Number of milliseconds since the program started (uint32_t) + */ +extern uint32_t millis( void ) ; -/* Arduino wiring macros and bit defines */ -#define HIGH 0x1 -#define LOW 0x0 +/** + * \brief Returns the number of microseconds since the Arduino board began running the current program. + * + * This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards + * (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is + * always a multiple of four). On 8 MHz Arduino boards (e.g. the LilyPad), this function has a resolution + * of eight microseconds. + * + * \note There are 1,000 microseconds in a millisecond and 1,000,000 microseconds in a second. + */ +extern uint32_t micros( void ) ; -#define true 0x1 -#define false 0x0 +/** + * \brief Pauses the program for the amount of time (in miliseconds) specified as parameter. + * (There are 1000 milliseconds in a second.) + * + * \param dwMs the number of milliseconds to pause (uint32_t) + */ +extern void delay( uint32_t dwMs ) ; -#define lowByte(w) ((w) & 0xFF) -#define highByte(w) (((w) >> 8) & 0xFF) -#define bitRead(value, bit) (((value) >> (bit)) & 0x01) -#define bitSet(value, bit) ((value) |= (1UL << (bit))) -#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) -#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : \ - bitClear(value, bit)) -#define bit(b) (1UL << (b)) +/** + * \brief Pauses the program for the amount of time (in microseconds) specified as parameter. + * + * \param dwUs the number of microseconds to pause (uint32_t) + */ +static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unused)); +static inline void delayMicroseconds(uint32_t usec){ + uint32_t start = GetCurrentMicro(); -typedef uint8 boolean; -typedef uint8 byte; + while((start+usec) > GetCurrentMicro()); +} +#ifdef __cplusplus +} #endif + +#endif /* _WIRING_ */ diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c new file mode 100644 index 0000000..2d9c767 --- /dev/null +++ b/cores/arduino/wiring_analog.c @@ -0,0 +1,108 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +//This is the list of the IOs configured +uint32_t g_anOutputPinConfigured[MAX_NB_PORT] = {0}; + +static int _readResolution = 10; +static int _writeResolution = 8; + +void analogReadResolution(int res) { + _readResolution = res; +} + +void analogWriteResolution(int res) { + _writeResolution = res; +} + +static inline uint32_t mapResolution(uint32_t value, uint32_t from, uint32_t to) { + if (from == to) + return value; + if (from > to) + return value >> (from-to); + else + return value << (to-from); +} + + +//perform the read operation on the selected analog pin. +//the initialization of the analog PIN is done through this function +uint32_t analogRead(uint32_t ulPin) +{ + uint32_t value = 0; + PinName p = analogInputToPinName(ulPin); + if(p != NC) { + value = adc_read_value(p); + value = mapResolution(value, ADC_RESOLUTION, _readResolution); + } + return value; +} + + +void analogOutputInit(void) { +} + +// Right now, PWM output only works on the pins with +// hardware support. These are defined in the appropriate +// variant.cpp file. For the rest of the pins, we default +// to digital output. +void analogWrite(uint32_t ulPin, uint32_t ulValue) { + + uint8_t do_init = 0; + PinName p = digitalPinToPinName(ulPin); + if(p != NC) { + if(pin_in_pinmap(p, PinMap_DAC)) { + if(is_pin_configured(p, g_anOutputPinConfigured) == false) { + do_init = 1; + set_pin_configured(p, g_anOutputPinConfigured); + } + ulValue = mapResolution(ulValue, _writeResolution, DACC_RESOLUTION); + dac_write_value(p, ulValue, do_init); + } else if(pin_in_pinmap(p, PinMap_PWM)) { + if(is_pin_configured(p, g_anOutputPinConfigured) == false) { + do_init = 1; + set_pin_configured(p, g_anOutputPinConfigured); + } + ulValue = mapResolution(ulValue, _writeResolution, PWM_RESOLUTION); + pwm_start(p, PWM_FREQUENCY*PWM_MAX_DUTY_CYCLE, + PWM_MAX_DUTY_CYCLE, + ulValue, do_init); + } else { //DIGITAL PIN ONLY + // Defaults to digital write + pinMode(ulPin, OUTPUT); + ulValue = mapResolution(ulValue, _writeResolution, 8); + if (ulValue < 128) { + digitalWrite(ulPin, LOW); + } + else { + digitalWrite(ulPin, HIGH); + } + } + } +} + +#ifdef __cplusplus +} +#endif diff --git a/cores/arduino/wiring_analog.cpp b/cores/arduino/wiring_analog.cpp deleted file mode 100755 index 9c9e5e4..0000000 --- a/cores/arduino/wiring_analog.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Arduino-compatible ADC implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "wiring.h" -#include "io.h" - -/* Assumes that the ADC has been initialized and that the pin is set - * to INPUT_ANALOG */ -uint16 analogRead(uint8 pin) { - if ((pin >= 0) && (pin <= 13)) - { - pin = pin + 54; - } - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_INPUT_ANALOG); - const adc_dev *dev = PIN_MAP[pin].adc_device; - if (dev == NULL) { - return 0; - } - - return adc_read(dev, PIN_MAP[pin].adc_channel); -} - -/* ADC handler declaration */ -ADC_HandleTypeDef AdcHandle_ADC1; -ADC_HandleTypeDef AdcHandle_ADC2; -ADC_HandleTypeDef AdcHandle_ADC3; - - -void analogReadResolution(int resolution) -{ - - /*##-1- Configure the ADC peripheral #######################################*/ - AdcHandle_ADC1.Instance = ADC1; - AdcHandle_ADC2.Instance = ADC2; - AdcHandle_ADC3.Instance = ADC3; - - AdcHandle_ADC1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; - AdcHandle_ADC2.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; - AdcHandle_ADC3.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; - - if (resolution <= 6) { - AdcHandle_ADC1.Init.Resolution = ADC_RESOLUTION_6B; - AdcHandle_ADC2.Init.Resolution = ADC_RESOLUTION_6B; - AdcHandle_ADC3.Init.Resolution = ADC_RESOLUTION_6B; - } - - if ((6 < resolution) && (resolution <=8)) { - AdcHandle_ADC1.Init.Resolution = ADC_RESOLUTION_8B; - AdcHandle_ADC2.Init.Resolution = ADC_RESOLUTION_8B; - AdcHandle_ADC3.Init.Resolution = ADC_RESOLUTION_8B; - } - - if ((8 < resolution) && (resolution <=10)) { - AdcHandle_ADC1.Init.Resolution = ADC_RESOLUTION_10B; - AdcHandle_ADC2.Init.Resolution = ADC_RESOLUTION_10B; - AdcHandle_ADC3.Init.Resolution = ADC_RESOLUTION_10B; - } - - if (10 < resolution) { - AdcHandle_ADC1.Init.Resolution = ADC_RESOLUTION_12B; - AdcHandle_ADC2.Init.Resolution = ADC_RESOLUTION_12B; - AdcHandle_ADC3.Init.Resolution = ADC_RESOLUTION_12B; - } - - HAL_ADC_Init(&AdcHandle_ADC1); - HAL_ADC_Init(&AdcHandle_ADC2); - HAL_ADC_Init(&AdcHandle_ADC3); - -} diff --git a/cores/arduino/wiring_analog.h b/cores/arduino/wiring_analog.h new file mode 100644 index 0000000..ce732b2 --- /dev/null +++ b/cores/arduino/wiring_analog.h @@ -0,0 +1,79 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_ANALOG_ +#define _WIRING_ANALOG_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * \brief SAM3 products have only one reference for ADC + */ +typedef enum _eAnalogReference +{ + AR_DEFAULT, +} eAnalogReference ; + +/* + * \brief Configures the reference voltage used for analog input (i.e. the value used as the top of the input range). + * This function is kept only for compatibility with existing AVR based API. + * + * \param ulMmode Should be set to AR_DEFAULT. + */ +extern void analogReference( eAnalogReference ulMode ) ; + +/* + * \brief Writes an analog value (PWM wave) to a pin. + * + * \param ulPin + * \param ulValue + */ +extern void analogWrite( uint32_t ulPin, uint32_t ulValue ) ; + +/* + * \brief Reads the value from the specified analog pin. + * + * \param ulPin + * + * \return Read value from selected pin, if no error. + */ +extern uint32_t analogRead( uint32_t ulPin ) ; + +/* + * \brief Set the resolution of analogRead return values. Default is 10 bits (range from 0 to 1023). + * + * \param res + */ +extern void analogReadResolution(int res); + +/* + * \brief Set the resolution of analogWrite parameters. Default is 8 bits (range from 0 to 255). + * + * \param res + */ +extern void analogWriteResolution(int res); + +extern void analogOutputInit( void ) ; + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_ANALOG_ */ diff --git a/cores/arduino/wiring_constants.h b/cores/arduino/wiring_constants.h old mode 100755 new mode 100644 index 3bb79b5..8a91c96 --- a/cores/arduino/wiring_constants.h +++ b/cores/arduino/wiring_constants.h @@ -1,57 +1,37 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Arduino-compatible ADC implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ +/* + Copyright (c) 2011 Arduino. All right reserved. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef _WIRING_CONSTANTS_ #define _WIRING_CONSTANTS_ #ifdef __cplusplus extern "C"{ -#endif +#endif // __cplusplus + +#include + +#define HIGH 0x1 +#define LOW 0x0 #define INPUT 0x0 #define OUTPUT 0x1 #define INPUT_PULLUP 0x2 -#define OUTPUT_OPENDRAIN 0x3 -#define INPUT_PULLUP 0x4 -#define INPUT_PULLDOWN 0x5 -#define INPUT_FLOAT 0x6 -#define OUTPUT_DAC 0x7 - -#define true 0x1 -#define false 0x0 +#define INPUT_PULLDOWN 0x3 #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 @@ -63,16 +43,62 @@ extern "C"{ #define SERIAL 0x0 #define DISPLAY 0x1 - -typedef unsigned short word; - enum BitOrder { LSBFIRST = 0, MSBFIRST = 1 }; +// LOW 0 +// HIGH 1 +#define CHANGE 2 +#define FALLING 3 +#define RISING 4 + +#define DEFAULT 1 +#define EXTERNAL 0 + +// undefine stdlib's abs if encountered +#ifdef abs +#undef abs +#endif // abs + +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif // min + +#ifndef max +#define max(a,b) ((a)>(b)?(a):(b)) +#endif // max + +#define abs(x) ((x)>0?(x):-(x)) +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) +#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define radians(deg) ((deg)*DEG_TO_RAD) +#define degrees(rad) ((rad)*RAD_TO_DEG) +#define sq(x) ((x)*(x)) + +#define interrupts() __enable_irq() +#define noInterrupts() __disable_irq() + +#define lowByte(w) ((uint8_t) ((w) & 0xff)) +#define highByte(w) ((uint8_t) ((w) >> 8)) + +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + +typedef unsigned int word; + +#define bit(b) (1UL << (b)) + + +typedef bool boolean ; + +typedef uint8_t byte ; + #ifdef __cplusplus -} -#endif +} // extern "C" +#endif // __cplusplus -#endif +#endif /* _WIRING_CONSTANTS_ */ diff --git a/cores/arduino/wiring_debug.h b/cores/arduino/wiring_debug.h deleted file mode 100755 index e61412b..0000000 --- a/cores/arduino/wiring_debug.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wiring_debug.h - * @brief High level debug port configuration - */ - -/** - * @brief Disable the JTAG and Serial Wire (SW) debug ports. - * - * You can call this function in order to use the JTAG and SW debug - * pins as ordinary GPIOs. - * - * @see enableDebugPorts() - */ -static inline void disableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_NONE); -} - -/** - * @brief Enable the JTAG and Serial Wire (SW) debug ports. - * - * After you call this function, the JTAG and SW debug pins will no - * longer be usable as GPIOs. - * - * @see disableDebugPorts() - */ -static inline void enableDebugPorts(void) { - afio_cfg_debug_ports(AFIO_DEBUG_FULL_SWJ); -} diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c new file mode 100644 index 0000000..466b632 --- /dev/null +++ b/cores/arduino/wiring_digital.c @@ -0,0 +1,91 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" + +#ifdef __cplusplus + extern "C" { +#endif + + +//This is the list of the IOs configured +uint32_t g_digPinConfigured[MAX_NB_PORT] = {0}; +extern uint32_t g_anOutputPinConfigured[MAX_NB_PORT]; + + +void pinMode( uint32_t ulPin, uint32_t ulMode ) +{ + PinName p = digitalPinToPinName(ulPin); + + if(p != NC) { + // If the pin that support PWM or DAC output, we need to turn it off + if(is_pin_configured(p, g_anOutputPinConfigured)) { + if(pin_in_pinmap(p, PinMap_DAC)) { + dac_stop(p); + } else if(pin_in_pinmap(p, PinMap_PWM)) { + pwm_stop(p); + } + reset_pin_configured(p, g_anOutputPinConfigured); + } + + switch ( ulMode ) + { + case INPUT: + digital_io_init(p, GPIO_MODE_INPUT, GPIO_NOPULL); + break; + case INPUT_PULLUP: + digital_io_init(p, GPIO_MODE_INPUT, GPIO_PULLUP); + break; + case INPUT_PULLDOWN: + digital_io_init(p, GPIO_MODE_INPUT, GPIO_PULLDOWN); + break; + case OUTPUT: + digital_io_init(p, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL); + break; + default: + break; + } + set_pin_configured(p, g_digPinConfigured); + } +} + +void digitalWrite( uint32_t ulPin, uint32_t ulVal ) +{ + PinName p = digitalPinToPinName(ulPin); + if(p != NC) { + if(is_pin_configured(p, g_digPinConfigured)) { + digital_io_write(get_GPIO_Port(STM_PORT(p)), STM_GPIO_PIN(p), ulVal); + } + } +} + +int digitalRead( uint32_t ulPin ) +{ + uint8_t level = 0; + PinName p = digitalPinToPinName(ulPin); + if(p != NC) { + if(is_pin_configured(p, g_digPinConfigured)) { + level = digital_io_read(get_GPIO_Port(STM_PORT(p)), STM_GPIO_PIN(p)); + } + return (level)? HIGH : LOW; + } +} + +#ifdef __cplusplus +} +#endif diff --git a/cores/arduino/wiring_digital.cpp b/cores/arduino/wiring_digital.cpp deleted file mode 100755 index 9a37e4a..0000000 --- a/cores/arduino/wiring_digital.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * Arduino-compatible digital I/O implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "wiring.h" -#include "io.h" -#include "Arduino.h" -#include "dac.h" - -void pinMode(uint8 pin, uint8 mode) -{ - gpio_pin_mode outputMode; - boolean pwm = false; - - if (pin >= GPIO_PINS) - { - return; - } - - switch(mode) - { - case OUTPUT: - outputMode = GPIO_OUTPUT_PP; - break; - case OUTPUT_OPENDRAIN: - outputMode = GPIO_OUTPUT_OD; - break; - case INPUT: - case INPUT_PULLDOWN: - outputMode = GPIO_INPUT_PD; - break; - case INPUT_FLOAT: - outputMode = GPIO_INPUT_FLOATING; - break; - case INPUT_PULLUP: - outputMode = GPIO_INPUT_PU; - break; - default: - ASSERT(0); - return; - } - - gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, outputMode); - - if (PIN_MAP[pin].timer_device != NULL) - { - /* Enable/disable timer channels if we're switching into or - * out of PWM. */ - timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, pwm ? TIMER_PWM : TIMER_DISABLED); - } -} - - -uint32 digitalRead(uint8 pin) -{ - if (pin >= GPIO_PINS) - { - return 0; - } - - return gpio_read_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit) ? HIGH : LOW; -} - -void digitalWrite(uint8 pin, uint8 val) -{ - if (pin >= GPIO_PINS) - { - return; - } - - gpio_write_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, val); -} - -void togglePin(uint8 pin) -{ - if (pin >= GPIO_PINS) - { - return; - } - - gpio_toggle_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit); -} - -uint32_t pulseIn( uint8 pin, uint32_t state, uint32_t timeout ) -{ - while(digitalRead(pin) == state); - while(digitalRead(pin) == !state); - uint32_t start_time = micros(); - while(digitalRead(pin) == state); - return (micros()-start_time); -} diff --git a/cores/arduino/wiring_digital.h b/cores/arduino/wiring_digital.h new file mode 100644 index 0000000..3b69cf8 --- /dev/null +++ b/cores/arduino/wiring_digital.h @@ -0,0 +1,69 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_DIGITAL_ +#define _WIRING_DIGITAL_ + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * \brief Configures the specified pin to behave either as an input or an output. See the description of digital pins for details. + * + * \param ulPin The number of the pin whose mode you wish to set + * \param ulMode Either INPUT or OUTPUT + */ +extern void pinMode( uint32_t dwPin, uint32_t dwMode ) ; + +/** + * \brief Write a HIGH or a LOW value to a digital pin. + * + * If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the + * corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW. + * + * If the pin is configured as an INPUT, writing a HIGH value with digitalWrite() will enable an internal + * 20K pullup resistor (see the tutorial on digital pins). Writing LOW will disable the pullup. The pullup + * resistor is enough to light an LED dimly, so if LEDs appear to work, but very dimly, this is a likely + * cause. The remedy is to set the pin to an output with the pinMode() function. + * + * \note Digital pin PIN_LED is harder to use as a digital input than the other digital pins because it has an LED + * and resistor attached to it that's soldered to the board on most boards. If you enable its internal 20k pull-up + * resistor, it will hang at around 1.7 V instead of the expected 5V because the onboard LED and series resistor + * pull the voltage level down, meaning it always returns LOW. If you must use pin PIN_LED as a digital input, use an + * external pull down resistor. + * + * \param dwPin the pin number + * \param dwVal HIGH or LOW + */ +extern void digitalWrite( uint32_t dwPin, uint32_t dwVal ) ; + +/** + * \brief Reads the value from a specified digital pin, either HIGH or LOW. + * + * \param ulPin The number of the digital pin you want to read (int) + * + * \return HIGH or LOW + */ +extern int digitalRead( uint32_t ulPin ) ; + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_DIGITAL_ */ diff --git a/cores/arduino/wiring_private.h b/cores/arduino/wiring_private.h new file mode 100644 index 0000000..82bea80 --- /dev/null +++ b/cores/arduino/wiring_private.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WiringPrivate_h +#define WiringPrivate_h + +#include +#include +#include + +#ifdef __cplusplus +extern "C"{ +#endif + +// Includes ST CMSIS +#include + +#include "wiring_constants.h" + +#ifdef __cplusplus +} // extern "C" + +#include "HardwareSerial.h" + +#endif + +#endif diff --git a/cores/arduino/wiring_pulse.cpp b/cores/arduino/wiring_pulse.cpp new file mode 100644 index 0000000..c2bca8f --- /dev/null +++ b/cores/arduino/wiring_pulse.cpp @@ -0,0 +1,84 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" +#include "wiring_private.h" + +/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. + * + * ATTENTION: + * This function performs better with short pulses in noInterrupt() context + */ + +#ifdef __cplusplus + extern "C" { +#endif + + +uint32_t pulseIn( uint32_t pin, uint32_t state, uint32_t timeout ) +{ + uint32_t startMicros = micros(); + uint32_t start_level = (uint32_t)digitalRead(pin); + uint32_t current_level = start_level; + + while(current_level == start_level) { + if (micros() - startMicros > timeout) { + return 0; + } + current_level = (uint32_t)digitalRead(pin); + } + + while(current_level != state) { + if (micros() - startMicros > timeout) { + return 0; + } + current_level = (uint32_t)digitalRead(pin); + } + + //lets start measuring the pulse time now + startMicros = micros(); + + while(current_level == state) { + if (micros() - startMicros > timeout) { + return 0; + } + current_level = (uint32_t)digitalRead(pin); + } + + return (micros() - startMicros); +} + +/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. + * + * ATTENTION: + * this function relies on micros() so cannot be used in noInterrupt() context + */ +uint32_t pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) +{ + return pulseIn(pin, state, timeout); +} + +#ifdef __cplusplus +} +#endif diff --git a/cores/arduino/wiring_pulse.h b/cores/arduino/wiring_pulse.h new file mode 100644 index 0000000..3087cb9 --- /dev/null +++ b/cores/arduino/wiring_pulse.h @@ -0,0 +1,40 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_PULSE_ +#define _WIRING_PULSE_ + +#ifdef __cplusplus + extern "C" { +#endif + +unsigned long countPulseASM(const volatile uint32_t *port, uint32_t bit, uint32_t stateMask, unsigned long maxloops); +/* + * \brief Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. + */ +extern uint32_t pulseIn( uint32_t ulPin, uint32_t ulState, uint32_t ulTimeout = 1000000L ) ; +extern uint32_t pulseInLong( uint8_t pin, uint8_t state, unsigned long timeout = 1000000L ) ; + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_PULSE_ */ diff --git a/cores/arduino/wiring_shift.c b/cores/arduino/wiring_shift.c new file mode 100644 index 0000000..302f0b5 --- /dev/null +++ b/cores/arduino/wiring_shift.c @@ -0,0 +1,71 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder ) +{ + uint8_t value = 0 ; + uint8_t i ; + + for ( i=0 ; i < 8 ; ++i ) + { + digitalWrite( ulClockPin, HIGH ) ; + + if ( ulBitOrder == LSBFIRST ) + { + value |= digitalRead( ulDataPin ) << i ; + } + else + { + value |= digitalRead( ulDataPin ) << (7 - i) ; + } + + digitalWrite( ulClockPin, LOW ) ; + } + + return value ; +} + +void shiftOut( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder, uint32_t ulVal ) +{ + uint8_t i ; + + for ( i=0 ; i < 8 ; i++ ) + { + if ( ulBitOrder == LSBFIRST ) + { + digitalWrite( ulDataPin, !!(ulVal & (1 << i)) ) ; + } + else + { + digitalWrite( ulDataPin, !!(ulVal & (1 << (7 - i))) ) ; + } + + digitalWrite( ulClockPin, HIGH ) ; + digitalWrite( ulClockPin, LOW ) ; + } +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/cores/arduino/wiring_shift.cpp b/cores/arduino/wiring_shift.cpp deleted file mode 100755 index 7448c17..0000000 --- a/cores/arduino/wiring_shift.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * wiring_shift.c - shiftOut() function - * Part of Arduino - http://www.arduino.cc/ - * - * Copyright (c) 2005-2006 David A. Mellis - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - * - * $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ - */ - -#include "wiring.h" - -void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 val) { - int i; - - for (i = 0; i < 8; i++) { - if (bitOrder == LSBFIRST) { - digitalWrite(dataPin, !!(val & (1 << i))); - } else { - digitalWrite(dataPin, !!(val & (1 << (7 - i)))); - } - - digitalWrite(clockPin, HIGH); - digitalWrite(clockPin, LOW); - } -} diff --git a/cores/arduino/wiring_shift.h b/cores/arduino/wiring_shift.h new file mode 100644 index 0000000..f33d848 --- /dev/null +++ b/cores/arduino/wiring_shift.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _WIRING_SHIFT_ +#define _WIRING_SHIFT_ + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * \brief + */ +extern uint32_t shiftIn( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder ) ; + + +/* + * \brief + */ +extern void shiftOut( uint32_t ulDataPin, uint32_t ulClockPin, uint32_t ulBitOrder, uint32_t ulVal ) ; + + +#ifdef __cplusplus +} +#endif + +#endif /* _WIRING_SHIFT_ */ diff --git a/cores/arduino/wiring_time.cpp b/cores/arduino/wiring_time.cpp deleted file mode 100755 index 481597c..0000000 --- a/cores/arduino/wiring_time.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @brief Delay implementation. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "memory.h" -#include "systick.h" -#include "wiring_time.h" -#include "delay.h" - -void delay(unsigned long ms) { - HAL_Delay(ms); -} - -void delayMicroseconds(uint32 us) { - us--; - unsigned long start_time = micros(); - while (micros()<(start_time+us)); -} diff --git a/cores/arduino/wiring_time.h b/cores/arduino/wiring_time.h deleted file mode 100755 index 634337c..0000000 --- a/cores/arduino/wiring_time.h +++ /dev/null @@ -1,110 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wiring_time.h - * @brief Timing and delay functions. - */ - - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#ifndef __wiring_time_H_ -#define __wiring_time_H_ - -#include "memory.h" -#include "nvic.h" -#include "systick.h" -#include "boards.h" - -#define US_PER_MS 1000 - -/** - * Returns time (in milliseconds) since the beginning of program - * execution. On overflow, restarts at 0. - * @see micros() - */ -static inline uint32 millis(void) { - return systick_uptime(); -} - -/** - * Returns time (in microseconds) since the beginning of program - * execution. On overflow, restarts at 0. - * @see millis() - */ -static inline uint32 micros(void) { - uint32 ms; - uint32 cycle_cnt; - uint32 res; - - do { - ms = millis(); - cycle_cnt = systick_get_count(); - asm volatile("nop"); //allow interrupt to fire - asm volatile("nop"); - } while (ms != millis()); - - if(systick_check_underflow()) { - ms++; - cycle_cnt = systick_get_count(); - } - - /* SYSTICK_RELOAD_VAL is 1 less than the number of cycles it - actually takes to complete a SysTick reload */ - res = (ms * US_PER_MS) + - (SYSTICK_RELOAD_VAL + 1 - cycle_cnt) / CYCLES_PER_MICROSECOND; - - return res; -} - -/** - * Delay for at least the given number of milliseconds. - * - * Interrupts, etc. may cause the actual number of milliseconds to - * exceed ms. However, this function will return no less than ms - * milliseconds from the time it is called. - * - * @param ms the number of milliseconds to delay. - * @see delayMicroseconds() - */ -void delay(unsigned long ms); - -/** - * Delay for at least the given number of microseconds. - * - * Interrupts, etc. may cause the actual number of microseconds to - * exceed us. However, this function will return no less than us - * microseconds from the time it is called. - * - * @param us the number of microseconds to delay. - * @see delay() - */ -void delayMicroseconds(uint32 us); - -#endif diff --git a/cores/arduino/wiring_types.h b/cores/arduino/wiring_types.h deleted file mode 100755 index 1760680..0000000 --- a/cores/arduino/wiring_types.h +++ /dev/null @@ -1,72 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish_types.h - * @author Marti Bolivar - * @brief Wirish library type definitions. - */ - /* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - -#include "types.h" -#include "gpio.h" -#include "timer.h" -#include "adc.h" - -#ifndef _wiring_TYPES_H_ -#define _wiring_TYPES_H_ - -/** - * Invalid stm32_pin_info adc_channel value. - * @see stm32_pin_info - */ -#define ADCx 0xFF -#define AFx 0xFF // alfran: added to improove the pwm management - -/** - * @brief Stores STM32-specific information related to a given pin. - * @see PIN_MAP - */ -typedef struct stm32_pin_info { - gpio_dev *gpio_device; /**< GPIO device */ - uint8 gpio_bit; /**< GPIO port bit. */ - timer_dev *timer_device; /**< Pin's timer device, if any. */ - uint8 timer_channel; /**< Timer channel, or 0 if none. */ - uint8 alternate_function; /**< Alernate function for PWM. */ // alfran: added to improove the pwm management - const adc_dev *adc_device; /**< ADC device, if any. */ - uint8 adc_channel; /**< Pin ADC channel, or ADCx if none. */ - uint8 filler; -} stm32_pin_info; - -/** - * Variable attribute, instructs the linker to place the marked - * variable in Flash instead of RAM. */ -#define __FLASH__ __attr_flash - -#endif diff --git a/libraries/Audio/src/Audio.cpp b/libraries/Audio/src/Audio.cpp index f647506..393c51b 100644 --- a/libraries/Audio/src/Audio.cpp +++ b/libraries/Audio/src/Audio.cpp @@ -1,6 +1,8 @@ /* * Copyright (c) 2012 by Cristian Maglie - * Audio library for Arduino Due. + * Audio library. + * + * Modified by Frederic Pillon * * This file is free software; you can redistribute it and/or modify * it under the terms of either the GNU General Public License version 2 @@ -9,7 +11,7 @@ */ #include "Audio.h" -#include "otto_audio_inout.h" +//#include "bsp_audio_inout.h" AudioClass Audio; diff --git a/libraries/Audio/src/Audio.h b/libraries/Audio/src/Audio.h index 5a94716..bb4dd8e 100644 --- a/libraries/Audio/src/Audio.h +++ b/libraries/Audio/src/Audio.h @@ -1,6 +1,8 @@ /* * Copyright (c) 2012 by Cristian Maglie - * Audio library for Arduino Due. + * Audio library. + * + * Modified by Frederic Pillon * * This file is free software; you can redistribute it and/or modify * it under the terms of either the GNU General Public License version 2 @@ -14,8 +16,8 @@ #include #include #include "Wave.h" -/* otto includes component */ -#include "otto_audio_inout.h" +/* BSP includes component */ +#include "bsp_audio_inout.h" #define AUDIO_IN_BUFFER_SIZE 4*2304 diff --git a/system/Drivers/BSP/Components/Common/audio.h b/libraries/Audio/src/Components/Common/audio.h similarity index 100% rename from system/Drivers/BSP/Components/Common/audio.h rename to libraries/Audio/src/Components/Common/audio.h diff --git a/system/Drivers/BSP/Components/wm8994/Release_Notes.html b/libraries/Audio/src/Components/wm8994/Release_Notes.html similarity index 100% rename from system/Drivers/BSP/Components/wm8994/Release_Notes.html rename to libraries/Audio/src/Components/wm8994/Release_Notes.html diff --git a/system/Drivers/BSP/Components/wm8994/wm8994.c b/libraries/Audio/src/Components/wm8994/wm8994.c similarity index 100% rename from system/Drivers/BSP/Components/wm8994/wm8994.c rename to libraries/Audio/src/Components/wm8994/wm8994.c diff --git a/system/Drivers/BSP/Components/wm8994/wm8994.h b/libraries/Audio/src/Components/wm8994/wm8994.h similarity index 100% rename from system/Drivers/BSP/Components/wm8994/wm8994.h rename to libraries/Audio/src/Components/wm8994/wm8994.h diff --git a/libraries/Audio/src/Wave.cpp b/libraries/Audio/src/Wave.cpp index 427f3e1..3b44fb0 100644 --- a/libraries/Audio/src/Wave.cpp +++ b/libraries/Audio/src/Wave.cpp @@ -1,3 +1,6 @@ +/* + * Created by Frederic Pillon + */ #include "Wave.h" /******************************************************************************* diff --git a/libraries/Audio/src/Wave.h b/libraries/Audio/src/Wave.h index 626a1b9..a20b10f 100644 --- a/libraries/Audio/src/Wave.h +++ b/libraries/Audio/src/Wave.h @@ -1,3 +1,6 @@ +/* + * Created by Frederic Pillon + */ #ifndef WAVE_H #define WAVE_H diff --git a/variants/otto/otto_audio_inout.c b/libraries/Audio/src/bsp_audio_inout.c similarity index 98% rename from variants/otto/otto_audio_inout.c rename to libraries/Audio/src/bsp_audio_inout.c index f1b35ef..7f1510c 100644 --- a/variants/otto/otto_audio_inout.c +++ b/libraries/Audio/src/bsp_audio_inout.c @@ -1,11 +1,10 @@ /** ****************************************************************************** - * @file otto_audio_inout.c + * @file bsp_audio_inout.c * @author MCD Application Team * @version V1.0.0 * @date 04-Oct-2016 * @brief This file includes the definitions for I2C codec handler - * for otto board. ****************************************************************************** * @attention * @@ -79,7 +78,7 @@ How To use this driver: Driver architecture: -------------------- - + This driver provide the High Audio Layer: consists of the function API exported in the otto_audio_inout.h file + + This driver provide the High Audio Layer: consists of the function API exported in the bsp_audio_inout.h file (BSP_AUDIO_OUT_Init(), BSP_AUDIO_OUT_Play() ...) + This driver provide also the Media Access Layer (MAL): which consists of functions allowing to access the media containing/ providing the audio file/stream. These functions are also included as local functions into @@ -96,8 +95,8 @@ Known Limitations: ==============================================================================*/ /* Includes ------------------------------------------------------------------*/ -#include "otto_audio_inout.h" -#include "dma.h" +#include "bsp_audio_inout.h" +//#include "dma.h" /** @defgroup Private_Defines * @brief Headphone1 (CN27 of STM32469i board) is connected to the @@ -148,11 +147,11 @@ static void SAIx_In_DeInit(void); * @param None * @retval None */ -void BSP_AUDIO_OUT_DMA2_Stream5_IRQHandler(void) +void DMA2_Stream5_IRQHandler(void) { HAL_DMA_IRQHandler(haudio_out_sai.hdmatx); } -void BSP_AUDIO_IN_DMA2_Stream3_IRQHandler(void) +void DMA2_Stream3_IRQHandler(void) { HAL_DMA_IRQHandler(haudio_in_sai.hdmarx); } @@ -546,9 +545,6 @@ __HAL_RCC_GPIOE_CLK_ENABLE(); /* Enable the DMA clock */ AUDIO_SAIx_DMAx_CLK_ENABLE(); - /* arduino internal driver init - somehow redundant with above */ - dma_init(DMA2_dev); - if(hsai->Instance == AUDIO_SAIx) { /* Configure the hdma_saiTx handle parameters */ @@ -579,9 +575,6 @@ __HAL_RCC_GPIOE_CLK_ENABLE(); /* SAI DMA IRQ Channel configuration */ HAL_NVIC_SetPriority(AUDIO_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0); - - /* Register also the IRQ in arduino DMA driver so that correct handler is called */ - dma_attach_interrupt(DMA2_dev, DMA_STREAM5, BSP_AUDIO_OUT_DMA2_Stream5_IRQHandler); HAL_NVIC_EnableIRQ(AUDIO_SAIx_DMAx_IRQ); } /** @@ -1024,9 +1017,6 @@ __weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params) /* Enable the DMA clock */ AUDIO_IN_SAIx_DMAx_CLK_ENABLE(); - /* arduino internal driver init - somehow redundant with above */ - dma_init(DMA2_dev); - if(hsai->Instance == AUDIO_IN_SAIx) { /* Configure the hdma_sai_rx handle parameters */ @@ -1057,8 +1047,6 @@ __weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params) /* SAI DMA IRQ Channel configuration */ HAL_NVIC_SetPriority(AUDIO_IN_SAIx_DMAx_IRQ, AUDIO_IN_IRQ_PREPRIO, 0); - /* Register also the IRQ in arduino DMA driver so that correct handler is called */ - dma_attach_interrupt(DMA2_dev, DMA_STREAM3, BSP_AUDIO_IN_DMA2_Stream3_IRQHandler); HAL_NVIC_EnableIRQ(AUDIO_IN_SAIx_DMAx_IRQ); /* Audio INT IRQ Channel configuration */ diff --git a/variants/otto/otto_audio_inout.h b/libraries/Audio/src/bsp_audio_inout.h similarity index 95% rename from variants/otto/otto_audio_inout.h rename to libraries/Audio/src/bsp_audio_inout.h index 8677b48..20a283c 100644 --- a/variants/otto/otto_audio_inout.h +++ b/libraries/Audio/src/bsp_audio_inout.h @@ -1,11 +1,11 @@ /** ****************************************************************************** - * @file otto_audio_inout.h + * @file bsp_audio_inout.h * @author MCD Application Team * @version V1.0.3 * @date 05-Oct-2016 * @brief This file contains the common defines and functions prototypes for - * the otto_audio_inout.c driver. + * the bsp_audio_inout.c driver. ****************************************************************************** * @attention * @@ -37,8 +37,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __OTTO_AUDIO_INOUT_H -#define __OTTO_AUDIO_INOUT_H +#ifndef __BSP_AUDIO_INOUT_H +#define __BSP_AUDIO_INOUT_H #ifdef __cplusplus extern "C" { @@ -46,8 +46,8 @@ /* Includes ------------------------------------------------------------------*/ /* Include audio component Driver */ -#include "wm8994/wm8994.h" -#include "otto_codec.h" +#include "Components/wm8994/wm8994.h" +#include "i2c_codec.h" /*------------------------------------------------------------------------------ @@ -239,10 +239,6 @@ void BSP_AUDIO_OUT_ClockConfig(SAI_HandleTypeDef *hsai, uint32_t AudioFreq, voi void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params); void BSP_AUDIO_OUT_MspDeInit(SAI_HandleTypeDef *hsai, void *Params); -/** - * @} - */ - /** @defgroup STM32469I-EVAL_AUDIO_IN_Exported_Functions STM32469I EVAL AUDIO IN Exported Functions * @{ */ @@ -270,27 +266,10 @@ void BSP_AUDIO_IN_ClockConfig(SAI_HandleTypeDef *hsai, uint32_t AudioFreq, void void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params); void BSP_AUDIO_IN_MspDeInit(SAI_HandleTypeDef *hsai, void *Params); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - #ifdef __cplusplus } #endif -#endif /* __OTTO_AUDIO_INOUT_H */ +#endif /* __BSP_AUDIO_INOUT_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/otto_codec.c b/libraries/Audio/src/i2c_codec.c similarity index 98% rename from variants/otto/otto_codec.c rename to libraries/Audio/src/i2c_codec.c index c1764cd..2e67961 100644 --- a/variants/otto/otto_codec.c +++ b/libraries/Audio/src/i2c_codec.c @@ -1,11 +1,10 @@ /** ****************************************************************************** - * @file otto_codec.c + * @file i2c_codec.c * @author MCD Application Team * @version V1.0.0 * @date 04-Oct-2016 - * @brief This file includes the I2C codec handler for STM32469I-otto - * board. + * @brief This file includes the I2C codec handler ****************************************************************************** * @attention * @@ -42,7 +41,7 @@ ------------------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ -#include "otto_codec.h" +#include "i2c_codec.h" /** @defgroup STM32469I_EVAL_LOW_LEVEL_Private_Variables LOW_LEVEL Private Variables * @{ @@ -50,10 +49,6 @@ static I2C_HandleTypeDef heval_I2c; -/** - * @} - */ - /** @defgroup STM32469I_EVAL_LOW_LEVEL_Private_FunctionPrototypes LOW_LEVEL Private FunctionPrototypes * @{ */ diff --git a/variants/otto/otto_codec.h b/libraries/Audio/src/i2c_codec.h similarity index 85% rename from variants/otto/otto_codec.h rename to libraries/Audio/src/i2c_codec.h index 15e3c9f..5bde4c9 100644 --- a/variants/otto/otto_codec.h +++ b/libraries/Audio/src/i2c_codec.h @@ -1,11 +1,10 @@ /** ****************************************************************************** - * @file otto_codec.h + * @file i2c_codec.h * @author MCD Application Team * @version V1.0.0 * @date 04-Oct-2016 * @brief This file includes the definitions for I2C codec handler - * for STM32469I-otto board. ****************************************************************************** * @attention * @@ -37,15 +36,15 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __OTTO_CODEC_H -#define __OTTO_CODEC_H +#ifndef __BSP_CODEC_H +#define __BSP_CODEC_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" +#include "stm32_def.h" /* Exported constant IO ------------------------------------------------------*/ @@ -91,46 +90,10 @@ #define EVAL_I2Cx_EV_IRQn I2C2_EV_IRQn #define EVAL_I2Cx_ER_IRQn I2C2_ER_IRQn -/** - * @} - */ - -/** @defgroup STM32469I_EVAL_LOW_LEVEL_Exported_Macros STM32469I EVAL Low Level Exported Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I_EVAL_LOW_LEVEL_Exported_Functions STM32469I EVAL Low Level Exported Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - #ifdef __cplusplus } #endif -#endif /* __OTTO_CODEC_H */ +#endif /* __BSP_CODEC_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/FatFs/library.properties b/libraries/FatFs/library.properties new file mode 100644 index 0000000..e0c1e5f --- /dev/null +++ b/libraries/FatFs/library.properties @@ -0,0 +1,9 @@ +name=FatFs +version=0.11 +author=(C)ChaN +maintainer=Chan +sentence=FAT file system based on open-source FatFS solution. +paragraph=FatFs is a generic FAT file system module for small embedded systems. The FatFs is written in compliance with ANSI C and completely separated from the disk I/O layer. Therefore it is independent of hardware architecture. +category=Data Storage +url=http://elm-chan.org/fsw/ff/00index_e.html +architectures=stm32f4 diff --git a/system/Middlewares/Third_Party/FatFs/src/00readme.txt b/libraries/FatFs/src/00readme.txt similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/00readme.txt rename to libraries/FatFs/src/00readme.txt diff --git a/system/Middlewares/Third_Party/FatFs/src/diskio.c b/libraries/FatFs/src/diskio.c similarity index 65% rename from system/Middlewares/Third_Party/FatFs/src/diskio.c rename to libraries/FatFs/src/diskio.c index 576826e..ba0f215 100644 --- a/system/Middlewares/Third_Party/FatFs/src/diskio.c +++ b/libraries/FatFs/src/diskio.c @@ -1,7 +1,7 @@ /*-----------------------------------------------------------------------*/ /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2014 */ /* */ -/* Portions COPYRIGHT 2015 STMicroelectronics */ +/* Portions COPYRIGHT 2017 STMicroelectronics */ /* Portions Copyright (C) 2014, ChaN, all right reserved */ /*-----------------------------------------------------------------------*/ /* If a working storage control module is available, it should be */ @@ -14,23 +14,43 @@ ****************************************************************************** * @file diskio.c * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief FatFs low level disk I/O module. ****************************************************************************** * @attention * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * 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. + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ diff --git a/system/Middlewares/Third_Party/FatFs/src/diskio.h b/libraries/FatFs/src/diskio.h similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/diskio.h rename to libraries/FatFs/src/diskio.h diff --git a/libraries/FatFs/src/drivers/sd_diskio.c b/libraries/FatFs/src/drivers/sd_diskio.c new file mode 100644 index 0000000..90f883a --- /dev/null +++ b/libraries/FatFs/src/drivers/sd_diskio.c @@ -0,0 +1,276 @@ +/** + ****************************************************************************** + * @file sd_diskio.c + * @author MCD Application Team + * @version V1.4.1 + * @date 14-February-2017 + * @brief SD Disk I/O driver + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "ff_gen_drv.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#if defined (STM32F1xx) || defined(STM32F2xx) || defined(STM32L4xx) +/* Block Size in Bytes */ +#define BLOCK_SIZE 512 +#endif +/* Private variables ---------------------------------------------------------*/ +/* Disk status */ +static volatile DSTATUS Stat = STA_NOINIT; + +/* Private function prototypes -----------------------------------------------*/ +DSTATUS SD_initialize (BYTE); +DSTATUS SD_status (BYTE); +DRESULT SD_read (BYTE, BYTE*, DWORD, UINT); +#if _USE_WRITE == 1 + DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT); +#endif /* _USE_WRITE == 1 */ +#if _USE_IOCTL == 1 + DRESULT SD_ioctl (BYTE, BYTE, void*); +#endif /* _USE_IOCTL == 1 */ + +const Diskio_drvTypeDef SD_Driver = +{ + SD_initialize, + SD_status, + SD_read, +#if _USE_WRITE == 1 + SD_write, +#endif /* _USE_WRITE == 1 */ + +#if _USE_IOCTL == 1 + SD_ioctl, +#endif /* _USE_IOCTL == 1 */ +}; + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief Initializes a Drive + * @param lun : not used + * @retval DSTATUS: Operation status + */ +DSTATUS SD_initialize(BYTE lun) +{ + Stat = STA_NOINIT; + + /* Configure the uSD device */ + if(BSP_SD_Init() == MSD_OK) + { + Stat &= ~STA_NOINIT; + } + + return Stat; +} + +/** + * @brief Gets Disk Status + * @param lun : not used + * @retval DSTATUS: Operation status + */ +DSTATUS SD_status(BYTE lun) +{ + Stat = STA_NOINIT; +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + if(BSP_SD_GetCardState() == MSD_OK) +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + if(BSP_SD_GetStatus() == MSD_OK) +#endif + { + Stat &= ~STA_NOINIT; + } + + return Stat; +} + +/** + * @brief Reads Sector(s) + * @param lun : not used + * @param *buff: Data buffer to store read data + * @param sector: Sector address (LBA) + * @param count: Number of sectors to read (1..128) + * @retval DRESULT: Operation result + */ +DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count) +{ +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + DRESULT res = RES_ERROR; + uint32_t timeout = 100000; + + if(BSP_SD_ReadBlocks((uint32_t*)buff, + (uint32_t) (sector), + count, SD_DATATIMEOUT) == MSD_OK) + { + while(BSP_SD_GetCardState()!= MSD_OK) + { + if (timeout-- == 0) + { + return RES_ERROR; + } + } + res = RES_OK; + } +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + DRESULT res = RES_OK; + + if(BSP_SD_ReadBlocks((uint32_t*)buff, + (uint64_t) (sector * BLOCK_SIZE), + BLOCK_SIZE, + count) != MSD_OK) + { + res = RES_ERROR; + } +#endif + return res; +} + +/** + * @brief Writes Sector(s) + * @param lun : not used + * @param *buff: Data to be written + * @param sector: Sector address (LBA) + * @param count: Number of sectors to write (1..128) + * @retval DRESULT: Operation result + */ +#if _USE_WRITE == 1 +DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count) +{ +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + DRESULT res = RES_ERROR; + uint32_t timeout = 100000; + + if(BSP_SD_WriteBlocks((uint32_t*)buff, + (uint32_t)(sector), + count, SD_DATATIMEOUT) == MSD_OK) + { + while(BSP_SD_GetCardState()!= MSD_OK) + { + if (timeout-- == 0) + { + return RES_ERROR; + } + } + res = RES_OK; + } +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + DRESULT res = RES_OK; + + if(BSP_SD_WriteBlocks((uint32_t*)buff, + (uint64_t)(sector * BLOCK_SIZE), + BLOCK_SIZE, count) != MSD_OK) + { + res = RES_ERROR; + } +#endif + return res; +} +#endif /* _USE_WRITE == 1 */ + +/** + * @brief I/O control operation + * @param lun : not used + * @param cmd: Control code + * @param *buff: Buffer to send/receive control data + * @retval DRESULT: Operation result + */ +#if _USE_IOCTL == 1 +DRESULT SD_ioctl(BYTE lun, BYTE cmd, void *buff) +{ + DRESULT res = RES_ERROR; +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + BSP_SD_CardInfo CardInfo; +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + SD_CardInfo CardInfo; +#endif + if (Stat & STA_NOINIT) return RES_NOTRDY; + + switch (cmd) + { + /* Make sure that no pending write process */ + case CTRL_SYNC : + res = RES_OK; + break; + + /* Get number of sectors on the disk (DWORD) */ + case GET_SECTOR_COUNT : + BSP_SD_GetCardInfo(&CardInfo); +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + *(DWORD*)buff = CardInfo.LogBlockNbr; +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + *(DWORD*)buff = CardInfo.CardCapacity / BLOCK_SIZE; +#endif + res = RES_OK; + break; + + /* Get R/W sector size (WORD) */ + case GET_SECTOR_SIZE : +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + BSP_SD_GetCardInfo(&CardInfo); + *(WORD*)buff = CardInfo.LogBlockSize; +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + *(WORD*)buff = BLOCK_SIZE; +#endif + res = RES_OK; + break; + + /* Get erase block size in unit of sector (DWORD) */ + case GET_BLOCK_SIZE : +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + BSP_SD_GetCardInfo(&CardInfo); + *(DWORD*)buff = CardInfo.LogBlockSize; +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + *(DWORD*)buff = BLOCK_SIZE; +#endif + res = RES_OK; + break; + + default: + res = RES_PARERR; + } + + return res; +} +#endif /* _USE_IOCTL == 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/libraries/FatFs/src/drivers/sd_diskio.h b/libraries/FatFs/src/drivers/sd_diskio.h new file mode 100644 index 0000000..301db61 --- /dev/null +++ b/libraries/FatFs/src/drivers/sd_diskio.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * @file sd_diskio.h + * @author MCD Application Team + * @version V1.4.1 + * @date 14-February-2017 + * @brief Header for sd_diskio.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SD_DISKIO_H +#define __SD_DISKIO_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern Diskio_drvTypeDef SD_Driver; + +#endif /* __SD_DISKIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.c b/libraries/FatFs/src/drivers/sdram_diskio.c similarity index 63% rename from system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.c rename to libraries/FatFs/src/drivers/sdram_diskio.c index ffa876c..e9ba9ad 100644 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.c +++ b/libraries/FatFs/src/drivers/sdram_diskio.c @@ -2,29 +2,48 @@ ****************************************************************************** * @file sdram_diskio.c * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief SDRAM Disk I/O driver ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© COPYRIGHT 2017 STMicroelectronics

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ - +#if 0 /* Includes ------------------------------------------------------------------*/ #include #include "ff_gen_drv.h" @@ -71,12 +90,12 @@ const Diskio_drvTypeDef SDRAMDISK_Driver = */ DSTATUS SDRAMDISK_initialize(BYTE lun) { - Stat = STA_NOINIT; - /* Configure the SDRAM device */ - BSP_SDRAM_Init(); + if (BSP_SDRAM_Init() == SDRAM_OK) + { + Stat &= ~STA_NOINIT; + } - Stat &= ~STA_NOINIT; return Stat; } @@ -87,10 +106,6 @@ DSTATUS SDRAMDISK_initialize(BYTE lun) */ DSTATUS SDRAMDISK_status(BYTE lun) { - Stat = STA_NOINIT; - - Stat &= ~STA_NOINIT; - return Stat; } @@ -176,6 +191,7 @@ DRESULT SDRAMDISK_ioctl(BYTE lun, BYTE cmd, void *buff) /* Get erase block size in unit of sector (DWORD) */ case GET_BLOCK_SIZE : *(DWORD*)buff = BLOCK_SIZE; + res = RES_OK; break; default: @@ -185,6 +201,6 @@ DRESULT SDRAMDISK_ioctl(BYTE lun, BYTE cmd, void *buff) return res; } #endif /* _USE_IOCTL == 1 */ - +#endif /* 0 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/FatFs/src/drivers/sdram_diskio.h b/libraries/FatFs/src/drivers/sdram_diskio.h new file mode 100644 index 0000000..6d20926 --- /dev/null +++ b/libraries/FatFs/src/drivers/sdram_diskio.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * @file sdram_diskio.h + * @author MCD Application Team + * @version V1.4.1 + * @date 14-February-2017 + * @brief Header for sdram_diskio.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SDRAM_DISKIO_H +#define __SDRAM_DISKIO_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern Diskio_drvTypeDef SDRAMDISK_Driver; + +#endif /* __SDRAM_DISKIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.c b/libraries/FatFs/src/drivers/sram_diskio.c similarity index 63% rename from system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.c rename to libraries/FatFs/src/drivers/sram_diskio.c index f73d2a5..b6d2575 100644 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.c +++ b/libraries/FatFs/src/drivers/sram_diskio.c @@ -2,29 +2,48 @@ ****************************************************************************** * @file sram_diskio.c * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief SRAM Disk I/O driver ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© COPYRIGHT 2017 STMicroelectronics

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ - +#if 0 /* Includes ------------------------------------------------------------------*/ #include #include "ff_gen_drv.h" @@ -74,9 +93,11 @@ DSTATUS SRAMDISK_initialize(BYTE lun) Stat = STA_NOINIT; /* Configure the SRAM device */ - BSP_SRAM_Init(); - - Stat &= ~STA_NOINIT; + if (BSP_SRAM_Init() == SRAM_OK) + { + Stat &= ~STA_NOINIT; + } + return Stat; } @@ -87,10 +108,6 @@ DSTATUS SRAMDISK_initialize(BYTE lun) */ DSTATUS SRAMDISK_status(BYTE lun) { - Stat = STA_NOINIT; - - Stat &= ~STA_NOINIT; - return Stat; } @@ -174,6 +191,7 @@ DRESULT SRAMDISK_ioctl(BYTE lun, BYTE cmd, void *buff) /* Get erase block size in unit of sector (DWORD) */ case GET_BLOCK_SIZE : *(DWORD*)buff = BLOCK_SIZE; + res = RES_OK; break; default: @@ -183,6 +201,6 @@ DRESULT SRAMDISK_ioctl(BYTE lun, BYTE cmd, void *buff) return res; } #endif /* _USE_IOCTL == 1 */ - +#endif /* 0 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/FatFs/src/drivers/sram_diskio.h b/libraries/FatFs/src/drivers/sram_diskio.h new file mode 100644 index 0000000..a4ae88e --- /dev/null +++ b/libraries/FatFs/src/drivers/sram_diskio.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * @file sram_diskio.h + * @author MCD Application Team + * @version V1.4.1 + * @date 14-February-2017 + * @brief Header for sram_diskio.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SRAM_DISKIO_H +#define __SRAM_DISKIO_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern Diskio_drvTypeDef SRAMDISK_Driver; + +#endif /* __SRAM_DISKIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c b/libraries/FatFs/src/drivers/usbh_diskio.c similarity index 71% rename from system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c rename to libraries/FatFs/src/drivers/usbh_diskio.c index 080e8fd..38d947e 100644 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c +++ b/libraries/FatFs/src/drivers/usbh_diskio.c @@ -2,29 +2,48 @@ ****************************************************************************** * @file usbh_diskio.c * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief USB Key Disk I/O driver. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© COPYRIGHT 2017 STMicroelectronics

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ - +#if 0 /* Includes ------------------------------------------------------------------*/ #include #include "ff_gen_drv.h" @@ -297,6 +316,6 @@ DRESULT USBH_ioctl(BYTE lun, BYTE cmd, void *buff) return res; } #endif /* _USE_IOCTL == 1 */ - +#endif /* 0 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/FatFs/src/drivers/usbh_diskio.h b/libraries/FatFs/src/drivers/usbh_diskio.h new file mode 100644 index 0000000..8ee82a8 --- /dev/null +++ b/libraries/FatFs/src/drivers/usbh_diskio.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * @file usbh_diskio.h + * @author MCD Application Team + * @version V1.4.1 + * @date 14-February-2017 + * @brief Header for usbh_diskio.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBH_DISKIO_H +#define __USBH_DISKIO_H + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern Diskio_drvTypeDef USBH_Driver; + +#endif /* __USBH_DISKIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Middlewares/Third_Party/FatFs/src/ff.c b/libraries/FatFs/src/ff.c similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/ff.c rename to libraries/FatFs/src/ff.c diff --git a/system/Middlewares/Third_Party/FatFs/src/ff.h b/libraries/FatFs/src/ff.h similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/ff.h rename to libraries/FatFs/src/ff.h diff --git a/system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.c b/libraries/FatFs/src/ff_gen_drv.c similarity index 59% rename from system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.c rename to libraries/FatFs/src/ff_gen_drv.c index bf21cbb..42d44f2 100644 --- a/system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.c +++ b/libraries/FatFs/src/ff_gen_drv.c @@ -2,25 +2,44 @@ ****************************************************************************** * @file ff_gen_drv.c * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief FatFs generic low level driver. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© COPYRIGHT 2017 STMicroelectronics

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ diff --git a/system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.h b/libraries/FatFs/src/ff_gen_drv.h similarity index 52% rename from system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.h rename to libraries/FatFs/src/ff_gen_drv.h index 4b7913f..942cff7 100644 --- a/system/Middlewares/Third_Party/FatFs/src/ff_gen_drv.h +++ b/libraries/FatFs/src/ff_gen_drv.h @@ -2,25 +2,44 @@ ****************************************************************************** * @file ff_gen_drv.h * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 + * @version V1.4.1 + * @date 14-February-2017 * @brief Header for ff_gen_drv.c module. ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© COPYRIGHT 2017 STMicroelectronics

* - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ diff --git a/system/Middlewares/Third_Party/FatFs/src/ffconf_template.h b/libraries/FatFs/src/ffconf_template.h similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/ffconf_template.h rename to libraries/FatFs/src/ffconf_template.h diff --git a/system/Middlewares/Third_Party/FatFs/src/history.txt b/libraries/FatFs/src/history.txt similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/history.txt rename to libraries/FatFs/src/history.txt diff --git a/system/Middlewares/Third_Party/FatFs/src/integer.h b/libraries/FatFs/src/integer.h similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/integer.h rename to libraries/FatFs/src/integer.h diff --git a/system/Middlewares/Third_Party/FatFs/src/option/cc932.c b/libraries/FatFs/src/option/cc932.c similarity index 98% rename from system/Middlewares/Third_Party/FatFs/src/option/cc932.c rename to libraries/FatFs/src/option/cc932.c index 36db384..149d441 100644 --- a/system/Middlewares/Third_Party/FatFs/src/option/cc932.c +++ b/libraries/FatFs/src/option/cc932.c @@ -8,11 +8,7 @@ #define _TINY_TABLE 0 -#if !_USE_LFN || _CODE_PAGE != 932 -#error This file is not needed in current configuration. Remove from the project. -#endif - - +#if (_USE_LFN != 0) && (_CODE_PAGE == 932) static const WCHAR uni2sjis[] = { /* Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, */ @@ -3796,3 +3792,5 @@ WCHAR ff_wtoupper ( /* Upper converted character */ return tbl_lower[i] ? tbl_upper[i] : chr; } +#endif + diff --git a/system/Middlewares/Third_Party/FatFs/src/option/cc936.c b/libraries/FatFs/src/option/cc936.c similarity index 98% rename from system/Middlewares/Third_Party/FatFs/src/option/cc936.c rename to libraries/FatFs/src/option/cc936.c index 84bc329..3ace36c 100644 --- a/system/Middlewares/Third_Party/FatFs/src/option/cc936.c +++ b/libraries/FatFs/src/option/cc936.c @@ -7,10 +7,7 @@ #include "../ff.h" -#if !_USE_LFN || _CODE_PAGE != 936 -#error This file is not needed in current configuration. Remove from the project. -#endif - +#if (_USE_LFN != 0) && (_CODE_PAGE == 936) static const WCHAR uni2oem[] = { /* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ @@ -10971,3 +10968,4 @@ WCHAR ff_wtoupper ( /* Upper converted character */ return tbl_lower[i] ? tbl_upper[i] : chr; } +#endif diff --git a/system/Middlewares/Third_Party/FatFs/src/option/cc949.c b/libraries/FatFs/src/option/cc949.c similarity index 98% rename from system/Middlewares/Third_Party/FatFs/src/option/cc949.c rename to libraries/FatFs/src/option/cc949.c index 0abda85..0983c67 100644 --- a/system/Middlewares/Third_Party/FatFs/src/option/cc949.c +++ b/libraries/FatFs/src/option/cc949.c @@ -7,11 +7,7 @@ #include "../ff.h" -#if !_USE_LFN || _CODE_PAGE != 949 -#error This file is not needed in current configuration. Remove from the project. -#endif - - +#if (_USE_LFN != 0) && (_CODE_PAGE == 949) static const WCHAR uni2oem[] = { /* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ @@ -8601,3 +8597,4 @@ WCHAR ff_wtoupper ( /* Upper converted character */ return tbl_lower[i] ? tbl_upper[i] : chr; } +#endif diff --git a/system/Middlewares/Third_Party/FatFs/src/option/cc950.c b/libraries/FatFs/src/option/cc950.c similarity index 98% rename from system/Middlewares/Third_Party/FatFs/src/option/cc950.c rename to libraries/FatFs/src/option/cc950.c index d914b6d..dc5ec51 100644 --- a/system/Middlewares/Third_Party/FatFs/src/option/cc950.c +++ b/libraries/FatFs/src/option/cc950.c @@ -7,11 +7,7 @@ #include "../ff.h" -#if !_USE_LFN || _CODE_PAGE != 950 -#error This file is not needed in current configuration. Remove from the project. -#endif - - +#if (_USE_LFN != 0) && (_CODE_PAGE == 950) static const WCHAR uni2oem[] = { /* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ @@ -6827,3 +6823,4 @@ WCHAR ff_wtoupper ( /* Upper converted character */ return tbl_lower[i] ? tbl_upper[i] : chr; } +#endif diff --git a/system/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c b/libraries/FatFs/src/option/ccsbcs.c similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/option/ccsbcs.c rename to libraries/FatFs/src/option/ccsbcs.c diff --git a/system/Middlewares/Third_Party/FatFs/src/option/syscall.c b/libraries/FatFs/src/option/syscall.c similarity index 100% rename from system/Middlewares/Third_Party/FatFs/src/option/syscall.c rename to libraries/FatFs/src/option/syscall.c diff --git a/system/Middlewares/Third_Party/FatFs/src/st_readme.txt b/libraries/FatFs/src/st_readme.txt similarity index 51% rename from system/Middlewares/Third_Party/FatFs/src/st_readme.txt rename to libraries/FatFs/src/st_readme.txt index 4cfde5f..2fae3dd 100644 --- a/system/Middlewares/Third_Party/FatFs/src/st_readme.txt +++ b/libraries/FatFs/src/st_readme.txt @@ -2,7 +2,7 @@ @verbatim ****************************************************************************** * - * Portions COPYRIGHT 2015 STMicroelectronics + * Portions COPYRIGHT 2017 STMicroelectronics * Portions Copyright (C) 2015, ChaN, all right reserved * * @file st_readme.txt @@ -13,22 +13,55 @@ * to UM1721 "Developing Applications on STM32Cube with FatFs" ****************************************************************************** * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: * - * http://www.st.com/software_license_agreement_liberty_v2 + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * 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 SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** @endverbatim -### V1.3.0/08-May-2015 ### +### V1.4.1/14-February-2017 ### +=============================== + + sd_diskio.c, sdram_diskio.c and sram_diskio.c: fix bug in ioctl() function; when called with + "GET_BLOCK_SIZE" as "cmd" parameter value, the “res” variable is not updated with “RES_OK” value + thus the FatFs is getting always "RES_ERROR" as return value, which leads to ignore the actual block size. + + sdram_diskio.c and sram_diskio.c: update initialize() function to check the return value of BSP Init function. + + +### V1.4.0/23-December-2016 ### +=============================== + + Update sd_diskio.c to align with latest changes on SD HAL & BSP APIs, these changes are integrated + in STM32Cube F4 V1.15.0 and F7 V1.6.0 and break the compatibility with previous version. + + +### V1.3.0/23-December-2016 ### ============================ + Upgrade to use FatFs R0.11. + Add new APIs FATFS_LinkDriverEx() and FATFS_UnLinkDriverEx() to manage USB Key Disk having @@ -53,7 +86,7 @@ ### V1.2.1/20-November-2014 ### -============================ +=============================== + Disk I/O drivers; change count argument type from BYTE to UINT + Important note: @@ -63,7 +96,7 @@ ### V1.2.0/04-November-2014 ### -============================ +=============================== + Upgrade to use FatFs R0.10b. + diskio.c: update disk_read() and disk_write() argument's type. @@ -74,7 +107,7 @@ ### V1.1.1/12-September-2014 ### -============================ +================================ + ff_gen_drv.c: Update the Disk_drvTypeDef disk variable initialization to avoid warnings detected with Atollic TrueSTUDIO Complier. diff --git a/libraries/SD/examples/CardInfo/CardInfo.ino b/libraries/SD/examples/CardInfo/CardInfo.ino index f8555a1..38eca42 100644 --- a/libraries/SD/examples/CardInfo/CardInfo.ino +++ b/libraries/SD/examples/CardInfo/CardInfo.ino @@ -17,8 +17,8 @@ SdFatFs fatFs; void setup() { bool disp = false; - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB); SerialUSB.print("\nInitializing SD card..."); @@ -35,13 +35,13 @@ void setup() // print the type of card SerialUSB.print("\nCard type: "); switch (card.type()) { - case STD_CAPACITY_SD_CARD_V1_1: + case SD_CARD_TYPE_SD1: SerialUSB.println("SD1"); break; - case STD_CAPACITY_SD_CARD_V2_0: + case SD_CARD_TYPE_SD2: SerialUSB.println("SD2"); break; - case HIGH_CAPACITY_SD_CARD: + case SD_CARD_TYPE_SDHC: SerialUSB.println("SDHC"); break; default: @@ -55,7 +55,7 @@ void setup() } // print the type and size of the first FAT-type volume - uint32_t volumesize; + uint64_t volumesize; SerialUSB.print("\nVolume type is FAT"); SerialUSB.println(fatFs.fatType(), DEC); SerialUSB.println(); @@ -78,6 +78,7 @@ void setup() // list all files in the card with date and size root.ls(LS_R | LS_DATE | LS_SIZE); + SerialUSB.println("###### End of the SD tests ######"); } void loop(void) { diff --git a/libraries/SD/examples/Datalogger/Datalogger.ino b/libraries/SD/examples/Datalogger/Datalogger.ino index e2459f1..8af6096 100644 --- a/libraries/SD/examples/Datalogger/Datalogger.ino +++ b/libraries/SD/examples/Datalogger/Datalogger.ino @@ -5,19 +5,21 @@ to an SD card using the SD library. The circuit: - * analog sensors on analog ins 0, 1, and 2 + * analog sensors on analog ins A0, A1, and A2 * SD card */ #include +uint32_t A[] = { A0, A1, A2}; + void setup() { - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB) { - ; // wait for serial port to connect. Needed for Leonardo only + ; // wait for SerialUSB port to connect. Needed for Leonardo only } SerialUSB.print("Initializing SD card..."); @@ -37,7 +39,7 @@ void loop() // read three sensors and append to the string: for (int analogPin = 0; analogPin < 3; analogPin++) { - int sensor = analogRead(analogPin); + int sensor = analogRead(A[analogPin]); dataString += String(sensor); if (analogPin < 2) { dataString += ","; @@ -53,7 +55,7 @@ void loop() dataFile.seek(dataFile.size()); dataFile.println(dataString); dataFile.close(); - // print to the serial port too: + // print to the SerialUSB port too: SerialUSB.println(dataString); } // if the file isn't open, pop up an error: diff --git a/libraries/SD/examples/DumpFile/DumpFile.ino b/libraries/SD/examples/DumpFile/DumpFile.ino index 6f9fa1c..5f2d237 100644 --- a/libraries/SD/examples/DumpFile/DumpFile.ino +++ b/libraries/SD/examples/DumpFile/DumpFile.ino @@ -2,7 +2,7 @@ SD card file dump This example shows how to read a file from the SD card using the - SD library and send it over the serial port. + SD library and send it over the SerialUSB port. The circuit: * SD card attached @@ -15,10 +15,10 @@ void setup() { - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB) { - ; // wait for serial port to connect. Needed for Leonardo only + ; // wait for SerialUSB port to connect. Needed for Leonardo only } @@ -46,6 +46,7 @@ void setup() else { SerialUSB.println("error opening datalog.txt"); } + SerialUSB.println("###### End of the SD tests ######"); } void loop() diff --git a/libraries/SD/examples/Files/Files.ino b/libraries/SD/examples/Files/Files.ino index 0cb50a2..b9082c1 100644 --- a/libraries/SD/examples/Files/Files.ino +++ b/libraries/SD/examples/Files/Files.ino @@ -14,10 +14,10 @@ File myFile; void setup() { - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB) { - ; // wait for serial port to connect. Needed for Leonardo only + ; // wait for SerialUSB port to connect. Needed for Leonardo only } @@ -59,6 +59,7 @@ void setup() else { SerialUSB.println("example.txt doesn't exist."); } + SerialUSB.println("###### End of the SD tests ######"); } void loop() diff --git a/libraries/SD/examples/Full/Full.ino b/libraries/SD/examples/Full/Full.ino index 6959cb9..6d48e5f 100644 --- a/libraries/SD/examples/Full/Full.ino +++ b/libraries/SD/examples/Full/Full.ino @@ -6,7 +6,7 @@ uint32_t file_size = 0, seek_val = FALSE, peek_val = 0; uint32_t byteswritten, bytesread = 0; /* File write buffer */ -uint8_t wtext[] = "This is the OTTO SD Test working with FatFs."; +uint8_t wtext[] = "This is the Arduino SD Test working with FatFs."; /* File read buffer */ uint8_t rtext[BUFFERSIZE]; uint32_t i = 0; @@ -15,7 +15,7 @@ File MyFile; void setup() { - SerialUSB.begin(9600); + SerialUSB.begin(115200); while (!SerialUSB); /* Test begin() method */ @@ -26,62 +26,62 @@ void setup() delay(100); /* Test mkdir() method */ - SerialUSB.println("Creating 'STM32F4' directory"); - SD.mkdir("STM32F4"); + SerialUSB.println("Creating 'STM32' directory"); + SD.mkdir("STM32"); SerialUSB.println("Creating 'ARDUINO' directory"); SD.mkdir("ARDUINO"); - SerialUSB.println("Creating 'ARDUINO/OTTO' directory"); - SD.mkdir("ARDUINO/OTTO"); + SerialUSB.println("Creating 'ARDUINO/SD' directory"); + SD.mkdir("ARDUINO/SD"); /* Test open() method */ - SerialUSB.println("Opening 'STM32F4/Toremove.txt' file"); - MyFile = SD.open("STM32F4/Toremove.txt", FILE_WRITE); + SerialUSB.println("Opening 'STM32/Toremove.txt' file"); + MyFile = SD.open("STM32/Toremove.txt", FILE_WRITE); if(MyFile) { - SerialUSB.println("Closing 'STM32F4/Toremove.txt' file"); + SerialUSB.println("Closing 'STM32/Toremove.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'STM32F4/Toremove.txt' file"); + SerialUSB.println("Error to open 'STM32/Toremove.txt' file"); } - SerialUSB.println("Opening 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt", FILE_WRITE); + SerialUSB.println("Opening 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); + MyFile = SD.open("ARDUINO/SD/ARDUINO_SD_TEXT.txt", FILE_WRITE); if(MyFile) { /* Test print() method */ SerialUSB.print("writing \""); SerialUSB.print((const char*)wtext); - SerialUSB.println("\" into ARDUINO_OTTO_TEXT.txt file"); + SerialUSB.println("\" into ARDUINO_SD_TEXT.txt file"); byteswritten = MyFile.print((const char*)wtext); byteswritten += MyFile.print("\n"); SerialUSB.print(byteswritten, DEC); SerialUSB.println(" bytes written."); - SerialUSB.println("Closing 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); } - SerialUSB.println("Opening 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt"); + SerialUSB.println("Opening 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); + MyFile = SD.open("ARDUINO/SD/ARDUINO_SD_TEXT.txt"); if(MyFile) { bytesread = MyFile.read(rtext, MyFile.size()); - SerialUSB.println("Closing 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/ARDUINO_OTTO_TEXT.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/ARDUINO_SD_TEXT.txt' file"); } - SerialUSB.println("Opening 'ARDUINO/OTTO/TEXT.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/TEXT.txt", FILE_WRITE); + SerialUSB.println("Opening 'ARDUINO/SD/TEXT.txt' file"); + MyFile = SD.open("ARDUINO/SD/TEXT.txt", FILE_WRITE); if(MyFile) { byteswritten = MyFile.print((const char*)rtext); MyFile.flush(); - SerialUSB.println("Closing 'ARDUINO/OTTO/TEXT.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/TEXT.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/TEXT.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/TEXT.txt' file"); } - SerialUSB.println("Opening 'ARDUINO/OTTO/TEXT.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/TEXT.txt"); + SerialUSB.println("Opening 'ARDUINO/SD/TEXT.txt' file"); + MyFile = SD.open("ARDUINO/SD/TEXT.txt"); if(MyFile) { /* Test size() method */ file_size = MyFile.size(); @@ -128,7 +128,7 @@ void setup() SerialUSB.println("TEXT.txt content read byte per byte: "); while(MyFile.available()) { - rtext[i] = (uint8)MyFile.read(); + rtext[i] = (uint8_t)MyFile.read(); SerialUSB.print(rtext[i]); SerialUSB.print(" '"); SerialUSB.write(rtext[i]); @@ -136,58 +136,58 @@ void setup() i++; } /* Test close method */ - SerialUSB.println("Closing 'ARDUINO/OTTO/TEXT.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/TEXT.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/TEXT.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/TEXT.txt' file"); } /* Test isDirectory() method */ - MyFile = File("STM32F4"); + MyFile = File("STM32"); if(MyFile) { - SerialUSB.print("Is 'STM32F4' is a dir: "); + SerialUSB.print("Is 'STM32' is a dir: "); if (MyFile.isDirectory()) SerialUSB.println("OK"); else SerialUSB.println("KO"); } else { - SerialUSB.println("Error to open 'STM32F4' dir"); + SerialUSB.println("Error to open 'STM32' dir"); } - SerialUSB.println("Opening 'STM32F4/Toremove.txt' file"); - MyFile = SD.open("STM32F4/Toremove.txt"); + SerialUSB.println("Opening 'STM32/Toremove.txt' file"); + MyFile = SD.open("STM32/Toremove.txt"); if(MyFile) { - SerialUSB.print("Is 'STM32F4/Toremove.txt' is a file: "); + SerialUSB.print("Is 'STM32/Toremove.txt' is a file: "); if (MyFile.isDirectory()) SerialUSB.println("KO"); else SerialUSB.println("OK"); - SerialUSB.println("Closing 'STM32F4/Toremove.txt' file"); + SerialUSB.println("Closing 'STM32/Toremove.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'STM32F4/Toremove.txt' file"); + SerialUSB.println("Error to open 'STM32/Toremove.txt' file"); } /* Test exists(), remove() and rmdir() methods */ - SerialUSB.print("Removing 'STM32F4/Toremove.txt' file..."); - while(SD.exists("STM32F4/Toremove.txt") == TRUE) + SerialUSB.print("Removing 'STM32/Toremove.txt' file..."); + while(SD.exists("STM32/Toremove.txt") == TRUE) { - SD.remove("STM32F4/Toremove.txt"); + SD.remove("STM32/Toremove.txt"); } SerialUSB.println("done"); - SerialUSB.print("Removing 'STM32F4' dir..."); - while(SD.exists("STM32F4") == TRUE) + SerialUSB.print("Removing 'STM32' dir..."); + while(SD.exists("STM32") == TRUE) { - SD.rmdir("STM32F4"); + SD.rmdir("STM32"); } SerialUSB.println("done"); /* Test println(), println(data) methods */ - SerialUSB.println("Opening 'ARDUINO/OTTO/PRINT.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/PRINT.txt", FILE_WRITE); + SerialUSB.println("Opening 'ARDUINO/SD/PRINT.txt' file"); + MyFile = SD.open("ARDUINO/SD/PRINT.txt", FILE_WRITE); if(MyFile) { String str = String("This is a String object on line 7"); - SerialUSB.print("Printing to 'ARDUINO/OTTO/PRINT.txt' file..."); + SerialUSB.print("Printing to 'ARDUINO/SD/PRINT.txt' file..."); MyFile.println("This should be line 1"); MyFile.println(); MyFile.println("This should be line 3"); @@ -196,37 +196,37 @@ void setup() MyFile.println("This should be line 6"); MyFile.println(str); SerialUSB.println("done"); - SerialUSB.println("Closing 'ARDUINO/OTTO/PRINT.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/PRINT.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/PRINT.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/PRINT.txt' file"); } /* Test write(buf, len) method */ - SerialUSB.println("Opening 'ARDUINO/OTTO/WRITE.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/WRITE.txt", FILE_WRITE); + SerialUSB.println("Opening 'ARDUINO/SD/WRITE.txt' file"); + MyFile = SD.open("ARDUINO/SD/WRITE.txt", FILE_WRITE); if(MyFile) { - SerialUSB.print("Writing 'ARDUINO/OTTO/WRITE.txt' file: "); + SerialUSB.print("Writing 'ARDUINO/SD/WRITE.txt' file: "); byteswritten = MyFile.write(wtext, BUFFERSIZE); SerialUSB.print(byteswritten); SerialUSB.println(" bytes written"); - SerialUSB.println("Closing 'ARDUINO/OTTO/WRITE.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/WRITE.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/WRITE.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/WRITE.txt' file"); } /* Test read(buf, len) method */ - SerialUSB.println("Opening 'ARDUINO/OTTO/WRITE.txt' file"); - MyFile = SD.open("ARDUINO/OTTO/WRITE.txt"); + SerialUSB.println("Opening 'ARDUINO/SD/WRITE.txt' file"); + MyFile = SD.open("ARDUINO/SD/WRITE.txt"); if(MyFile) { - SerialUSB.println("Reading 'ARDUINO/OTTO/WRITE.txt' file:"); + SerialUSB.println("Reading 'ARDUINO/SD/WRITE.txt' file:"); bytesread = MyFile.read(rtext, MyFile.size()); SerialUSB.println((const char*)rtext); - SerialUSB.println("Closing 'ARDUINO/OTTO/WRITE.txt' file"); + SerialUSB.println("Closing 'ARDUINO/SD/WRITE.txt' file"); MyFile.close(); } else { - SerialUSB.println("Error to open 'ARDUINO/OTTO/WRITE.txt' file"); + SerialUSB.println("Error to open 'ARDUINO/SD/WRITE.txt' file"); } SerialUSB.println("###### End of the SD tests ######"); } diff --git a/libraries/SD/examples/ReadWrite/ReadWrite.ino b/libraries/SD/examples/ReadWrite/ReadWrite.ino index 3914d02..339617a 100644 --- a/libraries/SD/examples/ReadWrite/ReadWrite.ino +++ b/libraries/SD/examples/ReadWrite/ReadWrite.ino @@ -15,10 +15,10 @@ File myFile; void setup() { - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB) { - ; // wait for serial port to connect. Needed for Leonardo only + ; // wait for SerialUSB port to connect. Needed for Leonardo only } @@ -60,6 +60,7 @@ void setup() // if the file didn't open, print an error: SerialUSB.println("error opening test.txt"); } + SerialUSB.println("###### End of the SD tests ######"); } void loop() diff --git a/libraries/SD/examples/listfiles/listfiles.ino b/libraries/SD/examples/listfiles/listfiles.ino index da7d2fd..4815dd5 100644 --- a/libraries/SD/examples/listfiles/listfiles.ino +++ b/libraries/SD/examples/listfiles/listfiles.ino @@ -16,10 +16,10 @@ File root; void setup() { - // Open serial communications and wait for port to open: - SerialUSB.begin(9600); + // Open SerialUSB communications and wait for port to open: + SerialUSB.begin(115200); while (!SerialUSB) { - ; // wait for Serial port to connect. Needed for Leonardo only + ; // wait for SerialUSB port to connect. Needed for Leonardo only } SerialUSB.print("Initializing SD card..."); @@ -42,6 +42,7 @@ void setup() root.rewindDirectory(); printDirectory(root, 0); root.close(); + SerialUSB.println("###### End of the SD tests ######"); } void loop() diff --git a/libraries/SD/library.properties b/libraries/SD/library.properties index 8d412d7..535ee9d 100644 --- a/libraries/SD/library.properties +++ b/libraries/SD/library.properties @@ -6,4 +6,4 @@ sentence=Enables reading and writing on SD cards. For all Arduino boards. paragraph=Once an SD memory card is connected to the SPI interfare of the Arduino board you are enabled to create files and read/write on them. You can also move through directories on the SD card. category=Data Storage url=http://arduino.cc/en/Reference/SD -architectures=stm32f4 \ No newline at end of file +architectures=stm32f4 diff --git a/libraries/SD/src/SD.cpp b/libraries/SD/src/SD.cpp index 726d16f..e134915 100644 --- a/libraries/SD/src/SD.cpp +++ b/libraries/SD/src/SD.cpp @@ -15,7 +15,7 @@ * Including `SD.h` automatically creates a global `SD` object which can be interacted with in a similar - manner to other standard global objects like `Serial` and `Ethernet`. + manner to other standard global objects like `SerialUSB` and `Ethernet`. * Boilerplate initialisation code is contained in one method named `begin` and no further objects need to be created in order to access @@ -54,7 +54,7 @@ extern "C" { #include #include #include - #include "stm32f4xx_hal.h" + #include "stm32_def.h" } #include "assert.h" #include "SD.h" @@ -231,7 +231,7 @@ File::File(const char* name) _dir.fs = 0; } -/** List directory contents to Serial. +/** List directory contents to SerialUSB. * * \param[in] flags The inclusive OR of * @@ -272,24 +272,24 @@ void File::ls(uint8_t flags, uint8_t indent) { fn = fno.fname; #endif //print any indent spaces - for (int8_t i = 0; i < indent; i++) Serial.print(' '); - Serial.print(fn); + for (int8_t i = 0; i < indent; i++) SerialUSB.print(' '); + SerialUSB.print(fn); if((fno.fattrib & AM_DIR) == 0) { // print modify date/time if requested if (flags & LS_DATE) { - Serial.print(' '); + SerialUSB.print(' '); printFatDate(fno.fdate); - Serial.print(' '); + SerialUSB.print(' '); printFatTime(fno.ftime); } // print size if requested if (flags & LS_SIZE) { - Serial.print(' '); - Serial.print(fno.fsize); + SerialUSB.print(' '); + SerialUSB.print(fno.fsize); } - Serial.println(); + SerialUSB.println(); } else { @@ -303,39 +303,39 @@ void File::ls(uint8_t flags, uint8_t indent) { File filtmp = SD.open(fullPath); if (filtmp._name != NULL) { - Serial.println(); + SerialUSB.println(); filtmp.ls(flags, indent+2); filtmp.close(); } else { - Serial.println(fn); - Serial.print("Error to open dir: "); - Serial.println(fn); + SerialUSB.println(fn); + SerialUSB.print("Error to open dir: "); + SerialUSB.println(fn); } free(fullPath); } else { - Serial.println(); - Serial.print("Error to allocate memory!"); + SerialUSB.println(); + SerialUSB.print("Error to allocate memory!"); } } } } } //------------------------------------------------------------------------------ -/** %Print a directory date field to Serial. +/** %Print a directory date field to SerialUSB. * * Format is yyyy-mm-dd. * * \param[in] fatDate The date field from a directory entry. */ void File::printFatDate(uint16_t fatDate) { - Serial.print(FAT_YEAR(fatDate)); - Serial.print('-'); + SerialUSB.print(FAT_YEAR(fatDate)); + SerialUSB.print('-'); printTwoDigits(FAT_MONTH(fatDate)); - Serial.print('-'); + SerialUSB.print('-'); printTwoDigits(FAT_DAY(fatDate)); } //------------------------------------------------------------------------------ -/** %Print a directory time field to Serial. +/** %Print a directory time field to SerialUSB. * * Format is hh:mm:ss. * @@ -343,13 +343,13 @@ void File::printFatDate(uint16_t fatDate) { */ void File::printFatTime(uint16_t fatTime) { printTwoDigits(FAT_HOUR(fatTime)); - Serial.print(':'); + SerialUSB.print(':'); printTwoDigits(FAT_MINUTE(fatTime)); - Serial.print(':'); + SerialUSB.print(':'); printTwoDigits(FAT_SECOND(fatTime)); } //------------------------------------------------------------------------------ -/** %Print a value as two digits to Serial. +/** %Print a value as two digits to SerialUSB. * * \param[in] v Value to be printed, 0 <= \a v <= 99 */ @@ -358,7 +358,7 @@ void File::printTwoDigits(uint8_t v) { str[0] = '0' + v/10; str[1] = '0' + v % 10; str[2] = 0; - Serial.print(str); + SerialUSB.print(str); } /** diff --git a/libraries/SD/src/Sd2Card.cpp b/libraries/SD/src/Sd2Card.cpp index 1b3ecc2..74b0a0c 100644 --- a/libraries/SD/src/Sd2Card.cpp +++ b/libraries/SD/src/Sd2Card.cpp @@ -41,4 +41,46 @@ uint8_t Sd2Card::init(uint8_t cspin) { } } +uint8_t Sd2Card::type(void) const { + uint8_t cardType = SD_CARD_TYPE_UKN; +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + switch (_SdCardInfo.CardType) { + case CARD_SDSC: + switch (_SdCardInfo.CardVersion) { + case CARD_V1_X: + cardType = SD_CARD_TYPE_SD1; + break; + case CARD_V2_X: + cardType = SD_CARD_TYPE_SD2; + break; + default: + cardType = SD_CARD_TYPE_UKN; + } + break; + case CARD_SDHC_SDXC: + cardType = SD_CARD_TYPE_SDHC; + break; + case CARD_SECURED: + cardType = SD_CARD_TYPE_SECURED; + break; + default: + cardType = SD_CARD_TYPE_UKN; + } +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ + switch (_SdCardInfo.CardType) { + case STD_CAPACITY_SD_CARD_V1_1: + cardType = SD_CARD_TYPE_SD1; + break; + case STD_CAPACITY_SD_CARD_V2_0: + cardType = SD_CARD_TYPE_SD2; + break; + case HIGH_CAPACITY_SD_CARD: + cardType = SD_CARD_TYPE_SDHC; + break; + default: + cardType = SD_CARD_TYPE_UKN; + } +#endif + return cardType; +} diff --git a/libraries/SD/src/Sd2Card.h b/libraries/SD/src/Sd2Card.h index e96992c..a773b56 100644 --- a/libraries/SD/src/Sd2Card.h +++ b/libraries/SD/src/Sd2Card.h @@ -22,19 +22,21 @@ #ifndef Sd2Card_h #define Sd2Card_h -/* otto includes component */ -#include "otto_sd.h" +#include "bsp_sd.h" #define FALSE ((uint8_t)0x00) #define TRUE ((uint8_t)0x01) // card types to match Arduino definition +#define SD_CARD_TYPE_UKN 0 /** Standard capacity V1 SD card */ -#define SD_CARD_TYPE_SD1 STD_CAPACITY_SD_CARD_V1_1 +#define SD_CARD_TYPE_SD1 1 /** Standard capacity V2 SD card */ -#define SD_CARD_TYPE_SD2 STD_CAPACITY_SD_CARD_V2_0 +#define SD_CARD_TYPE_SD2 2 /** High Capacity SD card */ -#define SD_CARD_TYPE_SDHC HIGH_CAPACITY_SD_CARD +#define SD_CARD_TYPE_SDHC 3 +/** High Capacity SD card */ +#define SD_CARD_TYPE_SECURED 4 class Sd2Card { public: @@ -43,7 +45,7 @@ class Sd2Card { uint8_t init(uint8_t cspin); /** Return the card type: SD V1, SD V2 or SDHC */ - uint8_t type(void) const {return _SdCardInfo.CardType;} + uint8_t type(void) const; private: SD_CardInfo _SdCardInfo; diff --git a/variants/otto/otto_sd.c b/libraries/SD/src/bsp_sd.c similarity index 82% rename from variants/otto/otto_sd.c rename to libraries/SD/src/bsp_sd.c index 95a783b..f43adb3 100644 --- a/variants/otto/otto_sd.c +++ b/libraries/SD/src/bsp_sd.c @@ -1,10 +1,10 @@ /** ****************************************************************************** - * @file otto_sd.c + * @file bsp_sd.c * @author MCD Application Team * @version V1.0.0 * @date 10-June-2016 - * @brief This file includes the uSD card driver mounted on otto + * @brief This file includes the uSD card driver mounted on stm32 * board. ****************************************************************************** * @attention @@ -40,8 +40,7 @@ User NOTES 1. How To use this driver: -------------------------- - - This driver is used to drive the micro SD external card mounted on STM32469I-otto - board. + - This driver is used to drive the micro SD external card mounted on a board. - This driver does not need a specific component driver for the micro SD device to be included with. @@ -57,7 +56,7 @@ o If SD presence detection interrupt mode is desired, you must configure the SD detection interrupt mode by calling the function BSP_SD_ITConfig(). The interrupt is generated as an external interrupt whenever the micro SD card is - plugged/unplugged in/from the otto board. The SD detection interrupt + plugged/unplugged in/from the board. The SD detection interrupt is handled by calling the function BSP_SD_DetectIT() which is called in the IRQ handler file, the user callback is implemented in the function BSP_SD_DetectCallback(). o The function BSP_SD_GetCardInfo() is used to get the micro SD card information @@ -80,62 +79,18 @@ ------------------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ -#include "otto_sd.h" +#include "bsp_sd.h" -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32469I_otto - * @{ - */ - -/** @defgroup STM32469I-otto_SD STM32469I otto SD - * @{ - */ - - -/** @defgroup STM32469I-otto_SD_Private_TypesDefinitions STM32469I otto SD Private TypesDef - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Private_Defines STM32469I otto SD Private Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Private_Macros STM32469I otto SD Private Macro - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Private_Variables STM32469I otto SD Private Variables - * @{ - */ +/* BSP SD Private Variables */ static SD_HandleTypeDef uSdHandle; +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) +#define SD_OK HAL_OK +#define SD_TRANSFER_OK ((uint8_t)0x00) +#define SD_TRANSFER_BUSY ((uint8_t)0x01) +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ static SD_CardInfo uSdCardInfo; +#endif -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Private_FunctionPrototypes STM32469I otto SD Private Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Private_Functions STM32469I otto SD Private Functions - * @{ - */ /** * @brief Initializes the SD card device without CS initialization. @@ -148,20 +103,24 @@ uint8_t BSP_SD_Init(void) /* PLLSAI is dedicated to LCD periph. Do not use it to get 48MHz*/ /* uSD device interface configuration */ - uSdHandle.Instance = SDIO; + uSdHandle.Instance = SD_INSTANCE; - uSdHandle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; - uSdHandle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - uSdHandle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - uSdHandle.Init.BusWide = SDIO_BUS_WIDE_1B; - uSdHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_ENABLE; - uSdHandle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; + uSdHandle.Init.ClockEdge = SD_CLK_EDGE; + uSdHandle.Init.ClockBypass = SD_CLK_BYPASS; + uSdHandle.Init.ClockPowerSave = SD_CLK_PWR_SAVE; + uSdHandle.Init.BusWide = SD_BUS_WIDE_1B; + uSdHandle.Init.HardwareFlowControl = SD_HW_FLOW_CTRL; + uSdHandle.Init.ClockDiv = SD_CLK_DIV; /* Msp SD initialization */ BSP_SD_MspInit(&uSdHandle, NULL); /* HAL SD initialization */ +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + if(HAL_SD_Init(&uSdHandle) != SD_OK) +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK) +#endif { sd_state = MSD_ERROR; } @@ -170,7 +129,7 @@ uint8_t BSP_SD_Init(void) if(sd_state == MSD_OK) { /* Enable wide operation */ - if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDIO_BUS_WIDE_4B) != SD_OK) + if(HAL_SD_WideBusOperation_Config(&uSdHandle, SD_BUS_WIDE_4B) != SD_OK) { sd_state = MSD_ERROR; } @@ -193,14 +152,14 @@ uint8_t BSP_SD_CSInit(void) /* PLLSAI is dedicated to LCD periph. Do not use it to get 48MHz*/ /* uSD device interface configuration */ - uSdHandle.Instance = SDIO; + uSdHandle.Instance = SD_INSTANCE; - uSdHandle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; - uSdHandle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - uSdHandle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - uSdHandle.Init.BusWide = SDIO_BUS_WIDE_1B; - uSdHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_ENABLE; - uSdHandle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; + uSdHandle.Init.ClockEdge = SD_CLK_EDGE; + uSdHandle.Init.ClockBypass = SD_CLK_BYPASS; + uSdHandle.Init.ClockPowerSave = SD_CLK_PWR_SAVE; + uSdHandle.Init.BusWide = SD_BUS_WIDE_1B; + uSdHandle.Init.HardwareFlowControl = SD_HW_FLOW_CTRL; + uSdHandle.Init.ClockDiv = SD_CLK_DIV; /* Msp SD Detect pin initialization */ BSP_SD_Detect_MspInit(&uSdHandle, NULL); @@ -213,7 +172,11 @@ uint8_t BSP_SD_CSInit(void) BSP_SD_MspInit(&uSdHandle, NULL); /* HAL SD initialization */ +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) + if(HAL_SD_Init(&uSdHandle) != SD_OK) +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK) +#endif { sd_state = MSD_ERROR; } @@ -222,7 +185,7 @@ uint8_t BSP_SD_CSInit(void) if(sd_state == MSD_OK) { /* Enable wide operation */ - if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDIO_BUS_WIDE_4B) != SD_OK) + if(HAL_SD_WideBusOperation_Config(&uSdHandle, SD_BUS_WIDE_4B) != SD_OK) { sd_state = MSD_ERROR; } @@ -242,7 +205,7 @@ uint8_t BSP_SD_DeInit(void) { uint8_t sd_state = MSD_OK; - uSdHandle.Instance = SDIO; + uSdHandle.Instance = SD_INSTANCE; /* HAL SD deinitialization */ if(HAL_SD_DeInit(&uSdHandle) != HAL_OK) @@ -251,7 +214,7 @@ uint8_t BSP_SD_DeInit(void) } /* Msp SD deinitialization */ - uSdHandle.Instance = SDIO; + uSdHandle.Instance = SD_INSTANCE; BSP_SD_MspDeInit(&uSdHandle, NULL); return sd_state; @@ -364,7 +327,7 @@ __weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params) GPIO_InitTypeDef gpio_init_structure; /* Enable SDIO clock */ - __HAL_RCC_SDIO_CLK_ENABLE(); + SD_CLK_ENABLE(); /* Enable GPIOs clock */ __HAL_RCC_GPIOC_CLK_ENABLE(); @@ -374,7 +337,7 @@ __weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params) gpio_init_structure.Mode = GPIO_MODE_AF_PP; gpio_init_structure.Pull = GPIO_PULLUP; gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF12_SDIO; + gpio_init_structure.Alternate = SD_AF; /* GPIOC configuration */ gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; @@ -426,7 +389,19 @@ __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params) by surcgarging this __weak function */ } - +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) +/** + * @brief Gets the current SD card data status. + * @retval Data transfer state. + * This value can be one of the following values: + * @arg SD_TRANSFER_OK: No data transfer is acting + * @arg SD_TRANSFER_BUSY: Data transfer is acting + */ +uint8_t BSP_SD_GetCardState(void) +{ + return((HAL_SD_GetCardState(&uSdHandle) == HAL_SD_CARD_TRANSFER ) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY); +} +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ /** * @brief Gets the current SD card data status. * @retval Data transfer state. @@ -439,12 +414,13 @@ HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void) { return(HAL_SD_GetStatus(&uSdHandle)); } +#endif /** * @brief Get SD information about specific SD card. * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure */ -void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef *CardInfo) +void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypeDef *CardInfo) { /* Get SD card Information */ HAL_SD_Get_CardInfo(&uSdHandle, CardInfo); diff --git a/variants/otto/otto_sd.h b/libraries/SD/src/bsp_sd.h similarity index 66% rename from variants/otto/otto_sd.h rename to libraries/SD/src/bsp_sd.h index 7992df5..d20e607 100644 --- a/variants/otto/otto_sd.h +++ b/libraries/SD/src/bsp_sd.h @@ -1,12 +1,11 @@ /** ****************************************************************************** - * @file otto_sd.h - * @author MCD Application Team - * @version V1.0.2 - * @date 13-January-2016 + * @file sd_conf.h + * @author fpiSTM + * @date 2017 * @brief This file contains the common defines and functions prototypes for - * the otto_sd.c driver. - ****************************************************************************** + * the bdp_sd.c driver. + ****************************************************************************** * @attention * *

© COPYRIGHT(c) 2016 STMicroelectronics

@@ -37,77 +36,36 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __OTTO_SD_H -#define __OTTO_SD_H +#ifndef __BSP_SD_H +#define __BSP_SD_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32469I_otto - * @{ - */ - -/** @addtogroup STM32469I-otto_SD - * @{ - */ - -/** @defgroup STM32469I-otto_SD_Exported_Types STM32469I otto SD Exported Types - * @{ - */ +#include "sd_conf.h" + +/*SD Card information structure */ +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) +#define HAL_SD_CardInfoTypedef HAL_SD_CardInfoTypeDef +#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef +#define HAL_SD_WideBusOperation_Config HAL_SD_ConfigWideBusOperation +#define HAL_SD_Get_CardInfo HAL_SD_GetCardInfo +#endif -/** - * @brief SD Card information structure - */ #define SD_CardInfo HAL_SD_CardInfoTypedef -/** - * @} - */ -/** - * @brief SD status structure definition - */ -#define MSD_OK ((uint8_t)0x00) -#define MSD_ERROR ((uint8_t)0x01) -#define MSD_ERROR_SD_NOT_PRESENT ((uint8_t)0x02) +/*SD status structure definition */ +#define MSD_OK ((uint8_t)0x00) +#define MSD_ERROR ((uint8_t)0x01) +#define MSD_ERROR_SD_NOT_PRESENT ((uint8_t)0x02) -/** @defgroup STM32469I-otto_SD_Exported_Constants STM32469I otto SD Exported Constants - * @{ - */ +/* SD Exported Constants */ #define SD_PRESENT ((uint8_t)0x01) #define SD_NOT_PRESENT ((uint8_t)0x00) -#define SD_DATATIMEOUT ((uint32_t)100000000) - -/** - * @brief SD-detect signal - */ -#define SD_DETECT_PIN GPIO_PIN_10 -#define SD_DETECT_GPIO_PORT GPIOG -#define SD_DETECT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE() -#define SD_DETECT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE() -#define SD_DETECT_EXTI_IRQn EXTI2_IRQn - -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Exported_Macro STM32469I otto SD Exported Macro - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32469I-otto_SD_Exported_Functions STM32469I otto SD Exported Functions - * @{ - */ +/* SD Exported Functions */ uint8_t BSP_SD_Init(void); uint8_t BSP_SD_CSInit(void); uint8_t BSP_SD_DeInit(void); @@ -116,7 +74,11 @@ uint8_t BSP_SD_ITConfig(void); uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks); uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks); uint8_t BSP_SD_Erase(uint64_t StartAddr, uint64_t EndAddr); +#if defined (STM32F4xx) || defined(STM32F7xx) || defined(STM32L4xx) +uint8_t BSP_SD_GetCardState(void); +#else /* (STM32F1xx) || defined(STM32F2xx) || defined(STM32L1xx) */ HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void); +#endif void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef *CardInfo); uint8_t BSP_SD_IsDetected(void); @@ -126,26 +88,10 @@ void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params); void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params); void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - #ifdef __cplusplus } #endif -#endif /* __STM32469I_OTTO_SD_H */ +#endif /* __BSP_SD_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp new file mode 100644 index 0000000..22920e8 --- /dev/null +++ b/libraries/SPI/SPI.cpp @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * Copyright (c) 2014 by Paul Stoffregen (Transaction API) + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#include "SPI.h" + +/* The following contructors are available: +- SPIClass SPI +- SPIClass SPI(mosi,miso,sclk) +- SPIClass SPI(mosi,miso,sclk,ss) +*/ + +SPIClass::SPIClass() : g_active_id(-1) +{ + _spi.pin_miso = digitalPinToPinName(MISO); + _spi.pin_mosi = digitalPinToPinName(MOSI); + _spi.pin_sclk = digitalPinToPinName(SCLK); + _spi.pin_ssel = NC; +} + +/* By default hardware SS pin is not used. To use hardware SS pin you should set +ssel pin. Enable this pin disable software CS. See microcontroller documentation +for the list of available SS pins. */ +SPIClass::SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel) : g_active_id(-1) +{ + _spi.pin_miso = digitalPinToPinName(miso); + _spi.pin_mosi = digitalPinToPinName(mosi); + _spi.pin_sclk = digitalPinToPinName(sclk); + + if(ssel != 0xFF) { + _spi.pin_ssel = digitalPinToPinName(ssel); + } else { + _spi.pin_ssel = NC; + } +} + +//begin using the default chip select +void SPIClass::begin() +{ + begin(BOARD_SPI_OWN_SS); +} + +//Begin with a chip select defined +void SPIClass::begin(uint8_t _pin) +{ + if(_pin > SPI_CHANNELS_NUM) + return; + + if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC)) { + pinMode(_pin, OUTPUT); + digitalWrite(_pin, HIGH); + } + + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; +} + +void SPIClass::usingInterrupt(uint8_t interruptNumber) +{ + UNUSED(interruptNumber); + //Not implemented +} + +void SPIClass::beginTransaction(uint8_t _pin, SPISettings settings) +{ + if(_pin > SPI_CHANNELS_NUM) + return; + + spiSettings[_pin].clk = settings.clk; + spiSettings[_pin].dMode = settings.dMode; + spiSettings[_pin].bOrder = settings.bOrder; + if(spiSettings[_pin].bOrder == MSBFIRST) { + spiSettings[_pin].msb = MSBFIRST; + } else { + spiSettings[_pin].msb = LSBFIRST; + } + + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; +} + +void SPIClass::endTransaction(void) +{ + g_active_id = -1; +} + +void SPIClass::end(uint8_t _pin) +{ + UNUSED(_pin); + end(); +} + +void SPIClass::end() +{ + spi_deinit(&_spi); + g_active_id = -1; +} + +void SPIClass::setBitOrder(uint8_t _pin, BitOrder _bitOrder) +{ + if(_pin > SPI_CHANNELS_NUM) + return; + + if(MSBFIRST == _bitOrder) { + spiSettings[_pin].msb = MSBFIRST; + spiSettings[_pin].bOrder = MSBFIRST; + } else { + spiSettings[_pin].msb = LSBFIRST; + spiSettings[_pin].bOrder = LSBFIRST; + } + + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; +} + +void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode) +{ + if(_pin > SPI_CHANNELS_NUM) + return; + + if(SPI_MODE0 == _mode) { + spiSettings[_pin].dMode = SPI_MODE_0; + } else if(SPI_MODE1 == _mode) { + spiSettings[_pin].dMode = SPI_MODE_1; + } else if(SPI_MODE2 == _mode) { + spiSettings[_pin].dMode = SPI_MODE_2; + } else if(SPI_MODE3 == _mode) { + spiSettings[_pin].dMode = SPI_MODE_3; + } + + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; +} + +/* + * This function should not be used in new projects. + * Use SPISettings with SPI.beginTransaction() to configure SPI parameters. + */ +void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider) +{ + if(_pin > SPI_CHANNELS_NUM) + return; + + /* Get clk freq of the SPI instance */ + uint32_t spiClkFreq = spi_getClkFreq(&_spi); + + switch(_divider) { + case (SPI_CLOCK_DIV2) : + case (SPI_CLOCK_DIV4) : + case (SPI_CLOCK_DIV8) : + case (SPI_CLOCK_DIV16) : + case (SPI_CLOCK_DIV32) : + case (SPI_CLOCK_DIV64) : + case (SPI_CLOCK_DIV128) : + spiSettings[_pin].clk = spiClkFreq/_divider; + break; + default: + spiSettings[_pin].clk = SPI_SPEED_CLOCK_DEFAULT; + break; + } + + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; +} + + +//Transfer a message on the selected SPI. The _pin is the CS of the SPI that +//identifies the SPI instance. +//If the _mode is set to SPI_CONTINUE, keep the spi instance alive. +byte SPIClass::transfer(uint8_t _pin, uint8_t data, SPITransferMode _mode) +{ + uint8_t rx_buffer = 0; + + if (_pin > SPI_CHANNELS_NUM) + return rx_buffer; + + if(_pin != g_active_id) { + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; + } + + if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, LOW); + + spi_transfer(&_spi, &data, &rx_buffer, sizeof(uint8_t), 10000); + + if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, HIGH); + + return rx_buffer; +} + +uint16_t SPIClass::transfer16(uint8_t _pin, uint16_t data, SPITransferMode _mode) +{ + uint16_t rx_buffer = 0; + + if (_pin > SPI_CHANNELS_NUM) + return rx_buffer; + + if(_pin != g_active_id) { + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; + } + + if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, LOW); + + spi_transfer(&_spi, (uint8_t *)&data, (uint8_t *)&rx_buffer, sizeof(uint16_t), 10000000); + + if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, HIGH); + + return rx_buffer; +} + +void SPIClass::transfer(uint8_t _pin, void *_buf, size_t _count, SPITransferMode _mode) +{ + if ((_count == 0) || (_pin > SPI_CHANNELS_NUM)) + return; + + if(_pin != g_active_id) { + spi_init(&_spi, spiSettings[_pin].clk, spiSettings[_pin].dMode, spiSettings[_pin].msb); + g_active_id = _pin; + } + + if((_pin != BOARD_SPI_OWN_SS) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, LOW); + + spi_transfer(&_spi, ((uint8_t*)_buf), ((uint8_t*)_buf), _count, 10000); + + if((_pin != BOARD_SPI_OWN_SS) && (_mode == SPI_LAST) && (_spi.pin_ssel == NC)) + digitalWrite(_pin, HIGH); +} + +void SPIClass::attachInterrupt(void) { + // Should be enableInterrupt() +} + +void SPIClass::detachInterrupt(void) { + // Should be disableInterrupt() +} + +SPIClass SPI = SPIClass(MOSI, MISO, SCK, SS); +SPIClass SPI7 = SPIClass(MOSI1, MISO1, SCK1, SS1); diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h new file mode 100644 index 0000000..721d904 --- /dev/null +++ b/libraries/SPI/SPI.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * Copyright (c) 2014 by Paul Stoffregen (Transaction API) + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#ifndef _SPI_H_INCLUDED +#define _SPI_H_INCLUDED + +#include "variant.h" +#include + +// SPI_HAS_TRANSACTION means SPI has +// - beginTransaction() +// - endTransaction() +// - usingInterrupt() +// - SPISetting(clock, bitOrder, dataMode) +#define SPI_HAS_TRANSACTION 1 + +// SPI_HAS_EXTENDED_CS_PIN_HANDLING means SPI has automatic +// CS pin handling and provides the following methods: +// - begin(pin) +// - end(pin) +// - setBitOrder(pin, bitorder) +// - setDataMode(pin, datamode) +// - setClockDivider(pin, clockdiv) +// - transfer(pin, data, SPI_LAST/SPI_CONTINUE) +// - beginTransaction(pin, SPISettings settings) (if transactions are available) +#define SPI_HAS_EXTENDED_CS_PIN_HANDLING 1 + +// For compatibility with sketches designed for AVR @ 16 MHz +// need to go from 64MHz to 16 (/4) +// This function should not be used in new projects. +// Use SPISettings with SPI.beginTransaction() to configure SPI parameters. +#define SPI_CLOCK_DIV2 2 +#define SPI_CLOCK_DIV4 4 +#define SPI_CLOCK_DIV8 8 +#define SPI_CLOCK_DIV16 16 +#define SPI_CLOCK_DIV32 32 +#define SPI_CLOCK_DIV64 64 +#define SPI_CLOCK_DIV128 128 + +#define SPI_MODE0 0x00 +#define SPI_MODE1 0x01 +#define SPI_MODE2 0x02 +#define SPI_MODE3 0x03 + +enum SPITransferMode { + SPI_CONTINUE, + SPI_LAST +}; + +class SPISettings { + public: + SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) { + clk = clock; + + if(bitOrder == MSBFIRST) { + msb = 1; + } else { + msb = 0; + } + bOrder = bitOrder; + + if(SPI_MODE0 == dataMode) { + dMode = SPI_MODE_0; + } else if(SPI_MODE1 == dataMode) { + dMode = SPI_MODE_1; + } else if(SPI_MODE2 == dataMode) { + dMode = SPI_MODE_2; + } else if(SPI_MODE3 == dataMode) { + dMode = SPI_MODE_3; + } + + } + SPISettings() { + clk = SPI_SPEED_CLOCK_DEFAULT; + bOrder = MSBFIRST; + msb = 1; + dMode = SPI_MODE_0; + } + private: + uint32_t clk; //specifies the spi bus maximum clock speed + BitOrder bOrder; //bit order (MSB/LSB first) + spi_mode_e dMode; //one of the data mode + //Mode Clock Polarity (CPOL) Clock Phase (CPHA) + //SPI_MODE0 0 0 + //SPI_MODE1 0 1 + //SPI_MODE2 1 0 + //SPI_MODE3 1 1 + uint8_t msb; //set to 1 if msb first + friend class SPIClass; +}; + + + +class SPIClass { + public: + SPIClass(); + SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel = 0xFF); + + // Transfer functions + byte transfer(byte _pin, uint8_t _data, SPITransferMode _mode = SPI_LAST); + uint16_t transfer16(byte _pin, uint16_t _data, SPITransferMode _mode = SPI_LAST); + void transfer(byte _pin, void *_buf, size_t _count, SPITransferMode _mode = SPI_LAST); + + + // Transfer functions on default pin BOARD_SPI_DEFAULT_SS + byte transfer(uint8_t _data, SPITransferMode _mode = SPI_LAST) + { + return transfer(BOARD_SPI_OWN_SS, _data, _mode); + } + + uint16_t transfer16(uint16_t _data, SPITransferMode _mode = SPI_LAST) + { + return transfer16(BOARD_SPI_OWN_SS, _data, _mode); + } + + void transfer(void *_buf, size_t _count, SPITransferMode _mode = SPI_LAST) + { + transfer(BOARD_SPI_OWN_SS, _buf, _count, _mode); + } + + // Transaction Functions + void usingInterrupt(uint8_t interruptNumber); + + void beginTransaction(SPISettings settings) + { + beginTransaction(BOARD_SPI_OWN_SS, settings); + } + + void beginTransaction(uint8_t pin, SPISettings settings); + void endTransaction(void); + + // SPI Configuration methods + void attachInterrupt(void); + void detachInterrupt(void); + + void begin(void); + void end(void); + + // Attach/Detach pin to/from SPI controller + void begin(uint8_t _pin); + void end(uint8_t _pin); + + // These methods sets a parameter on a single pin + void setBitOrder(uint8_t _pin, BitOrder); + void setDataMode(uint8_t _pin, uint8_t); + void setClockDivider(uint8_t _pin, uint8_t); + + // These methods sets the same parameters but on default pin BOARD_SPI_OWN_SS + void setBitOrder(BitOrder _order) { setBitOrder(BOARD_SPI_OWN_SS, _order); }; + void setDataMode(uint8_t _mode) { setDataMode(BOARD_SPI_OWN_SS, _mode); }; + void setClockDivider(uint8_t _div) { setClockDivider(BOARD_SPI_OWN_SS, _div); }; + + private: + //uint32_t id; + SPISettings spiSettings[SPI_CHANNELS_NUM+1]; + int8_t g_active_id; + uint8_t _pin; + spi_t _spi; +}; + +extern SPIClass SPI; +extern SPIClass SPI7; + +#endif diff --git a/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino b/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino new file mode 100644 index 0000000..df73ade --- /dev/null +++ b/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.ino @@ -0,0 +1,143 @@ +/* + SCP1000 Barometric Pressure Sensor Display + + Shows the output of a Barometric Pressure Sensor on a + Uses the SPI library. For details on the sensor, see: + http://www.sparkfun.com/commerce/product_info.php?products_id=8161 + http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ + + This sketch adapted from Nathan Seidle's SCP1000 example for PIC: + http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip + + Circuit: + SCP1000 sensor attached to pins 6, 7, 10 - 13: + DRDY: pin 6 + CSB: pin 7 + MOSI: pin 11 + MISO: pin 12 + SCK: pin 13 + + created 31 July 2010 + modified 14 August 2010 + by Tom Igoe + */ + +// the sensor communicates using SPI, so include the library: +#include + +//Sensor's memory register addresses: +const int PRESSURE = 0x1F; //3 most significant bits of pressure +const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure +const int TEMPERATURE = 0x21; //16 bit temperature reading +const byte READ = 0b11111100; // SCP1000's read command +const byte WRITE = 0b00000010; // SCP1000's write command + +// pins used for the connection with the sensor +// the other you need are controlled by the SPI library): +const int dataReadyPin = 6; +const int chipSelectPin = 7; + +void setup() { + Serial.begin(9600); + + // start the SPI library: + SPI.begin(); + + // initalize the data ready and chip select pins: + pinMode(dataReadyPin, INPUT); + pinMode(chipSelectPin, OUTPUT); + + //Configure SCP1000 for low noise configuration: + writeRegister(0x02, 0x2D); + writeRegister(0x01, 0x03); + writeRegister(0x03, 0x02); + // give the sensor time to set up: + delay(100); +} + +void loop() { + //Select High Resolution Mode + writeRegister(0x03, 0x0A); + + // don't do anything until the data ready pin is high: + if (digitalRead(dataReadyPin) == HIGH) { + //Read the temperature data + int tempData = readRegister(0x21, 2); + + // convert the temperature to celsius and display it: + float realTemp = (float)tempData / 20.0; + Serial.print("Temp[C]="); + Serial.print(realTemp); + + + //Read the pressure data highest 3 bits: + byte pressure_data_high = readRegister(0x1F, 1); + pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 + + //Read the pressure data lower 16 bits: + unsigned int pressure_data_low = readRegister(0x20, 2); + //combine the two parts into one 19-bit number: + long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4; + + // display the temperature: + Serial.println("\tPressure [Pa]=" + String(pressure)); + } +} + +//Read from or write to register from the SCP1000: +unsigned int readRegister(byte thisRegister, int bytesToRead) { + byte inByte = 0; // incoming byte from the SPI + unsigned int result = 0; // result to return + Serial.print(thisRegister, BIN); + Serial.print("\t"); + // SCP1000 expects the register name in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the address and the command into one byte + byte dataToSend = thisRegister & READ; + Serial.println(thisRegister, BIN); + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + // send the device the register you want to read: + SPI.transfer(dataToSend); + // send a value of 0 to read the first byte returned: + result = SPI.transfer(0x00); + // decrement the number of bytes left to read: + bytesToRead--; + // if you still have another byte to read: + if (bytesToRead > 0) { + // shift the first byte left, then get the second byte: + result = result << 8; + inByte = SPI.transfer(0x00); + // combine the byte you just got with the previous one: + result = result | inByte; + // decrement the number of bytes left to read: + bytesToRead--; + } + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); + // return the result: + return (result); +} + + +//Sends a write command to SCP1000 + +void writeRegister(byte thisRegister, byte thisValue) { + + // SCP1000 expects the register address in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the register address and the command into one byte: + byte dataToSend = thisRegister | WRITE; + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + + SPI.transfer(dataToSend); //Send register location + SPI.transfer(thisValue); //Send value to record into register + + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); +} + diff --git a/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino b/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino new file mode 100644 index 0000000..c7afcc0 --- /dev/null +++ b/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.ino @@ -0,0 +1,71 @@ +/* + Digital Pot Control + + This example controls an Analog Devices AD5206 digital potentiometer. + The AD5206 has 6 potentiometer channels. Each channel's pins are labeled + A - connect this to voltage + W - this is the pot's wiper, which changes when you set it + B - connect this to ground. + + The AD5206 is SPI-compatible,and to command it, you send two bytes, + one with the channel number (0 - 5) and one with the resistance value for the + channel (0 - 255). + + The circuit: + * All A pins of AD5206 connected to +5V + * All B pins of AD5206 connected to ground + * An LED and a 220-ohm resisor in series connected from each W pin to ground + * CS - to digital pin 10 (SS pin) + * SDI - to digital pin 11 (MOSI pin) + * CLK - to digital pin 13 (SCK pin) + + created 10 Aug 2010 + by Tom Igoe + + Thanks to Heather Dewey-Hagborg for the original tutorial, 2005 + +*/ + + +// inslude the SPI library: +#include + + +// set pin 10 as the slave select for the digital pot: +const int slaveSelectPin = 10; + +void setup() { + // set the slaveSelectPin as an output: + pinMode(slaveSelectPin, OUTPUT); + // initialize SPI: + SPI.begin(); +} + +void loop() { + // go through the six channels of the digital pot: + for (int channel = 0; channel < 6; channel++) { + // change the resistance on this channel from min to max: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, level); + delay(10); + } + // wait a second at the top: + delay(100); + // change the resistance on this channel from max to min: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, 255 - level); + delay(10); + } + } + +} + +void digitalPotWrite(int address, int value) { + // take the SS pin low to select the chip: + digitalWrite(slaveSelectPin, LOW); + // send in the address and value via SPI: + SPI.transfer(address); + SPI.transfer(value); + // take the SS pin high to de-select the chip: + digitalWrite(slaveSelectPin, HIGH); +} diff --git a/libraries/SPI/keywords.txt b/libraries/SPI/keywords.txt new file mode 100644 index 0000000..47738f9 --- /dev/null +++ b/libraries/SPI/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map SPI +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +SPI KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +end KEYWORD2 +transfer KEYWORD2 +#setBitOrder KEYWORD2 +setDataMode KEYWORD2 +setClockDivider KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### +SPI_MODE0 LITERAL1 +SPI_MODE1 LITERAL1 +SPI_MODE2 LITERAL1 +SPI_MODE3 LITERAL1 + +SPI_CONTINUE LITERAL1 +SPI_LAST LITERAL1 diff --git a/libraries/SPI/library.properties b/libraries/SPI/library.properties new file mode 100644 index 0000000..b9d679f --- /dev/null +++ b/libraries/SPI/library.properties @@ -0,0 +1,9 @@ +name=SPI +version=1.0 +author=Arduino +maintainer=Arduino +sentence=Enables the communication with devices that use the Serial Peripheral Interface (SPI) Bus. For Arduino DUE only. +paragraph= +category=Communication +url=http://www.arduino.cc/en/Reference/SPI +architectures=stm32f4 diff --git a/libraries/TFT/README.adoc b/libraries/TFT/README.adoc new file mode 100644 index 0000000..0550e2d --- /dev/null +++ b/libraries/TFT/README.adoc @@ -0,0 +1,26 @@ += TFT Library for Arduino = + +This library enables an Arduino board to communicate with the Arduino TFT LCD screen. It simplifies the process for drawing shapes, lines, images, and text to the screen. + +For more information about this library please visit us at +http://www.arduino.cc/en/Reference/TFTLibrary + +== License == + +Copyright (c) Arduino LLC. All right reserved. +Copyright (c) Enrico Gueli. All right reserved. +Copyright (c) 2012, Adafruit Industries. All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/libraries/TFT/examples/Arduino/TFTBitmapLogo/TFTBitmapLogo.ino b/libraries/TFT/examples/Arduino/TFTBitmapLogo/TFTBitmapLogo.ino new file mode 100644 index 0000000..d1b8a73 --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTBitmapLogo/TFTBitmapLogo.ino @@ -0,0 +1,108 @@ +/* + + Arduino TFT Bitmap Logo example + + This example reads an image file from a micro-SD card + and draws it on the screen, at random locations. + + In this sketch, the Arduino logo is read from a micro-SD card. + There is a .bmp file included with this sketch. + - open the sketch folder (Ctrl-K or Cmd-K) + - copy the "arduino.bmp" file to a micro-SD + - put the SD into the SD slot of the Arduino TFT module. + + This example code is in the public domain. + + Created 19 April 2013 by Enrico Gueli + + http://www.arduino.cc/en/Tutorial/TFTBitmapLogo + + */ + +// include the necessary libraries +#include +#include +#include // Arduino LCD library + +// pin definition for the Uno +#define sd_cs 4 +#define lcd_cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +//#define sd_cs 8 +//#define lcd_cs 7 +//#define dc 0 +//#define rst 1 + +TFT TFTscreen = TFT(lcd_cs, dc, rst); + +// this variable represents the image to be drawn on screen +PImage logo; + + +void setup() { + // initialize the GLCD and show a message + // asking the user to open the serial line + TFTscreen.begin(); + TFTscreen.background(255, 255, 255); + + TFTscreen.stroke(0, 0, 255); + TFTscreen.println(); + TFTscreen.println(F("Arduino TFT Bitmap Example")); + TFTscreen.stroke(0, 0, 0); + TFTscreen.println(F("Open serial monitor")); + TFTscreen.println(F("to run the sketch")); + + // initialize the serial port: it will be used to + // print some diagnostic info + Serial.begin(9600); + while (!Serial) { + // wait for serial port to connect. Needed for native USB port only + } + + // clear the GLCD screen before starting + TFTscreen.background(255, 255, 255); + + // try to access the SD card. If that fails (e.g. + // no card present), the setup process will stop. + Serial.print(F("Initializing SD card...")); + if (!SD.begin(sd_cs)) { + Serial.println(F("failed!")); + return; + } + Serial.println(F("OK!")); + + // initialize and clear the GLCD screen + TFTscreen.begin(); + TFTscreen.background(255, 255, 255); + + // now that the SD card can be access, try to load the + // image file. + logo = TFTscreen.loadImage("arduino.bmp"); + if (!logo.isValid()) { + Serial.println(F("error while loading arduino.bmp")); + } +} + +void loop() { + // don't do anything if the image wasn't loaded correctly. + if (logo.isValid() == false) { + return; + } + + Serial.println(F("drawing image")); + + // get a random location where to draw the image. + // To avoid the image to be draw outside the screen, + // take into account the image size. + int x = random(TFTscreen.width() - logo.width()); + int y = random(TFTscreen.height() - logo.height()); + + // draw the image to the screen + TFTscreen.image(logo, x, y); + + // wait a little bit before drawing again + delay(1500); +} diff --git a/libraries/TFT/examples/Arduino/TFTBitmapLogo/arduino.bmp b/libraries/TFT/examples/Arduino/TFTBitmapLogo/arduino.bmp new file mode 100644 index 0000000..09c670a Binary files /dev/null and b/libraries/TFT/examples/Arduino/TFTBitmapLogo/arduino.bmp differ diff --git a/libraries/TFT/examples/Arduino/TFTColorPicker/TFTColorPicker.ino b/libraries/TFT/examples/Arduino/TFTColorPicker/TFTColorPicker.ino new file mode 100644 index 0000000..ba71d1e --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTColorPicker/TFTColorPicker.ino @@ -0,0 +1,67 @@ +/* + + TFT Color Picker + + This example for the Arduino screen reads the input of + potentiometers or analog sensors attached to A0, A1, + and A2 and uses the values to change the screen's color. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTColorPicker + + */ + +// pin definition for the Uno +#define cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +// #define cs 7 +// #define dc 0 +// #define rst 1 + +#include // Arduino LCD library +#include + +TFT TFTscreen = TFT(cs, dc, rst); + +void setup() { + // begin serial communication + Serial.begin(9600); + + // initialize the display + TFTscreen.begin(); + + // set the background to white + TFTscreen.background(255, 255, 255); + +} + +void loop() { + + // read the values from your sensors and scale them to 0-255 + int redVal = map(analogRead(A0), 0, 1023, 0, 255); + int greenVal = map(analogRead(A1), 0, 1023, 0, 255); + int blueVal = map(analogRead(A2), 0, 1023, 0, 255); + + // draw the background based on the mapped values + TFTscreen.background(redVal, greenVal, blueVal); + + // send the values to the serial monitor + Serial.print("background("); + Serial.print(redVal); + Serial.print(" , "); + Serial.print(greenVal); + Serial.print(" , "); + Serial.print(blueVal); + Serial.println(")"); + + // wait for a moment + delay(33); + +} + diff --git a/libraries/TFT/examples/Arduino/TFTDisplayText/TFTDisplayText.ino b/libraries/TFT/examples/Arduino/TFTDisplayText/TFTDisplayText.ino new file mode 100644 index 0000000..391bb03 --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTDisplayText/TFTDisplayText.ino @@ -0,0 +1,74 @@ +/* + Arduino TFT text example + + This example demonstrates how to draw text on the + TFT with an Arduino. The Arduino reads the value + of an analog sensor attached to pin A0, and writes + the value to the LCD screen, updating every + quarter second. + + This example code is in the public domain + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTDisplayText + + */ + +#include // Arduino LCD library +#include + +// pin definition for the Uno +#define cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +// #define cs 7 +// #define dc 0 +// #define rst 1 + +// create an instance of the library +TFT TFTscreen = TFT(cs, dc, rst); + +// char array to print to the screen +char sensorPrintout[5]; + +void setup() { + + // Put this line at the beginning of every sketch that uses the GLCD: + TFTscreen.begin(); + + // clear the screen with a black background + TFTscreen.background(0, 0, 0); + + // write the static text to the screen + // set the font color to white + TFTscreen.stroke(255, 255, 255); + // set the font size + TFTscreen.setTextSize(2); + // write the text to the top left corner of the screen + TFTscreen.text("Sensor Value :\n ", 0, 0); + // ste the font size very large for the loop + TFTscreen.setTextSize(5); +} + +void loop() { + + // Read the value of the sensor on A0 + String sensorVal = String(analogRead(A0)); + + // convert the reading to a char array + sensorVal.toCharArray(sensorPrintout, 5); + + // set the font color + TFTscreen.stroke(255, 255, 255); + // print the sensor value + TFTscreen.text(sensorPrintout, 0, 20); + // wait for a moment + delay(250); + // erase the text you just wrote + TFTscreen.stroke(0, 0, 0); + TFTscreen.text(sensorPrintout, 0, 20); +} + diff --git a/libraries/TFT/examples/Arduino/TFTEtchASketch/TFTEtchASketch.ino b/libraries/TFT/examples/Arduino/TFTEtchASketch/TFTEtchASketch.ino new file mode 100644 index 0000000..4eb75d1 --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTEtchASketch/TFTEtchASketch.ino @@ -0,0 +1,83 @@ +/* + + TFT EtchASketch + + This example for the Arduino screen draws a white point + on the GLCD based on the values of 2 potentiometers. + To clear the screen, press a button attached to pin 2. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTEtchASketch + + */ + +#include // Arduino LCD library +#include + +// pin definition for the Uno +#define cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +// #define cs 7 +// #define dc 0 +// #define rst 1 + +TFT TFTscreen = TFT(cs, dc, rst); + +// initial position of the cursor +int xPos = TFTscreen.width() / 2; +int yPos = TFTscreen.height() / 2; + +// pin the erase switch is connected to +int erasePin = 2; + +void setup() { + // declare inputs + pinMode(erasePin, INPUT); + // initialize the screen + TFTscreen.begin(); + // make the background black + TFTscreen.background(0, 0, 0); +} + +void loop() { + // read the potentiometers on A0 and A1 + int xValue = analogRead(A0); + int yValue = analogRead(A1); + + // map the values and update the position + xPos = xPos + (map(xValue, 0, 1023, 2, -2)); + yPos = yPos + (map(yValue, 0, 1023, -2, 2)); + + // don't let the point go past the screen edges + if (xPos > 159) { + (xPos = 159); + } + + if (xPos < 0) { + (xPos = 0); + } + if (yPos > 127) { + (yPos = 127); + } + + if (yPos < 0) { + (yPos = 0); + } + + // draw the point + TFTscreen.stroke(255, 255, 255); + TFTscreen.point(xPos, yPos); + + // read the value of the pin, and erase the screen if pressed + if (digitalRead(erasePin) == HIGH) { + TFTscreen.background(0, 0, 0); + } + + delay(33); +} diff --git a/libraries/TFT/examples/Arduino/TFTGraph/TFTGraph.ino b/libraries/TFT/examples/Arduino/TFTGraph/TFTGraph.ino new file mode 100644 index 0000000..3b2f03b --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTGraph/TFTGraph.ino @@ -0,0 +1,70 @@ +/* + + TFT Graph + + This example for an Arduino screen reads + the value of an analog sensor on A0, and + graphs the values on the screen. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTGraph + + */ + +#include // Arduino LCD library +#include + +// pin definition for the Uno +#define cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +// #define cs 7 +// #define dc 0 +// #define rst 1 + +TFT TFTscreen = TFT(cs, dc, rst); + +// position of the line on screen +int xPos = 0; + +void setup() { + // initialize the serial port + Serial.begin(9600); + + // initialize the display + TFTscreen.begin(); + + // clear the screen with a pretty color + TFTscreen.background(250, 16, 200); +} + +void loop() { + // read the sensor and map it to the screen height + int sensor = analogRead(A0); + int drawHeight = map(sensor, 0, 1023, 0, TFTscreen.height()); + + // print out the height to the serial monitor + Serial.println(drawHeight); + + // draw a line in a nice color + TFTscreen.stroke(250, 180, 10); + TFTscreen.line(xPos, TFTscreen.height() - drawHeight, xPos, TFTscreen.height()); + + // if the graph has reached the screen edge + // erase the screen and start again + if (xPos >= 160) { + xPos = 0; + TFTscreen.background(250, 16, 200); + } else { + // increment the horizontal position: + xPos++; + } + + delay(16); +} + diff --git a/libraries/TFT/examples/Arduino/TFTPong/TFTPong.ino b/libraries/TFT/examples/Arduino/TFTPong/TFTPong.ino new file mode 100644 index 0000000..7a61915 --- /dev/null +++ b/libraries/TFT/examples/Arduino/TFTPong/TFTPong.ino @@ -0,0 +1,135 @@ +/* + + TFT Pong + + This example for the Arduino screen reads the values + of 2 potentiometers to move a rectangular platform + on the x and y axes. The platform can intersect + with a ball causing it to bounce. + + This example code is in the public domain. + + Created by Tom Igoe December 2012 + Modified 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTPong + + */ + +#include // Arduino LCD library +#include + +// pin definition for the Uno +#define cs 10 +#define dc 9 +#define rst 8 + +// pin definition for the Leonardo +// #define cs 7 +// #define dc 0 +// #define rst 1 + +TFT TFTscreen = TFT(cs, dc, rst); + +// variables for the position of the ball and paddle +int paddleX = 0; +int paddleY = 0; +int oldPaddleX, oldPaddleY; +int ballDirectionX = 1; +int ballDirectionY = 1; + +int ballSpeed = 10; // lower numbers are faster + +int ballX, ballY, oldBallX, oldBallY; + +void setup() { + // initialize the display + TFTscreen.begin(); + // black background + TFTscreen.background(0, 0, 0); +} + +void loop() { + + // save the width and height of the screen + int myWidth = TFTscreen.width(); + int myHeight = TFTscreen.height(); + + // map the paddle's location to the position of the potentiometers + paddleX = map(analogRead(A0), 512, -512, 0, myWidth) - 20 / 2; + paddleY = map(analogRead(A1), 512, -512, 0, myHeight) - 5 / 2; + + // set the fill color to black and erase the previous + // position of the paddle if different from present + TFTscreen.fill(0, 0, 0); + + if (oldPaddleX != paddleX || oldPaddleY != paddleY) { + TFTscreen.rect(oldPaddleX, oldPaddleY, 20, 5); + } + + // draw the paddle on screen, save the current position + // as the previous. + TFTscreen.fill(255, 255, 255); + + TFTscreen.rect(paddleX, paddleY, 20, 5); + oldPaddleX = paddleX; + oldPaddleY = paddleY; + + // update the ball's position and draw it on screen + if (millis() % ballSpeed < 2) { + moveBall(); + } +} + +// this function determines the ball's position on screen +void moveBall() { + // if the ball goes offscreen, reverse the direction: + if (ballX > TFTscreen.width() || ballX < 0) { + ballDirectionX = -ballDirectionX; + } + + if (ballY > TFTscreen.height() || ballY < 0) { + ballDirectionY = -ballDirectionY; + } + + // check if the ball and the paddle occupy the same space on screen + if (inPaddle(ballX, ballY, paddleX, paddleY, 20, 5)) { + ballDirectionX = -ballDirectionX; + ballDirectionY = -ballDirectionY; + } + + // update the ball's position + ballX += ballDirectionX; + ballY += ballDirectionY; + + // erase the ball's previous position + TFTscreen.fill(0, 0, 0); + + if (oldBallX != ballX || oldBallY != ballY) { + TFTscreen.rect(oldBallX, oldBallY, 5, 5); + } + + + // draw the ball's current position + TFTscreen.fill(255, 255, 255); + TFTscreen.rect(ballX, ballY, 5, 5); + + oldBallX = ballX; + oldBallY = ballY; + +} + +// this function checks the position of the ball +// to see if it intersects with the paddle +boolean inPaddle(int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) { + boolean result = false; + + if ((x >= rectX && x <= (rectX + rectWidth)) && + (y >= rectY && y <= (rectY + rectHeight))) { + result = true; + } + + return result; +} + + diff --git a/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/EsploraTFTBitmapLogo.ino b/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/EsploraTFTBitmapLogo.ino new file mode 100644 index 0000000..8d38519 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/EsploraTFTBitmapLogo.ino @@ -0,0 +1,101 @@ +/* + + Esplora TFT Bitmap Logos + + This example for the Arduino TFT screen is for use + with an Arduino Esplora. + + This example reads an image file from a micro-SD card + and draws it on the screen, at random locations. + + There is a .bmp file included with this sketch. + - open the sketch folder (Ctrl-K or Cmd-K) + - copy the "arduino.bmp" file to a micro-SD + - put the SD into the SD slot of the Arduino LCD module. + + This example code is in the public domain. + + Created 19 April 2013 by Enrico Gueli + + http://www.arduino.cc/en/Tutorial/EsploraTFTBitmapLogo + + */ + +// include the necessary libraries +#include +#include +#include +#include // Arduino LCD library + +// the Esplora pin connected to the chip select line for SD card +#define SD_CS 8 + +// this variable represents the image to be drawn on screen +PImage logo; + +void setup() { + // initialize the GLCD and show a message + // asking the user to open the serial line + EsploraTFT.begin(); + EsploraTFT.background(255, 255, 255); + + EsploraTFT.stroke(0, 0, 255); + EsploraTFT.println(); + EsploraTFT.println(F("Arduino LCD Bitmap Example")); + EsploraTFT.stroke(0, 0, 0); + EsploraTFT.println(F("Open serial monitor")); + EsploraTFT.println(F("to run the sketch")); + + // initialize the serial port: it will be used to + // print some diagnostic info + Serial.begin(9600); + while (!Serial) { + // wait for serial port to connect. Needed for native USB port only + } + + // try to access the SD card. If that fails (e.g. + // no card present), the Esplora's LED will turn red. + Serial.print(F("Initializing SD card...")); + if (!SD.begin(SD_CS)) { + Serial.println(F("failed!")); + Esplora.writeRed(255); + return; + } + Serial.println("OK!"); + + // clear the GLCD screen before starting + EsploraTFT.background(255, 255, 255); + + // now that the SD card can be access, try to load the + // image file. The Esplora LED will turn green or red if + // the loading went OK or not. + Esplora.writeRGB(0, 0, 0); + logo = EsploraTFT.loadImage("arduino.bmp"); + if (logo.isValid()) { + Esplora.writeGreen(255); + } else { + Esplora.writeRed(255); + } + +} + +void loop() { + // don't do anything if the image wasn't loaded correctly. + if (logo.isValid() == false) { + return; + } + + Serial.println(F("drawing image")); + + // get a random location where to draw the image. + // To avoid the image to be draw outside the screen, + // take into account the image size. + int x = random(EsploraTFT.width() - logo.width()); + int y = random(EsploraTFT.height() - logo.height()); + + // draw the image to the screen + EsploraTFT.image(logo, x, y); + + // wait a little bit before drawing again + delay(1500); +} diff --git a/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/arduino.bmp b/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/arduino.bmp new file mode 100644 index 0000000..09c670a Binary files /dev/null and b/libraries/TFT/examples/Esplora/EsploraTFTBitmapLogo/arduino.bmp differ diff --git a/libraries/TFT/examples/Esplora/EsploraTFTColorPicker/EsploraTFTColorPicker.ino b/libraries/TFT/examples/Esplora/EsploraTFTColorPicker/EsploraTFTColorPicker.ino new file mode 100644 index 0000000..cdce051 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTColorPicker/EsploraTFTColorPicker.ino @@ -0,0 +1,54 @@ +/* + + Esplora TFT Color Picker + + This example for the Esplora with an Arduino TFT reads + the input of the joystick and slider, using the values + to change the screen's color. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/TFTColorPicker + + */ + +#include +#include // Arduino LCD library +#include + +void setup() { + Serial.begin(9600); + + // initialize the LCD + EsploraTFT.begin(); + + // start out with a white screen + EsploraTFT.background(255, 255, 255); + +} + +void loop() { + + // map the values from sensors + int xValue = map(Esplora.readJoystickX(), -512, 512, 0, 255); // read the joystick's X position + int yValue = map(Esplora.readJoystickY(), -512, 512, 0, 255); // read the joystick's Y position + int slider = map(Esplora.readSlider(), 0, 1023, 0, 255); // read the slider's position + + // change the background color based on the mapped values + EsploraTFT.background(xValue, yValue, slider); + + // print the mapped values to the Serial monitor + Serial.print("background("); + Serial.print(xValue); + Serial.print(" , "); + Serial.print(yValue); + Serial.print(" , "); + Serial.print(slider); + Serial.println(")"); + + delay(33); + +} + diff --git a/libraries/TFT/examples/Esplora/EsploraTFTEtchASketch/EsploraTFTEtchASketch.ino b/libraries/TFT/examples/Esplora/EsploraTFTEtchASketch/EsploraTFTEtchASketch.ino new file mode 100644 index 0000000..7d5b567 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTEtchASketch/EsploraTFTEtchASketch.ino @@ -0,0 +1,80 @@ +/* + + Esplora TFT EtchASketch + + This example for the Arduino TFT and Esplora draws + a white line on the screen, based on the position + of the joystick. To clear the screen, shake the + Esplora, using the values from the accelerometer. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/EsploraTFTEtchASketch + + */ + +#include +#include // Arduino LCD library +#include + +// initial position of the cursor +int xPos = EsploraTFT.width() / 2; +int yPos = EsploraTFT.height() / 2; + +void setup() { + // initialize the display + EsploraTFT.begin(); + + // clear the background + EsploraTFT.background(0, 0, 0); +} + +void loop() { + + int xAxis = Esplora.readJoystickX(); // read the X axis + int yAxis = Esplora.readJoystickY(); // read the Y axis + + // update the position of the line + // depending on the position of the joystick + if (xAxis < 10 && xAxis > -10) { + xPos = xPos; + } else { + xPos = xPos + (map(xAxis, -512, 512, 2, -2)); + } + if (yAxis < 10 && yAxis > -10) { + yAxis = yAxis; + } else { + yPos = yPos + (map(yAxis, -512, 512, -2, 2)); + } + + // don't let the point go past the screen edges + if (xPos > 159) { + (xPos = 159); + } + + if (xPos < 0) { + (xPos = 0); + } + if (yPos > 127) { + (yPos = 127); + } + + if (yPos < 0) { + (yPos = 0); + } + + // draw the point + EsploraTFT.stroke(255, 255, 255); + EsploraTFT.point(xPos, yPos); + + // check the accelerometer values and clear + // the screen if it is being shaken + if (abs(Esplora.readAccelerometer(X_AXIS)) > 200 || abs(Esplora.readAccelerometer(Y_AXIS)) > 200) { + EsploraTFT.background(0, 0, 0); + } + + delay(33); +} + diff --git a/libraries/TFT/examples/Esplora/EsploraTFTGraph/EsploraTFTGraph.ino b/libraries/TFT/examples/Esplora/EsploraTFTGraph/EsploraTFTGraph.ino new file mode 100644 index 0000000..24e0db6 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTGraph/EsploraTFTGraph.ino @@ -0,0 +1,55 @@ +/* + + Esplora TFT Graph + + This example for the Esplora with an Arduino TFT reads + the value of the light sensor, and graphs the values on + the screen. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/EsploraTFTGraph + + */ + +#include +#include // Arduino LCD library +#include + +// position of the line on screen +int xPos = 0; + +void setup() { + + // initialize the screen + EsploraTFT.begin(); + + // clear the screen with a nice color + EsploraTFT.background(250, 16, 200); +} + +void loop() { + + // read the sensor value + int sensor = Esplora.readLightSensor(); + // map the sensor value to the height of the screen + int graphHeight = map(sensor, 0, 1023, 0, EsploraTFT.height()); + + // draw the line in a pretty color + EsploraTFT.stroke(250, 180, 10); + EsploraTFT.line(xPos, EsploraTFT.height() - graphHeight, xPos, EsploraTFT.height()); + + // if the graph reaches the edge of the screen + // erase it and start over from the other side + if (xPos >= 160) { + xPos = 0; + EsploraTFT.background(250, 16, 200); + } else { + // increment the horizontal position: + xPos++; + } + + delay(16); +} diff --git a/libraries/TFT/examples/Esplora/EsploraTFTHorizon/EsploraTFTHorizon.ino b/libraries/TFT/examples/Esplora/EsploraTFTHorizon/EsploraTFTHorizon.ino new file mode 100644 index 0000000..9a5a454 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTHorizon/EsploraTFTHorizon.ino @@ -0,0 +1,62 @@ +/* + + Esplora TFT Horizon + + This example for the Arduino TFT and Esplora draws + a line on the screen that stays level with the ground + as you tile the Esplora side to side + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/EsploraTFTHorizon + + */ + +#include +#include // Arduino LCD library +#include + +// horizontal start and end positions +int yStart = EsploraTFT.height() / 2; +int yEnd = EsploraTFT.height() / 2; + +// previous start and end positions +int oldEndY; +int oldStartY; + +void setup() { + // initialize the display + EsploraTFT.begin(); + // make the background black + EsploraTFT.background(0, 0, 0); +} + +void loop() { + // read the x-axis of te accelerometer + int tilt = Esplora.readAccelerometer(X_AXIS); + + // the values are 100 when tilted to the left + // and -100 when tilted to the right + // map these values to the start and end points + yStart = map(tilt, -100, 100, EsploraTFT.height(), 0); + yEnd = map(tilt, -100, 100, 0, EsploraTFT.height()); + + // if the previous values are different than the current values + // erase the previous line + if (oldStartY != yStart || oldEndY != yEnd) { + EsploraTFT.stroke(0, 0, 0); + EsploraTFT.line(0, oldStartY, EsploraTFT.width(), oldEndY); + } + + // draw the line in magenta + EsploraTFT.stroke(255, 0, 255); + EsploraTFT.line(0, yStart, EsploraTFT.width(), yEnd); + + // save the current start and end points + // to compare int he next loop + oldStartY = yStart; + oldEndY = yEnd; + delay(10); +} diff --git a/libraries/TFT/examples/Esplora/EsploraTFTPong/EsploraTFTPong.ino b/libraries/TFT/examples/Esplora/EsploraTFTPong/EsploraTFTPong.ino new file mode 100644 index 0000000..11b1dff --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTPong/EsploraTFTPong.ino @@ -0,0 +1,126 @@ +/* + + Esplora TFT Pong + + This example for the Esplora with an Arduino TFT screen reads + the value of the joystick to move a rectangular platform + on the x and y axes. The platform can intersect with a ball + causing it to bounce. The Esplora's slider adjusts the speed + of the ball. + + This example code is in the public domain. + + Created by Tom Igoe December 2012 + Modified 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/EsploraTFTPong + + */ + +#include +#include // Arduino LCD library +#include + +// variables for the position of the ball and paddle +int paddleX = 0; +int paddleY = 0; +int oldPaddleX, oldPaddleY; +int ballDirectionX = 1; +int ballDirectionY = 1; + +int ballX, ballY, oldBallX, oldBallY; + +void setup() { + + Serial.begin(9600); + + // initialize the display + EsploraTFT.begin(); + // set the background the black + EsploraTFT.background(0, 0, 0); +} + +void loop() { + // save the width and height of the screen + int myWidth = EsploraTFT.width(); + int myHeight = EsploraTFT.height(); + + // map the paddle's location to the joystick's position + paddleX = map(Esplora.readJoystickX(), 512, -512, 0, myWidth) - 20 / 2; + paddleY = map(Esplora.readJoystickY(), -512, 512, 0, myHeight) - 5 / 2; + Serial.print(paddleX); + Serial.print(" "); + Serial.println(paddleY); + + // set the fill color to black and erase the previous + // position of the paddle if different from present + EsploraTFT.fill(0, 0, 0); + + if (oldPaddleX != paddleX || oldPaddleY != paddleY) { + EsploraTFT.rect(oldPaddleX, oldPaddleY, 20, 5); + } + + // draw the paddle on screen, save the current position + // as the previous. + EsploraTFT.fill(255, 255, 255); + EsploraTFT.rect(paddleX, paddleY, 20, 5); + oldPaddleX = paddleX; + oldPaddleY = paddleY; + + // read the slider to determinde the speed of the ball + int ballSpeed = map(Esplora.readSlider(), 0, 1023, 0, 80) + 1; + if (millis() % ballSpeed < 2) { + moveBall(); + } +} + + +// this function determines the ball's position on screen +void moveBall() { + // if the ball goes offscreen, reverse the direction: + if (ballX > EsploraTFT.width() || ballX < 0) { + ballDirectionX = -ballDirectionX; + } + + if (ballY > EsploraTFT.height() || ballY < 0) { + ballDirectionY = -ballDirectionY; + } + + // check if the ball and the paddle occupy the same space on screen + if (inPaddle(ballX, ballY, paddleX, paddleY, 20, 5)) { + ballDirectionY = -ballDirectionY; + } + + // update the ball's position + ballX += ballDirectionX; + ballY += ballDirectionY; + + // erase the ball's previous position + EsploraTFT.fill(0, 0, 0); + + if (oldBallX != ballX || oldBallY != ballY) { + EsploraTFT.rect(oldBallX, oldBallY, 5, 5); + } + + // draw the ball's current position + EsploraTFT.fill(255, 255, 255); + + EsploraTFT.rect(ballX, ballY, 5, 5); + + oldBallX = ballX; + oldBallY = ballY; + +} + +// this function checks the position of the ball +// to see if it intersects with the paddle +boolean inPaddle(int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) { + boolean result = false; + + if ((x >= rectX && x <= (rectX + rectWidth)) && + (y >= rectY && y <= (rectY + rectHeight))) { + result = true; + } + + return result; +} diff --git a/libraries/TFT/examples/Esplora/EsploraTFTTemp/EsploraTFTTemp.ino b/libraries/TFT/examples/Esplora/EsploraTFTTemp/EsploraTFTTemp.ino new file mode 100644 index 0000000..a5c7081 --- /dev/null +++ b/libraries/TFT/examples/Esplora/EsploraTFTTemp/EsploraTFTTemp.ino @@ -0,0 +1,64 @@ +/* + + Esplora TFT Temperature Display + + This example for the Arduino TFT screen is for use + with an Arduino Esplora. + + This example reads the temperature of the Esplora's + on board thermisistor and displays it on an attached + LCD screen, updating every second. + + This example code is in the public domain. + + Created 15 April 2013 by Scott Fitzgerald + + http://www.arduino.cc/en/Tutorial/EsploraTFTTemp + + */ + +// include the necessary libraries +#include +#include // Arduino LCD library +#include + +char tempPrintout[3]; // array to hold the temperature data + +void setup() { + + // Put this line at the beginning of every sketch that uses the GLCD + EsploraTFT.begin(); + + // clear the screen with a black background + EsploraTFT.background(0, 0, 0); + + // set the text color to magenta + EsploraTFT.stroke(200, 20, 180); + // set the text to size 2 + EsploraTFT.setTextSize(2); + // start the text at the top left of the screen + // this text is going to remain static + EsploraTFT.text("Degrees in C :\n ", 0, 0); + + // set the text in the loop to size 5 + EsploraTFT.setTextSize(5); +} + +void loop() { + + // read the temperature in Celcius and store it in a String + String temperature = String(Esplora.readTemperature(DEGREES_C)); + + // convert the string to a char array + temperature.toCharArray(tempPrintout, 3); + + // set the text color to white + EsploraTFT.stroke(255, 255, 255); + // print the temperature one line below the static text + EsploraTFT.text(tempPrintout, 0, 30); + + delay(1000); + // erase the text for the next loop + EsploraTFT.stroke(0, 0, 0); + EsploraTFT.text(tempPrintout, 0, 30); +} diff --git a/libraries/TFT/extras/Adafruit-README.txt b/libraries/TFT/extras/Adafruit-README.txt new file mode 100644 index 0000000..6f3b682 --- /dev/null +++ b/libraries/TFT/extras/Adafruit-README.txt @@ -0,0 +1,21 @@ +This is a library for the Adafruit 1.8" SPI display. +This library works with the Adafruit 1.8" TFT Breakout w/SD card + ----> http://www.adafruit.com/products/358 +as well as Adafruit raw 1.8" TFT display + ----> http://www.adafruit.com/products/618 + +Check out the links above for our tutorials and wiring diagrams. +These displays use SPI to communicate, 4 or 5 pins are required +to interface (RST is optional). +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +MIT license, all text above must be included in any redistribution + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_ST7735. Check that the Adafruit_ST7735 folder contains Adafruit_ST7735.cpp and Adafruit_ST7735. + +Place the Adafruit_ST7735 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE + +Also requires the Adafruit_GFX library for Arduino. diff --git a/libraries/TFT/extras/Adafruit-license.txt b/libraries/TFT/extras/Adafruit-license.txt new file mode 100644 index 0000000..4bbfa39 --- /dev/null +++ b/libraries/TFT/extras/Adafruit-license.txt @@ -0,0 +1,25 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/libraries/TFT/extras/README.md b/libraries/TFT/extras/README.md new file mode 100644 index 0000000..6f41794 --- /dev/null +++ b/libraries/TFT/extras/README.md @@ -0,0 +1,18 @@ +TFT Library +============ + +An Arduino library for the Arduino TFT LCD screen. + +This library enables an Arduino board to communicate with an Arduino TFT LCD screen. It simplifies the process for drawing shapes, lines, images, and text to the screen. +The Arduino TFT library extends the Adafruit GFX, and Adafruit ST7735 libraries that it is based on. The GFX library is responsible for the drawing routines, while the ST7735 library is specific to the screen on the Arduino GTFT. The Arduino specific additions were designed to work as similarly to the Processing API as possible. + +Onboard the screen is a SD card slot, which can be used through the SD library. + +The TFT library relies on the SPI library for communication with the screen and SD card, and needs to be included in all sketches. + +https://github.com/adafruit/Adafruit-GFX-Library +https://github.com/adafruit/Adafruit-ST7735-Library +http://www.arduino.cc/en/Reference/SD +http://www.arduino.cc/en/Reference/SPI + +http://www.arduino.cc/en/Reference/TFTLibrary \ No newline at end of file diff --git a/libraries/TFT/keywords.txt b/libraries/TFT/keywords.txt new file mode 100644 index 0000000..c8d33e4 --- /dev/null +++ b/libraries/TFT/keywords.txt @@ -0,0 +1,20 @@ +####################################### +# Syntax Coloring Map For Arduino GLCD +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +TFT KEYWORD1 TFTLibrary + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + + +####################################### +# Constants (LITERAL1) +####################################### + +EsploraTFT LITERAL1 diff --git a/libraries/TFT/library.properties b/libraries/TFT/library.properties new file mode 100644 index 0000000..d6a8698 --- /dev/null +++ b/libraries/TFT/library.properties @@ -0,0 +1,9 @@ +name=TFT +version=1.0.5 +author=Arduino, Adafruit +maintainer=Arduino +sentence=Allows drawing text, images, and shapes on the Arduino TFT graphical display. For all Arduino boards. +paragraph=This library is compatible with most of the TFT display based on the ST7735 chipset +category=Display +url=http://www.arduino.cc/en/Reference/TFTLibrary +architectures=stm32f4 diff --git a/libraries/TFT/src/TFT.cpp b/libraries/TFT/src/TFT.cpp new file mode 100644 index 0000000..1bdf7ed --- /dev/null +++ b/libraries/TFT/src/TFT.cpp @@ -0,0 +1,51 @@ +/* Copyright (c) 2013, Enrico Gueli All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "TFT.h" + +#if ARDUINO_AVR_ESPLORA +TFT EsploraTFT(7, 0, 1); +#endif + +TFT::TFT(uint8_t CS, uint8_t RS, uint8_t RST) + : Adafruit_ST7735(CS, RS, RST) +{ + // as we already know the orientation (landscape, therefore rotated), + // set default width and height without need to call begin() first. + _width = ST7735_TFTHEIGHT; + _height = ST7735_TFTWIDTH; +} + +void TFT::begin() { +//initR(INITR_REDTAB); + initG(); + setRotation(1); +} diff --git a/libraries/TFT/src/TFT.h b/libraries/TFT/src/TFT.h new file mode 100644 index 0000000..16791d6 --- /dev/null +++ b/libraries/TFT/src/TFT.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2013, Enrico Gueli All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _ARDUINO_TFT_H +#define _ARDUINO_TFT_H + +#include "Arduino.h" +#include "utility/Adafruit_GFX.h" +#include "utility/Adafruit_ST7735.h" + +/// The Arduino LCD is a ST7735-based device. +/// By default, it is mounted horizontally. +/// TFT class follows the convention of other +/// Arduino library classes by adding a begin() method +/// to be called in the setup() routine. +/// @author Enrico Gueli +class TFT : public Adafruit_ST7735 { +public: + TFT(uint8_t CS, uint8_t RS, uint8_t RST); + + void begin(); +}; + +/// Esplora boards have hard-wired connections with +/// the Arduino LCD if mounted on the onboard connector. +#if ARDUINO_AVR_ESPLORA // are we building for Esplora? +extern TFT EsploraTFT; +#endif + +#endif // _ARDUINO_TFT_H diff --git a/libraries/TFT/src/utility/Adafruit_GFX.cpp b/libraries/TFT/src/utility/Adafruit_GFX.cpp new file mode 100644 index 0000000..6478c47 --- /dev/null +++ b/libraries/TFT/src/utility/Adafruit_GFX.cpp @@ -0,0 +1,715 @@ +/* +This is the core graphics library for all our displays, providing a common +set of graphics primitives (points, lines, circles, etc.). It needs to be +paired with a hardware-specific library for each display device we carry +(to handle the lower-level functions). + +Adafruit invests time and resources providing this open source code, please +support Adafruit & open-source hardware by purchasing products from Adafruit! + +Copyright (c) 2013 Adafruit Industries. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "Adafruit_GFX.h" +#include "glcdfont.c" +#ifdef __AVR__ + #include +#else + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif + +Adafruit_GFX::Adafruit_GFX(int16_t w, int16_t h) : + WIDTH(w), HEIGHT(h) +{ + _width = WIDTH; + _height = HEIGHT; + rotation = 0; + cursor_y = cursor_x = 0; + textsize = 1; + textcolor = textbgcolor = 0xFFFF; + wrap = true; +} + +// draw a circle outline +void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) { + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + drawPixel(x0, y0+r, color); + drawPixel(x0, y0-r, color); + drawPixel(x0+r, y0, color); + drawPixel(x0-r, y0, color); + + while (x= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 - x, y0 + y, color); + drawPixel(x0 + x, y0 - y, color); + drawPixel(x0 - x, y0 - y, color); + drawPixel(x0 + y, y0 + x, color); + drawPixel(x0 - y, y0 + x, color); + drawPixel(x0 + y, y0 - x, color); + drawPixel(x0 - y, y0 - x, color); + } +} + +void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0, + int16_t r, uint8_t cornername, uint16_t color) { + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + while (x= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + if (cornername & 0x4) { + drawPixel(x0 + x, y0 + y, color); + drawPixel(x0 + y, y0 + x, color); + } + if (cornername & 0x2) { + drawPixel(x0 + x, y0 - y, color); + drawPixel(x0 + y, y0 - x, color); + } + if (cornername & 0x8) { + drawPixel(x0 - y, y0 + x, color); + drawPixel(x0 - x, y0 + y, color); + } + if (cornername & 0x1) { + drawPixel(x0 - y, y0 - x, color); + drawPixel(x0 - x, y0 - y, color); + } + } +} + +void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, + uint16_t color) +{ + drawFastVLine(x0, y0-r, 2*r+1, color); + fillCircleHelper(x0, y0, r, 3, 0, color); +} + +// used to do circles and roundrects +void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, + uint8_t cornername, int16_t delta, uint16_t color) +{ + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + while (x= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + if (cornername & 0x1) { + drawFastVLine(x0+x, y0-y, 2*y+1+delta, color); + drawFastVLine(x0+y, y0-x, 2*x+1+delta, color); + } + if (cornername & 0x2) { + drawFastVLine(x0-x, y0-y, 2*y+1+delta, color); + drawFastVLine(x0-y, y0-x, 2*x+1+delta, color); + } + } +} + +// Bresenham's algorithm - thx wikpedia +void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, + int16_t x1, int16_t y1, + uint16_t color) +{ + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + swap(x0, y0); + swap(x1, y1); + } + + if (x0 > x1) { + swap(x0, x1); + swap(y0, y1); + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x0<=x1; x0++) { + if (steep) { + drawPixel(y0, x0, color); + } else { + drawPixel(x0, y0, color); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + + +// Draw a rectangle +void Adafruit_GFX::drawRect(int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t color) +{ + drawFastHLine(x, y, w, color); + drawFastHLine(x, y+h-1, w, color); + drawFastVLine(x, y, h, color); + drawFastVLine(x+w-1, y, h, color); +} + +void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, + int16_t h, uint16_t color) +{ + // Update in subclasses if desired! + drawLine(x, y, x, y+h-1, color); +} + + +void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, + int16_t w, uint16_t color) +{ + // Update in subclasses if desired! + drawLine(x, y, x+w-1, y, color); +} + +void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) +{ + // Update in subclasses if desired! + for (int16_t i=x; i= y1 >= y0) + if (y0 > y1) { + swap(y0, y1); swap(x0, x1); + } + if (y1 > y2) { + swap(y2, y1); swap(x2, x1); + } + if (y0 > y1) { + swap(y0, y1); swap(x0, x1); + } + + if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing + a = b = x0; + if(x1 < a) a = x1; + else if(x1 > b) b = x1; + if(x2 < a) a = x2; + else if(x2 > b) b = x2; + drawFastHLine(a, y0, b-a+1, color); + return; + } + + int16_t + dx01 = x1 - x0, + dy01 = y1 - y0, + dx02 = x2 - x0, + dy02 = y2 - y0, + dx12 = x2 - x1, + dy12 = y2 - y1, + sa = 0, + sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y1 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y0=y1 + // (flat-topped triangle). + if(y1 == y2) last = y1; // Include y1 scanline + else last = y1-1; // Skip it + + for(y=y0; y<=last; y++) { + a = x0 + sa / dy01; + b = x0 + sb / dy02; + sa += dx01; + sb += dx02; + /* longhand: + a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if(a > b) swap(a,b); + drawFastHLine(a, y, b-a+1, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y1=y2. + sa = dx12 * (y - y1); + sb = dx02 * (y - y0); + for(; y<=y2; y++) { + a = x1 + sa / dy12; + b = x0 + sb / dy02; + sa += dx12; + sb += dx02; + /* longhand: + a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); + b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); + */ + if(a > b) swap(a,b); + drawFastHLine(a, y, b-a+1, color); + } +} + +void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, + const uint8_t *bitmap, int16_t w, int16_t h, + uint16_t color) +{ + int16_t i, j, byteWidth = (w + 7) / 8; + + for(j=0; j> (i & 7))) { + drawPixel(x+i, y+j, color); + } + } + } +} + + +#if ARDUINO >= 100 +size_t Adafruit_GFX::write(uint8_t c) { +#else +void Adafruit_GFX::write(uint8_t c) { +#endif + if (c == '\n') { + cursor_y += textsize*8; + cursor_x = 0; + } else if (c == '\r') { + // skip em + } else { + drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); + cursor_x += textsize*6; + if (wrap && (cursor_x > (_width - textsize*6))) { + cursor_y += textsize*8; + cursor_x = 0; + } + } +#if ARDUINO >= 100 + return 1; +#endif +} + +// draw a character +void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, + uint16_t color, uint16_t bg, uint8_t size) +{ + if((x >= _width) || // Clip right + (y >= _height) || // Clip bottom + ((x + 6 * size - 1) < 0) || // Clip left + ((y + 8 * size - 1) < 0)) // Clip top + return; + + for (int8_t i=0; i<6; i++ ) { + uint8_t line; + if (i == 5) + line = 0x0; + else + line = pgm_read_byte(font+(c*5)+i); + for (int8_t j = 0; j<8; j++) { + if (line & 0x1) { + if (size == 1) // default size + drawPixel(x+i, y+j, color); + else { // big size + fillRect(x+(i*size), y+(j*size), size, size, color); + } + } else if (bg != color) { + if (size == 1) // default size + drawPixel(x+i, y+j, bg); + else { // big size + fillRect(x+i*size, y+j*size, size, size, bg); + } + } + line >>= 1; + } + } +} + +void Adafruit_GFX::setCursor(int16_t x, int16_t y) +{ + cursor_x = x; + cursor_y = y; +} + + +void Adafruit_GFX::setTextSize(uint8_t s) +{ + textsize = (s > 0) ? s : 1; +} + + +void Adafruit_GFX::setTextColor(uint16_t c) { + textcolor = c; + textbgcolor = c; + // for 'transparent' background, we'll set the bg + // to the same as fg instead of using a flag +} + + void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) +{ + textcolor = c; + textbgcolor = b; +} + +void Adafruit_GFX::setTextWrap(boolean w) +{ + wrap = w; +} + +uint8_t Adafruit_GFX::getRotation(void) +{ + return rotation; +} + +void Adafruit_GFX::setRotation(uint8_t x) +{ + rotation = (x & 3); + switch (x) { + case 0: + case 2: + _width = WIDTH; + _height = HEIGHT; + break; + case 1: + case 3: + _width = HEIGHT; + _height = WIDTH; + break; + } +} + + + +// return the size of the display (per current rotation) +int16_t Adafruit_GFX::width(void) +{ + return _width; +} + +int16_t Adafruit_GFX::height(void) +{ + return _height; +} + +void Adafruit_GFX::invertDisplay(boolean i) +{ + // Do nothing, must be subclassed if supported +} + + +uint16_t Adafruit_GFX::newColor(uint8_t r, uint8_t g, uint8_t b) +{ + return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); +} + +void Adafruit_GFX::background(uint8_t red, uint8_t green, uint8_t blue) +{ + background(newColor(red, green, blue)); +} + +void Adafruit_GFX::background(color c) { + fillScreen(c); +} + +void Adafruit_GFX::stroke(uint8_t red, uint8_t green, uint8_t blue) +{ + stroke(newColor(red, green, blue)); +} + +void Adafruit_GFX::stroke(color c) +{ + useStroke = true; + strokeColor = c; + setTextColor(c); +} + +void Adafruit_GFX::noStroke() +{ + useStroke = false; +} + +void Adafruit_GFX::noFill() { + useFill = false; +} + +void Adafruit_GFX::fill(uint8_t red, uint8_t green, uint8_t blue) +{ + fill(newColor(red, green, blue)); +} + +void Adafruit_GFX::fill(color c) +{ + useFill = true; + fillColor = c; +} + + +void Adafruit_GFX::text(const char * text, int16_t x, int16_t y) +{ + if (!useStroke) + return; + + setTextWrap(false); + setTextColor(strokeColor); + setCursor(x, y); + print(text); +} + +void Adafruit_GFX::textWrap(const char * text, int16_t x, int16_t y) +{ + if (!useStroke) + return; + + setTextWrap(true); + setTextColor(strokeColor); + setCursor(x, y); + print(text); +} + + +void Adafruit_GFX::textSize(uint8_t size) +{ + setTextSize(size); +} + +void Adafruit_GFX::point(int16_t x, int16_t y) +{ + if (!useStroke) + return; + + drawPixel(x, y, strokeColor); +} + +void Adafruit_GFX::line(int16_t x1, int16_t y1, int16_t x2, int16_t y2) +{ + if (!useStroke) + return; + + if (x1 == x2) { + if (y1 < y2) + drawFastVLine(x1, y1, y2 - y1, strokeColor); + else + drawFastVLine(x1, y2, y1 - y2, strokeColor); + } + else if (y1 == y2) { + if (x1 < x2) + drawFastHLine(x1, y1, x2 - x1, strokeColor); + else + drawFastHLine(x2, y1, x1 - x2, strokeColor); + } + else { + drawLine(x1, y1, x2, y2, strokeColor); + } +} + +void Adafruit_GFX::rect(int16_t x, int16_t y, int16_t width, int16_t height) +{ + if (useFill) { + fillRect(x, y, width, height, fillColor); + } + if (useStroke) { + drawRect(x, y, width, height, strokeColor); + } +} + +void Adafruit_GFX::rect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t radius) +{ + if (radius == 0) { + rect(x, y, width, height); + } + if (useFill) { + fillRoundRect(x, y, width, height, radius, fillColor); + } + if (useStroke) { + drawRoundRect(x, y, width, height, radius, strokeColor); + } +} + +void Adafruit_GFX::circle(int16_t x, int16_t y, int16_t r) +{ + if (r == 0) + return; + + if (useFill) { + fillCircle(x, y, r, fillColor); + } + if (useStroke) { + drawCircle(x, y, r, strokeColor); + } +} + +void Adafruit_GFX::triangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t x3, int16_t y3) +{ + if (useFill) { + fillTriangle(x1, y1, x2, y2, x3, y3, fillColor); + } + if (useStroke) { + drawTriangle(x1, y1, x2, y2, x3, y3, strokeColor); + } +} + +#if defined(__SD_H__) // Arduino SD library + +#define BUFFPIXEL 20 + +void Adafruit_GFX::image(PImage & img, uint16_t x, uint16_t y) { + int w, h, row, col; + uint8_t r, g, b; + uint32_t pos = 0; + uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) + uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer + + // Crop area to be loaded + w = img._bmpWidth; + h = img._bmpHeight; + if((x+w-1) >= width()) w = width() - x; + if((y+h-1) >= height()) h = height() - y; + + /* + // Set TFT address window to clipped image bounds + setAddrWindow(x, y, x+w-1, y+h-1); + */ + + for (row=0; row= sizeof(sdbuffer)) { // Indeed + img._bmpFile.read(sdbuffer, sizeof(sdbuffer)); + buffidx = 0; // Set index to beginning + } + + // Convert pixel from BMP to TFT format, push to display + b = sdbuffer[buffidx++]; + g = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + //pushColor(tft.Color565(r,g,b)); + drawPixel(x + col, y + row, newColor(r, g, b)); + + } // end pixel + } // end scanline + +} + +#endif diff --git a/libraries/TFT/src/utility/Adafruit_GFX.h b/libraries/TFT/src/utility/Adafruit_GFX.h new file mode 100644 index 0000000..626e3d7 --- /dev/null +++ b/libraries/TFT/src/utility/Adafruit_GFX.h @@ -0,0 +1,372 @@ +/****************************************************************** + This is the core graphics library for all our displays, providing + basic graphics primitives (points, lines, circles, etc.). It needs + to be paired with a hardware-specific library for each display + device we carry (handling the lower-level functions). + + Adafruit invests time and resources providing this open + source code, please support Adafruit and open-source hardware + by purchasing products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + Processing-like API written by Enrico Gueli for Officine Arduino. + BSD license, check license.txt for more information. + All text above must be included in any redistribution. + ******************************************************************/ + +#ifndef _ADAFRUIT_GFX_H +#define _ADAFRUIT_GFX_H + +#if ARDUINO >= 100 + #include "Arduino.h" + #include "Print.h" +#else + #include "WProgram.h" +#endif + +/* + * This library can work with or without the presence of an SD + * reading library (to load images). At the moment, only the + * Arduino SD library is supported; it is included in + * standard Arduino libraries. + * + * The presence of the SD library is detected by looking at the + * __SD_H__ preprocessor variable, defined into + * Arduino SD library to avoid double inclusion. This means + * that in order to use the image-related API of Adafruit_GFX, + * SD.h *must* be included before Adafruit_GFX. + * + * The bottom part of this include file contains the actual image + * loading code; if it was in a separate .cpp file, there were no + * way to check if the SD library was present or not. + * + * A partial solution was to include SD.h anyway, see if that works + * (i.e. it is found in the include search path) and act accordingly. + * But this solution relied on the preprocessor to issue only a + * warning when an include file is not found. Avr-gcc, used for + * Arduino 8-bit MCUs, does that, but the standard gcc-4.4, used for + * Arduino Due, issues a fatal error and stops compilation. + * + * The best solution so far is to put the code here. It works if this + * include is used only in one .cpp file in the build (this is the + * case of most Arduino sketches); if used in multiple .cpp files, + * the linker may complain about duplicate definitions. + * + */ + +#if defined(__SD_H__) // Arduino SD library + #include "PImage.h" +#else + #warning "The SD library was not found. loadImage() and image() won't be supported." +#endif + +#define swap(a, b) { int16_t t = a; a = b; b = t; } + +/* TODO +enum RectMode { + CORNER, + CORNERS, + RADIUS, + CENTER +}; +*/ + +typedef uint16_t color; + +class Adafruit_GFX : public Print { + public: + + Adafruit_GFX(int16_t w, int16_t h); // Constructor + + // This MUST be defined by the subclass + virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; + + + + // These MAY be overridden by the subclass to provide device-specific + // optimized code. Otherwise 'generic' versions are used. + virtual void + drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + uint16_t color), + drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), + drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), + drawRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color), + fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color), + fillScreen(uint16_t color), + invertDisplay(boolean i); + +// These exist only with Adafruit_GFX (no subclass overrides) + void + drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + drawCircleHelper(int16_t x0, int16_t y0, + int16_t r, uint8_t cornername, uint16_t color), + fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color), + fillCircleHelper(int16_t x0, int16_t y0, int16_t r, + uint8_t cornername, int16_t delta, uint16_t color), + + drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, + int16_t x2, int16_t y2, uint16_t color), + drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, + int16_t radius, uint16_t color), + + drawBitmap(int16_t x, int16_t y, + const uint8_t *bitmap, int16_t w, int16_t h, + uint16_t color), + drawChar(int16_t x, int16_t y, unsigned char c, + uint16_t color, uint16_t bg, uint8_t size), + setCursor(int16_t x, int16_t y), + setTextColor(uint16_t c), + setTextColor(uint16_t c, uint16_t bg), + setTextSize(uint8_t s), + setTextWrap(boolean w), + setRotation(uint8_t r); + +#if ARDUINO >= 100 + virtual size_t write(uint8_t); +#else + virtual void write(uint8_t); +#endif + + int16_t + height(void), + width(void); + + + uint8_t getRotation(void); + + + /* + * Processing-like graphics primitives + */ + + /// transforms a color in 16-bit form given the RGB components. + /// The default implementation makes a 5-bit red, a 6-bit + /// green and a 5-bit blue (MSB to LSB). Devices that use + /// different scheme should override this. + virtual uint16_t newColor(uint8_t red, uint8_t green, uint8_t blue); + + + void + // http://processing.org/reference/background_.html + background(uint8_t red, uint8_t green, uint8_t blue), + background(color c), + + // http://processing.org/reference/fill_.html + fill(uint8_t red, uint8_t green, uint8_t blue), + fill(color c), + + // http://processing.org/reference/noFill_.html + noFill(), + + // http://processing.org/reference/stroke_.html + stroke(uint8_t red, uint8_t green, uint8_t blue), + stroke(color c), + + // http://processing.org/reference/noStroke_.html + noStroke(), + + text(const char * text, int16_t x, int16_t y), + textWrap(const char * text, int16_t x, int16_t y), + + textSize(uint8_t size), + + // similar to ellipse() in Processing, but with + // a single radius. + // http://processing.org/reference/ellipse_.html + circle(int16_t x, int16_t y, int16_t r), + point(int16_t x, int16_t y), + line(int16_t x1, int16_t y1, int16_t x2, int16_t y2), + quad(int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t x3, int16_t y3, int16_t x4, int16_t y4), +rect(int16_t x, int16_t y, int16_t width, int16_t height), + rect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t radius), + triangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t x3, int16_t y3); + + /* TODO + void rectMode(RectMode mode); + + void pushStyle(); + void popStyle(); + */ + +#if defined(__SD_H__) // Arduino SD library + PImage loadImage(const char * fileName) { return PImage::loadImage(fileName); } + + void image(PImage & img, uint16_t x, uint16_t y); +#endif + + protected: + int16_t + WIDTH, HEIGHT; // this is the 'raw' display w/h - never changes + int16_t + _width, _height, // dependent on rotation + cursor_x, cursor_y; + uint16_t + textcolor, textbgcolor; + uint8_t + textsize, + rotation; + boolean + wrap; // If set, 'wrap' text at right edge of display + + /* + * Processing-style graphics state + */ + + color strokeColor; + bool useStroke; + color fillColor; + bool useFill; +}; + +#if defined(__SD_H__) // Arduino SD library + +#define BUFFPIXEL 20 + +void Adafruit_GFX::image(PImage & img, uint16_t x, uint16_t y) { + int w, h, row, col; + uint8_t r, g, b; + uint32_t pos = 0; + uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) + uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer + + // Crop area to be loaded + w = img._bmpWidth; + h = img._bmpHeight; + if((x+w-1) >= width()) w = width() - x; + if((y+h-1) >= height()) h = height() - y; + + /* + // Set TFT address window to clipped image bounds + setAddrWindow(x, y, x+w-1, y+h-1); + */ + + for (row=0; row= sizeof(sdbuffer)) { // Indeed + img._bmpFile.read(sdbuffer, sizeof(sdbuffer)); + buffidx = 0; // Set index to beginning + } + + // Convert pixel from BMP to TFT format, push to display + b = sdbuffer[buffidx++]; + g = sdbuffer[buffidx++]; + r = sdbuffer[buffidx++]; + //pushColor(tft.Color565(r,g,b)); + drawPixel(x + col, y + row, newColor(r, g, b)); + + } // end pixel + } // end scanline + +} + + + + +// These read 16- and 32-bit types from the SD card file. +// BMP data is stored little-endian, Arduino is little-endian too. +// May need to reverse subscript order if porting elsewhere. + +uint16_t PImage::read16(File f) { + uint16_t result; + ((uint8_t *)&result)[0] = f.read(); // LSB + ((uint8_t *)&result)[1] = f.read(); // MSB + return result; +} + +uint32_t PImage::read32(File f) { + uint32_t result; + ((uint8_t *)&result)[0] = f.read(); // LSB + ((uint8_t *)&result)[1] = f.read(); + ((uint8_t *)&result)[2] = f.read(); + ((uint8_t *)&result)[3] = f.read(); // MSB + return result; +} + + +PImage PImage::loadImage(const char * fileName) { + File bmpFile; + int bmpWidth, bmpHeight; // W+H in pixels + uint8_t bmpDepth; // Bit depth (currently must be 24) + uint32_t bmpImageoffset; // Start of image data in file + uint32_t rowSize; // Not always = bmpWidth; may have padding + bool flip = true; // BMP is stored bottom-to-top + + + // Open requested file on SD card + if ((bmpFile = SD.open(fileName)) == NULL) { + Serial.print(F("loadImage: file not found: ")); + Serial.println(fileName); + return PImage(); // load error + } + + + + // Parse BMP header + if(read16(bmpFile) != 0x4D42) { // BMP signature + Serial.println(F("loadImage: file doesn't look like a BMP")); + return PImage(); + } + + Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); + (void)read32(bmpFile); // Read & ignore creator bytes + bmpImageoffset = read32(bmpFile); // Start of image data + Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); + // Read DIB header + Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); + bmpWidth = read32(bmpFile); + bmpHeight = read32(bmpFile); + if(read16(bmpFile) != 1) { // # planes -- must be '1' + Serial.println(F("loadImage: invalid n. of planes")); + return PImage(); + } + + bmpDepth = read16(bmpFile); // bits per pixel + Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); + if((bmpDepth != 24) || (read32(bmpFile) != 0)) { // 0 = uncompressed { + Serial.println(F("loadImage: invalid pixel format")); + return PImage(); + } + + Serial.print(F("Image size: ")); + Serial.print(bmpWidth); + Serial.print('x'); + Serial.println(bmpHeight); + + // BMP rows are padded (if needed) to 4-byte boundary + rowSize = (bmpWidth * 3 + 3) & ~3; + + // If bmpHeight is negative, image is in top-down order. + // This is not canon but has been observed in the wild. + if(bmpHeight < 0) { + bmpHeight = -bmpHeight; + flip = false; + } + + return PImage(bmpFile, bmpWidth, bmpHeight, bmpDepth, bmpImageoffset, rowSize, flip); +} + +#endif + +#endif // _ADAFRUIT_GFX_H diff --git a/libraries/TFT/src/utility/Adafruit_ST7735.cpp b/libraries/TFT/src/utility/Adafruit_ST7735.cpp new file mode 100644 index 0000000..95d5151 --- /dev/null +++ b/libraries/TFT/src/utility/Adafruit_ST7735.cpp @@ -0,0 +1,740 @@ +/*************************************************** + This is a library for the Adafruit 1.8" SPI display. + This library works with the Adafruit 1.8" TFT Breakout w/SD card + ----> http://www.adafruit.com/products/358 + as well as Adafruit raw 1.8" TFT display + ----> http://www.adafruit.com/products/618 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ + +#include "Adafruit_ST7735.h" +#include +#include +#include "pins_arduino.h" +#include "wiring_private.h" +#include + +inline uint16_t swapcolor(uint16_t x) { + return (x << 11) | (x & 0x07E0) | (x >> 11); +} + + +// Constructor when using software SPI. All output pins are configurable. +Adafruit_ST7735::Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t sid, + uint8_t sclk, uint8_t rst) : Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) +{ + _cs = cs; + _rs = rs; + _sid = sid; + _sclk = sclk; + _rst = rst; + hwSPI = false; +} + + +// Constructor when using hardware SPI. Faster, but must use SPI pins +// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.) +Adafruit_ST7735::Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t rst) : +Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) +{ + _cs = cs; + _rs = rs; + _rst = rst; + hwSPI = true; + _sid = _sclk = 0; +} + + +inline void Adafruit_ST7735::spiwrite(uint8_t c) { + + //Serial.println(c, HEX); + + if (hwSPI) { + SPI.transfer(c); + } else { + // Fast SPI bitbang swiped from LPD8806 library + for(uint8_t bit = 0x80; bit; bit >>= 1) { + if(c & bit) *dataport |= datapinmask; + else *dataport &= ~datapinmask; + *clkport |= clkpinmask; + *clkport &= ~clkpinmask; + } + } +} + + +void Adafruit_ST7735::writecommand(uint8_t c) { +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport &= ~rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, LOW); + digitalWrite(_cs, LOW); + + //Serial.print("C "); + spiwrite(c); + + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + +void Adafruit_ST7735::writedata(uint8_t c) { +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + + //Serial.print("D "); + spiwrite(c); + + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + +// Rather than a bazillion writecommand() and writedata() calls, screen +// initialization commands and arguments are organized in these tables +// stored in PROGMEM. The table may look bulky, but that's mostly the +// formatting -- storage-wise this is hundreds of bytes more compact +// than the equivalent code. Companion function follows. +#define DELAY 0x80 +PROGMEM const static unsigned char + Bcmd[] = { // Initialization commands for 7735B screens + 18, // 18 commands in list: + ST7735_SWRESET, DELAY, // 1: Software reset, no args, w/delay + 50, // 50 ms delay + ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, no args, w/delay + 255, // 255 = 500 ms delay + ST7735_COLMOD , 1+DELAY, // 3: Set color mode, 1 arg + delay: + 0x05, // 16-bit color + 10, // 10 ms delay + ST7735_FRMCTR1, 3+DELAY, // 4: Frame rate control, 3 args + delay: + 0x00, // fastest refresh + 0x06, // 6 lines front porch + 0x03, // 3 lines back porch + 10, // 10 ms delay + ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg: + 0x08, // Row addr/col addr, bottom to top refresh + ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay: + 0x15, // 1 clk cycle nonoverlap, 2 cycle gate + // rise, 3 cycle osc equalize + 0x02, // Fix on VTL + ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg: + 0x0, // Line inversion + ST7735_PWCTR1 , 2+DELAY, // 8: Power control, 2 args + delay: + 0x02, // GVDD = 4.7V + 0x70, // 1.0uA + 10, // 10 ms delay + ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay: + 0x05, // VGH = 14.7V, VGL = -7.35V + ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay: + 0x01, // Opamp current small + 0x02, // Boost frequency + ST7735_VMCTR1 , 2+DELAY, // 11: Power control, 2 args + delay: + 0x3C, // VCOMH = 4V + 0x38, // VCOML = -1.1V + 10, // 10 ms delay + ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay: + 0x11, 0x15, + ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay: + 0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what + 0x21, 0x1B, 0x13, 0x19, // these config values represent) + 0x17, 0x15, 0x1E, 0x2B, + 0x04, 0x05, 0x02, 0x0E, + ST7735_GMCTRN1,16+DELAY, // 14: Sparkles and rainbows, 16 args + delay: + 0x0B, 0x14, 0x08, 0x1E, // (ditto) + 0x22, 0x1D, 0x18, 0x1E, + 0x1B, 0x1A, 0x24, 0x2B, + 0x06, 0x06, 0x02, 0x0F, + 10, // 10 ms delay + ST7735_CASET , 4 , // 15: Column addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 2 + 0x00, 0x81, // XEND = 129 + ST7735_RASET , 4 , // 16: Row addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 1 + 0x00, 0x81, // XEND = 160 + ST7735_NORON , DELAY, // 17: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON , DELAY, // 18: Main screen turn on, no args, w/delay + 255 }, // 255 = 500 ms delay + + Rcmd1[] = { // Init for 7735R, part 1 (red or green tab) + 15, // 15 commands in list: + ST7735_SWRESET, DELAY, // 1: Software reset, 0 args, w/delay + 150, // 150 ms delay + ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, 0 args, w/delay + 255, // 500 ms delay + ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay: + 0x07, // No inversion + ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD + ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, Opamp current small & Medium low + 0x2A, + ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay: + 0x0E, + ST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay + ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg: + 0xC8, // row addr/col addr, bottom to top refresh + ST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay: + 0x05 }, // 16-bit color + + Rcmd2green[] = { // Init for 7735R, part 2 (green tab only) + 2, // 2 commands in list: + ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x02, // XSTART = 0 + 0x00, 0x7F+0x02, // XEND = 127 + ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x01, // XSTART = 0 + 0x00, 0x9F+0x01 }, // XEND = 159 + Rcmd2red[] = { // Init for 7735R, part 2 (red tab only) + 2, // 2 commands in list: + ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x7F, // XEND = 127 + ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: + 0x00, 0x00, // XSTART = 0 + 0x00, 0x9F }, // XEND = 159 + + Rcmd3[] = { // Init for 7735R, part 3 (red or green tab) + 4, // 4 commands in list: + ST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay: + 0x02, 0x1c, 0x07, 0x12, + 0x37, 0x32, 0x29, 0x2d, + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + ST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay: + 0x03, 0x1d, 0x07, 0x06, + 0x2E, 0x2C, 0x29, 0x2D, + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + ST7735_NORON , DELAY, // 3: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON , DELAY, // 4: Main screen turn on, no args w/delay + 100 }, // 100 ms delay + Gcmd[] = { // Initialization commands for 7735B screens + 19, // 18 commands in list: + ST7735_SWRESET, DELAY, // 1: Software reset, no args, w/delay + 50, // 50 ms delay + ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, no args, w/delay + 100, // 255 = 500 ms delay + 0x26 , 1, // 3: Set default gamma + 0x04, // 16-bit color + 0xb1, 2, // 4: Frame Rate + 0x0b, + 0x14, + 0xc0, 2, // 5: VRH1[4:0] & VC[2:0] + 0x08, + 0x00, + 0xc1, 1, // 6: BT[2:0] + 0x05, + 0xc5, 2, // 7: VMH[6:0] & VML[6:0] + 0x41, + 0x30, + 0xc7, 1, // 8: LCD Driving control + 0xc1, + 0xEC, 1, // 9: Set pumping color freq + 0x1b, + 0x3a , 1 + DELAY, // 10: Set color format + 0x55, // 16-bit color + 100, + 0x2a, 4, // 11: Set Column Address + 0x00, + 0x00, + 0x00, + 0x7f, + 0x2b, 4, // 12: Set Page Address + 0x00, + 0x00, + 0x00, + 0x9f, + 0x36, 1, // 12+1: Set Scanning Direction + 0xc8, + 0xb7, 1, // 14: Set Source Output Direciton + 0x00, + 0xf2, 1, // 15: Enable Gamma bit + 0x00, + 0xe0, 15 + DELAY, // 16: magic + 0x28, 0x24, 0x22, 0x31, + 0x2b, 0x0e, 0x53, 0xa5, + 0x42, 0x16, 0x18, 0x12, + 0x1a, 0x14, 0x03, + 50, + 0xe1, 15 + DELAY, // 17: more magic + 0x17, 0x1b, 0x1d, 0x0e, + 0x14, 0x11, 0x2c, 0xa5, + 0x3d, 0x09, 0x27, 0x2d, + 0x25, 0x2b, 0x3c, + 50, + ST7735_NORON , DELAY, // 17: Normal display on, no args, w/delay + 10, // 10 ms delay + ST7735_DISPON , DELAY, // 18: Main screen turn on, no args, w/delay + 255 }; // 255 = 500 ms delay + + + +// Companion code to the above tables. Reads and issues +// a series of LCD commands stored in PROGMEM byte array. +void Adafruit_ST7735::commandList(const uint8_t *addr) { + + uint8_t numCommands, numArgs; + uint16_t ms; + + numCommands = pgm_read_byte(addr++); // Number of commands to follow + while(numCommands--) { // For each command... + writecommand(pgm_read_byte(addr++)); // Read, issue command + numArgs = pgm_read_byte(addr++); // Number of args to follow + ms = numArgs & DELAY; // If hibit set, delay follows args + numArgs &= ~DELAY; // Mask out delay bit + while(numArgs--) { // For each argument... + writedata(pgm_read_byte(addr++)); // Read, issue argument + } + + if(ms) { + ms = pgm_read_byte(addr++); // Read post-command delay time (ms) + if(ms == 255) ms = 500; // If 255, delay for 500 ms + delay(ms); + } + } +} + + +// Initialization code common to both 'B' and 'R' type displays +void Adafruit_ST7735::commonInit(const uint8_t *cmdList) { + + colstart = rowstart = 0; // May be overridden in init func + + pinMode(_rs, OUTPUT); + pinMode(_cs, OUTPUT); + /*csport = portOutputRegister(digitalPinToPort(_cs)); + cspinmask = digitalPinToBitMask(_cs); + rsport = portOutputRegister(digitalPinToPort(_rs)); + rspinmask = digitalPinToBitMask(_rs);*/ + digitalWrite(_rs, HIGH); + digitalWrite(_cs, HIGH); + + if(hwSPI) { // Using hardware SPI + SPI.begin(); +#ifdef SPI_HAS_TRANSACTION + spisettings = SPISettings(4000000L, MSBFIRST, SPI_MODE0); +#else +#if defined(ARDUINO_ARCH_SAM) + SPI.setClockDivider(24); // 4 MHz (half speed) +#else + SPI.setClockDivider(SPI_CLOCK_DIV4); // 4 MHz (half speed) +#endif + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +#endif // SPI_HAS_TRANSACTION + } else { + /*pinMode(_sclk, OUTPUT); + pinMode(_sid , OUTPUT); + clkport = portOutputRegister(digitalPinToPort(_sclk)); + clkpinmask = digitalPinToBitMask(_sclk); + dataport = portOutputRegister(digitalPinToPort(_sid)); + datapinmask = digitalPinToBitMask(_sid); + *clkport &= ~clkpinmask; + *dataport &= ~datapinmask;*/ + } + + // toggle RST low to reset; CS low so it'll listen to us + //*csport &= ~cspinmask; + digitalWrite(_cs, LOW); + if (_rst) { + pinMode(_rst, OUTPUT); + digitalWrite(_rst, HIGH); + delay(500); + digitalWrite(_rst, LOW); + delay(500); + digitalWrite(_rst, HIGH); + delay(500); + } + + if(cmdList) commandList(cmdList); +} + + +// Initialization for ST7735B screens +void Adafruit_ST7735::initB(void) { + commonInit(Bcmd); +} + + +// Initialization for ST7735B screens +void Adafruit_ST7735::initG(void) { + commonInit(Gcmd); +} + + +// Initialization for ST7735R screens (green or red tabs) +void Adafruit_ST7735::initR(uint8_t options) { + commonInit(Rcmd1); + if(options == INITR_GREENTAB) { + commandList(Rcmd2green); + colstart = 2; + rowstart = 1; + } else { + // colstart, rowstart left at default '0' values + commandList(Rcmd2red); + } + commandList(Rcmd3); + tabcolor = options; +} + + +void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, + uint8_t y1) { + + writecommand(ST7735_CASET); // Column addr set + writedata(0x00); + writedata(x0+colstart); // XSTART + writedata(0x00); + writedata(x1+colstart); // XEND + + writecommand(ST7735_RASET); // Row addr set + writedata(0x00); + writedata(y0+rowstart); // YSTART + writedata(0x00); + writedata(y1+rowstart); // YEND + + writecommand(ST7735_RAMWR); // write to RAM +} + + +void Adafruit_ST7735::pushColor(uint16_t color) { +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + + if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); + spiwrite(color >> 8); + spiwrite(color); + + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + +void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) { + + if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; + + setAddrWindow(x,y,x+1,y+1); + +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + + if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); + + spiwrite(color >> 8); + spiwrite(color); + + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + +void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + + // Rudimentary clipping + if((x >= _width) || (y >= _height)) return; + if((y+h-1) >= _height) h = _height-y; + setAddrWindow(x, y, x, y+h-1); + + if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); + + uint8_t hi = color >> 8, lo = color; +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + while (h--) { + spiwrite(hi); + spiwrite(lo); + } + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + +void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + + // Rudimentary clipping + if((x >= _width) || (y >= _height)) return; + if((x+w-1) >= _width) w = _width-x; + setAddrWindow(x, y, x+w-1, y); + + if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); + + uint8_t hi = color >> 8, lo = color; +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + while (w--) { + spiwrite(hi); + spiwrite(lo); + } + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + + +void Adafruit_ST7735::fillScreen(uint16_t color) { + fillRect(0, 0, _width, _height, color); +} + + + +// fill a rectangle +void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + + // rudimentary clipping (drawChar w/big text requires this) + if((x >= _width) || (y >= _height)) return; + if((x + w - 1) >= _width) w = _width - x; + if((y + h - 1) >= _height) h = _height - y; + + if (tabcolor == INITR_BLACKTAB) color = swapcolor(color); + + setAddrWindow(x, y, x+w-1, y+h-1); + + uint8_t hi = color >> 8, lo = color; +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.beginTransaction(spisettings); +#endif + //*rsport |= rspinmask; + //*csport &= ~cspinmask; + digitalWrite(_rs, HIGH); + digitalWrite(_cs, LOW); + for(y=h; y>0; y--) { + for(x=w; x>0; x--) { + spiwrite(hi); + spiwrite(lo); + } + } + + //*csport |= cspinmask; + digitalWrite(_cs, HIGH); +#ifdef SPI_HAS_TRANSACTION + if (hwSPI) SPI.endTransaction(); +#endif +} + + +#define MADCTL_MY 0x80 +#define MADCTL_MX 0x40 +#define MADCTL_MV 0x20 +#define MADCTL_ML 0x10 +#define MADCTL_RGB 0x08 +#define MADCTL_MH 0x04 + +void Adafruit_ST7735::setRotation(uint8_t m) { + + writecommand(ST7735_MADCTL); + rotation = m % 4; // can't be higher than 3 + switch (rotation) { + case 0: + writedata(MADCTL_MX | MADCTL_MY | MADCTL_RGB); + _width = ST7735_TFTWIDTH; + _height = ST7735_TFTHEIGHT; + break; + case 1: + writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB); + _width = ST7735_TFTHEIGHT; + _height = ST7735_TFTWIDTH; + break; + case 2: + writedata(MADCTL_RGB); + _width = ST7735_TFTWIDTH; + _height = ST7735_TFTHEIGHT; + break; + case 3: + writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB); + _width = ST7735_TFTHEIGHT; + _height = ST7735_TFTWIDTH; + break; + } +} + + +void Adafruit_ST7735::invertDisplay(boolean i) { + writecommand(i ? ST7735_INVON : ST7735_INVOFF); +} + + +////////// stuff not actively being used, but kept for posterity +/* + + uint8_t Adafruit_ST7735::spiread(void) { + uint8_t r = 0; + if (_sid > 0) { + r = shiftIn(_sid, _sclk, MSBFIRST); + } else { + //SID_DDR &= ~_BV(SID); + //int8_t i; + //for (i=7; i>=0; i--) { + // SCLK_PORT &= ~_BV(SCLK); + // r <<= 1; + // r |= (SID_PIN >> SID) & 0x1; + // SCLK_PORT |= _BV(SCLK); + //} + //SID_DDR |= _BV(SID); + + } + return r; + } + + + void Adafruit_ST7735::dummyclock(void) { + + if (_sid > 0) { + digitalWrite(_sclk, LOW); + digitalWrite(_sclk, HIGH); + } else { + // SCLK_PORT &= ~_BV(SCLK); + //SCLK_PORT |= _BV(SCLK); + } + } + uint8_t Adafruit_ST7735::readdata(void) { + *portOutputRegister(rsport) |= rspin; + + *portOutputRegister(csport) &= ~ cspin; + + uint8_t r = spiread(); + + *portOutputRegister(csport) |= cspin; + + return r; + + } + + uint8_t Adafruit_ST7735::readcommand8(uint8_t c) { + digitalWrite(_rs, LOW); + + *portOutputRegister(csport) &= ~ cspin; + + spiwrite(c); + + digitalWrite(_rs, HIGH); + pinMode(_sid, INPUT); // input! + digitalWrite(_sid, LOW); // low + spiread(); + uint8_t r = spiread(); + + + *portOutputRegister(csport) |= cspin; + + + pinMode(_sid, OUTPUT); // back to output + return r; + } + + + uint16_t Adafruit_ST7735::readcommand16(uint8_t c) { + digitalWrite(_rs, LOW); + if (_cs) + digitalWrite(_cs, LOW); + + spiwrite(c); + pinMode(_sid, INPUT); // input! + uint16_t r = spiread(); + r <<= 8; + r |= spiread(); + if (_cs) + digitalWrite(_cs, HIGH); + + pinMode(_sid, OUTPUT); // back to output + return r; + } + + uint32_t Adafruit_ST7735::readcommand32(uint8_t c) { + digitalWrite(_rs, LOW); + if (_cs) + digitalWrite(_cs, LOW); + spiwrite(c); + pinMode(_sid, INPUT); // input! + + dummyclock(); + dummyclock(); + + uint32_t r = spiread(); + r <<= 8; + r |= spiread(); + r <<= 8; + r |= spiread(); + r <<= 8; + r |= spiread(); + if (_cs) + digitalWrite(_cs, HIGH); + + pinMode(_sid, OUTPUT); // back to output + return r; + } + + */ diff --git a/libraries/TFT/src/utility/Adafruit_ST7735.h b/libraries/TFT/src/utility/Adafruit_ST7735.h new file mode 100644 index 0000000..faf4bc1 --- /dev/null +++ b/libraries/TFT/src/utility/Adafruit_ST7735.h @@ -0,0 +1,155 @@ +/*************************************************** + This is a library for the Adafruit 1.8" SPI display. + This library works with the Adafruit 1.8" TFT Breakout w/SD card + ----> http://www.adafruit.com/products/358 + as well as Adafruit raw 1.8" TFT display + ----> http://www.adafruit.com/products/618 + + Check out the links above for our tutorials and wiring diagrams + These displays use SPI to communicate, 4 or 5 pins are required to + interface (RST is optional) + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ + +#ifndef _ADAFRUIT_ST7735H_ +#define _ADAFRUIT_ST7735H_ + +#if ARDUINO >= 100 + #include "Arduino.h" + #include "Print.h" +#else + #include "WProgram.h" +#endif +#include "Adafruit_GFX.h" +#include +#include + +// some flags for initR() :( +#define INITR_GREENTAB 0x0 +#define INITR_REDTAB 0x1 +#define INITR_BLACKTAB 0x2 + +#define ST7735_TFTWIDTH 128 +#define ST7735_TFTHEIGHT 160 + +#define ST7735_NOP 0x00 +#define ST7735_SWRESET 0x01 +#define ST7735_RDDID 0x04 +#define ST7735_RDDST 0x09 + +#define ST7735_SLPIN 0x10 +#define ST7735_SLPOUT 0x11 +#define ST7735_PTLON 0x12 +#define ST7735_NORON 0x13 + +#define ST7735_INVOFF 0x20 +#define ST7735_INVON 0x21 +#define ST7735_DISPOFF 0x28 +#define ST7735_DISPON 0x29 +#define ST7735_CASET 0x2A +#define ST7735_RASET 0x2B +#define ST7735_RAMWR 0x2C +#define ST7735_RAMRD 0x2E + +#define ST7735_PTLAR 0x30 +#define ST7735_COLMOD 0x3A +#define ST7735_MADCTL 0x36 + +#define ST7735_FRMCTR1 0xB1 +#define ST7735_FRMCTR2 0xB2 +#define ST7735_FRMCTR3 0xB3 +#define ST7735_INVCTR 0xB4 +#define ST7735_DISSET5 0xB6 + +#define ST7735_PWCTR1 0xC0 +#define ST7735_PWCTR2 0xC1 +#define ST7735_PWCTR3 0xC2 +#define ST7735_PWCTR4 0xC3 +#define ST7735_PWCTR5 0xC4 +#define ST7735_VMCTR1 0xC5 + +#define ST7735_RDID1 0xDA +#define ST7735_RDID2 0xDB +#define ST7735_RDID3 0xDC +#define ST7735_RDID4 0xDD + +#define ST7735_PWCTR6 0xFC + +#define ST7735_GMCTRP1 0xE0 +#define ST7735_GMCTRN1 0xE1 + +// Color definitions +#define ST7735_BLACK 0x0000 +#define ST7735_BLUE 0x001F +#define ST7735_RED 0xF800 +#define ST7735_GREEN 0x07E0 +#define ST7735_CYAN 0x07FF +#define ST7735_MAGENTA 0xF81F +#define ST7735_YELLOW 0xFFE0 +#define ST7735_WHITE 0xFFFF + + +class Adafruit_ST7735 : public Adafruit_GFX { + + public: + + Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t sid, uint8_t sclk, + uint8_t rst); + Adafruit_ST7735(uint8_t cs, uint8_t rs, uint8_t rst); + + void initB(void), // for ST7735B displays + initG(void), // for ILI9163C displays + initR(uint8_t options = INITR_GREENTAB), // for ST7735R + setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1), + pushColor(uint16_t color), + fillScreen(uint16_t color), + drawPixel(int16_t x, int16_t y, uint16_t color), + drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color), + drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color), + fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color), + setRotation(uint8_t r), + invertDisplay(boolean i); + uint16_t Color565(uint8_t r, uint8_t g, uint8_t b) { return newColor(r, g, b);} + + /* These are not for current use, 8-bit protocol only! + uint8_t readdata(void), + readcommand8(uint8_t); + uint16_t readcommand16(uint8_t); + uint32_t readcommand32(uint8_t); + void dummyclock(void); + */ + + private: + uint8_t tabcolor; + + void spiwrite(uint8_t), + writecommand(uint8_t c), + writedata(uint8_t d), + commandList(const uint8_t *addr), + commonInit(const uint8_t *cmdList); +//uint8_t spiread(void); + + boolean hwSPI; +#ifdef SPI_HAS_TRANSACTION + SPISettings spisettings; +#endif +#if defined(ARDUINO_ARCH_SAM) + volatile uint32_t *dataport, *clkport, *csport, *rsport; + uint32_t _cs, _rs, _rst, _sid, _sclk, + datapinmask, clkpinmask, cspinmask, rspinmask, + colstart, rowstart; // some displays need this changed + #else + volatile uint8_t *dataport, *clkport;//, *csport, *rsport; + uint8_t _cs, _rs, _rst, _sid, _sclk, + datapinmask, clkpinmask, cspinmask, rspinmask, + colstart, rowstart; // some displays need this changed + #endif +}; + +#endif diff --git a/libraries/TFT/src/utility/PImage.h b/libraries/TFT/src/utility/PImage.h new file mode 100644 index 0000000..ed99db0 --- /dev/null +++ b/libraries/TFT/src/utility/PImage.h @@ -0,0 +1,65 @@ + + +#ifndef _PIMAGE_H +#define _PIMAGE_H + +class Adafruit_GFX; + +#if defined(__SD_H__) // Arduino SD library + + +/// This class mimics Processing's PImage, but with fewer +/// capabilities. It allows an image stored in the SD card to be +/// drawn to the display. +/// @author Enrico Gueli +class PImage { +public: + PImage() : + _valid(false), + _bmpWidth(0), + _bmpHeight(0) { } + + void draw(Adafruit_GFX & glcd, int16_t x, int16_t y); + + static PImage loadImage(const char * fileName); + + void close() { _bmpFile.close(); } + + bool isValid() { return _valid; } + + int width() { return _bmpWidth; } + int height() { return _bmpHeight; } + +private: + friend class Adafruit_GFX; + + File _bmpFile; + int _bmpWidth, _bmpHeight; // W+H in pixels + uint8_t _bmpDepth; // Bit depth (currently must be 24) + uint32_t _bmpImageoffset; // Start of image data in file + uint32_t _rowSize; // Not always = bmpWidth; may have padding + bool _flip; + + bool _valid; + + PImage(File & bmpFile, int bmpWidth, int bmpHeight, uint8_t bmpDepth, uint32_t bmpImageoffset, uint32_t rowSize, bool flip) : + _bmpFile(bmpFile), + _bmpWidth(bmpWidth), + _bmpHeight(bmpHeight), + _bmpDepth(bmpDepth), + _bmpImageoffset(bmpImageoffset), + _rowSize(rowSize), + _flip(flip), + _valid(true) // since Adafruit_GFX is friend, we could just let it write the variables and save some CPU cycles + { } + + static uint16_t read16(File f); + static uint32_t read32(File f); + + // TODO close the file in ~PImage and PImage(const PImage&) + +}; + +#endif + +#endif // _PIMAGE_H diff --git a/libraries/TFT/src/utility/glcdfont.c b/libraries/TFT/src/utility/glcdfont.c new file mode 100644 index 0000000..e811ce0 --- /dev/null +++ b/libraries/TFT/src/utility/glcdfont.c @@ -0,0 +1,268 @@ +/*#ifndef ARDUINO_ARCH_SAM +#include +#endif*/ +#include + +#ifndef FONT5X7_H +#define FONT5X7_H + +// standard ascii 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, + 0x00, 0x18, 0x3C, 0x18, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, + 0x00, 0x18, 0x24, 0x18, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, + 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, + 0x40, 0x7F, 0x05, 0x05, 0x07, + 0x40, 0x7F, 0x05, 0x25, 0x3F, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, + 0x14, 0x22, 0x7F, 0x22, 0x14, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, + 0x06, 0x09, 0x7F, 0x01, 0x7F, + 0x00, 0x66, 0x89, 0x95, 0x6A, + 0x60, 0x60, 0x60, 0x60, 0x60, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, + 0x10, 0x20, 0x7E, 0x20, 0x10, + 0x08, 0x08, 0x2A, 0x1C, 0x08, + 0x08, 0x1C, 0x2A, 0x08, 0x08, + 0x1E, 0x10, 0x10, 0x10, 0x10, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, + 0x30, 0x38, 0x3E, 0x38, 0x30, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, + 0x23, 0x13, 0x08, 0x64, 0x62, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x08, 0x07, 0x03, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, + 0x08, 0x08, 0x3E, 0x08, 0x08, + 0x00, 0x80, 0x70, 0x30, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x60, 0x60, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, + 0x00, 0x42, 0x7F, 0x40, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, + 0x21, 0x41, 0x49, 0x4D, 0x33, + 0x18, 0x14, 0x12, 0x7F, 0x10, + 0x27, 0x45, 0x45, 0x45, 0x39, + 0x3C, 0x4A, 0x49, 0x49, 0x31, + 0x41, 0x21, 0x11, 0x09, 0x07, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x46, 0x49, 0x49, 0x29, 0x1E, + 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, + 0x7C, 0x12, 0x11, 0x12, 0x7C, + 0x7F, 0x49, 0x49, 0x49, 0x36, + 0x3E, 0x41, 0x41, 0x41, 0x22, + 0x7F, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x49, 0x49, 0x49, 0x41, + 0x7F, 0x09, 0x09, 0x09, 0x01, + 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, + 0x00, 0x41, 0x7F, 0x41, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, + 0x7F, 0x08, 0x14, 0x22, 0x41, + 0x7F, 0x40, 0x40, 0x40, 0x40, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, + 0x7F, 0x04, 0x08, 0x10, 0x7F, + 0x3E, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x09, 0x09, 0x09, 0x06, + 0x3E, 0x41, 0x51, 0x21, 0x5E, + 0x7F, 0x09, 0x19, 0x29, 0x46, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, + 0x3F, 0x40, 0x40, 0x40, 0x3F, + 0x1F, 0x20, 0x40, 0x20, 0x1F, + 0x3F, 0x40, 0x38, 0x40, 0x3F, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x03, 0x04, 0x78, 0x04, 0x03, + 0x61, 0x59, 0x49, 0x4D, 0x43, + 0x00, 0x7F, 0x41, 0x41, 0x41, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x41, 0x7F, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, + 0x7F, 0x28, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x28, 0x7F, + 0x38, 0x54, 0x54, 0x54, 0x18, + 0x00, 0x08, 0x7E, 0x09, 0x02, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, + 0x7F, 0x08, 0x04, 0x04, 0x78, + 0x00, 0x44, 0x7D, 0x40, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, + 0x7C, 0x08, 0x04, 0x04, 0x78, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xFC, 0x18, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x18, 0xFC, + 0x7C, 0x08, 0x04, 0x04, 0x08, + 0x48, 0x54, 0x54, 0x54, 0x24, + 0x04, 0x04, 0x3F, 0x44, 0x24, + 0x3C, 0x40, 0x40, 0x20, 0x7C, + 0x1C, 0x20, 0x40, 0x20, 0x1C, + 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, + 0x4C, 0x90, 0x90, 0x90, 0x7C, + 0x44, 0x64, 0x54, 0x4C, 0x44, + 0x00, 0x08, 0x36, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, + 0x3C, 0x26, 0x23, 0x26, 0x3C, + 0x1E, 0xA1, 0xA1, 0x61, 0x12, + 0x3A, 0x40, 0x40, 0x20, 0x7A, + 0x38, 0x54, 0x54, 0x55, 0x59, + 0x21, 0x55, 0x55, 0x79, 0x41, + 0x21, 0x54, 0x54, 0x78, 0x41, + 0x21, 0x55, 0x54, 0x78, 0x40, + 0x20, 0x54, 0x55, 0x79, 0x40, + 0x0C, 0x1E, 0x52, 0x72, 0x12, + 0x39, 0x55, 0x55, 0x55, 0x59, + 0x39, 0x54, 0x54, 0x54, 0x59, + 0x39, 0x55, 0x54, 0x54, 0x58, + 0x00, 0x00, 0x45, 0x7C, 0x41, + 0x00, 0x02, 0x45, 0x7D, 0x42, + 0x00, 0x01, 0x45, 0x7C, 0x40, + 0xF0, 0x29, 0x24, 0x29, 0xF0, + 0xF0, 0x28, 0x25, 0x28, 0xF0, + 0x7C, 0x54, 0x55, 0x45, 0x00, + 0x20, 0x54, 0x54, 0x7C, 0x54, + 0x7C, 0x0A, 0x09, 0x7F, 0x49, + 0x32, 0x49, 0x49, 0x49, 0x32, + 0x32, 0x48, 0x48, 0x48, 0x32, + 0x32, 0x4A, 0x48, 0x48, 0x30, + 0x3A, 0x41, 0x41, 0x21, 0x7A, + 0x3A, 0x42, 0x40, 0x20, 0x78, + 0x00, 0x9D, 0xA0, 0xA0, 0x7D, + 0x39, 0x44, 0x44, 0x44, 0x39, + 0x3D, 0x40, 0x40, 0x40, 0x3D, + 0x3C, 0x24, 0xFF, 0x24, 0x24, + 0x48, 0x7E, 0x49, 0x43, 0x66, + 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, + 0xFF, 0x09, 0x29, 0xF6, 0x20, + 0xC0, 0x88, 0x7E, 0x09, 0x03, + 0x20, 0x54, 0x54, 0x79, 0x41, + 0x00, 0x00, 0x44, 0x7D, 0x41, + 0x30, 0x48, 0x48, 0x4A, 0x32, + 0x38, 0x40, 0x40, 0x22, 0x7A, + 0x00, 0x7A, 0x0A, 0x0A, 0x72, + 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, + 0x26, 0x29, 0x29, 0x29, 0x26, + 0x30, 0x48, 0x4D, 0x40, 0x20, + 0x38, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x38, + 0x2F, 0x10, 0xC8, 0xAC, 0xBA, + 0x2F, 0x10, 0x28, 0x34, 0xFA, + 0x00, 0x00, 0x7B, 0x00, 0x00, + 0x08, 0x14, 0x2A, 0x14, 0x22, + 0x22, 0x14, 0x2A, 0x14, 0x08, + 0xAA, 0x00, 0x55, 0x00, 0xAA, + 0xAA, 0x55, 0xAA, 0x55, 0xAA, + 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x10, 0x10, 0x10, 0xFF, 0x00, + 0x14, 0x14, 0x14, 0xFF, 0x00, + 0x10, 0x10, 0xFF, 0x00, 0xFF, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x14, 0x14, 0x14, 0xFC, 0x00, + 0x14, 0x14, 0xF7, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x14, 0x14, 0xF4, 0x04, 0xFC, + 0x14, 0x14, 0x17, 0x10, 0x1F, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0xF0, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x14, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0x10, 0x17, + 0x00, 0x00, 0xFC, 0x04, 0xF4, + 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, + 0x00, 0x00, 0xFF, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xF7, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x17, 0x14, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0xF4, 0x14, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x00, 0x00, 0x1F, 0x10, 0x1F, + 0x00, 0x00, 0x00, 0x1F, 0x14, + 0x00, 0x00, 0x00, 0xFC, 0x14, + 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, + 0x10, 0x10, 0x10, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x10, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x38, 0x44, 0x44, 0x38, 0x44, + 0x7C, 0x2A, 0x2A, 0x3E, 0x14, + 0x7E, 0x02, 0x02, 0x06, 0x06, + 0x02, 0x7E, 0x02, 0x7E, 0x02, + 0x63, 0x55, 0x49, 0x41, 0x63, + 0x38, 0x44, 0x44, 0x3C, 0x04, + 0x40, 0x7E, 0x20, 0x1E, 0x20, + 0x06, 0x02, 0x7E, 0x02, 0x02, + 0x99, 0xA5, 0xE7, 0xA5, 0x99, + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, + 0x4C, 0x72, 0x01, 0x72, 0x4C, + 0x30, 0x4A, 0x4D, 0x4D, 0x30, + 0x30, 0x48, 0x78, 0x48, 0x30, + 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, + 0x7E, 0x01, 0x01, 0x01, 0x7E, + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, + 0x44, 0x44, 0x5F, 0x44, 0x44, + 0x40, 0x51, 0x4A, 0x44, 0x40, + 0x40, 0x44, 0x4A, 0x51, 0x40, + 0x00, 0x00, 0xFF, 0x01, 0x03, + 0xE0, 0x80, 0xFF, 0x00, 0x00, + 0x08, 0x08, 0x6B, 0x6B, 0x08, + 0x36, 0x12, 0x36, 0x24, 0x36, + 0x06, 0x0F, 0x09, 0x0F, 0x06, + 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, + 0x30, 0x40, 0xFF, 0x01, 0x01, + 0x00, 0x1F, 0x01, 0x01, 0x1E, + 0x00, 0x19, 0x1D, 0x17, 0x12, + 0x00, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; +#endif diff --git a/libraries/TFT/src/utility/keywords.txt b/libraries/TFT/src/utility/keywords.txt new file mode 100644 index 0000000..9614847 --- /dev/null +++ b/libraries/TFT/src/utility/keywords.txt @@ -0,0 +1,70 @@ +####################################### +# Syntax Coloring Map For Adafruit_GFX +# and Adafruit_ST7735 +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Adafruit_GFX KEYWORD1 +Adafruit_ST7735 KEYWORD1 +PImage KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +drawPixel KEYWORD2 +invertDisplay KEYWORD2 +drawLine KEYWORD2 +drawFastVLine KEYWORD2 +drawFastHLine KEYWORD2 +drawRect KEYWORD2 +fillRect KEYWORD2 +fillScreen KEYWORD2 +drawCircle KEYWORD2 +drawCircleHelper KEYWORD2 +fillCircle KEYWORD2 +fillCircleHelper KEYWORD2 +drawTriangle KEYWORD2 +fillTriangle KEYWORD2 +drawRoundRect KEYWORD2 +fillRoundRect KEYWORD2 +drawBitmap KEYWORD2 +drawChar KEYWORD2 +setCursor KEYWORD2 +setTextColor KEYWORD2 +setTextSize KEYWORD2 +setTextWrap KEYWORD2 +height KEYWORD2 +width KEYWORD2 +setRotation KEYWORD2 +getRotation KEYWORD2 + + + +newColor KEYWORD2 +background KEYWORD2 +fill KEYWORD2 +noFill KEYWORD2 +stroke KEYWORD2 +noStroke KEYWORD2 +text KEYWORD2 +textWrap KEYWORD2 +textSize KEYWORD2 +circle KEYWORD2 +point KEYWORD2 +quad KEYWORD2 +rect KEYWORD2 +triangle KEYWORD2 +loadImage KEYWORD2 +image KEYWORD2 + +draw KEYWORD2 +isValid KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp new file mode 100644 index 0000000..066e9b8 --- /dev/null +++ b/libraries/Wire/Wire.cpp @@ -0,0 +1,381 @@ +/* + TwoWire.cpp - TWI/I2C library for Wiring & Arduino + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts +*/ + +extern "C" { + #include + #include + #include +} + +#include "Wire.h" + +// Initialize Class Variables ////////////////////////////////////////////////// +uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::rxBufferIndex = 0; +uint8_t TwoWire::rxBufferLength = 0; + +uint8_t TwoWire::txAddress = 0; +uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::txBufferIndex = 0; +uint8_t TwoWire::txBufferLength = 0; + +uint8_t TwoWire::transmitting = 0; +void (*TwoWire::user_onRequest)(void); +void (*TwoWire::user_onReceive)(int); + +// Constructors //////////////////////////////////////////////////////////////// + +TwoWire::TwoWire() +{ + _i2c.sda = digitalPinToPinName(SDA); + _i2c.scl = digitalPinToPinName(SCL); +} + +TwoWire::TwoWire(uint8_t sda, uint8_t scl) +{ + _i2c.sda = digitalPinToPinName(sda); + _i2c.scl = digitalPinToPinName(scl); +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void TwoWire::begin(void) +{ + begin(MASTER_ADDRESS); +} + +void TwoWire::begin(uint8_t address) +{ + rxBufferIndex = 0; + rxBufferLength = 0; + + txBufferIndex = 0; + txBufferLength = 0; + + transmitting = 0; + + ownAddress = address << 1; + + if(address == MASTER_ADDRESS) + master = true; + else + master = false; + + i2c_custom_init(&_i2c,I2C_100KHz,I2C_ADDRESSINGMODE_7BIT,ownAddress,master); + + if(master == false){ + // i2c_attachSlaveTxEvent(&_i2c, reinterpret_cast(&TwoWire::onRequestService)); + // i2c_attachSlaveRxEvent(&_i2c, reinterpret_cast(&TwoWire::onReceiveService)); + + i2c_attachSlaveTxEvent(&_i2c, onRequestService); + i2c_attachSlaveRxEvent(&_i2c, onReceiveService); + } +} + +void TwoWire::begin(int address) +{ + begin((uint8_t)address); +} + +void TwoWire::end(void) +{ + i2c_deinit(&_i2c); +} + +void TwoWire::setClock(uint32_t frequency) +{ + i2c_setTiming(&_i2c, frequency); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop) +{ + if (master == true) { + if (isize > 0) { + // send internal address; this mode allows sending a repeated start to access + // some devices' internal registers. This function is executed by the hardware + // TWI module on other processors (for example Due's TWI_IADR and TWI_MMR registers) + + beginTransmission(address); + + // the maximum size of internal address is 3 bytes + if (isize > 3){ + isize = 3; + } + + // write internal register address - most significant byte first + while (isize-- > 0) + write((uint8_t)(iaddress >> (isize*8))); + endTransmission(false); + } + + // clamp to buffer length + if(quantity > BUFFER_LENGTH){ + quantity = BUFFER_LENGTH; + } + // perform blocking read into buffer + //uint8_t read = twi_readFrom(address, rxBuffer, quantity, sendStop); + uint8_t read = 0; + if(I2C_OK == i2c_master_read(&_i2c, address << 1, rxBuffer, quantity)) + read = quantity; + + // set rx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = read; + + return read; + } + + return 0; +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint32_t)0, (uint8_t)0, (uint8_t)sendStop); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) +{ + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity) +{ + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) +{ + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)sendStop); +} + +void TwoWire::beginTransmission(uint8_t address) +{ + // indicate that we are transmitting + transmitting = 1; + // set address of targeted slave + txAddress = address << 1; + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; +} + +void TwoWire::beginTransmission(int address) +{ + beginTransmission((uint8_t)address); +} + +// +// Originally, 'endTransmission' was an f(void) function. +// It has been modified to take one parameter indicating +// whether or not a STOP should be performed on the bus. +// Calling endTransmission(false) allows a sketch to +// perform a repeated start. +// +// WARNING: Nothing in the library keeps track of whether +// the bus tenure has been properly ended with a STOP. It +// is very possible to leave the bus in a hung state if +// no call to endTransmission(true) is made. Some I2C +// devices will behave oddly if they do not see a STOP. +// +uint8_t TwoWire::endTransmission(uint8_t sendStop) +{ + int8_t ret = 4; + + if (master == true) { + // transmit buffer (blocking) + switch(i2c_master_write(&_i2c, txAddress, txBuffer, txBufferLength)) + { + case I2C_OK : + ret = 0; + break; + case I2C_TIMEOUT : + ret = 1; + break; + default: + ret = 4; + break; + } + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + // indicate that we are done transmitting + transmitting = 0; + } + + return ret; +} + +// This provides backwards compatibility with the original +// definition, and expected behaviour, of endTransmission +// +uint8_t TwoWire::endTransmission(void) +{ + return endTransmission(true); +} + +// must be called in: +// slave tx event callback +// or after beginTransmission(address) +size_t TwoWire::write(uint8_t data) +{ + if(transmitting){ + // in master transmitter mode + // don't bother if buffer is full + if(txBufferLength >= BUFFER_LENGTH){ + setWriteError(); + return 0; + } + // put byte in tx buffer + txBuffer[txBufferIndex] = data; + ++txBufferIndex; + // update amount in buffer + txBufferLength = txBufferIndex; + }else{ + // in slave send mode + // reply to master + i2c_slave_write_IT(&_i2c,&data,1); + } + return 1; +} + +// must be called in: +// slave tx event callback +// or after beginTransmission(address) +size_t TwoWire::write(const uint8_t *data, size_t quantity) +{ + if(transmitting){ + // in master transmitter mode + for(size_t i = 0; i < quantity; ++i){ + write(data[i]); + } + }else{ + // in slave send mode + // reply to master + i2c_slave_write_IT(&_i2c,(uint8_t *)data,quantity); + } + return quantity; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::available(void) +{ + return rxBufferLength - rxBufferIndex; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::read(void) +{ + int value = -1; + + // get each successive byte on each call + if(rxBufferIndex < rxBufferLength){ + value = rxBuffer[rxBufferIndex]; + ++rxBufferIndex; + } + + return value; +} + +// must be called in: +// slave rx event callback +// or after requestFrom(address, numBytes) +int TwoWire::peek(void) +{ + int value = -1; + + if(rxBufferIndex < rxBufferLength){ + value = rxBuffer[rxBufferIndex]; + } + + return value; +} + +void TwoWire::flush(void) +{ + rxBufferIndex = 0; + rxBufferLength = 0; + txBufferIndex = 0; + txBufferLength = 0; +} + +// behind the scenes function that is called when data is received +void TwoWire::onReceiveService(uint8_t* inBytes, int numBytes) +{ + // don't bother if user hasn't registered a callback + if(!user_onReceive){ + return; + } + + // don't bother if rx buffer is in use by a master requestFrom() op + // i know this drops data, but it allows for slight stupidity + // meaning, they may not have read all the master requestFrom() data yet + if(rxBufferIndex < rxBufferLength){ + return; + } + // copy twi rx buffer into local read buffer + // this enables new reads to happen in parallel + for(uint8_t i = 0; i < numBytes; ++i){ + rxBuffer[i] = inBytes[i]; + } + // set rx iterator vars + rxBufferIndex = 0; + rxBufferLength = numBytes; + // alert user program + user_onReceive(numBytes); +} + +// behind the scenes function that is called when data is requested +void TwoWire::onRequestService(void) +{ + // don't bother if user hasn't registered a callback + if(!user_onRequest){ + return; + } + + // reset tx buffer iterator vars + // !!! this will kill any pending pre-master sendTo() activity + txBufferIndex = 0; + txBufferLength = 0; + // alert user program + user_onRequest(); +} + +// sets function called on slave write +void TwoWire::onReceive( void (*function)(int) ) +{ + user_onReceive = function; +} + +// sets function called on slave read +void TwoWire::onRequest( void (*function)(void) ) +{ + user_onRequest = function; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +TwoWire Wire = TwoWire(SDA, SCL); //D70-D71 +TwoWire Wire1 = TwoWire(SDA1, SCL1); //D20-D21 +TwoWire Wire2 = TwoWire(SDA2, SCL2); //D79-D80 diff --git a/cores/arduino/Wire.h b/libraries/Wire/Wire.h old mode 100755 new mode 100644 similarity index 66% rename from cores/arduino/Wire.h rename to libraries/Wire/Wire.h index 723f01e..bb874cd --- a/cores/arduino/Wire.h +++ b/libraries/Wire/Wire.h @@ -19,47 +19,50 @@ Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts */ -/* - * Arduino srl - www.arduino.org - * 2016 Jun 9: Edited Francesco Alessi (alfran) - francesco@arduino.org - */ - #ifndef TwoWire_h #define TwoWire_h -#include "stm32f4xx_hal.h" #include #include "Stream.h" +#include "variant.h" #define BUFFER_LENGTH 32 +#define MASTER_ADDRESS 0x33 + +// WIRE_HAS_END means Wire has end() +#define WIRE_HAS_END 1 + class TwoWire : public Stream { private: - uint8_t txAddress; - uint8_t txBuffer[BUFFER_LENGTH]; - uint8_t txBufferIndex; - uint8_t txBufferLength; - - uint8_t transmitting; - void (*user_onRequest)(void); - // I2C address - uint8_t defaultAddress; - - int i2c_master_start(); - int i2c_master_stop(); - int i2c_master_read(uint8_t address, char *data, uint8_t length, uint8_t stop); - int i2c_master_write(int address, const char *data, int length, int stop); - int i2c_master_byte_read(int *value, int last); - int i2c_master_byte_write(int data); - int i2c_slave_write(const char *data, int length); - void enableInterrupt(void); - void disableInterrupt(void); + static uint8_t rxBuffer[BUFFER_LENGTH]; + static uint8_t rxBufferIndex; + static uint8_t rxBufferLength; + + static uint8_t txAddress; + static uint8_t txBuffer[BUFFER_LENGTH]; + static uint8_t txBufferIndex; + static uint8_t txBufferLength; + + static uint8_t transmitting; + + uint8_t ownAddress; + bool master; + i2c_t _i2c; + + static void (*user_onRequest)(void); + static void (*user_onReceive)(int); + static void onRequestService(void); + static void onReceiveService(uint8_t*, int); + public: - TwoWire(I2C_TypeDef *twi); + TwoWire(); + TwoWire(uint8_t sda, uint8_t scl); void begin(); void begin(uint8_t); void begin(int); + void end(); void setClock(uint32_t); void beginTransmission(uint8_t); void beginTransmission(int); @@ -67,6 +70,7 @@ class TwoWire : public Stream uint8_t endTransmission(uint8_t); uint8_t requestFrom(uint8_t, uint8_t); uint8_t requestFrom(uint8_t, uint8_t, uint8_t); + uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t); uint8_t requestFrom(int, int); uint8_t requestFrom(int, int, int); virtual size_t write(uint8_t); @@ -83,14 +87,6 @@ class TwoWire : public Stream inline size_t write(unsigned int n) { return write((uint8_t)n); } inline size_t write(int n) { return write((uint8_t)n); } using Print::write; - - void handleInterrupt(uint8_t TransferDirection, uint16_t AddrMatchCode); - /* I2C handler declaration */ - I2C_HandleTypeDef I2cHandle; - uint8_t rxBuffer[BUFFER_LENGTH]; - volatile uint8_t rxBufferIndex; - volatile uint8_t rxBufferLength; - void (*user_onReceive)(int); }; extern TwoWire Wire; diff --git a/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde b/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde new file mode 100644 index 0000000..9c41c18 --- /dev/null +++ b/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde @@ -0,0 +1,87 @@ +// I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder +// by Nicholas Zambetti +// and James Tichenor + +// Demonstrates use of the Wire library reading data from the +// Devantech Utrasonic Rangers SFR08 and SFR10 + +// Created 29 April 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) + Serial.begin(9600); // start serial communication at 9600bps +} + +int reading = 0; + +void loop() +{ + // step 1: instruct sensor to read echoes + Wire.beginTransmission(112); // transmit to device #112 (0x70) + // the address specified in the datasheet is 224 (0xE0) + // but i2c adressing uses the high 7 bits so it's 112 + Wire.write(byte(0x00)); // sets register pointer to the command register (0x00) + Wire.write(byte(0x50)); // command sensor to measure in "inches" (0x50) + // use 0x51 for centimeters + // use 0x52 for ping microseconds + Wire.endTransmission(); // stop transmitting + + // step 2: wait for readings to happen + delay(70); // datasheet suggests at least 65 milliseconds + + // step 3: instruct sensor to return a particular echo reading + Wire.beginTransmission(112); // transmit to device #112 + Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02) + Wire.endTransmission(); // stop transmitting + + // step 4: request reading from sensor + Wire.requestFrom(112, 2); // request 2 bytes from slave device #112 + + // step 5: receive reading from sensor + if(2 <= Wire.available()) // if two bytes were received + { + reading = Wire.read(); // receive high byte (overwrites previous reading) + reading = reading << 8; // shift high byte to be high 8 bits + reading |= Wire.read(); // receive low byte as lower 8 bits + Serial.println(reading); // print the reading + } + + delay(250); // wait a bit since people have to read the output :) +} + + +/* + +// The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08) +// usage: changeAddress(0x70, 0xE6); + +void changeAddress(byte oldAddress, byte newAddress) +{ + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xA0)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xAA)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(byte(0xA5)); + Wire.endTransmission(); + + Wire.beginTransmission(oldAddress); + Wire.write(byte(0x00)); + Wire.write(newAddress); + Wire.endTransmission(); +} + +*/ diff --git a/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde b/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde new file mode 100644 index 0000000..38da1c5 --- /dev/null +++ b/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde @@ -0,0 +1,39 @@ +// I2C Digital Potentiometer +// by Nicholas Zambetti +// and Shawn Bonkowski + +// Demonstrates use of the Wire library +// Controls AD5171 digital potentiometer via I2C/TWI + +// Created 31 March 2006 + +// This example code is in the public domain. + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) +} + +byte val = 0; + +void loop() +{ + Wire.beginTransmission(44); // transmit to device #44 (0x2c) + // device address is specified in datasheet + Wire.write(byte(0x00)); // sends instruction byte + Wire.write(val); // sends potentiometer value byte + Wire.endTransmission(); // stop transmitting + + val++; // increment value + if(val == 64) // if reached 64th position (max) + { + val = 0; // start over from lowest value + } + delay(500); +} + diff --git a/libraries/Wire/examples/master_reader/master_reader.pde b/libraries/Wire/examples/master_reader/master_reader.pde new file mode 100644 index 0000000..4124d7d --- /dev/null +++ b/libraries/Wire/examples/master_reader/master_reader.pde @@ -0,0 +1,32 @@ +// Wire Master Reader +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Reads data from an I2C/TWI slave device +// Refer to the "Wire Slave Sender" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) + Serial.begin(9600); // start serial for output +} + +void loop() +{ + Wire.requestFrom(2, 6); // request 6 bytes from slave device #2 + + while(Wire.available()) // slave may send less than requested + { + char c = Wire.read(); // receive a byte as character + Serial.print(c); // print the character + } + + delay(500); +} diff --git a/libraries/Wire/examples/master_writer/master_writer.pde b/libraries/Wire/examples/master_writer/master_writer.pde new file mode 100644 index 0000000..ccaa036 --- /dev/null +++ b/libraries/Wire/examples/master_writer/master_writer.pde @@ -0,0 +1,31 @@ +// Wire Master Writer +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Writes data to an I2C/TWI slave device +// Refer to the "Wire Slave Receiver" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(); // join i2c bus (address optional for master) +} + +byte x = 0; + +void loop() +{ + Wire.beginTransmission(4); // transmit to device #4 + Wire.write("x is "); // sends five bytes + Wire.write(x); // sends one byte + Wire.endTransmission(); // stop transmitting + + x++; + delay(500); +} diff --git a/libraries/Wire/examples/slave_receiver/slave_receiver.pde b/libraries/Wire/examples/slave_receiver/slave_receiver.pde new file mode 100644 index 0000000..60dd4bd --- /dev/null +++ b/libraries/Wire/examples/slave_receiver/slave_receiver.pde @@ -0,0 +1,38 @@ +// Wire Slave Receiver +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Receives data as an I2C/TWI slave device +// Refer to the "Wire Master Writer" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(4); // join i2c bus with address #4 + Wire.onReceive(receiveEvent); // register event + Serial.begin(9600); // start serial for output +} + +void loop() +{ + delay(100); +} + +// function that executes whenever data is received from master +// this function is registered as an event, see setup() +void receiveEvent(int howMany) +{ + while(1 < Wire.available()) // loop through all but the last + { + char c = Wire.read(); // receive byte as a character + Serial.print(c); // print the character + } + int x = Wire.read(); // receive byte as an integer + Serial.println(x); // print the integer +} diff --git a/libraries/Wire/examples/slave_sender/slave_sender.pde b/libraries/Wire/examples/slave_sender/slave_sender.pde new file mode 100644 index 0000000..d3b238a --- /dev/null +++ b/libraries/Wire/examples/slave_sender/slave_sender.pde @@ -0,0 +1,32 @@ +// Wire Slave Sender +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Sends data as an I2C/TWI slave device +// Refer to the "Wire Master Reader" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + + +#include + +void setup() +{ + Wire.begin(2); // join i2c bus with address #2 + Wire.onRequest(requestEvent); // register event +} + +void loop() +{ + delay(100); +} + +// function that executes whenever data is requested by master +// this function is registered as an event, see setup() +void requestEvent() +{ + Wire.write("hello "); // respond with message of 6 bytes + // as expected by master +} diff --git a/libraries/Wire/keywords.txt b/libraries/Wire/keywords.txt new file mode 100644 index 0000000..47ffd52 --- /dev/null +++ b/libraries/Wire/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map For Wire +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +setClock KEYWORD2 +beginTransmission KEYWORD2 +endTransmission KEYWORD2 +requestFrom KEYWORD2 +onReceive KEYWORD2 +onRequest KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + +Wire KEYWORD2 +Wire1 KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties new file mode 100644 index 0000000..f4ab8be --- /dev/null +++ b/libraries/Wire/library.properties @@ -0,0 +1,9 @@ +name=Wire +version=1.0 +author=Arduino +maintainer=Arduino +sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For Arduino DUE only. +paragraph= +category=Communication +url=http://www.arduino.cc/en/Reference/Wire +architectures=stm32f4 diff --git a/platform.txt b/platform.txt index 891908b..32eb5be 100644 --- a/platform.txt +++ b/platform.txt @@ -2,7 +2,7 @@ # ------------------------------ # # For more info: -# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification +# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification name=Arduino STM32F4 (32-bits ARM Cortex-M4) Boards version=1.0.1 @@ -12,13 +12,13 @@ version=1.0.1 compiler.path={runtime.tools.arm-none-eabi-gcc.path}/bin/ compiler.c.cmd=arm-none-eabi-gcc -compiler.c.flags=-c -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -D{build.vect} -Dprintf=iprintf -MMD {compiler.libs.c.flags} +compiler.c.flags=-mthumb -c -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -Dprintf=iprintf -MMD {compiler.libs.c.flags} compiler.c.elf.cmd=arm-none-eabi-gcc -compiler.c.elf.flags=-Os -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align +compiler.c.elf.flags=-mthumb -Os -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align compiler.S.cmd=arm-none-eabi-gcc -compiler.S.flags=-c -x assembler-with-cpp {compiler.libs.c.flags} +compiler.S.flags=-mthumb -c -x assembler-with-cpp {compiler.libs.c.flags} compiler.cpp.cmd=arm-none-eabi-g++ -compiler.cpp.flags=-c -Os {compiler.warning_flags} -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -D{build.vect} -Dprintf=iprintf -MMD {compiler.libs.c.flags} +compiler.cpp.flags=-mthumb -c -Os {compiler.warning_flags} -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -Dprintf=iprintf -MMD {compiler.libs.c.flags} compiler.ar.cmd=arm-none-eabi-ar compiler.ar.flags=rcs @@ -36,16 +36,20 @@ build.cpu_flags= build.hs_flag= build.common_flags= build.extra_flags= {build.cpu_flags} {build.hs_flag} {build.common_flags} +build.ldscript=ldscript.ld # These can be overridden in platform.local.txt compiler.c.extra_flags= -compiler.c.elf.extra_flags="-L{build.variant.path}/link-tools" +compiler.c.elf.extra_flags= compiler.cpp.extra_flags= compiler.S.extra_flags= compiler.ar.extra_flags= compiler.elf2hex.extra_flags= -compiler.libs.c.flags="-I{build.system.path}/libstm32f4" "-I{build.system.path}/libstm32f4/include" "-I{build.system.path}/Drivers/STM32F4xx_HAL_Driver/Inc/" "-I{build.system.path}/Drivers/CMSIS/Include/" "-I{build.system.path}/Drivers/CMSIS/Device/ST/STM32F4xx/Include" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc" "-I{build.variant.path}/usb" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc/" "-I{build.system.path}/Drivers/BSP/Components" "-I{build.system.path}/Middlewares/Third_Party/FatFs/src" +compiler.libs.c.flags="-I{build.core.path}/avr" "-I{build.core.path}/stm32" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Inc/" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Src/" "-I{build.system.path}/{build.series}/" "-I{build.variant.path}/usb" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Src" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src" + +compiler.arm.cmsis.c.flags="-I{runtime.tools.CMSIS-4.5.0.path}/CMSIS/Include/" "-I{build.system.path}/Drivers/CMSIS/Device/ST/{build.series}/Include/" "-I{build.system.path}/Drivers/CMSIS/Device/ST/{build.series}/Source/Templates/gcc/" +compiler.arm.cmsis.ldflags="-L{runtime.tools.CMSIS-4.5.0.path}/CMSIS/Lib/GCC/" -l{build.cmsis_lib_gcc} compiler.warning_flags=-w compiler.warning_flags.none=-w @@ -53,23 +57,32 @@ compiler.warning_flags.default= compiler.warning_flags.more=-Wall compiler.warning_flags.all=-Wall -Wextra +# +# USB Flags +# --------- +build.usb_flags=-DUSBD_VID={build.vid} -DUSBD_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' + +# Default usb manufacturer will be replaced at compile time using +# numeric vendor ID if available or by board's specific value. +build.usb_manufacturer="Unknown" + # STM32 compile patterns # ----------------------- ## Compile c files -recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -D{build.series} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {compiler.arm.cmsis.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile c++ files -recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -D{build.series} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {compiler.arm.cmsis.c.flags} {includes} "{source_file}" -o "{object_file}" ## Compile S files -recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {build.cpu_flags} {build.hs_flag} {build.common_flags} {compiler.libs.c.flags} {includes} "{source_file}" -o "{object_file}" +recipe.S.o.pattern="{compiler.path}{compiler.S.cmd}" {compiler.S.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -D{build.series} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.S.extra_flags} {build.extra_flags} {compiler.arm.cmsis.c.flags} {includes} "{source_file}" -o "{object_file}" ## Create archives recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}" ## Combine gc-sections, archives, and objects -recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--warn-unresolved-symbols -Wl,--start-group {object_files} -Wl,--whole-archive "{build.variant.path}/{build.variant_system_lib}" -Wl,--no-whole-archive "{build.path}/{archive_file}" -Wl,--end-group -lm -lgcc +recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} {compiler.ldflags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--start-group {object_files} {compiler.arm.cmsis.ldflags} -Wl,--whole-archive "{build.path}/{archive_file}" -Wl,--no-whole-archive -lc -Wl,--end-group -lm -lgcc --specs=nano.specs ## Create eeprom recipe.objcopy.eep.pattern= @@ -106,13 +119,4 @@ tools.arduinoSTM32load.upload.params.verbose=-v tools.arduinoSTM32load.upload.params.quiet= tools.arduinoSTM32load.upload.pattern="{path}/{cmd}" -dfu "{runtime.tools.dfu-util-0.9.0-arduino1.path}" -bin "{build.path}/{build.project_name}.bin" -port="{serial.port}" "{upload.params.verbose}" -tools.arduinoSTM32load.upload.network_pattern="{runtime.tools.wifilink_mcuota-1.0.0.path}/wifilink_mcuota" -f "{build.path}/{build.project_name}.hex" -i "{serial.port}" - - -# -# USB Flags -# --------- - -# Default usb manufacturer will be replaced at compile time using -# numeric vendor ID if available or by board's specific value. -build.usb_manufacturer="Unknown" +#tools.arduinoSTM32load.upload.network_pattern="{runtime.tools.wifilink_mcuota-1.0.0.path}/wifilink_mcuota" -f "{build.path}/{build.project_name}.hex" -i "{serial.port}" diff --git a/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf b/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf deleted file mode 100644 index c67c867..0000000 Binary files a/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.pdf and /dev/null differ diff --git a/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.rtf b/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.rtf deleted file mode 100644 index 94dc69b..0000000 --- a/system/Drivers/CMSIS/CMSIS_END_USER_LICENCE_AGREEMENT.rtf +++ /dev/null @@ -1,911 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch37\stshfloch37\stshfhich37\stshfbi0\deflang2057\deflangfe2057\themelang2057\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} -{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} -{\f14\fbidi \froman\fcharset136\fprq2{\*\panose 02020500000000000000}PMingLiU{\*\falt \'b7\'73\'b2\'d3\'a9\'fa\'c5\'e9};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} -{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f39\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;} -{\f40\fbidi \froman\fcharset136\fprq2{\*\panose 02020500000000000000}@PMingLiU;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f51\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f52\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} -{\f54\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f55\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f56\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f57\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} -{\f58\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f59\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} -{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} -{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f183\fbidi \froman\fcharset0\fprq2 PMingLiU Western{\*\falt \'b7\'73\'b2\'d3\'a9\'fa\'c5\'e9};} -{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;} -{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} -{\f421\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f422\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f424\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f425\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;} -{\f426\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f427\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f428\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f429\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);} -{\f430\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f431\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f432\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f434\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;} -{\f435\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;}{\f438\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f439\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\f443\fbidi \froman\fcharset0\fprq2 @PMingLiU Western;} -{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} -{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} -{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} -{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; -\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red34\green34\blue34;}{\*\defchp \loch\af37\hich\af37\dbch\af37 }{\*\defpap -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 -\ltrch\fcs0 \fs22\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2057\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp2057 -\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\s15\ql \li0\ri0\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 -\f2\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext15 \slink16 \ssemihidden \sunhideused HTML Preformatted;}{\*\cs16 \additive \f2\fs20\lang0\langfe2057\langfenp2057 \slink15 \slocked \ssemihidden HTML Preformatted Char;}{\*\cs17 -\additive \ul\cf2 \sunhideused Hyperlink;}{\*\cs18 \additive \fs16 \ssemihidden \sunhideused annotation reference;}{\s19\ql \li0\ri0\sa200\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 -\ltrch\fcs0 \fs20\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext19 \slink20 \ssemihidden \sunhideused annotation text;}{\*\cs20 \additive \fs20 \slink19 \slocked \ssemihidden Comment Text Char;}{ -\s21\ql \li0\ri0\sa200\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 -\sbasedon19 \snext19 \slink22 \ssemihidden \sunhideused annotation subject;}{\*\cs22 \additive \b\fs20 \slink21 \slocked \ssemihidden Comment Subject Char;}{\s23\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 -\rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang2057\langfe1033\loch\f38\hich\af38\dbch\af37\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext23 \slink24 \ssemihidden \sunhideused Balloon Text;}{\*\cs24 \additive \f38\fs16 -\slink23 \slocked \ssemihidden Balloon Text Char;}{\s25\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext25 \slink26 \sunhideused header;}{\*\cs26 \additive \fs22\lang2057\langfe0\langnp2057 \slink25 \slocked Header Char;}{ -\s27\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\tqc\tx4680\tqr\tx9360\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext27 \slink28 \sunhideused \spriority0 footer;}{\*\cs28 \additive \fs22\lang2057\langfe0\langnp2057 \slink27 \slocked \ssemihidden Footer Char;}{\*\cs29 -\additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 page number;}{\s30\ql \fi-425\li1134\ri0\sb120\sa120\widctlpar\tx1134\tqr\tx7920\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1134\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 -\fs18\lang2057\langfe1033\loch\f1\hich\af1\dbch\af14\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext30 \spriority0 Indent;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 -\ltrch\fcs0 \fs22\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 \snext31 \shidden \ssemihidden Revision;}{\s32\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af0\afs21\alang1025 \ltrch\fcs0 \f39\fs21\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext32 \slink33 \sunhideused Plain Text;}{\*\cs33 \additive \f39\fs21\lang0\langfe1033\langfenp1033 \slink32 \slocked Plain Text Char;}{ -\s34\ql \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2057\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 -\sbasedon0 \snext34 \sqformat \spriority34 List Paragraph;}}{\*\listtable{\*\listpicture{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn borderTopColor}{\sv -16777216}} -{\sp{\sn borderLeftColor}{\sv -16777216}}{\sp{\sn borderBottomColor}{\sv -16777216}}{\sp{\sn borderRightColor}{\sv -16777216}}{\sp{\sn fIsBullet}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 -\picw7620\pich7620\picwgoal4320\pichgoal4320\wmetafile8\bliptag1621848657\blipupi-183{\*\blipuid 60ab72513f0584938171c3e04d1ffcc4} -0100090000039100000002001c00000000000400000003010800050000000b0200000000050000000c0209070507040000002e0118001c000000fb02a4ff0000 -000000009001000000000440002243616c6962726900000000000000000000000000000000000000000000000000040000002d010000040000002d0100000400 -00002d010000040000002d010000040000002d010000040000002d0100000400000002010100050000000902000000020d000000320a57000000010004000000 -00000807080720003600050000000902000000021c000000fb021000070000000000bc02000000000102022253797374656d0076d0e132092cfb3d00d9e4497680014e76a4f2530a38fb3d00040000002d010100040000002d010100030000000000}}{\list\listtemplateid-492936738\listhybrid{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid39328222}{\list\listtemplateid-917765150\listhybrid{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 } -{\listname ;}\listid144588935}{\list\listtemplateid-1026387870{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\lin1440 }{\listname -;}\listid155655221}{\list\listtemplateid466939434\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat6\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel -\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid207642902} -{\list\listtemplateid-868587660\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \cf1\dbch\af0\fbias0 -\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid244075828} -{\list\listtemplateid-301287646\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \cf1\dbch\af0\fbias0 -\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid358317280} -{\list\listtemplateid572415416\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \cf0\dbch\af37\fbias0 -\fi-360\li786\lin786 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1506\lin1506 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2226\lin2226 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2946\lin2946 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3666\lin3666 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4386\lin4386 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5106\lin5106 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5826\lin5826 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6546\lin6546 }{\listname ;}\listid423112302} -{\list\listtemplateid-1459612926\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1275\lin1275 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1995\lin1995 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 -\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2715\lin2715 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3435\lin3435 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4155\lin4155 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4875\lin4875 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5595\lin5595 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6315\lin6315 }{\listlevel -\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li7035\lin7035 }{\listname ;}\listid454718230} -{\list\listtemplateid-551514274\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\'01-;}{\levelnumbers;}\loch\af1\hich\af1\dbch\af0\fbias0 \fi-360\li1080\lin1080 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 -\fi-360\li3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0 \fi-360\li6840\lin6840 }{\listname ;}\listid474840100}{\list\listtemplateid-1601537400{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} -\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fs20\fbias0 \levelpicture0\fi-360\li1440 -\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;} -\f10\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid891499942}{\list\listtemplateid-2106560774\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel -\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid939029968}{\list\listtemplateid1475657882\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\'01-;}{\levelnumbers;} -\loch\af1\hich\af1\dbch\af0\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23 -\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5040\lin5040 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6480\lin6480 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7200\lin7200 }{\listname ;}\listid1080055287}{\list\listtemplateid345380616\listhybrid{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0 -{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1864\lin1864 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2224\lin2224 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-180\li2944\lin2944 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3664\lin3664 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4384\lin4384 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 -\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li5104\lin5104 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5824\lin5824 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6544\lin6544 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li7264\lin7264 }{\listname ;}\listid1198470673}{\list\listtemplateid-1488150726\listhybrid{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel -\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1264800667}{\list\listtemplateid1709371634{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1080\li1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-1440\li1440\lin1440 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-1440\li1440\lin1440 }{\listname ;}\listid1335182434}{\list\listtemplateid-1861725538\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel -\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 } -{\listname ;}\listid1556695208}{\list\listtemplateid-301287646\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\cf1\dbch\af0\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname -;}\listid1583906200}{\list\listtemplateid1806592008\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 -\af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1801338294} -{\list\listtemplateid-1056679890\listhybrid{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li1429 -\jclisttab\tx1429\lin1429 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1789\jclisttab\tx1789\lin1789 } -{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2509\jclisttab\tx2509\lin2509 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3229\jclisttab\tx3229\lin3229 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3949\jclisttab\tx3949\lin3949 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4669\jclisttab\tx4669\lin4669 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5389\jclisttab\tx5389\lin5389 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6109\jclisttab\tx6109\lin6109 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6829\jclisttab\tx6829\lin6829 }{\listname ;}\listid1872956500}{\list\listtemplateid2052502928{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers -\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600 -\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320\jclisttab\tx4320\lin4320 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0\levelnfcn0\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1950702225}}{\*\listoverridetable -{\listoverride\listid474840100\listoverridecount0\ls1}{\listoverride\listid1080055287\listoverridecount0\ls2}{\listoverride\listid1872956500\listoverridecount0\ls3}{\listoverride\listid1198470673\listoverridecount0\ls4}{\listoverride\listid1950702225 -\listoverridecount0\ls5}{\listoverride\listid1556695208\listoverridecount0\ls6}{\listoverride\listid454718230\listoverridecount0\ls7}{\listoverride\listid939029968\listoverridecount0\ls8}{\listoverride\listid1264800667\listoverridecount0\ls9} -{\listoverride\listid244075828\listoverridecount0\ls10}{\listoverride\listid423112302\listoverridecount0\ls11}{\listoverride\listid1801338294\listoverridecount0\ls12}{\listoverride\listid155655221\listoverridecount0\ls13}{\listoverride\listid1335182434 -\listoverridecount0\ls14}{\listoverride\listid144588935\listoverridecount0\ls15}{\listoverride\listid1583906200\listoverridecount0\ls16}{\listoverride\listid891499942\listoverridecount0\ls17}{\listoverride\listid358317280\listoverridecount0\ls18} -{\listoverride\listid207642902\listoverridecount0\ls19}{\listoverride\listid39328222\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel -\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat -\levelstartat1}\ls20}}{\*\rsidtbl \rsid2044820\rsid10637227\rsid11554224\rsid14553496}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info -{\title LEC-PRE-00489 ~ EULA for CMSIS Deliverables}{\author Emily Drea}{\operator Joachim Krech}{\creatim\yr2015\mo8\dy27\hr7\min15}{\revtim\yr2015\mo8\dy27\hr7\min15}{\printim\yr2015\mo8\dy18\hr8\min33}{\version2}{\edmins1}{\nofpages5}{\nofwords2395} -{\nofchars13654}{\*\company ARM Ltd}{\nofcharsws16017}{\vern49167}}{\*\userprops {\propname Check In Comment}\proptype30{\staticval Major Version Publish}{\propname ComputedCompany}\proptype30{\staticval ARM/}{\propname ComputedLR}\proptype30{\staticval A -P/}{\propname ComputedNumber}\proptype30{\staticval LEC-PRE-00489-V6.0}{\propname Created}\proptype30{\staticval 2014-06-01T22:01:00Z}{\propname Description}\proptype30{\staticval }{\propname display_urn:schemas-microsoft-com:office:office#Author} -\proptype30{\staticval Emily Drea}{\propname display_urn:schemas-microsoft-com:office:office#Editor}\proptype30{\staticval Emily Drea}{\propname EMAIL_OWNER_ADDRESS}\proptype30{\staticval sAAAUYtyAkeNWR4c/hyv83djDdgT//SlfRfj0yul0Nymu58=}{\propname FileLea -fRef}\proptype30{\staticval LEC-PRE-00489}{\propname HiddenDelete}\proptype30{\staticval }{\propname HiddenUpload}\proptype30{\staticval }{\propname MAIL_MSG_ID1}\proptype30{\staticval ABAAVOAfoSrQoywVz+n89RkH8vckJh2hX9X1LeIJRLXpkh+XCtJmzNRfIdvcDdtCC+CW} -{\propname MAIL_MSG_ID2}\proptype30{\staticval c5CxtGnFSJrNPiFAS7uBa/Md4M/GKbLGzLnuTUVlLUhYPGbMRhOa5RG4vn7\'0d\'0aRvdHkjT0j+KBwUyX0J0TijfAeRM/c9+3kWygmQ==}{\propname Modified}\proptype30{\staticval 2015-08-18T10:13:43Z}{\propname Modified By}\proptype30 -{\staticval 62\'3b#Emily Drea,#EMEA\'5cemidre01,#Emily.Drea@arm.com,#,#Emily Drea}{\propname Name}\proptype30{\staticval LEC-PRE-00489.doc}{\propname Order}\proptype30{\staticval 672300}{\propname Property Bag}\proptype30{\staticval vti_contentversionisdi -rty:BW|false\'0d\'0avti_parserversion:SR|14.0.0.6029\'0d\'0aEXT:SW|doc\'0d\'0aOrder:IW|672300\'0d\'0avti_contenttag:SW|\'7b7AA67540-4642-44E7-8CB5-11C47CDC1B3E\'7d,137,51\'0d\'0a_Category:SW|\'0d\'0aRESPONSE_SENDER_NAME:SW|gAAAdya76B99d4hLGUR1rQ+8TxTv0GGE -Pdix\'0d\'0avti_author:SR|}{\propname RESPONSE_SENDER_NAME}\proptype30{\staticval gAAAdya76B99d4hLGUR1rQ+8TxTv0GGEPdix}{\propname Title}\proptype30{\staticval LEC-PRE-00489 ~ EULA for CMSIS Deliverables}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/ -office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\revisions\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale110\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot2688764\newtblstyruls\nogrowautofit\utinl \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10637227 \chftnsep -\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10637227 \chftnsepc -\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10637227 \chftnsep -\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10637227 \chftnsepc -\par }}\ltrpar \sectd \ltrsect\linex0\headery400\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid14553496\sftnbj {\headerr \ltrpar \ltrrow\trowd \irow0\irowband0\ltrrow -\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx2901 -\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx5910\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl -\cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx8919\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 18 August 2015\cell }\pard \ltrpar -\qc \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 CONFIDENTIAL\cell }\pard \ltrpar -\qr \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 LEC-PRE-00489\cell }\pard \ltrpar -\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \trowd \irow0\irowband0\ltrrow -\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx2901 -\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx5910\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl -\cltxlrtb\clftsWidth3\clwWidth3009\clshdrawnil \cellx8919\row \ltrrow}\trowd \irow1\irowband1\lastrow \ltrrow\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt -\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth9026\clshdrawnil \cellx8919\pard \ltrpar\qr \li0\ri0\sa200\sl276\slmult1\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 -\ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 SP-Version: 4.0\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 \ltrch\fcs0 -\fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \trowd \irow1\irowband1\lastrow \ltrrow\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl -\clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth9026\clshdrawnil \cellx8919\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid14553496 -\par }}{\footerr \ltrpar \ltrrow\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr -\brdrtbl \cltxlrtb\clftsWidth3\clwWidth4513\clshdrawnil \cellx4405\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth4513\clshdrawnil \cellx8918\pard\plain \ltrpar\qr \li0\ri0\sa200\sl276\slmult1 -\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\field{\*\fldinst {\rtlch\fcs1 \af1 \ltrch\fcs0 -\fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 PAG\hich\af1\dbch\af1\loch\f1 E}}{\fldrslt {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\lang1024\langfe1024\loch\af1\hich\af1\dbch\af1\noproof\insrsid2044820 \hich\af1\dbch\af1\loch\f1 1} -}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 of }{\field{\*\fldinst {\rtlch\fcs1 \af1 \ltrch\fcs0 -\fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \hich\af1\dbch\af1\loch\f1 NUMPAGES}}{\fldrslt {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\lang1024\langfe1024\loch\af1\hich\af1\dbch\af1\noproof\insrsid2044820 \hich\af1\dbch\af1\loch\f1 5}}}\sectd \ltrsect -\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1 \ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \cell \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1 -\ltrch\fcs0 \fs18\loch\af1\hich\af1\dbch\af1\insrsid14553496 \trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trrh240\trleft-108\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrtbl \clbrdrl -\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth4513\clshdrawnil \cellx4405\clvertalt\clbrdrt\brdrtbl \clbrdrl\brdrtbl \clbrdrb\brdrtbl \clbrdrr\brdrtbl \cltxlrtb\clftsWidth3\clwWidth4513\clshdrawnil \cellx8918\row }\pard \ltrpar -\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496 -\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} -{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qj \li0\ri0\sa240\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 END USER LICENCE AGREEMENT FOR THE }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CORTEX MICROCONTROLLER SOFTWARE INTERFACE STANDARD (CMSIS) DELIVERABLES }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -\par THIS END USER LICENCE AGREEMENT ("LICENCE") IS A LEGAL AGREEMENT BETWEEN YOU (EITHER A }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid5861575 -SINGLE INDIVIDUAL, OR SINGLE LEGAL ENTITY) AND ARM LIMITED ("ARM") FOR THE USE OF THE CMSIS }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 DELIVERABLES}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid5861575 . ARM IS ONLY WILLING TO LICENSE THE }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS DELIVERABLES }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid5861575 TO YOU ON CONDITION THAT YOU ACCEPT ALL OF THE}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 TERMS IN THIS LICENCE. BY CLICKING "I AGREE", OR BY INSTALLING OR OTHERWISE USING OR COPYING THE }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS DELIVERABLES }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -YOU INDICATE THAT YOU AGREE TO BE BOUND BY ALL THE TERMS OF THIS LICENCE. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENCE, ARM IS UNWILLING TO LICENSE YOU TO USE }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 OF }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 THE }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS DELIVERABLES}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 AND YOU MAY NOT INSTALL, USE OR COPY THE }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS DELIVERABLES}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93Deliverables\'94 - means (i) the CMSIS Deliverables; (ii) CMSIS-DAP Specification; (iii) CMSIS-DAP Firmware; and (iv) RDDI DLL. -\par \'93CMSIS-DAP Specification\'94 means any documentation defining the application programming interface, naming and coding conventions of the Cortex Microcontroller Software Interface Standard Debug Access Port (\'93CMSIS-DAP\'94). }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 \hich\f1 Notwithstanding the foregoing, \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 CMSIS-DAP }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 \hich\f1 Specification\'94\loch\f1 shall not include}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 :}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 (i) the implementation of other published specifications referenced in th}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 e}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 CMSIS-DAP }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 Specific\hich\af1\dbch\af37\loch\f1 ation; }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 and }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 (ii) any enabling technologies that may be necessary to make or use any product or portion}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 s}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 thereof that complies with the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 CMSIS-DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 Specification, but are not themselves expressly set forth in th}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 e}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -CMSIS-DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 Specification (e.g. compiler front en\hich\af1\dbch\af37\loch\f1 -ds, code generators, back ends, libraries or other compiler, assembler or linker technologies; validation or debug software or hardware; applications, operating system or driver software; RISC architecture; }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 and }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 processor microarchitecture)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 . }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid4029239 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid11929640 \hich\af1\dbch\af37\loch\f1 CMSIS-DAP Fi\hich\af1\dbch\af37\loch\f1 -rmware}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'94 - means the C programming language source code accompanying this Licence which implements the functionality of the application programming interface as defined in the CMSIS-DAP Specification and any updates, patches and modifications ARM may make ava -ilable under the terms of this Licence. -\par \'93CMSIS Deliverables\'94 means the following components: (i) CMSIS-CORE; (ii) CMSIS-DRIVER; (iii) CMSIS-DSP; (iv) CMSIS-PACK; (v) CMSIS-RTOS API; and (vi) CMSIS-SVD . -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\tx0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93CMSIS-CORE -\'94 means the specification defining the application programming interface, naming and coding conventions for the Cortex-M processor cores. -\par \'94}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid488451 \hich\af1\dbch\af37\loch\f1 CMSIS-DRIVER}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid14553496 \hich\af37\dbch\af37\loch\f37 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid488451 \hich\af1\dbch\af37\loch\f1 means the specification defining }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 a generic}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid488451 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 p}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid488451 \hich\af1\dbch\af37\loch\f1 eripheral }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 d}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496\charrsid488451 \hich\af1\dbch\af37\loch\f1 river application programming interface, naming and coding conventions}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496 . -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93CMSIS-DSP\'94 - means the digital signal process (DSP) library specification defining the application programming interface of a DSP library implementation}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15023647 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\tx0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13240697 \hich\af1\dbch\af37\loch\f1 CMSIS-PACK}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid14553496\charrsid13240697 \hich\af37\dbch\af37\loch\f37 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13240697 \hich\af1\dbch\af37\loch\f1 means the specification defining a software pack file format}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 , verification utility, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13240697 \hich\af1\dbch\af37\loch\f1 and the associated XML -\hich\af1\dbch\af37\loch\f1 schema file}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496\charrsid13240697 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93CMSIS-RTOS API\'94 - means the real-time operating system (RTOS) specification defining a generic application programming interface layer for a RTOS system}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15023647 .}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93CMSIS-SVD\'94 }{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid9306407 means }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -the specification defining the System View Description (SVD), verification utility, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf17\lang1033\langfe2057\langnp1033\langfenp2057\insrsid14553496\charrsid9306407 and associated XML}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf17\lang1033\langfe2057\langnp1033\langfenp2057\insrsid14553496 schema}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf17\lang1033\langfe2057\langnp1033\langfenp2057\insrsid14553496\charrsid9306407 files. }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid9306407 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \'93Firmware\'94 means firmware that complies with the CMSIS-DAP Specification. -\par \'93RDDI DLL\'94 means the reference implementation of a device driver }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6236778 accompanying this Licence}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 in object code form and any updates, patch -es and modifications ARM may agree to make available under the terms of this Licence and is used with targets containing microprocessors manufactured or simulated under licence from ARM. -\par \'93Separate Files\'94 means the components }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid10227990 identified}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 in the Schedule.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid3618484 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par \'93Target Connection Product\'94 means a target connection product that complies with the CMSIS-DAP Specification and is used on or with a target containing microprocessors manufactured or simulated under licence from ARM. -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid5577184 \hich\af1\dbch\af37\loch\f1 -Notwithstanding the foregoing, the Deliverables shall not include: (i) the implementation of other published specifications referenced in the Deliverables; (ii) any enabling technologies that may be necessary to make or use any product or portion thereof -\hich\af1\dbch\af37\loch\f1 -that complies with the Deliverables, but are not themselves expressly set forth in the Deliverables (e.g. compiler front ends, code generators, back ends, libraries or other compiler, assembler or linker technologies; validation or debug software or hard -\hich\af1\dbch\af37\loch\f1 w\hich\af1\dbch\af37\loch\f1 -are; applications, operating system or driver software; RISC architecture; processor microarchitecture); (iii) maskworks and physical layouts of integrated circuit designs; or (iv) RTL or other high level representations of integrated circuit designs.}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 1. LICENCE GRANTS. -\par }\pard \ltrpar\qj \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 1.1}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS DELIVERABLES -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 ARM hereby grants to you, subject to the terms and conditions of this Licence, a non-exclusive, non-transferable }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid1317547 licence, to use and copy the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS D}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 eliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 for the purpose of: }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar -\tx426\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 (i) subject to clause 1.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 5(i)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 , developing, having developed, manufacturing, having manufactured, offering to sell, selling, supplying or otherwise distributing products that comply with the }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS D}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 eliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 ; and -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid1317547 (ii) distributing and having distributed (directly or through your customers and authorised distributors) the CMSIS-D}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 eliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid1317547 unmodified, with the products}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 you have developed under }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Clause 1.1 (i) }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 provided you preserve any copyright notices which are included with the CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 D}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 eliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 . }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par 1.2 CMSIS-DAP SPECIFICATION -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 ARM hereby grants to you, subject to the terms and conditions of this Licence, a non-exclusive, non-transferable licence, to }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid3605578 use and copy the CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -DAP }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6386005 Specification}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 for the purposes of: -\par }\pard \ltrpar\qj \fi-567\li567\ri0\sl276\slmult1\widctlpar\tx567\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 (a)\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11225765 -developing, having developed, manufacturing, having manufactured, offering to sell, selling, supplying}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -, distributing or having distributed a Target Connection Product}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ;}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \fi-567\li567\ri0\sl276\slmult1\widctlpar\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 (b)\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11225765 developing, having developed, }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 subject to clause 1.5(ii) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11225765 -offering to sell, selling, supplying}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11225765 -distributing}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 or having distributed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -(directly or through your cus\hich\af1\dbch\af37\loch\f1 tomers and authorised distributors) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Firmware to run on a Target Connection Product; and -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 (c)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \tab subject to clause 1.5(ii), }{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 distributing }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 and }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 having distributed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -(directly or through your customers and authorised distributors) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 the CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14559761 Specification unmodified}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ,}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14559761 with}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 either or both the}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 Target Connection Products and Firmware}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , developed under the licences granted in this Clause 1.2}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar -\tx426\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par 1.3 CMSIS-DAP FIRMWARE -\par }\pard \ltrpar\qj \li0\ri0\sl276\slmult1\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ARM hereby grants to you, subject to the terms and conditions of this Licence, a non-exclusive, non-trans\hich\af1\dbch\af37\loch\f1 ferable licence, to: - -\par }\pard \ltrpar\qj \fi-567\li567\ri0\sl276\slmult1\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 (a)\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid10356267 \hich\af1\dbch\af37\loch\f1 use, copy}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid2558325 -\hich\af1\dbch\af37\loch\f1 , and modify the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 CMSIS-DAP Firmware }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -for the purposes of developing and having developed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid8745136 firmware to run on}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 a Target Connection Product; and -\par (b)\tab subject to clause 1.5(ii), offer to sell, selling, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid5058240 supply}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , supplying, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid8745136 distributing}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 or having distributed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -(directly or through your customers and authorised distributors)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS-DAP Firmware or any modified version created under Clause 1.3 (a) }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid8745136 in}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6192099 object code form only }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 to run on a Target Connection Product. }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid9913780 }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar -\tx426\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 1.4 RDDI DLL -\par }\pard \ltrpar\qj \li0\ri0\sl276\slmult1\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ARM hereby grants to you, subject to the terms and conditions of this Licence, a non-exclusive, non-transferable licence, to: -\par }\pard \ltrpar\qj \fi-567\li567\ri0\sl276\slmult1\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 (a)\tab use and copy the RDDI DLL for the purpose }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid13793259 of connecting }{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 a Target Connection Product }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11805076 -running CMSIS-DAP compatible firmware }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 (either the Firmware or the firmware created pursuant to Clause 1.3) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11805076 to }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 software debug tools installed on }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11805076 a host }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 computer running a Windows platform}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid11805076 ; and}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par (b)\tab subject to clause 1.5(ii), offer to sell, selling, supplying, distributing or having distributed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 (directly or -\hich\af1\dbch\af37\loch\f1 through your customers and authorised distributors) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 the RDDI DLL in object code form only. -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar -\tx426\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid6756135 -\par }\pard \ltrpar\qj \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 {\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 1.5}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 CONDITIONS ON REDISTRIBUTION}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 (i) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 -\hich\af1\dbch\af37\loch\f1 If you distribute (directly or through your customers and authorised distributors) the products you have created pursuant \hich\af1\dbch\af37\loch\f1 to Clause 1.1}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 \hich\af1\dbch\af37\loch\f1 (i) you agree: (a) not to use ARM -\hich\f1 \rquote \loch\f1 s name, logo or trademarks to market any or all of the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid1928237 products created under Clause 1.1 (i); }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 \hich\af1\dbch\af37\loch\f1 (b) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 to }{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 \hich\af1\dbch\af37\loch\f1 pr}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 e}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 \hich\af1\dbch\af37\loch\f1 serve any copyright notices included in the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 CMSIS D}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 eliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 \hich\af1\dbch\af37\loch\f1 ; and (c) to ensure your customers and aut\hich\af1\dbch\af37\loch\f1 horised distributors comply with this Clause 1.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 5(i)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid1928237 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -(ii) If you are authorised and choose to distribute (directly or through your customers and authorised distributors) the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 CMSIS}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14559761 Specification}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 Firmware, CMSIS-DAP Firmware or any modified version \hich\af1\dbch\af37\loch\f1 -thereof, or the RDDI DLL, you agree; (a) to ensure that they are licensed for use with targets containing microprocessors manufactured or simulated under licence from ARM; (b) to preserve any copyright notices which are included with the }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14559761 Specification}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , CMSIS-DAP Firmware}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 -, and include valid copyright notices in; (i) any modified version of the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 CMSIS-DAP Firmware}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ; and (ii) the Firmware; (c) not to use ARM\hich\f1 \rquote \loch\f1 s name, logo or trademarks to market -any or all of the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid4549827 DAP }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14559761 Specification}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 , Firmware,}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 CMSI\hich\af1\dbch\af37\loch\f1 -S-DAP Firmware or any modified version therof, the RDDI DLL or the Target Connection Products; and (d) to ensure your customers and authorised distributors comply with this Clause 1.5(ii). -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 2. RESTRICTIONS ON USE OF THE}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 DELIVERABLES -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 -\cbpat8 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 PERMITTED USERS: The }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -Deliverables }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 shall be used only by you (either a single individual, or single legal entity) your employees, or by your }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 on-site }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -bona fide sub-contractors for whose acts and omissions you hereby agree to be responsible to ARM}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 for}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 to the same extent as }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 you are for }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 your employees, and provided always that such sub-contractors}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 :}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 (i) are contractually obligated to use the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -Deliverables }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 only for your benefit}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ;}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 and (i}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 i}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 ) agree to assign all their work product and any rights they create therein in the supply of such work to you. -\par COPYRIGHT AND RESERVATION OF RIGHTS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14488502 : The }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14488502 - are owned by ARM or its licensors and are protected by copyright and other intellectual property laws and international treaties. The }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14488502 are licensed not sold. Except as expressly licensed herein, you acquire no right, title or interest in the }{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14488502 - or any intellectual property therein. In no event shall the licences granted herein be construed as granting you, expressly or by implication, estoppels or otherwise, a licence to use any ARM technology except the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid14488502 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 3}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . SUPPORT. -\par ARM is not obligated to support the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables but}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 may do so entirely at ARM's discretion. -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 4}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 NO }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 WARRANT}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Y.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -\par YOU AGREE THAT THE }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 DELIVERABLES ARE}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 - LICENSED "AS IS", AND THAT ARM EXPRESSLY DISCLA -IMS ALL REPRESENTATIONS, WARRANTIES, CONDITIONS OR OTHER TERMS, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, SATISFACTORY QUALITY, AND FITNESS FOR A PARTICULAR PURPOSE.}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 THE DELIVERABLES MAY CONTAIN ERRORS. }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 5}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . LIMITATION OF LIABILITY. -\par THE MAXIMUM LIABILITY OF ARM TO YOU IN AGGREGATE FOR ALL CLAIMS MADE AGAINST ARM IN CONTRACT}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ,}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 TORT OR OTHERWISE UNDER OR IN CONNECTION WITH THE SUBJECT MATTER OF THIS LICENCE SHALL NOT EXCEED }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 THE GREATER OF (I) }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 THE TO -TAL OF SUMS PAID BY YOU TO ARM (IF ANY) FOR THIS LICENCE}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 AND (II) US$10.00}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 - THE LIMITATIONS, EXCLUSIONS AND DISCLAIMERS IN THIS LICENCE SHALL APPLY TO THE MAXIMUM EXTENT ALLOWED BY APPLICABLE LAW. -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 6 -}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid13830602 \hich\af1\dbch\af37\loch\f1 . THIRD PARTY RIGHTS.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13830602 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid13830602 \hich\af1\dbch\af37\loch\f1 The Separate Files are delivered su\hich\af1\dbch\af37\loch\f1 \hich\f1 -bject to and your use is governed by their own separate licence agreements. This Licence does not apply to such Separate Files and they are not included in the term \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\lang1024\langfe1024\noproof\insrsid14553496 \hich\af1\dbch\af37\loch\f1 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang1024\langfe1024\noproof\insrsid14553496\charrsid13830602 \loch\af1\dbch\af37\hich\f1 \'94\loch\f1 - under this Licence. You agree to comply with all terms and conditions impose\hich\af1\dbch\af37\loch\f1 \hich\f1 d on you in respect of such Separate Files including those identified in the Schedule (\'93\loch\f1 \hich\f1 Third Party Terms\'94\loch\f1 -). -\par \hich\af1\dbch\af37\loch\f1 ARM HEREBY DISCLAIMS ANY AND ALL WARRANTIES EXPRESS OR IMPLIED FROM ANY THIRD PARTIES REGARDING ANY SEPARATE FILES, ANY THIRD PARTY MATERIALS INC\hich\af1\dbch\af37\loch\f1 \hich\f1 -LUDED IN THE SOFTWARE, ANY THIRD PARTY MATERIALS FROM WHICH THE SOFTWARE IS DERIVED (COLLECTIVELY \'93\loch\f1 \hich\f1 OTHER CODE\'94\loch\f1 -), AND THE USE OF ANY OR ALL THE OTHER CODE IN CONNECTION WITH THE SOFTWARE, INCLUDING (WITHOUT LIMITATION) ANY WARRANTIES OF SATISFACTORY QUALIT\hich\af1\dbch\af37\loch\f1 Y\hich\af1\dbch\af37\loch\f1 OR FITNESS FOR A PARTICULAR PURPOSE. -\par \hich\af1\dbch\af37\loch\f1 NO THIRD PARTY LICENSORS OF OTHER CODE SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND WHETHER -\hich\af1\dbch\af37\loch\f1 - MADE UNDER CONTRACT, TORT OR OTHER LEGAL THEORY, ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE OTHER CODE OR THE EXERCISE OF ANY RIGHTS GRANTED UNDER EITHER OR BOTH THIS LICENCE AND THE LEGAL TERMS APPLICABLE TO ANY SEPARATE FILES, EVEN IF ADV -\hich\af1\dbch\af37\loch\f1 I\hich\af1\dbch\af37\loch\f1 SED OF THE POSSIBILITY OF SUCH DAMAGES. -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 7}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . U.S. GOVERNMENT END USERS. -\par US Government Restrictions: Use, duplication, reproduction, release, modification, disclosure or transfer of this commercial product and accompanying documentation is restricted in accordance with the terms of this Licence. -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 8}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . TERM AND TERMINATION. -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 8.1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -This Licence shall remain in force until terminated }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 in accordance with the terms of Clause 8.2 or Clause 8.3 below}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par 8.2 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 Without prejudice to any of its other rights if you are in breach of - any of the terms and conditions of this Licence then ARM may terminate this Licence immediately upon giving written notice to you}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid7630822 -. You may terminate this Licence at any time. }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7106724 \hich\af1\dbch\af37\loch\f1 -8.3 This Licence shall immediately terminate and shall be unavailable to you i\hich\af1\dbch\af37\loch\f1 -f you or any party affiliated to you asserts any patents against ARM, ARM affiliates, third parties who have a valid licence from ARM for the Deliverables, or any customers or distributors of any of them based upon a claim that your (or your affiliate) pa -\hich\af1\dbch\af37\loch\f1 t\hich\af1\dbch\af37\loch\f1 ent is Necessary to implement the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496\charrsid7106724 \hich\af1\dbch\af37\loch\f1 . In this Licence}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 :}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7106724 -\hich\af1\dbch\af37\loch\f1 (i) "affiliate" means any entity controlling, controlled by or under common control with a party (in fact or in law, via voting securities, management control or otherwise) and "affiliated" s\hich\af1\dbch\af37\loch\f1 -hall be construed accordingly; (ii) "assert" means to allege infringement in legal or administrative proceedings, or proceedings before any other competent trade, arbitral or international authority; }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 and }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7106724 \hich\af1\dbch\af37\loch\f1 \hich\f1 (iii) \'93\loch\f1 \hich\f1 Necessary\'94\loch\f1 - means with respect to any claims o\hich\af1\dbch\af37\loch\f1 f any patent, those claims which, without the appropriate permission of the patent owner, will be infringed when implementing the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\hich\af1\dbch\af37\loch\f1 Deliverables }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7106724 \hich\af1\dbch\af37\loch\f1 because no alternative, commercially reasonable, non-infringing way of implementing the }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 Deliverables }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7106724 \hich\af1\dbch\af37\loch\f1 is known.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496\charrsid5900444 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 8.4 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid7630822 Upon termination of this Licence,}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 you shall stop }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 -using the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 - and destroy all copies of the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 in your possession. The provisions of clauses 5, 6, 7, 8 and 9 shall survive termination of this Licence.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 9}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 . GENERAL. -\par This Licence is governed by English Law. Except where ARM agrees otherwise in a written contract signed by you and ARM, this is the only agreement between you and ARM relating to the }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Deliverables}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15280636 - and it may only be modified by written agreement between you and ARM. Except a -s expressly agreed in writing, this Licence may not be modified by purchase orders, advertising or other representation by any person. If any clause or sentence in this Licence is held by a court of law to be illegal or unenforceable the remaining provisi -o -ns of this Licence shall not be affected thereby. The failure by ARM to enforce any of the provisions of this Licence, unless waived in writing, shall not constitute a waiver of ARM's rights to enforce such provision or any other provision of this Licence - in the future.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 This Licence may not be assigned without the prior written consent of ARM. -\par }\pard \ltrpar\qc \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 \page SCHEDULE -\par }\pard \ltrpar\qj \li0\ri0\sa240\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \cbpat8 { -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 Separate Files -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 The }{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 package }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 also }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 includes the components}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 contained in the following directories}{\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 :}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 -\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid14553496 \hich\af1\dbch\af0\loch\f1 (a)\tab}}\pard \ltrpar -\qj \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls16\adjustright\rin0\lin720\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ./}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 /}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 -\hich\af1\dbch\af37\loch\f1 DSP_Lib}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 - }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496\charrsid15098396 -DSP Library sources and examples}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ; -\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid14553496 \hich\af1\dbch\af0\loch\f1 (b)\tab}}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ./}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 CMS\hich\af1\dbch\af37\loch\f1 IS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 /}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 Include}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 - Header files; -\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid14553496 \hich\af1\dbch\af0\loch\f1 (c)\tab}}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ./}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 /}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 -\hich\af1\dbch\af37\loch\f1 Lib}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 - }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 -DSP Library build for various toolchains}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ; -\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid14553496 \hich\af1\dbch\af0\loch\f1 (d)\tab}}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 ./}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 CMSIS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 /}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 -\hich\af1\dbch\af37\loch\f1 RTOS}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 - }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid7090778 \hich\af1\dbch\af37\loch\f1 -Header file template for CMSIS-RTOS implementation}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ; and -\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid14553496 \hich\af1\dbch\af0\loch\f1 (e)\tab}}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\lang2057\langfe2057\langfenp2057\insrsid14553496 .}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 /Device - T}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid14488502 \hich\af1\dbch\af37\loch\f1 emplate files and implementations for Cortex-M class processors}{ -\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 . -\par }\pard \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par \hich\af1\dbch\af37\loch\f1 All of the above com\hich\af1\dbch\af37\loch\f1 ponents (a\hich\f1 \endash \loch\f1 e) are licensed to you under the terms of the BSD licence, which is incorporated within or alongside the above components. -\par }\pard \ltrpar\qj \li284\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin284\itap0\pararsid14553496 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 -\f1\fs18\insrsid14553496\charrsid13975144 \hich\af1\dbch\af37\loch\f1 (f)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13975144 -\hich\af1\dbch\af37\loch\f1 ./CMSIS/Driver \hich\f1 \endash \loch\f1 CMSIS-Driver header files}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid13975144 \hich\af1\dbch\af37\loch\f1 (g)}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496 -\hich\af37\dbch\af37\loch\f37 }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 ./CMSIS/Pack \hich\f1 \endash \loch\f1 Example Device Family Pack}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14553496\charrsid13975144 - -\par }\pard\plain \ltrpar\s32\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \rtlch\fcs1 \af0\afs21\alang1025 \ltrch\fcs0 \f39\fs21\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 -\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496 -\par The above components (f \endash g) are licensed to you under the terms of the zlib licence, which is incorporated within or alongside the above components. -\par -\par -\par }\pard\plain \ltrpar\qj \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14553496 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\fs22\lang2057\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp2057\langfenp1033 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid2958685 \hich\af1\dbch\af37\loch\f1 ARM contract reference LEC-PRE-00489}{\rtlch\fcs1 \af1\afs18 -\ltrch\fcs0 \f1\fs18\insrsid14553496 \hich\af1\dbch\af37\loch\f1 - v4.0}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid14553496\charrsid2958685 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 -fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 -ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae -a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 -399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 -4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 -0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b -c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 -689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 -5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 -aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d -316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 -545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a -c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 -0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 -8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 -d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 -1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f -bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 -a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a -0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 -0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 -00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; -\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; -\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdpriority0 \lsdlocked0 footer;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdpriority0 \lsdlocked0 page number; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid; -\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography; -\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000600000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff0a000000feffffff0400000005000000060000000700000008000000090000000b0000000d0000000c0000000e000000110000000f00000010000000120000002c0000002d0000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e00 -00001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b000000fefffffffeffffff2e000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000a07a -5e7487e0d00103000000c01d0000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff05000000000000000000000000000000000000000000000090535e7487e0d001 -a07a5e7487e0d0010000000000000000000000004400d200c90032004f00510032003400d8004500c2005900de004d00cf004f00d300c200c100c0004b0041003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000090535e7487e0 -d001a07a5e7487e0d0010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 -000000000000000000000000000000000a0c0000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a00 -00001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000feffffff3200000033000000340000003500000036000000feffffff3800000039000000 -3a000000feffffff3c0000003d0000003e0000003f00000040000000feffffff42000000430000004400000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e0000004f00000050000000510000005200000053000000feffffff550000005600000057000000580000005900 -00005a0000005b000000feffffff5d0000005e0000005f000000feffffff6100000062000000630000006400000065000000feffffff6700000068000000690000006a0000006b0000006c0000006d0000006e0000006f00000070000000710000007200000073000000740000007500000076000000feffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c4c6f6e6750726f7065727469657320786d6c6e733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f666669 -63652f323030362f6d657461646174612f6c6f6e6750726f70657274696573223e3c4c6f6e6750726f7020786d6c6e733d2222206e616d653d2250726f70657274795f78303032305f426167223e3c215b43444154415b7674695f636f6e74656e7476657273696f6e697364697274793a42577c66616c73650d0a767469 -5f70617273657276657273696f6e3a53527c31342e302e302e363032390d0a4558543a53577c646f630d0a4f726465723a49577c3637323330300d0a7674695f636f6e74656e747461673a53577c7b37414136373534302d343634322d343445372d384342352d3131433437434443314233457d2c3133372c35310d0a5f -43617465676f72793a53577c0d0a524553504f4e53455f53454e4445525f4e414d453a53577c6741414164796137364239396434684c4755523172512b385478547630474745506469780d0a7674695f617574686f723a53527c454d45415c5c656d6964726530310d0a4e6f746573506172743a53577c4c45432d505245 -2d30303438392e646f630d0a53696465204c6574746572733a49577c300d0a7674695f63617465676f726965733a56577c0d0a48696464656e55706c6f61643a53577c0d0a50726f7065727479204261673a53577c7674695f636f6e74656e7476657273696f6e697364697274793a42577c66616c73655c725c6e767469 -5f70617273657276657273696f6e3a53527c31342e302e302e363032395c725c6e4558543a53577c646f635c725c6e4f726465723a49577c3637323330305c725c6e7674695f636f6e74656e747461673a53577c7b45443045303635312d303831342d344533382d423741412d3834373844334342463538467d2c313233 -2c34385c725c6e5f43617465676f72793a53577c5c725c6e524553504f4e53455f53454e4445525f4e414d453a53577c6741414164796137364239396434684c4755523172512b385478547630474745506469785c725c6e7674695f617574686f723a53527c0d0a5469746c653a53577c4c45432d5052452d3030343839 -207e2045554c4120666f7220434d5349532044656c6976657261626c65730d0a7674695f6d6f64696669656462793a53527c454d45415c5c656d6964726530310d0a7674695f61737369676e6564746f3a53527c0d0a4b6579776f7264733a53577c0d0a436f6d7075746564436f6d70616e793a53577c41524d2f0d0a43 -6f6d70757465644c523a53577c41502f0d0a437265617465643a53577c323031342d30322d31395431333a32363a34385a0d0a436f6e74656e745479706549643a53577c307830313031303030394135453436413142414235363438423443423131314343384143453237440d0a5f417574686f723a53577c0d0a436865 -636b20496e20436f6d6d656e743a53577c4d616a6f722056657273696f6e205075626c6973680d0a4e616d653a53577c4c45432d5052452d30303438390d0a5f436f6d6d656e74733a53577c0d0a436f6d6d656e74733a53577c0d0a446f634e756d6265723a53577c4c45432d5052452d30303438390d0a446f6d696e6f -20417574686f723a53577c0d0a4d41494c5f4d53475f4944323a53577c6335437874476e46534a724e5069464153377542612f4d64344d2f474b624c477a4c6e755455566c4c5568595047624d52684f6135524734766e375c725c6e527664486b6a54306a2b4b4277557958304a3054696a664165524d2f63392b336b57 -79676d513d3d0d0a7674695f73796e6375706461746568696464656e76657273696f6e3a49577c3133330d0a5375626a6563743a53577c0d0a646973706c61795f75726e5c3a736368656d61732d6d6963726f736f66742d636f6d5c3a6f66666963655c3a6f666669636523456469746f723a53577c456d696c79204472 -65610d0a437265617465642042793a53577c36323b23456d696c7920447265612c23454d45415c5c656d6964726530312c23456d696c792e447265614061726d2e636f6d2c232c23456d696c7920447265610d0a7674695f666f6c6465726974656d636f756e743a49527c300d0a4d41494c5f4d53475f4944313a53577c -41424141564f41666f5372516f7977567a2b6e3839526b483876636b4a683268583958314c65494a524c58706b682b5843744a6d7a4e52664964766344647443432b43570d0a4d6f6469666965643a53577c323031342d30362d30315432323a30303a35375a0d0a436f6d70757465644e756d6265723a53577c4c45432d -5052452d30303438392d56362e300d0a4d6f6469666965642042793a53577c36323b23456d696c7920447265612c23454d45415c5c656d6964726530312c23456d696c792e447265614061726d2e636f6d2c232c23456d696c7920447265610d0a7674695f617070726f76616c6c6576656c3a53527c0d0a446976697369 -6f6e3a53577c445347202870726576696f75736c79206b6e6f776e20617320534444290d0a48696464656e44656c6574653a53577c0d0a4e6f746573554e49443a53577c32383939374630443531443738304644383032353736433630303736363041310d0a7674695f666f6c646572737562666f6c6465726974656d63 -6f756e743a49527c300d0a5f5374617475733a53577c0d0a646973706c61795f75726e5c3a736368656d61732d6d6963726f736f66742d636f6d5c3a6f66666963655c3a6f666669636523417574686f723a53577c456d696c7920447265610d0a446f63547970653a53577c507265636564656e740d0a446f6d696e6f20 -56657273696f6e3a53577c0d0a454d41494c5f4f574e45525f414444524553533a53577c7341414155597479416b654e575234632f6879763833646a446467542f2f536c6652666a3079756c304e796d7535383d0d0a7674695f636163686564637573746f6d70726f70733a56587c5375626a65637420646973706c6179 -5f75726e3a736368656d61732d6d6963726f736f66742d636f6d3a6f66666963653a6f666669636523456469746f7220455854204d41494c5f4d53475f494431204f72646572205f43617465676f727920524553504f4e53455f53454e4445525f4e414d45204d6f64696669656420436f6d70757465644e756d62657220 -4e6f7465735061727420536964655c5c204c657474657273207674695f617070726f76616c6c6576656c207674695f63617465676f72696573204469766973696f6e2048696464656e44656c6574652048696464656e55706c6f6164204e6f746573554e49442050726f70657274795c5c20426167207674695f61737369 -676e6564746f204b6579776f726473205f53746174757320436f6d7075746564436f6d70616e7920436f6d70757465644c52204372656174656420646973706c61795f75726e3a736368656d61732d6d6963726f736f66742d636f6d3a6f66666963653a6f666669636523417574686f7220446f635479706520446f6d69 -6e6f5c5c2056657273696f6e20454d41494c5f4f574e45525f41444452455353207674695f7469746c65205f417574686f7220436865636b5c5c20496e5c5c20436f6d6d656e742046696c654c656166526566204e6f74657354696d655374616d70205f436f6d6d656e7473204e616d6520436f6d6d656e747320446f63 -4e756d62657220446f6d696e6f5c5c20417574686f72204d41494c5f4d53475f4944320d0a7674695f646f6373746f726576657273696f6e3a49527c3133370d0a7674695f6d657461696e666f76657273696f6e3a49577c3139350d0a7674695f636f6e74656e746368616e6765756e69743a53577c0d0a7674695f6361 -636865647469746c653a53527c4c45432d5052452d3030343839207e2045554c4120666f7220434d5349532044656c6976657261626c65730d0a7674695f7469746c653a53527c4c45432d5052452d3030343839207e2045554c4120666f7220434d5349532044656c6976657261626c65730d0a46696c654c6561665265 -663a53577c4c45432d5052452d30303438390d0a4e6f74657354696d655374616d703a53577c30332f31322f323031302032323a34303a33360d0a5d5d3e3c2f4c6f6e6750726f703e3c2f4c6f6e6750726f706572746965733e000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b33393543324130462d314530372d343845302d393846 -382d4342434543453238363032387d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572 -693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f6c6f6e6750726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d22222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f726549 -74656d3e00000000000000000000000000000000000000003c3f6d736f2d636f6e74656e74547970653f3e3c637573746f6d58736e20786d6c6e733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f500072006f007000650072007400690065007300000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000310000006c01000000000000c000d300c4004100c600d300da00da00c60055003400df00c5004100da00d100d000d300 -48005600d700d0003d003d000000000000000000000000000000000032000101020000000b000000060000000000000000000000000000000000000000000000a07a5e7487e0d001a07a5e7487e0d0010000000000000000000000004900740065006d000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000a000201ffffffff07000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000037000000d700000000000000500072006f007000650072007400690065007300000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000003b0000004e010000000000006d2f6f66666963652f323030362f6d657461646174612f637573746f6d58 -736e223e3c78736e4c6f636174696f6e3e3c2f78736e4c6f636174696f6e3e3c6361636865643e547275653c2f6361636865643e3c6f70656e427944656661756c743e46616c73653c2f6f70656e427944656661756c743e3c78736e53636f70653e3c2f78736e53636f70653e3c2f637573746f6d58736e3e0000000000 -0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b39423030 -333938332d424133452d343739392d424639342d3045423143333331443544467d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c -64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f637573746f6d58736e222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e0000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c703a70726f7065727469657320786d6c6e733a703d22687474703a2f2f736368656d61732e6d6963726f736f66 -742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732220786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612d696e7374616e63652220786d6c6e733a70633d22687474703a2f2f736368656d61732e6d6963726f736f66 -742e636f6d2f6f66666963652f696e666f706174682f323030372f506172746e6572436f6e74726f6c73223e3c646f63756d656e744d616e6167656d656e743e3c446f634e756d62657220786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e4c45432d5052 -452d30303438393c2f446f634e756d6265723e3c446f6d696e6f5f78303032305f56657273696f6e20786d6c6e733d2232656334313736362d353237652d346338342d623438342d64663366323539396664306122207873693a6e696c3d2274727565222f3e3c4e6f74657354696d65c000dc00d800c1004300c500c700 -c400d100c40053003200df004e004e005100d200ca004500cc00560051003d003d000000000000000000000000000000000032000100ffffffffffffffff090000000000000000000000000000000000000000000000a07a5e7487e0d001a07a5e7487e0d0010000000000000000000000004900740065006d0000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0a000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000041000000b304000000000000500072006f0070006500 -72007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000054000000e601000000000000cb004600ce003200 -49004200d3005900ca005500ca0030003000d000c00054003400d200c100db00dd00d0003d003d000000000000000000000000000000000032000101080000000e0000000c0000000000000000000000000000000000000000000000a07a5e7487e0d001a07a5e7487e0d0010000000000000000000000005374616d7020 -786d6c6e733d2232656334313736362d353237652d346338342d623438342d64663366323539396664306122207873693a6e696c3d2274727565222f3e3c4e6f7465735061727420786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e4c45432d5052452d30 -303438392e646f633c2f4e6f746573506172743e3c45585420786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e646f633c2f4558543e3c4469766973696f6e20786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235 -393966643061223e445347202870726576696f75736c79206b6e6f776e20617320534444293c2f4469766973696f6e3e3c536964655f78303032305f4c65747465727320786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e303c2f536964655f7830303230 -5f4c6574746572733e3c436f6d6d656e747320786d6c6e733d2232656334313736362d353237652d346338342d623438342d64663366323539396664306122207873693a6e696c3d2274727565222f3e3c4e6f746573554e494420786d6c6e733d2232656334313736362d353237652d346338342d623438342d64663366 -3235393966643061223e32383939374630443531443738304644383032353736433630303736363041313c2f4e6f746573554e49443e3c446f6d696e6f5f78303032305f417574686f7220786d6c6e733d2232656334313736362d353237652d346338342d623438342d64663366323539396664306122207873693a6e69 -6c3d2274727565222f3e3c446f635479706520786d6c6e733d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e507265636564656e743c2f446f63547970653e3c2f646f63756d656e744d616e6167656d656e743e3c2f703a70726f706572746965733e00000000000000 -0000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b30413231434538332d453435392d343443362d394346432d44333530434141313243 -35357d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7363 -68656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e666f706174682f323030372f -506172746e6572436f6e74726f6c73222f3e3c64733a736368656d615265662064733a7572693d2232656334313736362d353237652d346338342d623438342d646633663235393966643061222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e000000000000000000000000 -00000000000000000000000000003c3f6d736f2d636f6e74656e74547970653f3e3c466f726d54656d706c6174657320786d6c6e733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f636f6e74656e74747970652f666f726d73223e3c446973706c61793e -446f63756d656e744c696272617279466f726d3c2f446973706c61793e3c456469743e446f63756d656e744c696272617279466f726d3c2f456469743e3c4e65773e446f63756d656e744c696272617279466f726d3c2f4e65773e3c2f466f726d54656d706c617465733e00000000000000000000000000000000000000 -0000000000000000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0d000000ffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000005c000000db00000000000000500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -00000000000000000000600000004f01000000000000dd00df0050004500ce003200cf004d00d600d4004300df00c800c9004300cb003300dd00c6004f00cd00c0003d003d000000000000000000000000000000000032000100ffffffffffffffff0f0000000000000000000000000000000000000000000000a07a5e74 -87e0d001a07a5e7487e0d0010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff10000000ffffffff00000000000000000000000000000000000000000000 -00000000000000000000000000001300000016310000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b32303943354241432d443831432d -344141392d394136422d3038313337423238374246377d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d6152 -65662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f636f6e74656e74747970652f666f726d73222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e0000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b4239433446334637 -2d434343422d343044422d424641322d3930414237374439384542367d2220786d6c3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c63743a636f6e74656e7454797065536368656d612063743a5f3d2222206d613a5f3d2222206d613a636f6e74656e74547970654e61 -6d653d22446f63756d656e7422206d613a636f6e74656e745479706549443d223078303130313030303941354534364131424142353634384234434231313143433841434532374422206d613a636f6e74656e745479706556657273696f6e3d22343122206d613a636f6e74656e74547970654465736372697074696f6e -3d224372656174652061206e657720646f63756d656e742e22206d613a636f6e74656e745479706553636f70653d2222206d613a76657273696f6e49443d2239626433656238363438633235356336303133626362616536616239636236612220786d6c6e733a63743d22687474703a2f2f736368656d61732e6d696372 -6f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e74547970652220786d6c6e733a6d613d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732f6d65746141747472696275 -746573223e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f7065727469657322206d613a726f6f743d227472756522206d613a6669656c647349443d22 -393637663537656361366533626638633435623136343161643237363161636522206e73323a5f3d222220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a78733d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c5363 -68656d612220786d6c6e733a703d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732220786d6c6e733a6e73323d2232656334313736362d353237652d346338342d623438342d646633663235393966643061223e -0d0a3c7873643a696d706f7274206e616d6573706163653d2232656334313736362d353237652d346338342d623438342d646633663235393966643061222f3e0d0a3c7873643a656c656d656e74206e616d653d2270726f70657274696573223e0d0a3c7873643a636f6d706c6578547970653e0d0a3c7873643a736571 -75656e63653e0d0a3c7873643a656c656d656e74206e616d653d22646f63756d656e744d616e6167656d656e74223e0d0a3c7873643a636f6d706c6578547970653e0d0a3c7873643a616c6c3e0d0a3c7873643a656c656d656e74207265663d226e73323a45585422206d696e4f63637572733d2230222f3e0d0a3c7873 -643a656c656d656e74207265663d226e73323a446f635479706522206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4469766973696f6e22206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a436f6d6d656e74732220 -6d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a446f6d696e6f5f78303032305f56657273696f6e22206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a446f6d696e6f5f78303032305f417574686f7222206d696e4f63 -637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a446f634e756d62657222206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4e6f746573554e494422206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e742072 -65663d226e73323a4e6f74657354696d655374616d7022206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4e6f7465735061727422206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a536964655f78303032305f4c65 -747465727322206d696e4f63637572733d2230222f3e0d0a3c2f7873643a616c6c3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c2f7873643a73657175656e63653e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c -2f7873643a736368656d613e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d2232656334313736362d353237652d346338342d623438342d6466336632353939666430612220656c656d656e74466f726d44656661756c743d227175616c69666965642220786d6c6e733a7873643d22687474 -703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a78733d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a646d733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f32303036 -2f646f63756d656e744d616e6167656d656e742f74797065732220786d6c6e733a70633d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e666f706174682f323030372f506172746e6572436f6e74726f6c73223e0d0a3c7873643a696d706f7274206e616d6573706163 -653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f646f63756d656e744d616e6167656d656e742f7479706573222f3e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f -66666963652f696e666f706174682f323030372f506172746e6572436f6e74726f6c73222f3e0d0a3c7873643a656c656d656e74206e616d653d2245585422206d613a696e6465783d223122206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d2245585422206d613a646573637269707469 -6f6e3d2246696c6520457874656e73696f6e22206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d2245585422206d613a726561644f6e6c793d2266616c7365223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a -54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d223130222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d22446f635479706522206d613a696e64 -65783d223222206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d22446f635479706522206d613a64656661756c743d22507265636564656e7422206d613a666f726d61743d2244726f70646f776e22206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d22 -446f635479706522206d613a726561644f6e6c793d2266616c7365223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a43686f696365223e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22507265636564656e74222f3e0d0a3c78 -73643a656e756d65726174696f6e2076616c75653d2253696465204c6574746572202d20537562222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224469766973696f6e -22206d613a696e6465783d223422206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224469766973696f6e22206d613a666f726d61743d2244726f70646f776e22206d613a696e7465726e616c4e616d653d224469766973696f6e223e0d0a3c7873643a73696d706c65547970653e0d0a3c -7873643a7265737472696374696f6e20626173653d22646d733a43686f696365223e0d0a3c7873643a656e756d65726174696f6e2076616c75653d2241726368697665222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22415344222f3e0d0a3c7873643a656e756d65726174696f6e2076616c7565 -3d22415550222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22436f6d70616e792041646d696e222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22436f72706f72617465222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22446174612050726f74656374 -696f6e222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22446576656c6f706d656e742053797374656d73222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22454441222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22466163696c6974696573222f3e0d -0a3c7873643a656e756d65726174696f6e2076616c75653d224852222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d2248522032222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d224954222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22496e74657263 -6f6d70616e79204d617474657273222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d224c6567616c204f7065726174696f6e73222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d224d26616d703b41222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225061 -74656e7473222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225044202d20417263686974656374757265222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225044202d20436f726573222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22504420e2809320 -435353222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225044202d204d5044222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d2250444547222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22504445472046726565204c69627261727920416e6e657865 -73222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22504445472046726565204c69627261727920436f6e747261637473222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d2250495044222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d2250495044204672 -6565204c69627261727920416e6e65786573222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22504950442046726565204c69627261727920436f6e747261637473222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22534444222f3e0d0a3c7873643a656e756d65726174696f -6e2076616c75653d22535344222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d224d61726b6574696e67222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225044202d204661627269632028617070726f76616c20726571756972656420627920436f6e74726163742d61707072 -6f76616c2d504429222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225374616e6461726473222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225275737369616e207472616e73616374696f6e73222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225765 -627369746520506f6c6963696573222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225472616465204d61726b73222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22496f54204255222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225045472028707265 -76696f75736c792041534429222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d224d5047202870726576696f75736c79206b6e6f776e206173205044202d204d504429222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22435047202870726576696f75736c79206b6e6f776e20 -617320e2809c5044202d20436f72657329222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22445347202870726576696f75736c79206b6e6f776e2061732053444429222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22415447202870726576696f75736c79206b6e6f776e20 -6173205044202d2041726368697465637475726529222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d22535347202d2053797374656d20495020616e6420436f72655369676874202870726576696f75736c79206b6e6f776e206173205044202d2046616272696329222f3e0d0a3c7873643a656e75 -6d65726174696f6e2076616c75653d22535347222f3e0d0a3c7873643a656e756d65726174696f6e2076616c75653d225226616d703b44222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e -74206e616d653d22436f6d6d656e747322206d613a696e6465783d223522206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d22436f6d6d656e747322206d613a696e7465726e616c4e616d653d22436f6d6d656e7473223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a72 -65737472696374696f6e20626173653d22646d733a4e6f7465223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74 -206e616d653d22446f6d696e6f5f78303032305f56657273696f6e22206d613a696e6465783d223622206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d22446f6d696e6f2056657273696f6e22206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d22446f -6d696e6f5f78303032305f56657273696f6e22206d613a726561644f6e6c793d2266616c7365223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d65 -6e743e0d0a3c7873643a656c656d656e74206e616d653d22446f6d696e6f5f78303032305f417574686f7222206d613a696e6465783d223722206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d22446f6d696e6f20417574686f7222206d613a68696464656e3d227472756522206d613a69 -6e7465726e616c4e616d653d22446f6d696e6f5f78303032305f417574686f7222206d613a726561644f6e6c793d2266616c7365223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874222f3e0d0a3c2f7873643a73696d706c6554797065 -3e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d22446f634e756d62657222206d613a696e6465783d223822206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d22446f634e756d62657222206d613a68696464656e3d227472756522206d613a69 -6e7465726e616c4e616d653d22446f634e756d62657222206d613a726561644f6e6c793d2266616c7365223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a65 -6c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224e6f746573554e494422206d613a696e6465783d22313422206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224e6f746573554e494422206d613a68696464656e3d227472756522206d613a696e7465726e616c4e61 -6d653d224e6f746573554e4944223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224e -6f74657354696d655374616d7022206d613a696e6465783d22313522206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224e6f74657354696d655374616d7022206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d224e6f74657354696d655374616d7022 -3e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a4461746554696d65222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224e6f746573506172742220 -6d613a696e6465783d22313622206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224e6f7465735061727422206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d224e6f74657350617274223e0d0a3c7873643a73696d706c65547970653e0d0a3c787364 -3a7265737472696374696f6e20626173653d22646d733a54657874222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d22536964655f78303032305f4c65747465727322206d613a696e6465783d22313822206e696c6c6162 -6c653d227472756522206d613a646973706c61794e616d653d2253696465204c65747465727322206d613a64656661756c743d223022206d613a68696464656e3d227472756522206d613a696e7465726e616c4e616d653d22536964655f78303032305f4c65747465727322206d613a726561644f6e6c793d2266616c73 -6522206d613a70657263656e746167653d2246414c5345223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a4e756d626572222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c2f7873643a7363 -68656d613e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f706572746965732220656c656d656e74466f726d44656661756c -743d227175616c69666965642220617474726962757465466f726d44656661756c743d22756e7175616c69666965642220626c6f636b44656661756c743d2223616c6c2220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d6574 -61646174612f636f72652d70726f706572746965732220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612d696e7374616e63652220786d6c6e -733a64633d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220786d6c6e733a64637465726d733d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220786d6c6e733a6f646f633d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f696e74 -65726e616c2f6f6264223e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220736368656d614c6f636174696f6e3d22687474703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f32 -3030332f30342f30322f64632e787364222f3e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220736368656d614c6f636174696f6e3d22687474703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f -323030332f30342f30322f64637465726d732e787364222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f726550726f706572746965732220747970653d2243545f636f726550726f70657274696573222f3e0d0a3c7873643a636f6d706c657854797065206e616d653d2243545f636f726550726f706572 -74696573223e0d0a3c7873643a616c6c3e0d0a3c7873643a656c656d656e74207265663d2264633a63726561746f7222206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264637465726d733a6372656174656422206d696e4f63637572733d22 -3022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6964656e74696669657222206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f6e74656e745479706522206d696e4f63637572733d -223022206d61784f63637572733d22312220747970653d227873643a737472696e6722206d613a696e6465783d223922206d613a646973706c61794e616d653d22436f6e74656e742054797065222f3e0d0a3c7873643a656c656d656e74207265663d2264633a7469746c6522206d696e4f63637572733d223022206d61 -784f63637572733d223122206d613a696e6465783d223322206d613a646973706c61794e616d653d225469746c65222f3e0d0a3c7873643a656c656d656e74207265663d2264633a7375626a65637422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e742072 -65663d2264633a6465736372697074696f6e22206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d226b6579776f72647322206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f -3e0d0a3c7873643a656c656d656e74207265663d2264633a6c616e677561676522206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d2263617465676f727922206d696e4f63637572733d223022206d61784f63637572733d2231222074797065 -3d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d2276657273696f6e22206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d227265766973696f6e22206d696e -4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67223e0d0a3c7873643a616e6e6f746174696f6e3e0d0a3c7873643a646f63756d656e746174696f6e3e0d0a202020202020202020202020202020202020202020202020546869732076616c756520696e6469636174 -657320746865206e756d626572206f66207361766573206f72207265766973696f6e732e20546865206170706c69636174696f6e20697320726573706f6e7369626c6520666f72207570646174696e6720746869732076616c75652061667465722065616368207265766973696f6e2e0d0a202020202020202020202020 -20202020202020203c2f7873643a646f63756d656e746174696f6e3e0d0a3c2f7873643a616e6e6f746174696f6e3e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d226c6173744d6f646966696564427922206d696e4f63637572733d223022206d61784f63637572733d2231 -2220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74207265663d2264637465726d733a6d6f64696669656422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f6e74656e7453746174757322206d69 -6e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c2f7873643a616c6c3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a736368656d613e0d0a3c78733a736368656d61207461726765744e616d6573706163653d2268747470 -3a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e666f706174682f323030372f506172746e6572436f6e74726f6c732220656c656d656e74466f726d44656661756c743d227175616c69666965642220617474726962757465466f726d44656661756c743d22756e7175616c69666965 -642220786d6c6e733a70633d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e666f706174682f323030372f506172746e6572436f6e74726f6c732220786d6c6e733a78733d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61223e0d0a -3c78733a656c656d656e74206e616d653d22506572736f6e223e0d0a3c78733a636f6d706c6578547970653e0d0a3c78733a73657175656e63653e0d0a3c78733a656c656d656e74207265663d2270633a446973706c61794e616d6522206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c7873 -3a656c656d656e74207265663d2270633a4163636f756e74496422206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74207265663d2270633a4163636f756e745479706522206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c2f78733a7365 -7175656e63653e0d0a3c2f78733a636f6d706c6578547970653e0d0a3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d22446973706c61794e616d652220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d224163 -636f756e7449642220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d224163636f756e74547970652220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d2242444341 -73736f636961746564456e74697479223e0d0a3c78733a636f6d706c6578547970653e0d0a3c78733a73657175656e63653e0d0a3c78733a656c656d656e74207265663d2270633a424443456e7469747922206d696e4f63637572733d223022206d61784f63637572733d22756e626f756e646564223e3c2f78733a656c -656d656e743e0d0a3c2f78733a73657175656e63653e0d0a3c78733a617474726962757465207265663d2270633a456e746974794e616d657370616365223e3c2f78733a6174747269627574653e0d0a3c78733a617474726962757465207265663d2270633a456e746974794e616d65223e3c2f78733a61747472696275 -74653e0d0a3c78733a617474726962757465207265663d2270633a53797374656d496e7374616e63654e616d65223e3c2f78733a6174747269627574653e0d0a3c78733a617474726962757465207265663d2270633a4173736f63696174696f6e4e616d65223e3c2f78733a6174747269627574653e0d0a3c2f78733a63 -6f6d706c6578547970653e0d0a3c2f78733a656c656d656e743e0d0a3c78733a617474726962757465206e616d653d22456e746974794e616d6573706163652220747970653d2278733a737472696e67223e3c2f78733a6174747269627574653e0d0a3c78733a617474726962757465206e616d653d22456e746974794e -616d652220747970653d2278733a737472696e67223e3c2f78733a6174747269627574653e0d0a3c78733a617474726962757465206e616d653d2253797374656d496e7374616e63654e616d652220747970653d2278733a737472696e67223e3c2f78733a6174747269627574653e0d0a3c78733a617474726962757465 -206e616d653d224173736f63696174696f6e4e616d652220747970653d2278733a737472696e67223e3c2f78733a6174747269627574653e0d0a3c78733a656c656d656e74206e616d653d22424443456e74697479223e0d0a3c78733a636f6d706c6578547970653e0d0a3c78733a73657175656e63653e0d0a3c78733a -656c656d656e74207265663d2270633a456e74697479446973706c61794e616d6522206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74207265663d2270633a456e74697479496e7374616e63655265666572656e636522206d696e4f63637572733d2230223e3c2f78 -733a656c656d656e743e0d0a3c78733a656c656d656e74207265663d2270633a456e7469747949643122206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74207265663d2270633a456e7469747949643222206d696e4f63637572733d2230223e3c2f78733a656c656d -656e743e0d0a3c78733a656c656d656e74207265663d2270633a456e7469747949643322206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74207265663d2270633a456e7469747949643422206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a -3c78733a656c656d656e74207265663d2270633a456e7469747949643522206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c2f78733a73657175656e63653e0d0a3c2f78733a636f6d706c6578547970653e0d0a3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d65 -3d22456e74697479446973706c61794e616d652220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d22456e74697479496e7374616e63655265666572656e63652220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e -0d0a3c78733a656c656d656e74206e616d653d22456e746974794964312220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d22456e746974794964322220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78 -733a656c656d656e74206e616d653d22456e746974794964332220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d22456e746974794964342220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c -656d656e74206e616d653d22456e746974794964352220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d225465726d73223e0d0a3c78733a636f6d706c6578547970653e0d0a3c78733a73657175656e63653e0d0a3c78733a656c656d656e74 -207265663d2270633a5465726d496e666f22206d696e4f63637572733d223022206d61784f63637572733d22756e626f756e646564223e3c2f78733a656c656d656e743e0d0a3c2f78733a73657175656e63653e0d0a3c2f78733a636f6d706c6578547970653e0d0a3c2f78733a656c656d656e743e0d0a3c78733a656c -656d656e74206e616d653d225465726d496e666f223e0d0a3c78733a636f6d706c6578547970653e0d0a3c78733a73657175656e63653e0d0a3c78733a656c656d656e74207265663d2270633a5465726d4e616d6522206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e -74207265663d2270633a5465726d496422206d696e4f63637572733d2230223e3c2f78733a656c656d656e743e0d0a3c2f78733a73657175656e63653e0d0a3c2f78733a636f6d706c6578547970653e0d0a3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d225465726d4e616d65222074 -7970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c78733a656c656d656e74206e616d653d225465726d49642220747970653d2278733a737472696e67223e3c2f78733a656c656d656e743e0d0a3c2f78733a736368656d613e0d0a3c2f63743a636f6e74656e7454797065536368656d613e -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500072006f00700065007200740069006500 -7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000066000000400400000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e733a64733d22687474 -703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f -6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e7454797065222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732f6d6574614174 -7472696275746573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f -323030362f6d657461646174612f70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d2232656334313736362d353237652d346338342d623438342d646633663235393966643061222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d -6963726f736f66742e636f6d2f6f66666963652f323030362f646f63756d656e744d616e6167656d656e742f7479706573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e666f706174682f323030372f5061 -72746e6572436f6e74726f6c73222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f70657274696573222f3e3c64733a736368656d6152656620 -64733a7572693d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f73636865 -6d61732e6d6963726f736f66742e636f6d2f696e7465726e616c2f6f6264222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -0000000000000105000000000000}} \ No newline at end of file diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt deleted file mode 100644 index a0f9102..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_class_marks_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c deleted file mode 100644 index 567019f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/ARM/arm_class_marks_example_f32.c +++ /dev/null @@ -1,211 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_class_marks_example_f32.c -* -* Description: Example code to calculate Minimum, Maximum -* Mean, std and variance of marks obtained in a class -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup ClassMarks Class Marks Example - * - * \par Description: - * \par - * Demonstrates the use the Maximum, Minimum, Mean, Standard Deviation, Variance - * and Matrix functions to calculate statistical values of marks obtained in a class. - * - * \note This example also demonstrates the usage of static initialization. - * - * \par Variables Description: - * \par - * \li \c testMarks_f32 points to the marks scored by 20 students in 4 subjects - * \li \c max_marks Maximum of all marks - * \li \c min_marks Minimum of all marks - * \li \c mean Mean of all marks - * \li \c var Variance of the marks - * \li \c std Standard deviation of the marks - * \li \c numStudents Total number of students in the class - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_mat_init_f32() - * - arm_mat_mult_f32() - * - arm_max_f32() - * - arm_min_f32() - * - arm_mean_f32() - * - arm_std_f32() - * - arm_var_f32() - * - * Refer - * \link arm_class_marks_example_f32.c \endlink - * - */ - - -/** \example arm_class_marks_example_f32.c - */ -#include "arm_math.h" - -#define USE_STATIC_INIT - - /* ---------------------------------------------------------------------- -** Global defines -** ------------------------------------------------------------------- */ - -#define TEST_LENGTH_SAMPLES (20*4) - -/* ---------------------------------------------------------------------- -** List of Marks scored by 20 students for 4 subjects -** ------------------------------------------------------------------- */ -const float32_t testMarks_f32[TEST_LENGTH_SAMPLES] = -{ - 42.000000, 37.000000, 81.000000, 28.000000, - 83.000000, 72.000000, 36.000000, 38.000000, - 32.000000, 51.000000, 63.000000, 64.000000, - 97.000000, 82.000000, 95.000000, 90.000000, - 66.000000, 51.000000, 54.000000, 42.000000, - 67.000000, 56.000000, 45.000000, 57.000000, - 67.000000, 69.000000, 35.000000, 52.000000, - 29.000000, 81.000000, 58.000000, 47.000000, - 38.000000, 76.000000, 100.000000, 29.000000, - 33.000000, 47.000000, 29.000000, 50.000000, - 34.000000, 41.000000, 61.000000, 46.000000, - 52.000000, 50.000000, 48.000000, 36.000000, - 47.000000, 55.000000, 44.000000, 40.000000, - 100.000000, 94.000000, 84.000000, 37.000000, - 32.000000, 71.000000, 47.000000, 77.000000, - 31.000000, 50.000000, 49.000000, 35.000000, - 63.000000, 67.000000, 40.000000, 31.000000, - 29.000000, 68.000000, 61.000000, 38.000000, - 31.000000, 28.000000, 28.000000, 76.000000, - 55.000000, 33.000000, 29.000000, 39.000000 -}; - - -/* ---------------------------------------------------------------------- -* Number of subjects X 1 -* ------------------------------------------------------------------- */ -const float32_t testUnity_f32[4] = -{ - 1.000, 1.000, 1.000, 1.000 -}; - - -/* ---------------------------------------------------------------------- -** f32 Output buffer -** ------------------------------------------------------------------- */ -static float32_t testOutput[TEST_LENGTH_SAMPLES]; - - -/* ------------------------------------------------------------------ -* Global defines -*------------------------------------------------------------------- */ -#define NUMSTUDENTS 20 -#define NUMSUBJECTS 4 - -/* ------------------------------------------------------------------ -* Global variables -*------------------------------------------------------------------- */ - - uint32_t numStudents = 20; - uint32_t numSubjects = 4; -float32_t max_marks, min_marks, mean, std, var; - uint32_t student_num; - -/* ---------------------------------------------------------------------------------- -* Main f32 test function. It returns maximum marks secured and student number -* ------------------------------------------------------------------------------- */ - -int32_t main() -{ - -#ifndef USE_STATIC_INIT - - arm_matrix_instance_f32 srcA; - arm_matrix_instance_f32 srcB; - arm_matrix_instance_f32 dstC; - - /* Input and output matrices initializations */ - arm_mat_init_f32(&srcA, numStudents, numSubjects, (float32_t *)testMarks_f32); - arm_mat_init_f32(&srcB, numSubjects, 1, (float32_t *)testUnity_f32); - arm_mat_init_f32(&dstC, numStudents, 1, testOutput); - -#else - - /* Static Initializations of Input and output matrix sizes and array */ - arm_matrix_instance_f32 srcA = {NUMSTUDENTS, NUMSUBJECTS, (float32_t *)testMarks_f32}; - arm_matrix_instance_f32 srcB = {NUMSUBJECTS, 1, (float32_t *)testUnity_f32}; - arm_matrix_instance_f32 dstC = {NUMSTUDENTS, 1, testOutput}; - -#endif - - - /* ---------------------------------------------------------------------- - *Call the Matrix multiplication process function - * ------------------------------------------------------------------- */ - arm_mat_mult_f32(&srcA, &srcB, &dstC); - - /* ---------------------------------------------------------------------- - ** Call the Max function to calculate max marks among numStudents - ** ------------------------------------------------------------------- */ - arm_max_f32(testOutput, numStudents, &max_marks, &student_num); - - /* ---------------------------------------------------------------------- - ** Call the Min function to calculate min marks among numStudents - ** ------------------------------------------------------------------- */ - arm_min_f32(testOutput, numStudents, &min_marks, &student_num); - - /* ---------------------------------------------------------------------- - ** Call the Mean function to calculate mean - ** ------------------------------------------------------------------- */ - arm_mean_f32(testOutput, numStudents, &mean); - - /* ---------------------------------------------------------------------- - ** Call the std function to calculate standard deviation - ** ------------------------------------------------------------------- */ - arm_std_f32(testOutput, numStudents, &std); - - /* ---------------------------------------------------------------------- - ** Call the var function to calculate variance - ** ------------------------------------------------------------------- */ - arm_var_f32(testOutput, numStudents, &var); - - while(1); /* main function does not return */ -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt deleted file mode 100644 index a0f9102..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_class_marks_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c deleted file mode 100644 index 567019f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_class_marks_example/GCC/arm_class_marks_example_f32.c +++ /dev/null @@ -1,211 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_class_marks_example_f32.c -* -* Description: Example code to calculate Minimum, Maximum -* Mean, std and variance of marks obtained in a class -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup ClassMarks Class Marks Example - * - * \par Description: - * \par - * Demonstrates the use the Maximum, Minimum, Mean, Standard Deviation, Variance - * and Matrix functions to calculate statistical values of marks obtained in a class. - * - * \note This example also demonstrates the usage of static initialization. - * - * \par Variables Description: - * \par - * \li \c testMarks_f32 points to the marks scored by 20 students in 4 subjects - * \li \c max_marks Maximum of all marks - * \li \c min_marks Minimum of all marks - * \li \c mean Mean of all marks - * \li \c var Variance of the marks - * \li \c std Standard deviation of the marks - * \li \c numStudents Total number of students in the class - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_mat_init_f32() - * - arm_mat_mult_f32() - * - arm_max_f32() - * - arm_min_f32() - * - arm_mean_f32() - * - arm_std_f32() - * - arm_var_f32() - * - * Refer - * \link arm_class_marks_example_f32.c \endlink - * - */ - - -/** \example arm_class_marks_example_f32.c - */ -#include "arm_math.h" - -#define USE_STATIC_INIT - - /* ---------------------------------------------------------------------- -** Global defines -** ------------------------------------------------------------------- */ - -#define TEST_LENGTH_SAMPLES (20*4) - -/* ---------------------------------------------------------------------- -** List of Marks scored by 20 students for 4 subjects -** ------------------------------------------------------------------- */ -const float32_t testMarks_f32[TEST_LENGTH_SAMPLES] = -{ - 42.000000, 37.000000, 81.000000, 28.000000, - 83.000000, 72.000000, 36.000000, 38.000000, - 32.000000, 51.000000, 63.000000, 64.000000, - 97.000000, 82.000000, 95.000000, 90.000000, - 66.000000, 51.000000, 54.000000, 42.000000, - 67.000000, 56.000000, 45.000000, 57.000000, - 67.000000, 69.000000, 35.000000, 52.000000, - 29.000000, 81.000000, 58.000000, 47.000000, - 38.000000, 76.000000, 100.000000, 29.000000, - 33.000000, 47.000000, 29.000000, 50.000000, - 34.000000, 41.000000, 61.000000, 46.000000, - 52.000000, 50.000000, 48.000000, 36.000000, - 47.000000, 55.000000, 44.000000, 40.000000, - 100.000000, 94.000000, 84.000000, 37.000000, - 32.000000, 71.000000, 47.000000, 77.000000, - 31.000000, 50.000000, 49.000000, 35.000000, - 63.000000, 67.000000, 40.000000, 31.000000, - 29.000000, 68.000000, 61.000000, 38.000000, - 31.000000, 28.000000, 28.000000, 76.000000, - 55.000000, 33.000000, 29.000000, 39.000000 -}; - - -/* ---------------------------------------------------------------------- -* Number of subjects X 1 -* ------------------------------------------------------------------- */ -const float32_t testUnity_f32[4] = -{ - 1.000, 1.000, 1.000, 1.000 -}; - - -/* ---------------------------------------------------------------------- -** f32 Output buffer -** ------------------------------------------------------------------- */ -static float32_t testOutput[TEST_LENGTH_SAMPLES]; - - -/* ------------------------------------------------------------------ -* Global defines -*------------------------------------------------------------------- */ -#define NUMSTUDENTS 20 -#define NUMSUBJECTS 4 - -/* ------------------------------------------------------------------ -* Global variables -*------------------------------------------------------------------- */ - - uint32_t numStudents = 20; - uint32_t numSubjects = 4; -float32_t max_marks, min_marks, mean, std, var; - uint32_t student_num; - -/* ---------------------------------------------------------------------------------- -* Main f32 test function. It returns maximum marks secured and student number -* ------------------------------------------------------------------------------- */ - -int32_t main() -{ - -#ifndef USE_STATIC_INIT - - arm_matrix_instance_f32 srcA; - arm_matrix_instance_f32 srcB; - arm_matrix_instance_f32 dstC; - - /* Input and output matrices initializations */ - arm_mat_init_f32(&srcA, numStudents, numSubjects, (float32_t *)testMarks_f32); - arm_mat_init_f32(&srcB, numSubjects, 1, (float32_t *)testUnity_f32); - arm_mat_init_f32(&dstC, numStudents, 1, testOutput); - -#else - - /* Static Initializations of Input and output matrix sizes and array */ - arm_matrix_instance_f32 srcA = {NUMSTUDENTS, NUMSUBJECTS, (float32_t *)testMarks_f32}; - arm_matrix_instance_f32 srcB = {NUMSUBJECTS, 1, (float32_t *)testUnity_f32}; - arm_matrix_instance_f32 dstC = {NUMSTUDENTS, 1, testOutput}; - -#endif - - - /* ---------------------------------------------------------------------- - *Call the Matrix multiplication process function - * ------------------------------------------------------------------- */ - arm_mat_mult_f32(&srcA, &srcB, &dstC); - - /* ---------------------------------------------------------------------- - ** Call the Max function to calculate max marks among numStudents - ** ------------------------------------------------------------------- */ - arm_max_f32(testOutput, numStudents, &max_marks, &student_num); - - /* ---------------------------------------------------------------------- - ** Call the Min function to calculate min marks among numStudents - ** ------------------------------------------------------------------- */ - arm_min_f32(testOutput, numStudents, &min_marks, &student_num); - - /* ---------------------------------------------------------------------- - ** Call the Mean function to calculate mean - ** ------------------------------------------------------------------- */ - arm_mean_f32(testOutput, numStudents, &mean); - - /* ---------------------------------------------------------------------- - ** Call the std function to calculate standard deviation - ** ------------------------------------------------------------------- */ - arm_std_f32(testOutput, numStudents, &std); - - /* ---------------------------------------------------------------------- - ** Call the var function to calculate variance - ** ------------------------------------------------------------------- */ - arm_var_f32(testOutput, numStudents, &var); - - while(1); /* main function does not return */ -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt deleted file mode 100644 index debd837..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_convolution_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c deleted file mode 100644 index 89e7fef..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/arm_convolution_example_f32.c +++ /dev/null @@ -1,247 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_convolution_example_f32.c -* -* Description: Example code demonstrating Convolution of two input signals using fft. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup ConvolutionExample Convolution Example - * - * \par Description: - * \par - * Demonstrates the convolution theorem with the use of the Complex FFT, Complex-by-Complex - * Multiplication, and Support Functions. - * - * \par Algorithm: - * \par - * The convolution theorem states that convolution in the time domain corresponds to - * multiplication in the frequency domain. Therefore, the Fourier transform of the convoution of - * two signals is equal to the product of their individual Fourier transforms. - * The Fourier transform of a signal can be evaluated efficiently using the Fast Fourier Transform (FFT). - * \par - * Two input signals, a[n] and b[n], with lengths \c n1 and \c n2 respectively, - * are zero padded so that their lengths become \c N, which is greater than or equal to (n1+n2-1) - * and is a power of 4 as FFT implementation is radix-4. - * The convolution of a[n] and b[n] is obtained by taking the FFT of the input - * signals, multiplying the Fourier transforms of the two signals, and taking the inverse FFT of - * the multiplied result. - * \par - * This is denoted by the following equations: - *
 A[k] = FFT(a[n],N)
- * B[k] = FFT(b[n],N)
- * conv(a[n], b[n]) = IFFT(A[k] * B[k], N)
- * where A[k] and B[k] are the N-point FFTs of the signals a[n] - * and b[n] respectively. - * The length of the convolved signal is (n1+n2-1). - * - * \par Block Diagram: - * \par - * \image html Convolution.gif - * - * \par Variables Description: - * \par - * \li \c testInputA_f32 points to the first input sequence - * \li \c srcALen length of the first input sequence - * \li \c testInputB_f32 points to the second input sequence - * \li \c srcBLen length of the second input sequence - * \li \c outLen length of convolution output sequence, (srcALen + srcBLen - 1) - * \li \c AxB points to the output array where the product of individual FFTs of inputs is stored. - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_fill_f32() - * - arm_copy_f32() - * - arm_cfft_radix4_init_f32() - * - arm_cfft_radix4_f32() - * - arm_cmplx_mult_cmplx_f32() - * - * Refer - * \link arm_convolution_example_f32.c \endlink - * - */ - - -/** \example arm_convolution_example_f32.c - */ - -#include "arm_math.h" -#include "math_helper.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 128 -#define DELTA (0.000001f) -#define SNR_THRESHOLD 90 - -/* ---------------------------------------------------------------------- -* Declare I/O buffers -* ------------------------------------------------------------------- */ -float32_t Ak[MAX_BLOCKSIZE]; /* Input A */ -float32_t Bk[MAX_BLOCKSIZE]; /* Input B */ -float32_t AxB[MAX_BLOCKSIZE * 2]; /* Output */ - -/* ---------------------------------------------------------------------- -* Test input data for Floating point Convolution example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ -float32_t testInputA_f32[64] = -{ - -0.808920, 1.357369, 1.180861, -0.504544, 1.762637, -0.703285, - 1.696966, 0.620571, -0.151093, -0.100235, -0.872382, -0.403579, - -0.860749, -0.382648, -1.052338, 0.128113, -0.646269, 1.093377, - -2.209198, 0.471706, 0.408901, 1.266242, 0.598252, 1.176827, - -0.203421, 0.213596, -0.851964, -0.466958, 0.021841, -0.698938, - -0.604107, 0.461778, -0.318219, 0.942520, 0.577585, 0.417619, - 0.614665, 0.563679, -1.295073, -0.764437, 0.952194, -0.859222, - -0.618554, -2.268542, -1.210592, 1.655853, -2.627219, -0.994249, - -1.374704, 0.343799, 0.025619, 1.227481, -0.708031, 0.069355, - -1.845228, -1.570886, 1.010668, -1.802084, 1.630088, 1.286090, - -0.161050, -0.940794, 0.367961, 0.291907 - -}; - -float32_t testInputB_f32[64] = -{ - 0.933724, 0.046881, 1.316470, 0.438345, 0.332682, 2.094885, - 0.512081, 0.035546, 0.050894, -2.320371, 0.168711, -1.830493, - -0.444834, -1.003242, -0.531494, -1.365600, -0.155420, -0.757692, - -0.431880, -0.380021, 0.096243, -0.695835, 0.558850, -1.648962, - 0.020369, -0.363630, 0.887146, 0.845503, -0.252864, -0.330397, - 1.269131, -1.109295, -1.027876, 0.135940, 0.116721, -0.293399, - -1.349799, 0.166078, -0.802201, 0.369367, -0.964568, -2.266011, - 0.465178, 0.651222, -0.325426, 0.320245, -0.784178, -0.579456, - 0.093374, 0.604778, -0.048225, 0.376297, -0.394412, 0.578182, - -1.218141, -1.387326, 0.692462, -0.631297, 0.153137, -0.638952, - 0.635474, -0.970468, 1.334057, -0.111370 -}; - -const float testRefOutput_f32[127] = -{ - -0.818943, 1.229484, -0.533664, 1.016604, 0.341875, -1.963656, - 5.171476, 3.478033, 7.616361, 6.648384, 0.479069, 1.792012, - -1.295591, -7.447818, 0.315830, -10.657445, -2.483469, -6.524236, - -7.380591, -3.739005, -8.388957, 0.184147, -1.554888, 3.786508, - -1.684421, 5.400610, -1.578126, 7.403361, 8.315999, 2.080267, - 11.077776, 2.749673, 7.138962, 2.748762, 0.660363, 0.981552, - 1.442275, 0.552721, -2.576892, 4.703989, 0.989156, 8.759344, - -0.564825, -3.994680, 0.954710, -5.014144, 6.592329, 1.599488, - -13.979146, -0.391891, -4.453369, -2.311242, -2.948764, 1.761415, - -0.138322, 10.433007, -2.309103, 4.297153, 8.535523, 3.209462, - 8.695819, 5.569919, 2.514304, 5.582029, 2.060199, 0.642280, - 7.024616, 1.686615, -6.481756, 1.343084, -3.526451, 1.099073, - -2.965764, -0.173723, -4.111484, 6.528384, -6.965658, 1.726291, - 1.535172, 11.023435, 2.338401, -4.690188, 1.298210, 3.943885, - 8.407885, 5.168365, 0.684131, 1.559181, 1.859998, 2.852417, - 8.574070, -6.369078, 6.023458, 11.837963, -6.027632, 4.469678, - -6.799093, -2.674048, 6.250367, -6.809971, -3.459360, 9.112410, - -2.711621, -1.336678, 1.564249, -1.564297, -1.296760, 8.904013, - -3.230109, 6.878013, -7.819823, 3.369909, -1.657410, -2.007358, - -4.112825, 1.370685, -3.420525, -6.276605, 3.244873, -3.352638, - 1.545372, 0.902211, 0.197489, -1.408732, 0.523390, 0.348440, 0 -}; - - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -uint32_t srcALen = 64; /* Length of Input A */ -uint32_t srcBLen = 64; /* Length of Input B */ -uint32_t outLen; /* Length of convolution output */ -float32_t snr; /* output SNR */ - -int32_t main(void) -{ - arm_status status; /* Status of the example */ - arm_cfft_radix4_instance_f32 cfft_instance; /* CFFT Structure instance */ - - /* CFFT Structure instance pointer */ - arm_cfft_radix4_instance_f32 *cfft_instance_ptr = - (arm_cfft_radix4_instance_f32*) &cfft_instance; - - /* output length of convolution */ - outLen = srcALen + srcBLen - 1; - - /* Initialise the fft input buffers with all zeros */ - arm_fill_f32(0.0, Ak, MAX_BLOCKSIZE); - arm_fill_f32(0.0, Bk, MAX_BLOCKSIZE); - - /* Copy the input values to the fft input buffers */ - arm_copy_f32(testInputA_f32, Ak, MAX_BLOCKSIZE/2); - arm_copy_f32(testInputB_f32, Bk, MAX_BLOCKSIZE/2); - - /* Initialize the CFFT function to compute 64 point fft */ - status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1); - - /* Transform input a[n] from time domain to frequency domain A[k] */ - arm_cfft_radix4_f32(cfft_instance_ptr, Ak); - /* Transform input b[n] from time domain to frequency domain B[k] */ - arm_cfft_radix4_f32(cfft_instance_ptr, Bk); - - /* Complex Multiplication of the two input buffers in frequency domain */ - arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE/2); - - /* Initialize the CIFFT function to compute 64 point ifft */ - status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 1, 1); - - /* Transform the multiplication output from frequency domain to time domain, - that gives the convolved output */ - arm_cfft_radix4_f32(cfft_instance_ptr, AxB); - - /* SNR Calculation */ - snr = arm_snr_f32((float32_t *)testRefOutput_f32, AxB, srcALen + srcBLen - 1); - - /* Compare the SNR with threshold to test whether the - computed output is matched with the reference output values. */ - if( snr > SNR_THRESHOLD) - { - status = ARM_MATH_SUCCESS; - } - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt deleted file mode 100644 index debd837..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_convolution_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c deleted file mode 100644 index 89e7fef..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/arm_convolution_example_f32.c +++ /dev/null @@ -1,247 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_convolution_example_f32.c -* -* Description: Example code demonstrating Convolution of two input signals using fft. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup ConvolutionExample Convolution Example - * - * \par Description: - * \par - * Demonstrates the convolution theorem with the use of the Complex FFT, Complex-by-Complex - * Multiplication, and Support Functions. - * - * \par Algorithm: - * \par - * The convolution theorem states that convolution in the time domain corresponds to - * multiplication in the frequency domain. Therefore, the Fourier transform of the convoution of - * two signals is equal to the product of their individual Fourier transforms. - * The Fourier transform of a signal can be evaluated efficiently using the Fast Fourier Transform (FFT). - * \par - * Two input signals, a[n] and b[n], with lengths \c n1 and \c n2 respectively, - * are zero padded so that their lengths become \c N, which is greater than or equal to (n1+n2-1) - * and is a power of 4 as FFT implementation is radix-4. - * The convolution of a[n] and b[n] is obtained by taking the FFT of the input - * signals, multiplying the Fourier transforms of the two signals, and taking the inverse FFT of - * the multiplied result. - * \par - * This is denoted by the following equations: - *
 A[k] = FFT(a[n],N)
- * B[k] = FFT(b[n],N)
- * conv(a[n], b[n]) = IFFT(A[k] * B[k], N)
- * where A[k] and B[k] are the N-point FFTs of the signals a[n] - * and b[n] respectively. - * The length of the convolved signal is (n1+n2-1). - * - * \par Block Diagram: - * \par - * \image html Convolution.gif - * - * \par Variables Description: - * \par - * \li \c testInputA_f32 points to the first input sequence - * \li \c srcALen length of the first input sequence - * \li \c testInputB_f32 points to the second input sequence - * \li \c srcBLen length of the second input sequence - * \li \c outLen length of convolution output sequence, (srcALen + srcBLen - 1) - * \li \c AxB points to the output array where the product of individual FFTs of inputs is stored. - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_fill_f32() - * - arm_copy_f32() - * - arm_cfft_radix4_init_f32() - * - arm_cfft_radix4_f32() - * - arm_cmplx_mult_cmplx_f32() - * - * Refer - * \link arm_convolution_example_f32.c \endlink - * - */ - - -/** \example arm_convolution_example_f32.c - */ - -#include "arm_math.h" -#include "math_helper.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 128 -#define DELTA (0.000001f) -#define SNR_THRESHOLD 90 - -/* ---------------------------------------------------------------------- -* Declare I/O buffers -* ------------------------------------------------------------------- */ -float32_t Ak[MAX_BLOCKSIZE]; /* Input A */ -float32_t Bk[MAX_BLOCKSIZE]; /* Input B */ -float32_t AxB[MAX_BLOCKSIZE * 2]; /* Output */ - -/* ---------------------------------------------------------------------- -* Test input data for Floating point Convolution example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ -float32_t testInputA_f32[64] = -{ - -0.808920, 1.357369, 1.180861, -0.504544, 1.762637, -0.703285, - 1.696966, 0.620571, -0.151093, -0.100235, -0.872382, -0.403579, - -0.860749, -0.382648, -1.052338, 0.128113, -0.646269, 1.093377, - -2.209198, 0.471706, 0.408901, 1.266242, 0.598252, 1.176827, - -0.203421, 0.213596, -0.851964, -0.466958, 0.021841, -0.698938, - -0.604107, 0.461778, -0.318219, 0.942520, 0.577585, 0.417619, - 0.614665, 0.563679, -1.295073, -0.764437, 0.952194, -0.859222, - -0.618554, -2.268542, -1.210592, 1.655853, -2.627219, -0.994249, - -1.374704, 0.343799, 0.025619, 1.227481, -0.708031, 0.069355, - -1.845228, -1.570886, 1.010668, -1.802084, 1.630088, 1.286090, - -0.161050, -0.940794, 0.367961, 0.291907 - -}; - -float32_t testInputB_f32[64] = -{ - 0.933724, 0.046881, 1.316470, 0.438345, 0.332682, 2.094885, - 0.512081, 0.035546, 0.050894, -2.320371, 0.168711, -1.830493, - -0.444834, -1.003242, -0.531494, -1.365600, -0.155420, -0.757692, - -0.431880, -0.380021, 0.096243, -0.695835, 0.558850, -1.648962, - 0.020369, -0.363630, 0.887146, 0.845503, -0.252864, -0.330397, - 1.269131, -1.109295, -1.027876, 0.135940, 0.116721, -0.293399, - -1.349799, 0.166078, -0.802201, 0.369367, -0.964568, -2.266011, - 0.465178, 0.651222, -0.325426, 0.320245, -0.784178, -0.579456, - 0.093374, 0.604778, -0.048225, 0.376297, -0.394412, 0.578182, - -1.218141, -1.387326, 0.692462, -0.631297, 0.153137, -0.638952, - 0.635474, -0.970468, 1.334057, -0.111370 -}; - -const float testRefOutput_f32[127] = -{ - -0.818943, 1.229484, -0.533664, 1.016604, 0.341875, -1.963656, - 5.171476, 3.478033, 7.616361, 6.648384, 0.479069, 1.792012, - -1.295591, -7.447818, 0.315830, -10.657445, -2.483469, -6.524236, - -7.380591, -3.739005, -8.388957, 0.184147, -1.554888, 3.786508, - -1.684421, 5.400610, -1.578126, 7.403361, 8.315999, 2.080267, - 11.077776, 2.749673, 7.138962, 2.748762, 0.660363, 0.981552, - 1.442275, 0.552721, -2.576892, 4.703989, 0.989156, 8.759344, - -0.564825, -3.994680, 0.954710, -5.014144, 6.592329, 1.599488, - -13.979146, -0.391891, -4.453369, -2.311242, -2.948764, 1.761415, - -0.138322, 10.433007, -2.309103, 4.297153, 8.535523, 3.209462, - 8.695819, 5.569919, 2.514304, 5.582029, 2.060199, 0.642280, - 7.024616, 1.686615, -6.481756, 1.343084, -3.526451, 1.099073, - -2.965764, -0.173723, -4.111484, 6.528384, -6.965658, 1.726291, - 1.535172, 11.023435, 2.338401, -4.690188, 1.298210, 3.943885, - 8.407885, 5.168365, 0.684131, 1.559181, 1.859998, 2.852417, - 8.574070, -6.369078, 6.023458, 11.837963, -6.027632, 4.469678, - -6.799093, -2.674048, 6.250367, -6.809971, -3.459360, 9.112410, - -2.711621, -1.336678, 1.564249, -1.564297, -1.296760, 8.904013, - -3.230109, 6.878013, -7.819823, 3.369909, -1.657410, -2.007358, - -4.112825, 1.370685, -3.420525, -6.276605, 3.244873, -3.352638, - 1.545372, 0.902211, 0.197489, -1.408732, 0.523390, 0.348440, 0 -}; - - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -uint32_t srcALen = 64; /* Length of Input A */ -uint32_t srcBLen = 64; /* Length of Input B */ -uint32_t outLen; /* Length of convolution output */ -float32_t snr; /* output SNR */ - -int32_t main(void) -{ - arm_status status; /* Status of the example */ - arm_cfft_radix4_instance_f32 cfft_instance; /* CFFT Structure instance */ - - /* CFFT Structure instance pointer */ - arm_cfft_radix4_instance_f32 *cfft_instance_ptr = - (arm_cfft_radix4_instance_f32*) &cfft_instance; - - /* output length of convolution */ - outLen = srcALen + srcBLen - 1; - - /* Initialise the fft input buffers with all zeros */ - arm_fill_f32(0.0, Ak, MAX_BLOCKSIZE); - arm_fill_f32(0.0, Bk, MAX_BLOCKSIZE); - - /* Copy the input values to the fft input buffers */ - arm_copy_f32(testInputA_f32, Ak, MAX_BLOCKSIZE/2); - arm_copy_f32(testInputB_f32, Bk, MAX_BLOCKSIZE/2); - - /* Initialize the CFFT function to compute 64 point fft */ - status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1); - - /* Transform input a[n] from time domain to frequency domain A[k] */ - arm_cfft_radix4_f32(cfft_instance_ptr, Ak); - /* Transform input b[n] from time domain to frequency domain B[k] */ - arm_cfft_radix4_f32(cfft_instance_ptr, Bk); - - /* Complex Multiplication of the two input buffers in frequency domain */ - arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE/2); - - /* Initialize the CIFFT function to compute 64 point ifft */ - status = arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 1, 1); - - /* Transform the multiplication output from frequency domain to time domain, - that gives the convolved output */ - arm_cfft_radix4_f32(cfft_instance_ptr, AxB); - - /* SNR Calculation */ - snr = arm_snr_f32((float32_t *)testRefOutput_f32, AxB, srcALen + srcBLen - 1); - - /* Compare the SNR with threshold to test whether the - computed output is matched with the reference output values. */ - if( snr > SNR_THRESHOLD) - { - status = ARM_MATH_SUCCESS; - } - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_convolution_example/GCC/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt deleted file mode 100644 index 2009260..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_dotproduct_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c deleted file mode 100644 index 6112e82..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/ARM/arm_dotproduct_example_f32.c +++ /dev/null @@ -1,178 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_dotproduct_example_f32.c -* -* Description: Example code computing dot product of two vectors. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup DotproductExample Dot Product Example - * - * \par Description: - * \par - * Demonstrates the use of the Multiply and Add functions to perform the dot product. - * The dot product of two vectors is obtained by multiplying corresponding elements - * and summing the products. - - * \par Algorithm: - * \par - * The two input vectors \c A and \c B with length \c n, are multiplied element-by-element - * and then added to obtain dot product. - * \par - * This is denoted by the following equation: - *
  dotProduct = A[0] * B[0] + A[1] * B[1] + ... + A[n-1] * B[n-1]
- * - * \par Block Diagram: - * \par - * \image html dotProduct.gif - * - * \par Variables Description: - * \par - * \li \c srcA_buf_f32 points to first input vector - * \li \c srcB_buf_f32 points to second input vector - * \li \c testOutput stores dot product of the two input vectors. - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_mult_f32() - * - arm_add_f32() - * - * Refer - * \link arm_dotproduct_example_f32.c \endlink - * - */ - - -/** \example arm_dotproduct_example_f32.c - */ - -#include -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 32 -#define DELTA (0.000001f) - -/* ---------------------------------------------------------------------- -* Test input data for Floating point Dot Product example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ -/* ---------------------------------------------------------------------- -** Test input data of srcA for blockSize 32 -** ------------------------------------------------------------------- */ -float32_t srcA_buf_f32[MAX_BLOCKSIZE] = -{ - -0.4325648115282207, -1.6655843782380970, 0.1253323064748307, - 0.2876764203585489, -1.1464713506814637, 1.1909154656429988, - 1.1891642016521031, -0.0376332765933176, 0.3272923614086541, - 0.1746391428209245, -0.1867085776814394, 0.7257905482933027, - -0.5883165430141887, 2.1831858181971011, -0.1363958830865957, - 0.1139313135208096, 1.0667682113591888, 0.0592814605236053, - -0.0956484054836690, -0.8323494636500225, 0.2944108163926404, - -1.3361818579378040, 0.7143245518189522, 1.6235620644462707, - -0.6917757017022868, 0.8579966728282626, 1.2540014216025324, - -1.5937295764474768, -1.4409644319010200, 0.5711476236581780, - -0.3998855777153632, 0.6899973754643451 -}; - -/* ---------------------------------------------------------------------- -** Test input data of srcB for blockSize 32 -** ------------------------------------------------------------------- */ -float32_t srcB_buf_f32[MAX_BLOCKSIZE] = -{ - 1.7491401329284098, 0.1325982188803279, 0.3252281811989881, - -0.7938091410349637, 0.3149236145048914, -0.5272704888029532, - 0.9322666565031119, 1.1646643544607362, -2.0456694357357357, - -0.6443728590041911, 1.7410657940825480, 0.4867684246821860, - 1.0488288293660140, 1.4885752747099299, 1.2705014969484090, - -1.8561241921210170, 2.1343209047321410, 1.4358467535865909, - -0.9173023332875400, -1.1060770780029008, 0.8105708062681296, - 0.6985430696369063, -0.4015827425012831, 1.2687512030669628, - -0.7836083053674872, 0.2132664971465569, 0.7878984786088954, - 0.8966819356782295, -0.1869172943544062, 1.0131816724341454, - 0.2484350696132857, 0.0596083377937976 -}; - -/* Reference dot product output */ -float32_t refDotProdOut = 5.9273644806352142; - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -float32_t multOutput[MAX_BLOCKSIZE]; /* Intermediate output */ -float32_t testOutput; /* Final ouput */ - -arm_status status; /* Status of the example */ - -int32_t main(void) -{ - uint32_t i; /* Loop counter */ - float32_t diff; /* Difference between reference and test outputs */ - - /* Multiplication of two input buffers */ - arm_mult_f32(srcA_buf_f32, srcB_buf_f32, multOutput, MAX_BLOCKSIZE); - - /* Accumulate the multiplication output values to - get the dot product of the two inputs */ - for(i=0; i< MAX_BLOCKSIZE; i++) - { - arm_add_f32(&testOutput, &multOutput[i], &testOutput, 1); - } - - /* absolute value of difference between ref and test */ - diff = fabsf(refDotProdOut - testOutput); - - /* Comparison of dot product value with reference */ - if(diff > DELTA) - { - status = ARM_MATH_TEST_FAILURE; - } - - if( status == ARM_MATH_TEST_FAILURE) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt deleted file mode 100644 index 2009260..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_dotproduct_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c deleted file mode 100644 index 6112e82..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_dotproduct_example/GCC/arm_dotproduct_example_f32.c +++ /dev/null @@ -1,178 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_dotproduct_example_f32.c -* -* Description: Example code computing dot product of two vectors. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup DotproductExample Dot Product Example - * - * \par Description: - * \par - * Demonstrates the use of the Multiply and Add functions to perform the dot product. - * The dot product of two vectors is obtained by multiplying corresponding elements - * and summing the products. - - * \par Algorithm: - * \par - * The two input vectors \c A and \c B with length \c n, are multiplied element-by-element - * and then added to obtain dot product. - * \par - * This is denoted by the following equation: - *
  dotProduct = A[0] * B[0] + A[1] * B[1] + ... + A[n-1] * B[n-1]
- * - * \par Block Diagram: - * \par - * \image html dotProduct.gif - * - * \par Variables Description: - * \par - * \li \c srcA_buf_f32 points to first input vector - * \li \c srcB_buf_f32 points to second input vector - * \li \c testOutput stores dot product of the two input vectors. - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_mult_f32() - * - arm_add_f32() - * - * Refer - * \link arm_dotproduct_example_f32.c \endlink - * - */ - - -/** \example arm_dotproduct_example_f32.c - */ - -#include -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 32 -#define DELTA (0.000001f) - -/* ---------------------------------------------------------------------- -* Test input data for Floating point Dot Product example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ -/* ---------------------------------------------------------------------- -** Test input data of srcA for blockSize 32 -** ------------------------------------------------------------------- */ -float32_t srcA_buf_f32[MAX_BLOCKSIZE] = -{ - -0.4325648115282207, -1.6655843782380970, 0.1253323064748307, - 0.2876764203585489, -1.1464713506814637, 1.1909154656429988, - 1.1891642016521031, -0.0376332765933176, 0.3272923614086541, - 0.1746391428209245, -0.1867085776814394, 0.7257905482933027, - -0.5883165430141887, 2.1831858181971011, -0.1363958830865957, - 0.1139313135208096, 1.0667682113591888, 0.0592814605236053, - -0.0956484054836690, -0.8323494636500225, 0.2944108163926404, - -1.3361818579378040, 0.7143245518189522, 1.6235620644462707, - -0.6917757017022868, 0.8579966728282626, 1.2540014216025324, - -1.5937295764474768, -1.4409644319010200, 0.5711476236581780, - -0.3998855777153632, 0.6899973754643451 -}; - -/* ---------------------------------------------------------------------- -** Test input data of srcB for blockSize 32 -** ------------------------------------------------------------------- */ -float32_t srcB_buf_f32[MAX_BLOCKSIZE] = -{ - 1.7491401329284098, 0.1325982188803279, 0.3252281811989881, - -0.7938091410349637, 0.3149236145048914, -0.5272704888029532, - 0.9322666565031119, 1.1646643544607362, -2.0456694357357357, - -0.6443728590041911, 1.7410657940825480, 0.4867684246821860, - 1.0488288293660140, 1.4885752747099299, 1.2705014969484090, - -1.8561241921210170, 2.1343209047321410, 1.4358467535865909, - -0.9173023332875400, -1.1060770780029008, 0.8105708062681296, - 0.6985430696369063, -0.4015827425012831, 1.2687512030669628, - -0.7836083053674872, 0.2132664971465569, 0.7878984786088954, - 0.8966819356782295, -0.1869172943544062, 1.0131816724341454, - 0.2484350696132857, 0.0596083377937976 -}; - -/* Reference dot product output */ -float32_t refDotProdOut = 5.9273644806352142; - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -float32_t multOutput[MAX_BLOCKSIZE]; /* Intermediate output */ -float32_t testOutput; /* Final ouput */ - -arm_status status; /* Status of the example */ - -int32_t main(void) -{ - uint32_t i; /* Loop counter */ - float32_t diff; /* Difference between reference and test outputs */ - - /* Multiplication of two input buffers */ - arm_mult_f32(srcA_buf_f32, srcB_buf_f32, multOutput, MAX_BLOCKSIZE); - - /* Accumulate the multiplication output values to - get the dot product of the two inputs */ - for(i=0; i< MAX_BLOCKSIZE; i++) - { - arm_add_f32(&testOutput, &multOutput[i], &testOutput, 1); - } - - /* absolute value of difference between ref and test */ - diff = fabsf(refDotProdOut - testOutput); - - /* Comparison of dot product value with reference */ - if(diff > DELTA) - { - status = ARM_MATH_TEST_FAILURE; - } - - if( status == ARM_MATH_TEST_FAILURE) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt deleted file mode 100644 index a8632b0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_fft_bin_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c deleted file mode 100644 index fcc1aab..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_data.c +++ /dev/null @@ -1,308 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_fft_bin_data.c -* -* Description: Data file used for example code -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -Test Input signal contains 10KHz signal + Uniformly distributed white noise -** ------------------------------------------------------------------- */ - -float32_t testInput_f32_10khz[2048] = -{ --0.865129623056441, 0.000000000000000, -2.655020678073846, 0.000000000000000, 0.600664612949661, 0.000000000000000, 0.080378093886515, 0.000000000000000, --2.899160484012034, 0.000000000000000, 2.563004262857762, 0.000000000000000, 3.078328403304206, 0.000000000000000, 0.105906778385130, 0.000000000000000, -0.048366940168201, 0.000000000000000, -0.145696461188734, 0.000000000000000, -0.023417155362879, 0.000000000000000, 2.127729174988954, 0.000000000000000, --1.176633086028377, 0.000000000000000, 3.690223557991855, 0.000000000000000, -0.622791766173194, 0.000000000000000, 0.722837373872203, 0.000000000000000, -2.739754205367484, 0.000000000000000, -0.062610410524552, 0.000000000000000, -0.891296810967338, 0.000000000000000, -1.845872258871811, 0.000000000000000, -1.195039415434387, 0.000000000000000, -2.177388969045026, 0.000000000000000, 1.078649103637905, 0.000000000000000, 2.570976050490193, 0.000000000000000, --1.383551403404574, 0.000000000000000, 2.392141424058873, 0.000000000000000, 2.858002843205065, 0.000000000000000, -3.682433899725536, 0.000000000000000, --3.488146646451150, 0.000000000000000, 1.323468578888120, 0.000000000000000, -0.099771155430726, 0.000000000000000, 1.561168082500454, 0.000000000000000, -1.025026795103179, 0.000000000000000, 0.928841900171200, 0.000000000000000, 2.930499509864950, 0.000000000000000, 2.013349089766430, 0.000000000000000, -2.381676148486737, 0.000000000000000, -3.081062307950236, 0.000000000000000, -0.389579115537544, 0.000000000000000, 0.181540149166620, 0.000000000000000, --2.601953341353208, 0.000000000000000, 0.333435137783218, 0.000000000000000, -2.812945856162965, 0.000000000000000, 2.649109640172910, 0.000000000000000, --1.003963025744654, 0.000000000000000, 1.552460768755035, 0.000000000000000, 0.088641345335247, 0.000000000000000, -2.519951327113426, 0.000000000000000, --4.341348988610527, 0.000000000000000, 0.557772429359965, 0.000000000000000, -1.671267412948494, 0.000000000000000, 0.733951350960387, 0.000000000000000, -0.409263788034864, 0.000000000000000, 3.566033071952806, 0.000000000000000, 1.882565173848352, 0.000000000000000, -1.106017073793287, 0.000000000000000, -0.154456720778718, 0.000000000000000, -2.513205795512153, 0.000000000000000, 0.310978660939421, 0.000000000000000, 0.579706500111723, 0.000000000000000, -0.000086383683251, 0.000000000000000, -1.311866980897721, 0.000000000000000, 1.840007477574986, 0.000000000000000, -3.253005768451345, 0.000000000000000, -1.462584328739432, 0.000000000000000, 1.610103610851738, 0.000000000000000, 0.761914676858907, 0.000000000000000, 0.974541361089834, 0.000000000000000, -0.686845845885983, 0.000000000000000, 1.849153122025191, 0.000000000000000, 0.787800410401453, 0.000000000000000, -1.187438909666279, 0.000000000000000, --0.754937911044720, 0.000000000000000, 0.084373858395232, 0.000000000000000, -2.600269011710521, 0.000000000000000, -0.962982842142644, 0.000000000000000, --0.369328108540868, 0.000000000000000, 0.810791418361879, 0.000000000000000, 3.587016488699641, 0.000000000000000, -0.520776145083723, 0.000000000000000, -0.640249919627884, 0.000000000000000, 1.103122489464969, 0.000000000000000, 2.231779881455556, 0.000000000000000, -1.308035392685241, 0.000000000000000, -0.424070304330106, 0.000000000000000, -0.200383932651189, 0.000000000000000, -2.365526783356541, 0.000000000000000, -0.989114757436628, 0.000000000000000, -2.770807688959777, 0.000000000000000, -0.444172737462307, 0.000000000000000, 0.079760979374078, 0.000000000000000, -0.005199118412183, 0.000000000000000, --0.664712668309527, 0.000000000000000, -0.624171857561896, 0.000000000000000, 0.537306979007338, 0.000000000000000, -2.575955675497642, 0.000000000000000, -1.562363235756780, 0.000000000000000, 1.814069369848895, 0.000000000000000, -1.293428583392509, 0.000000000000000, -1.026188449495686, 0.000000000000000, --2.981771815588717, 0.000000000000000, -4.223468103075124, 0.000000000000000, 2.672674782004045, 0.000000000000000, -0.856096801117735, 0.000000000000000, -0.048517345512563, 0.000000000000000, -0.026860721136222, 0.000000000000000, 0.392932277758187, 0.000000000000000, -1.331740855093099, 0.000000000000000, --1.894292129477081, 0.000000000000000, -1.425006468460681, 0.000000000000000, -2.721772427617057, 0.000000000000000, -1.616831100216806, 0.000000000000000, -3.551177651488947, 0.000000000000000, -0.069685667896087, 0.000000000000000, -3.134634907409102, 0.000000000000000, -0.263627598944639, 0.000000000000000, --1.650469945991350, 0.000000000000000, -2.203580339374399, 0.000000000000000, -0.872203246123242, 0.000000000000000, 1.230782812607287, 0.000000000000000, -0.257288860093291, 0.000000000000000, 1.989083106173137, 0.000000000000000, -1.985638729453261, 0.000000000000000, -1.416185105842892, 0.000000000000000, --1.131097688325772, 0.000000000000000, -2.245130805416057, 0.000000000000000, -1.938873996219074, 0.000000000000000, 2.043608361562645, 0.000000000000000, --0.583727989880841, 0.000000000000000, -1.785266378212929, 0.000000000000000, 1.961457586224753, 0.000000000000000, 1.139400099963223, 0.000000000000000, --1.979519343363991, 0.000000000000000, 2.003023322818429, 0.000000000000000, 0.229004069076829, 0.000000000000000, 3.452808862193135, 0.000000000000000, -2.882273808365857, 0.000000000000000, -1.549450501844438, 0.000000000000000, -3.283872089931876, 0.000000000000000, -0.327025884099064, 0.000000000000000, --0.054979977136430, 0.000000000000000, -1.192280531479012, 0.000000000000000, 0.645539328365578, 0.000000000000000, 2.300832863404618, 0.000000000000000, --1.092951789535240, 0.000000000000000, -1.017368249363773, 0.000000000000000, -0.142673056169787, 0.000000000000000, 0.831073544881250, 0.000000000000000, --2.314612531587064, 0.000000000000000, -2.221456299106321, 0.000000000000000, 0.460261143885226, 0.000000000000000, 0.050585301888595, 0.000000000000000, -0.364373329183988, 0.000000000000000, -1.685956552069538, 0.000000000000000, 0.050664512351055, 0.000000000000000, -0.193355783902718, 0.000000000000000, --0.158660446046828, 0.000000000000000, 2.394156453841953, 0.000000000000000, -1.562965718554525, 0.000000000000000, -2.199750600869900, 0.000000000000000, -1.544984022381773, 0.000000000000000, -1.988307216807315, 0.000000000000000, -0.628240722541046, 0.000000000000000, -1.436235771505429, 0.000000000000000, -1.677013691147313, 0.000000000000000, 1.600741781678228, 0.000000000000000, -0.757380959134706, 0.000000000000000, -4.784797439515566, 0.000000000000000, -0.265121462834569, 0.000000000000000, 3.862029485934378, 0.000000000000000, 2.386823577249430, 0.000000000000000, -3.655779745436893, 0.000000000000000, --0.763541621368016, 0.000000000000000, -1.182140388432962, 0.000000000000000, -1.349106114858063, 0.000000000000000, -2.287533624396759, 0.000000000000000, --0.028603745188423, 0.000000000000000, -1.353580755934427, 0.000000000000000, 0.461602380352937, 0.000000000000000, -0.059599055078928, 0.000000000000000, --0.929946734342228, 0.000000000000000, 0.065773089295561, 0.000000000000000, 1.106565863102982, 0.000000000000000, 4.719295086373593, 0.000000000000000, --2.108377703544395, 0.000000000000000, -2.226393620240159, 0.000000000000000, 1.375668397437521, 0.000000000000000, -0.960772428525443, 0.000000000000000, --2.156313465390571, 0.000000000000000, 1.126060012375311, 0.000000000000000, 2.756485137030720, 0.000000000000000, 0.739639690862600, 0.000000000000000, -3.914769510295006, 0.000000000000000, 1.685232785586675, 0.000000000000000, 4.079058040970612, 0.000000000000000, -1.174598301660513, 0.000000000000000, --2.885776587275580, 0.000000000000000, -0.241073635188767, 0.000000000000000, 3.080489872502403, 0.000000000000000, -2.051244183999421, 0.000000000000000, -0.664330486845139, 0.000000000000000, -1.697798999370016, 0.000000000000000, 1.452369423649782, 0.000000000000000, -1.523532831019280, 0.000000000000000, -0.171981186587481, 0.000000000000000, -4.685274721583927, 0.000000000000000, -1.336175835319380, 0.000000000000000, 1.419070770428945, 0.000000000000000, --0.035791601713475, 0.000000000000000, 2.291937971632081, 0.000000000000000, -1.962559313450293, 0.000000000000000, -4.831595589339301, 0.000000000000000, --1.857055284000925, 0.000000000000000, 2.606271522635512, 0.000000000000000, -0.576447978738030, 0.000000000000000, 0.082299166967720, 0.000000000000000, -1.888399453494614, 0.000000000000000, -3.564705298046079, 0.000000000000000, -0.939357831083889, 0.000000000000000, -1.903578203697778, 0.000000000000000, --2.642492215447250, 0.000000000000000, -0.182990405251017, 0.000000000000000, 3.742026478011174, 0.000000000000000, 0.104295803798333, 0.000000000000000, -1.848678195370347, 0.000000000000000, -1.887384346896369, 0.000000000000000, 0.365048973046045, 0.000000000000000, -0.889638010354219, 0.000000000000000, -1.173877118428863, 0.000000000000000, -1.178562827540109, 0.000000000000000, 0.610271645685184, 0.000000000000000, 1.831284815697871, 0.000000000000000, -0.449575390102283, 0.000000000000000, 1.597171905253443, 0.000000000000000, 3.918574971904773, 0.000000000000000, 0.868104027970404, 0.000000000000000, -0.582643134746494, 0.000000000000000, 2.321256382353331, 0.000000000000000, -0.238118642223180, 0.000000000000000, -2.890287868054370, 0.000000000000000, -0.970995414625622, 0.000000000000000, 0.666137930891283, 0.000000000000000, -0.202435718709502, 0.000000000000000, 2.057930200518194, 0.000000000000000, -3.120583443719949, 0.000000000000000, -0.863945271701041, 0.000000000000000, 0.906848893874630, 0.000000000000000, -1.434124930222570, 0.000000000000000, -0.754659384848783, 0.000000000000000, -5.224154442713778, 0.000000000000000, 2.330229744098967, 0.000000000000000, 1.113946320164698, 0.000000000000000, -0.523324920322840, 0.000000000000000, 1.750740911548348, 0.000000000000000, -0.899333972913577, 0.000000000000000, 0.228705845203506, 0.000000000000000, --1.934782624767648, 0.000000000000000, -3.508386237231303, 0.000000000000000, -2.107108523073510, 0.000000000000000, 0.380587645474815, 0.000000000000000, --0.476200877183279, 0.000000000000000, -2.172086712642198, 0.000000000000000, 1.795372535780299, 0.000000000000000, -2.100318983391055, 0.000000000000000, --0.022571122461405, 0.000000000000000, 0.674514020010955, 0.000000000000000, -0.148872569390857, 0.000000000000000, 0.298175890592737, 0.000000000000000, --1.134244492493590, 0.000000000000000, -3.146848422289455, 0.000000000000000, -1.357950199087602, 0.000000000000000, 0.667362732020878, 0.000000000000000, --3.119397998316724, 0.000000000000000, -1.189341126297637, 0.000000000000000, -1.532744386856668, 0.000000000000000, -1.672972484202534, 0.000000000000000, --2.042283373871558, 0.000000000000000, -1.479481547595924, 0.000000000000000, -0.002668662875396, 0.000000000000000, 0.262737760129546, 0.000000000000000, -2.734456080621830, 0.000000000000000, -0.671945925075102, 0.000000000000000, -3.735078262179111, 0.000000000000000, -0.161705013319883, 0.000000000000000, -0.748963512361001, 0.000000000000000, 1.128046374367600, 0.000000000000000, 0.649651335592966, 0.000000000000000, 1.880020215025867, 0.000000000000000, --1.095632293842306, 0.000000000000000, 1.197764876160487, 0.000000000000000, 0.323646656252985, 0.000000000000000, -1.655502751114502, 0.000000000000000, -3.666399062961496, 0.000000000000000, -0.334060899735197, 0.000000000000000, -2.119056978738397, 0.000000000000000, 3.721375117275012, 0.000000000000000, -0.044874186872307, 0.000000000000000, -2.733053897593234, 0.000000000000000, 1.590700278891042, 0.000000000000000, 3.215711772781902, 0.000000000000000, --1.792085012843801, 0.000000000000000, -0.405797188885475, 0.000000000000000, -0.628080020080892, 0.000000000000000, -1.831815840843960, 0.000000000000000, -2.973656862522834, 0.000000000000000, -0.212032655138417, 0.000000000000000, 0.372437389437234, 0.000000000000000, -1.614030579023492, 0.000000000000000, --0.704900996358698, 0.000000000000000, 1.123700273452105, 0.000000000000000, -0.136371848130819, 0.000000000000000, 3.020284357635585, 0.000000000000000, --0.550211350877649, 0.000000000000000, 5.101256236381711, 0.000000000000000, 3.367051512192333, 0.000000000000000, -4.385131946669234, 0.000000000000000, --3.967303337694391, 0.000000000000000, -0.965894936640022, 0.000000000000000, 0.328366945264681, 0.000000000000000, 0.199041562924914, 0.000000000000000, -1.067681999025495, 0.000000000000000, -1.939516091697170, 0.000000000000000, -1.092980954328824, 0.000000000000000, 0.273786079368066, 0.000000000000000, --0.040928322190265, 0.000000000000000, -0.118368078577437, 0.000000000000000, 1.766589628899997, 0.000000000000000, 1.738321311635393, 0.000000000000000, --2.895012794321649, 0.000000000000000, 1.213521771395142, 0.000000000000000, 0.922971726633985, 0.000000000000000, 1.091516563636489, 0.000000000000000, -3.226378465469620, 0.000000000000000, 1.149169778666974, 0.000000000000000, -1.695986327709386, 0.000000000000000, -0.974803077355813, 0.000000000000000, --4.898035507513607, 0.000000000000000, 1.622719302889447, 0.000000000000000, 0.583891313586579, 0.000000000000000, -1.677182424094957, 0.000000000000000, --1.915633132814685, 0.000000000000000, -1.980150370851616, 0.000000000000000, 0.604538269404190, 0.000000000000000, 0.939862406149365, 0.000000000000000, --1.266939874246416, 0.000000000000000, -1.494771249200063, 0.000000000000000, 0.278042784093988, 0.000000000000000, 0.326627416008916, 0.000000000000000, --1.914530157643303, 0.000000000000000, 1.908947721862196, 0.000000000000000, 0.531819285694044, 0.000000000000000, 3.056856632319658, 0.000000000000000, --0.389241827774643, 0.000000000000000, -2.418606606780420, 0.000000000000000, 0.915299238878703, 0.000000000000000, -0.098774174295283, 0.000000000000000, --0.906199428444304, 0.000000000000000, 0.316716451217743, 0.000000000000000, -4.367700643578311, 0.000000000000000, 1.491687997515293, 0.000000000000000, --1.962381126288365, 0.000000000000000, -0.700829196527045, 0.000000000000000, 3.028958963615630, 0.000000000000000, -2.313461067462598, 0.000000000000000, --1.431933239886712, 0.000000000000000, -0.831153039725342, 0.000000000000000, 3.939495598250743, 0.000000000000000, 0.342974753984771, 0.000000000000000, --2.768330763002974, 0.000000000000000, -2.744010370019008, 0.000000000000000, 3.821352685212561, 0.000000000000000, 4.551065271455856, 0.000000000000000, -3.270136437041298, 0.000000000000000, -3.188028411950982, 0.000000000000000, -0.777075012417436, 0.000000000000000, 0.097110650265216, 0.000000000000000, -1.221216137608812, 0.000000000000000, -1.325824244541822, 0.000000000000000, -2.655296734084113, 0.000000000000000, -1.074792144885704, 0.000000000000000, -2.770401584439407, 0.000000000000000, 5.240270645610543, 0.000000000000000, 0.108576672208892, 0.000000000000000, -1.209394350650142, 0.000000000000000, -1.403344353838785, 0.000000000000000, -0.299032904177277, 0.000000000000000, 4.074959450638227, 0.000000000000000, 1.718727473952107, 0.000000000000000, --3.061349227080806, 0.000000000000000, -1.158596888541269, 0.000000000000000, 3.381858904662625, 0.000000000000000, 0.957339964054052, 0.000000000000000, -0.179900074904899, 0.000000000000000, -3.909641902506081, 0.000000000000000, 0.805717289408649, 0.000000000000000, 2.047413793928261, 0.000000000000000, --1.273580225826614, 0.000000000000000, -2.681359186869971, 0.000000000000000, -0.721241345822093, 0.000000000000000, -1.613090681569475, 0.000000000000000, -0.463138804815955, 0.000000000000000, 0.377223507800954, 0.000000000000000, 2.046550684968141, 0.000000000000000, 0.178508732797712, 0.000000000000000, --0.477815330358845, 0.000000000000000, 3.763355908332053, 0.000000000000000, 1.300430303035163, 0.000000000000000, -0.214625793857725, 0.000000000000000, -1.343267891864081, 0.000000000000000, -0.340007682433245, 0.000000000000000, 2.062703194680005, 0.000000000000000, 0.042032160234235, 0.000000000000000, -0.643732569732250, 0.000000000000000, -1.913502543857589, 0.000000000000000, 3.771340762937158, 0.000000000000000, 1.050024807363386, 0.000000000000000, --4.440489488592649, 0.000000000000000, 0.444904302066643, 0.000000000000000, 2.898702265650048, 0.000000000000000, 1.953232980548558, 0.000000000000000, -2.761564952735079, 0.000000000000000, 1.963537633260397, 0.000000000000000, -2.168858472916215, 0.000000000000000, -4.116235357699841, 0.000000000000000, -4.183678271896528, 0.000000000000000, 0.600422284944681, 0.000000000000000, -0.659352647255126, 0.000000000000000, -0.993127338218109, 0.000000000000000, --2.463571314945747, 0.000000000000000, 0.937720951545881, 0.000000000000000, -3.098957308429730, 0.000000000000000, -2.354719140045463, 0.000000000000000, --0.417285119323949, 0.000000000000000, 2.187974075975947, 0.000000000000000, 1.101468905172585, 0.000000000000000, -3.185800678152109, 0.000000000000000, -2.357534709345083, 0.000000000000000, 0.246645606729407, 0.000000000000000, 4.440905650784504, 0.000000000000000, -2.236807716637866, 0.000000000000000, --2.171481518317550, 0.000000000000000, -2.029571795072690, 0.000000000000000, 0.135599790431348, 0.000000000000000, -1.277965265520191, 0.000000000000000, --1.927976233157507, 0.000000000000000, -5.434492783745394, 0.000000000000000, -2.026375829312657, 0.000000000000000, 1.009666016819321, 0.000000000000000, -0.238549782367247, 0.000000000000000, -0.516403923971309, 0.000000000000000, -0.933977817429352, 0.000000000000000, 0.155803015935614, 0.000000000000000, --0.396194809997929, 0.000000000000000, -0.915178100253214, 0.000000000000000, 0.666329367985015, 0.000000000000000, -1.517991149945785, 0.000000000000000, -0.458266744144822, 0.000000000000000, -1.242845974381418, 0.000000000000000, 0.057914823556477, 0.000000000000000, 0.994101307476875, 0.000000000000000, --2.387209849199325, 0.000000000000000, 0.459297048883826, 0.000000000000000, 0.227711405683905, 0.000000000000000, 0.030255073506117, 0.000000000000000, --1.323361608181337, 0.000000000000000, -4.650244457426706, 0.000000000000000, 0.062908579526021, 0.000000000000000, 3.462831028244432, 0.000000000000000, -1.303608183314856, 0.000000000000000, -1.430415193881612, 0.000000000000000, -1.672886118942142, 0.000000000000000, 0.992890699210099, 0.000000000000000, --0.160814531784247, 0.000000000000000, -1.238132939350430, 0.000000000000000, -0.589223271459376, 0.000000000000000, 2.326363810561534, 0.000000000000000, --4.433789496230785, 0.000000000000000, 1.664686987538929, 0.000000000000000, -2.366128834617921, 0.000000000000000, 1.212421570743837, 0.000000000000000, --4.847914267690055, 0.000000000000000, 0.228485221404712, 0.000000000000000, 0.466139765470957, 0.000000000000000, -1.344202776943546, 0.000000000000000, --1.012053673330574, 0.000000000000000, -2.844980626424742, 0.000000000000000, -1.552703722026340, 0.000000000000000, -1.448830983885038, 0.000000000000000, -0.127010756753980, 0.000000000000000, -1.667188263752299, 0.000000000000000, 3.424818052085100, 0.000000000000000, 0.956291135453840, 0.000000000000000, --3.725533331754662, 0.000000000000000, -1.584534272368832, 0.000000000000000, -1.654148210472472, 0.000000000000000, 0.701610500675698, 0.000000000000000, -0.164954538683927, 0.000000000000000, -0.739260064712987, 0.000000000000000, -2.167324026090101, 0.000000000000000, -0.310240491909496, 0.000000000000000, --2.281790349106906, 0.000000000000000, 1.719655331305361, 0.000000000000000, -2.997005923606441, 0.000000000000000, -1.999301431556852, 0.000000000000000, --0.292229010068828, 0.000000000000000, 1.172317994855851, 0.000000000000000, 0.196734885241533, 0.000000000000000, 2.981365193477068, 0.000000000000000, -2.637726016926352, 0.000000000000000, 1.434045125217982, 0.000000000000000, 0.883627180451827, 0.000000000000000, -1.434040761445747, 0.000000000000000, --1.528891971086553, 0.000000000000000, -3.306913135367542, 0.000000000000000, -0.399059265470646, 0.000000000000000, -0.265674394285178, 0.000000000000000, -3.502591252855384, 0.000000000000000, 0.830301156604454, 0.000000000000000, -0.220021317046083, 0.000000000000000, -0.090553770476646, 0.000000000000000, -0.771863477047951, 0.000000000000000, 1.351209629105760, 0.000000000000000, 3.773699756201963, 0.000000000000000, 0.472600118752329, 0.000000000000000, -2.332825668012222, 0.000000000000000, 1.853747950314528, 0.000000000000000, 0.759515251766178, 0.000000000000000, 1.327112776215496, 0.000000000000000, -2.518730296237868, 0.000000000000000, 0.764450208786353, 0.000000000000000, -0.278275349491296, 0.000000000000000, -0.041559465082020, 0.000000000000000, -1.387166083167787, 0.000000000000000, 2.612996769598122, 0.000000000000000, -0.385404831721799, 0.000000000000000, 2.005630016170309, 0.000000000000000, --0.950500047307998, 0.000000000000000, -1.166884021392492, 0.000000000000000, 1.432973552928162, 0.000000000000000, 2.540370505384567, 0.000000000000000, --1.140505295054501, 0.000000000000000, -3.673358835201185, 0.000000000000000, -0.450691288038056, 0.000000000000000, 1.601024294408014, 0.000000000000000, -0.773213556014045, 0.000000000000000, 2.973873693246168, 0.000000000000000, -1.361548406382279, 0.000000000000000, 1.409136332424815, 0.000000000000000, --0.963382518314713, 0.000000000000000, -2.031268227368161, 0.000000000000000, 0.983309972085586, 0.000000000000000, -3.461412488471631, 0.000000000000000, --2.601124929406039, 0.000000000000000, -0.533896239766343, 0.000000000000000, -2.627129008866350, 0.000000000000000, 0.622111169161305, 0.000000000000000, --1.160926365580422, 0.000000000000000, -2.406196188132628, 0.000000000000000, -1.076870362758737, 0.000000000000000, -1.791866820937175, 0.000000000000000, --0.749453071522325, 0.000000000000000, -5.324156615990973, 0.000000000000000, -1.038698022238289, 0.000000000000000, -2.106629944730630, 0.000000000000000, -0.659295598564773, 0.000000000000000, 0.520940881580988, 0.000000000000000, -0.055649203928700, 0.000000000000000, 0.292096765423137, 0.000000000000000, --4.663743901790872, 0.000000000000000, -0.125066503391666, 0.000000000000000, -2.452620252445380, 0.000000000000000, -0.712128227397468, 0.000000000000000, --0.048938037970968, 0.000000000000000, -1.821520226003361, 0.000000000000000, 0.810106421304257, 0.000000000000000, -0.196636623956257, 0.000000000000000, --0.701769836763804, 0.000000000000000, 2.460345045649201, 0.000000000000000, 3.506597671641116, 0.000000000000000, -2.711322611972225, 0.000000000000000, --0.658079876600542, 0.000000000000000, -2.040082099646173, 0.000000000000000, 2.201668355395807, 0.000000000000000, 1.181507395879711, 0.000000000000000, --1.640739552179682, 0.000000000000000, -1.613393726467190, 0.000000000000000, -1.156741241731352, 0.000000000000000, 2.527773464519963, 0.000000000000000, --0.497040638009502, 0.000000000000000, -0.975817112895589, 0.000000000000000, -2.866830755546166, 0.000000000000000, 1.120214498507878, 0.000000000000000, -5.986771654661698, 0.000000000000000, 0.398219252656757, 0.000000000000000, -3.545606013198135, 0.000000000000000, 0.312398099396191, 0.000000000000000, --2.265327979531788, 0.000000000000000, 0.792121001107366, 0.000000000000000, -3.736145137670100, 0.000000000000000, 0.762228883650802, 0.000000000000000, -2.283545661214646, 0.000000000000000, 3.780020629583529, 0.000000000000000, 3.117260228608810, 0.000000000000000, -2.011159255609613, 0.000000000000000, -0.279107700476072, 0.000000000000000, 2.003369134246936, 0.000000000000000, -1.448171234480257, 0.000000000000000, 0.584697150310140, 0.000000000000000, -0.919508663636197, 0.000000000000000, -3.071349141675388, 0.000000000000000, -1.555923649263667, 0.000000000000000, 2.232497079438850, 0.000000000000000, --0.012662139119883, 0.000000000000000, 0.372825540734715, 0.000000000000000, 2.378543590847629, 0.000000000000000, 1.459053407813062, 0.000000000000000, --0.967913907390927, 0.000000000000000, 1.322825200678212, 0.000000000000000, -1.033775820061824, 0.000000000000000, -1.813629552693142, 0.000000000000000, -4.794348161661486, 0.000000000000000, 0.655279811518676, 0.000000000000000, -2.224590138589720, 0.000000000000000, 0.595329481295766, 0.000000000000000, -3.364055988866225, 0.000000000000000, 1.863416422998127, 0.000000000000000, 1.930305751828105, 0.000000000000000, -0.284467053432545, 0.000000000000000, --0.923374905878938, 0.000000000000000, 1.922988234041399, 0.000000000000000, 0.310482143432719, 0.000000000000000, 0.332122302397134, 0.000000000000000, --1.659487472408966, 0.000000000000000, -1.865943507877961, 0.000000000000000, -0.186775297569864, 0.000000000000000, -1.700543850628361, 0.000000000000000, -0.497157959366735, 0.000000000000000, -0.471244843957418, 0.000000000000000, -0.432013753969948, 0.000000000000000, -4.000189880113231, 0.000000000000000, --0.415335170016467, 0.000000000000000, 0.317311950972859, 0.000000000000000, 0.038393428927595, 0.000000000000000, 0.177219909465206, 0.000000000000000, -0.531650958095143, 0.000000000000000, -2.711644985175806, 0.000000000000000, 0.328744077805156, 0.000000000000000, -0.938417707547928, 0.000000000000000, -0.970379584897379, 0.000000000000000, 1.873649473917137, 0.000000000000000, 0.177938226987023, 0.000000000000000, 0.155609346302393, 0.000000000000000, --1.276504241867208, 0.000000000000000, -0.463725075928807, 0.000000000000000, -0.064748250389500, 0.000000000000000, -1.725568534062385, 0.000000000000000, --0.139066584804067, 0.000000000000000, 1.975514554117767, 0.000000000000000, -0.807063199499478, 0.000000000000000, -0.326926659682788, 0.000000000000000, -1.445727032487938, 0.000000000000000, -0.597151107739100, 0.000000000000000, 2.732557531709386, 0.000000000000000, -2.907130934109188, 0.000000000000000, --1.461264832679981, 0.000000000000000, -1.708588604968163, 0.000000000000000, 3.652851925431363, 0.000000000000000, 0.682050868282879, 0.000000000000000, --0.281312579963294, 0.000000000000000, 0.554966483307825, 0.000000000000000, -0.981341739340932, 0.000000000000000, 1.279543331141603, 0.000000000000000, -0.036589747826856, 0.000000000000000, 2.312073745896073, 0.000000000000000, 1.754682200732425, 0.000000000000000, -0.957515875428627, 0.000000000000000, --0.833596942819695, 0.000000000000000, 0.437054368791033, 0.000000000000000, -0.898819399360279, 0.000000000000000, -0.296050580896839, 0.000000000000000, --0.785144257649601, 0.000000000000000, -2.541503089003311, 0.000000000000000, 2.225075846758761, 0.000000000000000, -1.587290487902002, 0.000000000000000, --1.421404172056462, 0.000000000000000, -3.015149802293631, 0.000000000000000, 1.780874288867949, 0.000000000000000, -0.865812740882613, 0.000000000000000, --2.845327531197112, 0.000000000000000, 1.445225867774367, 0.000000000000000, 2.183733236584647, 0.000000000000000, 1.163371072749080, 0.000000000000000, -0.883547693520409, 0.000000000000000, -1.224093106684675, 0.000000000000000, -1.854501116331044, 0.000000000000000, 1.783082089255796, 0.000000000000000, -2.301508706196191, 0.000000000000000, -0.539901944139077, 0.000000000000000, 1.962315832319967, 0.000000000000000, -0.060709041870503, 0.000000000000000, --1.353139923300238, 0.000000000000000, -1.482887537805234, 0.000000000000000, 1.273732601967176, 0.000000000000000, -3.456609915556321, 0.000000000000000, --3.752320586540873, 0.000000000000000, 3.536356614978951, 0.000000000000000, 0.206035952043233, 0.000000000000000, 5.933966913773842, 0.000000000000000, --0.486633898075490, 0.000000000000000, -0.329595089863342, 0.000000000000000, 1.496414153905337, 0.000000000000000, 0.137868749388880, 0.000000000000000, --0.437192030996792, 0.000000000000000, 2.682750615210656, 0.000000000000000, -2.440234892848570, 0.000000000000000, 1.433910252426186, 0.000000000000000, --0.415051506104074, 0.000000000000000, 1.982003013708649, 0.000000000000000, 1.345796609972435, 0.000000000000000, -2.335949513404370, 0.000000000000000, -1.065988867433025, 0.000000000000000, 2.741844905000464, 0.000000000000000, -1.754047930934362, 0.000000000000000, 0.229252730015575, 0.000000000000000, --0.679791016408669, 0.000000000000000, -2.274097820043743, 0.000000000000000, 0.149802252231876, 0.000000000000000, -0.139697151364830, 0.000000000000000, --2.773367420505435, 0.000000000000000, -4.403400246165611, 0.000000000000000, -1.468974515184135, 0.000000000000000, 0.664990623095844, 0.000000000000000, --3.446979775557143, 0.000000000000000, 1.850006428987618, 0.000000000000000, -1.550866747921936, 0.000000000000000, -3.632874882935257, 0.000000000000000, -0.828039662992464, 0.000000000000000, 2.794055182632816, 0.000000000000000, -0.593995716682633, 0.000000000000000, 0.142788156054200, 0.000000000000000, -0.552461945119668, 0.000000000000000, 0.842127129738758, 0.000000000000000, 1.414335509600077, 0.000000000000000, -0.311559241382430, 0.000000000000000, -1.510590844695250, 0.000000000000000, 1.692217183824300, 0.000000000000000, 0.613760285711957, 0.000000000000000, 0.065233463207770, 0.000000000000000, --2.571912893711505, 0.000000000000000, -1.707001531141341, 0.000000000000000, 0.673884968382041, 0.000000000000000, 0.889863883420103, 0.000000000000000, --2.395635435233346, 0.000000000000000, 1.129247296359819, 0.000000000000000, 0.569074704779735, 0.000000000000000, 6.139436017480722, 0.000000000000000, -0.822158309259017, 0.000000000000000, -3.289872016222589, 0.000000000000000, 0.417612988384414, 0.000000000000000, 1.493982103868165, 0.000000000000000, --0.415353391377005, 0.000000000000000, 0.288670764933155, 0.000000000000000, -1.895650228872272, 0.000000000000000, -0.139631694475020, 0.000000000000000, -1.445103299005436, 0.000000000000000, 2.877182243683429, 0.000000000000000, 1.192428490172580, 0.000000000000000, -5.964591921763842, 0.000000000000000, -0.570859795882959, 0.000000000000000, 2.328333316356666, 0.000000000000000, 0.333755014930026, 0.000000000000000, 1.221901577771909, 0.000000000000000, -0.943358697415568, 0.000000000000000, 2.793063983613067, 0.000000000000000, 3.163005066073616, 0.000000000000000, 2.098300664513867, 0.000000000000000, --3.915313164333447, 0.000000000000000, -2.475766769064539, 0.000000000000000, 1.720472044894277, 0.000000000000000, -1.273591949275665, 0.000000000000000, --1.213451272938616, 0.000000000000000, 0.697439404325690, 0.000000000000000, -0.309902287574293, 0.000000000000000, 2.622575852162781, 0.000000000000000, --2.075881936219060, 0.000000000000000, 0.777847545691770, 0.000000000000000, -3.967947986440650, 0.000000000000000, -3.066503371806472, 0.000000000000000, -1.193780625937845, 0.000000000000000, 0.214246579281311, 0.000000000000000, -2.610681491162162, 0.000000000000000, -1.261224183972745, 0.000000000000000, --1.165071748544285, 0.000000000000000, -1.116548474834374, 0.000000000000000, 0.847202164846982, 0.000000000000000, -3.474301529532390, 0.000000000000000, -0.020799541946476, 0.000000000000000, -3.868995473288166, 0.000000000000000, 1.757979409638067, 0.000000000000000, 0.868115130183109, 0.000000000000000, -0.910167436737958, 0.000000000000000, -1.878855115563720, 0.000000000000000, 1.710357104174161, 0.000000000000000, -1.468933980990902, 0.000000000000000, -1.799544171601169, 0.000000000000000, -4.922332880027887, 0.000000000000000, 0.219424548939720, 0.000000000000000, -0.971671113451924, 0.000000000000000, --0.940533475616266, 0.000000000000000, 0.122510114412152, 0.000000000000000, -1.373686254916911, 0.000000000000000, 1.760348103896323, 0.000000000000000, -0.391745067829643, 0.000000000000000, 2.521958505327354, 0.000000000000000, -1.300693516405092, 0.000000000000000, -0.538251788309178, 0.000000000000000, -0.797184135810173, 0.000000000000000, 2.908800548982588, 0.000000000000000, 1.590902251655215, 0.000000000000000, -1.070323714487264, 0.000000000000000, --3.349764443340999, 0.000000000000000, -1.190563529731447, 0.000000000000000, 1.363369471291963, 0.000000000000000, -1.814270299924576, 0.000000000000000, --0.023381588315711, 0.000000000000000, 1.719182048679569, 0.000000000000000, 0.839917213252626, 0.000000000000000, 1.006099633839122, 0.000000000000000, -0.812462674381527, 0.000000000000000, 1.755814336346739, 0.000000000000000, 2.546848681206319, 0.000000000000000, -1.555300208869455, 0.000000000000000, -1.017053811631167, 0.000000000000000, 0.996591039170903, 0.000000000000000, -1.228047247924881, 0.000000000000000, 4.809462271463009, 0.000000000000000, -2.318113116151685, 0.000000000000000, -1.206932520679733, 0.000000000000000, 1.273757685623312, 0.000000000000000, 0.724335352481802, 0.000000000000000, -1.519876652073198, 0.000000000000000, -2.749670314714158, 0.000000000000000, 3.424042481847581, 0.000000000000000, -3.714668360421517, 0.000000000000000, -1.612834197004014, 0.000000000000000, -2.038234723985566, 0.000000000000000, 1.470938786562152, 0.000000000000000, 2.111634918450302, 0.000000000000000, -1.030376670151787, 0.000000000000000, -0.420877189003829, 0.000000000000000, -1.502024800532894, 0.000000000000000, 0.452310749163804, 0.000000000000000, --1.606059382300987, 0.000000000000000, -4.006159967834147, 0.000000000000000, -2.152801208196508, 0.000000000000000, 1.671674089372579, 0.000000000000000, -1.714536333564101, 0.000000000000000, -1.011518543005344, 0.000000000000000, -0.576410282180584, 0.000000000000000, 0.733689809480836, 0.000000000000000, -1.004245602717974, 0.000000000000000, 1.010090391888449, 0.000000000000000, 3.811459513385621, 0.000000000000000, -5.230621089271954, 0.000000000000000, -0.678044861034399, 0.000000000000000, 1.255935859598107, 0.000000000000000, 1.674521701615288, 0.000000000000000, -1.656695216761705, 0.000000000000000, -1.169286028869693, 0.000000000000000, 0.524915416191998, 0.000000000000000, 2.397642885039520, 0.000000000000000, 2.108711400616072, 0.000000000000000, -2.037618211018084, 0.000000000000000, -0.623664553406925, 0.000000000000000, 2.984106170984409, 0.000000000000000, 1.132182737400932, 0.000000000000000, --2.859274340352130, 0.000000000000000, -0.975550071398723, 0.000000000000000, -1.359935119997407, 0.000000000000000, -2.963308211050121, 0.000000000000000, --0.228726662781163, 0.000000000000000, -1.411110379682043, 0.000000000000000, 0.741553355734225, 0.000000000000000, 0.497554254758309, 0.000000000000000, -2.371907950598855, 0.000000000000000, 1.063465168988748, 0.000000000000000, -0.641082692081488, 0.000000000000000, -0.855439878540726, 0.000000000000000, -0.578321738578726, 0.000000000000000, 3.005809768796194, 0.000000000000000, 1.961458699064065, 0.000000000000000, -3.206261663772745, 0.000000000000000, --0.364431989095434, 0.000000000000000, -0.263182496622273, 0.000000000000000, 1.843464680631139, 0.000000000000000, -0.419107530229249, 0.000000000000000, -1.662335873298487, 0.000000000000000, -0.853687563304005, 0.000000000000000, -2.584133404357169, 0.000000000000000, 3.466839568922895, 0.000000000000000, -0.881671345091973, 0.000000000000000, 0.454620014206908, 0.000000000000000, -1.737245187402739, 0.000000000000000, 2.162713238369243, 0.000000000000000, --3.868539002714486, 0.000000000000000, 2.014114855933826, 0.000000000000000, -0.703233831811006, 0.000000000000000, -3.410319935997574, 0.000000000000000, --1.851235811006584, 0.000000000000000, 0.909783907894036, 0.000000000000000, 0.091884002136728, 0.000000000000000, -2.688294201131650, 0.000000000000000, --0.906134178460955, 0.000000000000000, 3.475054609035133, 0.000000000000000, -0.573927964170323, 0.000000000000000, -0.429542937515399, 0.000000000000000, -0.991348618739939, 0.000000000000000, 1.974804904926325, 0.000000000000000, 0.975783450796698, 0.000000000000000, -3.057119549071503, 0.000000000000000, --3.899429237481194, 0.000000000000000, 0.362439009175350, 0.000000000000000, -1.124461670265618, 0.000000000000000, 1.806000360163583, 0.000000000000000, --2.768333362600288, 0.000000000000000, 0.244387897900379, 0.000000000000000, 0.908767296720926, 0.000000000000000, 1.254669374391882, 0.000000000000000, --1.420441929463686, 0.000000000000000, -0.875658895966293, 0.000000000000000, 0.183824603376167, 0.000000000000000, -3.361653917011686, 0.000000000000000, --0.796615630227952, 0.000000000000000, -1.660226542658673, 0.000000000000000, 1.654439358307226, 0.000000000000000, 2.782812946709771, 0.000000000000000, -1.418064412811531, 0.000000000000000, -0.819645647243761, 0.000000000000000, 0.807724772592699, 0.000000000000000, -0.941967976379298, 0.000000000000000, --2.312768306047469, 0.000000000000000, 0.872426936477443, 0.000000000000000, 0.919528961530845, 0.000000000000000, -2.084904575264847, 0.000000000000000, --1.972464868459322, 0.000000000000000, -1.050687203338466, 0.000000000000000, 1.659579707007902, 0.000000000000000, -1.820640014705855, 0.000000000000000, --1.195078061671045, 0.000000000000000, -1.639773173762048, 0.000000000000000, 1.616744338157063, 0.000000000000000, 4.019216096811563, 0.000000000000000, -3.461021102549681, 0.000000000000000, 1.642352734361484, 0.000000000000000, -0.046354693720813, 0.000000000000000, -0.041936252359677, 0.000000000000000, --2.393307519480551, 0.000000000000000, -0.341471634615121, 0.000000000000000, -0.392073595257017, 0.000000000000000, -0.219299018372730, 0.000000000000000, --2.016391579662071, 0.000000000000000, -0.653096251969787, 0.000000000000000, 1.466353155666821, 0.000000000000000, -2.872058864320412, 0.000000000000000, --2.157180779503830, 0.000000000000000, 0.723257479841560, 0.000000000000000, 3.769951308104384, 0.000000000000000, -1.923392042420024, 0.000000000000000, -0.644899359942840, 0.000000000000000, -2.090226891621437, 0.000000000000000, -0.277043982890403, 0.000000000000000, -0.528271428321112, 0.000000000000000, -2.518120645960652, 0.000000000000000, 1.040820431111488, 0.000000000000000, -4.560583754742486, 0.000000000000000, -0.226899614918836, 0.000000000000000, -1.713331231108959, 0.000000000000000, -3.293941019163642, 0.000000000000000, -1.113331444648290, 0.000000000000000, -1.032308423149906, 0.000000000000000, -1.593774272982443, 0.000000000000000, -1.246840475090529, 0.000000000000000, -0.190344684920137, 0.000000000000000, -1.719386356896355, 0.000000000000000, --2.827721754659679, 0.000000000000000, -0.092438285279020, 0.000000000000000, -0.565844430675246, 0.000000000000000, -1.077916121691716, 0.000000000000000, --1.208665809504693, 0.000000000000000, -2.996014266381254, 0.000000000000000, 2.888573323402423, 0.000000000000000, 2.829507048720695, 0.000000000000000, --0.859177034120755, 0.000000000000000, -1.969302377743254, 0.000000000000000, 0.777437674525362, 0.000000000000000, -0.124910190157646, 0.000000000000000, -0.129875493115290, 0.000000000000000, -4.192139262163992, 0.000000000000000, 3.023496047962126, 0.000000000000000, 1.149775163736637, 0.000000000000000, -2.038151304801731, 0.000000000000000, 3.016122489841263, 0.000000000000000, -4.829481812137012, 0.000000000000000, -1.668436615909279, 0.000000000000000, -0.958586784636918, 0.000000000000000, 1.550652410058678, 0.000000000000000, -1.456305257976716, 0.000000000000000, -0.079588392344731, 0.000000000000000, --2.453213599392345, 0.000000000000000, 0.296795909127105, 0.000000000000000, -0.253426616607643, 0.000000000000000, 1.418937160028195, 0.000000000000000, --1.672949529066915, 0.000000000000000, -1.620990298572947, 0.000000000000000, -1.085103073196045, 0.000000000000000, 0.738606361195386, 0.000000000000000, --2.097831202853255, 0.000000000000000, 2.711952282071310, 0.000000000000000, 1.498539238246888, 0.000000000000000, 1.317457282535915, 0.000000000000000, --0.302765938349717, 0.000000000000000, -0.044623707947201, 0.000000000000000, 2.337405215062395, 0.000000000000000, -3.980689173859100, 0.000000000000000, - - -}; - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c deleted file mode 100644 index 253beb5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/ARM/arm_fft_bin_example_f32.c +++ /dev/null @@ -1,158 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_fft_bin_example_f32.c -* -* Description: Example code demonstrating calculation of Max energy bin of -* frequency domain of input signal. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup FrequencyBin Frequency Bin Example - * - * \par Description - * \par - * Demonstrates the calculation of the maximum energy bin in the frequency - * domain of the input signal with the use of Complex FFT, Complex - * Magnitude, and Maximum functions. - * - * \par Algorithm: - * \par - * The input test signal contains a 10 kHz signal with uniformly distributed white noise. - * Calculating the FFT of the input signal will give us the maximum energy of the - * bin corresponding to the input frequency of 10 kHz. - * - * \par Block Diagram: - * \image html FFTBin.gif "Block Diagram" - * \par - * The figure below shows the time domain signal of 10 kHz signal with - * uniformly distributed white noise, and the next figure shows the input - * in the frequency domain. The bin with maximum energy corresponds to 10 kHz signal. - * \par - * \image html FFTBinInput.gif "Input signal in Time domain" - * \image html FFTBinOutput.gif "Input signal in Frequency domain" - * - * \par Variables Description: - * \par - * \li \c testInput_f32_10khz points to the input data - * \li \c testOutput points to the output data - * \li \c fftSize length of FFT - * \li \c ifftFlag flag for the selection of CFFT/CIFFT - * \li \c doBitReverse Flag for selection of normal order or bit reversed order - * \li \c refIndex reference index value at which maximum energy of bin ocuurs - * \li \c testIndex calculated index value at which maximum energy of bin ocuurs - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_cfft_f32() - * - arm_cmplx_mag_f32() - * - arm_max_f32() - * - * Refer - * \link arm_fft_bin_example_f32.c \endlink - * - */ - - -/** \example arm_fft_bin_example_f32.c - */ - - -#include "arm_math.h" -#include "arm_const_structs.h" - -#define TEST_LENGTH_SAMPLES 2048 - -/* ------------------------------------------------------------------- -* External Input and Output buffer Declarations for FFT Bin Example -* ------------------------------------------------------------------- */ -extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; -static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; - -/* ------------------------------------------------------------------ -* Global variables for FFT Bin Example -* ------------------------------------------------------------------- */ -uint32_t fftSize = 1024; -uint32_t ifftFlag = 0; -uint32_t doBitReverse = 1; - -/* Reference index at which max energy of bin ocuurs */ -uint32_t refIndex = 213, testIndex = 0; - -/* ---------------------------------------------------------------------- -* Max magnitude FFT Bin test -* ------------------------------------------------------------------- */ - -int32_t main(void) -{ - - arm_status status; - float32_t maxValue; - - status = ARM_MATH_SUCCESS; - - /* Process the data through the CFFT/CIFFT module */ - arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse); - - /* Process the data through the Complex Magnitude Module for - calculating the magnitude at each bin */ - arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize); - - /* Calculates maxValue and returns corresponding BIN value */ - arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); - - if(testIndex != refIndex) - { - status = ARM_MATH_TEST_FAILURE; - } - - /* ---------------------------------------------------------------------- - ** Loop here if the signals fail the PASS check. - ** This denotes a test failure - ** ------------------------------------------------------------------- */ - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt deleted file mode 100644 index a8632b0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_fft_bin_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c deleted file mode 100644 index fcc1aab..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_data.c +++ /dev/null @@ -1,308 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_fft_bin_data.c -* -* Description: Data file used for example code -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -Test Input signal contains 10KHz signal + Uniformly distributed white noise -** ------------------------------------------------------------------- */ - -float32_t testInput_f32_10khz[2048] = -{ --0.865129623056441, 0.000000000000000, -2.655020678073846, 0.000000000000000, 0.600664612949661, 0.000000000000000, 0.080378093886515, 0.000000000000000, --2.899160484012034, 0.000000000000000, 2.563004262857762, 0.000000000000000, 3.078328403304206, 0.000000000000000, 0.105906778385130, 0.000000000000000, -0.048366940168201, 0.000000000000000, -0.145696461188734, 0.000000000000000, -0.023417155362879, 0.000000000000000, 2.127729174988954, 0.000000000000000, --1.176633086028377, 0.000000000000000, 3.690223557991855, 0.000000000000000, -0.622791766173194, 0.000000000000000, 0.722837373872203, 0.000000000000000, -2.739754205367484, 0.000000000000000, -0.062610410524552, 0.000000000000000, -0.891296810967338, 0.000000000000000, -1.845872258871811, 0.000000000000000, -1.195039415434387, 0.000000000000000, -2.177388969045026, 0.000000000000000, 1.078649103637905, 0.000000000000000, 2.570976050490193, 0.000000000000000, --1.383551403404574, 0.000000000000000, 2.392141424058873, 0.000000000000000, 2.858002843205065, 0.000000000000000, -3.682433899725536, 0.000000000000000, --3.488146646451150, 0.000000000000000, 1.323468578888120, 0.000000000000000, -0.099771155430726, 0.000000000000000, 1.561168082500454, 0.000000000000000, -1.025026795103179, 0.000000000000000, 0.928841900171200, 0.000000000000000, 2.930499509864950, 0.000000000000000, 2.013349089766430, 0.000000000000000, -2.381676148486737, 0.000000000000000, -3.081062307950236, 0.000000000000000, -0.389579115537544, 0.000000000000000, 0.181540149166620, 0.000000000000000, --2.601953341353208, 0.000000000000000, 0.333435137783218, 0.000000000000000, -2.812945856162965, 0.000000000000000, 2.649109640172910, 0.000000000000000, --1.003963025744654, 0.000000000000000, 1.552460768755035, 0.000000000000000, 0.088641345335247, 0.000000000000000, -2.519951327113426, 0.000000000000000, --4.341348988610527, 0.000000000000000, 0.557772429359965, 0.000000000000000, -1.671267412948494, 0.000000000000000, 0.733951350960387, 0.000000000000000, -0.409263788034864, 0.000000000000000, 3.566033071952806, 0.000000000000000, 1.882565173848352, 0.000000000000000, -1.106017073793287, 0.000000000000000, -0.154456720778718, 0.000000000000000, -2.513205795512153, 0.000000000000000, 0.310978660939421, 0.000000000000000, 0.579706500111723, 0.000000000000000, -0.000086383683251, 0.000000000000000, -1.311866980897721, 0.000000000000000, 1.840007477574986, 0.000000000000000, -3.253005768451345, 0.000000000000000, -1.462584328739432, 0.000000000000000, 1.610103610851738, 0.000000000000000, 0.761914676858907, 0.000000000000000, 0.974541361089834, 0.000000000000000, -0.686845845885983, 0.000000000000000, 1.849153122025191, 0.000000000000000, 0.787800410401453, 0.000000000000000, -1.187438909666279, 0.000000000000000, --0.754937911044720, 0.000000000000000, 0.084373858395232, 0.000000000000000, -2.600269011710521, 0.000000000000000, -0.962982842142644, 0.000000000000000, --0.369328108540868, 0.000000000000000, 0.810791418361879, 0.000000000000000, 3.587016488699641, 0.000000000000000, -0.520776145083723, 0.000000000000000, -0.640249919627884, 0.000000000000000, 1.103122489464969, 0.000000000000000, 2.231779881455556, 0.000000000000000, -1.308035392685241, 0.000000000000000, -0.424070304330106, 0.000000000000000, -0.200383932651189, 0.000000000000000, -2.365526783356541, 0.000000000000000, -0.989114757436628, 0.000000000000000, -2.770807688959777, 0.000000000000000, -0.444172737462307, 0.000000000000000, 0.079760979374078, 0.000000000000000, -0.005199118412183, 0.000000000000000, --0.664712668309527, 0.000000000000000, -0.624171857561896, 0.000000000000000, 0.537306979007338, 0.000000000000000, -2.575955675497642, 0.000000000000000, -1.562363235756780, 0.000000000000000, 1.814069369848895, 0.000000000000000, -1.293428583392509, 0.000000000000000, -1.026188449495686, 0.000000000000000, --2.981771815588717, 0.000000000000000, -4.223468103075124, 0.000000000000000, 2.672674782004045, 0.000000000000000, -0.856096801117735, 0.000000000000000, -0.048517345512563, 0.000000000000000, -0.026860721136222, 0.000000000000000, 0.392932277758187, 0.000000000000000, -1.331740855093099, 0.000000000000000, --1.894292129477081, 0.000000000000000, -1.425006468460681, 0.000000000000000, -2.721772427617057, 0.000000000000000, -1.616831100216806, 0.000000000000000, -3.551177651488947, 0.000000000000000, -0.069685667896087, 0.000000000000000, -3.134634907409102, 0.000000000000000, -0.263627598944639, 0.000000000000000, --1.650469945991350, 0.000000000000000, -2.203580339374399, 0.000000000000000, -0.872203246123242, 0.000000000000000, 1.230782812607287, 0.000000000000000, -0.257288860093291, 0.000000000000000, 1.989083106173137, 0.000000000000000, -1.985638729453261, 0.000000000000000, -1.416185105842892, 0.000000000000000, --1.131097688325772, 0.000000000000000, -2.245130805416057, 0.000000000000000, -1.938873996219074, 0.000000000000000, 2.043608361562645, 0.000000000000000, --0.583727989880841, 0.000000000000000, -1.785266378212929, 0.000000000000000, 1.961457586224753, 0.000000000000000, 1.139400099963223, 0.000000000000000, --1.979519343363991, 0.000000000000000, 2.003023322818429, 0.000000000000000, 0.229004069076829, 0.000000000000000, 3.452808862193135, 0.000000000000000, -2.882273808365857, 0.000000000000000, -1.549450501844438, 0.000000000000000, -3.283872089931876, 0.000000000000000, -0.327025884099064, 0.000000000000000, --0.054979977136430, 0.000000000000000, -1.192280531479012, 0.000000000000000, 0.645539328365578, 0.000000000000000, 2.300832863404618, 0.000000000000000, --1.092951789535240, 0.000000000000000, -1.017368249363773, 0.000000000000000, -0.142673056169787, 0.000000000000000, 0.831073544881250, 0.000000000000000, --2.314612531587064, 0.000000000000000, -2.221456299106321, 0.000000000000000, 0.460261143885226, 0.000000000000000, 0.050585301888595, 0.000000000000000, -0.364373329183988, 0.000000000000000, -1.685956552069538, 0.000000000000000, 0.050664512351055, 0.000000000000000, -0.193355783902718, 0.000000000000000, --0.158660446046828, 0.000000000000000, 2.394156453841953, 0.000000000000000, -1.562965718554525, 0.000000000000000, -2.199750600869900, 0.000000000000000, -1.544984022381773, 0.000000000000000, -1.988307216807315, 0.000000000000000, -0.628240722541046, 0.000000000000000, -1.436235771505429, 0.000000000000000, -1.677013691147313, 0.000000000000000, 1.600741781678228, 0.000000000000000, -0.757380959134706, 0.000000000000000, -4.784797439515566, 0.000000000000000, -0.265121462834569, 0.000000000000000, 3.862029485934378, 0.000000000000000, 2.386823577249430, 0.000000000000000, -3.655779745436893, 0.000000000000000, --0.763541621368016, 0.000000000000000, -1.182140388432962, 0.000000000000000, -1.349106114858063, 0.000000000000000, -2.287533624396759, 0.000000000000000, --0.028603745188423, 0.000000000000000, -1.353580755934427, 0.000000000000000, 0.461602380352937, 0.000000000000000, -0.059599055078928, 0.000000000000000, --0.929946734342228, 0.000000000000000, 0.065773089295561, 0.000000000000000, 1.106565863102982, 0.000000000000000, 4.719295086373593, 0.000000000000000, --2.108377703544395, 0.000000000000000, -2.226393620240159, 0.000000000000000, 1.375668397437521, 0.000000000000000, -0.960772428525443, 0.000000000000000, --2.156313465390571, 0.000000000000000, 1.126060012375311, 0.000000000000000, 2.756485137030720, 0.000000000000000, 0.739639690862600, 0.000000000000000, -3.914769510295006, 0.000000000000000, 1.685232785586675, 0.000000000000000, 4.079058040970612, 0.000000000000000, -1.174598301660513, 0.000000000000000, --2.885776587275580, 0.000000000000000, -0.241073635188767, 0.000000000000000, 3.080489872502403, 0.000000000000000, -2.051244183999421, 0.000000000000000, -0.664330486845139, 0.000000000000000, -1.697798999370016, 0.000000000000000, 1.452369423649782, 0.000000000000000, -1.523532831019280, 0.000000000000000, -0.171981186587481, 0.000000000000000, -4.685274721583927, 0.000000000000000, -1.336175835319380, 0.000000000000000, 1.419070770428945, 0.000000000000000, --0.035791601713475, 0.000000000000000, 2.291937971632081, 0.000000000000000, -1.962559313450293, 0.000000000000000, -4.831595589339301, 0.000000000000000, --1.857055284000925, 0.000000000000000, 2.606271522635512, 0.000000000000000, -0.576447978738030, 0.000000000000000, 0.082299166967720, 0.000000000000000, -1.888399453494614, 0.000000000000000, -3.564705298046079, 0.000000000000000, -0.939357831083889, 0.000000000000000, -1.903578203697778, 0.000000000000000, --2.642492215447250, 0.000000000000000, -0.182990405251017, 0.000000000000000, 3.742026478011174, 0.000000000000000, 0.104295803798333, 0.000000000000000, -1.848678195370347, 0.000000000000000, -1.887384346896369, 0.000000000000000, 0.365048973046045, 0.000000000000000, -0.889638010354219, 0.000000000000000, -1.173877118428863, 0.000000000000000, -1.178562827540109, 0.000000000000000, 0.610271645685184, 0.000000000000000, 1.831284815697871, 0.000000000000000, -0.449575390102283, 0.000000000000000, 1.597171905253443, 0.000000000000000, 3.918574971904773, 0.000000000000000, 0.868104027970404, 0.000000000000000, -0.582643134746494, 0.000000000000000, 2.321256382353331, 0.000000000000000, -0.238118642223180, 0.000000000000000, -2.890287868054370, 0.000000000000000, -0.970995414625622, 0.000000000000000, 0.666137930891283, 0.000000000000000, -0.202435718709502, 0.000000000000000, 2.057930200518194, 0.000000000000000, -3.120583443719949, 0.000000000000000, -0.863945271701041, 0.000000000000000, 0.906848893874630, 0.000000000000000, -1.434124930222570, 0.000000000000000, -0.754659384848783, 0.000000000000000, -5.224154442713778, 0.000000000000000, 2.330229744098967, 0.000000000000000, 1.113946320164698, 0.000000000000000, -0.523324920322840, 0.000000000000000, 1.750740911548348, 0.000000000000000, -0.899333972913577, 0.000000000000000, 0.228705845203506, 0.000000000000000, --1.934782624767648, 0.000000000000000, -3.508386237231303, 0.000000000000000, -2.107108523073510, 0.000000000000000, 0.380587645474815, 0.000000000000000, --0.476200877183279, 0.000000000000000, -2.172086712642198, 0.000000000000000, 1.795372535780299, 0.000000000000000, -2.100318983391055, 0.000000000000000, --0.022571122461405, 0.000000000000000, 0.674514020010955, 0.000000000000000, -0.148872569390857, 0.000000000000000, 0.298175890592737, 0.000000000000000, --1.134244492493590, 0.000000000000000, -3.146848422289455, 0.000000000000000, -1.357950199087602, 0.000000000000000, 0.667362732020878, 0.000000000000000, --3.119397998316724, 0.000000000000000, -1.189341126297637, 0.000000000000000, -1.532744386856668, 0.000000000000000, -1.672972484202534, 0.000000000000000, --2.042283373871558, 0.000000000000000, -1.479481547595924, 0.000000000000000, -0.002668662875396, 0.000000000000000, 0.262737760129546, 0.000000000000000, -2.734456080621830, 0.000000000000000, -0.671945925075102, 0.000000000000000, -3.735078262179111, 0.000000000000000, -0.161705013319883, 0.000000000000000, -0.748963512361001, 0.000000000000000, 1.128046374367600, 0.000000000000000, 0.649651335592966, 0.000000000000000, 1.880020215025867, 0.000000000000000, --1.095632293842306, 0.000000000000000, 1.197764876160487, 0.000000000000000, 0.323646656252985, 0.000000000000000, -1.655502751114502, 0.000000000000000, -3.666399062961496, 0.000000000000000, -0.334060899735197, 0.000000000000000, -2.119056978738397, 0.000000000000000, 3.721375117275012, 0.000000000000000, -0.044874186872307, 0.000000000000000, -2.733053897593234, 0.000000000000000, 1.590700278891042, 0.000000000000000, 3.215711772781902, 0.000000000000000, --1.792085012843801, 0.000000000000000, -0.405797188885475, 0.000000000000000, -0.628080020080892, 0.000000000000000, -1.831815840843960, 0.000000000000000, -2.973656862522834, 0.000000000000000, -0.212032655138417, 0.000000000000000, 0.372437389437234, 0.000000000000000, -1.614030579023492, 0.000000000000000, --0.704900996358698, 0.000000000000000, 1.123700273452105, 0.000000000000000, -0.136371848130819, 0.000000000000000, 3.020284357635585, 0.000000000000000, --0.550211350877649, 0.000000000000000, 5.101256236381711, 0.000000000000000, 3.367051512192333, 0.000000000000000, -4.385131946669234, 0.000000000000000, --3.967303337694391, 0.000000000000000, -0.965894936640022, 0.000000000000000, 0.328366945264681, 0.000000000000000, 0.199041562924914, 0.000000000000000, -1.067681999025495, 0.000000000000000, -1.939516091697170, 0.000000000000000, -1.092980954328824, 0.000000000000000, 0.273786079368066, 0.000000000000000, --0.040928322190265, 0.000000000000000, -0.118368078577437, 0.000000000000000, 1.766589628899997, 0.000000000000000, 1.738321311635393, 0.000000000000000, --2.895012794321649, 0.000000000000000, 1.213521771395142, 0.000000000000000, 0.922971726633985, 0.000000000000000, 1.091516563636489, 0.000000000000000, -3.226378465469620, 0.000000000000000, 1.149169778666974, 0.000000000000000, -1.695986327709386, 0.000000000000000, -0.974803077355813, 0.000000000000000, --4.898035507513607, 0.000000000000000, 1.622719302889447, 0.000000000000000, 0.583891313586579, 0.000000000000000, -1.677182424094957, 0.000000000000000, --1.915633132814685, 0.000000000000000, -1.980150370851616, 0.000000000000000, 0.604538269404190, 0.000000000000000, 0.939862406149365, 0.000000000000000, --1.266939874246416, 0.000000000000000, -1.494771249200063, 0.000000000000000, 0.278042784093988, 0.000000000000000, 0.326627416008916, 0.000000000000000, --1.914530157643303, 0.000000000000000, 1.908947721862196, 0.000000000000000, 0.531819285694044, 0.000000000000000, 3.056856632319658, 0.000000000000000, --0.389241827774643, 0.000000000000000, -2.418606606780420, 0.000000000000000, 0.915299238878703, 0.000000000000000, -0.098774174295283, 0.000000000000000, --0.906199428444304, 0.000000000000000, 0.316716451217743, 0.000000000000000, -4.367700643578311, 0.000000000000000, 1.491687997515293, 0.000000000000000, --1.962381126288365, 0.000000000000000, -0.700829196527045, 0.000000000000000, 3.028958963615630, 0.000000000000000, -2.313461067462598, 0.000000000000000, --1.431933239886712, 0.000000000000000, -0.831153039725342, 0.000000000000000, 3.939495598250743, 0.000000000000000, 0.342974753984771, 0.000000000000000, --2.768330763002974, 0.000000000000000, -2.744010370019008, 0.000000000000000, 3.821352685212561, 0.000000000000000, 4.551065271455856, 0.000000000000000, -3.270136437041298, 0.000000000000000, -3.188028411950982, 0.000000000000000, -0.777075012417436, 0.000000000000000, 0.097110650265216, 0.000000000000000, -1.221216137608812, 0.000000000000000, -1.325824244541822, 0.000000000000000, -2.655296734084113, 0.000000000000000, -1.074792144885704, 0.000000000000000, -2.770401584439407, 0.000000000000000, 5.240270645610543, 0.000000000000000, 0.108576672208892, 0.000000000000000, -1.209394350650142, 0.000000000000000, -1.403344353838785, 0.000000000000000, -0.299032904177277, 0.000000000000000, 4.074959450638227, 0.000000000000000, 1.718727473952107, 0.000000000000000, --3.061349227080806, 0.000000000000000, -1.158596888541269, 0.000000000000000, 3.381858904662625, 0.000000000000000, 0.957339964054052, 0.000000000000000, -0.179900074904899, 0.000000000000000, -3.909641902506081, 0.000000000000000, 0.805717289408649, 0.000000000000000, 2.047413793928261, 0.000000000000000, --1.273580225826614, 0.000000000000000, -2.681359186869971, 0.000000000000000, -0.721241345822093, 0.000000000000000, -1.613090681569475, 0.000000000000000, -0.463138804815955, 0.000000000000000, 0.377223507800954, 0.000000000000000, 2.046550684968141, 0.000000000000000, 0.178508732797712, 0.000000000000000, --0.477815330358845, 0.000000000000000, 3.763355908332053, 0.000000000000000, 1.300430303035163, 0.000000000000000, -0.214625793857725, 0.000000000000000, -1.343267891864081, 0.000000000000000, -0.340007682433245, 0.000000000000000, 2.062703194680005, 0.000000000000000, 0.042032160234235, 0.000000000000000, -0.643732569732250, 0.000000000000000, -1.913502543857589, 0.000000000000000, 3.771340762937158, 0.000000000000000, 1.050024807363386, 0.000000000000000, --4.440489488592649, 0.000000000000000, 0.444904302066643, 0.000000000000000, 2.898702265650048, 0.000000000000000, 1.953232980548558, 0.000000000000000, -2.761564952735079, 0.000000000000000, 1.963537633260397, 0.000000000000000, -2.168858472916215, 0.000000000000000, -4.116235357699841, 0.000000000000000, -4.183678271896528, 0.000000000000000, 0.600422284944681, 0.000000000000000, -0.659352647255126, 0.000000000000000, -0.993127338218109, 0.000000000000000, --2.463571314945747, 0.000000000000000, 0.937720951545881, 0.000000000000000, -3.098957308429730, 0.000000000000000, -2.354719140045463, 0.000000000000000, --0.417285119323949, 0.000000000000000, 2.187974075975947, 0.000000000000000, 1.101468905172585, 0.000000000000000, -3.185800678152109, 0.000000000000000, -2.357534709345083, 0.000000000000000, 0.246645606729407, 0.000000000000000, 4.440905650784504, 0.000000000000000, -2.236807716637866, 0.000000000000000, --2.171481518317550, 0.000000000000000, -2.029571795072690, 0.000000000000000, 0.135599790431348, 0.000000000000000, -1.277965265520191, 0.000000000000000, --1.927976233157507, 0.000000000000000, -5.434492783745394, 0.000000000000000, -2.026375829312657, 0.000000000000000, 1.009666016819321, 0.000000000000000, -0.238549782367247, 0.000000000000000, -0.516403923971309, 0.000000000000000, -0.933977817429352, 0.000000000000000, 0.155803015935614, 0.000000000000000, --0.396194809997929, 0.000000000000000, -0.915178100253214, 0.000000000000000, 0.666329367985015, 0.000000000000000, -1.517991149945785, 0.000000000000000, -0.458266744144822, 0.000000000000000, -1.242845974381418, 0.000000000000000, 0.057914823556477, 0.000000000000000, 0.994101307476875, 0.000000000000000, --2.387209849199325, 0.000000000000000, 0.459297048883826, 0.000000000000000, 0.227711405683905, 0.000000000000000, 0.030255073506117, 0.000000000000000, --1.323361608181337, 0.000000000000000, -4.650244457426706, 0.000000000000000, 0.062908579526021, 0.000000000000000, 3.462831028244432, 0.000000000000000, -1.303608183314856, 0.000000000000000, -1.430415193881612, 0.000000000000000, -1.672886118942142, 0.000000000000000, 0.992890699210099, 0.000000000000000, --0.160814531784247, 0.000000000000000, -1.238132939350430, 0.000000000000000, -0.589223271459376, 0.000000000000000, 2.326363810561534, 0.000000000000000, --4.433789496230785, 0.000000000000000, 1.664686987538929, 0.000000000000000, -2.366128834617921, 0.000000000000000, 1.212421570743837, 0.000000000000000, --4.847914267690055, 0.000000000000000, 0.228485221404712, 0.000000000000000, 0.466139765470957, 0.000000000000000, -1.344202776943546, 0.000000000000000, --1.012053673330574, 0.000000000000000, -2.844980626424742, 0.000000000000000, -1.552703722026340, 0.000000000000000, -1.448830983885038, 0.000000000000000, -0.127010756753980, 0.000000000000000, -1.667188263752299, 0.000000000000000, 3.424818052085100, 0.000000000000000, 0.956291135453840, 0.000000000000000, --3.725533331754662, 0.000000000000000, -1.584534272368832, 0.000000000000000, -1.654148210472472, 0.000000000000000, 0.701610500675698, 0.000000000000000, -0.164954538683927, 0.000000000000000, -0.739260064712987, 0.000000000000000, -2.167324026090101, 0.000000000000000, -0.310240491909496, 0.000000000000000, --2.281790349106906, 0.000000000000000, 1.719655331305361, 0.000000000000000, -2.997005923606441, 0.000000000000000, -1.999301431556852, 0.000000000000000, --0.292229010068828, 0.000000000000000, 1.172317994855851, 0.000000000000000, 0.196734885241533, 0.000000000000000, 2.981365193477068, 0.000000000000000, -2.637726016926352, 0.000000000000000, 1.434045125217982, 0.000000000000000, 0.883627180451827, 0.000000000000000, -1.434040761445747, 0.000000000000000, --1.528891971086553, 0.000000000000000, -3.306913135367542, 0.000000000000000, -0.399059265470646, 0.000000000000000, -0.265674394285178, 0.000000000000000, -3.502591252855384, 0.000000000000000, 0.830301156604454, 0.000000000000000, -0.220021317046083, 0.000000000000000, -0.090553770476646, 0.000000000000000, -0.771863477047951, 0.000000000000000, 1.351209629105760, 0.000000000000000, 3.773699756201963, 0.000000000000000, 0.472600118752329, 0.000000000000000, -2.332825668012222, 0.000000000000000, 1.853747950314528, 0.000000000000000, 0.759515251766178, 0.000000000000000, 1.327112776215496, 0.000000000000000, -2.518730296237868, 0.000000000000000, 0.764450208786353, 0.000000000000000, -0.278275349491296, 0.000000000000000, -0.041559465082020, 0.000000000000000, -1.387166083167787, 0.000000000000000, 2.612996769598122, 0.000000000000000, -0.385404831721799, 0.000000000000000, 2.005630016170309, 0.000000000000000, --0.950500047307998, 0.000000000000000, -1.166884021392492, 0.000000000000000, 1.432973552928162, 0.000000000000000, 2.540370505384567, 0.000000000000000, --1.140505295054501, 0.000000000000000, -3.673358835201185, 0.000000000000000, -0.450691288038056, 0.000000000000000, 1.601024294408014, 0.000000000000000, -0.773213556014045, 0.000000000000000, 2.973873693246168, 0.000000000000000, -1.361548406382279, 0.000000000000000, 1.409136332424815, 0.000000000000000, --0.963382518314713, 0.000000000000000, -2.031268227368161, 0.000000000000000, 0.983309972085586, 0.000000000000000, -3.461412488471631, 0.000000000000000, --2.601124929406039, 0.000000000000000, -0.533896239766343, 0.000000000000000, -2.627129008866350, 0.000000000000000, 0.622111169161305, 0.000000000000000, --1.160926365580422, 0.000000000000000, -2.406196188132628, 0.000000000000000, -1.076870362758737, 0.000000000000000, -1.791866820937175, 0.000000000000000, --0.749453071522325, 0.000000000000000, -5.324156615990973, 0.000000000000000, -1.038698022238289, 0.000000000000000, -2.106629944730630, 0.000000000000000, -0.659295598564773, 0.000000000000000, 0.520940881580988, 0.000000000000000, -0.055649203928700, 0.000000000000000, 0.292096765423137, 0.000000000000000, --4.663743901790872, 0.000000000000000, -0.125066503391666, 0.000000000000000, -2.452620252445380, 0.000000000000000, -0.712128227397468, 0.000000000000000, --0.048938037970968, 0.000000000000000, -1.821520226003361, 0.000000000000000, 0.810106421304257, 0.000000000000000, -0.196636623956257, 0.000000000000000, --0.701769836763804, 0.000000000000000, 2.460345045649201, 0.000000000000000, 3.506597671641116, 0.000000000000000, -2.711322611972225, 0.000000000000000, --0.658079876600542, 0.000000000000000, -2.040082099646173, 0.000000000000000, 2.201668355395807, 0.000000000000000, 1.181507395879711, 0.000000000000000, --1.640739552179682, 0.000000000000000, -1.613393726467190, 0.000000000000000, -1.156741241731352, 0.000000000000000, 2.527773464519963, 0.000000000000000, --0.497040638009502, 0.000000000000000, -0.975817112895589, 0.000000000000000, -2.866830755546166, 0.000000000000000, 1.120214498507878, 0.000000000000000, -5.986771654661698, 0.000000000000000, 0.398219252656757, 0.000000000000000, -3.545606013198135, 0.000000000000000, 0.312398099396191, 0.000000000000000, --2.265327979531788, 0.000000000000000, 0.792121001107366, 0.000000000000000, -3.736145137670100, 0.000000000000000, 0.762228883650802, 0.000000000000000, -2.283545661214646, 0.000000000000000, 3.780020629583529, 0.000000000000000, 3.117260228608810, 0.000000000000000, -2.011159255609613, 0.000000000000000, -0.279107700476072, 0.000000000000000, 2.003369134246936, 0.000000000000000, -1.448171234480257, 0.000000000000000, 0.584697150310140, 0.000000000000000, -0.919508663636197, 0.000000000000000, -3.071349141675388, 0.000000000000000, -1.555923649263667, 0.000000000000000, 2.232497079438850, 0.000000000000000, --0.012662139119883, 0.000000000000000, 0.372825540734715, 0.000000000000000, 2.378543590847629, 0.000000000000000, 1.459053407813062, 0.000000000000000, --0.967913907390927, 0.000000000000000, 1.322825200678212, 0.000000000000000, -1.033775820061824, 0.000000000000000, -1.813629552693142, 0.000000000000000, -4.794348161661486, 0.000000000000000, 0.655279811518676, 0.000000000000000, -2.224590138589720, 0.000000000000000, 0.595329481295766, 0.000000000000000, -3.364055988866225, 0.000000000000000, 1.863416422998127, 0.000000000000000, 1.930305751828105, 0.000000000000000, -0.284467053432545, 0.000000000000000, --0.923374905878938, 0.000000000000000, 1.922988234041399, 0.000000000000000, 0.310482143432719, 0.000000000000000, 0.332122302397134, 0.000000000000000, --1.659487472408966, 0.000000000000000, -1.865943507877961, 0.000000000000000, -0.186775297569864, 0.000000000000000, -1.700543850628361, 0.000000000000000, -0.497157959366735, 0.000000000000000, -0.471244843957418, 0.000000000000000, -0.432013753969948, 0.000000000000000, -4.000189880113231, 0.000000000000000, --0.415335170016467, 0.000000000000000, 0.317311950972859, 0.000000000000000, 0.038393428927595, 0.000000000000000, 0.177219909465206, 0.000000000000000, -0.531650958095143, 0.000000000000000, -2.711644985175806, 0.000000000000000, 0.328744077805156, 0.000000000000000, -0.938417707547928, 0.000000000000000, -0.970379584897379, 0.000000000000000, 1.873649473917137, 0.000000000000000, 0.177938226987023, 0.000000000000000, 0.155609346302393, 0.000000000000000, --1.276504241867208, 0.000000000000000, -0.463725075928807, 0.000000000000000, -0.064748250389500, 0.000000000000000, -1.725568534062385, 0.000000000000000, --0.139066584804067, 0.000000000000000, 1.975514554117767, 0.000000000000000, -0.807063199499478, 0.000000000000000, -0.326926659682788, 0.000000000000000, -1.445727032487938, 0.000000000000000, -0.597151107739100, 0.000000000000000, 2.732557531709386, 0.000000000000000, -2.907130934109188, 0.000000000000000, --1.461264832679981, 0.000000000000000, -1.708588604968163, 0.000000000000000, 3.652851925431363, 0.000000000000000, 0.682050868282879, 0.000000000000000, --0.281312579963294, 0.000000000000000, 0.554966483307825, 0.000000000000000, -0.981341739340932, 0.000000000000000, 1.279543331141603, 0.000000000000000, -0.036589747826856, 0.000000000000000, 2.312073745896073, 0.000000000000000, 1.754682200732425, 0.000000000000000, -0.957515875428627, 0.000000000000000, --0.833596942819695, 0.000000000000000, 0.437054368791033, 0.000000000000000, -0.898819399360279, 0.000000000000000, -0.296050580896839, 0.000000000000000, --0.785144257649601, 0.000000000000000, -2.541503089003311, 0.000000000000000, 2.225075846758761, 0.000000000000000, -1.587290487902002, 0.000000000000000, --1.421404172056462, 0.000000000000000, -3.015149802293631, 0.000000000000000, 1.780874288867949, 0.000000000000000, -0.865812740882613, 0.000000000000000, --2.845327531197112, 0.000000000000000, 1.445225867774367, 0.000000000000000, 2.183733236584647, 0.000000000000000, 1.163371072749080, 0.000000000000000, -0.883547693520409, 0.000000000000000, -1.224093106684675, 0.000000000000000, -1.854501116331044, 0.000000000000000, 1.783082089255796, 0.000000000000000, -2.301508706196191, 0.000000000000000, -0.539901944139077, 0.000000000000000, 1.962315832319967, 0.000000000000000, -0.060709041870503, 0.000000000000000, --1.353139923300238, 0.000000000000000, -1.482887537805234, 0.000000000000000, 1.273732601967176, 0.000000000000000, -3.456609915556321, 0.000000000000000, --3.752320586540873, 0.000000000000000, 3.536356614978951, 0.000000000000000, 0.206035952043233, 0.000000000000000, 5.933966913773842, 0.000000000000000, --0.486633898075490, 0.000000000000000, -0.329595089863342, 0.000000000000000, 1.496414153905337, 0.000000000000000, 0.137868749388880, 0.000000000000000, --0.437192030996792, 0.000000000000000, 2.682750615210656, 0.000000000000000, -2.440234892848570, 0.000000000000000, 1.433910252426186, 0.000000000000000, --0.415051506104074, 0.000000000000000, 1.982003013708649, 0.000000000000000, 1.345796609972435, 0.000000000000000, -2.335949513404370, 0.000000000000000, -1.065988867433025, 0.000000000000000, 2.741844905000464, 0.000000000000000, -1.754047930934362, 0.000000000000000, 0.229252730015575, 0.000000000000000, --0.679791016408669, 0.000000000000000, -2.274097820043743, 0.000000000000000, 0.149802252231876, 0.000000000000000, -0.139697151364830, 0.000000000000000, --2.773367420505435, 0.000000000000000, -4.403400246165611, 0.000000000000000, -1.468974515184135, 0.000000000000000, 0.664990623095844, 0.000000000000000, --3.446979775557143, 0.000000000000000, 1.850006428987618, 0.000000000000000, -1.550866747921936, 0.000000000000000, -3.632874882935257, 0.000000000000000, -0.828039662992464, 0.000000000000000, 2.794055182632816, 0.000000000000000, -0.593995716682633, 0.000000000000000, 0.142788156054200, 0.000000000000000, -0.552461945119668, 0.000000000000000, 0.842127129738758, 0.000000000000000, 1.414335509600077, 0.000000000000000, -0.311559241382430, 0.000000000000000, -1.510590844695250, 0.000000000000000, 1.692217183824300, 0.000000000000000, 0.613760285711957, 0.000000000000000, 0.065233463207770, 0.000000000000000, --2.571912893711505, 0.000000000000000, -1.707001531141341, 0.000000000000000, 0.673884968382041, 0.000000000000000, 0.889863883420103, 0.000000000000000, --2.395635435233346, 0.000000000000000, 1.129247296359819, 0.000000000000000, 0.569074704779735, 0.000000000000000, 6.139436017480722, 0.000000000000000, -0.822158309259017, 0.000000000000000, -3.289872016222589, 0.000000000000000, 0.417612988384414, 0.000000000000000, 1.493982103868165, 0.000000000000000, --0.415353391377005, 0.000000000000000, 0.288670764933155, 0.000000000000000, -1.895650228872272, 0.000000000000000, -0.139631694475020, 0.000000000000000, -1.445103299005436, 0.000000000000000, 2.877182243683429, 0.000000000000000, 1.192428490172580, 0.000000000000000, -5.964591921763842, 0.000000000000000, -0.570859795882959, 0.000000000000000, 2.328333316356666, 0.000000000000000, 0.333755014930026, 0.000000000000000, 1.221901577771909, 0.000000000000000, -0.943358697415568, 0.000000000000000, 2.793063983613067, 0.000000000000000, 3.163005066073616, 0.000000000000000, 2.098300664513867, 0.000000000000000, --3.915313164333447, 0.000000000000000, -2.475766769064539, 0.000000000000000, 1.720472044894277, 0.000000000000000, -1.273591949275665, 0.000000000000000, --1.213451272938616, 0.000000000000000, 0.697439404325690, 0.000000000000000, -0.309902287574293, 0.000000000000000, 2.622575852162781, 0.000000000000000, --2.075881936219060, 0.000000000000000, 0.777847545691770, 0.000000000000000, -3.967947986440650, 0.000000000000000, -3.066503371806472, 0.000000000000000, -1.193780625937845, 0.000000000000000, 0.214246579281311, 0.000000000000000, -2.610681491162162, 0.000000000000000, -1.261224183972745, 0.000000000000000, --1.165071748544285, 0.000000000000000, -1.116548474834374, 0.000000000000000, 0.847202164846982, 0.000000000000000, -3.474301529532390, 0.000000000000000, -0.020799541946476, 0.000000000000000, -3.868995473288166, 0.000000000000000, 1.757979409638067, 0.000000000000000, 0.868115130183109, 0.000000000000000, -0.910167436737958, 0.000000000000000, -1.878855115563720, 0.000000000000000, 1.710357104174161, 0.000000000000000, -1.468933980990902, 0.000000000000000, -1.799544171601169, 0.000000000000000, -4.922332880027887, 0.000000000000000, 0.219424548939720, 0.000000000000000, -0.971671113451924, 0.000000000000000, --0.940533475616266, 0.000000000000000, 0.122510114412152, 0.000000000000000, -1.373686254916911, 0.000000000000000, 1.760348103896323, 0.000000000000000, -0.391745067829643, 0.000000000000000, 2.521958505327354, 0.000000000000000, -1.300693516405092, 0.000000000000000, -0.538251788309178, 0.000000000000000, -0.797184135810173, 0.000000000000000, 2.908800548982588, 0.000000000000000, 1.590902251655215, 0.000000000000000, -1.070323714487264, 0.000000000000000, --3.349764443340999, 0.000000000000000, -1.190563529731447, 0.000000000000000, 1.363369471291963, 0.000000000000000, -1.814270299924576, 0.000000000000000, --0.023381588315711, 0.000000000000000, 1.719182048679569, 0.000000000000000, 0.839917213252626, 0.000000000000000, 1.006099633839122, 0.000000000000000, -0.812462674381527, 0.000000000000000, 1.755814336346739, 0.000000000000000, 2.546848681206319, 0.000000000000000, -1.555300208869455, 0.000000000000000, -1.017053811631167, 0.000000000000000, 0.996591039170903, 0.000000000000000, -1.228047247924881, 0.000000000000000, 4.809462271463009, 0.000000000000000, -2.318113116151685, 0.000000000000000, -1.206932520679733, 0.000000000000000, 1.273757685623312, 0.000000000000000, 0.724335352481802, 0.000000000000000, -1.519876652073198, 0.000000000000000, -2.749670314714158, 0.000000000000000, 3.424042481847581, 0.000000000000000, -3.714668360421517, 0.000000000000000, -1.612834197004014, 0.000000000000000, -2.038234723985566, 0.000000000000000, 1.470938786562152, 0.000000000000000, 2.111634918450302, 0.000000000000000, -1.030376670151787, 0.000000000000000, -0.420877189003829, 0.000000000000000, -1.502024800532894, 0.000000000000000, 0.452310749163804, 0.000000000000000, --1.606059382300987, 0.000000000000000, -4.006159967834147, 0.000000000000000, -2.152801208196508, 0.000000000000000, 1.671674089372579, 0.000000000000000, -1.714536333564101, 0.000000000000000, -1.011518543005344, 0.000000000000000, -0.576410282180584, 0.000000000000000, 0.733689809480836, 0.000000000000000, -1.004245602717974, 0.000000000000000, 1.010090391888449, 0.000000000000000, 3.811459513385621, 0.000000000000000, -5.230621089271954, 0.000000000000000, -0.678044861034399, 0.000000000000000, 1.255935859598107, 0.000000000000000, 1.674521701615288, 0.000000000000000, -1.656695216761705, 0.000000000000000, -1.169286028869693, 0.000000000000000, 0.524915416191998, 0.000000000000000, 2.397642885039520, 0.000000000000000, 2.108711400616072, 0.000000000000000, -2.037618211018084, 0.000000000000000, -0.623664553406925, 0.000000000000000, 2.984106170984409, 0.000000000000000, 1.132182737400932, 0.000000000000000, --2.859274340352130, 0.000000000000000, -0.975550071398723, 0.000000000000000, -1.359935119997407, 0.000000000000000, -2.963308211050121, 0.000000000000000, --0.228726662781163, 0.000000000000000, -1.411110379682043, 0.000000000000000, 0.741553355734225, 0.000000000000000, 0.497554254758309, 0.000000000000000, -2.371907950598855, 0.000000000000000, 1.063465168988748, 0.000000000000000, -0.641082692081488, 0.000000000000000, -0.855439878540726, 0.000000000000000, -0.578321738578726, 0.000000000000000, 3.005809768796194, 0.000000000000000, 1.961458699064065, 0.000000000000000, -3.206261663772745, 0.000000000000000, --0.364431989095434, 0.000000000000000, -0.263182496622273, 0.000000000000000, 1.843464680631139, 0.000000000000000, -0.419107530229249, 0.000000000000000, -1.662335873298487, 0.000000000000000, -0.853687563304005, 0.000000000000000, -2.584133404357169, 0.000000000000000, 3.466839568922895, 0.000000000000000, -0.881671345091973, 0.000000000000000, 0.454620014206908, 0.000000000000000, -1.737245187402739, 0.000000000000000, 2.162713238369243, 0.000000000000000, --3.868539002714486, 0.000000000000000, 2.014114855933826, 0.000000000000000, -0.703233831811006, 0.000000000000000, -3.410319935997574, 0.000000000000000, --1.851235811006584, 0.000000000000000, 0.909783907894036, 0.000000000000000, 0.091884002136728, 0.000000000000000, -2.688294201131650, 0.000000000000000, --0.906134178460955, 0.000000000000000, 3.475054609035133, 0.000000000000000, -0.573927964170323, 0.000000000000000, -0.429542937515399, 0.000000000000000, -0.991348618739939, 0.000000000000000, 1.974804904926325, 0.000000000000000, 0.975783450796698, 0.000000000000000, -3.057119549071503, 0.000000000000000, --3.899429237481194, 0.000000000000000, 0.362439009175350, 0.000000000000000, -1.124461670265618, 0.000000000000000, 1.806000360163583, 0.000000000000000, --2.768333362600288, 0.000000000000000, 0.244387897900379, 0.000000000000000, 0.908767296720926, 0.000000000000000, 1.254669374391882, 0.000000000000000, --1.420441929463686, 0.000000000000000, -0.875658895966293, 0.000000000000000, 0.183824603376167, 0.000000000000000, -3.361653917011686, 0.000000000000000, --0.796615630227952, 0.000000000000000, -1.660226542658673, 0.000000000000000, 1.654439358307226, 0.000000000000000, 2.782812946709771, 0.000000000000000, -1.418064412811531, 0.000000000000000, -0.819645647243761, 0.000000000000000, 0.807724772592699, 0.000000000000000, -0.941967976379298, 0.000000000000000, --2.312768306047469, 0.000000000000000, 0.872426936477443, 0.000000000000000, 0.919528961530845, 0.000000000000000, -2.084904575264847, 0.000000000000000, --1.972464868459322, 0.000000000000000, -1.050687203338466, 0.000000000000000, 1.659579707007902, 0.000000000000000, -1.820640014705855, 0.000000000000000, --1.195078061671045, 0.000000000000000, -1.639773173762048, 0.000000000000000, 1.616744338157063, 0.000000000000000, 4.019216096811563, 0.000000000000000, -3.461021102549681, 0.000000000000000, 1.642352734361484, 0.000000000000000, -0.046354693720813, 0.000000000000000, -0.041936252359677, 0.000000000000000, --2.393307519480551, 0.000000000000000, -0.341471634615121, 0.000000000000000, -0.392073595257017, 0.000000000000000, -0.219299018372730, 0.000000000000000, --2.016391579662071, 0.000000000000000, -0.653096251969787, 0.000000000000000, 1.466353155666821, 0.000000000000000, -2.872058864320412, 0.000000000000000, --2.157180779503830, 0.000000000000000, 0.723257479841560, 0.000000000000000, 3.769951308104384, 0.000000000000000, -1.923392042420024, 0.000000000000000, -0.644899359942840, 0.000000000000000, -2.090226891621437, 0.000000000000000, -0.277043982890403, 0.000000000000000, -0.528271428321112, 0.000000000000000, -2.518120645960652, 0.000000000000000, 1.040820431111488, 0.000000000000000, -4.560583754742486, 0.000000000000000, -0.226899614918836, 0.000000000000000, -1.713331231108959, 0.000000000000000, -3.293941019163642, 0.000000000000000, -1.113331444648290, 0.000000000000000, -1.032308423149906, 0.000000000000000, -1.593774272982443, 0.000000000000000, -1.246840475090529, 0.000000000000000, -0.190344684920137, 0.000000000000000, -1.719386356896355, 0.000000000000000, --2.827721754659679, 0.000000000000000, -0.092438285279020, 0.000000000000000, -0.565844430675246, 0.000000000000000, -1.077916121691716, 0.000000000000000, --1.208665809504693, 0.000000000000000, -2.996014266381254, 0.000000000000000, 2.888573323402423, 0.000000000000000, 2.829507048720695, 0.000000000000000, --0.859177034120755, 0.000000000000000, -1.969302377743254, 0.000000000000000, 0.777437674525362, 0.000000000000000, -0.124910190157646, 0.000000000000000, -0.129875493115290, 0.000000000000000, -4.192139262163992, 0.000000000000000, 3.023496047962126, 0.000000000000000, 1.149775163736637, 0.000000000000000, -2.038151304801731, 0.000000000000000, 3.016122489841263, 0.000000000000000, -4.829481812137012, 0.000000000000000, -1.668436615909279, 0.000000000000000, -0.958586784636918, 0.000000000000000, 1.550652410058678, 0.000000000000000, -1.456305257976716, 0.000000000000000, -0.079588392344731, 0.000000000000000, --2.453213599392345, 0.000000000000000, 0.296795909127105, 0.000000000000000, -0.253426616607643, 0.000000000000000, 1.418937160028195, 0.000000000000000, --1.672949529066915, 0.000000000000000, -1.620990298572947, 0.000000000000000, -1.085103073196045, 0.000000000000000, 0.738606361195386, 0.000000000000000, --2.097831202853255, 0.000000000000000, 2.711952282071310, 0.000000000000000, 1.498539238246888, 0.000000000000000, 1.317457282535915, 0.000000000000000, --0.302765938349717, 0.000000000000000, -0.044623707947201, 0.000000000000000, 2.337405215062395, 0.000000000000000, -3.980689173859100, 0.000000000000000, - - -}; - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c deleted file mode 100644 index 253beb5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fft_bin_example/GCC/arm_fft_bin_example_f32.c +++ /dev/null @@ -1,158 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_fft_bin_example_f32.c -* -* Description: Example code demonstrating calculation of Max energy bin of -* frequency domain of input signal. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup FrequencyBin Frequency Bin Example - * - * \par Description - * \par - * Demonstrates the calculation of the maximum energy bin in the frequency - * domain of the input signal with the use of Complex FFT, Complex - * Magnitude, and Maximum functions. - * - * \par Algorithm: - * \par - * The input test signal contains a 10 kHz signal with uniformly distributed white noise. - * Calculating the FFT of the input signal will give us the maximum energy of the - * bin corresponding to the input frequency of 10 kHz. - * - * \par Block Diagram: - * \image html FFTBin.gif "Block Diagram" - * \par - * The figure below shows the time domain signal of 10 kHz signal with - * uniformly distributed white noise, and the next figure shows the input - * in the frequency domain. The bin with maximum energy corresponds to 10 kHz signal. - * \par - * \image html FFTBinInput.gif "Input signal in Time domain" - * \image html FFTBinOutput.gif "Input signal in Frequency domain" - * - * \par Variables Description: - * \par - * \li \c testInput_f32_10khz points to the input data - * \li \c testOutput points to the output data - * \li \c fftSize length of FFT - * \li \c ifftFlag flag for the selection of CFFT/CIFFT - * \li \c doBitReverse Flag for selection of normal order or bit reversed order - * \li \c refIndex reference index value at which maximum energy of bin ocuurs - * \li \c testIndex calculated index value at which maximum energy of bin ocuurs - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_cfft_f32() - * - arm_cmplx_mag_f32() - * - arm_max_f32() - * - * Refer - * \link arm_fft_bin_example_f32.c \endlink - * - */ - - -/** \example arm_fft_bin_example_f32.c - */ - - -#include "arm_math.h" -#include "arm_const_structs.h" - -#define TEST_LENGTH_SAMPLES 2048 - -/* ------------------------------------------------------------------- -* External Input and Output buffer Declarations for FFT Bin Example -* ------------------------------------------------------------------- */ -extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; -static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; - -/* ------------------------------------------------------------------ -* Global variables for FFT Bin Example -* ------------------------------------------------------------------- */ -uint32_t fftSize = 1024; -uint32_t ifftFlag = 0; -uint32_t doBitReverse = 1; - -/* Reference index at which max energy of bin ocuurs */ -uint32_t refIndex = 213, testIndex = 0; - -/* ---------------------------------------------------------------------- -* Max magnitude FFT Bin test -* ------------------------------------------------------------------- */ - -int32_t main(void) -{ - - arm_status status; - float32_t maxValue; - - status = ARM_MATH_SUCCESS; - - /* Process the data through the CFFT/CIFFT module */ - arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse); - - /* Process the data through the Complex Magnitude Module for - calculating the magnitude at each bin */ - arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize); - - /* Calculates maxValue and returns corresponding BIN value */ - arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); - - if(testIndex != refIndex) - { - status = ARM_MATH_TEST_FAILURE; - } - - /* ---------------------------------------------------------------------- - ** Loop here if the signals fail the PASS check. - ** This denotes a test failure - ** ------------------------------------------------------------------- */ - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt deleted file mode 100644 index 068128a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_fir_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c deleted file mode 100644 index 283a25e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_data.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_fir_data.c -* -* Description: Data file used for example code -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -** Test input signal contains 1000Hz + 15000 Hz -** ------------------------------------------------------------------- */ - -float32_t testInput_f32_1kHz_15kHz[320] = -{ -+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, --0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, -+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, -+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, -+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, -+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, --0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, --0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, -+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, -+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, --0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, -+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, --0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f, --0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f, --0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f, -+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f, -+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f, -+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f, -}; - -float32_t refOutput[320] = -{ -+0.0000000000f, -0.0010797829f, -0.0007681386f, -0.0001982932f, +0.0000644313f, +0.0020854271f, +0.0036891871f, +0.0015855941f, --0.0026280805f, -0.0075907658f, -0.0119390538f, -0.0086665968f, +0.0088981202f, +0.0430539279f, +0.0974468742f, +0.1740405600f, -+0.2681416601f, +0.3747720089f, +0.4893362230f, +0.6024154672f, +0.7058740791f, +0.7968348987f, +0.8715901940f, +0.9277881093f, -+0.9682182661f, +0.9934674267f, +1.0012052245f, +0.9925859371f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, -0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, -0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f, -+0.7085021596f, +0.6100062330f, +0.5012752767f, +0.3834386057f, +0.2592435399f, +0.1309866321f, +0.0000000000f, -0.1309866321f, --0.2592435399f, -0.3834386057f, -0.5012752767f, -0.6100062330f, -0.7085021596f, -0.7952493046f, -0.8679010068f, -0.9257026822f, --0.9681538347f, -0.9936657199f, -1.0019733630f, -0.9936657199f, -0.9681538347f, -0.9257026822f, -0.8679010068f, -0.7952493046f, --0.7085021596f, -0.6100062330f, -0.5012752767f, -0.3834386057f, -0.2592435399f, -0.1309866321f, +0.0000000000f, +0.1309866321f, -+0.2592435399f, +0.3834386057f, +0.5012752767f, +0.6100062330f, +0.7085021596f, +0.7952493046f, +0.8679010068f, +0.9257026822f, -+0.9681538347f, +0.9936657199f, +1.0019733630f, +0.9936657199f, +0.9681538347f, +0.9257026822f, +0.8679010068f, +0.7952493046f -}; - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c deleted file mode 100644 index 5279e4a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/arm_fir_example_f32.c +++ /dev/null @@ -1,233 +0,0 @@ -/* ---------------------------------------------------------------------- - * Copyright (C) 2010-2012 ARM Limited. All rights reserved. - * -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library - * Title: arm_fir_example_f32.c - * - * Description: Example code demonstrating how an FIR filter can be used - * as a low pass filter. - * - * Target Processor: Cortex-M4/Cortex-M3 - * -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup FIRLPF FIR Lowpass Filter Example - * - * \par Description: - * \par - * Removes high frequency signal components from the input using an FIR lowpass filter. - * The example demonstrates how to configure an FIR filter and then pass data through - * it in a block-by-block fashion. - * \image html FIRLPF_signalflow.gif - * - * \par Algorithm: - * \par - * The input signal is a sum of two sine waves: 1 kHz and 15 kHz. - * This is processed by an FIR lowpass filter with cutoff frequency 6 kHz. - * The lowpass filter eliminates the 15 kHz signal leaving only the 1 kHz sine wave at the output. - * \par - * The lowpass filter was designed using MATLAB with a sample rate of 48 kHz and - * a length of 29 points. - * The MATLAB code to generate the filter coefficients is shown below: - *
- *     h = fir1(28, 6/24);
- * 
- * The first argument is the "order" of the filter and is always one less than the desired length. - * The second argument is the normalized cutoff frequency. This is in the range 0 (DC) to 1.0 (Nyquist). - * A 6 kHz cutoff with a Nyquist frequency of 24 kHz lies at a normalized frequency of 6/24 = 0.25. - * The CMSIS FIR filter function requires the coefficients to be in time reversed order. - *
- *     fliplr(h)
- * 
- * The resulting filter coefficients and are shown below. - * Note that the filter is symmetric (a property of linear phase FIR filters) - * and the point of symmetry is sample 14. Thus the filter will have a delay of - * 14 samples for all frequencies. - * \par - * \image html FIRLPF_coeffs.gif - * \par - * The frequency response of the filter is shown next. - * The passband gain of the filter is 1.0 and it reaches 0.5 at the cutoff frequency 6 kHz. - * \par - * \image html FIRLPF_response.gif - * \par - * The input signal is shown below. - * The left hand side shows the signal in the time domain while the right hand side is a frequency domain representation. - * The two sine wave components can be clearly seen. - * \par - * \image html FIRLPF_input.gif - * \par - * The output of the filter is shown below. The 15 kHz component has been eliminated. - * \par - * \image html FIRLPF_output.gif - * - * \par Variables Description: - * \par - * \li \c testInput_f32_1kHz_15kHz points to the input data - * \li \c refOutput points to the reference output data - * \li \c testOutput points to the test output data - * \li \c firStateF32 points to state buffer - * \li \c firCoeffs32 points to coefficient buffer - * \li \c blockSize number of samples processed at a time - * \li \c numBlocks number of frames - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_fir_init_f32() - * - arm_fir_f32() - * - * Refer - * \link arm_fir_example_f32.c \endlink - * - */ - - -/** \example arm_fir_example_f32.c - */ - -/* ---------------------------------------------------------------------- -** Include Files -** ------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "math_helper.h" - -/* ---------------------------------------------------------------------- -** Macro Defines -** ------------------------------------------------------------------- */ - -#define TEST_LENGTH_SAMPLES 320 -#define SNR_THRESHOLD_F32 140.0f -#define BLOCK_SIZE 32 -#define NUM_TAPS 29 - -/* ------------------------------------------------------------------- - * The input signal and reference output (computed with MATLAB) - * are defined externally in arm_fir_lpf_data.c. - * ------------------------------------------------------------------- */ - -extern float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES]; -extern float32_t refOutput[TEST_LENGTH_SAMPLES]; - -/* ------------------------------------------------------------------- - * Declare Test output buffer - * ------------------------------------------------------------------- */ - -static float32_t testOutput[TEST_LENGTH_SAMPLES]; - -/* ------------------------------------------------------------------- - * Declare State buffer of size (numTaps + blockSize - 1) - * ------------------------------------------------------------------- */ - -static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; - -/* ---------------------------------------------------------------------- -** FIR Coefficients buffer generated using fir1() MATLAB function. -** fir1(28, 6/24) -** ------------------------------------------------------------------- */ - -const float32_t firCoeffs32[NUM_TAPS] = { - -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f, - -0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f, - +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f, - +0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f -}; - -/* ------------------------------------------------------------------ - * Global variables for FIR LPF Example - * ------------------------------------------------------------------- */ - -uint32_t blockSize = BLOCK_SIZE; -uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; - -float32_t snr; - -/* ---------------------------------------------------------------------- - * FIR LPF Example - * ------------------------------------------------------------------- */ - -int32_t main(void) -{ - uint32_t i; - arm_fir_instance_f32 S; - arm_status status; - float32_t *inputF32, *outputF32; - - /* Initialize input and output buffer pointers */ - inputF32 = &testInput_f32_1kHz_15kHz[0]; - outputF32 = &testOutput[0]; - - /* Call FIR init function to initialize the instance structure. */ - arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize); - - /* ---------------------------------------------------------------------- - ** Call the FIR process function for every blockSize samples - ** ------------------------------------------------------------------- */ - - for(i=0; i < numBlocks; i++) - { - arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize); - } - - /* ---------------------------------------------------------------------- - ** Compare the generated output against the reference output computed - ** in MATLAB. - ** ------------------------------------------------------------------- */ - - snr = arm_snr_f32(&refOutput[0], &testOutput[0], TEST_LENGTH_SAMPLES); - - if (snr < SNR_THRESHOLD_F32) - { - status = ARM_MATH_TEST_FAILURE; - } - else - { - status = ARM_MATH_SUCCESS; - } - - /* ---------------------------------------------------------------------- - ** Loop here if the signal does not match the reference output. - ** ------------------------------------------------------------------- */ - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - -/** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_fir_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt deleted file mode 100644 index 78d8899..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_graphic_equalizer_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c deleted file mode 100644 index 99e2da2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_data.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_graphic_equalizer_data.c -* -* Description: Data file used for example code -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -#include "arm_math.h" - -float32_t testRefOutput_f32[320] = { - -0.000000000000000000, 0.001898396760225296, 0.004215449094772339, 0.007432077080011368, 0.010948467999696732, 0.015026375651359558, 0.019191544502973557, 0.023574527353048325, -0.027919445186853409, 0.032277785241603851, 0.036551639437675476, 0.040732793509960175, 0.044799156486988068, 0.048710610717535019, 0.052476800978183746, 0.056059073656797409, -0.059482168406248093, 0.062726479023694992, 0.065821025520563126, 0.068763464689254761, 0.071577839553356171, 0.074270240962505341, 0.076856281608343124, 0.079344697296619415, -0.081745062023401260, 0.084067162126302719, 0.086318407207727432, 0.088509257882833481, 0.090647127479314804, 0.092742368578910828, 0.094802625477313995, 0.096837285906076431, -0.098853722214698792, 0.100859899073839190, 0.102862443774938580, 0.104867763817310330, 0.106881409883499150, 0.108908228576183320, 0.110952425748109820, 0.113017357885837550, -0.115105822682380680, 0.117219865322113040, 0.119361080229282380, 0.121530555188655850, 0.123729091137647630, 0.125957202166318890, 0.128215309232473370, 0.130503740161657330, -0.132822841405868530, 0.135173004120588300, 0.137554679065942760, 0.139968376606702800, 0.142414685338735580, 0.144894234836101530, 0.147407654672861100, 0.149955596774816510, -0.152538605034351350, 0.155157200992107390, 0.157811731100082400, 0.160502441227436070, 0.163229387253522870, 0.165992442518472670, 0.168791320174932480, 0.171625509858131410, -0.174494370818138120, 0.177397061139345170, 0.180332608520984650, 0.183299910277128220, 0.186297744512557980, 0.189324837177991870, 0.192379791289567950, 0.195461250841617580, -0.198567759245634080, 0.201697919517755510, 0.204850304871797560, 0.208023533225059510, 0.211216274648904800, 0.214427210390567780, 0.217655111104249950, 0.220898788422346120, -0.224157124757766720, 0.227429077029228210, 0.230713658034801480, 0.234009962528944020, 0.237317133694887160, 0.240634419023990630, 0.243961080908775330, 0.247296508401632310, -0.250640105456113820, 0.253991369158029560, 0.257349837571382520, 0.260715119540691380, 0.264086868613958360, 0.267464816570281980, 0.270848698914051060, 0.274238351732492450, -0.277633611112833020, 0.281034380197525020, 0.284440591931343080, 0.287852220237255100, 0.291269283741712570, 0.294691801071166990, 0.298119872808456420, 0.301553562283515930, -0.304993014782667160, 0.308438356965780260, 0.311889752745628360, 0.315347377210855480, 0.318811416625976560, 0.322282072156667710, 0.325759567320346830, 0.329244095832109450, -0.332735907286405560, 0.336235217750072480, 0.339742250740528110, 0.343257248401641850, 0.346780419349670410, 0.350311983376741410, 0.353852160274982450, 0.357401121407747270, -0.360959105193614960, 0.364526227116584780, 0.368102725595235820, 0.371688675135374070, 0.375284302979707720, 0.378889638930559160, 0.382504884153604510, 0.386130042374134060, -0.389765247702598570, 0.393410529941320420, 0.397065933793783190, 0.400731507688760760, 0.404407206922769550, 0.408093083649873730, 0.411789052188396450, 0.415495119988918300, -0.419211201369762420, 0.422937240451574330, 0.426673140376806260, 0.430418811738491060, 0.434174135327339170, 0.437938995659351350, 0.441713258624076840, 0.445496778935194020, -0.449289388954639430, 0.453090950846672060, 0.456901267170906070, 0.460720170289278030, 0.464547459036111830, 0.468382950872182850, 0.472226426005363460, 0.476077698171138760, -0.479936532676219940, 0.483802750706672670, 0.487676106393337250, 0.491556398570537570, 0.495443399995565410, 0.499336875975131990, 0.503236617892980580, 0.507142387330532070, -0.511053957045078280, 0.514971107244491580, 0.518893606960773470, 0.522821225225925450, 0.526753749698400500, 0.530690938234329220, 0.534632585942745210, 0.538578454405069350, -0.542528338730335240, 0.546481993049383160, 0.550439231097698210, 0.554399792104959490, 0.558363504707813260, 0.562330115586519240, 0.566299438476562500, 0.570271246135234830, -0.574245333671569820, 0.578221492469310760, 0.582199502736330030, 0.586179181933403020, 0.590160276740789410, 0.594142623245716090, 0.598125983029603960, 0.602110169827938080, -0.606094967573881150, 0.610080175101757050, 0.614065583795309070, 0.618050977587699890, 0.622036151587963100, 0.626020893454551700, 0.630004994571208950, 0.633988231420516970, -0.637970402836799620, 0.641951277852058410, 0.645930647850036620, 0.649908289313316350, 0.653883971273899080, 0.657857488840818410, 0.661828581243753430, 0.665797054767608640, -0.669762641191482540, 0.673725124448537830, 0.677684243768453600, 0.681639779359102250, 0.685591462999582290, 0.689539063721895220, 0.693482317030429840, 0.697420965880155560, -0.701354760676622390, 0.705283410847187040, 0.709206689149141310, 0.713124278932809830, 0.717035952955484390, 0.720941375941038130, 0.724840316921472550, 0.728732451796531680, -0.732617516070604320, 0.736495196819305420, 0.740365199744701390, 0.744227230548858640, 0.748080968856811520, 0.751926124095916750, 0.755762357264757160, 0.759589381515979770, -0.763406842947006230, 0.767214450985193250, 0.771011855453252790, 0.774798732250928880, 0.778574761003255840, 0.782339565455913540, 0.786092851310968400, 0.789834223687648770, -0.793563373386859890, 0.797279909253120420, 0.800983514636754990, 0.804673787206411360, 0.808350402861833570, 0.812012966722249980, 0.815661124885082240, 0.819294504821300510, -0.822912722826004030, 0.826515413820743560, 0.830102190375328060, 0.833672653883695600, 0.837226435542106630, 0.840763118118047710, 0.844282336533069610, 0.847783654928207400, -0.851266715675592420, 0.854731071740388870, 0.858176350593566890, 0.861602116376161580, 0.865007970482110980, 0.868393491953611370, 0.871758259832859040, 0.875101849436759950, -0.878423850983381270, 0.881723806262016300, 0.885001312941312790, 0.888255912810564040, 0.891487173736095430, 0.894694659858942030, 0.897877920418977740, 0.901036512106657030, -0.904169965535402300, 0.907277844846248630, 0.910359673202037810, 0.913415014743804930, 0.916443370282649990, 0.919444311410188670, 0.922417331486940380, 0.925361987203359600, -0.928277771919965740, 0.931164238601922990, 0.934020876884460450, 0.936847217381000520, 0.939642757177352910, 0.942407000809907910, 0.945139460265636440, 0.947839632630348210, -0.950507018715143200, 0.953141096979379650, 0.955741371959447860, 0.958307322114706040, 0.960838429629802700, 0.963334184139966960, 0.965794049203395840, 0.968217510730028150, -0.970604017376899720, 0.972953058779239650, 0.975264083594083790, 0.977536566555500030, 0.979769956320524220, 0.981963708996772770, 0.984117280691862110, 0.986230112612247470, -0.988301653414964680, 0.990331344306468960, 0.992318630218505860, 0.994262944906950000, 0.996163722127676010, 0.998020399361848830, 0.999832402914762500, 1.001599155366420700, -1.003320086747407900, 1.004994612187147100, 1.006622135639190700, 1.008202098309993700, 1.009733878076076500, 1.011216927319765100, 1.012650609016418500, 1.014034371823072400, -1.015367589890956900, 1.016649682074785200, 1.017880033701658200, 1.019058048725128200, 1.020183108747005500, 1.021254621446132700, 1.022271949797868700, 1.023234523832798000, - -}; -/* ---------------------------------------------------------------------- -** Test input - logarithmic chirp signal -** ------------------------------------------------------------------- */ - -float32_t testInput_f32[320] = - { - 0.000000000000000061, 0.002622410992047861, 0.005253663973466970, 0.007893770384930297, 0.010542741395035495, 0.013200587895525877, 0.015867320496454066, 0.018542949521290073, -0.021227485001971542, 0.023920936673895138, 0.026623313970853074, 0.029334626019908643, 0.032054881636210709, 0.034784089317753723, 0.037522257240071598, 0.040269393250875855, -0.043025504864628375, 0.045790599257054837, 0.048564683259595690, 0.051347763353792118, 0.054139845665610427, 0.056940935959702531, 0.059751039633601337, 0.062570161711849828, -0.065398306840066575, 0.068235479278943648, 0.071081682898178900, 0.073936921170339814, 0.076801197164660218, 0.079674513540768196, 0.082556872542344922, 0.085448275990715375, -0.088348725278367082, 0.091258221362398390, 0.094176764757897533, 0.097104355531246703, 0.100040993293358240, 0.102986677192832010, 0.105941405909045980, 0.108905177645166230, -0.111877990121087980, 0.114859840566297130, 0.117850725712659680, 0.120850641787131110, 0.123859584504392860, 0.126877549059407400, 0.129904530119898690, 0.132940521818751430, -0.135985517746334080, 0.139039510942737950, 0.142102493889940090, 0.145174458503884160, 0.148255396126476810, 0.151345297517508140, 0.154444152846483080, 0.157551951684374300, -0.160668682995289720, 0.163794335128054890, 0.166928895807713030, 0.170072352126936720, 0.173224690537355760, 0.176385896840798810, 0.179555956180445340, 0.182734853031894270, -0.185922571194139130, 0.189119093780459800, 0.192324403209221870, 0.195538481194587030, 0.198761308737133020, 0.201992866114384050, 0.205233132871247170, 0.208482087810360570, -0.211739708982344370, 0.215005973675965020, 0.218280858408200220, 0.221564338914212730, 0.224856390137231970, 0.228156986218334190, 0.231466100486134670, 0.234783705446379690, -0.238109772771442410, 0.241444273289723230, 0.244787176974952890, 0.248138452935395580, 0.251498069402956710, 0.254865993722190930, 0.258242192339209860, 0.261626630790492030, -0.265019273691591620, 0.268420084725748410, 0.271829026632395280, 0.275246061195565440, 0.278671149232197430, 0.282104250580339830, 0.285545324087251580, 0.288994327597401960, -0.292451217940364990, 0.295915950918612280, 0.299388481295203350, 0.302868762781368150, 0.306356748023990040, 0.309852388592980640, 0.313355634968552230, 0.316866436528383590, -0.320384741534681720, 0.323910497121136620, 0.327443649279772870, 0.330984142847692230, 0.334531921493712690, 0.338086927704900790, 0.341649102772995210, 0.345218386780727190, -0.348794718588032520, 0.352378035818156910, 0.355968274843654950, 0.359565370772282730, 0.363169257432780890, 0.366779867360555120, 0.370397131783246010, 0.374020980606193880, -0.377651342397795690, 0.381288144374756830, 0.384931312387234990, 0.388580770903877330, 0.392236442996751310, 0.395898250326170650, 0.399566113125414350, 0.403239950185338420, -0.406919678838884410, 0.410605214945482130, 0.414296472875345100, 0.417993365493664670, 0.421695804144698540, 0.425403698635752780, 0.429116957221065130, 0.432835486585582130, -0.436559191828633180, 0.440287976447505720, 0.444021742320914510, 0.447760389692375140, 0.451503817153472210, 0.455251921627031540, 0.459004598350192470, 0.462761740857380200, -0.466523240963184150, 0.470288988745136360, 0.474058872526396560, 0.477832778858340690, 0.481610592503056990, 0.485392196415748600, 0.489177471727042850, 0.492966297725213780, -0.496758551838309250, 0.500554109616195060, 0.504352844712508190, 0.508154628866524960, 0.511959331884944910, 0.515766821623591440, 0.519576963969030530, 0.523389622820107150, -0.527204660069405030, 0.531021935584629400, 0.534841307189911630, 0.538662630647041900, 0.542485759636628150, 0.546310545739186690, 0.550136838416161340, 0.553964484990880020, -0.557793330629441700, 0.561623218321546380, 0.565453988861259300, 0.569285480827721570, 0.573117530565801950, 0.576949972166696630, 0.580782637448476910, 0.584615355936589420, -0.588447954844309340, 0.592280259053150400, 0.596112091093235260, 0.599943271123626440, 0.603773616912622660, 0.607602943818024150, 0.611431064767369080, 0.615257790238142090, -0.619082928237961740, 0.622906284284749700, 0.626727661386881850, 0.630546860023327600, 0.634363678123782030, 0.638177911048790960, 0.641989351569874020, 0.645797789849653410, -0.649603013421986450, 0.653404807172108140, 0.657202953316791350, 0.660997231384523490, 0.664787418195706640, 0.668573287842887610, 0.672354611671016960, 0.676131158257749170, -0.679902693393781730, 0.683668980063242500, 0.687429778424128110, 0.691184845788802130, 0.694933936604551380, 0.698676802434213370, 0.702413191936877570, 0.706142850848662460, -0.709865521963579990, 0.713580945114492330, 0.717288857154159800, 0.720988991936399870, 0.724681080297347790, 0.728364850036839040, 0.732040025899910680, 0.735706329558433620, -0.739363479592880620, 0.743011191474238440, 0.746649177546067850, 0.750277147006723990, 0.753894805891742180, 0.757501857056394940, 0.761098000158428880, 0.764682931640995540, -0.768256344715771980, 0.771817929346292900, 0.775367372231492210, 0.778904356789468790, 0.782428563141483460, 0.785939668096195860, 0.789437345134148760, 0.792921264392515420, -0.796391092650110770, 0.799846493312681210, 0.803287126398485760, 0.806712648524170680, 0.810122712890953390, 0.813516969271127150, 0.816895063994893090, 0.820256639937531280, -0.823601336506926020, 0.826928789631450890, 0.830238631748229430, 0.833530491791779850, 0.836803995183058700, 0.840058763818912760, 0.843294416061954100, 0.846510566730867220, -0.849706827091166740, 0.852882804846411770, 0.856038104129895340, 0.859172325496819990, 0.862285065916973510, 0.865375918767918860, 0.868444473828712590, 0.871490317274166260, -0.874513031669661770, 0.877512195966544280, 0.880487385498096800, 0.883438171976119850, 0.886364123488128100, 0.889264804495180530, 0.892139775830360640, 0.894988594697921020, -0.897810814673113080, 0.900605985702712770, 0.903373654106265470, 0.906113362578062300, 0.908824650189867690, 0.911507052394417540, 0.914160101029702910, 0.916783324324059180, -0.919376246902079860, 0.921938389791372770, 0.924469270430179120, 0.926968402675872660, 0.929435296814361430, 0.931869459570409790, 0.934270394118903560, 0.936637600097074200, -0.938970573617708970, 0.941268807283364040, 0.943531790201601380, 0.945759008001275100, 0.947949942849885320, 0.950104073472023970, 0.952220875168933280, 0.954299819839202090, -0.956340376000621160, 0.958342008813221960, 0.960304180103520260, 0.962226348389994210, 0.964107968909812760, 0.965948493646846980, 0.967747371360983650, 0.969504047618768740, -0.971217964825405680, 0.972888562258134030, 0.974515276101013520, 0.976097539481141750, 0.977634782506330400, 0.979126432304266880, 0.980571913063189360, 0.981970646074102120, -0.983322049774557390, 0.984625539794035220, 0.985880529000944810, 0.987086427551279730, 0.988242642938953360, 0.989348580047844540, 0.990403641205582440, 0.991407226239099710, -0.992358732531984260, 0.993257555083659870, 0.994103086570423680, 0.994894717408374870, 0.995631835818261310, 0.996313827892278070, 0.996940077662846650, 0.997509967173408010, - - }; diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c deleted file mode 100644 index d672f04..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/arm_graphic_equalizer_example_q31.c +++ /dev/null @@ -1,411 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_graphic_equalizer_example_q31.c -* -* Description: Example showing an audio graphic equalizer constructed -* out of Biquad filters. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup GEQ5Band Graphic Audio Equalizer Example - * - * \par Description: - * \par - * This example demonstrates how a 5-band graphic equalizer can be constructed - * using the Biquad cascade functions. - * A graphic equalizer is used in audio applications to vary the tonal quality - * of the audio. - * - * \par Block Diagram: - * \par - * The design is based on a cascade of 5 filter sections. - * \image html GEQ_signalflow.gif - * Each filter section is 4th order and consists of a cascade of two Biquads. - * Each filter has a nominal gain of 0 dB (1.0 in linear units) and - * boosts or cuts signals within a specific frequency range. - * The edge frequencies between the 5 bands are 100, 500, 2000, and 6000 Hz. - * Each band has an adjustable boost or cut in the range of +/- 9 dB. - * For example, the band that extends from 500 to 2000 Hz has the response shown below: - * \par - * \image html GEQ_bandresponse.gif - * \par - * With 1 dB steps, each filter has a total of 19 different settings. - * The filter coefficients for all possible 19 settings were precomputed - * in MATLAB and stored in a table. With 5 different tables, there are - * a total of 5 x 19 = 95 different 4th order filters. - * All 95 responses are shown below: - * \par - * \image html GEQ_allbandresponse.gif - * \par - * Each 4th order filter has 10 coefficents for a grand total of 950 different filter - * coefficients that must be tabulated. The input and output data is in Q31 format. - * For better noise performance, the two low frequency bands are implemented using the high - * precision 32x64-bit Biquad filters. The remaining 3 high frequency bands use standard - * 32x32-bit Biquad filters. The input signal used in the example is a logarithmic chirp. - * \par - * \image html GEQ_inputchirp.gif - * \par - * The array bandGains specifies the gain in dB to apply in each band. - * For example, if bandGains={0, -3, 6, 4, -6}; then the output signal will be: - * \par - * \image html GEQ_outputchirp.gif - * \par - * \note The output chirp signal follows the gain or boost of each band. - * \par - * - * \par Variables Description: - * \par - * \li \c testInput_f32 points to the input data - * \li \c testRefOutput_f32 points to the reference output data - * \li \c testOutput points to the test output data - * \li \c inputQ31 temporary input buffer - * \li \c outputQ31 temporary output buffer - * \li \c biquadStateBand1Q31 points to state buffer for band1 - * \li \c biquadStateBand2Q31 points to state buffer for band2 - * \li \c biquadStateBand3Q31 points to state buffer for band3 - * \li \c biquadStateBand4Q31 points to state buffer for band4 - * \li \c biquadStateBand5Q31 points to state buffer for band5 - * \li \c coeffTable points to coefficient buffer for all bands - * \li \c gainDB gain buffer which has gains applied for all the bands - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_biquad_cas_df1_32x64_init_q31() - * - arm_biquad_cas_df1_32x64_q31() - * - arm_biquad_cascade_df1_init_q31() - * - arm_biquad_cascade_df1_q31() - * - arm_scale_q31() - * - arm_scale_f32() - * - arm_float_to_q31() - * - arm_q31_to_float() - * - * Refer - * \link arm_graphic_equalizer_example_q31.c \endlink - * - */ - - -/** \example arm_graphic_equalizer_example_q31.c - */ - - -#include "arm_math.h" -#include "math_helper.h" - -/* Length of the overall data in the test */ -#define TESTLENGTH 320 - -/* Block size for the underlying processing */ -#define BLOCKSIZE 32 - -/* Total number of blocks to run */ -#define NUMBLOCKS (TESTLENGTH/BLOCKSIZE) - -/* Number of 2nd order Biquad stages per filter */ -#define NUMSTAGES 2 - -#define SNR_THRESHOLD_F32 98 - -/* ------------------------------------------------------------------- - * External Declarations for Input and Output buffers - * ------------------------------------------------------------------- */ - -extern float32_t testInput_f32[TESTLENGTH]; -static float32_t testOutput[TESTLENGTH]; - -extern float32_t testRefOutput_f32[TESTLENGTH]; - -/* ---------------------------------------------------------------------- -** Q31 state buffers for Band1, Band2, Band3, Band4, Band5 -** ------------------------------------------------------------------- */ - -static q63_t biquadStateBand1Q31[4 * 2]; -static q63_t biquadStateBand2Q31[4 * 2]; -static q31_t biquadStateBand3Q31[4 * 2]; -static q31_t biquadStateBand4Q31[4 * 2]; -static q31_t biquadStateBand5Q31[4 * 2]; - -/* ---------------------------------------------------------------------- -** Q31 input and output buffers -** ------------------------------------------------------------------- */ - -q31_t inputQ31[BLOCKSIZE]; -q31_t outputQ31[BLOCKSIZE]; - -/* ---------------------------------------------------------------------- -** Entire coefficient table. There are 10 coefficients per 4th order Biquad -** cascade filter. The first 10 coefficients correspond to the -9 dB gain -** setting of band 1; the next 10 coefficient correspond to the -8 dB gain -** setting of band 1; and so on. There are 10*19=190 coefficients in total -** for band 1 (gains = -9, -8, -7, ..., 9). After this come the 190 coefficients -** for band 2. -** -** The coefficients are in Q29 format and require a postShift of 2. -** ------------------------------------------------------------------- */ - -const q31_t coeffTable[950] = { - - /* Band 1, -9 dB gain */ - 535576962, -1071153923, 535576962, 1073741824, -536870912, 535576962, -1063501998, 527979313, 1060865294, -524146981, - /* Band 1, -8 dB gain */ - 535723226, -1071446451, 535723226, 1073741824, -536870912, 535723226, -1063568947, 527903217, 1061230578, -524503778, - 535868593, -1071737186, 535868593, 1073741824, -536870912, 535868593, -1063627467, 527819780, 1061585502, -524850686, - 536013181, -1072026363, 536013181, 1073741824, -536870912, 536013181, -1063677598, 527728935, 1061930361, -525187972, - 536157109, -1072314217, 536157109, 1073741824, -536870912, 536157109, -1063719372, 527630607, 1062265438, -525515897, - 536300492, -1072600983, 536300492, 1073741824, -536870912, 536300492, -1063752815, 527524720, 1062591011, -525834716, - 536443447, -1072886894, 536443447, 1073741824, -536870912, 536443447, -1063777945, 527411186, 1062907350, -526144676, - 536586091, -1073172183, 536586091, 1073741824, -536870912, 536586091, -1063794775, 527289917, 1063214717, -526446017, - 536728541, -1073457082, 536728541, 1073741824, -536870912, 536728541, -1063803308, 527160815, 1063513366, -526738975, - 536870912, -1073741824, 536870912, 1073741824, -536870912, 536870912, -1063803543, 527023777, 1063803543, -527023777, - 537013321, -1074026642, 537013321, 1073741824, -536870912, 537013321, -1063795470, 526878696, 1064085490, -527300648, - 537155884, -1074311768, 537155884, 1073741824, -536870912, 537155884, -1063779073, 526725455, 1064359439, -527569803, - 537298718, -1074597435, 537298718, 1073741824, -536870912, 537298718, -1063754328, 526563934, 1064625617, -527831454, - 537441939, -1074883878, 537441939, 1073741824, -536870912, 537441939, -1063721205, 526394005, 1064884245, -528085806, - 537585666, -1075171331, 537585666, 1073741824, -536870912, 537585666, -1063679666, 526215534, 1065135536, -528333059, - 537730015, -1075460030, 537730015, 1073741824, -536870912, 537730015, -1063629666, 526028380, 1065379699, -528573409, - 537875106, -1075750212, 537875106, 1073741824, -536870912, 537875106, -1063571152, 525832396, 1065616936, -528807045, - 538021057, -1076042114, 538021057, 1073741824, -536870912, 538021057, -1063504065, 525627429, 1065847444, -529034151, - 538167989, -1076335977, 538167989, 1073741824, -536870912, 538167989, -1063428338, 525413317, 1066071412, -529254907, - - /* Band 2, -9 dB gain */ - 531784976, -1055497692, 523873415, 1066213307, -529420241, 531784976, -1040357886, 509828014, 1028908252, -494627367, - /* Band 2, -8 dB gain */ - 532357636, -1056601982, 524400080, 1066115844, -529326645, 532357636, -1040623406, 509562600, 1030462237, -496062122, - 532927392, -1057707729, 524931110, 1066024274, -529239070, 532927392, -1040848253, 509262081, 1031969246, -497457090, - 533494678, -1058816094, 525467240, 1065939047, -529157961, 533494678, -1041032161, 508925950, 1033429976, -498812573, - 534059929, -1059928204, 526009170, 1065860582, -529083734, 534059929, -1041174868, 508553717, 1034845124, -500128887, - 534623580, -1061045148, 526557561, 1065789260, -529016764, 534623580, -1041276126, 508144920, 1036215393, -501406373, - 535186068, -1062167969, 527113032, 1065725420, -528957385, 535186068, -1041335703, 507699125, 1037541500, -502645399, - 535747827, -1063297666, 527676151, 1065669351, -528905879, 535747827, -1041353386, 507215934, 1038824183, -503846368, - 536309295, -1064435183, 528247436, 1065621289, -528862476, 536309295, -1041328990, 506694984, 1040064203, -505009724, - 536870912, -1065581413, 528827349, 1065581413, -528827349, 536870912, -1041262354, 506135953, 1041262354, -506135953, - 537433117, -1066737194, 529416295, 1065549847, -528800610, 537433117, -1041153346, 505538564, 1042419457, -507225588, - 537996352, -1067903307, 530014622, 1065526651, -528782316, 537996352, -1041001864, 504902578, 1043536370, -508279208, - 538561061, -1069080480, 530622620, 1065511830, -528772462, 538561061, -1040807833, 504227800, 1044613981, -509297437, - 539127690, -1070269387, 531240527, 1065505333, -528770987, 539127690, -1040571205, 503514074, 1045653211, -510280946, - 539696690, -1071470656, 531868525, 1065507054, -528777778, 539696690, -1040291951, 502761277, 1046655011, -511230450, - 540268512, -1072684867, 532506750, 1065516837, -528792672, 540268512, -1039970063, 501969320, 1047620358, -512146700, - 540843613, -1073912567, 533155297, 1065534483, -528815459, 540843613, -1039605542, 501138139, 1048550251, -513030484, - 541422451, -1075154268, 533814224, 1065559750, -528845892, 541422451, -1039198394, 500267687, 1049445708, -513882621, - 542005489, -1076410460, 534483561, 1065592362, -528883686, 542005489, -1038748624, 499357932, 1050307760, -514703956, - 518903861, -1001986830, 486725277, 1037235801, -502367695, 518903861, -945834422, 446371043, 902366163, -400700571, - 520899989, -1005630916, 488289126, 1036926846, -502147311, 520899989, -946490935, 445581846, 907921945, -404936158, - 522893209, -1009290002, 489869792, 1036650484, -501961419, 522893209, -947006359, 444685310, 913306106, -409075225, - 524884763, -1012968199, 491470256, 1036407567, -501810737, 524884763, -947377809, 443679533, 918521018, -413116221, - 526875910, -1016669649, 493093518, 1036198712, -501695739, 526875910, -947602324, 442562672, 923569247, -417057897, - 528867927, -1020398503, 494742575, 1036024293, -501616651, 528867927, -947676875, 441332970, 928453558, -420899319, - 530862111, -1024158905, 496420407, 1035884447, -501573457, 530862111, -947598385, 439988777, 933176909, -424639872, - 532859778, -1027954970, 498129955, 1035779077, -501565907, 532859778, -947363742, 438528571, 937742446, -428279254, - 534862260, -1031790763, 499874098, 1035707863, -501593525, 534862260, -946969823, 436950987, 942153486, -431817474, - 536870912, -1035670279, 501655630, 1035670279, -501655630, 536870912, -946413508, 435254839, 946413508, -435254839, - 538887107, -1039597419, 503477238, 1035665609, -501751354, 538887107, -945691703, 433439146, 950526127, -438591937, - 540912240, -1043575967, 505341475, 1035692963, -501879659, 540912240, -944801359, 431503152, 954495080, -441829621, - 542947726, -1047609569, 507250741, 1035751307, -502039364, 542947726, -943739490, 429446349, 958324201, -444968987, - 544995000, -1051701717, 509207261, 1035839473, -502229165, 544995000, -942503190, 427268492, 962017400, -448011351, - 547055523, -1055855728, 511213065, 1035956193, -502447657, 547055523, -941089647, 424969617, 965578640, -450958226, - 549130774, -1060074734, 513269973, 1036100110, -502693359, 549130774, -939496155, 422550049, 969011913, -453811298, - 551222259, -1064361672, 515379585, 1036269804, -502964731, 551222259, -937720119, 420010407, 972321228, -456572401, - 553331507, -1068719280, 517543273, 1036463810, -503260192, 553331507, -935759057, 417351601, 975510582, -459243495, - 555460072, -1073150100, 519762181, 1036680633, -503578144, 555460072, -933610600, 414574832, 978583948, -461826644, - 494084017, -851422604, 404056273, 930151631, -423619864, 494084017, -673714108, 339502486, 561843007, -265801750, - 498713542, -859177141, 406587077, 929211656, -423786402, 498713542, -673274906, 338185129, 573719128, -272222942, - 503369016, -867012190, 409148384, 928362985, -424054784, 503369016, -672533059, 336693984, 585290277, -278599028, - 508052536, -874935599, 411746438, 927604291, -424422151, 508052536, -671478538, 335026905, 596558312, -284920289, - 512766286, -882955583, 414387826, 926933782, -424885216, 512766286, -670100998, 333182045, 607525792, -291177811, - 517512534, -891080712, 417079474, 926349262, -425440318, 517512534, -668389789, 331157902, 618195914, -297363485, - 522293635, -899319903, 419828635, 925848177, -426083491, 522293635, -666333963, 328953368, 628572440, -303470012, - 527112032, -907682405, 422642886, 925427679, -426810526, 527112032, -663922286, 326567785, 638659631, -309490882, - 531970251, -916177781, 425530105, 925084675, -427617023, 531970251, -661143261, 324000998, 648462180, -315420352, - 536870912, -924815881, 428498454, 924815881, -428498454, 536870912, -657985147, 321253420, 657985147, -321253420, - 541816719, -933606817, 431556352, 924617870, -429450209, 541816719, -654435997, 318326093, 667233900, -326985786, - 546810467, -942560921, 434712438, 924487114, -430467639, 546810467, -650483688, 315220754, 676214053, -332613816, - 551855042, -951688708, 437975532, 924420027, -431546101, 551855042, -646115970, 311939896, 684931422, -338134495, - 556953421, -961000826, 441354588, 924413001, -432680993, 556953421, -641320513, 308486839, 693391970, -343545389, - 562108672, -970508005, 444858642, 924462435, -433867780, 562108672, -636084967, 304865786, 701601770, -348844597, - 567323959, -980220994, 448496743, 924564764, -435102022, 567323959, -630397020, 301081886, 709566963, -354030710, - 572602539, -990150500, 452277894, 924716482, -436379394, 572602539, -624244471, 297141281, 717293726, -359102767, - 577947763, -1000307125, 456210977, 924914158, -437695705, 577947763, -617615296, 293051155, 724788245, -364060214, - 583363084, -1010701292, 460304674, 925154455, -439046908, 583363084, -610497723, 288819761, 732056685, -368902865, - 387379495, -506912469, 196933274, 840112184, -347208270, 387379495, 506912469, 196933274, -840112184, -347208270, - 401658082, -532275898, 207149427, 833765363, -343175316, 401658082, 532275898, 207149427, -833765363, -343175316, - 416472483, -558722695, 217902617, 827270154, -339107319, 416472483, 558722695, 217902617, -827270154, -339107319, - 431841949, -586290861, 229212798, 820624988, -335007540, 431841949, 586290861, 229212798, -820624988, -335007540, - 447786335, -615019650, 241100489, 813828443, -330879528, 447786335, 615019650, 241100489, -813828443, -330879528, - 464326111, -644949597, 253586805, 806879270, -326727141, 464326111, 644949597, 253586805, -806879270, -326727141, - 481482377, -676122557, 266693475, 799776409, -322554559, 481482377, 676122557, 266693475, -799776409, -322554559, - 499276882, -708581728, 280442865, 792519013, -318366296, 499276882, 708581728, 280442865, -792519013, -318366296, - 517732032, -742371685, 294857996, 785106465, -314167221, 517732032, 742371685, 294857996, -785106465, -314167221, - 536870912, -777538408, 309962566, 777538408, -309962566, 536870912, 777538408, 309962566, -777538408, -309962566, - 556717294, -814129313, 325780968, 769814766, -305757943, 556717294, 814129313, 325780968, -769814766, -305757943, - 577295658, -852193284, 342338310, 761935777, -301559360, 577295658, 852193284, 342338310, -761935777, -301559360, - 598631206, -891780698, 359660433, 753902014, -297373230, 598631206, 891780698, 359660433, -753902014, -297373230, - 620749877, -932943463, 377773927, 745714425, -293206383, 620749877, 932943463, 377773927, -745714425, -293206383, - 643678365, -975735041, 396706151, 737374355, -289066077, 643678365, 975735041, 396706151, -737374355, -289066077, - 667444134, -1020210487, 416485252, 728883588, -284960004, 667444134, 1020210487, 416485252, -728883588, -284960004, - 692075438, -1066426476, 437140179, 720244375, -280896294, 692075438, 1066426476, 437140179, -720244375, -280896294, - 717601336, -1114441339, 458700704, 711459472, -276883515, 717601336, 1114441339, 458700704, -711459472, -276883515, - 744051710, -1164315096, 481197437, 702532174, -272930673, 744051710, 1164315096, 481197437, -702532174, -272930673 - -}; - -/* ---------------------------------------------------------------------- -** Desired gains, in dB, per band -** ------------------------------------------------------------------- */ - -int gainDB[5] = {0, -3, 6, 4, -6}; - -float32_t snr; - - -/* ---------------------------------------------------------------------- - * Graphic equalizer Example - * ------------------------------------------------------------------- */ - -int32_t main(void) -{ - float32_t *inputF32, *outputF32; - arm_biquad_cas_df1_32x64_ins_q31 S1; - arm_biquad_cas_df1_32x64_ins_q31 S2; - arm_biquad_casd_df1_inst_q31 S3; - arm_biquad_casd_df1_inst_q31 S4; - arm_biquad_casd_df1_inst_q31 S5; - int i; - int32_t status; - - inputF32 = &testInput_f32[0]; - outputF32 = &testOutput[0]; - - /* Initialize the state and coefficient buffers for all Biquad sections */ - - arm_biquad_cas_df1_32x64_init_q31(&S1, NUMSTAGES, - (q31_t *) &coeffTable[190*0 + 10*(gainDB[0] + 9)], - &biquadStateBand1Q31[0], 2); - - arm_biquad_cas_df1_32x64_init_q31(&S2, NUMSTAGES, - (q31_t *) &coeffTable[190*1 + 10*(gainDB[1] + 9)], - &biquadStateBand2Q31[0], 2); - - arm_biquad_cascade_df1_init_q31(&S3, NUMSTAGES, - (q31_t *) &coeffTable[190*2 + 10*(gainDB[2] + 9)], - &biquadStateBand3Q31[0], 2); - - arm_biquad_cascade_df1_init_q31(&S4, NUMSTAGES, - (q31_t *) &coeffTable[190*3 + 10*(gainDB[3] + 9)], - &biquadStateBand4Q31[0], 2); - - arm_biquad_cascade_df1_init_q31(&S5, NUMSTAGES, - (q31_t *) &coeffTable[190*4 + 10*(gainDB[4] + 9)], - &biquadStateBand5Q31[0], 2); - - - /* Call the process functions and needs to change filter coefficients - for varying the gain of each band */ - - for(i=0; i < NUMBLOCKS; i++) - { - - /* ---------------------------------------------------------------------- - ** Convert block of input data from float to Q31 - ** ------------------------------------------------------------------- */ - - arm_float_to_q31(inputF32 + (i*BLOCKSIZE), inputQ31, BLOCKSIZE); - - /* ---------------------------------------------------------------------- - ** Scale down by 1/8. This provides additional headroom so that the - ** graphic EQ can apply gain. - ** ------------------------------------------------------------------- */ - - arm_scale_q31(inputQ31, 0x7FFFFFFF, -3, inputQ31, BLOCKSIZE); - - /* ---------------------------------------------------------------------- - ** Call the Q31 Biquad Cascade DF1 32x64 process function for band1, band2 - ** ------------------------------------------------------------------- */ - - arm_biquad_cas_df1_32x64_q31(&S1, inputQ31, outputQ31, BLOCKSIZE); - arm_biquad_cas_df1_32x64_q31(&S2, outputQ31, outputQ31, BLOCKSIZE); - - /* ---------------------------------------------------------------------- - ** Call the Q31 Biquad Cascade DF1 process function for band3, band4, band5 - ** ------------------------------------------------------------------- */ - - arm_biquad_cascade_df1_q31(&S3, outputQ31, outputQ31, BLOCKSIZE); - arm_biquad_cascade_df1_q31(&S4, outputQ31, outputQ31, BLOCKSIZE); - arm_biquad_cascade_df1_q31(&S5, outputQ31, outputQ31, BLOCKSIZE); - - /* ---------------------------------------------------------------------- - ** Convert Q31 result back to float - ** ------------------------------------------------------------------- */ - - arm_q31_to_float(outputQ31, outputF32 + (i * BLOCKSIZE), BLOCKSIZE); - - /* ---------------------------------------------------------------------- - ** Scale back up - ** ------------------------------------------------------------------- */ - - arm_scale_f32(outputF32 + (i * BLOCKSIZE), 8.0f, outputF32 + (i * BLOCKSIZE), BLOCKSIZE); - }; - - snr = arm_snr_f32(testRefOutput_f32, testOutput, TESTLENGTH); - - if (snr < SNR_THRESHOLD_F32) - { - status = ARM_MATH_TEST_FAILURE; - } - else - { - status = ARM_MATH_SUCCESS; - } - - /* ---------------------------------------------------------------------- - ** Loop here if the signal does not match the reference output. - ** ------------------------------------------------------------------- */ - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - -/** \endlink */ - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_graphic_equalizer_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt deleted file mode 100644 index e83700c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_linear_interp_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c deleted file mode 100644 index 21c23ef..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_data.c +++ /dev/null @@ -1,23616 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_linear_interp_data.c -* -* Description: Data file used for example. Generation method described -* below -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Table generated from following MATLAB Command -* x = -pi: 0.00005 : (2*pi - 0.00005); -* y = sin(x); -* where pi value is 3.141592653589793 -* --------------------------------------------------------------------*/ - -float arm_linear_interep_table[188495] = { - - --0.000000000000000122, -0.000049999999979173, -0.000099999999833667, -0.000149999999437717, -0.000199999998666767, -0.000249999997395817, -0.000299999995500311, -0.000349999992854362, --0.000399999989333412, -0.000449999984812462, -0.000499999979166956, -0.000549999972271007, -0.000599999964000057, -0.000649999954229107, -0.000699999942833602, -0.000749999929687653, --0.000799999914666704, -0.000849999897645755, -0.000899999878500250, -0.000949999857104302, -0.000999999833333354, -0.001049999807062851, -0.001099999778166904, -0.001149999746520957, --0.001199999712000011, -0.001249999674479510, -0.001299999633833566, -0.001349999589937622, -0.001399999542666680, -0.001449999491896183, -0.001499999437500243, -0.001549999379354304, --0.001599999317333367, -0.001649999251312876, -0.001699999181166942, -0.001749999106771011, -0.001799999028000082, -0.001849998944729599, -0.001899998856833675, -0.001949998764187754, --0.001999998666666836, -0.002049998564146365, -0.002099998456500453, -0.002149998343604546, -0.002199998225334087, -0.002249998101563188, -0.002299997972167294, -0.002349997837021405, --0.002399997696000966, -0.002449997548980088, -0.002499997395834216, -0.002549997236438351, -0.002599997070667937, -0.002649996898397086, -0.002699996719501243, -0.002749996533855408, --0.002799996341335026, -0.002849996141814208, -0.002899995935168401, -0.002949995721272604, -0.002999995500002261, -0.003049995271231486, -0.003099995034835722, -0.003149994790690415, --0.003199994538669677, -0.003249994278648952, -0.003299994010503243, -0.003349993734107991, -0.003399993449337312, -0.003449993156066649, -0.003499992854171003, -0.003549992543525819, --0.003599992224005209, -0.003649991895484619, -0.003699991557839049, -0.003749991210943944, -0.003799990854673418, -0.003849990488902914, -0.003899990113507434, -0.003949989728362423, --0.003999989333341993, -0.004049988928321590, -0.004099988513176658, -0.004149988087781312, -0.004199987652010995, -0.004249987205740709, -0.004299986748845899, -0.004349986281200678, --0.004399985802680492, -0.004449985313160341, -0.004499984812515671, -0.004549984300620594, -0.004599983777350557, -0.004649983242580561, -0.004699982696186050, -0.004749982138041138, --0.004799981568021272, -0.004849980986001451, -0.004899980391857122, -0.004949979785462398, -0.004999979166692725, -0.005049978535423547, -0.005099977891528979, -0.005149977234884466, --0.005199976565365011, -0.005249975882846058, -0.005299975187201721, -0.005349974478307446, -0.005399973756038235, -0.005449973020269535, -0.005499972270875456, -0.005549971507731448, --0.005599970730712511, -0.005649969939694091, -0.005699969134550302, -0.005749968315156590, -0.005799967481387958, -0.005849966633119851, -0.005899965770226383, -0.005949964892583000, --0.005999964000064706, -0.006049963092546945, -0.006099962169903833, -0.006149961232010816, -0.006199960278743339, -0.006249959309975518, -0.006299958325582797, -0.006349957325440182, --0.006399956309423117, -0.006449955277405718, -0.006499954229263430, -0.006549953164871257, -0.006599952084104644, -0.006649950986837708, -0.006699949872945895, -0.006749948742304206, --0.006799947594788089, -0.006849946430271660, -0.006899945248630365, -0.006949944049739206, -0.006999942833473632, -0.007049941599707755, -0.007099940348317025, -0.007149939079176889, --0.007199937792161461, -0.007249936487146187, -0.007299935164006074, -0.007349933822616566, -0.007399932462851779, -0.007449931084587162, -0.007499929687697716, -0.007549928272058891, --0.007599926837544801, -0.007649925384030893, -0.007699923911392173, -0.007749922419504085, -0.007799920908240749, -0.007849919377477610, -0.007899917827089672, -0.007949916256952384, --0.007999914666939863, -0.008049913056927554, -0.008099911426790906, -0.008149909776404035, -0.008199908105642390, -0.008249906414380975, -0.008299904702495238, -0.008349902969859295, --0.008399901216348595, -0.008449899441838141, -0.008499897646203384, -0.008549895829318437, -0.008599893991058752, -0.008649892131299332, -0.008699890249915625, -0.008749888346781748, --0.008799886421773151, -0.008849884474764837, -0.008899882505632256, -0.008949880514249525, -0.008999878500492093, -0.009049876464234965, -0.009099874405353590, -0.009149872323722084, --0.009199870219215898, -0.009249868091710479, -0.009299865941079948, -0.009349863767199750, -0.009399861569944894, -0.009449859349190827, -0.009499857104811669, -0.009549854836682867, --0.009599852544679429, -0.009649850228676803, -0.009699847888549109, -0.009749845524171793, -0.009799843135419864, -0.009849840722168771, -0.009899838284292632, -0.009949835821666898, --0.009999833334166574, -0.010049830821667110, -0.010099828284042626, -0.010149825721168572, -0.010199823132920397, -0.010249820519172219, -0.010299817879799491, -0.010349815214677217, --0.010399812523680850, -0.010449809806684508, -0.010499807063563642, -0.010549804294193258, -0.010599801498448806, -0.010649798676204407, -0.010699795827335511, -0.010749792951717126, --0.010799790049224703, -0.010849787119732359, -0.010899784163115548, -0.010949781179249277, -0.010999778168008997, -0.011049775129268828, -0.011099772062904221, -0.011149768968790628, --0.011199765846802169, -0.011249762696814294, -0.011299759518702013, -0.011349756312340777, -0.011399753077604706, -0.011449749814369253, -0.011499746522509425, -0.011549743201900674, --0.011599739852417123, -0.011649736473934221, -0.011699733066326979, -0.011749729629470847, -0.011799726163239948, -0.011849722667509732, -0.011899719142155211, -0.011949715587051834, --0.011999712002073726, -0.012049708387096337, -0.012099704741995123, -0.012149701066644201, -0.012199697360919026, -0.012249693624694609, -0.012299689857846402, -0.012349686060248525, --0.012399682231776434, -0.012449678372305137, -0.012499674481710089, -0.012549670559865410, -0.012599666606646555, -0.012649662621928532, -0.012699658605586799, -0.012749654557495473, --0.012799650477530011, -0.012849646365565424, -0.012899642221477166, -0.012949638045139357, -0.012999633836427452, -0.013049629595216463, -0.013099625321381845, -0.013149621014797719, --0.013199616675339540, -0.013249612302882765, -0.013299607897301514, -0.013349603458471243, -0.013399598986266964, -0.013449594480564131, -0.013499589941236869, -0.013549585368160630, --0.013599580761210430, -0.013649576120261721, -0.013699571445188626, -0.013749566735866605, -0.013799561992170667, -0.013849557213976266, -0.013899552401157530, -0.013949547553589911, --0.013999542671148425, -0.014049537753708525, -0.014099532801144338, -0.014149527813331319, -0.014199522790144923, -0.014249517731459277, -0.014299512637149837, -0.014349507507091614, --0.014399502341160067, -0.014449497139229321, -0.014499491901174831, -0.014549486626871612, -0.014599481316195120, -0.014649475969019481, -0.014699470585220153, -0.014749465164672147, --0.014799459707250922, -0.014849454212830605, -0.014899448681286651, -0.014949443112494076, -0.014999437506328338, -0.015049431862663561, -0.015099426181375206, -0.015149420462338728, --0.015199414705428255, -0.015249408910519246, -0.015299403077486715, -0.015349397206206119, -0.015399391296551587, -0.015449385348398575, -0.015499379361622101, -0.015549373336097624, --0.015599367271699268, -0.015649361168302494, -0.015699355025782315, -0.015749348844014195, -0.015799342622872262, -0.015849336362231969, -0.015899330061968333, -0.015949323721956819, --0.015999317342071551, -0.016049310922187990, -0.016099304462181149, -0.016149297961926493, -0.016199291421298147, -0.016249284840171574, -0.016299278218422232, -0.016349271555924253, --0.016399264852553091, -0.016449258108183769, -0.016499251322691748, -0.016549244495951149, -0.016599237627837445, -0.016649230718225643, -0.016699223766991209, -0.016749216774008271, --0.016799209739152290, -0.016849202662298290, -0.016899195543321723, -0.016949188382096723, -0.016999181178498753, -0.017049173932402829, -0.017099166643684417, -0.017149159312217641, --0.017199151937877969, -0.017249144520540861, -0.017299137060080447, -0.017349129556372193, -0.017399122009291113, -0.017449114418712670, -0.017499106784510998, -0.017549099106561560, --0.017599091384739373, -0.017649083618919904, -0.017699075808977279, -0.017749067954786969, -0.017799060056223986, -0.017849052113163795, -0.017899044125480532, -0.017949036093049660, --0.017999028015746196, -0.018049019893445605, -0.018099011726022022, -0.018149003513350907, -0.018198995255307732, -0.018248986951766622, -0.018298978602603044, -0.018348970207692019, --0.018398961766909014, -0.018448953280128161, -0.018498944747224924, -0.018548936168074327, -0.018598927542551831, -0.018648918870531574, -0.018698910151889018, -0.018748901386499189, --0.018798892574237547, -0.018848883714978233, -0.018898874808596710, -0.018948865854967998, -0.018998856853967565, -0.019048847805469546, -0.019098838709349409, -0.019148829565482174, --0.019198820373743309, -0.019248811134006949, -0.019298801846148562, -0.019348792510043615, -0.019398783125566241, -0.019448773692591910, -0.019498764210995646, -0.019548754680652914, --0.019598745101437852, -0.019648735473225928, -0.019698725795892161, -0.019748716069312028, -0.019798706293359659, -0.019848696467910525, -0.019898686592839651, -0.019948676668022504, --0.019998666693333219, -0.020048656668647271, -0.020098646593839677, -0.020148636468785914, -0.020198626293360115, -0.020248616067437750, -0.020298605790894288, -0.020348595463603868, --0.020398585085441959, -0.020448574656283587, -0.020498564176004225, -0.020548553644478006, -0.020598543061580404, -0.020648532427186443, -0.020698521741171597, -0.020748511003410002, --0.020798500213777129, -0.020848489372148005, -0.020898478478398104, -0.020948467532401559, -0.020998456534033847, -0.021048445483169996, -0.021098434379685473, -0.021148423223454418, --0.021198412014352307, -0.021248400752254610, -0.021298389437035468, -0.021348378068570352, -0.021398366646734290, -0.021448355171402755, -0.021498343642449892, -0.021548332059751166, --0.021598320423181612, -0.021648308732616698, -0.021698296987930570, -0.021748285188998701, -0.021798273335696117, -0.021848261427898294, -0.021898249465479372, -0.021948237448314829, --0.021998225376279691, -0.022048213249249434, -0.022098201067098200, -0.022148188829701463, -0.022198176536934698, -0.022248164188672048, -0.022298151784788989, -0.022348139325160547, --0.022398126809662203, -0.022448114238168098, -0.022498101610553708, -0.022548088926694063, -0.022598076186464637, -0.022648063389739580, -0.022698050536394364, -0.022748037626304021, --0.022798024659344031, -0.022848011635388531, -0.022897998554313004, -0.022947985415992481, -0.022997972220302438, -0.023047958967117019, -0.023097945656311705, -0.023147932287761526, --0.023197918861341957, -0.023247905376927152, -0.023297891834392580, -0.023347878233613725, -0.023397864574464730, -0.023447850856821072, -0.023497837080557787, -0.023547823245550353, --0.023597809351672917, -0.023647795398800960, -0.023697781386809513, -0.023747767315574056, -0.023797753184968740, -0.023847738994869038, -0.023897724745149989, -0.023947710435687070, --0.023997696066354435, -0.024047681637027557, -0.024097667147581475, -0.024147652597891669, -0.024197637987832289, -0.024247623317278814, -0.024297608586106724, -0.024347593794190169, --0.024397578941404627, -0.024447564027625143, -0.024497549052727188, -0.024547534016584920, -0.024597518919073816, -0.024647503760068912, -0.024697488539445693, -0.024747473257078312, --0.024797457912842245, -0.024847442506612534, -0.024897427038264662, -0.024947411507672778, -0.024997395914712364, -0.025047380259258463, -0.025097364541186551, -0.025147348760370787, --0.025197332916686650, -0.025247317010009623, -0.025297301040213861, -0.025347285007174848, -0.025397268910767622, -0.025447252750867667, -0.025497236527349136, -0.025547220240087511, --0.025597203888957840, -0.025647187473835601, -0.025697170994594950, -0.025747154451111372, -0.025797137843259908, -0.025847121170916042, -0.025897104433953929, -0.025947087632249056, --0.025997070765676464, -0.026047053834111638, -0.026097036837428735, -0.026147019775503239, -0.026197002648210635, -0.026246985455425084, -0.026296968197022069, -0.026346950872876633, --0.026396933482864263, -0.026446916026859116, -0.026496898504736681, -0.026546880916371998, -0.026596863261640555, -0.026646845540416509, -0.026696827752575352, -0.026746809897992125, --0.026796791976542320, -0.026846773988100085, -0.026896755932540921, -0.026946737809739864, -0.026996719619572406, -0.027046701361912708, -0.027096683036636253, -0.027146664643618094, --0.027196646182733715, -0.027246627653857276, -0.027296609056864270, -0.027346590391630184, -0.027396571658029178, -0.027446552855936744, -0.027496533985227927, -0.027546515045778219, --0.027596496037461778, -0.027646476960154098, -0.027696457813730226, -0.027746438598065654, -0.027796419313034542, -0.027846399958512381, -0.027896380534374220, -0.027946361040495551, --0.027996341476750536, -0.028046321843014668, -0.028096302139162994, -0.028146282365071010, -0.028196262520612875, -0.028246242605664086, -0.028296222620100130, -0.028346202563795178, --0.028396182436624718, -0.028446162238463801, -0.028496141969187923, -0.028546121628671248, -0.028596101216789266, -0.028646080733417033, -0.028696060178430041, -0.028746039551702456, --0.028796018853109770, -0.028845998082527038, -0.028895977239829753, -0.028945956324892084, -0.028995935337589523, -0.029045914277797125, -0.029095893145390381, -0.029145871940243463, --0.029195850662231865, -0.029245829311231087, -0.029295807887115288, -0.029345786389759970, -0.029395764819040188, -0.029445743174831437, -0.029495721457007882, -0.029545699665445027, --0.029595677800017921, -0.029645655860602062, -0.029695633847071624, -0.029745611759302099, -0.029795589597168545, -0.029845567360546461, -0.029895545049310013, -0.029945522663334705, --0.029995500202495588, -0.030045477666668166, -0.030095455055726604, -0.030145432369546407, -0.030195409608002627, -0.030245386770970769, -0.030295363858325000, -0.030345340869940819, --0.030395317805693732, -0.030445294665457905, -0.030495271449108841, -0.030545248156521602, -0.030595224787571682, -0.030645201342133260, -0.030695177820081833, -0.030745154221292460, --0.030795130545640648, -0.030845106793000565, -0.030895082963247715, -0.030945059056257156, -0.030995035071904393, -0.031045011010063600, -0.031094986870610280, -0.031144962653419490, --0.031194938358366741, -0.031244913985326202, -0.031294889534173378, -0.031344865004783770, -0.031394840397031561, -0.031444815710792245, -0.031494790945940897, -0.031544766102353010, --0.031594741179902762, -0.031644716178465669, -0.031694691097916783, -0.031744665938131605, -0.031794640698984328, -0.031844615380350445, -0.031894589982105023, -0.031944564504123571, --0.031994538946280265, -0.032044513308450616, -0.032094487590509674, -0.032144461792332962, -0.032194435913794651, -0.032244409954770251, -0.032294383915135269, -0.032344357794763884, --0.032394331593531604, -0.032444305311313495, -0.032494278947985067, -0.032544252503420502, -0.032594225977495297, -0.032644199370084531, -0.032694172681063713, -0.032744145910307020, --0.032794119057689960, -0.032844092123087601, -0.032894065106375457, -0.032944038007427706, -0.032994010826119857, -0.033043983562326990, -0.033093956215924598, -0.033143928786786875, --0.033193901274789335, -0.033243873679807037, -0.033293846001715498, -0.033343818240388901, -0.033393790395702755, -0.033443762467532584, -0.033493734455752558, -0.033543706360238200, --0.033593678180864575, -0.033643649917507193, -0.033693621570040251, -0.033743593138339245, -0.033793564622279268, -0.033843536021735815, -0.033893507336583077, -0.033943478566696578, --0.033993449711951375, -0.034043420772222999, -0.034093391747385619, -0.034143362637314767, -0.034193333441885507, -0.034243304160973355, -0.034293274794452495, -0.034343245342198452, --0.034393215804086739, -0.034443186179991543, -0.034493156469788386, -0.034543126673352333, -0.034593096790558907, -0.034643066821282299, -0.034693036765398019, -0.034743006622781153, --0.034792976393307209, -0.034842946076850380, -0.034892915673286187, -0.034942885182489711, -0.034992854604336460, -0.035042823938700625, -0.035092793185457737, -0.035142762344482860, --0.035192731415651525, -0.035242700398837916, -0.035292669293917563, -0.035342638100765975, -0.035392606819257343, -0.035442575449267197, -0.035492543990670616, -0.035542512443343117, --0.035592480807158891, -0.035642449081993467, -0.035692417267721918, -0.035742385364219767, -0.035792353371361212, -0.035842321289021775, -0.035892289117076537, -0.035942256855401013, --0.035992224503869408, -0.036042192062357238, -0.036092159530739590, -0.036142126908891986, -0.036192094196688625, -0.036242061394005022, -0.036292028500716271, -0.036341995516697888, --0.036391962441824077, -0.036441929275970356, -0.036491896019012260, -0.036541862670823974, -0.036591829231281035, -0.036641795700258523, -0.036691762077631966, -0.036741728363275557, --0.036791694557064832, -0.036841660658874870, -0.036891626668581194, -0.036941592586058017, -0.036991558411180854, -0.037041524143824792, -0.037091489783865367, -0.037141455331176770, --0.037191420785634539, -0.037241386147113753, -0.037291351415489948, -0.037341316590637316, -0.037391281672431401, -0.037441246660747718, -0.037491211555460480, -0.037541176356445209, --0.037591141063576999, -0.037641105676731380, -0.037691070195782550, -0.037741034620606045, -0.037790998951076960, -0.037840963187070815, -0.037890927328461818, -0.037940891375125504, --0.037990855326936968, -0.038040819183771730, -0.038090782945504005, -0.038140746612009321, -0.038190710183162765, -0.038240673658839881, -0.038290637038914874, -0.038340600323263266, --0.038390563511760609, -0.038440526604281093, -0.038490489600700263, -0.038540452500893212, -0.038590415304735469, -0.038640378012101247, -0.038690340622866082, -0.038740303136905060, --0.038790265554093727, -0.038840227874306285, -0.038890190097418273, -0.038940152223304790, -0.038990114251841367, -0.039040076182902214, -0.039090038016362870, -0.039139999752098434, --0.039189961389984436, -0.039239922929895095, -0.039289884371705948, -0.039339845715292532, -0.039389806960529065, -0.039439768107291072, -0.039489729155453658, -0.039539690104892368, --0.039589650955481413, -0.039639611707096324, -0.039689572359612207, -0.039739532912904607, -0.039789493366847728, -0.039839453721317121, -0.039889413976187872, -0.039939374131335532, --0.039989334186634320, -0.040039294141959766, -0.040089253997186977, -0.040139213752191497, -0.040189173406847543, -0.040239132961030655, -0.040289092414616375, -0.040339051767478921, --0.040389011019493840, -0.040438970170536229, -0.040488929220481633, -0.040538888169204278, -0.040588847016579700, -0.040638805762483000, -0.040688764406789736, -0.040738722949374112, --0.040788681390111679, -0.040838639728877552, -0.040888597965547259, -0.040938556099995034, -0.040988514132096414, -0.041038472061726512, -0.041088429888760873, -0.041138387613073715, --0.041188345234540590, -0.041238302753036603, -0.041288260168437299, -0.041338217480616897, -0.041388174689450961, -0.041438131794815029, -0.041488088796583319, -0.041538045694631390, --0.041588002488834347, -0.041637959179067742, -0.041687915765205794, -0.041737872247124060, -0.041787828624697640, -0.041837784897802099, -0.041887741066311650, -0.041937697130101842, --0.041987653089047797, -0.042037608943025065, -0.042087564691907858, -0.042137520335571749, -0.042187475873891836, -0.042237431306743671, -0.042287386634001493, -0.042337341855540847, --0.042387296971237283, -0.042437251980965041, -0.042487206884599664, -0.042537161682016274, -0.042587116373090421, -0.042637070957696331, -0.042687025435709569, -0.042736979807005242, --0.042786934071458907, -0.042836888228944790, -0.042886842279338457, -0.042936796222515020, -0.042986750058350030, -0.043036703786717728, -0.043086657407493664, -0.043136610920552952, --0.043186564325771164, -0.043236517623022518, -0.043286470812182579, -0.043336423893126905, -0.043386376865729728, -0.043436329729866607, -0.043486282485412663, -0.043536235132243459, --0.043586187670233222, -0.043636140099257516, -0.043686092419191462, -0.043736044629910618, -0.043785996731289217, -0.043835948723202824, -0.043885900605526565, -0.043935852378135992, --0.043985804040905345, -0.044035755593710195, -0.044085707036425649, -0.044135658368927279, -0.044185609591089324, -0.044235560702787342, -0.044285511703896455, -0.044335462594292240, --0.044385413373848923, -0.044435364042442069, -0.044485314599947250, -0.044535265046238698, -0.044585215381191985, -0.044635165604682239, -0.044685115716585018, -0.044735065716774568, --0.044785015605126446, -0.044834965381515789, -0.044884915045818166, -0.044934864597907805, -0.044984814037660290, -0.045034763364950735, -0.045084712579654712, -0.045134661681646468, --0.045184610670801574, -0.045234559546995151, -0.045284508310102771, -0.045334456959998673, -0.045384405496558436, -0.045434353919657632, -0.045484302229170492, -0.045534250424972604, --0.045584198506939087, -0.045634146474945521, -0.045684094328866137, -0.045734042068576522, -0.045783989693951803, -0.045833937204867552, -0.045883884601198015, -0.045933831882818764, --0.045983779049604941, -0.046033726101432110, -0.046083673038174518, -0.046133619859707743, -0.046183566565906921, -0.046233513156647622, -0.046283459631804101, -0.046333405991251929, --0.046383352234866684, -0.046433298362522614, -0.046483244374095303, -0.046533190269459880, -0.046583136048491923, -0.046633081711065685, -0.046683027257056739, -0.046732972686340225, --0.046782917998791723, -0.046832863194285486, -0.046882808272697092, -0.046932753233901670, -0.046982698077774818, -0.047032642804190769, -0.047082587413025116, -0.047132531904152994, --0.047182476277449988, -0.047232420532790344, -0.047282364670049655, -0.047332308689103049, -0.047382252589826118, -0.047432196372093109, -0.047482140035779608, -0.047532083580761206, --0.047582027006912150, -0.047631970314108020, -0.047681913502223970, -0.047731856571135579, -0.047781799520717101, -0.047831742350844128, -0.047881685061391802, -0.047931627652235700, --0.047981570123250085, -0.048031512474310548, -0.048081454705292230, -0.048131396816070718, -0.048181338806520271, -0.048231280676516476, -0.048281222425934481, -0.048331164054649871, --0.048381105562536907, -0.048431046949471181, -0.048480988215328286, -0.048530929359982468, -0.048580870383309334, -0.048630811285184018, -0.048680752065482120, -0.048730692724077894, --0.048780633260846945, -0.048830573675664408, -0.048880513968405877, -0.048930454138945624, -0.048980394187159236, -0.049030334112921854, -0.049080273916109085, -0.049130213596595189, --0.049180153154255758, -0.049230092588965949, -0.049280031900601345, -0.049329971089036223, -0.049379910154146167, -0.049429849095806784, -0.049479787913892334, -0.049529726608278417, --0.049579665178840181, -0.049629603625453225, -0.049679541947991818, -0.049729480146331551, -0.049779418220347586, -0.049829356169915524, -0.049879293994909625, -0.049929231695205488, --0.049979169270678275, -0.050029106721203580, -0.050079044046655675, -0.050128981246910162, -0.050178918321842195, -0.050228855271327380, -0.050278792095239978, -0.050328728793455596, --0.050378665365849389, -0.050428601812296969, -0.050478538132672598, -0.050528474326851883, -0.050578410394710421, -0.050628346336122496, -0.050678282150963705, -0.050728217839109205, --0.050778153400434602, -0.050828088834814177, -0.050878024142123529, -0.050927959322237815, -0.050977894375032654, -0.051027829300382306, -0.051077764098162393, -0.051127698768248062, --0.051177633310514933, -0.051227567724837275, -0.051277502011090700, -0.051327436169150371, -0.051377370198891888, -0.051427304100189544, -0.051477237872918934, -0.051527171516955676, --0.051577105032174046, -0.051627038418449650, -0.051676971675657664, -0.051726904803673687, -0.051776837802372008, -0.051826770671628226, -0.051876703411317525, -0.051926636021315510, --0.051976568501496463, -0.052026500851735991, -0.052076433071909262, -0.052126365161891904, -0.052176297121558184, -0.052226228950783722, -0.052276160649443688, -0.052326092217413696, --0.052376023654568026, -0.052425954960782298, -0.052475886135932133, -0.052525817179891805, -0.052575748092536935, -0.052625678873742691, -0.052675609523384695, -0.052725540041337234, --0.052775470427475921, -0.052825400681675933, -0.052875330803812882, -0.052925260793761066, -0.052975190651396095, -0.053025120376593154, -0.053075049969227850, -0.053124979429174476, --0.053174908756308654, -0.053224837950505567, -0.053274767011640821, -0.053324695939588718, -0.053374624734224871, -0.053424553395424908, -0.053474481923063123, -0.053524410317015131, --0.053574338577156107, -0.053624266703361685, -0.053674194695506154, -0.053724122553465134, -0.053774050277113808, -0.053823977866327796, -0.053873905320981401, -0.053923832640950242, --0.053973759826109496, -0.054023686876334805, -0.054073613791500441, -0.054123540571482054, -0.054173467216154805, -0.054223393725394337, -0.054273320099074943, -0.054323246337072244, --0.054373172439261881, -0.054423098405518136, -0.054473024235716642, -0.054522949929732598, -0.054572875487441615, -0.054622800908718003, -0.054672726193437382, -0.054722651341474957, --0.054772576352706340, -0.054822501227005840, -0.054872425964249086, -0.054922350564311266, -0.054972275027068015, -0.055022199352393636, -0.055072123540163755, -0.055122047590253562, --0.055171971502538698, -0.055221895276893460, -0.055271818913193486, -0.055321742411313962, -0.055371665771130528, -0.055421588992517486, -0.055471512075350470, -0.055521435019505121, --0.055571357824855741, -0.055621280491277958, -0.055671203018646982, -0.055721125406838441, -0.055771047655726637, -0.055820969765187224, -0.055870891735095379, -0.055920813565326750, --0.055970735255755640, -0.056020656806257701, -0.056070578216708113, -0.056120499486982521, -0.056170420616955243, -0.056220341606501911, -0.056270262455497724, -0.056320183163818323, --0.056370103731338023, -0.056420024157932465, -0.056469944443477291, -0.056519864587846809, -0.056569784590916668, -0.056619704452562064, -0.056669624172658639, -0.056719543751080716, --0.056769463187703935, -0.056819382482403487, -0.056869301635055033, -0.056919220645532884, -0.056969139513712679, -0.057019058239469622, -0.057068976822679369, -0.057118895263216229, --0.057168813560955850, -0.057218731715773435, -0.057268649727544640, -0.057318567596143774, -0.057368485321446491, -0.057418402903328433, -0.057468320341663930, -0.057518237636328622, --0.057568154787197720, -0.057618071794146873, -0.057667988657050410, -0.057717905375783973, -0.057767821950222766, -0.057817738380242456, -0.057867654665717354, -0.057917570806523114, --0.057967486802534947, -0.058017402653628508, -0.058067318359678120, -0.058117233920559432, -0.058167149336147660, -0.058217064606318460, -0.058266979730946154, -0.058316894709906399, --0.058366809543074410, -0.058416724230325838, -0.058466638771535011, -0.058516553166577591, -0.058566467415329226, -0.058616381517664254, -0.058666295473458328, -0.058716209282586661, --0.058766122944924913, -0.058816036460347415, -0.058865949828729829, -0.058915863049947365, -0.058965776123875685, -0.059015689050389127, -0.059065601829363344, -0.059115514460673556, --0.059165426944195423, -0.059215339279803283, -0.059265251467372798, -0.059315163506779178, -0.059365075397898093, -0.059414987140603878, -0.059464898734772197, -0.059514810180278710, --0.059564721476997755, -0.059614632624804993, -0.059664543623575657, -0.059714454473185401, -0.059764365173508562, -0.059814275724420815, -0.059864186125797379, -0.059914096377513916, --0.059964006479444776, -0.060013916431465614, -0.060063826233451661, -0.060113735885278588, -0.060163645386820737, -0.060213554737953763, -0.060263463938552905, -0.060313372988493832, --0.060363281887650888, -0.060413190635899734, -0.060463099233116047, -0.060513007679174169, -0.060562915973949770, -0.060612824117318082, -0.060662732109154779, -0.060712639949334200, --0.060762547637732020, -0.060812455174223477, -0.060862362558684234, -0.060912269790988648, -0.060962176871012380, -0.061012083798630670, -0.061061990573719201, -0.061111897196152308, --0.061161803665805668, -0.061211709982554520, -0.061261616146274546, -0.061311522156840083, -0.061361428014126820, -0.061411333718009983, -0.061461239268365254, -0.061511144665066991, --0.061561049907990856, -0.061610954997012544, -0.061660859932006401, -0.061710764712848115, -0.061760669339412912, -0.061810573811576473, -0.061860478129213164, -0.061910382292198654, --0.061960286300408195, -0.062010190153717455, -0.062060093852000807, -0.062109997395133919, -0.062159900782992036, -0.062209804015450842, -0.062259707092384702, -0.062309610013669289, --0.062359512779179851, -0.062409415388792078, -0.062459317842380319, -0.062509220139820271, -0.062559122280987617, -0.062609024265756708, -0.062658926094003239, -0.062708827765602451, --0.062758729280430040, -0.062808630638360369, -0.062858531839269122, -0.062908432883031537, -0.062958333769523311, -0.063008234498618809, -0.063058135070193727, -0.063108035484123304, --0.063157935740283236, -0.063207835838547888, -0.063257735778792956, -0.063307635560893666, -0.063357535184725741, -0.063407434650163547, -0.063457333957082751, -0.063507233105359065, --0.063557132094866853, -0.063607030925481811, -0.063656929597079193, -0.063706828109534694, -0.063756726462722679, -0.063806624656518859, -0.063856522690798473, -0.063906420565437216, --0.063956318280309468, -0.064006215835290925, -0.064056113230256839, -0.064106010465082922, -0.064155907539643522, -0.064205804453814366, -0.064255701207470692, -0.064305597800488210, --0.064355494232741298, -0.064405390504105639, -0.064455286614456500, -0.064505182563669605, -0.064555078351619291, -0.064604973978181296, -0.064654869443231303, -0.064704764746643703, --0.064754659888294180, -0.064804554868058001, -0.064854449685810889, -0.064904344341427209, -0.064954238834782671, -0.065004133165752528, -0.065054027334212505, -0.065103921340036966, --0.065153815183101621, -0.065203708863281737, -0.065253602380453024, -0.065303495734489861, -0.065353388925267972, -0.065403281952663039, -0.065453174816549470, -0.065503067516802946, --0.065552960053298776, -0.065602852425912628, -0.065652744634518923, -0.065702636678993342, -0.065752528559211182, -0.065802420275048137, -0.065852311826378601, -0.065902203213078284, --0.065952094435022451, -0.066001985492086829, -0.066051876384145808, -0.066101767111075085, -0.066151657672749956, -0.066201548069046129, -0.066251438299837970, -0.066301328365001230, --0.066351218264411163, -0.066401107997943493, -0.066450997565472611, -0.066500886966874243, -0.066550776202024098, -0.066600665270796555, -0.066650554173067367, -0.066700442908711785, --0.066750331477605535, -0.066800219879623021, -0.066850108114639956, -0.066899996182531618, -0.066949884083173733, -0.066999771816440706, -0.067049659382208235, -0.067099546780351613, --0.067149434010746578, -0.067199321073267509, -0.067249207967790145, -0.067299094694189751, -0.067348981252342066, -0.067398867642121496, -0.067448753863403738, -0.067498639916064113, --0.067548525799978318, -0.067598411515020773, -0.067648297061067189, -0.067698182437993318, -0.067748067645673551, -0.067797952683983601, -0.067847837552798773, -0.067897722251994794, --0.067947606781446068, -0.067997491141028335, -0.068047375330616861, -0.068097259350087397, -0.068147143199314336, -0.068197026878173431, -0.068246910386539947, -0.068296793724289637, --0.068346676891296892, -0.068396559887437453, -0.068446442712587069, -0.068496325366620134, -0.068546207849412372, -0.068596090160839104, -0.068645972300776043, -0.068695854269097620, --0.068745736065679547, -0.068795617690397146, -0.068845499143126140, -0.068895380423740937, -0.068945261532117288, -0.068995142468130488, -0.069045023231656275, -0.069094903822569068, --0.069144784240744592, -0.069194664486058155, -0.069244544558385496, -0.069294424457601034, -0.069344304183580521, -0.069394183736199239, -0.069444063115332938, -0.069493942320856039, --0.069543821352644294, -0.069593700210573428, -0.069643578894517874, -0.069693457404353371, -0.069743335739955226, -0.069793213901199178, -0.069843091887959660, -0.069892969700112398, --0.069942847337532726, -0.069992724800096370, -0.070042602087677777, -0.070092479200152658, -0.070142356137396347, -0.070192232899284598, -0.070242109485691817, -0.070291985896493756, --0.070341862131565736, -0.070391738190783509, -0.070441614074021483, -0.070491489781155436, -0.070541365312061094, -0.070591240666612903, -0.070641115844686603, -0.070690990846157514, --0.070740865670901404, -0.070790740318792678, -0.070840614789707101, -0.070890489083519984, -0.070940363200107090, -0.070990237139342854, -0.071040110901103015, -0.071089984485262894, --0.071139857891698272, -0.071189731120283539, -0.071239604170894505, -0.071289477043406435, -0.071339349737695137, -0.071389222253635004, -0.071439094591101829, -0.071488966749971350, --0.071538838730118015, -0.071588710531417590, -0.071638582153745384, -0.071688453596977161, -0.071738324860987371, -0.071788195945651764, -0.071838066850845664, -0.071887937576444835, --0.071937808122323726, -0.071987678488358103, -0.072037548674423274, -0.072087418680395018, -0.072137288506147770, -0.072187158151557310, -0.072237027616498944, -0.072286896900848469, --0.072336766004480288, -0.072386634927270210, -0.072436503669093530, -0.072486372229826040, -0.072536240609342176, -0.072586108807517716, -0.072635976824228413, -0.072685844659348742, --0.072735712312754441, -0.072785579784320875, -0.072835447073923795, -0.072885314181437663, -0.072935181106738231, -0.072985047849700863, -0.073034914410201310, -0.073084780788114020, --0.073134646983314788, -0.073184512995678935, -0.073234378825082241, -0.073284244471399168, -0.073334109934505468, -0.073383975214276503, -0.073433840310588042, -0.073483705223314544, --0.073533569952331776, -0.073583434497515518, -0.073633298858740245, -0.073683163035881710, -0.073733027028815276, -0.073782890837416723, -0.073832754461560485, -0.073882617901122369, --0.073932481155977711, -0.073982344226002292, -0.074032207111070572, -0.074082069811058332, -0.074131932325840921, -0.074181794655294106, -0.074231656799292375, -0.074281518757711509, --0.074331380530426830, -0.074381242117314159, -0.074431103518247929, -0.074480964733103935, -0.074530825761757985, -0.074580686604084512, -0.074630547259959337, -0.074680407729257797, --0.074730268011855672, -0.074780128107627436, -0.074829988016448870, -0.074879847738195351, -0.074929707272742646, -0.074979566619965229, -0.075029425779738895, -0.075079284751938993, --0.075129143536441331, -0.075179002133120371, -0.075228860541851891, -0.075278718762511271, -0.075328576794974303, -0.075378434639115435, -0.075428292294810489, -0.075478149761934815, --0.075528007040364192, -0.075577864129973124, -0.075627721030637390, -0.075677577742232813, -0.075727434264633825, -0.075777290597716263, -0.075827146741355475, -0.075877002695427256, --0.075926858459806096, -0.075976714034367787, -0.076026569418987694, -0.076076424613541610, -0.076126279617904039, -0.076176134431950759, -0.076225989055557150, -0.076275843488599004, --0.076325697730950798, -0.076375551782488366, -0.076425405643087044, -0.076475259312622654, -0.076525112790969671, -0.076574966078003903, -0.076624819173601172, -0.076674672077635939, --0.076724524789984039, -0.076774377310520822, -0.076824229639122096, -0.076874081775662365, -0.076923933720017421, -0.076973785472062642, -0.077023637031673850, -0.077073488398725520, --0.077123339573093461, -0.077173190554653062, -0.077223041343280133, -0.077272891938849148, -0.077322742341235942, -0.077372592550315866, -0.077422442565964769, -0.077472292388057112, --0.077522142016468731, -0.077571991451075434, -0.077621840691751709, -0.077671689738373392, -0.077721538590815847, -0.077771387248954896, -0.077821235712665041, -0.077871083981822090, --0.077920932056301434, -0.077970779935978882, -0.078020627620728950, -0.078070475110427445, -0.078120322404949746, -0.078170169504171688, -0.078220016407967760, -0.078269863116213798, --0.078319709628785178, -0.078369555945557723, -0.078419402066405935, -0.078469247991205637, -0.078519093719832234, -0.078568939252161518, -0.078618784588068036, -0.078668629727427580, --0.078718474670115987, -0.078768319416007773, -0.078818163964978760, -0.078868008316904326, -0.078917852471660319, -0.078967696429121242, -0.079017540189162933, -0.079067383751660766, --0.079117227116490579, -0.079167070283526875, -0.079216913252645516, -0.079266756023721852, -0.079316598596631746, -0.079366440971249716, -0.079416283147451569, -0.079466125125113155, --0.079515966904108989, -0.079565808484314909, -0.079615649865606306, -0.079665491047859027, -0.079715332030947578, -0.079765172814747792, -0.079815013399135076, -0.079864853783985265, --0.079914693969172876, -0.079964533954573758, -0.080014373740063302, -0.080064213325517358, -0.080114052710810443, -0.080163891895818393, -0.080213730880416598, -0.080263569664480935, --0.080313408247885895, -0.080363246630507340, -0.080413084812220675, -0.080462922792901737, -0.080512760572425041, -0.080562598150666451, -0.080612435527501802, -0.080662272702805626, --0.080712109676453772, -0.080761946448321645, -0.080811783018285080, -0.080861619386218636, -0.080911455551998121, -0.080961291515498982, -0.081011127276597053, -0.081060962835166867, --0.081110798191084271, -0.081160633344224672, -0.081210468294463947, -0.081260303041676599, -0.081310137585738490, -0.081359971926525040, -0.081409806063912113, -0.081459639997774225, --0.081509473727987225, -0.081559307254426547, -0.081609140576968053, -0.081658973695486248, -0.081708806609857021, -0.081758639319956222, -0.081808471825658369, -0.081858304126839351, --0.081908136223374561, -0.081957968115139876, -0.082007799802009840, -0.082057631283860288, -0.082107462560566669, -0.082157293632004830, -0.082207124498049317, -0.082256955158575992, --0.082306785613460276, -0.082356615862578045, -0.082406445905803830, -0.082456275743013493, -0.082506105374082914, -0.082555934798886635, -0.082605764017300506, -0.082655593029199975, --0.082705421834460904, -0.082755250432957839, -0.082805078824566655, -0.082854907009162759, -0.082904734986622042, -0.082954562756819047, -0.083004390319629640, -0.083054217674929265, --0.083104044822593787, -0.083153871762497750, -0.083203698494517031, -0.083253525018527078, -0.083303351334403752, -0.083353177442021600, -0.083403003341256499, -0.083452829031983894, --0.083502654514079663, -0.083552479787418352, -0.083602304851875850, -0.083652129707328007, -0.083701954353649410, -0.083751778790715936, -0.083801603018403004, -0.083851427036586504, --0.083901250845141009, -0.083951074443942370, -0.084000897832866059, -0.084050721011787927, -0.084100543980582573, -0.084150366739125848, -0.084200189287293198, -0.084250011624960527, --0.084299833752002382, -0.084349655668294651, -0.084399477373712783, -0.084449298868132669, -0.084499120151428866, -0.084548941223477253, -0.084598762084153289, -0.084648582733332867, --0.084698403170890543, -0.084748223396702210, -0.084798043410643759, -0.084847863212589761, -0.084897682802416108, -0.084947502179998247, -0.084997321345212068, -0.085047140297932144, --0.085096959038034381, -0.085146777565394210, -0.085196595879887538, -0.085246413981388935, -0.085296231869774294, -0.085346049544919075, -0.085395867006699169, -0.085445684254989163, --0.085495501289664946, -0.085545318110602411, -0.085595134717676144, -0.085644951110762035, -0.085694767289735560, -0.085744583254472595, -0.085794399004847741, -0.085844214540736888, --0.085894029862015484, -0.085943844968559460, -0.085993659860243390, -0.086043474536943151, -0.086093288998534245, -0.086143103244892549, -0.086192917275892650, -0.086242731091410452, --0.086292544691321443, -0.086342358075501502, -0.086392171243825228, -0.086441984196168525, -0.086491796932406870, -0.086541609452416152, -0.086591421756070971, -0.086641233843247234, --0.086691045713820872, -0.086740857367666430, -0.086790668804659854, -0.086840480024676606, -0.086890291027592603, -0.086940101813282433, -0.086989912381622000, -0.087039722732486793, --0.087089532865752717, -0.087139342781294371, -0.087189152478987661, -0.087238961958708075, -0.087288771220331532, -0.087338580263732604, -0.087388389088787238, -0.087438197695370895, --0.087488006083359507, -0.087537814252627646, -0.087587622203051260, -0.087637429934506253, -0.087687237446867239, -0.087737044740010137, -0.087786851813810407, -0.087836658668143996, --0.087886465302885491, -0.087936271717910838, -0.087986077913095498, -0.088035883888315403, -0.088085689643445153, -0.088135495178360682, -0.088185300492937477, -0.088235105587051457, --0.088284910460577223, -0.088334715113390735, -0.088384519545367440, -0.088434323756383298, -0.088484127746312896, -0.088533931515032194, -0.088583735062417082, -0.088633538388342203, --0.088683341492683476, -0.088733144375316403, -0.088782947036116902, -0.088832749474959588, -0.088882551691720407, -0.088932353686274848, -0.088982155458498843, -0.089031957008267007, --0.089081758335455272, -0.089131559439939154, -0.089181360321594572, -0.089231160980296154, -0.089280961415919832, -0.089330761628341096, -0.089380561617435905, -0.089430361383078874, --0.089480160925145935, -0.089529960243512591, -0.089579759338054787, -0.089629558208647153, -0.089679356855165607, -0.089729155277486122, -0.089778953475483314, -0.089828751449033115, --0.089878549198011026, -0.089928346722293023, -0.089978144021753706, -0.090027941096269021, -0.090077737945714498, -0.090127534569966056, -0.090177330968898350, -0.090227127142387301, --0.090276923090308450, -0.090326718812537732, -0.090376514308949760, -0.090426309579420522, -0.090476104623825493, -0.090525899442040647, -0.090575694033940626, -0.090625488399401349, --0.090675282538298804, -0.090725076450507619, -0.090774870135903726, -0.090824663594362670, -0.090874456825760383, -0.090924249829971521, -0.090974042606872044, -0.091023835156337454, --0.091073627478243713, -0.091123419572465461, -0.091173211438878660, -0.091223003077358839, -0.091272794487781944, -0.091322585670022619, -0.091372376623956836, -0.091422167349460112, --0.091471957846408408, -0.091521748114676379, -0.091571538154139959, -0.091621327964675148, -0.091671117546156575, -0.091720906898460214, -0.091770696021461567, -0.091820484915036638, --0.091870273579060052, -0.091920062013407786, -0.091969850217955354, -0.092019638192578745, -0.092069425937152602, -0.092119213451552884, -0.092169000735655135, -0.092218787789335330, --0.092268574612468124, -0.092318361204929464, -0.092368147566594908, -0.092417933697340429, -0.092467719597040671, -0.092517505265571606, -0.092567290702808780, -0.092617075908628180, --0.092666860882904434, -0.092716645625513544, -0.092766430136331485, -0.092816214415232912, -0.092865998462093799, -0.092915782276789677, -0.092965565859196561, -0.093015349209189080, --0.093065132326643221, -0.093114915211434529, -0.093164697863439005, -0.093214480282531278, -0.093264262468587364, -0.093314044421482792, -0.093363826141093550, -0.093413607627294296, --0.093463388879961029, -0.093513169898969725, -0.093562950684195054, -0.093612731235513016, -0.093662511552799144, -0.093712291635929437, -0.093762071484778553, -0.093811851099222493, --0.093861630479136815, -0.093911409624397493, -0.093961188534879211, -0.094010967210457944, -0.094060745651009275, -0.094110523856409167, -0.094160301826532330, -0.094210079561254725, --0.094259857060451924, -0.094309634323999914, -0.094359411351773378, -0.094409188143648320, -0.094458964699500297, -0.094508741019205297, -0.094558517102638004, -0.094608292949674419, --0.094658068560190545, -0.094707843934061051, -0.094757619071161953, -0.094807393971368809, -0.094857168634557607, -0.094906943060603058, -0.094956717249381151, -0.095006491200767443, --0.095056264914637950, -0.095106038390867356, -0.095155811629331663, -0.095205584629906442, -0.095255357392467710, -0.095305129916890136, -0.095354902203049735, -0.095404674250822080, --0.095454446060083187, -0.095504217630707725, -0.095553988962571723, -0.095603760055550754, -0.095653530909520820, -0.095703301524356618, -0.095753071899934178, -0.095802842036129487, --0.095852611932817244, -0.095902381589873478, -0.095952151007173761, -0.096001920184594094, -0.096051689122009204, -0.096101457819295077, -0.096151226276327315, -0.096200994492981917, --0.096250762469133597, -0.096300530204658383, -0.096350297699431819, -0.096400064953329978, -0.096449831966227514, -0.096499598738000486, -0.096549365268524895, -0.096599131557675438, --0.096648897605328174, -0.096698663411358646, -0.096748428975642911, -0.096798194298055668, -0.096847959378472931, -0.096897724216770301, -0.096947488812823793, -0.096997253166508118, --0.097047017277699321, -0.097096781146272987, -0.097146544772105131, -0.097196308155070479, -0.097246071295045047, -0.097295834191904434, -0.097345596845524685, -0.097395359255780509, --0.097445121422547923, -0.097494883345702540, -0.097544645025120391, -0.097594406460676186, -0.097644167652245956, -0.097693928599705757, -0.097743689302930301, -0.097793449761795617, --0.097843209976177306, -0.097892969945951411, -0.097942729670992656, -0.097992489151177073, -0.098042248386380260, -0.098092007376478274, -0.098141766121345828, -0.098191524620858978, --0.098241282874893296, -0.098291040883324854, -0.098340798646028377, -0.098390556162879894, -0.098440313433755033, -0.098490070458529824, -0.098539827237078992, -0.098589583769278594, --0.098639340055004243, -0.098689096094131970, -0.098738851886536527, -0.098788607432093958, -0.098838362730680307, -0.098888117782170298, -0.098937872586440004, -0.098987627143365023, --0.099037381452821427, -0.099087135514683927, -0.099136889328828595, -0.099186642895131030, -0.099236396213467304, -0.099286149283712141, -0.099335902105741614, -0.099385654679431334, --0.099435407004657347, -0.099485159081294405, -0.099534910909218566, -0.099584662488305900, -0.099634413818431120, -0.099684164899470323, -0.099733915731299097, -0.099783666313793540, --0.099833416646828363, -0.099883166730279652, -0.099932916564023019, -0.099982666147934537, -0.100032415481888940, -0.100082164565762330, -0.100131913399430280, -0.100181661982768900, --0.100231410315652930, -0.100281158397958430, -0.100330906229561020, -0.100380653810336800, -0.100430401140160510, -0.100480148218908200, -0.100529895046455530, -0.100579641622678570, --0.100629387947452050, -0.100679134020652070, -0.100728879842154700, -0.100778625411834670, -0.100828370729568100, -0.100878115795230590, -0.100927860608698240, -0.100977605169845790, --0.101027349478549330, -0.101077093534684480, -0.101126837338127360, -0.101176580888752700, -0.101226324186436580, -0.101276067231054660, -0.101325810022483000, -0.101375552560596400, --0.101425294845270890, -0.101475036876382150, -0.101524778653806270, -0.101574520177418000, -0.101624261447093430, -0.101674002462708630, -0.101723743224138390, -0.101773483731258800, --0.101823223983945500, -0.101872963982074590, -0.101922703725520810, -0.101972443214160280, -0.102022182447868630, -0.102071921426521980, -0.102121660149995090, -0.102171398618164040, --0.102221136830904490, -0.102270874788092550, -0.102320612489602970, -0.102370349935311870, -0.102420087125094890, -0.102469824058828120, -0.102519560736386360, -0.102569297157645710, --0.102619033322482250, -0.102668769230770760, -0.102718504882387360, -0.102768240277207680, -0.102817975415107860, -0.102867710295962640, -0.102917444919648160, -0.102967179286040060, --0.103016913395014450, -0.103066647246446120, -0.103116380840211170, -0.103166114176185280, -0.103215847254244530, -0.103265580074263730, -0.103315312636118970, -0.103365044939685930, --0.103414776984840720, -0.103464508771458140, -0.103514240299414280, -0.103563971568584810, -0.103613702578845860, -0.103663433330072220, -0.103713163822139990, -0.103762894054925280, --0.103812624028302910, -0.103862353742148970, -0.103912083196339160, -0.103961812390749570, -0.104011541325255020, -0.104061269999731600, -0.104110998414055010, -0.104160726568101370, --0.104210454461745470, -0.104260182094863430, -0.104309909467330940, -0.104359636579024130, -0.104409363429817770, -0.104459090019588000, -0.104508816348210510, -0.104558542415561420, --0.104608268221515530, -0.104657993765948980, -0.104707719048737880, -0.104757444069757040, -0.104807168828882590, -0.104856893325990230, -0.104906617560956070, -0.104956341533654920, --0.105006065243962910, -0.105055788691755750, -0.105105511876909560, -0.105155234799299140, -0.105204957458800640, -0.105254679855289730, -0.105304401988642590, -0.105354123858733980, --0.105403845465440070, -0.105453566808636550, -0.105503287888199540, -0.105553008704003890, -0.105602729255925700, -0.105652449543841150, -0.105702169567625020, -0.105751889327153460, --0.105801608822302190, -0.105851328052947320, -0.105901047018963700, -0.105950765720227480, -0.106000484156614320, -0.106050202328000400, -0.106099920234260540, -0.106149637875270870, --0.106199355250907110, -0.106249072361045400, -0.106298789205560570, -0.106348505784328760, -0.106398222097225700, -0.106447938144127520, -0.106497653924909050, -0.106547369439446440, --0.106597084687615420, -0.106646799669292120, -0.106696514384351390, -0.106746228832669360, -0.106795943014122210, -0.106845656928584750, -0.106895370575933170, -0.106945083956043140, --0.106994797068790850, -0.107044509914051120, -0.107094222491700130, -0.107143934801613580, -0.107193646843667630, -0.107243358617737110, -0.107293070123698210, -0.107342781361426620, --0.107392492330798530, -0.107442203031688760, -0.107491913463973490, -0.107541623627528430, -0.107591333522229770, -0.107641043147952320, -0.107690752504572260, -0.107740461591965760, --0.107790170410007670, -0.107839878958574160, -0.107889587237540940, -0.107939295246784210, -0.107989002986178780, -0.108038710455600860, -0.108088417654926150, -0.108138124584030840, --0.108187831242789790, -0.108237537631079140, -0.108287243748774660, -0.108336949595752520, -0.108386655171887540, -0.108436360477055950, -0.108486065511133430, -0.108535770273996220, --0.108585474765519120, -0.108635178985578340, -0.108684882934050060, -0.108734586610809120, -0.108784290015731710, -0.108833993148693590, -0.108883696009570920, -0.108933398598238570, --0.108983100914572720, -0.109032802958449120, -0.109082504729743970, -0.109132206228332100, -0.109181907454089720, -0.109231608406892570, -0.109281309086616830, -0.109331009493137380, --0.109380709626330420, -0.109430409486071680, -0.109480109072237350, -0.109529808384702320, -0.109579507423342760, -0.109629206188034430, -0.109678904678653530, -0.109728602895074930, --0.109778300837174810, -0.109827998504829380, -0.109877695897913520, -0.109927393016303430, -0.109977089859874840, -0.110026786428503970, -0.110076482722065700, -0.110126178740436220, --0.110175874483491300, -0.110225569951107120, -0.110275265143158580, -0.110324960059521890, -0.110374654700072780, -0.110424349064687480, -0.110474043153240870, -0.110523736965609160, --0.110573430501668540, -0.110623123761293910, -0.110672816744361450, -0.110722509450746960, -0.110772201880326650, -0.110821894032975390, -0.110871585908569380, -0.110921277506984410, --0.110970968828096710, -0.111020659871781110, -0.111070350637913890, -0.111120041126370780, -0.111169731337028010, -0.111219421269760480, -0.111269110924444390, -0.111318800300955510, --0.111368489399170090, -0.111418178218962990, -0.111467866760210450, -0.111517555022788250, -0.111567243006572600, -0.111616930711438400, -0.111666618137261860, -0.111716305283919240, --0.111765992151285400, -0.111815678739236590, -0.111865365047648570, -0.111915051076397580, -0.111964736825358540, -0.112014422294407640, -0.112064107483420690, -0.112113792392273910, --0.112163477020842210, -0.112213161369001820, -0.112262845436628520, -0.112312529223598560, -0.112362212729786830, -0.112411895955069560, -0.112461578899322550, -0.112511261562422040, --0.112560943944242940, -0.112610626044661470, -0.112660307863553450, -0.112709989400795090, -0.112759670656261320, -0.112809351629828370, -0.112859032321372480, -0.112908712730768570, --0.112958392857892890, -0.113008072702621210, -0.113057752264829790, -0.113107431544393550, -0.113157110541188740, -0.113206789255091160, -0.113256467685977020, -0.113306145833721300, --0.113355823698200200, -0.113405501279289540, -0.113455178576865570, -0.113504855590803210, -0.113554532320978730, -0.113604208767268340, -0.113653884929546990, -0.113703560807690940, --0.113753236401575970, -0.113802911711078360, -0.113852586736073030, -0.113902261476436230, -0.113951935932043780, -0.114001610102771930, -0.114051283988495610, -0.114100957589091080, --0.114150630904434160, -0.114200303934401100, -0.114249976678866840, -0.114299649137707640, -0.114349321310799320, -0.114398993198018130, -0.114448664799239030, -0.114498336114338270, --0.114548007143191650, -0.114597677885675460, -0.114647348341664640, -0.114697018511035450, -0.114746688393664140, -0.114796357989425680, -0.114846027298196330, -0.114895696319851900, --0.114945365054268680, -0.114995033501321610, -0.115044701660886940, -0.115094369532840520, -0.115144037117058630, -0.115193704413416200, -0.115243371421789500, -0.115293038142054380, --0.115342704574087100, -0.115392370717762640, -0.115442036572957220, -0.115491702139546720, -0.115541367417407420, -0.115591032406414250, -0.115640697106443490, -0.115690361517371440, --0.115740025639073050, -0.115789689471424580, -0.115839353014301900, -0.115889016267581270, -0.115938679231137670, -0.115988341904847360, -0.116038004288586200, -0.116087666382230480, --0.116137328185655130, -0.116186989698736480, -0.116236650921350340, -0.116286311853373030, -0.116335972494679490, -0.116385632845146010, -0.116435292904648460, -0.116484952673063120, --0.116534612150264960, -0.116584271336130270, -0.116633930230535320, -0.116683588833355130, -0.116733247144465950, -0.116782905163743660, -0.116832562891064560, -0.116882220326303590, --0.116931877469337090, -0.116981534320040880, -0.117031190878291280, -0.117080847143963260, -0.117130503116933130, -0.117180158797076740, -0.117229814184270390, -0.117279469278389060, --0.117329124079309070, -0.117378778586906260, -0.117428432801056940, -0.117478086721636110, -0.117527740348520050, -0.117577393681584650, -0.117627046720706200, -0.117676699465759700, --0.117726351916621450, -0.117776004073167750, -0.117825655935273610, -0.117875307502815330, -0.117924958775668780, -0.117974609753710270, -0.118024260436814800, -0.118073910824858670, --0.118123560917717770, -0.118173210715268410, -0.118222860217385580, -0.118272509423945600, -0.118322158334824350, -0.118371806949898140, -0.118421455269041960, -0.118471103292132160, --0.118520751019044610, -0.118570398449655600, -0.118620045583840160, -0.118669692421474610, -0.118719338962435280, -0.118768985206597150, -0.118818631153836550, -0.118868276804029380, --0.118917922157051960, -0.118967567212779290, -0.119017211971087710, -0.119066856431853090, -0.119116500594951780, -0.119166144460258780, -0.119215788027650400, -0.119265431297002570, --0.119315074268191590, -0.119364716941092490, -0.119414359315581590, -0.119464001391534800, -0.119513643168828440, -0.119563284647337540, -0.119612925826938430, -0.119662566707507440, --0.119712207288919580, -0.119761847571051220, -0.119811487553778240, -0.119861127236976980, -0.119910766620522450, -0.119960405704291020, -0.120010044488158570, -0.120059682972001450, --0.120109321155694670, -0.120158959039114610, -0.120208596622137130, -0.120258233904638610, -0.120307870886494070, -0.120357507567579850, -0.120407143947771860, -0.120456780026946440, --0.120506415804978630, -0.120556051281744790, -0.120605686457120830, -0.120655321330983080, -0.120704955903206600, -0.120754590173667710, -0.120804224142242800, -0.120853857808806880, --0.120903491173236330, -0.120953124235407040, -0.121002756995195390, -0.121052389452476390, -0.121102021607126420, -0.121151653459021420, -0.121201285008037700, -0.121250916254050340, --0.121300547196935680, -0.121350177836569660, -0.121399808172828640, -0.121449438205587650, -0.121499067934723070, -0.121548697360110810, -0.121598326481627260, -0.121647955299147440, --0.121697583812547750, -0.121747212021704530, -0.121796839926492840, -0.121846467526789060, -0.121896094822469090, -0.121945721813409350, -0.121995348499484850, -0.122044974880571980, --0.122094600956546660, -0.122144226727285300, -0.122193852192662920, -0.122243477352555920, -0.122293102206840210, -0.122342726755392190, -0.122392350998086930, -0.122441974934800770, --0.122491598565409680, -0.122541221889790040, -0.122590844907816910, -0.122640467619366660, -0.122690090024315680, -0.122739712122539040, -0.122789333913913110, -0.122838955398313850, --0.122888576575617640, -0.122938197445699550, -0.122987818008435970, -0.123037438263702840, -0.123087058211376550, -0.123136677851332190, -0.123186297183446130, -0.123235916207594320, --0.123285534923653170, -0.123335153331497730, -0.123384771431004420, -0.123434389222049160, -0.123484006704508390, -0.123533623878257160, -0.123583240743171850, -0.123632857299128460, --0.123682473546003370, -0.123732089483671630, -0.123781705112009700, -0.123831320430893930, -0.123880935440199420, -0.123930550139802560, -0.123980164529579340, -0.124029778609406140, --0.124079392379158060, -0.124129005838711490, -0.124178618987942410, -0.124228231826727240, -0.124277844354941030, -0.124327456572460210, -0.124377068479160760, -0.124426680074919070, --0.124476291359610230, -0.124525902333110690, -0.124575512995296820, -0.124625123346043710, -0.124674733385227820, -0.124724343112725080, -0.124773952528411920, -0.124823561632163450, --0.124873170423856070, -0.124922778903365760, -0.124972387070568940, -0.125021994925340720, -0.125071602467557520, -0.125121209697095310, -0.125170816613830500, -0.125220423217638240, --0.125270029508394890, -0.125319635485976490, -0.125369241150259410, -0.125418846501118810, -0.125468451538431110, -0.125518056262072240, -0.125567660671918710, -0.125617264767845570, --0.125666868549729280, -0.125716472017446230, -0.125766075170871570, -0.125815678009881750, -0.125865280534352700, -0.125914882744160910, -0.125964484639181470, -0.126014086219290810, --0.126063687484364940, -0.126113288434280300, -0.126162889068911990, -0.126212489388136450, -0.126262089391829670, -0.126311689079868140, -0.126361288452126940, -0.126410887508482530, --0.126460486248810870, -0.126510084672988470, -0.126559682780890390, -0.126609280572393120, -0.126658878047372640, -0.126708475205705410, -0.126758072047266550, -0.126807668571932510, --0.126857264779579730, -0.126906860670083360, -0.126956456243319830, -0.127006051499165160, -0.127055646437495810, -0.127105241058186910, -0.127154835361114880, -0.127204429346155780, --0.127254023013186060, -0.127303616362080820, -0.127353209392716550, -0.127402802104969240, -0.127452394498715400, -0.127501986573830110, -0.127551578330189850, -0.127601169767671080, --0.127650760886148960, -0.127700351685499920, -0.127749942165600040, -0.127799532326325710, -0.127849122167552120, -0.127898711689155730, -0.127948300891012560, -0.127997889772999060, --0.128047478334990390, -0.128097066576863040, -0.128146654498493050, -0.128196242099756830, -0.128245829380529560, -0.128295416340687750, -0.128345002980107370, -0.128394589298664930, --0.128444175296235590, -0.128493760972695800, -0.128543346327921610, -0.128592931361789480, -0.128642516074174600, -0.128692100464953410, -0.128741684534002420, -0.128791268281196800, --0.128840851706412990, -0.128890434809527050, -0.128940017590415460, -0.128989600048953410, -0.129039182185017340, -0.129088763998483290, -0.129138345489227810, -0.129187926657126000, --0.129237507502054400, -0.129287088023889000, -0.129336668222506330, -0.129386248097781570, -0.129435827649591190, -0.129485406877811210, -0.129534985782318170, -0.129584564362987240, --0.129634142619694890, -0.129683720552317170, -0.129733298160730590, -0.129782875444810320, -0.129832452404432890, -0.129882029039474740, -0.129931605349811100, -0.129981181335318440, --0.130030756995872830, -0.130080332331350750, -0.130129907341627410, -0.130179482026579310, -0.130229056386082480, -0.130278630420013470, -0.130328204128247440, -0.130377777510660900, --0.130427350567129920, -0.130476923297530990, -0.130526495701739330, -0.130576067779631410, -0.130625639531083780, -0.130675210955971590, -0.130724782054171400, -0.130774352825559240, --0.130823923270011630, -0.130873493387403780, -0.130923063177612210, -0.130972632640512980, -0.131022201775982590, -0.131071770583896270, -0.131121339064130510, -0.131170907216561410, --0.131220475041065490, -0.131270042537517920, -0.131319609705795260, -0.131369176545773570, -0.131418743057329400, -0.131468309240337890, -0.131517875094675660, -0.131567440620218690, --0.131617005816843600, -0.131666570684425530, -0.131716135222841040, -0.131765699431966670, -0.131815263311677590, -0.131864826861850360, -0.131914390082361050, -0.131963952973086220, --0.132013515533901060, -0.132063077764682120, -0.132112639665305480, -0.132162201235647670, -0.132211762475583940, -0.132261323384990780, -0.132310883963744320, -0.132360444211721110, --0.132410004128796330, -0.132459563714846550, -0.132509122969748290, -0.132558681893376770, -0.132608240485608570, -0.132657798746319750, -0.132707356675386440, -0.132756914272685180, --0.132806471538091220, -0.132856028471481040, -0.132905585072731260, -0.132955141341717040, -0.133004697278315010, -0.133054252882401220, -0.133103808153852230, -0.133153363092543280, --0.133202917698350940, -0.133252471971151280, -0.133302025910820880, -0.133351579517235000, -0.133401132790270160, -0.133450685729802480, -0.133500238335708540, -0.133549790607863570, --0.133599342546144110, -0.133648894150426720, -0.133698445420586680, -0.133747996356500500, -0.133797546958044360, -0.133847097225094770, -0.133896647157527000, -0.133946196755217630, --0.133995746018042760, -0.134045294945878940, -0.134094843538601460, -0.134144391796086890, -0.134193939718211310, -0.134243487304851330, -0.134293034555882210, -0.134342581471180500, --0.134392128050622310, -0.134441674294084270, -0.134491220201441580, -0.134540765772570870, -0.134590311007348220, -0.134639855905650250, -0.134689400467352170, -0.134738944692330610, --0.134788488580462130, -0.134838032131621990, -0.134887575345686770, -0.134937118222532600, -0.134986660762036080, -0.135036202964072480, -0.135085744828518340, -0.135135286355249880, --0.135184827544143630, -0.135234368395074860, -0.135283908907920160, -0.135333449082555710, -0.135382988918858080, -0.135432528416702530, -0.135482067575965650, -0.135531606396524030, --0.135581144878252980, -0.135630683021029070, -0.135680220824728440, -0.135729758289227260, -0.135779295414402120, -0.135828832200128310, -0.135878368646282420, -0.135927904752741050, --0.135977440519379460, -0.136026975946074300, -0.136076511032701660, -0.136126045779138200, -0.136175580185259220, -0.136225114250941250, -0.136274647976060510, -0.136324181360493570, --0.136373714404115750, -0.136423247106803650, -0.136472779468433420, -0.136522311488881690, -0.136571843168023730, -0.136621374505736190, -0.136670905501895620, -0.136720436156377360, --0.136769966469058010, -0.136819496439813750, -0.136869026068521190, -0.136918555355055620, -0.136968084299293660, -0.137017612901111500, -0.137067141160385740, -0.137116669076991690, --0.137166196650805950, -0.137215723881704720, -0.137265250769564640, -0.137314777314260980, -0.137364303515670390, -0.137413829373669030, -0.137463354888133550, -0.137512880058939220, --0.137562404885962690, -0.137611929369080180, -0.137661453508168250, -0.137710977303102280, -0.137760500753758840, -0.137810023860014590, -0.137859546621744850, -0.137909069038826240, --0.137958591111134980, -0.138008112838547640, -0.138057634220939610, -0.138107155258187480, -0.138156675950167480, -0.138206196296756210, -0.138255716297829010, -0.138305235953262520, --0.138354755262932950, -0.138404274226716920, -0.138453792844489780, -0.138503311116128150, -0.138552829041508670, -0.138602346620506690, -0.138651863852998850, -0.138701380738861350, --0.138750897277970820, -0.138800413470202640, -0.138849929315433380, -0.138899444813539330, -0.138948959964397100, -0.138998474767882020, -0.139047989223870770, -0.139097503332239550, --0.139147017092865010, -0.139196530505622470, -0.139246043570388610, -0.139295556287039630, -0.139345068655452240, -0.139394580675501700, -0.139444092347064730, -0.139493603670017510, --0.139543114644236720, -0.139592625269597730, -0.139642135545977150, -0.139691645473251690, -0.139741155051296670, -0.139790664279988760, -0.139840173159204190, -0.139889681688819630, --0.139939189868710400, -0.139988697698753220, -0.140038205178824320, -0.140087712308800290, -0.140137219088556590, -0.140186725517969820, -0.140236231596916230, -0.140285737325272520, --0.140335242702914000, -0.140384747729717400, -0.140434252405558930, -0.140483756730315270, -0.140533260703861770, -0.140582764326075110, -0.140632267596831530, -0.140681770516007750, --0.140731273083479070, -0.140780775299122250, -0.140830277162813900, -0.140879778674429440, -0.140929279833845510, -0.140978780640938380, -0.141028281095584770, -0.141077781197659980, --0.141127280947040770, -0.141176780343603340, -0.141226279387224400, -0.141275778077779330, -0.141325276415144810, -0.141374774399197070, -0.141424272029812860, -0.141473769306867560, --0.141523266230237780, -0.141572762799800300, -0.141622259015430490, -0.141671754877005010, -0.141721250384400140, -0.141770745537492610, -0.141820240336157750, -0.141869734780272320, --0.141919228869712530, -0.141968722604355110, -0.142018215984075440, -0.142067709008750240, -0.142117201678255760, -0.142166693992468700, -0.142216185951264510, -0.142265677554519830, --0.142315168802110950, -0.142364659693914600, -0.142414150229806140, -0.142463640409662310, -0.142513130233359400, -0.142562619700774080, -0.142612108811781800, -0.142661597566259210, --0.142711085964083080, -0.142760574005128820, -0.142810061689273100, -0.142859549016392220, -0.142909035986362930, -0.142958522599060610, -0.143008008854361960, -0.143057494752143300, --0.143106980292281360, -0.143156465474651500, -0.143205950299130500, -0.143255434765594600, -0.143304918873920580, -0.143354402623983800, -0.143403886015661040, -0.143453369048828550, --0.143502851723363080, -0.143552334039140030, -0.143601815996036160, -0.143651297593927750, -0.143700778832691530, -0.143750259712202900, -0.143799740232338660, -0.143849220392975490, --0.143898700193988820, -0.143948179635255410, -0.143997658716651540, -0.144047137438054000, -0.144096615799338130, -0.144146093800380760, -0.144195571441058130, -0.144245048721247020, --0.144294525640822850, -0.144344002199662370, -0.144393478397641880, -0.144442954234638130, -0.144492429710526560, -0.144541904825183890, -0.144591379578486940, -0.144640853970311070, --0.144690328000533080, -0.144739801669029280, -0.144789274975676400, -0.144838747920349900, -0.144888220502926520, -0.144937692723282580, -0.144987164581294880, -0.145036636076838810, --0.145086107209791150, -0.145135577980028210, -0.145185048387426800, -0.145234518431862300, -0.145283988113211500, -0.145333457431350730, -0.145382926386156800, -0.145432394977505070, --0.145481863205272370, -0.145531331069335000, -0.145580798569569740, -0.145630265705852050, -0.145679732478058710, -0.145729198886066470, -0.145778664929750780, -0.145828130608988440, --0.145877595923655760, -0.145927060873629550, -0.145976525458785260, -0.146025989678999630, -0.146075453534149020, -0.146124917024110230, -0.146174380148758720, -0.146223842907971250, --0.146273305301624160, -0.146322767329594230, -0.146372228991756980, -0.146421690287989150, -0.146471151218167530, -0.146520611782167580, -0.146570071979866130, -0.146619531811139460, --0.146668991275864000, -0.146718450373916480, -0.146767909105172400, -0.146817367469508550, -0.146866825466801710, -0.146916283096927360, -0.146965740359762310, -0.147015197255182940, --0.147064653783065990, -0.147114109943286970, -0.147163565735722670, -0.147213021160249450, -0.147262476216744130, -0.147311930905082180, -0.147361385225140390, -0.147410839176795150, --0.147460292759923230, -0.147509745974400170, -0.147559198820102740, -0.147608651296907730, -0.147658103404690650, -0.147707555143328340, -0.147757006512697130, -0.147806457512673850, --0.147855908143133980, -0.147905358403954330, -0.147954808295011290, -0.148004257816181680, -0.148053706967340960, -0.148103155748365990, -0.148152604159133140, -0.148202052199519210, --0.148251499869399730, -0.148300947168651470, -0.148350394097150840, -0.148399840654774680, -0.148449286841398490, -0.148498732656899060, -0.148548178101152810, -0.148597623174036550, --0.148647067875425810, -0.148696512205197360, -0.148745956163228110, -0.148795399749393510, -0.148844842963570420, -0.148894285805635210, -0.148943728275464730, -0.148993170372934500, --0.149042612097921330, -0.149092053450301630, -0.149141494429952250, -0.149190935036748680, -0.149240375270567800, -0.149289815131285950, -0.149339254618780000, -0.149388693732925510, --0.149438132473599240, -0.149487570840678120, -0.149537008834037620, -0.149586446453554590, -0.149635883699105440, -0.149685320570566580, -0.149734757067814860, -0.149784193190725830, --0.149833628939176290, -0.149883064313043130, -0.149932499312201870, -0.149981933936529370, -0.150031368185902010, -0.150080802060196690, -0.150130235559288920, -0.150179668683055570, --0.150229101431373020, -0.150278533804118180, -0.150327965801166560, -0.150377397422395030, -0.150426828667680010, -0.150476259536898360, -0.150525690029925610, -0.150575120146638620, --0.150624549886914290, -0.150673979250628140, -0.150723408237657060, -0.150772836847877430, -0.150822265081166170, -0.150871692937398800, -0.150921120416452200, -0.150970547518202800, --0.151019974242527470, -0.151069400589301740, -0.151118826558402530, -0.151168252149706280, -0.151217677363089800, -0.151267102198428700, -0.151316526655599860, -0.151365950734479670, --0.151415374434945070, -0.151464797756871580, -0.151514220700136090, -0.151563643264615080, -0.151613065450185380, -0.151662487256722570, -0.151711908684103560, -0.151761329732205210, --0.151810750400903080, -0.151860170690074100, -0.151909590599594690, -0.151959010129341710, -0.152008429279190810, -0.152057848049018810, -0.152107266438702200, -0.152156684448117860, --0.152206102077141360, -0.152255519325649620, -0.152304936193519090, -0.152354352680626640, -0.152403768786847860, -0.152453184512059690, -0.152502599856138980, -0.152552014818961330, --0.152601429400403640, -0.152650843600342370, -0.152700257418654450, -0.152749670855215430, -0.152799083909902270, -0.152848496582591360, -0.152897908873159650, -0.152947320781482740, --0.152996732307437540, -0.153046143450900480, -0.153095554211748530, -0.153144964589857240, -0.153194374585103540, -0.153243784197363900, -0.153293193426515260, -0.153342602272433180, --0.153392010734994590, -0.153441418814075970, -0.153490826509554260, -0.153540233821305020, -0.153589640749205230, -0.153639047293131740, -0.153688453452960230, -0.153737859228567560, --0.153787264619830250, -0.153836669626625210, -0.153886074248828050, -0.153935478486315720, -0.153984882338964710, -0.154034285806651900, -0.154083688889252970, -0.154133091586644790, --0.154182493898703890, -0.154231895825307190, -0.154281297366330340, -0.154330698521650210, -0.154380099291143350, -0.154429499674686670, -0.154478899672155810, -0.154528299283427710, --0.154577698508378850, -0.154627097346886180, -0.154676495798825340, -0.154725893864073260, -0.154775291542506880, -0.154824688834001830, -0.154874085738435060, -0.154923482255683060, --0.154972878385622820, -0.155022274128129940, -0.155071669483081350, -0.155121064450353620, -0.155170459029823630, -0.155219853221367080, -0.155269247024860890, -0.155318640440181590, --0.155368033467206120, -0.155417426105810140, -0.155466818355870590, -0.155516210217264420, -0.155565601689867300, -0.155614992773556170, -0.155664383468207550, -0.155713773773698410, --0.155763163689904420, -0.155812553216702510, -0.155861942353969190, -0.155911331101581480, -0.155960719459415000, -0.156010107427346720, -0.156059495005253180, -0.156108882193011330, --0.156158268990496840, -0.156207655397586690, -0.156257041414157390, -0.156306427040085900, -0.156355812275247950, -0.156405197119520440, -0.156454581572779940, -0.156503965634903430, --0.156553349305766560, -0.156602732585246350, -0.156652115473219690, -0.156701497969562340, -0.156750880074151250, -0.156800261786862930, -0.156849643107574430, -0.156899024036161380, --0.156948404572500750, -0.156997784716469110, -0.157047164467943450, -0.157096543826799440, -0.157145922792914060, -0.157195301366163890, -0.157244679546425900, -0.157294057333575790, --0.157343434727490520, -0.157392811728046670, -0.157442188335121220, -0.157491564548589870, -0.157540940368329580, -0.157590315794216980, -0.157639690826129000, -0.157689065463941370, --0.157738439707531070, -0.157787813556775100, -0.157837187011549170, -0.157886560071730270, -0.157935932737194970, -0.157985305007820290, -0.158034676883481880, -0.158084048364056820, --0.158133419449421610, -0.158182790139453300, -0.158232160434027550, -0.158281530333021420, -0.158330899836311460, -0.158380268943774720, -0.158429637655286840, -0.158479005970724840, --0.158528373889965800, -0.158577741412885390, -0.158627108539360600, -0.158676475269268060, -0.158725841602484760, -0.158775207538886440, -0.158824573078350070, -0.158873938220752270, --0.158923302965970070, -0.158972667313879180, -0.159022031264356630, -0.159071394817279000, -0.159120757972523310, -0.159170120729965280, -0.159219483089481970, -0.159268845050949930, --0.159318206614246230, -0.159367567779246570, -0.159416928545827980, -0.159466288913867080, -0.159515648883240910, -0.159565008453825150, -0.159614367625496880, -0.159663726398133140, --0.159713084771609640, -0.159762442745803420, -0.159811800320591110, -0.159861157495849730, -0.159910514271455030, -0.159959870647284040, -0.160009226623213350, -0.160058582199120060, --0.160107937374879860, -0.160157292150369810, -0.160206646525466540, -0.160256000500047100, -0.160305354073987190, -0.160354707247163940, -0.160404060019454310, -0.160453412390734130, --0.160502764360880400, -0.160552115929769780, -0.160601467097278850, -0.160650817863284700, -0.160700168227663060, -0.160749518190291010, -0.160798867751045600, -0.160848216909802580, --0.160897565666439010, -0.160946914020831560, -0.160996261972857210, -0.161045609522391800, -0.161094956669312370, -0.161144303413495530, -0.161193649754818370, -0.161242995693156670, --0.161292341228387450, -0.161341686360387400, -0.161391031089033580, -0.161440375414201730, -0.161489719335768940, -0.161539062853612280, -0.161588405967607540, -0.161637748677631780, --0.161687090983561650, -0.161736432885274230, -0.161785774382645300, -0.161835115475551930, -0.161884456163870760, -0.161933796447478880, -0.161983136326252110, -0.162032475800067470, --0.162081814868801630, -0.162131153532331710, -0.162180491790533450, -0.162229829643284000, -0.162279167090459950, -0.162328504131938420, -0.162377840767595180, -0.162427176997307350, --0.162476512820951570, -0.162525848238404960, -0.162575183249543290, -0.162624517854243640, -0.162673852052383160, -0.162723185843837600, -0.162772519228484100, -0.162821852206199270, --0.162871184776860270, -0.162920516940342850, -0.162969848696524140, -0.163019180045280820, -0.163068510986489970, -0.163117841520027420, -0.163167171645770270, -0.163216501363595200, --0.163265830673379300, -0.163315159574998370, -0.163364488068329570, -0.163413816153249960, -0.163463143829635390, -0.163512471097362940, -0.163561797956309350, -0.163611124406351230, --0.163660450447365740, -0.163709776079228710, -0.163759101301817230, -0.163808426115008430, -0.163857750518678120, -0.163907074512703450, -0.163956398096961080, -0.164005721271328150, --0.164055044035680500, -0.164104366389895230, -0.164153688333849020, -0.164203009867419060, -0.164252330990481120, -0.164301651702912360, -0.164350972004589480, -0.164400291895389600, --0.164449611375188540, -0.164498930443863460, -0.164548249101291480, -0.164597567347348460, -0.164646885181911510, -0.164696202604857370, -0.164745519616063120, -0.164794836215404670, --0.164844152402759130, -0.164893468178003180, -0.164942783541014020, -0.164992098491667460, -0.165041413029840630, -0.165090727155410290, -0.165140040868253570, -0.165189354168246320, --0.165238667055265660, -0.165287979529188330, -0.165337291589891520, -0.165386603237251020, -0.165435914471144030, -0.165485225291447240, -0.165534535698037830, -0.165583845690791630, --0.165633155269585830, -0.165682464434297570, -0.165731773184802730, -0.165781081520978420, -0.165830389442701450, -0.165879696949848910, -0.165929004042296710, -0.165978310719922000, --0.166027616982601520, -0.166076922830212410, -0.166126228262630570, -0.166175533279733170, -0.166224837881396910, -0.166274142067499020, -0.166323445837915310, -0.166372749192523010, --0.166422052131199260, -0.166471354653819960, -0.166520656760262260, -0.166569958450402900, -0.166619259724119120, -0.166668560581286730, -0.166717861021782930, -0.166767161045484500, --0.166816460652268600, -0.166865759842011100, -0.166915058614589190, -0.166964356969879660, -0.167013654907759660, -0.167062952428105090, -0.167112249530793150, -0.167161546215700560, --0.167210842482704570, -0.167260138331681020, -0.167309433762507120, -0.167358728775059670, -0.167408023369215790, -0.167457317544851440, -0.167506611301843800, -0.167555904640070060, --0.167605197559406120, -0.167654490059729180, -0.167703782140916020, -0.167753073802843850, -0.167802365045388540, -0.167851655868427350, -0.167900946271836990, -0.167950236255494710, --0.167999525819276410, -0.168048814963059290, -0.168098103686720120, -0.168147391990136150, -0.168196679873183240, -0.168245967335738660, -0.168295254377679140, -0.168344540998881910, --0.168393827199222910, -0.168443112978579330, -0.168492398336828000, -0.168541683273846080, -0.168590967789509520, -0.168640251883695550, -0.168689535556281380, -0.168738818807142920, --0.168788101636157430, -0.168837384043201700, -0.168886666028152920, -0.168935947590887060, -0.168985228731281300, -0.169034509449212500, -0.169083789744557840, -0.169133069617193290, --0.169182349066996060, -0.169231628093842960, -0.169280906697611230, -0.169330184878176780, -0.169379462635416870, -0.169428739969208740, -0.169478016879428340, -0.169527293365952870, --0.169576569428659200, -0.169625845067424510, -0.169675120282124810, -0.169724395072637290, -0.169773669438838760, -0.169822943380606520, -0.169872216897816480, -0.169921489990345900, --0.169970762658071570, -0.170020034900870810, -0.170069306718619500, -0.170118578111194930, -0.170167849078473900, -0.170217119620333700, -0.170266389736650260, -0.170315659427300870, --0.170364928692162300, -0.170414197531111870, -0.170463465944025480, -0.170512733930780450, -0.170562001491254000, -0.170611268625322140, -0.170660535332862070, -0.170709801613750680, --0.170759067467865230, -0.170808332895081680, -0.170857597895277270, -0.170906862468328900, -0.170956126614113770, -0.171005390332507920, -0.171054653623388590, -0.171103916486632620, --0.171153178922117290, -0.171202440929718590, -0.171251702509313790, -0.171300963660779710, -0.171350224383993670, -0.171399484678831650, -0.171448744545170890, -0.171498003982888280, --0.171547262991861100, -0.171596521571965310, -0.171645779723078230, -0.171695037445077160, -0.171744294737838030, -0.171793551601238160, -0.171842808035154420, -0.171892064039464110, --0.171941319614043190, -0.171990574758768970, -0.172039829473518310, -0.172089083758168530, -0.172138337612595590, -0.172187591036676800, -0.172236844030289050, -0.172286096593309620, --0.172335348725614510, -0.172384600427081040, -0.172433851697586490, -0.172483102537006850, -0.172532352945219490, -0.172581602922101260, -0.172630852467529430, -0.172680101581380030, --0.172729350263530400, -0.172778598513857380, -0.172827846332238300, -0.172877093718549170, -0.172926340672667290, -0.172975587194469590, -0.173024833283833330, -0.173074078940634590, --0.173123324164750620, -0.173172568956058340, -0.173221813314435090, -0.173271057239756860, -0.173320300731900970, -0.173369543790744350, -0.173418786416164320, -0.173468028608036840, --0.173517270366239320, -0.173566511690649070, -0.173615752581142090, -0.173664993037595750, -0.173714233059886900, -0.173763472647892910, -0.173812711801489800, -0.173861950520554920, --0.173911188804965170, -0.173960426654597880, -0.174009664069329080, -0.174058901049036100, -0.174108137593595890, -0.174157373702885780, -0.174206609376781780, -0.174255844615161280, --0.174305079417901160, -0.174354313784878760, -0.174403547715970160, -0.174452781211052680, -0.174502014270003250, -0.174551246892699240, -0.174600479079016660, -0.174649710828832880, --0.174698942142025250, -0.174748173018469840, -0.174797403458043980, -0.174846633460624650, -0.174895863026089140, -0.174945092154313560, -0.174994320845175220, -0.175043549098551100, --0.175092776914318540, -0.175142004292353600, -0.175191231232533630, -0.175240457734735620, -0.175289683798836890, -0.175338909424713500, -0.175388134612242840, -0.175437359361302280, --0.175486583671767890, -0.175535807543517050, -0.175585030976426660, -0.175634253970374160, -0.175683476525235580, -0.175732698640888310, -0.175781920317209290, -0.175831141554075920, --0.175880362351364230, -0.175929582708951650, -0.175978802626715110, -0.176028022104532000, -0.176077241142278410, -0.176126459739831710, -0.176175677897068870, -0.176224895613867260, --0.176274112890102970, -0.176323329725653400, -0.176372546120395520, -0.176421762074206710, -0.176470977586963030, -0.176520192658541940, -0.176569407288820780, -0.176618621477675680, --0.176667835224984030, -0.176717048530622780, -0.176766261394469350, -0.176815473816399840, -0.176864685796291640, -0.176913897334021710, -0.176963108429467500, -0.177012319082505060, --0.177061529293011830, -0.177110739060864770, -0.177159948385941320, -0.177209157268117530, -0.177258365707270880, -0.177307573703278740, -0.177356781256017230, -0.177405988365363750, --0.177455195031195310, -0.177504401253388870, -0.177553607031821880, -0.177602812366370460, -0.177652017256911960, -0.177701221703323890, -0.177750425705482330, -0.177799629263264670, --0.177848832376547970, -0.177898035045209620, -0.177947237269125730, -0.177996439048173780, -0.178045640382230700, -0.178094841271173950, -0.178144041714879690, -0.178193241713225310, --0.178242441266087820, -0.178291640373344690, -0.178340839034872000, -0.178390037250547220, -0.178439235020247780, -0.178488432343849810, -0.178537629221230760, -0.178586825652267630, --0.178636021636837890, -0.178685217174817670, -0.178734412266084390, -0.178783606910515090, -0.178832801107987190, -0.178881994858376860, -0.178931188161561530, -0.178980381017418260, --0.179029573425824460, -0.179078765386656290, -0.179127956899791190, -0.179177147965106230, -0.179226338582478800, -0.179275528751785120, -0.179324718472902600, -0.179373907745708300, --0.179423096570079650, -0.179472284945892820, -0.179521472873025280, -0.179570660351354520, -0.179619847380756650, -0.179669033961109170, -0.179718220092289080, -0.179767405774173910, --0.179816591006639770, -0.179865775789564140, -0.179914960122824100, -0.179964144006297090, -0.180013327439859290, -0.180062510423388140, -0.180111692956760740, -0.180160875039854530, --0.180210056672545720, -0.180259237854711730, -0.180308418586230120, -0.180357598866977000, -0.180406778696829890, -0.180455958075665860, -0.180505137003362350, -0.180554315479795560, --0.180603493504842980, -0.180652671078381650, -0.180701848200289120, -0.180751024870441510, -0.180800201088716330, -0.180849376854990640, -0.180898552169141970, -0.180947727031046470, --0.180996901440581640, -0.181046075397624600, -0.181095248902052780, -0.181144421953742390, -0.181193594552570950, -0.181242766698415550, -0.181291938391153620, -0.181341109630661440, --0.181390280416816490, -0.181439450749496270, -0.181488620628576990, -0.181537790053936170, -0.181586959025450860, -0.181636127542998570, -0.181685295606455550, -0.181734463215699280, --0.181783630370606850, -0.181832797071055790, -0.181881963316922300, -0.181931129108083900, -0.181980294444417680, -0.182029459325801170, -0.182078623752110540, -0.182127787723223380, --0.182176951239016750, -0.182226114299368160, -0.182275276904153880, -0.182324439053251380, -0.182373600746537800, -0.182422761983890620, -0.182471922765186150, -0.182521083090301850, --0.182570242959115250, -0.182619402371502650, -0.182668561327341520, -0.182717719826509000, -0.182766877868882600, -0.182816035454338580, -0.182865192582754470, -0.182914349254007370, --0.182963505467974850, -0.183012661224533140, -0.183061816523559740, -0.183110971364931820, -0.183160125748526910, -0.183209279674221260, -0.183258433141892390, -0.183307586151417870, --0.183356738702673970, -0.183405890795538210, -0.183455042429887720, -0.183504193605600080, -0.183553344322551490, -0.183602494580619560, -0.183651644379681400, -0.183700793719614540, --0.183749942600295290, -0.183799091021601160, -0.183848238983409300, -0.183897386485597310, -0.183946533528041380, -0.183995680110619150, -0.184044826233207700, -0.184093971895684600, --0.184143117097926160, -0.184192261839809940, -0.184241406121213040, -0.184290549942013080, -0.184339693302086300, -0.184388836201310270, -0.184437978639562600, -0.184487120616719570, --0.184536262132658700, -0.184585403187257190, -0.184634543780392620, -0.184683683911941260, -0.184732823581780670, -0.184781962789788030, -0.184831101535840920, -0.184880239819815610, --0.184929377641589700, -0.184978515001040340, -0.185027651898045150, -0.185076788332480400, -0.185125924304223670, -0.185175059813152100, -0.185224194859143350, -0.185273329442073670, --0.185322463561820670, -0.185371597218261520, -0.185420730411273800, -0.185469863140733800, -0.185518995406519170, -0.185568127208507460, -0.185617258546575010, -0.185666389420599430, --0.185715519830457860, -0.185764649776027940, -0.185813779257185950, -0.185862908273809500, -0.185912036825775780, -0.185961164912962440, -0.186010292535245730, -0.186059419692503280, --0.186108546384612270, -0.186157672611450360, -0.186206798372893810, -0.186255923668820270, -0.186305048499107370, -0.186354172863631400, -0.186403296762269990, -0.186452420194900350, --0.186501543161400110, -0.186550665661645550, -0.186599787695514360, -0.186648909262883660, -0.186698030363631140, -0.186747150997633120, -0.186796271164767210, -0.186845390864910620, --0.186894510097941000, -0.186943628863734670, -0.186992747162169240, -0.187041864993121980, -0.187090982356470450, -0.187140099252091070, -0.187189215679861410, -0.187238331639658750, --0.187287447131360670, -0.187336562154843540, -0.187385676709984990, -0.187434790796662700, -0.187483904414752990, -0.187533017564133540, -0.187582130244681510, -0.187631242456274630, --0.187680354198789170, -0.187729465472102870, -0.187778576276092870, -0.187827686610636870, -0.187876796475611230, -0.187925905870893580, -0.187975014796361200, -0.188024123251891690, --0.188073231237361440, -0.188122338752648110, -0.188171445797628960, -0.188220552372181600, -0.188269658476182430, -0.188318764109509120, -0.188367869272038880, -0.188416973963649430, --0.188466078184217100, -0.188515181933619570, -0.188564285211734520, -0.188613388018438330, -0.188662490353608660, -0.188711592217122780, -0.188760693608858330, -0.188809794528691730, --0.188858894976500660, -0.188907994952162320, -0.188957094455554450, -0.189006193486553400, -0.189055292045036850, -0.189104390130882090, -0.189153487743966790, -0.189202584884167330, --0.189251681551361410, -0.189300777745426720, -0.189349873466239630, -0.189398968713677900, -0.189448063487618720, -0.189497157787939820, -0.189546251614517600, -0.189595344967229740, --0.189644437845953530, -0.189693530250566650, -0.189742622180945510, -0.189791713636967810, -0.189840804618510830, -0.189889895125452260, -0.189938985157668550, -0.189988074715037340, --0.190037163797435990, -0.190086252404742110, -0.190135340536832200, -0.190184428193583940, -0.190233515374874600, -0.190282602080581900, -0.190331688310582280, -0.190380774064753430, --0.190429859342973070, -0.190478944145117620, -0.190528028471064840, -0.190577112320691970, -0.190626195693876760, -0.190675278590495630, -0.190724361010426280, -0.190773442953546060, --0.190822524419732630, -0.190871605408862500, -0.190920685920813320, -0.190969765955462440, -0.191018845512687580, -0.191067924592365160, -0.191117003194372940, -0.191166081318588640, --0.191215158964888720, -0.191264236133150880, -0.191313312823252450, -0.191362389035070750, -0.191411464768483530, -0.191460540023367180, -0.191509614799599490, -0.191558689097058200, --0.191607762915619760, -0.191656836255161890, -0.191705909115561960, -0.191754981496697670, -0.191804053398445500, -0.191853124820683200, -0.191902195763288070, -0.191951266226137920, --0.192000336209109140, -0.192049405712079540, -0.192098474734926420, -0.192147543277527530, -0.192196611339759350, -0.192245678921499660, -0.192294746022626200, -0.192343812643015450, --0.192392878782545160, -0.192441944441092670, -0.192491009618535740, -0.192540074314750870, -0.192589138529615820, -0.192638202263007900, -0.192687265514804920, -0.192736328284883350, --0.192785390573120940, -0.192834452379395090, -0.192883513703583500, -0.192932574545562730, -0.192981634905210500, -0.193030694782404200, -0.193079754177021580, -0.193128813088939140, --0.193177871518034670, -0.193226929464185540, -0.193275986927269490, -0.193325043907163070, -0.193374100403744030, -0.193423156416890170, -0.193472211946477980, -0.193521266992385250, --0.193570321554489390, -0.193619375632668120, -0.193668429226798000, -0.193717482336756790, -0.193766534962421880, -0.193815587103671080, -0.193864638760380880, -0.193913689932429080, --0.193962740619693040, -0.194011790822050580, -0.194060840539378220, -0.194109889771553770, -0.194158938518455000, -0.194207986779958490, -0.194257034555941980, -0.194306081846282900, --0.194355128650858610, -0.194404174969546930, -0.194453220802224380, -0.194502266148768780, -0.194551311009057950, -0.194600355382968410, -0.194649399270377970, -0.194698442671164040, --0.194747485585204440, -0.194796528012375710, -0.194845569952555640, -0.194894611405621640, -0.194943652371451560, -0.194992692849921910, -0.195041732840910500, -0.195090772344294780, --0.195139811359952590, -0.195188849887760390, -0.195237887927596110, -0.195286925479337510, -0.195335962542861170, -0.195384999118044940, -0.195434035204766210, -0.195483070802902810, --0.195532105912331310, -0.195581140532929550, -0.195630174664574910, -0.195679208307145300, -0.195728241460517230, -0.195777274124568550, -0.195826306299176660, -0.195875337984219470, --0.195924369179573510, -0.195973399885116610, -0.196022430100726200, -0.196071459826280160, -0.196120489061655050, -0.196169517806728700, -0.196218546061378560, -0.196267573825482490, --0.196316601098917050, -0.196365627881560120, -0.196414654173289540, -0.196463679973981900, -0.196512705283515030, -0.196561730101766420, -0.196610754428613920, -0.196659778263934100, --0.196708801607604840, -0.196757824459503570, -0.196806846819508160, -0.196855868687495220, -0.196904890063342610, -0.196953910946927770, -0.197002931338128570, -0.197051951236821620, --0.197100970642884790, -0.197149989556195980, -0.197199007976631730, -0.197248025904070010, -0.197297043338388180, -0.197346060279464190, -0.197395076727174630, -0.197444092681397340, --0.197493108142009850, -0.197542123108890020, -0.197591137581914460, -0.197640151560961040, -0.197689165045907250, -0.197738178036630960, -0.197787190533008810, -0.197836202534918680, --0.197885214042238050, -0.197934225054844810, -0.197983235572615570, -0.198032245595428260, -0.198081255123160330, -0.198130264155689680, -0.198179272692892950, -0.198228280734648040, --0.198277288280832850, -0.198326295331324010, -0.198375301885999440, -0.198424307944736590, -0.198473313507413430, -0.198522318573906560, -0.198571323144093870, -0.198620327217852890, --0.198669330795061520, -0.198718333875596370, -0.198767336459335420, -0.198816338546156100, -0.198865340135936370, -0.198914341228552870, -0.198963341823883500, -0.199012341921805810, --0.199061341522197680, -0.199110340624935740, -0.199159339229897980, -0.199208337336961860, -0.199257334946005310, -0.199306332056905010, -0.199355328669538890, -0.199404324783784860, --0.199453320399519600, -0.199502315516621040, -0.199551310134966690, -0.199600304254434480, -0.199649297874901100, -0.199698290996244480, -0.199747283618342100, -0.199796275741071980, --0.199845267364310710, -0.199894258487936290, -0.199943249111826200, -0.199992239235858430, -0.200041228859909660, -0.200090217983857790, -0.200139206607580810, -0.200188194730955370, --0.200237182353859460, -0.200286169476170590, -0.200335156097766730, -0.200384142218524550, -0.200433127838322010, -0.200482112957036630, -0.200531097574546430, -0.200580081690728050, --0.200629065305459460, -0.200678048418618190, -0.200727031030082270, -0.200776013139728320, -0.200824994747434320, -0.200873975853077870, -0.200922956456536880, -0.200971936557688080, --0.201020916156409430, -0.201069895252578510, -0.201118873846073270, -0.201167851936770420, -0.201216829524547920, -0.201265806609283810, -0.201314783190854720, -0.201363759269138690, --0.201412734844013260, -0.201461709915356420, -0.201510684483044880, -0.201559658546956620, -0.201608632106969220, -0.201657605162960690, -0.201706577714807680, -0.201755549762388240, --0.201804521305579940, -0.201853492344260750, -0.201902462878307400, -0.201951432907597900, -0.202000402432009810, -0.202049371451421160, -0.202098339965708640, -0.202147307974750280, --0.202196275478423640, -0.202245242476606750, -0.202294208969176300, -0.202343174956010340, -0.202392140436986890, -0.202441105411982650, -0.202490069880875640, -0.202539033843543460, --0.202587997299864130, -0.202636960249714370, -0.202685922692972200, -0.202734884629515220, -0.202783846059221480, -0.202832806981967710, -0.202881767397631890, -0.202930727306091660, --0.202979686707225050, -0.203028645600908770, -0.203077603987020900, -0.203126561865439450, -0.203175519236041160, -0.203224476098704060, -0.203273432453305790, -0.203322388299724350, --0.203371343637836520, -0.203420298467520330, -0.203469252788653380, -0.203518206601113750, -0.203567159904778170, -0.203616112699524680, -0.203665064985230900, -0.203714016761774920, --0.203762968029033460, -0.203811918786884570, -0.203860869035205870, -0.203909818773875460, -0.203958768002770050, -0.204007716721767710, -0.204056664930746090, -0.204105612629583240, --0.204154559818155920, -0.204203506496342220, -0.204252452664020170, -0.204301398321066560, -0.204350343467359450, -0.204399288102776490, -0.204448232227195740, -0.204497175840493980, --0.204546118942549260, -0.204595061533239280, -0.204644003612442060, -0.204692945180034390, -0.204741886235894370, -0.204790826779899630, -0.204839766811928250, -0.204888706331857020, --0.204937645339564020, -0.204986583834927350, -0.205035521817823780, -0.205084459288131400, -0.205133396245727910, -0.205182332690490880, -0.205231268622298480, -0.205280204041027480, --0.205329138946555970, -0.205378073338762010, -0.205427007217522470, -0.205475940582715400, -0.205524873434218490, -0.205573805771909810, -0.205622737595666180, -0.205671668905365730, --0.205720599700886100, -0.205769529982105400, -0.205818459748900450, -0.205867389001149340, -0.205916317738729760, -0.205965245961519800, -0.206014173669396310, -0.206063100862237390, --0.206112027539921170, -0.206160953702324400, -0.206209879349325280, -0.206258804480801440, -0.206307729096631060, -0.206356653196690890, -0.206405576780859110, -0.206454499849013370, --0.206503422401031810, -0.206552344436791270, -0.206601265956169870, -0.206650186959045300, -0.206699107445295710, -0.206748027414797920, -0.206796946867430030, -0.206845865803069790, --0.206894784221595320, -0.206943702122883460, -0.206992619506812360, -0.207041536373259670, -0.207090452722103610, -0.207139368553220990, -0.207188283866489910, -0.207237198661788580, --0.207286112938993820, -0.207335026697983760, -0.207383939938636160, -0.207432852660829110, -0.207481764864439530, -0.207530676549345510, -0.207579587715424810, -0.207628498362555590, --0.207677408490614670, -0.207726318099480220, -0.207775227189029990, -0.207824135759142130, -0.207873043809693490, -0.207921951340562240, -0.207970858351626570, -0.208019764842763300, --0.208068670813850610, -0.208117576264766240, -0.208166481195387940, -0.208215385605593880, -0.208264289495260910, -0.208313192864267220, -0.208362095712490980, -0.208410998039809060, --0.208459899846099670, -0.208508801131240510, -0.208557701895109780, -0.208606602137584360, -0.208655501858542450, -0.208704401057861750, -0.208753299735420530, -0.208802197891095610, --0.208851095524765190, -0.208899992636307010, -0.208948889225599320, -0.208997785292518940, -0.209046680836944110, -0.209095575858753020, -0.209144470357822550, -0.209193364334030910, --0.209242257787255860, -0.209291150717375580, -0.209340043124267020, -0.209388935007808340, -0.209437826367877310, -0.209486717204352160, -0.209535607517109780, -0.209584497306028380, --0.209633386570985740, -0.209682275311860070, -0.209731163528528270, -0.209780051220868570, -0.209828938388758740, -0.209877825032077000, -0.209926711150700250, -0.209975596744506720, --0.210024481813374210, -0.210073366357180940, -0.210122250375803820, -0.210171133869121060, -0.210220016837010890, -0.210268899279350270, -0.210317781196017380, -0.210366662586890050, --0.210415543451846490, -0.210464423790763630, -0.210513303603519750, -0.210562182889992570, -0.210611061650060380, -0.210659939883600100, -0.210708817590489980, -0.210757694770607800, --0.210806571423831830, -0.210855447550038990, -0.210904323149107540, -0.210953198220915710, -0.211002072765340440, -0.211050946782260000, -0.211099820271552190, -0.211148693233095260, --0.211197565666766170, -0.211246437572443190, -0.211295308950004090, -0.211344179799327150, -0.211393050120289330, -0.211441919912768870, -0.211490789176643630, -0.211539657911791860, --0.211588526118090480, -0.211637393795417790, -0.211686260943651640, -0.211735127562670270, -0.211783993652350620, -0.211832859212571000, -0.211881724243209250, -0.211930588744143610, --0.211979452715251070, -0.212028316156409880, -0.212077179067498340, -0.212126041448393420, -0.212174903298973400, -0.212223764619116130, -0.212272625408699870, -0.212321485667601620, --0.212370345395699660, -0.212419204592871810, -0.212468063258996390, -0.212516921393950400, -0.212565778997612090, -0.212614636069859340, -0.212663492610570440, -0.212712348619622380, --0.212761204096893420, -0.212810059042261470, -0.212858913455604790, -0.212907767336800420, -0.212956620685726600, -0.213005473502261260, -0.213054325786282640, -0.213103177537667800, --0.213152028756294990, -0.213200879442042580, -0.213249729594787500, -0.213298579214408120, -0.213347428300782270, -0.213396276853788290, -0.213445124873303190, -0.213493972359205280, --0.213542819311372420, -0.213591665729682970, -0.213640511614013930, -0.213689356964243570, -0.213738201780249850, -0.213787046061911040, -0.213835889809104200, -0.213884733021707630, --0.213933575699599670, -0.213982417842657310, -0.214031259450758930, -0.214080100523782400, -0.214128941061606040, -0.214177781064106900, -0.214226620531163310, -0.214275459462653170, --0.214324297858454800, -0.214373135718445270, -0.214421973042502880, -0.214470809830505590, -0.214519646082331680, -0.214568481797858230, -0.214617316976963600, -0.214666151619525620, --0.214714985725422750, -0.214763819294531950, -0.214812652326731630, -0.214861484821899650, -0.214910316779914400, -0.214959148200652930, -0.215007979083993610, -0.215056809429814750, --0.215105639237993420, -0.215154468508408030, -0.215203297240936430, -0.215252125435457050, -0.215300953091846910, -0.215349780209984380, -0.215398606789747430, -0.215447432831014360, --0.215496258333662290, -0.215545083297569580, -0.215593907722614160, -0.215642731608674390, -0.215691554955627360, -0.215740377763351480, -0.215789200031724610, -0.215838021760625190, --0.215886842949930300, -0.215935663599518270, -0.215984483709267090, -0.216033303279055150, -0.216082122308759510, -0.216130940798258560, -0.216179758747430700, -0.216228576156153010, --0.216277393024303880, -0.216326209351761250, -0.216375025138403540, -0.216423840384107840, -0.216472655088752520, -0.216521469252215580, -0.216570282874375410, -0.216619095955109090, --0.216667908494295010, -0.216716720491811180, -0.216765531947535980, -0.216814342861346520, -0.216863153233121190, -0.216911963062738440, -0.216960772350075330, -0.217009581095010280, --0.217058389297421270, -0.217107196957186750, -0.217156004074183780, -0.217204810648290810, -0.217253616679385810, -0.217302422167347210, -0.217351227112052130, -0.217400031513378940, --0.217448835371205710, -0.217497638685410830, -0.217546441455871400, -0.217595243682465860, -0.217644045365072230, -0.217692846503568900, -0.217741647097833060, -0.217790447147743070, --0.217839246653176940, -0.217888045614013180, -0.217936844030128830, -0.217985641901402400, -0.218034439227712290, -0.218083236008935640, -0.218132032244950900, -0.218180827935636090, --0.218229623080869630, -0.218278417680528690, -0.218327211734491710, -0.218376005242636670, -0.218424798204842090, -0.218473590620985060, -0.218522382490944050, -0.218571173814597090, --0.218619964591822650, -0.218668754822497840, -0.218717544506501160, -0.218766333643711040, -0.218815122234004650, -0.218863910277260460, -0.218912697773356480, -0.218961484722170780, --0.219010271123581790, -0.219059056977466690, -0.219107842283703950, -0.219156627042172040, -0.219205411252748120, -0.219254194915310670, -0.219302978029737750, -0.219351760595907800, --0.219400542613698010, -0.219449324082986900, -0.219498105003652440, -0.219546885375573180, -0.219595665198626250, -0.219644444472690160, -0.219693223197642980, -0.219742001373363170, --0.219790778999727900, -0.219839556076615710, -0.219888332603905030, -0.219937108581473110, -0.219985884009198410, -0.220034658886959030, -0.220083433214633390, -0.220132206992098760, --0.220180980219233600, -0.220229752895916010, -0.220278525022024470, -0.220327296597436160, -0.220376067622029630, -0.220424838095682920, -0.220473608018274540, -0.220522377389681720, --0.220571146209782960, -0.220619914478456330, -0.220668682195580330, -0.220717449361032210, -0.220766215974690480, -0.220814982036433180, -0.220863747546138880, -0.220912512503684770, --0.220961276908949370, -0.221010040761811240, -0.221058804062147530, -0.221107566809836840, -0.221156329004757230, -0.221205090646787230, -0.221253851735804090, -0.221302612271686290, --0.221351372254311980, -0.221400131683559650, -0.221448890559306580, -0.221497648881431250, -0.221546406649811840, -0.221595163864326820, -0.221643920524853460, -0.221692676631270320, --0.221741432183455910, -0.221790187181287480, -0.221838941624643570, -0.221887695513402320, -0.221936448847441850, -0.221985201626640680, -0.222033953850876040, -0.222082705520026540, --0.222131456633970710, -0.222180207192585830, -0.222228957195750390, -0.222277706643342590, -0.222326455535240940, -0.222375203871322730, -0.222423951651466500, -0.222472698875550380, --0.222521445543452960, -0.222570191655051490, -0.222618937210224550, -0.222667682208850250, -0.222716426650807180, -0.222765170535972640, -0.222813913864225140, -0.222862656635443300, --0.222911398849504390, -0.222960140506286990, -0.223008881605669200, -0.223057622147529670, -0.223106362131745640, -0.223155101558195730, -0.223203840426758030, -0.223252578737311190, --0.223301316489732480, -0.223350053683900460, -0.223398790319693290, -0.223447526396989590, -0.223496261915666660, -0.223544996875603060, -0.223593731276676950, -0.223642465118766980, --0.223691198401750390, -0.223739931125505800, -0.223788663289911400, -0.223837394894845780, -0.223886125940186230, -0.223934856425811350, -0.223983586351599790, -0.224032315717428790, --0.224081044523177040, -0.224129772768722670, -0.224178500453944300, -0.224227227578719240, -0.224275954142926110, -0.224324680146443110, -0.224373405589148840, -0.224422130470920610, --0.224470854791637060, -0.224519578551176350, -0.224568301749417170, -0.224617024386236760, -0.224665746461513830, -0.224714467975126950, -0.224763188926953460, -0.224811909316872010, --0.224860629144760770, -0.224909348410498390, -0.224958067113962240, -0.225006785255030900, -0.225055502833582580, -0.225104219849495970, -0.225152936302648350, -0.225201652192918410, --0.225250367520184320, -0.225299082284324740, -0.225347796485217050, -0.225396510122739840, -0.225445223196771380, -0.225493935707190260, -0.225542647653873910, -0.225591359036700910, --0.225640069855549520, -0.225688780110298390, -0.225737489800824890, -0.225786198927007660, -0.225834907488725340, -0.225883615485855340, -0.225932322918276310, -0.225981029785866460, --0.226029736088504490, -0.226078441826067710, -0.226127146998434860, -0.226175851605484120, -0.226224555647094180, -0.226273259123142450, -0.226321962033507550, -0.226370664378067740, --0.226419366156701720, -0.226468067369286820, -0.226516768015701780, -0.226565468095824810, -0.226614167609534590, -0.226662866556708560, -0.226711564937225330, -0.226760262750963200, --0.226808959997800820, -0.226857656677615650, -0.226906352790286310, -0.226955048335691520, -0.227003743313708680, -0.227052437724216490, -0.227101131567093190, -0.227149824842217520, --0.227198517549466850, -0.227247209688719860, -0.227295901259854880, -0.227344592262750560, -0.227393282697284320, -0.227441972563334870, -0.227490661860780510, -0.227539350589499920, --0.227588038749370530, -0.227636726340271020, -0.227685413362080150, -0.227734099814675290, -0.227782785697935200, -0.227831471011738150, -0.227880155755962850, -0.227928839930486710, --0.227977523535188490, -0.228026206569946460, -0.228074889034639350, -0.228123570929144560, -0.228172252253340870, -0.228220933007106550, -0.228269613190320330, -0.228318292802859620, --0.228366971844603190, -0.228415650315429320, -0.228464328215216780, -0.228513005543842990, -0.228561682301186670, -0.228610358487126130, -0.228659034101540150, -0.228707709144306160, --0.228756383615302870, -0.228805057514409080, -0.228853730841502210, -0.228902403596461000, -0.228951075779163770, -0.228999747389489310, -0.229048418427315020, -0.229097088892519700, --0.229145758784981670, -0.229194428104579660, -0.229243096851191150, -0.229291765024694890, -0.229340432624969250, -0.229389099651892940, -0.229437766105343440, -0.229486431985199520, --0.229535097291339560, -0.229583762023642250, -0.229632426181985120, -0.229681089766246900, -0.229729752776305970, -0.229778415212041120, -0.229827077073329780, -0.229875738360050740, --0.229924399072082790, -0.229973059209303390, -0.230021718771591360, -0.230070377758825050, -0.230119036170883200, -0.230167694007643340, -0.230216351268984270, -0.230265007954784270, --0.230313664064922210, -0.230362319599275560, -0.230410974557723110, -0.230459628940143210, -0.230508282746414690, -0.230556935976415020, -0.230605588630023030, -0.230654240707117490, --0.230702892207575890, -0.230751543131277080, -0.230800193478099410, -0.230848843247921710, -0.230897492440621440, -0.230946141056077440, -0.230994789094168100, -0.231043436554772220, --0.231092083437767330, -0.231140729743032210, -0.231189375470445270, -0.231238020619885330, -0.231286665191229900, -0.231335309184357800, -0.231383952599147430, -0.231432595435477620, --0.231481237693225870, -0.231529879372271040, -0.231578520472491530, -0.231627160993766120, -0.231675800935972400, -0.231724440298989170, -0.231773079082695260, -0.231821717286968240, --0.231870354911686890, -0.231918991956729690, -0.231967628421975440, -0.232016264307301680, -0.232064899612587250, -0.232113534337710590, -0.232162168482550500, -0.232210802046984580, --0.232259435030891640, -0.232308067434150110, -0.232356699256638850, -0.232405330498235420, -0.232453961158818670, -0.232502591238267000, -0.232551220736459290, -0.232599849653273070, --0.232648477988587260, -0.232697105742280250, -0.232745732914230900, -0.232794359504316790, -0.232842985512416780, -0.232891610938409740, -0.232940235782173240, -0.232988860043586150, --0.233037483722526920, -0.233086106818874400, -0.233134729332506170, -0.233183351263301140, -0.233231972611137710, -0.233280593375894800, -0.233329213557449950, -0.233377833155682110, --0.233426452170469640, -0.233475070601691510, -0.233523688449225250, -0.233572305712949760, -0.233620922392743960, -0.233669538488485430, -0.233718154000053020, -0.233766768927325260, --0.233815383270180980, -0.233863997028497830, -0.233912610202154670, -0.233961222791029990, -0.234009834795002700, -0.234058446213950390, -0.234107057047751950, -0.234155667296285870, --0.234204276959431050, -0.234252886037065120, -0.234301494529066960, -0.234350102435315070, -0.234398709755688360, -0.234447316490064450, -0.234495922638322220, -0.234544528200340220, --0.234593133175997310, -0.234641737565171150, -0.234690341367740610, -0.234738944583584690, -0.234787547212580970, -0.234836149254608360, -0.234884750709545400, -0.234933351577270990, --0.234981951857662770, -0.235030551550599650, -0.235079150655960160, -0.235127749173623250, -0.235176347103466520, -0.235224944445368900, -0.235273541199208960, -0.235322137364865570, --0.235370732942216420, -0.235419327931140430, -0.235467922331516530, -0.235516516143222420, -0.235565109366137030, -0.235613702000138840, -0.235662294045106410, -0.235710885500918680, --0.235759476367453290, -0.235808066644589230, -0.235856656332205400, -0.235905245430179540, -0.235953833938390530, -0.236002421856716970, -0.236051009185037770, -0.236099595923230600, --0.236148182071174470, -0.236196767628747860, -0.236245352595829770, -0.236293936972297860, -0.236342520758031140, -0.236391103952908080, -0.236439686556807720, -0.236488268569607700, --0.236536849991187010, -0.236585430821424610, -0.236634011060198210, -0.236682590707386810, -0.236731169762868900, -0.236779748226523510, -0.236828326098228320, -0.236876903377862320, --0.236925480065304060, -0.236974056160432520, -0.237022631663125400, -0.237071206573261720, -0.237119780890720030, -0.237168354615379300, -0.237216927747117250, -0.237265500285812890, --0.237314072231344790, -0.237362643583591940, -0.237411214342432040, -0.237459784507744100, -0.237508354079406710, -0.237556923057298860, -0.237605491441298280, -0.237654059231283940, --0.237702626427134910, -0.237751193028728880, -0.237799759035944860, -0.237848324448661470, -0.237896889266757670, -0.237945453490111230, -0.237994017118601160, -0.238042580152106030, --0.238091142590504870, -0.238139704433675460, -0.238188265681496760, -0.238236826333847410, -0.238285386390606420, -0.238333945851651550, -0.238382504716861790, -0.238431062986116220, --0.238479620659292540, -0.238528177736269830, -0.238576734216926660, -0.238625290101142080, -0.238673845388793880, -0.238722400079761030, -0.238770954173922190, -0.238819507671156390, --0.238868060571341410, -0.238916612874356280, -0.238965164580079600, -0.239013715688390440, -0.239062266199166570, -0.239110816112287020, -0.239159365427630440, -0.239207914145075890, --0.239256462264501090, -0.239305009785785170, -0.239353556708806700, -0.239402103033444780, -0.239450648759577170, -0.239499193887082930, -0.239547738415841150, -0.239596282345729610, --0.239644825676627340, -0.239693368408413020, -0.239741910540965690, -0.239790452074163160, -0.239838993007884500, -0.239887533342008350, -0.239936073076413820, -0.239984612210978670, --0.240033150745581960, -0.240081688680102410, -0.240130226014419050, -0.240178762748409710, -0.240227298881953430, -0.240275834414928950, -0.240324369347215290, -0.240372903678690270, --0.240421437409233000, -0.240469970538722130, -0.240518503067036760, -0.240567034994054710, -0.240615566319655080, -0.240664097043716970, -0.240712627166118160, -0.240761156686737810, --0.240809685605454540, -0.240858213922147510, -0.240906741636694510, -0.240955268748974660, -0.241003795258866640, -0.241052321166249560, -0.241100846471001220, -0.241149371173000780, --0.241197895272126930, -0.241246418768258750, -0.241294941661274100, -0.241343463951052110, -0.241391985637471880, -0.241440506720411260, -0.241489027199749350, -0.241537547075364900, --0.241586066347137000, -0.241634585014943500, -0.241683103078663560, -0.241731620538175850, -0.241780137393359520, -0.241828653644092400, -0.241877169290253660, -0.241925684331721990, --0.241974198768376560, -0.242022712600095170, -0.242071225826757020, -0.242119738448240810, -0.242168250464425670, -0.242216761875189480, -0.242265272680411370, -0.242313782879970100, --0.242362292473744800, -0.242410801461613340, -0.242459309843454870, -0.242507817619148550, -0.242556324788572280, -0.242604831351605180, -0.242653337308125990, -0.242701842658013920, --0.242750347401146790, -0.242798851537403800, -0.242847355066663660, -0.242895857988805590, -0.242944360303707420, -0.242992862011248370, -0.243041363111307170, -0.243089863603762970, --0.243138363488493690, -0.243186862765378510, -0.243235361434296170, -0.243283859495125850, -0.243332356947745470, -0.243380853792034170, -0.243429350027870750, -0.243477845655134390, --0.243526340673702960, -0.243574835083455700, -0.243623328884271790, -0.243671822076029110, -0.243720314658606880, -0.243768806631883880, -0.243817297995739280, -0.243865788750050990, --0.243914278894698240, -0.243962768429559800, -0.244011257354514870, -0.244059745669441360, -0.244108233374218500, -0.244156720468725050, -0.244205206952840200, -0.244253692826441940, --0.244302178089409430, -0.244350662741621930, -0.244399146782957290, -0.244447630213294830, -0.244496113032513280, -0.244544595240491880, -0.244593076837108570, -0.244641557822242560, --0.244690038195772650, -0.244738517957578060, -0.244786997107536760, -0.244835475645527990, -0.244883953571430500, -0.244932430885123560, -0.244980907586485140, -0.245029383675394420, --0.245077859151730250, -0.245126334015371870, -0.245174808266197230, -0.245223281904085540, -0.245271754928915680, -0.245320227340566850, -0.245368699138917010, -0.245417170323845440, --0.245465640895231370, -0.245514110852952770, -0.245562580196888870, -0.245611048926918540, -0.245659517042921020, -0.245707984544774270, -0.245756451432357550, -0.245804917705549740, --0.245853383364230020, -0.245901848408276450, -0.245950312837568240, -0.245998776651984250, -0.246047239851403730, -0.246095702435704690, -0.246144164404766410, -0.246192625758467700, --0.246241086496687880, -0.246289546619304880, -0.246338006126198050, -0.246386465017246180, -0.246434923292328580, -0.246483380951323240, -0.246531837994109470, -0.246580294420566530, --0.246628750230572400, -0.246677205424006420, -0.246725660000747420, -0.246774113960674670, -0.246822567303666250, -0.246871020029601370, -0.246919472138358960, -0.246967923629818310, --0.247016374503857410, -0.247064824760355600, -0.247113274399191700, -0.247161723420245030, -0.247210171823393670, -0.247258619608516830, -0.247307066775493910, -0.247355513324202860, --0.247403959254523050, -0.247452404566333330, -0.247500849259512600, -0.247549293333940180, -0.247597736789494090, -0.247646179626053680, -0.247694621843498250, -0.247743063441705800, --0.247791504420555720, -0.247839944779926880, -0.247888384519698610, -0.247936823639748920, -0.247985262139957200, -0.248033700020202750, -0.248082137280363600, -0.248130573920319120, --0.248179009939948210, -0.248227445339129770, -0.248275880117743150, -0.248324314275666400, -0.248372747812778880, -0.248421180728959880, -0.248469613024087540, -0.248518044698041150, --0.248566475750699650, -0.248614906181942400, -0.248663335991647440, -0.248711765179694150, -0.248760193745961420, -0.248808621690328660, -0.248857049012673910, -0.248905475712876550, --0.248953901790815500, -0.249002327246370110, -0.249050752079418490, -0.249099176289839960, -0.249147599877513950, -0.249196022842318510, -0.249244445184133000, -0.249292866902836360, --0.249341287998307570, -0.249389708470425990, -0.249438128319069720, -0.249486547544118110, -0.249534966145450590, -0.249583384122945200, -0.249631801476481370, -0.249680218205938030, --0.249728634311194550, -0.249777049792129090, -0.249825464648620960, -0.249873878880549210, -0.249922292487793190, -0.249970705470230980, -0.250019117827742050, -0.250067529560205280, --0.250115940667500150, -0.250164351149504690, -0.250212761006098410, -0.250261170237160660, -0.250309578842569490, -0.250357986822204450, -0.250406394175944400, -0.250454800903668340, --0.250503207005255750, -0.250551612480584720, -0.250600017329534630, -0.250648421551984910, -0.250696825147813720, -0.250745228116900480, -0.250793630459124170, -0.250842032174364240, --0.250890433262498770, -0.250938833723407200, -0.250987233556969000, -0.251035632763062290, -0.251084031341566480, -0.251132429292360630, -0.251180826615323650, -0.251229223310335090, --0.251277619377273000, -0.251326014816016910, -0.251374409626446140, -0.251422803808438950, -0.251471197361874790, -0.251519590286632570, -0.251567982582591830, -0.251616374249630740, --0.251664765287628660, -0.251713155696464690, -0.251761545476018260, -0.251809934626167580, -0.251858323146792020, -0.251906711037770630, -0.251955098298982940, -0.252003484930307050, --0.252051870931622460, -0.252100256302808580, -0.252148641043743680, -0.252197025154307140, -0.252245408634378050, -0.252293791483835460, -0.252342173702558790, -0.252390555290426310, --0.252438936247317390, -0.252487316573111580, -0.252535696267687020, -0.252584075330923250, -0.252632453762699270, -0.252680831562894610, -0.252729208731387430, -0.252777585268057270, --0.252825961172783110, -0.252874336445444440, -0.252922711085919520, -0.252971085094087830, -0.253019458469828480, -0.253067831213020840, -0.253116203323543230, -0.253164574801275080, --0.253212945646095980, -0.253261315857884030, -0.253309685436518830, -0.253358054381879360, -0.253406422693845220, -0.253454790372294620, -0.253503157417106990, -0.253551523828161480, --0.253599889605337640, -0.253648254748513600, -0.253696619257568920, -0.253744983132382750, -0.253793346372834520, -0.253841708978802430, -0.253890070950166140, -0.253938432286805070, --0.253986792988597500, -0.254035153055422960, -0.254083512487160550, -0.254131871283689300, -0.254180229444888880, -0.254228586970637380, -0.254276943860814450, -0.254325300115299640, --0.254373655733971080, -0.254422010716708390, -0.254470365063390660, -0.254518718773897480, -0.254567071848107060, -0.254615424285899010, -0.254663776087152350, -0.254712127251746630, --0.254760477779560230, -0.254808827670472640, -0.254857176924362940, -0.254905525541110790, -0.254953873520594340, -0.255002220862693200, -0.255050567567286950, -0.255098913634253910, --0.255147259063473520, -0.255195603854824980, -0.255243948008187450, -0.255292291523440520, -0.255340634400462340, -0.255388976639132630, -0.255437318239330910, -0.255485659200935470, --0.255533999523825880, -0.255582339207881260, -0.255630678252981250, -0.255679016659004110, -0.255727354425829450, -0.255775691553336350, -0.255824028041404530, -0.255872363889912140, --0.255920699098738880, -0.255969033667763860, -0.256017367596866660, -0.256065700885925620, -0.256114033534820370, -0.256162365543430410, -0.256210696911634170, -0.256259027639311130, --0.256307357726340560, -0.256355687172601990, -0.256404015977973800, -0.256452344142335530, -0.256500671665566450, -0.256548998547546090, -0.256597324788152840, -0.256645650387266220, --0.256693975344765510, -0.256742299660530300, -0.256790623334438920, -0.256838946366370950, -0.256887268756206040, -0.256935590503822590, -0.256983911609100110, -0.257032232071917830, --0.257080551892155010, -0.257128871069691230, -0.257177189604404830, -0.257225507496175450, -0.257273824744882810, -0.257322141350405100, -0.257370457312622040, -0.257418772631412830, --0.257467087306657180, -0.257515401338233310, -0.257563714726020960, -0.257612027469899360, -0.257660339569748100, -0.257708651025445550, -0.257756961836871360, -0.257805272003904800, --0.257853581526425460, -0.257901890404311770, -0.257950198637443340, -0.257998506225699810, -0.258046813168959610, -0.258095119467102400, -0.258143425120007370, -0.258191730127553750, --0.258240034489621300, -0.258288338206088260, -0.258336641276834420, -0.258384943701739420, -0.258433245480681580, -0.258481546613540670, -0.258529847100195890, -0.258578146940526890, --0.258626446134412100, -0.258674744681731240, -0.258723042582363500, -0.258771339836188550, -0.258819636443084870, -0.258867932402932040, -0.258916227715609400, -0.258964522380996650, --0.259012816398972170, -0.259061109769415600, -0.259109402492206710, -0.259157694567223870, -0.259205985994346800, -0.259254276773454810, -0.259302566904427490, -0.259350856387143340, --0.259399145221482110, -0.259447433407322960, -0.259495720944545650, -0.259544007833028610, -0.259592294072651550, -0.259640579663293790, -0.259688864604834980, -0.259737148897153600, --0.259785432540129370, -0.259833715533641930, -0.259881997877569830, -0.259930279571792660, -0.259978560616189850, -0.260026841010640610, -0.260075120755024700, -0.260123399849220560, --0.260171678293107940, -0.260219956086566560, -0.260268233229474840, -0.260316509721712550, -0.260364785563158950, -0.260413060753693860, -0.260461335293195650, -0.260509609181544140, --0.260557882418618600, -0.260606155004298790, -0.260654426938463140, -0.260702698220991400, -0.260750968851762970, -0.260799238830657530, -0.260847508157553530, -0.260895776832330780, --0.260944044854869050, -0.260992312225046710, -0.261040578942743630, -0.261088845007839130, -0.261137110420212480, -0.261185375179743500, -0.261233639286310660, -0.261281902739793680, --0.261330165540072430, -0.261378427687025290, -0.261426689180532080, -0.261474950020472160, -0.261523210206725310, -0.261571469739170000, -0.261619728617686010, -0.261667986842152700, --0.261716244412449890, -0.261764501328455970, -0.261812757590050850, -0.261861013197113800, -0.261909268149524700, -0.261957522447161920, -0.262005776089905380, -0.262054029077634810, --0.262102281410228790, -0.262150533087567030, -0.262198784109528900, -0.262247034475994290, -0.262295284186841670, -0.262343533241950810, -0.262391781641201140, -0.262440029384472420, --0.262488276471643240, -0.262536522902593330, -0.262584768677202100, -0.262633013795349420, -0.262681258256913740, -0.262729502061774920, -0.262777745209812790, -0.262825987700905870, --0.262874229534934000, -0.262922470711776550, -0.262970711231312880, -0.263018951093422880, -0.263067190297985090, -0.263115428844879320, -0.263163666733985390, -0.263211903965181850, --0.263260140538348620, -0.263308376453364970, -0.263356611710110820, -0.263404846308464720, -0.263453080248306550, -0.263501313529515610, -0.263549546151971850, -0.263597778115553790, --0.263646009420141270, -0.263694240065613760, -0.263742470051851030, -0.263790699378731730, -0.263838928046135680, -0.263887156053942750, -0.263935383402031490, -0.263983610090281760, --0.264031836118573000, -0.264080061486784650, -0.264128286194796610, -0.264176510242487390, -0.264224733629736920, -0.264272956356425060, -0.264321178422430300, -0.264369399827632690, --0.264417620571911540, -0.264465840655146780, -0.264514060077216950, -0.264562278838001990, -0.264610496937381760, -0.264658714375234860, -0.264706931151441170, -0.264755147265880180, --0.264803362718431300, -0.264851577508974480, -0.264899791637388250, -0.264948005103552540, -0.264996217907347230, -0.265044430048650970, -0.265092641527343630, -0.265140852343304700, --0.265189062496414050, -0.265237271986550340, -0.265285480813593430, -0.265333688977422820, -0.265381896477918430, -0.265430103314958870, -0.265478309488423990, -0.265526514998193410, --0.265574719844146930, -0.265622924026163280, -0.265671127544122250, -0.265719330397903850, -0.265767532587386720, -0.265815734112450740, -0.265863934972975450, -0.265912135168840270, --0.265960334699925250, -0.266008533566108930, -0.266056731767271240, -0.266104929303292210, -0.266153126174050400, -0.266201322379425730, -0.266249517919297850, -0.266297712793546530, --0.266345907002050520, -0.266394100544689760, -0.266442293421343730, -0.266490485631892370, -0.266538677176214430, -0.266586868054189740, -0.266635058265697940, -0.266683247810618860, --0.266731436688831260, -0.266779624900215060, -0.266827812444650260, -0.266875999322015440, -0.266924185532190660, -0.266972371075055450, -0.267020555950489680, -0.267068740158372120, --0.267116923698582700, -0.267165106571000950, -0.267213288775506930, -0.267261470311979220, -0.267309651180297810, -0.267357831380342300, -0.267406010911992620, -0.267454189775127530, --0.267502367969626900, -0.267550545495370830, -0.267598722352237970, -0.267646898540108260, -0.267695074058861340, -0.267743248908376750, -0.267791423088534430, -0.267839596599213140, --0.267887769440292860, -0.267935941611653570, -0.267984113113173990, -0.268032283944734160, -0.268080454106213560, -0.268128623597492340, -0.268176792418449050, -0.268224960568963830, --0.268273128048916230, -0.268321294858186180, -0.268369460996652490, -0.268417626464195150, -0.268465791260693750, -0.268513955386028290, -0.268562118840077520, -0.268610281622721440, --0.268658443733840120, -0.268706605173312240, -0.268754765941017830, -0.268802926036836530, -0.268851085460647900, -0.268899244212331970, -0.268947402291767500, -0.268995559698834540, --0.269043716433413130, -0.269091872495381970, -0.269140027884621160, -0.269188182601010240, -0.269236336644429360, -0.269284490014757130, -0.269332642711873740, -0.269380794735658680, --0.269428946085992100, -0.269477096762752720, -0.269525246765820630, -0.269573396095075360, -0.269621544750397070, -0.269669692731664470, -0.269717840038757650, -0.269765986671556660, --0.269814132629940310, -0.269862277913788580, -0.269910422522981140, -0.269958566457398130, -0.270006709716918260, -0.270054852301421570, -0.270102994210787820, -0.270151135444896940, --0.270199276003627810, -0.270247415886860520, -0.270295555094474670, -0.270343693626350360, -0.270391831482366400, -0.270439968662402890, -0.270488105166339870, -0.270536240994056100, --0.270584376145431790, -0.270632510620346490, -0.270680644418679950, -0.270728777540312220, -0.270776909985122160, -0.270825041752989770, -0.270873172843795200, -0.270921303257417310, --0.270969432993736100, -0.271017562052631390, -0.271065690433983150, -0.271113818137670270, -0.271161945163572840, -0.271210071511570560, -0.271258197181543480, -0.271306322173370530, --0.271354446486931740, -0.271402570122106890, -0.271450693078776010, -0.271498815356817970, -0.271546936956112870, -0.271595057876540870, -0.271643178117980830, -0.271691297680312800, --0.271739416563416550, -0.271787534767171770, -0.271835652291458560, -0.271883769136155810, -0.271931885301143590, -0.271980000786302130, -0.272028115591510240, -0.272076229716648020, --0.272124343161595280, -0.272172455926232070, -0.272220568010437310, -0.272268679414091110, -0.272316790137073270, -0.272364900179263850, -0.272413009540541710, -0.272461118220787110, --0.272509226219879660, -0.272557333537699620, -0.272605440174125800, -0.272653546129038360, -0.272701651402317500, -0.272749755993842050, -0.272797859903492260, -0.272845963131147780, --0.272894065676688890, -0.272942167539994340, -0.272990268720944400, -0.273038369219418760, -0.273086469035297650, -0.273134568168459930, -0.273182666618785820, -0.273230764386155010, --0.273278861470447720, -0.273326957871542870, -0.273375053589320570, -0.273423148623661130, -0.273471242974443360, -0.273519336641547480, -0.273567429624853250, -0.273615521924240490, --0.273663613539589290, -0.273711704470778690, -0.273759794717688800, -0.273807884280199860, -0.273855973158190770, -0.273904061351541770, -0.273952148860132580, -0.274000235683843460, --0.274048321822553340, -0.274096407276142370, -0.274144492044490430, -0.274192576127477660, -0.274240659524983050, -0.274288742236886760, -0.274336824263068660, -0.274384905603408890, --0.274432986257786450, -0.274481066226081540, -0.274529145508174370, -0.274577224103943920, -0.274625302013270400, -0.274673379236033630, -0.274721455772113430, -0.274769531621390010, --0.274817606783742340, -0.274865681259050640, -0.274913755047195170, -0.274961828148054870, -0.275009900561510030, -0.275057972287440390, -0.275106043325726300, -0.275154113676246650, --0.275202183338881750, -0.275250252313511360, -0.275298320600015740, -0.275346388198273890, -0.275394455108166130, -0.275442521329572200, -0.275490586862372380, -0.275538651706445700, --0.275586715861672380, -0.275634779327932680, -0.275682842105105630, -0.275730904193071450, -0.275778965591710000, -0.275827026300901610, -0.275875086320525150, -0.275923145650461050, --0.275971204290589080, -0.276019262240789490, -0.276067319500941320, -0.276115376070924900, -0.276163431950619990, -0.276211487139906950, -0.276259541638664730, -0.276307595446773690, --0.276355648564114100, -0.276403700990564940, -0.276451752726006530, -0.276499803770318740, -0.276547854123381450, -0.276595903785074930, -0.276643952755278260, -0.276692001033871650, --0.276740048620735530, -0.276788095515748790, -0.276836141718791890, -0.276884187229744560, -0.276932232048487270, -0.276980276174898900, -0.277028319608859870, -0.277076362350250070, --0.277124404398949750, -0.277172445754838010, -0.277220486417795120, -0.277268526387701050, -0.277316565664436080, -0.277364604247879290, -0.277412642137910950, -0.277460679334411490, --0.277508715837259830, -0.277556751646336420, -0.277604786761521170, -0.277652821182693910, -0.277700854909735010, -0.277748887942523560, -0.277796920280939890, -0.277844951924864360, --0.277892982874176020, -0.277941013128755240, -0.277989042688481900, -0.278037071553236370, -0.278085099722897740, -0.278133127197346400, -0.278181153976462650, -0.278229180060125540, --0.278277205448215550, -0.278325230140612500, -0.278373254137196380, -0.278421277437847560, -0.278469300042445130, -0.278517321950869420, -0.278565343163000860, -0.278613363678718530, --0.278661383497902760, -0.278709402620433530, -0.278757421046191220, -0.278805438775054980, -0.278853455806905070, -0.278901472141621590, -0.278949487779084790, -0.278997502719173900, --0.279045516961769210, -0.279093530506750790, -0.279141543353998880, -0.279189555503392750, -0.279237566954812720, -0.279285577708139220, -0.279333587763251290, -0.279381597120029410, --0.279429605778353570, -0.279477613738103700, -0.279525620999160230, -0.279573627561402250, -0.279621633424710250, -0.279669638588964540, -0.279717643054044340, -0.279765646819830020, --0.279813649886201610, -0.279861652253039440, -0.279909653920222770, -0.279957654887631970, -0.280005655155146970, -0.280053654722648320, -0.280101653590015100, -0.280149651757127690, --0.280197649223866200, -0.280245645990111040, -0.280293642055741310, -0.280341637420637450, -0.280389632084679930, -0.280437626047747910, -0.280485619309721880, -0.280533611870481760, --0.280581603729907590, -0.280629594887879860, -0.280677585344277670, -0.280725575098981550, -0.280773564151871930, -0.280821552502827980, -0.280869540151730160, -0.280917527098458460, --0.280965513342893380, -0.281013498884914060, -0.281061483724401040, -0.281109467861234700, -0.281157451295294290, -0.281205434026460200, -0.281253416054612570, -0.281301397379631450, --0.281349378001397200, -0.281397357919789090, -0.281445337134687560, -0.281493315645973130, -0.281541293453525020, -0.281589270557223600, -0.281637246956949080, -0.281685222652581830, --0.281733197644001120, -0.281781171931087430, -0.281829145513720740, -0.281877118391781700, -0.281925090565149360, -0.281973062033704310, -0.282021032797326650, -0.282069002855896810, --0.282116972209294050, -0.282164940857398850, -0.282212908800091700, -0.282260876037251860, -0.282308842568759880, -0.282356808394495730, -0.282404773514339570, -0.282452737928171940, --0.282500701635871990, -0.282548664637320310, -0.282596626932397400, -0.282644588520982510, -0.282692549402956130, -0.282740509578198350, -0.282788469046589770, -0.282836427808009610, --0.282884385862338330, -0.282932343209456090, -0.282980299849243440, -0.283028255781579590, -0.283076211006345110, -0.283124165523420070, -0.283172119332685100, -0.283220072434019370, --0.283268024827303510, -0.283315976512417970, -0.283363927489242050, -0.283411877757656310, -0.283459827317540940, -0.283507776168776370, -0.283555724311241930, -0.283603671744818210, --0.283651618469385300, -0.283699564484823750, -0.283747509791012880, -0.283795454387833270, -0.283843398275164970, -0.283891341452888630, -0.283939283920883470, -0.283987225679030120, --0.284035166727209190, -0.284083107065299880, -0.284131046693182790, -0.284178985610738070, -0.284226923817845870, -0.284274861314386840, -0.284322798100240190, -0.284370734175286580, --0.284418669539406530, -0.284466604192479430, -0.284514538134385760, -0.284562471365005790, -0.284610403884220040, -0.284658335691907850, -0.284706266787949860, -0.284754197172226160, --0.284802126844617420, -0.284850055805002940, -0.284897984053263280, -0.284945911589278680, -0.284993838412929750, -0.285041764524095800, -0.285089689922657430, -0.285137614608495240, --0.285185538581488600, -0.285233461841518100, -0.285281384388463950, -0.285329306222206370, -0.285377227342625940, -0.285425147749601980, -0.285473067443015200, -0.285520986422746150, --0.285568904688674190, -0.285616822240680020, -0.285664739078643760, -0.285712655202446100, -0.285760570611966360, -0.285808485307085190, -0.285856399287682810, -0.285904312553639850, --0.285952225104835700, -0.286000136941150950, -0.286048048062465920, -0.286095958468661150, -0.286143868159616070, -0.286191777135211320, -0.286239685395327570, -0.286287592939844130, --0.286335499768641750, -0.286383405881600610, -0.286431311278601390, -0.286479215959523470, -0.286527119924247510, -0.286575023172653710, -0.286622925704622830, -0.286670827520034140, --0.286718728618768460, -0.286766629000705930, -0.286814528665727260, -0.286862427613711830, -0.286910325844540350, -0.286958223358093460, -0.287006120154250590, -0.287054016232892390, --0.287101911593899200, -0.287149806237151200, -0.287197700162529160, -0.287245593369912400, -0.287293485859181690, -0.287341377630217610, -0.287389268682899710, -0.287437159017108650, --0.287485048632724730, -0.287532937529628550, -0.287580825707699610, -0.287628713166818650, -0.287676599906865840, -0.287724485927721980, -0.287772371229266520, -0.287820255811380100, --0.287868139673943040, -0.287916022816836090, -0.287963905239938590, -0.288011786943131400, -0.288059667926295120, -0.288107548189309230, -0.288155427732054490, -0.288203306554411230, --0.288251184656259650, -0.288299062037480570, -0.288346938697953360, -0.288394814637558840, -0.288442689856177710, -0.288490564353689420, -0.288538438129974710, -0.288586311184913900, --0.288634183518387770, -0.288682055130275730, -0.288729926020458550, -0.288777796188816550, -0.288825665635230490, -0.288873534359579850, -0.288921402361745410, -0.288969269641607410, --0.289017136199046680, -0.289065002033942700, -0.289112867146176180, -0.289160731535627940, -0.289208595202177450, -0.289256458145705440, -0.289304320366092330, -0.289352181863218820, --0.289400042636964390, -0.289447902687209930, -0.289495762013835700, -0.289543620616722450, -0.289591478495749730, -0.289639335650798360, -0.289687192081748590, -0.289735047788481300, --0.289782902770875980, -0.289830757028813390, -0.289878610562174290, -0.289926463370838270, -0.289974315454686100, -0.290022166813598160, -0.290070017447454750, -0.290117867356136760, --0.290165716539523670, -0.290213564997496290, -0.290261412729935440, -0.290309259736720620, -0.290357106017732620, -0.290404951572851900, -0.290452796401959200, -0.290500640504934070, --0.290548483881657380, -0.290596326532009450, -0.290644168455871150, -0.290692009653121970, -0.290739850123642780, -0.290787689867314010, -0.290835528884016370, -0.290883367173629560, --0.290931204736034290, -0.290979041571111430, -0.291026877678740530, -0.291074713058802450, -0.291122547711177570, -0.291170381635746320, -0.291218214832389580, -0.291266047300986870, --0.291313879041419030, -0.291361710053566920, -0.291409540337310090, -0.291457369892529410, -0.291505198719105350, -0.291553026816918690, -0.291600854185849020, -0.291648680825777220, --0.291696506736584150, -0.291744331918149410, -0.291792156370353830, -0.291839980093077880, -0.291887803086201940, -0.291935625349606930, -0.291983446883172400, -0.292031267686779280, --0.292079087760308440, -0.292126907103639420, -0.292174725716653150, -0.292222543599230110, -0.292270360751251070, -0.292318177172595730, -0.292365992863144910, -0.292413807822779150, --0.292461622051379320, -0.292509435548824970, -0.292557248314997020, -0.292605060349775960, -0.292652871653042710, -0.292700682224676820, -0.292748492064559220, -0.292796301172570830, --0.292844109548591250, -0.292891917192501410, -0.292939724104181790, -0.292987530283512820, -0.293035335730375490, -0.293083140444649340, -0.293130944426215400, -0.293178747674954500, --0.293226550190746280, -0.293274351973471740, -0.293322153023011290, -0.293369953339245870, -0.293417752922055190, -0.293465551771320050, -0.293513349886921070, -0.293561147268739160, --0.293608943916653930, -0.293656739830546350, -0.293704535010296920, -0.293752329455786610, -0.293800123166895020, -0.293847916143503090, -0.293895708385491840, -0.293943499892740880, --0.293991290665131190, -0.294039080702543250, -0.294086870004857610, -0.294134658571955250, -0.294182446403715770, -0.294230233500020200, -0.294278019860749470, -0.294325805485783240, --0.294373590375002550, -0.294421374528287870, -0.294469157945520140, -0.294516940626579130, -0.294564722571345750, -0.294612503779701000, -0.294660284251524520, -0.294708063986697410, --0.294755842985100100, -0.294803621246613130, -0.294851398771117600, -0.294899175558493150, -0.294946951608620720, -0.294994726921381340, -0.295042501496654790, -0.295090275334321920, --0.295138048434263330, -0.295185820796360130, -0.295233592420491910, -0.295281363306539700, -0.295329133454384110, -0.295376902863906050, -0.295424671534985360, -0.295472439467503010, --0.295520206661339550, -0.295567973116375950, -0.295615738832492040, -0.295663503809568740, -0.295711268047487150, -0.295759031546126930, -0.295806794305369160, -0.295854556325094390, --0.295902317605183260, -0.295950078145516720, -0.295997837945974560, -0.296045597006437840, -0.296093355326787540, -0.296141112906903430, -0.296188869746666530, -0.296236625845957450, --0.296284381204657220, -0.296332135822645610, -0.296379889699803670, -0.296427642836012030, -0.296475395231151680, -0.296523146885102450, -0.296570897797745310, -0.296618647968960980, --0.296666397398630380, -0.296714146086633430, -0.296761894032851080, -0.296809641237164410, -0.296857387699453250, -0.296905133419598620, -0.296952878397481130, -0.297000622632981880, --0.297048366125980620, -0.297096108876358460, -0.297143850883996030, -0.297191592148774440, -0.297239332670573400, -0.297287072449274050, -0.297334811484756990, -0.297382549776903370, --0.297430287325592900, -0.297478024130706730, -0.297525760192125950, -0.297573495509730330, -0.297621230083400970, -0.297668963913018500, -0.297716696998463700, -0.297764429339617500, --0.297812160936359870, -0.297859891788571810, -0.297907621896134400, -0.297955351258927580, -0.298003079876832330, -0.298050807749729420, -0.298098534877499880, -0.298146261260023640, --0.298193986897181680, -0.298241711788854780, -0.298289435934924020, -0.298337159335269280, -0.298384881989771590, -0.298432603898311720, -0.298480325060770770, -0.298528045477028550, --0.298575765146966270, -0.298623484070464960, -0.298671202247404510, -0.298718919677666060, -0.298766636361130320, -0.298814352297678000, -0.298862067487190240, -0.298909781929546870, --0.298957495624629030, -0.299005208572317880, -0.299052920772493290, -0.299100632225036410, -0.299148342929827950, -0.299196052886749000, -0.299243762095679540, -0.299291470556500680, --0.299339178269093120, -0.299386885233338060, -0.299434591449115380, -0.299482296916306180, -0.299530001634791270, -0.299577705604451740, -0.299625408825167580, -0.299673111296819840, --0.299720813019289770, -0.299768513992457300, -0.299816214216203470, -0.299863913690409100, -0.299911612414955400, -0.299959310389722230, -0.300007007614590810, -0.300054704089441850, --0.300102399814156600, -0.300150094788614870, -0.300197789012697950, -0.300245482486286520, -0.300293175209261800, -0.300340867181503710, -0.300388558402893470, -0.300436248873312270, --0.300483938592640050, -0.300531627560757960, -0.300579315777546760, -0.300627003242887330, -0.300674689956660800, -0.300722375918747060, -0.300770061129027490, -0.300817745587383110, --0.300865429293693980, -0.300913112247841230, -0.300960794449705750, -0.301008475899168680, -0.301056156596110010, -0.301103836540410950, -0.301151515731952310, -0.301199194170615250, --0.301246871856279850, -0.301294548788827220, -0.301342224968138230, -0.301389900394094130, -0.301437575066574810, -0.301485248985461580, -0.301532922150635650, -0.301580594561977000, --0.301628266219366890, -0.301675937122686030, -0.301723607271815410, -0.301771276666636170, -0.301818945307028300, -0.301866613192873060, -0.301914280324051710, -0.301961946700444240, --0.302009612321931910, -0.302057277188395590, -0.302104941299716430, -0.302152604655774540, -0.302200267256451100, -0.302247929101627070, -0.302295590191183570, -0.302343250525000660, --0.302390910102959650, -0.302438568924941420, -0.302486226990827110, -0.302533884300496820, -0.302581540853831880, -0.302629196650713470, -0.302676851691021650, -0.302724505974637680, --0.302772159501442430, -0.302819812271317270, -0.302867464284142130, -0.302915115539798270, -0.302962766038166690, -0.303010415779128630, -0.303058064762564080, -0.303105712988354370, --0.303153360456380360, -0.303201007166523370, -0.303248653118663450, -0.303296298312681900, -0.303343942748460050, -0.303391586425877880, -0.303439229344816760, -0.303486871505157570, --0.303534512906781240, -0.303582153549569020, -0.303629793433400960, -0.303677432558158430, -0.303725070923722750, -0.303772708529974010, -0.303820345376793480, -0.303867981464062020, --0.303915616791661130, -0.303963251359470720, -0.304010885167372180, -0.304058518215246430, -0.304106150502974790, -0.304153782030437360, -0.304201412797515500, -0.304249042804090100, --0.304296672050042520, -0.304344300535252850, -0.304391928259602370, -0.304439555222972560, -0.304487181425243390, -0.304534806866296300, -0.304582431546012170, -0.304630055464271960, --0.304677678620957070, -0.304725301015947530, -0.304772922649124760, -0.304820543520370080, -0.304868163629563590, -0.304915782976586780, -0.304963401561320460, -0.305011019383646050, --0.305058636443443660, -0.305106252740594720, -0.305153868274980530, -0.305201483046481260, -0.305249097054978320, -0.305296710300352600, -0.305344322782485080, -0.305391934501257230, --0.305439545456549110, -0.305487155648242080, -0.305534765076217630, -0.305582373740355850, -0.305629981640538120, -0.305677588776645410, -0.305725195148559170, -0.305772800756159540, --0.305820405599327880, -0.305868009677945250, -0.305915612991892960, -0.305963215541051270, -0.306010817325301500, -0.306058418344524740, -0.306106018598602310, -0.306153618087414430, --0.306201216810842450, -0.306248814768767920, -0.306296411961070880, -0.306344008387632870, -0.306391604048334760, -0.306439198943057710, -0.306486793071683080, -0.306534386434091030, --0.306581979030162990, -0.306629570859780430, -0.306677161922823570, -0.306724752219173780, -0.306772341748712100, -0.306819930511319950, -0.306867518506877600, -0.306915105735266420, --0.306962692196367510, -0.307010277890062300, -0.307057862816230930, -0.307105446974754950, -0.307153030365515330, -0.307200612988393570, -0.307248194843269820, -0.307295775930025610, --0.307343356248542420, -0.307390935798700360, -0.307438514580380960, -0.307486092593465320, -0.307533669837834420, -0.307581246313369750, -0.307628822019951560, -0.307676396957461300, --0.307723971125780480, -0.307771544524789330, -0.307819117154369270, -0.307866689014401450, -0.307914260104767360, -0.307961830425347140, -0.308009399976022390, -0.308056968756674540, --0.308104536767183860, -0.308152104007431820, -0.308199670477299510, -0.308247236176668050, -0.308294801105418960, -0.308342365263432390, -0.308389928650589900, -0.308437491266773060, --0.308485053111862030, -0.308532614185738350, -0.308580174488283180, -0.308627734019377930, -0.308675292778902990, -0.308722850766739780, -0.308770407982769500, -0.308817964426873590, --0.308865520098932310, -0.308913074998827250, -0.308960629126439510, -0.309008182481650630, -0.309055735064340860, -0.309103286874391760, -0.309150837911684850, -0.309198388176100460, --0.309245937667520070, -0.309293486385824820, -0.309341034330895880, -0.309388581502614780, -0.309436127900861780, -0.309483673525518480, -0.309531218376466410, -0.309578762453585900, --0.309626305756758420, -0.309673848285865250, -0.309721390040787860, -0.309768931021406570, -0.309816471227602920, -0.309864010659258120, -0.309911549316253700, -0.309959087198469980, --0.310006624305788570, -0.310054160638090600, -0.310101696195257630, -0.310149230977170010, -0.310196764983709290, -0.310244298214757130, -0.310291830670193720, -0.310339362349900780, --0.310386893253759450, -0.310434423381651340, -0.310481952733456690, -0.310529481309057160, -0.310577009108333970, -0.310624536131168640, -0.310672062377441550, -0.310719587847034300, --0.310767112539828080, -0.310814636455704560, -0.310862159594543940, -0.310909681956227980, -0.310957203540638220, -0.311004724347655030, -0.311052244377160000, -0.311099763629034410, --0.311147282103159390, -0.311194799799416610, -0.311242316717686370, -0.311289832857850330, -0.311337348219790140, -0.311384862803386180, -0.311432376608520080, -0.311479889635073000, --0.311527401882926660, -0.311574913351961360, -0.311622424042058750, -0.311669933953100110, -0.311717443084967070, -0.311764951437540020, -0.311812459010700540, -0.311859965804329900, --0.311907471818309800, -0.311954977052520620, -0.312002481506843950, -0.312049985181161560, -0.312097488075353760, -0.312144990189302200, -0.312192491522888190, -0.312239992075992960, --0.312287491848498190, -0.312334990840284210, -0.312382489051232840, -0.312429986481225610, -0.312477483130143010, -0.312524978997866690, -0.312572474084277910, -0.312619968389258370, --0.312667461912688520, -0.312714954654449980, -0.312762446614424090, -0.312809937792492440, -0.312857428188535570, -0.312904917802435180, -0.312952406634072420, -0.312999894683329060, --0.313047381950085580, -0.313094868434223630, -0.313142354135624970, -0.313189839054169970, -0.313237323189740350, -0.313284806542217460, -0.313332289111482980, -0.313379770897417310, --0.313427251899902230, -0.313474732118819040, -0.313522211554049410, -0.313569690205473870, -0.313617168072974070, -0.313664645156431390, -0.313712121455727470, -0.313759596970742850, --0.313807071701359240, -0.313854545647458400, -0.313902018808920710, -0.313949491185628040, -0.313996962777461590, -0.314044433584302730, -0.314091903606033230, -0.314139372842533570, --0.314186841293685460, -0.314234308959370660, -0.314281775839469700, -0.314329241933864250, -0.314376707242435720, -0.314424171765065820, -0.314471635501635090, -0.314519098452025300, --0.314566560616117710, -0.314614021993794180, -0.314661482584935150, -0.314708942389422430, -0.314756401407137340, -0.314803859637961700, -0.314851317081775940, -0.314898773738461920, --0.314946229607901420, -0.314993684689974850, -0.315041138984564100, -0.315088592491550520, -0.315136045210815450, -0.315183497142240700, -0.315230948285706750, -0.315278398641095470, --0.315325848208288570, -0.315373296987166650, -0.315420744977611520, -0.315468192179504450, -0.315515638592727410, -0.315563084217160780, -0.315610529052686490, -0.315657973099185860, --0.315705416356540700, -0.315752858824631610, -0.315800300503340350, -0.315847741392548340, -0.315895181492137410, -0.315942620801988090, -0.315990059321982260, -0.316037497052001680, --0.316084933991926890, -0.316132370141639810, -0.316179805501021820, -0.316227240069954670, -0.316274673848319090, -0.316322106835996760, -0.316369539032869180, -0.316416970438818170, --0.316464401053724310, -0.316511830877469480, -0.316559259909935050, -0.316606688151002900, -0.316654115600553570, -0.316701542258469030, -0.316748968124630990, -0.316796393198920110, --0.316843817481218260, -0.316891240971406860, -0.316938663669367400, -0.316986085574981650, -0.317033506688130300, -0.317080927008695170, -0.317128346536558140, -0.317175765271599800, --0.317223183213702080, -0.317270600362746400, -0.317318016718614650, -0.317365432281187410, -0.317412847050346610, -0.317460261025973690, -0.317507674207950510, -0.317555086596157720, --0.317602498190477260, -0.317649908990790540, -0.317697318996979450, -0.317744728208924630, -0.317792136626508070, -0.317839544249611530, -0.317886951078115710, -0.317934357111902490, --0.317981762350853400, -0.318029166794849940, -0.318076570443773910, -0.318123973297506080, -0.318171375355928320, -0.318218776618922510, -0.318266177086369400, -0.318313576758150810, --0.318360975634148220, -0.318408373714243690, -0.318455770998317790, -0.318503167486252460, -0.318550563177929180, -0.318597958073229990, -0.318645352172035430, -0.318692745474227490, --0.318740137979687700, -0.318787529688297930, -0.318834920599939010, -0.318882310714492690, -0.318929700031841070, -0.318977088551864800, -0.319024476274445800, -0.319071863199465570, --0.319119249326806130, -0.319166634656348150, -0.319214019187973540, -0.319261402921563910, -0.319308785857001230, -0.319356167994166110, -0.319403549332940630, -0.319450929873206220, --0.319498309614844930, -0.319545688557737460, -0.319593066701765740, -0.319640444046811800, -0.319687820592756300, -0.319735196339481280, -0.319782571286868270, -0.319829945434798810, --0.319877318783154900, -0.319924691331817280, -0.319972063080667950, -0.320019434029588880, -0.320066804178460780, -0.320114173527165700, -0.320161542075585170, -0.320208909823601170, --0.320256276771094530, -0.320303642917947160, -0.320351008264040730, -0.320398372809257150, -0.320445736553477250, -0.320493099496583000, -0.320540461638456010, -0.320587822978978250, --0.320635183518030550, -0.320682543255494890, -0.320729902191253300, -0.320777260325186500, -0.320824617657176570, -0.320871974187105110, -0.320919329914853670, -0.320966684840304380, --0.321014038963337910, -0.321061392283836400, -0.321108744801681780, -0.321156096516754860, -0.321203447428937750, -0.321250797538112030, -0.321298146844159690, -0.321345495346961610, --0.321392843046399760, -0.321440189942356180, -0.321487536034711750, -0.321534881323348510, -0.321582225808148050, -0.321629569488992020, -0.321676912365762460, -0.321724254438340240, --0.321771595706607350, -0.321818936170445880, -0.321866275829736700, -0.321913614684361800, -0.321960952734202890, -0.322008289979141990, -0.322055626419059940, -0.322102962053838810, --0.322150296883360330, -0.322197630907506470, -0.322244964126158160, -0.322292296539197440, -0.322339628146505960, -0.322386958947965820, -0.322434288943457880, -0.322481618132864190, --0.322528946516066890, -0.322576274092946810, -0.322623600863386040, -0.322670926827266280, -0.322718251984469180, -0.322765576334876900, -0.322812899878370250, -0.322860222614831380, --0.322907544544142330, -0.322954865666183980, -0.323002185980838520, -0.323049505487987550, -0.323096824187513290, -0.323144142079296480, -0.323191459163219340, -0.323238775439163570, --0.323286090907011270, -0.323333405566643360, -0.323380719417941890, -0.323428032460788660, -0.323475344695065730, -0.323522656120654010, -0.323569966737435710, -0.323617276545292880, --0.323664585544106430, -0.323711893733758530, -0.323759201114130870, -0.323806507685105600, -0.323853813446563720, -0.323901118398387260, -0.323948422540458030, -0.323995725872658120, --0.324043028394868540, -0.324090330106971360, -0.324137631008848350, -0.324184931100381660, -0.324232230381452270, -0.324279528851942280, -0.324326826511733890, -0.324374123360707980, --0.324421419398746800, -0.324468714625732070, -0.324516009041545540, -0.324563302646069420, -0.324610595439184630, -0.324657887420773340, -0.324705178590717740, -0.324752468948898750, --0.324799758495198650, -0.324847047229499140, -0.324894335151682420, -0.324941622261629430, -0.324988908559222410, -0.325036194044343090, -0.325083478716873710, -0.325130762576695260, --0.325178045623689850, -0.325225327857739330, -0.325272609278725920, -0.325319889886530600, -0.325367169681035520, -0.325414448662122930, -0.325461726829673840, -0.325509004183570370, --0.325556280723694410, -0.325603556449927780, -0.325650831362152670, -0.325698105460250020, -0.325745378744102140, -0.325792651213591240, -0.325839922868598310, -0.325887193709005540, --0.325934463734694810, -0.325981732945548330, -0.326029001341447080, -0.326076268922273320, -0.326123535687908920, -0.326170801638236090, -0.326218066773135810, -0.326265331092490400, --0.326312594596181670, -0.326359857284091840, -0.326407119156101930, -0.326454380212094280, -0.326501640451951070, -0.326548899875553360, -0.326596158482783390, -0.326643416273523000, --0.326690673247654500, -0.326737929405058910, -0.326785184745618460, -0.326832439269215120, -0.326879692975731050, -0.326926945865047340, -0.326974197937046240, -0.327021449191609690, --0.327068699628619900, -0.327115949247957950, -0.327163198049506110, -0.327210446033146750, -0.327257693198760800, -0.327304939546230630, -0.327352185075438170, -0.327399429786265180, --0.327446673678594040, -0.327493916752305820, -0.327541159007282810, -0.327588400443407310, -0.327635641060560370, -0.327682880858624350, -0.327730119837481130, -0.327777357997013020, --0.327824595337101120, -0.327871831857627690, -0.327919067558474720, -0.327966302439524520, -0.328013536500658060, -0.328060769741757850, -0.328108002162705640, -0.328155233763383900, --0.328202464543673630, -0.328249694503457200, -0.328296923642616980, -0.328344151961034000, -0.328391379458590650, -0.328438606135168840, -0.328485831990650510, -0.328533057024918030, --0.328580281237852550, -0.328627504629336260, -0.328674727199251670, -0.328721948947479860, -0.328769169873903200, -0.328816389978403570, -0.328863609260863390, -0.328910827721163810, --0.328958045359187100, -0.329005262174815290, -0.329052478167930760, -0.329099693338414660, -0.329146907686149240, -0.329194121211016600, -0.329241333912899060, -0.329288545791677770, --0.329335756847235150, -0.329382967079453530, -0.329430176488214040, -0.329477385073399130, -0.329524592834890770, -0.329571799772571340, -0.329619005886322040, -0.329666211176025180, --0.329713415641562760, -0.329760619282817250, -0.329807822099669800, -0.329855024092002790, -0.329902225259698200, -0.329949425602638460, -0.329996625120704710, -0.330043823813779450, --0.330091021681745030, -0.330138218724482620, -0.330185414941874700, -0.330232610333803240, -0.330279804900150240, -0.330326998640798120, -0.330374191555628140, -0.330421383644522610, --0.330468574907364090, -0.330515765344033710, -0.330562954954413960, -0.330610143738386760, -0.330657331695834610, -0.330704518826638760, -0.330751705130681580, -0.330798890607845120, --0.330846075258011910, -0.330893259081063040, -0.330940442076881060, -0.330987624245347940, -0.331034805586346240, -0.331081986099757030, -0.331129165785462920, -0.331176344643346280, --0.331223522673288360, -0.331270699875171660, -0.331317876248878150, -0.331365051794289990, -0.331412226511289650, -0.331459400399758300, -0.331506573459578460, -0.331553745690632560, --0.331600917092801930, -0.331648087665968980, -0.331695257410015760, -0.331742426324824920, -0.331789594410277500, -0.331836761666256140, -0.331883928092642890, -0.331931093689320220, --0.331978258456169410, -0.332025422393072980, -0.332072585499912920, -0.332119747776571880, -0.332166909222931020, -0.332214069838872860, -0.332261229624280010, -0.332308388579033610, --0.332355546703016260, -0.332402703996110050, -0.332449860458197520, -0.332497016089159880, -0.332544170888879720, -0.332591324857239130, -0.332638477994120660, -0.332685630299405570, --0.332732781772976380, -0.332779932414715260, -0.332827082224504740, -0.332874231202226030, -0.332921379347761840, -0.332968526660994520, -0.333015673141805520, -0.333062818790077380, --0.333109963605692120, -0.333157107588531950, -0.333204250738479480, -0.333251393055415960, -0.333298534539223920, -0.333345675189785970, -0.333392815006983420, -0.333439953990698870, --0.333487092140814400, -0.333534229457212620, -0.333581365939774830, -0.333628501588383640, -0.333675636402921190, -0.333722770383270080, -0.333769903529311630, -0.333817035840928420, --0.333864167318002610, -0.333911297960416800, -0.333958427768052350, -0.334005556740791800, -0.334052684878517800, -0.334099812181111620, -0.334146938648455960, -0.334194064280432970, --0.334241189076924790, -0.334288313037814030, -0.334335436162982110, -0.334382558452311570, -0.334429679905685120, -0.334476800522983950, -0.334523920304090840, -0.334571039248887920, --0.334618157357257860, -0.334665274629081910, -0.334712391064242830, -0.334759506662623160, -0.334806621424104330, -0.334853735348568940, -0.334900848435899180, -0.334947960685977320, --0.334995072098686010, -0.335042182673906560, -0.335089292411521690, -0.335136401311413980, -0.335183509373464860, -0.335230616597556930, -0.335277722983572500, -0.335324828531394170, --0.335371933240903360, -0.335419037111982680, -0.335466140144514480, -0.335513242338381260, -0.335560343693464600, -0.335607444209647000, -0.335654543886810870, -0.335701642724838710, --0.335748740723612100, -0.335795837883013590, -0.335842934202925940, -0.335890029683230510, -0.335937124323810010, -0.335984218124546760, -0.336031311085322910, -0.336078403206021170, --0.336125494486523070, -0.336172584926711200, -0.336219674526468280, -0.336266763285675730, -0.336313851204216310, -0.336360938281972280, -0.336408024518826290, -0.336455109914659820, --0.336502194469355590, -0.336549278182795900, -0.336596361054863400, -0.336643443085439530, -0.336690524274407150, -0.336737604621648370, -0.336784684127046040, -0.336831762790481600, --0.336878840611837760, -0.336925917590997210, -0.336972993727841450, -0.337020069022253180, -0.337067143474114760, -0.337114217083308520, -0.337161289849717110, -0.337208361773222050, --0.337255432853706130, -0.337302503091051980, -0.337349572485141190, -0.337396641035856480, -0.337443708743080160, -0.337490775606694990, -0.337537841626582460, -0.337584906802625320, --0.337631971134706390, -0.337679034622707040, -0.337726097266510090, -0.337773159065997970, -0.337820220021052890, -0.337867280131557700, -0.337914339397393900, -0.337961397818444250, --0.338008455394591510, -0.338055512125717270, -0.338102568011704190, -0.338149623052434680, -0.338196677247791570, -0.338243730597656330, -0.338290783101911800, -0.338337834760440270, --0.338384885573124570, -0.338431935539846240, -0.338478984660488090, -0.338526032934932440, -0.338573080363062160, -0.338620126944758790, -0.338667172679905040, -0.338714217568383820, --0.338761261610076640, -0.338808304804866290, -0.338855347152635160, -0.338902388653265660, -0.338949429306640630, -0.338996469112641640, -0.339043508071151410, -0.339090546182052870, --0.339137583445227540, -0.339184619860558260, -0.339231655427927440, -0.339278690147217840, -0.339325724018311130, -0.339372757041090160, -0.339419789215437250, -0.339466820541235280, --0.339513851018365840, -0.339560880646711800, -0.339607909426155540, -0.339654937356579920, -0.339701964437866540, -0.339748990669898280, -0.339796016052557880, -0.339843040585727120, --0.339890064269288690, -0.339937087103125150, -0.339984109087119290, -0.340031130221152720, -0.340078150505108310, -0.340125169938868600, -0.340172188522316340, -0.340219206255333200, --0.340266223137802030, -0.340313239169605260, -0.340360254350625890, -0.340407268680745390, -0.340454282159846800, -0.340501294787812880, -0.340548306564525280, -0.340595317489866930, --0.340642327563720320, -0.340689336785967860, -0.340736345156492480, -0.340783352675175840, -0.340830359341900810, -0.340877365156550320, -0.340924370119005950, -0.340971374229150690, --0.341018377486866970, -0.341065379892037720, -0.341112381444544640, -0.341159382144270550, -0.341206381991098100, -0.341253380984910040, -0.341300379125588080, -0.341347376413015270, --0.341394372847073910, -0.341441368427647110, -0.341488363154616450, -0.341535357027864920, -0.341582350047275330, -0.341629342212729500, -0.341676333524110310, -0.341723323981300290, --0.341770313584181970, -0.341817302332638300, -0.341864290226550900, -0.341911277265802840, -0.341958263450276970, -0.342005248779855000, -0.342052233254419910, -0.342099216873854250, --0.342146199638040990, -0.342193181546861790, -0.342240162600199630, -0.342287142797937090, -0.342334122139957120, -0.342381100626141410, -0.342428078256372950, -0.342475055030534270, --0.342522030948508360, -0.342569006010176980, -0.342615980215423110, -0.342662953564129680, -0.342709926056178450, -0.342756897691452400, -0.342803868469834130, -0.342850838391206610, --0.342897807455451560, -0.342944775662451960, -0.342991743012090460, -0.343038709504250030, -0.343085675138812380, -0.343132639915660560, -0.343179603834677100, -0.343226566895745100, --0.343273529098746260, -0.343320490443563550, -0.343367450930080090, -0.343414410558177560, -0.343461369327739020, -0.343508327238647050, -0.343555284290784250, -0.343602240484033650, --0.343649195818277020, -0.343696150293397450, -0.343743103909277870, -0.343790056665800150, -0.343837008562847270, -0.343883959600301880, -0.343930909778047020, -0.343977859095964460, --0.344024807553937220, -0.344071755151847960, -0.344118701889579770, -0.344165647767014420, -0.344212592784034880, -0.344259536940523910, -0.344306480236364510, -0.344353422671438480, --0.344400364245628920, -0.344447304958818870, -0.344494244810890080, -0.344541183801725710, -0.344588121931208410, -0.344635059199220770, -0.344681995605645940, -0.344728931150365680, --0.344775865833263080, -0.344822799654221250, -0.344869732613121980, -0.344916664709848390, -0.344963595944283160, -0.345010526316309350, -0.345057455825808770, -0.345104384472664620, --0.345151312256759430, -0.345198239177976430, -0.345245165236197420, -0.345292090431305490, -0.345339014763183290, -0.345385938231713980, -0.345432860836779430, -0.345479782578262730, --0.345526703456047020, -0.345573623470014080, -0.345620542620047100, -0.345667460906028790, -0.345714378327842240, -0.345761294885369270, -0.345808210578493090, -0.345855125407096400, --0.345902039371062340, -0.345948952470272740, -0.345995864704610740, -0.346042776073959110, -0.346089686578200940, -0.346136596217218100, -0.346183504990893840, -0.346230412899111160, --0.346277319941752090, -0.346324226118699730, -0.346371131429836780, -0.346418035875045990, -0.346464939454210530, -0.346511842167212310, -0.346558744013934490, -0.346605644994260220, --0.346652545108071420, -0.346699444355251240, -0.346746342735682500, -0.346793240249248290, -0.346840136895830540, -0.346887032675312460, -0.346933927587576800, -0.346980821632506760, --0.347027714809984230, -0.347074607119892410, -0.347121498562114110, -0.347168389136532420, -0.347215278843029380, -0.347262167681488150, -0.347309055651791930, -0.347355942753822590, --0.347402828987463440, -0.347449714352597190, -0.347496598849106720, -0.347543482476875110, -0.347590365235784400, -0.347637247125717750, -0.347684128146558410, -0.347731008298188370, --0.347777887580490770, -0.347824765993348440, -0.347871643536644630, -0.347918520210261320, -0.347965396014081660, -0.348012270947988980, -0.348059145011865190, -0.348106018205593500, --0.348152890529056790, -0.348199761982137870, -0.348246632564719940, -0.348293502276684990, -0.348340371117916330, -0.348387239088297160, -0.348434106187709420, -0.348480972416036480, --0.348527837773161100, -0.348574702258966530, -0.348621565873334760, -0.348668428616149110, -0.348715290487292380, -0.348762151486647850, -0.348809011614097500, -0.348855870869524630, --0.348902729252812070, -0.348949586763843130, -0.348996443402499800, -0.349043299168665330, -0.349090154062223100, -0.349137008083055030, -0.349183861231044390, -0.349230713506074150, --0.349277564908027140, -0.349324415436786610, -0.349371265092234650, -0.349418113874254480, -0.349464961782729460, -0.349511808817541620, -0.349558654978574300, -0.349605500265710300, --0.349652344678832990, -0.349699188217824360, -0.349746030882567780, -0.349792872672946120, -0.349839713588842750, -0.349886553630139600, -0.349933392796720090, -0.349980231088467150, --0.350027068505263990, -0.350073905046992760, -0.350120740713536770, -0.350167575504779340, -0.350214409420602560, -0.350261242460889740, -0.350308074625523820, -0.350354905914387730, --0.350401736327364770, -0.350448565864337090, -0.350495394525187960, -0.350542222309800760, -0.350589049218057610, -0.350635875249841860, -0.350682700405036350, -0.350729524683524580, --0.350776348085188540, -0.350823170609911640, -0.350869992257577200, -0.350916813028067380, -0.350963632921265530, -0.351010451937054660, -0.351057270075317560, -0.351104087335937790, --0.351150903718797310, -0.351197719223779630, -0.351244533850768040, -0.351291347599644700, -0.351338160470292980, -0.351384972462595870, -0.351431783576436730, -0.351478593811697770, --0.351525403168262250, -0.351572211646013270, -0.351619019244834190, -0.351665825964607100, -0.351712631805215450, -0.351759436766542260, -0.351806240848470900, -0.351853044050883470, --0.351899846373663450, -0.351946647816694210, -0.351993448379857960, -0.352040248063038130, -0.352087046866117640, -0.352133844788979520, -0.352180641831507210, -0.352227437993582910, --0.352274233275090000, -0.352321027675911890, -0.352367821195930800, -0.352414613835030200, -0.352461405593093020, -0.352508196470002750, -0.352554986465641600, -0.352601775579892970, --0.352648563812639930, -0.352695351163765880, -0.352742137633152990, -0.352788923220684780, -0.352835707926244300, -0.352882491749714920, -0.352929274690978960, -0.352976056749919720, --0.353022837926420810, -0.353069618220364420, -0.353116397631633940, -0.353163176160112450, -0.353209953805683490, -0.353256730568229150, -0.353303506447633030, -0.353350281443778170, --0.353397055556547990, -0.353443828785824750, -0.353490601131492000, -0.353537372593432650, -0.353584143171530360, -0.353630912865667280, -0.353677681675726880, -0.353724449601592720, --0.353771216643147040, -0.353817982800273320, -0.353864748072854620, -0.353911512460774010, -0.353958275963915100, -0.354005038582160040, -0.354051800315392410, -0.354098561163495700, --0.354145321126352160, -0.354192080203845350, -0.354238838395858290, -0.354285595702274580, -0.354332352122976420, -0.354379107657847410, -0.354425862306770640, -0.354472616069629650, --0.354519368946306700, -0.354566120936685270, -0.354612872040648560, -0.354659622258080120, -0.354706371588862200, -0.354753120032878340, -0.354799867590012090, -0.354846614260145740, --0.354893360043162910, -0.354940104938946620, -0.354986848947380140, -0.355033592068346890, -0.355080334301729250, -0.355127075647410810, -0.355173816105275040, -0.355220555675204390, --0.355267294357082260, -0.355314032150791990, -0.355360769056217000, -0.355407505073239650, -0.355454240201743600, -0.355500974441611880, -0.355547707792728210, -0.355594440254974830, --0.355641171828235350, -0.355687902512392910, -0.355734632307331160, -0.355781361212932410, -0.355828089229080270, -0.355874816355658260, -0.355921542592548880, -0.355968267939635600, --0.356014992396801620, -0.356061715963930600, -0.356108438640904910, -0.356155160427608090, -0.356201881323923390, -0.356248601329734400, -0.356295320444923460, -0.356342038669374250, --0.356388756002969930, -0.356435472445594150, -0.356482187997129220, -0.356528902657458900, -0.356575616426466680, -0.356622329304035040, -0.356669041290047560, -0.356715752384387460, --0.356762462586938000, -0.356809171897582820, -0.356855880316204240, -0.356902587842686030, -0.356949294476911700, -0.356996000218763760, -0.357042705068125800, -0.357089409024881070, --0.357136112088913270, -0.357182814260104730, -0.357229515538339200, -0.357276215923499840, -0.357322915415470340, -0.357369614014133200, -0.357416311719371990, -0.357463008531069990, --0.357509704449110900, -0.357556399473377140, -0.357603093603752360, -0.357649786840120280, -0.357696479182363300, -0.357743170630365150, -0.357789861184009070, -0.357836550843178340, --0.357883239607756640, -0.357929927477626420, -0.357976614452671370, -0.358023300532775200, -0.358069985717820390, -0.358116670007690600, -0.358163353402269120, -0.358210035901439680, --0.358256717505084750, -0.358303398213088040, -0.358350078025332810, -0.358396756941702810, -0.358443434962080480, -0.358490112086349570, -0.358536788314393400, -0.358583463646095670, --0.358630138081338870, -0.358676811620006700, -0.358723484261982920, -0.358770156007150070, -0.358816826855391740, -0.358863496806591410, -0.358910165860632730, -0.358956834017398200, --0.359003501276771610, -0.359050167638636290, -0.359096833102875930, -0.359143497669373090, -0.359190161338011520, -0.359236824108674520, -0.359283485981245880, -0.359330146955608110, --0.359376807031644980, -0.359423466209240210, -0.359470124488276420, -0.359516781868637280, -0.359563438350206210, -0.359610093932866530, -0.359656748616501990, -0.359703402400995240, --0.359750055286229940, -0.359796707272089900, -0.359843358358457710, -0.359890008545217130, -0.359936657832251540, -0.359983306219444690, -0.360029953706679170, -0.360076600293838760, --0.360123245980806860, -0.360169890767467250, -0.360216534653702460, -0.360263177639396410, -0.360309819724432380, -0.360356460908694220, -0.360403101192064480, -0.360449740574426970, --0.360496379055665560, -0.360543016635662790, -0.360589653314302430, -0.360636289091468000, -0.360682923967042820, -0.360729557940910720, -0.360776191012954330, -0.360822823183057470, --0.360869454451103970, -0.360916084816976460, -0.360962714280558650, -0.361009342841734140, -0.361055970500386620, -0.361102597256398760, -0.361149223109654470, -0.361195848060037460, --0.361242472107430490, -0.361289095251717260, -0.361335717492781370, -0.361382338830506130, -0.361428959264775470, -0.361475578795472040, -0.361522197422479600, -0.361568815145682120, --0.361615431964962210, -0.361662047880203670, -0.361708662891290060, -0.361755276998105170, -0.361801890200531660, -0.361848502498453460, -0.361895113891753990, -0.361941724380317130, --0.361988333964025580, -0.362034942642763150, -0.362081550416413430, -0.362128157284860200, -0.362174763247986140, -0.362221368305675250, -0.362267972457811280, -0.362314575704277000, --0.362361178044956270, -0.362407779479732630, -0.362454380008489510, -0.362500979631110830, -0.362547578347479300, -0.362594176157478850, -0.362640773060993350, -0.362687369057905550, --0.362733964148099270, -0.362780558331458110, -0.362827151607865940, -0.362873743977205510, -0.362920335439360700, -0.362966925994215090, -0.363013515641652520, -0.363060104381555780, --0.363106692213808810, -0.363153279138295040, -0.363199865154898550, -0.363246450263501940, -0.363293034463989200, -0.363339617756244350, -0.363386200140150000, -0.363432781615590120, --0.363479362182448310, -0.363525941840608100, -0.363572520589953490, -0.363619098430367100, -0.363665675361733000, -0.363712251383935090, -0.363758826496856150, -0.363805400700380200, --0.363851973994390680, -0.363898546378771670, -0.363945117853405890, -0.363991688418177250, -0.364038258072969860, -0.364084826817666410, -0.364131394652150890, -0.364177961576306890, --0.364224527590018000, -0.364271092693168150, -0.364317656885640220, -0.364364220167318060, -0.364410782538085840, -0.364457343997826260, -0.364503904546423290, -0.364550464183760530, --0.364597022909722070, -0.364643580724190560, -0.364690137627050210, -0.364736693618184450, -0.364783248697477360, -0.364829802864811760, -0.364876356120071690, -0.364922908463140680, --0.364969459893902840, -0.365016010412240910, -0.365062560018038940, -0.365109108711181020, -0.365155656491549910, -0.365202203359029640, -0.365248749313503870, -0.365295294354856250, --0.365341838482970750, -0.365388381697730300, -0.365434923999018890, -0.365481465386720550, -0.365528005860718150, -0.365574545420895740, -0.365621084067137000, -0.365667621799325880, --0.365714158617345350, -0.365760694521079450, -0.365807229510411780, -0.365853763585226420, -0.365900296745406250, -0.365946828990835360, -0.365993360321397400, -0.366039890736976460, --0.366086420237455360, -0.366132948822718180, -0.366179476492649090, -0.366226003247130890, -0.366272529086047680, -0.366319054009283110, -0.366365578016721370, -0.366412101108245240, --0.366458623283738900, -0.366505144543085970, -0.366551664886170580, -0.366598184312875610, -0.366644702823085200, -0.366691220416683060, -0.366737737093553230, -0.366784252853578690, --0.366830767696643470, -0.366877281622631780, -0.366923794631426440, -0.366970306722911640, -0.367016817896971050, -0.367063328153488470, -0.367109837492347930, -0.367156345913432380, --0.367202853416626010, -0.367249360001812910, -0.367295865668875950, -0.367342370417699350, -0.367388874248166850, -0.367435377160162560, -0.367481879153569450, -0.367528380228271560, --0.367574880384152760, -0.367621379621097200, -0.367667877938987750, -0.367714375337708620, -0.367760871817143560, -0.367807367377176730, -0.367853862017691050, -0.367900355738570720, --0.367946848539699890, -0.367993340420961550, -0.368039831382239890, -0.368086321423418570, -0.368132810544381520, -0.368179298745012820, -0.368225786025195510, -0.368272272384813690, --0.368318757823751620, -0.368365242341892220, -0.368411725939119750, -0.368458208615317920, -0.368504690370371040, -0.368551171204161980, -0.368597651116575000, -0.368644130107493860, --0.368690608176802880, -0.368737085324384930, -0.368783561550124260, -0.368830036853904700, -0.368876511235610440, -0.368922984695124470, -0.368969457232331100, -0.369015928847114480, --0.369062399539357600, -0.369108869308944710, -0.369155338155759680, -0.369201806079686720, -0.369248273080608810, -0.369294739158410270, -0.369341204312974790, -0.369387668544186810, --0.369434131851929190, -0.369480594236086260, -0.369527055696541820, -0.369573516233180190, -0.369619975845884300, -0.369666434534538510, -0.369712892299027040, -0.369759349139232920, --0.369805805055040460, -0.369852260046333480, -0.369898714112995800, -0.369945167254911830, -0.369991619471964460, -0.370038070764038050, -0.370084521131016920, -0.370130970572784050, --0.370177419089223750, -0.370223866680219890, -0.370270313345656740, -0.370316759085417500, -0.370363203899386260, -0.370409647787447060, -0.370456090749484160, -0.370502532785380590, --0.370548973895020730, -0.370595414078288390, -0.370641853335067940, -0.370688291665242480, -0.370734729068696260, -0.370781165545313650, -0.370827601094977700, -0.370874035717572710, --0.370920469412982680, -0.370966902181091460, -0.371013334021783440, -0.371059764934941580, -0.371106194920450380, -0.371152623978194100, -0.371199052108055820, -0.371245479309919910, --0.371291905583670310, -0.371338330929191380, -0.371384755346366220, -0.371431178835079150, -0.371477601395214130, -0.371524023026655490, -0.371570443729286440, -0.371616863502991220, --0.371663282347653890, -0.371709700263158750, -0.371756117249388950, -0.371802533306228870, -0.371848948433562810, -0.371895362631274040, -0.371941775899246820, -0.371988188237365180, --0.372034599645513440, -0.372081010123574860, -0.372127419671433700, -0.372173828288974000, -0.372220235976080170, -0.372266642732635320, -0.372313048558523870, -0.372359453453629750, --0.372405857417837490, -0.372452260451030140, -0.372498662553092110, -0.372545063723907890, -0.372591463963360570, -0.372637863271334580, -0.372684261647713900, -0.372730659092382620, --0.372777055605225120, -0.372823451186124530, -0.372869845834965300, -0.372916239551631890, -0.372962632336007460, -0.373009024187976490, -0.373055415107422910, -0.373101805094231240, --0.373148194148284600, -0.373194582269467500, -0.373240969457664000, -0.373287355712758400, -0.373333741034634070, -0.373380125423175340, -0.373426508878266280, -0.373472891399791400, --0.373519272987633880, -0.373565653641678150, -0.373612033361808700, -0.373658412147908790, -0.373704789999862840, -0.373751166917554890, -0.373797542900869030, -0.373843917949689740, --0.373890292063900230, -0.373936665243385040, -0.373983037488028520, -0.374029408797714070, -0.374075779172326040, -0.374122148611748580, -0.374168517115866130, -0.374214884684562040, --0.374261251317720700, -0.374307617015226250, -0.374353981776963110, -0.374400345602814650, -0.374446708492665370, -0.374493070446399230, -0.374539431463900900, -0.374585791545053560, --0.374632150689741710, -0.374678508897849930, -0.374724866169261430, -0.374771222503860800, -0.374817577901532140, -0.374863932362159870, -0.374910285885627410, -0.374956638471819200, --0.375002990120619440, -0.375049340831912600, -0.375095690605581960, -0.375142039441512140, -0.375188387339587200, -0.375234734299691730, -0.375281080321708980, -0.375327425405523550, --0.375373769551019980, -0.375420112758081510, -0.375466455026592820, -0.375512796356437970, -0.375559136747501130, -0.375605476199666890, -0.375651814712818500, -0.375698152286840610, --0.375744488921617710, -0.375790824617033230, -0.375837159372971630, -0.375883493189317190, -0.375929826065954380, -0.375976158002766630, -0.376022488999638470, -0.376068819056454060, --0.376115148173098050, -0.376161476349453740, -0.376207803585405790, -0.376254129880838280, -0.376300455235635880, -0.376346779649681880, -0.376393103122861010, -0.376439425655057720, --0.376485747246155520, -0.376532067896038880, -0.376578387604592110, -0.376624706371699370, -0.376671024197245300, -0.376717341081113210, -0.376763657023187810, -0.376809972023353700, --0.376856286081494190, -0.376902599197493970, -0.376948911371237260, -0.376995222602608700, -0.377041532891491670, -0.377087842237770810, -0.377134150641330770, -0.377180458102054920, --0.377226764619827900, -0.377273070194533990, -0.377319374826057430, -0.377365678514282820, -0.377411981259093590, -0.377458283060374430, -0.377504583918009950, -0.377550883831883620, --0.377597182801880090, -0.377643480827883570, -0.377689777909778810, -0.377736074047449130, -0.377782369240779290, -0.377828663489653550, -0.377874956793956550, -0.377921249153571730, --0.377967540568383830, -0.378013831038277020, -0.378060120563136090, -0.378106409142844440, -0.378152696777286750, -0.378198983466347730, -0.378245269209910860, -0.378291554007860800, --0.378337837860081850, -0.378384120766458330, -0.378430402726874890, -0.378476683741215070, -0.378522963809363510, -0.378569242931204970, -0.378615521106622890, -0.378661798335502060, --0.378708074617726650, -0.378754349953181520, -0.378800624341750100, -0.378846897783317090, -0.378893170277766870, -0.378939441824984120, -0.378985712424852350, -0.379031982077256360, --0.379078250782080350, -0.379124518539209140, -0.379170785348526220, -0.379217051209916330, -0.379263316123264250, -0.379309580088453450, -0.379355843105368680, -0.379402105173894330, --0.379448366293915100, -0.379494626465314570, -0.379540885687977450, -0.379587143961788160, -0.379633401286631370, -0.379679657662390700, -0.379725913088950870, -0.379772167566196250, --0.379818421094011650, -0.379864673672280610, -0.379910925300887830, -0.379957175979718180, -0.380003425708655140, -0.380049674487583590, -0.380095922316387780, -0.380142169194952250, --0.380188415123161650, -0.380234660100899620, -0.380280904128050930, -0.380327147204500390, -0.380373389330131590, -0.380419630504829350, -0.380465870728477980, -0.380512110000962360, --0.380558348322166060, -0.380604585691973860, -0.380650822110270240, -0.380697057576939950, -0.380743292091866580, -0.380789525654935010, -0.380835758266029610, -0.380881989925035250, --0.380928220631835510, -0.380974450386315220, -0.381020679188359190, -0.381066907037851070, -0.381113133934675660, -0.381159359878717410, -0.381205584869860780, -0.381251808907990600, --0.381298031992990500, -0.381344254124745260, -0.381390475303139850, -0.381436695528057870, -0.381482914799384070, -0.381529133117003040, -0.381575350480799600, -0.381621566890657290, --0.381667782346461150, -0.381713996848095540, -0.381760210395445330, -0.381806422988394180, -0.381852634626826950, -0.381898845310628180, -0.381945055039682680, -0.381991263813874160, --0.382037471633087430, -0.382083678497207480, -0.382129884406117950, -0.382176089359703650, -0.382222293357849130, -0.382268496400439310, -0.382314698487357830, -0.382360899618489570, --0.382407099793719120, -0.382453299012931290, -0.382499497276009850, -0.382545694582839600, -0.382591890933305150, -0.382638086327291400, -0.382684280764682030, -0.382730474245361940, --0.382776666769216070, -0.382822858336128110, -0.382869048945983000, -0.382915238598665280, -0.382961427294059460, -0.383007615032050500, -0.383053801812522080, -0.383099987635359180, --0.383146172500446690, -0.383192356407668360, -0.383238539356909160, -0.383284721348053580, -0.383330902380986660, -0.383377082455592040, -0.383423261571754710, -0.383469439729359210, --0.383515616928290560, -0.383561793168432420, -0.383607968449669820, -0.383654142771887310, -0.383700316134969850, -0.383746488538801170, -0.383792659983266280, -0.383838830468250130, --0.383884999993636510, -0.383931168559310420, -0.383977336165156390, -0.384023502811058960, -0.384069668496903270, -0.384115833222572980, -0.384161996987953060, -0.384208159792928610, --0.384254321637383320, -0.384300482521202250, -0.384346642444269910, -0.384392801406471470, -0.384438959407690570, -0.384485116447812250, -0.384531272526721150, -0.384577427644302310, --0.384623581800439480, -0.384669734995017660, -0.384715887227921550, -0.384762038499036120, -0.384808188808245130, -0.384854338155433740, -0.384900486540486860, -0.384946633963288430, --0.384992780423723370, -0.385038925921676320, -0.385085070457032440, -0.385131214029675430, -0.385177356639490380, -0.385223498286361930, -0.385269638970175190, -0.385315778690813900, --0.385361917448163170, -0.385408055242107640, -0.385454192072532400, -0.385500327939321320, -0.385546462842359330, -0.385592596781531630, -0.385638729756722030, -0.385684861767815630, --0.385730992814697030, -0.385777122897250970, -0.385823252015362550, -0.385869380168915530, -0.385915507357795060, -0.385961633581886290, -0.386007758841072970, -0.386053883135240310, --0.386100006464272890, -0.386146128828055880, -0.386192250226473130, -0.386238370659409750, -0.386284490126750480, -0.386330608628380370, -0.386376726164183340, -0.386422842734044480, --0.386468958337848500, -0.386515072975480540, -0.386561186646824540, -0.386607299351765520, -0.386653411090188690, -0.386699521861977870, -0.386745631667018310, -0.386791740505194660, --0.386837848376391620, -0.386883955280494410, -0.386930061217386880, -0.386976166186954180, -0.387022270189081530, -0.387068373223652730, -0.387114475290553040, -0.387160576389667170, --0.387206676520880260, -0.387252775684076230, -0.387298873879140250, -0.387344971105957110, -0.387391067364411980, -0.387437162654388710, -0.387483256975772570, -0.387529350328448260, --0.387575442712301040, -0.387621534127214780, -0.387667624573074630, -0.387713714049765900, -0.387759802557172460, -0.387805890095179460, -0.387851976663671830, -0.387898062262534590, --0.387944146891651800, -0.387990230550908640, -0.388036313240189950, -0.388082394959380850, -0.388128475708365340, -0.388174555487028670, -0.388220634295255610, -0.388266712132931350, --0.388312788999939930, -0.388358864896166500, -0.388404939821496320, -0.388451013775813430, -0.388497086759002960, -0.388543158770949800, -0.388589229811538710, -0.388635299880654980, --0.388681368978182620, -0.388727437104006810, -0.388773504258012770, -0.388819570440084640, -0.388865635650107510, -0.388911699887966370, -0.388957763153546350, -0.389003825446731510, --0.389049886767407090, -0.389095947115457970, -0.389142006490769410, -0.389188064893225380, -0.389234122322711210, -0.389280178779111750, -0.389326234262312280, -0.389372288772196760, --0.389418342308650520, -0.389464394871558870, -0.389510446460805790, -0.389556497076276600, -0.389602546717856160, -0.389648595385429400, -0.389694643078881520, -0.389740689798096620, --0.389786735542960010, -0.389832780313357000, -0.389878824109171570, -0.389924866930289100, -0.389970908776594460, -0.390016949647973010, -0.390062989544308740, -0.390109028465486950, --0.390155066411393080, -0.390201103381911050, -0.390247139376926340, -0.390293174396323720, -0.390339208439988210, -0.390385241507805070, -0.390431273599658460, -0.390477304715433570, --0.390523334855015890, -0.390569364018289460, -0.390615392205139630, -0.390661419415451290, -0.390707445649109860, -0.390753470905999380, -0.390799495186005210, -0.390845518489012280, --0.390891540814906010, -0.390937562163570450, -0.390983582534891020, -0.391029601928752580, -0.391075620345040620, -0.391121637783639120, -0.391167654244433560, -0.391213669727309310, --0.391259684232150410, -0.391305697758842330, -0.391351710307270010, -0.391397721877318420, -0.391443732468872930, -0.391489742081817690, -0.391535750716038080, -0.391581758371419510, --0.391627765047846190, -0.391673770745203380, -0.391719775463376220, -0.391765779202249980, -0.391811781961708900, -0.391857783741638320, -0.391903784541923320, -0.391949784362449320, --0.391995783203100360, -0.392041781063761970, -0.392087777944319150, -0.392133773844657310, -0.392179768764660600, -0.392225762704214440, -0.392271755663204320, -0.392317747641514390, --0.392363738639030070, -0.392409728655636450, -0.392455717691218450, -0.392501705745661620, -0.392547692818850100, -0.392593678910669320, -0.392639664021004810, -0.392685648149740660, --0.392731631296762470, -0.392777613461955170, -0.392823594645204220, -0.392869574846393840, -0.392915554065409620, -0.392961532302136870, -0.393007509556459860, -0.393053485828264100, --0.393099461117434660, -0.393145435423856550, -0.393191408747415210, -0.393237381087995000, -0.393283352445481290, -0.393329322819759630, -0.393375292210714270, -0.393421260618230680, --0.393467228042193920, -0.393513194482489500, -0.393559159939001700, -0.393605124411615990, -0.393651087900217470, -0.393697050404691610, -0.393743011924922730, -0.393788972460796360, --0.393834932012197490, -0.393880890579011770, -0.393926848161123390, -0.393972804758417890, -0.394018760370780760, -0.394064714998096370, -0.394110668640250130, -0.394156621297127250, --0.394202572968612830, -0.394248523654592400, -0.394294473354950210, -0.394340422069571870, -0.394386369798342850, -0.394432316541147520, -0.394478262297871420, -0.394524207068399630, --0.394570150852617760, -0.394616093650410060, -0.394662035461662180, -0.394707976286259200, -0.394753916124086670, -0.394799854975028900, -0.394845792838971590, -0.394891729715799720, --0.394937665605398950, -0.394983600507653630, -0.395029534422449310, -0.395075467349671530, -0.395121399289204700, -0.395167330240934370, -0.395213260204745680, -0.395259189180524270, --0.395305117168154470, -0.395351044167521930, -0.395396970178511720, -0.395442895201009500, -0.395488819234899700, -0.395534742280067800, -0.395580664336399050, -0.395626585403779040, --0.395672505482092150, -0.395718424571224030, -0.395764342671060200, -0.395810259781485150, -0.395856175902384420, -0.395902091033643270, -0.395948005175146890, -0.395993918326780940, --0.396039830488429720, -0.396085741659979010, -0.396131651841314270, -0.396177561032320050, -0.396223469232881880, -0.396269376442885070, -0.396315282662215220, -0.396361187890756750, --0.396407092128395310, -0.396452995375016160, -0.396498897630504940, -0.396544798894746030, -0.396590699167625130, -0.396636598449027490, -0.396682496738838760, -0.396728394036943380, --0.396774290343227030, -0.396820185657575320, -0.396866079979872780, -0.396911973310005000, -0.396957865647857340, -0.397003756993314970, -0.397049647346263630, -0.397095536706587760, --0.397141425074173100, -0.397187312448905210, -0.397233198830668650, -0.397279084219349150, -0.397324968614831910, -0.397370852017002620, -0.397416734425745820, -0.397462615840947160, --0.397508496262492020, -0.397554375690265970, -0.397600254124153620, -0.397646131564040610, -0.397692008009812300, -0.397737883461354360, -0.397783757918551310, -0.397829631381288850, --0.397875503849452750, -0.397921375322927480, -0.397967245801598760, -0.398013115285351940, -0.398058983774072670, -0.398104851267645610, -0.398150717765956400, -0.398196583268890400, --0.398242447776333330, -0.398288311288169770, -0.398334173804285370, -0.398380035324565620, -0.398425895848896150, -0.398471755377161510, -0.398517613909247500, -0.398563471445039840, --0.398609327984423110, -0.398655183527283070, -0.398701038073505100, -0.398746891622974500, -0.398792744175577090, -0.398838595731197400, -0.398884446289721200, -0.398930295851034340, --0.398976144415021330, -0.399021991981567900, -0.399067838550559550, -0.399113684121881970, -0.399159528695419820, -0.399205372271058790, -0.399251214848684370, -0.399297056428182310, --0.399342897009437200, -0.399388736592334870, -0.399434575176760680, -0.399480412762600430, -0.399526249349738790, -0.399572084938061510, -0.399617919527454400, -0.399663753117802110, --0.399709585708990460, -0.399755417300904800, -0.399801247893430630, -0.399847077486453760, -0.399892906079858720, -0.399938733673531500, -0.399984560267357790, -0.400030385861222300, --0.400076210455010850, -0.400122034048608850, -0.400167856641902190, -0.400213678234775490, -0.400259498827114590, -0.400305318418804900, -0.400351137009732350, -0.400396954599781580, --0.400442771188838420, -0.400488586776788280, -0.400534401363517150, -0.400580214948909550, -0.400626027532851430, -0.400671839115228630, -0.400717649695925880, -0.400763459274828980, --0.400809267851823410, -0.400855075426795100, -0.400900881999628700, -0.400946687570210070, -0.400992492138424750, -0.401038295704158610, -0.401084098267296300, -0.401129899827723730, --0.401175700385326460, -0.401221499939990290, -0.401267298491600030, -0.401313096040041450, -0.401358892585200580, -0.401404688126962060, -0.401450482665211830, -0.401496276199835410, --0.401542068730718240, -0.401587860257746340, -0.401633650780804430, -0.401679440299778310, -0.401725228814554080, -0.401771016325016330, -0.401816802831051030, -0.401862588332543740, --0.401908372829380360, -0.401954156321445650, -0.401999938808625560, -0.402045720290805600, -0.402091500767871760, -0.402137280239708790, -0.402183058706202580, -0.402228836167238760, --0.402274612622703250, -0.402320388072480770, -0.402366162516457350, -0.402411935954518910, -0.402457708386550210, -0.402503479812437280, -0.402549250232065610, -0.402595019645320850, --0.402640788052088970, -0.402686555452254680, -0.402732321845703960, -0.402778087232322890, -0.402823851611996190, -0.402869614984609880, -0.402915377350049510, -0.402961138708201110, --0.403006899058949430, -0.403052658402180520, -0.403098416737780410, -0.403144174065633800, -0.403189930385626780, -0.403235685697644900, -0.403281440001573840, -0.403327193297299600, --0.403372945584706930, -0.403418696863681920, -0.403464447134110560, -0.403510196395877710, -0.403555944648869350, -0.403601691892971130, -0.403647438128069080, -0.403693183354048020, --0.403738927570793990, -0.403784670778192690, -0.403830412976130090, -0.403876154164491070, -0.403921894343161610, -0.403967633512027470, -0.404013371670974620, -0.404059108819887990, --0.404104844958653510, -0.404150580087157370, -0.404196314205284400, -0.404242047312920570, -0.404287779409951700, -0.404333510496263320, -0.404379240571741630, -0.404424969636271390, --0.404470697689738700, -0.404516424732029760, -0.404562150763029260, -0.404607875782623420, -0.404653599790697930, -0.404699322787138770, -0.404745044771830930, -0.404790765744660500, --0.404836485705513170, -0.404882204654274990, -0.404927922590830880, -0.404973639515066990, -0.405019355426869010, -0.405065070326123040, -0.405110784212713960, -0.405156497086527960, --0.405202208947451130, -0.405247919795368340, -0.405293629630165740, -0.405339338451729090, -0.405385046259944090, -0.405430753054696890, -0.405476458835872410, -0.405522163603356740, --0.405567867357036150, -0.405613570096795380, -0.405659271822520760, -0.405704972534097930, -0.405750672231413090, -0.405796370914351170, -0.405842068582798310, -0.405887765236640660, --0.405933460875763210, -0.405979155500052090, -0.406024849109393130, -0.406070541703672020, -0.406116233282774960, -0.406161923846586890, -0.406207613394994060, -0.406253301927882560, --0.406298989445137430, -0.406344675946644810, -0.406390361432290510, -0.406436045901960700, -0.406481729355540390, -0.406527411792915740, -0.406573093213972560, -0.406618773618597050, --0.406664453006674200, -0.406710131378090260, -0.406755808732730930, -0.406801485070482530, -0.406847160391229980, -0.406892834694859540, -0.406938507981257410, -0.406984180250308640, --0.407029851501899350, -0.407075521735915490, -0.407121190952242810, -0.407166859150767560, -0.407212526331374780, -0.407258192493950620, -0.407303857638381450, -0.407349521764552190, --0.407395184872349160, -0.407440846961658170, -0.407486508032365410, -0.407532168084356050, -0.407577827117516220, -0.407623485131731800, -0.407669142126889150, -0.407714798102873200, --0.407760453059570260, -0.407806106996866150, -0.407851759914647230, -0.407897411812798480, -0.407943062691206170, -0.407988712549756660, -0.408034361388334930, -0.408080009206827350, --0.408125656005119690, -0.408171301783098290, -0.408216946540648270, -0.408262590277655880, -0.408308232994006980, -0.408353874689587950, -0.408399515364283820, -0.408445155017980900, --0.408490793650565060, -0.408536431261922680, -0.408582067851938790, -0.408627703420499750, -0.408673337967491830, -0.408718971492800180, -0.408764603996311090, -0.408810235477910510, --0.408855865937484300, -0.408901495374918880, -0.408947123790099290, -0.408992751182911900, -0.409038377553243020, -0.409084002900977790, -0.409129627226002600, -0.409175250528203300, --0.409220872807466270, -0.409266494063676710, -0.409312114296720870, -0.409357733506484740, -0.409403351692854690, -0.409448968855715860, -0.409494584994954610, -0.409540200110456890, --0.409585814202109100, -0.409631427269796340, -0.409677039313405040, -0.409722650332821510, -0.409768260327930960, -0.409813869298619790, -0.409859477244773900, -0.409905084166279350, --0.409950690063022480, -0.409996294934888480, -0.410041898781763780, -0.410087501603534690, -0.410133103400086460, -0.410178704171305470, -0.410224303917077760, -0.410269902637289630, --0.410315500331826340, -0.410361097000574330, -0.410406692643419610, -0.410452287260248520, -0.410497880850946300, -0.410543473415399370, -0.410589064953493790, -0.410634655465115960, --0.410680244950151040, -0.410725833408485560, -0.410771420840005840, -0.410817007244597240, -0.410862592622146080, -0.410908176972538450, -0.410953760295660770, -0.410999342591398250, --0.411044923859637420, -0.411090504100264260, -0.411136083313165260, -0.411181661498225660, -0.411227238655331890, -0.411272814784370060, -0.411318389885226510, -0.411363963957786630, --0.411409537001936890, -0.411455109017563660, -0.411500680004552260, -0.411546249962789160, -0.411591818892160400, -0.411637386792552130, -0.411682953663850830, -0.411728519505941690, --0.411774084318711260, -0.411819648102046020, -0.411865210855831280, -0.411910772579953510, -0.411956333274298760, -0.412001892938753670, -0.412047451573203380, -0.412093009177534440, --0.412138565751633050, -0.412184121295385620, -0.412229675808677480, -0.412275229291395100, -0.412320781743424680, -0.412366333164652770, -0.412411883554964550, -0.412457432914246640, --0.412502981242385550, -0.412548528539266660, -0.412594074804776390, -0.412639620038800950, -0.412685164241226420, -0.412730707411939460, -0.412776249550825260, -0.412821790657770470, --0.412867330732661570, -0.412912869775383990, -0.412958407785824210, -0.413003944763868420, -0.413049480709403170, -0.413095015622313820, -0.413140549502486910, -0.413186082349808640, --0.413231614164165590, -0.413277144945443040, -0.413322674693527680, -0.413368203408305600, -0.413413731089663450, -0.413459257737486600, -0.413504783351661520, -0.413550307932074920, --0.413595831478612170, -0.413641353991159810, -0.413686875469604090, -0.413732395913831600, -0.413777915323727650, -0.413823433699178960, -0.413868951040071710, -0.413914467346292450, --0.413959982617726600, -0.414005496854260800, -0.414051010055781320, -0.414096522222174630, -0.414142033353326330, -0.414187543449122840, -0.414233052509450970, -0.414278560534196040, --0.414324067523244740, -0.414369573476483230, -0.414415078393797760, -0.414460582275075100, -0.414506085120200480, -0.414551586929060690, -0.414597087701542360, -0.414642587437530850, --0.414688086136912880, -0.414733583799574760, -0.414779080425403010, -0.414824576014283190, -0.414870070566101920, -0.414915564080745480, -0.414961056558100560, -0.415006547998052530, --0.415052038400488210, -0.415097527765293740, -0.415143016092355880, -0.415188503381560050, -0.415233989632792950, -0.415279474845941350, -0.415324959020890620, -0.415370442157527440, --0.415415924255738260, -0.415461405315409200, -0.415506885336427050, -0.415552364318677260, -0.415597842262046550, -0.415643319166421670, -0.415688795031688100, -0.415734269857732490, --0.415779743644441260, -0.415825216391701060, -0.415870688099397420, -0.415916158767417050, -0.415961628395646650, -0.416007096983971870, -0.416052564532279230, -0.416098031040455290, --0.416143496508386220, -0.416188960935958810, -0.416234424323058570, -0.416279886669572330, -0.416325347975386730, -0.416370808240387360, -0.416416267464460980, -0.416461725647493950, --0.416507182789372990, -0.416552638889983670, -0.416598093949212770, -0.416643547966946640, -0.416689000943071990, -0.416734452877474460, -0.416779903770040820, -0.416825353620657420, --0.416870802429211040, -0.416916250195587200, -0.416961696919672780, -0.417007142601354520, -0.417052587240518020, -0.417098030837049990, -0.417143473390836960, -0.417188914901765180, --0.417234355369721530, -0.417279794794591650, -0.417325233176262190, -0.417370670514620120, -0.417416106809550940, -0.417461542060941490, -0.417506976268678220, -0.417552409432647880, --0.417597841552736100, -0.417643272628829780, -0.417688702660815200, -0.417734131648579310, -0.417779559592007690, -0.417824986490987150, -0.417870412345404170, -0.417915837155145520, --0.417961260920096890, -0.418006683640145150, -0.418052105315177060, -0.418097525945078320, -0.418142945529735800, -0.418188364069035870, -0.418233781562865000, -0.418279198011110130, --0.418324613413656840, -0.418370027770392060, -0.418415441081202600, -0.418460853345974100, -0.418506264564593500, -0.418551674736947210, -0.418597083862922160, -0.418642491942403940, --0.418687898975279580, -0.418733304961435790, -0.418778709900758380, -0.418824113793134220, -0.418869516638449730, -0.418914918436591450, -0.418960319187446310, -0.419005718890899990, --0.419051117546839320, -0.419096515155151280, -0.419141911715721520, -0.419187307228437000, -0.419232701693184220, -0.419278095109850090, -0.419323487478320320, -0.419368878798481840, --0.419414269070221170, -0.419459658293425190, -0.419505046467979700, -0.419550433593771530, -0.419595819670687380, -0.419641204698613990, -0.419686588677437240, -0.419731971607044010, --0.419777353487321260, -0.419822734318154700, -0.419868114099431310, -0.419913492831037630, -0.419958870512860240, -0.420004247144786070, -0.420049622726700820, -0.420094997258491590, --0.420140370740045230, -0.420185743171247570, -0.420231114551985530, -0.420276484882145750, -0.420321854161615100, -0.420367222390279460, -0.420412589568025740, -0.420457955694740540, --0.420503320770310830, -0.420548684794622480, -0.420594047767562370, -0.420639409689017140, -0.420684770558873820, -0.420730130377018170, -0.420775489143337180, -0.420820846857717870, --0.420866203520046000, -0.420911559130208670, -0.420956913688092460, -0.421002267193584300, -0.421047619646570110, -0.421092971046936880, -0.421138321394571250, -0.421183670689360190, --0.421229018931189520, -0.421274366119946340, -0.421319712255517230, -0.421365057337789230, -0.421410401366648200, -0.421455744341981190, -0.421501086263675160, -0.421546427131616050, --0.421591766945690890, -0.421637105705786270, -0.421682443411788950, -0.421727780063585860, -0.421773115661062960, -0.421818450204107240, -0.421863783692605850, -0.421909116126444550, --0.421954447505510480, -0.421999777829690280, -0.422045107098871000, -0.422090435312938610, -0.422135762471780080, -0.422181088575282190, -0.422226413623331960, -0.422271737615815320, --0.422317060552619310, -0.422362382433630670, -0.422407703258736440, -0.422453023027822620, -0.422498341740776160, -0.422543659397484280, -0.422588975997832850, -0.422634291541709010, --0.422679606028999400, -0.422724919459590790, -0.422770231833370260, -0.422815543150223790, -0.422860853410038430, -0.422906162612701360, -0.422951470758098470, -0.422996777846116890, --0.423042083876643380, -0.423087388849565090, -0.423132692764767890, -0.423177995622138980, -0.423223297421565060, -0.423268598162933330, -0.423313897846129660, -0.423359196471041310, --0.423404494037554920, -0.423449790545557700, -0.423495085994935570, -0.423540380385575790, -0.423585673717365440, -0.423630965990190460, -0.423676257203938140, -0.423721547358495100, --0.423766836453748630, -0.423812124489584720, -0.423857411465890400, -0.423902697382552600, -0.423947982239458510, -0.423993266036494010, -0.424038548773546300, -0.424083830450502300, --0.424129111067249100, -0.424174390623672680, -0.424219669119660300, -0.424264946555099160, -0.424310222929875300, -0.424355498243875810, -0.424400772496987600, -0.424446045689097500, --0.424491317820092640, -0.424536588889859070, -0.424581858898284090, -0.424627127845254800, -0.424672395730657350, -0.424717662554378870, -0.424762928316306240, -0.424808193016326660, --0.424853456654326220, -0.424898719230192180, -0.424943980743811290, -0.424989241195070870, -0.425034500583856940, -0.425079758910056780, -0.425125016173557190, -0.425170272374245480, --0.425215527512007700, -0.425260781586731080, -0.425306034598302910, -0.425351286546609250, -0.425396537431537380, -0.425441787252974160, -0.425487036010806510, -0.425532283704921630, --0.425577530335205680, -0.425622775901545850, -0.425668020403829510, -0.425713263841942690, -0.425758506215772770, -0.425803747525206560, -0.425848987770131360, -0.425894226950433270, --0.425939465065999670, -0.425984702116717350, -0.426029938102473750, -0.426075173023154840, -0.426120406878648050, -0.426165639668840190, -0.426210871393618680, -0.426256102052869570, --0.426301331646480150, -0.426346560174337860, -0.426391787636328790, -0.426437014032340190, -0.426482239362259100, -0.426527463625972820, -0.426572686823367460, -0.426617908954330380, --0.426663130018748560, -0.426708350016509250, -0.426753568947498720, -0.426798786811604270, -0.426844003608712830, -0.426889219338711770, -0.426934434001487280, -0.426979647596926690, --0.427024860124917420, -0.427070071585345550, -0.427115281978098500, -0.427160491303063270, -0.427205699560126830, -0.427250906749176540, -0.427296112870098550, -0.427341317922780290, --0.427386521907109130, -0.427431724822971320, -0.427476926670254110, -0.427522127448844660, -0.427567327158630270, -0.427612525799497160, -0.427657723371332680, -0.427702919874023980, --0.427748115307458320, -0.427793309671521960, -0.427838502966102370, -0.427883695191086540, -0.427928886346361840, -0.427974076431814510, -0.428019265447331990, -0.428064453392801750, --0.428109640268109940, -0.428154826073144030, -0.428200010807791080, -0.428245194471938100, -0.428290377065472520, -0.428335558588280600, -0.428380739040249760, -0.428425918421267480, --0.428471096731220020, -0.428516273969994810, -0.428561450137478930, -0.428606625233559860, -0.428651799258123740, -0.428696972211058180, -0.428742144092250200, -0.428787314901587220, --0.428832484638955570, -0.428877653304242710, -0.428922820897335690, -0.428967987418122090, -0.429013152866488060, -0.429058317242321130, -0.429103480545508840, -0.429148642775937450, --0.429193803933494490, -0.429238964018066940, -0.429284123029542440, -0.429329280967807200, -0.429374437832748810, -0.429419593624254250, -0.429464748342211160, -0.429509901986505790, --0.429555054557025640, -0.429600206053657900, -0.429645356476289990, -0.429690505824808330, -0.429735654099100420, -0.429780801299053720, -0.429825947424554660, -0.429871092475490710, --0.429916236451749030, -0.429961379353216770, -0.430006521179781440, -0.430051661931329430, -0.430096801607748270, -0.430141940208925490, -0.430187077734747460, -0.430232214185101770, --0.430277349559875510, -0.430322483858956270, -0.430367617082230420, -0.430412749229585560, -0.430457880300908810, -0.430503010296087730, -0.430548139215008780, -0.430593267057559460, --0.430638393823626950, -0.430683519513098860, -0.430728644125861590, -0.430773767661802700, -0.430818890120809820, -0.430864011502769260, -0.430909131807568730, -0.430954251035095330, --0.430999369185236290, -0.431044486257879280, -0.431089602252910600, -0.431134717170217950, -0.431179831009688930, -0.431224943771209900, -0.431270055454668510, -0.431315166059951960, --0.431360275586947890, -0.431405384035542790, -0.431450491405624190, -0.431495597697079790, -0.431540702909795960, -0.431585807043660400, -0.431630910098560310, -0.431676012074382940, --0.431721112971015950, -0.431766212788345760, -0.431811311526260070, -0.431856409184646520, -0.431901505763391480, -0.431946601262382710, -0.431991695681507410, -0.432036789020653340, --0.432081881279706810, -0.432126972458555640, -0.432172062557087010, -0.432217151575188640, -0.432262239512747000, -0.432307326369649750, -0.432352412145784180, -0.432397496841037950, --0.432442580455297650, -0.432487662988450820, -0.432532744440385310, -0.432577824810987500, -0.432622904100145090, -0.432667982307745500, -0.432713059433675880, -0.432758135477824050, --0.432803210440076470, -0.432848284320320850, -0.432893357118444950, -0.432938428834335250, -0.432983499467879510, -0.433028569018964970, -0.433073637487479400, -0.433118704873309390, --0.433163771176342580, -0.433208836396466350, -0.433253900533568440, -0.433298963587535340, -0.433344025558254850, -0.433389086445614360, -0.433434146249501500, -0.433479204969802860, --0.433524262606406200, -0.433569319159199330, -0.433614374628068730, -0.433659429012902220, -0.433704482313587100, -0.433749534530011190, -0.433794585662061030, -0.433839635709624470, --0.433884684672588780, -0.433929732550841770, -0.433974779344270030, -0.434019825052761320, -0.434064869676203060, -0.434109913214483060, -0.434154955667487850, -0.434199997035105260, --0.434245037317223080, -0.434290076513727920, -0.434335114624507520, -0.434380151649449380, -0.434425187588440840, -0.434470222441369740, -0.434515256208122700, -0.434560288888587500, --0.434605320482651940, -0.434650350990202720, -0.434695380411127650, -0.434740408745314060, -0.434785435992649900, -0.434830462153021740, -0.434875487226317410, -0.434920511212424420, --0.434965534111230460, -0.435010555922622330, -0.435055576646487810, -0.435100596282714300, -0.435145614831189740, -0.435190632291800720, -0.435235648664435150, -0.435280663948980850, --0.435325678145324470, -0.435370691253353930, -0.435415703272956640, -0.435460714204020050, -0.435505724046432120, -0.435550732800079500, -0.435595740464850000, -0.435640747040631600, --0.435685752527310900, -0.435730756924775810, -0.435775760232913870, -0.435820762451612890, -0.435865763580759620, -0.435910763620241950, -0.435955762569947340, -0.436000760429763770, --0.436045757199577830, -0.436090752879277570, -0.436135747468750390, -0.436180740967884230, -0.436225733376565840, -0.436270724694683140, -0.436315714922124010, -0.436360704058775140, --0.436405692104524570, -0.436450679059259770, -0.436495664922868620, -0.436540649695237980, -0.436585633376255670, -0.436630615965809320, -0.436675597463786760, -0.436720577870074840, --0.436765557184561500, -0.436810535407134220, -0.436855512537681070, -0.436900488576088710, -0.436945463522245110, -0.436990437376038270, -0.437035410137354920, -0.437080381806083000, --0.437125352382110200, -0.437170321865324010, -0.437215290255612400, -0.437260257552862130, -0.437305223756961290, -0.437350188867797750, -0.437395152885258320, -0.437440115809231030, --0.437485077639603430, -0.437530038376263590, -0.437574998019098220, -0.437619956567995350, -0.437664914022842580, -0.437709870383527930, -0.437754825649938230, -0.437799779821961440, --0.437844732899485220, -0.437889684882397550, -0.437934635770585280, -0.437979585563936400, -0.438024534262339000, -0.438069481865679840, -0.438114428373846950, -0.438159373786728030, --0.438204318104210680, -0.438249261326182860, -0.438294203452531560, -0.438339144483144760, -0.438384084417910440, -0.438429023256715570, -0.438473960999448080, -0.438518897645995720, --0.438563833196246530, -0.438608767650087330, -0.438653701007406250, -0.438698633268090890, -0.438743564432029330, -0.438788494499108510, -0.438833423469216390, -0.438878351342240740, --0.438923278118069640, -0.438968203796589910, -0.439013128377689690, -0.439058051861257010, -0.439102974247178870, -0.439147895535343220, -0.439192815725637900, -0.439237734817950860, --0.439282652812169160, -0.439327569708180820, -0.439372485505873490, -0.439417400205135420, -0.439462313805853430, -0.439507226307915610, -0.439552137711209770, -0.439597048015623990, --0.439641957221045150, -0.439686865327361450, -0.439731772334460980, -0.439776678242230710, -0.439821583050558680, -0.439866486759332760, -0.439911389368440600, -0.439956290877770330, --0.440001191287208990, -0.440046090596644620, -0.440090988805965480, -0.440135885915058420, -0.440180781923811660, -0.440225676832112940, -0.440270570639850420, -0.440315463346911130, --0.440360354953183100, -0.440405245458554250, -0.440450134862912620, -0.440495023166145310, -0.440539910368140440, -0.440584796468785790, -0.440629681467969550, -0.440674565365578700, --0.440719448161501380, -0.440764329855625910, -0.440809210447839220, -0.440854089938029440, -0.440898968326084490, -0.440943845611892150, -0.440988721795340540, -0.441033596876316710, --0.441078470854708920, -0.441123343730405350, -0.441168215503293050, -0.441213086173260160, -0.441257955740194550, -0.441302824203984480, -0.441347691564516980, -0.441392557821680190, --0.441437422975362040, -0.441482287025450730, -0.441527149971833290, -0.441572011814397980, -0.441616872553032670, -0.441661732187625560, -0.441706590718063670, -0.441751448144235390, --0.441796304466028860, -0.441841159683331150, -0.441886013796030540, -0.441930866804014890, -0.441975718707172500, -0.442020569505390370, -0.442065419198556850, -0.442110267786559820, --0.442155115269287470, -0.442199961646626890, -0.442244806918466460, -0.442289651084694040, -0.442334494145197880, -0.442379336099865070, -0.442424176948583880, -0.442469016691242720, --0.442513855327728580, -0.442558692857929810, -0.442603529281734300, -0.442648364599029950, -0.442693198809705090, -0.442738031913646910, -0.442782863910743560, -0.442827694800883460, --0.442872524583953760, -0.442917353259842770, -0.442962180828438360, -0.443007007289628880, -0.443051832643301500, -0.443096656889344580, -0.443141480027645970, -0.443186302058094060, --0.443231122980575990, -0.443275942794980120, -0.443320761501194430, -0.443365579099107180, -0.443410395588605620, -0.443455210969578070, -0.443500025241912900, -0.443544838405497240, --0.443589650460219480, -0.443634461405967630, -0.443679271242629570, -0.443724079970093780, -0.443768887588247400, -0.443813694096978790, -0.443858499496176280, -0.443903303785727230, --0.443948106965519840, -0.443992909035442200, -0.444037709995382720, -0.444082509845228510, -0.444127308584868100, -0.444172106214189790, -0.444216902733080790, -0.444261698141429520, --0.444306492439124010, -0.444351285626052310, -0.444396077702102770, -0.444440868667162650, -0.444485658521120370, -0.444530447263864310, -0.444575234895281720, -0.444620021415261080, --0.444664806823690360, -0.444709591120458050, -0.444754374305451390, -0.444799156378558710, -0.444843937339668210, -0.444888717188668240, -0.444933495925446070, -0.444978273549890170, --0.445023050061888580, -0.445067825461329780, -0.445112599748101020, -0.445157372922090730, -0.445202144983187440, -0.445246915931278350, -0.445291685766252000, -0.445336454487996470, --0.445381222096399740, -0.445425988591350410, -0.445470753972735670, -0.445515518240444050, -0.445560281394364040, -0.445605043434382900, -0.445649804360389200, -0.445694564172270940, --0.445739322869916690, -0.445784080453213770, -0.445828836922050610, -0.445873592276315340, -0.445918346515896510, -0.445963099640681430, -0.446007851650558620, -0.446052602545416120, --0.446097352325142580, -0.446142100989625200, -0.446186848538752570, -0.446231594972413270, -0.446276340290494570, -0.446321084492884990, -0.446365827579472680, -0.446410569550145850, --0.446455310404792970, -0.446500050143301460, -0.446544788765559750, -0.446589526271456540, -0.446634262660879080, -0.446678997933715960, -0.446723732089855330, -0.446768465129185830, --0.446813197051594720, -0.446857927856970650, -0.446902657545202090, -0.446947386116176570, -0.446992113569782520, -0.447036839905908200, -0.447081565124441800, -0.447126289225271920, --0.447171012208285870, -0.447215734073372280, -0.447260454820419760, -0.447305174449315720, -0.447349892959948760, -0.447394610352207070, -0.447439326625979240, -0.447484041781152640, --0.447528755817616030, -0.447573468735257440, -0.447618180533965630, -0.447662891213627960, -0.447707600774133070, -0.447752309215369180, -0.447797016537224920, -0.447841722739587720, --0.447886427822346170, -0.447931131785389010, -0.447975834628603580, -0.448020536351878550, -0.448065236955102250, -0.448109936438162770, -0.448154634800948910, -0.448199332043348050, --0.448244028165248830, -0.448288723166540000, -0.448333417047108940, -0.448378109806844280, -0.448422801445634400, -0.448467491963367940, -0.448512181359932320, -0.448556869635216240, --0.448601556789107960, -0.448646242821496230, -0.448690927732268490, -0.448735611521313420, -0.448780294188519340, -0.448824975733774890, -0.448869656156967610, -0.448914335457986200, --0.448959013636719360, -0.449003690693054570, -0.449048366626880580, -0.449093041438085650, -0.449137715126558530, -0.449182387692186710, -0.449227059134858940, -0.449271729454463480, --0.449316398650889130, -0.449361066724023370, -0.449405733673754970, -0.449450399499972230, -0.449495064202563850, -0.449539727781417490, -0.449584390236421720, -0.449629051567465410, --0.449673711774436100, -0.449718370857222490, -0.449763028815712950, -0.449807685649795840, -0.449852341359359920, -0.449896995944292720, -0.449941649404483060, -0.449986301739819680, --0.450030952950190130, -0.450075603035483160, -0.450120251995587250, -0.450164899830391100, -0.450209546539782290, -0.450254192123649590, -0.450298836581881410, -0.450343479914366570, --0.450388122120992610, -0.450432763201648380, -0.450477403156222200, -0.450522041984602940, -0.450566679686678130, -0.450611316262336690, -0.450655951711467330, -0.450700586033957680, --0.450745219229696570, -0.450789851298572410, -0.450834482240473620, -0.450879112055289020, -0.450923740742906250, -0.450968368303214130, -0.451012994736101460, -0.451057620041455940, --0.451102244219166340, -0.451146867269121180, -0.451191489191209220, -0.451236109985318160, -0.451280729651336750, -0.451325348189153600, -0.451369965598657440, -0.451414581879735990, --0.451459197032278050, -0.451503811056172160, -0.451548423951307120, -0.451593035717570590, -0.451637646354851540, -0.451682255863038730, -0.451726864242019910, -0.451771471491683900, --0.451816077611919220, -0.451860682602614750, -0.451905286463658130, -0.451949889194938340, -0.451994490796343850, -0.452039091267763480, -0.452083690609084990, -0.452128288820197290, --0.452172885900988920, -0.452217481851348630, -0.452262076671164300, -0.452306670360324790, -0.452351262918718970, -0.452395854346234580, -0.452440444642760620, -0.452485033808185500, --0.452529621842397810, -0.452574208745286420, -0.452618794516739200, -0.452663379156644900, -0.452707962664892600, -0.452752545041369970, -0.452797126285966020, -0.452841706398569240, --0.452886285379068550, -0.452930863227351820, -0.452975439943307860, -0.453020015526825360, -0.453064589977793200, -0.453109163296099130, -0.453153735481632180, -0.453198306534280890, --0.453242876453934240, -0.453287445240480040, -0.453332012893807150, -0.453376579413804660, -0.453421144800360330, -0.453465709053363140, -0.453510272172701680, -0.453554834158264530, --0.453599395009940680, -0.453643954727617980, -0.453688513311185370, -0.453733070760531820, -0.453777627075545250, -0.453822182256114650, -0.453866736302128540, -0.453911289213476010, --0.453955840990044880, -0.454000391631724120, -0.454044941138402380, -0.454089489509968690, -0.454134036746310870, -0.454178582847317940, -0.454223127812878600, -0.454267671642881840, --0.454312214337215470, -0.454356755895768570, -0.454401296318430180, -0.454445835605088170, -0.454490373755631500, -0.454534910769949010, -0.454579446647929540, -0.454623981389461140, --0.454668514994432730, -0.454713047462733060, -0.454757578794251160, -0.454802108988874910, -0.454846638046493390, -0.454891165966995250, -0.454935692750269630, -0.454980218396204390, --0.455024742904688580, -0.455069266275611280, -0.455113788508860470, -0.455158309604325180, -0.455202829561894120, -0.455247348381455970, -0.455291866062899840, -0.455336382606113640, --0.455380898010986520, -0.455425412277407520, -0.455469925405264600, -0.455514437394446860, -0.455558948244843050, -0.455603457956342270, -0.455647966528832440, -0.455692473962202690, --0.455736980256341740, -0.455781485411138780, -0.455825989426481670, -0.455870492302259570, -0.455914994038361280, -0.455959494634675890, -0.456003994091091380, -0.456048492407496840, --0.456092989583781530, -0.456137485619833300, -0.456181980515541370, -0.456226474270794490, -0.456270966885481410, -0.456315458359491330, -0.456359948692712240, -0.456404437885033210, --0.456448925936343510, -0.456493412846531110, -0.456537898615485160, -0.456582383243094470, -0.456626866729248240, -0.456671349073834440, -0.456715830276742230, -0.456760310337860850, --0.456804789257078350, -0.456849267034283860, -0.456893743669366190, -0.456938219162214110, -0.456982693512716920, -0.457027166720762660, -0.457071638786240410, -0.457116109709039490, --0.457160579489047870, -0.457205048126154810, -0.457249515620249130, -0.457293981971220060, -0.457338447178955660, -0.457382911243345120, -0.457427374164277310, -0.457471835941641480, --0.457516296575325660, -0.457560756065219070, -0.457605214411210600, -0.457649671613189480, -0.457694127671043840, -0.457738582584662820, -0.457783036353935750, -0.457827488978750700, --0.457871940458996930, -0.457916390794563310, -0.457960839985338760, -0.458005288031212430, -0.458049734932072520, -0.458094180687808270, -0.458138625298308950, -0.458183068763462710, --0.458227511083158730, -0.458271952257286060, -0.458316392285733840, -0.458360831168390270, -0.458405268905144600, -0.458449705495885820, -0.458494140940503110, -0.458538575238884640, --0.458583008390919760, -0.458627440396497390, -0.458671871255506790, -0.458716300967836110, -0.458760729533374660, -0.458805156952011790, -0.458849583223635670, -0.458894008348135540, --0.458938432325400440, -0.458982855155319220, -0.459027276837781270, -0.459071697372674730, -0.459116116759888950, -0.459160534999313310, -0.459204952090835890, -0.459249368034346070, --0.459293782829732880, -0.459338196476885620, -0.459382608975692440, -0.459427020326042770, -0.459471430527825960, -0.459515839580930120, -0.459560247485244710, -0.459604654240658720, --0.459649059847061060, -0.459693464304341160, -0.459737867612387160, -0.459782269771088550, -0.459826670780334620, -0.459871070640013650, -0.459915469350014980, -0.459959866910227670, --0.460004263320541060, -0.460048658580843370, -0.460093052691024070, -0.460137445650972140, -0.460181837460576950, -0.460226228119726850, -0.460270617628311120, -0.460315005986218880, --0.460359393193339460, -0.460403779249561220, -0.460448164154773520, -0.460492547908865790, -0.460536930511726340, -0.460581311963244480, -0.460625692263309410, -0.460670071411810100, --0.460714449408635980, -0.460758826253675370, -0.460803201946817680, -0.460847576487952380, -0.460891949876967740, -0.460936322113753240, -0.460980693198197900, -0.461025063130191260, --0.461069431909621570, -0.461113799536378320, -0.461158166010350530, -0.461202531331427690, -0.461246895499498210, -0.461291258514451410, -0.461335620376176540, -0.461379981084562960, --0.461424340639499050, -0.461468699040874290, -0.461513056288578140, -0.461557412382499030, -0.461601767322526340, -0.461646121108549250, -0.461690473740457240, -0.461734825218138630, --0.461779175541482960, -0.461823524710379410, -0.461867872724717410, -0.461912219584385330, -0.461956565289272700, -0.462000909839268610, -0.462045253234262710, -0.462089595474143240, --0.462133936558799810, -0.462178276488121930, -0.462222615261997980, -0.462266952880317440, -0.462311289342969560, -0.462355624649843480, -0.462399958800828680, -0.462444291795813590, --0.462488623634687790, -0.462532954317340820, -0.462577283843661090, -0.462621612213538150, -0.462665939426861180, -0.462710265483519730, -0.462754590383402220, -0.462798914126398230, --0.462843236712397020, -0.462887558141288010, -0.462931878412959800, -0.462976197527301850, -0.463020515484203420, -0.463064832283554110, -0.463109147925242270, -0.463153462409157610, --0.463197775735189670, -0.463242087903226910, -0.463286398913158930, -0.463330708764874980, -0.463375017458264200, -0.463419324993216310, -0.463463631369619710, -0.463507936587364000, --0.463552240646338880, -0.463596543546432700, -0.463640845287535240, -0.463685145869535630, -0.463729445292323570, -0.463773743555787490, -0.463818040659817020, -0.463862336604301480, --0.463906631389130520, -0.463950925014192550, -0.463995217479377280, -0.464039508784573950, -0.464083798929672280, -0.464128087914560670, -0.464172375739128900, -0.464216662403266530, --0.464260947906862120, -0.464305232249805360, -0.464349515431985550, -0.464393797453292290, -0.464438078313614170, -0.464482358012840820, -0.464526636550861630, -0.464570913927566160, --0.464615190142843080, -0.464659465196582020, -0.464703739088672300, -0.464748011819003600, -0.464792283387464480, -0.464836553793944670, -0.464880823038333830, -0.464925091120520610, --0.464969358040394630, -0.465013623797845220, -0.465057888392761800, -0.465102151825034000, -0.465146414094550490, -0.465190675201200890, -0.465234935144875020, -0.465279193925461410, --0.465323451542849820, -0.465367707996929610, -0.465411963287590490, -0.465456217414721100, -0.465500470378211180, -0.465544722177950070, -0.465588972813827550, -0.465633222285732230, --0.465677470593553800, -0.465721717737181740, -0.465765963716505750, -0.465810208531414470, -0.465854452181797660, -0.465898694667545080, -0.465942935988545410, -0.465987176144688430, --0.466031415135863440, -0.466075652961959960, -0.466119889622867770, -0.466164125118475380, -0.466208359448672730, -0.466252592613349560, -0.466296824612394520, -0.466341055445697430, --0.466385285113147700, -0.466429513614635140, -0.466473740950048400, -0.466517967119277340, -0.466562192122211340, -0.466606415958740250, -0.466650638628752720, -0.466694860132138570, --0.466739080468787320, -0.466783299638588720, -0.466827517641431490, -0.466871734477205480, -0.466915950145800560, -0.466960164647105320, -0.467004377981009690, -0.467048590147403130, --0.467092801146175460, -0.467137010977215380, -0.467181219640412810, -0.467225427135657180, -0.467269633462838340, -0.467313838621845060, -0.467358042612567190, -0.467402245434894230, --0.467446447088716020, -0.467490647573921280, -0.467534846890399920, -0.467579045038041870, -0.467623242016735830, -0.467667437826371660, -0.467711632466838890, -0.467755825938027000, --0.467800018239826030, -0.467844209372124560, -0.467888399334812580, -0.467932588127779990, -0.467976775750915560, -0.468020962204109160, -0.468065147487250370, -0.468109331600229110, --0.468153514542934080, -0.468197696315255320, -0.468241876917082300, -0.468286056348305000, -0.468330234608812120, -0.468374411698493700, -0.468418587617239260, -0.468462762364938720, --0.468506935941480850, -0.468551108346755670, -0.468595279580653110, -0.468639449643061980, -0.468683618533872190, -0.468727786252973400, -0.468771952800255130, -0.468816118175607310, --0.468860282378918860, -0.468904445410079700, -0.468948607268979800, -0.468992767955508040, -0.469036927469554330, -0.469081085811008270, -0.469125242979759940, -0.469169398975698090, --0.469213553798712710, -0.469257707448693880, -0.469301859925530360, -0.469346011229112180, -0.469390161359329040, -0.469434310316070410, -0.469478458099226450, -0.469522604708685950, --0.469566750144338960, -0.469610894406075450, -0.469655037493784290, -0.469699179407355560, -0.469743320146678910, -0.469787459711644320, -0.469831598102140700, -0.469875735318058100, --0.469919871359286150, -0.469964006225714880, -0.470008139917233230, -0.470052272433731270, -0.470096403775098590, -0.470140533941225290, -0.470184662932000290, -0.470228790747313610, --0.470272917387055340, -0.470317042851114360, -0.470361167139380810, -0.470405290251744320, -0.470449412188094660, -0.470493532948321800, -0.470537652532314780, -0.470581770939963560, --0.470625888171158360, -0.470670004225787970, -0.470714119103742670, -0.470758232804912020, -0.470802345329186190, -0.470846456676454080, -0.470890566846605850, -0.470934675839531190, --0.470978783655120250, -0.471022890293261940, -0.471066995753846420, -0.471111100036763430, -0.471155203141903070, -0.471199305069154250, -0.471243405818407230, -0.471287505389552110, --0.471331603782477790, -0.471375700997074430, -0.471419797033231890, -0.471463891890839810, -0.471507985569788400, -0.471552078069966680, -0.471596169391264700, -0.471640259533572690, --0.471684348496779700, -0.471728436280775820, -0.471772522885450800, -0.471816608310694940, -0.471860692556397120, -0.471904775622447540, -0.471948857508736500, -0.471992938215152870, --0.472037017741586850, -0.472081096087928360, -0.472125173254067110, -0.472169249239893280, -0.472213324045295980, -0.472257397670165390, -0.472301470114391660, -0.472345541377863830, --0.472389611460472200, -0.472433680362106530, -0.472477748082657080, -0.472521814622012810, -0.472565879980064050, -0.472609944156700550, -0.472654007151812610, -0.472698068965289260, --0.472742129597020720, -0.472786189046896900, -0.472830247314807940, -0.472874304400642990, -0.472918360304292300, -0.472962415025646070, -0.473006468564593440, -0.473050520921024620, --0.473094572094829520, -0.473138622085897960, -0.473182670894120250, -0.473226718519385470, -0.473270764961583930, -0.473314810220605840, -0.473358854296340340, -0.473402897188677670, --0.473446938897507770, -0.473490979422720950, -0.473535018764206280, -0.473579056921854040, -0.473623093895554180, -0.473667129685196920, -0.473711164290671500, -0.473755197711868190, --0.473799229948676850, -0.473843261000987840, -0.473887290868690250, -0.473931319551674450, -0.473975347049830800, -0.474019373363048340, -0.474063398491217420, -0.474107422434228040, --0.474151445191970500, -0.474195466764333940, -0.474239487151208730, -0.474283506352484780, -0.474327524368052480, -0.474371541197800950, -0.474415556841620620, -0.474459571299401360, --0.474503584571033530, -0.474547596656406390, -0.474591607555410240, -0.474635617267935520, -0.474679625793871300, -0.474723633133108060, -0.474767639285535670, -0.474811644251044220, --0.474855648029524070, -0.474899650620864420, -0.474943652024955590, -0.474987652241688040, -0.475031651270950980, -0.475075649112634830, -0.475119645766629520, -0.475163641232825450, --0.475207635511111950, -0.475251628601379320, -0.475295620503517650, -0.475339611217417300, -0.475383600742967540, -0.475427589080058780, -0.475471576228580990, -0.475515562188424720, --0.475559546959479110, -0.475603530541634680, -0.475647512934781800, -0.475691494138809730, -0.475735474153608950, -0.475779452979069430, -0.475823430615081310, -0.475867407061535020, --0.475911382318319810, -0.475955356385326160, -0.475999329262444480, -0.476043300949564100, -0.476087271446575480, -0.476131240753368660, -0.476175208869834170, -0.476219175795861260, --0.476263141531340360, -0.476307106076161610, -0.476351069430215550, -0.476395031593391360, -0.476438992565579640, -0.476482952346670430, -0.476526910936554190, -0.476570868335120300, --0.476614824542259290, -0.476658779557861570, -0.476702733381816510, -0.476746686014014600, -0.476790637454345970, -0.476834587702701150, -0.476878536758969520, -0.476922484623041490, --0.476966431294807260, -0.477010376774157360, -0.477054321060981110, -0.477098264155169090, -0.477142206056611340, -0.477186146765198550, -0.477230086280819920, -0.477274024603366150, --0.477317961732727670, -0.477361897668793890, -0.477405832411455400, -0.477449765960602290, -0.477493698316124760, -0.477537629477913450, -0.477581559445857620, -0.477625488219847850, --0.477669415799774840, -0.477713342185527860, -0.477757267376997470, -0.477801191374074010, -0.477845114176647880, -0.477889035784608620, -0.477932956197846760, -0.477976875416252500, --0.478020793439716480, -0.478064710268128020, -0.478108625901377820, -0.478152540339356060, -0.478196453581953340, -0.478240365629059080, -0.478284276480563930, -0.478328186136358470, --0.478372094596332180, -0.478416001860375580, -0.478459907928379060, -0.478503812800232740, -0.478547716475827280, -0.478591618955052090, -0.478635520237797930, -0.478679420323955330, --0.478723319213413770, -0.478767216906063940, -0.478811113401796050, -0.478855008700500740, -0.478898902802067540, -0.478942795706387090, -0.478986687413349650, -0.479030577922845920, --0.479074467234765320, -0.479118355348998550, -0.479162242265435860, -0.479206127983968000, -0.479250012504484400, -0.479293895826875820, -0.479337777951032830, -0.479381658876845030, --0.479425538604203120, -0.479469417132997340, -0.479513294463117970, -0.479557170594455790, -0.479601045526900300, -0.479644919260342200, -0.479688791794672160, -0.479732663129779800, --0.479776533265555750, -0.479820402201890370, -0.479864269938674370, -0.479908136475797330, -0.479952001813149950, -0.479995865950622940, -0.480039728888105870, -0.480083590625489500, --0.480127451162664090, -0.480171310499520110, -0.480215168635948260, -0.480259025571838080, -0.480302881307080320, -0.480346735841565730, -0.480390589175183960, -0.480434441307825700, --0.480478292239381320, -0.480522141969741190, -0.480565990498796110, -0.480609837826435680, -0.480653683952551090, -0.480697528877031820, -0.480741372599768790, -0.480785215120652310, --0.480829056439572740, -0.480872896556421010, -0.480916735471086600, -0.480960573183460360, -0.481004409693433050, -0.481048245000894330, -0.481092079105735040, -0.481135912007845500, --0.481179743707116250, -0.481223574203437980, -0.481267403496700390, -0.481311231586794290, -0.481355058473610490, -0.481398884157038690, -0.481442708636969640, -0.481486531913293820, --0.481530353985902100, -0.481574174854684070, -0.481617994519530630, -0.481661812980332560, -0.481705630236979600, -0.481749446289362560, -0.481793261137371920, -0.481837074780898100, --0.481880887219831970, -0.481924698454063270, -0.481968508483482770, -0.482012317307981440, -0.482056124927448930, -0.482099931341776090, -0.482143736550853410, -0.482187540554571410, --0.482231343352820920, -0.482275144945491730, -0.482318945332474600, -0.482362744513660570, -0.482406542488939270, -0.482450339258201580, -0.482494134821338070, -0.482537929178239620, --0.482581722328795980, -0.482625514272898020, -0.482669305010436640, -0.482713094541301620, -0.482756882865383820, -0.482800669982573870, -0.482844455892762260, -0.482888240595839850, --0.482932024091696440, -0.482975806380223030, -0.483019587461310460, -0.483063367334848560, -0.483107146000728180, -0.483150923458839980, -0.483194699709074470, -0.483238474751322590, --0.483282248585474140, -0.483326021211420430, -0.483369792629051330, -0.483413562838257700, -0.483457331838930190, -0.483501099630959390, -0.483544866214236150, -0.483588631588650400, --0.483632395754093060, -0.483676158710455160, -0.483719920457626410, -0.483763680995497880, -0.483807440323960170, -0.483851198442903860, -0.483894955352219940, -0.483938711051798200, --0.483982465541529740, -0.484026218821305480, -0.484069970891015280, -0.484113721750550120, -0.484157471399800700, -0.484201219838657990, -0.484244967067011810, -0.484288713084753240, --0.484332457891773320, -0.484376201487961790, -0.484419943873209800, -0.484463685047407940, -0.484507425010446860, -0.484551163762217630, -0.484594901302610070, -0.484638637631515270, --0.484682372748824250, -0.484726106654426950, -0.484769839348214330, -0.484813570830077150, -0.484857301099906050, -0.484901030157592060, -0.484944758003025110, -0.484988484636096670, --0.485032210056696610, -0.485075934264716010, -0.485119657260045630, -0.485163379042576060, -0.485207099612198430, -0.485250818968802730, -0.485294537112279930, -0.485338254042521180, --0.485381969759416390, -0.485425684262856700, -0.485469397552732770, -0.485513109628935400, -0.485556820491355570, -0.485600530139883360, -0.485644238574409800, -0.485687945794826050, --0.485731651801022070, -0.485775356592888900, -0.485819060170317400, -0.485862762533198600, -0.485906463681422480, -0.485950163614880250, -0.485993862333462980, -0.486037559837060650, --0.486081256125564460, -0.486124951198865120, -0.486168645056853370, -0.486212337699420400, -0.486256029126456210, -0.486299719337851990, -0.486343408333498820, -0.486387096113286730, --0.486430782677106930, -0.486474468024850120, -0.486518152156407200, -0.486561835071669280, -0.486605516770526330, -0.486649197252869650, -0.486692876518590330, -0.486736554567578470, --0.486780231399725150, -0.486823907014921340, -0.486867581413058080, -0.486911254594025510, -0.486954926557714830, -0.486998597304017180, -0.487042266832822650, -0.487085935144022490, --0.487129602237507450, -0.487173268113168410, -0.487216932770896620, -0.487260596210582100, -0.487304258432116060, -0.487347919435389800, -0.487391579220293360, -0.487435237786717930, --0.487478895134554390, -0.487522551263693650, -0.487566206174026960, -0.487609859865444310, -0.487653512337837440, -0.487697163591096330, -0.487740813625112350, -0.487784462439776360, --0.487828110034979220, -0.487871756410612150, -0.487915401566565320, -0.487959045502730000, -0.488002688218997450, -0.488046329715257740, -0.488089969991402250, -0.488133609047321840, --0.488177246882907420, -0.488220883498050260, -0.488264518892640500, -0.488308153066569440, -0.488351786019728400, -0.488395417752007450, -0.488439048263297980, -0.488482677553490950, --0.488526305622477560, -0.488569932470148020, -0.488613558096393670, -0.488657182501105790, -0.488700805684174570, -0.488744427645491360, -0.488788048384947050, -0.488831667902432650, --0.488875286197839490, -0.488918903271057640, -0.488962519121978580, -0.489006133750493620, -0.489049747156492960, -0.489093359339867860, -0.489136970300509450, -0.489180580038308550, --0.489224188553156640, -0.489267795844943840, -0.489311401913561540, -0.489355006758901090, -0.489398610380852810, -0.489442212779307990, -0.489485813954157580, -0.489529413905293090, --0.489573012632604660, -0.489616610135983680, -0.489660206415321540, -0.489703801470508570, -0.489747395301436020, -0.489790987907995020, -0.489834579290076570, -0.489878169447572010, --0.489921758380371660, -0.489965346088366950, -0.490008932571449230, -0.490052517829508820, -0.490096101862437070, -0.490139684670125090, -0.490183266252463890, -0.490226846609344900, --0.490270425740658430, -0.490314003646296290, -0.490357580326148730, -0.490401155780107230, -0.490444730008062880, -0.490488303009906650, -0.490531874785530060, -0.490575445334823390, --0.490619014657678100, -0.490662582753985720, -0.490706149623636460, -0.490749715266521780, -0.490793279682532890, -0.490836842871560760, -0.490880404833496930, -0.490923965568231650, --0.490967525075656500, -0.491011083355662900, -0.491054640408141230, -0.491098196232982950, -0.491141750830079220, -0.491185304199321440, -0.491228856340600040, -0.491272407253806500, --0.491315956938832290, -0.491359505395567830, -0.491403052623904660, -0.491446598623733800, -0.491490143394946450, -0.491533686937434100, -0.491577229251087210, -0.491620770335797210, --0.491664310191455680, -0.491707848817952990, -0.491751386215180660, -0.491794922383029850, -0.491838457321391750, -0.491881991030157950, -0.491925523509218750, -0.491969054758465700, --0.492012584777790420, -0.492056113567083340, -0.492099641126235940, -0.492143167455139420, -0.492186692553685410, -0.492230216421764230, -0.492273739059267520, -0.492317260466086930, --0.492360780642112690, -0.492404299587236580, -0.492447817301349680, -0.492491333784343230, -0.492534849036108830, -0.492578363056536960, -0.492621875845519200, -0.492665387402947070, --0.492708897728711130, -0.492752406822702940, -0.492795914684813710, -0.492839421314934690, -0.492882926712957530, -0.492926430878772640, -0.492969933812272110, -0.493013435513346310, --0.493056935981886930, -0.493100435217785240, -0.493143933220932420, -0.493187429991220170, -0.493230925528538980, -0.493274419832780480, -0.493317912903836250, -0.493361404741596900, --0.493404895345954050, -0.493448384716798970, -0.493491872854022910, -0.493535359757517500, -0.493578845427173400, -0.493622329862882130, -0.493665813064535440, -0.493709295032023820, --0.493752775765238960, -0.493796255264072170, -0.493839733528415150, -0.493883210558158370, -0.493926686353193590, -0.493970160913412450, -0.494013634238705530, -0.494057106328964550, --0.494100577184080790, -0.494144046803945640, -0.494187515188450670, -0.494230982337486580, -0.494274448250945020, -0.494317912928717740, -0.494361376370695270, -0.494404838576769370, --0.494448299546831340, -0.494491759280772600, -0.494535217778484860, -0.494578675039858640, -0.494622131064785810, -0.494665585853157950, -0.494709039404865770, -0.494752491719801010, --0.494795942797855050, -0.494839392638919570, -0.494882841242885230, -0.494926288609643770, -0.494969734739087010, -0.495013179631105530, -0.495056623285591080, -0.495100065702435090, --0.495143506881528920, -0.495186946822764370, -0.495230385526032050, -0.495273822991223800, -0.495317259218231390, -0.495360694206945400, -0.495404127957257690, -0.495447560469059690, --0.495490991742242760, -0.495534421776698760, -0.495577850572318290, -0.495621278128993590, -0.495664704446615310, -0.495708129525075260, -0.495751553364264910, -0.495794975964075680, --0.495838397324399380, -0.495881817445126660, -0.495925236326149430, -0.495968653967359560, -0.496012070368647580, -0.496055485529905470, -0.496098899451024640, -0.496142312131896520, --0.496185723572413080, -0.496229133772464910, -0.496272542731943880, -0.496315950450741890, -0.496359356928749660, -0.496402762165859050, -0.496446166161961520, -0.496489568916948950, --0.496532970430712040, -0.496576370703142760, -0.496619769734132910, -0.496663167523573260, -0.496706564071355720, -0.496749959377371710, -0.496793353441512820, -0.496836746263670970, --0.496880137843736860, -0.496923528181602350, -0.496966917277159470, -0.497010305130298870, -0.497053691740912520, -0.497097077108891950, -0.497140461234128690, -0.497183844116514670, --0.497227225755940640, -0.497270606152298900, -0.497313985305480320, -0.497357363215376710, -0.497400739881879770, -0.497444115304880920, -0.497487489484272180, -0.497530862419944320, --0.497574234111789360, -0.497617604559699170, -0.497660973763564550, -0.497704341723277540, -0.497747708438729620, -0.497791073909812480, -0.497834438136418030, -0.497877801118437100, --0.497921162855761660, -0.497964523348283730, -0.498007882595894070, -0.498051240598484710, -0.498094597355947240, -0.498137952868173690, -0.498181307135054870, -0.498224660156482760, --0.498268011932349380, -0.498311362462545590, -0.498354711746963440, -0.498398059785494450, -0.498441406578030380, -0.498484752124463140, -0.498528096424683600, -0.498571439478583840, --0.498614781286055910, -0.498658121846990600, -0.498701461161280000, -0.498744799228815710, -0.498788136049489460, -0.498831471623193250, -0.498874805949817980, -0.498918139029255690, --0.498961470861398420, -0.499004801446137130, -0.499048130783363800, -0.499091458872970130, -0.499134785714848260, -0.499178111308889010, -0.499221435654984450, -0.499264758753026730, --0.499308080602906710, -0.499351401204516490, -0.499394720557747750, -0.499438038662492260, -0.499481355518642030, -0.499524671126088000, -0.499567985484722310, -0.499611298594437040, --0.499654610455123160, -0.499697921066672710, -0.499741230428977500, -0.499784538541929220, -0.499827845405419970, -0.499871151019340710, -0.499914455383583920, -0.499957758498040640, --0.500001060362602940, -0.500044360977162650, -0.500087660341611450, -0.500130958455841430, -0.500174255319743690, -0.500217550933210300, -0.500260845296133350, -0.500304138408403930, --0.500347430269914240, -0.500390720880555920, -0.500434010240220830, -0.500477298348801060, -0.500520585206187580, -0.500563870812272830, -0.500607155166948650, -0.500650438270106250, --0.500693720121637710, -0.500737000721434900, -0.500780280069389900, -0.500823558165393920, -0.500866835009339040, -0.500910110601117450, -0.500953384940620140, -0.500996658027739410, --0.501039929862367010, -0.501083200444394810, -0.501126469773715000, -0.501169737850218570, -0.501213004673797920, -0.501256270244345050, -0.501299534561751140, -0.501342797625908390, --0.501386059436708660, -0.501429319994043720, -0.501472579297805980, -0.501515837347886300, -0.501559094144177100, -0.501602349686570470, -0.501645603974957610, -0.501688857009230830, --0.501732108789281760, -0.501775359315002940, -0.501818608586285240, -0.501861856603021070, -0.501905103365102630, -0.501948348872421010, -0.501991593124868630, -0.502034836122337120, --0.502078077864718590, -0.502121318351905320, -0.502164557583788310, -0.502207795560259850, -0.502251032281212370, -0.502294267746536850, -0.502337501956125700, -0.502380734909870790, --0.502423966607664090, -0.502467197049397800, -0.502510426234963110, -0.502553654164252790, -0.502596880837157920, -0.502640106253570920, -0.502683330413383640, -0.502726553316487970, --0.502769774962776310, -0.502812995352139860, -0.502856214484470930, -0.502899432359661840, -0.502942648977603770, -0.502985864338189040, -0.503029078441309730, -0.503072291286857600, --0.503115502874725280, -0.503158713204803760, -0.503201922276985460, -0.503245130091162670, -0.503288336647226720, -0.503331541945069900, -0.503374745984584320, -0.503417948765662150, --0.503461150288194830, -0.503504350552074540, -0.503547549557193830, -0.503590747303443780, -0.503633943790716910, -0.503677139018905210, -0.503720332987900640, -0.503763525697595640, --0.503806717147881390, -0.503849907338650320, -0.503893096269794950, -0.503936283941206490, -0.503979470352777240, -0.504022655504399290, -0.504065839395964720, -0.504109022027365960, --0.504152203398494310, -0.504195383509242090, -0.504238562359501820, -0.504281739949164700, -0.504324916278123260, -0.504368091346269590, -0.504411265153495990, -0.504454437699693890, --0.504497608984755710, -0.504540779008573860, -0.504583947771039760, -0.504627115272045730, -0.504670281511483850, -0.504713446489246320, -0.504756610205225550, -0.504799772659312860, --0.504842933851400780, -0.504886093781381720, -0.504929252449147100, -0.504972409854589240, -0.505015565997600450, -0.505058720878072690, -0.505101874495898610, -0.505145026850969290, --0.505188177943177940, -0.505231327772415750, -0.505274476338575140, -0.505317623641548420, -0.505360769681227560, -0.505403914457505210, -0.505447057970272670, -0.505490200219422590, --0.505533341204847280, -0.505576480926438250, -0.505619619384088060, -0.505662756577688780, -0.505705892507132600, -0.505749027172312180, -0.505792160573118710, -0.505835292709444830, --0.505878423581183070, -0.505921553188224960, -0.505964681530462920, -0.506007808607789160, -0.506050934420096300, -0.506094058967275770, -0.506137182249220000, -0.506180304265821720, --0.506223425016972260, -0.506266544502564250, -0.506309662722489890, -0.506352779676641380, -0.506395895364911250, -0.506439009787191030, -0.506482122943373250, -0.506525234833350660, --0.506568345457014460, -0.506611454814257510, -0.506654562904971790, -0.506697669729049840, -0.506740775286383950, -0.506783879576865770, -0.506826982600387940, -0.506870084356843000, --0.506913184846122470, -0.506956284068118990, -0.506999382022724880, -0.507042478709832540, -0.507085574129333750, -0.507128668281120910, -0.507171761165086890, -0.507214852781122990, --0.507257943129121980, -0.507301032208976150, -0.507344120020577720, -0.507387206563819420, -0.507430291838592670, -0.507473375844790240, -0.507516458582304650, -0.507559540051027660, --0.507602620250851790, -0.507645699181669240, -0.507688776843372550, -0.507731853235854350, -0.507774928359006060, -0.507818002212720890, -0.507861074796890240, -0.507904146111407000, --0.507947216156163340, -0.507990284931051580, -0.508033352435964590, -0.508076418670793780, -0.508119483635431910, -0.508162547329771840, -0.508205609753704880, -0.508248670907124000, --0.508291730789921400, -0.508334789401989400, -0.508377846743220840, -0.508420902813507380, -0.508463957612741550, -0.508507011140816310, -0.508550063397623100, -0.508593114383054770, --0.508636164097003520, -0.508679212539362440, -0.508722259710022830, -0.508765305608877560, -0.508808350235819380, -0.508851393590740050, -0.508894435673532210, -0.508937476484088270, --0.508980516022300660, -0.509023554288062010, -0.509066591281264190, -0.509109627001799960, -0.509152661449561950, -0.509195694624441920, -0.509238726526332730, -0.509281757155126580, --0.509324786510716220, -0.509367814592994070, -0.509410841401852110, -0.509453866937183530, -0.509496891198879750, -0.509539914186833750, -0.509582935900938060, -0.509625956341084980, --0.509668975507167390, -0.509711993399076910, -0.509755010016706530, -0.509798025359949000, -0.509841039428696070, -0.509884052222840390, -0.509927063742274700, -0.509970073986891310, --0.510013082956583210, -0.510056090651241910, -0.510099097070760400, -0.510142102215031530, -0.510185106083947070, -0.510228108677399870, -0.510271109995282250, -0.510314110037486950, --0.510357108803906830, -0.510400106294433440, -0.510443102508960190, -0.510486097447378830, -0.510529091109582220, -0.510572083495462900, -0.510615074604913400, -0.510658064437826460, --0.510701052994094070, -0.510744040273609090, -0.510787026276264380, -0.510830011001951690, -0.510872994450563890, -0.510915976621993730, -0.510958957516133520, -0.511001937132876450, --0.511044915472114060, -0.511087892533739320, -0.511130868317645310, -0.511173842823723800, -0.511216816051867640, -0.511259788001969360, -0.511302758673922050, -0.511345728067617470, --0.511388696182948580, -0.511431663019808360, -0.511474628578088450, -0.511517592857682170, -0.511560555858481810, -0.511603517580380030, -0.511646478023269900, -0.511689437187043180, --0.511732395071592850, -0.511775351676811870, -0.511818307002592230, -0.511861261048826680, -0.511904213815408070, -0.511947165302228950, -0.511990115509182280, -0.512033064436159920, --0.512076012083055310, -0.512118958449760300, -0.512161903536167860, -0.512204847342170640, -0.512247789867661290, -0.512290731112532870, -0.512333671076677270, -0.512376609759987560, --0.512419547162356600, -0.512462483283676380, -0.512505418123839980, -0.512548351682740040, -0.512591283960269210, -0.512634214956320670, -0.512677144670786070, -0.512720073103558600, --0.512763000254531360, -0.512805926123596320, -0.512848850710646340, -0.512891774015574290, -0.512934696038273240, -0.512977616778634960, -0.513020536236552750, -0.513063454411919470, --0.513106371304627330, -0.513149286914569070, -0.513192201241637780, -0.513235114285725880, -0.513278026046726570, -0.513320936524531810, -0.513363845719034710, -0.513406753630128440, --0.513449660257704890, -0.513492565601657120, -0.513535469661878020, -0.513578372438260210, -0.513621273930696790, -0.513664174139079830, -0.513707073063302540, -0.513749970703257790, --0.513792867058837870, -0.513835762129935760, -0.513878655916444220, -0.513921548418256320, -0.513964439635264280, -0.514007329567361170, -0.514050218214440080, -0.514093105576392980, --0.514135991653113190, -0.514178876444493450, -0.514221759950426520, -0.514264642170805590, -0.514307523105522520, -0.514350402754470860, -0.514393281117543450, -0.514436158194632400, --0.514479033985631110, -0.514521908490432110, -0.514564781708928390, -0.514607653641013020, -0.514650524286578200, -0.514693393645517470, -0.514736261717722910, -0.514779128503087600, --0.514821994001504520, -0.514864858212866430, -0.514907721137066620, -0.514950582773997080, -0.514993443123551110, -0.515036302185621910, -0.515079159960101560, -0.515122016446883380, --0.515164871645860110, -0.515207725556924620, -0.515250578179970220, -0.515293429514888990, -0.515336279561574240, -0.515379128319919060, -0.515421975789815750, -0.515464821971157510, --0.515507666863837200, -0.515550510467748140, -0.515593352782782400, -0.515636193808833300, -0.515679033545794030, -0.515721871993556790, -0.515764709152015000, -0.515807545021061300, --0.515850379600588770, -0.515893212890490730, -0.515936044890659250, -0.515978875600987650, -0.516021705021369240, -0.516064533151696200, -0.516107359991861750, -0.516150185541758950, --0.516193009801280690, -0.516235832770320370, -0.516278654448769970, -0.516321474836523020, -0.516364293933472720, -0.516407111739511260, -0.516449928254532060, -0.516492743478428110, --0.516535557411092580, -0.516578370052417800, -0.516621181402297180, -0.516663991460623920, -0.516706800227290210, -0.516749607702189580, -0.516792413885215020, -0.516835218776259260, --0.516878022375215960, -0.516920824681977200, -0.516963625696436390, -0.517006425418486850, -0.517049223848020880, -0.517092020984931900, -0.517134816829112780, -0.517177611380456700, --0.517220404638856880, -0.517263196604205720, -0.517305987276396980, -0.517348776655322860, -0.517391564740876770, -0.517434351532951810, -0.517477137031440940, -0.517519921236237690, --0.517562704147234150, -0.517605485764323860, -0.517648266087400330, -0.517691045116355660, -0.517733822851083380, -0.517776599291476570, -0.517819374437428310, -0.517862148288831920, --0.517904920845579820, -0.517947692107565420, -0.517990462074682250, -0.518033230746822390, -0.518075998123879500, -0.518118764205746650, -0.518161528992317270, -0.518204292483483650, --0.518247054679139340, -0.518289815579177750, -0.518332575183491300, -0.518375333491973290, -0.518418090504517040, -0.518460846221015510, -0.518503600641362250, -0.518546353765449660, --0.518589105593171170, -0.518631856124420310, -0.518674605359089380, -0.518717353297071910, -0.518760099938261110, -0.518802845282550160, -0.518845589329832270, -0.518888332080000180, --0.518931073532947210, -0.518973813688566990, -0.519016552546751720, -0.519059290107395150, -0.519102026370390380, -0.519144761335630920, -0.519187495003009200, -0.519230227372418640, --0.519272958443752990, -0.519315688216904550, -0.519358416691766860, -0.519401143868233110, -0.519443869746196500, -0.519486594325550670, -0.519529317606187920, -0.519572039588001910, --0.519614760270886160, -0.519657479654733080, -0.519700197739436320, -0.519742914524889080, -0.519785630010984660, -0.519828344197616370, -0.519871057084676960, -0.519913768672060290, --0.519956478959658800, -0.519999187947365990, -0.520041895635075300, -0.520084602022679920, -0.520127307110073380, -0.520170010897148210, -0.520212713383797930, -0.520255414569916420, --0.520298114455395870, -0.520340813040130020, -0.520383510324012200, -0.520426206306935480, -0.520468900988793730, -0.520511594369479360, -0.520554286448886020, -0.520596977226907230, --0.520639666703435760, -0.520682354878365010, -0.520725041751588400, -0.520767727322999590, -0.520810411592491080, -0.520853094559956540, -0.520895776225289600, -0.520938456588382890, --0.520981135649130070, -0.521023813407424320, -0.521066489863159070, -0.521109165016228060, -0.521151838866523610, -0.521194511413939690, -0.521237182658369820, -0.521279852599706550, --0.521322521237843730, -0.521365188572674660, -0.521407854604092560, -0.521450519331991160, -0.521493182756263110, -0.521535844876802050, -0.521578505693501840, -0.521621165206255010, --0.521663823414955210, -0.521706480319495850, -0.521749135919770680, -0.521791790215672350, -0.521834443207094490, -0.521877094893930860, -0.521919745276074100, -0.521962394353418070, --0.522005042125855970, -0.522047688593281320, -0.522090333755587890, -0.522132977612668080, -0.522175620164415990, -0.522218261410725140, -0.522260901351488280, -0.522303539986599170, --0.522346177315951230, -0.522388813339437760, -0.522431448056952740, -0.522474081468388700, -0.522516713573639820, -0.522559344372598770, -0.522601973865159270, -0.522644602051214990, --0.522687228930659110, -0.522729854503385600, -0.522772478769287010, -0.522815101728257290, -0.522857723380190100, -0.522900343724978290, -0.522942962762515620, -0.522985580492695610, --0.523028196915411580, -0.523070812030557390, -0.523113425838025780, -0.523156038337710740, -0.523198649529505900, -0.523241259413304020, -0.523283867988999060, -0.523326475256484350, --0.523369081215653950, -0.523411685866400410, -0.523454289208617580, -0.523496891242199560, -0.523539491967038860, -0.523582091383029360, -0.523624689490064690, -0.523667286288038270, --0.523709881776844080, -0.523752475956374750, -0.523795068826524270, -0.523837660387186490, -0.523880250638254160, -0.523922839579621160, -0.523965427211181110, -0.524008013532827550, --0.524050598544454240, -0.524093182245954140, -0.524135764637221340, -0.524178345718148920, -0.524220925488630530, -0.524263503948559810, -0.524306081097830390, -0.524348656936336030, --0.524391231463969820, -0.524433804680625390, -0.524476376586196950, -0.524518947180577120, -0.524561516463659890, -0.524604084435338900, -0.524646651095507680, -0.524689216444060300, --0.524731780480889420, -0.524774343205889120, -0.524816904618953250, -0.524859464719974910, -0.524902023508847740, -0.524944580985465590, -0.524987137149722340, -0.525029692001510950, --0.525072245540725290, -0.525114797767259330, -0.525157348681006050, -0.525199898281859420, -0.525242446569712970, -0.525284993544460450, -0.525327539205995840, -0.525370083554212000, --0.525412626589002900, -0.525455168310262730, -0.525497708717884150, -0.525540247811761340, -0.525582785591787950, -0.525625322057857500, -0.525667857209864200, -0.525710391047700790, --0.525752923571261470, -0.525795454780440210, -0.525837984675129990, -0.525880513255224780, -0.525923040520618220, -0.525965566471204520, -0.526008091106876410, -0.526050614427528210, --0.526093136433053780, -0.526135657123346090, -0.526178176498299340, -0.526220694557807180, -0.526263211301763230, -0.526305726730061600, -0.526348240842595240, -0.526390753639258360, --0.526433265119944930, -0.526475775284548030, -0.526518284132961640, -0.526560791665079520, -0.526603297880795520, -0.526645802780003500, -0.526688306362596670, -0.526730808628469440, --0.526773309577514890, -0.526815809209627010, -0.526858307524699530, -0.526900804522626440, -0.526943300203301600, -0.526985794566618200, -0.527028287612470230, -0.527070779340751970, --0.527113269751356420, -0.527155758844177650, -0.527198246619109410, -0.527240733076045690, -0.527283218214880440, -0.527325702035506770, -0.527368184537818860, -0.527410665721710910, --0.527453145587075790, -0.527495624133807910, -0.527538101361801020, -0.527580577270949090, -0.527623051861145440, -0.527665525132284150, -0.527707997084259530, -0.527750467716964430, --0.527792937030293170, -0.527835405024139500, -0.527877871698397390, -0.527920337052961040, -0.527962801087723310, -0.528005263802578730, -0.528047725197421270, -0.528090185272144240, --0.528132644026641620, -0.528175101460807370, -0.528217557574535480, -0.528260012367720020, -0.528302465840254200, -0.528344917992032200, -0.528387368822948230, -0.528429818332895480, --0.528472266521768150, -0.528514713389460210, -0.528557158935865860, -0.528599603160878280, -0.528642046064391580, -0.528684487646300270, -0.528726927906497220, -0.528769366844876960, --0.528811804461333250, -0.528854240755760040, -0.528896675728051550, -0.528939109378101070, -0.528981541705802800, -0.529023972711051060, -0.529066402393738920, -0.529108830753760920, --0.529151257791010690, -0.529193683505382430, -0.529236107896770340, -0.529278530965067500, -0.529320952710168770, -0.529363373131967350, -0.529405792230357440, -0.529448210005233010, --0.529490626456488030, -0.529533041584016930, -0.529575455387712890, -0.529617867867470120, -0.529660279023183130, -0.529702688854745030, -0.529745097362050220, -0.529787504544992680, --0.529829910403466280, -0.529872314937365640, -0.529914718146583750, -0.529957120031015030, -0.529999520590553890, -0.530041919825093630, -0.530084317734528580, -0.530126714318752690, --0.530169109577660390, -0.530211503511144990, -0.530253896119100790, -0.530296287401422210, -0.530338677358002550, -0.530381065988736240, -0.530423453293517260, -0.530465839272239560, --0.530508223924797680, -0.530550607251084940, -0.530592989250995630, -0.530635369924424170, -0.530677749271263990, -0.530720127291409380, -0.530762503984754440, -0.530804879351193360, --0.530847253390620330, -0.530889626102928890, -0.530931997488013340, -0.530974367545768100, -0.531016736276086590, -0.531059103678863330, -0.531101469753992310, -0.531143834501367930, --0.531186197920883510, -0.531228560012433680, -0.531270920775912870, -0.531313280211214380, -0.531355638318232630, -0.531397995096861810, -0.531440350546996010, -0.531482704668529650, --0.531525057461356250, -0.531567408925370130, -0.531609759060465930, -0.531652107866536830, -0.531694455343477590, -0.531736801491182190, -0.531779146309544810, -0.531821489798459890, --0.531863831957820830, -0.531906172787522610, -0.531948512287458650, -0.531990850457523260, -0.532033187297610840, -0.532075522807615500, -0.532117856987431640, -0.532160189836952790, --0.532202521356073490, -0.532244851544688260, -0.532287180402690520, -0.532329507929974800, -0.532371834126435290, -0.532414158991966200, -0.532456482526462160, -0.532498804729816480, --0.532541125601923790, -0.532583445142678750, -0.532625763351974650, -0.532668080229706130, -0.532710395775767400, -0.532752709990053090, -0.532795022872456610, -0.532837334422872620, --0.532879644641195640, -0.532921953527319080, -0.532964261081137810, -0.533006567302545810, -0.533048872191437370, -0.533091175747707150, -0.533133477971248550, -0.533175778861956330, --0.533218078419725020, -0.533260376644448140, -0.533302673536020230, -0.533344969094335710, -0.533387263319288870, -0.533429556210774150, -0.533471847768685170, -0.533514137992916580, --0.533556426883363020, -0.533598714439917910, -0.533641000662476110, -0.533683285550931920, -0.533725569105179760, -0.533767851325113290, -0.533810132210627230, -0.533852411761616240, --0.533894689977973740, -0.533936966859594580, -0.533979242406373070, -0.534021516618203410, -0.534063789494980350, -0.534106061036597410, -0.534148331242949250, -0.534190600113930710, --0.534232867649435340, -0.534275133849357760, -0.534317398713592300, -0.534359662242033460, -0.534401924434575680, -0.534444185291112820, -0.534486444811539840, -0.534528702995750390, --0.534570959843639230, -0.534613215355100650, -0.534655469530028960, -0.534697722368319030, -0.534739973869864380, -0.534782224034559770, -0.534824472862300060, -0.534866720352978780, --0.534908966506490670, -0.534951211322730160, -0.534993454801591550, -0.535035696942969820, -0.535077937746758380, -0.535120177212852100, -0.535162415341145730, -0.535204652131533010, --0.535246887583908590, -0.535289121698167000, -0.535331354474202990, -0.535373585911910200, -0.535415816011183380, -0.535458044771917500, -0.535500272194006090, -0.535542498277344010, --0.535584723021825690, -0.535626946427345540, -0.535669168493798420, -0.535711389221077970, -0.535753608609079060, -0.535795826657696540, -0.535838043366824060, -0.535880258736356470, --0.535922472766188210, -0.535964685456213790, -0.536006896806327960, -0.536049106816424590, -0.536091315486398880, -0.536133522816144460, -0.536175728805556200, -0.536217933454528620, --0.536260136762956250, -0.536302338730733850, -0.536344539357755280, -0.536386738643915280, -0.536428936589108950, -0.536471133193229810, -0.536513328456172830, -0.536555522377832550, --0.536597714958103490, -0.536639906196880510, -0.536682096094057370, -0.536724284649529040, -0.536766471863190260, -0.536808657734935020, -0.536850842264658180, -0.536893025452254150, --0.536935207297617900, -0.536977387800643300, -0.537019566961225210, -0.537061744779258610, -0.537103921254637350, -0.537146096387256190, -0.537188270177009760, -0.537230442623792710, --0.537272613727499900, -0.537314783488025190, -0.537356951905263560, -0.537399118979109970, -0.537441284709458070, -0.537483449096203050, -0.537525612139239330, -0.537567773838461660, --0.537609934193764900, -0.537652093205042920, -0.537694250872190690, -0.537736407195103290, -0.537778562173674480, -0.537820715807799220, -0.537862868097372160, -0.537905019042288270, --0.537947168642441520, -0.537989316897726890, -0.538031463808039230, -0.538073609373272640, -0.538115753593321980, -0.538157896468081990, -0.538200037997447200, -0.538242178181312700, --0.538284317019572360, -0.538326454512121240, -0.538368590658854340, -0.538410725459665620, -0.538452858914450160, -0.538494991023102390, -0.538537121785517270, -0.538579251201589670, --0.538621379271213560, -0.538663505994284470, -0.538705631370696160, -0.538747755400343700, -0.538789878083121950, -0.538831999418925460, -0.538874119407649400, -0.538916238049187650, --0.538958355343435280, -0.539000471290287390, -0.539042585889638050, -0.539084699141382130, -0.539126811045414490, -0.539168921601629770, -0.539211030809923280, -0.539253138670188650, --0.539295245182321300, -0.539337350346216220, -0.539379454161767250, -0.539421556628869810, -0.539463657747418330, -0.539505757517308230, -0.539547855938433240, -0.539589953010688680, --0.539632048733969640, -0.539674143108169970, -0.539716236133185090, -0.539758327808909530, -0.539800418135238160, -0.539842507112066160, -0.539884594739287520, -0.539926681016797310, --0.539968765944490840, -0.540010849522262080, -0.540052931750006240, -0.540095012627617940, -0.540137092154992170, -0.540179170332024120, -0.540221247158607750, -0.540263322634638170, --0.540305396760010770, -0.540347469534619430, -0.540389540958359450, -0.540431611031125580, -0.540473679752813020, -0.540515747123315960, -0.540557813142529490, -0.540599877810348910, --0.540641941126668300, -0.540684003091382760, -0.540726063704387250, -0.540768122965576530, -0.540810180874845890, -0.540852237432089430, -0.540894292637202460, -0.540936346490080040, --0.540978398990616390, -0.541020450138706700, -0.541062499934245930, -0.541104548377128960, -0.541146595467250970, -0.541188641204506050, -0.541230685588789950, -0.541272728619996870, --0.541314770298021770, -0.541356810622759870, -0.541398849594105890, -0.541440887211955160, -0.541482923476201970, -0.541524958386741310, -0.541566991943468690, -0.541609024146278210, --0.541651054995065160, -0.541693084489724420, -0.541735112630151060, -0.541777139416240280, -0.541819164847886280, -0.541861188924984360, -0.541903211647429830, -0.541945233015116880, --0.541987253027940820, -0.542029271685796730, -0.542071288988579700, -0.542113304936184150, -0.542155319528505380, -0.542197332765438690, -0.542239344646878170, -0.542281355172719360, --0.542323364342857220, -0.542365372157186610, -0.542407378615602950, -0.542449383718000440, -0.542491387464274500, -0.542533389854320540, -0.542575390888032640, -0.542617390565306220, --0.542659388886036490, -0.542701385850118180, -0.542743381457446720, -0.542785375707916520, -0.542827368601422890, -0.542869360137861130, -0.542911350317125670, -0.542953339139111810, --0.542995326603714630, -0.543037312710829450, -0.543079297460350660, -0.543121280852173590, -0.543163262886193770, -0.543205243562305370, -0.543247222880403830, -0.543289200840384230, --0.543331177442141660, -0.543373152685571510, -0.543415126570568120, -0.543457099097026890, -0.543499070264843340, -0.543541040073911690, -0.543583008524127440, -0.543624975615385700, --0.543666941347581530, -0.543708905720610370, -0.543750868734366510, -0.543792830388745930, -0.543834790683642820, -0.543876749618952830, -0.543918707194570920, -0.543960663410392180, --0.544002618266312240, -0.544044571762225320, -0.544086523898027030, -0.544128474673612810, -0.544170424088877060, -0.544212372143715100, -0.544254318838022330, -0.544296264171693740, --0.544338208144624860, -0.544380150756710090, -0.544422092007844970, -0.544464031897924920, -0.544505970426844450, -0.544547907594499110, -0.544589843400783980, -0.544631777845594580, --0.544673710928825330, -0.544715642650371870, -0.544757573010129610, -0.544799502007993100, -0.544841429643857840, -0.544883355917618940, -0.544925280829171800, -0.544967204378411730, --0.545009126565233260, -0.545051047389531920, -0.545092966851203450, -0.545134884950142170, -0.545176801686243610, -0.545218717059403170, -0.545260631069515830, -0.545302543716477240, --0.545344455000182030, -0.545386364920525610, -0.545428273477403750, -0.545470180670710740, -0.545512086500342330, -0.545553990966193610, -0.545595894068160450, -0.545637795806137030, --0.545679696180019210, -0.545721595189702420, -0.545763492835081410, -0.545805389116051590, -0.545847284032508260, -0.545889177584346850, -0.545931069771462770, -0.545972960593750670, --0.546014850051106170, -0.546056738143424920, -0.546098624870601350, -0.546140510232531300, -0.546182394229110080, -0.546224276860232780, -0.546266158125795150, -0.546308038025691720, --0.546349916559818570, -0.546391793728070340, -0.546433669530342560, -0.546475543966530640, -0.546517417036529900, -0.546559288740235850, -0.546601159077543360, -0.546643028048347860, --0.546684895652545190, -0.546726761890030000, -0.546768626760697820, -0.546810490264444060, -0.546852352401164140, -0.546894213170753600, -0.546936072573107280, -0.546977930608120720, --0.547019787275689670, -0.547061642575708880, -0.547103496508073880, -0.547145349072680200, -0.547187200269423470, -0.547229050098198440, -0.547270898558900760, -0.547312745651426180, --0.547354591375669330, -0.547396435731526080, -0.547438278718891720, -0.547480120337661690, -0.547521960587731620, -0.547563799468996360, -0.547605636981351560, -0.547647473124693080, --0.547689307898915570, -0.547731141303914760, -0.547772973339586080, -0.547814804005825050, -0.547856633302527320, -0.547898461229587630, -0.547940287786902180, -0.547982112974365610, --0.548023936791873780, -0.548065759239321990, -0.548107580316606000, -0.548149400023621340, -0.548191218360262740, -0.548233035326426200, -0.548274850922007340, -0.548316665146901140, --0.548358478001003120, -0.548400289484208940, -0.548442099596414100, -0.548483908337514370, -0.548525715707404490, -0.548567521705980220, -0.548609326333137640, -0.548651129588771380, --0.548692931472777200, -0.548734731985050740, -0.548776531125487850, -0.548818328893983300, -0.548860125290432820, -0.548901920314732390, -0.548943713966776880, -0.548985506246462030, --0.549027297153683480, -0.549069086688336650, -0.549110874850317400, -0.549152661639520700, -0.549194447055842310, -0.549236231099178180, -0.549278013769423090, -0.549319795066472990, --0.549361574990223310, -0.549403353540569790, -0.549445130717408190, -0.549486906520633480, -0.549528680950141400, -0.549570454005828050, -0.549612225687588160, -0.549653995995317720, --0.549695764928912370, -0.549737532488267950, -0.549779298673279240, -0.549821063483842300, -0.549862826919853110, -0.549904588981206530, -0.549946349667798430, -0.549988108979524440, --0.550029866916280200, -0.550071623477961680, -0.550113378664463640, -0.550155132475682260, -0.550196884911513310, -0.550238635971851850, -0.550280385656593870, -0.550322133965634790, --0.550363880898870450, -0.550405626456196730, -0.550447370637508700, -0.550489113442702460, -0.550530854871673190, -0.550572594924316650, -0.550614333600528690, -0.550656070900204960, --0.550697806823241320, -0.550739541369532850, -0.550781274538975520, -0.550823006331465410, -0.550864736746897400, -0.550906465785167440, -0.550948193446171410, -0.550989919729804930, --0.551031644635963990, -0.551073368164543550, -0.551115090315439700, -0.551156811088548420, -0.551198530483764880, -0.551240248500984850, -0.551281965140104410, -0.551323680401019310, --0.551365394283624630, -0.551407106787816460, -0.551448817913490870, -0.551490527660542960, -0.551532236028868580, -0.551573943018363710, -0.551615648628924090, -0.551657352860445590, --0.551699055712823290, -0.551740757185953390, -0.551782457279732070, -0.551824155994054100, -0.551865853328815880, -0.551907549283912950, -0.551949243859241050, -0.551990937054696600, --0.552032628870174350, -0.552074319305570490, -0.552116008360781230, -0.552157696035701530, -0.552199382330227690, -0.552241067244255370, -0.552282750777680740, -0.552324432930398790, --0.552366113702305820, -0.552407793093298020, -0.552449471103270250, -0.552491147732118830, -0.552532822979739490, -0.552574496846028220, -0.552616169330880980, -0.552657840434192970, --0.552699510155860390, -0.552741178495779420, -0.552782845453845040, -0.552824511029953560, -0.552866175224000940, -0.552907838035882730, -0.552949499465495320, -0.552991159512733810, --0.553032818177494830, -0.553074475459673360, -0.553116131359165820, -0.553157785875867840, -0.553199439009675390, -0.553241090760484780, -0.553282741128190980, -0.553324390112690410, --0.553366037713879160, -0.553407683931652520, -0.553449328765906690, -0.553490972216537420, -0.553532614283440800, -0.553574254966513020, -0.553615894265649280, -0.553657532180745650, --0.553699168711698660, -0.553740803858403410, -0.553782437620756070, -0.553824069998652750, -0.553865700991989510, -0.553907330600661660, -0.553948958824565520, -0.553990585663597380, --0.554032211117652440, -0.554073835186626900, -0.554115457870416720, -0.554157079168917990, -0.554198699082026900, -0.554240317609638660, -0.554281934751649660, -0.554323550507956230, --0.554365164878453440, -0.554406777863037830, -0.554448389461605240, -0.554489999674051770, -0.554531608500273610, -0.554573215940165950, -0.554614821993625440, -0.554656426660548150, --0.554698029940829400, -0.554739631834365590, -0.554781232341052700, -0.554822831460787150, -0.554864429193464130, -0.554906025538979940, -0.554947620497231120, -0.554989214068112970, --0.555030806251521680, -0.555072397047353340, -0.555113986455504140, -0.555155574475870270, -0.555197161108347050, -0.555238746352830990, -0.555280330209218410, -0.555321912677404720, --0.555363493757286110, -0.555405073448758890, -0.555446651751718920, -0.555488228666062730, -0.555529804191685520, -0.555571378328484240, -0.555612951076354110, -0.555654522435191640, --0.555696092404892820, -0.555737660985353820, -0.555779228176470960, -0.555820793978139660, -0.555862358390256440, -0.555903921412717720, -0.555945483045418800, -0.555987043288256100, --0.556028602141125820, -0.556070159603924140, -0.556111715676547270, -0.556153270358890840, -0.556194823650851270, -0.556236375552324970, -0.556277926063207360, -0.556319475183394860, --0.556361022912783780, -0.556402569251270410, -0.556444114198750390, -0.556485657755119930, -0.556527199920275770, -0.556568740694113330, -0.556610280076528910, -0.556651818067418810, --0.556693354666679130, -0.556734889874206500, -0.556776423689896330, -0.556817956113645040, -0.556859487145349160, -0.556901016784904330, -0.556942545032206860, -0.556984071887153040, --0.557025597349639080, -0.557067121419561380, -0.557108644096815600, -0.557150165381298250, -0.557191685272905860, -0.557233203771533850, -0.557274720877078740, -0.557316236589436960, --0.557357750908504920, -0.557399263834178040, -0.557440775366353170, -0.557482285504926620, -0.557523794249794040, -0.557565301600851940, -0.557606807557996520, -0.557648312121124200, --0.557689815290131400, -0.557731317064913750, -0.557772817445367770, -0.557814316431390120, -0.557855814022876320, -0.557897310219722890, -0.557938805021826360, -0.557980298429082700, --0.558021790441388670, -0.558063281058639780, -0.558104770280733130, -0.558146258107564130, -0.558187744539029530, -0.558229229575025520, -0.558270713215448520, -0.558312195460194950, --0.558353676309160660, -0.558395155762242080, -0.558436633819336060, -0.558478110480338130, -0.558519585745144820, -0.558561059613652540, -0.558602532085757720, -0.558644003161356870, --0.558685472840345640, -0.558726941122620670, -0.558768408008078810, -0.558809873496615590, -0.558851337588127550, -0.558892800282511320, -0.558934261579663310, -0.558975721479479380, --0.559017179981856070, -0.559058637086690240, -0.559100092793877510, -0.559141547103314430, -0.559183000014897510, -0.559224451528523180, -0.559265901644087960, -0.559307350361487710, --0.559348797680619070, -0.559390243601378680, -0.559431688123662510, -0.559473131247366970, -0.559514572972388710, -0.559556013298623920, -0.559597452225969460, -0.559638889754321080, --0.559680325883575860, -0.559721760613629440, -0.559763193944378570, -0.559804625875719660, -0.559846056407549360, -0.559887485539764200, -0.559928913272259910, -0.559970339604933360, --0.560011764537681310, -0.560053188070399610, -0.560094610202984790, -0.560136030935333480, -0.560177450267342110, -0.560218868198907540, -0.560260284729925400, -0.560301699860292550, --0.560343113589905740, -0.560384525918660840, -0.560425936846454590, -0.560467346373183520, -0.560508754498744160, -0.560550161223033140, -0.560591566545946440, -0.560632970467381140, --0.560674372987233110, -0.560715774105399190, -0.560757173821775700, -0.560798572136259390, -0.560839969048746890, -0.560881364559134180, -0.560922758667318110, -0.560964151373195440, --0.561005542676662030, -0.561046932577614840, -0.561088321075950190, -0.561129708171564820, -0.561171093864355600, -0.561212478154218150, -0.561253861041049570, -0.561295242524746720, --0.561336622605205340, -0.561378001282322400, -0.561419378555994550, -0.561460754426118540, -0.561502128892590320, -0.561543501955306780, -0.561584873614164870, -0.561626243869060350, --0.561667612719890190, -0.561708980166551130, -0.561750346208939490, -0.561791710846952450, -0.561833074080485660, -0.561874435909436310, -0.561915796333701150, -0.561957155353176140, --0.561998512967758270, -0.562039869177344050, -0.562081223981830250, -0.562122577381113710, -0.562163929375090410, -0.562205279963657540, -0.562246629146711200, -0.562287976924148340, --0.562329323295865380, -0.562370668261759190, -0.562412011821726730, -0.562453353975663870, -0.562494694723467580, -0.562536034065034940, -0.562577372000261810, -0.562618708529045390, --0.562660043651282080, -0.562701377366868650, -0.562742709675702170, -0.562784040577678500, -0.562825370072694840, -0.562866698160648050, -0.562908024841434210, -0.562949350114950180, --0.562990673981092930, -0.563031996439759210, -0.563073317490845220, -0.563114637134247920, -0.563155955369864400, -0.563197272197590640, -0.563238587617323700, -0.563279901628960240, --0.563321214232397120, -0.563362525427531290, -0.563403835214258740, -0.563445143592476660, -0.563486450562082020, -0.563527756122970900, -0.563569060275040390, -0.563610363018187230, --0.563651664352308290, -0.563692964277300420, -0.563734262793059830, -0.563775559899483470, -0.563816855596468660, -0.563858149883911360, -0.563899442761708670, -0.563940734229757430, --0.563982024287954630, -0.564023312936196450, -0.564064600174379980, -0.564105886002402410, -0.564147170420159720, -0.564188453427549090, -0.564229735024467380, -0.564271015210811240, --0.564312293986477980, -0.564353571351363660, -0.564394847305365380, -0.564436121848380320, -0.564477394980304580, -0.564518666701035450, -0.564559937010469580, -0.564601205908503930, --0.564642473395035480, -0.564683739469960640, -0.564725004133176720, -0.564766267384580020, -0.564807529224067520, -0.564848789651536290, -0.564890048666883080, -0.564931306270005100, --0.564972562460798520, -0.565013817239160550, -0.565055070604988270, -0.565096322558178100, -0.565137573098627000, -0.565178822226232060, -0.565220069940890020, -0.565261316242498200, --0.565302561130952670, -0.565343804606150860, -0.565385046667989830, -0.565426287316365790, -0.565467526551176050, -0.565508764372317450, -0.565550000779687310, -0.565591235773181930, --0.565632469352698290, -0.565673701518134010, -0.565714932269384960, -0.565756161606348670, -0.565797389528922000, -0.565838616037001810, -0.565879841130485390, -0.565921064809269070, --0.565962287073250030, -0.566003507922325680, -0.566044727356392220, -0.566085945375346960, -0.566127161979086750, -0.566168377167508670, -0.566209590940510040, -0.566250803297987050, --0.566292014239837100, -0.566333223765957410, -0.566374431876244370, -0.566415638570595180, -0.566456843848906930, -0.566498047711076920, -0.566539250157001350, -0.566580451186577740, --0.566621650799703390, -0.566662848996274500, -0.566704045776188490, -0.566745241139342440, -0.566786435085633200, -0.566827627614958200, -0.566868818727213840, -0.566910008422297440, --0.566951196700106410, -0.566992383560536940, -0.567033569003486560, -0.567074753028852240, -0.567115935636531070, -0.567157116826420450, -0.567198296598416580, -0.567239474952417440, --0.567280651888319110, -0.567321827406019220, -0.567363001505414850, -0.567404174186402880, -0.567445345448880810, -0.567486515292745080, -0.567527683717893080, -0.567568850724222250, --0.567610016311628770, -0.567651180480010400, -0.567692343229264100, -0.567733504559286840, -0.567774664469976150, -0.567815822961228570, -0.567856980032941380, -0.567898135685012130, --0.567939289917337110, -0.567980442729813850, -0.568021594122339550, -0.568062744094811610, -0.568103892647126460, -0.568145039779181520, -0.568186185490874410, -0.568227329782101440, --0.568268472652760150, -0.568309614102747720, -0.568350754131961230, -0.568391892740298220, -0.568433029927655100, -0.568474165693929390, -0.568515300039018620, -0.568556432962819320, --0.568597564465228800, -0.568638694546144460, -0.568679823205463400, -0.568720950443083130, -0.568762076258900070, -0.568803200652811870, -0.568844323624716040, -0.568885445174509010, --0.568926565302088410, -0.568967684007351430, -0.569008801290195490, -0.569049917150517230, -0.569091031588214170, -0.569132144603183950, -0.569173256195323000, -0.569214366364528820, --0.569255475110698740, -0.569296582433730050, -0.569337688333520160, -0.569378792809965840, -0.569419895862964380, -0.569460997492413630, -0.569502097698210030, -0.569543196480251200, --0.569584293838434340, -0.569625389772656750, -0.569666484282816080, -0.569707577368808730, -0.569748669030532890, -0.569789759267885000, -0.569830848080762680, -0.569871935469063340, --0.569913021432684070, -0.569954105971522630, -0.569995189085475530, -0.570036270774440520, -0.570077351038315140, -0.570118429876996120, -0.570159507290380900, -0.570200583278366980, --0.570241657840851570, -0.570282730977732410, -0.570323802688906030, -0.570364872974270190, -0.570405941833722510, -0.570447009267159630, -0.570488075274479200, -0.570529139855578520, --0.570570203010355440, -0.570611264738706490, -0.570652325040529320, -0.570693383915721770, -0.570734441364180390, -0.570775497385802800, -0.570816551980486530, -0.570857605148128890, --0.570898656888627620, -0.570939707201879370, -0.570980756087781760, -0.571021803546232780, -0.571062849577128830, -0.571103894180367670, -0.571144937355846930, -0.571185979103463690, --0.571227019423115930, -0.571268058314700290, -0.571309095778114510, -0.571350131813256330, -0.571391166420022520, -0.571432199598310710, -0.571473231348018420, -0.571514261669043400, --0.571555290561282400, -0.571596318024633180, -0.571637344058993580, -0.571678368664260140, -0.571719391840330830, -0.571760413587103060, -0.571801433904474240, -0.571842452792342140, --0.571883470250603600, -0.571924486279156370, -0.571965500877898330, -0.572006514046726200, -0.572047525785537640, -0.572088536094230380, -0.572129544972701740, -0.572170552420849690, --0.572211558438570740, -0.572252563025763330, -0.572293566182324190, -0.572334567908151070, -0.572375568203141620, -0.572416567067193240, -0.572457564500203690, -0.572498560502069930, --0.572539555072689830, -0.572580548211961140, -0.572621539919780710, -0.572662530196046520, -0.572703519040655860, -0.572744506453506500, -0.572785492434496170, -0.572826476983521850, --0.572867460100481280, -0.572908441785272340, -0.572949422037792090, -0.572990400857938180, -0.573031378245608350, -0.573072354200700350, -0.573113328723111160, -0.573154301812738630, --0.573195273469480630, -0.573236243693234230, -0.573277212483897070, -0.573318179841367010, -0.573359145765541480, -0.573400110256318430, -0.573441073313594730, -0.573482034937268240, --0.573522995127237150, -0.573563953883398200, -0.573604911205649380, -0.573645867093888210, -0.573686821548012430, -0.573727774567920010, -0.573768726153507710, -0.573809676304673940, --0.573850625021315670, -0.573891572303330880, -0.573932518150617080, -0.573973462563072020, -0.574014405540593690, -0.574055347083078930, -0.574096287190425820, -0.574137225862532350, --0.574178163099295480, -0.574219098900613180, -0.574260033266383090, -0.574300966196502950, -0.574341897690870740, -0.574382827749383540, -0.574423756371939100, -0.574464683558435720, --0.574505609308770260, -0.574546533622840800, -0.574587456500544990, -0.574628377941780900, -0.574669297946445500, -0.574710216514436880, -0.574751133645653110, -0.574792049339991060, --0.574832963597348920, -0.574873876417624330, -0.574914787800715140, -0.574955697746519220, -0.574996606254933870, -0.575037513325856840, -0.575078418959186430, -0.575119323154819620, --0.575160225912654590, -0.575201127232588870, -0.575242027114520440, -0.575282925558347260, -0.575323822563966300, -0.575364718131275880, -0.575405612260174060, -0.575446504950557820, --0.575487396202325250, -0.575528286015374310, -0.575569174389602980, -0.575610061324908330, -0.575650946821188450, -0.575691830878341640, -0.575732713496264870, -0.575773594674856340, --0.575814474414013900, -0.575855352713635190, -0.575896229573618410, -0.575937104993860750, -0.575977978974260400, -0.576018851514715320, -0.576059722615122840, -0.576100592275381020, --0.576141460495387720, -0.576182327275040820, -0.576223192614238490, -0.576264056512877710, -0.576304918970857230, -0.576345779988074010, -0.576386639564426370, -0.576427497699812160, --0.576468354394129250, -0.576509209647275700, -0.576550063459148830, -0.576590915829646830, -0.576631766758667790, -0.576672616246109100, -0.576713464291868870, -0.576754310895844840, --0.576795156057935190, -0.576835999778037900, -0.576876842056050280, -0.576917682891870620, -0.576958522285397010, -0.576999360236526870, -0.577040196745158160, -0.577081031811189080, --0.577121865434517820, -0.577162697615041460, -0.577203528352658310, -0.577244357647266780, -0.577285185498763950, -0.577326011907048130, -0.577366836872017400, -0.577407660393569500, --0.577448482471602740, -0.577489303106014540, -0.577530122296702970, -0.577570940043566570, -0.577611756346502410, -0.577652571205408800, -0.577693384620183830, -0.577734196590725340, --0.577775007116931750, -0.577815816198700370, -0.577856623835929280, -0.577897430028517120, -0.577938234776360970, -0.577979038079359240, -0.578019839937410020, -0.578060640350411380, --0.578101439318260860, -0.578142236840856860, -0.578183032918097470, -0.578223827549880220, -0.578264620736103300, -0.578305412476664890, -0.578346202771462980, -0.578386991620395860, --0.578427779023360960, -0.578468564980256560, -0.578509349490981210, -0.578550132555432080, -0.578590914173507500, -0.578631694345105750, -0.578672473070124820, -0.578713250348462990, --0.578754026180017590, -0.578794800564687570, -0.578835573502370250, -0.578876344992963920, -0.578917115036366780, -0.578957883632476800, -0.578998650781192500, -0.579039416482411200, --0.579080180736031290, -0.579120943541951430, -0.579161704900068800, -0.579202464810281810, -0.579243223272488780, -0.579283980286587670, -0.579324735852476900, -0.579365489970053990, --0.579406242639217360, -0.579446993859865420, -0.579487743631895700, -0.579528491955206610, -0.579569238829696240, -0.579609984255263220, -0.579650728231804860, -0.579691470759219670, --0.579732211837406200, -0.579772951466261730, -0.579813689645684920, -0.579854426375573940, -0.579895161655826890, -0.579935895486342280, -0.579976627867017540, -0.580017358797751290, --0.580058088278441960, -0.580098816308987080, -0.580139542889285040, -0.580180268019234280, -0.580220991698732760, -0.580261713927679220, -0.580302434705970980, -0.580343154033506670, --0.580383871910184810, -0.580424588335902940, -0.580465303310559570, -0.580506016834053010, -0.580546728906281670, -0.580587439527143200, -0.580628148696536120, -0.580668856414359060, --0.580709562680509440, -0.580750267494885900, -0.580790970857386730, -0.580831672767910150, -0.580872373226354770, -0.580913072232618120, -0.580953769786598630, -0.580994465888195260, --0.581035160537305310, -0.581075853733827420, -0.581116545477659900, -0.581157235768701040, -0.581197924606849380, -0.581238611992002660, -0.581279297924059750, -0.581319982402918160, --0.581360665428476640, -0.581401347000633510, -0.581442027119286940, -0.581482705784335700, -0.581523382995677300, -0.581564058753210490, -0.581604733056833910, -0.581645405906445090, --0.581686077301942770, -0.581726747243225260, -0.581767415730190860, -0.581808082762738320, -0.581848748340765280, -0.581889412464170250, -0.581930075132852110, -0.581970736346708370, --0.582011396105637790, -0.582052054409538780, -0.582092711258309970, -0.582133366651849000, -0.582174020590054630, -0.582214673072825590, -0.582255324100059420, -0.582295973671655090, --0.582336621787510780, -0.582377268447524800, -0.582417913651596120, -0.582458557399622270, -0.582499199691501990, -0.582539840527134150, -0.582580479906416260, -0.582621117829247190, --0.582661754295525360, -0.582702389305149170, -0.582743022858017270, -0.582783654954027510, -0.582824285593078640, -0.582864914775069410, -0.582905542499897460, -0.582946168767461750, --0.582986793577660590, -0.583027416930392840, -0.583068038825556020, -0.583108659263049330, -0.583149278242771190, -0.583189895764619550, -0.583230511828493170, -0.583271126434290580, --0.583311739581910070, -0.583352351271250620, -0.583392961502209870, -0.583433570274686790, -0.583474177588580110, -0.583514783443787710, -0.583555387840208220, -0.583595990777740380, --0.583636592256282500, -0.583677192275733450, -0.583717790835991070, -0.583758387936954670, -0.583798983578521890, -0.583839577760591590, -0.583880170483062400, -0.583920761745832850, --0.583961351548801690, -0.584001939891866770, -0.584042526774927070, -0.584083112197881340, -0.584123696160627540, -0.584164278663064420, -0.584204859705090620, -0.584245439286604660, --0.584286017407505520, -0.584326594067690940, -0.584367169267059890, -0.584407743005511350, -0.584448315282942940, -0.584488886099253870, -0.584529455454342540, -0.584570023348107930, --0.584610589780447890, -0.584651154751261390, -0.584691718260447300, -0.584732280307903700, -0.584772840893529210, -0.584813400017222820, -0.584853957678882820, -0.584894513878408300, --0.584935068615697110, -0.584975621890648220, -0.585016173703160720, -0.585056724053132360, -0.585097272940462210, -0.585137820365048910, -0.585178366326791100, -0.585218910825587630, --0.585259453861336600, -0.585299995433937290, -0.585340535543287580, -0.585381074189286530, -0.585421611371832800, -0.585462147090825110, -0.585502681346162350, -0.585543214137742570, --0.585583745465464660, -0.585624275329227780, -0.585664803728929930, -0.585705330664470060, -0.585745856135746810, -0.585786380142658940, -0.585826902685105510, -0.585867423762984400, --0.585907943376194780, -0.585948461524635640, -0.585988978208204950, -0.586029493426801880, -0.586070007180325090, -0.586110519468673540, -0.586151030291745420, -0.586191539649439710, --0.586232047541655590, -0.586272553968290810, -0.586313058929244790, -0.586353562424416050, -0.586394064453703460, -0.586434565017005970, -0.586475064114221790, -0.586515561745249990, --0.586556057909989550, -0.586596552608338650, -0.586637045840196380, -0.586677537605461490, -0.586718027904032710, -0.586758516735809250, -0.586799004100689190, -0.586839489998571610, --0.586879974429355580, -0.586920457392939300, -0.586960938889221960, -0.587001418918102200, -0.587041897479479210, -0.587082374573251190, -0.587122850199317200, -0.587163324357576450, --0.587203797047927020, -0.587244268270268100, -0.587284738024498430, -0.587325206310516990, -0.587365673128222960, -0.587406138477514330, -0.587446602358290380, -0.587487064770450210, --0.587527525713892110, -0.587567985188515160, -0.587608443194218230, -0.587648899730900180, -0.587689354798460300, -0.587729808396796560, -0.587770260525808720, -0.587810711185394960, --0.587851160375454260, -0.587891608095885810, -0.587932054346588240, -0.587972499127460970, -0.588012942438402080, -0.588053384279310750, -0.588093824650086420, -0.588134263550627150, --0.588174700980832130, -0.588215136940600460, -0.588255571429830870, -0.588296004448422780, -0.588336435996274280, -0.588376866073284650, -0.588417294679353330, -0.588457721814378390, --0.588498147478259010, -0.588538571670894410, -0.588578994392183750, -0.588619415642025130, -0.588659835420318080, -0.588700253726961660, -0.588740670561854420, -0.588781085924895420, --0.588821499815983640, -0.588861912235018160, -0.588902323181898280, -0.588942732656522190, -0.588983140658789320, -0.589023547188598950, -0.589063952245849400, -0.589104355830439850, --0.589144757942269500, -0.589185158581237210, -0.589225557747242500, -0.589265955440183340, -0.589306351659959480, -0.589346746406470000, -0.589387139679613310, -0.589427531479288720, --0.589467921805395420, -0.589508310657832600, -0.589548698036498560, -0.589589083941292950, -0.589629468372114830, -0.589669851328862850, -0.589710232811436090, -0.589750612819733840, --0.589790991353654980, -0.589831368413099020, -0.589871743997964380, -0.589912118108150250, -0.589952490743556270, -0.589992861904080620, -0.590033231589622950, -0.590073599800082120, --0.590113966535357300, -0.590154331795347930, -0.590194695579952300, -0.590235057889070380, -0.590275418722600360, -0.590315778080441890, -0.590356135962493920, -0.590396492368655660, --0.590436847298826510, -0.590477200752904880, -0.590517552730790210, -0.590557903232382110, -0.590598252257578780, -0.590638599806279860, -0.590678945878384540, -0.590719290473791680, --0.590759633592401130, -0.590799975234110990, -0.590840315398820980, -0.590880654086430530, -0.590920991296838060, -0.590961327029943200, -0.591001661285644910, -0.591041994063842950, --0.591082325364435500, -0.591122655187322320, -0.591162983532402930, -0.591203310399575630, -0.591243635788740060, -0.591283959699795410, -0.591324282132640880, -0.591364603087175980, --0.591404922563299240, -0.591445240560910190, -0.591485557079908350, -0.591525872120192250, -0.591566185681661530, -0.591606497764215370, -0.591646808367752850, -0.591687117492173840, --0.591727425137376530, -0.591767731303260660, -0.591808035989725870, -0.591848339196670680, -0.591888640923994620, -0.591928941171596890, -0.591969239939377220, -0.592009537227234040, --0.592049833035067090, -0.592090127362775890, -0.592130420210258970, -0.592170711577416080, -0.592211001464146290, -0.592251289870349140, -0.592291576795924040, -0.592331862240769610, --0.592372146204785620, -0.592412428687871580, -0.592452709689926140, -0.592492989210848810, -0.592533267250539120, -0.592573543808896260, -0.592613818885819880, -0.592654092481208480, --0.592694364594962390, -0.592734635226979890, -0.592774904377160960, -0.592815172045404570, -0.592855438231610350, -0.592895702935677950, -0.592935966157505880, -0.592976227896993890, --0.593016488154041730, -0.593056746928547930, -0.593097004220412230, -0.593137260029534150, -0.593177514355812780, -0.593217767199148090, -0.593258018559438600, -0.593298268436584060, --0.593338516830484220, -0.593378763741037710, -0.593419009168144270, -0.593459253111703330, -0.593499495571614630, -0.593539736547776810, -0.593579976040089610, -0.593620214048452890, --0.593660450572765290, -0.593700685612926550, -0.593740919168836090, -0.593781151240393210, -0.593821381827498000, -0.593861610930048860, -0.593901838547945760, -0.593942064681088340, --0.593982289329375470, -0.594022512492706880, -0.594062734170981990, -0.594102954364100320, -0.594143173071961520, -0.594183390294464430, -0.594223606031508920, -0.594263820282994850, --0.594304033048820730, -0.594344244328886550, -0.594384454123091820, -0.594424662431336180, -0.594464869253518600, -0.594505074589538940, -0.594545278439296830, -0.594585480802691250, --0.594625681679621930, -0.594665881069988410, -0.594706078973690100, -0.594746275390627080, -0.594786470320697980, -0.594826663763802670, -0.594866855719841100, -0.594907046188712040, --0.594947235170315340, -0.594987422664550510, -0.595027608671317210, -0.595067793190515170, -0.595107976222043260, -0.595148157765801880, -0.595188337821689670, -0.595228516389606610, --0.595268693469452330, -0.595308869061126230, -0.595349043164528410, -0.595389215779557610, -0.595429386906113690, -0.595469556544096720, -0.595509724693405460, -0.595549891353939990, --0.595590056525599710, -0.595630220208284270, -0.595670382401893630, -0.595710543106326760, -0.595750702321483530, -0.595790860047263780, -0.595831016283566610, -0.595871171030291860, --0.595911324287339280, -0.595951476054608630, -0.595991626331998980, -0.596031775119410300, -0.596071922416742560, -0.596112068223894510, -0.596152212540766450, -0.596192355367257790, --0.596232496703268280, -0.596272636548697780, -0.596312774903445360, -0.596352911767411120, -0.596393047140494900, -0.596433181022595680, -0.596473313413613540, -0.596513444313448100, --0.596553573721999020, -0.596593701639166360, -0.596633828064849100, -0.596673952998947650, -0.596714076441360990, -0.596754198391989070, -0.596794318850731640, -0.596834437817488460, --0.596874555292159600, -0.596914671274643930, -0.596954785764841620, -0.596994898762652660, -0.597035010267976120, -0.597075120280711970, -0.597115228800760180, -0.597155335828020160, --0.597195441362392220, -0.597235545403775330, -0.597275647952069550, -0.597315749007175100, -0.597355848568990820, -0.597395946637417020, -0.597436043212353220, -0.597476138293699720, --0.597516231881355610, -0.597556323975220850, -0.597596414575195630, -0.597636503681178930, -0.597676591293071050, -0.597716677410771720, -0.597756762034180710, -0.597796845163198090, --0.597836926797723050, -0.597877006937655660, -0.597917085582896140, -0.597957162733343540, -0.597997238388898070, -0.598037312549459470, -0.598077385214927480, -0.598117456385202530, --0.598157526060183580, -0.598197594239770700, -0.598237660923864320, -0.598277726112363410, -0.598317789805168140, -0.598357852002178390, -0.598397912703294340, -0.598437971908415190, --0.598478029617441120, -0.598518085830272330, -0.598558140546808000, -0.598598193766948230, -0.598638245490593080, -0.598678295717642310, -0.598718344447996100, -0.598758391681553650, --0.598798437418215260, -0.598838481657881120, -0.598878524400450420, -0.598918565645823460, -0.598958605393900000, -0.598998643644580110, -0.599038680397763980, -0.599078715653350690, --0.599118749411240990, -0.599158781671334180, -0.599198812433530350, -0.599238841697729450, -0.599278869463831470, -0.599318895731736580, -0.599358920501344210, -0.599398943772554540, --0.599438965545267880, -0.599478985819383410, -0.599519004594801450, -0.599559021871421960, -0.599599037649145020, -0.599639051927870700, -0.599679064707498540, -0.599719075987928620, --0.599759085769061450, -0.599799094050796120, -0.599839100833033050, -0.599879106115672300, -0.599919109898614080, -0.599959112181757790, -0.599999112965003740, -0.600039112248252240, --0.600079110031402570, -0.600119106314355170, -0.600159101097009870, -0.600199094379267000, -0.600239086161026610, -0.600279076442188250, -0.600319065222652100, -0.600359052502318800, --0.600399038281087320, -0.600439022558858390, -0.600479005335531890, -0.600518986611007780, -0.600558966385186690, -0.600598944657967700, -0.600638921429251460, -0.600678896698938150, --0.600718870466927290, -0.600758842733119300, -0.600798813497414150, -0.600838782759712360, -0.600878750519913350, -0.600918716777917310, -0.600958681533624860, -0.600998644786935430, --0.601038606537749320, -0.601078566785966720, -0.601118525531487700, -0.601158482774212690, -0.601198438514041200, -0.601238392750873540, -0.601278345484610230, -0.601318296715150800, --0.601358246442395550, -0.601398194666244670, -0.601438141386598350, -0.601478086603357000, -0.601518030316420150, -0.601557972525688540, -0.601597913231061600, -0.601637852432439950, --0.601677790129723560, -0.601717726322812840, -0.601757661011607990, -0.601797594196008760, -0.601837525875915550, -0.601877456051228780, -0.601917384721848080, -0.601957311887673980, --0.601997237548606570, -0.602037161704546020, -0.602077084355392870, -0.602117005501046740, -0.602156925141408060, -0.602196843276377460, -0.602236759905854350, -0.602276675029739360, --0.602316588647932690, -0.602356500760334980, -0.602396411366845520, -0.602436320467365170, -0.602476228061794240, -0.602516134150032470, -0.602556038731980380, -0.602595941807538060, --0.602635843376606030, -0.602675743439084700, -0.602715641994873600, -0.602755539043873470, -0.602795434585984840, -0.602835328621107220, -0.602875221149141380, -0.602915112169987390, --0.602955001683545650, -0.602994889689716820, -0.603034776188400290, -0.603074661179496930, -0.603114544662907260, -0.603154426638530810, -0.603194307106268310, -0.603234186066020080, --0.603274063517686640, -0.603313939461167850, -0.603353813896364110, -0.603393686823176180, -0.603433558241503690, -0.603473428151247380, -0.603513296552307340, -0.603553163444584210, --0.603593028827978490, -0.603632892702389840, -0.603672755067718890, -0.603712615923866490, -0.603752475270732170, -0.603792333108216670, -0.603832189436220300, -0.603872044254643470, --0.603911897563386920, -0.603951749362350300, -0.603991599651434560, -0.604031448430539570, -0.604071295699565860, -0.604111141458414050, -0.604150985706984220, -0.604190828445177350, --0.604230669672893070, -0.604270509390032130, -0.604310347596495270, -0.604350184292182120, -0.604390019476993560, -0.604429853150829980, -0.604469685313591800, -0.604509515965179660, --0.604549345105493410, -0.604589172734433800, -0.604628998851901580, -0.604668823457796600, -0.604708646552019500, -0.604748468134470700, -0.604788288205051260, -0.604828106763660610, --0.604867923810199710, -0.604907739344569430, -0.604947553366669390, -0.604987365876400450, -0.605027176873663140, -0.605066986358357870, -0.605106794330385500, -0.605146600789645770, --0.605186405736039550, -0.605226209169467680, -0.605266011089829910, -0.605305811497027110, -0.605345610390959800, -0.605385407771528490, -0.605425203638634060, -0.605464997992176120, --0.605504790832055770, -0.605544582158173860, -0.605584371970430020, -0.605624160268725340, -0.605663947052960230, -0.605703732323035540, -0.605743516078851240, -0.605783298320308080, --0.605823079047307140, -0.605862858259748060, -0.605902635957531910, -0.605942412140559110, -0.605982186808730280, -0.606021959961946300, -0.606061731600107120, -0.606101501723113610, --0.606141270330866730, -0.606181037423266340, -0.606220803000213300, -0.606260567061608250, -0.606300329607351810, -0.606340090637344840, -0.606379850151487320, -0.606419608149680540, --0.606459364631824370, -0.606499119597819880, -0.606538873047567480, -0.606578624980967930, -0.606618375397922180, -0.606658124298330100, -0.606697871682092770, -0.606737617549111040, --0.606777361899284990, -0.606817104732515490, -0.606856846048703270, -0.606896585847748970, -0.606936324129553450, -0.606976060894016790, -0.607015796141040060, -0.607055529870524140, --0.607095262082368970, -0.607134992776475760, -0.607174721952745020, -0.607214449611077840, -0.607254175751374190, -0.607293900373535030, -0.607333623477461560, -0.607373345063053630, --0.607413065130212430, -0.607452783678838480, -0.607492500708832540, -0.607532216220095790, -0.607571930212528090, -0.607611642686030520, -0.607651353640504270, -0.607691063075849300, --0.607730770991966600, -0.607770477388757000, -0.607810182266121270, -0.607849885623960360, -0.607889587462174360, -0.607929287780664800, -0.607968986579331740, -0.608008683858076050, --0.608048379616798810, -0.608088073855400530, -0.608127766573782420, -0.608167457771844560, -0.608207147449488120, -0.608246835606614080, -0.608286522243122520, -0.608326207358914850, --0.608365890953891490, -0.608405573027953510, -0.608445253581001880, -0.608484932612936790, -0.608524610123659440, -0.608564286113070900, -0.608603960581071140, -0.608643633527561680, --0.608683304952442940, -0.608722974855616110, -0.608762643236982150, -0.608802310096441150, -0.608841975433894840, -0.608881639249243210, -0.608921301542387440, -0.608960962313228380, --0.609000621561667010, -0.609040279287604400, -0.609079935490940750, -0.609119590171577240, -0.609159243329415070, -0.609198894964354530, -0.609238545076296710, -0.609278193665142460, --0.609317840730792870, -0.609357486273148900, -0.609397130292110960, -0.609436772787580130, -0.609476413759457710, -0.609516053207643900, -0.609555691132040000, -0.609595327532546860, --0.609634962409065780, -0.609674595761496960, -0.609714227589741590, -0.609753857893700960, -0.609793486673275490, -0.609833113928366140, -0.609872739658874120, -0.609912363864700160, --0.609951986545745670, -0.609991607701910970, -0.610031227333097110, -0.610070845439205640, -0.610110462020136630, -0.610150077075791500, -0.610189690606071090, -0.610229302610876600, --0.610268913090109110, -0.610308522043669030, -0.610348129471458000, -0.610387735373376210, -0.610427339749325170, -0.610466942599205750, -0.610506543922918920, -0.610546143720366200, --0.610585741991447660, -0.610625338736064840, -0.610664933954119030, -0.610704527645510530, -0.610744119810140650, -0.610783710447910470, -0.610823299558721060, -0.610862887142473720, --0.610902473199068870, -0.610942057728407820, -0.610981640730391960, -0.611021222204921610, -0.611060802151898290, -0.611100380571222850, -0.611139957462796920, -0.611179532826520710, --0.611219106662295620, -0.611258678970023170, -0.611298249749603670, -0.611337819000938530, -0.611377386723928830, -0.611416952918475640, -0.611456517584480500, -0.611496080721843690, --0.611535642330466640, -0.611575202410250870, -0.611614760961096680, -0.611654317982905700, -0.611693873475578800, -0.611733427439017370, -0.611772979873122620, -0.611812530777795070, --0.611852080152936240, -0.611891627998447430, -0.611931174314229390, -0.611970719100183300, -0.612010262356210370, -0.612049804082212210, -0.612089344278089250, -0.612128882943742790, --0.612168420079074570, -0.612207955683984890, -0.612247489758375400, -0.612287022302147150, -0.612326553315201250, -0.612366082797439430, -0.612405610748762100, -0.612445137169070560, --0.612484662058266680, -0.612524185416250750, -0.612563707242924300, -0.612603227538188740, -0.612642746301944930, -0.612682263534094720, -0.612721779234538410, -0.612761293403178090, --0.612800806039914160, -0.612840317144648260, -0.612879826717281470, -0.612919334757715210, -0.612958841265850870, -0.612998346241589110, -0.613037849684831550, -0.613077351595479600, --0.613116851973434020, -0.613156350818596210, -0.613195848130867580, -0.613235343910149330, -0.613274838156343090, -0.613314330869349390, -0.613353822049069960, -0.613393311695406230, --0.613432799808258820, -0.613472286387529490, -0.613511771433119410, -0.613551254944930240, -0.613590736922862590, -0.613630217366818110, -0.613669696276698430, -0.613709173652404180, --0.613748649493837010, -0.613788123800898200, -0.613827596573489060, -0.613867067811511240, -0.613906537514865460, -0.613946005683453370, -0.613985472317176480, -0.614024937415935670, --0.614064400979632550, -0.614103863008168330, -0.614143323501444520, -0.614182782459362750, -0.614222239881823670, -0.614261695768728910, -0.614301150119980320, -0.614340602935478540, --0.614380054215125200, -0.614419503958821830, -0.614458952166469950, -0.614498398837970310, -0.614537843973224750, -0.614577287572134920, -0.614616729634601460, -0.614656170160526210, --0.614695609149810580, -0.614735046602355890, -0.614774482518063990, -0.614813916896835400, -0.614853349738572090, -0.614892781043175800, -0.614932210810547160, -0.614971639040588050, --0.615011065733199750, -0.615050490888283900, -0.615089914505742020, -0.615129336585475080, -0.615168757127385170, -0.615208176131373020, -0.615247593597340490, -0.615287009525188890, --0.615326423914819730, -0.615365836766134990, -0.615405248079035180, -0.615444657853422280, -0.615484066089198150, -0.615523472786263400, -0.615562877944520030, -0.615602281563869540, --0.615641683644213230, -0.615681084185453090, -0.615720483187489950, -0.615759880650225470, -0.615799276573561820, -0.615838670957399530, -0.615878063801640560, -0.615917455106186450, --0.615956844870938940, -0.615996233095799100, -0.616035619780668680, -0.616075004925449530, -0.616114388530042520, -0.616153770594349500, -0.616193151118272110, -0.616232530101711750, --0.616271907544570510, -0.616311283446749130, -0.616350657808149570, -0.616390030628673700, -0.616429401908222370, -0.616468771646697560, -0.616508139844000770, -0.616547506500033650, --0.616586871614698160, -0.616626235187895170, -0.616665597219526520, -0.616704957709494180, -0.616744316657699240, -0.616783674064043440, -0.616823029928428410, -0.616862384250756230, --0.616901737030927650, -0.616941088268844750, -0.616980437964409600, -0.617019786117522840, -0.617059132728086770, -0.617098477796002800, -0.617137821321172560, -0.617177163303498140, --0.617216503742880510, -0.617255842639221620, -0.617295179992423560, -0.617334515802387070, -0.617373850069014350, -0.617413182792206920, -0.617452513971866620, -0.617491843607895330, --0.617531171700194110, -0.617570498248665390, -0.617609823253210010, -0.617649146713730060, -0.617688468630127270, -0.617727789002303300, -0.617767107830160090, -0.617806425113598960, --0.617845740852521640, -0.617885055046830330, -0.617924367696426110, -0.617963678801210840, -0.618002988361086470, -0.618042296375954650, -0.618081602845717340, -0.618120907770275730, --0.618160211149531900, -0.618199512983387820, -0.618238813271744570, -0.618278112014504440, -0.618317409211568860, -0.618356704862840220, -0.618395998968219400, -0.618435291527608680, --0.618474582540910030, -0.618513872008024550, -0.618553159928854400, -0.618592446303301350, -0.618631731131267130, -0.618671014412654040, -0.618710296147362950, -0.618749576335296260, --0.618788854976355830, -0.618828132070443070, -0.618867407617459840, -0.618906681617308110, -0.618945954069889730, -0.618985224975106770, -0.619024494332860440, -0.619063762143052920, --0.619103028405586290, -0.619142293120361730, -0.619181556287281440, -0.619220817906247280, -0.619260077977161430, -0.619299336499924970, -0.619338593474440200, -0.619377848900609320, --0.619417102778333510, -0.619456355107514840, -0.619495605888055300, -0.619534855119856840, -0.619574102802821550, -0.619613348936850610, -0.619652593521846320, -0.619691836557710870, --0.619731078044345570, -0.619770317981652500, -0.619809556369533610, -0.619848793207890880, -0.619888028496626500, -0.619927262235641650, -0.619966494424839090, -0.620005725064119880, --0.620044954153386450, -0.620084181692540540, -0.620123407681484220, -0.620162632120119680, -0.620201855008348240, -0.620241076346072170, -0.620280296133193800, -0.620319514369614300, --0.620358731055235980, -0.620397946189960800, -0.620437159773690850, -0.620476371806328310, -0.620515582287774480, -0.620554791217931780, -0.620593998596702390, -0.620633204423987620, --0.620672408699689870, -0.620711611423711120, -0.620750812595953660, -0.620790012216318800, -0.620829210284708940, -0.620868406801026400, -0.620907601765172570, -0.620946795177049650, --0.620985987036559720, -0.621025177343604850, -0.621064366098087460, -0.621103553299908740, -0.621142738948971100, -0.621181923045176940, -0.621221105588427690, -0.621260286578625640, --0.621299466015672990, -0.621338643899471580, -0.621377820229923940, -0.621416995006931370, -0.621456168230396620, -0.621495339900221210, -0.621534510016307330, -0.621573678578557280, --0.621612845586873020, -0.621652011041156860, -0.621691174941310430, -0.621730337287236150, -0.621769498078836300, -0.621808657316012310, -0.621847814998666700, -0.621886971126701550, --0.621926125700019040, -0.621965278718521470, -0.622004430182110380, -0.622043580090688280, -0.622082728444157460, -0.622121875242419580, -0.622161020485377030, -0.622200164172931780, --0.622239306304986580, -0.622278446881442740, -0.622317585902202760, -0.622356723367169300, -0.622395859276243520, -0.622434993629328190, -0.622474126426325270, -0.622513257667137170, --0.622552387351666180, -0.622591515479813840, -0.622630642051482770, -0.622669767066575510, -0.622708890524993340, -0.622748012426639130, -0.622787132771414730, -0.622826251559222550, --0.622865368789965120, -0.622904484463543850, -0.622943598579861370, -0.622982711138820310, -0.623021822140322090, -0.623060931584269340, -0.623100039470564250, -0.623139145799109340, --0.623178250569806360, -0.623217353782557600, -0.623256455437265930, -0.623295555533832760, -0.623334654072160600, -0.623373751052151870, -0.623412846473708760, -0.623451940336733900, --0.623491032641128820, -0.623530123386796140, -0.623569212573638510, -0.623608300201557550, -0.623647386270455790, -0.623686470780235540, -0.623725553730799190, -0.623764635122049270, --0.623803714953887420, -0.623842793226216610, -0.623881869938938460, -0.623920945091955610, -0.623960018685170480, -0.623999090718485250, -0.624038161191802660, -0.624077230105024360, --0.624116297458052970, -0.624155363250791130, -0.624194427483140580, -0.624233490155003960, -0.624272551266283560, -0.624311610816881800, -0.624350668806701430, -0.624389725235643960, --0.624428780103612250, -0.624467833410508820, -0.624506885156235540, -0.624545935340695020, -0.624584983963789700, -0.624624031025422300, -0.624663076525494350, -0.624702120463908830, --0.624741162840568350, -0.624780203655374570, -0.624819242908230320, -0.624858280599037920, -0.624897316727699770, -0.624936351294118730, -0.624975384298196550, -0.625014415739835740, --0.625053445618939390, -0.625092473935409010, -0.625131500689147470, -0.625170525880057170, -0.625209549508040530, -0.625248571573000400, -0.625287592074838420, -0.625326611013457550, --0.625365628388760530, -0.625404644200649010, -0.625443658449025830, -0.625482671133793630, -0.625521682254855050, -0.625560691812111940, -0.625599699805467040, -0.625638706234823210, --0.625677711100082410, -0.625716714401147180, -0.625755716137920250, -0.625794716310304030, -0.625833714918201390, -0.625872711961514060, -0.625911707440144900, -0.625950701353996890, --0.625989693702971860, -0.626028684486972460, -0.626067673705901440, -0.626106661359661200, -0.626145647448154600, -0.626184631971283600, -0.626223614928951290, -0.626262596321059740, --0.626301576147511590, -0.626340554408209570, -0.626379531103056110, -0.626418506231954160, -0.626457479794805590, -0.626496451791513360, -0.626535422221980330, -0.626574391086108460, --0.626613358383800500, -0.626652324114959190, -0.626691288279487170, -0.626730250877287180, -0.626769211908261180, -0.626808171372312260, -0.626847129269343160, -0.626886085599255960, --0.626925040361953510, -0.626963993557338450, -0.627002945185313740, -0.627041895245781360, -0.627080843738644260, -0.627119790663805300, -0.627158736021166560, -0.627197679810631010, --0.627236622032101290, -0.627275562685480010, -0.627314501770670050, -0.627353439287573590, -0.627392375236093590, -0.627431309616132920, -0.627470242427593640, -0.627509173670378730, --0.627548103344390930, -0.627587031449532870, -0.627625957985707530, -0.627664882952816970, -0.627703806350764170, -0.627742728179452310, -0.627781648438783150, -0.627820567128659970, --0.627859484248985300, -0.627898399799662330, -0.627937313780593030, -0.627976226191680360, -0.628015137032827520, -0.628054046303936460, -0.628092954004910390, -0.628131860135651810, --0.628170764696063590, -0.628209667686048910, -0.628248569105509640, -0.628287468954348950, -0.628326367232469930, -0.628365263939774650, -0.628404159076166200, -0.628443052641547430, --0.628481944635820860, -0.628520835058889890, -0.628559723910656510, -0.628598611191024110, -0.628637496899894900, -0.628676381037171940, -0.628715263602757980, -0.628754144596555880, --0.628793024018468700, -0.628831901868398770, -0.628870778146248920, -0.628909652851922570, -0.628948525985321690, -0.628987397546349580, -0.629026267534908870, -0.629065135950902520, --0.629104002794233730, -0.629142868064804570, -0.629181731762518240, -0.629220593887277910, -0.629259454438985680, -0.629298313417544940, -0.629337170822858340, -0.629376026654829170, --0.629414880913359620, -0.629453733598352770, -0.629492584709712030, -0.629531434247339480, -0.629570282211138310, -0.629609128601011480, -0.629647973416861740, -0.629686816658592500, --0.629725658326105830, -0.629764498419305040, -0.629803336938093320, -0.629842173882372960, -0.629881009252047150, -0.629919843047018760, -0.629958675267190850, -0.629997505912466500, --0.630036334982748140, -0.630075162477938930, -0.630113988397942080, -0.630152812742660000, -0.630191635511995860, -0.630230456705852540, -0.630269276324133540, -0.630308094366740960, --0.630346910833578190, -0.630385725724548430, -0.630424539039553980, -0.630463350778498240, -0.630502160941284200, -0.630540969527814580, -0.630579776537993020, -0.630618581971721600, --0.630657385828903850, -0.630696188109442830, -0.630734988813241080, -0.630773787940201780, -0.630812585490228120, -0.630851381463222950, -0.630890175859089570, -0.630928968677730520, --0.630967759919049410, -0.631006549582948550, -0.631045337669331240, -0.631084124178100670, -0.631122909109159690, -0.631161692462411830, -0.631200474237759380, -0.631239254435105760, --0.631278033054354370, -0.631316810095407630, -0.631355585558168730, -0.631394359442540850, -0.631433131748427190, -0.631471902475731040, -0.631510671624354700, -0.631549439194201700, --0.631588205185175440, -0.631626969597178340, -0.631665732430113810, -0.631704493683885040, -0.631743253358395320, -0.631782011453547070, -0.631820767969243800, -0.631859522905389050, --0.631898276261885110, -0.631937028038635380, -0.631975778235543180, -0.632014526852511470, -0.632053273889443880, -0.632092019346242710, -0.632130763222811480, -0.632169505519053710, --0.632208246234871820, -0.632246985370169320, -0.632285722924849300, -0.632324458898815060, -0.632363193291969990, -0.632401926104216530, -0.632440657335458620, -0.632479386985598800, --0.632518115054540480, -0.632556841542186830, -0.632595566448441170, -0.632634289773206790, -0.632673011516386440, -0.632711731677883530, -0.632750450257601680, -0.632789167255443320, --0.632827882671312070, -0.632866596505111120, -0.632905308756743670, -0.632944019426113340, -0.632982728513122540, -0.633021436017674910, -0.633060141939674080, -0.633098846279022460, --0.633137549035623800, -0.633176250209381290, -0.633214949800198550, -0.633253647807977990, -0.633292344232623260, -0.633331039074038090, -0.633369732332125010, -0.633408424006787540, --0.633447114097929090, -0.633485802605452840, -0.633524489529262320, -0.633563174869260390, -0.633601858625350460, -0.633640540797436150, -0.633679221385420210, -0.633717900389206170, --0.633756577808697430, -0.633795253643797300, -0.633833927894409290, -0.633872600560436150, -0.633911271641781400, -0.633949941138349020, -0.633988609050041290, -0.634027275376762070, --0.634065940118414660, -0.634104603274902810, -0.634143264846129040, -0.634181924831997090, -0.634220583232410710, -0.634259240047272520, -0.634297895276486280, -0.634336548919955280, --0.634375200977582930, -0.634413851449272760, -0.634452500334927840, -0.634491147634451580, -0.634529793347747730, -0.634568437474719140, -0.634607080015269440, -0.634645720969301940, --0.634684360336720270, -0.634722998117427940, -0.634761634311327820, -0.634800268918323970, -0.634838901938319160, -0.634877533371217000, -0.634916163216921010, -0.634954791475334620, --0.634993418146361680, -0.635032043229904810, -0.635070666725867760, -0.635109288634154500, -0.635147908954667550, -0.635186527687310990, -0.635225144831988000, -0.635263760388602110, --0.635302374357057160, -0.635340986737256030, -0.635379597529102450, -0.635418206732500050, -0.635456814347351910, -0.635495420373561770, -0.635534024811033050, -0.635572627659669600, --0.635611228919374160, -0.635649828590050700, -0.635688426671603080, -0.635727023163934040, -0.635765618066947420, -0.635804211380546660, -0.635842803104635480, -0.635881393239117630, --0.635919981783895860, -0.635958568738874240, -0.635997154103956520, -0.636035737879045550, -0.636074320064045300, -0.636112900658859170, -0.636151479663390810, -0.636190057077544060, --0.636228632901221890, -0.636267207134328160, -0.636305779776766720, -0.636344350828440430, -0.636382920289253360, -0.636421488159108930, -0.636460054437911090, -0.636498619125562830, --0.636537182221967980, -0.636575743727030520, -0.636614303640653410, -0.636652861962740510, -0.636691418693195450, -0.636729973831921870, -0.636768527378823720, -0.636807079333803870, --0.636845629696766280, -0.636884178467615030, -0.636922725646252960, -0.636961271232584060, -0.636999815226511950, -0.637038357627940370, -0.637076898436773290, -0.637115437652913450, --0.637153975276265490, -0.637192511306732270, -0.637231045744217740, -0.637269578588625540, -0.637308109839859420, -0.637346639497823330, -0.637385167562420360, -0.637423694033554480, --0.637462218911129750, -0.637500742195049040, -0.637539263885216530, -0.637577783981535860, -0.637616302483910660, -0.637654819392245110, -0.637693334706442180, -0.637731848426405850, --0.637770360552040280, -0.637808871083248460, -0.637847380019934460, -0.637885887362002020, -0.637924393109355230, -0.637962897261897030, -0.638001399819531630, -0.638039900782163110, --0.638078400149694520, -0.638116897922029860, -0.638155394099072960, -0.638193888680727570, -0.638232381666897890, -0.638270873057486750, -0.638309362852398590, -0.638347851051537240, --0.638386337654806010, -0.638424822662108980, -0.638463306073349780, -0.638501787888432370, -0.638540268107260830, -0.638578746729738240, -0.638617223755768790, -0.638655699185256660, --0.638694173018104940, -0.638732645254217800, -0.638771115893499000, -0.638809584935852710, -0.638848052381182250, -0.638886518229391580, -0.638924982480384870, -0.638963445134065560, --0.639001906190337480, -0.639040365649104710, -0.639078823510271010, -0.639117279773740550, -0.639155734439416650, -0.639194187507203360, -0.639232638977004890, -0.639271088848724520, --0.639309537122266460, -0.639347983797534550, -0.639386428874432640, -0.639424872352865050, -0.639463314232734840, -0.639501754513946750, -0.639540193196403980, -0.639578630280010610, --0.639617065764670810, -0.639655499650288230, -0.639693931936767270, -0.639732362624011230, -0.639770791711924190, -0.639809219200410560, -0.639847645089373530, -0.639886069378717390, --0.639924492068346010, -0.639962913158163450, -0.640001332648073910, -0.640039750537980790, -0.640078166827788180, -0.640116581517400580, -0.640154994606721210, -0.640193406095654230, --0.640231815984103840, -0.640270224271974220, -0.640308630959168680, -0.640347036045591620, -0.640385439531147240, -0.640423841415738940, -0.640462241699271130, -0.640500640381647560, --0.640539037462772520, -0.640577432942550100, -0.640615826820883920, -0.640654219097678060, -0.640692609772837040, -0.640730998846264050, -0.640769386317863730, -0.640807772187539810, --0.640846156455196490, -0.640884539120738170, -0.640922920184068160, -0.640961299645090850, -0.640999677503710560, -0.641038053759830810, -0.641076428413355880, -0.641114801464189870, --0.641153172912237170, -0.641191542757401310, -0.641229910999586480, -0.641268277638697310, -0.641306642674637000, -0.641345006107310160, -0.641383367936620870, -0.641421728162473000, --0.641460086784771290, -0.641498443803418920, -0.641536799218320520, -0.641575153029380400, -0.641613505236502070, -0.641651855839590060, -0.641690204838548330, -0.641728552233281070, --0.641766898023692800, -0.641805242209686930, -0.641843584791168320, -0.641881925768040370, -0.641920265140207720, -0.641958602907574340, -0.641996939070044400, -0.642035273627522440, --0.642073606579912080, -0.642111937927117630, -0.642150267669043600, -0.642188595805593730, -0.642226922336672220, -0.642265247262183480, -0.642303570582031580, -0.642341892296121150, --0.642380212404355610, -0.642418530906639470, -0.642456847802877480, -0.642495163092972940, -0.642533476776830590, -0.642571788854354400, -0.642610099325449210, -0.642648408190018340, --0.642686715447966520, -0.642725021099198160, -0.642763325143617000, -0.642801627581127580, -0.642839928411633950, -0.642878227635040540, -0.642916525251251980, -0.642954821260171670, --0.642993115661704360, -0.643031408455754570, -0.643069699642225930, -0.643107989221023080, -0.643146277192050200, -0.643184563555211700, -0.643222848310411990, -0.643261131457554920, --0.643299412996545360, -0.643337692927286930, -0.643375971249684260, -0.643414247963641660, -0.643452523069063420, -0.643490796565854280, -0.643529068453917770, -0.643567338733158520, --0.643605607403481380, -0.643643874464789880, -0.643682139916988530, -0.643720403759981960, -0.643758665993674370, -0.643796926617970500, -0.643835185632773870, -0.643873443037989320, --0.643911698833521510, -0.643949953019274160, -0.643988205595151910, -0.644026456561059060, -0.644064705916900460, -0.644102953662579750, -0.644141199798001660, -0.644179444323070950, --0.644217687237691240, -0.644255928541767390, -0.644294168235203690, -0.644332406317904450, -0.644370642789774630, -0.644408877650717860, -0.644447110900638890, -0.644485342539442560, --0.644523572567032410, -0.644561800983313390, -0.644600027788189920, -0.644638252981566300, -0.644676476563347370, -0.644714698533436990, -0.644752918891739800, -0.644791137638160650, --0.644829354772603390, -0.644867570294972660, -0.644905784205173080, -0.644943996503109300, -0.644982207188685260, -0.645020416261805620, -0.645058623722375320, -0.645096829570298120, --0.645135033805478870, -0.645173236427821980, -0.645211437437232080, -0.645249636833613920, -0.645287834616871230, -0.645326030786909090, -0.645364225343632140, -0.645402418286944220, --0.645440609616750430, -0.645478799332954930, -0.645516987435462490, -0.645555173924178050, -0.645593358799005150, -0.645631542059849290, -0.645669723706614240, -0.645707903739204840, --0.645746082157525710, -0.645784258961481390, -0.645822434150976730, -0.645860607725915690, -0.645898779686203020, -0.645936950031743900, -0.645975118762441960, -0.646013285878202170, --0.646051451378929280, -0.646089615264527680, -0.646127777534902470, -0.646165938189957380, -0.646204097229597600, -0.646242254653727750, -0.646280410462252040, -0.646318564655075200, --0.646356717232101970, -0.646394868193237330, -0.646433017538385220, -0.646471165267450520, -0.646509311380338180, -0.646547455876952280, -0.646585598757197790, -0.646623740020979220, --0.646661879668201320, -0.646700017698769170, -0.646738154112586510, -0.646776288909558520, -0.646814422089590060, -0.646852553652585320, -0.646890683598449150, -0.646928811927086290, --0.646966938638401380, -0.647005063732299380, -0.647043187208684480, -0.647081309067461640, -0.647119429308535830, -0.647157547931811130, -0.647195664937192490, -0.647233780324584670, --0.647271894093892850, -0.647310006245020890, -0.647348116777873960, -0.647386225692357040, -0.647424332988374210, -0.647462438665830530, -0.647500542724630870, -0.647538645164679740, --0.647576745985882330, -0.647614845188142720, -0.647652942771366090, -0.647691038735457410, -0.647729133080320760, -0.647767225805861320, -0.647805316911983730, -0.647843406398592950, --0.647881494265593940, -0.647919580512890780, -0.647957665140389110, -0.647995748147992880, -0.648033829535607400, -0.648071909303137180, -0.648109987450487310, -0.648148063977562750, --0.648186138884267680, -0.648224212170507300, -0.648262283836186780, -0.648300353881210100, -0.648338422305482550, -0.648376489108908990, -0.648414554291394270, -0.648452617852843470, --0.648490679793160660, -0.648528740112251260, -0.648566798810020330, -0.648604855886372070, -0.648642911341211660, -0.648680965174443960, -0.648719017385974260, -0.648757067975706650, --0.648795116943546300, -0.648833164289398520, -0.648871210013167500, -0.648909254114758530, -0.648947296594076350, -0.648985337451025930, -0.649023376685512470, -0.649061414297440350, --0.649099450286714560, -0.649137484653240620, -0.649175517396922470, -0.649213548517665660, -0.649251578015374920, -0.649289605889955210, -0.649327632141311840, -0.649365656769349100, --0.649403679773972180, -0.649441701155086480, -0.649479720912596090, -0.649517739046406420, -0.649555755556422420, -0.649593770442549290, -0.649631783704691550, -0.649669795342754150, --0.649707805356642740, -0.649745813746261500, -0.649783820511515620, -0.649821825652310280, -0.649859829168550340, -0.649897831060141210, -0.649935831326987070, -0.649973829968993440, --0.650011826986065520, -0.650049822378107710, -0.650087816145025420, -0.650125808286723510, -0.650163798803107040, -0.650201787694081430, -0.650239774959551100, -0.650277760599421660, --0.650315744613597420, -0.650353727001983790, -0.650391707764485850, -0.650429686901008770, -0.650467664411457650, -0.650505640295737100, -0.650543614553752430, -0.650581587185409150, --0.650619558190611460, -0.650657527569264870, -0.650695495321274580, -0.650733461446545420, -0.650771425944983050, -0.650809388816491640, -0.650847350060976940, -0.650885309678344020, --0.650923267668497620, -0.650961224031343040, -0.650999178766785370, -0.651037131874730110, -0.651075083355081570, -0.651113033207745500, -0.651150981432627060, -0.651188928029630910, --0.651226872998662330, -0.651264816339626630, -0.651302758052428880, -0.651340698136974590, -0.651378636593168300, -0.651416573420915300, -0.651454508620121220, -0.651492442190690580, --0.651530374132528790, -0.651568304445541040, -0.651606233129632620, -0.651644160184708940, -0.651682085610674420, -0.651720009407434800, -0.651757931574895370, -0.651795852112960870, --0.651833771021536720, -0.651871688300528220, -0.651909603949840650, -0.651947517969378890, -0.651985430359048320, -0.652023341118754480, -0.652061250248402000, -0.652099157747896290, --0.652137063617142740, -0.652174967856046560, -0.652212870464513260, -0.652250771442447470, -0.652288670789754720, -0.652326568506340630, -0.652364464592109840, -0.652402359046967860, --0.652440251870819890, -0.652478143063571440, -0.652516032625127920, -0.652553920555393960, -0.652591806854275540, -0.652629691521677270, -0.652667574557504790, -0.652705455961663290, --0.652743335734058180, -0.652781213874595200, -0.652819090383178760, -0.652856965259714480, -0.652894838504108230, -0.652932710116264640, -0.652970580096089100, -0.653008448443487270, --0.653046315158364200, -0.653084180240625760, -0.653122043690176460, -0.653159905506922040, -0.653197765690768260, -0.653235624241619740, -0.653273481159382110, -0.653311336443960780, --0.653349190095261490, -0.653387042113188880, -0.653424892497648570, -0.653462741248546530, -0.653500588365787170, -0.653538433849276350, -0.653576277698919460, -0.653614119914621930, --0.653651960496289370, -0.653689799443826660, -0.653727636757139410, -0.653765472436133370, -0.653803306480713280, -0.653841138890784990, -0.653878969666253810, -0.653916798807025250, --0.653954626313005050, -0.653992452184097850, -0.654030276420209940, -0.654068099021245960, -0.654105919987111760, -0.654143739317712750, -0.654181557012954440, -0.654219373072742580, --0.654257187496981810, -0.654295000285578190, -0.654332811438437360, -0.654370620955464170, -0.654408428836564470, -0.654446235081643680, -0.654484039690607310, -0.654521842663361110, --0.654559643999810040, -0.654597443699859840, -0.654635241763416360, -0.654673038190384470, -0.654710832980670010, -0.654748626134178390, -0.654786417650815240, -0.654824207530486310, --0.654861995773096670, -0.654899782378552290, -0.654937567346758120, -0.654975350677620030, -0.655013132371043530, -0.655050912426934250, -0.655088690845198050, -0.655126467625739780, --0.655164242768465300, -0.655202016273280560, -0.655239788140090430, -0.655277558368800860, -0.655315326959317380, -0.655353093911545610, -0.655390859225391420, -0.655428622900759650, --0.655466384937556490, -0.655504145335687570, -0.655541904095058080, -0.655579661215573760, -0.655617416697140240, -0.655655170539663600, -0.655692922743048690, -0.655730673307201360, --0.655768422232027800, -0.655806169517432870, -0.655843915163322410, -0.655881659169602170, -0.655919401536177890, -0.655957142262955430, -0.655994881349839630, -0.656032618796736800, --0.656070354603552670, -0.656108088770192330, -0.656145821296561740, -0.656183552182566630, -0.656221281428112650, -0.656259009033105740, -0.656296734997451110, -0.656334459321054830, --0.656372182003822190, -0.656409903045659050, -0.656447622446471150, -0.656485340206164110, -0.656523056324644140, -0.656560770801816180, -0.656598483637586330, -0.656636194831860530, --0.656673904384543980, -0.656711612295542650, -0.656749318564762260, -0.656787023192108580, -0.656824726177487660, -0.656862427520804590, -0.656900127221965560, -0.656937825280876410, --0.656975521697442440, -0.657013216471569630, -0.657050909603163810, -0.657088601092131070, -0.657126290938376490, -0.657163979141806130, -0.657201665702326190, -0.657239350619841730, --0.657277033894258840, -0.657314715525483480, -0.657352395513421280, -0.657390073857978430, -0.657427750559060000, -0.657465425616572290, -0.657503099030421370, -0.657540770800512210, --0.657578440926751330, -0.657616109409044140, -0.657653776247296820, -0.657691441441415340, -0.657729104991304990, -0.657766766896871750, -0.657804427158022010, -0.657842085774660860, --0.657879742746694470, -0.657917398074028830, -0.657955051756569990, -0.657992703794223030, -0.658030354186894480, -0.658068002934490300, -0.658105650036915790, -0.658143295494077240, --0.658180939305880290, -0.658218581472231110, -0.658256221993035790, -0.658293860868199630, -0.658331498097628700, -0.658369133681229400, -0.658406767618907040, -0.658444399910567690, --0.658482030556117310, -0.658519659555461880, -0.658557286908507570, -0.658594912615159790, -0.658632536675325060, -0.658670159088908580, -0.658707779855816740, -0.658745398975955520, --0.658783016449230760, -0.658820632275548770, -0.658858246454814830, -0.658895858986935370, -0.658933469871816560, -0.658971079109363700, -0.659008686699483200, -0.659046292642080920, --0.659083896937062930, -0.659121499584335520, -0.659159100583804110, -0.659196699935374890, -0.659234297638954250, -0.659271893694447500, -0.659309488101761040, -0.659347080860800960, --0.659384671971473440, -0.659422261433683880, -0.659459849247338690, -0.659497435412344180, -0.659535019928605750, -0.659572602796029810, -0.659610184014522320, -0.659647763583989350, --0.659685341504337440, -0.659722917775471760, -0.659760492397298730, -0.659798065369724850, -0.659835636692655440, -0.659873206365997000, -0.659910774389655510, -0.659948340763537140, --0.659985905487548210, -0.660023468561594110, -0.660061029985581470, -0.660098589759416490, -0.660136147883004790, -0.660173704356252670, -0.660211259179066200, -0.660248812351352020, --0.660286363873015420, -0.660323913743963040, -0.660361461964101060, -0.660399008533335220, -0.660436553451571710, -0.660474096718716930, -0.660511638334676850, -0.660549178299358110, --0.660586716612665990, -0.660624253274507130, -0.660661788284787940, -0.660699321643413940, -0.660736853350291640, -0.660774383405327240, -0.660811911808426800, -0.660849438559496960, --0.660886963658443240, -0.660924487105172380, -0.660962008899590000, -0.660999529041602640, -0.661037047531116360, -0.661074564368037580, -0.661112079552272580, -0.661149593083727120, --0.661187104962307700, -0.661224615187920860, -0.661262123760472110, -0.661299630679868080, -0.661337135946014950, -0.661374639558818920, -0.661412141518186720, -0.661449641824023770, --0.661487140476236800, -0.661524637474732220, -0.661562132819415780, -0.661599626510193990, -0.661637118546973160, -0.661674608929659790, -0.661712097658159640, -0.661749584732379210, --0.661787070152225150, -0.661824553917603090, -0.661862036028419640, -0.661899516484581120, -0.661936995285993810, -0.661974472432564240, -0.662011947924198260, -0.662049421760802390, --0.662086893942283370, -0.662124364468546720, -0.662161833339499180, -0.662199300555046940, -0.662236766115096630, -0.662274230019554650, -0.662311692268326760, -0.662349152861319570, --0.662386611798439940, -0.662424069079593390, -0.662461524704686670, -0.662498978673626170, -0.662536430986318540, -0.662573881642669500, -0.662611330642585820, -0.662648777985974100, --0.662686223672740100, -0.662723667702790450, -0.662761110076031780, -0.662798550792370270, -0.662835989851712660, -0.662873427253964810, -0.662910862999033350, -0.662948297086825120, --0.662985729517245770, -0.663023160290202140, -0.663060589405600530, -0.663098016863347570, -0.663135442663349780, -0.663172866805513130, -0.663210289289744680, -0.663247710115950070, --0.663285129284036270, -0.663322546793909560, -0.663359962645476590, -0.663397376838643970, -0.663434789373317570, -0.663472200249404230, -0.663509609466810700, -0.663547017025442830, --0.663584422925207360, -0.663621827166010920, -0.663659229747759930, -0.663696630670361110, -0.663734029933720440, -0.663771427537744650, -0.663808823482340600, -0.663846217767414260, --0.663883610392872360, -0.663921001358621310, -0.663958390664568190, -0.663995778310618730, -0.664033164296679910, -0.664070548622658350, -0.664107931288460240, -0.664145312293992210, --0.664182691639160990, -0.664220069323873010, -0.664257445348035100, -0.664294819711553350, -0.664332192414334500, -0.664369563456285510, -0.664406932837312230, -0.664444300557321730, --0.664481666616220430, -0.664519031013914960, -0.664556393750312170, -0.664593754825318130, -0.664631114238839690, -0.664668471990783830, -0.664705828081056490, -0.664743182509564430, --0.664780535276214610, -0.664817886380913660, -0.664855235823567650, -0.664892583604083650, -0.664929929722368420, -0.664967274178328130, -0.665004616971869520, -0.665041958102899460, --0.665079297571324560, -0.665116635377051680, -0.665153971519986900, -0.665191306000037170, -0.665228638817109470, -0.665265969971109870, -0.665303299461945330, -0.665340627289522590, --0.665377953453748280, -0.665415277954529370, -0.665452600791772040, -0.665489921965383480, -0.665527241475269760, -0.665564559321337960, -0.665601875503494700, -0.665639190021646730, --0.665676502875701240, -0.665713814065564070, -0.665751123591142410, -0.665788431452343340, -0.665825737649072710, -0.665863042181237820, -0.665900345048745400, -0.665937646251501980, --0.665974945789414850, -0.666012243662389980, -0.666049539870334550, -0.666086834413155530, -0.666124127290759200, -0.666161418503052440, -0.666198708049942190, -0.666235995931335530, --0.666273282147138550, -0.666310566697258300, -0.666347849581601980, -0.666385130800075780, -0.666422410352586650, -0.666459688239041560, -0.666496964459347250, -0.666534239013410800, --0.666571511901138500, -0.666608783122437320, -0.666646052677214660, -0.666683320565376380, -0.666720586786829880, -0.666757851341481910, -0.666795114229239320, -0.666832375450009280, --0.666869635003698000, -0.666906892890212880, -0.666944149109460200, -0.666981403661347170, -0.667018656545780740, -0.667055907762667540, -0.667093157311914870, -0.667130405193429140, --0.667167651407117200, -0.667204895952886570, -0.667242138830643430, -0.667279380040294860, -0.667316619581747820, -0.667353857454909270, -0.667391093659686410, -0.667428328195985520, --0.667465561063713800, -0.667502792262778420, -0.667540021793085800, -0.667577249654543130, -0.667614475847057240, -0.667651700370535670, -0.667688923224884380, -0.667726144410010770, --0.667763363925822250, -0.667800581772224900, -0.667837797949126120, -0.667875012456432880, -0.667912225294052030, -0.667949436461890980, -0.667986645959856020, -0.668023853787854450, --0.668061059945793570, -0.668098264433579780, -0.668135467251120160, -0.668172668398322010, -0.668209867875092180, -0.668247065681337960, -0.668284261816965760, -0.668321456281882890, --0.668358649075996740, -0.668395840199213610, -0.668433029651440910, -0.668470217432585610, -0.668507403542555110, -0.668544587981255820, -0.668581770748595040, -0.668618951844480170, --0.668656131268817510, -0.668693309021514580, -0.668730485102478340, -0.668767659511615990, -0.668804832248834690, -0.668842003314041090, -0.668879172707142370, -0.668916340428046150, --0.668953506476658740, -0.668990670852887440, -0.669027833556639640, -0.669064994587822090, -0.669102153946342540, -0.669139311632107160, -0.669176467645023920, -0.669213621984999120, --0.669250774651940270, -0.669287925645754460, -0.669325074966348850, -0.669362222613630990, -0.669399368587507150, -0.669436512887884860, -0.669473655514671640, -0.669510796467774010, --0.669547935747099250, -0.669585073352554790, -0.669622209284047590, -0.669659343541485260, -0.669696476124774120, -0.669733607033821900, -0.669770736268536000, -0.669807863828822850, --0.669844989714590060, -0.669882113925744820, -0.669919236462194640, -0.669956357323845950, -0.669993476510606480, -0.670030594022383630, -0.670067709859083930, -0.670104824020614890, --0.670141936506883920, -0.670179047317798090, -0.670216156453264930, -0.670253263913191070, -0.670290369697484010, -0.670327473806051290, -0.670364576238799750, -0.670401676995636690, --0.670438776076469290, -0.670475873481205080, -0.670512969209751560, -0.670550063262015270, -0.670587155637903720, -0.670624246337324650, -0.670661335360184680, -0.670698422706391460, --0.670735508375852050, -0.670772592368474200, -0.670809674684164530, -0.670846755322830780, -0.670883834284380360, -0.670920911568720140, -0.670957987175757500, -0.670995061105399970, --0.671032133357554850, -0.671069203932129540, -0.671106272829031130, -0.671143340048166890, -0.671180405589444580, -0.671217469452771050, -0.671254531638053820, -0.671291592145200180, --0.671328650974117650, -0.671365708124713860, -0.671402763596895320, -0.671439817390570350, -0.671476869505645450, -0.671513919942028360, -0.671550968699626490, -0.671588015778347150, --0.671625061178098170, -0.671662104898786190, -0.671699146940318850, -0.671736187302604090, -0.671773225985548450, -0.671810262989059880, -0.671847298313045570, -0.671884331957413040, --0.671921363922069910, -0.671958394206923160, -0.671995422811880290, -0.672032449736849280, -0.672069474981736860, -0.672106498546450770, -0.672143520430898310, -0.672180540634987440, --0.672217559158624910, -0.672254576001718450, -0.672291591164175920, -0.672328604645904050, -0.672365616446810700, -0.672402626566803270, -0.672439635005789290, -0.672476641763676500, --0.672513646840371850, -0.672550650235783090, -0.672587651949818070, -0.672624651982383530, -0.672661650333387320, -0.672698647002736960, -0.672735641990340080, -0.672772635296104430, --0.672809626919936840, -0.672846616861745070, -0.672883605121437300, -0.672920591698920050, -0.672957576594101270, -0.672994559806888600, -0.673031541337189900, -0.673068521184912010, --0.673105499349962780, -0.673142475832250180, -0.673179450631681050, -0.673216423748163260, -0.673253395181604430, -0.673290364931912190, -0.673327332998994280, -0.673364299382757660, --0.673401264083110410, -0.673438227099960260, -0.673475188433214190, -0.673512148082780260, -0.673549106048565880, -0.673586062330478690, -0.673623016928426740, -0.673659969842316910, --0.673696921072057480, -0.673733870617555410, -0.673770818478718670, -0.673807764655454890, -0.673844709147671690, -0.673881651955277050, -0.673918593078177920, -0.673955532516282370, --0.673992470269498270, -0.674029406337732670, -0.674066340720893550, -0.674103273418888650, -0.674140204431625480, -0.674177133759012230, -0.674214061400955740, -0.674250987357364110, --0.674287911628145280, -0.674324834213206440, -0.674361755112455440, -0.674398674325800140, -0.674435591853148390, -0.674472507694407360, -0.674509421849485150, -0.674546334318289590, --0.674583245100727870, -0.674620154196708070, -0.674657061606137920, -0.674693967328925170, -0.674730871364977670, -0.674767773714202820, -0.674804674376508370, -0.674841573351802730, --0.674878470639992730, -0.674915366240986580, -0.674952260154692010, -0.674989152381016750, -0.675026042919869010, -0.675062931771155840, -0.675099818934785210, -0.675136704410665530, --0.675173588198703660, -0.675210470298807870, -0.675247350710885820, -0.675284229434845900, -0.675321106470594960, -0.675357981818041190, -0.675394855477092880, -0.675431727447657120, --0.675468597729641960, -0.675505466322955380, -0.675542333227505120, -0.675579198443199360, -0.675616061969945170, -0.675652923807650960, -0.675689783956224700, -0.675726642415573680, --0.675763499185606080, -0.675800354266229640, -0.675837207657352450, -0.675874059358882450, -0.675910909370727060, -0.675947757692794690, -0.675984604324992520, -0.676021449267228960, --0.676058292519411740, -0.676095134081448720, -0.676131973953248310, -0.676168812134717580, -0.676205648625764820, -0.676242483426298220, -0.676279316536225080, -0.676316147955453810, --0.676352977683892020, -0.676389805721447800, -0.676426632068029440, -0.676463456723544130, -0.676500279687900160, -0.676537100961005940, -0.676573920542768550, -0.676610738433096380, --0.676647554631897300, -0.676684369139079700, -0.676721181954550890, -0.676757993078219040, -0.676794802509992690, -0.676831610249778890, -0.676868416297486060, -0.676905220653022170, --0.676942023316295270, -0.676978824287213680, -0.677015623565684680, -0.677052421151616570, -0.677089217044917870, -0.677126011245495650, -0.677162803753258440, -0.677199594568114290, --0.677236383689971080, -0.677273171118737190, -0.677309956854320160, -0.677346740896628500, -0.677383523245569720, -0.677420303901052120, -0.677457082862983670, -0.677493860131272550, --0.677530635705827170, -0.677567409586554810, -0.677604181773364010, -0.677640952266163050, -0.677677721064859240, -0.677714488169361310, -0.677751253579577110, -0.677788017295414710, --0.677824779316782640, -0.677861539643588310, -0.677898298275740220, -0.677935055213146560, -0.677971810455714970, -0.678008564003353850, -0.678045315855971390, -0.678082066013475870, --0.678118814475774930, -0.678155561242776980, -0.678192306314390430, -0.678229049690522780, -0.678265791371082450, -0.678302531355977620, -0.678339269645116590, -0.678376006238407660, --0.678412741135758330, -0.678449474337077250, -0.678486205842272700, -0.678522935651252430, -0.678559663763924740, -0.678596390180197910, -0.678633114899980020, -0.678669837923179810, --0.678706559249704580, -0.678743278879463060, -0.678779996812363560, -0.678816713048313810, -0.678853427587222220, -0.678890140428997090, -0.678926851573546930, -0.678963561020779370, --0.679000268770602820, -0.679036974822926020, -0.679073679177656380, -0.679110381834702630, -0.679147082793972840, -0.679183782055375330, -0.679220479618818710, -0.679257175484210610, --0.679293869651459550, -0.679330562120474160, -0.679367252891161950, -0.679403941963431680, -0.679440629337191520, -0.679477315012349870, -0.679513998988815150, -0.679550681266495200, --0.679587361845298890, -0.679624040725133720, -0.679660717905908540, -0.679697393387531550, -0.679734067169911030, -0.679770739252955720, -0.679807409636573270, -0.679844078320672280, --0.679880745305161400, -0.679917410589948370, -0.679954074174941690, -0.679990736060049890, -0.680027396245181270, -0.680064054730244560, -0.680100711515147280, -0.680137366599798290, --0.680174019984106090, -0.680210671667978660, -0.680247321651324510, -0.680283969934051940, -0.680320616516069900, -0.680357261397285920, -0.680393904577608840, -0.680430546056947310, --0.680467185835209150, -0.680503823912302910, -0.680540460288137190, -0.680577094962620310, -0.680613727935660990, -0.680650359207166990, -0.680686988777047140, -0.680723616645210190, --0.680760242811563780, -0.680796867276016850, -0.680833490038477710, -0.680870111098854870, -0.680906730457057070, -0.680943348112992060, -0.680979964066568800, -0.681016578317695800, --0.681053190866281130, -0.681089801712233430, -0.681126410855461330, -0.681163018295873450, -0.681199624033377750, -0.681236228067882870, -0.681272830399297870, -0.681309431027530390, --0.681346029952489380, -0.681382627174083270, -0.681419222692220660, -0.681455816506810200, -0.681492408617759950, -0.681528999024978650, -0.681565587728375170, -0.681602174727857450, --0.681638760023334230, -0.681675343614714160, -0.681711925501905740, -0.681748505684817820, -0.681785084163358260, -0.681821660937436350, -0.681858236006959940, -0.681894809371838000, --0.681931381031979030, -0.681967950987291570, -0.682004519237684570, -0.682041085783065880, -0.682077650623344580, -0.682114213758429400, -0.682150775188228420, -0.682187334912650490, --0.682223892931604240, -0.682260449244998180, -0.682297003852741390, -0.682333556754741720, -0.682370107950908240, -0.682406657441149810, -0.682443205225374380, -0.682479751303490810, --0.682516295675408060, -0.682552838341034750, -0.682589379300279080, -0.682625918553049990, -0.682662456099256460, -0.682698991938806340, -0.682735526071608810, -0.682772058497572500, --0.682808589216606030, -0.682845118228618380, -0.682881645533517600, -0.682918171131212780, -0.682954695021612770, -0.682991217204625740, -0.683027737680160670, -0.683064256448126180, --0.683100773508431120, -0.683137288860984460, -0.683173802505694260, -0.683210314442469490, -0.683246824671219330, -0.683283333191851750, -0.683319840004275920, -0.683356345108400380, --0.683392848504134290, -0.683429350191385840, -0.683465850170064000, -0.683502348440077840, -0.683538845001335440, -0.683575339853745970, -0.683611832997218170, -0.683648324431660790, --0.683684814156982900, -0.683721302173092570, -0.683757788479899100, -0.683794273077311440, -0.683830755965237790, -0.683867237143587210, -0.683903716612268560, -0.683940194371190690, --0.683976670420262560, -0.684013144759392460, -0.684049617388489910, -0.684086088307462870, -0.684122557516220640, -0.684159025014672070, -0.684195490802725900, -0.684231954880291320, --0.684268417247276490, -0.684304877903590740, -0.684341336849143000, -0.684377794083841580, -0.684414249607595780, -0.684450703420314330, -0.684487155521906090, -0.684523605912280230, --0.684560054591345170, -0.684596501559009860, -0.684632946815183720, -0.684669390359774810, -0.684705832192692430, -0.684742272313845430, -0.684778710723143110, -0.684815147420493760, --0.684851582405806460, -0.684888015678990600, -0.684924447239954270, -0.684960877088606980, -0.684997305224857360, -0.685033731648614590, -0.685070156359787630, -0.685106579358285120, --0.685143000644016120, -0.685179420216889930, -0.685215838076814850, -0.685252254223700170, -0.685288668657454970, -0.685325081377987980, -0.685361492385208600, -0.685397901679025260, --0.685434309259347120, -0.685470715126083490, -0.685507119279142760, -0.685543521718434250, -0.685579922443867010, -0.685616321455350230, -0.685652718752792320, -0.685689114336102580, --0.685725508205190400, -0.685761900359964090, -0.685798290800333050, -0.685834679526206360, -0.685871066537492970, -0.685907451834102180, -0.685943835415942390, -0.685980217282923020, --0.686016597434953470, -0.686052975871942140, -0.686089352593798330, -0.686125727600431110, -0.686162100891749670, -0.686198472467663190, -0.686234842328080300, -0.686271210472910510, --0.686307576902062460, -0.686343941615445540, -0.686380304612968620, -0.686416665894540980, -0.686453025460072030, -0.686489383309470180, -0.686525739442644830, -0.686562093859505510, --0.686598446559960610, -0.686634797543919650, -0.686671146811291600, -0.686707494361985750, -0.686743840195911500, -0.686780184312977270, -0.686816526713092570, -0.686852867396166910, --0.686889206362108820, -0.686925543610827690, -0.686961879142232610, -0.686998212956233200, -0.687034545052737980, -0.687070875431656350, -0.687107204092897830, -0.687143531036371050, --0.687179856261985410, -0.687216179769650100, -0.687252501559274420, -0.687288821630767770, -0.687325139984038770, -0.687361456618996840, -0.687397771535551590, -0.687434084733611670, --0.687470396213086480, -0.687506705973885300, -0.687543014015917440, -0.687579320339092300, -0.687615624943318520, -0.687651927828506040, -0.687688228994563390, -0.687724528441400200, --0.687760826168925640, -0.687797122177049030, -0.687833416465679970, -0.687869709034726990, -0.687905999884099840, -0.687942289013707910, -0.687978576423459940, -0.688014862113265570, --0.688051146083034080, -0.688087428332674670, -0.688123708862097060, -0.688159987671209780, -0.688196264759922570, -0.688232540128145050, -0.688268813775785860, -0.688305085702754620, --0.688341355908960620, -0.688377624394313600, -0.688413891158722090, -0.688450156202096040, -0.688486419524344750, -0.688522681125377180, -0.688558941005102950, -0.688595199163431260, --0.688631455600271610, -0.688667710315533640, -0.688703963309126090, -0.688740214580958690, -0.688776464130941070, -0.688812711958981860, -0.688848958064990910, -0.688885202448877630, --0.688921445110551200, -0.688957686049921580, -0.688993925266897510, -0.689030162761388510, -0.689066398533304430, -0.689102632582554110, -0.689138864909047080, -0.689175095512692960, --0.689211324393401490, -0.689247551551081310, -0.689283776985642250, -0.689320000696994060, -0.689356222685045590, -0.689392442949706590, -0.689428661490886440, -0.689464878308494570, --0.689501093402440920, -0.689537306772634140, -0.689573518418984180, -0.689609728341400660, -0.689645936539792560, -0.689682143014069600, -0.689718347764141320, -0.689754550789917100, --0.689790752091306910, -0.689826951668219390, -0.689863149520564930, -0.689899345648252280, -0.689935540051191180, -0.689971732729291240, -0.690007923682462000, -0.690044112910613290, --0.690080300413653980, -0.690116486191493910, -0.690152670244042920, -0.690188852571209990, -0.690225033172904840, -0.690261212049037120, -0.690297389199516440, -0.690333564624252550, --0.690369738323154510, -0.690405910296132070, -0.690442080543095190, -0.690478249063952720, -0.690514415858614730, -0.690550580926990620, -0.690586744268990360, -0.690622905884523020, --0.690659065773498340, -0.690695223935826390, -0.690731380371415900, -0.690767535080177080, -0.690803688062019420, -0.690839839316852560, -0.690875988844586340, -0.690912136645129960, --0.690948282718393150, -0.690984427064285980, -0.691020569682717410, -0.691056710573597410, -0.691092849736835600, -0.691128987172341720, -0.691165122880025630, -0.691201256859796500, --0.691237389111564180, -0.691273519635238640, -0.691309648430729060, -0.691345775497945400, -0.691381900836797290, -0.691418024447194690, -0.691454146329046780, -0.691490266482263420, --0.691526384906754780, -0.691562501602429820, -0.691598616569198630, -0.691634729806970830, -0.691670841315656260, -0.691706951095164890, -0.691743059145405900, -0.691779165466289150, --0.691815270057724920, -0.691851372919622070, -0.691887474051890880, -0.691923573454441000, -0.691959671127182150, -0.691995767070024530, -0.692031861282877080, -0.692067953765650220, --0.692104044518253360, -0.692140133540596230, -0.692176220832588780, -0.692212306394140890, -0.692248390225162490, -0.692284472325562780, -0.692320552695251830, -0.692356631334139940, --0.692392708242136060, -0.692428783419150480, -0.692464856865092850, -0.692500928579873110, -0.692536998563401450, -0.692573066815586950, -0.692609133336339780, -0.692645198125570020, --0.692681261183186960, -0.692717322509100790, -0.692753382103221350, -0.692789439965458720, -0.692825496095722190, -0.692861550493921950, -0.692897603159968070, -0.692933654093769950, --0.692969703295237550, -0.693005750764281060, -0.693041796500810100, -0.693077840504734980, -0.693113882775964970, -0.693149923314410280, -0.693185962119981070, -0.693221999192586650, --0.693258034532137190, -0.693294068138542660, -0.693330100011712910, -0.693366130151558350, -0.693402158557988040, -0.693438185230912390, -0.693474210170241580, -0.693510233375884910, --0.693546254847752670, -0.693582274585754830, -0.693618292589801570, -0.693654308859802280, -0.693690323395667270, -0.693726336197306730, -0.693762347264629930, -0.693798356597547410, --0.693834364195968890, -0.693870370059804560, -0.693906374188964500, -0.693942376583358330, -0.693978377242896130, -0.694014376167488290, -0.694050373357044230, -0.694086368811474230, --0.694122362530688370, -0.694158354514596510, -0.694194344763109150, -0.694230333276135590, -0.694266320053586460, -0.694302305095371270, -0.694338288401400330, -0.694374269971583580, --0.694410249805831210, -0.694446227904053530, -0.694482204266160030, -0.694518178892060910, -0.694554151781666800, -0.694590122934886870, -0.694626092351631640, -0.694662060031811300, --0.694698025975335700, -0.694733990182115350, -0.694769952652059760, -0.694805913385079240, -0.694841872381084300, -0.694877829639984230, -0.694913785161689780, -0.694949738946110780, --0.694985690993157770, -0.695021641302740130, -0.695057589874768510, -0.695093536709153190, -0.695129481805803700, -0.695165425164630420, -0.695201366785543670, -0.695237306668453510, --0.695273244813270350, -0.695309181219903820, -0.695345115888264310, -0.695381048818262350, -0.695416980009807450, -0.695452909462810130, -0.695488837177180460, -0.695524763152828740, --0.695560687389665370, -0.695596609887600080, -0.695632530646543180, -0.695668449666405290, -0.695704366947095920, -0.695740282488525710, -0.695776196290604720, -0.695812108353243590, --0.695848018676351820, -0.695883927259840050, -0.695919834103618800, -0.695955739207597680, -0.695991642571687220, -0.696027544195797490, -0.696063444079839110, -0.696099342223722270, --0.696135238627356820, -0.696171133290653280, -0.696207026213522260, -0.696242917395873300, -0.696278806837617110, -0.696314694538663790, -0.696350580498923840, -0.696386464718307780, --0.696422347196725130, -0.696458227934086960, -0.696494106930302890, -0.696529984185283670, -0.696565859698939360, -0.696601733471180480, -0.696637605501917560, -0.696673475791060310, --0.696709344338519390, -0.696745211144205400, -0.696781076208027980, -0.696816939529897980, -0.696852801109725580, -0.696888660947421300, -0.696924519042895540, -0.696960375396058260, --0.696996230006819980, -0.697032082875091440, -0.697067934000782370, -0.697103783383803520, -0.697139631024065180, -0.697175476921478080, -0.697211321075951960, -0.697247163487397570, --0.697283004155725530, -0.697318843080845690, -0.697354680262668780, -0.697390515701105220, -0.697426349396065290, -0.697462181347459740, -0.697498011555198530, -0.697533840019192270, --0.697569666739351720, -0.697605491715586610, -0.697641314947807900, -0.697677136435925770, -0.697712956179850960, -0.697748774179493990, -0.697784590434764710, -0.697820404945574290, --0.697856217711832590, -0.697892028733450350, -0.697927838010338090, -0.697963645542406090, -0.697999451329565420, -0.698035255371725730, -0.698071057668797960, -0.698106858220692850, --0.698142657027320150, -0.698178454088590920, -0.698214249404415570, -0.698250042974704610, -0.698285834799368790, -0.698321624878318170, -0.698357413211463380, -0.698393199798715390, --0.698428984639984150, -0.698464767735180400, -0.698500549084214770, -0.698536328686997780, -0.698572106543440150, -0.698607882653452080, -0.698643657016944530, -0.698679429633827560, --0.698715200504012040, -0.698750969627408570, -0.698786737003927570, -0.698822502633480000, -0.698858266515975930, -0.698894028651326330, -0.698929789039441810, -0.698965547680232560, --0.699001304573609320, -0.699037059719482930, -0.699072813117763920, -0.699108564768363140, -0.699144314671190650, -0.699180062826157300, -0.699215809233174170, -0.699251553892151320, --0.699287296802999390, -0.699323037965629330, -0.699358777379952000, -0.699394515045877350, -0.699430250963316460, -0.699465985132180170, -0.699501717552378670, -0.699537448223822910, --0.699573177146423530, -0.699608904320091150, -0.699644629744736850, -0.699680353420270680, -0.699716075346603520, -0.699751795523646640, -0.699787513951309890, -0.699823230629504360, --0.699858945558140770, -0.699894658737129750, -0.699930370166382380, -0.699966079845808940, -0.700001787775320410, -0.700037493954827280, -0.700073198384240310, -0.700108901063470350, --0.700144601992428120, -0.700180301171024700, -0.700215998599170280, -0.700251694276775800, -0.700287388203752470, -0.700323080380010340, -0.700358770805460500, -0.700394459480013660, --0.700430146403580700, -0.700465831576072780, -0.700501514997399880, -0.700537196667473160, -0.700572876586203820, -0.700608554753502030, -0.700644231169278760, -0.700679905833444970, --0.700715578745911730, -0.700751249906589210, -0.700786919315388610, -0.700822586972220880, -0.700858252876996550, -0.700893917029626450, -0.700929579430021650, -0.700965240078092800, --0.701000898973751290, -0.701036556116907180, -0.701072211507471680, -0.701107865145355950, -0.701143517030470180, -0.701179167162725660, -0.701214815542033240, -0.701250462168303780, --0.701286107041448450, -0.701321750161377650, -0.701357391528002360, -0.701393031141233970, -0.701428669000982660, -0.701464305107159620, -0.701499939459675930, -0.701535572058442640, --0.701571202903370050, -0.701606831994369570, -0.701642459331352280, -0.701678084914228560, -0.701713708742909500, -0.701749330817306280, -0.701784951137329750, -0.701820569702891080, --0.701856186513900690, -0.701891801570269870, -0.701927414871909790, -0.701963026418730980, -0.701998636210644510, -0.702034244247561560, -0.702069850529392860, -0.702105455056049930, --0.702141057827442960, -0.702176658843483790, -0.702212258104082610, -0.702247855609150710, -0.702283451358599260, -0.702319045352339130, -0.702354637590281720, -0.702390228072337420, --0.702425816798417530, -0.702461403768433360, -0.702496988982295510, -0.702532572439915070, -0.702568154141203220, -0.702603734086071020, -0.702639312274429770, -0.702674888706189880, --0.702710463381262860, -0.702746036299559900, -0.702781607460991610, -0.702817176865469300, -0.702852744512904030, -0.702888310403207210, -0.702923874536289350, -0.702959436912061750, --0.702994997530435820, -0.703030556391322170, -0.703066113494632110, -0.703101668840276810, -0.703137222428167230, -0.703172774258215010, -0.703208324330330430, -0.703243872644425120, --0.703279419200410480, -0.703314963998196930, -0.703350507037695970, -0.703386048318818680, -0.703421587841476350, -0.703457125605580380, -0.703492661611041180, -0.703528195857770380, --0.703563728345679480, -0.703599259074678910, -0.703634788044680160, -0.703670315255594430, -0.703705840707333220, -0.703741364399807170, -0.703776886332927560, -0.703812406506606150, --0.703847924920753430, -0.703883441575280930, -0.703918956470099720, -0.703954469605121200, -0.703989980980256780, -0.704025490595417080, -0.704060998450513730, -0.704096504545458140, --0.704132008880160920, -0.704167511454533710, -0.704203012268487800, -0.704238511321934270, -0.704274008614784840, -0.704309504146950040, -0.704344997918341820, -0.704380489928870810, --0.704415980178448530, -0.704451468666986270, -0.704486955394395430, -0.704522440360587420, -0.704557923565473090, -0.704593405008963840, -0.704628884690971510, -0.704664362611406640, --0.704699838770180830, -0.704735313167205390, -0.704770785802391720, -0.704806256675651330, -0.704841725786895080, -0.704877193136034360, -0.704912658722981140, -0.704948122547645940, --0.704983584609940370, -0.705019044909775850, -0.705054503447064000, -0.705089960221715660, -0.705125415233642360, -0.705160868482755830, -0.705196319968966810, -0.705231769692187040, --0.705267217652327800, -0.705302663849300520, -0.705338108283017020, -0.705373550953387830, -0.705408991860324800, -0.705444431003739550, -0.705479868383542930, -0.705515303999646570, --0.705550737851962100, -0.705586169940400690, -0.705621600264874190, -0.705657028825293350, -0.705692455621569900, -0.705727880653615690, -0.705763303921341460, -0.705798725424658930, --0.705834145163479640, -0.705869563137715320, -0.705904979347276810, -0.705940393792075740, -0.705975806472024070, -0.706011217387032540, -0.706046626537013000, -0.706082033921876850, --0.706117439541535610, -0.706152843395901120, -0.706188245484884240, -0.706223645808396690, -0.706259044366350340, -0.706294441158656030, -0.706329836185225710, -0.706365229445970690, --0.706400620940802690, -0.706436010669633460, -0.706471398632373850, -0.706506784828936030, -0.706542169259230970, -0.706577551923170510, -0.706612932820666170, -0.706648311951629470, --0.706683689315972250, -0.706719064913605590, -0.706754438744441220, -0.706789810808391090, -0.706825181105366070, -0.706860549635278220, -0.706895916398038840, -0.706931281393559760, --0.706966644621752740, -0.707002006082528830, -0.707037365775799900, -0.707072723701477890, -0.707108079859473770, -0.707143434249699390, -0.707178786872066480, -0.707214137726486890, --0.707249486812871590, -0.707284834131132630, -0.707320179681181880, -0.707355523462930400, -0.707390865476290150, -0.707426205721172650, -0.707461544197489630, -0.707496880905153170, --0.707532215844074110, -0.707567549014164520, -0.707602880415336370, -0.707638210047500720, -0.707673537910569530, -0.707708864004454540, -0.707744188329067380, -0.707779510884319900, --0.707814831670123490, -0.707850150686390010, -0.707885467933031420, -0.707920783409958900, -0.707956097117084400, -0.707991409054319680, -0.708026719221576670, -0.708062027618766580, --0.708097334245801460, -0.708132639102593280, -0.708167942189053210, -0.708203243505093230, -0.708238543050625170, -0.708273840825560770, -0.708309136829812110, -0.708344431063290260, --0.708379723525907280, -0.708415014217575360, -0.708450303138205670, -0.708485590287710190, -0.708520875666000640, -0.708556159272988980, -0.708591441108587180, -0.708626721172706530, --0.708661999465259320, -0.708697275986156840, -0.708732550735311160, -0.708767823712634140, -0.708803094918037500, -0.708838364351433440, -0.708873632012733120, -0.708908897901848860, --0.708944162018692590, -0.708979424363175630, -0.709014684935210030, -0.709049943734707750, -0.709085200761580660, -0.709120456015740810, -0.709155709497099610, -0.709190961205569010, --0.709226211141061440, -0.709261459303487940, -0.709296705692760820, -0.709331950308791930, -0.709367193151493550, -0.709402434220776760, -0.709437673516553960, -0.709472911038737330, --0.709508146787237950, -0.709543380761968320, -0.709578612962840300, -0.709613843389765630, -0.709649072042656700, -0.709684298921424820, -0.709719524025982150, -0.709754747356240890, --0.709789968912112550, -0.709825188693509300, -0.709860406700343120, -0.709895622932525840, -0.709930837389969870, -0.709966050072586510, -0.710001260980288260, -0.710036470112986540, --0.710071677470593740, -0.710106883053021720, -0.710142086860182430, -0.710177288891988170, -0.710212489148350560, -0.710247687629181670, -0.710282884334393790, -0.710318079263898450, --0.710353272417607930, -0.710388463795434190, -0.710423653397289300, -0.710458841223085560, -0.710494027272734470, -0.710529211546148340, -0.710564394043239340, -0.710599574763919220, --0.710634753708100030, -0.710669930875694080, -0.710705106266613540, -0.710740279880769820, -0.710775451718075550, -0.710810621778442900, -0.710845790061783500, -0.710880956568009540, --0.710916121297033190, -0.710951284248766520, -0.710986445423121950, -0.711021604820010870, -0.711056762439345900, -0.711091918281039350, -0.711127072345002610, -0.711162224631148200, --0.711197375139388300, -0.711232523869634870, -0.711267670821800540, -0.711302815995796700, -0.711337959391535770, -0.711373101008930250, -0.711408240847891780, -0.711443378908332540, --0.711478515190165030, -0.711513649693301440, -0.711548782417653400, -0.711583913363133420, -0.711619042529654020, -0.711654169917126600, -0.711689295525463890, -0.711724419354577750, --0.711759541404380800, -0.711794661674785110, -0.711829780165702530, -0.711864896877045460, -0.711900011808726530, -0.711935124960657250, -0.711970236332750140, -0.712005345924917380, --0.712040453737071370, -0.712075559769124510, -0.712110664020988440, -0.712145766492575990, -0.712180867183798800, -0.712215966094569500, -0.712251063224800250, -0.712286158574403250, --0.712321252143291340, -0.712356343931375810, -0.712391433938569520, -0.712426522164784970, -0.712461608609933790, -0.712496693273928620, -0.712531776156681620, -0.712566857258105200, --0.712601936578111990, -0.712637014116613620, -0.712672089873522710, -0.712707163848751880, -0.712742236042212870, -0.712777306453818320, -0.712812375083480390, -0.712847441931111940, --0.712882506996624480, -0.712917570279930750, -0.712952631780943370, -0.712987691499574190, -0.713022749435735740, -0.713057805589340510, -0.713092859960300700, -0.713127912548529030, --0.713162963353937250, -0.713198012376438100, -0.713233059615944190, -0.713268105072367380, -0.713303148745620290, -0.713338190635615320, -0.713373230742264890, -0.713408269065481710, --0.713443305605177440, -0.713478340361265010, -0.713513373333657050, -0.713548404522265310, -0.713583433927002520, -0.713618461547781190, -0.713653487384513950, -0.713688511437112760, --0.713723533705490350, -0.713758554189559250, -0.713793572889231620, -0.713828589804419880, -0.713863604935036870, -0.713898618280994770, -0.713933629842206320, -0.713968639618583590, --0.714003647610039200, -0.714038653816486120, -0.714073658237835970, -0.714108660874001710, -0.714143661724895850, -0.714178660790430800, -0.714213658070519400, -0.714248653565073610, --0.714283647274006390, -0.714318639197229820, -0.714353629334656630, -0.714388617686199320, -0.714423604251770540, -0.714458589031283120, -0.714493572024648800, -0.714528553231780550, --0.714563532652591200, -0.714598510286992840, -0.714633486134898080, -0.714668460196219660, -0.714703432470870090, -0.714738402958762230, -0.714773371659808030, -0.714808338573920450, --0.714843303701012340, -0.714878267040995660, -0.714913228593783370, -0.714948188359287860, -0.714983146337422330, -0.715018102528098500, -0.715053056931229450, -0.715088009546728130, --0.715122960374506400, -0.715157909414477320, -0.715192856666553520, -0.715227802130647410, -0.715262745806672260, -0.715297687694539830, -0.715332627794163290, -0.715367566105455490, --0.715402502628328390, -0.715437437362695050, -0.715472370308468110, -0.715507301465560190, -0.715542230833884460, -0.715577158413352790, -0.715612084203878230, -0.715647008205373640, --0.715681930417751410, -0.715716850840924290, -0.715751769474805010, -0.715786686319306640, -0.715821601374341250, -0.715856514639821810, -0.715891426115661370, -0.715926335801772120, --0.715961243698067020, -0.715996149804458910, -0.716031054120860320, -0.716065956647184310, -0.716100857383343280, -0.716135756329250080, -0.716170653484817680, -0.716205548849958460, --0.716240442424585290, -0.716275334208611000, -0.716310224201948450, -0.716345112404510600, -0.716379998816209730, -0.716414883436959030, -0.716449766266670900, -0.716484647305258400, --0.716519526552634290, -0.716554404008711290, -0.716589279673402580, -0.716624153546620460, -0.716659025628277880, -0.716693895918288030, -0.716728764416563190, -0.716763631123016330, --0.716798496037560520, -0.716833359160108370, -0.716868220490573190, -0.716903080028867160, -0.716937937774903440, -0.716972793728595130, -0.717007647889854600, -0.717042500258594840, --0.717077350834728900, -0.717112199618169850, -0.717147046608830110, -0.717181891806622620, -0.717216735211460790, -0.717251576823256800, -0.717286416641923830, -0.717321254667374840, --0.717356090899522790, -0.717390925338280640, -0.717425757983561010, -0.717460588835276970, -0.717495417893341700, -0.717530245157667610, -0.717565070628167990, -0.717599894304755680, --0.717634716187343540, -0.717669536275844950, -0.717704354570172230, -0.717739171070238550, -0.717773985775957300, -0.717808798687240790, -0.717843609804002300, -0.717878419126154800, --0.717913226653611570, -0.717948032386284910, -0.717982836324088210, -0.718017638466934670, -0.718052438814736790, -0.718087237367407760, -0.718122034124860640, -0.718156829087008510, --0.718191622253764540, -0.718226413625041250, -0.718261203200751930, -0.718295990980809870, -0.718330776965127480, -0.718365561153618270, -0.718400343546195090, -0.718435124142771110, --0.718469902943259520, -0.718504679947572940, -0.718539455155624900, -0.718574228567328000, -0.718609000182595440, -0.718643770001340500, -0.718678538023476030, -0.718713304248915550, --0.718748068677571570, -0.718782831309357380, -0.718817592144186390, -0.718852351181971110, -0.718887108422624930, -0.718921863866061050, -0.718956617512192420, -0.718991369360932660, --0.719026119412194080, -0.719060867665890280, -0.719095614121934570, -0.719130358780239560, -0.719165101640718560, -0.719199842703284850, -0.719234581967851950, -0.719269319434332250, --0.719304055102639170, -0.719338788972686330, -0.719373521044386120, -0.719408251317652070, -0.719442979792397570, -0.719477706468535480, -0.719512431345979530, -0.719547154424642120, --0.719581875704436880, -0.719616595185277210, -0.719651312867075840, -0.719686028749745970, -0.719720742833201200, -0.719755455117354610, -0.719790165602119610, -0.719824874287408930, --0.719859581173136310, -0.719894286259214480, -0.719928989545556950, -0.719963691032076800, -0.719998390718687540, -0.720033088605302680, -0.720067784691834740, -0.720102478978197350, --0.720137171464304000, -0.720171862150067450, -0.720206551035401210, -0.720241238120218670, -0.720275923404433030, -0.720310606887957890, -0.720345288570705790, -0.720379968452590670, --0.720414646533525830, -0.720449322813424110, -0.720483997292199030, -0.720518669969763880, -0.720553340846032510, -0.720588009920917430, -0.720622677194332370, -0.720657342666190860, --0.720692006336405620, -0.720726668204890510, -0.720761328271558700, -0.720795986536323490, -0.720830642999098710, -0.720865297659797010, -0.720899950518332000, -0.720934601574617420, --0.720969250828566110, -0.721003898280091590, -0.721038543929107380, -0.721073187775526760, -0.721107829819263470, -0.721142470060230470, -0.721177108498341160, -0.721211745133509390, --0.721246379965647890, -0.721281012994670510, -0.721315644220490660, -0.721350273643021960, -0.721384901262177140, -0.721419527077870270, -0.721454151090014760, -0.721488773298523570, --0.721523393703310530, -0.721558012304288840, -0.721592629101372230, -0.721627244094474430, -0.721661857283508180, -0.721696468668387210, -0.721731078249025380, -0.721765686025335640, --0.721800291997231610, -0.721834896164626820, -0.721869498527434870, -0.721904099085569410, -0.721938697838943490, -0.721973294787471080, -0.722007889931065130, -0.722042483269639380, --0.722077074803107570, -0.722111664531382870, -0.722146252454379580, -0.722180838572010100, -0.722215422884188610, -0.722250005390828950, -0.722284586091843980, -0.722319164987147430, --0.722353742076653040, -0.722388317360274200, -0.722422890837924990, -0.722457462509518140, -0.722492032374967730, -0.722526600434187590, -0.722561166687090580, -0.722595731133590550, --0.722630293773601330, -0.722664854607036670, -0.722699413633809410, -0.722733970853833840, -0.722768526267023480, -0.722803079873291620, -0.722837631672551990, -0.722872181664718340, --0.722906729849704170, -0.722941276227423550, -0.722975820797789330, -0.723010363560715570, -0.723044904516116360, -0.723079443663904420, -0.723113981003993930, -0.723148516536298520, --0.723183050260731710, -0.723217582177207770, -0.723252112285639350, -0.723286640585940830, -0.723321167078025960, -0.723355691761807810, -0.723390214637200430, -0.723424735704117580, --0.723459254962473210, -0.723493772412180380, -0.723528288053153060, -0.723562801885305310, -0.723597313908550310, -0.723631824122802030, -0.723666332527974190, -0.723700839123980530, --0.723735343910735020, -0.723769846888150940, -0.723804348056142130, -0.723838847414622900, -0.723873344963506080, -0.723907840702705970, -0.723942334632136310, -0.723976826751710710, --0.724011317061343470, -0.724045805560947550, -0.724080292250437460, -0.724114777129726270, -0.724149260198728160, -0.724183741457356980, -0.724218220905526340, -0.724252698543150550, --0.724287174370142670, -0.724321648386416770, -0.724356120591887140, -0.724390590986466850, -0.724425059570070200, -0.724459526342610790, -0.724493991304002600, -0.724528454454159700, --0.724562915792995480, -0.724597375320423900, -0.724631833036359140, -0.724666288940714500, -0.724700743033404260, -0.724735195314341940, -0.724769645783442160, -0.724804094440617890, --0.724838541285783400, -0.724872986318852770, -0.724907429539739410, -0.724941870948357490, -0.724976310544620860, -0.725010748328443590, -0.725045184299739630, -0.725079618458422390, --0.725114050804406160, -0.725148481337605010, -0.725182910057932450, -0.725217336965302660, -0.725251762059629490, -0.725286185340826780, -0.725320606808809050, -0.725355026463489480, --0.725389444304782360, -0.725423860332601870, -0.725458274546861510, -0.725492686947475370, -0.725527097534357620, -0.725561506307422330, -0.725595913266583010, -0.725630318411753960, --0.725664721742849350, -0.725699123259782590, -0.725733522962468180, -0.725767920850819760, -0.725802316924751610, -0.725836711184178030, -0.725871103629012420, -0.725905494259168950, --0.725939883074562140, -0.725974270075105180, -0.726008655260712680, -0.726043038631298380, -0.726077420186776570, -0.726111799927061650, -0.726146177852066700, -0.726180553961706780, --0.726214928255895060, -0.726249300734546080, -0.726283671397573770, -0.726318040244892440, -0.726352407276416150, -0.726386772492058630, -0.726421135891734180, -0.726455497475357200, --0.726489857242841100, -0.726524215194100380, -0.726558571329049220, -0.726592925647601470, -0.726627278149671870, -0.726661628835173710, -0.726695977704021390, -0.726730324756129530, --0.726764669991411540, -0.726799013409781920, -0.726833355011154650, -0.726867694795444440, -0.726902032762564600, -0.726936368912429630, -0.726970703244954050, -0.727005035760051490, --0.727039366457636340, -0.727073695337622670, -0.727108022399924890, -0.727142347644457290, -0.727176671071133600, -0.727210992679868110, -0.727245312470575440, -0.727279630443169340, --0.727313946597563990, -0.727348260933673880, -0.727382573451413110, -0.727416884150696160, -0.727451193031436680, -0.727485500093549290, -0.727519805336948490, -0.727554108761547800, --0.727588410367261850, -0.727622710154004810, -0.727657008121691320, -0.727691304270235100, -0.727725598599550550, -0.727759891109552300, -0.727794181800154090, -0.727828470671270320, --0.727862757722815500, -0.727897042954703700, -0.727931326366849650, -0.727965607959166870, -0.727999887731570210, -0.728034165683974050, -0.728068441816292160, -0.728102716128439240, --0.728136988620329490, -0.728171259291877200, -0.728205528142997220, -0.728239795173603040, -0.728274060383609640, -0.728308323772930870, -0.728342585341481220, -0.728376845089175000, --0.728411103015926820, -0.728445359121651200, -0.728479613406261880, -0.728513865869673370, -0.728548116511800630, -0.728582365332557380, -0.728616612331858040, -0.728650857509617220, --0.728685100865749340, -0.728719342400168890, -0.728753582112789840, -0.728787820003526820, -0.728822056072294560, -0.728856290319006890, -0.728890522743578460, -0.728924753345923770, --0.728958982125957440, -0.728993209083593330, -0.729027434218746270, -0.729061657531330900, -0.729095879021261160, -0.729130098688451690, -0.729164316532816880, -0.729198532554271360, --0.729232746752729750, -0.729266959128106020, -0.729301169680314890, -0.729335378409271100, -0.729369585314888490, -0.729403790397082140, -0.729437993655766110, -0.729472195090855260, --0.729506394702264080, -0.729540592489906660, -0.729574788453698050, -0.729608982593552220, -0.729643174909383910, -0.729677365401107720, -0.729711554068637970, -0.729745740911889710, --0.729779925930776900, -0.729814109125214160, -0.729848290495116460, -0.729882470040397750, -0.729916647760972870, -0.729950823656756340, -0.729984997727662790, -0.730019169973606940, --0.730053340394502980, -0.730087508990265640, -0.730121675760809890, -0.730155840706049550, -0.730190003825899710, -0.730224165120274770, -0.730258324589089680, -0.730292482232258620, --0.730326638049696330, -0.730360792041317650, -0.730394944207036770, -0.730429094546768410, -0.730463243060427430, -0.730497389747928330, -0.730531534609186070, -0.730565677644114620, --0.730599818852629030, -0.730633958234644170, -0.730668095790074080, -0.730702231518833730, -0.730736365420837860, -0.730770497496001090, -0.730804627744238380, -0.730838756165463790, --0.730872882759592280, -0.730907007526538920, -0.730941130466217670, -0.730975251578543590, -0.731009370863431430, -0.731043488320796130, -0.731077603950551770, -0.731111717752613410, --0.731145829726896120, -0.731179939873313980, -0.731214048191781930, -0.731248154682214710, -0.731282259344527170, -0.731316362178634270, -0.731350463184450180, -0.731384562361889980, --0.731418659710868500, -0.731452755231300270, -0.731486848923100010, -0.731520940786182680, -0.731555030820463030, -0.731589119025855990, -0.731623205402275990, -0.731657289949638190, --0.731691372667856890, -0.731725453556847150, -0.731759532616523820, -0.731793609846801640, -0.731827685247595780, -0.731861758818820320, -0.731895830560390540, -0.731929900472221510, --0.731963968554227300, -0.731998034806323190, -0.732032099228424050, -0.732066161820444710, -0.732100222582300120, -0.732134281513904810, -0.732168338615173720, -0.732202393886022040, --0.732236447326364170, -0.732270498936115180, -0.732304548715189910, -0.732338596663503650, -0.732372642780970470, -0.732406687067505780, -0.732440729523024640, -0.732474770147441330, --0.732508808940671050, -0.732542845902628860, -0.732576881033229600, -0.732610914332388340, -0.732644945800019490, -0.732678975436038330, -0.732713003240359930, -0.732747029212898800, --0.732781053353570130, -0.732815075662288870, -0.732849096138969760, -0.732883114783528300, -0.732917131595878790, -0.732951146575936410, -0.732985159723616440, -0.733019171038833290, --0.733053180521502260, -0.733087188171538170, -0.733121193988856560, -0.733155197973371480, -0.733189200124998550, -0.733223200443652860, -0.733257198929248900, -0.733291195581701970, --0.733325190400927030, -0.733359183386839030, -0.733393174539353490, -0.733427163858384580, -0.733461151343847930, -0.733495136995658600, -0.733529120813731120, -0.733563102797980870, --0.733597082948322820, -0.733631061264672150, -0.733665037746944030, -0.733699012395053090, -0.733732985208914830, -0.733766956188443900, -0.733800925333555560, -0.733834892644164900, --0.733868858120186980, -0.733902821761537210, -0.733936783568130190, -0.733970743539881120, -0.734004701676705510, -0.734038657978517860, -0.734072612445233470, -0.734106565076767640, --0.734140515873035420, -0.734174464833952100, -0.734208411959432430, -0.734242357249391690, -0.734276300703745390, -0.734310242322408050, -0.734344182105295060, -0.734378120052321610, --0.734412056163403100, -0.734445990438454270, -0.734479922877390390, -0.734513853480126990, -0.734547782246578800, -0.734581709176660990, -0.734615634270288980, -0.734649557527377820, --0.734683478947843140, -0.734717398531599450, -0.734751316278562270, -0.734785232188647110, -0.734819146261768590, -0.734853058497842100, -0.734886968896783070, -0.734920877458506540, --0.734954784182928140, -0.734988689069962400, -0.735022592119525030, -0.735056493331531560, -0.735090392705896490, -0.735124290242535450, -0.735158185941363620, -0.735192079802296620, --0.735225971825249180, -0.735259862010136820, -0.735293750356875050, -0.735327636865378610, -0.735361521535563110, -0.735395404367343850, -0.735429285360636010, -0.735463164515355210, --0.735497041831416290, -0.735530917308734770, -0.735564790947226270, -0.735598662746805410, -0.735632532707387930, -0.735666400828889120, -0.735700267111224270, -0.735734131554309110, --0.735767994158058380, -0.735801854922387810, -0.735835713847212360, -0.735869570932447650, -0.735903426178009080, -0.735937279583811830, -0.735971131149771750, -0.736004980875803570, --0.736038828761822810, -0.736072674807745410, -0.736106519013485890, -0.736140361378960220, -0.736174201904083560, -0.736208040588771430, -0.736241877432939450, -0.736275712436502580, --0.736309545599376340, -0.736343376921476560, -0.736377206402717980, -0.736411034043016440, -0.736444859842287360, -0.736478683800446340, -0.736512505917408360, -0.736546326193089130, --0.736580144627404400, -0.736613961220268900, -0.736647775971598580, -0.736681588881308860, -0.736715399949315120, -0.736749209175533220, -0.736783016559877880, -0.736816822102265070, --0.736850625802610510, -0.736884427660829180, -0.736918227676836680, -0.736952025850548530, -0.736985822181880470, -0.737019616670748110, -0.737053409317066420, -0.737087200120751130, --0.737120989081718190, -0.737154776199882460, -0.737188561475159760, -0.737222344907465740, -0.737256126496716120, -0.737289906242825870, -0.737323684145710920, -0.737357460205287030, --0.737391234421469140, -0.737425006794173220, -0.737458777323314770, -0.737492546008809310, -0.737526312850572800, -0.737560077848520290, -0.737593841002567530, -0.737627602312630470, --0.737661361778624180, -0.737695119400464390, -0.737728875178066850, -0.737762629111347050, -0.737796381200221060, -0.737830131444603850, -0.737863879844411490, -0.737897626399559140, --0.737931371109962870, -0.737965113975538100, -0.737998854996200440, -0.738032594171866060, -0.738066331502449820, -0.738100066987867900, -0.738133800628036020, -0.738167532422869250, --0.738201262372283780, -0.738234990476195120, -0.738268716734518990, -0.738302441147171250, -0.738336163714067180, -0.738369884435122750, -0.738403603310253900, -0.738437320339375700, --0.738471035522404230, -0.738504748859255210, -0.738538460349844610, -0.738572169994087480, -0.738605877791900010, -0.738639583743198050, -0.738673287847896880, -0.738706990105912450, --0.738740690517160630, -0.738774389081557010, -0.738808085799017800, -0.738841780669458050, -0.738875473692793830, -0.738909164868941200, -0.738942854197815360, -0.738976541679332470, --0.739010227313408150, -0.739043911099958260, -0.739077593038898860, -0.739111273130145240, -0.739144951373613690, -0.739178627769219500, -0.739212302316878840, -0.739245975016507240, --0.739279645868020860, -0.739313314871335560, -0.739346982026366620, -0.739380647333030330, -0.739414310791242760, -0.739447972400919080, -0.739481632161975380, -0.739515290074327700, --0.739548946137891680, -0.739582600352583720, -0.739616252718318990, -0.739649903235013450, -0.739683551902583610, -0.739717198720944550, -0.739750843690012430, -0.739784486809703210, --0.739818128079932860, -0.739851767500617430, -0.739885405071672330, -0.739919040793013960, -0.739952674664557720, -0.739986306686219790, -0.740019936857916120, -0.740053565179562560, --0.740087191651075390, -0.740120816272369920, -0.740154439043362420, -0.740188059963969190, -0.740221679034105410, -0.740255296253687580, -0.740288911622631330, -0.740322525140852950, --0.740356136808268510, -0.740389746624793400, -0.740423354590343920, -0.740456960704836350, -0.740490564968186100, -0.740524167380309460, -0.740557767941122380, -0.740591366650541150, --0.740624963508481280, -0.740658558514858960, -0.740692151669590570, -0.740725742972591420, -0.740759332423778010, -0.740792920023066180, -0.740826505770372120, -0.740860089665612120, --0.740893671708701460, -0.740927251899556770, -0.740960830238094230, -0.740994406724229230, -0.741027981357878280, -0.741061554138957360, -0.741095125067382510, -0.741128694143070140, --0.741162261365935880, -0.741195826735896120, -0.741229390252866600, -0.741262951916763500, -0.741296511727503100, -0.741330069685001370, -0.741363625789174810, -0.741397180039938820, --0.741430732437210030, -0.741464282980904500, -0.741497831670938080, -0.741531378507227060, -0.741564923489687610, -0.741598466618235810, -0.741632007892788160, -0.741665547313260290, --0.741699084879568480, -0.741732620591629250, -0.741766154449358120, -0.741799686452671690, -0.741833216601486050, -0.741866744895717580, -0.741900271335282020, -0.741933795920095670, --0.741967318650075260, -0.742000839525136180, -0.742034358545195060, -0.742067875710167970, -0.742101391019971300, -0.742134904474521350, -0.742168416073733850, -0.742201925817525420, --0.742235433705812350, -0.742268939738510490, -0.742302443915536130, -0.742335946236805770, -0.742369446702235480, -0.742402945311742000, -0.742436442065240840, -0.742469936962648510, --0.742503430003881640, -0.742536921188855840, -0.742570410517487840, -0.742603897989693730, -0.742637383605390220, -0.742670867364493060, -0.742704349266918530, -0.742737829312583590, --0.742771307501403630, -0.742804783833295510, -0.742838258308175400, -0.742871730925959710, -0.742905201686564930, -0.742938670589906810, -0.742972137635902090, -0.743005602824467260, --0.743039066155518180, -0.743072527628971360, -0.743105987244743300, -0.743139445002750200, -0.743172900902908880, -0.743206354945134870, -0.743239807129345340, -0.743273257455456140, --0.743306705923383550, -0.743340152533044310, -0.743373597284354700, -0.743407040177231470, -0.743440481211590230, -0.743473920387347720, -0.743507357704420890, -0.743540793162725260, --0.743574226762177660, -0.743607658502694500, -0.743641088384192180, -0.743674516406587440, -0.743707942569796220, -0.743741366873734930, -0.743774789318320640, -0.743808209903469190, --0.743841628629097080, -0.743875045495120850, -0.743908460501457420, -0.743941873648022560, -0.743975284934732860, -0.744008694361505410, -0.744042101928255820, -0.744075507634901050, --0.744108911481357490, -0.744142313467541670, -0.744175713593370200, -0.744209111858759380, -0.744242508263625700, -0.744275902807886030, -0.744309295491456300, -0.744342686314253270, --0.744376075276193650, -0.744409462377193740, -0.744442847617170500, -0.744476230996039880, -0.744509612513718720, -0.744542992170123650, -0.744576369965170960, -0.744609745898777260, --0.744643119970859300, -0.744676492181333800, -0.744709862530116730, -0.744743231017125030, -0.744776597642275550, -0.744809962405484250, -0.744843325306668080, -0.744876686345743670, --0.744910045522627410, -0.744943402837236370, -0.744976758289486510, -0.745010111879294780, -0.745043463606578140, -0.745076813471252430, -0.745110161473234720, -0.745143507612441640, --0.745176851888789790, -0.745210194302196150, -0.745243534852576660, -0.745276873539848510, -0.745310210363928080, -0.745343545324732020, -0.745376878422177150, -0.745410209656180100, --0.745443539026657720, -0.745476866533526290, -0.745510192176702670, -0.745543515956103910, -0.745576837871645970, -0.745610157923245920, -0.745643476110820600, -0.745676792434286530, --0.745710106893560760, -0.745743419488559490, -0.745776730219199660, -0.745810039085398220, -0.745843346087071370, -0.745876651224136270, -0.745909954496509540, -0.745943255904108150, --0.745976555446848270, -0.746009853124647070, -0.746043148937421520, -0.746076442885087900, -0.746109734967563050, -0.746143025184763940, -0.746176313536607180, -0.746209600023010070, --0.746242884643888550, -0.746276167399159810, -0.746309448288741020, -0.746342727312548250, -0.746376004470498790, -0.746409279762509150, -0.746442553188496390, -0.746475824748377480, --0.746509094442068810, -0.746542362269487340, -0.746575628230550240, -0.746608892325173910, -0.746642154553275210, -0.746675414914771180, -0.746708673409578920, -0.746741930037614690, --0.746775184798795570, -0.746808437693038840, -0.746841688720260690, -0.746874937880378290, -0.746908185173308590, -0.746941430598968450, -0.746974674157275030, -0.747007915848144630, --0.747041155671494430, -0.747074393627241480, -0.747107629715302420, -0.747140863935594310, -0.747174096288034000, -0.747207326772538430, -0.747240555389024900, -0.747273782137409580, --0.747307007017610100, -0.747340230029542860, -0.747373451173125040, -0.747406670448273690, -0.747439887854905560, -0.747473103392937930, -0.747506317062287430, -0.747539528862871010, --0.747572738794606060, -0.747605946857409000, -0.747639153051197100, -0.747672357375887330, -0.747705559831396640, -0.747738760417642310, -0.747771959134540860, -0.747805155982009360, --0.747838350959965430, -0.747871544068325230, -0.747904735307006190, -0.747937924675925350, -0.747971112175000010, -0.748004297804146570, -0.748037481563282310, -0.748070663452324760, --0.748103843471190190, -0.748137021619796010, -0.748170197898059270, -0.748203372305897170, -0.748236544843226770, -0.748269715509964680, -0.748302884306028430, -0.748336051231335290, --0.748369216285801660, -0.748402379469344960, -0.748435540781882350, -0.748468700223330900, -0.748501857793608010, -0.748535013492630070, -0.748568167320314730, -0.748601319276579140, --0.748634469361340040, -0.748667617574514720, -0.748700763916020470, -0.748733908385774470, -0.748767050983693450, -0.748800191709694810, -0.748833330563695940, -0.748866467545613590, --0.748899602655364930, -0.748932735892867350, -0.748965867258037930, -0.748998996750794070, -0.749032124371052490, -0.749065250118730490, -0.749098373993745680, -0.749131495996014810, --0.749164616125455040, -0.749197734381983780, -0.749230850765518100, -0.749263965275975720, -0.749297077913273050, -0.749330188677328040, -0.749363297568057200, -0.749396404585378150, --0.749429509729208080, -0.749462612999464260, -0.749495714396064220, -0.749528813918924560, -0.749561911567962920, -0.749595007343096700, -0.749628101244242730, -0.749661193271318420, --0.749694283424241270, -0.749727371702928360, -0.749760458107297300, -0.749793542637264720, -0.749826625292748460, -0.749859706073665810, -0.749892784979933610, -0.749925862011469490, --0.749958937168190620, -0.749992010450014850, -0.750025081856858680, -0.750058151388639740, -0.750091219045275760, -0.750124284826683470, -0.750157348732780500, -0.750190410763484140, --0.750223470918711670, -0.750256529198380930, -0.750289585602408550, -0.750322640130712150, -0.750355692783209460, -0.750388743559817220, -0.750421792460453150, -0.750454839485034660, --0.750487884633478930, -0.750520927905703910, -0.750553969301626210, -0.750587008821163910, -0.750620046464233860, -0.750653082230753550, -0.750686116120640730, -0.750719148133812460, --0.750752178270186700, -0.750785206529680060, -0.750818232912210610, -0.750851257417695650, -0.750884280046052450, -0.750917300797198430, -0.750950319671051190, -0.750983336667528150, --0.751016351786547020, -0.751049365028024880, -0.751082376391879250, -0.751115385878027840, -0.751148393486387730, -0.751181399216876770, -0.751214403069412230, -0.751247405043911960, --0.751280405140292820, -0.751313403358472740, -0.751346399698369470, -0.751379394159899850, -0.751412386742981830, -0.751445377447532700, -0.751478366273470310, -0.751511353220712160, --0.751544338289175330, -0.751577321478777760, -0.751610302789437080, -0.751643282221070460, -0.751676259773595530, -0.751709235446930020, -0.751742209240991330, -0.751775181155697410, --0.751808151190965330, -0.751841119346712940, -0.751874085622857850, -0.751907050019317460, -0.751940012536009280, -0.751972973172851170, -0.752005931929760840, -0.752038888806655480, --0.752071843803452820, -0.752104796920070930, -0.752137748156426640, -0.752170697512438040, -0.752203644988022720, -0.752236590583098220, -0.752269534297582590, -0.752302476131392780, --0.752335416084446870, -0.752368354156662590, -0.752401290347957220, -0.752434224658248610, -0.752467157087454490, -0.752500087635492370, -0.752533016302280310, -0.752565943087735610, --0.752598867991776110, -0.752631791014319320, -0.752664712155282970, -0.752697631414584900, -0.752730548792142740, -0.752763464287874440, -0.752796377901697290, -0.752829289633529020, --0.752862199483287920, -0.752895107450891050, -0.752928013536256380, -0.752960917739301740, -0.752993820059944750, -0.753026720498103490, -0.753059619053695120, -0.753092515726637710, --0.753125410516849450, -0.753158303424247280, -0.753191194448749270, -0.753224083590273370, -0.753256970848737440, -0.753289856224058860, -0.753322739716155710, -0.753355621324945930, --0.753388501050346830, -0.753421378892276450, -0.753454254850652650, -0.753487128925393160, -0.753520001116416150, -0.753552871423638910, -0.753585739846979520, -0.753618606386355920, --0.753651471041685620, -0.753684333812886690, -0.753717194699876750, -0.753750053702573970, -0.753782910820896320, -0.753815766054761080, -0.753848619404086540, -0.753881470868790540, --0.753914320448790700, -0.753947168144005090, -0.753980013954351440, -0.754012857879748140, -0.754045699920112390, -0.754078540075362350, -0.754111378345416310, -0.754144214730191440, --0.754177049229606160, -0.754209881843578180, -0.754242712572025460, -0.754275541414866300, -0.754308368372017980, -0.754341193443398780, -0.754374016628926890, -0.754406837928519590, --0.754439657342095280, -0.754472474869571700, -0.754505290510867120, -0.754538104265899510, -0.754570916134586380, -0.754603726116846120, -0.754636534212596350, -0.754669340421755260, --0.754702144744240800, -0.754734947179971030, -0.754767747728864120, -0.754800546390837600, -0.754833343165809630, -0.754866138053698620, -0.754898931054422070, -0.754931722167898060, --0.754964511394044860, -0.754997298732780320, -0.755030084184022840, -0.755062867747689830, -0.755095649423699670, -0.755128429211970760, -0.755161207112420410, -0.755193983124966990, --0.755226757249528700, -0.755259529486023710, -0.755292299834369740, -0.755325068294484980, -0.755357834866287710, -0.755390599549695670, -0.755423362344627150, -0.755456123251000200, --0.755488882268732900, -0.755521639397743750, -0.755554394637950160, -0.755587147989270620, -0.755619899451623560, -0.755652649024926350, -0.755685396709097510, -0.755718142504055330, --0.755750886409717660, -0.755783628426003110, -0.755816368552829190, -0.755849106790114300, -0.755881843137776950, -0.755914577595734770, -0.755947310163906150, -0.755980040842209160, --0.756012769630562410, -0.756045496528883530, -0.756078221537090810, -0.756110944655102870, -0.756143665882837210, -0.756176385220212350, -0.756209102667146690, -0.756241818223558180, --0.756274531889365440, -0.756307243664485980, -0.756339953548838540, -0.756372661542341510, -0.756405367644912510, -0.756438071856470050, -0.756470774176932430, -0.756503474606217810, --0.756536173144244820, -0.756568869790931190, -0.756601564546195650, -0.756634257409955930, -0.756666948382130560, -0.756699637462637800, -0.756732324651395950, -0.756765009948323520, --0.756797693353338240, -0.756830374866358850, -0.756863054487303840, -0.756895732216090740, -0.756928408052638390, -0.756961081996865070, -0.756993754048689070, -0.757026424208028900, --0.757059092474802410, -0.757091758848928100, -0.757124423330324810, -0.757157085918910070, -0.757189746614602700, -0.757222405417320890, -0.757255062326983470, -0.757287717343507970, --0.757320370466813220, -0.757353021696817840, -0.757385671033439680, -0.757418318476597240, -0.757450964026209150, -0.757483607682193470, -0.757516249444469160, -0.757548889312953940, --0.757581527287566450, -0.757614163368225510, -0.757646797554848870, -0.757679429847355150, -0.757712060245662840, -0.757744688749690480, -0.757777315359356660, -0.757809940074579250, --0.757842562895276960, -0.757875183821368650, -0.757907802852771930, -0.757940419989405870, -0.757973035231188640, -0.758005648578039090, -0.758038260029875290, -0.758070869586615740, --0.758103477248179280, -0.758136083014483870, -0.758168686885448250, -0.758201288860990920, -0.758233888941030390, -0.758266487125485390, -0.758299083414273880, -0.758331677807314700, --0.758364270304526580, -0.758396860905827470, -0.758429449611136340, -0.758462036420371470, -0.758494621333451470, -0.758527204350295300, -0.758559785470820810, -0.758592364694947060, --0.758624942022592230, -0.758657517453675050, -0.758690090988114020, -0.758722662625827770, -0.758755232366735140, -0.758787800210754090, -0.758820366157803680, -0.758852930207802530, --0.758885492360668820, -0.758918052616321390, -0.758950610974678750, -0.758983167435659630, -0.759015721999182880, -0.759048274665166560, -0.759080825433529500, -0.759113374304190680, --0.759145921277068150, -0.759178466352080860, -0.759211009529147330, -0.759243550808186620, -0.759276090189116790, -0.759308627671856580, -0.759341163256325280, -0.759373696942440720, --0.759406228730121760, -0.759438758619287450, -0.759471286609856080, -0.759503812701746940, -0.759536336894877760, -0.759568859189167940, -0.759601379584536220, -0.759633898080900650, --0.759666414678180520, -0.759698929376294240, -0.759731442175160530, -0.759763953074698680, -0.759796462074826650, -0.759828969175463610, -0.759861474376527960, -0.759893977677938650, --0.759926479079614300, -0.759958978581473880, -0.759991476183436210, -0.760023971885419590, -0.760056465687343090, -0.760088957589125650, -0.760121447590685450, -0.760153935691941780, --0.760186421892813270, -0.760218906193218640, -0.760251388593077060, -0.760283869092306720, -0.760316347690826680, -0.760348824388556110, -0.760381299185413080, -0.760413772081316890, --0.760446243076186250, -0.760478712169940340, -0.760511179362497240, -0.760543644653776330, -0.760576108043696460, -0.760608569532176150, -0.760641029119134340, -0.760673486804489980, --0.760705942588161930, -0.760738396470069360, -0.760770848450130430, -0.760803298528264450, -0.760835746704390360, -0.760868192978426780, -0.760900637350292670, -0.760933079819906990, --0.760965520387188450, -0.760997959052056580, -0.761030395814429440, -0.761062830674226310, -0.761095263631366480, -0.761127694685768130, -0.761160123837350540, -0.761192551086032680, --0.761224976431733700, -0.761257399874372020, -0.761289821413866810, -0.761322241050137350, -0.761354658783101930, -0.761387074612679960, -0.761419488538790270, -0.761451900561351810, --0.761484310680283990, -0.761516718895505100, -0.761549125206934300, -0.761581529614490990, -0.761613932118093690, -0.761646332717661470, -0.761678731413113490, -0.761711128204368590, --0.761743523091346190, -0.761775916073964670, -0.761808307152143650, -0.761840696325801650, -0.761873083594857840, -0.761905468959231390, -0.761937852418841270, -0.761970233973606750, --0.762002613623446350, -0.762034991368279350, -0.762067367208025260, -0.762099741142602480, -0.762132113171930300, -0.762164483295927900, -0.762196851514514220, -0.762229217827608770, --0.762261582235129960, -0.762293944736997080, -0.762326305333129730, -0.762358664023446320, -0.762391020807866250, -0.762423375686308690, -0.762455728658692930, -0.762488079724937600, --0.762520428884961960, -0.762552776138685550, -0.762585121486026970, -0.762617464926905630, -0.762649806461240590, -0.762682146088951020, -0.762714483809956320, -0.762746819624175230, --0.762779153531527030, -0.762811485531931230, -0.762843815625306450, -0.762876143811572090, -0.762908470090647440, -0.762940794462451550, -0.762973116926904060, -0.763005437483923350, --0.763037756133429170, -0.763070072875340790, -0.763102387709576950, -0.763134700636057260, -0.763167011654700690, -0.763199320765426960, -0.763231627968154580, -0.763263933262803170, --0.763296236649292140, -0.763328538127540310, -0.763360837697467210, -0.763393135358991890, -0.763425431112033760, -0.763457724956512320, -0.763490016892346300, -0.763522306919455220, --0.763554595037758690, -0.763586881247175440, -0.763619165547624880, -0.763651447939026510, -0.763683728421299390, -0.763716006994363370, -0.763748283658136960, -0.763780558412540110, --0.763812831257491660, -0.763845102192911130, -0.763877371218717790, -0.763909638334831050, -0.763941903541170530, -0.763974166837654840, -0.764006428224203840, -0.764038687700737020, --0.764070945267173230, -0.764103200923432090, -0.764135454669432890, -0.764167706505095130, -0.764199956430338330, -0.764232204445081330, -0.764264450549243860, -0.764296694742745530, --0.764328937025505200, -0.764361177397442580, -0.764393415858476870, -0.764425652408528000, -0.764457887047514720, -0.764490119775356750, -0.764522350591973710, -0.764554579497284560, --0.764586806491208910, -0.764619031573666290, -0.764651254744576070, -0.764683476003858000, -0.764715695351430910, -0.764747912787214550, -0.764780128311128850, -0.764812341923092440, --0.764844553623025170, -0.764876763410846540, -0.764908971286475950, -0.764941177249833350, -0.764973381300837360, -0.765005583439408050, -0.765037783665465040, -0.765069981978927280, --0.765102178379714500, -0.765134372867746330, -0.765166565442942480, -0.765198756105221920, -0.765230944854504490, -0.765263131690710030, -0.765295316613757490, -0.765327499623566500, --0.765359680720056890, -0.765391859903148060, -0.765424037172759860, -0.765456212528811240, -0.765488385971222150, -0.765520557499912320, -0.765552727114800820, -0.765584894815807600, --0.765617060602852060, -0.765649224475853820, -0.765681386434732940, -0.765713546479408150, -0.765745704609799960, -0.765777860825827110, -0.765810015127409540, -0.765842167514466990, --0.765874317986919070, -0.765906466544685640, -0.765938613187685750, -0.765970757915839240, -0.766002900729066290, -0.766035041627285640, -0.766067180610417450, -0.766099317678381350, --0.766131452831096960, -0.766163586068484110, -0.766195717390462110, -0.766227846796950770, -0.766259974287870180, -0.766292099863139290, -0.766324223522678150, -0.766356345266406390, --0.766388465094244190, -0.766420583006110490, -0.766452699001925360, -0.766484813081608760, -0.766516925245079750, -0.766549035492258500, -0.766581143823064640, -0.766613250237418000, --0.766645354735238430, -0.766677457316445210, -0.766709557980958410, -0.766741656728697870, -0.766773753559582990, -0.766805848473533720, -0.766837941470469800, -0.766870032550311050, --0.766902121712977560, -0.766934208958388370, -0.766966294286463680, -0.766998377697123650, -0.767030459190287230, -0.767062538765874820, -0.767094616423805940, -0.767126692164000870, --0.767158765986378780, -0.767190837890859730, -0.767222907877363910, -0.767254975945810600, -0.767287042096119750, -0.767319106328211320, -0.767351168642005140, -0.767383229037421290, --0.767415287514379150, -0.767447344072798690, -0.767479398712600290, -0.767511451433703030, -0.767543502236027080, -0.767575551119492490, -0.767607598084018910, -0.767639643129526710, --0.767671686255935070, -0.767703727463164620, -0.767735766751134420, -0.767767804119764860, -0.767799839568975790, -0.767831873098687060, -0.767863904708819050, -0.767895934399290820, --0.767927962170022900, -0.767959988020935350, -0.767992011951947550, -0.768024033962979690, -0.768056054053951720, -0.768088072224783590, -0.768120088475395590, -0.768152102805707120, --0.768184115215638450, -0.768216125705109660, -0.768248134274040370, -0.768280140922350640, -0.768312145649960640, -0.768344148456790550, -0.768376149342759770, -0.768408148307788700, --0.768440145351797390, -0.768472140474705580, -0.768504133676433330, -0.768536124956900820, -0.768568114316027890, -0.768600101753735050, -0.768632087269941700, -0.768664070864568010, --0.768696052537534480, -0.768728032288760630, -0.768760010118166530, -0.768791986025672560, -0.768823960011198570, -0.768855932074664960, -0.768887902215991240, -0.768919870435098020, --0.768951836731904810, -0.768983801106332130, -0.769015763558299810, -0.769047724087728150, -0.769079682694537530, -0.769111639378647350, -0.769143594139978020, -0.769175546978450030, --0.769207497893982910, -0.769239446886497040, -0.769271393955912600, -0.769303339102149540, -0.769335282325128600, -0.769367223624769060, -0.769399163000991430, -0.769431100453716210, --0.769463035982863030, -0.769494969588352170, -0.769526901270103920, -0.769558831028038680, -0.769590758862076060, -0.769622684772136580, -0.769654608758140730, -0.769686530820007930, --0.769718450957658900, -0.769750369171013800, -0.769782285459992720, -0.769814199824516150, -0.769846112264503830, -0.769878022779876270, -0.769909931370553970, -0.769941838036456440, --0.769973742777504410, -0.770005645593617950, -0.770037546484717450, -0.770069445450723310, -0.770101342491555260, -0.770133237607133920, -0.770165130797379800, -0.770197022062212520, --0.770228911401552590, -0.770260798815320500, -0.770292684303436670, -0.770324567865820820, -0.770356449502393570, -0.770388329213075540, -0.770420206997786350, -0.770452082856446620, --0.770483956788976740, -0.770515828795296900, -0.770547698875327810, -0.770579567028989110, -0.770611433256201630, -0.770643297556885760, -0.770675159930961360, -0.770707020378349150, --0.770738878898969300, -0.770770735492742330, -0.770802590159588740, -0.770834442899428370, -0.770866293712182180, -0.770898142597770120, -0.770929989556112580, -0.770961834587130080, --0.770993677690742900, -0.771025518866871980, -0.771057358115436850, -0.771089195436358340, -0.771121030829557190, -0.771152864294953220, -0.771184695832466960, -0.771216525442019020, --0.771248353123529800, -0.771280178876919910, -0.771312002702109420, -0.771343824599018730, -0.771375644567568910, -0.771407462607679670, -0.771439278719271760, -0.771471092902265680, --0.771502905156582040, -0.771534715482140920, -0.771566523878863040, -0.771598330346669140, -0.771630134885479050, -0.771661937495213720, -0.771693738175793560, -0.771725536927138970, --0.771757333749170880, -0.771789128641809150, -0.771820921604974620, -0.771852712638588010, -0.771884501742569400, -0.771916288916839500, -0.771948074161318940, -0.771979857475928120, --0.772011638860587990, -0.772043418315218390, -0.772075195839740270, -0.772106971434074470, -0.772138745098141070, -0.772170516831860660, -0.772202286635154000, -0.772234054507941910, --0.772265820450144470, -0.772297584461682400, -0.772329346542476650, -0.772361106692447290, -0.772392864911515150, -0.772424621199600760, -0.772456375556624940, -0.772488127982508430, --0.772519878477171300, -0.772551627040534480, -0.772583373672518950, -0.772615118373044530, -0.772646861142032400, -0.772678601979403190, -0.772710340885077400, -0.772742077858976080, --0.772773812901019320, -0.772805546011128160, -0.772837277189223020, -0.772869006435224600, -0.772900733749053660, -0.772932459130630910, -0.772964182579877310, -0.772995904096712930, --0.773027623681058820, -0.773059341332835940, -0.773091057051964350, -0.773122770838365230, -0.773154482691959080, -0.773186192612666860, -0.773217900600409290, -0.773249606655106780, --0.773281310776680160, -0.773313012965050620, -0.773344713220138310, -0.773376411541864210, -0.773408107930149020, -0.773439802384913830, -0.773471494906078920, -0.773503185493565230, --0.773534874147293830, -0.773566560867185000, -0.773598245653159710, -0.773629928505138900, -0.773661609423043180, -0.773693288406793860, -0.773724965456310980, -0.773756640571515610, --0.773788313752328930, -0.773819984998671220, -0.773851654310463540, -0.773883321687626750, -0.773914987130081670, -0.773946650637749260, -0.773978312210550130, -0.774009971848405140, --0.774041629551235450, -0.774073285318961470, -0.774104939151504360, -0.774136591048784740, -0.774168241010724010, -0.774199889037242350, -0.774231535128261040, -0.774263179283701140, --0.774294821503482940, -0.774326461787527840, -0.774358100135756460, -0.774389736548089850, -0.774421371024449190, -0.774453003564754880, -0.774484634168927990, -0.774516262836889790, --0.774547889568560690, -0.774579514363861850, -0.774611137222714240, -0.774642758145038800, -0.774674377130756710, -0.774705994179788360, -0.774737609292055370, -0.774769222467478040, --0.774800833705977740, -0.774832443007475220, -0.774864050371891660, -0.774895655799148320, -0.774927259289165500, -0.774958860841864490, -0.774990460457166690, -0.775022058134992360, --0.775053653875263040, -0.775085247677899440, -0.775116839542822730, -0.775148429469954330, -0.775180017459214500, -0.775211603510524540, -0.775243187623805950, -0.775274769798979140, --0.775306350035965260, -0.775337928334685620, -0.775369504695061500, -0.775401079117013170, -0.775432651600462260, -0.775464222145329950, -0.775495790751536850, -0.775527357419004250, --0.775558922147653320, -0.775590484937405010, -0.775622045788180730, -0.775653604699901080, -0.775685161672487470, -0.775716716705861180, -0.775748269799942940, -0.775779820954653920, --0.775811370169915300, -0.775842917445648370, -0.775874462781774410, -0.775906006178213930, -0.775937547634888540, -0.775969087151719530, -0.776000624728627410, -0.776032160365533800, --0.776063694062359870, -0.776095225819026900, -0.776126755635455630, -0.776158283511567460, -0.776189809447283770, -0.776221333442525420, -0.776252855497213680, -0.776284375611269840, --0.776315893784614960, -0.776347410017170670, -0.776378924308857580, -0.776410436659597190, -0.776441947069311020, -0.776473455537919690, -0.776504962065344690, -0.776536466651507330, --0.776567969296328760, -0.776599469999730510, -0.776630968761633400, -0.776662465581959060, -0.776693960460628330, -0.776725453397562720, -0.776756944392683390, -0.776788433445911750, --0.776819920557169310, -0.776851405726376790, -0.776882888953455810, -0.776914370238327770, -0.776945849580913620, -0.776977326981134750, -0.777008802438912680, -0.777040275954168580, --0.777071747526824060, -0.777103217156799860, -0.777134684844017600, -0.777166150588398890, -0.777197614389864680, -0.777229076248336260, -0.777260536163735250, -0.777291994135983160, --0.777323450165000820, -0.777354904250709740, -0.777386356393031770, -0.777417806591887640, -0.777449254847198960, -0.777480701158887230, -0.777512145526873640, -0.777543587951080030, --0.777575028431427120, -0.777606466967836750, -0.777637903560230330, -0.777669338208529020, -0.777700770912654220, -0.777732201672527660, -0.777763630488070400, -0.777795057359204510, --0.777826482285850610, -0.777857905267930860, -0.777889326305366000, -0.777920745398077870, -0.777952162545987870, -0.777983577749017390, -0.778014991007088370, -0.778046402320121460, --0.778077811688038580, -0.778109219110761470, -0.778140624588211090, -0.778172028120309060, -0.778203429706977090, -0.778234829348136480, -0.778266227043708960, -0.778297622793615700, --0.778329016597778420, -0.778360408456118870, -0.778391798368557990, -0.778423186335017500, -0.778454572355419150, -0.778485956429684430, -0.778517338557734970, -0.778548718739491940, --0.778580096974877400, -0.778611473263812410, -0.778642847606218710, -0.778674220002017800, -0.778705590451131410, -0.778736958953481270, -0.778768325508988560, -0.778799690117574880, --0.778831052779162420, -0.778862413493671910, -0.778893772261025410, -0.778925129081144530, -0.778956483953950780, -0.778987836879366120, -0.779019187857311610, -0.779050536887709090, --0.779081883970480500, -0.779113229105546920, -0.779144572292830300, -0.779175913532252240, -0.779207252823734710, -0.779238590167198760, -0.779269925562566250, -0.779301259009759330, --0.779332590508698850, -0.779363920059306990, -0.779395247661505360, -0.779426573315215480, -0.779457897020359610, -0.779489218776858620, -0.779520538584634550, -0.779551856443609470, --0.779583172353704450, -0.779614486314841540, -0.779645798326942360, -0.779677108389928650, -0.779708416503722580, -0.779739722668245090, -0.779771026883418590, -0.779802329149164250, --0.779833629465404020, -0.779864927832059850, -0.779896224249053250, -0.779927518716306500, -0.779958811233740560, -0.779990101801277590, -0.780021390418839670, -0.780052677086348070, --0.780083961803724630, -0.780115244570891430, -0.780146525387769960, -0.780177804254282630, -0.780209081170350370, -0.780240356135895490, -0.780271629150840030, -0.780302900215105180, --0.780334169328612990, -0.780365436491285420, -0.780396701703044650, -0.780427964963811730, -0.780459226273508940, -0.780490485632058360, -0.780521743039381270, -0.780552998495399830, --0.780584252000036010, -0.780615503553211410, -0.780646753154848330, -0.780678000804868160, -0.780709246503192960, -0.780740490249744900, -0.780771732044445390, -0.780802971887216480, --0.780834209777980240, -0.780865445716658390, -0.780896679703173220, -0.780927911737446130, -0.780959141819399180, -0.780990369948954770, -0.781021596126034060, -0.781052820350559340, --0.781084042622452570, -0.781115262941636020, -0.781146481308031100, -0.781177697721559870, -0.781208912182144720, -0.781240124689706940, -0.781271335244168920, -0.781302543845452610, --0.781333750493479860, -0.781364955188173060, -0.781396157929453490, -0.781427358717243670, -0.781458557551465650, -0.781489754432040940, -0.781520949358891940, -0.781552142331940480, --0.781583333351108630, -0.781614522416318790, -0.781645709527492350, -0.781676894684551930, -0.781708077887419030, -0.781739259136015830, -0.781770438430264610, -0.781801615770087220, --0.781832791155406050, -0.781863964586142710, -0.781895136062219390, -0.781926305583558470, -0.781957473150081570, -0.781988638761710990, -0.782019802418368880, -0.782050964119977100, --0.782082123866458370, -0.782113281657733860, -0.782144437493726310, -0.782175591374357880, -0.782206743299550200, -0.782237893269225660, -0.782269041283306320, -0.782300187341714690, --0.782331331444372390, -0.782362473591201700, -0.782393613782125130, -0.782424752017064180, -0.782455888295941480, -0.782487022618678970, -0.782518154985198940, -0.782549285395423790, --0.782580413849275120, -0.782611540346675460, -0.782642664887547190, -0.782673787471811930, -0.782704908099392300, -0.782736026770210370, -0.782767143484188410, -0.782798258241248820, --0.782829371041313230, -0.782860481884304350, -0.782891590770144470, -0.782922697698755330, -0.782953802670059540, -0.782984905683979160, -0.783016006740436810, -0.783047105839354110, --0.783078202980653780, -0.783109298164258120, -0.783140391390088950, -0.783171482658068800, -0.783202571968119930, -0.783233659320164640, -0.783264744714125550, -0.783295828149924270, --0.783326909627483410, -0.783357989146725610, -0.783389066707572470, -0.783420142309946720, -0.783451215953770540, -0.783482287638966430, -0.783513357365456800, -0.783544425133163580, --0.783575490942009510, -0.783606554791916430, -0.783637616682806960, -0.783668676614603490, -0.783699734587228300, -0.783730790600604020, -0.783761844654652600, -0.783792896749296420, --0.783823946884458440, -0.783854995060060180, -0.783886041276024460, -0.783917085532273680, -0.783948127828730130, -0.783979168165316650, -0.784010206541954860, -0.784041242958567590, --0.784072277415077460, -0.784103309911406420, -0.784134340447477100, -0.784165369023211880, -0.784196395638533490, -0.784227420293363900, -0.784258442987625810, -0.784289463721241750, --0.784320482494133890, -0.784351499306224720, -0.784382514157436870, -0.784413527047692740, -0.784444537976914940, -0.784475546945025640, -0.784506553951947460, -0.784537558997603130, --0.784568562081914720, -0.784599563204804840, -0.784630562366196100, -0.784661559566010910, -0.784692554804172100, -0.784723548080601630, -0.784754539395222220, -0.784785528747956820, --0.784816516138727270, -0.784847501567456530, -0.784878485034066880, -0.784909466538481480, -0.784940446080621970, -0.784971423660411500, -0.785002399277772600, -0.785033372932627540, --0.785064344624899050, -0.785095314354509630, -0.785126282121381910, -0.785157247925438840, -0.785188211766602250, -0.785219173644795210, -0.785250133559940560, -0.785281091511960240, --0.785312047500777210, -0.785343001526314090, -0.785373953588493380, -0.785404903687238140, -0.785435851822470330, -0.785466797994113230, -0.785497742202088790, -0.785528684446319960, --0.785559624726729470, -0.785590563043239930, -0.785621499395774300, -0.785652433784254530, -0.785683366208603800, -0.785714296668744820, -0.785745225164599880, -0.785776151696091940, --0.785807076263143500, -0.785837998865677400, -0.785868919503616590, -0.785899838176883250, -0.785930754885400320, -0.785961669629090750, -0.785992582407876730, -0.786023493221681190, --0.786054402070426980, -0.786085308954037050, -0.786116213872433580, -0.786147116825539500, -0.786178017813278010, -0.786208916835571150, -0.786239813892341990, -0.786270708983513260, --0.786301602109007790, -0.786332493268748660, -0.786363382462657910, -0.786394269690658840, -0.786425154952674180, -0.786456038248626530, -0.786486919578438750, -0.786517798942033550, --0.786548676339334010, -0.786579551770262950, -0.786610425234742780, -0.786641296732696560, -0.786672166264047350, -0.786703033828717420, -0.786733899426629970, -0.786764763057707710, --0.786795624721873920, -0.786826484419050680, -0.786857342149161370, -0.786888197912128830, -0.786919051707875570, -0.786949903536324660, -0.786980753397399040, -0.787011601291021550, --0.787042447217115250, -0.787073291175602650, -0.787104133166406710, -0.787134973189450800, -0.787165811244657120, -0.787196647331949050, -0.787227481451249210, -0.787258313602480770, --0.787289143785566800, -0.787319972000429580, -0.787350798246992830, -0.787381622525178740, -0.787412444834910690, -0.787443265176111410, -0.787474083548704070, -0.787504899952611750, --0.787535714387756940, -0.787566526854062810, -0.787597337351452650, -0.787628145879848860, -0.787658952439174610, -0.787689757029353180, -0.787720559650307180, -0.787751360301960140, --0.787782158984234430, -0.787812955697053340, -0.787843750440340050, -0.787874543214017180, -0.787905334018008000, -0.787936122852235350, -0.787966909716622750, -0.787997694611092590, --0.788028477535568150, -0.788059258489972940, -0.788090037474229230, -0.788120814488260320, -0.788151589531989490, -0.788182362605339690, -0.788213133708234200, -0.788243902840595640, --0.788274670002347300, -0.788305435193412560, -0.788336198413713940, -0.788366959663174830, -0.788397718941718400, -0.788428476249267600, -0.788459231585745820, -0.788489984951075810, --0.788520736345181050, -0.788551485767984170, -0.788582233219408680, -0.788612978699377520, -0.788643722207813870, -0.788674463744641230, -0.788705203309782220, -0.788735940903160130, --0.788766676524698450, -0.788797410174319920, -0.788828141851947720, -0.788858871557505230, -0.788889599290915510, -0.788920325052102190, -0.788951048840987660, -0.788981770657495530, --0.789012490501549310, -0.789043208373071630, -0.789073924271985750, -0.789104638198215190, -0.789135350151683350, -0.789166060132312720, -0.789196768140027040, -0.789227474174749700, --0.789258178236403320, -0.789288880324911620, -0.789319580440197680, -0.789350278582184760, -0.789380974750796380, -0.789411668945955380, -0.789442361167585150, -0.789473051415609310, --0.789503739689950580, -0.789534425990532470, -0.789565110317278270, -0.789595792670111370, -0.789626473048955280, -0.789657151453732610, -0.789687827884367200, -0.789718502340782450, --0.789749174822901080, -0.789779845330646930, -0.789810513863943080, -0.789841180422713230, -0.789871845006880120, -0.789902507616367380, -0.789933168251098720, -0.789963826910996870, --0.789994483595985340, -0.790025138305987750, -0.790055791040927160, -0.790086441800727510, -0.790117090585311430, -0.790147737394602650, -0.790178382228524660, -0.790209025087000640, --0.790239665969953880, -0.790270304877308090, -0.790300941808986470, -0.790331576764912840, -0.790362209745009920, -0.790392840749201800, -0.790423469777411290, -0.790454096829562030, --0.790484721905577610, -0.790515345005381450, -0.790545966128897050, -0.790576585276047570, -0.790607202446756530, -0.790637817640947870, -0.790668430858544320, -0.790699042099469730, --0.790729651363647480, -0.790760258651001190, -0.790790863961454480, -0.790821467294930300, -0.790852068651352490, -0.790882668030644780, -0.790913265432730110, -0.790943860857532320, --0.790974454304974820, -0.791005045774981540, -0.791035635267475330, -0.791066222782380040, -0.791096808319619370, -0.791127391879116510, -0.791157973460795190, -0.791188553064578910, --0.791219130690391180, -0.791249706338155940, -0.791280280007796270, -0.791310851699235760, -0.791341421412398380, -0.791371989147207300, -0.791402554903586130, -0.791433118681458600, --0.791463680480748330, -0.791494240301379050, -0.791524798143274030, -0.791555354006356900, -0.791585907890551720, -0.791616459795781440, -0.791647009721970000, -0.791677557669041130, --0.791708103636918570, -0.791738647625525480, -0.791769189634785820, -0.791799729664623310, -0.791830267714961340, -0.791860803785723650, -0.791891337876833970, -0.791921869988216010, --0.791952400119793510, -0.791982928271489860, -0.792013454443228900, -0.792043978634934480, -0.792074500846529860, -0.792105021077939010, -0.792135539329085650, -0.792166055599893390, --0.792196569890286310, -0.792227082200187450, -0.792257592529521220, -0.792288100878210780, -0.792318607246179970, -0.792349111633352750, -0.792379614039652740, -0.792410114465003870, --0.792440612909329540, -0.792471109372553610, -0.792501603854600220, -0.792532096355392570, -0.792562586874854590, -0.792593075412910240, -0.792623561969483140, -0.792654046544497450, --0.792684529137876350, -0.792715009749543900, -0.792745488379424270, -0.792775965027440630, -0.792806439693517050, -0.792836912377577360, -0.792867383079545630, -0.792897851799345240, --0.792928318536900270, -0.792958783292134650, -0.792989246064971900, -0.793019706855335960, -0.793050165663150790, -0.793080622488340210, -0.793111077330828310, -0.793141530190538460, --0.793171981067394840, -0.793202429961321510, -0.793232876872241750, -0.793263321800079860, -0.793293764744759770, -0.793324205706205100, -0.793354644684340250, -0.793385081679088610, --0.793415516690374130, -0.793445949718121210, -0.793476380762253130, -0.793506809822694060, -0.793537236899368060, -0.793567661992199080, -0.793598085101110850, -0.793628506226027320, --0.793658925366872770, -0.793689342523570710, -0.793719757696045190, -0.793750170884220290, -0.793780582088020050, -0.793810991307368650, -0.793841398542189380, -0.793871803792406630, --0.793902207057944790, -0.793932608338727030, -0.793963007634677750, -0.793993404945721020, -0.794023800271780660, -0.794054193612781180, -0.794084584968645870, -0.794114974339299450, --0.794145361724665320, -0.794175747124667760, -0.794206130539230730, -0.794236511968278490, -0.794266891411735230, -0.794297268869524450, -0.794327644341570550, -0.794358017827797690, --0.794388389328129610, -0.794418758842490580, -0.794449126370804560, -0.794479491912995830, -0.794509855468988560, -0.794540217038706480, -0.794570576622073750, -0.794600934219014900, --0.794631289829453410, -0.794661643453313690, -0.794691995090519910, -0.794722344740996340, -0.794752692404666730, -0.794783038081455340, -0.794813381771286690, -0.794843723474084270, --0.794874063189772500, -0.794904400918275630, -0.794934736659517640, -0.794965070413423240, -0.794995402179915820, -0.795025731958919900, -0.795056059750359980, -0.795086385554159560, --0.795116709370243150, -0.795147031198535030, -0.795177351038959260, -0.795207668891440460, -0.795237984755902240, -0.795268298632269000, -0.795298610520465350, -0.795328920420414810, --0.795359228332041980, -0.795389534255271150, -0.795419838190026710, -0.795450140136232390, -0.795480440093812800, -0.795510738062692350, -0.795541034042794750, -0.795571328034044510, --0.795601620036366030, -0.795631910049683480, -0.795662198073921470, -0.795692484109003620, -0.795722768154854650, -0.795753050211398970, -0.795783330278560410, -0.795813608356263470, --0.795843884444432550, -0.795874158542991930, -0.795904430651866220, -0.795934700770979160, -0.795964968900255590, -0.795995235039619220, -0.796025499188994900, -0.796055761348306800, --0.796086021517479310, -0.796116279696436950, -0.796146535885103760, -0.796176790083404140, -0.796207042291262820, -0.796237292508603640, -0.796267540735351220, -0.796297786971429940, --0.796328031216764210, -0.796358273471278740, -0.796388513734897160, -0.796418752007544420, -0.796448988289145120, -0.796479222579623000, -0.796509454878902790, -0.796539685186908990, --0.796569913503566210, -0.796600139828798400, -0.796630364162530190, -0.796660586504686410, -0.796690806855190890, -0.796721025213968370, -0.796751241580943240, -0.796781455956040000, --0.796811668339183380, -0.796841878730297330, -0.796872087129306680, -0.796902293536135950, -0.796932497950709310, -0.796962700372951360, -0.796992900802786730, -0.797023099240139810, --0.797053295684935330, -0.797083490137097450, -0.797113682596551130, -0.797143873063220210, -0.797174061537029740, -0.797204248017904020, -0.797234432505767750, -0.797264615000545680, --0.797294795502161760, -0.797324974010540810, -0.797355150525607790, -0.797385325047286540, -0.797415497575502010, -0.797445668110178700, -0.797475836651241330, -0.797506003198614530, --0.797536167752222580, -0.797566330311990090, -0.797596490877842010, -0.797626649449702520, -0.797656806027496450, -0.797686960611148300, -0.797717113200583030, -0.797747263795724690, --0.797777412396498130, -0.797807559002828400, -0.797837703614639460, -0.797867846231856360, -0.797897986854403500, -0.797928125482205820, -0.797958262115187940, -0.797988396753274270, --0.798018529396389510, -0.798048660044458740, -0.798078788697406120, -0.798108915355156380, -0.798139040017634470, -0.798169162684764900, -0.798199283356472720, -0.798229402032682110, --0.798259518713317910, -0.798289633398305170, -0.798319746087568170, -0.798349856781031760, -0.798379965478620670, -0.798410072180260060, -0.798440176885873880, -0.798470279595387300, --0.798500380308725280, -0.798530479025811980, -0.798560575746572580, -0.798590670470931690, -0.798620763198814140, -0.798650853930144900, -0.798680942664848350, -0.798711029402849440, --0.798741114144073120, -0.798771196888443890, -0.798801277635886600, -0.798831356386326070, -0.798861433139687160, -0.798891507895895030, -0.798921580654873730, -0.798951651416548890, --0.798981720180844570, -0.799011786947685930, -0.799041851716997820, -0.799071914488705070, -0.799101975262732860, -0.799132034039005460, -0.799162090817447930, -0.799192145597985460, --0.799222198380542430, -0.799252249165043780, -0.799282297951414590, -0.799312344739579570, -0.799342389529464010, -0.799372432320992200, -0.799402473114089300, -0.799432511908680480, --0.799462548704690130, -0.799492583502043440, -0.799522616300665230, -0.799552647100480800, -0.799582675901414520, -0.799612702703391460, -0.799642727506336910, -0.799672750310175370, --0.799702771114831900, -0.799732789920231560, -0.799762806726299180, -0.799792821532960050, -0.799822834340138570, -0.799852845147760010, -0.799882853955749650, -0.799912860764031900, --0.799942865572531910, -0.799972868381174870, -0.800002869189885610, -0.800032867998589410, -0.800062864807210780, -0.800092859615675000, -0.800122852423907460, -0.800152843231832330, --0.800182832039375240, -0.800212818846461000, -0.800242803653014920, -0.800272786458961720, -0.800302767264226440, -0.800332746068734500, -0.800362722872410500, -0.800392697675179620, --0.800422670476967020, -0.800452641277697770, -0.800482610077297150, -0.800512576875689770, -0.800542541672800920, -0.800572504468556100, -0.800602465262879590, -0.800632424055697010, --0.800662380846933310, -0.800692335636513760, -0.800722288424363550, -0.800752239210407280, -0.800782187994570790, -0.800812134776778590, -0.800842079556955970, -0.800872022335028190, --0.800901963110920320, -0.800931901884557870, -0.800961838655865450, -0.800991773424768240, -0.801021706191192060, -0.801051636955061210, -0.801081565716301400, -0.801111492474837590, --0.801141417230595070, -0.801171339983499210, -0.801201260733474860, -0.801231179480447200, -0.801261096224341940, -0.801291010965083710, -0.801320923702597890, -0.801350834436809880, --0.801380743167644960, -0.801410649895027860, -0.801440554618884190, -0.801470457339139350, -0.801500358055718180, -0.801530256768546170, -0.801560153477548390, -0.801590048182650340, --0.801619940883777300, -0.801649831580854230, -0.801679720273806520, -0.801709606962559880, -0.801739491647038840, -0.801769374327169220, -0.801799255002876080, -0.801829133674084700, --0.801859010340720930, -0.801888885002709270, -0.801918757659975450, -0.801948628312444960, -0.801978496960042640, -0.802008363602694010, -0.802038228240324560, -0.802068090872859800, --0.802097951500224560, -0.802127810122344350, -0.802157666739145010, -0.802187521350551160, -0.802217373956488510, -0.802247224556882470, -0.802277073151658300, -0.802306919740741750, --0.802336764324057650, -0.802366606901531610, -0.802396447473089360, -0.802426286038655730, -0.802456122598156350, -0.802485957151516600, -0.802515789698662110, -0.802545620239518250, --0.802575448774010210, -0.802605275302063710, -0.802635099823603810, -0.802664922338556130, -0.802694742846846170, -0.802724561348399420, -0.802754377843141410, -0.802784192330997290, --0.802814004811892580, -0.802843815285753220, -0.802873623752504040, -0.802903430212070780, -0.802933234664378940, -0.802963037109354020, -0.802992837546921740, -0.803022635977007180, --0.803052432399535940, -0.803082226814433970, -0.803112019221626120, -0.803141809621038320, -0.803171598012595860, -0.803201384396224680, -0.803231168771849860, -0.803260951139397110, --0.803290731498792150, -0.803320509849960170, -0.803350286192826890, -0.803380060527317920, -0.803409832853358760, -0.803439603170875370, -0.803469371479792580, -0.803499137780036450, --0.803528902071532710, -0.803558664354206530, -0.803588424627983630, -0.803618182892789630, -0.803647939148550260, -0.803677693395191130, -0.803707445632637630, -0.803737195860815490, --0.803766944079650660, -0.803796690289068310, -0.803826434488994050, -0.803856176679353720, -0.803885916860073270, -0.803915655031077760, -0.803945391192293140, -0.803975125343645350, --0.804004857485059340, -0.804034587616461290, -0.804064315737776700, -0.804094041848931410, -0.804123765949851130, -0.804153488040461270, -0.804183208120687780, -0.804212926190456370, --0.804242642249692440, -0.804272356298321940, -0.804302068336270600, -0.804331778363463920, -0.804361486379828180, -0.804391192385288440, -0.804420896379770990, -0.804450598363200990, --0.804480298335504610, -0.804509996296607350, -0.804539692246435180, -0.804569386184914030, -0.804599078111969180, -0.804628768027526590, -0.804658455931512310, -0.804688141823851620, --0.804717825704470700, -0.804747507573295050, -0.804777187430250730, -0.804806865275263790, -0.804836541108259310, -0.804866214929163440, -0.804895886737902360, -0.804925556534401340, --0.804955224318586350, -0.804984890090383320, -0.805014553849718320, -0.805044215596516730, -0.805073875330704510, -0.805103533052207940, -0.805133188760952300, -0.805162842456863650, --0.805192494139867820, -0.805222143809890880, -0.805251791466858770, -0.805281437110697000, -0.805311080741331510, -0.805340722358688700, -0.805370361962693740, -0.805399999553272910, --0.805429635130352040, -0.805459268693857090, -0.805488900243714220, -0.805518529779848950, -0.805548157302187540, -0.805577782810655510, -0.805607406305178910, -0.805637027785683910, --0.805666647252096360, -0.805696264704342300, -0.805725880142347470, -0.805755493566037930, -0.805785104975339840, -0.805814714370178710, -0.805844321750480930, -0.805873927116172230, --0.805903530467178770, -0.805933131803426630, -0.805962731124841510, -0.805992328431349600, -0.806021923722877070, -0.806051516999349400, -0.806081108260693010, -0.806110697506833950, --0.806140284737698280, -0.806169869953211600, -0.806199453153300330, -0.806229034337890730, -0.806258613506908190, -0.806288190660279120, -0.806317765797929690, -0.806347338919785720, --0.806376910025773720, -0.806406479115819200, -0.806436046189848430, -0.806465611247787820, -0.806495174289562860, -0.806524735315100050, -0.806554294324325350, -0.806583851317165030, --0.806613406293545280, -0.806642959253391690, -0.806672510196630780, -0.806702059123188820, -0.806731606032991430, -0.806761150925965010, -0.806790693802035830, -0.806820234661130060, --0.806849773503173440, -0.806879310328092460, -0.806908845135813510, -0.806938377926262110, -0.806967908699364740, -0.806997437455047590, -0.807026964193236940, -0.807056488913859060, --0.807086011616839680, -0.807115532302105310, -0.807145050969582440, -0.807174567619196590, -0.807204082250874370, -0.807233594864541940, -0.807263105460125470, -0.807292614037551590, --0.807322120596745800, -0.807351625137635030, -0.807381127660144910, -0.807410628164202060, -0.807440126649732530, -0.807469623116662700, -0.807499117564919210, -0.807528609994427550, --0.807558100405114330, -0.807587588796906180, -0.807617075169728800, -0.807646559523508720, -0.807676041858172210, -0.807705522173645550, -0.807735000469855470, -0.807764476746727580, --0.807793951004188490, -0.807823423242164830, -0.807852893460582310, -0.807882361659367550, -0.807911827838446840, -0.807941291997746890, -0.807970754137193440, -0.808000214256713090, --0.808029672356232460, -0.808059128435677400, -0.808088582494974510, -0.808118034534050180, -0.808147484552830810, -0.808176932551242900, -0.808206378529212510, -0.808235822486666030, --0.808265264423530420, -0.808294704339731270, -0.808324142235195330, -0.808353578109849090, -0.808383011963618950, -0.808412443796431510, -0.808441873608212620, -0.808471301398889120, --0.808500727168387720, -0.808530150916634050, -0.808559572643555160, -0.808588992349077220, -0.808618410033127180, -0.808647825695630760, -0.808677239336514810, -0.808706650955706040, --0.808736060553130410, -0.808765468128714530, -0.808794873682385010, -0.808824277214068350, -0.808853678723691180, -0.808883078211179660, -0.808912475676460410, -0.808941871119460140, --0.808971264540105040, -0.809000655938321710, -0.809030045314036880, -0.809059432667176730, -0.809088817997668410, -0.809118201305437770, -0.809147582590411860, -0.809176961852516640, --0.809206339091679160, -0.809235714307825820, -0.809265087500883110, -0.809294458670777980, -0.809323827817436500, -0.809353194940785390, -0.809382560040751490, -0.809411923117261070, --0.809441284170240750, -0.809470643199617260, -0.809500000205317090, -0.809529355187267320, -0.809558708145393770, -0.809588059079623500, -0.809617407989883350, -0.809646754876099380, --0.809676099738198540, -0.809705442576107550, -0.809734783389753130, -0.809764122179061460, -0.809793458943959490, -0.809822793684374150, -0.809852126400231630, -0.809881457091458760, --0.809910785757982250, -0.809940112399728740, -0.809969437016625160, -0.809998759608597800, -0.810028080175573590, -0.810057398717479390, -0.810086715234241360, -0.810116029725786670, --0.810145342192041820, -0.810174652632933650, -0.810203961048389100, -0.810233267438334350, -0.810262571802696450, -0.810291874141402470, -0.810321174454378460, -0.810350472741551480, --0.810379769002848360, -0.810409063238196170, -0.810438355447520960, -0.810467645630749800, -0.810496933787809960, -0.810526219918627390, -0.810555504023129370, -0.810584786101242520, --0.810614066152893660, -0.810643344178009980, -0.810672620176517640, -0.810701894148343820, -0.810731166093415450, -0.810760436011658920, -0.810789703903001310, -0.810818969767369450, --0.810848233604690160, -0.810877495414890510, -0.810906755197896900, -0.810936012953636600, -0.810965268682036110, -0.810994522383022390, -0.811023774056522370, -0.811053023702462910, --0.811082271320771150, -0.811111516911373510, -0.811140760474197030, -0.811170002009168890, -0.811199241516215470, -0.811228478995263960, -0.811257714446241280, -0.811286947869074290, --0.811316179263690260, -0.811345408630015470, -0.811374635967977210, -0.811403861277502520, -0.811433084558517930, -0.811462305810950690, -0.811491525034727660, -0.811520742229776100, --0.811549957396022430, -0.811579170533393790, -0.811608381641817590, -0.811637590721220100, -0.811666797771528610, -0.811696002792670180, -0.811725205784571750, -0.811754406747160600, --0.811783605680363120, -0.811812802584106600, -0.811841997458318420, -0.811871190302924870, -0.811900381117853450, -0.811929569903031000, -0.811958756658384680, -0.811987941383841670, --0.812017124079328580, -0.812046304744772800, -0.812075483380101380, -0.812104659985240950, -0.812133834560119010, -0.812163007104662380, -0.812192177618798470, -0.812221346102453890, --0.812250512555556030, -0.812279676978032050, -0.812308839369808690, -0.812337999730813220, -0.812367158060972700, -0.812396314360214310, -0.812425468628465320, -0.812454620865652570, --0.812483771071703110, -0.812512919246544560, -0.812542065390103430, -0.812571209502307210, -0.812600351583082860, -0.812629491632357650, -0.812658629650058970, -0.812687765636113560, --0.812716899590448900, -0.812746031512991740, -0.812775161403669570, -0.812804289262409440, -0.812833415089138530, -0.812862538883784350, -0.812891660646273720, -0.812920780376533700, --0.812949898074492140, -0.812979013740075640, -0.813008127373211490, -0.813037238973827070, -0.813066348541849450, -0.813095456077206350, -0.813124561579824270, -0.813153665049630820, --0.813182766486553520, -0.813211865890518970, -0.813240963261454790, -0.813270058599288140, -0.813299151903946640, -0.813328243175357010, -0.813357332413446880, -0.813386419618143510, --0.813415504789373970, -0.813444587927065530, -0.813473669031145710, -0.813502748101541660, -0.813531825138181120, -0.813560900140990580, -0.813589973109897890, -0.813619044044830540, --0.813648112945715370, -0.813677179812479780, -0.813706244645051370, -0.813735307443357200, -0.813764368207325120, -0.813793426936881840, -0.813822483631955310, -0.813851538292472250, --0.813880590918360400, -0.813909641509547030, -0.813938690065959540, -0.813967736587525640, -0.813996781074172060, -0.814025823525826530, -0.814054863942416770, -0.814083902323869620, --0.814112938670112580, -0.814141972981073270, -0.814171005256679070, -0.814200035496857600, -0.814229063701535690, -0.814258089870641190, -0.814287114004101810, -0.814316136101844280, --0.814345156163796440, -0.814374174189885670, -0.814403190180039480, -0.814432204134185600, -0.814461216052250970, -0.814490225934163540, -0.814519233779850250, -0.814548239589238940, --0.814577243362257010, -0.814606245098831950, -0.814635244798891490, -0.814664242462362690, -0.814693238089173380, -0.814722231679251170, -0.814751223232523030, -0.814780212748916990, --0.814809200228360340, -0.814838185670780700, -0.814867169076105790, -0.814896150444262780, -0.814925129775179390, -0.814954107068783350, -0.814983082325001940, -0.815012055543762660, --0.815041026724993340, -0.815069995868621720, -0.815098962974574850, -0.815127928042780560, -0.815156891073166690, -0.815185852065660300, -0.815214811020189330, -0.815243767936681300, --0.815272722815063910, -0.815301675655264900, -0.815330626457211440, -0.815359575220831470, -0.815388521946052820, -0.815417466632802570, -0.815446409281008640, -0.815475349890598780, --0.815504288461500470, -0.815533224993641670, -0.815562159486949660, -0.815591091941352380, -0.815620022356777220, -0.815648950733151910, -0.815677877070404290, -0.815706801368461960, --0.815735723627252880, -0.815764643846704330, -0.815793562026744020, -0.815822478167300140, -0.815851392268299720, -0.815880304329670960, -0.815909214351341340, -0.815938122333238700, --0.815967028275291110, -0.815995932177425500, -0.816024834039570270, -0.816053733861653030, -0.816082631643601290, -0.816111527385342980, -0.816140421086805850, -0.816169312747917930, --0.816198202368606410, -0.816227089948799440, -0.816255975488424990, -0.816284858987410320, -0.816313740445683500, -0.816342619863172360, -0.816371497239804730, -0.816400372575508460, --0.816429245870211150, -0.816458117123840640, -0.816486986336325100, -0.816515853507591930, -0.816544718637569060, -0.816573581726184330, -0.816602442773365690, -0.816631301779041310, --0.816660158743138240, -0.816689013665584880, -0.816717866546309180, -0.816746717385238630, -0.816775566182301290, -0.816804412937425010, -0.816833257650537940, -0.816862100321567470, --0.816890940950441790, -0.816919779537088940, -0.816948616081436430, -0.816977450583412310, -0.817006283042944650, -0.817035113459961270, -0.817063941834390350, -0.817092768166159390, --0.817121592455196440, -0.817150414701429680, -0.817179234904786720, -0.817208053065195730, -0.817236869182584540, -0.817265683256881200, -0.817294495288013900, -0.817323305275910130, --0.817352113220498280, -0.817380919121705960, -0.817409722979461240, -0.817438524793692390, -0.817467324564327140, -0.817496122291293760, -0.817524917974519870, -0.817553711613933750, --0.817582503209463570, -0.817611292761036830, -0.817640080268581930, -0.817668865732026680, -0.817697649151299390, -0.817726430526328320, -0.817755209857040750, -0.817783987143365200, --0.817812762385229930, -0.817841535582562560, -0.817870306735291370, -0.817899075843344310, -0.817927842906649880, -0.817956607925135580, -0.817985370898729800, -0.818014131827360820, --0.818042890710956260, -0.818071647549444390, -0.818100402342753500, -0.818129155090811630, -0.818157905793546970, -0.818186654450887450, -0.818215401062761250, -0.818244145629096750, --0.818272888149821690, -0.818301628624864330, -0.818330367054152960, -0.818359103437615750, -0.818387837775180980, -0.818416570066776260, -0.818445300312330200, -0.818474028511771200, --0.818502754665026750, -0.818531478772025480, -0.818560200832695540, -0.818588920846965330, -0.818617638814762570, -0.818646354736015660, -0.818675068610653200, -0.818703780438602810, --0.818732490219792890, -0.818761197954151810, -0.818789903641607750, -0.818818607282089110, -0.818847308875523710, -0.818876008421840050, -0.818904705920966650, -0.818933401372831220, --0.818962094777362370, -0.818990786134488170, -0.819019475444137000, -0.819048162706237480, -0.819076847920717220, -0.819105531087505170, -0.819134212206528930, -0.819162891277717240, --0.819191568300998260, -0.819220243276300500, -0.819248916203552220, -0.819277587082681500, -0.819306255913616830, -0.819334922696286720, -0.819363587430618990, -0.819392250116542380, --0.819420910753985150, -0.819449569342875610, -0.819478225883142340, -0.819506880374713420, -0.819535532817517120, -0.819564183211482390, -0.819592831556536840, -0.819621477852609300, --0.819650122099627950, -0.819678764297521620, -0.819707404446218150, -0.819736042545646140, -0.819764678595734320, -0.819793312596410530, -0.819821944547603380, -0.819850574449241480, --0.819879202301253110, -0.819907828103566880, -0.819936451856110970, -0.819965073558813870, -0.819993693211604310, -0.820022310814410350, -0.820050926367160480, -0.820079539869783440, --0.820108151322207490, -0.820136760724361480, -0.820165368076173240, -0.820193973377571610, -0.820222576628485190, -0.820251177828842160, -0.820279776978571240, -0.820308374077600820, --0.820336969125859740, -0.820365562123275940, -0.820394153069778250, -0.820422741965295520, -0.820451328809755580, -0.820479913603087360, -0.820508496345219380, -0.820537077036080030, --0.820565655675598360, -0.820594232263702320, -0.820622806800320630, -0.820651379285382230, -0.820679949718815080, -0.820708518100548120, -0.820737084430509740, -0.820765648708628780, --0.820794210934833960, -0.820822771109053220, -0.820851329231215950, -0.820879885301250000, -0.820908439319084420, -0.820936991284647700, -0.820965541197868460, -0.820994089058675660, --0.821022634866997450, -0.821051178622762560, -0.821079720325900040, -0.821108259976337960, -0.821136797574005150, -0.821165333118830440, -0.821193866610742340, -0.821222398049669790, --0.821250927435541070, -0.821279454768285010, -0.821307980047830570, -0.821336503274106010, -0.821365024447040070, -0.821393543566561580, -0.821422060632599480, -0.821450575645082060, --0.821479088603938150, -0.821507599509096800, -0.821536108360486180, -0.821564615158035250, -0.821593119901672830, -0.821621622591327540, -0.821650123226928540, -0.821678621808403900, --0.821707118335682770, -0.821735612808694120, -0.821764105227366090, -0.821792595591627870, -0.821821083901408180, -0.821849570156635730, -0.821878054357239600, -0.821906536503148040, --0.821935016594290250, -0.821963494630595040, -0.821991970611990920, -0.822020444538406950, -0.822048916409771730, -0.822077386226014560, -0.822105853987063600, -0.822134319692848110, --0.822162783343297070, -0.822191244938338730, -0.822219704477902270, -0.822248161961916630, -0.822276617390310550, -0.822305070763013180, -0.822333522079952810, -0.822361971341058710, --0.822390418546259940, -0.822418863695484890, -0.822447306788662620, -0.822475747825722190, -0.822504186806592320, -0.822532623731202170, -0.822561058599480250, -0.822589491411355960, --0.822617922166757780, -0.822646350865614660, -0.822674777507855670, -0.822703202093409750, -0.822731624622206170, -0.822760045094173220, -0.822788463509240060, -0.822816879867336090, --0.822845294168389700, -0.822873706412330040, -0.822902116599086080, -0.822930524728586850, -0.822958930800761550, -0.822987334815538650, -0.823015736772847450, -0.823044136672617220, --0.823072534514776350, -0.823100930299254130, -0.823129324025979600, -0.823157715694881940, -0.823186105305889870, -0.823214492858932450, -0.823242878353939060, -0.823271261790838200, --0.823299643169559170, -0.823328022490031120, -0.823356399752183000, -0.823384774955944090, -0.823413148101243000, -0.823441519188009010, -0.823469888216171510, -0.823498255185659000, --0.823526620096400990, -0.823554982948326300, -0.823583343741364100, -0.823611702475443910, -0.823640059150494210, -0.823668413766444620, -0.823696766323223640, -0.823725116820760880, --0.823753465258985180, -0.823781811637825930, -0.823810155957212410, -0.823838498217073110, -0.823866838417337650, -0.823895176557935430, -0.823923512638794930, -0.823951846659845670, --0.823980178621016800, -0.824008508522237500, -0.824036836363437160, -0.824065162144544390, -0.824093485865488810, -0.824121807526199790, -0.824150127126605960, -0.824178444666636810, --0.824206760146221520, -0.824235073565289690, -0.824263384923769830, -0.824291694221591540, -0.824320001458684230, -0.824348306634976710, -0.824376609750398390, -0.824404910804878540, --0.824433209798346440, -0.824461506730731600, -0.824489801601962610, -0.824518094411969330, -0.824546385160680910, -0.824574673848026300, -0.824602960473935000, -0.824631245038336290, --0.824659527541159560, -0.824687807982334210, -0.824716086361789060, -0.824744362679453720, -0.824772636935257710, -0.824800909129129840, -0.824829179260999750, -0.824857447330796690, --0.824885713338450290, -0.824913977283889270, -0.824942239167043350, -0.824970498987842140, -0.824998756746214370, -0.825027012442089650, -0.825055266075397480, -0.825083517646067240, --0.825111767154028340, -0.825140014599209710, -0.825168259981541200, -0.825196503300952180, -0.825224744557371710, -0.825252983750729310, -0.825281220880954570, -0.825309455947976670, --0.825337688951725430, -0.825365919892129710, -0.825394148769119430, -0.825422375582623440, -0.825450600332571670, -0.825478823018893300, -0.825507043641517950, -0.825535262200375100, --0.825563478695394040, -0.825591693126504160, -0.825619905493635290, -0.825648115796716490, -0.825676324035677260, -0.825704530210447320, -0.825732734320956060, -0.825760936367133210, --0.825789136348907830, -0.825817334266209510, -0.825845530118968110, -0.825873723907112670, -0.825901915630572910, -0.825930105289278350, -0.825958292883158810, -0.825986478412143230, --0.826014661876161460, -0.826042843275143320, -0.826071022609017880, -0.826099199877714850, -0.826127375081163740, -0.826155548219294270, -0.826183719292036160, -0.826211888299318460, --0.826240055241071140, -0.826268220117223780, -0.826296382927705800, -0.826324543672446680, -0.826352702351376370, -0.826380858964424150, -0.826409013511520190, -0.826437165992593310, --0.826465316407573590, -0.826493464756390850, -0.826521611038974150, -0.826549755255253430, -0.826577897405158300, -0.826606037488618720, -0.826634175505563840, -0.826662311455923390, --0.826690445339627540, -0.826718577156605240, -0.826746706906786530, -0.826774834590101040, -0.826802960206478480, -0.826831083755848790, -0.826859205238141160, -0.826887324653285400, --0.826915442001211700, -0.826943557281849100, -0.826971670495127540, -0.826999781640976870, -0.827027890719326810, -0.827055997730107180, -0.827084102673247390, -0.827112205548677480, --0.827140306356326850, -0.827168405096125550, -0.827196501768003080, -0.827224596371889500, -0.827252688907714640, -0.827280779375407670, -0.827308867774898870, -0.827336954106118180, --0.827365038368994780, -0.827393120563458930, -0.827421200689440140, -0.827449278746868360, -0.827477354735673630, -0.827505428655785360, -0.827533500507133370, -0.827561570289648050, --0.827589638003258350, -0.827617703647894780, -0.827645767223486820, -0.827673828729964640, -0.827701888167257760, -0.827729945535296110, -0.827758000834009850, -0.827786054063328280, --0.827814105223181660, -0.827842154313499720, -0.827870201334212520, -0.827898246285249880, -0.827926289166541540, -0.827954329978017320, -0.827982368719607620, -0.828010405391241820, --0.828038439992849870, -0.828066472524361830, -0.828094502985707640, -0.828122531376817460, -0.828150557697620690, -0.828178581948047610, -0.828206604128028270, -0.828234624237492060, --0.828262642276369480, -0.828290658244590140, -0.828318672142084430, -0.828346683968781860, -0.828374693724612590, -0.828402701409506780, -0.828430707023393940, -0.828458710566204350, --0.828486712037868060, -0.828514711438314900, -0.828542708767475160, -0.828570704025278550, -0.828598697211655130, -0.828626688326535190, -0.828654677369848210, -0.828682664341524710, --0.828710649241494400, -0.828738632069687560, -0.828766612826034250, -0.828794591510464310, -0.828822568122908110, -0.828850542663295160, -0.828878515131555970, -0.828906485527620470, --0.828934453851418730, -0.828962420102881010, -0.828990384281937160, -0.829018346388517240, -0.829046306422551730, -0.829074264383970250, -0.829102220272703080, -0.829130174088680280, --0.829158125831832130, -0.829186075502088890, -0.829214023099380300, -0.829241968623636530, -0.829269912074788170, -0.829297853452764630, -0.829325792757496630, -0.829353729988914100, --0.829381665146947440, -0.829409598231526490, -0.829437529242581410, -0.829465458180042800, -0.829493385043840290, -0.829521309833904370, -0.829549232550165110, -0.829577153192552870, --0.829605071760997960, -0.829632988255430080, -0.829660902675779740, -0.829688815021977330, -0.829716725293952680, -0.829744633491636300, -0.829772539614958230, -0.829800443663848860, --0.829828345638238600, -0.829856245538057260, -0.829884143363235350, -0.829912039113703260, -0.829939932789390820, -0.829967824390228540, -0.829995713916146790, -0.830023601367075870, --0.830051486742945820, -0.830079370043686930, -0.830107251269230020, -0.830135130419504600, -0.830163007494441390, -0.830190882493970770, -0.830218755418022810, -0.830246626266528230, --0.830274495039416860, -0.830302361736619310, -0.830330226358066080, -0.830358088903686900, -0.830385949373412590, -0.830413807767173440, -0.830441664084899720, -0.830469518326522160, --0.830497370491970480, -0.830525220581175730, -0.830553068594067520, -0.830580914530576810, -0.830608758390633750, -0.830636600174168740, -0.830664439881112490, -0.830692277511394960, --0.830720113064946640, -0.830747946541698370, -0.830775777941579970, -0.830803607264522070, -0.830831434510455270, -0.830859259679309740, -0.830887082771016420, -0.830914903785505030, --0.830942722722706420, -0.830970539582551290, -0.830998354364969600, -0.831026167069891960, -0.831053977697248980, -0.831081786246971270, -0.831109592718988770, -0.831137397113232310, --0.831165199429632630, -0.831192999668119770, -0.831220797828624350, -0.831248593911076970, -0.831276387915408030, -0.831304179841548360, -0.831331969689428130, -0.831359757458977830, --0.831387543150128530, -0.831415326762810050, -0.831443108296953230, -0.831470887752488670, -0.831498665129346890, -0.831526440427458600, -0.831554213646754080, -0.831581984787164270, --0.831609753848619130, -0.831637520831049800, -0.831665285734386470, -0.831693048558560080, -0.831720809303501230, -0.831748567969140100, -0.831776324555407620, -0.831804079062234520, --0.831831831489551090, -0.831859581837287920, -0.831887330105375860, -0.831915076293745500, -0.831942820402327700, -0.831970562431052500, -0.831998302379851060, -0.832026040248654010, --0.832053776037391610, -0.832081509745994820, -0.832109241374394240, -0.832136970922520700, -0.832164698390304600, -0.832192423777676770, -0.832220147084568040, -0.832247868310908800, --0.832275587456629770, -0.832303304521661900, -0.832331019505935690, -0.832358732409382180, -0.832386443231931560, -0.832414151973514870, -0.832441858634063060, -0.832469563213506400, --0.832497265711775740, -0.832524966128802000, -0.832552664464515810, -0.832580360718848220, -0.832608054891729400, -0.832635746983090510, -0.832663436992862490, -0.832691124920975630, --0.832718810767360980, -0.832746494531949380, -0.832774176214671650, -0.832801855815458290, -0.832829533334240260, -0.832857208770948710, -0.832884882125513810, -0.832912553397866740, --0.832940222587938320, -0.832967889695659270, -0.832995554720960760, -0.833023217663773190, -0.833050878524027590, -0.833078537301654930, -0.833106193996585700, -0.833133848608751060, --0.833161501138081740, -0.833189151584508680, -0.833216799947963050, -0.833244446228375120, -0.833272090425676290, -0.833299732539797060, -0.833327372570668360, -0.833355010518221360, --0.833382646382386790, -0.833410280163095820, -0.833437911860279050, -0.833465541473867310, -0.833493169003792110, -0.833520794449983620, -0.833548417812373210, -0.833576039090891730, --0.833603658285470230, -0.833631275396039760, -0.833658890422530830, -0.833686503364874710, -0.833714114223002570, -0.833741722996844900, -0.833769329686332990, -0.833796934291397670, --0.833824536811970330, -0.833852137247981350, -0.833879735599362020, -0.833907331866043600, -0.833934926047956600, -0.833962518145032420, -0.833990108157201760, -0.834017696084395910, --0.834045281926546030, -0.834072865683582740, -0.834100447355437310, -0.834128026942040910, -0.834155604443324260, -0.834183179859218640, -0.834210753189654990, -0.834238324434564580, --0.834265893593878480, -0.834293460667527410, -0.834321025655442750, -0.834348588557555780, -0.834376149373797000, -0.834403708104097920, -0.834431264748389580, -0.834458819306603260, --0.834486371778669690, -0.834513922164520140, -0.834541470464086110, -0.834569016677298100, -0.834596560804087620, -0.834624102844385710, -0.834651642798123540, -0.834679180665232500, --0.834706716445643200, -0.834734250139287150, -0.834761781746095720, -0.834789311265999650, -0.834816838698930310, -0.834844364044818770, -0.834871887303596400, -0.834899408475194500, --0.834926927559543900, -0.834954444556576190, -0.834981959466222110, -0.835009472288413160, -0.835036983023080490, -0.835064491670155400, -0.835091998229569370, -0.835119502701253010, --0.835147005085137950, -0.835174505381155560, -0.835202003589236690, -0.835229499709312820, -0.835256993741315230, -0.835284485685175100, -0.835311975540824040, -0.835339463308192860, --0.835366948987212980, -0.835394432577815870, -0.835421914079932600, -0.835449393493494450, -0.835476870818432800, -0.835504346054679160, -0.835531819202164570, -0.835559290260820320, --0.835586759230578120, -0.835614226111368820, -0.835641690903123900, -0.835669153605774760, -0.835696614219252680, -0.835724072743489480, -0.835751529178415660, -0.835778983523963180, --0.835806435780063420, -0.835833885946647310, -0.835861334023646490, -0.835888780010992320, -0.835916223908616200, -0.835943665716449850, -0.835971105434423990, -0.835998543062470350, --0.836025978600520750, -0.836053412048505810, -0.836080843406357350, -0.836108272674006890, -0.836135699851385920, -0.836163124938425480, -0.836190547935057200, -0.836217968841212800, --0.836245387656823210, -0.836272804381820170, -0.836300219016135160, -0.836327631559699580, -0.836355042012445150, -0.836382450374302920, -0.836409856645204510, -0.836437260825081740, --0.836464662913865450, -0.836492062911487700, -0.836519460817879650, -0.836546856632973010, -0.836574250356699410, -0.836601641988990010, -0.836629031529776750, -0.836656418978990680, --0.836683804336563530, -0.836711187602426800, -0.836738568776512200, -0.836765947858751360, -0.836793324849075540, -0.836820699747416240, -0.836848072553705520, -0.836875443267874330, --0.836902811889854600, -0.836930178419577840, -0.836957542856975540, -0.836984905201979660, -0.837012265454521340, -0.837039623614532320, -0.837066979681944430, -0.837094333656688950, --0.837121685538697590, -0.837149035327901970, -0.837176383024234030, -0.837203728627624930, -0.837231072138006520, -0.837258413555310610, -0.837285752879468490, -0.837313090110411880, --0.837340425248072620, -0.837367758292382300, -0.837395089243272770, -0.837422418100675410, -0.837449744864521950, -0.837477069534744320, -0.837504392111273810, -0.837531712594042240, --0.837559030982981460, -0.837586347278023060, -0.837613661479099100, -0.837640973586140760, -0.837668283599079850, -0.837695591517848560, -0.837722897342378150, -0.837750201072600340, --0.837777502708447090, -0.837804802249850320, -0.837832099696741330, -0.837859395049052050, -0.837886688306714530, -0.837913979469660060, -0.837941268537820690, -0.837968555511128140, --0.837995840389514140, -0.838023123172910830, -0.838050403861249400, -0.838077682454462010, -0.838104958952480610, -0.838132233355236680, -0.838159505662662060, -0.838186775874688710, --0.838214043991248440, -0.838241310012273310, -0.838268573937694610, -0.838295835767444820, -0.838323095501455120, -0.838350353139657670, -0.838377608681984300, -0.838404862128367070, --0.838432113478737810, -0.838459362733028010, -0.838486609891169850, -0.838513854953095380, -0.838541097918735990, -0.838568338788023950, -0.838595577560890980, -0.838622814237269140, --0.838650048817090490, -0.838677281300286400, -0.838704511686789170, -0.838731739976530940, -0.838758966169443120, -0.838786190265457860, -0.838813412264507010, -0.838840632166523050, --0.838867849971437150, -0.838895065679181710, -0.838922279289688770, -0.838949490802889940, -0.838976700218717400, -0.839003907537103080, -0.839031112757978930, -0.839058315881277330, --0.839085516906929670, -0.839112715834868240, -0.839139912665025190, -0.839167107397332130, -0.839194300031721350, -0.839221490568124890, -0.839248679006474600, -0.839275865346702840, --0.839303049588741250, -0.839330231732522190, -0.839357411777977400, -0.839384589725039040, -0.839411765573639170, -0.839438939323709940, -0.839466110975183640, -0.839493280527991770, --0.839520447982066600, -0.839547613337340740, -0.839574776593745460, -0.839601937751213280, -0.839629096809676350, -0.839656253769066610, -0.839683408629316450, -0.839710561390357490, --0.839737712052122220, -0.839764860614542810, -0.839792007077551080, -0.839819151441079330, -0.839846293705059700, -0.839873433869424590, -0.839900571934105610, -0.839927707899035260, --0.839954841764145810, -0.839981973529369100, -0.840009103194637400, -0.840036230759882980, -0.840063356225037920, -0.840090479590034690, -0.840117600854805140, -0.840144720019281530, --0.840171837083396380, -0.840198952047081280, -0.840226064910268970, -0.840253175672891370, -0.840280284334880890, -0.840307390896170010, -0.840334495356690250, -0.840361597716374310, --0.840388697975154700, -0.840415796132963020, -0.840442892189731890, -0.840469986145393590, -0.840497077999880490, -0.840524167753124440, -0.840551255405058040, -0.840578340955613680, --0.840605424404723190, -0.840632505752319180, -0.840659584998333930, -0.840686662142699710, -0.840713737185349030, -0.840740810126213820, -0.840767880965226590, -0.840794949702319940, --0.840822016337425590, -0.840849080870476160, -0.840876143301404140, -0.840903203630141700, -0.840930261856621560, -0.840957317980775440, -0.840984372002536280, -0.841011423921836030, --0.841038473738607180, -0.841065521452782020, -0.841092567064293250, -0.841119610573073160, -0.841146651979053920, -0.841173691282168010, -0.841200728482348060, -0.841227763579526000, --0.841254796573634670, -0.841281827464606340, -0.841308856252373390, -0.841335882936868560, -0.841362907518023670, -0.841389929995771670, -0.841416950370045050, -0.841443968640775750, --0.841470984807896620, -0.841497998871339910, -0.841525010831038260, -0.841552020686924360, -0.841579028438930180, -0.841606034086988640, -0.841633037631031700, -0.841660039070992290, --0.841687038406802700, -0.841714035638395530, -0.841741030765703280, -0.841768023788658670, -0.841795014707194090, -0.841822003521241590, -0.841848990230734230, -0.841875974835604280, --0.841902957335784460, -0.841929937731207280, -0.841956916021805450, -0.841983892207511020, -0.842010866288257160, -0.842037838263975940, -0.842064808134600050, -0.842091775900062120, --0.842118741560294870, -0.842145705115230680, -0.842172666564802500, -0.842199625908942370, -0.842226583147583470, -0.842253538280657850, -0.842280491308098340, -0.842307442229837670, --0.842334391045808430, -0.842361337755943350, -0.842388282360174710, -0.842415224858435670, -0.842442165250658290, -0.842469103536775510, -0.842496039716719940, -0.842522973790424290, --0.842549905757821180, -0.842576835618843560, -0.842603763373423580, -0.842630689021494520, -0.842657612562988430, -0.842684533997838270, -0.842711453325976860, -0.842738370547336800, --0.842765285661850830, -0.842792198669451880, -0.842819109570072110, -0.842846018363644920, -0.842872925050102360, -0.842899829629377480, -0.842926732101403120, -0.842953632466111880, --0.842980530723436820, -0.843007426873310100, -0.843034320915665210, -0.843061212850434120, -0.843088102677550080, -0.843114990396945820, -0.843141876008553950, -0.843168759512307520, --0.843195640908139370, -0.843222520195981980, -0.843249397375768430, -0.843276272447431200, -0.843303145410903230, -0.843330016266117370, -0.843356885013006540, -0.843383751651503480, --0.843410616181541340, -0.843437478603052520, -0.843464338915969840, -0.843491197120226350, -0.843518053215754790, -0.843544907202488200, -0.843571759080359310, -0.843598608849301160, --0.843625456509246360, -0.843652302060128090, -0.843679145501878950, -0.843705986834431760, -0.843732826057719710, -0.843759663171675610, -0.843786498176232410, -0.843813331071323060, --0.843840161856880160, -0.843866990532837200, -0.843893817099126480, -0.843920641555681250, -0.843947463902434250, -0.843974284139318740, -0.844001102266267790, -0.844027918283213770, --0.844054732190090200, -0.844081543986829550, -0.844108353673365120, -0.844135161249629730, -0.844161966715556430, -0.844188770071078290, -0.844215571316128340, -0.844242370450639320, --0.844269167474544610, -0.844295962387776710, -0.844322755190268890, -0.844349545881954210, -0.844376334462765720, -0.844403120932636360, -0.844429905291499420, -0.844456687539287380, --0.844483467675933960, -0.844510245701371680, -0.844537021615533680, -0.844563795418353250, -0.844590567109763210, -0.844617336689697070, -0.844644104158087330, -0.844670869514867580, --0.844697632759970340, -0.844724393893329100, -0.844751152914876900, -0.844777909824546700, -0.844804664622271880, -0.844831417307985500, -0.844858167881620380, -0.844884916343110140, --0.844911662692387270, -0.844938406929385270, -0.844965149054037300, -0.844991889066276540, -0.845018626966035910, -0.845045362753249040, -0.845072096427848640, -0.845098827989767880, --0.845125557438940020, -0.845152284775298250, -0.845179009998775820, -0.845205733109305800, -0.845232454106821680, -0.845259172991256190, -0.845285889762543040, -0.845312604420614950, --0.845339316965405320, -0.845366027396847410, -0.845392735714874390, -0.845419441919419530, -0.845446146010416340, -0.845472847987797650, -0.845499547851496950, -0.845526245601447180, --0.845552941237581730, -0.845579634759834000, -0.845606326168137130, -0.845633015462424750, -0.845659702642629570, -0.845686387708685320, -0.845713070660524920, -0.845739751498081780, --0.845766430221289390, -0.845793106830080800, -0.845819781324389510, -0.845846453704149010, -0.845873123969292040, -0.845899792119752640, -0.845926458155463410, -0.845953122076358090, --0.845979783882369940, -0.846006443573432350, -0.846033101149478610, -0.846059756610442410, -0.846086409956256610, -0.846113061186854920, -0.846139710302170390, -0.846166357302136630, --0.846193002186686920, -0.846219644955754750, -0.846246285609273620, -0.846272924147176590, -0.846299560569397480, -0.846326194875869240, -0.846352827066525590, -0.846379457141299810, --0.846406085100125270, -0.846432710942935710, -0.846459334669664500, -0.846485956280244700, -0.846512575774610370, -0.846539193152694210, -0.846565808414430190, -0.846592421559751560, --0.846619032588591950, -0.846645641500884950, -0.846672248296563620, -0.846698852975561910, -0.846725455537812870, -0.846752055983250100, -0.846778654311807210, -0.846805250523417710, --0.846831844618015190, -0.846858436595533170, -0.846885026455904800, -0.846911614199064130, -0.846938199824944230, -0.846964783333478800, -0.846991364724601460, -0.847017943998245700, --0.847044521154345030, -0.847071096192833270, -0.847097669113643590, -0.847124239916709930, -0.847150808601965450, -0.847177375169343990, -0.847203939618779160, -0.847230501950204330, --0.847257062163553560, -0.847283620258759810, -0.847310176235757330, -0.847336730094479180, -0.847363281834859210, -0.847389831456831000, -0.847416378960328180, -0.847442924345284450, --0.847469467611633660, -0.847496008759308970, -0.847522547788244540, -0.847549084698373420, -0.847575619489629560, -0.847602152161946790, -0.847628682715258490, -0.847655211149498600, --0.847681737464600850, -0.847708261660498510, -0.847734783737125850, -0.847761303694415820, -0.847787821532302700, -0.847814337250719970, -0.847840850849601370, -0.847867362328880940, --0.847893871688491840, -0.847920378928368250, -0.847946884048443540, -0.847973387048651550, -0.847999887928926110, -0.848026386689201050, -0.848052883329409870, -0.848079377849486840, --0.848105870249365120, -0.848132360528978890, -0.848158848688261520, -0.848185334727147190, -0.848211818645569380, -0.848238300443462050, -0.848264780120759230, -0.848291257677394110, --0.848317733113301160, -0.848344206428413680, -0.848370677622665600, -0.848397146695990980, -0.848423613648323420, -0.848450078479596750, -0.848476541189745140, -0.848503001778702080, --0.848529460246401520, -0.848555916592777290, -0.848582370817763110, -0.848608822921293140, -0.848635272903300990, -0.848661720763720710, -0.848688166502486350, -0.848714610119531420, --0.848741051614790190, -0.848767490988196040, -0.848793928239683140, -0.848820363369185430, -0.848846796376636850, -0.848873227261971450, -0.848899656025122850, -0.848926082666025210, --0.848952507184612240, -0.848978929580818000, -0.849005349854576320, -0.849031768005821360, -0.849058184034486960, -0.849084597940507390, -0.849111009723816030, -0.849137419384347390, --0.849163826922034960, -0.849190232336813010, -0.849216635628615490, -0.849243036797376340, -0.849269435843029610, -0.849295832765509460, -0.849322227564749840, -0.849348620240684250, --0.849375010793247290, -0.849401399222372680, -0.849427785527994690, -0.849454169710047170, -0.849480551768464380, -0.849506931703180150, -0.849533309514128640, -0.849559685201243700, --0.849586058764459580, -0.849612430203710360, -0.849638799518929950, -0.849665166710052660, -0.849691531777012620, -0.849717894719743460, -0.849744255538179890, -0.849770614232255420, --0.849796970801904420, -0.849823325247060950, -0.849849677567659170, -0.849876027763633470, -0.849902375834917460, -0.849928721781445740, -0.849955065603152040, -0.849981407299970630, --0.850007746871835670, -0.850034084318681330, -0.850060419640441770, -0.850086752837051480, -0.850113083908444090, -0.850139412854554080, -0.850165739675315390, -0.850192064370662410, --0.850218386940529200, -0.850244707384850030, -0.850271025703559060, -0.850297341896590900, -0.850323655963878930, -0.850349967905358220, -0.850376277720962360, -0.850402585410625740, --0.850428890974282650, -0.850455194411867340, -0.850481495723314330, -0.850507794908557320, -0.850534091967531050, -0.850560386900169330, -0.850586679706406560, -0.850612970386177230, --0.850639258939415390, -0.850665545366055430, -0.850691829666031850, -0.850718111839278370, -0.850744391885729920, -0.850770669805320230, -0.850796945597983910, -0.850823219263655230, --0.850849490802268460, -0.850875760213757990, -0.850902027498058320, -0.850928292655103610, -0.850954555684828030, -0.850980816587165960, -0.851007075362051780, -0.851033332009420000, --0.851059586529204880, -0.851085838921341040, -0.851112089185762310, -0.851138337322403630, -0.851164583331198930, -0.851190827212082720, -0.851217068964989390, -0.851243308589853420, --0.851269546086609210, -0.851295781455191360, -0.851322014695533810, -0.851348245807571510, -0.851374474791238290, -0.851400701646468970, -0.851426926373197830, -0.851453148971359370, --0.851479369440888310, -0.851505587781718590, -0.851531803993785030, -0.851558018077021810, -0.851584230031363630, -0.851610439856744780, -0.851636647553099760, -0.851662853120363270, --0.851689056558469830, -0.851715257867353470, -0.851741457046949260, -0.851767654097191130, -0.851793849018013920, -0.851820041809352000, -0.851846232471140000, -0.851872421003312510, --0.851898607405804030, -0.851924791678548950, -0.851950973821482100, -0.851977153834537540, -0.852003331717650080, -0.852029507470754340, -0.852055681093784820, -0.852081852586676350, --0.852108021949362970, -0.852134189181779860, -0.852160354283860940, -0.852186517255541180, -0.852212678096755050, -0.852238836807437390, -0.852264993387522480, -0.852291147836945370, --0.852317300155640220, -0.852343450343541980, -0.852369598400584900, -0.852395744326703840, -0.852421888121833390, -0.852448029785908280, -0.852474169318863110, -0.852500306720632710, --0.852526441991151460, -0.852552575130353980, -0.852578706138174990, -0.852604835014549310, -0.852630961759411440, -0.852657086372696220, -0.852683208854338570, -0.852709329204272560, --0.852735447422433570, -0.852761563508755650, -0.852787677463173850, -0.852813789285622900, -0.852839898976037400, -0.852866006534352180, -0.852892111960502300, -0.852918215254421690, --0.852944316416045960, -0.852970415445309050, -0.852996512342146240, -0.853022607106492030, -0.853048699738281350, -0.853074790237449250, -0.853100878603929800, -0.853126964837658490, --0.853153048938569470, -0.853179130906597800, -0.853205210741678320, -0.853231288443745850, -0.853257364012735220, -0.853283437448581370, -0.853309508751218580, -0.853335577920582460, --0.853361644956607050, -0.853387709859227410, -0.853413772628378700, -0.853439833263995420, -0.853465891766012620, -0.853491948134365350, -0.853518002368987890, -0.853544054469815740, --0.853570104436783160, -0.853596152269825330, -0.853622197968877170, -0.853648241533873420, -0.853674282964749340, -0.853700322261439330, -0.853726359423878760, -0.853752394452002130, --0.853778427345744380, -0.853804458105040690, -0.853830486729825750, -0.853856513220034640, -0.853882537575602510, -0.853908559796463740, -0.853934579882553830, -0.853960597833807180, --0.853986613650159150, -0.854012627331544480, -0.854038638877898330, -0.854064648289155740, -0.854090655565251320, -0.854116660706120580, -0.854142663711697890, -0.854168664581918420, --0.854194663316717450, -0.854220659916029800, -0.854246654379790420, -0.854272646707934790, -0.854298636900397200, -0.854324624957113250, -0.854350610878017450, -0.854376594663045270, --0.854402576312131460, -0.854428555825211270, -0.854454533202219760, -0.854480508443092090, -0.854506481547762880, -0.854532452516167720, -0.854558421348241230, -0.854584388043918670, --0.854610352603135110, -0.854636315025825710, -0.854662275311925730, -0.854688233461369910, -0.854714189474093610, -0.854740143350031680, -0.854766095089119380, -0.854792044691291890, --0.854817992156484240, -0.854843937484631610, -0.854869880675669380, -0.854895821729532160, -0.854921760646155660, -0.854947697425474500, -0.854973632067424160, -0.854999564571939710, --0.855025494938956410, -0.855051423168409320, -0.855077349260233820, -0.855103273214364860, -0.855129195030737810, -0.855155114709287620, -0.855181032249949680, -0.855206947652659030, --0.855232860917351180, -0.855258772043961280, -0.855284681032424280, -0.855310587882675780, -0.855336492594650610, -0.855362395168284160, -0.855388295603511710, -0.855414193900268630, --0.855440090058489980, -0.855465984078111360, -0.855491875959067620, -0.855517765701294230, -0.855543653304726370, -0.855569538769299310, -0.855595422094948430, -0.855621303281608900, --0.855647182329216440, -0.855673059237705870, -0.855698934007012690, -0.855724806637072070, -0.855750677127819380, -0.855776545479190130, -0.855802411691119370, -0.855828275763542590, --0.855854137696395400, -0.855879997489612630, -0.855905855143130110, -0.855931710656882670, -0.855957564030806030, -0.855983415264835350, -0.856009264358906230, -0.856035111312953960, --0.856060956126914130, -0.856086798800721690, -0.856112639334312480, -0.856138477727621420, -0.856164313980584120, -0.856190148093136090, -0.856215980065212710, -0.856241809896749580, --0.856267637587681650, -0.856293463137944970, -0.856319286547474360, -0.856345107816205430, -0.856370926944073910, -0.856396743931014950, -0.856422558776964160, -0.856448371481857150, --0.856474182045629080, -0.856499990468215680, -0.856525796749552200, -0.856551600889574160, -0.856577402888217150, -0.856603202745416570, -0.856629000461108010, -0.856654796035227210, --0.856680589467709310, -0.856706380758489820, -0.856732169907504340, -0.856757956914688480, -0.856783741779977740, -0.856809524503307610, -0.856835305084613810, -0.856861083523831610, --0.856886859820896960, -0.856912633975744910, -0.856938405988311280, -0.856964175858531570, -0.856989943586341510, -0.857015709171676470, -0.857041472614472500, -0.857067233914664550, --0.857092993072188780, -0.857118750086980240, -0.857144504958974980, -0.857170257688108280, -0.857196008274316080, -0.857221756717533980, -0.857247503017697370, -0.857273247174742070, --0.857298989188603590, -0.857324729059217530, -0.857350466786519720, -0.857376202370445650, -0.857401935810931160, -0.857427667107912070, -0.857453396261323550, -0.857479123271101760, --0.857504848137181860, -0.857530570859500020, -0.857556291437991610, -0.857582009872592480, -0.857607726163238330, -0.857633440309865210, -0.857659152312408080, -0.857684862170803420, --0.857710569884986400, -0.857736275454892840, -0.857761978880458690, -0.857787680161619550, -0.857813379298311470, -0.857839076290469630, -0.857864771138030390, -0.857890463840929040, --0.857916154399101520, -0.857941842812483530, -0.857967529081010930, -0.857993213204619630, -0.858018895183245480, -0.858044575016823850, -0.858070252705290910, -0.858095928248582270, --0.858121601646633760, -0.858147272899381200, -0.858172942006760420, -0.858198608968707370, -0.858224273785158090, -0.858249936456047970, -0.858275596981312840, -0.858301255360888750, --0.858326911594711530, -0.858352565682717010, -0.858378217624841120, -0.858403867421019820, -0.858429515071188700, -0.858455160575283930, -0.858480803933241110, -0.858506445144996300, --0.858532084210485320, -0.858557721129644120, -0.858583355902408640, -0.858608988528715030, -0.858634619008498690, -0.858660247341695990, -0.858685873528242550, -0.858711497568074410, --0.858737119461127410, -0.858762739207337700, -0.858788356806641340, -0.858813972258973930, -0.858839585564271760, -0.858865196722470410, -0.858890805733506070, -0.858916412597314660, --0.858942017313832350, -0.858967619882994860, -0.858993220304738680, -0.859018818578999090, -0.859044414705712690, -0.859070008684815090, -0.859095600516242450, -0.859121190199930830, --0.859146777735816270, -0.859172363123834710, -0.859197946363922440, -0.859223527456015160, -0.859249106400049150, -0.859274683195960230, -0.859300257843684690, -0.859325830343158350, --0.859351400694317590, -0.859376968897098470, -0.859402534951436700, -0.859428098857268790, -0.859453660614530430, -0.859479220223157920, -0.859504777683087420, -0.859530332994254850, --0.859555886156596620, -0.859581437170048760, -0.859606986034547100, -0.859632532750028270, -0.859658077316427850, -0.859683619733682240, -0.859709160001727590, -0.859734698120499960, --0.859760234089935630, -0.859785767909970970, -0.859811299580541920, -0.859836829101584320, -0.859862356473034660, -0.859887881694829210, -0.859913404766903920, -0.859938925689195170, --0.859964444461639330, -0.859989961084172250, -0.860015475556730300, -0.860040987879249540, -0.860066498051666350, -0.860092006073916890, -0.860117511945937440, -0.860143015667664160, --0.860168517239033540, -0.860194016659981520, -0.860219513930444490, -0.860245009050358610, -0.860270502019660150, -0.860295992838285510, -0.860321481506170830, -0.860346968023252610, --0.860372452389466800, -0.860397934604750110, -0.860423414669038380, -0.860448892582267980, -0.860474368344375520, -0.860499841955297050, -0.860525313414968960, -0.860550782723327860, --0.860576249880309560, -0.860601714885850800, -0.860627177739887620, -0.860652638442356510, -0.860678096993193640, -0.860703553392335730, -0.860729007639718820, -0.860754459735279640, --0.860779909678954120, -0.860805357470678990, -0.860830803110390290, -0.860856246598024620, -0.860881687933518270, -0.860907127116807720, -0.860932564147829480, -0.860957999026519700, --0.860983431752815220, -0.861008862326651860, -0.861034290747966340, -0.861059717016695040, -0.861085141132774570, -0.861110563096141090, -0.861135982906731550, -0.861161400564481870, --0.861186816069328790, -0.861212229421208560, -0.861237640620057700, -0.861263049665812690, -0.861288456558410130, -0.861313861297786310, -0.861339263883878160, -0.861364664316621840, --0.861390062595953740, -0.861415458721810360, -0.861440852694128290, -0.861466244512844150, -0.861491634177894430, -0.861517021689215850, -0.861542407046744450, -0.861567790250417300, --0.861593171300170440, -0.861618550195940580, -0.861643926937664450, -0.861669301525278430, -0.861694673958719130, -0.861720044237923480, -0.861745412362827420, -0.861770778333368010, --0.861796142149481530, -0.861821503811104670, -0.861846863318174060, -0.861872220670626190, -0.861897575868398100, -0.861922928911425860, -0.861948279799646390, -0.861973628532996190, --0.861998975111411770, -0.862024319534829940, -0.862049661803187320, -0.862075001916420610, -0.862100339874466550, -0.862125675677261390, -0.862151009324742310, -0.862176340816845470, --0.862201670153507790, -0.862226997334666010, -0.862252322360256620, -0.862277645230216440, -0.862302965944482410, -0.862328284502990710, -0.862353600905678590, -0.862378915152482220, --0.862404227243338430, -0.862429537178184270, -0.862454844956956120, -0.862480150579591150, -0.862505454046025630, -0.862530755356196610, -0.862556054510040470, -0.862581351507494270, --0.862606646348494600, -0.862631939032978410, -0.862657229560882310, -0.862682517932143340, -0.862707804146697900, -0.862733088204483240, -0.862758370105435550, -0.862783649849491960, --0.862808927436589210, -0.862834202866664120, -0.862859476139653860, -0.862884747255494580, -0.862910016214123670, -0.862935283015477510, -0.862960547659493150, -0.862985810146107420, --0.863011070475257270, -0.863036328646879290, -0.863061584660910760, -0.863086838517288070, -0.863112090215948480, -0.863137339756828490, -0.863162587139865050, -0.863187832364995190, --0.863213075432155860, -0.863238316341283670, -0.863263555092316000, -0.863288791685189240, -0.863314026119840650, -0.863339258396206840, -0.863364488514224870, -0.863389716473831670, --0.863414942274964180, -0.863440165917559570, -0.863465387401554320, -0.863490606726885820, -0.863515823893490580, -0.863541038901305740, -0.863566251750268350, -0.863591462440315260, --0.863616670971383620, -0.863641877343410470, -0.863667081556332430, -0.863692283610086880, -0.863717483504610420, -0.863742681239840220, -0.863767876815713320, -0.863793070232166780, --0.863818261489137540, -0.863843450586562870, -0.863868637524379590, -0.863893822302524430, -0.863919004920934760, -0.863944185379547540, -0.863969363678299910, -0.863994539817128810, --0.864019713795971640, -0.864044885614765000, -0.864070055273446270, -0.864095222771952280, -0.864120388110220180, -0.864145551288187150, -0.864170712305790120, -0.864195871162966480, --0.864221027859653270, -0.864246182395787320, -0.864271334771306020, -0.864296484986146310, -0.864321633040245340, -0.864346778933540280, -0.864371922665968300, -0.864397064237466650, --0.864422203647972180, -0.864447340897422480, -0.864472475985754050, -0.864497608912904610, -0.864522739678811100, -0.864547868283410680, -0.864572994726640620, -0.864598119008438300, --0.864623241128740450, -0.864648361087484660, -0.864673478884607880, -0.864698594520047270, -0.864723707993740210, -0.864748819305623970, -0.864773928455635610, -0.864799035443712620, --0.864824140269791930, -0.864849242933811050, -0.864874343435706790, -0.864899441775416670, -0.864924537952878050, -0.864949631968027990, -0.864974723820804090, -0.864999813511143190, --0.865024901038983000, -0.865049986404260340, -0.865075069606912610, -0.865100150646877290, -0.865125229524091540, -0.865150306238492760, -0.865175380790018430, -0.865200453178605500, --0.865225523404191570, -0.865250591466713570, -0.865275657366109120, -0.865300721102315600, -0.865325782675270270, -0.865350842084910420, -0.865375899331173760, -0.865400954413997230, --0.865426007333318200, -0.865451058089074080, -0.865476106681202450, -0.865501153109640380, -0.865526197374325570, -0.865551239475195410, -0.865576279412186960, -0.865601317185238030, --0.865626352794285570, -0.865651386239267180, -0.865676417520120370, -0.865701446636782500, -0.865726473589191080, -0.865751498377283710, -0.865776521000997330, -0.865801541460269770, --0.865826559755038190, -0.865851575885240310, -0.865876589850813390, -0.865901601651695050, -0.865926611287822890, -0.865951618759134070, -0.865976624065566300, -0.866001627207056870, --0.866026628183543260, -0.866051626994963190, -0.866076623641253930, -0.866101618122353200, -0.866126610438198610, -0.866151600588727310, -0.866176588573877140, -0.866201574393585360, --0.866226558047789700, -0.866251539536427530, -0.866276518859436570, -0.866301496016754210, -0.866326471008318500, -0.866351443834066260, -0.866376414493935650, -0.866401382987863840, --0.866426349315788550, -0.866451313477647370, -0.866476275473377910, -0.866501235302918000, -0.866526192966204810, -0.866551148463176270, -0.866576101793769760, -0.866601052957922890, --0.866626001955573380, -0.866650948786658940, -0.866675893451117170, -0.866700835948885810, -0.866725776279902100, -0.866750714444104230, -0.866775650441429350, -0.866800584271815280, --0.866825515935199850, -0.866850445431520570, -0.866875372760715250, -0.866900297922721610, -0.866925220917477260, -0.866950141744919690, -0.866975060404986730, -0.866999976897616100, --0.867024891222745510, -0.867049803380312790, -0.867074713370255660, -0.867099621192511600, -0.867124526847018680, -0.867149430333714280, -0.867174331652536210, -0.867199230803422430, --0.867224127786310530, -0.867249022601138230, -0.867273915247843700, -0.867298805726364090, -0.867323694036637670, -0.867348580178601950, -0.867373464152194630, -0.867398345957353660, --0.867423225594016860, -0.867448103062122280, -0.867472978361607080, -0.867497851492409770, -0.867522722454467600, -0.867547591247718520, -0.867572457872100580, -0.867597322327551380, --0.867622184614008970, -0.867647044731411300, -0.867671902679695850, -0.867696758458800790, -0.867721612068663610, -0.867746463509222470, -0.867771312780415080, -0.867796159882179400, --0.867821004814453460, -0.867845847577175090, -0.867870688170281900, -0.867895526593712270, -0.867920362847403590, -0.867945196931294020, -0.867970028845321370, -0.867994858589423710, --0.868019686163539190, -0.868044511567605090, -0.868069334801560010, -0.868094155865341440, -0.868118974758887330, -0.868143791482135940, -0.868168606035024990, -0.868193418417492540, --0.868218228629476730, -0.868243036670915180, -0.868267842541746270, -0.868292646241907500, -0.868317447771337130, -0.868342247129973100, -0.868367044317753470, -0.868391839334616170, --0.868416632180499580, -0.868441422855341430, -0.868466211359079420, -0.868490997691651940, -0.868515781852996940, -0.868540563843052560, -0.868565343661756640, -0.868590121309047670, --0.868614896784863140, -0.868639670089141670, -0.868664441221820630, -0.868689210182838620, -0.868713976972133590, -0.868738741589643590, -0.868763504035306780, -0.868788264309061310, --0.868813022410845020, -0.868837778340596500, -0.868862532098253150, -0.868887283683753560, -0.868912033097035800, -0.868936780338037900, -0.868961525406698240, -0.868986268302954560, --0.869011009026745440, -0.869035747578008610, -0.869060483956682450, -0.869085218162705010, -0.869109950196014560, -0.869134680056549150, -0.869159407744247380, -0.869184133259046750, --0.869208856600886090, -0.869233577769703000, -0.869258296765436090, -0.869283013588023290, -0.869307728237403100, -0.869332440713513450, -0.869357151016293070, -0.869381859145679450, --0.869406565101611520, -0.869431268884026890, -0.869455970492864050, -0.869480669928061390, -0.869505367189556950, -0.869530062277289350, -0.869554755191196400, -0.869579445931216830, --0.869604134497288350, -0.869628820889349560, -0.869653505107338630, -0.869678187151194050, -0.869702867020853980, -0.869727544716256910, -0.869752220237340890, -0.869776893584044420, --0.869801564756305550, -0.869826233754062650, -0.869850900577254340, -0.869875565225818660, -0.869900227699694330, -0.869924887998819170, -0.869949546123132130, -0.869974202072570920, --0.869998855847074150, -0.870023507446580300, -0.870048156871027660, -0.870072804120354700, -0.870097449194499940, -0.870122092093401190, -0.870146732816997610, -0.870171371365226930, --0.870196007738027740, -0.870220641935338660, -0.870245273957097830, -0.870269903803243870, -0.870294531473715490, -0.870319156968450410, -0.870343780287387680, -0.870368401430465340, --0.870393020397622010, -0.870417637188796060, -0.870442251803925980, -0.870466864242950610, -0.870491474505807770, -0.870516082592436510, -0.870540688502774770, -0.870565292236761380, --0.870589893794334710, -0.870614493175433380, -0.870639090379995760, -0.870663685407960690, -0.870688278259266090, -0.870712868933851030, -0.870737457431653650, -0.870762043752612570, --0.870786627896666390, -0.870811209863753710, -0.870835789653812920, -0.870860367266782840, -0.870884942702601970, -0.870909515961208470, -0.870934087042541160, -0.870958655946538650, --0.870983222673139430, -0.871007787222282230, -0.871032349593905740, -0.871056909787948250, -0.871081467804348590, -0.871106023643045120, -0.871130577303976580, -0.871155128787081570, --0.871179678092298680, -0.871204225219566750, -0.871228770168824380, -0.871253312940009850, -0.871277853533062310, -0.871302391947919920, -0.871326928184521510, -0.871351462242805800, --0.871375994122711380, -0.871400523824177210, -0.871425051347141540, -0.871449576691543440, -0.871474099857321270, -0.871498620844413760, -0.871523139652759740, -0.871547656282297800, --0.871572170732966780, -0.871596683004705610, -0.871621193097452450, -0.871645701011146470, -0.871670206745726150, -0.871694710301130220, -0.871719211677297490, -0.871743710874166800, --0.871768207891676750, -0.871792702729766500, -0.871817195388374210, -0.871841685867439150, -0.871866174166899710, -0.871890660286694820, -0.871915144226763310, -0.871939625987043890, --0.871964105567475610, -0.871988582967996860, -0.872013058188546910, -0.872037531229064020, -0.872062002089487360, -0.872086470769755650, -0.872110937269807820, -0.872135401589582580, --0.872159863729019100, -0.872184323688055760, -0.872208781466631830, -0.872233237064685700, -0.872257690482156510, -0.872282141718983110, -0.872306590775104310, -0.872331037650458940, --0.872355482344986390, -0.872379924858625030, -0.872404365191313590, -0.872428803342991330, -0.872453239313596970, -0.872477673103069670, -0.872502104711348040, -0.872526534138371450, --0.872550961384078280, -0.872575386448407820, -0.872599809331298880, -0.872624230032690300, -0.872648648552521110, -0.872673064890730380, -0.872697479047256920, -0.872721891022040010, --0.872746300815018140, -0.872770708426130800, -0.872795113855316380, -0.872819517102514260, -0.872843918167663380, -0.872868317050702560, -0.872892713751571290, -0.872917108270207960, --0.872941500606552070, -0.872965890760542210, -0.872990278732117650, -0.873014664521217340, -0.873039048127780440, -0.873063429551745980, -0.873087808793053030, -0.873112185851640410, --0.873136560727447500, -0.873160933420413010, -0.873185303930476220, -0.873209672257576060, -0.873234038401651810, -0.873258402362642410, -0.873282764140487220, -0.873307123735124980, --0.873331481146495060, -0.873355836374536290, -0.873380189419187940, -0.873404540280389050, -0.873428888958078800, -0.873453235452196550, -0.873477579762681030, -0.873501921889471840, --0.873526261832507590, -0.873550599591727650, -0.873574935167071190, -0.873599268558477360, -0.873623599765885440, -0.873647928789234810, -0.873672255628463960, -0.873696580283512820, --0.873720902754320020, -0.873745223040824910, -0.873769541142966680, -0.873793857060684690, -0.873818170793917990, -0.873842482342606200, -0.873866791706688130, -0.873891098886102840, --0.873915403880789810, -0.873939706690688320, -0.873964007315737530, -0.873988305755876720, -0.874012602011045360, -0.874036896081182290, -0.874061187966227230, -0.874085477666118880, --0.874109765180796860, -0.874134050510200540, -0.874158333654268980, -0.874182614612941670, -0.874206893386157980, -0.874231169973856860, -0.874255444375978020, -0.874279716592460400, --0.874303986623243490, -0.874328254468266560, -0.874352520127469000, -0.874376783600790410, -0.874401044888169610, -0.874425303989546320, -0.874449560904859700, -0.874473815634049130, --0.874498068177054000, -0.874522318533813680, -0.874546566704267560, -0.874570812688355350, -0.874595056486015760, -0.874619298097188860, -0.874643537521813450, -0.874667774759829150, --0.874692009811175450, -0.874716242675791730, -0.874740473353617490, -0.874764701844592100, -0.874788928148654830, -0.874813152265745520, -0.874837374195803100, -0.874861593938767170, --0.874885811494577340, -0.874910026863172870, -0.874934240044493610, -0.874958451038478580, -0.874982659845067510, -0.875006866464199670, -0.875031070895814670, -0.875055273139851990, --0.875079473196251120, -0.875103671064951570, -0.875127866745893050, -0.875152060239014600, -0.875176251544256270, -0.875200440661557110, -0.875224627590856840, -0.875248812332094950, --0.875272994885211040, -0.875297175250144720, -0.875321353426835590, -0.875345529415223140, -0.875369703215246650, -0.875393874826845830, -0.875418044249960390, -0.875442211484529830, --0.875466376530493750, -0.875490539387791870, -0.875514700056363560, -0.875538858536148660, -0.875563014827086320, -0.875587168929116480, -0.875611320842178740, -0.875635470566212710, --0.875659618101158000, -0.875683763446954420, -0.875707906603541250, -0.875732047570858540, -0.875756186348845560, -0.875780322937442010, -0.875804457336587630, -0.875828589546222220, --0.875852719566285520, -0.875876847396716780, -0.875900973037456070, -0.875925096488442860, -0.875949217749616760, -0.875973336820917710, -0.875997453702285320, -0.876021568393659190, --0.876045680894979470, -0.876069791206185330, -0.876093899327216820, -0.876118005258013420, -0.876142108998515080, -0.876166210548661390, -0.876190309908392200, -0.876214407077647190, --0.876238502056366440, -0.876262594844489100, -0.876286685441955650, -0.876310773848705150, -0.876334860064677760, -0.876358944089813190, -0.876383025924051260, -0.876407105567332030, --0.876431183019594880, -0.876455258280779860, -0.876479331350826560, -0.876503402229674930, -0.876527470917264680, -0.876551537413535860, -0.876575601718428190, -0.876599663831881700, --0.876623723753835900, -0.876647781484230950, -0.876671837023006330, -0.876695890370102090, -0.876719941525458180, -0.876743990489014410, -0.876768037260710840, -0.876792081840487070, --0.876816124228283260, -0.876840164424038890, -0.876864202427694140, -0.876888238239188820, -0.876912271858462990, -0.876936303285456350, -0.876960332520109300, -0.876984359562361200, --0.877008384412152340, -0.877032407069422320, -0.877056427534111280, -0.877080445806159180, -0.877104461885506060, -0.877128475772091630, -0.877152487465856390, -0.877176496966739610, --0.877200504274681770, -0.877224509389622490, -0.877248512311502030, -0.877272513040260220, -0.877296511575837100, -0.877320507918172950, -0.877344502067207270, -0.877368494022880640, --0.877392483785132460, -0.877416471353903100, -0.877440456729132620, -0.877464439910760950, -0.877488420898728140, -0.877512399692974570, -0.877536376293439720, -0.877560350700064220, --0.877584322912787650, -0.877608292931550180, -0.877632260756291970, -0.877656226386953180, -0.877680189823473840, -0.877704151065794140, -0.877728110113853880, -0.877752066967593560, --0.877776021626952900, -0.877799974091872160, -0.877823924362291510, -0.877847872438151100, -0.877871818319391100, -0.877895762005951430, -0.877919703497772490, -0.877943642794794200, --0.877967579896956730, -0.877991514804200230, -0.878015447516464990, -0.878039378033691250, -0.878063306355819200, -0.878087232482788640, -0.878111156414540180, -0.878135078151013770, --0.878158997692149560, -0.878182915037887810, -0.878206830188168810, -0.878230743142933030, -0.878254653902120100, -0.878278562465670710, -0.878302468833524810, -0.878326373005622660, --0.878350274981904540, -0.878374174762310830, -0.878398072346781690, -0.878421967735257490, -0.878445860927678180, -0.878469751923984470, -0.878493640724116180, -0.878517527328013800, --0.878541411735617510, -0.878565293946867780, -0.878589173961704770, -0.878613051780069100, -0.878636927401900470, -0.878660800827139820, -0.878684672055726980, -0.878708541087602430, --0.878732407922706460, -0.878756272560979550, -0.878780135002362180, -0.878803995246794200, -0.878827853294216530, -0.878851709144568890, -0.878875562797792110, -0.878899414253826340, --0.878923263512612070, -0.878947110574089590, -0.878970955438199590, -0.878994798104882010, -0.879018638574077580, -0.879042476845726450, -0.879066312919769000, -0.879090146796145830, --0.879113978474797330, -0.879137807955663870, -0.879161635238686070, -0.879185460323804180, -0.879209283210958480, -0.879233103900089460, -0.879256922391137730, -0.879280738684043770, --0.879304552778747860, -0.879328364675190930, -0.879352174373312700, -0.879375981873054320, -0.879399787174355850, -0.879423590277157770, -0.879447391181400810, -0.879471189887025330, --0.879494986393971940, -0.879518780702181260, -0.879542572811593430, -0.879566362722149280, -0.879590150433789190, -0.879613935946453540, -0.879637719260083160, -0.879661500374618430, --0.879685279290000180, -0.879709056006168550, -0.879732830523064500, -0.879756602840628180, -0.879780372958800290, -0.879804140877521460, -0.879827906596732270, -0.879851670116373330, --0.879875431436385470, -0.879899190556708840, -0.879922947477284390, -0.879946702198052380, -0.879970454718953630, -0.879994205039928650, -0.880017953160918240, -0.880041699081862920, --0.880065442802703600, -0.880089184323380460, -0.880112923643834530, -0.880136660764006100, -0.880160395683835970, -0.880184128403264990, -0.880207858922233520, -0.880231587240682730, --0.880255313358552780, -0.880279037275784710, -0.880302758992318800, -0.880326478508095980, -0.880350195823057070, -0.880373910937142570, -0.880397623850293300, -0.880421334562450310, --0.880445043073553650, -0.880468749383544580, -0.880492453492363490, -0.880516155399951210, -0.880539855106248550, -0.880563552611196340, -0.880587247914735190, -0.880610941016806150, --0.880634631917349700, -0.880658320616306440, -0.880682007113617440, -0.880705691409223500, -0.880729373503065240, -0.880753053395083580, -0.880776731085219480, -0.880800406573413300, --0.880824079859606310, -0.880847750943739020, -0.880871419825752230, -0.880895086505587010, -0.880918750983183950, -0.880942413258484100, -0.880966073331428400, -0.880989731201957340, --0.881013386870012070, -0.881037040335533210, -0.881060691598461680, -0.881084340658738530, -0.881107987516304370, -0.881131632171100580, -0.881155274623067530, -0.881178914872146390, --0.881202552918277760, -0.881226188761402800, -0.881249822401462430, -0.881273453838397390, -0.881297083072148710, -0.881320710102657670, -0.881344334929864530, -0.881367957553710780, --0.881391577974136920, -0.881415196191084100, -0.881438812204493380, -0.881462426014305580, -0.881486037620461740, -0.881509647022902910, -0.881533254221569810, -0.881556859216403810, --0.881580462007345520, -0.881604062594335990, -0.881627660977316260, -0.881651257156227500, -0.881674851131010740, -0.881698442901606590, -0.881722032467956550, -0.881745619830001330, --0.881769204987681960, -0.881792787940939630, -0.881816368689715360, -0.881839947233950090, -0.881863523573585220, -0.881887097708561220, -0.881910669638819810, -0.881934239364301490, --0.881957806884947510, -0.881981372200699170, -0.882004935311497260, -0.882028496217283080, -0.882052054917997760, -0.882075611413582370, -0.882099165703977840, -0.882122717789125210, --0.882146267668965980, -0.882169815343440970, -0.882193360812491440, -0.882216904076058680, -0.882240445134083510, -0.882263983986507410, -0.882287520633271090, -0.882311055074316060, --0.882334587309583360, -0.882358117339014150, -0.882381645162549690, -0.882405170780131360, -0.882428694191699890, -0.882452215397196760, -0.882475734396563020, -0.882499251189739930, --0.882522765776668660, -0.882546278157290480, -0.882569788331546870, -0.882593296299378550, -0.882616802060727230, -0.882640305615533640, -0.882663806963739360, -0.882687306105285450, --0.882710803040113400, -0.882734297768164260, -0.882757790289379620, -0.882781280603700310, -0.882804768711067940, -0.882828254611423450, -0.882851738304708420, -0.882875219790863920, --0.882898699069831430, -0.882922176141552220, -0.882945651005967780, -0.882969123663018940, -0.882992594112647520, -0.883016062354794460, -0.883039528389401140, -0.883062992216409160, --0.883086453835759570, -0.883109913247394070, -0.883133370451253620, -0.883156825447279910, -0.883180278235414010, -0.883203728815597280, -0.883227177187771330, -0.883250623351877430, --0.883274067307856960, -0.883297509055651520, -0.883320948595202160, -0.883344385926450480, -0.883367821049337750, -0.883391253963805470, -0.883414684669795000, -0.883438113167247850, --0.883461539456105620, -0.883484963536309340, -0.883508385407800860, -0.883531805070521200, -0.883555222524412100, -0.883578637769414920, -0.883602050805471050, -0.883625461632522090, --0.883648870250509750, -0.883672276659374980, -0.883695680859059700, -0.883719082849505070, -0.883742482630652690, -0.883765880202444070, -0.883789275564820900, -0.883812668717724350, --0.883836059661096460, -0.883859448394878180, -0.883882834919011540, -0.883906219233437480, -0.883929601338097950, -0.883952981232934420, -0.883976358917888390, -0.883999734392901690, --0.884023107657915470, -0.884046478712871790, -0.884069847557711560, -0.884093214192376740, -0.884116578616808920, -0.884139940830949600, -0.884163300834740480, -0.884186658628123290, --0.884210014211039290, -0.884233367583430410, -0.884256718745237920, -0.884280067696403550, -0.884303414436869110, -0.884326758966576200, -0.884350101285466210, -0.884373441393481290, --0.884396779290562600, -0.884420114976652070, -0.884443448451691090, -0.884466779715621490, -0.884490108768384960, -0.884513435609923130, -0.884536760240177910, -0.884560082659090590, --0.884583402866603310, -0.884606720862657350, -0.884630036647194420, -0.884653350220156560, -0.884676661581485280, -0.884699970731122280, -0.884723277669009600, -0.884746582395088630, --0.884769884909301310, -0.884793185211589010, -0.884816483301893890, -0.884839779180157440, -0.884863072846321600, -0.884886364300328300, -0.884909653542118810, -0.884932940571635520, --0.884956225388819570, -0.884979507993613020, -0.885002788385957810, -0.885026066565795520, -0.885049342533068220, -0.885072616287717610, -0.885095887829685290, -0.885119157158913540, --0.885142424275343620, -0.885165689178917690, -0.885188951869577470, -0.885212212347264880, -0.885235470611921870, -0.885258726663490260, -0.885281980501911650, -0.885305232127128310, --0.885328481539081720, -0.885351728737713950, -0.885374973722966810, -0.885398216494782230, -0.885421457053102270, -0.885444695397868520, -0.885467931529023260, -0.885491165446507860, --0.885514397150264700, -0.885537626640235390, -0.885560853916362080, -0.885584078978586710, -0.885607301826851320, -0.885630522461097410, -0.885653740881267360, -0.885676957087302870, --0.885700171079145890, -0.885723382856738570, -0.885746592420022740, -0.885769799768940440, -0.885793004903433820, -0.885816207823444720, -0.885839408528914960, -0.885862607019786590, --0.885885803296001750, -0.885908997357502390, -0.885932189204230450, -0.885955378836128400, -0.885978566253137640, -0.886001751455200550, -0.886024934442259050, -0.886048115214255080, --0.886071293771130920, -0.886094470112828490, -0.886117644239289850, -0.886140816150457370, -0.886163985846272540, -0.886187153326678080, -0.886210318591615480, -0.886233481641027110, --0.886256642474854920, -0.886279801093041280, -0.886302957495528230, -0.886326111682257610, -0.886349263653171900, -0.886372413408212930, -0.886395560947322860, -0.886418706270443830, --0.886441849377518130, -0.886464990268487680, -0.886488128943295100, -0.886511265401881960, -0.886534399644190780, -0.886557531670163490, -0.886580661479742350, -0.886603789072869520, --0.886626914449487270, -0.886650037609537640, -0.886673158552963250, -0.886696277279705680, -0.886719393789707540, -0.886742508082910890, -0.886765620159257860, -0.886788730018690850, --0.886811837661151900, -0.886834943086583620, -0.886858046294927820, -0.886881147286127100, -0.886904246060123300, -0.886927342616858900, -0.886950436956276070, -0.886973529078317170, --0.886996618982924480, -0.887019706670040490, -0.887042792139607020, -0.887065875391566670, -0.887088956425861500, -0.887112035242433980, -0.887135111841226290, -0.887158186222180900, --0.887181258385239980, -0.887204328330346130, -0.887227396057441500, -0.887250461566468140, -0.887273524857368550, -0.887296585930085310, -0.887319644784560490, -0.887342701420736570, --0.887365755838556150, -0.887388808037961050, -0.887411858018894220, -0.887434905781297580, -0.887457951325113630, -0.887480994650284740, -0.887504035756753410, -0.887527074644462010, --0.887550111313353040, -0.887573145763368650, -0.887596177994451670, -0.887619208006543920, -0.887642235799588230, -0.887665261373526970, -0.887688284728302520, -0.887711305863857490, --0.887734324780134140, -0.887757341477075080, -0.887780355954622460, -0.887803368212718990, -0.887826378251307060, -0.887849386070329260, -0.887872391669727980, -0.887895395049445810, --0.887918396209425030, -0.887941395149608460, -0.887964391869938250, -0.887987386370357010, -0.888010378650807340, -0.888033368711231620, -0.888056356551572560, -0.888079342171772870, --0.888102325571774490, -0.888125306751520570, -0.888148285710953170, -0.888171262450015100, -0.888194236968648850, -0.888217209266796930, -0.888240179344402250, -0.888263147201406980, --0.888286112837753940, -0.888309076253385510, -0.888332037448244290, -0.888354996422273110, -0.888377953175414350, -0.888400907707610710, -0.888423860018805020, -0.888446810108939440, --0.888469757977957130, -0.888492703625800130, -0.888515647052411370, -0.888538588257733570, -0.888561527241709230, -0.888584464004281150, -0.888607398545392060, -0.888630330864984440, --0.888653260963000790, -0.888676188839384040, -0.888699114494076790, -0.888722037927021760, -0.888744959138161650, -0.888767878127439290, -0.888790794894797180, -0.888813709440178120, --0.888836621763524630, -0.888859531864779620, -0.888882439743885810, -0.888905345400785810, -0.888928248835422540, -0.888951150047738840, -0.888974049037676960, -0.888996945805180290, --0.889019840350190990, -0.889042732672651990, -0.889065622772506340, -0.889088510649696520, -0.889111396304165690, -0.889134279735856130, -0.889157160944711090, -0.889180039930672960, --0.889202916693684680, -0.889225791233689170, -0.889248663550629040, -0.889271533644447440, -0.889294401515087100, -0.889317267162490600, -0.889340130586601110, -0.889362991787361110, --0.889385850764713550, -0.889408707518601460, -0.889431562048967560, -0.889454414355754790, -0.889477264438906180, -0.889500112298364230, -0.889522957934072100, -0.889545801345972500, --0.889568642534008360, -0.889591481498122500, -0.889614318238258090, -0.889637152754358060, -0.889659985046364900, -0.889682815114221980, -0.889705642957871800, -0.889728468577257510, --0.889751291972322170, -0.889774113143008470, -0.889796932089259580, -0.889819748811018440, -0.889842563308227860, -0.889865375580831010, -0.889888185628770480, -0.889910993451989540, --0.889933799050431130, -0.889956602424038180, -0.889979403572753740, -0.890002202496521070, -0.890024999195282770, -0.890047793668981790, -0.890070585917561390, -0.890093375940964490, --0.890116163739134160, -0.890138949312013430, -0.890161732659545460, -0.890184513781673070, -0.890207292678339530, -0.890230069349487560, -0.890252843795060420, -0.890275616015001160, --0.890298386009252930, -0.890321153777758670, -0.890343919320461750, -0.890366682637304780, -0.890389443728231370, -0.890412202593184100, -0.890434959232106360, -0.890457713644941200, --0.890480465831631760, -0.890503215792121440, -0.890525963526352720, -0.890548709034269410, -0.890571452315814140, -0.890594193370930150, -0.890616932199560730, -0.890639668801648910, --0.890662403177138070, -0.890685135325971270, -0.890707865248091530, -0.890730592943442260, -0.890753318411966370, -0.890776041653607130, -0.890798762668307820, -0.890821481456011590, --0.890844198016661700, -0.890866912350201430, -0.890889624456573710, -0.890912334335722140, -0.890935041987589550, -0.890957747412119420, -0.890980450609254790, -0.891003151578939170, --0.891025850321115700, -0.891048546835727540, -0.891071241122718180, -0.891093933182030450, -0.891116623013607940, -0.891139310617393930, -0.891161995993331570, -0.891184679141364230, --0.891207360061435420, -0.891230038753488050, -0.891252715217465740, -0.891275389453311420, -0.891298061460968570, -0.891320731240380690, -0.891343398791490940, -0.891366064114242910, --0.891388727208579420, -0.891411388074444420, -0.891434046711780730, -0.891456703120531820, -0.891479357300641320, -0.891502009252052360, -0.891524658974708340, -0.891547306468552850, --0.891569951733528930, -0.891592594769580420, -0.891615235576650120, -0.891637874154681760, -0.891660510503618720, -0.891683144623404370, -0.891705776513982200, -0.891728406175295810, --0.891751033607288130, -0.891773658809903110, -0.891796281783083790, -0.891818902526773650, -0.891841521040916410, -0.891864137325455220, -0.891886751380333910, -0.891909363205495630, --0.891931972800884100, -0.891954580166442360, -0.891977185302114230, -0.891999788207843090, -0.892022388883572550, -0.892044987329245980, -0.892067583544807200, -0.892090177530199260, --0.892112769285365980, -0.892135358810250630, -0.892157946104796930, -0.892180531168948350, -0.892203114002648400, -0.892225694605840670, -0.892248272978468980, -0.892270849120476490, --0.892293423031806810, -0.892315994712403420, -0.892338564162210130, -0.892361131381170460, -0.892383696369227870, -0.892406259126326320, -0.892428819652408940, -0.892451377947419690, --0.892473934011301710, -0.892496487843999040, -0.892519039445455080, -0.892541588815613520, -0.892564135954417970, -0.892586680861812250, -0.892609223537739640, -0.892631763982144280, --0.892654302194969220, -0.892676838176158390, -0.892699371925655520, -0.892721903443404190, -0.892744432729348340, -0.892766959783431120, -0.892789484605596820, -0.892812007195788460, --0.892834527553950210, -0.892857045680025550, -0.892879561573958420, -0.892902075235692210, -0.892924586665171160, -0.892947095862338340, -0.892969602827138000, -0.892992107559513530, --0.893014610059408740, -0.893037110326767360, -0.893059608361533310, -0.893082104163650190, -0.893104597733061940, -0.893127089069712170, -0.893149578173544680, -0.893172065044503190, --0.893194549682531540, -0.893217032087573410, -0.893239512259572770, -0.893261990198473520, -0.893284465904219170, -0.893306939376753760, -0.893329410616020780, -0.893351879621964380, --0.893374346394528280, -0.893396810933656190, -0.893419273239292160, -0.893441733311380220, -0.893464191149863640, -0.893486646754686810, -0.893509100125793100, -0.893531551263126780, --0.893554000166631450, -0.893576446836251260, -0.893598891271929820, -0.893621333473611390, -0.893643773441239690, -0.893666211174758310, -0.893688646674111300, -0.893711079939242810, --0.893733510970096570, -0.893755939766616600, -0.893778366328746960, -0.893800790656431140, -0.893823212749613630, -0.893845632608237790, -0.893868050232248020, -0.893890465621588030, --0.893912878776201850, -0.893935289696033530, -0.893957698381027120, -0.893980104831126330, -0.894002509046275430, -0.894024911026418120, -0.894047310771498460, -0.894069708281460600, --0.894092103556248460, -0.894114496595806220, -0.894136887400077570, -0.894159275969006790, -0.894181662302537820, -0.894204046400614570, -0.894226428263181220, -0.894248807890181800, --0.894271185281560350, -0.894293560437261160, -0.894315933357227810, -0.894338304041404910, -0.894360672489736050, -0.894383038702165400, -0.894405402678637220, -0.894427764419095550, --0.894450123923484550, -0.894472481191748270, -0.894494836223830750, -0.894517189019676250, -0.894539539579228600, -0.894561887902432070, -0.894584233989230810, -0.894606577839568980, --0.894628919453390960, -0.894651258830640340, -0.894673595971261840, -0.894695930875199160, -0.894718263542396700, -0.894740593972798480, -0.894762922166348900, -0.894785248122991870, --0.894807571842672010, -0.894829893325333030, -0.894852212570919400, -0.894874529579375190, -0.894896844350644540, -0.894919156884671830, -0.894941467181401220, -0.894963775240776970, --0.894986081062743470, -0.895008384647244750, -0.895030685994224860, -0.895052985103628300, -0.895075281975399210, -0.895097576609481970, -0.895119869005820750, -0.895142159164360130, --0.895164447085043840, -0.895186732767816680, -0.895209016212622500, -0.895231297419405660, -0.895253576388110650, -0.895275853118681740, -0.895298127611063200, -0.895320399865199510, --0.895342669881034610, -0.895364937658513220, -0.895387203197579360, -0.895409466498177430, -0.895431727560251910, -0.895453986383746960, -0.895476242968607280, -0.895498497314776820, --0.895520749422200280, -0.895542999290821710, -0.895565246920585700, -0.895587492311436420, -0.895609735463318570, -0.895631976376176310, -0.895654215049954240, -0.895676451484596510, --0.895698685680047850, -0.895720917636252280, -0.895743147353154410, -0.895765374830698620, -0.895787600068829400, -0.895809823067491240, -0.895832043826628730, -0.895854262346185810, --0.895876478626107530, -0.895898692666337810, -0.895920904466821380, -0.895943114027502710, -0.895965321348326180, -0.895987526429236620, -0.896009729270178080, -0.896031929871095370, --0.896054128231932530, -0.896076324352634510, -0.896098518233145680, -0.896120709873410410, -0.896142899273373540, -0.896165086432979540, -0.896187271352172580, -0.896209454030897690, --0.896231634469099040, -0.896253812666721220, -0.896275988623708830, -0.896298162340006590, -0.896320333815558870, -0.896342503050310490, -0.896364670044205840, -0.896386834797189390, --0.896408997309205870, -0.896431157580199760, -0.896453315610115880, -0.896475471398898600, -0.896497624946492880, -0.896519776252842850, -0.896541925317893670, -0.896564072141589400, --0.896586216723875060, -0.896608359064695050, -0.896630499163994180, -0.896652637021717050, -0.896674772637808590, -0.896696906012212970, -0.896719037144875330, -0.896741166035739830, --0.896763292684751410, -0.896785417091854780, -0.896807539256994630, -0.896829659180115810, -0.896851776861162690, -0.896873892300080190, -0.896896005496812920, -0.896918116451305590, --0.896940225163502910, -0.896962331633349710, -0.896984435860790690, -0.897006537845770780, -0.897028637588234260, -0.897050735088126380, -0.897072830345391540, -0.897094923359974540, --0.897117014131820320, -0.897139102660873490, -0.897161188947078970, -0.897183272990381590, -0.897205354790725830, -0.897227434348056960, -0.897249511662319250, -0.897271586733457750, --0.897293659561417380, -0.897315730146142740, -0.897337798487579000, -0.897359864585670630, -0.897381928440362690, -0.897403990051599880, -0.897426049419327020, -0.897448106543488940, --0.897470161424030800, -0.897492214060897080, -0.897514264454033040, -0.897536312603383290, -0.897558358508892760, -0.897580402170506280, -0.897602443588168760, -0.897624482761825050, --0.897646519691420290, -0.897668554376899300, -0.897690586818206790, -0.897712617015287930, -0.897734644968087410, -0.897756670676550290, -0.897778694140621390, -0.897800715360245860, --0.897822734335368520, -0.897844751065934530, -0.897866765551888490, -0.897888777793175660, -0.897910787789740760, -0.897932795541528830, -0.897954801048485020, -0.897976804310554160, --0.897998805327681170, -0.898020804099811550, -0.898042800626889570, -0.898064794908860820, -0.898086786945670010, -0.898108776737262080, -0.898130764283582290, -0.898152749584575580, --0.898174732640187210, -0.898196713450361780, -0.898218692015044670, -0.898240668334180810, -0.898262642407715140, -0.898284614235592920, -0.898306583817759190, -0.898328551154158990, --0.898350516244737610, -0.898372479089439730, -0.898394439688210870, -0.898416398040995710, -0.898438354147739540, -0.898460308008387500, -0.898482259622884640, -0.898504208991176220, --0.898526156113207410, -0.898548100988923240, -0.898570043618268530, -0.898591984001188780, -0.898613922137629140, -0.898635858027534650, -0.898657791670850470, -0.898679723067521970, --0.898701652217494100, -0.898723579120712210, -0.898745503777121150, -0.898767426186666380, -0.898789346349293080, -0.898811264264946400, -0.898833179933571480, -0.898855093355113930, --0.898877004529518350, -0.898898913456730450, -0.898920820136695160, -0.898942724569357750, -0.898964626754663600, -0.898986526692557740, -0.899008424382985890, -0.899030319825892770, --0.899052213021223960, -0.899074103968924510, -0.899095992668939800, -0.899117879121215100, -0.899139763325695670, -0.899161645282326890, -0.899183524991054140, -0.899205402451822340, --0.899227277664577330, -0.899249150629263800, -0.899271021345827480, -0.899292889814213630, -0.899314756034367500, -0.899336620006234600, -0.899358481729760180, -0.899380341204889520, --0.899402198431568100, -0.899424053409740960, -0.899445906139353820, -0.899467756620351830, -0.899489604852680370, -0.899511450836285250, -0.899533294571111200, -0.899555136057104130, --0.899576975294208990, -0.899598812282371480, -0.899620647021536990, -0.899642479511650770, -0.899664309752658430, -0.899686137744505450, -0.899707963487136890, -0.899729786980498770, --0.899751608224535810, -0.899773427219193960, -0.899795243964418570, -0.899817058460154920, -0.899838870706348710, -0.899860680702945560, -0.899882488449890610, -0.899904293947129340, --0.899926097194607260, -0.899947898192270060, -0.899969696940063010, -0.899991493437931720, -0.900013287685821890, -0.900035079683678680, -0.900056869431447910, -0.900078656929074850, --0.900100442176505090, -0.900122225173684230, -0.900144005920557880, -0.900165784417071400, -0.900187560663170740, -0.900209334658800930, -0.900231106403908020, -0.900252875898437170, --0.900274643142334070, -0.900296408135544350, -0.900318170878013690, -0.900339931369687710, -0.900361689610511770, -0.900383445600431820, -0.900405199339393000, -0.900426950827341250, --0.900448700064222060, -0.900470447049981140, -0.900492191784564080, -0.900513934267916820, -0.900535674499984400, -0.900557412480713080, -0.900579148210048030, -0.900600881687935060, --0.900622612914320000, -0.900644341889148330, -0.900666068612365760, -0.900687793083918220, -0.900709515303751100, -0.900731235271810320, -0.900752952988041260, -0.900774668452389850, --0.900796381664801690, -0.900818092625222610, -0.900839801333598530, -0.900861507789874730, -0.900883211993997350, -0.900904913945911770, -0.900926613645563920, -0.900948311092899520, --0.900970006287864280, -0.900991699230404120, -0.901013389920464870, -0.901035078357991900, -0.901056764542931490, -0.901078448475229000, -0.901100130154830370, -0.901121809581681310, --0.901143486755727860, -0.901165161676915630, -0.901186834345190760, -0.901208504760498740, -0.901230172922785180, -0.901251838831996330, -0.901273502488077800, -0.901295163890975640, --0.901316823040635430, -0.901338479937003450, -0.901360134580024950, -0.901381786969646440, -0.901403437105813170, -0.901425084988471400, -0.901446730617566860, -0.901468373993045470, --0.901490015114853270, -0.901511653982936090, -0.901533290597239630, -0.901554924957710170, -0.901576557064293180, -0.901598186916934720, -0.901619814515580930, -0.901641439860177530, --0.901663062950670780, -0.901684683787006060, -0.901706302369129960, -0.901727918696987760, -0.901749532770525940, -0.901771144589690210, -0.901792754154426610, -0.901814361464681080, --0.901835966520399880, -0.901857569321528610, -0.901879169868013530, -0.901900768159800360, -0.901922364196835360, -0.901943957979064350, -0.901965549506433480, -0.901987138778888700, --0.902008725796376360, -0.902030310558841970, -0.902051893066231900, -0.902073473318491970, -0.902095051315568440, -0.902116627057407250, -0.902138200543954440, -0.902159771775156270, --0.902181340750958570, -0.902202907471307710, -0.902224471936149300, -0.902246034145429810, -0.902267594099095180, -0.902289151797091570, -0.902310707239365130, -0.902332260425862120, --0.902353811356528260, -0.902375360031310030, -0.902396906450153140, -0.902418450613004080, -0.902439992519808890, -0.902461532170513720, -0.902483069565064630, -0.902504604703408210, --0.902526137585490160, -0.902547668211256650, -0.902569196580653930, -0.902590722693628170, -0.902612246550125620, -0.902633768150092550, -0.902655287493475230, -0.902676804580219370, --0.902698319410271790, -0.902719831983578190, -0.902741342300085070, -0.902762850359738580, -0.902784356162484980, -0.902805859708270430, -0.902827360997041420, -0.902848860028743870, --0.902870356803324280, -0.902891851320728690, -0.902913343580903470, -0.902934833583794780, -0.902956321329349110, -0.902977806817512830, -0.902999290048231870, -0.903020771021452840, --0.903042249737121660, -0.903063726195184820, -0.903085200395588710, -0.903106672338279680, -0.903128142023203910, -0.903149609450307870, -0.903171074619537720, -0.903192537530840060, --0.903213998184160930, -0.903235456579446700, -0.903256912716643880, -0.903278366595698820, -0.903299818216557800, -0.903321267579167420, -0.903342714683473710, -0.903364159529423390, --0.903385602116962390, -0.903407042446037530, -0.903428480516594970, -0.903449916328581290, -0.903471349881942890, -0.903492781176626010, -0.903514210212577380, -0.903535636989742930, --0.903557061508069470, -0.903578483767503380, -0.903599903767991040, -0.903621321509478940, -0.903642736991913780, -0.903664150215241600, -0.903685561179409120, -0.903706969884362610, --0.903728376330048650, -0.903749780516413860, -0.903771182443404490, -0.903792582110967360, -0.903813979519048630, -0.903835374667595230, -0.903856767556553090, -0.903878158185869030, --0.903899546555489540, -0.903920932665361330, -0.903942316515430670, -0.903963698105644480, -0.903985077435948800, -0.904006454506290580, -0.904027829316616070, -0.904049201866871990, --0.904070572157004930, -0.904091940186961480, -0.904113305956688150, -0.904134669466131750, -0.904156030715238420, -0.904177389703955230, -0.904198746432228420, -0.904220100900004710, --0.904241453107230700, -0.904262803053853090, -0.904284150739818720, -0.904305496165073720, -0.904326839329565260, -0.904348180233239480, -0.904369518876043220, -0.904390855257923070, --0.904412189378825950, -0.904433521238698250, -0.904454850837487000, -0.904476178175138370, -0.904497503251599500, -0.904518826066816770, -0.904540146620736900, -0.904561464913306580, --0.904582780944472750, -0.904604094714181910, -0.904625406222380970, -0.904646715469016430, -0.904668022454035210, -0.904689327177383820, -0.904710629639009060, -0.904731929838857640, --0.904753227776876500, -0.904774523453012570, -0.904795816867212000, -0.904817108019422060, -0.904838396909589230, -0.904859683537660440, -0.904880967903582410, -0.904902250007301960, --0.904923529848765780, -0.904944807427921160, -0.904966082744714130, -0.904987355799092170, -0.905008626591001670, -0.905029895120389670, -0.905051161387202760, -0.905072425391388100, --0.905093687132892400, -0.905114946611662470, -0.905136203827645260, -0.905157458780787350, -0.905178711471035790, -0.905199961898337510, -0.905221210062639340, -0.905242455963888080, --0.905263699602030900, -0.905284940977014290, -0.905306180088785490, -0.905327416937291020, -0.905348651522478120, -0.905369883844293510, -0.905391113902684120, -0.905412341697597100, --0.905433567228979270, -0.905454790496777460, -0.905476011500938820, -0.905497230241409930, -0.905518446718137970, -0.905539660931069970, -0.905560872880152750, -0.905582082565333460, --0.905603289986558920, -0.905624495143776300, -0.905645698036932180, -0.905666898665973940, -0.905688097030848400, -0.905709293131502500, -0.905730486967883500, -0.905751678539938430, --0.905772867847614020, -0.905794054890857630, -0.905815239669615860, -0.905836422183836090, -0.905857602433465140, -0.905878780418450270, -0.905899956138738420, -0.905921129594276840, --0.905942300785012480, -0.905963469710892140, -0.905984636371863110, -0.906005800767872520, -0.906026962898867420, -0.906048122764794960, -0.906069280365602300, -0.906090435701236370, --0.906111588771644440, -0.906132739576773430, -0.906153888116570490, -0.906175034390982900, -0.906196178399957700, -0.906217320143442030, -0.906238459621383160, -0.906259596833728140, --0.906280731780424230, -0.906301864461418250, -0.906322994876657680, -0.906344123026089580, -0.906365248909661190, -0.906386372527319910, -0.906407493879012430, -0.906428612964686460, --0.906449729784288840, -0.906470844337766810, -0.906491956625067650, -0.906513066646138620, -0.906534174400926870, -0.906555279889380010, -0.906576383111444620, -0.906597484067068530, --0.906618582756198550, -0.906639679178782080, -0.906660773334766470, -0.906681865224098880, -0.906702954846726580, -0.906724042202597170, -0.906745127291657460, -0.906766210113855050, --0.906787290669136990, -0.906808368957450760, -0.906829444978743520, -0.906850518732962630, -0.906871590220055700, -0.906892659439969550, -0.906913726392652000, -0.906934791078049970, --0.906955853496110850, -0.906976913646782230, -0.906997971530011270, -0.907019027145745340, -0.907040080493932030, -0.907061131574518400, -0.907082180387452140, -0.907103226932680200, --0.907124271210150160, -0.907145313219809510, -0.907166352961605530, -0.907187390435485690, -0.907208425641397480, -0.907229458579288270, -0.907250489249105230, -0.907271517650796060, --0.907292543784308010, -0.907313567649588590, -0.907334589246585280, -0.907355608575245550, -0.907376625635516800, -0.907397640427346610, -0.907418652950682140, -0.907439663205470980, --0.907460671191660740, -0.907481676909198790, -0.907502680358032610, -0.907523681538109920, -0.907544680449377860, -0.907565677091784260, -0.907586671465276380, -0.907607663569801710, --0.907628653405307960, -0.907649640971742610, -0.907670626269053260, -0.907691609297187170, -0.907712590056092280, -0.907733568545715630, -0.907754544766005140, -0.907775518716908310, --0.907796490398372620, -0.907817459810345780, -0.907838426952775390, -0.907859391825608820, -0.907880354428793890, -0.907901314762277980, -0.907922272826008680, -0.907943228619933820, --0.907964182144000760, -0.907985133398157340, -0.908006082382351250, -0.908027029096529770, -0.908047973540640820, -0.908068915714631890, -0.908089855618450570, -0.908110793252044580, --0.908131728615361730, -0.908152661708349630, -0.908173592530955750, -0.908194521083128150, -0.908215447364813970, -0.908236371375961140, -0.908257293116517480, -0.908278212586430490, --0.908299129785647970, -0.908320044714117870, -0.908340957371787440, -0.908361867758604840, -0.908382775874517430, -0.908403681719472940, -0.908424585293419410, -0.908445486596304310, --0.908466385628075470, -0.908487282388680930, -0.908508176878068170, -0.908529069096184690, -0.908549959042978640, -0.908570846718397610, -0.908591732122389530, -0.908612615254902110, --0.908633496115883400, -0.908654374705280650, -0.908675251023042250, -0.908696125069115460, -0.908716996843448420, -0.908737866345988850, -0.908758733576684570, -0.908779598535483510, --0.908800461222333600, -0.908821321637182430, -0.908842179779978050, -0.908863035650668060, -0.908883889249200600, -0.908904740575523280, -0.908925589629584140, -0.908946436411331220, --0.908967280920712000, -0.908988123157674850, -0.909008963122167170, -0.909029800814136980, -0.909050636233532440, -0.909071469380301140, -0.909092300254391360, -0.909113128855750910, --0.909133955184327490, -0.909154779240069270, -0.909175601022924050, -0.909196420532839780, -0.909217237769764370, -0.909238052733646000, -0.909258865424432350, -0.909279675842071810, --0.909300483986511980, -0.909321289857700890, -0.909342093455586700, -0.909362894780117110, -0.909383693831240400, -0.909404490608904270, -0.909425285113057090, -0.909446077343646580, --0.909466867300621100, -0.909487654983928140, -0.909508440393516300, -0.909529223529333190, -0.909550004391327160, -0.909570782979446050, -0.909591559293638000, -0.909612333333850940, --0.909633105100033260, -0.909653874592132650, -0.909674641810097380, -0.909695406753875500, -0.909716169423415270, -0.909736929818664500, -0.909757687939571350, -0.909778443786084080, --0.909799197358150510, -0.909819948655719140, -0.909840697678737760, -0.909861444427154780, -0.909882188900918100, -0.909902931099976000, -0.909923671024276510, -0.909944408673767910, --0.909965144048398230, -0.909985877148115740, -0.910006607972868480, -0.910027336522604810, -0.910048062797272680, -0.910068786796820460, -0.910089508521196300, -0.910110227970348350, --0.910130945144224770, -0.910151660042773920, -0.910172372665943970, -0.910193083013682850, -0.910213791085939250, -0.910234496882661000, -0.910255200403796700, -0.910275901649294280, --0.910296600619102110, -0.910317297313168460, -0.910337991731441590, -0.910358683873869650, -0.910379373740401120, -0.910400061330984060, -0.910420746645566940, -0.910441429684097800, --0.910462110446525250, -0.910482788932797330, -0.910503465142862510, -0.910524139076668960, -0.910544810734165160, -0.910565480115299140, -0.910586147220019630, -0.910606812048274760, --0.910627474600012700, -0.910648134875182040, -0.910668792873730930, -0.910689448595608080, -0.910710102040761300, -0.910730753209139540, -0.910751402100690720, -0.910772048715363550, --0.910792693053106060, -0.910813335113866970, -0.910833974897594540, -0.910854612404237150, -0.910875247633743170, -0.910895880586061190, -0.910916511261139370, -0.910937139658926420, --0.910957765779370490, -0.910978389622420280, -0.910999011188024070, -0.911019630476130220, -0.911040247486687440, -0.911060862219643890, -0.911081474674948380, -0.911102084852548950, --0.911122692752394550, -0.911143298374433200, -0.911163901718613720, -0.911184502784884390, -0.911205101573194010, -0.911225698083490630, -0.911246292315723180, -0.911266884269839930, --0.911287473945789460, -0.911308061343520270, -0.911328646462981060, -0.911349229304120100, -0.911369809866886200, -0.911390388151227640, -0.911410964157093220, -0.911431537884431320, --0.911452109333190540, -0.911472678503319590, -0.911493245394766840, -0.911513810007481110, -0.911534372341410770, -0.911554932396504540, -0.911575490172710890, -0.911596045669978540, --0.911616598888256080, -0.911637149827492220, -0.911657698487635340, -0.911678244868634360, -0.911698788970437660, -0.911719330792994050, -0.911739870336252030, -0.911760407600160530, --0.911780942584667800, -0.911801475289722770, -0.911822005715274160, -0.911842533861270450, -0.911863059727660460, -0.911883583314392680, -0.911904104621416020, -0.911924623648679100, --0.911945140396130730, -0.911965654863719280, -0.911986167051393900, -0.912006676959102980, -0.912027184586795440, -0.912047689934419870, -0.912068193001925210, -0.912088693789259830, --0.912109192296372990, -0.912129688523212970, -0.912150182469728790, -0.912170674135869160, -0.912191163521582920, -0.912211650626818640, -0.912232135451525370, -0.912252617995651720, --0.912273098259146380, -0.912293576241958500, -0.912314051944036470, -0.912334525365329550, -0.912354996505786110, -0.912375465365355300, -0.912395931943985720, -0.912416396241626520, --0.912436858258226070, -0.912457317993733640, -0.912477775448097830, -0.912498230621267670, -0.912518683513191880, -0.912539134123819370, -0.912559582453099090, -0.912580028500979750, --0.912600472267410370, -0.912620913752339890, -0.912641352955717020, -0.912661789877490910, -0.912682224517610270, -0.912702656876024030, -0.912723086952681120, -0.912743514747530570, --0.912763940260521210, -0.912784363491601860, -0.912804784440721770, -0.912825203107829660, -0.912845619492874570, -0.912866033595805430, -0.912886445416571270, -0.912906854955120810, --0.912927262211403410, -0.912947667185367680, -0.912968069876962880, -0.912988470286137940, -0.913008868412841790, -0.913029264257023470, -0.913049657818632010, -0.913070049097616350, --0.913090438093925540, -0.913110824807508830, -0.913131209238314810, -0.913151591386292870, -0.913171971251391930, -0.913192348833561150, -0.913212724132749450, -0.913233097148905880, --0.913253467881979590, -0.913273836331919720, -0.913294202498675210, -0.913314566382195210, -0.913334927982428660, -0.913355287299324910, -0.913375644332832910, -0.913395999082901920, --0.913416351549480750, -0.913436701732518790, -0.913457049631965060, -0.913477395247768720, -0.913497738579878930, -0.913518079628244720, -0.913538418392815350, -0.913558754873539990, --0.913579089070367670, -0.913599420983247650, -0.913619750612129080, -0.913640077956961010, -0.913660403017692910, -0.913680725794273730, -0.913701046286652830, -0.913721364494779140, --0.913741680418602260, -0.913761994058071010, -0.913782305413134770, -0.913802614483742780, -0.913822921269844430, -0.913843225771388550, -0.913863527988324710, -0.913883827920602080, --0.913904125568169800, -0.913924420930977250, -0.913944714008973700, -0.913965004802108290, -0.913985293310330400, -0.914005579533589300, -0.914025863471834120, -0.914046145125014480, --0.914066424493079290, -0.914086701575978160, -0.914106976373660230, -0.914127248886074880, -0.914147519113171380, -0.914167787054899090, -0.914188052711207400, -0.914208316082045560, --0.914228577167362830, -0.914248835967108710, -0.914269092481232450, -0.914289346709683650, -0.914309598652411350, -0.914329848309365030, -0.914350095680494190, -0.914370340765747970, --0.914390583565075970, -0.914410824078427440, -0.914431062305752000, -0.914451298246998780, -0.914471531902117380, -0.914491763271057080, -0.914511992353767460, -0.914532219150197780, --0.914552443660297640, -0.914572665884016310, -0.914592885821303380, -0.914613103472108220, -0.914633318836380330, -0.914653531914069060, -0.914673742705124030, -0.914693951209494700, --0.914714157427130360, -0.914734361357980700, -0.914754563001995090, -0.914774762359123140, -0.914794959429314210, -0.914815154212517910, -0.914835346708683720, -0.914855536917761230, --0.914875724839699700, -0.914895910474449070, -0.914916093821958600, -0.914936274882177880, -0.914956453655056400, -0.914976630140543980, -0.914996804338589760, -0.915016976249143690, --0.915037145872155120, -0.915057313207573770, -0.915077478255349020, -0.915097641015430670, -0.915117801487768220, -0.915137959672311150, -0.915158115569009280, -0.915178269177812090, --0.915198420498669170, -0.915218569531530250, -0.915238716276345010, -0.915258860733062840, -0.915279002901633550, -0.915299142782006750, -0.915319280374132130, -0.915339415677959290, --0.915359548693437940, -0.915379679420517570, -0.915399807859148210, -0.915419934009279230, -0.915440057870860470, -0.915460179443841390, -0.915480298728172050, -0.915500415723801920, --0.915520530430680710, -0.915540642848758250, -0.915560752977984120, -0.915580860818308140, -0.915600966369680020, -0.915621069632049480, -0.915641170605366210, -0.915661269289580030, --0.915681365684640650, -0.915701459790498000, -0.915721551607101560, -0.915741641134401260, -0.915761728372346820, -0.915781813320888150, -0.915801895979974970, -0.915821976349556980, --0.915842054429584000, -0.915862130220006070, -0.915882203720772560, -0.915902274931833740, -0.915922343853139200, -0.915942410484638760, -0.915962474826282350, -0.915982536878019670, --0.916002596639800770, -0.916022654111575240, -0.916042709293293120, -0.916062762184904230, -0.916082812786358500, -0.916102861097605640, -0.916122907118595680, -0.916142950849278440, --0.916162992289603850, -0.916183031439521730, -0.916203068298982130, -0.916223102867934740, -0.916243135146329600, -0.916263165134116650, -0.916283192831245820, -0.916303218237666920, --0.916323241353330100, -0.916343262178185180, -0.916363280712181980, -0.916383296955270770, -0.916403310907401130, -0.916423322568523320, -0.916443331938587070, -0.916463339017542620, --0.916483343805339800, -0.916503346301928650, -0.916523346507258970, -0.916543344421281160, -0.916563340043944800, -0.916583333375200260, -0.916603324414997140, -0.916623313163285940, --0.916643299620016340, -0.916663283785138620, -0.916683265658602480, -0.916703245240358400, -0.916723222530356100, -0.916743197528545720, -0.916763170234877410, -0.916783140649301110, --0.916803108771767070, -0.916823074602225120, -0.916843038140625620, -0.916862999386918290, -0.916882958341053710, -0.916902915002981600, -0.916922869372652330, -0.916942821450015710, --0.916962771235022120, -0.916982718727621600, -0.917002663927764420, -0.917022606835400380, -0.917042547450479970, -0.917062485772953020, -0.917082421802770000, -0.917102355539880840, --0.917122286984235920, -0.917142216135785170, -0.917162142994478960, -0.917182067560267320, -0.917201989833100530, -0.917221909812928730, -0.917241827499702180, -0.917261742893371150, --0.917281655993885670, -0.917301566801196120, -0.917321475315252540, -0.917341381536005310, -0.917361285463404670, -0.917381187097400800, -0.917401086437943940, -0.917420983484984460, --0.917440878238472310, -0.917460770698358190, -0.917480660864592010, -0.917500548737124280, -0.917520434315905130, -0.917540317600884950, -0.917560198592013880, -0.917580077289242290, --0.917599953692520680, -0.917619827801798960, -0.917639699617027850, -0.917659569138157380, -0.917679436365138050, -0.917699301297920100, -0.917719163936453920, -0.917739024280689760, --0.917758882330578230, -0.917778738086069250, -0.917798591547113630, -0.917818442713661420, -0.917838291585663100, -0.917858138163069050, -0.917877982445829740, -0.917897824433895340, --0.917917664127216540, -0.917937501525743490, -0.917957336629426690, -0.917977169438216610, -0.917996999952063520, -0.918016828170918010, -0.918036654094730230, -0.918056477723451000, --0.918076299057030590, -0.918096118095419360, -0.918115934838567790, -0.918135749286426490, -0.918155561438945830, -0.918175371296076180, -0.918195178857768140, -0.918214984123972180, --0.918234787094638680, -0.918254587769718360, -0.918274386149161350, -0.918294182232918590, -0.918313976020940230, -0.918333767513177080, -0.918353556709579410, -0.918373343610097810, --0.918393128214682890, -0.918412910523285220, -0.918432690535855190, -0.918452468252343390, -0.918472243672700530, -0.918492016796876980, -0.918511787624823440, -0.918531556156490400, --0.918551322391828570, -0.918571086330788320, -0.918590847973320360, -0.918610607319375270, -0.918630364368903770, -0.918650119121856230, -0.918669871578183470, -0.918689621737835970, --0.918709369600764550, -0.918729115166919690, -0.918748858436251870, -0.918768599408712030, -0.918788338084250640, -0.918808074462818420, -0.918827808544366080, -0.918847540328844190, --0.918867269816203370, -0.918886997006394420, -0.918906721899367950, -0.918926444495074770, -0.918946164793465360, -0.918965882794490650, -0.918985598498101130, -0.919005311904247720, --0.919025023012880920, -0.919044731823951740, -0.919064438337410470, -0.919084142553208360, -0.919103844471295670, -0.919123544091623560, -0.919143241414142500, -0.919162936438803310, --0.919182629165556930, -0.919202319594353830, -0.919222007725144950, -0.919241693557880990, -0.919261377092512990, -0.919281058328991320, -0.919300737267267240, -0.919320413907291130, --0.919340088249014030, -0.919359760292386750, -0.919379430037360110, -0.919399097483884710, -0.919418762631911800, -0.919438425481391760, -0.919458086032275860, -0.919477744284514560, --0.919497400238059150, -0.919517053892860090, -0.919536705248868320, -0.919556354306034880, -0.919576001064310480, -0.919595645523646250, -0.919615287683992700, -0.919634927545301070, --0.919654565107521970, -0.919674200370606650, -0.919693833334505720, -0.919713463999170200, -0.919733092364551030, -0.919752718430599250, -0.919772342197265450, -0.919791963664501000, --0.919811582832256500, -0.919831199700483100, -0.919850814269131730, -0.919870426538153320, -0.919890036507498790, -0.919909644177119180, -0.919929249546965530, -0.919948852616988670, --0.919968453387139840, -0.919988051857369650, -0.920007648027629470, -0.920027241897870110, -0.920046833468042720, -0.920066422738098130, -0.920086009707987600, -0.920105594377661930, --0.920125176747072390, -0.920144756816169810, -0.920164334584905430, -0.920183910053230190, -0.920203483221095130, -0.920223054088451400, -0.920242622655250030, -0.920262188921442070, --0.920281752886978670, -0.920301314551810970, -0.920320873915889790, -0.920340430979166620, -0.920359985741592280, -0.920379538203118020, -0.920399088363694770, -0.920418636223274020, --0.920438181781806470, -0.920457725039243610, -0.920477265995536360, -0.920496804650635990, -0.920516341004493530, -0.920535875057060360, -0.920555406808287400, -0.920574936258126030, --0.920594463406527170, -0.920613988253442320, -0.920633510798822270, -0.920653031042618640, -0.920672548984782350, -0.920692064625264760, -0.920711577964016930, -0.920731089000990210, --0.920750597736135770, -0.920770104169404750, -0.920789608300748520, -0.920809110130118240, -0.920828609657465270, -0.920848106882740660, -0.920867601805895890, -0.920887094426882100, --0.920906584745650570, -0.920926072762152550, -0.920945558476339410, -0.920965041888162190, -0.920984522997572610, -0.921004001804521580, -0.921023478308960590, -0.921042952510840780, --0.921062424410113770, -0.921081894006730570, -0.921101361300642800, -0.921120826291801590, -0.921140288980158100, -0.921159749365664140, -0.921179207448270640, -0.921198663227929200, --0.921218116704591080, -0.921237567878207760, -0.921257016748730400, -0.921276463316110570, -0.921295907580299440, -0.921315349541248720, -0.921334789198909540, -0.921354226553233400, --0.921373661604171670, -0.921393094351675820, -0.921412524795697240, -0.921431952936187290, -0.921451378773097460, -0.921470802306379340, -0.921490223535984090, -0.921509642461863290, --0.921529059083968430, -0.921548473402250880, -0.921567885416662120, -0.921587295127153650, -0.921606702533677050, -0.921626107636183580, -0.921645510434624840, -0.921664910928952310, --0.921684309119117580, -0.921703705005072040, -0.921723098586767260, -0.921742489864154750, -0.921761878837185970, -0.921781265505812520, -0.921800649869985890, -0.921820031929657670, --0.921839411684779340, -0.921858789135302390, -0.921878164281178640, -0.921897537122359450, -0.921916907658796300, -0.921936275890441030, -0.921955641817244990, -0.921975005439159780, --0.921994366756137110, -0.922013725768128570, -0.922033082475085640, -0.922052436876960150, -0.922071788973703340, -0.922091138765267270, -0.922110486251603190, -0.922129831432663030, --0.922149174308398270, -0.922168514878760500, -0.922187853143701440, -0.922207189103172900, -0.922226522757126240, -0.922245854105513300, -0.922265183148285760, -0.922284509885395230, --0.922303834316793520, -0.922323156442432010, -0.922342476262262840, -0.922361793776237280, -0.922381108984307360, -0.922400421886424680, -0.922419732482540940, -0.922439040772607740, --0.922458346756577120, -0.922477650434400550, -0.922496951806029860, -0.922516250871416750, -0.922535547630513040, -0.922554842083270430, -0.922574134229640850, -0.922593424069575780, --0.922612711603027270, -0.922631996829946900, -0.922651279750286600, -0.922670560363998080, -0.922689838671033050, -0.922709114671343640, -0.922728388364881250, -0.922747659751598000, --0.922766928831445510, -0.922786195604375800, -0.922805460070340480, -0.922824722229291570, -0.922843982081180900, -0.922863239625960290, -0.922882494863581430, -0.922901747793996470, --0.922920998417157130, -0.922940246733015220, -0.922959492741522780, -0.922978736442631620, -0.922997977836293450, -0.923017216922460530, -0.923036453701084560, -0.923055688172117360, --0.923074920335510970, -0.923094150191217210, -0.923113377739188220, -0.923132602979375720, -0.923151825911731730, -0.923171046536208070, -0.923190264852756900, -0.923209480861330030, --0.923228694561879500, -0.923247905954357240, -0.923267115038715170, -0.923286321814905330, -0.923305526282879650, -0.923324728442590170, -0.923343928293988920, -0.923363125837027840, --0.923382321071658960, -0.923401513997834100, -0.923420704615505630, -0.923439892924625470, -0.923459078925145450, -0.923478262617017710, -0.923497444000194400, -0.923516623074627450, --0.923535799840268900, -0.923554974297070900, -0.923574146444985370, -0.923593316283964680, -0.923612483813960440, -0.923631649034925230, -0.923650811946810760, -0.923669972549569280, --0.923689130843152850, -0.923708286827513710, -0.923727440502603690, -0.923746591868375160, -0.923765740924780140, -0.923784887671770800, -0.923804032109299180, -0.923823174237317520, --0.923842314055777880, -0.923861451564632510, -0.923880586763833560, -0.923899719653332950, -0.923918850233083290, -0.923937978503036270, -0.923957104463144500, -0.923976228113359780, --0.923995349453634710, -0.924014468483921100, -0.924033585204171340, -0.924052699614337670, -0.924071811714372250, -0.924090921504227230, -0.924110028983854970, -0.924129134153207630, --0.924148237012237470, -0.924167337560896640, -0.924186435799137620, -0.924205531726912440, -0.924224625344173270, -0.924243716650872790, -0.924262805646962840, -0.924281892332395990, --0.924300976707124300, -0.924320058771100240, -0.924339138524275960, -0.924358215966603950, -0.924377291098036350, -0.924396363918525530, -0.924415434428023760, -0.924434502626483410, --0.924453568513856850, -0.924472632090096340, -0.924491693355154240, -0.924510752308982940, -0.924529808951534690, -0.924548863282762090, -0.924567915302617060, -0.924586965011052530, --0.924606012408020430, -0.924625057493473350, -0.924644100267363540, -0.924663140729643510, -0.924682178880265710, -0.924701214719182430, -0.924720248246346130, -0.924739279461709080, --0.924758308365223990, -0.924777334956843000, -0.924796359236518820, -0.924815381204203590, -0.924834400859850030, -0.924853418203410380, -0.924872433234837250, -0.924891445954083010, --0.924910456361100140, -0.924929464455841120, -0.924948470238258440, -0.924967473708304680, -0.924986474865932110, -0.925005473711093540, -0.925024470243741010, -0.925043464463827570, --0.925062456371305240, -0.925081445966126960, -0.925100433248244980, -0.925119418217611900, -0.925138400874180310, -0.925157381217902700, -0.925176359248731650, -0.925195334966619650, --0.925214308371519300, -0.925233279463383300, -0.925252248242164010, -0.925271214707814150, -0.925290178860286190, -0.925309140699532850, -0.925328100225506600, -0.925347057438160260, --0.925366012337446090, -0.925384964923317010, -0.925403915195725400, -0.925422863154624080, -0.925441808799965630, -0.925460752131702540, -0.925479693149787730, -0.925498631854173470, --0.925517568244812790, -0.925536502321658180, -0.925555434084662340, -0.925574363533777870, -0.925593290668957460, -0.925612215490153820, -0.925631137997319780, -0.925650058190407690, --0.925668976069370600, -0.925687891634160990, -0.925706804884731780, -0.925725715821035360, -0.925744624443024850, -0.925763530750652760, -0.925782434743871670, -0.925801336422634620, --0.925820235786894210, -0.925839132836603240, -0.925858027571714310, -0.925876919992180470, -0.925895810097954190, -0.925914697888988500, -0.925933583365236010, -0.925952466526649640, --0.925971347373181990, -0.925990225904786080, -0.926009102121414520, -0.926027976023020230, -0.926046847609556020, -0.926065716880974720, -0.926084583837229030, -0.926103448478271970, --0.926122310804056270, -0.926141170814534730, -0.926160028509660390, -0.926178883889385850, -0.926197736953664250, -0.926216587702448080, -0.926235436135690700, -0.926254282253344500, --0.926273126055362720, -0.926291967541698070, -0.926310806712303590, -0.926329643567131990, -0.926348478106136410, -0.926367310329269440, -0.926386140236484360, -0.926404967827733850, --0.926423793102971070, -0.926442616062148620, -0.926461436705219740, -0.926480255032137160, -0.926499071042854120, -0.926517884737323330, -0.926536696115497720, -0.926555505177330430, --0.926574311922774400, -0.926593116351782650, -0.926611918464307900, -0.926630718260303630, -0.926649515739722320, -0.926668310902517440, -0.926687103748641610, -0.926705894278048060, --0.926724682490689840, -0.926743468386519890, -0.926762251965491220, -0.926781033227557010, -0.926799812172670050, -0.926818588800783720, -0.926837363111850830, -0.926856135105824650, --0.926874904782658100, -0.926893672142304230, -0.926912437184716160, -0.926931199909846960, -0.926949960317649870, -0.926968718408077820, -0.926987474181084070, -0.927006227636621550, --0.927024978774643520, -0.927043727595102900, -0.927062474097953060, -0.927081218283147050, -0.927099960150638000, -0.927118699700378970, -0.927137436932323310, -0.927156171846423960, --0.927174904442634280, -0.927193634720907210, -0.927212362681196110, -0.927231088323454130, -0.927249811647634430, -0.927268532653690250, -0.927287251341574640, -0.927305967711240960, --0.927324681762642270, -0.927343393495732030, -0.927362102910463170, -0.927380810006789180, -0.927399514784662980, -0.927418217244038170, -0.927436917384867780, -0.927455615207105070, --0.927474310710703300, -0.927493003895615730, -0.927511694761795740, -0.927530383309196460, -0.927549069537771160, -0.927567753447473330, -0.927586435038256000, -0.927605114310072640, --0.927623791262876530, -0.927642465896620920, -0.927661138211259060, -0.927679808206744450, -0.927698475883030340, -0.927717141240069880, -0.927735804277816770, -0.927754464996223940, --0.927773123395245090, -0.927791779474833380, -0.927810433234942280, -0.927829084675525050, -0.927847733796535180, -0.927866380597925810, -0.927885025079650650, -0.927903667241662840, --0.927922307083915990, -0.927940944606363230, -0.927959579808958160, -0.927978212691654150, -0.927996843254404570, -0.928015471497163010, -0.928034097419882630, -0.928052721022517010, --0.928071342305019640, -0.928089961267343890, -0.928108577909443230, -0.928127192231271160, -0.928145804232781040, -0.928164413913926570, -0.928183021274660900, -0.928201626314937740, --0.928220229034710460, -0.928238829433932770, -0.928257427512557800, -0.928276023270539370, -0.928294616707830870, -0.928313207824385870, -0.928331796620157750, -0.928350383095100320, --0.928368967249166730, -0.928387549082310800, -0.928406128594486120, -0.928424705785645950, -0.928443280655744110, -0.928461853204733960, -0.928480423432569310, -0.928498991339203440, --0.928517556924590260, -0.928536120188683030, -0.928554681131435690, -0.928573239752801480, -0.928591796052734230, -0.928610350031187530, -0.928628901688114850, -0.928647451023470020, --0.928665998037206510, -0.928684542729278030, -0.928703085099638170, -0.928721625148240640, -0.928740162875039020, -0.928758698279987030, -0.928777231363038250, -0.928795762124146500, --0.928814290563265140, -0.928832816680348230, -0.928851340475349120, -0.928869861948221850, -0.928888381098919800, -0.928906897927396780, -0.928925412433606600, -0.928943924617502860, --0.928962434479039260, -0.928980942018169610, -0.928999447234847620, -0.929017950129026990, -0.929036450700661430, -0.929054948949704860, -0.929073444876110880, -0.929091938479833290, --0.929110429760825810, -0.929128918719042350, -0.929147405354436520, -0.929165889666962120, -0.929184371656573190, -0.929202851323223110, -0.929221328666866020, -0.929239803687455620, --0.929258276384945630, -0.929276746759289950, -0.929295214810442530, -0.929313680538356950, -0.929332143942987240, -0.929350605024287120, -0.929369063782210510, -0.929387520216711230, --0.929405974327743190, -0.929424426115260100, -0.929442875579216120, -0.929461322719564830, -0.929479767536260270, -0.929498210029256370, -0.929516650198506820, -0.929535088043965670, --0.929553523565586850, -0.929571956763324270, -0.929590387637131640, -0.929608816186963120, -0.929627242412772500, -0.929645666314513950, -0.929664087892141060, -0.929682507145608070, --0.929700924074868710, -0.929719338679877110, -0.929737750960587080, -0.929756160916952790, -0.929774568548928040, -0.929792973856466860, -0.929811376839523200, -0.929829777498051180, --0.929848175832004630, -0.929866571841337810, -0.929884965526004410, -0.929903356885958600, -0.929921745921154510, -0.929940132631545960, -0.929958517017087090, -0.929976899077731960, --0.929995278813434580, -0.930013656224148890, -0.930032031309829250, -0.930050404070429380, -0.930068774505903640, -0.930087142616205840, -0.930105508401290250, -0.930123871861110780, --0.930142232995621710, -0.930160591804777060, -0.930178948288530980, -0.930197302446837400, -0.930215654279650690, -0.930234003786924890, -0.930252350968613920, -0.930270695824672260, --0.930289038355053720, -0.930307378559712570, -0.930325716438602960, -0.930344051991679240, -0.930362385218895140, -0.930380716120205340, -0.930399044695563560, -0.930417370944924270, --0.930435694868241400, -0.930454016465469440, -0.930472335736562410, -0.930490652681474570, -0.930508967300159970, -0.930527279592573090, -0.930545589558667950, -0.930563897198398830, --0.930582202511719970, -0.930600505498585640, -0.930618806158950100, -0.930637104492767490, -0.930655400499992070, -0.930673694180578100, -0.930691985534480070, -0.930710274561651900, --0.930728561262048170, -0.930746845635622930, -0.930765127682330770, -0.930783407402125620, -0.930801684794961950, -0.930819959860794130, -0.930838232599576430, -0.930856503011263100, --0.930874771095808520, -0.930893036853166930, -0.930911300283292940, -0.930929561386140580, -0.930947820161664330, -0.930966076609818450, -0.930984330730557530, -0.931002582523835720, --0.931020831989607500, -0.931039079127827130, -0.931057323938449090, -0.931075566421427750, -0.931093806576717480, -0.931112044404272640, -0.931130279904047730, -0.931148513075997220, --0.931166743920075260, -0.931184972436236550, -0.931203198624435350, -0.931221422484626250, -0.931239644016763510, -0.931257863220801730, -0.931276080096695160, -0.931294294644398500, --0.931312506863866020, -0.931330716755052410, -0.931348924317911940, -0.931367129552399090, -0.931385332458468550, -0.931403533036074590, -0.931421731285171810, -0.931439927205714670, --0.931458120797657770, -0.931476312060955490, -0.931494500995562520, -0.931512687601433240, -0.931530871878522350, -0.931549053826784100, -0.931567233446173320, -0.931585410736644470, --0.931603585698152050, -0.931621758330650640, -0.931639928634094950, -0.931658096608439350, -0.931676262253638530, -0.931694425569646990, -0.931712586556419530, -0.931730745213910530, --0.931748901542074680, -0.931767055540866580, -0.931785207210240830, -0.931803356550152010, -0.931821503560554820, -0.931839648241403970, -0.931857790592653830, -0.931875930614259330, --0.931894068306174940, -0.931912203668355480, -0.931930336700755420, -0.931948467403329590, -0.931966595776032580, -0.931984721818819080, -0.932002845531643700, -0.932020966914461240, --0.932039085967226400, -0.932057202689893890, -0.932075317082418310, -0.932093429144754350, -0.932111538876856940, -0.932129646278680670, -0.932147751350180240, -0.932165854091310480, --0.932183954502026070, -0.932202052582281730, -0.932220148332032370, -0.932238241751232490, -0.932256332839837110, -0.932274421597800830, -0.932292508025078570, -0.932310592121624930, --0.932328673887394930, -0.932346753322343180, -0.932364830426424600, -0.932382905199593880, -0.932400977641805960, -0.932419047753015540, -0.932437115533177540, -0.932455180982246780, --0.932473244100178070, -0.932491304886926220, -0.932509363342446050, -0.932527419466692600, -0.932545473259620450, -0.932563524721184640, -0.932581573851340110, -0.932599620650041650, --0.932617665117243980, -0.932635707252902350, -0.932653747056971350, -0.932671784529406020, -0.932689819670161180, -0.932707852479191860, -0.932725882956452760, -0.932743911101899140, --0.932761936915485590, -0.932779960397167260, -0.932797981546899080, -0.932816000364635860, -0.932834016850332740, -0.932852031003944540, -0.932870042825426180, -0.932888052314732820, --0.932906059471819260, -0.932924064296640540, -0.932942066789151810, -0.932960066949307780, -0.932978064777063580, -0.932996060272374250, -0.933014053435194720, -0.933032044265480140, --0.933050032763185430, -0.933068018928265520, -0.933086002760675770, -0.933103984260370890, -0.933121963427306020, -0.933139940261436320, -0.933157914762716700, -0.933175886931102430, --0.933193856766548310, -0.933211824269009620, -0.933229789438441260, -0.933247752274798500, -0.933265712778036380, -0.933283670948109930, -0.933301626784974300, -0.933319580288584750, --0.933337531458896090, -0.933355480295863680, -0.933373426799442460, -0.933391370969587800, -0.933409312806254610, -0.933427252309398270, -0.933445189478973700, -0.933463124314936170, --0.933481056817240810, -0.933498986985842880, -0.933516914820697430, -0.933534840321759710, -0.933552763488984860, -0.933570684322328150, -0.933588602821744720, -0.933606518987189720, --0.933624432818618510, -0.933642344315986140, -0.933660253479247970, -0.933678160308359150, -0.933696064803274940, -0.933713966963950480, -0.933731866790341260, -0.933749764282402190, --0.933767659440088880, -0.933785552263356360, -0.933803442752159980, -0.933821330906454920, -0.933839216726196630, -0.933857100211340160, -0.933874981361841110, -0.933892860177654490, --0.933910736658735700, -0.933928610805040190, -0.933946482616523020, -0.933964352093139770, -0.933982219234845590, -0.934000084041595850, -0.934017946513345910, -0.934035806650051040, --0.934053664451666710, -0.934071519918148300, -0.934089373049450940, -0.934107223845530240, -0.934125072306341450, -0.934142918431840050, -0.934160762221981190, -0.934178603676720560, --0.934196442796013330, -0.934214279579815180, -0.934232114028081150, -0.934249946140766950, -0.934267775917827840, -0.934285603359219170, -0.934303428464896670, -0.934321251234815460, --0.934339071668931260, -0.934356889767199330, -0.934374705529575130, -0.934392518956014160, -0.934410330046472000, -0.934428138800903920, -0.934445945219265490, -0.934463749301512210, --0.934481551047599560, -0.934499350457483000, -0.934517147531118250, -0.934534942268460340, -0.934552734669465310, -0.934570524734088300, -0.934588312462285130, -0.934606097854011050, --0.934623880909221770, -0.934641661627872770, -0.934659440009919630, -0.934677216055317950, -0.934694989764023100, -0.934712761135990890, -0.934730530171176690, -0.934748296869536200, --0.934766061231025010, -0.934783823255598610, -0.934801582943212690, -0.934819340293822850, -0.934837095307384570, -0.934854847983853540, -0.934872598323185480, -0.934890346325335850, --0.934908091990260370, -0.934925835317914730, -0.934943576308254420, -0.934961314961235250, -0.934979051276812800, -0.934996785254942560, -0.935014516895580570, -0.935032246198682080, --0.935049973164203130, -0.935067697792099200, -0.935085420082325980, -0.935103140034839300, -0.935120857649594740, -0.935138572926548010, -0.935156285865654800, -0.935173996466870940, --0.935191704730152120, -0.935209410655453930, -0.935227114242732300, -0.935244815491942830, -0.935262514403041420, -0.935280210975983680, -0.935297905210725420, -0.935315597107222340, --0.935333286665430360, -0.935350973885305080, -0.935368658766802420, -0.935386341309878080, -0.935404021514487870, -0.935421699380587610, -0.935439374908133110, -0.935457048097080190, --0.935474718947384650, -0.935492387459002320, -0.935510053631888990, -0.935527717466000610, -0.935545378961292860, -0.935563038117721680, -0.935580694935242870, -0.935598349413812370, --0.935616001553385980, -0.935633651353919630, -0.935651298815369010, -0.935668943937690290, -0.935686586720839260, -0.935704227164771640, -0.935721865269443450, -0.935739501034810630, --0.935757134460829090, -0.935774765547454650, -0.935792394294643340, -0.935810020702350980, -0.935827644770533710, -0.935845266499147230, -0.935862885888147590, -0.935880502937490700, --0.935898117647132600, -0.935915730017029210, -0.935933340047136460, -0.935950947737410390, -0.935968553087807020, -0.935986156098282060, -0.936003756768791880, -0.936021355099292300, --0.936038951089739340, -0.936056544740089040, -0.936074136050297210, -0.936091725020320230, -0.936109311650113800, -0.936126895939634160, -0.936144477888837260, -0.936162057497679110, --0.936179634766115880, -0.936197209694103580, -0.936214782281598160, -0.936232352528555970, -0.936249920434932710, -0.936267486000684770, -0.936285049225768050, -0.936302610110138710, --0.936320168653752780, -0.936337724856566630, -0.936355278718535970, -0.936372830239617260, -0.936390379419766440, -0.936407926258939540, -0.936425470757093040, -0.936443012914182640, --0.936460552730164820, -0.936478090204995620, -0.936495625338631290, -0.936513158131027760, -0.936530688582141390, -0.936548216691928230, -0.936565742460344630, -0.936583265887346530, --0.936600786972890400, -0.936618305716932280, -0.936635822119428420, -0.936653336180334860, -0.936670847899608080, -0.936688357277204120, -0.936705864313079340, -0.936723369007189890, --0.936740871359492020, -0.936758371369942000, -0.936775869038495970, -0.936793364365110290, -0.936810857349741230, -0.936828347992345050, -0.936845836292877880, -0.936863322251296200, --0.936880805867556180, -0.936898287141614270, -0.936915766073426530, -0.936933242662949420, -0.936950716910139090, -0.936968188814952140, -0.936985658377344600, -0.937003125597272950, --0.937020590474693440, -0.937038053009562550, -0.937055513201836440, -0.937072971051471690, -0.937090426558424450, -0.937107879722651080, -0.937125330544108070, -0.937142779022751670, --0.937160225158538360, -0.937177668951424400, -0.937195110401366380, -0.937212549508320560, -0.937229986272243410, -0.937247420693091190, -0.937264852770820500, -0.937282282505387590, --0.937299709896749160, -0.937317134944861240, -0.937334557649680660, -0.937351978011163540, -0.937369396029266610, -0.937386811703946000, -0.937404225035158520, -0.937421636022860440, --0.937439044667008230, -0.937456450967558470, -0.937473854924467550, -0.937491256537692050, -0.937508655807188340, -0.937526052732913010, -0.937543447314822530, -0.937560839552873500, --0.937578229447022290, -0.937595616997225600, -0.937613002203439790, -0.937630385065621460, -0.937647765583727200, -0.937665143757713590, -0.937682519587537010, -0.937699893073154270, --0.937717264214521620, -0.937734633011595990, -0.937751999464333630, -0.937769363572691360, -0.937786725336625550, -0.937804084756093110, -0.937821441831050430, -0.937838796561454080, --0.937856148947260770, -0.937873498988426980, -0.937890846684909630, -0.937908192036664980, -0.937925535043649950, -0.937942875705821020, -0.937960214023135010, -0.937977549995548390, --0.937994883623017970, -0.938012214905500240, -0.938029543842952010, -0.938046870435329970, -0.938064194682590720, -0.938081516584690860, -0.938098836141587400, -0.938116153353236730, --0.938133468219595760, -0.938150780740621080, -0.938168090916269510, -0.938185398746497650, -0.938202704231262290, -0.938220007370520140, -0.938237308164228010, -0.938254606612342610, --0.938271902714820750, -0.938289196471619010, -0.938306487882694330, -0.938323776948003510, -0.938341063667503140, -0.938358348041150260, -0.938375630068901350, -0.938392909750713430, --0.938410187086543220, -0.938427462076347530, -0.938444734720083160, -0.938462005017707050, -0.938479272969175880, -0.938496538574446590, -0.938513801833475880, -0.938531062746220670, --0.938548321312637770, -0.938565577532684100, -0.938582831406316600, -0.938600082933491840, -0.938617332114166980, -0.938634578948298710, -0.938651823435844080, -0.938669065576759780, --0.938686305371002950, -0.938703542818530300, -0.938720777919298750, -0.938738010673265340, -0.938755241080386880, -0.938772469140620290, -0.938789694853922500, -0.938806918220250530, --0.938824139239561210, -0.938841357911811670, -0.938858574236958620, -0.938875788214959210, -0.938892999845770240, -0.938910209129348750, -0.938927416065651780, -0.938944620654636350, --0.938961822896259290, -0.938979022790477740, -0.938996220337248500, -0.939013415536528840, -0.939030608388275570, -0.939047798892445830, -0.939064987048996550, -0.939082172857884870, --0.939099356319067600, -0.939116537432502120, -0.939133716198145120, -0.939150892615953970, -0.939168066685885590, -0.939185238407897030, -0.939202407781945410, -0.939219574807987680, --0.939236739485981080, -0.939253901815882530, -0.939271061797649300, -0.939288219431238410, -0.939305374716607020, -0.939322527653712050, -0.939339678242510970, -0.939356826482960480, --0.939373972375018070, -0.939391115918640660, -0.939408257113785510, -0.939425395960409640, -0.939442532458470430, -0.939459666607924680, -0.939476798408729890, -0.939493927860843070, --0.939511054964221490, -0.939528179718822300, -0.939545302124602520, -0.939562422181519640, -0.939579539889530580, -0.939596655248592820, -0.939613768258663270, -0.939630878919699320, --0.939647987231658210, -0.939665093194497090, -0.939682196808173330, -0.939699298072643960, -0.939716396987866460, -0.939733493553797870, -0.939750587770395550, -0.939767679637616870, --0.939784769155418860, -0.939801856323759120, -0.939818941142594570, -0.939836023611882680, -0.939853103731580710, -0.939870181501646140, -0.939887256922036010, -0.939904329992707680, --0.939921400713618630, -0.939938469084726000, -0.939955535105987280, -0.939972598777359610, -0.939989660098800580, -0.940006719070267230, -0.940023775691717240, -0.940040829963107670, --0.940057881884396210, -0.940074931455539890, -0.940091978676496300, -0.940109023547222700, -0.940126066067676680, -0.940143106237815380, -0.940160144057596400, -0.940177179526976880, --0.940194212645914630, -0.940211243414366680, -0.940228271832290740, -0.940245297899644170, -0.940262321616384230, -0.940279342982468510, -0.940296361997854380, -0.940313378662499530, --0.940330392976361010, -0.940347404939396720, -0.940364414551563720, -0.940381421812819810, -0.940398426723122350, -0.940415429282428830, -0.940432429490696610, -0.940449427347883390, --0.940466422853946660, -0.940483416008843780, -0.940500406812532440, -0.940517395264970020, -0.940534381366114110, -0.940551365115922300, -0.940568346514352170, -0.940585325561360990, --0.940602302256906550, -0.940619276600946350, -0.940636248593438080, -0.940653218234339010, -0.940670185523607040, -0.940687150461199440, -0.940704113047074130, -0.940721073281188480, --0.940738031163500190, -0.940754986693966730, -0.940771939872545810, -0.940788890699195020, -0.940805839173872170, -0.940822785296534510, -0.940839729067140080, -0.940856670485646250, --0.940873609552010710, -0.940890546266191170, -0.940907480628145330, -0.940924412637830660, -0.940941342295204990, -0.940958269600226100, -0.940975194552851390, -0.940992117153038770, --0.941009037400745820, -0.941025955295930250, -0.941042870838549870, -0.941059784028562270, -0.941076694865925160, -0.941093603350596440, -0.941110509482533500, -0.941127413261694470, --0.941144314688036830, -0.941161213761518510, -0.941178110482096990, -0.941195004849730400, -0.941211896864376120, -0.941228786525992180, -0.941245673834536280, -0.941262558789966120, --0.941279441392239620, -0.941296321641314490, -0.941313199537148650, -0.941330075079699680, -0.941346948268925620, -0.941363819104784170, -0.941380687587233140, -0.941397553716230350, --0.941414417491733820, -0.941431278913701040, -0.941448137982090260, -0.941464994696859070, -0.941481849057965390, -0.941498701065367040, -0.941515550719022040, -0.941532398018887990, --0.941549242964923150, -0.941566085557085100, -0.941582925795331870, -0.941599763679621280, -0.941616599209911250, -0.941633432386159820, -0.941650263208324790, -0.941667091676364090, --0.941683917790235640, -0.941700741549897360, -0.941717562955307290, -0.941734382006423340, -0.941751198703203340, -0.941768013045605420, -0.941784825033587400, -0.941801634667107420, --0.941818441946123190, -0.941835246870593060, -0.941852049440474630, -0.941868849655726150, -0.941885647516305550, -0.941902443022170850, -0.941919236173280110, -0.941936026969591110, --0.941952815411062240, -0.941969601497651190, -0.941986385229316210, -0.942003166606015130, -0.942019945627706300, -0.942036722294347540, -0.942053496605896990, -0.942070268562312570, --0.942087038163552660, -0.942103805409575060, -0.942120570300338020, -0.942137332835799480, -0.942154093015917680, -0.942170850840650550, -0.942187606309956350, -0.942204359423793100, --0.942221110182119070, -0.942237858584892170, -0.942254604632070670, -0.942271348323612590, -0.942288089659476190, -0.942304828639619510, -0.942321565264000790, -0.942338299532578190, --0.942355031445309850, -0.942371761002153920, -0.942388488203068530, -0.942405213048011950, -0.942421935536942310, -0.942438655669817880, -0.942455373446596800, -0.942472088867237320, --0.942488801931697600, -0.942505512639935870, -0.942522220991910300, -0.942538926987579240, -0.942555630626900840, -0.942572331909833360, -0.942589030836335050, -0.942605727406364170, --0.942622421619879080, -0.942639113476837820, -0.942655802977198750, -0.942672490120920250, -0.942689174907960450, -0.942705857338277720, -0.942722537411830430, -0.942739215128576720, --0.942755890488475080, -0.942772563491483530, -0.942789234137560770, -0.942805902426664730, -0.942822568358754110, -0.942839231933786940, -0.942855893151721800, -0.942872552012516850, --0.942889208516130560, -0.942905862662521190, -0.942922514451647210, -0.942939163883466990, -0.942955810957938790, -0.942972455675021080, -0.942989098034672240, -0.943005738036850730, --0.943022375681514700, -0.943039010968622860, -0.943055643898133460, -0.943072274470004970, -0.943088902684195760, -0.943105528540664320, -0.943122152039369000, -0.943138773180268400, --0.943155391963320770, -0.943172008388484810, -0.943188622455718660, -0.943205234164981030, -0.943221843516230280, -0.943238450509425010, -0.943255055144523460, -0.943271657421484440, --0.943288257340266220, -0.943304854900827270, -0.943321450103126290, -0.943338042947121650, -0.943354633432771930, -0.943371221560035610, -0.943387807328871290, -0.943404390739237320, --0.943420971791092410, -0.943437550484395150, -0.943454126819103900, -0.943470700795177360, -0.943487272412574240, -0.943503841671252670, -0.943520408571171700, -0.943536973112289680, --0.943553535294565200, -0.943570095117956860, -0.943586652582423250, -0.943603207687923160, -0.943619760434414870, -0.943636310821857280, -0.943652858850208890, -0.943669404519428380, --0.943685947829474240, -0.943702488780305380, -0.943719027371880180, -0.943735563604157560, -0.943752097477095870, -0.943768628990654060, -0.943785158144790580, -0.943801684939464370, --0.943818209374633790, -0.943834731450257760, -0.943851251166294760, -0.943867768522703820, -0.943884283519443310, -0.943900796156472270, -0.943917306433749050, -0.943933814351232690, --0.943950319908881790, -0.943966823106655030, -0.943983323944511230, -0.943999822422409100, -0.944016318540307540, -0.944032812298165050, -0.944049303695940530, -0.944065792733592810, --0.944082279411080580, -0.944098763728362660, -0.944115245685397840, -0.944131725282144840, -0.944148202518562680, -0.944164677394609850, -0.944181149910245380, -0.944197620065428070, --0.944214087860116740, -0.944230553294270080, -0.944247016367847140, -0.944263477080806600, -0.944279935433107400, -0.944296391424708340, -0.944312845055568340, -0.944329296325646220, --0.944345745234900780, -0.944362191783291060, -0.944378635970775760, -0.944395077797314020, -0.944411517262864430, -0.944427954367386250, -0.944444389110837950, -0.944460821493178890, --0.944477251514367570, -0.944493679174363330, -0.944510104473124780, -0.944526527410610940, -0.944542947986780850, -0.944559366201593310, -0.944575782055007470, -0.944592195546982150, --0.944608606677476260, -0.944625015446448950, -0.944641421853859020, -0.944657825899665520, -0.944674227583827570, -0.944690626906303900, -0.944707023867053850, -0.944723418466036140, --0.944739810703209890, -0.944756200578534040, -0.944772588091967850, -0.944788973243470000, -0.944805356032999870, -0.944821736460516260, -0.944838114525978320, -0.944854490229345090, --0.944870863570575700, -0.944887234549629080, -0.944903603166464490, -0.944919969421040730, -0.944936333313317170, -0.944952694843252840, -0.944969054010806550, -0.944985410815937790, --0.945001765258605460, -0.945018117338768730, -0.945034467056386610, -0.945050814411418470, -0.945067159403823240, -0.945083502033560060, -0.945099842300588190, -0.945116180204866650, --0.945132515746354710, -0.945148848925011500, -0.945165179740796170, -0.945181508193667860, -0.945197834283585720, -0.945214158010509120, -0.945230479374396970, -0.945246798375208750, --0.945263115012903610, -0.945279429287440460, -0.945295741198778900, -0.945312050746877960, -0.945328357931696890, -0.945344662753194840, -0.945360965211331280, -0.945377265306065140, --0.945393563037356000, -0.945409858405162780, -0.945426151409445080, -0.945442442050161920, -0.945458730327272680, -0.945475016240736600, -0.945491299790512940, -0.945507580976561070, --0.945523859798840350, -0.945540136257309820, -0.945556410351929060, -0.945572682082657100, -0.945588951449453650, -0.945605218452277740, -0.945621483091088730, -0.945637745365846110, --0.945654005276509110, -0.945670262823037120, -0.945686518005389280, -0.945702770823525380, -0.945719021277404370, -0.945735269366985930, -0.945751515092229320, -0.945767758453093910, --0.945783999449539060, -0.945800238081524250, -0.945816474349008730, -0.945832708251952200, -0.945848939790313810, -0.945865168964053040, -0.945881395773129350, -0.945897620217502340, --0.945913842297131160, -0.945930062011975270, -0.945946279361994380, -0.945962494347147740, -0.945978706967394830, -0.945994917222695240, -0.946011125113008330, -0.946027330638293470, --0.946043533798510470, -0.946059734593618470, -0.946075933023577290, -0.946092129088346170, -0.946108322787884810, -0.946124514122152590, -0.946140703091109090, -0.946156889694713790, --0.946173073932926380, -0.946189255805706120, -0.946205435313012930, -0.946221612454805960, -0.946237787231045120, -0.946253959641689790, -0.946270129686699430, -0.946286297366033870, --0.946302462679652460, -0.946318625627515010, -0.946334786209580890, -0.946350944425809910, -0.946367100276161440, -0.946383253760595400, -0.946399404879071040, -0.946415553631548280, --0.946431700017986600, -0.946447844038345700, -0.946463985692585160, -0.946480124980664690, -0.946496261902543770, -0.946512396458182410, -0.946528528647539890, -0.946544658470576120, --0.946560785927250680, -0.946576911017523280, -0.946593033741353730, -0.946609154098701390, -0.946625272089526290, -0.946641387713788030, -0.946657500971446190, -0.946673611862460680, --0.946689720386791110, -0.946705826544397280, -0.946721930335238880, -0.946738031759275510, -0.946754130816467310, -0.946770227506773530, -0.946786321830154430, -0.946802413786569260, --0.946818503375978280, -0.946834590598340960, -0.946850675453617120, -0.946866757941766670, -0.946882838062749310, -0.946898915816524860, -0.946914991203053000, -0.946931064222293890, --0.946947134874206900, -0.946963203158752150, -0.946979269075889360, -0.946995332625578560, -0.947011393807779210, -0.947027452622451580, -0.947043509069555140, -0.947059563149050040, --0.947075614860895980, -0.947091664205052860, -0.947107711181480630, -0.947123755790139190, -0.947139798030988240, -0.947155837903987830, -0.947171875409097860, -0.947187910546278160, --0.947203943315488630, -0.947219973716689420, -0.947236001749840130, -0.947252027414900890, -0.947268050711831620, -0.947284071640592140, -0.947300090201142480, -0.947316106393442660, --0.947332120217452500, -0.947348131673132030, -0.947364140760441400, -0.947380147479340180, -0.947396151829788760, -0.947412153811746930, -0.947428153425174720, -0.947444150670032070, --0.947460145546279110, -0.947476138053875760, -0.947492128192782060, -0.947508115962958030, -0.947524101364363710, -0.947540084396959250, -0.947556065060704440, -0.947572043355559450, --0.947588019281484390, -0.947603992838439320, -0.947619964026384260, -0.947635932845279360, -0.947651899295084420, -0.947667863375759920, -0.947683825087265670, -0.947699784429561930, --0.947715741402608720, -0.947731696006366090, -0.947747648240794270, -0.947763598105853310, -0.947779545601503350, -0.947795490727704530, -0.947811433484416990, -0.947827373871600880, --0.947843311889216330, -0.947859247537223500, -0.947875180815582640, -0.947891111724253670, -0.947907040263197050, -0.947922966432372730, -0.947938890231741050, -0.947954811661262050, --0.947970730720896100, -0.947986647410603340, -0.948002561730344030, -0.948018473680078190, -0.948034383259766190, -0.948050290469368170, -0.948066195308844620, -0.948082097778155440, --0.948097997877261010, -0.948113895606121580, -0.948129790964697520, -0.948145683952948850, -0.948161574570836050, -0.948177462818319380, -0.948193348695358870, -0.948209232201915220, --0.948225113337948230, -0.948240992103418610, -0.948256868498286500, -0.948272742522512260, -0.948288614176056030, -0.948304483458878410, -0.948320350370939420, -0.948336214912199770, --0.948352077082619370, -0.948367936882158920, -0.948383794310778570, -0.948399649368438790, -0.948415502055099720, -0.948431352370722070, -0.948447200315265970, -0.948463045888691900, --0.948478889090960230, -0.948494729922031320, -0.948510568381865650, -0.948526404470423360, -0.948542238187665250, -0.948558069533551480, -0.948573898508042520, -0.948589725111098850, --0.948605549342680820, -0.948621371202748920, -0.948637190691263730, -0.948653007808185400, -0.948668822553474620, -0.948684634927091760, -0.948700444928997300, -0.948716252559151710, --0.948732057817515570, -0.948747860704049260, -0.948763661218713250, -0.948779459361468120, -0.948795255132274360, -0.948811048531092440, -0.948826839557882940, -0.948842628212606340, --0.948858414495223010, -0.948874198405693870, -0.948889979943979060, -0.948905759110039380, -0.948921535903835320, -0.948937310325327470, -0.948953082374476180, -0.948968852051242370, --0.948984619355586200, -0.949000384287468690, -0.949016146846850090, -0.949031907033691220, -0.949047664847952550, -0.949063420289594780, -0.949079173358578280, -0.949094924054864060, --0.949110672378412400, -0.949126418329184100, -0.949142161907139740, -0.949157903112240020, -0.949173641944445530, -0.949189378403716870, -0.949205112490014820, -0.949220844203299880, --0.949236573543532970, -0.949252300510674550, -0.949268025104685440, -0.949283747325526230, -0.949299467173157720, -0.949315184647540390, -0.949330899748635270, -0.949346612476402730, --0.949362322830803800, -0.949378030811798950, -0.949393736419349210, -0.949409439653414950, -0.949425140513957210, -0.949440839000936450, -0.949456535114313720, -0.949472228854049690, --0.949487920220104980, -0.949503609212440590, -0.949519295831017130, -0.949534980075795400, -0.949550661946736210, -0.949566341443800370, -0.949582018566948680, -0.949597693316141970, --0.949613365691341030, -0.949629035692506670, -0.949644703319599710, -0.949660368572580960, -0.949676031451411330, -0.949691691956051630, -0.949707350086462680, -0.949723005842605380, --0.949738659224440450, -0.949754310231929020, -0.949769958865031790, -0.949785605123709690, -0.949801249007923510, -0.949816890517634180, -0.949832529652802740, -0.949848166413389870, --0.949863800799356620, -0.949879432810663780, -0.949895062447272510, -0.949910689709143500, -0.949926314596237780, -0.949941937108516270, -0.949957557245940000, -0.949973175008469670, --0.949988790396066540, -0.950004403408691410, -0.950020014046305320, -0.950035622308869070, -0.950051228196343800, -0.950066831708690440, -0.950082432845870130, -0.950098031607843670, --0.950113627994572110, -0.950129222006016460, -0.950144813642137760, -0.950160402902897050, -0.950175989788255350, -0.950191574298173690, -0.950207156432613000, -0.950222736191534520, --0.950238313574899180, -0.950253888582668020, -0.950269461214802160, -0.950285031471262640, -0.950300599352010500, -0.950316164857006980, -0.950331727986212900, -0.950347288739589620, --0.950362847117098060, -0.950378403118699480, -0.950393956744354780, -0.950409507994025240, -0.950425056867671870, -0.950440603365255930, -0.950456147486738460, -0.950471689232080590, --0.950487228601243570, -0.950502765594188340, -0.950518300210876350, -0.950533832451268430, -0.950549362315326160, -0.950564889803010350, -0.950580414914282360, -0.950595937649103220, --0.950611458007434410, -0.950626975989236840, -0.950642491594471890, -0.950658004823100590, -0.950673515675084400, -0.950689024150384370, -0.950704530248961840, -0.950720033970777980, --0.950735535315794020, -0.950751034283971230, -0.950766530875270740, -0.950782025089654040, -0.950797516927082250, -0.950813006387516650, -0.950828493470918580, -0.950843978177249300, --0.950859460506469970, -0.950874940458542040, -0.950890418033426780, -0.950905893231085430, -0.950921366051479370, -0.950936836494569950, -0.950952304560318320, -0.950967770248686060, --0.950983233559634320, -0.950998694493124460, -0.951014153049117850, -0.951029609227575960, -0.951045063028460040, -0.951060514451731340, -0.951075963497351460, -0.951091410165281650, --0.951106854455483370, -0.951122296367917790, -0.951137735902546690, -0.951153173059331000, -0.951168607838232540, -0.951184040239212550, -0.951199470262232500, -0.951214897907253660, --0.951230323174237610, -0.951245746063145830, -0.951261166573939550, -0.951276584706580500, -0.951292000461029910, -0.951307413837249260, -0.951322824835200250, -0.951338233454844030, --0.951353639696142280, -0.951369043559056490, -0.951384445043547910, -0.951399844149578340, -0.951415240877109160, -0.951430635226101940, -0.951446027196518050, -0.951461416788319080, --0.951476804001466610, -0.951492188835922130, -0.951507571291647090, -0.951522951368603210, -0.951538329066751950, -0.951553704386054910, -0.951569077326473440, -0.951584447887969480, --0.951599816070504260, -0.951615181874039600, -0.951630545298536860, -0.951645906343957850, -0.951661265010264160, -0.951676621297417150, -0.951691975205378630, -0.951707326734110180, --0.951722675883573510, -0.951738022653729980, -0.951753367044541500, -0.951768709055969550, -0.951784048687975950, -0.951799385940522050, -0.951814720813569770, -0.951830053307080700, --0.951845383421016540, -0.951860711155338770, -0.951876036510009400, -0.951891359484989820, -0.951906680080241930, -0.951921998295727210, -0.951937314131407590, -0.951952627587244750, --0.951967938663200290, -0.951983247359235900, -0.951998553675313500, -0.952013857611394680, -0.952029159167441130, -0.952044458343414780, -0.952059755139277210, -0.952075049554990340, --0.952090341590515750, -0.952105631245815490, -0.952120918520850900, -0.952136203415584250, -0.952151485929976890, -0.952166766063990980, -0.952182043817588090, -0.952197319190730030, --0.952212592183378730, -0.952227862795495980, -0.952243131027043500, -0.952258396877983300, -0.952273660348277100, -0.952288921437886680, -0.952304180146773980, -0.952319436474900800, --0.952334690422229070, -0.952349941988720470, -0.952365191174337270, -0.952380437979040930, -0.952395682402793490, -0.952410924445556860, -0.952426164107292970, -0.952441401387963630, --0.952456636287530860, -0.952471868805956360, -0.952487098943202270, -0.952502326699230410, -0.952517552074002790, -0.952532775067481240, -0.952547995679627780, -0.952563213910404330, --0.952578429759772800, -0.952593643227695350, -0.952608854314133560, -0.952624063019049780, -0.952639269342405840, -0.952654473284163750, -0.952669674844285330, -0.952684874022732830, --0.952700070819468170, -0.952715265234453270, -0.952730457267650270, -0.952745646919021080, -0.952760834188527750, -0.952776019076132410, -0.952791201581796980, -0.952806381705483480, --0.952821559447154080, -0.952836734806770890, -0.952851907784295740, -0.952867078379690870, -0.952882246592918310, -0.952897412423940100, -0.952912575872718380, -0.952927736939215180, --0.952942895623392740, -0.952958051925212880, -0.952973205844638070, -0.952988357381630120, -0.953003506536151400, -0.953018653308163820, -0.953033797697629640, -0.953048939704510990, --0.953064079328769910, -0.953079216570368650, -0.953094351429269460, -0.953109483905434260, -0.953124613998825420, -0.953139741709405080, -0.953154867037135370, -0.953169989981978330, --0.953185110543896540, -0.953200228722851930, -0.953215344518806630, -0.953230457931723120, -0.953245568961563320, -0.953260677608289700, -0.953275783871864290, -0.953290887752249460, --0.953305989249407460, -0.953321088363300430, -0.953336185093890730, -0.953351279441140620, -0.953366371405012130, -0.953381460985467830, -0.953396548182469880, -0.953411632995980530, --0.953426715425962130, -0.953441795472376950, -0.953456873135187230, -0.953471948414355340, -0.953487021309843640, -0.953502091821614380, -0.953517159949629820, -0.953532225693852430, --0.953547289054244460, -0.953562350030768170, -0.953577408623386140, -0.953592464832060500, -0.953607518656753750, -0.953622570097428120, -0.953637619154046210, -0.953652665826570160, --0.953667710114962430, -0.953682752019185510, -0.953697791539201640, -0.953712828674973310, -0.953727863426462870, -0.953742895793632810, -0.953757925776445580, -0.953772953374863340, --0.953787978588848890, -0.953803001418364490, -0.953818021863372500, -0.953833039923835610, -0.953848055599715970, -0.953863068890976270, -0.953878079797578770, -0.953893088319486160, --0.953908094456660800, -0.953923098209065290, -0.953938099576661980, -0.953953098559413460, -0.953968095157282090, -0.953983089370230570, -0.953998081198221270, -0.954013070641216880, --0.954028057699179640, -0.954043042372072380, -0.954058024659857450, -0.954073004562497550, -0.954087982079955150, -0.954102957212192630, -0.954117929959172880, -0.954132900320858180, --0.954147868297211430, -0.954162833888194780, -0.954177797093771150, -0.954192757913903010, -0.954207716348553060, -0.954222672397683660, -0.954237626061257730, -0.954252577339237630, --0.954267526231586170, -0.954282472738265720, -0.954297416859239300, -0.954312358594469170, -0.954327297943918350, -0.954342234907549100, -0.954357169485324340, -0.954372101677206650, --0.954387031483158730, -0.954401958903143170, -0.954416883937122760, -0.954431806585060110, -0.954446726846918000, -0.954461644722659040, -0.954476560212245920, -0.954491473315641440, --0.954506384032808300, -0.954521292363709200, -0.954536198308306830, -0.954551101866564000, -0.954566003038443410, -0.954580901823907760, -0.954595798222919960, -0.954610692235442590, --0.954625583861438480, -0.954640473100870410, -0.954655359953701210, -0.954670244419893570, -0.954685126499410290, -0.954700006192214290, -0.954714883498268270, -0.954729758417534930, --0.954744630949977300, -0.954759501095558070, -0.954774368854240050, -0.954789234225986160, -0.954804097210759100, -0.954818957808521880, -0.954833816019237220, -0.954848671842868040, --0.954863525279377230, -0.954878376328727520, -0.954893224990881920, -0.954908071265803240, -0.954922915153454400, -0.954937756653798210, -0.954952595766797700, -0.954967432492415670, --0.954982266830615050, -0.954997098781358860, -0.955011928344609800, -0.955026755520331010, -0.955041580308485180, -0.955056402709035580, -0.955071222721944890, -0.955086040347176150, --0.955100855584692270, -0.955115668434456390, -0.955130478896431100, -0.955145286970579880, -0.955160092656865300, -0.955174895955250510, -0.955189696865698430, -0.955204495388172200, --0.955219291522634630, -0.955234085269048960, -0.955248876627377900, -0.955263665597584800, -0.955278452179632480, -0.955293236373484070, -0.955308018179102600, -0.955322797596451000, --0.955337574625492400, -0.955352349266189950, -0.955367121518506560, -0.955381891382405370, -0.955396658857849520, -0.955411423944801940, -0.955426186643225870, -0.955440946953084240, --0.955455704874340280, -0.955470460406957050, -0.955485213550897770, -0.955499964306125270, -0.955514712672603020, -0.955529458650293930, -0.955544202239161260, -0.955558943439167920, --0.955573682250277390, -0.955588418672452590, -0.955603152705656770, -0.955617884349853060, -0.955632613605004620, -0.955647340471074690, -0.955662064948026300, -0.955676787035822930, --0.955691506734427380, -0.955706224043803230, -0.955720938963913410, -0.955735651494721280, -0.955750361636189980, -0.955765069388282870, -0.955779774750963100, -0.955794477724193790, --0.955809178307938320, -0.955823876502159940, -0.955838572306821900, -0.955853265721887340, -0.955867956747319610, -0.955882645383082100, -0.955897331629137930, -0.955912015485450350, --0.955926696951982850, -0.955941376028698550, -0.955956052715560830, -0.955970727012532940, -0.955985398919578230, -0.956000068436660080, -0.956014735563741720, -0.956029400300786540, --0.956044062647757880, -0.956058722604618990, -0.956073380171333360, -0.956088035347864240, -0.956102688134175090, -0.956117338530229070, -0.956131986535989850, -0.956146632151420590, --0.956161275376484880, -0.956175916211145840, -0.956190554655367060, -0.956205190709111920, -0.956219824372343760, -0.956234455645026070, -0.956249084527122210, -0.956263711018595640, --0.956278335119409850, -0.956292956829528200, -0.956307576148914150, -0.956322193077531190, -0.956336807615342680, -0.956351419762312190, -0.956366029518403100, -0.956380636883578990, --0.956395241857803220, -0.956409844441039490, -0.956424444633250940, -0.956439042434401480, -0.956453637844454250, -0.956468230863373070, -0.956482821491121290, -0.956497409727662400, --0.956511995572960070, -0.956526579026977570, -0.956541160089678820, -0.956555738761027060, -0.956570315040986000, -0.956584888929519090, -0.956599460426590050, -0.956614029532162350, --0.956628596246199560, -0.956643160568665160, -0.956657722499523080, -0.956672282038736440, -0.956686839186269290, -0.956701393942084980, -0.956715946306147200, -0.956730496278419550, --0.956745043858865610, -0.956759589047449180, -0.956774131844133620, -0.956788672248882870, -0.956803210261660380, -0.956817745882429850, -0.956832279111154980, -0.956846809947799470, --0.956861338392326790, -0.956875864444700850, -0.956890388104885250, -0.956904909372843780, -0.956919428248539820, -0.956933944731937490, -0.956948458823000170, -0.956962970521691770, --0.956977479827975870, -0.956991986741816400, -0.957006491263176830, -0.957020993392021070, -0.957035493128312820, -0.957049990472015890, -0.957064485423093970, -0.957078977981510870, --0.957093468147230290, -0.957107955920216020, -0.957122441300431890, -0.957136924287841580, -0.957151404882409020, -0.957165883084097890, -0.957180358892872230, -0.957194832308695510, --0.957209303331531760, -0.957223771961344670, -0.957238238198098280, -0.957252702041756160, -0.957267163492282470, -0.957281622549640670, -0.957296079213795000, -0.957310533484708960, --0.957324985362346670, -0.957339434846671940, -0.957353881937648590, -0.957368326635240630, -0.957382768939411650, -0.957397208850125910, -0.957411646367347100, -0.957426081491039250, --0.957440514221166050, -0.957454944557691650, -0.957469372500579840, -0.957483798049794670, -0.957498221205300040, -0.957512641967059760, -0.957527060335037870, -0.957541476309198390, --0.957555889889505240, -0.957570301075922340, -0.957584709868413600, -0.957599116266943160, -0.957613520271474950, -0.957627921881972880, -0.957642321098401080, -0.957656717920723490, --0.957671112348904010, -0.957685504382906780, -0.957699894022695840, -0.957714281268235100, -0.957728666119488700, -0.957743048576420560, -0.957757428638994930, -0.957771806307175620, --0.957786181580926880, -0.957800554460212620, -0.957814924944996980, -0.957829293035244110, -0.957843658730917920, -0.957858022031982560, -0.957872382938402270, -0.957886741450140860, --0.957901097567162680, -0.957915451289431790, -0.957929802616912300, -0.957944151549568250, -0.957958498087363770, -0.957972842230263130, -0.957987183978230350, -0.958001523331229570, --0.958015860289225030, -0.958030194852180880, -0.958044527020061150, -0.958058856792830090, -0.958073184170451950, -0.958087509152890870, -0.958101831740110990, -0.958116151932076550, --0.958130469728751710, -0.958144785130100710, -0.958159098136087680, -0.958173408746677000, -0.958187716961832690, -0.958202022781519220, -0.958216326205700630, -0.958230627234341270, --0.958244925867405280, -0.958259222104857030, -0.958273515946660660, -0.958287807392780520, -0.958302096443180870, -0.958316383097825960, -0.958330667356680150, -0.958344949219707590, --0.958359228686872730, -0.958373505758139730, -0.958387780433473060, -0.958402052712836850, -0.958416322596195580, -0.958430590083513500, -0.958444855174754970, -0.958459117869884140, --0.958473378168865690, -0.958487636071663650, -0.958501891578242730, -0.958516144688566940, -0.958530395402600770, -0.958544643720308680, -0.958558889641654920, -0.958573133166603970, --0.958587374295120200, -0.958601613027167950, -0.958615849362711710, -0.958630083301715840, -0.958644314844144700, -0.958658543989962860, -0.958672770739134590, -0.958686995091624470, --0.958701217047396750, -0.958715436606416120, -0.958729653768646830, -0.958743868534053360, -0.958758080902600280, -0.958772290874251980, -0.958786498448973010, -0.958800703626727760, --0.958814906407480790, -0.958829106791196480, -0.958843304777839410, -0.958857500367374050, -0.958871693559765090, -0.958885884354976680, -0.958900072752973730, -0.958914258753720490, --0.958928442357181670, -0.958942623563321720, -0.958956802372105230, -0.958970978783496690, -0.958985152797460770, -0.958999324413961960, -0.959013493632964840, -0.959027660454433880, --0.959041824878333890, -0.959055986904629340, -0.959070146533284820, -0.959084303764264900, -0.959098458597534180, -0.959112611033057340, -0.959126761070798970, -0.959140908710723770, --0.959155053952796210, -0.959169196796981090, -0.959183337243242900, -0.959197475291546420, -0.959211610941856250, -0.959225744194137090, -0.959239875048353400, -0.959254003504470210, --0.959268129562451890, -0.959282253222263350, -0.959296374483869060, -0.959310493347233950, -0.959324609812322590, -0.959338723879099690, -0.959352835547529930, -0.959366944817578120, --0.959381051689208950, -0.959395156162387130, -0.959409258237077460, -0.959423357913244620, -0.959437455190853440, -0.959451550069868600, -0.959465642550254790, -0.959479732631976940, --0.959493820314999860, -0.959507905599288000, -0.959521988484806520, -0.959536068971520110, -0.959550147059393450, -0.959564222748391480, -0.959578296038478880, -0.959592366929620580, --0.959606435421781370, -0.959620501514926060, -0.959634565209019570, -0.959648626504026600, -0.959662685399912060, -0.959676741896640760, -0.959690795994177610, -0.959704847692487650, --0.959718896991535340, -0.959732943891285940, -0.959746988391704140, -0.959761030492754850, -0.959775070194403000, -0.959789107496613390, -0.959803142399351160, -0.959817174902581010, --0.959831205006267840, -0.959845232710376810, -0.959859258014872600, -0.959873280919720240, -0.959887301424884650, -0.959901319530330980, -0.959915335236023790, -0.959929348541928460, --0.959943359448009680, -0.959957367954232480, -0.959971374060561880, -0.959985377766962800, -0.959999379073400270, -0.960013377979839320, -0.960027374486244980, -0.960041368592582160, --0.960055360298816000, -0.960069349604911300, -0.960083336510833330, -0.960097321016546880, -0.960111303122017310, -0.960125282827209330, -0.960139260132088280, -0.960153235036618980, --0.960167207540766680, -0.960181177644496180, -0.960195145347772950, -0.960209110650561800, -0.960223073552827770, -0.960237034054536200, -0.960250992155651910, -0.960264947856140250, --0.960278901155966150, -0.960292852055094850, -0.960306800553491380, -0.960320746651120990, -0.960334690347948610, -0.960348631643939580, -0.960362570539058940, -0.960376507033271930, --0.960390441126543590, -0.960404372818839170, -0.960418302110123800, -0.960432229000362740, -0.960446153489521000, -0.960460075577563970, -0.960473995264456650, -0.960487912550164410, --0.960501827434652510, -0.960515739917885860, -0.960529649999829930, -0.960543557680449860, -0.960557462959710890, -0.960571365837578290, -0.960585266314017310, -0.960599164388993070, --0.960613060062470940, -0.960626953334416170, -0.960640844204794120, -0.960654732673569820, -0.960668618740708750, -0.960682502406176140, -0.960696383669937260, -0.960710262531957350, --0.960724138992201880, -0.960738013050636110, -0.960751884707225170, -0.960765753961934640, -0.960779620814729670, -0.960793485265575730, -0.960807347314437950, -0.960821206961281820, --0.960835064206072680, -0.960848919048776010, -0.960862771489356840, -0.960876621527780860, -0.960890469164013330, -0.960904314398019600, -0.960918157229765040, -0.960931997659215220, --0.960945835686335290, -0.960959671311090840, -0.960973504533447100, -0.960987335353369660, -0.961001163770823900, -0.961014989785775260, -0.961028813398189130, -0.961042634608030970, --0.961056453415266130, -0.961070269819860210, -0.961084083821778680, -0.961097895420986890, -0.961111704617450440, -0.961125511411134560, -0.961139315802005070, -0.961153117790027210, --0.961166917375166570, -0.961180714557388630, -0.961194509336658950, -0.961208301712942910, -0.961222091686206200, -0.961235879256414180, -0.961249664423532550, -0.961263447187526650, --0.961277227548362200, -0.961291005506004660, -0.961304781060419720, -0.961318554211572640, -0.961332324959429330, -0.961346093303955150, -0.961359859245115690, -0.961373622782876640, --0.961387383917203580, -0.961401142648061980, -0.961414898975417540, -0.961428652899235850, -0.961442404419482480, -0.961456153536123240, -0.961469900249123490, -0.961483644558449040, --0.961497386464065460, -0.961511125965938460, -0.961524863064033620, -0.961538597758316630, -0.961552330048753070, -0.961566059935308750, -0.961579787417949250, -0.961593512496640380, --0.961607235171347610, -0.961620955442036850, -0.961634673308673690, -0.961648388771223720, -0.961662101829652950, -0.961675812483926750, -0.961689520734011150, -0.961703226579871730, --0.961716930021474180, -0.961730631058784420, -0.961744329691768040, -0.961758025920390720, -0.961771719744618500, -0.961785411164416850, -0.961799100179751790, -0.961812786790588900, --0.961826470996894000, -0.961840152798633000, -0.961853832195771590, -0.961867509188275570, -0.961881183776110870, -0.961894855959243290, -0.961908525737638300, -0.961922193111262260, --0.961935858080080530, -0.961949520644059250, -0.961963180803164120, -0.961976838557361160, -0.961990493906615950, -0.962004146850894640, -0.962017797390162910, -0.962031445524386690, --0.962045091253531770, -0.962058734577564300, -0.962072375496449860, -0.962086014010154480, -0.962099650118644070, -0.962113283821884660, -0.962126915119841940, -0.962140544012481950, --0.962154170499770590, -0.962167794581673790, -0.962181416258157560, -0.962195035529187730, -0.962208652394730300, -0.962222266854751320, -0.962235878909216580, -0.962249488558092110, --0.962263095801344060, -0.962276700638938220, -0.962290303070840620, -0.962303903097017190, -0.962317500717434160, -0.962331095932057230, -0.962344688740852660, -0.962358279143786350, --0.962371867140824340, -0.962385452731932540, -0.962399035917077320, -0.962412616696224350, -0.962426195069339910, -0.962439771036390000, -0.962453344597340550, -0.962466915752157930, --0.962480484500807810, -0.962494050843256680, -0.962507614779470220, -0.962521176309414920, -0.962534735433056450, -0.962548292150361310, -0.962561846461295390, -0.962575398365824950, --0.962588947863915910, -0.962602494955534520, -0.962616039640646900, -0.962629581919219210, -0.962643121791217470, -0.962656659256608040, -0.962670194315356830, -0.962683726967430320, --0.962697257212794310, -0.962710785051415270, -0.962724310483259240, -0.962737833508292450, -0.962751354126481050, -0.962764872337791290, -0.962778388142189410, -0.962791901539641450, --0.962805412530113760, -0.962818921113572480, -0.962832427289983970, -0.962845931059314370, -0.962859432421530050, -0.962872931376597020, -0.962886427924481760, -0.962899922065150290, --0.962913413798569210, -0.962926903124704410, -0.962940390043522500, -0.962953874554989490, -0.962967356659071850, -0.962980836355735840, -0.962994313644947700, -0.963007788526673790, --0.963021261000880370, -0.963034731067533900, -0.963048198726600520, -0.963061663978046710, -0.963075126821838600, -0.963088587257942890, -0.963102045286325480, -0.963115500906953190, --0.963128954119791940, -0.963142404924808400, -0.963155853321968850, -0.963169299311239730, -0.963182742892587210, -0.963196184065977960, -0.963209622831378120, -0.963223059188754390, --0.963236493138072910, -0.963249924679300260, -0.963263353812402800, -0.963276780537346890, -0.963290204854099000, -0.963303626762625600, -0.963317046262893270, -0.963330463354868160, --0.963343878038517070, -0.963357290313806120, -0.963370700180702030, -0.963384107639171150, -0.963397512689180060, -0.963410915330695120, -0.963424315563682910, -0.963437713388109910, --0.963451108803942690, -0.963464501811147620, -0.963477892409691390, -0.963491280599540370, -0.963504666380661120, -0.963518049753020240, -0.963531430716584200, -0.963544809271319690, --0.963558185417193070, -0.963571559154170920, -0.963584930482219940, -0.963598299401306700, -0.963611665911397570, -0.963625030012459470, -0.963638391704458640, -0.963651750987361890, --0.963665107861135680, -0.963678462325746830, -0.963691814381161690, -0.963705164027347180, -0.963718511264269660, -0.963731856091895820, -0.963745198510192360, -0.963758538519125960, --0.963771876118663220, -0.963785211308770820, -0.963798544089415340, -0.963811874460563490, -0.963825202422181950, -0.963838527974237410, -0.963851851116696580, -0.963865171849526030, --0.963878490172692670, -0.963891806086162980, -0.963905119589903880, -0.963918430683881830, -0.963931739368063870, -0.963945045642416450, -0.963958349506906510, -0.963971650961500610, --0.963984950006165690, -0.963998246640868190, -0.964011540865575280, -0.964024832680253410, -0.964038122084869500, -0.964051409079390240, -0.964064693663782560, -0.964077975838013130, --0.964091255602048670, -0.964104532955856190, -0.964117807899402270, -0.964131080432653830, -0.964144350555577790, -0.964157618268140840, -0.964170883570309780, -0.964184146462051530, --0.964197406943332890, -0.964210665014120780, -0.964223920674382010, -0.964237173924083480, -0.964250424763191890, -0.964263673191674390, -0.964276919209497540, -0.964290162816628600, --0.964303404013034050, -0.964316642798681120, -0.964329879173536630, -0.964343113137567260, -0.964356344690740270, -0.964369573833022240, -0.964382800564380420, -0.964396024884781600, --0.964409246794192710, -0.964422466292580660, -0.964435683379912480, -0.964448898056155080, -0.964462110321275380, -0.964475320175240510, -0.964488527618017290, -0.964501732649572730, --0.964514935269873860, -0.964528135478887600, -0.964541333276581090, -0.964554528662921130, -0.964567721637874960, -0.964580912201409510, -0.964594100353491690, -0.964607286094088750, --0.964620469423167370, -0.964633650340695040, -0.964646828846638440, -0.964660004940964820, -0.964673178623641210, -0.964686349894634640, -0.964699518753912130, -0.964712685201440930, --0.964725849237187960, -0.964739010861120350, -0.964752170073205240, -0.964765326873409770, -0.964778481261700850, -0.964791633238045840, -0.964804782802411660, -0.964817929954765560, --0.964831074695074560, -0.964844217023306030, -0.964857356939426870, -0.964870494443404340, -0.964883629535205570, -0.964896762214797700, -0.964909892482147980, -0.964923020337223440, --0.964936145779991430, -0.964949268810419090, -0.964962389428473570, -0.964975507634121990, -0.964988623427331600, -0.965001736808069780, -0.965014847776303530, -0.965027956332000230, --0.965041062475127000, -0.965054166205651100, -0.965067267523539880, -0.965080366428760380, -0.965093462921279950, -0.965106557001065960, -0.965119648668085530, -0.965132737922306030, --0.965145824763694590, -0.965158909192218690, -0.965171991207845470, -0.965185070810542280, -0.965198148000276370, -0.965211222777015100, -0.965224295140725830, -0.965237365091375810, --0.965250432628932290, -0.965263497753362840, -0.965276560464634500, -0.965289620762714850, -0.965302678647571020, -0.965315734119170710, -0.965328787177480940, -0.965341837822469180, --0.965354886054102800, -0.965367931872349370, -0.965380975277176030, -0.965394016268550150, -0.965407054846439290, -0.965420091010810830, -0.965433124761632120, -0.965446156098870630, --0.965459185022493730, -0.965472211532468760, -0.965485235628763430, -0.965498257311344980, -0.965511276580180770, -0.965524293435238490, -0.965537307876485400, -0.965550319903889060, --0.965563329517416970, -0.965576336717036470, -0.965589341502715250, -0.965602343874420570, -0.965615343832120110, -0.965628341375781240, -0.965641336505371540, -0.965654329220858480, --0.965667319522209630, -0.965680307409392480, -0.965693292882374490, -0.965706275941123350, -0.965719256585606420, -0.965732234815791510, -0.965745210631645870, -0.965758184033137290, --0.965771155020233140, -0.965784123592901220, -0.965797089751108890, -0.965810053494823960, -0.965823014824013780, -0.965835973738646160, -0.965848930238688560, -0.965861884324108690, --0.965874835994874000, -0.965887785250952310, -0.965900732092311090, -0.965913676518918020, -0.965926618530740910, -0.965939558127747120, -0.965952495309904460, -0.965965430077180610, --0.965978362429543160, -0.965991292366959800, -0.966004219889398220, -0.966017144996826000, -0.966030067689211070, -0.966042987966520770, -0.966055905828723250, -0.966068821275785750, --0.966081734307676300, -0.966094644924362480, -0.966107553125812090, -0.966120458911992830, -0.966133362282872390, -0.966146263238418460, -0.966159161778599060, -0.966172057903381680, --0.966184951612734100, -0.966197842906624140, -0.966210731785019590, -0.966223618247888270, -0.966236502295197860, -0.966249383926916170, -0.966262263143011000, -0.966275139943450270, --0.966288014328201660, -0.966300886297232990, -0.966313755850512050, -0.966326622988006870, -0.966339487709685030, -0.966352350015514450, -0.966365209905463040, -0.966378067379498610, --0.966390922437588950, -0.966403775079702100, -0.966416625305805630, -0.966429473115867800, -0.966442318509856180, -0.966455161487738800, -0.966468002049483580, -0.966480840195058200, --0.966493675924430810, -0.966506509237569200, -0.966519340134441410, -0.966532168615015120, -0.966544994679258470, -0.966557818327139380, -0.966570639558625770, -0.966583458373685420, --0.966596274772286490, -0.966609088754396880, -0.966621900319984630, -0.966634709469017530, -0.966647516201463720, -0.966660320517291010, -0.966673122416467630, -0.966685921898961410, --0.966698718964740360, -0.966711513613772500, -0.966724305846025870, -0.966737095661468480, -0.966749883060068370, -0.966762668041793560, -0.966775450606611960, -0.966788230754491940, --0.966801008485401180, -0.966813783799307940, -0.966826556696180230, -0.966839327175986200, -0.966852095238693750, -0.966864860884271150, -0.966877624112686410, -0.966890384923907550, --0.966903143317902720, -0.966915899294640060, -0.966928652854087690, -0.966941403996213640, -0.966954152720986060, -0.966966899028373180, -0.966979642918343040, -0.966992384390863660, --0.967005123445903500, -0.967017860083430380, -0.967030594303412650, -0.967043326105818450, -0.967056055490616020, -0.967068782457773280, -0.967081507007258700, -0.967094229139040310, --0.967106948853086460, -0.967119666149365060, -0.967132381027844600, -0.967145093488493200, -0.967157803531279110, -0.967170511156170360, -0.967183216363135420, -0.967195919152142540, --0.967208619523159620, -0.967221317476155360, -0.967234013011097680, -0.967246706127955050, -0.967259396826695590, -0.967272085107287790, -0.967284770969699560, -0.967297454413899580, --0.967310135439855890, -0.967322814047536840, -0.967335490236910790, -0.967348164007945990, -0.967360835360610790, -0.967373504294873570, -0.967386170810702440, -0.967398834908066000, --0.967411496586932370, -0.967424155847270150, -0.967436812689047470, -0.967449467112232670, -0.967462119116794360, -0.967474768702700660, -0.967487415869920040, -0.967500060618420870, --0.967512702948171600, -0.967525342859140600, -0.967537980351296230, -0.967550615424606740, -0.967563248079040930, -0.967575878314566930, -0.967588506131153210, -0.967601131528768140, --0.967613754507380410, -0.967626375066958140, -0.967638993207470040, -0.967651608928884470, -0.967664222231169880, -0.967676833114294640, -0.967689441578227340, -0.967702047622936550, --0.967714651248390510, -0.967727252454557930, -0.967739851241407160, -0.967752447608906770, -0.967765041557025250, -0.967777633085731170, -0.967790222194993000, -0.967802808884779320, --0.967815393155058490, -0.967827975005799310, -0.967840554436970040, -0.967853131448539570, -0.967865706040476170, -0.967878278212748520, -0.967890847965325100, -0.967903415298174700, --0.967915980211265680, -0.967928542704566740, -0.967941102778046350, -0.967953660431673300, -0.967966215665416070, -0.967978768479243360, -0.967991318873123730, -0.968003866847025660, --0.968016412400918070, -0.968028955534769310, -0.968041496248548290, -0.968054034542223500, -0.968066570415763610, -0.968079103869137310, -0.968091634902313200, -0.968104163515260070, --0.968116689707946510, -0.968129213480341200, -0.968141734832412840, -0.968154253764130220, -0.968166770275461940, -0.968179284366376680, -0.968191796036843240, -0.968204305286830320, --0.968216812116306610, -0.968229316525241020, -0.968241818513601920, -0.968254318081358420, -0.968266815228479020, -0.968279309954932720, -0.968291802260688010, -0.968304292145713900, --0.968316779609978970, -0.968329264653452150, -0.968341747276102120, -0.968354227477897790, -0.968366705258807860, -0.968379180618801130, -0.968391653557846510, -0.968404124075912700, --0.968416592172968600, -0.968429057848983030, -0.968441521103924790, -0.968453981937762780, -0.968466440350465810, -0.968478896342002790, -0.968491349912342430, -0.968503801061453730, --0.968516249789305620, -0.968528696095866670, -0.968541139981106140, -0.968553581444992710, -0.968566020487495400, -0.968578457108583040, -0.968590891308224510, -0.968603323086388630, --0.968615752443044540, -0.968628179378161150, -0.968640603891707250, -0.968653025983651770, -0.968665445653963840, -0.968677862902612150, -0.968690277729565950, -0.968702690134793930, --0.968715100118265340, -0.968727507679948860, -0.968739912819813640, -0.968752315537828700, -0.968764715833962950, -0.968777113708185420, -0.968789509160465020, -0.968801902190771000, --0.968814292799072050, -0.968826680985337530, -0.968839066749536130, -0.968851450091637200, -0.968863831011609560, -0.968876209509422440, -0.968888585585044760, -0.968900959238445660, --0.968913330469594050, -0.968925699278459170, -0.968938065665010060, -0.968950429629215740, -0.968962791171045450, -0.968975150290468100, -0.968987506987452840, -0.968999861261968910, --0.969012213113985220, -0.969024562543471020, -0.969036909550395560, -0.969049254134727640, -0.969061596296436730, -0.969073936035491750, -0.969086273351861930, -0.969098608245516410, --0.969110940716424450, -0.969123270764554960, -0.969135598389877510, -0.969147923592360900, -0.969160246371974620, -0.969172566728687570, -0.969184884662469330, -0.969197200173288700, --0.969209513261115040, -0.969221823925917710, -0.969234132167665740, -0.969246437986328590, -0.969258741381875180, -0.969271042354274970, -0.969283340903497100, -0.969295637029511050, --0.969307930732285720, -0.969320222011790690, -0.969332510867994990, -0.969344797300868090, -0.969357081310379230, -0.969369362896497560, -0.969381642059192530, -0.969393918798433510, --0.969406193114189520, -0.969418465006430140, -0.969430734475124510, -0.969443001520242210, -0.969455266141752260, -0.969467528339624240, -0.969479788113827400, -0.969492045464330990, --0.969504300391104580, -0.969516552894117310, -0.969528802973338650, -0.969541050628738080, -0.969553295860284830, -0.969565538667948370, -0.969577779051698060, -0.969590017011503270, --0.969602252547333450, -0.969614485659157980, -0.969626716346946420, -0.969638944610667910, -0.969651170450292140, -0.969663393865788370, -0.969675614857126170, -0.969687833424274890, --0.969700049567204130, -0.969712263285883220, -0.969724474580281550, -0.969736683450368790, -0.969748889896114190, -0.969761093917487550, -0.969773295514458010, -0.969785494686995380, --0.969797691435068890, -0.969809885758648240, -0.969822077657702790, -0.969834267132202220, -0.969846454182116010, -0.969858638807413630, -0.969870821008064650, -0.969883000784038660, --0.969895178135305120, -0.969907353061833620, -0.969919525563593730, -0.969931695640555150, -0.969943863292687110, -0.969956028519959660, -0.969968191322342020, -0.969980351699803900, --0.969992509652314870, -0.970004665179844630, -0.970016818282362750, -0.970028968959838700, -0.970041117212242290, -0.970053263039543090, -0.970065406441710800, -0.970077547418714880, --0.970089685970525140, -0.970101822097111270, -0.970113955798442730, -0.970126087074489330, -0.970138215925220760, -0.970150342350606600, -0.970162466350616650, -0.970174587925220380, --0.970186707074387810, -0.970198823798088420, -0.970210938096291890, -0.970223049968968130, -0.970235159416086730, -0.970247266437617380, -0.970259371033529880, -0.970271473203793920, --0.970283572948379300, -0.970295670267255830, -0.970307765160393080, -0.970319857627760960, -0.970331947669329180, -0.970344035285067630, -0.970356120474945790, -0.970368203238933800, --0.970380283577001230, -0.970392361489118120, -0.970404436975253910, -0.970416510035378650, -0.970428580669462140, -0.970440648877474170, -0.970452714659384650, -0.970464778015163290, --0.970476838944779980, -0.970488897448204550, -0.970500953525406880, -0.970513007176356800, -0.970525058401024320, -0.970537107199379130, -0.970549153571391150, -0.970561197517030290, --0.970573239036266470, -0.970585278129069470, -0.970597314795409340, -0.970609349035255970, -0.970621380848579180, -0.970633410235348880, -0.970645437195535090, -0.970657461729107720, --0.970669483836036790, -0.970681503516292010, -0.970693520769843500, -0.970705535596661280, -0.970717547996715170, -0.970729557969975180, -0.970741565516411220, -0.970753570635993430, --0.970765573328691730, -0.970777573594476140, -0.970789571433316460, -0.970801566845182930, -0.970813559830045470, -0.970825550387874210, -0.970837538518638970, -0.970849524222309970, --0.970861507498857020, -0.970873488348250380, -0.970885466770460060, -0.970897442765455980, -0.970909416333208370, -0.970921387473687280, -0.970933356186862610, -0.970945322472704600, --0.970957286331183280, -0.970969247762268670, -0.970981206765931030, -0.970993163342140360, -0.971005117490866710, -0.971017069212080310, -0.971029018505751300, -0.971040965371849700, --0.971052909810345640, -0.971064851821209380, -0.971076791404410940, -0.971088728559920570, -0.971100663287708390, -0.971112595587744430, -0.971124525459999060, -0.971136452904442390, --0.971148377921044580, -0.971160300509775860, -0.971172220670606380, -0.971184138403506260, -0.971196053708445860, -0.971207966585395430, -0.971219877034324890, -0.971231785055204800, --0.971243690648005200, -0.971255593812696330, -0.971267494549248540, -0.971279392857631980, -0.971291288737816890, -0.971303182189773630, -0.971315073213472440, -0.971326961808883560, --0.971338847975977250, -0.971350731714723860, -0.971362613025093640, -0.971374491907056830, -0.971386368360583790, -0.971398242385644870, -0.971410113982210440, -0.971421983150250520, --0.971433849889735800, -0.971445714200636410, -0.971457576082922710, -0.971469435536565060, -0.971481292561533930, -0.971493147157799440, -0.971504999325332190, -0.971516849064102290, --0.971528696374080350, -0.971540541255236700, -0.971552383707541710, -0.971564223730965740, -0.971576061325479130, -0.971587896491052480, -0.971599729227656030, -0.971611559535260240, --0.971623387413835580, -0.971635212863352530, -0.971647035883781320, -0.971658856475092650, -0.971670674637256760, -0.971682490370244230, -0.971694303674025320, -0.971706114548570810, --0.971717922993850960, -0.971729729009836340, -0.971741532596497310, -0.971753333753804570, -0.971765132481728470, -0.971776928780239470, -0.971788722649308160, -0.971800514088905110, --0.971812303099000680, -0.971824089679565570, -0.971835873830570240, -0.971847655551985160, -0.971859434843781010, -0.971871211705928270, -0.971882986138397520, -0.971894758141159220, --0.971906527714184070, -0.971918294857442520, -0.971930059570905390, -0.971941821854543030, -0.971953581708326130, -0.971965339132225160, -0.971977094126211030, -0.971988846690253980, --0.972000596824324940, -0.972012344528394360, -0.972024089802433040, -0.972035832646411360, -0.972047573060300100, -0.972059311044069950, -0.972071046597691610, -0.972082779721135440, --0.972094510414372560, -0.972106238677373220, -0.972117964510108350, -0.972129687912548610, -0.972141408884664600, -0.972153127426427120, -0.972164843537806740, -0.972176557218774270, --0.972188268469300400, -0.972199977289355920, -0.972211683678911420, -0.972223387637937810, -0.972235089166405660, -0.972246788264285900, -0.972258484931548980, -0.972270179168166050, --0.972281870974107450, -0.972293560349344330, -0.972305247293847260, -0.972316931807587160, -0.972328613890534600, -0.972340293542660610, -0.972351970763935760, -0.972363645554331080, --0.972375317913817260, -0.972386987842365210, -0.972398655339945630, -0.972410320406529420, -0.972421983042087380, -0.972433643246590430, -0.972445301020009370, -0.972456956362314990, --0.972468609273478330, -0.972480259753469970, -0.972491907802261140, -0.972503553419822420, -0.972515196606124950, -0.972526837361139320, -0.972538475684836760, -0.972550111577187960, --0.972561745038163840, -0.972573376067735310, -0.972585004665873500, -0.972596630832549100, -0.972608254567733140, -0.972619875871396530, -0.972631494743510180, -0.972643111184045120, --0.972654725192972250, -0.972666336770262710, -0.972677945915887190, -0.972689552629816820, -0.972701156912022640, -0.972712758762475540, -0.972724358181146440, -0.972735955168006590, --0.972747549723026790, -0.972759141846178070, -0.972770731537431540, -0.972782318796758250, -0.972793903624129100, -0.972805486019515220, -0.972817065982887530, -0.972828643514217270, --0.972840218613475360, -0.972851791280632930, -0.972863361515661110, -0.972874929318530700, -0.972886494689213070, -0.972898057627679220, -0.972909618133900200, -0.972921176207847130, --0.972932731849491140, -0.972944285058803260, -0.972955835835754730, -0.972967384180316590, -0.972978930092459950, -0.972990473572156070, -0.973002014619375970, -0.973013553234090780, --0.973025089416271750, -0.973036623165890010, -0.973048154482916710, -0.973059683367323070, -0.973071209819080130, -0.973082733838159240, -0.973094255424531430, -0.973105774578168050, --0.973117291299040230, -0.973128805587119230, -0.973140317442376060, -0.973151826864782300, -0.973163333854308750, -0.973174838410927000, -0.973186340534608170, -0.973197840225323520, --0.973209337483044170, -0.973220832307741480, -0.973232324699386700, -0.973243814657951180, -0.973255302183406170, -0.973266787275722800, -0.973278269934872430, -0.973289750160826530, --0.973301227953556230, -0.973312703313032770, -0.973324176239227620, -0.973335646732111930, -0.973347114791657250, -0.973358580417834630, -0.973370043610615740, -0.973381504369971620, --0.973392962695873830, -0.973404418588293520, -0.973415872047202260, -0.973427323072571180, -0.973438771664371980, -0.973450217822575680, -0.973461661547153970, -0.973473102838078090, --0.973484541695319390, -0.973495978118849360, -0.973507412108639450, -0.973518843664661020, -0.973530272786885310, -0.973541699475284130, -0.973553123729828500, -0.973564545550490210, --0.973575964937240410, -0.973587381890050900, -0.973598796408892800, -0.973610208493737690, -0.973621618144557170, -0.973633025361322570, -0.973644430144005260, -0.973655832492577030, --0.973667232407009250, -0.973678629887273270, -0.973690024933340780, -0.973701417545183250, -0.973712807722772130, -0.973724195466079020, -0.973735580775075380, -0.973746963649732790, --0.973758344090022820, -0.973769722095917060, -0.973781097667386850, -0.973792470804404010, -0.973803841506939990, -0.973815209774966270, -0.973826575608454650, -0.973837939007376470, --0.973849299971703550, -0.973860658501407240, -0.973872014596459450, -0.973883368256831530, -0.973894719482495170, -0.973906068273422080, -0.973917414629583810, -0.973928758550951960, --0.973940100037498200, -0.973951439089194240, -0.973962775706011750, -0.973974109887922210, -0.973985441634897420, -0.973996770946909060, -0.974008097823928720, -0.974019422265928190, --0.974030744272879060, -0.974042063844753110, -0.974053380981521940, -0.974064695683157340, -0.974076007949631010, -0.974087317780914730, -0.974098625176980090, -0.974109930137798900, --0.974121232663342830, -0.974132532753583800, -0.974143830408493280, -0.974155125628043290, -0.974166418412205530, -0.974177708760951670, -0.974188996674253520, -0.974200282152082870, --0.974211565194411540, -0.974222845801211320, -0.974234123972453900, -0.974245399708111190, -0.974256673008155110, -0.974267943872557220, -0.974279212301289550, -0.974290478294323800, --0.974301741851631880, -0.974313002973185570, -0.974324261658956800, -0.974335517908917260, -0.974346771723039070, -0.974358023101293820, -0.974369272043653640, -0.974380518550090220, --0.974391762620575590, -0.974403004255081420, -0.974414243453579740, -0.974425480216042580, -0.974436714542441630, -0.974447946432748900, -0.974459175886936310, -0.974470402904975770, --0.974481627486839310, -0.974492849632498710, -0.974504069341925900, -0.974515286615093120, -0.974526501451971950, -0.974537713852534630, -0.974548923816752950, -0.974560131344598960, --0.974571336436044660, -0.974582539091062070, -0.974593739309623120, -0.974604937091699820, -0.974616132437264080, -0.974627325346288150, -0.974638515818743830, -0.974649703854603260, --0.974660889453838440, -0.974672072616421300, -0.974683253342324090, -0.974694431631518700, -0.974705607483977170, -0.974716780899671730, -0.974727951878574310, -0.974739120420656910, --0.974750286525891800, -0.974761450194250980, -0.974772611425706590, -0.974783770220230550, -0.974794926577795100, -0.974806080498372360, -0.974817231981934480, -0.974828381028453480, --0.974839527637901490, -0.974850671810250760, -0.974861813545473300, -0.974872952843541250, -0.974884089704426860, -0.974895224128102370, -0.974906356114539690, -0.974917485663711170, --0.974928612775588840, -0.974939737450145060, -0.974950859687351960, -0.974961979487181660, -0.974973096849606420, -0.974984211774598490, -0.974995324262129870, -0.975006434312173150, --0.975017541924700250, -0.975028647099683510, -0.975039749837095070, -0.975050850136907400, -0.975061947999092520, -0.975073043423622780, -0.975084136410470430, -0.975095226959607710, --0.975106315071006980, -0.975117400744640370, -0.975128483980480350, -0.975139564778499170, -0.975150643138668950, -0.975161719060962160, -0.975172792545351160, -0.975183863591808090, --0.975194932200305400, -0.975205998370815340, -0.975217062103310270, -0.975228123397762660, -0.975239182254144630, -0.975250238672428660, -0.975261292652587100, -0.975272344194592300, --0.975283393298416730, -0.975294439964032530, -0.975305484191412390, -0.975316525980528430, -0.975327565331353230, -0.975338602243859040, -0.975349636718018330, -0.975360668753803670, --0.975371698351187200, -0.975382725510141600, -0.975393750230639010, -0.975404772512652230, -0.975415792356153390, -0.975426809761115180, -0.975437824727509840, -0.975448837255309950, --0.975459847344487980, -0.975470854995016510, -0.975481860206867780, -0.975492862980014470, -0.975503863314428950, -0.975514861210083790, -0.975525856666951460, -0.975536849685004540, --0.975547840264215370, -0.975558828404556650, -0.975569814106000970, -0.975580797368520660, -0.975591778192088420, -0.975602756576676610, -0.975613732522258030, -0.975624706028805130, --0.975635677096290400, -0.975646645724686510, -0.975657611913965940, -0.975668575664101370, -0.975679536975065380, -0.975690495846830540, -0.975701452279369550, -0.975712406272654760, --0.975723357826659090, -0.975734306941354990, -0.975745253616715160, -0.975756197852712060, -0.975767139649318600, -0.975778079006507260, -0.975789015924250710, -0.975799950402521650, --0.975810882441292660, -0.975821812040536530, -0.975832739200225840, -0.975843663920333280, -0.975854586200831540, -0.975865506041693420, -0.975876423442891380, -0.975887338404398450, --0.975898250926187090, -0.975909161008230220, -0.975920068650500290, -0.975930973852970230, -0.975941876615612710, -0.975952776938400660, -0.975963674821306530, -0.975974570264303230, --0.975985463267363460, -0.975996353830460130, -0.976007241953565920, -0.976018127636653520, -0.976029010879695850, -0.976039891682665580, -0.976050770045535750, -0.976061645968278820, --0.976072519450867810, -0.976083390493275530, -0.976094259095474870, -0.976105125257438420, -0.976115988979139200, -0.976126850260550020, -0.976137709101643770, -0.976148565502393150, --0.976159419462771180, -0.976170270982750550, -0.976181120062304400, -0.976191966701405400, -0.976202810900026470, -0.976213652658140530, -0.976224491975720370, -0.976235328852739110, --0.976246163289169470, -0.976256995284984440, -0.976267824840156840, -0.976278651954659790, -0.976289476628465990, -0.976300298861548680, -0.976311118653880430, -0.976321936005434490, --0.976332750916183660, -0.976343563386101070, -0.976354373415159400, -0.976365181003331920, -0.976375986150591400, -0.976386788856910990, -0.976397589122263600, -0.976408386946622240, --0.976419182329959830, -0.976429975272249510, -0.976440765773464390, -0.976451553833577180, -0.976462339452561110, -0.976473122630389210, -0.976483903367034610, -0.976494681662470110, --0.976505457516668950, -0.976516230929604160, -0.976527001901248750, -0.976537770431575860, -0.976548536520558620, -0.976559300168169940, -0.976570061374383070, -0.976580820139171020, --0.976591576462506940, -0.976602330344363830, -0.976613081784715060, -0.976623830783533430, -0.976634577340792290, -0.976645321456464770, -0.976656063130523780, -0.976666802362942790, --0.976677539153694710, -0.976688273502752890, -0.976699005410090250, -0.976709734875680140, -0.976720461899495680, -0.976731186481510140, -0.976741908621696520, -0.976752628320028290, --0.976763345576478370, -0.976774060391020100, -0.976784772763626740, -0.976795482694271410, -0.976806190182927250, -0.976816895229567830, -0.976827597834166060, -0.976838297996695300, --0.976848995717128800, -0.976859690995439790, -0.976870383831601630, -0.976881074225587450, -0.976891762177370620, -0.976902447686924250, -0.976913130754221930, -0.976923811379236670, --0.976934489561941950, -0.976945165302311010, -0.976955838600317210, -0.976966509455933660, -0.976977177869133960, -0.976987843839891230, -0.976998507368178950, -0.977009168453970340, --0.977019827097238890, -0.977030483297957830, -0.977041137056100630, -0.977051788371640530, -0.977062437244551000, -0.977073083674805280, -0.977083727662376940, -0.977094369207239240, --0.977105008309365640, -0.977115644968729490, -0.977126279185304260, -0.977136910959063300, -0.977147540289980080, -0.977158167178028060, -0.977168791623180490, -0.977179413625411050, --0.977190033184693110, -0.977200650301000010, -0.977211264974305330, -0.977221877204582420, -0.977232486991804870, -0.977243094335946140, -0.977253699236979580, -0.977264301694878880, --0.977274901709617280, -0.977285499281168590, -0.977296094409506040, -0.977306687094603330, -0.977317277336433810, -0.977327865134971160, -0.977338450490188860, -0.977349033402060360, --0.977359613870559360, -0.977370191895659320, -0.977380767477333710, -0.977391340615556330, -0.977401911310300520, -0.977412479561539870, -0.977423045369248070, -0.977433608733398680, --0.977444169653965300, -0.977454728130921380, -0.977465284164240720, -0.977475837753896790, -0.977486388899863390, -0.977496937602113980, -0.977507483860622140, -0.977518027675361670, --0.977528569046306140, -0.977539107973429130, -0.977549644456704340, -0.977560178496105550, -0.977570710091606120, -0.977581239243180080, -0.977591765950800880, -0.977602290214442340, --0.977612812034078020, -0.977623331409681610, -0.977633848341226910, -0.977644362828687610, -0.977654874872037390, -0.977665384471250070, -0.977675891626299200, -0.977686396337158590, --0.977696898603802040, -0.977707398426203240, -0.977717895804335880, -0.977728390738173860, -0.977738883227690870, -0.977749373272860600, -0.977759860873656960, -0.977770346030053530, --0.977780828742024430, -0.977791309009543140, -0.977801786832583560, -0.977812262211119610, -0.977822735145124970, -0.977833205634573430, -0.977843673679438920, -0.977854139279695220, --0.977864602435316250, -0.977875063146275700, -0.977885521412547480, -0.977895977234105480, -0.977906430610923530, -0.977916881542975510, -0.977927330030235350, -0.977937776072676730, --0.977948219670273790, -0.977958660823000200, -0.977969099530830000, -0.977979535793737090, -0.977989969611695380, -0.978000400984678660, -0.978010829912660860, -0.978021256395616210, --0.978031680433518180, -0.978042102026341120, -0.978052521174058720, -0.978062937876645110, -0.978073352134074090, -0.978083763946319680, -0.978094173313355800, -0.978104580235156670, --0.978114984711695890, -0.978125386742947800, -0.978135786328886090, -0.978146183469485120, -0.978156578164718570, -0.978166970414560580, -0.978177360218985160, -0.978187747577966340, --0.978198132491478130, -0.978208514959494680, -0.978218894981989880, -0.978229272558937770, -0.978239647690312570, -0.978250020376088210, -0.978260390616238930, -0.978270758410738520, --0.978281123759561220, -0.978291486662681180, -0.978301847120072400, -0.978312205131709020, -0.978322560697565070, -0.978332913817614780, -0.978343264491832180, -0.978353612720191500, --0.978363958502666660, -0.978374301839232020, -0.978384642729861590, -0.978394981174529500, -0.978405317173210000, -0.978415650725877220, -0.978425981832505290, -0.978436310493068450, --0.978446636707540840, -0.978456960475896590, -0.978467281798109930, -0.978477600674155120, -0.978487917104006180, -0.978498231087637560, -0.978508542625023400, -0.978518851716137840, --0.978529158360955110, -0.978539462559449570, -0.978549764311595240, -0.978560063617366580, -0.978570360476737840, -0.978580654889683150, -0.978590946856176760, -0.978601236376193010, --0.978611523449706260, -0.978621808076690640, -0.978632090257120500, -0.978642369990970100, -0.978652647278213880, -0.978662922118825880, -0.978673194512780680, -0.978683464460052500, --0.978693731960615710, -0.978703997014444440, -0.978714259621513260, -0.978724519781796420, -0.978734777495268380, -0.978745032761903280, -0.978755285581675570, -0.978765535954559730, --0.978775783880530100, -0.978786029359560940, -0.978796272391626700, -0.978806512976701740, -0.978816751114760520, -0.978826986805777510, -0.978837220049726950, -0.978847450846583310, --0.978857679196321160, -0.978867905098914750, -0.978878128554338530, -0.978888349562566980, -0.978898568123574670, -0.978908784237335850, -0.978918997903825080, -0.978929209123016840, --0.978939417894885590, -0.978949624219405790, -0.978959828096551910, -0.978970029526298520, -0.978980228508619990, -0.978990425043490880, -0.979000619130885760, -0.979010810770779010, --0.979020999963145290, -0.979031186707959080, -0.979041371005194950, -0.979051552854827260, -0.979061732256830800, -0.979071909211179920, -0.979082083717849330, -0.979092255776813580, --0.979102425388047150, -0.979112592551524610, -0.979122757267220640, -0.979132919535109720, -0.979143079355166530, -0.979153236727365650, -0.979163391651681760, -0.979173544128089320, --0.979183694156562920, -0.979193841737077460, -0.979203986869607300, -0.979214129554127120, -0.979224269790611720, -0.979234407579035570, -0.979244542919373460, -0.979254675811599970, --0.979264806255689790, -0.979274934251617600, -0.979285059799358090, -0.979295182898885950, -0.979305303550175750, -0.979315421753202410, -0.979325537507940380, -0.979335650814364690, --0.979345761672449690, -0.979355870082170400, -0.979365976043501400, -0.979376079556417480, -0.979386180620893440, -0.979396279236903760, -0.979406375404423550, -0.979416469123427280, --0.979426560393889870, -0.979436649215786100, -0.979446735589090680, -0.979456819513778500, -0.979466900989824140, -0.979476980017202630, -0.979487056595888640, -0.979497130725856980, --0.979507202407082560, -0.979517271639540050, -0.979527338423204390, -0.979537402758050350, -0.979547464644052850, -0.979557524081186680, -0.979567581069426760, -0.979577635608747780, --0.979587687699124740, -0.979597737340532570, -0.979607784532945950, -0.979617829276340000, -0.979627871570689310, -0.979637911415969010, -0.979647948812154000, -0.979657983759219090, --0.979668016257139170, -0.979678046305889170, -0.979688073905444100, -0.979698099055778870, -0.979708121756868390, -0.979718142008687680, -0.979728159811211530, -0.979738175164414970, --0.979748188068273020, -0.979758198522760580, -0.979768206527852570, -0.979778212083524110, -0.979788215189750120, -0.979798215846505620, -0.979808214053765610, -0.979818209811504910, --0.979828203119698870, -0.979838193978322170, -0.979848182387350050, -0.979858168346757540, -0.979868151856519540, -0.979878132916611080, -0.979888111527007500, -0.979898087687683490, --0.979908061398614310, -0.979918032659774840, -0.979928001471140450, -0.979937967832686050, -0.979947931744386660, -0.979957893206217510, -0.979967852218153520, -0.979977808780170050, --0.979987762892241990, -0.979997714554344480, -0.980007663766452760, -0.980017610528541860, -0.980027554840586900, -0.980037496702563020, -0.980047436114445450, -0.980057373076209330, --0.980067307587829670, -0.980077239649281840, -0.980087169260540850, -0.980097096421581940, -0.980107021132380350, -0.980116943392911220, -0.980126863203149570, -0.980136780563070960, --0.980146695472650320, -0.980156607931862880, -0.980166517940683990, -0.980176425499088790, -0.980186330607052510, -0.980196233264550410, -0.980206133471557830, -0.980216031228049790, --0.980225926534001760, -0.980235819389388750, -0.980245709794186350, -0.980255597748369680, -0.980265483251913980, -0.980275366304794500, -0.980285246906986710, -0.980295125058465720, --0.980305000759207010, -0.980314874009185710, -0.980324744808377280, -0.980334613156756960, -0.980344479054300110, -0.980354342500982080, -0.980364203496778220, -0.980374062041663770, --0.980383918135614210, -0.980393771778604870, -0.980403622970611120, -0.980413471711608200, -0.980423318001571680, -0.980433161840476910, -0.980443003228299140, -0.980452842165013940, --0.980462678650596660, -0.980472512685022670, -0.980482344268267300, -0.980492173400306140, -0.980502000081114540, -0.980511824310667970, -0.980521646088941770, -0.980531465415911520, --0.980541282291552570, -0.980551096715840400, -0.980560908688750570, -0.980570718210258430, -0.980580525280339450, -0.980590329898969220, -0.980600132066123060, -0.980609931781776690, --0.980619729045905440, -0.980629523858484900, -0.980639316219490520, -0.980649106128897770, -0.980658893586682350, -0.980668678592819700, -0.980678461147285410, -0.980688241250054830, --0.980698018901103750, -0.980707794100407540, -0.980717566847941870, -0.980727337143682320, -0.980737104987604470, -0.980746870379683780, -0.980756633319895930, -0.980766393808216510, --0.980776151844621080, -0.980785907429085340, -0.980795660561584740, -0.980805411242095080, -0.980815159470591840, -0.980824905247050680, -0.980834648571447310, -0.980844389443757290, --0.980854127863956200, -0.980863863832019960, -0.980873597347924010, -0.980883328411644050, -0.980893057023155770, -0.980902783182434850, -0.980912506889456860, -0.980922228144197830, --0.980931946946632990, -0.980941663296738490, -0.980951377194489660, -0.980961088639862530, -0.980970797632832570, -0.980980504173375790, -0.980990208261467540, -0.980999909897083850, --0.981009609080200410, -0.981019305810793000, -0.981029000088837200, -0.981038691914308920, -0.981048381287183970, -0.981058068207438130, -0.981067752675046980, -0.981077434689986540, --0.981087114252232500, -0.981096791361760650, -0.981106466018546790, -0.981116138222566820, -0.981125807973796450, -0.981135475272211570, -0.981145140117788080, -0.981154802510501690, --0.981164462450328290, -0.981174119937243790, -0.981183774971223890, -0.981193427552244590, -0.981203077680281700, -0.981212725355311230, -0.981222370577308880, -0.981232013346250540, --0.981241653662112250, -0.981251291524869780, -0.981260926934499070, -0.981270559890976110, -0.981280190394276720, -0.981289818444376790, -0.981299444041252360, -0.981309067184879420, --0.981318687875233690, -0.981328306112291270, -0.981337921896028090, -0.981347535226420040, -0.981357146103443270, -0.981366754527073560, -0.981376360497287050, -0.981385964014059530, --0.981395565077367140, -0.981405163687185890, -0.981414759843491690, -0.981424353546260560, -0.981433944795468530, -0.981443533591091710, -0.981453119933106020, -0.981462703821487590, --0.981472285256212330, -0.981481864237256360, -0.981491440764595710, -0.981501014838206510, -0.981510586458064770, -0.981520155624146520, -0.981529722336427990, -0.981539286594884990, --0.981548848399493970, -0.981558407750230730, -0.981567964647071410, -0.981577519089992250, -0.981587071078969250, -0.981596620613978570, -0.981606167694996420, -0.981615712321998850, --0.981625254494961850, -0.981634794213861910, -0.981644331478674800, -0.981653866289377010, -0.981663398645944430, -0.981672928548353420, -0.981682455996580110, -0.981691980990600620, --0.981701503530391210, -0.981711023615927990, -0.981720541247187330, -0.981730056424145240, -0.981739569146777960, -0.981749079415061840, -0.981758587228973020, -0.981768092588487630, --0.981777595493582120, -0.981787095944232520, -0.981796593940415300, -0.981806089482106460, -0.981815582569282470, -0.981825073201919580, -0.981834561379993920, -0.981844047103481940, --0.981853530372359780, -0.981863011186603800, -0.981872489546190330, -0.981881965451095520, -0.981891438901295930, -0.981900909896767700, -0.981910378437487190, -0.981919844523430730, --0.981929308154574690, -0.981938769330895410, -0.981948228052369140, -0.981957684318972230, -0.981967138130681260, -0.981976589487472350, -0.981986038389321970, -0.981995484836206580, --0.982004928828102420, -0.982014370364985960, -0.982023809446833430, -0.982033246073621520, -0.982042680245326480, -0.982052111961924770, -0.982061541223392730, -0.982070968029706840, --0.982080392380843550, -0.982089814276779330, -0.982099233717490420, -0.982108650702953610, -0.982118065233145040, -0.982127477308041400, -0.982136886927619020, -0.982146294091854390, --0.982155698800724060, -0.982165101054204510, -0.982174500852272200, -0.982183898194903590, -0.982193293082075260, -0.982202685513763660, -0.982212075489945490, -0.982221463010596980, --0.982230848075694830, -0.982240230685215600, -0.982249610839135870, -0.982258988537431990, -0.982268363780080640, -0.982277736567058410, -0.982287106898341870, -0.982296474773907580, --0.982305840193732020, -0.982315203157791970, -0.982324563666063800, -0.982333921718524290, -0.982343277315149920, -0.982352630455917470, -0.982361981140803310, -0.982371329369784330, --0.982380675142836890, -0.982390018459937900, -0.982399359321063700, -0.982408697726191220, -0.982418033675297010, -0.982427367168357660, -0.982436698205349850, -0.982446026786250370, --0.982455352911035810, -0.982464676579682950, -0.982473997792168260, -0.982483316548468650, -0.982492632848560700, -0.982501946692421190, -0.982511258080026820, -0.982520567011354370, --0.982529873486380430, -0.982539177505081800, -0.982548479067435250, -0.982557778173417500, -0.982567074823005320, -0.982576369016175400, -0.982585660752904650, -0.982594950033169660, --0.982604236856947310, -0.982613521224214410, -0.982622803134947650, -0.982632082589123930, -0.982641359586719940, -0.982650634127712590, -0.982659906212078770, -0.982669175839794960, --0.982678443010838400, -0.982687707725185660, -0.982696969982813640, -0.982706229783699260, -0.982715487127819200, -0.982724742015150590, -0.982733994445669890, -0.982743244419354460, --0.982752491936180750, -0.982761736996125790, -0.982770979599166590, -0.982780219745279850, -0.982789457434442680, -0.982798692666631780, -0.982807925441824160, -0.982817155759996730, --0.982826383621126400, -0.982835609025190180, -0.982844831972164880, -0.982854052462027510, -0.982863270494754970, -0.982872486070324290, -0.982881699188712380, -0.982890909849896240, --0.982900118053852800, -0.982909323800559060, -0.982918527089992170, -0.982927727922128790, -0.982936926296946070, -0.982946122214421130, -0.982955315674530870, -0.982964506677252330, --0.982973695222562500, -0.982982881310438430, -0.982992064940857110, -0.983001246113795690, -0.983010424829231180, -0.983019601087140480, -0.983028774887500960, -0.983037946230289390, --0.983047115115482930, -0.983056281543058690, -0.983065445512993800, -0.983074607025265390, -0.983083766079850260, -0.983092922676725880, -0.983102076815869030, -0.983111228497257180, --0.983120377720867130, -0.983129524486676120, -0.983138668794661390, -0.983147810644799950, -0.983156950037068930, -0.983166086971445590, -0.983175221447907030, -0.983184353466430410, --0.983193483026992940, -0.983202610129571770, -0.983211734774144030, -0.983220856960686950, -0.983229976689177660, -0.983239093959593520, -0.983248208771911660, -0.983257321126109310, --0.983266431022163600, -0.983275538460051780, -0.983284643439751190, -0.983293745961238860, -0.983302846024492360, -0.983311943629488590, -0.983321038776205030, -0.983330131464618780, --0.983339221694707330, -0.983348309466447800, -0.983357394779817430, -0.983366477634793680, -0.983375558031353680, -0.983384635969474670, -0.983393711449134230, -0.983402784470309490, --0.983411855032977790, -0.983420923137116380, -0.983429988782702710, -0.983439051969714040, -0.983448112698127820, -0.983457170967921290, -0.983466226779071690, -0.983475280131556720, --0.983484331025353490, -0.983493379460439350, -0.983502425436791780, -0.983511468954388230, -0.983520510013205950, -0.983529548613222500, -0.983538584754415020, -0.983547618436761200, --0.983556649660238260, -0.983565678424823790, -0.983574704730495020, -0.983583728577229530, -0.983592749965004680, -0.983601768893798020, -0.983610785363586930, -0.983619799374348850, --0.983628810926061250, -0.983637820018701700, -0.983646826652247560, -0.983655830826676290, -0.983664832541965460, -0.983673831798092650, -0.983682828595035200, -0.983691822932770690, --0.983700814811276580, -0.983709804230530450, -0.983718791190509870, -0.983727775691192190, -0.983736757732555200, -0.983745737314576260, -0.983754714437232950, -0.983763689100502940, --0.983772661304363690, -0.983781631048792680, -0.983790598333767700, -0.983799563159266200, -0.983808525525265760, -0.983817485431744080, -0.983826442878678600, -0.983835397866047010, --0.983844350393827010, -0.983853300461996040, -0.983862248070531910, -0.983871193219412080, -0.983880135908614340, -0.983889076138116270, -0.983898013907895440, -0.983906949217929540, --0.983915882068196360, -0.983924812458673470, -0.983933740389338450, -0.983942665860169210, -0.983951588871143200, -0.983960509422238340, -0.983969427513432080, -0.983978343144702340, --0.983987256316026790, -0.983996167027382910, -0.984005075278748810, -0.984013981070101850, -0.984022884401420050, -0.984031785272680980, -0.984040683683862550, -0.984049579634942330, --0.984058473125898230, -0.984067364156707810, -0.984076252727349110, -0.984085138837799690, -0.984094022488037460, -0.984102903678040210, -0.984111782407785630, -0.984120658677251630, --0.984129532486415990, -0.984138403835256530, -0.984147272723751020, -0.984156139151877380, -0.984165003119613410, -0.984173864626936900, -0.984182723673825640, -0.984191580260257660, --0.984200434386210740, -0.984209286051662690, -0.984218135256591520, -0.984226982000974910, -0.984235826284790890, -0.984244668108017250, -0.984253507470632010, -0.984262344372612950, --0.984271178813938110, -0.984280010794585270, -0.984288840314532340, -0.984297667373757460, -0.984306491972238300, -0.984315314109952880, -0.984324133786879220, -0.984332951002995230, --0.984341765758278920, -0.984350578052708090, -0.984359387886260980, -0.984368195258915280, -0.984377000170649110, -0.984385802621440380, -0.984394602611267210, -0.984403400140107520, --0.984412195207939320, -0.984420987814740630, -0.984429777960489470, -0.984438565645163850, -0.984447350868741910, -0.984456133631201550, -0.984464913932520780, -0.984473691772677850, --0.984482467151650550, -0.984491240069417240, -0.984500010525955700, -0.984508778521244190, -0.984517544055260710, -0.984526307127983390, -0.984535067739390370, -0.984543825889459550, --0.984552581578169270, -0.984561334805497460, -0.984570085571422340, -0.984578833875922040, -0.984587579718974590, -0.984596323100558220, -0.984605064020651070, -0.984613802479231250, --0.984622538476276900, -0.984631272011766260, -0.984640003085677340, -0.984648731697988500, -0.984657457848677750, -0.984666181537723450, -0.984674902765103720, -0.984683621530796580, --0.984692337834780610, -0.984701051677033590, -0.984709763057533990, -0.984718471976260060, -0.984727178433189910, -0.984735882428301790, -0.984744583961573940, -0.984753283032984710, --0.984761979642512220, -0.984770673790134720, -0.984779365475830670, -0.984788054699578090, -0.984796741461355540, -0.984805425761140940, -0.984814107598912860, -0.984822786974649530, --0.984831463888329210, -0.984840138339930230, -0.984848810329430950, -0.984857479856809600, -0.984866146922044550, -0.984874811525114140, -0.984883473665996710, -0.984892133344670630, --0.984900790561114130, -0.984909445315305780, -0.984918097607223710, -0.984926747436846380, -0.984935394804152260, -0.984944039709119590, -0.984952682151726820, -0.984961322131952420, --0.984969959649774630, -0.984978594705172020, -0.984987227298122820, -0.984995857428605740, -0.985004485096598770, -0.985013110302080830, -0.985021733045029930, -0.985030353325424770, --0.985038971143243790, -0.985047586498465240, -0.985056199391067810, -0.985064809821029840, -0.985073417788329910, -0.985082023292946360, -0.985090626334857890, -0.985099226914042720, --0.985107825030479560, -0.985116420684146730, -0.985125013875022940, -0.985133604603086630, -0.985142192868316280, -0.985150778670690450, -0.985159362010187610, -0.985167942886786440, --0.985176521300465400, -0.985185097251203070, -0.985193670738978010, -0.985202241763768690, -0.985210810325553910, -0.985219376424312010, -0.985227940060021680, -0.985236501232661490, --0.985245059942210010, -0.985253616188645930, -0.985262169971947820, -0.985270721292094250, -0.985279270149063910, -0.985287816542835370, -0.985296360473387310, -0.985304901940698310, --0.985313440944747040, -0.985321977485512310, -0.985330511562972470, -0.985339043177106520, -0.985347572327892830, -0.985356099015310180, -0.985364623239337380, -0.985373144999952990, --0.985381664297135810, -0.985390181130864300, -0.985398695501117470, -0.985407207407873910, -0.985415716851112290, -0.985424223830811300, -0.985432728346949840, -0.985441230399506600, --0.985449729988460250, -0.985458227113789500, -0.985466721775473230, -0.985475213973490140, -0.985483703707819130, -0.985492190978438760, -0.985500675785327960, -0.985509158128465400, --0.985517638007829990, -0.985526115423400410, -0.985534590375155670, -0.985543062863074360, -0.985551532887135480, -0.985560000447317730, -0.985568465543599890, -0.985576928175960990, --0.985585388344379810, -0.985593846048835040, -0.985602301289305700, -0.985610754065770590, -0.985619204378208600, -0.985627652226598650, -0.985636097610919530, -0.985644540531150250, --0.985652980987269500, -0.985661418979256410, -0.985669854507089660, -0.985678287570748380, -0.985686718170211250, -0.985695146305457400, -0.985703571976465630, -0.985711995183215060, --0.985720415925684380, -0.985728834203852710, -0.985737250017698960, -0.985745663367202150, -0.985754074252341070, -0.985762482673094850, -0.985770888629442400, -0.985779292121362730, --0.985787693148834850, -0.985796091711837800, -0.985804487810350460, -0.985812881444351860, -0.985821272613821130, -0.985829661318737170, -0.985838047559079000, -0.985846431334825860, --0.985854812645956540, -0.985863191492450160, -0.985871567874285870, -0.985879941791442670, -0.985888313243899580, -0.985896682231635730, -0.985905048754630140, -0.985913412812862040, --0.985921774406310240, -0.985930133534954070, -0.985938490198772670, -0.985946844397744940, -0.985955196131850120, -0.985963545401067230, -0.985971892205375620, -0.985980236544754200, --0.985988578419182190, -0.985996917828638740, -0.986005254773102970, -0.986013589252554110, -0.986021921266971300, -0.986030250816333660, -0.986038577900620330, -0.986046902519810640, --0.986055224673883620, -0.986063544362818620, -0.986071861586594770, -0.986080176345191180, -0.986088488638587220, -0.986096798466762010, -0.986105105829694790, -0.986113410727364800, --0.986121713159751280, -0.986130013126833570, -0.986138310628590700, -0.986146605665002120, -0.986154898236047070, -0.986163188341704690, -0.986171475981954430, -0.986179761156775300, --0.986188043866147000, -0.986196324110048430, -0.986204601888459150, -0.986212877201358310, -0.986221150048725240, -0.986229420430539410, -0.986237688346779940, -0.986245953797426300, --0.986254216782457730, -0.986262477301853570, -0.986270735355593290, -0.986278990943656230, -0.986287244066021530, -0.986295494722668860, -0.986303742913577360, -0.986311988638726600, --0.986320231898095810, -0.986328472691664460, -0.986336711019411890, -0.986344946881317690, -0.986353180277360960, -0.986361411207521300, -0.986369639671778150, -0.986377865670110880, --0.986386089202498930, -0.986394310268921880, -0.986402528869358970, -0.986410745003789670, -0.986418958672193540, -0.986427169874550040, -0.986435378610838630, -0.986443584881038780, --0.986451788685129950, -0.986459990023091590, -0.986468188894903400, -0.986476385300544600, -0.986484579239994890, -0.986492770713233710, -0.986500959720240660, -0.986509146260995170, --0.986517330335476840, -0.986525511943665110, -0.986533691085539680, -0.986541867761079990, -0.986550041970265750, -0.986558213713076280, -0.986566382989491290, -0.986574549799490330, --0.986582714143052990, -0.986590876020158940, -0.986599035430787640, -0.986607192374918780, -0.986615346852531830, -0.986623498863606670, -0.986631648408122670, -0.986639795486059620, --0.986647940097396980, -0.986656082242114540, -0.986664221920191880, -0.986672359131608670, -0.986680493876344600, -0.986688626154379360, -0.986696755965692400, -0.986704883310263630, --0.986713008188072620, -0.986721130599099160, -0.986729250543322830, -0.986737368020723320, -0.986745483031280510, -0.986753595574973890, -0.986761705651783340, -0.986769813261688440, --0.986777918404669110, -0.986786021080704900, -0.986794121289775730, -0.986802219031861160, -0.986810314306941220, -0.986818407114995240, -0.986826497456003480, -0.986834585329945280, --0.986842670736800760, -0.986850753676549510, -0.986858834149171420, -0.986866912154646170, -0.986874987692953680, -0.986883060764073620, -0.986891131367986010, -0.986899199504670640, --0.986907265174107210, -0.986915328376275600, -0.986923389111155620, -0.986931447378727290, -0.986939503178970170, -0.986947556511864500, -0.986955607377389740, -0.986963655775526140, --0.986971701706253260, -0.986979745169551230, -0.986987786165399730, -0.986995824693778890, -0.987003860754668390, -0.987011894348048260, -0.987019925473898390, -0.987027954132198790, --0.987035980322929160, -0.987044004046069730, -0.987052025301600190, -0.987060044089500650, -0.987068060409750920, -0.987076074262331130, -0.987084085647221050, -0.987092094564400830, --0.987100101013850370, -0.987108104995549680, -0.987116106509478670, -0.987124105555617360, -0.987132102133945870, -0.987140096244444100, -0.987148087887092180, -0.987156077061869920, --0.987164063768757540, -0.987172048007734950, -0.987180029778782280, -0.987188009081879430, -0.987195985917006640, -0.987203960284143920, -0.987211932183271300, -0.987219901614368790, --0.987227868577416510, -0.987235833072394600, -0.987243795099283170, -0.987251754658062140, -0.987259711748711740, -0.987267666371212100, -0.987275618525543350, -0.987283568211685500, --0.987291515429618680, -0.987299460179323130, -0.987307402460778860, -0.987315342273966220, -0.987323279618865120, -0.987331214495455800, -0.987339146903718490, -0.987347076843633320, --0.987355004315180420, -0.987362929318340130, -0.987370851853092370, -0.987378771919417590, -0.987386689517295800, -0.987394604646707360, -0.987402517307632400, -0.987410427500051040, --0.987418335223943730, -0.987426240479290510, -0.987434143266071710, -0.987442043584267570, -0.987449941433858340, -0.987457836814824130, -0.987465729727145520, -0.987473620170802420, --0.987481508145775400, -0.987489393652044580, -0.987497276689590200, -0.987505157258392720, -0.987513035358432270, -0.987520910989689300, -0.987528784152143960, -0.987536654845776800, --0.987544523070567840, -0.987552388826497650, -0.987560252113546590, -0.987568112931694770, -0.987575971280922670, -0.987583827161210740, -0.987591680572539100, -0.987599531514888330, --0.987607379988238780, -0.987615225992570790, -0.987623069527864610, -0.987630910594100910, -0.987638749191259820, -0.987646585319321920, -0.987654418978267450, -0.987662250168077070, --0.987670078888730930, -0.987677905140209700, -0.987685728922493730, -0.987693550235563380, -0.987701369079399210, -0.987709185453981560, -0.987716999359290910, -0.987724810795307830, --0.987732619762012650, -0.987740426259385960, -0.987748230287408320, -0.987756031846059980, -0.987763830935321610, -0.987771627555173560, -0.987779421705596520, -0.987787213386570940, --0.987795002598077290, -0.987802789340096240, -0.987810573612608160, -0.987818355415593600, -0.987826134749033140, -0.987833911612907340, -0.987841686007196800, -0.987849457931882060, --0.987857227386943700, -0.987864994372362190, -0.987872758888118210, -0.987880520934192430, -0.987888280510565210, -0.987896037617217450, -0.987903792254129390, -0.987911544421282040, --0.987919294118655760, -0.987927041346231220, -0.987934786103989100, -0.987942528391909990, -0.987950268209974560, -0.987958005558163490, -0.987965740436457350, -0.987973472844836940, --0.987981202783282830, -0.987988930251775700, -0.987996655250296230, -0.988004377778825100, -0.988012097837343120, -0.988019815425830840, -0.988027530544269060, -0.988035243192638360, --0.988042953370919630, -0.988050661079093450, -0.988058366317140720, -0.988066069085042020, -0.988073769382778130, -0.988081467210329740, -0.988089162567677870, -0.988096855454802970, --0.988104545871685950, -0.988112233818307590, -0.988119919294648600, -0.988127602300689860, -0.988135282836412050, -0.988142960901796100, -0.988150636496822780, -0.988158309621472770, --0.988165980275727110, -0.988173648459566350, -0.988181314172971610, -0.988188977415923490, -0.988196638188402980, -0.988204296490390880, -0.988211952321867980, -0.988219605682815190, --0.988227256573213420, -0.988234904993043560, -0.988242550942286300, -0.988250194420922770, -0.988257835428933750, -0.988265473966300160, -0.988273110033002890, -0.988280743629022850, --0.988288374754340840, -0.988296003408937970, -0.988303629592795050, -0.988311253305893200, -0.988318874548213100, -0.988326493319735770, -0.988334109620442320, -0.988341723450313570, --0.988349334809330400, -0.988356943697473960, -0.988364550114725240, -0.988372154061065040, -0.988379755536474500, -0.988387354540934630, -0.988394951074426320, -0.988402545136930600, --0.988410136728428590, -0.988417725848901200, -0.988425312498329430, -0.988432896676694430, -0.988440478383977190, -0.988448057620158750, -0.988455634385220220, -0.988463208679142610, --0.988470780501906840, -0.988478349853494250, -0.988485916733885750, -0.988493481143062460, -0.988501043081005500, -0.988508602547695900, -0.988516159543114780, -0.988523714067243260, --0.988531266120062480, -0.988538815701553550, -0.988546362811697500, -0.988553907450475670, -0.988561449617868960, -0.988568989313858610, -0.988576526538425870, -0.988584061291551850, --0.988591593573217580, -0.988599123383404390, -0.988606650722093310, -0.988614175589265680, -0.988621697984902630, -0.988629217908985280, -0.988636735361494880, -0.988644250342412660, --0.988651762851719850, -0.988659272889397590, -0.988666780455427110, -0.988674285549789760, -0.988681788172466660, -0.988689288323439050, -0.988696786002688290, -0.988704281210195600, --0.988711773945942120, -0.988719264209909190, -0.988726752002078160, -0.988734237322430260, -0.988741720170946750, -0.988749200547608950, -0.988756678452398120, -0.988764153885295590, --0.988771626846282730, -0.988779097335340750, -0.988786565352451020, -0.988794030897594880, -0.988801493970753680, -0.988808954571908760, -0.988816412701041480, -0.988823868358133070, --0.988831321543165110, -0.988838772256118710, -0.988846220496975460, -0.988853666265716690, -0.988861109562323760, -0.988868550386778010, -0.988875988739060910, -0.988883424619153790, --0.988890858027038130, -0.988898288962695380, -0.988905717426106780, -0.988913143417254000, -0.988920566936118410, -0.988927987982681220, -0.988935406556924250, -0.988942822658828600, --0.988950236288375970, -0.988957647445547820, -0.988965056130325480, -0.988972462342690430, -0.988979866082624340, -0.988987267350108560, -0.988994666145124550, -0.989002062467653990, --0.989009456317678230, -0.989016847695178720, -0.989024236600137270, -0.989031623032535110, -0.989039006992353920, -0.989046388479575160, -0.989053767494180500, -0.989061144036151420, --0.989068518105469470, -0.989075889702116240, -0.989083258826073290, -0.989090625477322180, -0.989097989655844390, -0.989105351361621810, -0.989112710594635790, -0.989120067354867900, --0.989127421642299940, -0.989134773456913470, -0.989142122798689960, -0.989149469667611190, -0.989156814063658740, -0.989164155986814290, -0.989171495437059400, -0.989178832414375760, --0.989186166918745060, -0.989193498950148960, -0.989200828508569160, -0.989208155593987230, -0.989215480206384950, -0.989222802345743890, -0.989230122012045850, -0.989237439205272520, --0.989244753925405670, -0.989252066172426780, -0.989259375946317850, -0.989266683247060460, -0.989273988074636400, -0.989281290429027240, -0.989288590310214990, -0.989295887718181110, --0.989303182652907620, -0.989310475114376200, -0.989317765102568520, -0.989325052617466500, -0.989332337659051820, -0.989339620227306260, -0.989346900322211730, -0.989354177943749800, --0.989361453091902600, -0.989368725766651690, -0.989375995967978980, -0.989383263695866270, -0.989390528950295330, -0.989397791731248200, -0.989405052038706430, -0.989412309872652160, --0.989419565233067070, -0.989426818119933160, -0.989434068533232010, -0.989441316472945860, -0.989448561939056390, -0.989455804931545500, -0.989463045450395100, -0.989470283495587080, --0.989477519067103240, -0.989484752164925820, -0.989491982789036380, -0.989499210939416950, -0.989506436616049640, -0.989513659818916150, -0.989520880547998470, -0.989528098803278630, --0.989535314584738530, -0.989542527892360190, -0.989549738726125510, -0.989556947086016490, -0.989564152972015050, -0.989571356384103320, -0.989578557322263070, -0.989585755786476560, --0.989592951776725570, -0.989600145292992230, -0.989607336335258550, -0.989614524903506540, -0.989621710997718230, -0.989628894617875510, -0.989636075763960730, -0.989643254435955580, --0.989650430633842500, -0.989657604357603190, -0.989664775607219880, -0.989671944382674700, -0.989679110683949650, -0.989686274511026750, -0.989693435863888250, -0.989700594742516150, --0.989707751146892580, -0.989714905076999550, -0.989722056532819310, -0.989729205514333970, -0.989736352021525550, -0.989743496054376280, -0.989750637612868190, -0.989757776696983620, --0.989764913306704460, -0.989772047442013190, -0.989779179102891700, -0.989786308289322350, -0.989793435001287140, -0.989800559238768420, -0.989807681001748210, -0.989814800290208850, --0.989821917104132480, -0.989829031443501320, -0.989836143308297610, -0.989843252698503480, -0.989850359614101280, -0.989857464055073240, -0.989864566021401380, -0.989871665513068270, --0.989878762530055910, -0.989885857072346550, -0.989892949139922760, -0.989900038732766440, -0.989907125850860050, -0.989914210494185820, -0.989921292662726100, -0.989928372356463250, --0.989935449575379380, -0.989942524319456840, -0.989949596588677980, -0.989956666383025260, -0.989963733702480810, -0.989970798547026960, -0.989977860916646190, -0.989984920811320720, --0.989991978231033020, -0.989999033175765320, -0.990006085645499970, -0.990013135640219530, -0.990020183159906140, -0.990027228204542480, -0.990034270774110550, -0.990041310868593040, --0.990048348487972190, -0.990055383632230560, -0.990062416301350390, -0.990069446495314250, -0.990076474214104390, -0.990083499457703460, -0.990090522226093730, -0.990097542519257750, --0.990104560337177860, -0.990111575679836540, -0.990118588547216350, -0.990125598939299630, -0.990132606856068960, -0.990139612297506690, -0.990146615263595490, -0.990153615754317710, --0.990160613769655920, -0.990167609309592470, -0.990174602374110150, -0.990181592963191300, -0.990188581076818400, -0.990195566714974110, -0.990202549877640890, -0.990209530564801210, --0.990216508776437850, -0.990223484512533170, -0.990230457773069730, -0.990237428558030210, -0.990244396867397070, -0.990251362701152880, -0.990258326059280440, -0.990265286941762080, --0.990272245348580490, -0.990279201279718360, -0.990286154735158130, -0.990293105714882600, -0.990300054218874240, -0.990307000247115820, -0.990313943799589810, -0.990320884876279120, --0.990327823477165970, -0.990334759602233490, -0.990341693251463930, -0.990348624424840280, -0.990355553122344910, -0.990362479343960820, -0.990369403089670470, -0.990376324359456550, --0.990383243153301950, -0.990390159471189140, -0.990397073313101010, -0.990403984679020130, -0.990410893568929310, -0.990417799982811210, -0.990424703920648630, -0.990431605382424360, --0.990438504368120980, -0.990445400877721370, -0.990452294911208340, -0.990459186468564460, -0.990466075549772730, -0.990472962154815730, -0.990479846283676360, -0.990486727936337300, --0.990493607112781560, -0.990500483812991720, -0.990507358036950670, -0.990514229784641210, -0.990521099056046130, -0.990527965851148440, -0.990534830169930710, -0.990541692012375960, --0.990548551378466980, -0.990555408268186670, -0.990562262681517700, -0.990569114618443210, -0.990575964078945880, -0.990582811063008720, -0.990589655570614400, -0.990596497601746060, --0.990603337156386380, -0.990610174234518360, -0.990617008836124910, -0.990623840961189050, -0.990630670609693450, -0.990637497781621250, -0.990644322476955330, -0.990651144695678500, --0.990657964437773870, -0.990664781703224360, -0.990671596492012860, -0.990678408804122390, -0.990685218639535960, -0.990692025998236360, -0.990698830880206720, -0.990705633285430040, --0.990712433213889240, -0.990719230665567440, -0.990726025640447430, -0.990732818138512440, -0.990739608159745490, -0.990746395704129370, -0.990753180771647310, -0.990759963362282340, --0.990766743476017450, -0.990773521112835680, -0.990780296272720020, -0.990787068955653720, -0.990793839161619780, -0.990800606890601230, -0.990807372142581080, -0.990814134917542550, --0.990820895215468680, -0.990827653036342570, -0.990834408380147360, -0.990841161246866160, -0.990847911636482000, -0.990854659548978000, -0.990861404984337390, -0.990868147942543410, --0.990874888423578850, -0.990881626427427160, -0.990888361954071480, -0.990895095003494820, -0.990901825575680410, -0.990908553670611480, -0.990915279288271170, -0.990922002428642590, --0.990928723091709100, -0.990935441277453700, -0.990942156985859750, -0.990948870216910360, -0.990955580970588890, -0.990962289246878350, -0.990968995045762190, -0.990975698367223550, --0.990982399211245650, -0.990989097577811620, -0.990995793466905030, -0.991002486878508890, -0.991009177812606450, -0.991015866269181140, -0.991022552248216230, -0.991029235749694810, --0.991035916773600370, -0.991042595319916120, -0.991049271388625420, -0.991055944979711610, -0.991062616093157820, -0.991069284728947510, -0.991075950887064020, -0.991082614567490580, --0.991089275770210660, -0.991095934495207500, -0.991102590742464540, -0.991109244511965140, -0.991115895803692640, -0.991122544617630390, -0.991129190953761730, -0.991135834812070130, --0.991142476192538810, -0.991149115095151470, -0.991155751519891330, -0.991162385466741740, -0.991169016935686260, -0.991175645926708150, -0.991182272439790960, -0.991188896474918150, --0.991195518032073060, -0.991202137111239170, -0.991208753712399910, -0.991215367835538760, -0.991221979480639280, -0.991228588647684710, -0.991235195336658830, -0.991241799547544880, --0.991248401280326430, -0.991255000534986940, -0.991261597311509980, -0.991268191609879110, -0.991274783430077690, -0.991281372772089280, -0.991287959635897440, -0.991294544021485760, --0.991301125928837680, -0.991307705357936770, -0.991314282308766730, -0.991320856781310880, -0.991327428775552800, -0.991333998291476280, -0.991340565329064670, -0.991347129888301760, --0.991353691969171000, -0.991360251571655970, -0.991366808695740230, -0.991373363341407580, -0.991379915508641570, -0.991386465197425680, -0.991393012407743580, -0.991399557139579060, --0.991406099392915570, -0.991412639167736920, -0.991419176464026550, -0.991425711281768370, -0.991432243620945840, -0.991438773481542750, -0.991445300863542660, -0.991451825766929360, --0.991458348191686540, -0.991464868137797770, -0.991471385605246840, -0.991477900594017410, -0.991484413104093300, -0.991490923135458170, -0.991497430688095700, -0.991503935761989590, --0.991510438357123820, -0.991516938473481770, -0.991523436111047430, -0.991529931269804490, -0.991536423949736840, -0.991542914150827960, -0.991549401873061950, -0.991555887116422290, --0.991562369880892970, -0.991568850166457790, -0.991575327973100440, -0.991581803300804810, -0.991588276149554580, -0.991594746519333660, -0.991601214410125940, -0.991607679821915220, --0.991614142754685180, -0.991620603208419830, -0.991627061183103060, -0.991633516678718570, -0.991639969695250260, -0.991646420232682010, -0.991652868290997750, -0.991659313870181360, --0.991665756970216640, -0.991672197591087600, -0.991678635732777920, -0.991685071395271730, -0.991691504578552930, -0.991697935282605300, -0.991704363507412870, -0.991710789252959410, --0.991717212519229170, -0.991723633306205720, -0.991730051613873290, -0.991736467442215660, -0.991742880791216970, -0.991749291660861010, -0.991755700051131780, -0.991762105962013420, --0.991768509393489710, -0.991774910345544770, -0.991781308818162510, -0.991787704811326940, -0.991794098325022190, -0.991800489359232150, -0.991806877913940950, -0.991813263989132500, --0.991819647584790910, -0.991826028700900200, -0.991832407337444380, -0.991838783494407570, -0.991845157171773790, -0.991851528369527170, -0.991857897087651710, -0.991864263326131420, --0.991870627084950550, -0.991876988364093100, -0.991883347163543210, -0.991889703483284980, -0.991896057323302440, -0.991902408683579710, -0.991908757564101020, -0.991915103964850390, --0.991921447885812050, -0.991927789326970120, -0.991934128288308630, -0.991940464769811900, -0.991946798771463860, -0.991953130293248940, -0.991959459335151170, -0.991965785897154780, --0.991972109979244010, -0.991978431581402860, -0.991984750703615580, -0.991991067345866510, -0.991997381508139760, -0.992003693190419590, -0.992010002392690100, -0.992016309114935660, --0.992022613357140370, -0.992028915119288700, -0.992035214401364660, -0.992041511203352490, -0.992047805525236640, -0.992054097367001340, -0.992060386728630730, -0.992066673610109140, --0.992072958011420810, -0.992079239932550210, -0.992085519373481440, -0.992091796334198860, -0.992098070814686820, -0.992104342814929650, -0.992110612334911490, -0.992116879374616900, --0.992123143934030120, -0.992129406013135480, -0.992135665611917240, -0.992141922730359950, -0.992148177368447740, -0.992154429526165170, -0.992160679203496490, -0.992166926400426140, --0.992173171116938480, -0.992179413353017850, -0.992185653108648700, -0.992191890383815390, -0.992198125178502370, -0.992204357492694090, -0.992210587326374900, -0.992216814679529270, --0.992223039552141530, -0.992229261944196250, -0.992235481855677780, -0.992241699286570580, -0.992247914236859210, -0.992254126706528020, -0.992260336695561460, -0.992266544203944110, --0.992272749231660420, -0.992278951778694850, -0.992285151845031850, -0.992291349430656000, -0.992297544535551750, -0.992303737159703660, -0.992309927303096310, -0.992316114965714040, --0.992322300147541530, -0.992328482848563230, -0.992334663068763720, -0.992340840808127570, -0.992347016066639330, -0.992353188844283580, -0.992359359141044890, -0.992365526956907720, --0.992371692291856730, -0.992377855145876510, -0.992384015518951720, -0.992390173411066830, -0.992396328822206520, -0.992402481752355350, -0.992408632201498000, -0.992414780169619150, --0.992420925656703260, -0.992427068662735110, -0.992433209187699280, -0.992439347231580450, -0.992445482794363180, -0.992451615876032260, -0.992457746476572260, -0.992463874595967850, --0.992470000234203840, -0.992476123391264790, -0.992482244067135480, -0.992488362261800480, -0.992494477975244700, -0.992500591207452600, -0.992506701958409070, -0.992512810228098790, --0.992518916016506550, -0.992525019323616920, -0.992531120149414800, -0.992537218493884770, -0.992543314357011820, -0.992549407738780530, -0.992555498639175800, -0.992561587058182200, --0.992567672995784740, -0.992573756451967990, -0.992579837426716960, -0.992585915920016220, -0.992591991931850770, -0.992598065462205410, -0.992604136511064720, -0.992610205078413800, --0.992616271164237340, -0.992622334768520240, -0.992628395891247180, -0.992634454532403290, -0.992640510691973120, -0.992646564369941810, -0.992652615566294030, -0.992658664281014680, --0.992664710514088670, -0.992670754265501000, -0.992676795535236360, -0.992682834323279640, -0.992688870629615970, -0.992694904454230030, -0.992700935797106940, -0.992706964658231380, --0.992712991037588590, -0.992719014935163120, -0.992725036350940230, -0.992731055284904680, -0.992737071737041620, -0.992743085707335720, -0.992749097195772200, -0.992755106202335870, --0.992761112727011840, -0.992767116769785020, -0.992773118330640410, -0.992779117409563040, -0.992785114006537790, -0.992791108121549800, -0.992797099754584080, -0.992803088905625520, --0.992809075574659360, -0.992815059761670390, -0.992821041466643850, -0.992827020689564630, -0.992832997430417970, -0.992838971689188780, -0.992844943465862050, -0.992850912760423030, --0.992856879572856730, -0.992862843903148270, -0.992868805751282670, -0.992874765117245150, -0.992880722001020620, -0.992886676402594310, -0.992892628321951240, -0.992898577759076640, --0.992904524713955630, -0.992910469186573330, -0.992916411176914760, -0.992922350684965260, -0.992928287710709840, -0.992934222254133750, -0.992940154315221980, -0.992946083893960000, --0.992952010990332700, -0.992957935604325330, -0.992963857735923220, -0.992969777385111390, -0.992975694551875180, -0.992981609236199710, -0.992987521438070230, -0.992993431157471960, --0.992999338394390030, -0.993005243148809780, -0.993011145420716450, -0.993017045210095260, -0.993022942516931460, -0.993028837341210280, -0.993034729682917060, -0.993040619542037040, --0.993046506918555340, -0.993052391812457520, -0.993058274223728610, -0.993064154152354050, -0.993070031598319190, -0.993075906561609160, -0.993081779042209290, -0.993087649040105160, --0.993093516555281770, -0.993099381587724590, -0.993105244137418960, -0.993111104204350340, -0.993116961788503840, -0.993122816889864920, -0.993128669508419050, -0.993134519644151450, --0.993140367297047580, -0.993146212467092780, -0.993152055154272410, -0.993157895358572020, -0.993163733079976740, -0.993169568318472250, -0.993175401074043780, -0.993181231346676800, --0.993187059136356740, -0.993192884443069080, -0.993198707266799150, -0.993204527607532530, -0.993210345465254550, -0.993216160839950680, -0.993221973731606480, -0.993227784140207290, --0.993233592065738580, -0.993239397508186020, -0.993245200467534840, -0.993251000943770720, -0.993256798936879130, -0.993262594446845500, -0.993268387473655420, -0.993274178017294340, --0.993279966077747820, -0.993285751655001440, -0.993291534749040640, -0.993297315359851000, -0.993303093487418080, -0.993308869131727330, -0.993314642292764560, -0.993320412970515100, --0.993326181164964630, -0.993331946876098710, -0.993337710103902930, -0.993343470848362830, -0.993349229109464100, -0.993354984887192320, -0.993360738181533030, -0.993366488992471930, --0.993372237319994580, -0.993377983164086650, -0.993383726524733720, -0.993389467401921470, -0.993395205795635560, -0.993400941705861680, -0.993406675132585510, -0.993412406075792510, --0.993418134535468570, -0.993423860511599250, -0.993429584004170360, -0.993435305013167460, -0.993441023538576330, -0.993446739580382650, -0.993452453138572000, -0.993458164213130380, --0.993463872804043250, -0.993469578911296500, -0.993475282534875710, -0.993480983674766780, -0.993486682330955380, -0.993492378503427310, -0.993498072192168240, -0.993503763397163950, --0.993509452118400360, -0.993515138355863140, -0.993520822109537960, -0.993526503379410840, -0.993532182165467350, -0.993537858467693490, -0.993543532286074950, -0.993549203620597620, --0.993554872471247300, -0.993560538838009770, -0.993566202720870820, -0.993571864119816460, -0.993577523034832380, -0.993583179465904460, -0.993588833413018730, -0.993594484876160760, --0.993600133855316650, -0.993605780350472310, -0.993611424361613320, -0.993617065888725890, -0.993622704931795830, -0.993628341490808920, -0.993633975565751170, -0.993639607156608480, --0.993645236263366760, -0.993650862886012010, -0.993656487024530130, -0.993662108678906920, -0.993667727849128600, -0.993673344535180750, -0.993678958737049700, -0.993684570454721140, --0.993690179688181300, -0.993695786437415850, -0.993701390702411040, -0.993706992483152750, -0.993712591779627010, -0.993718188591819710, -0.993723782919716970, -0.993729374763304700, --0.993734964122569120, -0.993740550997496030, -0.993746135388071660, -0.993751717294281800, -0.993757296716112790, -0.993762873653550540, -0.993768448106581050, -0.993774020075190450, --0.993779589559364740, -0.993785156559090170, -0.993790721074352620, -0.993796283105138340, -0.993801842651433230, -0.993807399713223630, -0.993812954290495540, -0.993818506383234990, --0.993824055991428200, -0.993829603115061300, -0.993835147754120410, -0.993840689908591650, -0.993846229578461030, -0.993851766763715010, -0.993857301464339480, -0.993862833680320690, --0.993868363411644860, -0.993873890658298120, -0.993879415420266590, -0.993884937697536610, -0.993890457490094300, -0.993895974797925800, -0.993901489621017320, -0.993907001959355110, --0.993912511812925500, -0.993918019181714520, -0.993923524065708500, -0.993929026464893670, -0.993934526379256390, -0.993940023808782660, -0.993945518753458930, -0.993951011213271340, --0.993956501188206330, -0.993961988678249920, -0.993967473683388670, -0.993972956203608700, -0.993978436238896370, -0.993983913789237890, -0.993989388854619630, -0.993994861435027910, --0.994000331530449090, -0.994005799140869390, -0.994011264266275170, -0.994016726906652880, -0.994022187061988640, -0.994027644732269010, -0.994033099917480230, -0.994038552617608760, --0.994044002832640940, -0.994049450562563000, -0.994054895807361500, -0.994060338567022810, -0.994065778841533130, -0.994071216630879160, -0.994076651935047020, -0.994082084754023380, --0.994087515087794360, -0.994092942936346760, -0.994098368299666690, -0.994103791177740610, -0.994109211570555210, -0.994114629478096700, -0.994120044900351660, -0.994125457837306440, --0.994130868288947590, -0.994136276255261690, -0.994141681736234960, -0.994147084731854090, -0.994152485242105530, -0.994157883266975630, -0.994163278806451170, -0.994168671860518380, --0.994174062429164060, -0.994179450512374440, -0.994184836110136310, -0.994190219222436000, -0.994195599849260200, -0.994200977990595370, -0.994206353646428180, -0.994211726816745080, --0.994217097501532530, -0.994222465700777440, -0.994227831414466020, -0.994233194642585080, -0.994238555385121180, -0.994243913642060880, -0.994249269413390760, -0.994254622699097480, --0.994259973499167620, -0.994265321813587840, -0.994270667642344840, -0.994276010985425060, -0.994281351842815300, -0.994286690214502220, -0.994292026100472290, -0.994297359500712410, --0.994302690415209020, -0.994308018843949040, -0.994313344786918910, -0.994318668244105420, -0.994323989215495360, -0.994329307701075190, -0.994334623700831810, -0.994339937214751890, --0.994345248242822110, -0.994350556785029260, -0.994355862841360020, -0.994361166411801060, -0.994366467496339170, -0.994371766094961140, -0.994377062207653650, -0.994382355834403600, --0.994387646975197660, -0.994392935630022510, -0.994398221798865060, -0.994403505481712080, -0.994408786678550370, -0.994414065389366610, -0.994419341614147690, -0.994424615352880510, --0.994429886605551760, -0.994435155372148220, -0.994440421652656780, -0.994445685447064350, -0.994450946755357720, -0.994456205577523790, -0.994461461913549230, -0.994466715763421050, --0.994471967127126040, -0.994477216004651220, -0.994482462395983260, -0.994487706301109160, -0.994492947720015840, -0.994498186652690070, -0.994503423099118880, -0.994508657059289150, --0.994513888533187780, -0.994519117520801690, -0.994524344022117760, -0.994529568037123000, -0.994534789565804320, -0.994540008608148730, -0.994545225164143010, -0.994550439233774290, --0.994555650817029460, -0.994560859913895530, -0.994566066524359420, -0.994571270648408110, -0.994576472286028750, -0.994581671437208100, -0.994586868101933310, -0.994592062280191260, --0.994597253971969190, -0.994602443177253880, -0.994607629896032570, -0.994612814128292060, -0.994617995874019560, -0.994623175133202090, -0.994628351905826660, -0.994633526191880390, --0.994638697991350300, -0.994643867304223490, -0.994649034130487000, -0.994654198470127810, -0.994659360323133290, -0.994664519689490320, -0.994669676569185920, -0.994674830962207550, --0.994679982868541980, -0.994685132288176450, -0.994690279221098090, -0.994695423667294020, -0.994700565626751350, -0.994705705099457440, -0.994710842085399060, -0.994715976584563680, --0.994721108596938410, -0.994726238122510260, -0.994731365161266590, -0.994736489713194500, -0.994741611778281240, -0.994746731356513810, -0.994751848447879670, -0.994756963052365830, --0.994762075169959630, -0.994767184800648190, -0.994772291944418850, -0.994777396601258750, -0.994782498771155210, -0.994787598454095370, -0.994792695650066560, -0.994797790359055910, --0.994802882581050980, -0.994807972316038680, -0.994813059564006560, -0.994818144324941640, -0.994823226598831490, -0.994828306385663220, -0.994833383685424290, -0.994838458498101820, --0.994843530823683150, -0.994848600662155750, -0.994853668013506720, -0.994858732877723640, -0.994863795254793740, -0.994868855144704240, -0.994873912547442730, -0.994878967462996310, --0.994884019891352560, -0.994889069832498700, -0.994894117286422300, -0.994899162253110480, -0.994904204732550810, -0.994909244724730520, -0.994914282229637290, -0.994919317247258240, --0.994924349777580930, -0.994929379820592710, -0.994934407376281140, -0.994939432444633450, -0.994944455025637220, -0.994949475119279780, -0.994954492725548810, -0.994959507844431430, --0.994964520475915440, -0.994969530619988050, -0.994974538276636840, -0.994979543445849380, -0.994984546127613000, -0.994989546321915160, -0.994994544028743540, -0.994999539248085600, --0.995004531979928770, -0.995009522224260650, -0.995014509981068660, -0.995019495250340390, -0.995024478032063510, -0.995029458326225250, -0.995034436132813500, -0.995039411451815630, --0.995044384283219170, -0.995049354627011720, -0.995054322483180930, -0.995059287851714380, -0.995064250732599630, -0.995069211125824140, -0.995074169031375690, -0.995079124449241850, --0.995084077379410180, -0.995089027821868250, -0.995093975776603860, -0.995098921243604440, -0.995103864222857680, -0.995108804714351370, -0.995113742718073070, -0.995118678234010350, --0.995123611262150880, -0.995128541802482450, -0.995133469854992620, -0.995138395419669200, -0.995143318496499730, -0.995148239085472010, -0.995153157186573600, -0.995158072799792400, --0.995162985925115980, -0.995167896562532020, -0.995172804712028400, -0.995177710373592820, -0.995182613547212940, -0.995187514232876440, -0.995192412430571220, -0.995197308140284950, --0.995202201362005430, -0.995207092095720340, -0.995211980341417560, -0.995216866099084880, -0.995221749368710000, -0.995226630150280680, -0.995231508443784940, -0.995236384249210350, --0.995241257566544690, -0.995246128395776090, -0.995250996736891990, -0.995255862589880520, -0.995260725954729360, -0.995265586831426300, -0.995270445219959330, -0.995275301120316370, --0.995280154532484970, -0.995285005456453260, -0.995289853892209030, -0.995294699839740170, -0.995299543299034580, -0.995304384270080170, -0.995309222752864710, -0.995314058747376220, --0.995318892253602590, -0.995323723271531850, -0.995328551801151650, -0.995333377842450130, -0.995338201395415180, -0.995343022460034590, -0.995347841036296590, -0.995352657124188970, --0.995357470723699620, -0.995362281834816680, -0.995367090457528030, -0.995371896591821680, -0.995376700237685540, -0.995381501395107620, -0.995386300064076020, -0.995391096244578550, --0.995395889936603440, -0.995400681140138580, -0.995405469855172090, -0.995410256081691870, -0.995415039819686040, -0.995419821069142510, -0.995424599830049490, -0.995429376102395010, --0.995434149886167070, -0.995438921181353690, -0.995443689987943080, -0.995448456305923270, -0.995453220135282260, -0.995457981476008170, -0.995462740328089240, -0.995467496691513350, --0.995472250566268760, -0.995477001952343570, -0.995481750849725790, -0.995486497258403770, -0.995491241178365400, -0.995495982609598930, -0.995500721552092570, -0.995505458005834340, --0.995510191970812470, -0.995514923447015200, -0.995519652434430520, -0.995524378933046790, -0.995529102942852020, -0.995533824463834540, -0.995538543495982590, -0.995543260039284170, --0.995547974093727640, -0.995552685659301110, -0.995557394735992920, -0.995562101323791300, -0.995566805422684390, -0.995571507032660400, -0.995576206153707680, -0.995580902785814460, --0.995585596928969090, -0.995590288583159570, -0.995594977748374350, -0.995599664424601680, -0.995604348611830000, -0.995609030310047330, -0.995613709519242000, -0.995618386239402580, --0.995623060470517070, -0.995627732212573950, -0.995632401465561420, -0.995637068229468070, -0.995641732504281900, -0.995646394289991470, -0.995651053586585010, -0.995655710394050870, --0.995660364712377510, -0.995665016541553260, -0.995669665881566470, -0.995674312732405480, -0.995678957094058740, -0.995683598966514590, -0.995688238349761390, -0.995692875243787690, --0.995697509648581720, -0.995702141564132060, -0.995706770990427040, -0.995711397927455000, -0.995716022375204620, -0.995720644333664030, -0.995725263802821890, -0.995729880782666550, --0.995734495273186580, -0.995739107274370320, -0.995743716786206320, -0.995748323808683060, -0.995752928341788970, -0.995757530385512510, -0.995762129939842260, -0.995766727004766650, --0.995771321580274260, -0.995775913666353650, -0.995780503262993170, -0.995785090370181370, -0.995789674987906940, -0.995794257116158320, -0.995798836754923980, -0.995803413904192580, --0.995807988563952700, -0.995812560734192780, -0.995817130414901500, -0.995821697606067420, -0.995826262307679010, -0.995830824519725040, -0.995835384242193980, -0.995839941475074370, --0.995844496218355020, -0.995849048472024380, -0.995853598236071110, -0.995858145510483910, -0.995862690295251320, -0.995867232590361920, -0.995871772395804490, -0.995876309711567710, --0.995880844537640030, -0.995885376874010350, -0.995889906720667130, -0.995894434077599260, -0.995898958944795190, -0.995903481322243820, -0.995908001209933720, -0.995912518607853570, --0.995917033515992140, -0.995921545934338130, -0.995926055862880300, -0.995930563301607230, -0.995935068250507820, -0.995939570709570730, -0.995944070678784770, -0.995948568158138590, --0.995953063147621000, -0.995957555647220660, -0.995962045656926590, -0.995966533176727230, -0.995971018206611710, -0.995975500746568490, -0.995979980796586670, -0.995984458356654830, --0.995988933426761760, -0.995993406006896450, -0.995997876097047600, -0.996002343697204080, -0.996006808807354700, -0.996011271427488350, -0.996015731557593710, -0.996020189197659780, --0.996024644347675460, -0.996029097007629430, -0.996033547177510690, -0.996037994857308040, -0.996042440047010480, -0.996046882746606800, -0.996051322956085890, -0.996055760675436660, --0.996060195904648000, -0.996064628643708930, -0.996069058892608330, -0.996073486651334990, -0.996077911919877930, -0.996082334698226160, -0.996086754986368450, -0.996091172784293930, --0.996095588091991500, -0.996100000909450060, -0.996104411236658600, -0.996108819073606160, -0.996113224420281610, -0.996117627276674080, -0.996122027642772470, -0.996126425518565670, --0.996130820904042920, -0.996135213799193120, -0.996139604204005270, -0.996143992118468380, -0.996148377542571570, -0.996152760476303740, -0.996157140919654130, -0.996161518872611510, --0.996165894335165230, -0.996170267307304070, -0.996174637789017380, -0.996179005780294060, -0.996183371281123220, -0.996187734291493880, -0.996192094811395260, -0.996196452840816480, --0.996200808379746450, -0.996205161428174500, -0.996209511986089540, -0.996213860053480890, -0.996218205630337470, -0.996222548716648730, -0.996226889312403440, -0.996231227417591070, --0.996235563032200510, -0.996239896156221110, -0.996244226789641970, -0.996248554932452230, -0.996252880584641120, -0.996257203746197750, -0.996261524417111470, -0.996265842597371390, --0.996270158286966630, -0.996274471485886440, -0.996278782194120140, -0.996283090411656860, -0.996287396138485940, -0.996291699374596380, -0.996296000119977650, -0.996300298374618980, --0.996304594138509470, -0.996308887411638590, -0.996313178193995340, -0.996317466485569290, -0.996321752286349450, -0.996326035596325270, -0.996330316415486080, -0.996334594743821020, --0.996338870581319420, -0.996343143927970740, -0.996347414783764210, -0.996351683148689050, -0.996355949022734720, -0.996360212405890570, -0.996364473298145930, -0.996368731699490030, --0.996372987609912220, -0.996377241029402060, -0.996381491957948780, -0.996385740395541730, -0.996389986342170350, -0.996394229797823990, -0.996398470762492110, -0.996402709236164030, --0.996406945218829110, -0.996411178710476910, -0.996415409711096770, -0.996419638220678030, -0.996423864239210260, -0.996428087766682790, -0.996432308803085200, -0.996436527348406710, --0.996440743402637000, -0.996444956965765290, -0.996449168037781270, -0.996453376618674390, -0.996457582708433990, -0.996461786307049740, -0.996465987414510870, -0.996470186030807170, --0.996474382155927870, -0.996478575789862760, -0.996482766932601070, -0.996486955584132580, -0.996491141744446640, -0.996495325413532920, -0.996499506591380760, -0.996503685277979940, --0.996507861473319820, -0.996512035177390180, -0.996516206390180350, -0.996520375111680010, -0.996524541341878730, -0.996528705080766190, -0.996532866328331710, -0.996537025084565210, --0.996541181349456130, -0.996545335122994040, -0.996549486405168610, -0.996553635195969510, -0.996557781495386320, -0.996561925303408700, -0.996566066620026230, -0.996570205445228560, --0.996574341779005390, -0.996578475621346490, -0.996582606972241210, -0.996586735831679560, -0.996590862199650980, -0.996594986076145380, -0.996599107461152210, -0.996603226354661250, --0.996607342756662300, -0.996611456667144900, -0.996615568086098860, -0.996619677013513950, -0.996623783449379850, -0.996627887393686350, -0.996631988846423010, -0.996636087807579840, --0.996640184277146290, -0.996644278255112370, -0.996648369741467750, -0.996652458736202230, -0.996656545239305470, -0.996660629250767480, -0.996664710770577830, -0.996668789798726420, --0.996672866335203020, -0.996676940379997430, -0.996681011933099550, -0.996685080994499150, -0.996689147564186030, -0.996693211642150080, -0.996697273228380980, -0.996701332322868840, --0.996705388925603230, -0.996709443036574270, -0.996713494655771640, -0.996717543783185330, -0.996721590418805040, -0.996725634562620870, -0.996729676214622610, -0.996733715374800160, --0.996737752043143410, -0.996741786219642270, -0.996745817904286620, -0.996749847097066490, -0.996753873797971760, -0.996757898006992330, -0.996761919724118210, -0.996765938949339180, --0.996769955682645370, -0.996773969924026560, -0.996777981673472980, -0.996781990930974420, -0.996785997696520760, -0.996790001970102260, -0.996794003751708680, -0.996798003041330040, --0.996801999838956450, -0.996805994144577930, -0.996809985958184370, -0.996813975279765780, -0.996817962109312280, -0.996821946446813880, -0.996825928292260690, -0.996829907645642610, --0.996833884506949760, -0.996837858876172270, -0.996841830753300020, -0.996845800138323250, -0.996849767031231960, -0.996853731432016280, -0.996857693340666320, -0.996861652757172090, --0.996865609681523710, -0.996869564113711300, -0.996873516053724980, -0.996877465501554870, -0.996881412457191090, -0.996885356920623860, -0.996889298891843080, -0.996893238370839210, --0.996897175357602140, -0.996901109852122210, -0.996905041854389440, -0.996908971364394160, -0.996912898382126380, -0.996916822907576330, -0.996920744940734240, -0.996924664481590340, --0.996928581530134750, -0.996932496086357700, -0.996936408150249420, -0.996940317721800030, -0.996944224800999980, -0.996948129387839280, -0.996952031482308270, -0.996955931084397280, --0.996959828194096340, -0.996963722811395890, -0.996967614936286160, -0.996971504568757270, -0.996975391708799790, -0.996979276356403710, -0.996983158511559500, -0.996987038174257380, --0.996990915344487580, -0.996994790022240560, -0.996998662207506550, -0.997002531900275990, -0.997006399100539010, -0.997010263808286060, -0.997014126023507360, -0.997017985746193490, --0.997021842976334560, -0.997025697713921020, -0.997029549958943220, -0.997033399711391600, -0.997037246971256510, -0.997041091738528280, -0.997044934013197270, -0.997048773795253920, --0.997052611084688680, -0.997056445881491890, -0.997060278185654010, -0.997064107997165490, -0.997067935316016560, -0.997071760142197890, -0.997075582475699830, -0.997079402316512820, --0.997083219664627210, -0.997087034520033670, -0.997090846882722430, -0.997094656752684160, -0.997098464129909210, -0.997102269014388030, -0.997106071406111290, -0.997109871305069340, --0.997113668711252730, -0.997117463624651920, -0.997121256045257480, -0.997125045973059840, -0.997128833408049700, -0.997132618350217380, -0.997136400799553460, -0.997140180756048710, --0.997143958219693370, -0.997147733190478110, -0.997151505668393610, -0.997155275653430430, -0.997159043145578900, -0.997162808144829830, -0.997166570651173760, -0.997170330664601150, --0.997174088185102780, -0.997177843212669220, -0.997181595747291040, -0.997185345788958900, -0.997189093337663370, -0.997192838393395120, -0.997196580956144720, -0.997200321025902950, --0.997204058602660260, -0.997207793686407550, -0.997211526277135270, -0.997215256374834210, -0.997218983979495040, -0.997222709091108330, -0.997226431709664960, -0.997230151835155400, --0.997233869467570530, -0.997237584606900930, -0.997241297253137370, -0.997245007406270640, -0.997248715066291310, -0.997252420233190270, -0.997256122906958200, -0.997259823087585760, --0.997263520775063750, -0.997267215969382950, -0.997270908670534140, -0.997274598878508000, -0.997278286593295430, -0.997281971814887090, -0.997285654543273890, -0.997289334778446500, --0.997293012520395820, -0.997296687769112510, -0.997300360524587590, -0.997304030786811730, -0.997307698555775720, -0.997311363831470570, -0.997315026613886930, -0.997318686903015840, --0.997322344698847950, -0.997326000001374170, -0.997329652810585500, -0.997333303126472610, -0.997336950949026410, -0.997340596278238010, -0.997344239114097970, -0.997347879456597420, --0.997351517305727020, -0.997355152661478010, -0.997358785523841050, -0.997362415892807050, -0.997366043768367130, -0.997369669150512060, -0.997373292039232750, -0.997376912434520310, --0.997380530336365530, -0.997384145744759530, -0.997387758659693090, -0.997391369081157220, -0.997394977009142920, -0.997398582443641210, -0.997402185384643090, -0.997405785832139460, --0.997409383786121320, -0.997412979246579790, -0.997416572213505770, -0.997420162686890380, -0.997423750666724510, -0.997427336152999280, -0.997430919145705810, -0.997434499644834880, --0.997438077650377840, -0.997441653162325580, -0.997445226180669110, -0.997448796705399650, -0.997452364736508110, -0.997455930273985820, -0.997459493317823580, -0.997463053868012590, --0.997466611924544000, -0.997470167487408910, -0.997473720556598440, -0.997477271132103600, -0.997480819213915510, -0.997484364802025510, -0.997487907896424500, -0.997491448497103810, --0.997494986604054450, -0.997498522217267650, -0.997502055336734530, -0.997505585962446210, -0.997509114094394020, -0.997512639732568980, -0.997516162876962320, -0.997519683527565370, --0.997523201684369140, -0.997526717347364870, -0.997530230516543880, -0.997533741191897310, -0.997537249373416370, -0.997540755061092300, -0.997544258254916330, -0.997547758954879680, --0.997551257160973700, -0.997554752873189510, -0.997558246091518550, -0.997561736815951840, -0.997565225046480930, -0.997568710783096830, -0.997572194025791000, -0.997575674774554670, --0.997579153029379160, -0.997582628790255830, -0.997586102057175910, -0.997589572830130720, -0.997593041109111510, -0.997596506894109840, -0.997599970185116810, -0.997603430982123900, --0.997606889285122420, -0.997610345094103620, -0.997613798409059060, -0.997617249229979960, -0.997620697556857780, -0.997624143389683860, -0.997627586728449530, -0.997631027573146260, --0.997634465923765370, -0.997637901780298430, -0.997641335142736560, -0.997644766011071550, -0.997648194385294510, -0.997651620265397000, -0.997655043651370480, -0.997658464543206280, --0.997661882940895970, -0.997665298844431000, -0.997668712253802710, -0.997672123169002670, -0.997675531590022310, -0.997678937516853100, -0.997682340949486600, -0.997685741887914150, --0.997689140332127410, -0.997692536282117850, -0.997695929737876910, -0.997699320699396150, -0.997702709166667150, -0.997706095139681340, -0.997709478618430180, -0.997712859602905460, --0.997716238093098620, -0.997719614089001010, -0.997722987590604520, -0.997726358597900490, -0.997729727110880590, -0.997733093129536400, -0.997736456653859460, -0.997739817683841350, --0.997743176219473730, -0.997746532260748160, -0.997749885807656220, -0.997753236860189570, -0.997756585418339890, -0.997759931482098740, -0.997763275051457680, -0.997766616126408600, --0.997769954706942850, -0.997773290793052210, -0.997776624384728360, -0.997779955481962970, -0.997783284084747700, -0.997786610193074130, -0.997789933806934150, -0.997793254926319320, --0.997796573551221310, -0.997799889681631800, -0.997803203317542690, -0.997806514458945530, -0.997809823105832110, -0.997813129258194100, -0.997816432916023290, -0.997819734079311350, --0.997823032748050180, -0.997826328922231330, -0.997829622601846600, -0.997832913786887990, -0.997836202477346950, -0.997839488673215480, -0.997842772374485270, -0.997846053581148080, --0.997849332293195830, -0.997852608510620190, -0.997855882233413150, -0.997859153461566280, -0.997862422195071600, -0.997865688433920760, -0.997868952178105780, -0.997872213427618450, --0.997875472182450540, -0.997878728442593950, -0.997881982208040470, -0.997885233478782220, -0.997888482254810750, -0.997891728536118070, -0.997894972322696080, -0.997898213614536680, --0.997901452411631750, -0.997904688713973200, -0.997907922521552910, -0.997911153834362800, -0.997914382652394850, -0.997917608975640970, -0.997920832804092940, -0.997924054137742990, --0.997927272976582790, -0.997930489320604460, -0.997933703169799900, -0.997936914524161000, -0.997940123383679880, -0.997943329748348430, -0.997946533618158770, -0.997949734993102690, --0.997952933873172190, -0.997956130258359500, -0.997959324148656400, -0.997962515544055020, -0.997965704444547350, -0.997968890850125410, -0.997972074760781200, -0.997975256176506840, --0.997978435097294450, -0.997981611523135800, -0.997984785454023250, -0.997987956889948680, -0.997991125830904210, -0.997994292276881970, -0.997997456227873950, -0.998000617683872270, --0.998003776644869060, -0.998006933110856420, -0.998010087081826480, -0.998013238557771350, -0.998016387538683050, -0.998019534024553790, -0.998022678015375700, -0.998025819511141000, --0.998028958511841590, -0.998032095017469920, -0.998035229028018000, -0.998038360543477940, -0.998041489563841980, -0.998044616089102330, -0.998047740119251130, -0.998050861654280590, --0.998053980694182940, -0.998057097238950310, -0.998060211288574920, -0.998063322843048990, -0.998066431902364770, -0.998069538466514470, -0.998072642535490330, -0.998075744109284570, --0.998078843187889420, -0.998081939771297220, -0.998085033859500200, -0.998088125452490480, -0.998091214550260620, -0.998094301152802510, -0.998097385260108830, -0.998100466872171580, --0.998103545988983210, -0.998106622610535950, -0.998109696736822150, -0.998112768367834140, -0.998115837503564140, -0.998118904144004620, -0.998121968289147790, -0.998125029938986110, --0.998128089093511690, -0.998131145752717220, -0.998134199916594800, -0.998137251585136890, -0.998140300758335930, -0.998143347436184160, -0.998146391618673910, -0.998149433305797860, --0.998152472497548130, -0.998155509193917270, -0.998158543394897620, -0.998161575100481540, -0.998164604310661560, -0.998167631025430160, -0.998170655244779550, -0.998173676968702410, --0.998176696197191070, -0.998179712930237990, -0.998182727167835520, -0.998185738909976310, -0.998188748156652820, -0.998191754907857390, -0.998194759163582580, -0.998197760923820840, --0.998200760188564740, -0.998203756957806720, -0.998206751231539350, -0.998209743009755070, -0.998212732292446340, -0.998215719079605930, -0.998218703371226090, -0.998221685167299590, --0.998224664467818880, -0.998227641272776520, -0.998230615582164970, -0.998233587395976900, -0.998236556714204970, -0.998239523536841530, -0.998242487863879370, -0.998245449695310930, --0.998248409031128880, -0.998251365871325790, -0.998254320215894330, -0.998257272064827060, -0.998260221418116540, -0.998263168275755560, -0.998266112637736570, -0.998269054504052340, --0.998271993874695560, -0.998274930749658670, -0.998277865128934460, -0.998280797012515710, -0.998283726400394870, -0.998286653292564720, -0.998289577689017940, -0.998292499589747200, --0.998295418994745280, -0.998298335904004740, -0.998301250317518480, -0.998304162235278960, -0.998307071657279050, -0.998309978583511560, -0.998312883013969030, -0.998315784948644370, --0.998318684387530130, -0.998321581330619210, -0.998324475777904400, -0.998327367729378360, -0.998330257185033990, -0.998333144144863850, -0.998336028608860950, -0.998338910577017960, --0.998341790049327660, -0.998344667025782840, -0.998347541506376390, -0.998350413491101100, -0.998353282979949850, -0.998356149972915330, -0.998359014469990420, -0.998361876471168030, --0.998364735976440820, -0.998367592985801910, -0.998370447499243970, -0.998373299516759900, -0.998376149038342600, -0.998378996063984840, -0.998381840593679740, -0.998384682627419970, --0.998387522165198440, -0.998390359207008140, -0.998393193752841970, -0.998396025802692820, -0.998398855356553590, -0.998401682414417180, -0.998404506976276580, -0.998407329042124810, --0.998410148611954540, -0.998412965685759100, -0.998415780263531170, -0.998418592345263760, -0.998421401930949860, -0.998424209020582490, -0.998427013614154530, -0.998429815711659120, --0.998432615313089130, -0.998435412418437580, -0.998438207027697590, -0.998440999140862040, -0.998443788757923940, -0.998446575878876420, -0.998449360503712470, -0.998452142632425100, --0.998454922265007320, -0.998457699401452240, -0.998460474041752980, -0.998463246185902540, -0.998466015833893940, -0.998468782985720280, -0.998471547641374800, -0.998474309800850280, --0.998477069464140050, -0.998479826631237240, -0.998482581302134740, -0.998485333476825780, -0.998488083155303570, -0.998490830337561140, -0.998493575023591600, -0.998496317213388160, --0.998499056906943850, -0.998501794104251990, -0.998504528805305600, -0.998507261010097900, -0.998509990718622010, -0.998512717930871150, -0.998515442646838560, -0.998518164866517340, --0.998520884589900630, -0.998523601816981850, -0.998526316547753920, -0.998529028782210280, -0.998531738520344050, -0.998534445762148560, -0.998537150507616820, -0.998539852756742290, --0.998542552509518070, -0.998545249765937500, -0.998547944525993820, -0.998550636789680260, -0.998553326556990140, -0.998556013827916700, -0.998558698602453170, -0.998561380880592870, --0.998564060662329170, -0.998566737947655380, -0.998569412736564630, -0.998572085029050480, -0.998574754825106050, -0.998577422124724670, -0.998580086927899790, -0.998582749234624760, --0.998585409044892790, -0.998588066358697350, -0.998590721176031650, -0.998593373496889150, -0.998596023321263290, -0.998598670649147310, -0.998601315480534770, -0.998603957815418770, --0.998606597653793000, -0.998609234995650690, -0.998611869840985380, -0.998614502189790310, -0.998617132042058930, -0.998619759397784800, -0.998622384256961260, -0.998625006619581760, --0.998627626485639740, -0.998630243855128660, -0.998632858728041970, -0.998635471104373120, -0.998638080984115660, -0.998640688367262940, -0.998643293253808520, -0.998645895643745840, --0.998648495537068360, -0.998651092933769750, -0.998653687833843340, -0.998656280237282810, -0.998658870144081500, -0.998661457554232970, -0.998664042467730880, -0.998666624884568700, --0.998669204804739860, -0.998671782228238050, -0.998674357155056810, -0.998676929585189720, -0.998679499518630220, -0.998682066955371980, -0.998684631895408680, -0.998687194338733650, --0.998689754285340680, -0.998692311735223440, -0.998694866688375260, -0.998697419144790040, -0.998699969104461240, -0.998702516567382400, -0.998705061533547430, -0.998707604002949670, --0.998710143975583000, -0.998712681451440990, -0.998715216430517190, -0.998717748912805400, -0.998720278898299170, -0.998722806386992400, -0.998725331378878420, -0.998727853873951240, --0.998730373872204420, -0.998732891373631640, -0.998735406378226550, -0.998737918885983070, -0.998740428896894740, -0.998742936410955350, -0.998745441428158690, -0.998747943948498310, --0.998750443971968100, -0.998752941498561750, -0.998755436528273140, -0.998757929061095840, -0.998760419097023840, -0.998762906636050720, -0.998765391678170360, -0.998767874223376430, --0.998770354271662940, -0.998772831823023450, -0.998775306877451970, -0.998777779434942170, -0.998780249495487940, -0.998782717059083060, -0.998785182125721430, -0.998787644695396830, --0.998790104768103150, -0.998792562343834180, -0.998795017422583810, -0.998797470004345820, -0.998799920089114220, -0.998802367676882910, -0.998804812767645540, -0.998807255361396250, --0.998809695458128700, -0.998812133057837000, -0.998814568160514950, -0.998817000766156540, -0.998819430874755550, -0.998821858486306000, -0.998824283600801780, -0.998826706218236880, --0.998829126338605210, -0.998831543961900660, -0.998833959088117340, -0.998836371717249150, -0.998838781849289980, -0.998841189484233840, -0.998843594622074730, -0.998845997262806650, --0.998848397406423620, -0.998850795052919520, -0.998853190202288470, -0.998855582854524470, -0.998857973009621420, -0.998860360667573550, -0.998862745828374640, -0.998865128492019030, --0.998867508658500490, -0.998869886327813260, -0.998872261499951230, -0.998874634174908630, -0.998877004352679340, -0.998879372033257610, -0.998881737216637420, -0.998884099902812910, --0.998886460091778170, -0.998888817783527230, -0.998891172978054300, -0.998893525675353390, -0.998895875875418730, -0.998898223578244320, -0.998900568783824380, -0.998902911492153050, --0.998905251703224310, -0.998907589417032620, -0.998909924633571870, -0.998912257352836290, -0.998914587574820100, -0.998916915299517430, -0.998919240526922380, -0.998921563257029410, --0.998923883489832410, -0.998926201225325720, -0.998928516463503560, -0.998930829204360050, -0.998933139447889530, -0.998935447194086110, -0.998937752442944140, -0.998940055194457720, --0.998942355448621200, -0.998944653205428800, -0.998946948464874750, -0.998949241226953390, -0.998951531491658830, -0.998953819258985520, -0.998956104528927580, -0.998958387301479460, --0.998960667576635260, -0.998962945354389450, -0.998965220634736360, -0.998967493417670100, -0.998969763703185240, -0.998972031491275890, -0.998974296781936390, -0.998976559575161290, --0.998978819870944720, -0.998981077669281130, -0.998983332970164730, -0.998985585773590090, -0.998987836079551550, -0.998990083888043330, -0.998992329199059890, -0.998994572012595670, --0.998996812328645010, -0.998999050147202360, -0.999001285468262060, -0.999003518291818550, -0.999005748617866170, -0.999007976446399490, -0.999010201777412840, -0.999012424610900780, --0.999014644946857540, -0.999016862785277790, -0.999019078126155760, -0.999021290969486110, -0.999023501315263300, -0.999025709163481550, -0.999027914514135640, -0.999030117367220030, --0.999032317722729050, -0.999034515580657260, -0.999036710940999110, -0.999038903803749270, -0.999041094168902190, -0.999043282036452320, -0.999045467406394330, -0.999047650278722550, --0.999049830653431780, -0.999052008530516340, -0.999054183909970920, -0.999056356791789950, -0.999058527175968210, -0.999060695062500060, -0.999062860451380260, -0.999065023342603280, --0.999067183736163770, -0.999069341632056180, -0.999071497030275310, -0.999073649930815710, -0.999075800333672050, -0.999077948238838780, -0.999080093646310670, -0.999082236556082300, --0.999084376968148450, -0.999086514882503550, -0.999088650299142400, -0.999090783218059660, -0.999092913639249900, -0.999095041562707900, -0.999097166988428210, -0.999099289916405730, --0.999101410346634910, -0.999103528279110640, -0.999105643713827480, -0.999107756650780330, -0.999109867089963740, -0.999111975031372390, -0.999114080475001280, -0.999116183420844850, --0.999118283868897890, -0.999120381819155300, -0.999122477271611850, -0.999124570226262110, -0.999126660683100960, -0.999128748642123090, -0.999130834103323480, -0.999132917066696710, --0.999134997532237670, -0.999137075499941130, -0.999139150969801880, -0.999141223941814700, -0.999143294415974600, -0.999145362392276140, -0.999147427870714310, -0.999149490851284020, --0.999151551333979930, -0.999153609318796930, -0.999155664805729930, -0.999157717794773690, -0.999159768285923230, -0.999161816279173330, -0.999163861774518990, -0.999165904771954880, --0.999167945271476010, -0.999169983273077380, -0.999172018776753660, -0.999174051782499960, -0.999176082290311070, -0.999178110300182110, -0.999180135812107740, -0.999182158826083080, --0.999184179342103020, -0.999186197360162560, -0.999188212880256610, -0.999190225902380050, -0.999192236426527990, -0.999194244452695330, -0.999196249980876970, -0.999198253011068130, --0.999200253543263580, -0.999202251577458340, -0.999204247113647530, -0.999206240151826130, -0.999208230691989160, -0.999210218734131520, -0.999212204278248420, -0.999214187324334760, --0.999216167872385540, -0.999218145922395990, -0.999220121474361120, -0.999222094528275930, -0.999224065084135530, -0.999226033141934810, -0.999227998701669230, -0.999229961763333450, --0.999231922326922930, -0.999233880392432550, -0.999235835959857430, -0.999237789029192690, -0.999239739600433550, -0.999241687673575020, -0.999243633248612320, -0.999245576325540560, --0.999247516904354760, -0.999249454985050240, -0.999251390567622020, -0.999253323652065430, -0.999255254238375470, -0.999257182326547370, -0.999259107916576240, -0.999261031008457420, --0.999262951602186030, -0.999264869697757300, -0.999266785295166330, -0.999268698394408460, -0.999270608995478820, -0.999272517098372610, -0.999274422703085090, -0.999276325809611570, --0.999278226417947280, -0.999280124528087340, -0.999282020140027090, -0.999283913253761870, -0.999285803869286780, -0.999287691986597280, -0.999289577605688480, -0.999291460726555720, --0.999293341349194340, -0.999295219473599560, -0.999297095099766830, -0.999298968227691260, -0.999300838857368310, -0.999302706988793310, -0.999304572621961480, -0.999306435756868280, --0.999308296393508930, -0.999310154531878880, -0.999312010171973350, -0.999313863313787910, -0.999315713957317770, -0.999317562102558400, -0.999319407749505010, -0.999321250898153160, --0.999323091548498190, -0.999324929700535550, -0.999326765354260460, -0.999328598509668600, -0.999330429166755190, -0.999332257325515670, -0.999334082985945500, -0.999335906148040130, --0.999337726811795000, -0.999339544977205560, -0.999341360644267260, -0.999343173812975550, -0.999344984483325980, -0.999346792655313900, -0.999348598328934750, -0.999350401504184190, --0.999352202181057690, -0.999354000359550580, -0.999355796039658520, -0.999357589221376960, -0.999359379904701360, -0.999361168089627380, -0.999362953776150480, -0.999364736964266200, --0.999366517653970110, -0.999368295845257660, -0.999370071538124520, -0.999371844732566130, -0.999373615428578170, -0.999375383626156190, -0.999377149325295750, -0.999378912525992420, --0.999380673228241760, -0.999382431432039530, -0.999384187137381090, -0.999385940344262310, -0.999387691052678660, -0.999389439262625690, -0.999391184974099180, -0.999392928187094690, --0.999394668901607890, -0.999396407117634440, -0.999398142835170030, -0.999399876054210100, -0.999401606774750650, -0.999403334996787130, -0.999405060720315210, -0.999406783945330670, --0.999408504671829180, -0.999410222899806410, -0.999411938629258150, -0.999413651860179940, -0.999415362592567690, -0.999417070826416950, -0.999418776561723620, -0.999420479798483250, --0.999422180536691850, -0.999423878776344870, -0.999425574517438190, -0.999427267759967600, -0.999428958503928880, -0.999430646749317700, -0.999432332496129950, -0.999434015744361300, --0.999435696494007650, -0.999437374745064780, -0.999439050497528460, -0.999440723751394590, -0.999442394506658840, -0.999444062763317100, -0.999445728521365150, -0.999447391780798890, --0.999449052541614200, -0.999450710803806870, -0.999452366567372800, -0.999454019832307860, -0.999455670598607740, -0.999457318866268540, -0.999458964635285940, -0.999460607905656050, --0.999462248677374540, -0.999463886950437420, -0.999465522724840680, -0.999467156000580000, -0.999468786777651500, -0.999470415056051050, -0.999472040835774570, -0.999473664116817930, --0.999475284899177140, -0.999476903182848210, -0.999478518967826910, -0.999480132254109480, -0.999481743041691570, -0.999483351330569310, -0.999484957120738700, -0.999486560412195750, --0.999488161204936330, -0.999489759498956580, -0.999491355294252370, -0.999492948590819830, -0.999494539388654850, -0.999496127687753530, -0.999497713488111890, -0.999499296789726040, --0.999500877592591870, -0.999502455896705500, -0.999504031702063030, -0.999505605008660480, -0.999507175816493950, -0.999508744125559460, -0.999510309935853100, -0.999511873247371010, --0.999513434060109170, -0.999514992374063720, -0.999516548189230860, -0.999518101505606600, -0.999519652323187070, -0.999521200641968480, -0.999522746461946830, -0.999524289783118250, --0.999525830605479060, -0.999527368929025270, -0.999528904753753000, -0.999530438079658580, -0.999531968906737900, -0.999533497234987410, -0.999535023064403230, -0.999536546394981350, --0.999538067226718230, -0.999539585559609870, -0.999541101393652600, -0.999542614728842540, -0.999544125565175910, -0.999545633902649060, -0.999547139741258080, -0.999548643080999220, --0.999550143921868810, -0.999551642263862950, -0.999553138106978100, -0.999554631451210260, -0.999556122296555990, -0.999557610643011300, -0.999559096490572620, -0.999560579839236300, --0.999562060688998440, -0.999563539039855400, -0.999565014891803600, -0.999566488244839180, -0.999567959098958570, -0.999569427454158000, -0.999570893310434030, -0.999572356667782660, --0.999573817526200450, -0.999575275885683730, -0.999576731746228850, -0.999578185107832030, -0.999579635970489820, -0.999581084334198570, -0.999582530198954490, -0.999583973564754150, --0.999585414431593880, -0.999586852799470020, -0.999588288668379120, -0.999589722038317420, -0.999591152909281470, -0.999592581281267600, -0.999594007154272270, -0.999595430528292030, --0.999596851403323110, -0.999598269779362060, -0.999599685656405330, -0.999601099034449380, -0.999602509913490760, -0.999603918293525790, -0.999605324174551060, -0.999606727556563100, --0.999608128439558150, -0.999609526823532990, -0.999610922708484060, -0.999612316094407700, -0.999613706981300590, -0.999615095369159270, -0.999616481257980190, -0.999617864647759920, --0.999619245538494900, -0.999620623930181810, -0.999621999822817190, -0.999623373216397600, -0.999624744110919510, -0.999626112506379560, -0.999627478402774330, -0.999628841800100480, --0.999630202698354450, -0.999631561097532930, -0.999632916997632570, -0.999634270398649830, -0.999635621300581480, -0.999636969703423970, -0.999638315607174200, -0.999639659011828500, --0.999640999917383750, -0.999642338323836420, -0.999643674231183280, -0.999645007639420990, -0.999646338548546120, -0.999647666958555450, -0.999648992869445530, -0.999650316281213260, --0.999651637193855080, -0.999652955607367890, -0.999654271521748240, -0.999655584936993020, -0.999656895853098800, -0.999658204270062250, -0.999659510187880240, -0.999660813606549460, --0.999662114526066680, -0.999663412946428580, -0.999664708867632030, -0.999666002289673620, -0.999667293212550210, -0.999668581636258600, -0.999669867560795460, -0.999671150986157660, --0.999672431912342120, -0.999673710339345380, -0.999674986267164440, -0.999676259695795990, -0.999677530625236900, -0.999678799055483960, -0.999680064986533940, -0.999681328418383860, --0.999682589351030490, -0.999683847784470610, -0.999685103718701120, -0.999686357153718900, -0.999687608089520730, -0.999688856526103510, -0.999690102463464240, -0.999691345901599690, --0.999692586840506770, -0.999693825280182360, -0.999695061220623350, -0.999696294661826750, -0.999697525603789440, -0.999698754046508320, -0.999699979989980280, -0.999701203434202210, --0.999702424379171230, -0.999703642824884220, -0.999704858771337970, -0.999706072218529700, -0.999707283166456180, -0.999708491615114550, -0.999709697564501560, -0.999710901014614350, --0.999712101965450020, -0.999713300417005240, -0.999714496369277340, -0.999715689822263220, -0.999716880775959770, -0.999718069230364210, -0.999719255185473440, -0.999720438641284570, --0.999721619597794490, -0.999722798055000420, -0.999723974012899360, -0.999725147471488440, -0.999726318430764540, -0.999727486890724990, -0.999728652851366580, -0.999729816312686540, --0.999730977274682080, -0.999732135737350090, -0.999733291700687810, -0.999734445164692230, -0.999735596129360580, -0.999736744594689860, -0.999737890560677410, -0.999739034027320230, --0.999740174994615320, -0.999741313462560120, -0.999742449431151540, -0.999743582900386900, -0.999744713870263310, -0.999745842340777900, -0.999746968311927890, -0.999748091783710490, --0.999749212756122830, -0.999750331229162130, -0.999751447202825600, -0.999752560677110490, -0.999753671652013900, -0.999754780127533270, -0.999755886103665500, -0.999756989580408150, --0.999758090557758330, -0.999759189035713260, -0.999760285014270170, -0.999761378493426500, -0.999762469473179260, -0.999763557953525890, -0.999764643934463630, -0.999765727415989680, --0.999766808398101500, -0.999767886880796320, -0.999768962864071350, -0.999770036347924050, -0.999771107332351530, -0.999772175817351340, -0.999773241802920710, -0.999774305289056970, --0.999775366275757470, -0.999776424763019530, -0.999777480750840610, -0.999778534239217920, -0.999779585228148800, -0.999780633717630930, -0.999781679707661300, -0.999782723198237580, --0.999783764189356990, -0.999784802681016990, -0.999785838673215020, -0.999786872165948410, -0.999787903159214620, -0.999788931653011080, -0.999789957647335250, -0.999790981142184560, --0.999792002137556370, -0.999793020633448100, -0.999794036629857330, -0.999795050126781490, -0.999796061124218040, -0.999797069622164410, -0.999798075620618180, -0.999799079119576660, --0.999800080119037430, -0.999801078618998140, -0.999802074619456030, -0.999803068120408760, -0.999804059121853770, -0.999805047623788750, -0.999806033626211010, -0.999807017129118240, --0.999807998132507980, -0.999808976636377580, -0.999809952640724810, -0.999810926145547230, -0.999811897150842290, -0.999812865656607540, -0.999813831662840660, -0.999814795169539310, --0.999815756176700820, -0.999816714684322980, -0.999817670692403460, -0.999818624200939590, -0.999819575209929260, -0.999820523719370020, -0.999821469729259450, -0.999822413239595200, --0.999823354250374830, -0.999824292761596230, -0.999825228773256750, -0.999826162285354260, -0.999827093297886440, -0.999828021810850840, -0.999828947824245140, -0.999829871338067110, --0.999830792352314310, -0.999831710866984640, -0.999832626882075640, -0.999833540397585100, -0.999834451413510790, -0.999835359929850180, -0.999836265946601240, -0.999837169463761670, --0.999838070481329220, -0.999838968999301470, -0.999839865017676410, -0.999840758536451600, -0.999841649555624930, -0.999842538075194190, -0.999843424095157030, -0.999844307615511350, --0.999845188636254930, -0.999846067157385440, -0.999846943178900880, -0.999847816700798920, -0.999848687723077440, -0.999849556245734240, -0.999850422268767080, -0.999851285792173970, --0.999852146815952580, -0.999853005340100800, -0.999853861364616510, -0.999854714889497620, -0.999855565914742010, -0.999856414440347340, -0.999857260466311740, -0.999858103992632860, --0.999858945019308830, -0.999859783546337420, -0.999860619573716520, -0.999861453101444140, -0.999862284129518050, -0.999863112657936370, -0.999863938686696760, -0.999864762215797340, --0.999865583245236110, -0.999866401775010850, -0.999867217805119560, -0.999868031335560240, -0.999868842366330890, -0.999869650897429410, -0.999870456928853790, -0.999871260460602040, --0.999872061492672160, -0.999872860025062040, -0.999873656057769900, -0.999874449590793520, -0.999875240624131020, -0.999876029157780510, -0.999876815191739880, -0.999877598726007120, --0.999878379760580470, -0.999879158295457810, -0.999879934330637270, -0.999880707866116940, -0.999881478901894830, -0.999882247437969050, -0.999883013474337610, -0.999883777010998620, --0.999884538047950190, -0.999885296585190430, -0.999886052622717350, -0.999886806160529270, -0.999887557198624100, -0.999888305737000050, -0.999889051775655240, -0.999889795314587880, --0.999890536353795880, -0.999891274893277670, -0.999892010933031260, -0.999892744473054760, -0.999893475513346400, -0.999894204053904390, -0.999894930094726850, -0.999895653635812010, --0.999896374677157970, -0.999897093218763080, -0.999897809260625440, -0.999898522802743160, -0.999899233845114700, -0.999899942387738160, -0.999900648430611770, -0.999901351973733640, --0.999902053017102220, -0.999902751560715730, -0.999903447604572280, -0.999904141148670210, -0.999904832193007740, -0.999905520737583320, -0.999906206782394950, -0.999906890327441180, --0.999907571372720130, -0.999908249918230130, -0.999908925963969630, -0.999909599509936740, -0.999910270556129800, -0.999910939102547250, -0.999911605149187310, -0.999912268696048320, --0.999912929743128730, -0.999913588290426870, -0.999914244337940960, -0.999914897885669450, -0.999915548933610680, -0.999916197481763080, -0.999916843530124890, -0.999917487078694660, --0.999918128127470720, -0.999918766676451520, -0.999919402725635290, -0.999920036275020570, -0.999920667324605830, -0.999921295874389380, -0.999921921924369680, -0.999922545474545180, --0.999923166524914420, -0.999923785075475640, -0.999924401126227380, -0.999925014677168100, -0.999925625728296350, -0.999926234279610580, -0.999926840331109120, -0.999927443882790650, --0.999928044934653480, -0.999928643486696300, -0.999929239538917440, -0.999929833091315450, -0.999930424143888890, -0.999931012696636310, -0.999931598749556280, -0.999932182302647130, --0.999932763355907530, -0.999933341909336030, -0.999933917962931180, -0.999934491516691560, -0.999935062570615710, -0.999935631124702300, -0.999936197178949660, -0.999936760733356580, --0.999937321787921610, -0.999937880342643300, -0.999938436397520340, -0.999938989952551260, -0.999939541007734740, -0.999940089563069350, -0.999940635618553620, -0.999941179174186460, --0.999941720229966300, -0.999942258785891820, -0.999942794841961690, -0.999943328398174680, -0.999943859454529240, -0.999944388011024140, -0.999944914067658170, -0.999945437624429780, --0.999945958681337840, -0.999946477238381040, -0.999946993295558140, -0.999947506852867600, -0.999948017910308410, -0.999948526467879020, -0.999949032525578430, -0.999949536083405310, --0.999950037141358220, -0.999950535699436150, -0.999951031757637670, -0.999951525315961650, -0.999952016374406780, -0.999952504932971830, -0.999952990991655690, -0.999953474550457130, --0.999953955609374720, -0.999954434168407570, -0.999954910227554230, -0.999955383786813700, -0.999955854846184660, -0.999956323405665980, -0.999956789465256570, -0.999957253024955080, --0.999957714084760530, -0.999958172644671680, -0.999958628704687440, -0.999959082264806560, -0.999959533325027960, -0.999959981885350510, -0.999960427945773220, -0.999960871506294760, --0.999961312566914230, -0.999961751127630310, -0.999962187188441990, -0.999962620749348270, -0.999963051810348060, -0.999963480371440120, -0.999963906432623560, -0.999964329993897170, --0.999964751055259950, -0.999965169616710890, -0.999965585678248890, -0.999965999239872950, -0.999966410301581950, -0.999966818863375020, -0.999967224925250920, -0.999967628487208880, --0.999968029549247680, -0.999968428111366440, -0.999968824173564140, -0.999969217735839800, -0.999969608798192410, -0.999969997360620980, -0.999970383423124500, -0.999970766985702090, --0.999971148048352850, -0.999971526611075690, -0.999971902673869710, -0.999972276236733900, -0.999972647299667510, -0.999973015862669400, -0.999973381925738810, -0.999973745488874850, --0.999974106552076410, -0.999974465115342710, -0.999974821178672870, -0.999975174742065990, -0.999975525805521180, -0.999975874369037570, -0.999976220432614250, -0.999976563996250340, --0.999976905059945080, -0.999977243623697550, -0.999977579687506890, -0.999977913251372310, -0.999978244315292920, -0.999978572879267950, -0.999978898943296500, -0.999979222507377810, --0.999979543571511090, -0.999979862135695450, -0.999980178199930240, -0.999980491764214550, -0.999980802828547620, -0.999981111392928670, -0.999981417457357020, -0.999981721021831800, --0.999982022086352230, -0.999982320650917630, -0.999982616715527240, -0.999982910280180270, -0.999983201344876060, -0.999983489909613830, -0.999983775974392920, -0.999984059539212540, --0.999984340604071930, -0.999984619168970630, -0.999984895233907660, -0.999985168798882550, -0.999985439863894430, -0.999985708428942740, -0.999985974494026710, -0.999986238059145880, --0.999986499124299380, -0.999986757689486640, -0.999987013754707000, -0.999987267319959790, -0.999987518385244470, -0.999987766950560350, -0.999988013015906780, -0.999988256581283210, --0.999988497646689070, -0.999988736212123590, -0.999988972277586320, -0.999989205843076490, -0.999989436908593770, -0.999989665474137480, -0.999989891539706970, -0.999990115105301780, --0.999990336170921260, -0.999990554736564840, -0.999990770802232090, -0.999990984367922440, -0.999991195433635350, -0.999991403999370140, -0.999991610065126600, -0.999991813630903950, --0.999992014696701740, -0.999992213262519520, -0.999992409328356760, -0.999992602894212990, -0.999992793960087670, -0.999992982525980460, -0.999993168591890690, -0.999993352157818040, --0.999993533223762050, -0.999993711789722180, -0.999993887855698090, -0.999994061421689230, -0.999994232487695140, -0.999994401053715620, -0.999994567119749990, -0.999994730685798030, --0.999994891751859180, -0.999995050317933120, -0.999995206384019400, -0.999995359950117680, -0.999995511016227630, -0.999995659582348710, -0.999995805648480670, -0.999995949214623090, --0.999996090280775740, -0.999996228846938060, -0.999996364913109840, -0.999996498479290730, -0.999996629545480410, -0.999996758111678430, -0.999996884177884570, -0.999997007744098500, --0.999997128810319990, -0.999997247376548600, -0.999997363442784120, -0.999997477009026190, -0.999997588075274610, -0.999997696641529040, -0.999997802707789150, -0.999997906274054830, --0.999998007340325730, -0.999998105906601650, -0.999998201972882250, -0.999998295539167410, -0.999998386605456810, -0.999998475171750220, -0.999998561238047420, -0.999998644804348300, --0.999998725870652530, -0.999998804436959880, -0.999998880503270350, -0.999998954069583500, -0.999999025135899330, -0.999999093702217620, -0.999999159768538040, -0.999999223334860690, --0.999999284401185240, -0.999999342967511580, -0.999999399033839610, -0.999999452600169090, -0.999999503666499920, -0.999999552232832100, -0.999999598299165290, -0.999999641865499500, --0.999999682931834610, -0.999999721498170510, -0.999999757564507100, -0.999999791130844360, -0.999999822197182090, -0.999999850763520270, -0.999999876829858910, -0.999999900396197680, --0.999999921462536800, -0.999999940028876160, -0.999999956095215640, -0.999999969661555240, -0.999999980727894870, -0.999999989294234610, -0.999999995360574270, -0.999999998926914050, --0.999999999993253730, -0.999999998559593540, -0.999999994625933250, -0.999999988192273090, -0.999999979258612840, -0.999999967824952710, -0.999999953891292590, -0.999999937457632600, --0.999999918523972850, -0.999999897090313230, -0.999999873156653950, -0.999999846722994910, -0.999999817789336220, -0.999999786355678100, -0.999999752422020440, -0.999999715988363350, --0.999999677054707050, -0.999999635621051540, -0.999999591687396940, -0.999999545253743350, -0.999999496320091000, -0.999999444886439770, -0.999999390952790000, -0.999999334519141690, --0.999999275585495170, -0.999999214151850340, -0.999999150218207510, -0.999999083784566810, -0.999999014850928350, -0.999998943417292450, -0.999998869483659130, -0.999998793050028700, --0.999998714116401180, -0.999998632682777000, -0.999998548749156170, -0.999998462315538910, -0.999998373381925540, -0.999998281948316300, -0.999998188014711300, -0.999998091581110860, --0.999997992647515100, -0.999997891213924460, -0.999997787280339060, -0.999997680846759220, -0.999997571913185170, -0.999997460479617130, -0.999997346546055540, -0.999997230112500520, --0.999997111178952400, -0.999996989745411510, -0.999996865811878190, -0.999996739378352760, -0.999996610444835340, -0.999996479011326490, -0.999996345077826420, -0.999996208644335470, --0.999996069710853970, -0.999995928277382370, -0.999995784343920890, -0.999995637910470080, -0.999995488977030060, -0.999995337543601260, -0.999995183610184250, -0.999995027176779240, --0.999994868243386570, -0.999994706810006790, -0.999994542876640360, -0.999994376443287370, -0.999994207509948610, -0.999994036076624290, -0.999993862143314760, -0.999993685710020670, --0.999993506776742370, -0.999993325343480290, -0.999993141410234990, -0.999992954977006690, -0.999992766043796060, -0.999992574610603540, -0.999992380677429570, -0.999992184244274610, --0.999991985311139310, -0.999991783878023900, -0.999991579944929150, -0.999991373511855300, -0.999991164578803100, -0.999990953145773020, -0.999990739212765600, -0.999990522779781290, --0.999990303846820640, -0.999990082413884210, -0.999989858480972550, -0.999989632048086330, -0.999989403115225990, -0.999989171682392210, -0.999988937749585420, -0.999988701316806280, --0.999988462384055480, -0.999988220951333440, -0.999987977018640840, -0.999987730585978340, -0.999987481653346500, -0.999987230220745980, -0.999986976288177340, -0.999986719855641360, --0.999986460923138480, -0.999986199490669470, -0.999985935558234900, -0.999985669125835640, -0.999985400193472040, -0.999985128761145090, -0.999984854828855240, -0.999984578396603260, --0.999984299464389830, -0.999984018032215700, -0.999983734100081460, -0.999983447667987970, -0.999983158735935800, -0.999982867303925720, -0.999982573371958510, -0.999982276940034830, --0.999981978008155470, -0.999981676576321200, -0.999981372644532680, -0.999981066212790700, -0.999980757281096140, -0.999980445849449670, -0.999980131917852070, -0.999979815486304210, --0.999979496554806670, -0.999979175123360540, -0.999978851191966390, -0.999978524760625100, -0.999978195829337560, -0.999977864398104430, -0.999977530466926720, -0.999977194035805210, --0.999976855104740660, -0.999976513673733970, -0.999976169742786030, -0.999975823311897600, -0.999975474381069710, -0.999975122950303110, -0.999974769019598700, -0.999974412588957250, --0.999974053658379880, -0.999973692227867360, -0.999973328297420690, -0.999972961867040540, -0.999972592936728130, -0.999972221506484130, -0.999971847576309640, -0.999971471146205550, --0.999971092216172750, -0.999970710786212250, -0.999970326856324920, -0.999969940426511770, -0.999969551496773800, -0.999969160067111900, -0.999968766137527170, -0.999968369708020500, --0.999967970778592900, -0.999967569349245360, -0.999967165419978990, -0.999966758990794570, -0.999966350061693320, -0.999965938632676240, -0.999965524703744220, -0.999965108274898480, --0.999964689346139910, -0.999964267917469620, -0.999963843988888710, -0.999963417560398080, -0.999962988631999060, -0.999962557203692430, -0.999962123275479510, -0.999961686847361200, --0.999961247919338710, -0.999960806491413170, -0.999960362563585560, -0.999959916135857000, -0.999959467208228700, -0.999959015780701680, -0.999958561853277140, -0.999958105425956200, --0.999957646498740080, -0.999957185071629780, -0.999956721144626530, -0.999956254717731420, -0.999955785790945680, -0.999955314364270540, -0.999954840437707100, -0.999954364011256480, --0.999953885084920000, -0.999953403658698890, -0.999952919732594150, -0.999952433306607210, -0.999951944380739090, -0.999951452954991220, -0.999950959029364590, -0.999950462603860670, --0.999949963678480550, -0.999949462253225560, -0.999948958328096830, -0.999948451903095780, -0.999947942978223540, -0.999947431553481540, -0.999946917628870890, -0.999946401204392930, --0.999945882280048990, -0.999945360855840400, -0.999944836931768390, -0.999944310507834170, -0.999943781584039290, -0.999943250160384990, -0.999942716236872480, -0.999942179813503200, --0.999941640890278480, -0.999941099467199670, -0.999940555544268080, -0.999940009121485060, -0.999939460198852050, -0.999938908776370480, -0.999938354854041590, -0.999937798431866810, --0.999937239509847480, -0.999936678087985030, -0.999936114166281030, -0.999935547744736590, -0.999934978823353360, -0.999934407402132690, -0.999933833481076010, -0.999933257060184770, --0.999932678139460300, -0.999932096718904150, -0.999931512798517770, -0.999930926378302610, -0.999930337458260210, -0.999929746038391910, -0.999929152118699260, -0.999928555699183710, --0.999927956779846800, -0.999927355360689880, -0.999926751441714720, -0.999926145022922650, -0.999925536104315120, -0.999924924685893890, -0.999924310767660310, -0.999923694349615920, --0.999923075431762290, -0.999922454014100960, -0.999921830096633490, -0.999921203679361550, -0.999920574762286460, -0.999919943345410010, -0.999919309428733750, -0.999918673012259120, --0.999918034095987780, -0.999917392679921520, -0.999916748764061670, -0.999916102348409890, -0.999915453432967950, -0.999914802017737410, -0.999914148102719720, -0.999913491687916770, --0.999912832773330100, -0.999912171358961270, -0.999911507444812050, -0.999910841030884120, -0.999910172117179030, -0.999909500703698550, -0.999908826790444240, -0.999908150377417980, --0.999907471464621220, -0.999906790052055850, -0.999906106139723530, -0.999905419727625810, -0.999904730815764700, -0.999904039404141740, -0.999903345492758610, -0.999902649081617190, --0.999901950170719030, -0.999901248760066140, -0.999900544849660070, -0.999899838439502590, -0.999899129529595590, -0.999898418119940740, -0.999897704210539810, -0.999896987801394690, --0.999896268892507050, -0.999895547483878660, -0.999894823575511520, -0.999894097167407290, -0.999893368259567870, -0.999892636851994920, -0.999891902944690440, -0.999891166537656200, --0.999890427630894090, -0.999889686224405880, -0.999888942318193360, -0.999888195912258640, -0.999887447006603370, -0.999886695601229450, -0.999885941696138760, -0.999885185291333300, --0.999884426386814850, -0.999883664982585300, -0.999882901078646640, -0.999882134675000640, -0.999881365771649430, -0.999880594368594780, -0.999879820465838560, -0.999879044063382790, --0.999878265161229460, -0.999877483759380570, -0.999876699857837780, -0.999875913456603320, -0.999875124555679170, -0.999874333155067130, -0.999873539254769180, -0.999872742854787440, --0.999871943955123910, -0.999871142555780470, -0.999870338656759120, -0.999869532258061970, -0.999868723359691010, -0.999867911961648260, -0.999867098063935700, -0.999866281666555450, --0.999865462769509380, -0.999864641372799730, -0.999863817476428500, -0.999862991080397670, -0.999862162184709360, -0.999861330789365680, -0.999860496894368620, -0.999859660499720420, --0.999858821605422940, -0.999857980211478540, -0.999857136317889080, -0.999856289924656800, -0.999855441031783810, -0.999854589639272210, -0.999853735747124220, -0.999852879355341840, --0.999852020463927180, -0.999851159072882580, -0.999850295182210020, -0.999849428791911740, -0.999848559901989840, -0.999847688512446650, -0.999846814623284170, -0.999845938234504630, --0.999845059346110340, -0.999844177958103320, -0.999843294070485890, -0.999842407683260160, -0.999841518796428460, -0.999840627409993020, -0.999839733523955940, -0.999838837138319560, --0.999837938253086090, -0.999837036868257760, -0.999836132983836780, -0.999835226599825600, -0.999834317716226220, -0.999833406333041070, -0.999832492450272500, -0.999831576067922610, --0.999830657185993840, -0.999829735804488420, -0.999828811923408560, -0.999827885542756810, -0.999826956662535290, -0.999826025282746330, -0.999825091403392370, -0.999824155024475640, --0.999823216145998560, -0.999822274767963480, -0.999821330890372620, -0.999820384513228520, -0.999819435636533420, -0.999818484260289630, -0.999817530384499720, -0.999816574009166010, --0.999815615134290850, -0.999814653759876660, -0.999813689885925780, -0.999812723512440770, -0.999811754639423840, -0.999810783266877670, -0.999809809394804460, -0.999808833023206670, --0.999807854152086840, -0.999806872781447420, -0.999805888911290740, -0.999804902541619470, -0.999803913672435820, -0.999802922303742460, -0.999801928435541720, -0.999800932067836160, --0.999799933200628320, -0.999798931833920660, -0.999797927967715610, -0.999796921602015830, -0.999795912736823670, -0.999794901372141780, -0.999793887507972600, -0.999792871144318700, --0.999791852281182610, -0.999790830918566910, -0.999789807056474130, -0.999788780694906840, -0.999787751833867590, -0.999786720473359040, -0.999785686613383630, -0.999784650253943920, --0.999783611395042680, -0.999782570036682360, -0.999781526178865730, -0.999780479821595120, -0.999779430964873430, -0.999778379608703190, -0.999777325753086870, -0.999776269398027330, --0.999775210543527030, -0.999774149189588850, -0.999773085336215120, -0.999772018983408840, -0.999770950131172450, -0.999769878779508630, -0.999768804928420130, -0.999767728577909740, --0.999766649727979910, -0.999765568378633510, -0.999764484529873100, -0.999763398181701570, -0.999762309334121470, -0.999761217987135690, -0.999760124140746780, -0.999759027794957620, --0.999757928949770890, -0.999756827605189360, -0.999755723761215690, -0.999754617417852760, -0.999753508575103260, -0.999752397232969940, -0.999751283391455690, -0.999750167050563300, --0.999749048210295420, -0.999747926870654830, -0.999746803031644540, -0.999745676693267190, -0.999744547855525690, -0.999743416518422800, -0.999742282681961410, -0.999741146346144300, --0.999740007510974250, -0.999738866176454240, -0.999737722342587070, -0.999736576009375600, -0.999735427176822730, -0.999734275844931240, -0.999733122013704010, -0.999731965683144040, --0.999730806853254110, -0.999729645524037200, -0.999728481695496220, -0.999727315367633930, -0.999726146540453440, -0.999724975213957530, -0.999723801388149200, -0.999722625063031440, --0.999721446238607040, -0.999720264914878980, -0.999719081091850370, -0.999717894769524000, -0.999716705947902850, -0.999715514626990040, -0.999714320806788350, -0.999713124487300870, --0.999711925668530620, -0.999710724350480580, -0.999709520533153650, -0.999708314216552930, -0.999707105400681530, -0.999705894085542220, -0.999704680271138240, -0.999703463957472670, --0.999702245144548310, -0.999701023832368360, -0.999699800020935840, -0.999698573710253830, -0.999697344900325360, -0.999696113591153620, -0.999694879782741520, -0.999693643475092260, --0.999692404668208860, -0.999691163362094400, -0.999689919556752130, -0.999688673252185020, -0.999687424448396200, -0.999686173145388880, -0.999684919343166060, -0.999683663041731060, --0.999682404241086790, -0.999681142941236560, -0.999679879142183370, -0.999678612843930670, -0.999677344046481230, -0.999676072749838610, -0.999674798954005680, -0.999673522658985790, --0.999672243864782150, -0.999670962571397870, -0.999669678778836170, -0.999668392487100270, -0.999667103696193380, -0.999665812406118850, -0.999664518616879660, -0.999663222328479150, --0.999661923540920650, -0.999660622254207380, -0.999659318468342440, -0.999658012183329280, -0.999656703399171120, -0.999655392115871180, -0.999654078333432670, -0.999652762051859050, --0.999651443271153520, -0.999650121991319420, -0.999648798212359970, -0.999647471934278500, -0.999646143157078340, -0.999644811880762930, -0.999643478105335380, -0.999642141830799140, --0.999640803057157630, -0.999639461784414100, -0.999638118012571850, -0.999636771741634340, -0.999635422971604900, -0.999634071702486860, -0.999632717934283650, -0.999631361666998730, --0.999630002900635310, -0.999628641635196940, -0.999627277870686950, -0.999625911607108790, -0.999624542844465780, -0.999623171582761480, -0.999621797821999230, -0.999620421562182560, --0.999619042803314710, -0.999617661545399330, -0.999616277788439760, -0.999614891532439540, -0.999613502777402020, -0.999612111523330850, -0.999610717770229360, -0.999609321518101000, --0.999607922766949430, -0.999606521516777980, -0.999605117767590310, -0.999603711519389760, -0.999602302772179980, -0.999600891525964430, -0.999599477780746650, -0.999598061536530190, --0.999596642793318610, -0.999595221551115350, -0.999593797809924080, -0.999592371569748340, -0.999590942830591580, -0.999589511592457570, -0.999588077855349750, -0.999586641619271690, --0.999585202884227030, -0.999583761650219450, -0.999582317917252380, -0.999580871685329500, -0.999579422954454460, -0.999577971724630920, -0.999576517995862450, -0.999575061768152580, --0.999573603041505110, -0.999572141815923690, -0.999570678091411870, -0.999569211867973430, -0.999567743145611810, -0.999566271924330900, -0.999564798204134350, -0.999563321985025840, --0.999561843267008920, -0.999560362050087470, -0.999558878334265040, -0.999557392119545530, -0.999555903405932370, -0.999554412193429550, -0.999552918482040750, -0.999551422271769630, --0.999549923562619960, -0.999548422354595400, -0.999546918647699840, -0.999545412441936950, -0.999543903737310610, -0.999542392533824490, -0.999540878831482350, -0.999539362630287980, --0.999537843930245250, -0.999536322731357950, -0.999534799033629740, -0.999533272837064610, -0.999531744141666230, -0.999530212947438600, -0.999528679254385380, -0.999527143062510450, --0.999525604371817700, -0.999524063182310910, -0.999522519493993960, -0.999520973306870730, -0.999519424620945010, -0.999517873436220780, -0.999516319752701940, -0.999514763570392150, --0.999513204889295510, -0.999511643709415920, -0.999510080030757140, -0.999508513853323290, -0.999506945177118020, -0.999505374002145450, -0.999503800328409350, -0.999502224155913830, --0.999500645484662780, -0.999499064314660070, -0.999497480645909710, -0.999495894478415690, -0.999494305812181900, -0.999492714647212340, -0.999491120983511010, -0.999489524821081890, --0.999487926159928870, -0.999486325000056080, -0.999484721341467490, -0.999483115184167100, -0.999481506528158930, -0.999479895373447060, -0.999478281720035390, -0.999476665567927910, --0.999475046917128850, -0.999473425767642200, -0.999471802119472060, -0.999470175972622330, -0.999468547327097110, -0.999466916182900620, -0.999465282540036750, -0.999463646398509710, --0.999462007758323610, -0.999460366619482340, -0.999458722981990340, -0.999457076845851390, -0.999455428211069810, -0.999453777077649710, -0.999452123445595090, -0.999450467314910160, --0.999448808685599150, -0.999447147557666060, -0.999445483931115100, -0.999443817805950370, -0.999442149182176220, -0.999440478059796520, -0.999438804438815830, -0.999437128319238030, --0.999435449701067350, -0.999433768584308100, -0.999432084968964520, -0.999430398855040590, -0.999428710242540760, -0.999427019131469140, -0.999425325521829940, -0.999423629413627390, --0.999421930806865810, -0.999420229701549420, -0.999418526097682450, -0.999416819995269210, -0.999415111394313830, -0.999413400294820730, -0.999411686696794140, -0.999409970600238280, --0.999408252005157480, -0.999406530911556180, -0.999404807319438370, -0.999403081228808720, -0.999401352639671230, -0.999399621552030440, -0.999397887965890570, -0.999396151881255970, --0.999394413298131060, -0.999392672216520060, -0.999390928636427310, -0.999389182557857360, -0.999387433980814420, -0.999385682905302830, -0.999383929331327030, -0.999382173258891560, --0.999380414688000540, -0.999378653618658410, -0.999376890050869830, -0.999375123984638900, -0.999373355419970190, -0.999371584356868130, -0.999369810795337040, -0.999368034735381380, --0.999366256177005810, -0.999364475120214420, -0.999362691565012010, -0.999360905511402780, -0.999359116959391280, -0.999357325908981960, -0.999355532360179380, -0.999353736312987960, --0.999351937767412160, -0.999350136723456520, -0.999348333181125590, -0.999346527140423820, -0.999344718601355760, -0.999342907563925850, -0.999341094028138640, -0.999339277993998800, --0.999337459461510650, -0.999335638430678960, -0.999333814901508080, -0.999331988874002760, -0.999330160348167350, -0.999328329324006610, -0.999326495801525110, -0.999324659780727260, --0.999322821261617760, -0.999320980244201240, -0.999319136728482270, -0.999317290714465510, -0.999315442202155510, -0.999313591191556830, -0.999311737682674230, -0.999309881675512270, --0.999308023170075610, -0.999306162166368920, -0.999304298664396850, -0.999302432664163960, -0.999300564165675030, -0.999298693168934600, -0.999296819673947570, -0.999294943680718360, --0.999293065189251870, -0.999291184199552760, -0.999289300711625690, -0.999287414725475220, -0.999285526241106340, -0.999283635258523590, -0.999281741777731880, -0.999279845798735630, --0.999277947321539850, -0.999276046346149190, -0.999274142872568440, -0.999272236900802360, -0.999270328430855610, -0.999268417462733090, -0.999266503996439570, -0.999264588031979710, --0.999262669569358390, -0.999260748608580500, -0.999258825149650590, -0.999256899192573660, -0.999254970737354590, -0.999253039783997930, -0.999251106332508800, -0.999249170382891850, --0.999247231935151970, -0.999245290989294040, -0.999243347545322850, -0.999241401603243260, -0.999239453163060290, -0.999237502224778580, -0.999235548788403150, -0.999233592853938870, --0.999231634421390510, -0.999229673490763190, -0.999227710062061570, -0.999225744135290750, -0.999223775710455510, -0.999221804787560950, -0.999219831366611740, -0.999217855447613100, --0.999215877030569690, -0.999213896115486610, -0.999211912702368870, -0.999209926791221340, -0.999207938382048910, -0.999205947474856690, -0.999203954069649570, -0.999201958166432540, --0.999199959765210700, -0.999197958865988940, -0.999195955468772270, -0.999193949573565670, -0.999191941180374240, -0.999189930289202890, -0.999187916900056820, -0.999185901012940910, --0.999183882627860290, -0.999181861744819930, -0.999179838363824850, -0.999177812484880250, -0.999175784107991130, -0.999173753233162490, -0.999171719860399540, -0.999169683989707180, --0.999167645621090730, -0.999165604754555070, -0.999163561390105540, -0.999161515527747010, -0.999159467167484610, -0.999157416309323640, -0.999155362953269120, -0.999153307099326260, --0.999151248747500050, -0.999149187897795720, -0.999147124550218370, -0.999145058704773330, -0.999142990361465590, -0.999140919520300370, -0.999138846181282900, -0.999136770344418170, --0.999134692009711610, -0.999132611177168340, -0.999130527846793570, -0.999128442018592410, -0.999126353692570190, -0.999124262868732020, -0.999122169547083330, -0.999120073727629120, --0.999117975410374730, -0.999115874595325360, -0.999113771282486350, -0.999111665471862920, -0.999109557163460280, -0.999107446357283880, -0.999105333053338710, -0.999103217251630320, --0.999101098952163810, -0.999098978154944530, -0.999096854859977900, -0.999094729067269150, -0.999092600776823490, -0.999090469988646370, -0.999088336702743000, -0.999086200919118930, --0.999084062637779270, -0.999081921858729460, -0.999079778581974830, -0.999077632807520710, -0.999075484535372650, -0.999073333765535750, -0.999071180498015580, -0.999069024732817450, --0.999066866469946690, -0.999064705709408860, -0.999062542451209290, -0.999060376695353300, -0.999058208441846340, -0.999056037690693950, -0.999053864441901360, -0.999051688695474120, --0.999049510451417770, -0.999047329709737530, -0.999045146470439070, -0.999042960733527610, -0.999040772499008910, -0.999038581766888200, -0.999036388537171030, -0.999034192809862830, --0.999031994584969270, -0.999029793862495570, -0.999027590642447500, -0.999025384924830510, -0.999023176709649910, -0.999020965996911480, -0.999018752786620560, -0.999016537078782800, --0.999014318873403750, -0.999012098170488750, -0.999009874970043680, -0.999007649272073750, -0.999005421076584850, -0.999003190383582320, -0.999000957193071800, -0.998998721505058970, --0.998996483319549270, -0.998994242636548350, -0.998991999456061870, -0.998989753778095400, -0.998987505602654480, -0.998985254929744880, -0.998983001759372050, -0.998980746091541860, --0.998978487926259650, -0.998976227263531300, -0.998973964103362370, -0.998971698445758500, -0.998969430290725380, -0.998967159638268760, -0.998964886488394210, -0.998962610841107380, --0.998960332696414150, -0.998958052054319980, -0.998955768914830730, -0.998953483277951970, -0.998951195143689570, -0.998948904512049210, -0.998946611383036640, -0.998944315756657430, --0.998942017632917460, -0.998939717011822490, -0.998937413893378200, -0.998935108277590360, -0.998932800164464730, -0.998930489554007090, -0.998928176446223340, -0.998925860841119010, --0.998923542738700100, -0.998921222138972280, -0.998918899041941530, -0.998916573447613420, -0.998914245355993930, -0.998911914767088850, -0.998909581680903940, -0.998907246097445080, --0.998904908016718050, -0.998902567438728850, -0.998900224363483140, -0.998897878790986900, -0.998895530721246040, -0.998893180154266200, -0.998890827090053500, -0.998888471528613820, --0.998886113469952820, -0.998883752914076610, -0.998881389860991060, -0.998879024310701970, -0.998876656263215310, -0.998874285718536980, -0.998871912676672970, -0.998869537137629270, --0.998867159101411660, -0.998864778568026130, -0.998862395537478690, -0.998860010009775200, -0.998857621984921670, -0.998855231462924210, -0.998852838443788580, -0.998850442927520900, --0.998848044914127040, -0.998845644403613120, -0.998843241395985130, -0.998840835891248950, -0.998838427889410800, -0.998836017390476450, -0.998833604394452120, -0.998831188901343810, --0.998828770911157520, -0.998826350423899220, -0.998823927439575040, -0.998821501958191190, -0.998819073979753450, -0.998816643504268130, -0.998814210531741130, -0.998811775062178550, --0.998809337095586610, -0.998806896631971310, -0.998804453671338850, -0.998802008213695140, -0.998799560259046480, -0.998797109807398890, -0.998794656858758460, -0.998792201413131520, --0.998789743470523960, -0.998787283030942110, -0.998784820094392070, -0.998782354660879950, -0.998779886730411960, -0.998777416302994210, -0.998774943378632930, -0.998772467957334320, --0.998769990039104600, -0.998767509623949780, -0.998765026711876280, -0.998762541302890110, -0.998760053396997690, -0.998757562994205150, -0.998755070094518580, -0.998752574697944430, --0.998750076804488800, -0.998747576414158010, -0.998745073526958290, -0.998742568142895860, -0.998740060261977040, -0.998737549884208040, -0.998735037009595210, -0.998732521638144740, --0.998730003769862980, -0.998727483404756140, -0.998724960542830660, -0.998722435184092760, -0.998719907328548870, -0.998717376976205110, -0.998714844127067900, -0.998712308781143590, --0.998709770938438600, -0.998707230598959050, -0.998704687762711480, -0.998702142429702230, -0.998699594599937620, -0.998697044273423980, -0.998694491450167750, -0.998691936130175260, --0.998689378313452950, -0.998686818000007250, -0.998684255189844490, -0.998681689882971010, -0.998679122079393360, -0.998676551779117960, -0.998673978982151040, -0.998671403688499270, --0.998668825898168970, -0.998666245611166680, -0.998663662827498740, -0.998661077547171590, -0.998658489770191780, -0.998655899496565750, -0.998653306726299930, -0.998650711459400870, --0.998648113695875030, -0.998645513435728940, -0.998642910678969040, -0.998640305425601780, -0.998637697675633930, -0.998635087429071700, -0.998632474685921760, -0.998629859446190760, --0.998627241709884930, -0.998624621477011140, -0.998621998747575730, -0.998619373521585360, -0.998616745799046470, -0.998614115579965820, -0.998611482864349860, -0.998608847652205140, --0.998606209943538330, -0.998603569738356070, -0.998600927036664810, -0.998598281838471210, -0.998595634143781940, -0.998592983952603650, -0.998590331264942790, -0.998587676080806120, --0.998585018400200310, -0.998582358223131910, -0.998579695549607680, -0.998577030379634190, -0.998574362713218090, -0.998571692550366040, -0.998569019891084820, -0.998566344735381080, --0.998563667083261500, -0.998560986934732610, -0.998558304289801410, -0.998555619148474350, -0.998552931510758300, -0.998550241376659820, -0.998547548746185900, -0.998544853619342980, --0.998542155996137940, -0.998539455876577550, -0.998536753260668600, -0.998534048148417620, -0.998531340539831610, -0.998528630434917130, -0.998525917833681160, -0.998523202736130490, --0.998520485142271650, -0.998517765052111650, -0.998515042465657250, -0.998512317382915350, -0.998509589803892480, -0.998506859728595760, -0.998504127157031850, -0.998501392089207630, --0.998498654525129870, -0.998495914464805570, -0.998493171908241380, -0.998490426855444310, -0.998487679306421240, -0.998484929261178930, -0.998482176719724280, -0.998479421682064160, --0.998476664148205460, -0.998473904118155180, -0.998471141591920070, -0.998468376569507270, -0.998465609050923300, -0.998462839036175500, -0.998460066525270530, -0.998457291518215380, --0.998454514015016950, -0.998451734015682320, -0.998448951520218290, -0.998446166528631940, -0.998443379040930170, -0.998440589057119960, -0.998437796577208210, -0.998435001601202020, --0.998432204129108380, -0.998429404160934180, -0.998426601696686400, -0.998423796736372160, -0.998420989279998450, -0.998418179327572260, -0.998415366879100710, -0.998412551934590550, --0.998409734494049130, -0.998406914557483430, -0.998404092124900330, -0.998401267196307060, -0.998398439771710610, -0.998395609851118080, -0.998392777434536470, -0.998389942521973000, --0.998387105113434650, -0.998384265208928530, -0.998381422808461650, -0.998378577912041320, -0.998375730519674540, -0.998372880631368420, -0.998370028247130060, -0.998367173366966680, --0.998364315990885380, -0.998361456118893260, -0.998358593750997450, -0.998355728887205250, -0.998352861527523670, -0.998349991671960040, -0.998347119320521340, -0.998344244473214790, --0.998341367130047730, -0.998338487291027140, -0.998335604956160470, -0.998332720125454710, -0.998329832798917180, -0.998326942976555000, -0.998324050658375480, -0.998321155844385970, --0.998318258534593440, -0.998315358729005230, -0.998312456427628780, -0.998309551630471080, -0.998306644337539460, -0.998303734548841360, -0.998300822264383770, -0.998297907484174240, --0.998294990208219880, -0.998292070436528120, -0.998289148169106080, -0.998286223405961290, -0.998283296147100870, -0.998280366392532150, -0.998277434142262670, -0.998274499396299530, --0.998271562154650070, -0.998268622417321730, -0.998265680184321940, -0.998262735455657910, -0.998259788231336990, -0.998256838511366600, -0.998253886295754180, -0.998250931584506950, --0.998247974377632460, -0.998245014675138040, -0.998242052477031020, -0.998239087783318930, -0.998236120594009120, -0.998233150909108910, -0.998230178728625960, -0.998227204052567480, --0.998224226880941030, -0.998221247213754050, -0.998218265051013850, -0.998215280392728000, -0.998212293238904040, -0.998209303589549290, -0.998206311444671310, -0.998203316804277540, --0.998200319668375410, -0.998197320036972590, -0.998194317910076400, -0.998191313287694500, -0.998188306169834230, -0.998185296556503230, -0.998182284447708960, -0.998179269843458950, --0.998176252743760870, -0.998173233148622050, -0.998170211058050260, -0.998167186472052830, -0.998164159390637520, -0.998161129813811780, -0.998158097741583260, -0.998155063173959410, --0.998152026110948000, -0.998148986552556460, -0.998145944498792460, -0.998142899949663540, -0.998139852905177480, -0.998136803365341720, -0.998133751330164020, -0.998130696799651830, --0.998127639773813020, -0.998124580252655050, -0.998121518236185670, -0.998118453724412440, -0.998115386717343120, -0.998112317214985280, -0.998109245217346670, -0.998106170724434970, --0.998103093736257830, -0.998100014252822910, -0.998096932274137980, -0.998093847800210820, -0.998090760831048970, -0.998087671366660210, -0.998084579407052200, -0.998081484952232810, --0.998078388002209720, -0.998075288556990680, -0.998072186616583370, -0.998069082180995660, -0.998065975250235220, -0.998062865824309810, -0.998059753903227210, -0.998056639486995300, --0.998053522575621740, -0.998050403169114420, -0.998047281267481100, -0.998044156870729450, -0.998041029978867570, -0.998037900591903000, -0.998034768709843760, -0.998031634332697480, --0.998028497460472290, -0.998025358093175720, -0.998022216230815770, -0.998019071873400330, -0.998015925020937170, -0.998012775673434270, -0.998009623830899420, -0.998006469493340380, --0.998003312660765250, -0.998000153333181930, -0.997996991510598060, -0.997993827193021880, -0.997990660380461030, -0.997987491072923500, -0.997984319270417310, -0.997981144972950320, --0.997977968180530420, -0.997974788893165600, -0.997971607110863860, -0.997968422833633070, -0.997965236061481240, -0.997962046794416360, -0.997958855032446300, -0.997955660775579180, --0.997952464023822760, -0.997949264777185260, -0.997946063035674680, -0.997942858799298890, -0.997939652068065900, -0.997936442841983800, -0.997933231121060690, -0.997930016905304360, --0.997926800194723020, -0.997923580989324770, -0.997920359289117490, -0.997917135094109290, -0.997913908404308380, -0.997910679219722540, -0.997907447540360090, -0.997904213366229030, --0.997900976697337460, -0.997897737533693370, -0.997894495875304990, -0.997891251722180290, -0.997888005074327510, -0.997884755931754740, -0.997881504294470090, -0.997878250162481660, --0.997874993535797670, -0.997871734414426110, -0.997868472798375210, -0.997865208687653160, -0.997861942082268080, -0.997858672982228190, -0.997855401387541590, -0.997852127298216480, --0.997848850714260990, -0.997845571635683440, -0.997842290062491920, -0.997839005994694770, -0.997835719432299980, -0.997832430375315990, -0.997829138823750910, -0.997825844777612940, --0.997822548236910410, -0.997819249201651440, -0.997815947671844450, -0.997812643647497440, -0.997809337128618970, -0.997806028115217130, -0.997802716607300130, -0.997799402604876430, --0.997796086107954230, -0.997792767116541750, -0.997789445630647310, -0.997786121650279360, -0.997782795175446100, -0.997779466206155760, -0.997776134742416890, -0.997772800784237580, --0.997769464331626280, -0.997766125384591420, -0.997762783943141110, -0.997759440007283890, -0.997756093577028100, -0.997752744652382060, -0.997749393233354210, -0.997746039319952760, --0.997742682912186260, -0.997739324010063160, -0.997735962613591650, -0.997732598722780200, -0.997729232337637330, -0.997725863458171380, -0.997722492084390680, -0.997719118216303770, --0.997715741853919200, -0.997712362997245080, -0.997708981646290180, -0.997705597801062830, -0.997702211461571450, -0.997698822627824500, -0.997695431299830630, -0.997692037477598050, --0.997688641161135430, -0.997685242350451200, -0.997681841045553910, -0.997678437246451890, -0.997675030953153910, -0.997671622165668290, -0.997668210884003590, -0.997664797108168470, --0.997661380838171240, -0.997657962074020580, -0.997654540815725130, -0.997651117063293240, -0.997647690816733550, -0.997644262076054610, -0.997640830841264980, -0.997637397112373430, --0.997633960889388270, -0.997630522172318180, -0.997627080961171920, -0.997623637255957820, -0.997620191056684760, -0.997616742363361060, -0.997613291175995620, -0.997609837494596970, --0.997606381319173670, -0.997602922649734380, -0.997599461486287860, -0.997595997828842670, -0.997592531677407470, -0.997589063031991020, -0.997585591892601760, -0.997582118259248580, --0.997578642131940140, -0.997575163510685090, -0.997571682395492100, -0.997568198786369930, -0.997564712683327360, -0.997561224086372820, -0.997557732995515310, -0.997554239410763490, --0.997550743332126120, -0.997547244759611760, -0.997543743693229400, -0.997540240132987590, -0.997536734078895200, -0.997533225530961020, -0.997529714489193810, -0.997526200953602230, --0.997522684924195160, -0.997519166400981370, -0.997515645383969750, -0.997512121873168960, -0.997508595868587870, -0.997505067370235250, -0.997501536378120000, -0.997498002892250880, --0.997494466912636770, -0.997490928439286550, -0.997487387472209000, -0.997483844011412880, -0.997480298056907190, -0.997476749608700810, -0.997473198666802510, -0.997469645231221280, --0.997466089301965900, -0.997462530879045240, -0.997458969962468300, -0.997455406552243960, -0.997451840648381110, -0.997448272250888610, -0.997444701359775480, -0.997441127975050470, --0.997437552096722800, -0.997433973724801140, -0.997430392859294580, -0.997426809500212120, -0.997423223647562530, -0.997419635301354910, -0.997416044461598260, -0.997412451128301460, --0.997408855301473500, -0.997405256981123370, -0.997401656167260180, -0.997398052859892800, -0.997394447059030350, -0.997390838764681710, -0.997387227976856080, -0.997383614695562250, --0.997379998920809420, -0.997376380652606590, -0.997372759890962860, -0.997369136635887220, -0.997365510887388780, -0.997361882645476430, -0.997358251910159480, -0.997354618681446920, --0.997350982959347760, -0.997347344743871100, -0.997343704035026150, -0.997340060832821900, -0.997336415137267560, -0.997332766948372140, -0.997329116266144730, -0.997325463090594670, --0.997321807421730820, -0.997318149259562530, -0.997314488604098880, -0.997310825455348990, -0.997307159813321960, -0.997303491678027120, -0.997299821049473570, -0.997296147927670410, --0.997292472312626970, -0.997288794204352240, -0.997285113602855540, -0.997281430508146110, -0.997277744920233020, -0.997274056839125620, -0.997270366264833120, -0.997266673197364620, --0.997262977636729550, -0.997259279582936920, -0.997255579035996150, -0.997251875995916470, -0.997248170462707080, -0.997244462436377210, -0.997240751916936170, -0.997237038904393300, --0.997233323398757920, -0.997229605400039130, -0.997225884908246260, -0.997222161923388750, -0.997218436445475920, -0.997214708474516880, -0.997210978010521170, -0.997207245053497890, --0.997203509603456610, -0.997199771660406520, -0.997196031224356960, -0.997192288295317360, -0.997188542873297060, -0.997184794958305360, -0.997181044550351730, -0.997177291649445350, --0.997173536255595900, -0.997169778368812600, -0.997166017989104760, -0.997162255116481930, -0.997158489750953450, -0.997154721892528740, -0.997150951541217250, -0.997147178697028400, --0.997143403359971540, -0.997139625530056200, -0.997135845207291820, -0.997132062391687720, -0.997128277083253580, -0.997124489281998700, -0.997120698987932650, -0.997116906201064860, --0.997113110921404750, -0.997109313148961900, -0.997105512883745710, -0.997101710125765760, -0.997097904875031580, -0.997094097131552610, -0.997090286895338410, -0.997086474166398510, --0.997082658944742350, -0.997078841230379600, -0.997075021023319690, -0.997071198323572270, -0.997067373131146910, -0.997063545446053020, -0.997059715268300280, -0.997055882597898350, --0.997052047434856650, -0.997048209779184850, -0.997044369630892490, -0.997040526989989240, -0.997036681856484640, -0.997032834230388350, -0.997028984111709930, -0.997025131500459130, --0.997021276396645510, -0.997017418800278610, -0.997013558711368210, -0.997009696129923960, -0.997005831055955420, -0.997001963489472340, -0.996998093430484290, -0.996994220879001030, --0.996990345835032210, -0.996986468298587500, -0.996982588269676670, -0.996978705748309380, -0.996974820734495280, -0.996970933228244150, -0.996967043229565750, -0.996963150738469640, --0.996959255754965800, -0.996955358279063670, -0.996951458310773140, -0.996947555850104080, -0.996943650897066050, -0.996939743451668910, -0.996935833513922450, -0.996931921083836330, --0.996928006161420520, -0.996924088746684590, -0.996920168839638520, -0.996916246440291980, -0.996912321548654830, -0.996908394164736870, -0.996904464288547840, -0.996900531920097750, --0.996896597059396370, -0.996892659706453470, -0.996888719861278920, -0.996884777523882490, -0.996880832694274190, -0.996876885372463770, -0.996872935558461130, -0.996868983252276240, --0.996865028453918780, -0.996861071163398840, -0.996857111380726190, -0.996853149105910830, -0.996849184338962520, -0.996845217079891270, -0.996841247328706940, -0.996837275085419530, --0.996833300350038920, -0.996829323122575000, -0.996825343403037860, -0.996821361191437380, -0.996817376487783460, -0.996813389292086070, -0.996809399604355220, -0.996805407424600890, --0.996801412752832960, -0.996797415589061650, -0.996793415933296730, -0.996789413785548200, -0.996785409145826250, -0.996781402014140670, -0.996777392390501670, -0.996773380274919130, --0.996769365667403260, -0.996765348567963840, -0.996761328976611070, -0.996757306893355070, -0.996753282318205700, -0.996749255251173190, -0.996745225692267530, -0.996741193641498710, --0.996737159098877060, -0.996733122064412450, -0.996729082538114990, -0.996725040519994890, -0.996720996010062140, -0.996716949008326970, -0.996712899514799360, -0.996708847529489520, --0.996704793052407560, -0.996700736083563580, -0.996696676622967790, -0.996692614670630310, -0.996688550226561330, -0.996684483290770970, -0.996680413863269330, -0.996676341944066730, --0.996672267533173280, -0.996668190630599080, -0.996664111236354460, -0.996660029350449620, -0.996655944972894670, -0.996651858103699830, -0.996647768742875310, -0.996643676890431430, --0.996639582546378300, -0.996635485710726240, -0.996631386383485470, -0.996627284564666320, -0.996623180254278870, -0.996619073452333470, -0.996614964158840430, -0.996610852373809860, --0.996606738097252310, -0.996602621329177870, -0.996598502069596880, -0.996594380318519550, -0.996590256075956420, -0.996586129341917480, -0.996582000116413290, -0.996577868399454170, --0.996573734191050330, -0.996569597491212100, -0.996565458299949910, -0.996561316617274100, -0.996557172443194970, -0.996553025777722980, -0.996548876620868330, -0.996544724972641570, --0.996540570833052920, -0.996536414202112920, -0.996532255079831900, -0.996528093466220180, -0.996523929361288200, -0.996519762765046500, -0.996515593677505310, -0.996511422098675160, --0.996507248028566380, -0.996503071467189640, -0.996498892414555030, -0.996494710870673320, -0.996490526835554840, -0.996486340309210020, -0.996482151291649300, -0.996477959782883230, --0.996473765782922350, -0.996469569291776880, -0.996465370309457700, -0.996461168835974910, -0.996456964871339280, -0.996452758415561250, -0.996448549468651250, -0.996444338030619940, --0.996440124101477750, -0.996435907681235360, -0.996431688769903070, -0.996427467367491660, -0.996423243474011460, -0.996419017089473220, -0.996414788213887510, -0.996410556847264760, --0.996406322989615510, -0.996402086640950650, -0.996397847801280490, -0.996393606470615700, -0.996389362648966830, -0.996385116336344630, -0.996380867532759670, -0.996376616238222490, --0.996372362452743740, -0.996368106176334200, -0.996363847409004300, -0.996359586150764810, -0.996355322401626280, -0.996351056161599580, -0.996346787430695160, -0.996342516208923780, --0.996338242496296100, -0.996333966292822890, -0.996329687598514700, -0.996325406413382300, -0.996321122737436340, -0.996316836570687590, -0.996312547913146830, -0.996308256764824600, --0.996303963125731770, -0.996299666995879020, -0.996295368375277210, -0.996291067263936790, -0.996286763661868860, -0.996282457569083960, -0.996278148985592860, -0.996273837911406450, --0.996269524346535480, -0.996265208290990630, -0.996260889744782880, -0.996256568707922780, -0.996252245180421330, -0.996247919162289160, -0.996243590653537290, -0.996239259654176480, --0.996234926164217380, -0.996230590183671110, -0.996226251712548310, -0.996221910750859860, -0.996217567298616660, -0.996213221355829460, -0.996208872922509260, -0.996204521998666940, --0.996200168584313260, -0.996195812679459220, -0.996191454284115600, -0.996187093398293370, -0.996182730022003300, -0.996178364155256510, -0.996173995798063760, -0.996169624950436040, --0.996165251612384340, -0.996160875783919430, -0.996156497465052300, -0.996152116655793950, -0.996147733356155360, -0.996143347566147420, -0.996138959285781000, -0.996134568515067320, --0.996130175254017150, -0.996125779502641580, -0.996121381260951620, -0.996116980528958030, -0.996112577306672130, -0.996108171594104810, -0.996103763391266940, -0.996099352698169740, --0.996094939514824200, -0.996090523841241190, -0.996086105677431940, -0.996081685023407440, -0.996077261879178670, -0.996072836244756840, -0.996068408120152850, -0.996063977505377900, --0.996059544400442860, -0.996055108805359080, -0.996050670720137530, -0.996046230144789320, -0.996041787079325450, -0.996037341523757220, -0.996032893478095540, -0.996028442942351710, --0.996023989916536730, -0.996019534400661710, -0.996015076394737960, -0.996010615898776490, -0.996006152912788490, -0.996001687436785080, -0.995997219470777460, -0.995992749014776750, --0.995988276068794250, -0.995983800632840980, -0.995979322706928240, -0.995974842291067250, -0.995970359385269120, -0.995965873989545060, -0.995961386103906390, -0.995956895728364100, --0.995952402862929740, -0.995947907507614310, -0.995943409662429110, -0.995938909327385380, -0.995934406502494320, -0.995929901187767360, -0.995925393383215620, -0.995920883088850300, --0.995916370304682830, -0.995911855030724440, -0.995907337266986440, -0.995902817013480160, -0.995898294270216700, -0.995893769037207610, -0.995889241314463990, -0.995884711101997390, --0.995880178399818900, -0.995875643207939980, -0.995871105526372040, -0.995866565355126300, -0.995862022694214090, -0.995857477543646840, -0.995852929903435990, -0.995848379773592750, --0.995843827154128450, -0.995839272045054740, -0.995834714446382830, -0.995830154358124050, -0.995825591780289950, -0.995821026712891850, -0.995816459155941190, -0.995811889109449400, --0.995807316573427910, -0.995802741547888060, -0.995798164032841380, -0.995793584028299320, -0.995789001534273300, -0.995784416550774760, -0.995779829077815150, -0.995775239115406000, --0.995770646663558750, -0.995766051722284830, -0.995761454291595900, -0.995756854371503300, -0.995752251962018440, -0.995747647063153110, -0.995743039674918620, -0.995738429797326410, --0.995733817430388250, -0.995729202574115570, -0.995724585228519810, -0.995719965393612630, -0.995715343069405460, -0.995710718255910070, -0.995706090953137780, -0.995701461161100250, --0.995696828879809150, -0.995692194109275900, -0.995687556849512160, -0.995682917100529590, -0.995678274862339730, -0.995673630134954140, -0.995668982918384460, -0.995664333212642470, --0.995659681017739500, -0.995655026333687300, -0.995650369160497650, -0.995645709498181990, -0.995641047346752070, -0.995636382706219570, -0.995631715576596130, -0.995627045957893420, --0.995622373850122980, -0.995617699253296680, -0.995613022167426090, -0.995608342592523070, -0.995603660528599050, -0.995598975975665930, -0.995594288933735360, -0.995589599402819100, --0.995584907382928820, -0.995580212874076280, -0.995575515876273240, -0.995570816389531380, -0.995566114413862450, -0.995561409949278220, -0.995556702995790580, -0.995551993553411060, --0.995547281622151560, -0.995542567202023940, -0.995537850293039870, -0.995533130895211120, -0.995528409008549660, -0.995523684633067060, -0.995518957768775300, -0.995514228415686150, --0.995509496573811380, -0.995504762243162980, -0.995500025423752600, -0.995495286115592130, -0.995490544318693440, -0.995485800033068520, -0.995481053258728930, -0.995476303995686870, --0.995471552243953890, -0.995466798003542100, -0.995462041274463360, -0.995457282056729450, -0.995452520350352370, -0.995447756155343980, -0.995442989471716280, -0.995438220299481040, --0.995433448638650240, -0.995428674489235780, -0.995423897851249630, -0.995419118724703790, -0.995414337109610140, -0.995409553005980660, -0.995404766413827360, -0.995399977333161990, --0.995395185763996770, -0.995390391706343580, -0.995385595160214410, -0.995380796125621250, -0.995375994602576090, -0.995371190591091030, -0.995366384091177950, -0.995361575102848840, --0.995356763626115800, -0.995351949660990940, -0.995347133207486130, -0.995342314265613480, -0.995337492835385080, -0.995332668916812930, -0.995327842509909130, -0.995323013614685670, --0.995318182231154760, -0.995313348359328390, -0.995308511999218550, -0.995303673150837560, -0.995298831814197320, -0.995293987989310010, -0.995289141676187650, -0.995284292874842550, --0.995279441585286690, -0.995274587807532200, -0.995269731541591260, -0.995264872787476000, -0.995260011545198500, -0.995255147814771090, -0.995250281596205770, -0.995245412889514620, --0.995240541694710100, -0.995235668011804190, -0.995230791840808980, -0.995225913181736920, -0.995221032034600110, -0.995216148399410640, -0.995211262276180840, -0.995206373664922820, --0.995201482565648890, -0.995196588978371270, -0.995191692903102280, -0.995186794339853910, -0.995181893288638600, -0.995176989749468550, -0.995172083722356100, -0.995167175207313350, --0.995162264204352720, -0.995157350713486320, -0.995152434734726700, -0.995147516268085840, -0.995142595313576290, -0.995137671871210270, -0.995132745940999990, -0.995127817522957980, --0.995122886617096250, -0.995117953223427440, -0.995113017341963670, -0.995108078972717360, -0.995103138115700950, -0.995098194770926540, -0.995093248938406780, -0.995088300618153900, --0.995083349810180100, -0.995078396514498140, -0.995073440731120030, -0.995068482460058410, -0.995063521701325500, -0.995058558454933850, -0.995053592720895770, -0.995048624499223820, --0.995043653789930200, -0.995038680593027470, -0.995033704908528050, -0.995028726736444380, -0.995023746076788780, -0.995018762929573920, -0.995013777294812110, -0.995008789172515900, --0.995003798562697720, -0.994998805465370010, -0.994993809880545310, -0.994988811808236060, -0.994983811248454810, -0.994978808201213980, -0.994973802666526240, -0.994968794644403910, --0.994963784134859640, -0.994958771137905870, -0.994953755653555150, -0.994948737681820130, -0.994943717222713130, -0.994938694276246930, -0.994933668842434060, -0.994928640921286860, --0.994923610512818190, -0.994918577617040390, -0.994913542233966220, -0.994908504363608230, -0.994903464005978840, -0.994898421161090950, -0.994893375828956870, -0.994888328009589480, --0.994883277703001110, -0.994878224909204740, -0.994873169628212590, -0.994868111860037650, -0.994863051604692460, -0.994857988862189570, -0.994852923632541740, -0.994847855915761640, --0.994842785711861800, -0.994837713020855110, -0.994832637842754110, -0.994827560177571460, -0.994822480025319920, -0.994817397386012160, -0.994812312259660940, -0.994807224646279020, --0.994802134545878960, -0.994797041958473520, -0.994791946884075570, -0.994786849322697670, -0.994781749274352700, -0.994776646739053310, -0.994771541716812370, -0.994766434207642550, --0.994761324211556610, -0.994756211728567430, -0.994751096758687670, -0.994745979301930090, -0.994740859358307690, -0.994735736927833130, -0.994730612010519160, -0.994725484606378770, --0.994720354715424530, -0.994715222337669510, -0.994710087473126390, -0.994704950121808040, -0.994699810283727340, -0.994694667958897160, -0.994689523147330170, -0.994684375849039460, --0.994679226064037800, -0.994674073792338190, -0.994668919033953270, -0.994663761788896040, -0.994658602057179490, -0.994653439838816380, -0.994648275133819700, -0.994643107942202230, --0.994637938263977060, -0.994632766099157070, -0.994627591447755140, -0.994622414309784260, -0.994617234685257310, -0.994612052574187390, -0.994606867976587150, -0.994601680892469920, --0.994596491321848350, -0.994591299264735660, -0.994586104721144610, -0.994580907691088310, -0.994575708174579850, -0.994570506171632010, -0.994565301682257990, -0.994560094706470670, --0.994554885244283150, -0.994549673295708310, -0.994544458860759480, -0.994539241939449310, -0.994534022531791130, -0.994528800637797920, -0.994523576257482670, -0.994518349390858480, --0.994513120037938350, -0.994507888198735480, -0.994502653873262870, -0.994497417061533720, -0.994492177763560910, -0.994486935979357780, -0.994481691708937190, -0.994476444952312470, --0.994471195709496490, -0.994465943980502700, -0.994460689765343960, -0.994455433064033500, -0.994450173876584410, -0.994444912203010010, -0.994439648043323190, -0.994434381397537370, --0.994429112265665550, -0.994423840647720940, -0.994418566543716740, -0.994413289953666070, -0.994408010877582240, -0.994402729315478350, -0.994397445267367620, -0.994392158733263360, --0.994386869713178690, -0.994381578207126800, -0.994376284215120920, -0.994370987737174360, -0.994365688773300450, -0.994360387323512170, -0.994355083387822970, -0.994349776966246050, --0.994344468058794730, -0.994339156665482230, -0.994333842786321860, -0.994328526421326850, -0.994323207570510510, -0.994317886233886170, -0.994312562411467040, -0.994307236103266660, --0.994301907309298130, -0.994296576029574770, -0.994291242264109920, -0.994285906012917110, -0.994280567276009440, -0.994275226053400460, -0.994269882345103270, -0.994264536151131530, --0.994259187471498330, -0.994253836306217220, -0.994248482655301520, -0.994243126518764560, -0.994237767896619880, -0.994232406788880700, -0.994227043195560540, -0.994221677116672750, --0.994216308552230750, -0.994210937502247980, -0.994205563966737870, -0.994200187945713960, -0.994194809439189480, -0.994189428447177950, -0.994184044969692930, -0.994178659006747730, --0.994173270558355910, -0.994167879624530900, -0.994162486205286240, -0.994157090300635260, -0.994151691910591720, -0.994146291035168830, -0.994140887674380250, -0.994135481828239410, --0.994130073496759860, -0.994124662679955250, -0.994119249377838910, -0.994113833590424380, -0.994108415317725310, -0.994102994559755260, -0.994097571316527650, -0.994092145588056140, --0.994086717374354280, -0.994081286675435600, -0.994075853491313670, -0.994070417822002230, -0.994064979667514610, -0.994059539027864590, -0.994054095903065700, -0.994048650293131720, --0.994043202198075960, -0.994037751617912190, -0.994032298552654070, -0.994026843002315250, -0.994021384966909280, -0.994015924446449930, -0.994010461440950620, -0.994004995950425240, --0.993999527974887440, -0.993994057514350770, -0.993988584568828880, -0.993983109138335540, -0.993977631222884520, -0.993972150822489350, -0.993966667937163820, -0.993961182566921670, --0.993955694711776470, -0.993950204371742090, -0.993944711546832280, -0.993939216237060500, -0.993933718442440830, -0.993928218162986820, -0.993922715398712240, -0.993917210149630970, --0.993911702415756550, -0.993906192197102970, -0.993900679493683880, -0.993895164305513060, -0.993889646632604370, -0.993884126474971490, -0.993878603832628380, -0.993873078705588720, --0.993867551093866370, -0.993862020997475120, -0.993856488416428930, -0.993850953350741360, -0.993845415800426510, -0.993839875765498150, -0.993834333245969930, -0.993828788241856050, --0.993823240753170080, -0.993817690779926100, -0.993812138322137880, -0.993806583379819310, -0.993801025952984250, -0.993795466041646700, -0.993789903645820430, -0.993784338765519410, --0.993778771400757430, -0.993773201551548690, -0.993767629217906840, -0.993762054399846000, -0.993756477097380020, -0.993750897310522800, -0.993745315039288310, -0.993739730283690560, --0.993734143043743520, -0.993728553319461080, -0.993722961110857340, -0.993717366417946060, -0.993711769240741450, -0.993706169579257390, -0.993700567433507990, -0.993694962803507110, --0.993689355689268860, -0.993683746090807120, -0.993678134008136090, -0.993672519441269660, -0.993666902390222040, -0.993661282855007100, -0.993655660835638940, -0.993650036332131670, --0.993644409344499270, -0.993638779872755950, -0.993633147916915590, -0.993627513476992300, -0.993621876553000270, -0.993616237144953620, -0.993610595252866320, -0.993604950876752600, --0.993599304016626440, -0.993593654672502050, -0.993588002844393410, -0.993582348532314860, -0.993576691736280490, -0.993571032456304290, -0.993565370692400580, -0.993559706444583470, --0.993554039712867040, -0.993548370497265520, -0.993542698797793000, -0.993537024614463800, -0.993531347947292030, -0.993525668796292010, -0.993519987161477600, -0.993514303042863370, --0.993508616440463400, -0.993502927354291800, -0.993497235784362890, -0.993491541730690990, -0.993485845193290080, -0.993480146172174730, -0.993474444667358900, -0.993468740678856930, --0.993463034206683250, -0.993457325250851840, -0.993451613811377250, -0.993445899888273480, -0.993440183481555050, -0.993434464591236190, -0.993428743217331100, -0.993423019359854220, --0.993417293018819760, -0.993411564194242040, -0.993405832886135380, -0.993400099094514210, -0.993394362819392750, -0.993388624060785430, -0.993382882818706460, -0.993377139093170380, --0.993371392884191410, -0.993365644191783970, -0.993359893015962390, -0.993354139356741220, -0.993348383214134540, -0.993342624588156920, -0.993336863478822770, -0.993331099886146540, --0.993325333810142430, -0.993319565250824990, -0.993313794208208760, -0.993308020682307950, -0.993302244673137100, -0.993296466180710660, -0.993290685205043040, -0.993284901746148700, --0.993279115804042160, -0.993273327378737750, -0.993267536470250010, -0.993261743078593500, -0.993255947203782630, -0.993250148845831850, -0.993244348004755810, -0.993238544680568710, --0.993232738873285450, -0.993226930582920220, -0.993221119809487680, -0.993215306553002390, -0.993209490813478760, -0.993203672590931450, -0.993197851885374900, -0.993192028696823770, --0.993186203025292590, -0.993180374870795910, -0.993174544233348280, -0.993168711112964230, -0.993162875509658430, -0.993157037423445520, -0.993151196854339950, -0.993145353802356360, --0.993139508267509410, -0.993133660249813750, -0.993127809749283830, -0.993121956765934510, -0.993116101299780120, -0.993110243350835640, -0.993104382919115510, -0.993098520004634390, --0.993092654607407030, -0.993086786727447990, -0.993080916364772030, -0.993075043519393690, -0.993069168191327840, -0.993063290380589050, -0.993057410087191950, -0.993051527311151430, --0.993045642052482020, -0.993039754311198510, -0.993033864087315640, -0.993027971380848080, -0.993022076191810710, -0.993016178520218060, -0.993010278366084910, -0.993004375729426130, --0.992998470610256370, -0.992992563008590510, -0.992986652924443210, -0.992980740357829240, -0.992974825308763460, -0.992968907777260550, -0.992962987763335470, -0.992957065267002890, --0.992951140288277580, -0.992945212827174520, -0.992939282883708360, -0.992933350457893990, -0.992927415549746280, -0.992921478159280000, -0.992915538286510020, -0.992909595931451340, --0.992903651094118490, -0.992897703774526570, -0.992891753972690360, -0.992885801688624840, -0.992879846922344770, -0.992873889673865140, -0.992867929943200720, -0.992861967730366500, --0.992856003035377350, -0.992850035858248160, -0.992844066198993900, -0.992838094057629570, -0.992832119434169820, -0.992826142328629980, -0.992820162741024580, -0.992814180671368950, --0.992808196119677740, -0.992802209085966170, -0.992796219570248990, -0.992790227572541210, -0.992784233092858020, -0.992778236131214080, -0.992772236687624600, -0.992766234762104570, --0.992760230354668980, -0.992754223465332710, -0.992748214094110960, -0.992742202241018720, -0.992736187906070880, -0.992730171089282630, -0.992724151790668970, -0.992718130010244780, --0.992712105748025490, -0.992706079004025740, -0.992700049778260870, -0.992694018070745860, -0.992687983881495930, -0.992681947210525830, -0.992675908057851000, -0.992669866423486420, --0.992663822307447100, -0.992657775709748220, -0.992651726630404910, -0.992645675069432350, -0.992639621026845550, -0.992633564502659720, -0.992627505496889940, -0.992621444009551430, --0.992615380040659300, -0.992609313590228750, -0.992603244658274870, -0.992597173244812890, -0.992591099349858010, -0.992585022973425320, -0.992578944115530050, -0.992572862776187500, --0.992566778955412790, -0.992560692653221110, -0.992554603869627680, -0.992548512604647830, -0.992542418858296640, -0.992536322630589330, -0.992530223921541330, -0.992524122731167750, --0.992518019059483780, -0.992511912906504870, -0.992505804272246110, -0.992499693156722820, -0.992493579559950320, -0.992487463481943940, -0.992481344922718890, -0.992475223882290370, --0.992469100360673820, -0.992462974357884550, -0.992456845873937900, -0.992450714908849060, -0.992444581462633480, -0.992438445535306470, -0.992432307126883240, -0.992426166237379340, --0.992420022866809970, -0.992413877015190570, -0.992407728682536460, -0.992401577868863070, -0.992395424574185720, -0.992389268798519740, -0.992383110541880660, -0.992376949804283810, --0.992370786585744510, -0.992364620886278410, -0.992358452705900620, -0.992352282044626670, -0.992346108902472100, -0.992339933279452250, -0.992333755175582530, -0.992327574590878500, --0.992321391525355370, -0.992315205979028890, -0.992309017951914400, -0.992302827444027310, -0.992296634455383190, -0.992290438985997450, -0.992284241035885640, -0.992278040605063190, --0.992271837693545770, -0.992265632301348570, -0.992259424428487470, -0.992253214074977690, -0.992247001240834870, -0.992240785926074560, -0.992234568130712310, -0.992228347854763660, --0.992222125098244150, -0.992215899861169310, -0.992209672143554710, -0.992203441945415880, -0.992197209266768580, -0.992190974107628130, -0.992184736468010200, -0.992178496347930540, --0.992172253747404590, -0.992166008666448110, -0.992159761105076530, -0.992153511063305520, -0.992147258541150710, -0.992141003538627890, -0.992134746055752470, -0.992128486092540120, --0.992122223649006710, -0.992115958725167670, -0.992109691321038660, -0.992103421436635550, -0.992097149071973770, -0.992090874227069210, -0.992084596901937400, -0.992078317096594110, --0.992072034811054990, -0.992065750045335810, -0.992059462799452340, -0.992053173073420110, -0.992046880867255010, -0.992040586180972680, -0.992034289014588900, -0.992027989368119420, --0.992021687241579910, -0.992015382634986230, -0.992009075548354050, -0.992002765981699230, -0.991996453935037440, -0.991990139408384540, -0.991983822401756310, -0.991977502915168510, --0.991971180948637010, -0.991964856502177470, -0.991958529575805880, -0.991952200169537890, -0.991945868283389380, -0.991939533917376210, -0.991933197071514280, -0.991926857745819350, --0.991920515940307170, -0.991914171654993850, -0.991907824889894930, -0.991901475645026620, -0.991895123920404460, -0.991888769716044670, -0.991882413031962780, -0.991876053868175010, --0.991869692224697010, -0.991863328101544760, -0.991856961498734260, -0.991850592416281370, -0.991844220854201990, -0.991837846812511970, -0.991831470291227420, -0.991825091290364110, --0.991818709809938140, -0.991812325849965370, -0.991805939410461800, -0.991799550491443420, -0.991793159092926090, -0.991786765214925920, -0.991780368857458790, -0.991773970020540800, --0.991767568704187810, -0.991761164908415930, -0.991754758633241250, -0.991748349878679550, -0.991741938644747020, -0.991735524931459560, -0.991729108738833350, -0.991722690066884400, --0.991716268915628700, -0.991709845285082330, -0.991703419175261280, -0.991696990586181770, -0.991690559517859780, -0.991684125970311300, -0.991677689943552650, -0.991671251437599710, --0.991664810452468570, -0.991658366988175440, -0.991651921044736430, -0.991645472622167620, -0.991639021720485130, -0.991632568339705030, -0.991626112479843560, -0.991619654140916800, --0.991613193322940960, -0.991606730025932030, -0.991600264249906330, -0.991593795994879960, -0.991587325260869120, -0.991580852047890040, -0.991574376355958690, -0.991567898185091500, --0.991561417535304470, -0.991554934406614020, -0.991548448799036140, -0.991541960712587160, -0.991535470147283270, -0.991528977103140700, -0.991522481580175640, -0.991515983578404430, --0.991509483097843370, -0.991502980138508460, -0.991496474700416130, -0.991489966783582590, -0.991483456388024260, -0.991476943513757150, -0.991470428160797780, -0.991463910329162260, --0.991457390018867010, -0.991450867229928260, -0.991444341962362310, -0.991437814216185600, -0.991431283991414340, -0.991424751288064840, -0.991418216106153440, -0.991411678445696440, --0.991405138306710400, -0.991398595689211400, -0.991392050593215890, -0.991385503018740400, -0.991378952965801030, -0.991372400434414320, -0.991365845424596600, -0.991359287936364300, --0.991352727969733730, -0.991346165524721320, -0.991339600601343630, -0.991333033199616850, -0.991326463319557430, -0.991319890961181890, -0.991313316124506680, -0.991306738809548120, --0.991300159016322740, -0.991293576744846970, -0.991286991995137260, -0.991280404767210020, -0.991273815061081810, -0.991267222876769050, -0.991260628214288290, -0.991254031073655840, --0.991247431454888470, -0.991240829358002400, -0.991234224783014260, -0.991227617729940610, -0.991221008198797880, -0.991214396189602610, -0.991207781702371450, -0.991201164737120720, --0.991194545293867190, -0.991187923372627180, -0.991181298973417450, -0.991174672096254430, -0.991168042741154780, -0.991161410908135030, -0.991154776597211630, -0.991148139808401440, --0.991141500541720790, -0.991134858797186440, -0.991128214574814930, -0.991121567874622910, -0.991114918696626930, -0.991108267040843650, -0.991101612907289710, -0.991094956295981770, --0.991088297206936470, -0.991081635640170380, -0.991074971595700130, -0.991068305073542600, -0.991061636073714220, -0.991054964596231770, -0.991048290641111880, -0.991041614208371340, --0.991034935298026660, -0.991028253910094750, -0.991021570044592130, -0.991014883701535560, -0.991008194880941830, -0.991001503582827570, -0.990994809807209660, -0.990988113554104650, --0.990981414823529310, -0.990974713615500490, -0.990968009930034870, -0.990961303767149300, -0.990954595126860350, -0.990947884009184990, -0.990941170414139980, -0.990934454341741880, --0.990927735792007770, -0.990921014764954310, -0.990914291260598270, -0.990907565278956510, -0.990900836820045820, -0.990894105883883050, -0.990887372470485080, -0.990880636579868580, --0.990873898212050520, -0.990867157367047780, -0.990860414044877120, -0.990853668245555430, -0.990846919969099460, -0.990840169215526310, -0.990833415984852750, -0.990826660277095540, --0.990819902092271780, -0.990813141430398230, -0.990806378291491870, -0.990799612675569490, -0.990792844582648160, -0.990786074012744660, -0.990779300965875960, -0.990772525442059070, --0.990765747441310740, -0.990758966963648180, -0.990752184009088150, -0.990745398577647650, -0.990738610669343660, -0.990731820284193150, -0.990725027422213130, -0.990718232083420470, --0.990711434267832260, -0.990704633975465490, -0.990697831206337140, -0.990691025960464210, -0.990684218237863680, -0.990677408038552640, -0.990670595362547980, -0.990663780209866900, --0.990656962580526490, -0.990650142474543530, -0.990643319891935210, -0.990636494832718650, -0.990629667296910820, -0.990622837284528820, -0.990616004795589760, -0.990609169830110710, --0.990602332388108690, -0.990595492469600880, -0.990588650074604280, -0.990581805203136100, -0.990574957855213320, -0.990568108030853270, -0.990561255730072920, -0.990554400952889380, --0.990547543699319850, -0.990540683969381440, -0.990533821763091350, -0.990526957080466790, -0.990520089921524740, -0.990513220286282530, -0.990506348174757130, -0.990499473586965990, --0.990492596522926090, -0.990485716982654860, -0.990478834966169170, -0.990471950473486460, -0.990465063504623820, -0.990458174059598570, -0.990451282138427920, -0.990444387741128970, --0.990437490867719150, -0.990430591518215550, -0.990423689692635500, -0.990416785390996090, -0.990409878613314860, -0.990402969359608920, -0.990396057629895580, -0.990389143424192040, --0.990382226742515640, -0.990375307584883680, -0.990368385951313490, -0.990361461841822280, -0.990354535256427470, -0.990347606195146280, -0.990340674657996130, -0.990333740644994240, --0.990326804156158040, -0.990319865191504830, -0.990312923751051840, -0.990305979834816720, -0.990299033442816560, -0.990292084575068790, -0.990285133231590840, -0.990278179412400040, --0.990271223117513810, -0.990264264346949590, -0.990257303100724570, -0.990250339378856430, -0.990243373181362350, -0.990236404508259890, -0.990229433359566370, -0.990222459735299320, --0.990215483635476070, -0.990208505060114150, -0.990201524009230890, -0.990194540482843940, -0.990187554480970620, -0.990180566003628360, -0.990173575050834700, -0.990166581622607070, --0.990159585718963010, -0.990152587339920070, -0.990145586485495550, -0.990138583155707130, -0.990131577350572220, -0.990124569070108370, -0.990117558314333120, -0.990110545083263900, --0.990103529376918370, -0.990096511195314060, -0.990089490538468400, -0.990082467406399050, -0.990075441799123550, -0.990068413716659430, -0.990061383159024260, -0.990054350126235660, --0.990047314618311190, -0.990040276635268390, -0.990033236177124910, -0.990026193243898400, -0.990019147835606290, -0.990012099952266470, -0.990005049593896240, -0.989997996760513480, --0.989990941452135730, -0.989983883668780650, -0.989976823410465780, -0.989969760677208880, -0.989962695469027600, -0.989955627785939600, -0.989948557627962410, -0.989941484995114030, --0.989934409887411770, -0.989927332304873510, -0.989920252247517010, -0.989913169715359810, -0.989906084708419680, -0.989898997226714370, -0.989891907270261550, -0.989884814839078970, --0.989877719933184300, -0.989870622552595390, -0.989863522697329910, -0.989856420367405620, -0.989849315562840280, -0.989842208283651660, -0.989835098529857520, -0.989827986301475620, --0.989820871598523830, -0.989813754421019710, -0.989806634768981340, -0.989799512642426380, -0.989792388041372590, -0.989785260965837850, -0.989778131415839920, -0.989770999391396680, --0.989763864892525880, -0.989756727919245520, -0.989749588471573350, -0.989742446549527140, -0.989735302153124770, -0.989728155282384340, -0.989721005937323370, -0.989713854117959870, --0.989706699824311810, -0.989699543056396960, -0.989692383814233300, -0.989685222097838600, -0.989678057907230850, -0.989670891242428020, -0.989663722103448000, -0.989656550490308540, --0.989649376403027750, -0.989642199841623600, -0.989635020806113870, -0.989627839296516650, -0.989620655312849820, -0.989613468855131240, -0.989606279923379130, -0.989599088517611250, --0.989591894637845690, -0.989584698284100340, -0.989577499456393280, -0.989570298154742510, -0.989563094379165900, -0.989555888129681650, -0.989548679406307640, -0.989541468209061970, --0.989534254537962510, -0.989527038393027580, -0.989519819774274940, -0.989512598681722810, -0.989505375115389160, -0.989498149075291990, -0.989490920561449610, -0.989483689573879780, --0.989476456112600820, -0.989469220177630620, -0.989461981768987480, -0.989454740886689390, -0.989447497530754340, -0.989440251701200650, -0.989433003398046300, -0.989425752621309380, --0.989418499371008120, -0.989411243647160710, -0.989403985449785030, -0.989396724778899510, -0.989389461634522130, -0.989382196016671100, -0.989374927925364520, -0.989367657360620710, --0.989360384322457760, -0.989353108810893780, -0.989345830825947070, -0.989338550367635850, -0.989331267435978100, -0.989323982030992250, -0.989316694152696520, -0.989309403801108990, --0.989302110976247980, -0.989294815678131600, -0.989287517906778270, -0.989280217662206200, -0.989272914944433480, -0.989265609753478550, -0.989258302089359500, -0.989250991952094760, --0.989243679341702540, -0.989236364258201050, -0.989229046701608830, -0.989221726671943860, -0.989214404169224570, -0.989207079193469290, -0.989199751744696320, -0.989192421822923880, --0.989185089428170520, -0.989177754560454430, -0.989170417219793820, -0.989163077406207350, -0.989155735119713000, -0.989148390360329420, -0.989141043128074830, -0.989133693422967750, --0.989126341245026300, -0.989118986594269000, -0.989111629470714290, -0.989104269874380490, -0.989096907805286030, -0.989089543263449330, -0.989082176248888720, -0.989074806761622630, --0.989067434801669590, -0.989060060369047920, -0.989052683463776170, -0.989045304085872660, -0.989037922235355920, -0.989030537912244270, -0.989023151116556360, -0.989015761848310640, --0.989008370107525400, -0.989000975894219310, -0.988993579208410690, -0.988986180050118180, -0.988978778419360330, -0.988971374316155340, -0.988963967740522090, -0.988956558692478780, --0.988949147172044190, -0.988941733179236620, -0.988934316714074830, -0.988926897776577160, -0.988919476366762250, -0.988912052484648640, -0.988904626130254980, -0.988897197303599710, --0.988889766004701460, -0.988882332233578800, -0.988874895990250250, -0.988867457274734460, -0.988860016087050100, -0.988852572427215690, -0.988845126295249790, -0.988837677691171150, --0.988830226614998200, -0.988822773066749820, -0.988815317046444430, -0.988807858554100800, -0.988800397589737480, -0.988792934153373220, -0.988785468245026560, -0.988777999864716260, --0.988770529012460990, -0.988763055688279380, -0.988755579892190100, -0.988748101624211890, -0.988740620884363430, -0.988733137672663350, -0.988725651989130540, -0.988718163833783530, --0.988710673206641080, -0.988703180107721960, -0.988695684537045040, -0.988688186494628750, -0.988680685980492080, -0.988673182994653570, -0.988665677537132190, -0.988658169607946610, --0.988650659207115700, -0.988643146334658000, -0.988635630990592480, -0.988628113174937930, -0.988620592887713090, -0.988613070128936730, -0.988605544898627730, -0.988598017196804730, --0.988590487023486840, -0.988582954378692700, -0.988575419262441190, -0.988567881674751070, -0.988560341615641320, -0.988552799085130610, -0.988545254083238010, -0.988537706609982300, --0.988530156665382240, -0.988522604249456820, -0.988515049362224900, -0.988507492003705250, -0.988499932173916960, -0.988492369872878920, -0.988484805100609880, -0.988477237857128820, --0.988469668142454630, -0.988462095956606280, -0.988454521299602760, -0.988446944171462950, -0.988439364572205710, -0.988431782501850040, -0.988424197960414920, -0.988416610947919330, --0.988409021464382250, -0.988401429509822570, -0.988393835084259380, -0.988386238187711540, -0.988378638820198160, -0.988371036981738120, -0.988363432672350490, -0.988355825892054280, --0.988348216640868580, -0.988340604918812260, -0.988332990725904410, -0.988325374062164140, -0.988317754927610430, -0.988310133322262360, -0.988302509246138940, -0.988294882699259250, --0.988287253681642270, -0.988279622193307230, -0.988271988234273090, -0.988264351804559070, -0.988256712904184040, -0.988249071533167320, -0.988241427691527900, -0.988233781379284970, --0.988226132596457530, -0.988218481343064780, -0.988210827619125820, -0.988203171424659740, -0.988195512759685760, -0.988187851624223070, -0.988180188018290660, -0.988172521941907860, --0.988164853395093750, -0.988157182377867430, -0.988149508890248220, -0.988141832932255220, -0.988134154503907620, -0.988126473605224650, -0.988118790236225400, -0.988111104396929290, --0.988103416087355410, -0.988095725307522990, -0.988088032057451220, -0.988080336337159420, -0.988072638146666790, -0.988064937485992440, -0.988057234355155910, -0.988049528754176180, --0.988041820683072670, -0.988034110141864600, -0.988026397130571280, -0.988018681649211920, -0.988010963697805940, -0.988003243276372460, -0.987995520384930880, -0.987987795023500540, --0.987980067192100740, -0.987972336890750700, -0.987964604119469850, -0.987956868878277490, -0.987949131167192960, -0.987941390986235680, -0.987933648335424740, -0.987925903214779800, --0.987918155624320060, -0.987910405564065060, -0.987902653034033910, -0.987894898034246130, -0.987887140564721160, -0.987879380625478310, -0.987871618216537020, -0.987863853337916710, --0.987856085989636700, -0.987848316171716530, -0.987840543884175530, -0.987832769127033220, -0.987824991900309040, -0.987817212204022300, -0.987809430038192550, -0.987801645402839100, --0.987793858297981720, -0.987786068723639610, -0.987778276679832310, -0.987770482166579370, -0.987762685183900200, -0.987754885731814360, -0.987747083810341260, -0.987739279419500460, --0.987731472559311490, -0.987723663229793770, -0.987715851430966960, -0.987708037162850490, -0.987700220425463900, -0.987692401218826840, -0.987684579542958740, -0.987676755397879140, --0.987668928783607680, -0.987661099700163910, -0.987653268147567380, -0.987645434125837720, -0.987637597634994480, -0.987629758675057200, -0.987621917246045530, -0.987614073347979130, --0.987606226980877410, -0.987598378144760260, -0.987590526839647100, -0.987582673065557580, -0.987574816822511470, -0.987566958110528300, -0.987559096929627730, -0.987551233279829410, --0.987543367161152990, -0.987535498573618110, -0.987527627517244540, -0.987519753992051940, -0.987511877998059950, -0.987503999535288220, -0.987496118603756520, -0.987488235203484390, --0.987480349334491910, -0.987472460996798420, -0.987464570190423770, -0.987456676915387740, -0.987448781171709980, -0.987440882959410240, -0.987432982278508400, -0.987425079129024000, --0.987417173510977020, -0.987409265424387010, -0.987401354869273830, -0.987393441845657250, -0.987385526353557140, -0.987377608392993160, -0.987369687963985280, -0.987361765066553040, --0.987353839700716440, -0.987345911866495230, -0.987337981563909170, -0.987330048792978250, -0.987322113553722240, -0.987314175846160880, -0.987306235670314060, -0.987298293026201760, --0.987290347913843620, -0.987282400333259650, -0.987274450284469700, -0.987266497767493530, -0.987258542782351260, -0.987250585329062510, -0.987242625407647400, -0.987234663018125680, --0.987226698160517220, -0.987218730834842130, -0.987210761041120160, -0.987202788779371400, -0.987194814049615510, -0.987186836851872700, -0.987178857186162720, -0.987170875052505560, --0.987162890450921320, -0.987154903381429750, -0.987146913844051070, -0.987138921838805030, -0.987130927365711620, -0.987122930424790930, -0.987114931016062960, -0.987106929139547670, --0.987098924795264950, -0.987090917983235010, -0.987082908703477810, -0.987074896956013250, -0.987066882740861520, -0.987058866058042490, -0.987050846907576380, -0.987042825289483170, --0.987034801203782840, -0.987026774650495490, -0.987018745629641310, -0.987010714141240090, -0.987002680185312230, -0.986994643761877620, -0.986986604870956350, -0.986978563512568740, --0.986970519686734550, -0.986962473393474090, -0.986954424632807470, -0.986946373404754880, -0.986938319709336210, -0.986930263546571870, -0.986922204916481750, -0.986914143819086150, --0.986906080254405180, -0.986898014222459150, -0.986889945723267940, -0.986881874756851960, -0.986873801323231210, -0.986865725422426010, -0.986857647054456440, -0.986849566219342720, --0.986841482917105160, -0.986833397147763860, -0.986825308911339130, -0.986817218207851070, -0.986809125037319990, -0.986801029399766110, -0.986792931295209620, -0.986784830723670850, --0.986776727685170000, -0.986768622179727270, -0.986760514207362990, -0.986752403768097470, -0.986744290861950920, -0.986736175488943660, -0.986728057649095990, -0.986719937342428130, --0.986711814568960510, -0.986703689328713220, -0.986695561621706800, -0.986687431447961450, -0.986679298807497500, -0.986671163700335250, -0.986663026126495150, -0.986654886085997610, --0.986646743578862620, -0.986638598605110940, -0.986630451164762780, -0.986622301257838340, -0.986614148884358280, -0.986605994044342790, -0.986597836737812320, -0.986589676964787280, --0.986581514725288100, -0.986573350019334990, -0.986565182846948610, -0.986557013208149260, -0.986548841102957370, -0.986540666531393380, -0.986532489493477720, -0.986524309989230800, --0.986516128018673170, -0.986507943581825140, -0.986499756678707370, -0.986491567309340180, -0.986483375473743980, -0.986475181171939440, -0.986466984403946870, -0.986458785169786910, --0.986450583469479890, -0.986442379303046460, -0.986434172670507150, -0.986425963571882390, -0.986417752007192620, -0.986409537976458580, -0.986401321479700610, -0.986393102516939350, --0.986384881088195440, -0.986376657193489210, -0.986368430832841430, -0.986360202006272500, -0.986351970713803090, -0.986343736955453740, -0.986335500731244990, -0.986327262041197580, --0.986319020885331970, -0.986310777263668890, -0.986302531176228790, -0.986294282623032430, -0.986286031604100330, -0.986277778119453160, -0.986269522169111460, -0.986261263753096080, --0.986253002871427360, -0.986244739524126280, -0.986236473711213370, -0.986228205432709280, -0.986219934688634560, -0.986211661479010070, -0.986203385803856470, -0.986195107663194290, --0.986186827057044410, -0.986178543985427480, -0.986170258448364260, -0.986161970445875280, -0.986153679977981420, -0.986145387044703340, -0.986137091646061780, -0.986128793782077520, --0.986120493452771310, -0.986112190658163800, -0.986103885398275760, -0.986095577673128170, -0.986087267482741560, -0.986078954827136700, -0.986070639706334570, -0.986062322120355830, --0.986054002069221220, -0.986045679552951640, -0.986037354571567830, -0.986029027125090660, -0.986020697213540910, -0.986012364836939440, -0.986004029995307120, -0.985995692688664600, --0.985987352917032880, -0.985979010680432920, -0.985970665978885270, -0.985962318812411030, -0.985953969181030950, -0.985945617084765910, -0.985937262523636890, -0.985928905497664760, --0.985920546006870290, -0.985912184051274450, -0.985903819630898240, -0.985895452745762400, -0.985887083395887930, -0.985878711581295810, -0.985870337302006900, -0.985861960558042090, --0.985853581349422360, -0.985845199676168790, -0.985836815538302160, -0.985828428935843440, -0.985820039868813720, -0.985811648337233890, -0.985803254341124920, -0.985794857880507800, --0.985786458955403620, -0.985778057565833250, -0.985769653711817680, -0.985761247393378000, -0.985752838610535200, -0.985744427363310360, -0.985736013651724470, -0.985727597475798410, --0.985719178835553490, -0.985710757731010580, -0.985702334162190770, -0.985693908129115060, -0.985685479631804640, -0.985677048670280500, -0.985668615244563840, -0.985660179354675540, --0.985651741000636790, -0.985643300182468710, -0.985634856900192370, -0.985626411153828990, -0.985617962943399430, -0.985609512268925010, -0.985601059130426840, -0.985592603527926100, --0.985584145461443680, -0.985575684931001010, -0.985567221936619050, -0.985558756478319140, -0.985550288556122260, -0.985541818170049710, -0.985533345320122600, -0.985524870006362130, --0.985516392228789400, -0.985507911987425820, -0.985499429282292390, -0.985490944113410320, -0.985482456480801020, -0.985473966384485480, -0.985465473824485130, -0.985456978800821060, --0.985448481313514480, -0.985439981362586700, -0.985431478948059050, -0.985422974069952720, -0.985414466728288920, -0.985405956923088850, -0.985397444654373960, -0.985388929922165540, --0.985380412726484690, -0.985371893067352840, -0.985363370944791210, -0.985354846358821200, -0.985346319309464040, -0.985337789796741140, -0.985329257820673820, -0.985320723381283290, --0.985312186478590870, -0.985303647112618090, -0.985295105283386150, -0.985286560990916490, -0.985278014235230310, -0.985269465016349270, -0.985260913334294440, -0.985252359189087380, --0.985243802580749390, -0.985235243509301920, -0.985226681974766370, -0.985218117977164080, -0.985209551516516460, -0.985200982592844940, -0.985192411206171070, -0.985183837356516160, --0.985175261043901520, -0.985166682268348910, -0.985158101029879440, -0.985149517328514860, -0.985140931164276370, -0.985132342537185620, -0.985123751447264050, -0.985115157894532970, --0.985106561879014130, -0.985097963400728750, -0.985089362459698580, -0.985080759055944940, -0.985072153189489490, -0.985063544860353520, -0.985054934068558820, -0.985046320814126690, --0.985037705097078780, -0.985029086917436620, -0.985020466275221770, -0.985011843170455760, -0.985003217603160120, -0.984994589573356390, -0.984985959081066230, -0.984977326126311170, --0.984968690709112750, -0.984960052829492730, -0.984951412487472420, -0.984942769683073700, -0.984934124416318000, -0.984925476687227070, -0.984916826495822350, -0.984908173842125590, --0.984899518726158440, -0.984890861147942440, -0.984882201107499240, -0.984873538604850610, -0.984864873640018180, -0.984856206213023500, -0.984847536323888330, -0.984838863972634320, --0.984830189159283110, -0.984821511883856470, -0.984812832146376050, -0.984804149946863490, -0.984795465285340570, -0.984786778161829020, -0.984778088576350520, -0.984769396528926810, --0.984760702019579660, -0.984752005048330710, -0.984743305615201740, -0.984734603720214490, -0.984725899363390720, -0.984717192544752210, -0.984708483264320700, -0.984699771522118070, --0.984691057318165970, -0.984682340652486170, -0.984673621525100630, -0.984664899936030900, -0.984656175885299080, -0.984647449372926700, -0.984638720398935630, -0.984629988963347970, --0.984621255066185140, -0.984612518707469350, -0.984603779887222140, -0.984595038605465490, -0.984586294862221270, -0.984577548657511350, -0.984568799991357490, -0.984560048863781680, --0.984551295274805670, -0.984542539224451560, -0.984533780712741000, -0.984525019739695970, -0.984516256305338460, -0.984507490409690320, -0.984498722052773330, -0.984489951234609690, --0.984481177955221050, -0.984472402214629510, -0.984463624012857030, -0.984454843349925390, -0.984446060225856790, -0.984437274640672880, -0.984428486594395860, -0.984419696087047600, --0.984410903118650090, -0.984402107689225310, -0.984393309798795360, -0.984384509447382090, -0.984375706635007510, -0.984366901361693690, -0.984358093627462630, -0.984349283432336300, --0.984340470776336800, -0.984331655659485990, -0.984322838081806210, -0.984314018043319190, -0.984305195544047270, -0.984296370584012310, -0.984287543163236410, -0.984278713281741660, --0.984269880939550150, -0.984261046136683860, -0.984252208873165000, -0.984243369149015670, -0.984234526964257840, -0.984225682318913720, -0.984216835213005400, -0.984207985646555090, --0.984199133619584670, -0.984190279132116430, -0.984181422184172590, -0.984172562775775140, -0.984163700906946270, -0.984154836577708190, -0.984145969788082890, -0.984137100538092780, --0.984128228827759970, -0.984119354657106430, -0.984110478026154590, -0.984101598934926550, -0.984092717383444620, -0.984083833371730780, -0.984074946899807350, -0.984066057967696530, --0.984057166575420640, -0.984048272723001770, -0.984039376410462350, -0.984030477637824360, -0.984021576405110230, -0.984012672712342160, -0.984003766559542360, -0.983994857946733140, --0.983985946873936920, -0.983977033341175700, -0.983968117348471890, -0.983959198895847820, -0.983950277983325790, -0.983941354610928020, -0.983932428778676820, -0.983923500486594600, --0.983914569734703590, -0.983905636523026320, -0.983896700851584760, -0.983887762720401570, -0.983878822129498840, -0.983869879078899220, -0.983860933568624810, -0.983851985598698130, --0.983843035169141400, -0.983834082279977150, -0.983825126931227590, -0.983816169122915360, -0.983807208855062560, -0.983798246127691840, -0.983789280940825520, -0.983780313294486010, --0.983771343188695640, -0.983762370623476930, -0.983753395598852220, -0.983744418114844140, -0.983735438171475020, -0.983726455768767270, -0.983717470906743330, -0.983708483585425730, --0.983699493804837010, -0.983690501564999490, -0.983681506865935700, -0.983672509707668170, -0.983663510090219350, -0.983654508013611760, -0.983645503477867940, -0.983636496483010330, --0.983627487029061440, -0.983618475116043940, -0.983609460743980150, -0.983600443912892700, -0.983591424622804240, -0.983582402873737220, -0.983573378665714040, -0.983564351998757580, --0.983555322872890160, -0.983546291288134420, -0.983537257244513020, -0.983528220742048380, -0.983519181780763250, -0.983510140360680190, -0.983501096481821710, -0.983492050144210590, --0.983483001347869260, -0.983473950092820460, -0.983464896379086740, -0.983455840206690860, -0.983446781575655240, -0.983437720486002860, -0.983428656937756050, -0.983419590930937670, --0.983410522465570260, -0.983401451541676570, -0.983392378159279160, -0.983383302318400880, -0.983374224019064380, -0.983365143261292320, -0.983356060045107340, -0.983346974370532200, --0.983337886237589660, -0.983328795646302490, -0.983319702596693210, -0.983310607088784700, -0.983301509122599730, -0.983292408698160920, -0.983283305815491170, -0.983274200474613000, --0.983265092675549510, -0.983255982418323130, -0.983246869702956940, -0.983237754529473480, -0.983228636897895750, -0.983219516808246260, -0.983210394260548020, -0.983201269254823870, --0.983192141791096490, -0.983183011869388830, -0.983173879489723570, -0.983164744652123670, -0.983155607356611890, -0.983146467603211010, -0.983137325391943980, -0.983128180722833810, --0.983119033595903020, -0.983109884011174720, -0.983100731968671650, -0.983091577468416800, -0.983082420510432930, -0.983073261094743130, -0.983064099221370060, -0.983054934890336800, --0.983045768101666220, -0.983036598855381190, -0.983027427151504600, -0.983018252990059520, -0.983009076371068820, -0.982999897294555390, -0.982990715760542310, -0.982981531769052340, --0.982972345320108580, -0.982963156413733890, -0.982953965049951470, -0.982944771228783990, -0.982935574950254630, -0.982926376214386280, -0.982917175021202130, -0.982907971370724940, --0.982898765262977810, -0.982889556697983830, -0.982880345675765880, -0.982871132196347140, -0.982861916259750500, -0.982852697865999160, -0.982843477015115980, -0.982834253707124180, --0.982825027942046630, -0.982815799719906620, -0.982806569040727160, -0.982797335904531220, -0.982788100311341890, -0.982778862261182380, -0.982769621754075670, -0.982760378790044960, --0.982751133369113240, -0.982741885491303700, -0.982732635156639440, -0.982723382365143670, -0.982714127116839360, -0.982704869411749730, -0.982695609249897960, -0.982686346631307160, --0.982677081556000530, -0.982667814024001160, -0.982658544035332260, -0.982649271590016920, -0.982639996688078550, -0.982630719329540050, -0.982621439514424820, -0.982612157242755970, --0.982602872514556800, -0.982593585329850420, -0.982584295688660010, -0.982575003591008910, -0.982565709036920310, -0.982556412026417410, -0.982547112559523540, -0.982537810636261780, --0.982528506256655660, -0.982519199420728070, -0.982509890128502650, -0.982500578380002490, -0.982491264175250790, -0.982481947514270980, -0.982472628397086270, -0.982463306823720070, --0.982453982794195490, -0.982444656308536060, -0.982435327366764870, -0.982425995968905450, -0.982416662114981020, -0.982407325805015000, -0.982397987039030580, -0.982388645817051210, --0.982379302139100300, -0.982369956005201050, -0.982360607415376900, -0.982351256369651260, -0.982341902868047570, -0.982332546910589020, -0.982323188497299050, -0.982313827628201190, --0.982304464303318750, -0.982295098522675160, -0.982285730286293850, -0.982276359594198120, -0.982266986446411640, -0.982257610842957600, -0.982248232783859530, -0.982238852269140870, --0.982229469298825150, -0.982220083872935690, -0.982210695991496020, -0.982201305654529570, -0.982191912862059980, -0.982182517614110460, -0.982173119910704770, -0.982163719751866230, --0.982154317137618470, -0.982144912067984820, -0.982135504542988920, -0.982126094562654210, -0.982116682127004310, -0.982107267236062790, -0.982097849889852940, -0.982088430088398520, --0.982079007831723080, -0.982069583119850150, -0.982060155952803160, -0.982050726330605860, -0.982041294253281680, -0.982031859720854270, -0.982022422733347280, -0.982012983290784240, --0.982003541393188570, -0.981994097040584270, -0.981984650232994530, -0.981975200970443330, -0.981965749252953990, -0.981956295080550380, -0.981946838453256030, -0.981937379371094600, --0.981927917834089610, -0.981918453842264950, -0.981908987395644030, -0.981899518494250720, -0.981890047138108570, -0.981880573327241320, -0.981871097061672750, -0.981861618341426270, --0.981852137166525860, -0.981842653536995070, -0.981833167452857650, -0.981823678914137240, -0.981814187920857730, -0.981804694473042750, -0.981795198570715950, -0.981785700213901210, --0.981776199402622280, -0.981766696136902710, -0.981757190416766570, -0.981747682242237300, -0.981738171613338870, -0.981728658530095060, -0.981719142992529600, -0.981709625000666160, --0.981700104554528830, -0.981690581654141140, -0.981681056299526960, -0.981671528490710270, -0.981661998227714610, -0.981652465510564070, -0.981642930339282290, -0.981633392713893270, --0.981623852634420760, -0.981614310100888510, -0.981604765113320620, -0.981595217671740740, -0.981585667776172840, -0.981576115426640810, -0.981566560623168380, -0.981557003365779670, --0.981547443654498310, -0.981537881489348510, -0.981528316870353910, -0.981518749797538500, -0.981509180270926260, -0.981499608290541060, -0.981490033856406760, -0.981480456968547470, --0.981470877626987040, -0.981461295831749460, -0.981451711582858490, -0.981442124880338330, -0.981432535724212960, -0.981422944114506040, -0.981413350051241970, -0.981403753534444420, --0.981394154564137480, -0.981384553140345120, -0.981374949263091430, -0.981365342932400410, -0.981355734148295910, -0.981346122910802140, -0.981336509219943090, -0.981326893075742830, --0.981317274478225140, -0.981307653427414440, -0.981298029923334590, -0.981288403966009580, -0.981278775555463610, -0.981269144691720660, -0.981259511374804940, -0.981249875604740420, --0.981240237381551080, -0.981230596705261360, -0.981220953575895010, -0.981211307993476330, -0.981201659958029330, -0.981192009469578190, -0.981182356528147000, -0.981172701133759980, --0.981163043286441220, -0.981153382986214790, -0.981143720233104920, -0.981134055027135800, -0.981124387368331520, -0.981114717256716170, -0.981105044692314190, -0.981095369675149430, --0.981085692205246440, -0.981076012282629080, -0.981066329907321680, -0.981056645079348530, -0.981046957798733740, -0.981037268065501510, -0.981027575879676260, -0.981017881241281970, --0.981008184150342970, -0.980998484606883440, -0.980988782610927810, -0.980979078162500180, -0.980969371261624870, -0.980959661908326170, -0.980949950102628310, -0.980940235844555470, --0.980930519134132100, -0.980920799971382480, -0.980911078356330850, -0.980901354289001490, -0.980891627769418740, -0.980881898797606900, -0.980872167373590400, -0.980862433497393440, --0.980852697169040330, -0.980842958388555510, -0.980833217155963390, -0.980823473471288180, -0.980813727334554190, -0.980803978745785950, -0.980794227705007790, -0.980784474212244020, --0.980774718267519050, -0.980764959870857430, -0.980755199022283250, -0.980745435721821160, -0.980735669969495350, -0.980725901765330480, -0.980716131109350850, -0.980706358001580900, --0.980696582442045050, -0.980686804430767720, -0.980677023967773340, -0.980667241053086450, -0.980657455686731460, -0.980647667868732810, -0.980637877599115030, -0.980628084877902540, --0.980618289705119880, -0.980608492080791370, -0.980598692004941760, -0.980588889477595370, -0.980579084498776730, -0.980569277068510380, -0.980559467186820970, -0.980549654853732690, --0.980539840069270420, -0.980530022833458470, -0.980520203146321490, -0.980510381007884010, -0.980500556418170580, -0.980490729377205830, -0.980480899885014080, -0.980471067941620200, --0.980461233547048620, -0.980451396701323970, -0.980441557404470920, -0.980431715656513880, -0.980421871457477500, -0.980412024807386540, -0.980402175706265420, -0.980392324154139020, --0.980382470151031640, -0.980372613696968150, -0.980362754791973100, -0.980352893436071240, -0.980343029629287100, -0.980333163371645330, -0.980323294663170810, -0.980313423503887840, --0.980303549893821510, -0.980293673832996150, -0.980283795321436720, -0.980273914359167780, -0.980264030946214060, -0.980254145082600110, -0.980244256768351030, -0.980234366003491120, --0.980224472788045480, -0.980214577122038520, -0.980204679005495130, -0.980194778438440050, -0.980184875420898050, -0.980174969952893880, -0.980165062034452310, -0.980155151665597970, --0.980145238846355850, -0.980135323576750590, -0.980125405856806960, -0.980115485686549940, -0.980105563066004160, -0.980095637995194500, -0.980085710474145610, -0.980075780502882580, --0.980065848081430050, -0.980055913209813000, -0.980045975888055980, -0.980036036116184170, -0.980026093894222240, -0.980016149222195040, -0.980006202100127450, -0.979996252528044450, --0.979986300505970800, -0.979976346033931360, -0.979966389111951000, -0.979956429740054700, -0.979946467918267340, -0.979936503646613890, -0.979926536925119110, -0.979916567753807980, --0.979906596132705480, -0.979896622061836360, -0.979886645541225840, -0.979876666570898560, -0.979866685150879710, -0.979856701281194180, -0.979846714961866820, -0.979836726192922720, --0.979826734974386770, -0.979816741306284040, -0.979806745188639420, -0.979796746621477980, -0.979786745604824590, -0.979776742138704360, -0.979766736223142360, -0.979756727858163370, --0.979746717043792680, -0.979736703780055170, -0.979726688066975940, -0.979716669904579950, -0.979706649292892200, -0.979696626231937980, -0.979686600721742070, -0.979676572762329780, --0.979666542353725970, -0.979656509495955840, -0.979646474189044380, -0.979636436433016790, -0.979626396227898040, -0.979616353573713460, -0.979606308470487800, -0.979596260918246480, --0.979586210917014480, -0.979576158466817000, -0.979566103567679040, -0.979556046219625890, -0.979545986422682650, -0.979535924176874300, -0.979525859482226260, -0.979515792338763510, --0.979505722746511380, -0.979495650705494820, -0.979485576215739280, -0.979475499277269730, -0.979465419890111380, -0.979455338054289530, -0.979445253769829380, -0.979435167036756040, --0.979425077855094810, -0.979414986224870780, -0.979404892146109370, -0.979394795618835690, -0.979384696643075150, -0.979374595218852730, -0.979364491346193860, -0.979354385025123730, --0.979344276255667780, -0.979334165037850980, -0.979324051371698760, -0.979313935257236530, -0.979303816694489400, -0.979293695683482790, -0.979283572224241890, -0.979273446316792030, --0.979263317961158620, -0.979253187157366870, -0.979243053905442080, -0.979232918205409810, -0.979222780057295130, -0.979212639461123580, -0.979202496416920360, -0.979192350924711020, --0.979182202984520630, -0.979172052596374850, -0.979161899760298880, -0.979151744476318250, -0.979141586744458170, -0.979131426564744170, -0.979121263937201560, -0.979111098861855880, --0.979100931338732330, -0.979090761367856550, -0.979080588949253870, -0.979070414082949590, -0.979060236768969470, -0.979050057007338600, -0.979039874798082630, -0.979029690141226980, --0.979019503036797190, -0.979009313484818570, -0.978999121485316650, -0.978988927038316860, -0.978978730143844840, -0.978968530801926030, -0.978958329012585840, -0.978948124775849800, --0.978937918091743580, -0.978927708960292460, -0.978917497381522010, -0.978907283355457960, -0.978897066882125520, -0.978886847961550570, -0.978876626593758400, -0.978866402778774790, --0.978856176516625040, -0.978845947807334920, -0.978835716650929940, -0.978825483047435660, -0.978815246996877610, -0.978805008499281540, -0.978794767554672870, -0.978784524163077370, --0.978774278324520460, -0.978764030039028010, -0.978753779306625330, -0.978743526127338280, -0.978733270501192300, -0.978723012428213250, -0.978712751908426660, -0.978702488941858180, --0.978692223528533470, -0.978681955668478150, -0.978671685361718110, -0.978661412608278660, -0.978651137408185770, -0.978640859761465090, -0.978630579668142150, -0.978620297128242830, --0.978610012141792770, -0.978599724708817620, -0.978589434829343240, -0.978579142503395170, -0.978568847730999390, -0.978558550512181440, -0.978548250846967060, -0.978537948735382020, --0.978527644177452190, -0.978517337173203220, -0.978507027722660960, -0.978496715825851070, -0.978486401482799420, -0.978476084693531760, -0.978465765458073840, -0.978455443776451550, --0.978445119648690630, -0.978434793074816960, -0.978424464054856280, -0.978414132588834470, -0.978403798676777290, -0.978393462318710600, -0.978383123514660280, -0.978372782264652190, --0.978362438568712080, -0.978352092426865940, -0.978341743839139410, -0.978331392805558700, -0.978321039326149440, -0.978310683400937630, -0.978300325029949010, -0.978289964213209680, --0.978279600950745400, -0.978269235242582020, -0.978258867088745760, -0.978248496489262150, -0.978238123444157390, -0.978227747953457350, -0.978217370017187890, -0.978206989635375000, --0.978196606808044660, -0.978186221535222720, -0.978175833816935290, -0.978165443653208340, -0.978155051044067750, -0.978144655989539480, -0.978134258489649630, -0.978123858544424070, --0.978113456153888890, -0.978103051318070070, -0.978092644036993590, -0.978082234310685530, -0.978071822139171880, -0.978061407522478720, -0.978050990460632040, -0.978040570953657820, --0.978030149001582250, -0.978019724604431210, -0.978009297762230890, -0.977998868475007390, -0.977988436742786680, -0.977978002565594860, -0.977967565943458130, -0.977957126876402350, --0.977946685364453840, -0.977936241407638570, -0.977925795005982760, -0.977915346159512370, -0.977904894868253720, -0.977894441132232780, -0.977883984951475660, -0.977873526326008660, --0.977863065255857870, -0.977852601741049380, -0.977842135781609390, -0.977831667377564000, -0.977821196528939510, -0.977810723235762010, -0.977800247498057830, -0.977789769315852820, --0.977779288689173520, -0.977768805618045910, -0.977758320102496410, -0.977747832142551010, -0.977737341738236120, -0.977726848889577730, -0.977716353596602360, -0.977705855859336000, --0.977695355677805080, -0.977684853052035780, -0.977674347982054210, -0.977663840467886900, -0.977653330509559940, -0.977642818107099740, -0.977632303260532410, -0.977621785969884360, --0.977611266235181800, -0.977600744056451140, -0.977590219433718600, -0.977579692367010480, -0.977569162856353090, -0.977558630901772860, -0.977548096503296100, -0.977537559660949020, --0.977527020374758030, -0.977516478644749550, -0.977505934470949800, -0.977495387853385300, -0.977484838792082260, -0.977474287287067200, -0.977463733338366340, -0.977453176946006200, --0.977442618110013100, -0.977432056830413450, -0.977421493107233700, -0.977410926940500140, -0.977400358330239310, -0.977389787276477630, -0.977379213779241420, -0.977368637838557210, --0.977358059454451420, -0.977347478626950370, -0.977336895356080700, -0.977326309641868840, -0.977315721484341200, -0.977305130883524110, -0.977294537839444310, -0.977283942352128230, --0.977273344421602190, -0.977262744047892820, -0.977252141231026660, -0.977241535971030030, -0.977230928267929570, -0.977220318121751810, -0.977209705532523290, -0.977199090500270540, --0.977188473025019990, -0.977177853106798280, -0.977167230745631940, -0.977156605941547520, -0.977145978694571540, -0.977135349004730760, -0.977124716872051490, -0.977114082296560380, --0.977103445278284190, -0.977092805817249330, -0.977082163913482460, -0.977071519567010220, -0.977060872777859020, -0.977050223546055860, -0.977039571871627040, -0.977028917754599210, --0.977018261194999240, -0.977007602192853540, -0.976996940748188770, -0.976986276861031790, -0.976975610531409020, -0.976964941759347230, -0.976954270544873160, -0.976943596888013350, --0.976932920788794570, -0.976922242247243440, -0.976911561263386740, -0.976900877837251100, -0.976890191968863400, -0.976879503658250050, -0.976868812905438030, -0.976858119710454000, --0.976847424073324590, -0.976836725994076670, -0.976826025472737000, -0.976815322509332120, -0.976804617103888990, -0.976793909256434390, -0.976783198966994950, -0.976772486235597540, --0.976761771062268910, -0.976751053447035830, -0.976740333389925160, -0.976729610890963660, -0.976718885950178080, -0.976708158567595410, -0.976697428743242170, -0.976686696477145460, --0.976675961769331910, -0.976665224619828630, -0.976654485028662140, -0.976643742995859540, -0.976632998521447470, -0.976622251605453020, -0.976611502247902830, -0.976600750448824000, --0.976589996208243160, -0.976579239526187410, -0.976568480402683630, -0.976557718837758550, -0.976546954831439160, -0.976536188383752450, -0.976525419494725270, -0.976514648164384490, --0.976503874392757100, -0.976493098179870070, -0.976482319525750260, -0.976471538430424670, -0.976460754893920260, -0.976449968916263900, -0.976439180497482680, -0.976428389637603370, --0.976417596336653260, -0.976406800594659010, -0.976396002411647920, -0.976385201787646650, -0.976374398722682500, -0.976363593216782340, -0.976352785269973160, -0.976341974882282030, --0.976331162053735930, -0.976320346784362080, -0.976309529074187220, -0.976298708923238560, -0.976287886331543060, -0.976277061299127950, -0.976266233826020180, -0.976255403912246860, --0.976244571557834950, -0.976233736762811670, -0.976222899527203980, -0.976212059851039090, -0.976201217734343980, -0.976190373177145960, -0.976179526179471900, -0.976168676741349000, --0.976157824862804450, -0.976146970543865340, -0.976136113784558890, -0.976125254584912060, -0.976114392944952170, -0.976103528864706190, -0.976092662344201440, -0.976081793383465010, --0.976070921982524210, -0.976060048141405900, -0.976049171860137620, -0.976038293138746350, -0.976027411977259400, -0.976016528375703960, -0.976005642334107140, -0.975994753852496230, --0.975983862930898450, -0.975972969569340880, -0.975962073767851050, -0.975951175526455940, -0.975940274845182860, -0.975929371724059250, -0.975918466163112060, -0.975907558162368850, --0.975896647721856580, -0.975885734841602790, -0.975874819521634680, -0.975863901761979460, -0.975852981562664530, -0.975842058923717110, -0.975831133845164620, -0.975820206327034260, --0.975809276369353330, -0.975798343972149260, -0.975787409135449260, -0.975776471859280850, -0.975765532143671120, -0.975754589988647720, -0.975743645394237750, -0.975732698360468720, --0.975721748887367850, -0.975710796974962660, -0.975699842623280470, -0.975688885832348700, -0.975677926602194770, -0.975666964932845880, -0.975656000824329680, -0.975645034276673480, --0.975634065289904710, -0.975623093864050660, -0.975612119999138990, -0.975601143695197020, -0.975590164952252150, -0.975579183770331810, -0.975568200149463660, -0.975557214089674880, --0.975546225590993130, -0.975535234653445830, -0.975524241277060390, -0.975513245461864350, -0.975502247207885140, -0.975491246515150510, -0.975480243383687550, -0.975469237813524130, --0.975458229804687550, -0.975447219357205460, -0.975436206471105180, -0.975425191146414460, -0.975414173383160830, -0.975403153181371720, -0.975392130541074650, -0.975381105462297390, --0.975370077945067250, -0.975359047989411980, -0.975348015595359110, -0.975336980762936180, -0.975325943492170720, -0.975314903783090490, -0.975303861635723020, -0.975292817050095850, --0.975281770026236620, -0.975270720564172970, -0.975259668663932540, -0.975248614325543000, -0.975237557549031850, -0.975226498334426760, -0.975215436681755590, -0.975204372591045640, --0.975193306062324900, -0.975182237095620800, -0.975171165690961180, -0.975160091848373600, -0.975149015567885800, -0.975137936849525430, -0.975126855693320250, -0.975115772099298010, --0.975104686067486240, -0.975093597597912810, -0.975082506690605370, -0.975071413345591550, -0.975060317562899350, -0.975049219342556280, -0.975038118684590120, -0.975027015589028820, --0.975015910055899830, -0.975004802085231210, -0.974993691677050410, -0.974982578831385500, -0.974971463548264140, -0.974960345827714070, -0.974949225669763160, -0.974938103074439290, --0.974926978041769980, -0.974915850571783320, -0.974904720664507060, -0.974893588319968970, -0.974882453538196800, -0.974871316319218640, -0.974860176663062130, -0.974849034569755250, --0.974837890039325750, -0.974826743071801390, -0.974815593667210380, -0.974804441825580240, -0.974793287546939060, -0.974782130831314710, -0.974770971678734940, -0.974759810089227740, --0.974748646062821080, -0.974737479599542820, -0.974726310699420840, -0.974715139362483000, -0.974703965588757380, -0.974692789378271860, -0.974681610731054300, -0.974670429647132800, --0.974659246126535210, -0.974648060169289510, -0.974636871775423570, -0.974625680944965490, -0.974614487677943230, -0.974603291974384780, -0.974592093834318110, -0.974580893257771200, --0.974569690244771910, -0.974558484795348570, -0.974547276909528910, -0.974536066587341150, -0.974524853828813150, -0.974513638633973110, -0.974502421002848900, -0.974491200935468700, --0.974479978431860410, -0.974468753492052200, -0.974457526116072170, -0.974446296303948300, -0.974435064055708570, -0.974423829371381390, -0.974412592250994410, -0.974401352694576170, --0.974390110702154420, -0.974378866273757360, -0.974367619409413190, -0.974356370109149990, -0.974345118372995870, -0.974333864200978890, -0.974322607593127280, -0.974311348549469210, --0.974300087070032680, -0.974288823154846000, -0.974277556803937240, -0.974266288017334610, -0.974255016795066210, -0.974243743137160330, -0.974232467043645080, -0.974221188514548640, --0.974209907549899220, -0.974198624149725020, -0.974187338314054350, -0.974176050042915190, -0.974164759336336060, -0.974153466194344950, -0.974142170616970060, -0.974130872604239920, --0.974119572156182500, -0.974108269272826230, -0.974096963954199200, -0.974085656200329940, -0.974074346011246320, -0.974063033386976970, -0.974051718327550000, -0.974040400832993700, --0.974029080903336400, -0.974017758538606500, -0.974006433738832110, -0.973995106504041640, -0.973983776834263400, -0.973972444729525820, -0.973961110189856980, -0.973949773215285420, --0.973938433805839440, -0.973927091961547360, -0.973915747682437600, -0.973904400968538360, -0.973893051819878290, -0.973881700236485460, -0.973870346218388420, -0.973858989765615470, --0.973847630878195150, -0.973836269556155650, -0.973824905799525520, -0.973813539608333170, -0.973802170982606910, -0.973790799922375270, -0.973779426427666570, -0.973768050498509340, --0.973756672134932000, -0.973745291336962860, -0.973733908104630670, -0.973722522437963640, -0.973711134336990300, -0.973699743801739070, -0.973688350832238480, -0.973676955428517180, --0.973665557590603250, -0.973654157318525670, -0.973642754612312530, -0.973631349471992590, -0.973619941897594150, -0.973608531889145980, -0.973597119446676480, -0.973585704570214090, --0.973574287259787560, -0.973562867515425200, -0.973551445337155760, -0.973540020725007670, -0.973528593679009460, -0.973517164199189880, -0.973505732285577350, -0.973494297938200530, --0.973482861157087820, -0.973471421942268100, -0.973459980293769790, -0.973448536211621530, -0.973437089695851960, -0.973425640746489520, -0.973414189363563160, -0.973402735547101220, --0.973391279297132540, -0.973379820613685550, -0.973368359496789130, -0.973356895946471680, -0.973345429962762080, -0.973333961545688850, -0.973322490695280760, -0.973311017411566450, --0.973299541694574550, -0.973288063544333840, -0.973276582960872940, -0.973265099944220500, -0.973253614494405510, -0.973242126611456370, -0.973230636295401850, -0.973219143546270820, --0.973207648364091900, -0.973196150748893980, -0.973184650700705480, -0.973173148219555470, -0.973161643305472610, -0.973150135958485650, -0.973138626178623230, -0.973127113965914450, --0.973115599320387710, -0.973104082242072010, -0.973092562730996090, -0.973081040787188820, -0.973069516410678960, -0.973057989601495250, -0.973046460359666580, -0.973034928685221790, --0.973023394578189650, -0.973011858038599020, -0.973000319066478770, -0.972988777661857650, -0.972977233824764750, -0.972965687555228610, -0.972954138853278310, -0.972942587718942600, --0.972931034152250570, -0.972919478153230770, -0.972907919721912480, -0.972896358858324260, -0.972884795562495190, -0.972873229834454010, -0.972861661674229940, -0.972850091081851610, --0.972838518057348000, -0.972826942600748200, -0.972815364712081080, -0.972803784391375380, -0.972792201638660430, -0.972780616453964740, -0.972769028837317640, -0.972757438788747990, --0.972745846308284760, -0.972734251395956820, -0.972722654051793260, -0.972711054275823160, -0.972699452068075400, -0.972687847428578940, -0.972676240357362890, -0.972664630854456310, --0.972653018919888090, -0.972641404553687310, -0.972629787755883050, -0.972618168526504290, -0.972606546865580120, -0.972594922773139640, -0.972583296249211800, -0.972571667293825710, --0.972560035907010460, -0.972548402088795120, -0.972536765839208780, -0.972525127158280540, -0.972513486046039490, -0.972501842502514700, -0.972490196527735380, -0.972478548121730400, --0.972466897284529170, -0.972455244016160680, -0.972443588316654120, -0.972431930186038570, -0.972420269624343140, -0.972408606631597120, -0.972396941207829490, -0.972385273353069570, --0.972373603067346440, -0.972361930350689300, -0.972350255203127340, -0.972338577624689780, -0.972326897615405810, -0.972315215175304500, -0.972303530304415080, -0.972291843002767050, --0.972280153270389190, -0.972268461107311130, -0.972256766513561850, -0.972245069489170670, -0.972233370034166770, -0.972221668148579470, -0.972209963832437960, -0.972198257085771680, --0.972186547908609590, -0.972174836300981230, -0.972163122262915790, -0.972151405794442480, -0.972139686895590720, -0.972127965566389700, -0.972116241806868730, -0.972104515617057240, --0.972092786996984430, -0.972081055946679710, -0.972069322466172170, -0.972057586555491460, -0.972045848214666770, -0.972034107443727420, -0.972022364242702940, -0.972010618611622410, --0.971998870550515370, -0.971987120059411120, -0.971975367138339100, -0.971963611787328710, -0.971951854006409270, -0.971940093795610080, -0.971928331154960800, -0.971916566084490620, --0.971904798584229070, -0.971893028654205460, -0.971881256294449440, -0.971869481504990080, -0.971857704285857160, -0.971845924637079860, -0.971834142558687830, -0.971822358050710380, --0.971810571113177040, -0.971798781746117330, -0.971786989949560700, -0.971775195723536540, -0.971763399068074300, -0.971751599983203710, -0.971739798468954090, -0.971727994525354970, --0.971716188152435770, -0.971704379350226240, -0.971692568118755710, -0.971680754458053690, -0.971668938368149830, -0.971657119849073660, -0.971645298900854600, -0.971633475523522420, --0.971621649717106520, -0.971609821481636440, -0.971597990817141820, -0.971586157723652200, -0.971574322201197330, -0.971562484249806510, -0.971550643869509510, -0.971538801060335850, --0.971526955822315300, -0.971515108155477260, -0.971503258059851600, -0.971491405535467640, -0.971479550582355240, -0.971467693200543940, -0.971455833390063360, -0.971443971150943280, --0.971432106483213210, -0.971420239386902920, -0.971408369862042040, -0.971396497908660230, -0.971384623526787120, -0.971372746716452460, -0.971360867477686020, -0.971348985810517320, --0.971337101714976230, -0.971325215191092380, -0.971313326238895440, -0.971301434858415250, -0.971289541049681350, -0.971277644812723720, -0.971265746147571880, -0.971253845054255830, --0.971241941532804960, -0.971230035583249380, -0.971218127205618620, -0.971206216399942650, -0.971194303166251100, -0.971182387504573750, -0.971170469414940450, -0.971158548897381070, --0.971146625951925250, -0.971134700578602850, -0.971122772777443630, -0.971110842548477570, -0.971098909891734420, -0.971086974807243930, -0.971075037295036080, -0.971063097355140510, --0.971051154987587320, -0.971039210192406130, -0.971027262969627050, -0.971015313319279700, -0.971003361241394190, -0.970991406736000150, -0.970979449803127670, -0.970967490442806500, --0.970955528655066740, -0.970943564439938010, -0.970931597797450530, -0.970919628727633930, -0.970907657230518310, -0.970895683306133410, -0.970883706954509430, -0.970871728175676240, --0.970859746969663600, -0.970847763336501690, -0.970835777276220280, -0.970823788788849450, -0.970811797874419180, -0.970799804532959440, -0.970787808764500100, -0.970775810569071360, --0.970763809946703080, -0.970751806897425240, -0.970739801421267810, -0.970727793518261000, -0.970715783188434540, -0.970703770431818770, -0.970691755248443530, -0.970679737638338920, --0.970667717601534920, -0.970655695138061710, -0.970643670247949180, -0.970631642931227500, -0.970619613187926780, -0.970607581018076870, -0.970595546421708200, -0.970583509398850520, --0.970571469949534140, -0.970559428073789030, -0.970547383771645400, -0.970535337043133330, -0.970523287888282900, -0.970511236307124210, -0.970499182299687460, -0.970487125866002720, --0.970475067006100200, -0.970463005720009990, -0.970450942007762270, -0.970438875869387260, -0.970426807304915040, -0.970414736314375690, -0.970402662897799640, -0.970390587055216860, --0.970378508786657550, -0.970366428092152120, -0.970354344971730450, -0.970342259425423070, -0.970330171453259950, -0.970318081055271510, -0.970305988231487730, -0.970293892981939130, --0.970281795306655590, -0.970269695205667750, -0.970257592679005580, -0.970245487726699500, -0.970233380348779590, -0.970221270545276400, -0.970209158316219900, -0.970197043661640500, --0.970184926581568520, -0.970172807076034260, -0.970160685145067920, -0.970148560788699930, -0.970136434006960480, -0.970124304799879990, -0.970112173167488770, -0.970100039109817010, --0.970087902626895260, -0.970075763718753700, -0.970063622385422760, -0.970051478626932750, -0.970039332443313970, -0.970027183834596960, -0.970015032800811920, -0.970002879341989370, --0.969990723458159620, -0.969978565149352990, -0.969966404415600000, -0.969954241256930970, -0.969942075673376420, -0.969929907664966560, -0.969917737231732020, -0.969905564373703120, --0.969893389090910270, -0.969881211383384010, -0.969869031251154650, -0.969856848694252700, -0.969844663712708720, -0.969832476306553000, -0.969820286475816080, -0.969808094220528600, --0.969795899540720760, -0.969783702436423200, -0.969771502907666340, -0.969759300954480820, -0.969747096576896950, -0.969734889774945370, -0.969722680548656510, -0.969710468898061120, --0.969698254823189390, -0.969686038324072070, -0.969673819400739600, -0.969661598053222720, -0.969649374281551730, -0.969637148085757290, -0.969624919465870150, -0.969612688421920500, --0.969600454953939320, -0.969588219061956910, -0.969575980746003930, -0.969563740006111010, -0.969551496842308790, -0.969539251254627700, -0.969527003243098710, -0.969514752807752010, --0.969502499948618480, -0.969490244665728750, -0.969477986959113360, -0.969465726828802940, -0.969453464274828370, -0.969441199297220060, -0.969428931896008760, -0.969416662071225010, --0.969404389822899780, -0.969392115151063490, -0.969379838055746900, -0.969367558536980760, -0.969355276594795700, -0.969342992229222490, -0.969330705440291760, -0.969318416228034270, --0.969306124592480670, -0.969293830533661920, -0.969281534051608440, -0.969269235146351220, -0.969256933817920880, -0.969244630066348200, -0.969232323891664030, -0.969220015293898900, --0.969207704273083780, -0.969195390829249550, -0.969183074962426620, -0.969170756672646180, -0.969158435959938780, -0.969146112824335160, -0.969133787265866410, -0.969121459284563170, --0.969109128880456310, -0.969096796053576570, -0.969084460803954940, -0.969072123131622050, -0.969059783036608890, -0.969047440518946200, -0.969035095578665070, -0.969022748215796040, --0.969010398430370290, -0.968998046222418470, -0.968985691591971570, -0.968973334539060320, -0.968960975063715810, -0.968948613165968920, -0.968936248845850390, -0.968923882103391310, --0.968911512938622430, -0.968899141351574960, -0.968886767342279520, -0.968874390910767100, -0.968862012057068790, -0.968849630781215440, -0.968837247083238040, -0.968824860963167440, --0.968812472421034740, -0.968800081456870910, -0.968787688070706810, -0.968775292262573530, -0.968762894032501930, -0.968750493380523210, -0.968738090306668130, -0.968725684810967990, --0.968713276893453430, -0.968700866554155880, -0.968688453793106090, -0.968676038610335130, -0.968663621005874110, -0.968651200979753990, -0.968638778532005970, -0.968626353662660920, --0.968613926371750030, -0.968601496659304280, -0.968589064525354760, -0.968576629969932660, -0.968564192993068950, -0.968551753594794730, -0.968539311775141190, -0.968526867534139300, --0.968514420871820380, -0.968501971788215290, -0.968489520283355220, -0.968477066357271490, -0.968464610009994950, -0.968452151241557040, -0.968439690051988710, -0.968427226441321070, --0.968414760409585410, -0.968402291956812820, -0.968389821083034510, -0.968377347788281660, -0.968364872072585480, -0.968352393935977160, -0.968339913378487680, -0.968327430400148570, --0.968314945000990800, -0.968302457181045790, -0.968289966940344530, -0.968277474278918420, -0.968264979196798550, -0.968252481694016230, -0.968239981770602780, -0.968227479426589380, --0.968214974662007230, -0.968202467476887650, -0.968189957871261830, -0.968177445845161300, -0.968164931398616920, -0.968152414531660340, -0.968139895244322760, -0.968127373536635360, --0.968114849408629690, -0.968102322860336710, -0.968089793891788060, -0.968077262503014730, -0.968064728694048470, -0.968052192464920250, -0.968039653815661590, -0.968027112746303820, --0.968014569256878230, -0.968002023347416250, -0.967989475017949190, -0.967976924268508450, -0.967964371099125480, -0.967951815509831450, -0.967939257500657900, -0.967926697071636260, --0.967914134222797820, -0.967901568954174120, -0.967889001265796470, -0.967876431157696280, -0.967863858629904980, -0.967851283682454210, -0.967838706315375050, -0.967826126528699260, --0.967813544322458030, -0.967800959696683010, -0.967788372651405490, -0.967775783186657250, -0.967763191302469350, -0.967750596998873560, -0.967738000275901290, -0.967725401133583960, --0.967712799571953220, -0.967700195591040370, -0.967687589190877160, -0.967674980371494910, -0.967662369132925140, -0.967649755475199490, -0.967637139398349500, -0.967624520902406580, --0.967611899987402490, -0.967599276653368530, -0.967586650900336460, -0.967574022728337700, -0.967561392137404000, -0.967548759127566660, -0.967536123698857550, -0.967523485851307980, --0.967510845584949820, -0.967498202899814470, -0.967485557795933700, -0.967472910273339040, -0.967460260332062120, -0.967447607972134360, -0.967434953193587740, -0.967422295996453680, --0.967409636380763940, -0.967396974346550140, -0.967384309893843830, -0.967371643022676750, -0.967358973733080550, -0.967346302025086980, -0.967333627898727570, -0.967320951354034180, --0.967308272391038340, -0.967295591009771800, -0.967282907210266330, -0.967270220992553660, -0.967257532356665340, -0.967244841302633220, -0.967232147830488940, -0.967219451940264370, --0.967206753631991160, -0.967194052905701150, -0.967181349761425890, -0.967168644199197240, -0.967155936219047050, -0.967143225821006870, -0.967130513005108880, -0.967117797771384400, --0.967105080119865510, -0.967092360050583850, -0.967079637563571400, -0.967066912658859800, -0.967054185336480910, -0.967041455596466590, -0.967028723438848600, -0.967015988863658800, --0.967003251870929060, -0.966990512460691230, -0.966977770632977070, -0.966965026387818450, -0.966952279725247330, -0.966939530645295480, -0.966926779147994740, -0.966914025233377110, --0.966901268901474430, -0.966888510152318580, -0.966875748985941420, -0.966862985402374920, -0.966850219401650950, -0.966837450983801470, -0.966824680148858250, -0.966811906896853480, --0.966799131227818800, -0.966786353141786400, -0.966773572638788050, -0.966760789718855820, -0.966748004382021580, -0.966735216628317300, -0.966722426457775060, -0.966709633870426740, --0.966696838866304200, -0.966684041445439730, -0.966671241607865110, -0.966658439353612400, -0.966645634682713580, -0.966632827595200640, -0.966620018091105650, -0.966607206170460590, --0.966594391833297540, -0.966581575079648480, -0.966568755909545610, -0.966555934323020670, -0.966543110320105980, -0.966530283900833510, -0.966517455065235340, -0.966504623813343570, --0.966491790145190270, -0.966478954060807420, -0.966466115560227210, -0.966453274643481630, -0.966440431310602980, -0.966427585561623110, -0.966414737396574460, -0.966401886815488780, --0.966389033818398580, -0.966376178405335630, -0.966363320576332230, -0.966350460331420690, -0.966337597670632880, -0.966324732594001090, -0.966311865101557420, -0.966298995193334180, --0.966286122869363440, -0.966273248129677410, -0.966260370974308170, -0.966247491403288140, -0.966234609416649180, -0.966221725014423940, -0.966208838196644160, -0.966195948963342490, --0.966183057314550790, -0.966170163250301580, -0.966157266770626850, -0.966144367875559020, -0.966131466565130160, -0.966118562839372810, -0.966105656698318940, -0.966092748142000860, --0.966079837170451090, -0.966066923783701510, -0.966054007981784870, -0.966041089764733020, -0.966028169132578500, -0.966015246085353610, -0.966002320623090550, -0.965989392745821740, --0.965976462453579380, -0.965963529746395880, -0.965950594624303660, -0.965937657087334810, -0.965924717135521860, -0.965911774768897110, -0.965898829987492990, -0.965885882791341800, --0.965872933180475850, -0.965859981154927550, -0.965847026714729330, -0.965834069859913490, -0.965821110590512570, -0.965808148906558860, -0.965795184808084680, -0.965782218295122670, --0.965769249367705030, -0.965756278025864280, -0.965743304269632840, -0.965730328099043130, -0.965717349514127580, -0.965704368514918700, -0.965691385101448920, -0.965678399273750650, --0.965665411031856320, -0.965652420375798570, -0.965639427305609700, -0.965626431821322240, -0.965613433922968720, -0.965600433610581680, -0.965587430884193520, -0.965574425743836780, --0.965561418189544000, -0.965548408221347580, -0.965535395839280270, -0.965522381043374400, -0.965509363833662590, -0.965496344210177380, -0.965483322172951300, -0.965470297722016870, --0.965457270857406740, -0.965444241579153430, -0.965431209887289590, -0.965418175781847630, -0.965405139262860200, -0.965392100330359940, -0.965379058984379590, -0.965366015224951360, --0.965352969052108320, -0.965339920465882680, -0.965326869466307300, -0.965313816053414710, -0.965300760227237650, -0.965287701987808670, -0.965274641335160390, -0.965261578269325570, --0.965248512790336740, -0.965235444898226660, -0.965222374593027950, -0.965209301874773380, -0.965196226743495480, -0.965183149199227100, -0.965170069242000770, -0.965156986871849250, --0.965143902088805290, -0.965130814892901650, -0.965117725284170840, -0.965104633262645840, -0.965091538828359070, -0.965078441981343630, -0.965065342721632020, -0.965052241049257020, --0.965039136964251590, -0.965026030466648140, -0.965012921556479660, -0.964999810233778900, -0.964986696498578600, -0.964973580350911520, -0.964960461790810630, -0.964947340818308460, --0.964934217433437990, -0.964921091636231850, -0.964907963426723140, -0.964894832804944480, -0.964881699770928750, -0.964868564324708690, -0.964855426466317280, -0.964842286195787270, --0.964829143513151630, -0.964815998418443010, -0.964802850911694490, -0.964789700992938810, -0.964776548662208850, -0.964763393919537580, -0.964750236764957750, -0.964737077198502440, --0.964723915220204290, -0.964710750830096500, -0.964697584028211710, -0.964684414814583110, -0.964671243189243350, -0.964658069152225520, -0.964644892703562460, -0.964631713843287280, --0.964618532571432710, -0.964605348888031950, -0.964592162793117660, -0.964578974286723010, -0.964565783368880990, -0.964552590039624460, -0.964539394298986390, -0.964526196146999970, --0.964512995583697960, -0.964499792609113450, -0.964486587223279510, -0.964473379426229130, -0.964460169217995270, -0.964446956598611020, -0.964433741568109350, -0.964420524126523240, --0.964407304273885990, -0.964394082010230360, -0.964380857335589540, -0.964367630249996610, -0.964354400753484660, -0.964341168846086560, -0.964327934527835720, -0.964314697798764890, --0.964301458658907370, -0.964288217108296150, -0.964274973146964530, -0.964261726774945260, -0.964248477992271870, -0.964235226798977220, -0.964221973195094510, -0.964208717180656820, --0.964195458755697340, -0.964182197920249280, -0.964168934674345720, -0.964155669018019750, -0.964142400951304660, -0.964129130474233540, -0.964115857586839600, -0.964102582289156130, --0.964089304581216110, -0.964076024463052850, -0.964062741934699430, -0.964049456996189270, -0.964036169647555450, -0.964022879888831170, -0.964009587720049630, -0.963996293141244240, --0.963982996152448090, -0.963969696753694370, -0.963956394945016500, -0.963943090726447680, -0.963929784098021100, -0.963916475059769960, -0.963903163611727790, -0.963889849753927550, --0.963876533486402790, -0.963863214809186690, -0.963849893722312560, -0.963836570225813590, -0.963823244319723330, -0.963809916004074840, -0.963796585278901660, -0.963783252144236990, --0.963769916600114240, -0.963756578646566610, -0.963743238283627510, -0.963729895511330370, -0.963716550329708490, -0.963703202738795280, -0.963689852738623950, -0.963676500329228140, --0.963663145510640920, -0.963649788282895940, -0.963636428646026500, -0.963623066600065910, -0.963609702145047710, -0.963596335281005300, -0.963582966007972000, -0.963569594325981220, --0.963556220235066490, -0.963542843735261330, -0.963529464826598850, -0.963516083509112890, -0.963502699782836650, -0.963489313647803660, -0.963475925104047450, -0.963462534151601320, --0.963449140790498930, -0.963435745020773560, -0.963422346842458980, -0.963408946255588480, -0.963395543260195720, -0.963382137856313880, -0.963368730043976940, -0.963355319823217980, --0.963341907194070870, -0.963328492156568910, -0.963315074710745730, -0.963301654856634770, -0.963288232594269880, -0.963274807923684250, -0.963261380844911640, -0.963247951357985580, --0.963234519462939700, -0.963221085159807420, -0.963207648448622500, -0.963194209329418350, -0.963180767802228830, -0.963167323867087250, -0.963153877524027480, -0.963140428773082920, --0.963126977614287340, -0.963113524047674360, -0.963100068073277530, -0.963086609691130580, -0.963073148901266940, -0.963059685703720580, -0.963046220098525030, -0.963032752085713820, --0.963019281665320800, -0.963005808837379520, -0.962992333601923710, -0.962978855958987130, -0.962965375908603430, -0.962951893450806230, -0.962938408585629290, -0.962924921313106470, --0.962911431633271200, -0.962897939546157320, -0.962884445051798710, -0.962870948150228890, -0.962857448841481720, -0.962843947125590960, -0.962830443002590350, -0.962816936472513650, --0.962803427535394500, -0.962789916191266860, -0.962776402440164490, -0.962762886282121030, -0.962749367717170350, -0.962735846745346290, -0.962722323366682620, -0.962708797581213080, --0.962695269388971540, -0.962681738789991860, -0.962668205784307900, -0.962654670371953290, -0.962641132552962130, -0.962627592327368050, -0.962614049695205030, -0.962600504656506930, --0.962586957211307490, -0.962573407359640700, -0.962559855101540410, -0.962546300437040480, -0.962532743366174780, -0.962519183888977280, -0.962505622005481730, -0.962492057715722100, --0.962478491019732370, -0.962464921917546510, -0.962451350409198270, -0.962437776494721620, -0.962424200174150530, -0.962410621447518990, -0.962397040314860840, -0.962383456776210180, --0.962369870831600750, -0.962356282481066750, -0.962342691724642040, -0.962329098562360490, -0.962315502994256280, -0.962301905020363280, -0.962288304640715570, -0.962274701855347140, --0.962261096664291830, -0.962247489067583840, -0.962233879065257150, -0.962220266657345720, -0.962206651843883650, -0.962193034624904910, -0.962179415000443680, -0.962165792970533840, --0.962152168535209570, -0.962138541694504750, -0.962124912448453770, -0.962111280797090300, -0.962097646740448730, -0.962084010278563050, -0.962070371411467340, -0.962056730139195790, --0.962043086461782270, -0.962029440379261080, -0.962015791891666310, -0.962002140999032030, -0.961988487701392450, -0.961974831998781640, -0.961961173891233700, -0.961947513378782930, --0.961933850461463290, -0.961920185139308990, -0.961906517412354330, -0.961892847280633290, -0.961879174744180170, -0.961865499803029160, -0.961851822457214340, -0.961838142706769930, --0.961824460551730210, -0.961810775992129270, -0.961797089028001540, -0.961783399659380980, -0.961769707886302010, -0.961756013708798600, -0.961742317126905280, -0.961728618140656130, --0.961714916750085580, -0.961701212955227590, -0.961687506756116580, -0.961673798152786750, -0.961660087145272510, -0.961646373733608060, -0.961632657917827700, -0.961618939697965640, --0.961605219074056270, -0.961591496046133810, -0.961577770614232550, -0.961564042778386920, -0.961550312538631210, -0.961536579894999740, -0.961522844847526810, -0.961509107396246730, --0.961495367541193910, -0.961481625282402660, -0.961467880619907290, -0.961454133553742320, -0.961440384083941950, -0.961426632210540700, -0.961412877933572770, -0.961399121253072700, --0.961385362169074780, -0.961371600681613540, -0.961357836790723290, -0.961344070496438440, -0.961330301798793310, -0.961316530697822520, -0.961302757193560400, -0.961288981286041340, --0.961275202975299890, -0.961261422261370350, -0.961247639144287350, -0.961233853624085200, -0.961220065700798430, -0.961206275374461460, -0.961192482645108930, -0.961178687512775020, --0.961164889977494500, -0.961151090039301660, -0.961137287698231260, -0.961123482954317490, -0.961109675807595100, -0.961095866258098400, -0.961082054305862240, -0.961068239950920720, --0.961054423193308800, -0.961040604033060690, -0.961026782470211120, -0.961012958504794510, -0.960999132136845620, -0.960985303366398870, -0.960971472193488770, -0.960957638618150200, --0.960943802640417340, -0.960929964260325060, -0.960916123477907780, -0.960902280293200350, -0.960888434706237080, -0.960874586717052840, -0.960860736325682030, -0.960846883532159410, --0.960833028336519620, -0.960819170738797190, -0.960805310739026860, -0.960791448337243280, -0.960777583533481080, -0.960763716327774910, -0.960749846720159400, -0.960735974710669400, --0.960722100299339350, -0.960708223486203990, -0.960694344271298300, -0.960680462654656560, -0.960666578636313770, -0.960652692216304450, -0.960638803394663450, -0.960624912171425430, --0.960611018546625120, -0.960597122520297160, -0.960583224092476540, -0.960569323263197880, -0.960555420032495830, -0.960541514400405250, -0.960527606366960880, -0.960513695932197490, --0.960499783096149920, -0.960485867858852820, -0.960471950220341150, -0.960458030180649460, -0.960444107739812810, -0.960430182897865860, -0.960416255654843450, -0.960402326010780350, --0.960388393965711520, -0.960374459519671710, -0.960360522672695670, -0.960346583424818380, -0.960332641776074580, -0.960318697726499250, -0.960304751276127020, -0.960290802424993100, --0.960276851173132110, -0.960262897520579030, -0.960248941467368610, -0.960234983013535940, -0.960221022159115760, -0.960207058904143040, -0.960193093248652540, -0.960179125192679560, --0.960165154736258520, -0.960151181879424720, -0.960137206622213020, -0.960123228964658180, -0.960109248906795390, -0.960095266448659390, -0.960081281590285270, -0.960067294331707900, --0.960053304672962350, -0.960039312614083480, -0.960025318155106390, -0.960011321296065920, -0.959997322036997280, -0.959983320377935210, -0.959969316318914910, -0.959955309859971240, --0.959941301001139390, -0.959927289742454230, -0.959913276083950830, -0.959899260025664280, -0.959885241567629670, -0.959871220709881840, -0.959857197452455900, -0.959843171795387030, --0.959829143738710310, -0.959815113282460720, -0.959801080426673230, -0.959787045171383140, -0.959773007516625310, -0.959758967462435160, -0.959744925008847450, -0.959730880155897470, --0.959716832903620310, -0.959702783252051050, -0.959688731201224780, -0.959674676751176790, -0.959660619901941960, -0.959646560653555800, -0.959632499006052960, -0.959618434959469080, --0.959604368513839010, -0.959590299669198070, -0.959576228425581430, -0.959562154783024090, -0.959548078741561560, -0.959534000301228600, -0.959519919462060830, -0.959505836224093130, --0.959491750587360910, -0.959477662551899260, -0.959463572117743580, -0.959449479284928850, -0.959435384053490490, -0.959421286423463580, -0.959407186394883540, -0.959393083967785440, --0.959378979142204710, -0.959364871918176540, -0.959350762295736240, -0.959336650274918880, -0.959322535855759990, -0.959308419038294780, -0.959294299822558430, -0.959280178208586460, --0.959266054196413860, -0.959251927786076260, -0.959237798977608860, -0.959223667771046950, -0.959209534166425850, -0.959195398163780850, -0.959181259763147390, -0.959167118964560860, --0.959152975768056470, -0.959138830173669740, -0.959124682181435760, -0.959110531791390160, -0.959096379003568260, -0.959082223818005450, -0.959068066234736950, -0.959053906253798380, --0.959039743875224950, -0.959025579099052280, -0.959011411925315580, -0.958997242354050370, -0.958983070385292070, -0.958968896019076090, -0.958954719255437850, -0.958940540094412870, --0.958926358536036470, -0.958912174580344170, -0.958897988227371600, -0.958883799477153850, -0.958869608329726670, -0.958855414785125480, -0.958841218843385800, -0.958827020504543050, --0.958812819768632750, -0.958798616635690330, -0.958784411105751410, -0.958770203178851420, -0.958755992855026110, -0.958741780134310550, -0.958727565016740720, -0.958713347502351930, --0.958699127591179700, -0.958684905283259780, -0.958670680578627590, -0.958656453477318650, -0.958642223979368490, -0.958627992084812970, -0.958613757793687290, -0.958599521106027310, --0.958585282021868430, -0.958571040541246530, -0.958556796664196800, -0.958542550390755310, -0.958528301720957270, -0.958514050654838520, -0.958499797192434720, -0.958485541333781390, --0.958471283078914160, -0.958457022427868790, -0.958442759380680690, -0.958428493937385830, -0.958414226098019740, -0.958399955862618060, -0.958385683231216530, -0.958371408203850810, --0.958357130780556510, -0.958342850961369400, -0.958328568746325220, -0.958314284135459490, -0.958299997128808200, -0.958285707726406750, -0.958271415928291130, -0.958257121734496950, --0.958242825145059980, -0.958228526160015970, -0.958214224779400660, -0.958199921003249690, -0.958185614831599030, -0.958171306264484210, -0.958156995301941210, -0.958142681944005760, --0.958128366190713510, -0.958114048042100430, -0.958099727498202160, -0.958085404559054670, -0.958071079224693480, -0.958056751495154790, -0.958042421370474130, -0.958028088850687460, --0.958013753935830550, -0.957999416625939240, -0.957985076921049390, -0.957970734821196880, -0.957956390326417440, -0.957942043436747160, -0.957927694152221680, -0.957913342472876960, --0.957898988398748870, -0.957884631929873390, -0.957870273066286250, -0.957855911808023430, -0.957841548155121010, -0.957827182107614530, -0.957812813665540160, -0.957798442828933670, --0.957784069597831240, -0.957769693972268520, -0.957755315952281580, -0.957740935537906290, -0.957726552729178840, -0.957712167526134860, -0.957697779928810560, -0.957683389937241670, --0.957668997551464400, -0.957654602771514600, -0.957640205597428350, -0.957625806029241520, -0.957611404066990300, -0.957596999710710440, -0.957582592960438130, -0.957568183816209340, --0.957553772278060040, -0.957539358346026330, -0.957524942020144270, -0.957510523300449830, -0.957496102186979000, -0.957481678679768080, -0.957467252778852810, -0.957452824484269490, --0.957438393796054110, -0.957423960714242740, -0.957409525238871460, -0.957395087369976470, -0.957380647107593630, -0.957366204451759240, -0.957351759402509270, -0.957337311959879920, --0.957322862123907270, -0.957308409894627510, -0.957293955272076720, -0.957279498256290990, -0.957265038847306630, -0.957250577045159590, -0.957236112849886190, -0.957221646261522400, --0.957207177280104520, -0.957192705905668740, -0.957178232138251150, -0.957163755977888050, -0.957149277424615530, -0.957134796478469770, -0.957120313139487090, -0.957105827407703560, --0.957091339283155480, -0.957076848765879060, -0.957062355855910600, -0.957047860553286060, -0.957033362858042080, -0.957018862770214530, -0.957004360289839930, -0.956989855416954360, --0.956975348151594130, -0.956960838493795650, -0.956946326443594900, -0.956931812001028500, -0.956917295166132440, -0.956902775938943240, -0.956888254319497090, -0.956873730307830290, --0.956859203903979160, -0.956844675107980100, -0.956830143919869200, -0.956815610339683100, -0.956801074367457760, -0.956786536003229940, -0.956771995247035710, -0.956757452098911500, --0.956742906558893600, -0.956728358627018550, -0.956713808303322530, -0.956699255587841970, -0.956684700480613270, -0.956670142981672860, -0.956655583091057030, -0.956641020808802310, --0.956626456134945010, -0.956611889069521550, -0.956597319612568440, -0.956582747764122000, -0.956568173524218750, -0.956553596892894880, -0.956539017870187250, -0.956524436456131940, --0.956509852650765600, -0.956495266454124530, -0.956480677866245350, -0.956466086887164500, -0.956451493516918380, -0.956436897755543520, -0.956422299603076560, -0.956407699059553700, --0.956393096125011550, -0.956378490799486890, -0.956363883083015790, -0.956349272975635100, -0.956334660477381140, -0.956320045588290650, -0.956305428308399930, -0.956290808637745740, --0.956276186576364370, -0.956261562124292700, -0.956246935281567010, -0.956232306048224070, -0.956217674424300280, -0.956203040409832390, -0.956188404004856830, -0.956173765209410330, --0.956159124023529320, -0.956144480447250640, -0.956129834480610620, -0.956115186123646100, -0.956100535376393610, -0.956085882238889680, -0.956071226711171170, -0.956056568793274500, --0.956041908485236510, -0.956027245787093640, -0.956012580698882840, -0.955997913220640430, -0.955983243352403260, -0.955968571094207960, -0.955953896446091300, -0.955939219408089790, --0.955924539980240410, -0.955909858162579450, -0.955895173955144010, -0.955880487357970600, -0.955865798371095980, -0.955851106994556890, -0.955836413228389970, -0.955821717072631970, --0.955807018527319750, -0.955792317592490060, -0.955777614268179420, -0.955762908554424920, -0.955748200451262960, -0.955733489958730640, -0.955718777076864590, -0.955704061805701550, --0.955689344145278400, -0.955674624095631860, -0.955659901656798700, -0.955645176828815890, -0.955630449611720060, -0.955615720005548170, -0.955600988010336880, -0.955586253626123260, --0.955571516852943840, -0.955556777690835800, -0.955542036139835680, -0.955527292199980560, -0.955512545871307180, -0.955497797153852410, -0.955483046047653220, -0.955468292552746350, --0.955453536669168770, -0.955438778396957340, -0.955424017736148930, -0.955409254686780510, -0.955394489248889030, -0.955379721422511260, -0.955364951207684170, -0.955350178604444710, --0.955335403612829760, -0.955320626232876390, -0.955305846464621470, -0.955291064308101840, -0.955276279763354610, -0.955261492830416610, -0.955246703509324950, -0.955231911800116460, --0.955217117702828240, -0.955202321217497260, -0.955187522344160490, -0.955172721082854890, -0.955157917433617440, -0.955143111396485220, -0.955128302971495200, -0.955113492158684460, --0.955098678958089970, -0.955083863369748820, -0.955069045393697970, -0.955054225029974500, -0.955039402278615500, -0.955024577139658050, -0.955009749613139000, -0.954994919699095780, --0.954980087397565120, -0.954965252708584230, -0.954950415632190300, -0.954935576168420290, -0.954920734317311280, -0.954905890078900480, -0.954891043453224950, -0.954876194440321790, --0.954861343040228290, -0.954846489252981320, -0.954831633078618070, -0.954816774517175840, -0.954801913568691600, -0.954787050233202650, -0.954772184510746080, -0.954757316401358970, --0.954742445905078620, -0.954727573021942110, -0.954712697751986750, -0.954697820095249510, -0.954682940051767790, -0.954668057621578800, -0.954653172804719620, -0.954638285601227430, --0.954623396011139550, -0.954608504034493270, -0.954593609671325670, -0.954578712921674070, -0.954563813785575640, -0.954548912263067710, -0.954534008354187450, -0.954519102058972280, --0.954504193377459290, -0.954489282309685770, -0.954474368855689040, -0.954459453015506500, -0.954444534789175240, -0.954429614176732780, -0.954414691178216090, -0.954399765793662810, --0.954384838023110030, -0.954369907866595260, -0.954354975324155590, -0.954340040395828540, -0.954325103081651420, -0.954310163381661410, -0.954295221295896170, -0.954280276824392760, --0.954265329967188710, -0.954250380724321330, -0.954235429095828040, -0.954220475081746120, -0.954205518682113010, -0.954190559896966110, -0.954175598726342940, -0.954160635170280600, --0.954145669228816720, -0.954130700901988700, -0.954115730189833870, -0.954100757092389730, -0.954085781609693820, -0.954070803741783320, -0.954055823488695890, -0.954040840850468810, --0.954025855827139610, -0.954010868418745830, -0.953995878625324870, -0.953980886446914260, -0.953965891883551410, -0.953950894935273850, -0.953935895602119000, -0.953920893884124490, --0.953905889781327620, -0.953890883293766150, -0.953875874421477370, -0.953860863164499030, -0.953845849522868440, -0.953830833496623230, -0.953815815085800930, -0.953800794290439180, --0.953785771110575390, -0.953770745546247190, -0.953755717597492000, -0.953740687264347690, -0.953725654546851540, -0.953710619445041320, -0.953695581958954540, -0.953680542088628850, --0.953665499834101760, -0.953650455195410810, -0.953635408172593960, -0.953620358765688400, -0.953605306974732000, -0.953590252799762280, -0.953575196240817100, -0.953560137297933760, --0.953545075971150120, -0.953530012260503820, -0.953514946166032500, -0.953499877687773780, -0.953484806825765420, -0.953469733580044940, -0.953454657950650210, -0.953439579937618740, --0.953424499540988510, -0.953409416760796820, -0.953394331597081650, -0.953379244049880730, -0.953364154119231590, -0.953349061805172200, -0.953333967107740100, -0.953318870026973020, --0.953303770562908830, -0.953288668715585260, -0.953273564485039860, -0.953258457871310690, -0.953243348874435290, -0.953228237494451620, -0.953213123731397220, -0.953198007585310150, --0.953182889056227940, -0.953167768144188690, -0.953152644849229790, -0.953137519171389450, -0.953122391110705180, -0.953107260667214960, -0.953092127840956760, -0.953076992631967990, --0.953061855040286950, -0.953046715065951180, -0.953031572708998630, -0.953016427969467060, -0.953001280847394550, -0.952986131342818730, -0.952970979455777690, -0.952955825186309170, --0.952940668534451140, -0.952925509500241350, -0.952910348083717770, -0.952895184284918370, -0.952880018103881010, -0.952864849540643540, -0.952849678595244050, -0.952834505267720290, --0.952819329558110330, -0.952804151466452030, -0.952788970992783260, -0.952773788137142200, -0.952758602899566490, -0.952743415280094430, -0.952728225278763770, -0.952713032895612600, --0.952697838130678760, -0.952682640984000460, -0.952667441455615440, -0.952652239545561890, -0.952637035253877660, -0.952621828580600960, -0.952606619525769640, -0.952591408089421780, --0.952576194271595340, -0.952560978072328420, -0.952545759491659090, -0.952530538529625330, -0.952515315186265200, -0.952500089461616790, -0.952484861355718300, -0.952469630868607480, --0.952454398000322720, -0.952439162750901900, -0.952423925120383210, -0.952408685108804610, -0.952393442716204410, -0.952378197942620460, -0.952362950788091190, -0.952347701252654440, --0.952332449336348530, -0.952317195039211310, -0.952301938361281300, -0.952286679302596360, -0.952271417863194690, -0.952256154043114480, -0.952240887842394020, -0.952225619261071190, --0.952210348299184380, -0.952195074956771690, -0.952179799233871300, -0.952164521130521410, -0.952149240646760210, -0.952133957782625990, -0.952118672538156740, -0.952103384913390860, --0.952088094908366540, -0.952072802523121990, -0.952057507757695380, -0.952042210612125130, -0.952026911086449210, -0.952011609180706150, -0.951996304894933920, -0.951980998229171040, --0.951965689183455590, -0.951950377757825980, -0.951935063952320410, -0.951919747766977190, -0.951904429201834600, -0.951889108256930850, -0.951873784932304460, -0.951858459227993500, --0.951843131144036400, -0.951827800680471460, -0.951812467837337190, -0.951797132614671580, -0.951781795012513250, -0.951766455030900290, -0.951751112669871340, -0.951735767929464460, --0.951720420809718300, -0.951705071310671060, -0.951689719432361140, -0.951674365174826840, -0.951659008538106700, -0.951643649522239010, -0.951628288127262190, -0.951612924353214650, --0.951597558200134920, -0.951582189668061070, -0.951566818757031860, -0.951551445467085700, -0.951536069798260780, -0.951520691750595840, -0.951505311324128970, -0.951489928518899020, --0.951474543334944080, -0.951459155772302890, -0.951443765831013750, -0.951428373511115310, -0.951412978812645750, -0.951397581735643930, -0.951382182280148040, -0.951366780446196820, --0.951351376233828480, -0.951335969643081870, -0.951320560673995170, -0.951305149326607150, -0.951289735600956200, -0.951274319497081080, -0.951258901015019980, -0.951243480154811640, --0.951228056916494700, -0.951212631300107580, -0.951197203305688910, -0.951181772933277100, -0.951166340182911020, -0.951150905054628960, -0.951135467548469780, -0.951120027664471790, --0.951104585402673840, -0.951089140763114350, -0.951073693745832060, -0.951058244350865500, -0.951042792578253420, -0.951027338428034220, -0.951011881900246770, -0.950996422994929590, --0.950980961712121320, -0.950965498051860700, -0.950950032014186260, -0.950934563599136860, -0.950919092806750910, -0.950903619637067380, -0.950888144090124680, -0.950872666165961670, --0.950857185864616980, -0.950841703186129370, -0.950826218130537360, -0.950810730697880020, -0.950795240888195670, -0.950779748701523380, -0.950764254137901550, -0.950748757197369180, --0.950733257879964880, -0.950717756185727510, -0.950702252114695720, -0.950686745666908250, -0.950671236842403950, -0.950655725641221580, -0.950640212063399880, -0.950624696108977600, --0.950609177777993590, -0.950593657070486710, -0.950578133986495600, -0.950562608526059230, -0.950547080689216340, -0.950531550476005680, -0.950516017886466220, -0.950500482920636600, --0.950484945578555900, -0.950469405860262740, -0.950453863765796210, -0.950438319295194840, -0.950422772448497820, -0.950407223225743780, -0.950391671626971690, -0.950376117652220410, --0.950360561301528910, -0.950345002574935930, -0.950329441472480440, -0.950313877994201420, -0.950298312140137710, -0.950282743910328190, -0.950267173304811810, -0.950251600323627540, --0.950236024966814140, -0.950220447234410790, -0.950204867126456240, -0.950189284642989570, -0.950173699784049750, -0.950158112549675640, -0.950142522939906200, -0.950126930954780510, --0.950111336594337440, -0.950095739858616060, -0.950080140747655340, -0.950064539261494260, -0.950048935400171770, -0.950033329163727070, -0.950017720552198910, -0.950002109565626470, --0.949986496204048850, -0.949970880467505000, -0.949955262356033890, -0.949939641869674610, -0.949924019008466240, -0.949908393772447850, -0.949892766161658410, -0.949877136176137120, --0.949861503815922940, -0.949845869081055060, -0.949830231971572460, -0.949814592487514320, -0.949798950628919720, -0.949783306395827640, -0.949767659788277370, -0.949752010806307890, --0.949736359449958490, -0.949720705719268140, -0.949705049614275930, -0.949689391135021270, -0.949673730281543000, -0.949658067053880450, -0.949642401452072680, -0.949626733476159000, --0.949611063126178490, -0.949595390402170230, -0.949579715304173510, -0.949564037832227650, -0.949548357986371490, -0.949532675766644570, -0.949516991173085860, -0.949501304205734860, --0.949485614864630350, -0.949469923149812050, -0.949454229061318710, -0.949438532599189980, -0.949422833763464810, -0.949407132554182630, -0.949391428971382510, -0.949375723015103870, --0.949360014685386000, -0.949344303982267990, -0.949328590905789360, -0.949312875455989080, -0.949297157632906670, -0.949281437436581440, -0.949265714867052580, -0.949249989924359380, --0.949234262608541270, -0.949218532919637430, -0.949202800857687380, -0.949187066422730210, -0.949171329614805440, -0.949155590433952260, -0.949139848880210190, -0.949124104953618430, --0.949108358654216500, -0.949092609982043590, -0.949076858937139220, -0.949061105519542700, -0.949045349729293330, -0.949029591566430740, -0.949013831030994020, -0.948998068123022790, --0.948982302842556360, -0.948966535189634250, -0.948950765164295770, -0.948934992766580330, -0.948919217996527450, -0.948903440854176550, -0.948887661339566920, -0.948871879452738320, --0.948856095193729930, -0.948840308562581280, -0.948824519559331890, -0.948808728184021180, -0.948792934436688660, -0.948777138317373870, -0.948761339826116100, -0.948745538962954990, --0.948729735727930180, -0.948713930121080850, -0.948698122142446860, -0.948682311792067520, -0.948666499069982350, -0.948650683976230980, -0.948634866510852940, -0.948619046673887630, --0.948603224465374820, -0.948587399885353790, -0.948571572933864400, -0.948555743610945970, -0.948539911916638330, -0.948524077850980700, -0.948508241414013130, -0.948492402605774720, --0.948476561426305430, -0.948460717875644680, -0.948444871953832200, -0.948429023660907530, -0.948413172996910190, -0.948397319961880040, -0.948381464555856590, -0.948365606778879490, --0.948349746630988260, -0.948333884112222750, -0.948318019222622490, -0.948302151962227340, -0.948286282331076590, -0.948270410329210220, -0.948254535956667870, -0.948238659213489150, --0.948222780099713720, -0.948206898615381430, -0.948191014760531800, -0.948175128535204800, -0.948159239939439850, -0.948143348973276790, -0.948127455636755380, -0.948111559929915360, --0.948095661852796370, -0.948079761405438260, -0.948063858587880780, -0.948047953400163680, -0.948032045842326700, -0.948016135914409470, -0.948000223616452090, -0.947984308948493950, --0.947968391910575250, -0.947952472502735400, -0.947936550725014480, -0.947920626577452020, -0.947904700060088200, -0.947888771172962440, -0.947872839916114930, -0.947856906289585190, --0.947840970293413300, -0.947825031927638890, -0.947809091192301940, -0.947793148087442190, -0.947777202613099610, -0.947761254769314170, -0.947745304556125380, -0.947729351973573440, --0.947713397021698100, -0.947697439700539320, -0.947681480010136860, -0.947665517950530780, -0.947649553521760830, -0.947633586723866990, -0.947617617556889220, -0.947601646020867490, --0.947585672115841550, -0.947569695841851470, -0.947553717198937000, -0.947537736187138440, -0.947521752806495420, -0.947505767057048140, -0.947489778938836240, -0.947473788451900110, --0.947457795596279410, -0.947441800372014090, -0.947425802779144450, -0.947409802817710260, -0.947393800487751570, -0.947377795789308360, -0.947361788722420720, -0.947345779287128490, --0.947329767483471970, -0.947313753311490920, -0.947297736771225530, -0.947281717862715760, -0.947265696586001680, -0.947249672941123390, -0.947233646928120950, -0.947217618547034350, --0.947201587797903750, -0.947185554680769150, -0.947169519195670720, -0.947153481342648320, -0.947137441121742360, -0.947121398532992820, -0.947105353576439660, -0.947089306252123290, --0.947073256560083450, -0.947057204500360680, -0.947041150072994720, -0.947025093278025980, -0.947009034115494530, -0.946992972585440460, -0.946976908687903850, -0.946960842422925110, --0.946944773790544200, -0.946928702790801440, -0.946912629423736880, -0.946896553689390740, -0.946880475587803190, -0.946864395119014430, -0.946848312283064760, -0.946832227079994260, --0.946816139509843220, -0.946800049572651740, -0.946783957268460320, -0.946767862597308830, -0.946751765559237790, -0.946735666154287280, -0.946719564382497600, -0.946703460243909060, --0.946687353738561830, -0.946671244866496230, -0.946655133627752550, -0.946639020022370990, -0.946622904050391960, -0.946606785711855530, -0.946590665006802220, -0.946574541935272240, --0.946558416497305990, -0.946542288692943550, -0.946526158522225550, -0.946510025985191960, -0.946493891081883420, -0.946477753812340120, -0.946461614176602460, -0.946445472174710760, --0.946429327806705410, -0.946413181072626730, -0.946397031972515010, -0.946380880506410780, -0.946364726674354340, -0.946348570476386100, -0.946332411912546470, -0.946316250982875750, --0.946300087687414360, -0.946283922026202930, -0.946267753999281540, -0.946251583606690820, -0.946235410848471070, -0.946219235724662930, -0.946203058235306590, -0.946186878380442580, --0.946170696160111400, -0.946154511574353490, -0.946138324623209350, -0.946122135306719400, -0.946105943624924060, -0.946089749577863850, -0.946073553165579400, -0.946057354388110890, --0.946041153245499090, -0.946024949737784390, -0.946008743865007330, -0.945992535627208310, -0.945976325024428080, -0.945960112056706940, -0.945943896724085630, -0.945927679026604570, --0.945911458964304290, -0.945895236537225290, -0.945879011745408230, -0.945862784588893610, -0.945846555067722080, -0.945830323181934160, -0.945814088931570480, -0.945797852316671570, --0.945781613337277950, -0.945765371993430360, -0.945749128285169330, -0.945732882212535490, -0.945716633775569360, -0.945700382974311690, -0.945684129808803120, -0.945667874279084160, --0.945651616385195570, -0.945635356127177970, -0.945619093505071890, -0.945602828518918080, -0.945586561168757280, -0.945570291454630010, -0.945554019376577020, -0.945537744934639050, --0.945521468128856620, -0.945505188959270490, -0.945488907425921510, -0.945472623528850200, -0.945456337268097300, -0.945440048643703570, -0.945423757655709850, -0.945407464304156560, --0.945391168589084670, -0.945374870510534930, -0.945358570068547950, -0.945342267263164500, -0.945325962094425540, -0.945309654562371480, -0.945293344667043400, -0.945277032408481930, --0.945260717786727930, -0.945244400801822040, -0.945228081453805210, -0.945211759742718090, -0.945195435668601760, -0.945179109231496620, -0.945162780431443860, -0.945146449268484120, --0.945130115742658150, -0.945113779854007020, -0.945097441602571360, -0.945081100988392260, -0.945064758011510240, -0.945048412671966380, -0.945032064969801410, -0.945015714905056430, --0.944999362477772050, -0.944983007687989370, -0.944966650535749020, -0.944950291021092180, -0.944933929144059490, -0.944917564904692140, -0.944901198303030650, -0.944884829339116330, --0.944868458012989910, -0.944852084324692250, -0.944835708274264550, -0.944819329861747440, -0.944802949087182100, -0.944786565950609390, -0.944770180452070170, -0.944753792591605520, --0.944737402369256520, -0.944721009785063900, -0.944704614839068760, -0.944688217531312050, -0.944671817861834960, -0.944655415830678140, -0.944639011437882870, -0.944622604683490020, --0.944606195567540770, -0.944589784090075880, -0.944573370251136630, -0.944556954050763900, -0.944540535488998860, -0.944524114565882480, -0.944507691281455730, -0.944491265635759800, --0.944474837628835660, -0.944458407260724500, -0.944441974531467280, -0.944425539441105190, -0.944409101989679090, -0.944392662177230390, -0.944376220003799950, -0.944359775469429060, --0.944343328574158590, -0.944326879318029940, -0.944310427701083980, -0.944293973723361990, -0.944277517384905060, -0.944261058685754380, -0.944244597625951030, -0.944228134205536200, --0.944211668424551060, -0.944195200283036610, -0.944178729781034340, -0.944162256918585130, -0.944145781695730270, -0.944129304112511060, -0.944112824168968470, -0.944096341865143910, --0.944079857201078450, -0.944063370176813410, -0.944046880792389850, -0.944030389047849080, -0.944013894943232510, -0.943997398478581000, -0.943980899653936170, -0.943964398469338880, --0.943947894924830780, -0.943931389020452930, -0.943914880756246520, -0.943898370132252970, -0.943881857148513470, -0.943865341805069310, -0.943848824101961800, -0.943832304039232240, --0.943815781616921920, -0.943799256835072150, -0.943782729693724230, -0.943766200192919570, -0.943749668332699240, -0.943733134113104890, -0.943716597534177580, -0.943700058595958960, --0.943683517298489980, -0.943666973641812400, -0.943650427625967180, -0.943633879250996070, -0.943617328516940250, -0.943600775423841020, -0.943584219971739910, -0.943567662160678220, --0.943551101990697360, -0.943534539461838740, -0.943517974574143880, -0.943501407327653970, -0.943484837722410540, -0.943468265758455100, -0.943451691435828970, -0.943435114754573530, --0.943418535714730440, -0.943401954316340880, -0.943385370559446490, -0.943368784444088670, -0.943352195970308950, -0.943335605138148630, -0.943319011947649440, -0.943302416398852590, --0.943285818491799710, -0.943269218226532310, -0.943252615603091930, -0.943236010621519960, -0.943219403281857940, -0.943202793584147380, -0.943186181528429920, -0.943169567114746980, --0.943152950343140060, -0.943136331213650920, -0.943119709726320750, -0.943103085881191520, -0.943086459678304400, -0.943069831117701260, -0.943053200199423400, -0.943036566923512680, --0.943019931290010490, -0.943003293298958490, -0.942986652950398190, -0.942970010244371330, -0.942953365180919430, -0.942936717760084140, -0.942920067981906970, -0.942903415846429670, --0.942886761353693870, -0.942870104503741090, -0.942853445296613080, -0.942836783732351470, -0.942820119810997890, -0.942803453532593980, -0.942786784897181600, -0.942770113904802140, --0.942753440555497370, -0.942736764849309020, -0.942720086786278830, -0.942703406366448230, -0.942686723589859280, -0.942670038456553510, -0.942653350966572660, -0.942636661119958360, --0.942619968916752480, -0.942603274356996530, -0.942586577440732600, -0.942569878168002080, -0.942553176538846960, -0.942536472553308860, -0.942519766211429520, -0.942503057513250810, --0.942486346458814460, -0.942469633048162340, -0.942452917281335960, -0.942436199158377400, -0.942419478679328290, -0.942402755844230500, -0.942386030653125870, -0.942369303106056160, --0.942352573203063090, -0.942335840944188650, -0.942319106329474690, -0.942302369358962830, -0.942285630032695170, -0.942268888350713320, -0.942252144313059260, -0.942235397919774950, --0.942218649170902030, -0.942201898066482580, -0.942185144606558330, -0.942168388791171150, -0.942151630620363110, -0.942134870094175960, -0.942118107212651660, -0.942101341975832060, --0.942084574383759140, -0.942067804436474750, -0.942051032134020860, -0.942034257476439320, -0.942017480463772320, -0.942000701096061380, -0.941983919373348910, -0.941967135295676440, --0.941950348863086370, -0.941933560075620240, -0.941916768933320330, -0.941899975436228390, -0.941883179584386500, -0.941866381377836740, -0.941849580816620960, -0.941832777900781350, --0.941815972630359650, -0.941799165005398060, -0.941782355025938540, -0.941765542692023280, -0.941748728003694020, -0.941731910960993070, -0.941715091563962160, -0.941698269812643710, --0.941681445707079460, -0.941664619247311600, -0.941647790433382200, -0.941630959265333360, -0.941614125743207130, -0.941597289867045610, -0.941580451636890750, -0.941563611052784850, --0.941546768114769890, -0.941529922822888050, -0.941513075177181300, -0.941496225177691940, -0.941479372824462040, -0.941462518117533680, -0.941445661056949050, -0.941428801642750220, --0.941411939874979400, -0.941395075753678760, -0.941378209278890490, -0.941361340450656560, -0.941344469269019380, -0.941327595734020920, -0.941310719845703580, -0.941293841604109450, --0.941276961009280710, -0.941260078061259440, -0.941243192760088050, -0.941226305105808740, -0.941209415098463680, -0.941192522738094950, -0.941175628024744970, -0.941158730958455920, --0.941141831539270000, -0.941124929767229610, -0.941108025642376830, -0.941091119164754080, -0.941074210334403420, -0.941057299151367270, -0.941040385615687810, -0.941023469727407580, --0.941006551486568420, -0.940989630893213080, -0.940972707947383520, -0.940955782649122390, -0.940938854998471630, -0.940921924995473780, -0.940904992640171020, -0.940888057932605990, --0.940871120872820650, -0.940854181460857640, -0.940837239696759030, -0.940820295580567350, -0.940803349112324990, -0.940786400292074170, -0.940769449119857490, -0.940752495595717050, --0.940735539719695480, -0.940718581491834960, -0.940701620912178130, -0.940684657980767060, -0.940667692697644500, -0.940650725062852630, -0.940633755076434100, -0.940616782738430970, --0.940599808048885990, -0.940582831007841460, -0.940565851615339900, -0.940548869871423610, -0.940531885776135220, -0.940514899329517150, -0.940497910531611800, -0.940480919382461590, --0.940463925882109140, -0.940446930030596980, -0.940429931827967300, -0.940412931274262950, -0.940395928369526240, -0.940378923113799670, -0.940361915507125780, -0.940344905549547190, --0.940327893241106220, -0.940310878581845590, -0.940293861571807720, -0.940276842211035360, -0.940259820499570690, -0.940242796437456560, -0.940225770024735400, -0.940208741261449820, --0.940191710147642470, -0.940174676683355750, -0.940157640868632290, -0.940140602703514850, -0.940123562188045820, -0.940106519322267960, -0.940089474106223790, -0.940072426539955820, --0.940055376623507020, -0.940038324356919590, -0.940021269740236360, -0.940004212773499990, -0.939987153456753100, -0.939970091790038320, -0.939953027773398290, -0.939935961406875740, --0.939918892690513320, -0.939901821624353540, -0.939884748208439260, -0.939867672442813110, -0.939850594327517830, -0.939833513862595950, -0.939816431048090430, -0.939799345884043790, --0.939782258370498670, -0.939765168507498030, -0.939748076295084390, -0.939730981733300720, -0.939713884822189430, -0.939696785561793480, -0.939679683952155510, -0.939662579993318480, --0.939645473685324810, -0.939628365028217560, -0.939611254022039380, -0.939594140666833110, -0.939577024962641390, -0.939559906909507300, -0.939542786507473250, -0.939525663756582310, --0.939508538656877220, -0.939491411208400740, -0.939474281411195710, -0.939457149265304990, -0.939440014770771550, -0.939422877927637900, -0.939405738735947130, -0.939388597195741970, --0.939371453307065400, -0.939354307069960040, -0.939337158484469080, -0.939320007550635160, -0.939302854268501240, -0.939285698638110070, -0.939268540659504820, -0.939251380332728150, --0.939234217657823000, -0.939217052634832350, -0.939199885263799050, -0.939182715544765960, -0.939165543477776250, -0.939148369062872580, -0.939131192300098010, -0.939114013189495390, --0.939096831731107810, -0.939079647924978110, -0.939062461771149270, -0.939045273269664360, -0.939028082420566230, -0.939010889223897970, -0.938993693679702310, -0.938976495788022560, --0.938959295548901560, -0.938942092962382290, -0.938924888028507710, -0.938907680747321120, -0.938890471118865140, -0.938873259143183090, -0.938856044820317810, -0.938838828150312500, --0.938821609133210000, -0.938804387769053620, -0.938787164057886090, -0.938769937999750840, -0.938752709594690590, -0.938735478842748660, -0.938718245743968010, -0.938701010298391810, --0.938683772506063050, -0.938666532367024800, -0.938649289881320240, -0.938632045048992450, -0.938614797870084620, -0.938597548344639710, -0.938580296472701030, -0.938563042254311530, --0.938545785689514410, -0.938528526778352860, -0.938511265520870050, -0.938494001917108970, -0.938476735967112900, -0.938459467670925030, -0.938442197028588550, -0.938424924040146440, --0.938407648705642080, -0.938390371025118690, -0.938373090998619210, -0.938355808626187170, -0.938338523907865430, -0.938321236843697500, -0.938303947433726470, -0.938286655677995630, --0.938269361576547940, -0.938252065129427050, -0.938234766336675910, -0.938217465198337930, -0.938200161714456190, -0.938182855885074110, -0.938165547710234860, -0.938148237189981750, --0.938130924324358070, -0.938113609113407130, -0.938096291557172000, -0.938078971655696310, -0.938061649409023040, -0.938044324817195680, -0.938026997880257670, -0.938009668598251970, --0.937992336971222200, -0.937975002999211550, -0.937957666682263440, -0.937940328020421150, -0.937922987013728000, -0.937905643662227400, -0.937888297965962740, -0.937870949924977330, --0.937853599539314460, -0.937836246809017670, -0.937818891734130240, -0.937801534314695480, -0.937784174550757130, -0.937766812442358160, -0.937749447989542180, -0.937732081192352520, --0.937714712050832790, -0.937697340565026180, -0.937679966734976220, -0.937662590560726540, -0.937645212042320100, -0.937627831179800860, -0.937610447973211910, -0.937593062422596880, --0.937575674527999170, -0.937558284289462310, -0.937540891707029700, -0.937523496780744870, -0.937506099510651340, -0.937488699896792620, -0.937471297939212020, -0.937453893637953170, --0.937436486993059590, -0.937419078004574910, -0.937401666672542430, -0.937384252997005900, -0.937366836978008600, -0.937349418615594290, -0.937331997909806370, -0.937314574860688480, --0.937297149468284240, -0.937279721732636960, -0.937262291653790490, -0.937244859231788240, -0.937227424466673950, -0.937209987358491040, -0.937192547907283120, -0.937175106113093850, --0.937157661975966840, -0.937140215495945620, -0.937122766673073930, -0.937105315507395290, -0.937087861998953440, -0.937070406147791800, -0.937052947953954220, -0.937035487417484210, --0.937018024538425530, -0.937000559316821800, -0.936983091752716660, -0.936965621846153840, -0.936948149597176870, -0.936930675005829610, -0.936913198072155560, -0.936895718796198600, --0.936878237178002340, -0.936860753217610530, -0.936843266915066700, -0.936825778270414800, -0.936808287283698470, -0.936790793954961340, -0.936773298284247270, -0.936755800271599990, --0.936738299917063140, -0.936720797220680690, -0.936703292182496040, -0.936685784802553380, -0.936668275080896010, -0.936650763017568110, -0.936633248612613320, -0.936615731866075270, --0.936598212777998040, -0.936580691348425140, -0.936563167577400660, -0.936545641464968210, -0.936528113011171670, -0.936510582216054770, -0.936493049079661470, -0.936475513602035510, --0.936457975783220880, -0.936440435623261180, -0.936422893122200510, -0.936405348280082480, -0.936387801096951190, -0.936370251572850250, -0.936352699707823870, -0.936335145501915660, --0.936317588955169590, -0.936300030067629520, -0.936282468839339300, -0.936264905270343010, -0.936247339360684490, -0.936229771110407620, -0.936212200519556230, -0.936194627588174400, --0.936177052316305990, -0.936159474703994960, -0.936141894751285180, -0.936124312458220810, -0.936106727824845500, -0.936089140851203430, -0.936071551537338560, -0.936053959883294760, --0.936036365889115980, -0.936018769554846420, -0.936001170880529920, -0.935983569866210450, -0.935965966511932090, -0.935948360817738690, -0.935930752783674550, -0.935913142409783520, --0.935895529696109560, -0.935877914642696760, -0.935860297249589300, -0.935842677516830920, -0.935825055444466040, -0.935807431032538380, -0.935789804281092150, -0.935772175190171420, --0.935754543759820370, -0.935736909990082850, -0.935719273881003070, -0.935701635432625080, -0.935683994644993080, -0.935666351518151030, -0.935648706052143120, -0.935631058247013430, --0.935613408102806130, -0.935595755619565210, -0.935578100797334940, -0.935560443636159530, -0.935542784136082940, -0.935525122297149460, -0.935507458119403060, -0.935489791602888030, --0.935472122747648570, -0.935454451553728750, -0.935436778021172870, -0.935419102150024990, -0.935401423940329320, -0.935383743392130260, -0.935366060505471660, -0.935348375280398050, --0.935330687716953380, -0.935312997815182070, -0.935295305575128190, -0.935277610996836150, -0.935259914080350030, -0.935242214825714010, -0.935224513232972620, -0.935206809302169930, --0.935189103033350120, -0.935171394426557610, -0.935153683481836700, -0.935135970199231450, -0.935118254578786390, -0.935100536620545600, -0.935082816324553480, -0.935065093690854330, --0.935047368719492460, -0.935029641410512150, -0.935011911763957810, -0.934994179779873540, -0.934976445458303940, -0.934958708799293210, -0.934940969802885770, -0.934923228469125790, --0.934905484798057800, -0.934887738789726090, -0.934869990444174960, -0.934852239761448930, -0.934834486741592310, -0.934816731384649380, -0.934798973690664670, -0.934781213659682590, --0.934763451291747430, -0.934745686586903710, -0.934727919545195630, -0.934710150166667920, -0.934692378451364660, -0.934674604399330590, -0.934656828010610010, -0.934639049285247330, --0.934621268223286950, -0.934603484824773510, -0.934585699089751310, -0.934567911018264860, -0.934550120610358580, -0.934532327866077090, -0.934514532785464700, -0.934496735368566030, --0.934478935615425610, -0.934461133526087620, -0.934443329100597020, -0.934425522338998000, -0.934407713241335200, -0.934389901807653130, -0.934372088037996210, -0.934354271932409160, --0.934336453490936410, -0.934318632713622590, -0.934300809600512090, -0.934282984151649560, -0.934265156367079630, -0.934247326246846810, -0.934229493790995740, -0.934211658999570820, --0.934193821872616790, -0.934175982410178190, -0.934158140612299630, -0.934140296479025740, -0.934122450010401060, -0.934104601206470320, -0.934086750067278040, -0.934068896592868960, --0.934051040783287490, -0.934033182638578600, -0.934015322158786580, -0.933997459343956390, -0.933979594194132460, -0.933961726709359620, -0.933943856889682400, -0.933925984735145650, --0.933908110245793790, -0.933890233421671770, -0.933872354262824110, -0.933854472769295560, -0.933836588941130860, -0.933818702778374750, -0.933800814281071760, -0.933782923449266720, --0.933765030283004500, -0.933747134782329510, -0.933729236947286930, -0.933711336777921060, -0.933693434274276980, -0.933675529436399200, -0.933657622264332690, -0.933639712758122080, --0.933621800917812220, -0.933603886743447850, -0.933585970235073730, -0.933568051392734690, -0.933550130216475590, -0.933532206706341070, -0.933514280862376090, -0.933496352684625390, --0.933478422173133930, -0.933460489327946230, -0.933442554149107370, -0.933424616636662100, -0.933406676790655250, -0.933388734611131920, -0.933370790098136500, -0.933352843251714300, --0.933334894071909840, -0.933316942558768290, -0.933298988712334300, -0.933281032532652820, -0.933263074019768820, -0.933245113173727160, -0.933227149994572570, -0.933209184482350240, --0.933191216637104910, -0.933173246458881560, -0.933155273947725020, -0.933137299103680370, -0.933119321926792480, -0.933101342417106290, -0.933083360574666680, -0.933065376399518590, --0.933047389891707210, -0.933029401051277300, -0.933011409878273910, -0.932993416372742020, -0.932975420534726600, -0.932957422364272480, -0.932939421861424980, -0.932921419026228830, --0.932903413858729210, -0.932885406358970990, -0.932867396526999240, -0.932849384362859020, -0.932831369866595430, -0.932813353038253300, -0.932795333877877830, -0.932777312385513980, --0.932759288561206930, -0.932741262405001550, -0.932723233916943010, -0.932705203097076500, -0.932687169945446980, -0.932669134462099540, -0.932651096647079130, -0.932633056500431160, --0.932615014022200370, -0.932596969212432180, -0.932578922071171550, -0.932560872598463540, -0.932542820794353360, -0.932524766658886280, -0.932506710192107070, -0.932488651394061230, --0.932470590264793620, -0.932452526804349760, -0.932434461012774380, -0.932416392890112910, -0.932398322436410520, -0.932380249651712290, -0.932362174536063400, -0.932344097089509050, --0.932326017312094520, -0.932307935203864900, -0.932289850764865480, -0.932271763995141440, -0.932253674894737980, -0.932235583463700280, -0.932217489702073740, -0.932199393609903340, --0.932181295187234580, -0.932163194434112440, -0.932145091350582430, -0.932126985936689630, -0.932108878192479450, -0.932090768117996960, -0.932072655713287680, -0.932054540978396680, --0.932036423913369380, -0.932018304518250960, -0.932000182793086720, -0.931982058737922170, -0.931963932352802390, -0.931945803637772800, -0.931927672592878680, -0.931909539218165440, --0.931891403513678270, -0.931873265479462700, -0.931855125115563900, -0.931836982422027280, -0.931818837398898150, -0.931800690046222010, -0.931782540364044180, -0.931764388352409930, --0.931746234011364690, -0.931728077340953980, -0.931709918341222960, -0.931691757012217180, -0.931673593353981920, -0.931655427366562820, -0.931637259050005050, -0.931619088404354150, --0.931600915429655620, -0.931582740125954770, -0.931564562493297000, -0.931546382531727830, -0.931528200241292790, -0.931510015622037170, -0.931491828674006590, -0.931473639397246370, --0.931455447791802120, -0.931437253857719140, -0.931419057595043180, -0.931400859003819410, -0.931382658084093600, -0.931364454835911130, -0.931346249259317530, -0.931328041354358200, --0.931309831121078900, -0.931291618559524910, -0.931273403669741980, -0.931255186451775520, -0.931236966905671040, -0.931218745031474170, -0.931200520829230440, -0.931182294298985470, --0.931164065440784670, -0.931145834254673790, -0.931127600740698220, -0.931109364898903720, -0.931091126729335810, -0.931072886232040100, -0.931054643407062120, -0.931036398254447620, --0.931018150774241990, -0.930999900966491100, -0.930981648831240350, -0.930963394368535590, -0.930945137578422340, -0.930926878460946240, -0.930908617016152800, -0.930890353244087860, --0.930872087144797190, -0.930853818718326180, -0.930835547964720680, -0.930817274884026320, -0.930798999476288750, -0.930780721741553570, -0.930762441679866770, -0.930744159291273740, --0.930725874575820460, -0.930707587533552320, -0.930689298164515290, -0.930671006468755000, -0.930652712446317310, -0.930634416097247620, -0.930616117421592120, -0.930597816419396100, --0.930579513090705750, -0.930561207435566470, -0.930542899454024240, -0.930524589146124680, -0.930506276511913640, -0.930487961551437090, -0.930469644264740440, -0.930451324651869860, --0.930433002712870880, -0.930414678447789360, -0.930396351856671130, -0.930378022939562180, -0.930359691696508010, -0.930341358127554700, -0.930323022232747880, -0.930304684012133620, --0.930286343465757560, -0.930268000593665770, -0.930249655395903870, -0.930231307872517840, -0.930212958023553530, -0.930194605849056890, -0.930176251349073670, -0.930157894523649830, --0.930139535372831340, -0.930121173896663930, -0.930102810095193580, -0.930084443968466230, -0.930066075516527760, -0.930047704739424110, -0.930029331637201250, -0.930010956209905040, --0.929992578457581430, -0.929974198380276280, -0.929955815978035780, -0.929937431250905670, -0.929919044198932010, -0.929900654822160670, -0.929882263120637820, -0.929863869094409100, --0.929845472743520920, -0.929827074068019010, -0.929808673067949340, -0.929790269743357990, -0.929771864094291020, -0.929753456120794410, -0.929735045822914110, -0.929716633200696200, --0.929698218254186750, -0.929679800983431730, -0.929661381388477200, -0.929642959469369260, -0.929624535226153850, -0.929606108658877160, -0.929587679767585160, -0.929569248552324030, --0.929550815013139630, -0.929532379150078360, -0.929513940963186070, -0.929495500452508950, -0.929477057618092960, -0.929458612459984510, -0.929440164978229340, -0.929421715172873860, --0.929403263043964150, -0.929384808591546150, -0.929366351815666290, -0.929347892716370420, -0.929329431293704930, -0.929310967547715690, -0.929292501478449220, -0.929274033085951360, --0.929255562370268520, -0.929237089331446780, -0.929218613969532200, -0.929200136284571210, -0.929181656276609870, -0.929163173945694250, -0.929144689291870880, -0.929126202315185610, --0.929107713015684960, -0.929089221393414990, -0.929070727448422010, -0.929052231180752090, -0.929033732590451630, -0.929015231677566940, -0.928996728442144090, -0.928978222884229380, --0.928959715003869200, -0.928941204801109750, -0.928922692275997220, -0.928904177428578000, -0.928885660258898290, -0.928867140767004500, -0.928848618952942790, -0.928830094816759600, --0.928811568358501090, -0.928793039578213690, -0.928774508475943670, -0.928755975051737460, -0.928737439305641230, -0.928718901237701510, -0.928700360847964480, -0.928681818136476540, --0.928663273103284000, -0.928644725748433260, -0.928626176071970840, -0.928607624073942930, -0.928589069754395920, -0.928570513113376240, -0.928551954150930390, -0.928533392867104460, --0.928514829261945170, -0.928496263335498840, -0.928477695087811860, -0.928459124518930530, -0.928440551628901490, -0.928421976417770910, -0.928403398885585540, -0.928384819032391670, --0.928366236858235720, -0.928347652363164190, -0.928329065547223500, -0.928310476410460160, -0.928291884952920590, -0.928273291174651400, -0.928254695075698910, -0.928236096656109730, --0.928217495915930280, -0.928198892855207070, -0.928180287473986620, -0.928161679772315560, -0.928143069750240190, -0.928124457407807250, -0.928105842745063030, -0.928087225762054380, --0.928068606458827490, -0.928049984835429220, -0.928031360891905850, -0.928012734628304250, -0.927994106044670590, -0.927975475141051830, -0.927956841917494390, -0.927938206374044780, --0.927919568510749640, -0.927900928327655580, -0.927882285824809250, -0.927863641002257160, -0.927844993860046040, -0.927826344398222420, -0.927807692616832940, -0.927789038515924090, --0.927770382095542860, -0.927751723355735520, -0.927733062296548950, -0.927714398918029650, -0.927695733220224470, -0.927677065203179830, -0.927658394866942680, -0.927639722211559440, --0.927621047237076950, -0.927602369943541730, -0.927583690331000630, -0.927565008399500290, -0.927546324149087440, -0.927527637579808830, -0.927508948691711080, -0.927490257484841040, --0.927471563959245240, -0.927452868114970630, -0.927434169952063850, -0.927415469470571630, -0.927396766670540610, -0.927378061552017850, -0.927359354115049880, -0.927340644359683550, --0.927321932285965490, -0.927303217893942770, -0.927284501183661790, -0.927265782155169750, -0.927247060808513160, -0.927228337143738980, -0.927209611160893840, -0.927190882860024820, --0.927172152241178550, -0.927153419304401760, -0.927134684049741640, -0.927115946477244600, -0.927097206586957930, -0.927078464378928050, -0.927059719853202120, -0.927040973009826800, --0.927022223848849140, -0.927003472370315880, -0.926984718574273890, -0.926965962460770120, -0.926947204029851530, -0.926928443281564870, -0.926909680215957100, -0.926890914833075170, --0.926872147132965950, -0.926853377115676280, -0.926834604781253240, -0.926815830129743670, -0.926797053161194540, -0.926778273875652700, -0.926759492273165230, -0.926740708353779090, --0.926721922117541120, -0.926703133564498400, -0.926684342694697680, -0.926665549508186360, -0.926646754005010950, -0.926627956185218760, -0.926609156048856630, -0.926590353595971640, --0.926571548826610750, -0.926552741740821030, -0.926533932338649450, -0.926515120620143070, -0.926496306585348760, -0.926477490234313810, -0.926458671567085060, -0.926439850583709700, --0.926421027284234590, -0.926402201668707010, -0.926383373737173940, -0.926364543489682330, -0.926345710926279490, -0.926326876047012250, -0.926308038851927920, -0.926289199341073450, --0.926270357514496050, -0.926251513372242650, -0.926232666914360570, -0.926213818140896760, -0.926194967051898410, -0.926176113647412700, -0.926157257927486600, -0.926138399892167400, --0.926119539541502280, -0.926100676875538210, -0.926081811894322480, -0.926062944597902280, -0.926044074986324680, -0.926025203059636760, -0.926006328817885920, -0.925987452261119340, --0.925968573389384100, -0.925949692202727380, -0.925930808701196480, -0.925911922884838590, -0.925893034753700770, -0.925874144307830440, -0.925855251547274770, -0.925836356472080960, --0.925817459082296180, -0.925798559377967840, -0.925779657359143030, -0.925760753025869130, -0.925741846378193340, -0.925722937416162960, -0.925704026139825160, -0.925685112549227470, --0.925666196644416850, -0.925647278425440700, -0.925628357892346430, -0.925609435045181230, -0.925590509883992500, -0.925571582408827420, -0.925552652619733520, -0.925533720516757860, --0.925514786099947970, -0.925495849369351030, -0.925476910325014560, -0.925457968966985730, -0.925439025295312080, -0.925420079310040780, -0.925401131011219350, -0.925382180398894970, --0.925363227473115280, -0.925344272233927460, -0.925325314681379020, -0.925306354815517150, -0.925287392636389480, -0.925268428144043310, -0.925249461338526040, -0.925230492219885290, --0.925211520788168150, -0.925192547043422240, -0.925173570985694970, -0.925154592615033740, -0.925135611931486080, -0.925116628935099380, -0.925097643625921060, -0.925078656003998740, --0.925059666069379730, -0.925040673822111530, -0.925021679262241660, -0.925002682389817530, -0.924983683204886780, -0.924964681707496790, -0.924945677897695110, -0.924926671775529230, --0.924907663341046680, -0.924888652594294870, -0.924869639535321530, -0.924850624164174070, -0.924831606480900130, -0.924812586485547090, -0.924793564178162610, -0.924774539558794180, --0.924755512627489450, -0.924736483384295930, -0.924717451829261240, -0.924698417962432790, -0.924679381783858450, -0.924660343293585480, -0.924641302491661770, -0.924622259378134800, --0.924603213953052230, -0.924584166216461560, -0.924565116168410530, -0.924546063808946550, -0.924527009138117580, -0.924507952155971040, -0.924488892862554530, -0.924469831257915930, --0.924450767342102630, -0.924431701115162490, -0.924412632577143010, -0.924393561728092060, -0.924374488568057150, -0.924355413097086130, -0.924336335315226410, -0.924317255222525950, --0.924298172819032260, -0.924279088104793310, -0.924260001079856510, -0.924240911744269810, -0.924221820098080630, -0.924202726141337140, -0.924183629874086640, -0.924164531296377210, --0.924145430408256360, -0.924126327209771950, -0.924107221700971700, -0.924088113881903370, -0.924069003752614910, -0.924049891313153850, -0.924030776563568020, -0.924011659503905290, --0.923992540134213500, -0.923973418454540170, -0.923954294464933490, -0.923935168165440860, -0.923916039556110570, -0.923896908636989920, -0.923877775408127210, -0.923858639869569950, --0.923839502021366110, -0.923820361863563530, -0.923801219396210070, -0.923782074619353470, -0.923762927533041790, -0.923743778137322670, -0.923724626432244180, -0.923705472417854170, --0.923686316094200380, -0.923667157461330880, -0.923647996519293410, -0.923628833268136050, -0.923609667707906530, -0.923590499838652930, -0.923571329660422990, -0.923552157173264780, --0.923532982377226030, -0.923513805272355050, -0.923494625858699350, -0.923475444136307330, -0.923456260105226520, -0.923437073765505100, -0.923417885117190920, -0.923398694160332160, --0.923379500894976560, -0.923360305321172300, -0.923341107438967250, -0.923321907248409350, -0.923302704749546790, -0.923283499942427310, -0.923264292827099320, -0.923245083403610440, --0.923225871672008870, -0.923206657632342660, -0.923187441284659790, -0.923168222629008330, -0.923149001665436340, -0.923129778393991680, -0.923110552814722760, -0.923091324927677430, --0.923072094732903750, -0.923052862230449800, -0.923033627420363770, -0.923014390302693610, -0.922995150877487510, -0.922975909144793550, -0.922956665104659680, -0.922937418757134310, --0.922918170102265290, -0.922898919140100920, -0.922879665870689260, -0.922860410294078390, -0.922841152410316500, -0.922821892219451770, -0.922802629721532260, -0.922783364916606170, --0.922764097804721680, -0.922744828385926970, -0.922725556660270230, -0.922706282627799520, -0.922687006288563150, -0.922667727642609290, -0.922648446689986020, -0.922629163430741750, --0.922609877864924430, -0.922590589992582480, -0.922571299813764070, -0.922552007328517390, -0.922532712536890730, -0.922513415438932170, -0.922494116034690230, -0.922474814324212970, --0.922455510307548690, -0.922436203984745460, -0.922416895355851920, -0.922397584420916020, -0.922378271179986280, -0.922358955633110770, -0.922339637780337900, -0.922320317621715960, --0.922300995157293250, -0.922281670387117950, -0.922262343311238570, -0.922243013929703200, -0.922223682242560460, -0.922204348249858310, -0.922185011951645370, -0.922165673347970060, --0.922146332438880450, -0.922126989224425040, -0.922107643704652040, -0.922088295879610050, -0.922068945749347280, -0.922049593313912230, -0.922030238573353090, -0.922010881527718370, --0.921991522177056490, -0.921972160521415840, -0.921952796560844610, -0.921933430295391540, -0.921914061725104820, -0.921894690850033060, -0.921875317670224460, -0.921855942185727750, --0.921836564396590900, -0.921817184302862860, -0.921797801904591820, -0.921778417201826180, -0.921759030194614580, -0.921739640883005310, -0.921720249267047100, -0.921700855346788140, --0.921681459122277060, -0.921662060593562370, -0.921642659760692480, -0.921623256623716030, -0.921603851182681400, -0.921584443437637010, -0.921565033388631720, -0.921545621035713690, --0.921526206378931790, -0.921506789418334190, -0.921487370153969750, -0.921467948585886760, -0.921448524714133970, -0.921429098538759870, -0.921409670059813000, -0.921390239277341980, --0.921370806191395220, -0.921351370802021670, -0.921331933109269530, -0.921312493113187640, -0.921293050813824510, -0.921273606211228780, -0.921254159305448960, -0.921234710096533790, --0.921215258584531790, -0.921195804769491810, -0.921176348651462140, -0.921156890230491740, -0.921137429506628910, -0.921117966479922720, -0.921098501150421470, -0.921079033518174110, --0.921059563583229050, -0.921040091345635140, -0.921020616805440890, -0.921001139962695170, -0.920981660817446590, -0.920962179369743890, -0.920942695619635820, -0.920923209567170890, --0.920903721212397940, -0.920884230555365720, -0.920864737596122970, -0.920845242334718210, -0.920825744771200600, -0.920806244905618350, -0.920786742738020750, -0.920767238268456080, --0.920747731496973530, -0.920728222423621400, -0.920708711048448980, -0.920689197371504560, -0.920669681392837220, -0.920650163112495700, -0.920630642530528840, -0.920611119646985280, --0.920591594461913850, -0.920572066975363530, -0.920552537187383060, -0.920533005098021270, -0.920513470707326810, -0.920493934015348850, -0.920474395022136020, -0.920454853727737170, --0.920435310132201150, -0.920415764235576920, -0.920396216037913220, -0.920376665539259120, -0.920357112739663140, -0.920337557639174570, -0.920318000237841940, -0.920298440535714520, --0.920278878532840850, -0.920259314229269990, -0.920239747625050790, -0.920220178720232320, -0.920200607514863430, -0.920181034008992870, -0.920161458202669920, -0.920141880095943220, --0.920122299688861830, -0.920102716981474720, -0.920083131973830740, -0.920063544665978950, -0.920043955057968430, -0.920024363149847810, -0.920004768941666500, -0.919985172433473110, --0.919965573625316950, -0.919945972517246640, -0.919926369109311580, -0.919906763401560520, -0.919887155394042530, -0.919867545086806680, -0.919847932479902040, -0.919828317573377460, --0.919808700367282020, -0.919789080861665000, -0.919769459056575140, -0.919749834952061750, -0.919730208548173780, -0.919710579844960300, -0.919690948842470160, -0.919671315540752880, --0.919651679939857190, -0.919632042039832400, -0.919612401840727340, -0.919592759342591440, -0.919573114545473520, -0.919553467449423010, -0.919533818054488640, -0.919514166360719810, --0.919494512368165480, -0.919474856076874960, -0.919455197486897300, -0.919435536598281590, -0.919415873411077110, -0.919396207925332830, -0.919376540141098150, -0.919356870058422040, --0.919337197677353780, -0.919317522997942560, -0.919297846020237560, -0.919278166744287750, -0.919258485170142750, -0.919238801297851400, -0.919219115127463130, -0.919199426659027100, --0.919179735892592390, -0.919160042828208400, -0.919140347465924320, -0.919120649805789340, -0.919100949847852840, -0.919081247592163810, -0.919061543038771740, -0.919041836187725720, --0.919022127039075150, -0.919002415592869440, -0.918982701849157420, -0.918962985807988850, -0.918943267469412680, -0.918923546833478540, -0.918903823900235280, -0.918884098669732640, --0.918864371142019690, -0.918844641317145830, -0.918824909195160360, -0.918805174776112680, -0.918785438060051860, -0.918765699047027650, -0.918745957737089110, -0.918726214130285770, --0.918706468226666790, -0.918686720026281600, -0.918666969529179700, -0.918647216735410390, -0.918627461645022960, -0.918607704258066930, -0.918587944574591590, -0.918568182594646450, --0.918548418318280820, -0.918528651745544100, -0.918508882876485910, -0.918489111711155330, -0.918469338249602090, -0.918449562491875480, -0.918429784438024920, -0.918410004088099920, --0.918390221442149990, -0.918370436500224430, -0.918350649262372750, -0.918330859728644480, -0.918311067899089120, -0.918291273773755970, -0.918271477352694760, -0.918251678635954690, --0.918231877623585490, -0.918212074315636780, -0.918192268712157640, -0.918172460813198030, -0.918152650618807130, -0.918132838129034680, -0.918113023343930080, -0.918093206263542960, --0.918073386887922730, -0.918053565217119120, -0.918033741251181650, -0.918013914990159720, -0.917994086434103070, -0.917974255583061230, -0.917954422437083580, -0.917934586996220100, --0.917914749260519970, -0.917894909230033140, -0.917875066904808910, -0.917855222284897020, -0.917835375370347100, -0.917815526161208760, -0.917795674657531650, -0.917775820859365150, --0.917755964766759360, -0.917736106379763440, -0.917716245698427470, -0.917696382722800740, -0.917676517452933100, -0.917656649888874080, -0.917636780030673620, -0.917616907878381020, --0.917597033432046240, -0.917577156691718800, -0.917557277657448660, -0.917537396329285100, -0.917517512707278220, -0.917497626791477510, -0.917477738581932710, -0.917457848078693460, --0.917437955281809710, -0.917418060191331100, -0.917398162807307240, -0.917378263129788100, -0.917358361158823190, -0.917338456894462470, -0.917318550336755580, -0.917298641485752240, --0.917278730341502310, -0.917258816904055640, -0.917238901173461850, -0.917218983149770910, -0.917199062833032430, -0.917179140223296390, -0.917159215320612290, -0.917139288125030430, --0.917119358636600100, -0.917099426855371490, -0.917079492781394330, -0.917059556414718370, -0.917039617755393550, -0.917019676803469630, -0.916999733558996670, -0.916979788022024290, --0.916959840192602460, -0.916939890070780920, -0.916919937656609840, -0.916899982950138750, -0.916880025951417820, -0.916860066660496690, -0.916840105077425530, -0.916820141202254080, --0.916800175035032310, -0.916780206575809940, -0.916760235824637280, -0.916740262781563840, -0.916720287446639910, -0.916700309819915130, -0.916680329901439660, -0.916660347691263260, --0.916640363189436090, -0.916620376396007910, -0.916600387311028890, -0.916580395934548870, -0.916560402266617840, -0.916540406307285840, -0.916520408056602730, -0.916500407514618700, --0.916480404681383700, -0.916460399556947580, -0.916440392141360530, -0.916420382434672500, -0.916400370436933450, -0.916380356148193580, -0.916360339568502600, -0.916340320697911050, --0.916320299536468540, -0.916300276084225370, -0.916280250341231390, -0.916260222307536900, -0.916240191983191730, -0.916220159368246080, -0.916200124462750120, -0.916180087266753820, --0.916160047780307350, -0.916140006003460680, -0.916119961936264100, -0.916099915578767580, -0.916079866931021280, -0.916059815993075180, -0.916039762764979670, -0.916019707246784720, --0.915999649438540620, -0.915979589340297220, -0.915959526952104920, -0.915939462274013790, -0.915919395306074020, -0.915899326048335680, -0.915879254500849170, -0.915859180663664450, --0.915839104536831820, -0.915819026120401340, -0.915798945414423300, -0.915778862418948010, -0.915758777134025430, -0.915738689559706050, -0.915718599696039750, -0.915698507543077130, --0.915678413100868170, -0.915658316369463270, -0.915638217348912490, -0.915618116039266130, -0.915598012440574480, -0.915577906552887950, -0.915557798376256500, -0.915537687910730650, --0.915517575156360450, -0.915497460113196440, -0.915477342781288780, -0.915457223160687780, -0.915437101251443620, -0.915416977053606700, -0.915396850567227420, -0.915376721792355960, --0.915356590729042740, -0.915336457377337930, -0.915316321737292160, -0.915296183808955500, -0.915276043592378350, -0.915255901087611120, -0.915235756294704220, -0.915215609213707810, --0.915195459844672430, -0.915175308187648360, -0.915155154242686120, -0.915134998009835780, -0.915114839489148180, -0.915094678680673400, -0.915074515584461960, -0.915054350200564140, --0.915034182529030460, -0.915014012569911330, -0.914993840323257150, -0.914973665789118430, -0.914953488967545470, -0.914933309858588890, -0.914913128462299000, -0.914892944778726290, --0.914872758807921180, -0.914852570549934300, -0.914832380004815810, -0.914812187172616590, -0.914791992053386680, -0.914771794647176950, -0.914751594954037570, -0.914731392974019400, --0.914711188707172610, -0.914690982153547940, -0.914670773313195680, -0.914650562186166580, -0.914630348772511040, -0.914610133072279560, -0.914589915085522900, -0.914569694812291330, --0.914549472252635720, -0.914529247406606240, -0.914509020274253740, -0.914488790855628620, -0.914468559150781510, -0.914448325159763040, -0.914428088882623840, -0.914407850319414290, --0.914387609470185160, -0.914367366334986940, -0.914347120913870490, -0.914326873206886100, -0.914306623214084510, -0.914286370935516350, -0.914266116371232450, -0.914245859521283010, --0.914225600385719090, -0.914205338964591110, -0.914185075257949680, -0.914164809265845760, -0.914144540988329650, -0.914124270425452300, -0.914103997577264240, -0.914083722443816190, --0.914063445025158790, -0.914043165321342890, -0.914022883332418990, -0.914002599058437950, -0.913982312499450280, -0.913962023655507050, -0.913941732526658560, -0.913921439112955870, --0.913901143414449390, -0.913880845431190300, -0.913860545163228900, -0.913840242610616250, -0.913819937773402870, -0.913799630651639830, -0.913779321245377530, -0.913759009554666930, --0.913738695579559000, -0.913718379320104130, -0.913698060776353520, -0.913677739948357550, -0.913657416836167410, -0.913637091439833520, -0.913616763759407150, -0.913596433794938710, --0.913576101546479170, -0.913555767014079480, -0.913535430197790270, -0.913515091097662490, -0.913494749713747110, -0.913474406046094760, -0.913454060094756380, -0.913433711859782840, --0.913413361341225190, -0.913393008539133970, -0.913372653453560220, -0.913352296084554930, -0.913331936432168810, -0.913311574496452840, -0.913291210277457970, -0.913270843775235150, --0.913250474989835140, -0.913230103921308990, -0.913209730569707560, -0.913189354935081800, -0.913168977017482560, -0.913148596816961030, -0.913128214333567940, -0.913107829567354370, --0.913087442518371150, -0.913067053186669360, -0.913046661572299970, -0.913026267675313920, -0.913005871495762070, -0.912985473033695700, -0.912965072289165570, -0.912944669262222730, --0.912924263952918260, -0.912903856361303110, -0.912883446487428360, -0.912863034331344970, -0.912842619893104110, -0.912822203172756530, -0.912801784170353510, -0.912781362885946020, --0.912760939319585130, -0.912740513471321900, -0.912720085341207410, -0.912699654929292610, -0.912679222235628810, -0.912658787260266830, -0.912638350003257990, -0.912617910464653240, --0.912597468644503750, -0.912577024542860490, -0.912556578159774650, -0.912536129495297500, -0.912515678549479900, -0.912495225322373150, -0.912474769814028310, -0.912454312024496670, --0.912433851953829090, -0.912413389602077070, -0.912392924969291360, -0.912372458055523470, -0.912351988860824360, -0.912331517385245430, -0.912311043628837530, -0.912290567591652170, --0.912270089273740200, -0.912249608675153260, -0.912229125795942060, -0.912208640636158250, -0.912188153195852670, -0.912167663475076830, -0.912147171473881690, -0.912126677192318660, --0.912106180630439020, -0.912085681788293860, -0.912065180665934560, -0.912044677263412320, -0.912024171580778310, -0.912003663618083940, -0.911983153375380380, -0.911962640852718830, --0.911942126050150900, -0.911921608967727450, -0.911901089605500090, -0.911880567963520020, -0.911860044041838510, -0.911839517840506870, -0.911818989359576390, -0.911798458599098470, --0.911777925559124510, -0.911757390239705590, -0.911736852640893210, -0.911716312762738790, -0.911695770605293500, -0.911675226168608850, -0.911654679452736040, -0.911634130457726680, --0.911613579183631840, -0.911593025630503150, -0.911572469798391900, -0.911551911687349500, -0.911531351297427240, -0.911510788628676630, -0.911490223681149070, -0.911469656454895970, --0.911449086949968620, -0.911428515166418650, -0.911407941104297350, -0.911387364763656230, -0.911366786144546690, -0.911346205247020260, -0.911325622071128110, -0.911305036616921970, --0.911284448884453370, -0.911263858873773590, -0.911243266584934150, -0.911222672017986570, -0.911202075172982240, -0.911181476049972790, -0.911160874649009630, -0.911140270970144270, --0.911119665013428340, -0.911099056778913010, -0.911078446266650240, -0.911057833476691340, -0.911037218409087800, -0.911016601063891260, -0.910995981441153240, -0.910975359540925120, --0.910954735363258770, -0.910934108908205480, -0.910913480175816970, -0.910892849166144660, -0.910872215879240280, -0.910851580315155450, -0.910830942473941470, -0.910810302355650410, --0.910789659960333340, -0.910769015288042330, -0.910748368338828660, -0.910727719112744080, -0.910707067609840220, -0.910686413830168680, -0.910665757773781110, -0.910645099440729240, --0.910624438831064480, -0.910603775944838660, -0.910583110782103410, -0.910562443342910480, -0.910541773627311260, -0.910521101635357710, -0.910500427367101350, -0.910479750822593910, --0.910459072001887250, -0.910438390905032760, -0.910417707532082400, -0.910397021883087690, -0.910376333958100470, -0.910355643757172370, -0.910334951280355240, -0.910314256527700590, --0.910293559499260500, -0.910272860195086350, -0.910252158615230120, -0.910231454759743430, -0.910210748628678230, -0.910190040222086050, -0.910169329540018830, -0.910148616582528210, --0.910127901349666150, -0.910107183841484260, -0.910086464058034390, -0.910065741999368400, -0.910045017665538030, -0.910024291056595210, -0.910003562172591480, -0.909982831013579020, --0.909962097579609440, -0.909941361870734600, -0.909920623887006340, -0.909899883628476620, -0.909879141095197070, -0.909858396287219760, -0.909837649204596310, -0.909816899847378900, --0.909796148215619160, -0.909775394309369050, -0.909754638128680520, -0.909733879673605310, -0.909713118944195380, -0.909692355940502790, -0.909671590662579190, -0.909650823110476630, --0.909630053284247060, -0.909609281183942240, -0.909588506809614450, -0.909567730161315200, -0.909546951239096680, -0.909526170043010730, -0.909505386573109530, -0.909484600829444600, --0.909463812812068450, -0.909443022521032480, -0.909422229956389220, -0.909401435118190270, -0.909380638006487720, -0.909359838621333520, -0.909339036962779850, -0.909318233030878440, --0.909297426825681600, -0.909276618347241270, -0.909255807595609090, -0.909234994570837560, -0.909214179272978650, -0.909193361702083980, -0.909172541858206170, -0.909151719741396970, --0.909130895351708550, -0.909110068689192640, -0.909089239753901770, -0.909068408545887770, -0.909047575065202730, -0.909026739311898590, -0.909005901286027870, -0.908985060987642310, --0.908964218416794090, -0.908943373573535160, -0.908922526457918050, -0.908901677069994470, -0.908880825409816850, -0.908859971477436910, -0.908839115272907170, -0.908818256796279810, --0.908797396047606450, -0.908776533026939840, -0.908755667734331920, -0.908734800169834880, -0.908713930333500560, -0.908693058225381710, -0.908672183845530060, -0.908651307193998110, --0.908630428270837620, -0.908609547076101200, -0.908588663609841030, -0.908567777872109070, -0.908546889862957620, -0.908525999582439070, -0.908505107030605500, -0.908484212207509190, --0.908463315113202110, -0.908442415747736990, -0.908421514111165780, -0.908400610203540900, -0.908379704024914190, -0.908358795575338500, -0.908337884854865770, -0.908316971863548090, --0.908296056601438200, -0.908275139068588140, -0.908254219265050340, -0.908233297190876750, -0.908212372846120110, -0.908191446230832480, -0.908170517345066260, -0.908149586188873650, --0.908128652762307140, -0.908107717065419040, -0.908086779098261740, -0.908065838860887210, -0.908044896353348290, -0.908023951575697040, -0.908003004527985990, -0.907982055210267310, --0.907961103622593630, -0.907940149765017130, -0.907919193637590110, -0.907898235240365390, -0.907877274573394950, -0.907856311636731310, -0.907835346430426850, -0.907814378954534100, --0.907793409209105450, -0.907772437194193200, -0.907751462909849760, -0.907730486356127740, -0.907709507533079660, -0.907688526440757700, -0.907667543079214270, -0.907646557448502200, --0.907625569548673680, -0.907604579379781230, -0.907583586941877240, -0.907562592235014340, -0.907541595259245050, -0.907520596014621540, -0.907499594501196770, -0.907478590719023040, --0.907457584668152740, -0.907436576348638390, -0.907415565760532730, -0.907394552903888150, -0.907373537778757180, -0.907352520385192210, -0.907331500723246090, -0.907310478792971220, --0.907289454594420230, -0.907268428127645300, -0.907247399392699600, -0.907226368389635330, -0.907205335118505210, -0.907184299579361530, -0.907163261772257260, -0.907142221697244790, --0.907121179354376640, -0.907100134743705770, -0.907079087865284570, -0.907058038719165570, -0.907036987305401280, -0.907015933624044760, -0.906994877675148410, -0.906973819458764870, --0.906952758974946540, -0.906931696223746590, -0.906910631205217310, -0.906889563919411560, -0.906868494366381620, -0.906847422546180670, -0.906826348458861120, -0.906805272104475700, --0.906784193483077040, -0.906763112594717980, -0.906742029439451150, -0.906720944017329170, -0.906699856328404770, -0.906678766372730820, -0.906657674150360030, -0.906636579661344810, --0.906615482905738350, -0.906594383883593260, -0.906573282594962060, -0.906552179039897600, -0.906531073218452830, -0.906509965130680270, -0.906488854776632990, -0.906467742156363280, --0.906446627269924420, -0.906425510117368940, -0.906404390698749780, -0.906383269014119360, -0.906362145063531080, -0.906341018847037330, -0.906319890364691070, -0.906298759616544940, --0.906277626602651990, -0.906256491323065070, -0.906235353777836710, -0.906214213967020180, -0.906193071890668000, -0.906171927548833240, -0.906150780941568530, -0.906129632068926940, --0.906108480930961300, -0.906087327527724470, -0.906066171859269190, -0.906045013925648620, -0.906023853726915410, -0.906002691263122720, -0.905981526534323070, -0.905960359540569750, --0.905939190281915610, -0.905918018758413380, -0.905896844970116020, -0.905875668917076720, -0.905854490599348190, -0.905833310016983310, -0.905812127170035340, -0.905790942058557040, --0.905769754682601350, -0.905748565042221120, -0.905727373137469650, -0.905706178968399780, -0.905684982535064460, -0.905663783837516450, -0.905642582875809230, -0.905621379649995450, --0.905600174160128280, -0.905578966406260570, -0.905557756388445490, -0.905536544106736120, -0.905515329561185300, -0.905494112751846100, -0.905472893678771710, -0.905451672342015070, --0.905430448741629370, -0.905409222877667230, -0.905387994750182280, -0.905366764359227360, -0.905345531704855320, -0.905324296787119560, -0.905303059606073160, -0.905281820161769060, --0.905260578454260220, -0.905239334483600170, -0.905218088249841850, -0.905196839753038220, -0.905175588993242240, -0.905154335970507540, -0.905133080684887070, -0.905111823136433790, --0.905090563325200770, -0.905069301251241630, -0.905048036914609110, -0.905026770315356610, -0.905005501453536980, -0.904984230329203720, -0.904962956942409910, -0.904941681293208510, --0.904920403381653140, -0.904899123207796750, -0.904877840771692530, -0.904856556073393550, -0.904835269112953310, -0.904813979890424890, -0.904792688405861580, -0.904771394659316330, --0.904750098650842880, -0.904728800380494080, -0.904707499848323330, -0.904686197054383580, -0.904664891998728570, -0.904643584681411260, -0.904622275102485050, -0.904600963262003010, --0.904579649160018650, -0.904558332796585260, -0.904537014171755800, -0.904515693285584010, -0.904494370138123060, -0.904473044729426020, -0.904451717059546300, -0.904430387128537410, --0.904409054936452630, -0.904387720483345150, -0.904366383769268260, -0.904345044794275470, -0.904323703558420180, -0.904302360061755570, -0.904281014304334940, -0.904259666286211910, --0.904238316007439650, -0.904216963468071680, -0.904195608668161180, -0.904174251607761770, -0.904152892286926750, -0.904131530705709290, -0.904110166864163120, -0.904088800762341660, --0.904067432400298080, -0.904046061778085890, -0.904024688895758600, -0.904003313753369620, -0.903981936350972350, -0.903960556688620080, -0.903939174766366650, -0.903917790584265250, --0.903896404142369270, -0.903875015440732230, -0.903853624479407760, -0.903832231258449250, -0.903810835777910220, -0.903789438037843840, -0.903768038038304080, -0.903746635779344220, --0.903725231261017780, -0.903703824483378050, -0.903682415446478980, -0.903661004150373870, -0.903639590595116000, -0.903618174780759340, -0.903596756707357280, -0.903575336374963340, --0.903553913783630920, -0.903532488933413870, -0.903511061824365580, -0.903489632456539680, -0.903468200829989470, -0.903446766944768890, -0.903425330800931460, -0.903403892398530690, --0.903382451737620000, -0.903361008818253430, -0.903339563640484290, -0.903318116204366190, -0.903296666509952660, -0.903275214557297650, -0.903253760346454550, -0.903232303877476990, --0.903210845150418720, -0.903189384165333450, -0.903167920922274710, -0.903146455421295900, -0.903124987662451200, -0.903103517645794000, -0.903082045371378040, -0.903060570839256730, --0.903039094049484240, -0.903017615002113970, -0.902996133697199670, -0.902974650134794830, -0.902953164314953540, -0.902931676237729410, -0.902910185903176070, -0.902888693311347020, --0.902867198462296460, -0.902845701356078000, -0.902824201992744930, -0.902802700372351660, -0.902781196494951590, -0.902759690360598550, -0.902738181969346080, -0.902716671321248440, --0.902695158416359060, -0.902673643254731760, -0.902652125836420070, -0.902630606161478390, -0.902609084229960220, -0.902587560041919200, -0.902566033597409170, -0.902544504896484300, --0.902522973939198110, -0.902501440725604450, -0.902479905255757050, -0.902458367529710090, -0.902436827547517200, -0.902415285309232210, -0.902393740814908860, -0.902372194064601230, --0.902350645058363270, -0.902329093796248370, -0.902307540278311060, -0.902285984504604840, -0.902264426475183680, -0.902242866190101190, -0.902221303649411780, -0.902199738853169180, --0.902178171801427120, -0.902156602494239460, -0.902135030931660590, -0.902113457113744020, -0.902091881040543830, -0.902070302712113750, -0.902048722128508170, -0.902027139289780730, --0.902005554195985490, -0.901983966847176080, -0.901962377243407000, -0.901940785384731990, -0.901919191271204790, -0.901897594902879800, -0.901875996279810850, -0.901854395402051920, --0.901832792269656850, -0.901811186882679920, -0.901789579241175090, -0.901767969345196210, -0.901746357194797230, -0.901724742790032670, -0.901703126130956160, -0.901681507217621860, --0.901659886050083630, -0.901638262628395750, -0.901616636952612290, -0.901595009022787330, -0.901573378838974480, -0.901551746401228480, -0.901530111709603180, -0.901508474764152300, --0.901486835564930480, -0.901465194111991550, -0.901443550405389590, -0.901421904445178670, -0.901400256231413070, -0.901378605764146860, -0.901356953043434220, -0.901335298069328880, --0.901313640841885590, -0.901291981361158180, -0.901270319627200720, -0.901248655640067400, -0.901226989399812610, -0.901205320906490300, -0.901183650160154670, -0.901161977160859770, --0.901140301908660120, -0.901118624403609680, -0.901096944645762510, -0.901075262635173120, -0.901053578371895700, -0.901031891855984200, -0.901010203087492910, -0.900988512066476120, --0.900966818792988230, -0.900945123267083200, -0.900923425488815210, -0.900901725458238770, -0.900880023175408160, -0.900858318640377350, -0.900836611853200630, -0.900814902813932620, --0.900793191522627270, -0.900771477979338990, -0.900749762184121730, -0.900728044137030340, -0.900706323838118880, -0.900684601287441540, -0.900662876485052500, -0.900641149431006480, --0.900619420125357560, -0.900597688568159920, -0.900575954759468280, -0.900554218699336720, -0.900532480387819630, -0.900510739824971100, -0.900488997010845950, -0.900467251945498370, --0.900445504628982650, -0.900423755061352860, -0.900402003242663950, -0.900380249172969990, -0.900358492852325500, -0.900336734280784530, -0.900314973458401950, -0.900293210385231910, --0.900271445061328830, -0.900249677486746890, -0.900227907661541040, -0.900206135585765450, -0.900184361259474210, -0.900162584682722370, -0.900140805855564000, -0.900119024778053610, --0.900097241450245500, -0.900075455872194510, -0.900053668043954810, -0.900031877965581040, -0.900010085637127260, -0.899988291058648530, -0.899966494230199030, -0.899944695151833400, --0.899922893823605690, -0.899901090245571080, -0.899879284417783640, -0.899857476340298000, -0.899835666013168560, -0.899813853436450040, -0.899792038610196960, -0.899770221534463620, --0.899748402209304850, -0.899726580634775060, -0.899704756810928870, -0.899682930737820570, -0.899661102415505120, -0.899639271844037030, -0.899617439023470580, -0.899595603953860510, --0.899573766635261450, -0.899551927067728130, -0.899530085251314950, -0.899508241186076310, -0.899486394872067270, -0.899464546309342360, -0.899442695497955970, -0.899420842437962610, --0.899398987129417460, -0.899377129572374810, -0.899355269766889290, -0.899333407713015400, -0.899311543410808210, -0.899289676860322130, -0.899267808061611660, -0.899245937014731990, --0.899224063719737400, -0.899202188176682630, -0.899180310385622180, -0.899158430346611140, -0.899136548059704110, -0.899114663524955620, -0.899092776742420270, -0.899070887712153270, --0.899048996434208990, -0.899027102908642180, -0.899005207135507470, -0.898983309114860020, -0.898961408846754130, -0.898939506331244860, -0.898917601568386520, -0.898895694558234480, --0.898873785300843050, -0.898851873796267080, -0.898829960044561620, -0.898808044045781300, -0.898786125799980740, -0.898764205307214790, -0.898742282567538410, -0.898720357581006430, --0.898698430347673490, -0.898676500867594320, -0.898654569140824090, -0.898632635167417430, -0.898610698947429180, -0.898588760480913960, -0.898566819767927070, -0.898544876808523130, --0.898522931602756980, -0.898500984150683250, -0.898479034452357330, -0.898457082507833850, -0.898435128317167430, -0.898413171880413360, -0.898391213197626380, -0.898369252268861440, --0.898347289094173050, -0.898325323673616730, -0.898303356007247090, -0.898281386095118980, -0.898259413937287250, -0.898237439533807190, -0.898215462884733530, -0.898193483990121220, --0.898171502850025010, -0.898149519464500280, -0.898127533833601670, -0.898105545957384340, -0.898083555835902820, -0.898061563469212620, -0.898039568857368580, -0.898017572000425420, --0.897995572898438450, -0.897973571551462620, -0.897951567959552890, -0.897929562122763980, -0.897907554041151300, -0.897885543714769810, -0.897863531143674450, -0.897841516327920090, --0.897819499267562100, -0.897797479962655460, -0.897775458413255010, -0.897753434619415810, -0.897731408581193160, -0.897709380298642000, -0.897687349771817300, -0.897665317000774120, --0.897643281985567860, -0.897621244726253380, -0.897599205222885830, -0.897577163475519970, -0.897555119484211520, -0.897533073249015210, -0.897511024769986010, -0.897488974047179420, --0.897466921080650400, -0.897444865870454130, -0.897422808416645460, -0.897400748719279990, -0.897378686778412590, -0.897356622594098540, -0.897334556166392680, -0.897312487495350640, --0.897290416581027480, -0.897268343423478170, -0.897246268022757860, -0.897224190378922090, -0.897202110492025810, -0.897180028362124180, -0.897157943989272400, -0.897135857373525860, --0.897113768514939740, -0.897091677413568990, -0.897069584069469240, -0.897047488482695550, -0.897025390653303110, -0.897003290581347090, -0.896981188266883000, -0.896959083709965800, --0.896936976910651000, -0.896914867868993660, -0.896892756585049190, -0.896870643058872870, -0.896848527290520000, -0.896826409280045530, -0.896804289027505310, -0.896782166532954280, --0.896760041796447970, -0.896737914818041220, -0.896715785597789970, -0.896693654135749200, -0.896671520431974180, -0.896649384486520430, -0.896627246299443350, -0.896605105870798000, --0.896582963200639790, -0.896560818289024450, -0.896538671136006940, -0.896516521741642760, -0.896494370105987090, -0.896472216229095790, -0.896450060111023790, -0.896427901751826740, --0.896405741151559800, -0.896383578310278590, -0.896361413228038420, -0.896339245904894780, -0.896317076340902850, -0.896294904536118380, -0.896272730490596640, -0.896250554204393150, --0.896228375677562970, -0.896206194910162070, -0.896184011902245730, -0.896161826653869120, -0.896139639165088210, -0.896117449435958170, -0.896095257466534510, -0.896073063256872530, --0.896050866807028060, -0.896028668117056390, -0.896006467187013040, -0.895984264016953410, -0.895962058606933230, -0.895939850957008010, -0.895917641067233040, -0.895895428937663830, --0.895873214568356220, -0.895850997959365620, -0.895828779110747540, -0.895806558022557260, -0.895784334694850860, -0.895762109127683500, -0.895739881321110820, -0.895717651275188540, --0.895695418989972070, -0.895673184465517140, -0.895650947701879030, -0.895628708699113820, -0.895606467457276790, -0.895584223976423570, -0.895561978256609550, -0.895539730297890910, --0.895517480100322840, -0.895495227663961060, -0.895472972988861080, -0.895450716075078870, -0.895428456922669810, -0.895406195531689650, -0.895383931902193790, -0.895361666034238280, --0.895339397927878640, -0.895317127583170280, -0.895294855000169370, -0.895272580178931190, -0.895250303119511700, -0.895228023821966200, -0.895205742286350750, -0.895183458512721080, --0.895161172501132700, -0.895138884251641230, -0.895116593764302640, -0.895094301039172650, -0.895072006076306880, -0.895049708875760960, -0.895027409437590960, -0.895005107761852380, --0.894982803848601070, -0.894960497697892540, -0.894938189309782970, -0.894915878684327870, -0.894893565821582970, -0.894871250721604230, -0.894848933384447490, -0.894826613810168370, --0.894804291998822500, -0.894781967950466160, -0.894759641665154760, -0.894737313142944360, -0.894714982383890470, -0.894692649388049380, -0.894670314155476600, -0.894647976686227970, --0.894625636980359350, -0.894603295037926790, -0.894580950858985920, -0.894558604443592700, -0.894536255791802850, -0.894513904903672440, -0.894491551779257320, -0.894469196418613330, --0.894446838821796210, -0.894424478988862130, -0.894402116919866820, -0.894379752614866020, -0.894357386073916130, -0.894335017297072650, -0.894312646284391780, -0.894290273035928900, --0.894267897551740740, -0.894245519831882720, -0.894223139876410890, -0.894200757685381100, -0.894178373258849520, -0.894155986596872010, -0.894133597699504620, -0.894111206566802990, --0.894088813198823500, -0.894066417595622000, -0.894044019757254560, -0.894021619683776800, -0.893999217375245130, -0.893976812831715480, -0.893954406053243610, -0.893931997039885800, --0.893909585791698100, -0.893887172308736490, -0.893864756591056690, -0.893842338638715210, -0.893819918451767890, -0.893797496030270700, -0.893775071374279690, -0.893752644483851060, --0.893730215359040960, -0.893707783999905250, -0.893685350406499880, -0.893662914578881360, -0.893640476517105540, -0.893618036221228600, -0.893595593691306260, -0.893573148927395140, --0.893550701929551220, -0.893528252697830320, -0.893505801232288950, -0.893483347532983090, -0.893460891599968890, -0.893438433433302310, -0.893415973033039770, -0.893393510399237310, --0.893371045531951010, -0.893348578431237050, -0.893326109097151710, -0.893303637529751170, -0.893281163729091500, -0.893258687695228760, -0.893236209428219460, -0.893213728928119680, --0.893191246194985580, -0.893168761228873120, -0.893146274029838930, -0.893123784597939060, -0.893101292933229820, -0.893078799035767150, -0.893056302905607560, -0.893033804542807340, --0.893011303947422340, -0.892988801119509290, -0.892966296059124250, -0.892943788766323410, -0.892921279241162940, -0.892898767483699560, -0.892876253493989140, -0.892853737272088170, --0.892831218818052610, -0.892808698131939190, -0.892786175213803990, -0.892763650063703510, -0.892741122681693590, -0.892718593067831080, -0.892696061222172040, -0.892673527144772880, --0.892650990835689770, -0.892628452294979220, -0.892605911522697750, -0.892583368518901190, -0.892560823283646390, -0.892538275816989520, -0.892515726118987110, -0.892493174189694980, --0.892470620029170210, -0.892448063637468980, -0.892425505014647460, -0.892402944160762050, -0.892380381075869480, -0.892357815760025820, -0.892335248213287800, -0.892312678435711380, --0.892290106427353510, -0.892267532188270260, -0.892244955718518360, -0.892222377018153770, -0.892199796087233430, -0.892177212925813530, -0.892154627533950470, -0.892132039911701090, --0.892109450059121570, -0.892086857976268410, -0.892064263663197910, -0.892041667119967020, -0.892019068346631920, -0.891996467343249110, -0.891973864109874890, -0.891951258646566330, --0.891928650953379590, -0.891906041030371190, -0.891883428877597530, -0.891860814495115450, -0.891838197882981350, -0.891815579041251750, -0.891792957969983040, -0.891770334669232060, --0.891747709139055320, -0.891725081379509120, -0.891702451390650300, -0.891679819172535470, -0.891657184725221040, -0.891634548048763410, -0.891611909143219750, -0.891589268008646130, --0.891566624645099500, -0.891543979052636050, -0.891521331231312830, -0.891498681181186360, -0.891476028902313030, -0.891453374394749590, -0.891430717658552860, -0.891408058693779260, --0.891385397500485620, -0.891362734078728240, -0.891340068428564280, -0.891317400550050040, -0.891294730443242370, -0.891272058108197650, -0.891249383544973070, -0.891226706753624920, --0.891204027734209920, -0.891181346486784930, -0.891158663011406670, -0.891135977308131650, -0.891113289377016500, -0.891090599218118400, -0.891067906831493840, -0.891045212217199340, --0.891022515375291760, -0.890999816305828030, -0.890977115008864780, -0.890954411484458750, -0.890931705732666450, -0.890908997753545150, -0.890886287547151380, -0.890863575113541860, --0.890840860452773110, -0.890818143564902520, -0.890795424449986490, -0.890772703108081760, -0.890749979539245400, -0.890727253743534230, -0.890704525721004780, -0.890681795471713890, --0.890659062995718730, -0.890636328293075820, -0.890613591363842220, -0.890590852208074320, -0.890568110825829540, -0.890545367217164490, -0.890522621382136000, -0.890499873320800830, --0.890477123033216130, -0.890454370519438540, -0.890431615779525120, -0.890408858813532490, -0.890386099621517820, -0.890363338203537970, -0.890340574559649540, -0.890317808689909840, --0.890295040594375700, -0.890272270273103960, -0.890249497726151250, -0.890226722953575080, -0.890203945955432060, -0.890181166731779160, -0.890158385282673210, -0.890135601608171510, --0.890112815708330670, -0.890090027583207990, -0.890067237232859850, -0.890044444657343890, -0.890021649856716830, -0.889998852831035640, -0.889976053580357140, -0.889953252104738750, --0.889930448404237180, -0.889907642478909410, -0.889884834328812380, -0.889862023954003490, -0.889839211354539580, -0.889816396530477390, -0.889793579481874430, -0.889770760208787540, --0.889747938711273670, -0.889725114989389780, -0.889702289043193370, -0.889679460872741190, -0.889656630478090400, -0.889633797859297750, -0.889610963016420840, -0.889588125949516530, --0.889565286658641980, -0.889542445143853940, -0.889519601405209910, -0.889496755442766960, -0.889473907256582150, -0.889451056846712330, -0.889428204213215110, -0.889405349356147350, --0.889382492275565980, -0.889359632971528650, -0.889336771444092180, -0.889313907693313870, -0.889291041719250550, -0.889268173521959750, -0.889245303101498630, -0.889222430457924150, --0.889199555591293490, -0.889176678501664040, -0.889153799189092990, -0.889130917653637390, -0.889108033895354310, -0.889085147914301270, -0.889062259710535430, -0.889039369284113980, --0.889016476635093870, -0.888993581763532830, -0.888970684669487700, -0.888947785353015770, -0.888924883814174560, -0.888901980053021120, -0.888879074069612640, -0.888856165864006400, --0.888833255436259910, -0.888810342786430340, -0.888787427914574880, -0.888764510820750590, -0.888741591505015300, -0.888718669967425990, -0.888695746208039930, -0.888672820226914410, --0.888649892024107050, -0.888626961599674910, -0.888604028953675410, -0.888581094086165590, -0.888558156997203200, -0.888535217686845510, -0.888512276155149490, -0.888489332402173090, --0.888466386427973260, -0.888443438232607520, -0.888420487816133030, -0.888397535178607420, -0.888374580320087980, -0.888351623240632100, -0.888328663940296970, -0.888305702419140420, --0.888282738677219630, -0.888259772714591890, -0.888236804531314590, -0.888213834127445480, -0.888190861503041830, -0.888167886658160930, -0.888144909592860190, -0.888121930307197330, --0.888098948801229640, -0.888075965075014630, -0.888052979128609480, -0.888029990962072020, -0.888007000575459670, -0.887984007968829590, -0.887961013142239630, -0.887938016095747300, --0.887915016829409760, -0.887892015343284550, -0.887869011637429480, -0.887846005711901980, -0.887822997566759310, -0.887799987202058990, -0.887776974617858980, -0.887753959814216450, --0.887730942791189140, -0.887707923548834100, -0.887684902087209630, -0.887661878406372780, -0.887638852506381300, -0.887615824387292470, -0.887592794049164250, -0.887569761492054020, --0.887546726716019310, -0.887523689721117840, -0.887500650507407230, -0.887477609074945000, -0.887454565423788530, -0.887431519553995800, -0.887408471465624290, -0.887385421158731650, --0.887362368633375250, -0.887339313889613070, -0.887316256927502710, -0.887293197747101580, -0.887270136348467410, -0.887247072731657930, -0.887224006896730870, -0.887200938843743850, --0.887177868572754160, -0.887154796083819970, -0.887131721376998920, -0.887108644452348270, -0.887085565309926330, -0.887062483949790370, -0.887039400371998240, -0.887016314576607350, --0.886993226563675960, -0.886970136333261490, -0.886947043885421670, -0.886923949220214000, -0.886900852337696670, -0.886877753237927280, -0.886854651920963470, -0.886831548386862730, --0.886808442635683370, -0.886785334667482990, -0.886762224482319230, -0.886739112080249690, -0.886715997461332560, -0.886692880625625460, -0.886669761573186220, -0.886646640304072250, --0.886623516818341950, -0.886600391116052820, -0.886577263197262600, -0.886554133062029350, -0.886531000710410800, -0.886507866142464680, -0.886484729358248740, -0.886461590357821240, --0.886438449141239700, -0.886415305708562080, -0.886392160059845890, -0.886369012195149630, -0.886345862114530700, -0.886322709818047280, -0.886299555305756770, -0.886276398577717560, --0.886253239633987500, -0.886230078474624210, -0.886206915099685520, -0.886183749509229850, -0.886160581703314690, -0.886137411681997890, -0.886114239445337850, -0.886091064993392070, --0.886067888326218740, -0.886044709443875480, -0.886021528346420670, -0.885998345033911950, -0.885975159506407480, -0.885951971763964790, -0.885928781806642470, -0.885905589634498170, --0.885882395247589830, -0.885859198645975400, -0.885835999829713060, -0.885812798798860770, -0.885789595553476580, -0.885766390093618130, -0.885743182419343910, -0.885719972530711660, --0.885696760427779340, -0.885673546110605340, -0.885650329579247500, -0.885627110833763780, -0.885603889874212010, -0.885580666700650830, -0.885557441313137960, -0.885534213711731470, --0.885510983896489300, -0.885487751867469860, -0.885464517624731000, -0.885441281168330870, -0.885418042498327230, -0.885394801614778790, -0.885371558517743410, -0.885348313207279030, --0.885325065683443710, -0.885301815946295870, -0.885278563995893550, -0.885255309832294610, -0.885232053455557550, -0.885208794865740440, -0.885185534062901350, -0.885162271047098100, --0.885139005818389450, -0.885115738376833330, -0.885092468722487810, -0.885069196855410970, -0.885045922775661300, -0.885022646483296760, -0.884999367978375640, -0.884976087260956000, --0.884952804331096240, -0.884929519188854430, -0.884906231834288960, -0.884882942267457560, -0.884859650488419190, -0.884836356497231580, -0.884813060293953010, -0.884789761878641670, --0.884766461251356160, -0.884743158412154450, -0.884719853361094710, -0.884696546098235450, -0.884673236623634840, -0.884649924937351170, -0.884626611039442510, -0.884603294929967480, --0.884579976608984240, -0.884556656076550980, -0.884533333332725990, -0.884510008377567770, -0.884486681211134610, -0.884463351833484680, -0.884440020244676160, -0.884416686444767900, --0.884393350433817840, -0.884370012211884380, -0.884346671779025820, -0.884323329135300650, -0.884299984280767170, -0.884276637215483550, -0.884253287939508640, -0.884229936452900380, --0.884206582755717290, -0.884183226848017530, -0.884159868729859970, -0.884136508401302760, -0.884113145862404190, -0.884089781113222670, -0.884066414153816820, -0.884043044984244910, --0.884019673604565460, -0.883996300014836530, -0.883972924215117080, -0.883949546205465400, -0.883926165985939760, -0.883902783556598570, -0.883879398917500670, -0.883856012068704120, --0.883832623010267440, -0.883809231742249460, -0.883785838264708250, -0.883762442577702530, -0.883739044681290500, -0.883715644575531090, -0.883692242260482490, -0.883668837736203310, --0.883645431002751840, -0.883622022060187030, -0.883598610908567170, -0.883575197547950770, -0.883551781978396120, -0.883528364199962280, -0.883504944212707530, -0.883481522016690390, --0.883458097611969250, -0.883434670998603070, -0.883411242176650240, -0.883387811146169270, -0.883364377907218560, -0.883340942459857060, -0.883317504804143280, -0.883294064940135510, --0.883270622867892820, -0.883247178587473590, -0.883223732098936340, -0.883200283402339580, -0.883176832497742370, -0.883153379385203000, -0.883129924064780300, -0.883106466536532460, --0.883083006800518660, -0.883059544856797380, -0.883036080705427270, -0.883012614346466720, -0.882989145779974890, -0.882965675006010200, -0.882942202024631250, -0.882918726835896560, --0.882895249439865300, -0.882871769836595990, -0.882848288026147010, -0.882824804008577440, -0.882801317783945990, -0.882777829352311190, -0.882754338713731550, -0.882730845868266330, --0.882707350815973960, -0.882683853556913260, -0.882660354091142630, -0.882636852418721470, -0.882613348539708080, -0.882589842454161280, -0.882566334162139810, -0.882542823663702620, --0.882519310958908340, -0.882495796047815810, -0.882472278930483630, -0.882448759606970890, -0.882425238077336300, -0.882401714341638390, -0.882378188399936430, -0.882354660252288920, --0.882331129898754840, -0.882307597339392680, -0.882284062574261730, -0.882260525603420720, -0.882236986426928270, -0.882213445044843230, -0.882189901457224760, -0.882166355664131490, --0.882142807665622470, -0.882119257461756120, -0.882095705052591830, -0.882072150438188320, -0.882048593618604330, -0.882025034593898800, -0.882001473364130820, -0.881977909929359090, --0.881954344289642700, -0.881930776445040140, -0.881907206395610930, -0.881883634141413690, -0.881860059682507140, -0.881836483018950680, -0.881812904150802930, -0.881789323078122970, --0.881765739800969510, -0.881742154319401950, -0.881718566633478920, -0.881694976743259470, -0.881671384648802460, -0.881647790350167160, -0.881624193847412310, -0.881600595140597080, --0.881576994229780090, -0.881553391115020850, -0.881529785796378080, -0.881506178273910870, -0.881482568547678040, -0.881458956617738990, -0.881435342484152560, -0.881411726146977600, --0.881388107606273510, -0.881364486862099120, -0.881340863914513490, -0.881317238763575480, -0.881293611409344590, -0.881269981851879770, -0.881246350091239860, -0.881222716127483930, --0.881199079960671480, -0.881175441590861250, -0.881151801018112410, -0.881128158242483920, -0.881104513264035270, -0.881080866082825210, -0.881057216698913130, -0.881033565112357640, --0.881009911323218600, -0.880986255331554720, -0.880962597137424970, -0.880938936740888970, -0.880915274142005660, -0.880891609340834100, -0.880867942337433260, -0.880844273131862860, --0.880820601724181750, -0.880796928114449210, -0.880773252302724070, -0.880749574289065970, -0.880725894073533970, -0.880702211656187230, -0.880678527037084820, -0.880654840216286260, --0.880631151193850600, -0.880607459969837030, -0.880583766544304590, -0.880560070917313030, -0.880536373088921190, -0.880512673059188230, -0.880488970828173900, -0.880465266395937030, --0.880441559762537020, -0.880417850928032930, -0.880394139892484380, -0.880370426655950560, -0.880346711218490620, -0.880322993580163640, -0.880299273741029450, -0.880275551701147130, --0.880251827460575840, -0.880228101019374760, -0.880204372377603740, -0.880180641535321720, -0.880156908492588100, -0.880133173249461940, -0.880109435806003200, -0.880085696162270730, --0.880061954318324120, -0.880038210274222350, -0.880014464030025260, -0.879990715585792120, -0.879966964941581890, -0.879943212097454410, -0.879919457053468970, -0.879895699809684850, --0.879871940366161340, -0.879848178722958170, -0.879824414880134520, -0.879800648837749890, -0.879776880595863340, -0.879753110154534830, -0.879729337513823540, -0.879705562673788970, --0.879681785634490180, -0.879658006395987240, -0.879634224958339210, -0.879610441321605710, -0.879586655485845800, -0.879562867451119450, -0.879539077217486030, -0.879515284785004630, --0.879491490153735290, -0.879467693323737200, -0.879443894295069860, -0.879420093067792560, -0.879396289641965260, -0.879372484017647230, -0.879348676194897980, -0.879324866173776920, --0.879301053954343770, -0.879277239536658040, -0.879253422920779240, -0.879229604106766650, -0.879205783094680230, -0.879181959884579370, -0.879158134476523690, -0.879134306870572370, --0.879110477066785580, -0.879086645065222490, -0.879062810865942620, -0.879038974469005920, -0.879015135874471890, -0.878991295082399930, -0.878967452092849430, -0.878943606905880690, --0.878919759521552770, -0.878895909939925610, -0.878872058161058400, -0.878848204185011190, -0.878824348011843500, -0.878800489641615060, -0.878776629074385030, -0.878752766310213710, --0.878728901349160480, -0.878705034191284980, -0.878681164836646710, -0.878657293285305620, -0.878633419537321440, -0.878609543592753670, -0.878585665451661830, -0.878561785114105990, --0.878537902580145750, -0.878514017849840510, -0.878490130923250460, -0.878466241800435090, -0.878442350481454140, -0.878418456966367000, -0.878394561255233960, -0.878370663348114640, --0.878346763245068550, -0.878322860946155300, -0.878298956451435190, -0.878275049760967710, -0.878251140874812600, -0.878227229793029360, -0.878203316515678290, -0.878179401042818890, --0.878155483374511100, -0.878131563510814230, -0.878107641451788770, -0.878083717197494230, -0.878059790747990120, -0.878035862103336730, -0.878011931263593780, -0.877987998228820900, --0.877964062999077920, -0.877940125574424910, -0.877916185954921600, -0.877892244140627830, -0.877868300131603220, -0.877844353927908160, -0.877820405529602170, -0.877796454936745070, --0.877772502149396730, -0.877748547167617300, -0.877724589991466520, -0.877700630621004340, -0.877676669056290270, -0.877652705297384710, -0.877628739344347490, -0.877604771197238120, --0.877580800856117120, -0.877556828321044090, -0.877532853592079000, -0.877508876669281460, -0.877484897552712080, -0.877460916242430390, -0.877436932738496430, -0.877412947040969840, --0.877388959149911220, -0.877364969065380200, -0.877340976787436720, -0.877316982316140530, -0.877292985651552120, -0.877268986793731330, -0.877244985742737900, -0.877220982498632010, --0.877196977061473700, -0.877172969431323060, -0.877148959608239800, -0.877124947592284210, -0.877100933383516360, -0.877076916981996190, -0.877052898387783440, -0.877028877600938730, --0.877004854621521780, -0.876980829449592770, -0.876956802085211320, -0.876932772528438260, -0.876908740779333120, -0.876884706837956270, -0.876860670704367350, -0.876836632378626970, --0.876812591860794970, -0.876788549150931520, -0.876764504249096580, -0.876740457155350540, -0.876716407869753240, -0.876692356392365090, -0.876668302723245700, -0.876644246862455790, --0.876620188810055320, -0.876596128566104140, -0.876572066130662850, -0.876548001503791420, -0.876523934685550010, -0.876499865675998470, -0.876475794475197520, -0.876451721083207120, --0.876427645500087340, -0.876403567725898340, -0.876379487760700520, -0.876355405604554050, -0.876331321257519000, -0.876307234719655550, -0.876283145991024190, -0.876259055071684890, --0.876234961961698030, -0.876210866661123470, -0.876186769170022030, -0.876162669488453670, -0.876138567616478350, -0.876114463554156900, -0.876090357301549270, -0.876066248858715760, --0.876042138225716300, -0.876018025402611870, -0.875993910389462280, -0.875969793186327950, -0.875945673793268930, -0.875921552210345960, -0.875897428437619090, -0.875873302475148610, --0.875849174322994690, -0.875825043981217970, -0.875800911449878820, -0.875776776729037200, -0.875752639818753510, -0.875728500719088480, -0.875704359430102160, -0.875680215951854750, --0.875656070284406950, -0.875631922427819060, -0.875607772382151260, -0.875583620147463940, -0.875559465723817710, -0.875535309111272750, -0.875511150309889690, -0.875486989319728350, --0.875462826140849910, -0.875438660773314340, -0.875414493217182120, -0.875390323472513440, -0.875366151539369140, -0.875341977417809500, -0.875317801107894920, -0.875293622609685680, --0.875269441923242520, -0.875245259048625710, -0.875221073985895880, -0.875196886735113090, -0.875172697296338290, -0.875148505669631760, -0.875124311855053680, -0.875100115852665120, --0.875075917662526240, -0.875051717284697660, -0.875027514719239450, -0.875003309966212670, -0.874979103025677720, -0.874954893897694870, -0.874930682582324650, -0.874906469079627990, --0.874882253389665080, -0.874858035512496520, -0.874833815448182730, -0.874809593196784530, -0.874785368758362440, -0.874761142132976950, -0.874736913320688260, -0.874712682321557630, --0.874688449135645250, -0.874664213763011510, -0.874639976203717360, -0.874615736457823420, -0.874591494525390090, -0.874567250406477760, -0.874543004101147600, -0.874518755609459910, --0.874494504931475400, -0.874470252067254260, -0.874445997016857770, -0.874421739780346320, -0.874397480357780530, -0.874373218749220800, -0.874348954954728200, -0.874324688974363220, --0.874300420808186600, -0.874276150456258620, -0.874251877918640450, -0.874227603195392720, -0.874203326286575710, -0.874179047192250590, -0.874154765912477760, -0.874130482447318170, --0.874106196796832100, -0.874081908961080730, -0.874057618940124570, -0.874033326734024450, -0.874009032342840770, -0.873984735766634710, -0.873960437005466770, -0.873936136059397790, --0.873911832928488170, -0.873887527612799310, -0.873863220112391590, -0.873838910427325750, -0.873814598557662410, -0.873790284503462970, -0.873765968264787700, -0.873741649841697220, --0.873717329234252940, -0.873693006442515240, -0.873668681466545080, -0.873644354306403080, -0.873620024962150300, -0.873595693433847460, -0.873571359721555530, -0.873547023825334780, --0.873522685745246830, -0.873498345481352080, -0.873474003033711590, -0.873449658402385750, -0.873425311587436080, -0.873400962588923080, -0.873376611406907590, -0.873352258041450450, --0.873327902492612940, -0.873303544760455570, -0.873279184845039300, -0.873254822746424960, -0.873230458464673730, -0.873206091999846330, -0.873181723352003610, -0.873157352521206740, --0.873132979507516340, -0.873108604310993690, -0.873084226931699180, -0.873059847369694440, -0.873035465625039970, -0.873011081697796950, -0.872986695588025880, -0.872962307295788390, --0.872937916821145080, -0.872913524164157020, -0.872889129324884830, -0.872864732303390120, -0.872840333099733630, -0.872815931713976200, -0.872791528146178770, -0.872767122396402750, --0.872742714464708860, -0.872718304351158050, -0.872693892055811720, -0.872669477578730590, -0.872645060919975730, -0.872620642079608100, -0.872596221057688970, -0.872571797854279410, --0.872547372469440250, -0.872522944903232570, -0.872498515155717640, -0.872474083226956410, -0.872449649117010060, -0.872425212825939320, -0.872400774353805700, -0.872376333700670250, --0.872351890866593930, -0.872327445851637680, -0.872302998655862920, -0.872278549279330790, -0.872254097722102050, -0.872229643984238300, -0.872205188065800390, -0.872180729966849590, --0.872156269687446640, -0.872131807227653270, -0.872107342587530420, -0.872082875767139170, -0.872058406766540560, -0.872033935585796120, -0.872009462224966890, -0.871984986684113950, --0.871960508963298350, -0.871936029062581720, -0.871911546982024890, -0.871887062721689370, -0.871862576281635880, -0.871838087661926160, -0.871813596862621280, -0.871789103883782280, --0.871764608725470460, -0.871740111387747210, -0.871715611870673810, -0.871691110174311110, -0.871666606298720730, -0.871642100243963940, -0.871617592010101920, -0.871593081597195730, --0.871568569005306990, -0.871544054234496880, -0.871519537284826560, -0.871495018156357220, -0.871470496849150570, -0.871445973363267680, -0.871421447698769840, -0.871396919855718100, --0.871372389834174420, -0.871347857634199640, -0.871323323255855260, -0.871298786699202350, -0.871274247964302750, -0.871249707051217400, -0.871225163960007710, -0.871200618690735280, --0.871176071243461190, -0.871151521618247050, -0.871126969815153920, -0.871102415834243530, -0.871077859675577050, -0.871053301339215990, -0.871028740825221410, -0.871004178133655160, --0.870979613264578620, -0.870955046218052860, -0.870930476994139390, -0.870905905592899930, -0.870881332014395660, -0.870856756258688080, -0.870832178325838480, -0.870807598215908580, --0.870783015928959680, -0.870758431465052940, -0.870733844824250420, -0.870709256006613310, -0.870684665012203100, -0.870660071841080960, -0.870635476493308860, -0.870610878968947950, --0.870586279268059980, -0.870561677390706110, -0.870537073336948190, -0.870512467106847600, -0.870487858700465860, -0.870463248117864350, -0.870438635359104820, -0.870414020424248760, --0.870389403313357570, -0.870364784026492640, -0.870340162563716050, -0.870315538925089060, -0.870290913110672970, -0.870266285120529840, -0.870241654954720940, -0.870217022613308020, --0.870192388096352240, -0.870167751403915670, -0.870143112536059800, -0.870118471492846160, -0.870093828274336010, -0.870069182880591650, -0.870044535311674250, -0.870019885567645530, --0.869995233648566790, -0.869970579554500300, -0.869945923285507350, -0.869921264841649560, -0.869896604222988420, -0.869871941429586020, -0.869847276461503730, -0.869822609318803170, --0.869797940001545980, -0.869773268509794080, -0.869748594843609110, -0.869723919003052350, -0.869699240988185960, -0.869674560799071570, -0.869649878435770800, -0.869625193898345030, --0.869600507186856550, -0.869575818301366770, -0.869551127241937500, -0.869526434008630060, -0.869501738601506920, -0.869477041020629280, -0.869452341266059080, -0.869427639337857940, --0.869402935236087800, -0.869378228960810300, -0.869353520512087250, -0.869328809889980290, -0.869304097094551360, -0.869279382125862310, -0.869254664983974520, -0.869229945668950400, --0.869205224180851220, -0.869180500519739160, -0.869155774685675510, -0.869131046678722760, -0.869106316498942320, -0.869081584146396020, -0.869056849621145600, -0.869032112923253330, --0.869007374052780720, -0.868982633009789730, -0.868957889794341850, -0.868933144406499600, -0.868908396846324370, -0.868883647113878220, -0.868858895209222660, -0.868834141132420080, --0.868809384883532210, -0.868784626462620670, -0.868759865869747740, -0.868735103104975150, -0.868710338168364850, -0.868685571059978460, -0.868660801779878260, -0.868636030328126200, --0.868611256704784010, -0.868586480909913420, -0.868561702943576930, -0.868536922805836050, -0.868512140496752960, -0.868487356016389270, -0.868462569364807480, -0.868437780542069220, --0.868412989548236540, -0.868388196383371060, -0.868363401047535400, -0.868338603540791290, -0.868313803863200560, -0.868289002014825170, -0.868264197995727400, -0.868239391805969210, --0.868214583445612310, -0.868189772914719220, -0.868164960213351660, -0.868140145341571690, -0.868115328299441160, -0.868090509087022450, -0.868065687704377530, -0.868040864151568450, --0.868016038428656930, -0.867991210535705490, -0.867966380472776080, -0.867941548239930750, -0.867916713837231240, -0.867891877264740260, -0.867867038522519450, -0.867842197610631190, --0.867817354529137110, -0.867792509278099920, -0.867767661857581470, -0.867742812267643600, -0.867717960508349040, -0.867693106579759400, -0.867668250481937080, -0.867643392214943910, --0.867618531778842520, -0.867593669173694740, -0.867568804399562850, -0.867543937456508710, -0.867519068344594910, -0.867494197063883420, -0.867469323614436520, -0.867444447996316040, --0.867419570209584710, -0.867394690254304380, -0.867369808130537320, -0.867344923838345610, -0.867320037377791730, -0.867295148748937760, -0.867270257951845760, -0.867245364986578340, --0.867220469853197450, -0.867195572551765380, -0.867170673082344190, -0.867145771444996490, -0.867120867639784470, -0.867095961666770170, -0.867071053526015770, -0.867046143217584000, --0.867021230741536920, -0.866996316097936700, -0.866971399286845410, -0.866946480308325880, -0.866921559162440180, -0.866896635849250590, -0.866871710368819160, -0.866846782721208630, --0.866821852906481280, -0.866796920924698950, -0.866771986775924600, -0.866747050460220270, -0.866722111977648370, -0.866697171328270840, -0.866672228512150640, -0.866647283529349940, --0.866622336379931020, -0.866597387063956060, -0.866572435581487780, -0.866547481932588460, -0.866522526117320390, -0.866497568135745740, -0.866472607987927470, -0.866447645673927740, --0.866422681193808830, -0.866397714547632920, -0.866372745735463080, -0.866347774757361360, -0.866322801613390150, -0.866297826303611630, -0.866272848828088860, -0.866247869186884010, --0.866222887380059260, -0.866197903407677440, -0.866172917269800950, -0.866147928966492060, -0.866122938497813190, -0.866097945863827160, -0.866072951064596360, -0.866047954100183090, --0.866022954970649740, -0.865997953676059250, -0.865972950216473800, -0.865947944591956010, -0.865922936802568160, -0.865897926848373190, -0.865872914729433400, -0.865847900445811390, --0.865822883997569240, -0.865797865384770220, -0.865772844607476610, -0.865747821665750480, -0.865722796559655120, -0.865697769289252790, -0.865672739854606020, -0.865647708255777190, --0.865622674492829260, -0.865597638565824720, -0.865572600474825980, -0.865547560219895540, -0.865522517801096460, -0.865497473218491130, -0.865472426472142060, -0.865447377562111760, --0.865422326488463180, -0.865397273251258810, -0.865372217850561180, -0.865347160286432880, -0.865322100558936880, -0.865297038668135570, -0.865271974614091550, -0.865246908396867690, --0.865221840016526690, -0.865196769473130960, -0.865171696766743210, -0.865146621897426420, -0.865121544865242950, -0.865096465670255780, -0.865071384312527060, -0.865046300792120190, --0.865021215109097570, -0.864996127263521930, -0.864971037255455770, -0.864945945084962140, -0.864920850752103790, -0.864895754256943210, -0.864870655599543010, -0.864845554779966500, --0.864820451798275940, -0.864795346654534390, -0.864770239348804150, -0.864745129881148600, -0.864720018251630250, -0.864694904460311610, -0.864669788507255950, -0.864644670392525790, --0.864619550116183970, -0.864594427678292980, -0.864569303078916220, -0.864544176318116200, -0.864519047395955640, -0.864493916312497390, -0.864468783067804500, -0.864443647661939600, --0.864418510094965730, -0.864393370366945190, -0.864368228477941590, -0.864343084428017330, -0.864317938217235350, -0.864292789845658380, -0.864267639313349600, -0.864242486620371730, --0.864217331766787390, -0.864192174752660080, -0.864167015578052200, -0.864141854243026810, -0.864116690747646520, -0.864091525091974840, -0.864066357276074280, -0.864041187300007780, --0.864016015163838190, -0.863990840867628670, -0.863965664411442180, -0.863940485795341440, -0.863915305019389290, -0.863890122083649130, -0.863864936988183670, -0.863839749733055770, --0.863814560318328370, -0.863789368744064760, -0.863764175010327650, -0.863738979117180010, -0.863713781064685100, -0.863688580852905790, -0.863663378481904890, -0.863638173951745470, --0.863612967262490700, -0.863587758414203540, -0.863562547406947050, -0.863537334240783940, -0.863512118915777730, -0.863486901431991250, -0.863461681789487460, -0.863436459988329300, --0.863411236028580160, -0.863386009910302900, -0.863360781633560670, -0.863335551198416320, -0.863310318604933240, -0.863285083853174370, -0.863259846943202570, -0.863234607875081330, --0.863209366648873600, -0.863184123264642560, -0.863158877722450920, -0.863133630022362320, -0.863108380164439580, -0.863083128148745880, -0.863057873975344170, -0.863032617644298060, --0.863007359155670390, -0.862982098509524230, -0.862956835705922630, -0.862931570744929210, -0.862906303626606920, -0.862881034351018820, -0.862855762918227850, -0.862830489328297760, --0.862805213581291470, -0.862779935677272070, -0.862754655616302600, -0.862729373398446800, -0.862704089023767500, -0.862678802492327760, -0.862653513804191310, -0.862628222959420990, --0.862602929958080190, -0.862577634800231750, -0.862552337485939510, -0.862527038015266420, -0.862501736388275760, -0.862476432605030490, -0.862451126665594310, -0.862425818570030420, --0.862400508318401980, -0.862375195910771940, -0.862349881347204250, -0.862324564627761750, -0.862299245752507940, -0.862273924721505770, -0.862248601534818970, -0.862223276192510710, --0.862197948694644060, -0.862172619041282730, -0.862147287232489790, -0.862121953268328740, -0.862096617148862430, -0.862071278874154910, -0.862045938444269240, -0.862020595859268600, --0.861995251119216380, -0.861969904224176190, -0.861944555174211200, -0.861919203969384930, -0.861893850609760310, -0.861868495095401310, -0.861843137426371090, -0.861817777602733040, --0.861792415624550330, -0.861767051491886820, -0.861741685204805650, -0.861716316763370130, -0.861690946167643860, -0.861665573417690340, -0.861640198513572870, -0.861614821455354730, --0.861589442243099750, -0.861564060876871100, -0.861538677356732290, -0.861513291682746600, -0.861487903854977870, -0.861462513873489490, -0.861437121738344750, -0.861411727449607030, --0.861386331007340080, -0.861360932411607380, -0.861335531662472450, -0.861310128759998350, -0.861284723704249130, -0.861259316495288200, -0.861233907133178930, -0.861208495617984630, --0.861183081949769450, -0.861157666128596460, -0.861132248154529050, -0.861106828027631280, -0.861081405747966430, -0.861055981315598130, -0.861030554730589650, -0.861005125993004940, --0.860979695102907390, -0.860954262060360740, -0.860928826865428040, -0.860903389518173580, -0.860877950018660740, -0.860852508366952930, -0.860827064563113640, -0.860801618607206830, --0.860776170499296110, -0.860750720239444880, -0.860725267827716630, -0.860699813264175440, -0.860674356548884690, -0.860648897681907890, -0.860623436663309090, -0.860597973493151590, --0.860572508171499220, -0.860547040698415370, -0.860521571073964210, -0.860496099298209030, -0.860470625371213550, -0.860445149293041390, -0.860419671063756500, -0.860394190683422490, --0.860368708152102980, -0.860343223469861470, -0.860317736636762140, -0.860292247652868490, -0.860266756518244250, -0.860241263232952800, -0.860215767797058440, -0.860190270210624660, --0.860164770473714980, -0.860139268586393670, -0.860113764548724120, -0.860088258360770190, -0.860062750022595360, -0.860037239534263920, -0.860011726895839380, -0.859986212107385460, --0.859960695168965890, -0.859935176080644740, -0.859909654842485600, -0.859884131454552340, -0.859858605916908660, -0.859833078229618520, -0.859807548392745760, -0.859782016406354210, --0.859756482270507270, -0.859730945985269450, -0.859705407550704130, -0.859679866966875150, -0.859654324233846800, -0.859628779351682470, -0.859603232320446330, -0.859577683140201780, --0.859552131811013310, -0.859526578332944550, -0.859501022706059330, -0.859475464930421260, -0.859449905006094860, -0.859424342933143630, -0.859398778711631510, -0.859373212341622230, --0.859347643823180190, -0.859322073156368990, -0.859296500341252710, -0.859270925377894850, -0.859245348266359900, -0.859219769006711600, -0.859194187599014000, -0.859168604043330510, --0.859143018339725840, -0.859117430488263610, -0.859091840489007550, -0.859066248342022170, -0.859040654047371180, -0.859015057605118540, -0.858989459015327970, -0.858963858278063990, --0.858938255393390420, -0.858912650361371210, -0.858887043182070100, -0.858861433855551580, -0.858835822381879610, -0.858810208761118020, -0.858784592993330540, -0.858758975078582010, --0.858733355016935930, -0.858707732808456470, -0.858682108453207470, -0.858656481951253440, -0.858630853302658200, -0.858605222507485610, -0.858579589565800160, -0.858553954477665800, --0.858528317243146490, -0.858502677862306160, -0.858477036335209440, -0.858451392661920050, -0.858425746842502170, -0.858400098877019730, -0.858374448765537260, -0.858348796508118680, --0.858323142104828070, -0.858297485555729490, -0.858271826860887320, -0.858246166020365630, -0.858220503034228480, -0.858194837902539920, -0.858169170625364350, -0.858143501202766060, --0.858117829634808650, -0.858092155921556850, -0.858066480063074730, -0.858040802059426460, -0.858015121910675860, -0.857989439616887780, -0.857963755178126060, -0.857938068594454980, --0.857912379865938380, -0.857886688992641200, -0.857860995974627280, -0.857835300811960800, -0.857809603504705920, -0.857783904052927150, -0.857758202456688770, -0.857732498716054730, --0.857706792831089300, -0.857681084801857120, -0.857655374628422230, -0.857629662310848810, -0.857603947849201130, -0.857578231243543710, -0.857552512493940820, -0.857526791600456420, --0.857501068563155110, -0.857475343382101300, -0.857449616057359030, -0.857423886588992490, -0.857398154977066510, -0.857372421221645140, -0.857346685322792680, -0.857320947280573400, --0.857295207095051800, -0.857269464766292290, -0.857243720294359140, -0.857217973679316400, -0.857192224921229040, -0.857166474020161000, -0.857140720976176770, -0.857114965789340650, --0.857089208459717260, -0.857063448987370860, -0.857037687372365520, -0.857011923614766300, -0.856986157714637260, -0.856960389672042800, -0.856934619487047190, -0.856908847159715160, --0.856883072690111100, -0.856857296078299300, -0.856831517324344150, -0.856805736428310260, -0.856779953390262140, -0.856754168210264070, -0.856728380888380440, -0.856702591424676090, --0.856676799819215180, -0.856651006072062350, -0.856625210183281640, -0.856599412152938220, -0.856573611981096270, -0.856547809667820070, -0.856522005213174680, -0.856496198617224150, --0.856470389880033100, -0.856444579001665930, -0.856418765982187470, -0.856392950821662110, -0.856367133520154370, -0.856341314077728620, -0.856315492494449830, -0.856289668770382150, --0.856263842905590430, -0.856238014900138960, -0.856212184754092550, -0.856186352467515730, -0.856160518040472880, -0.856134681473028740, -0.856108842765248010, -0.856083001917195110, --0.856057158928934530, -0.856031313800531320, -0.856005466532049790, -0.855979617123554640, -0.855953765575110160, -0.855927911886781520, -0.855902056058633120, -0.855876198090729570, --0.855850337983135260, -0.855824475735915470, -0.855798611349134370, -0.855772744822856700, -0.855746876157146950, -0.855721005352070410, -0.855695132407691130, -0.855669257324074170, --0.855643380101283820, -0.855617500739385140, -0.855591619238442850, -0.855565735598521450, -0.855539849819685450, -0.855513961902000130, -0.855488071845529880, -0.855462179650339220, --0.855436285316493290, -0.855410388844056620, -0.855384490233094040, -0.855358589483670050, -0.855332686595849820, -0.855306781569697750, -0.855280874405278890, -0.855254965102657420, --0.855229053661898940, -0.855203140083067750, -0.855177224366228780, -0.855151306511446440, -0.855125386518786110, -0.855099464388312190, -0.855073540120089740, -0.855047613714183140, --0.855021685170657800, -0.854995754489578320, -0.854969821671009100, -0.854943886715015530, -0.854917949621662340, -0.854892010391014150, -0.854866069023135890, -0.854840125518092520, --0.854814179875948990, -0.854788232096769800, -0.854762282180620000, -0.854736330127564670, -0.854710375937668410, -0.854684419610996390, -0.854658461147612900, -0.854632500547583660, --0.854606537810973070, -0.854580572937846170, -0.854554605928267600, -0.854528636782302730, -0.854502665500016300, -0.854476692081472920, -0.854450716526738100, -0.854424738835876440, --0.854398759008953010, -0.854372777046032320, -0.854346792947180080, -0.854320806712460690, -0.854294818341939430, -0.854268827835680810, -0.854242835193750440, -0.854216840416212930, --0.854190843503133230, -0.854164844454576300, -0.854138843270607520, -0.854112839951291500, -0.854086834496693430, -0.854060826906878120, -0.854034817181910990, -0.854008805321856750, --0.853982791326780450, -0.853956775196746950, -0.853930756931821740, -0.853904736532069770, -0.853878713997555660, -0.853852689328344900, -0.853826662524502570, -0.853800633586093480, --0.853774602513182600, -0.853748569305835430, -0.853722533964116790, -0.853696496488091870, -0.853670456877825500, -0.853644415133383290, -0.853618371254829870, -0.853592325242230610, --0.853566277095650360, -0.853540226815154620, -0.853514174400808230, -0.853488119852676470, -0.853462063170824180, -0.853436004355316970, -0.853409943406219780, -0.853383880323597350, --0.853357815107515630, -0.853331747758039330, -0.853305678275233630, -0.853279606659163470, -0.853253532909894590, -0.853227457027491810, -0.853201379012020420, -0.853175298863545370, --0.853149216582132270, -0.853123132167846190, -0.853097045620752280, -0.853070956940915390, -0.853044866128401470, -0.853018773183275350, -0.852992678105602310, -0.852966580895447300, --0.852940481552876160, -0.852914380077953730, -0.852888276470745170, -0.852862170731316090, -0.852836062859731680, -0.852809952856056990, -0.852783840720357290, -0.852757726452698210, --0.852731610053144800, -0.852705491521762340, -0.852679370858615890, -0.852653248063771300, -0.852627123137293610, -0.852600996079248000, -0.852574866889699750, -0.852548735568714580, --0.852522602116357550, -0.852496466532694060, -0.852470328817789060, -0.852444188971708590, -0.852418046994517620, -0.852391902886281530, -0.852365756647065380, -0.852339608276935110, --0.852313457775955910, -0.852287305144192710, -0.852261150381711570, -0.852234993488577450, -0.852208834464855960, -0.852182673310612150, -0.852156510025911750, -0.852130344610820160, --0.852104177065402760, -0.852078007389724610, -0.852051835583851780, -0.852025661647849210, -0.851999485581782620, -0.851973307385716970, -0.851947127059718420, -0.851920944603851930, --0.851894760018183090, -0.851868573302777210, -0.851842384457700000, -0.851816193483016960, -0.851790000378793160, -0.851763805145094530, -0.851737607781986480, -0.851711408289534290, --0.851685206667803450, -0.851659002916859810, -0.851632797036768640, -0.851606589027595450, -0.851580378889405630, -0.851554166622265130, -0.851527952226239120, -0.851501735701393200, --0.851475517047792780, -0.851449296265503810, -0.851423073354591550, -0.851396848315121630, -0.851370621147159330, -0.851344391850770820, -0.851318160426021150, -0.851291926872976060, --0.851265691191701260, -0.851239453382262260, -0.851213213444724560, -0.851186971379153670, -0.851160727185615530, -0.851134480864175650, -0.851108232414899520, -0.851081981837852550, --0.851055729133100900, -0.851029474300709850, -0.851003217340745240, -0.850976958253272240, -0.850950697038357130, -0.850924433696065300, -0.850898168226462360, -0.850871900629613820, --0.850845630905585630, -0.850819359054443500, -0.850793085076252620, -0.850766808971079370, -0.850740530738989030, -0.850714250380047440, -0.850687967894319890, -0.850661683281872750, --0.850635396542771320, -0.850609107677081420, -0.850582816684868570, -0.850556523566198820, -0.850530228321137890, -0.850503930949751300, -0.850477631452104640, -0.850451329828264210, --0.850425026078295400, -0.850398720202264040, -0.850372412200235630, -0.850346102072276340, -0.850319789818451910, -0.850293475438828050, -0.850267158933470160, -0.850240840302444620, --0.850214519545817060, -0.850188196663652860, -0.850161871656018530, -0.850135544522979460, -0.850109215264601480, -0.850082883880950320, -0.850056550372092050, -0.850030214738092480, --0.850003876979017470, -0.849977537094932400, -0.849951195085903780, -0.849924850951997100, -0.849898504693278320, -0.849872156309813160, -0.849845805801667690, -0.849819453168907830, --0.849793098411599220, -0.849766741529807800, -0.849740382523599620, -0.849714021393040530, -0.849687658138196130, -0.849661292759132820, -0.849634925255916330, -0.849608555628612480, --0.849582183877287010, -0.849555810002006310, -0.849529434002836090, -0.849503055879842320, -0.849476675633090590, -0.849450293262647430, -0.849423908768578650, -0.849397522150949990, --0.849371133409827280, -0.849344742545277030, -0.849318349557364850, -0.849291954446156900, -0.849265557211718810, -0.849239157854116970, -0.849212756373417310, -0.849186352769685460, --0.849159947042988030, -0.849133539193390740, -0.849107129220959660, -0.849080717125760390, -0.849054302907859660, -0.849027886567323090, -0.849001468104216840, -0.848975047518606640, --0.848948624810559100, -0.848922199980140070, -0.848895773027415480, -0.848869343952451170, -0.848842912755313760, -0.848816479436069080, -0.848790043994783310, -0.848763606431522040, --0.848737166746352020, -0.848710724939339190, -0.848684281010549380, -0.848657834960048760, -0.848631386787903730, -0.848604936494180230, -0.848578484078944210, -0.848552029542262170, --0.848525572884200050, -0.848499114104824040, -0.848472653204199960, -0.848446190182394530, -0.848419725039473600, -0.848393257775503340, -0.848366788390549800, -0.848340316884679480, --0.848313843257958330, -0.848287367510452530, -0.848260889642228120, -0.848234409653351730, -0.848207927543889300, -0.848181443313907100, -0.848154956963470990, -0.848128468492647780, --0.848101977901503430, -0.848075485190103780, -0.848048990358515780, -0.848022493406805240, -0.847995994335038470, -0.847969493143281410, -0.847942989831600990, -0.847916484400062950, --0.847889976848733800, -0.847863467177679460, -0.847836955386966680, -0.847810441476661510, -0.847783925446830230, -0.847757407297538900, -0.847730887028854350, -0.847704364640842530, --0.847677840133569730, -0.847651313507102210, -0.847624784761506600, -0.847598253896848950, -0.847571720913195550, -0.847545185810613000, -0.847518648589167590, -0.847492109248925480, --0.847465567789952860, -0.847439024212316540, -0.847412478516082700, -0.847385930701317620, -0.847359380768087480, -0.847332828716459210, -0.847306274546498760, -0.847279718258272750, --0.847253159851847130, -0.847226599327288830, -0.847200036684664040, -0.847173471924039250, -0.847146905045480400, -0.847120336049054570, -0.847093764934828020, -0.847067191702866710, --0.847040616353237690, -0.847014038886007010, -0.846987459301241420, -0.846960877599006840, -0.846934293779370350, -0.846907707842398110, -0.846881119788156500, -0.846854529616712040, --0.846827937328131330, -0.846801342922480880, -0.846774746399826970, -0.846748147760236100, -0.846721547003775000, -0.846694944130510050, -0.846668339140507760, -0.846641732033834420, --0.846615122810556840, -0.846588511470741660, -0.846561898014455030, -0.846535282441763460, -0.846508664752734010, -0.846482044947432840, -0.846455423025926250, -0.846428798988281380, --0.846402172834564540, -0.846375544564842320, -0.846348914179180900, -0.846322281677647560, -0.846295647060308460, -0.846269010327230120, -0.846242371478479140, -0.846215730514122470, --0.846189087434226490, -0.846162442238857730, -0.846135794928082660, -0.846109145501968250, -0.846082493960581110, -0.846055840303987730, -0.846029184532254400, -0.846002526645448390, --0.845975866643636110, -0.845949204526883940, -0.845922540295258930, -0.845895873948827590, -0.845869205487656540, -0.845842534911812270, -0.845815862221361960, -0.845789187416371880, --0.845762510496908870, -0.845735831463039430, -0.845709150314830630, -0.845682467052348840, -0.845655781675661020, -0.845629094184833340, -0.845602404579933300, -0.845575712861027280, --0.845549019028181800, -0.845522323081463690, -0.845495625020940000, -0.845468924846677240, -0.845442222558741910, -0.845415518157201170, -0.845388811642121760, -0.845362103013570290, --0.845335392271613360, -0.845308679416318150, -0.845281964447751170, -0.845255247365979350, -0.845228528171069190, -0.845201806863087990, -0.845175083442102130, -0.845148357908178660, --0.845121630261384090, -0.845094900501785600, -0.845068168629449890, -0.845041434644443810, -0.845014698546833750, -0.844987960336687330, -0.844961220014071030, -0.844934477579051600, --0.844907733031695750, -0.844880986372070760, -0.844854237600243470, -0.844827486716280160, -0.844800733720248440, -0.844773978612214930, -0.844747221392246450, -0.844720462060409630, --0.844693700616771960, -0.844666937061399950, -0.844640171394360650, -0.844613403615720790, -0.844586633725547540, -0.844559861723907730, -0.844533087610868320, -0.844506311386495790, --0.844479533050857880, -0.844452752604021080, -0.844425970046052350, -0.844399185377018520, -0.844372398596986980, -0.844345609706024460, -0.844318818704197670, -0.844292025591574010, --0.844265230368220320, -0.844238433034203540, -0.844211633589590390, -0.844184832034448500, -0.844158028368844460, -0.844131222592845450, -0.844104414706517980, -0.844077604709929870, --0.844050792603147640, -0.844023978386238550, -0.843997162059269110, -0.843970343622307160, -0.843943523075419310, -0.843916700418672620, -0.843889875652133910, -0.843863048775870820, --0.843836219789950050, -0.843809388694438440, -0.843782555489403730, -0.843755720174912520, -0.843728882751032080, -0.843702043217829270, -0.843675201575371460, -0.843648357823725710, --0.843621511962958980, -0.843594663993138320, -0.843567813914331220, -0.843540961726604640, -0.843514107430025530, -0.843487251024661040, -0.843460392510578580, -0.843433531887845090, --0.843406669156527840, -0.843379804316693680, -0.843352937368410330, -0.843326068311744500, -0.843299197146763380, -0.843272323873534460, -0.843245448492124680, -0.843218571002601340, --0.843191691405031250, -0.843164809699482260, -0.843137925886021210, -0.843111039964715370, -0.843084151935631580, -0.843057261798837780, -0.843030369554400800, -0.843003475202387940, --0.842976578742866020, -0.842949680175902990, -0.842922779501565690, -0.842895876719921610, -0.842868971831037370, -0.842842064834981140, -0.842815155731819640, -0.842788244521620270, --0.842761331204450070, -0.842734415780376670, -0.842707498249467330, -0.842680578611789020, -0.842653656867409450, -0.842626733016395790, -0.842599807058815320, -0.842572878994734990, --0.842545948824222850, -0.842519016547345730, -0.842492082164171040, -0.842465145674766050, -0.842438207079198250, -0.842411266377535050, -0.842384323569843610, -0.842357378656191200, --0.842330431636645560, -0.842303482511273850, -0.842276531280143460, -0.842249577943321450, -0.842222622500875760, -0.842195664952873460, -0.842168705299381810, -0.842141743540468670, --0.842114779676201080, -0.842087813706646650, -0.842060845631872330, -0.842033875451946190, -0.842006903166935380, -0.841979928776907300, -0.841952952281929120, -0.841925973682068900, --0.841898992977393680, -0.841872010167970970, -0.841845025253867950, -0.841818038235152670, -0.841791049111892290, -0.841764057884154320, -0.841737064552005920, -0.841710069115515160, --0.841683071574749090, -0.841656071929775210, -0.841629070180661350, -0.841602066327474920, -0.841575060370283180, -0.841548052309153640, -0.841521042144154130, -0.841494029875352050, --0.841467015502815000, -0.841439999026610040, -0.841412980446805350, -0.841385959763468190, -0.841358936976666190, -0.841331912086466630, -0.841304885092937440, -0.841277855996146130, --0.841250824796160090, -0.841223791493046820, -0.841196756086874280, -0.841169718577709840, -0.841142678965621120, -0.841115637250675400, -0.841088593432940960, -0.841061547512484960, --0.841034499489374810, -0.841007449363678660, -0.840980397135463910, -0.840953342804798280, -0.840926286371748930, -0.840899227836384040, -0.840872167198771230, -0.840845104458977980, --0.840818039617071690, -0.840790972673120530, -0.840763903627191890, -0.840736832479353600, -0.840709759229672950, -0.840682683878218100, -0.840655606425056550, -0.840628526870256020, --0.840601445213883910, -0.840574361456008500, -0.840547275596697060, -0.840520187636017320, -0.840493097574037230, -0.840466005410824500, -0.840438911146446750, -0.840411814780971380, --0.840384716314466760, -0.840357615747000410, -0.840330513078639930, -0.840303408309453050, -0.840276301439507820, -0.840249192468871750, -0.840222081397612790, -0.840194968225798420, --0.840167852953496830, -0.840140735580775620, -0.840113616107702520, -0.840086494534345140, -0.840059370860771870, -0.840032245087050100, -0.840005117213247440, -0.839977987239432290, --0.839950855165672140, -0.839923720992034940, -0.839896584718588080, -0.839869446345400060, -0.839842305872538390, -0.839815163300071000, -0.839788018628065400, -0.839760871856590100, --0.839733722985712470, -0.839706572015500700, -0.839679418946022160, -0.839652263777345250, -0.839625106509537810, -0.839597947142667560, -0.839570785676802210, -0.839543622112010060, --0.839516456448358930, -0.839489288685916430, -0.839462118824750860, -0.839434946864930140, -0.839407772806521900, -0.839380596649594080, -0.839353418394214960, -0.839326238040452370, --0.839299055588374140, -0.839271871038048010, -0.839244684389542470, -0.839217495642925250, -0.839190304798264290, -0.839163111855627200, -0.839135916815082710, -0.839108719676698310, --0.839081520440542180, -0.839054319106682040, -0.839027115675186290, -0.838999910146122850, -0.838972702519559580, -0.838945492795564180, -0.838918280974205510, -0.838891067055550940, --0.838863851039668540, -0.838836632926626800, -0.838809412716493450, -0.838782190409336550, -0.838754966005223920, -0.838727739504224190, -0.838700510906405070, -0.838673280211834630, --0.838646047420580800, -0.838618812532712090, -0.838591575548296330, -0.838564336467401690, -0.838537095290095900, -0.838509852016447680, -0.838482606646524740, -0.838455359180395380, --0.838428109618127190, -0.838400857959789140, -0.838373604205448930, -0.838346348355174410, -0.838319090409034300, -0.838291830367096540, -0.838264568229429070, -0.838237303996099970, --0.838210037667177940, -0.838182769242730720, -0.838155498722826690, -0.838128226107533570, -0.838100951396920090, -0.838073674591054310, -0.838046395690004390, -0.838019114693838160, --0.837991831602624360, -0.837964546416431030, -0.837937259135326350, -0.837909969759378260, -0.837882678288655480, -0.837855384723225960, -0.837828089063157870, -0.837800791308519700, --0.837773491459379520, -0.837746189515805710, -0.837718885477866100, -0.837691579345629540, -0.837664271119164080, -0.837636960798537890, -0.837609648383819130, -0.837582333875076410, --0.837555017272377910, -0.837527698575791790, -0.837500377785386220, -0.837473054901230030, -0.837445729923391060, -0.837418402851937920, -0.837391073686938440, -0.837363742428461450, --0.837336409076575250, -0.837309073631347990, -0.837281736092847730, -0.837254396461143410, -0.837227054736303100, -0.837199710918394960, -0.837172365007487710, -0.837145017003649630, --0.837117666906948890, -0.837090314717453880, -0.837062960435233210, -0.837035604060355260, -0.837008245592888220, -0.836980885032900250, -0.836953522380460390, -0.836926157635636820, --0.836898790798497720, -0.836871421869111450, -0.836844050847546870, -0.836816677733872140, -0.836789302528155750, -0.836761925230465780, -0.836734545840871370, -0.836707164359440480, --0.836679780786241500, -0.836652395121343260, -0.836625007364814040, -0.836597617516722350, -0.836570225577136340, -0.836542831546125080, -0.836515435423756730, -0.836488037210099680, --0.836460636905222430, -0.836433234509193710, -0.836405830022081910, -0.836378423443955630, -0.836351014774883050, -0.836323604014933110, -0.836296191164174090, -0.836268776222674700, --0.836241359190503130, -0.836213940067728420, -0.836186518854418750, -0.836159095550642610, -0.836131670156469050, -0.836104242671966260, -0.836076813097202830, -0.836049381432247050, --0.836021947677168200, -0.835994511832034440, -0.835967073896914380, -0.835939633871876420, -0.835912191756989610, -0.835884747552322340, -0.835857301257943110, -0.835829852873920530, --0.835802402400323440, -0.835774949837220450, -0.835747495184679940, -0.835720038442770540, -0.835692579611561290, -0.835665118691120590, -0.835637655681516820, -0.835610190582819270, --0.835582723395096090, -0.835555254118416140, -0.835527782752847890, -0.835500309298460310, -0.835472833755322000, -0.835445356123501680, -0.835417876403067640, -0.835390394594089150, --0.835362910696634710, -0.835335424710773040, -0.835307936636572550, -0.835280446474102380, -0.835252954223431150, -0.835225459884627490, -0.835197963457759980, -0.835170464942897820, --0.835142964340109480, -0.835115461649463710, -0.835087956871029100, -0.835060450004874830, -0.835032941051069400, -0.835005430009681300, -0.834977916880780050, -0.834950401664433910, --0.834922884360711710, -0.834895364969682090, -0.834867843491414300, -0.834840319925976960, -0.834812794273438800, -0.834785266533868420, -0.834757736707335110, -0.834730204793907470, --0.834702670793654230, -0.834675134706644120, -0.834647596532946510, -0.834620056272629810, -0.834592513925762950, -0.834564969492414650, -0.834537422972654100, -0.834509874366550000, --0.834482323674170970, -0.834454770895586400, -0.834427216030864890, -0.834399659080075300, -0.834372100043286320, -0.834344538920567480, -0.834316975711987150, -0.834289410417614400, --0.834261843037517940, -0.834234273571767050, -0.834206702020430460, -0.834179128383577220, -0.834151552661275830, -0.834123974853595800, -0.834096394960605950, -0.834068812982375010, --0.834041228918971810, -0.834013642770465750, -0.833986054536925540, -0.833958464218420130, -0.833930871815018680, -0.833903277326790040, -0.833875680753803250, -0.833848082096127040, --0.833820481353830800, -0.833792878526983360, -0.833765273615653780, -0.833737666619910670, -0.833710057539823750, -0.833682446375461630, -0.833654833126893480, -0.833627217794187910, --0.833599600377414540, -0.833571980876642190, -0.833544359291939930, -0.833516735623376470, -0.833489109871021430, -0.833461482034943630, -0.833433852115212150, -0.833406220111895690, --0.833378586025063980, -0.833350949854785860, -0.833323311601130160, -0.833295671264166260, -0.833268028843963340, -0.833240384340590220, -0.833212737754115970, -0.833185089084610090, --0.833157438332141510, -0.833129785496779300, -0.833102130578592500, -0.833074473577650520, -0.833046814494022290, -0.833019153327777100, -0.832991490078983880, -0.832963824747712020, --0.832936157334030700, -0.832908487838008970, -0.832880816259715660, -0.832853142599220720, -0.832825466856592870, -0.832797789031901050, -0.832770109125215100, -0.832742427136603740, --0.832714743066136460, -0.832687056913882010, -0.832659368679910080, -0.832631678364289860, -0.832603985967090400, -0.832576291488380750, -0.832548594928230630, -0.832520896286708890, --0.832493195563885010, -0.832465492759827950, -0.832437787874607320, -0.832410080908292270, -0.832382371860951990, -0.832354660732655520, -0.832326947523472690, -0.832299232233472460, --0.832271514862723880, -0.832243795411296780, -0.832216073879260220, -0.832188350266683470, -0.832160624573635600, -0.832132896800186430, -0.832105166946405020, -0.832077435012360640, --0.832049700998122480, -0.832021964903760240, -0.831994226729343200, -0.831966486474940430, -0.831938744140621300, -0.831910999726455550, -0.831883253232512330, -0.831855504658860930, --0.831827754005570630, -0.831800001272711030, -0.831772246460351530, -0.831744489568561170, -0.831716730597409800, -0.831688969546966580, -0.831661206417300900, -0.831633441208482040, --0.831605673920579820, -0.831577904553663430, -0.831550133107802240, -0.831522359583065530, -0.831494583979523030, -0.831466806297244230, -0.831439026536298310, -0.831411244696754650, --0.831383460778683080, -0.831355674782152780, -0.831327886707233450, -0.831300096553994060, -0.831272304322504760, -0.831244510012834610, -0.831216713625053230, -0.831188915159229770, --0.831161114615434290, -0.831133311993736080, -0.831105507294204290, -0.831077700516908990, -0.831049891661919450, -0.831022080729305170, -0.830994267719135430, -0.830966452631480280, --0.830938635466409000, -0.830910816223991100, -0.830882994904295960, -0.830855171507393630, -0.830827346033353290, -0.830799518482244650, -0.830771688854136880, -0.830743857149100150, --0.830716023367203740, -0.830688187508517360, -0.830660349573110300, -0.830632509561052500, -0.830604667472413460, -0.830576823307262570, -0.830548977065669770, -0.830521128747704670, --0.830493278353436670, -0.830465425882935150, -0.830437571336270390, -0.830409714713511770, -0.830381856014728690, -0.830353995239990870, -0.830326132389368250, -0.830298267462930340, --0.830270400460746740, -0.830242531382886840, -0.830214660229420920, -0.830186787000418260, -0.830158911695948800, -0.830131034316081710, -0.830103154860887260, -0.830075273330434960, --0.830047389724794190, -0.830019504044035240, -0.829991616288227490, -0.829963726457440760, -0.829935834551744470, -0.829907940571208760, -0.829880044515903250, -0.829852146385897660, --0.829824246181261380, -0.829796343902064800, -0.829768439548377310, -0.829740533120268740, -0.829712624617808590, -0.829684714041067140, -0.829656801390113880, -0.829628886665018660, --0.829600969865850970, -0.829573050992681080, -0.829545130045578500, -0.829517207024613180, -0.829489281929854600, -0.829461354761373060, -0.829433425519238040, -0.829405494203519390, --0.829377560814287040, -0.829349625351610940, -0.829321687815560700, -0.829293748206206050, -0.829265806523617250, -0.829237862767863930, -0.829209916939016020, -0.829181969037142920, --0.829154019062315230, -0.829126067014602560, -0.829098112894074650, -0.829070156700801200, -0.829042198434852610, -0.829014238096298590, -0.828986275685208880, -0.828958311201653310, --0.828930344645702140, -0.828902376017425220, -0.828874405316892050, -0.828846432544173120, -0.828818457699338040, -0.828790480782456870, -0.828762501793599230, -0.828734520732835600, --0.828706537600235720, -0.828678552395869410, -0.828650565119806500, -0.828622575772117510, -0.828594584352872030, -0.828566590862140020, -0.828538595299991300, -0.828510597666496370, --0.828482597961724960, -0.828454596185747130, -0.828426592338632470, -0.828398586420451500, -0.828370578431274150, -0.828342568371170150, -0.828314556240209890, -0.828286542038463300, --0.828258525766000340, -0.828230507422890840, -0.828202487009205290, -0.828174464525013530, -0.828146439970385620, -0.828118413345391380, -0.828090384650101320, -0.828062353884585270, --0.828034321048913390, -0.828006286143155410, -0.827978249167382050, -0.827950210121662920, -0.827922169006068410, -0.827894125820668240, -0.827866080565532900, -0.827838033240732350, --0.827809983846336530, -0.827781932382416040, -0.827753878849040610, -0.827725823246280520, -0.827697765574205710, -0.827669705832886680, -0.827641644022393370, -0.827613580142795960, --0.827585514194164370, -0.827557446176569230, -0.827529376090080370, -0.827501303934768170, -0.827473229710702470, -0.827445153417953990, -0.827417075056592570, -0.827388994626688470, --0.827360912128311640, -0.827332827561532700, -0.827304740926421810, -0.827276652223049020, -0.827248561451484290, -0.827220468611798430, -0.827192373704061510, -0.827164276728343360, --0.827136177684714700, -0.827108076573245590, -0.827079973394006410, -0.827051868147066880, -0.827023760832498070, -0.826995651450369800, -0.826967540000752450, -0.826939426483715880, --0.826911310899331120, -0.826883193247668010, -0.826855073528796950, -0.826826951742787970, -0.826798827889711820, -0.826770701969638640, -0.826742573982638620, -0.826714443928782020, --0.826686311808139560, -0.826658177620781310, -0.826630041366777310, -0.826601903046198520, -0.826573762659114860, -0.826545620205596960, -0.826517475685714650, -0.826489329099538870, --0.826461180447139900, -0.826433029728587900, -0.826404876943953040, -0.826376722093306260, -0.826348565176717730, -0.826320406194257730, -0.826292245145996530, -0.826264082032004850, --0.826235916852353090, -0.826207749607111520, -0.826179580296350300, -0.826151408920140270, -0.826123235478551820, -0.826095059971655110, -0.826066882399520860, -0.826038702762219470, --0.826010521059821310, -0.825982337292396670, -0.825954151460016380, -0.825925963562750720, -0.825897773600670070, -0.825869581573844820, -0.825841387482345920, -0.825813191326243420, --0.825784993105608050, -0.825756792820509840, -0.825728590471019990, -0.825700386057208640, -0.825672179579146290, -0.825643971036903350, -0.825615760430550630, -0.825587547760158520, --0.825559333025797540, -0.825531116227538050, -0.825502897365450910, -0.825474676439606590, -0.825446453450075390, -0.825418228396928130, -0.825390001280235430, -0.825361772100067670, --0.825333540856495350, -0.825305307549589310, -0.825277072179420030, -0.825248834746058040, -0.825220595249573810, -0.825192353690038290, -0.825164110067521880, -0.825135864382095190, --0.825107616633828590, -0.825079366822793150, -0.825051114949059360, -0.825022861012697730, -0.824994605013778750, -0.824966346952373470, -0.824938086828552410, -0.824909824642385820, --0.824881560393944890, -0.824853294083300100, -0.824825025710522080, -0.824796755275681190, -0.824768482778848730, -0.824740208220094970, -0.824711931599490740, -0.824683652917106550, --0.824655372173013320, -0.824627089367281680, -0.824598804499982350, -0.824570517571185820, -0.824542228580963150, -0.824513937529384950, -0.824485644416521830, -0.824457349242444510, --0.824429052007223940, -0.824400752710930830, -0.824372451353635460, -0.824344147935409330, -0.824315842456322830, -0.824287534916446680, -0.824259225315851380, -0.824230913654608320, --0.824202599932787990, -0.824174284150461230, -0.824145966307698430, -0.824117646404570970, -0.824089324441149350, -0.824061000417504520, -0.824032674333706860, -0.824004346189827760, --0.823976015985937840, -0.823947683722107920, -0.823919349398408500, -0.823891013014910970, -0.823862674571685830, -0.823834334068803800, -0.823805991506336150, -0.823777646884353620, --0.823749300202926920, -0.823720951462126760, -0.823692600662024430, -0.823664247802690540, -0.823635892884196140, -0.823607535906611730, -0.823579176870008700, -0.823550815774457770, --0.823522452620029770, -0.823494087406795310, -0.823465720134826000, -0.823437350804192340, -0.823408979414965270, -0.823380605967215520, -0.823352230461014580, -0.823323852896433060, --0.823295473273541800, -0.823267091592411630, -0.823238707853114040, -0.823210322055719650, -0.823181934200299280, -0.823153544286924220, -0.823125152315665410, -0.823096758286593570, --0.823068362199779750, -0.823039964055295110, -0.823011563853210730, -0.822983161593597300, -0.822954757276525780, -0.822926350902067560, -0.822897942470293580, -0.822869531981274660, --0.822841119435081650, -0.822812704831786150, -0.822784288171458880, -0.822755869454170790, -0.822727448679992920, -0.822699025848996570, -0.822670600961252660, -0.822642174016832040, --0.822613745015806200, -0.822585313958246080, -0.822556880844222630, -0.822528445673806670, -0.822500008447069940, -0.822471569164083150, -0.822443127824917460, -0.822414684429643610, --0.822386238978333410, -0.822357791471057590, -0.822329341907887200, -0.822300890288893300, -0.822272436614147400, -0.822243980883720420, -0.822215523097683420, -0.822187063256107460, --0.822158601359064050, -0.822130137406624110, -0.822101671398858700, -0.822073203335839220, -0.822044733217636820, -0.822016261044322460, -0.821987786815967290, -0.821959310532642930, --0.821930832194420310, -0.821902351801370500, -0.821873869353564660, -0.821845384851074390, -0.821816898293970640, -0.821788409682324580, -0.821759919016207260, -0.821731426295690400, --0.821702931520845060, -0.821674434691742280, -0.821645935808453240, -0.821617434871049660, -0.821588931879602360, -0.821560426834182840, -0.821531919734861950, -0.821503410581711500, --0.821474899374802560, -0.821446386114206060, -0.821417870799993950, -0.821389353432237180, -0.821360834011006900, -0.821332312536374290, -0.821303789008411280, -0.821275263427188710, --0.821246735792777960, -0.821218206105250090, -0.821189674364677050, -0.821161140571129770, -0.821132604724679640, -0.821104066825397830, -0.821075526873356050, -0.821046984868625370, --0.821018440811277280, -0.820989894701382950, -0.820961346539013980, -0.820932796324241760, -0.820904244057137240, -0.820875689737772360, -0.820847133366218170, -0.820818574942546290, --0.820790014466827640, -0.820761451939134300, -0.820732887359537310, -0.820704320728107950, -0.820675752044917720, -0.820647181310038220, -0.820618608523540850, -0.820590033685496990, --0.820561456795977700, -0.820532877855055130, -0.820504296862800240, -0.820475713819284750, -0.820447128724579590, -0.820418541578756930, -0.820389952381887940, -0.820361361134043790, --0.820332767835296410, -0.820304172485717190, -0.820275575085377520, -0.820246975634348670, -0.820218374132702710, -0.820189770580510680, -0.820161164977844300, -0.820132557324774750, --0.820103947621374060, -0.820075335867713530, -0.820046722063864530, -0.820018106209898570, -0.819989488305887580, -0.819960868351902960, -0.819932246348016090, -0.819903622294298360, --0.819874996190821830, -0.819846368037657760, -0.819817737834877770, -0.819789105582553250, -0.819760471280756240, -0.819731834929557920, -0.819703196529029900, -0.819674556079244110, --0.819645913580271830, -0.819617269032184900, -0.819588622435054480, -0.819559973788952730, -0.819531323093951160, -0.819502670350121140, -0.819474015557534300, -0.819445358716262670, --0.819416699826377550, -0.819388038887950750, -0.819359375901053570, -0.819330710865758260, -0.819302043782136110, -0.819273374650258850, -0.819244703470197950, -0.819216030242025490, --0.819187354965812960, -0.819158677641631860, -0.819129998269554240, -0.819101316849651710, -0.819072633381995760, -0.819043947866658130, -0.819015260303710750, -0.818986570693225340, --0.818957879035273400, -0.818929185329926530, -0.818900489577257030, -0.818871791777336160, -0.818843091930235970, -0.818814390036027740, -0.818785686094783750, -0.818756980106575490, --0.818728272071474920, -0.818699561989553400, -0.818670849860883120, -0.818642135685535790, -0.818613419463582900, -0.818584701195096630, -0.818555980880148580, -0.818527258518810700, --0.818498534111154360, -0.818469807657251970, -0.818441079157175010, -0.818412348610995430, -0.818383616018784620, -0.818354881380615070, -0.818326144696558400, -0.818297405966686210, --0.818268665191070330, -0.818239922369783050, -0.818211177502895960, -0.818182430590481010, -0.818153681632609600, -0.818124930629354320, -0.818096177580786680, -0.818067422486978390, --0.818038665348001740, -0.818009906163928440, -0.817981144934830320, -0.817952381660779220, -0.817923616341847290, -0.817894848978106380, -0.817866079569628310, -0.817837308116484810, --0.817808534618748360, -0.817779759076490480, -0.817750981489783200, -0.817722201858698260, -0.817693420183308040, -0.817664636463684370, -0.817635850699898970, -0.817607062892023780, --0.817578273040131090, -0.817549481144292820, -0.817520687204580820, -0.817491891221066800, -0.817463093193823380, -0.817434293122922150, -0.817405491008434960, -0.817376686850434410, --0.817347880648992000, -0.817319072404179890, -0.817290262116069920, -0.817261449784734580, -0.817232635410245490, -0.817203818992674910, -0.817175000532094460, -0.817146180028576860, --0.817117357482193720, -0.817088532893017190, -0.817059706261119120, -0.817030877586572000, -0.817002046869447770, -0.816973214109818380, -0.816944379307755650, -0.816915542463332200, --0.816886703576619970, -0.816857862647690670, -0.816829019676617030, -0.816800174663470770, -0.816771327608324160, -0.816742478511248930, -0.816713627372317790, -0.816684774191602570, --0.816655918969175440, -0.816627061705108130, -0.816598202399473560, -0.816569341052343470, -0.816540477663790010, -0.816511612233885020, -0.816482744762701330, -0.816453875250310770, --0.816425003696785500, -0.816396130102197470, -0.816367254466619400, -0.816338376790123220, -0.816309497072780780, -0.816280615314664890, -0.816251731515847510, -0.816222845676400690, --0.816193957796396590, -0.816165067875907810, -0.816136175915006310, -0.816107281913764470, -0.816078385872254120, -0.816049487790548090, -0.816020587668718320, -0.815991685506837090, --0.815962781304976350, -0.815933875063208910, -0.815904966781606840, -0.815876056460242300, -0.815847144099187460, -0.815818229698514920, -0.815789313258296840, -0.815760394778605510, --0.815731474259512870, -0.815702551701091850, -0.815673627103414400, -0.815644700466552690, -0.815615771790579420, -0.815586841075566780, -0.815557908321587030, -0.815528973528712230, --0.815500036697015210, -0.815471097826568130, -0.815442156917443370, -0.815413213969712890, -0.815384268983449730, -0.815355321958725730, -0.815326372895613600, -0.815297421794185180, --0.815268468654513520, -0.815239513476670560, -0.815210556260728910, -0.815181597006760630, -0.815152635714838650, -0.815123672385035030, -0.815094707017421930, -0.815065739612072400, --0.815036770169058510, -0.815007798688452630, -0.814978825170327050, -0.814949849614754700, -0.814920872021807630, -0.814891892391558350, -0.814862910724079240, -0.814833927019443020, --0.814804941277721960, -0.814775953498988570, -0.814746963683315120, -0.814717971830774430, -0.814688977941438800, -0.814659982015380810, -0.814630984052672540, -0.814601984053387020, --0.814572982017596650, -0.814543977945373480, -0.814514971836790670, -0.814485963691920390, -0.814456953510835250, -0.814427941293607520, -0.814398927040310030, -0.814369910751015390, --0.814340892425795880, -0.814311872064723890, -0.814282849667872570, -0.814253825235313980, -0.814224798767120950, -0.814195770263365540, -0.814166739724121010, -0.814137707149459660, --0.814108672539454070, -0.814079635894176530, -0.814050597213700100, -0.814021556498097270, -0.813992513747440190, -0.813963468961802160, -0.813934422141255440, -0.813905373285872650, --0.813876322395726160, -0.813847269470889150, -0.813818214511433880, -0.813789157517433190, -0.813760098488959360, -0.813731037426085440, -0.813701974328884030, -0.813672909197427520, --0.813643842031788630, -0.813614772832040420, -0.813585701598255160, -0.813556628330505680, -0.813527553028864370, -0.813498475693404500, -0.813469396324198350, -0.813440314921318740, --0.813411231484838180, -0.813382146014829720, -0.813353058511365860, -0.813323968974519080, -0.813294877404362680, -0.813265783800969140, -0.813236688164411080, -0.813207590494761100, --0.813178490792092370, -0.813149389056477380, -0.813120285287988960, -0.813091179486699510, -0.813062071652682410, -0.813032961786010140, -0.813003849886755450, -0.812974735954990920, --0.812945619990789740, -0.812916501994224490, -0.812887381965368140, -0.812858259904292950, -0.812829135811072410, -0.812800009685778920, -0.812770881528485310, -0.812741751339264630, --0.812712619118189710, -0.812683484865333150, -0.812654348580767570, -0.812625210264566470, -0.812596069916802330, -0.812566927537548000, -0.812537783126876080, -0.812508636684859950, --0.812479488211572340, -0.812450337707085860, -0.812421185171473330, -0.812392030604808140, -0.812362874007162890, -0.812333715378610320, -0.812304554719223360, -0.812275392029075170, --0.812246227308238590, -0.812217060556786110, -0.812187891774791230, -0.812158720962326660, -0.812129548119465250, -0.812100373246279710, -0.812071196342843530, -0.812042017409229320, --0.812012836445510140, -0.811983653451758600, -0.811954468428048080, -0.811925281374451520, -0.811896092291041650, -0.811866901177891400, -0.811837708035074050, -0.811808512862662530, --0.811779315660729580, -0.811750116429348250, -0.811720915168591790, -0.811691711878533060, -0.811662506559245100, -0.811633299210800520, -0.811604089833273030, -0.811574878426735260, --0.811545664991260130, -0.811516449526921040, -0.811487232033790810, -0.811458012511942490, -0.811428790961448930, -0.811399567382383610, -0.811370341774819370, -0.811341114138829260, --0.811311884474486210, -0.811282652781863620, -0.811253419061034430, -0.811224183312071580, -0.811194945535048120, -0.811165705730037550, -0.811136463897112690, -0.811107220036346720, --0.811077974147812460, -0.811048726231583420, -0.811019476287732630, -0.810990224316332940, -0.810960970317457840, -0.810931714291180380, -0.810902456237573620, -0.810873196156710500, --0.810843934048664620, -0.810814669913508810, -0.810785403751316470, -0.810756135562160310, -0.810726865346114050, -0.810697593103250620, -0.810668318833643210, -0.810639042537364850, --0.810609764214488940, -0.810580483865088740, -0.810551201489237320, -0.810521917087007710, -0.810492630658473430, -0.810463342203707750, -0.810434051722783270, -0.810404759215774040, --0.810375464682752900, -0.810346168123793010, -0.810316869538967530, -0.810287568928350080, -0.810258266292013700, -0.810228961630031770, -0.810199654942477030, -0.810170346229423520, --0.810141035490944070, -0.810111722727112180, -0.810082407938000570, -0.810053091123683180, -0.810023772284233170, -0.809994451419723700, -0.809965128530227840, -0.809935803615819410, --0.809906476676571450, -0.809877147712557030, -0.809847816723849980, -0.809818483710523450, -0.809789148672650730, -0.809759811610304860, -0.809730472523559670, -0.809701131412488340, --0.809671788277164240, -0.809642443117660320, -0.809613095934050620, -0.809583746726408090, -0.809554395494806230, -0.809525042239318090, -0.809495686960017720, -0.809466329656978070, --0.809436970330272510, -0.809407608979974440, -0.809378245606157450, -0.809348880208894950, -0.809319512788260200, -0.809290143344326360, -0.809260771877167500, -0.809231398386856650, --0.809202022873467100, -0.809172645337072780, -0.809143265777746760, -0.809113884195562630, -0.809084500590593560, -0.809055114962913490, -0.809025727312595590, -0.808996337639713350, --0.808966945944340040, -0.808937552226549620, -0.808908156486415340, -0.808878758724010720, -0.808849358939408790, -0.808819957132683840, -0.808790553303909030, -0.808761147453157750, --0.808731739580503370, -0.808702329686019850, -0.808672917769780560, -0.808643503831858680, -0.808614087872328360, -0.808584669891262760, -0.808555249888735620, -0.808525827864819970, --0.808496403819589980, -0.808466977753119040, -0.808437549665480650, -0.808408119556748180, -0.808378687426995590, -0.808349253276296360, -0.808319817104723890, -0.808290378912351670, --0.808260938699253860, -0.808231496465503520, -0.808202052211174580, -0.808172605936340220, -0.808143157641074580, -0.808113707325451070, -0.808084254989542950, -0.808054800633424500, --0.808025344257169100, -0.807995885860850360, -0.807966425444541560, -0.807936963008316970, -0.807907498552249970, -0.807878032076414290, -0.807848563580883190, -0.807819093065731080, --0.807789620531031090, -0.807760145976857080, -0.807730669403282530, -0.807701190810381500, -0.807671710198227480, -0.807642227566894190, -0.807612742916455020, -0.807583256246984350, --0.807553767558555460, -0.807524276851242170, -0.807494784125117990, -0.807465289380257080, -0.807435792616732930, -0.807406293834619040, -0.807376793033989680, -0.807347290214918360, --0.807317785377478780, -0.807288278521744560, -0.807258769647789750, -0.807229258755688180, -0.807199745845513350, -0.807170230917338970, -0.807140713971239210, -0.807111195007287670, --0.807081674025558190, -0.807052151026124260, -0.807022626009060160, -0.806993098974439490, -0.806963569922336200, -0.806934038852823550, -0.806904505765976170, -0.806874970661867530, --0.806845433540571140, -0.806815894402161500, -0.806786353246712110, -0.806756810074296780, -0.806727264884989250, -0.806697717678863780, -0.806668168455993980, -0.806638617216453800, --0.806609063960316730, -0.806579508687657380, -0.806549951398549240, -0.806520392093066140, -0.806490830771281920, -0.806461267433270850, -0.806431702079106530, -0.806402134708863020, --0.806372565322613920, -0.806342993920433630, -0.806313420502395850, -0.806283845068574310, -0.806254267619043400, -0.806224688153876820, -0.806195106673148420, -0.806165523176932130, --0.806135937665302230, -0.806106350138332540, -0.806076760596096900, -0.806047169038669130, -0.806017575466123740, -0.805987979878534320, -0.805958382275975050, -0.805928782658519530, --0.805899181026242360, -0.805869577379217160, -0.805839971717517980, -0.805810364041218750, -0.805780754350393760, -0.805751142645116940, -0.805721528925462000, -0.805691913191503460, --0.805662295443315140, -0.805632675680971080, -0.805603053904545120, -0.805573430114111750, -0.805543804309744820, -0.805514176491518350, -0.805484546659506200, -0.805454914813782950, --0.805425280954422340, -0.805395645081498630, -0.805366007195085550, -0.805336367295257590, -0.805306725382088810, -0.805277081455653240, -0.805247435516024730, -0.805217787563277780, --0.805188137597486420, -0.805158485618724720, -0.805128831627066500, -0.805099175622586480, -0.805069517605358610, -0.805039857575456600, -0.805010195532955160, -0.804980531477928360, --0.804950865410450130, -0.804921197330594530, -0.804891527238436160, -0.804861855134048950, -0.804832181017507200, -0.804802504888884720, -0.804772826748256230, -0.804743146595695570, --0.804713464431277110, -0.804683780255074810, -0.804654094067163150, -0.804624405867616410, -0.804594715656508640, -0.804565023433913670, -0.804535329199906560, -0.804505632954561120, --0.804475934697951310, -0.804446234430151840, -0.804416532151236870, -0.804386827861280570, -0.804357121560356880, -0.804327413248540730, -0.804297702925905970, -0.804267990592527070, --0.804238276248477880, -0.804208559893833220, -0.804178841528667140, -0.804149121153054040, -0.804119398767067730, -0.804089674370783380, -0.804059947964274710, -0.804030219547616220, --0.804000489120881840, -0.803970756684146640, -0.803941022237484430, -0.803911285780969490, -0.803881547314676540, -0.803851806838679740, -0.803822064353053370, -0.803792319857871700, --0.803762573353209440, -0.803732824839140660, -0.803703074315739950, -0.803673321783081150, -0.803643567241239420, -0.803613810690288810, -0.803584052130303590, -0.803554291561357940, --0.803524528983526890, -0.803494764396884500, -0.803464997801505270, -0.803435229197463130, -0.803405458584833370, -0.803375685963689800, -0.803345911334107150, -0.803316134696159370, --0.803286356049921490, -0.803256575395467800, -0.803226792732872340, -0.803197008062210170, -0.803167221383555560, -0.803137432696982790, -0.803107642002566240, -0.803077849300380840, --0.803048054590500770, -0.803018257873000630, -0.802988459147954580, -0.802958658415437570, -0.802928855675524080, -0.802899050928288280, -0.802869244173804670, -0.802839435412148190, --0.802809624643393120, -0.802779811867614050, -0.802749997084885040, -0.802720180295281470, -0.802690361498877400, -0.802660540695747100, -0.802630717885965740, -0.802600893069607580, --0.802571066246747230, -0.802541237417458860, -0.802511406581817740, -0.802481573739898150, -0.802451738891774570, -0.802421902037521280, -0.802392063177213680, -0.802362222310925800, --0.802332379438732370, -0.802302534560707770, -0.802272687676927050, -0.802242838787464720, -0.802212987892395150, -0.802183134991792950, -0.802153280085733170, -0.802123423174290200, --0.802093564257538310, -0.802063703335552880, -0.802033840408408080, -0.802003975476178740, -0.801974108538939250, -0.801944239596764640, -0.801914368649729540, -0.801884495697908540, --0.801854620741375920, -0.801824743780207070, -0.801794864814476370, -0.801764983844258540, -0.801735100869627960, -0.801705215890659790, -0.801675328907428650, -0.801645439920009250, --0.801615548928475970, -0.801585655932903980, -0.801555760933368000, -0.801525863929942290, -0.801495964922702140, -0.801466063911722150, -0.801436160897076920, -0.801406255878841070, --0.801376348857089860, -0.801346439831897790, -0.801316528803339480, -0.801286615771489740, -0.801256700736423740, -0.801226783698215870, -0.801196864656941070, -0.801166943612673930, --0.801137020565489630, -0.801107095515462770, -0.801077168462668190, -0.801047239407180480, -0.801017308349074810, -0.800987375288426010, -0.800957440225308680, -0.800927503159797440, --0.800897564091967880, -0.800867623021894290, -0.800837679949651380, -0.800807734875314540, -0.800777787798958360, -0.800747838720657690, -0.800717887640487240, -0.800687934558522270, --0.800657979474837520, -0.800628022389507700, -0.800598063302607740, -0.800568102214212820, -0.800538139124397530, -0.800508174033236930, -0.800478206940805740, -0.800448237847179220, --0.800418266752432110, -0.800388293656639330, -0.800358318559875600, -0.800328341462216320, -0.800298362363736190, -0.800268381264509830, -0.800238398164612840, -0.800208413064119830, --0.800178425963105840, -0.800148436861645500, -0.800118445759814280, -0.800088452657686910, -0.800058457555338550, -0.800028460452843700, -0.799998461350277970, -0.799968460247716060, --0.799938457145233040, -0.799908452042903620, -0.799878444940803290, -0.799848435839006890, -0.799818424737589350, -0.799788411636625510, -0.799758396536190960, -0.799728379436360330, --0.799698360337208540, -0.799668339238811090, -0.799638316141242810, -0.799608291044578760, -0.799578263948893750, -0.799548234854263300, -0.799518203760762210, -0.799488170668465670, --0.799458135577448380, -0.799428098487786070, -0.799398059399553550, -0.799368018312825780, -0.799337975227677800, -0.799307930144185110, -0.799277883062422530, -0.799247833982465350, --0.799217782904388270, -0.799187729828267020, -0.799157674754176430, -0.799127617682191650, -0.799097558612387520, -0.799067497544839860, -0.799037434479623390, -0.799007369416813050, --0.798977302356484560, -0.798947233298712870, -0.798917162243573010, -0.798887089191140040, -0.798857014141489570, -0.798826937094696650, -0.798796858050836330, -0.798766777009983550, --0.798736693972214250, -0.798706608937603040, -0.798676521906225400, -0.798646432878156180, -0.798616341853471080, -0.798586248832245270, -0.798556153814553690, -0.798526056800471510, --0.798495957790074540, -0.798465856783437510, -0.798435753780635690, -0.798405648781744800, -0.798375541786839670, -0.798345432795995680, -0.798315321809287880, -0.798285208826792100, --0.798255093848583290, -0.798224976874736700, -0.798194857905327400, -0.798164736940431220, -0.798134613980123200, -0.798104489024478610, -0.798074362073572630, -0.798044233127480960, --0.798014102186278660, -0.797983969250041230, -0.797953834318843480, -0.797923697392761480, -0.797893558471870160, -0.797863417556244790, -0.797833274645961100, -0.797803129741094240, --0.797772982841719490, -0.797742833947912010, -0.797712683059747850, -0.797682530177301840, -0.797652375300649590, -0.797622218429866030, -0.797592059565027320, -0.797561898706208420, --0.797531735853484690, -0.797501571006931420, -0.797471404166624540, -0.797441235332639110, -0.797411064505050620, -0.797380891683934110, -0.797350716869365650, -0.797320540061420500, --0.797290361260173610, -0.797260180465701240, -0.797229997678078340, -0.797199812897380400, -0.797169626123682700, -0.797139437357061160, -0.797109246597591080, -0.797079053845347830, --0.797048859100406790, -0.797018662362843800, -0.796988463632734120, -0.796958262910153260, -0.796928060195176590, -0.796897855487879950, -0.796867648788338710, -0.796837440096628380, --0.796807229412824110, -0.796777016737002080, -0.796746802069237430, -0.796716585409605880, -0.796686366758182610, -0.796656146115043650, -0.796625923480264290, -0.796595698853919900, --0.796565472236086420, -0.796535243626839360, -0.796505013026254200, -0.796474780434406230, -0.796444545851371590, -0.796414309277225560, -0.796384070712043760, -0.796353830155901440, --0.796323587608874890, -0.796293343071039380, -0.796263096542470520, -0.796232848023243680, -0.796202597513434920, -0.796172345013119730, -0.796142090522373610, -0.796111834041271950, --0.796081575569891120, -0.796051315108306290, -0.796021052656592840, -0.795990788214827050, -0.795960521783084410, -0.795930253361440300, -0.795899982949970440, -0.795869710548750780, --0.795839436157856910, -0.795809159777364330, -0.795778881407348760, -0.795748601047886140, -0.795718318699051960, -0.795688034360922170, -0.795657748033571920, -0.795627459717077600, --0.795597169411514590, -0.795566877116958620, -0.795536582833485270, -0.795506286561170730, -0.795475988300090360, -0.795445688050319900, -0.795415385811935380, -0.795385081585012530, --0.795354775369626840, -0.795324467165854030, -0.795294156973770260, -0.795263844793451140, -0.795233530624972370, -0.795203214468409470, -0.795172896323838920, -0.795142576191335990, --0.795112254070976740, -0.795081929962836550, -0.795051603866991810, -0.795021275783518000, -0.794990945712491070, -0.794960613653986510, -0.794930279608080600, -0.794899943574849050, --0.794869605554367700, -0.794839265546712030, -0.794808923551958420, -0.794778579570182500, -0.794748233601459960, -0.794717885645866980, -0.794687535703479390, -0.794657183774372890, --0.794626829858623210, -0.794596473956306730, -0.794566116067499050, -0.794535756192276010, -0.794505394330713320, -0.794475030482887480, -0.794444664648874090, -0.794414296828748980, --0.794383927022587870, -0.794353555230467250, -0.794323181452462720, -0.794292805688650240, -0.794262427939105400, -0.794232048203904810, -0.794201666483124180, -0.794171282776839020, --0.794140897085125920, -0.794110509408060610, -0.794080119745719020, -0.794049728098176870, -0.794019334465510650, -0.793988938847796090, -0.793958541245109230, -0.793928141657525790, --0.793897740085122150, -0.793867336527974250, -0.793836930986157930, -0.793806523459749000, -0.793776113948824080, -0.793745702453458880, -0.793715288973729450, -0.793684873509711510, --0.793654456061481660, -0.793624036629115630, -0.793593615212689230, -0.793563191812279190, -0.793532766427961000, -0.793502339059811050, -0.793471909707904820, -0.793441478372319150, --0.793411045053129870, -0.793380609750412910, -0.793350172464244110, -0.793319733194700280, -0.793289291941856930, -0.793258848705790550, -0.793228403486576640, -0.793197956284292020, --0.793167507099012510, -0.793137055930814290, -0.793106602779773180, -0.793076147645965680, -0.793045690529467940, -0.793015231430355680, -0.792984770348705630, -0.792954307284593600, --0.792923842238095870, -0.792893375209288150, -0.792862906198247400, -0.792832435205049310, -0.792801962229770170, -0.792771487272485810, -0.792741010333272930, -0.792710531412207600, --0.792680050509366070, -0.792649567624823970, -0.792619082758658330, -0.792588595910944880, -0.792558107081760000, -0.792527616271179620, -0.792497123479280360, -0.792466628706138380, --0.792436131951829830, -0.792405633216430650, -0.792375132500017680, -0.792344629802666840, -0.792314125124454200, -0.792283618465456470, -0.792253109825749700, -0.792222599205410160, --0.792192086604513900, -0.792161572023137640, -0.792131055461357540, -0.792100536919249750, -0.792070016396890340, -0.792039493894356130, -0.792008969411723160, -0.791978442949067830, --0.791947914506466180, -0.791917384083994920, -0.791886851681730230, -0.791856317299748370, -0.791825780938125500, -0.791795242596938450, -0.791764702276263280, -0.791734159976176020, --0.791703615696753740, -0.791673069438072360, -0.791642521200208280, -0.791611970983237660, -0.791581418787237420, -0.791550864612283630, -0.791520308458452670, -0.791489750325820580, --0.791459190214464540, -0.791428628124460350, -0.791398064055884750, -0.791367498008813560, -0.791336929983324060, -0.791306359979492170, -0.791275787997394290, -0.791245214037106790, --0.791214638098706510, -0.791184060182269610, -0.791153480287872250, -0.791122898415591580, -0.791092314565503550, -0.791061728737684770, -0.791031140932211390, -0.791000551149160460, --0.790969959388608030, -0.790939365650630830, -0.790908769935305010, -0.790878172242707400, -0.790847572572914380, -0.790816970926002450, -0.790786367302047880, -0.790755761701127600, --0.790725154123317900, -0.790694544568695370, -0.790663933037336180, -0.790633319529317370, -0.790602704044715330, -0.790572086583606560, -0.790541467146067210, -0.790510845732174560, --0.790480222342004660, -0.790449596975634110, -0.790418969633139730, -0.790388340314597930, -0.790357709020085290, -0.790327075749678090, -0.790296440503453490, -0.790265803281487880, --0.790235164083857630, -0.790204522910639250, -0.790173879761909780, -0.790143234637745720, -0.790112587538223550, -0.790081938463419560, -0.790051287413411020, -0.790020634388274300, --0.789989979388086020, -0.789959322412922440, -0.789928663462860840, -0.789898002537977590, -0.789867339638349100, -0.789836674764052500, -0.789806007915164310, -0.789775339091761010, --0.789744668293919090, -0.789713995521715730, -0.789683320775227400, -0.789652644054530840, -0.789621965359702300, -0.789591284690819300, -0.789560602047957970, -0.789529917431195050, --0.789499230840607140, -0.789468542276271500, -0.789437851738264420, -0.789407159226662710, -0.789376464741542880, -0.789345768282982090, -0.789315069851056930, -0.789284369445843790, --0.789253667067420060, -0.789222962715862120, -0.789192256391246790, -0.789161548093650470, -0.789130837823150630, -0.789100125579823670, -0.789069411363746420, -0.789038695174995360, --0.789007977013647780, -0.788977256879780380, -0.788946534773469770, -0.788915810694792550, -0.788885084643826010, -0.788854356620646850, -0.788823626625331790, -0.788792894657957430, --0.788762160718600950, -0.788731424807339150, -0.788700686924248550, -0.788669947069406520, -0.788639205242889660, -0.788608461444774700, -0.788577715675138350, -0.788546967934057990, --0.788516218221610110, -0.788485466537871770, -0.788454712882919460, -0.788423957256830680, -0.788393199659682020, -0.788362440091550320, -0.788331678552512290, -0.788300915042645320, --0.788270149562026010, -0.788239382110731410, -0.788208612688838020, -0.788177841296423430, -0.788147067933564150, -0.788116292600337220, -0.788085515296819360, -0.788054736023087950, --0.788023954779219720, -0.787993171565291250, -0.787962386381380160, -0.787931599227563170, -0.787900810103917100, -0.787870019010518790, -0.787839225947445710, -0.787808430914774480, --0.787777633912582260, -0.787746834940945660, -0.787716033999942280, -0.787685231089648720, -0.787654426210142140, -0.787623619361499160, -0.787592810543797480, -0.787561999757113830, --0.787531187001525020, -0.787500372277108120, -0.787469555583940490, -0.787438736922098980, -0.787407916291660400, -0.787377093692702260, -0.787346269125301370, -0.787315442589534790, --0.787284614085479340, -0.787253783613212740, -0.787222951172811490, -0.787192116764353080, -0.787161280387914000, -0.787130442043571970, -0.787099601731403810, -0.787068759451486690, --0.787037915203897430, -0.787007068988713530, -0.786976220806012150, -0.786945370655870110, -0.786914518538364360, -0.786883664453572610, -0.786852808401571680, -0.786821950382438520, --0.786791090396250610, -0.786760228443085130, -0.786729364523019000, -0.786698498636129170, -0.786667630782493470, -0.786636760962188600, -0.786605889175291840, -0.786575015421880130, --0.786544139702031080, -0.786513262015821720, -0.786482382363329240, -0.786451500744630550, -0.786420617159803270, -0.786389731608924560, -0.786358844092071460, -0.786327954609321030, --0.786297063160750880, -0.786266169746438150, -0.786235274366460010, -0.786204377020893410, -0.786173477709816050, -0.786142576433305100, -0.786111673191437380, -0.786080767984290830, --0.786049860811942280, -0.786018951674469110, -0.785988040571948270, -0.785957127504457560, -0.785926212472074170, -0.785895295474875130, -0.785864376512937610, -0.785833455586339440, --0.785802532695157650, -0.785771607839469420, -0.785740681019352020, -0.785709752234883150, -0.785678821486139880, -0.785647888773199580, -0.785616954096139190, -0.785586017455036870, --0.785555078849969330, -0.785524138281013970, -0.785493195748248390, -0.785462251251749950, -0.785431304791595840, -0.785400356367863210, -0.785369405980629880, -0.785338453629973120, --0.785307499315970210, -0.785276543038698200, -0.785245584798235250, -0.785214624594658180, -0.785183662428044720, -0.785152698298471670, -0.785121732206017220, -0.785090764150758510, --0.785059794132772830, -0.785028822152137320, -0.784997848208930150, -0.784966872303228260, -0.784935894435108920, -0.784904914604650170, -0.784873932811929190, -0.784842949057023230, --0.784811963340009690, -0.784780975660966610, -0.784749986019970920, -0.784718994417100360, -0.784688000852432070, -0.784657005326043990, -0.784626007838013400, -0.784595008388417890, --0.784564006977334530, -0.784533003604841350, -0.784501998271015740, -0.784470990975935090, -0.784439981719676770, -0.784408970502318610, -0.784377957323938220, -0.784346942184612760, --0.784315925084419830, -0.784284906023437260, -0.784253885001742420, -0.784222862019412600, -0.784191837076525950, -0.784160810173159750, -0.784129781309391370, -0.784098750485298420, --0.784067717700958730, -0.784036682956449900, -0.784005646251849210, -0.783974607587234250, -0.783943566962682970, -0.783912524378272750, -0.783881479834081300, -0.783850433330185890, --0.783819384866664580, -0.783788334443594860, -0.783757282061054330, -0.783726227719120260, -0.783695171417870930, -0.783664113157383600, -0.783633052937735890, -0.783601990759005720, --0.783570926621270480, -0.783539860524608000, -0.783508792469095660, -0.783477722454811510, -0.783446650481833150, -0.783415576550238080, -0.783384500660103790, -0.783353422811508660, --0.783322343004529850, -0.783291261239245200, -0.783260177515732070, -0.783229091834068860, -0.783198004194332940, -0.783166914596601930, -0.783135823040953420, -0.783104729527465570, --0.783073634056215990, -0.783042536627281960, -0.783011437240741850, -0.782980335896673150, -0.782949232595153700, -0.782918127336260870, -0.782887020120072940, -0.782855910946667510, --0.782824799816122300, -0.782793686728514790, -0.782762571683923270, -0.782731454682425440, -0.782700335724098920, -0.782669214809021300, -0.782638091937270960, -0.782606967108925300, --0.782575840324062360, -0.782544711582759400, -0.782513580885095040, -0.782482448231146650, -0.782451313620991850, -0.782420177054709120, -0.782389038532375960, -0.782357898054070080, --0.782326755619869310, -0.782295611229851810, -0.782264464884095400, -0.782233316582677810, -0.782202166325676520, -0.782171014113170250, -0.782139859945236380, -0.782108703821952860, --0.782077545743397270, -0.782046385709648130, -0.782015223720783030, -0.781984059776879900, -0.781952893878016250, -0.781921726024270790, -0.781890556215720900, -0.781859384452444630, --0.781828210734519690, -0.781797035062024470, -0.781765857435036570, -0.781734677853633820, -0.781703496317894710, -0.781672312827896840, -0.781641127383718160, -0.781609939985436370, --0.781578750633129980, -0.781547559326876810, -0.781516366066754680, -0.781485170852841300, -0.781453973685215300, -0.781422774563954480, -0.781391573489136570, -0.781360370460839610, --0.781329165479141880, -0.781297958544121320, -0.781266749655855740, -0.781235538814423090, -0.781204326019901860, -0.781173111272369880, -0.781141894571904750, -0.781110675918585180, --0.781079455312488900, -0.781048232753694060, -0.781017008242278380, -0.780985781778320340, -0.780954553361897900, -0.780923322993089090, -0.780892090671971740, -0.780860856398624350, --0.780829620173124850, -0.780798381995551290, -0.780767141865981510, -0.780735899784494200, -0.780704655751167100, -0.780673409766078350, -0.780642161829305790, -0.780610911940928130, --0.780579660101023200, -0.780548406309668820, -0.780517150566943710, -0.780485892872925690, -0.780454633227692930, -0.780423371631323360, -0.780392108083895700, -0.780360842585487660, --0.780329575136177510, -0.780298305736043200, -0.780267034385163430, -0.780235761083616030, -0.780204485831479280, -0.780173208628830990, -0.780141929475749900, -0.780110648372314030, --0.780079365318601560, -0.780048080314690420, -0.780016793360659320, -0.779985504456586210, -0.779954213602549460, -0.779922920798626800, -0.779891626044897150, -0.779860329341438340, --0.779829030688328540, -0.779797730085646460, -0.779766427533469920, -0.779735123031877420, -0.779703816580946780, -0.779672508180756950, -0.779641197831385860, -0.779609885532911660, --0.779578571285412520, -0.779547255088967270, -0.779515936943653840, -0.779484616849550620, -0.779453294806735530, -0.779421970815287410, -0.779390644875284530, -0.779359316986804940, --0.779327987149926790, -0.779296655364728920, -0.779265321631289480, -0.779233985949686400, -0.779202648319998640, -0.779171308742304340, -0.779139967216681660, -0.779108623743208880, --0.779077278321964720, -0.779045930953027430, -0.779014581636475300, -0.778983230372386480, -0.778951877160839800, -0.778920522001913420, -0.778889164895685830, -0.778857805842234960, --0.778826444841639880, -0.778795081893978610, -0.778763716999329780, -0.778732350157771310, -0.778700981369382150, -0.778669610634240670, -0.778638237952424930, -0.778606863324013740, --0.778575486749085390, -0.778544108227718470, -0.778512727759990810, -0.778481345345981790, -0.778449960985769240, -0.778418574679431870, -0.778387186427047850, -0.778355796228696000, --0.778324404084454800, -0.778293009994402540, -0.778261613958617480, -0.778230215977178560, -0.778198816050164280, -0.778167414177652890, -0.778136010359722570, -0.778104604596452700, --0.778073196887921200, -0.778041787234206470, -0.778010375635387440, -0.777978962091542600, -0.777947546602750340, -0.777916129169088920, -0.777884709790637400, -0.777853288467474150, --0.777821865199677660, -0.777790439987326330, -0.777759012830499090, -0.777727583729274310, -0.777696152683730600, -0.777664719693946240, -0.777633284760000270, -0.777601847881971180, --0.777570409059937460, -0.777538968293977390, -0.777507525584170240, -0.777476080930594280, -0.777444634333328110, -0.777413185792450000, -0.777381735308039220, -0.777350282880174160, --0.777318828508933190, -0.777287372194395250, -0.777255913936638950, -0.777224453735742890, -0.777192991591785450, -0.777161527504845790, -0.777130061475002300, -0.777098593502333570, --0.777067123586918210, -0.777035651728835260, -0.777004177928163120, -0.776972702184980710, -0.776941224499366090, -0.776909744871398740, -0.776878263301157060, -0.776846779788719740, --0.776815294334165190, -0.776783806937572650, -0.776752317599020530, -0.776720826318587410, -0.776689333096352460, -0.776657837932394290, -0.776626340826791380, -0.776594841779622460, --0.776563340790966670, -0.776531837860902520, -0.776500332989508710, -0.776468826176863970, -0.776437317423047220, -0.776405806728137300, -0.776374294092212920, -0.776342779515352470, --0.776311262997635310, -0.776279744539140060, -0.776248224139945320, -0.776216701800129920, -0.776185177519772900, -0.776153651298952970, -0.776122123137748640, -0.776090593036239400, --0.776059060994503500, -0.776027527012620010, -0.775995991090667530, -0.775964453228725200, -0.775932913426871760, -0.775901371685186140, -0.775869828003746710, -0.775838282382632970, --0.775806734821923640, -0.775775185321697420, -0.775743633882032930, -0.775712080503009660, -0.775680525184706200, -0.775648967927201390, -0.775617408730573940, -0.775585847594903120, --0.775554284520267870, -0.775522719506746780, -0.775491152554418580, -0.775459583663362870, -0.775428012833658140, -0.775396440065383220, -0.775364865358617370, -0.775333288713439320, --0.775301710129928210, -0.775270129608162440, -0.775238547148221600, -0.775206962750184410, -0.775175376414129810, -0.775143788140136510, -0.775112197928284010, -0.775080605778651010, --0.775049011691316570, -0.775017415666359180, -0.774985817703858660, -0.774954217803893510, -0.774922615966542880, -0.774891012191885390, -0.774859406480000620, -0.774827798830967420, --0.774796189244864380, -0.774764577721771210, -0.774732964261766520, -0.774701348864929470, -0.774669731531338780, -0.774638112261073930, -0.774606491054213860, -0.774574867910837630, --0.774543242831023940, -0.774511615814852390, -0.774479986862401710, -0.774448355973751170, -0.774416723148979470, -0.774385088388166220, -0.774353451691390250, -0.774321813058730600, --0.774290172490266220, -0.774258529986076690, -0.774226885546240750, -0.774195239170837320, -0.774163590859946240, -0.774131940613645990, -0.774100288432015950, -0.774068634315134950, --0.774036978263082600, -0.774005320275937820, -0.773973660353779680, -0.773941998496687210, -0.773910334704740020, -0.773878668978016940, -0.773847001316597230, -0.773815331720559610, --0.773783660189984120, -0.773751986724949380, -0.773720311325534650, -0.773688633991818970, -0.773656954723881850, -0.773625273521802440, -0.773593590385659560, -0.773561905315532930, --0.773530218311501590, -0.773498529373644720, -0.773466838502041230, -0.773435145696770850, -0.773403450957912630, -0.773371754285545940, -0.773340055679749390, -0.773308355140603030, --0.773276652668185790, -0.773244948262577060, -0.773213241923855540, -0.773181533652101180, -0.773149823447393030, -0.773118111309810230, -0.773086397239431950, -0.773054681236338030, --0.773022963300607380, -0.772991243432319170, -0.772959521631552680, -0.772927797898387730, -0.772896072232903240, -0.772864344635178280, -0.772832615105292660, -0.772800883643325550, --0.772769150249356330, -0.772737414923463820, -0.772705677665728170, -0.772673938476228230, -0.772642197355043470, -0.772610454302252950, -0.772578709317936600, -0.772546962402173460, --0.772515213555042930, -0.772483462776624050, -0.772451710066996760, -0.772419955426240310, -0.772388198854433880, -0.772356440351656740, -0.772324679917988700, -0.772292917553508930, --0.772261153258296700, -0.772229387032431820, -0.772197618875993470, -0.772165848789061030, -0.772134076771713750, -0.772102302824031580, -0.772070526946093570, -0.772038749137979320, --0.772006969399767870, -0.771975187731539280, -0.771943404133372810, -0.771911618605347740, -0.771879831147543330, -0.771848041760039630, -0.771816250442915910, -0.771784457196251440, --0.771752662020125600, -0.771720864914618440, -0.771689065879809010, -0.771657264915776690, -0.771625462022601520, -0.771593657200362770, -0.771561850449139720, -0.771530041769011850, --0.771498231160059110, -0.771466418622360760, -0.771434604155996410, -0.771402787761045320, -0.771370969437587430, -0.771339149185702230, -0.771307327005469110, -0.771275502896967450, --0.771243676860277170, -0.771211848895477780, -0.771180019002648760, -0.771148187181869500, -0.771116353433219940, -0.771084517756779550, -0.771052680152627850, -0.771020840620844190, --0.770988999161508650, -0.770957155774700700, -0.770925310460499500, -0.770893463218985330, -0.770861614050237560, -0.770829762954335700, -0.770797909931359100, -0.770766054981388060, --0.770734198104501940, -0.770702339300780250, -0.770670478570302460, -0.770638615913148750, -0.770606751329398490, -0.770574884819131390, -0.770543016382426730, -0.770511146019364880, --0.770479273730025120, -0.770447399514487150, -0.770415523372830480, -0.770383645305135260, -0.770351765311480970, -0.770319883391946900, -0.770287999546613420, -0.770256113775559910, --0.770224226078866200, -0.770192336456611560, -0.770160444908876470, -0.770128551435740220, -0.770096656037282500, -0.770064758713582930, -0.770032859464721780, -0.770000958290778410, --0.769969055191832670, -0.769937150167964050, -0.769905243219252800, -0.769873334345778430, -0.769841423547620750, -0.769809510824859270, -0.769777596177574240, -0.769745679605845280, --0.769713761109751760, -0.769681840689374170, -0.769649918344791910, -0.769617994076085000, -0.769586067883332610, -0.769554139766615460, -0.769522209726013040, -0.769490277761604950, --0.769458343873470900, -0.769426408061691380, -0.769394470326345780, -0.769362530667513920, -0.769330589085275520, -0.769298645579711060, -0.769266700150899820, -0.769234752798921840, --0.769202803523856730, -0.769170852325784970, -0.769138899204785950, -0.769106944160939500, -0.769074987194325880, -0.769043028305024910, -0.769011067493116210, -0.768979104758679700, --0.768947140101795660, -0.768915173522543790, -0.768883205021003930, -0.768851234597255790, -0.768819262251379860, -0.768787287983455860, -0.768755311793563490, -0.768723333681782690, --0.768691353648193740, -0.768659371692876460, -0.768627387815910780, -0.768595402017376310, -0.768563414297353640, -0.768531424655922390, -0.768499433093162600, -0.768467439609153870, --0.768435444203976910, -0.768403446877711340, -0.768371447630436850, -0.768339446462234070, -0.768307443373182570, -0.768275438363362540, -0.768243431432853670, -0.768211422581736470, --0.768179411810090640, -0.768147399117996340, -0.768115384505533290, -0.768083367972781980, -0.768051349519822350, -0.768019329146734320, -0.767987306853597620, -0.767955282640493060, --0.767923256507500150, -0.767891228454699150, -0.767859198482169880, -0.767827166589992840, -0.767795132778247850, -0.767763097047014730, -0.767731059396374200, -0.767699019826405980, --0.767666978337190220, -0.767634934928806740, -0.767602889601336270, -0.767570842354858510, -0.767538793189453620, -0.767506742105201530, -0.767474689102182860, -0.767442634180477420, --0.767410577340165490, -0.767378518581326660, -0.767346457904041990, -0.767314395308391070, -0.767282330794454290, -0.767250264362311250, -0.767218196012042890, -0.767186125743729020, --0.767154053557449590, -0.767121979453285310, -0.767089903431316110, -0.767057825491622050, -0.767025745634283270, -0.766993663859380280, -0.766961580166993230, -0.766929494557202160, --0.766897407030087130, -0.766865317585728850, -0.766833226224207240, -0.766801132945602590, -0.766769037749994830, -0.766736940637464780, -0.766704841608092380, -0.766672740661957790, --0.766640637799141160, -0.766608533019723200, -0.766576426323783870, -0.766544317711403520, -0.766512207182662110, -0.766480094737640340, -0.766447980376418480, -0.766415864099076360, --0.766383745905694800, -0.766351625796353850, -0.766319503771133890, -0.766287379830114970, -0.766255253973377790, -0.766223126201002410, -0.766190996513069320, -0.766158864909658450, --0.766126731390850630, -0.766094595956726130, -0.766062458607364990, -0.766030319342847490, -0.765998178163254440, -0.765966035068666010, -0.765933890059162460, -0.765901743134823840, --0.765869594295731200, -0.765837443541964590, -0.765805290873604050, -0.765773136290730630, -0.765740979793424260, -0.765708821381765550, -0.765676661055834430, -0.765644498815711950, --0.765612334661478270, -0.765580168593213760, -0.765548000610998480, -0.765515830714913470, -0.765483658905039000, -0.765451485181455340, -0.765419309544242640, -0.765387131993481960, --0.765354952529253450, -0.765322771151637490, -0.765290587860714470, -0.765258402656565200, -0.765226215539269840, -0.765194026508908780, -0.765161835565562940, -0.765129642709312390, --0.765097447940237820, -0.765065251258419290, -0.765033052663937950, -0.765000852156874080, -0.764968649737307940, -0.764936445405319910, -0.764904239160991150, -0.764872031004401710, --0.764839820935632190, -0.764807608954762850, -0.764775395061874750, -0.764743179257048160, -0.764710961540363670, -0.764678741911901440, -0.764646520371742630, -0.764614296919967630, --0.764582071556656470, -0.764549844281890540, -0.764517615095749890, -0.764485383998315230, -0.764453150989666930, -0.764420916069885940, -0.764388679239052630, -0.764356440497247710, --0.764324199844551360, -0.764291957281044710, -0.764259712806808270, -0.764227466421922520, -0.764195218126467850, -0.764162967920525400, -0.764130715804175580, -0.764098461777498850, --0.764066205840575720, -0.764033947993487450, -0.764001688236314200, -0.763969426569136800, -0.763937162992035510, -0.763904897505091610, -0.763872630108385580, -0.763840360801997580, --0.763808089586008990, -0.763775816460500080, -0.763743541425551790, -0.763711264481244270, -0.763678985627658790, -0.763646704864875960, -0.763614422192976370, -0.763582137612040410, --0.763549851122149350, -0.763517562723383780, -0.763485272415824200, -0.763452980199551210, -0.763420686074645970, -0.763388390041189080, -0.763356092099261250, -0.763323792248942870, --0.763291490490315310, -0.763259186823458950, -0.763226881248454390, -0.763194573765382910, -0.763162264374325110, -0.763129953075361470, -0.763097639868572710, -0.763065324754040210, --0.763033007731844350, -0.763000688802065950, -0.762968367964785620, -0.762936045220084620, -0.762903720568043450, -0.762871394008743040, -0.762839065542263770, -0.762806735168687240, --0.762774402888093840, -0.762742068700564380, -0.762709732606179470, -0.762677394605020600, -0.762645054697168150, -0.762612712882702830, -0.762580369161705910, -0.762548023534258210, --0.762515676000440350, -0.762483326560333130, -0.762450975214017830, -0.762418621961575060, -0.762386266803085740, -0.762353909738630490, -0.762321550768290670, -0.762289189892147110, --0.762256827110280530, -0.762224462422771530, -0.762192095829701710, -0.762159727331151670, -0.762127356927202240, -0.762094984617934120, -0.762062610403428930, -0.762030234283767150, --0.761997856259029830, -0.761965476329297560, -0.761933094494651850, -0.761900710755173520, -0.761868325110943050, -0.761835937562042040, -0.761803548108551110, -0.761771156750551400, --0.761738763488123530, -0.761706368321349080, -0.761673971250308560, -0.761641572275083220, -0.761609171395753680, -0.761576768612401420, -0.761544363925107270, -0.761511957333952270, --0.761479548839017030, -0.761447138440383140, -0.761414726138131550, -0.761382311932343070, -0.761349895823098530, -0.761317477810479540, -0.761285057894566800, -0.761252636075441250, --0.761220212353184270, -0.761187786727876790, -0.761155359199599870, -0.761122929768434320, -0.761090498434461640, -0.761058065197762760, -0.761025630058418720, -0.760993193016510250, --0.760960754072119160, -0.760928313225326170, -0.760895870476212430, -0.760863425824858660, -0.760830979271346690, -0.760798530815757210, -0.760766080458171400, -0.760733628198670080, --0.760701174037335060, -0.760668717974247070, -0.760636260009487030, -0.760603800143136550, -0.760571338375276570, -0.760538874705988350, -0.760506409135352610, -0.760473941663451060, --0.760441472290364740, -0.760409001016174700, -0.760376527840961880, -0.760344052764807990, -0.760311575787794070, -0.760279096910001170, -0.760246616131510230, -0.760214133452402960, --0.760181648872760410, -0.760149162392663840, -0.760116674012193960, -0.760084183731432720, -0.760051691550461040, -0.760019197469359750, -0.759986701488210900, -0.759954203607095200, --0.759921703826093920, -0.759889202145288210, -0.759856698564759790, -0.759824193084589590, -0.759791685704858890, -0.759759176425648720, -0.759726665247040910, -0.759694152169116400, --0.759661637191956450, -0.759629120315642230, -0.759596601540255430, -0.759564080865877230, -0.759531558292588670, -0.759499033820471010, -0.759466507449606090, -0.759433979180074940, --0.759401449011958720, -0.759368916945338590, -0.759336382980296490, -0.759303847116913460, -0.759271309355270540, -0.759238769695449680, -0.759206228137531800, -0.759173684681598290, --0.759141139327730310, -0.759108592076009890, -0.759076042926517980, -0.759043491879335840, -0.759010938934544740, -0.758978384092226620, -0.758945827352462520, -0.758913268715333820, --0.758880708180921680, -0.758848145749308150, -0.758815581420574150, -0.758783015194801180, -0.758750447072070400, -0.758717877052463850, -0.758685305136062470, -0.758652731322947640, --0.758620155613201290, -0.758587578006904570, -0.758554998504138880, -0.758522417104985360, -0.758489833809526060, -0.758457248617842250, -0.758424661530015310, -0.758392072546126390, --0.758359481666257660, -0.758326888890490160, -0.758294294218905480, -0.758261697651584690, -0.758229099188610030, -0.758196498830062570, -0.758163896576023900, -0.758131292426575180, --0.758098686381798450, -0.758066078441775200, -0.758033468606586270, -0.758000856876314020, -0.757968243251039730, -0.757935627730844660, -0.757903010315810310, -0.757870391006018720, --0.757837769801551260, -0.757805146702489220, -0.757772521708914070, -0.757739894820907980, -0.757707266038552100, -0.757674635361928030, -0.757642002791117040, -0.757609368326201400, --0.757576731967262380, -0.757544093714381470, -0.757511453567640050, -0.757478811527120270, -0.757446167592903400, -0.757413521765071260, -0.757380874043704910, -0.757348224428886720, --0.757315572920697950, -0.757282919519220000, -0.757250264224535010, -0.757217607036724360, -0.757184947955869660, -0.757152286982052390, -0.757119624115354610, -0.757086959355857790, --0.757054292703643550, -0.757021624158793260, -0.756988953721389300, -0.756956281391512940, -0.756923607169245780, -0.756890931054669420, -0.756858253047866030, -0.756825573148916850, --0.756792891357903950, -0.756760207674908370, -0.756727522100012600, -0.756694834633298120, -0.756662145274846100, -0.756629454024739130, -0.756596760883058490, -0.756564065849886000, --0.756531368925303040, -0.756498670109391870, -0.756465969402234100, -0.756433266803911320, -0.756400562314505140, -0.756367855934097830, -0.756335147662770990, -0.756302437500606110, --0.756269725447684890, -0.756237011504089730, -0.756204295669901990, -0.756171577945203510, -0.756138858330075880, -0.756106136824601260, -0.756073413428861360, -0.756040688142937570, --0.756007960966912470, -0.755975231900867350, -0.755942500944884130, -0.755909768099044530, -0.755877033363430710, -0.755844296738124250, -0.755811558223207220, -0.755778817818760880, --0.755746075524867830, -0.755713331341609560, -0.755680585269067890, -0.755647837307324540, -0.755615087456461890, -0.755582335716561530, -0.755549582087705400, -0.755516826569974880, --0.755484069163452680, -0.755451309868220290, -0.755418548684359310, -0.755385785611952240, -0.755353020651080680, -0.755320253801826660, -0.755287485064271680, -0.755254714438498230, --0.755221941924588020, -0.755189167522622990, -0.755156391232684740, -0.755123613054855760, -0.755090832989217860, -0.755058051035852770, -0.755025267194842310, -0.754992481466268960, --0.754959693850214440, -0.754926904346760570, -0.754894112955989180, -0.754861319677982980, -0.754828524512823230, -0.754795727460592310, -0.754762928521371830, -0.754730127695244170, --0.754697324982291360, -0.754664520382594790, -0.754631713896237290, -0.754598905523300440, -0.754566095263866420, -0.754533283118016820, -0.754500469085834350, -0.754467653167400610, --0.754434835362797870, -0.754402015672107630, -0.754369194095412700, -0.754336370632794790, -0.754303545284335960, -0.754270718050117920, -0.754237888930223480, -0.754205057924734130, --0.754172225033732270, -0.754139390257299590, -0.754106553595518700, -0.754073715048471430, -0.754040874616239480, -0.754008032298905780, -0.753975188096551950, -0.753942342009260140, --0.753909494037112160, -0.753876644180190740, -0.753843792438577690, -0.753810938812355170, -0.753778083301605120, -0.753745225906410020, -0.753712366626851930, -0.753679505463012880, --0.753646642414974810, -0.753613777482820320, -0.753580910666631460, -0.753548041966490390, -0.753515171382478920, -0.753482298914679770, -0.753449424563174870, -0.753416548328046050, --0.753383670209376240, -0.753350790207247160, -0.753317908321741170, -0.753285024552940220, -0.753252138900926900, -0.753219251365783160, -0.753186361947591370, -0.753153470646433450, --0.753120577462392030, -0.753087682395549240, -0.753054785445987250, -0.753021886613787990, -0.752988985899034290, -0.752956083301808080, -0.752923178822191730, -0.752890272460267070, --0.752857364216117150, -0.752824454089823680, -0.752791542081469260, -0.752758628191135480, -0.752725712418905510, -0.752692794764861280, -0.752659875229084730, -0.752626953811658890, --0.752594030512665490, -0.752561105332187120, -0.752528178270305710, -0.752495249327104100, -0.752462318502664430, -0.752429385797068860, -0.752396451210399660, -0.752363514742739550, --0.752330576394170670, -0.752297636164775300, -0.752264694054635590, -0.752231750063834470, -0.752198804192453880, -0.752165856440576430, -0.752132906808283930, -0.752099955295659430, --0.752067001902785080, -0.752034046629743050, -0.752001089476616040, -0.751968130443486320, -0.751935169530436380, -0.751902206737548150, -0.751869242064904690, -0.751836275512588140, --0.751803307080680880, -0.751770336769265080, -0.751737364578423770, -0.751704390508239010, -0.751671414558793270, -0.751638436730168720, -0.751605457022448410, -0.751572475435714370, --0.751539491970049210, -0.751506506625534980, -0.751473519402254820, -0.751440530300290790, -0.751407539319725260, -0.751374546460641060, -0.751341551723120560, -0.751308555107246150, --0.751275556613100080, -0.751242556240765410, -0.751209553990324300, -0.751176549861859330, -0.751143543855452680, -0.751110535971187600, -0.751077526209146030, -0.751044514569410680, --0.751011501052063710, -0.750978485657188390, -0.750945468384866750, -0.750912449235181520, -0.750879428208214850, -0.750846405304049780, -0.750813380522768910, -0.750780353864454190, --0.750747325329188860, -0.750714294917055210, -0.750681262628135840, -0.750648228462513110, -0.750615192420269970, -0.750582154501489020, -0.750549114706252520, -0.750516073034642960, --0.750483029486743500, -0.750449984062636520, -0.750416936762404620, -0.750383887586129950, -0.750350836533896000, -0.750317783605784940, -0.750284728801879350, -0.750251672122261630, --0.750218613567015140, -0.750185553136222040, -0.750152490829965050, -0.750119426648326540, -0.750086360591389780, -0.750053292659237150, -0.750020222851950910, -0.749987151169614450, --0.749954077612310140, -0.749921002180120590, -0.749887924873128280, -0.749854845691416360, -0.749821764635067440, -0.749788681704164130, -0.749755596898788680, -0.749722510219024580, --0.749689421664954340, -0.749656331236660420, -0.749623238934225330, -0.749590144757732560, -0.749557048707264360, -0.749523950782903570, -0.749490850984732560, -0.749457749312834820, --0.749424645767292620, -0.749391540348188560, -0.749358433055605900, -0.749325323889627140, -0.749292212850335090, -0.749259099937812260, -0.749225985152141890, -0.749192868493406610, --0.749159749961689210, -0.749126629557072100, -0.749093507279638640, -0.749060383129471430, -0.749027257106653410, -0.748994129211266850, -0.748960999443395230, -0.748927867803121150, --0.748894734290527330, -0.748861598905696480, -0.748828461648711860, -0.748795322519656080, -0.748762181518611850, -0.748729038645662200, -0.748695893900890200, -0.748662747284378320, --0.748629598796209380, -0.748596448436466670, -0.748563296205232880, -0.748530142102590830, -0.748496986128623030, -0.748463828283413180, -0.748430668567043770, -0.748397506979597620, --0.748364343521157440, -0.748331178191806720, -0.748298010991627960, -0.748264841920704300, -0.748231670979118140, -0.748198498166953160, -0.748165323484291880, -0.748132146931217320, --0.748098968507812100, -0.748065788214159810, -0.748032606050343050, -0.747999422016444430, -0.747966236112547530, -0.747933048338734970, -0.747899858695089900, -0.747866667181694920, --0.747833473798633520, -0.747800278545988410, -0.747767081423842630, -0.747733882432278900, -0.747700681571380700, -0.747667478841230750, -0.747634274241912200, -0.747601067773507650, --0.747567859436100710, -0.747534649229774080, -0.747501437154610810, -0.747468223210693730, -0.747435007398106420, -0.747401789716931500, -0.747368570167251890, -0.747335348749151080, --0.747302125462711910, -0.747268900308017400, -0.747235673285150390, -0.747202444394194480, -0.747169213635232480, -0.747135981008347440, -0.747102746513622180, -0.747069510151140310, --0.747036271920984650, -0.747003031823238350, -0.746969789857984120, -0.746936546025305680, -0.746903300325286070, -0.746870052758008110, -0.746836803323554620, -0.746803552022009540, --0.746770298853455470, -0.746737043817975450, -0.746703786915653090, -0.746670528146571200, -0.746637267510813050, -0.746604005008461470, -0.746570740639600160, -0.746537474404311950, --0.746504206302680110, -0.746470936334787450, -0.746437664500717690, -0.746404390800553870, -0.746371115234378930, -0.746337837802276030, -0.746304558504328750, -0.746271277340620150, --0.746237994311233280, -0.746204709416251170, -0.746171422655757640, -0.746138134029835420, -0.746104843538567990, -0.746071551182038050, -0.746038256960329660, -0.746004960873525520, --0.745971662921708690, -0.745938363104962980, -0.745905061423371430, -0.745871757877017210, -0.745838452465983350, -0.745805145190353570, -0.745771836050210910, -0.745738525045638760, --0.745705212176719920, -0.745671897443538350, -0.745638580846177070, -0.745605262384719360, -0.745571942059248150, -0.745538619869847370, -0.745505295816600080, -0.745471969899589530, --0.745438642118898760, -0.745405312474611730, -0.745371980966811340, -0.745338647595580770, -0.745305312361003840, -0.745271975263163580, -0.745238636302143490, -0.745205295478026500, --0.745171952790896540, -0.745138608240836660, -0.745105261827930240, -0.745071913552260430, -0.745038563413911170, -0.745005211412965500, -0.744971857549506680, -0.744938501823617980, --0.744905144235383340, -0.744871784784885800, -0.744838423472208970, -0.744805060297435540, -0.744771695260649900, -0.744738328361934990, -0.744704959601373950, -0.744671588979050840, --0.744638216495048690, -0.744604842149451110, -0.744571465942341030, -0.744538087873802600, -0.744504707943918990, -0.744471326152773560, -0.744437942500449590, -0.744404556987031010, --0.744371169612601080, -0.744337780377243190, -0.744304389281040480, -0.744270996324077230, -0.744237601506436360, -0.744204204828201600, -0.744170806289455980, -0.744137405890283650, --0.744104003630767790, -0.744070599510991640, -0.744037193531039250, -0.744003785690994010, -0.743970375990939180, -0.743936964430958140, -0.743903551011135030, -0.743870135731553030, --0.743836718592295610, -0.743803299593446150, -0.743769878735088710, -0.743736456017306650, -0.743703031440183350, -0.743669605003802190, -0.743636176708247440, -0.743602746553602150, --0.743569314539950010, -0.743535880667374300, -0.743502444935959180, -0.743469007345787910, -0.743435567896944090, -0.743402126589511210, -0.743368683423573100, -0.743335238399213450, --0.743301791516515320, -0.743268342775563080, -0.743234892176439900, -0.743201439719229580, -0.743167985404015300, -0.743134529230881300, -0.743101071199911090, -0.743067611311188150, --0.743034149564795960, -0.743000685960818590, -0.742967220499339610, -0.742933753180442520, -0.742900284004210710, -0.742866812970728540, -0.742833340080079290, -0.742799865332346650, --0.742766388727614140, -0.742732910265966000, -0.742699429947485500, -0.742665947772256140, -0.742632463740362180, -0.742598977851887110, -0.742565490106914640, -0.742532000505528030, --0.742498509047811780, -0.742465015733849270, -0.742431520563724190, -0.742398023537520050, -0.742364524655321210, -0.742331023917210950, -0.742297521323273090, -0.742264016873591230, --0.742230510568249620, -0.742197002407331660, -0.742163492390921280, -0.742129980519101840, -0.742096466791957620, -0.742062951209572440, -0.742029433772029570, -0.741995914479413270, --0.741962393331807250, -0.741928870329295220, -0.741895345471960790, -0.741861818759888210, -0.741828290193161210, -0.741794759771863380, -0.741761227496078310, -0.741727693365890620, --0.741694157381383560, -0.741660619542641180, -0.741627079849746960, -0.741593538302785290, -0.741559994901839770, -0.741526449646994320, -0.741492902538332330, -0.741459353575938510, --0.741425802759896220, -0.741392250090289530, -0.741358695567201800, -0.741325139190717740, -0.741291580960920740, -0.741258020877894610, -0.741224458941723620, -0.741190895152491480, --0.741157329510282130, -0.741123762015179150, -0.741090192667267060, -0.741056621466629540, -0.741023048413350430, -0.740989473507513320, -0.740955896749202920, -0.740922318138502730, --0.740888737675496900, -0.740855155360268690, -0.740821571192903040, -0.740787985173483430, -0.740754397302093800, -0.740720807578818090, -0.740687216003740430, -0.740653622576944780, --0.740620027298514840, -0.740586430168535090, -0.740552831187089260, -0.740519230354261370, -0.740485627670135040, -0.740452023134794970, -0.740418416748324870, -0.740384808510808680, --0.740351198422330330, -0.740317586482974190, -0.740283972692823980, -0.740250357051963960, -0.740216739560477730, -0.740183120218449900, -0.740149499025964270, -0.740115875983104910, --0.740082251089955620, -0.740048624346600900, -0.740014995753124680, -0.739981365309610780, -0.739947733016143580, -0.739914098872807120, -0.739880462879685340, -0.739846825036862280, --0.739813185344422310, -0.739779543802449480, -0.739745900411027720, -0.739712255170240860, -0.739678608080173830, -0.739644959140910110, -0.739611308352533970, -0.739577655715129460, --0.739544001228780950, -0.739510344893572480, -0.739476686709588100, -0.739443026676911860, -0.739409364795628240, -0.739375701065821180, -0.739342035487574600, -0.739308368060973220, --0.739274698786100970, -0.739241027663041890, -0.739207354691880040, -0.739173679872700000, -0.739140003205585930, -0.739106324690621760, -0.739072644327891440, -0.739038962117479770, --0.739005278059470690, -0.738971592153948590, -0.738937904400997050, -0.738904214800701120, -0.738870523353144630, -0.738836830058411830, -0.738803134916586670, -0.738769437927753960, --0.738735739091997630, -0.738702038409401960, -0.738668335880050990, -0.738634631504029420, -0.738600925281421180, -0.738567217212310450, -0.738533507296781910, -0.738499795534919620, --0.738466081926807850, -0.738432366472530520, -0.738398649172172680, -0.738364930025818160, -0.738331209033551320, -0.738297486195456100, -0.738263761511617540, -0.738230034982119590, --0.738196306607046490, -0.738162576386482420, -0.738128844320512070, -0.738095110409219710, -0.738061374652689620, -0.738027637051005710, -0.737993897604252940, -0.737960156312515550, --0.737926413175877370, -0.737892668194423560, -0.737858921368238050, -0.737825172697405220, -0.737791422182009100, -0.737757669822134750, -0.737723915617866320, -0.737690159569288070, --0.737656401676484050, -0.737622641939539300, -0.737588880358538090, -0.737555116933564570, -0.737521351664703010, -0.737487584552038330, -0.737453815595654700, -0.737420044795636500, --0.737386272152068090, -0.737352497665034080, -0.737318721334618840, -0.737284943160906540, -0.737251163143982200, -0.737217381283930000, -0.737183597580834180, -0.737149812034779250, --0.737116024645849910, -0.737082235414130650, -0.737048444339705840, -0.737014651422659430, -0.736980856663076890, -0.736947060061042160, -0.736913261616639730, -0.736879461329953860, --0.736845659201069590, -0.736811855230071200, -0.736778049417043170, -0.736744241762069760, -0.736710432265236030, -0.736676620926626220, -0.736642807746324850, -0.736608992724416160, --0.736575175860985310, -0.736541357156116570, -0.736507536609893990, -0.736473714222402930, -0.736439889993727670, -0.736406063923952580, -0.736372236013162040, -0.736338406261441310, --0.736304574668874450, -0.736270741235546260, -0.736236905961540790, -0.736203068846943420, -0.736169229891838420, -0.736135389096310270, -0.736101546460443350, -0.736067701984322920, --0.736033855668033250, -0.736000007511658950, -0.735966157515284270, -0.735932305678994480, -0.735898452002873960, -0.735864596487006970, -0.735830739131478890, -0.735796879936373880, --0.735763018901776640, -0.735729156027771670, -0.735695291314444000, -0.735661424761878120, -0.735627556370158750, -0.735593686139370150, -0.735559814069597580, -0.735525940160925540, --0.735492064413438620, -0.735458186827221310, -0.735424307402358760, -0.735390426138935460, -0.735356543037036130, -0.735322658096745130, -0.735288771318147740, -0.735254882701328330, --0.735220992246371610, -0.735187099953362620, -0.735153205822385860, -0.735119309853526140, -0.735085412046867840, -0.735051512402496220, -0.735017610920496000, -0.734983707600951550, --0.734949802443947700, -0.734915895449569480, -0.734881986617901720, -0.734848075949028790, -0.734814163443035520, -0.734780249100007050, -0.734746332920028000, -0.734712414903183060, --0.734678495049556850, -0.734644573359234720, -0.734610649832301180, -0.734576724468840590, -0.734542797268938560, -0.734508868232679580, -0.734474937360148350, -0.734441004651429470, --0.734407070106608440, -0.734373133725769730, -0.734339195508998180, -0.734305255456378370, -0.734271313567995690, -0.734237369843934730, -0.734203424284280310, -0.734169476889117050, --0.734135527658530410, -0.734101576592604890, -0.734067623691425530, -0.734033668955076820, -0.733999712383644140, -0.733965753977212200, -0.733931793735865920, -0.733897831659689800, --0.733863867748769440, -0.733829902003189430, -0.733795934423034370, -0.733761965008389750, -0.733727993759340170, -0.733694020675970670, -0.733660045758365850, -0.733626069006611090, --0.733592090420791320, -0.733558110000991250, -0.733524127747295580, -0.733490143659789820, -0.733456157738558880, -0.733422169983687370, -0.733388180395260210, -0.733354188973362910, --0.733320195718080160, -0.733286200629496900, -0.733252203707697840, -0.733218204952768570, -0.733184204364793810, -0.733150201943858270, -0.733116197690047430, -0.733082191603446120, --0.733048183684139380, -0.733014173932211800, -0.732980162347749100, -0.732946148930836090, -0.732912133681557610, -0.732878116599998570, -0.732844097686244480, -0.732810076940380140, --0.732776054362490600, -0.732742029952660690, -0.732708003710976000, -0.732673975637521240, -0.732639945732381670, -0.732605913995641790, -0.732571880427387520, -0.732537845027703470, --0.732503807796674570, -0.732469768734386410, -0.732435727840923810, -0.732401685116371940, -0.732367640560815490, -0.732333594174340410, -0.732299545957031170, -0.732265495908973160, --0.732231444030251090, -0.732197390320950660, -0.732163334781156800, -0.732129277410954570, -0.732095218210428890, -0.732061157179665470, -0.732027094318749130, -0.731993029627765020, --0.731958963106798090, -0.731924894755934030, -0.731890824575257780, -0.731856752564854380, -0.731822678724808770, -0.731788603055206880, -0.731754525556133520, -0.731720446227673400, --0.731686365069912580, -0.731652282082935760, -0.731618197266828310, -0.731584110621675050, -0.731550022147561820, -0.731515931844573420, -0.731481839712795350, -0.731447745752312310, --0.731413649963210230, -0.731379552345573950, -0.731345452899488820, -0.731311351625039910, -0.731277248522312680, -0.731243143591392530, -0.731209036832364380, -0.731174928245313380, --0.731140817830325360, -0.731106705587485360, -0.731072591516878310, -0.731038475618589920, -0.731004357892705460, -0.730970238339310190, -0.730936116958488810, -0.730901993750327610, --0.730867868714911270, -0.730833741852325410, -0.730799613162654850, -0.730765482645985510, -0.730731350302402440, -0.730697216131991120, -0.730663080134836380, -0.730628942311024270, --0.730594802660639810, -0.730560661183768280, -0.730526517880494830, -0.730492372750905390, -0.730458225795085010, -0.730424077013118840, -0.730389926405092700, -0.730355773971091750, --0.730321619711201350, -0.730287463625506670, -0.730253305714093640, -0.730219145977047290, -0.730184984414453010, -0.730150821026396060, -0.730116655812962370, -0.730082488774236980, --0.730048319910305390, -0.730014149221252740, -0.729979976707164970, -0.729945802368127340, -0.729911626204225120, -0.729877448215543570, -0.729843268402168620, -0.729809086764185540, --0.729774903301679490, -0.729740718014736500, -0.729706530903441620, -0.729672341967880440, -0.729638151208138130, -0.729603958624300830, -0.729569764216453590, -0.729535567984681890, --0.729501369929070890, -0.729467170049706850, -0.729432968346674930, -0.729398764820060500, -0.729364559469948940, -0.729330352296426290, -0.729296143299577700, -0.729261932479488780, --0.729227719836244680, -0.729193505369931660, -0.729159289080634760, -0.729125070968439810, -0.729090851033431740, -0.729056629275696920, -0.729022405695320510, -0.728988180292387770, --0.728953953066984850, -0.728919724019197020, -0.728885493149110000, -0.728851260456808920, -0.728817025942379960, -0.728782789605908370, -0.728748551447479960, -0.728714311467179690, --0.728680069665094130, -0.728645826041308230, -0.728611580595907920, -0.728577333328978230, -0.728543084240605540, -0.728508833330875130, -0.728474580599872690, -0.728440326047683500, --0.728406069674393700, -0.728371811480088780, -0.728337551464854020, -0.728303289628775770, -0.728269025971939210, -0.728234760494430140, -0.728200493196333840, -0.728166224077736570, --0.728131953138723700, -0.728097680379381050, -0.728063405799793890, -0.728029129400048490, -0.727994851180230330, -0.727960571140425010, -0.727926289280717900, -0.727892005601195380, --0.727857720101942830, -0.727823432783046060, -0.727789143644590350, -0.727754852686662070, -0.727720559909346700, -0.727686265312729620, -0.727651968896897210, -0.727617670661934830, --0.727583370607928330, -0.727549068734962940, -0.727514765043125400, -0.727480459532500840, -0.727446152203175100, -0.727411843055233760, -0.727377532088762990, -0.727343219303848490, --0.727308904700575960, -0.727274588279030800, -0.727240270039299470, -0.727205949981467590, -0.727171628105620750, -0.727137304411844540, -0.727102978900225240, -0.727068651570848660, --0.727034322423800510, -0.726999991459166050, -0.726965658677032000, -0.726931324077483950, -0.726896987660607060, -0.726862649426488150, -0.726828309375212480, -0.726793967506866200, --0.726759623821534580, -0.726725278319304220, -0.726690931000260720, -0.726656581864489890, -0.726622230912077230, -0.726587878143109320, -0.726553523557671780, -0.726519167155850410, --0.726484808937730710, -0.726450448903399490, -0.726416087052942030, -0.726381723386444240, -0.726347357903992070, -0.726312990605671670, -0.726278621491568850, -0.726244250561769110, --0.726209877816359040, -0.726175503255424350, -0.726141126879050860, -0.726106748687324280, -0.726072368680331090, -0.726037986858157010, -0.726003603220887970, -0.725969217768609560, --0.725934830501408500, -0.725900441419370270, -0.725866050522581020, -0.725831657811126350, -0.725797263285092750, -0.725762866944566040, -0.725728468789632150, -0.725694068820376790, --0.725659667036886560, -0.725625263439247160, -0.725590858027544310, -0.725556450801864590, -0.725522041762293850, -0.725487630908917880, -0.725453218241822520, -0.725418803761094470, --0.725384387466819440, -0.725349969359083470, -0.725315549437972160, -0.725281127703572340, -0.725246704155969700, -0.725212278795250300, -0.725177851621499950, -0.725143422634805250, --0.725108991835251900, -0.725074559222926180, -0.725040124797913690, -0.725005688560301230, -0.724971250510174530, -0.724936810647619390, -0.724902368972722530, -0.724867925485569780, --0.724833480186247160, -0.724799033074840620, -0.724764584151436740, -0.724730133416121360, -0.724695680868980840, -0.724661226510100680, -0.724626770339567680, -0.724592312357467790, --0.724557852563887160, -0.724523390958911720, -0.724488927542627950, -0.724454462315121890, -0.724419995276479600, -0.724385526426787110, -0.724351055766131120, -0.724316583294597470, --0.724282109012272410, -0.724247632919241660, -0.724213155015592250, -0.724178675301409890, -0.724144193776780520, -0.724109710441790950, -0.724075225296527240, -0.724040738341075300, --0.724006249575521290, -0.723971758999951920, -0.723937266614453230, -0.723902772419111380, -0.723868276414012190, -0.723833778599242690, -0.723799278974888830, -0.723764777541036630, --0.723730274297772150, -0.723695769245182420, -0.723661262383353150, -0.723626753712370840, -0.723592243232321300, -0.723557730943291460, -0.723523216845367250, -0.723488700938634710, --0.723454183223180670, -0.723419663699091280, -0.723385142366452680, -0.723350619225350930, -0.723316094275872960, -0.723281567518104680, -0.723247038952132600, -0.723212508578042420, --0.723177976395921520, -0.723143442405855490, -0.723108906607930920, -0.723074369002233870, -0.723039829588851050, -0.723005288367868700, -0.722970745339373110, -0.722936200503450420, --0.722901653860187570, -0.722867105409670470, -0.722832555151985410, -0.722798003087219200, -0.722763449215457990, -0.722728893536788150, -0.722694336051295740, -0.722659776759067900, --0.722625215660190560, -0.722590652754750210, -0.722556088042832780, -0.722521521524525650, -0.722486953199914520, -0.722452383069086100, -0.722417811132126440, -0.722383237389122580, --0.722348661840160560, -0.722314084485326970, -0.722279505324707750, -0.722244924358390160, -0.722210341586460250, -0.722175757009004380, -0.722141170626108940, -0.722106582437860740, --0.722071992444346280, -0.722037400645651360, -0.722002807041863370, -0.721968211633068240, -0.721933614419352660, -0.721899015400802810, -0.721864414577505610, -0.721829811949547430, --0.721795207517014650, -0.721760601279993640, -0.721725993238571340, -0.721691383392834120, -0.721656771742868460, -0.721622158288760530, -0.721587543030597470, -0.721552925968465650, --0.721518307102451460, -0.721483686432641160, -0.721449063959122010, -0.721414439681980160, -0.721379813601301880, -0.721345185717174430, -0.721310556029684080, -0.721275924538917200, --0.721241291244960280, -0.721206656147900470, -0.721172019247823930, -0.721137380544817350, -0.721102740038967130, -0.721068097730360290, -0.721033453619083110, -0.720998807705222510, --0.720964159988864430, -0.720929510470096350, -0.720894859149004310, -0.720860206025675240, -0.720825551100195420, -0.720790894372651980, -0.720756235843131310, -0.720721575511719670, --0.720686913378504430, -0.720652249443571980, -0.720617583707008790, -0.720582916168901470, -0.720548246829337050, -0.720513575688402130, -0.720478902746183090, -0.720444228002766640, --0.720409551458239930, -0.720374873112689220, -0.720340192966201440, -0.720305511018862870, -0.720270827270760750, -0.720236141721981580, -0.720201454372612180, -0.720166765222738700, --0.720132074272448630, -0.720097381521828450, -0.720062686970964430, -0.720027990619944050, -0.719993292468853690, -0.719958592517780050, -0.719923890766809630, -0.719889187216029900, --0.719854481865527030, -0.719819774715388050, -0.719785065765699340, -0.719750355016548270, -0.719715642468021330, -0.719680928120205230, -0.719646211973186460, -0.719611494027052600, --0.719576774281889930, -0.719542052737785260, -0.719507329394825310, -0.719472604253097230, -0.719437877312687600, -0.719403148573683370, -0.719368418036170910, -0.719333685700237810, --0.719298951565970460, -0.719264215633455330, -0.719229477902780020, -0.719194738374031030, -0.719159997047295160, -0.719125253922659020, -0.719090509000209990, -0.719055762280034760, --0.719021013762220160, -0.718986263446852680, -0.718951511334019800, -0.718916757423808230, -0.718882001716304670, -0.718847244211595850, -0.718812484909769230, -0.718777723810911430, --0.718742960915109250, -0.718708196222449410, -0.718673429733019290, -0.718638661446905800, -0.718603891364195220, -0.718569119484975150, -0.718534345809332400, -0.718499570337353680, --0.718464793069125810, -0.718430014004736270, -0.718395233144271670, -0.718360450487819050, -0.718325666035464880, -0.718290879787296890, -0.718256091743401770, -0.718221301903866350, --0.718186510268777330, -0.718151716838222430, -0.718116921612288240, -0.718082124591061690, -0.718047325774629600, -0.718012525163079340, -0.717977722756497960, -0.717942918554971830, --0.717908112558588770, -0.717873304767435490, -0.717838495181598810, -0.717803683801165660, -0.717768870626223630, -0.717734055656859440, -0.717699238893160010, -0.717664420335212270, --0.717629599983103720, -0.717594777836921270, -0.717559953896751760, -0.717525128162682100, -0.717490300634799900, -0.717455471313191980, -0.717420640197945380, -0.717385807289146920, --0.717350972586884180, -0.717316136091244120, -0.717281297802313640, -0.717246457720179590, -0.717211615844929650, -0.717176772176650770, -0.717141926715429650, -0.717107079461353990, --0.717072230414510630, -0.717037379574986700, -0.717002526942868920, -0.716967672518245340, -0.716932816301202420, -0.716897958291827450, -0.716863098490207350, -0.716828236896429830, --0.716793373510581700, -0.716758508332750010, -0.716723641363021910, -0.716688772601485000, -0.716653902048226100, -0.716619029703332470, -0.716584155566890920, -0.716549279638989290, --0.716514401919714490, -0.716479522409153360, -0.716444641107393700, -0.716409758014522560, -0.716374873130626980, -0.716339986455793780, -0.716305097990111110, -0.716270207733665560, --0.716235315686544530, -0.716200421848834920, -0.716165526220624570, -0.716130628802000400, -0.716095729593049680, -0.716060828593859220, -0.716025925804517070, -0.715991021225110160, --0.715956114855725630, -0.715921206696450430, -0.715886296747372700, -0.715851385008579140, -0.715816471480156810, -0.715781556162193630, -0.715746639054776530, -0.715711720157992780, --0.715676799471929530, -0.715641876996674590, -0.715606952732314780, -0.715572026678937820, -0.715537098836630300, -0.715502169205480490, -0.715467237785575190, -0.715432304577001800, --0.715397369579847340, -0.715362432794199750, -0.715327494220146080, -0.715292553857773680, -0.715257611707169620, -0.715222667768421800, -0.715187722041617400, -0.715152774526843340, --0.715117825224187540, -0.715082874133737280, -0.715047921255579810, -0.715012966589802180, -0.714978010136492540, -0.714943051895737810, -0.714908091867625490, -0.714873130052242620, --0.714838166449677240, -0.714803201060016490, -0.714768233883347650, -0.714733264919757970, -0.714698294169335390, -0.714663321632167060, -0.714628347308340460, -0.714593371197942750, --0.714558393301061860, -0.714523413617784930, -0.714488432148199570, -0.714453448892392820, -0.714418463850452710, -0.714383477022466410, -0.714348488408521170, -0.714313498008705030, --0.714278505823105040, -0.714243511851808900, -0.714208516094903540, -0.714173518552477350, -0.714138519224617240, -0.714103518111410930, -0.714068515212945450, -0.714033510529309080, --0.713998504060588850, -0.713963495806872350, -0.713928485768246860, -0.713893473944800410, -0.713858460336620370, -0.713823444943794130, -0.713788427766408830, -0.713753408804552960, --0.713718388058313450, -0.713683365527777780, -0.713648341213033890, -0.713613315114169260, -0.713578287231271260, -0.713543257564427270, -0.713508226113725440, -0.713473192879253040, --0.713438157861097650, -0.713403121059346560, -0.713368082474087890, -0.713333042105409150, -0.713297999953397710, -0.713262956018141050, -0.713227910299727320, -0.713192862798243680, --0.713157813513777940, -0.713122762446417370, -0.713087709596250230, -0.713052654963363790, -0.713017598547845410, -0.712982540349783370, -0.712947480369264920, -0.712912418606377880, --0.712877355061209420, -0.712842289733847780, -0.712807222624380570, -0.712772153732895260, -0.712737083059479250, -0.712702010604220780, -0.712666936367207350, -0.712631860348526550, --0.712596782548265860, -0.712561702966513440, -0.712526621603356780, -0.712491538458883580, -0.712456453533181210, -0.712421366826338050, -0.712386278338441370, -0.712351188069579200, --0.712316096019838580, -0.712281002189308010, -0.712245906578075070, -0.712210809186226920, -0.712175710013852160, -0.712140609061038040, -0.712105506327872510, -0.712070401814442810, --0.712035295520837440, -0.712000187447143770, -0.711965077593449850, -0.711929965959842700, -0.711894852546411050, -0.711859737353242260, -0.711824620380424040, -0.711789501628044110, --0.711754381096190600, -0.711719258784951240, -0.711684134694413610, -0.711649008824665420, -0.711613881175795050, -0.711578751747889870, -0.711543620541037590, -0.711508487555326590, --0.711473352790844230, -0.711438216247678670, -0.711403077925917170, -0.711367937825648220, -0.711332795946959530, -0.711297652289938800, -0.711262506854673630, -0.711227359641252500, --0.711192210649763010, -0.711157059880292990, -0.711121907332930010, -0.711086753007762580, -0.711051596904878180, -0.711016439024364840, -0.710981279366310170, -0.710946117930802530, --0.710910954717929530, -0.710875789727778980, -0.710840622960439150, -0.710805454415997850, -0.710770284094542900, -0.710735111996161910, -0.710699938120943450, -0.710664762468975140, --0.710629585040344900, -0.710594405835140440, -0.710559224853450240, -0.710524042095362020, -0.710488857560963690, -0.710453671250342870, -0.710418483163588130, -0.710383293300787310, --0.710348101662028110, -0.710312908247398460, -0.710277713056986840, -0.710242516090880960, -0.710207317349168310, -0.710172116831937930, -0.710136914539277080, -0.710101710471274020, --0.710066504628016350, -0.710031297009592670, -0.709996087616090790, -0.709960876447598750, -0.709925663504204160, -0.709890448785995720, -0.709855232293061240, -0.709820014025488550, --0.709784793983365580, -0.709749572166780920, -0.709714348575822380, -0.709679123210577910, -0.709643896071135320, -0.709608667157583310, -0.709573436470009700, -0.709538204008502430, --0.709502969773149310, -0.709467733764039150, -0.709432495981259570, -0.709397256424898480, -0.709362015095044600, -0.709326771991785730, -0.709291527115209820, -0.709256280465404790, --0.709221032042459450, -0.709185781846461420, -0.709150529877499050, -0.709115276135659940, -0.709080020621033040, -0.709044763333706030, -0.709009504273767190, -0.708974243441304110, --0.708938980836405830, -0.708903716459160170, -0.708868450309655170, -0.708833182387978660, -0.708797912694219660, -0.708762641228465770, -0.708727367990804940, -0.708692092981326070, --0.708656816200117000, -0.708621537647265760, -0.708586257322860400, -0.708550975226989730, -0.708515691359741680, -0.708480405721204410, -0.708445118311465730, -0.708409829130614680, --0.708374538178738970, -0.708339245455926860, -0.708303950962266390, -0.708268654697846390, -0.708233356662754670, -0.708198056857079590, -0.708162755280909110, -0.708127451934332020, --0.708092146817436260, -0.708056839930309880, -0.708021531273041680, -0.707986220845719720, -0.707950908648432130, -0.707915594681266970, -0.707880278944313050, -0.707844961437658630, --0.707809642161391750, -0.707774321115600350, -0.707738998300373460, -0.707703673715799120, -0.707668347361965600, -0.707633019238960940, -0.707597689346874060, -0.707562357685792900, --0.707527024255805830, -0.707491689057000880, -0.707456352089467110, -0.707421013353292330, -0.707385672848565130, -0.707350330575373440, -0.707314986533806200, -0.707279640723951440, --0.707244293145897320, -0.707208943799732760, -0.707173592685545800, -0.707138239803424940, -0.707102885153458200, -0.707067528735734420, -0.707032170550341950, -0.706996810597368960, --0.706961448876903710, -0.706926085389035120, -0.706890720133851240, -0.706855353111440650, -0.706819984321891410, -0.706784613765292450, -0.706749241441731900, -0.706713867351298370, --0.706678491494079800, -0.706643113870165320, -0.706607734479642980, -0.706572353322601040, -0.706536970399128660, -0.706501585709313650, -0.706466199253244830, -0.706430811031010130, --0.706395421042698700, -0.706360029288398810, -0.706324635768198710, -0.706289240482186780, -0.706253843430452060, -0.706218444613082810, -0.706183044030167300, -0.706147641681794000, --0.706112237568051750, -0.706076831689029020, -0.706041424044814180, -0.706006014635495500, -0.705970603461162140, -0.705935190521902230, -0.705899775817803940, -0.705864359348956640, --0.705828941115448360, -0.705793521117367820, -0.705758099354803050, -0.705722675827843430, -0.705687250536577100, -0.705651823481092680, -0.705616394661478300, -0.705580964077823340, --0.705545531730215950, -0.705510097618744610, -0.705474661743497820, -0.705439224104564720, -0.705403784702033580, -0.705368343535992870, -0.705332900606530980, -0.705297455913737270, --0.705262009457699790, -0.705226561238507350, -0.705191111256248230, -0.705155659511011670, -0.705120206002885830, -0.705084750731959310, -0.705049293698321140, -0.705013834902059710, --0.704978374343263820, -0.704942912022021530, -0.704907447938422300, -0.704871982092554530, -0.704836514484506790, -0.704801045114367360, -0.704765573982225720, -0.704730101088170140, --0.704694626432289310, -0.704659150014671610, -0.704623671835406310, -0.704588191894581770, -0.704552710192286820, -0.704517226728609840, -0.704481741503640070, -0.704446254517465900, --0.704410765770175810, -0.704375275261859170, -0.704339782992604250, -0.704304288962499860, -0.704268793171634490, -0.704233295620097510, -0.704197796307977190, -0.704162295235362450, --0.704126792402341550, -0.704091287809004100, -0.704055781455438350, -0.704020273341733230, -0.703984763467977110, -0.703949251834259270, -0.703913738440668400, -0.703878223287293210, --0.703842706374222080, -0.703807187701544600, -0.703771667269349030, -0.703736145077724080, -0.703700621126759020, -0.703665095416542430, -0.703629567947163030, -0.703594038718709400, --0.703558507731271150, -0.703522974984936430, -0.703487440479794390, -0.703451904215933400, -0.703416366193443050, -0.703380826412411730, -0.703345284872928240, -0.703309741575081300, --0.703274196518960390, -0.703238649704653880, -0.703203101132250820, -0.703167550801839680, -0.703131998713509950, -0.703096444867350230, -0.703060889263449120, -0.703025331901896090, --0.702989772782779630, -0.702954211906188900, -0.702918649272212150, -0.702883084880939310, -0.702847518732458540, -0.702811950826859100, -0.702776381164229470, -0.702740809744659130, --0.702705236568236800, -0.702669661635051400, -0.702634084945191530, -0.702598506498746780, -0.702562926295805750, -0.702527344336457360, -0.702491760620790330, -0.702456175148894250, --0.702420587920857710, -0.702384998936769640, -0.702349408196718760, -0.702313815700794760, -0.702278221449086140, -0.702242625441681700, -0.702207027678671050, -0.702171428160142770, --0.702135826886185920, -0.702100223856889190, -0.702064619072342190, -0.702029012532633720, -0.701993404237852610, -0.701957794188087790, -0.701922182383428740, -0.701886568823964270, --0.701850953509783330, -0.701815336440974710, -0.701779717617628140, -0.701744097039832200, -0.701708474707675940, -0.701672850621248290, -0.701637224780638840, -0.701601597185936290, --0.701565967837229460, -0.701530336734607960, -0.701494703878160710, -0.701459069267976630, -0.701423432904144550, -0.701387794786754170, -0.701352154915894420, -0.701316513291654230, --0.701280869914122420, -0.701245224783388800, -0.701209577899542080, -0.701173929262671410, -0.701138278872865620, -0.701102626730214510, -0.701066972834806680, -0.701031317186731510, --0.700995659786077810, -0.700960000632935180, -0.700924339727392540, -0.700888677069538720, -0.700853012659463650, -0.700817346497255910, -0.700781678583004890, -0.700746008916799280, --0.700710337498729020, -0.700674664328882920, -0.700638989407350140, -0.700603312734219610, -0.700567634309581020, -0.700531954133523430, -0.700496272206135970, -0.700460588527507480, --0.700424903097727760, -0.700389215916885850, -0.700353526985070920, -0.700317836302371880, -0.700282143868878440, -0.700246449684679750, -0.700210753749864970, -0.700175056064522900, --0.700139356628743490, -0.700103655442615770, -0.700067952506228550, -0.700032247819671770, -0.699996541383034470, -0.699960833196405670, -0.699925123259874550, -0.699889411573530910, --0.699853698137463680, -0.699817982951762340, -0.699782266016515610, -0.699746547331813630, -0.699710826897745220, -0.699675104714399750, -0.699639380781866160, -0.699603655100234480, --0.699567927669593750, -0.699532198490033120, -0.699496467561641630, -0.699460734884509330, -0.699425000458725240, -0.699389264284378200, -0.699353526361558450, -0.699317786690354830, --0.699282045270856800, -0.699246302103153190, -0.699210557187334270, -0.699174810523488950, -0.699139062111706620, -0.699103311952076200, -0.699067560044687950, -0.699031806389630810, --0.698996050986994020, -0.698960293836866860, -0.698924534939339260, -0.698888774294500360, -0.698853011902439540, -0.698817247763245830, -0.698781481877009390, -0.698745714243819150, --0.698709944863764370, -0.698674173736934970, -0.698638400863420220, -0.698602626243309490, -0.698566849876691710, -0.698531071763657250, -0.698495291904295160, -0.698459510298694800, --0.698423726946945320, -0.698387941849136770, -0.698352155005358520, -0.698316366415699830, -0.698280576080249850, -0.698244783999098730, -0.698208990172335730, -0.698173194600050230, --0.698137397282331370, -0.698101598219269430, -0.698065797410953430, -0.698029994857472640, -0.697994190558917200, -0.697958384515376280, -0.697922576726939360, -0.697886767193695690, --0.697850955915735430, -0.697815142893147830, -0.697779328126022280, -0.697743511614448140, -0.697707693358515570, -0.697671873358313710, -0.697636051613932270, -0.697600228125460300, --0.697564402892988040, -0.697528575916604780, -0.697492747196400200, -0.697456916732463350, -0.697421084524884490, -0.697385250573753000, -0.697349414879158250, -0.697313577441189820, --0.697277738259937660, -0.697241897335491130, -0.697206054667939610, -0.697170210257373250, -0.697134364103881410, -0.697098516207553590, -0.697062666568479150, -0.697026815186748470, --0.696990962062450590, -0.696955107195675440, -0.696919250586512160, -0.696883392235051020, -0.696847532141381510, -0.696811670305593100, -0.696775806727775170, -0.696739941408018090, --0.696704074346411130, -0.696668205543043980, -0.696632334998006030, -0.696596462711387530, -0.696560588683277970, -0.696524712913766500, -0.696488835402943600, -0.696452956150898640, --0.696417075157721220, -0.696381192423500940, -0.696345307948327830, -0.696309421732291600, -0.696273533775481730, -0.696237644077987720, -0.696201752639899920, -0.696165859461307710, --0.696129964542300920, -0.696094067882968790, -0.696058169483401820, -0.696022269343689490, -0.695986367463921510, -0.695950463844187240, -0.695914558484577170, -0.695878651385180680, --0.695842742546087250, -0.695806831967387350, -0.695770919649170260, -0.695735005591525900, -0.695699089794543760, -0.695663172258314200, -0.695627252982926600, -0.695591331968471000, --0.695555409215036670, -0.695519484722714190, -0.695483558491593050, -0.695447630521762950, -0.695411700813313380, -0.695375769366334940, -0.695339836180917100, -0.695303901257149690, --0.695267964595122080, -0.695232026194924970, -0.695196086056647840, -0.695160144180380520, -0.695124200566212380, -0.695088255214234120, -0.695052308124535220, -0.695016359297205290, --0.694980408732334690, -0.694944456430013120, -0.694908502390330420, -0.694872546613376050, -0.694836589099240730, -0.694800629848013940, -0.694764668859785610, -0.694728706134645210, --0.694692741672683360, -0.694656775473989740, -0.694620807538654070, -0.694584837866766060, -0.694548866458416400, -0.694512893313694480, -0.694476918432690330, -0.694440941815493650, --0.694404963462194820, -0.694368983372883660, -0.694333001547649650, -0.694297017986583500, -0.694261032689774900, -0.694225045657313580, -0.694189056889289340, -0.694153066385792880, --0.694117074146913590, -0.694081080172741730, -0.694045084463366880, -0.694009087018879530, -0.693973087839369620, -0.693937086924926840, -0.693901084275641120, -0.693865079891602950, --0.693829073772902040, -0.693793065919628530, -0.693757056331872010, -0.693721045009723200, -0.693685031953271690, -0.693649017162607300, -0.693613000637820720, -0.693576982379001670, --0.693540962386240190, -0.693504940659625870, -0.693468917199249630, -0.693432892005201080, -0.693396865077570260, -0.693360836416446970, -0.693324806021921810, -0.693288773894084830, --0.693252740033025730, -0.693216704438834540, -0.693180667111601980, -0.693144628051417630, -0.693108587258371770, -0.693072544732554200, -0.693036500474055520, -0.693000454482965540, --0.692964406759374100, -0.692928357303371990, -0.692892306115049040, -0.692856253194495290, -0.692820198541800550, -0.692784142157055640, -0.692748084040350490, -0.692712024191775020, --0.692675962611419170, -0.692639899299373750, -0.692603834255728580, -0.692567767480573800, -0.692531698973999350, -0.692495628736095940, -0.692459556766953480, -0.692423483066662130, --0.692387407635311700, -0.692351330472993130, -0.692315251579796120, -0.692279170955811150, -0.692243088601127820, -0.692207004515837170, -0.692170918700028890, -0.692134831153793040, --0.692098741877220420, -0.692062650870401090, -0.692026558133424950, -0.691990463666382170, -0.691954367469363560, -0.691918269542459050, -0.691882169885758790, -0.691846068499352820, --0.691809965383332060, -0.691773860537786330, -0.691737753962805900, -0.691701645658480910, -0.691665535624901960, -0.691629423862159310, -0.691593310370343000, -0.691557195149543170, --0.691521078199850650, -0.691484959521355360, -0.691448839114147450, -0.691412716978317740, -0.691376593113956160, -0.691340467521153190, -0.691304340199998760, -0.691268211150583680, --0.691232080372998100, -0.691195947867332410, -0.691159813633676510, -0.691123677672121350, -0.691087539982756960, -0.691051400565673820, -0.691015259420961760, -0.690979116548711910, --0.690942971949014330, -0.690906825621959260, -0.690870677567636760, -0.690834527786137960, -0.690798376277552810, -0.690762223041971430, -0.690726068079484780, -0.690689911390182990, --0.690653752974156430, -0.690617592831495150, -0.690581430962290190, -0.690545267366631690, -0.690509102044609910, -0.690472934996315240, -0.690436766221838360, -0.690400595721269660, --0.690364423494699510, -0.690328249542217940, -0.690292073863916110, -0.690255896459884060, -0.690219717330212260, -0.690183536474990870, -0.690147353894310920, -0.690111169588262570, --0.690074983556936310, -0.690038795800422380, -0.690002606318811610, -0.689966415112194480, -0.689930222180660910, -0.689894027524302070, -0.689857831143208200, -0.689821633037469790, --0.689785433207176890, -0.689749231652420860, -0.689713028373291630, -0.689676823369879900, -0.689640616642275830, -0.689604408190570450, -0.689568198014854030, -0.689531986115217150, --0.689495772491750090, -0.689459557144543770, -0.689423340073688660, -0.689387121279275150, -0.689350900761393490, -0.689314678520134950, -0.689278454555589670, -0.689242228867847920, --0.689206001457000950, -0.689169772323139030, -0.689133541466352640, -0.689097308886732040, -0.689061074584368600, -0.689024838559352370, -0.688988600811774040, -0.688952361341723880, --0.688916120149293150, -0.688879877234572220, -0.688843632597651470, -0.688807386238621370, -0.688771138157573180, -0.688734888354597060, -0.688698636829783720, -0.688662383583223510, --0.688626128615007600, -0.688589871925226470, -0.688553613513970260, -0.688517353381330350, -0.688481091527397120, -0.688444827952261030, -0.688408562656012690, -0.688372295638743140, --0.688336026900542960, -0.688299756441502650, -0.688263484261712690, -0.688227210361264220, -0.688190934740247840, -0.688154657398754140, -0.688118378336873390, -0.688082097554697070, --0.688045815052315430, -0.688009530829819300, -0.687973244887299050, -0.687936957224845940, -0.687900667842550550, -0.687864376740503050, -0.687828083918795020, -0.687791789377516730, --0.687755493116758990, -0.687719195136612170, -0.687682895437167760, -0.687646594018516020, -0.687610290880747880, -0.687573986023953590, -0.687537679448224750, -0.687501371153651620, --0.687465061140325130, -0.687428749408335650, -0.687392435957774550, -0.687356120788732540, -0.687319803901300100, -0.687283485295567820, -0.687247164971627190, -0.687210842929568580, --0.687174519169482910, -0.687138193691460670, -0.687101866495593240, -0.687065537581971090, -0.687029206950684810, -0.686992874601825900, -0.686956540535484720, -0.686920204751752190, --0.686883867250718820, -0.686847528032476170, -0.686811187097114640, -0.686774844444725140, -0.686738500075398270, -0.686702153989225410, -0.686665806186297130, -0.686629456666704390, --0.686593105430537750, -0.686556752477888610, -0.686520397808847550, -0.686484041423505500, -0.686447683321953050, -0.686411323504281800, -0.686374961970582120, -0.686338598720944710, --0.686302233755461290, -0.686265867074222100, -0.686229498677318310, -0.686193128564840490, -0.686156756736880150, -0.686120383193527860, -0.686084007934874670, -0.686047630961011070, --0.686011252272028860, -0.685974871868018420, -0.685938489749070790, -0.685902105915276560, -0.685865720366727550, -0.685829333103514130, -0.685792944125727330, -0.685756553433457980, --0.685720161026797450, -0.685683766905836660, -0.685647371070665980, -0.685610973521377230, -0.685574574258061120, -0.685538173280808570, -0.685501770589710180, -0.685465366184857760, --0.685428960066341910, -0.685392552234253550, -0.685356142688683610, -0.685319731429723580, -0.685283318457464260, -0.685246903771996710, -0.685210487373411500, -0.685174069261800360, --0.685137649437254080, -0.685101227899863720, -0.685064804649719860, -0.685028379686914430, -0.684991953011538040, -0.684955524623681700, -0.684919094523436240, -0.684882662710893380, --0.684846229186143800, -0.684809793949278430, -0.684773357000388880, -0.684736918339565960, -0.684700477966900700, -0.684664035882483810, -0.684627592086407330, -0.684591146578761740, --0.684554699359638420, -0.684518250429127950, -0.684481799787322150, -0.684445347434311960, -0.684408893370188290, -0.684372437595042070, -0.684335980108965130, -0.684299520912048260, --0.684263060004382530, -0.684226597386058840, -0.684190133057169030, -0.684153667017803780, -0.684117199268054140, -0.684080729808011820, -0.684044258637767630, -0.684007785757412830, --0.683971311167038240, -0.683934834866735670, -0.683898356856595950, -0.683861877136710430, -0.683825395707169940, -0.683788912568066180, -0.683752427719490190, -0.683715941161533110, --0.683679452894285890, -0.683642962917840320, -0.683606471232287350, -0.683569977837718220, -0.683533482734223760, -0.683496985921896010, -0.683460487400825770, -0.683423987171103970, --0.683387485232822560, -0.683350981586072330, -0.683314476230944770, -0.683277969167530590, -0.683241460395921930, -0.683204949916209500, -0.683168437728484790, -0.683131923832838610, --0.683095408229362990, -0.683058890918148750, -0.683022371899287380, -0.682985851172869700, -0.682949328738987840, -0.682912804597732510, -0.682876278749195210, -0.682839751193466960, --0.682803221930639580, -0.682766690960804220, -0.682730158284051700, -0.682693623900474170, -0.682657087810162540, -0.682620550013208320, -0.682584010509702300, -0.682547469299736530, --0.682510926383402160, -0.682474381760790450, -0.682437835431992430, -0.682401287397100260, -0.682364737656204760, -0.682328186209397500, -0.682291633056769320, -0.682255078198412470, --0.682218521634417980, -0.682181963364877130, -0.682145403389881060, -0.682108841709521800, -0.682072278323890390, -0.682035713233078320, -0.681999146437176630, -0.681962577936277460, --0.681926007730471740, -0.681889435819850730, -0.681852862204506470, -0.681816286884530110, -0.681779709860012910, -0.681743131131046230, -0.681706550697721900, -0.681669968560131290, --0.681633384718365760, -0.681596799172516480, -0.681560211922675460, -0.681523622968933870, -0.681487032311383300, -0.681450439950114780, -0.681413845885220580, -0.681377250116791620, --0.681340652644919720, -0.681304053469695690, -0.681267452591211910, -0.681230850009559520, -0.681194245724829670, -0.681157639737114520, -0.681121032046505310, -0.681084422653093440, --0.681047811556970250, -0.681011198758227910, -0.680974584256957450, -0.680937968053250580, -0.680901350147198550, -0.680864730538893290, -0.680828109228426400, -0.680791486215889140, --0.680754861501372770, -0.680718235084969650, -0.680681606966770940, -0.680644977146868340, -0.680608345625352770, -0.680571712402316730, -0.680535077477851470, -0.680498440852048030, --0.680461802524998990, -0.680425162496795410, -0.680388520767528870, -0.680351877337290740, -0.680315232206173180, -0.680278585374267550, -0.680241936841665560, -0.680205286608458250, --0.680168634674738200, -0.680131981040596470, -0.680095325706124850, -0.680058668671414510, -0.680022009936557930, -0.679985349501646240, -0.679948687366771170, -0.679912023532024070, --0.679875357997497320, -0.679838690763282070, -0.679802021829470140, -0.679765351196152780, -0.679728678863422480, -0.679692004831370380, -0.679655329100087970, -0.679618651669667620, --0.679581972540200590, -0.679545291711778580, -0.679508609184493070, -0.679471924958436340, -0.679435239033699840, -0.679398551410375200, -0.679361862088553870, -0.679325171068328240, --0.679288478349789670, -0.679251783933029870, -0.679215087818140330, -0.679178390005213410, -0.679141690494340480, -0.679104989285613360, -0.679068286379123310, -0.679031581774963030, --0.678994875473223680, -0.678958167473996950, -0.678921457777375000, -0.678884746383449420, -0.678848033292312030, -0.678811318504054180, -0.678774602018768380, -0.678737883836546100, --0.678701163957479150, -0.678664442381658910, -0.678627719109177850, -0.678590994140127580, -0.678554267474599680, -0.678517539112685970, -0.678480809054478610, -0.678444077300069280, --0.678407343849549700, -0.678370608703011470, -0.678333871860547170, -0.678297133322248060, -0.678260393088205740, -0.678223651158512910, -0.678186907533260830, -0.678150162212541540, --0.678113415196446410, -0.678076666485068260, -0.678039916078498340, -0.678003163976828580, -0.677966410180150690, -0.677929654688557040, -0.677892897502139210, -0.677856138620989260, --0.677819378045198540, -0.677782615774859760, -0.677745851810064410, -0.677709086150904420, -0.677672318797471360, -0.677635549749857850, -0.677598779008155570, -0.677562006572455910, --0.677525232442851570, -0.677488456619434130, -0.677451679102295650, -0.677414899891527480, -0.677378118987222550, -0.677341336389472250, -0.677304552098368600, -0.677267766114003300, --0.677230978436468840, -0.677194189065856930, -0.677157398002259600, -0.677120605245768450, -0.677083810796476060, -0.677047014654474260, -0.677010216819854850, -0.676973417292709550, --0.676936616073131050, -0.676899813161210950, -0.676863008557041400, -0.676826202260713990, -0.676789394272321320, -0.676752584591955310, -0.676715773219707440, -0.676678960155670420, --0.676642145399936060, -0.676605328952596290, -0.676568510813742920, -0.676531690983468550, -0.676494869461864990, -0.676458046249024280, -0.676421221345038130, -0.676384394749999230, --0.676347566463999290, -0.676310736487130470, -0.676273904819484460, -0.676237071461154080, -0.676200236412231040, -0.676163399672807360, -0.676126561242974770, -0.676089721122826170, --0.676052879312453280, -0.676016035811947910, -0.675979190621402770, -0.675942343740909560, -0.675905495170560530, -0.675868644910447510, -0.675831792960663200, -0.675794939321299300, --0.675758083992448080, -0.675721226974201450, -0.675684368266651900, -0.675647507869891580, -0.675610645784012420, -0.675573782009106340, -0.675536916545266040, -0.675500049392583570, --0.675463180551150840, -0.675426310021060020, -0.675389437802403680, -0.675352563895273650, -0.675315688299761960, -0.675278811015961430, -0.675241932043963770, -0.675205051383861330, --0.675168169035745950, -0.675131284999710420, -0.675094399275846690, -0.675057511864247010, -0.675020622765003190, -0.674983731978208160, -0.674946839503953730, -0.674909945342332280, --0.674873049493435630, -0.674836151957356690, -0.674799252734187390, -0.674762351824019890, -0.674725449226946220, -0.674688544943059300, -0.674651638972450950, -0.674614731315213540, --0.674577821971438900, -0.674540910941220150, -0.674503998224649020, -0.674467083821817640, -0.674430167732818830, -0.674393249957744630, -0.674356330496687310, -0.674319409349738770, --0.674282486516992070, -0.674245561998539240, -0.674208635794472430, -0.674171707904883680, -0.674134778329866010, -0.674097847069511370, -0.674060914123912220, -0.674023979493160400, --0.673987043177348920, -0.673950105176569840, -0.673913165490915510, -0.673876224120477870, -0.673839281065350070, -0.673802336325624030, -0.673765389901391900, -0.673728441792746600, --0.673691491999780180, -0.673654540522585000, -0.673617587361253210, -0.673580632515877740, -0.673543675986550630, -0.673506717773364460, -0.673469757876411060, -0.673432796295783560, --0.673395833031574240, -0.673358868083875240, -0.673321901452778700, -0.673284933138377780, -0.673247963140764520, -0.673210991460031380, -0.673174018096270420, -0.673137043049574670, --0.673100066320036380, -0.673063087907747600, -0.673026107812801480, -0.672989126035289930, -0.672952142575305670, -0.672915157432940720, -0.672878170608288250, -0.672841182101440280, --0.672804191912489410, -0.672767200041527680, -0.672730206488648340, -0.672693211253943430, -0.672656214337505440, -0.672619215739426730, -0.672582215459800240, -0.672545213498718210, --0.672508209856273130, -0.672471204532557150, -0.672434197527663650, -0.672397188841684530, -0.672360178474712080, -0.672323166426839650, -0.672286152698159170, -0.672249137288763340, --0.672212120198744320, -0.672175101428195370, -0.672138080977208730, -0.672101058845876790, -0.672064035034291910, -0.672027009542547350, -0.671989982370735150, -0.671952953518948020, --0.671915922987278200, -0.671878890775818860, -0.671841856884662360, -0.671804821313901180, -0.671767784063627580, -0.671730745133934830, -0.671693704524915390, -0.671656662236661540, --0.671619618269265750, -0.671582572622821170, -0.671545525297420290, -0.671508476293155130, -0.671471425610119190, -0.671434373248404710, -0.671397319208104190, -0.671360263489310220, --0.671323206092115820, -0.671286147016613380, -0.671249086262895590, -0.671212023831054720, -0.671174959721184130, -0.671137893933376200, -0.671100826467723510, -0.671063757324318440, --0.671026686503254250, -0.670989614004623420, -0.670952539828518550, -0.670915463975031880, -0.670878386444257010, -0.670841307236286100, -0.670804226351211730, -0.670767143789126940, --0.670730059550124440, -0.670692973634296700, -0.670655886041736200, -0.670618796772536330, -0.670581705826789440, -0.670544613204588360, -0.670507518906025330, -0.670470422931193850, --0.670433325280186400, -0.670396225953095560, -0.670359124950013820, -0.670322022271034660, -0.670284917916250440, -0.670247811885753890, -0.670210704179637460, -0.670173594797994650, --0.670136483740917830, -0.670099371008499480, -0.670062256600832960, -0.670025140518010880, -0.669988022760125920, -0.669950903327270590, -0.669913782219538230, -0.669876659437021570, --0.669839534979813190, -0.669802408848005680, -0.669765281041692420, -0.669728151560965990, -0.669691020405919210, -0.669653887576644460, -0.669616753073235430, -0.669579616895784490, --0.669542479044384460, -0.669505339519127940, -0.669468198320108400, -0.669431055447418320, -0.669393910901150630, -0.669356764681397820, -0.669319616788253470, -0.669282467221810060, --0.669245315982160190, -0.669208163069397340, -0.669171008483613990, -0.669133852224903180, -0.669096694293357500, -0.669059534689070310, -0.669022373412134330, -0.668985210462642370, --0.668948045840687120, -0.668910879546361970, -0.668873711579759720, -0.668836541940973190, -0.668799370630094980, -0.668762197647218670, -0.668725022992436750, -0.668687846665842360, --0.668650668667528090, -0.668613488997587440, -0.668576307656112980, -0.668539124643197540, -0.668501939958934590, -0.668464753603416730, -0.668427565576736990, -0.668390375878988090, --0.668353184510263490, -0.668315991470656010, -0.668278796760258480, -0.668241600379163690, -0.668204402327465250, -0.668167202605255750, -0.668130001212628220, -0.668092798149675370, --0.668055593416490900, -0.668018387013167400, -0.667981178939797910, -0.667943969196475250, -0.667906757783292890, -0.667869544700343650, -0.667832329947720240, -0.667795113525516350, --0.667757895433824690, -0.667720675672738300, -0.667683454242349870, -0.667646231142753120, -0.667609006374040750, -0.667571779936305900, -0.667534551829641280, -0.667497322054140700, --0.667460090609896640, -0.667422857497002480, -0.667385622715550800, -0.667348386265635420, -0.667311148147349040, -0.667273908360784820, -0.667236666906035450, -0.667199423783194740, --0.667162178992355530, -0.667124932533610600, -0.667087684407053570, -0.667050434612777350, -0.667013183150874990, -0.666975930021439400, -0.666938675224564290, -0.666901418760342590, --0.666864160628867220, -0.666826900830231220, -0.666789639364528290, -0.666752376231851130, -0.666715111432293120, -0.666677844965947060, -0.666640576832906670, -0.666603307033264760, --0.666566035567114690, -0.666528762434549170, -0.666491487635662020, -0.666454211170546260, -0.666416933039294830, -0.666379653242000880, -0.666342371778757990, -0.666305088649659320, --0.666267803854797450, -0.666230517394266530, -0.666193229268159270, -0.666155939476568930, -0.666118648019588420, -0.666081354897311570, -0.666044060109831420, -0.666006763657240990, --0.665969465539633430, -0.665932165757102460, -0.665894864309741210, -0.665857561197642720, -0.665820256420899930, -0.665782949979606960, -0.665745641873856540, -0.665708332103742030, --0.665671020669356350, -0.665633707570793430, -0.665596392808146310, -0.665559076381507800, -0.665521758290971930, -0.665484438536631750, -0.665447117118580400, -0.665409794036910920, --0.665372469291717340, -0.665335142883092480, -0.665297814811129930, -0.665260485075922390, -0.665223153677564020, -0.665185820616147730, -0.665148485891766890, -0.665111149504514550, --0.665073811454484630, -0.665036471741770160, -0.664999130366464630, -0.664961787328660850, -0.664924442628452850, -0.664887096265933900, -0.664849748241196800, -0.664812398554335720, --0.664775047205443560, -0.664737694194613820, -0.664700339521939520, -0.664662983187514710, -0.664625625191432420, -0.664588265533786030, -0.664550904214668670, -0.664513541234174500, --0.664476176592396330, -0.664438810289427750, -0.664401442325361800, -0.664364072700292630, -0.664326701414313270, -0.664289328467517090, -0.664251953859997360, -0.664214577591847990, --0.664177199663162240, -0.664139820074033490, -0.664102438824554890, -0.664065055914820460, -0.664027671344923350, -0.663990285114956840, -0.663952897225014830, -0.663915507675190590, --0.663878116465577710, -0.663840723596269110, -0.663803329067359060, -0.663765932878940700, -0.663728535031107400, -0.663691135523952540, -0.663653734357570140, -0.663616331532053460, --0.663578927047495880, -0.663541520903990660, -0.663504113101632040, -0.663466703640513080, -0.663429292520727350, -0.663391879742368020, -0.663354465305529440, -0.663317049210304540, --0.663279631456786810, -0.663242212045070280, -0.663204790975248320, -0.663167368247414290, -0.663129943861661460, -0.663092517818084200, -0.663055090116775550, -0.663017660757829310, --0.662980229741338520, -0.662942797067397450, -0.662905362736099460, -0.662867926747538030, -0.662830489101806420, -0.662793049798998890, -0.662755608839208810, -0.662718166222529660, --0.662680721949054810, -0.662643276018878510, -0.662605828432093920, -0.662568379188794520, -0.662530928289074450, -0.662493475733027080, -0.662456021520746010, -0.662418565652324600, --0.662381108127857000, -0.662343648947436690, -0.662306188111157270, -0.662268725619112100, -0.662231261471395330, -0.662193795668100550, -0.662156328209321130, -0.662118859095150670, --0.662081388325683310, -0.662043915901012530, -0.662006441821232030, -0.661968966086434960, -0.661931488696715920, -0.661894009652168050, -0.661856528952885270, -0.661819046598960740, --0.661781562590489040, -0.661744076927563320, -0.661706589610277060, -0.661669100638724750, -0.661631610012999640, -0.661594117733195540, -0.661556623799405720, -0.661519128211724760, --0.661481630970246040, -0.661444132075063140, -0.661406631526269550, -0.661369129323959860, -0.661331625468227210, -0.661294119959165540, -0.661256612796868200, -0.661219103981429690, --0.661181593512943480, -0.661144081391503160, -0.661106567617202430, -0.661069052190135560, -0.661031535110396030, -0.660994016378077420, -0.660956495993274000, -0.660918973956079460, --0.660881450266587400, -0.660843924924891410, -0.660806397931085860, -0.660768869285264350, -0.660731338987520790, -0.660693807037948440, -0.660656273436641910, -0.660618738183694650, --0.660581201279200610, -0.660543662723253270, -0.660506122515947090, -0.660468580657375570, -0.660431037147632630, -0.660393491986811740, -0.660355945175007400, -0.660318396712313290, --0.660280846598822800, -0.660243294834630510, -0.660205741419830130, -0.660168186354515240, -0.660130629638779550, -0.660093071272717660, -0.660055511256423140, -0.660017949589989830, --0.659980386273511300, -0.659942821307082040, -0.659905254690795860, -0.659867686424746470, -0.659830116509027560, -0.659792544943733740, -0.659754971728958470, -0.659717396864795800, --0.659679820351339320, -0.659642242188683610, -0.659604662376922280, -0.659567080916149020, -0.659529497806458310, -0.659491913047943860, -0.659454326640699700, -0.659416738584819310, --0.659379148880397500, -0.659341557527527770, -0.659303964526304130, -0.659266369876820300, -0.659228773579170870, -0.659191175633449420, -0.659153576039750110, -0.659115974798166530, --0.659078371908793260, -0.659040767371724120, -0.659003161187053040, -0.658965553354873830, -0.658927943875280970, -0.658890332748368280, -0.658852719974229670, -0.658815105552959080, --0.658777489484650980, -0.658739871769399080, -0.658702252407297300, -0.658664631398440230, -0.658627008742921460, -0.658589384440835260, -0.658551758492275210, -0.658514130897336130, --0.658476501656111710, -0.658438870768696120, -0.658401238235182930, -0.658363604055666960, -0.658325968230242030, -0.658288330759002170, -0.658250691642041090, -0.658213050879453700, --0.658175408471333600, -0.658137764417775050, -0.658100118718871750, -0.658062471374718520, -0.658024822385409050, -0.657987171751037160, -0.657949519471697770, -0.657911865547484490, --0.657874209978491550, -0.657836552764812790, -0.657798893906543000, -0.657761233403776010, -0.657723571256605850, -0.657685907465126450, -0.657648242029432620, -0.657610574949618280, --0.657572906225777350, -0.657535235858003890, -0.657497563846392690, -0.657459890191037570, -0.657422214892032670, -0.657384537949471940, -0.657346859363450280, -0.657309179134061390, --0.657271497261399220, -0.657233813745558670, -0.657196128586633570, -0.657158441784718050, -0.657120753339906270, -0.657083063252292820, -0.657045371521971730, -0.657007678149037270, --0.656969983133583240, -0.656932286475704560, -0.656894588175495180, -0.656856888233049330, -0.656819186648460950, -0.656781483421824960, -0.656743778553235180, -0.656706072042785970, --0.656668363890571370, -0.656630654096686080, -0.656592942661224140, -0.656555229584279920, -0.656517514865947230, -0.656479798506321100, -0.656442080505495460, -0.656404360863564350, --0.656366639580622580, -0.656328916656764290, -0.656291192092083750, -0.656253465886674770, -0.656215738040632490, -0.656178008554050950, -0.656140277427024300, -0.656102544659646680, --0.656064810252013020, -0.656027074204217240, -0.655989336516353940, -0.655951597188516810, -0.655913856220801120, -0.655876113613300780, -0.655838369366110060, -0.655800623479323220, --0.655762875953035060, -0.655725126787339740, -0.655687375982331290, -0.655649623538104740, -0.655611869454754140, -0.655574113732373840, -0.655536356371057890, -0.655498597370901440, --0.655460836731998510, -0.655423074454443370, -0.655385310538330270, -0.655347544983754250, -0.655309777790809460, -0.655272008959590040, -0.655234238490190360, -0.655196466382705460, --0.655158692637229370, -0.655120917253856460, -0.655083140232680990, -0.655045361573798000, -0.655007581277301630, -0.654969799343285920, -0.654932015771846120, -0.654894230563076270, --0.654856443717070860, -0.654818655233923910, -0.654780865113730680, -0.654743073356585330, -0.654705279962582320, -0.654667484931815700, -0.654629688264380730, -0.654591889960371540, --0.654554090019882630, -0.654516288443008240, -0.654478485229843420, -0.654440680380482310, -0.654402873895019500, -0.654365065773549250, -0.654327256016166590, -0.654289444622965900, --0.654251631594041210, -0.654213816929487770, -0.654176000629399730, -0.654138182693871810, -0.654100363122998020, -0.654062541916873630, -0.654024719075593010, -0.653986894599250410, --0.653949068487940430, -0.653911240741757990, -0.653873411360797460, -0.653835580345153430, -0.653797747694920160, -0.653759913410192790, -0.653722077491065590, -0.653684239937633250, --0.653646400749990030, -0.653608559928231080, -0.653570717472450770, -0.653532873382743680, -0.653495027659203980, -0.653457180301927120, -0.653419331311007270, -0.653381480686538780, --0.653343628428616930, -0.653305774537335960, -0.653267919012790690, -0.653230061855075150, -0.653192203064284830, -0.653154342640513970, -0.653116480583857300, -0.653078616894409160, --0.653040751572264710, -0.653002884617518430, -0.652965016030264910, -0.652927145810598520, -0.652889273958614620, -0.652851400474407480, -0.652813525358071910, -0.652775648609702160, --0.652737770229393610, -0.652699890217240620, -0.652662008573337560, -0.652624125297779910, -0.652586240390661930, -0.652548353852078210, -0.652510465682123450, -0.652472575880892800, --0.652434684448480630, -0.652396791384981860, -0.652358896690490740, -0.652321000365102650, -0.652283102408912070, -0.652245202822013810, -0.652207301604502130, -0.652169398756472620, --0.652131494278019530, -0.652093588169237790, -0.652055680430221660, -0.652017771061066730, -0.651979860061867370, -0.651941947432717940, -0.651904033173714040, -0.651866117284950140, --0.651828199766520840, -0.651790280618520730, -0.651752359841045180, -0.651714437434188890, -0.651676513398046330, -0.651638587732712220, -0.651600660438282020, -0.651562731514850220, --0.651524800962511420, -0.651486868781360420, -0.651448934971492590, -0.651410999533002300, -0.651373062465984590, -0.651335123770533930, -0.651297183446745700, -0.651259241494714590, --0.651221297914535420, -0.651183352706302570, -0.651145405870111720, -0.651107457406057350, -0.651069507314233960, -0.651031555594737130, -0.650993602247661450, -0.650955647273101850, --0.650917690671152680, -0.650879732441909660, -0.650841772585467270, -0.650803811101920540, -0.650765847991363830, -0.650727883253892860, -0.650689916889602200, -0.650651948898586800, --0.650613979280941110, -0.650576008036760970, -0.650538035166140620, -0.650500060669175320, -0.650462084545959440, -0.650424106796588690, -0.650386127421157760, -0.650348146419761020, --0.650310163792494400, -0.650272179539452270, -0.650234193660729760, -0.650196206156421370, -0.650158217026622910, -0.650120226271428850, -0.650082233890934110, -0.650044239885233630, --0.650006244254422770, -0.649968246998596340, -0.649930248117849270, -0.649892247612276260, -0.649854245481973010, -0.649816241727034120, -0.649778236347554610, -0.649740229343629180, --0.649702220715353440, -0.649664210462822190, -0.649626198586130130, -0.649588185085372860, -0.649550169960645190, -0.649512153212042030, -0.649474134839658210, -0.649436114843589430, --0.649398093223930270, -0.649360069980775890, -0.649322045114220980, -0.649284018624361360, -0.649245990511291620, -0.649207960775106900, -0.649169929415902010, -0.649131896433772560, --0.649093861828813460, -0.649055825601119630, -0.649017787750786000, -0.648979748277908160, -0.648941707182580930, -0.648903664464899110, -0.648865620124958520, -0.648827574162853860, --0.648789526578680160, -0.648751477372532470, -0.648713426544506260, -0.648675374094696670, -0.648637320023198520, -0.648599264330106730, -0.648561207015517120, -0.648523148079524490, --0.648485087522224110, -0.648447025343710570, -0.648408961544079790, -0.648370896123426580, -0.648332829081846200, -0.648294760419433460, -0.648256690136284060, -0.648218618232492940, --0.648180544708155340, -0.648142469563365960, -0.648104392798220740, -0.648066314412814590, -0.648028234407242330, -0.647990152781599770, -0.647952069535981940, -0.647913984670483780, --0.647875898185200420, -0.647837810080227670, -0.647799720355660360, -0.647761629011593730, -0.647723536048122720, -0.647685441465343130, -0.647647345263349990, -0.647609247442238580, --0.647571148002103580, -0.647533046943041150, -0.647494944265145980, -0.647456839968513550, -0.647418734053238690, -0.647380626519417300, -0.647342517367144320, -0.647304406596514670, --0.647266294207624380, -0.647228180200568380, -0.647190064575441930, -0.647151947332340050, -0.647113828471358570, -0.647075707992592510, -0.647037585896137140, -0.646999462182087480, --0.646961336850539580, -0.646923209901588250, -0.646885081335328960, -0.646846951151856640, -0.646808819351267220, -0.646770685933655830, -0.646732550899117630, -0.646694414247747760, --0.646656275979642260, -0.646618136094895930, -0.646579994593604050, -0.646541851475862410, -0.646503706741766270, -0.646465560391410790, -0.646427412424890990, -0.646389262842303140, --0.646351111643742040, -0.646312958829303290, -0.646274804399081690, -0.646236648353173400, -0.646198490691673570, -0.646160331414677440, -0.646122170522280160, -0.646084008014577770, --0.646045843891665420, -0.646007678153638460, -0.645969510800591950, -0.645931341832622020, -0.645893171249823710, -0.645854999052292490, -0.645816825240123400, -0.645778649813412600, --0.645740472772255210, -0.645702294116746290, -0.645664113846981860, -0.645625931963057290, -0.645587748465067830, -0.645549563353108650, -0.645511376627275980, -0.645473188287664760, --0.645434998334370680, -0.645396806767488670, -0.645358613587114990, -0.645320418793344790, -0.645282222386273640, -0.645244024365996480, -0.645205824732609680, -0.645167623486208260, --0.645129420626887720, -0.645091216154743410, -0.645053010069871370, -0.645014802372366750, -0.644976593062324800, -0.644938382139841780, -0.644900169605012730, -0.644861955457933230, --0.644823739698698550, -0.644785522327404940, -0.644747303344147430, -0.644709082749021610, -0.644670860542122860, -0.644632636723547310, -0.644594411293390010, -0.644556184251746880, --0.644517955598712830, -0.644479725334384250, -0.644441493458856370, -0.644403259972224700, -0.644365024874584580, -0.644326788166032280, -0.644288549846662950, -0.644250309916571950, --0.644212068375855430, -0.644173825224608860, -0.644135580462927630, -0.644097334090907190, -0.644059086108643710, -0.644020836516232540, -0.643982585313769280, -0.643944332501349190, --0.643906078079068630, -0.643867822047022860, -0.643829564405307480, -0.643791305154017950, -0.643753044293250420, -0.643714781823100380, -0.643676517743663300, -0.643638252055034550, --0.643599984757310620, -0.643561715850586640, -0.643523445334958090, -0.643485173210521230, -0.643446899477371440, -0.643408624135604400, -0.643370347185315490, -0.643332068626601080, --0.643293788459556430, -0.643255506684277330, -0.643217223300859060, -0.643178938309398210, -0.643140651709989910, -0.643102363502729980, -0.643064073687713900, -0.643025782265037930, --0.642987489234797430, -0.642949194597088320, -0.642910898352005770, -0.642872600499646450, -0.642834301040105530, -0.642795999973478800, -0.642757697299861870, -0.642719393019350990, --0.642681087132041640, -0.642642779638029180, -0.642604470537410100, -0.642566159830279870, -0.642527847516734310, -0.642489533596868670, -0.642451218070779650, -0.642412900938562510, --0.642374582200313180, -0.642336261856127020, -0.642297939906100510, -0.642259616350329130, -0.642221291188908800, -0.642182964421934900, -0.642144636049503890, -0.642106306071711260, --0.642067974488652940, -0.642029641300424280, -0.641991306507121880, -0.641952970108841230, -0.641914632105677780, -0.641876292497728150, -0.641837951285087690, -0.641799608467852440, --0.641761264046117770, -0.641722918019980380, -0.641684570389535640, -0.641646221154879460, -0.641607870316107330, -0.641569517873315950, -0.641531163826600690, -0.641492808176057580, --0.641454450921782100, -0.641416092063870850, -0.641377731602419400, -0.641339369537523570, -0.641301005869278960, -0.641262640597782260, -0.641224273723128960, -0.641185905245414520, --0.641147535164735770, -0.641109163481188070, -0.641070790194867570, -0.641032415305869630, -0.640994038814291070, -0.640955660720227470, -0.640917281023774650, -0.640878899725028320, --0.640840516824085050, -0.640802132321040440, -0.640763746215990640, -0.640725358509031010, -0.640686969200258360, -0.640648578289768290, -0.640610185777656830, -0.640571791664019450, --0.640533395948952980, -0.640494998632553100, -0.640456599714915640, -0.640418199196136410, -0.640379797076311870, -0.640341393355537970, -0.640302988033910280, -0.640264581111525400, --0.640226172588479030, -0.640187762464867300, -0.640149350740785720, -0.640110937416331180, -0.640072522491599290, -0.640034105966686080, -0.639995687841687260, -0.639957268116699620, --0.639918846791818760, -0.639880423867140840, -0.639841999342761420, -0.639803573218777450, -0.639765145495284400, -0.639726716172378640, -0.639688285250155640, -0.639649852728712330, --0.639611418608144410, -0.639572982888547580, -0.639534545570018540, -0.639496106652653330, -0.639457666136547640, -0.639419224021797630, -0.639380780308499760, -0.639342334996749970, --0.639303888086644400, -0.639265439578278750, -0.639226989471749830, -0.639188537767153450, -0.639150084464585650, -0.639111629564142470, -0.639073173065920370, -0.639034714970015410, --0.638996255276523710, -0.638957793985540980, -0.638919331097164140, -0.638880866611488910, -0.638842400528611190, -0.638803932848627910, -0.638765463571634660, -0.638726992697727810, --0.638688520227003180, -0.638650046159557560, -0.638611570495486780, -0.638573093234887090, -0.638534614377854410, -0.638496133924485450, -0.638457651874876130, -0.638419168229122810, --0.638380682987321090, -0.638342196149568110, -0.638303707715959570, -0.638265217686591720, -0.638226726061560610, -0.638188232840962930, -0.638149738024894720, -0.638111241613451790, --0.638072743606731160, -0.638034244004828550, -0.637995742807840440, -0.637957240015862630, -0.637918735628992040, -0.637880229647324490, -0.637841722070956570, -0.637803212899983870, --0.637764702134503540, -0.637726189774611370, -0.637687675820403870, -0.637649160271976710, -0.637610643129427060, -0.637572124392850830, -0.637533604062344160, -0.637495082138003210, --0.637456558619924900, -0.637418033508205250, -0.637379506802940420, -0.637340978504226550, -0.637302448612160570, -0.637263917126838500, -0.637225384048356160, -0.637186849376810800, --0.637148313112298360, -0.637109775254915080, -0.637071235804757000, -0.637032694761921260, -0.636994152126503680, -0.636955607898600730, -0.636917062078308450, -0.636878514665723870, --0.636839965660943030, -0.636801415064062180, -0.636762862875177580, -0.636724309094386040, -0.636685753721783820, -0.636647196757467170, -0.636608638201532130, -0.636570078054075950, --0.636531516315194560, -0.636492952984983980, -0.636454388063541380, -0.636415821550962770, -0.636377253447344640, -0.636338683752783130, -0.636300112467375170, -0.636261539591216900, --0.636222965124404790, -0.636184389067034890, -0.636145811419204450, -0.636107232181009510, -0.636068651352546420, -0.636030068933911340, -0.635991484925201410, -0.635952899326512890, --0.635914312137942030, -0.635875723359584980, -0.635837132991539100, -0.635798541033900320, -0.635759947486764900, -0.635721352350229860, -0.635682755624391470, -0.635644157309346200, --0.635605557405190200, -0.635566955912020730, -0.635528352829933810, -0.635489748159025920, -0.635451141899393450, -0.635412534051133400, -0.635373924614342060, -0.635335313589115880, --0.635296700975551020, -0.635258086773744850, -0.635219470983793390, -0.635180853605793240, -0.635142234639840650, -0.635103614086032890, -0.635064991944465970, -0.635026368215236610, --0.634987742898441070, -0.634949115994176360, -0.634910487502538980, -0.634871857423625060, -0.634833225757531760, -0.634794592504355440, -0.634755957664192570, -0.634717321237139530, --0.634678683223293460, -0.634640043622750840, -0.634601402435607920, -0.634562759661961300, -0.634524115301908000, -0.634485469355544510, -0.634446821822967300, -0.634408172704272740, --0.634369521999557980, -0.634330869708919500, -0.634292215832453880, -0.634253560370257260, -0.634214903322427250, -0.634176244689059860, -0.634137584470251590, -0.634098922666099570, --0.634060259276700400, -0.634021594302150440, -0.633982927742546280, -0.633944259597985060, -0.633905589868563270, -0.633866918554377380, -0.633828245655523980, -0.633789571172100220, --0.633750895104202570, -0.633712217451927740, -0.633673538215371870, -0.633634857394632660, -0.633596174989806250, -0.633557491000989350, -0.633518805428278430, -0.633480118271770860, --0.633441429531562910, -0.633402739207751140, -0.633364047300432830, -0.633325353809704340, -0.633286658735662590, -0.633247962078403730, -0.633209263838025340, -0.633170564014623900, --0.633131862608295900, -0.633093159619138040, -0.633054455047247440, -0.633015748892720830, -0.632977041155654900, -0.632938331836145900, -0.632899620934291420, -0.632860908450187940, --0.632822194383932280, -0.632783478735620690, -0.632744761505350750, -0.632706042693218840, -0.632667322299321540, -0.632628600323756340, -0.632589876766619600, -0.632551151628008120, --0.632512424908018400, -0.632473696606748010, -0.632434966724293450, -0.632396235260751390, -0.632357502216218450, -0.632318767590791970, -0.632280031384568670, -0.632241293597645360, --0.632202554230118400, -0.632163813282085370, -0.632125070753642880, -0.632086326644887620, -0.632047580955916290, -0.632008833686826250, -0.631970084837714220, -0.631931334408676880, --0.631892582399810940, -0.631853828811213880, -0.631815073642982280, -0.631776316895212630, -0.631737558568002510, -0.631698798661448510, -0.631660037175647450, -0.631621274110696020, --0.631582509466691700, -0.631543743243731190, -0.631504975441911200, -0.631466206061328530, -0.631427435102080660, -0.631388662564264180, -0.631349888447976130, -0.631311112753312980, --0.631272335480372320, -0.631233556629250850, -0.631194776200045490, -0.631155994192852840, -0.631117210607770600, -0.631078425444895340, -0.631039638704323560, -0.631000850386153170, --0.630962060490480540, -0.630923269017402810, -0.630884475967016580, -0.630845681339419540, -0.630806885134708170, -0.630768087352979730, -0.630729287994330590, -0.630690487058858660, --0.630651684546660540, -0.630612880457833150, -0.630574074792473180, -0.630535267550678460, -0.630496458732545560, -0.630457648338171420, -0.630418836367652840, -0.630380022821087630, --0.630341207698572270, -0.630302391000203580, -0.630263572726079250, -0.630224752876295870, -0.630185931450950810, -0.630147108450140440, -0.630108283873962670, -0.630069457722514210, --0.630030629995892100, -0.629991800694193140, -0.629952969817514920, -0.629914137365954250, -0.629875303339608280, -0.629836467738573820, -0.629797630562948350, -0.629758791812828900, --0.629719951488312500, -0.629681109589495860, -0.629642266116476780, -0.629603421069352080, -0.629564574448218670, -0.629525726253173600, -0.629486876484314560, -0.629448025141738370, --0.629409172225541710, -0.629370317735822420, -0.629331461672677390, -0.629292604036203680, -0.629253744826498210, -0.629214884043658660, -0.629176021687781860, -0.629137157758965060, --0.629098292257304960, -0.629059425182899590, -0.629020556535845540, -0.628981686316240070, -0.628942814524180220, -0.628903941159763560, -0.628865066223087020, -0.628826189714247860, --0.628787311633342890, -0.628748431980469920, -0.628709550755725880, -0.628670667959207670, -0.628631783591013130, -0.628592897651239160, -0.628554010139982910, -0.628515121057341310, --0.628476230403412270, -0.628437338178292610, -0.628398444382079590, -0.628359549014870120, -0.628320652076762130, -0.628281753567852540, -0.628242853488238500, -0.628203951838017030, --0.628165048617286060, -0.628126143826142400, -0.628087237464683420, -0.628048329533006040, -0.628009420031208080, -0.627970508959386660, -0.627931596317638620, -0.627892682106061860, --0.627853766324753430, -0.627814848973810570, -0.627775930053330320, -0.627737009563410500, -0.627698087504148240, -0.627659163875640690, -0.627620238677984890, -0.627581311911278860, --0.627542383575619530, -0.627503453671104270, -0.627464522197830110, -0.627425589155894860, -0.627386654545395660, -0.627347718366429890, -0.627308780619094340, -0.627269841303487290, --0.627230900419705640, -0.627191957967846440, -0.627153013948007600, -0.627114068360286270, -0.627075121204779710, -0.627036172481585050, -0.626997222190800340, -0.626958270332522490, --0.626919316906848990, -0.626880361913876860, -0.626841405353704250, -0.626802447226428080, -0.626763487532145720, -0.626724526270954320, -0.626685563442952010, -0.626646599048235720, --0.626607633086903040, -0.626568665559050890, -0.626529696464777300, -0.626490725804179640, -0.626451753577355050, -0.626412779784400800, -0.626373804425414900, -0.626334827500494520, --0.626295849009736670, -0.626256868953239620, -0.626217887331100400, -0.626178904143416370, -0.626139919390284790, -0.626100933071803810, -0.626061945188070460, -0.626022955739182210, --0.625983964725236210, -0.625944972146330710, -0.625905978002562760, -0.625866982294029820, -0.625827985020829150, -0.625788986183058780, -0.625749985780816090, -0.625710983814198320, --0.625671980283302730, -0.625632975188227580, -0.625593968529070010, -0.625554960305927170, -0.625515950518897190, -0.625476939168077450, -0.625437926253565310, -0.625398911775458030, --0.625359895733853750, -0.625320878128849730, -0.625281858960543560, -0.625242838229032480, -0.625203815934414540, -0.625164792076787100, -0.625125766656247640, -0.625086739672893410, --0.625047711126822780, -0.625008681018132780, -0.624969649346921120, -0.624930616113284930, -0.624891581317322590, -0.624852544959131340, -0.624813507038808340, -0.624774467556451940, --0.624735426512159300, -0.624696383906028220, -0.624657339738155740, -0.624618294008640220, -0.624579246717579030, -0.624540197865069760, -0.624501147451209550, -0.624462095476096880, --0.624423041939829000, -0.624383986842503510, -0.624344930184217660, -0.624305871965069810, -0.624266812185157340, -0.624227750844577820, -0.624188687943428630, -0.624149623481807910, --0.624110557459813250, -0.624071489877542240, -0.624032420735092020, -0.623993350032561180, -0.623954277770046970, -0.623915203947646770, -0.623876128565458820, -0.623837051623580610, --0.623797973122109720, -0.623758893061143520, -0.623719811440780480, -0.623680728261117980, -0.623641643522253600, -0.623602557224284700, -0.623563469367309780, -0.623524379951426290, --0.623485288976731720, -0.623446196443323660, -0.623407102351300480, -0.623368006700759420, -0.623328909491798420, -0.623289810724514840, -0.623250710399007040, -0.623211608515372490, --0.623172505073708580, -0.623133400074113660, -0.623094293516685330, -0.623055185401521270, -0.623016075728718870, -0.622976964498376580, -0.622937851710591910, -0.622898737365462640, --0.622859621463086150, -0.622820504003561040, -0.622781384986984540, -0.622742264413454700, -0.622703142283068780, -0.622664018595925350, -0.622624893352121900, -0.622585766551756240, --0.622546638194925730, -0.622507508281729070, -0.622468376812263640, -0.622429243786626780, -0.622390109204917330, -0.622350973067232530, -0.622311835373670300, -0.622272696124328120, --0.622233555319304580, -0.622194412958697150, -0.622155269042603650, -0.622116123571121670, -0.622076976544349680, -0.622037827962385270, -0.621998677825326250, -0.621959526133270320, --0.621920372886315740, -0.621881218084560430, -0.621842061728101970, -0.621802903817037960, -0.621763744351467080, -0.621724583331486840, -0.621685420757194800, -0.621646256628689550, --0.621607090946068700, -0.621567923709430150, -0.621528754918871380, -0.621489584574490990, -0.621450412676386790, -0.621411239224656460, -0.621372064219397720, -0.621332887660709150, --0.621293709548688340, -0.621254529883433330, -0.621215348665041580, -0.621176165893611910, -0.621136981569241690, -0.621097795692029160, -0.621058608262071710, -0.621019419279468020, --0.620980228744315910, -0.620941036656713190, -0.620901843016757440, -0.620862647824547590, -0.620823451080181000, -0.620784252783755490, -0.620745052935369630, -0.620705851535121140, --0.620666648583108050, -0.620627444079428050, -0.620588238024179730, -0.620549030417460790, -0.620509821259369380, -0.620470610550002970, -0.620431398289460480, -0.620392184477839390, --0.620352969115237850, -0.620313752201753550, -0.620274533737485310, -0.620235313722530600, -0.620196092156987680, -0.620156869040954130, -0.620117644374528880, -0.620078418157809400, --0.620039190390893500, -0.619999961073880110, -0.619960730206866710, -0.619921497789951540, -0.619882263823232190, -0.619843028306807600, -0.619803791240775450, -0.619764552625233780, --0.619725312460280400, -0.619686070746014120, -0.619646827482532640, -0.619607582669934100, -0.619568336308316200, -0.619529088397777870, -0.619489838938416800, -0.619450587930331140, --0.619411335373618700, -0.619372081268378170, -0.619332825614707480, -0.619293568412704440, -0.619254309662467750, -0.619215049364095330, -0.619175787517685210, -0.619136524123335420, --0.619097259181144550, -0.619057992691210530, -0.619018724653631610, -0.618979455068505490, -0.618940183935931090, -0.618900911256006210, -0.618861637028829010, -0.618822361254497410, --0.618783083933110320, -0.618743805064765450, -0.618704524649561050, -0.618665242687595040, -0.618625959178966230, -0.618586674123772550, -0.618547387522112140, -0.618508099374083020, --0.618468809679783900, -0.618429518439312820, -0.618390225652767580, -0.618350931320247100, -0.618311635441849190, -0.618272338017672340, -0.618233039047814240, -0.618193738532373920, --0.618154436471449300, -0.618115132865138530, -0.618075827713539530, -0.618036521016751440, -0.617997212774871960, -0.617957902987999460, -0.617918591656231860, -0.617879278779668080, --0.617839964358406160, -0.617800648392544340, -0.617761330882180550, -0.617722011827413710, -0.617682691228341850, -0.617643369085063010, -0.617604045397675990, -0.617564720166278950, --0.617525393390970010, -0.617486065071847330, -0.617446735209009830, -0.617407403802555430, -0.617368070852582610, -0.617328736359189170, -0.617289400322474260, -0.617250062742535910, --0.617210723619472380, -0.617171382953381590, -0.617132040744362790, -0.617092696992513900, -0.617053351697933180, -0.617014004860718890, -0.616974656480969830, -0.616935306558784150, --0.616895955094259760, -0.616856602087495930, -0.616817247538590570, -0.616777891447642170, -0.616738533814748520, -0.616699174640009010, -0.616659813923521540, -0.616620451665384590, --0.616581087865696100, -0.616541722524555300, -0.616502355642060130, -0.616462987218309060, -0.616423617253400220, -0.616384245747432670, -0.616344872700504420, -0.616305498112714070, --0.616266121984159640, -0.616226744314940290, -0.616187365105154040, -0.616147984354899370, -0.616108602064274310, -0.616069218233378240, -0.616029832862309060, -0.615990445951164920, --0.615951057500044970, -0.615911667509047470, -0.615872275978270770, -0.615832882907813130, -0.615793488297773470, -0.615754092148250170, -0.615714694459341680, -0.615675295231146060, --0.615635894463762550, -0.615596492157289290, -0.615557088311824760, -0.615517682927467220, -0.615478276004315820, -0.615438867542468680, -0.615399457542024520, -0.615360046003081250, --0.615320632925738130, -0.615281218310093530, -0.615241802156245580, -0.615202384464293430, -0.615162965234335330, -0.615123544466469770, -0.615084122160795000, -0.615044698317410380, --0.615005272936413940, -0.614965846017904270, -0.614926417561979740, -0.614886987568739380, -0.614847556038281670, -0.614808122970704970, -0.614768688366107760, -0.614729252224589070, --0.614689814546247270, -0.614650375331180940, -0.614610934579488340, -0.614571492291268730, -0.614532048466620350, -0.614492603105641580, -0.614453156208431550, -0.614413707775088750, --0.614374257805711640, -0.614334806300398490, -0.614295353259248670, -0.614255898682360520, -0.614216442569832650, -0.614176984921763310, -0.614137525738251750, -0.614098065019396460, --0.614058602765296000, -0.614019138976048760, -0.613979673651753880, -0.613940206792509930, -0.613900738398415410, -0.613861268469568680, -0.613821797006069200, -0.613782324008015130, --0.613742849475504950, -0.613703373408638010, -0.613663895807512570, -0.613624416672227450, -0.613584936002881000, -0.613545453799572480, -0.613505970062400370, -0.613466484791463260, --0.613426997986859620, -0.613387509648688820, -0.613348019777049340, -0.613308528372039750, -0.613269035433758440, -0.613229540962304980, -0.613190044957777620, -0.613150547420275080, --0.613111048349895940, -0.613071547746739440, -0.613032045610904190, -0.612992541942488760, -0.612953036741591520, -0.612913530008312170, -0.612874021742748960, -0.612834511945000380, --0.612795000615165790, -0.612755487753343760, -0.612715973359633010, -0.612676457434131900, -0.612636939976940130, -0.612597420988155950, -0.612557900467878170, -0.612518378416205380, --0.612478854833236940, -0.612439329719071330, -0.612399803073807370, -0.612360274897543630, -0.612320745190379600, -0.612281213952413640, -0.612241681183744670, -0.612202146884471050, --0.612162611054692500, -0.612123073694507470, -0.612083534804014340, -0.612043994383312700, -0.612004452432501120, -0.611964908951678320, -0.611925363940942990, -0.611885817400394600, --0.611846269330131640, -0.611806719730253020, -0.611767168600857230, -0.611727615942043950, -0.611688061753911550, -0.611648506036558960, -0.611608948790084870, -0.611569390014588650, --0.611529829710169000, -0.611490267876924840, -0.611450704514954540, -0.611411139624357890, -0.611371573205233390, -0.611332005257679610, -0.611292435781796150, -0.611252864777681590, --0.611213292245434970, -0.611173718185154650, -0.611134142596940430, -0.611094565480890810, -0.611054986837104910, -0.611015406665681100, -0.610975824966719090, -0.610936241740317580, --0.610896656986575360, -0.610857070705591250, -0.610817482897464850, -0.610777893562294620, -0.610738302700179700, -0.610698710311218700, -0.610659116395511290, -0.610619520953156080, --0.610579923984252090, -0.610540325488897920, -0.610500725467193250, -0.610461123919236790, -0.610421520845127130, -0.610381916244964070, -0.610342310118846210, -0.610302702466872570, --0.610263093289141860, -0.610223482585753650, -0.610183870356806880, -0.610144256602400350, -0.610104641322632870, -0.610065024517604030, -0.610025406187412740, -0.609985786332157940, --0.609946164951938320, -0.609906542046853570, -0.609866917617002510, -0.609827291662484170, -0.609787664183397250, -0.609748035179841440, -0.609708404651915670, -0.609668772599718410, --0.609629139023349700, -0.609589503922908120, -0.609549867298492700, -0.609510229150202250, -0.609470589478136700, -0.609430948282394520, -0.609391305563075080, -0.609351661320277070, --0.609312015554100080, -0.609272368264643260, -0.609232719452005410, -0.609193069116285350, -0.609153417257583100, -0.609113763875997250, -0.609074108971626950, -0.609034452544571110, --0.608994794594929440, -0.608955135122800750, -0.608915474128283950, -0.608875811611478750, -0.608836147572484050, -0.608796482011398910, -0.608756814928322340, -0.608717146323354050, --0.608677476196592850, -0.608637804548137980, -0.608598131378088270, -0.608558456686543510, -0.608518780473602640, -0.608479102739364900, -0.608439423483928990, -0.608399742707394830, --0.608360060409861350, -0.608320376591427790, -0.608280691252192860, -0.608241004392256590, -0.608201316011717790, -0.608161626110675260, -0.608121934689229150, -0.608082241747478160, --0.608042547285521540, -0.608002851303458210, -0.607963153801388100, -0.607923454779410120, -0.607883754237623530, -0.607844052176127140, -0.607804348595021080, -0.607764643494404070, --0.607724936874375450, -0.607685228735034170, -0.607645519076480120, -0.607605807898812240, -0.607566095202130010, -0.607526380986532000, -0.607486665252118470, -0.607446947998988350, --0.607407229227240770, -0.607367508936974780, -0.607327787128290390, -0.607288063801286530, -0.607248338956062120, -0.607208612592717190, -0.607168884711350780, -0.607129155312062130, --0.607089424394950280, -0.607049691960115270, -0.607009958007655890, -0.606970222537671740, -0.606930485550261630, -0.606890747045525700, -0.606851007023562870, -0.606811265484472510, --0.606771522428353640, -0.606731777855306300, -0.606692031765429520, -0.606652284158822660, -0.606612535035584770, -0.606572784395815860, -0.606533032239615080, -0.606493278567081240, --0.606453523378314600, -0.606413766673414180, -0.606374008452479350, -0.606334248715609150, -0.606294487462903600, -0.606254724694461840, -0.606214960410383360, -0.606175194610767080, --0.606135427295713240, -0.606095658465320760, -0.606055888119689130, -0.606016116258917380, -0.605976342883105760, -0.605936567992353290, -0.605896791586759350, -0.605857013666423080, --0.605817234231444730, -0.605777453281923120, -0.605737670817957710, -0.605697886839648310, -0.605658101347094300, -0.605618314340395040, -0.605578525819649550, -0.605538735784958200, --0.605498944236420030, -0.605459151174134400, -0.605419356598200560, -0.605379560508718770, -0.605339762905787950, -0.605299963789507790, -0.605260163159977330, -0.605220361017296930, --0.605180557361565510, -0.605140752192882770, -0.605100945511347740, -0.605061137317060680, -0.605021327610120840, -0.604981516390627690, -0.604941703658680390, -0.604901889414379060, --0.604862073657823180, -0.604822256389111690, -0.604782437608344830, -0.604742617315621960, -0.604702795511042560, -0.604662972194705770, -0.604623147366711970, -0.604583321027160280, --0.604543493176150300, -0.604503663813781180, -0.604463832940153270, -0.604424000555365830, -0.604384166659518330, -0.604344331252710030, -0.604304494335041410, -0.604264655906611380, --0.604224815967519760, -0.604184974517865790, -0.604145131557749740, -0.604105287087270850, -0.604065441106528380, -0.604025593615622690, -0.603985744614652930, -0.603945894103718910, --0.603906042082919760, -0.603866188552355740, -0.603826333512126450, -0.603786476962331230, -0.603746618903069470, -0.603706759334441510, -0.603666898256546620, -0.603627035669484500, --0.603587171573354510, -0.603547305968256900, -0.603507438854291030, -0.603467570231556620, -0.603427700100152790, -0.603387828460180130, -0.603347955311737900, -0.603308080654925470, --0.603268204489843200, -0.603228326816590330, -0.603188447635266690, -0.603148566945971630, -0.603108684748805410, -0.603068801043867510, -0.603028915831257620, -0.602989029111075100, --0.602949140883420330, -0.602909251148392780, -0.602869359906092030, -0.602829467156617560, -0.602789572900069740, -0.602749677136548030, -0.602709779866152150, -0.602669881088981450, --0.602629980805136300, -0.602590079014716280, -0.602550175717820770, -0.602510270914550120, -0.602470364605003810, -0.602430456789281530, -0.602390547467482770, -0.602350636639708000, --0.602310724306056700, -0.602270810466628450, -0.602230895121522950, -0.602190978270840560, -0.602151059914680650, -0.602111140053143150, -0.602071218686327400, -0.602031295814334010, --0.601991371437262330, -0.601951445555212290, -0.601911518168283250, -0.601871589276575800, -0.601831658880189300, -0.601791726979223670, -0.601751793573778390, -0.601711858663954050, --0.601671922249849890, -0.601631984331565730, -0.601592044909201930, -0.601552103982857970, -0.601512161552633760, -0.601472217618628790, -0.601432272180943640, -0.601392325239677890, --0.601352376794931250, -0.601312426846803310, -0.601272475395394630, -0.601232522440804830, -0.601192567983133700, -0.601152612022480830, -0.601112654558946690, -0.601072695592630990, --0.601032735123633530, -0.600992773152053910, -0.600952809677992580, -0.600912844701549380, -0.600872878222823650, -0.600832910241916100, -0.600792940758926310, -0.600752969773954090, --0.600712997287099150, -0.600673023298462060, -0.600633047808142310, -0.600593070816240030, -0.600553092322854810, -0.600513112328087020, -0.600473130832036570, -0.600433147834803280, --0.600393163336486730, -0.600353177337187740, -0.600313189837005660, -0.600273200836040740, -0.600233210334392360, -0.600193218332161330, -0.600153224829447220, -0.600113229826349740, --0.600073233322969580, -0.600033235319406330, -0.599993235815759920, -0.599953234812130140, -0.599913232308617590, -0.599873228305321970, -0.599833222802343300, -0.599793215799781180, --0.599753207297736290, -0.599713197296308560, -0.599673185795597700, -0.599633172795703610, -0.599593158296726880, -0.599553142298767330, -0.599513124801924870, -0.599473105806299200, --0.599433085311991240, -0.599393063319100470, -0.599353039827727030, -0.599313014837970730, -0.599272988349932150, -0.599232960363711210, -0.599192930879407390, -0.599152899897121730, --0.599112867416953690, -0.599072833439003530, -0.599032797963370940, -0.598992760990156750, -0.598952722519460630, -0.598912682551382640, -0.598872641086022670, -0.598832598123481440, --0.598792553663858750, -0.598752507707254630, -0.598712460253768790, -0.598672411303502350, -0.598632360856554690, -0.598592308913026280, -0.598552255473016710, -0.598512200536626790, --0.598472144103956440, -0.598432086175105350, -0.598392026750174330, -0.598351965829263310, -0.598311903412472420, -0.598271839499901370, -0.598231774091651070, -0.598191707187821330, --0.598151638788512300, -0.598111568893823890, -0.598071497503856800, -0.598031424618711060, -0.597991350238486710, -0.597951274363283660, -0.597911196993202830, -0.597871118128343930, --0.597831037768807310, -0.597790955914692670, -0.597750872566101040, -0.597710787723132130, -0.597670701385885960, -0.597630613554463450, -0.597590524228964410, -0.597550433409488990, --0.597510341096137100, -0.597470247289009770, -0.597430151988206810, -0.597390055193828480, -0.597349956905974700, -0.597309857124746270, -0.597269755850243330, -0.597229653082565930, --0.597189548821814080, -0.597149443068088590, -0.597109335821489620, -0.597069227082117290, -0.597029116850071540, -0.596989005125453280, -0.596948891908362530, -0.596908777198899230, --0.596868660997164400, -0.596828543303257850, -0.596788424117279950, -0.596748303439330610, -0.596708181269510970, -0.596668057607920740, -0.596627932454660390, -0.596587805809829950, --0.596547677673530230, -0.596507548045861480, -0.596467416926923730, -0.596427284316817020, -0.596387150215642590, -0.596347014623500260, -0.596306877540490390, -0.596266738966712890, --0.596226598902269030, -0.596186457347258610, -0.596146314301782000, -0.596106169765939330, -0.596066023739831530, -0.596025876223558740, -0.595985727217220760, -0.595945576720918970, --0.595905424734753160, -0.595865271258823830, -0.595825116293230980, -0.595784959838075670, -0.595744801893457910, -0.595704642459478180, -0.595664481536236520, -0.595624319123833960, --0.595584155222370630, -0.595543989831947010, -0.595503822952662910, -0.595463654584619690, -0.595423484727917280, -0.595383313382656150, -0.595343140548936440, -0.595302966226859190, --0.595262790416524630, -0.595222613118032600, -0.595182434331484430, -0.595142254056980180, -0.595102072294620310, -0.595061889044504970, -0.595021704306735180, -0.594981518081411090, --0.594941330368633280, -0.594901141168501790, -0.594860950481117760, -0.594820758306581430, -0.594780564644993180, -0.594740369496453040, -0.594700172861062470, -0.594659974738921400, --0.594619775130130420, -0.594579574034789670, -0.594539371453000290, -0.594499167384862530, -0.594458961830476530, -0.594418754789943330, -0.594378546263363390, -0.594338336250836980, --0.594298124752464460, -0.594257911768346970, -0.594217697298584650, -0.594177481343278190, -0.594137263902527520, -0.594097044976434230, -0.594056824565098120, -0.594016602668620110, --0.593976379287100120, -0.593936154420639630, -0.593895928069338770, -0.593855700233298030, -0.593815470912617660, -0.593775240107399020, -0.593735007817742240, -0.593694774043748040, --0.593654538785516440, -0.593614302043148910, -0.593574063816745600, -0.593533824106406760, -0.593493582912233750, -0.593453340234326720, -0.593413096072786360, -0.593372850427712930, --0.593332603299207780, -0.593292354687371070, -0.593252104592303490, -0.593211853014105280, -0.593171599952877720, -0.593131345408721260, -0.593091089381736380, -0.593050831872023450, --0.593010572879683840, -0.592970312404817790, -0.592930050447525890, -0.592889787007908510, -0.592849522086067120, -0.592809255682101850, -0.592768987796113090, -0.592728718428202180, --0.592688447578469500, -0.592648175247015740, -0.592607901433941150, -0.592567626139347210, -0.592527349363334180, -0.592487071106002740, -0.592446791367453260, -0.592406510147787220, --0.592366227447104880, -0.592325943265506920, -0.592285657603093820, -0.592245370459966840, -0.592205081836226550, -0.592164791731973450, -0.592124500147308110, -0.592084207082331890, --0.592043912537145060, -0.592003616511848070, -0.591963319006542530, -0.591923020021328570, -0.591882719556307110, -0.591842417611578520, -0.591802114187244150, -0.591761809283404610, --0.591721502900160460, -0.591681195037612300, -0.591640885695861370, -0.591600574875008390, -0.591560262575153820, -0.591519948796398350, -0.591479633538843250, -0.591439316802589210, --0.591398998587736810, -0.591358678894386540, -0.591318357722639850, -0.591278035072597350, -0.591237710944359510, -0.591197385338027570, -0.591157058253702240, -0.591116729691484320, --0.591076399651474180, -0.591036068133773410, -0.590995735138482360, -0.590955400665702070, -0.590915064715532900, -0.590874727288076440, -0.590834388383433160, -0.590794048001703990, --0.590753706142989170, -0.590713362807390620, -0.590673017995008490, -0.590632671705943910, -0.590592323940297260, -0.590551974698170220, -0.590511623979663170, -0.590471271784877130, --0.590430918113912570, -0.590390562966870980, -0.590350206343853050, -0.590309848244959250, -0.590269488670291160, -0.590229127619949280, -0.590188765094034730, -0.590148401092647770, --0.590108035615890200, -0.590067668663862620, -0.590027300236665830, -0.589986930334400420, -0.589946558957167970, -0.589906186105069290, -0.589865811778204960, -0.589825435976675800, --0.589785058700583510, -0.589744679950028550, -0.589704299725111740, -0.589663918025933990, -0.589623534852596660, -0.589583150205200580, -0.589542764083846320, -0.589502376488635460, --0.589461987419668600, -0.589421596877046870, -0.589381204860870760, -0.589340811371241950, -0.589300416408261140, -0.589260019972029260, -0.589219622062647000, -0.589179222680216050, --0.589138821824837010, -0.589098419496610900, -0.589058015695638430, -0.589017610422021280, -0.588977203675860150, -0.588936795457255970, -0.588896385766309430, -0.588855974603122220, --0.588815561967795160, -0.588775147860428840, -0.588734732281124940, -0.588694315229984280, -0.588653896707107770, -0.588613476712596230, -0.588573055246551350, -0.588532632309073820, --0.588492207900264690, -0.588451782020224630, -0.588411354669055590, -0.588370925846858130, -0.588330495553733290, -0.588290063789781880, -0.588249630555105710, -0.588209195849805470, --0.588168759673982190, -0.588128322027736680, -0.588087882911170650, -0.588047442324384990, -0.588007000267480760, -0.587966556740558640, -0.587926111743720450, -0.587885665277066980, --0.587845217340699060, -0.587804767934718360, -0.587764317059225830, -0.587723864714322360, -0.587683410900109000, -0.587642955616687450, -0.587602498864158500, -0.587562040642623300, --0.587521580952182650, -0.587481119792938490, -0.587440657164991390, -0.587400193068442710, -0.587359727503393160, -0.587319260469944760, -0.587278791968198100, -0.587238321998254430, --0.587197850560214670, -0.587157377654180630, -0.587116903280253120, -0.587076427438533060, -0.587035950129122240, -0.586995471352121490, -0.586954991107632160, -0.586914509395754960, --0.586874026216591790, -0.586833541570243590, -0.586793055456811600, -0.586752567876396510, -0.586712078829100480, -0.586671588315024200, -0.586631096334268910, -0.586590602886935540, --0.586550107973126010, -0.586509611592941240, -0.586469113746482470, -0.586428614433850410, -0.586388113655147310, -0.586347611410473980, -0.586307107699931110, -0.586266602523620950, --0.586226095881644200, -0.586185587774102230, -0.586145078201095960, -0.586104567162727300, -0.586064054659097280, -0.586023540690307150, -0.585983025256457730, -0.585942508357651160, --0.585901989993988240, -0.585861470165570440, -0.585820948872498580, -0.585780426114874690, -0.585739901892799790, -0.585699376206375020, -0.585658849055701540, -0.585618320440881250, --0.585577790362015180, -0.585537258819204260, -0.585496725812550630, -0.585456191342155100, -0.585415655408119130, -0.585375118010543650, -0.585334579149530800, -0.585294038825181380, --0.585253497037596990, -0.585212953786878430, -0.585172409073127840, -0.585131862896446140, -0.585091315256934920, -0.585050766154694980, -0.585010215589828570, -0.584969663562436510, --0.584929110072620380, -0.584888555120481100, -0.584847998706120810, -0.584807440829640420, -0.584766881491141530, -0.584726320690725050, -0.584685758428493130, -0.584645194704546790, --0.584604629518987170, -0.584564062871916200, -0.584523494763435240, -0.584482925193645420, -0.584442354162648000, -0.584401781670545020, -0.584361207717437600, -0.584320632303427120, --0.584280055428614720, -0.584239477093102530, -0.584198897296991700, -0.584158316040383600, -0.584117733323379350, -0.584077149146081110, -0.584036563508590010, -0.583995976411007530, --0.583955387853434700, -0.583914797835973780, -0.583874206358725890, -0.583833613421792070, -0.583793019025274700, -0.583752423169274670, -0.583711825853893580, -0.583671227079232580, --0.583630626845393910, -0.583590025152478600, -0.583549422000588350, -0.583508817389824070, -0.583468211320288140, -0.583427603792081690, -0.583386994805306200, -0.583346384360062920, --0.583305772456453990, -0.583265159094580650, -0.583224544274544400, -0.583183927996446470, -0.583143310260389120, -0.583102691066473390, -0.583062070414800630, -0.583021448305472980, --0.582980824738591810, -0.582940199714258480, -0.582899573232574350, -0.582858945293641680, -0.582818315897561610, -0.582777685044435720, -0.582737052734365270, -0.582696418967452610, --0.582655783743798890, -0.582615147063505700, -0.582574508926674170, -0.582533869333406900, -0.582493228283804900, -0.582452585777969770, -0.582411941816002860, -0.582371296398006440, --0.582330649524081760, -0.582290001194330500, -0.582249351408853810, -0.582208700167754170, -0.582168047471132820, -0.582127393319090910, -0.582086737711730920, -0.582046080649154090, --0.582005422131462000, -0.581964762158756030, -0.581924100731138540, -0.581883437848710770, -0.581842773511574430, -0.581802107719830760, -0.581761440473582140, -0.581720771772930020, --0.581680101617975900, -0.581639430008821230, -0.581598756945568280, -0.581558082428318520, -0.581517406457173420, -0.581476729032234570, -0.581436050153604220, -0.581395369821383730, --0.581354688035674470, -0.581314004796578910, -0.581273320104198190, -0.581232633958634230, -0.581191946359988390, -0.581151257308363030, -0.581110566803859530, -0.581069874846579570, --0.581029181436624520, -0.580988486574096960, -0.580947790259098150, -0.580907092491729890, -0.580866393272093550, -0.580825692600291490, -0.580784990476425290, -0.580744286900596540, --0.580703581872906830, -0.580662875393458400, -0.580622167462352850, -0.580581458079691530, -0.580540747245576920, -0.580500034960110490, -0.580459321223393830, -0.580418606035528640, --0.580377889396617270, -0.580337171306761100, -0.580296451766062040, -0.580255730774621560, -0.580215008332542030, -0.580174284439925030, -0.580133559096872250, -0.580092832303485300, --0.580052104059866620, -0.580011374366117600, -0.579970643222340150, -0.579929910628635860, -0.579889176585107080, -0.579848441091855290, -0.579807704148982080, -0.579766965756590040, --0.579726225914780510, -0.579685484623655430, -0.579644741883316270, -0.579603997693865610, -0.579563252055405040, -0.579522504968036260, -0.579481756431860840, -0.579441006446981490, --0.579400255013499570, -0.579359502131516990, -0.579318747801135240, -0.579277992022457110, -0.579237234795583980, -0.579196476120617640, -0.579155715997659910, -0.579114954426813160, --0.579074191408178950, -0.579033426941859440, -0.578992661027955880, -0.578951893666571070, -0.578911124857806490, -0.578870354601763730, -0.578829582898545470, -0.578788809748253310, --0.578748035150989050, -0.578707259106854390, -0.578666481615951910, -0.578625702678383200, -0.578584922294250290, -0.578544140463654770, -0.578503357186699100, -0.578462572463485200, --0.578421786294114780, -0.578380998678689530, -0.578340209617312140, -0.578299419110084310, -0.578258627157107850, -0.578217833758484460, -0.578177038914316820, -0.578136242624706640, --0.578095444889755510, -0.578054645709566110, -0.578013845084240030, -0.577973043013879420, -0.577932239498585850, -0.577891434538462030, -0.577850628133609550, -0.577809820284130530, --0.577769010990126670, -0.577728200251700570, -0.577687388068954030, -0.577646574441988970, -0.577605759370907080, -0.577564942855811280, -0.577524124896803050, -0.577483305493984410, --0.577442484647457290, -0.577401662357324260, -0.577360838623687030, -0.577320013446647410, -0.577279186826308190, -0.577238358762770850, -0.577197529256137650, -0.577156698306510400, --0.577115865913991670, -0.577075032078683270, -0.577034196800687240, -0.576993360080105380, -0.576952521917040500, -0.576911682311594290, -0.576870841263869010, -0.576829998773966120, --0.576789154841988560, -0.576748309468038230, -0.576707462652217060, -0.576666614394626960, -0.576625764695370640, -0.576584913554549880, -0.576544060972266850, -0.576503206948623340, --0.576462351483722050, -0.576421494577665010, -0.576380636230553800, -0.576339776442491460, -0.576298915213579570, -0.576258052543920480, -0.576217188433615800, -0.576176322882768540, --0.576135455891480520, -0.576094587459853870, -0.576053717587990290, -0.576012846275992920, -0.575971973523963340, -0.575931099332003820, -0.575890223700216250, -0.575849346628703460, --0.575808468117567250, -0.575767588166909980, -0.575726706776833240, -0.575685823947440170, -0.575644939678832570, -0.575604053971112250, -0.575563166824382130, -0.575522278238744130, --0.575481388214300390, -0.575440496751152830, -0.575399603849404360, -0.575358709509156910, -0.575317813730512720, -0.575276916513573600, -0.575236017858442470, -0.575195117765221480, --0.575154216234012530, -0.575113313264917770, -0.575072408858040010, -0.575031503013481270, -0.574990595731343810, -0.574949687011729440, -0.574908776854741290, -0.574867865260481170, --0.574826952229051000, -0.574786037760553810, -0.574745121855091520, -0.574704204512766490, -0.574663285733680530, -0.574622365517936660, -0.574581443865637030, -0.574540520776883670, --0.574499596251778710, -0.574458670290425080, -0.574417742892924800, -0.574376814059380130, -0.574335883789893090, -0.574294952084566710, -0.574254018943502920, -0.574213084366804070, --0.574172148354572200, -0.574131210906910330, -0.574090272023920380, -0.574049331705704380, -0.574008389952365470, -0.573967446764005460, -0.573926502140726940, -0.573885556082631810, --0.573844608589823110, -0.573803659662402990, -0.573762709300473570, -0.573721757504137120, -0.573680804273496660, -0.573639849608654110, -0.573598893509711940, -0.573557935976772180, --0.573516977009937980, -0.573476016609311360, -0.573435054774994680, -0.573394091507089980, -0.573353126805700390, -0.573312160670928050, -0.573271193102875220, -0.573230224101644040, --0.573189253667337750, -0.573148281800058280, -0.573107308499907760, -0.573066333766989340, -0.573025357601405050, -0.572984380003257350, -0.572943400972648400, -0.572902420509681320, --0.572861438614458150, -0.572820455287081360, -0.572779470527653100, -0.572738484336276500, -0.572697496713053810, -0.572656507658087180, -0.572615517171479070, -0.572574525253332520, --0.572533531903749560, -0.572492537122832880, -0.572451540910684400, -0.572410543267407480, -0.572369544193104150, -0.572328543687876670, -0.572287541751828170, -0.572246538385060790, --0.572205533587677120, -0.572164527359779180, -0.572123519701470350, -0.572082510612852760, -0.572041500094028770, -0.572000488145100740, -0.571959474766171820, -0.571918459957344250, --0.571877443718720510, -0.571836426050402750, -0.571795406952494420, -0.571754386425097460, -0.571713364468314560, -0.571672341082247960, -0.571631316267000700, -0.571590290022675250, --0.571549262349373750, -0.571508233247199460, -0.571467202716254510, -0.571426170756641590, -0.571385137368462860, -0.571344102551821780, -0.571303066306820260, -0.571262028633561130, --0.571220989532146620, -0.571179949002679990, -0.571138907045263490, -0.571097863659999700, -0.571056818846990890, -0.571015772606340290, -0.570974724938150380, -0.570933675842523640, --0.570892625319562420, -0.570851573369369870, -0.570810519992048460, -0.570769465187700780, -0.570728408956428960, -0.570687351298336590, -0.570646292213525810, -0.570605231702098870, --0.570564169764159250, -0.570523106399809300, -0.570482041609151500, -0.570440975392288220, -0.570399907749322920, -0.570358838680357750, -0.570317768185495620, -0.570276696264838680, --0.570235622918490280, -0.570194548146552900, -0.570153471949129020, -0.570112394326321210, -0.570071315278232850, -0.570030234804966060, -0.569989152906623770, -0.569948069583308130, --0.569906984835122810, -0.569865898662169970, -0.569824811064551960, -0.569783722042372380, -0.569742631595733460, -0.569701539724738030, -0.569660446429488320, -0.569619351710087820, --0.569578255566638990, -0.569537157999244540, -0.569496059008006710, -0.569454958593029190, -0.569413856754414250, -0.569372753492264790, -0.569331648806682970, -0.569290542697772350, --0.569249435165635420, -0.569208326210374980, -0.569167215832093290, -0.569126104030893920, -0.569084990806879240, -0.569043876160151840, -0.569002760090814960, -0.568961642598971310, --0.568920523684723570, -0.568879403348174110, -0.568838281589426400, -0.568797158408583140, -0.568756033805746910, -0.568714907781020300, -0.568673780334506660, -0.568632651466308700, --0.568591521176529000, -0.568550389465270260, -0.568509256332635830, -0.568468121778728190, -0.568426985803650360, -0.568385848407504720, -0.568344709590394740, -0.568303569352422990, --0.568262427693692400, -0.568221284614305320, -0.568180140114365350, -0.568138994193975070, -0.568097846853236940, -0.568056698092254560, -0.568015547911130400, -0.567974396309967490, --0.567933243288868070, -0.567892088847935960, -0.567850932987273740, -0.567809775706984100, -0.567768617007169630, -0.567727456887934020, -0.567686295349379750, -0.567645132391609740, --0.567603968014726460, -0.567562802218833710, -0.567521635004033960, -0.567480466370430150, -0.567439296318124730, -0.567398124847221520, -0.567356951957822990, -0.567315777650031610, --0.567274601923951180, -0.567233424779684300, -0.567192246217333880, -0.567151066237002400, -0.567109884838793650, -0.567068702022810230, -0.567027517789155060, -0.566986332137930700, --0.566945145069240870, -0.566903956583188150, -0.566862766679875560, -0.566821575359405690, -0.566780382621882240, -0.566739188467407900, -0.566697992896085580, -0.566656795908017760, --0.566615597503308480, -0.566574397682060190, -0.566533196444375500, -0.566491993790358190, -0.566450789720110870, -0.566409584233736550, -0.566368377331337940, -0.566327169013018830, --0.566285959278881700, -0.566244748129029700, -0.566203535563565510, -0.566162321582592830, -0.566121106186214250, -0.566079889374533020, -0.566038671147651610, -0.565997451505673930, --0.565956230448702690, -0.565915007976840800, -0.565873784090191070, -0.565832558788857190, -0.565791332072941970, -0.565750103942547990, -0.565708874397779170, -0.565667643438738100, --0.565626411065527910, -0.565585177278251420, -0.565543942077012310, -0.565502705461913390, -0.565461467433057590, -0.565420227990547920, -0.565378987134487860, -0.565337744864980450, --0.565296501182128710, -0.565255256086035330, -0.565214009576804120, -0.565172761654537890, -0.565131512319339780, -0.565090261571312480, -0.565049009410559910, -0.565007755837184880, --0.564966500851290410, -0.564925244452979310, -0.564883986642355510, -0.564842727419521680, -0.564801466784580760, -0.564760204737636550, -0.564718941278791740, -0.564677676408149590, --0.564636410125812890, -0.564595142431885580, -0.564553873326470330, -0.564512602809670420, -0.564471330881588630, -0.564430057542328890, -0.564388782791994110, -0.564347506630687220, --0.564306229058511240, -0.564264950075570090, -0.564223669681966580, -0.564182387877803840, -0.564141104663184790, -0.564099820038213350, -0.564058534002992330, -0.564017246557624640, --0.563975957702214200, -0.563934667436863930, -0.563893375761676860, -0.563852082676756130, -0.563810788182205420, -0.563769492278127780, -0.563728194964626450, -0.563686896241804240, --0.563645596109765170, -0.563604294568612050, -0.563562991618448250, -0.563521687259376680, -0.563480381491501150, -0.563439074314924680, -0.563397765729750530, -0.563356455736081620, --0.563315144334021860, -0.563273831523674380, -0.563232517305141790, -0.563191201678528430, -0.563149884643937000, -0.563108566201470870, -0.563067246351232950, -0.563025925093327270, --0.562984602427856750, -0.562943278354924750, -0.562901952874634180, -0.562860625987089190, -0.562819297692392470, -0.562777967990647610, -0.562736636881957520, -0.562695304366426120, --0.562653970444156440, -0.562612635115251840, -0.562571298379815340, -0.562529960237950880, -0.562488620689761580, -0.562447279735350690, -0.562405937374821360, -0.562364593608277400, --0.562323248435822040, -0.562281901857558110, -0.562240553873589840, -0.562199204484020280, -0.562157853688952550, -0.562116501488489910, -0.562075147882736380, -0.562033792871795000, --0.561992436455769130, -0.561951078634761680, -0.561909719408877020, -0.561868358778218060, -0.561826996742888160, -0.561785633302990470, -0.561744268458629010, -0.561702902209906820, --0.561661534556927470, -0.561620165499793880, -0.561578795038610300, -0.561537423173479660, -0.561496049904505080, -0.561454675231790820, -0.561413299155439800, -0.561371921675555610, --0.561330542792241150, -0.561289162505600790, -0.561247780815737450, -0.561206397722754710, -0.561165013226755600, -0.561123627327844380, -0.561082240026124060, -0.561040851321698120, --0.560999461214669590, -0.560958069705142950, -0.560916676793220990, -0.560875282479007420, -0.560833886762605260, -0.560792489644118760, -0.560751091123650960, -0.560709691201305200, --0.560668289877185530, -0.560626887151395080, -0.560585483024037430, -0.560544077495215730, -0.560502670565034220, -0.560461262233595940, -0.560419852501004570, -0.560378441367363260, --0.560337028832776140, -0.560295614897346470, -0.560254199561177720, -0.560212782824373150, -0.560171364687036990, -0.560129945149272390, -0.560088524211182940, -0.560047101872871880, --0.560005678134443350, -0.559964252996000610, -0.559922826457647020, -0.559881398519486590, -0.559839969181622710, -0.559798538444158830, -0.559757106307198330, -0.559715672770845440, --0.559674237835203310, -0.559632801500375530, -0.559591363766465570, -0.559549924633577440, -0.559508484101814420, -0.559467042171280290, -0.559425598842078210, -0.559384154114312530, --0.559342707988086390, -0.559301260463503480, -0.559259811540667060, -0.559218361219681490, -0.559176909500650020, -0.559135456383676230, -0.559094001868863490, -0.559052545956316150, --0.559011088646137360, -0.558969629938430470, -0.558928169833299960, -0.558886708330848970, -0.558845245431181190, -0.558803781134399990, -0.558762315440609610, -0.558720848349913530, --0.558679379862415340, -0.558637909978218270, -0.558596438697426810, -0.558554966020144320, -0.558513491946474370, -0.558472016476520230, -0.558430539610386580, -0.558389061348176450, --0.558347581689993770, -0.558306100635941660, -0.558264618186124720, -0.558223134340646300, -0.558181649099609540, -0.558140162463119150, -0.558098674431278250, -0.558057185004190770, --0.558015694181959840, -0.557974201964690160, -0.557932708352484990, -0.557891213345447890, -0.557849716943682570, -0.557808219147293170, -0.557766719956383270, -0.557725219371056680, --0.557683717391416530, -0.557642214017567530, -0.557600709249613020, -0.557559203087656610, -0.557517695531801970, -0.557476186582153370, -0.557434676238814380, -0.557393164501888250, --0.557351651371479570, -0.557310136847691820, -0.557268620930628680, -0.557227103620393740, -0.557185584917091250, -0.557144064820824900, -0.557102543331698400, -0.557061020449815090, --0.557019496175279680, -0.556977970508195420, -0.556936443448666330, -0.556894914996795660, -0.556853385152688230, -0.556811853916447270, -0.556770321288176610, -0.556728787267979810, --0.556687251855961460, -0.556645715052224930, -0.556604176856874130, -0.556562637270012540, -0.556521096291744730, -0.556479553922174070, -0.556438010161404260, -0.556396465009539760, --0.556354918466684170, -0.556313370532941280, -0.556271821208414450, -0.556230270493208610, -0.556188718387427010, -0.556147164891173550, -0.556105610004551940, -0.556064053727666540, --0.556022496060621150, -0.555980937003519360, -0.555939376556464970, -0.555897814719562570, -0.555856251492915510, -0.555814686876627830, -0.555773120870803110, -0.555731553475545930, --0.555689984690959870, -0.555648414517148530, -0.555606842954216470, -0.555565270002267300, -0.555523695661404910, -0.555482119931733020, -0.555440542813356200, -0.555398964306377920, --0.555357384410902320, -0.555315803127032770, -0.555274220454874180, -0.555232636394530020, -0.555191050946104330, -0.555149464109700560, -0.555107875885423540, -0.555066286273376840, --0.555024695273664380, -0.554983102886389860, -0.554941509111657850, -0.554899913949572170, -0.554858317400236280, -0.554816719463754990, -0.554775120140231890, -0.554733519429771120, --0.554691917332476030, -0.554650313848451540, -0.554608708977801230, -0.554567102720629260, -0.554525495077039080, -0.554483886047135610, -0.554442275631022330, -0.554400663828803380, --0.554359050640582440, -0.554317436066464220, -0.554275820106552410, -0.554234202760951030, -0.554192584029763790, -0.554150963913095480, -0.554109342411049810, -0.554067719523730350, --0.554026095251241910, -0.553984469593688300, -0.553942842551173540, -0.553901214123801220, -0.553859584311676370, -0.553817953114902450, -0.553776320533583610, -0.553734686567823650, --0.553693051217727380, -0.553651414483398500, -0.553609776364941020, -0.553568136862458760, -0.553526495976056520, -0.553484853705838000, -0.553443210051907440, -0.553401565014368440, --0.553359918593325780, -0.553318270788883520, -0.553276621601145440, -0.553234971030215460, -0.553193319076198510, -0.553151665739198160, -0.553110011019318340, -0.553068354916663840, --0.553026697431338480, -0.552985038563446380, -0.552943378313091260, -0.552901716680378130, -0.552860053665410580, -0.552818389268293080, -0.552776723489129100, -0.552735056328023780, --0.552693387785080700, -0.552651717860404230, -0.552610046554098070, -0.552568373866267230, -0.552526699797015410, -0.552485024346446750, -0.552443347514665280, -0.552401669301775810, --0.552359989707882140, -0.552318308733088070, -0.552276626377498640, -0.552234942641217640, -0.552193257524349330, -0.552151571026997410, -0.552109883149267010, -0.552068193891261830, --0.552026503253086220, -0.551984811234844000, -0.551943117836640180, -0.551901423058578480, -0.551859726900763240, -0.551818029363298270, -0.551776330446288600, -0.551734630149838150, --0.551692928474051160, -0.551651225419031330, -0.551609520984883920, -0.551567815171712720, -0.551526107979621650, -0.551484399408715520, -0.551442689459098580, -0.551400978130874740, --0.551359265424148260, -0.551317551339023830, -0.551275835875605580, -0.551234119033997770, -0.551192400814304320, -0.551150681216630130, -0.551108960241079360, -0.551067237887756130, --0.551025514156764370, -0.550983789048209330, -0.550942062562194690, -0.550900334698824930, -0.550858605458203980, -0.550816874840436950, -0.550775142845627670, -0.550733409473880500, --0.550691674725299450, -0.550649938599989670, -0.550608201098054970, -0.550566462219599370, -0.550524721964728010, -0.550482980333544920, -0.550441237326154240, -0.550399492942660220, --0.550357747183167770, -0.550316000047781030, -0.550274251536604250, -0.550232501649741360, -0.550190750387297700, -0.550148997749377200, -0.550107243736084110, -0.550065488347522560, --0.550023731583797690, -0.549981973445013540, -0.549940213931274350, -0.549898453042684370, -0.549856690779348510, -0.549814927141371030, -0.549773162128855740, -0.549731395741907990, --0.549689627980631810, -0.549647858845131450, -0.549606088335511170, -0.549564316451875980, -0.549522543194330030, -0.549480768562977670, -0.549438992557923060, -0.549397215179271310, --0.549355436427126590, -0.549313656301593120, -0.549271874802775280, -0.549230091930778100, -0.549188307685705700, -0.549146522067662460, -0.549104735076752610, -0.549062946713081310, --0.549021156976752580, -0.548979365867870660, -0.548937573386540700, -0.548895779532866720, -0.548853984306953310, -0.548812187708904610, -0.548770389738825860, -0.548728590396820980, --0.548686789682994780, -0.548644987597451170, -0.548603184140295410, -0.548561379311631850, -0.548519573111564630, -0.548477765540198230, -0.548435956597637770, -0.548394146283987420, --0.548352334599351730, -0.548310521543834860, -0.548268707117541940, -0.548226891320577340, -0.548185074153045070, -0.548143255615050620, -0.548101435706697890, -0.548059614428091590, --0.548017791779335960, -0.547975967760536140, -0.547934142371796500, -0.547892315613221380, -0.547850487484915270, -0.547808657986983190, -0.547766827119529510, -0.547724994882658690, --0.547683161276475090, -0.547641326301083860, -0.547599489956589470, -0.547557652243096270, -0.547515813160708520, -0.547473972709531690, -0.547432130889669800, -0.547390287701227770, --0.547348443144309530, -0.547306597219020530, -0.547264749925465140, -0.547222901263747400, -0.547181051233972870, -0.547139199836245700, -0.547097347070670480, -0.547055492937351560, --0.547013637436394200, -0.546971780567902850, -0.546929922331982010, -0.546888062728736020, -0.546846201758270150, -0.546804339420688850, -0.546762475716096710, -0.546720610644597980, --0.546678744206298140, -0.546636876401301430, -0.546595007229712440, -0.546553136691635630, -0.546511264787176380, -0.546469391516438920, -0.546427516879527620, -0.546385640876547950, --0.546343763507604050, -0.546301884772800840, -0.546260004672242560, -0.546218123206034580, -0.546176240374281360, -0.546134356177087500, -0.546092470614557350, -0.546050583686796490, --0.546008695393909060, -0.545966805735999980, -0.545924914713173500, -0.545883022325535090, -0.545841128573189120, -0.545799233456240260, -0.545757336974793010, -0.545715439128952820, --0.545673539918823950, -0.545631639344510980, -0.545589737406119160, -0.545547834103753070, -0.545505929437517410, -0.545464023407516540, -0.545422116013855930, -0.545380207256640050, --0.545338297135973700, -0.545296385651961150, -0.545254472804708070, -0.545212558594318830, -0.545170643020898130, -0.545128726084550430, -0.545086807785381430, -0.545044888123495270, --0.545002967098996980, -0.544961044711990810, -0.544919120962582440, -0.544877195850876350, -0.544835269376977130, -0.544793341540989460, -0.544751412343018830, -0.544709481783169580, --0.544667549861546310, -0.544625616578254480, -0.544583681933398680, -0.544541745927083600, -0.544499808559413930, -0.544457869830494930, -0.544415929740431400, -0.544373988289327930, --0.544332045477289190, -0.544290101304420680, -0.544248155770826970, -0.544206208876612750, -0.544164260621882720, -0.544122311006742470, -0.544080360031296340, -0.544038407695649370, --0.543996453999906040, -0.543954498944171800, -0.543912542528551480, -0.543870584753149310, -0.543828625618071100, -0.543786665123421330, -0.543744703269304910, -0.543702740055826310, --0.543660775483091330, -0.543618809551204340, -0.543576842260270250, -0.543534873610393770, -0.543492903601680570, -0.543450932234235020, -0.543408959508162040, -0.543366985423566430, --0.543325009980553660, -0.543283033179228440, -0.543241055019695550, -0.543199075502059700, -0.543157094626426470, -0.543115112392900560, -0.543073128801586540, -0.543031143852589990, --0.542989157546015620, -0.542947169881968340, -0.542905180860552840, -0.542863190481874590, -0.542821198746038510, -0.542779205653149410, -0.542737211203311860, -0.542695215396631790, --0.542653218233213550, -0.542611219713162280, -0.542569219836582570, -0.542527218603580330, -0.542485216014259920, -0.542443212068726480, -0.542401206767084590, -0.542359200109440160, --0.542317192095897680, -0.542275182726561830, -0.542233172001538420, -0.542191159920932140, -0.542149146484847800, -0.542107131693390420, -0.542065115546665480, -0.542023098044777660, --0.541981079187832230, -0.541939058975933750, -0.541897037409187930, -0.541855014487699460, -0.541812990211573590, -0.541770964580914780, -0.541728937595828960, -0.541686909256420710, --0.541644879562795280, -0.541602848515057240, -0.541560816113312530, -0.541518782357665710, -0.541476747248221920, -0.541434710785085980, -0.541392672968363580, -0.541350633798159400, --0.541308593274578360, -0.541266551397726280, -0.541224508167707730, -0.541182463584627960, -0.541140417648591550, -0.541098370359704540, -0.541056321718071610, -0.541014271723797900, --0.540972220376988110, -0.540930167677748150, -0.540888113626182720, -0.540846058222397060, -0.540804001466495880, -0.540761943358585070, -0.540719883898769460, -0.540677823087154060, --0.540635760923843690, -0.540593697408944360, -0.540551632542560780, -0.540509566324797740, -0.540467498755761170, -0.540425429835555860, -0.540383359564286960, -0.540341287942059270, --0.540299214968978700, -0.540257140645150180, -0.540215064970678730, -0.540172987945669260, -0.540130909570227800, -0.540088829844458940, -0.540046748768468030, -0.540004666342359880, --0.539962582566240520, -0.539920497440214640, -0.539878410964387490, -0.539836323138863980, -0.539794233963749930, -0.539752143439150460, -0.539710051565170160, -0.539667958341915170, --0.539625863769490180, -0.539583767848000550, -0.539541670577551200, -0.539499571958248050, -0.539457471990195890, -0.539415370673500090, -0.539373268008265570, -0.539331163994598130, --0.539289058632602790, -0.539246951922384920, -0.539204843864049210, -0.539162734457701800, -0.539120623703447490, -0.539078511601391640, -0.539036398151639170, -0.538994283354296110, --0.538952167209467260, -0.538910049717258090, -0.538867930877773290, -0.538825810691119120, -0.538783689157400380, -0.538741566276722090, -0.538699442049190290, -0.538657316474909780, --0.538615189553986130, -0.538573061286524050, -0.538530931672629660, -0.538488800712407900, -0.538446668405964220, -0.538404534753403440, -0.538362399754831800, -0.538320263410354110, --0.538278125720075720, -0.538235986684101660, -0.538193846302537970, -0.538151704575489780, -0.538109561503062220, -0.538067417085360430, -0.538025271322490450, -0.537983124214557300, --0.537940975761666000, -0.537898825963922580, -0.537856674821432180, -0.537814522334300050, -0.537772368502631220, -0.537730213326531810, -0.537688056806106870, -0.537645898941461860, --0.537603739732701700, -0.537561579179932520, -0.537519417283259470, -0.537477254042787900, -0.537435089458622730, -0.537392923530870200, -0.537350756259635460, -0.537308587645023760, --0.537266417687140230, -0.537224246386091010, -0.537182073741981240, -0.537139899754915830, -0.537097724425001030, -0.537055547752341990, -0.537013369737044060, -0.536971190379212370, --0.536929009678952960, -0.536886827636371190, -0.536844644251572190, -0.536802459524661320, -0.536760273455744620, -0.536718086044927320, -0.536675897292314690, -0.536633707198011960, --0.536591515762125380, -0.536549322984759990, -0.536507128866021370, -0.536464933406014420, -0.536422736604845630, -0.536380538462619900, -0.536338338979442500, -0.536296138155419650, --0.536253935990656410, -0.536211732485258330, -0.536169527639330570, -0.536127321452979370, -0.536085113926309860, -0.536042905059427640, -0.536000694852437620, -0.535958483305446380, --0.535916270418558830, -0.535874056191880670, -0.535831840625516920, -0.535789623719574060, -0.535747405474157110, -0.535705185889371550, -0.535662964965322730, -0.535620742702116900, --0.535578519099859100, -0.535536294158655110, -0.535494067878609980, -0.535451840259830060, -0.535409611302420490, -0.535367381006486620, -0.535325149372134600, -0.535282916399469680, --0.535240682088597540, -0.535198446439623220, -0.535156209452653300, -0.535113971127792690, -0.535071731465147300, -0.535029490464822180, -0.534987248126923660, -0.534945004451557020, --0.534902759438827920, -0.534860513088841530, -0.534818265401704180, -0.534776016377521150, -0.534733766016398220, -0.534691514318440420, -0.534649261283754120, -0.534607006912444780, --0.534564751204617550, -0.534522494160378780, -0.534480235779833720, -0.534437976063088180, -0.534395715010247300, -0.534353452621417420, -0.534311188896704040, -0.534268923836212610, --0.534226657440048490, -0.534184389708318160, -0.534142120641126760, -0.534099850238580090, -0.534057578500783500, -0.534015305427843260, -0.533973031019864820, -0.533930755276953770, --0.533888478199215370, -0.533846199786756290, -0.533803920039681580, -0.533761638958096810, -0.533719356542108230, -0.533677072791821310, -0.533634787707341740, -0.533592501288774780, --0.533550213536226890, -0.533507924449803550, -0.533465634029610340, -0.533423342275752720, -0.533381049188337180, -0.533338754767468840, -0.533296459013253730, -0.533254161925797110, --0.533211863505205440, -0.533169563751584090, -0.533127262665038850, -0.533084960245675090, -0.533042656493599280, -0.533000351408916770, -0.532958044991733490, -0.532915737242154690, --0.532873428160286930, -0.532831117746235590, -0.532788806000106030, -0.532746492922004930, -0.532704178512037550, -0.532661862770309690, -0.532619545696926820, -0.532577227291995410, --0.532534907555621050, -0.532492586487909310, -0.532450264088965790, -0.532407940358897050, -0.532365615297808350, -0.532323288905805600, -0.532280961182994280, -0.532238632129480970, --0.532196301745371030, -0.532153970030770360, -0.532111636985784450, -0.532069302610519770, -0.532026966905081890, -0.531984629869576060, -0.531942291504109210, -0.531899951808786460, --0.531857610783713960, -0.531815268428997070, -0.531772924744742360, -0.531730579731055310, -0.531688233388041720, -0.531645885715807290, -0.531603536714458480, -0.531561186384100880, --0.531518834724840290, -0.531476481736782190, -0.531434127420033380, -0.531391771774699100, -0.531349414800885490, -0.531307056498697920, -0.531264696868243070, -0.531222335909626530, --0.531179973622953770, -0.531137610008331480, -0.531095245065865140, -0.531052878795660650, -0.531010511197823610, -0.530968142272460700, -0.530925772019677390, -0.530883400439579600, --0.530841027532273020, -0.530798653297864240, -0.530756277736458840, -0.530713900848162720, -0.530671522633081480, -0.530629143091321810, -0.530586762222989170, -0.530544380028189820, --0.530501996507029010, -0.530459611659613640, -0.530417225486049190, -0.530374837986441360, -0.530332449160896720, -0.530290059009521090, -0.530247667532420250, -0.530205274729699920, --0.530162880601466660, -0.530120485147826280, -0.530078088368884700, -0.530035690264747390, -0.529993290835521380, -0.529950890081312130, -0.529908488002225560, -0.529866084598367480, --0.529823679869844580, -0.529781273816762430, -0.529738866439227070, -0.529696457737344200, -0.529654047711220600, -0.529611636360961870, -0.529569223686674030, -0.529526809688462770, --0.529484394366434800, -0.529441977720695900, -0.529399559751351670, -0.529357140458508900, -0.529314719842273300, -0.529272297902750880, -0.529229874640047340, -0.529187450054269480, --0.529145024145523110, -0.529102596913914040, -0.529060168359548170, -0.529017738482532200, -0.528975307282971930, -0.528932874760973390, -0.528890440916642280, -0.528848005750085500, --0.528805569261408650, -0.528763131450717850, -0.528720692318118910, -0.528678251863718530, -0.528635810087622620, -0.528593366989936750, -0.528550922570767860, -0.528508476830221620, --0.528466029768404180, -0.528423581385421340, -0.528381131681379900, -0.528338680656385670, -0.528296228310544680, -0.528253774643962840, -0.528211319656746840, -0.528168863349002590, --0.528126405720836130, -0.528083946772353370, -0.528041486503661010, -0.527999024914865060, -0.527956562006071440, -0.527914097777386070, -0.527871632228915870, -0.527829165360766520, --0.527786697173043940, -0.527744227665854940, -0.527701756839305420, -0.527659284693501540, -0.527616811228548980, -0.527574336444554870, -0.527531860341624800, -0.527489382919865140, --0.527446904179381670, -0.527404424120281320, -0.527361942742669900, -0.527319460046653530, -0.527276976032338250, -0.527234490699830860, -0.527192004049237270, -0.527149516080663630, --0.527107026794215840, -0.527064536190000930, -0.527022044268124600, -0.526979551028693200, -0.526937056471812440, -0.526894560597589550, -0.526852063406130220, -0.526809564897540270, --0.526767065071926940, -0.526724563929395820, -0.526682061470053360, -0.526639557694005280, -0.526597052601358810, -0.526554546192219640, -0.526512038466694140, -0.526469529424888120, --0.526427019066908700, -0.526384507392861690, -0.526341994402853340, -0.526299480096989790, -0.526256964475377840, -0.526214447538123410, -0.526171929285332960, -0.526129409717112310, --0.526086888833568470, -0.526044366634807470, -0.526001843120935120, -0.525959318292058550, -0.525916792148283680, -0.525874264689716760, -0.525831735916463930, -0.525789205828632090, --0.525746674426327170, -0.525704141709655630, -0.525661607678723390, -0.525619072333637470, -0.525576535674503910, -0.525533997701428950, -0.525491458414518610, -0.525448917813880030, --0.525406375899619140, -0.525363832671842280, -0.525321288130655590, -0.525278742276165890, -0.525236195108479410, -0.525193646627702180, -0.525151096833941010, -0.525108545727302260, --0.525065993307892050, -0.525023439575816540, -0.524980884531182750, -0.524938328174096800, -0.524895770504664960, -0.524853211522993360, -0.524810651229189130, -0.524768089623358300, --0.524725526705607130, -0.524682962476041850, -0.524640396934769600, -0.524597830081896200, -0.524555261917528330, -0.524512692441771900, -0.524470121654734170, -0.524427549556521040, --0.524384976147238780, -0.524342401426994400, -0.524299825395893930, -0.524257248054044060, -0.524214669401550590, -0.524172089438520780, -0.524129508165060880, -0.524086925581277120, --0.524044341687275650, -0.524001756483163720, -0.523959169969047460, -0.523916582145033230, -0.523873993011227170, -0.523831402567736410, -0.523788810814667330, -0.523746217752126150, --0.523703623380219030, -0.523661027699053210, -0.523618430708734820, -0.523575832409370330, -0.523533232801066010, -0.523490631883928860, -0.523448029658065140, -0.523405426123580990, --0.523362821280583650, -0.523320215129179370, -0.523277607669474400, -0.523234998901575100, -0.523192388825588610, -0.523149777441621280, -0.523107164749779360, -0.523064550750169220, --0.523021935442898100, -0.522979318828072140, -0.522936700905797910, -0.522894081676181450, -0.522851461139330230, -0.522808839295350380, -0.522766216144348370, -0.522723591686430460, --0.522680965921703990, -0.522638338850275110, -0.522595710472249950, -0.522553080787735880, -0.522510449796839140, -0.522467817499666310, -0.522425183896323530, -0.522382548986918160, --0.522339912771556450, -0.522297275250344860, -0.522254636423389870, -0.522211996290798510, -0.522169354852677240, -0.522126712109132530, -0.522084068060270750, -0.522041422706199130, --0.521998776047023940, -0.521956128082851860, -0.521913478813789020, -0.521870828239942910, -0.521828176361419650, -0.521785523178325610, -0.521742868690768140, -0.521700212898853600, --0.521657555802688360, -0.521614897402378990, -0.521572237698032740, -0.521529576689755750, -0.521486914377654930, -0.521444250761836540, -0.521401585842407700, -0.521358919619475000, --0.521316252093145030, -0.521273583263524020, -0.521230913130719450, -0.521188241694837570, -0.521145568955985070, -0.521102894914268310, -0.521060219569794650, -0.521017542922670550, --0.520974864973002490, -0.520932185720896830, -0.520889505166461260, -0.520846823309801810, -0.520804140151024940, -0.520761455690238020, -0.520718769927547620, -0.520676082863060220, --0.520633394496882170, -0.520590704829121180, -0.520548013859883250, -0.520505321589275430, -0.520462628017403840, -0.520419933144376070, -0.520377236970298470, -0.520334539495277750, --0.520291840719420360, -0.520249140642833670, -0.520206439265624150, -0.520163736587898610, -0.520121032609763280, -0.520078327331325860, -0.520035620752692500, -0.519992912873969760, --0.519950203695265010, -0.519907493216684950, -0.519864781438336030, -0.519822068360324740, -0.519779353982758760, -0.519736638305744350, -0.519693921329388300, -0.519651203053797080, --0.519608483479078290, -0.519565762605338270, -0.519523040432683820, -0.519480316961221430, -0.519437592191058560, -0.519394866122301790, -0.519352138755057810, -0.519309410089433100, --0.519266680125535230, -0.519223948863470790, -0.519181216303345900, -0.519138482445268500, -0.519095747289344820, -0.519053010835681780, -0.519010273084385850, -0.518967534035564610, --0.518924793689324540, -0.518882052045772530, -0.518839309105014970, -0.518796564867159530, -0.518753819332312570, -0.518711072500581240, -0.518668324372071670, -0.518625574946891770, --0.518582824225148010, -0.518540072206947090, -0.518497318892395590, -0.518454564281601190, -0.518411808374670380, -0.518369051171710060, -0.518326292672826710, -0.518283532878128120, --0.518240771787720540, -0.518198009401710790, -0.518155245720206330, -0.518112480743313730, -0.518069714471139920, -0.518026946903791470, -0.517984178041376090, -0.517941407884000230, --0.517898636431770810, -0.517855863684794420, -0.517813089643178850, -0.517770314307030470, -0.517727537676456300, -0.517684759751562920, -0.517641980532458020, -0.517599200019248200, --0.517556418212040350, -0.517513635110941060, -0.517470850716058140, -0.517428065027498050, -0.517385278045367380, -0.517342489769773930, -0.517299700200824160, -0.517256909338625230, --0.517214117183283690, -0.517171323734907150, -0.517128528993602400, -0.517085732959476240, -0.517042935632635370, -0.517000137013187590, -0.516957337101239480, -0.516914535896897950, --0.516871733400269710, -0.516828929611462540, -0.516786124530583150, -0.516743318157738330, -0.516700510493034780, -0.516657701536580420, -0.516614891288481810, -0.516572079748845560, --0.516529266917779560, -0.516486452795390290, -0.516443637381785000, -0.516400820677070160, -0.516358002681353680, -0.516315183394742140, -0.516272362817342790, -0.516229540949261990, --0.516186717790607760, -0.516143893341486800, -0.516101067602006030, -0.516058240572272230, -0.516015412252393220, -0.515972582642475700, -0.515929751742626670, -0.515886919552952960, --0.515844086073562250, -0.515801251304561340, -0.515758415246056920, -0.515715577898156920, -0.515672739260967910, -0.515629899334597020, -0.515587058119151060, -0.515544215614737840, --0.515501371821464050, -0.515458526739436820, -0.515415680368762950, -0.515372832709550250, -0.515329983761905420, -0.515287133525935580, -0.515244282001747660, -0.515201429189449330, --0.515158575089147420, -0.515115719700949160, -0.515072863024961140, -0.515030005061291370, -0.514987145810046560, -0.514944285271333960, -0.514901423445260240, -0.514858560331933330, --0.514815695931459930, -0.514772830243947040, -0.514729963269502380, -0.514687095008232840, -0.514644225460245570, -0.514601354625647380, -0.514558482504546060, -0.514515609097048630, --0.514472734403262240, -0.514429858423293580, -0.514386981157250570, -0.514344102605240220, -0.514301222767369560, -0.514258341643745400, -0.514215459234475870, -0.514172575539667660, --0.514129690559428030, -0.514086804293863770, -0.514043916743082920, -0.514001027907192260, -0.513958137786298620, -0.513915246380510000, -0.513872353689933340, -0.513829459714675750, --0.513786564454844050, -0.513743667910546490, -0.513700770081889630, -0.513657870968980860, -0.513614970571927070, -0.513572068890836290, -0.513529165925815210, -0.513486261676971310, --0.513443356144411280, -0.513400449328243360, -0.513357541228574240, -0.513314631845511290, -0.513271721179161420, -0.513228809229632540, -0.513185895997031680, -0.513142981481465750, --0.513100065683042670, -0.513057148601869460, -0.513014230238053370, -0.512971310591701310, -0.512928389662921420, -0.512885467451820510, -0.512842543958505930, -0.512799619183084590, --0.512756693125664630, -0.512713765786352860, -0.512670837165256740, -0.512627907262483080, -0.512584976078140130, -0.512542043612334690, -0.512499109865174220, -0.512456174836765420, --0.512413238527216760, -0.512370300936634830, -0.512327362065127300, -0.512284421912800880, -0.512241480479763810, -0.512198537766123010, -0.512155593771985610, -0.512112648497459520, --0.512069701942651780, -0.512026754107669850, -0.511983804992620530, -0.511940854597612180, -0.511897902922751720, -0.511854949968146400, -0.511811995733903460, -0.511769040220130810, --0.511726083426935600, -0.511683125354425170, -0.511640166002706560, -0.511597205371887910, -0.511554243462076230, -0.511511280273378890, -0.511468315805903020, -0.511425350059756760, --0.511382383035047130, -0.511339414731881160, -0.511296445150366980, -0.511253474290611740, -0.511210502152722900, -0.511167528736807260, -0.511124554042973300, -0.511081578071327920, --0.511038600821978490, -0.510995622295032260, -0.510952642490597460, -0.510909661408780910, -0.510866679049690300, -0.510823695413432530, -0.510780710500115980, -0.510737724309847540, --0.510694736842734920, -0.510651748098885030, -0.510608758078406110, -0.510565766781405310, -0.510522774207989750, -0.510479780358267580, -0.510436785232345920, -0.510393788830332480, --0.510350791152334060, -0.510307792198459010, -0.510264791968814580, -0.510221790463508130, -0.510178787682646790, -0.510135783626338820, -0.510092778294691460, -0.510049771687812180, --0.510006763805808010, -0.509963754648787400, -0.509920744216857400, -0.509877732510125470, -0.509834719528698850, -0.509791705272685800, -0.509748689742193560, -0.509705672937329160, --0.509662654858200950, -0.509619635504916180, -0.509576614877582210, -0.509533592976306400, -0.509490569801197000, -0.509447545352361030, -0.509404519629906400, -0.509361492633939930, --0.509318464364570180, -0.509275434821904290, -0.509232404006049740, -0.509189371917113890, -0.509146338555204970, -0.509103303920430130, -0.509060268012897050, -0.509017230832713000, --0.508974192379986200, -0.508931152654823920, -0.508888111657333830, -0.508845069387622970, -0.508802025845799810, -0.508758981031971700, -0.508715934946245670, -0.508672887588730190, --0.508629838959532510, -0.508586789058760200, -0.508543737886520630, -0.508500685442922040, -0.508457631728071680, -0.508414576742077350, -0.508371520485046080, -0.508328462957086450, --0.508285404158305700, -0.508242344088811420, -0.508199282748710850, -0.508156220138112460, -0.508113156257123610, -0.508070091105851770, -0.508027024684404420, -0.507983956992889780, --0.507940888031415240, -0.507897817800088250, -0.507854746299016950, -0.507811673528308800, -0.507768599488071510, -0.507725524178412320, -0.507682447599439700, -0.507639369751261000, --0.507596290633983930, -0.507553210247715600, -0.507510128592564720, -0.507467045668638540, -0.507423961476044630, -0.507380876014890570, -0.507337789285284610, -0.507294701287334230, --0.507251612021146990, -0.507208521486830490, -0.507165429684492960, -0.507122336614241890, -0.507079242276184620, -0.507036146670429620, -0.506993049797084260, -0.506949951656256230, --0.506906852248052990, -0.506863751572583010, -0.506820649629953550, -0.506777546420272620, -0.506734441943647360, -0.506691336200186360, -0.506648229189996970, -0.506605120913187100, --0.506562011369864010, -0.506518900560136260, -0.506475788484111340, -0.506432675141896940, -0.506389560533600400, -0.506346444659330320, -0.506303327519194160, -0.506260209113299720, --0.506217089441754360, -0.506173968504666670, -0.506130846302144000, -0.506087722834293820, -0.506044598101224820, -0.506001472103044250, -0.505958344839860020, -0.505915216311779600, --0.505872086518911470, -0.505828955461363080, -0.505785823139242360, -0.505742689552656670, -0.505699554701714680, -0.505656418586523770, -0.505613281207191730, -0.505570142563826260, --0.505527002656535720, -0.505483861485427680, -0.505440719050610050, -0.505397575352190210, -0.505354430390276830, -0.505311284164977280, -0.505268136676399250, -0.505224987924651200, --0.505181837909840730, -0.505138686632075620, -0.505095534091463460, -0.505052380288112720, -0.505009225222131210, -0.504966068893626500, -0.504922911302706280, -0.504879752449479140, --0.504836592334052650, -0.504793430956534730, -0.504750268317032740, -0.504707104415655580, -0.504663939252510630, -0.504620772827705790, -0.504577605141348640, -0.504534436193547870, --0.504491265984410960, -0.504448094514045600, -0.504404921782560360, -0.504361747790062710, -0.504318572536660790, -0.504275396022462070, -0.504232218247575140, -0.504189039212107780, --0.504145858916167810, -0.504102677359862690, -0.504059494543301460, -0.504016310466591340, -0.503973125129840490, -0.503929938533156370, -0.503886750676647900, -0.503843561560422540, --0.503800371184588200, -0.503757179549252590, -0.503713986654524490, -0.503670792500511280, -0.503627597087320860, -0.503584400415061690, -0.503541202483841600, -0.503498003293768480, --0.503454802844950030, -0.503411601137494840, -0.503368398171510690, -0.503325193947105620, -0.503281988464387100, -0.503238781723464030, -0.503195573724444010, -0.503152364467435050, --0.503109153952544740, -0.503065942179881990, -0.503022729149554370, -0.502979514861669920, -0.502936299316336320, -0.502893082513662270, -0.502849864453755680, -0.502806645136724240, --0.502763424562675980, -0.502720202731719470, -0.502676979643962410, -0.502633755299512490, -0.502590529698478730, -0.502547302840968490, -0.502504074727090020, -0.502460845356951010, --0.502417614730660270, -0.502374382848325470, -0.502331149710054770, -0.502287915315955740, -0.502244679666137390, -0.502201442760707330, -0.502158204599773560, -0.502114965183444010, --0.502071724511827360, -0.502028482585031410, -0.501985239403164310, -0.501941994966333630, -0.501898749274648390, -0.501855502328216300, -0.501812254127145030, -0.501769004671543510, --0.501725753961519530, -0.501682501997181120, -0.501639248778636080, -0.501595994305993330, -0.501552738579360560, -0.501509481598846010, -0.501466223364557260, -0.501422963876603460, --0.501379703135092170, -0.501336441140131650, -0.501293177891829590, -0.501249913390295010, -0.501206647635635720, -0.501163380627959730, -0.501120112367374970, -0.501076842853990230, --0.501033572087913440, -0.500990300069252270, -0.500947026798115760, -0.500903752274611700, -0.500860476498848240, -0.500817199470933280, -0.500773921190975630, -0.500730641659083210, --0.500687360875364140, -0.500644078839926340, -0.500600795552878620, -0.500557511014328990, -0.500514225224385600, -0.500470938183156240, -0.500427649890749950, -0.500384360347274510, --0.500341069552838190, -0.500297777507548780, -0.500254484211515300, -0.500211189664845680, -0.500167893867648040, -0.500124596820030300, -0.500081298522101480, -0.500037998973969280, --0.499994698175741830, -0.499951396127527980, -0.499908092829435660, -0.499864788281573050, -0.499821482484048120, -0.499778175436969900, -0.499734867140446180, -0.499691557594585330, --0.499648246799495210, -0.499604934755284840, -0.499561621462062120, -0.499518306919935370, -0.499474991129012450, -0.499431674089402480, -0.499388355801213270, -0.499345036264553180, --0.499301715479530170, -0.499258393446253170, -0.499215070164830240, -0.499171745635369260, -0.499128419857979290, -0.499085092832768250, -0.499041764559844500, -0.498998435039315960, --0.498955104271291690, -0.498911772255879680, -0.498868438993188220, -0.498825104483325290, -0.498781768726400010, -0.498738431722520250, -0.498695093471794470, -0.498651753974330540, --0.498608413230237580, -0.498565071239623630, -0.498521728002597030, -0.498478383519265660, -0.498435037789738740, -0.498391690814124270, -0.498348342592530140, -0.498304993125065540, --0.498261642411838460, -0.498218290452957290, -0.498174937248530010, -0.498131582798665760, -0.498088227103472560, -0.498044870163058760, -0.498001511977532450, -0.497958152547002710, --0.497914791871577610, -0.497871429951365520, -0.497828066786474450, -0.497784702377013670, -0.497741336723091070, -0.497697969824815120, -0.497654601682293920, -0.497611232295636530, --0.497567861664951090, -0.497524489790345640, -0.497481116671929350, -0.497437742309810190, -0.497394366704096760, -0.497350989854897010, -0.497307611762320130, -0.497264232426474270, --0.497220851847467840, -0.497177470025408850, -0.497134086960406560, -0.497090702652569110, -0.497047317102004840, -0.497003930308821950, -0.496960542273129580, -0.496917152995035860, --0.496873762474649260, -0.496830370712077920, -0.496786977707430970, -0.496743583460816600, -0.496700187972343280, -0.496656791242119090, -0.496613393270253280, -0.496569994056854040, --0.496526593602029440, -0.496483191905888690, -0.496439788968539960, -0.496396384790091790, -0.496352979370652260, -0.496309572710330660, -0.496266164809235130, -0.496222755667474260, --0.496179345285156000, -0.496135933662389840, -0.496092520799283840, -0.496049106695946480, -0.496005691352486010, -0.495962274769011720, -0.495918856945631700, -0.495875437882454580, --0.495832017579588450, -0.495788596037142650, -0.495745173255225380, -0.495701749233944830, -0.495658323973410250, -0.495614897473729830, -0.495571469735012200, -0.495528040757365510, --0.495484610540899100, -0.495441179085721160, -0.495397746391940290, -0.495354312459664660, -0.495310877289003640, -0.495267440880065410, -0.495224003232958620, -0.495180564347791400, --0.495137124224673150, -0.495093682863712080, -0.495050240265016870, -0.495006796428695610, -0.494963351354857750, -0.494919905043611550, -0.494876457495065150, -0.494833008709328000, --0.494789558686508370, -0.494746107426714820, -0.494702654930055610, -0.494659201196640200, -0.494615746226576720, -0.494572290019973880, -0.494528832576939970, -0.494485373897584350, --0.494441913982015260, -0.494398452830341400, -0.494354990442671060, -0.494311526819113610, -0.494268061959777350, -0.494224595864770910, -0.494181128534202600, -0.494137659968181870, --0.494094190166816990, -0.494050719130216590, -0.494007246858489070, -0.493963773351743800, -0.493920298610089070, -0.493876822633633250, -0.493833345422485690, -0.493789866976754870, --0.493746387296549290, -0.493702906381977390, -0.493659424233148620, -0.493615940850171300, -0.493572456233154100, -0.493528970382205390, -0.493485483297434640, -0.493441994978950140, --0.493398505426860700, -0.493355014641274630, -0.493311522622301380, -0.493268029370049320, -0.493224534884627200, -0.493181039166143310, -0.493137542214707240, -0.493094044030427340, --0.493050544613411910, -0.493007043963770540, -0.492963542081611530, -0.492920038967043670, -0.492876534620175330, -0.492833029041116030, -0.492789522229974190, -0.492746014186858540, --0.492702504911877450, -0.492658994405140490, -0.492615482666756030, -0.492571969696832870, -0.492528455495479410, -0.492484940062805190, -0.492441423398918610, -0.492397905503928480, --0.492354386377943210, -0.492310866021072380, -0.492267344433424350, -0.492223821615107580, -0.492180297566231660, -0.492136772286904940, -0.492093245777236340, -0.492049718037334270, --0.492006189067308250, -0.491962658867266760, -0.491919127437318580, -0.491875594777572260, -0.491832060888137300, -0.491788525769122240, -0.491744989420635830, -0.491701451842786570, --0.491657913035684010, -0.491614372999436720, -0.491570831734153500, -0.491527289239942820, -0.491483745516914320, -0.491440200565176400, -0.491396654384837650, -0.491353106976007590, --0.491309558338794810, -0.491266008473308150, -0.491222457379656030, -0.491178905057948150, -0.491135351508293070, -0.491091796730799560, -0.491048240725576180, -0.491004683492732570, --0.490961125032377320, -0.490917565344619170, -0.490874004429566800, -0.490830442287329750, -0.490786878918016590, -0.490743314321736290, -0.490699748498597270, -0.490656181448709260, --0.490612613172180800, -0.490569043669120850, -0.490525472939637890, -0.490481900983841590, -0.490438327801840600, -0.490394753393743330, -0.490351177759659640, -0.490307600899697940, --0.490264022813967300, -0.490220443502576150, -0.490176862965634340, -0.490133281203250340, -0.490089698215533160, -0.490046114002591350, -0.490002528564534580, -0.489958941901471550, --0.489915354013511160, -0.489871764900761950, -0.489828174563333770, -0.489784583001335150, -0.489740990214875050, -0.489697396204062110, -0.489653800969006070, -0.489610204509815460, --0.489566606826599030, -0.489523007919466460, -0.489479407788526330, -0.489435806433887730, -0.489392203855659180, -0.489348600053950530, -0.489304995028870370, -0.489261388780527720, --0.489217781309031260, -0.489174172614490700, -0.489130562697014710, -0.489086951556712280, -0.489043339193692140, -0.488999725608063980, -0.488956110799936560, -0.488912494769418840, --0.488868877516619500, -0.488825259041648360, -0.488781639344614050, -0.488738018425625250, -0.488694396284791830, -0.488650772922222420, -0.488607148338026040, -0.488563522532311450, --0.488519895505188370, -0.488476267256765630, -0.488432637787152180, -0.488389007096456720, -0.488345375184789150, -0.488301742052258180, -0.488258107698972820, -0.488214472125041820, --0.488170835330575040, -0.488127197315681160, -0.488083558080469270, -0.488039917625048110, -0.487996275949527550, -0.487952633054016320, -0.487908988938623440, -0.487865343603457740, --0.487821697048629100, -0.487778049274246170, -0.487734400280417760, -0.487690750067253710, -0.487647098634862770, -0.487603445983354140, -0.487559792112836510, -0.487516137023419730, --0.487472480715212650, -0.487428823188324370, -0.487385164442863620, -0.487341504478940310, -0.487297843296663310, -0.487254180896141700, -0.487210517277484210, -0.487166852440800820, --0.487123186386200340, -0.487079519113791830, -0.487035850623684210, -0.486992180915987280, -0.486948509990809960, -0.486904837848260940, -0.486861164488450180, -0.486817489911486550, --0.486773814117479220, -0.486730137106536950, -0.486686458878769710, -0.486642779434286350, -0.486599098773196010, -0.486555416895607550, -0.486511733801630930, -0.486468049491374950, --0.486424363964948870, -0.486380677222461530, -0.486336989264022860, -0.486293300089741700, -0.486249609699727300, -0.486205918094088470, -0.486162225272935290, -0.486118531236376490, --0.486074835984521000, -0.486031139517478780, -0.485987441835358750, -0.485943742938270080, -0.485900042826321710, -0.485856341499623590, -0.485812638958284580, -0.485768935202414040, --0.485725230232120770, -0.485681524047514750, -0.485637816648704980, -0.485594108035800660, -0.485550398208910660, -0.485506687168145050, -0.485462974913612730, -0.485419261445423020, --0.485375546763684720, -0.485331830868507950, -0.485288113760001580, -0.485244395438274580, -0.485200675903436960, -0.485156955155597650, -0.485113233194865930, -0.485069510021350790, --0.485025785635162240, -0.484982060036409200, -0.484938333225201020, -0.484894605201646620, -0.484850875965856130, -0.484807145517938410, -0.484763413858002870, -0.484719680986158360, --0.484675946902515090, -0.484632211607181900, -0.484588475100268200, -0.484544737381882920, -0.484500998452136180, -0.484457258311136950, -0.484413516958994590, -0.484369774395818020, --0.484326030621717420, -0.484282285636801760, -0.484238539441180000, -0.484194792034962240, -0.484151043418257540, -0.484107293591175210, -0.484063542553824280, -0.484019790306314810, --0.483976036848755950, -0.483932282181256950, -0.483888526303926870, -0.483844769216875860, -0.483801010920212940, -0.483757251414047520, -0.483713490698488510, -0.483669728773646220, --0.483625965639629560, -0.483582201296548050, -0.483538435744510610, -0.483494668983627470, -0.483450901014007670, -0.483407131835760230, -0.483363361448995330, -0.483319589853822060, --0.483275817050349780, -0.483232043038687550, -0.483188267818945640, -0.483144491391233060, -0.483100713755659270, -0.483056934912333260, -0.483013154861365310, -0.482969373602864520, --0.482925591136940220, -0.482881807463701630, -0.482838022583258860, -0.482794236495721060, -0.482750449201197640, -0.482706660699797730, -0.482662870991631580, -0.482619080076808200, --0.482575287955436800, -0.482531494627627510, -0.482487700093489510, -0.482443904353132220, -0.482400107406664840, -0.482356309254197540, -0.482312509895839510, -0.482268709331700180, --0.482224907561888680, -0.482181104586515310, -0.482137300405689140, -0.482093495019519760, -0.482049688428116240, -0.482005880631588890, -0.481962071630046840, -0.481918261423599610, --0.481874450012356350, -0.481830637396427400, -0.481786823575921790, -0.481743008550949090, -0.481699192321618560, -0.481655374888040390, -0.481611556250323810, -0.481567736408577920, --0.481523915362913110, -0.481480093113438480, -0.481436269660263650, -0.481392445003497700, -0.481348619143251110, -0.481304792079632890, -0.481260963812752740, -0.481217134342719790, --0.481173303669644390, -0.481129471793635740, -0.481085638714803370, -0.481041804433256560, -0.480997968949105630, -0.480954132262459750, -0.480910294373428530, -0.480866455282121190, --0.480822614988648140, -0.480778773493118540, -0.480734930795641560, -0.480691086896327720, -0.480647241795286120, -0.480603395492626430, -0.480559547988457850, -0.480515699282890780, --0.480471849376034490, -0.480427998267998590, -0.480384145958892230, -0.480340292448825980, -0.480296437737908980, -0.480252581826250860, -0.480208724713960920, -0.480164866401149530, --0.480121006887925970, -0.480077146174399950, -0.480033284260680590, -0.479989421146878480, -0.479945556833102800, -0.479901691319462810, -0.479857824606069020, -0.479813956693030620, --0.479770087580457420, -0.479726217268458540, -0.479682345757144520, -0.479638473046624600, -0.479594599137008530, -0.479550724028405590, -0.479506847720926220, -0.479462970214679710, --0.479419091509775800, -0.479375211606323790, -0.479331330504434110, -0.479287448204216090, -0.479243564705779500, -0.479199680009233580, -0.479155794114688840, -0.479111907022254590, --0.479068018732040250, -0.479024129244156220, -0.478980238558711860, -0.478936346675816860, -0.478892453595580690, -0.478848559318113710, -0.478804663843525380, -0.478760767171925390, --0.478716869303423050, -0.478672970238128940, -0.478629069976152450, -0.478585168517603240, -0.478541265862590710, -0.478497362011225450, -0.478453456963616740, -0.478409550719874400, --0.478365643280107830, -0.478321734644427510, -0.478277824812942840, -0.478233913785763630, -0.478190001562999230, -0.478146088144760230, -0.478102173531156030, -0.478058257722295990, --0.478014340718290690, -0.477970422519249540, -0.477926503125282290, -0.477882582536498460, -0.477838660753008520, -0.477794737774921980, -0.477750813602348560, -0.477706888235397700, --0.477662961674180040, -0.477619033918804950, -0.477575104969382270, -0.477531174826021480, -0.477487243488833150, -0.477443310957926640, -0.477399377233411910, -0.477355442315398340, --0.477311506203996540, -0.477267568899315990, -0.477223630401466090, -0.477179690710557550, -0.477135749826699760, -0.477091807750002590, -0.477047864480575570, -0.477003920018529200, --0.476959974363973080, -0.476916027517017000, -0.476872079477770490, -0.476828130246344130, -0.476784179822847490, -0.476740228207390370, -0.476696275400082300, -0.476652321401033920, --0.476608366210354740, -0.476564409828154620, -0.476520452254543150, -0.476476493489630890, -0.476432533533527440, -0.476388572386342250, -0.476344610048185960, -0.476300646519168200, --0.476256681799398840, -0.476212715888987340, -0.476168748788044440, -0.476124780496679720, -0.476080811015002990, -0.476036840343123880, -0.475992868481153080, -0.475948895429200050, --0.475904921187374820, -0.475860945755786910, -0.475816969134547020, -0.475772991323764660, -0.475729012323549860, -0.475685032134012140, -0.475641050755262200, -0.475597068187409660, --0.475553084430564430, -0.475509099484836160, -0.475465113350335480, -0.475421126027172010, -0.475377137515455350, -0.475333147815296230, -0.475289156926804290, -0.475245164850089390, --0.475201171585261210, -0.475157177132430500, -0.475113181491706840, -0.475069184663200250, -0.475025186647020260, -0.474981187443277720, -0.474937187052082210, -0.474893185473543760, --0.474849182707771930, -0.474805178754877490, -0.474761173614970170, -0.474717167288159880, -0.474673159774556320, -0.474629151074270230, -0.474585141187411240, -0.474541130114089050, --0.474497117854414400, -0.474453104408496970, -0.474409089776446750, -0.474365073958373410, -0.474321056954387810, -0.474277038764599530, -0.474233019389118720, -0.474188998828054930, --0.474144977081519040, -0.474100954149620670, -0.474056930032469960, -0.474012904730176540, -0.473968878242851220, -0.473924850570603680, -0.473880821713544060, -0.473836791671782000, --0.473792760445428340, -0.473748728034592780, -0.473704694439385010, -0.473660659659915880, -0.473616623696295090, -0.473572586548632770, -0.473528548217038600, -0.473484508701623400, --0.473440468002497010, -0.473396426119769400, -0.473352383053550320, -0.473308338803950680, -0.473264293371080220, -0.473220246755049030, -0.473176198955966800, -0.473132149973944480, --0.473088099809091780, -0.473044048461518820, -0.472999995931335350, -0.472955942218652340, -0.472911887323579420, -0.472867831246226390, -0.472823773986704170, -0.472779715545122550, --0.472735655921591610, -0.472691595116221110, -0.472647533129122050, -0.472603469960404200, -0.472559405610177620, -0.472515340078552120, -0.472471273365638710, -0.472427205471547100, --0.472383136396387460, -0.472339066140269600, -0.472294994703304490, -0.472250922085601880, -0.472206848287271940, -0.472162773308424490, -0.472118697149170540, -0.472074619809619790, --0.472030541289882530, -0.471986461590068520, -0.471942380710288770, -0.471898298650653030, -0.471854215411271150, -0.471810130992254160, -0.471766045393711810, -0.471721958615754390, --0.471677870658491650, -0.471633781522034610, -0.471589691206493130, -0.471545599711977400, -0.471501507038597330, -0.471457413186463840, -0.471413318155686820, -0.471369221946376540, --0.471325124558642780, -0.471281025992596640, -0.471236926248347900, -0.471192825326006870, -0.471148723225683350, -0.471104619947488420, -0.471060515491531940, -0.471016409857923810, --0.470972303046775010, -0.470928195058195500, -0.470884085892295470, -0.470839975549184830, -0.470795864028974660, -0.470751751331774830, -0.470707637457695620, -0.470663522406846890, --0.470619406179339780, -0.470575288775284150, -0.470531170194790290, -0.470487050437968120, -0.470442929504928720, -0.470398807395781990, -0.470354684110638300, -0.470310559649607440, --0.470266434012800550, -0.470222307200327650, -0.470178179212298540, -0.470134050048824360, -0.470089919710015120, -0.470045788195981030, -0.470001655506832090, -0.469957521642679400, --0.469913386603632910, -0.469869250389802980, -0.469825113001299480, -0.469780974438233630, -0.469736834700715310, -0.469692693788854920, -0.469648551702762430, -0.469604408442548920, --0.469560264008324400, -0.469516118400199240, -0.469471971618283360, -0.469427823662687930, -0.469383674533522980, -0.469339524230898810, -0.469295372754925500, -0.469251220105714070, --0.469207066283374660, -0.469162911288017130, -0.469118755119752760, -0.469074597778691480, -0.469030439264943700, -0.468986279578619440, -0.468942118719829880, -0.468897956688685060, --0.468853793485295270, -0.468809629109770640, -0.468765463562222370, -0.468721296842760370, -0.468677128951495160, -0.468632959888536760, -0.468588789653996310, -0.468544618247983930, --0.468500445670609940, -0.468456271921984520, -0.468412097002218750, -0.468367920911422760, -0.468323743649706580, -0.468279565217181450, -0.468235385613957390, -0.468191204840144870, --0.468147022895853970, -0.468102839781195880, -0.468058655496280670, -0.468014470041218820, -0.467970283416120460, -0.467926095621096720, -0.467881906656257780, -0.467837716521714080, --0.467793525217575670, -0.467749332743953860, -0.467705139100958680, -0.467660944288700700, -0.467616748307289940, -0.467572551156837710, -0.467528352837454090, -0.467484153349249200, --0.467439952692334350, -0.467395750866819560, -0.467351547872815460, -0.467307343710432030, -0.467263138379780670, -0.467218931880971470, -0.467174724214114930, -0.467130515379321210, --0.467086305376701590, -0.467042094206366170, -0.466997881868425560, -0.466953668362989790, -0.466909453690170280, -0.466865237850077160, -0.466821020842820960, -0.466776802668511740, --0.466732583327260970, -0.466688362819178690, -0.466644141144375520, -0.466599918302961660, -0.466555694295048340, -0.466511469120745760, -0.466467242780164160, -0.466423015273414840, --0.466378786600608000, -0.466334556761854150, -0.466290325757263540, -0.466246093586947520, -0.466201860251016230, -0.466157625749580360, -0.466113390082749990, -0.466069153250636530, --0.466024915253350160, -0.465980676091001520, -0.465936435763700860, -0.465892194271559420, -0.465847951614687560, -0.465803707793195800, -0.465759462807194320, -0.465715216656794660, --0.465670969342106890, -0.465626720863241360, -0.465582471220309380, -0.465538220413421240, -0.465493968442687530, -0.465449715308218550, -0.465405461010125640, -0.465361205548519120, --0.465316948923509550, -0.465272691135207190, -0.465228432183723560, -0.465184172069168790, -0.465139910791653620, -0.465095648351288250, -0.465051384748184190, -0.465007119982451640, --0.464962854054201350, -0.464918586963543490, -0.464874318710589540, -0.464830049295449800, -0.464785778718234570, -0.464741506979055250, -0.464697234078022160, -0.464652960015246030, --0.464608684790837060, -0.464564408404906810, -0.464520130857565550, -0.464475852148923900, -0.464431572279092260, -0.464387291248182120, -0.464343009056303710, -0.464298725703567780, --0.464254441190084630, -0.464210155515965780, -0.464165868681321590, -0.464121580686262690, -0.464077291530899440, -0.464033001215343350, -0.463988709739704740, -0.463944417104094010, --0.463900123308622630, -0.463855828353400890, -0.463811532238539600, -0.463767234964149120, -0.463722936530340910, -0.463678636937225390, -0.463634336184913230, -0.463590034273514860, --0.463545731203141850, -0.463501426973904450, -0.463457121585913510, -0.463412815039279340, -0.463368507334113560, -0.463324198470526470, -0.463279888448628940, -0.463235577268531260, --0.463191264930345070, -0.463146951434180660, -0.463102636780148900, -0.463058320968360190, -0.463014003998926000, -0.462969685871956860, -0.462925366587563060, -0.462881046145856290, --0.462836724546946850, -0.462792401790945660, -0.462748077877963020, -0.462703752808110600, -0.462659426581498830, -0.462615099198238460, -0.462570770658439930, -0.462526440962214900, --0.462482110109673770, -0.462437778100927340, -0.462393444936086080, -0.462349110615261630, -0.462304775138564330, -0.462260438506105150, -0.462216100717994460, -0.462171761774343940, --0.462127421675263990, -0.462083080420865100, -0.462038738011258940, -0.461994394446555880, -0.461950049726866820, -0.461905703852302290, -0.461861356822973910, -0.461817008638992110, --0.461772659300467790, -0.461728308807511420, -0.461683957160234640, -0.461639604358748010, -0.461595250403162400, -0.461550895293588230, -0.461506539030137220, -0.461462181612919850, --0.461417823042047040, -0.461373463317629300, -0.461329102439778260, -0.461284740408604450, -0.461240377224218460, -0.461196012886731840, -0.461151647396255250, -0.461107280752899530, --0.461062912956775210, -0.461018544007993970, -0.460974173906666400, -0.460929802652903400, -0.460885430246815500, -0.460841056688514440, -0.460796681978110690, -0.460752306115715270, --0.460707929101438650, -0.460663550935392630, -0.460619171617687730, -0.460574791148434910, -0.460530409527744710, -0.460486026755728920, -0.460441642832498000, -0.460397257758163040, --0.460352871532834500, -0.460308484156624120, -0.460264095629642600, -0.460219705952000460, -0.460175315123809440, -0.460130923145180060, -0.460086530016223460, -0.460042135737050110, --0.459997740307771800, -0.459953343728499160, -0.459908945999343180, -0.459864547120414410, -0.459820147091824670, -0.459775745913684530, -0.459731343586105070, -0.459686940109196860, --0.459642535483071660, -0.459598129707840140, -0.459553722783613340, -0.459509314710501770, -0.459464905488617350, -0.459420495118070650, -0.459376083598972310, -0.459331670931434180, --0.459287257115566840, -0.459242842151481370, -0.459198426039288400, -0.459154008779099790, -0.459109590371026110, -0.459065170815178500, -0.459020750111667540, -0.458976328260605080, --0.458931905262101870, -0.458887481116268810, -0.458843055823216720, -0.458798629383057380, -0.458754201795901430, -0.458709773061860000, -0.458665343181043740, -0.458620912153564490, --0.458576479979532990, -0.458532046659059890, -0.458487612192257090, -0.458443176579235220, -0.458398739820105430, -0.458354301914978390, -0.458309862863966020, -0.458265422667178960, --0.458220981324728330, -0.458176538836724880, -0.458132095203280460, -0.458087650424505830, -0.458043204500512060, -0.457998757431409890, -0.457954309217311170, -0.457909859858326720, --0.457865409354567650, -0.457820957706144620, -0.457776504913169620, -0.457732050975753310, -0.457687595894006540, -0.457643139668041100, -0.457598682297967850, -0.457554223783897930, --0.457509764125942020, -0.457465303324212090, -0.457420841378818890, -0.457376378289873650, -0.457331914057487020, -0.457287448681771010, -0.457242982162836380, -0.457198514500794300, --0.457154045695755520, -0.457109575747832010, -0.457065104657134570, -0.457020632423774390, -0.456976159047862260, -0.456931684529510050, -0.456887208868828660, -0.456842732065929290, --0.456798254120922680, -0.456753775033920780, -0.456709294805034470, -0.456664813434374540, -0.456620330922053010, -0.456575847268180570, -0.456531362472868570, -0.456486876536227770, --0.456442389458370120, -0.456397901239406540, -0.456353411879448220, -0.456308921378605960, -0.456264429736991770, -0.456219936954716520, -0.456175443031891450, -0.456130947968627350, --0.456086451765036260, -0.456041954421229080, -0.455997455937317000, -0.455952956313410870, -0.455908455549622780, -0.455863953646063520, -0.455819450602843960, -0.455774946420076210, --0.455730441097871090, -0.455685934636339880, -0.455641427035593400, -0.455596918295743780, -0.455552408416901810, -0.455507897399178910, -0.455463385242685810, -0.455418871947534660, --0.455374357513836310, -0.455329841941702060, -0.455285325231242880, -0.455240807382570720, -0.455196288395796570, -0.455151768271031650, -0.455107247008386950, -0.455062724607974530, --0.455018201069905310, -0.454973676394290150, -0.454929150581241230, -0.454884623630869460, -0.454840095543286080, -0.454795566318602070, -0.454751035956929560, -0.454706504458379460, --0.454661971823063060, -0.454617438051091390, -0.454572903142576480, -0.454528367097629340, -0.454483829916361270, -0.454439291598883240, -0.454394752145307390, -0.454350211555744620, --0.454305669830306350, -0.454261126969103480, -0.454216582972248260, -0.454172037839851490, -0.454127491572024700, -0.454082944168878730, -0.454038395630525840, -0.453993845957076920, --0.453949295148643020, -0.453904743205336250, -0.453860190127267640, -0.453815635914548600, -0.453771080567289990, -0.453726524085604150, -0.453681966469601960, -0.453637407719394870, --0.453592847835093850, -0.453548286816811090, -0.453503724664657600, -0.453459161378744870, -0.453414596959183790, -0.453370031406086620, -0.453325464719564420, -0.453280896899728500, --0.453236327946689940, -0.453191757860560980, -0.453147186641452650, -0.453102614289475900, -0.453058040804743050, -0.453013466187365100, -0.452968890437453480, -0.452924313555119200, --0.452879735540474560, -0.452835156393630590, -0.452790576114698750, -0.452745994703790010, -0.452701412161016730, -0.452656828486489910, -0.452612243680320990, -0.452567657742621090, --0.452523070673502450, -0.452478482473076150, -0.452433893141453600, -0.452389302678745940, -0.452344711085065410, -0.452300118360523140, -0.452255524505230160, -0.452210929519298750, --0.452166333402840010, -0.452121736155965460, -0.452077137778786160, -0.452032538271414430, -0.451987937633961330, -0.451943335866538400, -0.451898732969256700, -0.451854128942228590, --0.451809523785565210, -0.451764917499377970, -0.451720310083778000, -0.451675701538877710, -0.451631091864788170, -0.451586481061620860, -0.451541869129486960, -0.451497256068498830, --0.451452641878767550, -0.451408026560404240, -0.451363410113521270, -0.451318792538229760, -0.451274173834641250, -0.451229554002866960, -0.451184933043019150, -0.451140310955209010, --0.451095687739548110, -0.451051063396147590, -0.451006437925119800, -0.450961811326575920, -0.450917183600627490, -0.450872554747385750, -0.450827924766962980, -0.450783293659470450, --0.450738661425019620, -0.450694028063721770, -0.450649393575689280, -0.450604757961033280, -0.450560121219865330, -0.450515483352296740, -0.450470844358439870, -0.450426204238405850, --0.450381562992305920, -0.450336920620252430, -0.450292277122356700, -0.450247632498730290, -0.450202986749484390, -0.450158339874731360, -0.450113691874582560, -0.450069042749149490, --0.450024392498543420, -0.449979741122876750, -0.449935088622260780, -0.449890434996807030, -0.449845780246626860, -0.449801124371832620, -0.449756467372535500, -0.449711809248847290, --0.449667150000879150, -0.449622489628743460, -0.449577828132551650, -0.449533165512414790, -0.449488501768445460, -0.449443836900754850, -0.449399170909454690, -0.449354503794656130, --0.449309835556471750, -0.449265166195012830, -0.449220495710390910, -0.449175824102717390, -0.449131151372104740, -0.449086477518664150, -0.449041802542507420, -0.448997126443745790, --0.448952449222491720, -0.448907770878856530, -0.448863091412951890, -0.448818410824889160, -0.448773729114780750, -0.448729046282738080, -0.448684362328872320, -0.448639677253296120, --0.448594991056120720, -0.448550303737457800, -0.448505615297418780, -0.448460925736116070, -0.448416235053661070, -0.448371543250165480, -0.448326850325740660, -0.448282156280499060, --0.448237461114552090, -0.448192764828011460, -0.448148067420988560, -0.448103368893595870, -0.448058669245944730, -0.448013968478146950, -0.447969266590313830, -0.447924563582557940, --0.447879859454990650, -0.447835154207723740, -0.447790447840868520, -0.447745740354537570, -0.447701031748842290, -0.447656322023893990, -0.447611611179805360, -0.447566899216687630, --0.447522186134652670, -0.447477471933811880, -0.447432756614277780, -0.447388040176161790, -0.447343322619575710, -0.447298603944630890, -0.447253884151440020, -0.447209163240114390, --0.447164441210765870, -0.447119718063505870, -0.447074993798446950, -0.447030268415700540, -0.446985541915378480, -0.446940814297592140, -0.446896085562454190, -0.446851355710076000, --0.446806624740569040, -0.446761892654045870, -0.446717159450618020, -0.446672425130397290, -0.446627689693495030, -0.446582953140024000, -0.446538215470095590, -0.446493476683821610, --0.446448736781313580, -0.446403995762684080, -0.446359253628044570, -0.446314510377506970, -0.446269766011182680, -0.446225020529184340, -0.446180273931623460, -0.446135526218611910, --0.446090777390261150, -0.446046027446683870, -0.446001276387991470, -0.445956524214295550, -0.445911770925708660, -0.445867016522342340, -0.445822261004308500, -0.445777504371718590, --0.445732746624685370, -0.445687987763320250, -0.445643227787735130, -0.445598466698041600, -0.445553704494352280, -0.445508941176778640, -0.445464176745432710, -0.445419411200425940, --0.445374644541871030, -0.445329876769879510, -0.445285107884563270, -0.445240337886033900, -0.445195566774404080, -0.445150794549785340, -0.445106021212289200, -0.445061246762028410, --0.445016471199114530, -0.444971694523659420, -0.444926916735774720, -0.444882137835573120, -0.444837357823166190, -0.444792576698665840, -0.444747794462183650, -0.444703011113832370, --0.444658226653723570, -0.444613441081969210, -0.444568654398680820, -0.444523866603971250, -0.444479077697951970, -0.444434287680735010, -0.444389496552431930, -0.444344704313155480, --0.444299910963017300, -0.444255116502129340, -0.444210320930603200, -0.444165524248551660, -0.444120726456086250, -0.444075927553318710, -0.444031127540361670, -0.443986326417326880, --0.443941524184326250, -0.443896720841471360, -0.443851916388875170, -0.443807110826649090, -0.443762304154905310, -0.443717496373755290, -0.443672687483312010, -0.443627877483686980, --0.443583066374992230, -0.443538254157339440, -0.443493440830841410, -0.443448626395609780, -0.443403810851756620, -0.443358994199393450, -0.443314176438633250, -0.443269357569587630, --0.443224537592368180, -0.443179716507087760, -0.443134894313858110, -0.443090071012791190, -0.443045246603998690, -0.443000421087593520, -0.442955594463687260, -0.442910766732391990, --0.442865937893819450, -0.442821107948082440, -0.442776276895292640, -0.442731444735562200, -0.442686611469002730, -0.442641777095727110, -0.442596941615847060, -0.442552105029474670, --0.442507267336721580, -0.442462428537700740, -0.442417588632523840, -0.442372747621302580, -0.442327905504149800, -0.442283062281177310, -0.442238217952497130, -0.442193372518221050, --0.442148525978461880, -0.442103678333331420, -0.442058829582941790, -0.442013979727404640, -0.441969128766832970, -0.441924276701338490, -0.441879423531033320, -0.441834569256029150, --0.441789713876439010, -0.441744857392374570, -0.441699999803947970, -0.441655141111270970, -0.441610281314456510, -0.441565420413616350, -0.441520558408862670, -0.441475695300307170, --0.441430831088062800, -0.441385965772241430, -0.441341099352954680, -0.441296231830315630, -0.441251363204435980, -0.441206493475427900, -0.441161622643403200, -0.441116750708474840, --0.441071877670754620, -0.441027003530354680, -0.440982128287386870, -0.440937251941964090, -0.440892374494198210, -0.440847495944201420, -0.440802616292085450, -0.440757735537963380, --0.440712853681946900, -0.440667970724148370, -0.440623086664679480, -0.440578201503653230, -0.440533315241181500, -0.440488427877376130, -0.440443539412350040, -0.440398649846215130, --0.440353759179083590, -0.440308867411067230, -0.440263974542279110, -0.440219080572831100, -0.440174185502835320, -0.440129289332403690, -0.440084392061649290, -0.440039493690683850, --0.439994594219619730, -0.439949693648568670, -0.439904791977643820, -0.439859889206956960, -0.439814985336620390, -0.439770080366745920, -0.439725174297446730, -0.439680267128834510, --0.439635358861021290, -0.439590449494120070, -0.439545539028242730, -0.439500627463501490, -0.439455714800008330, -0.439410801037876280, -0.439365886177217170, -0.439320970218143430, --0.439276053160766790, -0.439231135005200450, -0.439186215751556310, -0.439141295399946560, -0.439096373950483230, -0.439051451403279340, -0.439006527758446840, -0.438961603016097990, --0.438916677176344750, -0.438871750239300200, -0.438826822205076290, -0.438781893073784960, -0.438736962845539260, -0.438692031520451160, -0.438647099098632980, -0.438602165580196600, --0.438557230965255280, -0.438512295253920880, -0.438467358446305690, -0.438422420542521730, -0.438377481542682130, -0.438332541446898820, -0.438287600255284180, -0.438242657967950090, --0.438197714585009780, -0.438152770106575220, -0.438107824532758650, -0.438062877863672210, -0.438017930099428910, -0.437972981240140840, -0.437928031285920280, -0.437883080236879220, --0.437838128093130880, -0.437793174854787250, -0.437748220521960270, -0.437703265094763150, -0.437658308573307840, -0.437613350957706760, -0.437568392248071920, -0.437523432444516470, --0.437478471547152470, -0.437433509556092280, -0.437388546471447930, -0.437343582293332590, -0.437298617021858290, -0.437253650657137450, -0.437208683199282130, -0.437163714648405420, --0.437118745004619500, -0.437073774268036670, -0.437028802438769020, -0.436983829516929770, -0.436938855502630950, -0.436893880395984590, -0.436848904197103930, -0.436803926906101040, --0.436758948523088280, -0.436713969048177770, -0.436668988481482720, -0.436624006823115200, -0.436579024073187720, -0.436534040231812190, -0.436489055299102040, -0.436444069275169210, --0.436399082160126180, -0.436354093954085090, -0.436309104657159160, -0.436264114269460490, -0.436219122791101480, -0.436174130222194310, -0.436129136562852180, -0.436084141813187220, --0.436039145973311500, -0.435994149043338330, -0.435949151023379830, -0.435904151913548370, -0.435859151713956170, -0.435814150424716500, -0.435769148045941470, -0.435724144577743500, --0.435679140020234830, -0.435634134373528710, -0.435589127637737220, -0.435544119812972920, -0.435499110899347950, -0.435454100896975560, -0.435409089805967930, -0.435364077626437580, --0.435319064358496650, -0.435274050002258440, -0.435229034557835130, -0.435184018025339240, -0.435139000404882850, -0.435093981696579420, -0.435048961900540990, -0.435003941016879780, --0.434958919045709100, -0.434913895987141140, -0.434868871841288420, -0.434823846608263180, -0.434778820288178660, -0.434733792881147110, -0.434688764387281050, -0.434643734806692720, --0.434598704139495420, -0.434553672385801390, -0.434508639545723160, -0.434463605619372970, -0.434418570606864120, -0.434373534508308850, -0.434328497323819780, -0.434283459053509010, --0.434238419697490050, -0.434193379255874980, -0.434148337728776150, -0.434103295116306800, -0.434058251418579230, -0.434013206635706030, -0.433968160767799430, -0.433923113814972840, --0.433878065777338400, -0.433833016655008840, -0.433787966448096360, -0.433742915156714310, -0.433697862780975050, -0.433652809320991100, -0.433607754776874690, -0.433562699148739290, --0.433517642436697210, -0.433472584640860970, -0.433427525761342860, -0.433382465798256400, -0.433337404751713730, -0.433292342621827140, -0.433247279408710110, -0.433202215112474860, --0.433157149733234100, -0.433112083271100070, -0.433067015726186220, -0.433021947098604810, -0.432976877388468570, -0.432931806595889700, -0.432886734720981770, -0.432841661763856970, --0.432796587724627980, -0.432751512603407160, -0.432706436400307930, -0.432661359115442680, -0.432616280748923940, -0.432571201300864130, -0.432526120771376750, -0.432481039160574070, --0.432435956468568360, -0.432390872695473160, -0.432345787841400760, -0.432300701906463970, -0.432255614890774960, -0.432210526794447330, -0.432165437617593350, -0.432120347360325840, --0.432075256022756980, -0.432030163605000460, -0.431985070107168470, -0.431939975529373850, -0.431894879871728870, -0.431849783134347130, -0.431804685317340900, -0.431759586420822910, --0.431714486444905620, -0.431669385389702510, -0.431624283255325920, -0.431579180041888610, -0.431534075749502980, -0.431488970378282490, -0.431443863928339670, -0.431398756399786750, --0.431353647792737330, -0.431308538107303800, -0.431263427343598900, -0.431218315501735060, -0.431173202581825840, -0.431128088583983600, -0.431082973508321140, -0.431037857354950820, --0.430992740123986310, -0.430947621815539920, -0.430902502429724440, -0.430857381966652350, -0.430812260426437220, -0.430767137809191400, -0.430722014115027750, -0.430676889344058680, --0.430631763496397760, -0.430586636572157460, -0.430541508571450130, -0.430496379494389460, -0.430451249341087860, -0.430406118111658080, -0.430360985806212630, -0.430315852424865140, --0.430270717967727980, -0.430225582434914040, -0.430180445826535750, -0.430135308142706780, -0.430090169383539500, -0.430045029549146810, -0.429999888639641110, -0.429954746655136110, --0.429909603595744260, -0.429864459461578420, -0.429819314252750990, -0.429774167969375680, -0.429729020611564980, -0.429683872179431270, -0.429638722673088340, -0.429593572092648590, --0.429548420438224890, -0.429503267709929750, -0.429458113907876860, -0.429412959032178630, -0.429367803082948090, -0.429322646060297570, -0.429277487964340840, -0.429232328795190410, --0.429187168552959190, -0.429142007237759580, -0.429096844849705390, -0.429051681388909090, -0.429006516855483580, -0.428961351249541380, -0.428916184571196180, -0.428871016820560560, --0.428825847997747370, -0.428780678102869180, -0.428735507136039700, -0.428690335097371420, -0.428645161986976890, -0.428599987804969880, -0.428554812551462940, -0.428509636226568900, --0.428464458830400410, -0.428419280363071200, -0.428374100824693740, -0.428328920215381050, -0.428283738535245650, -0.428238555784401290, -0.428193371962960530, -0.428148187071036410, --0.428103001108741390, -0.428057814076189260, -0.428012625973492540, -0.427967436800764320, -0.427922246558117110, -0.427877055245664660, -0.427831862863519600, -0.427786669411794440, --0.427741474890603050, -0.427696279300057940, -0.427651082640272180, -0.427605884911358260, -0.427560686113430070, -0.427515486246600130, -0.427470285310981470, -0.427425083306686720, --0.427379880233829670, -0.427334676092522900, -0.427289470882879440, -0.427244264605011910, -0.427199057259034120, -0.427153848845058690, -0.427108639363198650, -0.427063428813566570, --0.427018217196276360, -0.426973004511440600, -0.426927790759171920, -0.426882575939584120, -0.426837360052789940, -0.426792143098902340, -0.426746925078034020, -0.426701705990298720, --0.426656485835809170, -0.426611264614678460, -0.426566042327019170, -0.426520818972945140, -0.426475594552569060, -0.426430369066004010, -0.426385142513362680, -0.426339914894758860, --0.426294686210305250, -0.426249456460114920, -0.426204225644300550, -0.426158993762976000, -0.426113760816253960, -0.426068526804247170, -0.426023291727069430, -0.425978055584833480, --0.425932818377652340, -0.425887580105638820, -0.425842340768906700, -0.425797100367568790, -0.425751858901738060, -0.425706616371527350, -0.425661372777050410, -0.425616128118420090, --0.425570882395749470, -0.425525635609151240, -0.425480387758739310, -0.425435138844626410, -0.425389888866925640, -0.425344637825749770, -0.425299385721212670, -0.425254132553427140, --0.425208878322506310, -0.425163623028562860, -0.425118366671710710, -0.425073109252062710, -0.425027850769731490, -0.424982591224831060, -0.424937330617474180, -0.424892068947773930, --0.424846806215843140, -0.424801542421795690, -0.424756277565744410, -0.424711011647802450, -0.424665744668082550, -0.424620476626698660, -0.424575207523763600, -0.424529937359390540, --0.424484666133692230, -0.424439393846782640, -0.424394120498774560, -0.424348846089781240, -0.424303570619915360, -0.424258294089290940, -0.424213016498020790, -0.424167737846217700, --0.424122458133995680, -0.424077177361467490, -0.424031895528746370, -0.423986612635945110, -0.423941328683177740, -0.423896043670557050, -0.423850757598196240, -0.423805470466208090, --0.423760182274706740, -0.423714893023804880, -0.423669602713615810, -0.423624311344252320, -0.423579018915828500, -0.423533725428457080, -0.423488430882251350, -0.423443135277324130, --0.423397838613789490, -0.423352540891760280, -0.423307242111349290, -0.423261942272670610, -0.423216641375837090, -0.423171339420961910, -0.423126036408158050, -0.423080732337539460, --0.423035427209219050, -0.422990121023310070, -0.422944813779925380, -0.422899505479179040, -0.422854196121183970, -0.422808885706053410, -0.422763574233900210, -0.422718261704838450, --0.422672948118981100, -0.422627633476441330, -0.422582317777332130, -0.422537001021767500, -0.422491683209860360, -0.422446364341724000, -0.422401044417471390, -0.422355723437216500, --0.422310401401072340, -0.422265078309151780, -0.422219754161568930, -0.422174428958436650, -0.422129102699868360, -0.422083775385976860, -0.422038447016876370, -0.421993117592679710, --0.421947787113500280, -0.421902455579451000, -0.421857122990645980, -0.421811789347198150, -0.421766454649220800, -0.421721118896826950, -0.421675782090130740, -0.421630444229245000, --0.421585105314283230, -0.421539765345358200, -0.421494424322584220, -0.421449082246074190, -0.421403739115941030, -0.421358394932298930, -0.421313049695260840, -0.421267703404940130, --0.421222356061449750, -0.421177007664903900, -0.421131658215415540, -0.421086307713097960, -0.421040956158064310, -0.420995603550428590, -0.420950249890303880, -0.420904895177803610, --0.420859539413040660, -0.420814182596129240, -0.420768824727182360, -0.420723465806313420, -0.420678105833635460, -0.420632744809262600, -0.420587382733307870, -0.420542019605884330, --0.420496655427106130, -0.420451290197086270, -0.420405923915938170, -0.420360556583774860, -0.420315188200710620, -0.420269818766858320, -0.420224448282331520, -0.420179076747243200, --0.420133704161707590, -0.420088330525837720, -0.420042955839747050, -0.419997580103548540, -0.419952203317356500, -0.419906825481284000, -0.419861446595444390, -0.419816066659950750, --0.419770685674917320, -0.419725303640457240, -0.419679920556683460, -0.419634536423710290, -0.419589151241650800, -0.419543765010618410, -0.419498377730726240, -0.419452989402088470, --0.419407600024818250, -0.419362209599029030, -0.419316818124833900, -0.419271425602347150, -0.419226032031681790, -0.419180637412951360, -0.419135241746268930, -0.419089845031748790, --0.419044447269504070, -0.418999048459648190, -0.418953648602294340, -0.418908247697556750, -0.418862845745548550, -0.418817442746383220, -0.418772038700173880, -0.418726633607034830, --0.418681227467079200, -0.418635820280420120, -0.418590412047171900, -0.418545002767447600, -0.418499592441360870, -0.418454181069024710, -0.418408768650553490, -0.418363355186060380, --0.418317940675658860, -0.418272525119462110, -0.418227108517584380, -0.418181690870138960, -0.418136272177239250, -0.418090852438998520, -0.418045431655531040, -0.418000009826949960, --0.417954586953368900, -0.417909163034900940, -0.417863738071660440, -0.417818312063760630, -0.417772885011314650, -0.417727456914436860, -0.417682027773240430, -0.417636597587838890, --0.417591166358345480, -0.417545734084874550, -0.417500300767539300, -0.417454866406453300, -0.417409431001729720, -0.417363994553482940, -0.417318557061826250, -0.417273118526873100, --0.417227678948736750, -0.417182238327531650, -0.417136796663370890, -0.417091353956368200, -0.417045910206636730, -0.417000465414290810, -0.416955019579443810, -0.416909572702208800, --0.416864124782700300, -0.416818675821031490, -0.416773225817315960, -0.416727774771666950, -0.416682322684198970, -0.416636869555025100, -0.416591415384259140, -0.416545960172014170, --0.416500503918404760, -0.416455046623544050, -0.416409588287545760, -0.416364128910523050, -0.416318668492590470, -0.416273207033861170, -0.416227744534448880, -0.416182280994466800, --0.416136816414029500, -0.416091350793250050, -0.416045884132242310, -0.416000416431119400, -0.415954947689995910, -0.415909477908984970, -0.415864007088199980, -0.415818535227755410, --0.415773062327764450, -0.415727588388340840, -0.415682113409597880, -0.415636637391650020, -0.415591160334610580, -0.415545682238593230, -0.415500203103711270, -0.415454722930079230, --0.415409241717810350, -0.415363759467018370, -0.415318276177816580, -0.415272791850319570, -0.415227306484640510, -0.415181820080893220, -0.415136332639190920, -0.415090844159648250, --0.415045354642378460, -0.414999864087494900, -0.414954372495112020, -0.414908879865343250, -0.414863386198302260, -0.414817891494102420, -0.414772395752858290, -0.414726898974683120, --0.414681401159690710, -0.414635902307994410, -0.414590402419708740, -0.414544901494947050, -0.414499399533823140, -0.414453896536450320, -0.414408392502943150, -0.414362887433415040, --0.414317381327979680, -0.414271874186750430, -0.414226366009841920, -0.414180856797367550, -0.414135346549440560, -0.414089835266175650, -0.414044322947686120, -0.413998809594085800, --0.413953295205488070, -0.413907779782007490, -0.413862263323757470, -0.413816745830851760, -0.413771227303403820, -0.413725707741528230, -0.413680187145338330, -0.413634665514947990, --0.413589142850470550, -0.413543619152020650, -0.413498094419711750, -0.413452568653657590, -0.413407041853971590, -0.413361514020768430, -0.413315985154161460, -0.413270455254264530, --0.413224924321191070, -0.413179392355055690, -0.413133859355971800, -0.413088325324052870, -0.413042790259413590, -0.412997254162167260, -0.412951717032427830, -0.412906178870308730, --0.412860639675924510, -0.412815099449388770, -0.412769558190815230, -0.412724015900317430, -0.412678472578009990, -0.412632928224006320, -0.412587382838420390, -0.412541836421365550, --0.412496288972956540, -0.412450740493306820, -0.412405190982530260, -0.412359640440740300, -0.412314088868051650, -0.412268536264577770, -0.412222982630432170, -0.412177427965729480, --0.412131872270583230, -0.412086315545107270, -0.412040757789415180, -0.411995199003621580, -0.411949639187839940, -0.411904078342184290, -0.411858516466767970, -0.411812953561705770, --0.411767389627111180, -0.411721824663098150, -0.411676258669780140, -0.411630691647271900, -0.411585123595686890, -0.411539554515139130, -0.411493984405742030, -0.411448413267610390, --0.411402841100857730, -0.411357267905597570, -0.411311693681944590, -0.411266118430012430, -0.411220542149914940, -0.411174964841765690, -0.411129386505679480, -0.411083807141769790, --0.411038226750150560, -0.410992645330935320, -0.410947062884238930, -0.410901479410174850, -0.410855894908857100, -0.410810309380399200, -0.410764722824915940, -0.410719135242520850, --0.410673546633327950, -0.410627956997450750, -0.410582366335004110, -0.410536774646101500, -0.410491181930856600, -0.410445588189384090, -0.410399993421797670, -0.410354397628211240, --0.410308800808738380, -0.410263202963493940, -0.410217604092591500, -0.410172004196145080, -0.410126403274268190, -0.410080801327075750, -0.410035198354681270, -0.409989594357198840, --0.409943989334741970, -0.409898383287425560, -0.409852776215363150, -0.409807168118668850, -0.409761558997456200, -0.409715948851840040, -0.409670337681934060, -0.409624725487852230, --0.409579112269708110, -0.409533498027616680, -0.409487882761691510, -0.409442266472046180, -0.409396649158795590, -0.409351030822053430, -0.409305411461933670, -0.409259791078549980, --0.409214169672017180, -0.409168547242449000, -0.409122923789959460, -0.409077299314662190, -0.409031673816672050, -0.408986047296102720, -0.408940419753068330, -0.408894791187682460, --0.408849161600060020, -0.408803530990314630, -0.408757899358560440, -0.408712266704911120, -0.408666633029481530, -0.408620998332385350, -0.408575362613736280, -0.408529725873649220, --0.408484088112237800, -0.408438449329616200, -0.408392809525898070, -0.408347168701198300, -0.408301526855630590, -0.408255883989309120, -0.408210240102347520, -0.408164595194860700, --0.408118949266962410, -0.408073302318766710, -0.408027654350387400, -0.407982005361939350, -0.407936355353536230, -0.407890704325292290, -0.407845052277321150, -0.407799399209737790, --0.407753745122655940, -0.407708090016189350, -0.407662433890452920, -0.407616776745560410, -0.407571118581625920, -0.407525459398763280, -0.407479799197087320, -0.407434137976711960, --0.407388475737751170, -0.407342812480318840, -0.407297148204529890, -0.407251482910498010, -0.407205816598337490, -0.407160149268161960, -0.407114480920086510, -0.407068811554224860, --0.407023141170691160, -0.406977469769599200, -0.406931797351064000, -0.406886123915199290, -0.406840449462119280, -0.406794773991937700, -0.406749097504769620, -0.406703420000728790, --0.406657741479929000, -0.406612061942485280, -0.406566381388511420, -0.406520699818121560, -0.406475017231429590, -0.406429333628550440, -0.406383649009598000, -0.406337963374686420, --0.406292276723929480, -0.406246589057442320, -0.406200900375338620, -0.406155210677732750, -0.406109519964738430, -0.406063828236470690, -0.406018135493043390, -0.405972441734570700, --0.405926746961166600, -0.405881051172945980, -0.405835354370022720, -0.405789656552510700, -0.405743957720524910, -0.405698257874179240, -0.405652557013587930, -0.405606855138864850, --0.405561152250125010, -0.405515448347482270, -0.405469743431050970, -0.405424037500944860, -0.405378330557279070, -0.405332622600167450, -0.405286913629724240, -0.405241203646063420, --0.405195492649299940, -0.405149780639547760, -0.405104067616921080, -0.405058353581533860, -0.405012638533501170, -0.404966922472936860, -0.404921205399954850, -0.404875487314670270, --0.404829768217196910, -0.404784048107649170, -0.404738326986140870, -0.404692604852787190, -0.404646881707701970, -0.404601157550999570, -0.404555432382793840, -0.404509706203199980, --0.404463979012331830, -0.404418250810303750, -0.404372521597229640, -0.404326791373224580, -0.404281060138402590, -0.404235327892877920, -0.404189594636764570, -0.404143860370177580, --0.404098125093230950, -0.404052388806038660, -0.404006651508715730, -0.403960913201376230, -0.403915173884134450, -0.403869433557104310, -0.403823692220400930, -0.403777949874138400, --0.403732206518430950, -0.403686462153392600, -0.403640716779138540, -0.403594970395782630, -0.403549223003439320, -0.403503474602222520, -0.403457725192247480, -0.403411974773628110, --0.403366223346478760, -0.403320470910913500, -0.403274717467047460, -0.403228963014994610, -0.403183207554869360, -0.403137451086785730, -0.403091693610858840, -0.403045935127202660, --0.403000175635931320, -0.402954415137159900, -0.402908653631002480, -0.402862891117573400, -0.402817127596986680, -0.402771363069357570, -0.402725597534800030, -0.402679830993428520, --0.402634063445357020, -0.402588294890700750, -0.402542525329573740, -0.402496754762090460, -0.402450983188364860, -0.402405210608512200, -0.402359437022646540, -0.402313662430882240, --0.402267886833333420, -0.402222110230115280, -0.402176332621341840, -0.402130554007127160, -0.402084774387586550, -0.402038993762833970, -0.401993212132983950, -0.401947429498150430, --0.401901645858448790, -0.401855861213992970, -0.401810075564897560, -0.401764288911276580, -0.401718501253245210, -0.401672712590917640, -0.401626922924408270, -0.401581132253831190, --0.401535340579301680, -0.401489547900933770, -0.401443754218842040, -0.401397959533140560, -0.401352163843944510, -0.401306367151368140, -0.401260569455525350, -0.401214770756531610, --0.401168971054500890, -0.401123170349547810, -0.401077368641786340, -0.401031565931331880, -0.400985762218298510, -0.400939957502800700, -0.400894151784952630, -0.400848345064869550, --0.400802537342665630, -0.400756728618455400, -0.400710918892352890, -0.400665108164473480, -0.400619296434931380, -0.400573483703840940, -0.400527669971316450, -0.400481855237473150, --0.400436039502425290, -0.400390222766287270, -0.400344405029173290, -0.400298586291198690, -0.400252766552477660, -0.400206945813124270, -0.400161124073253940, -0.400115301332980790, --0.400069477592419400, -0.400023652851683900, -0.399977827110889690, -0.399932000370150920, -0.399886172629582150, -0.399840343889297510, -0.399794514149412420, -0.399748683410041050, --0.399702851671297990, -0.399657018933297410, -0.399611185196154680, -0.399565350459983930, -0.399519514724899880, -0.399473677991016570, -0.399427840258449520, -0.399382001527312850, --0.399336161797720750, -0.399290321069788680, -0.399244479343630830, -0.399198636619361720, -0.399152792897095650, -0.399106948176948030, -0.399061102459033030, -0.399015255743465250, --0.398969408030358910, -0.398923559319829480, -0.398877709611991150, -0.398831858906958550, -0.398786007204845860, -0.398740154505768610, -0.398694300809840970, -0.398648446117177540, --0.398602590427892640, -0.398556733742101600, -0.398510876059918810, -0.398465017381458340, -0.398419157706835780, -0.398373297036165310, -0.398327435369561610, -0.398281572707138930, --0.398235709049012730, -0.398189844395297200, -0.398143978746107070, -0.398098112101556660, -0.398052244461761300, -0.398006375826835350, -0.397960506196893490, -0.397914635572049920, --0.397868763952420210, -0.397822891338118540, -0.397777017729259660, -0.397731143125957860, -0.397685267528328560, -0.397639390936486150, -0.397593513350544770, -0.397547634770620110, --0.397501755196826290, -0.397455874629278120, -0.397409993068089830, -0.397364110513377000, -0.397318226965253870, -0.397272342423835190, -0.397226456889235250, -0.397180570361569560, --0.397134682840952440, -0.397088794327498610, -0.397042904821322370, -0.396997014322539310, -0.396951122831263710, -0.396905230347610270, -0.396859336871693390, -0.396813442403628590, --0.396767546943530110, -0.396721650491512810, -0.396675753047690980, -0.396629854612180200, -0.396583955185094760, -0.396538054766549020, -0.396492153356658550, -0.396446250955537650, --0.396400347563301170, -0.396354443180063410, -0.396308537805940000, -0.396262631441045180, -0.396216724085493800, -0.396170815739400160, -0.396124906402879950, -0.396078996076047460, --0.396033084759017500, -0.395987172451904350, -0.395941259154823750, -0.395895344867889960, -0.395849429591217830, -0.395803513324921700, -0.395757596069117200, -0.395711677823918750, --0.395665758589440640, -0.395619838365798560, -0.395573917153106910, -0.395527994951480440, -0.395482071761033560, -0.395436147581881950, -0.395390222414139960, -0.395344296257922390, --0.395298369113343650, -0.395252440980519480, -0.395206511859564120, -0.395160581750592540, -0.395114650653719090, -0.395068718569059400, -0.395022785496727920, -0.394976851436839470, --0.394930916389508500, -0.394884980354850650, -0.394839043332980310, -0.394793105324012020, -0.394747166328061340, -0.394701226345242740, -0.394655285375671070, -0.394609343419460800, --0.394563400476727550, -0.394517456547585800, -0.394471511632150440, -0.394425565730535890, -0.394379618842857830, -0.394333670969230670, -0.394287722109769370, -0.394241772264588400, --0.394195821433803330, -0.394149869617528790, -0.394103916815879530, -0.394057963028970060, -0.394012008256916120, -0.393966052499832130, -0.393920095757833040, -0.393874138031033270, --0.393828179319548550, -0.393782219623493410, -0.393736258942982360, -0.393690297278130990, -0.393644334629053900, -0.393598370995866030, -0.393552406378681770, -0.393506440777616930, --0.393460474192785960, -0.393414506624303830, -0.393368538072285000, -0.393322568536845220, -0.393276598018099060, -0.393230626516161360, -0.393184654031146720, -0.393138680563170860, --0.393092706112348310, -0.393046730678793920, -0.393000754262622380, -0.392954776863949310, -0.392908798482889340, -0.392862819119556950, -0.392816838774067920, -0.392770857446536780, --0.392724875137078490, -0.392678891845807620, -0.392632907572839920, -0.392586922318289950, -0.392540936082272700, -0.392494948864902660, -0.392448960666295700, -0.392402971486566330, --0.392356981325829520, -0.392310990184199850, -0.392264998061793100, -0.392219004958723860, -0.392173010875107090, -0.392127015811057410, -0.392081019766690630, -0.392035022742121260, --0.391989024737463940, -0.391943025752834460, -0.391897025788347400, -0.391851024844117820, -0.391805022920260200, -0.391759020016890500, -0.391713016134123240, -0.391667011272073430, --0.391621005430855650, -0.391574998610585810, -0.391528990811378430, -0.391482982033348580, -0.391436972276610890, -0.391390961541281220, -0.391344949827474090, -0.391298937135304560, --0.391252923464887330, -0.391206908816338180, -0.391160893189771760, -0.391114876585302700, -0.391068859003046890, -0.391022840443118860, -0.390976820905633790, -0.390930800390706270, --0.390884778898452080, -0.390838756428986020, -0.390792732982423010, -0.390746708558877830, -0.390700683158466230, -0.390654656781302960, -0.390608629427503020, -0.390562601097181110, --0.390516571790453070, -0.390470541507433650, -0.390424510248237820, -0.390378478012980370, -0.390332444801777090, -0.390286410614742730, -0.390240375451992360, -0.390194339313640610, --0.390148302199803400, -0.390102264110595450, -0.390056225046131470, -0.390010185006527290, -0.389964143991897660, -0.389918102002357660, -0.389872059038022020, -0.389826015099006610, --0.389779970185426210, -0.389733924297395840, -0.389687877435030310, -0.389641829598445400, -0.389595780787755970, -0.389549731003077100, -0.389503680244523480, -0.389457628512211110, --0.389411575806254630, -0.389365522126769170, -0.389319467473869530, -0.389273411847671670, -0.389227355248290220, -0.389181297675840030, -0.389135239130436960, -0.389089179612195800, --0.389043119121231740, -0.388997057657659410, -0.388950995221594880, -0.388904931813152830, -0.388858867432448460, -0.388812802079596560, -0.388766735754712990, -0.388720668457912640, --0.388674600189310600, -0.388628530949021610, -0.388582460737161790, -0.388536389553845730, -0.388490317399188770, -0.388444244273305540, -0.388398170176312170, -0.388352095108323300, --0.388306019069453830, -0.388259942059819730, -0.388213864079535790, -0.388167785128717140, -0.388121705207478680, -0.388075624315936340, -0.388029542454204900, -0.387983459622399660, --0.387937375820635310, -0.387891291049027980, -0.387845205307692400, -0.387799118596743760, -0.387753030916296980, -0.387706942266468010, -0.387660852647371710, -0.387614762059123210, --0.387568670501837460, -0.387522577975630440, -0.387476484480616950, -0.387430390016912260, -0.387384294584631190, -0.387338198183889760, -0.387292100814802860, -0.387246002477485310, --0.387199903172053160, -0.387153802898621220, -0.387107701657304850, -0.387061599448218720, -0.387015496271479080, -0.386969392127200660, -0.386923287015498770, -0.386877180936488260, --0.386831073890285150, -0.386784965877004390, -0.386738856896761240, -0.386692746949670540, -0.386646636035848370, -0.386600524155409630, -0.386554411308469570, -0.386508297495143040, --0.386462182715546170, -0.386416066969793910, -0.386369950258001030, -0.386323832580283690, -0.386277713936756750, -0.386231594327535510, -0.386185473752734930, -0.386139352212471030, --0.386093229706858780, -0.386047106236013460, -0.386000981800049940, -0.385954856399084390, -0.385908730033231730, -0.385862602702607190, -0.385816474407325750, -0.385770345147503520, --0.385724214923255480, -0.385678083734696860, -0.385631951581942630, -0.385585818465108920, -0.385539684384310690, -0.385493549339662840, -0.385447413331281520, -0.385401276359281620, --0.385355138423778610, -0.385308999524887290, -0.385262859662723890, -0.385216718837403330, -0.385170577049041010, -0.385124434297751780, -0.385078290583651950, -0.385032145906856360, --0.384986000267480370, -0.384939853665638990, -0.384893706101448410, -0.384847557575023540, -0.384801408086479780, -0.384755257635932100, -0.384709106223496690, -0.384662953849288500, --0.384616800513422510, -0.384570646216014940, -0.384524490957180780, -0.384478334737035350, -0.384432177555693700, -0.384386019413272000, -0.384339860309885260, -0.384293700245648910, --0.384247539220677840, -0.384201377235088350, -0.384155214288995410, -0.384109050382514470, -0.384062885515760450, -0.384016719688849650, -0.383970552901897020, -0.383924385155018030, --0.383878216448327700, -0.383832046781942220, -0.383785876155976590, -0.383739704570546290, -0.383693532025766340, -0.383647358521752910, -0.383601184058621150, -0.383555008636486010, --0.383508832255463730, -0.383462654915669390, -0.383416476617218390, -0.383370297360225820, -0.383324117144807910, -0.383277935971079680, -0.383231753839156640, -0.383185570749153770, --0.383139386701187410, -0.383093201695372590, -0.383047015731824760, -0.383000828810658940, -0.382954640931991550, -0.382908452095937490, -0.382862262302612280, -0.382816071552131040, --0.382769879844610030, -0.382723687180164360, -0.382677493558909010, -0.382631298980960320, -0.382585103446433430, -0.382538906955443790, -0.382492709508106430, -0.382446511104537700, --0.382400311744852730, -0.382354111429166980, -0.382307910157595520, -0.382261707930254710, -0.382215504747259630, -0.382169300608725780, -0.382123095514768250, -0.382076889465503390, --0.382030682461046320, -0.381984474501512570, -0.381938265587017210, -0.381892055717676590, -0.381845844893605850, -0.381799633114920050, -0.381753420381735600, -0.381707206694167580, --0.381660992052331560, -0.381614776456342670, -0.381568559906317220, -0.381522342402370370, -0.381476123944617720, -0.381429904533174270, -0.381383684168156490, -0.381337462849679560, --0.381291240577858900, -0.381245017352809750, -0.381198793174648500, -0.381152568043490240, -0.381106341959450530, -0.381060114922644580, -0.381013886933188770, -0.380967657991198250, --0.380921428096788530, -0.380875197250074900, -0.380828965451173620, -0.380782732700199970, -0.380736498997269080, -0.380690264342497360, -0.380644028735999950, -0.380597792177892470, --0.380551554668290100, -0.380505316207309260, -0.380459076795065130, -0.380412836431673340, -0.380366595117249020, -0.380320352851908570, -0.380274109635767300, -0.380227865468940770, --0.380181620351544130, -0.380135374283693870, -0.380089127265505140, -0.380042879297093630, -0.379996630378574510, -0.379950380510064190, -0.379904129691677970, -0.379857877923530980, --0.379811625205739690, -0.379765371538419380, -0.379719116921685640, -0.379672861355653650, -0.379626604840439970, -0.379580347376159750, -0.379534088962928670, -0.379487829600861970, --0.379441569290076050, -0.379395308030686270, -0.379349045822808210, -0.379302782666557090, -0.379256518562049450, -0.379210253509400520, -0.379163987508725930, -0.379117720560140980, --0.379071452663762130, -0.379025183819704680, -0.378978914028083810, -0.378932643289016100, -0.378886371602616790, -0.378840098969001560, -0.378793825388285600, -0.378747550860585540, --0.378701275386016610, -0.378654998964694510, -0.378608721596734420, -0.378562443282253020, -0.378516164021365450, -0.378469883814187500, -0.378423602660834470, -0.378377320561422810, --0.378331037516067840, -0.378284753524885280, -0.378238468587990430, -0.378192182705499810, -0.378145895877528730, -0.378099608104192520, -0.378053319385607660, -0.378007029721889540, --0.377960739113153870, -0.377914447559515860, -0.377868155061092230, -0.377821861617998130, -0.377775567230349440, -0.377729271898261390, -0.377682975621850600, -0.377636678401232330, --0.377590380236522420, -0.377544081127836110, -0.377497781075290030, -0.377451480078999480, -0.377405178139080200, -0.377358875255647600, -0.377312571428818240, -0.377266266658707440, --0.377219960945430920, -0.377173654289104150, -0.377127346689843660, -0.377081038147764720, -0.377034728662982880, -0.376988418235614580, -0.376942106865775230, -0.376895794553580630, --0.376849481299146080, -0.376803167102588320, -0.376756851964022590, -0.376710535883564730, -0.376664218861330170, -0.376617900897435410, -0.376571581991995920, -0.376525262145127490, --0.376478941356945480, -0.376432619627566520, -0.376386296957106070, -0.376339973345679810, -0.376293648793403210, -0.376247323300392960, -0.376200996866764340, -0.376154669492632820, --0.376108341178115040, -0.376062011923326440, -0.376015681728382790, -0.375969350593399530, -0.375923018518493300, -0.375876685503779510, -0.375830351549374050, -0.375784016655392240, --0.375737680821950860, -0.375691344049165210, -0.375645006337151250, -0.375598667686024350, -0.375552328095901220, -0.375505987566897240, -0.375459646099128300, -0.375413303692709810, --0.375366960347758460, -0.375320616064389770, -0.375274270842719080, -0.375227924682863150, -0.375181577584937420, -0.375135229549057700, -0.375088880575339570, -0.375042530663899590, --0.374996179814853280, -0.374949828028316560, -0.374903475304404820, -0.374857121643234810, -0.374810767044922000, -0.374764411509582280, -0.374718055037331130, -0.374671697628285230, --0.374625339282560090, -0.374578980000271620, -0.374532619781535290, -0.374486258626467780, -0.374439896535184670, -0.374393533507801800, -0.374347169544434700, -0.374300804645200100, --0.374254438810213470, -0.374208072039590280, -0.374161704333447360, -0.374115335691900200, -0.374068966115064680, -0.374022595603056400, -0.373976224155991970, -0.373929851773986970, --0.373883478457157360, -0.373837104205618660, -0.373790729019487620, -0.373744352898879690, -0.373697975843910960, -0.373651597854696820, -0.373605218931354120, -0.373558839073998390, --0.373512458282745540, -0.373466076557711140, -0.373419693899011970, -0.373373310306763570, -0.373326925781081450, -0.373280540322082470, -0.373234153929882070, -0.373187766604596350, --0.373141378346340760, -0.373094989155232200, -0.373048599031386100, -0.373002207974918510, -0.372955815985945020, -0.372909423064582410, -0.372863029210946220, -0.372816634425152450, --0.372770238707316680, -0.372723842057555770, -0.372677444475985160, -0.372631045962721010, -0.372584646517878810, -0.372538246141575440, -0.372491844833926440, -0.372445442595047420, --0.372399039425055200, -0.372352635324065370, -0.372306230292193950, -0.372259824329556570, -0.372213417436270010, -0.372167009612449920, -0.372120600858212300, -0.372074191173672800, --0.372027780558948200, -0.371981369014154130, -0.371934956539406670, -0.371888543134821390, -0.371842128800515200, -0.371795713536603620, -0.371749297343202830, -0.371702880220428360, --0.371656462168397090, -0.371610043187224680, -0.371563623277026740, -0.371517202437920140, -0.371470780670020540, -0.371424357973443970, -0.371377934348306130, -0.371331509794723850, --0.371285084312812820, -0.371238657902689060, -0.371192230564468260, -0.371145802298267270, -0.371099373104201770, -0.371052942982387890, -0.371006511932941150, -0.370960079955978630, --0.370913647051615890, -0.370867213219969020, -0.370820778461153690, -0.370774342775286810, -0.370727906162484130, -0.370681468622861670, -0.370635030156535090, -0.370588590763621380, --0.370542150444236160, -0.370495709198495170, -0.370449267026515370, -0.370402823928412340, -0.370356379904302260, -0.370309934954300810, -0.370263489078524970, -0.370217042277090400, --0.370170594550113200, -0.370124145897709140, -0.370077696319995100, -0.370031245817086800, -0.369984794389100420, -0.369938342036151610, -0.369891888758357380, -0.369845434555833410, --0.369798979428695880, -0.369752523377060490, -0.369706066401044200, -0.369659608500762740, -0.369613149676331850, -0.369566689927868450, -0.369520229255488390, -0.369473767659307730, --0.369427305139442270, -0.369380841696008930, -0.369334377329123500, -0.369287912038902100, -0.369241445825460530, -0.369194978688915710, -0.369148510629383530, -0.369102041646980020, --0.369055571741820960, -0.369009100914023450, -0.368962629163703150, -0.368916156490976310, -0.368869682895958670, -0.368823208378767200, -0.368776732939517680, -0.368730256578325980, --0.368683779295309040, -0.368637301090582630, -0.368590821964262960, -0.368544341916465850, -0.368497860947308300, -0.368451379056906060, -0.368404896245375420, -0.368358412512832130, --0.368311927859393150, -0.368265442285174440, -0.368218955790292070, -0.368172468374861890, -0.368125980039000990, -0.368079490782825090, -0.368033000606450500, -0.367986509509993010, --0.367940017493569640, -0.367893524557296240, -0.367847030701288990, -0.367800535925663810, -0.367754040230537650, -0.367707543616026420, -0.367661046082245920, -0.367614547629313170, --0.367568048257344130, -0.367521547966454920, -0.367475046756761400, -0.367428544628380700, -0.367382041581428680, -0.367335537616021500, -0.367289032732275090, -0.367242526930306510, --0.367196020210231620, -0.367149512572166660, -0.367103004016227530, -0.367056494542531310, -0.367009984151193790, -0.366963472842331380, -0.366916960616059830, -0.366870447472496310, --0.366823933411756680, -0.366777418433956840, -0.366730902539213810, -0.366684385727643500, -0.366637867999362270, -0.366591349354485950, -0.366544829793131690, -0.366498309315415330, --0.366451787921453220, -0.366405265611361220, -0.366358742385256450, -0.366312218243254830, -0.366265693185472640, -0.366219167212025850, -0.366172640323031540, -0.366126112518605610, --0.366079583798864410, -0.366033054163923840, -0.365986523613901050, -0.365939992148911990, -0.365893459769072500, -0.365846926474499730, -0.365800392265309690, -0.365753857141618680, --0.365707321103542590, -0.365660784151198630, -0.365614246284702680, -0.365567707504171170, -0.365521167809719940, -0.365474627201466230, -0.365428085679525890, -0.365381543244015390, --0.365334999895050580, -0.365288455632748750, -0.365241910457225700, -0.365195364368597950, -0.365148817366981350, -0.365102269452493080, -0.365055720625249160, -0.365009170885365550, --0.364962620232959390, -0.364916068668146690, -0.364869516191043850, -0.364822962801766790, -0.364776408500432690, -0.364729853287157620, -0.364683297162057940, -0.364636740125249550, --0.364590182176849740, -0.364543623316974490, -0.364497063545740130, -0.364450502863262750, -0.364403941269659530, -0.364357378765046420, -0.364310815349539910, -0.364264251023255880, --0.364217685786311700, -0.364171119638823260, -0.364124552580907090, -0.364077984612679040, -0.364031415734256510, -0.363984845945755420, -0.363938275247291780, -0.363891703638982880, --0.363845131120944740, -0.363798557693293720, -0.363751983356145950, -0.363705408109618600, -0.363658831953827750, -0.363612254888889820, -0.363565676914920810, -0.363519098032038020, --0.363472518240357530, -0.363425937539995750, -0.363379355931068680, -0.363332773413693630, -0.363286189987986620, -0.363239605654064210, -0.363193020412042320, -0.363146434262038300, --0.363099847204168210, -0.363053259238548090, -0.363006670365295210, -0.362960080584525670, -0.362913489896355910, -0.362866898300902020, -0.362820305798281340, -0.362773712388609840, --0.362727118072004080, -0.362680522848580100, -0.362633926718455290, -0.362587329681745560, -0.362540731738567600, -0.362494132889037370, -0.362447533133272160, -0.362400932471388220, --0.362354330903501890, -0.362307728429729300, -0.362261125050187820, -0.362214520764993550, -0.362167915574262530, -0.362121309478112160, -0.362074702476658520, -0.362028094570018110, --0.361981485758307080, -0.361934876041642710, -0.361888265420141130, -0.361841653893918920, -0.361795041463092160, -0.361748428127778240, -0.361701813888093250, -0.361655198744153690, --0.361608582696075710, -0.361561965743976700, -0.361515347887972790, -0.361468729128180510, -0.361422109464715980, -0.361375488897696610, -0.361328867427238460, -0.361282245053458180, --0.361235621776471890, -0.361188997596396940, -0.361142372513349520, -0.361095746527445750, -0.361049119638803040, -0.361002491847537470, -0.360955863153765710, -0.360909233557603900, --0.360862603059169400, -0.360815971658578370, -0.360769339355947460, -0.360722706151392740, -0.360676072045031660, -0.360629437036980470, -0.360582801127355630, -0.360536164316273390, --0.360489526603851140, -0.360442887990205070, -0.360396248475451820, -0.360349608059707500, -0.360302966743089590, -0.360256324525714270, -0.360209681407697710, -0.360163037389157340, --0.360116392470209430, -0.360069746650970470, -0.360023099931556790, -0.359976452312085750, -0.359929803792673590, -0.359883154373436930, -0.359836504054491910, -0.359789852835956100, --0.359743200717945690, -0.359696547700577180, -0.359649893783966950, -0.359603238968232430, -0.359556583253489770, -0.359509926639855650, -0.359463269127446310, -0.359416610716379200, --0.359369951406770580, -0.359323291198736630, -0.359276630092394910, -0.359229968087861620, -0.359183305185253380, -0.359136641384686430, -0.359089976686278340, -0.359043311090145310, --0.358996644596404010, -0.358949977205170630, -0.358903308916562800, -0.358856639730696650, -0.358809969647688910, -0.358763298667655830, -0.358716626790714920, -0.358669954016982430, --0.358623280346575090, -0.358576605779609090, -0.358529930316202010, -0.358483253956470130, -0.358436576700530090, -0.358389898548498180, -0.358343219500491970, -0.358296539556627660, --0.358249858717021640, -0.358203176981791380, -0.358156494351053180, -0.358109810824923710, -0.358063126403519340, -0.358016441086957520, -0.357969754875354650, -0.357923067768827370, --0.357876379767491980, -0.357829690871466100, -0.357783001080865970, -0.357736310395808330, -0.357689618816409540, -0.357642926342787050, -0.357596232975057330, -0.357549538713336950, --0.357502843557742370, -0.357456147508391050, -0.357409450565399360, -0.357362752728883630, -0.357316053998961490, -0.357269354375749140, -0.357222653859363470, -0.357175952449920680, --0.357129250147538490, -0.357082546952333160, -0.357035842864421420, -0.356989137883919730, -0.356942432010945550, -0.356895725245615300, -0.356849017588045770, -0.356802309038353250, --0.356755599596655370, -0.356708889263068480, -0.356662178037709390, -0.356615465920694430, -0.356568752912141240, -0.356522039012166170, -0.356475324220885570, -0.356428608538417070, --0.356381891964877070, -0.356335174500382320, -0.356288456145049230, -0.356241736898995410, -0.356195016762337280, -0.356148295735191580, -0.356101573817674710, -0.356054851009904310, --0.356008127311996820, -0.355961402724069010, -0.355914677246237270, -0.355867950878619220, -0.355821223621331340, -0.355774495474490420, -0.355727766438212800, -0.355681036512616180, --0.355634305697816950, -0.355587573993931590, -0.355540841401077670, -0.355494107919371690, -0.355447373548930410, -0.355400638289870290, -0.355353902142309000, -0.355307165106362950, --0.355260427182148950, -0.355213688369783510, -0.355166948669384250, -0.355120208081067650, -0.355073466604950480, -0.355026724241149230, -0.354979980989781620, -0.354933236850964010, --0.354886491824813350, -0.354839745911446070, -0.354792999110979780, -0.354746251423531000, -0.354699502849216640, -0.354652753388153050, -0.354606003040458030, -0.354559251806247980, --0.354512499685639420, -0.354465746678749970, -0.354418992785696220, -0.354372238006594950, -0.354325482341562690, -0.354278725790717120, -0.354231968354174700, -0.354185210032052440, --0.354138450824466710, -0.354091690731535240, -0.354044929753374540, -0.353998167890101520, -0.353951405141832710, -0.353904641508685780, -0.353857876990777250, -0.353811111588223980, --0.353764345301142590, -0.353717578129650710, -0.353670810073864860, -0.353624041133901610, -0.353577271309878700, -0.353530500601912550, -0.353483729010120210, -0.353436956534618040, --0.353390183175523950, -0.353343408932954410, -0.353296633807026360, -0.353249857797856280, -0.353203080905562020, -0.353156303130259970, -0.353109524472067230, -0.353062744931100240, --0.353015964507476800, -0.352969183201313490, -0.352922401012727200, -0.352875617941834470, -0.352828833988753140, -0.352782049153599670, -0.352735263436490700, -0.352688476837544010, --0.352641689356876120, -0.352594900994604000, -0.352548111750844160, -0.352501321625714510, -0.352454530619331570, -0.352407738731812250, -0.352360945963273220, -0.352314152313832230, --0.352267357783605850, -0.352220562372711040, -0.352173766081264440, -0.352126968909383890, -0.352080170857185850, -0.352033371924787400, -0.351986572112305110, -0.351939771419856830, --0.351892969847559080, -0.351846167395528930, -0.351799364063882900, -0.351752559852738960, -0.351705754762213550, -0.351658948792423380, -0.351612141943486220, -0.351565334215518720, --0.351518525608637890, -0.351471716122960350, -0.351424905758603910, -0.351378094515685190, -0.351331282394321260, -0.351284469394628710, -0.351237655516725370, -0.351190840760727930, --0.351144025126753360, -0.351097208614918330, -0.351050391225340710, -0.351003572958137060, -0.350956753813424500, -0.350909933791319680, -0.350863112891940390, -0.350816291115403360, --0.350769468461825160, -0.350722644931323710, -0.350675820524015640, -0.350628995240018000, -0.350582169079447500, -0.350535342042421980, -0.350488514129058070, -0.350441685339472950, --0.350394855673783150, -0.350348025132106610, -0.350301193714560030, -0.350254361421260480, -0.350207528252324600, -0.350160694207870330, -0.350113859288014310, -0.350067023492873610, --0.350020186822564970, -0.349973349277206250, -0.349926510856914170, -0.349879671561805440, -0.349832831391997890, -0.349785990347608320, -0.349739148428753750, -0.349692305635550870, --0.349645461968117630, -0.349598617426570780, -0.349551772011027380, -0.349504925721604130, -0.349458078558418930, -0.349411230521588620, -0.349364381611230180, -0.349317531827460390, --0.349270681170397170, -0.349223829640157250, -0.349176977236857760, -0.349130123960615430, -0.349083269811548190, -0.349036414789772760, -0.348989558895405890, -0.348942702128565540, --0.348895844489368450, -0.348848985977931740, -0.348802126594372150, -0.348755266338807660, -0.348708405211354990, -0.348661543212131280, -0.348614680341253370, -0.348567816598839120, --0.348520951985005320, -0.348474086499869160, -0.348427220143547380, -0.348380352916157990, -0.348333484817817670, -0.348286615848643680, -0.348239746008752680, -0.348192875298262760, --0.348146003717290650, -0.348099131265953540, -0.348052257944368170, -0.348005383752652610, -0.347958508690923540, -0.347911632759297820, -0.347864755957893400, -0.347817878286827140, --0.347770999746216170, -0.347724120336177220, -0.347677240056828430, -0.347630358908286590, -0.347583476890668760, -0.347536594004091870, -0.347489710248673920, -0.347442825624531710, --0.347395940131782380, -0.347349053770542810, -0.347302166540931050, -0.347255278443063860, -0.347208389477058450, -0.347161499643031670, -0.347114608941101580, -0.347067717371384920, --0.347020824933998550, -0.346973931629060540, -0.346927037456687740, -0.346880142416997330, -0.346833246510106110, -0.346786349736132260, -0.346739452095192470, -0.346692553587404080, --0.346645654212883900, -0.346598753971750000, -0.346551852864119160, -0.346504950890108740, -0.346458048049835540, -0.346411144343417580, -0.346364239770971800, -0.346317334332615410, --0.346270428028465300, -0.346223520858639500, -0.346176612823254900, -0.346129703922428370, -0.346082794156277960, -0.346035883524920600, -0.345988972028473510, -0.345942059667053600, --0.345895146440778960, -0.345848232349766420, -0.345801317394133280, -0.345754401573996510, -0.345707484889474060, -0.345660567340682960, -0.345613648927740440, -0.345566729650763350, --0.345519809509869880, -0.345472888505176880, -0.345425966636801640, -0.345379043904861130, -0.345332120309473360, -0.345285195850755290, -0.345238270528824280, -0.345191344343797110, --0.345144417295792040, -0.345097489384925960, -0.345050560611315670, -0.345003630975079410, -0.344956700476334090, -0.344909769115197050, -0.344862836891785150, -0.344815903806216520, --0.344768969858608220, -0.344722035049077450, -0.344675099377741160, -0.344628162844717530, -0.344581225450123540, -0.344534287194076470, -0.344487348076693230, -0.344440408098092070, --0.344393467258389870, -0.344346525557704060, -0.344299582996151430, -0.344252639573850330, -0.344205695290917600, -0.344158750147470220, -0.344111804143626410, -0.344064857279503030, --0.344017909555217550, -0.343970960970886860, -0.343924011526629210, -0.343877061222561510, -0.343830110058801150, -0.343783158035465160, -0.343736205152671610, -0.343689251410537580, --0.343642296809180460, -0.343595341348717110, -0.343548385029265880, -0.343501427850943670, -0.343454469813867850, -0.343407510918155520, -0.343360551163924780, -0.343313590551292620, --0.343266629080376140, -0.343219666751293510, -0.343172703564161630, -0.343125739519098080, -0.343078774616219720, -0.343031808855644830, -0.342984842237490430, -0.342937874761873930, --0.342890906428912350, -0.342843937238723860, -0.342796967191425610, -0.342749996287134870, -0.342703024525968740, -0.342656051908045490, -0.342609078433482090, -0.342562104102396010, --0.342515128914904270, -0.342468152871125090, -0.342421175971175500, -0.342374198215172620, -0.342327219603234590, -0.342280240135478590, -0.342233259812021960, -0.342186278632981730, --0.342139296598476250, -0.342092313708622530, -0.342045329963538040, -0.341998345363339780, -0.341951359908146070, -0.341904373598073960, -0.341857386433240930, -0.341810398413764040, --0.341763409539761530, -0.341716419811350540, -0.341669429228648460, -0.341622437791772370, -0.341575445500840680, -0.341528452355970290, -0.341481458357278830, -0.341434463504883270, --0.341387467798902000, -0.341340471239452050, -0.341293473826650540, -0.341246475560615710, -0.341199476441464700, -0.341152476469315010, -0.341105475644283730, -0.341058473966489140, --0.341011471436048370, -0.340964468053078950, -0.340917463817697940, -0.340870458730023640, -0.340823452790173230, -0.340776445998264180, -0.340729438354413610, -0.340682429858739870, --0.340635420511360030, -0.340588410312391680, -0.340541399261951820, -0.340494387360158910, -0.340447374607130040, -0.340400361002982320, -0.340353346547834110, -0.340306331241802540, --0.340259315085005120, -0.340212298077559040, -0.340165280219582590, -0.340118261511192950, -0.340071241952507650, -0.340024221543643870, -0.339977200284719890, -0.339930178175852970, --0.339883155217160560, -0.339836131408759850, -0.339789106750769230, -0.339742081243305850, -0.339695054886487270, -0.339648027680430680, -0.339600999625254360, -0.339553970721075570, --0.339506940968011480, -0.339459910366180400, -0.339412878915699550, -0.339365846616686510, -0.339318813469258460, -0.339271779473533760, -0.339224744629629590, -0.339177708937663640, --0.339130672397752910, -0.339083635010015980, -0.339036596774569930, -0.338989557691532440, -0.338942517761020580, -0.338895476983152870, -0.338848435358046430, -0.338801392885818950, --0.338754349566587560, -0.338707305400470730, -0.338660260387585570, -0.338613214528049820, -0.338566167821980570, -0.338519120269496380, -0.338472071870714320, -0.338425022625751750, --0.338377972534726960, -0.338330921597757290, -0.338283869814960280, -0.338236817186453210, -0.338189763712354490, -0.338142709392781350, -0.338095654227851480, -0.338048598217682020, --0.338001541362391470, -0.337954483662097130, -0.337907425116916520, -0.337860365726966980, -0.337813305492366880, -0.337766244413233550, -0.337719182489684630, -0.337672119721837300, --0.337625056109810140, -0.337577991653720270, -0.337530926353685030, -0.337483860209822910, -0.337436793222251170, -0.337389725391087360, -0.337342656716448920, -0.337295587198454150, --0.337248516837220510, -0.337201445632865530, -0.337154373585506480, -0.337107300695261960, -0.337060226962249190, -0.337013152386585860, -0.336966076968389210, -0.336919000707777800, --0.336871923604868890, -0.336824845659780160, -0.336777766872628890, -0.336730687243533670, -0.336683606772611670, -0.336636525459980240, -0.336589443305757960, -0.336542360310062020, --0.336495276473010250, -0.336448191794719800, -0.336401106275309340, -0.336354019914896050, -0.336306932713597790, -0.336259844671531750, -0.336212755788816490, -0.336165666065569360, --0.336118575501908050, -0.336071484097949900, -0.336024391853813440, -0.335977298769616020, -0.335930204845475370, -0.335883110081508730, -0.335836014477834790, -0.335788918034570780, --0.335741820751834120, -0.335694722629743260, -0.335647623668415610, -0.335600523867968900, -0.335553423228520440, -0.335506321750188910, -0.335459219433091540, -0.335412116277346070, --0.335365012283069970, -0.335317907450381700, -0.335270801779398660, -0.335223695270238650, -0.335176587923018960, -0.335129479737858280, -0.335082370714873850, -0.335035260854183500, --0.334988150155904550, -0.334941038620155670, -0.334893926247054220, -0.334846813036717930, -0.334799698989264150, -0.334752584104811570, -0.334705468383477530, -0.334658351825379450, --0.334611234430635840, -0.334564116199364160, -0.334516997131682200, -0.334469877227707320, -0.334422756487558200, -0.334375634911352190, -0.334328512499207030, -0.334281389251240240, --0.334234265167570320, -0.334187140248314810, -0.334140014493591430, -0.334092887903517600, -0.334045760478211940, -0.333998632217791860, -0.333951503122375260, -0.333904373192079440, --0.333857242427023140, -0.333810110827323700, -0.333762978393098600, -0.333715845124466450, -0.333668711021544660, -0.333621576084451140, -0.333574440313303240, -0.333527303708219700, --0.333480166269317870, -0.333433027996715590, -0.333385888890530340, -0.333338748950880780, -0.333291608177884390, -0.333244466571658960, -0.333197324132321950, -0.333150180859992040, --0.333103036754786640, -0.333055891816823710, -0.333008746046220610, -0.332961599443096060, -0.332914452007567530, -0.332867303739752430, -0.332820154639769440, -0.332773004707736130, --0.332725853943770300, -0.332678702347989410, -0.332631549920512190, -0.332584396661456120, -0.332537242570938970, -0.332490087649078390, -0.332442931895992940, -0.332395775311800200, --0.332348617896618010, -0.332301459650563900, -0.332254300573756490, -0.332207140666313410, -0.332159979928352390, -0.332112818359991070, -0.332065655961348070, -0.332018492732540970, --0.331971328673687620, -0.331924163784905520, -0.331876998066313430, -0.331829831518028860, -0.331782664140169270, -0.331735495932853510, -0.331688326896198930, -0.331641157030323540, --0.331593986335344870, -0.331546814811381650, -0.331499642458551400, -0.331452469276972030, -0.331405295266761050, -0.331358120428037250, -0.331310944760918210, -0.331263768265521730, --0.331216590941965480, -0.331169412790368100, -0.331122233810847270, -0.331075054003520770, -0.331027873368506310, -0.330980691905922500, -0.330933509615887020, -0.330886326498517290, --0.330839142553932210, -0.330791957782249240, -0.330744772183586390, -0.330697585758061240, -0.330650398505792480, -0.330603210426897720, -0.330556021521494990, -0.330508831789701750, --0.330461641231636850, -0.330414449847417860, -0.330367257637162740, -0.330320064600989060, -0.330272870739015620, -0.330225676051360000, -0.330178480538140200, -0.330131284199473800, --0.330084087035479590, -0.330036889046275150, -0.329989690231978110, -0.329942490592707250, -0.329895290128580150, -0.329848088839714840, -0.329800886726228870, -0.329753683788241100, --0.329706480025869110, -0.329659275439230960, -0.329612070028444170, -0.329564863793627650, -0.329517656734898970, -0.329470448852376090, -0.329423240146176740, -0.329376030616419680, --0.329328820263222520, -0.329281609086703340, -0.329234397086979710, -0.329187184264170540, -0.329139970618393400, -0.329092756149765850, -0.329045540858406930, -0.328998324744434080, --0.328951107807965440, -0.328903890049118630, -0.328856671468012450, -0.328809452064764640, -0.328762231839493210, -0.328715010792315800, -0.328667788923351250, -0.328620566232717180, --0.328573342720531790, -0.328526118386912540, -0.328478893231978490, -0.328431667255847160, -0.328384440458636680, -0.328337212840464630, -0.328289984401450020, -0.328242755141710420, --0.328195525061363960, -0.328148294160528260, -0.328101062439322240, -0.328053829897863580, -0.328006596536269900, -0.327959362354660170, -0.327912127353152010, -0.327864891531863540, --0.327817654890912470, -0.327770417430417630, -0.327723179150496760, -0.327675940051267930, -0.327628700132848840, -0.327581459395358430, -0.327534217838914340, -0.327486975463634760, --0.327439732269637240, -0.327392488257040870, -0.327345243425963270, -0.327297997776522580, -0.327250751308836460, -0.327203504023023840, -0.327156255919202500, -0.327109006997490130, --0.327061757258005630, -0.327014506700866740, -0.326967255326191530, -0.326920003134097860, -0.326872750124704510, -0.326825496298129350, -0.326778241654490430, -0.326730986193905500, --0.326683729916493470, -0.326636472822372180, -0.326589214911659650, -0.326541956184473740, -0.326494696640933280, -0.326447436281156130, -0.326400175105260370, -0.326352913113363790, --0.326305650305585280, -0.326258386682042660, -0.326211122242853700, -0.326163856988137320, -0.326116590918011320, -0.326069324032593810, -0.326022056332002600, -0.325974787816356640, --0.325927518485773730, -0.325880248340371990, -0.325832977380269280, -0.325785705605584510, -0.325738433016435460, -0.325691159612940320, -0.325643885395216880, -0.325596610363384160, --0.325549334517559910, -0.325502057857862290, -0.325454780384409170, -0.325407502097319450, -0.325360222996711020, -0.325312943082702030, -0.325265662355410210, -0.325218380814954740, --0.325171098461453260, -0.325123815295023600, -0.325076531315784840, -0.325029246523854790, -0.324981960919351610, -0.324934674502393050, -0.324887387273098290, -0.324840099231585020, --0.324792810377971530, -0.324745520712375610, -0.324698230234916290, -0.324650938945711340, -0.324603646844879130, -0.324556353932537340, -0.324509060208805100, -0.324461765673800200, --0.324414470327640870, -0.324367174170444970, -0.324319877202331520, -0.324272579423418420, -0.324225280833823400, -0.324177981433665660, -0.324130681223062930, -0.324083380202133510, --0.324036078370995180, -0.323988775729767140, -0.323941472278567120, -0.323894168017513420, -0.323846862946723880, -0.323799557066317630, -0.323752250376412480, -0.323704942877126700, --0.323657634568578100, -0.323610325450885860, -0.323563015524167830, -0.323515704788542250, -0.323468393244127020, -0.323421080891041160, -0.323373767729402630, -0.323326453759329280, --0.323279138980940180, -0.323231823394353250, -0.323184506999686760, -0.323137189797058580, -0.323089871786587880, -0.323042552968392460, -0.322995233342590670, -0.322947912909300360, --0.322900591668640710, -0.322853269620729580, -0.322805946765685250, -0.322758623103625690, -0.322711298634669960, -0.322663973358935980, -0.322616647276542050, -0.322569320387606110, --0.322521992692247240, -0.322474664190583460, -0.322427334882732560, -0.322380004768813730, -0.322332673848944930, -0.322285342123244390, -0.322238009591830130, -0.322190676254821230, --0.322143342112335640, -0.322096007164491720, -0.322048671411407360, -0.322001334853201760, -0.321953997489992760, -0.321906659321898820, -0.321859320349037800, -0.321811980571528880, --0.321764639989490010, -0.321717298603039550, -0.321669956412295450, -0.321622613417376860, -0.321575269618401720, -0.321527925015488440, -0.321480579608754870, -0.321433233398320310, --0.321385886384302650, -0.321338538566819880, -0.321291189945991150, -0.321243840521934500, -0.321196490294768210, -0.321149139264610250, -0.321101787431579910, -0.321054434795795100, --0.321007081357374160, -0.320959727116435110, -0.320912372073097200, -0.320865016227478320, -0.320817659579696930, -0.320770302129870950, -0.320722943878119670, -0.320675584824560990, --0.320628224969313370, -0.320580864312494720, -0.320533502854224380, -0.320486140594620270, -0.320438777533800400, -0.320391413671884010, -0.320344049008989050, -0.320296683545234000, --0.320249317280736800, -0.320201950215616700, -0.320154582349991780, -0.320107213683980370, -0.320059844217700560, -0.320012473951271530, -0.319965102884811280, -0.319917731018438290, --0.319870358352270570, -0.319822984886427350, -0.319775610621026720, -0.319728235556187010, -0.319680859692026310, -0.319633483028663900, -0.319586105566217750, -0.319538727304805930, --0.319491348244547720, -0.319443968385561110, -0.319396587727964590, -0.319349206271876180, -0.319301824017415190, -0.319254440964699630, -0.319207057113848000, -0.319159672464978280, --0.319112287018209760, -0.319064900773660560, -0.319017513731449150, -0.318970125891693490, -0.318922737254512920, -0.318875347820025520, -0.318827957588349810, -0.318780566559603680, --0.318733174733906610, -0.318685782111376600, -0.318638388692132180, -0.318590994476291300, -0.318543599463973370, -0.318496203655296460, -0.318448807050378590, -0.318401409649339160, --0.318354011452296190, -0.318306612459368200, -0.318259212670673250, -0.318211812086330700, -0.318164410706458620, -0.318117008531175470, -0.318069605560599430, -0.318022201794849800, --0.317974797234044650, -0.317927391878302490, -0.317879985727741400, -0.317832578782480830, -0.317785171042638810, -0.317737762508333800, -0.317690353179684030, -0.317642943056808790, --0.317595532139826160, -0.317548120428854270, -0.317500707924012530, -0.317453294625419050, -0.317405880533192300, -0.317358465647450410, -0.317311049968312770, -0.317263633495897530, --0.317216216230323260, -0.317168798171707960, -0.317121379320171090, -0.317073959675830800, -0.317026539238805580, -0.316979118009213580, -0.316931695987174240, -0.316884273172805650, --0.316836849566226380, -0.316789425167554590, -0.316741999976909610, -0.316694573994409640, -0.316647147220172840, -0.316599719654318600, -0.316552291296964990, -0.316504862148230700, --0.316457432208233860, -0.316410001477093860, -0.316362569954928790, -0.316315137641857370, -0.316267704537997630, -0.316220270643469080, -0.316172835958389850, -0.316125400482878520, --0.316077964217053250, -0.316030527161033530, -0.315983089314937520, -0.315935650678883740, -0.315888211252990380, -0.315840771037376960, -0.315793330032161590, -0.315745888237462520, --0.315698445653399110, -0.315651002280089580, -0.315603558117652560, -0.315556113166206240, -0.315508667425870030, -0.315461220896762150, -0.315413773579001240, -0.315366325472705430, --0.315318876577994290, -0.315271426894985940, -0.315223976423799010, -0.315176525164551690, -0.315129073117363550, -0.315081620282352650, -0.315034166659637740, -0.314986712249337000, --0.314939257051569890, -0.314891801066454650, -0.314844344294109900, -0.314796886734653840, -0.314749428388206020, -0.314701969254884640, -0.314654509334807870, -0.314607048628095300, --0.314559587134865040, -0.314512124855235890, -0.314464661789325920, -0.314417197937254810, -0.314369733299140640, -0.314322267875102150, -0.314274801665257560, -0.314227334669726410, --0.314179866888626920, -0.314132398322077790, -0.314084928970197190, -0.314037458833104740, -0.313989987910918590, -0.313942516203757520, -0.313895043711739710, -0.313847570434984680, --0.313800096373610780, -0.313752621527736200, -0.313705145897480500, -0.313657669482961920, -0.313610192284299150, -0.313562714301610480, -0.313515235535015480, -0.313467755984632390, --0.313420275650579890, -0.313372794532976280, -0.313325312631941080, -0.313277829947592680, -0.313230346480049600, -0.313182862229430310, -0.313135377195854270, -0.313087891379439760, --0.313040404780305540, -0.312992917398569880, -0.312945429234352370, -0.312897940287771290, -0.312850450558944890, -0.312802960047992800, -0.312755468755033350, -0.312707976680185180, --0.312660483823566700, -0.312612990185297370, -0.312565495765495640, -0.312518000564280090, -0.312470504581769170, -0.312423007818082410, -0.312375510273338100, -0.312328011947655030, --0.312280512841151490, -0.312233012953947120, -0.312185512286160200, -0.312138010837909540, -0.312090508609313370, -0.312043005600491360, -0.311995501811561880, -0.311947997242643600, --0.311900491893854940, -0.311852985765315450, -0.311805478857143490, -0.311757971169457470, -0.311710462702376900, -0.311662953456020130, -0.311615443430506070, -0.311567932625952890, --0.311520421042480340, -0.311472908680206720, -0.311425395539250860, -0.311377881619731070, -0.311330366921767020, -0.311282851445477020, -0.311235335190979900, -0.311187818158394030, --0.311140300347839020, -0.311092781759433280, -0.311045262393295610, -0.310997742249544300, -0.310950221328299080, -0.310902699629678310, -0.310855177153800400, -0.310807653900784910, --0.310760129870750360, -0.310712605063815430, -0.310665079480098580, -0.310617553119719450, -0.310570025982796430, -0.310522498069448370, -0.310474969379793630, -0.310427439913951890, --0.310379909672041540, -0.310332378654181400, -0.310284846860489900, -0.310237314291086750, -0.310189780946090290, -0.310142246825619360, -0.310094711929792380, -0.310047176258729070, --0.309999639812547800, -0.309952102591367070, -0.309904564595306460, -0.309857025824484430, -0.309809486279019830, -0.309761945959031120, -0.309714404864637920, -0.309666862995958750, --0.309619320353112400, -0.309571776936217350, -0.309524232745393260, -0.309476687780758600, -0.309429142042432210, -0.309381595530532570, -0.309334048245179350, -0.309286500186491010, --0.309238951354586400, -0.309191401749584040, -0.309143851371603550, -0.309096300220763450, -0.309048748297182150, -0.309001195600979440, -0.308953642132273720, -0.308906087891183900, --0.308858532877828440, -0.308810977092327080, -0.308763420534798270, -0.308715863205360870, -0.308668305104133460, -0.308620746231235640, -0.308573186586786010, -0.308525626170903400, --0.308478064983706280, -0.308430503025314440, -0.308382940295846340, -0.308335376795420890, -0.308287812524156550, -0.308240247482173100, -0.308192681669589070, -0.308145115086523310, --0.308097547733094390, -0.308049979609421990, -0.308002410715624620, -0.307954841051820800, -0.307907270618130340, -0.307859699414671670, -0.307812127441563780, -0.307764554698925110, --0.307716981186875460, -0.307669406905533400, -0.307621831855017850, -0.307574256035447250, -0.307526679446941450, -0.307479102089618930, -0.307431523963598690, -0.307383945068999190, --0.307336365405940280, -0.307288784974540430, -0.307241203774918650, -0.307193621807193400, -0.307146039071484520, -0.307098455567910540, -0.307050871296590030, -0.307003286257642730, --0.306955700451187250, -0.306908113877342510, -0.306860526536227030, -0.306812938427960700, -0.306765349552661990, -0.306717759910449920, -0.306670169501443050, -0.306622578325761120, --0.306574986383522820, -0.306527393674846990, -0.306479800199852270, -0.306432205958658500, -0.306384610951384200, -0.306337015178148380, -0.306289418639069560, -0.306241821334267640, --0.306194223263861200, -0.306146624427968750, -0.306099024826710140, -0.306051424460204000, -0.306003823328569290, -0.305956221431924640, -0.305908618770389770, -0.305861015344083440, --0.305813411153124490, -0.305765806197631660, -0.305718200477724690, -0.305670593993522250, -0.305622986745143320, -0.305575378732706520, -0.305527769956331630, -0.305480160416137400, --0.305432550112242680, -0.305384939044766210, -0.305337327213827840, -0.305289714619546130, -0.305242101262040100, -0.305194487141428440, -0.305146872257830990, -0.305099256611366330, --0.305051640202153080, -0.305004023030311210, -0.304956405095959280, -0.304908786399216310, -0.304861166940200930, -0.304813546719033100, -0.304765925735831390, -0.304718303990714870, --0.304670681483802160, -0.304623058215213180, -0.304575434185066500, -0.304527809393481290, -0.304480183840576120, -0.304432557526470910, -0.304384930451284340, -0.304337302615135420, --0.304289674018142780, -0.304242044660426430, -0.304194414542104940, -0.304146783663297000, -0.304099152024122580, -0.304051519624700230, -0.304003886465149030, -0.303956252545587780, --0.303908617866136270, -0.303860982426913230, -0.303813346228037740, -0.303765709269628430, -0.303718071551805300, -0.303670433074687000, -0.303622793838392580, -0.303575153843040790, --0.303527513088751530, -0.303479871575643490, -0.303432229303835730, -0.303384586273447000, -0.303336942484597250, -0.303289297937405110, -0.303241652631989320, -0.303194006568469840, --0.303146359746965300, -0.303098712167594870, -0.303051063830477310, -0.303003414735732450, -0.302955764883479030, -0.302908114273836240, -0.302860462906922700, -0.302812810782858490, --0.302765157901762230, -0.302717504263753050, -0.302669849868949680, -0.302622194717472150, -0.302574538809439080, -0.302526882144969700, -0.302479224724182700, -0.302431566547198050, --0.302383907614134470, -0.302336247925111160, -0.302288587480246780, -0.302240926279661310, -0.302193264323473600, -0.302145601611802260, -0.302097938144767380, -0.302050273922487620, --0.302002608945082180, -0.301954943212669800, -0.301907276725370490, -0.301859609483302980, -0.301811941486586470, -0.301764272735339620, -0.301716603229682580, -0.301668932969734020, --0.301621261955613120, -0.301573590187438620, -0.301525917665330550, -0.301478244389407730, -0.301430570359789320, -0.301382895576594030, -0.301335220039941900, -0.301287543749951760, --0.301239866706742300, -0.301192188910433640, -0.301144510361144480, -0.301096831058994040, -0.301049151004101120, -0.301001470196585740, -0.300953788636566690, -0.300906106324163150, --0.300858423259493910, -0.300810739442679050, -0.300763054873837370, -0.300715369553088030, -0.300667683480549840, -0.300619996656342870, -0.300572309080585910, -0.300524620753398140, --0.300476931674898470, -0.300429241845206860, -0.300381551264442100, -0.300333859932723100, -0.300286167850169870, -0.300238475016901150, -0.300190781433036350, -0.300143087098694080, --0.300095392013994540, -0.300047696179056580, -0.299999999593999310, -0.299952302258941650, -0.299904604174003660, -0.299856905339304150, -0.299809205754962340, -0.299761505421097140, --0.299713804337828570, -0.299666102505275530, -0.299618399923557210, -0.299570696592792450, -0.299522992513101380, -0.299475287684602850, -0.299427582107415660, -0.299379875781659980, --0.299332168707454550, -0.299284460884918720, -0.299236752314171350, -0.299189042995332440, -0.299141332928521020, -0.299093622113856210, -0.299045910551456910, -0.298998198241443300, --0.298950485183934190, -0.298902771379048800, -0.298855056826906160, -0.298807341527626220, -0.298759625481327950, -0.298711908688130630, -0.298664191148153120, -0.298616472861515550, --0.298568753828336810, -0.298521034048736140, -0.298473313522832520, -0.298425592250746000, -0.298377870232595490, -0.298330147468499900, -0.298282423958579400, -0.298234699702952800, --0.298186974701739440, -0.298139248955058220, -0.298091522463029330, -0.298043795225771620, -0.297996067243404440, -0.297948338516046630, -0.297900609043818430, -0.297852878826838700, --0.297805147865226770, -0.297757416159101560, -0.297709683708583190, -0.297661950513790690, -0.297614216574843220, -0.297566481891859860, -0.297518746464960680, -0.297471010294264650, --0.297423273379890660, -0.297375535721958910, -0.297327797320588340, -0.297280058175898250, -0.297232318288007610, -0.297184577657036600, -0.297136836283104110, -0.297089094166329560, --0.297041351306831850, -0.296993607704731210, -0.296945863360146500, -0.296898118273197180, -0.296850372444002090, -0.296802625872681520, -0.296754878559354400, -0.296707130504140050, --0.296659381707157500, -0.296611632168526870, -0.296563881888367190, -0.296516130866797340, -0.296468379103937640, -0.296420626599906980, -0.296372873354824710, -0.296325119368809900, --0.296277364641982680, -0.296229609174462060, -0.296181852966367400, -0.296134096017817650, -0.296086338328933160, -0.296038579899832790, -0.295990820730635980, -0.295943060821461660, --0.295895300172430150, -0.295847538783660380, -0.295799776655271740, -0.295752013787383250, -0.295704250180115150, -0.295656485833586450, -0.295608720747916500, -0.295560954923224370, --0.295513188359630200, -0.295465421057253150, -0.295417653016212030, -0.295369884236627240, -0.295322114718617800, -0.295274344462303000, -0.295226573467801960, -0.295178801735234860, --0.295131029264720790, -0.295083256056379140, -0.295035482110328930, -0.294987707426690450, -0.294939932005582660, -0.294892155847125080, -0.294844378951436670, -0.294796601318637720, --0.294748822948847300, -0.294701043842184820, -0.294653263998769290, -0.294605483418721060, -0.294557702102159090, -0.294509920049202400, -0.294462137259971390, -0.294414353734585020, --0.294366569473162810, -0.294318784475823710, -0.294270998742688080, -0.294223212273874930, -0.294175425069503780, -0.294127637129693640, -0.294079848454564810, -0.294032059044236350, --0.293984268898827780, -0.293936478018458070, -0.293888686403247670, -0.293840894053315480, -0.293793100968781080, -0.293745307149763490, -0.293697512596383050, -0.293649717308758880, --0.293601921287009960, -0.293554124531256620, -0.293506327041618050, -0.293458528818213600, -0.293410729861162460, -0.293362930170584850, -0.293315129746599960, -0.293267328589327250, --0.293219526698885740, -0.293171724075395880, -0.293123920718976750, -0.293076116629747750, -0.293028311807828070, -0.292980506253337990, -0.292932699966396700, -0.292884892947123670, --0.292837085195637950, -0.292789276712059900, -0.292741467496508700, -0.292693657549103430, -0.292645846869964420, -0.292598035459210810, -0.292550223316962070, -0.292502410443337360, --0.292454596838457090, -0.292406782502440290, -0.292358967435406570, -0.292311151637474950, -0.292263335108765900, -0.292215517849398530, -0.292167699859492370, -0.292119881139166480, --0.292072061688541380, -0.292024241507736090, -0.291976420596870180, -0.291928598956062820, -0.291880776585434430, -0.291832953485104020, -0.291785129655191270, -0.291737305095815250, --0.291689479807096420, -0.291641653789153850, -0.291593827042106790, -0.291545999566075520, -0.291498171361179280, -0.291450342427537590, -0.291402512765269630, -0.291354682374495800, --0.291306851255335290, -0.291259019407907660, -0.291211186832332050, -0.291163353528728910, -0.291115519497217310, -0.291067684737917000, -0.291019849250947040, -0.290972013036427830, --0.290924176094478630, -0.290876338425218980, -0.290828500028768030, -0.290780660905246290, -0.290732821054772880, -0.290684980477467050, -0.290637139173449130, -0.290589297142838380, --0.290541454385754410, -0.290493610902316350, -0.290445766692644660, -0.290397921756858580, -0.290350076095077740, -0.290302229707421260, -0.290254382594009600, -0.290206534754962000, --0.290158686190398090, -0.290110836900436990, -0.290062986885199270, -0.290015136144804060, -0.289967284679371000, -0.289919432489019300, -0.289871579573869440, -0.289823725934040650, --0.289775871569652120, -0.289728016480824360, -0.289680160667676550, -0.289632304130328310, -0.289584446868898890, -0.289536588883508810, -0.289488730174277230, -0.289440870741323850, --0.289393010584767800, -0.289345149704729740, -0.289297288101328760, -0.289249425774684540, -0.289201562724916370, -0.289153698952144710, -0.289105834456488800, -0.289057969238068260, --0.289010103297002440, -0.288962236633411750, -0.288914369247415480, -0.288866501139133260, -0.288818632308684380, -0.288770762756189350, -0.288722892481767410, -0.288675021485537810, --0.288627149767621110, -0.288579277328136540, -0.288531404167203740, -0.288483530284942000, -0.288435655681471890, -0.288387780356912590, -0.288339904311383900, -0.288292027545004990, --0.288244150057896440, -0.288196271850177540, -0.288148392921967920, -0.288100513273386930, -0.288052632904555070, -0.288004751815591600, -0.287956870006616290, -0.287908987477748350, --0.287861104229108380, -0.287813220260815680, -0.287765335572989440, -0.287717450165750340, -0.287669564039217620, -0.287621677193510950, -0.287573789628749690, -0.287525901345054350, --0.287478012342544280, -0.287430122621339160, -0.287382232181558340, -0.287334341023322340, -0.287286449146750500, -0.287238556551962560, -0.287190663239077770, -0.287142769208216740, --0.287094874459498830, -0.287046978993043660, -0.286999082808970680, -0.286951185907400430, -0.286903288288452190, -0.286855389952245300, -0.286807490898900340, -0.286759591128536660, --0.286711690641274000, -0.286663789437231750, -0.286615887516530390, -0.286567984879289310, -0.286520081525628300, -0.286472177455666670, -0.286424272669524970, -0.286376367167322620, --0.286328460949179350, -0.286280554015214520, -0.286232646365548680, -0.286184738000301250, -0.286136828919592020, -0.286088919123540230, -0.286041008612266610, -0.285993097385890460, --0.285945185444531120, -0.285897272788309230, -0.285849359417344180, -0.285801445331755780, -0.285753530531663300, -0.285705615017187390, -0.285657698788447490, -0.285609781845563290, --0.285561864188654260, -0.285513945817840950, -0.285466026733242840, -0.285418106934979600, -0.285370186423170690, -0.285322265197936740, -0.285274343259397160, -0.285226420607671670, --0.285178497242879690, -0.285130573165141950, -0.285082648374577750, -0.285034722871306930, -0.284986796655448900, -0.284938869727124290, -0.284890942086452490, -0.284843013733552920, --0.284795084668546250, -0.284747154891551830, -0.284699224402689580, -0.284651293202078830, -0.284603361289840210, -0.284555428666093240, -0.284507495330957700, -0.284459561284553020, --0.284411626526999810, -0.284363691058417580, -0.284315754878926070, -0.284267817988644760, -0.284219880387694360, -0.284171942076194230, -0.284124003054264270, -0.284076063322023900, --0.284028122879593730, -0.283980181727093330, -0.283932239864642000, -0.283884297292360480, -0.283836354010368270, -0.283788410018785130, -0.283740465317730560, -0.283692519907325250, --0.283644573787688650, -0.283596626958940610, -0.283548679421200540, -0.283500731174589240, -0.283452782219226100, -0.283404832555231020, -0.283356882182723420, -0.283308931101824040, --0.283260979312652320, -0.283213026815328170, -0.283165073609971010, -0.283117119696701610, -0.283069165075639400, -0.283021209746903870, -0.282973253710615710, -0.282925296966894450, --0.282877339515859920, -0.282829381357631640, -0.282781422492330290, -0.282733462920075450, -0.282685502640986910, -0.282637541655184180, -0.282589579962788050, -0.282541617563917940, --0.282493654458693790, -0.282445690647235070, -0.282397726129662570, -0.282349760906095760, -0.282301794976654590, -0.282253828341458400, -0.282205861000628170, -0.282157892954283230, --0.282109924202543550, -0.282061954745528640, -0.282013984583359300, -0.281966013716154980, -0.281918042144035210, -0.281870069867120760, -0.281822096885531110, -0.281774123199386270, --0.281726148808805640, -0.281678173713910070, -0.281630197914819080, -0.281582221411652620, -0.281534244204530160, -0.281486266293572480, -0.281438287678899170, -0.281390308360630170, --0.281342328338884950, -0.281294347613784300, -0.281246366185447790, -0.281198384053995390, -0.281150401219546600, -0.281102417682222220, -0.281054433442141820, -0.281006448499424910, --0.280958462854192290, -0.280910476506563530, -0.280862489456658540, -0.280814501704596930, -0.280766513250499450, -0.280718524094485720, -0.280670534236675710, -0.280622543677188920, --0.280574552416146210, -0.280526560453667080, -0.280478567789871570, -0.280430574424879180, -0.280382580358810810, -0.280334585591785980, -0.280286590123924710, -0.280238593955346560, --0.280190597086172280, -0.280142599516521540, -0.280094601246513920, -0.280046602276270150, -0.279998602605909920, -0.279950602235553180, -0.279902601165319450, -0.279854599395329700, --0.279806596925703480, -0.279758593756560700, -0.279710589888021060, -0.279662585320205330, -0.279614580053233200, -0.279566574087224570, -0.279518567422299080, -0.279470560058577620, --0.279422551996179710, -0.279374543235225480, -0.279326533775834440, -0.279278523618127490, -0.279230512762224210, -0.279182501208244280, -0.279134488956308490, -0.279086476006536470, --0.279038462359048280, -0.278990448013963500, -0.278942432971403030, -0.278894417231486450, -0.278846400794333870, -0.278798383660064820, -0.278750365828800250, -0.278702347300659790, --0.278654328075763400, -0.278606308154230820, -0.278558287536182890, -0.278510266221739240, -0.278462244211019890, -0.278414221504144580, -0.278366198101234090, -0.278318174002408100, --0.278270149207786700, -0.278222123717489440, -0.278174097531637350, -0.278126070650350050, -0.278078043073747120, -0.278030014801949440, -0.277981985835076830, -0.277933956173249170, --0.277885925816586220, -0.277837894765208930, -0.277789863019236860, -0.277741830578790090, -0.277693797443988370, -0.277645763614952580, -0.277597729091802410, -0.277549693874657890, --0.277501657963638680, -0.277453621358865750, -0.277405584060458840, -0.277357546068537910, -0.277309507383222690, -0.277261468004634140, -0.277213427932891940, -0.277165387168115670, --0.277117345710426450, -0.277069303559943800, -0.277021260716787950, -0.276973217181078480, -0.276925172952936390, -0.276877128032481380, -0.276829082419833560, -0.276781036115112620, --0.276732989118439470, -0.276684941429933880, -0.276636893049715950, -0.276588843977905340, -0.276540794214623020, -0.276492743759988780, -0.276444692614122630, -0.276396640777144320, --0.276348588249174850, -0.276300535030333920, -0.276252481120741190, -0.276204426520517740, -0.276156371229783150, -0.276108315248657700, -0.276060258577261020, -0.276012201215714130, --0.275964143164136700, -0.275916084422648920, -0.275868024991370530, -0.275819964870422480, -0.275771904059924520, -0.275723842559996820, -0.275675780370759070, -0.275627717492332280, --0.275579653924836190, -0.275531589668391030, -0.275483524723116380, -0.275435459089133420, -0.275387392766561770, -0.275339325755521670, -0.275291258056132800, -0.275243189668516240, --0.275195120592791660, -0.275147050829078920, -0.275098980377498910, -0.275050909238171490, -0.275002837411216780, -0.274954764896754580, -0.274906691694905890, -0.274858617805790460, --0.274810543229528470, -0.274762467966239710, -0.274714392016045190, -0.274666315379064720, -0.274618238055418410, -0.274570160045226110, -0.274522081348608840, -0.274474001965686390, --0.274425921896578880, -0.274377841141406180, -0.274329759700289330, -0.274281677573348040, -0.274233594760702140, -0.274185511262472650, -0.274137427078779420, -0.274089342209742630, --0.274041256655482010, -0.273993170416118700, -0.273945083491772490, -0.273896995882563500, -0.273848907588611690, -0.273800818610037970, -0.273752728946962230, -0.273704638599504670, --0.273656547567785070, -0.273608455851924500, -0.273560363452042820, -0.273512270368260260, -0.273464176600696550, -0.273416082149472880, -0.273367987014708990, -0.273319891196524670, --0.273271794695041090, -0.273223697510378010, -0.273175599642655640, -0.273127501091993910, -0.273079401858513810, -0.273031301942335210, -0.272983201343578400, -0.272935100062363100, --0.272886998098810510, -0.272838895453040410, -0.272790792125173100, -0.272742688115328370, -0.272694583423627350, -0.272646478050189880, -0.272598371995136150, -0.272550265258586110, --0.272502157840660840, -0.272454049741480190, -0.272405940961163940, -0.272357831499833340, -0.272309721357608110, -0.272261610534608570, -0.272213499030954600, -0.272165386846767280, --0.272117273982166510, -0.272069160437272580, -0.272021046212205300, -0.271972931307085830, -0.271924815722034030, -0.271876699457170190, -0.271828582512614160, -0.271780464888487120, --0.271732346584908910, -0.271684227601999840, -0.271636107939879800, -0.271587987598669870, -0.271539866578490000, -0.271491744879460480, -0.271443622501701120, -0.271395499445333140, --0.271347375710476460, -0.271299251297250850, -0.271251126205777630, -0.271203000436176510, -0.271154873988567910, -0.271106746863071730, -0.271058619059809050, -0.271010490578899870, --0.270962361420464480, -0.270914231584622690, -0.270866101071495780, -0.270817969881203660, -0.270769838013866560, -0.270721705469604450, -0.270673572248538550, -0.270625438350788670, --0.270577303776475210, -0.270529168525718070, -0.270481032598638430, -0.270432895995356190, -0.270384758715991270, -0.270336620760664950, -0.270288482129497020, -0.270240342822607890, --0.270192202840117470, -0.270144062182147040, -0.270095920848816400, -0.270047778840245940, -0.269999636156555640, -0.269951492797866620, -0.269903348764298940, -0.269855204055972850, --0.269807058673008360, -0.269758912615526590, -0.269710765883647560, -0.269662618477491680, -0.269614470397178730, -0.269566321642830060, -0.269518172214565640, -0.269470022112505310, --0.269421871336770370, -0.269373719887480770, -0.269325567764756800, -0.269277414968718540, -0.269229261499487170, -0.269181107357182650, -0.269132952541925370, -0.269084797053835260, --0.269036640893033590, -0.268988484059640260, -0.268940326553775810, -0.268892168375560070, -0.268844009525114340, -0.268795850002558620, -0.268747689808013220, -0.268699528941598210, --0.268651367403434760, -0.268603205193642950, -0.268555042312343120, -0.268506878759655230, -0.268458714535700580, -0.268410549640599130, -0.268362384074470880, -0.268314217837437140, --0.268266050929617810, -0.268217883351133330, -0.268169715102103800, -0.268121546182650330, -0.268073376592893040, -0.268025206332952290, -0.267977035402948090, -0.267928863803001740, --0.267880691533233240, -0.267832518593763000, -0.267784344984711040, -0.267736170706198650, -0.267687995758345790, -0.267639820141273020, -0.267591643855100200, -0.267543466899948730, --0.267495289275938570, -0.267447110983189800, -0.267398932021823690, -0.267350752391960210, -0.267302572093719830, -0.267254391127222660, -0.267206209492589890, -0.267158027189941580, --0.267109844219398260, -0.267061660581079830, -0.267013476275107740, -0.266965291301601960, -0.266917105660682890, -0.266868919352470700, -0.266820732377086590, -0.266772544734650670, --0.266724356425283360, -0.266676167449104770, -0.266627977806236200, -0.266579787496797670, -0.266531596520909190, -0.266483404878692210, -0.266435212570266700, -0.266387019595753170, --0.266338825955271640, -0.266290631648943510, -0.266242436676888740, -0.266194241039227950, -0.266146044736081060, -0.266097847767569510, -0.266049650133813380, -0.266001451834933070, --0.265953252871048760, -0.265905053242281700, -0.265856852948752000, -0.265808651990580180, -0.265760450367886310, -0.265712248080791750, -0.265664045129416600, -0.265615841513880850, --0.265567637234305930, -0.265519432290811930, -0.265471226683519360, -0.265423020412548280, -0.265374813478020110, -0.265326605880054860, -0.265278397618773140, -0.265230188694294990, --0.265181979106741740, -0.265133768856233630, -0.265085557942891010, -0.265037346366834130, -0.264989134128184310, -0.264940921227061640, -0.264892707663586640, -0.264844493437879470, --0.264796278550061490, -0.264748063000252830, -0.264699846788574000, -0.264651629915145130, -0.264603412380087550, -0.264555194183521520, -0.264506975325567050, -0.264458755806345590, --0.264410535625977220, -0.264362314784582500, -0.264314093282281560, -0.264265871119195860, -0.264217648295445470, -0.264169424811150910, -0.264121200666432410, -0.264072975861411320, --0.264024750396207820, -0.263976524270942370, -0.263928297485735260, -0.263880070040707790, -0.263831841935980140, -0.263783613171672930, -0.263735383747906230, -0.263687153664801500, --0.263638922922478870, -0.263590691521058520, -0.263542459460661900, -0.263494226741409100, -0.263445993363420730, -0.263397759326816970, -0.263349524631719180, -0.263301289278247640, --0.263253053266522870, -0.263204816596665000, -0.263156579268795540, -0.263108341283034670, -0.263060102639502910, -0.263011863338320440, -0.262963623379608770, -0.262915382763488080, --0.262867141490078890, -0.262818899559501440, -0.262770656971877130, -0.262722413727326190, -0.262674169825968810, -0.262625925267926390, -0.262577680053319220, -0.262529434182267820, --0.262481187654892370, -0.262432940471314440, -0.262384692631654150, -0.262336444136032080, -0.262288194984568510, -0.262239945177384860, -0.262191694714601350, -0.262143443596338620, --0.262095191822716840, -0.262046939393857540, -0.261998686309880880, -0.261950432570907500, -0.261902178177057580, -0.261853923128452680, -0.261805667425212940, -0.261757411067459090, --0.261709154055311200, -0.261660896388890900, -0.261612638068318360, -0.261564379093713770, -0.261516119465198700, -0.261467859182893340, -0.261419598246918290, -0.261371336657393820, --0.261323074414441470, -0.261274811518181440, -0.261226547968734350, -0.261178283766220430, -0.261130018910761260, -0.261081753402477080, -0.261033487241488500, -0.260985220427915720, --0.260936952961880350, -0.260888684843502640, -0.260840416072903150, -0.260792146650202230, -0.260743876575521390, -0.260695605848980830, -0.260647334470700820, -0.260599062440802940, --0.260550789759407380, -0.260502516426634800, -0.260454242442605570, -0.260405967807441130, -0.260357692521261790, -0.260309416584188210, -0.260261139996340650, -0.260212862757840670, --0.260164584868808560, -0.260116306329364940, -0.260068027139630180, -0.260019747299725710, -0.259971466809771960, -0.259923185669889480, -0.259874903880198630, -0.259826621440820920, --0.259778338351876690, -0.259730054613486190, -0.259681770225770990, -0.259633485188851320, -0.259585199502847970, -0.259536913167881190, -0.259488626184072530, -0.259440338551542300, --0.259392050270411290, -0.259343761340799670, -0.259295471762829080, -0.259247181536619850, -0.259198890662292620, -0.259150599139967740, -0.259102306969766830, -0.259054014151810120, --0.259005720686218350, -0.258957426573111880, -0.258909131812612270, -0.258860836404839870, -0.258812540349914910, -0.258764243647959020, -0.258715946299092500, -0.258667648303436190, --0.258619349661110280, -0.258571050372236430, -0.258522750436934960, -0.258474449855326580, -0.258426148627531660, -0.258377846753671810, -0.258329544233867390, -0.258281241068239080, --0.258232937256907210, -0.258184632799993430, -0.258136327697618070, -0.258088021949901940, -0.258039715556965250, -0.257991408518929770, -0.257943100835915710, -0.257894792508043920, --0.257846483535434710, -0.257798173918209750, -0.257749863656489330, -0.257701552750393860, -0.257653241200044900, -0.257604929005562810, -0.257556616167068430, -0.257508302684682110, --0.257459988558525420, -0.257411673788718760, -0.257363358375382930, -0.257315042318638280, -0.257266725618606470, -0.257218408275407820, -0.257170090289163160, -0.257121771659992840, --0.257073452388018540, -0.257025132473360560, -0.256976811916139800, -0.256928490716476550, -0.256880168874492500, -0.256831846390308040, -0.256783523264043520, -0.256735199495820690, --0.256686875085759770, -0.256638550033981730, -0.256590224340606850, -0.256541898005756830, -0.256493571029552060, -0.256445243412113390, -0.256396915153561170, -0.256348586254017130, --0.256300256713601570, -0.256251926532435390, -0.256203595710638940, -0.256155264248333960, -0.256106932145640840, -0.256058599402680330, -0.256010266019572940, -0.255961931996440300, --0.255913597333402850, -0.255865262030580910, -0.255816926088096310, -0.255768589506069400, -0.255720252284620970, -0.255671914423871490, -0.255623575923942690, -0.255575236784954920, --0.255526897007029070, -0.255478556590285510, -0.255430215534846070, -0.255381873840831000, -0.255333531508361300, -0.255285188537557330, -0.255236844928540820, -0.255188500681432170, --0.255140155796352300, -0.255091810273421650, -0.255043464112761850, -0.254995117314493370, -0.254946769878737160, -0.254898421805613560, -0.254850073095244320, -0.254801723747749900, --0.254753373763250750, -0.254705023141868600, -0.254656671883723930, -0.254608319988937510, -0.254559967457629930, -0.254511614289922810, -0.254463260485936650, -0.254414906045792370, --0.254366550969610360, -0.254318195257512420, -0.254269838909619020, -0.254221481926050990, -0.254173124306928840, -0.254124766052374330, -0.254076407162507840, -0.254028047637450400, --0.253979687477322410, -0.253931326682245610, -0.253882965252340440, -0.253834603187727490, -0.253786240488528440, -0.253737877154863790, -0.253689513186854450, -0.253641148584620950, --0.253592783348284940, -0.253544417477966970, -0.253496050973788020, -0.253447683835868460, -0.253399316064330140, -0.253350947659293500, -0.253302578620879510, -0.253254208949208640, --0.253205838644402710, -0.253157467706582150, -0.253109096135867910, -0.253060723932380550, -0.253012351096241760, -0.252963977627572110, -0.252915603526492060, -0.252867228793123460, --0.252818853427586810, -0.252770477430002970, -0.252722100800492570, -0.252673723539177330, -0.252625345646177780, -0.252576967121614810, -0.252528587965609060, -0.252480208178282260, --0.252431827759754920, -0.252383446710148010, -0.252335065029582030, -0.252286682718178890, -0.252238299776058990, -0.252189916203343360, -0.252141532000152490, -0.252093147166608240, --0.252044761702831130, -0.251996375608941670, -0.251947988885061700, -0.251899601531311750, -0.251851213547812810, -0.251802824934685370, -0.251754435692051360, -0.251706045820031200, --0.251657655318745950, -0.251609264188316140, -0.251560872428863600, -0.251512480040508910, -0.251464087023372970, -0.251415693377576410, -0.251367299103241020, -0.251318904200487410, --0.251270508669436510, -0.251222112510208930, -0.251173715722926520, -0.251125318307709790, -0.251076920264679760, -0.251028521593957000, -0.250980122295663410, -0.250931722369919450, --0.250883321816845810, -0.250834920636564260, -0.250786518829195390, -0.250738116394860270, -0.250689713333679400, -0.250641309645774690, -0.250592905331266710, -0.250544500390276480, --0.250496094822924560, -0.250447688629332810, -0.250399281809621840, -0.250350874363912680, -0.250302466292325890, -0.250254057594983370, -0.250205648272005750, -0.250157238323513940, --0.250108827749628670, -0.250060416550471680, -0.250012004726163690, -0.249963592276825300, -0.249915179202578300, -0.249866765503543390, -0.249818351179841550, -0.249769936231593410, --0.249721520658920840, -0.249673104461944490, -0.249624687640785350, -0.249576270195564110, -0.249527852126402580, -0.249479433433421440, -0.249431014116741710, -0.249382594176484010, --0.249334173612770270, -0.249285752425721100, -0.249237330615457530, -0.249188908182100210, -0.249140485125771060, -0.249092061446590680, -0.249043637144679720, -0.248995212220160110, --0.248946786673152450, -0.248898360503777840, -0.248849933712156880, -0.248801506298411550, -0.248753078262662440, -0.248704649605030610, -0.248656220325636750, -0.248607790424602760, --0.248559359902049300, -0.248510928758097440, -0.248462496992867820, -0.248414064606482410, -0.248365631599061800, -0.248317197970727150, -0.248268763721599060, -0.248220328851799480, --0.248171893361449100, -0.248123457250668980, -0.248075020519579780, -0.248026583168303450, -0.247978145196960680, -0.247929706605672100, -0.247881267394559710, -0.247832827563744110, --0.247784387113346470, -0.247735946043487420, -0.247687504354288960, -0.247639062045871720, -0.247590619118356840, -0.247542175571864950, -0.247493731406518090, -0.247445286622436870, --0.247396841219742450, -0.247348395198555500, -0.247299948558997980, -0.247251501301190580, -0.247203053425254450, -0.247154604931310250, -0.247106155819479980, -0.247057706089884280, --0.247009255742643930, -0.246960804777880850, -0.246912353195715750, -0.246863900996269790, -0.246815448179663640, -0.246766994746019290, -0.246718540695457460, -0.246670086028099260, --0.246621630744065430, -0.246573174843477960, -0.246524718326457560, -0.246476261193125350, -0.246427803443602040, -0.246379345078009680, -0.246330886096468940, -0.246282426499101010, --0.246233966286026560, -0.246185505457367640, -0.246137044013244930, -0.246088581953779200, -0.246040119279092450, -0.245991655989305390, -0.245943192084539190, -0.245894727564914590, --0.245846262430553600, -0.245797796681576950, -0.245749330318105810, -0.245700863340260920, -0.245652395748164280, -0.245603927541936660, -0.245555458721699230, -0.245506989287572720, --0.245458519239679180, -0.245410048578139330, -0.245361577303074340, -0.245313105414605020, -0.245264632912853330, -0.245216159797940060, -0.245167686069986400, -0.245119211729113110, --0.245070736775442190, -0.245022261209094460, -0.244973785030190630, -0.244925308238852750, -0.244876830835201620, -0.244828352819358410, -0.244779874191443900, -0.244731394951580110, --0.244682915099887850, -0.244634434636488320, -0.244585953561502230, -0.244537471875051700, -0.244488989577257510, -0.244440506668240850, -0.244392023148122470, -0.244343539017024460, --0.244295054275067620, -0.244246568922373150, -0.244198082959061810, -0.244149596385255680, -0.244101109201075580, -0.244052621406642300, -0.244004133002077850, -0.243955643987503110, --0.243907154363039220, -0.243858664128807050, -0.243810173284928630, -0.243761681831524770, -0.243713189768716730, -0.243664697096625250, -0.243616203815372500, -0.243567709925079200, --0.243519215425866660, -0.243470720317855630, -0.243422224601168250, -0.243373728275925270, -0.243325231342248010, -0.243276733800257220, -0.243228235650075040, -0.243179736891822260, --0.243131237525619710, -0.243082737551589490, -0.243034236969852440, -0.242985735780529790, -0.242937233983742370, -0.242888731579612300, -0.242840228568260370, -0.242791724949807910, --0.242743220724375680, -0.242694715892085850, -0.242646210453059230, -0.242597704407417070, -0.242549197755280220, -0.242500690496770810, -0.242452182632009680, -0.242403674161118100, --0.242355165084216890, -0.242306655401428210, -0.242258145112872860, -0.242209634218671750, -0.242161122718946960, -0.242112610613819390, -0.242064097903410270, -0.242015584587840500, --0.241967070667232190, -0.241918556141706180, -0.241870041011383820, -0.241821525276385900, -0.241773008936834590, -0.241724491992850790, -0.241675974444555740, -0.241627456292070300, --0.241578937535516680, -0.241530418175015720, -0.241481898210688720, -0.241433377642656520, -0.241384856471041300, -0.241336334695963970, -0.241287812317545790, -0.241239289335907630, --0.241190765751171710, -0.241142241563458870, -0.241093716772889960, -0.241045191379587210, -0.240996665383671510, -0.240948138785264110, -0.240899611584485950, -0.240851083781459200, --0.240802555376304710, -0.240754026369143860, -0.240705496760097500, -0.240656966549287840, -0.240608435736835740, -0.240559904322862560, -0.240511372307489200, -0.240462839690837840, --0.240414306473029390, -0.240365772654185160, -0.240317238234426050, -0.240268703213874310, -0.240220167592650800, -0.240171631370876440, -0.240123094548673420, -0.240074557126162660, --0.240026019103465520, -0.239977480480702910, -0.239928941257997020, -0.239880401435468770, -0.239831861013239530, -0.239783319991430180, -0.239734778370162990, -0.239686236149558860, --0.239637693329739110, -0.239589149910824720, -0.239540605892937880, -0.239492061276199510, -0.239443516060731030, -0.239394970246653290, -0.239346423834088550, -0.239297876823157780, --0.239249329213981870, -0.239200781006683070, -0.239152232201382320, -0.239103682798200990, -0.239055132797260010, -0.239006582198681650, -0.238958031002586810, -0.238909479209096910, --0.238860926818332870, -0.238812373830416950, -0.238763820245470100, -0.238715266063613710, -0.238666711284968690, -0.238618155909657350, -0.238569599937800610, -0.238521043369519880, --0.238472486204936110, -0.238423928444171540, -0.238375370087347160, -0.238326811134584370, -0.238278251586004100, -0.238229691441728620, -0.238181130701878930, -0.238132569366575980, --0.238084007435942050, -0.238035444910098090, -0.237986881789165520, -0.237938318073265320, -0.237889753762519750, -0.237841188857049800, -0.237792623356976870, -0.237744057262421950, --0.237695490573507310, -0.237646923290353970, -0.237598355413083300, -0.237549786941816300, -0.237501217876675300, -0.237452648217781230, -0.237404077965255560, -0.237355507119219240, --0.237306935679794610, -0.237258363647102620, -0.237209791021264300, -0.237161217802401900, -0.237112643990636500, -0.237064069586089470, -0.237015494588881850, -0.236966918999135910, --0.236918342816972660, -0.236869766042513590, -0.236821188675879650, -0.236772610717193160, -0.236724032166575170, -0.236675453024147080, -0.236626873290029930, -0.236578292964346040, --0.236529712047216400, -0.236481130538762490, -0.236432548439105330, -0.236383965748367230, -0.236335382466669190, -0.236286798594132290, -0.236238214130878810, -0.236189629077029810, --0.236141043432706730, -0.236092457198030600, -0.236043870373123770, -0.235995282958107260, -0.235946694953102530, -0.235898106358230640, -0.235849517173613910, -0.235800927399373420, --0.235752337035630590, -0.235703746082506470, -0.235655154540123420, -0.235606562408602500, -0.235557969688065170, -0.235509376378632480, -0.235460782480426790, -0.235412187993569140, --0.235363592918180600, -0.235314997254383480, -0.235266401002298900, -0.235217804162048290, -0.235169206733752740, -0.235120608717534620, -0.235072010113514970, -0.235023410921815310, --0.234974811142556670, -0.234926210775861430, -0.234877609821850690, -0.234829008280645900, -0.234780406152368170, -0.234731803437139840, -0.234683200135082040, -0.234634596246316220, --0.234585991770963450, -0.234537386709146170, -0.234488781060985390, -0.234440174826602680, -0.234391568006119100, -0.234342960599657040, -0.234294352607337550, -0.234245744029281780, --0.234197134865612060, -0.234148525116449510, -0.234099914781915660, -0.234051303862131580, -0.234002692357219650, -0.233954080267301020, -0.233905467592497200, -0.233856854332929240, --0.233808240488719590, -0.233759626059989340, -0.233711011046860040, -0.233662395449452780, -0.233613779267889950, -0.233565162502292670, -0.233516545152782500, -0.233467927219480510, --0.233419308702509150, -0.233370689601989530, -0.233322069918042750, -0.233273449650791190, -0.233224828800356050, -0.233176207366858820, -0.233127585350420640, -0.233078962751163940, --0.233030339569209820, -0.232981715804679860, -0.232933091457695170, -0.232884466528378190, -0.232835841016850040, -0.232787214923232290, -0.232738588247646070, -0.232689960990213800, --0.232641333151056650, -0.232592704730296140, -0.232544075728053470, -0.232495446144451000, -0.232446815979609950, -0.232398185233651410, -0.232349553906697870, -0.232300921998870400, --0.232252289510290640, -0.232203656441079740, -0.232155022791360130, -0.232106388561252960, -0.232057753750879810, -0.232009118360361840, -0.231960482389821530, -0.231911845839379990, --0.231863208709158860, -0.231814570999279240, -0.231765932709863650, -0.231717293841033230, -0.231668654392909570, -0.231620014365613830, -0.231571373759268510, -0.231522732573994750, --0.231474090809914130, -0.231425448467147880, -0.231376805545818440, -0.231328162046046980, -0.231279517967954680, -0.231230873311664030, -0.231182228077296190, -0.231133582264972770, --0.231084935874814960, -0.231036288906945250, -0.230987641361484840, -0.230938993238555300, -0.230890344538277840, -0.230841695260774970, -0.230793045406167850, -0.230744394974578130, --0.230695743966126960, -0.230647092380936890, -0.230598440219129090, -0.230549787480825190, -0.230501134166146370, -0.230452480275215170, -0.230403825808152750, -0.230355170765080330, --0.230306515146120440, -0.230257858951394250, -0.230209202181023420, -0.230160544835129130, -0.230111886913833940, -0.230063228417259010, -0.230014569345526030, -0.229965909698756160, --0.229917249477071980, -0.229868588680594650, -0.229819927309445870, -0.229771265363746840, -0.229722602843620060, -0.229673939749186790, -0.229625276080568680, -0.229576611837886910, --0.229527947021264080, -0.229479281630821370, -0.229430615666680020, -0.229381949128962560, -0.229333282017790240, -0.229284614333284700, -0.229235946075567220, -0.229187277244760290, --0.229138607840985160, -0.229089937864363520, -0.229041267315016590, -0.228992596193066940, -0.228943924498635790, -0.228895252231844840, -0.228846579392815300, -0.228797905981669770, --0.228749231998529480, -0.228700557443516080, -0.228651882316750880, -0.228603206618356400, -0.228554530348453910, -0.228505853507164650, -0.228457176094611190, -0.228408498110914790, --0.228359819556197140, -0.228311140430579510, -0.228262460734184490, -0.228213780467133280, -0.228165099629547650, -0.228116418221548820, -0.228067736243259380, -0.228019053694800610, --0.227970370576294180, -0.227921686887861410, -0.227873002629624840, -0.227824317801705780, -0.227775632404225940, -0.227726946437306570, -0.227678259901070240, -0.227629572795638310, --0.227580885121132420, -0.227532196877673870, -0.227483508065385280, -0.227434818684387920, -0.227386128734803100, -0.227337438216753370, -0.227288747130360040, -0.227240055475744830, --0.227191363253029080, -0.227142670462335330, -0.227093977103784930, -0.227045283177499560, -0.226996588683600560, -0.226947893622210520, -0.226899197993450760, -0.226850501797442980, --0.226801805034308520, -0.226753107704170010, -0.226704409807148700, -0.226655711343366370, -0.226607012312944330, -0.226558312716005210, -0.226509612552670270, -0.226460911823060910, --0.226412210527299680, -0.226363508665507920, -0.226314806237807390, -0.226266103244319420, -0.226217399685166630, -0.226168695560470310, -0.226119990870352280, -0.226071285614933840, --0.226022579794337620, -0.225973873408684940, -0.225925166458097570, -0.225876458942696870, -0.225827750862605450, -0.225779042217944650, -0.225730333008836240, -0.225681623235401560, --0.225632912897763270, -0.225584201996042680, -0.225535490530361180, -0.225486778500841370, -0.225438065907604600, -0.225389352750772680, -0.225340639030466940, -0.225291924746810030, --0.225243209899923330, -0.225194494489928590, -0.225145778516947200, -0.225097061981101770, -0.225048344882513710, -0.224999627221304760, -0.224950908997596320, -0.224902190211511060, --0.224853470863170310, -0.224804750952695860, -0.224756030480209150, -0.224707309445832750, -0.224658587849688090, -0.224609865691896980, -0.224561142972580760, -0.224512419691862110, --0.224463695849862420, -0.224414971446703050, -0.224366246482506660, -0.224317520957394710, -0.224268794871488930, -0.224220068224910720, -0.224171341017782770, -0.224122613250226480, --0.224073884922363660, -0.224025156034315690, -0.223976426586205260, -0.223927696578153780, -0.223878966010283040, -0.223830234882714450, -0.223781503195570720, -0.223732770948973230, --0.223684038143043800, -0.223635304777903860, -0.223586570853676090, -0.223537836370481860, -0.223489101328442630, -0.223440365727681080, -0.223391629568318620, -0.223342892850477090, --0.223294155574277900, -0.223245417739843720, -0.223196679347296030, -0.223147940396756620, -0.223099200888346950, -0.223050460822189680, -0.223001720198406280, -0.222952979017118580, --0.222904237278447990, -0.222855494982517250, -0.222806752129447750, -0.222758008719361380, -0.222709264752379570, -0.222660520228625040, -0.222611775148219170, -0.222563029511283460, --0.222514283317940600, -0.222465536568312030, -0.222416789262519620, -0.222368041400684810, -0.222319292982930320, -0.222270544009377600, -0.222221794480148530, -0.222173044395364530, --0.222124293755148360, -0.222075542559621450, -0.222026790808905670, -0.221978038503122500, -0.221929285642394670, -0.221880532226843620, -0.221831778256591230, -0.221783023731758950, --0.221734268652469590, -0.221685513018844510, -0.221636756831005250, -0.221588000089074500, -0.221539242793173770, -0.221490484943424940, -0.221441726539949450, -0.221392967582870080, --0.221344208072308280, -0.221295448008385990, -0.221246687391224630, -0.221197926220946970, -0.221149164497674520, -0.221100402221529160, -0.221051639392632340, -0.221002876011106850, --0.220954112077074190, -0.220905347590656250, -0.220856582551974490, -0.220807816961151730, -0.220759050818309400, -0.220710284123569470, -0.220661516877053400, -0.220612749078883950, --0.220563980729182620, -0.220515211828070930, -0.220466442375671650, -0.220417672372106240, -0.220368901817496660, -0.220320130711964380, -0.220271359055632220, -0.220222586848621640, --0.220173814091054630, -0.220125040783052620, -0.220076266924738470, -0.220027492516233630, -0.219978717557660080, -0.219929942049139270, -0.219881165990794050, -0.219832389382745940, --0.219783612225116830, -0.219734834518028280, -0.219686056261603040, -0.219637277455962680, -0.219588498101228710, -0.219539718197523910, -0.219490937744969810, -0.219442156743688390, --0.219393375193801120, -0.219344593095430830, -0.219295810448699090, -0.219247027253727830, -0.219198243510638550, -0.219149459219554090, -0.219100674380595990, -0.219051888993886220, --0.219003103059546260, -0.218954316577699010, -0.218905529548465950, -0.218856741971969050, -0.218807953848329910, -0.218759165177671270, -0.218710375960114750, -0.218661586195781830, --0.218612795884795400, -0.218564005027276960, -0.218515213623348530, -0.218466421673131630, -0.218417629176749090, -0.218368836134322510, -0.218320042545973810, -0.218271248411824580, --0.218222453731997670, -0.218173658506614600, -0.218124862735797400, -0.218076066419667620, -0.218027269558348110, -0.217978472151960400, -0.217929674200626530, -0.217880875704468040, --0.217832076663607790, -0.217783277078167360, -0.217734476948268720, -0.217685676274033460, -0.217636875055584430, -0.217588073293043220, -0.217539270986531420, -0.217490468136171840, --0.217441664742086120, -0.217392860804396210, -0.217344056323223730, -0.217295251298691540, -0.217246445730921220, -0.217197639620034800, -0.217148832966153840, -0.217100025769401210, --0.217051218029898550, -0.217002409747767830, -0.216953600923130650, -0.216904791556109890, -0.216855981646827150, -0.216807171195404490, -0.216758360201963430, -0.216709548666626920, --0.216660736589516540, -0.216611923970753910, -0.216563110810461870, -0.216514297108762050, -0.216465482865776490, -0.216416668081626800, -0.216367852756435890, -0.216319036890325310, --0.216270220483417150, -0.216221403535833020, -0.216172586047695820, -0.216123768019127140, -0.216074949450249050, -0.216026130341183150, -0.215977310692052340, -0.215928490502978270, --0.215879669774082960, -0.215830848505488060, -0.215782026697316470, -0.215733204349689790, -0.215684381462729700, -0.215635558036559070, -0.215586734071299550, -0.215537909567073190, --0.215489084524001620, -0.215440258942207780, -0.215391432821813310, -0.215342606162940240, -0.215293778965710200, -0.215244951230246170, -0.215196122956669760, -0.215147294145103060, --0.215098464795667660, -0.215049634908486550, -0.215000804483681330, -0.214951973521374130, -0.214903142021686560, -0.214854309984741560, -0.214805477410660780, -0.214756644299565870, --0.214707810651579790, -0.214658976466824190, -0.214610141745421120, -0.214561306487492300, -0.214512470693160620, -0.214463634362547780, -0.214414797495775860, -0.214365960092966490, --0.214317122154242670, -0.214268283679726030, -0.214219444669538680, -0.214170605123802320, -0.214121765042639860, -0.214072924426172980, -0.214024083274523800, -0.213975241587813950, --0.213926399366166450, -0.213877556609702950, -0.213828713318545580, -0.213779869492815970, -0.213731025132637110, -0.213682180238130710, -0.213633334809418430, -0.213584488846623230, --0.213535642349866800, -0.213486795319271280, -0.213437947754958330, -0.213389099657050970, -0.213340251025670840, -0.213291401860940060, -0.213242552162980380, -0.213193701931914730, --0.213144851167864830, -0.213095999870952820, -0.213047148041300340, -0.212998295679030450, -0.212949442784264810, -0.212900589357125580, -0.212851735397734440, -0.212802880906214380, --0.212754025882687130, -0.212705170327274370, -0.212656314240099120, -0.212607457621283110, -0.212558600470948430, -0.212509742789216830, -0.212460884576211290, -0.212412025832053540, --0.212363166556865740, -0.212314306750769570, -0.212265446413888090, -0.212216585546342980, -0.212167724148256410, -0.212118862219750100, -0.212069999760947060, -0.212021136771969020, --0.211972273252938160, -0.211923409203976150, -0.211874544625206080, -0.211825679516749630, -0.211776813878728540, -0.211727947711265880, -0.211679081014483320, -0.211630213788503080, --0.211581346033446860, -0.211532477749437700, -0.211483608936597370, -0.211434739595047990, -0.211385869724911360, -0.211336999326310480, -0.211288128399367090, -0.211239256944203370, --0.211190384960941090, -0.211141512449703280, -0.211092639410611680, -0.211043765843788510, -0.210994891749355460, -0.210946017127435630, -0.210897141978150740, -0.210848266301623010, --0.210799390097974190, -0.210750513367327310, -0.210701636109804140, -0.210652758325526460, -0.210603880014617330, -0.210555001177198470, -0.210506121813392150, -0.210457241923320050, --0.210408361507105290, -0.210359480564869640, -0.210310599096735270, -0.210261717102823990, -0.210212834583258850, -0.210163951538161610, -0.210115067967654500, -0.210066183871859270, --0.210017299250899010, -0.209968414104895530, -0.209919528433971020, -0.209870642238247220, -0.209821755517847260, -0.209772868272892930, -0.209723980503505990, -0.209675092209809510, --0.209626203391925340, -0.209577314049975620, -0.209528424184082210, -0.209479533794368150, -0.209430642880955280, -0.209381751443965790, -0.209332859483521480, -0.209283966999745470, --0.209235073992759530, -0.209186180462685920, -0.209137286409646410, -0.209088391833764130, -0.209039496735160840, -0.208990601113958840, -0.208941704970279890, -0.208892808304247140, --0.208843911115982330, -0.208795013405607330, -0.208746115173245230, -0.208697216419017840, -0.208648317143047410, -0.208599417345455730, -0.208550517026365980, -0.208501616185899910, --0.208452714824179820, -0.208403812941327480, -0.208354910537466080, -0.208306007612717360, -0.208257104167203670, -0.208208200201046740, -0.208159295714369780, -0.208110390707294560, --0.208061485179943360, -0.208012579132438010, -0.207963672564901670, -0.207914765477456130, -0.207865857870223240, -0.207816949743326150, -0.207768041096886680, -0.207719131931027120, --0.207670222245869280, -0.207621312041536330, -0.207572401318150110, -0.207523490075832870, -0.207474578314706480, -0.207425666034894070, -0.207376753236517470, -0.207327839919699030, --0.207278926084560530, -0.207230011731225160, -0.207181096859814760, -0.207132181470451620, -0.207083265563257600, -0.207034349138355830, -0.206985432195868210, -0.206936514735916980, --0.206887596758624060, -0.206838678264112560, -0.206789759252504370, -0.206740839723921350, -0.206691919678486660, -0.206642999116322200, -0.206594078037550200, -0.206545156442292600, --0.206496234330672520, -0.206447311702811890, -0.206398388558832940, -0.206349464898857610, -0.206300540723009050, -0.206251616031409120, -0.206202690824180160, -0.206153765101444040, --0.206104838863323950, -0.206055912109941760, -0.206006984841419770, -0.205958057057879920, -0.205909128759445340, -0.205860199946237940, -0.205811270618379590, -0.205762340775993540, --0.205713410419201600, -0.205664479548126140, -0.205615548162889040, -0.205566616263613530, -0.205517683850421460, -0.205468750923435190, -0.205419817482776600, -0.205370883528568910, --0.205321949060934010, -0.205273014079994240, -0.205224078585871490, -0.205175142578688990, -0.205126206058568630, -0.205077269025632750, -0.205028331480003270, -0.204979393421803380, --0.204930454851155020, -0.204881515768180090, -0.204832576173001800, -0.204783636065742070, -0.204734695446523260, -0.204685754315467260, -0.204636812672697320, -0.204587870518335320, --0.204538927852503690, -0.204489984675324280, -0.204441040986920340, -0.204392096787413820, -0.204343152076927050, -0.204294206855581940, -0.204245261123501780, -0.204196314880808440, --0.204147368127624320, -0.204098420864071370, -0.204049473090272770, -0.204000524806350500, -0.203951576012426920, -0.203902626708623970, -0.203853676895064890, -0.203804726571871600, --0.203755775739166090, -0.203706824397071550, -0.203657872545709940, -0.203608920185203680, -0.203559967315674660, -0.203511013937246160, -0.203462060050040140, -0.203413105654178940, --0.203364150749784590, -0.203315195336980250, -0.203266239415887950, -0.203217282986630030, -0.203168326049328500, -0.203119368604106560, -0.203070410651086220, -0.203021452190389830, --0.202972493222139390, -0.202923533746458130, -0.202874573763468070, -0.202825613273291130, -0.202776652276050570, -0.202727690771868420, -0.202678728760867010, -0.202629766243168360, --0.202580803218895710, -0.202531839688171070, -0.202482875651116830, -0.202433911107854970, -0.202384946058508740, -0.202335980503200170, -0.202287014442051630, -0.202238047875185150, --0.202189080802723960, -0.202140113224790090, -0.202091145141505920, -0.202042176552993450, -0.201993207459375960, -0.201944237860775480, -0.201895267757313950, -0.201846297149114700, --0.201797326036299710, -0.201748354418991390, -0.201699382297311770, -0.201650409671384120, -0.201601436541330450, -0.201552462907273160, -0.201503488769334300, -0.201454514127637150, --0.201405538982303730, -0.201356563333456450, -0.201307587181217330, -0.201258610525709670, -0.201209633367055500, -0.201160655705377220, -0.201111677540796870, -0.201062698873437780, --0.201013719703421940, -0.200964740030871360, -0.200915759855909370, -0.200866779178657970, -0.200817797999239630, -0.200768816317776350, -0.200719834134391480, -0.200670851449207020, --0.200621868262345400, -0.200572884573928720, -0.200523900384080240, -0.200474915692922030, -0.200425930500576500, -0.200376944807165720, -0.200327958612813020, -0.200278971917640440, --0.200229984721770390, -0.200180997025324990, -0.200132008828427490, -0.200083020131200000, -0.200034030933764930, -0.199985041236244360, -0.199936051038761640, -0.199887060341438770, --0.199838069144397830, -0.199789077447762140, -0.199740085251653770, -0.199691092556195160, -0.199642099361508420, -0.199593105667716850, -0.199544111474942500, -0.199495116783307890, --0.199446121592935070, -0.199397125903947340, -0.199348129716466820, -0.199299133030615970, -0.199250135846516850, -0.199201138164292830, -0.199152139984065970, -0.199103141305958740, --0.199054142130093260, -0.199005142456592820, -0.198956142285579530, -0.198907141617175460, -0.198858140451503990, -0.198809138788687140, -0.198760136628847450, -0.198711133972106990, --0.198662130818589130, -0.198613127168415950, -0.198564123021709920, -0.198515118378593170, -0.198466113239189060, -0.198417107603619660, -0.198368101472007510, -0.198319094844474660, --0.198270087721144490, -0.198221080102139120, -0.198172071987581050, -0.198123063377592360, -0.198074054272296430, -0.198025044671815390, -0.197976034576271300, -0.197927023985787570, --0.197878012900486260, -0.197829001320489920, -0.197779989245920630, -0.197730976676901820, -0.197681963613555580, -0.197632950056004400, -0.197583936004370440, -0.197534921458777050, --0.197485906419346380, -0.197436890886200920, -0.197387874859462800, -0.197338858339255440, -0.197289841325700930, -0.197240823818921830, -0.197191805819040220, -0.197142787326179540, --0.197093768340461880, -0.197044748862009820, -0.196995728890945440, -0.196946708427392150, -0.196897687471472130, -0.196848666023307420, -0.196799644083021500, -0.196750621650736480, --0.196701598726574890, -0.196652575310658860, -0.196603551403111840, -0.196554527004055930, -0.196505502113613730, -0.196456476731907300, -0.196407450859060140, -0.196358424495194360, --0.196309397640432510, -0.196260370294896710, -0.196211342458710440, -0.196162314131995810, -0.196113285314875400, -0.196064256007471350, -0.196015226209907080, -0.195966195922304740, --0.195917165144786490, -0.195868133877475760, -0.195819102120494660, -0.195770069873965860, -0.195721037138011420, -0.195672003912754830, -0.195622970198318230, -0.195573935994824200, --0.195524901302394890, -0.195475866121153780, -0.195426830451222970, -0.195377794292725120, -0.195328757645782340, -0.195279720510518090, -0.195230682887054560, -0.195181644775514310, --0.195132606176019520, -0.195083567088693620, -0.195034527513658850, -0.194985487451037300, -0.194936446900952460, -0.194887405863526510, -0.194838364338882050, -0.194789322327141250, --0.194740279828427560, -0.194691236842863190, -0.194642193370570700, -0.194593149411672330, -0.194544104966291490, -0.194495060034550390, -0.194446014616571660, -0.194396968712477440, --0.194347922322391260, -0.194298875446435260, -0.194249828084732040, -0.194200780237403860, -0.194151731904574130, -0.194102683086365110, -0.194053633782898920, -0.194004583994299070, --0.193955533720687770, -0.193906482962187650, -0.193857431718920890, -0.193808379991010970, -0.193759327778580100, -0.193710275081750930, -0.193661221900645610, -0.193612168235387680, --0.193563114086099330, -0.193514059452903200, -0.193465004335921480, -0.193415948735277700, -0.193366892651094020, -0.193317836083493150, -0.193268779032597200, -0.193219721498529780, --0.193170663481413040, -0.193121604981369650, -0.193072545998521810, -0.193023486532993030, -0.192974426584905550, -0.192925366154381550, -0.192876305241544590, -0.192827243846516870, --0.192778181969421010, -0.192729119610379280, -0.192680056769515190, -0.192630993446950950, -0.192581929642809240, -0.192532865357212260, -0.192483800590283530, -0.192434735342145340, --0.192385669612920280, -0.192336603402730620, -0.192287536711699900, -0.192238469539950330, -0.192189401887604580, -0.192140333754784900, -0.192091265141614790, -0.192042196048216540, --0.191993126474712370, -0.191944056421225830, -0.191894985887879120, -0.191845914874794960, -0.191796843382095600, -0.191747771409904540, -0.191698698958344040, -0.191649626027536820, --0.191600552617605090, -0.191551478728672400, -0.191502404360861020, -0.191453329514293640, -0.191404254189092520, -0.191355178385381160, -0.191306102103281860, -0.191257025342917330, --0.191207948104409780, -0.191158870387882820, -0.191109792193458670, -0.191060713521259580, -0.191011634371409170, -0.190962554744029650, -0.190913474639243770, -0.190864394057173760, --0.190815312997943190, -0.190766231461674350, -0.190717149448489910, -0.190668066958512180, -0.190618983991864720, -0.190569900548669820, -0.190520816629050130, -0.190471732233127970, --0.190422647361026930, -0.190373562012869260, -0.190324476188777710, -0.190275389888874490, -0.190226303113283260, -0.190177215862126270, -0.190128128135526240, -0.190079039933605450, --0.190029951256487500, -0.189980862104294660, -0.189931772477149240, -0.189882682375174830, -0.189833591798493710, -0.189784500747228610, -0.189735409221501810, -0.189686317221436950, --0.189637224747156270, -0.189588131798782530, -0.189539038376438040, -0.189489944480246390, -0.189440850110329880, -0.189391755266811230, -0.189342659949812750, -0.189293564159458080, --0.189244467895869490, -0.189195371159169730, -0.189146273949481110, -0.189097176266927240, -0.189048078111630410, -0.188998979483712970, -0.188949880383298520, -0.188900780810509340, --0.188851680765468240, -0.188802580248297490, -0.188753479259120730, -0.188704377798060260, -0.188655275865238860, -0.188606173460778820, -0.188557070584803810, -0.188507967237436100, --0.188458863418798470, -0.188409759129013250, -0.188360654368204070, -0.188311549136493260, -0.188262443434003580, -0.188213337260857340, -0.188164230617178210, -0.188115123503088480, --0.188066015918710530, -0.188016907864167970, -0.187967799339583130, -0.187918690345078800, -0.187869580880777320, -0.187820470946802290, -0.187771360543276120, -0.187722249670321530, --0.187673138328060870, -0.187624026516617830, -0.187574914236114690, -0.187525801486674280, -0.187476688268418930, -0.187427574581472300, -0.187378460425956740, -0.187329345801995010, --0.187280230709709480, -0.187231115149223830, -0.187181999120660390, -0.187132882624141930, -0.187083765659790850, -0.187034648227730780, -0.186985530328084070, -0.186936411960973130, --0.186887293126521580, -0.186838173824851820, -0.186789054056086590, -0.186739933820348310, -0.186690813117760650, -0.186641691948445930, -0.186592570312526990, -0.186543448210126170, --0.186494325641367200, -0.186445202606372370, -0.186396079105264570, -0.186346955138166130, -0.186297830705200730, -0.186248705806490750, -0.186199580442159040, -0.186150454612327900, --0.186101328317121090, -0.186052201556660940, -0.186003074331069860, -0.185953946640471520, -0.185904818484988330, -0.185855689864743070, -0.185806560779858160, -0.185757431230457290, --0.185708301216662850, -0.185659170738597640, -0.185610039796384070, -0.185560908390145830, -0.185511776520005330, -0.185462644186085410, -0.185413511388508400, -0.185364378127398090, --0.185315244402876810, -0.185266110215067420, -0.185216975564092310, -0.185167840450075200, -0.185118704873138500, -0.185069568833404610, -0.185020432330997210, -0.184971295366038760, --0.184922157938652050, -0.184873020048959500, -0.184823881697084860, -0.184774742883150520, -0.184725603607279300, -0.184676463869593630, -0.184627323670217250, -0.184578183009272560, --0.184529041886882430, -0.184479900303169240, -0.184430758258256750, -0.184381615752267330, -0.184332472785323910, -0.184283329357548850, -0.184234185469065920, -0.184185041119997510, --0.184135896310466060, -0.184086751040595300, -0.184037605310507700, -0.183988459120326050, -0.183939312470172810, -0.183890165360171750, -0.183841017790445260, -0.183791869761116250, --0.183742721272307120, -0.183693572324141600, -0.183644422916742180, -0.183595273050231680, -0.183546122724732560, -0.183496971940368600, -0.183447820697262180, -0.183398668995536220, --0.183349516835313140, -0.183300364216716720, -0.183251211139869390, -0.183202057604894030, -0.183152903611913080, -0.183103749161050320, -0.183054594252428180, -0.183005438886169100, --0.182956283062396890, -0.182907126781233940, -0.182857970042803210, -0.182808812847227110, -0.182759655194629390, -0.182710497085132570, -0.182661338518859460, -0.182612179495932610, --0.182563020016475730, -0.182513860080611300, -0.182464699688462210, -0.182415538840150940, -0.182366377535801260, -0.182317215775535640, -0.182268053559477010, -0.182218890887747760, --0.182169727760471740, -0.182120564177771390, -0.182071400139769220, -0.182022235646588980, -0.181973070698353140, -0.181923905295184620, -0.181874739437205890, -0.181825573124540780, --0.181776406357311710, -0.181727239135641650, -0.181678071459653030, -0.181628903329469680, -0.181579734745214080, -0.181530565707009120, -0.181481396214977330, -0.181432226269242460, --0.181383055869927060, -0.181333885017154000, -0.181284713711045790, -0.181235541951726250, -0.181186369739317840, -0.181137197073943070, -0.181088023955725740, -0.181038850384788370, --0.180989676361253850, -0.180940501885244710, -0.180891326956884760, -0.180842151576296490, -0.180792975743602840, -0.180743799458926300, -0.180694622722390700, -0.180645445534118570, --0.180596267894232800, -0.180547089802855940, -0.180497911260111780, -0.180448732266122850, -0.180399552821012080, -0.180350372924902000, -0.180301192577916440, -0.180252011780177880, --0.180202830531809270, -0.180153648832933190, -0.180104466683673390, -0.180055284084152440, -0.180006101034492850, -0.179956917534818430, -0.179907733585251720, -0.179858549185915680, --0.179809364336932810, -0.179760179038427000, -0.179710993290520730, -0.179661807093336980, -0.179612620446998270, -0.179563433351628440, -0.179514245807350040, -0.179465057814286010, --0.179415869372558910, -0.179366680482292570, -0.179317491143609510, -0.179268301356632740, -0.179219111121484780, -0.179169920438289470, -0.179120729307169380, -0.179071537728247020, --0.179022345701646240, -0.178973153227489610, -0.178923960305900100, -0.178874766937000250, -0.178825573120913910, -0.178776378857763650, -0.178727184147672440, -0.178677988990762810, --0.178628793387158670, -0.178579597336982530, -0.178530400840357430, -0.178481203897405850, -0.178432006508251720, -0.178382808673017560, -0.178333610391826380, -0.178284411664800750, --0.178235212492064530, -0.178186012873740280, -0.178136812809950560, -0.178087612300819210, -0.178038411346468860, -0.177989209947022500, -0.177940008102602630, -0.177890805813333220, --0.177841603079336770, -0.177792399900736340, -0.177743196277654450, -0.177693992210215010, -0.177644787698540580, -0.177595582742754190, -0.177546377342978400, -0.177497171499337110, --0.177447965211952910, -0.177398758480948770, -0.177349551306447310, -0.177300343688572390, -0.177251135627446630, -0.177201927123192600, -0.177152718175934170, -0.177103508785793950, --0.177054298952894980, -0.177005088677359810, -0.176955877959312340, -0.176906666798875210, -0.176857455196171380, -0.176808243151323490, -0.176759030664455420, -0.176709817735689780, --0.176660604365149600, -0.176611390552957460, -0.176562176299237290, -0.176512961604111670, -0.176463746467703660, -0.176414530890135840, -0.176365314871532120, -0.176316098412015120, --0.176266881511707880, -0.176217664170733010, -0.176168446389214390, -0.176119228167274680, -0.176070009505036460, -0.176020790402623640, -0.175971570860158830, -0.175922350877765120, --0.175873130455565070, -0.175823909593682660, -0.175774688292240470, -0.175725466551361540, -0.175676244371168520, -0.175627021751785320, -0.175577798693334590, -0.175528575195939340, --0.175479351259722220, -0.175430126884807160, -0.175380902071316790, -0.175331676819374140, -0.175282451129101870, -0.175233225000623940, -0.175183998434062900, -0.175134771429541450, --0.175085543987183540, -0.175036316107111730, -0.174987087789449130, -0.174937859034318380, -0.174888629841843450, -0.174839400212146890, -0.174790170145351860, -0.174740939641580970, --0.174691708700958180, -0.174642477323606080, -0.174593245509647830, -0.174544013259205990, -0.174494780572404580, -0.174445547449366220, -0.174396313890213980, -0.174347079895070510, --0.174297845464059800, -0.174248610597304450, -0.174199375294927160, -0.174150139557051860, -0.174100903383801210, -0.174051666775298290, -0.174002429731665800, -0.173953192253027630, --0.173903954339506510, -0.173854715991225480, -0.173805477208307250, -0.173756237990875750, -0.173706998339053680, -0.173657758252964090, -0.173608517732729640, -0.173559276778474380, --0.173510035390320920, -0.173460793568392360, -0.173411551312811360, -0.173362308623701940, -0.173313065501186750, -0.173263821945388890, -0.173214577956431050, -0.173165333534437190, --0.173116088679530020, -0.173066843391832180, -0.173017597671467650, -0.172968351518559130, -0.172919104933229730, -0.172869857915602170, -0.172820610465800360, -0.172771362583947040, --0.172722114270165290, -0.172672865524577830, -0.172623616347308660, -0.172574366738480450, -0.172525116698216300, -0.172475866226638940, -0.172426615323872350, -0.172377363990039220, --0.172328112225262680, -0.172278860029665410, -0.172229607403371430, -0.172180354346503440, -0.172131100859184120, -0.172081846941537500, -0.172032592593686250, -0.171983337815753530, --0.171934082607862030, -0.171884826970135740, -0.171835570902697380, -0.171786314405670100, -0.171737057479176610, -0.171687800123340920, -0.171638542338285710, -0.171589284124134160, --0.171540025481008940, -0.171490766409034100, -0.171441506908332380, -0.171392246979026860, -0.171342986621240280, -0.171293725835096670, -0.171244464620718770, -0.171195202978229240, --0.171145940907752180, -0.171096678409410230, -0.171047415483326610, -0.170998152129623990, -0.170948888348426450, -0.170899624139856680, -0.170850359504037850, -0.170801094441092680, --0.170751828951145210, -0.170702563034318160, -0.170653296690734730, -0.170604029920517600, -0.170554762723790830, -0.170505495100677170, -0.170456227051299760, -0.170406958575781340, --0.170357689674245970, -0.170308420346816400, -0.170259150593615290, -0.170209880414766780, -0.170160609810393550, -0.170111338780618820, -0.170062067325565280, -0.170012795445357020, --0.169963523140116760, -0.169914250409967720, -0.169864977255032580, -0.169815703675435470, -0.169766429671299070, -0.169717155242746610, -0.169667880389900830, -0.169618605112885790, --0.169569329411824200, -0.169520053286839330, -0.169470776738053890, -0.169421499765591930, -0.169372222369576190, -0.169322944550129940, -0.169273666307375860, -0.169224387641438070, --0.169175108552439310, -0.169125829040502360, -0.169076549105751230, -0.169027268748308760, -0.168977987968298100, -0.168928706765842070, -0.168879425141064660, -0.168830143094088720, --0.168780860625037420, -0.168731577734033520, -0.168682294421201110, -0.168633010686662980, -0.168583726530542320, -0.168534441952961880, -0.168485156954045810, -0.168435871533916840, --0.168386585692698180, -0.168337299430512620, -0.168288012747484260, -0.168238725643735850, -0.168189438119390190, -0.168140150174571370, -0.168090861809402190, -0.168041573024005850, --0.167992283818505140, -0.167942994193024160, -0.167893704147685700, -0.167844413682612960, -0.167795122797928770, -0.167745831493757190, -0.167696539770221030, -0.167647247627443540, --0.167597955065547500, -0.167548662084656990, -0.167499368684894820, -0.167450074866384250, -0.167400780629248040, -0.167351485973610330, -0.167302190899593890, -0.167252895407321550, --0.167203599496917400, -0.167154303168504240, -0.167105006422205330, -0.167055709258143480, -0.167006411676442780, -0.166957113677226070, -0.166907815260616540, -0.166858516426737070, --0.166809217175711730, -0.166759917507663340, -0.166710617422715170, -0.166661316920990010, -0.166612016002612020, -0.166562714667703950, -0.166513412916389130, -0.166464110748790310, --0.166414808165031680, -0.166365505165236020, -0.166316201749526580, -0.166266897918026210, -0.166217593670859030, -0.166168289008147870, -0.166118983930015560, -0.166069678436586210, --0.166020372527982660, -0.165971066204328190, -0.165921759465745610, -0.165872452312359090, -0.165823144744291410, -0.165773836761665900, -0.165724528364605330, -0.165675219553233890, --0.165625910327674400, -0.165576600688050140, -0.165527290634483930, -0.165477980167099940, -0.165428669286021010, -0.165379357991370380, -0.165330046283270940, -0.165280734161846830, --0.165231421627220850, -0.165182108679515910, -0.165132795318856110, -0.165083481545364340, -0.165034167359163850, -0.164984852760377530, -0.164935537749129500, -0.164886222325542620, --0.164836906489740200, -0.164787590241845060, -0.164738273581981400, -0.164688956510272020, -0.164639639026840280, -0.164590321131808990, -0.164541002825302350, -0.164491684107443190, --0.164442364978354850, -0.164393045438160130, -0.164343725486983230, -0.164294405124947030, -0.164245084352174390, -0.164195763168789450, -0.164146441574915120, -0.164097119570674690, --0.164047797156191000, -0.163998474331588260, -0.163949151096989350, -0.163899827452517580, -0.163850503398295770, -0.163801178934448150, -0.163751854061097570, -0.163702528778367380, --0.163653203086380400, -0.163603876985260880, -0.163554550475131650, -0.163505223556116050, -0.163455896228336950, -0.163406568491918560, -0.163357240346983730, -0.163307911793655390, --0.163258582832057690, -0.163209253462313520, -0.163159923684546240, -0.163110593498878690, -0.163061262905435100, -0.163011931904338350, -0.162962600495711790, -0.162913268679678290, --0.162863936456362050, -0.162814603825885950, -0.162765270788373360, -0.162715937343947150, -0.162666603492731540, -0.162617269234849400, -0.162567934570424120, -0.162518599499578530, --0.162469264022436920, -0.162419928139122120, -0.162370591849757500, -0.162321255154465970, -0.162271918053371740, -0.162222580546597720, -0.162173242634266800, -0.162123904316503230, --0.162074565593429890, -0.162025226465170120, -0.161975886931846860, -0.161926546993584330, -0.161877206650505420, -0.161827865902733490, -0.161778524750391480, -0.161729183193603580, --0.161679841232492710, -0.161630498867182250, -0.161581156097795110, -0.161531812924455510, -0.161482469347286380, -0.161433125366411080, -0.161383780981952520, -0.161334436194034950, --0.161285091002781290, -0.161235745408314450, -0.161186399410758710, -0.161137053010236950, -0.161087706206872570, -0.161038359000788500, -0.160989011392108940, -0.160939663380956890, --0.160890314967455650, -0.160840966151728190, -0.160791616933898760, -0.160742267314090280, -0.160692917292426130, -0.160643566869029250, -0.160594216044023910, -0.160544864817533020, --0.160495513189679940, -0.160446161160587690, -0.160396808730380420, -0.160347455899181170, -0.160298102667112840, -0.160248749034299670, -0.160199395000864640, -0.160150040566931110, --0.160100685732622070, -0.160051330498061720, -0.160001974863373060, -0.159952618828679450, -0.159903262394103880, -0.159853905559770580, -0.159804548325802510, -0.159755190692323080, --0.159705832659455200, -0.159656474227323240, -0.159607115396050050, -0.159557756165759070, -0.159508396536573280, -0.159459036508616920, -0.159409676082012980, -0.159360315256884850, --0.159310954033355490, -0.159261592411549190, -0.159212230391588910, -0.159162867973597600, -0.159113505157699560, -0.159064141944017770, -0.159014778332675630, -0.158965414323796100, --0.158916049917503470, -0.158866685113920710, -0.158817319913171250, -0.158767954315378050, -0.158718588320665380, -0.158669221929156250, -0.158619855140974100, -0.158570487956241820, --0.158521120375083780, -0.158471752397622960, -0.158422384023982730, -0.158373015254286130, -0.158323646088657400, -0.158274276527219570, -0.158224906570095610, -0.158175536217409820, --0.158126165469285210, -0.158076794325845150, -0.158027422787212680, -0.157978050853512100, -0.157928678524866390, -0.157879305801398970, -0.157829932683232870, -0.157780559170492360, --0.157731185263300460, -0.157681810961780610, -0.157632436266055780, -0.157583061176250290, -0.157533685692487160, -0.157484309814889780, -0.157434933543581230, -0.157385556878685770, --0.157336179820326410, -0.157286802368626190, -0.157237424523709370, -0.157188046285699020, -0.157138667654718540, -0.157089288630890940, -0.157039909214340580, -0.156990529405190430, --0.156941149203563950, -0.156891768609584180, -0.156842387623375410, -0.156793006245060680, -0.156743624474763420, -0.156694242312606670, -0.156644859758714760, -0.156595476813210700, --0.156546093476217920, -0.156496709747859510, -0.156447325628259750, -0.156397941117541660, -0.156348556215828300, -0.156299170923243970, -0.156249785239911730, -0.156200399165955020, --0.156151012701496870, -0.156101625846661620, -0.156052238601572300, -0.156002850966352410, -0.155953462941124940, -0.155904074526014260, -0.155854685721143390, -0.155805296526635800, --0.155755906942614510, -0.155706516969203930, -0.155657126606527030, -0.155607735854707330, -0.155558344713867840, -0.155508953184132940, -0.155459561265625660, -0.155410168958469460, --0.155360776262787410, -0.155311383178703850, -0.155261989706341840, -0.155212595845824420, -0.155163201597275950, -0.155113806960819470, -0.155064411936578470, -0.155015016524676000, --0.154965620725236420, -0.154916224538382800, -0.154866827964238620, -0.154817431002926940, -0.154768033654572120, -0.154718635919297190, -0.154669237797225690, -0.154619839288480660, --0.154570440393186460, -0.154521041111466170, -0.154471641443443270, -0.154422241389240820, -0.154372840948983210, -0.154323440122793500, -0.154274038910794780, -0.154224637313111370, --0.154175235329866350, -0.154125832961183260, -0.154076430207185170, -0.154027027067996420, -0.153977623543740120, -0.153928219634539730, -0.153878815340518370, -0.153829410661800420, --0.153780005598508930, -0.153730600150767420, -0.153681194318699000, -0.153631788102428000, -0.153582381502077560, -0.153532974517771150, -0.153483567149631850, -0.153434159397784100, --0.153384751262350930, -0.153335342743455450, -0.153285933841222080, -0.153236524555773830, -0.153187114887234300, -0.153137704835726530, -0.153088294401374920, -0.153038883584302590, --0.152989472384633060, -0.152940060802489420, -0.152890648837996050, -0.152841236491276070, -0.152791823762452980, -0.152742410651649900, -0.152692997158991230, -0.152643583284600070, --0.152594169028599960, -0.152544754391113980, -0.152495339372266530, -0.152445923972180760, -0.152396508190980190, -0.152347092028787880, -0.152297675485728280, -0.152248258561924530, --0.152198841257499660, -0.152149423572578130, -0.152100005507283060, -0.152050587061737960, -0.152001168236065960, -0.151951749030391460, -0.151902329444837610, -0.151852909479527930, --0.151803489134585550, -0.151754068410134860, -0.151704647306299010, -0.151655225823201570, -0.151605803960965600, -0.151556381719715550, -0.151506959099574540, -0.151457536100666150, --0.151408112723113500, -0.151358688967040970, -0.151309264832571730, -0.151259840319828890, -0.151210415428936900, -0.151160990160018850, -0.151111564513198350, -0.151062138488598480, --0.151012712086343730, -0.150963285306557170, -0.150913858149362400, -0.150864430614882560, -0.150815002703242080, -0.150765574414564090, -0.150716145748972160, -0.150666716706589430, --0.150617287287540340, -0.150567857491948040, -0.150518427319936090, -0.150468996771627640, -0.150419565847147140, -0.150370134546617710, -0.150320702870162530, -0.150271270817906010, --0.150221838389971300, -0.150172405586482010, -0.150122972407561280, -0.150073538853333550, -0.150024104923921990, -0.149974670619450130, -0.149925235940041170, -0.149875800885819560, --0.149826365456908470, -0.149776929653431450, -0.149727493475511650, -0.149678056923273570, -0.149628619996840350, -0.149579182696335580, -0.149529745021882400, -0.149480306973605310, --0.149430868551627460, -0.149381429756071990, -0.149331990587063400, -0.149282551044724790, -0.149233111129179840, -0.149183670840551670, -0.149134230178964770, -0.149084789144542260, --0.149035347737407810, -0.148985905957684540, -0.148936463805496940, -0.148887021280968200, -0.148837578384221870, -0.148788135115381190, -0.148738691474570610, -0.148689247461913280, --0.148639803077532830, -0.148590358321552460, -0.148540913194096620, -0.148491467695288480, -0.148442021825251680, -0.148392575584109400, -0.148343128971986120, -0.148293681989005000, --0.148244234635289240, -0.148194786910963360, -0.148145338816150500, -0.148095890350974260, -0.148046441515557880, -0.147996992310025830, -0.147947542734501310, -0.147898092789107930, --0.147848642473968890, -0.147799191789208670, -0.147749740734950450, -0.147700289311317900, -0.147650837518434190, -0.147601385356423840, -0.147551932825409990, -0.147502479925516320, --0.147453026656866020, -0.147403573019583590, -0.147354119013792250, -0.147304664639615140, -0.147255209897176800, -0.147205754786600470, -0.147156299308009750, -0.147106843461527830, --0.147057387247279240, -0.147007930665387170, -0.146958473715975290, -0.146909016399166790, -0.146859558715086160, -0.146810100663856660, -0.146760642245601900, -0.146711183460445090, --0.146661724308510770, -0.146612264789922150, -0.146562804904802860, -0.146513344653276120, -0.146463884035466420, -0.146414423051497070, -0.146364961701491190, -0.146315499985573330, --0.146266037903866750, -0.146216575456495080, -0.146167112643581510, -0.146117649465250600, -0.146068185921625570, -0.146018722012830090, -0.145969257738987330, -0.145919793100221910, --0.145870328096656980, -0.145820862728416240, -0.145771396995622890, -0.145721930898401490, -0.145672464436875290, -0.145622997611167900, -0.145573530421402590, -0.145524062867703860, --0.145474594950195020, -0.145425126668999680, -0.145375658024241070, -0.145326189016043740, -0.145276719644530980, -0.145227249909825970, -0.145177779812053260, -0.145128309351336110, --0.145078838527798180, -0.145029367341562710, -0.144979895792754280, -0.144930423881496070, -0.144880951607911840, -0.144831478972124780, -0.144782005974259470, -0.144732532614439140, --0.144683058892787490, -0.144633584809427730, -0.144584110364484460, -0.144534635558080910, -0.144485160390340760, -0.144435684861387280, -0.144386208971345050, -0.144336732720337260, --0.144287256108487220, -0.144237779135919480, -0.144188301802757300, -0.144138824109124350, -0.144089346055143900, -0.144039867640940510, -0.143990388866637480, -0.143940909732358460, --0.143891430238226730, -0.143841950384366870, -0.143792470170902130, -0.143742989597956230, -0.143693508665652390, -0.143644027374115250, -0.143594545723468000, -0.143545063713834410, --0.143495581345337710, -0.143446098618102510, -0.143396615532252080, -0.143347132087909640, -0.143297648285199810, -0.143248164124245870, -0.143198679605171520, -0.143149194728100030, --0.143099709493156010, -0.143050223900462680, -0.143000737950143810, -0.142951251642322670, -0.142901764977123810, -0.142852277954670560, -0.142802790575086630, -0.142753302838495240, --0.142703814745021060, -0.142654326294787360, -0.142604837487917800, -0.142555348324535730, -0.142505858804765740, -0.142456368928731090, -0.142406878696555080, -0.142357388108362320, --0.142307897164276080, -0.142258405864420100, -0.142208914208917650, -0.142159422197893380, -0.142109929831470560, -0.142060437109772900, -0.142010944032923690, -0.141961450601047590, --0.141911956814267850, -0.141862462672708220, -0.141812968176491970, -0.141763473325743770, -0.141713978120586890, -0.141664482561145060, -0.141614986647541570, -0.141565490379901040, --0.141515993758346810, -0.141466496783002600, -0.141416999453991690, -0.141367501771438750, -0.141318003735467020, -0.141268505346199860, -0.141219006603761880, -0.141169507508276370, --0.141120008059867100, -0.141070508258657360, -0.141021008104771810, -0.140971507598333710, -0.140922006739466870, -0.140872505528294560, -0.140823003964941430, -0.140773502049530790, --0.140723999782186390, -0.140674497163031570, -0.140624994192190910, -0.140575490869787790, -0.140525987195945950, -0.140476483170788670, -0.140426978794440660, -0.140377474067025170, --0.140327968988665590, -0.140278463559486500, -0.140228957779611250, -0.140179451649163620, -0.140129945168266910, -0.140080438337045780, -0.140030931155623570, -0.139981423624124020, --0.139931915742670470, -0.139882407511387560, -0.139832898930398660, -0.139783389999827480, -0.139733880719797390, -0.139684371090433050, -0.139634861111857800, -0.139585350784195370, --0.139535840107569140, -0.139486329082103730, -0.139436817707922520, -0.139387305985148810, -0.139337793913907270, -0.139288281494321260, -0.139238768726514530, -0.139189255610610460, --0.139139742146733690, -0.139090228335007530, -0.139040714175555830, -0.138991199668501900, -0.138941684813970430, -0.138892169612084730, -0.138842654062968580, -0.138793138166745380, --0.138743621923539780, -0.138694105333475120, -0.138644588396675210, -0.138595071113263360, -0.138545553483364280, -0.138496035507101320, -0.138446517184598270, -0.138396998515978500, --0.138347479501366670, -0.138297960140886130, -0.138248440434660250, -0.138198920382813730, -0.138149399985469910, -0.138099879242752550, -0.138050358154785090, -0.138000836721692170, --0.137951314943597140, -0.137901792820623810, -0.137852270352895600, -0.137802747540537120, -0.137753224383671800, -0.137703700882423400, -0.137654177036915320, -0.137604652847272220, --0.137555128313617490, -0.137505603436074960, -0.137456078214767960, -0.137406552649821210, -0.137357026741358080, -0.137307500489501970, -0.137257973894377520, -0.137208446956108120, --0.137158919674817640, -0.137109392050629390, -0.137059864083668100, -0.137010335774057190, -0.136960807121920410, -0.136911278127381160, -0.136861748790564170, -0.136812219111592800, --0.136762689090590920, -0.136713158727681830, -0.136663628022990310, -0.136614096976639700, -0.136564565588753880, -0.136515033859456180, -0.136465501788871320, -0.136415969377122750, --0.136366436624333790, -0.136316903530629170, -0.136267370096132300, -0.136217836320967010, -0.136168302205256690, -0.136118767749126040, -0.136069232952698490, -0.136019697816097850, --0.135970162339447530, -0.135920626522872230, -0.135871090366495360, -0.135821553870440790, -0.135772017034831880, -0.135722479859793380, -0.135672942345448660, -0.135623404491921590, --0.135573866299335570, -0.135524327767815340, -0.135474788897484270, -0.135425249688465810, -0.135375710140884650, -0.135326170254864210, -0.135276630030528370, -0.135227089468000490, --0.135177548567405330, -0.135128007328866290, -0.135078465752507260, -0.135028923838451610, -0.134979381586824070, -0.134929838997748100, -0.134880296071347520, -0.134830752807745790, --0.134781209207067570, -0.134731665269436360, -0.134682120994975980, -0.134632576383809850, -0.134583031436062730, -0.134533486151858030, -0.134483940531319620, -0.134434394574570900, --0.134384848281736660, -0.134335301652940280, -0.134285754688305200, -0.134236207387956190, -0.134186659752016660, -0.134137111780610470, -0.134087563473861080, -0.134038014831893200, --0.133988465854830290, -0.133938916542796220, -0.133889366895914410, -0.133839816914309630, -0.133790266598105310, -0.133740715947425310, -0.133691164962393080, -0.133641613643133400, --0.133592061989769670, -0.133542510002425780, -0.133492957681225180, -0.133443405026292650, -0.133393852037751590, -0.133344298715725450, -0.133294745060339000, -0.133245191071715700, --0.133195636749979420, -0.133146082095253610, -0.133096527107663040, -0.133046971787331130, -0.132997416134381820, -0.132947860148938500, -0.132898303831126000, -0.132848747181067710, --0.132799190198887580, -0.132749632884709010, -0.132700075238656820, -0.132650517260854420, -0.132600958951425730, -0.132551400310494230, -0.132501841338184660, -0.132452282034620480, --0.132402722399925150, -0.132353162434223460, -0.132303602137638840, -0.132254041510295240, -0.132204480552316090, -0.132154919263826190, -0.132105357644948990, -0.132055795695808390, --0.132006233416527840, -0.131956670807232170, -0.131907107868044830, -0.131857544599089690, -0.131807981000490270, -0.131758417072371350, -0.131708852814856360, -0.131659288228069240, --0.131609723312133470, -0.131560158067173830, -0.131510592493313820, -0.131461026590677290, -0.131411460359387780, -0.131361893799570060, -0.131312326911347590, -0.131262759694843860, --0.131213192150183680, -0.131163624277490510, -0.131114056076888280, -0.131064487548500470, -0.131014918692451910, -0.130965349508866010, -0.130915779997866770, -0.130866210159577640, --0.130816639994123410, -0.130767069501627560, -0.130717498682214080, -0.130667927536006370, -0.130618356063129330, -0.130568784263706360, -0.130519212137861440, -0.130469639685718060, --0.130420066907401020, -0.130370493803033780, -0.130320920372739900, -0.130271346616644160, -0.130221772534870020, -0.130172198127541490, -0.130122623394782010, -0.130073048336716400, --0.130023472953468190, -0.129973897245161290, -0.129924321211919190, -0.129874744853866740, -0.129825168171127440, -0.129775591163825200, -0.129726013832083540, -0.129676436176027310, --0.129626858195779960, -0.129577279891465470, -0.129527701263207370, -0.129478122311130430, -0.129428543035358200, -0.129378963436014150, -0.129329383513223150, -0.129279803267108690, --0.129230222697794720, -0.129180641805404760, -0.129131060590063600, -0.129081479051894820, -0.129031897191022340, -0.128982315007569680, -0.128932732501661680, -0.128883149673421820, --0.128833566522974120, -0.128783983050442030, -0.128734399255950450, -0.128684815139622850, -0.128635230701583230, -0.128585645941955070, -0.128536060860863250, -0.128486475458431280, --0.128436889734783120, -0.128387303690042310, -0.128337717324333660, -0.128288130637780720, -0.128238543630507020, -0.128188956302637410, -0.128139368654295400, -0.128089780685604950, --0.128040192396689620, -0.127990603787674270, -0.127941014858682390, -0.127891425609837990, -0.127841836041264560, -0.127792246153086990, -0.127742655945428800, -0.127693065418413990, --0.127643474572166070, -0.127593883406809880, -0.127544291922469020, -0.127494700119267390, -0.127445107997328610, -0.127395515556777470, -0.127345922797737540, -0.127296329720332390, --0.127246736324686830, -0.127197142610924440, -0.127147548579169180, -0.127097954229544650, -0.127048359562175640, -0.126998764577185730, -0.126949169274698900, -0.126899573654838730, --0.126849977717730070, -0.126800381463496450, -0.126750784892261880, -0.126701188004149900, -0.126651590799285400, -0.126601993277791920, -0.126552395439793460, -0.126502797285413580, --0.126453198814777120, -0.126403600028007680, -0.126354000925228800, -0.126304401506565360, -0.126254801772140910, -0.126205201722079470, -0.126155601356504580, -0.126106000675541120, --0.126056399679312650, -0.126006798367943210, -0.125957196741556310, -0.125907594800276860, -0.125857992544228410, -0.125808389973535000, -0.125758787088320170, -0.125709183888708830, --0.125659580374824500, -0.125609976546791240, -0.125560372404732580, -0.125510767948773440, -0.125461163179037380, -0.125411558095647970, -0.125361952698730100, -0.125312346988407370, --0.125262740964803750, -0.125213134628042840, -0.125163527978249560, -0.125113921015547440, -0.125064313740060500, -0.125014706151912350, -0.124965098251227880, -0.124915490038130670, --0.124865881512744720, -0.124816272675193630, -0.124766663525602310, -0.124717054064094320, -0.124667444290793700, -0.124617834205824020, -0.124568223809310210, -0.124518613101375820, --0.124469002082144910, -0.124419390751741060, -0.124369779110289170, -0.124320167157912820, -0.124270554894735620, -0.124220942320882470, -0.124171329436476980, -0.124121716241643160, --0.124072102736504600, -0.124022488921186220, -0.123972874795811640, -0.123923260360504860, -0.123873645615389480, -0.123824030560590420, -0.123774415196231310, -0.123724799522436150, --0.123675183539328550, -0.123625567247033430, -0.123575950645674390, -0.123526333735375480, -0.123476716516260300, -0.123427098988453750, -0.123377481152079470, -0.123327863007261030, --0.123278244554123400, -0.123228625792790130, -0.123179006723385320, -0.123129387346032540, -0.123079767660856740, -0.123030147667981510, -0.122980527367530910, -0.122930906759628560, --0.122881285844399380, -0.122831664621966980, -0.122782043092455430, -0.122732421255988320, -0.122682799112690600, -0.122633176662685890, -0.122583553906098240, -0.122533930843051250, --0.122484307473669880, -0.122434683798077750, -0.122385059816398470, -0.122335435528756980, -0.122285810935276880, -0.122236186036082270, -0.122186560831296750, -0.122136935321045280, --0.122087309505451460, -0.122037683384639370, -0.121988056958732630, -0.121938430227856190, -0.121888803192133670, -0.121839175851689140, -0.121789548206646240, -0.121739920257129920, --0.121690292003263770, -0.121640663445171910, -0.121591034582977940, -0.121541405416806830, -0.121491775946782220, -0.121442146173028150, -0.121392516095668280, -0.121342885714827560, --0.121293255030629630, -0.121243624043198120, -0.121193992752657990, -0.121144361159132880, -0.121094729262746860, -0.121045097063623580, -0.120995464561888010, -0.120945831757663750, --0.120896198651074940, -0.120846565242245170, -0.120796931531299450, -0.120747297518361390, -0.120697663203555090, -0.120648028587004190, -0.120598393668833650, -0.120548758449167130, --0.120499122928128710, -0.120449487105842050, -0.120399850982432120, -0.120350214558022560, -0.120300577832737010, -0.120250940806700470, -0.120201303480036560, -0.120151665852869400, --0.120102027925322650, -0.120052389697521260, -0.120002751169588890, -0.119953112341649650, -0.119903473213827190, -0.119853833786246480, -0.119804194059031190, -0.119754554032305410, --0.119704913706192810, -0.119655273080818360, -0.119605632156305740, -0.119555990932779020, -0.119506349410361900, -0.119456707589179340, -0.119407065469355010, -0.119357423051012570, --0.119307780334277020, -0.119258137319272030, -0.119208494006121680, -0.119158850394949670, -0.119109206485880960, -0.119059562279039230, -0.119009917774548610, -0.118960272972532750, --0.118910627873116640, -0.118860982476423970, -0.118811336782578840, -0.118761690791704930, -0.118712044503927240, -0.118662397919369430, -0.118612751038155620, -0.118563103860409500, --0.118513456386256060, -0.118463808615818980, -0.118414160549221940, -0.118364512186589930, -0.118314863528046640, -0.118265214573716210, -0.118215565323722280, -0.118165915778189880, --0.118116265937242710, -0.118066615801004860, -0.118016965369600030, -0.117967314643153230, -0.117917663621788140, -0.117868012305628910, -0.117818360694799190, -0.117768708789424010, --0.117719056589627060, -0.117669404095532460, -0.117619751307263920, -0.117570098224946450, -0.117520444848703720, -0.117470791178659880, -0.117421137214938620, -0.117371482957664960, --0.117321828406962610, -0.117272173562955220, -0.117222518425767850, -0.117172862995524190, -0.117123207272348360, -0.117073551256364080, -0.117023894947696360, -0.116974238346468900, --0.116924581452805850, -0.116874924266830910, -0.116825266788669090, -0.116775609018444100, -0.116725950956280090, -0.116676292602300770, -0.116626633956631160, -0.116576975019394960, --0.116527315790716320, -0.116477656270718950, -0.116427996459527880, -0.116378336357266830, -0.116328675964059480, -0.116279015280030900, -0.116229354305304760, -0.116179693040005250, --0.116130031484256060, -0.116080369638182250, -0.116030707501907500, -0.115981045075555980, -0.115931382359251410, -0.115881719353118820, -0.115832056057281930, -0.115782392471864910, --0.115732728596991460, -0.115683064432786640, -0.115633399979374150, -0.115583735236878160, -0.115534070205422400, -0.115484404885131900, -0.115434739276130390, -0.115385073378541580, --0.115335407192490540, -0.115285740718100980, -0.115236073955497060, -0.115186406904802520, -0.115136739566142400, -0.115087071939640430, -0.115037404025420800, -0.114987735823607200, --0.114938067334324700, -0.114888398557697040, -0.114838729493848380, -0.114789060142902450, -0.114739390504984330, -0.114689720580217720, -0.114640050368726810, -0.114590379870635330, --0.114540709086068340, -0.114491038015149580, -0.114441366658003220, -0.114391695014753020, -0.114342023085524010, -0.114292350870439940, -0.114242678369624570, -0.114193005583202920, --0.114143332511298770, -0.114093659154036280, -0.114043985511539210, -0.113994311583932630, -0.113944637371340250, -0.113894962873886270, -0.113845288091694460, -0.113795613024889870, --0.113745937673596240, -0.113696262037937770, -0.113646586118038200, -0.113596909914022600, -0.113547233426014750, -0.113497556654138800, -0.113447879598518510, -0.113398202259278980, --0.113348524636543920, -0.113298846730437120, -0.113249168541083650, -0.113199490068607260, -0.113149811313132130, -0.113100132274782050, -0.113050452953682070, -0.113000773349955950, --0.112951093463727910, -0.112901413295121700, -0.112851732844262380, -0.112802052111273740, -0.112752371096279960, -0.112702689799404810, -0.112653008220773380, -0.112603326360509450, --0.112553644218737180, -0.112503961795580370, -0.112454279091164090, -0.112404596105612110, -0.112354912839048210, -0.112305229291597460, -0.112255545463383640, -0.112205861354530950, --0.112156176965163180, -0.112106492295405400, -0.112056807345381380, -0.112007122115215350, -0.111957436605031090, -0.111907750814953660, -0.111858064745106860, -0.111808378395614890, --0.111758691766601540, -0.111709004858191890, -0.111659317670509750, -0.111609630203679300, -0.111559942457824340, -0.111510254433069960, -0.111460566129539950, -0.111410877547358080, --0.111361188686649460, -0.111311499547537860, -0.111261810130147520, -0.111212120434602210, -0.111162430461027040, -0.111112740209545800, -0.111063049680282700, -0.111013358873361540, --0.110963667788907430, -0.110913976427044130, -0.110864284787895910, -0.110814592871586530, -0.110764900678241100, -0.110715208207983430, -0.110665515460937740, -0.110615822437227810, --0.110566129136978770, -0.110516435560314420, -0.110466741707358970, -0.110417047578236230, -0.110367353173071290, -0.110317658491987990, -0.110267963535110110, -0.110218268302562730, --0.110168572794469700, -0.110118877010955240, -0.110069180952143140, -0.110019484618158540, -0.109969788009125210, -0.109920091125167430, -0.109870393966408980, -0.109820696532974970, --0.109770998824989220, -0.109721300842575990, -0.109671602585859050, -0.109621904054963550, -0.109572205250013290, -0.109522506171132520, -0.109472806818445040, -0.109423107192075990, --0.109373407292149170, -0.109323707118788390, -0.109274006672118770, -0.109224305952264150, -0.109174604959348760, -0.109124903693496420, -0.109075202154832250, -0.109025500343480090, --0.108975798259564170, -0.108926095903208310, -0.108876393274537660, -0.108826690373676020, -0.108776987200747670, -0.108727283755876400, -0.108677580039187360, -0.108627876050804370, --0.108578171790851690, -0.108528467259453140, -0.108478762456733870, -0.108429057382817680, -0.108379352037828420, -0.108329646421891200, -0.108279940535129890, -0.108230234377668710, --0.108180527949631510, -0.108130821251143430, -0.108081114282328310, -0.108031407043310380, -0.107981699534213510, -0.107931991755162830, -0.107882283706282150, -0.107832575387695780, --0.107782866799527530, -0.107733157941902550, -0.107683448814944680, -0.107633739418778180, -0.107584029753526910, -0.107534319819315980, -0.107484609616269270, -0.107434899144511030, --0.107385188404165100, -0.107335477395356630, -0.107285766118209490, -0.107236054572847480, -0.107186342759395770, -0.107136630677978210, -0.107086918328719070, -0.107037205711742190, --0.106987492827172740, -0.106937779675134560, -0.106888066255751940, -0.106838352569148700, -0.106788638615450020, -0.106738924394779750, -0.106689209907262160, -0.106639495153021110, --0.106589780132181760, -0.106540064844867970, -0.106490349291204020, -0.106440633471313730, -0.106390917385322320, -0.106341201033353610, -0.106291484415531460, -0.106241767531981040, --0.106192050382826200, -0.106142332968191230, -0.106092615288199990, -0.106042897342977660, -0.105993179132648070, -0.105943460657335540, -0.105893741917163910, -0.105844022912258390, --0.105794303642742800, -0.105744584108741440, -0.105694864310378180, -0.105645144247778210, -0.105595423921065380, -0.105545703330363990, -0.105495982475797900, -0.105446261357492290, --0.105396539975571020, -0.105346818330157980, -0.105297096421378330, -0.105247374249355930, -0.105197651814215090, -0.105147929116079690, -0.105098206155074900, -0.105048482931324600, --0.104998759444953100, -0.104949035696084240, -0.104899311684843250, -0.104849587411353970, -0.104799862875740740, -0.104750138078127400, -0.104700413018639150, -0.104650687697399870, --0.104600962114533870, -0.104551236270165030, -0.104501510164418540, -0.104451783797418280, -0.104402057169288100, -0.104352330280153230, -0.104302603130137530, -0.104252875719365340, --0.104203148047960490, -0.104153420116048240, -0.104103691923752420, -0.104053963471197390, -0.104004234758506980, -0.103954505785806450, -0.103904776553219640, -0.103855047060870900, --0.103805317308884090, -0.103755587297384450, -0.103705857026495820, -0.103656126496342550, -0.103606395707048530, -0.103556664658738960, -0.103506933351537720, -0.103457201785569160, --0.103407469960957150, -0.103357737877826900, -0.103308005536302320, -0.103258272936507270, -0.103208540078566990, -0.103158806962605350, -0.103109073588746700, -0.103059339957114910, --0.103009606067835230, -0.102959871921031520, -0.102910137516828150, -0.102860402855348980, -0.102810667936719240, -0.102760932761062840, -0.102711197328504100, -0.102661461639166940, --0.102611725693176560, -0.102561989490656850, -0.102512253031732180, -0.102462516316526450, -0.102412779345164850, -0.102363042117771310, -0.102313304634469720, -0.102263566895385310, --0.102213828900641980, -0.102164090650364090, -0.102114352144675530, -0.102064613383701530, -0.102014874367565980, -0.101965135096393270, -0.101915395570307250, -0.101865655789433210, --0.101815915753895020, -0.101766175463817040, -0.101716434919323180, -0.101666694120538680, -0.101616953067587430, -0.101567211760593810, -0.101517470199681710, -0.101467728384976390, --0.101417986316601750, -0.101368243994681680, -0.101318501419341470, -0.101268758590704990, -0.101219015508896610, -0.101169272174040260, -0.101119528586261160, -0.101069784745683250, --0.101020040652430880, -0.100970296306627960, -0.100920551708399740, -0.100870806857870140, -0.100821061755163520, -0.100771316400403810, -0.100721570793716260, -0.100671824935224770, --0.100622078825053710, -0.100572332463327030, -0.100522585850169950, -0.100472838985706410, -0.100423091870060770, -0.100373344503356960, -0.100323596885720230, -0.100273849017274500, --0.100224100898143720, -0.100174352528453120, -0.100124603908326640, -0.100074855037888650, -0.100025105917263090, -0.099975356546575203, -0.099925606925948915, -0.099875857055508624, --0.099826106935378231, -0.099776356565683025, -0.099726605946546920, -0.099676855078094304, -0.099627103960449118, -0.099577352593736609, -0.099527600978080707, -0.099477849113605812, --0.099428097000435853, -0.099378344638696089, -0.099328592028510465, -0.099278839170002922, -0.099229086063298721, -0.099179332708521806, -0.099129579105796561, -0.099079825255246917, --0.099030071156998162, -0.098980316811174224, -0.098930562217899504, -0.098880807377297916, -0.098831052289494764, -0.098781296954613990, -0.098731541372779966, -0.098681785544116635, --0.098632029468749299, -0.098582273146801888, -0.098532516578398788, -0.098482759763663955, -0.098433002702722663, -0.098383245395698871, -0.098333487842716519, -0.098283730043900883, --0.098233971999375932, -0.098184213709266041, -0.098134455173695193, -0.098084696392788634, -0.098034937366670336, -0.097985178095464698, -0.097935418579295663, -0.097885658818288535, --0.097835898812567254, -0.097786138562256222, -0.097736378067479410, -0.097686617328362091, -0.097636856345028236, -0.097587095117602232, -0.097537333646208049, -0.097487571930970976, --0.097437809972014969, -0.097388047769463998, -0.097338285323443352, -0.097288522634076988, -0.097238759701489333, -0.097188996525804316, -0.097139233107147255, -0.097089469445642118, --0.097039705541413307, -0.096989941394584792, -0.096940177005281861, -0.096890412373628484, -0.096840647499749077, -0.096790882383767610, -0.096741117025809384, -0.096691351425998356, --0.096641585584458956, -0.096591819501315151, -0.096542053176692233, -0.096492286610714198, -0.096442519803505433, -0.096392752755189923, -0.096342985465892983, -0.096293217935738570, --0.096243450164850683, -0.096193682153354609, -0.096143913901374320, -0.096094145409034257, -0.096044376676458376, -0.095994607703772009, -0.095944838491099110, -0.095895069038564124, --0.095845299346291032, -0.095795529414405112, -0.095745759243030387, -0.095695988832291259, -0.095646218182311712, -0.095596447293217063, -0.095546676165131295, -0.095496904798178836, --0.095447133192483685, -0.095397361348171131, -0.095347589265365171, -0.095297816944189803, -0.095248044384770331, -0.095198271587230751, -0.095148498551695493, -0.095098725278288540, --0.095048951767135223, -0.094999178018359526, -0.094949404032085891, -0.094899629808438288, -0.094849855347542061, -0.094800080649521196, -0.094750305714500133, -0.094700530542602857, --0.094650755133954698, -0.094600979488679640, -0.094551203606902154, -0.094501427488746209, -0.094451651134337136, -0.094401874543798933, -0.094352097717255598, -0.094302320654832475, --0.094252543356653534, -0.094202765822843246, -0.094152988053525608, -0.094103210048825922, -0.094053431808868229, -0.094003653333776943, -0.093953874623676090, -0.093904095678690985, --0.093854316498945656, -0.093804537084564515, -0.093754757435671604, -0.093704977552392238, -0.093655197434850429, -0.093605417083170619, -0.093555636497476835, -0.093505855677894406, --0.093456074624547317, -0.093406293337560065, -0.093356511817056620, -0.093306730063162341, -0.093256948076001239, -0.093207165855697327, -0.093157383402375948, -0.093107600716161101, --0.093057817797177256, -0.093008034645548424, -0.092958251261399949, -0.092908467644855844, -0.092858683796040564, -0.092808899715078136, -0.092759115402093903, -0.092709330857211877, --0.092659546080556529, -0.092609761072251884, -0.092559975832423258, -0.092510190361194705, -0.092460404658690681, -0.092410618725035185, -0.092360832560353601, -0.092311046164769928, --0.092261259538408205, -0.092211472681393764, -0.092161685593850642, -0.092111898275903312, -0.092062110727675797, -0.092012322949293443, -0.091962534940880289, -0.091912746702560791, --0.091862958234458975, -0.091813169536700212, -0.091763380609408529, -0.091713591452708396, -0.091663802066723837, -0.091614012451580226, -0.091564222607401574, -0.091514432534312365, --0.091464642232436638, -0.091414851701899738, -0.091365060942825718, -0.091315269955338604, -0.091265478739563755, -0.091215687295625208, -0.091165895623647436, -0.091116103723754491, --0.091066311596071731, -0.091016519240723182, -0.090966726657833341, -0.090916933847526249, -0.090867140809927249, -0.090817347545160410, -0.090767554053350200, -0.090717760334620659, --0.090667966389097160, -0.090618172216903742, -0.090568377818164902, -0.090518583193004667, -0.090468788341548423, -0.090418993263920208, -0.090369197960244063, -0.090319402430645360, --0.090269606675248165, -0.090219810694176950, -0.090170014487555752, -0.090120218055509974, -0.090070421398163653, -0.090020624515641273, -0.089970827408066889, -0.089921030075565872, --0.089871232518262290, -0.089821434736280625, -0.089771636729744933, -0.089721838498780584, -0.089672040043511647, -0.089622241364062605, -0.089572442460557511, -0.089522643333121765, --0.089472843981879407, -0.089423044406954935, -0.089373244608472416, -0.089323444586557221, -0.089273644341333419, -0.089223843872925063, -0.089174043181457552, -0.089124242267054912, --0.089074441129841683, -0.089024639769941905, -0.088974838187480962, -0.088925036382582923, -0.088875234355372298, -0.088825432105973143, -0.088775629634510855, -0.088725826941109490, --0.088676024025893557, -0.088626220888987126, -0.088576417530515580, -0.088526613950602989, -0.088476810149373863, -0.088427006126952284, -0.088377201883463610, -0.088327397419031950, --0.088277592733781343, -0.088227787827837204, -0.088177982701323585, -0.088128177354365012, -0.088078371787085566, -0.088028565999610620, -0.087978759992064254, -0.087928953764571008, --0.087879147317254921, -0.087829340650241408, -0.087779533763654549, -0.087729726657618856, -0.087679919332258396, -0.087630111787698584, -0.087580304024063499, -0.087530496041477640, --0.087480687840065116, -0.087430879419951299, -0.087381070781260298, -0.087331261924116166, -0.087281452848644331, -0.087231643554968846, -0.087181834043214265, -0.087132024313504669, --0.087082214365965430, -0.087032404200720670, -0.086982593817894902, -0.086932783217612206, -0.086882972399997982, -0.086833161365176340, -0.086783350113271790, -0.086733538644408414, --0.086683726958711654, -0.086633915056305563, -0.086584102937314680, -0.086534290601863101, -0.086484478050076252, -0.086434665282078188, -0.086384852297993475, -0.086335039097946181, --0.086285225682061734, -0.086235412050464227, -0.086185598203277744, -0.086135784140627697, -0.086085969862638209, -0.086036155369433778, -0.085986340661138527, -0.085936525737877870, --0.085886710599775887, -0.085836895246957146, -0.085787079679545700, -0.085737263897667018, -0.085687447901445168, -0.085637631691004704, -0.085587815266469705, -0.085537998627965614, --0.085488181775616540, -0.085438364709546993, -0.085388547429881112, -0.085338729936744295, -0.085288912230260652, -0.085239094310554278, -0.085189276177750628, -0.085139457831973769, --0.085089639273348283, -0.085039820501998251, -0.084990001518049099, -0.084940182321624952, -0.084890362912850362, -0.084840543291849396, -0.084790723458747538, -0.084740903413668855, --0.084691083156737929, -0.084641262688078839, -0.084591442007817041, -0.084541621116076632, -0.084491800012982177, -0.084441978698657771, -0.084392157173228871, -0.084342335436819571, --0.084292513489553994, -0.084242691331557581, -0.084192868962954429, -0.084143046383869116, -0.084093223594425739, -0.084043400594749740, -0.083993577384965240, -0.083943753965196807, --0.083893930335568537, -0.083844106496205884, -0.083794282447232971, -0.083744458188774351, -0.083694633720954134, -0.083644809043897789, -0.083594984157729410, -0.083545159062573579, --0.083495333758554405, -0.083445508245797342, -0.083395682524426501, -0.083345856594566017, -0.083296030456341333, -0.083246204109876570, -0.083196377555296297, -0.083146550792724636, --0.083096723822287041, -0.083046896644107637, -0.082997069258311004, -0.082947241665021237, -0.082897413864363820, -0.082847585856462860, -0.082797757641442940, -0.082747929219428182, --0.082698100590544055, -0.082648271754914668, -0.082598442712664588, -0.082548613463917980, -0.082498784008800272, -0.082448954347435599, -0.082399124479948543, -0.082349294406463242, --0.082299464127105135, -0.082249633641998374, -0.082199802951267095, -0.082149972055036741, -0.082100140953431461, -0.082050309646575822, -0.082000478134593963, -0.081950646417611364, --0.081900814495752150, -0.081850982369140887, -0.081801150037901726, -0.081751317502160151, -0.081701484762040269, -0.081651651817666676, -0.081601818669163509, -0.081551985316656236, --0.081502151760269009, -0.081452318000126395, -0.081402484036352543, -0.081352649869072924, -0.081302815498411687, -0.081252980924492957, -0.081203146147442229, -0.081153311167383627, --0.081103475984441759, -0.081053640598740748, -0.081003805010406077, -0.080953969219561897, -0.080904133226332803, -0.080854297030842917, -0.080804460633217737, -0.080754624033581413, --0.080704787232058525, -0.080654950228773226, -0.080605113023850983, -0.080555275617415975, -0.080505438009592770, -0.080455600200505531, -0.080405762190279728, -0.080355923979039526, --0.080306085566909061, -0.080256246954013830, -0.080206408140477983, -0.080156569126426117, -0.080106729911982380, -0.080056890497272271, -0.080007050882419925, -0.079957211067549966, --0.079907371052786530, -0.079857530838255100, -0.079807690424079855, -0.079757849810385376, -0.079708008997295826, -0.079658167984936704, -0.079608326773432159, -0.079558485362906800, --0.079508643753484792, -0.079458801945291604, -0.079408959938451415, -0.079359117733088833, -0.079309275329328008, -0.079259432727294438, -0.079209589927112287, -0.079159746928905719, --0.079109903732800219, -0.079060060338919977, -0.079010216747389561, -0.078960372958333178, -0.078910528971876295, -0.078860684788143107, -0.078810840407258193, -0.078760995829345731, --0.078711151054531234, -0.078661306082938851, -0.078611460914693204, -0.078561615549918459, -0.078511769988740127, -0.078461924231282371, -0.078412078277669786, -0.078362232128026579, --0.078312385782478233, -0.078262539241148926, -0.078212692504162823, -0.078162845571645420, -0.078112998443720924, -0.078063151120513916, -0.078013303602148601, -0.077963455888750463, --0.077913607980443680, -0.077863759877352876, -0.077813911579602241, -0.077764063087317259, -0.077714214400622136, -0.077664365519641454, -0.077614516444499432, -0.077564667175321553, --0.077514817712232009, -0.077464968055355424, -0.077415118204815975, -0.077365268160739173, -0.077315417923249197, -0.077265567492470238, -0.077215716868527809, -0.077165866051546073, --0.077116015041649680, -0.077066163838962809, -0.077016312443610971, -0.076966460855718344, -0.076916609075409578, -0.076866757102808839, -0.076816904938041650, -0.076767052581232190, --0.076717200032505109, -0.076667347291984586, -0.076617494359796132, -0.076567641236063938, -0.076517787920912655, -0.076467934414466449, -0.076418080716850856, -0.076368226828190056, --0.076318372748608254, -0.076268518478230948, -0.076218664017182358, -0.076168809365587106, -0.076118954523569385, -0.076069099491254732, -0.076019244268767314, -0.075969388856231793, --0.075919533253772362, -0.075869677461514531, -0.075819821479582508, -0.075769965308100928, -0.075720108947193998, -0.075670252396987242, -0.075620395657604852, -0.075570538729171480, --0.075520681611811302, -0.075470824305649872, -0.075420966810811382, -0.075371109127420469, -0.075321251255601351, -0.075271393195479541, -0.075221534947179244, -0.075171676510824681, --0.075121817886541362, -0.075071959074453493, -0.075022100074685724, -0.074972240887362276, -0.074922381512608660, -0.074872521950549081, -0.074822662201308218, -0.074772802265010235, --0.074722942141780699, -0.074673081831743815, -0.074623221335024220, -0.074573360651746134, -0.074523499782035083, -0.074473638726015284, -0.074423777483811390, -0.074373916055547606, --0.074324054441349471, -0.074274192641341205, -0.074224330655647014, -0.074174468484392436, -0.074124606127701692, -0.074074743585699432, -0.074024880858509876, -0.073975017946258548, --0.073925154849069682, -0.073875291567067930, -0.073825428100377510, -0.073775564449123948, -0.073725700613431491, -0.073675836593424776, -0.073625972389228023, -0.073576108000966783, --0.073526243428765278, -0.073476378672748172, -0.073426513733039656, -0.073376648609765310, -0.073326783303049342, -0.073276917813015971, -0.073227052139790749, -0.073177186283497897, --0.073127320244262092, -0.073077454022207528, -0.073027587617459769, -0.072977721030143050, -0.072927854260382022, -0.072877987308300932, -0.072828120174025290, -0.072778252857679374, --0.072728385359387804, -0.072678517679274843, -0.072628649817466029, -0.072578781774085582, -0.072528913549258181, -0.072479045143108059, -0.072429176555760769, -0.072379307787340530, --0.072329438837972021, -0.072279569707779476, -0.072229700396888460, -0.072179830905423181, -0.072129961233507886, -0.072080091381268127, -0.072030221348828138, -0.071980351136312598, --0.071930480743845740, -0.071880610171553130, -0.071830739419558975, -0.071780868487987995, -0.071730997376964381, -0.071681126086613728, -0.071631254617060255, -0.071581382968428642, --0.071531511140843135, -0.071481639134429287, -0.071431766949311346, -0.071381894585613989, -0.071332022043461452, -0.071282149322979299, -0.071232276424291779, -0.071182403347523127, --0.071132530092798907, -0.071082656660243354, -0.071032783049981160, -0.070982909262136573, -0.070933035296835159, -0.070883161154201138, -0.070833286834359230, -0.070783412337433654, --0.070733537663550006, -0.070683662812832504, -0.070633787785405841, -0.070583912581394265, -0.070534037200923355, -0.070484161644117346, -0.070434285911100944, -0.070384410001998368, --0.070334533916935227, -0.070284657656035740, -0.070234781219424169, -0.070184904607226095, -0.070135027819565751, -0.070085150856567843, -0.070035273718356605, -0.069985396405057645, --0.069935518916795170, -0.069885641253693911, -0.069835763415878105, -0.069785885403473330, -0.069736007216603849, -0.069686128855394353, -0.069636250319969076, -0.069586371610453626, --0.069536492726972252, -0.069486613669649630, -0.069436734438610051, -0.069386855033979067, -0.069336975455880939, -0.069287095704440388, -0.069237215779781647, -0.069187335682030310, --0.069137455411310625, -0.069087574967746868, -0.069037694351464618, -0.068987813562588138, -0.068937932601242105, -0.068888051467550809, -0.068838170161639831, -0.068788288683633431, --0.068738407033656301, -0.068688525211832704, -0.068638643218288248, -0.068588761053147179, -0.068538878716534204, -0.068488996208573599, -0.068439113529390944, -0.068389230679110499, --0.068339347657856986, -0.068289464465754651, -0.068239581102929103, -0.068189697569504604, -0.068139813865605414, -0.068089929991357129, -0.068040045946884037, -0.067990161732310817, --0.067940277347761743, -0.067890392793362425, -0.067840508069237124, -0.067790623175510559, -0.067740738112306992, -0.067690852879752017, -0.067640967477969910, -0.067591081907085390, --0.067541196167222720, -0.067491310258507506, -0.067441424181064011, -0.067391537935016954, -0.067341651520490611, -0.067291764937610590, -0.067241878186501153, -0.067191991267286574, --0.067142104180092449, -0.067092216925043080, -0.067042329502263159, -0.066992441911876977, -0.066942554154010139, -0.066892666228786909, -0.066842778136332007, -0.066792889876769734, --0.066743001450225659, -0.066693112856824097, -0.066643224096689740, -0.066593335169946893, -0.066543446076721136, -0.066493556817136770, -0.066443667391318517, -0.066393777799390652, --0.066343888041478782, -0.066293998117707184, -0.066244108028200160, -0.066194217773083305, -0.066144327352480908, -0.066094436766517689, -0.066044546015317937, -0.065994655099007260, --0.065944764017709948, -0.065894872771550733, -0.065844981360653879, -0.065795089785145033, -0.065745198045148445, -0.065695306140788862, -0.065645414072190586, -0.065595521839479212, --0.065545629442779030, -0.065495736882214772, -0.065445844157910729, -0.065395951269992522, -0.065346058218584441, -0.065296165003811205, -0.065246271625797117, -0.065196378084667786, --0.065146484380547529, -0.065096590513560607, -0.065046696483832642, -0.064996802291487951, -0.064946907936651241, -0.064897013419446828, -0.064847118740000320, -0.064797223898436021, --0.064747328894878664, -0.064697433729452539, -0.064647538402283267, -0.064597642913495151, -0.064547747263212926, -0.064497851451560895, -0.064447955478664679, -0.064398059344648567, --0.064348163049637322, -0.064298266593755204, -0.064248369977127878, -0.064198473199879619, -0.064148576262134743, -0.064098679164018860, -0.064048781905656285, -0.063998884487171753, --0.063948986908689567, -0.063899089170335363, -0.063849191272233430, -0.063799293214508529, -0.063749394997284936, -0.063699496620688301, -0.063649598084842940, -0.063599699389873560, --0.063549800535904505, -0.063499901523061397, -0.063450002351468526, -0.063400103021250639, -0.063350203532532068, -0.063300303885438419, -0.063250404080094025, -0.063200504116623160, --0.063150603995151489, -0.063100703715803313, -0.063050803278703368, -0.063000902683975971, -0.062951001931746770, -0.062901101022140055, -0.062851199955280587, -0.062801298731292685, --0.062751397350301968, -0.062701495812432770, -0.062651594117809822, -0.062601692266557443, -0.062551790258801282, -0.062501888094665656, -0.062451985774275298, -0.062402083297754533, --0.062352180665229004, -0.062302277876823027, -0.062252374932661350, -0.062202471832868297, -0.062152568577569504, -0.062102665166889288, -0.062052761600951974, -0.062002857879883196, --0.061952954003807272, -0.061903049972848963, -0.061853145787132580, -0.061803241446783785, -0.061753336951926883, -0.061703432302686635, -0.061653527499187365, -0.061603622541554721, --0.061553717429913023, -0.061503812164387030, -0.061453906745101060, -0.061404001172180769, -0.061354095445750476, -0.061304189565934947, -0.061254283532858493, -0.061204377346646778, --0.061154471007424119, -0.061104564515314840, -0.061054657870444597, -0.061004751072937700, -0.060954844122918933, -0.060904937020512612, -0.060855029765844386, -0.060805122359038587, --0.060755214800219989, -0.060705307089512904, -0.060655399227042994, -0.060605491212934591, -0.060555583047312456, -0.060505674730300926, -0.060455766262025645, -0.060405857642610951, --0.060355948872181618, -0.060306039950861964, -0.060256130878777653, -0.060206221656053015, -0.060156312282812381, -0.060106402759181408, -0.060056493085284435, -0.060006583261246221, --0.059956673287191106, -0.059906763163244760, -0.059856852889531499, -0.059806942466176106, -0.059757031893302913, -0.059707121171037582, -0.059657210299504451, -0.059607299278828296, --0.059557388109133448, -0.059507476790545570, -0.059457565323189007, -0.059407653707188528, -0.059357741942668470, -0.059307830029754496, -0.059257917968570953, -0.059208005759242170, --0.059158093401893819, -0.059108180896650230, -0.059058268243636192, -0.059008355442976036, -0.058958442494795441, -0.058908529399218736, -0.058858616156370704, -0.058808702766375689, --0.058758789229359371, -0.058708875545446071, -0.058658961714760580, -0.058609047737427249, -0.058559133613571734, -0.058509219343318389, -0.058459304926791994, -0.058409390364116895, --0.058359475655418769, -0.058309560800821947, -0.058259645800451225, -0.058209730654430941, -0.058159815362886780, -0.058109899925943079, -0.058059984343724183, -0.058010068616355770, --0.057960152743962184, -0.057910236726668222, -0.057860320564598215, -0.057810404257877861, -0.057760487806631490, -0.057710571210983899, -0.057660654471059440, -0.057610737586983783, --0.057560820558881287, -0.057510903386876741, -0.057460986071094490, -0.057411068611660218, -0.057361151008698277, -0.057311233262333450, -0.057261315372690108, -0.057211397339893909, --0.057161479164069225, -0.057111560845340401, -0.057061642383833114, -0.057011723779671723, -0.056961805032981018, -0.056911886143885364, -0.056861967112510431, -0.056812047938980585, --0.056762128623420616, -0.056712209165954888, -0.056662289566709073, -0.056612369825807543, -0.056562449943375080, -0.056512529919536050, -0.056462609754416145, -0.056412689448139708, --0.056362769000831550, -0.056312848412616030, -0.056262927683618826, -0.056213006813964309, -0.056163085803776831, -0.056113164653182078, -0.056063243362304414, -0.056013321931268643, --0.055963400360199124, -0.055913478649221547, -0.055863556798460272, -0.055813634808040108, -0.055763712678085414, -0.055713790408721875, -0.055663868000073870, -0.055613945452266188, --0.055564022765423202, -0.055514099939670596, -0.055464176975132749, -0.055414253871934452, -0.055364330630200083, -0.055314407250055327, -0.055264483731624556, -0.055214560075032573, --0.055164636280403752, -0.055114712347863776, -0.055064788277537025, -0.055014864069547857, -0.054964939724021972, -0.054915015241083741, -0.054865090620857968, -0.054815165863469031, --0.054765240969042617, -0.054715315937703103, -0.054665390769575294, -0.054615465464783568, -0.054565540023453624, -0.054515614445709834, -0.054465688731677002, -0.054415762881479500, --0.054365836895243040, -0.054315910773091988, -0.054265984515151161, -0.054216058121544924, -0.054166131592398990, -0.054116204927837724, -0.054066278127985506, -0.054016351192968035, --0.053966424122909681, -0.053916496917935271, -0.053866569578169175, -0.053816642103737100, -0.053766714494763418, -0.053716786751372946, -0.053666858873690070, -0.053616930861840488, --0.053567002715948574, -0.053517074436139157, -0.053467146022536612, -0.053417217475266648, -0.053367288794453634, -0.053317359980222405, -0.053267431032697328, -0.053217501952004115, --0.053167572738267152, -0.053117643391610812, -0.053067713912160808, -0.053017784300041511, -0.052967854555377766, -0.052917924678293933, -0.052867994668915730, -0.052818064527367550, --0.052768134253774197, -0.052718203848260071, -0.052668273310950885, -0.052618342641971010, -0.052568411841445277, -0.052518480909498066, -0.052468549846255104, -0.052418618651840769, --0.052368687326379885, -0.052318755869996833, -0.052268824282817344, -0.052218892564965785, -0.052168960716566563, -0.052119028737745376, -0.052069096628626611, -0.052019164389335112, --0.051969232019995260, -0.051919299520732771, -0.051869366891672028, -0.051819434132937874, -0.051769501244654688, -0.051719568226948190, -0.051669635079942773, -0.051619701803763268, --0.051569768398534069, -0.051519834864380887, -0.051469901201428123, -0.051419967409800607, -0.051370033489622720, -0.051320099441020200, -0.051270165264117429, -0.051220230959039249, --0.051170296525910042, -0.051120361964855539, -0.051070427276000134, -0.051020492459468214, -0.050970557515385512, -0.050920622443876414, -0.050870687245065757, -0.050820751919077936, --0.050770816466038683, -0.050720880886072392, -0.050670945179303893, -0.050621009345857587, -0.050571073385859207, -0.050521137299433139, -0.050471201086704227, -0.050421264747796873, --0.050371328282836796, -0.050321391691948401, -0.050271454975256528, -0.050221518132885570, -0.050171581164961267, -0.050121644071608004, -0.050071706852950190, -0.050021769509113558, --0.049971832040222493, -0.049921894446401854, -0.049871956727776029, -0.049822018884470763, -0.049772080916610451, -0.049722142824319929, -0.049672204607723612, -0.049622266266947226, --0.049572327802115172, -0.049522389213352301, -0.049472450500783006, -0.049422511664533035, -0.049372572704726787, -0.049322633621489108, -0.049272694414944397, -0.049222755085218395, --0.049172815632435501, -0.049122876056720131, -0.049072936358198010, -0.049022996536993553, -0.048973056593231604, -0.048923116527036563, -0.048873176338534184, -0.048823236027848854, --0.048773295595105438, -0.048723355040428344, -0.048673414363943304, -0.048623473565774726, -0.048573532646047461, -0.048523591604885931, -0.048473650442415854, -0.048423709158761659, --0.048373767754048190, -0.048323826228399855, -0.048273884581942400, -0.048223942814800233, -0.048174000927098205, -0.048124058918960738, -0.048074116790513564, -0.048024174541881098, --0.047974232173187754, -0.047924289684559272, -0.047874347076120066, -0.047824404347994988, -0.047774461500308459, -0.047724518533186225, -0.047674575446752687, -0.047624632241132711, --0.047574688916450718, -0.047524745472832440, -0.047474801910402299, -0.047424858229285154, -0.047374914429605418, -0.047324970511488845, -0.047275026475059843, -0.047225082320443271, --0.047175138047763555, -0.047125193657146437, -0.047075249148716330, -0.047025304522597663, -0.046975359778916176, -0.046925414917796282, -0.046875469939362861, -0.046825524843740321, --0.046775579631054408, -0.046725634301429543, -0.046675688854990599, -0.046625743291861990, -0.046575797612169463, -0.046525851816037439, -0.046475905903590790, -0.046425959874953932, --0.046376013730252616, -0.046326067469611265, -0.046276121093154751, -0.046226174601007489, -0.046176227993295231, -0.046126281270142400, -0.046076334431673430, -0.046026387478014061, --0.045976440409288728, -0.045926493225622290, -0.045876545927139183, -0.045826598513965144, -0.045776650986224618, -0.045726703344042462, -0.045676755587543104, -0.045626807716852298, --0.045576859732094473, -0.045526911633394500, -0.045476963420876808, -0.045427015094667143, -0.045377066654889948, -0.045327118101670082, -0.045277169435131978, -0.045227220655401391, --0.045177271762602757, -0.045127322756860502, -0.045077373638300375, -0.045027424407046823, -0.044977475063224706, -0.044927525606958459, -0.044877576038373841, -0.044827626357595282, --0.044777676564747661, -0.044727726659955398, -0.044677776643344269, -0.044627826515038695, -0.044577876275163554, -0.044527925923843276, -0.044477975461203634, -0.044428024887369050, --0.044378074202464403, -0.044328123406614128, -0.044278172499943987, -0.044228221482578413, -0.044178270354642286, -0.044128319116260042, -0.044078367767557448, -0.044028416308658926, --0.043978464739688923, -0.043928513060773201, -0.043878561272036203, -0.043828609373602792, -0.043778657365597419, -0.043728705248145844, -0.043678753021372509, -0.043628800685402293, --0.043578848240359624, -0.043528895686370285, -0.043478943023558703, -0.043428990252049771, -0.043379037371967910, -0.043329084383438903, -0.043279131286587183, -0.043229178081537638, --0.043179224768414702, -0.043129271347344150, -0.043079317818450417, -0.043029364181857946, -0.042979410437692510, -0.042929456586078552, -0.042879502627140943, -0.042829548561004141, --0.042779594387793912, -0.042729640107634692, -0.042679685720651374, -0.042629731226968400, -0.042579776626711537, -0.042529821920005234, -0.042479867106974378, -0.042429912187743411, --0.042379957162438107, -0.042330002031182909, -0.042280046794102702, -0.042230091451321942, -0.042180136002966391, -0.042130180449160504, -0.042080224790028722, -0.042030269025696815, --0.041980313156289244, -0.041930357181930888, -0.041880401102746191, -0.041830444918860940, -0.041780488630399577, -0.041730532237486989, -0.041680575740247632, -0.041630619138807272, --0.041580662433290366, -0.041530705623821808, -0.041480748710526039, -0.041430791693528847, -0.041380834572954668, -0.041330877348928409, -0.041280920021574505, -0.041230962591018751, --0.041181005057385589, -0.041131047420799920, -0.041081089681386178, -0.041031131839270166, -0.040981173894576318, -0.040931215847429092, -0.040881257697954275, -0.040831299446276309, --0.040781341092520094, -0.040731382636810080, -0.040681424079272062, -0.040631465420030481, -0.040581506659210231, -0.040531547796935775, -0.040481588833332895, -0.040431629768526038, --0.040381670602640106, -0.040331711335799561, -0.040281751968130178, -0.040231792499756412, -0.040181832930803164, -0.040131873261394897, -0.040081913491657385, -0.040031953621715091, --0.039981993651692471, -0.039932033581715307, -0.039882073411908060, -0.039832113142395632, -0.039782152773302472, -0.039732192304754381, -0.039682231736875802, -0.039632271069791648, --0.039582310303626377, -0.039532349438505768, -0.039482388474554285, -0.039432427411896828, -0.039382466250657867, -0.039332504990963177, -0.039282543632937234, -0.039232582176704923, --0.039182620622390717, -0.039132658970120401, -0.039082697220018434, -0.039032735372209290, -0.038982773426818745, -0.038932811383971262, -0.038882849243791762, -0.038832887006404686, --0.038782924671935837, -0.038732962240509677, -0.038682999712251115, -0.038633037087284612, -0.038583074365735957, -0.038533111547729613, -0.038483148633390495, -0.038433185622843057, --0.038383222516213102, -0.038333259313625086, -0.038283296015203923, -0.038233332621074083, -0.038183369131361347, -0.038133405546190192, -0.038083441865685082, -0.038033478089971810, --0.037983514219174841, -0.037933550253419088, -0.037883586192829014, -0.037833622037530414, -0.037783657787647765, -0.037733693443305967, -0.037683729004629497, -0.037633764471744144, --0.037583799844774383, -0.037533835123845123, -0.037483870309080826, -0.037433905400607301, -0.037383940398549018, -0.037333975303030877, -0.037284010114177354, -0.037234044832114253, --0.037184079456966036, -0.037134113988857617, -0.037084148427913480, -0.037034182774259405, -0.036984217028019878, -0.036934251189319367, -0.036884285258283668, -0.036834319235037258, --0.036784353119705050, -0.036734386912411515, -0.036684420613282455, -0.036634454222442346, -0.036584487740016103, -0.036534521166128195, -0.036484554500904424, -0.036434587744469268, --0.036384620896947648, -0.036334653958464025, -0.036284686929144216, -0.036234719809112692, -0.036184752598494359, -0.036134785297413707, -0.036084817905996540, -0.036034850424367319, --0.035984882852650536, -0.035934915190971986, -0.035884947439456145, -0.035834979598227942, -0.035785011667411840, -0.035735043647133653, -0.035685075537517860, -0.035635107338689381, --0.035585139050772686, -0.035535170673893585, -0.035485202208176560, -0.035435233653746533, -0.035385265010727973, -0.035335296279246690, -0.035285327459427175, -0.035235358551394341, --0.035185389555272659, -0.035135420471187957, -0.035085451299264700, -0.035035482039627364, -0.034985512692401778, -0.034935543257712399, -0.034885573735684169, -0.034835604126441565, --0.034785634430110388, -0.034735664646815122, -0.034685694776680702, -0.034635724819831598, -0.034585754776393626, -0.034535784646491263, -0.034485814430249444, -0.034435844127792645, --0.034385873739246675, -0.034335903264736026, -0.034285932704385617, -0.034235962058319927, -0.034185991326664784, -0.034136020509544659, -0.034086049607084480, -0.034036078619408737, --0.033986107546643239, -0.033936136388912477, -0.033886165146340928, -0.033836193819054408, -0.033786222407177401, -0.033736250910834840, -0.033686279330151211, -0.033636307665252323, --0.033586335916262672, -0.033536364083307180, -0.033486392166510330, -0.033436420165997946, -0.033386448081894511, -0.033336475914324953, -0.033286503663413763, -0.033236531329286757, --0.033186558912068426, -0.033136586411883696, -0.033086613828857053, -0.033036641163114326, -0.032986668414779992, -0.032936695583978541, -0.032886722670835804, -0.032836749675476250, --0.032786776598024828, -0.032736803438606014, -0.032686830197345640, -0.032636856874368195, -0.032586883469798600, -0.032536909983761353, -0.032486936416382277, -0.032436962767785862, --0.032386989038097037, -0.032337015227440299, -0.032287041335941465, -0.032237067363725030, -0.032187093310915925, -0.032137119177638639, -0.032087144964019002, -0.032037170670181504, --0.031987196296250631, -0.031937221842352218, -0.031887247308610742, -0.031837272695151159, -0.031787298002097938, -0.031737323229576925, -0.031687348377712601, -0.031637373446629903, --0.031587398436453334, -0.031537423347308705, -0.031487448179320525, -0.031437472932613716, -0.031387497607312791, -0.031337522203543557, -0.031287546721430526, -0.031237571161098619, --0.031187595522672348, -0.031137619806277529, -0.031087644012038659, -0.031037668140080237, -0.030987692190528087, -0.030937716163506709, -0.030887740059141040, -0.030837763877555574, --0.030787787618876145, -0.030737811283227248, -0.030687834870733819, -0.030637858381520361, -0.030587881815712703, -0.030537905173435336, -0.030487928454813209, -0.030437951659970819, --0.030387974789033989, -0.030337997842127224, -0.030288020819375466, -0.030238043720903211, -0.030188066546836291, -0.030138089297299202, -0.030088111972416894, -0.030038134572313861, --0.029988157097115935, -0.029938179546947614, -0.029888201921933404, -0.029838224222199131, -0.029788246447869298, -0.029738268599068848, -0.029688290675922283, -0.029638312678555434, --0.029588334607092807, -0.029538356461659341, -0.029488378242379539, -0.029438399949379235, -0.029388421582782934, -0.029338443142715578, -0.029288464629301670, -0.029238486042667045, --0.029188507382936203, -0.029138528650234096, -0.029088549844685219, -0.029038570966415416, -0.028988592015549181, -0.028938612992211024, -0.028888633896526780, -0.028838654728620950, --0.028788675488618482, -0.028738696176643885, -0.028688716792822987, -0.028638737337280298, -0.028588757810140770, -0.028538778211528899, -0.028488798541570527, -0.028438818800390162, --0.028388838988112744, -0.028338859104862790, -0.028288879150766128, -0.028238899125947271, -0.028188919030531168, -0.028138938864642318, -0.028088958628406571, -0.028038978321948422, --0.027988997945392387, -0.027939017498864301, -0.027889036982488669, -0.027839056396390446, -0.027789075740694134, -0.027739095015525583, -0.027689114221009292, -0.027639133357270213, --0.027589152424432859, -0.027539171422623070, -0.027489190351965349, -0.027439209212584654, -0.027389228004605491, -0.027339246728153702, -0.027289265383353797, -0.027239283970330725, --0.027189302489209005, -0.027139320940114467, -0.027089339323171632, -0.027039357638505446, -0.026989375886240421, -0.026939394066502403, -0.026889412179415897, -0.026839430225105418, --0.026789448203696806, -0.026739466115314577, -0.026689483960083679, -0.026639501738128631, -0.026589519449575268, -0.026539537094548111, -0.026489554673172107, -0.026439572185571775, --0.026389589631872955, -0.026339607012200162, -0.026289624326678352, -0.026239641575432036, -0.026189658758587062, -0.026139675876267938, -0.026089692928599625, -0.026039709915706640, --0.025989726837714819, -0.025939743694748683, -0.025889760486932745, -0.025839777214392848, -0.025789793877253508, -0.025739810475639682, -0.025689827009675890, -0.025639843479487973, --0.025589859885200444, -0.025539876226938270, -0.025489892504825959, -0.025439908718989358, -0.025389924869552990, -0.025339940956641806, -0.025289956980380328, -0.025239972940894403, --0.025189988838308544, -0.025140004672747712, -0.025090020444336423, -0.025040036153200530, -0.024990051799464546, -0.024940067383252988, -0.024890082904691704, -0.024840098363905216, --0.024790113761018480, -0.024740129096156017, -0.024690144369443674, -0.024640159581005971, -0.024590174730967869, -0.024540189819453884, -0.024490204846589869, -0.024440219812500344, --0.024390234717310270, -0.024340249561144164, -0.024290264344127878, -0.024240279066385931, -0.024190293728043284, -0.024140308329224463, -0.024090322870055313, -0.024040337350660357, --0.023990351771164112, -0.023940366131692432, -0.023890380432369837, -0.023840394673321292, -0.023790408854671315, -0.023740422976545758, -0.023690437039069145, -0.023640451042366440, --0.023590464986562164, -0.023540478871782171, -0.023490492698150980, -0.023440506465793553, -0.023390520174834419, -0.023340533825399429, -0.023290547417613106, -0.023240560951600410, --0.023190574427485872, -0.023140587845395338, -0.023090601205453337, -0.023040614507784832, -0.022990627752514349, -0.022940640939767738, -0.022890654069669527, -0.022840667142344236, --0.022790680157917718, -0.022740693116514502, -0.022690706018259555, -0.022640718863277398, -0.022590731651693886, -0.022540744383633547, -0.022490757059221343, -0.022440769678581808, --0.022390782241840788, -0.022340794749122816, -0.022290807200552855, -0.022240819596255432, -0.022190831936356407, -0.022140844220980300, -0.022090856450252081, -0.022040868624296280, --0.021990880743238749, -0.021940892807204019, -0.021890904816316611, -0.021840916770702382, -0.021790928670485866, -0.021740940515792024, -0.021690952306745389, -0.021640964043471819, --0.021590975726095838, -0.021540987354742417, -0.021490998929536084, -0.021441010450602697, -0.021391021918066782, -0.021341033332053314, -0.021291044692686820, -0.021241056000093156, --0.021191067254396855, -0.021141078455722884, -0.021091089604195774, -0.021041100699941383, -0.020991111743084240, -0.020941122733748874, -0.020891133672061146, -0.020841144558145581, --0.020791155392127156, -0.020741166174130399, -0.020691176904281173, -0.020641187582704001, -0.020591198209523862, -0.020541208784865282, -0.020491219308854124, -0.020441229781614920, --0.020391240203272640, -0.020341250573951818, -0.020291260893778310, -0.020241271162876651, -0.020191281381371814, -0.020141291549388329, -0.020091301667052062, -0.020041311734487539, --0.019991321751819734, -0.019941331719173186, -0.019891341636673748, -0.019841351504445957, -0.019791361322614345, -0.019741371091304773, -0.019691380810641774, -0.019641390480750320, --0.019591400101754950, -0.019541409673781519, -0.019491419196954567, -0.019441428671399068, -0.019391438097239550, -0.019341447474601883, -0.019291456803610597, -0.019241466084390670, --0.019191475317066633, -0.019141484501764349, -0.019091493638608358, -0.019041502727723630, -0.018991511769234703, -0.018941520763267439, -0.018891529709946373, -0.018841538609396039, --0.018791547461742303, -0.018741556267109698, -0.018691565025623205, -0.018641573737407352, -0.018591582402588010, -0.018541591021289713, -0.018491599593637435, -0.018441608119755717, --0.018391616599770424, -0.018341625033806087, -0.018291633421987689, -0.018241641764439761, -0.018191650061288176, -0.018141658312657464, -0.018091666518672604, -0.018041674679458136, --0.017991682795139925, -0.017941690865842509, -0.017891698891690420, -0.017841706872809528, -0.017791714809324368, -0.017741722701359919, -0.017691730549040725, -0.017641738352492643, --0.017591746111840219, -0.017541753827208427, -0.017491761498721808, -0.017441769126506232, -0.017391776710686230, -0.017341784251386785, -0.017291791748732438, -0.017241799202849052, --0.017191806613861171, -0.017141813981893773, -0.017091821307071396, -0.017041828589519911, -0.016991835829363852, -0.016941843026727764, -0.016891850181737507, -0.016841857294517627, --0.016791864365193105, -0.016741871393888476, -0.016691878380729611, -0.016641885325841054, -0.016591892229347781, -0.016541899091374334, -0.016491905912046585, -0.016441912691489070, --0.016391919429826773, -0.016341926127184235, -0.016291932783687322, -0.016241939399460580, -0.016191945974628988, -0.016141952509317090, -0.016091959003650753, -0.016041965457754517, --0.015991971871753368, -0.015941978245771846, -0.015891984579935823, -0.015841990874369837, -0.015791997129198432, -0.015742003344547475, -0.015692009520541512, -0.015642015657305525, --0.015592021754964054, -0.015542027813642972, -0.015492033833466822, -0.015442039814560587, -0.015392045757048809, -0.015342051661057361, -0.015292057526710782, -0.015242063354134061, --0.015192069143451736, -0.015142074894789683, -0.015092080608272444, -0.015042086284025001, -0.014992091922171899, -0.014942097522839011, -0.014892103086150882, -0.014842108612232048, --0.014792114101208387, -0.014742119553204442, -0.014692124968345198, -0.014642130346755197, -0.014592135688560314, -0.014542140993885093, -0.014492146262854519, -0.014442151495593135, --0.014392156692226815, -0.014342161852880104, -0.014292166977677989, -0.014242172066745013, -0.014192177120207049, -0.014142182138188644, -0.014092187120814784, -0.014042192068210011, --0.013992196980500202, -0.013942201857809901, -0.013892206700263652, -0.013842211507987328, -0.013792216281105477, -0.013742221019743085, -0.013692225724024697, -0.013642230394076187, --0.013592235030022102, -0.013542239631987430, -0.013492244200096714, -0.013442248734475831, -0.013392253235249328, -0.013342257702542191, -0.013292262136478966, -0.013242266537185529, --0.013192270904786427, -0.013142275239406646, -0.013092279541170733, -0.013042283810204567, -0.012992288046632690, -0.012942292250580094, -0.012892296422171321, -0.012842300561532254, --0.012792304668787434, -0.012742308744061409, -0.012692312787480056, -0.012642316799167920, -0.012592320779249993, -0.012542324727850820, -0.012492328645096279, -0.012442332531110916, --0.012392336386019722, -0.012342340209947242, -0.012292344003019358, -0.012242347765360612, -0.012192351497095997, -0.012142355198350059, -0.012092358869248677, -0.012042362509916400, --0.011992366120478215, -0.011942369701058671, -0.011892373251783646, -0.011842376772777687, -0.011792380264165344, -0.011742383726072494, -0.011692387158623684, -0.011642390561943907, --0.011592393936157710, -0.011542397281390971, -0.011492400597768239, -0.011442403885414506, -0.011392407144454319, -0.011342410375013557, -0.011292413577216770, -0.011242416751188949, --0.011192419897054643, -0.011142423014939730, -0.011092426104968760, -0.011042429167266726, -0.010992432201958174, -0.010942435209168985, -0.010892438189023709, -0.010842441141646892, --0.010792444067164416, -0.010742446965700833, -0.010692449837381129, -0.010642452682329858, -0.010592455500672900, -0.010542458292534803, -0.010492461058040558, -0.010442463797314719, --0.010392466510483164, -0.010342469197670442, -0.010292471859001548, -0.010242474494601028, -0.010192477104594769, -0.010142479689107316, -0.010092482248263663, -0.010042484782188360, --0.009992487291007291, -0.009942489774845003, -0.009892492233826490, -0.009842494668076303, -0.009792497077720322, -0.009742499462883100, -0.009692501823689184, -0.009642504160264459, --0.009592506472733473, -0.009542508761221220, -0.009492511025852251, -0.009442513266752450, -0.009392515484046364, -0.009342517677858991, -0.009292519848314879, -0.009242521995539911, --0.009192524119658639, -0.009142526220796057, -0.009092528299076714, -0.009042530354626495, -0.008992532387569949, -0.008942534398032073, -0.008892536386137417, -0.008842538352011865, --0.008792540295779966, -0.008742542217566273, -0.008692544117496667, -0.008642545995695701, -0.008592547852288371, -0.008542549687399228, -0.008492551501154154, -0.008442553293677700, --0.008392555065094865, -0.008342556815530196, -0.008292558545109581, -0.008242560253957568, -0.008192561942199155, -0.008142563609958894, -0.008092565257362667, -0.008042566884535028, --0.007992568491600970, -0.007942570078685048, -0.007892571645913145, -0.007842573193409811, -0.007792574721299603, -0.007742576229708400, -0.007692577718760757, -0.007642579188581669, --0.007592580639295690, -0.007542582071028704, -0.007492583483905262, -0.007442584878050361, -0.007392586253588554, -0.007342587610645725, -0.007292588949346428, -0.007242590269815658, --0.007192591572177969, -0.007142592856559244, -0.007092594123084038, -0.007042595371877345, -0.006992596603063722, -0.006942597816769049, -0.006892599013117883, -0.006842600192234775, --0.006792601354245611, -0.006742602499274943, -0.006692603627447769, -0.006642604738888642, -0.006592605833723447, -0.006542606912076737, -0.006492607974073510, -0.006442609019838320, --0.006392610049497051, -0.006342611063174256, -0.006292612060994934, -0.006242613043083638, -0.006192614009566253, -0.006142614960567333, -0.006092615896211876, -0.006042616816624435, --0.005992617721930896, -0.005942618612255812, -0.005892619487724183, -0.005842620348460561, -0.005792621194590831, -0.005742622026239549, -0.005692622843531267, -0.005642623646591872, --0.005592624435545919, -0.005542625210518404, -0.005492625971633882, -0.005442626719018240, -0.005392627452796030, -0.005342628173092252, -0.005292628880031459, -0.005242629573739539, --0.005192630254341044, -0.005142630921960973, -0.005092631576723882, -0.005042632218755655, -0.004992632848180848, -0.004942633465124459, -0.004892634069711042, -0.004842634662066484, --0.004792635242315340, -0.004742635810582162, -0.004692636366992840, -0.004642636911671927, -0.004592637444744421, -0.004542637966334878, -0.004492638476569184, -0.004442638975571894, --0.004392639463468006, -0.004342639940382076, -0.004292640406439990, -0.004242640861766302, -0.004192641306486013, -0.004142641740723677, -0.004092642164605180, -0.004042642578255077, --0.003992642981798369, -0.003942643375359608, -0.003892643759064683, -0.003842644133038149, -0.003792644497404561, -0.003742644852289805, -0.003692645197818437, -0.003642645534115456, --0.003592645861305418, -0.003542646179514209, -0.003492646488866384, -0.003442646789486943, -0.003392647081500441, -0.003342647365032765, -0.003292647640208471, -0.003242647907152558, --0.003192648165989581, -0.003142648416845428, -0.003092648659844654, -0.003042648895112258, -0.002992649122772795, -0.002942649342952154, -0.002892649555774890, -0.002842649761366002, --0.002792649959850045, -0.002742650151352907, -0.002692650335999144, -0.002642650513913312, -0.002592650685221296, -0.002542650850047655, -0.002492651008517386, -0.002442651160755045, --0.002392651306886521, -0.002342651447036368, -0.002292651581329587, -0.002242651709890733, -0.002192651832845693, -0.002142651950319024, -0.002092652062435725, -0.002042652169320352, --0.001992652271098793, -0.001942652367895603, -0.001892652459835782, -0.001842652547043885, -0.001792652629645802, -0.001742652707766087, -0.001692652781529296, -0.001642652851061317, --0.001592652916486706, -0.001542652977930462, -0.001492653035517143, -0.001442653089372634, -0.001392653139621493, -0.001342653186388719, -0.001292653229798869, -0.001242653269977829, --0.001192653307050155, -0.001142653341140849, -0.001092653372374465, -0.001042653400876892, -0.000992653426772685, -0.000942653450186845, -0.000892653471243927, -0.000842653490069820, --0.000792653506789079, -0.000742653521526259, -0.000692653534407251, -0.000642653545556608, -0.000592653555099331, -0.000542653563159977, -0.000492653569864433, -0.000442653575337254, --0.000392653579703442, -0.000342653583087552, -0.000292653585615472, -0.000242653587411758, -0.000192653588601410, -0.000142653589308984, -0.000092653589660368, -0.000042653589780118, -0.000007346410206766, 0.000057346410175728, 0.000107346410000880, 0.000157346409557666, 0.000207346408721530, 0.000257346407366583, 0.000307346405368271, 0.000357346402601593, -0.000407346398941993, 0.000457346394263583, 0.000507346388441806, 0.000557346381351664, 0.000607346372868600, 0.000657346362866726, 0.000707346351221486, 0.000757346337807880, -0.000807346322501352, 0.000857346305176015, 0.000907346285707312, 0.000957346263970243, 0.001007346239840252, 0.001057346213191452, 0.001107346183899286, 0.001157346151838755, -0.001207346116885302, 0.001257346078913040, 0.001307346037797413, 0.001357345993413865, 0.001407345945636508, 0.001457345894340786, 0.001507345839401699, 0.001557345780694692, -0.001607345718093876, 0.001657345651474696, 0.001707345580712151, 0.001757345505681687, 0.001807345426257415, 0.001857345342314780, 0.001907345253728781, 0.001957345160374863, -0.002007345062127138, 0.002057344958861051, 0.002107344850451600, 0.002157344736774233, 0.002207344617703058, 0.002257344493113523, 0.002307344362881071, 0.002357344226879813, -0.002407344084985194, 0.002457343937072216, 0.002507343783016322, 0.002557343622691624, 0.002607343455973567, 0.002657343282737152, 0.002707343102857823, 0.002757342916209691, -0.002807342722668203, 0.002857342522108357, 0.002907342314405600, 0.002957342099434042, 0.003007341877069129, 0.003057341647185862, 0.003107341409659684, 0.003157341164364709, -0.003207340911176381, 0.003257340649970145, 0.003307340380620113, 0.003357340103001730, 0.003407339816989997, 0.003457339522460358, 0.003507339219286927, 0.003557338907345147, -0.003607338586510021, 0.003657338256656991, 0.003707337917660173, 0.003757337569395009, 0.003807337211736501, 0.003857336844560094, 0.003907336467739902, 0.003957336081151368, -0.004007335684669494, 0.004057335278169725, 0.004107334861526173, 0.004157334434614284, 0.004207333997309060, 0.004257333549485944, 0.004307333091019050, 0.004357332621783824, -0.004407332141655711, 0.004457331650508822, 0.004507331148218605, 0.004557330634660059, 0.004607330109708632, 0.004657329573238434, 0.004707329025124913, 0.004757328465243070, -0.004807327893468349, 0.004857327309674865, 0.004907326713738062, 0.004957326105532942, 0.005007325484934952, 0.005057324851818203, 0.005107324206058143, 0.005157323547529772, -0.005207322876108536, 0.005257322191668548, 0.005307321494085256, 0.005357320783234103, 0.005407320058989205, 0.005457319321226006, 0.005507318569819510, 0.005557317804645160, -0.005607317025577073, 0.005657316232490692, 0.005707315425261022, 0.005757314603763507, 0.005807313767872260, 0.005857312917462730, 0.005907312052409917, 0.005957311172589269, -0.006007310277874899, 0.006057309368142251, 0.006107308443266332, 0.006157307503122585, 0.006207306547585126, 0.006257305576529399, 0.006307304589830853, 0.006357303587363602, -0.006407302569003091, 0.006457301534624325, 0.006507300484102748, 0.006557299417312476, 0.006607298334128956, 0.006657297234427190, 0.006707296118082624, 0.006757294984969375, -0.006807293834962888, 0.006857292667938166, 0.006907291483770657, 0.006957290282334475, 0.007007289063505067, 0.007057287827157437, 0.007107286573167031, 0.007157285301407965, -0.007207284011755685, 0.007257282704085639, 0.007307281378271943, 0.007357280034190043, 0.007407278671714943, 0.007457277290722091, 0.007507275891085601, 0.007557274472680921, -0.007607273035383055, 0.007657271579067451, 0.007707270103608224, 0.007757268608880821, 0.007807267094760247, 0.007857265561121950, 0.007907264007840044, 0.007957262434789978, -0.008007260841846756, 0.008057259228885828, 0.008107257595781304, 0.008157255942408639, 0.008207254268642833, 0.008257252574359336, 0.008307250859432264, 0.008357249123737063, -0.008407247367149184, 0.008457245589542743, 0.008507243790793187, 0.008557241970775523, 0.008607240129365198, 0.008657238266436327, 0.008707236381864362, 0.008757234475524305, -0.008807232547291606, 0.008857230597040383, 0.008907228624646083, 0.008957226629983710, 0.009007224612928716, 0.009057222573355216, 0.009107220511138658, 0.009157218426154051, -0.009207216318276841, 0.009257214187381147, 0.009307212033342416, 0.009357209856036100, 0.009407207655336316, 0.009457205431118511, 0.009507203183257693, 0.009557200911629312, -0.009607198616107484, 0.009657196296567659, 0.009707193952884843, 0.009757191584934488, 0.009807189192590708, 0.009857186775728957, 0.009907184334224238, 0.009957181867952003, -0.010007179376786367, 0.010057176860602784, 0.010107174319276260, 0.010157171752682244, 0.010207169160694854, 0.010257166543189540, 0.010307163900041756, 0.010357161231125615, -0.010407158536316574, 0.010457155815489635, 0.010507153068520252, 0.010557150295282541, 0.010607147495651954, 0.010657144669503498, 0.010707141816712626, 0.010757138937153455, -0.010807136030701436, 0.010857133097231577, 0.010907130136619330, 0.010957127148738812, 0.011007124133465478, 0.011057121090674332, 0.011107118020240829, 0.011157114922039087, -0.011207111795944556, 0.011257108641832247, 0.011307105459577610, 0.011357102249054764, 0.011407099010139164, 0.011457095742706260, 0.011507092446630172, 0.011557089121786353, -0.011607085768049813, 0.011657082385296001, 0.011707078973399039, 0.011757075532234380, 0.011807072061677032, 0.011857068561602449, 0.011907065031884750, 0.011957061472399387, -0.012007057883021371, 0.012057054263626155, 0.012107050614087858, 0.012157046934281936, 0.012207043224083397, 0.012257039483367692, 0.012307035712008946, 0.012357031909882609, -0.012407028076864139, 0.012457024212827652, 0.012507020317648606, 0.012557016391202009, 0.012607012433363315, 0.012657008444006645, 0.012707004423007455, 0.012757000370240754, -0.012806996285581995, 0.012856992168905302, 0.012906988020086128, 0.012956983838999486, 0.013006979625520826, 0.013056975379524275, 0.013106971100885283, 0.013156966789478865, -0.013206962445180475, 0.013256958067864233, 0.013306953657405597, 0.013356949213680020, 0.013406944736561626, 0.013456940225925871, 0.013506935681647764, 0.013556931103602763, -0.013606926491664990, 0.013656921845709900, 0.013706917165612507, 0.013756912451248264, 0.013806907702491296, 0.013856902919217059, 0.013906898101300564, 0.013956893248617269, -0.014006888361041296, 0.014056883438448102, 0.014106878480712700, 0.014156873487710546, 0.014206868459315763, 0.014256863395403810, 0.014306858295850142, 0.014356853160528885, -0.014406847989315495, 0.014456842782084983, 0.014506837538712810, 0.014556832259073098, 0.014606826943041308, 0.014656821590492449, 0.014706816201301980, 0.014756810775344026, -0.014806805312494044, 0.014856799812627051, 0.014906794275618501, 0.014956788701342523, 0.015006783089674571, 0.015056777440489662, 0.015106771753663255, 0.015156766029069473, -0.015206760266583777, 0.015256754466081180, 0.015306748627437141, 0.015356742750525785, 0.015406736835222574, 0.015456730881402963, 0.015506724888941083, 0.015556718857712390, -0.015606712787591900, 0.015656706678455069, 0.015706700530176032, 0.015756694342630242, 0.015806688115692715, 0.015856681849238913, 0.015906675543142960, 0.015956669197280320, -0.016006662811526007, 0.016056656385755482, 0.016106649919842873, 0.016156643413663636, 0.016206636867092790, 0.016256630280005797, 0.016306623652276787, 0.016356616983781214, -0.016406610274394547, 0.016456603523990906, 0.016506596732445759, 0.016556589899634117, 0.016606583025431446, 0.016656576109711874, 0.016706569152350862, 0.016756562153223426, -0.016806555112205031, 0.016856548029169801, 0.016906540903993204, 0.016956533736550251, 0.017006526526716411, 0.017056519274365810, 0.017106511979373910, 0.017156504641615729, -0.017206497260966732, 0.017256489837301048, 0.017306482370494140, 0.017356474860421470, 0.017406467306957166, 0.017456459709976696, 0.017506452069355076, 0.017556444384967770, -0.017606436656688911, 0.017656428884393959, 0.017706421067957934, 0.017756413207256301, 0.017806405302163191, 0.017856397352554065, 0.017906389358303951, 0.017956381319288305, -0.018006373235381259, 0.018056365106458284, 0.018106356932394395, 0.018156348713065058, 0.018206340448344405, 0.018256332138107900, 0.018306323782230564, 0.018356315380587865, -0.018406306933053930, 0.018456298439504231, 0.018506289899814229, 0.018556281313858058, 0.018606272681511184, 0.018656264002648627, 0.018706255277145856, 0.018756246504877002, -0.018806237685717531, 0.018856228819542468, 0.018906219906227276, 0.018956210945646090, 0.019006201937674376, 0.019056192882187156, 0.019106183779059899, 0.019156174628166739, -0.019206165429383144, 0.019256156182584132, 0.019306146887645176, 0.019356137544440408, 0.019406128152845297, 0.019456118712735310, 0.019506109223984578, 0.019556099686468577, -0.019606090100062326, 0.019656080464641294, 0.019706070780079618, 0.019756061046252764, 0.019806051263035755, 0.019856041430304065, 0.019906031547931826, 0.019956021615794507, -0.020006011633767137, 0.020056001601725180, 0.020105991519542774, 0.020155981387095390, 0.020205971204258055, 0.020255960970906234, 0.020305950686914067, 0.020355940352157022, -0.020405929966510569, 0.020455919529848852, 0.020505909042047330, 0.020555898502981042, 0.020605887912525447, 0.020655877270554689, 0.020705866576944239, 0.020755855831569123, -0.020805845034304809, 0.020855834185025440, 0.020905823283606486, 0.020955812329922975, 0.021005801323850375, 0.021055790265262827, 0.021105779154035803, 0.021155767990044334, -0.021205756773163886, 0.021255745503268607, 0.021305734180233959, 0.021355722803935422, 0.021405711374247134, 0.021455699891044566, 0.021505688354202749, 0.021555676763597157, -0.021605665119101929, 0.021655653420592537, 0.021705641667944010, 0.021755629861031824, 0.021805617999730121, 0.021855606083914372, 0.021905594113459607, 0.021955582088241301, -0.022005570008133593, 0.022055557873011965, 0.022105545682751439, 0.022155533437227495, 0.022205521136314271, 0.022255508779887245, 0.022305496367821448, 0.022355483899992354, -0.022405471376274109, 0.022455458796542180, 0.022505446160672050, 0.022555433468537861, 0.022605420720015090, 0.022655407914978765, 0.022705395053304368, 0.022755382134866033, -0.022805369159539249, 0.022855356127199036, 0.022905343037720880, 0.022955329890978923, 0.023005316686848642, 0.023055303425205068, 0.023105290105923677, 0.023155276728878620, -0.023205263293945372, 0.023255249800998964, 0.023305236249914874, 0.023355222640567250, 0.023405208972831573, 0.023455195246583314, 0.023505181461696622, 0.023555167618046980, -0.023605153715509416, 0.023655139753959414, 0.023705125733271118, 0.023755111653320005, 0.023805097513981115, 0.023855083315129925, 0.023905069056640586, 0.023955054738388569, -0.024005040360248919, 0.024055025922097111, 0.024105011423807294, 0.024154996865254946, 0.024204982246315107, 0.024254967566863260, 0.024304952826773547, 0.024354938025921452, -0.024404923164182458, 0.024454908241430710, 0.024504893257541693, 0.024554878212390441, 0.024604863105852439, 0.024654847937801833, 0.024704832708114109, 0.024754817416664302, -0.024804802063327899, 0.024854786647979042, 0.024904771170493223, 0.024954755630745472, 0.025004740028611278, 0.025054724363964789, 0.025104708636681492, 0.025154692846636420, -0.025204676993705061, 0.025254661077761566, 0.025304645098681418, 0.025354629056339659, 0.025404612950611770, 0.025454596781371904, 0.025504580548495547, 0.025554564251858179, -0.025604547891333960, 0.025654531466798372, 0.025704514978126453, 0.025754498425193690, 0.025804481807874240, 0.025854465126043585, 0.025904448379576766, 0.025954431568349270, -0.026004414692235252, 0.026054397751110195, 0.026104380744849144, 0.026154363673327588, 0.026204346536419676, 0.026254329334000900, 0.026304312065946300, 0.026354294732131363, -0.026404277332430247, 0.026454259866718434, 0.026504242334871420, 0.026554224736763353, 0.026604207072269726, 0.026654189341265580, 0.026704171543626403, 0.026754153679226355, -0.026804135747940924, 0.026854117749645152, 0.026904099684214530, 0.026954081551523217, 0.027004063351446696, 0.027054045083860022, 0.027104026748638675, 0.027154008345656819, -0.027203989874789940, 0.027253971335913087, 0.027303952728901751, 0.027353934053630090, 0.027403915309973593, 0.027453896497807748, 0.027503877617006723, 0.027553858667446002, -0.027603839649000633, 0.027653820561546111, 0.027703801404956593, 0.027753782179107570, 0.027803762883874095, 0.027853743519131655, 0.027903724084754410, 0.027953704580617859, -0.028003685006597043, 0.028053665362567461, 0.028103645648403269, 0.028153625863979966, 0.028203606009172596, 0.028253586083856655, 0.028303566087906306, 0.028353546021197041, -0.028403525883604355, 0.028453505675002412, 0.028503485395266703, 0.028553465044272280, 0.028603444621894639, 0.028653424128007941, 0.028703403562487687, 0.028753382925208921, -0.028803362216047141, 0.028853341434876514, 0.028903320581572533, 0.028953299656010248, 0.029003278658065158, 0.029053257587611431, 0.029103236444524557, 0.029153215228679592, -0.029203193939952035, 0.029253172578216049, 0.029303151143347129, 0.029353129635220333, 0.029403108053711158, 0.029453086398693769, 0.029503064670043662, 0.029553042867636336, -0.029603020991345961, 0.029652999041048032, 0.029702977016617609, 0.029752954917930185, 0.029802932744859928, 0.029852910497282344, 0.029902888175072480, 0.029952865778105839, -0.030002843306256591, 0.030052820759400235, 0.030102798137411828, 0.030152775440166868, 0.030202752667539527, 0.030252729819405303, 0.030302706895639252, 0.030352683896116880, -0.030402660820712357, 0.030452637669301178, 0.030502614441758853, 0.030552591137959544, 0.030602567757778761, 0.030652544301091555, 0.030702520767773432, 0.030752497157698566, -0.030802473470742456, 0.030852449706780163, 0.030902425865687186, 0.030952401947337706, 0.031002377951607218, 0.031052353878370784, 0.031102329727503913, 0.031152305498880772, -0.031202281192376866, 0.031252256807867258, 0.031302232345227450, 0.031352207804331622, 0.031402183185055270, 0.031452158487273903, 0.031502133710861698, 0.031552108855694164, -0.031602083921646353, 0.031652058908593773, 0.031702033816410603, 0.031752008644972352, 0.031801983394154076, 0.031851958063831287, 0.031901932653878161, 0.031951907164170200, -0.032001881594582476, 0.032051855944990486, 0.032101830215268419, 0.032151804405291771, 0.032201778514935615, 0.032251752544075453, 0.032301726492585468, 0.032351700360341164, -0.032401674147217611, 0.032451647853090321, 0.032501621477833462, 0.032551595021322551, 0.032601568483433097, 0.032651541864039277, 0.032701515163016601, 0.032751488380240140, -0.032801461515585398, 0.032851434568926564, 0.032901407540139142, 0.032951380429098197, 0.033001353235679251, 0.033051325959756475, 0.033101298601205378, 0.033151271159901040, -0.033201243635718969, 0.033251216028533349, 0.033301188338219684, 0.033351160564653044, 0.033401132707708954, 0.033451104767261583, 0.033501076743186455, 0.033551048635359078, -0.033601020443653630, 0.033650992167945634, 0.033700963808110163, 0.033750935364022717, 0.033800906835557497, 0.033850878222590003, 0.033900849524995322, 0.033950820742648956, -0.034000791875425096, 0.034050762923199251, 0.034100733885846501, 0.034150704763242362, 0.034200675555261018, 0.034250646261777984, 0.034300616882668333, 0.034350587417807589, -0.034400557867069928, 0.034450528230330874, 0.034500498507465942, 0.034550468698349317, 0.034600438802856522, 0.034650408820862635, 0.034700378752243168, 0.034750348596872302, -0.034800318354625576, 0.034850288025378047, 0.034900257609005246, 0.034950227105381357, 0.035000196514381895, 0.035050165835881948, 0.035100135069757024, 0.035150104215881321, -0.035200073274130363, 0.035250042244379214, 0.035300011126503404, 0.035349979920377125, 0.035399948625875900, 0.035449917242875238, 0.035499885771249351, 0.035549854210873741, -0.035599822561623494, 0.035649790823374140, 0.035699758995999864, 0.035749727079376188, 0.035799695073378199, 0.035849662977881412, 0.035899630792760026, 0.035949598517889557, -0.035999566153145098, 0.036049533698402164, 0.036099501153534955, 0.036149468518418992, 0.036199435792929363, 0.036249402976941583, 0.036299370070329851, 0.036349337072969695, -0.036399303984736196, 0.036449270805504877, 0.036499237535149942, 0.036549204173546915, 0.036599170720571318, 0.036649137176097350, 0.036699103540000541, 0.036749069812155970, -0.036799035992439173, 0.036849002080724343, 0.036898968076887001, 0.036948933980802241, 0.036998899792345594, 0.037048865511391249, 0.037098831137814745, 0.037148796671491159, -0.037198762112296030, 0.037248727460103548, 0.037298692714789250, 0.037348657876228215, 0.037398622944295981, 0.037448587918866752, 0.037498552799816044, 0.037548517587019402, -0.037598482280351023, 0.037648446879686437, 0.037698411384900737, 0.037748375795869447, 0.037798340112466779, 0.037848304334568261, 0.037898268462048981, 0.037948232494784469, -0.037998196432648935, 0.038048160275517912, 0.038098124023266490, 0.038148087675770194, 0.038198051232903242, 0.038248014694541158, 0.038297978060559040, 0.038347941330832420, -0.038397904505235503, 0.038447867583643824, 0.038497830565932915, 0.038547793451976994, 0.038597756241651585, 0.038647718934831786, 0.038697681531393135, 0.038747644031209838, -0.038797606434157424, 0.038847568740110999, 0.038897530948946095, 0.038947493060536922, 0.038997455074759012, 0.039047416991487470, 0.039097378810597820, 0.039147340531964288, -0.039197302155462403, 0.039247263680967259, 0.039297225108354407, 0.039347186437498044, 0.039397147668273715, 0.039447108800556512, 0.039497069834221986, 0.039547030769144342, -0.039596991605199118, 0.039646952342261864, 0.039696912980206778, 0.039746873518909417, 0.039796833958244869, 0.039846794298088677, 0.039896754538315059, 0.039946714678799553, -0.039996674719417265, 0.040046634660043733, 0.040096594500553161, 0.040146554240821114, 0.040196513880722679, 0.040246473420133398, 0.040296432858927492, 0.040346392196980503, -0.040396351434167539, 0.040446310570364137, 0.040496269605444515, 0.040546228539284218, 0.040596187371758789, 0.040646146102742454, 0.040696104732110758, 0.040746063259738792, -0.040796021685502115, 0.040845980009274939, 0.040895938230932814, 0.040945896350350841, 0.040995854367404570, 0.041045812281968228, 0.041095770093917343, 0.041145727803127044, -0.041195685409472861, 0.041245642912829027, 0.041295600313071078, 0.041345557610074135, 0.041395514803713743, 0.041445471893864112, 0.041495428880400809, 0.041545385763199376, -0.041595342542134033, 0.041645299217080337, 0.041695255787913388, 0.041745212254508744, 0.041795168616740631, 0.041845124874484593, 0.041895081027615744, 0.041945037076009634, -0.041994993019540489, 0.042044948858083860, 0.042094904591514860, 0.042144860219709042, 0.042194815742540630, 0.042244771159885175, 0.042294726471617798, 0.042344681677614043, -0.042394636777748143, 0.042444591771895655, 0.042494546659932124, 0.042544501441731788, 0.042594456117170200, 0.042644410686122465, 0.042694365148464149, 0.042744319504069483, -0.042794273752814013, 0.042844227894572859, 0.042894181929221578, 0.042944135856634397, 0.042994089676686879, 0.043044043389254140, 0.043093996994211729, 0.043143950491433887, -0.043193903880796164, 0.043243857162173688, 0.043293810335442010, 0.043343763400475362, 0.043393716357149302, 0.043443669205338958, 0.043493621944919882, 0.043543574575766304, -0.043593527097753798, 0.043643479510757907, 0.043693431814652885, 0.043743384009314275, 0.043793336094617205, 0.043843288070437240, 0.043893239936648613, 0.043943191693126889, -0.043993143339747180, 0.044043094876385060, 0.044093046302914753, 0.044142997619211838, 0.044192948825151422, 0.044242899920609084, 0.044292850905459050, 0.044342801779576890, -0.044392752542837727, 0.044442703195117124, 0.044492653736289314, 0.044542604166229877, 0.044592554484814369, 0.044642504691917037, 0.044692454787413440, 0.044742404771178704, -0.044792354643088401, 0.044842304403016765, 0.044892254050839374, 0.044942203586431341, 0.044992153009668252, 0.045042102320424326, 0.045092051518575156, 0.045142000603995848, -0.045191949576561988, 0.045241898436147801, 0.045291847182628880, 0.045341795815880333, 0.045391744335777744, 0.045441692742195346, 0.045491641035008724, 0.045541589214093438, -0.045591537279323732, 0.045641485230575186, 0.045691433067722928, 0.045741380790642536, 0.045791328399208242, 0.045841275893295626, 0.045891223272779821, 0.045941170537536401, -0.045991117687439617, 0.046041064722365035, 0.046091011642187790, 0.046140958446783460, 0.046190905136026292, 0.046240851709791857, 0.046290798167955297, 0.046340744510392183, -0.046390690736976763, 0.046440636847584621, 0.046490582842090886, 0.046540528720371135, 0.046590474482299617, 0.046640420127751915, 0.046690365656603609, 0.046740311068728939, -0.046790256364003496, 0.046840201542302409, 0.046890146603501263, 0.046940091547474312, 0.046990036374097127, 0.047039981083244850, 0.047089925674793066, 0.047139870148616023, -0.047189814504589311, 0.047239758742588053, 0.047289702862487848, 0.047339646864162942, 0.047389590747488913, 0.047439534512340918, 0.047489478158594521, 0.047539421686123989, -0.047589365094804902, 0.047639308384512843, 0.047689251555122075, 0.047739194606508176, 0.047789137538546286, 0.047839080351112000, 0.047889023044079569, 0.047938965617324580, -0.047988908070722182, 0.048038850404147952, 0.048088792617476152, 0.048138734710582373, 0.048188676683341758, 0.048238618535629892, 0.048288560267321035, 0.048338501878290779, -0.048388443368414268, 0.048438384737567092, 0.048488325985623512, 0.048538267112459121, 0.048588208117949498, 0.048638149001968917, 0.048688089764392962, 0.048738030405096777, -0.048787970923955967, 0.048837911320844786, 0.048887851595638819, 0.048937791748213229, 0.048987731778443601, 0.049037671686204203, 0.049087611471370626, 0.049137551133818021, -0.049187490673421978, 0.049237430090056766, 0.049287369383597977, 0.049337308553920767, 0.049387247600900727, 0.049437186524412126, 0.049487125324330562, 0.049537064000531178, -0.049587002552889586, 0.049636940981280041, 0.049686879285578141, 0.049736817465659486, 0.049786755521398343, 0.049836693452670312, 0.049886631259350549, 0.049936568941314652, -0.049986506498436889, 0.050036443930592860, 0.050086381237657719, 0.050136318419507067, 0.050186255476015185, 0.050236192407057650, 0.050286129212509648, 0.050336065892246755, -0.050386002446143260, 0.050435938874074757, 0.050485875175916406, 0.050535811351543815, 0.050585747400831250, 0.050635683323654312, 0.050685619119888614, 0.050735554789408423, -0.050785490332089352, 0.050835425747806542, 0.050885361036435622, 0.050935296197850852, 0.050985231231927844, 0.051035166138541754, 0.051085100917568189, 0.051135035568881437, -0.051184970092357090, 0.051234904487870318, 0.051284838755296734, 0.051334772894510605, 0.051384706905387545, 0.051434640787802716, 0.051484574541631731, 0.051534508166748864, -0.051584441663029730, 0.051634375030349934, 0.051684308268583758, 0.051734241377606807, 0.051784174357294252, 0.051834107207521712, 0.051884039928163456, 0.051933972519095095, -0.051983904980191807, 0.052033837311329205, 0.052083769512381563, 0.052133701583224494, 0.052183633523733175, 0.052233565333783212, 0.052283497013248900, 0.052333428562005839, -0.052383359979929205, 0.052433291266894617, 0.052483222422776359, 0.052533153447450041, 0.052583084340791286, 0.052633015102674381, 0.052682945732974933, 0.052732876231568117, -0.052782806598329561, 0.052832736833133540, 0.052882666935855679, 0.052932596906371150, 0.052982526744555572, 0.053032456450283240, 0.053082386023429760, 0.053132315463870317, -0.053182244771480529, 0.053232173946134685, 0.053282102987708406, 0.053332031896076867, 0.053381960671115697, 0.053431889312699175, 0.053481817820702937, 0.053531746195002151, -0.053581674435472446, 0.053631602541988108, 0.053681530514424765, 0.053731458352658037, 0.053781386056562221, 0.053831313626012942, 0.053881241060885376, 0.053931168361055153, -0.053981095526396565, 0.054031022556785241, 0.054080949452096357, 0.054130876212205546, 0.054180802836987098, 0.054230729326316639, 0.054280655680069366, 0.054330581898120893, -0.054380507980345522, 0.054430433926618879, 0.054480359736816149, 0.054530285410812972, 0.054580210948483629, 0.054630136349703762, 0.054680061614348997, 0.054729986742293638, -0.054779911733413310, 0.054829836587583204, 0.054879761304678948, 0.054929685884574850, 0.054979610327146530, 0.055029534632269186, 0.055079458799818452, 0.055129382829668623, -0.055179306721695340, 0.055229230475773793, 0.055279154091779609, 0.055329077569587097, 0.055379000909071892, 0.055428924110109190, 0.055478847172574612, 0.055528770096342474, -0.055578692881288416, 0.055628615527288067, 0.055678538034215734, 0.055728460401947059, 0.055778382630357233, 0.055828304719321889, 0.055878226668715343, 0.055928148478413230, -0.055978070148290746, 0.056027991678223532, 0.056077913068085891, 0.056127834317753471, 0.056177755427101468, 0.056227676396005517, 0.056277597224339927, 0.056327517911980346, -0.056377438458801978, 0.056427358864680449, 0.056477279129490084, 0.056527199253106515, 0.056577119235404955, 0.056627039076261036, 0.056676958775549076, 0.056726878333144722, -0.056776797748923614, 0.056826717022760063, 0.056876636154529731, 0.056926555144107799, 0.056976473991369923, 0.057026392696190427, 0.057076311258444944, 0.057126229678008678, -0.057176147954757291, 0.057226066088565085, 0.057275984079307708, 0.057325901926860379, 0.057375819631098737, 0.057425737191897107, 0.057475654609131129, 0.057525571882676013, -0.057575489012407409, 0.057625405998199646, 0.057675322839928364, 0.057725239537469220, 0.057775156090696535, 0.057825072499485958, 0.057874988763712699, 0.057924904883252408, -0.057974820857979420, 0.058024736687769370, 0.058074652372497489, 0.058124567912039411, 0.058174483306269474, 0.058224398555063332, 0.058274313658296190, 0.058324228615843708, -0.058374143427580211, 0.058424058093381352, 0.058473972613122351, 0.058523886986678861, 0.058573801213925213, 0.058623715294737061, 0.058673629228990061, 0.058723543016558549, -0.058773456657318174, 0.058823370151144166, 0.058873283497912168, 0.058923196697496523, 0.058973109749772878, 0.059023022654616467, 0.059072935411902942, 0.059122848021506635, -0.059172760483303208, 0.059222672797167877, 0.059272584962976306, 0.059322496980602830, 0.059372408849923120, 0.059422320570812377, 0.059472232143146279, 0.059522143566799163, -0.059572054841646682, 0.059621965967564507, 0.059671876944426980, 0.059721787772109756, 0.059771698450488062, 0.059821608979437564, 0.059871519358832608, 0.059921429588548847, -0.059971339668461514, 0.060021249598446270, 0.060071159378377467, 0.060121069008130759, 0.060170978487581385, 0.060220887816605000, 0.060270796995075961, 0.060320706022869923, -0.060370614899862118, 0.060420523625928230, 0.060470432200942580, 0.060520340624780851, 0.060570248897318275, 0.060620157018430515, 0.060670064987991920, 0.060719972805878167, -0.060769880471964917, 0.060819787986126528, 0.060869695348238669, 0.060919602558176571, 0.060969509615815910, 0.061019416521031038, 0.061069323273697615, 0.061119229873690888, -0.061169136320886532, 0.061219042615158883, 0.061268948756383640, 0.061318854744436012, 0.061368760579191703, 0.061418666260525043, 0.061468571788311714, 0.061518477162426963, -0.061568382382746457, 0.061618287449144556, 0.061668192361496933, 0.061718097119679273, 0.061768001723565925, 0.061817906173032580, 0.061867810467954462, 0.061917714608207261, -0.061967618593665334, 0.062017522424204365, 0.062067426099699584, 0.062117329620026682, 0.062167232985060009, 0.062217136194675254, 0.062267039248747665, 0.062316942147152915, -0.062366844889765370, 0.062416747476460713, 0.062466649907114188, 0.062516552181601473, 0.062566454299796945, 0.062616356261576273, 0.062666258066815167, 0.062716159715387965, -0.062766061207170362, 0.062815962542037598, 0.062865863719865384, 0.062915764740528068, 0.062965665603901336, 0.063015566309860438, 0.063065466858281058, 0.063115367249037588, -0.063165267482005683, 0.063215167557060623, 0.063265067474078077, 0.063314967232932423, 0.063364866833499345, 0.063414766275654108, 0.063464665559272396, 0.063514564684228586, -0.063564463650398348, 0.063614362457656962, 0.063664261105880110, 0.063714159594942157, 0.063764057924718814, 0.063813956095085764, 0.063863854105917384, 0.063913751957089357, -0.063963649648476964, 0.064013547179955888, 0.064063444551400492, 0.064113341762686502, 0.064163238813689141, 0.064213135704284136, 0.064263032434345849, 0.064312929003749963, -0.064362825412371774, 0.064412721660086963, 0.064462617746769896, 0.064512513672296296, 0.064562409436541401, 0.064612305039380924, 0.064662200480689255, 0.064712095760342078, -0.064761990878215103, 0.064811885834182709, 0.064861780628120591, 0.064911675259904031, 0.064961569729408725, 0.065011464036509051, 0.065061358181080720, 0.065111252162998998, -0.065161145982139582, 0.065211039638376850, 0.065260933131586527, 0.065310826461643878, 0.065360719628424602, 0.065410612631803075, 0.065460505471655023, 0.065510398147855711, -0.065560290660280837, 0.065610183008804793, 0.065660075193303302, 0.065709967213652062, 0.065759859069725465, 0.065809750761399208, 0.065859642288548584, 0.065909533651049290, -0.065959424848775733, 0.066009315881603609, 0.066059206749408184, 0.066109097452065196, 0.066158987989449011, 0.066208878361435367, 0.066258768567899529, 0.066308658608717208, -0.066358548483762783, 0.066408438192912006, 0.066458327736040129, 0.066508217113022877, 0.066558106323734628, 0.066607995368051121, 0.066657884245848079, 0.066707772956999867, -0.066757661501382237, 0.066807549878870442, 0.066857438089340221, 0.066907326132665965, 0.066957214008723384, 0.067007101717387774, 0.067056989258534844, 0.067106876632039014, -0.067156763837775982, 0.067206650875621041, 0.067256537745449915, 0.067306424447136998, 0.067356310980558026, 0.067406197345588281, 0.067456083542103487, 0.067505969569978022, -0.067555855429087652, 0.067605741119307644, 0.067655626640513708, 0.067705511992580278, 0.067755397175383064, 0.067805282188797805, 0.067855167032698893, 0.067905051706962066, -0.067954936211462605, 0.068004820546076247, 0.068054704710677399, 0.068104588705141786, 0.068154472529344701, 0.068204356183161882, 0.068254239666467723, 0.068304122979137960, -0.068354006121047903, 0.068403889092073275, 0.068453771892088469, 0.068503654520969237, 0.068553536978590873, 0.068603419264829102, 0.068653301379558357, 0.068703183322654335, -0.068753065093992816, 0.068802946693448178, 0.068852828120896187, 0.068902709376212123, 0.068952590459271726, 0.069002471369949400, 0.069052352108120912, 0.069102232673661529, -0.069152113066447016, 0.069201993286351779, 0.069251873333251557, 0.069301753207021644, 0.069351632907537791, 0.069401512434674420, 0.069451391788307268, 0.069501270968311643, -0.069551149974563270, 0.069601028806936582, 0.069650907465307332, 0.069700785949551244, 0.069750664259542752, 0.069800542395157608, 0.069850420356271092, 0.069900298142758985, -0.069950175754495678, 0.070000053191356937, 0.070049930453218057, 0.070099807539954803, 0.070149684451441582, 0.070199561187554146, 0.070249437748167817, 0.070299314133158333, -0.070349190342400114, 0.070399066375768926, 0.070448942233140077, 0.070498817914389306, 0.070548693419391045, 0.070598568748021062, 0.070648443900154650, 0.070698318875667562, -0.070748193674434245, 0.070798068296330452, 0.070847942741231920, 0.070897817009013084, 0.070947691099549709, 0.070997565012717118, 0.071047438748391048, 0.071097312306445934, -0.071147185686757541, 0.071197058889201192, 0.071246931913652625, 0.071296804759986301, 0.071346677428077959, 0.071396549917802921, 0.071446422229036952, 0.071496294361654486, -0.071546166315531276, 0.071596038090542657, 0.071645909686564396, 0.071695781103470899, 0.071745652341137958, 0.071795523399441341, 0.071845394278255453, 0.071895264977456089, -0.071945135496918555, 0.071995005836518633, 0.072044875996130756, 0.072094745975630689, 0.072144615774893756, 0.072194485393795721, 0.072244354832211033, 0.072294224090015458, -0.072344093167084317, 0.072393962063293391, 0.072443830778517113, 0.072493699312631263, 0.072543567665511163, 0.072593435837032594, 0.072643303827069974, 0.072693171635499113, -0.072743039262195761, 0.072792906707034366, 0.072842773969890709, 0.072892641050640111, 0.072942507949158353, 0.072992374665319881, 0.073042241199000477, 0.073092107550075461, -0.073141973718420628, 0.073191839703910425, 0.073241705506420604, 0.073291571125826530, 0.073341436562003981, 0.073391301814827378, 0.073441166884172529, 0.073491031769914769, -0.073540896471929865, 0.073590760990092277, 0.073640625324277800, 0.073690489474362186, 0.073740353440219911, 0.073790217221726753, 0.073840080818758050, 0.073889944231189594, -0.073939807458895820, 0.073989670501752536, 0.074039533359635090, 0.074089396032419236, 0.074139258519979448, 0.074189120822191520, 0.074238982938930789, 0.074288844870073048, -0.074338706615492745, 0.074388568175065686, 0.074438429548667195, 0.074488290736173079, 0.074538151737457786, 0.074588012552397123, 0.074637873180866426, 0.074687733622741490, -0.074737593877896774, 0.074787453946208074, 0.074837313827551169, 0.074887173521800562, 0.074937033028832006, 0.074986892348520864, 0.075036751480742944, 0.075086610425372693, -0.075136469182285934, 0.075186327751357987, 0.075236186132464661, 0.075286044325480431, 0.075335902330281090, 0.075385760146742004, 0.075435617774738950, 0.075485475214146405, -0.075535332464840177, 0.075585189526695615, 0.075635046399588526, 0.075684903083393387, 0.075734759577985977, 0.075784615883242118, 0.075834471999036271, 0.075884327925244244, -0.075934183661741400, 0.075984039208403534, 0.076033894565105134, 0.076083749731721995, 0.076133604708129479, 0.076183459494203395, 0.076233314089818233, 0.076283168494849771, -0.076333022709173387, 0.076382876732664903, 0.076432730565198767, 0.076482584206650814, 0.076532437656896407, 0.076582290915811341, 0.076632143983270104, 0.076681996859148505, -0.076731849543322364, 0.076781702035666144, 0.076831554336055680, 0.076881406444366321, 0.076931258360473903, 0.076981110084252888, 0.077030961615579097, 0.077080812954327907, -0.077130664100375113, 0.077180515053595231, 0.077230365813864055, 0.077280216381056963, 0.077330066755049789, 0.077379916935716983, 0.077429766922934393, 0.077479616716577396, -0.077529466316521786, 0.077579315722642067, 0.077629164934814074, 0.077679013952913156, 0.077728862776815150, 0.077778711406394543, 0.077828559841527159, 0.077878408082088818, -0.077928256127954010, 0.077978103978998570, 0.078027951635097861, 0.078077799096127720, 0.078127646361962635, 0.078177493432478443, 0.078227340307550505, 0.078277186987054673, -0.078327033470865420, 0.078376879758858584, 0.078426725850909554, 0.078476571746894153, 0.078526417446686869, 0.078576262950163553, 0.078626108257199581, 0.078675953367670776, -0.078725798281451639, 0.078775642998418008, 0.078825487518445717, 0.078875331841409269, 0.078925175967184485, 0.078975019895646759, 0.079024863626671937, 0.079074707160134511, -0.079124550495910301, 0.079174393633874726, 0.079224236573903609, 0.079274079315871465, 0.079323921859654117, 0.079373764205126957, 0.079423606352165846, 0.079473448300645261, -0.079523290050441064, 0.079573131601428634, 0.079622972953483820, 0.079672814106481138, 0.079722655060296410, 0.079772495814805500, 0.079822336369882896, 0.079872176725404462, -0.079922016881245575, 0.079971856837282099, 0.080021696593388522, 0.080071536149440722, 0.080121375505314077, 0.080171214660884421, 0.080221053616026300, 0.080270892370615549, -0.080320730924527559, 0.080370569277638179, 0.080420407429821941, 0.080470245380954694, 0.080520083130911815, 0.080569920679569182, 0.080619758026801311, 0.080669595172484024, -0.080719432116493212, 0.080769268858703364, 0.080819105398990357, 0.080868941737229569, 0.080918777873296877, 0.080968613807066811, 0.081018449538415194, 0.081068285067217458, -0.081118120393349452, 0.081167955516685708, 0.081217790437102061, 0.081267625154473944, 0.081317459668677219, 0.081367293979586391, 0.081417128087077323, 0.081466961991025447, -0.081516795691306598, 0.081566629187795323, 0.081616462480367483, 0.081666295568898470, 0.081716128453264175, 0.081765961133339116, 0.081815793608999141, 0.081865625880120127, -0.081915457946576620, 0.081965289808244454, 0.082015121464999077, 0.082064952916716324, 0.082114784163270754, 0.082164615204538216, 0.082214446040394157, 0.082264276670714412, -0.082314107095373540, 0.082363937314247390, 0.082413767327211410, 0.082463597134141448, 0.082513426734912049, 0.082563256129399076, 0.082613085317477977, 0.082662914299024601, -0.082712743073913492, 0.082762571642020527, 0.082812400003221584, 0.082862228157391193, 0.082912056104405232, 0.082961883844139134, 0.083011711376468761, 0.083061538701268672, -0.083111365818414731, 0.083161192727782385, 0.083211019429247496, 0.083260845922684623, 0.083310672207969616, 0.083360498284977949, 0.083410324153585472, 0.083460149813666729, -0.083509975265097625, 0.083559800507753579, 0.083609625541510482, 0.083659450366242866, 0.083709274981826634, 0.083759099388137651, 0.083808923585050488, 0.083858747572441009, -0.083908571350184646, 0.083958394918157320, 0.084008218276233559, 0.084058041424289243, 0.084107864362199830, 0.084157687089841199, 0.084207509607087908, 0.084257331913815833, -0.084307154009900437, 0.084356975895217609, 0.084406797569641881, 0.084456619033049171, 0.084506440285314899, 0.084556261326314983, 0.084606082155923967, 0.084655902774017744, -0.084705723180471773, 0.084755543375161918, 0.084805363357962779, 0.084855183128750220, 0.084905002687400158, 0.084954822033787139, 0.085004641167787068, 0.085054460089275391, -0.085104278798128014, 0.085154097294219480, 0.085203915577425723, 0.085253733647622162, 0.085303551504684716, 0.085353369148487956, 0.085403186578907761, 0.085453003795819604, -0.085502820799099377, 0.085552637588621666, 0.085602454164262348, 0.085652270525896898, 0.085702086673401220, 0.085751902606649888, 0.085801718325518792, 0.085851533829883836, -0.085901349119619608, 0.085951164194602012, 0.086000979054706495, 0.086050793699808989, 0.086100608129784040, 0.086150422344507580, 0.086200236343855055, 0.086250050127702399, -0.086299863695924156, 0.086349677048396259, 0.086399490184994182, 0.086449303105593817, 0.086499115810069735, 0.086548928298297884, 0.086598740570153709, 0.086648552625513117, -0.086698364464250707, 0.086748176086242385, 0.086797987491364054, 0.086847798679490329, 0.086897609650497101, 0.086947420404259845, 0.086997230940654480, 0.087047041259555605, -0.087096851360839111, 0.087146661244380502, 0.087196470910055682, 0.087246280357739237, 0.087296089587307099, 0.087345898598634730, 0.087395707391598049, 0.087445515966071669, -0.087495324321931495, 0.087545132459053016, 0.087594940377312150, 0.087644748076583484, 0.087694555556742937, 0.087744362817666469, 0.087794169859228624, 0.087843976681305377, -0.087893783283772176, 0.087943589666504965, 0.087993395829378332, 0.088043201772268209, 0.088093007495050085, 0.088142812997599893, 0.088192618279792218, 0.088242423341502993, -0.088292228182607721, 0.088342032802982307, 0.088391837202501378, 0.088441641381040853, 0.088491445338476221, 0.088541249074683429, 0.088591052589537062, 0.088640855882913067, -0.088690658954686932, 0.088740461804734591, 0.088790264432930657, 0.088840066839151063, 0.088889869023271742, 0.088939670985167307, 0.088989472724713692, 0.089039274241786398, -0.089089075536261358, 0.089138876608013187, 0.089188677456917817, 0.089238478082850764, 0.089288278485687961, 0.089338078665304008, 0.089387878621574865, 0.089437678354376021, -0.089487477863583437, 0.089537277149071698, 0.089587076210716779, 0.089636875048394168, 0.089686673661979813, 0.089736472051348326, 0.089786270216375655, 0.089836068156937759, -0.089885865872909240, 0.089935663364166071, 0.089985460630583741, 0.090035257672038196, 0.090085054488404065, 0.090134851079557293, 0.090184647445373398, 0.090234443585728324, -0.090284239500496716, 0.090334035189554490, 0.090383830652777178, 0.090433625890040739, 0.090483420901219788, 0.090533215686190285, 0.090583010244827747, 0.090632804577008119, -0.090682598682606044, 0.090732392561497469, 0.090782186213558352, 0.090831979638663338, 0.090881772836688371, 0.090931565807508968, 0.090981358551001090, 0.091031151067039379, -0.091080943355499794, 0.091130735416257838, 0.091180527249189500, 0.091230318854169393, 0.091280110231073491, 0.091329901379777312, 0.091379692300156815, 0.091429482992086655, -0.091479273455442781, 0.091529063690100734, 0.091578853695936463, 0.091628643472824622, 0.091678433020641159, 0.091728222339261617, 0.091778011428561970, 0.091827800288416847, -0.091877588918702222, 0.091927377319294068, 0.091977165490067042, 0.092026953430897090, 0.092076741141659743, 0.092126528622231002, 0.092176315872485495, 0.092226102892299197, -0.092275889681547638, 0.092325676240106805, 0.092375462567851327, 0.092425248664657206, 0.092475034530399958, 0.092524820164955557, 0.092574605568198673, 0.092624390740005266, -0.092674175680250895, 0.092723960388811519, 0.092773744865561808, 0.092823529110377723, 0.092873313123135265, 0.092923096903709076, 0.092972880451975159, 0.093022663767809030, -0.093072446851086690, 0.093122229701682782, 0.093172012319473307, 0.093221794704333796, 0.093271576856140237, 0.093321358774767299, 0.093371140460090971, 0.093420921911986782, -0.093470703130330735, 0.093520484114997485, 0.093570264865863020, 0.093620045382802899, 0.093669825665693110, 0.093719605714408322, 0.093769385528824509, 0.093819165108817673, -0.093868944454262485, 0.093918723565034931, 0.093968502441010571, 0.094018281082065405, 0.094068059488074077, 0.094117837658912615, 0.094167615594456550, 0.094217393294581897, -0.094267170759163313, 0.094316947988076813, 0.094366724981197928, 0.094416501738402672, 0.094466278259565731, 0.094516054544563091, 0.094565830593270311, 0.094615606405563407, -0.094665381981317034, 0.094715157320407209, 0.094764932422709933, 0.094814707288099875, 0.094864481916453067, 0.094914256307645037, 0.094964030461551815, 0.095013804378048086, -0.095063578057009823, 0.095113351498312640, 0.095163124701832497, 0.095212897667444119, 0.095262670395023494, 0.095312442884446180, 0.095362215135588208, 0.095411987148324259, -0.095461758922530338, 0.095511530458082028, 0.095561301754855332, 0.095611072812724934, 0.095660843631566850, 0.095710614211256664, 0.095760384551670394, 0.095810154652682708, -0.095859924514169637, 0.095909694136007195, 0.095959463518070082, 0.096009232660234298, 0.096059001562375443, 0.096108770224369519, 0.096158538646091238, 0.096208306827416601, -0.096258074768221208, 0.096307842468381061, 0.096357609927770871, 0.096407377146266654, 0.096457144123743982, 0.096506910860078912, 0.096556677355146114, 0.096606443608821618, -0.096656209620981023, 0.096705975391500332, 0.096755740920254268, 0.096805506207118863, 0.096855271251970118, 0.096905036054682758, 0.096954800615132813, 0.097004564933195855, -0.097054329008747942, 0.097104092841663756, 0.097153856431819341, 0.097203619779090283, 0.097253382883352613, 0.097303145744481054, 0.097352908362351623, 0.097402670736839919, -0.097452432867821986, 0.097502194755172536, 0.097551956398767584, 0.097601717798482743, 0.097651478954194057, 0.097701239865776224, 0.097751000533105301, 0.097800760956057317, -0.097850521134506985, 0.097900281068330347, 0.097950040757403017, 0.097999800201601012, 0.098049559400799083, 0.098099318354873233, 0.098149077063699103, 0.098198835527152722, -0.098248593745108803, 0.098298351717443402, 0.098348109444032134, 0.098397866924751012, 0.098447624159474806, 0.098497381148079516, 0.098547137890440784, 0.098596894386434653, -0.098646650635935834, 0.098696406638820400, 0.098746162394963949, 0.098795917904242525, 0.098845673166530867, 0.098895428181705033, 0.098945182949641067, 0.098994937470213692, -0.099044691743298982, 0.099094445768772535, 0.099144199546510423, 0.099193953076387370, 0.099243706358279435, 0.099293459392062244, 0.099343212177611828, 0.099392964714802953, -0.099442717003511663, 0.099492469043613571, 0.099542220834984763, 0.099591972377499949, 0.099641723671035201, 0.099691474715466161, 0.099741225510668857, 0.099790976056518058, -0.099840726352889819, 0.099890476399660214, 0.099940226196703966, 0.099989975743897147, 0.100039725041115400, 0.100089474088234780, 0.100139222885130020, 0.100188971431677220, -0.100238719727751990, 0.100288467773230390, 0.100338215567987190, 0.100387963111898450, 0.100437710404839800, 0.100487457446687310, 0.100537204237315740, 0.100586950776601170, -0.100636697064419200, 0.100686443100645950, 0.100736188885156130, 0.100785934417825860, 0.100835679698531190, 0.100885424727146870, 0.100935169503549000, 0.100984914027613200, -0.101034658299215550, 0.101084402318230820, 0.101134146084535080, 0.101183889598003980, 0.101233632858513600, 0.101283375865938690, 0.101333118620155340, 0.101382861121039200, -0.101432603368466340, 0.101482345362311540, 0.101532087102450870, 0.101581828588759980, 0.101631569821114970, 0.101681310799390580, 0.101731051523462930, 0.101780791993208080, -0.101830532208500820, 0.101880272169217220, 0.101930011875232930, 0.101979751326424060, 0.102029490522665380, 0.102079229463832970, 0.102128968149802480, 0.102178706580450020, -0.102228444755650350, 0.102278182675279560, 0.102327920339213310, 0.102377657747327720, 0.102427394899497540, 0.102477131795598860, 0.102526868435507360, 0.102576604819099120, -0.102626340946248940, 0.102676076816832900, 0.102725812430726660, 0.102775547787806340, 0.102825282887946720, 0.102875017731023880, 0.102924752316913930, 0.102974486645491680, -0.103024220716633200, 0.103073954530214160, 0.103123688086110680, 0.103173421384197550, 0.103223154424350860, 0.103272887206446280, 0.103322619730359930, 0.103372351995966570, -0.103422084003142360, 0.103471815751762920, 0.103521547241704380, 0.103571278472841550, 0.103621009445050510, 0.103670740158206940, 0.103720470612186980, 0.103770200806865390, -0.103819930742118300, 0.103869660417821820, 0.103919389833850750, 0.103969118990081210, 0.104018847886388880, 0.104068576522649850, 0.104118304898738950, 0.104168033014532290, -0.104217760869905540, 0.104267488464734840, 0.104317215798894970, 0.104366942872262060, 0.104416669684711790, 0.104466396236120290, 0.104516122526362370, 0.104565848555314130, -0.104615574322851280, 0.104665299828849920, 0.104715025073184880, 0.104764750055732270, 0.104814474776368240, 0.104864199234967560, 0.104913923431406400, 0.104963647365560420, -0.105013371037305780, 0.105063094446517260, 0.105112817593071010, 0.105162540476842700, 0.105212263097708490, 0.105261985455543190, 0.105311707550222910, 0.105361429381623360, -0.105411150949620700, 0.105460872254089700, 0.105510593294906530, 0.105560314071946880, 0.105610034585086870, 0.105659754834201360, 0.105709474819166440, 0.105759194539857840, -0.105808913996151690, 0.105858633187922810, 0.105908352115047360, 0.105958070777401460, 0.106007789174859950, 0.106057507307298970, 0.106107225174594210, 0.106156942776621840, -0.106206660113256660, 0.106256377184374850, 0.106306093989852080, 0.106355810529564510, 0.106405526803386980, 0.106455242811195640, 0.106504958552866190, 0.106554674028274790, -0.106604389237296250, 0.106654104179806750, 0.106703818855681980, 0.106753533264798110, 0.106803247407029960, 0.106852961282253690, 0.106902674890345470, 0.106952388231180110, -0.107002101304633790, 0.107051814110582210, 0.107101526648901530, 0.107151238919466610, 0.107200950922153580, 0.107250662656838180, 0.107300374123396550, 0.107350085321703550, -0.107399796251635340, 0.107449506913067640, 0.107499217305876610, 0.107548927429937100, 0.107598637285125270, 0.107648346871316840, 0.107698056188388000, 0.107747765236213570, -0.107797474014669730, 0.107847182523632640, 0.107896890762977150, 0.107946598732579450, 0.107996306432315240, 0.108046013862060700, 0.108095721021690700, 0.108145427911081380, -0.108195134530108500, 0.108244840878648220, 0.108294546956575410, 0.108344252763766220, 0.108393958300096390, 0.108443663565442120, 0.108493368559678250, 0.108543073282680950, -0.108592777734325980, 0.108642481914489500, 0.108692185823046360, 0.108741889459872770, 0.108791592824844460, 0.108841295917837600, 0.108890998738727070, 0.108940701287389030, -0.108990403563699680, 0.109040105567533890, 0.109089807298767840, 0.109139508757277250, 0.109189209942938350, 0.109238910855625980, 0.109288611495216320, 0.109338311861585140, -0.109388011954608620, 0.109437711774161630, 0.109487411320120370, 0.109537110592360570, 0.109586809590758440, 0.109636508315188840, 0.109686206765527970, 0.109735904941651590, -0.109785602843435890, 0.109835300470755720, 0.109884997823487320, 0.109934694901506850, 0.109984391704689220, 0.110034088232910610, 0.110083784486046780, 0.110133480463973910, -0.110183176166566920, 0.110232871593701970, 0.110282566745254860, 0.110332261621101770, 0.110381956221117570, 0.110431650545178490, 0.110481344593160280, 0.110531038364939160, -0.110580731860390000, 0.110630425079389000, 0.110680118021811950, 0.110729810687535040, 0.110779503076433170, 0.110829195188382520, 0.110878887023259350, 0.110928578580938510, -0.110978269861296220, 0.111027960864208260, 0.111077651589550840, 0.111127342037198850, 0.111177032207028500, 0.111226722098915570, 0.111276411712736280, 0.111326101048365520, -0.111375790105679500, 0.111425478884554010, 0.111475167384865260, 0.111524855606488160, 0.111574543549298910, 0.111624231213173300, 0.111673918597987570, 0.111723605703616590, -0.111773292529936600, 0.111822979076823810, 0.111872665344153150, 0.111922351331800810, 0.111972037039642610, 0.112021722467554740, 0.112071407615412120, 0.112121092483090990, -0.112170777070467130, 0.112220461377416770, 0.112270145403814820, 0.112319829149537490, 0.112369512614460600, 0.112419195798460370, 0.112468878701411700, 0.112518561323190840, -0.112568243663673570, 0.112617925722736140, 0.112667607500253450, 0.112717288996101740, 0.112766970210156820, 0.112816651142294900, 0.112866331792390930, 0.112916012160321110, -0.112965692245961720, 0.113015372049187640, 0.113065051569875130, 0.113114730807900010, 0.113164409763138490, 0.113214088435465500, 0.113263766824757310, 0.113313444930889680, -0.113363122753738890, 0.113412800293179850, 0.113462477549088810, 0.113512154521341570, 0.113561831209814390, 0.113611507614382200, 0.113661183734921230, 0.113710859571307300, -0.113760535123416680, 0.113810210391124250, 0.113859885374306320, 0.113909560072839100, 0.113959234486597550, 0.114008908615457910, 0.114058582459296010, 0.114108256017988070, -0.114157929291409070, 0.114207602279435240, 0.114257274981942410, 0.114306947398806830, 0.114356619529903430, 0.114406291375108490, 0.114455962934297830, 0.114505634207347690, -0.114555305194133030, 0.114604975894530100, 0.114654646308414740, 0.114704316435663200, 0.114753986276150440, 0.114803655829752700, 0.114853325096346270, 0.114902994075806080, -0.114952662768008400, 0.115002331172829070, 0.115051999290144360, 0.115101667119829190, 0.115151334661759880, 0.115201001915812220, 0.115250668881862490, 0.115300335559785650, -0.115350001949457980, 0.115399668050755300, 0.115449333863553880, 0.115498999387728700, 0.115548664623156020, 0.115598329569711670, 0.115647994227271940, 0.115697658595711790, -0.115747322674907490, 0.115796986464734880, 0.115846649965070240, 0.115896313175788550, 0.115945976096766060, 0.115995638727879090, 0.116045301069002570, 0.116094963120012790, -0.116144624880785610, 0.116194286351197320, 0.116243947531122850, 0.116293608420438520, 0.116343269019020190, 0.116392929326744110, 0.116442589343485270, 0.116492249069119950, -0.116541908503524010, 0.116591567646573750, 0.116641226498144110, 0.116690885058111410, 0.116740543326351500, 0.116790201302740690, 0.116839858987153920, 0.116889516379467500, -0.116939173479557730, 0.116988830287299590, 0.117038486802569370, 0.117088143025242940, 0.117137798955196590, 0.117187454592305300, 0.117237109936445370, 0.117286764987492670, -0.117336419745323510, 0.117386074209812840, 0.117435728380837000, 0.117485382258271830, 0.117535035841993650, 0.117584689131877430, 0.117634342127799500, 0.117683994829635710, -0.117733647237262370, 0.117783299350554480, 0.117832951169388330, 0.117882602693640260, 0.117932253923185220, 0.117981904857899560, 0.118031555497659130, 0.118081205842340260, -0.118130855891817930, 0.118180505645968460, 0.118230155104667740, 0.118279804267792050, 0.118329453135216420, 0.118379101706817160, 0.118428749982470150, 0.118478397962051690, -0.118528045645436800, 0.118577693032501800, 0.118627340123122570, 0.118676986917175420, 0.118726633414535380, 0.118776279615078740, 0.118825925518681850, 0.118875571125219700, -0.118925216434568620, 0.118974861446604500, 0.119024506161203680, 0.119074150578241140, 0.119123794697593220, 0.119173438519135820, 0.119223082042745270, 0.119272725268296580, -0.119322368195666060, 0.119372010824729630, 0.119421653155363610, 0.119471295187443020, 0.119520936920844190, 0.119570578355443020, 0.119620219491115840, 0.119669860327737670, -0.119719500865184850, 0.119769141103333280, 0.119818781042059300, 0.119868420681237920, 0.119918060020745500, 0.119967699060458360, 0.120017337800251530, 0.120066976240001360, -0.120116614379583750, 0.120166252218875040, 0.120215889757750270, 0.120265526996085770, 0.120315163933757450, 0.120364800570641670, 0.120414436906613440, 0.120464072941549120, -0.120513708675324610, 0.120563344107816270, 0.120612979238899150, 0.120662614068449550, 0.120712248596343440, 0.120761882822457150, 0.120811516746665700, 0.120861150368845450, -0.120910783688872790, 0.120960416706622710, 0.121010049421971590, 0.121059681834795350, 0.121109313944970350, 0.121158945752371610, 0.121208577256875530, 0.121258208458358000, -0.121307839356695370, 0.121357469951762720, 0.121407100243436390, 0.121456730231592310, 0.121506359916106840, 0.121555989296855040, 0.121605618373713250, 0.121655247146557440, -0.121704875615263930, 0.121754503779707800, 0.121804131639765400, 0.121853759195313130, 0.121903386446226020, 0.121953013392380430, 0.122002640033652310, 0.122052266369918030, -0.122101892401052650, 0.122151518126932530, 0.122201143547433620, 0.122250768662432300, 0.122300393471803600, 0.122350017975423940, 0.122399642173169220, 0.122449266064915840, -0.122498889650538840, 0.122548512929914630, 0.122598135902919140, 0.122647758569428740, 0.122697380929318510, 0.122747002982464830, 0.122796624728743640, 0.122846246168031330, -0.122895867300202950, 0.122945488125134920, 0.122995108642703600, 0.123044728852784070, 0.123094348755252730, 0.123143968349985510, 0.123193587636858810, 0.123243206615747700, -0.123292825286528560, 0.123342443649077370, 0.123392061703270510, 0.123441679448983060, 0.123491296886091410, 0.123540914014471510, 0.123590530833999760, 0.123640147344551250, -0.123689763546002390, 0.123739379438229100, 0.123788995021107810, 0.123838610294513580, 0.123888225258322840, 0.123937839912411970, 0.123987454256656070, 0.124037068290931520, -0.124086682015114300, 0.124136295429080820, 0.124185908532706170, 0.124235521325866740, 0.124285133808438500, 0.124334745980297880, 0.124384357841319950, 0.124433969391381110, -0.124483580630357370, 0.124533191558125100, 0.124582802174559430, 0.124632412479536740, 0.124682022472933020, 0.124731632154624680, 0.124781241524486830, 0.124830850582395870, -0.124880459328228240, 0.124930067761859000, 0.124979675883164600, 0.125029283692021010, 0.125078891188304650, 0.125128498371890630, 0.125178105242655350, 0.125227711800474820, -0.125277318045225430, 0.125326923976782330, 0.125376529595021910, 0.125426134899820160, 0.125475739891053510, 0.125525344568597070, 0.125574948932327290, 0.125624552982120140, -0.125674156717852010, 0.125723760139398070, 0.125773363246634740, 0.125822966039438430, 0.125872568517684270, 0.125922170681248670, 0.125971772530007660, 0.126021374063837680, -0.126070975282613800, 0.126120576186212470, 0.126170176774509730, 0.126219777047381960, 0.126269377004704310, 0.126318976646353250, 0.126368575972204720, 0.126418174982135200, -0.126467773676019770, 0.126517372053734950, 0.126566970115156690, 0.126616567860161430, 0.126666165288624320, 0.126715762400421790, 0.126765359195429860, 0.126814955673524990, -0.126864551834582260, 0.126914147678478170, 0.126963743205089160, 0.127013338414290330, 0.127062933305958160, 0.127112527879968660, 0.127162122136198260, 0.127211716074522140, -0.127261309694816720, 0.127310902996958020, 0.127360495980822520, 0.127410088646285340, 0.127459680993222910, 0.127509273021511300, 0.127558864731026960, 0.127608456121645010, -0.127658047193241890, 0.127707637945693670, 0.127757228378876820, 0.127806818492666420, 0.127856408286939010, 0.127905997761570990, 0.127955586916437550, 0.128005175751415150, -0.128054764266379790, 0.128104352461207970, 0.128153940335774850, 0.128203527889956840, 0.128253115123630020, 0.128302702036670880, 0.128352288628954540, 0.128401874900357450, -0.128451460850755680, 0.128501046480025720, 0.128550631788042690, 0.128600216774683060, 0.128649801439822910, 0.128699385783338700, 0.128748969805105580, 0.128798553505000050, -0.128848136882898560, 0.128897719938676270, 0.128947302672209720, 0.128996885083374900, 0.129046467172048290, 0.129096048938105080, 0.129145630381421740, 0.129195211501874350, -0.129244792299339360, 0.129294372773691930, 0.129343952924808600, 0.129393532752565380, 0.129443112256838740, 0.129492691437503920, 0.129542270294437320, 0.129591848827515090, -0.129641427036613660, 0.129691004921608230, 0.129740582482375270, 0.129790159718790880, 0.129839736630731510, 0.129889313218072370, 0.129938889480689930, 0.129988465418460740, -0.130038041031259930, 0.130087616318964010, 0.130137191281449040, 0.130186765918591550, 0.130236340230266700, 0.130285914216351000, 0.130335487876720500, 0.130385061211251760, -0.130434634219819880, 0.130484206902301450, 0.130533779258572490, 0.130583351288509510, 0.130632922991987730, 0.130682494368883630, 0.130732065419073310, 0.130781636142433240, -0.130831206538838670, 0.130880776608166080, 0.130930346350291970, 0.130979915765091550, 0.131029484852441370, 0.131079053612217440, 0.131128622044296340, 0.131178190148553250, -0.131227757924864690, 0.131277325373106710, 0.131326892493155850, 0.131376459284887340, 0.131426025748177690, 0.131475591882902950, 0.131525157688939690, 0.131574723166163090, -0.131624288314449690, 0.131673853133675550, 0.131723417623717250, 0.131772981784449930, 0.131822545615750190, 0.131872109117494500, 0.131921672289558090, 0.131971235131817520, -0.132020797644148870, 0.132070359826428650, 0.132119921678532090, 0.132169483200335720, 0.132219044391715640, 0.132268605252548410, 0.132318165782709220, 0.132367725982074610, -0.132417285850520680, 0.132466845387924000, 0.132516404594159750, 0.132565963469104490, 0.132615522012634300, 0.132665080224625780, 0.132714638104954100, 0.132764195653495810, -0.132813752870127500, 0.132863309754724350, 0.132912866307162950, 0.132962422527319350, 0.133011978415070150, 0.133061533970290580, 0.133111089192857160, 0.133160644082646020, -0.133210198639533710, 0.133259752863395450, 0.133309306754107820, 0.133358860311546920, 0.133408413535589330, 0.133457966426110240, 0.133507518982986240, 0.133557071206093450, -0.133606623095308410, 0.133656174650506360, 0.133705725871563900, 0.133755276758357110, 0.133804827310762600, 0.133854377528655530, 0.133903927411912570, 0.133953476960410180, -0.134003026174023680, 0.134052575052629630, 0.134102123596104130, 0.134151671804323750, 0.134201219677163780, 0.134250767214500740, 0.134300314416210760, 0.134349861282170470, -0.134399407812255070, 0.134448954006341160, 0.134498499864304870, 0.134548045386022750, 0.134597590571370110, 0.134647135420223470, 0.134696679932458980, 0.134746224107953260, -0.134795767946581520, 0.134845311448220350, 0.134894854612746360, 0.134944397440034780, 0.134993939929962230, 0.135043482082404800, 0.135093023897239120, 0.135142565374340440, -0.135192106513585350, 0.135241647314850000, 0.135291187778010940, 0.135340727902943490, 0.135390267689524220, 0.135439807137629290, 0.135489346247135290, 0.135538885017917470, -0.135588423449852450, 0.135637961542816350, 0.135687499296685780, 0.135737036711336050, 0.135786573786643720, 0.135836110522485400, 0.135885646918736340, 0.135935182975273180, -0.135984718691972070, 0.136034254068709590, 0.136083789105361040, 0.136133323801803010, 0.136182858157911670, 0.136232392173563640, 0.136281925848634190, 0.136331459182999910, -0.136380992176536990, 0.136430524829122020, 0.136480057140630300, 0.136529589110938460, 0.136579120739922620, 0.136628652027459440, 0.136678182973424180, 0.136727713577693450, -0.136777243840143450, 0.136826773760650780, 0.136876303339090730, 0.136925832575339940, 0.136975361469274970, 0.137024890020771200, 0.137074418229705170, 0.137123946095953130, -0.137173473619391640, 0.137223000799896020, 0.137272527637342910, 0.137322054131608470, 0.137371580282569350, 0.137421106090100830, 0.137470631554079570, 0.137520156674381690, -0.137569681450883880, 0.137619205883461440, 0.137668729971990980, 0.137718253716348660, 0.137767777116411190, 0.137817300172053820, 0.137866822883153190, 0.137916345249585960, -0.137965867271227420, 0.138015388947954200, 0.138064910279642520, 0.138114431266169010, 0.138163951907408960, 0.138213472203239040, 0.138262992153535460, 0.138312511758174830, -0.138362031017032460, 0.138411549929985030, 0.138461068496908730, 0.138510586717680180, 0.138560104592174740, 0.138609622120269030, 0.138659139301839260, 0.138708656136762090, -0.138758172624912860, 0.138807688766168170, 0.138857204560404710, 0.138906720007497790, 0.138956235107324080, 0.139005749859759780, 0.139055264264681510, 0.139104778321964690, -0.139154292031485910, 0.139203805393121380, 0.139253318406747790, 0.139302831072240480, 0.139352343389476080, 0.139401855358330830, 0.139451366978681350, 0.139500878250403050, -0.139550389173372540, 0.139599899747466060, 0.139649409972560260, 0.139698919848530500, 0.139748429375253450, 0.139797938552605750, 0.139847447380462790, 0.139896955858701180, -0.139946463987197180, 0.139995971765827480, 0.140045479194467410, 0.140094986272993630, 0.140144493001282400, 0.140193999379210370, 0.140243505406652900, 0.140293011083486690, -0.140342516409587920, 0.140392021384833310, 0.140441526009098210, 0.140491030282259290, 0.140540534204192800, 0.140590037774775380, 0.140639540993882480, 0.140689043861390690, -0.140738546377176310, 0.140788048541115980, 0.140837550353085120, 0.140887051812960380, 0.140936552920618440, 0.140986053675934670, 0.141035554078785790, 0.141085054129048010, -0.141134553826598010, 0.141184053171311220, 0.141233552163064300, 0.141283050801733480, 0.141332549087195470, 0.141382047019325660, 0.141431544598000720, 0.141481041823096950, -0.141530538694490980, 0.141580035212058250, 0.141629531375675410, 0.141679027185218740, 0.141728522640564960, 0.141778017741589430, 0.141827512488168860, 0.141877006880179930, -0.141926500917498060, 0.141975994599999930, 0.142025487927561810, 0.142074980900060430, 0.142124473517371150, 0.142173965779370660, 0.142223457685935280, 0.142272949236941700, -0.142322440432265300, 0.142371931271782800, 0.142421421755370450, 0.142470911882905000, 0.142520401654261860, 0.142569891069317670, 0.142619380127948780, 0.142668868830031880, -0.142718357175442350, 0.142767845164056940, 0.142817332795752370, 0.142866820070403990, 0.142916306987888600, 0.142965793548082420, 0.143015279750862200, 0.143064765596103340, -0.143114251083682590, 0.143163736213476170, 0.143213220985360880, 0.143262705399212100, 0.143312189454906540, 0.143361673152320510, 0.143411156491330740, 0.143460639471812620, -0.143510122093642920, 0.143559604356697930, 0.143609086260854340, 0.143658567805987620, 0.143708048991974450, 0.143757529818691190, 0.143807010286014530, 0.143856490393819900, -0.143905970141984060, 0.143955449530383720, 0.144004928558894320, 0.144054407227392600, 0.144103885535754870, 0.144153363483857850, 0.144202841071576990, 0.144252318298789010, -0.144301795165370260, 0.144351271671197460, 0.144400747816146040, 0.144450223600092740, 0.144499699022913870, 0.144549174084486230, 0.144598648784685170, 0.144648123123387510, -0.144697597100469560, 0.144747070715808030, 0.144796543969278410, 0.144846016860757400, 0.144895489390121810, 0.144944961557247040, 0.144994433362009870, 0.145043904804286610, -0.145093375883954050, 0.145142846600887610, 0.145192316954964040, 0.145241786946059690, 0.145291256574051290, 0.145340725838814330, 0.145390194740225550, 0.145439663278161270, -0.145489131452498280, 0.145538599263112020, 0.145588066709879280, 0.145637533792676350, 0.145687000511380030, 0.145736466865865780, 0.145785932856010350, 0.145835398481690550, -0.145884863742781780, 0.145934328639160890, 0.145983793170704150, 0.146033257337288360, 0.146082721138789010, 0.146132184575082870, 0.146181647646046240, 0.146231110351555920, -0.146280572691487420, 0.146330034665717450, 0.146379496274122420, 0.146428957516579080, 0.146478418392962910, 0.146527878903150690, 0.146577339047018810, 0.146626798824443960, -0.146676258235301730, 0.146725717279468810, 0.146775175956822050, 0.146824634267236910, 0.146874092210590200, 0.146923549786758260, 0.146973006995617860, 0.147022463837044510, -0.147071920310915010, 0.147121376417105710, 0.147170832155493400, 0.147220287525953590, 0.147269742528363030, 0.147319197162598140, 0.147368651428535670, 0.147418105326051150, -0.147467558855021390, 0.147517012015322690, 0.147566464806831920, 0.147615917229424550, 0.147665369282977380, 0.147714820967366790, 0.147764272282469580, 0.147813723228161280, -0.147863173804318630, 0.147912624010818510, 0.147962073847536370, 0.148011523314349080, 0.148060972411132950, 0.148110421137764850, 0.148159869494120240, 0.148209317480075960, -0.148258765095508390, 0.148308212340294370, 0.148357659214309350, 0.148407105717430180, 0.148456551849533270, 0.148505997610495400, 0.148555443000192110, 0.148604888018500190, -0.148654332665296070, 0.148703776940456560, 0.148753220843857140, 0.148802664375374700, 0.148852107534886040, 0.148901550322266650, 0.148950992737393400, 0.149000434780142660, -0.149049876450391280, 0.149099317748014740, 0.149148758672889930, 0.149198199224893220, 0.149247639403901460, 0.149297079209790160, 0.149346518642436170, 0.149395957701715880, -0.149445396387506120, 0.149494834699682420, 0.149544272638121640, 0.149593710202700210, 0.149643147393294930, 0.149692584209781320, 0.149742020652036260, 0.149791456719936600, -0.149840892413357850, 0.149890327732176860, 0.149939762676270070, 0.149989197245514290, 0.150038631439785100, 0.150088065258959320, 0.150137498702913370, 0.150186931771524150, -0.150236364464667120, 0.150285796782219210, 0.150335228724056770, 0.150384660290056730, 0.150434091480094590, 0.150483522294047210, 0.150532952731791040, 0.150582382793202910, -0.150631812478158410, 0.150681241786534360, 0.150730670718207200, 0.150780099273053830, 0.150829527450949740, 0.150878955251771860, 0.150928382675397020, 0.150977809721700770, -0.151027236390560010, 0.151076662681851160, 0.151126088595451100, 0.151175514131235370, 0.151224939289080850, 0.151274364068863960, 0.151323788470461630, 0.151373212493749380, -0.151422636138604130, 0.151472059404902240, 0.151521482292520660, 0.151570904801334950, 0.151620326931221960, 0.151669748682058150, 0.151719170053720430, 0.151768591046084340, -0.151818011659026750, 0.151867431892424600, 0.151916851746153410, 0.151966271220090100, 0.152015690314111110, 0.152065109028093340, 0.152114527361912330, 0.152163945315445030, -0.152213362888567880, 0.152262780081157730, 0.152312196893090200, 0.152361613324242170, 0.152411029374490140, 0.152460445043710920, 0.152509860331780210, 0.152559275238574820, -0.152608689763971240, 0.152658103907846370, 0.152707517670075820, 0.152756931050536450, 0.152806344049105200, 0.152855756665657650, 0.152905168900070720, 0.152954580752220880, -0.153003992221984990, 0.153053403309238720, 0.153102814013858920, 0.153152224335722090, 0.153201634274705120, 0.153251043830683640, 0.153300453003534560, 0.153349861793134340, -0.153399270199359890, 0.153448678222086850, 0.153498085861192100, 0.153547493116552140, 0.153596899988043880, 0.153646306475542950, 0.153695712578926220, 0.153745118298070690, -0.153794523632851900, 0.153843928583146800, 0.153893333148831880, 0.153942737329784090, 0.153992141125878970, 0.154041544536993540, 0.154090947563004230, 0.154140350203788000, -0.154189752459220450, 0.154239154329178510, 0.154288555813538700, 0.154337956912177910, 0.154387357624971830, 0.154436757951797320, 0.154486157892530950, 0.154535557447049580, -0.154584956615228920, 0.154634355396945840, 0.154683753792076880, 0.154733151800498990, 0.154782549422087770, 0.154831946656720180, 0.154881343504273160, 0.154930739964622340, -0.154980136037644660, 0.155029531723216650, 0.155078927021215260, 0.155128321931516100, 0.155177716453996140, 0.155227110588531890, 0.155276504335000310, 0.155325897693277010, -0.155375290663238990, 0.155424683244762720, 0.155474075437725210, 0.155523467242002030, 0.155572858657470230, 0.155622249684006260, 0.155671640321487090, 0.155721030569788390, -0.155770420428787110, 0.155819809898360250, 0.155869198978383390, 0.155918587668733540, 0.155967975969287240, 0.156017363879921410, 0.156066751400511770, 0.156116138530935230, -0.156165525271068330, 0.156214911620788070, 0.156264297579970100, 0.156313683148491370, 0.156363068326228430, 0.156412453113058260, 0.156461837508856530, 0.156511221513500190, -0.156560605126865810, 0.156609988348830360, 0.156659371179269510, 0.156708753618060190, 0.156758135665079460, 0.156807517320202950, 0.156856898583307650, 0.156906279454270080, -0.156955659932967260, 0.157005040019274870, 0.157054419713069850, 0.157103799014228800, 0.157153177922628700, 0.157202556438145210, 0.157251934560655310, 0.157301312290035580, -0.157350689626163030, 0.157400066568913280, 0.157449443118163390, 0.157498819273789890, 0.157548195035669770, 0.157597570403678750, 0.157646945377693780, 0.157696319957591450, -0.157745694143248770, 0.157795067934541400, 0.157844441331346370, 0.157893814333540690, 0.157943186941000010, 0.157992559153601360, 0.158041930971221320, 0.158091302393736920, -0.158140673421023780, 0.158190044052958970, 0.158239414289419070, 0.158288784130281050, 0.158338153575420660, 0.158387522624714870, 0.158436891278040250, 0.158486259535273870, -0.158535627396291400, 0.158584994860969860, 0.158634361929185810, 0.158683728600816340, 0.158733094875737060, 0.158782460753825070, 0.158831826234957370, 0.158881191319009660, -0.158930556005858980, 0.158979920295381880, 0.159029284187455430, 0.159078647681955340, 0.159128010778758660, 0.159177373477741910, 0.159226735778782190, 0.159276097681755160, -0.159325459186537900, 0.159374820293007010, 0.159424181001039500, 0.159473541310511090, 0.159522901221298840, 0.159572260733279320, 0.159621619846329610, 0.159670978560325390, -0.159720336875143730, 0.159769694790661660, 0.159819052306754920, 0.159868409423300550, 0.159917766140175170, 0.159967122457255810, 0.160016478374418180, 0.160065833891539390, -0.160115189008495970, 0.160164543725165060, 0.160213898041422330, 0.160263251957144860, 0.160312605472209270, 0.160361958586492580, 0.160411311299870570, 0.160460663612220280, -0.160510015523418340, 0.160559367033341780, 0.160608718141866390, 0.160658068848869180, 0.160707419154227260, 0.160756769057816330, 0.160806118559513490, 0.160855467659195370, -0.160904816356738980, 0.160954164652020140, 0.161003512544915880, 0.161052860035302840, 0.161102207123058090, 0.161151553808057370, 0.161200900090177790, 0.161250245969295960, -0.161299591445288940, 0.161348936518032500, 0.161398281187403710, 0.161447625453279230, 0.161496969315536140, 0.161546312774050150, 0.161595655828698420, 0.161644998479357540, -0.161694340725904580, 0.161743682568215340, 0.161793024006166910, 0.161842365039636340, 0.161891705668499420, 0.161941045892633250, 0.161990385711914460, 0.162039725126220140, -0.162089064135426060, 0.162138402739409330, 0.162187740938046610, 0.162237078731214960, 0.162286416118790160, 0.162335753100649320, 0.162385089676669120, 0.162434425846726630, -0.162483761610697640, 0.162533096968459220, 0.162582431919888080, 0.162631766464861300, 0.162681100603254660, 0.162730434334945270, 0.162779767659810230, 0.162829100577725340, -0.162878433088567700, 0.162927765192213970, 0.162977096888541260, 0.163026428177425380, 0.163075759058743410, 0.163125089532372060, 0.163174419598188430, 0.163223749256068310, -0.163273078505888790, 0.163322407347526590, 0.163371735780858840, 0.163421063805761270, 0.163470391422111060, 0.163519718629784870, 0.163569045428659830, 0.163618371818611720, -0.163667697799517700, 0.163717023371254850, 0.163766348533699040, 0.163815673286727330, 0.163864997630216420, 0.163914321564043480, 0.163963645088084310, 0.164012968202216000, -0.164062290906315300, 0.164111613200259270, 0.164160935083923790, 0.164210256557185990, 0.164259577619922520, 0.164308898272010560, 0.164358218513325910, 0.164407538343745720, -0.164456857763146700, 0.164506176771405940, 0.164555495368399330, 0.164604813554003970, 0.164654131328096560, 0.164703448690554280, 0.164752765641252940, 0.164802082180069670, -0.164851398306881640, 0.164900714021564670, 0.164950029323995940, 0.164999344214052100, 0.165048658691610370, 0.165097972756546560, 0.165147286408737800, 0.165196599648060800, -0.165245912474392770, 0.165295224887609530, 0.165344536887588210, 0.165393848474205550, 0.165443159647338690, 0.165492470406863520, 0.165541780752657160, 0.165591090684596350, -0.165640400202558270, 0.165689709306418740, 0.165739017996054920, 0.165788326271344020, 0.165837634132161850, 0.165886941578385600, 0.165936248609891980, 0.165985555226558200, -0.166034861428260070, 0.166084167214874820, 0.166133472586279110, 0.166182777542350200, 0.166232082082963860, 0.166281386207997340, 0.166330689917327380, 0.166379993210831110, -0.166429296088384420, 0.166478598549864490, 0.166527900595148050, 0.166577202224112320, 0.166626503436633130, 0.166675804232587680, 0.166725104611853160, 0.166774404574305450, -0.166823704119821730, 0.166873003248278750, 0.166922301959553680, 0.166971600253522450, 0.167020898130062180, 0.167070195589049700, 0.167119492630362160, 0.167168789253875430, -0.167218085459466730, 0.167267381247012850, 0.167316676616390940, 0.167365971567476870, 0.167415266100147900, 0.167464560214280770, 0.167513853909752650, 0.167563147186439500, -0.167612440044218440, 0.167661732482966290, 0.167711024502560260, 0.167760316102876230, 0.167809607283791410, 0.167858898045183000, 0.167908188386926890, 0.167957478308900340, -0.168006767810980090, 0.168056056893043340, 0.168105345554966030, 0.168154633796625350, 0.168203921617898100, 0.168253209018661450, 0.168302495998791380, 0.168351782558165050, -0.168401068696659250, 0.168450354414151240, 0.168499639710516870, 0.168548924585633450, 0.168598209039377670, 0.168647493071626830, 0.168696776682256830, 0.168746059871144880, -0.168795342638168200, 0.168844624983202740, 0.168893906906125740, 0.168943188406813940, 0.168992469485144630, 0.169041750140993680, 0.169091030374238370, 0.169140310184755500, -0.169189589572422280, 0.169238868537114650, 0.169288147078709840, 0.169337425197084670, 0.169386702892116350, 0.169435980163680860, 0.169485257011655430, 0.169534533435916850, -0.169583809436342350, 0.169633085012807910, 0.169682360165190750, 0.169731634893368150, 0.169780909197216000, 0.169830183076611600, 0.169879456531431720, 0.169928729561553640, -0.169978002166853300, 0.170027274347207960, 0.170076546102494420, 0.170125817432589980, 0.170175088337370550, 0.170224358816713380, 0.170273628870495320, 0.170322898498593640, -0.170372167700884260, 0.170421436477244480, 0.170470704827551080, 0.170519972751681380, 0.170569240249511310, 0.170618507320918130, 0.170667773965779120, 0.170717040183970240, -0.170766305975368770, 0.170815571339851510, 0.170864836277295790, 0.170914100787577520, 0.170963364870574010, 0.171012628526162060, 0.171061891754219010, 0.171111154554620780, -0.171160416927244650, 0.171209678871967500, 0.171258940388666570, 0.171308201477217870, 0.171357462137498670, 0.171406722369385810, 0.171455982172756570, 0.171505241547486950, -0.171554500493454220, 0.171603759010535230, 0.171653017098607280, 0.171702274757546370, 0.171751531987229760, 0.171800788787534770, 0.171850045158337350, 0.171899301099514850, -0.171948556610944050, 0.171997811692502330, 0.172047066344065640, 0.172096320565511270, 0.172145574356716100, 0.172194827717557450, 0.172244080647911270, 0.172293333147654910, -0.172342585216665210, 0.172391836854819490, 0.172441088061993740, 0.172490338838065250, 0.172539589182910930, 0.172588839096408070, 0.172638088578432660, 0.172687337628862040, -0.172736586247573540, 0.172785834434443120, 0.172835082189348090, 0.172884329512165370, 0.172933576402772270, 0.172982822861044800, 0.173032068886860260, 0.173081314480095530, -0.173130559640627980, 0.173179804368333580, 0.173229048663089690, 0.173278292524773170, 0.173327535953261340, 0.173376778948430230, 0.173426021510157180, 0.173475263638319080, -0.173524505332793260, 0.173573746593455760, 0.173622987420183870, 0.173672227812854930, 0.173721467771345010, 0.173770707295531400, 0.173819946385291050, 0.173869185040501250, -0.173918423261038070, 0.173967661046778830, 0.174016898397600400, 0.174066135313380190, 0.174115371793994220, 0.174164607839319810, 0.174213843449233850, 0.174263078623613760, -0.174312313362335520, 0.174361547665276480, 0.174410781532313600, 0.174460014963324190, 0.174509247958184290, 0.174558480516771310, 0.174607712638962100, 0.174656944324634050, -0.174706175573663190, 0.174755406385926900, 0.174804636761302530, 0.174853866699666160, 0.174903096200895090, 0.174952325264866290, 0.175001553891457110, 0.175050782080543620, -0.175100009832003160, 0.175149237145712680, 0.175198464021549540, 0.175247690459389820, 0.175296916459110860, 0.175346142020589600, 0.175395367143703430, 0.175444591828328420, -0.175493816074341920, 0.175543039881620870, 0.175592263250042680, 0.175641486179483390, 0.175690708669820370, 0.175739930720931030, 0.175789152332691410, 0.175838373504978910, -0.175887594237670470, 0.175936814530643500, 0.175986034383774050, 0.176035253796939520, 0.176084472770016850, 0.176133691302883450, 0.176182909395415370, 0.176232127047490030, -0.176281344258984340, 0.176330561029775760, 0.176379777359740310, 0.176428993248755440, 0.176478208696698090, 0.176527423703445650, 0.176576638268874210, 0.176625852392861160, -0.176675066075283940, 0.176724279316018610, 0.176773492114942590, 0.176822704471932820, 0.176871916386866720, 0.176921127859620410, 0.176970338890071300, 0.177019549478096310, -0.177068759623572910, 0.177117969326377160, 0.177167178586386480, 0.177216387403477870, 0.177265595777528710, 0.177314803708415130, 0.177364011196014530, 0.177413218240203920, -0.177462424840860690, 0.177511630997860990, 0.177560836711082170, 0.177610041980401730, 0.177659246805695730, 0.177708451186841620, 0.177757655123716380, 0.177806858616197440, -0.177856061664160900, 0.177905264267484240, 0.177954466426044370, 0.178003668139718820, 0.178052869408383630, 0.178102070231916290, 0.178151270610193760, 0.178200470543093490, -0.178249670030491610, 0.178298869072265580, 0.178348067668292340, 0.178397265818449390, 0.178446463522612810, 0.178495660780660120, 0.178544857592468240, 0.178594053957914670, -0.178643249876875520, 0.178692445349228230, 0.178741640374850300, 0.178790834953617810, 0.178840029085408220, 0.178889222770098580, 0.178938416007566330, 0.178987608797687580, -0.179036801140339820, 0.179085993035400040, 0.179135184482745740, 0.179184375482253020, 0.179233566033799360, 0.179282756137261800, 0.179331945792517770, 0.179381134999443470, -0.179430323757916290, 0.179479512067813350, 0.179528699929012020, 0.179577887341388520, 0.179627074304820310, 0.179676260819184840, 0.179725446884358290, 0.179774632500218130, -0.179823817666641380, 0.179873002383505510, 0.179922186650686710, 0.179971370468062440, 0.180020553835509740, 0.180069736752906110, 0.180118919220127680, 0.180168101237051990, -0.180217282803556010, 0.180266463919517260, 0.180315644584811920, 0.180364824799317480, 0.180414004562910960, 0.180463183875469890, 0.180512362736870410, 0.180561541146990020, -0.180610719105706200, 0.180659896612895170, 0.180709073668434390, 0.180758250272200940, 0.180807426424072270, 0.180856602123924630, 0.180905777371635460, 0.180954952167081850, -0.181004126510141310, 0.181053300400690010, 0.181102473838605450, 0.181151646823764720, 0.181200819356045290, 0.181249991435323390, 0.181299163061476530, 0.181348334234381740, -0.181397504953916540, 0.181446675219957170, 0.181495845032381090, 0.181545014391065410, 0.181594183295887610, 0.181643351746723940, 0.181692519743451880, 0.181741687285948940, -0.181790854374091370, 0.181840021007756670, 0.181889187186821900, 0.181938352911164610, 0.181987518180661000, 0.182036682995188580, 0.182085847354624460, 0.182135011258846150, -0.182184174707729910, 0.182233337701153190, 0.182282500238993140, 0.182331662321127300, 0.182380823947431850, 0.182429985117784330, 0.182479145832061870, 0.182528306090141950, -0.182577465891900850, 0.182626625237216090, 0.182675784125965190, 0.182724942558024410, 0.182774100533271260, 0.182823258051582870, 0.182872415112836750, 0.182921571716909180, -0.182970727863677660, 0.183019883553019320, 0.183069038784811730, 0.183118193558931110, 0.183167347875254990, 0.183216501733660500, 0.183265655134025180, 0.183314808076225300, -0.183363960560138400, 0.183413112585641610, 0.183462264152612440, 0.183511415260927210, 0.183560565910463440, 0.183609716101098660, 0.183658865832709180, 0.183708015105172540, -0.183757163918365830, 0.183806312272166680, 0.183855460166451300, 0.183904607601097250, 0.183953754575981730, 0.184002901090982220, 0.184052047145975030, 0.184101192740837720, -0.184150337875447430, 0.184199482549681740, 0.184248626763416910, 0.184297770516530510, 0.184346913808899670, 0.184396056640401980, 0.184445199010913750, 0.184494340920312470, -0.184543482368475810, 0.184592623355280010, 0.184641763880602630, 0.184690903944320860, 0.184740043546312240, 0.184789182686453090, 0.184838321364621000, 0.184887459580693080, -0.184936597334546950, 0.184985734626058910, 0.185034871455106530, 0.185084007821566950, 0.185133143725317810, 0.185182279166235360, 0.185231414144197220, 0.185280548659080560, -0.185329682710762940, 0.185378816299120670, 0.185427949424031370, 0.185477082085372220, 0.185526214283020770, 0.185575346016853350, 0.185624477286747580, 0.185673608092581040, -0.185722738434230070, 0.185771868311572250, 0.185820997724484740, 0.185870126672845170, 0.185919255156529850, 0.185968383175416390, 0.186017510729382000, 0.186066637818304240, -0.186115764442059460, 0.186164890600525270, 0.186214016293578840, 0.186263141521097800, 0.186312266282958490, 0.186361390579038530, 0.186410514409215050, 0.186459637773365740, -0.186508760671366900, 0.186557883103096180, 0.186607005068431170, 0.186656126567248200, 0.186705247599424940, 0.186754368164838540, 0.186803488263366650, 0.186852607894885610, -0.186901727059273080, 0.186950845756406190, 0.186999963986162640, 0.187049081748418750, 0.187098199043052170, 0.187147315869940050, 0.187196432228960100, 0.187245548119988640, -0.187294663542903310, 0.187343778497581300, 0.187392892983900300, 0.187442007001736630, 0.187491120550967920, 0.187540233631471880, 0.187589346243124790, 0.187638458385804340, -0.187687570059387770, 0.187736681263752670, 0.187785791998775460, 0.187834902264333780, 0.187884012060304810, 0.187933121386566260, 0.187982230242994490, 0.188031338629467110, -0.188080446545861400, 0.188129553992055030, 0.188178660967924320, 0.188227767473346940, 0.188276873508200160, 0.188325979072361650, 0.188375084165707720, 0.188424188788116090, -0.188473292939464020, 0.188522396619629110, 0.188571499828487810, 0.188620602565917730, 0.188669704831796600, 0.188718806626000770, 0.188767907948407920, 0.188817008798895290, -0.188866109177340590, 0.188915209083620170, 0.188964308517611730, 0.189013407479192510, 0.189062505968240230, 0.189111603984631230, 0.189160701528243210, 0.189209798598953480, -0.189258895196639660, 0.189307991321178150, 0.189357086972446690, 0.189406182150322510, 0.189455276854683300, 0.189504371085405470, 0.189553464842366710, 0.189602558125444710, -0.189651650934515890, 0.189700743269457960, 0.189749835130148150, 0.189798926516464180, 0.189848017428282470, 0.189897107865480720, 0.189946197827936200, 0.189995287315526620, -0.190044376328128400, 0.190093464865619200, 0.190142552927876380, 0.190191640514777600, 0.190240727626199290, 0.190289814262019130, 0.190338900422114460, 0.190387986106362980, -0.190437071314641080, 0.190486156046826500, 0.190535240302796980, 0.190584324082428920, 0.190633407385600060, 0.190682490212187670, 0.190731572562069490, 0.190780654435121960, -0.190829735831222760, 0.190878816750249260, 0.190927897192079120, 0.190976977156588820, 0.191026056643656070, 0.191075135653158170, 0.191124214184972880, 0.191173292238976610, -0.191222369815047120, 0.191271446913061720, 0.191320523532898110, 0.191369599674432760, 0.191418675337543420, 0.191467750522107820, 0.191516825228002420, 0.191565899455104940, -0.191614973203292740, 0.191664046472443510, 0.191713119262433730, 0.191762191573141170, 0.191811263404443130, 0.191860334756217360, 0.191909405628340330, 0.191958476020689770, -0.192007545933143010, 0.192056615365577860, 0.192105684317870700, 0.192154752789899350, 0.192203820781541110, 0.192252888292673760, 0.192301955323173730, 0.192351021872918830, -0.192400087941786370, 0.192449153529654140, 0.192498218636398570, 0.192547283261897460, 0.192596347406028600, 0.192645411068668420, 0.192694474249694710, 0.192743536948984800, -0.192792599166416500, 0.192841660901866270, 0.192890722155211890, 0.192939782926330680, 0.192988843215100490, 0.193037903021397730, 0.193086962345100200, 0.193136021186085280, -0.193185079544230750, 0.193234137419413060, 0.193283194811510050, 0.193332251720399060, 0.193381308145957860, 0.193430364088062970, 0.193479419546592150, 0.193528474521423220, -0.193577529012432660, 0.193626583019498310, 0.193675636542497480, 0.193724689581307980, 0.193773742135806340, 0.193822794205870340, 0.193871845791377370, 0.193920896892205210, -0.193969947508230350, 0.194018997639330640, 0.194068047285383460, 0.194117096446266570, 0.194166145121856510, 0.194215193312031080, 0.194264241016667670, 0.194313288235644090, -0.194362334968836870, 0.194411381216123810, 0.194460426977382720, 0.194509472252490130, 0.194558517041323880, 0.194607561343761310, 0.194656605159680280, 0.194705648488957300, -0.194754691331470190, 0.194803733687096360, 0.194852775555713650, 0.194901816937198550, 0.194950857831428900, 0.194999898238282120, 0.195048938157636020, 0.195097977589367140, -0.195147016533353340, 0.195196054989471960, 0.195245092957600900, 0.195294130437616680, 0.195343167429397110, 0.195392203932819640, 0.195441239947762080, 0.195490275474101000, -0.195539310511714220, 0.195588345060479620, 0.195637379120273710, 0.195686412690974340, 0.195735445772458940, 0.195784478364605390, 0.195833510467290170, 0.195882542080391190, -0.195931573203785870, 0.195980603837352020, 0.196029633980966260, 0.196078663634506410, 0.196127692797849890, 0.196176721470874560, 0.196225749653457020, 0.196274777345475080, -0.196323804546806200, 0.196372831257328270, 0.196421857476917790, 0.196470883205452700, 0.196519908442810810, 0.196568933188868730, 0.196617957443504300, 0.196666981206595010, -0.196716004478018680, 0.196765027257651910, 0.196814049545372540, 0.196863071341058100, 0.196912092644586370, 0.196961113455834000, 0.197010133774678850, 0.197059153600998350, -0.197108172934670390, 0.197157191775571590, 0.197206210123579810, 0.197255227978572510, 0.197304245340427540, 0.197353262209021550, 0.197402278584232400, 0.197451294465937980, -0.197500309854014900, 0.197549324748341030, 0.197598339148793850, 0.197647353055251270, 0.197696366467589870, 0.197745379385687560, 0.197794391809421790, 0.197843403738670490, -0.197892415173310220, 0.197941426113218940, 0.197990436558274090, 0.198039446508353560, 0.198088455963333990, 0.198137464923093280, 0.198186473387508920, 0.198235481356458800, -0.198284488829819560, 0.198333495807469060, 0.198382502289285310, 0.198431508275144830, 0.198480513764925590, 0.198529518758505050, 0.198578523255761170, 0.198627527256570540, -0.198676530760811100, 0.198725533768360300, 0.198774536279096140, 0.198823538292895170, 0.198872539809635400, 0.198921540829194250, 0.198970541351449680, 0.199019541376278340, -0.199068540903558130, 0.199117539933166580, 0.199166538464981590, 0.199215536498879850, 0.199264534034739260, 0.199313531072437320, 0.199362527611852000, 0.199411523652859940, -0.199460519195339050, 0.199509514239167300, 0.199558508784221320, 0.199607502830379090, 0.199656496377518090, 0.199705489425516300, 0.199754481974250330, 0.199803474023598160, -0.199852465573437300, 0.199901456623645720, 0.199950447174100070, 0.199999437224678310, 0.200048426775257940, 0.200097415825716940, 0.200146404375931980, 0.200195392425780990, -0.200244379975141520, 0.200293367023891560, 0.200342353571907720, 0.200391339619067990, 0.200440325165250370, 0.200489310210331480, 0.200538294754189330, 0.200587278796701430, -0.200636262337745790, 0.200685245377199060, 0.200734227914939200, 0.200783209950843780, 0.200832191484790760, 0.200881172516656830, 0.200930153046319980, 0.200979133073657720, -0.201028112598548080, 0.201077091620867730, 0.201126070140494630, 0.201175048157306390, 0.201224025671180940, 0.201273002681994990, 0.201321979189626550, 0.201370955193953590, -0.201419930694852780, 0.201468905692202190, 0.201517880185879290, 0.201566854175762170, 0.201615827661727450, 0.201664800643653160, 0.201713773121416890, 0.201762745094896580, -0.201811716563969010, 0.201860687528512130, 0.201909657988403550, 0.201958627943521260, 0.202007597393741970, 0.202056566338943640, 0.202105534779003950, 0.202154502713800840, -0.202203470143211020, 0.202252437067112540, 0.202301403485382970, 0.202350369397900330, 0.202399334804541310, 0.202448299705183970, 0.202497264099706310, 0.202546227987985050, -0.202595191369898230, 0.202644154245323420, 0.202693116614138690, 0.202742078476220690, 0.202791039831447530, 0.202840000679696760, 0.202888961020846410, 0.202937920854773250, -0.202986880181355270, 0.203035839000470090, 0.203084797311995750, 0.203133755115808970, 0.203182712411787810, 0.203231669199809870, 0.203280625479753200, 0.203329581251494530, -0.203378536514911890, 0.203427491269883350, 0.203476445516285660, 0.203525399253996850, 0.203574352482894540, 0.203623305202856790, 0.203672257413760330, 0.203721209115483220, -0.203770160307903100, 0.203819110990898030, 0.203868061164344720, 0.203917010828121280, 0.203965959982105290, 0.204014908626174860, 0.204063856760206720, 0.204112804384078920, -0.204161751497669130, 0.204210698100855380, 0.204259644193514440, 0.204308589775524410, 0.204357534846763330, 0.204406479407107990, 0.204455423456436440, 0.204504366994626350, -0.204553310021555750, 0.204602252537101460, 0.204651194541141530, 0.204700136033553610, 0.204749077014215800, 0.204798017483004860, 0.204846957439798860, 0.204895896884475490, -0.204944835816912780, 0.204993774236987590, 0.205042712144577920, 0.205091649539561490, 0.205140586421816370, 0.205189522791219350, 0.205238458647648530, 0.205287393990982000, -0.205336328821096540, 0.205385263137870260, 0.205434196941180810, 0.205483130230906310, 0.205532063006923560, 0.205580995269110640, 0.205629927017345250, 0.205678858251505480, -0.205727788971468100, 0.205776719177111270, 0.205825648868312620, 0.205874578044950300, 0.205923506706901100, 0.205972434854043150, 0.206021362486254080, 0.206070289603412060, -0.206119216205393860, 0.206168142292077640, 0.206217067863341070, 0.206265992919062250, 0.206314917459118010, 0.206363841483386490, 0.206412764991745800, 0.206461687984072740, -0.206510610460245490, 0.206559532420141690, 0.206608453863639520, 0.206657374790615770, 0.206706295200948580, 0.206755215094515640, 0.206804134471195110, 0.206853053330863820, -0.206901971673399880, 0.206950889498681010, 0.206999806806585360, 0.207048723596989750, 0.207097639869772340, 0.207146555624810820, 0.207195470861983370, 0.207244385581166780, -0.207293299782239230, 0.207342213465078890, 0.207391126629562550, 0.207440039275568420, 0.207488951402974160, 0.207537863011658000, 0.207586774101496700, 0.207635684672368510, -0.207684594724151070, 0.207733504256722600, 0.207782413269959910, 0.207831321763741220, 0.207880229737944210, 0.207929137192447070, 0.207978044127126640, 0.208026950541861100, -0.208075856436528210, 0.208124761811006090, 0.208173666665171620, 0.208222570998903010, 0.208271474812078390, 0.208320378104574650, 0.208369280876269960, 0.208418183127042080, -0.208467084856769180, 0.208515986065328120, 0.208564886752597100, 0.208613786918453860, 0.208662686562776590, 0.208711585685442180, 0.208760484286328790, 0.208809382365314180, -0.208858279922276570, 0.208907176957092820, 0.208956073469641120, 0.209004969459799270, 0.209053864927445400, 0.209102759872456440, 0.209151654294710580, 0.209200548194085570, -0.209249441570459630, 0.209298334423709650, 0.209347226753713870, 0.209396118560350420, 0.209445009843496260, 0.209493900603029550, 0.209542790838828100, 0.209591680550770130, -0.209640569738732490, 0.209689458402593450, 0.209738346542230750, 0.209787234157522620, 0.209836121248345970, 0.209885007814579030, 0.209933893856099560, 0.209982779372785780, -0.210031664364514650, 0.210080548831164340, 0.210129432772612650, 0.210178316188737810, 0.210227199079416750, 0.210276081444527700, 0.210324963283948900, 0.210373844597557230, -0.210422725385230940, 0.210471605646847860, 0.210520485382286180, 0.210569364591422860, 0.210618243274136140, 0.210667121430303810, 0.210715999059804090, 0.210764876162513960, -0.210813752738311630, 0.210862628787074930, 0.210911504308682080, 0.210960379303010040, 0.211009253769937040, 0.211058127709340900, 0.211107001121099900, 0.211155874005090950, -0.211204746361192320, 0.211253618189282260, 0.211302489489237720, 0.211351360260936950, 0.211400230504257800, 0.211449100219078480, 0.211497969405275990, 0.211546838062728560, -0.211595706191314040, 0.211644573790910700, 0.211693440861395490, 0.211742307402646680, 0.211791173414542090, 0.211840038896960010, 0.211888903849777400, 0.211937768272872530, -0.211986632166123230, 0.212035495529407810, 0.212084358362603200, 0.212133220665587680, 0.212182082438239550, 0.212230943680435800, 0.212279804392054660, 0.212328664572974030, -0.212377524223072180, 0.212426383342226080, 0.212475241930314000, 0.212524099987213830, 0.212572957512803830, 0.212621814506961020, 0.212670670969563690, 0.212719526900489650, -0.212768382299617250, 0.212817237166823440, 0.212866091501986540, 0.212914945304984420, 0.212963798575695390, 0.213012651313996410, 0.213061503519765800, 0.213110355192881430, -0.213159206333221610, 0.213208056940663330, 0.213256907015084930, 0.213305756556364660, 0.213354605564379600, 0.213403454039008010, 0.213452301980127800, 0.213501149387617250, -0.213549996261353400, 0.213598842601214560, 0.213647688407078620, 0.213696533678823880, 0.213745378416327380, 0.213794222619467430, 0.213843066288121940, 0.213891909422169210, -0.213940752021486270, 0.213989594085951450, 0.214038435615442640, 0.214087276609838170, 0.214136117069015090, 0.214184956992851700, 0.214233796381226360, 0.214282635234016080, -0.214331473551099240, 0.214380311332353720, 0.214429148577657820, 0.214477985286888630, 0.214526821459924490, 0.214575657096643310, 0.214624492196923390, 0.214673326760641820, -0.214722160787676920, 0.214770994277906630, 0.214819827231209290, 0.214868659647461930, 0.214917491526542940, 0.214966322868330230, 0.215015153672702130, 0.215063983939535710, -0.215112813668709320, 0.215161642860101370, 0.215210471513588820, 0.215259299629050130, 0.215308127206363190, 0.215356954245406380, 0.215405780746056740, 0.215454606708192640, -0.215503432131692010, 0.215552257016433240, 0.215601081362293420, 0.215649905169150860, 0.215698728436883560, 0.215747551165369870, 0.215796373354486870, 0.215845195004112920, -0.215894016114126010, 0.215942836684404480, 0.215991656714825430, 0.216040476205267230, 0.216089295155607850, 0.216138113565725650, 0.216186931435497750, 0.216235748764802500, -0.216284565553518330, 0.216333381801522310, 0.216382197508692810, 0.216431012674907860, 0.216479827300045780, 0.216528641383983700, 0.216577454926600050, 0.216626267927772730, -0.216675080387380180, 0.216723892305299480, 0.216772703681409080, 0.216821514515586900, 0.216870324807711370, 0.216919134557659630, 0.216967943765310010, 0.217016752430540550, -0.217065560553229620, 0.217114368133254380, 0.217163175170493220, 0.217211981664824550, 0.217260787616125490, 0.217309593024274470, 0.217358397889149430, 0.217407202210628870, -0.217456005988589860, 0.217504809222910820, 0.217553611913469780, 0.217602414060145130, 0.217651215662814030, 0.217700016721354860, 0.217748817235645680, 0.217797617205564870, -0.217846416630989580, 0.217895215511798270, 0.217944013847868910, 0.217992811639079940, 0.218041608885308520, 0.218090405586433080, 0.218139201742332060, 0.218187997352882580, -0.218236792417963120, 0.218285586937451700, 0.218334380911226730, 0.218383174339165380, 0.218431967221146080, 0.218480759557046850, 0.218529551346746180, 0.218578342590121180, -0.218627133287050360, 0.218675923437411680, 0.218724713041083620, 0.218773502097943360, 0.218822290607869310, 0.218871078570739560, 0.218919865986432570, 0.218968652854825450, -0.219017439175796720, 0.219066224949224790, 0.219115010174986890, 0.219163794852961470, 0.219212578983026540, 0.219261362565060620, 0.219310145598940850, 0.219358928084545710, -0.219407710021753270, 0.219456491410441960, 0.219505272250489020, 0.219554052541772880, 0.219602832284171600, 0.219651611477563680, 0.219700390121826320, 0.219749168216837960, -0.219797945762476690, 0.219846722758620970, 0.219895499205148030, 0.219944275101936340, 0.219993050448863970, 0.220041825245809400, 0.220090599492649810, 0.220139373189263740, -0.220188146335529690, 0.220236918931324830, 0.220285690976527640, 0.220334462471016260, 0.220383233414669140, 0.220432003807363520, 0.220480773648977890, 0.220529542939390310, -0.220578311678479300, 0.220627079866122090, 0.220675847502197180, 0.220724614586582660, 0.220773381119157040, 0.220822147099797500, 0.220870912528382620, 0.220919677404790460, -0.220968441728899540, 0.221017205500587070, 0.221065968719731580, 0.221114731386211630, 0.221163493499904410, 0.221212255060688450, 0.221261016068441840, 0.221309776523043120, -0.221358536424369560, 0.221407295772299640, 0.221456054566711470, 0.221504812807483600, 0.221553570494493280, 0.221602327627619030, 0.221651084206738960, 0.221699840231731620, -0.221748595702474210, 0.221797350618845340, 0.221846104980723100, 0.221894858787986010, 0.221943612040511360, 0.221992364738177680, 0.222041116880863500, 0.222089868468446110, -0.222138619500804050, 0.222187369977815440, 0.222236119899358820, 0.222284869265311490, 0.222333618075551990, 0.222382366329958420, 0.222431114028409400, 0.222479861170782140, -0.222528607756955240, 0.222577353786806790, 0.222626099260215430, 0.222674844177058350, 0.222723588537214190, 0.222772332340561040, 0.222821075586977500, 0.222869818276340840, -0.222918560408529640, 0.222967301983422040, 0.223016043000896610, 0.223064783460830640, 0.223113523363102690, 0.223162262707591400, 0.223211001494174000, 0.223259739722729110, -0.223308477393134860, 0.223357214505269850, 0.223405951059011370, 0.223454687054238020, 0.223503422490827970, 0.223552157368659770, 0.223600891687610740, 0.223649625447559510, -0.223698358648384190, 0.223747091289963400, 0.223795823372174460, 0.223844554894895960, 0.223893285858006080, 0.223942016261383440, 0.223990746104905300, 0.224039475388450290, -0.224088204111897030, 0.224136932275122820, 0.224185659878006290, 0.224234386920425600, 0.224283113402259400, 0.224331839323384960, 0.224380564683680920, 0.224429289483025480, -0.224478013721297250, 0.224526737398373560, 0.224575460514133020, 0.224624183068453830, 0.224672905061214600, 0.224721626492292690, 0.224770347361566700, 0.224819067668914850, -0.224867787414215760, 0.224916506597346770, 0.224965225218186540, 0.225013943276613640, 0.225062660772505470, 0.225111377705740660, 0.225160094076197390, 0.225208809883754300, -0.225257525128288780, 0.225306239809679430, 0.225354953927804500, 0.225403667482542590, 0.225452380473771110, 0.225501092901368660, 0.225549804765213470, 0.225598516065184220, -0.225647226801158260, 0.225695936973014210, 0.225744646580630310, 0.225793355623885250, 0.225842064102656340, 0.225890772016822280, 0.225939479366261300, 0.225988186150852060, -0.226036892370471890, 0.226085598024999530, 0.226134303114313600, 0.226183007638291470, 0.226231711596811800, 0.226280414989752880, 0.226329117816993330, 0.226377820078410590, -0.226426521773883280, 0.226475222903289640, 0.226523923466508400, 0.226572623463416940, 0.226621322893893890, 0.226670021757817560, 0.226718720055066570, 0.226767417785518370, -0.226816114949051630, 0.226864811545544610, 0.226913507574875970, 0.226962203036923130, 0.227010897931564810, 0.227059592258679670, 0.227108286018145090, 0.227156979209839820, -0.227205671833642100, 0.227254363889430630, 0.227303055377082790, 0.227351746296477340, 0.227400436647492520, 0.227449126430007060, 0.227497815643898320, 0.227546504289045050, -0.227595192365325520, 0.227643879872618470, 0.227692566810801240, 0.227741253179752630, 0.227789938979350880, 0.227838624209474700, 0.227887308870001550, 0.227935992960810100, -0.227984676481779110, 0.228033359432786020, 0.228082041813709500, 0.228130723624427880, 0.228179404864819910, 0.228228085534762980, 0.228276765634135820, 0.228325445162816780, -0.228374124120684530, 0.228422802507616540, 0.228471480323491540, 0.228520157568187860, 0.228568834241584200, 0.228617510343558040, 0.228666185873988100, 0.228714860832752690, -0.228763535219730560, 0.228812209034799150, 0.228860882277837240, 0.228909554948723530, 0.228958227047335510, 0.229006898573551940, 0.229055569527251120, 0.229104239908311800, -0.229152909716611420, 0.229201578952028810, 0.229250247614442240, 0.229298915703730480, 0.229347583219771000, 0.229396250162442560, 0.229444916531623490, 0.229493582327192550, -0.229542247549027250, 0.229590912197006340, 0.229639576271008120, 0.229688239770911410, 0.229736902696593640, 0.229785565047933630, 0.229834226824809720, 0.229882888027100660, -0.229931548654683960, 0.229980208707438380, 0.230028868185242710, 0.230077527087974440, 0.230126185415512360, 0.230174843167734790, 0.230223500344520580, 0.230272156945747150, -0.230320812971293360, 0.230369468421037530, 0.230418123294858450, 0.230466777592633650, 0.230515431314241880, 0.230564084459561560, 0.230612737028471430, 0.230661389020849040, -0.230710040436573170, 0.230758691275522200, 0.230807341537574960, 0.230855991222608910, 0.230904640330502900, 0.230953288861135700, 0.231001936814384860, 0.231050584190129170, -0.231099230988247030, 0.231147877208617240, 0.231196522851117300, 0.231245167915626080, 0.231293812402021960, 0.231342456310183710, 0.231391099639988880, 0.231439742391316320, -0.231488384564044410, 0.231537026158051940, 0.231585667173216490, 0.231634307609416890, 0.231682947466531510, 0.231731586744439190, 0.231780225443017460, 0.231828863562145190, -0.231877501101701190, 0.231926138061562980, 0.231974774441609440, 0.232023410241718960, 0.232072045461770400, 0.232120680101641270, 0.232169314161210480, 0.232217947640356360, -0.232266580538957820, 0.232315212856892410, 0.232363844594038970, 0.232412475750275900, 0.232461106325482090, 0.232509736319535060, 0.232558365732313700, 0.232606994563696430, -0.232655622813562110, 0.232704250481788280, 0.232752877568253860, 0.232801504072837200, 0.232850129995417240, 0.232898755335871540, 0.232947380094078920, 0.232996004269918290, -0.233044627863267210, 0.233093250874004590, 0.233141873302008810, 0.233190495147158810, 0.233239116409332120, 0.233287737088407640, 0.233336357184263820, 0.233384976696779540, -0.233433595625832380, 0.233482213971301230, 0.233530831733064550, 0.233579448911001240, 0.233628065504988850, 0.233676681514906310, 0.233725296940632040, 0.233773911782044990, -0.233822526039022730, 0.233871139711444130, 0.233919752799188140, 0.233968365302132330, 0.234016977220155600, 0.234065588553136420, 0.234114199300953730, 0.234162809463485080, -0.234211419040609410, 0.234260028032205190, 0.234308636438151360, 0.234357244258325490, 0.234405851492606510, 0.234454458140872870, 0.234503064203003570, 0.234551669678876140, -0.234600274568369540, 0.234648878871362270, 0.234697482587733240, 0.234746085717360050, 0.234794688260121650, 0.234843290215896980, 0.234891891584563640, 0.234940492366000560, -0.234989092560086270, 0.235037692166699670, 0.235086291185718390, 0.235134889617021420, 0.235183487460487200, 0.235232084715994690, 0.235280681383421560, 0.235329277462646700, -0.235377872953548670, 0.235426467856006380, 0.235475062169897470, 0.235523655895100940, 0.235572249031495230, 0.235620841578959350, 0.235669433537370940, 0.235718024906608950, -0.235766615686552330, 0.235815205877078720, 0.235863795478067100, 0.235912384489396000, 0.235960972910944370, 0.236009560742589890, 0.236058147984211490, 0.236106734635687710, -0.236155320696897540, 0.236203906167718640, 0.236252491048029980, 0.236301075337710080, 0.236349659036637900, 0.236398242144691180, 0.236446824661748850, 0.236495406587689440, -0.236543987922391950, 0.236592568665734080, 0.236641148817594770, 0.236689728377852600, 0.236738307346386510, 0.236786885723074240, 0.236835463507794770, 0.236884040700427070, -0.236932617300848800, 0.236981193308939020, 0.237029768724576260, 0.237078343547639490, 0.237126917778006460, 0.237175491415556110, 0.237224064460167030, 0.237272636911718240, -0.237321208770087390, 0.237369780035153550, 0.237418350706795260, 0.237466920784891510, 0.237515490269320030, 0.237564059159959850, 0.237612627456689480, 0.237661195159387990, -0.237709762267933080, 0.237758328782203790, 0.237806894702079080, 0.237855460027436710, 0.237904024758155700, 0.237952588894114610, 0.238001152435192490, 0.238049715381267040, -0.238098277732217340, 0.238146839487921920, 0.238195400648259840, 0.238243961213108810, 0.238292521182347890, 0.238341080555855680, 0.238389639333511180, 0.238438197515192160, -0.238486755100777630, 0.238535312090146220, 0.238583868483176980, 0.238632424279747620, 0.238680979479737210, 0.238729534083024770, 0.238778088089488080, 0.238826641499006150, -0.238875194311457650, 0.238923746526721550, 0.238972298144675690, 0.239020849165199060, 0.239069399588170330, 0.239117949413468510, 0.239166498640971390, 0.239215047270558030, -0.239263595302107060, 0.239312142735497530, 0.239360689570607190, 0.239409235807315160, 0.239457781445500010, 0.239506326485040860, 0.239554870925815460, 0.239603414767702860, -0.239651958010581730, 0.239700500654331160, 0.239749042698828880, 0.239797584143954020, 0.239846124989585600, 0.239894665235601460, 0.239943204881880650, 0.239991743928301830, -0.240040282374744090, 0.240088820221085190, 0.240137357467204240, 0.240185894112979910, 0.240234430158291300, 0.240282965603016150, 0.240331500447033580, 0.240380034690222290, -0.240428568332461320, 0.240477101373628520, 0.240525633813602950, 0.240574165652263310, 0.240622696889488650, 0.240671227525156850, 0.240719757559146990, 0.240768286991338150, -0.240816815821608160, 0.240865344049836120, 0.240913871675900730, 0.240962398699681110, 0.241010925121055040, 0.241059450939901660, 0.241107976156099660, 0.241156500769528160, -0.241205024780064950, 0.241253548187589210, 0.241302070991979560, 0.241350593193115190, 0.241399114790873920, 0.241447635785134840, 0.241496156175776660, 0.241544675962678560, -0.241593195145718310, 0.241641713724775080, 0.241690231699728000, 0.241738749070454890, 0.241787265836834940, 0.241835781998746810, 0.241884297556069630, 0.241932812508681320, -0.241981326856460950, 0.242029840599287280, 0.242078353737039430, 0.242126866269595260, 0.242175378196833930, 0.242223889518634160, 0.242272400234875090, 0.242320910345434600, -0.242369419850191840, 0.242417928749025490, 0.242466437041814780, 0.242514944728437540, 0.242563451808772950, 0.242611958282700160, 0.242660464150097010, 0.242708969410842750, -0.242757474064816040, 0.242805978111896080, 0.242854481551960740, 0.242902984384889190, 0.242951486610560180, 0.242999988228852880, 0.243048489239645200, 0.243096989642816290, -0.243145489438244910, 0.243193988625810240, 0.243242487205390160, 0.243290985176863840, 0.243339482540110090, 0.243387979295008050, 0.243436475441435620, 0.243484970979272020, -0.243533465908396000, 0.243581960228686720, 0.243630453940022110, 0.243678947042281380, 0.243727439535343730, 0.243775931419087020, 0.243824422693390500, 0.243872913358132910, -0.243921403413193490, 0.243969892858450110, 0.244018381693781980, 0.244066869919067920, 0.244115357534187120, 0.244163844539017490, 0.244212330933438250, 0.244260816717328190, -0.244309301890566520, 0.244357786453031130, 0.244406270404601310, 0.244454753745155800, 0.244503236474573840, 0.244551718592733360, 0.244600200099513580, 0.244648680994793750, -0.244697161278451760, 0.244745640950366880, 0.244794120010417890, 0.244842598458484020, 0.244891076294443260, 0.244939553518174790, 0.244988030129557420, 0.245036506128470420, -0.245084981514791720, 0.245133456288400580, 0.245181930449175800, 0.245230403996996610, 0.245278876931740970, 0.245327349253288170, 0.245375820961516970, 0.245424292056306640, -0.245472762537535170, 0.245521232405081810, 0.245569701658825770, 0.245618170298645050, 0.245666638324418900, 0.245715105736026170, 0.245763572533346100, 0.245812038716256680, -0.245860504284637150, 0.245908969238366360, 0.245957433577323580, 0.246005897301386780, 0.246054360410435240, 0.246102822904347790, 0.246151284783003740, 0.246199746046281030, -0.246248206694058950, 0.246296666726216360, 0.246345126142632540, 0.246393584943185470, 0.246442043127754420, 0.246490500696218280, 0.246538957648456320, 0.246587413984346530, -0.246635869703768220, 0.246684324806600630, 0.246732779292721830, 0.246781233162011090, 0.246829686414347240, 0.246878139049609620, 0.246926591067676200, 0.246975042468426330, -0.247023493251738830, 0.247071943417493060, 0.247120392965566980, 0.247168841895839900, 0.247217290208190750, 0.247265737902498780, 0.247314184978642050, 0.247362631436499860, -0.247411077275951070, 0.247459522496875060, 0.247507967099149770, 0.247556411082654580, 0.247604854447268790, 0.247653297192870440, 0.247701739319338840, 0.247750180826552900, -0.247798621714391900, 0.247847061982733960, 0.247895501631458350, 0.247943940660444010, 0.247992379069570220, 0.248040816858715040, 0.248089254027757860, 0.248137690576577500, -0.248186126505053370, 0.248234561813063500, 0.248282996500487210, 0.248331430567203440, 0.248379864013091510, 0.248428296838029500, 0.248476729041896740, 0.248525160624572610, -0.248573591585935120, 0.248622021925863660, 0.248670451644237150, 0.248718880740934960, 0.248767309215835090, 0.248815737068816990, 0.248864164299759520, 0.248912590908542090, -0.248961016895042740, 0.249009442259140850, 0.249057867000715360, 0.249106291119645630, 0.249154714615809740, 0.249203137489087070, 0.249251559739356560, 0.249299981366497560, -0.249348402370388190, 0.249396822750907830, 0.249445242507935820, 0.249493661641350280, 0.249542080151030580, 0.249590498036855680, 0.249638915298704990, 0.249687331936456560, -0.249735747949989790, 0.249784163339183680, 0.249832578103917570, 0.249880992244069590, 0.249929405759519140, 0.249977818650145150, 0.250026230915827040, 0.250074642556442960, -0.250123053571872260, 0.250171463961993910, 0.250219873726687360, 0.250268282865830690, 0.250316691379303290, 0.250365099266984190, 0.250413506528752720, 0.250461913164487130, -0.250510319174066690, 0.250558724557370880, 0.250607129314277870, 0.250655533444667070, 0.250703936948417360, 0.250752339825408290, 0.250800742075517890, 0.250849143698625650, -0.250897544694610560, 0.250945945063352050, 0.250994344804728260, 0.251042743918618580, 0.251091142404902050, 0.251139540263458080, 0.251187937494164850, 0.251236334096901770, -0.251284730071547830, 0.251333125417982530, 0.251381520136084000, 0.251429914225731630, 0.251478307686804900, 0.251526700519182020, 0.251575092722742370, 0.251623484297364970, -0.251671875242929280, 0.251720265559313480, 0.251768655246397020, 0.251817044304058930, 0.251865432732178710, 0.251913820530634380, 0.251962207699305550, 0.252010594238071210, -0.252058980146810770, 0.252107365425402520, 0.252155750073725820, 0.252204134091659700, 0.252252517479083730, 0.252300900235876040, 0.252349282361916060, 0.252397663857083340, -0.252446044721256040, 0.252494424954313570, 0.252542804556135090, 0.252591183526599980, 0.252639561865586500, 0.252687939572974140, 0.252736316648641930, 0.252784693092469370, -0.252833068904334600, 0.252881444084117170, 0.252929818631696170, 0.252978192546951030, 0.253026565829759960, 0.253074938480002510, 0.253123310497557650, 0.253171681882304990, -0.253220052634122730, 0.253268422752890300, 0.253316792238486800, 0.253365161090791770, 0.253413529309683420, 0.253461896895041230, 0.253510263846744690, 0.253558630164672120, -0.253606995848702940, 0.253655360898716260, 0.253703725314591680, 0.253752089096207280, 0.253800452243442720, 0.253848814756176990, 0.253897176634289620, 0.253945537877658940, -0.253993898486164380, 0.254042258459685090, 0.254090617798100600, 0.254138976501289080, 0.254187334569130170, 0.254235692001502920, 0.254284048798286870, 0.254332404959360210, -0.254380760484602620, 0.254429115373893510, 0.254477469627111210, 0.254525823244135200, 0.254574176224844630, 0.254622528569119100, 0.254670880276836760, 0.254719231347877270, -0.254767581782119670, 0.254815931579443600, 0.254864280739727220, 0.254912629262850130, 0.254960977148691480, 0.255009324397130810, 0.255057671008046440, 0.255106016981317850, -0.255154362316824260, 0.255202707014445140, 0.255251051074058820, 0.255299394495544950, 0.255347737278782960, 0.255396079423651220, 0.255444420930029280, 0.255492761797796230, -0.255541102026831780, 0.255589441617014130, 0.255637780568222840, 0.255686118880337150, 0.255734456553236570, 0.255782793586799400, 0.255831129980905290, 0.255879465735433300, -0.255927800850263120, 0.255976135325272970, 0.256024469160342550, 0.256072802355350900, 0.256121134910177680, 0.256169466824701210, 0.256217798098801020, 0.256266128732356820, -0.256314458725246890, 0.256362788077350750, 0.256411116788547670, 0.256459444858717240, 0.256507772287737750, 0.256556099075488820, 0.256604425221849670, 0.256652750726699850, -0.256701075589917780, 0.256749399811382950, 0.256797723390974670, 0.256846046328572500, 0.256894368624054790, 0.256942690277301160, 0.256991011288190800, 0.257039331656603360, -0.257087651382417130, 0.257135970465511790, 0.257184288905766500, 0.257232606703060920, 0.257280923857273410, 0.257329240368283580, 0.257377556235971080, 0.257425871460214280, -0.257474186040892780, 0.257522499977885840, 0.257570813271073060, 0.257619125920332810, 0.257667437925544750, 0.257715749286588140, 0.257764060003342510, 0.257812370075686360, -0.257860679503499280, 0.257908988286660480, 0.257957296425049610, 0.258005603918545100, 0.258053910767026610, 0.258102216970373330, 0.258150522528464930, 0.258198827441179780, -0.258247131708397530, 0.258295435329997940, 0.258343738305859330, 0.258392040635861350, 0.258440342319883280, 0.258488643357804750, 0.258536943749504200, 0.258585243494861340, -0.258633542593755320, 0.258681841046065900, 0.258730138851671400, 0.258778436010451580, 0.258826732522285720, 0.258875028387053400, 0.258923323604633100, 0.258971618174904490, -0.259019912097746830, 0.259068205373039820, 0.259116498000661890, 0.259164789980492690, 0.259213081312411940, 0.259261371996298060, 0.259309662032030760, 0.259357951419489310, -0.259406240158553400, 0.259454528249101420, 0.259502815691013190, 0.259551102484167910, 0.259599388628445280, 0.259647674123723750, 0.259695958969883010, 0.259744243166802390, -0.259792526714361650, 0.259840809612439110, 0.259889091860914520, 0.259937373459667280, 0.259985654408576960, 0.260033934707522120, 0.260082214356382400, 0.260130493355037180, -0.260178771703366170, 0.260227049401247750, 0.260275326448561770, 0.260323602845187850, 0.260371878591004520, 0.260420153685891500, 0.260468428129728090, 0.260516701922394010, -0.260564975063767800, 0.260613247553729110, 0.260661519392157310, 0.260709790578932120, 0.260758061113932070, 0.260806330997036820, 0.260854600228125790, 0.260902868807078640, -0.260951136733773960, 0.260999404008091350, 0.261047670629910300, 0.261095936599110460, 0.261144201915570360, 0.261192466579169780, 0.261240730589788420, 0.261288993947304870, -0.261337256651598790, 0.261385518702549560, 0.261433780100036980, 0.261482040843939500, 0.261530300934136930, 0.261578560370508640, 0.261626819152934340, 0.261675077281292580, -0.261723334755463110, 0.261771591575325310, 0.261819847740758950, 0.261868103251642560, 0.261916358107855910, 0.261964612309278370, 0.262012865855789700, 0.262061118747268450, -0.262109370983594440, 0.262157622564647420, 0.262205873490305890, 0.262254123760449650, 0.262302373374958150, 0.262350622333711150, 0.262398870636587120, 0.262447118283465950, -0.262495365274226950, 0.262543611608750000, 0.262591857286913590, 0.262640102308597520, 0.262688346673681180, 0.262736590382044440, 0.262784833433565790, 0.262833075828125040, -0.262881317565601620, 0.262929558645875310, 0.262977799068824680, 0.263026038834329570, 0.263074277942269790, 0.263122516392523880, 0.263170754184971660, 0.263218991319492560, -0.263267227795966450, 0.263315463614271830, 0.263363698774288500, 0.263411933275895960, 0.263460167118974020, 0.263508400303401220, 0.263556632829057450, 0.263604864695822060, -0.263653095903574940, 0.263701326452194680, 0.263749556341561050, 0.263797785571553590, 0.263846014142052050, 0.263894242052935100, 0.263942469304082490, 0.263990695895373770, -0.264038921826688700, 0.264087147097905870, 0.264135371708905220, 0.264183595659566510, 0.264231818949768440, 0.264280041579390780, 0.264328263548313070, 0.264376484856415070, -0.264424705503575500, 0.264472925489674100, 0.264521144814590440, 0.264569363478204310, 0.264617581480394330, 0.264665798821040410, 0.264714015500021990, 0.264762231517219000, -0.264810446872509990, 0.264858661565774810, 0.264906875596893020, 0.264955088965744490, 0.265003301672207760, 0.265051513716162810, 0.265099725097489470, 0.265147935816066440, -0.265196145871773540, 0.265244355264490250, 0.265292563994096510, 0.265340772060470960, 0.265388979463493490, 0.265437186203043520, 0.265485392279001030, 0.265533597691244680, -0.265581802439654290, 0.265630006524109400, 0.265678209944489930, 0.265726412700674490, 0.265774614792543050, 0.265822816219975060, 0.265871016982850430, 0.265919217081047880, -0.265967416514447220, 0.266015615282928500, 0.266063813386370310, 0.266112010824652580, 0.266160207597654800, 0.266208403705256950, 0.266256599147337680, 0.266304793923776870, -0.266352988034454120, 0.266401181479249290, 0.266449374258041110, 0.266497566370709480, 0.266545757817133910, 0.266593948597194430, 0.266642138710769640, 0.266690328157739460, -0.266738516937983510, 0.266786705051381630, 0.266834892497812610, 0.266883079277156320, 0.266931265389292400, 0.266979450834100680, 0.267027635611459920, 0.267075819721250110, -0.267124003163351110, 0.267172185937641750, 0.267220368044001840, 0.267268549482311100, 0.267316730252449340, 0.267364910354295380, 0.267413089787729100, 0.267461268552630140, -0.267509446648878440, 0.267557624076352640, 0.267605800834932790, 0.267653976924498490, 0.267702152344929610, 0.267750327096104970, 0.267798501177904490, 0.267846674590207780, -0.267894847332894810, 0.267943019405844250, 0.267991190808936190, 0.268039361542050550, 0.268087531605066100, 0.268135700997862820, 0.268183869720320270, 0.268232037772318470, -0.268280205153736180, 0.268328371864453350, 0.268376537904349620, 0.268424703273304920, 0.268472867971198070, 0.268521031997909050, 0.268569195353317470, 0.268617358037303300, -0.268665520049745310, 0.268713681390523540, 0.268761842059517530, 0.268810002056607380, 0.268858161381671790, 0.268906320034590750, 0.268954478015244410, 0.269002635323511430, -0.269050791959271840, 0.269098947922405240, 0.269147103212791730, 0.269195257830310060, 0.269243411774840240, 0.269291565046261840, 0.269339717644455020, 0.269387869569298440, -0.269436020820672200, 0.269484171398455870, 0.269532321302529580, 0.269580470532772070, 0.269628619089063330, 0.269676766971283120, 0.269724914179311330, 0.269773060713026870, -0.269821206572309790, 0.269869351757040080, 0.269917496267096600, 0.269965640102359350, 0.270013783262707970, 0.270061925748022620, 0.270110067558182010, 0.270158208693066230, -0.270206349152554930, 0.270254488936528150, 0.270302628044864770, 0.270350766477444770, 0.270398904234147920, 0.270447041314854200, 0.270495177719442430, 0.270543313447792750, -0.270591448499784780, 0.270639582875298600, 0.270687716574213030, 0.270735849596408170, 0.270783981941763730, 0.270832113610159690, 0.270880244601474970, 0.270928374915589690, -0.270976504552383870, 0.271024633511736330, 0.271072761793527240, 0.271120889397636230, 0.271169016323943410, 0.271217142572327650, 0.271265268142668990, 0.271313393034847190, -0.271361517248742360, 0.271409640784233300, 0.271457763641200110, 0.271505885819522510, 0.271554007319080640, 0.271602128139753320, 0.271650248281420700, 0.271698367743962440, -0.271746486527258690, 0.271794604631188260, 0.271842722055631370, 0.271890838800468100, 0.271938954865577290, 0.271987070250839070, 0.272035184956133210, 0.272083298981339820, -0.272131412326337750, 0.272179524991007120, 0.272227636975227730, 0.272275748278879630, 0.272323858901841740, 0.272371968843994230, 0.272420078105216730, 0.272468186685389520, -0.272516294584391420, 0.272564401802102560, 0.272612508338402730, 0.272660614193172000, 0.272708719366289320, 0.272756823857634890, 0.272804927667088800, 0.272853030794529940, -0.272901133239838500, 0.272949235002894250, 0.272997336083577350, 0.273045436481766710, 0.273093536197342450, 0.273141635230184310, 0.273189733580172570, 0.273237831247186040, -0.273285928231104920, 0.273334024531808990, 0.273382120149178400, 0.273430215083092120, 0.273478309333430310, 0.273526402900072680, 0.273574495782899500, 0.273622587981789680, -0.273670679496623380, 0.273718770327280370, 0.273766860473640850, 0.273814949935583750, 0.273863038712989280, 0.273911126805737650, 0.273959214213707780, 0.274007300936779830, -0.274055386974833670, 0.274103472327749450, 0.274151556995406160, 0.274199640977683960, 0.274247724274462650, 0.274295806885622440, 0.274343888811042270, 0.274391970050602450, -0.274440050604182640, 0.274488130471663150, 0.274536209652922910, 0.274584288147842190, 0.274632365956300690, 0.274680443078178740, 0.274728519513355200, 0.274776595261710390, -0.274824670323124580, 0.274872744697476580, 0.274920818384646770, 0.274968891384514860, 0.275016963696961210, 0.275065035321864710, 0.275113106259105620, 0.275161176508563750, -0.275209246070119370, 0.275257314943651410, 0.275305383129040240, 0.275353450626165560, 0.275401517434907710, 0.275449583555145590, 0.275497648986759550, 0.275545713729629380, -0.275593777783635360, 0.275641841148656470, 0.275689903824572980, 0.275737965811265140, 0.275786027108612000, 0.275834087716493760, 0.275882147634790300, 0.275930206863381880, -0.275978265402147540, 0.276026323250967540, 0.276074380409721710, 0.276122436878290360, 0.276170492656552520, 0.276218547744388420, 0.276266602141677970, 0.276314655848301450, -0.276362708864137830, 0.276410761189067430, 0.276458812822970190, 0.276506863765726310, 0.276554914017214830, 0.276602963577316060, 0.276651012445910340, 0.276699060622876640, -0.276747108108095270, 0.276795154901446180, 0.276843201002809570, 0.276891246412064580, 0.276939291129091440, 0.276987335153770110, 0.277035378485980870, 0.277083421125602750, -0.277131463072516020, 0.277179504326600710, 0.277227544887737040, 0.277275584755804050, 0.277323623930682110, 0.277371662412251140, 0.277419700200391420, 0.277467737294982030, -0.277515773695903300, 0.277563809403035100, 0.277611844416257860, 0.277659878735450560, 0.277707912360493530, 0.277755945291267180, 0.277803977527650510, 0.277852009069523950, -0.277900039916767320, 0.277948070069261030, 0.277996099526884140, 0.278044128289517020, 0.278092156357039600, 0.278140183729332140, 0.278188210406273840, 0.278236236387745030, -0.278284261673625580, 0.278332286263795970, 0.278380310158135140, 0.278428333356523620, 0.278476355858841170, 0.278524377664968350, 0.278572398774784070, 0.278620419188168880, -0.278668438905003040, 0.278716457925165640, 0.278764476248537120, 0.278812493874997400, 0.278860510804426860, 0.278908527036704660, 0.278956542571711100, 0.279004557409326230, -0.279052571549430360, 0.279100584991902660, 0.279148597736623480, 0.279196609783472770, 0.279244621132331010, 0.279292631783077280, 0.279340641735591920, 0.279388650989755020, -0.279436659545446890, 0.279484667402546630, 0.279532674560934780, 0.279580681020491660, 0.279628686781096370, 0.279676691842629390, 0.279724696204970650, 0.279772699868000630, -0.279820702831598430, 0.279868705095644490, 0.279916706660018780, 0.279964707524601670, 0.280012707689272440, 0.280060707153911400, 0.280108705918398590, 0.280156703982614500, -0.280204701346438160, 0.280252698009750060, 0.280300693972430240, 0.280348689234359130, 0.280396683795415880, 0.280444677655480870, 0.280492670814434190, 0.280540663272156270, -0.280588655028526260, 0.280636646083424590, 0.280684636436731750, 0.280732626088326890, 0.280780615038090490, 0.280828603285902530, 0.280876590831643460, 0.280924577675192520, -0.280972563816430150, 0.281020549255236340, 0.281068533991491560, 0.281116518025075090, 0.281164501355867290, 0.281212483983748210, 0.281260465908598380, 0.281308447130296960, -0.281356427648724430, 0.281404407463760780, 0.281452386575286590, 0.281500364983180980, 0.281548342687324480, 0.281596319687597520, 0.281644295983879360, 0.281692271576050480, -0.281740246463990870, 0.281788220647581080, 0.281836194126700360, 0.281884166901229080, 0.281932138971047460, 0.281980110336035870, 0.282028080996073570, 0.282076050951041100, -0.282124020200818500, 0.282171988745286260, 0.282219956584323640, 0.282267923717811120, 0.282315890145628800, 0.282363855867657170, 0.282411820883775420, 0.282459785193864220, -0.282507748797803940, 0.282555711695473830, 0.282603673886754450, 0.282651635371525930, 0.282699596149668720, 0.282747556221062070, 0.282795515585586580, 0.282843474243122280, -0.282891432193549670, 0.282939389436748120, 0.282987345972598060, 0.283035301800979690, 0.283083256921773440, 0.283131211334858630, 0.283179165040115810, 0.283227118037425060, -0.283275070326666930, 0.283323021907720740, 0.283370972780466970, 0.283418922944785770, 0.283466872400557680, 0.283514821147661970, 0.283562769185979220, 0.283610716515389990, -0.283658663135773540, 0.283706609047010390, 0.283754554248980770, 0.283802498741565160, 0.283850442524642920, 0.283898385598094550, 0.283946327961800190, 0.283994269615640450, -0.284042210559494630, 0.284090150793243290, 0.284138090316766510, 0.284186029129945010, 0.284233967232657980, 0.284281904624786030, 0.284329841306209310, 0.284377777276808410, -0.284425712536462650, 0.284473647085052570, 0.284521580922458880, 0.284569514048560730, 0.284617446463238830, 0.284665378166373330, 0.284713309157844820, 0.284761239437532570, -0.284809169005317280, 0.284857097861078990, 0.284905026004698410, 0.284952953436054870, 0.285000880155028950, 0.285048806161500800, 0.285096731455351030, 0.285144656036459050, -0.285192579904705420, 0.285240503059970340, 0.285288425502134460, 0.285336347231077040, 0.285384268246678790, 0.285432188548820240, 0.285480108137380840, 0.285528027012241170, -0.285575945173281440, 0.285623862620382250, 0.285671779353422970, 0.285719695372284250, 0.285767610676846310, 0.285815525266989780, 0.285863439142593990, 0.285911352303539590, -0.285959264749706840, 0.286007176480976290, 0.286055087497227470, 0.286102997798340860, 0.286150907384196740, 0.286198816254675860, 0.286246724409657430, 0.286294631849022260, -0.286342538572650910, 0.286390444580422730, 0.286438349872218500, 0.286486254447918360, 0.286534158307403090, 0.286582061450551930, 0.286629963877245600, 0.286677865587364410, -0.286725766580788970, 0.286773666857398690, 0.286821566417074180, 0.286869465259695810, 0.286917363385144230, 0.286965260793298760, 0.287013157484040160, 0.287061053457248690, -0.287108948712805010, 0.287156843250588490, 0.287204737070479890, 0.287252630172359470, 0.287300522556107830, 0.287348414221604510, 0.287396305168730160, 0.287444195397365430, -0.287492084907389810, 0.287539973698684000, 0.287587861771128270, 0.287635749124603270, 0.287683635758988480, 0.287731521674164600, 0.287779406870011910, 0.287827291346411160, -0.287875175103241730, 0.287923058140384380, 0.287970940457719370, 0.288018822055127410, 0.288066702932487980, 0.288114583089681800, 0.288162462526589170, 0.288210341243090810, -0.288258219239066190, 0.288306096514395980, 0.288353973068960990, 0.288401848902640650, 0.288449724015315660, 0.288497598406866400, 0.288545472077173510, 0.288593345026116550, -0.288641217253576220, 0.288689088759432830, 0.288736959543567150, 0.288784829605858660, 0.288832698946188130, 0.288880567564435810, 0.288928435460482470, 0.288976302634207650, -0.289024169085492060, 0.289072034814216060, 0.289119899820260430, 0.289167764103504590, 0.289215627663829360, 0.289263490501115440, 0.289311352615242380, 0.289359214006090990, -0.289407074673541490, 0.289454934617474790, 0.289502793837770330, 0.289550652334308820, 0.289598510106970740, 0.289646367155636800, 0.289694223480186530, 0.289742079080500650, -0.289789933956459630, 0.289837788107944140, 0.289885641534833820, 0.289933494237009370, 0.289981346214351180, 0.290029197466740050, 0.290077047994055480, 0.290124897796178340, -0.290172746872988880, 0.290220595224368050, 0.290268442850195260, 0.290316289750351400, 0.290364135924717210, 0.290411981373172310, 0.290459826095597400, 0.290507670091872950, -0.290555513361879740, 0.290603355905497300, 0.290651197722606500, 0.290699038813087730, 0.290746879176821740, 0.290794718813688120, 0.290842557723567760, 0.290890395906340970, -0.290938233361888620, 0.290986070090090250, 0.291033906090826740, 0.291081741363978410, 0.291129575909426170, 0.291177409727049590, 0.291225242816729510, 0.291273075178346720, -0.291320906811780800, 0.291368737716912630, 0.291416567893622580, 0.291464397341791580, 0.291512226061299120, 0.291560054052026120, 0.291607881313853010, 0.291655707846660620, -0.291703533650328470, 0.291751358724737560, 0.291799183069768210, 0.291847006685301340, 0.291894829571216540, 0.291942651727394640, 0.291990473153716120, 0.292038293850061860, -0.292086113816311440, 0.292133933052345700, 0.292181751558045600, 0.292229569333290640, 0.292277386377961800, 0.292325202691939510, 0.292373018275104590, 0.292420833127336740, -0.292468647248516790, 0.292516460638525210, 0.292564273297242940, 0.292612085224549510, 0.292659896420325920, 0.292707706884452520, 0.292755516616810320, 0.292803325617278950, -0.292851133885739190, 0.292898941422071620, 0.292946748226157130, 0.292994554297875350, 0.293042359637107170, 0.293090164243733520, 0.293137968117634040, 0.293185771258689660, -0.293233573666780820, 0.293281375341788500, 0.293329176283592290, 0.293376976492073120, 0.293424775967111530, 0.293472574708588450, 0.293520372716383480, 0.293568169990377600, -0.293615966530451300, 0.293663762336485450, 0.293711557408359860, 0.293759351745955300, 0.293807145349152370, 0.293854938217832040, 0.293902730351873920, 0.293950521751158990, -0.293998312415567730, 0.294046102344981130, 0.294093891539278840, 0.294141679998341790, 0.294189467722051010, 0.294237254710286110, 0.294285040962928120, 0.294332826479857480, -0.294380611260955220, 0.294428395306100990, 0.294476178615175830, 0.294523961188060180, 0.294571743024635010, 0.294619524124780100, 0.294667304488376410, 0.294715084115304390, -0.294762863005445130, 0.294810641158678280, 0.294858418574884820, 0.294906195253945350, 0.294953971195740790, 0.295001746400150870, 0.295049520867056550, 0.295097294596338930, -0.295145067587877620, 0.295192839841553590, 0.295240611357247500, 0.295288382134840320, 0.295336152174211770, 0.295383921475242780, 0.295431690037814050, 0.295479457861806460, -0.295527224947099880, 0.295574991293575170, 0.295622756901113000, 0.295670521769594350, 0.295718285898899040, 0.295766049288907930, 0.295813811939501740, 0.295861573850561440, -0.295909335021966760, 0.295957095453598770, 0.296004855145338470, 0.296052614097065570, 0.296100372308661150, 0.296148129780005820, 0.296195886510980610, 0.296243642501465180, -0.296291397751340720, 0.296339152260487740, 0.296386906028787310, 0.296434659056119150, 0.296482411342364360, 0.296530162887403580, 0.296577913691117800, 0.296625663753386780, -0.296673413074091620, 0.296721161653112960, 0.296768909490331800, 0.296816656585627950, 0.296864402938882390, 0.296912148549975890, 0.296959893418789420, 0.297007637545202820, -0.297055380929097110, 0.297103123570353400, 0.297150865468851390, 0.297198606624472280, 0.297246347037096630, 0.297294086706605510, 0.297341825632878750, 0.297389563815797450, -0.297437301255242260, 0.297485037951094210, 0.297532773903233180, 0.297580509111540160, 0.297628243575895900, 0.297675977296181450, 0.297723710272276620, 0.297771442504062570, -0.297819173991419880, 0.297866904734229660, 0.297914634732371730, 0.297962363985727290, 0.298010092494177310, 0.298057820257601690, 0.298105547275881510, 0.298153273548897480, -0.298200999076530690, 0.298248723858660970, 0.298296447895169400, 0.298344171185936760, 0.298391893730844130, 0.298439615529771270, 0.298487336582599460, 0.298535056889209230, -0.298582776449481830, 0.298630495263297050, 0.298678213330536070, 0.298725930651079500, 0.298773647224808540, 0.298821363051603060, 0.298869078131344170, 0.298916792463913010, -0.298964506049189390, 0.299012218887054590, 0.299059930977389200, 0.299107642320074420, 0.299155352914990070, 0.299203062762017360, 0.299250771861036990, 0.299298480211930170, -0.299346187814576670, 0.299393894668857690, 0.299441600774653980, 0.299489306131846710, 0.299537010740315750, 0.299584714599942290, 0.299632417710607000, 0.299680120072191140, -0.299727821684574510, 0.299775522547638340, 0.299823222661263770, 0.299870922025330720, 0.299918620639720410, 0.299966318504313490, 0.300014015618991210, 0.300061711983633520, -0.300109407598121490, 0.300157102462335960, 0.300204796576158120, 0.300252489939467850, 0.300300182552146360, 0.300347874414074400, 0.300395565525133190, 0.300443255885202600, -0.300490945494163940, 0.300538634351897870, 0.300586322458285650, 0.300634009813207200, 0.300681696416543740, 0.300729382268176030, 0.300777067367985260, 0.300824751715851440, -0.300872435311655690, 0.300920118155279360, 0.300967800246602250, 0.301015481585505620, 0.301063162171870350, 0.301110842005577530, 0.301158521086507200, 0.301206199414540630, -0.301253876989558520, 0.301301553811442140, 0.301349229880071400, 0.301396905195327640, 0.301444579757091600, 0.301492253565244560, 0.301539926619666440, 0.301587598920238510, -0.301635270466841580, 0.301682941259356910, 0.301730611297664490, 0.301778280581645460, 0.301825949111181210, 0.301873616886151660, 0.301921283906438080, 0.301968950171921270, -0.302016615682482500, 0.302064280438001760, 0.302111944438360370, 0.302159607683439080, 0.302207270173119210, 0.302254931907280700, 0.302302592885804910, 0.302350253108572610, -0.302397912575465110, 0.302445571286362400, 0.302493229241145800, 0.302540886439696070, 0.302588542881894570, 0.302636198567621310, 0.302683853496757530, 0.302731507669184550, -0.302779161084782370, 0.302826813743432290, 0.302874465645015130, 0.302922116789412330, 0.302969767176503760, 0.303017416806170730, 0.303065065678294220, 0.303112713792755450, -0.303160361149434450, 0.303208007748212600, 0.303255653588970660, 0.303303298671590060, 0.303350942995950780, 0.303398586561934140, 0.303446229369421060, 0.303493871418292820, -0.303541512708429440, 0.303589153239712310, 0.303636793012022290, 0.303684432025240700, 0.303732070279247650, 0.303779707773924380, 0.303827344509152280, 0.303874980484811370, -0.303922615700783050, 0.303970250156948170, 0.304017883853188060, 0.304065516789382870, 0.304113148965413860, 0.304160780381162010, 0.304208411036508590, 0.304256040931333740, -0.304303670065518780, 0.304351298438944650, 0.304398926051492660, 0.304446552903043010, 0.304494178993476920, 0.304541804322675410, 0.304589428890519760, 0.304637052696890180, -0.304684675741667970, 0.304732298024734450, 0.304779919545969780, 0.304827540305255270, 0.304875160302471970, 0.304922779537501190, 0.304970398010223020, 0.305018015720518840, -0.305065632668269640, 0.305113248853356780, 0.305160864275660360, 0.305208478935061810, 0.305256092831442060, 0.305303705964682480, 0.305351318334663220, 0.305398929941265660, -0.305446540784370780, 0.305494150863859950, 0.305541760179613320, 0.305589368731512320, 0.305636976519438330, 0.305684583543271440, 0.305732189802893130, 0.305779795298184330, -0.305827400029026420, 0.305875003995299650, 0.305922607196885350, 0.305970209633664500, 0.306017811305518580, 0.306065412212327690, 0.306113012353973310, 0.306160611730336370, -0.306208210341298300, 0.306255808186739360, 0.306303405266540820, 0.306351001580583810, 0.306398597128749730, 0.306446191910918650, 0.306493785926972180, 0.306541379176791640, -0.306588971660257230, 0.306636563377250370, 0.306684154327652110, 0.306731744511343940, 0.306779333928205940, 0.306826922578119610, 0.306874510460965980, 0.306922097576626470, -0.306969683924981310, 0.307017269505911960, 0.307064854319299420, 0.307112438365025160, 0.307160021642969350, 0.307207604153013570, 0.307255185895038700, 0.307302766868926320, -0.307350347074556610, 0.307397926511811030, 0.307445505180570620, 0.307493083080716880, 0.307540660212130000, 0.307588236574691480, 0.307635812168282790, 0.307683386992784190, -0.307730961048077070, 0.307778534334042560, 0.307826106850562110, 0.307873678597516020, 0.307921249574785670, 0.307968819782252270, 0.308016389219797180, 0.308063957887300730, -0.308111525784644400, 0.308159092911709230, 0.308206659268376760, 0.308254224854527190, 0.308301789670042070, 0.308349353714802490, 0.308396916988689930, 0.308444479491584710, -0.308492041223368210, 0.308539602183922070, 0.308587162373126560, 0.308634721790863040, 0.308682280437012790, 0.308729838311457230, 0.308777395414076670, 0.308824951744752610, -0.308872507303366130, 0.308920062089798890, 0.308967616103930980, 0.309015169345644100, 0.309062721814819250, 0.309110273511338070, 0.309157824435080720, 0.309205374585928890, -0.309252923963763580, 0.309300472568466380, 0.309348020399917540, 0.309395567457998680, 0.309443113742591370, 0.309490659253575770, 0.309538203990833590, 0.309585747954245870, -0.309633291143694200, 0.309680833559058900, 0.309728375200221510, 0.309775916067063170, 0.309823456159465490, 0.309870995477308730, 0.309918534020474480, 0.309966071788843890, -0.310013608782298500, 0.310061145000718740, 0.310108680443986100, 0.310156215111981710, 0.310203749004587250, 0.310251282121683010, 0.310298814463150550, 0.310346346028871010, -0.310393876818726100, 0.310441406832596020, 0.310488936070362430, 0.310536464531906970, 0.310583992217109860, 0.310631519125852850, 0.310679045258016980, 0.310726570613483910, -0.310774095192134060, 0.310821618993848910, 0.310869142018509740, 0.310916664265998120, 0.310964185736194390, 0.311011706428980240, 0.311059226344236830, 0.311106745481845750, -0.311154263841687430, 0.311201781423643410, 0.311249298227594890, 0.311296814253423650, 0.311344329501009880, 0.311391843970235280, 0.311439357660981580, 0.311486870573128960, -0.311534382706559200, 0.311581894061153500, 0.311629404636793510, 0.311676914433359540, 0.311724423450733310, 0.311771931688796020, 0.311819439147429270, 0.311866945826513590, -0.311914451725930460, 0.311961956845561270, 0.312009461185287550, 0.312056964744989780, 0.312104467524549620, 0.312151969523848270, 0.312199470742767440, 0.312246971181187490, -0.312294470838990090, 0.312341969716056990, 0.312389467812268510, 0.312436965127506350, 0.312484461661651840, 0.312531957414586500, 0.312579452386190890, 0.312626946576346710, -0.312674439984935100, 0.312721932611837780, 0.312769424456935290, 0.312816915520109210, 0.312864405801240810, 0.312911895300211850, 0.312959384016902710, 0.313006871951195090, -0.313054359102970300, 0.313101845472110060, 0.313149331058494800, 0.313196815862006210, 0.313244299882525950, 0.313291783119934550, 0.313339265574113680, 0.313386747244944700, -0.313434228132309200, 0.313481708236087730, 0.313529187556161990, 0.313576666092413300, 0.313624143844723370, 0.313671620812972620, 0.313719096997042870, 0.313766572396815320, -0.313814047012171800, 0.313861520842992740, 0.313908993889159880, 0.313956466150554560, 0.314003937627058420, 0.314051408318552050, 0.314098878224917220, 0.314146347346035140, -0.314193815681787610, 0.314241283232055080, 0.314288749996719410, 0.314336215975662250, 0.314383681168764140, 0.314431145575906850, 0.314478609196971680, 0.314526072031840410, -0.314573534080393510, 0.314620995342512810, 0.314668455818079620, 0.314715915506975700, 0.314763374409081590, 0.314810832524278990, 0.314858289852449350, 0.314905746393474410, -0.314953202147234660, 0.315000657113611910, 0.315048111292487550, 0.315095564683743280, 0.315143017287259740, 0.315190469102918590, 0.315237920130601760, 0.315285370370189670, -0.315332819821564140, 0.315380268484606600, 0.315427716359198750, 0.315475163445221250, 0.315522609742555800, 0.315570055251083840, 0.315617499970687170, 0.315664943901246330, -0.315712387042643150, 0.315759829394758940, 0.315807270957475630, 0.315854711730673700, 0.315902151714235020, 0.315949590908040920, 0.315997029311973270, 0.316044466925912650, -0.316091903749740830, 0.316139339783339690, 0.316186775026589820, 0.316234209479372970, 0.316281643141570590, 0.316329076013064540, 0.316376508093735350, 0.316423939383464910, -0.316471369882134650, 0.316518799589626370, 0.316566228505820670, 0.316613656630599370, 0.316661083963843960, 0.316708510505436250, 0.316755936255256830, 0.316803361213187580, -0.316850785379109930, 0.316898208752905750, 0.316945631334455640, 0.316993053123641400, 0.317040474120344530, 0.317087894324446950, 0.317135313735829210, 0.317182732354373110, -0.317230150179960650, 0.317277567212472410, 0.317324983451790220, 0.317372398897795620, 0.317419813550370410, 0.317467227409395260, 0.317514640474751970, 0.317562052746322150, -0.317609464223987610, 0.317656874907629010, 0.317704284797128200, 0.317751693892366680, 0.317799102193226320, 0.317846509699587830, 0.317893916411333020, 0.317941322328343430, -0.317988727450501000, 0.318036131777686300, 0.318083535309781230, 0.318130938046667810, 0.318178339988226590, 0.318225741134339490, 0.318273141484888110, 0.318320541039754270, -0.318367939798818610, 0.318415337761963180, 0.318462734929069350, 0.318510131300019090, 0.318557526874693130, 0.318604921652973330, 0.318652315634741220, 0.318699708819878750, -0.318747101208266600, 0.318794492799786670, 0.318841883594320530, 0.318889273591750070, 0.318936662791956040, 0.318984051194820320, 0.319031438800224940, 0.319078825608050510, -0.319126211618179000, 0.319173596830492010, 0.319220981244871420, 0.319268364861197970, 0.319315747679353610, 0.319363129699219870, 0.319410510920678680, 0.319457891343610860, -0.319505270967898270, 0.319552649793422520, 0.319600027820065580, 0.319647405047708170, 0.319694781476232200, 0.319742157105519290, 0.319789531935451400, 0.319836905965909250, -0.319884279196774870, 0.319931651627930190, 0.319979023259255980, 0.320026394090634210, 0.320073764121946440, 0.320121133353074680, 0.320168501783899660, 0.320215869414303410, -0.320263236244167470, 0.320310602273373880, 0.320357967501803340, 0.320405331929337900, 0.320452695555859090, 0.320500058381249010, 0.320547420405388360, 0.320594781628159130, -0.320642142049442970, 0.320689501669121860, 0.320736860487076560, 0.320784218503189170, 0.320831575717341170, 0.320878932129414710, 0.320926287739290440, 0.320973642546850460, -0.321020996551976800, 0.321068349754550290, 0.321115702154452840, 0.321163053751566120, 0.321210404545772210, 0.321257754536951880, 0.321305103724987160, 0.321352452109759710, -0.321399799691151510, 0.321447146469043380, 0.321494492443317400, 0.321541837613855190, 0.321589181980538820, 0.321636525543249060, 0.321683868301868010, 0.321731210256277270, -0.321778551406358910, 0.321825891751993780, 0.321873231293063890, 0.321920570029451350, 0.321967907961036970, 0.322015245087702850, 0.322062581409330580, 0.322109916925802320, -0.322157251636998820, 0.322204585542802180, 0.322251918643094050, 0.322299250937756580, 0.322346582426670580, 0.322393913109718100, 0.322441242986780840, 0.322488572057740900, -0.322535900322479090, 0.322583227780877560, 0.322630554432817910, 0.322677880278182340, 0.322725205316851670, 0.322772529548707940, 0.322819852973633300, 0.322867175591508630, -0.322914497402216010, 0.322961818405637200, 0.323009138601654200, 0.323056457990147930, 0.323103776571000530, 0.323151094344093730, 0.323198411309309600, 0.323245727466528960, -0.323293042815634090, 0.323340357356506570, 0.323387671089028550, 0.323434984013080960, 0.323482296128545900, 0.323529607435305120, 0.323576917933240730, 0.323624227622233640, -0.323671536502165960, 0.323718844572919440, 0.323766151834376240, 0.323813458286417220, 0.323860763928924600, 0.323908068761780410, 0.323955372784865690, 0.324002675998062540, -0.324049978401252660, 0.324097279994318310, 0.324144580777140310, 0.324191880749600870, 0.324239179911581690, 0.324286478262965030, 0.324333775803631710, 0.324381072533463990, -0.324428368452343570, 0.324475663560152620, 0.324522957856772150, 0.324570251342084230, 0.324617544015970700, 0.324664835878313740, 0.324712126928994320, 0.324759417167894530, -0.324806706594896580, 0.324853995209881510, 0.324901283012731410, 0.324948570003328110, 0.324995856181553850, 0.325043141547289470, 0.325090426100417270, 0.325137709840818970, -0.325184992768376870, 0.325232274882971790, 0.325279556184486120, 0.325326836672801490, 0.325374116347800220, 0.325421395209363200, 0.325468673257372720, 0.325515950491710560, -0.325563226912258970, 0.325610502518898840, 0.325657777311512460, 0.325705051289982120, 0.325752324454188670, 0.325799596804014440, 0.325846868339341180, 0.325894139060051210, -0.325941408966025470, 0.325988678057146150, 0.326035946333295190, 0.326083213794354790, 0.326130480440205930, 0.326177746270730870, 0.326225011285811380, 0.326272275485329890, -0.326319538869167200, 0.326366801437205700, 0.326414063189327200, 0.326461324125413950, 0.326508584245347010, 0.326555843549008570, 0.326603102036280960, 0.326650359707045150, -0.326697616561183460, 0.326744872598577710, 0.326792127819110210, 0.326839382222661960, 0.326886635809115260, 0.326933888578351980, 0.326981140530254400, 0.327028391664703540, -0.327075641981581730, 0.327122891480770780, 0.327170140162153010, 0.327217388025609510, 0.327264635071022550, 0.327311881298273930, 0.327359126707246100, 0.327406371297820020, -0.327453615069877970, 0.327500858023301920, 0.327548100157974140, 0.327595341473775670, 0.327642581970588880, 0.327689821648296020, 0.327737060506778200, 0.327784298545917730, -0.327831535765596540, 0.327878772165696890, 0.327926007746099920, 0.327973242506687910, 0.328020476447342780, 0.328067709567946900, 0.328114941868381360, 0.328162173348528430, -0.328209404008270030, 0.328256633847488600, 0.328303862866065170, 0.328351091063882050, 0.328398318440821180, 0.328445544996764980, 0.328492770731594500, 0.328539995645192040, -0.328587219737440040, 0.328634443008219590, 0.328681665457413010, 0.328728887084902280, 0.328776107890569770, 0.328823327874296520, 0.328870547035965020, 0.328917765375457080, -0.328964982892655190, 0.329012199587440380, 0.329059415459695140, 0.329106630509301330, 0.329153844736141340, 0.329201058140096310, 0.329248270721048670, 0.329295482478880350, -0.329342693413473770, 0.329389903524709980, 0.329437112812471460, 0.329484321276640570, 0.329531528917098470, 0.329578735733727530, 0.329625941726409740, 0.329673146895027580, -0.329720351239462080, 0.329767554759595680, 0.329814757455310470, 0.329861959326488710, 0.329909160373011660, 0.329956360594761740, 0.330003559991620900, 0.330050758563471550, -0.330097956310194900, 0.330145153231673370, 0.330192349327788960, 0.330239544598424080, 0.330286739043459900, 0.330333932662778940, 0.330381125456263080, 0.330428317423794860, -0.330475508565255430, 0.330522698880527210, 0.330569888369492690, 0.330617077032032970, 0.330664264868030630, 0.330711451877367610, 0.330758638059926340, 0.330805823415588120, -0.330853007944235280, 0.330900191645749960, 0.330947374520014550, 0.330994556566910290, 0.331041737786319680, 0.331088918178124690, 0.331136097742207810, 0.331183276478450310, -0.331230454386734540, 0.331277631466942720, 0.331324807718957230, 0.331371983142659250, 0.331419157737931350, 0.331466331504655990, 0.331513504442714320, 0.331560676551988950, -0.331607847832361860, 0.331655018283715570, 0.331702187905931310, 0.331749356698891610, 0.331796524662478500, 0.331843691796574520, 0.331890858101060840, 0.331938023575820080, -0.331985188220734200, 0.332032352035685820, 0.332079515020556100, 0.332126677175227590, 0.332173838499582430, 0.332220998993503050, 0.332268158656870820, 0.332315317489568110, -0.332362475491477570, 0.332409632662480410, 0.332456789002459170, 0.332503944511296000, 0.332551099188873320, 0.332598253035072510, 0.332645406049776050, 0.332692558232866090, -0.332739709584225160, 0.332786860103734540, 0.332834009791276750, 0.332881158646733900, 0.332928306669988630, 0.332975453860922140, 0.333022600219417040, 0.333069745745355470, -0.333116890438619920, 0.333164034299091690, 0.333211177326653400, 0.333258319521187620, 0.333305460882575570, 0.333352601410699890, 0.333399741105442740, 0.333446879966686590, -0.333494017994312890, 0.333541155188204100, 0.333588291548242430, 0.333635427074310490, 0.333682561766289520, 0.333729695624062130, 0.333776828647510570, 0.333823960836517280, -0.333871092190963730, 0.333918222710732400, 0.333965352395705520, 0.334012481245765710, 0.334059609260794250, 0.334106736440673790, 0.334153862785286470, 0.334200988294514940, -0.334248112968240470, 0.334295236806345760, 0.334342359808713350, 0.334389481975224670, 0.334436603305762250, 0.334483723800208300, 0.334530843458445530, 0.334577962280355190, -0.334625080265819940, 0.334672197414721980, 0.334719313726943970, 0.334766429202367210, 0.334813543840874420, 0.334860657642347740, 0.334907770606669870, 0.334954882733722150, -0.335001994023387210, 0.335049104475547310, 0.335096214090085050, 0.335143322866881810, 0.335190430805820280, 0.335237537906783120, 0.335284644169651650, 0.335331749594308610, -0.335378854180636180, 0.335425957928517040, 0.335473060837832570, 0.335520162908465480, 0.335567264140297920, 0.335614364533212690, 0.335661464087091080, 0.335708562801815820, -0.335755660677269200, 0.335802757713333790, 0.335849853909891080, 0.335896949266823790, 0.335944043784014050, 0.335991137461344620, 0.336038230298697000, 0.336085322295953730, -0.336132413452997600, 0.336179503769710060, 0.336226593245973700, 0.336273681881670890, 0.336320769676684280, 0.336367856630895360, 0.336414942744186760, 0.336462028016440820, -0.336509112447540230, 0.336556196037366420, 0.336603278785802150, 0.336650360692729630, 0.336697441758031680, 0.336744521981589660, 0.336791601363286400, 0.336838679903004090, -0.336885757600625500, 0.336932834456032120, 0.336979910469106640, 0.337026985639731380, 0.337074059967789110, 0.337121133453161250, 0.337168206095730560, 0.337215277895379750, -0.337262348851990360, 0.337309418965445030, 0.337356488235626200, 0.337403556662416610, 0.337450624245697660, 0.337497690985352150, 0.337544756881262400, 0.337591821933311220, -0.337638886141380050, 0.337685949505351630, 0.337733012025108410, 0.337780073700533030, 0.337827134531507030, 0.337874194517913230, 0.337921253659633940, 0.337968311956551910, -0.338015369408548700, 0.338062426015507070, 0.338109481777309760, 0.338156536693838380, 0.338203590764975640, 0.338250643990603890, 0.338297696370605970, 0.338344747904863410, -0.338391798593258960, 0.338438848435675010, 0.338485897431994360, 0.338532945582098570, 0.338579992885870430, 0.338627039343192270, 0.338674084953946910, 0.338721129718015990, -0.338768173635282170, 0.338815216705627980, 0.338862258928936120, 0.338909300305088200, 0.338956340833967080, 0.339003380515455480, 0.339050419349435030, 0.339097457335788500, -0.339144494474398320, 0.339191530765147350, 0.339238566207917150, 0.339285600802590510, 0.339332634549049880, 0.339379667447178070, 0.339426699496856720, 0.339473730697968550, -0.339520761050396080, 0.339567790554022140, 0.339614819208728320, 0.339661847014397440, 0.339708873970911930, 0.339755900078154650, 0.339802925336007200, 0.339849949744352450, -0.339896973303072840, 0.339943996012051160, 0.339991017871169140, 0.340038038880309530, 0.340085059039355260, 0.340132078348187930, 0.340179096806690400, 0.340226114414745100, -0.340273131172234950, 0.340320147079041570, 0.340367162135047810, 0.340414176340136150, 0.340461189694189480, 0.340508202197089380, 0.340555213848718790, 0.340602224648960170, -0.340649234597696420, 0.340696243694809160, 0.340743251940181290, 0.340790259333695280, 0.340837265875234050, 0.340884271564679210, 0.340931276401913730, 0.340978280386820430, -0.341025283519281070, 0.341072285799178480, 0.341119287226395170, 0.341166287800814040, 0.341213287522316780, 0.341260286390786320, 0.341307284406105140, 0.341354281568156170, -0.341401277876821060, 0.341448273331982800, 0.341495267933523810, 0.341542261681327060, 0.341589254575274280, 0.341636246615248330, 0.341683237801131800, 0.341730228132807570, -0.341777217610157340, 0.341824206233064090, 0.341871194001410750, 0.341918180915078970, 0.341965166973951800, 0.342012152177911640, 0.342059136526841560, 0.342106120020623180, -0.342153102659139560, 0.342200084442273120, 0.342247065369906960, 0.342294045441922660, 0.342341024658203260, 0.342388003018631320, 0.342434980523089790, 0.342481957171460350, -0.342528932963626020, 0.342575907899469400, 0.342622881978873420, 0.342669855201719780, 0.342716827567891570, 0.342763799077271670, 0.342810769729741840, 0.342857739525185110, -0.342904708463483980, 0.342951676544521580, 0.342998643768179510, 0.343045610134340820, 0.343092575642888140, 0.343139540293704470, 0.343186504086671450, 0.343233467021672230, -0.343280429098589300, 0.343327390317305750, 0.343374350677703330, 0.343421310179664980, 0.343468268823073410, 0.343515226607811530, 0.343562183533761170, 0.343609139600805360, -0.343656094808826750, 0.343703049157708270, 0.343750002647331740, 0.343796955277580250, 0.343843907048336730, 0.343890857959483100, 0.343937808010902290, 0.343984757202476950, -0.344031705534090130, 0.344078653005623620, 0.344125599616960490, 0.344172545367983360, 0.344219490258575290, 0.344266434288618080, 0.344313377457994780, 0.344360319766588040, -0.344407261214280950, 0.344454201800955260, 0.344501141526494030, 0.344548080390780000, 0.344595018393696160, 0.344641955535124390, 0.344688891814947660, 0.344735827233049190, -0.344782761789310720, 0.344829695483615310, 0.344876628315845700, 0.344923560285884890, 0.344970491393614800, 0.345017421638918460, 0.345064351021678590, 0.345111279541778280, -0.345158207199099290, 0.345205133993524820, 0.345252059924937520, 0.345298984993220480, 0.345345909198255590, 0.345392832539925860, 0.345439755018114080, 0.345486676632703330, -0.345533597383575470, 0.345580517270613670, 0.345627436293700910, 0.345674354452719210, 0.345721271747551570, 0.345768188178080800, 0.345815103744189940, 0.345862018445760920, -0.345908932282676830, 0.345955845254820430, 0.346002757362074860, 0.346049668604321960, 0.346096578981444860, 0.346143488493326320, 0.346190397139849500, 0.346237304920896270, -0.346284211836349780, 0.346331117886092720, 0.346378023070008310, 0.346424927387978420, 0.346471830839886250, 0.346518733425614460, 0.346565635145046290, 0.346612535998063580, -0.346659435984549510, 0.346706335104387310, 0.346753233357458830, 0.346800130743647290, 0.346847027262835450, 0.346893922914906390, 0.346940817699742170, 0.346987711617225860, -0.347034604667240290, 0.347081496849668600, 0.347128388164392790, 0.347175278611295990, 0.347222168190260970, 0.347269056901170990, 0.347315944743907920, 0.347362831718355030, -0.347409717824395000, 0.347456603061911170, 0.347503487430785350, 0.347550370930900850, 0.347597253562140830, 0.347644135324387200, 0.347691016217523300, 0.347737896241431870, -0.347784775395996060, 0.347831653681097920, 0.347878531096620650, 0.347925407642447060, 0.347972283318460360, 0.348019158124542540, 0.348066032060576850, 0.348112905126446050, -0.348159777322033400, 0.348206648647220900, 0.348253519101891730, 0.348300388685928830, 0.348347257399215350, 0.348394125241633320, 0.348440992213065960, 0.348487858313396510, -0.348534723542507090, 0.348581587900280760, 0.348628451386600540, 0.348675314001349550, 0.348722175744409890, 0.348769036615664770, 0.348815896614997070, 0.348862755742290030, -0.348909613997425700, 0.348956471380287350, 0.349003327890757830, 0.349050183528720360, 0.349097038294057030, 0.349143892186651150, 0.349190745206385490, 0.349237597353143360, -0.349284448626806850, 0.349331299027259230, 0.349378148554383820, 0.349424997208062580, 0.349471844988178850, 0.349518691894615490, 0.349565537927255810, 0.349612383085981910, -0.349659227370677010, 0.349706070781224070, 0.349752913317506350, 0.349799754979405960, 0.349846595766806160, 0.349893435679589860, 0.349940274717640390, 0.349987112880839830, -0.350033950169071520, 0.350080786582218310, 0.350127622120163520, 0.350174456782789300, 0.350221290569978920, 0.350268123481615290, 0.350314955517581790, 0.350361786677760470, -0.350408616962034740, 0.350455446370287800, 0.350502274902401880, 0.350549102558260270, 0.350595929337745920, 0.350642755240742120, 0.350689580267131040, 0.350736404416795990, -0.350783227689619950, 0.350830050085486290, 0.350876871604277050, 0.350923692245875610, 0.350970512010164940, 0.351017330897028470, 0.351064148906348180, 0.351110966038007570, -0.351157782291889540, 0.351204597667877430, 0.351251412165853430, 0.351298225785700910, 0.351345038527303260, 0.351391850390542600, 0.351438661375302270, 0.351485471481465310, -0.351532280708915070, 0.351579089057533770, 0.351625896527204660, 0.351672703117810900, 0.351719508829235750, 0.351766313661361410, 0.351813117614071300, 0.351859920687248360, -0.351906722880776070, 0.351953524194536570, 0.352000324628413240, 0.352047124182289060, 0.352093922856047570, 0.352140720649570800, 0.352187517562742250, 0.352234313595445270, -0.352281108747562130, 0.352327903018976260, 0.352374696409570590, 0.352421488919228590, 0.352468280547832470, 0.352515071295265600, 0.352561861161411080, 0.352608650146152340, -0.352655438249371570, 0.352702225470952200, 0.352749011810777220, 0.352795797268730170, 0.352842581844693190, 0.352889365538549770, 0.352936148350182940, 0.352982930279476140, -0.353029711326311610, 0.353076491490572800, 0.353123270772142780, 0.353170049170905000, 0.353216826686741650, 0.353263603319536210, 0.353310379069172230, 0.353357153935531850, -0.353403927918498620, 0.353450701017955560, 0.353497473233786160, 0.353544244565872630, 0.353591015014098560, 0.353637784578346880, 0.353684553258501230, 0.353731321054443710, -0.353778087966057920, 0.353824853993226880, 0.353871619135834150, 0.353918383393761970, 0.353965146766893830, 0.354011909255112780, 0.354058670858302390, 0.354105431576344940, -0.354152191409123910, 0.354198950356522770, 0.354245708418423840, 0.354292465594710670, 0.354339221885266340, 0.354385977289974340, 0.354432731808717040, 0.354479485441377860, -0.354526238187839960, 0.354572990047986920, 0.354619741021700960, 0.354666491108865670, 0.354713240309364130, 0.354759988623079890, 0.354806736049895320, 0.354853482589693850, -0.354900228242358730, 0.354946973007773390, 0.354993716885820270, 0.355040459876382830, 0.355087201979344620, 0.355133943194588020, 0.355180683521996610, 0.355227422961453430, -0.355274161512842130, 0.355320899176044980, 0.355367635950945620, 0.355414371837427130, 0.355461106835373190, 0.355507840944666030, 0.355554574165189260, 0.355601306496826090, -0.355648037939460040, 0.355694768492973430, 0.355741498157249980, 0.355788226932172770, 0.355834954817625390, 0.355881681813490220, 0.355928407919650800, 0.355975133135990830, -0.356021857462392620, 0.356068580898739720, 0.356115303444915380, 0.356162025100803190, 0.356208745866285590, 0.356255465741246060, 0.356302184725567850, 0.356348902819134670, -0.356395620021828730, 0.356442336333533780, 0.356489051754133040, 0.356535766283510020, 0.356582479921547180, 0.356629192668128150, 0.356675904523136130, 0.356722615486454790, -0.356769325557966480, 0.356816034737554850, 0.356862743025103120, 0.356909450420494930, 0.356956156923612770, 0.357002862534340160, 0.357049567252560820, 0.357096271078157170, -0.357142974011012860, 0.357189676051011040, 0.357236377198035530, 0.357283077451968580, 0.357329776812694010, 0.357376475280094970, 0.357423172854055120, 0.357469869534456970, -0.357516565321184140, 0.357563260214119880, 0.357609954213147900, 0.357656647318150610, 0.357703339529011730, 0.357750030845614460, 0.357796721267842570, 0.357843410795578410, -0.357890099428705750, 0.357936787167108250, 0.357983474010668380, 0.358030159959269840, 0.358076845012795850, 0.358123529171130220, 0.358170212434155310, 0.358216894801754890, -0.358263576273812220, 0.358310256850211010, 0.358356936530833780, 0.358403615315564190, 0.358450293204285560, 0.358496970196881650, 0.358543646293234820, 0.358590321493228950, -0.358636995796747240, 0.358683669203673450, 0.358730341713890120, 0.358777013327280900, 0.358823684043729550, 0.358870353863118610, 0.358917022785331720, 0.358963690810252310, -0.359010357937764090, 0.359057024167749590, 0.359103689500092530, 0.359150353934676200, 0.359197017471384440, 0.359243680110099660, 0.359290341850705740, 0.359337002693085940, -0.359383662637124070, 0.359430321682702610, 0.359476979829705390, 0.359523637078015660, 0.359570293427517280, 0.359616948878092760, 0.359663603429625830, 0.359710257081999940, -0.359756909835098780, 0.359803561688804950, 0.359850212643002210, 0.359896862697574370, 0.359943511852403920, 0.359990160107374720, 0.360036807462370160, 0.360083453917273920, -0.360130099471968670, 0.360176744126338160, 0.360223387880265810, 0.360270030733635390, 0.360316672686329500, 0.360363313738231880, 0.360409953889226030, 0.360456593139195650, -0.360503231488023430, 0.360549868935593100, 0.360596505481788120, 0.360643141126492260, 0.360689775869588170, 0.360736409710959600, 0.360783042650490440, 0.360829674688063260, -0.360876305823561890, 0.360922936056869760, 0.360969565387870730, 0.361016193816447340, 0.361062821342483460, 0.361109447965862530, 0.361156073686468400, 0.361202698504183680, -0.361249322418892240, 0.361295945430477440, 0.361342567538823210, 0.361389188743812150, 0.361435809045328130, 0.361482428443254570, 0.361529046937475400, 0.361575664527873150, -0.361622281214331760, 0.361668896996735050, 0.361715511874965700, 0.361762125848907600, 0.361808738918444120, 0.361855351083459230, 0.361901962343835590, 0.361948572699457020, -0.361995182150207040, 0.362041790695969480, 0.362088398336627040, 0.362135005072063590, 0.362181610902162670, 0.362228215826808090, 0.362274819845882610, 0.362321422959270060, -0.362368025166853960, 0.362414626468518190, 0.362461226864145390, 0.362507826353619610, 0.362554424936824660, 0.362601022613643190, 0.362647619383959230, 0.362694215247656160, -0.362740810204618010, 0.362787404254727390, 0.362833997397868260, 0.362880589633924170, 0.362927180962778980, 0.362973771384315470, 0.363020360898417490, 0.363066949504968650, -0.363113537203852810, 0.363160123994952730, 0.363206709878152290, 0.363253294853335130, 0.363299878920385180, 0.363346462079185080, 0.363393044329618780, 0.363439625671569950, -0.363486206104922440, 0.363532785629558990, 0.363579364245363580, 0.363625941952220140, 0.363672518750011500, 0.363719094638621510, 0.363765669617933770, 0.363812243687832330, -0.363858816848199820, 0.363905389098920280, 0.363951960439877260, 0.363998530870954800, 0.364045100392035580, 0.364091669003003600, 0.364138236703742400, 0.364184803494136070, -0.364231369374067300, 0.364277934343420150, 0.364324498402078150, 0.364371061549925270, 0.364417623786844390, 0.364464185112719390, 0.364510745527434340, 0.364557305030872080, -0.364603863622916520, 0.364650421303451270, 0.364696978072360400, 0.364743533929526690, 0.364790088874834160, 0.364836642908166360, 0.364883196029407390, 0.364929748238440040, -0.364976299535148260, 0.365022849919415800, 0.365069399391126590, 0.365115947950163440, 0.365162495596410450, 0.365209042329751270, 0.365255588150069810, 0.365302133057249010, -0.365348677051172910, 0.365395220131725480, 0.365441762298789610, 0.365488303552249320, 0.365534843891988310, 0.365581383317890580, 0.365627921829838940, 0.365674459427717540, -0.365720996111409960, 0.365767531880800360, 0.365814066735771440, 0.365860600676207400, 0.365907133701991850, 0.365953665813008920, 0.366000197009141380, 0.366046727290273320, -0.366093256656288450, 0.366139785107070900, 0.366186312642503400, 0.366232839262470190, 0.366279364966854810, 0.366325889755541480, 0.366372413628413000, 0.366418936585353520, -0.366465458626247080, 0.366511979750976550, 0.366558499959426130, 0.366605019251479420, 0.366651537627020570, 0.366698055085932510, 0.366744571628099260, 0.366791087253404650, -0.366837601961732650, 0.366884115752966310, 0.366930628626989610, 0.366977140583686410, 0.367023651622940710, 0.367070161744635470, 0.367116670948654860, 0.367163179234882560, -0.367209686603202750, 0.367256193053498270, 0.367302698585653340, 0.367349203199552050, 0.367395706895077330, 0.367442209672113380, 0.367488711530543910, 0.367535212470253000, -0.367581712491123700, 0.367628211593040160, 0.367674709775886010, 0.367721207039545580, 0.367767703383901630, 0.367814198808838480, 0.367860693314239820, 0.367907186899989860, -0.367953679565971530, 0.368000171312068970, 0.368046662138165950, 0.368093152044146720, 0.368139641029894220, 0.368186129095292580, 0.368232616240226070, 0.368279102464577570, -0.368325587768231320, 0.368372072151071150, 0.368418555612981150, 0.368465038153844350, 0.368511519773545020, 0.368558000471966850, 0.368604480248994060, 0.368650959104509680, -0.368697437038397910, 0.368743914050542580, 0.368790390140827820, 0.368836865309136670, 0.368883339555353410, 0.368929812879361770, 0.368976285281045980, 0.369022756760289120, -0.369069227316975330, 0.369115696950988950, 0.369162165662212830, 0.369208633450531340, 0.369255100315828260, 0.369301566257987820, 0.369348031276893090, 0.369394495372428240, -0.369440958544477230, 0.369487420792924180, 0.369533882117652150, 0.369580342518545430, 0.369626801995487860, 0.369673260548363690, 0.369719718177055960, 0.369766174881448920, -0.369812630661426500, 0.369859085516872850, 0.369905539447671130, 0.369951992453705520, 0.369998444534859920, 0.370044895691018620, 0.370091345922064720, 0.370137795227882430, -0.370184243608356060, 0.370230691063368640, 0.370277137592804560, 0.370323583196547570, 0.370370027874482090, 0.370416471626491050, 0.370462914452458880, 0.370509356352269450, -0.370555797325807010, 0.370602237372954670, 0.370648676493596730, 0.370695114687617120, 0.370741551954900110, 0.370787988295328830, 0.370834423708787550, 0.370880858195160260, -0.370927291754331200, 0.370973724386183530, 0.371020156090601520, 0.371066586867469520, 0.371113016716670690, 0.371159445638089280, 0.371205873631609230, 0.371252300697114960, -0.371298726834489500, 0.371345152043617230, 0.371391576324382080, 0.371437999676668410, 0.371484422100359310, 0.371530843595339170, 0.371577264161491950, 0.371623683798701920, -0.371670102506852280, 0.371716520285827410, 0.371762937135511230, 0.371809353055788160, 0.371855768046541250, 0.371902182107654910, 0.371948595239013520, 0.371995007440500290, -0.372041418711999470, 0.372087829053395160, 0.372134238464571660, 0.372180646945412140, 0.372227054495801070, 0.372273461115622320, 0.372319866804760310, 0.372366271563098210, -0.372412675390520480, 0.372459078286911050, 0.372505480252154300, 0.372551881286133480, 0.372598281388732970, 0.372644680559836680, 0.372691078799329170, 0.372737476107093510, -0.372783872483014200, 0.372830267926975210, 0.372876662438860920, 0.372923056018554580, 0.372969448665940620, 0.373015840380903410, 0.373062231163326210, 0.373108621013093440, -0.373155009930089100, 0.373201397914197650, 0.373247784965302310, 0.373294171083287500, 0.373340556268037300, 0.373386940519436050, 0.373433323837367100, 0.373479706221714780, -0.373526087672363230, 0.373572468189196870, 0.373618847772098920, 0.373665226420953900, 0.373711604135645750, 0.373757980916059050, 0.373804356762076910, 0.373850731673583960, -0.373897105650464520, 0.373943478692601970, 0.373989850799880730, 0.374036221972184780, 0.374082592209398770, 0.374128961511405840, 0.374175329878090490, 0.374221697309336850, -0.374268063805029360, 0.374314429365051270, 0.374360793989287120, 0.374407157677621010, 0.374453520429937400, 0.374499882246119580, 0.374546243126052060, 0.374592603069618950, -0.374638962076704720, 0.374685320147192690, 0.374731677280967350, 0.374778033477913220, 0.374824388737913570, 0.374870743060853000, 0.374917096446615530, 0.374963448895085760, -0.375009800406146950, 0.375056150979683640, 0.375102500615579980, 0.375148849313720440, 0.375195197073988350, 0.375241543896268290, 0.375287889780444420, 0.375334234726401150, -0.375380578734021920, 0.375426921803191260, 0.375473263933793320, 0.375519605125712590, 0.375565945378832420, 0.375612284693037420, 0.375658623068212070, 0.375704960504239790, -0.375751297001005120, 0.375797632558392210, 0.375843967176285600, 0.375890300854568700, 0.375936633593126010, 0.375982965391841730, 0.376029296250600500, 0.376075626169285580, -0.376121955147781570, 0.376168283185972730, 0.376214610283743590, 0.376260936440977470, 0.376307261657559010, 0.376353585933372430, 0.376399909268302300, 0.376446231662231960, -0.376492553115046040, 0.376538873626628750, 0.376585193196864680, 0.376631511825637200, 0.376677829512830960, 0.376724146258330560, 0.376770462062019420, 0.376816776923782070, -0.376863090843502780, 0.376909403821066190, 0.376955715856355680, 0.377002026949255890, 0.377048337099651020, 0.377094646307425730, 0.377140954572463380, 0.377187261894648680, -0.377233568273865780, 0.377279873709999440, 0.377326178202932960, 0.377372481752551060, 0.377418784358737940, 0.377465086021378240, 0.377511386740355450, 0.377557686515554160, -0.377603985346859130, 0.377650283234153670, 0.377696580177322550, 0.377742876176249910, 0.377789171230820560, 0.377835465340917830, 0.377881758506426410, 0.377928050727230680, -0.377974342003215170, 0.378020632334263420, 0.378066921720260070, 0.378113210161089400, 0.378159497656636150, 0.378205784206783750, 0.378252069811416850, 0.378298354470419820, -0.378344638183677310, 0.378390920951072740, 0.378437202772490930, 0.378483483647816530, 0.378529763576932960, 0.378576042559724990, 0.378622320596076920, 0.378668597685873460, -0.378714873828998160, 0.378761149025335590, 0.378807423274770180, 0.378853696577186590, 0.378899968932468410, 0.378946240340500280, 0.378992510801166530, 0.379038780314351900, -0.379085048879939930, 0.379131316497815400, 0.379177583167862490, 0.379223848889966080, 0.379270113664009590, 0.379316377489877900, 0.379362640367455210, 0.379408902296626330, -0.379455163277274800, 0.379501423309285320, 0.379547682392542720, 0.379593940526930520, 0.379640197712333430, 0.379686453948635870, 0.379732709235722610, 0.379778963573477120, -0.379825216961784280, 0.379871469400528350, 0.379917720889594190, 0.379963971428865290, 0.380010221018226460, 0.380056469657562120, 0.380102717346756940, 0.380148964085694600, -0.380195209874259870, 0.380241454712337110, 0.380287698599811100, 0.380333941536565470, 0.380380183522484930, 0.380426424557454400, 0.380472664641357320, 0.380518903774078650, -0.380565141955502730, 0.380611379185514300, 0.380657615463997070, 0.380703850790835740, 0.380750085165914850, 0.380796318589119110, 0.380842551060332210, 0.380888782579438870, -0.380935013146323610, 0.380981242760871250, 0.381027471422965340, 0.381073699132490780, 0.381119925889331970, 0.381166151693373700, 0.381212376544499690, 0.381258600442594740, -0.381304823387543680, 0.381351045379230150, 0.381397266417539020, 0.381443486502354710, 0.381489705633562100, 0.381535923811044840, 0.381582141034687740, 0.381628357304375330, -0.381674572619992380, 0.381720786981422640, 0.381767000388550880, 0.381813212841261630, 0.381859424339439810, 0.381905634882968970, 0.381951844471734080, 0.381998053105619520, -0.382044260784510310, 0.382090467508289950, 0.382136673276843530, 0.382182878090055740, 0.382229081947810410, 0.382275284849992350, 0.382321486796486090, 0.382367687787176500, -0.382413887821947300, 0.382460086900683340, 0.382506285023269220, 0.382552482189589760, 0.382598678399528710, 0.382644873652970950, 0.382691067949801010, 0.382737261289903820, -0.382783453673163020, 0.382829645099463660, 0.382875835568690150, 0.382922025080727420, 0.382968213635459300, 0.383014401232770580, 0.383060587872545880, 0.383106773554670100, -0.383152958279027010, 0.383199142045501540, 0.383245324853978610, 0.383291506704341920, 0.383337687596476460, 0.383383867530266820, 0.383430046505597920, 0.383476224522353530, -0.383522401580418500, 0.383568577679677500, 0.383614752820015450, 0.383660927001316150, 0.383707100223464490, 0.383753272486345110, 0.383799443789842930, 0.383845614133841770, -0.383891783518226560, 0.383937951942881880, 0.383984119407692730, 0.384030285912542850, 0.384076451457317280, 0.384122616041901010, 0.384168779666177800, 0.384214942330032620, -0.384261104033350060, 0.384307264776015180, 0.384353424557911720, 0.384399583378924660, 0.384445741238938710, 0.384491898137838740, 0.384538054075508670, 0.384584209051833440, -0.384630363066697730, 0.384676516119986490, 0.384722668211583570, 0.384768819341373970, 0.384814969509242270, 0.384861118715073610, 0.384907266958751770, 0.384953414240161720, -0.384999560559188550, 0.385045705915716070, 0.385091850309629340, 0.385137993740812920, 0.385184136209151980, 0.385230277714530330, 0.385276418256832900, 0.385322557835944490, -0.385368696451750090, 0.385414834104133520, 0.385460970792979860, 0.385507106518173770, 0.385553241279600330, 0.385599375077143370, 0.385645507910688020, 0.385691639780118830, -0.385737770685321000, 0.385783900626178290, 0.385830029602575900, 0.385876157614398360, 0.385922284661530890, 0.385968410743857290, 0.386014535861262610, 0.386060660013632040, -0.386106783200849460, 0.386152905422799840, 0.386199026679368010, 0.386245146970438990, 0.386291266295896720, 0.386337384655626280, 0.386383502049512330, 0.386429618477440120, -0.386475733939293410, 0.386521848434957350, 0.386567961964316700, 0.386614074527256490, 0.386660186123660770, 0.386706296753414560, 0.386752406416402570, 0.386798515112510010, -0.386844622841620740, 0.386890729603619920, 0.386936835398392690, 0.386982940225822910, 0.387029044085795860, 0.387075146978196170, 0.387121248902909000, 0.387167349859818320, -0.387213449848809230, 0.387259548869766550, 0.387305646922575410, 0.387351744007119750, 0.387397840123284710, 0.387443935270955050, 0.387490029450016040, 0.387536122660351480, -0.387582214901846630, 0.387628306174386210, 0.387674396477855450, 0.387720485812138360, 0.387766574177119960, 0.387812661572685570, 0.387858747998719170, 0.387904833455105850, -0.387950917941730420, 0.387997001458478150, 0.388043084005232960, 0.388089165581880000, 0.388135246188304190, 0.388181325824390690, 0.388227404490023410, 0.388273482185087670, -0.388319558909468180, 0.388365634663050240, 0.388411709445717790, 0.388457783257356030, 0.388503856097849880, 0.388549927967084430, 0.388595998864943840, 0.388642068791313190, -0.388688137746077740, 0.388734205729121600, 0.388780272740329950, 0.388826338779587610, 0.388872403846779790, 0.388918467941790580, 0.388964531064505240, 0.389010593214808520, -0.389056654392585740, 0.389102714597720890, 0.389148773830099270, 0.389194832089605760, 0.389240889376125550, 0.389286945689542700, 0.389333001029742440, 0.389379055396609770, -0.389425108790029780, 0.389471161209886670, 0.389517212656065650, 0.389563263128451580, 0.389609312626929770, 0.389655361151384270, 0.389701408701700390, 0.389747455277763390, -0.389793500879457300, 0.389839545506667500, 0.389885589159278840, 0.389931631837176610, 0.389977673540244870, 0.390023714268368960, 0.390069754021433730, 0.390115792799324570, -0.390161830601925500, 0.390207867429121890, 0.390253903280798560, 0.390299938156840940, 0.390345972057133010, 0.390392004981560180, 0.390438036930007340, 0.390484067902359790, -0.390530097898501680, 0.390576126918318280, 0.390622154961695060, 0.390668182028515940, 0.390714208118666470, 0.390760233232031410, 0.390806257368496170, 0.390852280527944910, -0.390898302710262990, 0.390944323915335230, 0.390990344143047120, 0.391036363393282740, 0.391082381665927400, 0.391128398960866150, 0.391174415277984360, 0.391220430617166050, -0.391266444978296660, 0.391312458361261220, 0.391358470765944990, 0.391404482192232170, 0.391450492640008200, 0.391496502109158320, 0.391542510599566850, 0.391588518111119050, -0.391634524643700020, 0.391680530197195060, 0.391726534771488330, 0.391772538366465310, 0.391818540982010910, 0.391864542618010630, 0.391910543274348490, 0.391956542950910040, -0.392002541647580250, 0.392048539364244500, 0.392094536100786980, 0.392140531857093130, 0.392186526633047980, 0.392232520428536900, 0.392278513243444090, 0.392324505077654980, -0.392370495931054660, 0.392416485803528500, 0.392462474694960710, 0.392508462605236700, 0.392554449534242010, 0.392600435481860740, 0.392646420447978370, 0.392692404432479990, -0.392738387435250970, 0.392784369456175560, 0.392830350495139260, 0.392876330552027090, 0.392922309626724530, 0.392968287719115740, 0.393014264829086250, 0.393060240956521090, -0.393106216101305690, 0.393152190263324430, 0.393198163442462610, 0.393244135638605440, 0.393290106851638340, 0.393336077081445520, 0.393382046327912570, 0.393428014590924860, -0.393473981870366750, 0.393519948166123620, 0.393565913478080680, 0.393611877806123330, 0.393657841150135910, 0.393703803510003840, 0.393749764885612310, 0.393795725276846750, -0.393841684683591490, 0.393887643105731990, 0.393933600543153410, 0.393979556995741220, 0.394025512463379690, 0.394071466945954460, 0.394117420443350520, 0.394163372955453450, -0.394209324482147520, 0.394255275023318310, 0.394301224578851250, 0.394347173148630770, 0.394393120732542400, 0.394439067330471180, 0.394485012942302700, 0.394530957567921280, -0.394576901207212450, 0.394622843860061410, 0.394668785526353650, 0.394714726205973530, 0.394760665898806600, 0.394806604604737930, 0.394852542323653240, 0.394898479055436790, -0.394944414799974110, 0.394990349557150400, 0.395036283326851200, 0.395082216108960880, 0.395128147903365090, 0.395174078709948860, 0.395220008528597840, 0.395265937359196460, -0.395311865201630200, 0.395357792055784640, 0.395403717921544220, 0.395449642798794520, 0.395495566687420750, 0.395541489587308390, 0.395587411498341980, 0.395633332420406990, -0.395679252353388690, 0.395725171297172660, 0.395771089251643280, 0.395817006216686200, 0.395862922192186550, 0.395908837178030050, 0.395954751174101060, 0.396000664180285180, -0.396046576196467660, 0.396092487222534040, 0.396138397258368860, 0.396184306303857650, 0.396230214358886110, 0.396276121423338620, 0.396322027497100830, 0.396367932580057980, -0.396413836672095680, 0.396459739773098400, 0.396505641882951730, 0.396551543001541000, 0.396597443128751780, 0.396643342264468570, 0.396689240408577000, 0.396735137560962350, -0.396781033721510250, 0.396826928890105180, 0.396872823066632740, 0.396918716250978300, 0.396964608443027440, 0.397010499642664660, 0.397056389849775590, 0.397102279064246000, -0.397148167285960310, 0.397194054514804160, 0.397239940750662930, 0.397285825993422210, 0.397331710242966540, 0.397377593499181610, 0.397423475761952690, 0.397469357031165480, -0.397515237306704460, 0.397561116588455330, 0.397606994876303410, 0.397652872170134450, 0.397698748469832890, 0.397744623775284470, 0.397790498086374460, 0.397836371402988610, -0.397882243725011460, 0.397928115052328670, 0.397973985384825980, 0.398019854722387990, 0.398065723064900290, 0.398111590412248360, 0.398157456764317800, 0.398203322120993190, -0.398249186482160290, 0.398295049847704420, 0.398340912217511390, 0.398386773591465570, 0.398432633969452890, 0.398478493351358600, 0.398524351737068520, 0.398570209126467120, -0.398616065519440180, 0.398661920915873100, 0.398707775315651600, 0.398753628718660270, 0.398799481124784920, 0.398845332533910800, 0.398891182945923790, 0.398937032360708380, -0.398982880778150420, 0.399028728198135670, 0.399074574620548680, 0.399120420045275260, 0.399166264472200770, 0.399212107901211030, 0.399257950332190640, 0.399303791765025340, -0.399349632199600570, 0.399395471635802140, 0.399441310073514630, 0.399487147512623820, 0.399532983953015170, 0.399578819394574460, 0.399624653837186260, 0.399670487280736510, -0.399716319725110460, 0.399762151170194040, 0.399807981615871830, 0.399853811062029660, 0.399899639508553400, 0.399945466955327620, 0.399991293402238160, 0.400037118849170480, -0.400082943296010410, 0.400128766742642580, 0.400174589188952820, 0.400220410634826610, 0.400266231080149750, 0.400312050524806950, 0.400357868968683970, 0.400403686411666350, -0.400449502853639890, 0.400495318294489310, 0.400541132734100410, 0.400586946172358680, 0.400632758609149990, 0.400678570044359030, 0.400724380477871620, 0.400770189909573640, -0.400815998339349780, 0.400861805767085970, 0.400907612192667630, 0.400953417615980630, 0.400999222036909740, 0.401045025455340760, 0.401090827871159180, 0.401136629284250980, -0.401182429694500800, 0.401228229101794560, 0.401274027506017710, 0.401319824907056260, 0.401365621304794750, 0.401411416699119280, 0.401457211089915220, 0.401503004477068550, -0.401548796860463910, 0.401594588239987340, 0.401640378615524260, 0.401686167986960660, 0.401731956354181240, 0.401777743717071980, 0.401823530075518690, 0.401869315429406180, -0.401915099778620390, 0.401960883123046840, 0.402006665462571520, 0.402052446797079130, 0.402098227126455600, 0.402144006450586510, 0.402189784769357790, 0.402235562082654260, -0.402281338390361790, 0.402327113692365960, 0.402372887988552750, 0.402418661278806930, 0.402464433563014480, 0.402510204841060870, 0.402555975112832250, 0.402601744378213220, -0.402647512637089870, 0.402693279889348110, 0.402739046134872770, 0.402784811373549770, 0.402830575605264810, 0.402876338829903760, 0.402922101047351490, 0.402967862257493980, -0.403013622460216770, 0.403059381655405950, 0.403105139842946210, 0.403150897022723660, 0.403196653194623890, 0.403242408358532870, 0.403288162514335410, 0.403333915661917560, -0.403379667801164970, 0.403425418931963540, 0.403471169054198220, 0.403516918167754920, 0.403562666272519740, 0.403608413368377490, 0.403654159455214270, 0.403699904532915600, -0.403745648601367580, 0.403791391660455020, 0.403837133710063970, 0.403882874750080110, 0.403928614780389440, 0.403974353800876870, 0.404020091811428390, 0.404065828811929710, -0.404111564802266840, 0.404157299782324670, 0.404203033751989240, 0.404248766711146180, 0.404294498659681640, 0.404340229597480500, 0.404385959524428740, 0.404431688440412500, -0.404477416345316590, 0.404523143239027220, 0.404568869121429920, 0.404614593992410900, 0.404660317851854970, 0.404706040699648220, 0.404751762535676410, 0.404797483359825570, -0.404843203171980640, 0.404888921972027690, 0.404934639759852440, 0.404980356535340980, 0.405026072298378230, 0.405071787048850330, 0.405117500786642940, 0.405163213511642200, -0.405208925223733030, 0.405254635922801530, 0.405300345608733460, 0.405346054281414900, 0.405391761940730840, 0.405437468586567370, 0.405483174218810580, 0.405528878837345510, -0.405574582442058240, 0.405620285032834480, 0.405665986609560440, 0.405711687172121030, 0.405757386720402350, 0.405803085254290260, 0.405848782773670870, 0.405894479278429090, -0.405940174768451120, 0.405985869243622680, 0.406031562703830010, 0.406077255148958040, 0.406122946578892920, 0.406168636993520400, 0.406214326392726750, 0.406260014776396840, -0.406305702144416910, 0.406351388496673130, 0.406397073833050460, 0.406442758153435110, 0.406488441457712850, 0.406534123745769920, 0.406579805017491250, 0.406625485272763100, -0.406671164511471170, 0.406716842733501840, 0.406762519938739910, 0.406808196127071700, 0.406853871298383020, 0.406899545452560070, 0.406945218589487840, 0.406990890709052530, -0.407036561811140060, 0.407082231895636580, 0.407127900962427070, 0.407173569011397840, 0.407219236042435100, 0.407264902055423820, 0.407310567050250320, 0.407356231026800410, -0.407401893984960290, 0.407447555924615070, 0.407493216845650930, 0.407538876747953750, 0.407584535631409840, 0.407630193495904130, 0.407675850341322920, 0.407721506167552150, -0.407767160974477960, 0.407812814761985500, 0.407858467529960970, 0.407904119278290290, 0.407949770006859720, 0.407995419715554310, 0.408041068404260350, 0.408086716072863730, -0.408132362721250750, 0.408178008349306400, 0.408223652956917090, 0.408269296543968980, 0.408314939110347270, 0.408360580655938220, 0.408406221180627750, 0.408451860684302060, -0.408497499166846360, 0.408543136628146900, 0.408588773068089610, 0.408634408486560740, 0.408680042883445500, 0.408725676258630100, 0.408771308612000560, 0.408816939943443150, -0.408862570252842950, 0.408908199540086390, 0.408953827805059290, 0.408999455047648010, 0.409045081267737700, 0.409090706465214670, 0.409136330639965300, 0.409181953791874720, -0.409227575920829200, 0.409273197026714770, 0.409318817109417750, 0.409364436168823340, 0.409410054204817800, 0.409455671217287100, 0.409501287206117610, 0.409546902171194550, -0.409592516112404210, 0.409638129029632590, 0.409683740922766050, 0.409729351791689730, 0.409774961636290070, 0.409820570456452980, 0.409866178252064840, 0.409911785023010900, -0.409957390769177480, 0.410002995490450990, 0.410048599186716600, 0.410094201857860720, 0.410139803503769330, 0.410185404124328860, 0.410231003719424450, 0.410276602288942530, -0.410322199832769070, 0.410367796350790570, 0.410413391842892160, 0.410458986308960270, 0.410504579748880940, 0.410550172162540530, 0.410595763549824300, 0.410641353910618680, -0.410686943244809640, 0.410732531552283620, 0.410778118832925920, 0.410823705086622910, 0.410869290313261030, 0.410914874512725570, 0.410960457684902860, 0.411006039829679040, -0.411051620946940530, 0.411097201036572550, 0.411142780098461560, 0.411188358132493600, 0.411233935138555220, 0.411279511116531550, 0.411325086066309080, 0.411370659987773950, -0.411416232880812530, 0.411461804745310130, 0.411507375581153250, 0.411552945388227900, 0.411598514166420570, 0.411644081915616580, 0.411689648635702400, 0.411735214326564070, -0.411780778988088130, 0.411826342620159820, 0.411871905222665700, 0.411917466795492180, 0.411963027338524580, 0.412008586851649430, 0.412054145334752820, 0.412099702787721230, -0.412145259210439980, 0.412190814602795610, 0.412236368964674190, 0.412281922295962280, 0.412327474596545120, 0.412373025866309250, 0.412418576105140880, 0.412464125312926420, -0.412509673489551250, 0.412555220634901960, 0.412600766748864530, 0.412646311831325660, 0.412691855882170560, 0.412737398901285860, 0.412782940888558050, 0.412828481843872440, -0.412874021767115680, 0.412919560658173870, 0.412965098516933530, 0.413010635343280030, 0.413056171137099970, 0.413101705898279490, 0.413147239626705130, 0.413192772322262260, -0.413238303984837460, 0.413283834614316890, 0.413329364210587190, 0.413374892773533620, 0.413420420303042880, 0.413465946799001060, 0.413511472261294750, 0.413556996689809390, -0.413602520084431490, 0.413648042445047710, 0.413693563771543480, 0.413739084063805270, 0.413784603321719400, 0.413830121545172400, 0.413875638734049700, 0.413921154888237890, -0.413966670007623220, 0.414012184092092230, 0.414057697141530400, 0.414103209155824380, 0.414148720134860260, 0.414194230078524790, 0.414239738986703300, 0.414285246859282530, -0.414330753696148580, 0.414376259497188200, 0.414421764262286720, 0.414467267991330880, 0.414512770684206830, 0.414558272340801230, 0.414603772960999590, 0.414649272544688530, -0.414694771091754680, 0.414740268602083460, 0.414785765075561640, 0.414831260512075360, 0.414876754911511330, 0.414922248273755010, 0.414967740598693120, 0.415013231886211810, -0.415058722136197880, 0.415104211348536700, 0.415149699523114980, 0.415195186659819080, 0.415240672758535550, 0.415286157819149960, 0.415331641841548970, 0.415377124825618890, -0.415422606771246370, 0.415468087678317000, 0.415513567546717310, 0.415559046376334170, 0.415604524167053010, 0.415650000918760530, 0.415695476631343040, 0.415740951304687300, -0.415786424938678730, 0.415831897533204100, 0.415877369088149760, 0.415922839603402370, 0.415968309078847520, 0.416013777514371850, 0.416059244909861740, 0.416104711265203930, -0.416150176580283970, 0.416195640854988560, 0.416241104089204010, 0.416286566282817130, 0.416332027435713400, 0.416377487547779650, 0.416422946618902560, 0.416468404648967670, -0.416513861637861800, 0.416559317585471320, 0.416604772491682870, 0.416650226356382160, 0.416695679179455820, 0.416741130960790300, 0.416786581700272380, 0.416832031397787570, -0.416877480053222730, 0.416922927666464160, 0.416968374237398690, 0.417013819765911840, 0.417059264251890440, 0.417104707695220960, 0.417150150095790040, 0.417195591453483340, -0.417241031768187720, 0.417286471039789890, 0.417331909268175430, 0.417377346453231270, 0.417422782594843720, 0.417468217692899600, 0.417513651747284550, 0.417559084757885390, -0.417604516724588480, 0.417649947647280690, 0.417695377525847620, 0.417740806360176130, 0.417786234150152650, 0.417831660895663930, 0.417877086596595670, 0.417922511252834690, -0.417967934864267480, 0.418013357430780770, 0.418058778952260290, 0.418104199428592890, 0.418149618859664950, 0.418195037245363390, 0.418240454585573850, 0.418285870880183150, -0.418331286129078160, 0.418376700332144580, 0.418422113489269280, 0.418467525600338620, 0.418512936665239590, 0.418558346683857830, 0.418603755656080160, 0.418649163581793160, -0.418694570460883600, 0.418739976293237230, 0.418785381078740910, 0.418830784817281140, 0.418876187508744830, 0.418921589153017640, 0.418966989749986470, 0.419012389299537880, -0.419057787801558670, 0.419103185255934540, 0.419148581662552530, 0.419193977021299400, 0.419239371332060960, 0.419284764594724140, 0.419330156809175350, 0.419375547975301580, -0.419420938092988530, 0.419466327162123120, 0.419511715182591950, 0.419557102154281880, 0.419602488077078620, 0.419647872950869140, 0.419693256775539980, 0.419738639550978120, -0.419784021277069210, 0.419829401953700280, 0.419874781580757810, 0.419920160158128830, 0.419965537685699050, 0.420010914163355400, 0.420056289590984840, 0.420101663968473200, -0.420147037295707400, 0.420192409572573980, 0.420237780798959960, 0.420283150974751110, 0.420328520099834350, 0.420373888174096270, 0.420419255197423900, 0.420464621169702960, -0.420509986090820520, 0.420555349960663070, 0.420600712779117650, 0.420646074546070060, 0.420691435261407290, 0.420736794925015920, 0.420782153536783000, 0.420827511096594220, -0.420872867604336730, 0.420918223059897070, 0.420963577463162210, 0.421008930814018020, 0.421054283112351550, 0.421099634358049700, 0.421144984550998410, 0.421190333691084660, -0.421235681778195040, 0.421281028812216630, 0.421326374793035250, 0.421371719720537940, 0.421417063594611340, 0.421462406415142490, 0.421507748182017190, 0.421553088895122550, -0.421598428554345150, 0.421643767159572140, 0.421689104710689270, 0.421734441207583630, 0.421779776650141880, 0.421825111038251150, 0.421870444371797160, 0.421915776650667150, -0.421961107874748000, 0.422006438043925740, 0.422051767158087400, 0.422097095217119630, 0.422142422220909470, 0.422187748169342900, 0.422233073062306950, 0.422278396899688320, -0.422323719681374110, 0.422369041407250180, 0.422414362077203680, 0.422459681691121250, 0.422505000248890040, 0.422550317750395870, 0.422595634195525980, 0.422640949584166980, -0.422686263916205950, 0.422731577191528930, 0.422776889410022950, 0.422822200571575100, 0.422867510676071420, 0.422912819723398950, 0.422958127713444380, 0.423003434646094910, -0.423048740521236480, 0.423094045338756220, 0.423139349098540780, 0.423184651800477430, 0.423229953444452020, 0.423275254030351710, 0.423320553558063310, 0.423365852027473900, -0.423411149438469410, 0.423456445790937110, 0.423501741084763680, 0.423547035319836280, 0.423592328496040950, 0.423637620613264760, 0.423682911671394940, 0.423728201670317380, -0.423773490609919370, 0.423818778490087640, 0.423864065310709300, 0.423909351071670440, 0.423954635772858250, 0.423999919414159380, 0.424045201995461200, 0.424090483516649570, -0.424135763977611710, 0.424181043378234480, 0.424226321718405020, 0.424271598998009370, 0.424316875216934670, 0.424362150375067860, 0.424407424472296010, 0.424452697508505230, -0.424497969483582700, 0.424543240397415260, 0.424588510249890140, 0.424633779040893280, 0.424679046770312040, 0.424724313438033520, 0.424769579043943860, 0.424814843587930260, -0.424860107069879530, 0.424905369489678940, 0.424950630847214520, 0.424995891142373520, 0.425041150375042810, 0.425086408545109600, 0.425131665652459970, 0.425176921696981180, -0.425222176678560100, 0.425267430597083940, 0.425312683452438830, 0.425357935244512040, 0.425403185973190380, 0.425448435638361160, 0.425493684239910460, 0.425538931777725560, -0.425584178251693700, 0.425629423661701030, 0.425674668007634760, 0.425719911289381860, 0.425765153506829530, 0.425810394659863980, 0.425855634748372400, 0.425900873772241730, -0.425946111731359320, 0.425991348625611170, 0.426036584454884680, 0.426081819219066740, 0.426127052918044650, 0.426172285551704500, 0.426217517119933660, 0.426262747622619060, -0.426307977059647960, 0.426353205430906490, 0.426398432736282030, 0.426443658975661890, 0.426488884148932210, 0.426534108255980320, 0.426579331296693120, 0.426624553270958050, -0.426669774178661140, 0.426714994019689820, 0.426760212793931000, 0.426805430501272120, 0.426850647141599200, 0.426895862714799680, 0.426941077220760470, 0.426986290659368990, -0.427031503030511410, 0.427076714334075010, 0.427121924569946910, 0.427167133738014350, 0.427212341838163530, 0.427257548870281890, 0.427302754834256390, 0.427347959729974360, -0.427393163557322100, 0.427438366316186870, 0.427483568006456150, 0.427528768628016090, 0.427573968180754100, 0.427619166664557240, 0.427664364079312850, 0.427709560424907100, -0.427754755701227510, 0.427799949908161000, 0.427845143045595010, 0.427890335113415790, 0.427935526111510700, 0.427980716039766840, 0.428025904898071520, 0.428071092686311110, -0.428116279404372910, 0.428161465052144030, 0.428206649629511940, 0.428251833136362780, 0.428297015572584040, 0.428342196938063140, 0.428387377232686380, 0.428432556456341150, -0.428477734608914530, 0.428522911690293990, 0.428568087700365810, 0.428613262639017330, 0.428658436506135780, 0.428703609301608450, 0.428748781025321770, 0.428793951677163110, -0.428839121257019560, 0.428884289764778600, 0.428929457200326550, 0.428974623563550820, 0.429019788854338560, 0.429064953072577250, 0.429110116218153090, 0.429155278290953680, -0.429200439290866490, 0.429245599217777770, 0.429290758071575070, 0.429335915852145480, 0.429381072559376460, 0.429426228193154400, 0.429471382753366770, 0.429516536239900660, -0.429561688652643660, 0.429606839991481970, 0.429651990256303180, 0.429697139446994500, 0.429742287563443290, 0.429787434605535980, 0.429832580573160090, 0.429877725466202790, -0.429922869284551530, 0.429968012028092710, 0.430013153696713830, 0.430058294290302510, 0.430103433808744990, 0.430148572251928930, 0.430193709619741460, 0.430238845912070120, -0.430283981128801230, 0.430329115269822370, 0.430374248335020800, 0.430419380324283950, 0.430464511237498240, 0.430509641074551250, 0.430554769835330200, 0.430599897519722610, -0.430645024127614850, 0.430690149658894570, 0.430735274113448920, 0.430780397491165420, 0.430825519791930620, 0.430870641015631940, 0.430915761162156690, 0.430960880231392450, -0.431005998223225610, 0.431051115137543740, 0.431096230974234500, 0.431141345733184300, 0.431186459414280690, 0.431231572017410970, 0.431276683542462740, 0.431321793989322360, -0.431366903357877470, 0.431412011648015400, 0.431457118859623620, 0.431502224992588720, 0.431547330046798240, 0.431592434022139370, 0.431637536918499880, 0.431682638735766120, -0.431727739473825810, 0.431772839132566090, 0.431817937711874710, 0.431863035211638050, 0.431908131631743850, 0.431953226972079720, 0.431998321232532070, 0.432043414412988660, -0.432088506513336690, 0.432133597533463860, 0.432178687473256660, 0.432223776332602730, 0.432268864111389320, 0.432313950809504190, 0.432359036426833760, 0.432404120963265800, -0.432449204418687510, 0.432494286792986570, 0.432539368086049540, 0.432584448297764050, 0.432629527428017470, 0.432674605476697500, 0.432719682443690580, 0.432764758328884500, -0.432809833132166870, 0.432854906853424260, 0.432899979492544440, 0.432945051049414610, 0.432990121523922580, 0.433035190915954830, 0.433080259225399110, 0.433125326452142740, -0.433170392596073480, 0.433215457657077810, 0.433260521635043530, 0.433305584529857900, 0.433350646341408740, 0.433395707069582580, 0.433440766714267120, 0.433485825275349730, -0.433530882752718230, 0.433575939146259080, 0.433620994455860110, 0.433666048681408620, 0.433711101822792430, 0.433756153879898080, 0.433801204852613360, 0.433846254740826000, -0.433891303544422620, 0.433936351263291000, 0.433981397897318490, 0.434026443446392850, 0.434071487910400730, 0.434116531289229890, 0.434161573582767750, 0.434206614790902060, -0.434251654913519410, 0.434296693950507630, 0.434341731901754120, 0.434386768767146660, 0.434431804546571930, 0.434476839239917640, 0.434521872847071280, 0.434566905367920640, -0.434611936802352330, 0.434656967150254150, 0.434701996411513970, 0.434747024586018440, 0.434792051673655310, 0.434837077674312010, 0.434882102587876460, 0.434927126414235250, -0.434972149153276260, 0.435017170804886890, 0.435062191368954960, 0.435107210845367130, 0.435152229234011310, 0.435197246534774930, 0.435242262747545790, 0.435287277872210670, -0.435332291908657300, 0.435377304856773170, 0.435422316716446210, 0.435467327487563060, 0.435512337170011590, 0.435557345763679720, 0.435602353268454030, 0.435647359684222470, -0.435692365010872500, 0.435737369248292040, 0.435782372396367750, 0.435827374454987540, 0.435872375424038890, 0.435917375303409680, 0.435962374092986660, 0.436007371792657690, -0.436052368402310260, 0.436097363921832350, 0.436142358351110650, 0.436187351690032980, 0.436232343938486980, 0.436277335096360520, 0.436322325163540300, 0.436367314139914310, -0.436412302025370400, 0.436457288819795340, 0.436502274523077110, 0.436547259135103120, 0.436592242655761410, 0.436637225084938680, 0.436682206422522920, 0.436727186668401660, -0.436772165822462750, 0.436817143884593080, 0.436862120854680570, 0.436907096732612740, 0.436952071518277580, 0.436997045211561800, 0.437042017812353410, 0.437086989320540020, -0.437131959736009550, 0.437176929058648740, 0.437221897288345650, 0.437266864424987800, 0.437311830468463170, 0.437356795418658570, 0.437401759275462040, 0.437446722038761450, -0.437491683708443660, 0.437536644284396700, 0.437581603766508060, 0.437626562154665890, 0.437671519448756870, 0.437716475648669060, 0.437761430754290030, 0.437806384765507870, -0.437851337682209350, 0.437896289504282440, 0.437941240231614850, 0.437986189864094540, 0.438031138401608340, 0.438076085844044340, 0.438121032191290120, 0.438165977443233660, -0.438210921599761940, 0.438255864660762830, 0.438300806626124530, 0.438345747495733800, 0.438390687269478660, 0.438435625947246830, 0.438480563528926340, 0.438525500014404050, -0.438570435403567990, 0.438615369696305820, 0.438660302892505680, 0.438705234992054330, 0.438750165994839900, 0.438795095900750110, 0.438840024709672930, 0.438884952421495280, -0.438929879036105310, 0.438974804553390610, 0.439019728973239260, 0.439064652295538260, 0.439109574520175570, 0.439154495647039340, 0.439199415676016500, 0.439244334606995130, -0.439289252439862890, 0.439334169174507960, 0.439379084810817170, 0.439423999348678710, 0.439468912787980230, 0.439513825128609870, 0.439558736370454510, 0.439603646513402340, -0.439648555557341060, 0.439693463502158820, 0.439738370347742490, 0.439783276093980210, 0.439828180740759740, 0.439873084287969280, 0.439917986735495650, 0.439962888083227090, -0.440007788331051310, 0.440052687478856400, 0.440097585526529440, 0.440142482473958490, 0.440187378321031720, 0.440232273067636130, 0.440277166713659850, 0.440322059258990650, -0.440366950703516720, 0.440411841047125000, 0.440456730289703670, 0.440501618431140500, 0.440546505471323730, 0.440591391410140250, 0.440636276247478310, 0.440681159983225660, -0.440726042617270550, 0.440770924149499920, 0.440815804579801960, 0.440860683908064540, 0.440905562134175750, 0.440950439258022690, 0.440995315279493540, 0.441040190198476460, -0.441085064014858530, 0.441129936728527900, 0.441174808339372500, 0.441219678847280420, 0.441264548252138790, 0.441309416553835760, 0.441354283752259210, 0.441399149847297330, -0.441444014838837160, 0.441488878726767010, 0.441533741510974630, 0.441578603191348280, 0.441623463767775060, 0.441668323240143160, 0.441713181608340440, 0.441758038872255180, -0.441802895031774390, 0.441847750086786450, 0.441892604037179450, 0.441937456882840580, 0.441982308623658060, 0.442027159259519740, 0.442072008790313940, 0.442116857215927750, -0.442161704536249370, 0.442206550751166770, 0.442251395860568160, 0.442296239864340690, 0.442341082762372610, 0.442385924554551830, 0.442430765240766630, 0.442475604820904090, -0.442520443294852570, 0.442565280662499950, 0.442610116923734530, 0.442654952078443350, 0.442699786126514890, 0.442744619067837300, 0.442789450902297770, 0.442834281629784610, -0.442879111250185750, 0.442923939763389560, 0.442968767169283070, 0.443013593467754650, 0.443058418658692280, 0.443103242741984260, 0.443148065717517750, 0.443192887585181050, -0.443237708344862150, 0.443282527996449350, 0.443327346539829860, 0.443372163974891990, 0.443416980301523660, 0.443461795519613340, 0.443506609629048140, 0.443551422629716360, -0.443596234521506090, 0.443641045304305590, 0.443685854978002110, 0.443730663542483970, 0.443775470997639590, 0.443820277343356110, 0.443865082579521950, 0.443909886706025050, -0.443954689722753870, 0.443999491629595570, 0.444044292426438500, 0.444089092113170770, 0.444133890689680620, 0.444178688155855430, 0.444223484511583440, 0.444268279756752820, -0.444313073891251850, 0.444357866914967810, 0.444402658827789070, 0.444447449629603750, 0.444492239320300130, 0.444537027899765570, 0.444581815367888430, 0.444626601724557150, -0.444671386969658970, 0.444716171103082260, 0.444760954124715220, 0.444805736034446120, 0.444850516832162310, 0.444895296517752230, 0.444940075091103890, 0.444984852552105740, -0.445029628900645070, 0.445074404136610370, 0.445119178259889610, 0.445163951270371280, 0.445208723167942740, 0.445253493952492360, 0.445298263623908230, 0.445343032182078880, -0.445387799626891510, 0.445432565958234660, 0.445477331175996800, 0.445522095280065260, 0.445566858270328380, 0.445611620146674440, 0.445656380908991790, 0.445701140557167810, -0.445745899091091020, 0.445790656510649420, 0.445835412815731640, 0.445880168006224880, 0.445924922082017670, 0.445969675042998230, 0.446014426889054960, 0.446059177620075240, -0.446103927235947550, 0.446148675736560090, 0.446193423121801320, 0.446238169391558580, 0.446282914545720390, 0.446327658584174950, 0.446372401506810790, 0.446417143313515170, -0.446461884004176750, 0.446506623578683980, 0.446551362036924250, 0.446596099378786140, 0.446640835604157740, 0.446685570712927690, 0.446730304704983320, 0.446775037580213140, -0.446819769338505420, 0.446864499979748640, 0.446909229503830220, 0.446953957910638740, 0.446998685200062360, 0.447043411371989610, 0.447088136426308010, 0.447132860362906060, -0.447177583181671940, 0.447222304882494260, 0.447267025465260430, 0.447311744929859030, 0.447356463276178620, 0.447401180504106710, 0.447445896613531850, 0.447490611604342230, -0.447535325476426490, 0.447580038229672020, 0.447624749863967500, 0.447669460379201080, 0.447714169775261410, 0.447758878052035900, 0.447803585209413210, 0.447848291247281540, -0.447892996165529580, 0.447937699964044640, 0.447982402642715550, 0.448027104201430440, 0.448071804640077900, 0.448116503958545520, 0.448161202156721840, 0.448205899234495610, -0.448250595191754140, 0.448295290028386250, 0.448339983744280140, 0.448384676339324440, 0.448429367813406700, 0.448474058166415500, 0.448518747398239160, 0.448563435508766320, -0.448608122497884510, 0.448652808365482440, 0.448697493111448300, 0.448742176735670850, 0.448786859238037520, 0.448831540618437110, 0.448876220876757770, 0.448920900012888310, -0.448965578026716220, 0.449010254918130180, 0.449054930687018520, 0.449099605333269870, 0.449144278856771880, 0.449188951257413150, 0.449233622535082420, 0.449278292689667290, -0.449322961721056400, 0.449367629629138120, 0.449412296413801150, 0.449456962074933020, 0.449501626612422540, 0.449546290026157980, 0.449590952316028080, 0.449635613481920380, -0.449680273523723640, 0.449724932441326270, 0.449769590234616930, 0.449814246903483210, 0.449858902447813900, 0.449903556867497330, 0.449948210162422260, 0.449992862332476260, -0.450037513377548100, 0.450082163297526590, 0.450126812092299270, 0.450171459761754880, 0.450216106305781850, 0.450260751724268990, 0.450305396017103790, 0.450350039184175150, -0.450394681225371410, 0.450439322140581360, 0.450483961929692590, 0.450528600592593920, 0.450573238129173770, 0.450617874539320900, 0.450662509822922940, 0.450707143979868720, -0.450751777010046650, 0.450796408913345490, 0.450841039689652940, 0.450885669338857820, 0.450930297860848930, 0.450974925255513860, 0.451019551522741480, 0.451064176662420210, -0.451108800674438930, 0.451153423558685210, 0.451198045315047980, 0.451242665943415610, 0.451287285443676970, 0.451331903815719690, 0.451376521059432710, 0.451421137174704390, -0.451465752161423650, 0.451510366019478140, 0.451554978748756660, 0.451599590349147760, 0.451644200820540300, 0.451688810162821920, 0.451733418375881550, 0.451778025459607990, -0.451822631413889010, 0.451867236238613410, 0.451911839933669730, 0.451956442498946900, 0.452001043934332490, 0.452045644239715490, 0.452090243414984440, 0.452134841460028080, -0.452179438374734290, 0.452224034158991870, 0.452268628812689420, 0.452313222335715750, 0.452357814727958610, 0.452402405989306980, 0.452446996119649280, 0.452491585118874550, -0.452536172986870430, 0.452580759723525850, 0.452625345328729390, 0.452669929802369970, 0.452714513144335360, 0.452759095354514420, 0.452803676432796180, 0.452848256379068340, -0.452892835193219820, 0.452937412875139220, 0.452981989424715510, 0.453026564841836450, 0.453071139126390960, 0.453115712278267580, 0.453160284297355390, 0.453204855183542030, -0.453249424936716550, 0.453293993556767530, 0.453338561043583890, 0.453383127397053500, 0.453427692617065230, 0.453472256703507770, 0.453516819656270050, 0.453561381475239890, -0.453605942160306250, 0.453650501711358180, 0.453695060128283480, 0.453739617410971070, 0.453784173559309670, 0.453828728573188230, 0.453873282452494530, 0.453917835197117650, -0.453962386806946230, 0.454006937281869190, 0.454051486621774410, 0.454096034826550920, 0.454140581896087300, 0.454185127830272710, 0.454229672628994830, 0.454274216292142820, -0.454318758819605210, 0.454363300211271140, 0.454407840467028420, 0.454452379586766100, 0.454496917570373250, 0.454541454417737630, 0.454585990128748450, 0.454630524703294290, -0.454675058141264190, 0.454719590442546060, 0.454764121607028950, 0.454808651634601550, 0.454853180525152890, 0.454897708278570900, 0.454942234894744610, 0.454986760373562780, -0.455031284714914440, 0.455075807918687460, 0.455120329984770980, 0.455164850913053700, 0.455209370703424650, 0.455253889355771770, 0.455298406869984180, 0.455342923245950600, -0.455387438483560110, 0.455431952582700580, 0.455476465543261210, 0.455520977365131030, 0.455565488048198080, 0.455609997592351320, 0.455654505997479640, 0.455699013263472060, -0.455743519390216570, 0.455788024377602240, 0.455832528225517900, 0.455877030933852620, 0.455921532502494340, 0.455966032931332250, 0.456010532220255120, 0.456055030369151960, -0.456099527377910930, 0.456144023246421000, 0.456188517974571050, 0.456233011562250210, 0.456277504009346410, 0.456321995315748910, 0.456366485481346780, 0.456410974506028020, -0.456455462389681820, 0.456499949132196990, 0.456544434733462730, 0.456588919193366920, 0.456633402511798850, 0.456677884688647230, 0.456722365723801320, 0.456766845617149090, -0.456811324368579800, 0.456855801977982150, 0.456900278445245390, 0.456944753770257510, 0.456989227952907810, 0.457033700993084990, 0.457078172890678370, 0.457122643645575870, -0.457167113257666790, 0.457211581726840290, 0.457256049052984450, 0.457300515235988530, 0.457344980275741280, 0.457389444172132010, 0.457433906925048710, 0.457478368534380620, -0.457522829000016620, 0.457567288321845960, 0.457611746499756670, 0.457656203533638060, 0.457700659423378900, 0.457745114168868480, 0.457789567769994910, 0.457834020226647380, -0.457878471538714800, 0.457922921706086510, 0.457967370728650460, 0.458011818606295970, 0.458056265338912360, 0.458100710926387660, 0.458145155368611220, 0.458189598665471880, -0.458234040816858920, 0.458278481822660510, 0.458322921682765840, 0.458367360397063940, 0.458411797965443960, 0.458456234387794090, 0.458500669664003660, 0.458545103793961570, -0.458589536777557090, 0.458633968614678420, 0.458678399305214760, 0.458722828849055130, 0.458767257246088860, 0.458811684496204020, 0.458856110599289990, 0.458900535555235630, -0.458944959363930370, 0.458989382025262290, 0.459033803539120820, 0.459078223905395160, 0.459122643123973610, 0.459167061194745370, 0.459211478117599550, 0.459255893892425380, -0.459300308519111130, 0.459344721997546060, 0.459389134327619240, 0.459433545509219940, 0.459477955542236360, 0.459522364426557920, 0.459566772162073590, 0.459611178748672690, -0.459655584186243470, 0.459699988474675300, 0.459744391613857160, 0.459788793603678410, 0.459833194444027260, 0.459877594134793180, 0.459921992675865480, 0.459966390067132410, -0.460010786308483350, 0.460055181399807330, 0.460099575340993770, 0.460143968131930870, 0.460188359772508050, 0.460232750262614340, 0.460277139602139120, 0.460321527790970690, -0.460365914828998410, 0.460410300716111330, 0.460454685452198920, 0.460499069037149430, 0.460543451470852240, 0.460587832753196420, 0.460632212884071410, 0.460676591863365460, -0.460720969690968040, 0.460765346366768640, 0.460809721890655390, 0.460854096262517890, 0.460898469482245170, 0.460942841549726650, 0.460987212464850580, 0.461031582227506560, -0.461075950837583510, 0.461120318294971020, 0.461164684599557340, 0.461209049751231950, 0.461253413749883930, 0.461297776595402780, 0.461342138287676780, 0.461386498826595440, -0.461430858212047880, 0.461475216443923530, 0.461519573522110760, 0.461563929446499040, 0.461608284216977530, 0.461652637833435690, 0.461696990295761830, 0.461741341603845560, -0.461785691757576280, 0.461830040756842360, 0.461874388601533400, 0.461918735291538430, 0.461963080826747030, 0.462007425207047520, 0.462051768432329420, 0.462096110502481950, -0.462140451417394570, 0.462184791176955710, 0.462229129781054790, 0.462273467229581130, 0.462317803522424130, 0.462362138659472290, 0.462406472640615070, 0.462450805465741690, -0.462495137134741660, 0.462539467647503420, 0.462583797003916500, 0.462628125203870480, 0.462672452247253730, 0.462716778133955840, 0.462761102863866070, 0.462805426436873890, -0.462849748852867780, 0.462894070111737280, 0.462938390213371580, 0.462982709157660320, 0.463027026944491940, 0.463071343573755900, 0.463115659045341580, 0.463159973359138500, -0.463204286515035040, 0.463248598512920880, 0.463292909352685240, 0.463337219034217760, 0.463381527557406800, 0.463425834922142010, 0.463470141128313030, 0.463514446175808340, -0.463558750064517470, 0.463603052794329780, 0.463647354365134820, 0.463691654776821120, 0.463735954029278250, 0.463780252122395490, 0.463824549056062520, 0.463868844830167770, -0.463913139444600890, 0.463957432899251180, 0.464001725194008290, 0.464046016328760690, 0.464090306303398040, 0.464134595117809630, 0.464178882771885130, 0.464223169265512990, -0.464267454598582980, 0.464311738770984690, 0.464356021782606710, 0.464400303633338620, 0.464444584323069790, 0.464488863851689910, 0.464533142219087480, 0.464577419425152180, -0.464621695469773330, 0.464665970352840630, 0.464710244074242610, 0.464754516633869020, 0.464798788031609070, 0.464843058267352620, 0.464887327340988090, 0.464931595252405240, -0.464975862001493380, 0.465020127588142260, 0.465064392012240480, 0.465108655273677670, 0.465152917372343270, 0.465197178308126960, 0.465241438080917280, 0.465285696690603990, -0.465329954137076900, 0.465374210420224530, 0.465418465539936600, 0.465462719496102520, 0.465506972288612040, 0.465551223917353760, 0.465595474382217380, 0.465639723683092310, -0.465683971819868370, 0.465728218792434090, 0.465772464600679230, 0.465816709244493250, 0.465860952723765880, 0.465905195038385730, 0.465949436188242580, 0.465993676173225850, -0.466037914993225330, 0.466082152648129630, 0.466126389137828560, 0.466170624462211860, 0.466214858621168240, 0.466259091614587510, 0.466303323442358970, 0.466347554104372560, -0.466391783600516860, 0.466436011930681740, 0.466480239094756550, 0.466524465092631180, 0.466568689924194260, 0.466612913589335600, 0.466657136087944620, 0.466701357419911260, -0.466745577585124080, 0.466789796583472970, 0.466834014414847340, 0.466878231079137060, 0.466922446576230830, 0.466966660906018520, 0.467010874068389930, 0.467055086063233700, -0.467099296890439830, 0.467143506549897670, 0.467187715041497200, 0.467231922365127010, 0.467276128520677010, 0.467320333508036700, 0.467364537327095930, 0.467408739977743400, -0.467452941459869100, 0.467497141773362380, 0.467541340918113220, 0.467585538894010330, 0.467629735700943570, 0.467673931338802470, 0.467718125807476960, 0.467762319106855730, -0.467806511236828700, 0.467850702197285420, 0.467894891988115740, 0.467939080609208410, 0.467983268060453430, 0.468027454341740650, 0.468071639452958880, 0.468115823393997990, -0.468160006164747510, 0.468204187765097420, 0.468248368194936480, 0.468292547454154660, 0.468336725542641390, 0.468380902460286740, 0.468425078206979480, 0.468469252782609480, -0.468513426187066370, 0.468557598420240030, 0.468601769482019370, 0.468645939372294260, 0.468690108090954290, 0.468734275637889440, 0.468778442012988570, 0.468822607216141550, -0.468866771247238360, 0.468910934106167910, 0.468955095792820130, 0.468999256307084560, 0.469043415648851270, 0.469087573818009030, 0.469131730814447920, 0.469175886638057430, -0.469220041288727630, 0.469264194766347340, 0.469308347070806540, 0.469352498201994870, 0.469396648159802370, 0.469440796944117830, 0.469484944554831360, 0.469529090991832490, -0.469573236255011240, 0.469617380344256540, 0.469661523259458420, 0.469705665000506870, 0.469749805567290730, 0.469793944959700120, 0.469838083177624650, 0.469882220220954330, -0.469926356089578110, 0.469970490783385930, 0.470014624302267590, 0.470058756646113070, 0.470102887814811240, 0.470147017808252190, 0.470191146626325660, 0.470235274268921590, -0.470279400735928940, 0.470323526027237810, 0.470367650142737900, 0.470411773082319180, 0.470455894845870690, 0.470500015433282460, 0.470544134844444570, 0.470588253079245960, -0.470632370137576690, 0.470676486019326550, 0.470720600724385540, 0.470764714252642660, 0.470808826603987980, 0.470852937778311220, 0.470897047775502560, 0.470941156595450830, -0.470985264238046260, 0.471029370703178460, 0.471073475990737680, 0.471117580100612830, 0.471161683032694010, 0.471205784786870970, 0.471249885363033860, 0.471293984761071650, -0.471338082980874480, 0.471382180022332120, 0.471426275885334700, 0.471470370569771200, 0.471514464075531770, 0.471558556402506550, 0.471602647550584560, 0.471646737519655910, -0.471690826309610460, 0.471734913920338340, 0.471779000351728540, 0.471823085603671260, 0.471867169676056240, 0.471911252568773700, 0.471955334281712600, 0.471999414814763210, -0.472043494167815270, 0.472087572340758990, 0.472131649333483390, 0.472175725145878630, 0.472219799777834570, 0.472263873229241460, 0.472307945499988220, 0.472352016589965120, -0.472396086499062400, 0.472440155227169030, 0.472484222774175290, 0.472528289139971030, 0.472572354324446390, 0.472616418327490460, 0.472660481148993510, 0.472704542788845380, -0.472748603246936290, 0.472792662523155270, 0.472836720617392570, 0.472880777529538110, 0.472924833259482090, 0.472968887807113600, 0.473012941172322900, 0.473056993354999840, -0.473101044355034640, 0.473145094172316480, 0.473189142806735570, 0.473233190258182220, 0.473277236526545520, 0.473321281611715660, 0.473365325513582680, 0.473409368232036720, -0.473453409766966930, 0.473497450118263660, 0.473541489285816740, 0.473585527269516530, 0.473629564069252050, 0.473673599684913740, 0.473717634116391340, 0.473761667363575280, -0.473805699426354700, 0.473849730304619850, 0.473893759998260670, 0.473937788507167450, 0.473981815831229390, 0.474025841970336810, 0.474069866924379580, 0.474113890693248110, -0.474157913276831540, 0.474201934675020140, 0.474245954887704320, 0.474289973914773230, 0.474333991756117180, 0.474378008411626200, 0.474422023881190540, 0.474466038164699460, -0.474510051262043260, 0.474554063173111940, 0.474598073897795850, 0.474642083435984190, 0.474686091787567320, 0.474730098952435230, 0.474774104930478280, 0.474818109721585670, -0.474862113325647820, 0.474906115742554650, 0.474950116972196580, 0.474994117014462810, 0.475038115869243830, 0.475082113536429870, 0.475126110015910260, 0.475170105307575360, -0.475214099411315210, 0.475258092327020210, 0.475302084054579580, 0.475346074593883780, 0.475390063944822750, 0.475434052107286950, 0.475478039081165650, 0.475522024866349200, -0.475566009462727760, 0.475609992870191680, 0.475653975088630170, 0.475697956117933750, 0.475741935957992470, 0.475785914608696680, 0.475829892069935760, 0.475873868341600110, -0.475917843423580180, 0.475961817315765260, 0.476005790018045770, 0.476049761530311810, 0.476093731852453850, 0.476137700984361150, 0.476181668925924170, 0.476225635677033080, -0.476269601237578280, 0.476313565607449090, 0.476357528786535980, 0.476401490774728990, 0.476445451571918750, 0.476489411177994430, 0.476533369592846650, 0.476577326816365390, -0.476621282848441190, 0.476665237688963410, 0.476709191337822580, 0.476753143794909070, 0.476797095060112420, 0.476841045133322980, 0.476884994014430910, 0.476928941703326780, -0.476972888199899860, 0.477016833504040780, 0.477060777615639590, 0.477104720534586800, 0.477148662260771850, 0.477192602794085260, 0.477236542134417190, 0.477280480281658090, -0.477324417235697460, 0.477368352996425770, 0.477412287563733160, 0.477456220937510280, 0.477500153117646430, 0.477544084104032150, 0.477588013896557750, 0.477631942495113650, -0.477675869899589320, 0.477719796109875310, 0.477763721125862180, 0.477807644947439380, 0.477851567574497430, 0.477895489006926630, 0.477939409244617470, 0.477983328287459370, -0.478027246135342980, 0.478071162788158480, 0.478115078245796410, 0.478158992508146310, 0.478202905575098700, 0.478246817446543850, 0.478290728122372330, 0.478334637602473630, -0.478378545886738280, 0.478422452975056590, 0.478466358867319200, 0.478510263563415470, 0.478554167063236110, 0.478598069366671710, 0.478641970473611730, 0.478685870383946830, -0.478729769097567260, 0.478773666614363710, 0.478817562934225560, 0.478861458057043500, 0.478905351982707780, 0.478949244711109060, 0.478993136242136910, 0.479037026575681870, -0.479080915711634250, 0.479124803649884750, 0.479168690390322840, 0.479212575932839220, 0.479256460277324160, 0.479300343423668340, 0.479344225371761250, 0.479388106121493630, -0.479431985672756130, 0.479475864025438240, 0.479519741179430690, 0.479563617134623810, 0.479607491890908290, 0.479651365448173660, 0.479695237806310570, 0.479739108965209440, -0.479782978924760910, 0.479826847684854510, 0.479870715245381000, 0.479914581606230740, 0.479958446767294380, 0.480002310728461560, 0.480046173489622920, 0.480090035050668830, -0.480133895411490100, 0.480177754571976200, 0.480221612532017890, 0.480265469291505600, 0.480309324850330010, 0.480353179208380720, 0.480397032365548480, 0.480440884321724050, -0.480484735076797010, 0.480528584630658120, 0.480572432983197790, 0.480616280134306790, 0.480660126083874650, 0.480703970831792230, 0.480747814377949890, 0.480791656722238390, -0.480835497864547380, 0.480879337804767600, 0.480923176542789490, 0.480967014078503790, 0.481010850411800190, 0.481054685542569470, 0.481098519470702040, 0.481142352196088700, -0.481186183718619100, 0.481230014038184000, 0.481273843154674310, 0.481317671067979570, 0.481361497777990700, 0.481405323284598060, 0.481449147587692470, 0.481492970687163680, -0.481536792582902440, 0.481580613274799230, 0.481624432762744860, 0.481668251046629030, 0.481712068126342540, 0.481755884001775940, 0.481799698672819960, 0.481843512139364380, -0.481887324401300000, 0.481931135458517290, 0.481974945310907180, 0.482018753958359300, 0.482062561400764530, 0.482106367638013730, 0.482150172669996660, 0.482193976496604120, -0.482237779117726690, 0.482281580533255150, 0.482325380743079290, 0.482369179747089980, 0.482412977545177760, 0.482456774137233420, 0.482500569523146790, 0.482544363702808730, -0.482588156676109710, 0.482631948442940770, 0.482675739003191550, 0.482719528356752970, 0.482763316503515560, 0.482807103443370240, 0.482850889176206780, 0.482894673701916130, -0.482938457020389120, 0.482982239131515670, 0.483026020035186520, 0.483069799731292380, 0.483113578219724120, 0.483157355500371530, 0.483201131573125550, 0.483244906437876760, -0.483288680094516090, 0.483332452542933280, 0.483376223783019370, 0.483419993814664940, 0.483463762637760860, 0.483507530252197000, 0.483551296657864340, 0.483595061854653400, -0.483638825842455210, 0.483682588621159590, 0.483726350190657460, 0.483770110550839460, 0.483813869701596620, 0.483857627642818640, 0.483901384374396670, 0.483945139896221570, -0.483988894208183250, 0.484032647310172700, 0.484076399202080510, 0.484120149883797760, 0.484163899355214200, 0.484207647616220930, 0.484251394666708520, 0.484295140506568020, -0.484338885135689230, 0.484382628553963300, 0.484426370761280760, 0.484470111757532680, 0.484513851542608950, 0.484557590116400590, 0.484601327478798250, 0.484645063629693010, -0.484688798568974680, 0.484732532296534350, 0.484776264812263100, 0.484819996116050810, 0.484863726207788500, 0.484907455087366880, 0.484951182754677020, 0.484994909209608800, -0.485038634452053310, 0.485082358481901290, 0.485126081299043720, 0.485169802903370530, 0.485213523294772850, 0.485257242473141390, 0.485300960438367180, 0.485344677190340190, -0.485388392728951510, 0.485432107054091900, 0.485475820165652330, 0.485519532063522830, 0.485563242747594550, 0.485606952217758510, 0.485650660473904710, 0.485694367515924260, -0.485738073343707940, 0.485781777957146780, 0.485825481356130790, 0.485869183540551090, 0.485912884510298460, 0.485956584265263950, 0.486000282805337640, 0.486043980130410610, -0.486087676240373630, 0.486131371135117840, 0.486175064814533260, 0.486218757278510990, 0.486262448526941840, 0.486306138559716940, 0.486349827376726330, 0.486393514977861150, -0.486437201363012160, 0.486480886532070560, 0.486524570484926370, 0.486568253221470740, 0.486611934741594860, 0.486655615045188780, 0.486699294132143630, 0.486742972002350280, -0.486786648655699870, 0.486830324092082490, 0.486873998311389280, 0.486917671313511050, 0.486961343098339050, 0.487005013665763260, 0.487048683015675000, 0.487092351147965010, -0.487136018062524490, 0.487179683759243590, 0.487223348238013440, 0.487267011498724980, 0.487310673541269330, 0.487354334365536600, 0.487397993971418090, 0.487441652358804930, -0.487485309527587280, 0.487528965477656340, 0.487572620208902960, 0.487616273721218460, 0.487659926014492870, 0.487703577088617500, 0.487747226943483160, 0.487790875578981150, -0.487834522995001520, 0.487878169191435620, 0.487921814168174320, 0.487965457925108810, 0.488009100462129310, 0.488052741779127050, 0.488096381875992970, 0.488140020752618310, -0.488183658408893160, 0.488227294844708890, 0.488270930059956810, 0.488314564054526950, 0.488358196828310720, 0.488401828381199000, 0.488445458713083090, 0.488489087823853140, -0.488532715713400510, 0.488576342381616070, 0.488619967828391120, 0.488663592053615870, 0.488707215057181680, 0.488750836838979460, 0.488794457398900480, 0.488838076736835050, -0.488881694852674350, 0.488925311746309430, 0.488968927417631650, 0.489012541866531150, 0.489056155092899290, 0.489099767096627390, 0.489143377877605760, 0.489186987435725640, -0.489230595770878070, 0.489274202882954420, 0.489317808771844830, 0.489361413437440720, 0.489405016879633110, 0.489448619098313330, 0.489492220093371620, 0.489535819864699350, -0.489579418412187550, 0.489623015735727530, 0.489666611835209650, 0.489710206710525230, 0.489753800361565240, 0.489797392788221210, 0.489840983990383280, 0.489884573967942880, -0.489928162720791040, 0.489971750248819230, 0.490015336551917590, 0.490058921629977660, 0.490102505482890800, 0.490146088110547270, 0.490189669512838540, 0.490233249689655650, -0.490276828640890010, 0.490320406366431930, 0.490363982866172780, 0.490407558140003700, 0.490451132187816110, 0.490494705009500320, 0.490538276604947750, 0.490581846974049500, -0.490625416116697020, 0.490668984032780590, 0.490712550722191720, 0.490756116184821510, 0.490799680420561320, 0.490843243429301580, 0.490886805210933750, 0.490930365765349260, -0.490973925092438530, 0.491017483192092930, 0.491061040064203650, 0.491104595708662110, 0.491148150125358730, 0.491191703314184990, 0.491235255275031980, 0.491278806007791170, -0.491322355512353040, 0.491365903788608950, 0.491409450836450160, 0.491452996655768080, 0.491496541246453140, 0.491540084608396880, 0.491583626741490360, 0.491627167645625200, -0.491670707320691740, 0.491714245766581460, 0.491757782983185950, 0.491801318970395640, 0.491844853728102050, 0.491888387256196270, 0.491931919554569940, 0.491975450623113430, -0.492018980461718270, 0.492062509070275660, 0.492106036448677180, 0.492149562596813190, 0.492193087514575360, 0.492236611201854750, 0.492280133658543060, 0.492323654884530560, -0.492367174879708990, 0.492410693643969500, 0.492454211177203620, 0.492497727479301820, 0.492541242550155740, 0.492584756389656540, 0.492628268997695800, 0.492671780374164040, -0.492715290518952800, 0.492758799431953720, 0.492802307113057280, 0.492845813562155070, 0.492889318779138330, 0.492932822763898660, 0.492976325516326590, 0.493019827036313640, -0.493063327323751190, 0.493106826378530760, 0.493150324200542890, 0.493193820789679220, 0.493237316145831000, 0.493280810268889870, 0.493324303158746310, 0.493367794815292030, -0.493411285238418260, 0.493454774428016610, 0.493498262383977700, 0.493541749106193080, 0.493585234594554500, 0.493628718848952490, 0.493672201869278630, 0.493715683655424290, -0.493759164207281110, 0.493802643524739630, 0.493846121607691530, 0.493889598456028140, 0.493933074069641150, 0.493976548448421090, 0.494020021592259660, 0.494063493501048170, -0.494106964174678360, 0.494150433613040730, 0.494193901816027010, 0.494237368783528530, 0.494280834515437030, 0.494324299011643040, 0.494367762272038320, 0.494411224296514570, -0.494454685084962380, 0.494498144637273480, 0.494541602953339210, 0.494585060033051300, 0.494628515876300410, 0.494671970482978170, 0.494715423852976070, 0.494758875986185730, -0.494802326882497870, 0.494845776541804170, 0.494889224963996010, 0.494932672148965190, 0.494976118096602300, 0.495019562806799100, 0.495063006279447050, 0.495106448514437800, -0.495149889511662060, 0.495193329271011620, 0.495236767792378240, 0.495280205075652570, 0.495323641120726350, 0.495367075927491070, 0.495410509495838420, 0.495453941825659160, -0.495497372916845040, 0.495540802769287470, 0.495584231382878330, 0.495627658757508190, 0.495671084893068880, 0.495714509789451860, 0.495757933446549000, 0.495801355864250890, -0.495844777042449390, 0.495888196981035980, 0.495931615679902400, 0.495975033138939430, 0.496018449358038900, 0.496061864337092210, 0.496105278075991250, 0.496148690574626740, -0.496192101832890480, 0.496235511850674380, 0.496278920627869100, 0.496322328164366500, 0.496365734460058050, 0.496409139514835730, 0.496452543328590120, 0.496495945901213150, -0.496539347232596350, 0.496582747322631520, 0.496626146171209480, 0.496669543778222090, 0.496712940143560770, 0.496756335267117540, 0.496799729148783060, 0.496843121788449300, -0.496886513186007680, 0.496929903341350230, 0.496973292254367590, 0.497016679924951690, 0.497060066352994550, 0.497103451538386810, 0.497146835481020450, 0.497190218180787010, -0.497233599637578410, 0.497276979851285380, 0.497320358821799920, 0.497363736549013610, 0.497407113032818320, 0.497450488273104840, 0.497493862269765160, 0.497537235022690870, -0.497580606531773830, 0.497623976796904840, 0.497667345817976000, 0.497710713594878730, 0.497754080127505110, 0.497797445415745890, 0.497840809459493050, 0.497884172258638570, -0.497927533813073250, 0.497970894122689130, 0.498014253187377740, 0.498057611007031160, 0.498100967581540100, 0.498144322910796690, 0.498187676994692410, 0.498231029833119340, -0.498274381425968360, 0.498317731773131380, 0.498361080874500100, 0.498404428729966430, 0.498447775339421360, 0.498491120702756860, 0.498534464819864580, 0.498577807690636480, -0.498621149314963490, 0.498664489692737580, 0.498707828823850510, 0.498751166708194250, 0.498794503345659670, 0.498837838736138790, 0.498881172879523770, 0.498924505775705410, -0.498967837424575730, 0.499011167826026560, 0.499054496979949800, 0.499097824886236390, 0.499141151544778450, 0.499184476955467640, 0.499227801118195980, 0.499271124032854450, -0.499314445699335140, 0.499357766117529690, 0.499401085287330240, 0.499444403208627650, 0.499487719881314070, 0.499531035305281200, 0.499574349480421120, 0.499617662406624750, -0.499660974083784290, 0.499704284511791720, 0.499747593690538060, 0.499790901619915460, 0.499834208299815560, 0.499877513730130560, 0.499920817910751380, 0.499964120841570160, -0.500007422522478650, 0.500050722953368940, 0.500094022134132010, 0.500137320064660050, 0.500180616744844820, 0.500223912174578400, 0.500267206353751880, 0.500310499282257240, -0.500353790959986440, 0.500397081386831480, 0.500440370562683420, 0.500483658487434480, 0.500526945160976840, 0.500570230583201380, 0.500613514754000400, 0.500656797673265540, -0.500700079340889110, 0.500743359756762100, 0.500786638920776680, 0.500829916832824740, 0.500873193492798350, 0.500916468900588500, 0.500959743056087590, 0.501003015959187280, -0.501046287609779870, 0.501089558007756230, 0.501132827153008780, 0.501176095045429260, 0.501219361684909880, 0.501262627071341730, 0.501305891204616990, 0.501349154084627550, -0.501392415711265580, 0.501435676084422190, 0.501478935203989560, 0.501522193069860120, 0.501565449681924620, 0.501608705040075710, 0.501651959144204910, 0.501695211994204530, -0.501738463589965880, 0.501781713931380930, 0.501824963018341790, 0.501868210850740630, 0.501911457428468540, 0.501954702751417850, 0.501997946819480400, 0.502041189632548400, -0.502084431190513050, 0.502127671493266650, 0.502170910540701070, 0.502214148332708610, 0.502257384869180370, 0.502300620150008650, 0.502343854175085760, 0.502387086944302900, -0.502430318457552370, 0.502473548714725940, 0.502516777715716010, 0.502560005460413910, 0.502603231948711590, 0.502646457180501380, 0.502689681155675250, 0.502732903874124610, -0.502776125335741670, 0.502819345540418520, 0.502862564488047340, 0.502905782178519330, 0.502948998611726930, 0.502992213787561980, 0.503035427705916800, 0.503078640366682820, -0.503121851769752100, 0.503165061915017200, 0.503208270802369300, 0.503251478431700710, 0.503294684802903400, 0.503337889915869810, 0.503381093770491010, 0.503424296366659530, -0.503467497704267350, 0.503510697783206780, 0.503553896603369020, 0.503597094164646600, 0.503640290466931480, 0.503683485510115880, 0.503726679294091320, 0.503769871818749990, -0.503813063083983990, 0.503856253089685730, 0.503899441835746420, 0.503942629322058580, 0.503985815548514520, 0.504029000515005430, 0.504072184221423970, 0.504115366667661990, -0.504158547853612030, 0.504201727779165280, 0.504244906444214160, 0.504288083848650870, 0.504331259992367720, 0.504374434875256020, 0.504417608497208180, 0.504460780858116410, -0.504503951957873010, 0.504547121796369400, 0.504590290373498010, 0.504633457689150800, 0.504676623743220420, 0.504719788535598070, 0.504762952066176160, 0.504806114334847010, -0.504849275341502810, 0.504892435086035210, 0.504935593568336390, 0.504978750788299010, 0.505021906745814380, 0.505065061440775010, 0.505108214873072890, 0.505151367042600660, -0.505194517949249630, 0.505237667592912330, 0.505280815973480960, 0.505323963090847820, 0.505367108944904330, 0.505410253535543140, 0.505453396862656330, 0.505496538926136440, -0.505539679725874770, 0.505582819261763850, 0.505625957533695990, 0.505669094541563500, 0.505712230285258020, 0.505755364764671870, 0.505798497979697670, 0.505841629930226970, -0.505884760616152060, 0.505927890037365380, 0.505971018193759230, 0.506014145085225240, 0.506057270711655850, 0.506100395072943240, 0.506143518168980070, 0.506186639999657740, -0.506229760564868790, 0.506272879864505530, 0.506315997898460380, 0.506359114666624750, 0.506402230168891410, 0.506445344405152540, 0.506488457375300680, 0.506531569079227250, -0.506574679516825000, 0.506617788687986350, 0.506660896592602830, 0.506704003230567080, 0.506747108601771300, 0.506790212706108250, 0.506833315543469110, 0.506876417113746870, -0.506919517416833500, 0.506962616452621640, 0.507005714221002930, 0.507048810721869910, 0.507091905955114890, 0.507134999920630490, 0.507178092618308260, 0.507221184048040730, -0.507264274209720200, 0.507307363103239430, 0.507350450728489830, 0.507393537085364170, 0.507436622173754630, 0.507479705993553960, 0.507522788544653600, 0.507565869826946180, -0.507608949840324560, 0.507652028584680170, 0.507695106059905750, 0.507738182265893510, 0.507781257202536310, 0.507824330869725450, 0.507867403267353800, 0.507910474395313670, -0.507953544253497700, 0.507996612841797530, 0.508039680160105810, 0.508082746208314840, 0.508125810986317480, 0.508168874494005160, 0.508211936731270630, 0.508254997698006310, -0.508298057394104830, 0.508341115819457840, 0.508384172973957990, 0.508427228857498250, 0.508470283469969920, 0.508513336811265980, 0.508556388881278630, 0.508599439679900730, -0.508642489207023820, 0.508685537462540640, 0.508728584446343720, 0.508771630158325720, 0.508814674598378150, 0.508857717766393990, 0.508900759662265450, 0.508943800285885480, -0.508986839637145640, 0.509029877715938660, 0.509072914522156970, 0.509115950055693430, 0.509158984316439580, 0.509202017304288270, 0.509245049019132260, 0.509288079460863300, -0.509331108629374140, 0.509374136524557210, 0.509417163146305360, 0.509460188494510140, 0.509503212569064500, 0.509546235369860880, 0.509589256896791910, 0.509632277149749570, -0.509675296128626500, 0.509718313833315120, 0.509761330263708400, 0.509804345419697880, 0.509847359301176640, 0.509890371908036880, 0.509933383240171570, 0.509976393297472460, -0.510019402079832430, 0.510062409587144220, 0.510105415819299580, 0.510148420776191490, 0.510191424457712260, 0.510234426863754860, 0.510277427994211050, 0.510320427848973580, -0.510363426427935200, 0.510406423730988550, 0.510449419758025380, 0.510492414508938790, 0.510535407983621070, 0.510578400181965210, 0.510621391103863060, 0.510664380749207390, -0.510707369117890720, 0.510750356209806020, 0.510793342024845170, 0.510836326562900790, 0.510879309823865760, 0.510922291807632710, 0.510965272514093630, 0.511008251943141260, -0.511051230094668680, 0.511094206968567780, 0.511137182564731170, 0.511180156883051740, 0.511223129923422230, 0.511266101685734500, 0.511309072169881640, 0.511352041375755960, -0.511395009303250660, 0.511437975952257370, 0.511480941322669190, 0.511523905414378640, 0.511566868227278700, 0.511609829761261240, 0.511652790016219220, 0.511695748992045170, -0.511738706688632080, 0.511781663105871920, 0.511824618243657660, 0.511867572101882160, 0.511910524680437300, 0.511953475979216250, 0.511996425998111460, 0.512039374737016000, -0.512082322195821620, 0.512125268374421520, 0.512168213272708230, 0.512211156890574840, 0.512254099227913100, 0.512297040284616200, 0.512339980060576570, 0.512382918555687520, -0.512425855769840680, 0.512468791702929250, 0.512511726354845880, 0.512554659725483530, 0.512597591814734080, 0.512640522622490710, 0.512683452148646520, 0.512726380393093150, -0.512769307355723900, 0.512812233036431420, 0.512855157435108680, 0.512898080551647760, 0.512941002385941540, 0.512983922937882860, 0.513026842207364720, 0.513069760194279080, -0.513112676898519030, 0.513155592319977320, 0.513198506458547030, 0.513241419314120150, 0.513284330886589650, 0.513327241175848270, 0.513370150181789220, 0.513413057904304470, -0.513455964343287000, 0.513498869498629660, 0.513541773370225550, 0.513584675957966530, 0.513627577261745900, 0.513670477281456650, 0.513713376016990850, 0.513756273468241710, -0.513799169635101750, 0.513842064517464280, 0.513884958115221280, 0.513927850428265940, 0.513970741456490910, 0.514013631199789380, 0.514056519658053430, 0.514099406831176160, -0.514142292719050430, 0.514185177321569320, 0.514228060638624920, 0.514270942670110310, 0.514313823415918360, 0.514356702875942260, 0.514399581050074000, 0.514442457938206750, -0.514485333540233740, 0.514528207856047140, 0.514571080885539820, 0.514613952628604990, 0.514656823085135610, 0.514699692255023660, 0.514742560138162660, 0.514785426734445160, -0.514828292043764460, 0.514871156066012640, 0.514914018801083010, 0.514956880248868320, 0.514999740409261770, 0.515042599282155460, 0.515085456867442780, 0.515128313165016280, -0.515171168174769490, 0.515214021896594380, 0.515256874330384250, 0.515299725476032310, 0.515342575333430640, 0.515385423902472550, 0.515428271183050900, 0.515471117175058890, -0.515513961878388720, 0.515556805292933680, 0.515599647418586660, 0.515642488255240950, 0.515685327802788530, 0.515728166061122820, 0.515771003030136680, 0.515813838709723420, -0.515856673099775230, 0.515899506200185320, 0.515942338010846660, 0.515985168531652550, 0.516027997762495080, 0.516070825703267680, 0.516113652353863530, 0.516156477714174940, -0.516199301784095010, 0.516242124563517040, 0.516284946052333990, 0.516327766250438190, 0.516370585157723050, 0.516413402774081430, 0.516456219099406640, 0.516499034133591000, -0.516541847876527680, 0.516584660328109790, 0.516627471488230740, 0.516670281356782500, 0.516713089933658500, 0.516755897218751930, 0.516798703211955870, 0.516841507913162750, -0.516884311322265870, 0.516927113439158090, 0.516969914263733070, 0.517012713795882760, 0.517055512035500710, 0.517098308982480330, 0.517141104636713700, 0.517183898998094360, -0.517226692066515280, 0.517269483841869770, 0.517312274324050250, 0.517355063512950020, 0.517397851408462060, 0.517440638010480010, 0.517483423318895850, 0.517526207333603220, -0.517568990054494970, 0.517611771481464760, 0.517654551614404660, 0.517697330453208200, 0.517740107997768370, 0.517782884247978690, 0.517825659203731360, 0.517868432864920010, -0.517911205231437850, 0.517953976303177300, 0.517996746080031880, 0.518039514561894570, 0.518082281748658780, 0.518125047640217050, 0.518167812236462580, 0.518210575537288660, -0.518253337542588620, 0.518296098252254870, 0.518338857666180820, 0.518381615784259680, 0.518424372606384960, 0.518467128132448770, 0.518509882362344850, 0.518552635295966290, -0.518595386933206390, 0.518638137273957690, 0.518680886318113710, 0.518723634065567870, 0.518766380516212490, 0.518809125669941200, 0.518851869526647190, 0.518894612086223780, -0.518937353348563500, 0.518980093313559760, 0.519022831981105880, 0.519065569351095270, 0.519108305423420350, 0.519151040197974640, 0.519193773674651360, 0.519236505853344020, -0.519279236733945050, 0.519321966316347970, 0.519364694600445990, 0.519407421586132620, 0.519450147273300410, 0.519492871661842770, 0.519535594751652900, 0.519578316542624540, -0.519621037034649900, 0.519663756227622730, 0.519706474121436560, 0.519749190715983690, 0.519791906011157990, 0.519834620006852430, 0.519877332702960770, 0.519920044099375420, -0.519962754195989920, 0.520005462992697560, 0.520048170489391890, 0.520090876685965430, 0.520133581582311710, 0.520176285178324150, 0.520218987473896170, 0.520261688468920400, -0.520304388163290390, 0.520347086556899430, 0.520389783649641060, 0.520432479441407910, 0.520475173932093530, 0.520517867121591650, 0.520560559009794700, 0.520603249596596320, -0.520645938881889810, 0.520688626865568830, 0.520731313547526000, 0.520773998927654750, 0.520816683005848600, 0.520859365782001090, 0.520902047256004860, 0.520944727427753440, -0.520987406297140130, 0.521030083864058800, 0.521072760128401870, 0.521115435090062970, 0.521158108748935530, 0.521200781104913190, 0.521243452157888590, 0.521286121907755250, -0.521328790354407050, 0.521371457497736390, 0.521414123337637150, 0.521456787874002630, 0.521499451106726570, 0.521542113035701420, 0.521584773660821010, 0.521627432981978670, -0.521670090999068140, 0.521712747711981950, 0.521755403120613970, 0.521798057224857390, 0.521840710024606080, 0.521883361519752680, 0.521926011710190820, 0.521968660595813930, -0.522011308176515750, 0.522053954452188940, 0.522096599422727240, 0.522139243088024510, 0.522181885447973170, 0.522224526502467200, 0.522267166251399790, 0.522309804694665040, -0.522352441832155230, 0.522395077663764360, 0.522437712189385840, 0.522480345408913420, 0.522522977322239730, 0.522565607929258550, 0.522608237229863380, 0.522650865223947990, -0.522693491911405130, 0.522736117292128430, 0.522778741366011550, 0.522821364132948110, 0.522863985592830980, 0.522906605745553810, 0.522949224591010120, 0.522991842129093780, -0.523034458359697420, 0.523077073282714910, 0.523119686898040110, 0.523162299205565780, 0.523204910205185670, 0.523247519896793190, 0.523290128280282430, 0.523332735355545810, -0.523375341122477520, 0.523417945580970770, 0.523460548730919630, 0.523503150572216640, 0.523545751104755760, 0.523588350328430540, 0.523630948243134830, 0.523673544848761390, -0.523716140145204070, 0.523758734132356410, 0.523801326810112270, 0.523843918178364510, 0.523886508237006890, 0.523929096985933370, 0.523971684425036720, 0.524014270554210900, -0.524056855373349450, 0.524099438882346110, 0.524142021081093870, 0.524184601969486570, 0.524227181547417760, 0.524269759814781410, 0.524312336771470270, 0.524354912417378300, -0.524397486752398940, 0.524440059776426380, 0.524482631489353260, 0.524525201891073430, 0.524567770981480770, 0.524610338760469030, 0.524652905227930950, 0.524695470383760740, -0.524738034227852150, 0.524780596760098140, 0.524823157980392590, 0.524865717888629240, 0.524908276484701840, 0.524950833768503490, 0.524993389739928040, 0.525035944398869030, -0.525078497745220640, 0.525121049778875530, 0.525163600499727880, 0.525206149907671120, 0.525248698002599430, 0.525291244784405700, 0.525333790252983770, 0.525376334408227400, -0.525418877250030560, 0.525461418778286120, 0.525503958992888150, 0.525546497893730310, 0.525589035480706570, 0.525631571753709890, 0.525674106712634260, 0.525716640357373750, -0.525759172687821240, 0.525801703703870800, 0.525844233405416080, 0.525886761792351170, 0.525929288864569020, 0.525971814621963630, 0.526014339064428740, 0.526056862191858320, -0.526099384004145350, 0.526141904501184030, 0.526184423682867890, 0.526226941549091000, 0.526269458099746460, 0.526311973334728230, 0.526354487253930080, 0.526396999857246080, -0.526439511144569220, 0.526482021115793560, 0.526524529770813320, 0.526567037109521240, 0.526609543131811630, 0.526652047837578240, 0.526694551226715050, 0.526737053299115020, -0.526779554054672470, 0.526822053493280930, 0.526864551614834700, 0.526907048419226750, 0.526949543906351180, 0.526992038076101620, 0.527034530928372490, 0.527077022463056540, -0.527119512680048090, 0.527162001579240870, 0.527204489160529090, 0.527246975423805610, 0.527289460368964740, 0.527331943995900550, 0.527374426304506150, 0.527416907294675610, -0.527459386966302900, 0.527501865319282110, 0.527544342353506220, 0.527586818068869420, 0.527629292465265690, 0.527671765542589100, 0.527714237300732640, 0.527756707739590600, -0.527799176859056860, 0.527841644659025500, 0.527884111139389710, 0.527926576300043580, 0.527969040140881090, 0.528011502661796310, 0.528053963862682330, 0.528096423743433570, -0.528138882303944010, 0.528181339544106950, 0.528223795463816590, 0.528266250062966680, 0.528308703341451520, 0.528351155299164210, 0.528393605935999040, 0.528436055251849780, -0.528478503246610830, 0.528520949920175290, 0.528563395272437230, 0.528605839303290860, 0.528648282012630140, 0.528690723400348390, 0.528733163466339810, 0.528775602210498350, -0.528818039632718230, 0.528860475732892630, 0.528902910510915870, 0.528945343966681800, 0.528987776100084740, 0.529030206911017880, 0.529072636399375520, 0.529115064565051970, -0.529157491407940330, 0.529199916927935000, 0.529242341124929850, 0.529284763998819300, 0.529327185549496430, 0.529369605776855550, 0.529412024680790630, 0.529454442261196090, -0.529496858517965020, 0.529539273450991830, 0.529581687060170500, 0.529624099345395230, 0.529666510306559420, 0.529708919943557290, 0.529751328256282910, 0.529793735244630580, -0.529836140908493510, 0.529878545247766010, 0.529920948262342590, 0.529963349952116470, 0.530005750316981940, 0.530048149356833090, 0.530090547071564110, 0.530132943461068540, -0.530175338525240460, 0.530217732263974170, 0.530260124677163880, 0.530302515764702890, 0.530344905526485500, 0.530387293962406030, 0.530429681072358550, 0.530472066856236600, -0.530514451313934490, 0.530556834445346180, 0.530599216250366210, 0.530641596728887780, 0.530683975880805400, 0.530726353706013400, 0.530768730204405180, 0.530811105375875170, -0.530853479220317340, 0.530895851737626210, 0.530938222927695100, 0.530980592790418430, 0.531022961325690270, 0.531065328533405050, 0.531107694413456180, 0.531150058965737970, -0.531192422190144730, 0.531234784086570770, 0.531277144654909490, 0.531319503895055330, 0.531361861806902370, 0.531404218390345240, 0.531446573645277140, 0.531488927571592610, -0.531531280169185720, 0.531573631437951000, 0.531615981377781880, 0.531658329988572760, 0.531700677270218190, 0.531743023222611580, 0.531785367845647450, 0.531827711139219780, -0.531870053103223330, 0.531912393737551280, 0.531954733042098280, 0.531997071016758530, 0.532039407661426320, 0.532081742975995420, 0.532124076960360020, 0.532166409614414420, -0.532208740938053260, 0.532251070931169750, 0.532293399593658620, 0.532335726925413980, 0.532378052926330450, 0.532420377596301450, 0.532462700935221410, 0.532505022942984960, -0.532547343619485640, 0.532589662964617960, 0.532631980978276130, 0.532674297660354790, 0.532716613010747240, 0.532758927029348130, 0.532801239716051760, 0.532843551070752650, -0.532885861093344350, 0.532928169783721260, 0.532970477141777920, 0.533012783167408630, 0.533055087860507040, 0.533097391220967780, 0.533139693248684930, 0.533181993943553370, -0.533224293305466280, 0.533266591334318530, 0.533308888030004760, 0.533351183392418270, 0.533393477421453930, 0.533435770117005830, 0.533478061478968700, 0.533520351507236090, -0.533562640201702520, 0.533604927562262410, 0.533647213588810290, 0.533689498281239790, 0.533731781639445570, 0.533774063663321920, 0.533816344352763370, 0.533858623707663680, -0.533900901727917490, 0.533943178413418870, 0.533985453764062810, 0.534027727779742720, 0.534070000460353240, 0.534112271805789240, 0.534154541815944130, 0.534196810490712660, -0.534239077829989250, 0.534281343833668430, 0.534323608501643840, 0.534365871833810350, 0.534408133830062030, 0.534450394490293860, 0.534492653814399370, 0.534534911802273080, -0.534577168453809650, 0.534619423768903700, 0.534661677747448660, 0.534703930389339610, 0.534746181694470630, 0.534788431662736490, 0.534830680294031020, 0.534872927588248780, -0.534915173545284280, 0.534957418165032280, 0.534999661447386200, 0.535041903392241110, 0.535084143999491560, 0.535126383269031280, 0.535168621200755030, 0.535210857794557240, -0.535253093050332750, 0.535295326967975100, 0.535337559547379050, 0.535379790788439220, 0.535422020691050270, 0.535464249255105830, 0.535506476480500760, 0.535548702367129590, -0.535590926914886970, 0.535633150123666750, 0.535675371993363570, 0.535717592523871970, 0.535759811715086690, 0.535802029566901590, 0.535844246079211440, 0.535886461251911080, -0.535928675084894060, 0.535970887578055440, 0.536013098731289660, 0.536055308544491350, 0.536097517017554480, 0.536139724150373810, 0.536181929942843860, 0.536224134394859500, -0.536266337506314360, 0.536308539277103310, 0.536350739707120990, 0.536392938796262260, 0.536435136544420770, 0.536477332951491360, 0.536519528017368690, 0.536561721741947490, -0.536603914125121760, 0.536646105166786120, 0.536688294866835670, 0.536730483225164030, 0.536772670241666190, 0.536814855916236790, 0.536857040248770460, 0.536899223239161280, -0.536941404887304020, 0.536983585193093190, 0.537025764156423780, 0.537067941777189640, 0.537110118055285630, 0.537152292990606290, 0.537194466583046590, 0.537236638832500390, -0.537278809738862660, 0.537320979302027820, 0.537363147521890850, 0.537405314398345710, 0.537447479931287280, 0.537489644120610180, 0.537531806966209280, 0.537573968467978560, -0.537616128625812870, 0.537658287439607200, 0.537700444909255500, 0.537742601034652660, 0.537784755815693290, 0.537826909252272500, 0.537869061344283920, 0.537911212091622850, -0.537953361494183600, 0.537995509551861370, 0.538037656264550020, 0.538079801632144530, 0.538121945654539520, 0.538164088331630100, 0.538206229663310000, 0.538248369649474310, -0.538290508290017680, 0.538332645584835290, 0.538374781533820790, 0.538416916136869370, 0.538459049393876010, 0.538501181304734680, 0.538543311869340350, 0.538585441087587770, -0.538627568959372030, 0.538669695484586870, 0.538711820663127620, 0.538753944494888670, 0.538796066979765340, 0.538838188117651380, 0.538880307908442100, 0.538922426352031910, -0.538964543448316010, 0.539006659197188490, 0.539048773598544310, 0.539090886652278110, 0.539132998358285100, 0.539175108716459240, 0.539217217726695620, 0.539259325388889320, -0.539301431702934320, 0.539343536668725700, 0.539385640286158320, 0.539427742555127150, 0.539469843475526290, 0.539511943047250810, 0.539554041270195460, 0.539596138144255330, -0.539638233669324620, 0.539680327845298180, 0.539722420672070990, 0.539764512149538130, 0.539806602277593690, 0.539848691056132650, 0.539890778485049850, 0.539932864564240500, -0.539974949293598680, 0.540017032673019480, 0.540059114702397980, 0.540101195381628370, 0.540143274710605750, 0.540185352689225070, 0.540227429317381210, 0.540269504594968470, -0.540311578521882050, 0.540353651098016590, 0.540395722323267380, 0.540437792197528520, 0.540479860720695200, 0.540521927892662180, 0.540563993713324640, 0.540606058182576900, -0.540648121300313920, 0.540690183066430690, 0.540732243480822380, 0.540774302543382990, 0.540816360254007920, 0.540858416612591930, 0.540900471619030320, 0.540942525273217180, -0.540984577575047590, 0.541026628524417070, 0.541068678121219500, 0.541110726365350290, 0.541152773256704300, 0.541194818795176610, 0.541236862980661650, 0.541278905813054490, -0.541320947292250000, 0.541362987418143590, 0.541405026190629360, 0.541447063609602490, 0.541489099674957950, 0.541531134386591170, 0.541573167744396010, 0.541615199748267990, -0.541657230398101990, 0.541699259693793290, 0.541741287635236100, 0.541783314222325620, 0.541825339454957260, 0.541867363333025210, 0.541909385856424790, 0.541951407025050850, -0.541993426838798700, 0.542035445297562650, 0.542077462401238000, 0.542119478149719720, 0.542161492542903130, 0.542203505580682310, 0.542245517262952890, 0.542287527589609630, -0.542329536560547830, 0.542371544175661910, 0.542413550434847070, 0.542455555337998390, 0.542497558885011280, 0.542539561075779720, 0.542581561910199350, 0.542623561388165480, -0.542665559509572290, 0.542707556274315220, 0.542749551682289330, 0.542791545733389840, 0.542833538427511140, 0.542875529764548560, 0.542917519744397170, 0.542959508366952390, -0.543001495632108420, 0.543043481539760790, 0.543085466089804350, 0.543127449282134630, 0.543169431116645950, 0.543211411593233720, 0.543253390711792910, 0.543295368472219040, -0.543337344874406440, 0.543379319918250280, 0.543421293603645990, 0.543463265930488770, 0.543505236898673030, 0.543547206508094180, 0.543589174758647760, 0.543631141650227970, -0.543673107182730320, 0.543715071356049910, 0.543757034170082250, 0.543798995624721560, 0.543840955719863350, 0.543882914455402820, 0.543924871831235390, 0.543966827847255360, -0.544008782503358270, 0.544050735799439190, 0.544092687735393770, 0.544134638311116080, 0.544176587526501890, 0.544218535381446270, 0.544260481875844640, 0.544302427009591420, -0.544344370782582130, 0.544386313194712310, 0.544428254245876380, 0.544470193935969740, 0.544512132264887700, 0.544554069232525580, 0.544596004838778010, 0.544637939083540410, -0.544679871966707860, 0.544721803488176120, 0.544763733647839480, 0.544805662445593470, 0.544847589881333420, 0.544889515954954610, 0.544931440666351690, 0.544973364015420180, -0.545015286002055290, 0.545057206626152540, 0.545099125887606450, 0.545141043786312450, 0.545182960322166290, 0.545224875495062270, 0.545266789304896140, 0.545308701751562990, -0.545350612834958450, 0.545392522554977060, 0.545434430911514330, 0.545476337904465590, 0.545518243533726240, 0.545560147799191040, 0.545602050700755400, 0.545643952238314630, -0.545685852411764370, 0.545727751220999150, 0.545769648665914490, 0.545811544746405700, 0.545853439462368420, 0.545895332813697290, 0.545937224800287720, 0.545979115422035480, -0.546021004678835080, 0.546062892570582160, 0.546104779097172030, 0.546146664258500230, 0.546188548054461490, 0.546230430484951460, 0.546272311549865220, 0.546314191249098640, -0.546356069582546120, 0.546397946550103540, 0.546439822151666090, 0.546481696387129400, 0.546523569256388120, 0.546565440759337880, 0.546607310895874000, 0.546649179665892330, -0.546691047069287280, 0.546732913105954620, 0.546774777775789640, 0.546816641078688210, 0.546858503014544750, 0.546900363583255000, 0.546942222784714720, 0.546984080618818420, -0.547025937085462100, 0.547067792184540820, 0.547109645915950460, 0.547151498279585650, 0.547193349275342020, 0.547235198903115010, 0.547277047162800460, 0.547318894054292900, -0.547360739577488100, 0.547402583732281340, 0.547444426518568620, 0.547486267936244440, 0.547528107985204570, 0.547569946665344420, 0.547611783976559850, 0.547653619918745390, -0.547695454491796910, 0.547737287695610140, 0.547779119530079740, 0.547820949995101560, 0.547862779090571020, 0.547904606816383980, 0.547946433172434970, 0.547988258158619850, -0.548030081774834140, 0.548071904020973610, 0.548113724896932890, 0.548155544402607940, 0.548197362537894080, 0.548239179302687170, 0.548280994696881960, 0.548322808720374310, -0.548364621373059520, 0.548406432654833690, 0.548448242565591330, 0.548490051105228300, 0.548531858273640590, 0.548573664070722830, 0.548615468496370990, 0.548657271550480390, -0.548699073232947090, 0.548740873543665630, 0.548782672482531990, 0.548824470049441680, 0.548866266244290580, 0.548908061066973430, 0.548949854517386200, 0.548991646595424320, -0.549033437300983640, 0.549075226633959020, 0.549117014594246330, 0.549158801181741100, 0.549200586396339170, 0.549242370237935430, 0.549284152706425830, 0.549325933801705800, -0.549367713523671420, 0.549409491872217210, 0.549451268847239380, 0.549493044448633780, 0.549534818676295170, 0.549576591530119400, 0.549618363010002220, 0.549660133115839610, -0.549701901847526210, 0.549743669204957990, 0.549785435188030690, 0.549827199796640190, 0.549868963030681220, 0.549910724890049880, 0.549952485374641810, 0.549994244484352750, -0.550036002219077780, 0.550077758578712880, 0.550119513563153470, 0.550161267172295740, 0.550203019406034440, 0.550244770264265550, 0.550286519746885140, 0.550328267853788080, -0.550370014584870340, 0.550411759940027560, 0.550453503919155710, 0.550495246522149760, 0.550536987748905690, 0.550578727599319140, 0.550620466073286190, 0.550662203170701690, -0.550703938891461630, 0.550745673235461750, 0.550787406202598030, 0.550829137792765540, 0.550870868005860050, 0.550912596841777510, 0.550954324300413800, 0.550996050381663880, -0.551037775085423950, 0.551079498411589870, 0.551121220360056620, 0.551162940930720380, 0.551204660123476800, 0.551246377938221950, 0.551288094374850710, 0.551329809433259270, -0.551371523113343360, 0.551413235414998980, 0.551454946338121090, 0.551496655882605880, 0.551538364048348990, 0.551580070835246630, 0.551621776243193750, 0.551663480272086340, -0.551705182921820250, 0.551746884192291560, 0.551788584083395370, 0.551830282595027640, 0.551871979727084240, 0.551913675479461240, 0.551955369852053620, 0.551997062844757690, -0.552038754457469420, 0.552080444690083880, 0.552122133542497280, 0.552163821014605370, 0.552205507106304230, 0.552247191817488940, 0.552288875148055690, 0.552330557097900240, -0.552372237666918680, 0.552413916855006290, 0.552455594662059070, 0.552497271087972860, 0.552538946132643870, 0.552580619795967070, 0.552622292077838750, 0.552663962978154680, -0.552705632496811150, 0.552747300633703140, 0.552788967388726850, 0.552830632761778570, 0.552872296752753290, 0.552913959361547300, 0.552955620588056360, 0.552997280432176770, -0.553038938893803620, 0.553080595972833100, 0.553122251669161070, 0.553163905982683830, 0.553205558913296370, 0.553247210460895090, 0.553288860625375860, 0.553330509406634750, -0.553372156804566970, 0.553413802819068820, 0.553455447450036160, 0.553497090697365300, 0.553538732560951320, 0.553580373040690520, 0.553622012136479100, 0.553663649848212370, -0.553705286175786400, 0.553746921119097290, 0.553788554678041220, 0.553830186852513400, 0.553871817642410220, 0.553913447047627350, 0.553955075068061300, 0.553996701703607150, -0.554038326954161330, 0.554079950819619580, 0.554121573299878430, 0.554163194394832860, 0.554204814104379380, 0.554246432428413870, 0.554288049366832620, 0.554329664919530950, -0.554371279086405040, 0.554412891867351320, 0.554454503262264970, 0.554496113271042420, 0.554537721893579530, 0.554579329129772700, 0.554620934979517250, 0.554662539442709490, -0.554704142519245270, 0.554745744209021120, 0.554787344511932230, 0.554828943427874920, 0.554870540956745370, 0.554912137098439780, 0.554953731852853460, 0.554995325219882820, -0.555036917199423940, 0.555078507791373020, 0.555120096995625590, 0.555161684812077730, 0.555203271240625850, 0.555244856281166040, 0.555286439933593830, 0.555328022197805420, -0.555369603073697320, 0.555411182561164950, 0.555452760660104520, 0.555494337370412210, 0.555535912691984430, 0.555577486624716510, 0.555619059168504850, 0.555660630323245640, -0.555702200088835090, 0.555743768465168710, 0.555785335452142930, 0.555826901049653820, 0.555868465257597810, 0.555910028075870310, 0.555951589504367740, 0.555993149542986180, -0.556034708191622040, 0.556076265450170860, 0.556117821318528940, 0.556159375796592910, 0.556200928884257980, 0.556242480581420780, 0.556284030887977400, 0.556325579803824240, -0.556367127328856850, 0.556408673462971630, 0.556450218206064660, 0.556491761558032590, 0.556533303518770730, 0.556574844088175590, 0.556616383266143270, 0.556657921052570500, -0.556699457447352500, 0.556740992450385770, 0.556782526061566640, 0.556824058280791620, 0.556865589107956030, 0.556907118542956490, 0.556948646585689430, 0.556990173236050490, -0.557031698493936080, 0.557073222359242390, 0.557114744831866070, 0.557156265911702530, 0.557197785598648300, 0.557239303892599570, 0.557280820793452980, 0.557322336301103950, -0.557363850415449110, 0.557405363136384670, 0.557446874463807140, 0.557488384397612060, 0.557529892937696060, 0.557571400083955340, 0.557612905836286420, 0.557654410194584840, -0.557695913158747340, 0.557737414728670000, 0.557778914904249470, 0.557820413685381270, 0.557861911071962150, 0.557903407063888520, 0.557944901661056040, 0.557986394863361320, -0.558027886670700580, 0.558069377082970550, 0.558110866100066660, 0.558152353721885540, 0.558193839948323610, 0.558235324779277510, 0.558276808214642650, 0.558318290254315790, -0.558359770898193110, 0.558401250146171480, 0.558442727998146320, 0.558484204454014370, 0.558525679513671940, 0.558567153177015660, 0.558608625443941080, 0.558650096314344920, -0.558691565788123960, 0.558733033865173700, 0.558774500545390800, 0.558815965828671770, 0.558857429714913030, 0.558898892204010460, 0.558940353295860670, 0.558981812990359870, -0.559023271287405030, 0.559064728186891570, 0.559106183688716340, 0.559147637792775650, 0.559189090498966260, 0.559230541807183680, 0.559271991717324890, 0.559313440229285970, -0.559354887342963900, 0.559396333058254200, 0.559437777375053740, 0.559479220293259140, 0.559520661812766160, 0.559562101933471560, 0.559603540655271630, 0.559644977978063230, -0.559686413901742010, 0.559727848426204820, 0.559769281551347970, 0.559810713277068220, 0.559852143603261410, 0.559893572529824190, 0.559935000056653090, 0.559976426183644740, -0.560017850910695110, 0.560059274237700740, 0.560100696164558260, 0.560142116691164430, 0.560183535817414870, 0.560224953543206450, 0.560266369868436030, 0.560307784792999360, -0.560349198316793200, 0.560390610439714050, 0.560432021161658800, 0.560473430482523070, 0.560514838402203730, 0.560556244920597300, 0.560597650037600650, 0.560639053753109520, -0.560680456067020770, 0.560721856979230830, 0.560763256489636650, 0.560804654598134000, 0.560846051304619620, 0.560887446608990260, 0.560928840511142560, 0.560970233010972370, -0.561011624108376570, 0.561053013803251790, 0.561094402095494770, 0.561135788985001490, 0.561177174471668590, 0.561218558555393270, 0.561259941236071040, 0.561301322513599100, -0.561342702387873760, 0.561384080858791990, 0.561425457926249760, 0.561466833590143820, 0.561508207850370810, 0.561549580706827700, 0.561590952159410240, 0.561632322208015400, -0.561673690852539710, 0.561715058092880250, 0.561756423928932660, 0.561797788360594020, 0.561839151387760970, 0.561880513010330370, 0.561921873228198200, 0.561963232041261310, -0.562004589449416670, 0.562045945452560260, 0.562087300050588930, 0.562128653243399330, 0.562170005030888540, 0.562211355412952310, 0.562252704389487710, 0.562294051960391280, -0.562335398125560220, 0.562376742884890260, 0.562418086238278380, 0.562459428185621340, 0.562500768726816090, 0.562542107861758510, 0.562583445590345680, 0.562624781912474230, -0.562666116828041240, 0.562707450336942580, 0.562748782439075220, 0.562790113134336360, 0.562831442422621730, 0.562872770303828650, 0.562914096777853530, 0.562955421844593570, -0.562996745503944740, 0.563038067755804010, 0.563079388600068120, 0.563120708036634050, 0.563162026065397890, 0.563203342686256710, 0.563244657899107160, 0.563285971703846310, -0.563327284100370140, 0.563368595088575840, 0.563409904668359940, 0.563451212839619740, 0.563492519602251110, 0.563533824956151230, 0.563575128901216750, 0.563616431437344740, -0.563657732564431410, 0.563699032282373610, 0.563740330591068650, 0.563781627490412610, 0.563822922980302340, 0.563864217060634830, 0.563905509731307150, 0.563946800992215390, -0.563988090843256520, 0.564029379284327500, 0.564070666315325320, 0.564111951936146160, 0.564153236146687110, 0.564194518946845030, 0.564235800336516880, 0.564277080315598980, -0.564318358883988400, 0.564359636041581900, 0.564400911788276560, 0.564442186123968680, 0.564483459048555350, 0.564524730561933640, 0.564566000663999870, 0.564607269354651000, -0.564648536633784000, 0.564689802501295970, 0.564731066957083190, 0.564772330001042660, 0.564813591633071320, 0.564854851853066280, 0.564896110660923820, 0.564937368056541160, -0.564978624039815020, 0.565019878610642620, 0.565061131768920260, 0.565102383514545000, 0.565143633847413730, 0.565184882767423850, 0.565226130274471330, 0.565267376368453590, -0.565308621049267710, 0.565349864316809890, 0.565391106170977430, 0.565432346611667190, 0.565473585638776480, 0.565514823252201370, 0.565556059451839290, 0.565597294237586980, -0.565638527609341860, 0.565679759567000010, 0.565720990110458730, 0.565762219239615120, 0.565803446954366240, 0.565844673254608300, 0.565885898140238820, 0.565927121611154550, -0.565968343667252790, 0.566009564308429860, 0.566050783534582940, 0.566092001345609550, 0.566133217741405680, 0.566174432721868850, 0.566215646286895910, 0.566256858436384180, -0.566298069170229960, 0.566339278488330540, 0.566380486390583030, 0.566421692876884600, 0.566462897947131560, 0.566504101601221330, 0.566545303839050770, 0.566586504660517300, -0.566627704065517320, 0.566668902053947930, 0.566710098625706430, 0.566751293780690000, 0.566792487518794960, 0.566833679839918720, 0.566874870743958260, 0.566916060230810980, -0.566957248300373200, 0.566998434952542210, 0.567039620187215650, 0.567080804004289620, 0.567121986403661520, 0.567163167385228540, 0.567204346948887990, 0.567245525094536180, -0.567286701822070530, 0.567327877131388100, 0.567369051022386440, 0.567410223494961730, 0.567451394549011500, 0.567492564184432840, 0.567533732401123040, 0.567574899198978520, -0.567616064577896820, 0.567657228537774890, 0.567698391078510280, 0.567739552199999390, 0.567780711902139630, 0.567821870184828330, 0.567863027047962100, 0.567904182491438260, -0.567945336515154000, 0.567986489119006730, 0.568027640302892880, 0.568068790066709850, 0.568109938410354950, 0.568151085333725490, 0.568192230836717990, 0.568233374919229980, -0.568274517581158430, 0.568315658822401090, 0.568356798642854160, 0.568397937042415150, 0.568439074020981370, 0.568480209578450250, 0.568521343714718300, 0.568562476429682940, -0.568603607723241810, 0.568644737595291220, 0.568685866045728790, 0.568726993074451740, 0.568768118681357570, 0.568809242866342710, 0.568850365629304800, 0.568891486970140910, -0.568932606888748690, 0.568973725385024550, 0.569014842458866130, 0.569055958110170620, 0.569097072338835550, 0.569138185144757450, 0.569179296527833940, 0.569220406487962130, -0.569261515025039630, 0.569302622138963100, 0.569343727829629940, 0.569384832096937470, 0.569425934940783310, 0.569467036361063880, 0.569508136357676830, 0.569549234930519900, -0.569590332079489500, 0.569631427804483280, 0.569672522105398430, 0.569713614982132690, 0.569754706434582590, 0.569795796462645670, 0.569836885066219210, 0.569877972245200980, -0.569919057999487390, 0.569960142328976180, 0.570001225233564670, 0.570042306713150370, 0.570083386767630040, 0.570124465396901200, 0.570165542600861160, 0.570206618379407670, -0.570247692732437250, 0.570288765659847650, 0.570329837161536400, 0.570370907237400250, 0.570411975887336830, 0.570453043111243450, 0.570494108909017860, 0.570535173280556700, -0.570576236225757480, 0.570617297744517750, 0.570658357836735020, 0.570699416502306160, 0.570740473741128680, 0.570781529553100130, 0.570822583938118020, 0.570863636896079110, -0.570904688426881140, 0.570945738530421410, 0.570986787206597680, 0.571027834455306690, 0.571068880276446090, 0.571109924669913620, 0.571150967635605910, 0.571192009173420940, -0.571233049283255800, 0.571274087965008450, 0.571315125218575530, 0.571356161043854890, 0.571397195440743740, 0.571438228409139940, 0.571479259948940220, 0.571520290060042460, -0.571561318742343840, 0.571602345995742330, 0.571643371820134690, 0.571684396215418560, 0.571725419181491330, 0.571766440718251000, 0.571807460825594190, 0.571848479503418770, -0.571889496751622480, 0.571930512570102080, 0.571971526958755420, 0.572012539917479910, 0.572053551446173540, 0.572094561544732820, 0.572135570213055720, 0.572176577451039670, -0.572217583258582520, 0.572258587635581020, 0.572299590581933140, 0.572340592097536290, 0.572381592182288230, 0.572422590836085930, 0.572463588058827130, 0.572504583850409250, -0.572545578210730380, 0.572586571139687250, 0.572627562637177620, 0.572668552703099020, 0.572709541337349530, 0.572750528539825780, 0.572791514310425630, 0.572832498649047170, -0.572873481555587040, 0.572914463029943200, 0.572955443072013180, 0.572996421681694960, 0.573037398858885380, 0.573078374603482210, 0.573119348915383190, 0.573160321794486060, -0.573201293240687800, 0.573242263253886280, 0.573283231833979220, 0.573324198980864290, 0.573365164694438660, 0.573406128974599970, 0.573447091821245980, 0.573488053234274760, -0.573529013213582850, 0.573569971759068540, 0.573610928870629590, 0.573651884548163070, 0.573692838791566740, 0.573733791600738340, 0.573774742975575850, 0.573815692915976120, -0.573856641421837120, 0.573897588493056500, 0.573938534129532330, 0.573979478331161470, 0.574020421097841900, 0.574061362429471260, 0.574102302325947610, 0.574143240787167830, -0.574184177813029880, 0.574225113403431520, 0.574266047558270820, 0.574306980277444530, 0.574347911560850850, 0.574388841408387750, 0.574429769819952200, 0.574470696795442160, -0.574511622334755500, 0.574552546437790080, 0.574593469104442870, 0.574634390334612060, 0.574675310128195280, 0.574716228485090520, 0.574757145405194850, 0.574798060888406350, -0.574838974934622660, 0.574879887543741970, 0.574920798715661150, 0.574961708450278270, 0.575002616747491200, 0.575043523607197900, 0.575084429029295460, 0.575125333013681960, -0.575166235560255150, 0.575207136668913100, 0.575248036339552790, 0.575288934572072420, 0.575329831366370060, 0.575370726722342800, 0.575411620639888710, 0.575452513118905550, -0.575493404159291510, 0.575534293760943560, 0.575575181923759890, 0.575616068647638260, 0.575656953932476840, 0.575697837778172630, 0.575738720184623910, 0.575779601151728330, -0.575820480679384070, 0.575861358767488340, 0.575902235415939100, 0.575943110624634320, 0.575983984393472200, 0.576024856722349600, 0.576065727611165030, 0.576106597059816370, -0.576147465068200910, 0.576188331636216860, 0.576229196763761830, 0.576270060450734260, 0.576310922697031210, 0.576351783502550790, 0.576392642867190940, 0.576433500790849870, -0.576474357273424660, 0.576515212314813510, 0.576556065914914370, 0.576596918073625450, 0.576637768790843830, 0.576678618066467810, 0.576719465900395250, 0.576760312292524450, -0.576801157242752380, 0.576842000750977470, 0.576882842817098010, 0.576923683441010970, 0.576964522622614770, 0.577005360361807270, 0.577046196658486670, 0.577087031512550250, -0.577127864923896230, 0.577168696892422560, 0.577209527418027560, 0.577250356500608300, 0.577291184140063200, 0.577332010336290110, 0.577372835089187460, 0.577413658398652220, -0.577454480264582900, 0.577495300686877380, 0.577536119665433940, 0.577576937200149910, 0.577617753290923460, 0.577658567937653020, 0.577699381140235780, 0.577740192898570150, -0.577781003212553990, 0.577821812082085720, 0.577862619507062520, 0.577903425487382720, 0.577944230022944480, 0.577985033113645910, 0.578025834759384520, 0.578066634960058390, -0.578107433715565830, 0.578148231025804930, 0.578189026890673090, 0.578229821310068730, 0.578270614283889820, 0.578311405812034770, 0.578352195894400790, 0.578392984530886280, -0.578433771721389430, 0.578474557465808450, 0.578515341764040620, 0.578556124615984600, 0.578596906021538570, 0.578637685980599840, 0.578678464493066920, 0.578719241558837920, -0.578760017177811110, 0.578800791349883940, 0.578841564074954800, 0.578882335352921660, 0.578923105183683170, 0.578963873567136410, 0.579004640503180120, 0.579045405991712170, -0.579086170032630960, 0.579126932625834150, 0.579167693771219900, 0.579208453468686430, 0.579249211718132150, 0.579289968519454580, 0.579330723872552020, 0.579371477777323010, -0.579412230233664950, 0.579452981241476260, 0.579493730800655140, 0.579534478911100100, 0.579575225572708570, 0.579615970785378850, 0.579656714549009240, 0.579697456863498270, -0.579738197728743240, 0.579778937144642680, 0.579819675111094780, 0.579860411627998170, 0.579901146695250060, 0.579941880312749070, 0.579982612480393510, 0.580023343198081690, -0.580064072465711120, 0.580104800283180340, 0.580145526650387990, 0.580186251567231470, 0.580226975033609320, 0.580267697049419720, 0.580308417614561310, 0.580349136728931400, -0.580389854392428630, 0.580430570604951290, 0.580471285366397920, 0.580511998676665810, 0.580552710535653830, 0.580593420943260050, 0.580634129899383120, 0.580674837403920450, -0.580715543456770790, 0.580756248057832100, 0.580796951207003250, 0.580837652904181660, 0.580878353149265950, 0.580919051942154320, 0.580959749282745410, 0.581000445170936850, -0.581041139606627070, 0.581081832589714910, 0.581122524120097680, 0.581163214197674250, 0.581203902822342800, 0.581244589994001860, 0.581285275712549070, 0.581325959977883170, -0.581366642789902350, 0.581407324148505270, 0.581448004053589540, 0.581488682505053810, 0.581529359502796380, 0.581570035046715890, 0.581610709136709870, 0.581651381772677170, -0.581692052954515980, 0.581732722682125060, 0.581773390955401930, 0.581814057774245440, 0.581854723138554020, 0.581895387048225520, 0.581936049503158470, 0.581976710503251390, -0.582017370048402820, 0.582058028138510490, 0.582098684773473040, 0.582139339953189010, 0.582179993677556910, 0.582220645946474490, 0.582261296759840400, 0.582301946117553040, -0.582342594019511270, 0.582383240465612630, 0.582423885455755850, 0.582464528989839360, 0.582505171067762010, 0.582545811689421320, 0.582586450854716050, 0.582627088563545060, -0.582667724815805980, 0.582708359611397550, 0.582748992950218200, 0.582789624832166790, 0.582830255257140940, 0.582870884225039520, 0.582911511735760830, 0.582952137789203630, -0.582992762385265870, 0.583033385523846090, 0.583074007204842930, 0.583114627428155120, 0.583155246193680310, 0.583195863501317470, 0.583236479350964900, 0.583277093742521570, -0.583317706675885010, 0.583358318150954290, 0.583398928167628170, 0.583439536725804290, 0.583480143825381600, 0.583520749466258540, 0.583561353648333950, 0.583601956371505690, -0.583642557635672410, 0.583683157440732850, 0.583723755786585750, 0.583764352673128760, 0.583804948100261070, 0.583845542067880970, 0.583886134575887230, 0.583926725624178020, -0.583967315212651880, 0.584007903341207450, 0.584048490009743570, 0.584089075218158120, 0.584129658966350050, 0.584170241254217790, 0.584210822081660310, 0.584251401448575460, -0.584291979354861990, 0.584332555800419100, 0.584373130785144300, 0.584413704308936690, 0.584454276371694890, 0.584494846973317770, 0.584535416113703080, 0.584575983792749890, -0.584616550010356840, 0.584657114766422680, 0.584697678060845380, 0.584738239893523800, 0.584778800264356800, 0.584819359173243010, 0.584859916620080520, 0.584900472604768300, -0.584941027127204750, 0.584981580187289070, 0.585022131784919130, 0.585062681919993890, 0.585103230592412200, 0.585143777802072050, 0.585184323548872510, 0.585224867832712210, -0.585265410653490030, 0.585305952011104020, 0.585346491905453070, 0.585387030336435910, 0.585427567303951620, 0.585468102807897960, 0.585508636848174110, 0.585549169424678610, -0.585589700537310520, 0.585630230185967830, 0.585670758370549600, 0.585711285090954490, 0.585751810347081460, 0.585792334138828590, 0.585832856466094950, 0.585873377328779420, -0.585913896726780180, 0.585954414659996090, 0.585994931128326010, 0.586035446131669020, 0.586075959669922990, 0.586116471742987090, 0.586156982350759970, 0.586197491493140820, -0.586237999170027500, 0.586278505381319200, 0.586319010126914670, 0.586359513406713000, 0.586400015220612140, 0.586440515568511290, 0.586481014450309090, 0.586521511865904840, -0.586562007815196300, 0.586602502298082750, 0.586642995314463070, 0.586683486864236100, 0.586723976947300160, 0.586764465563554330, 0.586804952712897570, 0.586845438395228070, -0.586885922610445030, 0.586926405358447200, 0.586966886639133770, 0.587007366452402590, 0.587047844798153080, 0.587088321676284000, 0.587128797086694520, 0.587169271029282620, -0.587209743503947500, 0.587250214510588010, 0.587290684049103450, 0.587331152119391800, 0.587371618721352130, 0.587412083854883530, 0.587452547519885070, 0.587493009716254950, -0.587533470443892150, 0.587573929702696170, 0.587614387492564890, 0.587654843813397720, 0.587695298665093510, 0.587735752047551240, 0.587776203960669320, 0.587816654404346940, -0.587857103378482850, 0.587897550882976460, 0.587937996917725750, 0.587978441482630010, 0.588018884577588220, 0.588059326202499570, 0.588099766357262240, 0.588140205041775550, -0.588180642255938250, 0.588221077999649730, 0.588261512272808210, 0.588301945075312860, 0.588342376407063110, 0.588382806267956910, 0.588423234657893810, 0.588463661576772550, -0.588504087024492530, 0.588544511000951950, 0.588584933506050010, 0.588625354539685790, 0.588665774101758580, 0.588706192192166580, 0.588746608810808980, 0.588787023957584980, -0.588827437632393760, 0.588867849835133520, 0.588908260565703780, 0.588948669824003290, 0.588989077609931470, 0.589029483923386610, 0.589069888764268130, 0.589110292132475230, -0.589150694027906210, 0.589191094450460470, 0.589231493400037000, 0.589271890876535200, 0.589312286879853260, 0.589352681409890610, 0.589393074466546210, 0.589433466049719580, -0.589473856159308920, 0.589514244795213530, 0.589554631957332600, 0.589595017645565430, 0.589635401859810340, 0.589675784599966720, 0.589716165865933780, 0.589756545657610600, -0.589796923974895800, 0.589837300817688700, 0.589877676185888270, 0.589918050079394130, 0.589958422498104370, 0.589998793441918630, 0.590039162910736330, 0.590079530904455640, -0.590119897422976210, 0.590160262466197020, 0.590200626034017460, 0.590240988126336070, 0.590281348743052160, 0.590321707884064910, 0.590362065549273620, 0.590402421738576930, -0.590442776451874260, 0.590483129689064470, 0.590523481450047290, 0.590563831734721160, 0.590604180542985360, 0.590644527874739090, 0.590684873729881880, 0.590725218108312020, -0.590765561009929270, 0.590805902434632930, 0.590846242382321420, 0.590886580852894360, 0.590926917846250840, 0.590967253362290390, 0.591007587400911530, 0.591047919962013560, -0.591088251045495780, 0.591128580651257840, 0.591168908779198030, 0.591209235429216000, 0.591249560601210810, 0.591289884295082110, 0.591330206510728430, 0.591370527248049060, -0.591410846506943530, 0.591451164287311150, 0.591491480589050540, 0.591531795412061130, 0.591572108756242780, 0.591612420621493660, 0.591652731007713540, 0.591693039914801490, -0.591733347342657370, 0.591773653291179370, 0.591813957760267350, 0.591854260749820390, 0.591894562259738130, 0.591934862289919090, 0.591975160840262920, 0.592015457910668900, -0.592055753501036450, 0.592096047611264440, 0.592136340241252170, 0.592176631390899040, 0.592216921060104820, 0.592257209248767900, 0.592297495956787930, 0.592337781184064220, -0.592378064930496380, 0.592418347195983070, 0.592458627980423810, 0.592498907283718460, 0.592539185105765420, 0.592579461446464340, 0.592619736305714740, 0.592660009683416140, -0.592700281579467080, 0.592740551993767410, 0.592780820926216310, 0.592821088376713550, 0.592861354345157630, 0.592901618831448430, 0.592941881835485020, 0.592982143357167370, -0.593022403396394000, 0.593062661953064670, 0.593102919027078680, 0.593143174618335660, 0.593183428726734460, 0.593223681352174630, 0.593263932494555890, 0.593304182153777000, -0.593344430329737720, 0.593384677022337330, 0.593424922231475580, 0.593465165957051230, 0.593505408198963910, 0.593545648957113040, 0.593585888231398460, 0.593626126021718830, -0.593666362327973870, 0.593706597150062910, 0.593746830487885900, 0.593787062341341490, 0.593827292710329300, 0.593867521594748980, 0.593907748994500160, 0.593947974909481700, -0.593988199339593240, 0.594028422284734630, 0.594068643744804610, 0.594108863719702950, 0.594149082209329160, 0.594189299213583100, 0.594229514732363300, 0.594269728765569830, -0.594309941313102000, 0.594350152374859660, 0.594390361950741570, 0.594430570040647590, 0.594470776644477120, 0.594510981762130130, 0.594551185393505380, 0.594591387538502600, -0.594631588197021330, 0.594671787368961540, 0.594711985054221850, 0.594752181252702240, 0.594792375964302460, 0.594832569188921470, 0.594872760926459020, 0.594912951176814640, -0.594953139939888300, 0.594993327215578740, 0.595033513003785820, 0.595073697304409180, 0.595113880117348560, 0.595154061442502940, 0.595194241279772160, 0.595234419629055770, -0.595274596490253720, 0.595314771863264870, 0.595354945747988970, 0.595395118144325770, 0.595435289052175130, 0.595475458471435900, 0.595515626402008060, 0.595555792843791120, -0.595595957796685060, 0.595636121260588740, 0.595676283235402120, 0.595716443721025170, 0.595756602717356640, 0.595796760224296730, 0.595836916241744950, 0.595877070769601170, -0.595917223807764350, 0.595957375356134470, 0.595997525414611150, 0.596037673983094370, 0.596077821061483100, 0.596117966649677200, 0.596158110747576410, 0.596198253355080810, -0.596238394472089040, 0.596278534098501400, 0.596318672234217420, 0.596358808879137060, 0.596398944033159410, 0.596439077696184320, 0.596479209868111980, 0.596519340548841150, -0.596559469738272010, 0.596599597436304200, 0.596639723642837790, 0.596679848357771660, 0.596719971581005870, 0.596760093312440290, 0.596800213551974770, 0.596840332299508280, -0.596880449554941020, 0.596920565318172720, 0.596960679589103260, 0.597000792367631710, 0.597040903653658250, 0.597081013447082530, 0.597121121747804630, 0.597161228555723620, -0.597201333870739480, 0.597241437692752290, 0.597281540021661230, 0.597321640857366280, 0.597361740199767290, 0.597401838048764340, 0.597441934404256300, 0.597482029266143580, -0.597522122634325690, 0.597562214508702840, 0.597602304889174100, 0.597642393775639660, 0.597682481167999160, 0.597722567066152900, 0.597762651469999850, 0.597802734379440090, -0.597842815794373590, 0.597882895714700320, 0.597922974140319470, 0.597963051071131240, 0.598003126507035350, 0.598043200447932020, 0.598083272893720320, 0.598123343844300440, -0.598163413299572570, 0.598203481259435790, 0.598243547723790290, 0.598283612692535940, 0.598323676165572920, 0.598363738142800310, 0.598403798624118410, 0.598443857609427090, -0.598483915098626310, 0.598523971091615480, 0.598564025588294690, 0.598604078588563900, 0.598644130092323200, 0.598684180099471890, 0.598724228609910040, 0.598764275623537730, -0.598804321140254950, 0.598844365159961090, 0.598884407682556350, 0.598924448707940930, 0.598964488236014000, 0.599004526266675890, 0.599044562799826430, 0.599084597835365830, -0.599124631373193490, 0.599164663413209620, 0.599204693955313950, 0.599244722999407010, 0.599284750545387880, 0.599324776593156860, 0.599364801142613920, 0.599404824193659370, -0.599444845746192280, 0.599484865800113180, 0.599524884355321920, 0.599564901411718810, 0.599604916969203040, 0.599644931027674910, 0.599684943587034950, 0.599724954647182230, -0.599764964208017060, 0.599804972269439520, 0.599844978831349910, 0.599884983893647530, 0.599924987456232680, 0.599964989519005340, 0.600004990081865920, 0.600044989144713600, -0.600084986707448810, 0.600124982769971620, 0.600164977332182330, 0.600204970393980240, 0.600244961955265670, 0.600284952015938680, 0.600324940575899690, 0.600364927635048010, -0.600404913193284040, 0.600444897250507760, 0.600484879806619580, 0.600524860861518790, 0.600564840415105940, 0.600604818467281310, 0.600644795017944320, 0.600684770066995280, -0.600724743614334370, 0.600764715659861890, 0.600804686203477380, 0.600844655245081020, 0.600884622784573110, 0.600924588821853960, 0.600964553356822970, 0.601004516389380680, -0.601044477919427060, 0.601084437946862500, 0.601124396471586550, 0.601164353493499730, 0.601204309012501880, 0.601244263028493650, 0.601284215541374460, 0.601324166551044700, -0.601364116057404810, 0.601404064060354400, 0.601444010559793680, 0.601483955555623060, 0.601523899047742840, 0.601563841036052540, 0.601603781520452690, 0.601643720500843250, -0.601683657977124970, 0.601723593949197170, 0.601763528416960460, 0.601803461380314820, 0.601843392839160880, 0.601883322793398180, 0.601923251242927120, 0.601963178187648000, -0.602003103627461230, 0.602043027562266350, 0.602082949991963880, 0.602122870916454330, 0.602162790335637350, 0.602202708249413470, 0.602242624657682630, 0.602282539560345720, -0.602322452957302020, 0.602362364848452290, 0.602402275233696600, 0.602442184112935600, 0.602482091486068680, 0.602521997352996610, 0.602561901713619560, 0.602601804567838070, -0.602641705915551770, 0.602681605756661190, 0.602721504091066510, 0.602761400918668590, 0.602801296239366620, 0.602841190053061580, 0.602881082359653760, 0.602920973159043030, -0.602960862451129790, 0.603000750235814450, 0.603040636512997550, 0.603080521282578720, 0.603120404544458480, 0.603160286298537350, 0.603200166544715870, 0.603240045282893540, -0.603279922512971130, 0.603319798234848940, 0.603359672448427590, 0.603399545153606720, 0.603439416350286970, 0.603479286038368650, 0.603519154217752480, 0.603559020888338130, -0.603598886050026100, 0.603638749702717030, 0.603678611846311330, 0.603718472480708760, 0.603758331605810050, 0.603798189221515850, 0.603838045327725780, 0.603877899924340600, -0.603917753011260720, 0.603957604588386760, 0.603997454655618490, 0.604037303212856540, 0.604077150260001310, 0.604116995796953550, 0.604156839823613010, 0.604196682339880330, -0.604236523345656030, 0.604276362840840740, 0.604316200825334100, 0.604356037299037090, 0.604395872261849880, 0.604435705713673330, 0.604475537654407310, 0.604515368083952340, -0.604555197002209280, 0.604595024409077860, 0.604634850304458960, 0.604674674688252870, 0.604714497560360550, 0.604754318920681540, 0.604794138769116700, 0.604833957105566640, -0.604873773929931910, 0.604913589242112470, 0.604953403042009060, 0.604993215329522100, 0.605033026104552450, 0.605072835366999960, 0.605112643116765270, 0.605152449353749010, -0.605192254077852040, 0.605232057288974110, 0.605271858987015960, 0.605311659171878460, 0.605351457843461560, 0.605391255001666020, 0.605431050646392240, 0.605470844777541320, -0.605510637395012870, 0.605550428498707770, 0.605590218088526640, 0.605630006164370350, 0.605669792726138630, 0.605709577773732470, 0.605749361307052370, 0.605789143325999310, -0.605828923830472930, 0.605868702820374190, 0.605908480295603850, 0.605948256256062520, 0.605988030701650300, 0.606027803632267940, 0.606067575047816050, 0.606107344948195630, -0.606147113333306510, 0.606186880203049560, 0.606226645557325750, 0.606266409396035040, 0.606306171719078190, 0.606345932526356050, 0.606385691817769360, 0.606425449593218090, -0.606465205852603220, 0.606504960595825260, 0.606544713822785300, 0.606584465533383190, 0.606624215727520010, 0.606663964405096180, 0.606703711566012880, 0.606743457210169870, -0.606783201337468210, 0.606822943947808670, 0.606862685041091980, 0.606902424617218330, 0.606942162676088580, 0.606981899217603700, 0.607021634241663780, 0.607061367748169770, -0.607101099737022420, 0.607140830208122590, 0.607180559161370370, 0.607220286596666710, 0.607260012513912370, 0.607299736913008310, 0.607339459793854620, 0.607379181156352250, -0.607418901000401860, 0.607458619325904610, 0.607498336132760500, 0.607538051420870580, 0.607577765190135510, 0.607617477440456350, 0.607657188171733090, 0.607696897383866900, -0.607736605076758860, 0.607776311250308950, 0.607816015904418250, 0.607855719038987500, 0.607895420653917770, 0.607935120749109160, 0.607974819324462850, 0.608014516379879360, -0.608054211915259990, 0.608093905930504720, 0.608133598425514620, 0.608173289400190660, 0.608212978854433710, 0.608252666788144050, 0.608292353201222660, 0.608332038093570390, -0.608371721465088440, 0.608411403315676780, 0.608451083645236700, 0.608490762453669180, 0.608530439740874400, 0.608570115506753550, 0.608609789751207390, 0.608649462474137090, -0.608689133675442860, 0.608728803355025770, 0.608768471512786570, 0.608808138148626670, 0.608847803262446030, 0.608887466854145850, 0.608927128923626990, 0.608966789470790750, -0.609006448495537090, 0.609046105997767430, 0.609085761977382400, 0.609125416434283310, 0.609165069368370340, 0.609204720779544790, 0.609244370667707310, 0.609284019032759310, -0.609323665874600960, 0.609363311193133360, 0.609402954988257920, 0.609442597259874600, 0.609482238007884920, 0.609521877232189650, 0.609561514932689950, 0.609601151109286140, -0.609640785761879520, 0.609680418890370830, 0.609720050494661490, 0.609759680574651690, 0.609799309130242720, 0.609838936161335440, 0.609878561667831160, 0.609918185649630070, -0.609957808106633690, 0.609997429038742660, 0.610037048445858380, 0.610076666327881160, 0.610116282684712300, 0.610155897516253100, 0.610195510822403750, 0.610235122603065670, -0.610274732858139820, 0.610314341587527400, 0.610353948791128810, 0.610393554468845360, 0.610433158620578010, 0.610472761246228180, 0.610512362345696060, 0.610551961918882950, -0.610591559965690030, 0.610631156486018510, 0.610670751479768790, 0.610710344946842180, 0.610749936887139630, 0.610789527300562680, 0.610829116187011520, 0.610868703546387560, -0.610908289378592210, 0.610947873683525880, 0.610987456461089760, 0.611027037711185050, 0.611066617433713040, 0.611106195628574160, 0.611145772295669800, 0.611185347434900940, -0.611224921046169210, 0.611264493129374700, 0.611304063684419030, 0.611343632711203180, 0.611383200209628550, 0.611422766179595680, 0.611462330621005750, 0.611501893533760050, -0.611541454917760020, 0.611581014772905940, 0.611620573099099340, 0.611660129896241410, 0.611699685164233340, 0.611739238902975770, 0.611778791112370100, 0.611818341792317870, -0.611857890942719360, 0.611897438563476110, 0.611936984654489310, 0.611976529215660480, 0.612016072246889810, 0.612055613748079040, 0.612095153719129260, 0.612134692159941980, -0.612174229070417520, 0.612213764450457500, 0.612253298299963110, 0.612292830618835770, 0.612332361406976110, 0.612371890664285430, 0.612411418390665040, 0.612450944586016570, -0.612490469250240310, 0.612529992383237800, 0.612569513984910770, 0.612609034055159540, 0.612648552593885840, 0.612688069600990650, 0.612727585076375590, 0.612767099019941310, -0.612806611431589320, 0.612846122311220710, 0.612885631658737220, 0.612925139474039150, 0.612964645757028360, 0.613004150507605930, 0.613043653725673490, 0.613083155411131560, -0.613122655563881790, 0.613162154183825250, 0.613201651270863790, 0.613241146824897830, 0.613280640845829010, 0.613320133333558950, 0.613359624287988070, 0.613399113709018230, -0.613438601596550610, 0.613478087950486860, 0.613517572770727490, 0.613557056057174250, 0.613596537809728340, 0.613636018028291490, 0.613675496712764110, 0.613714973863048070, -0.613754449479044560, 0.613793923560655320, 0.613833396107780980, 0.613872867120323070, 0.613912336598183010, 0.613951804541262410, 0.613991270949461930, 0.614030735822683420, -0.614070199160828280, 0.614109660963797380, 0.614149121231492230, 0.614188579963814370, 0.614228037160665430, 0.614267492821945930, 0.614306946947557830, 0.614346399537402220, -0.614385850591381070, 0.614425300109394890, 0.614464748091345550, 0.614504194537134230, 0.614543639446662790, 0.614583082819831980, 0.614622524656543430, 0.614661964956698560, -0.614701403720199100, 0.614740840946945810, 0.614780276636840430, 0.614819710789784260, 0.614859143405679260, 0.614898574484426090, 0.614938004025926350, 0.614977432030082040, -0.615016858496793770, 0.615056283425963410, 0.615095706817492260, 0.615135128671282280, 0.615174548987234120, 0.615213967765249500, 0.615253385005230080, 0.615292800707077480, -0.615332214870692450, 0.615371627495976960, 0.615411038582832410, 0.615450448131160680, 0.615489856140862380, 0.615529262611839490, 0.615568667543993420, 0.615608070937226030, -0.615647472791438060, 0.615686873106531470, 0.615726271882408030, 0.615765669118968570, 0.615805064816114970, 0.615844458973748730, 0.615883851591771610, 0.615923242670084580, -0.615962632208589380, 0.616002020207187640, 0.616041406665781110, 0.616080791584270870, 0.616120174962558550, 0.616159556800545790, 0.616198937098134560, 0.616238315855225590, -0.616277693071720760, 0.616317068747521790, 0.616356442882530550, 0.616395815476647680, 0.616435186529775470, 0.616474556041815450, 0.616513924012668800, 0.616553290442237390, -0.616592655330422620, 0.616632018677126690, 0.616671380482250340, 0.616710740745695430, 0.616750099467363810, 0.616789456647157230, 0.616828812284976660, 0.616868166380723950, -0.616907518934300960, 0.616946869945609540, 0.616986219414550560, 0.617025567341025980, 0.617064913724937550, 0.617104258566187110, 0.617143601864675760, 0.617182943620305350, -0.617222283832977610, 0.617261622502594420, 0.617300959629056960, 0.617340295212267080, 0.617379629252126750, 0.617418961748537050, 0.617458292701399850, 0.617497622110616980, -0.617536949976090430, 0.617576276297721160, 0.617615601075411140, 0.617654924309062210, 0.617694245998576250, 0.617733566143854330, 0.617772884744798520, 0.617812201801310470, -0.617851517313292240, 0.617890831280644930, 0.617930143703270480, 0.617969454581070780, 0.618008763913947660, 0.618048071701802430, 0.618087377944536830, 0.618126682642053280, -0.618165985794252640, 0.618205287401037080, 0.618244587462308150, 0.618283885977968240, 0.618323182947918220, 0.618362478372060260, 0.618401772250296130, 0.618441064582527900, -0.618480355368656640, 0.618519644608584440, 0.618558932302213260, 0.618598218449444960, 0.618637503050180840, 0.618676786104322970, 0.618716067611773110, 0.618755347572433450, -0.618794625986205050, 0.618833902852990110, 0.618873178172690720, 0.618912451945208050, 0.618951724170444310, 0.618990994848301220, 0.619030263978680990, 0.619069531561484700, -0.619108797596614640, 0.619148062083972550, 0.619187325023460740, 0.619226586414980180, 0.619265846258433170, 0.619305104553721560, 0.619344361300747550, 0.619383616499412320, -0.619422870149617940, 0.619462122251266400, 0.619501372804259990, 0.619540621808499780, 0.619579869263887970, 0.619619115170326860, 0.619658359527717640, 0.619697602335962490, -0.619736843594963280, 0.619776083304622420, 0.619815321464840970, 0.619854558075521140, 0.619893793136565010, 0.619933026647874750, 0.619972258609351570, 0.620011489020897640, -0.620050717882415060, 0.620089945193806000, 0.620129170954971780, 0.620168395165814680, 0.620207617826236460, 0.620246838936139630, 0.620286058495425400, 0.620325276503995940, -0.620364492961753330, 0.620403707868599770, 0.620442921224436670, 0.620482133029166220, 0.620521343282690820, 0.620560551984911670, 0.620599759135731180, 0.620638964735051200, -0.620678168782774260, 0.620717371278801560, 0.620756572223035370, 0.620795771615377800, 0.620834969455731130, 0.620874165743996680, 0.620913360480076840, 0.620952553663873590, -0.620991745295289220, 0.621030935374225270, 0.621070123900583910, 0.621109310874267240, 0.621148496295177650, 0.621187680163216460, 0.621226862478286180, 0.621266043240289000, -0.621305222449126340, 0.621344400104700600, 0.621383576206913980, 0.621422750755668660, 0.621461923750866170, 0.621501095192408810, 0.621540265080198770, 0.621579433414138350, -0.621618600194129070, 0.621657765420073340, 0.621696929091873020, 0.621736091209430850, 0.621775251772648140, 0.621814410781427180, 0.621853568235670280, 0.621892724135279850, -0.621931878480157190, 0.621971031270204810, 0.622010182505325250, 0.622049332185419910, 0.622088480310391210, 0.622127626880141230, 0.622166771894572590, 0.622205915353586710, -0.622245057257086010, 0.622284197604972670, 0.622323336397149210, 0.622362473633517040, 0.622401609313978700, 0.622440743438436250, 0.622479876006792440, 0.622519007018948470, -0.622558136474807070, 0.622597264374270210, 0.622636390717240640, 0.622675515503619770, 0.622714638733310010, 0.622753760406213660, 0.622792880522233360, 0.622831999081270400, -0.622871116083227540, 0.622910231528007170, 0.622949345415510950, 0.622988457745641270, 0.623027568518300550, 0.623066677733391190, 0.623105785390814740, 0.623144891490473920, -0.623183996032270810, 0.623223099016108060, 0.623262200441887290, 0.623301300309510920, 0.623340398618881350, 0.623379495369901120, 0.623418590562471840, 0.623457684196496050, -0.623496776271876050, 0.623535866788514470, 0.623574955746312830, 0.623614043145173880, 0.623653128985000140, 0.623692213265693130, 0.623731295987155710, 0.623770377149290070, -0.623809456751998730, 0.623848534795183430, 0.623887611278746810, 0.623926686202591170, 0.623965759566619150, 0.624004831370732480, 0.624043901614833580, 0.624082970298824980, -0.624122037422609300, 0.624161102986088290, 0.624200166989164360, 0.624239229431740040, 0.624278290313718070, 0.624317349634999960, 0.624356407395488590, 0.624395463595086350, -0.624434518233695330, 0.624473571311217830, 0.624512622827556490, 0.624551672782613920, 0.624590721176291890, 0.624629768008492900, 0.624668813279119610, 0.624707856988074630, -0.624746899135259600, 0.624785939720577390, 0.624824978743930280, 0.624864016205221140, 0.624903052104351600, 0.624942086441224400, 0.624981119215741950, 0.625020150427807120, -0.625059180077321530, 0.625098208164187930, 0.625137234688309170, 0.625176259649587120, 0.625215283047924290, 0.625254304883223310, 0.625293325155386830, 0.625332343864316800, -0.625371361009915860, 0.625410376592086540, 0.625449390610731570, 0.625488403065752820, 0.625527413957053020, 0.625566423284534710, 0.625605431048100740, 0.625644437247652840, -0.625683441883093770, 0.625722444954326160, 0.625761446461252760, 0.625800446403775410, 0.625839444781796870, 0.625878441595219770, 0.625917436843946960, 0.625956430527880190, -0.625995422646922320, 0.626034413200976300, 0.626073402189943780, 0.626112389613727840, 0.626151375472230990, 0.626190359765355970, 0.626229342493004660, 0.626268323655080010, -0.626307303251484540, 0.626346281282121220, 0.626385257746891910, 0.626424232645699350, 0.626463205978446180, 0.626502177745035470, 0.626541147945368860, 0.626580116579349420, -0.626619083646879680, 0.626658049147862610, 0.626697013082200050, 0.626735975449794980, 0.626774936250550250, 0.626813895484367830, 0.626852853151150800, 0.626891809250801460, -0.626930763783223100, 0.626969716748317360, 0.627008668145987440, 0.627047617976135840, 0.627086566238665430, 0.627125512933478290, 0.627164458060477490, 0.627203401619565450, -0.627242343610645240, 0.627281284033618820, 0.627320222888389290, 0.627359160174859150, 0.627398095892931380, 0.627437030042508060, 0.627475962623492260, 0.627514893635786830, -0.627553823079293750, 0.627592750953916200, 0.627631677259556820, 0.627670601996118460, 0.627709525163503310, 0.627748446761614340, 0.627787366790354300, 0.627826285249626140, -0.627865202139331950, 0.627904117459374800, 0.627943031209657220, 0.627981943390082510, 0.628020854000552630, 0.628059763040970550, 0.628098670511239020, 0.628137576411261220, -0.628176480740939120, 0.628215383500175810, 0.628254284688874120, 0.628293184306937040, 0.628332082354266520, 0.628370978830765870, 0.628409873736338160, 0.628448767070885370, -0.628487658834310790, 0.628526549026516950, 0.628565437647407020, 0.628604324696883320, 0.628643210174848700, 0.628682094081206010, 0.628720976415858560, 0.628759857178708190, -0.628798736369658330, 0.628837613988611490, 0.628876490035470970, 0.628915364510138960, 0.628954237412518550, 0.628993108742512460, 0.629031978500024010, 0.629070846684955160, -0.629109713297209330, 0.629148578336689470, 0.629187441803297890, 0.629226303696937660, 0.629265164017511760, 0.629304022764923140, 0.629342879939074230, 0.629381735539868090, -0.629420589567207590, 0.629459442020996020, 0.629498292901135460, 0.629537142207529100, 0.629575989940080020, 0.629614836098691180, 0.629653680683264990, 0.629692523693704540, -0.629731365129912900, 0.629770204991793040, 0.629809043279247470, 0.629847879992179170, 0.629886715130491550, 0.629925548694086790, 0.629964380682868200, 0.630003211096738620, -0.630042039935601370, 0.630080867199358740, 0.630119692887913920, 0.630158517001169760, 0.630197339539029790, 0.630236160501395970, 0.630274979888171830, 0.630313797699260330, -0.630352613934564540, 0.630391428593986890, 0.630430241677430780, 0.630469053184798960, 0.630507863115994940, 0.630546671470920810, 0.630585478249480080, 0.630624283451575950, -0.630663087077110830, 0.630701889125987900, 0.630740689598110360, 0.630779488493381390, 0.630818285811703290, 0.630857081552979590, 0.630895875717113140, 0.630934668304007350, -0.630973459313564520, 0.631012248745688060, 0.631051036600280950, 0.631089822877246580, 0.631128607576487370, 0.631167390697906620, 0.631206172241407400, 0.631244952206893030, -0.631283730594266010, 0.631322507403429660, 0.631361282634287040, 0.631400056286741560, 0.631438828360695540, 0.631477598856052480, 0.631516367772715800, 0.631555135110587810, -0.631593900869572010, 0.631632665049571500, 0.631671427650489560, 0.631710188672228830, 0.631748948114692510, 0.631787705977783890, 0.631826462261406370, 0.631865216965462270, -0.631903970089855220, 0.631942721634488170, 0.631981471599264770, 0.632020219984087190, 0.632058966788859200, 0.632097712013483750, 0.632136455657864360, 0.632175197721903450, -0.632213938205504530, 0.632252677108571250, 0.632291414431005780, 0.632330150172711880, 0.632368884333592510, 0.632407616913551300, 0.632446347912490770, 0.632485077330314230, -0.632523805166925080, 0.632562531422226850, 0.632601256096121830, 0.632639979188513670, 0.632678700699305650, 0.632717420628401190, 0.632756138975702820, 0.632794855741114050, -0.632833570924538180, 0.632872284525878740, 0.632910996545038240, 0.632949706981920320, 0.632988415836428400, 0.633027123108465100, 0.633065828797934050, 0.633104532904738340, -0.633143235428781700, 0.633181936369966560, 0.633220635728196650, 0.633259333503375150, 0.633298029695405610, 0.633336724304190630, 0.633375417329633980, 0.633414108771638620, -0.633452798630108390, 0.633491486904945830, 0.633530173596054570, 0.633568858703337900, 0.633607542226699350, 0.633646224166041660, 0.633684904521268470, 0.633723583292282950, -0.633762260478988760, 0.633800936081288620, 0.633839610099086180, 0.633878282532285060, 0.633916953380787800, 0.633955622644498230, 0.633994290323319550, 0.634032956417155510, -0.634071620925908740, 0.634110283849482980, 0.634148945187781420, 0.634187604940707920, 0.634226263108164990, 0.634264919690056490, 0.634303574686285620, 0.634342228096756220, -0.634380879921370820, 0.634419530160033270, 0.634458178812646880, 0.634496825879115380, 0.634535471359341520, 0.634574115253228930, 0.634612757560681360, 0.634651398281601660, -0.634690037415893360, 0.634728674963460080, 0.634767310924205350, 0.634805945298032030, 0.634844578084843960, 0.634883209284544340, 0.634921838897037020, 0.634960466922224740, -0.634999093360011370, 0.635037718210300190, 0.635076341472995190, 0.635114963147998870, 0.635153583235215200, 0.635192201734547490, 0.635230818645899700, 0.635269433969174570, -0.635308047704275740, 0.635346659851107170, 0.635385270409571600, 0.635423879379572900, 0.635462486761014470, 0.635501092553800160, 0.635539696757832840, 0.635578299373016240, -0.635616900399253780, 0.635655499836449530, 0.635694097684506240, 0.635732693943327650, 0.635771288612817290, 0.635809881692879000, 0.635848473183415750, 0.635887063084331290, -0.635925651395529260, 0.635964238116913380, 0.636002823248386530, 0.636041406789852660, 0.636079988741215630, 0.636118569102378180, 0.636157147873244400, 0.636195725053717690, -0.636234300643702120, 0.636272874643100340, 0.636311447051816410, 0.636350017869753870, 0.636388587096816670, 0.636427154732907670, 0.636465720777930730, 0.636504285231789480, -0.636542848094387880, 0.636581409365628790, 0.636619969045416180, 0.636658527133653670, 0.636697083630245240, 0.636735638535093740, 0.636774191848103020, 0.636812743569176940, -0.636851293698219360, 0.636889842235133120, 0.636928389179822310, 0.636966934532190890, 0.637005478292141710, 0.637044020459578970, 0.637082561034406080, 0.637121100016527110, -0.637159637405845140, 0.637198173202264020, 0.637236707405687500, 0.637275240016019540, 0.637313771033163110, 0.637352300457022290, 0.637390828287500710, 0.637429354524502330, -0.637467879167930350, 0.637506402217688510, 0.637544923673680760, 0.637583443535811090, 0.637621961803982450, 0.637660478478098810, 0.637698993558064480, 0.637737507043782180, -0.637776018935156230, 0.637814529232090140, 0.637853037934488110, 0.637891545042253090, 0.637930050555289290, 0.637968554473500320, 0.638007056796790260, 0.638045557525062310, -0.638084056658220430, 0.638122554196168370, 0.638161050138810300, 0.638199544486049210, 0.638238037237789380, 0.638276528393934340, 0.638315017954388390, 0.638353505919054490, -0.638391992287836940, 0.638430477060639600, 0.638468960237365880, 0.638507441817919630, 0.638545921802204820, 0.638584400190125520, 0.638622876981584930, 0.638661352176487120, -0.638699825774735940, 0.638738297776235590, 0.638776768180889130, 0.638815236988600650, 0.638853704199274230, 0.638892169812813830, 0.638930633829122630, 0.638969096248104830, -0.639007557069664280, 0.639046016293705280, 0.639084473920130790, 0.639122929948845230, 0.639161384379752230, 0.639199837212756190, 0.639238288447760210, 0.639276738084668450, -0.639315186123385230, 0.639353632563813720, 0.639392077405858130, 0.639430520649422300, 0.639468962294410530, 0.639507402340726010, 0.639545840788272920, 0.639584277636955360, -0.639622712886677380, 0.639661146537342300, 0.639699578588854290, 0.639738009041117440, 0.639776437894035820, 0.639814865147512850, 0.639853290801452590, 0.639891714855759240, -0.639930137310336880, 0.639968558165088800, 0.640006977419919300, 0.640045395074732790, 0.640083811129432470, 0.640122225583922510, 0.640160638438107110, 0.640199049691890340, -0.640237459345175730, 0.640275867397867350, 0.640314273849869390, 0.640352678701086030, 0.640391081951420690, 0.640429483600777560, 0.640467883649060710, 0.640506282096174660, -0.640544678942022380, 0.640583074186508510, 0.640621467829536880, 0.640659859871012040, 0.640698250310837050, 0.640736639148916540, 0.640775026385154820, 0.640813412019455080, -0.640851796051721820, 0.640890178481859140, 0.640928559309771330, 0.640966938535361800, 0.641005316158534840, 0.641043692179194660, 0.641082066597245650, 0.641120439412591000, -0.641158810625135360, 0.641197180234782560, 0.641235548241437250, 0.641273914645002720, 0.641312279445383380, 0.641350642642483430, 0.641389004236207150, 0.641427364226457960, -0.641465722613140390, 0.641504079396158940, 0.641542434575416820, 0.641580788150818760, 0.641619140122268620, 0.641657490489671020, 0.641695839252929280, 0.641734186411948020, -0.641772531966631310, 0.641810875916883570, 0.641849218262608320, 0.641887559003709970, 0.641925898140092820, 0.641964235671661170, 0.642002571598318640, 0.642040905919969650, -0.642079238636518390, 0.642117569747869490, 0.642155899253926240, 0.642194227154593180, 0.642232553449774590, 0.642270878139375000, 0.642309201223297820, 0.642347522701447680, -0.642385842573729100, 0.642424160840045500, 0.642462477500301610, 0.642500792554401400, 0.642539106002249620, 0.642577417843749670, 0.642615728078806290, 0.642654036707323460, -0.642692343729205920, 0.642730649144357290, 0.642768952952681880, 0.642807255154084210, 0.642845555748468690, 0.642883854735738950, 0.642922152115799510, 0.642960447888554780, -0.642998742053909170, 0.643037034611766420, 0.643075325562031170, 0.643113614904607830, 0.643151902639400140, 0.643190188766312730, 0.643228473285249790, 0.643266756196116060, -0.643305037498815070, 0.643343317193251550, 0.643381595279329700, 0.643419871756954140, 0.643458146626028630, 0.643496419886457780, 0.643534691538145800, 0.643572961580997420, -0.643611230014916380, 0.643649496839807210, 0.643687762055574320, 0.643726025662122340, 0.643764287659355010, 0.643802548047176960, 0.643840806825492830, 0.643879063994206360, -0.643917319553222180, 0.643955573502444810, 0.643993825841778780, 0.644032076571127820, 0.644070325690396680, 0.644108573199489780, 0.644146819098311730, 0.644185063386766400, -0.644223306064758310, 0.644261547132191970, 0.644299786588972130, 0.644338024435002430, 0.644376260670187720, 0.644414495294432290, 0.644452728307641000, 0.644490959709717590, -0.644529189500566810, 0.644567417680092960, 0.644605644248200990, 0.644643869204794440, 0.644682092549778370, 0.644720314283057320, 0.644758534404535230, 0.644796752914116640, -0.644834969811706290, 0.644873185097208920, 0.644911398770528050, 0.644949610831568880, 0.644987821280235570, 0.645026030116433110, 0.645064237340065130, 0.645102442951036690, -0.645140646949252110, 0.645178849334616220, 0.645217050107032790, 0.645255249266406870, 0.645293446812642780, 0.645331642745645360, 0.645369837065318590, 0.645408029771567190, -0.645446220864296040, 0.645484410343408980, 0.645522598208810860, 0.645560784460406320, 0.645598969098100220, 0.645637152121796290, 0.645675333531399390, 0.645713513326814260, -0.645751691507945650, 0.645789868074697520, 0.645828043026974720, 0.645866216364681670, 0.645904388087723550, 0.645942558196004100, 0.645980726689428300, 0.646018893567900650, -0.646057058831326030, 0.646095222479608490, 0.646133384512652900, 0.646171544930364220, 0.646209703732646300, 0.646247860919404000, 0.646286016490542180, 0.646324170445965680, -0.646362322785578370, 0.646400473509285310, 0.646438622616991030, 0.646476770108600500, 0.646514915984017670, 0.646553060243147630, 0.646591202885894890, 0.646629343912164530, -0.646667483321860530, 0.646705621114887720, 0.646743757291150860, 0.646781891850555010, 0.646820024793004040, 0.646858156118403030, 0.646896285826656590, 0.646934413917669810, -0.646972540391346660, 0.647010665247592100, 0.647048788486311200, 0.647086910107408150, 0.647125030110787700, 0.647163148496354700, 0.647201265264014220, 0.647239380413670130, -0.647277493945227710, 0.647315605858591490, 0.647353716153666550, 0.647391824830357070, 0.647429931888567900, 0.647468037328204020, 0.647506141149170380, 0.647544243351371060, -0.647582343934711040, 0.647620442899095260, 0.647658540244428590, 0.647696635970615330, 0.647734730077560440, 0.647772822565169100, 0.647810913433345400, 0.647849002681994300, -0.647887090311020760, 0.647925176320329870, 0.647963260709825680, 0.648001343479413290, 0.648039424628997550, 0.648077504158483640, 0.648115582067775640, 0.648153658356778630, -0.648191733025397450, 0.648229806073537420, 0.648267877501102370, 0.648305947307997730, 0.648344015494128120, 0.648382082059398850, 0.648420147003714090, 0.648458210326978920, -0.648496272029098650, 0.648534332109977240, 0.648572390569520100, 0.648610447407631850, 0.648648502624217920, 0.648686556219182360, 0.648724608192430500, 0.648762658543867050, -0.648800707273397230, 0.648838754380925420, 0.648876799866356600, 0.648914843729595850, 0.648952885970548340, 0.648990926589118280, 0.649028965585210840, 0.649067002958731100, -0.649105038709584140, 0.649143072837674250, 0.649181105342906630, 0.649219136225186570, 0.649257165484418360, 0.649295193120507320, 0.649333219133358170, 0.649371243522876450, -0.649409266288966220, 0.649447287431532790, 0.649485306950481120, 0.649523324845716620, 0.649561341117143360, 0.649599355764666760, 0.649637368788191890, 0.649675380187623830, -0.649713389962866980, 0.649751398113826650, 0.649789404640407910, 0.649827409542515940, 0.649865412820055170, 0.649903414472930760, 0.649941414501047920, 0.649979412904311830, -0.650017409682626780, 0.650055404835898300, 0.650093398364031680, 0.650131390266931230, 0.650169380544502240, 0.650207369196649790, 0.650245356223279280, 0.650283341624295020, -0.650321325399602520, 0.650359307549106540, 0.650397288072712800, 0.650435266970325390, 0.650473244241849820, 0.650511219887191180, 0.650549193906254760, 0.650587166298945090, -0.650625137065167450, 0.650663106204827040, 0.650701073717829150, 0.650739039604078200, 0.650777003863479700, 0.650814966495939060, 0.650852927501360590, 0.650890886879649910, -0.650928844630711880, 0.650966800754452120, 0.651004755250775060, 0.651042708119586090, 0.651080659360790400, 0.651118608974293300, 0.651156556959999410, 0.651194503317814140, -0.651232448047642580, 0.651270391149390230, 0.651308332622961620, 0.651346272468262160, 0.651384210685197030, 0.651422147273671650, 0.651460082233590530, 0.651498015564859310, -0.651535947267383290, 0.651573877341067200, 0.651611805785816230, 0.651649732601535910, 0.651687657788131540, 0.651725581345507730, 0.651763503273569910, 0.651801423572223370, -0.651839342241373520, 0.651877259280925100, 0.651915174690783420, 0.651953088470853870, 0.651991000621041980, 0.652028911141252170, 0.652066820031390050, 0.652104727291360930, -0.652142632921070440, 0.652180536920422880, 0.652218439289323990, 0.652256340027679070, 0.652294239135393640, 0.652332136612372220, 0.652370032458520430, 0.652407926673744030, -0.652445819257947420, 0.652483710211036130, 0.652521599532915660, 0.652559487223491660, 0.652597373282668420, 0.652635257710351800, 0.652673140506447090, 0.652711021670859810, -0.652748901203494600, 0.652786779104257200, 0.652824655373052900, 0.652862530009787220, 0.652900403014364920, 0.652938274386691610, 0.652976144126672600, 0.653014012234213510, -0.653051878709219100, 0.653089743551594990, 0.653127606761246930, 0.653165468338079420, 0.653203328281998340, 0.653241186592908860, 0.653279043270716730, 0.653316898315326690, -0.653354751726644480, 0.653392603504575290, 0.653430453649024970, 0.653468302159898150, 0.653506149037100580, 0.653543994280537670, 0.653581837890115040, 0.653619679865737550, -0.653657520207310830, 0.653695358914740290, 0.653733195987931780, 0.653771031426789830, 0.653808865231220390, 0.653846697401129110, 0.653884527936420710, 0.653922356837000950, -0.653960184102775340, 0.653998009733649630, 0.654035833729528560, 0.654073656090317980, 0.654111476815923080, 0.654149295906249930, 0.654187113361203280, 0.654224929180688750, -0.654262743364611880, 0.654300555912878500, 0.654338366825393480, 0.654376176102062450, 0.654413983742791030, 0.654451789747484970, 0.654489594116049120, 0.654527396848389230, -0.654565197944411150, 0.654602997404019840, 0.654640795227121040, 0.654678591413620170, 0.654716385963423190, 0.654754178876434940, 0.654791970152561190, 0.654829759791707540, -0.654867547793779870, 0.654905334158682910, 0.654943118886322730, 0.654980901976604630, 0.655018683429434700, 0.655056463244717670, 0.655094241422359500, 0.655132017962265830, -0.655169792864342290, 0.655207566128494070, 0.655245337754626790, 0.655283107742646200, 0.655320876092458260, 0.655358642803967720, 0.655396407877080640, 0.655434171311702900, -0.655471933107739320, 0.655509693265095890, 0.655547451783678240, 0.655585208663392320, 0.655622963904143100, 0.655660717505836320, 0.655698469468377840, 0.655736219791673510, -0.655773968475628300, 0.655811715520148280, 0.655849460925138850, 0.655887204690506100, 0.655924946816154990, 0.655962687301991590, 0.656000426147921420, 0.656038163353850460, -0.656075898919683880, 0.656113632845327530, 0.656151365130687390, 0.656189095775668530, 0.656226824780176910, 0.656264552144118160, 0.656302277867398480, 0.656340001949922700, -0.656377724391596920, 0.656415445192326860, 0.656453164352018610, 0.656490881870576910, 0.656528597747908170, 0.656566311983917910, 0.656604024578512190, 0.656641735531595990, -0.656679444843075500, 0.656717152512856450, 0.656754858540844810, 0.656792562926945770, 0.656830265671065280, 0.656867966773109440, 0.656905666232983300, 0.656943364050593060, -0.656981060225844350, 0.657018754758643350, 0.657056447648895150, 0.657094138896505810, 0.657131828501381190, 0.657169516463427250, 0.657207202782549290, 0.657244887458653170, -0.657282570491644960, 0.657320251881430620, 0.657357931627915230, 0.657395609731005190, 0.657433286190605930, 0.657470961006623940, 0.657508634178964100, 0.657546305707532810, -0.657583975592235690, 0.657621643832978940, 0.657659310429667740, 0.657696975382208280, 0.657734638690506750, 0.657772300354468210, 0.657809960373998970, 0.657847618749004880, -0.657885275479392020, 0.657922930565065570, 0.657960584005931940, 0.657998235801896760, 0.658035885952866330, 0.658073534458745830, 0.658111181319441570, 0.658148826534859290, -0.658186470104905390, 0.658224112029484830, 0.658261752308504030, 0.658299390941868960, 0.658337027929485560, 0.658374663271259370, 0.658412296967096580, 0.658449929016903250, -0.658487559420584900, 0.658525188178047500, 0.658562815289197250, 0.658600440753940310, 0.658638064572181770, 0.658675686743828260, 0.658713307268785410, 0.658750926146959740, -0.658788543378256320, 0.658826158962581570, 0.658863772899841440, 0.658901385189942120, 0.658938995832789140, 0.658976604828288570, 0.659014212176346480, 0.659051817876869280, -0.659089421929762160, 0.659127024334931530, 0.659164625092283570, 0.659202224201723810, 0.659239821663158420, 0.659277417476493600, 0.659315011641635420, 0.659352604158489400, -0.659390195026961940, 0.659427784246959030, 0.659465371818386830, 0.659502957741150970, 0.659540542015157770, 0.659578124640313180, 0.659615705616523500, 0.659653284943694350, -0.659690862621731930, 0.659728438650542430, 0.659766013030032020, 0.659803585760106340, 0.659841156840671680, 0.659878726271634570, 0.659916294052900200, 0.659953860184375070, -0.659991424665965280, 0.660028987497577320, 0.660066548679116630, 0.660104108210489480, 0.660141666091601960, 0.660179222322360810, 0.660216776902671110, 0.660254329832439590, -0.660291881111572110, 0.660329430739975410, 0.660366978717554680, 0.660404525044216540, 0.660442069719867190, 0.660479612744412910, 0.660517154117759240, 0.660554693839812690, -0.660592231910479440, 0.660629768329665910, 0.660667303097277610, 0.660704836213221180, 0.660742367677402910, 0.660779897489728320, 0.660817425650104040, 0.660854952158436260, -0.660892477014631390, 0.660930000218594940, 0.660967521770233550, 0.661005041669453290, 0.661042559916160790, 0.661080076510261570, 0.661117591451662160, 0.661155104740268840, -0.661192616375988030, 0.661230126358725360, 0.661267634688387340, 0.661305141364880170, 0.661342646388110580, 0.661380149757984090, 0.661417651474407120, 0.661455151537286400, -0.661492649946527460, 0.661530146702036910, 0.661567641803720960, 0.661605135251486230, 0.661642627045238350, 0.661680117184883950, 0.661717605670329220, 0.661755092501480790, -0.661792577678244290, 0.661830061200526340, 0.661867543068233370, 0.661905023281271650, 0.661942501839547280, 0.661979978742966440, 0.662017453991435740, 0.662054927584861840, -0.662092399523150130, 0.662129869806207470, 0.662167338433940600, 0.662204805406254930, 0.662242270723057190, 0.662279734384253800, 0.662317196389751510, 0.662354656739455820, -0.662392115433273480, 0.662429572471110890, 0.662467027852874700, 0.662504481578470640, 0.662541933647805230, 0.662579384060785090, 0.662616832817316870, 0.662654279917306190, -0.662691725360659790, 0.662729169147284080, 0.662766611277085800, 0.662804051749970700, 0.662841490565845400, 0.662878927724616320, 0.662916363226190410, 0.662953797070473190, -0.662991229257371420, 0.663028659786791930, 0.663066088658640580, 0.663103515872823900, 0.663140941429248400, 0.663178365327820930, 0.663215787568447230, 0.663253208151034060, -0.663290627075487800, 0.663328044341715330, 0.663365459949622480, 0.663402873899115900, 0.663440286190102200, 0.663477696822488140, 0.663515105796179450, 0.663552513111082990, -0.663589918767105270, 0.663627322764153040, 0.663664725102132260, 0.663702125780949560, 0.663739524800512020, 0.663776922160725260, 0.663814317861496140, 0.663851711902731290, -0.663889104284337450, 0.663926495006220590, 0.663963884068287440, 0.664001271470444520, 0.664038657212598920, 0.664076041294656140, 0.664113423716523380, 0.664150804478107040, -0.664188183579314080, 0.664225561020050260, 0.664262936800222530, 0.664300310919737510, 0.664337683378501960, 0.664375054176421950, 0.664412423313404330, 0.664449790789355950, -0.664487156604182670, 0.664524520757791670, 0.664561883250089250, 0.664599244080982480, 0.664636603250377210, 0.664673960758180530, 0.664711316604298940, 0.664748670788639310, -0.664786023311107700, 0.664823374171611080, 0.664860723370055970, 0.664898070906349450, 0.664935416780397360, 0.664972760992106780, 0.665010103541384230, 0.665047444428136790, -0.665084783652270420, 0.665122121213692070, 0.665159457112308730, 0.665196791348026450, 0.665234123920752210, 0.665271454830392630, 0.665308784076854790, 0.665346111660044540, -0.665383437579869170, 0.665420761836235110, 0.665458084429049520, 0.665495405358218270, 0.665532724623648650, 0.665570042225247180, 0.665607358162920940, 0.665644672436575880, -0.665681985046119310, 0.665719295991457630, 0.665756605272498140, 0.665793912889146800, 0.665831218841310580, 0.665868523128896330, 0.665905825751811230, 0.665943126709961140, -0.665980426003253250, 0.666017723631594620, 0.666055019594891330, 0.666092313893050570, 0.666129606525978970, 0.666166897493583600, 0.666204186795770760, 0.666241474432447410, -0.666278760403520410, 0.666316044708896830, 0.666353327348482850, 0.666390608322185440, 0.666427887629911670, 0.666465165271568400, 0.666502441247061930, 0.666539715556299320, -0.666576988199187430, 0.666614259175633330, 0.666651528485543430, 0.666688796128824590, 0.666726062105384100, 0.666763326415128140, 0.666800589057963800, 0.666837850033798030, -0.666875109342538020, 0.666912366984089840, 0.666949622958360800, 0.666986877265257630, 0.667024129904687620, 0.667061380876557090, 0.667098630180772870, 0.667135877817242260, -0.667173123785872240, 0.667210368086569080, 0.667247610719239990, 0.667284851683791810, 0.667322090980131840, 0.667359328608166380, 0.667396564567802610, 0.667433798858947710, -0.667471031481507990, 0.667508262435390740, 0.667545491720502810, 0.667582719336751510, 0.667619945284043000, 0.667657169562284710, 0.667694392171383380, 0.667731613111246510, -0.667768832381780310, 0.667806049982891950, 0.667843265914488390, 0.667880480176477050, 0.667917692768764340, 0.667954903691257210, 0.667992112943862850, 0.668029320526488670, -0.668066526439040740, 0.668103730681426480, 0.668140933253552950, 0.668178134155327340, 0.668215333386656170, 0.668252530947446630, 0.668289726837606010, 0.668326921057040830, -0.668364113605658390, 0.668401304483365540, 0.668438493690069800, 0.668475681225677580, 0.668512867090096050, 0.668550051283232420, 0.668587233804993960, 0.668624414655287100, -0.668661593834019240, 0.668698771341097340, 0.668735947176428920, 0.668773121339920170, 0.668810293831478720, 0.668847464651011530, 0.668884633798426000, 0.668921801273628550, -0.668958967076526580, 0.668996131207027500, 0.669033293665037830, 0.669070454450464870, 0.669107613563215800, 0.669144771003198020, 0.669181926770317960, 0.669219080864483120, -0.669256233285600580, 0.669293384033577740, 0.669330533108321140, 0.669367680509738160, 0.669404826237736120, 0.669441970292222190, 0.669479112673103120, 0.669516253380286200, -0.669553392413678620, 0.669590529773188000, 0.669627665458720660, 0.669664799470184090, 0.669701931807485940, 0.669739062470532610, 0.669776191459231620, 0.669813318773490150, -0.669850444413215730, 0.669887568378314870, 0.669924690668695090, 0.669961811284263580, 0.669998930224927850, 0.670036047490594420, 0.670073163081170930, 0.670110276996564560, -0.670147389236682820, 0.670184499801432240, 0.670221608690720450, 0.670258715904454630, 0.670295821442542290, 0.670332925304890080, 0.670370027491405620, 0.670407128001996420, -0.670444226836569010, 0.670481323995031130, 0.670518419477289850, 0.670555513283252800, 0.670592605412826730, 0.670629695865919140, 0.670666784642437340, 0.670703871742288850, -0.670740957165380400, 0.670778040911619520, 0.670815122980913610, 0.670852203373170090, 0.670889282088295790, 0.670926359126198360, 0.670963434486784970, 0.671000508169963260, -0.671037580175640080, 0.671074650503722840, 0.671111719154119050, 0.671148786126736230, 0.671185851421481130, 0.671222915038261370, 0.671259976976984700, 0.671297037237557850, -0.671334095819888230, 0.671371152723883480, 0.671408207949451220, 0.671445261496497970, 0.671482313364931690, 0.671519363554659580, 0.671556412065589360, 0.671593458897627780, -0.671630504050682590, 0.671667547524661180, 0.671704589319471190, 0.671741629435019360, 0.671778667871213540, 0.671815704627960920, 0.671852739705169450, 0.671889773102745890, -0.671926804820597750, 0.671963834858632980, 0.672000863216758340, 0.672037889894881450, 0.672074914892909940, 0.672111938210751440, 0.672148959848312690, 0.672185979805501650, -0.672222998082225520, 0.672260014678392360, 0.672297029593908800, 0.672334042828682590, 0.672371054382621350, 0.672408064255632820, 0.672445072447623750, 0.672482078958501980, -0.672519083788175040, 0.672556086936550780, 0.672593088403535930, 0.672630088189038360, 0.672667086292965900, 0.672704082715225300, 0.672741077455724650, 0.672778070514371220, -0.672815061891072990, 0.672852051585736800, 0.672889039598270400, 0.672926025928581420, 0.672963010576577700, 0.672999993542166110, 0.673036974825254600, 0.673073954425750580, -0.673110932343562120, 0.673147908578595850, 0.673184883130759970, 0.673221855999961760, 0.673258827186109300, 0.673295796689109330, 0.673332764508870030, 0.673369730645298700, -0.673406695098303420, 0.673443657867791030, 0.673480618953669620, 0.673517578355846910, 0.673554536074229880, 0.673591492108726600, 0.673628446459244580, 0.673665399125691680, -0.673702350107975080, 0.673739299406002520, 0.673776247019681640, 0.673813192948920610, 0.673850137193626190, 0.673887079753706430, 0.673924020629069090, 0.673960959819621900, -0.673997897325272040, 0.674034833145927380, 0.674071767281495650, 0.674108699731884920, 0.674145630497002050, 0.674182559576755100, 0.674219486971052050, 0.674256412679799970, -0.674293336702906920, 0.674330259040280430, 0.674367179691828690, 0.674404098657458650, 0.674441015937078390, 0.674477931530595540, 0.674514845437918180, 0.674551757658953480, -0.674588668193609300, 0.674625577041793490, 0.674662484203414010, 0.674699389678378060, 0.674736293466593580, 0.674773195567968440, 0.674810095982410600, 0.674846994709827120, -0.674883891750126310, 0.674920787103216010, 0.674957680769003420, 0.674994572747396600, 0.675031463038303300, 0.675068351641631810, 0.675105238557288990, 0.675142123785183120, -0.675179007325221960, 0.675215889177313680, 0.675252769341365240, 0.675289647817284840, 0.675326524604980440, 0.675363399704359990, 0.675400273115330680, 0.675437144837800820, -0.675474014871678020, 0.675510883216870470, 0.675547749873285360, 0.675584614840830990, 0.675621478119415310, 0.675658339708945730, 0.675695199609330220, 0.675732057820476630, -0.675768914342293360, 0.675805769174687490, 0.675842622317567090, 0.675879473770840120, 0.675916323534414890, 0.675953171608198460, 0.675990017992099120, 0.676026862686024740, -0.676063705689883500, 0.676100547003582800, 0.676137386627030600, 0.676174224560134980, 0.676211060802804020, 0.676247895354945230, 0.676284728216466680, 0.676321559387276230, -0.676358388867282280, 0.676395216656392020, 0.676432042754513630, 0.676468867161555630, 0.676505689877424990, 0.676542510902030210, 0.676579330235279050, 0.676616147877080020, -0.676652963827340190, 0.676689778085967970, 0.676726590652871440, 0.676763401527958660, 0.676800210711136940, 0.676837018202314900, 0.676873824001400170, 0.676910628108301270, -0.676947430522925390, 0.676984231245181030, 0.677021030274976070, 0.677057827612218780, 0.677094623256816690, 0.677131417208677980, 0.677168209467711170, 0.677205000033823450, -0.677241788906923100, 0.677278576086918440, 0.677315361573717630, 0.677352145367228100, 0.677388927467358130, 0.677425707874015900, 0.677462486587109720, 0.677499263606547000, -0.677536038932236130, 0.677572812564085190, 0.677609584502002480, 0.677646354745895520, 0.677683123295672600, 0.677719890151242010, 0.677756655312511840, 0.677793418779389920, -0.677830180551784340, 0.677866940629603620, 0.677903699012755160, 0.677940455701147580, 0.677977210694688860, 0.678013963993287390, 0.678050715596850710, 0.678087465505287200, -0.678124213718505060, 0.678160960236412700, 0.678197705058917630, 0.678234448185928260, 0.678271189617352780, 0.678307929353099690, 0.678344667393076420, 0.678381403737191470, -0.678418138385353030, 0.678454871337469510, 0.678491602593448540, 0.678528332153198630, 0.678565060016627860, 0.678601786183644750, 0.678638510654156810, 0.678675233428072570, -0.678711954505300640, 0.678748673885748440, 0.678785391569324600, 0.678822107555937300, 0.678858821845495060, 0.678895534437905400, 0.678932245333076940, 0.678968954530917770, -0.679005662031336720, 0.679042367834240990, 0.679079071939539420, 0.679115774347140210, 0.679152475056951870, 0.679189174068882020, 0.679225871382839190, 0.679262566998731780, -0.679299260916468190, 0.679335953135956180, 0.679372643657104260, 0.679409332479821050, 0.679446019604014180, 0.679482705029592290, 0.679519388756463560, 0.679556070784536730, -0.679592751113719420, 0.679629429743920270, 0.679666106675047450, 0.679702781907009830, 0.679739455439714810, 0.679776127273071130, 0.679812797406987190, 0.679849465841371630, -0.679886132576131950, 0.679922797611177020, 0.679959460946415130, 0.679996122581754790, 0.680032782517103970, 0.680069440752371080, 0.680106097287464960, 0.680142752122293250, -0.680179405256764680, 0.680216056690787660, 0.680252706424270710, 0.680289354457121800, 0.680326000789249320, 0.680362645420562020, 0.680399288350968300, 0.680435929580376130, -0.680472569108694140, 0.680509206935830610, 0.680545843061694520, 0.680582477486193380, 0.680619110209236160, 0.680655741230731030, 0.680692370550586960, 0.680728998168711690, -0.680765624085013840, 0.680802248299402280, 0.680838870811784850, 0.680875491622070060, 0.680912110730166660, 0.680948728135983390, 0.680985343839427880, 0.681021957840408980, -0.681058570138835200, 0.681095180734615390, 0.681131789627657190, 0.681168396817869670, 0.681205002305161010, 0.681241606089440290, 0.681278208170615130, 0.681314808548594500, -0.681351407223286800, 0.681388004194600990, 0.681424599462444820, 0.681461193026727140, 0.681497784887356460, 0.681534375044241640, 0.681570963497290520, 0.681607550246412060, -0.681644135291515020, 0.681680718632507340, 0.681717300269297890, 0.681753880201795060, 0.681790458429908040, 0.681827034953544460, 0.681863609772613290, 0.681900182887023030, -0.681936754296682770, 0.681973324001500240, 0.682009892001384400, 0.682046458296243770, 0.682083022885987320, 0.682119585770523120, 0.682156146949759900, 0.682192706423606190, -0.682229264191971160, 0.682265820254762680, 0.682302374611889580, 0.682338927263260840, 0.682375478208784520, 0.682412027448369480, 0.682448574981924350, 0.682485120809358190, -0.682521664930578860, 0.682558207345495330, 0.682594748054016320, 0.682631287056050700, 0.682667824351506640, 0.682704359940292990, 0.682740893822318400, 0.682777425997491920, -0.682813956465721520, 0.682850485226916270, 0.682887012280984810, 0.682923537627836200, 0.682960061267378290, 0.682996583199520280, 0.683033103424171230, 0.683069621941238990, -0.683106138750632750, 0.683142653852261140, 0.683179167246033110, 0.683215678931856970, 0.683252188909641680, 0.683288697179295750, 0.683325203740728580, 0.683361708593847930, -0.683398211738563080, 0.683434713174782660, 0.683471212902415860, 0.683507710921370640, 0.683544207231556180, 0.683580701832881220, 0.683617194725254730, 0.683653685908585000, -0.683690175382781100, 0.683726663147751660, 0.683763149203405970, 0.683799633549652010, 0.683836116186399060, 0.683872597113556080, 0.683909076331031260, 0.683945553838733790, -0.683982029636572400, 0.684018503724456270, 0.684054976102293600, 0.684091446769993450, 0.684127915727464790, 0.684164382974616570, 0.684200848511356980, 0.684237312337595440, -0.684273774453240560, 0.684310234858201530, 0.684346693552386530, 0.684383150535704980, 0.684419605808065380, 0.684456059369377150, 0.684492511219548460, 0.684528961358488510, -0.684565409786106470, 0.684601856502310540, 0.684638301507010110, 0.684674744800113810, 0.684711186381530950, 0.684747626251169810, 0.684784064408939570, 0.684820500854749330, -0.684856935588508020, 0.684893368610124060, 0.684929799919506750, 0.684966229516564830, 0.685002657401207800, 0.685039083573343750, 0.685075508032881860, 0.685111930779731430, -0.685148351813801290, 0.685184771135000090, 0.685221188743236900, 0.685257604638421000, 0.685294018820460930, 0.685330431289265630, 0.685366842044744410, 0.685403251086806330, -0.685439658415359810, 0.685476064030314140, 0.685512467931578270, 0.685548870119061630, 0.685585270592672490, 0.685621669352320050, 0.685658066397913600, 0.685694461729362210, -0.685730855346574410, 0.685767247249459370, 0.685803637437926270, 0.685840025911884420, 0.685876412671242220, 0.685912797715908850, 0.685949181045793940, 0.685985562660805680, -0.686021942560853580, 0.686058320745846610, 0.686094697215694050, 0.686131071970304540, 0.686167445009587370, 0.686203816333451510, 0.686240185941806470, 0.686276553834560650, -0.686312920011623360, 0.686349284472903890, 0.686385647218311520, 0.686422008247754680, 0.686458367561142760, 0.686494725158384940, 0.686531081039390760, 0.686567435204068380, -0.686603787652327550, 0.686640138384077230, 0.686676487399226820, 0.686712834697684850, 0.686749180279360830, 0.686785524144164160, 0.686821866292003480, 0.686858206722787970, -0.686894545436427030, 0.686930882432830070, 0.686967217711905500, 0.687003551273563050, 0.687039883117711580, 0.687076213244260710, 0.687112541653119080, 0.687148868344195970, -0.687185193317400800, 0.687221516572642970, 0.687257838109830990, 0.687294157928874380, 0.687330476029682450, 0.687366792412164580, 0.687403107076229420, 0.687439420021786600, -0.687475731248745390, 0.687512040757014660, 0.687548348546503710, 0.687584654617122040, 0.687620958968778950, 0.687657261601383190, 0.687693562514844150, 0.687729861709071360, -0.687766159183974100, 0.687802454939461240, 0.687838748975442280, 0.687875041291826310, 0.687911331888523160, 0.687947620765441250, 0.687983907922490420, 0.688020193359579760, -0.688056477076618880, 0.688092759073516640, 0.688129039350182330, 0.688165317906525800, 0.688201594742455680, 0.688237869857881600, 0.688274143252712860, 0.688310414926858960, -0.688346684880228770, 0.688382953112731900, 0.688419219624277660, 0.688455484414775660, 0.688491747484134550, 0.688528008832264170, 0.688564268459073700, 0.688600526364473000, -0.688636782548370570, 0.688673037010676170, 0.688709289751299190, 0.688745540770149380, 0.688781790067135360, 0.688818037642166870, 0.688854283495153210, 0.688890527626004220, -0.688926770034628540, 0.688963010720936020, 0.688999249684836280, 0.689035486926238060, 0.689071722445051100, 0.689107956241184930, 0.689144188314549040, 0.689180418665052530, -0.689216647292604900, 0.689252874197115670, 0.689289099378494470, 0.689325322836650270, 0.689361544571492790, 0.689397764582931450, 0.689433982870875980, 0.689470199435235240, -0.689506414275919080, 0.689542627392836780, 0.689578838785898320, 0.689615048455012420, 0.689651256400088840, 0.689687462621037530, 0.689723667117767110, 0.689759869890187670, -0.689796070938208490, 0.689832270261739430, 0.689868467860689450, 0.689904663734968170, 0.689940857884485340, 0.689977050309150690, 0.690013241008872960, 0.690049429983562220, -0.690085617233128000, 0.690121802757479920, 0.690157986556527050, 0.690194168630179240, 0.690230348978346010, 0.690266527600937210, 0.690302704497861800, 0.690338879669029630, -0.690375053114350550, 0.690411224833733520, 0.690447394827088390, 0.690483563094324790, 0.690519729635352690, 0.690555894450080810, 0.690592057538419350, 0.690628218900277590, -0.690664378535565730, 0.690700536444192490, 0.690736692626067960, 0.690772847081101760, 0.690808999809203740, 0.690845150810282860, 0.690881300084249080, 0.690917447631012040, -0.690953593450481800, 0.690989737542567210, 0.691025879907178230, 0.691062020544224610, 0.691098159453616300, 0.691134296635262160, 0.691170432089072360, 0.691206565814956760, -0.691242697812824440, 0.691278828082585340, 0.691314956624149210, 0.691351083437426020, 0.691387208522324830, 0.691423331878755490, 0.691459453506627960, 0.691495573405851990, -0.691531691576336870, 0.691567808017992560, 0.691603922730728570, 0.691640035714455200, 0.691676146969081420, 0.691712256494517290, 0.691748364290672440, 0.691784470357457050, -0.691820574694780090, 0.691856677302551850, 0.691892778180682070, 0.691928877329080150, 0.691964974747655950, 0.692001070436319420, 0.692037164394980420, 0.692073256623548240, -0.692109347121932950, 0.692145435890044290, 0.692181522927792340, 0.692217608235086160, 0.692253691811836050, 0.692289773657951750, 0.692325853773343320, 0.692361932157919970, -0.692398008811591750, 0.692434083734268400, 0.692470156925860340, 0.692506228386276400, 0.692542298115427000, 0.692578366113222100, 0.692614432379571100, 0.692650496914383850, -0.692686559717570540, 0.692722620789041010, 0.692758680128704670, 0.692794737736471600, 0.692830793612251640, 0.692866847755955080, 0.692902900167491120, 0.692938950846769820, -0.692974999793701250, 0.693011047008195380, 0.693047092490161610, 0.693083136239510230, 0.693119178256150880, 0.693155218539993840, 0.693191257090948640, 0.693227293908925120, -0.693263328993833810, 0.693299362345583760, 0.693335393964085390, 0.693371423849248440, 0.693407452000983300, 0.693443478419199180, 0.693479503103806460, 0.693515526054714890, -0.693551547271834880, 0.693587566755075600, 0.693623584504347470, 0.693659600519560330, 0.693695614800624580, 0.693731627347449420, 0.693767638159945240, 0.693803647238021900, -0.693839654581589800, 0.693875660190558240, 0.693911664064837620, 0.693947666204337680, 0.693983666608969040, 0.694019665278640780, 0.694055662213263420, 0.694091657412747250, -0.694127650877001570, 0.694163642605936770, 0.694199632599462930, 0.694235620857490240, 0.694271607379928210, 0.694307592166687140, 0.694343575217677200, 0.694379556532808470, -0.694415536111990690, 0.694451513955133940, 0.694487490062148490, 0.694523464432944550, 0.694559437067431730, 0.694595407965520330, 0.694631377127120310, 0.694667344552142190, -0.694703310240495480, 0.694739274192090360, 0.694775236406837470, 0.694811196884646100, 0.694847155625426760, 0.694883112629089640, 0.694919067895544920, 0.694955021424702220, -0.694990973216472070, 0.695026923270764430, 0.695062871587489810, 0.695098818166557610, 0.695134763007878460, 0.695170706111362340, 0.695206647476919850, 0.695242587104460410, -0.695278524993894420, 0.695314461145132180, 0.695350395558084090, 0.695386328232659780, 0.695422259168769540, 0.695458188366324000, 0.695494115825232680, 0.695530041545405990, -0.695565965526754320, 0.695601887769188080, 0.695637808272616680, 0.695673727036950850, 0.695709644062100560, 0.695745559347976660, 0.695781472894488440, 0.695817384701546530, -0.695853294769061210, 0.695889203096943020, 0.695925109685101350, 0.695961014533447050, 0.695996917641890090, 0.696032819010341310, 0.696068718638710000, 0.696104616526906920, -0.696140512674842450, 0.696176407082426900, 0.696212299749570000, 0.696248190676182380, 0.696284079862174550, 0.696319967307456270, 0.696355853011938140, 0.696391736975530250, -0.696427619198143440, 0.696463499679687130, 0.696499378420072150, 0.696535255419208800, 0.696571130677007490, 0.696607004193378070, 0.696642875968231160, 0.696678746001477170, -0.696714614293026500, 0.696750480842789010, 0.696786345650675320, 0.696822208716595730, 0.696858070040460960, 0.696893929622180660, 0.696929787461665560, 0.696965643558826400, -0.697001497913572690, 0.697037350525815390, 0.697073201395464580, 0.697109050522431110, 0.697144897906624710, 0.697180743547956010, 0.697216587446335520, 0.697252429601673880, -0.697288270013880830, 0.697324108682867090, 0.697359945608543090, 0.697395780790819540, 0.697431614229606200, 0.697467445924813910, 0.697503275876352970, 0.697539104084134110, -0.697574930548067180, 0.697610755268062930, 0.697646578244032200, 0.697682399475884620, 0.697718218963531030, 0.697754036706881850, 0.697789852705848030, 0.697825666960339210, -0.697861479470266220, 0.697897290235539480, 0.697933099256069830, 0.697968906531767130, 0.698004712062542220, 0.698040515848305510, 0.698076317888967850, 0.698112118184438970, -0.698147916734629950, 0.698183713539451080, 0.698219508598813210, 0.698255301912626300, 0.698291093480801090, 0.698326883303248440, 0.698362671379878290, 0.698398457710601490, -0.698434242295328470, 0.698470025133970270, 0.698505806226436650, 0.698541585572638460, 0.698577363172486310, 0.698613139025891170, 0.698648913132762780, 0.698684685493012100, -0.698720456106549760, 0.698756224973286600, 0.698791992093132590, 0.698827757465998460, 0.698863521091795060, 0.698899282970433130, 0.698935043101822640, 0.698970801485874650, -0.699006558122499570, 0.699042313011608460, 0.699078066153111190, 0.699113817546918810, 0.699149567192942190, 0.699185315091091280, 0.699221061241277140, 0.699256805643410420, -0.699292548297401950, 0.699328289203161700, 0.699364028360600740, 0.699399765769629810, 0.699435501430159760, 0.699471235342100650, 0.699506967505363340, 0.699542697919858680, -0.699578426585497630, 0.699614153502190140, 0.699649878669847290, 0.699685602088379820, 0.699721323757698580, 0.699757043677713740, 0.699792761848336280, 0.699828478269477250, -0.699864192941046630, 0.699899905862955580, 0.699935617035114750, 0.699971326457435210, 0.700007034129827010, 0.700042740052201350, 0.700078444224468740, 0.700114146646540370, -0.700149847318326300, 0.700185546239737500, 0.700221243410684920, 0.700256938831079640, 0.700292632500831620, 0.700328324419852040, 0.700364014588051640, 0.700399703005341490, -0.700435389671631770, 0.700471074586833550, 0.700506757750858020, 0.700542439163615250, 0.700578118825016420, 0.700613796734972260, 0.700649472893393970, 0.700685147300191600, -0.700720819955276460, 0.700756490858559180, 0.700792160009951040, 0.700827827409362230, 0.700863493056703810, 0.700899156951886650, 0.700934819094821910, 0.700970479485419800, -0.701006138123591470, 0.701041795009247790, 0.701077450142299940, 0.701113103522658210, 0.701148755150233670, 0.701184405024937290, 0.701220053146680230, 0.701255699515372700, -0.701291344130925860, 0.701326986993251020, 0.701362628102258360, 0.701398267457859160, 0.701433905059964280, 0.701469540908485010, 0.701505175003331540, 0.701540807344415040, -0.701576437931646700, 0.701612066764937480, 0.701647693844197780, 0.701683319169338790, 0.701718942740271580, 0.701754564556907320, 0.701790184619156320, 0.701825802926929860, -0.701861419480138920, 0.701897034278694760, 0.701932647322507600, 0.701968258611488930, 0.702003868145549830, 0.702039475924600810, 0.702075081948553060, 0.702110686217317650, -0.702146288730805870, 0.702181889488928010, 0.702217488491595380, 0.702253085738719140, 0.702288681230210380, 0.702324274965979710, 0.702359866945938220, 0.702395457169997180, -0.702431045638067800, 0.702466632350060460, 0.702502217305886580, 0.702537800505457110, 0.702573381948683460, 0.702608961635476040, 0.702644539565746240, 0.702680115739405360, -0.702715690156363930, 0.702751262816533220, 0.702786833719824420, 0.702822402866148830, 0.702857970255416850, 0.702893535887540000, 0.702929099762429340, 0.702964661879996180, -0.703000222240151130, 0.703035780842805490, 0.703071337687870330, 0.703106892775257180, 0.703142446104876530, 0.703177997676639690, 0.703213547490457950, 0.703249095546242600, -0.703284641843904270, 0.703320186383354250, 0.703355729164504060, 0.703391270187264330, 0.703426809451546340, 0.703462346957261400, 0.703497882704320790, 0.703533416692635250, -0.703568948922116190, 0.703604479392674680, 0.703640008104222340, 0.703675535056669690, 0.703711060249928130, 0.703746583683908970, 0.703782105358523700, 0.703817625273682750, -0.703853143429297830, 0.703888659825280040, 0.703924174461540760, 0.703959687337990970, 0.703995198454541840, 0.704030707811104660, 0.704066215407591070, 0.704101721243911680, -0.704137225319978020, 0.704172727635701490, 0.704208228190992940, 0.704243726985763760, 0.704279224019925150, 0.704314719293388960, 0.704350212806065690, 0.704385704557866750, -0.704421194548703560, 0.704456682778487830, 0.704492169247129980, 0.704527653954541640, 0.704563136900634320, 0.704598618085319430, 0.704634097508507580, 0.704669575170110530, -0.704705051070039560, 0.704740525208206290, 0.704775997584521360, 0.704811468198896510, 0.704846937051243240, 0.704882404141472410, 0.704917869469495420, 0.704953333035223890, -0.704988794838569240, 0.705024254879442310, 0.705059713157754730, 0.705095169673417900, 0.705130624426343560, 0.705166077416442220, 0.705201528643625730, 0.705236978107805390, -0.705272425808892930, 0.705307871746799100, 0.705343315921435510, 0.705378758332713800, 0.705414198980545360, 0.705449637864841160, 0.705485074985512830, 0.705520510342472210, -0.705555943935629930, 0.705591375764897830, 0.705626805830187220, 0.705662234131410050, 0.705697660668476830, 0.705733085441299530, 0.705768508449789560, 0.705803929693858520, -0.705839349173417400, 0.705874766888377910, 0.705910182838651590, 0.705945597024150050, 0.705981009444784150, 0.706016420100465720, 0.706051828991106410, 0.706087236116617720, -0.706122641476910620, 0.706158045071896940, 0.706193446901488110, 0.706228846965595960, 0.706264245264131450, 0.706299641797006330, 0.706335036564132320, 0.706370429565420510, -0.706405820800782620, 0.706441210270130180, 0.706476597973374920, 0.706511983910427910, 0.706547368081201000, 0.706582750485605700, 0.706618131123553760, 0.706653509994956130, -0.706688887099724770, 0.706724262437771200, 0.706759636009007370, 0.706795007813344030, 0.706830377850693250, 0.706865746120966420, 0.706901112624075620, 0.706936477359931700, -0.706971840328446620, 0.707007201529532110, 0.707042560963099480, 0.707077918629060330, 0.707113274527326420, 0.707148628657809700, 0.707183981020421020, 0.707219331615072330, -0.707254680441675390, 0.707290027500142030, 0.707325372790383320, 0.707360716312311120, 0.707396058065837270, 0.707431398050873520, 0.707466736267330920, 0.707502072715121440, -0.707537407394156830, 0.707572740304349020, 0.707608071445609110, 0.707643400817848930, 0.707678728420980560, 0.707714054254915180, 0.707749378319564530, 0.707784700614840450, -0.707820021140655010, 0.707855339896919180, 0.707890656883544910, 0.707925972100444060, 0.707961285547528570, 0.707996597224709530, 0.708031907131899120, 0.708067215269008840, -0.708102521635950890, 0.708137826232636210, 0.708173129058977110, 0.708208430114885100, 0.708243729400272470, 0.708279026915049960, 0.708314322659130080, 0.708349616632424570, -0.708384908834844840, 0.708420199266302730, 0.708455487926710200, 0.708490774815979220, 0.708526059934020960, 0.708561343280747600, 0.708596624856070890, 0.708631904659902890, -0.708667182692154900, 0.708702458952738870, 0.708737733441566760, 0.708773006158550540, 0.708808277103601610, 0.708843546276631930, 0.708878813677553340, 0.708914079306278030, -0.708949343162717290, 0.708984605246783080, 0.709019865558387470, 0.709055124097442420, 0.709090380863859230, 0.709125635857550280, 0.709160889078427340, 0.709196140526401900, -0.709231390201386260, 0.709266638103291940, 0.709301884232031440, 0.709337128587515960, 0.709372371169657570, 0.709407611978368320, 0.709442851013560300, 0.709478088275144910, -0.709513323763034220, 0.709548557477140300, 0.709583789417375210, 0.709619019583650370, 0.709654247975877950, 0.709689474593970030, 0.709724699437838670, 0.709759922507395170, -0.709795143802551930, 0.709830363323221140, 0.709865581069314190, 0.709900797040743270, 0.709936011237420230, 0.709971223659257580, 0.710006434306166610, 0.710041643178059510, -0.710076850274848240, 0.710112055596445190, 0.710147259142761670, 0.710182460913710070, 0.710217660909202240, 0.710252859129150590, 0.710288055573466530, 0.710323250242062330, -0.710358443134849970, 0.710393634251741850, 0.710428823592649250, 0.710464011157484700, 0.710499196946160260, 0.710534380958587670, 0.710569563194679120, 0.710604743654346560, -0.710639922337502620, 0.710675099244058470, 0.710710274373926530, 0.710745447727018980, 0.710780619303248100, 0.710815789102525300, 0.710850957124763090, 0.710886123369873450, -0.710921287837768870, 0.710956450528360760, 0.710991611441561420, 0.711026770577283140, 0.711061927935438210, 0.711097083515938260, 0.711132237318695460, 0.711167389343622110, -0.711202539590630620, 0.711237688059632390, 0.711272834750540040, 0.711307979663265870, 0.711343122797721490, 0.711378264153819220, 0.711413403731471330, 0.711448541530590230, -0.711483677551087550, 0.711518811792875570, 0.711553944255866600, 0.711589074939973030, 0.711624203845106610, 0.711659330971179500, 0.711694456318104240, 0.711729579885793000, -0.711764701674157510, 0.711799821683110400, 0.711834939912563640, 0.711870056362429840, 0.711905171032620520, 0.711940283923048420, 0.711975395033625840, 0.712010504364264500, -0.712045611914876810, 0.712080717685375180, 0.712115821675672000, 0.712150923885679020, 0.712186024315308640, 0.712221122964473370, 0.712256219833085510, 0.712291314921056680, -0.712326408228299730, 0.712361499754726620, 0.712396589500250200, 0.712431677464781980, 0.712466763648234470, 0.712501848050520080, 0.712536930671551440, 0.712572011511240170, -0.712607090569498780, 0.712642167846240020, 0.712677243341375610, 0.712712317054817970, 0.712747388986479600, 0.712782459136273030, 0.712817527504110090, 0.712852594089903310, -0.712887658893564870, 0.712922721915007830, 0.712957783154143600, 0.712992842610884800, 0.713027900285144070, 0.713062956176833800, 0.713098010285865840, 0.713133062612152810, -0.713168113155607130, 0.713203161916141530, 0.713238208893667740, 0.713273254088098390, 0.713308297499346210, 0.713343339127322950, 0.713378378971941450, 0.713413417033113890, -0.713448453310753130, 0.713483487804770890, 0.713518520515080020, 0.713553551441592830, 0.713588580584222030, 0.713623607942879490, 0.713658633517477940, 0.713693657307929770, -0.713728679314147740, 0.713763699536043680, 0.713798717973530560, 0.713833734626520440, 0.713868749494926400, 0.713903762578660170, 0.713938773877634600, 0.713973783391761980, -0.714008791120955280, 0.714043797065126220, 0.714078801224187650, 0.714113803598052540, 0.714148804186632510, 0.714183802989840410, 0.714218800007588860, 0.714253795239790600, -0.714288788686357590, 0.714323780347202670, 0.714358770222238150, 0.714393758311377080, 0.714428744614531320, 0.714463729131613710, 0.714498711862536770, 0.714533692807213350, -0.714568671965555290, 0.714603649337475780, 0.714638624922886990, 0.714673598721701890, 0.714708570733832650, 0.714743540959191790, 0.714778509397692610, 0.714813476049246610, -0.714848440913767090, 0.714883403991166460, 0.714918365281357550, 0.714953324784252440, 0.714988282499764090, 0.715023238427805020, 0.715058192568288060, 0.715093144921125410, -0.715128095486229800, 0.715163044263514070, 0.715197991252890960, 0.715232936454272660, 0.715267879867571900, 0.715302821492701520, 0.715337761329574270, 0.715372699378102440, -0.715407635638198870, 0.715442570109776410, 0.715477502792747240, 0.715512433687024440, 0.715547362792520400, 0.715582290109148420, 0.715617215636820240, 0.715652139375449140, -0.715687061324947640, 0.715721981485228810, 0.715756899856204720, 0.715791816437788330, 0.715826731229892490, 0.715861644232430040, 0.715896555445313170, 0.715931464868455050, -0.715966372501768090, 0.716001278345165690, 0.716036182398559600, 0.716071084661863200, 0.716105985134989020, 0.716140883817850240, 0.716175780710358810, 0.716210675812428030, -0.716245569123970970, 0.716280460644899470, 0.716315350375126950, 0.716350238314566010, 0.716385124463129850, 0.716420008820730430, 0.716454891387281130, 0.716489772162694490, -0.716524651146883800, 0.716559528339761220, 0.716594403741239730, 0.716629277351232270, 0.716664149169651930, 0.716699019196410880, 0.716733887431422190, 0.716768753874598930, -0.716803618525854060, 0.716838481385099870, 0.716873342452249430, 0.716908201727215920, 0.716943059209911640, 0.716977914900249650, 0.717012768798142910, 0.717047620903504600, -0.717082471216246910, 0.717117319736283010, 0.717152166463525860, 0.717187011397888540, 0.717221854539283440, 0.717256695887623640, 0.717291535442822090, 0.717326373204792090, -0.717361209173445920, 0.717396043348696550, 0.717430875730457160, 0.717465706318640930, 0.717500535113160030, 0.717535362113927880, 0.717570187320857530, 0.717605010733861400, -0.717639832352852890, 0.717674652177744620, 0.717709470208450220, 0.717744286444881750, 0.717779100886952510, 0.717813913534575580, 0.717848724387664230, 0.717883533446130650, -0.717918340709888250, 0.717953146178849980, 0.717987949852929240, 0.718022751732038330, 0.718057551816090430, 0.718092350104998720, 0.718127146598676490, 0.718161941297035920, -0.718196734199990640, 0.718231525307453820, 0.718266314619337760, 0.718301102135556090, 0.718335887856021540, 0.718370671780647620, 0.718405453909346740, 0.718440234242032180, -0.718475012778617030, 0.718509789519014790, 0.718544564463137640, 0.718579337610899090, 0.718614108962212230, 0.718648878516990330, 0.718683646275146030, 0.718718412236592610, -0.718753176401243030, 0.718787938769010930, 0.718822699339808580, 0.718857458113549620, 0.718892215090146890, 0.718926970269514020, 0.718961723651563410, 0.718996475236208470, -0.719031225023362590, 0.719065973012938400, 0.719100719204849300, 0.719135463599008370, 0.719170206195329120, 0.719204946993724060, 0.719239685994106480, 0.719274423196389790, -0.719309158600487390, 0.719343892206311790, 0.719378624013776390, 0.719413354022794490, 0.719448082233279500, 0.719482808645143910, 0.719517533258301370, 0.719552256072665040, -0.719586977088148340, 0.719621696304663880, 0.719656413722125190, 0.719691129340445770, 0.719725843159538250, 0.719760555179316030, 0.719795265399692520, 0.719829973820581110, -0.719864680441894440, 0.719899385263546130, 0.719934088285449360, 0.719968789507517530, 0.720003488929663590, 0.720038186551800850, 0.720072882373842700, 0.720107576395702550, -0.720142268617293250, 0.720176959038528300, 0.720211647659320890, 0.720246334479584640, 0.720281019499232290, 0.720315702718177350, 0.720350384136333570, 0.720385063753613440, -0.720419741569930610, 0.720454417585198570, 0.720489091799330630, 0.720523764212239740, 0.720558434823839410, 0.720593103634042940, 0.720627770642764180, 0.720662435849915630, -0.720697099255410920, 0.720731760859163460, 0.720766420661086980, 0.720801078661094110, 0.720835734859098460, 0.720870389255013570, 0.720905041848753040, 0.720939692640229500, -0.720974341629356810, 0.721008988816048250, 0.721043634200217550, 0.721078277781777350, 0.721112919560641610, 0.721147559536723710, 0.721182197709936750, 0.721216834080194210, -0.721251468647409520, 0.721286101411496630, 0.721320732372368050, 0.721355361529937730, 0.721389988884118980, 0.721424614434825530, 0.721459238181970220, 0.721493860125466900, -0.721528480265228870, 0.721563098601169960, 0.721597715133203030, 0.721632329861241820, 0.721666942785199720, 0.721701553904990690, 0.721736163220527250, 0.721770770731723580, -0.721805376438493300, 0.721839980340749140, 0.721874582438405190, 0.721909182731374610, 0.721943781219571480, 0.721978377902908640, 0.722012972781299830, 0.722047565854658460, -0.722082157122898580, 0.722116746585933060, 0.722151334243675610, 0.722185920096039770, 0.722220504142939480, 0.722255086384287700, 0.722289666819998070, 0.722324245449984410, -0.722358822274160370, 0.722393397292438900, 0.722427970504734060, 0.722462541910959600, 0.722497111511028360, 0.722531679304854510, 0.722566245292351250, 0.722600809473432860, -0.722635371848012080, 0.722669932416002860, 0.722704491177318830, 0.722739048131873840, 0.722773603279580960, 0.722808156620354140, 0.722842708154106780, 0.722877257880753080, -0.722911805800205860, 0.722946351912379100, 0.722980896217186530, 0.723015438714541990, 0.723049979404358560, 0.723084518286550180, 0.723119055361030830, 0.723153590627713560, -0.723188124086512230, 0.723222655737340680, 0.723257185580112650, 0.723291713614741430, 0.723326239841140970, 0.723360764259224910, 0.723395286868907190, 0.723429807670101010, -0.723464326662720310, 0.723498843846678730, 0.723533359221890440, 0.723567872788268280, 0.723602384545726670, 0.723636894494178890, 0.723671402633539350, 0.723705908963720780, -0.723740413484637690, 0.723774916196203380, 0.723809417098332130, 0.723843916190937130, 0.723878413473932230, 0.723912908947231700, 0.723947402610748410, 0.723981894464396760, -0.724016384508090360, 0.724050872741743400, 0.724085359165268730, 0.724119843778580850, 0.724154326581593290, 0.724188807574220220, 0.724223286756374820, 0.724257764127971160, -0.724292239688923090, 0.724326713439144790, 0.724361185378549430, 0.724395655507050980, 0.724430123824563510, 0.724464590331000970, 0.724499055026276760, 0.724533517910304850, -0.724567978982999410, 0.724602438244273730, 0.724636895694041990, 0.724671351332217940, 0.724705805158715850, 0.724740257173449030, 0.724774707376331430, 0.724809155767277110, -0.724843602346200270, 0.724878047113014070, 0.724912490067632700, 0.724946931209970220, 0.724981370539940610, 0.725015808057457360, 0.725050243762434540, 0.725084677654786120, -0.725119109734426280, 0.725153540001268420, 0.725187968455226710, 0.725222395096215330, 0.725256819924147590, 0.725291242938937990, 0.725325664140500150, 0.725360083528748480, -0.725394501103596380, 0.725428916864957920, 0.725463330812747160, 0.725497742946878410, 0.725532153267265060, 0.725566561773821280, 0.725600968466461050, 0.725635373345098760, -0.725669776409647690, 0.725704177660022260, 0.725738577096136320, 0.725772974717904250, 0.725807370525239470, 0.725841764518056150, 0.725876156696268590, 0.725910547059790860, -0.725944935608536460, 0.725979322342419690, 0.726013707261354950, 0.726048090365255640, 0.726082471654036170, 0.726116851127610370, 0.726151228785892890, 0.726185604628796890, -0.726219978656237000, 0.726254350868127170, 0.726288721264381600, 0.726323089844914120, 0.726357456609638800, 0.726391821558469930, 0.726426184691321810, 0.726460546008107830, -0.726494905508742520, 0.726529263193139930, 0.726563619061214580, 0.726597973112879770, 0.726632325348050110, 0.726666675766639900, 0.726701024368562650, 0.726735371153732880, -0.726769716122064760, 0.726804059273472580, 0.726838400607869970, 0.726872740125171330, 0.726907077825290850, 0.726941413708142910, 0.726975747773641270, 0.727010080021700200, -0.727044410452233890, 0.727078739065156960, 0.727113065860382820, 0.727147390837825980, 0.727181713997400610, 0.727216035339021350, 0.727250354862601700, 0.727284672568056180, -0.727318988455299300, 0.727353302524244570, 0.727387614774806620, 0.727421925206899630, 0.727456233820438110, 0.727490540615335800, 0.727524845591506990, 0.727559148748866180, -0.727593450087327680, 0.727627749606805320, 0.727662047307213620, 0.727696343188466770, 0.727730637250479370, 0.727764929493165070, 0.727799219916438480, 0.727833508520213890, -0.727867795304405710, 0.727902080268927780, 0.727936363413694610, 0.727970644738620940, 0.728004924243620290, 0.728039201928607270, 0.728073477793496400, 0.728107751838201980, -0.728142024062637950, 0.728176294466718830, 0.728210563050359030, 0.728244829813473160, 0.728279094755974850, 0.728313357877778840, 0.728347619178799420, 0.728381878658951100, -0.728416136318148060, 0.728450392156304470, 0.728484646173334970, 0.728518898369154180, 0.728553148743675830, 0.728587397296814540, 0.728621644028484840, 0.728655888938601230, -0.728690132027077660, 0.728724373293828780, 0.728758612738769300, 0.728792850361812960, 0.728827086162874500, 0.728861320141868330, 0.728895552298709060, 0.728929782633310760, -0.728964011145587950, 0.728998237835455030, 0.729032462702826840, 0.729066685747617240, 0.729100906969740950, 0.729135126369112370, 0.729169343945646250, 0.729203559699256540, -0.729237773629857870, 0.729271985737364740, 0.729306196021692000, 0.729340404482753390, 0.729374611120463870, 0.729408815934738050, 0.729443018925489910, 0.729477220092634270, -0.729511419436085550, 0.729545616955758590, 0.729579812651567240, 0.729614006523426450, 0.729648198571250520, 0.729682388794954510, 0.729716577194452150, 0.729750763769658420, -0.729784948520487700, 0.729819131446854950, 0.729853312548674030, 0.729887491825859880, 0.729921669278327020, 0.729955844905990190, 0.729990018708763570, 0.730024190686561880, -0.730058360839299980, 0.730092529166891820, 0.730126695669252480, 0.730160860346296350, 0.730195023197938280, 0.730229184224092330, 0.730263343424673580, 0.730297500799596320, -0.730331656348775730, 0.730365810072125640, 0.730399961969561030, 0.730434112040996510, 0.730468260286347040, 0.730502406705526570, 0.730536551298450190, 0.730570694065032390, -0.730604835005188020, 0.730638974118831390, 0.730673111405877320, 0.730707246866240450, 0.730741380499835720, 0.730775512306577340, 0.730809642286380120, 0.730843770439159050, -0.730877896764828390, 0.730912021263302790, 0.730946143934497310, 0.730980264778326670, 0.731014383794705180, 0.731048500983547570, 0.731082616344768790, 0.731116729878283800, -0.731150841584006670, 0.731184951461852470, 0.731219059511735820, 0.731253165733571910, 0.731287270127274680, 0.731321372692759320, 0.731355473429940560, 0.731389572338733360, -0.731423669419051900, 0.731457764670811360, 0.731491858093926690, 0.731525949688312080, 0.731560039453882590, 0.731594127390552960, 0.731628213498238370, 0.731662297776852880, -0.731696380226311670, 0.731730460846529480, 0.731764539637421500, 0.731798616598901890, 0.731832691730885610, 0.731866765033287740, 0.731900836506023220, 0.731934906149006360, -0.731968973962152100, 0.732003039945375520, 0.732037104098591570, 0.732071166421714550, 0.732105226914659620, 0.732139285577342090, 0.732173342409675800, 0.732207397411576370, -0.732241450582958310, 0.732275501923736920, 0.732309551433826480, 0.732343599113142170, 0.732377644961598960, 0.732411688979111910, 0.732445731165595190, 0.732479771520964330, -0.732513810045133940, 0.732547846738019310, 0.732581881599534750, 0.732615914629595630, 0.732649945828116600, 0.732683975195013050, 0.732718002730199160, 0.732752028433590440, -0.732786052305101520, 0.732820074344647800, 0.732854094552143560, 0.732888112927504220, 0.732922129470644720, 0.732956144181479700, 0.732990157059924320, 0.733024168105893550, -0.733058177319302560, 0.733092184700065990, 0.733126190248098770, 0.733160193963316220, 0.733194195845633390, 0.733228195894964910, 0.733262194111225840, 0.733296190494331260, -0.733330185044196560, 0.733364177760736040, 0.733398168643865200, 0.733432157693498790, 0.733466144909552420, 0.733500130291940280, 0.733534113840577870, 0.733568095555380490, -0.733602075436262440, 0.733636053483139430, 0.733670029695926100, 0.733704004074538060, 0.733737976618889620, 0.733771947328896390, 0.733805916204473220, 0.733839883245535620, -0.733873848451997880, 0.733907811823775620, 0.733941773360783810, 0.733975733062937950, 0.734009690930152340, 0.734043646962342590, 0.734077601159423660, 0.734111553521310970, -0.734145504047919230, 0.734179452739163630, 0.734213399594959790, 0.734247344615222010, 0.734281287799865900, 0.734315229148806650, 0.734349168661959650, 0.734383106339239310, -0.734417042180561360, 0.734450976185840760, 0.734484908354992920, 0.734518838687932550, 0.734552767184575180, 0.734586693844835770, 0.734620618668629930, 0.734654541655872300, -0.734688462806478260, 0.734722382120363230, 0.734756299597442370, 0.734790215237630440, 0.734824129040843040, 0.734858041006995700, 0.734891951136002810, 0.734925859427780100, -0.734959765882242880, 0.734993670499306310, 0.735027573278885460, 0.735061474220895630, 0.735095373325251990, 0.735129270591870390, 0.735163166020665120, 0.735197059611552130, -0.735230951364446380, 0.735264841279263500, 0.735298729355918330, 0.735332615594326280, 0.735366499994402730, 0.735400382556063210, 0.735434263279222460, 0.735468142163796080, -0.735502019209699260, 0.735535894416847640, 0.735569767785156150, 0.735603639314540200, 0.735637509004915310, 0.735671376856196440, 0.735705242868299190, 0.735739107041138760, -0.735772969374630880, 0.735806829868690280, 0.735840688523232590, 0.735874545338173200, 0.735908400313427750, 0.735942253448911070, 0.735976104744538560, 0.736009954200225970, -0.736043801815888690, 0.736077647591441670, 0.736111491526800550, 0.736145333621880620, 0.736179173876597700, 0.736213012290866550, 0.736246848864602900, 0.736280683597722360, -0.736314516490139900, 0.736348347541771030, 0.736382176752531370, 0.736416004122336540, 0.736449829651101400, 0.736483653338741770, 0.736517475185172850, 0.736551295190310710, -0.736585113354069950, 0.736618929676366330, 0.736652744157115460, 0.736686556796233070, 0.736720367593633910, 0.736754176549233920, 0.736787983662948510, 0.736821788934693300, -0.736855592364383360, 0.736889393951934530, 0.736923193697262450, 0.736956991600282050, 0.736990787660909200, 0.737024581879059390, 0.737058374254648490, 0.737092164787591320, -0.737125953477803740, 0.737159740325201260, 0.737193525329699620, 0.737227308491213980, 0.737261089809660100, 0.737294869284953470, 0.737328646917009940, 0.737362422705744480, -0.737396196651073030, 0.737429968752911000, 0.737463739011174350, 0.737497507425778130, 0.737531273996638090, 0.737565038723669850, 0.737598801606789370, 0.737632562645911590, -0.737666321840952380, 0.737700079191827670, 0.737733834698452440, 0.737767588360742630, 0.737801340178613870, 0.737835090151982120, 0.737868838280762220, 0.737902584564870230, -0.737936329004221900, 0.737970071598732960, 0.738003812348318580, 0.738037551252894610, 0.738071288312376780, 0.738105023526681060, 0.738138756895722500, 0.738172488419416960, -0.738206218097680280, 0.738239945930428300, 0.738273671917576200, 0.738307396059039940, 0.738341118354735480, 0.738374838804577880, 0.738408557408483210, 0.738442274166367100, -0.738475989078145710, 0.738509702143734010, 0.738543413363047960, 0.738577122736003510, 0.738610830262516500, 0.738644535942502010, 0.738678239775876320, 0.738711941762554950, -0.738745641902454060, 0.738779340195488850, 0.738813036641575160, 0.738846731240628940, 0.738880423992566150, 0.738914114897302080, 0.738947803954752680, 0.738981491164834030, -0.739015176527461400, 0.739048860042550770, 0.739082541710018080, 0.739116221529779290, 0.739149899501749590, 0.739183575625845250, 0.739217249901981900, 0.739250922330075830, -0.739284592910042000, 0.739318261641796810, 0.739351928525255890, 0.739385593560335510, 0.739419256746950750, 0.739452918085018010, 0.739486577574452800, 0.739520235215171520, -0.739553891007089350, 0.739587544950122470, 0.739621197044187050, 0.739654847289198280, 0.739688495685072440, 0.739722142231725280, 0.739755786929073180, 0.739789429777031220, -0.739823070775515790, 0.739856709924442520, 0.739890347223727930, 0.739923982673287070, 0.739957616273036360, 0.739991248022891510, 0.740024877922768830, 0.740058505972583710, -0.740092132172252340, 0.740125756521690660, 0.740159379020814740, 0.740192999669540220, 0.740226618467783150, 0.740260235415459600, 0.740293850512485640, 0.740327463758776780, -0.740361075154249320, 0.740394684698819530, 0.740428292392402600, 0.740461898234915040, 0.740495502226272690, 0.740529104366391850, 0.740562704655188030, 0.740596303092577400, -0.740629899678476030, 0.740663494412800110, 0.740697087295465240, 0.740730678326387610, 0.740764267505483410, 0.740797854832668690, 0.740831440307859190, 0.740865023930970870, -0.740898605701920230, 0.740932185620623240, 0.740965763686995520, 0.740999339900953350, 0.741032914262413240, 0.741066486771290390, 0.741100057427501400, 0.741133626230962240, -0.741167193181589410, 0.741200758279298210, 0.741234321524005150, 0.741267882915626290, 0.741301442454078030, 0.741335000139275780, 0.741368555971136050, 0.741402109949575010, -0.741435662074508950, 0.741469212345853390, 0.741502760763524950, 0.741536307327439470, 0.741569852037513580, 0.741603394893662670, 0.741636935895803370, 0.741670475043851970, -0.741704012337724090, 0.741737547777336250, 0.741771081362604500, 0.741804613093445360, 0.741838142969774350, 0.741871670991508080, 0.741905197158562510, 0.741938721470854270, -0.741972243928298970, 0.742005764530813130, 0.742039283278312700, 0.742072800170714530, 0.742106315207933910, 0.742139828389887570, 0.742173339716491690, 0.742206849187662780, -0.742240356803316350, 0.742273862563369140, 0.742307366467737100, 0.742340868516337070, 0.742374368709084690, 0.742407867045896230, 0.742441363526688440, 0.742474858151376930, -0.742508350919878210, 0.742541841832108700, 0.742575330887984890, 0.742608818087422410, 0.742642303430337880, 0.742675786916647710, 0.742709268546268180, 0.742742748319115350, -0.742776226235105530, 0.742809702294155220, 0.742843176496180920, 0.742876648841098390, 0.742910119328824230, 0.742943587959274840, 0.742977054732366640, 0.743010519648015680, -0.743043982706138250, 0.743077443906651200, 0.743110903249470270, 0.743144360734512070, 0.743177816361693000, 0.743211270130929690, 0.743244722042137870, 0.743278172095234390, -0.743311620290135310, 0.743345066626757480, 0.743378511105016740, 0.743411953724829820, 0.743445394486112800, 0.743478833388782730, 0.743512270432755250, 0.743545705617947080, -0.743579138944274740, 0.743612570411654740, 0.743646000020003030, 0.743679427769236350, 0.743712853659271420, 0.743746277690023990, 0.743779699861410900, 0.743813120173348550, -0.743846538625753780, 0.743879955218542220, 0.743913369951630930, 0.743946782824936090, 0.743980193838374660, 0.744013602991862370, 0.744047010285316170, 0.744080415718652350, -0.744113819291787880, 0.744147221004638480, 0.744180620857121110, 0.744214018849152170, 0.744247414980648500, 0.744280809251525950, 0.744314201661701370, 0.744347592211091590, -0.744380980899612580, 0.744414367727181060, 0.744447752693713550, 0.744481135799127110, 0.744514517043337490, 0.744547896426261510, 0.744581273947815920, 0.744614649607917340, -0.744648023406481840, 0.744681395343426260, 0.744714765418667210, 0.744748133632121560, 0.744781499983705350, 0.744814864473335340, 0.744848227100928130, 0.744881587866400690, -0.744914946769668960, 0.744948303810649910, 0.744981658989260050, 0.745015012305416340, 0.745048363759034830, 0.745081713350032370, 0.745115061078325920, 0.745148406943831660, -0.745181750946466210, 0.745215093086146420, 0.745248433362789230, 0.745281771776310720, 0.745315108326627730, 0.745348443013656880, 0.745381775837315350, 0.745415106797518990, -0.745448435894184860, 0.745481763127229690, 0.745515088496570440, 0.745548412002123070, 0.745581733643804760, 0.745615053421532110, 0.745648371335222100, 0.745681687384790900, -0.745715001570155470, 0.745748313891232750, 0.745781624347939040, 0.745814932940191190, 0.745848239667906030, 0.745881544531000640, 0.745914847529391080, 0.745948148662994410, -0.745981447931727270, 0.746014745335506820, 0.746048040874249360, 0.746081334547871620, 0.746114626356290670, 0.746147916299423450, 0.746181204377186050, 0.746214490589495630, -0.746247774936269040, 0.746281057417423340, 0.746314338032874720, 0.746347616782540140, 0.746380893666336860, 0.746414168684181090, 0.746447441835989880, 0.746480713121680070, -0.746513982541168850, 0.746547250094372170, 0.746580515781207540, 0.746613779601591590, 0.746647041555441370, 0.746680301642673410, 0.746713559863204650, 0.746746816216951940, -0.746780070703832570, 0.746813323323762710, 0.746846574076659440, 0.746879822962439820, 0.746913069981020920, 0.746946315132319020, 0.746979558416251410, 0.747012799832734830, -0.747046039381686570, 0.747079277063022910, 0.747112512876661140, 0.747145746822518330, 0.747178978900510880, 0.747212209110555970, 0.747245437452570440, 0.747278663926471690, -0.747311888532176010, 0.747345111269600570, 0.747378332138662340, 0.747411551139278600, 0.747444768271365630, 0.747477983534840850, 0.747511196929621090, 0.747544408455623530, -0.747577618112764800, 0.747610825900961950, 0.747644031820131950, 0.747677235870192300, 0.747710438051059190, 0.747743638362650010, 0.747776836804882050, 0.747810033377671710, -0.747843228080936170, 0.747876420914592720, 0.747909611878558420, 0.747942800972749900, 0.747975988197084220, 0.748009173551478670, 0.748042357035850420, 0.748075538650116110, -0.748108718394192800, 0.748141896267997760, 0.748175072271448300, 0.748208246404460820, 0.748241418666952820, 0.748274589058841140, 0.748307757580043310, 0.748340924230475930, -0.748374089010056090, 0.748407251918701390, 0.748440412956328240, 0.748473572122854040, 0.748506729418195850, 0.748539884842271300, 0.748573038394996670, 0.748606190076289370, -0.748639339886066680, 0.748672487824245890, 0.748705633890743630, 0.748738778085477170, 0.748771920408363930, 0.748805060859321080, 0.748838199438265350, 0.748871336145114030, -0.748904470979784410, 0.748937603942194000, 0.748970735032259190, 0.749003864249897510, 0.749036991595026570, 0.749070117067562770, 0.749103240667423730, 0.749136362394526520, -0.749169482248788770, 0.749202600230126970, 0.749235716338458760, 0.749268830573701190, 0.749301942935771900, 0.749335053424587280, 0.749368162040065290, 0.749401268782122650, -0.749434373650677330, 0.749467476645645610, 0.749500577766945340, 0.749533677014493580, 0.749566774388207850, 0.749599869888004980, 0.749632963513802380, 0.749666055265517440, -0.749699145143067570, 0.749732233146369610, 0.749765319275341070, 0.749798403529899460, 0.749831485909961630, 0.749864566415444970, 0.749897645046266990, 0.749930721802345210, -0.749963796683596250, 0.749996869689937840, 0.750029940821287270, 0.750063010077562150, 0.750096077458679120, 0.750129142964556020, 0.750162206595110010, 0.750195268350258740, -0.750228328229919030, 0.750261386234008510, 0.750294442362444580, 0.750327496615144750, 0.750360548992025980, 0.750393599493005770, 0.750426648118001860, 0.750459694866930980, -0.750492739739710980, 0.750525782736259030, 0.750558823856492970, 0.750591863100329550, 0.750624900467686480, 0.750657935958481070, 0.750690969572631260, 0.750724001310053680, -0.750757031170666060, 0.750790059154385900, 0.750823085261130840, 0.750856109490817820, 0.750889131843364590, 0.750922152318688420, 0.750955170916707160, 0.750988187637337660, -0.751021202480497860, 0.751054215446105180, 0.751087226534076780, 0.751120235744330180, 0.751153243076783110, 0.751186248531353180, 0.751219252107957370, 0.751252253806513390, -0.751285253626938760, 0.751318251569151330, 0.751351247633067930, 0.751384241818606520, 0.751417234125684400, 0.751450224554219500, 0.751483213104128800, 0.751516199775330020, -0.751549184567740780, 0.751582167481278820, 0.751615148515861200, 0.751648127671405650, 0.751681104947829800, 0.751714080345051490, 0.751747053862987680, 0.751780025501556310, -0.751812995260675130, 0.751845963140261090, 0.751878929140232240, 0.751911893260506000, 0.751944855501000430, 0.751977815861632260, 0.752010774342319670, 0.752043730942980160, -0.752076685663531470, 0.752109638503890900, 0.752142589463976270, 0.752175538543705110, 0.752208485742995370, 0.752241431061764110, 0.752274374499929290, 0.752307316057408530, -0.752340255734119780, 0.752373193529980220, 0.752406129444907480, 0.752439063478819840, 0.752471995631634140, 0.752504925903268560, 0.752537854293640620, 0.752570780802668370, -0.752603705430268780, 0.752636628176360010, 0.752669549040859700, 0.752702468023685680, 0.752735385124755350, 0.752768300343986450, 0.752801213681296820, 0.752834125136604530, -0.752867034709826520, 0.752899942400880980, 0.752932848209685650, 0.752965752136158350, 0.752998654180216500, 0.753031554341777930, 0.753064452620760830, 0.753097349017082250, -0.753130243530660270, 0.753163136161412840, 0.753196026909257690, 0.753228915774112330, 0.753261802755894600, 0.753294687854522360, 0.753327571069913660, 0.753360452401985790, -0.753393331850656820, 0.753426209415844370, 0.753459085097466840, 0.753491958895441290, 0.753524830809685800, 0.753557700840118190, 0.753590568986656770, 0.753623435249218490, -0.753656299627721630, 0.753689162122084370, 0.753722022732223880, 0.753754881458058470, 0.753787738299505740, 0.753820593256483980, 0.753853446328910380, 0.753886297516703220, -0.753919146819780340, 0.753951994238059810, 0.753984839771459030, 0.754017683419896170, 0.754050525183289080, 0.754083365061556040, 0.754116203054614240, 0.754149039162381960, -0.754181873384777050, 0.754214705721717780, 0.754247536173121350, 0.754280364738906250, 0.754313191418990110, 0.754346016213291340, 0.754378839121727210, 0.754411660144215900, -0.754444479280675930, 0.754477296531024360, 0.754510111895179580, 0.754542925373059450, 0.754575736964582360, 0.754608546669665590, 0.754641354488227560, 0.754674160420185980, -0.754706964465459370, 0.754739766623965140, 0.754772566895621440, 0.754805365280346250, 0.754838161778057960, 0.754870956388674070, 0.754903749112112780, 0.754936539948292020, -0.754969328897130200, 0.755002115958544830, 0.755034901132454190, 0.755067684418776590, 0.755100465817429400, 0.755133245328331150, 0.755166022951399670, 0.755198798686553490, -0.755231572533710090, 0.755264344492787680, 0.755297114563704410, 0.755329882746378580, 0.755362649040727810, 0.755395413446670490, 0.755428175964124590, 0.755460936593008500, -0.755493695333239850, 0.755526452184736910, 0.755559207147417870, 0.755591960221201010, 0.755624711406004070, 0.755657460701745330, 0.755690208108343200, 0.755722953625715290, -0.755755697253780000, 0.755788438992455400, 0.755821178841660110, 0.755853916801311530, 0.755886652871328060, 0.755919387051628090, 0.755952119342129910, 0.755984849742751040, -0.756017578253410210, 0.756050304874025360, 0.756083029604515010, 0.756115752444796780, 0.756148473394789300, 0.756181192454410510, 0.756213909623579040, 0.756246624902212620, -0.756279338290229530, 0.756312049787548070, 0.756344759394086850, 0.756377467109763390, 0.756410172934496310, 0.756442876868204110, 0.756475578910804410, 0.756508279062215630, -0.756540977322356260, 0.756573673691144810, 0.756606368168498800, 0.756639060754336850, 0.756671751448577350, 0.756704440251138700, 0.756737127161938640, 0.756769812180895670, -0.756802495307928310, 0.756835176542954740, 0.756867855885893110, 0.756900533336662520, 0.756933208895179900, 0.756965882561364320, 0.756998554335134080, 0.757031224216407450, -0.757063892205102730, 0.757096558301138310, 0.757129222504433040, 0.757161884814904100, 0.757194545232470540, 0.757227203757050550, 0.757259860388562520, 0.757292515126924970, -0.757325167972055960, 0.757357818923874220, 0.757390467982298370, 0.757423115147245810, 0.757455760418635380, 0.757488403796385710, 0.757521045280414970, 0.757553684870641560, -0.757586322566983990, 0.757618958369360550, 0.757651592277690410, 0.757684224291890640, 0.757716854411880410, 0.757749482637577910, 0.757782108968901750, 0.757814733405770320, -0.757847355948102040, 0.757879976595815960, 0.757912595348829270, 0.757945212207061240, 0.757977827170430050, 0.758010440238854440, 0.758043051412252700, 0.758075660690543220, -0.758108268073644620, 0.758140873561476080, 0.758173477153954670, 0.758206078850999440, 0.758238678652529140, 0.758271276558462160, 0.758303872568717010, 0.758336466683212200, -0.758369058901866680, 0.758401649224597960, 0.758434237651325120, 0.758466824181966760, 0.758499408816441290, 0.758531991554667330, 0.758564572396563270, 0.758597151342047970, -0.758629728391040260, 0.758662303543457650, 0.758694876799219320, 0.758727448158243780, 0.758760017620449530, 0.758792585185755430, 0.758825150854079760, 0.758857714625341130, -0.758890276499458950, 0.758922836476350390, 0.758955394555934750, 0.758987950738130630, 0.759020505022856670, 0.759053057410031480, 0.759085607899573580, 0.759118156491402240, -0.759150703185434980, 0.759183247981590980, 0.759215790879788740, 0.759248331879947110, 0.759280870981984600, 0.759313408185819940, 0.759345943491371740, 0.759378476898559310, -0.759411008407300140, 0.759443538017513410, 0.759476065729117740, 0.759508591542031990, 0.759541115456174860, 0.759573637471464780, 0.759606157587820690, 0.759638675805161760, -0.759671192123405610, 0.759703706542471440, 0.759736219062277950, 0.759768729682744000, 0.759801238403788100, 0.759833745225329200, 0.759866250147286590, 0.759898753169577670, -0.759931254292121830, 0.759963753514838030, 0.759996250837644660, 0.760028746260460690, 0.760061239783204940, 0.760093731405796060, 0.760126221128153420, 0.760158708950194660, -0.760191194871839170, 0.760223678893005570, 0.760256161013612820, 0.760288641233579750, 0.760321119552825000, 0.760353595971268060, 0.760386070488826560, 0.760418543105419900, -0.760451013820966800, 0.760483482635386230, 0.760515949548596910, 0.760548414560517800, 0.760580877671067520, 0.760613338880165690, 0.760645798187730040, 0.760678255593679740, -0.760710711097933870, 0.760743164700411260, 0.760775616401030640, 0.760808066199711090, 0.760840514096371320, 0.760872960090930860, 0.760905404183307430, 0.760937846373420430, -0.760970286661188820, 0.761002725046531550, 0.761035161529367450, 0.761067596109615390, 0.761100028787194960, 0.761132459562023910, 0.761164888434021750, 0.761197315403107310, -0.761229740469199560, 0.761262163632217440, 0.761294584892080020, 0.761327004248706030, 0.761359421702015090, 0.761391837251925160, 0.761424250898355530, 0.761456662641225250, -0.761489072480453390, 0.761521480415958800, 0.761553886447660530, 0.761586290575478220, 0.761618692799329480, 0.761651093119134040, 0.761683491534810850, 0.761715888046278880, -0.761748282653457290, 0.761780675356264920, 0.761813066154620970, 0.761845455048444810, 0.761877842037654520, 0.761910227122169600, 0.761942610301909130, 0.761974991576792050, -0.762007370946737540, 0.762039748411664660, 0.762072123971492380, 0.762104497626140300, 0.762136869375526490, 0.762169239219570470, 0.762201607158191300, 0.762233973191308150, -0.762266337318840080, 0.762298699540706170, 0.762331059856826140, 0.762363418267117840, 0.762395774771501000, 0.762428129369894680, 0.762460482062218060, 0.762492832848390200, -0.762525181728330280, 0.762557528701957480, 0.762589873769191410, 0.762622216929950030, 0.762654558184153180, 0.762686897531719810, 0.762719234972569330, 0.762751570506620680, -0.762783904133793160, 0.762816235854005820, 0.762848565667178510, 0.762880893573229190, 0.762913219572077580, 0.762945543663642980, 0.762977865847844550, 0.763010186124601360, -0.763042504493832820, 0.763074820955458530, 0.763107135509396680, 0.763139448155566890, 0.763171758893888550, 0.763204067724280840, 0.763236374646662830, 0.763268679660954020, -0.763300982767073480, 0.763333283964941050, 0.763365583254474790, 0.763397880635594660, 0.763430176108219730, 0.763462469672269380, 0.763494761327662920, 0.763527051074319510, -0.763559338912159100, 0.763591624841099660, 0.763623908861061240, 0.763656190971963020, 0.763688471173724400, 0.763720749466264560, 0.763753025849502780, 0.763785300323358450, -0.763817572887751430, 0.763849843542599990, 0.763882112287823880, 0.763914379123342590, 0.763946644049075200, 0.763978907064941310, 0.764011168170860120, 0.764043427366751020, -0.764075684652533840, 0.764107940028126990, 0.764140193493450190, 0.764172445048422970, 0.764204694692964700, 0.764236942426994580, 0.764269188250432220, 0.764301432163197350, -0.764333674165208370, 0.764365914256385230, 0.764398152436647220, 0.764430388705913950, 0.764462623064104620, 0.764494855511138720, 0.764527086046935760, 0.764559314671415580, -0.764591541384496590, 0.764623766186098730, 0.764655989076141520, 0.764688210054544240, 0.764720429121226510, 0.764752646276107620, 0.764784861519107180, 0.764817074850145160, -0.764849286269139840, 0.764881495776011390, 0.764913703370679100, 0.764945909053062590, 0.764978112823081370, 0.765010314680654720, 0.765042514625702940, 0.765074712658144310, -0.765106908777898890, 0.765139102984886190, 0.765171295279025830, 0.765203485660237100, 0.765235674128439740, 0.765267860683553120, 0.765300045325497450, 0.765332228054191100, -0.765364408869554260, 0.765396587771506320, 0.765428764759966910, 0.765460939834855520, 0.765493112996091910, 0.765525284243596000, 0.765557453577286440, 0.765589620997083050, -0.765621786502905800, 0.765653950094673960, 0.765686111772307280, 0.765718271535725360, 0.765750429384847720, 0.765782585319594530, 0.765814739339884310, 0.765846891445637330, -0.765879041636773120, 0.765911189913211170, 0.765943336274871430, 0.765975480721673210, 0.766007623253536330, 0.766039763870380970, 0.766071902572125650, 0.766104039358690540, -0.766136174229995360, 0.766168307185959740, 0.766200438226503300, 0.766232567351545880, 0.766264694561007540, 0.766296819854806910, 0.766328943232864160, 0.766361064695099130, -0.766393184241431440, 0.766425301871780710, 0.766457417586066780, 0.766489531384209280, 0.766521643266128590, 0.766553753231743240, 0.766585861280973390, 0.766617967413739000, -0.766650071629959570, 0.766682173929555070, 0.766714274312445100, 0.766746372778549400, 0.766778469327788370, 0.766810563960080630, 0.766842656675346460, 0.766874747473505700, -0.766906836354477980, 0.766938923318183250, 0.766971008364541130, 0.767003091493472120, 0.767035172704894740, 0.767067251998729490, 0.767099329374896110, 0.767131404833314430, -0.767163478373904200, 0.767195549996585240, 0.767227619701277510, 0.767259687487901190, 0.767291753356375120, 0.767323817306619690, 0.767355879338554650, 0.767387939452100040, -0.767419997647175500, 0.767452053923700970, 0.767484108281596860, 0.767516160720781880, 0.767548211241176560, 0.767580259842700730, 0.767612306525274240, 0.767644351288816920, -0.767676394133248730, 0.767708435058489620, 0.767740474064460000, 0.767772511151078580, 0.767804546318265890, 0.767836579565941870, 0.767868610894026360, 0.767900640302439320, -0.767932667791100700, 0.767964693359930340, 0.767996717008848860, 0.768028738737775110, 0.768060758546629360, 0.768092776435331800, 0.768124792403802380, 0.768156806451960830, -0.768188818579727320, 0.768220828787022360, 0.768252837073764680, 0.768284843439875020, 0.768316847885273210, 0.768348850409879210, 0.768380851013613200, 0.768412849696395010, -0.768444846458144700, 0.768476841298782800, 0.768508834218228240, 0.768540825216401660, 0.768572814293222990, 0.768604801448612210, 0.768636786682489580, 0.768668769994774850, -0.768700751385388180, 0.768732730854250310, 0.768764708401279970, 0.768796684026397890, 0.768828657729524020, 0.768860629510578650, 0.768892599369481620, 0.768924567306153110, -0.768956533320513720, 0.768988497412482540, 0.769020459581979950, 0.769052419828926360, 0.769084378153241600, 0.769116334554845960, 0.769148289033659500, 0.769180241589602300, -0.769212192222595070, 0.769244140932556770, 0.769276087719408030, 0.769308032583069230, 0.769339975523460230, 0.769371916540501410, 0.769403855634112730, 0.769435792804214920, -0.769467728050727160, 0.769499661373570070, 0.769531592772663810, 0.769563522247928570, 0.769595449799284510, 0.769627375426651830, 0.769659299129950680, 0.769691220909101910, -0.769723140764024480, 0.769755058694639230, 0.769786974700866320, 0.769818888782625940, 0.769850800939838380, 0.769882711172423790, 0.769914619480302490, 0.769946525863395070, -0.769978430321620940, 0.770010332854900610, 0.770042233463154480, 0.770074132146302830, 0.770106028904265830, 0.770137923736963660, 0.770169816644317380, 0.770201707626245850, -0.770233596682670110, 0.770265483813510450, 0.770297369018686950, 0.770329252298120220, 0.770361133651730200, 0.770393013079437420, 0.770424890581162590, 0.770456766156825010, -0.770488639806345520, 0.770520511529644400, 0.770552381326642060, 0.770584249197258760, 0.770616115141414810, 0.770647979159031160, 0.770679841250026980, 0.770711701414323210, -0.770743559651840270, 0.770775415962498320, 0.770807270346217770, 0.770839122802919220, 0.770870973332522750, 0.770902821934949410, 0.770934668610118500, 0.770966513357950860, -0.770998356178366980, 0.771030197071287170, 0.771062036036631930, 0.771093873074321530, 0.771125708184276500, 0.771157541366417790, 0.771189372620664670, 0.771221201946938000, -0.771253029345158380, 0.771284854815246220, 0.771316678357121920, 0.771348499970705870, 0.771380319655919240, 0.771412137412681220, 0.771443953240912750, 0.771475767140534450, -0.771507579111466830, 0.771539389153630180, 0.771571197266945010, 0.771603003451331930, 0.771634807706711890, 0.771666610033004190, 0.771698410430130100, 0.771730208898009920, -0.771762005436564150, 0.771793800045713410, 0.771825592725378210, 0.771857383475478940, 0.771889172295936900, 0.771920959186671360, 0.771952744147603290, 0.771984527178653510, -0.772016308279742320, 0.772048087450790340, 0.772079864691718190, 0.772111640002446920, 0.772143413382896050, 0.772175184832986530, 0.772206954352639200, 0.772238721941774340, -0.772270487600312800, 0.772302251328174980, 0.772334013125281490, 0.772365772991553620, 0.772397530926910660, 0.772429286931273880, 0.772461041004563920, 0.772492793146701380, -0.772524543357606900, 0.772556291637200960, 0.772588037985404870, 0.772619782402138130, 0.772651524887322030, 0.772683265440876950, 0.772715004062723860, 0.772746740752783160, -0.772778475510975670, 0.772810208337221920, 0.772841939231443290, 0.772873668193559290, 0.772905395223491000, 0.772937120321159240, 0.772968843486484760, 0.773000564719388050, -0.773032284019790070, 0.773064001387611330, 0.773095716822773120, 0.773127430325195040, 0.773159141894798400, 0.773190851531503910, 0.773222559235232310, 0.773254265005904330, -0.773285968843440590, 0.773317670747762590, 0.773349370718789840, 0.773381068756443630, 0.773412764860644810, 0.773444459031313980, 0.773476151268372100, 0.773507841571739800, -0.773539529941337790, 0.773571216377087700, 0.773602900878908930, 0.773634583446722870, 0.773666264080450360, 0.773697942780012250, 0.773729619545329260, 0.773761294376322130, -0.773792967272911910, 0.773824638235019790, 0.773856307262565490, 0.773887974355470410, 0.773919639513655390, 0.773951302737041270, 0.773982964025549000, 0.774014623379099210, -0.774046280797613400, 0.774077936281011400, 0.774109589829214520, 0.774141241442143690, 0.774172891119719760, 0.774204538861863580, 0.774236184668496090, 0.774267828539538130, -0.774299470474911100, 0.774331110474534840, 0.774362748538330870, 0.774394384666220010, 0.774426018858123230, 0.774457651113961370, 0.774489281433655360, 0.774520909817126620, -0.774552536264295210, 0.774584160775082300, 0.774615783349409170, 0.774647403987196450, 0.774679022688365300, 0.774710639452836470, 0.774742254280531120, 0.774773867171370760, -0.774805478125275120, 0.774837087142165700, 0.774868694221963690, 0.774900299364589930, 0.774931902569965360, 0.774963503838011050, 0.774995103168647950, 0.775026700561797680, -0.775058296017380190, 0.775089889535316880, 0.775121481115528810, 0.775153070757937050, 0.775184658462462650, 0.775216244229026570, 0.775247828057550550, 0.775279409947954300, -0.775310989900159450, 0.775342567914087290, 0.775374143989658650, 0.775405718126794600, 0.775437290325416310, 0.775468860585444730, 0.775500428906801600, 0.775531995289406860, -0.775563559733182140, 0.775595122238048500, 0.775626682803926990, 0.775658241430738920, 0.775689798118405100, 0.775721352866846850, 0.775752905675985760, 0.775784456545741910, -0.775816005476036800, 0.775847552466791820, 0.775879097517927830, 0.775910640629366210, 0.775942181801027920, 0.775973721032834800, 0.776005258324706680, 0.776036793676565530, -0.776068327088332400, 0.776099858559928360, 0.776131388091274800, 0.776162915682292680, 0.776194441332903270, 0.776225965043028320, 0.776257486812587880, 0.776289006641503800, -0.776320524529697130, 0.776352040477089280, 0.776383554483601190, 0.776415066549154260, 0.776446576673670230, 0.776478084857069150, 0.776509591099272870, 0.776541095400202660, -0.776572597759779710, 0.776604098177925310, 0.776635596654560610, 0.776667093189606920, 0.776698587782986060, 0.776730080434618110, 0.776761571144425010, 0.776793059912327940, -0.776824546738248300, 0.776856031622107260, 0.776887514563826100, 0.776918995563326220, 0.776950474620529350, 0.776981951735355780, 0.777013426907727340, 0.777044900137565330, -0.777076371424791020, 0.777107840769325820, 0.777139308171091000, 0.777170773630008530, 0.777202237145998450, 0.777233698718982850, 0.777265158348883100, 0.777296616035620280, -0.777328071779116000, 0.777359525579291550, 0.777390977436068330, 0.777422427349368170, 0.777453875319111360, 0.777485321345219860, 0.777516765427615050, 0.777548207566218340, -0.777579647760951230, 0.777611086011734900, 0.777642522318490850, 0.777673956681141030, 0.777705389099605740, 0.777736819573807030, 0.777768248103666290, 0.777799674689104940, -0.777831099330044350, 0.777862522026406040, 0.777893942778111970, 0.777925361585082520, 0.777956778447239650, 0.777988193364504750, 0.778019606336799450, 0.778051017364045140, -0.778082426446163320, 0.778113833583075400, 0.778145238774703430, 0.778176642020967810, 0.778208043321790610, 0.778239442677093220, 0.778270840086797260, 0.778302235550824230, -0.778333629069095640, 0.778365020641533460, 0.778396410268058280, 0.778427797948591960, 0.778459183683056220, 0.778490567471372460, 0.778521949313462410, 0.778553329209247360, -0.778584707158649030, 0.778616083161589480, 0.778647457217989110, 0.778678829327770220, 0.778710199490854180, 0.778741567707162630, 0.778772933976617180, 0.778804298299139440, -0.778835660674650930, 0.778867021103073820, 0.778898379584328500, 0.778929736118337380, 0.778961090705021840, 0.778992443344303620, 0.779023794036104220, 0.779055142780345380, -0.779086489576949370, 0.779117834425836380, 0.779149177326928900, 0.779180518280148450, 0.779211857285416750, 0.779243194342655320, 0.779274529451785990, 0.779305862612730270, -0.779337193825410450, 0.779368523089747130, 0.779399850405662510, 0.779431175773078300, 0.779462499191916010, 0.779493820662097600, 0.779525140183544570, 0.779556457756179320, -0.779587773379922360, 0.779619087054695850, 0.779650398780421750, 0.779681708557021570, 0.779713016384417150, 0.779744322262530210, 0.779775626191282490, 0.779806928170596160, -0.779838228200392060, 0.779869526280592360, 0.779900822411118800, 0.779932116591893210, 0.779963408822837320, 0.779994699103872980, 0.780025987434921800, 0.780057273815906280, -0.780088558246746940, 0.780119840727366290, 0.780151121257685930, 0.780182399837627830, 0.780213676467113700, 0.780244951146065510, 0.780276223874405320, 0.780307494652054180, -0.780338763478934160, 0.780370030354967330, 0.780401295280075400, 0.780432558254180230, 0.780463819277203650, 0.780495078349067510, 0.780526335469694190, 0.780557590639004540, -0.780588843856920960, 0.780620095123365170, 0.780651344438259230, 0.780682591801524880, 0.780713837213084070, 0.780745080672858640, 0.780776322180771090, 0.780807561736742150, -0.780838799340694330, 0.780870034992549480, 0.780901268692229640, 0.780932500439656560, 0.780963730234752180, 0.780994958077439130, 0.781026183967638010, 0.781057407905271560, -0.781088629890261510, 0.781119849922529920, 0.781151068001998630, 0.781182284128589810, 0.781213498302225200, 0.781244710522827400, 0.781275920790317270, 0.781307129104617300, -0.781338335465649570, 0.781369539873335910, 0.781400742327598490, 0.781431942828359260, 0.781463141375540630, 0.781494337969063650, 0.781525532608850830, 0.781556725294824120, -0.781587916026905580, 0.781619104805017280, 0.781650291629081280, 0.781681476499019530, 0.781712659414754540, 0.781743840376207480, 0.781775019383300740, 0.781806196435956500, -0.781837371534096710, 0.781868544677643550, 0.781899715866518960, 0.781930885100645230, 0.781962052379944650, 0.781993217704338490, 0.782024381073749280, 0.782055542488099160, -0.782086701947310110, 0.782117859451304300, 0.782149015000003890, 0.782180168593331500, 0.782211320231208100, 0.782242469913556390, 0.782273617640298570, 0.782304763411356690, -0.782335907226652800, 0.782367049086109210, 0.782398188989648080, 0.782429326937191920, 0.782460462928662000, 0.782491596963980740, 0.782522729043070630, 0.782553859165853630, -0.782584987332252120, 0.782616113542187960, 0.782647237795583650, 0.782678360092361690, 0.782709480432443370, 0.782740598815751310, 0.782771715242207790, 0.782802829711734980, -0.782833942224255060, 0.782865052779690210, 0.782896161377963360, 0.782927268018995590, 0.782958372702709630, 0.782989475429027750, 0.783020576197872130, 0.783051675009165060, -0.783082771862828820, 0.783113866758785690, 0.783144959696958410, 0.783176050677268250, 0.783207139699637840, 0.783238226763989690, 0.783269311870245950, 0.783300395018328930, -0.783331476208160900, 0.783362555439664710, 0.783393632712761630, 0.783424708027374410, 0.783455781383425530, 0.783486852780837070, 0.783517922219531540, 0.783548989699431210, -0.783580055220458370, 0.783611118782535980, 0.783642180385585200, 0.783673240029528980, 0.783704297714289730, 0.783735353439789730, 0.783766407205951250, 0.783797459012696820, -0.783828508859948700, 0.783859556747629860, 0.783890602675661690, 0.783921646643966910, 0.783952688652468030, 0.783983728701087460, 0.784014766789747460, 0.784045802918370670, -0.784076837086879920, 0.784107869295196380, 0.784138899543243340, 0.784169927830942970, 0.784200954158217780, 0.784231978524990270, 0.784263000931182730, 0.784294021376717780, -0.784325039861518250, 0.784356056385505540, 0.784387070948602720, 0.784418083550732280, 0.784449094191816520, 0.784480102871778160, 0.784511109590539490, 0.784542114348023010, -0.784573117144151900, 0.784604117978847330, 0.784635116852032470, 0.784666113763629820, 0.784697108713561910, 0.784728101701751330, 0.784759092728120390, 0.784790081792592240, -0.784821068895088400, 0.784852054035531820, 0.784883037213845220, 0.784914018429950900, 0.784944997683771570, 0.784975974975229860, 0.785006950304248050, 0.785037923670749540, -0.785068895074655600, 0.785099864515889420, 0.785130831994373610, 0.785161797510030680, 0.785192761062783350, 0.785223722652554020, 0.785254682279265980, 0.785285639942840620, -0.785316595643201330, 0.785347549380270400, 0.785378501153970570, 0.785409450964224540, 0.785440398810954950, 0.785471344694084310, 0.785502288613535880, 0.785533230569231080, -0.785564170561093290, 0.785595108589045130, 0.785626044653009110, 0.785656978752907960, 0.785687910888664410, 0.785718841060201070, 0.785749769267441220, 0.785780695510306380, -0.785811619788719720, 0.785842542102604070, 0.785873462451882050, 0.785904380836476400, 0.785935297256309840, 0.785966211711305540, 0.785997124201385120, 0.786028034726471980, -0.786058943286488620, 0.786089849881357990, 0.786120754511002830, 0.786151657175345630, 0.786182557874309350, 0.786213456607817160, 0.786244353375790910, 0.786275248178153750, -0.786306141014828320, 0.786337031885737670, 0.786367920790804420, 0.786398807729951410, 0.786429692703101260, 0.786460575710177580, 0.786491456751101770, 0.786522335825797450, -0.786553212934187230, 0.786584088076193950, 0.786614961251740460, 0.786645832460749590, 0.786676701703144630, 0.786707568978847420, 0.786738434287781230, 0.786769297629869020, -0.786800159005033640, 0.786831018413197690, 0.786861875854284350, 0.786892731328216240, 0.786923584834916870, 0.786954436374307950, 0.786985285946313010, 0.787016133550854760, -0.787046979187856270, 0.787077822857240260, 0.787108664558929690, 0.787139504292848070, 0.787170342058917120, 0.787201177857060340, 0.787232011687200580, 0.787262843549260790, -0.787293673443163920, 0.787324501368832810, 0.787355327326190510, 0.787386151315160430, 0.787416973335664410, 0.787447793387625940, 0.787478611470967980, 0.787509427585613490, -0.787540241731485510, 0.787571053908506900, 0.787601864116600600, 0.787632672355690230, 0.787663478625697520, 0.787694282926546310, 0.787725085258159210, 0.787755885620459510, -0.787786684013370040, 0.787817480436813990, 0.787848274890714630, 0.787879067374994020, 0.787909857889575900, 0.787940646434383000, 0.787971433009338580, 0.788002217614365510, -0.788033000249386940, 0.788063780914325830, 0.788094559609105790, 0.788125336333648900, 0.788156111087878640, 0.788186883871717980, 0.788217654685090310, 0.788248423527918350, -0.788279190400125400, 0.788309955301634950, 0.788340718232369180, 0.788371479192251590, 0.788402238181205250, 0.788432995199153330, 0.788463750246018890, 0.788494503321725100, -0.788525254426195030, 0.788556003559352400, 0.788586750721119280, 0.788617495911419280, 0.788648239130175450, 0.788678980377310990, 0.788709719652749160, 0.788740456956413040, -0.788771192288225790, 0.788801925648111020, 0.788832657035990930, 0.788863386451789220, 0.788894113895429070, 0.788924839366833550, 0.788955562865925940, 0.788986284392629520, -0.789017003946867910, 0.789047721528563170, 0.789078437137639140, 0.789109150774019110, 0.789139862437626130, 0.789170572128383490, 0.789201279846214470, 0.789231985591042130, -0.789262689362790540, 0.789293391161381530, 0.789324090986739170, 0.789354788838786510, 0.789385484717446850, 0.789416178622643570, 0.789446870554299740, 0.789477560512338860, -0.789508248496684550, 0.789538934507259090, 0.789569618543986220, 0.789600300606789430, 0.789630980695591790, 0.789661658810316690, 0.789692334950887530, 0.789723009117228040, -0.789753681309260490, 0.789784351526908730, 0.789815019770096050, 0.789845686038745830, 0.789876350332781470, 0.789907012652126150, 0.789937672996703370, 0.789968331366436960, -0.789998987761249110, 0.790029642181063750, 0.790060294625804400, 0.790090945095394240, 0.790121593589756750, 0.790152240108815240, 0.790182884652493760, 0.790213527220714470, -0.790244167813401340, 0.790274806430477870, 0.790305443071867230, 0.790336077737493150, 0.790366710427278800, 0.790397341141147680, 0.790427969879023750, 0.790458596640829290, -0.790489221426488480, 0.790519844235924470, 0.790550465069060900, 0.790581083925821270, 0.790611700806128860, 0.790642315709907170, 0.790672928637080160, 0.790703539587570450, -0.790734148561301750, 0.790764755558197810, 0.790795360578181890, 0.790825963621177630, 0.790856564687108410, 0.790887163775898290, 0.790917760887469790, 0.790948356021746850, -0.790978949178653080, 0.791009540358111880, 0.791040129560046880, 0.791070716784381460, 0.791101302031039340, 0.791131885299944490, 0.791162466591019410, 0.791193045904188040, -0.791223623239374120, 0.791254198596501150, 0.791284771975492740, 0.791315343376272410, 0.791345912798763650, 0.791376480242890650, 0.791407045708575900, 0.791437609195743570, -0.791468170704317190, 0.791498730234220460, 0.791529287785376790, 0.791559843357710010, 0.791590396951144080, 0.791620948565601610, 0.791651498201006890, 0.791682045857283300, -0.791712591534354690, 0.791743135232144570, 0.791773676950576540, 0.791804216689574350, 0.791834754449062260, 0.791865290228962570, 0.791895824029199780, 0.791926355849697390, -0.791956885690379140, 0.791987413551168640, 0.792017939431989610, 0.792048463332766350, 0.792078985253421350, 0.792109505193878790, 0.792140023154062510, 0.792170539133896230, -0.792201053133303580, 0.792231565152208270, 0.792262075190534150, 0.792292583248205280, 0.792323089325144390, 0.792353593421275870, 0.792384095536523340, 0.792414595670810520, -0.792445093824061250, 0.792475589996199270, 0.792506084187148300, 0.792536576396832610, 0.792567066625174950, 0.792597554872099600, 0.792628041137530490, 0.792658525421391150, -0.792689007723605620, 0.792719488044097420, 0.792749966382791160, 0.792780442739609460, 0.792810917114476490, 0.792841389507316420, 0.792871859918052760, 0.792902328346609450, -0.792932794792910340, 0.792963259256879270, 0.792993721738440630, 0.793024182237517030, 0.793054640754033090, 0.793085097287912430, 0.793115551839079110, 0.793146004407456860, -0.793176454992969630, 0.793206903595541360, 0.793237350215096230, 0.793267794851557180, 0.793298237504848740, 0.793328678174894610, 0.793359116861618860, 0.793389553564945340, -0.793419988284797870, 0.793450421021100970, 0.793480851773777470, 0.793511280542751880, 0.793541707327948150, 0.793572132129290010, 0.793602554946701620, 0.793632975780106830, -0.793663394629429590, 0.793693811494594500, 0.793724226375524200, 0.793754639272143400, 0.793785050184376060, 0.793815459112146020, 0.793845866055377320, 0.793876271013993940, -0.793906673987920470, 0.793937074977079770, 0.793967473981396440, 0.793997871000794330, 0.794028266035197610, 0.794058659084530220, 0.794089050148716110, 0.794119439227679360, -0.794149826321344680, 0.794180211429634800, 0.794210594552474450, 0.794240975689787580, 0.794271354841498240, 0.794301732007530630, 0.794332107187808560, 0.794362480382256320, -0.794392851590798310, 0.794423220813357700, 0.794453588049858990, 0.794483953300226360, 0.794514316564383870, 0.794544677842255580, 0.794575037133765540, 0.794605394438838490, -0.794635749757397480, 0.794666103089366920, 0.794696454434671300, 0.794726803793234460, 0.794757151164980580, 0.794787496549833830, 0.794817839947718370, 0.794848181358558840, -0.794878520782278280, 0.794908858218801420, 0.794939193668052440, 0.794969527129955500, 0.794999858604434670, 0.795030188091414350, 0.795060515590818360, 0.795090841102571780, -0.795121164626597430, 0.795151486162820280, 0.795181805711164370, 0.795212123271553880, 0.795242438843913210, 0.795272752428166420, 0.795303064024238230, 0.795333373632051810, -0.795363681251532010, 0.795393986882602990, 0.795424290525189040, 0.795454592179214330, 0.795484891844603140, 0.795515189521279750, 0.795545485209168900, 0.795575778908193860, -0.795606070618279260, 0.795636360339349590, 0.795666648071328920, 0.795696933814141750, 0.795727217567712140, 0.795757499331965050, 0.795787779106823740, 0.795818056892212860, -0.795848332688056990, 0.795878606494280110, 0.795908878310806810, 0.795939148137561390, 0.795969415974468020, 0.795999681821451640, 0.796029945678435550, 0.796060207545344570, -0.796090467422103100, 0.796120725308635420, 0.796150981204865940, 0.796181235110719030, 0.796211487026118990, 0.796241736950990760, 0.796271984885257740, 0.796302230828844660, -0.796332474781676130, 0.796362716743676310, 0.796392956714769730, 0.796423194694880760, 0.796453430683934260, 0.796483664681853720, 0.796513896688564090, 0.796544126703989660, -0.796574354728054820, 0.796604580760684190, 0.796634804801802150, 0.796665026851333000, 0.796695246909201900, 0.796725464975332030, 0.796755681049648670, 0.796785895132075980, -0.796816107222538590, 0.796846317320960900, 0.796876525427267390, 0.796906731541382700, 0.796936935663231650, 0.796967137792737650, 0.796997337929825860, 0.797027536074420780, -0.797057732226446820, 0.797087926385828480, 0.797118118552490370, 0.797148308726357560, 0.797178496907353320, 0.797208683095402940, 0.797238867290430810, 0.797269049492361550, -0.797299229701119660, 0.797329407916629650, 0.797359584138816140, 0.797389758367604170, 0.797419930602917380, 0.797450100844680600, 0.797480269092818660, 0.797510435347256070, -0.797540599607917340, 0.797570761874727200, 0.797600922147610580, 0.797631080426491220, 0.797661236711294070, 0.797691391001943860, 0.797721543298365200, 0.797751693600482700, -0.797781841908220880, 0.797811988221504450, 0.797842132540258710, 0.797872274864407040, 0.797902415193874610, 0.797932553528586270, 0.797962689868466410, 0.797992824213439980, -0.798022956563431360, 0.798053086918365410, 0.798083215278167280, 0.798113341642760600, 0.798143466012070530, 0.798173588386021820, 0.798203708764539050, 0.798233827147547090, -0.798263943534970540, 0.798294057926734690, 0.798324170322763150, 0.798354280722981200, 0.798384389127313470, 0.798414495535684890, 0.798444599948019970, 0.798474702364243560, -0.798504802784280490, 0.798534901208055810, 0.798564997635493490, 0.798595092066518570, 0.798625184501055910, 0.798655274939030320, 0.798685363380366550, 0.798715449824989430, -0.798745534272824130, 0.798775616723794490, 0.798805697177825790, 0.798835775634842870, 0.798865852094770570, 0.798895926557533500, 0.798925999023056720, 0.798956069491264960, -0.798986137962083510, 0.799016204435436190, 0.799046268911248300, 0.799076331389444890, 0.799106391869950580, 0.799136450352690210, 0.799166506837588830, 0.799196561324571060, -0.799226613813562530, 0.799256664304486830, 0.799286712797269590, 0.799316759291835540, 0.799346803788109520, 0.799376846286016460, 0.799406886785481440, 0.799436925286429620, -0.799466961788785070, 0.799496996292472950, 0.799527028797418440, 0.799557059303546370, 0.799587087810781580, 0.799617114319049140, 0.799647138828273870, 0.799677161338381290, -0.799707181849295350, 0.799737200360941420, 0.799767216873244480, 0.799797231386129460, 0.799827243899521310, 0.799857254413345210, 0.799887262927525880, 0.799917269441988930, -0.799947273956658320, 0.799977276471459440, 0.800007276986317350, 0.800037275501157220, 0.800067272015903770, 0.800097266530482190, 0.800127259044817960, 0.800157249558835160, -0.800187238072459060, 0.800217224585614950, 0.800247209098227770, 0.800277191610222590, 0.800307172121524470, 0.800337150632058240, 0.800367127141749850, 0.800397101650523020, -0.800427074158303500, 0.800457044665016220, 0.800487013170586350, 0.800516979674939070, 0.800546944177999210, 0.800576906679692500, 0.800606867179943120, 0.800636825678676440, -0.800666782175817770, 0.800696736671292040, 0.800726689165024650, 0.800756639656940440, 0.800786588146964570, 0.800816534635022890, 0.800846479121039230, 0.800876421604939440, -0.800906362086648560, 0.800936300566091770, 0.800966237043194250, 0.800996171517881160, 0.801026103990077680, 0.801056034459709410, 0.801085962926700420, 0.801115889390976670, -0.801145813852463200, 0.801175736311085070, 0.801205656766767690, 0.801235575219436220, 0.801265491669016280, 0.801295406115432040, 0.801325318558609330, 0.801355228998473330, -0.801385137434949210, 0.801415043867962360, 0.801444948297437840, 0.801474850723300940, 0.801504751145477370, 0.801534649563891530, 0.801564545978468930, 0.801594440389135080, -0.801624332795815020, 0.801654223198434270, 0.801684111596917880, 0.801713997991191140, 0.801743882381180110, 0.801773764766808730, 0.801803645148002950, 0.801833523524688060, -0.801863399896789340, 0.801893274264232180, 0.801923146626941750, 0.801953016984844000, 0.801982885337863220, 0.802012751685925230, 0.802042616028955440, 0.802072478366878890, -0.802102338699621330, 0.802132197027107920, 0.802162053349263940, 0.802191907666015340, 0.802221759977286510, 0.802251610283003290, 0.802281458583090970, 0.802311304877475040, -0.802341149166080900, 0.802370991448833840, 0.802400831725659790, 0.802430669996483160, 0.802460506261229890, 0.802490340519825260, 0.802520172772194900, 0.802550003018264070, -0.802579831257958180, 0.802609657491202830, 0.802639481717923760, 0.802669303938045480, 0.802699124151493910, 0.802728942358194590, 0.802758758558072880, 0.802788572751054310, -0.802818384937064260, 0.802848195116028340, 0.802878003287872400, 0.802907809452520830, 0.802937613609899900, 0.802967415759934800, 0.802997215902551240, 0.803027014037674620, -0.803056810165230450, 0.803086604285144890, 0.803116396397342220, 0.803146186501748520, 0.803175974598289380, 0.803205760686890200, 0.803235544767476830, 0.803265326839974430, -0.803295106904308830, 0.803324884960405880, 0.803354661008190310, 0.803384435047587940, 0.803414207078524620, 0.803443977100925630, 0.803473745114716810, 0.803503511119823650, -0.803533275116171670, 0.803563037103687040, 0.803592797082294250, 0.803622555051919480, 0.803652311012488350, 0.803682064963926470, 0.803711816906159450, 0.803741566839112800, -0.803771314762712800, 0.803801060676883950, 0.803830804581552540, 0.803860546476644070, 0.803890286362084150, 0.803920024237798620, 0.803949760103713000, 0.803979493959752990, -0.804009225805844770, 0.804038955641912860, 0.804068683467883740, 0.804098409283682810, 0.804128133089235810, 0.804157854884468560, 0.804187574669306680, 0.804217292443676350, -0.804247008207502280, 0.804276721960710650, 0.804306433703227300, 0.804336143434977830, 0.804365851155887880, 0.804395556865883490, 0.804425260564890050, 0.804454962252834080, -0.804484661929640190, 0.804514359595234650, 0.804544055249543090, 0.804573748892491560, 0.804603440524005560, 0.804633130144010940, 0.804662817752433530, 0.804692503349199620, -0.804722186934233920, 0.804751868507462720, 0.804781548068811860, 0.804811225618207170, 0.804840901155574380, 0.804870574680839330, 0.804900246193928410, 0.804929915694766350, -0.804959583183279430, 0.804989248659393590, 0.805018912123034670, 0.805048573574128400, 0.805078233012600840, 0.805107890438377490, 0.805137545851385080, 0.805167199251548230, -0.805196850638793430, 0.805226500013046410, 0.805256147374233230, 0.805285792722279630, 0.805315436057111640, 0.805345077378654910, 0.805374716686836130, 0.805404353981580060, -0.805433989262812950, 0.805463622530461000, 0.805493253784449910, 0.805522883024705760, 0.805552510251154370, 0.805582135463722260, 0.805611758662334250, 0.805641379846916860, -0.805670999017396030, 0.805700616173697700, 0.805730231315747720, 0.805759844443472260, 0.805789455556797260, 0.805819064655649010, 0.805848671739952670, 0.805878276809634640, -0.805907879864620870, 0.805937480904837410, 0.805967079930210330, 0.805996676940665460, 0.806026271936129410, 0.806055864916527250, 0.806085455881785370, 0.806115044831829830, -0.806144631766586680, 0.806174216685981990, 0.806203799589941710, 0.806233380478391990, 0.806262959351259360, 0.806292536208468750, 0.806322111049946780, 0.806351683875619510, -0.806381254685413110, 0.806410823479253640, 0.806440390257066930, 0.806469955018779380, 0.806499517764317500, 0.806529078493606110, 0.806558637206572170, 0.806588193903141630, -0.806617748583240530, 0.806647301246795180, 0.806676851893731510, 0.806706400523976240, 0.806735947137454450, 0.806765491734092730, 0.806795034313817380, 0.806824574876554350, -0.806854113422230010, 0.806883649950770220, 0.806913184462101470, 0.806942716956150160, 0.806972247432841570, 0.807001775892102420, 0.807031302333858780, 0.807060826758036810, -0.807090349164562900, 0.807119869553363120, 0.807149387924364080, 0.807178904277491170, 0.807208418612670900, 0.807237930929829650, 0.807267441228893490, 0.807296949509788810, -0.807326455772441660, 0.807355960016778450, 0.807385462242725890, 0.807414962450209160, 0.807444460639154980, 0.807473956809489630, 0.807503450961139400, 0.807532943094030560, -0.807562433208089290, 0.807591921303241980, 0.807621407379415460, 0.807650891436534900, 0.807680373474527040, 0.807709853493318250, 0.807739331492834830, 0.807768807473003060, -0.807798281433749320, 0.807827753375000350, 0.807857223296681530, 0.807886691198719700, 0.807916157081041030, 0.807945620943572030, 0.807975082786238970, 0.808004542608968150, -0.808034000411686050, 0.808063456194319410, 0.808092909956793730, 0.808122361699035620, 0.808151811420971700, 0.808181259122528140, 0.808210704803631550, 0.808240148464208110, -0.808269590104184420, 0.808299029723487220, 0.808328467322041890, 0.808357902899775380, 0.808387336456614200, 0.808416767992484630, 0.808446197507313170, 0.808475625001026100, -0.808505050473550590, 0.808534473924811930, 0.808563895354737050, 0.808593314763252470, 0.808622732150284570, 0.808652147515759870, 0.808681560859604850, 0.808710972181745810, -0.808740381482109920, 0.808769788760622550, 0.808799194017210790, 0.808828597251800900, 0.808857998464319610, 0.808887397654693310, 0.808916794822848510, 0.808946189968712260, -0.808975583092209960, 0.809004974193268780, 0.809034363271815100, 0.809063750327775550, 0.809093135361076520, 0.809122518371644730, 0.809151899359406680, 0.809181278324289430, -0.809210655266218380, 0.809240030185120700, 0.809269403080922990, 0.809298773953551760, 0.809328142802933530, 0.809357509628995000, 0.809386874431662800, 0.809416237210863750, -0.809445597966523710, 0.809474956698569610, 0.809504313406928190, 0.809533668091525940, 0.809563020752289480, 0.809592371389145530, 0.809621720002021150, 0.809651066590841960, -0.809680411155535130, 0.809709753696027160, 0.809739094212244880, 0.809768432704114920, 0.809797769171563870, 0.809827103614518260, 0.809856436032905580, 0.809885766426651220, -0.809915094795682470, 0.809944421139925930, 0.809973745459308340, 0.810003067753756410, 0.810032388023196770, 0.810061706267556250, 0.810091022486761900, 0.810120336680739570, -0.810149648849416320, 0.810178958992718970, 0.810208267110574140, 0.810237573202908790, 0.810266877269649410, 0.810296179310723400, 0.810325479326056360, 0.810354777315575700, -0.810384073279208030, 0.810413367216880290, 0.810442659128519090, 0.810471949014051170, 0.810501236873403360, 0.810530522706503050, 0.810559806513275970, 0.810589088293649280, -0.810618368047549830, 0.810647645774904560, 0.810676921475640190, 0.810706195149683450, 0.810735466796961730, 0.810764736417400880, 0.810794004010928160, 0.810823269577470420, -0.810852533116954490, 0.810881794629307320, 0.810911054114455520, 0.810940311572326160, 0.810969567002846610, 0.810998820405942510, 0.811028071781541460, 0.811057321129570190, -0.811086568449955530, 0.811115813742624650, 0.811145057007504060, 0.811174298244520920, 0.811203537453602520, 0.811232774634674690, 0.811262009787664940, 0.811291242912500320, -0.811320474009107450, 0.811349703077413390, 0.811378930117345190, 0.811408155128830020, 0.811437378111794060, 0.811466599066164700, 0.811495817991868760, 0.811525034888833210, -0.811554249756985200, 0.811583462596251470, 0.811612673406559180, 0.811641882187835620, 0.811671088940006950, 0.811700293663000450, 0.811729496356743300, 0.811758697021162320, -0.811787895656184700, 0.811817092261737260, 0.811846286837747180, 0.811875479384141840, 0.811904669900847310, 0.811933858387791090, 0.811963044844900230, 0.811992229272101680, -0.812021411669322620, 0.812050592036489990, 0.812079770373531520, 0.812108946680373030, 0.812138120956942160, 0.812167293203166050, 0.812196463418971560, 0.812225631604286070, -0.812254797759036420, 0.812283961883149770, 0.812313123976553750, 0.812342284039174410, 0.812371442070939360, 0.812400598071775780, 0.812429752041610610, 0.812458903980371130, -0.812488053887984290, 0.812517201764377920, 0.812546347609477970, 0.812575491423212170, 0.812604633205507690, 0.812633772956291580, 0.812662910675491010, 0.812692046363033270, -0.812721180018845300, 0.812750311642854940, 0.812779441234988350, 0.812808568795173050, 0.812837694323336410, 0.812866817819405510, 0.812895939283307500, 0.812925058714969670, -0.812954176114319300, 0.812983291481283900, 0.813012404815789740, 0.813041516117764650, 0.813070625387135700, 0.813099732623830170, 0.813128837827775450, 0.813157940998898490, -0.813187042137127230, 0.813216141242387950, 0.813245238314608150, 0.813274333353715350, 0.813303426359636710, 0.813332517332299500, 0.813361606271631010, 0.813390693177558520, -0.813419778050009760, 0.813448860888911000, 0.813477941694190190, 0.813507020465774500, 0.813536097203591210, 0.813565171907567720, 0.813594244577631300, 0.813623315213709230, -0.813652383815729460, 0.813681450383618170, 0.813710514917303280, 0.813739577416712100, 0.813768637881771890, 0.813797696312410170, 0.813826752708554200, 0.813855807070131940, -0.813884859397069560, 0.813913909689295000, 0.813942957946735660, 0.813972004169319030, 0.814001048356972290, 0.814030090509623050, 0.814059130627198480, 0.814088168709626640, -0.814117204756833800, 0.814146238768748030, 0.814175270745296610, 0.814204300686407030, 0.814233328592006700, 0.814262354462023110, 0.814291378296384090, 0.814320400095016050, -0.814349419857847150, 0.814378437584804550, 0.814407453275815870, 0.814436466930808620, 0.814465478549710300, 0.814494488132448180, 0.814523495678950330, 0.814552501189143240, -0.814581504662954870, 0.814610506100312830, 0.814639505501144500, 0.814668502865377290, 0.814697498192938910, 0.814726491483756870, 0.814755482737759000, 0.814784471954871910, -0.814813459135023680, 0.814842444278141790, 0.814871427384153860, 0.814900408452987280, 0.814929387484569670, 0.814958364478829190, 0.814987339435692240, 0.815016312355086870, -0.815045283236940810, 0.815074252081181560, 0.815103218887736620, 0.815132183656533620, 0.815161146387500150, 0.815190107080564390, 0.815219065735652840, 0.815248022352693560, -0.815276976931614270, 0.815305929472342590, 0.815334879974806030, 0.815363828438932290, 0.815392774864649450, 0.815421719251884220, 0.815450661600564670, 0.815479601910618520, -0.815508540181973270, 0.815537476414556650, 0.815566410608296490, 0.815595342763120180, 0.815624272878956110, 0.815653200955730790, 0.815682126993372390, 0.815711050991808740, -0.815739972950967560, 0.815768892870776360, 0.815797810751162870, 0.815826726592054910, 0.815855640393380650, 0.815884552155066830, 0.815913461877041610, 0.815942369559232720, -0.815971275201567870, 0.816000178803974800, 0.816029080366381330, 0.816057979888715760, 0.816086877370904570, 0.816115772812876280, 0.816144666214558610, 0.816173557575879170, -0.816202446896765910, 0.816231334177146440, 0.816260219416948710, 0.816289102616100990, 0.816317983774529910, 0.816346862892163850, 0.816375739968930760, 0.816404615004758250, -0.816433487999574160, 0.816462358953306320, 0.816491227865882680, 0.816520094737231420, 0.816548959567279460, 0.816577822355955110, 0.816606683103186180, 0.816635541808900520, -0.816664398473026080, 0.816693253095490570, 0.816722105676222500, 0.816750956215148590, 0.816779804712197350, 0.816808651167296510, 0.816837495580374110, 0.816866337951357990, -0.816895178280175990, 0.816924016566756060, 0.816952852811026590, 0.816981687012914510, 0.817010519172348130, 0.817039349289255480, 0.817068177363564520, 0.817097003395203080, -0.817125827384099110, 0.817154649330181120, 0.817183469233375930, 0.817212287093612160, 0.817241102910817640, 0.817269916684920330, 0.817298728415848270, 0.817327538103529430, -0.817356345747891620, 0.817385151348863470, 0.817413954906372030, 0.817442756420345700, 0.817471555890712410, 0.817500353317400230, 0.817529148700337220, 0.817557942039451310, -0.817586733334670580, 0.817615522585923520, 0.817644309793137070, 0.817673094956239850, 0.817701878075159930, 0.817730659149825350, 0.817759438180164170, 0.817788215166104230, -0.817816990107574360, 0.817845763004501510, 0.817874533856814300, 0.817903302664440670, 0.817932069427308780, 0.817960834145346700, 0.817989596818482600, 0.818018357446644530, -0.818047116029760990, 0.818075872567759270, 0.818104627060567750, 0.818133379508114710, 0.818162129910328220, 0.818190878267136430, 0.818219624578467420, 0.818248368844249340, -0.818277111064410920, 0.818305851238879110, 0.818334589367582740, 0.818363325450449870, 0.818392059487408670, 0.818420791478387310, 0.818449521423314060, 0.818478249322117430, -0.818506975174724700, 0.818535698981064490, 0.818564420741065170, 0.818593140454654590, 0.818621858121761360, 0.818650573742313310, 0.818679287316238960, 0.818707998843466900, -0.818736708323924200, 0.818765415757539810, 0.818794121144241880, 0.818822824483958710, 0.818851525776618460, 0.818880225022149300, 0.818908922220480170, 0.818937617371538140, -0.818966310475252150, 0.818995001531550360, 0.819023690540361060, 0.819052377501612640, 0.819081062415233150, 0.819109745281150990, 0.819138426099294990, 0.819167104869592540, -0.819195781591972150, 0.819224456266362420, 0.819253128892691530, 0.819281799470887860, 0.819310468000879590, 0.819339134482595210, 0.819367798915963560, 0.819396461300911820, -0.819425121637368910, 0.819453779925263250, 0.819482436164523100, 0.819511090355076850, 0.819539742496852910, 0.819568392589780200, 0.819597040633785910, 0.819625686628798980, -0.819654330574747900, 0.819682972471560970, 0.819711612319166670, 0.819740250117493300, 0.819768885866469230, 0.819797519566023540, 0.819826151216083490, 0.819854780816578140, -0.819883408367435780, 0.819912033868584910, 0.819940657319953910, 0.819969278721471300, 0.819997898073065560, 0.820026515374665530, 0.820055130626198720, 0.820083743827594080, -0.820112354978779990, 0.820140964079685180, 0.820169571130237810, 0.820198176130366610, 0.820226779080000410, 0.820255379979066830, 0.820283978827494710, 0.820312575625212760, -0.820341170372149260, 0.820369763068232840, 0.820398353713392090, 0.820426942307555420, 0.820455528850651870, 0.820484113342609070, 0.820512695783355840, 0.820541276172821020, -0.820569854510933010, 0.820598430797620290, 0.820627005032811500, 0.820655577216435670, 0.820684147348420430, 0.820712715428694840, 0.820741281457187500, 0.820769845433826920, -0.820798407358541700, 0.820826967231260470, 0.820855525051911840, 0.820884080820424860, 0.820912634536727250, 0.820941186200747960, 0.820969735812415720, 0.820998283371659250, -0.821026828878406940, 0.821055372332587630, 0.821083913734129920, 0.821112453082962880, 0.821140990379014220, 0.821169525622213130, 0.821198058812488090, 0.821226589949768050, -0.821255119033981410, 0.821283646065057100, 0.821312171042924090, 0.821340693967510190, 0.821369214838744480, 0.821397733656555770, 0.821426250420872810, 0.821454765131624190, -0.821483277788738640, 0.821511788392144780, 0.821540296941772110, 0.821568803437548120, 0.821597307879402110, 0.821625810267262890, 0.821654310601059200, 0.821682808880719650, -0.821711305106173070, 0.821739799277348190, 0.821768291394174400, 0.821796781456579310, 0.821825269464492300, 0.821853755417842110, 0.821882239316557570, 0.821910721160567400, -0.821939200949800440, 0.821967678684185970, 0.821996154363651810, 0.822024627988127250, 0.822053099557541130, 0.822081569071822280, 0.822110036530899420, 0.822138501934701500, -0.822166965283157470, 0.822195426576196380, 0.822223885813746280, 0.822252342995736460, 0.822280798122095760, 0.822309251192753000, 0.822337702207637240, 0.822366151166677220, -0.822394598069802200, 0.822423042916940240, 0.822451485708020740, 0.822479926442972520, 0.822508365121724430, 0.822536801744205400, 0.822565236310344390, 0.822593668820070350, -0.822622099273312650, 0.822650527669999130, 0.822678954010059300, 0.822707378293422000, 0.822735800520016380, 0.822764220689771290, 0.822792638802615550, 0.822821054858478230, -0.822849468857288820, 0.822877880798975280, 0.822906290683466880, 0.822934698510692900, 0.822963104280582060, 0.822991507993063530, 0.823019909648066260, 0.823048309245519640, -0.823076706785351830, 0.823105102267492230, 0.823133495691869780, 0.823161887058413640, 0.823190276367052890, 0.823218663617716340, 0.823247048810333170, 0.823275431944832880, -0.823303813021143420, 0.823332192039194500, 0.823360568998915190, 0.823388943900234320, 0.823417316743081160, 0.823445687527384670, 0.823474056253074460, 0.823502422920078690, -0.823530787528326760, 0.823559150077747940, 0.823587510568271170, 0.823615868999825640, 0.823644225372340500, 0.823672579685744810, 0.823700931939968070, 0.823729282134938570, -0.823757630270585790, 0.823785976346839030, 0.823814320363627340, 0.823842662320879770, 0.823871002218525610, 0.823899340056493900, 0.823927675834714270, 0.823956009553115100, -0.823984341211625780, 0.824012670810175710, 0.824040998348693930, 0.824069323827109620, 0.824097647245352060, 0.824125968603350860, 0.824154287901034180, 0.824182605138331860, -0.824210920315172960, 0.824239233431486750, 0.824267544487202520, 0.824295853482249430, 0.824324160416556650, 0.824352465290054020, 0.824380768102669690, 0.824409068854333520, -0.824437367544974650, 0.824465664174522270, 0.824493958742905870, 0.824522251250054410, 0.824550541695897480, 0.824578830080364590, 0.824607116403384130, 0.824635400664885940, -0.824663682864799190, 0.824691963003053250, 0.824720241079577420, 0.824748517094300970, 0.824776791047153850, 0.824805062938064100, 0.824833332766961690, 0.824861600533776000, -0.824889866238436300, 0.824918129880871990, 0.824946391461012340, 0.824974650978786640, 0.825002908434124830, 0.825031163826955290, 0.825059417157207760, 0.825087668424811850, -0.825115917629696600, 0.825144164771791640, 0.825172409851026250, 0.825200652867330350, 0.825228893820632250, 0.825257132710861980, 0.825285369537948840, 0.825313604301822320, -0.825341837002411820, 0.825370067639646710, 0.825398296213456390, 0.825426522723770820, 0.825454747170518480, 0.825482969553629210, 0.825511189873032620, 0.825539408128658000, -0.825567624320434850, 0.825595838448292650, 0.825624050512160810, 0.825652260511969490, 0.825680468447646860, 0.825708674319123090, 0.825736878126327680, 0.825765079869190120, -0.825793279547639810, 0.825821477161606250, 0.825849672711019500, 0.825877866195808160, 0.825906057615902080, 0.825934246971230860, 0.825962434261724110, 0.825990619487311120, -0.826018802647921710, 0.826046983743485290, 0.826075162773931890, 0.826103339739190030, 0.826131514639189880, 0.826159687473860930, 0.826187858243132790, 0.826216026946934860, -0.826244193585196960, 0.826272358157848610, 0.826300520664819850, 0.826328681106039300, 0.826356839481437010, 0.826384995790942710, 0.826413150034485790, 0.826441302211996080, -0.826469452323403080, 0.826497600368636950, 0.826525746347626320, 0.826553890260301350, 0.826582032106591650, 0.826610171886426940, 0.826638309599736720, 0.826666445246450720, -0.826694578826498550, 0.826722710339810480, 0.826750839786315250, 0.826778967165942790, 0.826807092478622940, 0.826835215724285310, 0.826863336902859740, 0.826891456014275830, -0.826919573058463750, 0.826947688035352120, 0.826975800944871440, 0.827003911786951210, 0.827032020561521140, 0.827060127268511080, 0.827088231907850640, 0.827116334479469640, -0.827144434983298370, 0.827172533419265440, 0.827200629787301240, 0.827228724087335500, 0.827256816319297820, 0.827284906483118140, 0.827312994578726310, 0.827341080606051830, -0.827369164565025290, 0.827397246455575220, 0.827425326277632100, 0.827453404031125660, 0.827481479715985730, 0.827509553332142040, 0.827537624879524540, 0.827565694358063380, -0.827593761767687620, 0.827621827108327320, 0.827649890379912550, 0.827677951582373010, 0.827706010715638540, 0.827734067779639090, 0.827762122774304500, 0.827790175699565140, -0.827818226555349760, 0.827846275341588830, 0.827874322058212210, 0.827902366705149830, 0.827930409282331530, 0.827958449789687130, 0.827986488227146710, 0.828014524594640420, -0.828042558892097440, 0.828070591119448030, 0.828098621276622150, 0.828126649363549740, 0.828154675380160630, 0.828182699326384890, 0.828210721202153000, 0.828238741007393700, -0.828266758742037480, 0.828294774406014400, 0.828322787999254520, 0.828350799521687550, 0.828378808973243560, 0.828406816353852600, 0.828434821663445060, 0.828462824901950000, -0.828490826069297910, 0.828518825165418750, 0.828546822190242450, 0.828574817143699180, 0.828602810025718780, 0.828630800836231860, 0.828658789575167590, 0.828686776242456240, -0.828714760838027860, 0.828742743361812750, 0.828770723813740730, 0.828798702193741850, 0.828826678501746180, 0.828854652737684440, 0.828882624901485450, 0.828910594993079950, -0.828938563012397990, 0.828966528959369510, 0.828994492833924790, 0.829022454635993890, 0.829050414365506750, 0.829078372022394210, 0.829106327606585090, 0.829134281118010240, -0.829162232556599710, 0.829190181922283550, 0.829218129214991940, 0.829246074434655030, 0.829274017581203340, 0.829301958654566240, 0.829329897654674130, 0.829357834581457400, -0.829385769434845990, 0.829413702214770180, 0.829441632921160130, 0.829469561553945910, 0.829497488113058350, 0.829525412598426600, 0.829553335009981300, 0.829581255347652700, -0.829609173611370880, 0.829637089801066210, 0.829665003916668750, 0.829692915958108790, 0.829720825925317150, 0.829748733818222780, 0.829776639636756630, 0.829804543380848970, -0.829832445050429860, 0.829860344645429680, 0.829888242165778610, 0.829916137611407480, 0.829944030982245450, 0.829971922278223360, 0.829999811499271490, 0.830027698645320000, -0.830055583716299390, 0.830083466712139730, 0.830111347632771500, 0.830139226478125320, 0.830167103248130590, 0.830194977942718020, 0.830222850561818100, 0.830250721105361130, -0.830278589573277270, 0.830306455965496900, 0.830334320281950980, 0.830362182522568660, 0.830390042687281000, 0.830417900776018070, 0.830445756788710580, 0.830473610725288580, -0.830501462585682580, 0.830529312369822970, 0.830557160077640470, 0.830585005709064570, 0.830612849264026230, 0.830640690742455830, 0.830668530144283660, 0.830696367469440090, -0.830724202717855630, 0.830752035889460670, 0.830779866984186150, 0.830807696001961470, 0.830835522942717450, 0.830863347806384710, 0.830891170592893640, 0.830918991302174610, -0.830946809934158040, 0.830974626488774960, 0.831002440965954880, 0.831030253365628640, 0.831058063687726830, 0.831085871932179750, 0.831113678098918120, 0.831141482187872200, -0.831169284198972620, 0.831197084132150320, 0.831224881987334800, 0.831252677764457100, 0.831280471463447750, 0.831308263084237110, 0.831336052626755920, 0.831363840090934560, -0.831391625476703530, 0.831419408783994010, 0.831447190012735480, 0.831474969162858900, 0.831502746234294990, 0.831530521226974130, 0.831558294140827050, 0.831586064975784130, -0.831613833731776660, 0.831641600408734030, 0.831669365006587390, 0.831697127525267370, 0.831724887964704560, 0.831752646324829480, 0.831780402605572840, 0.831808156806865150, -0.831835908928637570, 0.831863658970819820, 0.831891406933342740, 0.831919152816137260, 0.831946896619133900, 0.831974638342263260, 0.832002377985456070, 0.832030115548643370, -0.832057851031754890, 0.832085584434721800, 0.832113315757474830, 0.832141044999944460, 0.832168772162061530, 0.832196497243756660, 0.832224220244960570, 0.832251941165604410, -0.832279660005617820, 0.832307376764932160, 0.832335091443478060, 0.832362804041186230, 0.832390514557987400, 0.832418222993812300, 0.832445929348591520, 0.832473633622256570, -0.832501335814736950, 0.832529035925964060, 0.832556733955868490, 0.832584429904381080, 0.832612123771432680, 0.832639815556953990, 0.832667505260876180, 0.832695192883129100, -0.832722878423644120, 0.832750561882351860, 0.832778243259183260, 0.832805922554069040, 0.832833599766939940, 0.832861274897726990, 0.832888947946361260, 0.832916618912772690, -0.832944287796892450, 0.832971954598651590, 0.832999619317980830, 0.833027281954811130, 0.833054942509073080, 0.833082600980698200, 0.833110257369616410, 0.833137911675758900, -0.833165563899056600, 0.833193214039440360, 0.833220862096841210, 0.833248508071189780, 0.833276151962417110, 0.833303793770454600, 0.833331433495232090, 0.833359071136681060, -0.833386706694732250, 0.833414340169316700, 0.833441971560365370, 0.833469600867809080, 0.833497228091578670, 0.833524853231605740, 0.833552476287820250, 0.833580097260153590, -0.833607716148536570, 0.833635332952900380, 0.833662947673175840, 0.833690560309293890, 0.833718170861186050, 0.833745779328782240, 0.833773385712013980, 0.833800990010812320, -0.833828592225108190, 0.833856192354832550, 0.833883790399916450, 0.833911386360290830, 0.833938980235887310, 0.833966572026635710, 0.833994161732467880, 0.834021749353314520, -0.834049334889106710, 0.834076918339775710, 0.834104499705252360, 0.834132078985467820, 0.834159656180353480, 0.834187231289839510, 0.834214804313857530, 0.834242375252338460, -0.834269944105213490, 0.834297510872413770, 0.834325075553870140, 0.834352638149514330, 0.834380198659276480, 0.834407757083088120, 0.834435313420880290, 0.834462867672584260, -0.834490419838131100, 0.834517969917451750, 0.834545517910477600, 0.834573063817140140, 0.834600607637369430, 0.834628149371097310, 0.834655689018254710, 0.834683226578773030, -0.834710762052583210, 0.834738295439616420, 0.834765826739804480, 0.834793355953077460, 0.834820883079366970, 0.834848408118604390, 0.834875931070720670, 0.834903451935647300, -0.834930970713315120, 0.834958487403655640, 0.834986002006600340, 0.835013514522079610, 0.835041024950025080, 0.835068533290367900, 0.835096039543039460, 0.835123543707970930, -0.835151045785093580, 0.835178545774338590, 0.835206043675637670, 0.835233539488921210, 0.835261033214120820, 0.835288524851167890, 0.835316014399993700, 0.835343501860529410, -0.835370987232706420, 0.835398470516456440, 0.835425951711709750, 0.835453430818398290, 0.835480907836453120, 0.835508382765805750, 0.835535855606387430, 0.835563326358129470, -0.835590795020963120, 0.835618261594820330, 0.835645726079631390, 0.835673188475328230, 0.835700648781841910, 0.835728106999104160, 0.835755563127046020, 0.835783017165599000, -0.835810469114694480, 0.835837918974264180, 0.835865366744238720, 0.835892812424549710, 0.835920256015128760, 0.835947697515907140, 0.835975136926816240, 0.836002574247787570, -0.836030009478752940, 0.836057442619642770, 0.836084873670388970, 0.836112302630923070, 0.836139729501176430, 0.836167154281080350, 0.836194576970566430, 0.836221997569566060, -0.836249416078011290, 0.836276832495832290, 0.836304246822961340, 0.836331659059329820, 0.836359069204869020, 0.836386477259510650, 0.836413883223186110, 0.836441287095827210, -0.836468688877364700, 0.836496088567730500, 0.836523486166856010, 0.836550881674672840, 0.836578275091112490, 0.836605666416106340, 0.836633055649586120, 0.836660442791483770, -0.836687827841729790, 0.836715210800256240, 0.836742591666994720, 0.836769970441876620, 0.836797347124833670, 0.836824721715797250, 0.836852094214699080, 0.836879464621471230, -0.836906832936044180, 0.836934199158350100, 0.836961563288320390, 0.836988925325886870, 0.837016285270981040, 0.837043643123534520, 0.837070998883479240, 0.837098352550746160, -0.837125704125267100, 0.837153053606973780, 0.837180400995797820, 0.837207746291670940, 0.837235089494524630, 0.837262430604290510, 0.837289769620900960, 0.837317106544286370, -0.837344441374379130, 0.837371774111110740, 0.837399104754412930, 0.837426433304217290, 0.837453759760455550, 0.837481084123059550, 0.837508406391961220, 0.837535726567091410, -0.837563044648382270, 0.837590360635765530, 0.837617674529172910, 0.837644986328536120, 0.837672296033786900, 0.837699603644857290, 0.837726909161678250, 0.837754212584181920, -0.837781513912300160, 0.837808813145964560, 0.837836110285106850, 0.837863405329658970, 0.837890698279552540, 0.837917989134719820, 0.837945277895091660, 0.837972564560600320, -0.837999849131177530, 0.838027131606755130, 0.838054411987264940, 0.838081690272638680, 0.838108966462808750, 0.838136240557705860, 0.838163512557262400, 0.838190782461410100, -0.838218050270080890, 0.838245315983206510, 0.838272579600718880, 0.838299841122549850, 0.838327100548631580, 0.838354357878895120, 0.838381613113272860, 0.838408866251696530, -0.838436117294097950, 0.838463366240409070, 0.838490613090561940, 0.838517857844488070, 0.838545100502120170, 0.838572341063389070, 0.838599579528227060, 0.838626815896566070, -0.838654050168338050, 0.838681282343474940, 0.838708512421908580, 0.838735740403571460, 0.838762966288394530, 0.838790190076310060, 0.838817411767250220, 0.838844631361146840, -0.838871848857931870, 0.838899064257537350, 0.838926277559895020, 0.838953488764937580, 0.838980697872595990, 0.839007904882802520, 0.839035109795489340, 0.839062312610588390, -0.839089513328031720, 0.839116711947751170, 0.839143908469678900, 0.839171102893747410, 0.839198295219887540, 0.839225485448031990, 0.839252673578112730, 0.839279859610061800, -0.839307043543811250, 0.839334225379293030, 0.839361405116439750, 0.839388582755182470, 0.839415758295453670, 0.839442931737185650, 0.839470103080310110, 0.839497272324759460, -0.839524439470465510, 0.839551604517360550, 0.839578767465376960, 0.839605928314446140, 0.839633087064500350, 0.839660243715471880, 0.839687398267292770, 0.839714550719895200, -0.839741701073211330, 0.839768849327173550, 0.839795995481713240, 0.839823139536763020, 0.839850281492254820, 0.839877421348120930, 0.839904559104293510, 0.839931694760704730, -0.839958828317286740, 0.839985959773972060, 0.840013089130692060, 0.840040216387379360, 0.840067341543966120, 0.840094464600384390, 0.840121585556566690, 0.840148704412444940, -0.840175821167951420, 0.840202935823018750, 0.840230048377578420, 0.840257158831562820, 0.840284267184904450, 0.840311373437535370, 0.840338477589387840, 0.840365579640394160, -0.840392679590486910, 0.840419777439597620, 0.840446873187658760, 0.840473966834602740, 0.840501058380361820, 0.840528147824868290, 0.840555235168054420, 0.840582320409852370, -0.840609403550195090, 0.840636484589013740, 0.840663563526241160, 0.840690640361809740, 0.840717715095651740, 0.840744787727699450, 0.840771858257885140, 0.840798926686141650, -0.840825993012400460, 0.840853057236594200, 0.840880119358655250, 0.840907179378516110, 0.840934237296109060, 0.840961293111366250, 0.840988346824220300, 0.841015398434603930, -0.841042447942448650, 0.841069495347687270, 0.841096540650252080, 0.841123583850075570, 0.841150624947090030, 0.841177663941228060, 0.841204700832421830, 0.841231735620604380, -0.841258768305707120, 0.841285798887662860, 0.841312827366404110, 0.841339853741863370, 0.841366878013972920, 0.841393900182665360, 0.841420920247873520, 0.841447938209528790, -0.841474954067564340, 0.841501967821912440, 0.841528979472505600, 0.841555989019276420, 0.841582996462157170, 0.841610001801080480, 0.841637005035979160, 0.841664006166784940, -0.841691005193430760, 0.841718002115849020, 0.841744996933972200, 0.841771989647732920, 0.841798980257063680, 0.841825968761897080, 0.841852955162165960, 0.841879939457801930, -0.841906921648738150, 0.841933901734906900, 0.841960879716241010, 0.841987855592672970, 0.842014829364135190, 0.842041801030560920, 0.842068770591881570, 0.842095738048030400, -0.842122703398939800, 0.842149666644542490, 0.842176627784770980, 0.842203586819557870, 0.842230543748835880, 0.842257498572537950, 0.842284451290595810, 0.842311401902942510, -0.842338350409510770, 0.842365296810233090, 0.842392241105042180, 0.842419183293870670, 0.842446123376651700, 0.842473061353317010, 0.842499997223799530, 0.842526930988032220, -0.842553862645947450, 0.842580792197478060, 0.842607719642556650, 0.842634644981116070, 0.842661568213089240, 0.842688489338408010, 0.842715408357005540, 0.842742325268814650, -0.842769240073767860, 0.842796152771797980, 0.842823063362837850, 0.842849971846819870, 0.842876878223677520, 0.842903782493342520, 0.842930684655748050, 0.842957584710826820, -0.842984482658511780, 0.843011378498735310, 0.843038272231430570, 0.843065163856530630, 0.843092053373967200, 0.843118940783673660, 0.843145826085582750, 0.843172709279627400, -0.843199590365740100, 0.843226469343853920, 0.843253346213901580, 0.843280220975816340, 0.843307093629530050, 0.843333964174976080, 0.843360832612087160, 0.843387698940796130, -0.843414563161035910, 0.843441425272739240, 0.843468285275839060, 0.843495143170268520, 0.843521998955959810, 0.843548852632845960, 0.843575704200860030, 0.843602553659934860, -0.843629401010003390, 0.843656246250998330, 0.843683089382853080, 0.843709930405499690, 0.843736769318871430, 0.843763606122901360, 0.843790440817522190, 0.843817273402666880, -0.843844103878268470, 0.843870932244259690, 0.843897758500574140, 0.843924582647143760, 0.843951404683901840, 0.843978224610781420, 0.844005042427715460, 0.844031858134636880, -0.844058671731478750, 0.844085483218174340, 0.844112292594655700, 0.844139099860856330, 0.844165905016709290, 0.844192708062147410, 0.844219508997103850, 0.844246307821511440, -0.844273104535303350, 0.844299899138412860, 0.844326691630772230, 0.844353482012314860, 0.844380270282973690, 0.844407056442681990, 0.844433840491372490, 0.844460622428978570, -0.844487402255432950, 0.844514179970669350, 0.844540955574619830, 0.844567729067217890, 0.844594500448396680, 0.844621269718089260, 0.844648036876228580, 0.844674801922747800, -0.844701564857580520, 0.844728325680658920, 0.844755084391916380, 0.844781840991286170, 0.844808595478701460, 0.844835347854095090, 0.844862098117400540, 0.844888846268550650, -0.844915592307479040, 0.844942336234118070, 0.844969078048401270, 0.844995817750261780, 0.845022555339632660, 0.845049290816447200, 0.845076024180638540, 0.845102755432139750, -0.845129484570884660, 0.845156211596805320, 0.845182936509835450, 0.845209659309908210, 0.845236379996956890, 0.845263098570914530, 0.845289815031714520, 0.845316529379290360, -0.845343241613574440, 0.845369951734500470, 0.845396659742001510, 0.845423365636011060, 0.845450069416462060, 0.845476771083287890, 0.845503470636421840, 0.845530168075797620, -0.845556863401347500, 0.845583556613005110, 0.845610247710703920, 0.845636936694377120, 0.845663623563957970, 0.845690308319379750, 0.845716990960576180, 0.845743671487479750, -0.845770349900024090, 0.845797026198142570, 0.845823700381768460, 0.845850372450835160, 0.845877042405275840, 0.845903710245023980, 0.845930375970013300, 0.845957039580176210, -0.845983701075446510, 0.846010360455757620, 0.846037017721042780, 0.846063672871235410, 0.846090325906268870, 0.846116976826076450, 0.846143625630592090, 0.846170272319748170, -0.846196916893478650, 0.846223559351716780, 0.846250199694396080, 0.846276837921449810, 0.846303474032811480, 0.846330108028414910, 0.846356739908192600, 0.846383369672078390, -0.846409997320005880, 0.846436622851908240, 0.846463246267719180, 0.846489867567371880, 0.846516486750800050, 0.846543103817937400, 0.846569718768716450, 0.846596331603071350, -0.846622942320935270, 0.846649550922241920, 0.846676157406924700, 0.846702761774916990, 0.846729364026152510, 0.846755964160565090, 0.846782562178087120, 0.846809158078652870, -0.846835751862195730, 0.846862343528649200, 0.846888933077946770, 0.846915520510022060, 0.846942105824809000, 0.846968689022240210, 0.846995270102249730, 0.847021849064771070, -0.847048425909737720, 0.847075000637083410, 0.847101573246741510, 0.847128143738645640, 0.847154712112729970, 0.847181278368926980, 0.847207842507170850, 0.847234404527395180, -0.847260964429533360, 0.847287522213519220, 0.847314077879286250, 0.847340631426768520, 0.847367182855898740, 0.847393732166611070, 0.847420279358839010, 0.847446824432516290, -0.847473367387576500, 0.847499908223953270, 0.847526446941580300, 0.847552983540391660, 0.847579518020320170, 0.847606050381299770, 0.847632580623264300, 0.847659108746147360, -0.847685634749882680, 0.847712158634403860, 0.847738680399644730, 0.847765200045539240, 0.847791717572020430, 0.847818232979022260, 0.847844746266478430, 0.847871257434322790, -0.847897766482489050, 0.847924273410910920, 0.847950778219522470, 0.847977280908256640, 0.848003781477047690, 0.848030279925829240, 0.848056776254535020, 0.848083270463098950, -0.848109762551454650, 0.848136252519535950, 0.848162740367277120, 0.848189226094610890, 0.848215709701471750, 0.848242191187793200, 0.848268670553509190, 0.848295147798553530, -0.848321622922860060, 0.848348095926362960, 0.848374566808995030, 0.848401035570690800, 0.848427502211383970, 0.848453966731008480, 0.848480429129497950, 0.848506889406786310, -0.848533347562807520, 0.848559803597495830, 0.848586257510784200, 0.848612709302606900, 0.848639158972897770, 0.848665606521590730, 0.848692051948619740, 0.848718495253918630, -0.848744936437421330, 0.848771375499062010, 0.848797812438773950, 0.848824247256491190, 0.848850679952147910, 0.848877110525677940, 0.848903538977015090, 0.848929965306093550, -0.848956389512847460, 0.848982811597209900, 0.849009231559115450, 0.849035649398497850, 0.849062065115291030, 0.849088478709429160, 0.849114890180846070, 0.849141299529475700, -0.849167706755252660, 0.849194111858109780, 0.849220514837981670, 0.849246915694802260, 0.849273314428505620, 0.849299711039025680, 0.849326105526296390, 0.849352497890251910, -0.849378888130826630, 0.849405276247953590, 0.849431662241567410, 0.849458046111602140, 0.849484427857991610, 0.849510807480670200, 0.849537184979571650, 0.849563560354630540, -0.849589933605780170, 0.849616304732955020, 0.849642673736089040, 0.849669040615116280, 0.849695405369971010, 0.849721768000587300, 0.849748128506899070, 0.849774486888841050, -0.849800843146346300, 0.849827197279349410, 0.849853549287784560, 0.849879899171585910, 0.849906246930687390, 0.849932592565023400, 0.849958936074528220, 0.849985277459135320, -0.850011616718779230, 0.850037953853394090, 0.850064288862914070, 0.850090621747273350, 0.850116952506406070, 0.850143281140246400, 0.850169607648728950, 0.850195932031787120, -0.850222254289355380, 0.850248574421368030, 0.850274892427759220, 0.850301208308463230, 0.850327522063414110, 0.850353833692546250, 0.850380143195794360, 0.850406450573091500, -0.850432755824372610, 0.850459058949571860, 0.850485359948623400, 0.850511658821461510, 0.850537955568020480, 0.850564250188235120, 0.850590542682038600, 0.850616833049365750, -0.850643121290150740, 0.850669407404327950, 0.850695691391831770, 0.850721973252596240, 0.850748252986555760, 0.850774530593645160, 0.850800806073797820, 0.850827079426948350, -0.850853350653031250, 0.850879619751980790, 0.850905886723731240, 0.850932151568217000, 0.850958414285372440, 0.850984674875132190, 0.851010933337429830, 0.851037189672200210, -0.851063443879377490, 0.851089695958896280, 0.851115945910690730, 0.851142193734695460, 0.851168439430844970, 0.851194682999073080, 0.851220924439314410, 0.851247163751503440, -0.851273400935574580, 0.851299635991462190, 0.851325868919100780, 0.851352099718424630, 0.851378328389368670, 0.851404554931866510, 0.851430779345852870, 0.851457001631262370, -0.851483221788029270, 0.851509439816088180, 0.851535655715373490, 0.851561869485820130, 0.851588081127361620, 0.851614290639932880, 0.851640498023468420, 0.851666703277902730, -0.851692906403170300, 0.851719107399205640, 0.851745306265943140, 0.851771503003317830, 0.851797697611263340, 0.851823890089714600, 0.851850080438606220, 0.851876268657872470, -0.851902454747448190, 0.851928638707267650, 0.851954820537265680, 0.851981000237377000, 0.852007177807535320, 0.852033353247675820, 0.852059526557732870, 0.852085697737641090, -0.852111866787335080, 0.852138033706749340, 0.852164198495819040, 0.852190361154477770, 0.852216521682660710, 0.852242680080302240, 0.852268836347337080, 0.852294990483699830, -0.852321142489325110, 0.852347292364147520, 0.852373440108102120, 0.852399585721122730, 0.852425729203144300, 0.852451870554101650, 0.852478009773929290, 0.852504146862561930, -0.852530281819934180, 0.852556414645980640, 0.852582545340636600, 0.852608673903835770, 0.852634800335513200, 0.852660924635603610, 0.852687046804041730, 0.852713166840762260, -0.852739284745699930, 0.852765400518789800, 0.852791514159965680, 0.852817625669162750, 0.852843735046315830, 0.852869842291359540, 0.852895947404228580, 0.852922050384857800, -0.852948151233181910, 0.852974249949136070, 0.853000346532654220, 0.853026440983671420, 0.853052533302122610, 0.853078623487942390, 0.853104711541065600, 0.853130797461427060, -0.853156881248962050, 0.853182962903604290, 0.853209042425289170, 0.853235119813951390, 0.853261195069525910, 0.853287268191947330, 0.853313339181150710, 0.853339408037070650, -0.853365474759642530, 0.853391539348800300, 0.853417601804479120, 0.853443662126614040, 0.853469720315139790, 0.853495776369991190, 0.853521830291103180, 0.853547882078410700, -0.853573931731848810, 0.853599979251351780, 0.853626024636854660, 0.853652067888292510, 0.853678109005600260, 0.853704147988712750, 0.853730184837564800, 0.853756219552091800, -0.853782252132227910, 0.853808282577908310, 0.853834310889068140, 0.853860337065642020, 0.853886361107565110, 0.853912383014772350, 0.853938402787198570, 0.853964420424779270, -0.853990435927448500, 0.854016449295141530, 0.854042460527793530, 0.854068469625339330, 0.854094476587713980, 0.854120481414852530, 0.854146484106689810, 0.854172484663161310, -0.854198483084201100, 0.854224479369744770, 0.854250473519727160, 0.854276465534083430, 0.854302455412748520, 0.854328443155657480, 0.854354428762745700, 0.854380412233947560, -0.854406393569198230, 0.854432372768432980, 0.854458349831586860, 0.854484324758594820, 0.854510297549391900, 0.854536268203913370, 0.854562236722094530, 0.854588203103869630, -0.854614167349174280, 0.854640129457943430, 0.854666089430112350, 0.854692047265615980, 0.854718002964389600, 0.854743956526368590, 0.854769907951487220, 0.854795857239681100, -0.854821804390885290, 0.854847749405035050, 0.854873692282065440, 0.854899633021911520, 0.854925571624508550, 0.854951508089792140, 0.854977442417696460, 0.855003374608157230, -0.855029304661109490, 0.855055232576488520, 0.855081158354229490, 0.855107081994267550, 0.855133003496537870, 0.855158922860976280, 0.855184840087516720, 0.855210755176095240, -0.855236668126646780, 0.855262578939106620, 0.855288487613410030, 0.855314394149492290, 0.855340298547288990, 0.855366200806734530, 0.855392100927764520, 0.855417998910314230, -0.855443894754318920, 0.855469788459713890, 0.855495680026434500, 0.855521569454415820, 0.855547456743593670, 0.855573341893902440, 0.855599224905277840, 0.855625105777655160, -0.855650984510969770, 0.855676861105156950, 0.855702735560151860, 0.855728607875890450, 0.855754478052307090, 0.855780346089337510, 0.855806211986917090, 0.855832075744981100, -0.855857937363464940, 0.855883796842303870, 0.855909654181433390, 0.855935509380789220, 0.855961362440305850, 0.855987213359919010, 0.856013062139564180, 0.856038908779176650, -0.856064753278691910, 0.856090595638045240, 0.856116435857172120, 0.856142273936008390, 0.856168109874488440, 0.856193943672548310, 0.856219775330123170, 0.856245604847148730, -0.856271432223560170, 0.856297257459293190, 0.856323080554283410, 0.856348901508465430, 0.856374720321775310, 0.856400536994148310, 0.856426351525520050, 0.856452163915825790, -0.856477974165001150, 0.856503782272981630, 0.856529588239703150, 0.856555392065100120, 0.856581193749108680, 0.856606993291664230, 0.856632790692702370, 0.856658585952158490, -0.856684379069968080, 0.856710170046066870, 0.856735958880390560, 0.856761745572873990, 0.856787530123452990, 0.856813312532063160, 0.856839092798640010, 0.856864870923119250, -0.856890646905436260, 0.856916420745527100, 0.856942192443326370, 0.856967961998770230, 0.856993729411794190, 0.857019494682333850, 0.857045257810324700, 0.857071018795702470, -0.857096777638402640, 0.857122534338361390, 0.857148288895513310, 0.857174041309794470, 0.857199791581140570, 0.857225539709487230, 0.857251285694769940, 0.857277029536924530, -0.857302771235886940, 0.857328510791592000, 0.857354248203975770, 0.857379983472973950, 0.857405716598522160, 0.857431447580556010, 0.857457176419011310, 0.857482903113823690, -0.857508627664929190, 0.857534350072262750, 0.857560070335760430, 0.857585788455357820, 0.857611504430990880, 0.857637218262595090, 0.857662929950106290, 0.857688639493460190, -0.857714346892592850, 0.857740052147439310, 0.857765755257935520, 0.857791456224017420, 0.857817155045620730, 0.857842851722681040, 0.857868546255134310, 0.857894238642916580, -0.857919928885962910, 0.857945616984209350, 0.857971302937591720, 0.857996986746045850, 0.858022668409507580, 0.858048347927912620, 0.858074025301196700, 0.858099700529296290, -0.858125373612146140, 0.858151044549682500, 0.858176713341841310, 0.858202379988558310, 0.858228044489769300, 0.858253706845410250, 0.858279367055416960, 0.858305025119725620, -0.858330681038271370, 0.858356334810990380, 0.858381986437818490, 0.858407635918691740, 0.858433283253545730, 0.858458928442316640, 0.858484571484940730, 0.858510212381352830, -0.858535851131489450, 0.858561487735286510, 0.858587122192679740, 0.858612754503605190, 0.858638384667998800, 0.858664012685796400, 0.858689638556934360, 0.858715262281347870, -0.858740883858973290, 0.858766503289746350, 0.858792120573603210, 0.858817735710479810, 0.858843348700311980, 0.858868959543036330, 0.858894568238587790, 0.858920174786902860, -0.858945779187917480, 0.858971381441567590, 0.858996981547789250, 0.859022579506518500, 0.859048175317691290, 0.859073768981244100, 0.859099360497112110, 0.859124949865231580, -0.859150537085538790, 0.859176122157969570, 0.859201705082460080, 0.859227285858946370, 0.859252864487364380, 0.859278440967650710, 0.859304015299740540, 0.859329587483570250, -0.859355157519075990, 0.859380725406193920, 0.859406291144860000, 0.859431854735010270, 0.859457416176581450, 0.859482975469508580, 0.859508532613728280, 0.859534087609176710, -0.859559640455789920, 0.859585191153503960, 0.859610739702255100, 0.859636286101979290, 0.859661830352613340, 0.859687372454092210, 0.859712912406352730, 0.859738450209331040, -0.859763985862963100, 0.859789519367185280, 0.859815050721933650, 0.859840579927144360, 0.859866106982754120, 0.859891631888698100, 0.859917154644913030, 0.859942675251335160, -0.859968193707900450, 0.859993710014545390, 0.860019224171205910, 0.860044736177818960, 0.860070246034319700, 0.860095753740644730, 0.860121259296730440, 0.860146762702513000, -0.860172263957928670, 0.860197763062913620, 0.860223260017404230, 0.860248754821337110, 0.860274247474647650, 0.860299737977272550, 0.860325226329148210, 0.860350712530210670, -0.860376196580396440, 0.860401678479641660, 0.860427158227883180, 0.860452635825056380, 0.860478111271097970, 0.860503584565944220, 0.860529055709531530, 0.860554524701796280, -0.860579991542674620, 0.860605456232103050, 0.860630918770018180, 0.860656379156355620, 0.860681837391052200, 0.860707293474044180, 0.860732747405267840, 0.860758199184659680, -0.860783648812155970, 0.860809096287693200, 0.860834541611208090, 0.860859984782636150, 0.860885425801914290, 0.860910864668978930, 0.860936301383766310, 0.860961735946212950, -0.860987168356255330, 0.861012598613830170, 0.861038026718873080, 0.861063452671321010, 0.861088876471110210, 0.861114298118177190, 0.861139717612458440, 0.861165134953890470, -0.861190550142409640, 0.861215963177952790, 0.861241374060455640, 0.861266782789855130, 0.861292189366087650, 0.861317593789089560, 0.861342996058797610, 0.861368396175148150, -0.861393794138077710, 0.861419189947523200, 0.861444583603420240, 0.861469975105705890, 0.861495364454316630, 0.861520751649188840, 0.861546136690259260, 0.861571519577464360, -0.861596900310740990, 0.861622278890025070, 0.861647655315253340, 0.861673029586362490, 0.861698401703289150, 0.861723771665969700, 0.861749139474340840, 0.861774505128339200, -0.861799868627901700, 0.861825229972964070, 0.861850589163463350, 0.861875946199336160, 0.861901301080519210, 0.861926653806948880, 0.861952004378562010, 0.861977352795295530, -0.862002699057085150, 0.862028043163868160, 0.862053385115580940, 0.862078724912160310, 0.862104062553542880, 0.862129398039665260, 0.862154731370464280, 0.862180062545876760, -0.862205391565838640, 0.862230718430287090, 0.862256043139158820, 0.862281365692390330, 0.862306686089918450, 0.862332004331679890, 0.862357320417611260, 0.862382634347649830, -0.862407946121731330, 0.862433255739793010, 0.862458563201771610, 0.862483868507603610, 0.862509171657226070, 0.862534472650575590, 0.862559771487589440, 0.862585068168203350, -0.862610362692354580, 0.862635655059979860, 0.862660945271016110, 0.862686233325399840, 0.862711519223068100, 0.862736802963957610, 0.862762084548005400, 0.862787363975147660, -0.862812641245321530, 0.862837916358463740, 0.862863189314511110, 0.862888460113400590, 0.862913728755068890, 0.862938995239452830, 0.862964259566489810, 0.862989521736115650, -0.863014781748267730, 0.863040039602882780, 0.863065295299897840, 0.863090548839249520, 0.863115800220874860, 0.863141049444711260, 0.863166296510694540, 0.863191541418761980, -0.863216784168850610, 0.863242024760897400, 0.863267263194839040, 0.863292499470612480, 0.863317733588154780, 0.863342965547403090, 0.863368195348293570, 0.863393422990763600, -0.863418648474750030, 0.863443871800189780, 0.863469092967020010, 0.863494311975177340, 0.863519528824599480, 0.863544743515222260, 0.863569956046983280, 0.863595166419819260, -0.863620374633667480, 0.863645580688464640, 0.863670784584147920, 0.863695986320654250, 0.863721185897921020, 0.863746383315884380, 0.863771578574481720, 0.863796771673650210, -0.863821962613326780, 0.863847151393448360, 0.863872338013952130, 0.863897522474775030, 0.863922704775854530, 0.863947884917126930, 0.863973062898529600, 0.863998238719999480, -0.864023412381473950, 0.864048583882889740, 0.864073753224184120, 0.864098920405294570, 0.864124085426157260, 0.864149248286709800, 0.864174408986889130, 0.864199567526632520, -0.864224723905876900, 0.864249878124559560, 0.864275030182617420, 0.864300180079988320, 0.864325327816608200, 0.864350473392414780, 0.864375616807345090, 0.864400758061336540, -0.864425897154325940, 0.864451034086250680, 0.864476168857048250, 0.864501301466654940, 0.864526431915008440, 0.864551560202045820, 0.864576686327704240, 0.864601810291921070, -0.864626932094633260, 0.864652051735778190, 0.864677169215293470, 0.864702284533115260, 0.864727397689181390, 0.864752508683429120, 0.864777617515795400, 0.864802724186217840, -0.864827828694633370, 0.864852931040979270, 0.864878031225193360, 0.864903129247211910, 0.864928225106972650, 0.864953318804412840, 0.864978410339469650, 0.865003499712080570, -0.865028586922182650, 0.865053671969713720, 0.865078754854610170, 0.865103835576809700, 0.865128914136249700, 0.865153990532867350, 0.865179064766600110, 0.865204136837385170, -0.865229206745159910, 0.865254274489862030, 0.865279340071428040, 0.865304403489795650, 0.865329464744902350, 0.865354523836685320, 0.865379580765082030, 0.865404635530029780, -0.865429688131465810, 0.865454738569328200, 0.865479786843553310, 0.865504832954078870, 0.865529876900842490, 0.865554918683781200, 0.865579958302832850, 0.865604995757934480, -0.865630031049024030, 0.865655064176038100, 0.865680095138914530, 0.865705123937590690, 0.865730150572004090, 0.865755175042092100, 0.865780197347792100, 0.865805217489041710, -0.865830235465778640, 0.865855251277939610, 0.865880264925462440, 0.865905276408284520, 0.865930285726343450, 0.865955292879576730, 0.865980297867921740, 0.866005300691316430, -0.866030301349697500, 0.866055299843002780, 0.866080296171169770, 0.866105290334135970, 0.866130282331839090, 0.866155272164216390, 0.866180259831205610, 0.866205245332744460, -0.866230228668769860, 0.866255209839219660, 0.866280188844031570, 0.866305165683142860, 0.866330140356491250, 0.866355112864014340, 0.866380083205649630, 0.866405051381335170, -0.866430017391007560, 0.866454981234604960, 0.866479942912064980, 0.866504902423325010, 0.866529859768322860, 0.866554814946996040, 0.866579767959282710, 0.866604718805119360, -0.866629667484444370, 0.866654613997195120, 0.866679558343309340, 0.866704500522724740, 0.866729440535378810, 0.866754378381209280, 0.866779314060154290, 0.866804247572150470, -0.866829178917136180, 0.866854108095048810, 0.866879035105826310, 0.866903959949406170, 0.866928882625725980, 0.866953803134723810, 0.866978721476337480, 0.867003637650503810, -0.867028551657161200, 0.867053463496247120, 0.867078373167699420, 0.867103280671455810, 0.867128186007453890, 0.867153089175632050, 0.867177990175927000, 0.867202889008277020, -0.867227785672619820, 0.867252680168893120, 0.867277572497034740, 0.867302462656982410, 0.867327350648673940, 0.867352236472047510, 0.867377120127040050, 0.867402001613589820, -0.867426880931634560, 0.867451758081112080, 0.867476633061960210, 0.867501505874116790, 0.867526376517520070, 0.867551244992106900, 0.867576111297815640, 0.867600975434584140, -0.867625837402350220, 0.867650697201051700, 0.867675554830626310, 0.867700410291012190, 0.867725263582147410, 0.867750114703969010, 0.867774963656415380, 0.867799810439424340, -0.867824655052933710, 0.867849497496881450, 0.867874337771205480, 0.867899175875843750, 0.867924011810734420, 0.867948845575814640, 0.867973677171022700, 0.867998506596296630, -0.868023333851574260, 0.868048158936793660, 0.868072981851892520, 0.868097802596809460, 0.868122621171481420, 0.868147437575846780, 0.868172251809843590, 0.868197063873409780, -0.868221873766483300, 0.868246681489002080, 0.868271487040904290, 0.868296290422128080, 0.868321091632610840, 0.868345890672290730, 0.868370687541106020, 0.868395482238994540, -0.868420274765894340, 0.868445065121743460, 0.868469853306479970, 0.868494639320042230, 0.868519423162367410, 0.868544204833394120, 0.868568984333060290, 0.868593761661303980, -0.868618536818063340, 0.868643309803276200, 0.868668080616881390, 0.868692849258815850, 0.868717615729018180, 0.868742380027426540, 0.868767142153978880, 0.868791902108613460, -0.868816659891268220, 0.868841415501881320, 0.868866168940391370, 0.868890920206735530, 0.868915669300852290, 0.868940416222680030, 0.868965160972156700, 0.868989903549220340, -0.869014643953809340, 0.869039382185862190, 0.869064118245316040, 0.869088852132109730, 0.869113583846181200, 0.869138313387468720, 0.869163040755910440, 0.869187765951444650, -0.869212488974009380, 0.869237209823543360, 0.869261928499983850, 0.869286645003269460, 0.869311359333338470, 0.869336071490129150, 0.869360781473579650, 0.869385489283628130, -0.869410194920212990, 0.869434898383272700, 0.869459599672744780, 0.869484298788567920, 0.869508995730680190, 0.869533690499020070, 0.869558383093525620, 0.869583073514135330, -0.869607761760787690, 0.869632447833420310, 0.869657131731971680, 0.869681813456380290, 0.869706493006584420, 0.869731170382522230, 0.869755845584132210, 0.869780518611352530, -0.869805189464122000, 0.869829858142378010, 0.869854524646059390, 0.869879188975104520, 0.869903851129451570, 0.869928511109039130, 0.869953168913805360, 0.869977824543688550, -0.870002477998627730, 0.870027129278560300, 0.870051778383424960, 0.870076425313160210, 0.870101070067704430, 0.870125712646996010, 0.870150353050973210, 0.870174991279574980, -0.870199627332738920, 0.870224261210403750, 0.870248892912507950, 0.870273522438989810, 0.870298149789787920, 0.870322774964840780, 0.870347397964086560, 0.870372018787464290, -0.870396637434911580, 0.870421253906367260, 0.870445868201769830, 0.870470480321057670, 0.870495090264169380, 0.870519698031043340, 0.870544303621618500, 0.870568907035832450, -0.870593508273624140, 0.870618107334932060, 0.870642704219694700, 0.870667298927850550, 0.870691891459338230, 0.870716481814096110, 0.870741069992063240, 0.870765655993177230, -0.870790239817377130, 0.870814821464601430, 0.870839400934788730, 0.870863978227877420, 0.870888553343806220, 0.870913126282513610, 0.870937697043938640, 0.870962265628019040, -0.870986832034693740, 0.871011396263901340, 0.871035958315580450, 0.871060518189669670, 0.871085075886107620, 0.871109631404833220, 0.871134184745784410, 0.871158735908900140, -0.871183284894119000, 0.871207831701379610, 0.871232376330620670, 0.871256918781780800, 0.871281459054798700, 0.871305997149613320, 0.871330533066162480, 0.871355066804385350, -0.871379598364220520, 0.871404127745606720, 0.871428654948482650, 0.871453179972786820, 0.871477702818458600, 0.871502223485435600, 0.871526741973657090, 0.871551258283061680, -0.871575772413588190, 0.871600284365175230, 0.871624794137761620, 0.871649301731285960, 0.871673807145687430, 0.871698310380904060, 0.871722811436874910, 0.871747310313538690, -0.871771807010834120, 0.871796301528700130, 0.871820793867075340, 0.871845284025898670, 0.871869772005109070, 0.871894257804644690, 0.871918741424444700, 0.871943222864447810, -0.871967702124592850, 0.871992179204818640, 0.872016654105064020, 0.872041126825268130, 0.872065597365369040, 0.872090065725305900, 0.872114531905017750, 0.872138995904443100, -0.872163457723521000, 0.872187917362190370, 0.872212374820389820, 0.872236830098058860, 0.872261283195135300, 0.872285734111558520, 0.872310182847267470, 0.872334629402200970, -0.872359073776297840, 0.872383515969497150, 0.872407955981737480, 0.872432393812958450, 0.872456829463098100, 0.872481262932095600, 0.872505694219889880, 0.872530123326419990, -0.872554550251624760, 0.872578974995443120, 0.872603397557814580, 0.872627817938677050, 0.872652236137970050, 0.872676652155632390, 0.872701065991603020, 0.872725477645821090, -0.872749887118225430, 0.872774294408755090, 0.872798699517349450, 0.872823102443946560, 0.872847503188486030, 0.872871901750906680, 0.872896298131147550, 0.872920692329147710, -0.872945084344846080, 0.872969474178182270, 0.872993861829094220, 0.873018247297521640, 0.873042630583403370, 0.873067011686678550, 0.873091390607286130, 0.873115767345165380, -0.873140141900255130, 0.873164514272494970, 0.873188884461822970, 0.873213252468178940, 0.873237618291501700, 0.873261981931730440, 0.873286343388804180, 0.873310702662662090, -0.873335059753243210, 0.873359414660487170, 0.873383767384332210, 0.873408117924717730, 0.873432466281583000, 0.873456812454867060, 0.873481156444509080, 0.873505498250448320, -0.873529837872624170, 0.873554175310975010, 0.873578510565440340, 0.873602843635959530, 0.873627174522471520, 0.873651503224915580, 0.873675829743230880, 0.873700154077356570, -0.873724476227232370, 0.873748796192796550, 0.873773113973988710, 0.873797429570748130, 0.873821742983013960, 0.873846054210725360, 0.873870363253821720, 0.873894670112242200, -0.873918974785926280, 0.873943277274812690, 0.873967577578840800, 0.873991875697949890, 0.874016171632079450, 0.874040465381168420, 0.874064756945156400, 0.874089046323982770, -0.874113333517586130, 0.874137618525906210, 0.874161901348882160, 0.874186181986453480, 0.874210460438559210, 0.874234736705138850, 0.874259010786131660, 0.874283282681477370, -0.874307552391114460, 0.874331819914982660, 0.874356085253021330, 0.874380348405169760, 0.874404609371367330, 0.874428868151553300, 0.874453124745667610, 0.874477379153648650, -0.874501631375436350, 0.874525881410969870, 0.874550129260188710, 0.874574374923032140, 0.874598618399439750, 0.874622859689350720, 0.874647098792705080, 0.874671335709441220, -0.874695570439498970, 0.874719802982817820, 0.874744033339337150, 0.874768261508996450, 0.874792487491735100, 0.874816711287492500, 0.874840932896208460, 0.874865152317821800, -0.874889369552272260, 0.874913584599499190, 0.874937797459442220, 0.874962008132040720, 0.874986216617234300, 0.875010422914962670, 0.875034627025164550, 0.875058828947779980, -0.875083028682748230, 0.875107226230008920, 0.875131421589501520, 0.875155614761165660, 0.875179805744940700, 0.875203994540766690, 0.875228181148582140, 0.875252365568327310, -0.875276547799941460, 0.875300727843364320, 0.875324905698535270, 0.875349081365394020, 0.875373254843880070, 0.875397426133933340, 0.875421595235492680, 0.875445762148498010, -0.875469926872888940, 0.875494089408605070, 0.875518249755586010, 0.875542407913771250, 0.875566563883100950, 0.875590717663513820, 0.875614869254949800, 0.875639018657348720, -0.875663165870650070, 0.875687310894793460, 0.875711453729718590, 0.875735594375365080, 0.875759732831673080, 0.875783869098581190, 0.875808003176029690, 0.875832135063958180, -0.875856264762306380, 0.875880392271013890, 0.875904517590020410, 0.875928640719266130, 0.875952761658689740, 0.875976880408231520, 0.876000996967830960, 0.876025111337428000, -0.876049223516962350, 0.876073333506373510, 0.876097441305601410, 0.876121546914586100, 0.876145650333266410, 0.876169751561582720, 0.876193850599474630, 0.876217947446881860, -0.876242042103744350, 0.876266134570001580, 0.876290224845593600, 0.876314312930460360, 0.876338398824541010, 0.876362482527775600, 0.876386564040104070, 0.876410643361466010, -0.876434720491801490, 0.876458795431049990, 0.876482868179152110, 0.876506938736046460, 0.876531007101673640, 0.876555073275973150, 0.876579137258885030, 0.876603199050349110, -0.876627258650305220, 0.876651316058693060, 0.876675371275453140, 0.876699424300524280, 0.876723475133846960, 0.876747523775360800, 0.876771570225005960, 0.876795614482722140, -0.876819656548449400, 0.876843696422127450, 0.876867734103696670, 0.876891769593096120, 0.876915802890266050, 0.876939833995146630, 0.876963862907677580, 0.876987889627798830, -0.877011914155450430, 0.877035936490572650, 0.877059956633104540, 0.877083974582986590, 0.877107990340158740, 0.877132003904560810, 0.877156015276132960, 0.877180024454815020, -0.877204031440547040, 0.877228036233269390, 0.877252038832921240, 0.877276039239443080, 0.877300037452774740, 0.877324033472856260, 0.877348027299627690, 0.877372018933029190, -0.877396008373000910, 0.877419995619482250, 0.877443980672413690, 0.877467963531735060, 0.877491944197386520, 0.877515922669308220, 0.877539898947440000, 0.877563873031722120, -0.877587844922094960, 0.877611814618497800, 0.877635782120871010, 0.877659747429154760, 0.877683710543289200, 0.877707671463214380, 0.877731630188870350, 0.877755586720197270, -0.877779541057135630, 0.877803493199624700, 0.877827443147605080, 0.877851390901016830, 0.877875336459800090, 0.877899279823895040, 0.877923220993241720, 0.877947159967780830, -0.877971096747451660, 0.877995031332194700, 0.878018963721950210, 0.878042893916658240, 0.878066821916258950, 0.878090747720692730, 0.878114671329899620, 0.878138592743820330, -0.878162511962394030, 0.878186428985561540, 0.878210343813262910, 0.878234256445438400, 0.878258166882028290, 0.878282075122972740, 0.878305981168212460, 0.878329885017686830, -0.878353786671336350, 0.878377686129101500, 0.878401583390922450, 0.878425478456739460, 0.878449371326492700, 0.878473262000122550, 0.878497150477569710, 0.878521036758773580, -0.878544920843674750, 0.878568802732213720, 0.878592682424330640, 0.878616559919965790, 0.878640435219059660, 0.878664308321552400, 0.878688179227384740, 0.878712047936496270, -0.878735914448827700, 0.878759778764319210, 0.878783640882911390, 0.878807500804544510, 0.878831358529158830, 0.878855214056695090, 0.878879067387092980, 0.878902918520293230, -0.878926767456236100, 0.878950614194862090, 0.878974458736111570, 0.878998301079924830, 0.879022141226242450, 0.879045979175005040, 0.879069814926152330, 0.879093648479625010, -0.879117479835363700, 0.879141308993308560, 0.879165135953400180, 0.879188960715578950, 0.879212783279785360, 0.879236603645960240, 0.879260421814043180, 0.879284237783975020, -0.879308051555696360, 0.879331863129147460, 0.879355672504268940, 0.879379479681001270, 0.879403284659285300, 0.879427087439060730, 0.879450888020268380, 0.879474686402848870, -0.879498482586742570, 0.879522276571890080, 0.879546068358232010, 0.879569857945708630, 0.879593645334261100, 0.879617430523829010, 0.879641213514353320, 0.879664994305774720, -0.879688772898033490, 0.879712549291070340, 0.879736323484825890, 0.879760095479241060, 0.879783865274255560, 0.879807632869810340, 0.879831398265846110, 0.879855161462303360, -0.879878922459122690, 0.879902681256244710, 0.879926437853610020, 0.879950192251159670, 0.879973944448833370, 0.879997694446572280, 0.880021442244317000, 0.880045187842008030, -0.880068931239586070, 0.880092672436991850, 0.880116411434165860, 0.880140148231049360, 0.880163882827582070, 0.880187615223705030, 0.880211345419358970, 0.880235073414484480, -0.880258799209022390, 0.880282522802913300, 0.880306244196098260, 0.880329963388517210, 0.880353680380111300, 0.880377395170821140, 0.880401107760587550, 0.880424818149351140, -0.880448526337052730, 0.880472232323632920, 0.880495936109033090, 0.880519637693192860, 0.880543337076053590, 0.880567034257556000, 0.880590729237640810, 0.880614422016248730, -0.880638112593320700, 0.880661800968797310, 0.880685487142619850, 0.880709171114728350, 0.880732852885063870, 0.880756532453567220, 0.880780209820179240, 0.880803884984840750, -0.880827557947492570, 0.880851228708075860, 0.880874897266530680, 0.880898563622798280, 0.880922227776819500, 0.880945889728535050, 0.880969549477885970, 0.880993207024812990, -0.881016862369257030, 0.881040515511159250, 0.881064166450459820, 0.881087815187099890, 0.881111461721020510, 0.881135106052162500, 0.881158748180466690, 0.881182388105874010, -0.881206025828325750, 0.881229661347762040, 0.881253294664124160, 0.881276925777353060, 0.881300554687389660, 0.881324181394174790, 0.881347805897649490, 0.881371428197754710, -0.881395048294431830, 0.881418666187620880, 0.881442281877263260, 0.881465895363299890, 0.881489506645671830, 0.881513115724320010, 0.881536722599185360, 0.881560327270208940, -0.881583929737332130, 0.881607530000494970, 0.881631128059639170, 0.881654723914705450, 0.881678317565634860, 0.881701909012368560, 0.881725498254847470, 0.881749085293012990, -0.881772670126805490, 0.881796252756166240, 0.881819833181036410, 0.881843411401356910, 0.881866987417068930, 0.881890561228113490, 0.881914132834431650, 0.881937702235964900, -0.881961269432653520, 0.881984834424438870, 0.882008397211262230, 0.882031957793064540, 0.882055516169786950, 0.882079072341370620, 0.882102626307756600, 0.882126178068886380, -0.882149727624700340, 0.882173274975139980, 0.882196820120146330, 0.882220363059660780, 0.882243903793624270, 0.882267442321977960, 0.882290978644663550, 0.882314512761621210, -0.882338044672792530, 0.882361574378118910, 0.882385101877541160, 0.882408627171000770, 0.882432150258438800, 0.882455671139796500, 0.882479189815015390, 0.882502706284035820, -0.882526220546799630, 0.882549732603247760, 0.882573242453321580, 0.882596750096962370, 0.882620255534111280, 0.882643758764709910, 0.882667259788698750, 0.882690758606019420, -0.882714255216613180, 0.882737749620421290, 0.882761241817385130, 0.882784731807445770, 0.882808219590544670, 0.882831705166623350, 0.882855188535622390, 0.882878669697483410, -0.882902148652147780, 0.882925625399556880, 0.882949099939651760, 0.882972572272374020, 0.882996042397664830, 0.883019510315465880, 0.883042976025717800, 0.883066439528362170, -0.883089900823340600, 0.883113359910594140, 0.883136816790064390, 0.883160271461692510, 0.883183723925420440, 0.883207174181188660, 0.883230622228938890, 0.883254068068612510, -0.883277511700151120, 0.883300953123495770, 0.883324392338588170, 0.883347829345369480, 0.883371264143781750, 0.883394696733765360, 0.883418127115262350, 0.883441555288213890, -0.883464981252561570, 0.883488405008246770, 0.883511826555211100, 0.883535245893395720, 0.883558663022742660, 0.883582077943192550, 0.883605490654687300, 0.883628901157168300, -0.883652309450576930, 0.883675715534854910, 0.883699119409943610, 0.883722521075784860, 0.883745920532319370, 0.883769317779489190, 0.883792712817235590, 0.883816105645500280, -0.883839496264224760, 0.883862884673350390, 0.883886270872818900, 0.883909654862572110, 0.883933036642550740, 0.883956416212696830, 0.883979793572951870, 0.884003168723257350, -0.884026541663554990, 0.884049912393786270, 0.884073280913893140, 0.884096647223816420, 0.884120011323498160, 0.884143373212879720, 0.884166732891902950, 0.884190090360509330, -0.884213445618640460, 0.884236798666238060, 0.884260149503243940, 0.884283498129599170, 0.884306844545245550, 0.884330188750124810, 0.884353530744178660, 0.884376870527348700, -0.884400208099576530, 0.884423543460803870, 0.884446876610972770, 0.884470207550023920, 0.884493536277899730, 0.884516862794541670, 0.884540187099891350, 0.884563509193890710, -0.884586829076481120, 0.884610146747605080, 0.884633462207203070, 0.884656775455217480, 0.884680086491590020, 0.884703395316262300, 0.884726701929176020, 0.884750006330273010, -0.884773308519495090, 0.884796608496784210, 0.884819906262081400, 0.884843201815328830, 0.884866495156468310, 0.884889786285441570, 0.884913075202190310, 0.884936361906656370, -0.884959646398781890, 0.884982928678507920, 0.885006208745776620, 0.885029486600529820, 0.885052762242709350, 0.885076035672256900, 0.885099306889114310, 0.885122575893223520, -0.885145842684526780, 0.885169107262964940, 0.885192369628480360, 0.885215629781014760, 0.885238887720510180, 0.885262143446908350, 0.885285396960151180, 0.885308648260180520, -0.885331897346938730, 0.885355144220366650, 0.885378388880406760, 0.885401631327000890, 0.885424871560090980, 0.885448109579618840, 0.885471345385526520, 0.885494578977756190, -0.885517810356248880, 0.885541039520947200, 0.885564266471792870, 0.885587491208727930, 0.885610713731694200, 0.885633934040633730, 0.885657152135488350, 0.885680368016200540, -0.885703581682711460, 0.885726793134963280, 0.885750002372898250, 0.885773209396458210, 0.885796414205585080, 0.885819616800220920, 0.885842817180307770, 0.885866015345788020, -0.885889211296602700, 0.885912405032694420, 0.885935596554005110, 0.885958785860476830, 0.885981972952051610, 0.886005157828671400, 0.886028340490278790, 0.886051520936814830, -0.886074699168222120, 0.886097875184442610, 0.886121048985418440, 0.886144220571091660, 0.886167389941404320, 0.886190557096298460, 0.886213722035716690, 0.886236884759600160, -0.886260045267891480, 0.886283203560532700, 0.886306359637465850, 0.886329513498633090, 0.886352665143976590, 0.886375814573438840, 0.886398961786961090, 0.886422106784485960, -0.886445249565955500, 0.886468390131312070, 0.886491528480497500, 0.886514664613454180, 0.886537798530124270, 0.886560930230450240, 0.886584059714373370, 0.886607186981836490, -0.886630312032781530, 0.886653434867150870, 0.886676555484886550, 0.886699673885930960, 0.886722790070226030, 0.886745904037714690, 0.886769015788338110, 0.886792125322038990, -0.886815232638759500, 0.886838337738442010, 0.886861440621028670, 0.886884541286461660, 0.886907639734683780, 0.886930735965636430, 0.886953829979262090, 0.886976921775503360, -0.887000011354302180, 0.887023098715601030, 0.887046183859342090, 0.887069266785467710, 0.887092347493920630, 0.887115425984642210, 0.887138502257575290, 0.887161576312662010, -0.887184648149844880, 0.887207717769066150, 0.887230785170268100, 0.887253850353392990, 0.887276913318383760, 0.887299974065181800, 0.887323032593729910, 0.887346088903970490, -0.887369142995845790, 0.887392194869298320, 0.887415244524270230, 0.887438291960704560, 0.887461337178542700, 0.887484380177727460, 0.887507420958201340, 0.887530459519906610, -0.887553495862785760, 0.887576529986781160, 0.887599561891835200, 0.887622591577890810, 0.887645619044889480, 0.887668644292774140, 0.887691667321487190, 0.887714688130971100, -0.887737706721168250, 0.887760723092021140, 0.887783737243472590, 0.887806749175464320, 0.887829758887939250, 0.887852766380839650, 0.887875771654108250, 0.887898774707687300, -0.887921775541519520, 0.887944774155547290, 0.887967770549713540, 0.887990764723959880, 0.888013756678229350, 0.888036746412464440, 0.888059733926607640, 0.888082719220601560, -0.888105702294388680, 0.888128683147911490, 0.888151661781113040, 0.888174638193934940, 0.888197612386320330, 0.888220584358211720, 0.888243554109551580, 0.888266521640282520, -0.888289486950347260, 0.888312450039688620, 0.888335410908248520, 0.888358369555969810, 0.888381325982795180, 0.888404280188667350, 0.888427232173528700, 0.888450181937322060, -0.888473129479989910, 0.888496074801475300, 0.888519017901720170, 0.888541958780667440, 0.888564897438259840, 0.888587833874440070, 0.888610768089150630, 0.888633700082334220, -0.888656629853933680, 0.888679557403891930, 0.888702482732150910, 0.888725405838653560, 0.888748326723342810, 0.888771245386161260, 0.888794161827051510, 0.888817076045956390, -0.888839988042818940, 0.888862897817581210, 0.888885805370186240, 0.888908710700576640, 0.888931613808695340, 0.888954514694485050, 0.888977413357888380, 0.889000309798848250, -0.889023204017307720, 0.889046096013208720, 0.889068985786494630, 0.889091873337107930, 0.889114758664991570, 0.889137641770088360, 0.889160522652341020, 0.889183401311692820, -0.889206277748085690, 0.889229151961462900, 0.889252023951767170, 0.889274893718941420, 0.889297761262928370, 0.889320626583670950, 0.889343489681111990, 0.889366350555194750, -0.889389209205861180, 0.889412065633054530, 0.889434919836717740, 0.889457771816793750, 0.889480621573225270, 0.889503469105955240, 0.889526314414926470, 0.889549157500082340, -0.889571998361365020, 0.889594836998717660, 0.889617673412083090, 0.889640507601404450, 0.889663339566624580, 0.889686169307686290, 0.889708996824532970, 0.889731822117106770, -0.889754645185350970, 0.889777466029208600, 0.889800284648622600, 0.889823101043535900, 0.889845915213891450, 0.889868727159632170, 0.889891536880701440, 0.889914344377041530, -0.889937149648595720, 0.889959952695307030, 0.889982753517118530, 0.890005552113973030, 0.890028348485813690, 0.890051142632583560, 0.890073934554225900, 0.890096724250682980, -0.890119511721898290, 0.890142296967814880, 0.890165079988375680, 0.890187860783523740, 0.890210639353202220, 0.890233415697354480, 0.890256189815922800, 0.890278961708850570, -0.890301731376081040, 0.890324498817557150, 0.890347264033221950, 0.890370027023018710, 0.890392787786890240, 0.890415546324780370, 0.890438302636631150, 0.890461056722386180, -0.890483808581988610, 0.890506558215381380, 0.890529305622507870, 0.890552050803311120, 0.890574793757734630, 0.890597534485720770, 0.890620272987213020, 0.890643009262154560, -0.890665743310488640, 0.890688475132158320, 0.890711204727106850, 0.890733932095277400, 0.890756657236613460, 0.890779380151057510, 0.890802100838553050, 0.890824819299043340, -0.890847535532471650, 0.890870249538781130, 0.890892961317914960, 0.890915670869816380, 0.890938378194429000, 0.890961083291695320, 0.890983786161558930, 0.891006486803962990, -0.891029185218850880, 0.891051881406165870, 0.891074575365851110, 0.891097267097850310, 0.891119956602105970, 0.891142643878561680, 0.891165328927160830, 0.891188011747846680, -0.891210692340562490, 0.891233370705251550, 0.891256046841857110, 0.891278720750323110, 0.891301392430591810, 0.891324061882607040, 0.891346729106312070, 0.891369394101650280, -0.891392056868565150, 0.891414717406999730, 0.891437375716897520, 0.891460031798202320, 0.891482685650856640, 0.891505337274804300, 0.891527986669988560, 0.891550633836352800, -0.891573278773840520, 0.891595921482395080, 0.891618561961960210, 0.891641200212478500, 0.891663836233893780, 0.891686470026149540, 0.891709101589189030, 0.891731730922955880, -0.891754358027393330, 0.891776982902444890, 0.891799605548054370, 0.891822225964164490, 0.891844844150719070, 0.891867460107661490, 0.891890073834935240, 0.891912685332483800, -0.891935294600250670, 0.891957901638179670, 0.891980506446213630, 0.892003109024296250, 0.892025709372371130, 0.892048307490381660, 0.892070903378271440, 0.892093497035984060, -0.892116088463462800, 0.892138677660651800, 0.892161264627493680, 0.892183849363932470, 0.892206431869911550, 0.892229012145374530, 0.892251590190265120, 0.892274166004526580, -0.892296739588102740, 0.892319310940937300, 0.892341880062973320, 0.892364446954154620, 0.892387011614424800, 0.892409574043727450, 0.892432134242006180, 0.892454692209204480, -0.892477247945266510, 0.892499801450135080, 0.892522352723754130, 0.892544901766067270, 0.892567448577018090, 0.892589993156550410, 0.892612535504607620, 0.892635075621133640, -0.892657613506072200, 0.892680149159366440, 0.892702682580960310, 0.892725213770797500, 0.892747742728821510, 0.892770269454976280, 0.892792793949205410, 0.892815316211452940, -0.892837836241661690, 0.892860354039775930, 0.892882869605739260, 0.892905382939495400, 0.892927894040988050, 0.892950402910161030, 0.892972909546957960, 0.892995413951323090, -0.893017916123199250, 0.893040416062530600, 0.893062913769260950, 0.893085409243333910, 0.893107902484693410, 0.893130393493283160, 0.893152882269046990, 0.893175368811928940, -0.893197853121872050, 0.893220335198820600, 0.893242815042718300, 0.893265292653508960, 0.893287768031136300, 0.893310241175544250, 0.893332712086677080, 0.893355180764477730, -0.893377647208890350, 0.893400111419858870, 0.893422573397327110, 0.893445033141239020, 0.893467490651538190, 0.893489945928168770, 0.893512398971074820, 0.893534849780199480, -0.893557298355486920, 0.893579744696881280, 0.893602188804326180, 0.893624630677765650, 0.893647070317143520, 0.893669507722403720, 0.893691942893490520, 0.893714375830347070, -0.893736806532917760, 0.893759235001146400, 0.893781661234976930, 0.893804085234353280, 0.893826506999219510, 0.893848926529519750, 0.893871343825197400, 0.893893758886196600, -0.893916171712461400, 0.893938582303935860, 0.893960990660563780, 0.893983396782289220, 0.894005800669056220, 0.894028202320809040, 0.894050601737491070, 0.894072998919046570, -0.894095393865419470, 0.894117786576553940, 0.894140177052394010, 0.894162565292883630, 0.894184951297967160, 0.894207335067587980, 0.894229716601690370, 0.894252095900218590, -0.894274472963116460, 0.894296847790328250, 0.894319220381797790, 0.894341590737469440, 0.894363958857287370, 0.894386324741195060, 0.894408688389137010, 0.894431049801057140, -0.894453408976899620, 0.894475765916608710, 0.894498120620128350, 0.894520473087402570, 0.894542823318376090, 0.894565171312992180, 0.894587517071195330, 0.894609860592929680, -0.894632201878139300, 0.894654540926768550, 0.894676877738761370, 0.894699212314062460, 0.894721544652615000, 0.894743874754363790, 0.894766202619252880, 0.894788528247226430, -0.894810851638228600, 0.894833172792203760, 0.894855491709095950, 0.894877808388849780, 0.894900122831408740, 0.894922435036717310, 0.894944745004719880, 0.894967052735360590, -0.894989358228583610, 0.895011661484333200, 0.895033962502553740, 0.895056261283189710, 0.895078557826184620, 0.895100852131483160, 0.895123144199029610, 0.895145434028768120, -0.895167721620643060, 0.895190006974598720, 0.895212290090579790, 0.895234570968529760, 0.895256849608393250, 0.895279126010114610, 0.895301400173638130, 0.895323672098908170, -0.895345941785869130, 0.895368209234465140, 0.895390474444641040, 0.895412737416340310, 0.895434998149507780, 0.895457256644087820, 0.895479512900024590, 0.895501766917262690, -0.895524018695746270, 0.895546268235420270, 0.895568515536228180, 0.895590760598114820, 0.895613003421024570, 0.895635244004901800, 0.895657482349690890, 0.895679718455336340, -0.895701952321782400, 0.895724183948974020, 0.895746413336854790, 0.895768640485369530, 0.895790865394462730, 0.895813088064078670, 0.895835308494161930, 0.895857526684656900, -0.895879742635508070, 0.895901956346660260, 0.895924167818057170, 0.895946377049643750, 0.895968584041364260, 0.895990788793163410, 0.896012991304985460, 0.896035191576775140, -0.896057389608477250, 0.896079585400035410, 0.896101778951394650, 0.896123970262499460, 0.896146159333294330, 0.896168346163723760, 0.896190530753732340, 0.896212713103264670, -0.896234893212265570, 0.896257071080678760, 0.896279246708449380, 0.896301420095521830, 0.896323591241840800, 0.896345760147350680, 0.896367926811996290, 0.896390091235722000, -0.896412253418472860, 0.896434413360192690, 0.896456571060826550, 0.896478726520318900, 0.896500879738614590, 0.896523030715657980, 0.896545179451393780, 0.896567325945767050, -0.896589470198721590, 0.896611612210202470, 0.896633751980154270, 0.896655889508521710, 0.896678024795249500, 0.896700157840282120, 0.896722288643564400, 0.896744417205041390, -0.896766543524656900, 0.896788667602356090, 0.896810789438083570, 0.896832909031784140, 0.896855026383402310, 0.896877141492883000, 0.896899254360171260, 0.896921364985210910, -0.896943473367947220, 0.896965579508324780, 0.896987683406288540, 0.897009785061782970, 0.897031884474752910, 0.897053981645143160, 0.897076076572898900, 0.897098169257964040, -0.897120259700283750, 0.897142347899802740, 0.897164433856465940, 0.897186517570218060, 0.897208599041003920, 0.897230678268768230, 0.897252755253456160, 0.897274829995011960, -0.897296902493380570, 0.897318972748507030, 0.897341040760335940, 0.897363106528812350, 0.897385170053880850, 0.897407231335486940, 0.897429290373574550, 0.897451347168088940, -0.897473401718974940, 0.897495454026177470, 0.897517504089641370, 0.897539551909311450, 0.897561597485132650, 0.897583640817050220, 0.897605681905008450, 0.897627720748952360, -0.897649757348826900, 0.897671791704577230, 0.897693823816147930, 0.897715853683484170, 0.897737881306530760, 0.897759906685232980, 0.897781929819535090, 0.897803950709382350, -0.897825969354719700, 0.897847985755492180, 0.897869999911644730, 0.897892011823122170, 0.897914021489870100, 0.897936028911832440, 0.897958034088954800, 0.897980037021182120, -0.898002037708459320, 0.898024036150731340, 0.898046032347943330, 0.898068026300040230, 0.898090018006967530, 0.898112007468669260, 0.898133994685091030, 0.898155979656177880, -0.898177962381874750, 0.898199942862126680, 0.898221921096878710, 0.898243897086076440, 0.898265870829664030, 0.898287842327586850, 0.898309811579790060, 0.898331778586218820, -0.898353743346818060, 0.898375705861533040, 0.898397666130308690, 0.898419624153090620, 0.898441579929822990, 0.898463533460451490, 0.898485484744921180, 0.898507433783177100, -0.898529380575164520, 0.898551325120828360, 0.898573267420114010, 0.898595207472966840, 0.898617145279331230, 0.898639080839152780, 0.898661014152376650, 0.898682945218947870, -0.898704874038811830, 0.898726800611913570, 0.898748724938198800, 0.898770647017611780, 0.898792566850098120, 0.898814484435602970, 0.898836399774071700, 0.898858312865449370, -0.898880223709681350, 0.898902132306712680, 0.898924038656489180, 0.898945942758955010, 0.898967844614056100, 0.898989744221737610, 0.899011641581944690, 0.899033536694622710, -0.899055429559716960, 0.899077320177172900, 0.899099208546935150, 0.899121094668949410, 0.899142978543161050, 0.899164860169515130, 0.899186739547957030, 0.899208616678432100, -0.899230491560885640, 0.899252364195263440, 0.899274234581509790, 0.899296102719570610, 0.899317968609391170, 0.899339832250916850, 0.899361693644092910, 0.899383552788864730, -0.899405409685177680, 0.899427264332977590, 0.899449116732208840, 0.899470966882817250, 0.899492814784748410, 0.899514660437947370, 0.899536503842359720, 0.899558344997930860, -0.899580183904606480, 0.899602020562331290, 0.899623854971051130, 0.899645687130711140, 0.899667517041257030, 0.899689344702634180, 0.899711170114787850, 0.899732993277663760, -0.899754814191207400, 0.899776632855363690, 0.899798449270078460, 0.899820263435297090, 0.899842075350964940, 0.899863885017027740, 0.899885692433430750, 0.899907497600119570, -0.899929300517040010, 0.899951101184136790, 0.899972899601355850, 0.899994695768642660, 0.900016489685942720, 0.900038281353201520, 0.900060070770364760, 0.900081857937378050, -0.900103642854186430, 0.900125425520735600, 0.900147205936971280, 0.900168984102838850, 0.900190760018284020, 0.900212533683252380, 0.900234305097689310, 0.900256074261540860, -0.900277841174751850, 0.900299605837268200, 0.900321368249035640, 0.900343128409999530, 0.900364886320105700, 0.900386641979299630, 0.900408395387527370, 0.900430146544733630, -0.900451895450864570, 0.900473642105865890, 0.900495386509682970, 0.900517128662261630, 0.900538868563547480, 0.900560606213486100, 0.900582341612023660, 0.900604074759104980, -0.900625805654676090, 0.900647534298682610, 0.900669260691070450, 0.900690984831785000, 0.900712706720772190, 0.900734426357977510, 0.900756143743347230, 0.900777858876826150, -0.900799571758360560, 0.900821282387895940, 0.900842990765378100, 0.900864696890752770, 0.900886400763965760, 0.900908102384963110, 0.900929801753689750, 0.900951498870091960, -0.900973193734115440, 0.900994886345705900, 0.901016576704809170, 0.901038264811370950, 0.901059950665337060, 0.901081634266653770, 0.901103315615265910, 0.901124994711119840, -0.901146671554161170, 0.901168346144335940, 0.901190018481589860, 0.901211688565868640, 0.901233356397118210, 0.901255021975284840, 0.901276685300313460, 0.901298346372150450, -0.901320005190741510, 0.901341661756032590, 0.901363316067969490, 0.901384968126498150, 0.901406617931564740, 0.901428265483114390, 0.901449910781093380, 0.901471553825447520, -0.901493194616122870, 0.901514833153065240, 0.901536469436220570, 0.901558103465534670, 0.901579735240953810, 0.901601364762423360, 0.901622992029889380, 0.901644617043298010, -0.901666239802595080, 0.901687860307726520, 0.901709478558638370, 0.901731094555276890, 0.901752708297587250, 0.901774319785515810, 0.901795929019008620, 0.901817535998011620, -0.901839140722470840, 0.901860743192332110, 0.901882343407541590, 0.901903941368045530, 0.901925537073789200, 0.901947130524719090, 0.901968721720781240, 0.901990310661921480, -0.902011897348085960, 0.902033481779220710, 0.902055063955271690, 0.902076643876185470, 0.902098221541907220, 0.902119796952383420, 0.902141370107560130, 0.902162941007383480, -0.902184509651799420, 0.902206076040754090, 0.902227640174193990, 0.902249202052064380, 0.902270761674311750, 0.902292319040882140, 0.902313874151721820, 0.902335427006776820, -0.902356977605993320, 0.902378525949317220, 0.902400072036695260, 0.902421615868072790, 0.902443157443396200, 0.902464696762611760, 0.902486233825665620, 0.902507768632503820, -0.902529301183072620, 0.902550831477318180, 0.902572359515187110, 0.902593885296624650, 0.902615408821577540, 0.902636930089991910, 0.902658449101813920, 0.902679965856989730, -0.902701480355465710, 0.902722992597188470, 0.902744502582103260, 0.902766010310156800, 0.902787515781295240, 0.902809018995465060, 0.902830519952612210, 0.902852018652683050, -0.902873515095623970, 0.902895009281381330, 0.902916501209900860, 0.902937990881129140, 0.902959478295012440, 0.902980963451497030, 0.903002446350529290, 0.903023926992055360, -0.903045405376021960, 0.903066881502374800, 0.903088355371060250, 0.903109826982024910, 0.903131296335215050, 0.903152763430576930, 0.903174228268056820, 0.903195690847601210, -0.903217151169156680, 0.903238609232668970, 0.903260065038084760, 0.903281518585350330, 0.903302969874412160, 0.903324418905216530, 0.903345865677709800, 0.903367310191838470, -0.903388752447549240, 0.903410192444787710, 0.903431630183500810, 0.903453065663634700, 0.903474498885135980, 0.903495929847951020, 0.903517358552026200, 0.903538784997308440, -0.903560209183743250, 0.903581631111277540, 0.903603050779857810, 0.903624468189430430, 0.903645883339941890, 0.903667296231338680, 0.903688706863567170, 0.903710115236574300, -0.903731521350305770, 0.903752925204708400, 0.903774326799728690, 0.903795726135313230, 0.903817123211408500, 0.903838518027960890, 0.903859910584916990, 0.903881300882223630, -0.903902688919826720, 0.903924074697673110, 0.903945458215709260, 0.903966839473881790, 0.903988218472137170, 0.904009595210422120, 0.904030969688683350, 0.904052341906866790, -0.904073711864919470, 0.904095079562787780, 0.904116445000418430, 0.904137808177757910, 0.904159169094752910, 0.904180527751350050, 0.904201884147496140, 0.904223238283137220, -0.904244590158220230, 0.904265939772691650, 0.904287287126498310, 0.904308632219586680, 0.904329975051903600, 0.904351315623395770, 0.904372653934009450, 0.904393989983691360, -0.904415323772388420, 0.904436655300047130, 0.904457984566614190, 0.904479311572036200, 0.904500636316260100, 0.904521958799232690, 0.904543279020900040, 0.904564596981209170, -0.904585912680106800, 0.904607226117539630, 0.904628537293454380, 0.904649846207797870, 0.904671152860516690, 0.904692457251558000, 0.904713759380867840, 0.904735059248393260, -0.904756356854081070, 0.904777652197877870, 0.904798945279730700, 0.904820236099586060, 0.904841524657391210, 0.904862810953092180, 0.904884094986636130, 0.904905376757969890, -0.904926656267040160, 0.904947933513793770, 0.904969208498177520, 0.904990481220138370, 0.905011751679623330, 0.905033019876578470, 0.905054285810951150, 0.905075549482688090, -0.905096810891736100, 0.905118070038042230, 0.905139326921553080, 0.905160581542215900, 0.905181833899977080, 0.905203083994783550, 0.905224331826582350, 0.905245577395320300, -0.905266820700944330, 0.905288061743401370, 0.905309300522638140, 0.905330537038602110, 0.905351771291239340, 0.905373003280497080, 0.905394233006322380, 0.905415460468662170, -0.905436685667463160, 0.905457908602672500, 0.905479129274237130, 0.905500347682104190, 0.905521563826220070, 0.905542777706532130, 0.905563989322987100, 0.905585198675532220, -0.905606405764114220, 0.905627610588680240, 0.905648813149177670, 0.905670013445552650, 0.905691211477752670, 0.905712407245724550, 0.905733600749415450, 0.905754791988772400, -0.905775980963742340, 0.905797167674272320, 0.905818352120309700, 0.905839534301800860, 0.905860714218693190, 0.905881891870933820, 0.905903067258469590, 0.905924240381247750, -0.905945411239215350, 0.905966579832319320, 0.905987746160507370, 0.906008910223725540, 0.906030072021921540, 0.906051231555042300, 0.906072388823034980, 0.906093543825846610, -0.906114696563424470, 0.906135847035716040, 0.906156995242667460, 0.906178141184226460, 0.906199284860340180, 0.906220426270955560, 0.906241565416019970, 0.906262702295480450, -0.906283836909284160, 0.906304969257378690, 0.906326099339710310, 0.906347227156226840, 0.906368352706875210, 0.906389475991602690, 0.906410597010356530, 0.906431715763083790, -0.906452832249732280, 0.906473946470248150, 0.906495058424579230, 0.906516168112672660, 0.906537275534475720, 0.906558380689935550, 0.906579483578999420, 0.906600584201614600, -0.906621682557728680, 0.906642778647288150, 0.906663872470240720, 0.906684964026533650, 0.906706053316114090, 0.906727140338929430, 0.906748225094926920, 0.906769307584053830, -0.906790387806257870, 0.906811465761485520, 0.906832541449684610, 0.906853614870802290, 0.906874686024785830, 0.906895754911582810, 0.906916821531140280, 0.906937885883406180, -0.906958947968326990, 0.906980007785850310, 0.907001065335923730, 0.907022120618494410, 0.907043173633509840, 0.907064224380917270, 0.907085272860664200, 0.907106319072698340, -0.907127363016966280, 0.907148404693415840, 0.907169444101994290, 0.907190481242649230, 0.907211516115327910, 0.907232548719977830, 0.907253579056546360, 0.907274607124981420, -0.907295632925229410, 0.907316656457238470, 0.907337677720955860, 0.907358696716328960, 0.907379713443305370, 0.907400727901832570, 0.907421740091858280, 0.907442750013329190, -0.907463757666193360, 0.907484763050398050, 0.907505766165890850, 0.907526767012619140, 0.907547765590530630, 0.907568761899572700, 0.907589755939693270, 0.907610747710838940, -0.907631737212957870, 0.907652724445997430, 0.907673709409905220, 0.907694692104628610, 0.907715672530115310, 0.907736650686313260, 0.907757626573169160, 0.907778600190631060, -0.907799571538646430, 0.907820540617162890, 0.907841507426127900, 0.907862471965489190, 0.907883434235194350, 0.907904394235191310, 0.907925351965426900, 0.907946307425849030, -0.907967260616405420, 0.907988211537043680, 0.908009160187711490, 0.908030106568356250, 0.908051050678925890, 0.908071992519368210, 0.908092932089630160, 0.908113869389659770, -0.908134804419404750, 0.908155737178812710, 0.908176667667831230, 0.908197595886408250, 0.908218521834491590, 0.908239445512028180, 0.908260366918966170, 0.908281286055253380, -0.908302202920837190, 0.908323117515665630, 0.908344029839686210, 0.908364939892846720, 0.908385847675095340, 0.908406753186378870, 0.908427656426645470, 0.908448557395843070, -0.908469456093919160, 0.908490352520821660, 0.908511246676498300, 0.908532138560896870, 0.908553028173965330, 0.908573915515650920, 0.908594800585901700, 0.908615683384665580, -0.908636563911890070, 0.908657442167523310, 0.908678318151512900, 0.908699191863806990, 0.908720063304352840, 0.908740932473098510, 0.908761799369991800, 0.908782663994980640, -0.908803526348012760, 0.908824386429036070, 0.908845244237998510, 0.908866099774848110, 0.908886953039532150, 0.908907804031998780, 0.908928652752195920, 0.908949499200071400, -0.908970343375573140, 0.908991185278649080, 0.909012024909247370, 0.909032862267315170, 0.909053697352800950, 0.909074530165652320, 0.909095360705817530, 0.909116188973244200, -0.909137014967880460, 0.909157838689674260, 0.909178660138573740, 0.909199479314526270, 0.909220296217480020, 0.909241110847383020, 0.909261923204183310, 0.909282733287828830, -0.909303541098267390, 0.909324346635447260, 0.909345149899316470, 0.909365950889822530, 0.909386749606913680, 0.909407546050537970, 0.909428340220643340, 0.909449132117177930, -0.909469921740089670, 0.909490709089327050, 0.909511494164837230, 0.909532276966568580, 0.909553057494469350, 0.909573835748487490, 0.909594611728570920, 0.909615385434667910, -0.909636156866726500, 0.909656926024694950, 0.909677692908520740, 0.909698457518152370, 0.909719219853537760, 0.909739979914625190, 0.909760737701362570, 0.909781493213698170, -0.909802246451580030, 0.909822997414956650, 0.909843746103775390, 0.909864492517984740, 0.909885236657532960, 0.909905978522367990, 0.909926718112438080, 0.909947455427691400, -0.909968190468076530, 0.909988923233540750, 0.910009653724032640, 0.910030381939500370, 0.910051107879892180, 0.910071831545156250, 0.910092552935240720, 0.910113272050093740, -0.910133988889664010, 0.910154703453898930, 0.910175415742747180, 0.910196125756156830, 0.910216833494076120, 0.910237538956453320, 0.910258242143236700, 0.910278943054374850, -0.910299641689815360, 0.910320338049506630, 0.910341032133397120, 0.910361723941435000, 0.910382413473568630, 0.910403100729746170, 0.910423785709916000, 0.910444468414026710, -0.910465148842025900, 0.910485826993862160, 0.910506502869483870, 0.910527176468839410, 0.910547847791876920, 0.910568516838544780, 0.910589183608791490, 0.910609848102565510, -0.910630510319814570, 0.910651170260487360, 0.910671827924532160, 0.910692483311897450, 0.910713136422531490, 0.910733787256382770, 0.910754435813399880, 0.910775082093530530, -0.910795726096723550, 0.910816367822927190, 0.910837007272089940, 0.910857644444160060, 0.910878279339086270, 0.910898911956816600, 0.910919542297300100, 0.910940170360484360, -0.910960796146318200, 0.910981419654750100, 0.911002040885728450, 0.911022659839201610, 0.911043276515118180, 0.911063890913426880, 0.911084503034075510, 0.911105112877012900, -0.911125720442187540, 0.911146325729547790, 0.911166928739042370, 0.911187529470619540, 0.911208127924227900, 0.911228724099816260, 0.911249317997332440, 0.911269909616725380, -0.911290498957943560, 0.911311086020935360, 0.911331670805649590, 0.911352253312034620, 0.911372833540038950, 0.911393411489611620, 0.911413987160700430, 0.911434560553254220, -0.911455131667221590, 0.911475700502551110, 0.911496267059191510, 0.911516831337091160, 0.911537393336199100, 0.911557953056463140, 0.911578510497832340, 0.911599065660255280, -0.911619618543680570, 0.911640169148056790, 0.911660717473332550, 0.911681263519456550, 0.911701807286377730, 0.911722348774044120, 0.911742887982404550, 0.911763424911407830, -0.911783959561002440, 0.911804491931137220, 0.911825022021760860, 0.911845549832821840, 0.911866075364269220, 0.911886598616051260, 0.911907119588116650, 0.911927638280414230, -0.911948154692892810, 0.911968668825500980, 0.911989180678187460, 0.912009690250901390, 0.912030197543590710, 0.912050702556204460, 0.912071205288691570, 0.912091705741000620, -0.912112203913080340, 0.912132699804879650, 0.912153193416347150, 0.912173684747432100, 0.912194173798082430, 0.912214660568247290, 0.912235145057875510, 0.912255627266915890, -0.912276107195317270, 0.912296584843028340, 0.912317060209998250, 0.912337533296175170, 0.912358004101508250, 0.912378472625946400, 0.912398938869438240, 0.912419402831932790, -0.912439864513378880, 0.912460323913725340, 0.912480781032921300, 0.912501235870914920, 0.912521688427655460, 0.912542138703091750, 0.912562586697172720, 0.912583032409847280, -0.912603475841064160, 0.912623916990772390, 0.912644355858921230, 0.912664792445458840, 0.912685226750334370, 0.912705658773496850, 0.912726088514895230, 0.912746515974478420, -0.912766941152195250, 0.912787364047995100, 0.912807784661826220, 0.912828202993637870, 0.912848619043378990, 0.912869032810998630, 0.912889444296445580, 0.912909853499669020, -0.912930260420617760, 0.912950665059241160, 0.912971067415487610, 0.912991467489306370, 0.913011865280646480, 0.913032260789456980, 0.913052654015686800, 0.913073044959284870, -0.913093433620200460, 0.913113819998382810, 0.913134204093780210, 0.913154585906342130, 0.913174965436017510, 0.913195342682755600, 0.913215717646505220, 0.913236090327215640, -0.913256460724836130, 0.913276828839315160, 0.913297194670602110, 0.913317558218646020, 0.913337919483396040, 0.913358278464801330, 0.913378635162810810, 0.913398989577373870, -0.913419341708439640, 0.913439691555956830, 0.913460039119874720, 0.913480384400142560, 0.913500727396709400, 0.913521068109524380, 0.913541406538536770, 0.913561742683696050, -0.913582076544950490, 0.913602408122249800, 0.913622737415543120, 0.913643064424779490, 0.913663389149908300, 0.913683711590878580, 0.913704031747639590, 0.913724349620140930, -0.913744665208330980, 0.913764978512159430, 0.913785289531575450, 0.913805598266528070, 0.913825904716966900, 0.913846208882840850, 0.913866510764099300, 0.913886810360691860, -0.913907107672567000, 0.913927402699674430, 0.913947695441963300, 0.913967985899383000, 0.913988274071882660, 0.914008559959411660, 0.914028843561919600, 0.914049124879355080, -0.914069403911667800, 0.914089680658807020, 0.914109955120721910, 0.914130227297362040, 0.914150497188676580, 0.914170764794614790, 0.914191030115126480, 0.914211293150160360, -0.914231553899665930, 0.914251812363592540, 0.914272068541889690, 0.914292322434506640, 0.914312574041392880, 0.914332823362497550, 0.914353070397770580, 0.914373315147160580, -0.914393557610617250, 0.914413797788090070, 0.914434035679528410, 0.914454271284881660, 0.914474504604099180, 0.914494735637130910, 0.914514964383925320, 0.914535190844432360, -0.914555415018601380, 0.914575636906381990, 0.914595856507723350, 0.914616073822575150, 0.914636288850886770, 0.914656501592608030, 0.914676712047687750, 0.914696920216075520, -0.914717126097721160, 0.914737329692573820, 0.914757531000583320, 0.914777730021698820, 0.914797926755870460, 0.914818121203046950, 0.914838313363178110, 0.914858503236213430, -0.914878690822102600, 0.914898876120794900, 0.914919059132240140, 0.914939239856387700, 0.914959418293187500, 0.914979594442588360, 0.914999768304540330, 0.915019939878992770, -0.915040109165895510, 0.915060276165197810, 0.915080440876849480, 0.915100603300800120, 0.915120763436999550, 0.915140921285396700, 0.915161076845941500, 0.915181230118583770, -0.915201381103272870, 0.915221529799958410, 0.915241676208590320, 0.915261820329118290, 0.915281962161491380, 0.915302101705659510, 0.915322238961572500, 0.915342373929179720, -0.915362506608431210, 0.915382636999276240, 0.915402765101664850, 0.915422890915546850, 0.915443014440871170, 0.915463135677588080, 0.915483254625647060, 0.915503371284997920, -0.915523485655590390, 0.915543597737374150, 0.915563707530298920, 0.915583815034314740, 0.915603920249370650, 0.915624023175416800, 0.915644123812402900, 0.915664222160278650, -0.915684318218993880, 0.915704411988498280, 0.915724503468742010, 0.915744592659674230, 0.915764679561244850, 0.915784764173403820, 0.915804846496100830, 0.915824926529285820, -0.915845004272908380, 0.915865079726918550, 0.915885152891266260, 0.915905223765900780, 0.915925292350772250, 0.915945358645830490, 0.915965422651025320, 0.915985484366306670, -0.916005543791624240, 0.916025600926928310, 0.916045655772168010, 0.916065708327293620, 0.916085758592254830, 0.916105806567001800, 0.916125852251484130, 0.916145895645651960, -0.916165936749455010, 0.916185975562843540, 0.916206012085766690, 0.916226046318174950, 0.916246078260018030, 0.916266107911245960, 0.916286135271808580, 0.916306160341655910, -0.916326183120737770, 0.916346203609004540, 0.916366221806405480, 0.916386237712890850, 0.916406251328410690, 0.916426262652914820, 0.916446271686353290, 0.916466278428676120, -0.916486282879833580, 0.916506285039775050, 0.916526284908450780, 0.916546282485810710, 0.916566277771804990, 0.916586270766383660, 0.916606261469496530, 0.916626249881093760, -0.916646236001125820, 0.916666219829541880, 0.916686201366292310, 0.916706180611327360, 0.916726157564596860, 0.916746132226051060, 0.916766104595639900, 0.916786074673313410, -0.916806042459022200, 0.916826007952715400, 0.916845971154343630, 0.916865932063857030, 0.916885890681205520, 0.916905847006339260, 0.916925801039208400, 0.916945752779763420, -0.916965702227953710, 0.916985649383729730, 0.917005594247041530, 0.917025536817839490, 0.917045477096073540, 0.917065415081693920, 0.917085350774650700, 0.917105284174894560, -0.917125215282374780, 0.917145144097041950, 0.917165070618846330, 0.917184994847738080, 0.917204916783667220, 0.917224836426584140, 0.917244753776439210, 0.917264668833182140, -0.917284581596763400, 0.917304492067133270, 0.917324400244241780, 0.917344306128039410, 0.917364209718476210, 0.917384111015502430, 0.917404010019068790, 0.917423906729124770, -0.917443801145620960, 0.917463693268507630, 0.917483583097735140, 0.917503470633253660, 0.917523355875013550, 0.917543238822964960, 0.917563119477058710, 0.917582997837244170, -0.917602873903472280, 0.917622747675693180, 0.917642619153857140, 0.917662488337914640, 0.917682355227815830, 0.917702219823511630, 0.917722082124951430, 0.917741942132086040, -0.917761799844865720, 0.917781655263240960, 0.917801508387162120, 0.917821359216579370, 0.917841207751443400, 0.917861053991704590, 0.917880897937312870, 0.917900739588218940, -0.917920578944373180, 0.917940416005725960, 0.917960250772227650, 0.917980083243828740, 0.917999913420479930, 0.918019741302131040, 0.918039566888732780, 0.918059390180235520, -0.918079211176589860, 0.918099029877746280, 0.918118846283654920, 0.918138660394266610, 0.918158472209531950, 0.918178281729400750, 0.918198088953823820, 0.918217893882751660, -0.918237696516134850, 0.918257496853923770, 0.918277294896068910, 0.918297090642520850, 0.918316884093230310, 0.918336675248147330, 0.918356464107222600, 0.918376250670406740, -0.918396034937650320, 0.918415816908903730, 0.918435596584117550, 0.918455373963242840, 0.918475149046229290, 0.918494921833027830, 0.918514692323589180, 0.918534460517863690, -0.918554226415802090, 0.918573990017354960, 0.918593751322472780, 0.918613510331106610, 0.918633267043206360, 0.918653021458722850, 0.918672773577606790, 0.918692523399808890, -0.918712270925279630, 0.918732016153969710, 0.918751759085829730, 0.918771499720810740, 0.918791238058862540, 0.918810974099936400, 0.918830707843982690, 0.918850439290952340, -0.918870168440795830, 0.918889895293463880, 0.918909619848907510, 0.918929342107076770, 0.918949062067922710, 0.918968779731396010, 0.918988495097447290, 0.919008208166027350, -0.919027918937086910, 0.919047627410576770, 0.919067333586447770, 0.919087037464650150, 0.919106739045134850, 0.919126438327852790, 0.919146135312754690, 0.919165829999791130, -0.919185522388913050, 0.919205212480071480, 0.919224900273216570, 0.919244585768299370, 0.919264268965270800, 0.919283949864081460, 0.919303628464682280, 0.919323304767024060, -0.919342978771057530, 0.919362650476733930, 0.919382319884003320, 0.919401986992816940, 0.919421651803125630, 0.919441314314880080, 0.919460974528031330, 0.919480632442530200, -0.919500288058327400, 0.919519941375374180, 0.919539592393620820, 0.919559241113018570, 0.919578887533518130, 0.919598531655070440, 0.919618173477626420, 0.919637813001137010, -0.919657450225553450, 0.919677085150825800, 0.919696717776905540, 0.919716348103743480, 0.919735976131290540, 0.919755601859497670, 0.919775225288315790, 0.919794846417695820, -0.919814465247589030, 0.919834081777945790, 0.919853696008717360, 0.919873307939854670, 0.919892917571308750, 0.919912524903030550, 0.919932129934970980, 0.919951732667081080, -0.919971333099312230, 0.919990931231614680, 0.920010527063939820, 0.920030120596238570, 0.920049711828462070, 0.920069300760561370, 0.920088887392487290, 0.920108471724191410, -0.920128053755624010, 0.920147633486736450, 0.920167210917479880, 0.920186786047805240, 0.920206358877663550, 0.920225929407006090, 0.920245497635783670, 0.920265063563947990, -0.920284627191449210, 0.920304188518238920, 0.920323747544268160, 0.920343304269487960, 0.920362858693849480, 0.920382410817303990, 0.920401960639802730, 0.920421508161296310, -0.920441053381735990, 0.920460596301073130, 0.920480136919258780, 0.920499675236243990, 0.920519211251980110, 0.920538744966418190, 0.920558276379509710, 0.920577805491205270, -0.920597332301456240, 0.920616856810213880, 0.920636379017429450, 0.920655898923053990, 0.920675416527038770, 0.920694931829335150, 0.920714444829894400, 0.920733955528667320, -0.920753463925605200, 0.920772970020659500, 0.920792473813781380, 0.920811975304922090, 0.920831474494032910, 0.920850971381065310, 0.920870465965969890, 0.920889958248698460, -0.920909448229201950, 0.920928935907431970, 0.920948421283339540, 0.920967904356876140, 0.920987385127992940, 0.921006863596641630, 0.921026339762772820, 0.921045813626338190, -0.921065285187289030, 0.921084754445576580, 0.921104221401152330, 0.921123686053967440, 0.921143148403973380, 0.921162608451121860, 0.921182066195363360, 0.921201521636649700, -0.921220974774932370, 0.921240425610162510, 0.921259874142291490, 0.921279320371270920, 0.921298764297052370, 0.921318205919586570, 0.921337645238825220, 0.921357082254719790, -0.921376516967221670, 0.921395949376282220, 0.921415379481852930, 0.921434807283885160, 0.921454232782330740, 0.921473655977140370, 0.921493076868265870, 0.921512495455658720, -0.921531911739270290, 0.921551325719052070, 0.921570737394955540, 0.921590146766932520, 0.921609553834933810, 0.921628958598911140, 0.921648361058816090, 0.921667761214600260, -0.921687159066214900, 0.921706554613611730, 0.921725947856742110, 0.921745338795557980, 0.921764727430010140, 0.921784113760050540, 0.921803497785630640, 0.921822879506701940, -0.921842258923216140, 0.921861636035124610, 0.921881010842379060, 0.921900383344931180, 0.921919753542732150, 0.921939121435733640, 0.921958487023887390, 0.921977850307144960, -0.921997211285457860, 0.922016569958777680, 0.922035926327056440, 0.922055280390245090, 0.922074632148295550, 0.922093981601159410, 0.922113328748788260, 0.922132673591133820, -0.922152016128147680, 0.922171356359781540, 0.922190694285987320, 0.922210029906716080, 0.922229363221919730, 0.922248694231549980, 0.922268022935558430, 0.922287349333896890, -0.922306673426516950, 0.922325995213370330, 0.922345314694409170, 0.922364631869584280, 0.922383946738847830, 0.922403259302151500, 0.922422569559447010, 0.922441877510686070, -0.922461183155820490, 0.922480486494802300, 0.922499787527582550, 0.922519086254113270, 0.922538382674346290, 0.922557676788233420, 0.922576968595726350, 0.922596258096776810, -0.922615545291336600, 0.922634830179357990, 0.922654112760791900, 0.922673393035590480, 0.922692671003705670, 0.922711946665089040, 0.922731220019692660, 0.922750491067468200, -0.922769759808367840, 0.922789026242342820, 0.922808290369345090, 0.922827552189326770, 0.922846811702239480, 0.922866068908035240, 0.922885323806665770, 0.922904576398082990, -0.922923826682239160, 0.922943074659085430, 0.922962320328573950, 0.922981563690656650, 0.923000804745285450, 0.923020043492412290, 0.923039279931989090, 0.923058514063967550, -0.923077745888300160, 0.923096975404937960, 0.923116202613833430, 0.923135427514938380, 0.923154650108204740, 0.923173870393584450, 0.923193088371029540, 0.923212304040492150, -0.923231517401923770, 0.923250728455276560, 0.923269937200502430, 0.923289143637553540, 0.923308347766381820, 0.923327549586939190, 0.923346749099177800, 0.923365946303049690, -0.923385141198506560, 0.923404333785500460, 0.923423524063983540, 0.923442712033907820, 0.923461897695225350, 0.923481081047888060, 0.923500262091848430, 0.923519440827057840, -0.923538617253468640, 0.923557791371033000, 0.923576963179702730, 0.923596132679430080, 0.923615299870167110, 0.923634464751865950, 0.923653627324478870, 0.923672787587957460, -0.923691945542254090, 0.923711101187320800, 0.923730254523109750, 0.923749405549573080, 0.923768554266662930, 0.923787700674331360, 0.923806844772530940, 0.923825986561213060, -0.923845126040330090, 0.923864263209834390, 0.923883398069678120, 0.923902530619813200, 0.923921660860192010, 0.923940788790767020, 0.923959914411489720, 0.923979037722312710, -0.923998158723188020, 0.924017277414067920, 0.924036393794904650, 0.924055507865650380, 0.924074619626257370, 0.924093729076678190, 0.924112836216864240, 0.924131941046768320, -0.924151043566342480, 0.924170143775538970, 0.924189241674310160, 0.924208337262608310, 0.924227430540385590, 0.924246521507594570, 0.924265610164186960, 0.924284696510115240, -0.924303780545331910, 0.924322862269788990, 0.924341941683439080, 0.924361018786234220, 0.924380093578127120, 0.924399166059069470, 0.924418236229013980, 0.924437304087912800, -0.924456369635718420, 0.924475432872383100, 0.924494493797859200, 0.924513552412099090, 0.924532608715055380, 0.924551662706679880, 0.924570714386925170, 0.924589763755743640, -0.924608810813087770, 0.924627855558909810, 0.924646897993162350, 0.924665938115797780, 0.924684975926768240, 0.924704011426026100, 0.924723044613523950, 0.924742075489214280, -0.924761104053049340, 0.924780130304981740, 0.924799154244963730, 0.924818175872948120, 0.924837195188886850, 0.924856212192732510, 0.924875226884437680, 0.924894239263954750, -0.924913249331236310, 0.924932257086234720, 0.924951262528902360, 0.924970265659192270, 0.924989266477056260, 0.925008264982447040, 0.925027261175317080, 0.925046255055618990, -0.925065246623305360, 0.925084235878328440, 0.925103222820641390, 0.925122207450195910, 0.925141189766944930, 0.925160169770841030, 0.925179147461836600, 0.925198122839884340, -0.925217095904936840, 0.925236066656946580, 0.925255035095866370, 0.925274001221648380, 0.925292965034245300, 0.925311926533609830, 0.925330885719694570, 0.925349842592452120, -0.925368797151834950, 0.925387749397795890, 0.925406699330287740, 0.925425646949262550, 0.925444592254673240, 0.925463535246472400, 0.925482475924612750, 0.925501414289046860, -0.925520350339727570, 0.925539284076607680, 0.925558215499639240, 0.925577144608775160, 0.925596071403968380, 0.925614995885171270, 0.925633918052336750, 0.925652837905417410, -0.925671755444366080, 0.925690670669135570, 0.925709583579678140, 0.925728494175946710, 0.925747402457894000, 0.925766308425472810, 0.925785212078635840, 0.925804113417335930, -0.925823012441525980, 0.925841909151158160, 0.925860803546185610, 0.925879695626561030, 0.925898585392237240, 0.925917472843166940, 0.925936357979303070, 0.925955240800598210, -0.925974121307005520, 0.925992999498477350, 0.926011875374966540, 0.926030748936426120, 0.926049620182808790, 0.926068489114067470, 0.926087355730154880, 0.926106220031023940, -0.926125082016627690, 0.926143941686918490, 0.926162799041849390, 0.926181654081373320, 0.926200506805443080, 0.926219357214011610, 0.926238205307031830, 0.926257051084456770, -0.926275894546238710, 0.926294735692331010, 0.926313574522686370, 0.926332411037257830, 0.926351245235998320, 0.926370077118860660, 0.926388906685797870, 0.926407733936763010, -0.926426558871708550, 0.926445381490587750, 0.926464201793353430, 0.926483019779958620, 0.926501835450356250, 0.926520648804499360, 0.926539459842340760, 0.926558268563833830, -0.926577074968931050, 0.926595879057585450, 0.926614680829750180, 0.926633480285378170, 0.926652277424422470, 0.926671072246836090, 0.926689864752572420, 0.926708654941583720, -0.926727442813823350, 0.926746228369244470, 0.926765011607799890, 0.926783792529442870, 0.926802571134126340, 0.926821347421803440, 0.926840121392427440, 0.926858893045950820, -0.926877662382326940, 0.926896429401508850, 0.926915194103449800, 0.926933956488102730, 0.926952716555420770, 0.926971474305357310, 0.926990229737864930, 0.927008982852896900, -0.927027733650406470, 0.927046482130346570, 0.927065228292670570, 0.927083972137331510, 0.927102713664282540, 0.927121452873477030, 0.927140189764867670, 0.927158924338407740, -0.927177656594050490, 0.927196386531749180, 0.927215114151456850, 0.927233839453126760, 0.927252562436712060, 0.927271283102166330, 0.927290001449441960, 0.927308717478492640, -0.927327431189271520, 0.927346142581731870, 0.927364851655826830, 0.927383558411509660, 0.927402262848733950, 0.927420964967452190, 0.927439664767618080, 0.927458362249184760, -0.927477057412105620, 0.927495750256333800, 0.927514440781822550, 0.927533128988525250, 0.927551814876395380, 0.927570498445385750, 0.927589179695449740, 0.927607858626540940, -0.927626535238612380, 0.927645209531617550, 0.927663881505509710, 0.927682551160242120, 0.927701218495768480, 0.927719883512041490, 0.927738546209014750, 0.927757206586641630, -0.927775864644875600, 0.927794520383669830, 0.927813173802977790, 0.927831824902753070, 0.927850473682948480, 0.927869120143517740, 0.927887764284414220, 0.927906406105591270, -0.927925045607002400, 0.927943682788600730, 0.927962317650339990, 0.927980950192173750, 0.927999580414054840, 0.928018208315936840, 0.928036833897773470, 0.928055457159517980, -0.928074078101123860, 0.928092696722544460, 0.928111313023733730, 0.928129927004644360, 0.928148538665230170, 0.928167148005444640, 0.928185755025241250, 0.928204359724573490, -0.928222962103394830, 0.928241562161658650, 0.928260159899318980, 0.928278755316328640, 0.928297348412641330, 0.928315939188210650, 0.928334527642990180, 0.928353113776933410, -0.928371697589993830, 0.928390279082124900, 0.928408858253280680, 0.928427435103414080, 0.928446009632478700, 0.928464581840428460, 0.928483151727216740, 0.928501719292797120, -0.928520284537123100, 0.928538847460148810, 0.928557408061827070, 0.928575966342111810, 0.928594522300956630, 0.928613075938315100, 0.928631627254140950, 0.928650176248387640, -0.928668722921008990, 0.928687267271958830, 0.928705809301190070, 0.928724349008656970, 0.928742886394312910, 0.928761421458111580, 0.928779954200006700, 0.928798484619952070, -0.928817012717901400, 0.928835538493807960, 0.928854061947625650, 0.928872583079308200, 0.928891101888809300, 0.928909618376082550, 0.928928132541081860, 0.928946644383760840, -0.928965153904073530, 0.928983661101972950, 0.929002165977413250, 0.929020668530348150, 0.929039168760731340, 0.929057666668516640, 0.929076162253657860, 0.929094655516108590, -0.929113146455822990, 0.929131635072754200, 0.929150121366856260, 0.929168605338083100, 0.929187086986388410, 0.929205566311726020, 0.929224043314049730, 0.929242517993313700, -0.929260990349470960, 0.929279460382475770, 0.929297928092281960, 0.929316393478843210, 0.929334856542113560, 0.929353317282046840, 0.929371775698596750, 0.929390231791717540, -0.929408685561362470, 0.929427137007485690, 0.929445586130041020, 0.929464032928982390, 0.929482477404263710, 0.929500919555838800, 0.929519359383661590, 0.929537796887686340, -0.929556232067866310, 0.929574664924155640, 0.929593095456508260, 0.929611523664878200, 0.929629949549219400, 0.929648373109485560, 0.929666794345631260, 0.929685213257609670, -0.929703629845374910, 0.929722044108881150, 0.929740456048082310, 0.929758865662932310, 0.929777272953385080, 0.929795677919394770, 0.929814080560915520, 0.929832480877900710, -0.929850878870304820, 0.929869274538081660, 0.929887667881185260, 0.929906058899569790, 0.929924447593189150, 0.929942833961997730, 0.929961218005948780, 0.929979599724996890, -0.929997979119095990, 0.930016356188200220, 0.930034730932263410, 0.930053103351239810, 0.930071473445083560, 0.930089841213748820, 0.930108206657189300, 0.930126569775359120, -0.930144930568212570, 0.930163289035703670, 0.930181645177786560, 0.930199998994415410, 0.930218350485544130, 0.930236699651127430, 0.930255046491118560, 0.930273391005472130, -0.930291733194142270, 0.930310073057083020, 0.930328410594248530, 0.930346745805593070, 0.930365078691071100, 0.930383409250636010, 0.930401737484242490, 0.930420063391844580, -0.930438386973396540, 0.930456708228852510, 0.930475027158166770, 0.930493343761293450, 0.930511658038187030, 0.930529969988801110, 0.930548279613090390, 0.930566586911008910, -0.930584891882510920, 0.930603194527550800, 0.930621494846082590, 0.930639792838060750, 0.930658088503439670, 0.930676381842173050, 0.930694672854215480, 0.930712961539521210, -0.930731247898044620, 0.930749531929739860, 0.930767813634561290, 0.930786093012463510, 0.930804370063400110, 0.930822644787325790, 0.930840917184194930, 0.930859187253961770, -0.930877454996580590, 0.930895720412005860, 0.930913983500191720, 0.930932244261093000, 0.930950502694663400, 0.930968758800857500, 0.930987012579629680, 0.931005264030934310, -0.931023513154725760, 0.931041759950958500, 0.931060004419587140, 0.931078246560565480, 0.931096486373848120, 0.931114723859389650, 0.931132959017144320, 0.931151191847066630, -0.931169422349110820, 0.931187650523231600, 0.931205876369383570, 0.931224099887520420, 0.931242321077597190, 0.931260539939568030, 0.931278756473387540, 0.931296970679010180, -0.931315182556390340, 0.931333392105482600, 0.931351599326241670, 0.931369804218621480, 0.931388006782576720, 0.931406207018061980, 0.931424404925031650, 0.931442600503440410, -0.931460793753242640, 0.931478984674393160, 0.931497173266845890, 0.931515359530555750, 0.931533543465477230, 0.931551725071564810, 0.931569904348773070, 0.931588081297056500, -0.931606255916369810, 0.931624428206667800, 0.931642598167904400, 0.931660765800034540, 0.931678931103012700, 0.931697094076793570, 0.931715254721331650, 0.931733413036581640, -0.931751569022498120, 0.931769722679036020, 0.931787874006149150, 0.931806023003792780, 0.931824169671921280, 0.931842314010489340, 0.931860456019451560, 0.931878595698762750, -0.931896733048377720, 0.931914868068250520, 0.931933000758336180, 0.931951131118589290, 0.931969259148964560, 0.931987384849416790, 0.932005508219900470, 0.932023629260370410, -0.932041747970781650, 0.932059864351088120, 0.932077978401244960, 0.932096090121206870, 0.932114199510928550, 0.932132306570364720, 0.932150411299470070, 0.932168513698199750, -0.932186613766507800, 0.932204711504349360, 0.932222806911679140, 0.932240899988451940, 0.932258990734622480, 0.932277079150145460, 0.932295165234975800, 0.932313248989068530, -0.932331330412377920, 0.932349409504858890, 0.932367486266466260, 0.932385560697155060, 0.932403632796879880, 0.932421702565595640, 0.932439770003257170, 0.932457835109819500, -0.932475897885236990, 0.932493958329464800, 0.932512016442457630, 0.932530072224170390, 0.932548125674558030, 0.932566176793575340, 0.932584225581177590, 0.932602272037318820, -0.932620316161954510, 0.932638357955039350, 0.932656397416528280, 0.932674434546376220, 0.932692469344538090, 0.932710501810968820, 0.932728531945623550, 0.932746559748456660, -0.932764585219423400, 0.932782608358478590, 0.932800629165577380, 0.932818647640674570, 0.932836663783725100, 0.932854677594683880, 0.932872689073506400, 0.932890698220146920, -0.932908705034560580, 0.932926709516702530, 0.932944711666527820, 0.932962711483991130, 0.932980708969047830, 0.932998704121652980, 0.933016696941761040, 0.933034687429327380, -0.933052675584307050, 0.933070661406654960, 0.933088644896326260, 0.933106626053275990, 0.933124604877459070, 0.933142581368830990, 0.933160555527346110, 0.933178527352959920, -0.933196496845627330, 0.933214464005303610, 0.933232428831943570, 0.933250391325502580, 0.933268351485935900, 0.933286309313198000, 0.933304264807244380, 0.933322217968030050, -0.933340168795510180, 0.933358117289639910, 0.933376063450374270, 0.933394007277668520, 0.933411948771478150, 0.933429887931757520, 0.933447824758462220, 0.933465759251547290, -0.933483691410967990, 0.933501621236679460, 0.933519548728636850, 0.933537473886795420, 0.933555396711110540, 0.933573317201536910, 0.933591235358030010, 0.933609151180544990, -0.933627064669037110, 0.933644975823461620, 0.933662884643773560, 0.933680791129928740, 0.933698695281881540, 0.933716597099587650, 0.933734496583002230, 0.933752393732080520, -0.933770288546777900, 0.933788181027049640, 0.933806071172850750, 0.933823958984137170, 0.933841844460863270, 0.933859727602984750, 0.933877608410456970, 0.933895486883235090, -0.933913363021274590, 0.933931236824530610, 0.933949108292958850, 0.933966977426514020, 0.933984844225151820, 0.934002708688827400, 0.934020570817496340, 0.934038430611113800, -0.934056288069635140, 0.934074143193015740, 0.934091995981211400, 0.934109846434176610, 0.934127694551867280, 0.934145540334238800, 0.934163383781246300, 0.934181224892845500, -0.934199063668991530, 0.934216900109639980, 0.934234734214746450, 0.934252565984265760, 0.934270395418153710, 0.934288222516365560, 0.934306047278857020, 0.934323869705583230, -0.934341689796499790, 0.934359507551562500, 0.934377322970726070, 0.934395136053946310, 0.934412946801178810, 0.934430755212378840, 0.934448561287501980, 0.934466365026503820, -0.934484166429339740, 0.934501965495965430, 0.934519762226336040, 0.934537556620407160, 0.934555348678134390, 0.934573138399473200, 0.934590925784379300, 0.934608710832807940, -0.934626493544714940, 0.934644273920055890, 0.934662051958785930, 0.934679827660860880, 0.934697601026236110, 0.934715372054867540, 0.934733140746710320, 0.934750907101720370, -0.934768671119853510, 0.934786432801064550, 0.934804192145309630, 0.934821949152544130, 0.934839703822723740, 0.934857456155804180, 0.934875206151740910, 0.934892953810489760, -0.934910699132006420, 0.934928442116246040, 0.934946182763164550, 0.934963921072717530, 0.934981657044860800, 0.934999390679549960, 0.935017121976740580, 0.935034850936388720, -0.935052577558449390, 0.935070301842878650, 0.935088023789632180, 0.935105743398665590, 0.935123460669934680, 0.935141175603395160, 0.935158888199002610, 0.935176598456713190, -0.935194306376482040, 0.935212011958264980, 0.935229715202018030, 0.935247416107696680, 0.935265114675256860, 0.935282810904654260, 0.935300504795844590, 0.935318196348783990, -0.935335885563427620, 0.935353572439731500, 0.935371256977651440, 0.935388939177143160, 0.935406619038162690, 0.935424296560665610, 0.935441971744608080, 0.935459644589945350, -0.935477315096633450, 0.935494983264628320, 0.935512649093885650, 0.935530312584361480, 0.935547973736011400, 0.935565632548791440, 0.935583289022657750, 0.935600943157565480, -0.935618594953470880, 0.935636244410329780, 0.935653891528098080, 0.935671536306731720, 0.935689178746186400, 0.935706818846418150, 0.935724456607383240, 0.935742092029036800, -0.935759725111335210, 0.935777355854234270, 0.935794984257689920, 0.935812610321658080, 0.935830234046094780, 0.935847855430956170, 0.935865474476197610, 0.935883091181775370, -0.935900705547645370, 0.935918317573763650, 0.935935927260086120, 0.935953534606568830, 0.935971139613167690, 0.935988742279838970, 0.936006342606538030, 0.936023940593221360, -0.936041536239844760, 0.936059129546364390, 0.936076720512736050, 0.936094309138916000, 0.936111895424860510, 0.936129479370524930, 0.936147060975865750, 0.936164640240838790, -0.936182217165400290, 0.936199791749506290, 0.936217363993112730, 0.936234933896175740, 0.936252501458651800, 0.936270066680496280, 0.936287629561665670, 0.936305190102115880, -0.936322748301803070, 0.936340304160683480, 0.936357857678713160, 0.936375408855848130, 0.936392957692044890, 0.936410504187259020, 0.936428048341446770, 0.936445590154564410, -0.936463129626568190, 0.936480666757414040, 0.936498201547058320, 0.936515733995457290, 0.936533264102566760, 0.936550791868342890, 0.936568317292742150, 0.936585840375720680, -0.936603361117234520, 0.936620879517239930, 0.936638395575693170, 0.936655909292550830, 0.936673420667768260, 0.936690929701302190, 0.936708436393108860, 0.936725940743144410, -0.936743442751365010, 0.936760942417727120, 0.936778439742186890, 0.936795934724700800, 0.936813427365224550, 0.936830917663714740, 0.936848405620127720, 0.936865891234419550, -0.936883374506546800, 0.936900855436465510, 0.936918334024132380, 0.936935810269503230, 0.936953284172534430, 0.936970755733182450, 0.936988224951403550, 0.937005691827154210, -0.937023156360390570, 0.937040618551069020, 0.937058078399146230, 0.937075535904577930, 0.937092991067320800, 0.937110443887331220, 0.937127894364565560, 0.937145342498980070, -0.937162788290531350, 0.937180231739175860, 0.937197672844869540, 0.937215111607568980, 0.937232548027230660, 0.937249982103810940, 0.937267413837266420, 0.937284843227553230, -0.937302270274627980, 0.937319694978447360, 0.937337117338967070, 0.937354537356144160, 0.937371955029934870, 0.937389370360295570, 0.937406783347182970, 0.937424193990553430, -0.937441602290363330, 0.937459008246569580, 0.937476411859128000, 0.937493813127995290, 0.937511212053128150, 0.937528608634482950, 0.937546002872016280, 0.937563394765684510, -0.937580784315444670, 0.937598171521252470, 0.937615556383064930, 0.937632938900838430, 0.937650319074529560, 0.937667696904095020, 0.937685072389491060, 0.937702445530674610, -0.937719816327602150, 0.937737184780230050, 0.937754550888514780, 0.937771914652413270, 0.937789276071882010, 0.937806635146877450, 0.937823991877356320, 0.937841346263275310, -0.937858698304591120, 0.937876048001259900, 0.937893395353238570, 0.937910740360483830, 0.937928083022952160, 0.937945423340600270, 0.937962761313384850, 0.937980096941262830, -0.937997430224190350, 0.938014761162124230, 0.938032089755021170, 0.938049416002837870, 0.938066739905531130, 0.938084061463057450, 0.938101380675373630, 0.938118697542436710, -0.938136012064202720, 0.938153324240628690, 0.938170634071671340, 0.938187941557287350, 0.938205246697433660, 0.938222549492066740, 0.938239849941143730, 0.938257148044620900, -0.938274443802455060, 0.938291737214603240, 0.938309028281022030, 0.938326317001668240, 0.938343603376498690, 0.938360887405470080, 0.938378169088539550, 0.938395448425663360, -0.938412725416798540, 0.938430000061901910, 0.938447272360930170, 0.938464542313840360, 0.938481809920589160, 0.938499075181133510, 0.938516338095430340, 0.938533598663436110, -0.938550856885107860, 0.938568112760402530, 0.938585366289276800, 0.938602617471687720, 0.938619866307592090, 0.938637112796947170, 0.938654356939709110, 0.938671598735835170, -0.938688838185282150, 0.938706075288007090, 0.938723310043966810, 0.938740542453118330, 0.938757772515418480, 0.938775000230824500, 0.938792225599292650, 0.938809448620780310, -0.938826669295244280, 0.938843887622641700, 0.938861103602929290, 0.938878317236064190, 0.938895528522003200, 0.938912737460703810, 0.938929944052122160, 0.938947148296215730, -0.938964350192941330, 0.938981549742256230, 0.938998746944117110, 0.939015941798481140, 0.939033134305305660, 0.939050324464547060, 0.939067512276162590, 0.939084697740109390, -0.939101880856344380, 0.939119061624824720, 0.939136240045507440, 0.939153416118349570, 0.939170589843308370, 0.939187761220340420, 0.939204930249403100, 0.939222096930453440, -0.939239261263448480, 0.939256423248345460, 0.939273582885101320, 0.939290740173673640, 0.939307895114018690, 0.939325047706094040, 0.939342197949856740, 0.939359345845263930, -0.939376491392272860, 0.939393634590840470, 0.939410775440924000, 0.939427913942480930, 0.939445050095467750, 0.939462183899841930, 0.939479315355560730, 0.939496444462581180, -0.939513571220860540, 0.939530695630355960, 0.939547817691024580, 0.939564937402824100, 0.939582054765710880, 0.939599169779642530, 0.939616282444576290, 0.939633392760469310, -0.939650500727278850, 0.939667606344962160, 0.939684709613476720, 0.939701810532779240, 0.939718909102827180, 0.939736005323577930, 0.939753099194988620, 0.939770190717016510, -0.939787279889618970, 0.939804366712753250, 0.939821451186376940, 0.939838533310446640, 0.939855613084920050, 0.939872690509754420, 0.939889765584907110, 0.939906838310335280, -0.939923908685996400, 0.939940976711848060, 0.939958042387846970, 0.939975105713950820, 0.939992166690116870, 0.940009225316302490, 0.940026281592465040, 0.940043335518561900, -0.940060387094550420, 0.940077436320388320, 0.940094483196032280, 0.940111527721440020, 0.940128569896569010, 0.940145609721376510, 0.940162647195819990, 0.940179682319856940, -0.940196715093444600, 0.940213745516540690, 0.940230773589102230, 0.940247799311086820, 0.940264822682451930, 0.940281843703154930, 0.940298862373153410, 0.940315878692404630, -0.940332892660866500, 0.940349904278495850, 0.940366913545250480, 0.940383920461087760, 0.940400925025965280, 0.940417927239840410, 0.940434927102670850, 0.940451924614413850, -0.940468919775027450, 0.940485912584468340, 0.940502903042694460, 0.940519891149663390, 0.940536876905332610, 0.940553860309659600, 0.940570841362601940, 0.940587820064117120, -0.940604796414163060, 0.940621770412696790, 0.940638742059676130, 0.940655711355058430, 0.940672678298801630, 0.940689642890863100, 0.940706605131200410, 0.940723565019771500, -0.940740522556533400, 0.940757477741444030, 0.940774430574460860, 0.940791381055541720, 0.940808329184644080, 0.940825274961725630, 0.940842218386744090, 0.940859159459657150, -0.940876098180422060, 0.940893034548996750, 0.940909968565338820, 0.940926900229406060, 0.940943829541155960, 0.940960756500546340, 0.940977681107535100, 0.940994603362079300, -0.941011523264137060, 0.941028440813665990, 0.941045356010623890, 0.941062268854968350, 0.941079179346657080, 0.941096087485647880, 0.941112993271898790, 0.941129896705366950, -0.941146797786010400, 0.941163696513786730, 0.941180592888653860, 0.941197486910569590, 0.941214378579491530, 0.941231267895377590, 0.941248154858185690, 0.941265039467873100, -0.941281921724397950, 0.941298801627718060, 0.941315679177791130, 0.941332554374574970, 0.941349427218027390, 0.941366297708106650, 0.941383165844769780, 0.941400031627975030, -0.941416895057680110, 0.941433756133843060, 0.941450614856421560, 0.941467471225373550, 0.941484325240656950, 0.941501176902229680, 0.941518026210049320, 0.941534873164073800, -0.941551717764261160, 0.941568560010569100, 0.941585399902955760, 0.941602237441378940, 0.941619072625796470, 0.941635905456166600, 0.941652735932446690, 0.941669564054594900, -0.941686389822569250, 0.941703213236327660, 0.941720034295827960, 0.941736853001028160, 0.941753669351886650, 0.941770483348360550, 0.941787294990408250, 0.941804104277987770, -0.941820911211057040, 0.941837715789573980, 0.941854518013496620, 0.941871317882783000, 0.941888115397391370, 0.941904910557279210, 0.941921703362404770, 0.941938493812725990, -0.941955281908200990, 0.941972067648787830, 0.941988851034444520, 0.942005632065129330, 0.942022410740799730, 0.942039187061414210, 0.942055961026930570, 0.942072732637307180, -0.942089501892501850, 0.942106268792472830, 0.942123033337178170, 0.942139795526576120, 0.942156555360624370, 0.942173312839281190, 0.942190067962504820, 0.942206820730253190, -0.942223571142484450, 0.942240319199156850, 0.942257064900228540, 0.942273808245657760, 0.942290549235402120, 0.942307287869420200, 0.942324024147670030, 0.942340758070109860, -0.942357489636697740, 0.942374218847391810, 0.942390945702150760, 0.942407670200931970, 0.942424392343694130, 0.942441112130395160, 0.942457829560993440, 0.942474544635447220, -0.942491257353714640, 0.942507967715753850, 0.942524675721523430, 0.942541381370981090, 0.942558084664085190, 0.942574785600794220, 0.942591484181066200, 0.942608180404859500, -0.942624874272132370, 0.942641565782842970, 0.942658254936949990, 0.942674941734411130, 0.942691626175184870, 0.942708308259229580, 0.942724987986503500, 0.942741665356964910, -0.942758340370572160, 0.942775013027283950, 0.942791683327057760, 0.942808351269852520, 0.942825016855626250, 0.942841680084337550, 0.942858340955944670, 0.942874999470405870, -0.942891655627679630, 0.942908309427724410, 0.942924960870498260, 0.942941609955959660, 0.942958256684067080, 0.942974901054778770, 0.942991543068053330, 0.943008182723848900, -0.943024820022124400, 0.943041454962837530, 0.943058087545947000, 0.943074717771411280, 0.943091345639188730, 0.943107971149237830, 0.943124594301517070, 0.943141215095984810, -0.943157833532599740, 0.943174449611319800, 0.943191063332103790, 0.943207674694910070, 0.943224283699697130, 0.943240890346423560, 0.943257494635047710, 0.943274096565528190, -0.943290696137823680, 0.943307293351892120, 0.943323888207692420, 0.943340480705182840, 0.943357070844322190, 0.943373658625068830, 0.943390244047381370, 0.943406827111218480, -0.943423407816538330, 0.943439986163299600, 0.943456562151460900, 0.943473135780980800, 0.943489707051817890, 0.943506275963930660, 0.943522842517277800, 0.943539406711818130, -0.943555968547509670, 0.943572528024311240, 0.943589085142181540, 0.943605639901079040, 0.943622192300962450, 0.943638742341790460, 0.943655290023521550, 0.943671835346114760, -0.943688378309528010, 0.943704918913720440, 0.943721457158650520, 0.943737993044276860, 0.943754526570558360, 0.943771057737453400, 0.943787586544921230, 0.943804112992919770, -0.943820637081407950, 0.943837158810344580, 0.943853678179688350, 0.943870195189397850, 0.943886709839431900, 0.943903222129749200, 0.943919732060308770, 0.943936239631068650, -0.943952744841987880, 0.943969247693025370, 0.943985748184139720, 0.944002246315289620, 0.944018742086433990, 0.944035235497531770, 0.944051726548541080, 0.944068215239421190, -0.944084701570130690, 0.944101185540628500, 0.944117667150873310, 0.944134146400824050, 0.944150623290439310, 0.944167097819678340, 0.944183569988499280, 0.944200039796861290, -0.944216507244723280, 0.944232972332043950, 0.944249435058782230, 0.944265895424896920, 0.944282353430346830, 0.944298809075091230, 0.944315262359088250, 0.944331713282297150, -0.944348161844676740, 0.944364608046185940, 0.944381051886783560, 0.944397493366428640, 0.944413932485080210, 0.944430369242696740, 0.944446803639237280, 0.944463235674660840, -0.944479665348926250, 0.944496092661992640, 0.944512517613818600, 0.944528940204363400, 0.944545360433586170, 0.944561778301445170, 0.944578193807899760, 0.944594606952908870, -0.944611017736431410, 0.944627426158426430, 0.944643832218852840, 0.944660235917670120, 0.944676637254836420, 0.944693036230311090, 0.944709432844053180, 0.944725827096021710, -0.944742218986175720, 0.944758608514474130, 0.944774995680875970, 0.944791380485340730, 0.944807762927826640, 0.944824143008293200, 0.944840520726699440, 0.944856896083004270, -0.944873269077166960, 0.944889639709146410, 0.944906007978901790, 0.944922373886392440, 0.944938737431576860, 0.944955098614414510, 0.944971457434864330, 0.944987813892885550, -0.945004167988437230, 0.945020519721478380, 0.945036869091968600, 0.945053216099866370, 0.945069560745131150, 0.945085903027722000, 0.945102242947598040, 0.945118580504718530, -0.945134915699042510, 0.945151248530529230, 0.945167578999138170, 0.945183907104827800, 0.945200232847557720, 0.945216556227287060, 0.945232877243974980, 0.945249195897580720, -0.945265512188063430, 0.945281826115382360, 0.945298137679497000, 0.945314446880366140, 0.945330753717949060, 0.945347058192205100, 0.945363360303093540, 0.945379660050573500, -0.945395957434604360, 0.945412252455145600, 0.945428545112155900, 0.945444835405594870, 0.945461123335421760, 0.945477408901595820, 0.945493692104076410, 0.945509972942822690, -0.945526251417794120, 0.945542527528950180, 0.945558801276249580, 0.945575072659652020, 0.945591341679116850, 0.945607608334603220, 0.945623872626070620, 0.945640134553478280, -0.945656394116785930, 0.945672651315952350, 0.945688906150937040, 0.945705158621699570, 0.945721408728199210, 0.945737656470395200, 0.945753901848247150, 0.945770144861714400, -0.945786385510756440, 0.945802623795332310, 0.945818859715401580, 0.945835093270923740, 0.945851324461858160, 0.945867553288164300, 0.945883779749801530, 0.945900003846729230, -0.945916225578907310, 0.945932444946294470, 0.945948661948850630, 0.945964876586535050, 0.945981088859307320, 0.945997298767126790, 0.946013506309953070, 0.946029711487745840, -0.946045914300464030, 0.946062114748067560, 0.946078312830515690, 0.946094508547768110, 0.946110701899784190, 0.946126892886523520, 0.946143081507945680, 0.946159267764010380, -0.946175451654676540, 0.946191633179904180, 0.946207812339652790, 0.946223989133881730, 0.946240163562550810, 0.946256335625619390, 0.946272505323047190, 0.946288672654793990, -0.946304837620818850, 0.946321000221081570, 0.946337160455541840, 0.946353318324159140, 0.946369473826893290, 0.946385626963703650, 0.946401777734550140, 0.946417926139392020, -0.946434072178189090, 0.946450215850900940, 0.946466357157487280, 0.946482496097907690, 0.946498632672121860, 0.946514766880089510, 0.946530898721770540, 0.946547028197124000, -0.946563155306109790, 0.946579280048687850, 0.946595402424817660, 0.946611522434458900, 0.946627640077571390, 0.946643755354115050, 0.946659868264049020, 0.946675978807333340, -0.946692086983927710, 0.946708192793791930, 0.946724296236885590, 0.946740397313168500, 0.946756496022600480, 0.946772592365141440, 0.946788686340750640, 0.946804777949388110, -0.946820867191013770, 0.946836954065587100, 0.946853038573068130, 0.946869120713416560, 0.946885200486592190, 0.946901277892555070, 0.946917352931264440, 0.946933425602680570, -0.946949495906763030, 0.946965563843471750, 0.946981629412766530, 0.946997692614607310, 0.947013753448954110, 0.947029811915766300, 0.947045868015003900, 0.947061921746626840, -0.947077973110594940, 0.947094022106868110, 0.947110068735406260, 0.947126112996169220, 0.947142154889117240, 0.947158194414209560, 0.947174231571406340, 0.947190266360667610, -0.947206298781953170, 0.947222328835223060, 0.947238356520437090, 0.947254381837555170, 0.947270404786537570, 0.947286425367343750, 0.947302443579933870, 0.947318459424267840, -0.947334472900305700, 0.947350484008007370, 0.947366492747332760, 0.947382499118242240, 0.947398503120695290, 0.947414504754651940, 0.947430504020072450, 0.947446500916916620, -0.947462495445144490, 0.947478487604716200, 0.947494477395591670, 0.947510464817731270, 0.947526449871094360, 0.947542432555641410, 0.947558412871332360, 0.947574390818127220, -0.947590366395986150, 0.947606339604869060, 0.947622310444736550, 0.947638278915547860, 0.947654245017263590, 0.947670208749843650, 0.947686170113248180, 0.947702129107437340, -0.947718085732371150, 0.947734039988009650, 0.947749991874313410, 0.947765941391241930, 0.947781888538755560, 0.947797833316814550, 0.947813775725378840, 0.947829715764408780, -0.947845653433864400, 0.947861588733705850, 0.947877521663893720, 0.947893452224387370, 0.947909380415147500, 0.947925306236134140, 0.947941229687307430, 0.947957150768627740, -0.947973069480055110, 0.947988985821550220, 0.948004899793072450, 0.948020811394582500, 0.948036720626040500, 0.948052627487406710, 0.948068531978641270, 0.948084434099704660, -0.948100333850556810, 0.948116231231158510, 0.948132126241469250, 0.948148018881449840, 0.948163909151060190, 0.948179797050260900, 0.948195682579012100, 0.948211565737274050, -0.948227446525007120, 0.948243324942171780, 0.948259200988727960, 0.948275074664636120, 0.948290945969856520, 0.948306814904349650, 0.948322681468075630, 0.948338545660994960, -0.948354407483068210, 0.948370266934255190, 0.948386124014516500, 0.948401978723812490, 0.948417831062103530, 0.948433681029350000, 0.948449528625512240, 0.948465373850550630, -0.948481216704425980, 0.948497057187097870, 0.948512895298527230, 0.948528731038674300, 0.948544564407499570, 0.948560395404963400, 0.948576224031026260, 0.948592050285648750, -0.948607874168791000, 0.948623695680413490, 0.948639514820476700, 0.948655331588941110, 0.948671145985767290, 0.948686958010915520, 0.948702767664346360, 0.948718574946020630, -0.948734379855898150, 0.948750182393939710, 0.948765982560105800, 0.948781780354357010, 0.948797575776653690, 0.948813368826956440, 0.948829159505225840, 0.948844947811422480, -0.948860733745506610, 0.948876517307438830, 0.948892298497179820, 0.948908077314689960, 0.948923853759929940, 0.948939627832860340, 0.948955399533441990, 0.948971168861634800, -0.948986935817399680, 0.949002700400697230, 0.949018462611488030, 0.949034222449732680, 0.949049979915391750, 0.949065735008425840, 0.949081487728795970, 0.949097238076462070, -0.949112986051385050, 0.949128731653525510, 0.949144474882844260, 0.949160215739301760, 0.949175954222858720, 0.949191690333476060, 0.949207424071113910, 0.949223155435733210, -0.949238884427294650, 0.949254611045758810, 0.949270335291086510, 0.949286057163238330, 0.949301776662174970, 0.949317493787857570, 0.949333208540246050, 0.949348920919301560, -0.949364630924984800, 0.949380338557256340, 0.949396043816077120, 0.949411746701407820, 0.949427447213209040, 0.949443145351442030, 0.949458841116066820, 0.949474534507044550, -0.949490225524335930, 0.949505914167901750, 0.949521600437702840, 0.949537284333699770, 0.949552965855853910, 0.949568645004125300, 0.949584321778475070, 0.949599996178864150, -0.949615668205253120, 0.949631337857602900, 0.949647005135874410, 0.949662670040028360, 0.949678332570025980, 0.949693992725827440, 0.949709650507393870, 0.949725305914686290, -0.949740958947665300, 0.949756609606292050, 0.949772257890527220, 0.949787903800331730, 0.949803547335666850, 0.949819188496492720, 0.949834827282770690, 0.949850463694461470, -0.949866097731526190, 0.949881729393925680, 0.949897358681620840, 0.949912985594572820, 0.949928610132742100, 0.949944232296089820, 0.949959852084577010, 0.949975469498164580, -0.949991084536813470, 0.950006697200484580, 0.950022307489139070, 0.950037915402737960, 0.950053520941241850, 0.950069124104611860, 0.950084724892809150, 0.950100323305794530, -0.950115919343529240, 0.950131513005973980, 0.950147104293090350, 0.950162693204838700, 0.950178279741180190, 0.950193863902076050, 0.950209445687487220, 0.950225025097374830, -0.950240602131699920, 0.950256176790423400, 0.950271749073506760, 0.950287318980910460, 0.950302886512595870, 0.950318451668524020, 0.950334014448656170, 0.950349574852953130, -0.950365132881376250, 0.950380688533886460, 0.950396241810445350, 0.950411792711013280, 0.950427341235551730, 0.950442887384021830, 0.950458431156384730, 0.950473972552601460, -0.950489511572633390, 0.950505048216441770, 0.950520582483987190, 0.950536114375231220, 0.950551643890135020, 0.950567171028659620, 0.950582695790766260, 0.950598218176416320, -0.950613738185570710, 0.950629255818191020, 0.950644771074237950, 0.950660283953672970, 0.950675794456457220, 0.950691302582552080, 0.950706808331918560, 0.950722311704518150, -0.950737812700311880, 0.950753311319261440, 0.950768807561327310, 0.950784301426471300, 0.950799792914654440, 0.950815282025838090, 0.950830768759983620, 0.950846253117052180, -0.950861735097005440, 0.950877214699804020, 0.950892691925409590, 0.950908166773783430, 0.950923639244886760, 0.950939109338681090, 0.950954577055127650, 0.950970042394187810, -0.950985505355823050, 0.951000965939994280, 0.951016424146663100, 0.951031879975790860, 0.951047333427338940, 0.951062784501268690, 0.951078233197541370, 0.951093679516118900, -0.951109123456961860, 0.951124565020032060, 0.951140004205290770, 0.951155441012699550, 0.951170875442219680, 0.951186307493812610, 0.951201737167439830, 0.951217164463062930, -0.951232589380642920, 0.951248011920141410, 0.951263432081519870, 0.951278849864739650, 0.951294265269762460, 0.951309678296549550, 0.951325088945062400, 0.951340497215262810, -0.951355903107111710, 0.951371306620570900, 0.951386707755601750, 0.951402106512165950, 0.951417502890224750, 0.951432896889739870, 0.951448288510672980, 0.951463677752985130, -0.951479064616638110, 0.951494449101593310, 0.951509831207812520, 0.951525210935257100, 0.951540588283888660, 0.951555963253668760, 0.951571335844559220, 0.951586706056521070, -0.951602073889516120, 0.951617439343505960, 0.951632802418452270, 0.951648163114316550, 0.951663521431060480, 0.951678877368645540, 0.951694230927033650, 0.951709582106185950, -0.951724930906064360, 0.951740277326630360, 0.951755621367845750, 0.951770963029672010, 0.951786302312070840, 0.951801639215004270, 0.951816973738433210, 0.951832305882319820, -0.951847635646625670, 0.951862963031312460, 0.951878288036341670, 0.951893610661675330, 0.951908930907274910, 0.951924248773102440, 0.951939564259119080, 0.951954877365286830, -0.951970188091567300, 0.951985496437922410, 0.952000802404313730, 0.952016105990702970, 0.952031407197052370, 0.952046706023322860, 0.952062002469476590, 0.952077296535475350, -0.952092588221280960, 0.952107877526855000, 0.952123164452159280, 0.952138448997155720, 0.952153731161806350, 0.952169010946072310, 0.952184288349915860, 0.952199563373298590, -0.952214836016182400, 0.952230106278529220, 0.952245374160300640, 0.952260639661458690, 0.952275902781965390, 0.952291163521782110, 0.952306421880870890, 0.952321677859193640, -0.952336931456712170, 0.952352182673388390, 0.952367431509184130, 0.952382677964061620, 0.952397922037982130, 0.952413163730907790, 0.952428403042800520, 0.952443639973622250, -0.952458874523335000, 0.952474106691900470, 0.952489336479280690, 0.952504563885437800, 0.952519788910333290, 0.952535011553929280, 0.952550231816187700, 0.952565449697070580, -0.952580665196539830, 0.952595878314557390, 0.952611089051085380, 0.952626297406085840, 0.952641503379520250, 0.952656706971350850, 0.952671908181539790, 0.952687107010048990, -0.952702303456840370, 0.952717497521875960, 0.952732689205118110, 0.952747878506528200, 0.952763065426068700, 0.952778249963701530, 0.952793432119388610, 0.952808611893092180, -0.952823789284774290, 0.952838964294396850, 0.952854136921922330, 0.952869307167312110, 0.952884475030528750, 0.952899640511534090, 0.952914803610290350, 0.952929964326759690, -0.952945122660904030, 0.952960278612685840, 0.952975432182066710, 0.952990583369008990, 0.953005732173474730, 0.953020878595426280, 0.953036022634825560, 0.953051164291634830, -0.953066303565816120, 0.953081440457331900, 0.953096574966143860, 0.953111707092214490, 0.953126836835505700, 0.953141964195979850, 0.953157089173599090, 0.953172211768325670, -0.953187331980121730, 0.953202449808949640, 0.953217565254771190, 0.953232678317548880, 0.953247788997244830, 0.953262897293821300, 0.953278003207240540, 0.953293106737464700, -0.953308207884456470, 0.953323306648177440, 0.953338403028590080, 0.953353497025656750, 0.953368588639339710, 0.953383677869601100, 0.953398764716403390, 0.953413849179708730, -0.953428931259479700, 0.953444010955678100, 0.953459088268266530, 0.953474163197207130, 0.953489235742462360, 0.953504305903994600, 0.953519373681765980, 0.953534439075739200, -0.953549502085875970, 0.953564562712139070, 0.953579620954490780, 0.953594676812893450, 0.953609730287309440, 0.953624781377701010, 0.953639830084030750, 0.953654876406261120, -0.953669920344354050, 0.953684961898272120, 0.953700001067977810, 0.953715037853433590, 0.953730072254601600, 0.953745104271444540, 0.953760133903924780, 0.953775161152004890, -0.953790186015646800, 0.953805208494813320, 0.953820228589466690, 0.953835246299569620, 0.953850261625084350, 0.953865274565973480, 0.953880285122199690, 0.953895293293724910, -0.953910299080511840, 0.953925302482523050, 0.953940303499721030, 0.953955302132068250, 0.953970298379527290, 0.953985292242060410, 0.954000283719630750, 0.954015272812200000, -0.954030259519731080, 0.954045243842186470, 0.954060225779528870, 0.954075205331720630, 0.954090182498724460, 0.954105157280502710, 0.954120129677018420, 0.954135099688233510, -0.954150067314110780, 0.954165032554613050, 0.954179995409702550, 0.954194955879342220, 0.954209913963494420, 0.954224869662122170, 0.954239822975187390, 0.954254773902653120, -0.954269722444481830, 0.954284668600636320, 0.954299612371079080, 0.954314553755772900, 0.954329492754680260, 0.954344429367764090, 0.954359363594986740, 0.954374295436310920, -0.954389224891699310, 0.954404151961114610, 0.954419076644519640, 0.954433998941876970, 0.954448918853149530, 0.954463836378299460, 0.954478751517289890, 0.954493664270083420, -0.954508574636642850, 0.954523482616930760, 0.954538388210909970, 0.954553291418543280, 0.954568192239793500, 0.954583090674623100, 0.954597986722994900, 0.954612880384871800, -0.954627771660216400, 0.954642660548991610, 0.954657547051160240, 0.954672431166684880, 0.954687312895528770, 0.954702192237654180, 0.954717069193024010, 0.954731943761601200, -0.954746815943348540, 0.954761685738228840, 0.954776553146205020, 0.954791418167239890, 0.954806280801296150, 0.954821141048336600, 0.954835998908324160, 0.954850854381221750, -0.954865707466992290, 0.954880558165598470, 0.954895406477003220, 0.954910252401169780, 0.954925095938060520, 0.954939937087638360, 0.954954775849866540, 0.954969612224707660, -0.954984446212124750, 0.954999277812080720, 0.955014107024538590, 0.955028933849461300, 0.955043758286811540, 0.955058580336552330, 0.955073399998646710, 0.955088217273057590, -0.955103032159747900, 0.955117844658680660, 0.955132654769819010, 0.955147462493125540, 0.955162267828563280, 0.955177070776095480, 0.955191871335684950, 0.955206669507294830, -0.955221465290887920, 0.955236258686427360, 0.955251049693876530, 0.955265838313197670, 0.955280624544354360, 0.955295408387309310, 0.955310189842025870, 0.955324968908466960, -0.955339745586595510, 0.955354519876375100, 0.955369291777768080, 0.955384061290737830, 0.955398828415247370, 0.955413593151259950, 0.955428355498738390, 0.955443115457646040, -0.955457873027945940, 0.955472628209601330, 0.955487381002575020, 0.955502131406830160, 0.955516879422329990, 0.955531625049037550, 0.955546368286916190, 0.955561109135928840, -0.955575847596038640, 0.955590583667209170, 0.955605317349403020, 0.955620048642583430, 0.955634777546713890, 0.955649504061757300, 0.955664228187676930, 0.955678949924436030, -0.955693669271998060, 0.955708386230325610, 0.955723100799382270, 0.955737812979131070, 0.955752522769535370, 0.955767230170558420, 0.955781935182163370, 0.955796637804313450, -0.955811338036972160, 0.955826035880102290, 0.955840731333667430, 0.955855424397630600, 0.955870115071955300, 0.955884803356604750, 0.955899489251542110, 0.955914172756730740, -0.955928853872134220, 0.955943532597715360, 0.955958208933437640, 0.955972882879264300, 0.955987554435158930, 0.956002223601084560, 0.956016890377004660, 0.956031554762882710, -0.956046216758681730, 0.956060876364365210, 0.956075533579896390, 0.956090188405238850, 0.956104840840355740, 0.956119490885210640, 0.956134138539766700, 0.956148783803987710, -0.956163426677836600, 0.956178067161276850, 0.956192705254271910, 0.956207340956785170, 0.956221974268780190, 0.956236605190220130, 0.956251233721068910, 0.956265859861289420, -0.956280483610845170, 0.956295104969699720, 0.956309723937816550, 0.956324340515159020, 0.956338954701690720, 0.956353566497375020, 0.956368175902175600, 0.956382782916055500, -0.956397387538978410, 0.956411989770907910, 0.956426589611807380, 0.956441187061640500, 0.956455782120370520, 0.956470374787961150, 0.956484965064376080, 0.956499552949578340, -0.956514138443531730, 0.956528721546199830, 0.956543302257546020, 0.956557880577533990, 0.956572456506127320, 0.956587030043289710, 0.956601601188984190, 0.956616169943174780, -0.956630736305824960, 0.956645300276898200, 0.956659861856358320, 0.956674421044168670, 0.956688977840293050, 0.956703532244695180, 0.956718084257338290, 0.956732633878186080, -0.956747181107202360, 0.956761725944350720, 0.956776268389594730, 0.956790808442897990, 0.956805346104224300, 0.956819881373537570, 0.956834414250800850, 0.956848944735978040, -0.956863472829032840, 0.956877998529929050, 0.956892521838630160, 0.956907042755100080, 0.956921561279302610, 0.956936077411200900, 0.956950591150759090, 0.956965102497940760, -0.956979611452709710, 0.956994118015029650, 0.957008622184864270, 0.957023123962177260, 0.957037623346932760, 0.957052120339094040, 0.957066614938624880, 0.957081107145489220, -0.957095596959650850, 0.957110084381073370, 0.957124569409720790, 0.957139052045557050, 0.957153532288545380, 0.957168010138649830, 0.957182485595834300, 0.957196958660062600, -0.957211429331298440, 0.957225897609505720, 0.957240363494648250, 0.957254826986690180, 0.957269288085594750, 0.957283746791326110, 0.957298203103848060, 0.957312657023124510, -0.957327108549119400, 0.957341557681796520, 0.957356004421119680, 0.957370448767053020, 0.957384890719560120, 0.957399330278604910, 0.957413767444151410, 0.957428202216163540, -0.957442634594604990, 0.957457064579440020, 0.957471492170632650, 0.957485917368146140, 0.957500340171944960, 0.957514760581992920, 0.957529178598253930, 0.957543594220692020, -0.957558007449271220, 0.957572418283955340, 0.957586826724708630, 0.957601232771494560, 0.957615636424277490, 0.957630037683021350, 0.957644436547690050, 0.957658833018247610, -0.957673227094658190, 0.957687618776885690, 0.957702008064894360, 0.957716394958647800, 0.957730779458110250, 0.957745161563245630, 0.957759541274018300, 0.957773918590391960, -0.957788293512330860, 0.957802666039799360, 0.957817036172760930, 0.957831403911179820, 0.957845769255020190, 0.957860132204246260, 0.957874492758821970, 0.957888850918711340, -0.957903206683878630, 0.957917560054288190, 0.957931911029903600, 0.957946259610689240, 0.957960605796609240, 0.957974949587627740, 0.957989290983708770, 0.958003629984816700, -0.958017966590915650, 0.958032300801969550, 0.958046632617942650, 0.958060962038799200, 0.958075289064503340, 0.958089613695019330, 0.958103935930311180, 0.958118255770343150, -0.958132573215079830, 0.958146888264484800, 0.958161200918522530, 0.958175511177157270, 0.958189819040353270, 0.958204124508074680, 0.958218427580285860, 0.958232728256950830, -0.958247026538034290, 0.958261322423500040, 0.958275615913312340, 0.958289907007435660, 0.958304195705834250, 0.958318482008472250, 0.958332765915314130, 0.958347047426324260, -0.958361326541466660, 0.958375603260705590, 0.958389877584005620, 0.958404149511330910, 0.958418419042645800, 0.958432686177914770, 0.958446950917101860, 0.958461213260171970, -0.958475473207088700, 0.958489730757816740, 0.958503985912320560, 0.958518238670564290, 0.958532489032512540, 0.958546736998129420, 0.958560982567379870, 0.958575225740227470, -0.958589466516637120, 0.958603704896572980, 0.958617940879999740, 0.958632174466881540, 0.958646405657182950, 0.958660634450868350, 0.958674860847902320, 0.958689084848249000, -0.958703306451872960, 0.958717525658738580, 0.958731742468810430, 0.958745956882052890, 0.958760168898430520, 0.958774378517907700, 0.958788585740449120, 0.958802790566018910, -0.958816992994581780, 0.958831193026102090, 0.958845390660544420, 0.958859585897873230, 0.958873778738053130, 0.958887969181048790, 0.958902157226824370, 0.958916342875344440, -0.958930526126573700, 0.958944706980476620, 0.958958885437017900, 0.958973061496161790, 0.958987235157873210, 0.959001406422116620, 0.959015575288856390, 0.959029741758057110, -0.959043905829683570, 0.959058067503700260, 0.959072226780071760, 0.959086383658762640, 0.959100538139737610, 0.959114690222961470, 0.959128839908398370, 0.959142987196013210, -0.959157132085770580, 0.959171274577635070, 0.959185414671571370, 0.959199552367544170, 0.959213687665518290, 0.959227820565457970, 0.959241951067328120, 0.959256079171093350, -0.959270204876718440, 0.959284328184167980, 0.959298449093406670, 0.959312567604399310, 0.959326683717110720, 0.959340797431505240, 0.959354908747547700, 0.959369017665202880, -0.959383124184435610, 0.959397228305210460, 0.959411330027492240, 0.959425429351245970, 0.959439526276435810, 0.959453620803026870, 0.959467712930983870, 0.959481802660271610, -0.959495889990854890, 0.959509974922698410, 0.959524057455766970, 0.959538137590025710, 0.959552215325438770, 0.959566290661971300, 0.959580363599588090, 0.959594434138254070, -0.959608502277933930, 0.959622568018592470, 0.959636631360194610, 0.959650692302705390, 0.959664750846089270, 0.959678806990311270, 0.959692860735336220, 0.959706912081129020, -0.959720961027654470, 0.959735007574877620, 0.959749051722763480, 0.959763093471276530, 0.959777132820381680, 0.959791169770044080, 0.959805204320228640, 0.959819236470900060, -0.959833266222023470, 0.959847293573563690, 0.959861318525485950, 0.959875341077754630, 0.959889361230334970, 0.959903378983191890, 0.959917394336290420, 0.959931407289595360, -0.959945417843071860, 0.959959425996684820, 0.959973431750399400, 0.959987435104180160, 0.960001436057992490, 0.960015434611801060, 0.960029430765571120, 0.960043424519267500, -0.960057415872855420, 0.960071404826300050, 0.960085391379565940, 0.960099375532618260, 0.960113357285422240, 0.960127336637942700, 0.960141313590144870, 0.960155288141993800, -0.960169260293454510, 0.960183230044492350, 0.960197197395071810, 0.960211162345158240, 0.960225124894716900, 0.960239085043712580, 0.960253042792110660, 0.960266998139876040, -0.960280951086974310, 0.960294901633369840, 0.960308849779028200, 0.960322795523914310, 0.960336738867993530, 0.960350679811230900, 0.960364618353591550, 0.960378554495040730, -0.960392488235543680, 0.960406419575065120, 0.960420348513570610, 0.960434275051025190, 0.960448199187394100, 0.960462120922642490, 0.960476040256735610, 0.960489957189638590, -0.960503871721316900, 0.960517783851735360, 0.960531693580859320, 0.960545600908654040, 0.960559505835084760, 0.960573408360116730, 0.960587308483715210, 0.960601206205845660, -0.960615101526472780, 0.960628994445562270, 0.960642884963079150, 0.960656773078988890, 0.960670658793256640, 0.960684542105847750, 0.960698423016727590, 0.960712301525861510, -0.960726177633214550, 0.960740051338752070, 0.960753922642439420, 0.960767791544241970, 0.960781658044125080, 0.960795522142054100, 0.960809383837994300, 0.960823243131911250, -0.960837100023769760, 0.960850954513535640, 0.960864806601174130, 0.960878656286650590, 0.960892503569930390, 0.960906348450978890, 0.960920190929761890, 0.960934031006244080, -0.960947868680391170, 0.960961703952168620, 0.960975536821541800, 0.960989367288476170, 0.961003195352937100, 0.961017021014890060, 0.961030844274300630, 0.961044665131133960, -0.961058483585355620, 0.961072299636930970, 0.961086113285825610, 0.961099924532004990, 0.961113733375434600, 0.961127539816080120, 0.961141343853906480, 0.961155145488879480, -0.961168944720964700, 0.961182741550127510, 0.961196535976333480, 0.961210327999547980, 0.961224117619736810, 0.961237904836865550, 0.961251689650899350, 0.961265472061803790, -0.961279252069544680, 0.961293029674087360, 0.961306804875397440, 0.961320577673440590, 0.961334348068182300, 0.961348116059588360, 0.961361881647623820, 0.961375644832254680, -0.961389405613446320, 0.961403163991164540, 0.961416919965374820, 0.961430673536042830, 0.961444424703134290, 0.961458173466614550, 0.961471919826449420, 0.961485663782604360, -0.961499405335045190, 0.961513144483737480, 0.961526881228647050, 0.961540615569739240, 0.961554347506980210, 0.961568077040335090, 0.961581804169769790, 0.961595528895249910, -0.961609251216741230, 0.961622971134209470, 0.961636688647620310, 0.961650403756939330, 0.961664116462132570, 0.961677826763165380, 0.961691534660003570, 0.961705240152612940, -0.961718943240959190, 0.961732643925008120, 0.961746342204725320, 0.961760038080077040, 0.961773731551028410, 0.961787422617545350, 0.961801111279593890, 0.961814797537139500, -0.961828481390148200, 0.961842162838585700, 0.961855841882417790, 0.961869518521610510, 0.961883192756129210, 0.961896864585939810, 0.961910534011008340, 0.961924201031300610, -0.961937865646782300, 0.961951527857419330, 0.961965187663177850, 0.961978845064022980, 0.961992500059921210, 0.962006152650838110, 0.962019802836739600, 0.962033450617591600, -0.962047095993359910, 0.962060738964010560, 0.962074379529509580, 0.962088017689822440, 0.962101653444915160, 0.962115286794753890, 0.962128917739304310, 0.962142546278532460, -0.962156172412404250, 0.962169796140885600, 0.962183417463942650, 0.962197036381540970, 0.962210652893646710, 0.962224267000225900, 0.962237878701244220, 0.962251487996668040, -0.962265094886463060, 0.962278699370595510, 0.962292301449031110, 0.962305901121735860, 0.962319498388675920, 0.962333093249817200, 0.962346685705125720, 0.962360275754567510, -0.962373863398108710, 0.962387448635715460, 0.962401031467353230, 0.962414611892988600, 0.962428189912587270, 0.962441765526115600, 0.962455338733539500, 0.962468909534825000, -0.962482477929938460, 0.962496043918845580, 0.962509607501512490, 0.962523168677905440, 0.962536727447990460, 0.962550283811733580, 0.962563837769101040, 0.962577389320058980, -0.962590938464573660, 0.962604485202610660, 0.962618029534136550, 0.962631571459117370, 0.962645110977519150, 0.962658648089308230, 0.962672182794450770, 0.962685715092912670, -0.962699244984660640, 0.962712772469660250, 0.962726297547877970, 0.962739820219279840, 0.962753340483832210, 0.962766858341501330, 0.962780373792253120, 0.962793886836054380, -0.962807397472870590, 0.962820905702668320, 0.962834411525413820, 0.962847914941073250, 0.962861415949612940, 0.962874914550999050, 0.962888410745197820, 0.962901904532175950, -0.962915395911899010, 0.962928884884333480, 0.962942371449445830, 0.962955855607202320, 0.962969337357569070, 0.962982816700512450, 0.962996293635998920, 0.963009768163994750, -0.963023240284466060, 0.963036709997379110, 0.963050177302700480, 0.963063642200396420, 0.963077104690433280, 0.963090564772777320, 0.963104022447395240, 0.963117477714252820, -0.963130930573316670, 0.963144381024553240, 0.963157829067928910, 0.963171274703409910, 0.963184717930962830, 0.963198158750553810, 0.963211597162149770, 0.963225033165716390, -0.963238466761220490, 0.963251897948628420, 0.963265326727906660, 0.963278753099021560, 0.963292177061939480, 0.963305598616627230, 0.963319017763050840, 0.963332434501176890, -0.963345848830971740, 0.963359260752402080, 0.963372670265434160, 0.963386077370034680, 0.963399482066169990, 0.963412884353806790, 0.963426284232911100, 0.963439681703449740, -0.963453076765389270, 0.963466469418695960, 0.963479859663336600, 0.963493247499277450, 0.963506632926485310, 0.963520015944926760, 0.963533396554567930, 0.963546774755375650, -0.963560150547316470, 0.963573523930356890, 0.963586894904463480, 0.963600263469602810, 0.963613629625741710, 0.963626993372846300, 0.963640354710883380, 0.963653713639819660, -0.963667070159621610, 0.963680424270255910, 0.963693775971689150, 0.963707125263887910, 0.963720472146819110, 0.963733816620448990, 0.963747158684744250, 0.963760498339671590, -0.963773835585197690, 0.963787170421289250, 0.963800502847912850, 0.963813832865035190, 0.963827160472623180, 0.963840485670642950, 0.963853808459061660, 0.963867128837845750, -0.963880446806962050, 0.963893762366377250, 0.963907075516058030, 0.963920386255971320, 0.963933694586083470, 0.963947000506361400, 0.963960304016771800, 0.963973605117281360, -0.963986903807857010, 0.964000200088465430, 0.964013493959073210, 0.964026785419647590, 0.964040074470154720, 0.964053361110561720, 0.964066645340835300, 0.964079927160942260, -0.964093206570849400, 0.964106483570523530, 0.964119758159931670, 0.964133030339040300, 0.964146300107816210, 0.964159567466226440, 0.964172832414237680, 0.964186094951816840, -0.964199355078930840, 0.964212612795546380, 0.964225868101630690, 0.964239120997150030, 0.964252371482071660, 0.964265619556362360, 0.964278865219988960, 0.964292108472918350, -0.964305349315117470, 0.964318587746553320, 0.964331823767192840, 0.964345057377002600, 0.964358288575949740, 0.964371517364001170, 0.964384743741123710, 0.964397967707284480, -0.964411189262450290, 0.964424408406588380, 0.964437625139665240, 0.964450839461648000, 0.964464051372503680, 0.964477260872199200, 0.964490467960701700, 0.964503672637977870, -0.964516874903994960, 0.964530074758719990, 0.964543272202119660, 0.964556467234161220, 0.964569659854811470, 0.964582850064037660, 0.964596037861806700, 0.964609223248085730, -0.964622406222841570, 0.964635586786041670, 0.964648764937652610, 0.964661940677641660, 0.964675114005975830, 0.964688284922622150, 0.964701453427547870, 0.964714619520719910, -0.964727783202105620, 0.964740944471671580, 0.964754103329385270, 0.964767259775213600, 0.964780413809123940, 0.964793565431083080, 0.964806714641058380, 0.964819861439016990, -0.964833005824926040, 0.964846147798752440, 0.964859287360463340, 0.964872424510026190, 0.964885559247407820, 0.964898691572575680, 0.964911821485496700, 0.964924948986138450, -0.964938074074467630, 0.964951196750451600, 0.964964317014057600, 0.964977434865252780, 0.964990550304004380, 0.965003663330279650, 0.965016773944045610, 0.965029882145270080, -0.965042987933919520, 0.965056091309961390, 0.965069192273363190, 0.965082290824091920, 0.965095386962114940, 0.965108480687399520, 0.965121571999912890, 0.965134660899622520, -0.965147747386495230, 0.965160831460498690, 0.965173913121599950, 0.965186992369766570, 0.965200069204965590, 0.965213143627164480, 0.965226215636330710, 0.965239285232431300, -0.965252352415433500, 0.965265417185304900, 0.965278479542012850, 0.965291539485524490, 0.965304597015807290, 0.965317652132828610, 0.965330704836556030, 0.965343755126956470, -0.965356803003997510, 0.965369848467646510, 0.965382891517870930, 0.965395932154638150, 0.965408970377915510, 0.965422006187670380, 0.965435039583870560, 0.965448070566482850, -0.965461099135475060, 0.965474125290814440, 0.965487149032468460, 0.965500170360404700, 0.965513189274590510, 0.965526205774993600, 0.965539219861580870, 0.965552231534320130, -0.965565240793178740, 0.965578247638124280, 0.965591252069124220, 0.965604254086146140, 0.965617253689157300, 0.965630250878125600, 0.965643245653017960, 0.965656238013802290, -0.965669227960445960, 0.965682215492916660, 0.965695200611181750, 0.965708183315208910, 0.965721163604965740, 0.965734141480419470, 0.965747116941537920, 0.965760089988288440, -0.965773060620638830, 0.965786028838556580, 0.965798994642009250, 0.965811958030964420, 0.965824919005389910, 0.965837877565252860, 0.965850833710521160, 0.965863787441162300, -0.965876738757144080, 0.965889687658433970, 0.965902634144999660, 0.965915578216808730, 0.965928519873828990, 0.965941459116027910, 0.965954395943373070, 0.965967330355832270, -0.965980262353373090, 0.965993191935963340, 0.966006119103570590, 0.966019043856162770, 0.966031966193707130, 0.966044886116171450, 0.966057803623523670, 0.966070718715731360, -0.966083631392762320, 0.966096541654584140, 0.966109449501164620, 0.966122354932471670, 0.966135257948472550, 0.966148158549135380, 0.966161056734427870, 0.966173952504317590, -0.966186845858772460, 0.966199736797760280, 0.966212625321248960, 0.966225511429205760, 0.966238395121598930, 0.966251276398396030, 0.966264155259564880, 0.966277031705073400, -0.966289905734889380, 0.966302777348980620, 0.966315646547315050, 0.966328513329860140, 0.966341377696584010, 0.966354239647454480, 0.966367099182439240, 0.966379956301506300, -0.966392811004623490, 0.966405663291758590, 0.966418513162879740, 0.966431360617954540, 0.966444205656950770, 0.966457048279836580, 0.966469888486579780, 0.966482726277148150, -0.966495561651509850, 0.966508394609632780, 0.966521225151484530, 0.966534053277033230, 0.966546878986246690, 0.966559702279093050, 0.966572523155540210, 0.966585341615555980, -0.966598157659108390, 0.966610971286165690, 0.966623782496695230, 0.966636591290665370, 0.966649397668044030, 0.966662201628799230, 0.966675003172898890, 0.966687802300311150, -0.966700599011003800, 0.966713393304945210, 0.966726185182102850, 0.966738974642445070, 0.966751761685939790, 0.966764546312555260, 0.966777328522259280, 0.966790108315019990, -0.966802885690805640, 0.966815660649583800, 0.966828433191322830, 0.966841203315990880, 0.966853971023555860, 0.966866736313985900, 0.966879499187249030, 0.966892259643313490, -0.966905017682147540, 0.966917773303718860, 0.966930526507995710, 0.966943277294946220, 0.966956025664538530, 0.966968771616740770, 0.966981515151521090, 0.966994256268847830, -0.967006994968688800, 0.967019731251012150, 0.967032465115786220, 0.967045196562979160, 0.967057925592559100, 0.967070652204494290, 0.967083376398752750, 0.967096098175303060, -0.967108817534112820, 0.967121534475150590, 0.967134248998384520, 0.967146961103782840, 0.967159670791313710, 0.967172378060945470, 0.967185082912646270, 0.967197785346384560, -0.967210485362128170, 0.967223182959845550, 0.967235878139504960, 0.967248570901074740, 0.967261261244523050, 0.967273949169818240, 0.967286634676928770, 0.967299317765822450, -0.967311998436467870, 0.967324676688833260, 0.967337352522887000, 0.967350025938597420, 0.967362696935932690, 0.967375365514861250, 0.967388031675351590, 0.967400695417371610, -0.967413356740889910, 0.967426015645874830, 0.967438672132294730, 0.967451326200117980, 0.967463977849312820, 0.967476627079847830, 0.967489273891691370, 0.967501918284811580, -0.967514560259176930, 0.967527199814755990, 0.967539836951516910, 0.967552471669428370, 0.967565103968458630, 0.967577733848576260, 0.967590361309749400, 0.967602986351946640, -0.967615608975136430, 0.967628229179287150, 0.967640846964367360, 0.967653462330345440, 0.967666075277189730, 0.967678685804869270, 0.967691293913351740, 0.967703899602605940, -0.967716502872600470, 0.967729103723303790, 0.967741702154684250, 0.967754298166710550, 0.967766891759351270, 0.967779482932574540, 0.967792071686349060, 0.967804658020643420, -0.967817241935426180, 0.967829823430665810, 0.967842402506330910, 0.967854979162389940, 0.967867553398811810, 0.967880125215564550, 0.967892694612616960, 0.967905261589937730, -0.967917826147495220, 0.967930388285258240, 0.967942948003195250, 0.967955505301274830, 0.967968060179465910, 0.967980612637736600, 0.967993162676055840, 0.968005710294392090, -0.968018255492714140, 0.968030798270990480, 0.968043338629189900, 0.968055876567281090, 0.968068412085232530, 0.968080945183012800, 0.968093475860590800, 0.968106004117935020, -0.968118529955014240, 0.968131053371797170, 0.968143574368252490, 0.968156092944349010, 0.968168609100055200, 0.968181122835339750, 0.968193634150171570, 0.968206143044519240, -0.968218649518351680, 0.968231153571637360, 0.968243655204345190, 0.968256154416444190, 0.968268651207902510, 0.968281145578689160, 0.968293637528772950, 0.968306127058122690, -0.968318614166707170, 0.968331098854495090, 0.968343581121455350, 0.968356060967556550, 0.968368538392767600, 0.968381013397057290, 0.968393485980394430, 0.968405956142747940, -0.968418423884086500, 0.968430889204378920, 0.968443352103594450, 0.968455812581701330, 0.968468270638668690, 0.968480726274465460, 0.968493179489060330, 0.968505630282422200, -0.968518078654520000, 0.968530524605322960, 0.968542968134799230, 0.968555409242918160, 0.968567847929648560, 0.968580284194959340, 0.968592718038819410, 0.968605149461197690, -0.968617578462063090, 0.968630005041384750, 0.968642429199131240, 0.968654850935271590, 0.968667270249774840, 0.968679687142609880, 0.968692101613745750, 0.968704513663151360, -0.968716923290795620, 0.968729330496647890, 0.968741735280676530, 0.968754137642850900, 0.968766537583139910, 0.968778935101512580, 0.968791330197937840, 0.968803722872384920, -0.968816113124822740, 0.968828500955220220, 0.968840886363546370, 0.968853269349770230, 0.968865649913861040, 0.968878028055787710, 0.968890403775519270, 0.968902777073024860, -0.968915147948273600, 0.968927516401234420, 0.968939882431876340, 0.968952246040168610, 0.968964607226080240, 0.968976965989580390, 0.968989322330638060, 0.969001676249222510, -0.969014027745302870, 0.969026376818848070, 0.969038723469827220, 0.969051067698209700, 0.969063409503964410, 0.969075748887060610, 0.969088085847467420, 0.969100420385154200, -0.969112752500089770, 0.969125082192243470, 0.969137409461584440, 0.969149734308081930, 0.969162056731705080, 0.969174376732423020, 0.969186694310205100, 0.969199009465020580, -0.969211322196838370, 0.969223632505627820, 0.969235940391358190, 0.969248245853998820, 0.969260548893518650, 0.969272849509887240, 0.969285147703073950, 0.969297443473047470, -0.969309736819777390, 0.969322027743233060, 0.969334316243383620, 0.969346602320198310, 0.969358885973646610, 0.969371167203697650, 0.969383446010321000, 0.969395722393485480, -0.969407996353160660, 0.969420267889315900, 0.969432537001920450, 0.969444803690943660, 0.969457067956354780, 0.969469329798123390, 0.969481589216218740, 0.969493846210609970, -0.969506100781266640, 0.969518352928157910, 0.969530602651253460, 0.969542849950522420, 0.969555094825934270, 0.969567337277458590, 0.969579577305064280, 0.969591814908721150, -0.969604050088398450, 0.969616282844065650, 0.969628513175692100, 0.969640741083247270, 0.969652966566700520, 0.969665189626021660, 0.969677410261179600, 0.969689628472144020, -0.969701844258884280, 0.969714057621370080, 0.969726268559570670, 0.969738477073455510, 0.969750683162994510, 0.969762886828156480, 0.969775088068911330, 0.969787286885228420, -0.969799483277077210, 0.969811677244427410, 0.969823868787248360, 0.969836057905509640, 0.969848244599180950, 0.969860428868231540, 0.969872610712630980, 0.969884790132348850, -0.969896967127354850, 0.969909141697618440, 0.969921313843109090, 0.969933483563796490, 0.969945650859650340, 0.969957815730639990, 0.969969978176735030, 0.969982138197905130, -0.969994295794119780, 0.970006450965348770, 0.970018603711561680, 0.970030754032728320, 0.970042901928817700, 0.970055047399799970, 0.970067190445644600, 0.970079331066321160, -0.970091469261799570, 0.970103605032049180, 0.970115738377039790, 0.970127869296741220, 0.970139997791122920, 0.970152123860154480, 0.970164247503805810, 0.970176368722046490, -0.970188487514846210, 0.970200603882174770, 0.970212717824001760, 0.970224829340297190, 0.970236938431030430, 0.970249045096171270, 0.970261149335689410, 0.970273251149554760, -0.970285350537737010, 0.970297447500205750, 0.970309542036931210, 0.970321634147882640, 0.970333723833029850, 0.970345811092342860, 0.970357895925791250, 0.970369978333344930, -0.970382058314973710, 0.970394135870647380, 0.970406211000335750, 0.970418283704008510, 0.970430353981635570, 0.970442421833186740, 0.970454487258631810, 0.970466550257940710, -0.970478610831083220, 0.970490668978029380, 0.970502724698748650, 0.970514777993211180, 0.970526828861386750, 0.970538877303245170, 0.970550923318756480, 0.970562966907890460, -0.970575008070617030, 0.970587046806906220, 0.970599083116727710, 0.970611117000051430, 0.970623148456847270, 0.970635177487085390, 0.970647204090735460, 0.970659228267767630, -0.970671250018151580, 0.970683269341857780, 0.970695286238855480, 0.970707300709114930, 0.970719312752606260, 0.970731322369299270, 0.970743329559163870, 0.970755334322170200, -0.970767336658288520, 0.970779336567488160, 0.970791334049739500, 0.970803329105012550, 0.970815321733277230, 0.970827311934503560, 0.970839299708661670, 0.970851285055721490, -0.970863267975653370, 0.970875248468426880, 0.970887226534012160, 0.970899202172379460, 0.970911175383498690, 0.970923146167340100, 0.970935114523873600, 0.970947080453069210, -0.970959043954897410, 0.970971005029327760, 0.970982963676330630, 0.970994919895876160, 0.971006873687934260, 0.971018825052475280, 0.971030773989469130, 0.971042720498886400, -0.971054664580696560, 0.971066606234870070, 0.971078545461377060, 0.971090482260187680, 0.971102416631272170, 0.971114348574600550, 0.971126278090143070, 0.971138205177870080, -0.971150129837751400, 0.971162052069757360, 0.971173971873858230, 0.971185889250024140, 0.971197804198225320, 0.971209716718432040, 0.971221626810614640, 0.971233534474743030, -0.971245439710787470, 0.971257342518718430, 0.971269242898506020, 0.971281140850120410, 0.971293036373532040, 0.971304929468711050, 0.971316820135627920, 0.971328708374252560, -0.971340594184555430, 0.971352477566506780, 0.971364358520076960, 0.971376237045236230, 0.971388113141954950, 0.971399986810203340, 0.971411858049952000, 0.971423726861170730, -0.971435593243830220, 0.971447457197900710, 0.971459318723352560, 0.971471177820156130, 0.971483034488281770, 0.971494888727700070, 0.971506740538380820, 0.971518589920294830, -0.971530436873412230, 0.971542281397703710, 0.971554123493139300, 0.971565963159689680, 0.971577800397325220, 0.971589635206016380, 0.971601467585733290, 0.971613297536446430, -0.971625125058126480, 0.971636950150743580, 0.971648772814268420, 0.971660593048671250, 0.971672410853922640, 0.971684226229993180, 0.971696039176852990, 0.971707849694472660, -0.971719657782822770, 0.971731463441873670, 0.971743266671595940, 0.971755067471959940, 0.971766865842936590, 0.971778661784495900, 0.971790455296608460, 0.971802246379244950, -0.971814035032375840, 0.971825821255971610, 0.971837605050002720, 0.971849386414439960, 0.971861165349253930, 0.971872941854414750, 0.971884715929893230, 0.971896487575659940, -0.971908256791685350, 0.971920023577940160, 0.971931787934394940, 0.971943549861020380, 0.971955309357786850, 0.971967066424665020, 0.971978821061625480, 0.971990573268638910, -0.972002323045675910, 0.972014070392707040, 0.972025815309703110, 0.972037557796634810, 0.972049297853472380, 0.972061035480186630, 0.972072770676748470, 0.972084503443128240, -0.972096233779296770, 0.972107961685224730, 0.972119687160882820, 0.972131410206241940, 0.972143130821272240, 0.972154849005944730, 0.972166564760230110, 0.972178278084099070, -0.972189988977522400, 0.972201697440470690, 0.972213403472914960, 0.972225107074825570, 0.972236808246173310, 0.972248506986929110, 0.972260203297063530, 0.972271897176547610, -0.972283588625351800, 0.972295277643447140, 0.972306964230804430, 0.972318648387394120, 0.972330330113187150, 0.972342009408154410, 0.972353686272266590, 0.972365360705494510, -0.972377032707809170, 0.972388702279181170, 0.972400369419581630, 0.972412034128980920, 0.972423696407350160, 0.972435356254660150, 0.972447013670881820, 0.972458668655985850, -0.972470321209943260, 0.972481971332725070, 0.972493619024301760, 0.972505264284644460, 0.972516907113723960, 0.972528547511511080, 0.972540185477976940, 0.972551821013092340, -0.972563454116828210, 0.972575084789155550, 0.972586713030045070, 0.972598338839467670, 0.972609962217394600, 0.972621583163796540, 0.972633201678644530, 0.972644817761909470, -0.972656431413562620, 0.972668042633574540, 0.972679651421916260, 0.972691257778558920, 0.972702861703473310, 0.972714463196630690, 0.972726062258001840, 0.972737658887557810, -0.972749253085269940, 0.972760844851108700, 0.972772434185045330, 0.972784021087050870, 0.972795605557096320, 0.972807187595152830, 0.972818767201191310, 0.972830344375182900, -0.972841919117098830, 0.972853491426909800, 0.972865061304586940, 0.972876628750101500, 0.972888193763424500, 0.972899756344526970, 0.972911316493380140, 0.972922874209955160, -0.972934429494222710, 0.972945982346154260, 0.972957532765720940, 0.972969080752893680, 0.972980626307643700, 0.972992169429942270, 0.973003710119760280, 0.973015248377069320, -0.973026784201839970, 0.973038317594043690, 0.973049848553651620, 0.973061377080635000, 0.973072903174964860, 0.973084426836612450, 0.973095948065549000, 0.973107466861745870, -0.973118983225173870, 0.973130497155804460, 0.973142008653608670, 0.973153517718557960, 0.973165024350623460, 0.973176528549776430, 0.973188030315988220, 0.973199529649229730, -0.973211026549472450, 0.973222521016687600, 0.973234013050846450, 0.973245502651920340, 0.973256989819880400, 0.973268474554697890, 0.973279956856344500, 0.973291436724791010, -0.973302914160008910, 0.973314389161969550, 0.973325861730644280, 0.973337331866004240, 0.973348799568020890, 0.973360264836665820, 0.973371727671909830, 0.973383188073724480, -0.973394646042081260, 0.973406101576951290, 0.973417554678306150, 0.973429005346117200, 0.973440453580355580, 0.973451899380993190, 0.973463342748000730, 0.973474783681349990, -0.973486222181012220, 0.973497658246958890, 0.973509091879161460, 0.973520523077591290, 0.973531951842219860, 0.973543378173018730, 0.973554802069958920, 0.973566223533012030, -0.973577642562149740, 0.973589059157343280, 0.973600473318564140, 0.973611885045783780, 0.973623294338973990, 0.973634701198105800, 0.973646105623150790, 0.973657507614080540, -0.973668907170866520, 0.973680304293480180, 0.973691698981893120, 0.973703091236076790, 0.973714481056003000, 0.973725868441642770, 0.973737253392967790, 0.973748635909949760, -0.973760015992560120, 0.973771393640770480, 0.973782768854552390, 0.973794141633877450, 0.973805511978717010, 0.973816879889042860, 0.973828245364826480, 0.973839608406039450, -0.973850969012653440, 0.973862327184639940, 0.973873682921970630, 0.973885036224617420, 0.973896387092551330, 0.973907735525744280, 0.973919081524167840, 0.973930425087793820, -0.973941766216593670, 0.973953104910539100, 0.973964441169601790, 0.973975774993753540, 0.973987106382965710, 0.973998435337210090, 0.974009761856458380, 0.974021085940682260, -0.974032407589853430, 0.974043726803943580, 0.974055043582924610, 0.974066357926767770, 0.974077669835445080, 0.974088979308928240, 0.974100286347189040, 0.974111590950198950, -0.974122893117929990, 0.974134192850353740, 0.974145490147442230, 0.974156785009166910, 0.974168077435499490, 0.974179367426411870, 0.974190654981875850, 0.974201940101863230, -0.974213222786345810, 0.974224503035295290, 0.974235780848683670, 0.974247056226482440, 0.974258329168663510, 0.974269599675198770, 0.974280867746060040, 0.974292133381219230, -0.974303396580648020, 0.974314657344318550, 0.974325915672202170, 0.974337171564271020, 0.974348425020496900, 0.974359676040851830, 0.974370924625307500, 0.974382170773835930, -0.974393414486408820, 0.974404655762998400, 0.974415894603576250, 0.974427131008114290, 0.974438364976584430, 0.974449596508958790, 0.974460825605209080, 0.974472052265307310, -0.974483276489225610, 0.974494498276935570, 0.974505717628409210, 0.974516934543618650, 0.974528149022535710, 0.974539361065132390, 0.974550570671380620, 0.974561777841252530, -0.974572982574720030, 0.974584184871755020, 0.974595384732329540, 0.974606582156415490, 0.974617777143985120, 0.974628969695010230, 0.974640159809462950, 0.974651347487315300, -0.974662532728539420, 0.974673715533107000, 0.974684895900990280, 0.974696073832161390, 0.974707249326592250, 0.974718422384255100, 0.974729593005121740, 0.974740761189164750, -0.974751926936355590, 0.974763090246666520, 0.974774251120069880, 0.974785409556537470, 0.974796565556041660, 0.974807719118554350, 0.974818870244047790, 0.974830018932494210, -0.974841165183865430, 0.974852308998133800, 0.974863450375271330, 0.974874589315250170, 0.974885725818042560, 0.974896859883620740, 0.974907991511956730, 0.974919120703022890, -0.974930247456791020, 0.974941371773233590, 0.974952493652322730, 0.974963613094030680, 0.974974730098329470, 0.974985844665191560, 0.974996956794589200, 0.975008066486494180, -0.975019173740879100, 0.975030278557716070, 0.975041380936977230, 0.975052480878635050, 0.975063578382661670, 0.975074673449029320, 0.975085766077710470, 0.975096856268677040, -0.975107944021901480, 0.975119029337355950, 0.975130112215013000, 0.975141192654844670, 0.975152270656823420, 0.975163346220921600, 0.975174419347111240, 0.975185490035364920, -0.975196558285654770, 0.975207624097953360, 0.975218687472232730, 0.975229748408465550, 0.975240806906623850, 0.975251862966680430, 0.975262916588607090, 0.975273967772376520, -0.975285016517960960, 0.975296062825332880, 0.975307106694464630, 0.975318148125328690, 0.975329187117897290, 0.975340223672143130, 0.975351257788038330, 0.975362289465555250, -0.975373318704666480, 0.975384345505344470, 0.975395369867561590, 0.975406391791290180, 0.975417411276503050, 0.975428428323172230, 0.975439442931270380, 0.975450455100769780, -0.975461464831643200, 0.975472472123862900, 0.975483476977401340, 0.975494479392231220, 0.975505479368324990, 0.975516476905654910, 0.975527472004193650, 0.975538464663913700, -0.975549454884787500, 0.975560442666787760, 0.975571428009886940, 0.975582410914057510, 0.975593391379272260, 0.975604369405503320, 0.975615344992723400, 0.975626318140905170, -0.975637288850021210, 0.975648257120043990, 0.975659222950946090, 0.975670186342700310, 0.975681147295278990, 0.975692105808654620, 0.975703061882800090, 0.975714015517687990, -0.975724966713290790, 0.975735915469581050, 0.975746861786531690, 0.975757805664115300, 0.975768747102304210, 0.975779686101071240, 0.975790622660389070, 0.975801556780230280, -0.975812488460567670, 0.975823417701373820, 0.975834344502621630, 0.975845268864283360, 0.975856190786331900, 0.975867110268740070, 0.975878027311480320, 0.975888941914525580, -0.975899854077848520, 0.975910763801421830, 0.975921671085218320, 0.975932575929210570, 0.975943478333371250, 0.975954378297673290, 0.975965275822089470, 0.975976170906592390, -0.975987063551154830, 0.975997953755749600, 0.976008841520349830, 0.976019726844927660, 0.976030609729456210, 0.976041490173908180, 0.976052368178256470, 0.976063243742473770, -0.976074116866533000, 0.976084987550407180, 0.976095855794068660, 0.976106721597490570, 0.976117584960645600, 0.976128445883506670, 0.976139304366046570, 0.976150160408238320, -0.976161014010054620, 0.976171865171468590, 0.976182713892452700, 0.976193560172980090, 0.976204404013023440, 0.976215245412555890, 0.976226084371550230, 0.976236920889979260, -0.976247754967816020, 0.976258586605033620, 0.976269415801604650, 0.976280242557502010, 0.976291066872698840, 0.976301888747167950, 0.976312708180882340, 0.976323525173814930, -0.976334339725938970, 0.976345151837226920, 0.976355961507652030, 0.976366768737187200, 0.976377573525805560, 0.976388375873479820, 0.976399175780183200, 0.976409973245888740, -0.976420768270569450, 0.976431560854198020, 0.976442350996747700, 0.976453138698191610, 0.976463923958502570, 0.976474706777653690, 0.976485487155618110, 0.976496265092368980, -0.976507040587879070, 0.976517813642121420, 0.976528584255069390, 0.976539352426695760, 0.976550118156973790, 0.976560881445876610, 0.976571642293377120, 0.976582400699448790, -0.976593156664064210, 0.976603910187196830, 0.976614661268819570, 0.976625409908905670, 0.976636156107428270, 0.976646899864360480, 0.976657641179675460, 0.976668380053346550, -0.976679116485346440, 0.976689850475648600, 0.976700582024226050, 0.976711311131052140, 0.976722037796099900, 0.976732762019342560, 0.976743483800753490, 0.976754203140305590, -0.976764920037972110, 0.976775634493726400, 0.976786346507541480, 0.976797056079390820, 0.976807763209247450, 0.976818467897084710, 0.976829170142875960, 0.976839869946594110, -0.976850567308212630, 0.976861262227704750, 0.976871954705043620, 0.976882644740202700, 0.976893332333155010, 0.976904017483874340, 0.976914700192333400, 0.976925380458505630, -0.976936058282364520, 0.976946733663883180, 0.976957406603035090, 0.976968077099793390, 0.976978745154131520, 0.976989410766023080, 0.977000073935440750, 0.977010734662358330, -0.977021392946749060, 0.977032048788586400, 0.977042702187843500, 0.977053353144493930, 0.977064001658510930, 0.977074647729868070, 0.977085291358538500, 0.977095932544495670, -0.977106571287712940, 0.977117207588163780, 0.977127841445821650, 0.977138472860660020, 0.977149101832652240, 0.977159728361771560, 0.977170352447991550, 0.977180974091285790, -0.977191593291627410, 0.977202210048990110, 0.977212824363347330, 0.977223436234672450, 0.977234045662939250, 0.977244652648120660, 0.977255257190190460, 0.977265859289122130, -0.977276458944889130, 0.977287056157464920, 0.977297650926823190, 0.977308243252937300, 0.977318833135780940, 0.977329420575327350, 0.977340005571550210, 0.977350588124422990, -0.977361168233919390, 0.977371745900012860, 0.977382321122676980, 0.977392893901885440, 0.977403464237611490, 0.977414032129828800, 0.977424597578511190, 0.977435160583632000, -0.977445721145164930, 0.977456279263083540, 0.977466834937361420, 0.977477388167972470, 0.977487938954889830, 0.977498487298087300, 0.977509033197538570, 0.977519576653217310, -0.977530117665097120, 0.977540656233151560, 0.977551192357354550, 0.977561726037679430, 0.977572257274100020, 0.977582786066589880, 0.977593312415122820, 0.977603836319672510, -0.977614357780212550, 0.977624876796716720, 0.977635393369158830, 0.977645907497512350, 0.977656419181751060, 0.977666928421848770, 0.977677435217779170, 0.977687939569515940, -0.977698441477032780, 0.977708940940303580, 0.977719437959302270, 0.977729932534002200, 0.977740424664377160, 0.977750914350401180, 0.977761401592047830, 0.977771886389291020, -0.977782368742104560, 0.977792848650462230, 0.977803326114337730, 0.977813801133704860, 0.977824273708537420, 0.977834743838809420, 0.977845211524494440, 0.977855676765566510, -0.977866139561999410, 0.977876599913767080, 0.977887057820843060, 0.977897513283201400, 0.977907966300816000, 0.977918416873660660, 0.977928865001709280, 0.977939310684935780, -0.977949753923313960, 0.977960194716817940, 0.977970633065421200, 0.977981068969097980, 0.977991502427822070, 0.978001933441567380, 0.978012362010307830, 0.978022788134017330, -0.978033211812670110, 0.978043633046239760, 0.978054051834700180, 0.978064468178025610, 0.978074882076189760, 0.978085293529166730, 0.978095702536930460, 0.978106109099454950, -0.978116513216714440, 0.978126914888682310, 0.978137314115333000, 0.978147710896640320, 0.978158105232578400, 0.978168497123121260, 0.978178886568242810, 0.978189273567917410, -0.978199658122118620, 0.978210040230820590, 0.978220419893997550, 0.978230797111623530, 0.978241171883672320, 0.978251544210118400, 0.978261914090935440, 0.978272281526098020, -0.978282646515579610, 0.978293009059354570, 0.978303369157397130, 0.978313726809681090, 0.978324082016180930, 0.978334434776870430, 0.978344785091723850, 0.978355132960715520, -0.978365478383819260, 0.978375821361009200, 0.978386161892259580, 0.978396499977544630, 0.978406835616838390, 0.978417168810115090, 0.978427499557348980, 0.978437827858513960, -0.978448153713584400, 0.978458477122534420, 0.978468798085338260, 0.978479116601970180, 0.978489432672404290, 0.978499746296614740, 0.978510057474576090, 0.978520366206262040, -0.978530672491647050, 0.978540976330705470, 0.978551277723411440, 0.978561576669739200, 0.978571873169662990, 0.978582167223157050, 0.978592458830195970, 0.978602747990753530, -0.978613034704804210, 0.978623318972322350, 0.978633600793282210, 0.978643880167658020, 0.978654157095424030, 0.978664431576555030, 0.978674703611024600, 0.978684973198807540, -0.978695240339877980, 0.978705505034210280, 0.978715767281778890, 0.978726027082558070, 0.978736284436522160, 0.978746539343645750, 0.978756791803902740, 0.978767041817267810, -0.978777289383715220, 0.978787534503219540, 0.978797777175754890, 0.978808017401295860, 0.978818255179817020, 0.978828490511292280, 0.978838723395696330, 0.978848953833003520, -0.978859181823188430, 0.978869407366225300, 0.978879630462088700, 0.978889851110753000, 0.978900069312192870, 0.978910285066382340, 0.978920498373296200, 0.978930709232908700, -0.978940917645194530, 0.978951123610128040, 0.978961327127683690, 0.978971528197836060, 0.978981726820559730, 0.978991922995828930, 0.979002116723618370, 0.979012308003902490, -0.979022496836655880, 0.979032683221853000, 0.979042867159468420, 0.979053048649476840, 0.979063227691852500, 0.979073404286569970, 0.979083578433604050, 0.979093750132929100, -0.979103919384519910, 0.979114086188350830, 0.979124250544396450, 0.979134412452631770, 0.979144571913030840, 0.979154728925568430, 0.979164883490219240, 0.979175035606957840, -0.979185185275758820, 0.979195332496596850, 0.979205477269446620, 0.979215619594282830, 0.979225759471079700, 0.979235896899812270, 0.979246031880455110, 0.979256164412982910, -0.979266294497370240, 0.979276422133591900, 0.979286547321622570, 0.979296670061436720, 0.979306790353009270, 0.979316908196314780, 0.979327023591328060, 0.979337136538023790, -0.979347247036376660, 0.979357355086361350, 0.979367460687952880, 0.979377563841125620, 0.979387664545854350, 0.979397762802113990, 0.979407858609879220, 0.979417951969124840, -0.979428042879825540, 0.979438131341956340, 0.979448217355491590, 0.979458300920406310, 0.979468382036675300, 0.979478460704273360, 0.979488536923175170, 0.979498610693355750, -0.979508682014789690, 0.979518750887452220, 0.979528817311317580, 0.979538881286361020, 0.979548942812557220, 0.979559001889880990, 0.979569058518307330, 0.979579112697810950, -0.979589164428366850, 0.979599213709950070, 0.979609260542534940, 0.979619304926096720, 0.979629346860610320, 0.979639386346050410, 0.979649423382392140, 0.979659457969610290, -0.979669490107680010, 0.979679519796575750, 0.979689547036272760, 0.979699571826745830, 0.979709594167969990, 0.979719614059920140, 0.979729631502571310, 0.979739646495898400, -0.979749659039876540, 0.979759669134480320, 0.979769676779684960, 0.979779681975465500, 0.979789684721796730, 0.979799685018653780, 0.979809682866011560, 0.979819678263845310, -0.979829671212129830, 0.979839661710840030, 0.979849649759951150, 0.979859635359438100, 0.979869618509276010, 0.979879599209439790, 0.979889577459904680, 0.979899553260645710, -0.979909526611637660, 0.979919497512855900, 0.979929465964275330, 0.979939431965871190, 0.979949395517618390, 0.979959356619492070, 0.979969315271467360, 0.979979271473519600, -0.979989225225623480, 0.979999176527754260, 0.980009125379887160, 0.980019071781997210, 0.980029015734059540, 0.980038957236049390, 0.980048896287942010, 0.980058832889712180, -0.980068767041335280, 0.980078698742786520, 0.980088627994040950, 0.980098554795073800, 0.980108479145860300, 0.980118401046375600, 0.980128320496595040, 0.980138237496493540, -0.980148152046046440, 0.980158064145228990, 0.980167973794016320, 0.980177880992383790, 0.980187785740306520, 0.980197688037759750, 0.980207587884718960, 0.980217485281159040, -0.980227380227055470, 0.980237272722383370, 0.980247162767118100, 0.980257050361234890, 0.980266935504709110, 0.980276818197516110, 0.980286698439630900, 0.980296576231028950, -0.980306451571685610, 0.980316324461576130, 0.980326194900675850, 0.980336062888960020, 0.980345928426404110, 0.980355791512983470, 0.980365652148673220, 0.980375510333448830, -0.980385366067285660, 0.980395219350159050, 0.980405070182044480, 0.980414918562917180, 0.980424764492752730, 0.980434607971526260, 0.980444448999213240, 0.980454287575789120, -0.980464123701229260, 0.980473957375509020, 0.980483788598603970, 0.980493617370489460, 0.980503443691141060, 0.980513267560533810, 0.980523088978643490, 0.980532907945445450, -0.980542724460915060, 0.980552538525027880, 0.980562350137759390, 0.980572159299085030, 0.980581966008980400, 0.980591770267420730, 0.980601572074381590, 0.980611371429838560, -0.980621168333767110, 0.980630962786142700, 0.980640754786940900, 0.980650544336137410, 0.980660331433707340, 0.980670116079626510, 0.980679898273870370, 0.980689678016414380, -0.980699455307234350, 0.980709230146305620, 0.980719002533603780, 0.980728772469104610, 0.980738539952783370, 0.980748304984615740, 0.980758067564577400, 0.980767827692643810, -0.980777585368790780, 0.980787340592993660, 0.980797093365228250, 0.980806843685470330, 0.980816591553695050, 0.980826336969878310, 0.980836079933995690, 0.980845820446022980, -0.980855558505935640, 0.980865294113709370, 0.980875027269320080, 0.980884757972743100, 0.980894486223954140, 0.980904212022928990, 0.980913935369643330, 0.980923656264072850, -0.980933374706193240, 0.980943090695980180, 0.980952804233409580, 0.980962515318456680, 0.980972223951097620, 0.980981930131307970, 0.980991633859063520, 0.981001335134339850, -0.981011033957112980, 0.981020730327358700, 0.981030424245052380, 0.981040115710170020, 0.981049804722687320, 0.981059491282580080, 0.981069175389824190, 0.981078857044395350, -0.981088536246269350, 0.981098212995422210, 0.981107887291829410, 0.981117559135466830, 0.981127228526310290, 0.981136895464335800, 0.981146559949519050, 0.981156221981835830, -0.981165881561262050, 0.981175538687773850, 0.981185193361346570, 0.981194845581956240, 0.981204495349578880, 0.981214142664190270, 0.981223787525766330, 0.981233429934282860, -0.981243069889715990, 0.981252707392041290, 0.981262342441234890, 0.981271975037272480, 0.981281605180130300, 0.981291232869784040, 0.981300858106209710, 0.981310480889383220, -0.981320101219280700, 0.981329719095877740, 0.981339334519150450, 0.981348947489074860, 0.981358558005626990, 0.981368166068782630, 0.981377771678517810, 0.981387374834808650, -0.981396975537631170, 0.981406573786961170, 0.981416169582774670, 0.981425762925047680, 0.981435353813756460, 0.981444942248876680, 0.981454528230384590, 0.981464111758256430, -0.981473692832467770, 0.981483271452994850, 0.981492847619813810, 0.981502421332900670, 0.981511992592231320, 0.981521561397782130, 0.981531127749529000, 0.981540691647448280, -0.981550253091515560, 0.981559812081707280, 0.981569368617999370, 0.981578922700368170, 0.981588474328789600, 0.981598023503239880, 0.981607570223695160, 0.981617114490131450, -0.981626656302524990, 0.981636195660851810, 0.981645732565088140, 0.981655267015210220, 0.981664799011194080, 0.981674328553015840, 0.981683855640652080, 0.981693380274078490, -0.981702902453271410, 0.981712422178207090, 0.981721939448861770, 0.981731454265211580, 0.981740966627232760, 0.981750476534901440, 0.981759983988194200, 0.981769488987086710, -0.981778991531555680, 0.981788491621577000, 0.981797989257127130, 0.981807484438182330, 0.981816977164718830, 0.981826467436713090, 0.981835955254140910, 0.981845440616978870, -0.981854923525203320, 0.981864403978790380, 0.981873881977716410, 0.981883357521957770, 0.981892830611490690, 0.981902301246291740, 0.981911769426336840, 0.981921235151602570, -0.981930698422065260, 0.981940159237701060, 0.981949617598486530, 0.981959073504398040, 0.981968526955411810, 0.981977977951504430, 0.981987426492651920, 0.981996872578830840, -0.982006316210017550, 0.982015757386188510, 0.982025196107320090, 0.982034632373388620, 0.982044066184370790, 0.982053497540242630, 0.982062926440980700, 0.982072352886561470, -0.982081776876961410, 0.982091198412156750, 0.982100617492124290, 0.982110034116840170, 0.982119448286281170, 0.982128860000423320, 0.982138269259243410, 0.982147676062717800, -0.982157080410822950, 0.982166482303535430, 0.982175881740831700, 0.982185278722688460, 0.982194673249081830, 0.982204065319988610, 0.982213454935385140, 0.982222842095248020, -0.982232226799553800, 0.982241609048279060, 0.982250988841400270, 0.982260366178894120, 0.982269741060736950, 0.982279113486905440, 0.982288483457376180, 0.982297850972125630, -0.982307216031130470, 0.982316578634367280, 0.982325938781812620, 0.982335296473443310, 0.982344651709235570, 0.982354004489166210, 0.982363354813211910, 0.982372702681349130, -0.982382048093554670, 0.982391391049805000, 0.982400731550077120, 0.982410069594347180, 0.982419405182592080, 0.982428738314788390, 0.982438068990913020, 0.982447397210942320, -0.982456722974853200, 0.982466046282622240, 0.982475367134226450, 0.982484685529641970, 0.982494001468845800, 0.982503314951814530, 0.982512625978525070, 0.982521934548954090, -0.982531240663078180, 0.982540544320874450, 0.982549845522319050, 0.982559144267389110, 0.982568440556061300, 0.982577734388312420, 0.982587025764119160, 0.982596314683458430, -0.982605601146306800, 0.982614885152641390, 0.982624166702438570, 0.982633445795675350, 0.982642722432328530, 0.982651996612374900, 0.982661268335791260, 0.982670537602554410, -0.982679804412641240, 0.982689068766028790, 0.982698330662693520, 0.982707590102612330, 0.982716847085762240, 0.982726101612119930, 0.982735353681662430, 0.982744603294366530, -0.982753850450209350, 0.982763095149167380, 0.982772337391217610, 0.982781577176336960, 0.982790814504502450, 0.982800049375690880, 0.982809281789879140, 0.982818511747044270, -0.982827739247163270, 0.982836964290212720, 0.982846186876169760, 0.982855407005011390, 0.982864624676714540, 0.982873839891255980, 0.982883052648612980, 0.982892262948762200, -0.982901470791681000, 0.982910676177345950, 0.982919879105734200, 0.982929079576822740, 0.982938277590588600, 0.982947473147008810, 0.982956666246060370, 0.982965856887720310, -0.982975045071965540, 0.982984230798773060, 0.982993414068120130, 0.983002594879983540, 0.983011773234340520, 0.983020949131168110, 0.983030122570443200, 0.983039293552143260, -0.983048462076244860, 0.983057628142725350, 0.983066791751561750, 0.983075952902731200, 0.983085111596210700, 0.983094267831977510, 0.983103421610008740, 0.983112572930281310, -0.983121721792772460, 0.983130868197459210, 0.983140012144318900, 0.983149153633328550, 0.983158292664465190, 0.983167429237706280, 0.983176563353028830, 0.983185695010409870, -0.983194824209826620, 0.983203950951256340, 0.983213075234676160, 0.983222197060063310, 0.983231316427395030, 0.983240433336648350, 0.983249547787800830, 0.983258659780829270, -0.983267769315711030, 0.983276876392423340, 0.983285981010943550, 0.983295083171248700, 0.983304182873316220, 0.983313280117123380, 0.983322374902647290, 0.983331467229865200, -0.983340557098754340, 0.983349644509292190, 0.983358729461455970, 0.983367811955222940, 0.983376891990570320, 0.983385969567475590, 0.983395044685915760, 0.983404117345868410, -0.983413187547310770, 0.983422255290220090, 0.983431320574573830, 0.983440383400349230, 0.983449443767523750, 0.983458501676074740, 0.983467557125979330, 0.983476610117214990, -0.983485660649759170, 0.983494708723589240, 0.983503754338682530, 0.983512797495016410, 0.983521838192568440, 0.983530876431315650, 0.983539912211235820, 0.983548945532306100, -0.983557976394504040, 0.983567004797807010, 0.983576030742192580, 0.983585054227637980, 0.983594075254120900, 0.983603093821618480, 0.983612109930108390, 0.983621123579567990, -0.983630134769974740, 0.983639143501306210, 0.983648149773539760, 0.983657153586653180, 0.983666154940623480, 0.983675153835428470, 0.983684150271045500, 0.983693144247452130, -0.983702135764626060, 0.983711124822544520, 0.983720111421185210, 0.983729095560525680, 0.983738077240543410, 0.983747056461215850, 0.983756033222520700, 0.983765007524435410, -0.983773979366937670, 0.983782948750004940, 0.983791915673614790, 0.983800880137745140, 0.983809842142372990, 0.983818801687476370, 0.983827758773032630, 0.983836713399019570, -0.983845665565414640, 0.983854615272195640, 0.983863562519340260, 0.983872507306825740, 0.983881449634629980, 0.983890389502730670, 0.983899326911105270, 0.983908261859731570, -0.983917194348587270, 0.983926124377650040, 0.983935051946897570, 0.983943977056307320, 0.983952899705857090, 0.983961819895524670, 0.983970737625287750, 0.983979652895123900, -0.983988565705010920, 0.983997476054926600, 0.984006383944848630, 0.984015289374754690, 0.984024192344622460, 0.984033092854429750, 0.984041990904154230, 0.984050886493773810, -0.984059779623266180, 0.984068670292609250, 0.984077558501780470, 0.984086444250757750, 0.984095327539519000, 0.984104208368041910, 0.984113086736304380, 0.984121962644283980, -0.984130836091958730, 0.984139707079306540, 0.984148575606304980, 0.984157441672931950, 0.984166305279165380, 0.984175166424982930, 0.984184025110362630, 0.984192881335282270, -0.984201735099719870, 0.984210586403652890, 0.984219435247059570, 0.984228281629917600, 0.984237125552204880, 0.984245967013899440, 0.984254806014979060, 0.984263642555421540, -0.984272476635205230, 0.984281308254307490, 0.984290137412706550, 0.984298964110380200, 0.984307788347306480, 0.984316610123463280, 0.984325429438828500, 0.984334246293380180, -0.984343060687096430, 0.984351872619954940, 0.984360682091933610, 0.984369489103010700, 0.984378293653163980, 0.984387095742371600, 0.984395895370611450, 0.984404692537861670, -0.984413487244100050, 0.984422279489304720, 0.984431069273453700, 0.984439856596525000, 0.984448641458496640, 0.984457423859346650, 0.984466203799053140, 0.984474981277594360, -0.984483756294947890, 0.984492528851091950, 0.984501298946004800, 0.984510066579664330, 0.984518831752048800, 0.984527594463136090, 0.984536354712904460, 0.984545112501332030, -0.984553867828396710, 0.984562620694076740, 0.984571371098350130, 0.984580119041195130, 0.984588864522589870, 0.984597607542512470, 0.984606348100941160, 0.984615086197853870, -0.984623821833228830, 0.984632555007044160, 0.984641285719278230, 0.984650013969909030, 0.984658739758914820, 0.984667463086273730, 0.984676183951964210, 0.984684902355963950, -0.984693618298251530, 0.984702331778805060, 0.984711042797602690, 0.984719751354622750, 0.984728457449843500, 0.984737161083243160, 0.984745862254799760, 0.984754560964491770, -0.984763257212297400, 0.984771950998194810, 0.984780642322162450, 0.984789331184178440, 0.984798017584221030, 0.984806701522268790, 0.984815382998299630, 0.984824062012292000, -0.984832738564224260, 0.984841412654074650, 0.984850084281821530, 0.984858753447443110, 0.984867420150917880, 0.984876084392224290, 0.984884746171340250, 0.984893405488244330, -0.984902062342915000, 0.984910716735330480, 0.984919368665469140, 0.984928018133309440, 0.984936665138829710, 0.984945309682008330, 0.984953951762823520, 0.984962591381253970, -0.984971228537277920, 0.984979863230873720, 0.984988495462019940, 0.984997125230694830, 0.985005752536877170, 0.985014377380544870, 0.985022999761676730, 0.985031619680250990, -0.985040237136246330, 0.985048852129640990, 0.985057464660413550, 0.985066074728542460, 0.985074682334006300, 0.985083287476783200, 0.985091890156852060, 0.985100490374191120, -0.985109088128778840, 0.985117683420594030, 0.985126276249614910, 0.985134866615820280, 0.985143454519188280, 0.985152039959697690, 0.985160622937326980, 0.985169203452054720, -0.985177781503859480, 0.985186357092719730, 0.985194930218614150, 0.985203500881521420, 0.985212069081419670, 0.985220634818287810, 0.985229198092104410, 0.985237758902847930, -0.985246317250497160, 0.985254873135030460, 0.985263426556426850, 0.985271977514664440, 0.985280526009722160, 0.985289072041578560, 0.985297615610212230, 0.985306156715601840, -0.985314695357726090, 0.985323231536563650, 0.985331765252093210, 0.985340296504293220, 0.985348825293142490, 0.985357351618619810, 0.985365875480703650, 0.985374396879372780, -0.985382915814605910, 0.985391432286381820, 0.985399946294679310, 0.985408457839476730, 0.985416966920752980, 0.985425473538486860, 0.985433977692657060, 0.985442479383242250, -0.985450978610221350, 0.985459475373573150, 0.985467969673275990, 0.985476461509309010, 0.985484950881650890, 0.985493437790280310, 0.985501922235176190, 0.985510404216317190, -0.985518883733682240, 0.985527360787250230, 0.985535835376999740, 0.985544307502909560, 0.985552777164958590, 0.985561244363125750, 0.985569709097389830, 0.985578171367729630, -0.985586631174124040, 0.985595088516551860, 0.985603543394991900, 0.985611995809423050, 0.985620445759824220, 0.985628893246174310, 0.985637338268452120, 0.985645780826636560, -0.985654220920706760, 0.985662658550641280, 0.985671093716419140, 0.985679526418019260, 0.985687956655420530, 0.985696384428601970, 0.985704809737542380, 0.985713232582220880, -0.985721652962616270, 0.985730070878707560, 0.985738486330473560, 0.985746899317893390, 0.985755309840945950, 0.985763717899610260, 0.985772123493865230, 0.985780526623690090, -0.985788927289063420, 0.985797325489964460, 0.985805721226372220, 0.985814114498265730, 0.985822505305623880, 0.985830893648425690, 0.985839279526650400, 0.985847662940277040, -0.985856043889284270, 0.985864422373651460, 0.985872798393357620, 0.985881171948381760, 0.985889543038703020, 0.985897911664300410, 0.985906277825152940, 0.985914641521239980, -0.985923002752540300, 0.985931361519033040, 0.985939717820697450, 0.985948071657512530, 0.985956423029457410, 0.985964771936511220, 0.985973118378653310, 0.985981462355862370, -0.985989803868117850, 0.985998142915398890, 0.986006479497684380, 0.986014813614953800, 0.986023145267186150, 0.986031474454360680, 0.986039801176456620, 0.986048125433452990, -0.986056447225329040, 0.986064766552063880, 0.986073083413636860, 0.986081397810027130, 0.986089709741213900, 0.986098019207176550, 0.986106326207893960, 0.986114630743345600, -0.986122932813510600, 0.986131232418368310, 0.986139529557897960, 0.986147824232078810, 0.986156116440890070, 0.986164406184311230, 0.986172693462321170, 0.986180978274899370, -0.986189260622025170, 0.986197540503677690, 0.986205817919836520, 0.986214092870480790, 0.986222365355589710, 0.986230635375142990, 0.986238902929119420, 0.986247168017498680, -0.986255430640260000, 0.986263690797382740, 0.986271948488846250, 0.986280203714629990, 0.986288456474713190, 0.986296706769075220, 0.986304954597695400, 0.986313199960553330, -0.986321442857628130, 0.986329683288899360, 0.986337921254346380, 0.986346156753948660, 0.986354389787685640, 0.986362620355536460, 0.986370848457480800, 0.986379074093498010, -0.986387297263567440, 0.986395517967668780, 0.986403736205781260, 0.986411951977884340, 0.986420165283957710, 0.986428376123980600, 0.986436584497932480, 0.986444790405792920, -0.986452993847541370, 0.986461194823157310, 0.986469393332620400, 0.986477589375910010, 0.986485782953005490, 0.986493974063886610, 0.986502162708532750, 0.986510348886923460, -0.986518532599038320, 0.986526713844856910, 0.986534892624358670, 0.986543068937523300, 0.986551242784330150, 0.986559414164758900, 0.986567583078789110, 0.986575749526400370, -0.986583913507572240, 0.986592075022284300, 0.986600234070516340, 0.986608390652247700, 0.986616544767458080, 0.986624696416127040, 0.986632845598234280, 0.986640992313759460, -0.986649136562682050, 0.986657278344981850, 0.986665417660638640, 0.986673554509631680, 0.986681688891940860, 0.986689820807545860, 0.986697950256426260, 0.986706077238561740, -0.986714201753932100, 0.986722323802517010, 0.986730443384296160, 0.986738560499249020, 0.986746675147355590, 0.986754787328595450, 0.986762897042948280, 0.986771004290393880, -0.986779109070912040, 0.986787211384482550, 0.986795311231084770, 0.986803408610698820, 0.986811503523304380, 0.986819595968881140, 0.986827685947408880, 0.986835773458867420, -0.986843858503236530, 0.986851941080496230, 0.986860021190625770, 0.986868098833605380, 0.986876174009414740, 0.986884246718033540, 0.986892316959441910, 0.986900384733619300, -0.986908450040545840, 0.986916512880201440, 0.986924573252565550, 0.986932631157618200, 0.986940686595339290, 0.986948739565708720, 0.986956790068706180, 0.986964838104311790, -0.986972883672505350, 0.986980926773266650, 0.986988967406575600, 0.986997005572412100, 0.987005041270756170, 0.987013074501587600, 0.987021105264886290, 0.987029133560632270, -0.987037159388805540, 0.987045182749385690, 0.987053203642353050, 0.987061222067687320, 0.987069238025368500, 0.987077251515376620, 0.987085262537691580, 0.987093271092293610, -0.987101277179162180, 0.987109280798277640, 0.987117281949619900, 0.987125280633168960, 0.987133276848904840, 0.987141270596807560, 0.987149261876857030, 0.987157250689033480, -0.987165237033316710, 0.987173220909686840, 0.987181202318123900, 0.987189181258607880, 0.987197157731119050, 0.987205131735637290, 0.987213103272142620, 0.987221072340615400, -0.987229038941035310, 0.987237003073382690, 0.987244964737637560, 0.987252923933779950, 0.987260880661790070, 0.987268834921647960, 0.987276786713333960, 0.987284736036827870, -0.987292682892109920, 0.987300627279160240, 0.987308569197958950, 0.987316508648486300, 0.987324445630722300, 0.987332380144647300, 0.987340312190241430, 0.987348241767484590, -0.987356168876357240, 0.987364093516839400, 0.987372015688911420, 0.987379935392553310, 0.987387852627745420, 0.987395767394467880, 0.987403679692701040, 0.987411589522424800, -0.987419496883619740, 0.987427401776265870, 0.987435304200343420, 0.987443204155832750, 0.987451101642714100, 0.987458996660967810, 0.987466889210573910, 0.987474779291512840, -0.987482666903764740, 0.987490552047310070, 0.987498434722128950, 0.987506314928201730, 0.987514192665508660, 0.987522067934030410, 0.987529940733746780, 0.987537811064638230, -0.987545678926685210, 0.987553544319867970, 0.987561407244166970, 0.987569267699562330, 0.987577125686034730, 0.987584981203564080, 0.987592834252131070, 0.987600684831716040, -0.987608532942299110, 0.987616378583860980, 0.987624221756381870, 0.987632062459842250, 0.987639900694222580, 0.987647736459502990, 0.987655569755664150, 0.987663400582686310, -0.987671228940549930, 0.987679054829235570, 0.987686878248723480, 0.987694699198994220, 0.987702517680028480, 0.987710333691806160, 0.987718147234308060, 0.987725958307514530, -0.987733766911406240, 0.987741573045963440, 0.987749376711166690, 0.987757177906996690, 0.987764976633433540, 0.987772772890458060, 0.987780566678050590, 0.987788357996191690, -0.987796146844861830, 0.987803933224041700, 0.987811717133711740, 0.987819498573852540, 0.987827277544444550, 0.987835054045468340, 0.987842828076904490, 0.987850599638733560, -0.987858368730936130, 0.987866135353492770, 0.987873899506384270, 0.987881661189590750, 0.987889420403093240, 0.987897177146872090, 0.987904931420908070, 0.987912683225181660, -0.987920432559673540, 0.987928179424364280, 0.987935923819234780, 0.987943665744265400, 0.987951405199436690, 0.987959142184729580, 0.987966876700124620, 0.987974608745602500, -0.987982338321143790, 0.987990065426729290, 0.987997790062339680, 0.988005512227955520, 0.988013231923557500, 0.988020949149126530, 0.988028663904643060, 0.988036376190087990, -0.988044086005442020, 0.988051793350685940, 0.988059498225800190, 0.988067200630765810, 0.988074900565563350, 0.988082598030173620, 0.988090293024577400, 0.988097985548755500, -0.988105675602688580, 0.988113363186357670, 0.988121048299743230, 0.988128730942826050, 0.988136411115587140, 0.988144088818007190, 0.988151764050066990, 0.988159436811747450, -0.988167107103029240, 0.988174774923893380, 0.988182440274320560, 0.988190103154291570, 0.988197763563787300, 0.988205421502788670, 0.988213076971276470, 0.988220729969231600, -0.988228380496634970, 0.988236028553467260, 0.988243674139709590, 0.988251317255342650, 0.988258957900347350, 0.988266596074704800, 0.988274231778395680, 0.988281865011401030, -0.988289495773701730, 0.988297124065278700, 0.988304749886112830, 0.988312373236185040, 0.988319994115476330, 0.988327612523967610, 0.988335228461639900, 0.988342841928474210, -0.988350452924451340, 0.988358061449552410, 0.988365667503758210, 0.988373271087049870, 0.988380872199408290, 0.988388470840814600, 0.988396067011249710, 0.988403660710694850, -0.988411251939130600, 0.988418840696538290, 0.988426426982898840, 0.988434010798193370, 0.988441592142402790, 0.988449171015508330, 0.988456747417490900, 0.988464321348331730, -0.988471892808011620, 0.988479461796511800, 0.988487028313813300, 0.988494592359897230, 0.988502153934744720, 0.988509713038336790, 0.988517269670654790, 0.988524823831679390, -0.988532375521391950, 0.988539924739773590, 0.988547471486805440, 0.988555015762468510, 0.988562557566744160, 0.988570096899613280, 0.988577633761057450, 0.988585168151057350, -0.988592700069594210, 0.988600229516649500, 0.988607756492204110, 0.988615280996239410, 0.988622803028736400, 0.988630322589676420, 0.988637839679040840, 0.988645354296810440, -0.988652866442966680, 0.988660376117490800, 0.988667883320363930, 0.988675388051567290, 0.988682890311082250, 0.988690390098890150, 0.988697887414971890, 0.988705382259309040, -0.988712874631882620, 0.988720364532673980, 0.988727851961664460, 0.988735336918835310, 0.988742819404167860, 0.988750299417643470, 0.988757776959243160, 0.988765252028948490, -0.988772724626740600, 0.988780194752601040, 0.988787662406510840, 0.988795127588451560, 0.988802590298404560, 0.988810050536350960, 0.988817508302272220, 0.988824963596149800, -0.988832416417964930, 0.988839866767698970, 0.988847314645333380, 0.988854760050849490, 0.988862202984228780, 0.988869643445452470, 0.988877081434502150, 0.988884516951359040, -0.988891949996004600, 0.988899380568420310, 0.988906808668587600, 0.988914234296487840, 0.988921657452102700, 0.988929078135413200, 0.988936496346401020, 0.988943912085047620, -0.988951325351334450, 0.988958736145242880, 0.988966144466754570, 0.988973550315850990, 0.988980953692513490, 0.988988354596723520, 0.988995753028462650, 0.989003148987712350, -0.989010542474454300, 0.989017933488669840, 0.989025322030340550, 0.989032708099448100, 0.989040091695973730, 0.989047472819899130, 0.989054851471205860, 0.989062227649875500, -0.989069601355889510, 0.989076972589229550, 0.989084341349877110, 0.989091707637813950, 0.989099071453021450, 0.989106432795481270, 0.989113791665174990, 0.989121148062084180, -0.989128501986190620, 0.989135853437475680, 0.989143202415921350, 0.989150548921508780, 0.989157892954219850, 0.989165234514036260, 0.989172573600939580, 0.989179910214911360, -0.989187244355933410, 0.989194576023987420, 0.989201905219055040, 0.989209231941117870, 0.989216556190157580, 0.989223877966155850, 0.989231197269094480, 0.989238514098955020, -0.989245828455719400, 0.989253140339369290, 0.989260449749886140, 0.989267756687251980, 0.989275061151448360, 0.989282363142456990, 0.989289662660259860, 0.989296959704838550, -0.989304254276174850, 0.989311546374250560, 0.989318835999047350, 0.989326123150547020, 0.989333407828731360, 0.989340690033582270, 0.989347969765081440, 0.989355247023210650, -0.989362521807951700, 0.989369794119286610, 0.989377063957196930, 0.989384331321664590, 0.989391596212671360, 0.989398858630199160, 0.989406118574229890, 0.989413376044745220, -0.989420631041727280, 0.989427883565157650, 0.989435133615018340, 0.989442381191291130, 0.989449626293958050, 0.989456868923000890, 0.989464109078401430, 0.989471346760141810, -0.989478581968203930, 0.989485814702569470, 0.989493044963220550, 0.989500272750138850, 0.989507498063306620, 0.989514720902705540, 0.989521941268317720, 0.989529159160125070, -0.989536374578109610, 0.989543587522253130, 0.989550797992537650, 0.989558005988945060, 0.989565211511457600, 0.989572414560057070, 0.989579615134725480, 0.989586813235445060, -0.989594008862197390, 0.989601202014964710, 0.989608392693729130, 0.989615580898472460, 0.989622766629176920, 0.989629949885824420, 0.989637130668396980, 0.989644308976876940, -0.989651484811245870, 0.989658658171486240, 0.989665829057579940, 0.989672997469508990, 0.989680163407255620, 0.989687326870801740, 0.989694487860129810, 0.989701646375221400, -0.989708802416058960, 0.989715955982624520, 0.989723107074900190, 0.989730255692867990, 0.989737401836510270, 0.989744545505809040, 0.989751686700746540, 0.989758825421304670, -0.989765961667465780, 0.989773095439211990, 0.989780226736525440, 0.989787355559388240, 0.989794481907782740, 0.989801605781691070, 0.989808727181095470, 0.989815846105977950, -0.989822962556320740, 0.989830076532106200, 0.989837188033316440, 0.989844297059933710, 0.989851403611940240, 0.989858507689318490, 0.989865609292050250, 0.989872708420117990, -0.989879805073503930, 0.989886899252190310, 0.989893990956159600, 0.989901080185393800, 0.989908166939875380, 0.989915251219586570, 0.989922333024509600, 0.989929412354626730, -0.989936489209920280, 0.989943563590372720, 0.989950635495966180, 0.989957704926683110, 0.989964771882505870, 0.989971836363416570, 0.989978898369397790, 0.989985957900431650, -0.989993014956500610, 0.990000069537587010, 0.990007121643673330, 0.990014171274741780, 0.990021218430774950, 0.990028263111754960, 0.990035305317664260, 0.990042345048485320, -0.990049382304200590, 0.990056417084792310, 0.990063449390243040, 0.990070479220535150, 0.990077506575651190, 0.990084531455573290, 0.990091553860284130, 0.990098573789766070, -0.990105591244001550, 0.990112606222973040, 0.990119618726662990, 0.990126628755054080, 0.990133636308128450, 0.990140641385868770, 0.990147643988257390, 0.990154644115276980, -0.990161641766909910, 0.990168636943138840, 0.990175629643946010, 0.990182619869314330, 0.990189607619226030, 0.990196592893663690, 0.990203575692609750, 0.990210556016047020, -0.990217533863957830, 0.990224509236324770, 0.990231482133130500, 0.990238452554357610, 0.990245420499988540, 0.990252385970005870, 0.990259348964392160, 0.990266309483130100, -0.990273267526202370, 0.990280223093591430, 0.990287176185280060, 0.990294126801250620, 0.990301074941485780, 0.990308020605968340, 0.990314963794680870, 0.990321904507605930, -0.990328842744726210, 0.990335778506024500, 0.990342711791483370, 0.990349642601085380, 0.990356570934813220, 0.990363496792649680, 0.990370420174577440, 0.990377341080579070, -0.990384259510637350, 0.990391175464735210, 0.990398088942854860, 0.990404999944979440, 0.990411908471091400, 0.990418814521173640, 0.990425718095208850, 0.990432619193179710, -0.990439517815069110, 0.990446413960859750, 0.990453307630534300, 0.990460198824075540, 0.990467087541466400, 0.990473973782689420, 0.990480857547727520, 0.990487738836563490, -0.990494617649180120, 0.990501493985560310, 0.990508367845686630, 0.990515239229542100, 0.990522108137109390, 0.990528974568371520, 0.990535838523311060, 0.990542700001911140, -0.990549559004154530, 0.990556415530023940, 0.990563269579502250, 0.990570121152572370, 0.990576970249217310, 0.990583816869419760, 0.990590661013162620, 0.990597502680428900, -0.990604341871201500, 0.990611178585463100, 0.990618012823196840, 0.990624844584385490, 0.990631673869011960, 0.990638500677059390, 0.990645325008510550, 0.990652146863348350, -0.990658966241555810, 0.990665783143115930, 0.990672597568011400, 0.990679409516225460, 0.990686218987741010, 0.990693025982541050, 0.990699830500608500, 0.990706632541926480, -0.990713432106477780, 0.990720229194245410, 0.990727023805212600, 0.990733815939362160, 0.990740605596677200, 0.990747392777140630, 0.990754177480735690, 0.990760959707445380, -0.990767739457252610, 0.990774516730140500, 0.990781291526091960, 0.990788063845090330, 0.990794833687118510, 0.990801601052159530, 0.990808365940196720, 0.990815128351212880, -0.990821888285191240, 0.990828645742114930, 0.990835400721966850, 0.990842153224730460, 0.990848903250388550, 0.990855650798924460, 0.990862395870321320, 0.990869138464562040, -0.990875878581629950, 0.990882616221508080, 0.990889351384179770, 0.990896084069628150, 0.990902814277836220, 0.990909542008787230, 0.990916267262464510, 0.990922990038851090, -0.990929710337930090, 0.990936428159684860, 0.990943143504098620, 0.990949856371154400, 0.990956566760835660, 0.990963274673125620, 0.990969980108007190, 0.990976683065463830, -0.990983383545478770, 0.990990081548035250, 0.990996777073116510, 0.991003470120705890, 0.991010160690786510, 0.991016848783341950, 0.991023534398355110, 0.991030217535809440, -0.991036898195688190, 0.991043576377974690, 0.991050252082652290, 0.991056925309704240, 0.991063596059113870, 0.991070264330864650, 0.991076930124939580, 0.991083593441322240, -0.991090254279995970, 0.991096912640944020, 0.991103568524149820, 0.991110221929596640, 0.991116872857268020, 0.991123521307147200, 0.991130167279217430, 0.991136810773462380, -0.991143451789865180, 0.991150090328409390, 0.991156726389078480, 0.991163359971855670, 0.991169991076724540, 0.991176619703668330, 0.991183245852670590, 0.991189869523714790, -0.991196490716784280, 0.991203109431862520, 0.991209725668933060, 0.991216339427979260, 0.991222950708984580, 0.991229559511932590, 0.991236165836806630, 0.991242769683590260, -0.991249371052266960, 0.991255969942820170, 0.991262566355233580, 0.991269160289490640, 0.991275751745574700, 0.991282340723469320, 0.991288927223158090, 0.991295511244624670, -0.991302092787852310, 0.991308671852824790, 0.991315248439525680, 0.991321822547938440, 0.991328394178046520, 0.991334963329833730, 0.991341530003283400, 0.991348094198379330, -0.991354655915104970, 0.991361215153444110, 0.991367771913380210, 0.991374326194896740, 0.991380877997977470, 0.991387427322606100, 0.991393974168766070, 0.991400518536441070, -0.991407060425614880, 0.991413599836270980, 0.991420136768393250, 0.991426671221964930, 0.991433203196970040, 0.991439732693392140, 0.991446259711214920, 0.991452784250422050, -0.991459306310997100, 0.991465825892924090, 0.991472342996186470, 0.991478857620767930, 0.991485369766652250, 0.991491879433823110, 0.991498386622264300, 0.991504891331959510, -0.991511393562892530, 0.991517893315047140, 0.991524390588407020, 0.991530885382955750, 0.991537377698677340, 0.991543867535555570, 0.991550354893574020, 0.991556839772716580, -0.991563322172967050, 0.991569802094309450, 0.991576279536727110, 0.991582754500204060, 0.991589226984724180, 0.991595696990271170, 0.991602164516829030, 0.991608629564381450, -0.991615092132912320, 0.991621552222405440, 0.991628009832844600, 0.991634464964213810, 0.991640917616496750, 0.991647367789677550, 0.991653815483739760, 0.991660260698667530, -0.991666703434444850, 0.991673143691055190, 0.991679581468482670, 0.991686016766711200, 0.991692449585724670, 0.991698879925507090, 0.991705307786042270, 0.991711733167314200, -0.991718156069306910, 0.991724576492004070, 0.991730994435389810, 0.991737409899448030, 0.991743822884162740, 0.991750233389517950, 0.991756641415497580, 0.991763046962085730, -0.991769450029266090, 0.991775850617022780, 0.991782248725339930, 0.991788644354201440, 0.991795037503591330, 0.991801428173493590, 0.991807816363892370, 0.991814202074771670, -0.991820585306115390, 0.991826966057907540, 0.991833344330132370, 0.991839720122773880, 0.991846093435815980, 0.991852464269242890, 0.991858832623038760, 0.991865198497187460, -0.991871561891673140, 0.991877922806479910, 0.991884281241591890, 0.991890637196993110, 0.991896990672667790, 0.991903341668600060, 0.991909690184773930, 0.991916036221173640, -0.991922379777783080, 0.991928720854586720, 0.991935059451568460, 0.991941395568712640, 0.991947729206003270, 0.991954060363424590, 0.991960389040960840, 0.991966715238596030, -0.991973038956314500, 0.991979360194100270, 0.991985678951937680, 0.991991995229810850, 0.991998309027704140, 0.992004620345601660, 0.992010929183487540, 0.992017235541346130, -0.992023539419161660, 0.992029840816918360, 0.992036139734600360, 0.992042436172192010, 0.992048730129677650, 0.992055021607041620, 0.992061310604267830, 0.992067597121340740, -0.992073881158244690, 0.992080162714964020, 0.992086441791482860, 0.992092718387785570, 0.992098992503856470, 0.992105264139680140, 0.992111533295240380, 0.992117799970521850, -0.992124064165508910, 0.992130325880185680, 0.992136585114536730, 0.992142841868546290, 0.992149096142198820, 0.992155347935478440, 0.992161597248369830, 0.992167844080857120, -0.992174088432924870, 0.992180330304557430, 0.992186569695739040, 0.992192806606454370, 0.992199041036687660, 0.992205272986423360, 0.992211502455645820, 0.992217729444339500, -0.992223953952488860, 0.992230175980078340, 0.992236395527092420, 0.992242612593515540, 0.992248827179332160, 0.992255039284526630, 0.992261248909083520, 0.992267456052987160, -0.992273660716222360, 0.992279862898773240, 0.992286062600624570, 0.992292259821760840, 0.992298454562166370, 0.992304646821825730, 0.992310836600723390, 0.992317023898844130, -0.992323208716172190, 0.992329391052692240, 0.992335570908388860, 0.992341748283246620, 0.992347923177249960, 0.992354095590383460, 0.992360265522631680, 0.992366432973979310, -0.992372597944410790, 0.992378760433910820, 0.992384920442463960, 0.992391077970054770, 0.992397233016667930, 0.992403385582288020, 0.992409535666899600, 0.992415683270487240, -0.992421828393035830, 0.992427971034529730, 0.992434111194953950, 0.992440248874292610, 0.992446384072530830, 0.992452516789652960, 0.992458647025643790, 0.992464774780488110, -0.992470900054170380, 0.992477022846675490, 0.992483143157988130, 0.992489260988092760, 0.992495376336974270, 0.992501489204617340, 0.992507599591006760, 0.992513707496127110, -0.992519812919963160, 0.992525915862499830, 0.992532016323721570, 0.992538114303613270, 0.992544209802159740, 0.992550302819345640, 0.992556393355155770, 0.992562481409574930, -0.992568566982587890, 0.992574650074179550, 0.992580730684334500, 0.992586808813037620, 0.992592884460273720, 0.992598957626027570, 0.992605028310283970, 0.992611096513027920, -0.992617162234244230, 0.992623225473917460, 0.992629286232032610, 0.992635344508574600, 0.992641400303528210, 0.992647453616878340, 0.992653504448609780, 0.992659552798707550, -0.992665598667156530, 0.992671642053941320, 0.992677682959047130, 0.992683721382458640, 0.992689757324160870, 0.992695790784138720, 0.992701821762377090, 0.992707850258860880, -0.992713876273575210, 0.992719899806504660, 0.992725920857634450, 0.992731939426949370, 0.992737955514434440, 0.992743969120074680, 0.992749980243854970, 0.992755988885760330, -0.992761995045775780, 0.992767998723886100, 0.992773999920076530, 0.992779998634331860, 0.992785994866637210, 0.992791988616977710, 0.992797979885338130, 0.992803968671703620, -0.992809954976059170, 0.992815938798389920, 0.992821920138680760, 0.992827898996916700, 0.992833875373082990, 0.992839849267164620, 0.992845820679146620, 0.992851789609014100, -0.992857756056751970, 0.992863720022345570, 0.992869681505779810, 0.992875640507039910, 0.992881597026110780, 0.992887551062977770, 0.992893502617625990, 0.992899451690040240, -0.992905398280205960, 0.992911342388108190, 0.992917284013732030, 0.992923223157062610, 0.992929159818085270, 0.992935093996784920, 0.992941025693146910, 0.992946954907156340, -0.992952881638798360, 0.992958805888058070, 0.992964727654920940, 0.992970646939371870, 0.992976563741396200, 0.992982478060979170, 0.992988389898106010, 0.992994299252761730, -0.993000206124931780, 0.993006110514601190, 0.993012012421755410, 0.993017911846379660, 0.993023808788459080, 0.993029703247979010, 0.993035595224924680, 0.993041484719281330, -0.993047371731034300, 0.993053256260168830, 0.993059138306670140, 0.993065017870523700, 0.993070894951714630, 0.993076769550228500, 0.993082641666050310, 0.993088511299165530, -0.993094378449559500, 0.993100243117217450, 0.993106105302124840, 0.993111965004266910, 0.993117822223629210, 0.993123676960196880, 0.993129529213955360, 0.993135378984890020, -0.993141226272986180, 0.993147071078229300, 0.993152913400604740, 0.993158753240097950, 0.993164590596694370, 0.993170425470379150, 0.993176257861137830, 0.993182087768956000, -0.993187915193818880, 0.993193740135711930, 0.993199562594620720, 0.993205382570530590, 0.993211200063427000, 0.993217015073295410, 0.993222827600121260, 0.993228637643890020, -0.993234445204587260, 0.993240250282198310, 0.993246052876708750, 0.993251852988104140, 0.993257650616369840, 0.993263445761491390, 0.993269238423454380, 0.993275028602244150, -0.993280816297846480, 0.993286601510246720, 0.993292384239430450, 0.993298164485383330, 0.993303942248090710, 0.993309717527538160, 0.993315490323711360, 0.993321260636595870, -0.993327028466177260, 0.993332793812441000, 0.993338556675372850, 0.993344317054958290, 0.993350074951182880, 0.993355830364032300, 0.993361583293492110, 0.993367333739548000, -0.993373081702185520, 0.993378827181390370, 0.993384570177148210, 0.993390310689444610, 0.993396048718265150, 0.993401784263595600, 0.993407517325421650, 0.993413247903728760, -0.993418975998502930, 0.993424701609729510, 0.993430424737394510, 0.993436145381483390, 0.993441863541981830, 0.993447579218875610, 0.993453292412150410, 0.993459003121792140, -0.993464711347786240, 0.993470417090118630, 0.993476120348774970, 0.993481821123740950, 0.993487519415002350, 0.993493215222545080, 0.993498908546354700, 0.993504599386417000, -0.993510287742717880, 0.993515973615243020, 0.993521657003978210, 0.993527337908909350, 0.993533016330022000, 0.993538692267302180, 0.993544365720735570, 0.993550036690308170, -0.993555705176005550, 0.993561371177813850, 0.993567034695718500, 0.993572695729705750, 0.993578354279761160, 0.993584010345870630, 0.993589663928020170, 0.993595315026195470, -0.993600963640382640, 0.993606609770567250, 0.993612253416735420, 0.993617894578872950, 0.993623533256965620, 0.993629169450999550, 0.993634803160960530, 0.993640434386834580, -0.993646063128607590, 0.993651689386265360, 0.993657313159793890, 0.993662934449179080, 0.993668553254406950, 0.993674169575463510, 0.993679783412334650, 0.993685394765006390, -0.993691003633464520, 0.993696610017695160, 0.993702213917684320, 0.993707815333417900, 0.993713414264881910, 0.993719010712062480, 0.993724604674945500, 0.993730196153516990, -0.993735785147763060, 0.993741371657669510, 0.993746955683222690, 0.993752537224408370, 0.993758116281212690, 0.993763692853621760, 0.993769266941621600, 0.993774838545198440, -0.993780407664338060, 0.993785974299026600, 0.993791538449250170, 0.993797100114995000, 0.993802659296247000, 0.993808215992992410, 0.993813770205217330, 0.993819321932907780, -0.993824871176049900, 0.993830417934629780, 0.993835962208633680, 0.993841503998047720, 0.993847043302858000, 0.993852580123050560, 0.993858114458611830, 0.993863646309527730, -0.993869175675784480, 0.993874702557368320, 0.993880226954265370, 0.993885748866461970, 0.993891268293944030, 0.993896785236698110, 0.993902299694710110, 0.993907811667966380, -0.993913321156453140, 0.993918828160156530, 0.993924332679062880, 0.993929834713158430, 0.993935334262429420, 0.993940831326862060, 0.993946325906442610, 0.993951818001157280, -0.993957307610992550, 0.993962794735934410, 0.993968279375969320, 0.993973761531083520, 0.993979241201263350, 0.993984718386495160, 0.993990193086765060, 0.993995665302059520, -0.994001135032364760, 0.994006602277667240, 0.994012067037953080, 0.994017529313208860, 0.994022989103420910, 0.994028446408575350, 0.994033901228658760, 0.994039353563657360, -0.994044803413557500, 0.994050250778345750, 0.994055695658008330, 0.994061138052531710, 0.994066577961902230, 0.994072015386106340, 0.994077450325130290, 0.994082882778960730, -0.994088312747583910, 0.994093740230986290, 0.994099165229154310, 0.994104587742074440, 0.994110007769733240, 0.994115425312116940, 0.994120840369212000, 0.994126252941004980, -0.994131663027482350, 0.994137070628630550, 0.994142475744436040, 0.994147878374885500, 0.994153278519965160, 0.994158676179661580, 0.994164071353961340, 0.994169464042850890, -0.994174854246316800, 0.994180241964345620, 0.994185627196923720, 0.994191009944037970, 0.994196390205674520, 0.994201767981820140, 0.994207143272461290, 0.994212516077584650, -0.994217886397176680, 0.994223254231224040, 0.994228619579713310, 0.994233982442630950, 0.994239342819963620, 0.994244700711698020, 0.994250056117820580, 0.994255409038317990, -0.994260759473176940, 0.994266107422383970, 0.994271452885925780, 0.994276795863788920, 0.994282136355960080, 0.994287474362425820, 0.994292809883172920, 0.994298142918188080, -0.994303473467457730, 0.994308801530968790, 0.994314127108707920, 0.994319450200661590, 0.994324770806816690, 0.994330088927159910, 0.994335404561677900, 0.994340717710357260, -0.994346028373184980, 0.994351336550147620, 0.994356642241231770, 0.994361945446424420, 0.994367246165712260, 0.994372544399081850, 0.994377840146520200, 0.994383133408013880, -0.994388424183549670, 0.994393712473114590, 0.994398998276695090, 0.994404281594278070, 0.994409562425850440, 0.994414840771398860, 0.994420116630910120, 0.994425390004371130, -0.994430660891768680, 0.994435929293089660, 0.994441195208320750, 0.994446458637448850, 0.994451719580460750, 0.994456978037343450, 0.994462234008083650, 0.994467487492668220, -0.994472738491084200, 0.994477987003318240, 0.994483233029357370, 0.994488476569188260, 0.994493717622798150, 0.994498956190173590, 0.994504192271301710, 0.994509425866169420, -0.994514656974763600, 0.994519885597070940, 0.994525111733078670, 0.994530335382773690, 0.994535556546142780, 0.994540775223172970, 0.994545991413851250, 0.994551205118164640, -0.994556416336099920, 0.994561625067644120, 0.994566831312784340, 0.994572035071507490, 0.994577236343800460, 0.994582435129650390, 0.994587631429044270, 0.994592825241969130, -0.994598016568411850, 0.994603205408359450, 0.994608391761799050, 0.994613575628717770, 0.994618757009102520, 0.994623935902940290, 0.994629112310218330, 0.994634286230923650, -0.994639457665043140, 0.994644626612564030, 0.994649793073473230, 0.994654957047758080, 0.994660118535405480, 0.994665277536402660, 0.994670434050736630, 0.994675588078394510, -0.994680739619363320, 0.994685888673630390, 0.994691035241182740, 0.994696179322007380, 0.994701320916091650, 0.994706460023422670, 0.994711596643987560, 0.994716730777773340, -0.994721862424767340, 0.994726991584956700, 0.994732118258328630, 0.994737242444870160, 0.994742364144568620, 0.994747483357411140, 0.994752600083385170, 0.994757714322477500, -0.994762826074675590, 0.994767935339966550, 0.994773042118337720, 0.994778146409776240, 0.994783248214269440, 0.994788347531804560, 0.994793444362368830, 0.994798538705949360, -0.994803630562533630, 0.994808719932108840, 0.994813806814662250, 0.994818891210181080, 0.994823973118652670, 0.994829052540064480, 0.994834129474403530, 0.994839203921657260, -0.994844275881813010, 0.994849345354858030, 0.994854412340779760, 0.994859476839565330, 0.994864538851202410, 0.994869598375678010, 0.994874655412979590, 0.994879709963094610, -0.994884762026010280, 0.994889811601714080, 0.994894858690193340, 0.994899903291435520, 0.994904945405427950, 0.994909985032158000, 0.994915022171612980, 0.994920056823780490, -0.994925088988647840, 0.994930118666202400, 0.994935145856431720, 0.994940170559323270, 0.994945192774864370, 0.994950212503042390, 0.994955229743844980, 0.994960244497259390, -0.994965256763273190, 0.994970266541873930, 0.994975273833048960, 0.994980278636785840, 0.994985280953072040, 0.994990280781895000, 0.994995278123242290, 0.995000272977101250, -0.995005265343459680, 0.995010255222304910, 0.995015242613624510, 0.995020227517406040, 0.995025209933636860, 0.995030189862304740, 0.995035167303397140, 0.995040142256901630, -0.995045114722805770, 0.995050084701097130, 0.995055052191763270, 0.995060017194791870, 0.995064979710170270, 0.995069939737886270, 0.995074897277927420, 0.995079852330281400, -0.995084804894935670, 0.995089754971877900, 0.995094702561095890, 0.995099647662577080, 0.995104590276309040, 0.995109530402279560, 0.995114468040476320, 0.995119403190886880, -0.995124335853498910, 0.995129266028300100, 0.995134193715278230, 0.995139118914420750, 0.995144041625715460, 0.995148961849150140, 0.995153879584712350, 0.995158794832389890, -0.995163707592170430, 0.995168617864041870, 0.995173525647991550, 0.995178430944007490, 0.995183333752077350, 0.995188234072188930, 0.995193131904329900, 0.995198027248487940, -0.995202920104650950, 0.995207810472806820, 0.995212698352943010, 0.995217583745047540, 0.995222466649107960, 0.995227347065112400, 0.995232224993048310, 0.995237100432903700, -0.995241973384666360, 0.995246843848324180, 0.995251711823864850, 0.995256577311276150, 0.995261440310546090, 0.995266300821662340, 0.995271158844612920, 0.995276014379385620, -0.995280867425968330, 0.995285717984348730, 0.995290566054514940, 0.995295411636454630, 0.995300254730155820, 0.995305095335606400, 0.995309933452794280, 0.995314769081707240, -0.995319602222333400, 0.995324432874660550, 0.995329261038676470, 0.995334086714369290, 0.995338909901727020, 0.995343730600737330, 0.995348548811388350, 0.995353364533668070, -0.995358177767564300, 0.995362988513065150, 0.995367796770158410, 0.995372602538832310, 0.995377405819074630, 0.995382206610873400, 0.995387004914216720, 0.995391800729092610, -0.995396594055488970, 0.995401384893393690, 0.995406173242795010, 0.995410959103680940, 0.995415742476039480, 0.995420523359858640, 0.995425301755126450, 0.995430077661831230, -0.995434851079960550, 0.995439622009502870, 0.995444390450446080, 0.995449156402778310, 0.995453919866487680, 0.995458680841562190, 0.995463439327990200, 0.995468195325759360, -0.995472948834858150, 0.995477699855274570, 0.995482448386996730, 0.995487194430012770, 0.995491937984310790, 0.995496679049879040, 0.995501417626705520, 0.995506153714778570, -0.995510887314086100, 0.995515618424616440, 0.995520347046357720, 0.995525073179298170, 0.995529796823426020, 0.995534517978729270, 0.995539236645196280, 0.995543952822815160, -0.995548666511574140, 0.995553377711461460, 0.995558086422465350, 0.995562792644574030, 0.995567496377775750, 0.995572197622058840, 0.995576896377411310, 0.995581592643821510, -0.995586286421277780, 0.995590977709768230, 0.995595666509281330, 0.995600352819805190, 0.995605036641328270, 0.995609717973838790, 0.995614396817325000, 0.995619073171775120, -0.995623747037177600, 0.995628418413520680, 0.995633087300792700, 0.995637753698982110, 0.995642417608077150, 0.995647079028066040, 0.995651737958937240, 0.995656394400679100, -0.995661048353280060, 0.995665699816728260, 0.995670348791012350, 0.995674995276120470, 0.995679639272041170, 0.995684280778762810, 0.995688919796273610, 0.995693556324562130, -0.995698190363616840, 0.995702821913426070, 0.995707450973978170, 0.995712077545261700, 0.995716701627265110, 0.995721323219976640, 0.995725942323384960, 0.995730558937478310, -0.995735173062245350, 0.995739784697674430, 0.995744393843754020, 0.995749000500472770, 0.995753604667818930, 0.995758206345781050, 0.995762805534347590, 0.995767402233507240, -0.995771996443248320, 0.995776588163559410, 0.995781177394429060, 0.995785764135845740, 0.995790348387798010, 0.995794930150274430, 0.995799509423263560, 0.995804086206753870, -0.995808660500733910, 0.995813232305192360, 0.995817801620117680, 0.995822368445498650, 0.995826932781323610, 0.995831494627581250, 0.995836053984260120, 0.995840610851348780, -0.995845165228836040, 0.995849717116710330, 0.995854266514960340, 0.995858813423574740, 0.995863357842541990, 0.995867899771850970, 0.995872439211490050, 0.995876976161448100, -0.995881510621713820, 0.995886042592275640, 0.995890572073122480, 0.995895099064242780, 0.995899623565625340, 0.995904145577258810, 0.995908665099132010, 0.995913182131233480, -0.995917696673551900, 0.995922208726076290, 0.995926718288795090, 0.995931225361697090, 0.995935729944770980, 0.995940232038005520, 0.995944731641389520, 0.995949228754911650, -0.995953723378560810, 0.995958215512325660, 0.995962705156194890, 0.995967192310157400, 0.995971676974201970, 0.995976159148317270, 0.995980638832492220, 0.995985116026715470, -0.995989590730976040, 0.995994062945262710, 0.995998532669564060, 0.996002999903869090, 0.996007464648166700, 0.996011926902445670, 0.996016386666694680, 0.996020843940902840, -0.996025298725058960, 0.996029751019151700, 0.996034200823170070, 0.996038648137102970, 0.996043092960939290, 0.996047535294667830, 0.996051975138277480, 0.996056412491757250, -0.996060847355096150, 0.996065279728282740, 0.996069709611306140, 0.996074137004155260, 0.996078561906819090, 0.996082984319286550, 0.996087404241546400, 0.996091821673587900, -0.996096236615399810, 0.996100649066971160, 0.996105059028290720, 0.996109466499347730, 0.996113871480131090, 0.996118273970629800, 0.996122673970832760, 0.996127071480729210, -0.996131466500307820, 0.996135859029557810, 0.996140249068468100, 0.996144636617027790, 0.996149021675225900, 0.996153404243051430, 0.996157784320493400, 0.996162161907541140, -0.996166537004183230, 0.996170909610409110, 0.996175279726207670, 0.996179647351568050, 0.996184012486479250, 0.996188375130930500, 0.996192735284910810, 0.996197092948409190, -0.996201448121414980, 0.996205800803916960, 0.996210150995904600, 0.996214498697366780, 0.996218843908292740, 0.996223186628671600, 0.996227526858492580, 0.996231864597744600, -0.996236199846416980, 0.996240532604498960, 0.996244862871979550, 0.996249190648847870, 0.996253515935093370, 0.996257838730705060, 0.996262159035672170, 0.996266476849983820, -0.996270792173629240, 0.996275105006597770, 0.996279415348878540, 0.996283723200460660, 0.996288028561333580, 0.996292331431486430, 0.996296631810908440, 0.996300929699588830, -0.996305225097516840, 0.996309518004681930, 0.996313808421073090, 0.996318096346679780, 0.996322381781491240, 0.996326664725496910, 0.996330945178685700, 0.996335223141047170, -0.996339498612570650, 0.996343771593245280, 0.996348042083060600, 0.996352310082005750, 0.996356575590070070, 0.996360838607243120, 0.996365099133513900, 0.996369357168871980, -0.996373612713306710, 0.996377865766807420, 0.996382116329363350, 0.996386364400964060, 0.996390609981599010, 0.996394853071257190, 0.996399093669928400, 0.996403331777601760, -0.996407567394266840, 0.996411800519913070, 0.996416031154529700, 0.996420259298106290, 0.996424484950632290, 0.996428708112097050, 0.996432928782490010, 0.996437146961800630, -0.996441362650018370, 0.996445575847132780, 0.996449786553133210, 0.996453994768009220, 0.996458200491750160, 0.996462403724345690, 0.996466604465785170, 0.996470802716058040, -0.996474998475153970, 0.996479191743062430, 0.996483382519772980, 0.996487570805275060, 0.996491756599558130, 0.996495939902611760, 0.996500120714425620, 0.996504299034989160, -0.996508474864291950, 0.996512648202323660, 0.996516819049073630, 0.996520987404531660, 0.996525153268687070, 0.996529316641529660, 0.996533477523048990, 0.996537635913234630, -0.996541791812076140, 0.996545945219563190, 0.996550096135685460, 0.996554244560432400, 0.996558390493793690, 0.996562533935759000, 0.996566674886318120, 0.996570813345460380, -0.996574949313175700, 0.996579082789453620, 0.996583213774283940, 0.996587342267656110, 0.996591468269559910, 0.996595591779985130, 0.996599712798921230, 0.996603831326358210, -0.996607947362285530, 0.996612060906693080, 0.996616171959570310, 0.996620280520907230, 0.996624386590693410, 0.996628490168918630, 0.996632591255572580, 0.996636689850645130, -0.996640785954125860, 0.996644879566004780, 0.996648970686271340, 0.996653059314915550, 0.996657145451927070, 0.996661229097295820, 0.996665310251011350, 0.996669388913063670, -0.996673465083442570, 0.996677538762137830, 0.996681609949139240, 0.996685678644436580, 0.996689744848019640, 0.996693808559878440, 0.996697869780002740, 0.996701928508382240, -0.996705984745007050, 0.996710038489866830, 0.996714089742951610, 0.996718138504251060, 0.996722184773755180, 0.996726228551453870, 0.996730269837336920, 0.996734308631394340, -0.996738344933616130, 0.996742378743991850, 0.996746410062511750, 0.996750438889165590, 0.996754465223943290, 0.996758489066834840, 0.996762510417830150, 0.996766529276919220, -0.996770545644092070, 0.996774559519338470, 0.996778570902648430, 0.996782579794011970, 0.996786586193419090, 0.996790590100859690, 0.996794591516323880, 0.996798590439801570, -0.996802586871282760, 0.996806580810757570, 0.996810572258215900, 0.996814561213647750, 0.996818547677043140, 0.996822531648392300, 0.996826513127685000, 0.996830492114911590, -0.996834468610061750, 0.996838442613125930, 0.996842414124093800, 0.996846383142955820, 0.996850349669701760, 0.996854313704321870, 0.996858275246806260, 0.996862234297144930, -0.996866190855327900, 0.996870144921345510, 0.996874096495187770, 0.996878045576844670, 0.996881992166306570, 0.996885936263563480, 0.996889877868605500, 0.996893816981422880, -0.996897753602005720, 0.996901687730344150, 0.996905619366428300, 0.996909548510248490, 0.996913475161794740, 0.996917399321057270, 0.996921320988026440, 0.996925240162692240, -0.996929156845045020, 0.996933071035074780, 0.996936982732771870, 0.996940891938126520, 0.996944798651128950, 0.996948702871769510, 0.996952604600038210, 0.996956503835925380, -0.996960400579421260, 0.996964294830516180, 0.996968186589200390, 0.996972075855464100, 0.996975962629297660, 0.996979846910691300, 0.996983728699635250, 0.996987607996119960, -0.996991484800135660, 0.996995359111672590, 0.996999230930721180, 0.997003100257271570, 0.997006967091314310, 0.997010831432839750, 0.997014693281837890, 0.997018552638299420, -0.997022409502214550, 0.997026263873573630, 0.997030115752367110, 0.997033965138585220, 0.997037812032218530, 0.997041656433257260, 0.997045498341691760, 0.997049337757512590, -0.997053174680710090, 0.997057009111274590, 0.997060841049196570, 0.997064670494466570, 0.997068497447074820, 0.997072321907011780, 0.997076143874268020, 0.997079963348833860, -0.997083780330699780, 0.997087594819856200, 0.997091406816293710, 0.997095216320002750, 0.997099023330973670, 0.997102827849197020, 0.997106629874663360, 0.997110429407363050, -0.997114226447286760, 0.997118020994424810, 0.997121813048767790, 0.997125602610306360, 0.997129389679030860, 0.997133174254931980, 0.997136956338000040, 0.997140735928225720, -0.997144513025599590, 0.997148287630112210, 0.997152059741754030, 0.997155829360515830, 0.997159596486387970, 0.997163361119361100, 0.997167123259425800, 0.997170882906572740, -0.997174640060792480, 0.997178394722075590, 0.997182146890412850, 0.997185896565794590, 0.997189643748211620, 0.997193388437654590, 0.997197130634113970, 0.997200870337580650, -0.997204607548045070, 0.997208342265498040, 0.997212074489930210, 0.997215804221332050, 0.997219531459694440, 0.997223256205008070, 0.997226978457263490, 0.997230698216451380, -0.997234415482562640, 0.997238130255587830, 0.997241842535517730, 0.997245552322343020, 0.997249259616054370, 0.997252964416642680, 0.997256666724098410, 0.997260366538412660, -0.997264063859575890, 0.997267758687579000, 0.997271451022412660, 0.997275140864067770, 0.997278828212534880, 0.997282513067805020, 0.997286195429868960, 0.997289875298717270, -0.997293552674340940, 0.997297227556730780, 0.997300899945877560, 0.997304569841771960, 0.997308237244405090, 0.997311902153767530, 0.997315564569850270, 0.997319224492643990, -0.997322881922139800, 0.997326536858328390, 0.997330189301200540, 0.997333839250747260, 0.997337486706959320, 0.997341131669827740, 0.997344774139343300, 0.997348414115497020, -0.997352051598279670, 0.997355686587682140, 0.997359319083695350, 0.997362949086310290, 0.997366576595517970, 0.997370201611309070, 0.997373824133674700, 0.997377444162605760, -0.997381061698093370, 0.997384676740128210, 0.997388289288701270, 0.997391899343803680, 0.997395506905426330, 0.997399111973560240, 0.997402714548196400, 0.997406314629325720, -0.997409912216939310, 0.997413507311028070, 0.997417099911583000, 0.997420690018595240, 0.997424277632055770, 0.997427862751955610, 0.997431445378285760, 0.997435025511037470, -0.997438603150201390, 0.997442178295768870, 0.997445750947730910, 0.997449321106078650, 0.997452888770802960, 0.997456453941895080, 0.997460016619346130, 0.997463576803147120, -0.997467134493289160, 0.997470689689763380, 0.997474242392560770, 0.997477792601672690, 0.997481340317090020, 0.997484885538804100, 0.997488428266805950, 0.997491968501086680, -0.997495506241637520, 0.997499041488449590, 0.997502574241514010, 0.997506104500822000, 0.997509632266364800, 0.997513157538133520, 0.997516680316119290, 0.997520200600313430, -0.997523718390706970, 0.997527233687291350, 0.997530746490057460, 0.997534256798996880, 0.997537764614100490, 0.997541269935359850, 0.997544772762765990, 0.997548273096310220, -0.997551770935983680, 0.997555266281777710, 0.997558759133683640, 0.997562249491692700, 0.997565737355796010, 0.997569222725985140, 0.997572705602251200, 0.997576185984585420, -0.997579663872979140, 0.997583139267423700, 0.997586612167910450, 0.997590082574430710, 0.997593550486975730, 0.997597015905536950, 0.997600478830105500, 0.997603939260672920, -0.997607397197230460, 0.997610852639769560, 0.997614305588281460, 0.997617756042757710, 0.997621204003189540, 0.997624649469568300, 0.997628092441885440, 0.997631532920132290, -0.997634970904300420, 0.997638406394381060, 0.997641839390365770, 0.997645269892245780, 0.997648697900012760, 0.997652123413657830, 0.997655546433172670, 0.997658966958548610, -0.997662384989777110, 0.997665800526849720, 0.997669213569757800, 0.997672624118492890, 0.997676032173046350, 0.997679437733409720, 0.997682840799574590, 0.997686241371532280, -0.997689639449274360, 0.997693035032792390, 0.997696428122077820, 0.997699818717122210, 0.997703206817917020, 0.997706592424453810, 0.997709975536724140, 0.997713356154719460, -0.997716734278431440, 0.997720109907851650, 0.997723483042971430, 0.997726853683782670, 0.997730221830276710, 0.997733587482445230, 0.997736950640279670, 0.997740311303771830, -0.997743669472913150, 0.997747025147695310, 0.997750378328109980, 0.997753729014148720, 0.997757077205803090, 0.997760422903064660, 0.997763766105925320, 0.997767106814376530, -0.997770445028409950, 0.997773780748017150, 0.997777113973190130, 0.997780444703920130, 0.997783772940199150, 0.997787098682018650, 0.997790421929370400, 0.997793742682246190, -0.997797060940637580, 0.997800376704536250, 0.997803689973934090, 0.997807000748822670, 0.997810309029193650, 0.997813614815038940, 0.997816918106350200, 0.997820218903119120, -0.997823517205337570, 0.997826813012997250, 0.997830106326089820, 0.997833397144607170, 0.997836685468540980, 0.997839971297883040, 0.997843254632625240, 0.997846535472759260, -0.997849813818276980, 0.997853089669170190, 0.997856363025430680, 0.997859633887050120, 0.997862902254020630, 0.997866168126333890, 0.997869431503981660, 0.997872692386955860, -0.997875950775248380, 0.997879206668850880, 0.997882460067755490, 0.997885710971953890, 0.997888959381438070, 0.997892205296199820, 0.997895448716231040, 0.997898689641523730, -0.997901928072069680, 0.997905164007860780, 0.997908397448888930, 0.997911628395146130, 0.997914856846624180, 0.997918082803315180, 0.997921306265210920, 0.997924527232303400, -0.997927745704584650, 0.997930961682046420, 0.997934175164680860, 0.997937386152479840, 0.997940594645435270, 0.997943800643539380, 0.997947004146783830, 0.997950205155160860, -0.997953403668662360, 0.997956599687280340, 0.997959793211006920, 0.997962984239833870, 0.997966172773753430, 0.997969358812757500, 0.997972542356838300, 0.997975723405987610, -0.997978901960197670, 0.997982078019460480, 0.997985251583768160, 0.997988422653112610, 0.997991591227486040, 0.997994757306880480, 0.997997920891288030, 0.998001081980700810, -0.998004240575110830, 0.998007396674510330, 0.998010550278891300, 0.998013701388245860, 0.998016850002566120, 0.998019996121844330, 0.998023139746072600, 0.998026280875242920, -0.998029419509347650, 0.998032555648378780, 0.998035689292328440, 0.998038820441188970, 0.998041949094952360, 0.998045075253610970, 0.998048198917156900, 0.998051320085582280, -0.998054438758879450, 0.998057554937040400, 0.998060668620057490, 0.998063779807922940, 0.998066888500628970, 0.998069994698167710, 0.998073098400531490, 0.998076199607712540, -0.998079298319703100, 0.998082394536495390, 0.998085488258081740, 0.998088579484454290, 0.998091668215605470, 0.998094754451527510, 0.998097838192212540, 0.998100919437653000, -0.998103998187841230, 0.998107074442769360, 0.998110148202429940, 0.998113219466815080, 0.998116288235917140, 0.998119354509728550, 0.998122418288241550, 0.998125479571448480, -0.998128538359341790, 0.998131594651913590, 0.998134648449156560, 0.998137699751062810, 0.998140748557624910, 0.998143794868835090, 0.998146838684685790, 0.998149880005169350, -0.998152918830278240, 0.998155955160004880, 0.998158988994341520, 0.998162020333280830, 0.998165049176815030, 0.998168075524936580, 0.998171099377637930, 0.998174120734911520, -0.998177139596749920, 0.998180155963145350, 0.998183169834090500, 0.998186181209577580, 0.998189190089599390, 0.998192196474148140, 0.998195200363216300, 0.998198201756796630, -0.998201200654881270, 0.998204197057463110, 0.998207190964534250, 0.998210182376087610, 0.998213171292115400, 0.998216157712610300, 0.998219141637564760, 0.998222123066971450, -0.998225102000822820, 0.998228078439111320, 0.998231052381829740, 0.998234023828970530, 0.998236992780526240, 0.998239959236489450, 0.998242923196852710, 0.998245884661608680, -0.998248843630750060, 0.998251800104269170, 0.998254754082158910, 0.998257705564411730, 0.998260654551020310, 0.998263601041977200, 0.998266545037275080, 0.998269486536906610, -0.998272425540864480, 0.998275362049141250, 0.998278296061729580, 0.998281227578622250, 0.998284156599811730, 0.998287083125290910, 0.998290007155052340, 0.998292928689088810, -0.998295847727392880, 0.998298764269957340, 0.998301678316774970, 0.998304589867838430, 0.998307498923140300, 0.998310405482673470, 0.998313309546430610, 0.998316211114404490, -0.998319110186587810, 0.998322006762973450, 0.998324900843554080, 0.998327792428322370, 0.998330681517271110, 0.998333568110393310, 0.998336452207681520, 0.998339333809128540, -0.998342212914727250, 0.998345089524470540, 0.998347963638350990, 0.998350835256361590, 0.998353704378495130, 0.998356571004744290, 0.998359435135102060, 0.998362296769561340, -0.998365155908114810, 0.998368012550755470, 0.998370866697475990, 0.998373718348269380, 0.998376567503128420, 0.998379414162046120, 0.998382258325015260, 0.998385099992028740, -0.998387939163079550, 0.998390775838160380, 0.998393610017264340, 0.998396441700384330, 0.998399270887513120, 0.998402097578643840, 0.998404921773769160, 0.998407743472882300, -0.998410562675976050, 0.998413379383043420, 0.998416193594077290, 0.998419005309070680, 0.998421814528016590, 0.998424621250908030, 0.998427425477737770, 0.998430227208499050, -0.998433026443184770, 0.998435823181787920, 0.998438617424301400, 0.998441409170718440, 0.998444198421031940, 0.998446985175234890, 0.998449769433320420, 0.998452551195281530, -0.998455330461111350, 0.998458107230802750, 0.998460881504348860, 0.998463653281742800, 0.998466422562977570, 0.998469189348046290, 0.998471953636942080, 0.998474715429658040, -0.998477474726187090, 0.998480231526522540, 0.998482985830657420, 0.998485737638584720, 0.998488486950297790, 0.998491233765789630, 0.998493978085053360, 0.998496719908082090, -0.998499459234869160, 0.998502196065407470, 0.998504930399690350, 0.998507662237710810, 0.998510391579462200, 0.998513118424937620, 0.998515842774130190, 0.998518564627033140, -0.998521283983639710, 0.998524000843943100, 0.998526715207936450, 0.998529427075613100, 0.998532136446966030, 0.998534843321988720, 0.998537547700674380, 0.998540249583016020, -0.998542948969007080, 0.998545645858640810, 0.998548340251910420, 0.998551032148809140, 0.998553721549330200, 0.998556408453467160, 0.998559092861213030, 0.998561774772561030, -0.998564454187504720, 0.998567131106037230, 0.998569805528152000, 0.998572477453842140, 0.998575146883101120, 0.998577813815922260, 0.998580478252298900, 0.998583140192224270, -0.998585799635691830, 0.998588456582694910, 0.998591111033226730, 0.998593762987280860, 0.998596412444850650, 0.998599059405929300, 0.998601703870510390, 0.998604345838587150, -0.998606985310153130, 0.998609622285201560, 0.998612256763726000, 0.998614888745719690, 0.998617518231176280, 0.998620145220089020, 0.998622769712451450, 0.998625391708256930, -0.998628011207498890, 0.998630628210170790, 0.998633242716266190, 0.998635854725778430, 0.998638464238701170, 0.998641071255027660, 0.998643675774751440, 0.998646277797866080, -0.998648877324364910, 0.998651474354241620, 0.998654068887489750, 0.998656660924102660, 0.998659250464073890, 0.998661837507396900, 0.998664422054065470, 0.998667004104072830, -0.998669583657412760, 0.998672160714078830, 0.998674735274064360, 0.998677307337363150, 0.998679876903968640, 0.998682443973874400, 0.998685008547074090, 0.998687570623561170, -0.998690130203329420, 0.998692687286372280, 0.998695241872683550, 0.998697793962256550, 0.998700343555085190, 0.998702890651162910, 0.998705435250483390, 0.998707977353040290, -0.998710516958827290, 0.998713054067837950, 0.998715588680066050, 0.998718120795505150, 0.998720650414148920, 0.998723177535991050, 0.998725702161025300, 0.998728224289245240, -0.998730743920644650, 0.998733261055217200, 0.998735775692956570, 0.998738287833856540, 0.998740797477910780, 0.998743304625112960, 0.998745809275456970, 0.998748311428936390, -0.998750811085545090, 0.998753308245276750, 0.998755802908125050, 0.998758295074083980, 0.998760784743147110, 0.998763271915308230, 0.998765756590561220, 0.998768238768899860, -0.998770718450317840, 0.998773195634809040, 0.998775670322367250, 0.998778142512986360, 0.998780612206660030, 0.998783079403382180, 0.998785544103146570, 0.998788006305947220, -0.998790466011777790, 0.998792923220632180, 0.998795377932504280, 0.998797830147387990, 0.998800279865277090, 0.998802727086165460, 0.998805171810047020, 0.998807614036915650, -0.998810053766765350, 0.998812490999589800, 0.998814925735383110, 0.998817357974138950, 0.998819787715851560, 0.998822214960514600, 0.998824639708122080, 0.998827061958668110, -0.998829481712146360, 0.998831898968550960, 0.998834313727875790, 0.998836725990114860, 0.998839135755262060, 0.998841543023311410, 0.998843947794257000, 0.998846350068092750, -0.998848749844812530, 0.998851147124410370, 0.998853541906880470, 0.998855934192216630, 0.998858323980412970, 0.998860711271463590, 0.998863096065362390, 0.998865478362103380, -0.998867858161680780, 0.998870235464088490, 0.998872610269320500, 0.998874982577371170, 0.998877352388234270, 0.998879719701904030, 0.998882084518374460, 0.998884446837639770, -0.998886806659693870, 0.998889163984530980, 0.998891518812145110, 0.998893871142530590, 0.998896220975681200, 0.998898568311591410, 0.998900913150255200, 0.998903255491666700, -0.998905595335820020, 0.998907932682709390, 0.998910267532328810, 0.998912599884672740, 0.998914929739735060, 0.998917257097510000, 0.998919581957991910, 0.998921904321174890, -0.998924224187053070, 0.998926541555620660, 0.998928856426871900, 0.998931168800801020, 0.998933478677402120, 0.998935786056669660, 0.998938090938597760, 0.998940393323180520, -0.998942693210412290, 0.998944990600287410, 0.998947285492799990, 0.998949577887944360, 0.998951867785714880, 0.998954155186105640, 0.998956440089111110, 0.998958722494725390, -0.998961002402942830, 0.998963279813757770, 0.998965554727164640, 0.998967827143157460, 0.998970097061730790, 0.998972364482878960, 0.998974629406596090, 0.998976891832876750, -0.998979151761715150, 0.998981409193105630, 0.998983664127042540, 0.998985916563520430, 0.998988166502533410, 0.998990413944076060, 0.998992658888142590, 0.998994901334727570, -0.998997141283825220, 0.998999378735429990, 0.999001613689536440, 0.999003846146138690, 0.999006076105231510, 0.999008303566809030, 0.999010528530865800, 0.999012750997396280, -0.999014970966394800, 0.999017188437856030, 0.999019403411774200, 0.999021615888143870, 0.999023825866959480, 0.999026033348215600, 0.999028238331906570, 0.999030440818026940, -0.999032640806571280, 0.999034838297533920, 0.999037033290909540, 0.999039225786692580, 0.999041415784877480, 0.999043603285458940, 0.999045788288431270, 0.999047970793789260, -0.999050150801527260, 0.999052328311639930, 0.999054503324121710, 0.999056675838967290, 0.999058845856171110, 0.999061013375727840, 0.999063178397632030, 0.999065340921878380, -0.999067500948461310, 0.999069658477375390, 0.999071813508615400, 0.999073966042176020, 0.999076116078051580, 0.999078263616236860, 0.999080408656726430, 0.999082551199515060, -0.999084691244597310, 0.999086828791967750, 0.999088963841621270, 0.999091096393552200, 0.999093226447755560, 0.999095354004225670, 0.999097479062957540, 0.999099601623945620, -0.999101721687184810, 0.999103839252669660, 0.999105954320394840, 0.999108066890355250, 0.999110176962545340, 0.999112284536960100, 0.999114389613594110, 0.999116492192442140, -0.999118592273498970, 0.999120689856759390, 0.999122784942217960, 0.999124877529869560, 0.999126967619709090, 0.999129055211731120, 0.999131140305930530, 0.999133222902302000, -0.999135303000840520, 0.999137380601540780, 0.999139455704397550, 0.999141528309405720, 0.999143598416560090, 0.999145666025855420, 0.999147731137286500, 0.999149793750848340, -0.999151853866535710, 0.999153911484343520, 0.999155966604266420, 0.999158019226299430, 0.999160069350437440, 0.999162116976675230, 0.999164162105007800, 0.999166204735429830, -0.999168244867936540, 0.999170282502522490, 0.999172317639182790, 0.999174350277912240, 0.999176380418705820, 0.999178408061558550, 0.999180433206465100, 0.999182455853420690, -0.999184476002420220, 0.999186493653458350, 0.999188508806530430, 0.999190521461631120, 0.999192531618755540, 0.999194539277898590, 0.999196544439055370, 0.999198547102220780, -0.999200547267389830, 0.999202544934557510, 0.999204540103718730, 0.999206532774868710, 0.999208522948002330, 0.999210510623114610, 0.999212495800200660, 0.999214478479255490, -0.999216458660273980, 0.999218436343251470, 0.999220411528182860, 0.999222384215063150, 0.999224354403887460, 0.999226322094651010, 0.999228287287348690, 0.999230249981975630, -0.999232210178526930, 0.999234167876997810, 0.999236123077383190, 0.999238075779678270, 0.999240025983878180, 0.999241973689978020, 0.999243918897972930, 0.999245861607858000, -0.999247801819628470, 0.999249739533279340, 0.999251674748805940, 0.999253607466203400, 0.999255537685466710, 0.999257465406591330, 0.999259390629572250, 0.999261313354404600, -0.999263233581083710, 0.999265151309604800, 0.999267066539962890, 0.999268979272153410, 0.999270889506171490, 0.999272797242012350, 0.999274702479671210, 0.999276605219143190, -0.999278505460423850, 0.999280403203508080, 0.999282298448391450, 0.999284191195068950, 0.999286081443536030, 0.999287969193787930, 0.999289854445819860, 0.999291737199627160, -0.999293617455205170, 0.999295495212549010, 0.999297370471654230, 0.999299243232515950, 0.999301113495129620, 0.999302981259490570, 0.999304846525593930, 0.999306709293435240, -0.999308569563009730, 0.999310427334312860, 0.999312282607339950, 0.999314135382086240, 0.999315985658547290, 0.999317833436718320, 0.999319678716594770, 0.999321521498171990, -0.999323361781445430, 0.999325199566410530, 0.999327034853062510, 0.999328867641396950, 0.999330697931409270, 0.999332525723094830, 0.999334351016449070, 0.999336173811467440, -0.999337994108145390, 0.999339811906478250, 0.999341627206461690, 0.999343440008091060, 0.999345250311361790, 0.999347058116269450, 0.999348863422809370, 0.999350666230977240, -0.999352466540768370, 0.999354264352178330, 0.999356059665202580, 0.999357852479836880, 0.999359642796076360, 0.999361430613916800, 0.999363215933353640, 0.999364998754382450, -0.999366779076998780, 0.999368556901198190, 0.999370332226976130, 0.999372105054328390, 0.999373875383250180, 0.999375643213737400, 0.999377408545785490, 0.999379171379390140, -0.999380931714546780, 0.999382689551251090, 0.999384444889498620, 0.999386197729285160, 0.999387948070606160, 0.999389695913457280, 0.999391441257834190, 0.999393184103732460, -0.999394924451147750, 0.999396662300075730, 0.999398397650512080, 0.999400130502452470, 0.999401860855892550, 0.999403588710827910, 0.999405314067254300, 0.999407036925167410, -0.999408757284563020, 0.999410475145436570, 0.999412190507784070, 0.999413903371601080, 0.999415613736883260, 0.999417321603626510, 0.999419026971826390, 0.999420729841478670, -0.999422430212579150, 0.999424128085123600, 0.999425823459107690, 0.999427516334527200, 0.999429206711378030, 0.999430894589655730, 0.999432579969356190, 0.999434262850475210, -0.999435943233008660, 0.999437621116952220, 0.999439296502301680, 0.999440969389052910, 0.999442639777201710, 0.999444307666743970, 0.999445973057675460, 0.999447635949991970, -0.999449296343689400, 0.999450954238763620, 0.999452609635210320, 0.999454262533025610, 0.999455912932205260, 0.999457560832745060, 0.999459206234641020, 0.999460849137889020, -0.999462489542484840, 0.999464127448424390, 0.999465762855703650, 0.999467395764318530, 0.999469026174264810, 0.999470654085538700, 0.999472279498135770, 0.999473902412052250, -0.999475522827284020, 0.999477140743826990, 0.999478756161677030, 0.999480369080830160, 0.999481979501282370, 0.999483587423029670, 0.999485192846067960, 0.999486795770393340, -0.999488396196001720, 0.999489994122889080, 0.999491589551051440, 0.999493182480484910, 0.999494772911185380, 0.999496360843148860, 0.999497946276371450, 0.999499529210849280, -0.999501109646578230, 0.999502687583554320, 0.999504263021773750, 0.999505835961232550, 0.999507406401926700, 0.999508974343852440, 0.999510539787005660, 0.999512102731382580, -0.999513663176979210, 0.999515221123791650, 0.999516776571816150, 0.999518329521048580, 0.999519879971485280, 0.999521427923122260, 0.999522973375955640, 0.999524516329981630, -0.999526056785196240, 0.999527594741595800, 0.999529130199176330, 0.999530663157934040, 0.999532193617865160, 0.999533721578965690, 0.999535247041231980, 0.999536770004660120, -0.999538290469246360, 0.999539808434986910, 0.999541323901877890, 0.999542836869915520, 0.999544347339096140, 0.999545855309415860, 0.999547360780870920, 0.999548863753457640, -0.999550364227172140, 0.999551862202010750, 0.999553357677969710, 0.999554850655045240, 0.999556341133233660, 0.999557829112531330, 0.999559314592934340, 0.999560797574439050, -0.999562278057041790, 0.999563756040738770, 0.999565231525526450, 0.999566704511401060, 0.999568174998358820, 0.999569642986396170, 0.999571108475509450, 0.999572571465695000, -0.999574031956949050, 0.999575489949268040, 0.999576945442648300, 0.999578398437086180, 0.999579848932578120, 0.999581296929120340, 0.999582742426709410, 0.999584185425341550, -0.999585625925013320, 0.999587063925720940, 0.999588499427460970, 0.999589932430229760, 0.999591362934023620, 0.999592790938839130, 0.999594216444672720, 0.999595639451520630, -0.999597059959379530, 0.999598477968245860, 0.999599893478115840, 0.999601306488986150, 0.999602717000853240, 0.999604125013713540, 0.999605530527563510, 0.999606933542399600, -0.999608334058218360, 0.999609732075016360, 0.999611127592789920, 0.999612520611535830, 0.999613911131250310, 0.999615299151930040, 0.999616684673571450, 0.999618067696171230, -0.999619448219725930, 0.999620826244231870, 0.999622201769685750, 0.999623574796084210, 0.999624945323423720, 0.999626313351700820, 0.999627678880912090, 0.999629041911054280, -0.999630402442123760, 0.999631760474117280, 0.999633116007031420, 0.999634469040862840, 0.999635819575607990, 0.999637167611263530, 0.999638513147826260, 0.999639856185292610, -0.999641196723659480, 0.999642534762923200, 0.999643870303080660, 0.999645203344128430, 0.999646533886063170, 0.999647861928881660, 0.999649187472580360, 0.999650510517156250, -0.999651831062605690, 0.999653149108925660, 0.999654464656112740, 0.999655777704163690, 0.999657088253075200, 0.999658396302843920, 0.999659701853466750, 0.999661004904940250, -0.999662305457261200, 0.999663603510426490, 0.999664899064432680, 0.999666192119276650, 0.999667482674955200, 0.999668770731464980, 0.999670056288802790, 0.999671339346965500, -0.999672619905949910, 0.999673897965752790, 0.999675173526370920, 0.999676446587800970, 0.999677717150040060, 0.999678985213084850, 0.999680250776932120, 0.999681513841578770, -0.999682774407021580, 0.999684032473257540, 0.999685288040283450, 0.999686541108096070, 0.999687791676692310, 0.999689039746069150, 0.999690285316223390, 0.999691528387151810, -0.999692768958851510, 0.999694007031319280, 0.999695242604552000, 0.999696475678546690, 0.999697706253300120, 0.999698934328809300, 0.999700159905071110, 0.999701382982082550, -0.999702603559840530, 0.999703821638342040, 0.999705037217583970, 0.999706250297563210, 0.999707460878277000, 0.999708668959721990, 0.999709874541895420, 0.999711077624794050, -0.999712278208415130, 0.999713476292755420, 0.999714671877812040, 0.999715864963582000, 0.999717055550062180, 0.999718243637249810, 0.999719429225141900, 0.999720612313735320, -0.999721792903027320, 0.999722970993014770, 0.999724146583694680, 0.999725319675064390, 0.999726490267120680, 0.999727658359860880, 0.999728823953281890, 0.999729987047380810, -0.999731147642154760, 0.999732305737600860, 0.999733461333716100, 0.999734614430497830, 0.999735765027942920, 0.999736913126048620, 0.999738058724812140, 0.999739201824230370, -0.999740342424300650, 0.999741480525020100, 0.999742616126385820, 0.999743749228395040, 0.999744879831044870, 0.999746007934332440, 0.999747133538255060, 0.999748256642809860, -0.999749377247993950, 0.999750495353804670, 0.999751610960239120, 0.999752724067294540, 0.999753834674968140, 0.999754942783257160, 0.999756048392158920, 0.999757151501670440, -0.999758252111789040, 0.999759350222512170, 0.999760445833836830, 0.999761538945760360, 0.999762629558279990, 0.999763717671393160, 0.999764803285096980, 0.999765886399388900, -0.999766967014265930, 0.999768045129725610, 0.999769120745765290, 0.999770193862381970, 0.999771264479573320, 0.999772332597336440, 0.999773398215668800, 0.999774461334567600, -0.999775521954030300, 0.999776580074054120, 0.999777635694636510, 0.999778688815774810, 0.999779739437466450, 0.999780787559708670, 0.999781833182498910, 0.999782876305834620, -0.999783916929713130, 0.999784955054131900, 0.999785990679088240, 0.999787023804579510, 0.999788054430603370, 0.999789082557157040, 0.999790108184237970, 0.999791131311843610, -0.999792151939971510, 0.999793170068619010, 0.999794185697783560, 0.999795198827462590, 0.999796209457653680, 0.999797217588354270, 0.999798223219561800, 0.999799226351273720, -0.999800226983487580, 0.999801225116200950, 0.999802220749411270, 0.999803213883115990, 0.999804204517312670, 0.999805192651998850, 0.999806178287172000, 0.999807161422829770, -0.999808142058969620, 0.999809120195589100, 0.999810095832685760, 0.999811068970257290, 0.999812039608301010, 0.999813007746814700, 0.999813973385795920, 0.999814936525242120, -0.999815897165150960, 0.999816855305520110, 0.999817810946347140, 0.999818764087629600, 0.999819714729365150, 0.999820662871551470, 0.999821608514186110, 0.999822551657266740, -0.999823492300790930, 0.999824430444756440, 0.999825366089160840, 0.999826299234001900, 0.999827229879277190, 0.999828158024984370, 0.999829083671121110, 0.999830006817685190, -0.999830927464674280, 0.999831845612086050, 0.999832761259918160, 0.999833674408168390, 0.999834585056834420, 0.999835493205914030, 0.999836398855404870, 0.999837302005304740, -0.999838202655611300, 0.999839100806322430, 0.999839996457435820, 0.999840889608949120, 0.999841780260860240, 0.999842668413166940, 0.999843554065866890, 0.999844437218958100, -0.999845317872438130, 0.999846196026304870, 0.999847071680556090, 0.999847944835189680, 0.999848815490203320, 0.999849683645595010, 0.999850549301362520, 0.999851412457503530, -0.999852273114016140, 0.999853131270898030, 0.999853986928147090, 0.999854840085761200, 0.999855690743738150, 0.999856538902075930, 0.999857384560772330, 0.999858227719825240, -0.999859068379232660, 0.999859906538992370, 0.999860742199102260, 0.999861575359560330, 0.999862406020364470, 0.999863234181512680, 0.999864059843002640, 0.999864883004832560, -0.999865703667000340, 0.999866521829503750, 0.999867337492340910, 0.999868150655509600, 0.999868961319008040, 0.999869769482834010, 0.999870575146985630, 0.999871378311460780, -0.999872178976257460, 0.999872977141373800, 0.999873772806807560, 0.999874565972556970, 0.999875356638619930, 0.999876144804994540, 0.999876930471678690, 0.999877713638670620, -0.999878494305968200, 0.999879272473569560, 0.999880048141472800, 0.999880821309675820, 0.999881591978176830, 0.999882360146973960, 0.999883125816065090, 0.999883888985448440, -0.999884649655122030, 0.999885407825083950, 0.999886163495332440, 0.999886916665865490, 0.999887667336681220, 0.999888415507777850, 0.999889161179153390, 0.999889904350806050, -0.999890645022733950, 0.999891383194935200, 0.999892118867408030, 0.999892852040150550, 0.999893582713160980, 0.999894310886437430, 0.999895036559978020, 0.999895759733781090, -0.999896480407844850, 0.999897198582167300, 0.999897914256746790, 0.999898627431581420, 0.999899338106669530, 0.999900046282009350, 0.999900751957598980, 0.999901455133436760, -0.999902155809520910, 0.999902853985849660, 0.999903549662421340, 0.999904242839234070, 0.999904933516286180, 0.999905621693576000, 0.999906307371101750, 0.999906990548861780, -0.999907671226854310, 0.999908349405077670, 0.999909025083530080, 0.999909698262209990, 0.999910368941115620, 0.999911037120245430, 0.999911702799597510, 0.999912365979170440, -0.999913026658962420, 0.999913684838971810, 0.999914340519197030, 0.999914993699636320, 0.999915644380288130, 0.999916292561150890, 0.999916938242222940, 0.999917581423502620, -0.999918222104988370, 0.999918860286678530, 0.999919495968571550, 0.999920129150665750, 0.999920759832959800, 0.999921388015451830, 0.999922013698140380, 0.999922636881023900, -0.999923257564100940, 0.999923875747369740, 0.999924491430828840, 0.999925104614476700, 0.999925715298311870, 0.999926323482332680, 0.999926929166537800, 0.999927532350925460, -0.999928133035494330, 0.999928731220242950, 0.999929326905169670, 0.999929920090273040, 0.999930510775551620, 0.999931098961003960, 0.999931684646628630, 0.999932267832423950, -0.999932848518388710, 0.999933426704521230, 0.999934002390820310, 0.999934575577284270, 0.999935146263911890, 0.999935714450701620, 0.999936280137652010, 0.999936843324761740, -0.999937404012029350, 0.999937962199453520, 0.999938517887032700, 0.999939071074765650, 0.999939621762650830, 0.999940169950687020, 0.999940715638872770, 0.999941258827206750, -0.999941799515687510, 0.999942337704313840, 0.999942873393084410, 0.999943406581997650, 0.999943937271052460, 0.999944465460247400, 0.999944991149581130, 0.999945514339052430, -0.999946035028659970, 0.999946553218402310, 0.999947068908278450, 0.999947582098286820, 0.999948092788426220, 0.999948600978695420, 0.999949106669093090, 0.999949609859618000, -0.999950110550268830, 0.999950608741044470, 0.999951104431943570, 0.999951597622964930, 0.999952088314107200, 0.999952576505369390, 0.999953062196750060, 0.999953545388248100, -0.999954026079862280, 0.999954504271591380, 0.999954979963434190, 0.999955453155389580, 0.999955923847456350, 0.999956392039633270, 0.999956857731919220, 0.999957320924313000, -0.999957781616813590, 0.999958239809419670, 0.999958695502130120, 0.999959148694943840, 0.999959599387859720, 0.999960047580876530, 0.999960493273993280, 0.999960936467208740, -0.999961377160521910, 0.999961815353931690, 0.999962251047436860, 0.999962684241036400, 0.999963114934729220, 0.999963543128514320, 0.999963968822390580, 0.999964392016356780, -0.999964812710412150, 0.999965230904555470, 0.999965646598785620, 0.999966059793101710, 0.999966470487502650, 0.999966878681987410, 0.999967284376554910, 0.999967687571204240, -0.999968088265934420, 0.999968486460744320, 0.999968882155633070, 0.999969275350599540, 0.999969666045642860, 0.999970054240762020, 0.999970439935956020, 0.999970823131223870, -0.999971203826564680, 0.999971582021977560, 0.999971957717461500, 0.999972330913015410, 0.999972701608638600, 0.999973069804329980, 0.999973435500088770, 0.999973798695913850, -0.999974159391804560, 0.999974517587759790, 0.999974873283778760, 0.999975226479860590, 0.999975577176004270, 0.999975925372209030, 0.999976271068473980, 0.999976614264798220, -0.999976954961181000, 0.999977293157621410, 0.999977628854118450, 0.999977962050671580, 0.999978292747279670, 0.999978620943942080, 0.999978946640658010, 0.999979269837426470, -0.999979590534246790, 0.999979908731118080, 0.999980224428039690, 0.999980537625010710, 0.999980848322030380, 0.999981156519097910, 0.999981462216212650, 0.999981765413373580, -0.999982066110580270, 0.999982364307831610, 0.999982660005127140, 0.999982953202466000, 0.999983243899847500, 0.999983532097270870, 0.999983817794735440, 0.999984100992240440, -0.999984381689785210, 0.999984659887369070, 0.999984935584991130, 0.999985208782650960, 0.999985479480347770, 0.999985747678080910, 0.999986013375849580, 0.999986276573653240, -0.999986537271491230, 0.999986795469362980, 0.999987051167267600, 0.999987304365204670, 0.999987555063173380, 0.999987803261173310, 0.999988048959203680, 0.999988292157263920, -0.999988532855353500, 0.999988771053471730, 0.999989006751617950, 0.999989239949791720, 0.999989470647992370, 0.999989698846219350, 0.999989924544472110, 0.999990147742750080, -0.999990368441052600, 0.999990586639379230, 0.999990802337729410, 0.999991015536102590, 0.999991226234498210, 0.999991434432915720, 0.999991640131354780, 0.999991843329814610, -0.999992044028294890, 0.999992242226795060, 0.999992437925314560, 0.999992631123853060, 0.999992821822409890, 0.999993010020984730, 0.999993195719577120, 0.999993378918186400, -0.999993559616812240, 0.999993737815454200, 0.999993913514111820, 0.999994086712784670, 0.999994257411472300, 0.999994425610174260, 0.999994591308890230, 0.999994754507619650, -0.999994915206362190, 0.999995073405117510, 0.999995229103885050, 0.999995382302664600, 0.999995533001455610, 0.999995681200257840, 0.999995826899070850, 0.999995970097894320, -0.999996110796727900, 0.999996248995571160, 0.999996384694423760, 0.999996517893285470, 0.999996648592155870, 0.999996776791034600, 0.999996902489921460, 0.999997025688815990, -0.999997146387717970, 0.999997264586627080, 0.999997380285543080, 0.999997493484465540, 0.999997604183394340, 0.999997712382329150, 0.999997818081269640, 0.999997921280215580, -0.999998021979166760, 0.999998120178122840, 0.999998215877083600, 0.999998309076048920, 0.999998399775018370, 0.999998487973991820, 0.999998573672969180, 0.999998656871950000, -0.999998737570934160, 0.999998815769921560, 0.999998891468911850, 0.999998964667904940, 0.999999035366900600, 0.999999103565898610, 0.999999169264898960, 0.999999232463901320, -0.999999293162905700, 0.999999351361911760, 0.999999407060919500, 0.999999460259928700, 0.999999510958939240, 0.999999559157951020, 0.999999604856963820, 0.999999648055977740, -0.999999688754992460, 0.999999726954007960, 0.999999762653024150, 0.999999795852040910, 0.999999826551058240, 0.999999854750076020, 0.999999880449094050, 0.999999903648112530, -0.999999924347131140, 0.999999942546149990, 0.999999958245168960, 0.999999971444187950, 0.999999982143207180, 0.999999990342226310, 0.999999996041245560, 0.999999999240264840, -0.999999999939284010, 0.999999998138303310, 0.999999993837322520, 0.999999987036341740, 0.999999977735361090, 0.999999965934380450, 0.999999951633399830, 0.999999934832419330, -0.999999915531439080, 0.999999893730459060, 0.999999869429479270, 0.999999842628499720, 0.999999813327520640, 0.999999781526542010, 0.999999747225563950, 0.999999710424586570, -0.999999671123609770, 0.999999629322633980, 0.999999585021658980, 0.999999538220684990, 0.999999488919712240, 0.999999437118740730, 0.999999382817770680, 0.999999326016802190, -0.999999266715835280, 0.999999204914870270, 0.999999140613907270, 0.999999073812946390, 0.999999004511987750, 0.999998932711031690, 0.999998858410078300, 0.999998781609127700, -0.999998702308180220, 0.999998620507235980, 0.999998536206295090, 0.999998449405357980, 0.999998360104424670, 0.999998268303495470, 0.999998174002570630, 0.999998077201650350, -0.999997977900734860, 0.999997876099824490, 0.999997771798919350, 0.999997664998019790, 0.999997555697126120, 0.999997443896238570, 0.999997329595357360, 0.999997212794482840, -0.999997093493615210, 0.999996971692754920, 0.999996847391902310, 0.999996720591057380, 0.999996591290220780, 0.999996459489392640, 0.999996325188573400, 0.999996188387763390, -0.999996049086962820, 0.999995907286172160, 0.999995762985391720, 0.999995616184621850, 0.999995466883862980, 0.999995315083115450, 0.999995160782379600, 0.999995003981655860, -0.999994844680944570, 0.999994682880246290, 0.999994518579561230, 0.999994351778889850, 0.999994182478232570, 0.999994010677589860, 0.999993836376962150, 0.999993659576349890, -0.999993480275753410, 0.999993298475173260, 0.999993114174609790, 0.999992927374063640, 0.999992738073535170, 0.999992546273024810, 0.999992351972533110, 0.999992155172060530, -0.999991955871607500, 0.999991754071174580, 0.999991549770762320, 0.999991342970371180, 0.999991133670001700, 0.999990921869654440, 0.999990707569329840, 0.999990490769028350, -0.999990271468750750, 0.999990049668497470, 0.999989825368269080, 0.999989598568066020, 0.999989369267889060, 0.999989137467738650, 0.999988903167615460, 0.999988666367519930, -0.999988427067452720, 0.999988185267414510, 0.999987940967405840, 0.999987694167427280, 0.999987444867479480, 0.999987193067563120, 0.999986938767678750, 0.999986681967826920, -0.999986422668008520, 0.999986160868224010, 0.999985896568474140, 0.999985629768759490, 0.999985360469080820, 0.999985088669438690, 0.999984814369833890, 0.999984537570267060, -0.999984258270738780, 0.999983976471249920, 0.999983692171801160, 0.999983405372393160, 0.999983116073026590, 0.999982824273702330, 0.999982529974420940, 0.999982233175183200, -0.999981933875989880, 0.999981632076841760, 0.999981327777739630, 0.999981020978684020, 0.999980711679675950, 0.999980399880716190, 0.999980085581805290, 0.999979768782944260, -0.999979449484133750, 0.999979127685374560, 0.999978803386667670, 0.999978476588013750, 0.999978147289413590, 0.999977815490868170, 0.999977481192378060, 0.999977144393944360, -0.999976805095567740, 0.999976463297249100, 0.999976118998989420, 0.999975772200789260, 0.999975422902649850, 0.999975071104571730, 0.999974716806556030, 0.999974360008603510, -0.999974000710715070, 0.999973638912891700, 0.999973274615134190, 0.999972907817443410, 0.999972538519820490, 0.999972166722266190, 0.999971792424781400, 0.999971415627367240, -0.999971036330024490, 0.999970654532754130, 0.999970270235557180, 0.999969883438434510, 0.999969494141387140, 0.999969102344416050, 0.999968708047522140, 0.999968311250706510, -0.999967911953970170, 0.999967510157314000, 0.999967105860739000, 0.999966699064246290, 0.999966289767836860, 0.999965877971511600, 0.999965463675271730, 0.999965046879118250, -0.999964627583052050, 0.999964205787074350, 0.999963781491186030, 0.999963354695388440, 0.999962925399682350, 0.999962493604068970, 0.999962059308549310, 0.999961622513124480, -0.999961183217795700, 0.999960741422563860, 0.999960297127430290, 0.999959850332395870, 0.999959401037461840, 0.999958949242629290, 0.999958494947899460, 0.999958038153273330, -0.999957578858752140, 0.999957117064336990, 0.999956652770028990, 0.999956185975829470, 0.999955716681739330, 0.999955244887760000, 0.999954770593892590, 0.999954293800138230, -0.999953814506498120, 0.999953332712973490, 0.999952848419565440, 0.999952361626275320, 0.999951872333104340, 0.999951380540053610, 0.999950886247124470, 0.999950389454318130, -0.999949890161635820, 0.999949388369078760, 0.999948884076648280, 0.999948377284345600, 0.999947867992171830, 0.999947356200128530, 0.999946841908216810, 0.999946325116438000, -0.999945805824793310, 0.999945284033284200, 0.999944759741911770, 0.999944232950677580, 0.999943703659582630, 0.999943171868628580, 0.999942637577816540, 0.999942100787147850, -0.999941561496624050, 0.999941019706246270, 0.999940475416015940, 0.999939928625934390, 0.999939379336002960, 0.999938827546223210, 0.999938273256596340, 0.999937716467123820, -0.999937157177806960, 0.999936595388647210, 0.999936031099646020, 0.999935464310804710, 0.999934895022124850, 0.999934323233607650, 0.999933748945254660, 0.999933172157067230, -0.999932592869046900, 0.999932011081195120, 0.999931426793513320, 0.999930840006002960, 0.999930250718665480, 0.999929658931502430, 0.999929064644515140, 0.999928467857705280, -0.999927868571074190, 0.999927266784623400, 0.999926662498354490, 0.999926055712268890, 0.999925446426368270, 0.999924834640653960, 0.999924220355127510, 0.999923603569790490, -0.999922984284644540, 0.999922362499691130, 0.999921738214931800, 0.999921111430368100, 0.999920482146001710, 0.999919850361833950, 0.999919216077866710, 0.999918579294101440, -0.999917940010539570, 0.999917298227183000, 0.999916653944033060, 0.999916007161091640, 0.999915357878360060, 0.999914706095840210, 0.999914051813533540, 0.999913395031441720, -0.999912735749566410, 0.999912073967909270, 0.999911409686471960, 0.999910742905256060, 0.999910073624263430, 0.999909401843495530, 0.999908727562954120, 0.999908050782640890, -0.999907371502557600, 0.999906689722705800, 0.999906005443087280, 0.999905318663703800, 0.999904629384557040, 0.999903937605648660, 0.999903243326980440, 0.999902546548554150, -0.999901847270371460, 0.999901145492434140, 0.999900441214743970, 0.999899734437302730, 0.999899025160112090, 0.999898313383173920, 0.999897599106490010, 0.999896882330062020, -0.999896163053891950, 0.999895441277981360, 0.999894717002332230, 0.999893990226946250, 0.999893260951825290, 0.999892529176971250, 0.999891794902385780, 0.999891058128070890, -0.999890318854028350, 0.999889577080260050, 0.999888832806767770, 0.999888086033553390, 0.999887336760618920, 0.999886584987966010, 0.999885830715596560, 0.999885073943512670, -0.999884314671716010, 0.999883552900208580, 0.999882788628992270, 0.999882021858069070, 0.999881252587440650, 0.999880480817109230, 0.999879706547076590, 0.999878929777344600, -0.999878150507915400, 0.999877368738790740, 0.999876584469972740, 0.999875797701463180, 0.999875008433264270, 0.999874216665377680, 0.999873422397805630, 0.999872625630550020, -0.999871826363612830, 0.999871024596996060, 0.999870220330701830, 0.999869413564731910, 0.999868604299088530, 0.999867792533773670, 0.999866978268789230, 0.999866161504137430, -0.999865342239820270, 0.999864520475839620, 0.999863696212197730, 0.999862869448896570, 0.999862040185938270, 0.999861208423324930, 0.999860374161058550, 0.999859537399141130, -0.999858698137575000, 0.999857856376362040, 0.999857012115504480, 0.999856165355004320, 0.999855316094863780, 0.999854464335084960, 0.999853610075669970, 0.999852753316621050, -0.999851894057940170, 0.999851032299629460, 0.999850168041691360, 0.999849301284127740, 0.999848432026940850, 0.999847560270132880, 0.999846686013705970, 0.999845809257662420, -0.999844930002004360, 0.999844048246734010, 0.999843163991853470, 0.999842277237364960, 0.999841387983270820, 0.999840496229573270, 0.999839601976274420, 0.999838705223376590, -0.999837805970882010, 0.999836904218792790, 0.999835999967111480, 0.999835093215840080, 0.999834183964980920, 0.999833272214536330, 0.999832357964508640, 0.999831441214899970, -0.999830521965712760, 0.999829600216949220, 0.999828675968611580, 0.999827749220702390, 0.999826819973223760, 0.999825888226178020, 0.999824953979567720, 0.999824017233394870, -0.999823077987662120, 0.999822136242371600, 0.999821191997525730, 0.999820245253126960, 0.999819296009177520, 0.999818344265679840, 0.999817390022636250, 0.999816433280049210, -0.999815474037921150, 0.999814512296254400, 0.999813548055051290, 0.999812581314314390, 0.999811612074046010, 0.999810640334248600, 0.999809666094924500, 0.999808689356076360, -0.999807710117706420, 0.999806728379817320, 0.999805744142411300, 0.999804757405490910, 0.999803768169058690, 0.999802776433116990, 0.999801782197668350, 0.999800785462715340, -0.999799786228260270, 0.999798784494305810, 0.999797780260854310, 0.999796773527908410, 0.999795764295470570, 0.999794752563543330, 0.999793738332129260, 0.999792721601230780, -0.999791702370850470, 0.999790680640990970, 0.999789656411654740, 0.999788629682844320, 0.999787600454562390, 0.999786568726811380, 0.999785534499594060, 0.999784497772912890, -0.999783458546770420, 0.999782416821169310, 0.999781372596112110, 0.999780325871601590, 0.999779276647640210, 0.999778224924230630, 0.999777170701375510, 0.999776113979077400, -0.999775054757339080, 0.999773993036163100, 0.999772928815552130, 0.999771862095508830, 0.999770792876035870, 0.999769721157136030, 0.999768646938811730, 0.999767570221065880, -0.999766491003901140, 0.999765409287320160, 0.999764325071325620, 0.999763238355920290, 0.999762149141106840, 0.999761057426888140, 0.999759963213266660, 0.999758866500245260, -0.999757767287826840, 0.999756665576013840, 0.999755561364809250, 0.999754454654215750, 0.999753345444236110, 0.999752233734873100, 0.999751119526129610, 0.999750002818008190, -0.999748883610511840, 0.999747761903643230, 0.999746637697405240, 0.999745510991800650, 0.999744381786832230, 0.999743250082502980, 0.999742115878815450, 0.999740979175772760, -0.999739839973377560, 0.999738698271632750, 0.999737554070541210, 0.999736407370105830, 0.999735258170329380, 0.999734106471214860, 0.999732952272764930, 0.999731795574982820, -0.999730636377871070, 0.999729474681432690, 0.999728310485670790, 0.999727143790588020, 0.999725974596187390, 0.999724802902471790, 0.999723628709444310, 0.999722452017107630, -0.999721272825464860, 0.999720091134518870, 0.999718906944272680, 0.999717720254729270, 0.999716531065891530, 0.999715339377762470, 0.999714145190345070, 0.999712948503642230, -0.999711749317657160, 0.999710547632392640, 0.999709343447851780, 0.999708136764037470, 0.999706927580952920, 0.999705715898601020, 0.999704501716984770, 0.999703285036107280, -0.999702065855971660, 0.999700844176580890, 0.999699619997937880, 0.999698393320045950, 0.999697164142907990, 0.999695932466527100, 0.999694698290906400, 0.999693461616048880, -0.999692222441957770, 0.999690980768636160, 0.999689736596087060, 0.999688489924313580, 0.999687240753318940, 0.999685989083106130, 0.999684734913678370, 0.999683478245038780, -0.999682219077190460, 0.999680957410136630, 0.999679693243880400, 0.999678426578424980, 0.999677157413773390, 0.999675885749929050, 0.999674611586894860, 0.999673334924674250, -0.999672055763270230, 0.999670774102686120, 0.999669489942925040, 0.999668203283990200, 0.999666914125884930, 0.999665622468612350, 0.999664328312175670, 0.999663031656578220, -0.999661732501823220, 0.999660430847913780, 0.999659126694853350, 0.999657820042645140, 0.999656510891292260, 0.999655199240798150, 0.999653885091166040, 0.999652568442399250, -0.999651249294501110, 0.999649927647474730, 0.999648603501323560, 0.999647276856050930, 0.999645947711660040, 0.999644616068154250, 0.999643281925536980, 0.999641945283811560, -0.999640606142981230, 0.999639264503049300, 0.999637920364019330, 0.999636573725894540, 0.999635224588678260, 0.999633872952373940, 0.999632518816985010, 0.999631162182514690, -0.999629803048966540, 0.999628441416343770, 0.999627077284649950, 0.999625710653888500, 0.999624341524062650, 0.999622969895176070, 0.999621595767232090, 0.999620219140234020, -0.999618840014185440, 0.999617458389089770, 0.999616074264950360, 0.999614687641770860, 0.999613298519554610, 0.999611906898305150, 0.999610512778025930, 0.999609116158720390, -0.999607717040392090, 0.999606315423044460, 0.999604911306681050, 0.999603504691305430, 0.999602095576920920, 0.999600683963531300, 0.999599269851139890, 0.999597853239750370, -0.999596434129366160, 0.999595012519990830, 0.999593588411628040, 0.999592161804281230, 0.999590732697954070, 0.999589301092650100, 0.999587866988372880, 0.999586430385125850, -0.999584991282912890, 0.999583549681737460, 0.999582105581602990, 0.999580658982513360, 0.999579209884472130, 0.999577758287482850, 0.999576304191549190, 0.999574847596674700, -0.999573388502863150, 0.999571926910118090, 0.999570462818443200, 0.999568996227842230, 0.999567527138318760, 0.999566055549876430, 0.999564581462518920, 0.999563104876250110, -0.999561625791073440, 0.999560144206992680, 0.999558660124011510, 0.999557173542133800, 0.999555684461363110, 0.999554192881703220, 0.999552698803157890, 0.999551202225730790, -0.999549703149425590, 0.999548201574246290, 0.999546697500196310, 0.999545190927279780, 0.999543681855500130, 0.999542170284861360, 0.999540656215367140, 0.999539139647021240, -0.999537620579827530, 0.999536099013789700, 0.999534574948911740, 0.999533048385197300, 0.999531519322650160, 0.999529987761274330, 0.999528453701073460, 0.999526917142051440, -0.999525378084212270, 0.999523836527559490, 0.999522292472097230, 0.999520745917829130, 0.999519196864759210, 0.999517645312891330, 0.999516091262229400, 0.999514534712777180, -0.999512975664538560, 0.999511414117517540, 0.999509850071718000, 0.999508283527143830, 0.999506714483799020, 0.999505142941687350, 0.999503568900812820, 0.999501992361179430, -0.999500413322790940, 0.999498831785651460, 0.999497247749765010, 0.999495661215135330, 0.999494072181766560, 0.999492480649662560, 0.999490886618827350, 0.999489290089264900, -0.999487691060979340, 0.999486089533974440, 0.999484485508254420, 0.999482878983823150, 0.999481269960684650, 0.999479658438843010, 0.999478044418302130, 0.999476427899066210, -0.999474808881139270, 0.999473187364525280, 0.999471563349228260, 0.999469936835252430, 0.999468307822601650, 0.999466676311280170, 0.999465042301291960, 0.999463405792641150, -0.999461766785331940, 0.999460125279368230, 0.999458481274754120, 0.999456834771493940, 0.999455185769591580, 0.999453534269051370, 0.999451880269877190, 0.999450223772073380, -0.999448564775644030, 0.999446903280593270, 0.999445239286925190, 0.999443572794644020, 0.999441903803753970, 0.999440232314259160, 0.999438558326163680, 0.999436881839471880, -0.999435202854187850, 0.999433521370315820, 0.999431837387860010, 0.999430150906824630, 0.999428461927213800, 0.999426770449031830, 0.999425076472282960, 0.999423379996971390, -0.999421681023101360, 0.999419979550677180, 0.999418275579703090, 0.999416569110183170, 0.999414860142121890, 0.999413148675523440, 0.999411434710392180, 0.999409718246732300, -0.999407999284548150, 0.999406277823843950, 0.999404553864624120, 0.999402827406892790, 0.999401098450654500, 0.999399366995913470, 0.999397633042673930, 0.999395896590940410, -0.999394157640717040, 0.999392416192008360, 0.999390672244818590, 0.999388925799152170, 0.999387176855013440, 0.999385425412406820, 0.999383671471336550, 0.999381915031807180, -0.999380156093822910, 0.999378394657388310, 0.999376630722507820, 0.999374864289185650, 0.999373095357426240, 0.999371323927234270, 0.999369549998613830, 0.999367773571569580, -0.999365994646105980, 0.999364213222227350, 0.999362429299938130, 0.999360642879242870, 0.999358853960146010, 0.999357062542652000, 0.999355268626765270, 0.999353472212490490, -0.999351673299831990, 0.999349871888794320, 0.999348067979381920, 0.999346261571599340, 0.999344452665451130, 0.999342641260941860, 0.999340827358075940, 0.999339010956857950, -0.999337192057292430, 0.999335370659383940, 0.999333546763137020, 0.999331720368556110, 0.999329891475646100, 0.999328060084411220, 0.999326226194856230, 0.999324389806985680, -0.999322550920804240, 0.999320709536316350, 0.999318865653526680, 0.999317019272439770, 0.999315170393060390, 0.999313319015393110, 0.999311465139442580, 0.999309608765213350, -0.999307749892709980, 0.999305888521937360, 0.999304024652899910, 0.999302158285602540, 0.999300289420049670, 0.999298418056246200, 0.999296544194196560, 0.999294667833905640, -0.999292788975377990, 0.999290907618618380, 0.999289023763631490, 0.999287137410422080, 0.999285248558994810, 0.999283357209354350, 0.999281463361505580, 0.999279567015453170, -0.999277668171201780, 0.999275766828756300, 0.999273862988121380, 0.999271956649301680, 0.999270047812302220, 0.999268136477127640, 0.999266222643782620, 0.999264306312272140, -0.999262387482600880, 0.999260466154773600, 0.999258542328795190, 0.999256616004670420, 0.999254687182404180, 0.999252755862001130, 0.999250822043466270, 0.999248885726804260, -0.999246946912020100, 0.999245005599118550, 0.999243061788104510, 0.999241115478982760, 0.999239166671758270, 0.999237215366435840, 0.999235261563020450, 0.999233305261516770, -0.999231346461929900, 0.999229385164264630, 0.999227421368525940, 0.999225455074718720, 0.999223486282847850, 0.999221514992918220, 0.999219541204934840, 0.999217564918902570, -0.999215586134826420, 0.999213604852711270, 0.999211621072562230, 0.999209634794383960, 0.999207646018181790, 0.999205654743960390, 0.999203660971724860, 0.999201664701480200, -0.999199665933231280, 0.999197664666983340, 0.999195660902741150, 0.999193654640509910, 0.999191645880294410, 0.999189634622099860, 0.999187620865931270, 0.999185604611793510, -0.999183585859691800, 0.999181564609631150, 0.999179540861616530, 0.999177514615653070, 0.999175485871745870, 0.999173454629899930, 0.999171420890120340, 0.999169384652412230, -0.999167345916780690, 0.999165304683230730, 0.999163260951767440, 0.999161214722396160, 0.999159165995121780, 0.999157114769949390, 0.999155061046884340, 0.999153004825931500, -0.999150946107096320, 0.999148884890383670, 0.999146821175798780, 0.999144754963346980, 0.999142686253033150, 0.999140615044862620, 0.999138541338840610, 0.999136465134972230, -0.999134386433262690, 0.999132305233717210, 0.999130221536340900, 0.999128135341139090, 0.999126046648116880, 0.999123955457279610, 0.999121861768632380, 0.999119765582180630, -0.999117666897929360, 0.999115565715884000, 0.999113462036049670, 0.999111355858431690, 0.999109247183035290, 0.999107136009865780, 0.999105022338928510, 0.999102906170228680, -0.999100787503771510, 0.999098666339562350, 0.999096542677606610, 0.999094416517909530, 0.999092287860476320, 0.999090156705312430, 0.999088023052423170, 0.999085886901813770, -0.999083748253489780, 0.999081607107456300, 0.999079463463718900, 0.999077317322282780, 0.999075168683153380, 0.999073017546336040, 0.999070863911836190, 0.999068707779659170, -0.999066549149810410, 0.999064388022295250, 0.999062224397119110, 0.999060058274287450, 0.999057889653805600, 0.999055718535679090, 0.999053544919913160, 0.999051368806513460, -0.999049190195485330, 0.999047009086834300, 0.999044825480565610, 0.999042639376684920, 0.999040450775197650, 0.999038259676109150, 0.999036066079425080, 0.999033869985150870, -0.999031671393291960, 0.999029470303853920, 0.999027266716842170, 0.999025060632262150, 0.999022852050119650, 0.999020640970419870, 0.999018427393168600, 0.999016211318371260, -0.999013992746033310, 0.999011771676160510, 0.999009548108758190, 0.999007322043831910, 0.999005093481387440, 0.999002862421430220, 0.999000628863965900, 0.998998392808999940, -0.998996154256537980, 0.998993913206585700, 0.998991669659148540, 0.998989423614232260, 0.998987175071842430, 0.998984924031984690, 0.998982670494664600, 0.998980414459887830, -0.998978155927660040, 0.998975894897986880, 0.998973631370873920, 0.998971365346326910, 0.998969096824351530, 0.998966825804953440, 0.998964552288138190, 0.998962276273911650, -0.998959997762279280, 0.998957716753247070, 0.998955433246820460, 0.998953147243005320, 0.998950858741807330, 0.998948567743232150, 0.998946274247285550, 0.998943978253973300, -0.998941679763301060, 0.998939378775274610, 0.998937075289899830, 0.998934769307182280, 0.998932460827127830, 0.998930149849742150, 0.998927836375031130, 0.998925520403000640, -0.998923201933656250, 0.998920880967003820, 0.998918557503049250, 0.998916231541798210, 0.998913903083256670, 0.998911572127430310, 0.998909238674325130, 0.998906902723946780, -0.998904564276301140, 0.998902223331394110, 0.998899879889231570, 0.998897533949819280, 0.998895185513163140, 0.998892834579269140, 0.998890481148142940, 0.998888125219790650, -0.998885766794217920, 0.998883405871430870, 0.998881042451435270, 0.998878676534237010, 0.998876308119842180, 0.998873937208256460, 0.998871563799486050, 0.998869187893536630, -0.998866809490414180, 0.998864428590124810, 0.998862045192674300, 0.998859659298068750, 0.998857270906313930, 0.998854880017416070, 0.998852486631380930, 0.998850090748214630, -0.998847692367923030, 0.998845291490512270, 0.998842888115988200, 0.998840482244356950, 0.998838073875624510, 0.998835663009796980, 0.998833249646880140, 0.998830833786880200, -0.998828415429803270, 0.998825994575655240, 0.998823571224442210, 0.998821145376170280, 0.998818717030845460, 0.998816286188473850, 0.998813852849061550, 0.998811417012614560, -0.998808978679139090, 0.998806537848641150, 0.998804094521126840, 0.998801648696602370, 0.998799200375073750, 0.998796749556547180, 0.998794296241028560, 0.998791840428524310, -0.998789382119040450, 0.998786921312583180, 0.998784458009158600, 0.998781992208772840, 0.998779523911432100, 0.998777053117142600, 0.998774579825910340, 0.998772104037741750, -0.998769625752642940, 0.998767144970619910, 0.998764661691679210, 0.998762175915826720, 0.998759687643068770, 0.998757196873411690, 0.998754703606861580, 0.998752207843424670, -0.998749709583107270, 0.998747208825915610, 0.998744705571856020, 0.998742199820934600, 0.998739691573157560, 0.998737180828531360, 0.998734667587062310, 0.998732151848756520, -0.998729633613620330, 0.998727112881660050, 0.998724589652882020, 0.998722063927292570, 0.998719535704897910, 0.998717004985704370, 0.998714471769718280, 0.998711936056946080, -0.998709397847394100, 0.998706857141068550, 0.998704313937975870, 0.998701768238122400, 0.998699220041514570, 0.998696669348158590, 0.998694116158061030, 0.998691560471228090, -0.998689002287666330, 0.998686441607382070, 0.998683878430381640, 0.998681312756671490, 0.998678744586258160, 0.998676173919147870, 0.998673600755347170, 0.998671025094862500, -0.998668446937700290, 0.998665866283867000, 0.998663283133368940, 0.998660697486212780, 0.998658109342404730, 0.998655518701951460, 0.998652925564859410, 0.998650329931135120, -0.998647731800784920, 0.998645131173815480, 0.998642528050233120, 0.998639922430044400, 0.998637314313255970, 0.998634703699874170, 0.998632090589905760, 0.998629474983356970, -0.998626856880234560, 0.998624236280545090, 0.998621613184294880, 0.998618987591490700, 0.998616359502139010, 0.998613728916246560, 0.998611095833819680, 0.998608460254865050, -0.998605822179389310, 0.998603181607399030, 0.998600538538900740, 0.998597892973901110, 0.998595244912406700, 0.998592594354424270, 0.998589941299960370, 0.998587285749021560, -0.998584627701614600, 0.998581967157745940, 0.998579304117422460, 0.998576638580650710, 0.998573970547437350, 0.998571300017789150, 0.998568626991712560, 0.998565951469214450, -0.998563273450301490, 0.998560592934980340, 0.998557909923257770, 0.998555224415140330, 0.998552536410634790, 0.998549845909748050, 0.998547152912486640, 0.998544457418857330, -0.998541759428866920, 0.998539058942522040, 0.998536355959829480, 0.998533650480796120, 0.998530942505428620, 0.998528232033733750, 0.998525519065718290, 0.998522803601389120, -0.998520085640752900, 0.998517365183816400, 0.998514642230586500, 0.998511916781069990, 0.998509188835273730, 0.998506458393204510, 0.998503725454869100, 0.998500990020274480, -0.998498252089427220, 0.998495511662334410, 0.998492768739002830, 0.998490023319439370, 0.998487275403650790, 0.998484524991643970, 0.998481772083425920, 0.998479016679003520, -0.998476258778383420, 0.998473498381572730, 0.998470735488578340, 0.998467970099407020, 0.998465202214065870, 0.998462431832561670, 0.998459658954901410, 0.998456883581091970, -0.998454105711140350, 0.998451325345053430, 0.998448542482838210, 0.998445757124501680, 0.998442969270050720, 0.998440178919492330, 0.998437386072833500, 0.998434590730081230, -0.998431792891242510, 0.998428992556324220, 0.998426189725333480, 0.998423384398277270, 0.998420576575162700, 0.998417766255996540, 0.998414953440786010, 0.998412138129538110, -0.998409320322259820, 0.998406500018958360, 0.998403677219640520, 0.998400851924313600, 0.998398024132984400, 0.998395193845660330, 0.998392361062348080, 0.998389525783055070, -0.998386688007788180, 0.998383847736554530, 0.998381004969361330, 0.998378159706215680, 0.998375311947124480, 0.998372461692095150, 0.998369608941134470, 0.998366753694249990, -0.998363895951448480, 0.998361035712737270, 0.998358172978123460, 0.998355307747614270, 0.998352440021216810, 0.998349569798938190, 0.998346697080785610, 0.998343821866766400, -0.998340944156887570, 0.998338063951156430, 0.998335181249580090, 0.998332296052165780, 0.998329408358920810, 0.998326518169852290, 0.998323625484967340, 0.998320730304273480, -0.998317832627777730, 0.998314932455487410, 0.998312029787409850, 0.998309124623552150, 0.998306216963921630, 0.998303306808525530, 0.998300394157371150, 0.998297479010465840, -0.998294561367816800, 0.998291641229431480, 0.998288718595316870, 0.998285793465480630, 0.998282865839929870, 0.998279935718671800, 0.998277003101713970, 0.998274067989063710, -0.998271130380728230, 0.998268190276714980, 0.998265247677031180, 0.998262302581684250, 0.998259354990681640, 0.998256404904030560, 0.998253452321738450, 0.998250497243812870, -0.998247539670260920, 0.998244579601090140, 0.998241617036307870, 0.998238651975921650, 0.998235684419938710, 0.998232714368366580, 0.998229741821212710, 0.998226766778484540, -0.998223789240189400, 0.998220809206334710, 0.998217826676928040, 0.998214841651976830, 0.998211854131488500, 0.998208864115470500, 0.998205871603930370, 0.998202876596875680, -0.998199879094313620, 0.998196879096251990, 0.998193876602698090, 0.998190871613659490, 0.998187864129143730, 0.998184854149158360, 0.998181841673710820, 0.998178826702808660, -0.998175809236459430, 0.998172789274670680, 0.998169766817449950, 0.998166741864804810, 0.998163714416742790, 0.998160684473271550, 0.998157652034398550, 0.998154617100131540, -0.998151579670477850, 0.998148539745445260, 0.998145497325041320, 0.998142452409273570, 0.998139404998149790, 0.998136355091677420, 0.998133302689864220, 0.998130247792717750, -0.998127190400245670, 0.998124130512455630, 0.998121068129355080, 0.998118003250952120, 0.998114935877253970, 0.998111866008268620, 0.998108793644003510, 0.998105718784466520, -0.998102641429665090, 0.998099561579607110, 0.998096479234300230, 0.998093394393752220, 0.998090307057970640, 0.998087217226963360, 0.998084124900737950, 0.998081030079302380, -0.998077932762664100, 0.998074832950830990, 0.998071730643810830, 0.998068625841611380, 0.998065518544240300, 0.998062408751705490, 0.998059296464014590, 0.998056181681175490, -0.998053064403195970, 0.998049944630083670, 0.998046822361846610, 0.998043697598492430, 0.998040570340029130, 0.998037440586464260, 0.998034308337805930, 0.998031173594061680, -0.998028036355239620, 0.998024896621347410, 0.998021754392392930, 0.998018609668384070, 0.998015462449328820, 0.998012312735234830, 0.998009160526110000, 0.998006005821962310, -0.998002848622799530, 0.997999688928629780, 0.997996526739460710, 0.997993362055300310, 0.997990194876156590, 0.997987025202037300, 0.997983853032950560, 0.997980678368904140, -0.997977501209905920, 0.997974321555963990, 0.997971139407086370, 0.997967954763280820, 0.997964767624555330, 0.997961577990918000, 0.997958385862376730, 0.997955191238939500, -0.997951994120614190, 0.997948794507409030, 0.997945592399331780, 0.997942387796390550, 0.997939180698593440, 0.997935971105948340, 0.997932759018463340, 0.997929544436146340, -0.997926327359005550, 0.997923107787048960, 0.997919885720284560, 0.997916661158720460, 0.997913434102364770, 0.997910204551225370, 0.997906972505310570, 0.997903737964628280, -0.997900500929186700, 0.997897261398993820, 0.997894019374057750, 0.997890774854386710, 0.997887527839988690, 0.997884278330871900, 0.997881026327044340, 0.997877771828514230, -0.997874514835289770, 0.997871255347378970, 0.997867993364790040, 0.997864728887531080, 0.997861461915610310, 0.997858192449035950, 0.997854920487815990, 0.997851646031958860, -0.997848369081472560, 0.997845089636365310, 0.997841807696645430, 0.997838523262320920, 0.997835236333400210, 0.997831946909891410, 0.997828654991802620, 0.997825360579142170, -0.997822063671918500, 0.997818764270139600, 0.997815462373813690, 0.997812157982949310, 0.997808851097554350, 0.997805541717637360, 0.997802229843206430, 0.997798915474270020, -0.997795598610836330, 0.997792279252913580, 0.997788957400510210, 0.997785633053634440, 0.997782306212294470, 0.997778976876498860, 0.997775645046255710, 0.997772310721573460, -0.997768973902460550, 0.997765634588925090, 0.997762292780975610, 0.997758948478620340, 0.997755601681867830, 0.997752252390726070, 0.997748900605203830, 0.997745546325309430, -0.997742189551050980, 0.997738830282437260, 0.997735468519476370, 0.997732104262176730, 0.997728737510546800, 0.997725368264595120, 0.997721996524330020, 0.997718622289759940, -0.997715245560893300, 0.997711866337738560, 0.997708484620304150, 0.997705100408598500, 0.997701713702630060, 0.997698324502407470, 0.997694932807938970, 0.997691538619233100, -0.997688141936298510, 0.997684742759143540, 0.997681341087776620, 0.997677936922206410, 0.997674530262441240, 0.997671121108489880, 0.997667709460360760, 0.997664295318062220, -0.997660878681603020, 0.997657459550991720, 0.997654037926236640, 0.997650613807346430, 0.997647187194329770, 0.997643758087195080, 0.997640326485951130, 0.997636892390606270, -0.997633455801169130, 0.997630016717648390, 0.997626575140052710, 0.997623131068390400, 0.997619684502670360, 0.997616235442901120, 0.997612783889091360, 0.997609329841249610, -0.997605873299384440, 0.997602414263504710, 0.997598952733618760, 0.997595488709735580, 0.997592022191863710, 0.997588553180011720, 0.997585081674188360, 0.997581607674402290, -0.997578131180662190, 0.997574652192976810, 0.997571170711354700, 0.997567686735804650, 0.997564200266335520, 0.997560711302955870, 0.997557219845674360, 0.997553725894499870, -0.997550229449441050, 0.997546730510506570, 0.997543229077705320, 0.997539725151046050, 0.997536218730537440, 0.997532709816188250, 0.997529198408007360, 0.997525684506003430, -0.997522168110185240, 0.997518649220561660, 0.997515127837141470, 0.997511603959933430, 0.997508077588946440, 0.997504548724189260, 0.997501017365670760, 0.997497483513399620, -0.997493947167384820, 0.997490408327635030, 0.997486866994159340, 0.997483323166966420, 0.997479776846065260, 0.997476228031464630, 0.997472676723173410, 0.997469122921200490, -0.997465566625554740, 0.997462007836245170, 0.997458446553280530, 0.997454882776669830, 0.997451316506421830, 0.997447747742545630, 0.997444176485050020, 0.997440602733943970, -0.997437026489236380, 0.997433447750936230, 0.997429866519052410, 0.997426282793594020, 0.997422696574569940, 0.997419107861989060, 0.997415516655860480, 0.997411922956193080, -0.997408326762995730, 0.997404728076277670, 0.997401126896047870, 0.997397523222315230, 0.997393917055088730, 0.997390308394377480, 0.997386697240190360, 0.997383083592536580, -0.997379467451425030, 0.997375848816864920, 0.997372227688865130, 0.997368604067434770, 0.997364977952582830, 0.997361349344318530, 0.997357718242650850, 0.997354084647588790, -0.997350448559141680, 0.997346809977318280, 0.997343168902128040, 0.997339525333579720, 0.997335879271682660, 0.997332230716445940, 0.997328579667878580, 0.997324926125989660, -0.997321270090788640, 0.997317611562284380, 0.997313950540485990, 0.997310287025402810, 0.997306621017043930, 0.997302952515418450, 0.997299281520535600, 0.997295608032404580, -0.997291932051034500, 0.997288253576434580, 0.997284572608614140, 0.997280889147582170, 0.997277203193348010, 0.997273514745920740, 0.997269823805309710, 0.997266130371524230, -0.997262434444573410, 0.997258736024466460, 0.997255035111212720, 0.997251331704821280, 0.997247625805301570, 0.997243917412662830, 0.997240206526914250, 0.997236493148065170, -0.997232777276124920, 0.997229058911102580, 0.997225338053007730, 0.997221614701849560, 0.997217888857637290, 0.997214160520380140, 0.997210429690087770, 0.997206696366769400, -0.997202960550434110, 0.997199222241091590, 0.997195481438750920, 0.997191738143421550, 0.997187992355112800, 0.997184244073834100, 0.997180493299594790, 0.997176740032404200, -0.997172984272271860, 0.997169226019206990, 0.997165465273219140, 0.997161702034317530, 0.997157936302511590, 0.997154168077810990, 0.997150397360224930, 0.997146624149762850, -0.997142848446434190, 0.997139070250248390, 0.997135289561215000, 0.997131506379343340, 0.997127720704642840, 0.997123932537123170, 0.997120141876793540, 0.997116348723663730, -0.997112553077742940, 0.997108754939040720, 0.997104954307566740, 0.997101151183330310, 0.997097345566340890, 0.997093537456608230, 0.997089726854141660, 0.997085913758950840, -0.997082098171045320, 0.997078280090434420, 0.997074459517127810, 0.997070636451135030, 0.997066810892465740, 0.997062982841129490, 0.997059152297135710, 0.997055319260493960, -0.997051483731213990, 0.997047645709305370, 0.997043805194777530, 0.997039962187640240, 0.997036116687903040, 0.997032268695575490, 0.997028418210667340, 0.997024565233188160, -0.997020709763147490, 0.997016851800555100, 0.997012991345420540, 0.997009128397753570, 0.997005262957563750, 0.997001395024860740, 0.996997524599654290, 0.996993651681953970, -0.996989776271769660, 0.996985898369110780, 0.996982017973987110, 0.996978135086408420, 0.996974249706384490, 0.996970361833924960, 0.996966471469039380, 0.996962578611737760, -0.996958683262029630, 0.996954785419924770, 0.996950885085432950, 0.996946982258563930, 0.996943076939327490, 0.996939169127733280, 0.996935258823791190, 0.996931346027510990, -0.996927430738902440, 0.996923512957975210, 0.996919592684739180, 0.996915669919204330, 0.996911744661380220, 0.996907816911276720, 0.996903886668903730, 0.996899953934271000, -0.996896018707388420, 0.996892080988265650, 0.996888140776912790, 0.996884198073339610, 0.996880252877555990, 0.996876305189571600, 0.996872355009396530, 0.996868402337040550, -0.996864447172513550, 0.996860489515825400, 0.996856529366986100, 0.996852566726005420, 0.996848601592893350, 0.996844633967659770, 0.996840663850314670, 0.996836691240867820, -0.996832716139329220, 0.996828738545708860, 0.996824758460016720, 0.996820775882262590, 0.996816790812456670, 0.996812803250608610, 0.996808813196728650, 0.996804820650826650, -0.996800825612912500, 0.996796828082996300, 0.996792828061088150, 0.996788825547197830, 0.996784820541335550, 0.996780813043511070, 0.996776803053734730, 0.996772790572016180, -0.996768775598365740, 0.996764758132793420, 0.996760738175309190, 0.996756715725923060, 0.996752690784645230, 0.996748663351485600, 0.996744633426454360, 0.996740601009561410, -0.996736566100817070, 0.996732528700231320, 0.996728488807814280, 0.996724446423575940, 0.996720401547526500, 0.996716354179676080, 0.996712304320034770, 0.996708251968612680, -0.996704197125419910, 0.996700139790466790, 0.996696079963763190, 0.996692017645319450, 0.996687952835145660, 0.996683885533252050, 0.996679815739648590, 0.996675743454345730, -0.996671668677353460, 0.996667591408682000, 0.996663511648341550, 0.996659429396342330, 0.996655344652694560, 0.996651257417408450, 0.996647167690494110, 0.996643075471961850, -0.996638980761822000, 0.996634883560084670, 0.996630783866760180, 0.996626681681858640, 0.996622577005390480, 0.996618469837365790, 0.996614360177794920, 0.996610248026688180, -0.996606133384055790, 0.996602016249908180, 0.996597896624255460, 0.996593774507107950, 0.996589649898476090, 0.996585522798369980, 0.996581393206800170, 0.996577261123776870, -0.996573126549310410, 0.996568989483411110, 0.996564849926089400, 0.996560707877355510, 0.996556563337219870, 0.996552416305692800, 0.996548266782784630, 0.996544114768505910, -0.996539960262866840, 0.996535803265877980, 0.996531643777549440, 0.996527481797891970, 0.996523317326915570, 0.996519150364631010, 0.996514980911048620, 0.996510808966178720, -0.996506634530031850, 0.996502457602618350, 0.996498278183948650, 0.996494096274033400, 0.996489911872882720, 0.996485724980507360, 0.996481535596917770, 0.996477343722124260, -0.996473149356137400, 0.996468952498967610, 0.996464753150625550, 0.996460551311121550, 0.996456346980466150, 0.996452140158669900, 0.996447930845743230, 0.996443719041696820, -0.996439504746541190, 0.996435287960286690, 0.996431068682943950, 0.996426846914523550, 0.996422622655036120, 0.996418395904491990, 0.996414166662902060, 0.996409934930276520, -0.996405700706626260, 0.996401463991961720, 0.996397224786293560, 0.996392983089632200, 0.996388738901988540, 0.996384492223373000, 0.996380243053796240, 0.996375991393268820, -0.996371737241801500, 0.996367480599404720, 0.996363221466089240, 0.996358959841865840, 0.996354695726744950, 0.996350429120737350, 0.996346160023853680, 0.996341888436104610, -0.996337614357500790, 0.996333337788053000, 0.996329058727771670, 0.996324777176667900, 0.996320493134752130, 0.996316206602035130, 0.996311917578527550, 0.996307626064240280, -0.996303332059183980, 0.996299035563369180, 0.996294736576806890, 0.996290435099507770, 0.996286131131482570, 0.996281824672741960, 0.996277515723296920, 0.996273204283158020, -0.996268890352336120, 0.996264573930841890, 0.996260255018686310, 0.996255933615880160, 0.996251609722434090, 0.996247283338358990, 0.996242954463665730, 0.996238623098365080, -0.996234289242467930, 0.996229952895984930, 0.996225614058927070, 0.996221272731305230, 0.996216928913130180, 0.996212582604412810, 0.996208233805164100, 0.996203882515394710, -0.996199528735115520, 0.996195172464337530, 0.996190813703071720, 0.996186452451328860, 0.996182088709119840, 0.996177722476455640, 0.996173353753347040, 0.996168982539805130, -0.996164608835840680, 0.996160232641464800, 0.996155853956688260, 0.996151472781522160, 0.996147089115977380, 0.996142702960064910, 0.996138314313795630, 0.996133923177180520, -0.996129529550230600, 0.996125133432956830, 0.996120734825370340, 0.996116333727481980, 0.996111930139302770, 0.996107524060843800, 0.996103115492115940, 0.996098704433130310, -0.996094290883897890, 0.996089874844429790, 0.996085456314736990, 0.996081035294830500, 0.996076611784721510, 0.996072185784421030, 0.996067757293939930, 0.996063326313289530, -0.996058892842480730, 0.996054456881524830, 0.996050018430432730, 0.996045577489215630, 0.996041134057884530, 0.996036688136450630, 0.996032239724924940, 0.996027788823318660, -0.996023335431642900, 0.996018879549908860, 0.996014421178127660, 0.996009960316310280, 0.996005496964468160, 0.996001031122612180, 0.995996562790753550, 0.995992091968903700, -0.995987618657073530, 0.995983142855274340, 0.995978664563517250, 0.995974183781813570, 0.995969700510174420, 0.995965214748610990, 0.995960726497134410, 0.995956235755756090, -0.995951742524487260, 0.995947246803339010, 0.995942748592322680, 0.995938247891449470, 0.995933744700730710, 0.995929239020177490, 0.995924730849801150, 0.995920220189613010, -0.995915707039624400, 0.995911191399846410, 0.995906673270290480, 0.995902152650967930, 0.995897629541889980, 0.995893103943067850, 0.995888575854513070, 0.995884045276236750, -0.995879512208250440, 0.995874976650565240, 0.995870438603192690, 0.995865898066144010, 0.995861355039430630, 0.995856809523063770, 0.995852261517054860, 0.995847711021415450, -0.995843158036156640, 0.995838602561289980, 0.995834044596826900, 0.995829484142778610, 0.995824921199156550, 0.995820355765972280, 0.995815787843237100, 0.995811217430962460, -0.995806644529159790, 0.995802069137840420, 0.995797491257016000, 0.995792910886697750, 0.995788328026897210, 0.995783742677625930, 0.995779154838895340, 0.995774564510716780, -0.995769971693101770, 0.995765376386062000, 0.995760778589608650, 0.995756178303753400, 0.995751575528507570, 0.995746970263882920, 0.995742362509890900, 0.995737752266542930, -0.995733139533850560, 0.995728524311825350, 0.995723906600478830, 0.995719286399822430, 0.995714663709867940, 0.995710038530626780, 0.995705410862110620, 0.995700780704330770, -0.995696148057299110, 0.995691512921026980, 0.995686875295526130, 0.995682235180808010, 0.995677592576884260, 0.995672947483766670, 0.995668299901466660, 0.995663649829995890, -0.995658997269366020, 0.995654342219588710, 0.995649684680675500, 0.995645024652637930, 0.995640362135487900, 0.995635697129237050, 0.995631029633896940, 0.995626359649479210, -0.995621687175995530, 0.995617012213457770, 0.995612334761877270, 0.995607654821266120, 0.995602972391635750, 0.995598287472997940, 0.995593600065364570, 0.995588910168747070, -0.995584217783157310, 0.995579522908606960, 0.995574825545107790, 0.995570125692671560, 0.995565423351310150, 0.995560718521035120, 0.995556011201858220, 0.995551301393791330, -0.995546589096846240, 0.995541874311034580, 0.995537157036368360, 0.995532437272859120, 0.995527715020518840, 0.995522990279359310, 0.995518263049392280, 0.995513533330629640, -0.995508801123083150, 0.995504066426764480, 0.995499329241685830, 0.995494589567858860, 0.995489847405295340, 0.995485102754007260, 0.995480355614006380, 0.995475605985304600, -0.995470853867913900, 0.995466099261845930, 0.995461342167112790, 0.995456582583726270, 0.995451820511698340, 0.995447055951040880, 0.995442288901765670, 0.995437519363884800, -0.995432747337410160, 0.995427972822353620, 0.995423195818727180, 0.995418416326542710, 0.995413634345812200, 0.995408849876547650, 0.995404062918760930, 0.995399273472464040, -0.995394481537668960, 0.995389687114387690, 0.995384890202632320, 0.995380090802414630, 0.995375288913746710, 0.995370484536640570, 0.995365677671108170, 0.995360868317161640, -0.995356056474812840, 0.995351242144074000, 0.995346425324957100, 0.995341606017474120, 0.995336784221637070, 0.995331959937458040, 0.995327133164949140, 0.995322303904122350, -0.995317472154989890, 0.995312637917563750, 0.995307801191856020, 0.995302961977878710, 0.995298120275644130, 0.995293276085164160, 0.995288429406451010, 0.995283580239516690, -0.995278728584373500, 0.995273874441033550, 0.995269017809508830, 0.995264158689811550, 0.995259297081953930, 0.995254432985948070, 0.995249566401806060, 0.995244697329540240, -0.995239825769162590, 0.995234951720685430, 0.995230075184120880, 0.995225196159481240, 0.995220314646778510, 0.995215430646025020, 0.995210544157232760, 0.995205655180414370, -0.995200763715581750, 0.995195869762747320, 0.995190973321923080, 0.995186074393121570, 0.995181172976354780, 0.995176269071635030, 0.995171362678974550, 0.995166453798385750, -0.995161542429880860, 0.995156628573472090, 0.995151712229171760, 0.995146793396992080, 0.995141872076945490, 0.995136948269044090, 0.995132021973300420, 0.995127093189726700, -0.995122161918335250, 0.995117228159138390, 0.995112291912148450, 0.995107353177377860, 0.995102411954838730, 0.995097468244543590, 0.995092522046504890, 0.995087573360734830, -0.995082622187245860, 0.995077668526050400, 0.995072712377160660, 0.995067753740589200, 0.995062792616348220, 0.995057829004450390, 0.995052862904907910, 0.995047894317733330, -0.995042923242939080, 0.995037949680537490, 0.995032973630541000, 0.995027995092962030, 0.995023014067813020, 0.995018030555106630, 0.995013044554855060, 0.995008056067070880, -0.995003065091766610, 0.994998071628954710, 0.994993075678647590, 0.994988077240857800, 0.994983076315597680, 0.994978072902880100, 0.994973067002717150, 0.994968058615121610, -0.994963047740106020, 0.994958034377682710, 0.994953018527864330, 0.994948000190663320, 0.994942979366092330, 0.994937956054163910, 0.994932930254890710, 0.994927901968285070, -0.994922871194359740, 0.994917837933127270, 0.994912802184600100, 0.994907763948790880, 0.994902723225712380, 0.994897680015377040, 0.994892634317797510, 0.994887586132986330, -0.994882535460956290, 0.994877482301719910, 0.994872426655289740, 0.994867368521678450, 0.994862307900898800, 0.994857244792963450, 0.994852179197884930, 0.994847111115675920, -0.994842040546349280, 0.994836967489917460, 0.994831891946393100, 0.994826813915789090, 0.994821733398118080, 0.994816650393392730, 0.994811564901625810, 0.994806476922829970, -0.994801386457017880, 0.994796293504202290, 0.994791198064395980, 0.994786100137611710, 0.994780999723862140, 0.994775896823160140, 0.994770791435518390, 0.994765683560949630, -0.994760573199466760, 0.994755460351082310, 0.994750345015809280, 0.994745227193660430, 0.994740106884648420, 0.994734984088786240, 0.994729858806086550, 0.994724731036562230, -0.994719600780226030, 0.994714468037090850, 0.994709332807169440, 0.994704195090474810, 0.994699054887019710, 0.994693912196816910, 0.994688767019879410, 0.994683619356219850, -0.994678469205851350, 0.994673316568786550, 0.994668161445038560, 0.994663003834620140, 0.994657843737544290, 0.994652681153823770, 0.994647516083471570, 0.994642348526500570, -0.994637178482923660, 0.994632005952753810, 0.994626830936004010, 0.994621653432687050, 0.994616473442816010, 0.994611290966403770, 0.994606106003463330, 0.994600918554007670, -0.994595728618049570, 0.994590536195602230, 0.994585341286678530, 0.994580143891291460, 0.994574944009454120, 0.994569741641179390, 0.994564536786480270, 0.994559329445369840, -0.994554119617861000, 0.994548907303966940, 0.994543692503700560, 0.994538475217075060, 0.994533255444103310, 0.994528033184798430, 0.994522808439173400, 0.994517581207241320, -0.994512351489015400, 0.994507119284508630, 0.994501884593734010, 0.994496647416704630, 0.994491407753433700, 0.994486165603934210, 0.994480920968219380, 0.994475673846302090, -0.994470424238195760, 0.994465172143913280, 0.994459917563467970, 0.994454660496872810, 0.994449400944141030, 0.994444138905285710, 0.994438874380319970, 0.994433607369257120, -0.994428337872110270, 0.994423065888892620, 0.994417791419617280, 0.994412514464297460, 0.994407235022946260, 0.994401953095577110, 0.994396668682202890, 0.994391381782837150, -0.994386092397492980, 0.994380800526183490, 0.994375506168922010, 0.994370209325721840, 0.994364909996596100, 0.994359608181558110, 0.994354303880620960, 0.994348997093798200, -0.994343687821102940, 0.994338376062548380, 0.994333061818147960, 0.994327745087914880, 0.994322425871862480, 0.994317104170003850, 0.994311779982352540, 0.994306453308921760, -0.994301124149724940, 0.994295792504775290, 0.994290458374086140, 0.994285121757670810, 0.994279782655542730, 0.994274441067715120, 0.994269096994201410, 0.994263750435015030, -0.994258401390169190, 0.994253049859677440, 0.994247695843553100, 0.994242339341809390, 0.994236980354459950, 0.994231618881517900, 0.994226254922996880, 0.994220888478910330, -0.994215519549271450, 0.994210148134093810, 0.994204774233390820, 0.994199397847175810, 0.994194018975462330, 0.994188637618263820, 0.994183253775593690, 0.994177867447465500, -0.994172478633892580, 0.994167087334888570, 0.994161693550466800, 0.994156297280640700, 0.994150898525423820, 0.994145497284829820, 0.994140093558872010, 0.994134687347564050, -0.994129278650919380, 0.994123867468951430, 0.994118453801673850, 0.994113037649100080, 0.994107619011243780, 0.994102197888118380, 0.994096774279737530, 0.994091348186114780, -0.994085919607263560, 0.994080488543197640, 0.994075054993930450, 0.994069618959475540, 0.994064180439846680, 0.994058739435057400, 0.994053295945121260, 0.994047849970051910, -0.994042401509862890, 0.994036950564567870, 0.994031497134180490, 0.994026041218714180, 0.994020582818182950, 0.994015121932600220, 0.994009658561979760, 0.994004192706335110, -0.993998724365679930, 0.993993253540027990, 0.993987780229392830, 0.993982304433788320, 0.993976826153228020, 0.993971345387725690, 0.993965862137294990, 0.993960376401949670, -0.993954888181703300, 0.993949397476569850, 0.993943904286562650, 0.993938408611695910, 0.993932910451983060, 0.993927409807437990, 0.993921906678074450, 0.993916401063906110, -0.993910892964946720, 0.993905382381210070, 0.993899869312709900, 0.993894353759460230, 0.993888835721474570, 0.993883315198766940, 0.993877792191350860, 0.993872266699240450, -0.993866738722449240, 0.993861208260991220, 0.993855675314880170, 0.993850139884130070, 0.993844601968754460, 0.993839061568767450, 0.993833518684182790, 0.993827973315014270, -0.993822425461275860, 0.993816875122981220, 0.993811322300144570, 0.993805766992779560, 0.993800209200900180, 0.993794648924520300, 0.993789086163653690, 0.993783520918314460, -0.993777953188516250, 0.993772382974273390, 0.993766810275599430, 0.993761235092508580, 0.993755657425014480, 0.993750077273131360, 0.993744494636872980, 0.993738909516253430, -0.993733321911286490, 0.993727731821986370, 0.993722139248366830, 0.993716544190441970, 0.993710946648225790, 0.993705346621732270, 0.993699744110975280, 0.993694139115969040, -0.993688531636727320, 0.993682921673264330, 0.993677309225594050, 0.993671694293730480, 0.993666076877687710, 0.993660456977479730, 0.993654834593120650, 0.993649209724624340, -0.993643582372005120, 0.993637952535276980, 0.993632320214453910, 0.993626685409550010, 0.993621048120579500, 0.993615408347556350, 0.993609766090494560, 0.993604121349408340, -0.993598474124311900, 0.993592824415219340, 0.993587172222144650, 0.993581517545102040, 0.993575860384105610, 0.993570200739169570, 0.993564538610307910, 0.993558873997535060, -0.993553206900865020, 0.993547537320311870, 0.993541865255889940, 0.993536190707613340, 0.993530513675496270, 0.993524834159552950, 0.993519152159797360, 0.993513467676244040, -0.993507780708907110, 0.993502091257800650, 0.993496399322938980, 0.993490704904336330, 0.993485008002006900, 0.993479308615964900, 0.993473606746224540, 0.993467902392800360, -0.993462195555706360, 0.993456486234956860, 0.993450774430566170, 0.993445060142548520, 0.993439343370918220, 0.993433624115689470, 0.993427902376876840, 0.993422178154494410, -0.993416451448556500, 0.993410722259077450, 0.993404990586071570, 0.993399256429553290, 0.993393519789536830, 0.993387780666036500, 0.993382039059066750, 0.993376294968641990, -0.993370548394776450, 0.993364799337484560, 0.993359047796780640, 0.993353293772679110, 0.993347537265194420, 0.993341778274340670, 0.993336016800132620, 0.993330252842584580, -0.993324486401710780, 0.993318717477525870, 0.993312946070044170, 0.993307172179280110, 0.993301395805248010, 0.993295616947962420, 0.993289835607437890, 0.993284051783688730, -0.993278265476729480, 0.993272476686574590, 0.993266685413238480, 0.993260891656735590, 0.993255095417080460, 0.993249296694287630, 0.993243495488371650, 0.993237691799346840, -0.993231885627227860, 0.993226076972029140, 0.993220265833765210, 0.993214452212450530, 0.993208636108099730, 0.993202817520727480, 0.993196996450348090, 0.993191172896976340, -0.993185346860626540, 0.993179518341313460, 0.993173687339051540, 0.993167853853855200, 0.993162017885739430, 0.993156179434718680, 0.993150338500807360, 0.993144495084020250, -0.993138649184371890, 0.993132800801876940, 0.993126949936549930, 0.993121096588405530, 0.993115240757458380, 0.993109382443723150, 0.993103521647214490, 0.993097658367947060, -0.993091792605935500, 0.993085924361194360, 0.993080053633738410, 0.993074180423582420, 0.993068304730740930, 0.993062426555228690, 0.993056545897060380, 0.993050662756250760, -0.993044777132814360, 0.993038889026766180, 0.993032998438120540, 0.993027105366892540, 0.993021209813096830, 0.993015311776748070, 0.993009411257861020, 0.993003508256450450, -0.992997602772531020, 0.992991694806117710, 0.992985784357225070, 0.992979871425867970, 0.992973956012061290, 0.992968038115819680, 0.992962117737157920, 0.992956194876090880, -0.992950269532633430, 0.992944341706800130, 0.992938411398606170, 0.992932478608066100, 0.992926543335194810, 0.992920605580007280, 0.992914665342518150, 0.992908722622742320, -0.992902777420694770, 0.992896829736390150, 0.992890879569843570, 0.992884926921069780, 0.992878971790083660, 0.992873014176900100, 0.992867054081533970, 0.992861091504000260, -0.992855126444313730, 0.992849158902489480, 0.992843188878542280, 0.992837216372487230, 0.992831241384339090, 0.992825263914112740, 0.992819283961823280, 0.992813301527485700, -0.992807316611114650, 0.992801329212725570, 0.992795339332332990, 0.992789346969952140, 0.992783352125597980, 0.992777354799285310, 0.992771354991029310, 0.992765352700844980, -0.992759347928747090, 0.992753340674750960, 0.992747330938871570, 0.992741318721123700, 0.992735304021522660, 0.992729286840083320, 0.992723267176820690, 0.992717245031749850, -0.992711220404886020, 0.992705193296244070, 0.992699163705839220, 0.992693131633686440, 0.992687097079800850, 0.992681060044197430, 0.992675020526891380, 0.992668978527897710, -0.992662934047231720, 0.992656887084908400, 0.992650837640942860, 0.992644785715350200, 0.992638731308145510, 0.992632674419344110, 0.992626615048960990, 0.992620553197011150, -0.992614488863510110, 0.992608422048472880, 0.992602352751914550, 0.992596280973850330, 0.992590206714295430, 0.992584129973264950, 0.992578050750774100, 0.992571969046838200, -0.992565884861472460, 0.992559798194691870, 0.992553709046511860, 0.992547617416947640, 0.992541523306014310, 0.992535426713727190, 0.992529327640101380, 0.992523226085152310, -0.992517122048895310, 0.992511015531345350, 0.992504906532517990, 0.992498795052428220, 0.992492681091091570, 0.992486564648523140, 0.992480445724738260, 0.992474324319752350, -0.992468200433580640, 0.992462074066238430, 0.992455945217741050, 0.992449813888103830, 0.992443680077341960, 0.992437543785470890, 0.992431405012506040, 0.992425263758462740, -0.992419120023356190, 0.992412973807201840, 0.992406825110015100, 0.992400673931811310, 0.992394520272605770, 0.992388364132413820, 0.992382205511251110, 0.992376044409132850, -0.992369880826074580, 0.992363714762091510, 0.992357546217199180, 0.992351375191413030, 0.992345201684748270, 0.992339025697220660, 0.992332847228845400, 0.992326666279638060, -0.992320482849614160, 0.992314296938788920, 0.992308108547177990, 0.992301917674796810, 0.992295724321660690, 0.992289528487785400, 0.992283330173186260, 0.992277129377878820, -0.992270926101878500, 0.992264720345200970, 0.992258512107861530, 0.992252301389875860, 0.992246088191259370, 0.992239872512027720, 0.992233654352196460, 0.992227433711781020, -0.992221210590796930, 0.992214984989259860, 0.992208756907185350, 0.992202526344588830, 0.992196293301486070, 0.992190057777892600, 0.992183819773823970, 0.992177579289295840, -0.992171336324323750, 0.992165090878923240, 0.992158842953110080, 0.992152592546899690, 0.992146339660307960, 0.992140084293350320, 0.992133826446042530, 0.992127566118400140, -0.992121303310438800, 0.992115038022174270, 0.992108770253621990, 0.992102500004797940, 0.992096227275717560, 0.992089952066396720, 0.992083674376850970, 0.992077394207095950, -0.992071111557147560, 0.992064826427021320, 0.992058538816732890, 0.992052248726298270, 0.992045956155732990, 0.992039661105052820, 0.992033363574273520, 0.992027063563410860, -0.992020761072480490, 0.992014456101498190, 0.992008148650479700, 0.992001838719440920, 0.991995526308397490, 0.991989211417365290, 0.991982894046360090, 0.991976574195397640, -0.991970251864493720, 0.991963927053664100, 0.991957599762924750, 0.991951269992291440, 0.991944937741779940, 0.991938603011406130, 0.991932265801185760, 0.991925926111134730, -0.991919583941268890, 0.991913239291604020, 0.991906892162156110, 0.991900542552940910, 0.991894190463974420, 0.991887835895272520, 0.991881478846850960, 0.991875119318725740, -0.991868757310912730, 0.991862392823427590, 0.991856025856286740, 0.991849656409505730, 0.991843284483100660, 0.991836910077087300, 0.991830533191481730, 0.991824153826299740, -0.991817771981557290, 0.991811387657270620, 0.991805000853455350, 0.991798611570127610, 0.991792219807303370, 0.991785825564998610, 0.991779428843229230, 0.991773029642011310, -0.991766627961360610, 0.991760223801293580, 0.991753817161825980, 0.991747408042973790, 0.991740996444753110, 0.991734582367179930, 0.991728165810270230, 0.991721746774040120, -0.991715325258505700, 0.991708901263682940, 0.991702474789587950, 0.991696045836236720, 0.991689614403645450, 0.991683180491830130, 0.991676744100806860, 0.991670305230591630, -0.991663863881200760, 0.991657420052650120, 0.991650973744956030, 0.991644524958134490, 0.991638073692201690, 0.991631619947173640, 0.991625163723066530, 0.991618705019896460, -0.991612243837679650, 0.991605780176432310, 0.991599314036170520, 0.991592845416910400, 0.991586374318668140, 0.991579900741460070, 0.991573424685302070, 0.991566946150210570, -0.991560465136201770, 0.991553981643291780, 0.991547495671496800, 0.991541007220833160, 0.991534516291316950, 0.991528022882964490, 0.991521526995791770, 0.991515028629815440, -0.991508527785051500, 0.991502024461516250, 0.991495518659225920, 0.991489010378196810, 0.991482499618445150, 0.991475986379987240, 0.991469470662839300, 0.991462952467017880, -0.991456431792538950, 0.991449908639418950, 0.991443383007674210, 0.991436854897320920, 0.991430324308375630, 0.991423791240854340, 0.991417255694773680, 0.991410717670149990, -0.991404177166999360, 0.991397634185338330, 0.991391088725183220, 0.991384540786550470, 0.991377990369456290, 0.991371437473916980, 0.991364882099949330, 0.991358324247569310, -0.991351763916793580, 0.991345201107638460, 0.991338635820120270, 0.991332068054255560, 0.991325497810060520, 0.991318925087551820, 0.991312349886745880, 0.991305772207659030, -0.991299192050307700, 0.991292609414708430, 0.991286024300877640, 0.991279436708831780, 0.991272846638587280, 0.991266254090160670, 0.991259659063568500, 0.991253061558827200, -0.991246461575953200, 0.991239859114963040, 0.991233254175873270, 0.991226646758700310, 0.991220036863460720, 0.991213424490171020, 0.991206809638847890, 0.991200192309507620, -0.991193572502167000, 0.991186950216842330, 0.991180325453550280, 0.991173698212307390, 0.991167068493130300, 0.991160436296035560, 0.991153801621039830, 0.991147164468159430, -0.991140524837411220, 0.991133882728811640, 0.991127238142377460, 0.991120591078125000, 0.991113941536071130, 0.991107289516232500, 0.991100635018625550, 0.991093978043267040, -0.991087318590173630, 0.991080656659361960, 0.991073992250848470, 0.991067325364650030, 0.991060656000783410, 0.991053984159265160, 0.991047309840111800, 0.991040633043340340, -0.991033953768967190, 0.991027272017009240, 0.991020587787482920, 0.991013901080405210, 0.991007211895792880, 0.991000520233662360, 0.990993826094030640, 0.990987129476914360, -0.990980430382330300, 0.990973728810295110, 0.990967024760825430, 0.990960318233938380, 0.990953609229650480, 0.990946897747978620, 0.990940183788939440, 0.990933467352549830, -0.990926748438826550, 0.990920027047786370, 0.990913303179446150, 0.990906576833822660, 0.990899848010932780, 0.990893116710793280, 0.990886382933420910, 0.990879646678832660, -0.990872907947045300, 0.990866166738075480, 0.990859423051940410, 0.990852676888656750, 0.990845928248241470, 0.990839177130711350, 0.990832423536083250, 0.990825667464374060, -0.990818908915600760, 0.990812147889780110, 0.990805384386929110, 0.990798618407064740, 0.990791849950203750, 0.990785079016363150, 0.990778305605559910, 0.990771529717810790, -0.990764751353132910, 0.990757970511543130, 0.990751187193058440, 0.990744401397695820, 0.990737613125472150, 0.990730822376404530, 0.990724029150509720, 0.990717233447804930, -0.990710435268306930, 0.990703634612033040, 0.990696831478999900, 0.990690025869224830, 0.990683217782724610, 0.990676407219516330, 0.990669594179617090, 0.990662778663043750, -0.990655960669813540, 0.990649140199943430, 0.990642317253450530, 0.990635491830351820, 0.990628663930664290, 0.990621833554405140, 0.990615000701591470, 0.990608165372240170, -0.990601327566368540, 0.990594487283993570, 0.990587644525132480, 0.990580799289802140, 0.990573951578019860, 0.990567101389802750, 0.990560248725167900, 0.990553393584132190, -0.990546535966713270, 0.990539675872927900, 0.990532813302793300, 0.990525948256326780, 0.990519080733545330, 0.990512210734466160, 0.990505338259106470, 0.990498463307483480, -0.990491585879614280, 0.990484705975516190, 0.990477823595206200, 0.990470938738701840, 0.990464051406020010, 0.990457161597178120, 0.990450269312193150, 0.990443374551082670, -0.990436477313863640, 0.990429577600553500, 0.990422675411169460, 0.990415770745728730, 0.990408863604248510, 0.990401953986746130, 0.990395041893238790, 0.990388127323744040, -0.990381210278278860, 0.990374290756860680, 0.990367368759506710, 0.990360444286234380, 0.990353517337061010, 0.990346587912003700, 0.990339656011079980, 0.990332721634307080, -0.990325784781702410, 0.990318845453283410, 0.990311903649067180, 0.990304959369071150, 0.990298012613312850, 0.990291063381809280, 0.990284111674578190, 0.990277157491636920, -0.990270200833002660, 0.990263241698692950, 0.990256280088725130, 0.990249316003116500, 0.990242349441884610, 0.990235380405046880, 0.990228408892620760, 0.990221434904623550, -0.990214458441072810, 0.990207479501985840, 0.990200498087380310, 0.990193514197273420, 0.990186527831682710, 0.990179538990625720, 0.990172547674119890, 0.990165553882182750, -0.990158557614831740, 0.990151558872084280, 0.990144557653957920, 0.990137553960470210, 0.990130547791638450, 0.990123539147480410, 0.990116528028013640, 0.990109514433255460, -0.990102498363223500, 0.990095479817935330, 0.990088458797408480, 0.990081435301660260, 0.990074409330708670, 0.990067380884571020, 0.990060349963264970, 0.990053316566807950, -0.990046280695217720, 0.990039242348511710, 0.990032201526707680, 0.990025158229822950, 0.990018112457875520, 0.990011064210882810, 0.990004013488862360, 0.989996960291831930, -0.989989904619809070, 0.989982846472811540, 0.989975785850856770, 0.989968722753962530, 0.989961657182146460, 0.989954589135426330, 0.989947518613819800, 0.989940445617344400, -0.989933370146017900, 0.989926292199857950, 0.989919211778882090, 0.989912128883108420, 0.989905043512554370, 0.989897955667237820, 0.989890865347176300, 0.989883772552387580, -0.989876677282889530, 0.989869579538699700, 0.989862479319835840, 0.989855376626315840, 0.989848271458157460, 0.989841163815378460, 0.989834053697996490, 0.989826941106029310, -0.989819826039494920, 0.989812708498410740, 0.989805588482794980, 0.989798465992665190, 0.989791341028039230, 0.989784213588934980, 0.989777083675370210, 0.989769951287362670, -0.989762816424930250, 0.989755679088090700, 0.989748539276862020, 0.989741396991262070, 0.989734252231308620, 0.989727104997019440, 0.989719955288412610, 0.989712803105505800, -0.989705648448317100, 0.989698491316864050, 0.989691331711164970, 0.989684169631237510, 0.989677005077099660, 0.989669838048769290, 0.989662668546264280, 0.989655496569602610, -0.989648322118802160, 0.989641145193880910, 0.989633965794856850, 0.989626783921747850, 0.989619599574572020, 0.989612412753347100, 0.989605223458091100, 0.989598031688822100, -0.989590837445557870, 0.989583640728316730, 0.989576441537116440, 0.989569239871974980, 0.989562035732910570, 0.989554829119940970, 0.989547620033084270, 0.989540408472358470, -0.989533194437781760, 0.989525977929372020, 0.989518758947147360, 0.989511537491125860, 0.989504313561325400, 0.989497087157764300, 0.989489858280460430, 0.989482626929431670, -0.989475393104696680, 0.989468156806273090, 0.989460918034179020, 0.989453676788432770, 0.989446433069052330, 0.989439186876055810, 0.989431938209461290, 0.989424687069286770, -0.989417433455550670, 0.989410177368271080, 0.989402918807466000, 0.989395657773153530, 0.989388394265351970, 0.989381128284079540, 0.989373859829354000, 0.989366588901194000, -0.989359315499617530, 0.989352039624642800, 0.989344761276287900, 0.989337480454571150, 0.989330197159510760, 0.989322911391124830, 0.989315623149431440, 0.989308332434449160, -0.989301039246196060, 0.989293743584690350, 0.989286445449950260, 0.989279144841994080, 0.989271841760840040, 0.989264536206506340, 0.989257228179011290, 0.989249917678373230, -0.989242604704610340, 0.989235289257740960, 0.989227971337783400, 0.989220650944755860, 0.989213328078676790, 0.989206002739564160, 0.989198674927436630, 0.989191344642312510, -0.989184011884210010, 0.989176676653147460, 0.989169338949143270, 0.989161998772215670, 0.989154656122383070, 0.989147310999663690, 0.989139963404076280, 0.989132613335638840, -0.989125260794369910, 0.989117905780287800, 0.989110548293410940, 0.989103188333757770, 0.989095825901346370, 0.989088460996195630, 0.989081093618323750, 0.989073723767749050, -0.989066351444490180, 0.989058976648565350, 0.989051599379993100, 0.989044219638791740, 0.989036837424979830, 0.989029452738575900, 0.989022065579598380, 0.989014675948065690, -0.989007283843996280, 0.988999889267408670, 0.988992492218321310, 0.988985092696752830, 0.988977690702721350, 0.988970286236245830, 0.988962879297344610, 0.988955469886036220, -0.988948058002339090, 0.988940643646271880, 0.988933226817853010, 0.988925807517101020, 0.988918385744034570, 0.988910961498672080, 0.988903534781032320, 0.988896105591133720, -0.988888673928994820, 0.988881239794634160, 0.988873803188070500, 0.988866364109322160, 0.988858922558408130, 0.988851478535346610, 0.988844032040156580, 0.988836583072856380, -0.988829131633464750, 0.988821677722000250, 0.988814221338481620, 0.988806762482927200, 0.988799301155356080, 0.988791837355786680, 0.988784371084237780, 0.988776902340727900, -0.988769431125275710, 0.988761957437899960, 0.988754481278619200, 0.988747002647452410, 0.988739521544418020, 0.988732037969534900, 0.988724551922821710, 0.988717063404297100, -0.988709572413979830, 0.988702078951888660, 0.988694583018042140, 0.988687084612459240, 0.988679583735158740, 0.988672080386159170, 0.988664574565479400, 0.988657066273138320, -0.988649555509154450, 0.988642042273546680, 0.988634526566333770, 0.988627008387534700, 0.988619487737168010, 0.988611964615252690, 0.988604439021807390, 0.988596910956850980, -0.988589380420402340, 0.988581847412480120, 0.988574311933103410, 0.988566773982290870, 0.988559233560061480, 0.988551690666433890, 0.988544145301427200, 0.988536597465060060, -0.988529047157351460, 0.988521494378320150, 0.988513939127985130, 0.988506381406365380, 0.988498821213479540, 0.988491258549346830, 0.988483693413985790, 0.988476125807415620, -0.988468555729654970, 0.988460983180723060, 0.988453408160638760, 0.988445830669420930, 0.988438250707088460, 0.988430668273660440, 0.988423083369155630, 0.988415495993593240, -0.988407906146991920, 0.988400313829370880, 0.988392719040749210, 0.988385121781145680, 0.988377522050579270, 0.988369919849069190, 0.988362315176634200, 0.988354708033293510, -0.988347098419065870, 0.988339486333970620, 0.988331871778026620, 0.988324254751253070, 0.988316635253668750, 0.988309013285292860, 0.988301388846144490, 0.988293761936242520, -0.988286132555606270, 0.988278500704254600, 0.988270866382206740, 0.988263229589481760, 0.988255590326098670, 0.988247948592076540, 0.988240304387434710, 0.988232657712191820, -0.988225008566367520, 0.988217356949980590, 0.988209702863050320, 0.988202046305595830, 0.988194387277636200, 0.988186725779190640, 0.988179061810278040, 0.988171395370918030, -0.988163726461129490, 0.988156055080931630, 0.988148381230343650, 0.988140704909384660, 0.988133026118073960, 0.988125344856430670, 0.988117661124473860, 0.988109974922223080, -0.988102286249697310, 0.988094595106915890, 0.988086901493898000, 0.988079205410662740, 0.988071506857229550, 0.988063805833617640, 0.988056102339845980, 0.988048396375934220, -0.988040687941901470, 0.988032977037767050, 0.988025263663550150, 0.988017547819270090, 0.988009829504946200, 0.988002108720597570, 0.987994385466243850, 0.987986659741904140, -0.987978931547597750, 0.987971200883344000, 0.987963467749162330, 0.987955732145071930, 0.987947994071092240, 0.987940253527242460, 0.987932510513542140, 0.987924765030010480, -0.987917017076667010, 0.987909266653530960, 0.987901513760621740, 0.987893758397958680, 0.987886000565561310, 0.987878240263448840, 0.987870477491640810, 0.987862712250156650, -0.987854944539015680, 0.987847174358237320, 0.987839401707841010, 0.987831626587846290, 0.987823848998272360, 0.987816068939138870, 0.987808286410465250, 0.987800501412270830, -0.987792713944575240, 0.987784924007397920, 0.987777131600758200, 0.987769336724675710, 0.987761539379169660, 0.987753739564259940, 0.987745937279965960, 0.987738132526307040, -0.987730325303302740, 0.987722515610972680, 0.987714703449336430, 0.987706888818413180, 0.987699071718222910, 0.987691252148784840, 0.987683430110118720, 0.987675605602244100, -0.987667778625180290, 0.987659949178947170, 0.987652117263564170, 0.987644282879050710, 0.987636446025426660, 0.987628606702711580, 0.987620764910924880, 0.987612920650086320, -0.987605073920215460, 0.987597224721331820, 0.987589373053455290, 0.987581518916605060, 0.987573662310801240, 0.987565803236063240, 0.987557941692410730, 0.987550077679863360, -0.987542211198440770, 0.987534342248162720, 0.987526470829048650, 0.987518596941118540, 0.987510720584391930, 0.987502841758888470, 0.987494960464628040, 0.987487076701630050, -0.987479190469914500, 0.987471301769500930, 0.987463410600408990, 0.987455516962658540, 0.987447620856269470, 0.987439722281261200, 0.987431821237653720, 0.987423917725466670, -0.987416011744719820, 0.987408103295432830, 0.987400192377625660, 0.987392278991317980, 0.987384363136529660, 0.987376444813280460, 0.987368524021590140, 0.987360600761478470, -0.987352675032965310, 0.987344746836070320, 0.987336816170813700, 0.987328883037214890, 0.987320947435293970, 0.987313009365070720, 0.987305068826564880, 0.987297125819796340, -0.987289180344784970, 0.987281232401550520, 0.987273281990113220, 0.987265329110492700, 0.987257373762708830, 0.987249415946781510, 0.987241455662730580, 0.987233492910576160, -0.987225527690337780, 0.987217560002035750, 0.987209589845689740, 0.987201617221319830, 0.987193642128945890, 0.987185664568587810, 0.987177684540265550, 0.987169702043999120, -0.987161717079808270, 0.987153729647713310, 0.987145739747734010, 0.987137747379890350, 0.987129752544202320, 0.987121755240689900, 0.987113755469373190, 0.987105753230271940, -0.987097748523406260, 0.987089741348796350, 0.987081731706462070, 0.987073719596423430, 0.987065705018700500, 0.987057687973313280, 0.987049668460281970, 0.987041646479626220, -0.987033622031366580, 0.987025595115522790, 0.987017565732115080, 0.987009533881163410, 0.987001499562688010, 0.986993462776708740, 0.986985423523245920, 0.986977381802319310, -0.986969337613949450, 0.986961290958156210, 0.986953241834959690, 0.986945190244380210, 0.986937136186437640, 0.986929079661152290, 0.986921020668544040, 0.986912959208633420, -0.986904895281440320, 0.986896828886985160, 0.986888760025287800, 0.986880688696368580, 0.986872614900247580, 0.986864538636945120, 0.986856459906481080, 0.986848378708876100, -0.986840295044150160, 0.986832208912323480, 0.986824120313416380, 0.986816029247448820, 0.986807935714441250, 0.986799839714413870, 0.986791741247386670, 0.986783640313380390, -0.986775536912414930, 0.986767431044510590, 0.986759322709687690, 0.986751211907966550, 0.986743098639367380, 0.986734982903910260, 0.986726864701615860, 0.986718744032504260, -0.986710620896595780, 0.986702495293910850, 0.986694367224469570, 0.986686236688292470, 0.986678103685399770, 0.986669968215811540, 0.986661830279548680, 0.986653689876631160, -0.986645547007079520, 0.986637401670913960, 0.986629253868154810, 0.986621103598822600, 0.986612950862937650, 0.986604795660520170, 0.986596637991590810, 0.986588477856169880, -0.986580315254277700, 0.986572150185934800, 0.986563982651161520, 0.986555812649978270, 0.986547640182405370, 0.986539465248463480, 0.986531287848172900, 0.986523107981554180, -0.986514925648627640, 0.986506740849413810, 0.986498553583933120, 0.986490363852206010, 0.986482171654252890, 0.986473976990094540, 0.986465779859751150, 0.986457580263243370, -0.986449378200591640, 0.986441173671816380, 0.986432966676938250, 0.986424757215977550, 0.986416545288955060, 0.986408330895891310, 0.986400114036806720, 0.986391894711721730, -0.986383672920657100, 0.986375448663633250, 0.986367221940670840, 0.986358992751790180, 0.986350761097012140, 0.986342526976357270, 0.986334290389846100, 0.986326051337499180, -0.986317809819337030, 0.986309565835380430, 0.986301319385650020, 0.986293070470166010, 0.986284819088949490, 0.986276565242021010, 0.986268308929401090, 0.986260050151110400, -0.986251788907169580, 0.986243525197599280, 0.986235259022419930, 0.986226990381652730, 0.986218719275318010, 0.986210445703436410, 0.986202169666028810, 0.986193891163115730, -0.986185610194717950, 0.986177326760856120, 0.986169040861550770, 0.986160752496823000, 0.986152461666693460, 0.986144168371182680, 0.986135872610311440, 0.986127574384100590, -0.986119273692570800, 0.986110970535742700, 0.986102664913637180, 0.986094356826275110, 0.986086046273677130, 0.986077733255864010, 0.986069417772856620, 0.986061099824675600, -0.986052779411341840, 0.986044456532876090, 0.986036131189299230, 0.986027803380632120, 0.986019473106895530, 0.986011140368110220, 0.986002805164296950, 0.985994467495476810, -0.985986127361670460, 0.985977784762898660, 0.985969439699182490, 0.985961092170542730, 0.985952742177000240, 0.985944389718576010, 0.985936034795290680, 0.985927677407165250, -0.985919317554220580, 0.985910955236477650, 0.985902590453957450, 0.985894223206680740, 0.985885853494668400, 0.985877481317941510, 0.985869106676520830, 0.985860729570427470, -0.985852349999682190, 0.985843967964306070, 0.985835583464319990, 0.985827196499745040, 0.985818807070602100, 0.985810415176912150, 0.985802020818696170, 0.985793623995975030, -0.985785224708769840, 0.985776822957101670, 0.985768418740991410, 0.985760012060460040, 0.985751602915528770, 0.985743191306218460, 0.985734777232550210, 0.985726360694544780, -0.985717941692223600, 0.985709520225607650, 0.985701096294717800, 0.985692669899575270, 0.985684241040201140, 0.985675809716616280, 0.985667375928841900, 0.985658939676898990, -0.985650500960808860, 0.985642059780592490, 0.985633616136270980, 0.985625170027865430, 0.985616721455396920, 0.985608270418886660, 0.985599816918355630, 0.985591360953824940, -0.985582902525316110, 0.985574441632849910, 0.985565978276447650, 0.985557512456130440, 0.985549044171919460, 0.985540573423835830, 0.985532100211900630, 0.985523624536135290, -0.985515146396561010, 0.985506665793198790, 0.985498182726069930, 0.985489697195195520, 0.985481209200597010, 0.985472718742295360, 0.985464225820311790, 0.985455730434667830, -0.985447232585384580, 0.985438732272483130, 0.985430229495985020, 0.985421724255911240, 0.985413216552283090, 0.985404706385121900, 0.985396193754448980, 0.985387678660285650, -0.985379161102653000, 0.985370641081572570, 0.985362118597065460, 0.985353593649153090, 0.985345066237856780, 0.985336536363197620, 0.985328004025197270, 0.985319469223876810, -0.985310931959257790, 0.985302392231361400, 0.985293850040209080, 0.985285305385822150, 0.985276758268221920, 0.985268208687429590, 0.985259656643466930, 0.985251102136355140, -0.985242545166115650, 0.985233985732769660, 0.985225423836338820, 0.985216859476844340, 0.985208292654307650, 0.985199723368750280, 0.985191151620193660, 0.985182577408659220, -0.985174000734168280, 0.985165421596742360, 0.985156839996402800, 0.985148255933171240, 0.985139669407068870, 0.985131080418117370, 0.985122488966338250, 0.985113895051752950, -0.985105298674382900, 0.985096699834249630, 0.985088098531374470, 0.985079494765779050, 0.985070888537485030, 0.985062279846513730, 0.985053668692886800, 0.985045055076625650, -0.985036438997751840, 0.985027820456287010, 0.985019199452252580, 0.985010575985669990, 0.985001950056561100, 0.984993321664947350, 0.984984690810850380, 0.984976057494291620, -0.984967421715292720, 0.984958783473875220, 0.984950142770060770, 0.984941499603870900, 0.984932853975327370, 0.984924205884451620, 0.984915555331265510, 0.984906902315790480, -0.984898246838048160, 0.984889588898060220, 0.984880928495848070, 0.984872265631433930, 0.984863600304838990, 0.984854932516085140, 0.984846262265193890, 0.984837589552187030, -0.984828914377086200, 0.984820236739913040, 0.984811556640689200, 0.984802874079436560, 0.984794189056176770, 0.984785501570931480, 0.984776811623722440, 0.984768119214571410, -0.984759424343500060, 0.984750727010530120, 0.984742027215683270, 0.984733324958981470, 0.984724620240446270, 0.984715913060099650, 0.984707203417963250, 0.984698491314058730, -0.984689776748408070, 0.984681059721032810, 0.984672340231955050, 0.984663618281196420, 0.984654893868778800, 0.984646166994723850, 0.984637437659053540, 0.984628705861789630, -0.984619971602954000, 0.984611234882568190, 0.984602495700654500, 0.984593754057234590, 0.984585009952330230, 0.984576263385963490, 0.984567514358155930, 0.984558762868929630, -0.984550008918306350, 0.984541252506308080, 0.984532493632956810, 0.984523732298274170, 0.984514968502282260, 0.984506202245002960, 0.984497433526458130, 0.984488662346669760, -0.984479888705659500, 0.984471112603449770, 0.984462334040062110, 0.984453553015518730, 0.984444769529841500, 0.984435983583052290, 0.984427195175173080, 0.984418404306225960, -0.984409610976232590, 0.984400815185215380, 0.984392016933196220, 0.984383216220196980, 0.984374413046239630, 0.984365607411346270, 0.984356799315538880, 0.984347988758839440, -0.984339175741270060, 0.984330360262852810, 0.984321542323609580, 0.984312721923562560, 0.984303899062733740, 0.984295073741145220, 0.984286245958818970, 0.984277415715776870, -0.984268583012041450, 0.984259747847634590, 0.984250910222578380, 0.984242070136894910, 0.984233227590606160, 0.984224382583734460, 0.984215535116301670, 0.984206685188329990, -0.984197832799841740, 0.984188977950858910, 0.984180120641403590, 0.984171260871497980, 0.984162398641164280, 0.984153533950424600, 0.984144666799300790, 0.984135797187815520, -0.984126925115990870, 0.984118050583848820, 0.984109173591411590, 0.984100294138701480, 0.984091412225740700, 0.984082527852551350, 0.984073641019155510, 0.984064751725575730, -0.984055859971833980, 0.984046965757952700, 0.984038069083953970, 0.984029169949860120, 0.984020268355693230, 0.984011364301475620, 0.984002457787229720, 0.983993548812977630, -0.983984637378741760, 0.983975723484544210, 0.983966807130407410, 0.983957888316353560, 0.983948967042404980, 0.983940043308583870, 0.983931117114912770, 0.983922188461413880, -0.983913257348109530, 0.983904323775022020, 0.983895387742173670, 0.983886449249586900, 0.983877508297284040, 0.983868564885287180, 0.983859619013619180, 0.983850670682302030, -0.983841719891358270, 0.983832766640810100, 0.983823810930680160, 0.983814852760990570, 0.983805892131763730, 0.983796929043022290, 0.983787963494788590, 0.983778995487085030, -0.983770025019933820, 0.983761052093357740, 0.983752076707378850, 0.983743098862019830, 0.983734118557302970, 0.983725135793250940, 0.983716150569886040, 0.983707162887230810, -0.983698172745307580, 0.983689180144138970, 0.983680185083747440, 0.983671187564155500, 0.983662187585385260, 0.983653185147459920, 0.983644180250401460, 0.983635172894232630, -0.983626163078975770, 0.983617150804653620, 0.983608136071288500, 0.983599118878902940, 0.983590099227519720, 0.983581077117161250, 0.983572052547850180, 0.983563025519608840, -0.983553996032459970, 0.983544964086426220, 0.983535929681529920, 0.983526892817793710, 0.983517853495240350, 0.983508811713892480, 0.983499767473772550, 0.983490720774903070, -0.983481671617306930, 0.983472620001006550, 0.983463565926024460, 0.983454509392383660, 0.983445450400106560, 0.983436388949215920, 0.983427325039734180, 0.983418258671684200, -0.983409189845088520, 0.983400118559969890, 0.983391044816350760, 0.983381968614254310, 0.983372889953702870, 0.983363808834719190, 0.983354725257325920, 0.983345639221545940, -0.983336550727401780, 0.983327459774916310, 0.983318366364112070, 0.983309270495011930, 0.983300172167638760, 0.983291071382015100, 0.983281968138163710, 0.983272862436107450, -0.983263754275869100, 0.983254643657471170, 0.983245530580936780, 0.983236415046288450, 0.983227297053549280, 0.983218176602741690, 0.983209053693888780, 0.983199928327013200, -0.983190800502137810, 0.983181670219285260, 0.983172537478478660, 0.983163402279740750, 0.983154264623094300, 0.983145124508562170, 0.983135981936167250, 0.983126836905932390, -0.983117689417880470, 0.983108539472034140, 0.983099387068416600, 0.983090232207050610, 0.983081074887959040, 0.983071915111164870, 0.983062752876690760, 0.983053588184559900, -0.983044421034794840, 0.983035251427418880, 0.983026079362454790, 0.983016904839925540, 0.983007727859854020, 0.982998548422263200, 0.982989366527175950, 0.982980182174615360, -0.982970995364604080, 0.982961806097165440, 0.982952614372322400, 0.982943420190097730, 0.982934223550514630, 0.982925024453595860, 0.982915822899364520, 0.982906618887843480, -0.982897412419056150, 0.982888203493025190, 0.982878992109773810, 0.982869778269324870, 0.982860561971701460, 0.982851343216926690, 0.982842122005023630, 0.982832898336014950, -0.982823672209924280, 0.982814443626774500, 0.982805212586588480, 0.982795979089389540, 0.982786743135200540, 0.982777504724044790, 0.982768263855945180, 0.982759020530924790, -0.982749774749007040, 0.982740526510214820, 0.982731275814571310, 0.982722022662099630, 0.982712767052822840, 0.982703508986764170, 0.982694248463946480, 0.982684985484393430, -0.982675720048127870, 0.982666452155173010, 0.982657181805552060, 0.982647908999288110, 0.982638633736404480, 0.982629356016924140, 0.982620075840870300, 0.982610793208266500, -0.982601508119135600, 0.982592220573501040, 0.982582930571385900, 0.982573638112813400, 0.982564343197806830, 0.982555045826389310, 0.982545745998584130, 0.982536443714414730, -0.982527138973904200, 0.982517831777075860, 0.982508522123952900, 0.982499210014558640, 0.982489895448916290, 0.982480578427049170, 0.982471258948980690, 0.982461937014734050, -0.982452612624332590, 0.982443285777799600, 0.982433956475158410, 0.982424624716432330, 0.982415290501644670, 0.982405953830818630, 0.982396614703977880, 0.982387273121145600, -0.982377929082345110, 0.982368582587599740, 0.982359233636933000, 0.982349882230368120, 0.982340528367928400, 0.982331172049637600, 0.982321813275518820, 0.982312452045595470, -0.982303088359891000, 0.982293722218428810, 0.982284353621232340, 0.982274982568324910, 0.982265609059729930, 0.982256233095471170, 0.982246854675571710, 0.982237473800055110, -0.982228090468944880, 0.982218704682264350, 0.982209316440037170, 0.982199925742286650, 0.982190532589036100, 0.982181136980309510, 0.982171738916129970, 0.982162338396521120, -0.982152935421506390, 0.982143529991109320, 0.982134122105353450, 0.982124711764262080, 0.982115298967859210, 0.982105883716168030, 0.982096466009212080, 0.982087045847015010, -0.982077623229600350, 0.982068198156991530, 0.982058770629212320, 0.982049340646286020, 0.982039908208236500, 0.982030473315087190, 0.982021035966861740, 0.982011596163583690, -0.982002153905276560, 0.981992709191964240, 0.981983262023669810, 0.981973812400417480, 0.981964360322230560, 0.981954905789132800, 0.981945448801147760, 0.981935989358299070, -0.981926527460610380, 0.981917063108105450, 0.981907596300807590, 0.981898127038741020, 0.981888655321929040, 0.981879181150395520, 0.981869704524164000, 0.981860225443258240, -0.981850743907701880, 0.981841259917518690, 0.981831773472732210, 0.981822284573366400, 0.981812793219444810, 0.981803299410991430, 0.981793803148029660, 0.981784304430583400, -0.981774803258676390, 0.981765299632332280, 0.981755793551575050, 0.981746285016428240, 0.981736774026915840, 0.981727260583061480, 0.981717744684888930, 0.981708226332422050, -0.981698705525684500, 0.981689182264700140, 0.981679656549492960, 0.981670128380086600, 0.981660597756505050, 0.981651064678771830, 0.981641529146911050, 0.981631991160946460, -0.981622450720901930, 0.981612907826801000, 0.981603362478667970, 0.981593814676526620, 0.981584264420400700, 0.981574711710314070, 0.981565156546290730, 0.981555598928354420, -0.981546038856529020, 0.981536476330838630, 0.981526911351307100, 0.981517343917958310, 0.981507774030816130, 0.981498201689904540, 0.981488626895247410, 0.981479049646868720, -0.981469469944792230, 0.981459887789042250, 0.981450303179642550, 0.981440716116617100, 0.981431126599989770, 0.981421534629784760, 0.981411940206025850, 0.981402343328736880, -0.981392743997942300, 0.981383142213665850, 0.981373537975931520, 0.981363931284763290, 0.981354322140185360, 0.981344710542221500, 0.981335096490896010, 0.981325479986232430, -0.981315861028255410, 0.981306239616988820, 0.981296615752456520, 0.981286989434682730, 0.981277360663691420, 0.981267729439506690, 0.981258095762152730, 0.981248459631653300, -0.981238821048032950, 0.981229180011315430, 0.981219536521525050, 0.981209890578685790, 0.981200242182821870, 0.981190591333957360, 0.981180938032116150, 0.981171282277322750, -0.981161624069601170, 0.981151963408975480, 0.981142300295469890, 0.981132634729108610, 0.981122966709915720, 0.981113296237915430, 0.981103623313131610, 0.981093947935589020, -0.981084270105311520, 0.981074589822323430, 0.981064907086648730, 0.981055221898311850, 0.981045534257336980, 0.981035844163748120, 0.981026151617569560, 0.981016456618825750, -0.981006759167540880, 0.980997059263739040, 0.980987356907444650, 0.980977652098681710, 0.980967944837474740, 0.980958235123847720, 0.980948522957825310, 0.980938808339431590, -0.980929091268690770, 0.980919371745627380, 0.980909649770265400, 0.980899925342629380, 0.980890198462743500, 0.980880469130631980, 0.980870737346319470, 0.980861003109830150, -0.980851266421188250, 0.980841527280418180, 0.980831785687544370, 0.980822041642591010, 0.980812295145582440, 0.980802546196543280, 0.980792794795497750, 0.980783040942470260, -0.980773284637485140, 0.980763525880566810, 0.980753764671739690, 0.980744001011028100, 0.980734234898456460, 0.980724466334049310, 0.980714695317830950, 0.980704921849825940, -0.980695145930058580, 0.980685367558553400, 0.980675586735334730, 0.980665803460427200, 0.980656017733854910, 0.980646229555642730, 0.980636438925815090, 0.980626645844396180, -0.980616850311410770, 0.980607052326883280, 0.980597251890838020, 0.980587449003299530, 0.980577643664292680, 0.980567835873841550, 0.980558025631970920, 0.980548212938705310, -0.980538397794069040, 0.980528580198086750, 0.980518760150783100, 0.980508937652182390, 0.980499112702309490, 0.980489285301188730, 0.980479455448844850, 0.980469623145302280, -0.980459788390585670, 0.980449951184719670, 0.980440111527728700, 0.980430269419637290, 0.980420424860470320, 0.980410577850252430, 0.980400728389007940, 0.980390876476761710, -0.980381022113538390, 0.980371165299362410, 0.980361306034258310, 0.980351444318251160, 0.980341580151365410, 0.980331713533625690, 0.980321844465056660, 0.980311972945683060, -0.980302098975529560, 0.980292222554620780, 0.980282343682981170, 0.980272462360636030, 0.980262578587609680, 0.980252692363926870, 0.980242803689612360, 0.980232912564690810, -0.980223018989186960, 0.980213122963125460, 0.980203224486531190, 0.980193323559429010, 0.980183420181843460, 0.980173514353799400, 0.980163606075321490, 0.980153695346434590, -0.980143782167163470, 0.980133866537532650, 0.980123948457567450, 0.980114027927292300, 0.980104104946732060, 0.980094179515911600, 0.980084251634855800, 0.980074321303589180, -0.980064388522136840, 0.980054453290523430, 0.980044515608773930, 0.980034575476913190, 0.980024632894966110, 0.980014687862957310, 0.980004740380911900, 0.979994790448854510, -0.979984838066810030, 0.979974883234803640, 0.979964925952860110, 0.979954966221004200, 0.979945004039260880, 0.979935039407655030, 0.979925072326211620, 0.979915102794955530, -0.979905130813911400, 0.979895156383104760, 0.979885179502560160, 0.979875200172302560, 0.979865218392357070, 0.979855234162748450, 0.979845247483501880, 0.979835258354642020, -0.979825266776193970, 0.979815272748182810, 0.979805276270633630, 0.979795277343571080, 0.979785275967020470, 0.979775272141006570, 0.979765265865554570, 0.979755257140689230, -0.979745245966435860, 0.979735232342819450, 0.979725216269864860, 0.979715197747597300, 0.979705176776041740, 0.979695153355223280, 0.979685127485166900, 0.979675099165897460, -0.979665068397440500, 0.979655035179820890, 0.979644999513063720, 0.979634961397193970, 0.979624920832236850, 0.979614877818217430, 0.979604832355160720, 0.979594784443092000, -0.979584734082036390, 0.979574681272018850, 0.979564626013064710, 0.979554568305198940, 0.979544508148446740, 0.979534445542833310, 0.979524380488383640, 0.979514312985123040, -0.979504243033076820, 0.979494170632269960, 0.979484095782727550, 0.979474018484475020, 0.979463938737537450, 0.979453856541939950, 0.979443771897707700, 0.979433684804866140, -0.979423595263440470, 0.979413503273455780, 0.979403408834937260, 0.979393311947910240, 0.979383212612400020, 0.979373110828431480, 0.979363006596030370, 0.979352899915221790, -0.979342790786030930, 0.979332679208483100, 0.979322565182603630, 0.979312448708417600, 0.979302329785950550, 0.979292208415227570, 0.979282084596274080, 0.979271958329115510, -0.979261829613777060, 0.979251698450283930, 0.979241564838661650, 0.979231428778935320, 0.979221290271130360, 0.979211149315272310, 0.979201005911386370, 0.979190860059497960, -0.979180711759632390, 0.979170561011815100, 0.979160407816071280, 0.979150252172426570, 0.979140094080905960, 0.979129933541535320, 0.979119770554339850, 0.979109605119344970, -0.979099437236576000, 0.979089266906058580, 0.979079094127817910, 0.979068918901879410, 0.979058741228268530, 0.979048561107011000, 0.979038378538132030, 0.979028193521657150, -0.979018006057611800, 0.979007816146021390, 0.978997623786911460, 0.978987428980307330, 0.978977231726234740, 0.978967032024719020, 0.978956829875785810, 0.978946625279460520, -0.978936418235768710, 0.978926208744735790, 0.978915996806387300, 0.978905782420748770, 0.978895565587845850, 0.978885346307704070, 0.978875124580348870, 0.978864900405805870, -0.978854673784100740, 0.978844444715258780, 0.978834213199305750, 0.978823979236267070, 0.978813742826168510, 0.978803503969035700, 0.978793262664894080, 0.978783018913769290, -0.978772772715687080, 0.978762524070672770, 0.978752272978752000, 0.978742019439950760, 0.978731763454294580, 0.978721505021808880, 0.978711244142519420, 0.978700980816451850, -0.978690715043631810, 0.978680446824084950, 0.978670176157836910, 0.978659903044913570, 0.978649627485340460, 0.978639349479143220, 0.978629069026347720, 0.978618786126979500, -0.978608500781064210, 0.978598212988627590, 0.978587922749695640, 0.978577630064293880, 0.978567334932447960, 0.978557037354183870, 0.978546737329527020, 0.978536434858503390, -0.978526129941138630, 0.978515822577458510, 0.978505512767488870, 0.978495200511255490, 0.978484885808784120, 0.978474568660100520, 0.978464249065230440, 0.978453927024199870, -0.978443602537034440, 0.978433275603759700, 0.978422946224402070, 0.978412614398987080, 0.978402280127540490, 0.978391943410088280, 0.978381604246656210, 0.978371262637270030, -0.978360918581955620, 0.978350572080739060, 0.978340223133645990, 0.978329871740702520, 0.978319517901934280, 0.978309161617367250, 0.978298802887027310, 0.978288441710940320, -0.978278078089132140, 0.978267712021628880, 0.978257343508456390, 0.978246972549640550, 0.978236599145207220, 0.978226223295182380, 0.978215844999592020, 0.978205464258462000, -0.978195081071818180, 0.978184695439686890, 0.978174307362093880, 0.978163916839065010, 0.978153523870626370, 0.978143128456803960, 0.978132730597623620, 0.978122330293111350, -0.978111927543293460, 0.978101522348195700, 0.978091114707844160, 0.978080704622264820, 0.978070292091483770, 0.978059877115527000, 0.978049459694420480, 0.978039039828190070, -0.978028617516862320, 0.978018192760463090, 0.978007765559018250, 0.977997335912554110, 0.977986903821096540, 0.977976469284671750, 0.977966032303305590, 0.977955592877024600, -0.977945151005854550, 0.977934706689821630, 0.977924259928951930, 0.977913810723271660, 0.977903359072806790, 0.977892904977583520, 0.977882448437627840, 0.977871989452966270, -0.977861528023624690, 0.977851064149629190, 0.977840597831006190, 0.977830129067781550, 0.977819657859981710, 0.977809184207632630, 0.977798708110760420, 0.977788229569391710, -0.977777748583552380, 0.977767265153268620, 0.977756779278566750, 0.977746290959472960, 0.977735800196013360, 0.977725306988214140, 0.977714811336101830, 0.977704313239702530, -0.977693812699042430, 0.977683309714147740, 0.977672804285044770, 0.977662296411759830, 0.977651786094319130, 0.977641273332748860, 0.977630758127075560, 0.977620240477325320, -0.977609720383524450, 0.977599197845699370, 0.977588672863876180, 0.977578145438081410, 0.977567615568341260, 0.977557083254681820, 0.977546548497129960, 0.977536011295711660, -0.977525471650453340, 0.977514929561381420, 0.977504385028522100, 0.977493838051901820, 0.977483288631546770, 0.977472736767483700, 0.977462182459738700, 0.977451625708338320, -0.977441066513308860, 0.977430504874676750, 0.977419940792468410, 0.977409374266710150, 0.977398805297428290, 0.977388233884649680, 0.977377660028400430, 0.977367083728706950, -0.977356504985595900, 0.977345923799093460, 0.977335340169226300, 0.977324754096020600, 0.977314165579503120, 0.977303574619700300, 0.977292981216638550, 0.977282385370344290, -0.977271787080844170, 0.977261186348164500, 0.977250583172331820, 0.977239977553372550, 0.977229369491313560, 0.977218758986181160, 0.977208146038001770, 0.977197530646802040, -0.977186912812608500, 0.977176292535447690, 0.977165669815346140, 0.977155044652330270, 0.977144417046426960, 0.977133786997662510, 0.977123154506063680, 0.977112519571657010, -0.977101882194468920, 0.977091242374526270, 0.977080600111855270, 0.977069955406482890, 0.977059308258435680, 0.977048658667740160, 0.977038006634422970, 0.977027352158510890, -0.977016695240030320, 0.977006035879008030, 0.976995374075470550, 0.976984709829444740, 0.976974043140957150, 0.976963374010034520, 0.976952702436703400, 0.976942028420990540, -0.976931351962922580, 0.976920673062526280, 0.976909991719828060, 0.976899307934855130, 0.976888621707633800, 0.976877933038191040, 0.976867241926553390, 0.976856548372747710, -0.976845852376800550, 0.976835153938738650, 0.976824453058589000, 0.976813749736378250, 0.976803043972133130, 0.976792335765880430, 0.976781625117646770, 0.976770912027459140, -0.976760196495344290, 0.976749478521328650, 0.976738758105439530, 0.976728035247703570, 0.976717309948147430, 0.976706582206798070, 0.976695852023682250, 0.976685119398826850, -0.976674384332258390, 0.976663646824004190, 0.976652906874090900, 0.976642164482545260, 0.976631419649394260, 0.976620672374664770, 0.976609922658383530, 0.976599170500577430, -0.976588415901273320, 0.976577658860498300, 0.976566899378279230, 0.976556137454642760, 0.976545373089616090, 0.976534606283225860, 0.976523837035499160, 0.976513065346462870, -0.976502291216143850, 0.976491514644569180, 0.976480735631765630, 0.976469954177760390, 0.976459170282580220, 0.976448383946252110, 0.976437595168803020, 0.976426803950259830, -0.976416010290649730, 0.976405214189999700, 0.976394415648336510, 0.976383614665687350, 0.976372811242079200, 0.976362005377539030, 0.976351197072093720, 0.976340386325770360, -0.976329573138596140, 0.976318757510598050, 0.976307939441803050, 0.976297118932238140, 0.976286295981930510, 0.976275470590907140, 0.976264642759194780, 0.976253812486821080, -0.976242979773812910, 0.976232144620197250, 0.976221307026001180, 0.976210466991251910, 0.976199624515976530, 0.976188779600202010, 0.976177932243955330, 0.976167082447264020, -0.976156230210154960, 0.976145375532655460, 0.976134518414792370, 0.976123658856593130, 0.976112796858084610, 0.976101932419294220, 0.976091065540248710, 0.976080196220975750, -0.976069324461502410, 0.976058450261855560, 0.976047573622062740, 0.976036694542150920, 0.976025813022147410, 0.976014929062079100, 0.976004042661973710, 0.975993153821858250, -0.975982262541759900, 0.975971368821705880, 0.975960472661723370, 0.975949574061839690, 0.975938673022082150, 0.975927769542477730, 0.975916863623053970, 0.975905955263838170, -0.975895044464857420, 0.975884131226139150, 0.975873215547710450, 0.975862297429598740, 0.975851376871831320, 0.975840453874435190, 0.975829528437438200, 0.975818600560867330, -0.975807670244750010, 0.975796737489113440, 0.975785802293985150, 0.975774864659392230, 0.975763924585361990, 0.975752982071922180, 0.975742037119099900, 0.975731089726922460, -0.975720139895417390, 0.975709187624611900, 0.975698232914533500, 0.975687275765209530, 0.975676316176667060, 0.975665354148934070, 0.975654389682037770, 0.975643422776005350, -0.975632453430864470, 0.975621481646642420, 0.975610507423366750, 0.975599530761064540, 0.975588551659763660, 0.975577570119491420, 0.975566586140275360, 0.975555599722142670, -0.975544610865121120, 0.975533619569238010, 0.975522625834520760, 0.975511629660996920, 0.975500631048694110, 0.975489629997639660, 0.975478626507861210, 0.975467620579386190, -0.975456612212242110, 0.975445601406456530, 0.975434588162056860, 0.975423572479070630, 0.975412554357525610, 0.975401533797449210, 0.975390510798868960, 0.975379485361812400, -0.975368457486307180, 0.975357427172380830, 0.975346394420060660, 0.975335359229374750, 0.975324321600350430, 0.975313281533015330, 0.975302239027396990, 0.975291194083523050, -0.975280146701421160, 0.975269096881118850, 0.975258044622643650, 0.975246989926023540, 0.975235932791285950, 0.975224873218458520, 0.975213811207568890, 0.975202746758644820, -0.975191679871713730, 0.975180610546803490, 0.975169538783941640, 0.975158464583156030, 0.975147387944474310, 0.975136308867924130, 0.975125227353533130, 0.975114143401329070, -0.975103057011339700, 0.975091968183592450, 0.975080876918115400, 0.975069783214936310, 0.975058687074082610, 0.975047588495582260, 0.975036487479463030, 0.975025384025752450, -0.975014278134478500, 0.975003169805668590, 0.974992059039351040, 0.974980945835553280, 0.974969830194303170, 0.974958712115628460, 0.974947591599557020, 0.974936468646116490, -0.974925343255334750, 0.974914215427239770, 0.974903085161859200, 0.974891952459221000, 0.974880817319352940, 0.974869679742282780, 0.974858539728038380, 0.974847397276647710, -0.974836252388138310, 0.974825105062538500, 0.974813955299875910, 0.974802803100178420, 0.974791648463473990, 0.974780491389790390, 0.974769331879155490, 0.974758169931597360, -0.974747005547143550, 0.974735838725822480, 0.974724669467661790, 0.974713497772689450, 0.974702323640933340, 0.974691147072421440, 0.974679968067181600, 0.974668786625241700, -0.974657602746630050, 0.974646416431374400, 0.974635227679502720, 0.974624036491042900, 0.974612842866023010, 0.974601646804471030, 0.974590448306414950, 0.974579247371882510, -0.974568044000902130, 0.974556838193501700, 0.974545629949709170, 0.974534419269552530, 0.974523206153059870, 0.974511990600259280, 0.974500772611178620, 0.974489552185845760, -0.974478329324289350, 0.974467104026537020, 0.974455876292616980, 0.974444646122557210, 0.974433413516385900, 0.974422178474131040, 0.974410940995820480, 0.974399701081482770, -0.974388458731145880, 0.974377213944837780, 0.974365966722586680, 0.974354717064420670, 0.974343464970367830, 0.974332210440456370, 0.974320953474714150, 0.974309694073169700, -0.974298432235851110, 0.974287167962786360, 0.974275901254003760, 0.974264632109531400, 0.974253360529397370, 0.974242086513629870, 0.974230810062257310, 0.974219531175307680, -0.974208249852809290, 0.974196966094790230, 0.974185679901278690, 0.974174391272303100, 0.974163100207891430, 0.974151806708071780, 0.974140510772872890, 0.974129212402322750, -0.974117911596449450, 0.974106608355281510, 0.974095302678846920, 0.974083994567174210, 0.974072684020291460, 0.974061371038226760, 0.974050055621008880, 0.974038737768665790, -0.974027417481225900, 0.974016094758717530, 0.974004769601168880, 0.973993442008608270, 0.973982111981063880, 0.973970779518564480, 0.973959444621138040, 0.973948107288812980, -0.973936767521617730, 0.973925425319580480, 0.973914080682729670, 0.973902733611093700, 0.973891384104700770, 0.973880032163579430, 0.973868677787758100, 0.973857320977265070, -0.973845961732128670, 0.973834600052377430, 0.973823235938039770, 0.973811869389143880, 0.973800500405718190, 0.973789128987791460, 0.973777755135391890, 0.973766378848547890, -0.973755000127288000, 0.973743618971640520, 0.973732235381634110, 0.973720849357296860, 0.973709460898657620, 0.973698070005744820, 0.973686676678586770, 0.973675280917212120, -0.973663882721649280, 0.973652482091926670, 0.973641079028072840, 0.973629673530116090, 0.973618265598085400, 0.973606855232009070, 0.973595442431915650, 0.973584027197833550, -0.973572609529791300, 0.973561189427817660, 0.973549766891940840, 0.973538341922189690, 0.973526914518592860, 0.973515484681178660, 0.973504052409975620, 0.973492617705012610, -0.973481180566318050, 0.973469740993920470, 0.973458298987848410, 0.973446854548130740, 0.973435407674795970, 0.973423958367872650, 0.973412506627389430, 0.973401052453374940, -0.973389595845857940, 0.973378136804866840, 0.973366675330430200, 0.973355211422577080, 0.973343745081335920, 0.973332276306735470, 0.973320805098804250, 0.973309331457571040, -0.973297855383064460, 0.973286376875313050, 0.973274895934346020, 0.973263412560191670, 0.973251926752878750, 0.973240438512436020, 0.973228947838892240, 0.973217454732276050, -0.973205959192616320, 0.973194461219941350, 0.973182960814280570, 0.973171457975662290, 0.973159952704115370, 0.973148444999668570, 0.973136934862350760, 0.973125422292190460, -0.973113907289216540, 0.973102389853457980, 0.973090869984943430, 0.973079347683701750, 0.973067822949761680, 0.973056295783152110, 0.973044766183901680, 0.973033234152039460, -0.973021699687593890, 0.973010162790594270, 0.972998623461069250, 0.972987081699047680, 0.972975537504558340, 0.972963990877630190, 0.972952441818292100, 0.972940890326572940, -0.972929336402501340, 0.972917780046106520, 0.972906221257417330, 0.972894660036462520, 0.972883096383271080, 0.972871530297871990, 0.972859961780293990, 0.972848390830565850, -0.972836817448716970, 0.972825241634776130, 0.972813663388772070, 0.972802082710733870, 0.972790499600690530, 0.972778914058670900, 0.972767326084703950, 0.972755735678818570, -0.972744142841044050, 0.972732547571409030, 0.972720949869942840, 0.972709349736674110, 0.972697747171632040, 0.972686142174845720, 0.972674534746343910, 0.972662924886155580, -0.972651312594310260, 0.972639697870836480, 0.972628080715763570, 0.972616461129120480, 0.972604839110936200, 0.972593214661239820, 0.972581587780060210, 0.972569958467426780, -0.972558326723368500, 0.972546692547914370, 0.972535055941093570, 0.972523416902935090, 0.972511775433468120, 0.972500131532721630, 0.972488485200724620, 0.972476836437506600, -0.972465185243096550, 0.972453531617523570, 0.972441875560816630, 0.972430217073005030, 0.972418556154117990, 0.972406892804184240, 0.972395227023233550, 0.972383558811294790, -0.972371888168397040, 0.972360215094569710, 0.972348539589841690, 0.972336861654242380, 0.972325181287800990, 0.972313498490546380, 0.972301813262508200, 0.972290125603715530, -0.972278435514197570, 0.972266742993983520, 0.972255048043102480, 0.972243350661583960, 0.972231650849457060, 0.972219948606750760, 0.972208243933494810, 0.972196536829718290, -0.972184827295450420, 0.972173115330720480, 0.972161400935557700, 0.972149684109991470, 0.972137964854050800, 0.972126243167765520, 0.972114519051164530, 0.972102792504277220, -0.972091063527133040, 0.972079332119761050, 0.972067598282190800, 0.972055862014451600, 0.972044123316572530, 0.972032382188583340, 0.972020638630513130, 0.972008892642391430, -0.971997144224247430, 0.971985393376110670, 0.971973640098010350, 0.971961884389975880, 0.971950126252036580, 0.971938365684222090, 0.971926602686561720, 0.971914837259084900, -0.971903069401820920, 0.971891299114799320, 0.971879526398049420, 0.971867751251600520, 0.971855973675482490, 0.971844193669724520, 0.971832411234356040, 0.971820626369406470, -0.971808839074905450, 0.971797049350882180, 0.971785257197366410, 0.971773462614387240, 0.971761665601974630, 0.971749866160157900, 0.971738064288966470, 0.971726259988429870, -0.971714453258577640, 0.971702644099439290, 0.971690832511044160, 0.971679018493422090, 0.971667202046602510, 0.971655383170614840, 0.971643561865488840, 0.971631738131253810, -0.971619911967939510, 0.971608083375575360, 0.971596252354190890, 0.971584418903815970, 0.971572583024480020, 0.971560744716212570, 0.971548903979043250, 0.971537060813001730, -0.971525215218117520, 0.971513367194420270, 0.971501516741939410, 0.971489663860704900, 0.971477808550746280, 0.971465950812093190, 0.971454090644775170, 0.971442228048821850, -0.971430363024263110, 0.971418495571128140, 0.971406625689447250, 0.971394753379249740, 0.971382878640565270, 0.971371001473423700, 0.971359121877854560, 0.971347239853887710, -0.971335355401552690, 0.971323468520879140, 0.971311579211897040, 0.971299687474636020, 0.971287793309125850, 0.971275896715396050, 0.971263997693476600, 0.971252096243397260, -0.971240192365187550, 0.971228286058877120, 0.971216377324496280, 0.971204466162074450, 0.971192552571641500, 0.971180636553227060, 0.971168718106861120, 0.971156797232573420, -0.971144873930393390, 0.971132948200351450, 0.971121020042477130, 0.971109089456800300, 0.971097156443350820, 0.971085221002158330, 0.971073283133252810, 0.971061342836664010, -0.971049400112421800, 0.971037454960556160, 0.971025507381096940, 0.971013557374074020, 0.971001604939517150, 0.970989650077456190, 0.970977692787921230, 0.970965733070941810, -0.970953770926548220, 0.970941806354770120, 0.970929839355637700, 0.970917869929180500, 0.970905898075428710, 0.970893923794412190, 0.970881947086160820, 0.970869967950704460, -0.970857986388073300, 0.970846002398297210, 0.970834015981406060, 0.970822027137429930, 0.970810035866398800, 0.970798042168342420, 0.970786046043291000, 0.970774047491274270, -0.970762046512322670, 0.970750043106465950, 0.970738037273734090, 0.970726029014157170, 0.970714018327765050, 0.970702005214588050, 0.970689989674655700, 0.970677971707998630, -0.970665951314646720, 0.970653928494629840, 0.970641903247978170, 0.970629875574721690, 0.970617845474890610, 0.970605812948514780, 0.970593777995624300, 0.970581740616249580, -0.970569700810420600, 0.970557658578167230, 0.970545613919519770, 0.970533566834508310, 0.970521517323162830, 0.970509465385513640, 0.970497411021590590, 0.970485354231424120, -0.970473295015044310, 0.970461233372481360, 0.970449169303765240, 0.970437102808926260, 0.970425033887994390, 0.970412962540999850, 0.970400888767973040, 0.970388812568944050, -0.970376733943943080, 0.970364652893000220, 0.970352569416145670, 0.970340483513409740, 0.970328395184822610, 0.970316304430414280, 0.970304211250215490, 0.970292115644255990, -0.970280017612566330, 0.970267917155176570, 0.970255814272117050, 0.970243708963418050, 0.970231601229109450, 0.970219491069222120, 0.970207378483786130, 0.970195263472831580, -0.970183146036388890, 0.970171026174488360, 0.970158903887160310, 0.970146779174434930, 0.970134652036342420, 0.970122522472913530, 0.970110390484178240, 0.970098256070167090, -0.970086119230910150, 0.970073979966438070, 0.970061838276780940, 0.970049694161969290, 0.970037547622033090, 0.970025398657003320, 0.970013247266909960, 0.970001093451783650, -0.969988937211654470, 0.969976778546552950, 0.969964617456509530, 0.969952453941554380, 0.969940288001718280, 0.969928119637031410, 0.969915948847524300, 0.969903775633227270, -0.969891599994170850, 0.969879421930385340, 0.969867241441901400, 0.969855058528749090, 0.969842873190959300, 0.969830685428562430, 0.969818495241588810, 0.969806302630068950, -0.969794107594033280, 0.969781910133512340, 0.969769710248536750, 0.969757507939136510, 0.969745303205342800, 0.969733096047185830, 0.969720886464696120, 0.969708674457904210, -0.969696460026840620, 0.969684243171535790, 0.969672023892020230, 0.969659802188324820, 0.969647578060479850, 0.969635351508515990, 0.969623122532463740, 0.969610891132353660, -0.969598657308216370, 0.969586421060082420, 0.969574182387982210, 0.969561941291946730, 0.969549697772006500, 0.969537451828191950, 0.969525203460533720, 0.969512952669062570, -0.969500699453809010, 0.969488443814803480, 0.969476185752077060, 0.969463925265660160, 0.969451662355583550, 0.969439397021877650, 0.969427129264573310, 0.969414859083701170, -0.969402586479291890, 0.969390311451375890, 0.969378033999984230, 0.969365754125147690, 0.969353471826896570, 0.969341187105261960, 0.969328899960274270, 0.969316610391964370, -0.969304318400362910, 0.969292023985500410, 0.969279727147408180, 0.969267427886116530, 0.969255126201656330, 0.969242822094058320, 0.969230515563353270, 0.969218206609571920, -0.969205895232744810, 0.969193581432903240, 0.969181265210077750, 0.969168946564298970, 0.969156625495597890, 0.969144302004005250, 0.969131976089551820, 0.969119647752268550, -0.969107316992185890, 0.969094983809335120, 0.969082648203746900, 0.969070310175452090, 0.969057969724481440, 0.969045626850865930, 0.969033281554636310, 0.969020933835823330, -0.969008583694458190, 0.968996231130571650, 0.968983876144194460, 0.968971518735357580, 0.968959158904091900, 0.968946796650428380, 0.968934431974397880, 0.968922064876031050, -0.968909695355359200, 0.968897323412413190, 0.968884949047223890, 0.968872572259822150, 0.968860193050239070, 0.968847811418505510, 0.968835427364652340, 0.968823040888710410, -0.968810651990711040, 0.968798260670685200, 0.968785866928663530, 0.968773470764677350, 0.968761072178757400, 0.968748671170934770, 0.968736267741240220, 0.968723861889705270, -0.968711453616360680, 0.968699042921237430, 0.968686629804366590, 0.968674214265779150, 0.968661796305506200, 0.968649375923578690, 0.968636953120027620, 0.968624527894884400, -0.968612100248179790, 0.968599670179944860, 0.968587237690210930, 0.968574802779008760, 0.968562365446369640, 0.968549925692324680, 0.968537483516904610, 0.968525038920140970, -0.968512591902064850, 0.968500142462707210, 0.968487690602099270, 0.968475236320271990, 0.968462779617256690, 0.968450320493084220, 0.968437858947786220, 0.968425394981393460, -0.968412928593937350, 0.968400459785448860, 0.968387988555959200, 0.968375514905499560, 0.968363038834101130, 0.968350560341794900, 0.968338079428612500, 0.968325596094584910, -0.968313110339743320, 0.968300622164118940, 0.968288131567742960, 0.968275638550646690, 0.968263143112861210, 0.968250645254417950, 0.968238144975348100, 0.968225642275682970, -0.968213137155453650, 0.968200629614691550, 0.968188119653427880, 0.968175607271693830, 0.968163092469520590, 0.968150575246939820, 0.968138055603982580, 0.968125533540680320, -0.968113009057064100, 0.968100482153165460, 0.968087952829015610, 0.968075421084645840, 0.968062886920087240, 0.968050350335371680, 0.968037811330530350, 0.968025269905594340, -0.968012726060595300, 0.968000179795564300, 0.967987631110532990, 0.967975080005532230, 0.967962526480594110, 0.967949970535749600, 0.967937412171030240, 0.967924851386467330, -0.967912288182092300, 0.967899722557936440, 0.967887154514031400, 0.967874584050408160, 0.967862011167098800, 0.967849435864134300, 0.967836858141546300, 0.967824277999366100, -0.967811695437625240, 0.967799110456355140, 0.967786523055587210, 0.967773933235352770, 0.967761340995683780, 0.967748746336611340, 0.967736149258167090, 0.967723549760382440, -0.967710947843288930, 0.967698343506918080, 0.967685736751301100, 0.967673127576470060, 0.967660515982456170, 0.967647901969290960, 0.967635285537006060, 0.967622666685632900, -0.967610045415203120, 0.967597421725748250, 0.967584795617299490, 0.967572167089889020, 0.967559536143548170, 0.967546902778308460, 0.967534266994201420, 0.967521628791258800, -0.967508988169512140, 0.967496345128992630, 0.967483699669732580, 0.967471051791763290, 0.967458401495116420, 0.967445748779823480, 0.967433093645916120, 0.967420436093426090, -0.967407776122385040, 0.967395113732824160, 0.967382448924775870, 0.967369781698271370, 0.967357112053342520, 0.967344439990020730, 0.967331765508337990, 0.967319088608325720, -0.967306409290015770, 0.967293727553439680, 0.967281043398629300, 0.967268356825616400, 0.967255667834432620, 0.967242976425109700, 0.967230282597679290, 0.967217586352173250, -0.967204887688623010, 0.967192186607060630, 0.967179483107517890, 0.967166777190026530, 0.967154068854618080, 0.967141358101324510, 0.967128644930177580, 0.967115929341208940, -0.967103211334450320, 0.967090490909933930, 0.967077768067691300, 0.967065042807754180, 0.967052315130154550, 0.967039585034924040, 0.967026852522094640, 0.967014117591698090, -0.967001380243766030, 0.966988640478330770, 0.966975898295423850, 0.966963153695077130, 0.966950406677322680, 0.966937657242192160, 0.966924905389717430, 0.966912151119930230, -0.966899394432862880, 0.966886635328547130, 0.966873873807014730, 0.966861109868297650, 0.966848343512427770, 0.966835574739437040, 0.966822803549357350, 0.966810029942220430, -0.966797253918058710, 0.966784475476903940, 0.966771694618787870, 0.966758911343742480, 0.966746125651799960, 0.966733337542992070, 0.966720547017350550, 0.966707754074908050, -0.966694958715696000, 0.966682160939746680, 0.966669360747091870, 0.966656558137763740, 0.966643753111794070, 0.966630945669215150, 0.966618135810058620, 0.966605323534356910, -0.966592508842141980, 0.966579691733445710, 0.966566872208300290, 0.966554050266737570, 0.966541225908789880, 0.966528399134488960, 0.966515569943866890, 0.966502738336956210, -0.966489904313788560, 0.966477067874396130, 0.966464229018811130, 0.966451387747065520, 0.966438544059191500, 0.966425697955220820, 0.966412849435186130, 0.966399998499119280, -0.966387145147052480, 0.966374289379017810, 0.966361431195047470, 0.966348570595173540, 0.966335707579428100, 0.966322842147843250, 0.966309974300451510, 0.966297104037284750, -0.966284231358375270, 0.966271356263755270, 0.966258478753456830, 0.966245598827512260, 0.966232716485953660, 0.966219831728812980, 0.966206944556122990, 0.966194054967915660, -0.966181162964223180, 0.966168268545077760, 0.966155371710511690, 0.966142472460557180, 0.966129570795246310, 0.966116666714611720, 0.966103760218685490, 0.966090851307499830, -0.966077939981087040, 0.966065026239479320, 0.966052110082709080, 0.966039191510808640, 0.966026270523809960, 0.966013347121745800, 0.966000421304648360, 0.965987493072549720, -0.965974562425482520, 0.965961629363478740, 0.965948693886571010, 0.965935755994791310, 0.965922815688172400, 0.965909872966746460, 0.965896927830545820, 0.965883980279602870, -0.965871030313950050, 0.965858077933619550, 0.965845123138643900, 0.965832165929055300, 0.965819206304886380, 0.965806244266169460, 0.965793279812936940, 0.965780312945221260, -0.965767343663054830, 0.965754371966469960, 0.965741397855499170, 0.965728421330174780, 0.965715442390529420, 0.965702461036595520, 0.965689477268405480, 0.965676491085991630, -0.965663502489386700, 0.965650511478622910, 0.965637518053732660, 0.965624522214748810, 0.965611523961703690, 0.965598523294629810, 0.965585520213559590, 0.965572514718525570, -0.965559506809560150, 0.965546496486696100, 0.965533483749965500, 0.965520468599401440, 0.965507451035036320, 0.965494431056902470, 0.965481408665032510, 0.965468383859459100, -0.965455356640214650, 0.965442327007331680, 0.965429294960843070, 0.965416260500781220, 0.965403223627178670, 0.965390184340068180, 0.965377142639482160, 0.965364098525453240, -0.965351051998014190, 0.965338003057197190, 0.965324951703035450, 0.965311897935561270, 0.965298841754807400, 0.965285783160806490, 0.965272722153591060, 0.965259658733193750, -0.965246592899647430, 0.965233524652984290, 0.965220453993237640, 0.965207380920439780, 0.965194305434623480, 0.965181227535821470, 0.965168147224066410, 0.965155064499390920, -0.965141979361827550, 0.965128891811409480, 0.965115801848169140, 0.965102709472139390, 0.965089614683352750, 0.965076517481842200, 0.965063417867640270, 0.965050315840779830, -0.965037211401293280, 0.965024104549214060, 0.965010995284574570, 0.964997883607407460, 0.964984769517745810, 0.964971653015622160, 0.964958534101069350, 0.964945412774120270, -0.964932289034807320, 0.964919162883163930, 0.964906034319222730, 0.964892903343016360, 0.964879769954577690, 0.964866634153939700, 0.964853495941135010, 0.964840355316196390, -0.964827212279157130, 0.964814066830049890, 0.964800918968907410, 0.964787768695762660, 0.964774616010648510, 0.964761460913597820, 0.964748303404643460, 0.964735143483818060, -0.964721981151155040, 0.964708816406687150, 0.964695649250447150, 0.964682479682468120, 0.964669307702782810, 0.964656133311424190, 0.964642956508425130, 0.964629777293818820, -0.964616595667638020, 0.964603411629915810, 0.964590225180685160, 0.964577036319978820, 0.964563845047829880, 0.964550651364271430, 0.964537455269335990, 0.964524256763057200, -0.964511055845467810, 0.964497852516600810, 0.964484646776489040, 0.964471438625165820, 0.964458228062663900, 0.964445015089016370, 0.964431799704256190, 0.964418581908416670, -0.964405361701530680, 0.964392139083631310, 0.964378914054751620, 0.964365686614924610, 0.964352456764183350, 0.964339224502560820, 0.964325989830090440, 0.964312752746805060, -0.964299513252737770, 0.964286271347921660, 0.964273027032389930, 0.964259780306175650, 0.964246531169311920, 0.964233279621831580, 0.964220025663768300, 0.964206769295155030, -0.964193510516024750, 0.964180249326410670, 0.964166985726346070, 0.964153719715863940, 0.964140451294997480, 0.964127180463779650, 0.964113907222244220, 0.964100631570423920, -0.964087353508352060, 0.964074073036061850, 0.964060790153586480, 0.964047504860959030, 0.964034217158212690, 0.964020927045381000, 0.964007634522496940, 0.963994339589593910, -0.963981042246704890, 0.963967742493863410, 0.963954440331102450, 0.963941135758455530, 0.963927828775955400, 0.963914519383636040, 0.963901207581530310, 0.963887893369671510, -0.963874576748093070, 0.963861257716828180, 0.963847936275910140, 0.963834612425372050, 0.963821286165247650, 0.963807957495570020, 0.963794626416372480, 0.963781292927688330, -0.963767957029550980, 0.963754618721993860, 0.963741278005050050, 0.963727934878752860, 0.963714589343136030, 0.963701241398232770, 0.963687891044076480, 0.963674538280700380, -0.963661183108137860, 0.963647825526422470, 0.963634465535587510, 0.963621103135666180, 0.963607738326692330, 0.963594371108699050, 0.963581001481719880, 0.963567629445788220, -0.963554255000937500, 0.963540878147201130, 0.963527498884612310, 0.963514117213205010, 0.963500733133012430, 0.963487346644067990, 0.963473957746405210, 0.963460566440057510, -0.963447172725058420, 0.963433776601441360, 0.963420378069239640, 0.963406977128487220, 0.963393573779217300, 0.963380168021463530, 0.963366759855259320, 0.963353349280638200, -0.963339936297633700, 0.963326520906279350, 0.963313103106608450, 0.963299682898655090, 0.963286260282452460, 0.963272835258034200, 0.963259407825433840, 0.963245977984685030, -0.963232545735821180, 0.963219111078875810, 0.963205674013882910, 0.963192234540875770, 0.963178792659888040, 0.963165348370953360, 0.963151901674105250, 0.963138452569377470, -0.963125001056803540, 0.963111547136416780, 0.963098090808251480, 0.963084632072340960, 0.963071170928718860, 0.963057707377418800, 0.963044241418474440, 0.963030773051919530, -0.963017302277787480, 0.963003829096112260, 0.962990353506927630, 0.962976875510267120, 0.962963395106164350, 0.962949912294653100, 0.962936427075767100, 0.962922939449539990, -0.962909449416005310, 0.962895956975197250, 0.962882462127149230, 0.962868964871895110, 0.962855465209468630, 0.962841963139903450, 0.962828458663233410, 0.962814951779492170, -0.962801442488713240, 0.962787930790931060, 0.962774416686179020, 0.962760900174490900, 0.962747381255900650, 0.962733859930441800, 0.962720336198148340, 0.962706810059053900, -0.962693281513192560, 0.962679750560598070, 0.962666217201304190, 0.962652681435344770, 0.962639143262753570, 0.962625602683564670, 0.962612059697811610, 0.962598514305528230, -0.962584966506748850, 0.962571416301507000, 0.962557863689836650, 0.962544308671771540, 0.962530751247345770, 0.962517191416593090, 0.962503629179547350, 0.962490064536242420, -0.962476497486712490, 0.962462928030991320, 0.962449356169112870, 0.962435781901111010, 0.962422205227019710, 0.962408626146872950, 0.962395044660704250, 0.962381460768548250, -0.962367874470438590, 0.962354285766409360, 0.962340694656494300, 0.962327101140727500, 0.962313505219142940, 0.962299906891774580, 0.962286306158656290, 0.962272703019822480, -0.962259097475306910, 0.962245489525143550, 0.962231879169366480, 0.962218266408009780, 0.962204651241107320, 0.962191033668693070, 0.962177413690801450, 0.962163791307466320, -0.962150166518721650, 0.962136539324601640, 0.962122909725140140, 0.962109277720371470, 0.962095643310329600, 0.962082006495048380, 0.962068367274562460, 0.962054725648905480, -0.962041081618111750, 0.962027435182215340, 0.962013786341250340, 0.962000135095250840, 0.961986481444251030, 0.961972825388284770, 0.961959166927386700, 0.961945506061590680, -0.961931842790930910, 0.961918177115441590, 0.961904509035156790, 0.961890838550110590, 0.961877165660337210, 0.961863490365871150, 0.961849812666746300, 0.961836132562996940, -0.961822450054657270, 0.961808765141761500, 0.961795077824343700, 0.961781388102438290, 0.961767695976079250, 0.961754001445301100, 0.961740304510137920, 0.961726605170624030, -0.961712903426793610, 0.961699199278680970, 0.961685492726320310, 0.961671783769745710, 0.961658072408991820, 0.961644358644092810, 0.961630642475082900, 0.961616923901996380, -0.961603202924867560, 0.961589479543730750, 0.961575753758620140, 0.961562025569569930, 0.961548294976614980, 0.961534561979789260, 0.961520826579127070, 0.961507088774662950, -0.961493348566430980, 0.961479605954465690, 0.961465860938801380, 0.961452113519472240, 0.961438363696512920, 0.961424611469957830, 0.961410856839841180, 0.961397099806197360, -0.961383340369060810, 0.961369578528465830, 0.961355814284446720, 0.961342047637038340, 0.961328278586274790, 0.961314507132190580, 0.961300733274820130, 0.961286957014197860, -0.961273178350358080, 0.961259397283335430, 0.961245613813164090, 0.961231827939878940, 0.961218039663514160, 0.961204248984104280, 0.961190455901683840, 0.961176660416287240, -0.961162862527948910, 0.961149062236703600, 0.961135259542585270, 0.961121454445629020, 0.961107646945869140, 0.961093837043340170, 0.961080024738076630, 0.961066210030113060, -0.961052392919483860, 0.961038573406223450, 0.961024751490366920, 0.961010927171948470, 0.960997100451002730, 0.960983271327564230, 0.960969439801667490, 0.960955605873347270, -0.960941769542637990, 0.960927930809573950, 0.960914089674190450, 0.960900246136521700, 0.960886400196602320, 0.960872551854466850, 0.960858701110150150, 0.960844847963686630, -0.960830992415110720, 0.960817134464457600, 0.960803274111761700, 0.960789411357057530, 0.960775546200379860, 0.960761678641763320, 0.960747808681242540, 0.960733936318852290, -0.960720061554626970, 0.960706184388601780, 0.960692304820811030, 0.960678422851289570, 0.960664538480072050, 0.960650651707193210, 0.960636762532687700, 0.960622870956590270, -0.960608976978935440, 0.960595080599758510, 0.960581181819093690, 0.960567280636976050, 0.960553377053440240, 0.960539471068520890, 0.960525562682252860, 0.960511651894670690, -0.960497738705809680, 0.960483823115704350, 0.960469905124389340, 0.960455984731899640, 0.960442061938269980, 0.960428136743535220, 0.960414209147730010, 0.960400279150889100, -0.960386346753047790, 0.960372411954240500, 0.960358474754502200, 0.960344535153867750, 0.960330593152372010, 0.960316648750049740, 0.960302701946935790, 0.960288752743064910, -0.960274801138472410, 0.960260847133192820, 0.960246890727261220, 0.960232931920712350, 0.960218970713581090, 0.960205007105902510, 0.960191041097711030, 0.960177072689042290, -0.960163101879930920, 0.960149128670411690, 0.960135153060519660, 0.960121175050289820, 0.960107194639756910, 0.960093211828956130, 0.960079226617922000, 0.960065239006690160, -0.960051248995295150, 0.960037256583772040, 0.960023261772155690, 0.960009264560481300, 0.959995264948783730, 0.959981262937097730, 0.959967258525458830, 0.959953251713901780, -0.959939242502461540, 0.959925230891173320, 0.959911216880071970, 0.959897200469192580, 0.959883181658570120, 0.959869160448239560, 0.959855136838236200, 0.959841110828595130, -0.959827082419351330, 0.959813051610539650, 0.959799018402195500, 0.959784982794353760, 0.959770944787049500, 0.959756904380317690, 0.959742861574193860, 0.959728816368712880, -0.959714768763909820, 0.959700718759819880, 0.959686666356478150, 0.959672611553919700, 0.959658554352179500, 0.959644494751293210, 0.959630432751295670, 0.959616368352221970, -0.959602301554107420, 0.959588232356987090, 0.959574160760896190, 0.959560086765869900, 0.959546010371943200, 0.959531931579151620, 0.959517850387530240, 0.959503766797114240, -0.959489680807938840, 0.959475592420039210, 0.959461501633450680, 0.959447408448208310, 0.959433312864347190, 0.959419214881903070, 0.959405114500910820, 0.959391011721405840, -0.959376906543423340, 0.959362798966998610, 0.959348688992166850, 0.959334576618963150, 0.959320461847423140, 0.959306344677582130, 0.959292225109475210, 0.959278103143137660, -0.959263978778604920, 0.959249852015912170, 0.959235722855094840, 0.959221591296188000, 0.959207457339227300, 0.959193320984248030, 0.959179182231285510, 0.959165041080375040, -0.959150897531551920, 0.959136751584851450, 0.959122603240309070, 0.959108452497960280, 0.959094299357840410, 0.959080143819984740, 0.959065985884428710, 0.959051825551207830, -0.959037662820357300, 0.959023497691912640, 0.959009330165908950, 0.958995160242382180, 0.958980987921367540, 0.958966813202900450, 0.958952636087016310, 0.958938456573750540, -0.958924274663138680, 0.958910090355216130, 0.958895903650018090, 0.958881714547580530, 0.958867523047938650, 0.958853329151128090, 0.958839132857184140, 0.958824934166142340, -0.958810733078038210, 0.958796529592906950, 0.958782323710784650, 0.958768115431706590, 0.958753904755708210, 0.958739691682825020, 0.958725476213092680, 0.958711258346546690, -0.958697038083222490, 0.958682815423155370, 0.958668590366381520, 0.958654362912936260, 0.958640133062855000, 0.958625900816173490, 0.958611666172927150, 0.958597429133151710, -0.958583189696882610, 0.958568947864155360, 0.958554703635005940, 0.958540457009469880, 0.958526207987582590, 0.958511956569379820, 0.958497702754897100, 0.958483446544170170, -0.958469187937234350, 0.958454926934125710, 0.958440663534879890, 0.958426397739532420, 0.958412129548118940, 0.958397858960675090, 0.958383585977236610, 0.958369310597839140, -0.958355032822518220, 0.958340752651309910, 0.958326470084249650, 0.958312185121373390, 0.958297897762716570, 0.958283608008315020, 0.958269315858204410, 0.958255021312420240, -0.958240724370998830, 0.958226425033975590, 0.958212123301386280, 0.958197819173266740, 0.958183512649652510, 0.958169203730579680, 0.958154892416083650, 0.958140578706200290, -0.958126262600965670, 0.958111944100415340, 0.958097623204585250, 0.958083299913511040, 0.958068974227228590, 0.958054646145773740, 0.958040315669182240, 0.958025982797489740, -0.958011647530732540, 0.957997309868946160, 0.957982969812166460, 0.957968627360429430, 0.957954282513770790, 0.957939935272226540, 0.957925585635832080, 0.957911233604623940, -0.957896879178637750, 0.957882522357909380, 0.957868163142474690, 0.957853801532369540, 0.957839437527629900, 0.957825071128291740, 0.957810702334390580, 0.957796331145962850, -0.957781957563044410, 0.957767581585671100, 0.957753203213878690, 0.957738822447703360, 0.957724439287180980, 0.957710053732347300, 0.957695665783238730, 0.957681275439890900, -0.957666882702339910, 0.957652487570621710, 0.957638090044772290, 0.957623690124827730, 0.957609287810823880, 0.957594883102796610, 0.957580476000782330, 0.957566066504816790, -0.957551654614936190, 0.957537240331176490, 0.957522823653573550, 0.957508404582163690, 0.957493983116982750, 0.957479559258066600, 0.957465133005451770, 0.957450704359174230, -0.957436273319269840, 0.957421839885774780, 0.957407404058725040, 0.957392965838156920, 0.957378525224106050, 0.957364082216609180, 0.957349636815702070, 0.957335189021420900, -0.957320738833801750, 0.957306286252880720, 0.957291831278693990, 0.957277373911277650, 0.957262914150667670, 0.957248451996900670, 0.957233987450012540, 0.957219520510039450, -0.957205051177017490, 0.957190579450982960, 0.957176105331971950, 0.957161628820020650, 0.957147149915165030, 0.957132668617441840, 0.957118184926887050, 0.957103698843536630, -0.957089210367427110, 0.957074719498594460, 0.957060226237075100, 0.957045730582904870, 0.957031232536120550, 0.957016732096758190, 0.957002229264853900, 0.956987724040444190, -0.956973216423565030, 0.956958706414252960, 0.956944194012544050, 0.956929679218474380, 0.956915162032080820, 0.956900642453399340, 0.956886120482466240, 0.956871596119317820, -0.956857069363990400, 0.956842540216520380, 0.956828008676943730, 0.956813474745297320, 0.956798938421617230, 0.956784399705939760, 0.956769858598301330, 0.956755315098738120, -0.956740769207286790, 0.956726220923983520, 0.956711670248864390, 0.956697117181966260, 0.956682561723325440, 0.956668003872978230, 0.956653443630961050, 0.956638880997310090, -0.956624315972062100, 0.956609748555253270, 0.956595178746919790, 0.956580606547098640, 0.956566031955825900, 0.956551454973138200, 0.956536875599071750, 0.956522293833663160, -0.956507709676948870, 0.956493123128965060, 0.956478534189748600, 0.956463942859335890, 0.956449349137763250, 0.956434753025067310, 0.956420154521284480, 0.956405553626451300, -0.956390950340604170, 0.956376344663779410, 0.956361736596014090, 0.956347126137344410, 0.956332513287806880, 0.956317898047438050, 0.956303280416274550, 0.956288660394352790, -0.956274037981709400, 0.956259413178380700, 0.956244785984403660, 0.956230156399814680, 0.956215524424650300, 0.956200890058947150, 0.956186253302741760, 0.956171614156070770, -0.956156972618970370, 0.956142328691477860, 0.956127682373629550, 0.956113033665462080, 0.956098382567011960, 0.956083729078315850, 0.956069073199410480, 0.956054414930332390, -0.956039754271118090, 0.956025091221804570, 0.956010425782428340, 0.955995757953026050, 0.955981087733634330, 0.955966415124289930, 0.955951740125029590, 0.955937062735889520, -0.955922382956907010, 0.955907700788118710, 0.955893016229561020, 0.955878329281270810, 0.955863639943284830, 0.955848948215639700, 0.955834254098372190, 0.955819557591518820, -0.955804858695116890, 0.955790157409202700, 0.955775453733813120, 0.955760747668984890, 0.955746039214754870, 0.955731328371159710, 0.955716615138236250, 0.955701899516021030, -0.955687181504551230, 0.955672461103863500, 0.955657738313994700, 0.955643013134981460, 0.955628285566860750, 0.955613555609669320, 0.955598823263443700, 0.955584088528221300, -0.955569351404038650, 0.955554611890932710, 0.955539869988940140, 0.955525125698098000, 0.955510379018442930, 0.955495629950012030, 0.955480878492841690, 0.955466124646969450, -0.955451368412431950, 0.955436609789265920, 0.955421848777508460, 0.955407085377196320, 0.955392319588366570, 0.955377551411055960, 0.955362780845301130, 0.955348007891139720, -0.955333232548608250, 0.955318454817743690, 0.955303674698583020, 0.955288892191163090, 0.955274107295520980, 0.955259320011693450, 0.955244530339717680, 0.955229738279630760, -0.955214943831469430, 0.955200146995270670, 0.955185347771071670, 0.955170546158909170, 0.955155742158820380, 0.955140935770842030, 0.955126126995011540, 0.955111315831365660, -0.955096502279941580, 0.955081686340776170, 0.955066868013906610, 0.955052047299369880, 0.955037224197202830, 0.955022398707442880, 0.955007570830126990, 0.954992740565292150, -0.954977907912975430, 0.954963072873213910, 0.954948235446044790, 0.954933395631505140, 0.954918553429631610, 0.954903708840462050, 0.954888861864033100, 0.954874012500382060, -0.954859160749546020, 0.954844306611562050, 0.954829450086467360, 0.954814591174299010, 0.954799729875093870, 0.954784866188889800, 0.954770000115723440, 0.954755131655632190, -0.954740260808653040, 0.954725387574823170, 0.954710511954179890, 0.954695633946760160, 0.954680753552601510, 0.954665870771741030, 0.954650985604215800, 0.954636098050063110, -0.954621208109320270, 0.954606315782024370, 0.954591421068212600, 0.954576523967922140, 0.954561624481190530, 0.954546722608054950, 0.954531818348552500, 0.954516911702720460, -0.954502002670596260, 0.954487091252216980, 0.954472177447620030, 0.954457261256842270, 0.954442342679921670, 0.954427421716895210, 0.954412498367800290, 0.954397572632674000, -0.954382644511553860, 0.954367714004477060, 0.954352781111480700, 0.954337845832602730, 0.954322908167880010, 0.954307968117350190, 0.954293025681050340, 0.954278080859017890, -0.954263133651290340, 0.954248184057904900, 0.954233232078898760, 0.954218277714309780, 0.954203320964175150, 0.954188361828532170, 0.954173400307418370, 0.954158436400870950, -0.954143470108927530, 0.954128501431625090, 0.954113530369001710, 0.954098556921094580, 0.954083581087940890, 0.954068602869578400, 0.954053622266044290, 0.954038639277376200, -0.954023653903611550, 0.954008666144787410, 0.953993676000941870, 0.953978683472112120, 0.953963688558335800, 0.953948691259650090, 0.953933691576092760, 0.953918689507701200, -0.953903685054512840, 0.953888678216565090, 0.953873668993895920, 0.953858657386542520, 0.953843643394542420, 0.953828627017933360, 0.953813608256752650, 0.953798587111037930, -0.953783563580826390, 0.953768537666156320, 0.953753509367064930, 0.953738478683589630, 0.953723445615768270, 0.953708410163638280, 0.953693372327237170, 0.953678332106602690, -0.953663289501772150, 0.953648244512783630, 0.953633197139674430, 0.953618147382482300, 0.953603095241244760, 0.953588040715999560, 0.953572983806784240, 0.953557924513636410, -0.953542862836593510, 0.953527798775693710, 0.953512732330974440, 0.953497663502473340, 0.953482592290228140, 0.953467518694276370, 0.953452442714655790, 0.953437364351403920, -0.953422283604558940, 0.953407200474158170, 0.953392114960239350, 0.953377027062840330, 0.953361936781998760, 0.953346844117752280, 0.953331749070138730, 0.953316651639195540, -0.953301551824960900, 0.953286449627472440, 0.953271345046767920, 0.953256238082884950, 0.953241128735861420, 0.953226017005735060, 0.953210902892543400, 0.953195786396324850, -0.953180667517116720, 0.953165546254956860, 0.953150422609883250, 0.953135296581933520, 0.953120168171145640, 0.953105037377557250, 0.953089904201206100, 0.953074768642130370, -0.953059630700367700, 0.953044490375955950, 0.953029347668933100, 0.953014202579336780, 0.952999055107204950, 0.952983905252575480, 0.952968753015486000, 0.952953598395974930, -0.952938441394079790, 0.952923282009838670, 0.952908120243289190, 0.952892956094469560, 0.952877789563417510, 0.952862620650170580, 0.952847449354767510, 0.952832275677245820, -0.952817099617643380, 0.952801921175998160, 0.952786740352348230, 0.952771557146731340, 0.952756371559185690, 0.952741183589748800, 0.952725993238459190, 0.952710800505354620, -0.952695605390473040, 0.952680407893852440, 0.952665208015530780, 0.952650005755546150, 0.952634801113936170, 0.952619594090739600, 0.952604384685993950, 0.952589172899737320, -0.952573958732007790, 0.952558742182843420, 0.952543523252282090, 0.952528301940361980, 0.952513078247120840, 0.952497852172597300, 0.952482623716829120, 0.952467392879854380, -0.952452159661711260, 0.952436924062437630, 0.952421686082071670, 0.952406445720651580, 0.952391202978215000, 0.952375957854800780, 0.952360710350446670, 0.952345460465190750, -0.952330208199071100, 0.952314953552126030, 0.952299696524393610, 0.952284437115911600, 0.952269175326718730, 0.952253911156852980, 0.952238644606352550, 0.952223375675255390, -0.952208104363599820, 0.952192830671423910, 0.952177554598766070, 0.952162276145663950, 0.952146995312156520, 0.952131712098281510, 0.952116426504077240, 0.952101138529581890, -0.952085848174833770, 0.952070555439870960, 0.952055260324731760, 0.952039962829454240, 0.952024662954076950, 0.952009360698638060, 0.951994056063175780, 0.951978749047728390, -0.951963439652334100, 0.951948127877031200, 0.951932813721857670, 0.951917497186852370, 0.951902178272053370, 0.951886856977498970, 0.951871533303227380, 0.951856207249277000, -0.951840878815686020, 0.951825548002492860, 0.951810214809735600, 0.951794879237453100, 0.951779541285683320, 0.951764200954464790, 0.951748858243835700, 0.951733513153834480, -0.951718165684499410, 0.951702815835868800, 0.951687463607981290, 0.951672109000875180, 0.951656752014588770, 0.951641392649160480, 0.951626030904628720, 0.951610666781031900, -0.951595300278408330, 0.951579931396796310, 0.951564560136234800, 0.951549186496761790, 0.951533810478415790, 0.951518432081235320, 0.951503051305258810, 0.951487668150524660, -0.951472282617071290, 0.951456894704937000, 0.951441504414160640, 0.951426111744780640, 0.951410716696835300, 0.951395319270363140, 0.951379919465402680, 0.951364517281992560, -0.951349112720170750, 0.951333705779976450, 0.951318296461447830, 0.951302884764623550, 0.951287470689542110, 0.951272054236241840, 0.951256635404761570, 0.951241214195139630, -0.951225790607414410, 0.951210364641625010, 0.951194936297809710, 0.951179505576007060, 0.951164072476255560, 0.951148636998593980, 0.951133199143060830, 0.951117758909694520, -0.951102316298533700, 0.951086871309617330, 0.951071423942983720, 0.951055974198671610, 0.951040522076719520, 0.951025067577166210, 0.951009610700050190, 0.950994151445409770, -0.950978689813284370, 0.950963225803712180, 0.950947759416731930, 0.950932290652382380, 0.950916819510701950, 0.950901345991729600, 0.950885870095503850, 0.950870391822063120, -0.950854911171446720, 0.950839428143693040, 0.950823942738840740, 0.950808454956928560, 0.950792964797995350, 0.950777472262079650, 0.950761977349220080, 0.950746480059455720, -0.950730980392825220, 0.950715478349367320, 0.950699973929120650, 0.950684467132124070, 0.950668957958416330, 0.950653446408036170, 0.950637932481022240, 0.950622416177413610, -0.950606897497249030, 0.950591376440567130, 0.950575853007406880, 0.950560327197806920, 0.950544799011806110, 0.950529268449443410, 0.950513735510757130, 0.950498200195786900, -0.950482662504571140, 0.950467122437148700, 0.950451579993558560, 0.950436035173839340, 0.950420487978030140, 0.950404938406169350, 0.950389386458296510, 0.950373832134450260, -0.950358275434669330, 0.950342716358992810, 0.950327154907459450, 0.950311591080108210, 0.950296024876977950, 0.950280456298107420, 0.950264885343536040, 0.950249312013302430, -0.950233736307445450, 0.950218158226004190, 0.950202577769017620, 0.950186994936524480, 0.950171409728563950, 0.950155822145174580, 0.950140232186395870, 0.950124639852266690, -0.950109045142825900, 0.950093448058112470, 0.950077848598165350, 0.950062246763023640, 0.950046642552726080, 0.950031035967312200, 0.950015427006820730, 0.949999815671290660, -0.949984201960761050, 0.949968585875270890, 0.949952967414859350, 0.949937346579565410, 0.949921723369427710, 0.949906097784486090, 0.949890469824779200, 0.949874839490346120, -0.949859206781225930, 0.949843571697457700, 0.949827934239080630, 0.949812294406133350, 0.949796652198655610, 0.949781007616686380, 0.949765360660264510, 0.949749711329429200, -0.949734059624219750, 0.949718405544675020, 0.949702749090834410, 0.949687090262736570, 0.949671429060421230, 0.949655765483927380, 0.949640099533294200, 0.949624431208560660, -0.949608760509766060, 0.949593087436949590, 0.949577411990150330, 0.949561734169407370, 0.949546053974760220, 0.949530371406248070, 0.949514686463909910, 0.949498999147785020, -0.949483309457912710, 0.949467617394332050, 0.949451922957082140, 0.949436226146202600, 0.949420526961732620, 0.949404825403711290, 0.949389121472177800, 0.949373415167171660, -0.949357706488731860, 0.949341995436897790, 0.949326282011708540, 0.949310566213203870, 0.949294848041422720, 0.949279127496404420, 0.949263404578188360, 0.949247679286813750, -0.949231951622319990, 0.949216221584746390, 0.949200489174131910, 0.949184754390516420, 0.949169017233939090, 0.949153277704439250, 0.949137535802056180, 0.949121791526829290, -0.949106044878797910, 0.949090295858001200, 0.949074544464478920, 0.949058790698270370, 0.949043034559414860, 0.949027276047951670, 0.949011515163920350, 0.948995751907360190, -0.948979986278310710, 0.948964218276810990, 0.948948447902900890, 0.948932675156619830, 0.948916900038006990, 0.948901122547101910, 0.948885342683944090, 0.948869560448572850, -0.948853775841027370, 0.948837988861347850, 0.948822199509573250, 0.948806407785743210, 0.948790613689897140, 0.948774817222074570, 0.948759018382314910, 0.948743217170657790, -0.948727413587142300, 0.948711607631808510, 0.948695799304695720, 0.948679988605843460, 0.948664175535291250, 0.948648360093078510, 0.948632542279244980, 0.948616722093829970, -0.948600899536872990, 0.948585074608414010, 0.948569247308492350, 0.948553417637147510, 0.948537585594419250, 0.948521751180346870, 0.948505914394970230, 0.948490075238328510, -0.948474233710461800, 0.948458389811409620, 0.948442543541211380, 0.948426694899906830, 0.948410843887535490, 0.948394990504137110, 0.948379134749751220, 0.948363276624417220, -0.948347416128175300, 0.948331553261064770, 0.948315688023125490, 0.948299820414396870, 0.948283950434918750, 0.948268078084730790, 0.948252203363872390, 0.948236326272383630, -0.948220446810304150, 0.948204564977673580, 0.948188680774531560, 0.948172794200917820, 0.948156905256872020, 0.948141013942434110, 0.948125120257643280, 0.948109224202539960, -0.948093325777163540, 0.948077424981553900, 0.948061521815750650, 0.948045616279793560, 0.948029708373722470, 0.948013798097577130, 0.947997885451396960, 0.947981970435222370, -0.947966053049092870, 0.947950133293048340, 0.947934211167128280, 0.947918286671372790, 0.947902359805821600, 0.947886430570514250, 0.947870498965491030, 0.947854564990791570, -0.947838628646455740, 0.947822689932523390, 0.947806748849034260, 0.947790805396028220, 0.947774859573545240, 0.947758911381624710, 0.947742960820307290, 0.947727007889632490, -0.947711052589640060, 0.947695094920370070, 0.947679134881862280, 0.947663172474156770, 0.947647207697293270, 0.947631240551311430, 0.947615271036251870, 0.947599299152154020, -0.947583324899057940, 0.947567348277003620, 0.947551369286030900, 0.947535387926179750, 0.947519404197489810, 0.947503418100001720, 0.947487429633754990, 0.947471438798789810, -0.947455445595145940, 0.947439450022863450, 0.947423452081982420, 0.947407451772542710, 0.947391449094584060, 0.947375444048147110, 0.947359436633271490, 0.947343426849997280, -0.947327414698364570, 0.947311400178413310, 0.947295383290183590, 0.947279364033715040, 0.947263342409048410, 0.947247318416223450, 0.947231292055280120, 0.947215263326258610, -0.947199232229198880, 0.947183198764141140, 0.947167162931125460, 0.947151124730191470, 0.947135084161380040, 0.947119041224730780, 0.947102995920284020, 0.947086948248079820, -0.947070898208158150, 0.947054845800559210, 0.947038791025323290, 0.947022733882490030, 0.947006674372100180, 0.946990612494193700, 0.946974548248810670, 0.946958481635991280, -0.946942412655775610, 0.946926341308203970, 0.946910267593316200, 0.946894191511153060, 0.946878113061754400, 0.946862032245160520, 0.946845949061411510, 0.946829863510547650, -0.946813775592609150, 0.946797685307636190, 0.946781592655668750, 0.946765497636747550, 0.946749400250912700, 0.946733300498204260, 0.946717198378662640, 0.946701093892327930, -0.946684987039240530, 0.946668877819440760, 0.946652766232968460, 0.946636652279864490, 0.946620535960168820, 0.946604417273921970, 0.946588296221163920, 0.946572172801935290, -0.946556047016276050, 0.946539918864226500, 0.946523788345827510, 0.946507655461118920, 0.946491520210141270, 0.946475382592934840, 0.946459242609539950, 0.946443100259996890, -0.946426955544346080, 0.946410808462627710, 0.946394659014882510, 0.946378507201150690, 0.946362353021472540, 0.946346196475888580, 0.946330037564439120, 0.946313876287164570, -0.946297712644105000, 0.946281546635301400, 0.946265378260794040, 0.946249207520623250, 0.946233034414829310, 0.946216858943452870, 0.946200681106534320, 0.946184500904113990, -0.946168318336232160, 0.946152133402929810, 0.946135946104247120, 0.946119756440224500, 0.946103564410902600, 0.946087370016321820, 0.946071173256522460, 0.946054974131545270, -0.946038772641430330, 0.946022568786218820, 0.946006362565950830, 0.945990153980666880, 0.945973943030407600, 0.945957729715213520, 0.945941514035125050, 0.945925295990182490, -0.945909075580427030, 0.945892852805898850, 0.945876627666638490, 0.945860400162686690, 0.945844170294083740, 0.945827938060870510, 0.945811703463087290, 0.945795466500774620, -0.945779227173973560, 0.945762985482724420, 0.945746741427067830, 0.945730495007044310, 0.945714246222694620, 0.945697995074059380, 0.945681741561179010, 0.945665485684094140, -0.945649227442845740, 0.945632966837474330, 0.945616703868020550, 0.945600438534524910, 0.945584170837028170, 0.945567900775571070, 0.945551628350193910, 0.945535353560937990, -0.945519076407843610, 0.945502796890951620, 0.945486515010302560, 0.945470230765937280, 0.945453944157896410, 0.945437655186220690, 0.945421363850950550, 0.945405070152127270, -0.945388774089791270, 0.945372475663983410, 0.945356174874744330, 0.945339871722114760, 0.945323566206135560, 0.945307258326847140, 0.945290948084290930, 0.945274635478507320, -0.945258320509537060, 0.945242003177421020, 0.945225683482200040, 0.945209361423914760, 0.945193037002606150, 0.945176710218314620, 0.945160381071081580, 0.945144049560947660, -0.945127715687953620, 0.945111379452140190, 0.945095040853548450, 0.945078699892219040, 0.945062356568192820, 0.945046010881510520, 0.945029662832213460, 0.945013312420342140, -0.944996959645937660, 0.944980604509040760, 0.944964247009692280, 0.944947887147933210, 0.944931524923804170, 0.944915160337346570, 0.944898793388601170, 0.944882424077608700, -0.944866052404410130, 0.944849678369046540, 0.944833301971558680, 0.944816923211987510, 0.944800542090373900, 0.944784158606759130, 0.944767772761183950, 0.944751384553689340, -0.944734993984316260, 0.944718601053105790, 0.944702205760098780, 0.944685808105336200, 0.944669408088858800, 0.944653005710708200, 0.944636600970925170, 0.944620193869550540, -0.944603784406625400, 0.944587372582190940, 0.944570958396287910, 0.944554541848957260, 0.944538122940240530, 0.944521701670178460, 0.944505278038812120, 0.944488852046182710, -0.944472423692331090, 0.944455992977298430, 0.944439559901125710, 0.944423124463853900, 0.944406686665524520, 0.944390246506178420, 0.944373803985856800, 0.944357359104600500, -0.944340911862450950, 0.944324462259449100, 0.944308010295635710, 0.944291555971052630, 0.944275099285740720, 0.944258640239741040, 0.944242178833094690, 0.944225715065842960, -0.944209248938026930, 0.944192780449687800, 0.944176309600866400, 0.944159836391604500, 0.944143360821942950, 0.944126882891923150, 0.944110402601586070, 0.944093919950972920, -0.944077434940125080, 0.944060947569083650, 0.944044457837889480, 0.944027965746584430, 0.944011471295209570, 0.943994974483805980, 0.943978475312414970, 0.943961973781077820, -0.943945469889835630, 0.943928963638729580, 0.943912455027801300, 0.943895944057091980, 0.943879430726642820, 0.943862915036495000, 0.943846396986689930, 0.943829876577268800, -0.943813353808273030, 0.943796828679743680, 0.943780301191722400, 0.943763771344250490, 0.943747239137369020, 0.943730704571119520, 0.943714167645543280, 0.943697628360681610, -0.943681086716575580, 0.943664542713267160, 0.943647996350797320, 0.943631447629207480, 0.943614896548539140, 0.943598343108833390, 0.943581787310131870, 0.943565229152475870, -0.943548668635906580, 0.943532105760465870, 0.943515540526194800, 0.943498972933135010, 0.943482402981327680, 0.943465830670814460, 0.943449256001636540, 0.943432678973835540, -0.943416099587452540, 0.943399517842529620, 0.943382933739107870, 0.943366347277228790, 0.943349758456933810, 0.943333167278264550, 0.943316573741262210, 0.943299977845968310, -0.943283379592424590, 0.943266778980672570, 0.943250176010753560, 0.943233570682709080, 0.943216962996580640, 0.943200352952409890, 0.943183740550238130, 0.943167125790106860, -0.943150508672057960, 0.943133889196132840, 0.943117267362373000, 0.943100643170819990, 0.943084016621515420, 0.943067387714500720, 0.943050756449817620, 0.943034122827507320, -0.943017486847612000, 0.943000848510172850, 0.942984207815231730, 0.942967564762830060, 0.942950919353009450, 0.942934271585811560, 0.942917621461277670, 0.942900968979450080, -0.942884314140369990, 0.942867656944079150, 0.942850997390619170, 0.942834335480031700, 0.942817671212358490, 0.942801004587640930, 0.942784335605920680, 0.942767664267239900, -0.942750990571639910, 0.942734314519162450, 0.942717636109849160, 0.942700955343741760, 0.942684272220882020, 0.942667586741311350, 0.942650898905072030, 0.942634208712205380, -0.942617516162753240, 0.942600821256757260, 0.942584123994259280, 0.942567424375301060, 0.942550722399924100, 0.942534018068170170, 0.942517311380081440, 0.942500602335699540, -0.942483890935066020, 0.942467177178222810, 0.942450461065211580, 0.942433742596074260, 0.942417021770852630, 0.942400298589588070, 0.942383573052323120, 0.942366845159099300, -0.942350114909958240, 0.942333382304941900, 0.942316647344092150, 0.942299910027450840, 0.942283170355059370, 0.942266428326960280, 0.942249683943195190, 0.942232937203805850, -0.942216188108834120, 0.942199436658321950, 0.942182682852311220, 0.942165926690843760, 0.942149168173961100, 0.942132407301706000, 0.942115644074119740, 0.942098878491244410, -0.942082110553121850, 0.942065340259794050, 0.942048567611302960, 0.942031792607690430, 0.942015015248998000, 0.941998235535268400, 0.941981453466543270, 0.941964669042864470, -0.941947882264273950, 0.941931093130813800, 0.941914301642525880, 0.941897507799451920, 0.941880711601634450, 0.941863913049115320, 0.941847112141936280, 0.941830308880139520, -0.941813503263766890, 0.941796695292860590, 0.941779884967462570, 0.941763072287614580, 0.941746257253359140, 0.941729439864738000, 0.941712620121793350, 0.941695798024567150, -0.941678973573101370, 0.941662146767438200, 0.941645317607619380, 0.941628486093687540, 0.941611652225684550, 0.941594816003652360, 0.941577977427633160, 0.941561136497669040, -0.941544293213802060, 0.941527447576074320, 0.941510599584527650, 0.941493749239204810, 0.941476896540147660, 0.941460041487398150, 0.941443184080998700, 0.941426324320991160, -0.941409462207417840, 0.941392597740320800, 0.941375730919742030, 0.941358861745724250, 0.941341990218309330, 0.941325116337539350, 0.941308240103456710, 0.941291361516103380, -0.941274480575521650, 0.941257597281753400, 0.941240711634841460, 0.941223823634827820, 0.941206933281754530, 0.941190040575664020, 0.941173145516598250, 0.941156248104599750, -0.941139348339710580, 0.941122446221972720, 0.941105541751429130, 0.941088634928121560, 0.941071725752092520, 0.941054814223384110, 0.941037900342038600, 0.941020984108098420, -0.941004065521605760, 0.940987144582602690, 0.940970221291131950, 0.940953295647235730, 0.940936367650956340, 0.940919437302335960, 0.940902504601416890, 0.940885569548241650, -0.940868632142852210, 0.940851692385291430, 0.940834750275601480, 0.940817805813824680, 0.940800859000003320, 0.940783909834179810, 0.940766958316396450, 0.940750004446695760, -0.940733048225119830, 0.940716089651711500, 0.940699128726512960, 0.940682165449566620, 0.940665199820914900, 0.940648231840600090, 0.940631261508664720, 0.940614288825150970, -0.940597313790101700, 0.940580336403559200, 0.940563356665565900, 0.940546374576164080, 0.940529390135396490, 0.940512403343305330, 0.940495414199933100, 0.940478422705322110, -0.940461428859515450, 0.940444432662555060, 0.940427434114483710, 0.940410433215343680, 0.940393429965177610, 0.940376424364028020, 0.940359416411937320, 0.940342406108947700, -0.940325393455102470, 0.940308378450443790, 0.940291361095014100, 0.940274341388856020, 0.940257319332012060, 0.940240294924524770, 0.940223268166436530, 0.940206239057790330, -0.940189207598628670, 0.940172173788993870, 0.940155137628928660, 0.940138099118475570, 0.940121058257677330, 0.940104015046576370, 0.940086969485215080, 0.940069921573636780, -0.940052871311883530, 0.940035818699998190, 0.940018763738023290, 0.940001706426001450, 0.939984646763975310, 0.939967584751987610, 0.939950520390080650, 0.939933453678297610, -0.939916384616681030, 0.939899313205273530, 0.939882239444117640, 0.939865163333256200, 0.939848084872731860, 0.939831004062587020, 0.939813920902864860, 0.939796835393608030, -0.939779747534859040, 0.939762657326660760, 0.939745564769055690, 0.939728469862086800, 0.939711372605796740, 0.939694273000228010, 0.939677171045423810, 0.939660066741426660, -0.939642960088279410, 0.939625851086024810, 0.939608739734705490, 0.939591626034364300, 0.939574509985043770, 0.939557391586787300, 0.939540270839637310, 0.939523147743636770, -0.939506022298828180, 0.939488894505254630, 0.939471764362958870, 0.939454631871983640, 0.939437497032371560, 0.939420359844166050, 0.939403220307409530, 0.939386078422145050, -0.939368934188415380, 0.939351787606263370, 0.939334638675731970, 0.939317487396863830, 0.939300333769701790, 0.939283177794289160, 0.939266019470668570, 0.939248858798882870, -0.939231695778975140, 0.939214530410988120, 0.939197362694964790, 0.939180192630947760, 0.939163020218980570, 0.939145845459105840, 0.939128668351366440, 0.939111488895805310, -0.939094307092465550, 0.939077122941390010, 0.939059936442621650, 0.939042747596203210, 0.939025556402178110, 0.939008362860589200, 0.938991166971479330, 0.938973968734891580, -0.938956768150868930, 0.938939565219454210, 0.938922359940690400, 0.938905152314621020, 0.938887942341288690, 0.938870730020736510, 0.938853515353007540, 0.938836298338144750, -0.938819078976191210, 0.938801857267190010, 0.938784633211183880, 0.938767406808216460, 0.938750178058330500, 0.938732946961569060, 0.938715713517975340, 0.938698477727592300, -0.938681239590463010, 0.938663999106630680, 0.938646756276138030, 0.938629511099028810, 0.938612263575345770, 0.938595013705132100, 0.938577761488430970, 0.938560506925285360, -0.938543250015738460, 0.938525990759833120, 0.938508729157613190, 0.938491465209121410, 0.938474198914400980, 0.938456930273494970, 0.938439659286446680, 0.938422385953299300, -0.938405110274095900, 0.938387832248879450, 0.938370551877693690, 0.938353269160581480, 0.938335984097586230, 0.938318696688751010, 0.938301406934119010, 0.938284114833733420, -0.938266820387637650, 0.938249523595874550, 0.938232224458487860, 0.938214922975520560, 0.938197619147016050, 0.938180312973017520, 0.938163004453568150, 0.938145693588711250, -0.938128380378489890, 0.938111064822947820, 0.938093746922128100, 0.938076426676074050, 0.938059104084828840, 0.938041779148436010, 0.938024451866938610, 0.938007122240380190, -0.937989790268803580, 0.937972455952252760, 0.937955119290770910, 0.937937780284401220, 0.937920438933187000, 0.937903095237171750, 0.937885749196398780, 0.937868400810911160, -0.937851050080752760, 0.937833697005966750, 0.937816341586596550, 0.937798983822685450, 0.937781623714276980, 0.937764261261414320, 0.937746896464141110, 0.937729529322500310, -0.937712159836536000, 0.937694788006291250, 0.937677413831809580, 0.937660037313134410, 0.937642658450309030, 0.937625277243377080, 0.937607893692381960, 0.937590507797366750, -0.937573119558375630, 0.937555728975451700, 0.937538336048638450, 0.937520940777979320, 0.937503543163517810, 0.937486143205297550, 0.937468740903361520, 0.937451336257754010, -0.937433929268518100, 0.937416519935697410, 0.937399108259335480, 0.937381694239475700, 0.937364277876161720, 0.937346859169436940, 0.937329438119344880, 0.937312014725929400, -0.937294588989233900, 0.937277160909302020, 0.937259730486177170, 0.937242297719902970, 0.937224862610523070, 0.937207425158080980, 0.937189985362620100, 0.937172543224184530, -0.937155098742817550, 0.937137651918562800, 0.937120202751464020, 0.937102751241564720, 0.937085297388908440, 0.937067841193538700, 0.937050382655499670, 0.937032921774834660, -0.937015458551587300, 0.936997992985801330, 0.936980525077520390, 0.936963054826788210, 0.936945582233648320, 0.936928107298144130, 0.936910630020320050, 0.936893150400219250, -0.936875668437885720, 0.936858184133362970, 0.936840697486694850, 0.936823208497924890, 0.936805717167096600, 0.936788223494254390, 0.936770727479441570, 0.936753229122701870, -0.936735728424079150, 0.936718225383617150, 0.936700720001359620, 0.936683212277350190, 0.936665702211632480, 0.936648189804250800, 0.936630675055248660, 0.936613157964669820, -0.936595638532558120, 0.936578116758957300, 0.936560592643911230, 0.936543066187463640, 0.936525537389658050, 0.936508006250538980, 0.936490472770149850, 0.936472936948534510, -0.936455398785736910, 0.936437858281800710, 0.936420315436769960, 0.936402770250688080, 0.936385222723599590, 0.936367672855548010, 0.936350120646577300, 0.936332566096731210, -0.936315009206053820, 0.936297449974588860, 0.936279888402380190, 0.936262324489471660, 0.936244758235907470, 0.936227189641731460, 0.936209618706987490, 0.936192045431719410, -0.936174469815971300, 0.936156891859786900, 0.936139311563210400, 0.936121728926285200, 0.936104143949056060, 0.936086556631566590, 0.936068966973860660, 0.936051374975982340, -0.936033780637975600, 0.936016183959884400, 0.935998584941752370, 0.935980983583624250, 0.935963379885543680, 0.935945773847554620, 0.935928165469701150, 0.935910554752027220, -0.935892941694576930, 0.935875326297394340, 0.935857708560523080, 0.935840088484007900, 0.935822466067892430, 0.935804841312220860, 0.935787214217037140, 0.935769584782385370, -0.935751953008309710, 0.935734318894853810, 0.935716682442062410, 0.935699043649979360, 0.935681402518648620, 0.935663759048114390, 0.935646113238420840, 0.935628465089611950, -0.935610814601731900, 0.935593161774824540, 0.935575506608934520, 0.935557849104105780, 0.935540189260382400, 0.935522527077808590, 0.935504862556428400, 0.935487195696286130, -0.935469526497425760, 0.935451854959891360, 0.935434181083727560, 0.935416504868978430, 0.935398826315687940, 0.935381145423900380, 0.935363462193659960, 0.935345776625010950, -0.935328088717997110, 0.935310398472663400, 0.935292705889053670, 0.935275010967212220, 0.935257313707183240, 0.935239614109010910, 0.935221912172739640, 0.935204207898413520, -0.935186501286076610, 0.935168792335773660, 0.935151081047548850, 0.935133367421446260, 0.935115651457510300, 0.935097933155785150, 0.935080212516315230, 0.935062489539144840, -0.935044764224317810, 0.935027036571879240, 0.935009306581872980, 0.934991574254343540, 0.934973839589335110, 0.934956102586892210, 0.934938363247058920, 0.934920621569879430, -0.934902877555398800, 0.934885131203660900, 0.934867382514710130, 0.934849631488590900, 0.934831878125347630, 0.934814122425024710, 0.934796364387666450, 0.934778604013317030, -0.934760841302021310, 0.934743076253823470, 0.934725308868768030, 0.934707539146899300, 0.934689767088261680, 0.934671992692899690, 0.934654215960857400, 0.934636436892179790, -0.934618655486911250, 0.934600871745095980, 0.934583085666778500, 0.934565297252003320, 0.934547506500814970, 0.934529713413257750, 0.934511917989376050, 0.934494120229214740, -0.934476320132818230, 0.934458517700230920, 0.934440712931497220, 0.934422905826661880, 0.934405096385769180, 0.934387284608863780, 0.934369470495989840, 0.934351654047192560, -0.934333835262516010, 0.934316014142005050, 0.934298190685703970, 0.934280364893657400, 0.934262536765909980, 0.934244706302505890, 0.934226873503490320, 0.934209038368907560, -0.934191200898802250, 0.934173361093218910, 0.934155518952202170, 0.934137674475796650, 0.934119827664046890, 0.934101978516997280, 0.934084127034693010, 0.934066273217178500, -0.934048417064498260, 0.934030558576696920, 0.934012697753819230, 0.933994834595909820, 0.933976969103013310, 0.933959101275174120, 0.933941231112437430, 0.933923358614847650, -0.933905483782449530, 0.933887606615287690, 0.933869727113406770, 0.933851845276851610, 0.933833961105666410, 0.933816074599896680, 0.933798185759586840, 0.933780294584781510, -0.933762401075525330, 0.933744505231863250, 0.933726607053839920, 0.933708706541500070, 0.933690803694888110, 0.933672898514049440, 0.933654990999028490, 0.933637081149870100, -0.933619168966619010, 0.933601254449320070, 0.933583337598017930, 0.933565418412757090, 0.933547496893583070, 0.933529573040540290, 0.933511646853673600, 0.933493718333027860, -0.933475787478647680, 0.933457854290578150, 0.933439918768863900, 0.933421980913549550, 0.933404040724680640, 0.933386098202301560, 0.933368153346457290, 0.933350206157192550, -0.933332256634552330, 0.933314304778581460, 0.933296350589324810, 0.933278394066827110, 0.933260435211133550, 0.933242474022288990, 0.933224510500338280, 0.933206544645326260, -0.933188576457297910, 0.933170605936298080, 0.933152633082371400, 0.933134657895563490, 0.933116680375918990, 0.933098700523482650, 0.933080718338299640, 0.933062733820414820, -0.933044746969873160, 0.933026757786719730, 0.933008766270998930, 0.932990772422756630, 0.932972776242037450, 0.932954777728886240, 0.932936776883348080, 0.932918773705468050, -0.932900768195291000, 0.932882760352861770, 0.932864750178225900, 0.932846737671428230, 0.932828722832513720, 0.932810705661527350, 0.932792686158514180, 0.932774664323519410, -0.932756640156587880, 0.932738613657764450, 0.932720584827094860, 0.932702553664623730, 0.932684520170396270, 0.932666484344457540, 0.932648446186852500, 0.932630405697626450, -0.932612362876824360, 0.932594317724490970, 0.932576270240672130, 0.932558220425412700, 0.932540168278757630, 0.932522113800752230, 0.932504056991441450, 0.932485997850870610, -0.932467936379084430, 0.932449872576128660, 0.932431806442048260, 0.932413737976888310, 0.932395667180694110, 0.932377594053510620, 0.932359518595383240, 0.932341440806357060, -0.932323360686476920, 0.932305278235788680, 0.932287193454337300, 0.932269106342167860, 0.932251016899325770, 0.932232925125856090, 0.932214831021804020, 0.932196734587214970, -0.932178635822133780, 0.932160534726606200, 0.932142431300677420, 0.932124325544392510, 0.932106217457796760, 0.932088107040935480, 0.932069994293853840, 0.932051879216597050, -0.932033761809210830, 0.932015642071740150, 0.931997520004230420, 0.931979395606726930, 0.931961268879274880, 0.931943139821919670, 0.931925008434706600, 0.931906874717680740, -0.931888738670887950, 0.931870600294373410, 0.931852459588182300, 0.931834316552360040, 0.931816171186952040, 0.931798023492003580, 0.931779873467559640, 0.931761721113666510, -0.931743566430368930, 0.931725409417712540, 0.931707250075742620, 0.931689088404504480, 0.931670924404043750, 0.931652758074405620, 0.931634589415635260, 0.931616418427778760, -0.931598245110881300, 0.931580069464988170, 0.931561891490144900, 0.931543711186396780, 0.931525528553789560, 0.931507343592368420, 0.931489156302178540, 0.931470966683266230, -0.931452774735676340, 0.931434580459454710, 0.931416383854646420, 0.931398184921297330, 0.931379983659452740, 0.931361780069157820, 0.931343574150458870, 0.931325365903400870, -0.931307155328029550, 0.931288942424390310, 0.931270727192528680, 0.931252509632490290, 0.931234289744320540, 0.931216067528064850, 0.931197842983769180, 0.931179616111479040, -0.931161386911239840, 0.931143155383097110, 0.931124921527096470, 0.931106685343283560, 0.931088446831704000, 0.931070205992402980, 0.931051962825426680, 0.931033717330820520, -0.931015469508630120, 0.930997219358901010, 0.930978966881678920, 0.930960712077009260, 0.930942454944937660, 0.930924195485510090, 0.930905933698772170, 0.930887669584769320, -0.930869403143547380, 0.930851134375151880, 0.930832863279628550, 0.930814589857023030, 0.930796314107380730, 0.930778036030748050, 0.930759755627170170, 0.930741472896692960, -0.930723187839362030, 0.930704900455223140, 0.930686610744322020, 0.930668318706704080, 0.930650024342415620, 0.930631727651502150, 0.930613428634009310, 0.930595127289982840, -0.930576823619468700, 0.930558517622512400, 0.930540209299159820, 0.930521898649456450, 0.930503585673448600, 0.930485270371181780, 0.930466952742701860, 0.930448632788054450, -0.930430310507285530, 0.930411985900440830, 0.930393658967566100, 0.930375329708706960, 0.930356998123909820, 0.930338664213220200, 0.930320327976683850, 0.930301989414346720, -0.930283648526254670, 0.930265305312453440, 0.930246959772988660, 0.930228611907906730, 0.930210261717253300, 0.930191909201074310, 0.930173554359415400, 0.930155197192322760, -0.930136837699842010, 0.930118475882019120, 0.930100111738899840, 0.930081745270530560, 0.930063376476956920, 0.930045005358224870, 0.930026631914380290, 0.930008256145469110, -0.929989878051537320, 0.929971497632630760, 0.929953114888795170, 0.929934729820077190, 0.929916342426522320, 0.929897952708176660, 0.929879560665086040, 0.929861166297296540, -0.929842769604854120, 0.929824370587804430, 0.929805969246194190, 0.929787565580069030, 0.929769159589474930, 0.929750751274457940, 0.929732340635064050, 0.929713927671339310, -0.929695512383329810, 0.929677094771081070, 0.929658674834640040, 0.929640252574052250, 0.929621827989363880, 0.929603401080621010, 0.929584971847869480, 0.929566540291155600, -0.929548106410525100, 0.929529670206024620, 0.929511231677699890, 0.929492790825597210, 0.929474347649762440, 0.929455902150241870, 0.929437454327081470, 0.929419004180327520, -0.929400551710025670, 0.929382096916222870, 0.929363639798964750, 0.929345180358297500, 0.929326718594267300, 0.929308254506920340, 0.929289788096302800, 0.929271319362460660, -0.929252848305439970, 0.929234374925287490, 0.929215899222049170, 0.929197421195770980, 0.929178940846499210, 0.929160458174280170, 0.929141973179159920, 0.929123485861184430, -0.929104996220400550, 0.929086504256854240, 0.929068009970591580, 0.929049513361658970, 0.929031014430102610, 0.929012513175968560, 0.928994009599303340, 0.928975503700152800, -0.928956995478563700, 0.928938484934582200, 0.928919972068254500, 0.928901456879626890, 0.928882939368745550, 0.928864419535656900, 0.928845897380407240, 0.928827372903042510, -0.928808846103609590, 0.928790316982154640, 0.928771785538723860, 0.928753251773363650, 0.928734715686120320, 0.928716177277040140, 0.928697636546169210, 0.928679093493554490, -0.928660548119242040, 0.928642000423278270, 0.928623450405709480, 0.928604898066582090, 0.928586343405942480, 0.928567786423836970, 0.928549227120311630, 0.928530665495413520, -0.928512101549188840, 0.928493535281683880, 0.928474966692945050, 0.928456395783018860, 0.928437822551951620, 0.928419246999789500, 0.928400669126579590, 0.928382088932368070, -0.928363506417201330, 0.928344921581125800, 0.928326334424187880, 0.928307744946434200, 0.928289153147911160, 0.928270559028664950, 0.928251962588742650, 0.928233363828190440, -0.928214762747054720, 0.928196159345382240, 0.928177553623219300, 0.928158945580612400, 0.928140335217608300, 0.928121722534252850, 0.928103107530593550, 0.928084490206676490, -0.928065870562548190, 0.928047248598255160, 0.928028624313844030, 0.928009997709361320, 0.927991368784853330, 0.927972737540367240, 0.927954103975949240, 0.927935468091646070, -0.927916829887504240, 0.927898189363570270, 0.927879546519890800, 0.927860901356512560, 0.927842253873481740, 0.927823604070845520, 0.927804951948650310, 0.927786297506942750, -0.927767640745769450, 0.927748981665177050, 0.927730320265212180, 0.927711656545921250, 0.927692990507351430, 0.927674322149549150, 0.927655651472561020, 0.927636978476433890, -0.927618303161214190, 0.927599625526948750, 0.927580945573684310, 0.927562263301467180, 0.927543578710344650, 0.927524891800363240, 0.927506202571569570, 0.927487511024010390, -0.927468817157732440, 0.927450120972782450, 0.927431422469207070, 0.927412721647052910, 0.927394018506367270, 0.927375313047196560, 0.927356605269587630, 0.927337895173587110, -0.927319182759241860, 0.927300468026598600, 0.927281750975703980, 0.927263031606605170, 0.927244309919348920, 0.927225585913981850, 0.927206859590550710, 0.927188130949102570, -0.927169399989684060, 0.927150666712342030, 0.927131931117123000, 0.927113193204074370, 0.927094452973242890, 0.927075710424675290, 0.927056965558418320, 0.927038218374519050, -0.927019468873024110, 0.927000717053980570, 0.926981962917434950, 0.926963206463434660, 0.926944447692026440, 0.926925686603257030, 0.926906923197173490, 0.926888157473822580, -0.926869389433251260, 0.926850619075506140, 0.926831846400634870, 0.926813071408683960, 0.926794294099700270, 0.926775514473730970, 0.926756732530822800, 0.926737948271022850, -0.926719161694378070, 0.926700372800934980, 0.926681581590741320, 0.926662788063843720, 0.926643992220289150, 0.926625194060124560, 0.926606393583397030, 0.926587590790153400, -0.926568785680440540, 0.926549978254306070, 0.926531168511796730, 0.926512356452959370, 0.926493542077841070, 0.926474725386489010, 0.926455906378950140, 0.926437085055271450, -0.926418261415499770, 0.926399435459682730, 0.926380607187867080, 0.926361776600100000, 0.926342943696428330, 0.926324108476899390, 0.926305270941560230, 0.926286431090457830, -0.926267588923639030, 0.926248744441151570, 0.926229897643042310, 0.926211048529358320, 0.926192197100146660, 0.926173343355454430, 0.926154487295328900, 0.926135628919816930, -0.926116768228966050, 0.926097905222823310, 0.926079039901435920, 0.926060172264850820, 0.926041302313115320, 0.926022430046276490, 0.926003555464381730, 0.925984678567477680, -0.925965799355612180, 0.925946917828832320, 0.925928033987185040, 0.925909147830717760, 0.925890259359477550, 0.925871368573511820, 0.925852475472867530, 0.925833580057591750, -0.925814682327732340, 0.925795782283336250, 0.925776879924450790, 0.925757975251123020, 0.925739068263400360, 0.925720158961329980, 0.925701247344958960, 0.925682333414335030, -0.925663417169505400, 0.925644498610517120, 0.925625577737417600, 0.925606654550254260, 0.925587729049074160, 0.925568801233924820, 0.925549871104853090, 0.925530938661907050, -0.925512003905133550, 0.925493066834580210, 0.925474127450294120, 0.925455185752322660, 0.925436241740713370, 0.925417295415512990, 0.925398346776769800, 0.925379395824530770, -0.925360442558843200, 0.925341486979754490, 0.925322529087312050, 0.925303568881563400, 0.925284606362555720, 0.925265641530336300, 0.925246674384953010, 0.925227704926453120, -0.925208733154883830, 0.925189759070292880, 0.925170782672727450, 0.925151803962235060, 0.925132822938863120, 0.925113839602658920, 0.925094853953670300, 0.925075865991944580, -0.925056875717529260, 0.925037883130471750, 0.925018888230819460, 0.924999891018620010, 0.924980891493920490, 0.924961889656769070, 0.924942885507212930, 0.924923879045299600, -0.924904870271076600, 0.924885859184591320, 0.924866845785891400, 0.924847830075024470, 0.924828812052037600, 0.924809791716978970, 0.924790769069895880, 0.924771744110835850, -0.924752716839846500, 0.924733687256975360, 0.924714655362270040, 0.924695621155777970, 0.924676584637546650, 0.924657545807624160, 0.924638504666057680, 0.924619461212895070, -0.924600415448183830, 0.924581367371971500, 0.924562316984305690, 0.924543264285233810, 0.924524209274804170, 0.924505151953063930, 0.924486092320060850, 0.924467030375842440, -0.924447966120456540, 0.924428899553950690, 0.924409830676372610, 0.924390759487769720, 0.924371685988190080, 0.924352610177681330, 0.924333532056291100, 0.924314451624067000, -0.924295368881056680, 0.924276283827308090, 0.924257196462868300, 0.924238106787785950, 0.924219014802108330, 0.924199920505883180, 0.924180823899158230, 0.924161724981981240, -0.924142623754399820, 0.924123520216461940, 0.924104414368214890, 0.924085306209707190, 0.924066195740986140, 0.924047082962099700, 0.924027967873095490, 0.924008850474021370, -0.923989730764925080, 0.923970608745854570, 0.923951484416857150, 0.923932357777981330, 0.923913228829274620, 0.923894097570784890, 0.923874964002559860, 0.923855828124647390, -0.923836689937095450, 0.923817549439951420, 0.923798406633263850, 0.923779261517080230, 0.923760114091448430, 0.923740964356416390, 0.923721812312031990, 0.923702657958342940, -0.923683501295397340, 0.923664342323242680, 0.923645181041927390, 0.923626017451499190, 0.923606851552005950, 0.923587683343495610, 0.923568512826016040, 0.923549339999615190, -0.923530164864341030, 0.923510987420241070, 0.923491807667364050, 0.923472625605757380, 0.923453441235469240, 0.923434254556547480, 0.923415065569040070, 0.923395874272995080, -0.923376680668460010, 0.923357484755483520, 0.923338286534113320, 0.923319086004397490, 0.923299883166383890, 0.923280678020120590, 0.923261470565655660, 0.923242260803036950, -0.923223048732312310, 0.923203834353530370, 0.923184617666738870, 0.923165398671985770, 0.923146177369319140, 0.923126953758787170, 0.923107727840437820, 0.923088499614318710, -0.923069269080478820, 0.923050036238965640, 0.923030801089827490, 0.923011563633112210, 0.922992323868868090, 0.922973081797143100, 0.922953837417985530, 0.922934590731442910, -0.922915341737564180, 0.922896090436397200, 0.922876836827989820, 0.922857580912390450, 0.922838322689647160, 0.922819062159808020, 0.922799799322921220, 0.922780534179034610, -0.922761266728196920, 0.922741996970456110, 0.922722724905860380, 0.922703450534457680, 0.922684173856296530, 0.922664894871424890, 0.922645613579890610, 0.922626329981742650, -0.922607044077028870, 0.922587755865797550, 0.922568465348096780, 0.922549172523974840, 0.922529877393480020, 0.922510579956660530, 0.922491280213564190, 0.922471978164239980, -0.922452673808735860, 0.922433367147100000, 0.922414058179380820, 0.922394746905626390, 0.922375433325885120, 0.922356117440204960, 0.922336799248634880, 0.922317478751222720, -0.922298155948016900, 0.922278830839065700, 0.922259503424417430, 0.922240173704120370, 0.922220841678222940, 0.922201507346772980, 0.922182170709819670, 0.922162831767410870, -0.922143490519594990, 0.922124146966420420, 0.922104801107935470, 0.922085452944188530, 0.922066102475227910, 0.922046749701101790, 0.922027394621859120, 0.922008037237547870, -0.921988677548216560, 0.921969315553913590, 0.921949951254687370, 0.921930584650586190, 0.921911215741658240, 0.921891844527952590, 0.921872471009517300, 0.921853095186400910, -0.921833717058651690, 0.921814336626318290, 0.921794953889448990, 0.921775568848092200, 0.921756181502296320, 0.921736791852110220, 0.921717399897582170, 0.921698005638760700, -0.921678609075694100, 0.921659210208431000, 0.921639809037019920, 0.921620405561509260, 0.921600999781947320, 0.921581591698383160, 0.921562181310865090, 0.921542768619441510, -0.921523353624160930, 0.921503936325072100, 0.921484516722223420, 0.921465094815663080, 0.921445670605440250, 0.921426244091603340, 0.921406815274200870, 0.921387384153281250, -0.921367950728893210, 0.921348515001085390, 0.921329076969906180, 0.921309636635403880, 0.921290193997627900, 0.921270749056626540, 0.921251301812448190, 0.921231852265141590, -0.921212400414755380, 0.921192946261338190, 0.921173489804938180, 0.921154031045604890, 0.921134569983386500, 0.921115106618331740, 0.921095640950489130, 0.921076172979907510, -0.921056702706635420, 0.921037230130721470, 0.921017755252214300, 0.920998278071162970, 0.920978798587615890, 0.920959316801621910, 0.920939832713229540, 0.920920346322487650, -0.920900857629444960, 0.920881366634150100, 0.920861873336651370, 0.920842377736998400, 0.920822879835239470, 0.920803379631423340, 0.920783877125598730, 0.920764372317814490, -0.920744865208119270, 0.920725355796561560, 0.920705844083190780, 0.920686330068055340, 0.920666813751204180, 0.920647295132685950, 0.920627774212549490, 0.920608250990843540, -0.920588725467617050, 0.920569197642918340, 0.920549667516797010, 0.920530135089301590, 0.920510600360480710, 0.920491063330383330, 0.920471523999058410, 0.920451982366554570, -0.920432438432920770, 0.920412892198205550, 0.920393343662458510, 0.920373792825728070, 0.920354239688063070, 0.920334684249512590, 0.920315126510125370, 0.920295566469950250, -0.920276004129035980, 0.920256439487431970, 0.920236872545186930, 0.920217303302349630, 0.920197731758969130, 0.920178157915094270, 0.920158581770774030, 0.920139003326057360, -0.920119422580992770, 0.920099839535630020, 0.920080254190017710, 0.920060666544204710, 0.920041076598240080, 0.920021484352172680, 0.920001889806051580, 0.919982292959925510, -0.919962693813843990, 0.919943092367855760, 0.919923488622009790, 0.919903882576355030, 0.919884274230940660, 0.919864663585815530, 0.919845050641028840, 0.919825435396629090, -0.919805817852666130, 0.919786198009188590, 0.919766575866245550, 0.919746951423886180, 0.919727324682159340, 0.919707695641114210, 0.919688064300799860, 0.919668430661264910, -0.919648794722559340, 0.919629156484731760, 0.919609515947831250, 0.919589873111906990, 0.919570227977008050, 0.919550580543183500, 0.919530930810482210, 0.919511278778953890, -0.919491624448647400, 0.919471967819611820, 0.919452308891896330, 0.919432647665550110, 0.919412984140622220, 0.919393318317161980, 0.919373650195218000, 0.919353979774840240, -0.919334307056077550, 0.919314632038979010, 0.919294954723594020, 0.919275275109971530, 0.919255593198160970, 0.919235908988211390, 0.919216222480171650, 0.919196533674091710, -0.919176842570020410, 0.919157149168007060, 0.919137453468100830, 0.919117755470350910, 0.919098055174806690, 0.919078352581516930, 0.919058647690531690, 0.919038940501899710, -0.919019231015670510, 0.918999519231893160, 0.918979805150617060, 0.918960088771891390, 0.918940370095765570, 0.918920649122288440, 0.918900925851510060, 0.918881200283479300, -0.918861472418245560, 0.918841742255858240, 0.918822009796366410, 0.918802275039819700, 0.918782537986266860, 0.918762798635758050, 0.918743056988342240, 0.918723313044068730, -0.918703566802987040, 0.918683818265146450, 0.918664067430596250, 0.918644314299385870, 0.918624558871564360, 0.918604801147181790, 0.918585041126287250, 0.918565278808930130, -0.918545514195159730, 0.918525747285025670, 0.918505978078577150, 0.918486206575863660, 0.918466432776934400, 0.918446656681839340, 0.918426878290627640, 0.918407097603348820, -0.918387314620052190, 0.918367529340787250, 0.918347741765603520, 0.918327951894550080, 0.918308159727677100, 0.918288365265033770, 0.918268568506669490, 0.918248769452633780, -0.918228968102976160, 0.918209164457746140, 0.918189358516993240, 0.918169550280766520, 0.918149739749116290, 0.918129926922091720, 0.918110111799742330, 0.918090294382117640, -0.918070474669267280, 0.918050652661240750, 0.918030828358087470, 0.918011001759856840, 0.917991172866599040, 0.917971341678363360, 0.917951508195199220, 0.917931672417156450, -0.917911834344284360, 0.917891993976632790, 0.917872151314250820, 0.917852306357188840, 0.917832459105496160, 0.917812609559222280, 0.917792757718416840, 0.917772903583129570, -0.917753047153410000, 0.917733188429307840, 0.917713327410872300, 0.917693464098153780, 0.917673598491201670, 0.917653730590065610, 0.917633860394795110, 0.917613987905440020, -0.917594113122049970, 0.917574236044674250, 0.917554356673363270, 0.917534475008166430, 0.917514591049133470, 0.917494704796314010, 0.917474816249757690, 0.917454925409514340, -0.917435032275633830, 0.917415136848165220, 0.917395239127159260, 0.917375339112665110, 0.917355436804732640, 0.917335532203411570, 0.917315625308751660, 0.917295716120802630, -0.917275804639614440, 0.917255890865236290, 0.917235974797718790, 0.917216056437111350, 0.917196135783463820, 0.917176212836825930, 0.917156287597247430, 0.917136360064778280, -0.917116430239467870, 0.917096498121366730, 0.917076563710524370, 0.917056627006990640, 0.917036688010815280, 0.917016746722048250, 0.916996803140739280, 0.916976857266938340, -0.916956909100694830, 0.916936958642059490, 0.916917005891081720, 0.916897050847811480, 0.916877093512298620, 0.916857133884593000, 0.916837171964744460, 0.916817207752802730, -0.916797241248818340, 0.916777272452840800, 0.916757301364920170, 0.916737327985106210, 0.916717352313448970, 0.916697374349998320, 0.916677394094804200, 0.916657411547916250, -0.916637426709385190, 0.916617439579260450, 0.916597450157592200, 0.916577458444430390, 0.916557464439824780, 0.916537468143825640, 0.916517469556482720, 0.916497468677845870, -0.916477465507965720, 0.916457460046891770, 0.916437452294674330, 0.916417442251363120, 0.916397429917008340, 0.916377415291660060, 0.916357398375367780, 0.916337379168182480, -0.916317357670153650, 0.916297333881331390, 0.916277307801765860, 0.916257279431507140, 0.916237248770605080, 0.916217215819109980, 0.916197180577071450, 0.916177143044540340, -0.916157103221566290, 0.916137061108199590, 0.916117016704490190, 0.916096970010488290, 0.916076921026243940, 0.916056869751807330, 0.916036816187228100, 0.916016760332557300, -0.915996702187844460, 0.915976641753139980, 0.915956579028493810, 0.915936514013956260, 0.915916446709577390, 0.915896377115407060, 0.915876305231496210, 0.915856231057894490, -0.915836154594652290, 0.915816075841819570, 0.915795994799446730, 0.915775911467583970, 0.915755825846281350, 0.915735737935588820, 0.915715647735557360, 0.915695555246236690, -0.915675460467677230, 0.915655363399929030, 0.915635264043042520, 0.915615162397067750, 0.915595058462054800, 0.915574952238054520, 0.915554843725116860, 0.915534732923292020, -0.915514619832630490, 0.915494504453182260, 0.915474386784997930, 0.915454266828127470, 0.915434144582621070, 0.915414020048529680, 0.915393893225903250, 0.915373764114792100, -0.915353632715246500, 0.915333499027316750, 0.915313363051053370, 0.915293224786506540, 0.915273084233726330, 0.915252941392763700, 0.915232796263668710, 0.915212648846491780, -0.915192499141283200, 0.915172347148093370, 0.915152192866972690, 0.915132036297971240, 0.915111877441139980, 0.915091716296528970, 0.915071552864188730, 0.915051387144169670, -0.915031219136522080, 0.915011048841296470, 0.914990876258543140, 0.914970701388312380, 0.914950524230655150, 0.914930344785621630, 0.914910163053262340, 0.914889979033627570, -0.914869792726767830, 0.914849604132733530, 0.914829413251575410, 0.914809220083343200, 0.914789024628088420, 0.914768826885861140, 0.914748626856711660, 0.914728424540690700, -0.914708219937848680, 0.914688013048235990, 0.914667803871903050, 0.914647592408900920, 0.914627378659279790, 0.914607162623090160, 0.914586944300382680, 0.914566723691207840, -0.914546500795616170, 0.914526275613658290, 0.914506048145384390, 0.914485818390845640, 0.914465586350092450, 0.914445352023175230, 0.914425115410144600, 0.914404876511051180, -0.914384635325945610, 0.914364391854878170, 0.914344146097899930, 0.914323898055061420, 0.914303647726413260, 0.914283395112005850, 0.914263140211890040, 0.914242883026116230, -0.914222623554735380, 0.914202361797797570, 0.914182097755354190, 0.914161831427455550, 0.914141562814152380, 0.914121291915495180, 0.914101018731534930, 0.914080743262322030, -0.914060465507907200, 0.914040185468340980, 0.914019903143674650, 0.913999618533958500, 0.913979331639243390, 0.913959042459579820, 0.913938750995018760, 0.913918457245610720, -0.913898161211406320, 0.913877862892456760, 0.913857562288812540, 0.913837259400524520, 0.913816954227643200, 0.913796646770219660, 0.913776337028304410, 0.913756025001948300, -0.913735710691201850, 0.913715394096116350, 0.913695075216742540, 0.913674754053130920, 0.913654430605332470, 0.913634104873397910, 0.913613776857378100, 0.913593446557323770, -0.913573113973285560, 0.913552779105314960, 0.913532441953462280, 0.913512102517778590, 0.913491760798314620, 0.913471416795121230, 0.913451070508249360, 0.913430721937749430, -0.913410371083673070, 0.913390017946070780, 0.913369662524993410, 0.913349304820491930, 0.913328944832617060, 0.913308582561420000, 0.913288218006951370, 0.913267851169261900, -0.913247482048403110, 0.913227110644425630, 0.913206736957380420, 0.913186360987318310, 0.913165982734290280, 0.913145602198347390, 0.913125219379540050, 0.913104834277920110, -0.913084446893537960, 0.913064057226444790, 0.913043665276691450, 0.913023271044328900, 0.913002874529408310, 0.912982475731980440, 0.912962074652096000, 0.912941671289806740, -0.912921265645163290, 0.912900857718216720, 0.912880447509017980, 0.912860035017618140, 0.912839620244068170, 0.912819203188419250, 0.912798783850721880, 0.912778362231027930, -0.912757938329388120, 0.912737512145853410, 0.912717083680474880, 0.912696652933303710, 0.912676219904390850, 0.912655784593787160, 0.912635347001544360, 0.912614907127713090, -0.912594464972344640, 0.912574020535489970, 0.912553573817200370, 0.912533124817526690, 0.912512673536520320, 0.912492219974231800, 0.912471764130713180, 0.912451306006015090, -0.912430845600188830, 0.912410382913285360, 0.912389917945355950, 0.912369450696451700, 0.912348981166623880, 0.912328509355923250, 0.912308035264401740, 0.912287558892110110, -0.912267080239099530, 0.912246599305421290, 0.912226116091126580, 0.912205630596266580, 0.912185142820892140, 0.912164652765055210, 0.912144160428806640, 0.912123665812197610, -0.912103168915279430, 0.912082669738103370, 0.912062168280720620, 0.912041664543182470, 0.912021158525539780, 0.912000650227844600, 0.911980139650147680, 0.911959626792500530, -0.911939111654954230, 0.911918594237560280, 0.911898074540369750, 0.911877552563433610, 0.911857028306804040, 0.911836501770531880, 0.911815972954668430, 0.911795441859265090, -0.911774908484373150, 0.911754372830043900, 0.911733834896328750, 0.911713294683278660, 0.911692752190945700, 0.911672207419380820, 0.911651660368635430, 0.911631111038760930, -0.911610559429808620, 0.911590005541829900, 0.911569449374876270, 0.911548890928998490, 0.911528330204248950, 0.911507767200678610, 0.911487201918338760, 0.911466634357280920, -0.911446064517556500, 0.911425492399217000, 0.911404918002313380, 0.911384341326897720, 0.911363762373021300, 0.911343181140735430, 0.911322597630091710, 0.911302011841141350, -0.911281423773936060, 0.911260833428527260, 0.911240240804965910, 0.911219645903304290, 0.911199048723593700, 0.911178449265885320, 0.911157847530230990, 0.911137243516681910, -0.911116637225289790, 0.911096028656106060, 0.911075417809181890, 0.911054804684569450, 0.911034189282320160, 0.911013571602485310, 0.910992951645116510, 0.910972329410265400, -0.910951704897983380, 0.910931078108321860, 0.910910449041332890, 0.910889817697067890, 0.910869184075578260, 0.910848548176915740, 0.910827910001131840, 0.910807269548278060, -0.910786626818406280, 0.910765981811567430, 0.910745334527814030, 0.910724684967197380, 0.910704033129768890, 0.910683379015580390, 0.910662722624683400, 0.910642063957129650, -0.910621403012970340, 0.910600739792257970, 0.910580074295043620, 0.910559406521379120, 0.910538736471316220, 0.910518064144906330, 0.910497389542201390, 0.910476712663252920, -0.910456033508112330, 0.910435352076832020, 0.910414668369463280, 0.910393982386057840, 0.910373294126667560, 0.910352603591343960, 0.910331910780138860, 0.910311215693104030, -0.910290518330290840, 0.910269818691751610, 0.910249116777537840, 0.910228412587701370, 0.910207706122293850, 0.910186997381366990, 0.910166286364972650, 0.910145573073162240, -0.910124857505988370, 0.910104139663502230, 0.910083419545755780, 0.910062697152800750, 0.910041972484688990, 0.910021245541472350, 0.910000516323202560, 0.909979784829931140, -0.909959051061710600, 0.909938315018592460, 0.909917576700628450, 0.909896836107870530, 0.909876093240370660, 0.909855348098180360, 0.909834600681351470, 0.909813850989936390, -0.909793099023986640, 0.909772344783554180, 0.909751588268690850, 0.909730829479448610, 0.909710068415879200, 0.909689305078034690, 0.909668539465966490, 0.909647771579727320, -0.909627001419368810, 0.909606228984942700, 0.909585454276501060, 0.909564677294095740, 0.909543898037778800, 0.909523116507602090, 0.909502332703617130, 0.909481546625876880, -0.909460758274432620, 0.909439967649336540, 0.909419174750640490, 0.909398379578396530, 0.909377582132656630, 0.909356782413472400, 0.909335980420896580, 0.909315176154980810, -0.909294369615777140, 0.909273560803337430, 0.909252749717713860, 0.909231936358958490, 0.909211120727123290, 0.909190302822259880, 0.909169482644420990, 0.909148660193658480, -0.909127835470024290, 0.909107008473570620, 0.909086179204349310, 0.909065347662412650, 0.909044513847812490, 0.909023677760600780, 0.909002839400830150, 0.908981998768552570, -0.908961155863819870, 0.908940310686684350, 0.908919463237197970, 0.908898613515413010, 0.908877761521381110, 0.908856907255155220, 0.908836050716786970, 0.908815191906328760, -0.908794330823832430, 0.908773467469350280, 0.908752601842934490, 0.908731733944637240, 0.908710863774510160, 0.908689991332606420, 0.908669116618977650, 0.908648239633676140, -0.908627360376753960, 0.908606478848263400, 0.908585595048256640, 0.908564708976785540, 0.908543820633903040, 0.908522930019661000, 0.908502037134111600, 0.908481141977307120, -0.908460244549299740, 0.908439344850141770, 0.908418442879885490, 0.908397538638582750, 0.908376632126286500, 0.908355723343048590, 0.908334812288921540, 0.908313898963957310, -0.908292983368208410, 0.908272065501727010, 0.908251145364565420, 0.908230222956775690, 0.908209298278410680, 0.908188371329522460, 0.908167442110163430, 0.908146510620385650, -0.908125576860241650, 0.908104640829783700, 0.908083702529063790, 0.908062761958134960, 0.908041819117049180, 0.908020874005858960, 0.907999926624616480, 0.907978976973374150, -0.907958025052184480, 0.907937070861099760, 0.907916114400171840, 0.907895155669454110, 0.907874194668998550, 0.907853231398857430, 0.907832265859083280, 0.907811298049728380, -0.907790327970845250, 0.907769355622486400, 0.907748381004703670, 0.907727404117550370, 0.907706424961078670, 0.907685443535340860, 0.907664459840389350, 0.907643473876276750, -0.907622485643055590, 0.907601495140777700, 0.907580502369496500, 0.907559507329263940, 0.907538510020132750, 0.907517510442155230, 0.907496508595383890, 0.907475504479871350, -0.907454498095670030, 0.907433489442832090, 0.907412478521410830, 0.907391465331458310, 0.907370449873027170, 0.907349432146169810, 0.907328412150938960, 0.907307389887387130, -0.907286365355566390, 0.907265338555530150, 0.907244309487330480, 0.907223278151020110, 0.907202244546651440, 0.907181208674277320, 0.907160170533950040, 0.907139130125722450, -0.907118087449646620, 0.907097042505775830, 0.907075995294162610, 0.907054945814859350, 0.907033894067918680, 0.907012840053393220, 0.906991783771335820, 0.906970725221798890, -0.906949664404834710, 0.906928601320496800, 0.906907535968837440, 0.906886468349909160, 0.906865398463764680, 0.906844326310456750, 0.906823251890038100, 0.906802175202560790, -0.906781096248078460, 0.906760015026643500, 0.906738931538308420, 0.906717845783125980, 0.906696757761149000, 0.906675667472430000, 0.906654574917021950, 0.906633480094977020, -0.906612383006348830, 0.906591283651189680, 0.906570182029552310, 0.906549078141489440, 0.906527971987053930, 0.906506863566298390, 0.906485752879275800, 0.906464639926038430, -0.906443524706639800, 0.906422407221132430, 0.906401287469568940, 0.906380165452002280, 0.906359041168485200, 0.906337914619070540, 0.906316785803810700, 0.906295654722759300, -0.906274521375968760, 0.906253385763491900, 0.906232247885381590, 0.906211107741690670, 0.906189965332471870, 0.906168820657778260, 0.906147673717662250, 0.906126524512177340, -0.906105373041376170, 0.906084219305311580, 0.906063063304036410, 0.906041905037603620, 0.906020744506066070, 0.905999581709476250, 0.905978416647887920, 0.905957249321353460, -0.905936079729925960, 0.905914907873658140, 0.905893733752603180, 0.905872557366813820, 0.905851378716343030, 0.905830197801243520, 0.905809014621568820, 0.905787829177371550, -0.905766641468704780, 0.905745451495621360, 0.905724259258174350, 0.905703064756416710, 0.905681867990401400, 0.905660668960181050, 0.905639467665809380, 0.905618264107339030, -0.905597058284822950, 0.905575850198314320, 0.905554639847866110, 0.905533427233531140, 0.905512212355362390, 0.905490995213413360, 0.905469775807736910, 0.905448554138386100, -0.905427330205413770, 0.905406104008873220, 0.905384875548817300, 0.905363644825299300, 0.905342411838371720, 0.905321176588088530, 0.905299939074502350, 0.905278699297666360, -0.905257457257633620, 0.905236212954457330, 0.905214966388190430, 0.905193717558886110, 0.905172466466597100, 0.905151213111377250, 0.905129957493279510, 0.905108699612356740, -0.905087439468662320, 0.905066177062249230, 0.905044912393170750, 0.905023645461479620, 0.905002376267229680, 0.904981104810473890, 0.904959831091265320, 0.904938555109657150, -0.904917276865702560, 0.904895996359454840, 0.904874713590967160, 0.904853428560292270, 0.904832141267484120, 0.904810851712595680, 0.904789559895680110, 0.904768265816790600, -0.904746969475980540, 0.904725670873302910, 0.904704370008810880, 0.904683066882558170, 0.904661761494597870, 0.904640453844983150, 0.904619143933767190, 0.904597831761003500, -0.904576517326745270, 0.904555200631045660, 0.904533881673957650, 0.904512560455535300, 0.904491236975831670, 0.904469911234899840, 0.904448583232793310, 0.904427252969565280, -0.904405920445269130, 0.904384585659958160, 0.904363248613685330, 0.904341909306504820, 0.904320567738469470, 0.904299223909632690, 0.904277877820047980, 0.904256529469768420, -0.904235178858847630, 0.904213825987338460, 0.904192470855295190, 0.904171113462770680, 0.904149753809818320, 0.904128391896491750, 0.904107027722844010, 0.904085661288928870, -0.904064292594799480, 0.904042921640509030, 0.904021548426111600, 0.904000172951660350, 0.903978795217208590, 0.903957415222809920, 0.903936032968517660, 0.903914648454385410, -0.903893261680466020, 0.903871872646814010, 0.903850481353482230, 0.903829087800524180, 0.903807691987993490, 0.903786293915943670, 0.903764893584427910, 0.903743490993500040, -0.903722086143213030, 0.903700679033621280, 0.903679269664777740, 0.903657858036736040, 0.903636444149549690, 0.903615028003272200, 0.903593609597957200, 0.903572188933658090, -0.903550766010428270, 0.903529340828321810, 0.903507913387392000, 0.903486483687692470, 0.903465051729276710, 0.903443617512198260, 0.903422181036510840, 0.903400742302267520, -0.903379301309522820, 0.903357858058329800, 0.903336412548742080, 0.903314964780813410, 0.903293514754597290, 0.903272062470147460, 0.903250607927517430, 0.903229151126760500, -0.903207692067931060, 0.903186230751082400, 0.903164767176268150, 0.903143301343541930, 0.903121833252957580, 0.903100362904568520, 0.903078890298428690, 0.903057415434591170, -0.903035938313110460, 0.903014458934039980, 0.902992977297433330, 0.902971493403344150, 0.902950007251826390, 0.902928518842933460, 0.902907028176718970, 0.902885535253237230, -0.902864040072541730, 0.902842542634686000, 0.902821042939723980, 0.902799540987709430, 0.902778036778695950, 0.902756530312737390, 0.902735021589887170, 0.902713510610199670, -0.902691997373728410, 0.902670481880527230, 0.902648964130649880, 0.902627444124149970, 0.902605921861081570, 0.902584397341497980, 0.902562870565453700, 0.902541341533002360, -0.902519810244197580, 0.902498276699093220, 0.902476740897743320, 0.902455202840201420, 0.902433662526521680, 0.902412119956757300, 0.902390575130962990, 0.902369028049192280, -0.902347478711498900, 0.902325927117936910, 0.902304373268560170, 0.902282817163422400, 0.902261258802577570, 0.902239698186079300, 0.902218135313982090, 0.902196570186339590, -0.902175002803205620, 0.902153433164634260, 0.902131861270679240, 0.902110287121394520, 0.902088710716833720, 0.902067132057051580, 0.902045551142101500, 0.902023967972037650, -0.902002382546913890, 0.901980794866784060, 0.901959204931702340, 0.901937612741722570, 0.901916018296898380, 0.901894421597284610, 0.901872822642934670, 0.901851221433902730, -0.901829617970242750, 0.901808012252008680, 0.901786404279254720, 0.901764794052034580, 0.901743181570402120, 0.901721566834412070, 0.901699949844118160, 0.901678330599574360, -0.901656709100834730, 0.901635085347953340, 0.901613459340984250, 0.901591831079981090, 0.901570200564998700, 0.901548567796090830, 0.901526932773311640, 0.901505295496714990, -0.901483655966355160, 0.901462014182286220, 0.901440370144562130, 0.901418723853236850, 0.901397075308365100, 0.901375424510000630, 0.901353771458197730, 0.901332116153010230, -0.901310458594492550, 0.901288798782698740, 0.901267136717682440, 0.901245472399498810, 0.901223805828201390, 0.901202137003844550, 0.901180465926482270, 0.901158792596168820, -0.901137117012958510, 0.901115439176905290, 0.901093759088063220, 0.901072076746487040, 0.901050392152230710, 0.901028705305348290, 0.901007016205894180, 0.900985324853922580, -0.900963631249487640, 0.900941935392643670, 0.900920237283444390, 0.900898536921944880, 0.900876834308199090, 0.900855129442261200, 0.900833422324185510, 0.900811712954026290, -0.900790001331837730, 0.900768287457673790, 0.900746571331589530, 0.900724852953638800, 0.900703132323876000, 0.900681409442355310, 0.900659684309131130, 0.900637956924257740, -0.900616227287789450, 0.900594495399780200, 0.900572761260285180, 0.900551024869358120, 0.900529286227053640, 0.900507545333425810, 0.900485802188529250, 0.900464056792418140, -0.900442309145146780, 0.900420559246769340, 0.900398807097340990, 0.900377052696915480, 0.900355296045547430, 0.900333537143291010, 0.900311775990200850, 0.900290012586331230, -0.900268246931736240, 0.900246479026470920, 0.900224708870589470, 0.900202936464146290, 0.900181161807195650, 0.900159384899792190, 0.900137605741990310, 0.900115824333844290, -0.900094040675408440, 0.900072254766737800, 0.900050466607886570, 0.900028676198909140, 0.900006883539860030, 0.899985088630793740, 0.899963291471764680, 0.899941492062827030, -0.899919690404036080, 0.899897886495445780, 0.899876080337110860, 0.899854271929085740, 0.899832461271424910, 0.899810648364183010, 0.899788833207414320, 0.899767015801173350, -0.899745196145515070, 0.899723374240493870, 0.899701550086164260, 0.899679723682580760, 0.899657895029797980, 0.899636064127870340, 0.899614230976852670, 0.899592395576798930, -0.899570557927764750, 0.899548718029804070, 0.899526875882971530, 0.899505031487321860, 0.899483184842909680, 0.899461335949789500, 0.899439484808015500, 0.899417631417643300, -0.899395775778726980, 0.899373917891321150, 0.899352057755480660, 0.899330195371259910, 0.899308330738713750, 0.899286463857896680, 0.899264594728863110, 0.899242723351668440, -0.899220849726366960, 0.899198973853013390, 0.899177095731662380, 0.899155215362368640, 0.899133332745186810, 0.899111447880171610, 0.899089560767377560, 0.899067671406859840, -0.899045779798673060, 0.899023885942871750, 0.899001989839510740, 0.898980091488644770, 0.898958190890328580, 0.898936288044616450, 0.898914382951564120, 0.898892475611225760, -0.898870566023656110, 0.898848654188910250, 0.898826740107042670, 0.898804823778108220, 0.898782905202161640, 0.898760984379257550, 0.898739061309451250, 0.898717135992797460, -0.898695208429350690, 0.898673278619165910, 0.898651346562298060, 0.898629412258801660, 0.898607475708731450, 0.898585536912142930, 0.898563595869090630, 0.898541652579629260, -0.898519707043813790, 0.898497759261699060, 0.898475809233339920, 0.898453856958791210, 0.898431902438107550, 0.898409945671344470, 0.898387986658556460, 0.898366025399798600, -0.898344061895125610, 0.898322096144592570, 0.898300128148254220, 0.898278157906165500, 0.898256185418381040, 0.898234210684956460, 0.898212233705946490, 0.898190254481405770, -0.898168273011389570, 0.898146289295952530, 0.898124303335149920, 0.898102315129036040, 0.898080324677666850, 0.898058331981096750, 0.898036337039380910, 0.898014339852574170, -0.897992340420731620, 0.897970338743908190, 0.897948334822158970, 0.897926328655538450, 0.897904320244102610, 0.897882309587905820, 0.897860296687003400, 0.897838281541450180, -0.897816264151301220, 0.897794244516611610, 0.897772222637436060, 0.897750198513830310, 0.897728172145848990, 0.897706143533547270, 0.897684112676980340, 0.897662079576202920, -0.897640044231270420, 0.897618006642237790, 0.897595966809159760, 0.897573924732092190, 0.897551880411089800, 0.897529833846207770, 0.897507785037501060, 0.897485733985024960, -0.897463680688834530, 0.897441625148984850, 0.897419567365530750, 0.897397507338528080, 0.897375445068031690, 0.897353380554096640, 0.897331313796778220, 0.897309244796131390, -0.897287173552211550, 0.897265100065073320, 0.897243024334772770, 0.897220946361364740, 0.897198866144904180, 0.897176783685446620, 0.897154698983047010, 0.897132612037760620, -0.897110522849642770, 0.897088431418748170, 0.897066337745132890, 0.897044241828851780, 0.897022143669960140, 0.897000043268513010, 0.896977940624565930, 0.896955835738173830, -0.896933728609392240, 0.896911619238275890, 0.896889507624880960, 0.896867393769262170, 0.896845277671474930, 0.896823159331574530, 0.896801038749616140, 0.896778915925655280, -0.896756790859746690, 0.896734663551946420, 0.896712534002309550, 0.896690402210891470, 0.896668268177747250, 0.896646131902932410, 0.896623993386502230, 0.896601852628512000, -0.896579709629016790, 0.896557564388072770, 0.896535416905734790, 0.896513267182058260, 0.896491115217098570, 0.896468961010911000, 0.896446804563551190, 0.896424645875073870, -0.896402484945535320, 0.896380321774990610, 0.896358156363495140, 0.896335988711104200, 0.896313818817873310, 0.896291646683857860, 0.896269472309113360, 0.896247295693694660, -0.896225116837658260, 0.896202935741059030, 0.896180752403952340, 0.896158566826393940, 0.896136379008439010, 0.896114188950143160, 0.896091996651561810, 0.896069802112750110, -0.896047605333764370, 0.896025406314659540, 0.896003205055491140, 0.895981001556314770, 0.895958795817185960, 0.895936587838160100, 0.895914377619292380, 0.895892165160639190, -0.895869950462255480, 0.895847733524196890, 0.895825514346519030, 0.895803292929277410, 0.895781069272527430, 0.895758843376324940, 0.895736615240724790, 0.895714384865783590, -0.895692152251556410, 0.895669917398098870, 0.895647680305466600, 0.895625440973714990, 0.895603199402899900, 0.895580955593076710, 0.895558709544300720, 0.895536461256628450, -0.895514210730114950, 0.895491957964815950, 0.895469702960787100, 0.895447445718083990, 0.895425186236762260, 0.895402924516877090, 0.895380660558485090, 0.895358394361641330, -0.895336125926401660, 0.895313855252821700, 0.895291582340957070, 0.895269307190863510, 0.895247029802596740, 0.895224750176211840, 0.895202468311765640, 0.895180184209313110, -0.895157897868910200, 0.895135609290612530, 0.895113318474475840, 0.895091025420555850, 0.895068730128907860, 0.895046432599588600, 0.895024132832653140, 0.895001830828157320, -0.894979526586156980, 0.894957220106707750, 0.894934911389865580, 0.894912600435685990, 0.894890287244224590, 0.894867971815537900, 0.894845654149681200, 0.894823334246710460, -0.894801012106681390, 0.894778687729649750, 0.894756361115671360, 0.894734032264802080, 0.894711701177097310, 0.894689367852613660, 0.894667032291406650, 0.894644694493532010, -0.894622354459045700, 0.894600012188003450, 0.894577667680461210, 0.894555320936474390, 0.894532971956099710, 0.894510620739392470, 0.894488267286408840, 0.894465911597204450, -0.894443553671835260, 0.894421193510357200, 0.894398831112826250, 0.894376466479297690, 0.894354099609828480, 0.894331730504473900, 0.894309359163290130, 0.894286985586332910, -0.894264609773658180, 0.894242231725321910, 0.894219851441380160, 0.894197468921888340, 0.894175084166903170, 0.894152697176480380, 0.894130307950675830, 0.894107916489545460, -0.894085522793145350, 0.894063126861531440, 0.894040728694759370, 0.894018328292885740, 0.893995925655966420, 0.893973520784057230, 0.893951113677214140, 0.893928704335493430, -0.893906292758950840, 0.893883878947642540, 0.893861462901624270, 0.893839044620952650, 0.893816624105683410, 0.893794201355872620, 0.893771776371576230, 0.893749349152850540, -0.893726919699751380, 0.893704488012334600, 0.893682054090656930, 0.893659617934774220, 0.893637179544742420, 0.893614738920617710, 0.893592296062456050, 0.893569850970313720, -0.893547403644246670, 0.893524954084310870, 0.893502502290562940, 0.893480048263058820, 0.893457592001854590, 0.893435133507006430, 0.893412672778570390, 0.893390209816602670, -0.893367744621159420, 0.893345277192296390, 0.893322807530070540, 0.893300335634537700, 0.893277861505754060, 0.893255385143775670, 0.893232906548658940, 0.893210425720459830, -0.893187942659234400, 0.893165457365039380, 0.893142969837930730, 0.893120480077964740, 0.893097988085197470, 0.893075493859685320, 0.893052997401484360, 0.893030498710650880, -0.893007997787240830, 0.892985494631311160, 0.892962989242917730, 0.892940481622116920, 0.892917971768964810, 0.892895459683517800, 0.892872945365832060, 0.892850428815964100, -0.892827910033969550, 0.892805389019905690, 0.892782865773828370, 0.892760340295793870, 0.892737812585858490, 0.892715282644078620, 0.892692750470510550, 0.892670216065210130, -0.892647679428234640, 0.892625140559639930, 0.892602599459482390, 0.892580056127818320, 0.892557510564704120, 0.892534962770196060, 0.892512412744350670, 0.892489860487223900, -0.892467305998872810, 0.892444749279353470, 0.892422190328722280, 0.892399629147035630, 0.892377065734349940, 0.892354500090721480, 0.892331932216206440, 0.892309362110861870, -0.892286789774744070, 0.892264215207909110, 0.892241638410413710, 0.892219059382314270, 0.892196478123667090, 0.892173894634528790, 0.892151308914955310, 0.892128720965003950, -0.892106130784730780, 0.892083538374192300, 0.892060943733444910, 0.892038346862545240, 0.892015747761549680, 0.891993146430514750, 0.891970542869496620, 0.891947937078552470, -0.891925329057738470, 0.891902718807111140, 0.891880106326726980, 0.891857491616642630, 0.891834874676914580, 0.891812255507598910, 0.891789634108752890, 0.891767010480432940, -0.891744384622695340, 0.891721756535596930, 0.891699126219194000, 0.891676493673543290, 0.891653858898701300, 0.891631221894724320, 0.891608582661669760, 0.891585941199593670, -0.891563297508552680, 0.891540651588603520, 0.891518003439802700, 0.891495353062206840, 0.891472700455872240, 0.891450045620856280, 0.891427388557215260, 0.891404729265005690, -0.891382067744284300, 0.891359403995107710, 0.891336738017532770, 0.891314069811615870, 0.891291399377413310, 0.891268726714982810, 0.891246051824380440, 0.891223374705662930, -0.891200695358887020, 0.891178013784109320, 0.891155329981386580, 0.891132643950775520, 0.891109955692332530, 0.891087265206114920, 0.891064572492179190, 0.891041877550582060, -0.891019180381380280, 0.890996480984630470, 0.890973779360389570, 0.890951075508713660, 0.890928369429660580, 0.890905661123286510, 0.890882950589648390, 0.890860237828802860, -0.890837522840806640, 0.890814805625716690, 0.890792086183589740, 0.890769364514482080, 0.890746640618451550, 0.890723914495554330, 0.890701186145847260, 0.890678455569387300, -0.890655722766231280, 0.890632987736435840, 0.890610250480057930, 0.890587510997154050, 0.890564769287781830, 0.890542025351997560, 0.890519279189858290, 0.890496530801420880, -0.890473780186742060, 0.890451027345878890, 0.890428272278887660, 0.890405514985826210, 0.890382755466750940, 0.890359993721718810, 0.890337229750786660, 0.890314463554011450, -0.890291695131450010, 0.890268924483159420, 0.890246151609196070, 0.890223376509617800, 0.890200599184481020, 0.890177819633842790, 0.890155037857760070, 0.890132253856289690, -0.890109467629488620, 0.890086679177413580, 0.890063888500122190, 0.890041095597671080, 0.890018300470117210, 0.889995503117517630, 0.889972703539929300, 0.889949901737409180, -0.889927097710014330, 0.889904291457801370, 0.889881482980828030, 0.889858672279150940, 0.889835859352827270, 0.889813044201913870, 0.889790226826467910, 0.889767407226546350, -0.889744585402206250, 0.889721761353504340, 0.889698935080498470, 0.889676106583245140, 0.889653275861801650, 0.889630442916224950, 0.889607607746572100, 0.889584770352900290, -0.889561930735266020, 0.889539088893727460, 0.889516244828341130, 0.889493398539164200, 0.889470550026253750, 0.889447699289666940, 0.889424846329460950, 0.889401991145692740, -0.889379133738419260, 0.889356274107698240, 0.889333412253586640, 0.889310548176141410, 0.889287681875419840, 0.889264813351479110, 0.889241942604376280, 0.889219069634168640, -0.889196194440912910, 0.889173317024667060, 0.889150437385487940, 0.889127555523432810, 0.889104671438558650, 0.889081785130922950, 0.889058896600582680, 0.889036005847594790, -0.889013112872017340, 0.888990217673907070, 0.888967320253321260, 0.888944420610317200, 0.888921518744951960, 0.888898614657283040, 0.888875708347367510, 0.888852799815262440, -0.888829889061025670, 0.888806976084714150, 0.888784060886385170, 0.888761143466096140, 0.888738223823904220, 0.888715301959866700, 0.888692377874040540, 0.888669451566483910, -0.888646523037253560, 0.888623592286406970, 0.888600659314001340, 0.888577724120094060, 0.888554786704742530, 0.888531847068004030, 0.888508905209935420, 0.888485961130594970, -0.888463014830039750, 0.888440066308326840, 0.888417115565513840, 0.888394162601658040, 0.888371207416816850, 0.888348250011047560, 0.888325290384407330, 0.888302328536954230, -0.888279364468745340, 0.888256398179838040, 0.888233429670289730, 0.888210458940157930, 0.888187485989499810, 0.888164510818372670, 0.888141533426834660, 0.888118553814942870, -0.888095571982754570, 0.888072587930327510, 0.888049601657718850, 0.888026613164986210, 0.888003622452187000, 0.887980629519378390, 0.887957634366618560, 0.887934636993964690, -0.887911637401474270, 0.887888635589204720, 0.887865631557213540, 0.887842625305558240, 0.887819616834296440, 0.887796606143485210, 0.887773593233182940, 0.887750578103446600, -0.887727560754333790, 0.887704541185902140, 0.887681519398209050, 0.887658495391312250, 0.887635469165268810, 0.887612440720137010, 0.887589410055974140, 0.887566377172837820, -0.887543342070785450, 0.887520304749874870, 0.887497265210163370, 0.887474223451708790, 0.887451179474568310, 0.887428133278800100, 0.887405084864461680, 0.887382034231610550, -0.887358981380304330, 0.887335926310600650, 0.887312869022557240, 0.887289809516231150, 0.887266747791680910, 0.887243683848963900, 0.887220617688137540, 0.887197549309259760, -0.887174478712388080, 0.887151405897580240, 0.887128330864893840, 0.887105253614386190, 0.887082174146115790, 0.887059092460140030, 0.887036008556516540, 0.887012922435302940, -0.886989834096557180, 0.886966743540336670, 0.886943650766699450, 0.886920555775702610, 0.886897458567404760, 0.886874359141863300, 0.886851257499135960, 0.886828153639280470, -0.886805047562354680, 0.886781939268416090, 0.886758828757522320, 0.886735716029732000, 0.886712601085102300, 0.886689483923691070, 0.886666364545556140, 0.886643242950755360, -0.886620119139346350, 0.886596993111387180, 0.886573864866935010, 0.886550734406048590, 0.886527601728785420, 0.886504466835203230, 0.886481329725359870, 0.886458190399313170, -0.886435048857120990, 0.886411905098841160, 0.886388759124531190, 0.886365610934249700, 0.886342460528054210, 0.886319307906002550, 0.886296153068152680, 0.886272996014562440, -0.886249836745289680, 0.886226675260391890, 0.886203511559927830, 0.886180345643954980, 0.886157177512531200, 0.886134007165714550, 0.886110834603562990, 0.886087659826134240, -0.886064482833486270, 0.886041303625676790, 0.886018122202764440, 0.885994938564806710, 0.885971752711861790, 0.885948564643987300, 0.885925374361241520, 0.885902181863682300, -0.885878987151367260, 0.885855790224355010, 0.885832591082703400, 0.885809389726470280, 0.885786186155713700, 0.885762980370491610, 0.885739772370862100, 0.885716562156883210, -0.885693349728612470, 0.885670135086108700, 0.885646918229429650, 0.885623699158633370, 0.885600477873777710, 0.885577254374920960, 0.885554028662121070, 0.885530800735436000, -0.885507570594923690, 0.885484338240642770, 0.885461103672650960, 0.885437866891006450, 0.885414627895767190, 0.885391386686991470, 0.885368143264737230, 0.885344897629062210, -0.885321649780025480, 0.885298399717684430, 0.885275147442097570, 0.885251892953322740, 0.885228636251418120, 0.885205377336442000, 0.885182116208452440, 0.885158852867507170, -0.885135587313665150, 0.885112319546984220, 0.885089049567522430, 0.885065777375337980, 0.885042502970489140, 0.885019226353034090, 0.884995947523030900, 0.884972666480537410, -0.884949383225612780, 0.884926097758314660, 0.884902810078701200, 0.884879520186830800, 0.884856228082761540, 0.884832933766551810, 0.884809637238259230, 0.884786338497942970, -0.884763037545660990, 0.884739734381471240, 0.884716429005432350, 0.884693121417602260, 0.884669811618039370, 0.884646499606801970, 0.884623185383947910, 0.884599868949536350, -0.884576550303625030, 0.884553229446272350, 0.884529906377536700, 0.884506581097476150, 0.884483253606149210, 0.884459923903613720, 0.884436591989928860, 0.884413257865152460, -0.884389921529342930, 0.884366582982558660, 0.884343242224857830, 0.884319899256298950, 0.884296554076940410, 0.884273206686839950, 0.884249857086056860, 0.884226505274649190, -0.884203151252675350, 0.884179795020193500, 0.884156436577262170, 0.884133075923939860, 0.884109713060284740, 0.884086347986354990, 0.884062980702209790, 0.884039611207907080, -0.884016239503505390, 0.883992865589063090, 0.883969489464638600, 0.883946111130290420, 0.883922730586076510, 0.883899347832056260, 0.883875962868287510, 0.883852575694829000, -0.883829186311739010, 0.883805794719075940, 0.883782400916898530, 0.883759004905265040, 0.883735606684233680, 0.883712206253863710, 0.883688803614213200, 0.883665398765340670, -0.883641991707304620, 0.883618582440163670, 0.883595170963976220, 0.883571757278800440, 0.883548341384695620, 0.883524923281720050, 0.883501502969932130, 0.883478080449390470, -0.883454655720153580, 0.883431228782279980, 0.883407799635828380, 0.883384368280856870, 0.883360934717424940, 0.883337498945590550, 0.883314060965412430, 0.883290620776949200, -0.883267178380259370, 0.883243733775401660, 0.883220286962434600, 0.883196837941416350, 0.883173386712406530, 0.883149933275463090, 0.883126477630644890, 0.883103019778010530, -0.883079559717618650, 0.883056097449527840, 0.883032632973796310, 0.883009166290483650, 0.882985697399648050, 0.882962226301348240, 0.882938752995642840, 0.882915277482590580, -0.882891799762250180, 0.882868319834680170, 0.882844837699939040, 0.882821353358086200, 0.882797866809179930, 0.882774378053279070, 0.882750887090442250, 0.882727393920728190, -0.882703898544195620, 0.882680400960903280, 0.882656901170909670, 0.882633399174274080, 0.882609894971055020, 0.882586388561311220, 0.882562879945101520, 0.882539369122484540, -0.882515856093519240, 0.882492340858263780, 0.882468823416777900, 0.882445303769120000, 0.882421781915348810, 0.882398257855523170, 0.882374731589701920, 0.882351203117943790, -0.882327672440307630, 0.882304139556851940, 0.882280604467636340, 0.882257067172719120, 0.882233527672159350, 0.882209985966015740, 0.882186442054347150, 0.882162895937212420, -0.882139347614670060, 0.882115797086779670, 0.882092244353599900, 0.882068689415189460, 0.882045132271607300, 0.882021572922912390, 0.881998011369163450, 0.881974447610419540, -0.881950881646739070, 0.881927313478181870, 0.881903743104806240, 0.881880170526671340, 0.881856595743836010, 0.881833018756359220, 0.881809439564299910, 0.881785858167716930, -0.881762274566668890, 0.881738688761215640, 0.881715100751415680, 0.881691510537327860, 0.881667918119011350, 0.881644323496525000, 0.881620726669927860, 0.881597127639278550, -0.881573526404636710, 0.881549922966061160, 0.881526317323610750, 0.881502709477344550, 0.881479099427321610, 0.881455487173600890, 0.881431872716241460, 0.881408256055301930, -0.881384637190842150, 0.881361016122920840, 0.881337392851596960, 0.881313767376929570, 0.881290139698977850, 0.881266509817800750, 0.881242877733457330, 0.881219243446006330, -0.881195606955507580, 0.881171968262019820, 0.881148327365602220, 0.881124684266313740, 0.881101038964213660, 0.881077391459360810, 0.881053741751814170, 0.881030089841633560, -0.881006435728877710, 0.880982779413605810, 0.880959120895877020, 0.880935460175750310, 0.880911797253285060, 0.880888132128540220, 0.880864464801574650, 0.880840795272448410, -0.880817123541220100, 0.880793449607949030, 0.880769773472694250, 0.880746095135515160, 0.880722414596470720, 0.880698731855619870, 0.880675046913022670, 0.880651359768737760, -0.880627670422824530, 0.880603978875342030, 0.880580285126349670, 0.880556589175906620, 0.880532891024072060, 0.880509190670904830, 0.880485488116464990, 0.880461783360811490, -0.880438076404003510, 0.880414367246100450, 0.880390655887161370, 0.880366942327245660, 0.880343226566412620, 0.880319508604721080, 0.880295788442231110, 0.880272066079001770, -0.880248341515092240, 0.880224614750561910, 0.880200885785469960, 0.880177154619875780, 0.880153421253838330, 0.880129685687417780, 0.880105947920672980, 0.880082207953663430, -0.880058465786448200, 0.880034721419086900, 0.880010974851638710, 0.879987226084163130, 0.879963475116719020, 0.879939721949366760, 0.879915966582165090, 0.879892209015173510, -0.879868449248451530, 0.879844687282058340, 0.879820923116053420, 0.879797156750496190, 0.879773388185445590, 0.879749617420962030, 0.879725844457104440, 0.879702069293932130, -0.879678291931504820, 0.879654512369881680, 0.879630730609122220, 0.879606946649285510, 0.879583160490431950, 0.879559372132620480, 0.879535581575910500, 0.879511788820361630, -0.879487993866033270, 0.879464196712984920, 0.879440397361275990, 0.879416595810965760, 0.879392792062114400, 0.879368986114781090, 0.879345177969025340, 0.879321367624906650, -0.879297555082484530, 0.879273740341818490, 0.879249923402967700, 0.879226104265992570, 0.879202282930952150, 0.879178459397905950, 0.879154633666913710, 0.879130805738034820, -0.879106975611328890, 0.879083143286855550, 0.879059308764673970, 0.879035472044844560, 0.879011633127426360, 0.878987792012479120, 0.878963948700062450, 0.878940103190235860, -0.878916255483059070, 0.878892405578591610, 0.878868553476892630, 0.878844699178022770, 0.878820842682041190, 0.878796983989007520, 0.878773123098981370, 0.878749260012022360, -0.878725394728190220, 0.878701527247544130, 0.878677657570144710, 0.878653785696051130, 0.878629911625323110, 0.878606035358020290, 0.878582156894202380, 0.878558276233929010, -0.878534393377260030, 0.878510508324254700, 0.878486621074973440, 0.878462731629475630, 0.878438839987821020, 0.878414946150069320, 0.878391050116280160, 0.878367151886513490, -0.878343251460828920, 0.878319348839285750, 0.878295444021944590, 0.878271537008864960, 0.878247627800106350, 0.878223716395728720, 0.878199802795791800, 0.878175887000355430, -0.878151969009478890, 0.878128048823222820, 0.878104126441646700, 0.878080201864810170, 0.878056275092773180, 0.878032346125595440, 0.878008414963336930, 0.877984481606057350, -0.877960546053816130, 0.877936608306673970, 0.877912668364690290, 0.877888726227925020, 0.877864781896437800, 0.877840835370288670, 0.877816886649537500, 0.877792935734243660, -0.877768982624467900, 0.877745027320269710, 0.877721069821708940, 0.877697110128845550, 0.877673148241739250, 0.877649184160450120, 0.877625217885038110, 0.877601249415562610, -0.877577278752084360, 0.877553305894662960, 0.877529330843358270, 0.877505353598230230, 0.877481374159338800, 0.877457392526744040, 0.877433408700505680, 0.877409422680683450, -0.877385434467338080, 0.877361444060529070, 0.877337451460316500, 0.877313456666760310, 0.877289459679920450, 0.877265460499856990, 0.877241459126629320, 0.877217455560298510, -0.877193449800924060, 0.877169441848566040, 0.877145431703284410, 0.877121419365139100, 0.877097404834190300, 0.877073388110498060, 0.877049369194121800, 0.877025348085122670, -0.877001324783560080, 0.876977299289494190, 0.876953271602985080, 0.876929241724092810, 0.876905209652877330, 0.876881175389398470, 0.876857138933717200, 0.876833100285892900, -0.876809059445985970, 0.876785016414056370, 0.876760971190164160, 0.876736923774369630, 0.876712874166732710, 0.876688822367313160, 0.876664768376172020, 0.876640712193369030, -0.876616653818964140, 0.876592593253017750, 0.876568530495589690, 0.876544465546740480, 0.876520398406530070, 0.876496329075018180, 0.876472257552265880, 0.876448183838333010, -0.876424107933279630, 0.876400029837166030, 0.876375949550052380, 0.876351867071998750, 0.876327782403065080, 0.876303695543312440, 0.876279606492800460, 0.876255515251589510, -0.876231421819739790, 0.876207326197311450, 0.876183228384364800, 0.876159128380960220, 0.876135026187157220, 0.876110921803017200, 0.876086815228599770, 0.876062706463965330, -0.876038595509174180, 0.876014482364286580, 0.875990367029362730, 0.875966249504462890, 0.875942129789647030, 0.875918007884976310, 0.875893883790510590, 0.875869757506310130, -0.875845629032435240, 0.875821498368946290, 0.875797365515903700, 0.875773230473367190, 0.875749093241398050, 0.875724953820056110, 0.875700812209401770, 0.875676668409495540, -0.875652522420397480, 0.875628374242168220, 0.875604223874868030, 0.875580071318556860, 0.875555916573295900, 0.875531759639145090, 0.875507600516164940, 0.875483439204415850, -0.875459275703958100, 0.875435110014852190, 0.875410942137157980, 0.875386772070936960, 0.875362599816248980, 0.875338425373154540, 0.875314248741713930, 0.875290069921987770, -0.875265888914036450, 0.875241705717920370, 0.875217520333699590, 0.875193332761435410, 0.875169143001187980, 0.875144951053017710, 0.875120756916984990, 0.875096560593150330, -0.875072362081574350, 0.875048161382317450, 0.875023958495439680, 0.874999753421002560, 0.874975546159065920, 0.874951336709690500, 0.874927125072936680, 0.874902911248865100, -0.874878695237536250, 0.874854477039010200, 0.874830256653348350, 0.874806034080610970, 0.874781809320858360, 0.874757582374151350, 0.874733353240550350, 0.874709121920115960, -0.874684888412908700, 0.874660652718988850, 0.874636414838417810, 0.874612174771255750, 0.874587932517563280, 0.874563688077400920, 0.874539441450829290, 0.874515192637909110, -0.874490941638701000, 0.874466688453265030, 0.874442433081662810, 0.874418175523954510, 0.874393915780200760, 0.874369653850462170, 0.874345389734799580, 0.874321123433273390, -0.874296854945944000, 0.874272584272872910, 0.874248311414120290, 0.874224036369746990, 0.874199759139813630, 0.874175479724380810, 0.874151198123509280, 0.874126914337259750, -0.874102628365692520, 0.874078340208869100, 0.874054049866849870, 0.874029757339695570, 0.874005462627466810, 0.873981165730224440, 0.873956866648029180, 0.873932565380941220, -0.873908261929022380, 0.873883956292332840, 0.873859648470933340, 0.873835338464884810, 0.873811026274247890, 0.873786711899083410, 0.873762395339452210, 0.873738076595414580, -0.873713755667032130, 0.873689432554365260, 0.873665107257474930, 0.873640779776421740, 0.873616450111266650, 0.873592118262070390, 0.873567784228893920, 0.873543448011797510, -0.873519109610842890, 0.873494769026090470, 0.873470426257601180, 0.873446081305435880, 0.873421734169655290, 0.873397384850320370, 0.873373033347491500, 0.873348679661230640, -0.873324323791597970, 0.873299965738654540, 0.873275605502461080, 0.873251243083078780, 0.873226878480568240, 0.873202511694990520, 0.873178142726406150, 0.873153771574876840, -0.873129398240463090, 0.873105022723225880, 0.873080645023226020, 0.873056265140524590, 0.873031883075182540, 0.873007498827260810, 0.872983112396819800, 0.872958723783921480, -0.872934332988626330, 0.872909940010995420, 0.872885544851089600, 0.872861147508969930, 0.872836747984697460, 0.872812346278332600, 0.872787942389937290, 0.872763536319572150, -0.872739128067298250, 0.872714717633176430, 0.872690305017267850, 0.872665890219633480, 0.872641473240334480, 0.872617054079431240, 0.872592632736985950, 0.872568209213059000, -0.872543783507711450, 0.872519355621004580, 0.872494925552999230, 0.872470493303756590, 0.872446058873337260, 0.872421622261803200, 0.872397183469215130, 0.872372742495634120, -0.872348299341121240, 0.872323854005737530, 0.872299406489544290, 0.872274956792602470, 0.872250504914972910, 0.872226050856717450, 0.872201594617896810, 0.872177136198572290, -0.872152675598804940, 0.872128212818655820, 0.872103747858186230, 0.872079280717457220, 0.872054811396529630, 0.872030339895465410, 0.872005866214325300, 0.871981390353170570, -0.871956912312062400, 0.871932432091061860, 0.871907949690230330, 0.871883465109628440, 0.871858978349318360, 0.871834489409360810, 0.871809998289816980, 0.871785504990748250, -0.871761009512215690, 0.871736511854280690, 0.871712012017004320, 0.871687510000447530, 0.871663005804672380, 0.871638499429739700, 0.871613990875710900, 0.871589480142646920, -0.871564967230609390, 0.871540452139659360, 0.871515934869858230, 0.871491415421266850, 0.871466893793947370, 0.871442369987960650, 0.871417844003367970, 0.871393315840230720, -0.871368785498610190, 0.871344252978567660, 0.871319718280164080, 0.871295181403461630, 0.871270642348521250, 0.871246101115404240, 0.871221557704171980, 0.871197012114885870, -0.871172464347607200, 0.871147914402397360, 0.871123362279317300, 0.871098807978429200, 0.871074251499794230, 0.871049692843473560, 0.871025132009528580, 0.871000568998020810, -0.870976003809011750, 0.870951436442562120, 0.870926866898734330, 0.870902295177589440, 0.870877721279188720, 0.870853145203593800, 0.870828566950865970, 0.870803986521066720, -0.870779403914257450, 0.870754819130499350, 0.870730232169854570, 0.870705643032384180, 0.870681051718149690, 0.870656458227212600, 0.870631862559634430, 0.870607264715476560, -0.870582664694800500, 0.870558062497667320, 0.870533458124139510, 0.870508851574277930, 0.870484242848144300, 0.870459631945800120, 0.870435018867306790, 0.870410403612725920, -0.870385786182118590, 0.870361166575547300, 0.870336544793072990, 0.870311920834757390, 0.870287294700661910, 0.870262666390848260, 0.870238035905377960, 0.870213403244312510, -0.870188768407713200, 0.870164131395642300, 0.870139492208161110, 0.870114850845331240, 0.870090207307214200, 0.870065561593871720, 0.870040913705365180, 0.870016263641756100, -0.869991611403106660, 0.869966956989478240, 0.869942300400932460, 0.869917641637530940, 0.869892980699335180, 0.869868317586407150, 0.869843652298808220, 0.869818984836599700, -0.869794315199844180, 0.869769643388602850, 0.869744969402937550, 0.869720293242909670, 0.869695614908581160, 0.869670934400013530, 0.869646251717268610, 0.869621566860407590, -0.869596879829493190, 0.869572190624586460, 0.869547499245749370, 0.869522805693043410, 0.869498109966530540, 0.869473412066272380, 0.869448711992330200, 0.869424009744766750, -0.869399305323643180, 0.869374598729021450, 0.869349889960963180, 0.869325179019530100, 0.869300465904784160, 0.869275750616787080, 0.869251033155600150, 0.869226313521286100, -0.869201591713906210, 0.869176867733522430, 0.869152141580196380, 0.869127413253990010, 0.869102682754965160, 0.869077950083183560, 0.869053215238706710, 0.869028478221597120, -0.869003739031916410, 0.868978997669726420, 0.868954254135088870, 0.868929508428065710, 0.868904760548718790, 0.868880010497109500, 0.868855258273300570, 0.868830503877353610, -0.868805747309330250, 0.868780988569292640, 0.868756227657302540, 0.868731464573421870, 0.868706699317712490, 0.868681931890236010, 0.868657162291055050, 0.868632390520231220, -0.868607616577826370, 0.868582840463902550, 0.868558062178521610, 0.868533281721745490, 0.868508499093635700, 0.868483714294255190, 0.868458927323665360, 0.868434138181928270, -0.868409346869105760, 0.868384553385259880, 0.868359757730452600, 0.868334959904745960, 0.868310159908201480, 0.868285357740882000, 0.868260553402849130, 0.868235746894164940, -0.868210938214891370, 0.868186127365090490, 0.868161314344824240, 0.868136499154154690, 0.868111681793143460, 0.868086862261853500, 0.868062040560346300, 0.868037216688684050, -0.868012390646928810, 0.867987562435142520, 0.867962732053387360, 0.867937899501724950, 0.867913064780218240, 0.867888227888928830, 0.867863388827918800, 0.867838547597250320, -0.867813704196985560, 0.867788858627186470, 0.867764010887915220, 0.867739160979233540, 0.867714308901204380, 0.867689454653889470, 0.867664598237350980, 0.867639739651650870, -0.867614878896851520, 0.867590015973014880, 0.867565150880203250, 0.867540283618478240, 0.867515414187903120, 0.867490542588539300, 0.867465668820449180, 0.867440792883694910, -0.867415914778338680, 0.867391034504442550, 0.867366152062068460, 0.867341267451279490, 0.867316380672137340, 0.867291491724704100, 0.867266600609042260, 0.867241707325213880, -0.867216811873281260, 0.867191914253306660, 0.867167014465351720, 0.867142112509479700, 0.867117208385752460, 0.867092302094232160, 0.867067393634981200, 0.867042483008061640, -0.867017570213535870, 0.866992655251465740, 0.866967738121914520, 0.866942818824943840, 0.866917897360616200, 0.866892973728993770, 0.866868047930138830, 0.866843119964113900, -0.866818189830981130, 0.866793257530802390, 0.866768323063641040, 0.866743386429558840, 0.866718447628618160, 0.866693506660881300, 0.866668563526410750, 0.866643618225268810, -0.866618670757517750, 0.866593721123219640, 0.866568769322437650, 0.866543815355233730, 0.866518859221670270, 0.866493900921809670, 0.866468940455714320, 0.866443977823446620, -0.866419013025068520, 0.866394046060643410, 0.866369076930233130, 0.866344105633900070, 0.866319132171706860, 0.866294156543715780, 0.866269178749989320, 0.866244198790589890, -0.866219216665579550, 0.866194232375021580, 0.866169245918978040, 0.866144257297511430, 0.866119266510684160, 0.866094273558558610, 0.866069278441197520, 0.866044281158663170, -0.866019281711017720, 0.865994280098324460, 0.865969276320645580, 0.865944270378043450, 0.865919262270580580, 0.865894251998319600, 0.865869239561323000, 0.865844224959652850, -0.865819208193372660, 0.865794189262544370, 0.865769168167230600, 0.865744144907493960, 0.865719119483396970, 0.865694091895002130, 0.865669062142372050, 0.865644030225568910, -0.865618996144656090, 0.865593959899695900, 0.865568921490750710, 0.865543880917883150, 0.865518838181156050, 0.865493793280631700, 0.865468746216372490, 0.865443696988441920, -0.865418645596902070, 0.865393592041815540, 0.865368536323245170, 0.865343478441253370, 0.865318418395902840, 0.865293356187256220, 0.865268291815375900, 0.865243225280325270, -0.865218156582166500, 0.865193085720962430, 0.865168012696775570, 0.865142937509668750, 0.865117860159704600, 0.865092780646945720, 0.865067698971454410, 0.865042615133294390, -0.865017529132527830, 0.864992440969217460, 0.864967350643425890, 0.864942258155215970, 0.864917163504650530, 0.864892066691791640, 0.864866967716703020, 0.864841866579446950, -0.864816763280086280, 0.864791657818683720, 0.864766550195301910, 0.864741440410003780, 0.864716328462852070, 0.864691214353909170, 0.864666098083238580, 0.864640979650902700, -0.864615859056964480, 0.864590736301486530, 0.864565611384531810, 0.864540484306163040, 0.864515355066443060, 0.864490223665434150, 0.864465090103200270, 0.864439954379803590, -0.864414816495307050, 0.864389676449773490, 0.864364534243265650, 0.864339389875846580, 0.864314243347578560, 0.864289094658525330, 0.864263943808749380, 0.864238790798313560, -0.864213635627280820, 0.864188478295713990, 0.864163318803675920, 0.864138157151229550, 0.864112993338437390, 0.864087827365363160, 0.864062659232069370, 0.864037488938618870, -0.864012316485074710, 0.863987141871499830, 0.863961965097956970, 0.863936786164508860, 0.863911605071219110, 0.863886421818150450, 0.863861236405365720, 0.863836048832927860, -0.863810859100899940, 0.863785667209344800, 0.863760473158325490, 0.863735276947904640, 0.863710078578145970, 0.863684878049112090, 0.863659675360866070, 0.863634470513470860, -0.863609263506989410, 0.863584054341484890, 0.863558843017020130, 0.863533629533657860, 0.863508413891462050, 0.863483196090495060, 0.863457976130820200, 0.863432754012500300, -0.863407529735598640, 0.863382303300178070, 0.863357074706301300, 0.863331843954032290, 0.863306611043433650, 0.863281375974568550, 0.863256138747499960, 0.863230899362291030, -0.863205657819004930, 0.863180414117704630, 0.863155168258452840, 0.863129920241313520, 0.863104670066349500, 0.863079417733623730, 0.863054163243199390, 0.863028906595139760, -0.863003647789507780, 0.862978386826366290, 0.862953123705779260, 0.862927858427809390, 0.862902590992519870, 0.862877321399973860, 0.862852049650234540, 0.862826775743365190, -0.862801499679428870, 0.862776221458488310, 0.862750941080607680, 0.862725658545849710, 0.862700373854277560, 0.862675087005954410, 0.862649798000943660, 0.862624506839308360, -0.862599213521111800, 0.862573918046416810, 0.862548620415287350, 0.862523320627786470, 0.862498018683977240, 0.862472714583922940, 0.862447408327686850, 0.862422099915332250, -0.862396789346921990, 0.862371476622520230, 0.862346161742189700, 0.862320844705993790, 0.862295525513995800, 0.862270204166258880, 0.862244880662846550, 0.862219555003822080, -0.862194227189248210, 0.862168897219189210, 0.862143565093707930, 0.862118230812867760, 0.862092894376732090, 0.862067555785364090, 0.862042215038827280, 0.862016872137184920, -0.861991527080499860, 0.861966179868836500, 0.861940830502257670, 0.861915478980826770, 0.861890125304607070, 0.861864769473662200, 0.861839411488055320, 0.861814051347849500, -0.861788689053109010, 0.861763324603896820, 0.861737958000276310, 0.861712589242310870, 0.861687218330063900, 0.861661845263599010, 0.861636470042979500, 0.861611092668268300, -0.861585713139529810, 0.861560331456827090, 0.861534947620223530, 0.861509561629782540, 0.861484173485567720, 0.861458783187642460, 0.861433390736069730, 0.861407996130914010, -0.861382599372238270, 0.861357200460106110, 0.861331799394580930, 0.861306396175726240, 0.861280990803605540, 0.861255583278282330, 0.861230173599819790, 0.861204761768282200, -0.861179347783732730, 0.861153931646234880, 0.861128513355852280, 0.861103092912648300, 0.861077670316686690, 0.861052245568030840, 0.861026818666743910, 0.861001389612890410, -0.860975958406533400, 0.860950525047736500, 0.860925089536563330, 0.860899651873077380, 0.860874212057342380, 0.860848770089421400, 0.860823325969378830, 0.860797879697278060, -0.860772431273182480, 0.860746980697155940, 0.860721527969261930, 0.860696073089563970, 0.860670616058126000, 0.860645156875010970, 0.860619695540283500, 0.860594232054006760, -0.860568766416244470, 0.860543298627060250, 0.860517828686517830, 0.860492356594680820, 0.860466882351612840, 0.860441405957377280, 0.860415927412038650, 0.860390446715660230, -0.860364963868305630, 0.860339478870038700, 0.860313991720923040, 0.860288502421022280, 0.860263010970399920, 0.860237517369120570, 0.860212021617247300, 0.860186523714844050, -0.860161023661974440, 0.860135521458702310, 0.860110017105091270, 0.860084510601205390, 0.860059001947107600, 0.860033491142862760, 0.860007978188534360, 0.859982463084185910, -0.859956945829881250, 0.859931426425684320, 0.859905904871658740, 0.859880381167868020, 0.859854855314376780, 0.859829327311248390, 0.859803797158546710, 0.859778264856335460, -0.859752730404678590, 0.859727193803639930, 0.859701655053283220, 0.859676114153671960, 0.859650571104870860, 0.859625025906943340, 0.859599478559953330, 0.859573929063964460, -0.859548377419040890, 0.859522823625246350, 0.859497267682644780, 0.859471709591299480, 0.859446149351275500, 0.859420586962636010, 0.859395022425445190, 0.859369455739766750, -0.859343886905664660, 0.859318315923202850, 0.859292742792444830, 0.859267167513455330, 0.859241590086297970, 0.859216010511036690, 0.859190428787735330, 0.859164844916457840, -0.859139258897268280, 0.859113670730230710, 0.859088080415408300, 0.859062487952866220, 0.859036893342667970, 0.859011296584877400, 0.858985697679558680, 0.858960096626775640, -0.858934493426592450, 0.858908888079072950, 0.858883280584280760, 0.858857670942280940, 0.858832059153136760, 0.858806445216912630, 0.858780829133672260, 0.858755210903479840, -0.858729590526399410, 0.858703968002494490, 0.858678343331830240, 0.858652716514469950, 0.858627087550478010, 0.858601456439918360, 0.858575823182854970, 0.858550187779352100, -0.858524550229473720, 0.858498910533283530, 0.858473268690846500, 0.858447624702226350, 0.858421978567487030, 0.858396330286692820, 0.858370679859907890, 0.858345027287196080, -0.858319372568621340, 0.858293715704248620, 0.858268056694141630, 0.858242395538364460, 0.858216732236981360, 0.858191066790056410, 0.858165399197653780, 0.858139729459837630, -0.858114057576671700, 0.858088383548221150, 0.858062707374549590, 0.858037029055721210, 0.858011348591800390, 0.857985665982851090, 0.857959981228937680, 0.857934294330124250, -0.857908605286474720, 0.857882914098054060, 0.857857220764926100, 0.857831525287155120, 0.857805827664805400, 0.857780127897941000, 0.857754425986626320, 0.857728721930925090, -0.857703015730902570, 0.857677307386622510, 0.857651596898149180, 0.857625884265546870, 0.857600169488879850, 0.857574452568212300, 0.857548733503608720, 0.857523012295132840, -0.857497288942849820, 0.857471563446823630, 0.857445835807118530, 0.857420106023798920, 0.857394374096928980, 0.857368640026573090, 0.857342903812795540, 0.857317165455660390, -0.857291424955232690, 0.857265682311576520, 0.857239937524756020, 0.857214190594835830, 0.857188441521880010, 0.857162690305953160, 0.857136936947119120, 0.857111181445443290, -0.857085423800989400, 0.857059664013821940, 0.857033902084005430, 0.857008138011604030, 0.856982371796682350, 0.856956603439304800, 0.856930832939535200, 0.856905060297438960, -0.856879285513080120, 0.856853508586522980, 0.856827729517832150, 0.856801948307072010, 0.856776164954306970, 0.856750379459601090, 0.856724591823019740, 0.856698802044626780, -0.856673010124486930, 0.856647216062664580, 0.856621419859224130, 0.856595621514230080, 0.856569821027747040, 0.856544018399839070, 0.856518213630571350, 0.856492406720008260, -0.856466597668213980, 0.856440786475253350, 0.856414973141190640, 0.856389157666090580, 0.856363340050017570, 0.856337520293035780, 0.856311698395210710, 0.856285874356606300, -0.856260048177287290, 0.856234219857318070, 0.856208389396763360, 0.856182556795687670, 0.856156722054155160, 0.856130885172231240, 0.856105046149980060, 0.856079204987466370, -0.856053361684754650, 0.856027516241909540, 0.856001668658995520, 0.855975818936077440, 0.855949967073219350, 0.855924113070486770, 0.855898256927943970, 0.855872398645655450, -0.855846538223685950, 0.855820675662100180, 0.855794810960962660, 0.855768944120338100, 0.855743075140290690, 0.855717204020886140, 0.855691330762188510, 0.855665455364262640, -0.855639577827173040, 0.855613698150984540, 0.855587816335761750, 0.855561932381568970, 0.855536046288471910, 0.855510158056534630, 0.855484267685821980, 0.855458375176398670, -0.855432480528329430, 0.855406583741678990, 0.855380684816512080, 0.855354783752893090, 0.855328880550887400, 0.855302975210559650, 0.855277067731974430, 0.855251158115196590, -0.855225246360290850, 0.855199332467321940, 0.855173416436354250, 0.855147498267453510, 0.855121577960684000, 0.855095655516110550, 0.855069730933797900, 0.855043804213810990, -0.855017875356214540, 0.854991944361073510, 0.854966011228452060, 0.854940075958416030, 0.854914138551029820, 0.854888199006358260, 0.854862257324466300, 0.854836313505418550, -0.854810367549280080, 0.854784419456115720, 0.854758469225989860, 0.854732516858968230, 0.854706562355115330, 0.854680605714496000, 0.854654646937175190, 0.854628686023217840, -0.854602722972688690, 0.854576757785652230, 0.854550790462174410, 0.854524821002319630, 0.854498849406152730, 0.854472875673738750, 0.854446899805142550, 0.854420921800429060, -0.854394941659663340, 0.854368959382909800, 0.854342974970234260, 0.854316988421701340, 0.854290999737375990, 0.854265008917323150, 0.854239015961607670, 0.854213020870294710, -0.854187023643448780, 0.854161024281135720, 0.854135022783420020, 0.854109019150366850, 0.854083013382041180, 0.854057005478507820, 0.854030995439832070, 0.854004983266078880, -0.853978968957312620, 0.853952952513599480, 0.853926933935003960, 0.853900913221591120, 0.853874890373426010, 0.853848865390573590, 0.853822838273099020, 0.853796809021067470, -0.853770777634543340, 0.853744744113592690, 0.853718708458280240, 0.853692670668671050, 0.853666630744830180, 0.853640588686822690, 0.853614544494713750, 0.853588498168567970, -0.853562449708451410, 0.853536399114428690, 0.853510346386565090, 0.853484291524925550, 0.853458234529575250, 0.853432175400579360, 0.853406114138003160, 0.853380050741911030, -0.853353985212369380, 0.853327917549442700, 0.853301847753196290, 0.853275775823695180, 0.853249701761004680, 0.853223625565189820, 0.853197547236316020, 0.853171466774447880, -0.853145384179651470, 0.853119299451991610, 0.853093212591533590, 0.853067123598342470, 0.853041032472483530, 0.853014939214022050, 0.852988843823022760, 0.852962746299551820, -0.852936646643673970, 0.852910544855454590, 0.852884440934958740, 0.852858334882251820, 0.852832226697399110, 0.852806116380465770, 0.852780003931516760, 0.852753889350618130, -0.852727772637834840, 0.852701653793232040, 0.852675532816875140, 0.852649409708829410, 0.852623284469160250, 0.852597157097932270, 0.852571027595211970, 0.852544895961063980, -0.852518762195553890, 0.852492626298746780, 0.852466488270708140, 0.852440348111503270, 0.852414205821197650, 0.852388061399855900, 0.852361914847544530, 0.852335766164328380, -0.852309615350272720, 0.852283462405443170, 0.852257307329904900, 0.852231150123723300, 0.852204990786963880, 0.852178829319691580, 0.852152665721972570, 0.852126499993871910, -0.852100332135455000, 0.852074162146787330, 0.852047990027934190, 0.852021815778961080, 0.851995639399932950, 0.851969460890916300, 0.851943280251975850, 0.851917097483177340, -0.851890912584585940, 0.851864725556267350, 0.851838536398286990, 0.851812345110710250, 0.851786151693602060, 0.851759956147029150, 0.851733758471056150, 0.851707558665748880, -0.851681356731172730, 0.851655152667393220, 0.851628946474475730, 0.851602738152485880, 0.851576527701488730, 0.851550315121550770, 0.851524100412736960, 0.851497883575113020, -0.851471664608744240, 0.851445443513696330, 0.851419220290034810, 0.851392994937824830, 0.851366767457132800, 0.851340537848023770, 0.851314306110563470, 0.851288072244817400, -0.851261836250851170, 0.851235598128730400, 0.851209357878520480, 0.851183115500286800, 0.851156870994095870, 0.851130624360012630, 0.851104375598102810, 0.851078124708432140, -0.851051871691066220, 0.851025616546070450, 0.850999359273510340, 0.850973099873452150, 0.850946838345961300, 0.850920574691103380, 0.850894308908944020, 0.850868040999548820, -0.850841770962983520, 0.850815498799313840, 0.850789224508604840, 0.850762948090923340, 0.850736669546334530, 0.850710388874903910, 0.850684106076697420, 0.850657821151780680, -0.850631534100219300, 0.850605244922079120, 0.850578953617425300, 0.850552660186324690, 0.850526364628842350, 0.850500066945044100, 0.850473767134995780, 0.850447465198762910, -0.850421161136411420, 0.850394854948006600, 0.850368546633615050, 0.850342236193302180, 0.850315923627133710, 0.850289608935175470, 0.850263292117493190, 0.850236973174152590, -0.850210652105219620, 0.850184328910759570, 0.850158003590839150, 0.850131676145523760, 0.850105346574879130, 0.850079014878971080, 0.850052681057865580, 0.850026345111628330, -0.850000007040325300, 0.849973666844021760, 0.849947324522784430, 0.849920980076678930, 0.849894633505770880, 0.849868284810126220, 0.849841933989810890, 0.849815581044890740, -0.849789225975431160, 0.849762868781498980, 0.849736509463159590, 0.849710148020479060, 0.849683784453522990, 0.849657418762357560, 0.849631050947048600, 0.849604681007661950, -0.849578308944263120, 0.849551934756919040, 0.849525558445695110, 0.849499180010657270, 0.849472799451871490, 0.849446416769403800, 0.849420031963319940, 0.849393645033685530, -0.849367255980567610, 0.849340864804031370, 0.849314471504143080, 0.849288076080968570, 0.849261678534573900, 0.849235278865025030, 0.849208877072388010, 0.849182473156728230, -0.849156067118112760, 0.849129658956607190, 0.849103248672277380, 0.849076836265189480, 0.849050421735409570, 0.849024005083003570, 0.848997586308037460, 0.848971165410577040, -0.848944742390689070, 0.848918317248439360, 0.848891889983893750, 0.848865460597118540, 0.848839029088179540, 0.848812595457143050, 0.848786159704074560, 0.848759721829041140, -0.848733281832108500, 0.848706839713342600, 0.848680395472809490, 0.848653949110575570, 0.848627500626706670, 0.848601050021269070, 0.848574597294328380, 0.848548142445951560, -0.848521685476204550, 0.848495226385153180, 0.848468765172863850, 0.848442301839402500, 0.848415836384835530, 0.848389368809228880, 0.848362899112648390, 0.848336427295161010, -0.848309953356832680, 0.848283477297729460, 0.848256999117917520, 0.848230518817463030, 0.848204036396432380, 0.848177551854891080, 0.848151065192906390, 0.848124576410543950, -0.848098085507870140, 0.848071592484951120, 0.848045097341853180, 0.848018600078642380, 0.847992100695385110, 0.847965599192147200, 0.847939095568995720, 0.847912589825996490, -0.847886081963215800, 0.847859571980719820, 0.847833059878575050, 0.847806545656847540, 0.847780029315603150, 0.847753510854909240, 0.847726990274831560, 0.847700467575436380, -0.847673942756790090, 0.847647415818958860, 0.847620886762009080, 0.847594355586007150, 0.847567822291018790, 0.847541286877111390, 0.847514749344350780, 0.847488209692803360, -0.847461667922535300, 0.847435124033613100, 0.847408578026103140, 0.847382029900071720, 0.847355479655584660, 0.847328927292709480, 0.847302372811511990, 0.847275816212058500, -0.847249257494415490, 0.847222696658649350, 0.847196133704826490, 0.847169568633012740, 0.847143001443275590, 0.847116432135681000, 0.847089860710295240, 0.847063287167184930, -0.847036711506416240, 0.847010133728055890, 0.846983553832170280, 0.846956971818825120, 0.846930387688088150, 0.846903801440025190, 0.846877213074702650, 0.846850622592187130, -0.846824029992545020, 0.846797435275842950, 0.846770838442146730, 0.846744239491523890, 0.846717638424040460, 0.846691035239762860, 0.846664429938757790, 0.846637822521091540, -0.846611212986830840, 0.846584601336042080, 0.846557987568791300, 0.846531371685146030, 0.846504753685172420, 0.846478133568936860, 0.846451511336505870, 0.846424886987946270, -0.846398260523324340, 0.846371631942706810, 0.846345001246159740, 0.846318368433750630, 0.846291733505545540, 0.846265096461611190, 0.846238457302014080, 0.846211816026820830, -0.846185172636097940, 0.846158527129911800, 0.846131879508329690, 0.846105229771418000, 0.846078577919243120, 0.846051923951871900, 0.846025267869370820, 0.845998609671806510, -0.845971949359245800, 0.845945286931754640, 0.845918622389400850, 0.845891955732250400, 0.845865286960370110, 0.845838616073826600, 0.845811943072686480, 0.845785267957016580, -0.845758590726883530, 0.845731911382353490, 0.845705229923494060, 0.845678546350371760, 0.845651860663052870, 0.845625172861604430, 0.845598482946093190, 0.845571790916585520, -0.845545096773148040, 0.845518400515848260, 0.845491702144752440, 0.845465001659927440, 0.845438299061439860, 0.845411594349356530, 0.845384887523744300, 0.845358178584669770, -0.845331467532199340, 0.845304754366400730, 0.845278039087340230, 0.845251321695084660, 0.845224602189700750, 0.845197880571255330, 0.845171156839815250, 0.845144430995446780, -0.845117703038217650, 0.845090972968194350, 0.845064240785443620, 0.845037506490032180, 0.845010770082027070, 0.844984031561495040, 0.844957290928502910, 0.844930548183117080, -0.844903803325405380, 0.844877056355434090, 0.844850307273270260, 0.844823556078980520, 0.844796802772632030, 0.844770047354291510, 0.844743289824025800, 0.844716530181901510, -0.844689768427986270, 0.844663004562346660, 0.844636238585049440, 0.844609470496161750, 0.844582700295750330, 0.844555927983882130, 0.844529153560623640, 0.844502377026042810, -0.844475598380206030, 0.844448817623180140, 0.844422034755032300, 0.844395249775829470, 0.844368462685638370, 0.844341673484526160, 0.844314882172559230, 0.844288088749805650, -0.844261293216331810, 0.844234495572204760, 0.844207695817491440, 0.844180893952258930, 0.844154089976574150, 0.844127283890504180, 0.844100475694115500, 0.844073665387476080, -0.844046852970652520, 0.844020038443711870, 0.843993221806721090, 0.843966403059747240, 0.843939582202857360, 0.843912759236118080, 0.843885934159597450, 0.843859106973361860, -0.843832277677478590, 0.843805446272014590, 0.843778612757037030, 0.843751777132612850, 0.843724939398809210, 0.843698099555692860, 0.843671257603331610, 0.843644413541792320, -0.843617567371142020, 0.843590719091447780, 0.843563868702776660, 0.843537016205195940, 0.843510161598772120, 0.843483304883573480, 0.843456446059666520, 0.843429585127118410, -0.843402722085996430, 0.843375856936367630, 0.843348989678299080, 0.843322120311858160, 0.843295248837111490, 0.843268375254127120, 0.843241499562971790, 0.843214621763712760, -0.843187741856417090, 0.843160859841152190, 0.843133975717984980, 0.843107089486982990, 0.843080201148212800, 0.843053310701742500, 0.843026418147638900, 0.842999523485969290, -0.842972626716800950, 0.842945727840200940, 0.842918826856236650, 0.842891923764974790, 0.842865018566483660, 0.842838111260829970, 0.842811201848081000, 0.842784290328303930, -0.842757376701566250, 0.842730460967935020, 0.842703543127477750, 0.842676623180261150, 0.842649701126353400, 0.842622776965821440, 0.842595850698732440, 0.842568922325153900, -0.842541991845153100, 0.842515059258797220, 0.842488124566153740, 0.842461187767289510, 0.842434248862272690, 0.842407307851170350, 0.842380364734049760, 0.842353419510978090, -0.842326472182023060, 0.842299522747251730, 0.842272571206731160, 0.842245617560529620, 0.842218661808714080, 0.842191703951351900, 0.842164743988510380, 0.842137781920257010, -0.842110817746659190, 0.842083851467784420, 0.842056883083699410, 0.842029912594472800, 0.842002940000171280, 0.841975965300862490, 0.841948988496613810, 0.841922009587492640, -0.841895028573566350, 0.841868045454902130, 0.841841060231568240, 0.841814072903631640, 0.841787083471159940, 0.841760091934220520, 0.841733098292880790, 0.841706102547208460, -0.841679104697270810, 0.841652104743134900, 0.841625102684869120, 0.841598098522540750, 0.841571092256217070, 0.841544083885965580, 0.841517073411854000, 0.841490060833949620, -0.841463046152320150, 0.841436029367032660, 0.841409010478155420, 0.841381989485755820, 0.841354966389901150, 0.841327941190659010, 0.841300913888097130, 0.841273884482282910, -0.841246852973283500, 0.841219819361167520, 0.841192783646001920, 0.841165745827854310, 0.841138705906792410, 0.841111663882883720, 0.841084619756195860, 0.841057573526796440, -0.841030525194752740, 0.841003474760133040, 0.840976422223004730, 0.840949367583435300, 0.840922310841492490, 0.840895251997244020, 0.840868191050757270, 0.840841128002100090, -0.840814062851339640, 0.840786995598544420, 0.840759926243781820, 0.840732854787119340, 0.840705781228624720, 0.840678705568365660, 0.840651627806409900, 0.840624547942824480, -0.840597465977678260, 0.840570381911038390, 0.840543295742972480, 0.840516207473548380, 0.840489117102833690, 0.840462024630896360, 0.840434930057803790, 0.840407833383623570, -0.840380734608424110, 0.840353633732272900, 0.840326530755237560, 0.840299425677386020, 0.840272318498785810, 0.840245209219504740, 0.840218097839610320, 0.840190984359171060, -0.840163868778254330, 0.840136751096927870, 0.840109631315259620, 0.840082509433317300, 0.840055385451168650, 0.840028259368881590, 0.840001131186523310, 0.839974000904162740, -0.839946868521867170, 0.839919734039704440, 0.839892597457742470, 0.839865458776048900, 0.839838317994691660, 0.839811175113738590, 0.839784030133257200, 0.839756883053316190, -0.839729733873982980, 0.839702582595325380, 0.839675429217411450, 0.839648273740308810, 0.839621116164085520, 0.839593956488808970, 0.839566794714548090, 0.839539630841370070, -0.839512464869343060, 0.839485296798534900, 0.839458126629013530, 0.839430954360846800, 0.839403779994102650, 0.839376603528848570, 0.839349424965153520, 0.839322244303084890, -0.839295061542710610, 0.839267876684098750, 0.839240689727317140, 0.839213500672433830, 0.839186309519516340, 0.839159116268633490, 0.839131920919852780, 0.839104723473242390, -0.839077523928870140, 0.839050322286804100, 0.839023118547112200, 0.838995912709862620, 0.838968704775122640, 0.838941494742961420, 0.838914282613446580, 0.838887068386645950, -0.838859852062627590, 0.838832633641459660, 0.838805413123210110, 0.838778190507947110, 0.838750965795738050, 0.838723738986652090, 0.838696510080756850, 0.838669279078120280, -0.838642045978810540, 0.838614810782895680, 0.838587573490443770, 0.838560334101522420, 0.838533092616200680, 0.838505849034546280, 0.838478603356627270, 0.838451355582511830, -0.838424105712267890, 0.838396853745963620, 0.838369599683667310, 0.838342343525446560, 0.838315085271370330, 0.838287824921506440, 0.838260562475923070, 0.838233297934688150, -0.838206031297870080, 0.838178762565536920, 0.838151491737756830, 0.838124218814597530, 0.838096943796128090, 0.838069666682416450, 0.838042387473530550, 0.838015106169538670, -0.837987822770509090, 0.837960537276509880, 0.837933249687608850, 0.837905960003875180, 0.837878668225376710, 0.837851374352181490, 0.837824078384357800, 0.837796780321974020, -0.837769480165098220, 0.837742177913798680, 0.837714873568143230, 0.837687567128201140, 0.837660258594040140, 0.837632947965728400, 0.837605635243334420, 0.837578320426926260, -0.837551003516572300, 0.837523684512340380, 0.837496363414299670, 0.837469040222518110, 0.837441714937063990, 0.837414387558005460, 0.837387058085411030, 0.837359726519348980, -0.837332392859887590, 0.837305057107094800, 0.837277719261039780, 0.837250379321790470, 0.837223037289415160, 0.837195693163982350, 0.837168346945560300, 0.837140998634217310, -0.837113648230021880, 0.837086295733041830, 0.837058941143346560, 0.837031584461003900, 0.837004225686082240, 0.836976864818650080, 0.836949501858775700, 0.836922136806527610, -0.836894769661973740, 0.836867400425183370, 0.836840029096224460, 0.836812655675165610, 0.836785280162074980, 0.836757902557021200, 0.836730522860072660, 0.836703141071297840, -0.836675757190764700, 0.836648371218542630, 0.836620983154699570, 0.836593592999304140, 0.836566200752424720, 0.836538806414129700, 0.836511409984487810, 0.836484011463567320, -0.836456610851436300, 0.836429208148164240, 0.836401803353819200, 0.836374396468469560, 0.836346987492184060, 0.836319576425031070, 0.836292163267079000, 0.836264748018396230, -0.836237330679051930, 0.836209911249114370, 0.836182489728652060, 0.836155066117733490, 0.836127640416427180, 0.836100212624801830, 0.836072782742925960, 0.836045350770867610, -0.836017916708696410, 0.835990480556480400, 0.835963042314288310, 0.835935601982188410, 0.835908159560249660, 0.835880715048540450, 0.835853268447128930, 0.835825819756084830, -0.835798368975476100, 0.835770916105371460, 0.835743461145839530, 0.835716004096948910, 0.835688544958768320, 0.835661083731366380, 0.835633620414811260, 0.835606155009172570, -0.835578687514518470, 0.835551217930917690, 0.835523746258438840, 0.835496272497150530, 0.835468796647121700, 0.835441318708420750, 0.835413838681116070, 0.835386356565277270, -0.835358872360972620, 0.835331386068270730, 0.835303897687240450, 0.835276407217950380, 0.835248914660469240, 0.835221420014865430, 0.835193923281208450, 0.835166424459566790, -0.835138923550008960, 0.835111420552603900, 0.835083915467420220, 0.835056408294526760, 0.835028899033992360, 0.835001387685885170, 0.834973874250275030, 0.834946358727230110, -0.834918841116819350, 0.834891321419111490, 0.834863799634175340, 0.834836275762079640, 0.834808749802893320, 0.834781221756684570, 0.834753691623523310, 0.834726159403477830, -0.834698625096616960, 0.834671088703009430, 0.834643550222724300, 0.834616009655830270, 0.834588467002395640, 0.834560922262490460, 0.834533375436182890, 0.834505826523541880, -0.834478275524636270, 0.834450722439535000, 0.834423167268307010, 0.834395610011021030, 0.834368050667745550, 0.834340489238550420, 0.834312925723504020, 0.834285360122675400, -0.834257792436133290, 0.834230222663946750, 0.834202650806184720, 0.834175076862915480, 0.834147500834209080, 0.834119922720133910, 0.834092342520758920, 0.834064760236153060, -0.834037175866385370, 0.834009589411524700, 0.833982000871639980, 0.833954410246799950, 0.833926817537074210, 0.833899222742531480, 0.833871625863240820, 0.833844026899270950, -0.833816425850691050, 0.833788822717570040, 0.833761217499977000, 0.833733610197980420, 0.833706000811650360, 0.833678389341055310, 0.833650775786264230, 0.833623160147346280, -0.833595542424370280, 0.833567922617405640, 0.833540300726520520, 0.833512676751785200, 0.833485050693268170, 0.833457422551038610, 0.833429792325165340, 0.833402160015717760, -0.833374525622764590, 0.833346889146375220, 0.833319250586618150, 0.833291609943563440, 0.833263967217279690, 0.833236322407835960, 0.833208675515301530, 0.833181026539745350, -0.833153375481236580, 0.833125722339844500, 0.833098067115637500, 0.833070409808685850, 0.833042750419058180, 0.833015088946823630, 0.832987425392051390, 0.832959759754810510, -0.832932092035170270, 0.832904422233199380, 0.832876750348967800, 0.832849076382544460, 0.832821400333998430, 0.832793722203398760, 0.832766041990814940, 0.832738359696315930, -0.832710675319971010, 0.832682988861848990, 0.832655300322019950, 0.832627609700552610, 0.832599916997516340, 0.832572222212980220, 0.832544525347013510, 0.832516826399685490, -0.832489125371065010, 0.832461422261222110, 0.832433717070225730, 0.832406009798145050, 0.832378300445049350, 0.832350589011007780, 0.832322875496089850, 0.832295159900364730, -0.832267442223901140, 0.832239722466769580, 0.832212000629038550, 0.832184276710777660, 0.832156550712055960, 0.832128822632942970, 0.832101092473507940, 0.832073360233820060, -0.832045625913948370, 0.832017889513963160, 0.831990151033933150, 0.831962410473927720, 0.831934667834016370, 0.831906923114268280, 0.831879176314752940, 0.831851427435539080, -0.831823676476697190, 0.831795923438296110, 0.831768168320405230, 0.831740411123093940, 0.831712651846431620, 0.831684890490487660, 0.831657127055331460, 0.831629361541031950, -0.831601593947659530, 0.831573824275283150, 0.831546052523972290, 0.831518278693796130, 0.831490502784824390, 0.831462724797126350, 0.831434944730770950, 0.831407162585828810, -0.831379378362368640, 0.831351592060460170, 0.831323803680172560, 0.831296013221575540, 0.831268220684738490, 0.831240426069730810, 0.831212629376621660, 0.831184830605481430, -0.831157029756379060, 0.831129226829384060, 0.831101421824566140, 0.831073614741994590, 0.831045805581739020, 0.831017994343868920, 0.830990181028453350, 0.830962365635562810, -0.830934548165266350, 0.830906728617633590, 0.830878906992733920, 0.830851083290637060, 0.830823257511412390, 0.830795429655129200, 0.830767599721857870, 0.830739767711667580, -0.830711933624627810, 0.830684097460808180, 0.830656259220278410, 0.830628418903107900, 0.830600576509366470, 0.830572732039122960, 0.830544885492448200, 0.830517036869411250, -0.830489186170081610, 0.830461333394529100, 0.830433478542823120, 0.830405621615033620, 0.830377762611229970, 0.830349901531481470, 0.830322038375858610, 0.830294173144430770, -0.830266305837267460, 0.830238436454438290, 0.830210564996013090, 0.830182691462061580, 0.830154815852652720, 0.830126938167857430, 0.830099058407744670, 0.830071176572384380, -0.830043292661846070, 0.830015406676199550, 0.829987518615514450, 0.829959628479860710, 0.829931736269307270, 0.829903841983924970, 0.829875945623783200, 0.829848047188951440, -0.829820146679499660, 0.829792244095497460, 0.829764339437014660, 0.829736432704120450, 0.829708523896885760, 0.829680613015379650, 0.829652700059672070, 0.829624785029832830, -0.829596867925931460, 0.829568948748037990, 0.829541027496222160, 0.829513104170553350, 0.829485178771102170, 0.829457251297938010, 0.829429321751130820, 0.829401390130750320, -0.829373456436866330, 0.829345520669548590, 0.829317582828867140, 0.829289642914891270, 0.829261700927691800, 0.829233756867338020, 0.829205810733899870, 0.829177862527447180, -0.829149912248049790, 0.829121959895777750, 0.829094005470700220, 0.829066048972888160, 0.829038090402410940, 0.829010129759338630, 0.828982167043740840, 0.828954202255687720, -0.828926235395249120, 0.828898266462494980, 0.828870295457494580, 0.828842322380318960, 0.828814347231037530, 0.828786370009720220, 0.828758390716436980, 0.828730409351257750, -0.828702425914252580, 0.828674440405491320, 0.828646452825043460, 0.828618463172979940, 0.828590471449370260, 0.828562477654284370, 0.828534481787792320, 0.828506483849964060, -0.828478483840869640, 0.828450481760578450, 0.828422477609161540, 0.828394471386688540, 0.828366463093229250, 0.828338452728853870, 0.828310440293632320, 0.828282425787634780, -0.828254409210931080, 0.828226390563590820, 0.828198369845685180, 0.828170347057283540, 0.828142322198456070, 0.828114295269272720, 0.828086266269803750, 0.828058235200119010, -0.828030202060288210, 0.828002166850382420, 0.827974129570471230, 0.827946090220624710, 0.827918048800913020, 0.827890005311406110, 0.827861959752174250, 0.827833912123287500, -0.827805862424815350, 0.827777810656829200, 0.827749756819398440, 0.827721700912593230, 0.827693642936483950, 0.827665582891140450, 0.827637520776632880, 0.827609456593031640, -0.827581390340406340, 0.827553322018827920, 0.827525251628366210, 0.827497179169091490, 0.827469104641073700, 0.827441028044383240, 0.827412949379090160, 0.827384868645264170, -0.827356785842976560, 0.827328700972296940, 0.827300614033295580, 0.827272525026042760, 0.827244433950608540, 0.827216340807063300, 0.827188245595477100, 0.827160148315919890, -0.827132048968462820, 0.827103947553175510, 0.827075844070128460, 0.827047738519391730, 0.827019630901035700, 0.826991521215130530, 0.826963409461746620, 0.826935295640953690, -0.826907179752823020, 0.826879061797424320, 0.826850941774827990, 0.826822819685104400, 0.826794695528323630, 0.826766569304556280, 0.826738441013871840, 0.826710310656341930, -0.826682178232036160, 0.826654043741025020, 0.826625907183378690, 0.826597768559167670, 0.826569627868462110, 0.826541485111332630, 0.826513340287848840, 0.826485193398082240, -0.826457044442102660, 0.826428893419980380, 0.826400740331786010, 0.826372585177589710, 0.826344427957461880, 0.826316268671472560, 0.826288107319693040, 0.826259943902193370, -0.826231778419043720, 0.826203610870314690, 0.826175441256076560, 0.826147269576399830, 0.826119095831355010, 0.826090920021011810, 0.826062742145441950, 0.826034562204715160, -0.826006380198902050, 0.825978196128072880, 0.825950009992298280, 0.825921821791648640, 0.825893631526194440, 0.825865439196005640, 0.825837244801153840, 0.825809048341708870, -0.825780849817741250, 0.825752649229321570, 0.825724446576520220, 0.825696241859407710, 0.825668035078054200, 0.825639826232530960, 0.825611615322908280, 0.825583402349256530, -0.825555187311646230, 0.825526970210148090, 0.825498751044832390, 0.825470529815769850, 0.825442306523030520, 0.825414081166685910, 0.825385853746806060, 0.825357624263461600, -0.825329392716723120, 0.825301159106661130, 0.825272923433346240, 0.825244685696848950, 0.825216445897239640, 0.825188204034589590, 0.825159960108968970, 0.825131714120448610, -0.825103466069098790, 0.825075215954990450, 0.825046963778193980, 0.825018709538779650, 0.824990453236819080, 0.824962194872382320, 0.824933934445540080, 0.824905671956363000, -0.824877407404921770, 0.824849140791287020, 0.824820872115529350, 0.824792601377719150, 0.824764328577927810, 0.824736053716225710, 0.824707776792683370, 0.824679497807371710, -0.824651216760361240, 0.824622933651722790, 0.824594648481526530, 0.824566361249844060, 0.824538071956745780, 0.824509780602302180, 0.824481487186584210, 0.824453191709662580, -0.824424894171607910, 0.824396594572490930, 0.824368292912382120, 0.824339989191352980, 0.824311683409473920, 0.824283375566815520, 0.824255065663448860, 0.824226753699444430, -0.824198439674873160, 0.824170123589805790, 0.824141805444312590, 0.824113485238465390, 0.824085162972334470, 0.824056838645990660, 0.824028512259504690, 0.824000183812947480, -0.823971853306389890, 0.823943520739902070, 0.823915186113555960, 0.823886849427421850, 0.823858510681570680, 0.823830169876073270, 0.823801827011000350, 0.823773482086422870, -0.823745135102411760, 0.823716786059037310, 0.823688434956371340, 0.823660081794484240, 0.823631726573446970, 0.823603369293330450, 0.823575009954205410, 0.823546648556142900, -0.823518285099213760, 0.823489919583488490, 0.823461552009038810, 0.823433182375935320, 0.823404810684248870, 0.823376436934050270, 0.823348061125410700, 0.823319683258400990, -0.823291303333091530, 0.823262921349554260, 0.823234537307859780, 0.823206151208078940, 0.823177763050282670, 0.823149372834542040, 0.823120980560927970, 0.823092586229511420, -0.823064189840363000, 0.823035791393554430, 0.823007390889156530, 0.822978988327240150, 0.822950583707876220, 0.822922177031135900, 0.822893768297090040, 0.822865357505809360, -0.822836944657365790, 0.822808529751829720, 0.822780112789272540, 0.822751693769764870, 0.822723272693378080, 0.822694849560183130, 0.822666424370250950, 0.822637997123652260, -0.822609567820459130, 0.822581136460742050, 0.822552703044572180, 0.822524267572020460, 0.822495830043158070, 0.822467390458056170, 0.822438948816785810, 0.822410505119417490, -0.822382059366023490, 0.822353611556674300, 0.822325161691441100, 0.822296709770394930, 0.822268255793607070, 0.822239799761148580, 0.822211341673090070, 0.822182881529503580, -0.822154419330460070, 0.822125955076030370, 0.822097488766285970, 0.822069020401297700, 0.822040549981136850, 0.822012077505874680, 0.821983602975581820, 0.821955126390330530, -0.821926647750191310, 0.821898167055235440, 0.821869684305534310, 0.821841199501158860, 0.821812712642180370, 0.821784223728669660, 0.821755732760698910, 0.821727239738338830, -0.821698744661660600, 0.821670247530735590, 0.821641748345634860, 0.821613247106429910, 0.821584743813191690, 0.821556238465991130, 0.821527731064900510, 0.821499221609990560, -0.821470710101332550, 0.821442196538997860, 0.821413680923057550, 0.821385163253583130, 0.821356643530645750, 0.821328121754316240, 0.821299597924666890, 0.821271072041768630, -0.821242544105692640, 0.821214014116510400, 0.821185482074292980, 0.821156947979111980, 0.821128411831038020, 0.821099873630143580, 0.821071333376499400, 0.821042791070176970, -0.821014246711247450, 0.820985700299782460, 0.820957151835853050, 0.820928601319530940, 0.820900048750886620, 0.820871494129992830, 0.820842937456920270, 0.820814378731740350, -0.820785817954524540, 0.820757255125344140, 0.820728690244270640, 0.820700123311375320, 0.820671554326729340, 0.820642983290404860, 0.820614410202472940, 0.820585835063004980, -0.820557257872072450, 0.820528678629746770, 0.820500097336099410, 0.820471513991201330, 0.820442928595124910, 0.820414341147941210, 0.820385751649721720, 0.820357160100537720, -0.820328566500460930, 0.820299970849562630, 0.820271373147914430, 0.820242773395587380, 0.820214171592653860, 0.820185567739184830, 0.820156961835252000, 0.820128353880926640, -0.820099743876280480, 0.820071131821384910, 0.820042517716311090, 0.820013901561131410, 0.819985283355916920, 0.819956663100739340, 0.819928040795670050, 0.819899416440780680, -0.819870790036142720, 0.819842161581827880, 0.819813531077907000, 0.819784898524452910, 0.819756263921536550, 0.819727627269229430, 0.819698988567603370, 0.819670347816729760, -0.819641705016680320, 0.819613060167526660, 0.819584413269339840, 0.819555764322192350, 0.819527113326155580, 0.819498460281301020, 0.819469805187700300, 0.819441148045425010, -0.819412488854546870, 0.819383827615137060, 0.819355164327268180, 0.819326498991011400, 0.819297831606438320, 0.819269162173620670, 0.819240490692630050, 0.819211817163538300, -0.819183141586417030, 0.819154463961337290, 0.819125784288372020, 0.819097102567592160, 0.819068418799069660, 0.819039732982876020, 0.819011045119083180, 0.818982355207762640, -0.818953663248986220, 0.818924969242825100, 0.818896273189352100, 0.818867575088638390, 0.818838874940755800, 0.818810172745775940, 0.818781468503770760, 0.818752762214811860, -0.818724053878970510, 0.818695343496319560, 0.818666631066930270, 0.818637916590874370, 0.818609200068223690, 0.818580481499050050, 0.818551760883425070, 0.818523038221420810, -0.818494313513108420, 0.818465586758560740, 0.818436857957849150, 0.818408127111045380, 0.818379394218221260, 0.818350659279448720, 0.818321922294799500, 0.818293183264344970, -0.818264442188157970, 0.818235699066309890, 0.818206953898872550, 0.818178206685917790, 0.818149457427517550, 0.818120706123743660, 0.818091952774668060, 0.818063197380362040, -0.818034439940898530, 0.818005680456348920, 0.817976918926785030, 0.817948155352278940, 0.817919389732902460, 0.817890622068727420, 0.817861852359825890, 0.817833080606269250, -0.817804306808130320, 0.817775530965480720, 0.817746753078392290, 0.817717973146936950, 0.817689191171186660, 0.817660407151213350, 0.817631621087088640, 0.817602832978885250, -0.817574042826674900, 0.817545250630529410, 0.817516456390520730, 0.817487660106720910, 0.817458861779202020, 0.817430061408035980, 0.817401258993294190, 0.817372454535049810, -0.817343648033374340, 0.817314839488339720, 0.817286028900017890, 0.817257216268481130, 0.817228401593801280, 0.817199584876050490, 0.817170766115300150, 0.817141945311623430, -0.817113122465091820, 0.817084297575777390, 0.817055470643752280, 0.817026641669088450, 0.816997810651858060, 0.816968977592132610, 0.816940142489985140, 0.816911305345487390, -0.816882466158711410, 0.816853624929729240, 0.816824781658613050, 0.816795936345434790, 0.816767088990266840, 0.816738239593180590, 0.816709388154249210, 0.816680534673544400, -0.816651679151138230, 0.816622821587102870, 0.816593961981510460, 0.816565100334433190, 0.816536236645942550, 0.816507370916111920, 0.816478503145012800, 0.816449633332717470, -0.816420761479298100, 0.816391887584826730, 0.816363011649375750, 0.816334133673017100, 0.816305253655822740, 0.816276371597865700, 0.816247487499217720, 0.816218601359951060, -0.816189713180137890, 0.816160822959850370, 0.816131930699160900, 0.816103036398141520, 0.816074140056864070, 0.816045241675401710, 0.816016341253826380, 0.815987438792210140, -0.815958534290625260, 0.815929627749144130, 0.815900719167838790, 0.815871808546781320, 0.815842895886044750, 0.815813981185700920, 0.815785064445822110, 0.815756145666480690, -0.815727224847748960, 0.815698301989699060, 0.815669377092403500, 0.815640450155933890, 0.815611521180363730, 0.815582590165764730, 0.815553657112209280, 0.815524722019769670, -0.815495784888518370, 0.815466845718527460, 0.815437904509869530, 0.815408961262616310, 0.815380015976841070, 0.815351068652615970, 0.815322119290013080, 0.815293167889105000, -0.815264214449963890, 0.815235258972662360, 0.815206301457272020, 0.815177341903866590, 0.815148380312517680, 0.815119416683297900, 0.815090451016279530, 0.815061483311535050, -0.815032513569136860, 0.815003541789157460, 0.814974567971668560, 0.814945592116743890, 0.814916614224455160, 0.814887634294874870, 0.814858652328075530, 0.814829668324129620, -0.814800682283109530, 0.814771694205087100, 0.814742704090136050, 0.814713711938328200, 0.814684717749736160, 0.814655721524432220, 0.814626723262488970, 0.814597722963978920, -0.814568720628974670, 0.814539716257547950, 0.814510709849772590, 0.814481701405720400, 0.814452690925463910, 0.814423678409075810, 0.814394663856628400, 0.814365647268194380, -0.814336628643846260, 0.814307607983655980, 0.814278585287697250, 0.814249560556042030, 0.814220533788762910, 0.814191504985932510, 0.814162474147623330, 0.814133441273907970, -0.814104406364858480, 0.814075369420548480, 0.814046330441050010, 0.814017289426435810, 0.813988246376778360, 0.813959201292150160, 0.813930154172624150, 0.813901105018272620, -0.813872053829167940, 0.813843000605383500, 0.813813945346991700, 0.813784888054064900, 0.813755828726675960, 0.813726767364897460, 0.813697703968802030, 0.813668638538461720, -0.813639571073950460, 0.813610501575340320, 0.813581430042703780, 0.813552356476113680, 0.813523280875642740, 0.813494203241363680, 0.813465123573348990, 0.813436041871670960, -0.813406958136403400, 0.813377872367618490, 0.813348784565388840, 0.813319694729787270, 0.813290602860886390, 0.813261508958759040, 0.813232413023477930, 0.813203315055115230, -0.813174215053744760, 0.813145113019438810, 0.813116008952270100, 0.813086902852311330, 0.813057794719635240, 0.813028684554314760, 0.812999572356421950, 0.812970458126030860, -0.812941341863213540, 0.812912223568042820, 0.812883103240591650, 0.812853980880932640, 0.812824856489138710, 0.812795730065282610, 0.812766601609436700, 0.812737471121674830, -0.812708338602069260, 0.812679204050692830, 0.812650067467618360, 0.812620928852918810, 0.812591788206666890, 0.812562645528935420, 0.812533500819796920, 0.812504354079325200, -0.812475205307592540, 0.812446054504671890, 0.812416901670636070, 0.812387746805558030, 0.812358589909510600, 0.812329430982566160, 0.812300270024798770, 0.812271107036280580, -0.812241942017084770, 0.812212774967283950, 0.812183605886951270, 0.812154434776159560, 0.812125261634981780, 0.812096086463490300, 0.812066909261759060, 0.812037730029860680, -0.812008548767867880, 0.811979365475853810, 0.811950180153891200, 0.811920992802053210, 0.811891803420412230, 0.811862612009042190, 0.811833418568015720, 0.811804223097405630, -0.811775025597284980, 0.811745826067726830, 0.811716624508804110, 0.811687420920589760, 0.811658215303156410, 0.811629007656577970, 0.811599797980927070, 0.811570586276276650, -0.811541372542699760, 0.811512156780269440, 0.811482938989058770, 0.811453719169140770, 0.811424497320587860, 0.811395273443474290, 0.811366047537872560, 0.811336819603855620, -0.811307589641496630, 0.811278357650868750, 0.811249123632044930, 0.811219887585097780, 0.811190649510101450, 0.811161409407128550, 0.811132167276252040, 0.811102923117545170, -0.811073676931080900, 0.811044428716932500, 0.811015178475173130, 0.810985926205875170, 0.810956671909112910, 0.810927415584958950, 0.810898157233486570, 0.810868896854768710, -0.810839634448878630, 0.810810370015889510, 0.810781103555874410, 0.810751835068906020, 0.810722564555058530, 0.810693292014404760, 0.810664017447017660, 0.810634740852970490, -0.810605462232336540, 0.810576181585188960, 0.810546898911600370, 0.810517614211644920, 0.810488327485395570, 0.810459038732925460, 0.810429747954307670, 0.810400455149615560, -0.810371160318922200, 0.810341863462300970, 0.810312564579824700, 0.810283263671567440, 0.810253960737602030, 0.810224655778001730, 0.810195348792839720, 0.810166039782189370, -0.810136728746123970, 0.810107415684716230, 0.810078100598040420, 0.810048783486169380, 0.810019464349176380, 0.809990143187134690, 0.809960820000117710, 0.809931494788198700, -0.809902167551450840, 0.809872838289947160, 0.809843507003761840, 0.809814173692967710, 0.809784838357638260, 0.809755500997846660, 0.809726161613666280, 0.809696820205170530, -0.809667476772432670, 0.809638131315525640, 0.809608783834523840, 0.809579434329499970, 0.809550082800527650, 0.809520729247680040, 0.809491373671030630, 0.809462016070652820, -0.809432656446619440, 0.809403294799004860, 0.809373931127882140, 0.809344565433324560, 0.809315197715405500, 0.809285827974198570, 0.809256456209776930, 0.809227082422214310, -0.809197706611583300, 0.809168328777958630, 0.809138948921413140, 0.809109567042020310, 0.809080183139853530, 0.809050797214986290, 0.809021409267492110, 0.808992019297444240, -0.808962627304915970, 0.808933233289981570, 0.808903837252714200, 0.808874439193187130, 0.808845039111473980, 0.808815637007648250, 0.808786232881783420, 0.808756826733952440, -0.808727418564229920, 0.808698008372688900, 0.808668596159402900, 0.808639181924445280, 0.808609765667889780, 0.808580347389809880, 0.808550927090279090, 0.808521504769370570, -0.808492080427158700, 0.808462654063716650, 0.808433225679117910, 0.808403795273436200, 0.808374362846744910, 0.808344928399117760, 0.808315491930627790, 0.808286053441349630, -0.808256612931356200, 0.808227170400721340, 0.808197725849518540, 0.808168279277821530, 0.808138830685703690, 0.808109380073238850, 0.808079927440499950, 0.808050472787561810, -0.808021016114497500, 0.807991557421380620, 0.807962096708284890, 0.807932633975283810, 0.807903169222451310, 0.807873702449860790, 0.807844233657585510, 0.807814762845700200, -0.807785290014277900, 0.807755815163392340, 0.807726338293117350, 0.807696859403526530, 0.807667378494693500, 0.807637895566691520, 0.807608410619595320, 0.807578923653478050, -0.807549434668413560, 0.807519943664475440, 0.807490450641737520, 0.807460955600273420, 0.807431458540156850, 0.807401959461461200, 0.807372458364261190, 0.807342955248629980, -0.807313450114641510, 0.807283942962369270, 0.807254433791887220, 0.807224922603269060, 0.807195409396588630, 0.807165894171919200, 0.807136376929335490, 0.807106857668910880, -0.807077336390719100, 0.807047813094833980, 0.807018287781329220, 0.806988760450278900, 0.806959231101756050, 0.806929699735835730, 0.806900166352591100, 0.806870630952096100, -0.806841093534424570, 0.806811554099650220, 0.806782012647846990, 0.806752469179088720, 0.806722923693448780, 0.806693376191002120, 0.806663826671821900, 0.806634275135982180, -0.806604721583556780, 0.806575166014619540, 0.806545608429244390, 0.806516048827504720, 0.806486487209475470, 0.806456923575229910, 0.806427357924842100, 0.806397790258385980, -0.806368220575935270, 0.806338648877564010, 0.806309075163346160, 0.806279499433355080, 0.806249921687665850, 0.806220341926351840, 0.806190760149486870, 0.806161176357145020, -0.806131590549400200, 0.806102002726326480, 0.806072412887997690, 0.806042821034487320, 0.806013227165870540, 0.805983631282220610, 0.805954033383611600, 0.805924433470117550, -0.805894831541812410, 0.805865227598770110, 0.805835621641064370, 0.805806013668769920, 0.805776403681960570, 0.805746791680710170, 0.805717177665092770, 0.805687561635182400, -0.805657943591053250, 0.805628323532779130, 0.805598701460433770, 0.805569077374092110, 0.805539451273827760, 0.805509823159714760, 0.805480193031827160, 0.805450560890239250, -0.805420926735024860, 0.805391290566257580, 0.805361652384012580, 0.805332012188363480, 0.805302369979384420, 0.805272725757149370, 0.805243079521732460, 0.805213431273207990, -0.805183781011649780, 0.805154128737131770, 0.805124474449728790, 0.805094818149514780, 0.805065159836563570, 0.805035499510949550, 0.805005837172746760, 0.804976172822029380, -0.804946506458871560, 0.804916838083347020, 0.804887167695530810, 0.804857495295496770, 0.804827820883318950, 0.804798144459071610, 0.804768466022828810, 0.804738785574664940, -0.804709103114653600, 0.804679418642869960, 0.804649732159387730, 0.804620043664281300, 0.804590353157624620, 0.804560660639492160, 0.804530966109958000, 0.804501269569096510, -0.804471571016981190, 0.804441870453687540, 0.804412167879289260, 0.804382463293860540, 0.804352756697475630, 0.804323048090208830, 0.804293337472134380, 0.804263624843326590, -0.804233910203859260, 0.804204193553807680, 0.804174474893245560, 0.804144754222247290, 0.804115031540887150, 0.804085306849239400, 0.804055580147378430, 0.804025851435377970, -0.803996120713313390, 0.803966387981258520, 0.803936653239287650, 0.803906916487475140, 0.803877177725895400, 0.803847436954622680, 0.803817694173731390, 0.803787949383295340, -0.803758202583389920, 0.803728453774088970, 0.803698702955466970, 0.803668950127598090, 0.803639195290556940, 0.803609438444417790, 0.803579679589254470, 0.803549918725142480, -0.803520155852155750, 0.803490390970368560, 0.803460624079855410, 0.803430855180690790, 0.803401084272948870, 0.803371311356704370, 0.803341536432031100, 0.803311759499004350, -0.803281980557698280, 0.803252199608187280, 0.803222416650545830, 0.803192631684848220, 0.803162844711169170, 0.803133055729582930, 0.803103264740163470, 0.803073471742986490, -0.803043676738125710, 0.803013879725655850, 0.802984080705651190, 0.802954279678186440, 0.802924476643335880, 0.802894671601173670, 0.802864864551775300, 0.802835055495214830, -0.802805244431566640, 0.802775431360905340, 0.802745616283305430, 0.802715799198841510, 0.802685980107588180, 0.802656159009619290, 0.802626335905010540, 0.802596510793835980, -0.802566683676170120, 0.802536854552087450, 0.802507023421662800, 0.802477190284970550, 0.802447355142085320, 0.802417517993081140, 0.802387678838033750, 0.802357837677017070, -0.802327994510105840, 0.802298149337374640, 0.802268302158898110, 0.802238452974750720, 0.802208601785006750, 0.802178748589741810, 0.802148893389029950, 0.802119036182945890, -0.802089176971564230, 0.802059315754959590, 0.802029452533206790, 0.801999587306380210, 0.801969720074554250, 0.801939850837804390, 0.801909979596205020, 0.801880106349830650, -0.801850231098755970, 0.801820353843055830, 0.801790474582804720, 0.801760593318076920, 0.801730710048948140, 0.801700824775492650, 0.801670937497785060, 0.801641048215900100, -0.801611156929912580, 0.801581263639897120, 0.801551368345928440, 0.801521471048080910, 0.801491571746430150, 0.801461670441050540, 0.801431767132016800, 0.801401861819403540, -0.801371954503285580, 0.801342045183737860, 0.801312133860835000, 0.801282220534651260, 0.801252305205262470, 0.801222387872742910, 0.801192468537167410, 0.801162547198610800, -0.801132623857147670, 0.801102698512853100, 0.801072771165801220, 0.801042841816068000, 0.801012910463727580, 0.800982977108855020, 0.800953041751524930, 0.800923104391812140, -0.800893165029791690, 0.800863223665538300, 0.800833280299126370, 0.800803334930631720, 0.800773387560128840, 0.800743438187692340, 0.800713486813397380, 0.800683533437318570, -0.800653578059530970, 0.800623620680109500, 0.800593661299128350, 0.800563699916663650, 0.800533736532789700, 0.800503771147581420, 0.800473803761113660, 0.800443834373461340, -0.800413862984699520, 0.800383889594902480, 0.800353914204146260, 0.800323936812505240, 0.800293957420054380, 0.800263976026868720, 0.800233992633022970, 0.800204007238592310, -0.800174019843651660, 0.800144030448275420, 0.800114039052539640, 0.800084045656518690, 0.800054050260287640, 0.800024052863921530, 0.799994053467495300, 0.799964052071083900, -0.799934048674761810, 0.799904043278605200, 0.799874035882688350, 0.799844026487086520, 0.799814015091874660, 0.799784001697127600, 0.799753986302920720, 0.799723968909328730, -0.799693949516426360, 0.799663928124289660, 0.799633904732993120, 0.799603879342611790, 0.799573851953220840, 0.799543822564895200, 0.799513791177710040, 0.799483757791740410, -0.799453722407060810, 0.799423685023747390, 0.799393645641874870, 0.799363604261518200, 0.799333560882752430, 0.799303515505652820, 0.799273468130294430, 0.799243418756751870, -0.799213367385101290, 0.799183314015417200, 0.799153258647774980, 0.799123201282249450, 0.799093141918916010, 0.799063080557849690, 0.799033017199125670, 0.799002951842818670, -0.798972884489004720, 0.798942815137758560, 0.798912743789155330, 0.798882670443270330, 0.798852595100178590, 0.798822517759955390, 0.798792438422675890, 0.798762357088414810, -0.798732273757248310, 0.798702188429251110, 0.798672101104498490, 0.798642011783065600, 0.798611920465027710, 0.798581827150460000, 0.798551731839437170, 0.798521634532035510, -0.798491535228329830, 0.798461433928395300, 0.798431330632307090, 0.798401225340140690, 0.798371118051971140, 0.798341008767873840, 0.798310897487923500, 0.798280784212196390, -0.798250668940767350, 0.798220551673711640, 0.798190432411104540, 0.798160311153021440, 0.798130187899537490, 0.798100062650727530, 0.798069935406667930, 0.798039806167433530, -0.798009674933099600, 0.797979541703741520, 0.797949406479434580, 0.797919269260254030, 0.797889130046275490, 0.797858988837573450, 0.797828845634224510, 0.797798700436303410, -0.797768553243885630, 0.797738404057046440, 0.797708252875861220, 0.797678099700405370, 0.797647944530754270, 0.797617787366982740, 0.797587628209167400, 0.797557467057382840, -0.797527303911704790, 0.797497138772208290, 0.797466971638969070, 0.797436802512062390, 0.797406631391563200, 0.797376458277547880, 0.797346283170091490, 0.797316106069269390, -0.797285926975156990, 0.797255745887829770, 0.797225562807363230, 0.797195377733832760, 0.797165190667313280, 0.797135001607881420, 0.797104810555612000, 0.797074617510580510, -0.797044422472862560, 0.797014225442533530, 0.796984026419668920, 0.796953825404343790, 0.796923622396634500, 0.796893417396616230, 0.796863210404364470, 0.796833001419954610, -0.796802790443462250, 0.796772577474963000, 0.796742362514532230, 0.796712145562245010, 0.796681926618177940, 0.796651705682406060, 0.796621482755004990, 0.796591257836050120, -0.796561030925617250, 0.796530802023781680, 0.796500571130619120, 0.796470338246204610, 0.796440103370614770, 0.796409866503924760, 0.796379627646209950, 0.796349386797546190, -0.796319143958008850, 0.796288899127673750, 0.796258652306615860, 0.796228403494911860, 0.796198152692636830, 0.796167899899866470, 0.796137645116676280, 0.796107388343141990, -0.796077129579339290, 0.796046868825343700, 0.796016606081230480, 0.795986341347076130, 0.795956074622956140, 0.795925805908945790, 0.795895535205121020, 0.795865262511557310, -0.795834987828330620, 0.795804711155516320, 0.795774432493189690, 0.795744151841427660, 0.795713869200305180, 0.795683584569897960, 0.795653297950281830, 0.795623009341532410, -0.795592718743725500, 0.795562426156936290, 0.795532131581241590, 0.795501835016716450, 0.795471536463436820, 0.795441235921478310, 0.795410933390916620, 0.795380628871827700, -0.795350322364287270, 0.795320013868370370, 0.795289703384154060, 0.795259390911713380, 0.795229076451124280, 0.795198760002462590, 0.795168441565803910, 0.795138121141224060, -0.795107798728798440, 0.795077474328603870, 0.795047147940715630, 0.795016819565209420, 0.794986489202161310, 0.794956156851646890, 0.794925822513742110, 0.794895486188522790, -0.794865147876064100, 0.794834807576443200, 0.794804465289735250, 0.794774121016016080, 0.794743774755361730, 0.794713426507847820, 0.794683076273550390, 0.794652724052545280, -0.794622369844907860, 0.794592013650714970, 0.794561655470042090, 0.794531295302965070, 0.794500933149559830, 0.794470569009902320, 0.794440202884068250, 0.794409834772133230, -0.794379464674174090, 0.794349092590266310, 0.794318718520485860, 0.794288342464908540, 0.794257964423610410, 0.794227584396667300, 0.794197202384155250, 0.794166818386149780, -0.794136432402727690, 0.794106044433964490, 0.794075654479936220, 0.794045262540718830, 0.794014868616388260, 0.793984472707020550, 0.793954074812691650, 0.793923674933477040, -0.793893273069453790, 0.793862869220697260, 0.793832463387283640, 0.793802055569288840, 0.793771645766788940, 0.793741233979859960, 0.793710820208577190, 0.793680404453018020, -0.793649986713257930, 0.793619566989372750, 0.793589145281438650, 0.793558721589531670, 0.793528295913727980, 0.793497868254103510, 0.793467438610733770, 0.793437006983696010, -0.793406573373065750, 0.793376137778919130, 0.793345700201332100, 0.793315260640380830, 0.793284819096141350, 0.793254375568689270, 0.793223930058101880, 0.793193482564454650, -0.793163033087823650, 0.793132581628285150, 0.793102128185915080, 0.793071672760789830, 0.793041215352985330, 0.793010755962577200, 0.792980294589642810, 0.792949831234257660, -0.792919365896497920, 0.792888898576439740, 0.792858429274159390, 0.792827957989732930, 0.792797484723236520, 0.792767009474745880, 0.792736532244338270, 0.792706053032089410, -0.792675571838075350, 0.792645088662372380, 0.792614603505056640, 0.792584116366204410, 0.792553627245891400, 0.792523136144194780, 0.792492643061190380, 0.792462147996954360, -0.792431650951562980, 0.792401151925092420, 0.792370650917619050, 0.792340147929219030, 0.792309642959968090, 0.792279136009943600, 0.792248627079221170, 0.792218116167877300, -0.792187603275988140, 0.792157088403629860, 0.792126571550878960, 0.792096052717811580, 0.792065531904503570, 0.792035009111032310, 0.792004484337473390, 0.791973957583903320, -0.791943428850398480, 0.791912898137034920, 0.791882365443889120, 0.791851830771036940, 0.791821294118555730, 0.791790755486521220, 0.791760214875009800, 0.791729672284097850, -0.791699127713861860, 0.791668581164377880, 0.791638032635722520, 0.791607482127971610, 0.791576929641202410, 0.791546375175490980, 0.791515818730913480, 0.791485260307546510, -0.791454699905466460, 0.791424137524749600, 0.791393573165471880, 0.791363006827710660, 0.791332438511542110, 0.791301868217042290, 0.791271295944287910, 0.791240721693355240, -0.791210145464320780, 0.791179567257261020, 0.791148987072251670, 0.791118404909370470, 0.791087820768693330, 0.791057234650296540, 0.791026646554256700, 0.790996056480650190, -0.790965464429553620, 0.790934870401043270, 0.790904274395195280, 0.790873676412087170, 0.790843076451794860, 0.790812474514394850, 0.790781870599963630, 0.790751264708577710, -0.790720656840313670, 0.790690046995247480, 0.790659435173456710, 0.790628821375017330, 0.790598205600005820, 0.790567587848498900, 0.790536968120572950, 0.790506346416304680, -0.790475722735770380, 0.790445097079046420, 0.790414469446210080, 0.790383839837337730, 0.790353208252505660, 0.790322574691790570, 0.790291939155269190, 0.790261301643017780, -0.790230662155113170, 0.790200020691631420, 0.790169377252650130, 0.790138731838245460, 0.790108084448493790, 0.790077435083472060, 0.790046783743256650, 0.790016130427924400, -0.789985475137551240, 0.789954817872214890, 0.789924158631991500, 0.789893497416957690, 0.789862834227190170, 0.789832169062765540, 0.789801501923760530, 0.789770832810251730, -0.789740161722315430, 0.789709488660029100, 0.789678813623469140, 0.789648136612712160, 0.789617457627834750, 0.789586776668913750, 0.789556093736025750, 0.789525408829247040, -0.789494721948655330, 0.789464033094326890, 0.789433342266338320, 0.789402649464766350, 0.789371954689687790, 0.789341257941179380, 0.789310559219317700, 0.789279858524179150, -0.789249155855841540, 0.789218451214381060, 0.789187744599874400, 0.789157036012398390, 0.789126325452029760, 0.789095612918845330, 0.789064898412921820, 0.789034181934335610, -0.789003463483164410, 0.788972743059484620, 0.788942020663372930, 0.788911296294906310, 0.788880569954161340, 0.788849841641214860, 0.788819111356143350, 0.788788379099024660, -0.788757644869934940, 0.788726908668951120, 0.788696170496149930, 0.788665430351608520, 0.788634688235403390, 0.788603944147611590, 0.788573198088309280, 0.788542450057574620, -0.788511700055483880, 0.788480948082113780, 0.788450194137541360, 0.788419438221843460, 0.788388680335097010, 0.788357920477378740, 0.788327158648765240, 0.788296394849334340, -0.788265629079162420, 0.788234861338326540, 0.788204091626903410, 0.788173319944970090, 0.788142546292603500, 0.788111770669879920, 0.788080993076877510, 0.788050213513672550, -0.788019431980342080, 0.787988648476963040, 0.787957863003612480, 0.787927075560367120, 0.787896286147304230, 0.787865494764499960, 0.787834701412032490, 0.787803906089978300, -0.787773108798414330, 0.787742309537417640, 0.787711508307065040, 0.787680705107433820, 0.787649899938600240, 0.787619092800642460, 0.787588283693636980, 0.787557472617660740, -0.787526659572790780, 0.787495844559104260, 0.787465027576678130, 0.787434208625589330, 0.787403387705914560, 0.787372564817731880, 0.787341739961117670, 0.787310913136149200, -0.787280084342903420, 0.787249253581457480, 0.787218420851888310, 0.787187586154273200, 0.787156749488688520, 0.787125910855212440, 0.787095070253921670, 0.787064227684893260, -0.787033383148204260, 0.787002536643931830, 0.786971688172152910, 0.786940837732944320, 0.786909985326384230, 0.786879130952549130, 0.786848274611516190, 0.786817416303362550, -0.786786556028165500, 0.786755693786001850, 0.786724829576949110, 0.786693963401083770, 0.786663095258483990, 0.786632225149226480, 0.786601353073388410, 0.786570479031047040, -0.786539603022279320, 0.786508725047162740, 0.786477845105773680, 0.786446963198190630, 0.786416079324490200, 0.786385193484749450, 0.786354305679045850, 0.786323415907456360, -0.786292524170058460, 0.786261630466929210, 0.786230734798145310, 0.786199837163785050, 0.786168937563925360, 0.786138035998643180, 0.786107132468016000, 0.786076226972120980, -0.786045319511035400, 0.786014410084836410, 0.785983498693600960, 0.785952585337407310, 0.785921670016332170, 0.785890752730452840, 0.785859833479846670, 0.785828912264590950, -0.785797989084762840, 0.785767063940439270, 0.785736136831698520, 0.785705207758617520, 0.785674276721273430, 0.785643343719743760, 0.785612408754105650, 0.785581471824436490, -0.785550532930813670, 0.785519592073314010, 0.785488649252015890, 0.785457704466996140, 0.785426757718332260, 0.785395809006101290, 0.785364858330380830, 0.785333905691248390, -0.785302951088781010, 0.785271994523055740, 0.785241035994151070, 0.785210075502143830, 0.785179113047111300, 0.785148148629131070, 0.785117182248280530, 0.785086213904636950, -0.785055243598277270, 0.785024271329279990, 0.784993297097722140, 0.784962320903681010, 0.784931342747234080, 0.784900362628458750, 0.784869380547432600, 0.784838396504232930, -0.784807410498936760, 0.784776422531622610, 0.784745432602367400, 0.784714440711248520, 0.784683446858343680, 0.784652451043730160, 0.784621453267485450, 0.784590453529686700, -0.784559451830412200, 0.784528448169739210, 0.784497442547745010, 0.784466434964507300, 0.784435425420103360, 0.784404413914611020, 0.784373400448107550, 0.784342385020670000, -0.784311367632377080, 0.784280348283305730, 0.784249326973533560, 0.784218303703138050, 0.784187278472196710, 0.784156251280787250, 0.784125222128987160, 0.784094191016873500, -0.784063157944524860, 0.784032122912018290, 0.784001085919431520, 0.783970046966841920, 0.783939006054327200, 0.783907963181965100, 0.783876918349832420, 0.783845871558008000, -0.783814822806569000, 0.783783772095592800, 0.783752719425157230, 0.783721664795339890, 0.783690608206218390, 0.783659549657870440, 0.783628489150372980, 0.783597426683804830, -0.783566362258243050, 0.783535295873765470, 0.783504227530449680, 0.783473157228373300, 0.783442084967613920, 0.783411010748249480, 0.783379934570356820, 0.783348856434014970, -0.783317776339301000, 0.783286694286292500, 0.783255610275067290, 0.783224524305703110, 0.783193436378277540, 0.783162346492867870, 0.783131254649552910, 0.783100160848409830, -0.783069065089516240, 0.783037967372950060, 0.783006867698789020, 0.782975766067110720, 0.782944662477992990, 0.782913556931513100, 0.782882449427749870, 0.782851339966780580, -0.782820228548682830, 0.782789115173534560, 0.782757999841413480, 0.782726882552397420, 0.782695763306563650, 0.782664642103991000, 0.782633518944756630, 0.782602393828938590, -0.782571266756614480, 0.782540137727862350, 0.782509006742759690, 0.782477873801384670, 0.782446738903814330, 0.782415602050127720, 0.782384463240402010, 0.782353322474715230, -0.782322179753145220, 0.782291035075769690, 0.782259888442666470, 0.782228739853913610, 0.782197589309588380, 0.782166436809769720, 0.782135282354535000, 0.782104125943962060, -0.782072967578128720, 0.782041807257113030, 0.782010644980992820, 0.781979480749845470, 0.781948314563749910, 0.781917146422783650, 0.781885976327024390, 0.781854804276550300, -0.781823630271439200, 0.781792454311769030, 0.781761276397617610, 0.781730096529062560, 0.781698914706182800, 0.781667730929055730, 0.781636545197759270, 0.781605357512371590, -0.781574167872970400, 0.781542976279633870, 0.781511782732439820, 0.781480587231465850, 0.781449389776790900, 0.781418190368492470, 0.781386989006648710, 0.781355785691337350, -0.781324580422636530, 0.781293373200624200, 0.781262164025377960, 0.781230952896976860, 0.781199739815498400, 0.781168524781020500, 0.781137307793621450, 0.781106088853378950, -0.781074867960371400, 0.781043645114676500, 0.781012420316372080, 0.780981193565537080, 0.780949964862249100, 0.780918734206586310, 0.780887501598626520, 0.780856267038448130, -0.780825030526128950, 0.780793792061746710, 0.780762551645380550, 0.780731309277107990, 0.780700064957007170, 0.780668818685156250, 0.780637570461633180, 0.780606320286516220, -0.780575068159883420, 0.780543814081812390, 0.780512558052382510, 0.780481300071671160, 0.780450040139756500, 0.780418778256716790, 0.780387514422630100, 0.780356248637574690, -0.780324980901628610, 0.780293711214869570, 0.780262439577376730, 0.780231165989227820, 0.780199890450501090, 0.780168612961274490, 0.780137333521626400, 0.780106052131635090, -0.780074768791377940, 0.780043483500934550, 0.780012196260382320, 0.779980907069799720, 0.779949615929264820, 0.779918322838855870, 0.779887027798651040, 0.779855730808728720, -0.779824431869166500, 0.779793130980043770, 0.779761828141438240, 0.779730523353428070, 0.779699216616091650, 0.779667907929507240, 0.779636597293752900, 0.779605284708907220, -0.779573970175047700, 0.779542653692253840, 0.779511335260603230, 0.779480014880174380, 0.779448692551045540, 0.779417368273294890, 0.779386042047000900, 0.779354713872241200, -0.779323383749095270, 0.779292051677640820, 0.779260717657956350, 0.779229381690120020, 0.779198043774210310, 0.779166703910305400, 0.779135362098483770, 0.779104018338823150, -0.779072672631403120, 0.779041324976301300, 0.779009975373596290, 0.778978623823366250, 0.778947270325689670, 0.778915914880644930, 0.778884557488309760, 0.778853198148763860, -0.778821836862084950, 0.778790473628351410, 0.778759108447641730, 0.778727741320034310, 0.778696372245607390, 0.778665001224439710, 0.778633628256608870, 0.778602253342194570, -0.778570876481274540, 0.778539497673927490, 0.778508116920231590, 0.778476734220265420, 0.778445349574107380, 0.778413962981835960, 0.778382574443529100, 0.778351183959266390, -0.778319791529125670, 0.778288397153185430, 0.778257000831524270, 0.778225602564220690, 0.778194202351352950, 0.778162800192999220, 0.778131396089239090, 0.778099990040150400, -0.778068582045811750, 0.778037172106301630, 0.778005760221698540, 0.777974346392081180, 0.777942930617527840, 0.777911512898116660, 0.777880093233927260, 0.777848671625037680, -0.777817248071526300, 0.777785822573471840, 0.777754395130952900, 0.777722965744047980, 0.777691534412835010, 0.777660101137393700, 0.777628665917802220, 0.777597228754139060, -0.777565789646482930, 0.777534348594912220, 0.777502905599505630, 0.777471460660341900, 0.777440013777498830, 0.777408564951056260, 0.777377114181092340, 0.777345661467685690, -0.777314206810914790, 0.777282750210858460, 0.777251291667595210, 0.777219831181203750, 0.777188368751762120, 0.777156904379350140, 0.777125438064045880, 0.777093969805928040, -0.777062499605075230, 0.777031027461566270, 0.776999553375479660, 0.776968077346893660, 0.776936599375887990, 0.776905119462540820, 0.776873637606930960, 0.776842153809136900, -0.776810668069237490, 0.776779180387311310, 0.776747690763437300, 0.776716199197693520, 0.776684705690159680, 0.776653210240914160, 0.776621712850035560, 0.776590213517602820, -0.776558712243694440, 0.776527209028389230, 0.776495703871766030, 0.776464196773903100, 0.776432687734880170, 0.776401176754775490, 0.776369663833667900, 0.776338148971636110, -0.776306632168759060, 0.776275113425115350, 0.776243592740783250, 0.776212070115842810, 0.776180545550372190, 0.776149019044450220, 0.776117490598155600, 0.776085960211567390, -0.776054427884764200, 0.776022893617824950, 0.775991357410827920, 0.775959819263853050, 0.775928279176978600, 0.775896737150283510, 0.775865193183846500, 0.775833647277746620, -0.775802099432062580, 0.775770549646872640, 0.775738997922256980, 0.775707444258293850, 0.775675888655061980, 0.775644331112640530, 0.775612771631108200, 0.775581210210543940, -0.775549646851026670, 0.775518081552634690, 0.775486514315448020, 0.775454945139545160, 0.775423374025004940, 0.775391800971906190, 0.775360225980328050, 0.775328649050349260, -0.775297070182048850, 0.775265489375505210, 0.775233906630798500, 0.775202321948006980, 0.775170735327209590, 0.775139146768485390, 0.775107556271913300, 0.775075963837572380, -0.775044369465541010, 0.775012773155899230, 0.774981174908725530, 0.774949574724098870, 0.774917972602098270, 0.774886368542802790, 0.774854762546291380, 0.774823154612642950, -0.774791544741936230, 0.774759932934251160, 0.774728319189666230, 0.774696703508260480, 0.774665085890112960, 0.774633466335302830, 0.774601844843908930, 0.774570221416010510, -0.774538596051685960, 0.774506968751015430, 0.774475339514077430, 0.774443708340951220, 0.774412075231715620, 0.774380440186449910, 0.774348803205233030, 0.774317164288143680, -0.774285523435261910, 0.774253880646666340, 0.774222235922436110, 0.774190589262650270, 0.774158940667387880, 0.774127290136728210, 0.774095637670750290, 0.774063983269532740, -0.774032326933155820, 0.774000668661698030, 0.773969008455238640, 0.773937346313856580, 0.773905682237631340, 0.773874016226641760, 0.773842348280966650, 0.773810678400686180, -0.773779006585879060, 0.773747332836624450, 0.773715657153001390, 0.773683979535089270, 0.773652299982967250, 0.773620618496714370, 0.773588935076409470, 0.773557249722132690, -0.773525562433962870, 0.773493873211979150, 0.773462182056260720, 0.773430488966886820, 0.773398793943936740, 0.773367096987489620, 0.773335398097624300, 0.773303697274420940, -0.773271994517958360, 0.773240289828315830, 0.773208583205572510, 0.773176874649807780, 0.773145164161100910, 0.773113451739530500, 0.773081737385177050, 0.773050021098119270, -0.773018302878436430, 0.772986582726207790, 0.772954860641512750, 0.772923136624430570, 0.772891410675040410, 0.772859682793421320, 0.772827952979653570, 0.772796221233815860, -0.772764487555987590, 0.772732751946248130, 0.772701014404676870, 0.772669274931352960, 0.772637533526356000, 0.772605790189764500, 0.772574044921659150, 0.772542297722118690, -0.772510548591222480, 0.772478797529049910, 0.772447044535680360, 0.772415289611193100, 0.772383532755667180, 0.772351773969182980, 0.772320013251819200, 0.772288250603655580, -0.772256486024771150, 0.772224719515245630, 0.772192951075158280, 0.772161180704588610, 0.772129408403615320, 0.772097634172319140, 0.772065858010778870, 0.772034079919073910, -0.772002299897283860, 0.771970517945487880, 0.771938734063765790, 0.771906948252196190, 0.771875160510859800, 0.771843370839835560, 0.771811579239202850, 0.771779785709041160, -0.771747990249430080, 0.771716192860449010, 0.771684393542177440, 0.771652592294694300, 0.771620789118080300, 0.771588984012414270, 0.771557176977775820, 0.771525368014244430, -0.771493557121899600, 0.771461744300820820, 0.771429929551087800, 0.771398112872779260, 0.771366294265976140, 0.771334473730757140, 0.771302651267202100, 0.771270826875390390, -0.771239000555401510, 0.771207172307315280, 0.771175342131210420, 0.771143510027167860, 0.771111675995266530, 0.771079840035585940, 0.771048002148205790, 0.771016162333205690, -0.770984320590665130, 0.770952476920663710, 0.770920631323280590, 0.770888783798596490, 0.770856934346690450, 0.770825082967641960, 0.770793229661530850, 0.770761374428436620, -0.770729517268438970, 0.770697658181617510, 0.770665797168051390, 0.770633934227821340, 0.770602069361006390, 0.770570202567686380, 0.770538333847940790, 0.770506463201849350, -0.770474590629491750, 0.770442716130947170, 0.770410839706296310, 0.770378961355618340, 0.770347081078992970, 0.770315198876499910, 0.770283314748218870, 0.770251428694229580, -0.770219540714611630, 0.770187650809444290, 0.770155758978808500, 0.770123865222783200, 0.770091969541448210, 0.770060071934883350, 0.770028172403168340, 0.769996270946382790, -0.769964367564606180, 0.769932462257919110, 0.769900555026400870, 0.769868645870131260, 0.769836734789190010, 0.769804821783656950, 0.769772906853611880, 0.769740989999134430, -0.769709071220303960, 0.769677150517201540, 0.769645227889906080, 0.769613303338497530, 0.769581376863055830, 0.769549448463660690, 0.769517518140391930, 0.769485585893329270, -0.769453651722552090, 0.769421715628141430, 0.769389777610176460, 0.769357837668737000, 0.769325895803902980, 0.769293952015754230, 0.769262006304370580, 0.769230058669831410, -0.769198109112217640, 0.769166157631608560, 0.769134204228084100, 0.769102248901724070, 0.769070291652608540, 0.769038332480817210, 0.769006371386430020, 0.768974408369526460, -0.768942443430187250, 0.768910476568492100, 0.768878507784520710, 0.768846537078353040, 0.768814564450069020, 0.768782589899748570, 0.768750613427471090, 0.768718635033317720, -0.768686654717367630, 0.768654672479700980, 0.768622688320397710, 0.768590702239537630, 0.768558714237200790, 0.768526724313467250, 0.768494732468416260, 0.768462738702129000, -0.768430743014684950, 0.768398745406163930, 0.768366745876646220, 0.768334744426211520, 0.768302741054940010, 0.768270735762911610, 0.768238728550205810, 0.768206719416903770, -0.768174708363084880, 0.768142695388829290, 0.768110680494216940, 0.768078663679327870, 0.768046644944242240, 0.768014624289039330, 0.767982601713800390, 0.767950577218605050, -0.767918550803533220, 0.767886522468665070, 0.767854492214080530, 0.767822460039859770, 0.767790425946082930, 0.767758389932829300, 0.767726352000180470, 0.767694312148215600, -0.767662270377015070, 0.767630226686658810, 0.767598181077226990, 0.767566133548799660, 0.767534084101457070, 0.767502032735278620, 0.767469979450345790, 0.767437924246737960, -0.767405867124535180, 0.767373808083817940, 0.767341747124666070, 0.767309684247159840, 0.767277619451378850, 0.767245552737404360, 0.767213484105315980, 0.767181413555193980, -0.767149341087118300, 0.767117266701169420, 0.767085190397427290, 0.767053112175972160, 0.767021032036883770, 0.766988949980243250, 0.766956866006130440, 0.766924780114625390, -0.766892692305808480, 0.766860602579759850, 0.766828510936559680, 0.766796417376287560, 0.766764321899025100, 0.766732224504851790, 0.766700125193847890, 0.766668023966093680, -0.766635920821669540, 0.766603815760655500, 0.766571708783131860, 0.766539599889178410, 0.766507489078876560, 0.766475376352306000, 0.766443261709547020, 0.766411145150679870, -0.766379026675784840, 0.766346906284942180, 0.766314783978232380, 0.766282659755734950, 0.766250533617531480, 0.766218405563701690, 0.766186275594325950, 0.766154143709484430, -0.766122009909257500, 0.766089874193725650, 0.766057736562968490, 0.766025597017067630, 0.765993455556102650, 0.765961312180154060, 0.765929166889302240, 0.765897019683627560, -0.765864870563210290, 0.765832719528130810, 0.765800566578468960, 0.765768411714306320, 0.765736254935722620, 0.765704096242798230, 0.765671935635613640, 0.765639773114249240, -0.765607608678785300, 0.765575442329302520, 0.765543274065880410, 0.765511103888600770, 0.765478931797543340, 0.765446757792788590, 0.765414581874416910, 0.765382404042508790, -0.765350224297144610, 0.765318042638404420, 0.765285859066369590, 0.765253673581120180, 0.765221486182736670, 0.765189296871299220, 0.765157105646888660, 0.765124912509585360, -0.765092717459469720, 0.765060520496621770, 0.765028321621123110, 0.764996120833053570, 0.764963918132493760, 0.764931713519524160, 0.764899506994225260, 0.764867298556677570, -0.764835088206961110, 0.764802875945157500, 0.764770661771346670, 0.764738445685609220, 0.764706227688025650, 0.764674007778676450, 0.764641785957642320, 0.764609562225003650, -0.764577336580840480, 0.764545109025234650, 0.764512879558265970, 0.764480648180015150, 0.764448414890562700, 0.764416179689989210, 0.764383942578375160, 0.764351703555801400, -0.764319462622347730, 0.764287219778095990, 0.764254975023126230, 0.764222728357519030, 0.764190479781355010, 0.764158229294714770, 0.764125976897678920, 0.764093722590327600, -0.764061466372742530, 0.764029208245003870, 0.763996948207192110, 0.763964686259387960, 0.763932422401672140, 0.763900156634125250, 0.763867888956828000, 0.763835619369860440, -0.763803347873304390, 0.763771074467239910, 0.763738799151747920, 0.763706521926908800, 0.763674242792803380, 0.763641961749512380, 0.763609678797116500, 0.763577393935695790, -0.763545107165332190, 0.763512818486105860, 0.763480527898097390, 0.763448235401387730, 0.763415940996057360, 0.763383644682187220, 0.763351346459857360, 0.763319046329149710, -0.763286744290144540, 0.763254440342922340, 0.763222134487564150, 0.763189826724150590, 0.763157517052762470, 0.763125205473480510, 0.763092891986385080, 0.763060576591557900, -0.763028259289079360, 0.762995940079030040, 0.762963618961490900, 0.762931295936542850, 0.762898971004266400, 0.762866644164742040, 0.762834315418051690, 0.762801984764275410, -0.762769652203494240, 0.762737317735789010, 0.762704981361240320, 0.762672643079929320, 0.762640302891936630, 0.762607960797342720, 0.762575616796229430, 0.762543270888677020, -0.762510923074766530, 0.762478573354578690, 0.762446221728194430, 0.762413868195694570, 0.762381512757160040, 0.762349155412671230, 0.762316796162310070, 0.762284435006156950, -0.762252071944292680, 0.762219706976798190, 0.762187340103754550, 0.762154971325242570, 0.762122600641342520, 0.762090228052136550, 0.762057853557704950, 0.762025477158128850, -0.761993098853488980, 0.761960718643866390, 0.761928336529342000, 0.761895952509996640, 0.761863566585911030, 0.761831178757166990, 0.761798789023845010, 0.761766397386026030, -0.761734003843791090, 0.761701608397221120, 0.761669211046397180, 0.761636811791400080, 0.761604410632310550, 0.761572007569210400, 0.761539602602180340, 0.761507195731301320, -0.761474786956654160, 0.761442376278320120, 0.761409963696380140, 0.761377549210914720, 0.761345132822005890, 0.761312714529734260, 0.761280294334180980, 0.761247872235426780, -0.761215448233553030, 0.761183022328640550, 0.761150594520770610, 0.761118164810023590, 0.761085733196481650, 0.761053299680225500, 0.761020864261336080, 0.760988426939894440, -0.760955987715981720, 0.760923546589679090, 0.760891103561067040, 0.760858658630227720, 0.760826211797241750, 0.760793763062190380, 0.760761312425154430, 0.760728859886215300, -0.760696405445454030, 0.760663949102951760, 0.760631490858789010, 0.760599030713048130, 0.760566568665809630, 0.760534104717154770, 0.760501638867164600, 0.760469171115920270, -0.760436701463503170, 0.760404229909994230, 0.760371756455474060, 0.760339281100025130, 0.760306803843728060, 0.760274324686664000, 0.760241843628914000, 0.760209360670559550, -0.760176875811681580, 0.760144389052360920, 0.760111900392679730, 0.760079409832718930, 0.760046917372559580, 0.760014423012282950, 0.759981926751970180, 0.759949428591702670, -0.759916928531561560, 0.759884426571627470, 0.759851922711982990, 0.759819416952708710, 0.759786909293885810, 0.759754399735595780, 0.759721888277919640, 0.759689374920938800, -0.759656859664733950, 0.759624342509387480, 0.759591823454980220, 0.759559302501593430, 0.759526779649308370, 0.759494254898206210, 0.759461728248368550, 0.759429199699876540, -0.759396669252811020, 0.759364136907254350, 0.759331602663287360, 0.759299066520991330, 0.759266528480447620, 0.759233988541737630, 0.759201446704942610, 0.759168902970144050, -0.759136357337422680, 0.759103809806860870, 0.759071260378539670, 0.759038709052540230, 0.759006155828944040, 0.758973600707832490, 0.758941043689286830, 0.758908484773388130, -0.758875923960218750, 0.758843361249859520, 0.758810796642391930, 0.758778230137897250, 0.758745661736457080, 0.758713091438152800, 0.758680519243065680, 0.758647945151276760, -0.758615369162868540, 0.758582791277921940, 0.758550211496518360, 0.758517629818739160, 0.758485046244665950, 0.758452460774380110, 0.758419873407963130, 0.758387284145495830, -0.758354692987060930, 0.758322099932739360, 0.758289504982612490, 0.758256908136761830, 0.758224309395268970, 0.758191708758215290, 0.758159106225681720, 0.758126501797750980, -0.758093895474504120, 0.758061287256022400, 0.758028677142387530, 0.757996065133680900, 0.757963451229984100, 0.757930835431378740, 0.757898217737945630, 0.757865598149767620, -0.757832976666925620, 0.757800353289501130, 0.757767728017575750, 0.757735100851231080, 0.757702471790548620, 0.757669840835609510, 0.757637207986496250, 0.757604573243290110, -0.757571936606072470, 0.757539298074924930, 0.757506657649929190, 0.757474015331166760, 0.757441371118719340, 0.757408725012667980, 0.757376077013095280, 0.757343427120082400, -0.757310775333711050, 0.757278121654062720, 0.757245466081219010, 0.757212808615261630, 0.757180149256272310, 0.757147488004331960, 0.757114824859523640, 0.757082159821928060, -0.757049492891627150, 0.757016824068702520, 0.756984153353235770, 0.756951480745308710, 0.756918806245002410, 0.756886129852399670, 0.756853451567581550, 0.756820771390629750, -0.756788089321626110, 0.756755405360652110, 0.756722719507789470, 0.756690031763120220, 0.756657342126725970, 0.756624650598688330, 0.756591957179088780, 0.756559261868009590, -0.756526564665532360, 0.756493865571738590, 0.756461164586709870, 0.756428461710528580, 0.756395756943276100, 0.756363050285034030, 0.756330341735884540, 0.756297631295909210, -0.756264918965189770, 0.756232204743807810, 0.756199488631845610, 0.756166770629384640, 0.756134050736506860, 0.756101328953293520, 0.756068605279827220, 0.756035879716189460, -0.756003152262461840, 0.755970422918726180, 0.755937691685064750, 0.755904958561559040, 0.755872223548290980, 0.755839486645341950, 0.755806747852794670, 0.755774007170730400, -0.755741264599231190, 0.755708520138378530, 0.755675773788254790, 0.755643025548941690, 0.755610275420520620, 0.755577523403074270, 0.755544769496684140, 0.755512013701431950, -0.755479256017399510, 0.755446496444669210, 0.755413734983322760, 0.755380971633441870, 0.755348206395108250, 0.755315439268404390, 0.755282670253412000, 0.755249899350212920, -0.755217126558888730, 0.755184351879522150, 0.755151575312194570, 0.755118796856988130, 0.755086016513984330, 0.755053234283265870, 0.755020450164914260, 0.754987664159011200, -0.754954876265639400, 0.754922086484880350, 0.754889294816815990, 0.754856501261528260, 0.754823705819099410, 0.754790908489611390, 0.754758109273146130, 0.754725308169785230, -0.754692505179611390, 0.754659700302706240, 0.754626893539151910, 0.754594084889030010, 0.754561274352423260, 0.754528461929413250, 0.754495647620082140, 0.754462831424511540, -0.754430013342784140, 0.754397193374981790, 0.754364371521186180, 0.754331547781479930, 0.754298722155944730, 0.754265894644662760, 0.754233065247715830, 0.754200233965186430, -0.754167400797156500, 0.754134565743708070, 0.754101728804922880, 0.754068889980883730, 0.754036049271672340, 0.754003206677370750, 0.753970362198060910, 0.753937515833825510, -0.753904667584746280, 0.753871817450905370, 0.753838965432384600, 0.753806111529266690, 0.753773255741633560, 0.753740398069567270, 0.753707538513149760, 0.753674677072463610, -0.753641813747590760, 0.753608948538613150, 0.753576081445613500, 0.753543212468673510, 0.753510341607875560, 0.753477468863301470, 0.753444594235033960, 0.753411717723155070, -0.753378839327746740, 0.753345959048891120, 0.753313076886670820, 0.753280192841167870, 0.753247306912464440, 0.753214419100642460, 0.753181529405784760, 0.753148637827973140, -0.753115744367290010, 0.753082849023817280, 0.753049951797637560, 0.753017052688833120, 0.752984151697485670, 0.752951248823678140, 0.752918344067492470, 0.752885437429010930, -0.752852528908315550, 0.752819618505489060, 0.752786706220613610, 0.752753792053771350, 0.752720876005044340, 0.752687958074515500, 0.752655038262266650, 0.752622116568380290, -0.752589192992938250, 0.752556267536023670, 0.752523340197718270, 0.752490410978104650, 0.752457479877264630, 0.752424546895281150, 0.752391612032236370, 0.752358675288212320, -0.752325736663291830, 0.752292796157556950, 0.752259853771090060, 0.752226909503973310, 0.752193963356289630, 0.752161015328120960, 0.752128065419549800, 0.752095113630658170, -0.752062159961529030, 0.752029204412244520, 0.751996246982886920, 0.751963287673538480, 0.751930326484282150, 0.751897363415199970, 0.751864398466374320, 0.751831431637887460, -0.751798462929822220, 0.751765492342260980, 0.751732519875285550, 0.751699545528979220, 0.751666569303424010, 0.751633591198702320, 0.751600611214896410, 0.751567629352089320, -0.751534645610363090, 0.751501659989800120, 0.751468672490482880, 0.751435683112494200, 0.751402691855916350, 0.751369698720831810, 0.751336703707322640, 0.751303706815471980, -0.751270708045362110, 0.751237707397075520, 0.751204704870694240, 0.751171700466301660, 0.751138694183979600, 0.751105686023811000, 0.751072675985877790, 0.751039664070263240, -0.751006650277049490, 0.750973634606318940, 0.750940617058154510, 0.750907597632638480, 0.750874576329853440, 0.750841553149881770, 0.750808528092806520, 0.750775501158709830, -0.750742472347674550, 0.750709441659782590, 0.750676409095117460, 0.750643374653761300, 0.750610338335796710, 0.750577300141305860, 0.750544260070372230, 0.750511218123077860, -0.750478174299505470, 0.750445128599737330, 0.750412081023856700, 0.750379031571945740, 0.750345980244087050, 0.750312927040363680, 0.750279871960857990, 0.750246815005652600, -0.750213756174829880, 0.750180695468473100, 0.750147632886664530, 0.750114568429486870, 0.750081502097022510, 0.750048433889354720, 0.750015363806565860, 0.749982291848738440, -0.749949218015955150, 0.749916142308299060, 0.749883064725852640, 0.749849985268698500, 0.749816903936919240, 0.749783820730597910, 0.749750735649816980, 0.749717648694659070, -0.749684559865207210, 0.749651469161543900, 0.749618376583752080, 0.749585282131914000, 0.749552185806112830, 0.749519087606431380, 0.749485987532952150, 0.749452885585757620, -0.749419781764931290, 0.749386676070555310, 0.749353568502712840, 0.749320459061486030, 0.749287347746958490, 0.749254234559212470, 0.749221119498330920, 0.749188002564396220, -0.749154883757491840, 0.749121763077700180, 0.749088640525104270, 0.749055516099786270, 0.749022389801830000, 0.748989261631317630, 0.748956131588331740, 0.748922999672955950, -0.748889865885272510, 0.748856730225364590, 0.748823592693314440, 0.748790453289205570, 0.748757312013120680, 0.748724168865142480, 0.748691023845353460, 0.748657876953837230, -0.748624728190676380, 0.748591577555953620, 0.748558425049751670, 0.748525270672153910, 0.748492114423243040, 0.748458956303101890, 0.748425796311813050, 0.748392634449459910, -0.748359470716125300, 0.748326305111891690, 0.748293137636842580, 0.748259968291060670, 0.748226797074628800, 0.748193623987629670, 0.748160449030146670, 0.748127272202262720, -0.748094093504060530, 0.748060912935622710, 0.748027730497032970, 0.747994546188373910, 0.747961360009728570, 0.747928171961179440, 0.747894982042810240, 0.747861790254703450, -0.747828596596942340, 0.747795401069609290, 0.747762203672788120, 0.747729004406561430, 0.747695803271012040, 0.747662600266223330, 0.747629395392278130, 0.747596188649259360, -0.747562980037249970, 0.747529769556333320, 0.747496557206592360, 0.747463342988109900, 0.747430126900968880, 0.747396908945252790, 0.747363689121044340, 0.747330467428426680, -0.747297243867482750, 0.747264018438295820, 0.747230791140948920, 0.747197561975525000, 0.747164330942106880, 0.747131098040778370, 0.747097863271621980, 0.747064626634720620, -0.747031388130158010, 0.746998147758016980, 0.746964905518380570, 0.746931661411331490, 0.746898415436953680, 0.746865167595329730, 0.746831917886543020, 0.746798666310676150, -0.746765412867812840, 0.746732157558036120, 0.746698900381428830, 0.746665641338074120, 0.746632380428055580, 0.746599117651456030, 0.746565853008358760, 0.746532586498846570, -0.746499318123003190, 0.746466047880911530, 0.746432775772654770, 0.746399501798315710, 0.746366225957978190, 0.746332948251725140, 0.746299668679639370, 0.746266387241804830, -0.746233103938304220, 0.746199818769220920, 0.746166531734637760, 0.746133242834638550, 0.746099952069306240, 0.746066659438724080, 0.746033364942974900, 0.746000068582142630, -0.745966770356310200, 0.745933470265560890, 0.745900168309977630, 0.745866864489644120, 0.745833558804643530, 0.745800251255059000, 0.745766941840973590, 0.745733630562471110, -0.745700317419634610, 0.745667002412546910, 0.745633685541292060, 0.745600366805952990, 0.745567046206613070, 0.745533723743355140, 0.745500399416263230, 0.745467073225420270, -0.745433745170909770, 0.745400415252814420, 0.745367083471218490, 0.745333749826204710, 0.745300414317856760, 0.745267076946257270, 0.745233737711490480, 0.745200396613639350, -0.745167053652787240, 0.745133708829017190, 0.745100362142413150, 0.745067013593058160, 0.745033663181035370, 0.745000310906428710, 0.744966956769321340, 0.744933600769796530, -0.744900242907937440, 0.744866883183827990, 0.744833521597551450, 0.744800158149190980, 0.744766792838829850, 0.744733425666552100, 0.744700056632440770, 0.744666685736579240, -0.744633312979050670, 0.744599938359939210, 0.744566561879327790, 0.744533183537300140, 0.744499803333939060, 0.744466421269328830, 0.744433037343552590, 0.744399651556693740, -0.744366263908835420, 0.744332874400061790, 0.744299483030455900, 0.744266089800101120, 0.744232694709081380, 0.744199297757479840, 0.744165898945380100, 0.744132498272865320, -0.744099095740019530, 0.744065691346926020, 0.744032285093668370, 0.743998876980329630, 0.743965467006994060, 0.743932055173744720, 0.743898641480665310, 0.743865225927838990, -0.743831808515349910, 0.743798389243281340, 0.743764968111716660, 0.743731545120739470, 0.743698120270433580, 0.743664693560882380, 0.743631264992169250, 0.743597834564378110, -0.743564402277592570, 0.743530968131895900, 0.743497532127371570, 0.743464094264103540, 0.743430654542175500, 0.743397212961670720, 0.743363769522672580, 0.743330324225265350, -0.743296877069532290, 0.743263428055557120, 0.743229977183422990, 0.743196524453214270, 0.743163069865014240, 0.743129613418906490, 0.743096155114974510, 0.743062694953302350, -0.743029232933973380, 0.742995769057071210, 0.742962303322679760, 0.742928835730882640, 0.742895366281763340, 0.742861894975405450, 0.742828421811893010, 0.742794946791309640, -0.742761469913738810, 0.742727991179264020, 0.742694510587969540, 0.742661028139938840, 0.742627543835255530, 0.742594057674003110, 0.742560569656265710, 0.742527079782127060, -0.742493588051670650, 0.742460094464979850, 0.742426599022139260, 0.742393101723232140, 0.742359602568341990, 0.742326101557553080, 0.742292598690948880, 0.742259093968613340, -0.742225587390629600, 0.742192078957082280, 0.742158568668054740, 0.742125056523630810, 0.742091542523893870, 0.742058026668928390, 0.742024508958817890, 0.741990989393646050, -0.741957467973496490, 0.741923944698453570, 0.741890419568600800, 0.741856892584021880, 0.741823363744800510, 0.741789833051020970, 0.741756300502766970, 0.741722766100122110, -0.741689229843170090, 0.741655691731995300, 0.741622151766681230, 0.741588609947311460, 0.741555066273970610, 0.741521520746741940, 0.741487973365709600, 0.741454424130956860, -0.741420873042568430, 0.741387320100627910, 0.741353765305219010, 0.741320208656425450, 0.741286650154331590, 0.741253089799021160, 0.741219527590577960, 0.741185963529085720, -0.741152397614628810, 0.741118829847290940, 0.741085260227155930, 0.741051688754307490, 0.741018115428830230, 0.740984540250807620, 0.740950963220323280, 0.740917384337461900, -0.740883803602307100, 0.740850221014942690, 0.740816636575452490, 0.740783050283921000, 0.740749462140431910, 0.740715872145069070, 0.740682280297916380, 0.740648686599058250, -0.740615091048578260, 0.740581493646560670, 0.740547894393089100, 0.740514293288248030, 0.740480690332121270, 0.740447085524792660, 0.740413478866346120, 0.740379870356866250, -0.740346259996436550, 0.740312647785141050, 0.740279033723064140, 0.740245417810289740, 0.740211800046901680, 0.740178180432983890, 0.740144558968620970, 0.740110935653896520, -0.740077310488894910, 0.740043683473699640, 0.740010054608395420, 0.739976423893066060, 0.739942791327795720, 0.739909156912668120, 0.739875520647767850, 0.739841882533178730, -0.739808242568985030, 0.739774600755270350, 0.739740957092119510, 0.739707311579616220, 0.739673664217844750, 0.739640015006888700, 0.739606363946832990, 0.739572711037761340, -0.739539056279757690, 0.739505399672906630, 0.739471741217291980, 0.739438080912998120, 0.739404418760108760, 0.739370754758708500, 0.739337088908881500, 0.739303421210711800, -0.739269751664283100, 0.739236080269680460, 0.739202407026987580, 0.739168731936288630, 0.739135054997667630, 0.739101376211209190, 0.739067695576997470, 0.739034013095116290, -0.739000328765649920, 0.738966642588683050, 0.738932954564299530, 0.738899264692583270, 0.738865572973619210, 0.738831879407491290, 0.738798183994283540, 0.738764486734080130, -0.738730787626965760, 0.738697086673024470, 0.738663383872340320, 0.738629679224997560, 0.738595972731080800, 0.738562264390674180, 0.738528554203861880, 0.738494842170727810, -0.738461128291357130, 0.738427412565833440, 0.738393694994241350, 0.738359975576664660, 0.738326254313188320, 0.738292531203896370, 0.738258806248872750, 0.738225079448202480, -0.738191350801969510, 0.738157620310258110, 0.738123887973152430, 0.738090153790737280, 0.738056417763096720, 0.738022679890315110, 0.737988940172476520, 0.737955198609665960, -0.737921455201967280, 0.737887709949465060, 0.737853962852243250, 0.737820213910386770, 0.737786463123979770, 0.737752710493106640, 0.737718956017851420, 0.737685199698299150, -0.737651441534533880, 0.737617681526639650, 0.737583919674701600, 0.737550155978803690, 0.737516390439030390, 0.737482623055465860, 0.737448853828195030, 0.737415082757302050, -0.737381309842871420, 0.737347535084987180, 0.737313758483734370, 0.737279980039197150, 0.737246199751460110, 0.737212417620607190, 0.737178633646723420, 0.737144847829893310, -0.737111060170200890, 0.737077270667730540, 0.737043479322567420, 0.737009686134795450, 0.736975891104499350, 0.736942094231763270, 0.736908295516672250, 0.736874494959310460, -0.736840692559762030, 0.736806888318112250, 0.736773082234445260, 0.736739274308845560, 0.736705464541397400, 0.736671652932185840, 0.736637839481295130, 0.736604024188809880, -0.736570207054814240, 0.736536388079393370, 0.736502567262631520, 0.736468744604613420, 0.736434920105423000, 0.736401093765145510, 0.736367265583865450, 0.736333435561667080, -0.736299603698634900, 0.736265769994854050, 0.736231934450408690, 0.736198097065383190, 0.736164257839862830, 0.736130416773931760, 0.736096573867674690, 0.736062729121175870, -0.736028882534520480, 0.735995034107792990, 0.735961183841077780, 0.735927331734459460, 0.735893477788023050, 0.735859622001852950, 0.735825764376033750, 0.735791904910649830, -0.735758043605786560, 0.735724180461528100, 0.735690315477959160, 0.735656448655164220, 0.735622579993228440, 0.735588709492236090, 0.735554837152271770, 0.735520962973420730, -0.735487086955767140, 0.735453209099395930, 0.735419329404391360, 0.735385447870838700, 0.735351564498822440, 0.735317679288427390, 0.735283792239737720, 0.735249903352839020, -0.735216012627815330, 0.735182120064751810, 0.735148225663732610, 0.735114329424843120, 0.735080431348167920, 0.735046531433791510, 0.735012629681798480, 0.734978726092274210, -0.734944820665303090, 0.734910913400970030, 0.734877004299359320, 0.734843093360556420, 0.734809180584645730, 0.734775265971711830, 0.734741349521840110, 0.734707431235114950, -0.734673511111621160, 0.734639589151443450, 0.734605665354666980, 0.734571739721376350, 0.734537812251656370, 0.734503882945591550, 0.734469951803267350, 0.734436018824768280, -0.734402084010179150, 0.734368147359584440, 0.734334208873069770, 0.734300268550719500, 0.734266326392618570, 0.734232382398851470, 0.734198436569503790, 0.734164488904660130, -0.734130539404404760, 0.734096588068823390, 0.734062634898000610, 0.734028679892021140, 0.733994723050969800, 0.733960764374931850, 0.733926803863992010, 0.733892841518235190, -0.733858877337746020, 0.733824911322609850, 0.733790943472911410, 0.733756973788735720, 0.733723002270167180, 0.733689028917291490, 0.733655053730193240, 0.733621076708957260, -0.733587097853668380, 0.733553117164412070, 0.733519134641272940, 0.733485150284335700, 0.733451164093685830, 0.733417176069408040, 0.733383186211587380, 0.733349194520308330, -0.733315200995656720, 0.733281205637717040, 0.733247208446574430, 0.733213209422313380, 0.733179208565019720, 0.733145205874777940, 0.733111201351673290, 0.733077194995790160, -0.733043186807214480, 0.733009176786030730, 0.732975164932324060, 0.732941151246179310, 0.732907135727681850, 0.732873118376916600, 0.732839099193968170, 0.732805078178922380, -0.732771055331863820, 0.732737030652877760, 0.732703004142048700, 0.732668975799462440, 0.732634945625203820, 0.732600913619357750, 0.732566879782009180, 0.732532844113243600, -0.732498806613146040, 0.732464767281801320, 0.732430726119294500, 0.732396683125711160, 0.732362638301136020, 0.732328591645654340, 0.732294543159350830, 0.732260492842311430, -0.732226440694620620, 0.732192386716363770, 0.732158330907625610, 0.732124273268492050, 0.732090213799047710, 0.732056152499377500, 0.732022089369567250, 0.731988024409701900, -0.731953957619866370, 0.731919889000145600, 0.731885818550625510, 0.731851746271390710, 0.731817672162526690, 0.731783596224118150, 0.731749518456251020, 0.731715438859009910, -0.731681357432480310, 0.731647274176747020, 0.731613189091895770, 0.731579102178011700, 0.731545013435179750, 0.731510922863484960, 0.731476830463013260, 0.731442736233849370, -0.731408640176078430, 0.731374542289786160, 0.731340442575057480, 0.731306341031977780, 0.731272237660631870, 0.731238132461105690, 0.731204025433484170, 0.731169916577852570, -0.731135805894295940, 0.731101693382900100, 0.731067579043749970, 0.731033462876930830, 0.730999344882527820, 0.730965225060626780, 0.730931103411312620, 0.730896979934670730, -0.730862854630786040, 0.730828727499744590, 0.730794598541631310, 0.730760467756531140, 0.730726335144530230, 0.730692200705713390, 0.730658064440166120, 0.730623926347973350, -0.730589786429221010, 0.730555644683994250, 0.730521501112378460, 0.730487355714458550, 0.730453208490320470, 0.730419059440049480, 0.730384908563730840, 0.730350755861449600, -0.730316601333291790, 0.730282444979342360, 0.730248286799686900, 0.730214126794410450, 0.730179964963598940, 0.730145801307337640, 0.730111635825711700, 0.730077468518806390, -0.730043299386707760, 0.730009128429500830, 0.729974955647270880, 0.729940781040103740, 0.729906604608084650, 0.729872426351299010, 0.729838246269832180, 0.729804064363769880, -0.729769880633197480, 0.729735695078200350, 0.729701507698863660, 0.729667318495273550, 0.729633127467515070, 0.729598934615673930, 0.729564739939835060, 0.729530543440084610, -0.729496345116507740, 0.729462144969190150, 0.729427942998216890, 0.729393739203674010, 0.729359533585646760, 0.729325326144220410, 0.729291116879481120, 0.729256905791513920, -0.729222692880404530, 0.729188478146237990, 0.729154261589100680, 0.729120043209077640, 0.729085823006254570, 0.729051600980716640, 0.729017377132549880, 0.728983151461839900, -0.728948923968671840, 0.728914694653131300, 0.728880463515304220, 0.728846230555276090, 0.728811995773132270, 0.728777759168958150, 0.728743520742840100, 0.728709280494863050, -0.728675038425112610, 0.728640794533674920, 0.728606548820635140, 0.728572301286078970, 0.728538051930091910, 0.728503800752759890, 0.728469547754168390, 0.728435292934403010, -0.728401036293549130, 0.728366777831693010, 0.728332517548919810, 0.728298255445315460, 0.728263991520964990, 0.728229725775955020, 0.728195458210370680, 0.728161188824297700, -0.728126917617821330, 0.728092644591028180, 0.728058369744003290, 0.728024093076832470, 0.727989814589601100, 0.727955534282395570, 0.727921252155301120, 0.727886968208403370, -0.727852682441788360, 0.727818394855541670, 0.727784105449749030, 0.727749814224495920, 0.727715521179868490, 0.727681226315952220, 0.727646929632832840, 0.727612631130595930, -0.727578330809327770, 0.727544028669113720, 0.727509724710039610, 0.727475418932190920, 0.727441111335653920, 0.727406801920514210, 0.727372490686857390, 0.727338177634769160, -0.727303862764335670, 0.727269546075642650, 0.727235227568775460, 0.727200907243820360, 0.727166585100863070, 0.727132261139989410, 0.727097935361284640, 0.727063607764835470, -0.727029278350727170, 0.726994947119045780, 0.726960614069876660, 0.726926279203306320, 0.726891942519420240, 0.726857604018304350, 0.726823263700044130, 0.726788921564726080, -0.726754577612435670, 0.726720231843258850, 0.726685884257281200, 0.726651534854589000, 0.726617183635268060, 0.726582830599403980, 0.726548475747082920, 0.726514119078390700, -0.726479760593413350, 0.726445400292236140, 0.726411038174945790, 0.726376674241627770, 0.726342308492368140, 0.726307940927252480, 0.726273571546367180, 0.726239200349797940, -0.726204827337630810, 0.726170452509951270, 0.726136075866845810, 0.726101697408400250, 0.726067317134700410, 0.726032935045832000, 0.725998551141881610, 0.725964165422934740, -0.725929777889077200, 0.725895388540395480, 0.725860997376975290, 0.725826604398902680, 0.725792209606263120, 0.725757812999143440, 0.725723414577629230, 0.725689014341806440, -0.725654612291760870, 0.725620208427579020, 0.725585802749346700, 0.725551395257149840, 0.725516985951074170, 0.725482574831206370, 0.725448161897632170, 0.725413747150437490, -0.725379330589708160, 0.725344912215530880, 0.725310492027991250, 0.725276070027175420, 0.725241646213169110, 0.725207220586058910, 0.725172793145930750, 0.725138363892870230, -0.725103932826964170, 0.725069499948298280, 0.725035065256958600, 0.725000628753030950, 0.724966190436602040, 0.724931750307757690, 0.724897308366583950, 0.724862864613166620, -0.724828419047592430, 0.724793971669947190, 0.724759522480317050, 0.724725071478787840, 0.724690618665446150, 0.724656164040377910, 0.724621707603669400, 0.724587249355406190, -0.724552789295675240, 0.724518327424562240, 0.724483863742153120, 0.724449398248534710, 0.724414930943792830, 0.724380461828013520, 0.724345990901282820, 0.724311518163687440, -0.724277043615313310, 0.724242567256246470, 0.724208089086572970, 0.724173609106379510, 0.724139127315752030, 0.724104643714776790, 0.724070158303539600, 0.724035671082127300, -0.724001182050625800, 0.723966691209121490, 0.723932198557699970, 0.723897704096448380, 0.723863207825452550, 0.723828709744798290, 0.723794209854572550, 0.723759708154861350, -0.723725204645750850, 0.723690699327327100, 0.723656192199676810, 0.723621683262886120, 0.723587172517041190, 0.723552659962227950, 0.723518145598533560, 0.723483629426043610, -0.723449111444844690, 0.723414591655022640, 0.723380070056664380, 0.723345546649856060, 0.723311021434683840, 0.723276494411233760, 0.723241965579592640, 0.723207434939846740, -0.723172902492082210, 0.723138368236385110, 0.723103832172842460, 0.723069294301540100, 0.723034754622564280, 0.723000213136001820, 0.722965669841938880, 0.722931124740461840, -0.722896577831656620, 0.722862029115610150, 0.722827478592408700, 0.722792926262138650, 0.722758372124885810, 0.722723816180737440, 0.722689258429779490, 0.722654698872098430, -0.722620137507780310, 0.722585574336912170, 0.722551009359580050, 0.722516442575870440, 0.722481873985869380, 0.722447303589664020, 0.722412731387340300, 0.722378157378984480, -0.722343581564683590, 0.722309003944523800, 0.722274424518591470, 0.722239843286972660, 0.722205260249754620, 0.722170675407023510, 0.722136088758865590, 0.722101500305367240, -0.722066910046615380, 0.722032317982696290, 0.721997724113696340, 0.721963128439701900, 0.721928530960799790, 0.721893931677076490, 0.721859330588618290, 0.721824727695511430, -0.721790122997843180, 0.721755516495699470, 0.721720908189166680, 0.721686298078332070, 0.721651686163281570, 0.721617072444102000, 0.721582456920879300, 0.721547839593700830, -0.721513220462652760, 0.721478599527821560, 0.721443976789293620, 0.721409352247156080, 0.721374725901495100, 0.721340097752397380, 0.721305467799948970, 0.721270836044237360, -0.721236202485348590, 0.721201567123369250, 0.721166929958385830, 0.721132290990485260, 0.721097650219754030, 0.721063007646278290, 0.721028363270145410, 0.720993717091441550, -0.720959069110253540, 0.720924419326667510, 0.720889767740770630, 0.720855114352649370, 0.720820459162390460, 0.720785802170079930, 0.720751143375805260, 0.720716482779652720, -0.720681820381709030, 0.720647156182060430, 0.720612490180794210, 0.720577822377996840, 0.720543152773754910, 0.720508481368154820, 0.720473808161283700, 0.720439133153228160, -0.720404456344074800, 0.720369777733909870, 0.720335097322820970, 0.720300415110894270, 0.720265731098216120, 0.720231045284874140, 0.720196357670954360, 0.720161668256543820, -0.720126977041728680, 0.720092284026596530, 0.720057589211233640, 0.720022892595726720, 0.719988194180162240, 0.719953493964627710, 0.719918791949209380, 0.719884088133994070, -0.719849382519068160, 0.719814675104519130, 0.719779965890433580, 0.719745254876897890, 0.719710542063998870, 0.719675827451823790, 0.719641111040459140, 0.719606392829991390, -0.719571672820508050, 0.719536951012095470, 0.719502227404840490, 0.719467501998829580, 0.719432774794150240, 0.719398045790889060, 0.719363314989132750, 0.719328582388967800, -0.719293847990481680, 0.719259111793761010, 0.719224373798892480, 0.719189634005962810, 0.719154892415059250, 0.719120149026268530, 0.719085403839677450, 0.719050656855372510, -0.719015908073441290, 0.718981157493970180, 0.718946405117045990, 0.718911650942756110, 0.718876894971187010, 0.718842137202425730, 0.718807377636558780, 0.718772616273673610, -0.718737853113857070, 0.718703088157195750, 0.718668321403776460, 0.718633552853686690, 0.718598782507013030, 0.718564010363842430, 0.718529236424261470, 0.718494460688357760, -0.718459683156217890, 0.718424903827928780, 0.718390122703577050, 0.718355339783250500, 0.718320555067035400, 0.718285768555019020, 0.718250980247287950, 0.718216190143929680, -0.718181398245030910, 0.718146604550678360, 0.718111809060959620, 0.718077011775961390, 0.718042212695770620, 0.718007411820473900, 0.717972609150159040, 0.717937804684912750, -0.717902998424821750, 0.717868190369973070, 0.717833380520454200, 0.717798568876351960, 0.717763755437753170, 0.717728940204744760, 0.717694123177414320, 0.717659304355848460, -0.717624483740134430, 0.717589661330358840, 0.717554837126609500, 0.717520011128973010, 0.717485183337536190, 0.717450353752386640, 0.717415522373611280, 0.717380689201297050, -0.717345854235530880, 0.717311017476400360, 0.717276178923992310, 0.717241338578393780, 0.717206496439691590, 0.717171652507973540, 0.717136806783326250, 0.717101959265836970, -0.717067109955592530, 0.717032258852680630, 0.716997405957188080, 0.716962551269201940, 0.716927694788809130, 0.716892836516097480, 0.716857976451153680, 0.716823114594064670, -0.716788250944918160, 0.716753385503800970, 0.716718518270800350, 0.716683649246003140, 0.716648778429497150, 0.716613905821369190, 0.716579031421706420, 0.716544155230595780, -0.716509277248125080, 0.716474397474381130, 0.716439515909451210, 0.716404632553422350, 0.716369747406382040, 0.716334860468417430, 0.716299971739615680, 0.716265081220063600, -0.716230188909849240, 0.716195294809059300, 0.716160398917780940, 0.716125501236101750, 0.716090601764108880, 0.716055700501889490, 0.716020797449530620, 0.715985892607119980, -0.715950985974744600, 0.715916077552491760, 0.715881167340448490, 0.715846255338702610, 0.715811341547341050, 0.715776425966451080, 0.715741508596119740, 0.715706589436435060, -0.715671668487483760, 0.715636745749353430, 0.715601821222130900, 0.715566894905903970, 0.715531966800759920, 0.715497036906786010, 0.715462105224069170, 0.715427171752697320, -0.715392236492757630, 0.715357299444336900, 0.715322360607523300, 0.715287419982403860, 0.715252477569065850, 0.715217533367596300, 0.715182587378083160, 0.715147639600613670, -0.715112690035275000, 0.715077738682154410, 0.715042785541339710, 0.715007830612917950, 0.714972873896976720, 0.714937915393603070, 0.714902955102884820, 0.714867993024909220, -0.714833029159763540, 0.714798063507535050, 0.714763096068311790, 0.714728126842180790, 0.714693155829229100, 0.714658183029544760, 0.714623208443215030, 0.714588232070327400, -0.714553253910968690, 0.714518273965227270, 0.714483292233190070, 0.714448308714944800, 0.714413323410578280, 0.714378336320178890, 0.714343347443833540, 0.714308356781629960, -0.714273364333655070, 0.714238370099997130, 0.714203374080743190, 0.714168376275980840, 0.714133376685797350, 0.714098375310280640, 0.714063372149517980, 0.714028367203596640, -0.713993360472604640, 0.713958351956629160, 0.713923341655757990, 0.713888329570077970, 0.713853315699677580, 0.713818300044643860, 0.713783282605064410, 0.713748263381026370, -0.713713242372618020, 0.713678219579926610, 0.713643195003039520, 0.713608168642044240, 0.713573140497028800, 0.713538110568080590, 0.713503078855287080, 0.713468045358735540, -0.713433010078514120, 0.713397973014710310, 0.713362934167411480, 0.713327893536705000, 0.713292851122679150, 0.713257806925421180, 0.713222760945018350, 0.713187713181558940, -0.713152663635130190, 0.713117612305819830, 0.713082559193715100, 0.713047504298904400, 0.713012447621474750, 0.712977389161514100, 0.712942328919109690, 0.712907266894349690, -0.712872203087321580, 0.712837137498112950, 0.712802070126811180, 0.712767000973504540, 0.712731930038280390, 0.712696857321226340, 0.712661782822429980, 0.712626706541979350, -0.712591628479962050, 0.712556548636465340, 0.712521467011577480, 0.712486383605386080, 0.712451298417978610, 0.712416211449442670, 0.712381122699866530, 0.712346032169337450, -0.712310939857943470, 0.712275845765771630, 0.712240749892910640, 0.712205652239447760, 0.712170552805470700, 0.712135451591066950, 0.712100348596324870, 0.712065243821331960, -0.712030137266175920, 0.711995028930944240, 0.711959918815725290, 0.711924806920606560, 0.711889693245675530, 0.711854577791020460, 0.711819460556729070, 0.711784341542888940, -0.711749220749587690, 0.711714098176913670, 0.711678973824954490, 0.711643847693797850, 0.711608719783531240, 0.711573590094243150, 0.711538458626021050, 0.711503325378952890, -0.711468190353126030, 0.711433053548629070, 0.711397914965549380, 0.711362774603975010, 0.711327632463993330, 0.711292488545692820, 0.711257342849161200, 0.711222195374485830, -0.711187046121755320, 0.711151895091057250, 0.711116742282479340, 0.711081587696109410, 0.711046431332035710, 0.711011273190345960, 0.710976113271127970, 0.710940951574469460, -0.710905788100458900, 0.710870622849183790, 0.710835455820732150, 0.710800287015191600, 0.710765116432650500, 0.710729944073196780, 0.710694769936918160, 0.710659594023902330, -0.710624416334237790, 0.710589236868012120, 0.710554055625313490, 0.710518872606229370, 0.710483687810848360, 0.710448501239258180, 0.710413312891546410, 0.710378122767801660, -0.710342930868111510, 0.710307737192564130, 0.710272541741247100, 0.710237344514249140, 0.710202145511657610, 0.710166944733560790, 0.710131742180046380, 0.710096537851202750, -0.710061331747117940, 0.710026123867879780, 0.709990914213575960, 0.709955702784295210, 0.709920489580125100, 0.709885274601153800, 0.709850057847469020, 0.709814839319159450, -0.709779619016312810, 0.709744396939016700, 0.709709173087359920, 0.709673947461430310, 0.709638720061315790, 0.709603490887104060, 0.709568259938884060, 0.709533027216743380, -0.709497792720770070, 0.709462556451051940, 0.709427318407677810, 0.709392078590735390, 0.709356837000312710, 0.709321593636497720, 0.709286348499378990, 0.709251101589044360, -0.709215852905581980, 0.709180602449079770, 0.709145350219626320, 0.709110096217309360, 0.709074840442217020, 0.709039582894437800, 0.709004323574059630, 0.708969062481170640, -0.708933799615858780, 0.708898534978212650, 0.708863268568320160, 0.708828000386269590, 0.708792730432148630, 0.708757458706046120, 0.708722185208050080, 0.708686909938248450, -0.708651632896729280, 0.708616354083581370, 0.708581073498892660, 0.708545791142751070, 0.708510507015244870, 0.708475221116462550, 0.708439933446492360, 0.708404644005422250, -0.708369352793340120, 0.708334059810335040, 0.708298765056494810, 0.708263468531907250, 0.708228170236661400, 0.708192870170845200, 0.708157568334546790, 0.708122264727854110, -0.708086959350856080, 0.708051652203640640, 0.708016343286296150, 0.707981032598910430, 0.707945720141572420, 0.707910405914370040, 0.707875089917391790, 0.707839772150725470, -0.707804452614460010, 0.707769131308683350, 0.707733808233483970, 0.707698483388949700, 0.707663156775169560, 0.707627828392231480, 0.707592498240223630, 0.707557166319234820, -0.707521832629352980, 0.707486497170666690, 0.707451159943263800, 0.707415820947233210, 0.707380480182663200, 0.707345137649641910, 0.707309793348257500, 0.707274447278599010, -0.707239099440754250, 0.707203749834811820, 0.707168398460859770, 0.707133045318986910, 0.707097690409281500, 0.707062333731831800, 0.707026975286726090, 0.706991615074053170, -0.706956253093901200, 0.706920889346358330, 0.706885523831513480, 0.706850156549454820, 0.706814787500270820, 0.706779416684049530, 0.706744044100880100, 0.706708669750850450, -0.706673293634049070, 0.706637915750564230, 0.706602536100484960, 0.706567154683899300, 0.706531771500895630, 0.706496386551562440, 0.706460999835988420, 0.706425611354261960, -0.706390221106471540, 0.706354829092705190, 0.706319435313052080, 0.706284039767600460, 0.706248642456438260, 0.706213243379654960, 0.706177842537338400, 0.706142439929577260, -0.706107035556459820, 0.706071629418075000, 0.706036221514511180, 0.706000811845856720, 0.705965400412199910, 0.705929987213629980, 0.705894572250235110, 0.705859155522103770, -0.705823737029324220, 0.705788316771985610, 0.705752894750176220, 0.705717470963984630, 0.705682045413498990, 0.705646618098808580, 0.705611189020001640, 0.705575758177166780, -0.705540325570392150, 0.705504891199767000, 0.705469455065379720, 0.705434017167318350, 0.705398577505672360, 0.705363136080529920, 0.705327692891979500, 0.705292247940109700, -0.705256801225009560, 0.705221352746767340, 0.705185902505471750, 0.705150450501211170, 0.705114996734074740, 0.705079541204150840, 0.705044083911528060, 0.705008624856294790, -0.704973164038540160, 0.704937701458352770, 0.704902237115821010, 0.704866771011033450, 0.704831303144079160, 0.704795833515046710, 0.704760362124024380, 0.704724888971101300, -0.704689414056366200, 0.704653937379907450, 0.704618458941813520, 0.704582978742173790, 0.704547496781076640, 0.704512013058610660, 0.704476527574864450, 0.704441040329927160, -0.704405551323887380, 0.704370060556833600, 0.704334568028854410, 0.704299073740039080, 0.704263577690476090, 0.704228079880254150, 0.704192580309461750, 0.704157078978188130, -0.704121575886521800, 0.704086071034551340, 0.704050564422365910, 0.704015056050054100, 0.703979545917704620, 0.703944034025405950, 0.703908520373247580, 0.703873004961317880, -0.703837487789705670, 0.703801968858499440, 0.703766448167788550, 0.703730925717661600, 0.703695401508207310, 0.703659875539514260, 0.703624347811671710, 0.703588818324768380, -0.703553287078892970, 0.703517754074134080, 0.703482219310581080, 0.703446682788322560, 0.703411144507447240, 0.703375604468043810, 0.703340062670201660, 0.703304519114009490, -0.703268973799555550, 0.703233426726929570, 0.703197877896220010, 0.703162327307515710, 0.703126774960905250, 0.703091220856478240, 0.703055664994323150, 0.703020107374528910, -0.702984547997184130, 0.702948986862378280, 0.702913423970199850, 0.702877859320737990, 0.702842292914081180, 0.702806724750318800, 0.702771154829539670, 0.702735583151832710, -0.702700009717286520, 0.702664434525990590, 0.702628857578033510, 0.702593278873503980, 0.702557698412491600, 0.702522116195084980, 0.702486532221373030, 0.702450946491444460, -0.702415359005388870, 0.702379769763294860, 0.702344178765251350, 0.702308586011347160, 0.702272991501671770, 0.702237395236314010, 0.702201797215362690, 0.702166197438906510, -0.702130595907035190, 0.702094992619837430, 0.702059387577402160, 0.702023780779818090, 0.701988172227174910, 0.701952561919561240, 0.701916949857065870, 0.701881336039778540, -0.701845720467787700, 0.701810103141182750, 0.701774484060052050, 0.701738863224485640, 0.701703240634571900, 0.701667616290400090, 0.701631990192059020, 0.701596362339638180, -0.701560732733226500, 0.701525101372913020, 0.701489468258786440, 0.701453833390936480, 0.701418196769451940, 0.701382558394421870, 0.701346918265935200, 0.701311276384081420, -0.701275632748949550, 0.701239987360628200, 0.701204340219207300, 0.701168691324775440, 0.701133040677421990, 0.701097388277235560, 0.701061734124305950, 0.701026078218721980, -0.700990420560572810, 0.700954761149947370, 0.700919099986935250, 0.700883437071625370, 0.700847772404107010, 0.700812105984468750, 0.700776437812800630, 0.700740767889191480, -0.700705096213730340, 0.700669422786506120, 0.700633747607608660, 0.700598070677126870, 0.700562391995149910, 0.700526711561766600, 0.700491029377066870, 0.700455345441139520, -0.700419659754073610, 0.700383972315958720, 0.700348283126884020, 0.700312592186938530, 0.700276899496211300, 0.700241205054792150, 0.700205508862769890, 0.700169810920233890, -0.700134111227273090, 0.700098409783977300, 0.700062706590435460, 0.700027001646736920, 0.699991294952970520, 0.699955586509226290, 0.699919876315592940, 0.699884164372160060, -0.699848450679016350, 0.699812735236251760, 0.699777018043955420, 0.699741299102216270, 0.699705578411124130, 0.699669855970768030, 0.699634131781237350, 0.699598405842621010, -0.699562678155008940, 0.699526948718490190, 0.699491217533154020, 0.699455484599089570, 0.699419749916386670, 0.699384013485134350, 0.699348275305422100, 0.699312535377338840, -0.699276793700974510, 0.699241050276418140, 0.699205305103759220, 0.699169558183086790, 0.699133809514490670, 0.699098059098060110, 0.699062306933884050, 0.699026553022052520, -0.698990797362654570, 0.698955039955779680, 0.698919280801516880, 0.698883519899956230, 0.698847757251186640, 0.698811992855297830, 0.698776226712378600, 0.698740458822519230, -0.698704689185808640, 0.698668917802336310, 0.698633144672191400, 0.698597369795463940, 0.698561593172242980, 0.698525814802618110, 0.698490034686678470, 0.698454252824513900, -0.698418469216213870, 0.698382683861867530, 0.698346896761564250, 0.698311107915393970, 0.698275317323445940, 0.698239524985809320, 0.698203730902574150, 0.698167935073829680, -0.698132137499665410, 0.698096338180170470, 0.698060537115435030, 0.698024734305548230, 0.697988929750599560, 0.697953123450678280, 0.697917315405874430, 0.697881505616277380, -0.697845694081976610, 0.697809880803061170, 0.697774065779621420, 0.697738249011746530, 0.697702430499525960, 0.697666610243048990, 0.697630788242405760, 0.697594964497685650, -0.697559139008977810, 0.697523311776372390, 0.697487482799958760, 0.697451652079826400, 0.697415819616064580, 0.697379985408763560, 0.697344149458012490, 0.697308311763901180, -0.697272472326518680, 0.697236631145955240, 0.697200788222300360, 0.697164943555643510, 0.697129097146073850, 0.697093248993681860, 0.697057399098556800, 0.697021547460788150, -0.696985694080465400, 0.696949838957678590, 0.696913982092517310, 0.696878123485070720, 0.696842263135429190, 0.696806401043681970, 0.696770537209918660, 0.696734671634228750, -0.696698804316702500, 0.696662935257429280, 0.696627064456498690, 0.696591191913999990, 0.696555317630023760, 0.696519441604659280, 0.696483563837996140, 0.696447684330123720, -0.696411803081132490, 0.696375920091111710, 0.696340035360151100, 0.696304148888340140, 0.696268260675769080, 0.696232370722527420, 0.696196479028704520, 0.696160585594390650, -0.696124690419675400, 0.696088793504648470, 0.696052894849399140, 0.696016994454017880, 0.695981092318594170, 0.695945188443217730, 0.695909282827978040, 0.695873375472965460, -0.695837466378269380, 0.695801555543979710, 0.695765642970185730, 0.695729728656978020, 0.695693812604445960, 0.695657894812679480, 0.695621975281767830, 0.695586054011801620, -0.695550131002870220, 0.695514206255063550, 0.695478279768470990, 0.695442351543183120, 0.695406421579289220, 0.695370489876879110, 0.695334556436043030, 0.695298621256870590, -0.695262684339451600, 0.695226745683875550, 0.695190805290232920, 0.695154863158613300, 0.695118919289106520, 0.695082973681802160, 0.695047026336790720, 0.695011077254161670, -0.694975126434004940, 0.694939173876410020, 0.694903219581467500, 0.694867263549266980, 0.694831305779898270, 0.694795346273450960, 0.694759385030015660, 0.694723422049681850, -0.694687457332539230, 0.694651490878678170, 0.694615522688188490, 0.694579552761159900, 0.694543581097682220, 0.694507607697845810, 0.694471632561740490, 0.694435655689455980, -0.694399677081082080, 0.694363696736709280, 0.694327714656427290, 0.694291730840325920, 0.694255745288494990, 0.694219758001024980, 0.694183768978005490, 0.694147778219526670, -0.694111785725678110, 0.694075791496550410, 0.694039795532233160, 0.694003797832816180, 0.693967798398389960, 0.693931797229044300, 0.693895794324869030, 0.693859789685954080, -0.693823783312389920, 0.693787775204266380, 0.693751765361673380, 0.693715753784700520, 0.693679740473438720, 0.693643725427977480, 0.693607708648407040, 0.693571690134816900, -0.693535669887297870, 0.693499647905939760, 0.693463624190832410, 0.693427598742065830, 0.693391571559730410, 0.693355542643916190, 0.693319511994712980, 0.693283479612210820, -0.693247445496500190, 0.693211409647670920, 0.693175372065812920, 0.693139332751016690, 0.693103291703372150, 0.693067248922969450, 0.693031204409898290, 0.692995158164249390, -0.692959110186112670, 0.692923060475578060, 0.692887009032735590, 0.692850955857675870, 0.692814900950488810, 0.692778844311264350, 0.692742785940092640, 0.692706725837064160, -0.692670664002268950, 0.692634600435797050, 0.692598535137738390, 0.692562468108183560, 0.692526399347222710, 0.692490328854945440, 0.692454256631442670, 0.692418182676804330, -0.692382106991120460, 0.692346029574481100, 0.692309950426976960, 0.692273869548697850, 0.692237786939734150, 0.692201702600175660, 0.692165616530113210, 0.692129528729636730, -0.692093439198836370, 0.692057347937802160, 0.692021254946624920, 0.691985160225394470, 0.691949063774201180, 0.691912965593134870, 0.691876865682286570, 0.691840764041745990, -0.691804660671603180, 0.691768555571949050, 0.691732448742873540, 0.691696340184467020, 0.691660229896819190, 0.691624117880021090, 0.691588004134162770, 0.691551888659334480, -0.691515771455626040, 0.691479652523128600, 0.691443531861931970, 0.691407409472126530, 0.691371285353802210, 0.691335159507050050, 0.691299031931959960, 0.691262902628622220, -0.691226771597126980, 0.691190638837565150, 0.691154504350026680, 0.691118368134601700, 0.691082230191381040, 0.691046090520454850, 0.691009949121913380, 0.690973805995846790, -0.690937661142345890, 0.690901514561500950, 0.690865366253402220, 0.690829216218139750, 0.690793064455804460, 0.690756910966486610, 0.690720755750276470, 0.690684598807264070, -0.690648440137540560, 0.690612279741195990, 0.690576117618320610, 0.690539953769004680, 0.690503788193339130, 0.690467620891414220, 0.690431451863320110, 0.690395281109147160, -0.690359108628986310, 0.690322934422927580, 0.690286758491061360, 0.690250580833478460, 0.690214401450269130, 0.690178220341523870, 0.690142037507332610, 0.690105852947786590, -0.690069666662976090, 0.690033478652991250, 0.689997288917922450, 0.689961097457860830, 0.689924904272896430, 0.689888709363119630, 0.689852512728620910, 0.689816314369491200, -0.689780114285820640, 0.689743912477699840, 0.689707708945218930, 0.689671503688469080, 0.689635296707540420, 0.689599088002523230, 0.689562877573508650, 0.689526665420586830, -0.689490451543848470, 0.689454235943383510, 0.689418018619283310, 0.689381799571638140, 0.689345578800538480, 0.689309356306074480, 0.689273132088337400, 0.689236906147417510, -0.689200678483405380, 0.689164449096391300, 0.689128217986466280, 0.689091985153720720, 0.689055750598245310, 0.689019514320130200, 0.688983276319466540, 0.688947036596344710, -0.688910795150854960, 0.688874551983088560, 0.688838307093135760, 0.688802060481087270, 0.688765812147033250, 0.688729562091065060, 0.688693310313272860, 0.688657056813747560, -0.688620801592579100, 0.688584544649859080, 0.688548285985677630, 0.688512025600125590, 0.688475763493292980, 0.688439499665271400, 0.688403234116151120, 0.688366966846022610, -0.688330697854976470, 0.688294427143103850, 0.688258154710495230, 0.688221880557241210, 0.688185604683432150, 0.688149327089159320, 0.688113047774513320, 0.688076766739584290, -0.688040483984463710, 0.688004199509241850, 0.687967913314009530, 0.687931625398857110, 0.687895335763875960, 0.687859044409156460, 0.687822751334789320, 0.687786456540865010, -0.687750160027474910, 0.687713861794709390, 0.687677561842659160, 0.687641260171414800, 0.687604956781067480, 0.687568651671707890, 0.687532344843426620, 0.687496036296314170, -0.687459726030461900, 0.687423414045960410, 0.687387100342900070, 0.687350784921372250, 0.687314467781467430, 0.687278148923276540, 0.687241828346889850, 0.687205506052398940, -0.687169182039894300, 0.687132856309466740, 0.687096528861206650, 0.687060199695205600, 0.687023868811553970, 0.686987536210342810, 0.686951201891662370, 0.686914865855604240, -0.686878528102259020, 0.686842188631717420, 0.686805847444070140, 0.686769504539408440, 0.686733159917823020, 0.686696813579404370, 0.686660465524244090, 0.686624115752432540, -0.686587764264060760, 0.686551411059219240, 0.686515056137999460, 0.686478699500492010, 0.686442341146787930, 0.686405981076977590, 0.686369619291152700, 0.686333255789403740, -0.686296890571821640, 0.686260523638496880, 0.686224154989521270, 0.686187784624985200, 0.686151412544979690, 0.686115038749595340, 0.686078663238923750, 0.686042286013055390, -0.686005907072081420, 0.685969526416092320, 0.685933144045179690, 0.685896759959434330, 0.685860374158946630, 0.685823986643808280, 0.685787597414110110, 0.685751206469942810, -0.685714813811397320, 0.685678419438565000, 0.685642023351536570, 0.685605625550403270, 0.685569226035255500, 0.685532824806184940, 0.685496421863282300, 0.685460017206638740, -0.685423610836344730, 0.685387202752491990, 0.685350792955171210, 0.685314381444473540, 0.685277968220489590, 0.685241553283310930, 0.685205136633028510, 0.685168718269732910, -0.685132298193515840, 0.685095876404468010, 0.685059452902680440, 0.685023027688243970, 0.684986600761250290, 0.684950172121789990, 0.684913741769954340, 0.684877309705834050, -0.684840875929520700, 0.684804440441105220, 0.684768003240678660, 0.684731564328331820, 0.684695123704156310, 0.684658681368242930, 0.684622237320682950, 0.684585791561566960, -0.684549344090986890, 0.684512894909033550, 0.684476444015797550, 0.684439991411370690, 0.684403537095843890, 0.684367081069308330, 0.684330623331854680, 0.684294163883574890, -0.684257702724559550, 0.684221239854900020, 0.684184775274687020, 0.684148308984012470, 0.684111840982967180, 0.684075371271642200, 0.684038899850128560, 0.684002426718517850, -0.683965951876901230, 0.683929475325369630, 0.683892997064014070, 0.683856517092926270, 0.683820035412197270, 0.683783552021917760, 0.683747066922179790, 0.683710580113074170, -0.683674091594691950, 0.683637601367124370, 0.683601109430462930, 0.683564615784798880, 0.683528120430223150, 0.683491623366826890, 0.683455124594701810, 0.683418624113939050, -0.683382121924629660, 0.683345618026864550, 0.683309112420735780, 0.683272605106334250, 0.683236096083751240, 0.683199585353077680, 0.683163072914405370, 0.683126558767825460, -0.683090042913429120, 0.683053525351307370, 0.683017006081552140, 0.682980485104254350, 0.682943962419505060, 0.682907438027396290, 0.682870911928018740, 0.682834384121464020, -0.682797854607822940, 0.682761323387187650, 0.682724790459648960, 0.682688255825298350, 0.682651719484226760, 0.682615181436526220, 0.682578641682287660, 0.682542100221602550, -0.682505557054561840, 0.682469012181257550, 0.682432465601780840, 0.682395917316222840, 0.682359367324674730, 0.682322815627228520, 0.682286262223975370, 0.682249707115006210, -0.682213150300412960, 0.682176591780287000, 0.682140031554719580, 0.682103469623801640, 0.682066905987625430, 0.682030340646281870, 0.681993773599862570, 0.681957204848458450, -0.681920634392161660, 0.681884062231063240, 0.681847488365254770, 0.681810912794827080, 0.681774335519872540, 0.681737756540482190, 0.681701175856747390, 0.681664593468759410, -0.681628009376610170, 0.681591423580390930, 0.681554836080192850, 0.681518246876107960, 0.681481655968227520, 0.681445063356642900, 0.681408469041445250, 0.681371873022726840, -0.681335275300578690, 0.681298675875092410, 0.681262074746359030, 0.681225471914470800, 0.681188867379519000, 0.681152261141594880, 0.681115653200789820, 0.681079043557196060, -0.681042432210904660, 0.681005819162007090, 0.680969204410594720, 0.680932587956759590, 0.680895969800593080, 0.680859349942186550, 0.680822728381631380, 0.680786105119019710, -0.680749480154442810, 0.680712853487991820, 0.680676225119759120, 0.680639595049835730, 0.680602963278313490, 0.680566329805283420, 0.680529694630837900, 0.680493057755068080, -0.680456419178065650, 0.680419778899921890, 0.680383136920728940, 0.680346493240578170, 0.680309847859561170, 0.680273200777769200, 0.680236551995294650, 0.680199901512228640, -0.680163249328662900, 0.680126595444688680, 0.680089939860398340, 0.680053282575883160, 0.680016623591234380, 0.679979962906544390, 0.679943300521904550, 0.679906636437406340, -0.679869970653141360, 0.679833303169201650, 0.679796633985678800, 0.679759963102664290, 0.679723290520249600, 0.679686616238526890, 0.679649940257587740, 0.679613262577523750, -0.679576583198426290, 0.679539902120387620, 0.679503219343499220, 0.679466534867852800, 0.679429848693539730, 0.679393160820652380, 0.679356471249282000, 0.679319779979520200, -0.679283087011459340, 0.679246392345190690, 0.679209695980806050, 0.679172997918396910, 0.679136298158055540, 0.679099596699873410, 0.679062893543942340, 0.679026188690353690, -0.678989482139199960, 0.678952773890572400, 0.678916063944562940, 0.678879352301263060, 0.678842638960765130, 0.678805923923160530, 0.678769207188541170, 0.678732488756998430, -0.678695768628624800, 0.678659046803511750, 0.678622323281750760, 0.678585598063434330, 0.678548871148653810, 0.678512142537501250, 0.678475412230067910, 0.678438680226446380, -0.678401946526728140, 0.678365211131005120, 0.678328474039368690, 0.678291735251911330, 0.678254994768724640, 0.678218252589900540, 0.678181508715530510, 0.678144763145706930, -0.678108015880521500, 0.678071266920066030, 0.678034516264432120, 0.677997763913712140, 0.677961009867997790, 0.677924254127381000, 0.677887496691953140, 0.677850737561806920, -0.677813976737033810, 0.677777214217725410, 0.677740450003974430, 0.677703684095872230, 0.677666916493510850, 0.677630147196981780, 0.677593376206377720, 0.677556603521790260, -0.677519829143311210, 0.677483053071032290, 0.677446275305046090, 0.677409495845444190, 0.677372714692318630, 0.677335931845760800, 0.677299147305863600, 0.677262361072718530, -0.677225573146417400, 0.677188783527052250, 0.677151992214715340, 0.677115199209498360, 0.677078404511493150, 0.677041608120792280, 0.677004810037487360, 0.676968010261670420, -0.676931208793433160, 0.676894405632868070, 0.676857600780067070, 0.676820794235122090, 0.676783985998124840, 0.676747176069167790, 0.676710364448342980, 0.676673551135742120, -0.676636736131457140, 0.676599919435580620, 0.676563101048204270, 0.676526280969420140, 0.676489459199320020, 0.676452635737996630, 0.676415810585541680, 0.676378983742046750, -0.676342155207604770, 0.676305324982307330, 0.676268493066246700, 0.676231659459514470, 0.676194824162203330, 0.676157987174405230, 0.676121148496212080, 0.676084308127715810, -0.676047466069009010, 0.676010622320183610, 0.675973776881331640, 0.675936929752544930, 0.675900080933916180, 0.675863230425537200, 0.675826378227500250, 0.675789524339896920, -0.675752668762820140, 0.675715811496361730, 0.675678952540613830, 0.675642091895668040, 0.675605229561617500, 0.675568365538553820, 0.675531499826569020, 0.675494632425755690, -0.675457763336205770, 0.675420892558011410, 0.675384020091264640, 0.675347145936058050, 0.675310270092483570, 0.675273392560633460, 0.675236513340599530, 0.675199632432474610, -0.675162749836350720, 0.675125865552319790, 0.675088979580473980, 0.675052091920905980, 0.675015202573707840, 0.674978311538971700, 0.674941418816789370, 0.674904524407253790, -0.674867628310456990, 0.674830730526490790, 0.674793831055448100, 0.674756929897420750, 0.674720027052501110, 0.674683122520781110, 0.674646216302353660, 0.674609308397310590, -0.674572398805744270, 0.674535487527746720, 0.674498574563410670, 0.674461659912828140, 0.674424743576091500, 0.674387825553292800, 0.674350905844524730, 0.674313984449879440, -0.674277061369449200, 0.674240136603325930, 0.674203210151602670, 0.674166282014371450, 0.674129352191724100, 0.674092420683753750, 0.674055487490552330, 0.674018552612212220, -0.673981616048825340, 0.673944677800484840, 0.673907737867282640, 0.673870796249311010, 0.673833852946662090, 0.673796907959428930, 0.673759961287703430, 0.673723012931577990, -0.673686062891144740, 0.673649111166496730, 0.673612157757725870, 0.673575202664924650, 0.673538245888185010, 0.673501287427600180, 0.673464327283262110, 0.673427365455262830, -0.673390401943695590, 0.673353436748652220, 0.673316469870225310, 0.673279501308506890, 0.673242531063590110, 0.673205559135566900, 0.673168585524529850, 0.673131610230571000, -0.673094633253783380, 0.673057654594259260, 0.673020674252091000, 0.672983692227370760, 0.672946708520191560, 0.672909723130645570, 0.672872736058825360, 0.672835747304822870, -0.672798756868731470, 0.672761764750643090, 0.672724770950650310, 0.672687775468845280, 0.672650778305321160, 0.672613779460170090, 0.672576778933484220, 0.672539776725356700, -0.672502772835879780, 0.672465767265145950, 0.672428760013247250, 0.672391751080277160, 0.672354740466327590, 0.672317728171491160, 0.672280714195860110, 0.672243698539527590, -0.672206681202585870, 0.672169662185127410, 0.672132641487244500, 0.672095619109030260, 0.672058595050576970, 0.672021569311977320, 0.671984541893323240, 0.671947512794708210, -0.671910482016224500, 0.671873449557964130, 0.671836415420020480, 0.671799379602485810, 0.671762342105452710, 0.671725302929013330, 0.671688262073261160, 0.671651219538288210, -0.671614175324187320, 0.671577129431050630, 0.671540081858971400, 0.671503032608042010, 0.671465981678355030, 0.671428929070002730, 0.671391874783078490, 0.671354818817674560, -0.671317761173883530, 0.671280701851797890, 0.671243640851510670, 0.671206578173114470, 0.671169513816701420, 0.671132447782364920, 0.671095380070197310, 0.671058310680291310, -0.671021239612739070, 0.670984166867634180, 0.670947092445068890, 0.670910016345135810, 0.670872938567927400, 0.670835859113536940, 0.670798777982056780, 0.670761695173579750, -0.670724610688198110, 0.670687524526005330, 0.670650436687093680, 0.670613347171555960, 0.670576255979484560, 0.670539163110972840, 0.670502068566113160, 0.670464972344998470, -0.670427874447720900, 0.670390774874373930, 0.670353673625050050, 0.670316570699841740, 0.670279466098842260, 0.670242359822144080, 0.670205251869840040, 0.670168142242022590, -0.670131030938785120, 0.670093917960220000, 0.670056803306420150, 0.670019686977477820, 0.669982568973486740, 0.669945449294539250, 0.669908327940728080, 0.669871204912145800, -0.669834080208885800, 0.669796953831040650, 0.669759825778703080, 0.669722696051965550, 0.669685564650921660, 0.669648431575663890, 0.669611296826284730, 0.669574160402877540, -0.669537022305535130, 0.669499882534350000, 0.669462741089414950, 0.669425597970823350, 0.669388453178667690, 0.669351306713040990, 0.669314158574035640, 0.669277008761745230, -0.669239857276262230, 0.669202704117679680, 0.669165549286090070, 0.669128392781586760, 0.669091234604262670, 0.669054074754210410, 0.669016913231522570, 0.668979750036292840, -0.668942585168613710, 0.668905418628577770, 0.668868250416278620, 0.668831080531808840, 0.668793908975261480, 0.668756735746728890, 0.668719560846304790, 0.668682384274081890, -0.668645206030152870, 0.668608026114610680, 0.668570844527548670, 0.668533661269059550, 0.668496476339236260, 0.668459289738171480, 0.668422101465958820, 0.668384911522690860, -0.668347719908460650, 0.668310526623360770, 0.668273331667484930, 0.668236135040925830, 0.668198936743775950, 0.668161736776129110, 0.668124535138077900, 0.668087331829715360, -0.668050126851134190, 0.668012920202428080, 0.667975711883689540, 0.667938501895011800, 0.667901290236487480, 0.667864076908210260, 0.667826861910272850, 0.667789645242768290, -0.667752426905789290, 0.667715206899429540, 0.667677985223781740, 0.667640761878939060, 0.667603536864994070, 0.667566310182040600, 0.667529081830171340, 0.667491851809479340, -0.667454620120057520, 0.667417386761999350, 0.667380151735397660, 0.667342915040345370, 0.667305676676936080, 0.667268436645262700, 0.667231194945418160, 0.667193951577495280, -0.667156706541587870, 0.667119459837788640, 0.667082211466190840, 0.667044961426887180, 0.667007709719971360, 0.666970456345536310, 0.666933201303675170, 0.666895944594480650, -0.666858686218046560, 0.666821426174465830, 0.666784164463831490, 0.666746901086236470, 0.666709636041774470, 0.666672369330538420, 0.666635100952621020, 0.666597830908116310, -0.666560559197116990, 0.666523285819716320, 0.666486010776007000, 0.666448734066083070, 0.666411455690037240, 0.666374175647962750, 0.666336893939952550, 0.666299610566100430, -0.666262325526499330, 0.666225038821242400, 0.666187750450422560, 0.666150460414133620, 0.666113168712468510, 0.666075875345520490, 0.666038580313382480, 0.666001283616148300, -0.665963985253910980, 0.665926685226763350, 0.665889383534799320, 0.665852080178111820, 0.665814775156794210, 0.665777468470939220, 0.665740160120640970, 0.665702850105992280, -0.665665538427086420, 0.665628225084016420, 0.665590910076876210, 0.665553593405758810, 0.665516275070757280, 0.665478955071964750, 0.665441633409475260, 0.665404310083381630, -0.665366985093777230, 0.665329658440754980, 0.665292330124408910, 0.665255000144832080, 0.665217668502117830, 0.665180335196358890, 0.665143000227649610, 0.665105663596082700, -0.665068325301751420, 0.665030985344749580, 0.664993643725170220, 0.664956300443106940, 0.664918955498652430, 0.664881608891900840, 0.664844260622945330, 0.664806910691879140, -0.664769559098795320, 0.664732205843787890, 0.664694850926950020, 0.664657494348374960, 0.664620136108155850, 0.664582776206386840, 0.664545414643160750, 0.664508051418571170, -0.664470686532711130, 0.664433319985674790, 0.664395951777555060, 0.664358581908445100, 0.664321210378439050, 0.664283837187629960, 0.664246462336111290, 0.664209085823976090, -0.664171707651318610, 0.664134327818231780, 0.664096946324809200, 0.664059563171143900, 0.664022178357329910, 0.663984791883460600, 0.663947403749629240, 0.663910013955929080, -0.663872622502454270, 0.663835229389297840, 0.663797834616553280, 0.663760438184313850, 0.663723040092673690, 0.663685640341725950, 0.663648238931563660, 0.663610835862281200, -0.663573431133971710, 0.663536024746728570, 0.663498616700645030, 0.663461206995815230, 0.663423795632332450, 0.663386382610290260, 0.663348967929781710, 0.663311551590901050, -0.663274133593741540, 0.663236713938396670, 0.663199292624959800, 0.663161869653524970, 0.663124445024185330, 0.663087018737034790, 0.663049590792166190, 0.663012161189674100, -0.662974729929651450, 0.662937297012191730, 0.662899862437389080, 0.662862426205336860, 0.662824988316128460, 0.662787548769857350, 0.662750107566617560, 0.662712664706502700, -0.662675220189606010, 0.662637774016020980, 0.662600326185841860, 0.662562876699162030, 0.662525425556074850, 0.662487972756673820, 0.662450518301053280, 0.662413062189306290, -0.662375604421526760, 0.662338144997807850, 0.662300683918243930, 0.662263221182928240, 0.662225756791954610, 0.662188290745416190, 0.662150823043407330, 0.662113353686021420, -0.662075882673351820, 0.662038410005492910, 0.662000935682537930, 0.661963459704580590, 0.661925982071714270, 0.661888502784033330, 0.661851021841631140, 0.661813539244601400, -0.661776054993037490, 0.661738569087033770, 0.661701081526683610, 0.661663592312080720, 0.661626101443318570, 0.661588608920491540, 0.661551114743692880, 0.661513618913016520, -0.661476121428555720, 0.661438622290404950, 0.661401121498657710, 0.661363619053407240, 0.661326114954748020, 0.661288609202773660, 0.661251101797577730, 0.661213592739253620, -0.661176082027895910, 0.661138569663597960, 0.661101055646453720, 0.661063539976556420, 0.661026022654000570, 0.660988503678879740, 0.660950983051287630, 0.660913460771317630, -0.660875936839064430, 0.660838411254621390, 0.660800884018082240, 0.660763355129540650, 0.660725824589090900, 0.660688292396826580, 0.660650758552841280, 0.660613223057229360, -0.660575685910084420, 0.660538147111500270, 0.660500606661570400, 0.660463064560389390, 0.660425520808050610, 0.660387975404648110, 0.660350428350275350, 0.660312879645026830, -0.660275329288996130, 0.660237777282277060, 0.660200223624963220, 0.660162668317149200, 0.660125111358928480, 0.660087552750394990, 0.660049992491642310, 0.660012430582764930, -0.659974867023856550, 0.659937301815010980, 0.659899734956321820, 0.659862166447883540, 0.659824596289789960, 0.659787024482134550, 0.659749451025011920, 0.659711875918515540, -0.659674299162739560, 0.659636720757777570, 0.659599140703724050, 0.659561559000672700, 0.659523975648717450, 0.659486390647951890, 0.659448803998470720, 0.659411215700367540, -0.659373625753736260, 0.659336034158670590, 0.659298440915265240, 0.659260846023613790, 0.659223249483810170, 0.659185651295948080, 0.659148051460122230, 0.659110449976426320, -0.659072846844953820, 0.659035242065799660, 0.658997635639057330, 0.658960027564820860, 0.658922417843184060, 0.658884806474241520, 0.658847193458086950, 0.658809578794814500, -0.658771962484517640, 0.658734344527291290, 0.658696724923229060, 0.658659103672424970, 0.658621480774972850, 0.658583856230967380, 0.658546230040502170, 0.658508602203671470, -0.658470972720568870, 0.658433341591289190, 0.658395708815926240, 0.658358074394573610, 0.658320438327326120, 0.658282800614277570, 0.658245161255522020, 0.658207520251153140, -0.658169877601265880, 0.658132233305953940, 0.658094587365311350, 0.658056939779432030, 0.658019290548410680, 0.657981639672341020, 0.657943987151317410, 0.657906332985433330, -0.657868677174783920, 0.657831019719462670, 0.657793360619563950, 0.657755699875181450, 0.657718037486410110, 0.657680373453343630, 0.657642707776075920, 0.657605040454701690, -0.657567371489314880, 0.657529700880009730, 0.657492028626879940, 0.657454354730020450, 0.657416679189524960, 0.657379002005487820, 0.657341323178002870, 0.657303642707165010, -0.657265960593067970, 0.657228276835805980, 0.657190591435473090, 0.657152904392163890, 0.657115215705972530, 0.657077525376993150, 0.657039833405319570, 0.657002139791046820, -0.656964444534268610, 0.656926747635079410, 0.656889049093572930, 0.656851348909844200, 0.656813647083987040, 0.656775943616095480, 0.656738238506264340, 0.656700531754587650, -0.656662823361159660, 0.656625113326074210, 0.656587401649426420, 0.656549688331310000, 0.656511973371819440, 0.656474256771048540, 0.656436538529092340, 0.656398818646044880, -0.656361097122000300, 0.656323373957052650, 0.656285649151296950, 0.656247922704827120, 0.656210194617737440, 0.656172464890121930, 0.656134733522075630, 0.656097000513692460, -0.656059265865066470, 0.656021529576292670, 0.655983791647465010, 0.655946052078677950, 0.655908310870025320, 0.655870568021602370, 0.655832823533502920, 0.655795077405821440, -0.655757329638651850, 0.655719580232089320, 0.655681829186227860, 0.655644076501161850, 0.655606322176985330, 0.655568566213793220, 0.655530808611679780, 0.655493049370739380, -0.655455288491065930, 0.655417525972754600, 0.655379761815899520, 0.655341996020594620, 0.655304228586935040, 0.655266459515014940, 0.655228688804928790, 0.655190916456770410, -0.655153142470635160, 0.655115366846617090, 0.655077589584810550, 0.655039810685309700, 0.655002030148209680, 0.654964247973604640, 0.654926464161588840, 0.654888678712256640, -0.654850891625703090, 0.654813102902022210, 0.654775312541308720, 0.654737520543656530, 0.654699726909160900, 0.654661931637915860, 0.654624134730016130, 0.654586336185555620, -0.654548536004629700, 0.654510734187332410, 0.654472930733757900, 0.654435125644001410, 0.654397318918157110, 0.654359510556319580, 0.654321700558582850, 0.654283888925042300, -0.654246075655791960, 0.654208260750926420, 0.654170444210539940, 0.654132626034727660, 0.654094806223583850, 0.654056984777202980, 0.654019161695679310, 0.653981336979108100, -0.653943510627583490, 0.653905682641200190, 0.653867853020052240, 0.653830021764235100, 0.653792188873842830, 0.653754354348969780, 0.653716518189711220, 0.653678680396161280, -0.653640840968414680, 0.653602999906565670, 0.653565157210709510, 0.653527312880940460, 0.653489466917352990, 0.653451619320041700, 0.653413770089101620, 0.653375919224627120, -0.653338066726712800, 0.653300212595453010, 0.653262356830943030, 0.653224499433277090, 0.653186640402549920, 0.653148779738855880, 0.653110917442290220, 0.653073053512947200, -0.653035187950921300, 0.652997320756307680, 0.652959451929200800, 0.652921581469695260, 0.652883709377885420, 0.652845835653866670, 0.652807960297733360, 0.652770083309580080, -0.652732204689501330, 0.652694324437592450, 0.652656442553947610, 0.652618559038661730, 0.652580673891829170, 0.652542787113545190, 0.652504898703904270, 0.652467008663001110, -0.652429116990930090, 0.652391223687786680, 0.652353328753665140, 0.652315432188659950, 0.652277533992866480, 0.652239634166379200, 0.652201732709292830, 0.652163829621701830, -0.652125924903701580, 0.652088018555386450, 0.652050110576851360, 0.652012200968190570, 0.651974289729499670, 0.651936376860873130, 0.651898462362405560, 0.651860546234191430, -0.651822628476326440, 0.651784709088904730, 0.651746788072021350, 0.651708865425770560, 0.651670941150248040, 0.651633015245548060, 0.651595087711765660, 0.651557158548995100, -0.651519227757332060, 0.651481295336870940, 0.651443361287706190, 0.651405425609933420, 0.651367488303647100, 0.651329549368942050, 0.651291608805912750, 0.651253666614654780, -0.651215722795262630, 0.651177777347831220, 0.651139830272455030, 0.651101881569229550, 0.651063931238249460, 0.651025979279609480, 0.650988025693404190, 0.650950070479729190, -0.650912113638679070, 0.650874155170348630, 0.650836195074832480, 0.650798233352226090, 0.650760270002624150, 0.650722305026121270, 0.650684338422812920, 0.650646370192793700, -0.650608400336158630, 0.650570428853002090, 0.650532455743420000, 0.650494481007506620, 0.650456504645357090, 0.650418526657066010, 0.650380547042728850, 0.650342565802440430, -0.650304582936295450, 0.650266598444388830, 0.650228612326815950, 0.650190624583671610, 0.650152635215050620, 0.650114644221047810, 0.650076651601758650, 0.650038657357277950, -0.650000661487700190, 0.649962663993121080, 0.649924664873635430, 0.649886664129338040, 0.649848661760323630, 0.649810657766688000, 0.649772652148525640, 0.649734644905931690, -0.649696636039000740, 0.649658625547828610, 0.649620613432509870, 0.649582599693139580, 0.649544584329812550, 0.649506567342624240, 0.649468548731669590, 0.649430528497043640, -0.649392506638840960, 0.649354483157157380, 0.649316458052087600, 0.649278431323726530, 0.649240402972169230, 0.649202372997511160, 0.649164341399847240, 0.649126308179272080, -0.649088273335881480, 0.649050236869770150, 0.649012198781033330, 0.648974159069765630, 0.648936117736062860, 0.648898074780019820, 0.648860030201731550, 0.648821984001292870, -0.648783936178799590, 0.648745886734346520, 0.648707835668028700, 0.648669782979940930, 0.648631728670179040, 0.648593672738837830, 0.648555615186012460, 0.648517556011797720, -0.648479495216289340, 0.648441432799582330, 0.648403368761771400, 0.648365303102952370, 0.648327235823220050, 0.648289166922669580, 0.648251096401396000, 0.648213024259494900, -0.648174950497061310, 0.648136875114190270, 0.648098798110976810, 0.648060719487516650, 0.648022639243904690, 0.647984557380236080, 0.647946473896605760, 0.647908388793109640, -0.647870302069842530, 0.647832213726899590, 0.647794123764375840, 0.647756032182367210, 0.647717938980968410, 0.647679844160274350, 0.647641747720381080, 0.647603649661383510, -0.647565549983376790, 0.647527448686455840, 0.647489345770716600, 0.647451241236253970, 0.647413135083163230, 0.647375027311539400, 0.647336917921478290, 0.647298806913074840, -0.647260694286424410, 0.647222580041621920, 0.647184464178763300, 0.647146346697943580, 0.647108227599257900, 0.647070106882801310, 0.647031984548669840, 0.646993860596958400, -0.646955735027762050, 0.646917607841176580, 0.646879479037297140, 0.646841348616219000, 0.646803216578037190, 0.646765082922847620, 0.646726947650745340, 0.646688810761825720, -0.646650672256183780, 0.646612532133915340, 0.646574390395115770, 0.646536247039880110, 0.646498102068303490, 0.646459955480481960, 0.646421807276510550, 0.646383657456484630, -0.646345506020499230, 0.646307352968650490, 0.646269198301033240, 0.646231042017743060, 0.646192884118874880, 0.646154724604524830, 0.646116563474788070, 0.646078400729759420, -0.646040236369535230, 0.646002070394210430, 0.645963902803880390, 0.645925733598640250, 0.645887562778586170, 0.645849390343813170, 0.645811216294416730, 0.645773040630491790, -0.645734863352134700, 0.645696684459440400, 0.645658503952504460, 0.645620321831421820, 0.645582138096288840, 0.645543952747200440, 0.645505765784252120, 0.645467577207539110, -0.645429387017157460, 0.645391195213202320, 0.645353001795768930, 0.645314806764953340, 0.645276610120850690, 0.645238411863556570, 0.645200211993166130, 0.645162010509775400, -0.645123807413479630, 0.645085602704374430, 0.645047396382554820, 0.645009188448117170, 0.644970978901156400, 0.644932767741768220, 0.644894554970047880, 0.644856340586091430, -0.644818124589994100, 0.644779906981851390, 0.644741687761758660, 0.644703466929812060, 0.644665244486106850, 0.644627020430738050, 0.644588794763802150, 0.644550567485394190, -0.644512338595609860, 0.644474108094544420, 0.644435875982293900, 0.644397642258953800, 0.644359406924619460, 0.644321169979386380, 0.644282931423350690, 0.644244691256607660, -0.644206449479252980, 0.644168206091381700, 0.644129961093090400, 0.644091714484474000, 0.644053466265628430, 0.644015216436648830, 0.643976964997631570, 0.643938711948671920, -0.643900457289865450, 0.643862201021307420, 0.643823943143094320, 0.643785683655321410, 0.643747422558083810, 0.643709159851478140, 0.643670895535599420, 0.643632629610543570, -0.643594362076405750, 0.643556092933282420, 0.643517822181268850, 0.643479549820460740, 0.643441275850953340, 0.643403000272843140, 0.643364723086225390, 0.643326444291195900, -0.643288163887849930, 0.643249881876283850, 0.643211598256593130, 0.643173313028873370, 0.643135026193220050, 0.643096737749729530, 0.643058447698497070, 0.643020156039618150, -0.642981862773189250, 0.642943567899305620, 0.642905271418063080, 0.642866973329557110, 0.642828673633883960, 0.642790372331139110, 0.642752069421418380, 0.642713764904817130, -0.642675458781431840, 0.642637151051357880, 0.642598841714691060, 0.642560530771526750, 0.642522218221961430, 0.642483904066090680, 0.642445588304010110, 0.642407270935815180, -0.642368951961602490, 0.642330631381467290, 0.642292309195505280, 0.642253985403812840, 0.642215660006485440, 0.642177333003618900, 0.642139004395308580, 0.642100674181651180, -0.642062342362742070, 0.642024008938677060, 0.641985673909551750, 0.641947337275462600, 0.641908999036505110, 0.641870659192775080, 0.641832317744368110, 0.641793974691380660, -0.641755630033908340, 0.641717283772046840, 0.641678935905891870, 0.641640586435539890, 0.641602235361086400, 0.641563882682627320, 0.641525528400258230, 0.641487172514075610, -0.641448815024175060, 0.641410455930652160, 0.641372095233603500, 0.641333732933124570, 0.641295369029311280, 0.641257003522259340, 0.641218636412065110, 0.641180267698824300, -0.641141897382632830, 0.641103525463586290, 0.641065151941781370, 0.641026776817313460, 0.640988400090278580, 0.640950021760772430, 0.640911641828891600, 0.640873260294731570, -0.640834877158388380, 0.640796492419957730, 0.640758106079536200, 0.640719718137219400, 0.640681328593102890, 0.640642937447283400, 0.640604544699856620, 0.640566150350918460, -0.640527754400564640, 0.640489356848891740, 0.640450957695995470, 0.640412556941971740, 0.640374154586916270, 0.640335750630925850, 0.640297345074095970, 0.640258937916522770, -0.640220529158301850, 0.640182118799530020, 0.640143706840302860, 0.640105293280716410, 0.640066878120866380, 0.640028461360849450, 0.639990043000761450, 0.639951623040697970, -0.639913201480755810, 0.639874778321030570, 0.639836353561618500, 0.639797927202615080, 0.639759499244117350, 0.639721069686220670, 0.639682638529021410, 0.639644205772615270, -0.639605771417098850, 0.639567335462568050, 0.639528897909118930, 0.639490458756847180, 0.639452018005849720, 0.639413575656222140, 0.639375131708060600, 0.639336686161460890, -0.639298239016519830, 0.639259790273333240, 0.639221339931996700, 0.639182887992607250, 0.639144434455260590, 0.639105979320052750, 0.639067522587079660, 0.639029064256438240, -0.638990604328223970, 0.638952142802533320, 0.638913679679461890, 0.638875214959106600, 0.638836748641563370, 0.638798280726928120, 0.638759811215296900, 0.638721340106766510, -0.638682867401432760, 0.638644393099391920, 0.638605917200739670, 0.638567439705572950, 0.638528960613987670, 0.638490479926079990, 0.638451997641945710, 0.638413513761681870, -0.638375028285384170, 0.638336541213148530, 0.638298052545071990, 0.638259562281250250, 0.638221070421779670, 0.638182576966755950, 0.638144081916276250, 0.638105585270436260, -0.638067087029332350, 0.638028587193060440, 0.637990085761717340, 0.637951582735398980, 0.637913078114201730, 0.637874571898221390, 0.637836064087555000, 0.637797554682298480, -0.637759043682547990, 0.637720531088399660, 0.637682016899950190, 0.637643501117295840, 0.637604983740532320, 0.637566464769756650, 0.637527944205064870, 0.637489422046553230, -0.637450898294317670, 0.637412372948455210, 0.637373846009061880, 0.637335317476233840, 0.637296787350067230, 0.637258255630658970, 0.637219722318105090, 0.637181187412501850, -0.637142650913945290, 0.637104112822532540, 0.637065573138359430, 0.637027031861522430, 0.636988488992117460, 0.636949944530241670, 0.636911398475990990, 0.636872850829461430, -0.636834301590750160, 0.636795750759953090, 0.636757198337166710, 0.636718644322486930, 0.636680088716010890, 0.636641531517834650, 0.636602972728054550, 0.636564412346766640, -0.636525850374068170, 0.636487286810054950, 0.636448721654823580, 0.636410154908470080, 0.636371586571091500, 0.636333016642783970, 0.636294445123643860, 0.636255872013767320, -0.636217297313251380, 0.636178721022192310, 0.636140143140686340, 0.636101563668829750, 0.636062982606719560, 0.636024399954451920, 0.635985815712122870, 0.635947229879829660, -0.635908642457668430, 0.635870053445735550, 0.635831462844127280, 0.635792870652940540, 0.635754276872271710, 0.635715681502217240, 0.635677084542873190, 0.635638485994336700, -0.635599885856704020, 0.635561284130071740, 0.635522680814535780, 0.635484075910193510, 0.635445469417140970, 0.635406861335474860, 0.635368251665291210, 0.635329640406687270, -0.635291027559759300, 0.635252413124603340, 0.635213797101316760, 0.635175179489995580, 0.635136560290736510, 0.635097939503635690, 0.635059317128790380, 0.635020693166296830, -0.634982067616251420, 0.634943440478750620, 0.634904811753891460, 0.634866181441770430, 0.634827549542483770, 0.634788916056127970, 0.634750280982800170, 0.634711644322596750, -0.634673006075614170, 0.634634366241948800, 0.634595724821697790, 0.634557081814957400, 0.634518437221824110, 0.634479791042394940, 0.634441143276766370, 0.634402493925035000, -0.634363842987296980, 0.634325190463649660, 0.634286536354189410, 0.634247880659012830, 0.634209223378216170, 0.634170564511896790, 0.634131904060150960, 0.634093242023075490, -0.634054578400766510, 0.634015913193321400, 0.633977246400836520, 0.633938578023408580, 0.633899908061133830, 0.633861236514109640, 0.633822563382432370, 0.633783888666198280, -0.633745212365504850, 0.633706534480448450, 0.633667855011125660, 0.633629173957632850, 0.633590491320067510, 0.633551807098525990, 0.633513121293104890, 0.633474433903900680, -0.633435744931010620, 0.633397054374531310, 0.633358362234559320, 0.633319668511191040, 0.633280973204524030, 0.633242276314654570, 0.633203577841679350, 0.633164877785694860, -0.633126176146798560, 0.633087472925086820, 0.633048768120656360, 0.633010061733603640, 0.632971353764026130, 0.632932644212020220, 0.632893933077682380, 0.632855220361109970, -0.632816506062399590, 0.632777790181648040, 0.632739072718951470, 0.632700353674407690, 0.632661633048112960, 0.632622910840164200, 0.632584187050657780, 0.632545461679691280, -0.632506734727361080, 0.632468006193764090, 0.632429276078996680, 0.632390544383156450, 0.632351811106339870, 0.632313076248643750, 0.632274339810164680, 0.632235601791000020, -0.632196862191246380, 0.632158121011000220, 0.632119378250359130, 0.632080633909419490, 0.632041887988278430, 0.632003140487032210, 0.631964391405778540, 0.631925640744613770, -0.631886888503635060, 0.631848134682938660, 0.631809379282622260, 0.631770622302782470, 0.631731863743516200, 0.631693103604919810, 0.631654341887091020, 0.631615578590126400, -0.631576813714122890, 0.631538047259176950, 0.631499279225386180, 0.631460509612847280, 0.631421738421656720, 0.631382965651912210, 0.631344191303710220, 0.631305415377147790, -0.631266637872321510, 0.631227858789328970, 0.631189078128266750, 0.631150295889231770, 0.631111512072320860, 0.631072726677631370, 0.631033939705260230, 0.630995151155304130, -0.630956361027859790, 0.630917569323024900, 0.630878776040896150, 0.630839981181570360, 0.630801184745144350, 0.630762386731715700, 0.630723587141381100, 0.630684785974237490, -0.630645983230381680, 0.630607178909911140, 0.630568373012922680, 0.630529565539513000, 0.630490756489779700, 0.630451945863819470, 0.630413133661729460, 0.630374319883606260, -0.630335504529547560, 0.630296687599650070, 0.630257869094010940, 0.630219049012726740, 0.630180227355895290, 0.630141404123613300, 0.630102579315977680, 0.630063752933085360, -0.630024924975034040, 0.629986095441920410, 0.629947264333841410, 0.629908431650894050, 0.629869597393175830, 0.629830761560783770, 0.629791924153814350, 0.629753085172365500, -0.629714244616533910, 0.629675402486416740, 0.629636558782110670, 0.629597713503713630, 0.629558866651322210, 0.629520018225033670, 0.629481168224944710, 0.629442316651153240, -0.629403463503755980, 0.629364608782850050, 0.629325752488532180, 0.629286894620900370, 0.629248035180051240, 0.629209174166082020, 0.629170311579089650, 0.629131447419171710, -0.629092581686425230, 0.629053714380946930, 0.629014845502834600, 0.628975975052185280, 0.628937103029096000, 0.628898229433663580, 0.628859354265985940, 0.628820477526159880, -0.628781599214282670, 0.628742719330451120, 0.628703837874763140, 0.628664954847315550, 0.628626070248205600, 0.628587184077530110, 0.628548296335387000, 0.628509407021873080, -0.628470516137085710, 0.628431623681121710, 0.628392729654079000, 0.628353834056054380, 0.628314936887144900, 0.628276038147448480, 0.628237137837061920, 0.628198235956082480, -0.628159332504607090, 0.628120427482733780, 0.628081520890559350, 0.628042612728181180, 0.628003702995696080, 0.627964791693202070, 0.627925878820796090, 0.627886964378575390, -0.627848048366636990, 0.627809130785078830, 0.627770211633997710, 0.627731290913491220, 0.627692368623656070, 0.627653444764590400, 0.627614519336391010, 0.627575592339155390, -0.627536663772980450, 0.627497733637964240, 0.627458801934203670, 0.627419868661795670, 0.627380933820838370, 0.627341997411428820, 0.627303059433664270, 0.627264119887641640, -0.627225178773459070, 0.627186236091213600, 0.627147291841002490, 0.627108346022922870, 0.627069398637072670, 0.627030449683549040, 0.626991499162449230, 0.626952547073870380, -0.626913593417910420, 0.626874638194666600, 0.626835681404236070, 0.626796723046716080, 0.626757763122204550, 0.626718801630798630, 0.626679838572595350, 0.626640873947692860, -0.626601907756188180, 0.626562939998178690, 0.626523970673761530, 0.626484999783034850, 0.626446027326095670, 0.626407053303041360, 0.626368077713969070, 0.626329100558976950, -0.626290121838162020, 0.626251141551621870, 0.626212159699453430, 0.626173176281755060, 0.626134191298623690, 0.626095204750156790, 0.626056216636451610, 0.626017226957606200, -0.625978235713717690, 0.625939242904883340, 0.625900248531201080, 0.625861252592768370, 0.625822255089682480, 0.625783256022040550, 0.625744255389940830, 0.625705253193480470, -0.625666249432757060, 0.625627244107867630, 0.625588237218910330, 0.625549228765982620, 0.625510218749181670, 0.625471207168604940, 0.625432194024350570, 0.625393179316515610, -0.625354163045197750, 0.625315145210494140, 0.625276125812503030, 0.625237104851321560, 0.625198082327047320, 0.625159058239777580, 0.625120032589610460, 0.625081005376643350, -0.625041976600973380, 0.625002946262698810, 0.624963914361916780, 0.624924880898725110, 0.624885845873220820, 0.624846809285502180, 0.624807771135666660, 0.624768731423811620, -0.624729690150034430, 0.624690647314433360, 0.624651602917105640, 0.624612556958148990, 0.624573509437660550, 0.624534460355738670, 0.624495409712480740, 0.624456357507984120, -0.624417303742346390, 0.624378248415665690, 0.624339191528039410, 0.624300133079564780, 0.624261073070340180, 0.624222011500462860, 0.624182948370030520, 0.624143883679140530, -0.624104817427891030, 0.624065749616379620, 0.624026680244703760, 0.623987609312960930, 0.623948536821249400, 0.623909462769666520, 0.623870387158310000, 0.623831309987277090, -0.623792231256666270, 0.623753150966574910, 0.623714069117100700, 0.623674985708340900, 0.623635900740394100, 0.623596814213357440, 0.623557726127328400, 0.623518636482405460, -0.623479545278685880, 0.623440452516267450, 0.623401358195247560, 0.623362262315724560, 0.623323164877795930, 0.623284065881559490, 0.623244965327112380, 0.623205863214553290, -0.623166759543979490, 0.623127654315488890, 0.623088547529178750, 0.623049439185147550, 0.623010329283492760, 0.622971217824312200, 0.622932104807703220, 0.622892990233764320, -0.622853874102592960, 0.622814756414286630, 0.622775637168943690, 0.622736516366661610, 0.622697394007538320, 0.622658270091671180, 0.622619144619158680, 0.622580017590098290, -0.622540889004587930, 0.622501758862724960, 0.622462627164607980, 0.622423493910334360, 0.622384359100002120, 0.622345222733708510, 0.622306084811552250, 0.622266945333630810, -0.622227804300041990, 0.622188661710883270, 0.622149517566253250, 0.622110371866249400, 0.622071224610969750, 0.622032075800511560, 0.621992925434973640, 0.621953773514453360, -0.621914620039048180, 0.621875465008856930, 0.621836308423977080, 0.621797150284506330, 0.621757990590542380, 0.621718829342183810, 0.621679666539528220, 0.621640502182673420, -0.621601336271716990, 0.621562168806757630, 0.621522999787892830, 0.621483829215220500, 0.621444657088838230, 0.621405483408844720, 0.621366308175337560, 0.621327131388414560, -0.621287953048173300, 0.621248773154712610, 0.621209591708129950, 0.621170408708523030, 0.621131224155990310, 0.621092038050629620, 0.621052850392538770, 0.621013661181815560, -0.620974470418558470, 0.620935278102865200, 0.620896084234833780, 0.620856888814561690, 0.620817691842147860, 0.620778493317689750, 0.620739293241285410, 0.620700091613032410, -0.620660888433029690, 0.620621683701374600, 0.620582477418165410, 0.620543269583499590, 0.620504060197475950, 0.620464849260192190, 0.620425636771746000, 0.620386422732235990, -0.620347207141759950, 0.620307990000415920, 0.620268771308301600, 0.620229551065515690, 0.620190329272155780, 0.620151105928320230, 0.620111881034106420, 0.620072654589613360, -0.620033426594938540, 0.619994197050180220, 0.619954965955436090, 0.619915733310804850, 0.619876499116384320, 0.619837263372272520, 0.619798026078567150, 0.619758787235367150, -0.619719546842770200, 0.619680304900874330, 0.619641061409777370, 0.619601816369578120, 0.619562569780374270, 0.619523321642263650, 0.619484071955345160, 0.619444820719716400, -0.619405567935475630, 0.619366313602720540, 0.619327057721550060, 0.619287800292061990, 0.619248541314354360, 0.619209280788525000, 0.619170018714672810, 0.619130755092895610, -0.619091489923291550, 0.619052223205958320, 0.619012954940994950, 0.618973685128499150, 0.618934413768569170, 0.618895140861302820, 0.618855866406798900, 0.618816590405155350, -0.618777312856469970, 0.618738033760841690, 0.618698753118368310, 0.618659470929148080, 0.618620187193278710, 0.618580901910859350, 0.618541615081987680, 0.618502326706761970, -0.618463036785280140, 0.618423745317640990, 0.618384452303942460, 0.618345157744282890, 0.618305861638760000, 0.618266563987472930, 0.618227264790519370, 0.618187964047997580, -0.618148661760005600, 0.618109357926642340, 0.618070052548005620, 0.618030745624193470, 0.617991437155304800, 0.617952127141437550, 0.617912815582689960, 0.617873502479159950, -0.617834187830946570, 0.617794871638147720, 0.617755553900861680, 0.617716234619186460, 0.617676913793220870, 0.617637591423063180, 0.617598267508811420, 0.617558942050563610, -0.617519615048418790, 0.617480286502475000, 0.617440956412830480, 0.617401624779583160, 0.617362291602832180, 0.617322956882675470, 0.617283620619210940, 0.617244282812537850, -0.617204943462753900, 0.617165602569957670, 0.617126260134247100, 0.617086916155721200, 0.617047570634478020, 0.617008223570615910, 0.616968874964232920, 0.616929524815428070, -0.616890173124299390, 0.616850819890945370, 0.616811465115463810, 0.616772108797954080, 0.616732750938513980, 0.616693391537242010, 0.616654030594236290, 0.616614668109595750, -0.616575304083418540, 0.616535938515803130, 0.616496571406847440, 0.616457202756650720, 0.616417832565311020, 0.616378460832926360, 0.616339087559595990, 0.616299712745417730, -0.616260336390490380, 0.616220958494911650, 0.616181579058781010, 0.616142198082196390, 0.616102815565256260, 0.616063431508058650, 0.616024045910702920, 0.615984658773287120, -0.615945270095909600, 0.615905879878668520, 0.615866488121663220, 0.615827094824991540, 0.615787699988752270, 0.615748303613043340, 0.615708905697963990, 0.615669506243612390, -0.615630105250086660, 0.615590702717485950, 0.615551298645908630, 0.615511893035452950, 0.615472485886217170, 0.615433077198300650, 0.615393666971801310, 0.615354255206817860, -0.615314841903448430, 0.615275427061792280, 0.615236010681947550, 0.615196592764012730, 0.615157173308086060, 0.615117752314266910, 0.615078329782653310, 0.615038905713343960, -0.614999480106436900, 0.614960052962031490, 0.614920624280226090, 0.614881194061118630, 0.614841762304808580, 0.614802329011394090, 0.614762894180973850, 0.614723457813646010, -0.614684019909509830, 0.614644580468663660, 0.614605139491205990, 0.614565696977235180, 0.614526252926850370, 0.614486807340150040, 0.614447360217232670, 0.614407911558196520, -0.614368461363140940, 0.614329009632164190, 0.614289556365364970, 0.614250101562841430, 0.614210645224693040, 0.614171187351018060, 0.614131727941915060, 0.614092266997482430, -0.614052804517819520, 0.614013340503024470, 0.613973874953195890, 0.613934407868432790, 0.613894939248833760, 0.613855469094497400, 0.613815997405522060, 0.613776524182007010, -0.613737049424050610, 0.613697573131751660, 0.613658095305208430, 0.613618615944520270, 0.613579135049785560, 0.613539652621102990, 0.613500168658571040, 0.613460683162288970, -0.613421196132355240, 0.613381707568868450, 0.613342217471926960, 0.613302725841630480, 0.613263232678077030, 0.613223737981365200, 0.613184241751594360, 0.613144743988862980, -0.613105244693269660, 0.613065743864912970, 0.613026241503892180, 0.612986737610305750, 0.612947232184252620, 0.612907725225830920, 0.612868216735140360, 0.612828706712279180, -0.612789195157346310, 0.612749682070440000, 0.612710167451659960, 0.612670651301104430, 0.612631133618872340, 0.612591614405061930, 0.612552093659772920, 0.612512571383103670, -0.612473047575152640, 0.612433522236019320, 0.612393995365802300, 0.612354466964600160, 0.612314937032511610, 0.612275405569636000, 0.612235872576071930, 0.612196338051918090, -0.612156801997273070, 0.612117264412236460, 0.612077725296906630, 0.612038184651382490, 0.611998642475762630, 0.611959098770146430, 0.611919553534632450, 0.611880006769319640, -0.611840458474306460, 0.611800908649692500, 0.611761357295576240, 0.611721804412056260, 0.611682249999232150, 0.611642694057202400, 0.611603136586065800, 0.611563577585921170, -0.611524017056867870, 0.611484454999004500, 0.611444891412429970, 0.611405326297242980, 0.611365759653542900, 0.611326191481428530, 0.611286621780998680, 0.611247050552351840, -0.611207477795587710, 0.611167903510804970, 0.611128327698102440, 0.611088750357578810, 0.611049171489333580, 0.611009591093465420, 0.610970009170073270, 0.610930425719255710, -0.610890840741112550, 0.610851254235742270, 0.610811666203243450, 0.610772076643715800, 0.610732485557258010, 0.610692892943969000, 0.610653298803947360, 0.610613703137292910, -0.610574105944104110, 0.610534507224480110, 0.610494906978519490, 0.610455305206321850, 0.610415701907986110, 0.610376097083610960, 0.610336490733295320, 0.610296882857138790, -0.610257273455240060, 0.610217662527698050, 0.610178050074611680, 0.610138436096080430, 0.610098820592203110, 0.610059203563078410, 0.610019585008806040, 0.609979964929484700, -0.609940343325213520, 0.609900720196091100, 0.609861095542217120, 0.609821469363690530, 0.609781841660610220, 0.609742212433074910, 0.609702581681184520, 0.609662949405037620, -0.609623315604733370, 0.609583680280370470, 0.609544043432048600, 0.609504405059866810, 0.609464765163923890, 0.609425123744318790, 0.609385480801151180, 0.609345836334519890, -0.609306190344523600, 0.609266542831262250, 0.609226893794834520, 0.609187243235339570, 0.609147591152876090, 0.609107937547544110, 0.609068282419442220, 0.609028625768669560, -0.608988967595325060, 0.608949307899508520, 0.608909646681318640, 0.608869983940854680, 0.608830319678215440, 0.608790653893500730, 0.608750986586809370, 0.608711317758240500, -0.608671647407893040, 0.608631975535866790, 0.608592302142260680, 0.608552627227173740, 0.608512950790704890, 0.608473272832954050, 0.608433593354019920, 0.608393912354001530, -0.608354229832998690, 0.608314545791110330, 0.608274860228435580, 0.608235173145073360, 0.608195484541123490, 0.608155794416684990, 0.608116102771856900, 0.608076409606738260, -0.608036714921428970, 0.607997018716027850, 0.607957320990634150, 0.607917621745346910, 0.607877920980265940, 0.607838218695490040, 0.607798514891118690, 0.607758809567250700, -0.607719102723986100, 0.607679394361423600, 0.607639684479662430, 0.607599973078802310, 0.607560260158942270, 0.607520545720181550, 0.607480829762619080, 0.607441112286355000, -0.607401393291488010, 0.607361672778117590, 0.607321950746342760, 0.607282227196263240, 0.607242502127978260, 0.607202775541586970, 0.607163047437188410, 0.607123317814882490, -0.607083586674768360, 0.607043854016945270, 0.607004119841512150, 0.606964384148569120, 0.606924646938215130, 0.606884908210549190, 0.606845167965671340, 0.606805426203680500, -0.606765682924676140, 0.606725938128757190, 0.606686191816023790, 0.606646443986574970, 0.606606694640509870, 0.606566943777927860, 0.606527191398928740, 0.606487437503611670, -0.606447682092076000, 0.606407925164420770, 0.606368166720746000, 0.606328406761150960, 0.606288645285734780, 0.606248882294596720, 0.606209117787836820, 0.606169351765553980, -0.606129584227847570, 0.606089815174817530, 0.606050044606562870, 0.606010272523183180, 0.605970498924777390, 0.605930723811445750, 0.605890947183287290, 0.605851169040401480, -0.605811389382887370, 0.605771608210845080, 0.605731825524373880, 0.605692041323573020, 0.605652255608541750, 0.605612468379380210, 0.605572679636187550, 0.605532889379063130, -0.605493097608106100, 0.605453304323416710, 0.605413509525094100, 0.605373713213237630, 0.605333915387946560, 0.605294116049321040, 0.605254315197460310, 0.605214512832463410, -0.605174708954430600, 0.605134903563460890, 0.605095096659654000, 0.605055288243109060, 0.605015478313926210, 0.604975666872204720, 0.604935853918043940, 0.604896039451543240, -0.604856223472802880, 0.604816405981921880, 0.604776586978999830, 0.604736766464135990, 0.604696944437430610, 0.604657120898982820, 0.604617295848892340, 0.604577469287258200, -0.604537641214180630, 0.604497811629759130, 0.604457980534092610, 0.604418147927281660, 0.604378313809425190, 0.604338478180622920, 0.604298641040974190, 0.604258802390579160, -0.604218962229537190, 0.604179120557947760, 0.604139277375910220, 0.604099432683524840, 0.604059586480890860, 0.604019738768107880, 0.603979889545275260, 0.603940038812493140, -0.603900186569861110, 0.603860332817478530, 0.603820477555444660, 0.603780620783860080, 0.603740762502823940, 0.603700902712435480, 0.603661041412795200, 0.603621178604002220, -0.603581314286156360, 0.603541448459356870, 0.603501581123704110, 0.603461712279297350, 0.603421841926236270, 0.603381970064620350, 0.603342096694549750, 0.603302221816124030, -0.603262345429442680, 0.603222467534605070, 0.603182588131711770, 0.603142707220861940, 0.603102824802155270, 0.603062940875691230, 0.603023055441570200, 0.602983168499891530, -0.602943280050754930, 0.602903390094259860, 0.602863498630506590, 0.602823605659594590, 0.602783711181623220, 0.602743815196692960, 0.602703917704903060, 0.602664018706353440, -0.602624118201143370, 0.602584216189373410, 0.602544312671142950, 0.602504407646551670, 0.602464501115698940, 0.602424593078685460, 0.602384683535610370, 0.602344772486573590, -0.602304859931674600, 0.602264945871013760, 0.602225030304690550, 0.602185113232804770, 0.602145194655455910, 0.602105274572744320, 0.602065352984769600, 0.602025429891631100, -0.601985505293429420, 0.601945579190264040, 0.601905651582234640, 0.601865722469440700, 0.601825791851982930, 0.601785859729960570, 0.601745926103473660, 0.601705990972621560, -0.601666054337504750, 0.601626116198222820, 0.601586176554875670, 0.601546235407562690, 0.601506292756384560, 0.601466348601440550, 0.601426402942830780, 0.601386455780654640, -0.601346507115012700, 0.601306556946004430, 0.601266605273729440, 0.601226652098288290, 0.601186697419780590, 0.601146741238306030, 0.601106783553964410, 0.601066824366856100, -0.601026863677080690, 0.600986901484738210, 0.600946937789928030, 0.600906972592750940, 0.600867005893306330, 0.600827037691694210, 0.600787067988014290, 0.600747096782366930, -0.600707124074851830, 0.600667149865568910, 0.600627174154617860, 0.600587196942099170, 0.600547218228112410, 0.600507238012757290, 0.600467256296134510, 0.600427273078343540, -0.600387288359484410, 0.600347302139656700, 0.600307314418961010, 0.600267325197497150, 0.600227334475364920, 0.600187342252664010, 0.600147348529495030, 0.600107353305957770, -0.600067356582152040, 0.600027358358177660, 0.599987358634135210, 0.599947357410124390, 0.599907354686245120, 0.599867350462597090, 0.599827344739281120, 0.599787337516396680, -0.599747328794044020, 0.599707318572322620, 0.599667306851333290, 0.599627293631175730, 0.599587278911949520, 0.599547262693755470, 0.599507244976693280, 0.599467225760862980, -0.599427205046364260, 0.599387182833297840, 0.599347159121763510, 0.599307133911861300, 0.599267107203690920, 0.599227078997353060, 0.599187049292947530, 0.599147018090574360, -0.599106985390333360, 0.599066951192325230, 0.599026915496649660, 0.598986878303406800, 0.598946839612696460, 0.598906799424619330, 0.598866757739275220, 0.598826714556763840, -0.598786669877185980, 0.598746623700641580, 0.598706576027230540, 0.598666526857052680, 0.598626476190208920, 0.598586424026798960, 0.598546370366922930, 0.598506315210680540, -0.598466258558172810, 0.598426200409499450, 0.598386140764760490, 0.598346079624055950, 0.598306016987486420, 0.598265952855151940, 0.598225887227152640, 0.598185820103588120, -0.598145751484559510, 0.598105681370166510, 0.598065609760508930, 0.598025536655687700, 0.597985462055802610, 0.597945385960953810, 0.597905308371241230, 0.597865229286765780, -0.597825148707627260, 0.597785066633925830, 0.597744983065761400, 0.597704898003234790, 0.597664811446446010, 0.597624723395495220, 0.597584633850482220, 0.597544542811508040, -0.597504450278672490, 0.597464356252075720, 0.597424260731817870, 0.597384163717999630, 0.597344065210720920, 0.597303965210082110, 0.597263863716183120, 0.597223760729124640, -0.597183656249006930, 0.597143550275929580, 0.597103442809993830, 0.597063333851299390, 0.597023223399946730, 0.596983111456035550, 0.596942998019666990, 0.596902883090940860, -0.596862766669957630, 0.596822648756817120, 0.596782529351620240, 0.596742408454467130, 0.596702286065457940, 0.596662162184692700, 0.596622036812272440, 0.596581909948297070, -0.596541781592866970, 0.596501651746081940, 0.596461520408043230, 0.596421387578850770, 0.596381253258604360, 0.596341117447405260, 0.596300980145353380, 0.596260841352548980, -0.596220701069092080, 0.596180559295083960, 0.596140416030624290, 0.596100271275813660, 0.596060125030751900, 0.596019977295540240, 0.595979828070278720, 0.595939677355067480, -0.595899525150006770, 0.595859371455197630, 0.595819216270739970, 0.595779059596734380, 0.595738901433280680, 0.595698741780480210, 0.595658580638432800, 0.595618418007238580, -0.595578253886998700, 0.595538088277813180, 0.595497921179782400, 0.595457752593006480, 0.595417582517586590, 0.595377410953622620, 0.595337237901215290, 0.595297063360464400, -0.595256887331471200, 0.595216709814335830, 0.595176530809158670, 0.595136350316039840, 0.595096168335080500, 0.595055984866380670, 0.595015799910040940, 0.594975613466161350, -0.594935425534843020, 0.594895236116186220, 0.594855045210291310, 0.594814852817258320, 0.594774658937188730, 0.594734463570182340, 0.594694266716339510, 0.594654068375761400, -0.594613868548548030, 0.594573667234800100, 0.594533464434617520, 0.594493260148101780, 0.594453054375352790, 0.594412847116471130, 0.594372638371557070, 0.594332428140711740, -0.594292216424035400, 0.594252003221628520, 0.594211788533591130, 0.594171572360024710, 0.594131354701029400, 0.594091135556705670, 0.594050914927153780, 0.594010692812474980, -0.593970469212769410, 0.593930244128137220, 0.593890017558679870, 0.593849789504497520, 0.593809559965690630, 0.593769328942359450, 0.593729096434605360, 0.593688862442528500, -0.593648626966229550, 0.593608390005808560, 0.593568151561367000, 0.593527911633005110, 0.593487670220823380, 0.593447427324922170, 0.593407182945402730, 0.593366937082365320, -0.593326689735910630, 0.593286440906138800, 0.593246190593151200, 0.593205938797048190, 0.593165685517929920, 0.593125430755897850, 0.593085174511052140, 0.593044916783493580, -0.593004657573322320, 0.592964396880639730, 0.592924134705546170, 0.592883871048142330, 0.592843605908528360, 0.592803339286805840, 0.592763071183074920, 0.592722801597436290, -0.592682530529990310, 0.592642257980838360, 0.592601983950080900, 0.592561708437818300, 0.592521431444151150, 0.592481152969180800, 0.592440873013007520, 0.592400591575731660, -0.592360308657454810, 0.592320024258277120, 0.592279738378299390, 0.592239451017621880, 0.592199162176346160, 0.592158871854572500, 0.592118580052401700, 0.592078286769934130, -0.592037992007271140, 0.591997695764513110, 0.591957398041760950, 0.591917098839114920, 0.591876798156676490, 0.591836495994546020, 0.591796192352824320, 0.591755887231611880, -0.591715580631009930, 0.591675272551119180, 0.591634962992040100, 0.591594651953873400, 0.591554339436720310, 0.591514025440681430, 0.591473709965857130, 0.591433393012348870, -0.591393074580257250, 0.591352754669682850, 0.591312433280726140, 0.591272110413488820, 0.591231786068071140, 0.591191460244574030, 0.591151132943097960, 0.591110804163744400, -0.591070473906613710, 0.591030142171806940, 0.590989808959424550, 0.590949474269567790, 0.590909138102337470, 0.590868800457834300, 0.590828461336158740, 0.590788120737412380, -0.590747778661695810, 0.590707435109109280, 0.590667090079754600, 0.590626743573732240, 0.590586395591143010, 0.590546046132087390, 0.590505695196666960, 0.590465342784982420, -0.590424988897134460, 0.590384633533223680, 0.590344276693351660, 0.590303918377618860, 0.590263558586126450, 0.590223197318974660, 0.590182834576265300, 0.590142470358098750, -0.590102104664576130, 0.590061737495797820, 0.590021368851865620, 0.589980998732879900, 0.589940627138941350, 0.589900254070151680, 0.589859879526611230, 0.589819503508421160, -0.589779126015681940, 0.589738747048495380, 0.589698366606961840, 0.589657984691182360, 0.589617601301257620, 0.589577216437289220, 0.589536830099377740, 0.589496442287624320, -0.589456053002129330, 0.589415662242994580, 0.589375270010320640, 0.589334876304208550, 0.589294481124758910, 0.589254084472073500, 0.589213686346252820, 0.589173286747397880, -0.589132885675609400, 0.589092483130989050, 0.589052079113637550, 0.589011673623655470, 0.588971266661144520, 0.588930858226205390, 0.588890448318939220, 0.588850036939446490, -0.588809624087829000, 0.588769209764187560, 0.588728793968622990, 0.588688376701236080, 0.588647957962128650, 0.588607537751401290, 0.588567116069155130, 0.588526692915490760, -0.588486268290510100, 0.588445842194313730, 0.588405414627002690, 0.588364985588677780, 0.588324555079440810, 0.588284123099392490, 0.588243689648633380, 0.588203254727265530, -0.588162818335389410, 0.588122380473106390, 0.588081941140516930, 0.588041500337723070, 0.588001058064825390, 0.587960614321925150, 0.587920169109122930, 0.587879722426520650, -0.587839274274219110, 0.587798824652319360, 0.587758373560922200, 0.587717921000129540, 0.587677466970041970, 0.587637011470760750, 0.587596554502386680, 0.587556096065021570, -0.587515636158766230, 0.587475174783721350, 0.587434711939988970, 0.587394247627669900, 0.587353781846865040, 0.587313314597675440, 0.587272845880202900, 0.587232375694548340, -0.587191904040812670, 0.587151430919097050, 0.587110956329503160, 0.587070480272131820, 0.587030002747084280, 0.586989523754461450, 0.586949043294365150, 0.586908561366896180, -0.586868077972155900, 0.586827593110245020, 0.586787106781265440, 0.586746618985318210, 0.586706129722504020, 0.586665638992924900, 0.586625146796681650, 0.586584653133875530, -0.586544158004607460, 0.586503661408979250, 0.586463163347092030, 0.586422663819046840, 0.586382162824944600, 0.586341660364887330, 0.586301156438975850, 0.586260651047311620, -0.586220144189995240, 0.586179635867128960, 0.586139126078813580, 0.586098614825150470, 0.586058102106240320, 0.586017587922185390, 0.585977072273086370, 0.585936555159044750, -0.585896036580161320, 0.585855516536538220, 0.585814995028276390, 0.585774472055476610, 0.585733947618241050, 0.585693421716670600, 0.585652894350866540, 0.585612365520929990, -0.585571835226962770, 0.585531303469066120, 0.585490770247341090, 0.585450235561888800, 0.585409699412811290, 0.585369161800209590, 0.585328622724184840, 0.585288082184838300, -0.585247540182271870, 0.585206996716586600, 0.585166451787883850, 0.585125905396264630, 0.585085357541831000, 0.585044808224683850, 0.585004257444924460, 0.584963705202654730, -0.584923151497975800, 0.584882596330988940, 0.584842039701795270, 0.584801481610496720, 0.584760922057194650, 0.584720361041990210, 0.584679798564984420, 0.584639234626279650, -0.584598669225976700, 0.584558102364177050, 0.584517534040981830, 0.584476964256493090, 0.584436393010812070, 0.584395820304039910, 0.584355246136277980, 0.584314670507628200, -0.584274093418191810, 0.584233514868069740, 0.584192934857364230, 0.584152353386176440, 0.584111770454607830, 0.584071186062759320, 0.584030600210733280, 0.583990012898630730, -0.583949424126553150, 0.583908833894601580, 0.583868242202878360, 0.583827649051484540, 0.583787054440521590, 0.583746458370090540, 0.583705860840293860, 0.583665261851232460, -0.583624661403007840, 0.583584059495721340, 0.583543456129475000, 0.583502851304369960, 0.583462245020507810, 0.583421637277989680, 0.583381028076917940, 0.583340417417393510, -0.583299805299517750, 0.583259191723392690, 0.583218576689119810, 0.583177960196800460, 0.583137342246535790, 0.583096722838428170, 0.583056101972578730, 0.583015479649089060, -0.582974855868060300, 0.582934230629594710, 0.582893603933793640, 0.582852975780758560, 0.582812346170590630, 0.582771715103392210, 0.582731082579264430, 0.582690448598309100, -0.582649813160627140, 0.582609176266321030, 0.582568537915492010, 0.582527898108241350, 0.582487256844671290, 0.582446614124882970, 0.582405969948978200, 0.582365324317058120, -0.582324677229225210, 0.582284028685580490, 0.582243378686225670, 0.582202727231262100, 0.582162074320792030, 0.582121419954916840, 0.582080764133738100, 0.582040106857356960, -0.581999448125876010, 0.581958787939396480, 0.581918126298019980, 0.581877463201847740, 0.581836798650982260, 0.581796132645524660, 0.581755465185576530, 0.581714796271240010, -0.581674125902616470, 0.581633454079807710, 0.581592780802914880, 0.581552106072040440, 0.581511429887285880, 0.581470752248752550, 0.581430073156542160, 0.581389392610756840, -0.581348710611498070, 0.581308027158867540, 0.581267342252966500, 0.581226655893897550, 0.581185968081761930, 0.581145278816661340, 0.581104588098697250, 0.581063895927972030, -0.581023202304587150, 0.580982507228643860, 0.580941810700244640, 0.580901112719490850, 0.580860413286484300, 0.580819712401326350, 0.580779010064119580, 0.580738306274965250, -0.580697601033965060, 0.580656894341220590, 0.580616186196834190, 0.580575476600907360, 0.580534765553541890, 0.580494053054839030, 0.580453339104901490, 0.580412623703830620, -0.580371906851728130, 0.580331188548695480, 0.580290468794835260, 0.580249747590248940, 0.580209024935038120, 0.580168300829304480, 0.580127575273150400, 0.580086848266677450, -0.580046119809986880, 0.580005389903181510, 0.579964658546362590, 0.579923925739632030, 0.579883191483091310, 0.579842455776843010, 0.579801718620988500, 0.579760980015629700, -0.579720239960868080, 0.579679498456806330, 0.579638755503545710, 0.579598011101188250, 0.579557265249835420, 0.579516517949589800, 0.579475769200552880, 0.579435019002826460, -0.579394267356512230, 0.579353514261712670, 0.579312759718529250, 0.579272003727063670, 0.579231246287418400, 0.579190487399695030, 0.579149727063995370, 0.579108965280421110, -0.579068202049074720, 0.579027437370057910, 0.578986671243472470, 0.578945903669420000, 0.578905134648003080, 0.578864364179323410, 0.578823592263482790, 0.578782818900582810, -0.578742044090726160, 0.578701267834014430, 0.578660490130549540, 0.578619710980432970, 0.578578930383767620, 0.578538148340654870, 0.578497364851196290, 0.578456579915494820, -0.578415793533651800, 0.578375005705769380, 0.578334216431949040, 0.578293425712293470, 0.578252633546904370, 0.578211839935883760, 0.578171044879333130, 0.578130248377355160, -0.578089450430051670, 0.578048651037524560, 0.578007850199875440, 0.577967047917207100, 0.577926244189621130, 0.577885439017219450, 0.577844632400103860, 0.577803824338377070, -0.577763014832140760, 0.577722203881496870, 0.577681391486547180, 0.577640577647394290, 0.577599762364139900, 0.577558945636885810, 0.577518127465734830, 0.577477307850788320, -0.577436486792148650, 0.577395664289917400, 0.577354840344197370, 0.577314014955090270, 0.577273188122698010, 0.577232359847122510, 0.577191530128466470, 0.577150698966831580, -0.577109866362319980, 0.577069032315033260, 0.577028196825074450, 0.576987359892545020, 0.576946521517547330, 0.576905681700182860, 0.576864840440554530, 0.576823997738764250, -0.576783153594913500, 0.576742308009105200, 0.576701460981441150, 0.576660612512023500, 0.576619762600953930, 0.576578911248335380, 0.576538058454269420, 0.576497204218858420, -0.576456348542203960, 0.576415491424409070, 0.576374632865575440, 0.576333772865805230, 0.576292911425200230, 0.576252048543863250, 0.576211184221896210, 0.576170318459401140, -0.576129451256479960, 0.576088582613235590, 0.576047712529769610, 0.576006841006184160, 0.575965968042581820, 0.575925093639064630, 0.575884217795734730, 0.575843340512693810, -0.575802461790045020, 0.575761581627890040, 0.575720700026331130, 0.575679816985469990, 0.575638932505409760, 0.575598046586252240, 0.575557159228099580, 0.575516270431053580, -0.575475380195217380, 0.575434488520692680, 0.575393595407581730, 0.575352700855986440, 0.575311804866009860, 0.575270907437753660, 0.575230008571319780, 0.575189108266811360, -0.575148206524330070, 0.575107303343978420, 0.575066398725857960, 0.575025492670071970, 0.574984585176722240, 0.574943676245911030, 0.574902765877740360, 0.574861854072313050, -0.574820940829731120, 0.574780026150096820, 0.574739110033512080, 0.574698192480079920, 0.574657273489902360, 0.574616353063081560, 0.574575431199719540, 0.574534507899919220, -0.574493583163782740, 0.574452656991412240, 0.574411729382909740, 0.574370800338378280, 0.574329869857919890, 0.574288937941636380, 0.574248004589630880, 0.574207069802005420, -0.574166133578862260, 0.574125195920303420, 0.574084256826431940, 0.574043316297349840, 0.574002374333159480, 0.573961430933962680, 0.573920486099862790, 0.573879539830961630, -0.573838592127361660, 0.573797642989164910, 0.573756692416474310, 0.573715740409391990, 0.573674786968020320, 0.573633832092461330, 0.573592875782818150, 0.573551918039192810, -0.573510958861687240, 0.573469998250404680, 0.573429036205447050, 0.573388072726916940, 0.573347107814916160, 0.573306141469548060, 0.573265173690914560, 0.573224204479118150, -0.573183233834260950, 0.573142261756445890, 0.573101288245775220, 0.573060313302351410, 0.573019336926276380, 0.572978359117653380, 0.572937379876584440, 0.572896399203172150, -0.572855417097518420, 0.572814433559726500, 0.572773448589898540, 0.572732462188136560, 0.572691474354543820, 0.572650485089222450, 0.572609494392274820, 0.572568502263803070, -0.572527508703910450, 0.572486513712698990, 0.572445517290271270, 0.572404519436729430, 0.572363520152176730, 0.572322519436715080, 0.572281517290447180, 0.572240513713475170, -0.572199508705902190, 0.572158502267830490, 0.572117494399362550, 0.572076485100600380, 0.572035474371647480, 0.571994462212605860, 0.571953448623578110, 0.571912433604666370, -0.571871417155973890, 0.571830399277602820, 0.571789379969655510, 0.571748359232234990, 0.571707337065443630, 0.571666313469383900, 0.571625288444158050, 0.571584261989869340, -0.571543234106620000, 0.571502204794512520, 0.571461174053649270, 0.571420141884133370, 0.571379108286067080, 0.571338073259553100, 0.571297036804693460, 0.571255998921591730, -0.571214959610349850, 0.571173918871070720, 0.571132876703856370, 0.571091833108810180, 0.571050788086034380, 0.571009741635631340, 0.570968693757704200, 0.570927644452355440, -0.570886593719687420, 0.570845541559802720, 0.570804487972804480, 0.570763432958794950, 0.570722376517876830, 0.570681318650152480, 0.570640259355725150, 0.570599198634697210, -0.570558136487171240, 0.570517072913249600, 0.570476007913035650, 0.570434941486631650, 0.570393873634140290, 0.570352804355663820, 0.570311733651305830, 0.570270661521168450, -0.570229587965354060, 0.570188512983966110, 0.570147436577106760, 0.570106358744878920, 0.570065279487384720, 0.570024198804727770, 0.569983116697010290, 0.569942033164335120, -0.569900948206804370, 0.569859861824521640, 0.569818774017589290, 0.569777684786110020, 0.569736594130186180, 0.569695502049921140, 0.569654408545417380, 0.569613313616777580, -0.569572217264104230, 0.569531119487500570, 0.569490020287069190, 0.569448919662912330, 0.569407817615133590, 0.569366714143835330, 0.569325609249120230, 0.569284502931090790, -0.569243395189850450, 0.569202286025501600, 0.569161175438147040, 0.569120063427889230, 0.569078949994831550, 0.569037835139076580, 0.568996718860726890, 0.568955601159885080, -0.568914482036654730, 0.568873361491138100, 0.568832239523438090, 0.568791116133657070, 0.568749991321898630, 0.568708865088265240, 0.568667737432859700, 0.568626608355784490, -0.568585477857143080, 0.568544345937037950, 0.568503212595571570, 0.568462077832847630, 0.568420941648968390, 0.568379804044036870, 0.568338665018155440, 0.568297524571427680, -0.568256382703956180, 0.568215239415843620, 0.568174094707192710, 0.568132948578106810, 0.568091801028688610, 0.568050652059040930, 0.568009501669266230, 0.567968349859468200, -0.567927196629749220, 0.567886041980212310, 0.567844885910959830, 0.567803728422095590, 0.567762569513721950, 0.567721409185941610, 0.567680247438858030, 0.567639084272573920, -0.567597919687192090, 0.567556753682815000, 0.567515586259546460, 0.567474417417488940, 0.567433247156745370, 0.567392075477418320, 0.567350902379611500, 0.567309727863427370, -0.567268551928968970, 0.567227374576338760, 0.567186195805640450, 0.567145015616976720, 0.567103834010450500, 0.567062650986164260, 0.567021466544221700, 0.566980280684725610, -0.566939093407778370, 0.566897904713483780, 0.566856714601944420, 0.566815523073263220, 0.566774330127542970, 0.566733135764887150, 0.566691939985398570, 0.566650742789180040, -0.566609544176334360, 0.566568344146965220, 0.566527142701175210, 0.566485939839067250, 0.566444735560744150, 0.566403529866309600, 0.566362322755866180, 0.566321114229517030, -0.566279904287364630, 0.566238692929512900, 0.566197480156064300, 0.566156265967122210, 0.566115050362788970, 0.566073833343168410, 0.566032614908363430, 0.565991395058476400, -0.565950173793611340, 0.565908951113870850, 0.565867727019357950, 0.565826501510175330, 0.565785274586426800, 0.565744046248215170, 0.565702816495643360, 0.565661585328814280, -0.565620352747831400, 0.565579118752797760, 0.565537883343816270, 0.565496646520989740, 0.565455408284421980, 0.565414168634215670, 0.565372927570473970, 0.565331685093299560, -0.565290441202796370, 0.565249195899066970, 0.565207949182214290, 0.565166701052342010, 0.565125451509553070, 0.565084200553950480, 0.565042948185636940, 0.565001694404716480, -0.564960439211291800, 0.564919182605466030, 0.564877924587341870, 0.564836665157023350, 0.564795404314613060, 0.564754142060214350, 0.564712878393929920, 0.564671613315863570, -0.564630346826118230, 0.564589078924797040, 0.564547809612002790, 0.564506538887839420, 0.564465266752409600, 0.564423993205816270, 0.564382718248163440, 0.564341441879553710, -0.564300164100090430, 0.564258884909876300, 0.564217604309015350, 0.564176322297610390, 0.564135038875764660, 0.564093754043580970, 0.564052467801163250, 0.564011180148614290, -0.563969891086037460, 0.563928600613535560, 0.563887308731212400, 0.563846015439171120, 0.563804720737514750, 0.563763424626346100, 0.563722127105769410, 0.563680828175887380, -0.563639527836802820, 0.563598226088619870, 0.563556922931441330, 0.563515618365370560, 0.563474312390510270, 0.563433005006964580, 0.563391696214836420, 0.563350386014229040, -0.563309074405245250, 0.563267761387989290, 0.563226446962563740, 0.563185131129072200, 0.563143813887617360, 0.563102495238303470, 0.563061175181233330, 0.563019853716510200, -0.562978530844237100, 0.562937206564517960, 0.562895880877455900, 0.562854553783154080, 0.562813225281715510, 0.562771895373244350, 0.562730564057843270, 0.562689231335615550, -0.562647897206665080, 0.562606561671094910, 0.562565224729008270, 0.562523886380508210, 0.562482546625698850, 0.562441205464683010, 0.562399862897564270, 0.562358518924445440, -0.562317173545430760, 0.562275826760623150, 0.562234478570125870, 0.562193128974042060, 0.562151777972475840, 0.562110425565530150, 0.562069071753308340, 0.562027716535913550, -0.561986359913449920, 0.561945001886020260, 0.561903642453727700, 0.561862281616676510, 0.561820919374969590, 0.561779555728710300, 0.561738190678001900, 0.561696824222948200, -0.561655456363652550, 0.561614087100218320, 0.561572716432748420, 0.561531344361347110, 0.561489970886117410, 0.561448596007162790, 0.561407219724586400, 0.561365842038492270, -0.561324462948983530, 0.561283082456163650, 0.561241700560135670, 0.561200317261003720, 0.561158932558871170, 0.561117546453840820, 0.561076158946016920, 0.561034770035502730, -0.560993379722401490, 0.560951988006816560, 0.560910594888851980, 0.560869200368610880, 0.560827804446196840, 0.560786407121712790, 0.560745008395263200, 0.560703608266951090, -0.560662206736879940, 0.560620803805153000, 0.560579399471874300, 0.560537993737147080, 0.560496586601074930, 0.560455178063760990, 0.560413768125309410, 0.560372356785823420, -0.560330944045406620, 0.560289529904161920, 0.560248114362193910, 0.560206697419605600, 0.560165279076500160, 0.560123859332981810, 0.560082438189153930, 0.560041015645119880, -0.559999591700982900, 0.559958166356847360, 0.559916739612816410, 0.559875311468993610, 0.559833881925482220, 0.559792450982386390, 0.559751018639809470, 0.559709584897855050, -0.559668149756626150, 0.559626713216227370, 0.559585275276761830, 0.559543835938333010, 0.559502395201044280, 0.559460953064999990, 0.559419509530303170, 0.559378064597057410, -0.559336618265366740, 0.559295170535334510, 0.559253721407064310, 0.559212270880659500, 0.559170818956224450, 0.559129365633862290, 0.559087910913676710, 0.559046454795770980, -0.559004997280249440, 0.558963538367215460, 0.558922078056772630, 0.558880616349024200, 0.558839153244074630, 0.558797688742027180, 0.558756222842985540, 0.558714755547052970, -0.558673286854333820, 0.558631816764931450, 0.558590345278949240, 0.558548872396491540, 0.558507398117661590, 0.558465922442563210, 0.558424445371299650, 0.558382966903975260, -0.558341487040693530, 0.558300005781558030, 0.558258523126672230, 0.558217039076140400, 0.558175553630065990, 0.558134066788552820, 0.558092578551703910, 0.558051088919624070, -0.558009597892416440, 0.557968105470184830, 0.557926611653032590, 0.557885116441064310, 0.557843619834383020, 0.557802121833092410, 0.557760622437296960, 0.557719121647099800, -0.557677619462604970, 0.557636115883915600, 0.557594610911136380, 0.557553104544370680, 0.557511596783722090, 0.557470087629294290, 0.557428577081191530, 0.557387065139517300, -0.557345551804375510, 0.557304037075869400, 0.557262520954103560, 0.557221003439181460, 0.557179484531206910, 0.557137964230283170, 0.557096442536514910, 0.557054919450005630, -0.557013394970858890, 0.556971869099178510, 0.556930341835068620, 0.556888813178633040, 0.556847283129974890, 0.556805751689198990, 0.556764218856408810, 0.556722684631707930, -0.556681149015200050, 0.556639612006989640, 0.556598073607180170, 0.556556533815875550, 0.556514992633179270, 0.556473450059195800, 0.556431906094028710, 0.556390360737781920, -0.556348813990558800, 0.556307265852464040, 0.556265716323601110, 0.556224165404073930, 0.556182613093985870, 0.556141059393441720, 0.556099504302544960, 0.556057947821398950, -0.556016389950108600, 0.555974830688777180, 0.555933270037508700, 0.555891707996406640, 0.555850144565575690, 0.555808579745119320, 0.555767013535141690, 0.555725445935746020, -0.555683876947037140, 0.555642306569118500, 0.555600734802094150, 0.555559161646067560, 0.555517587101143520, 0.555476011167425400, 0.555434433845017340, 0.555392855134022810, -0.555351275034546510, 0.555309693546692020, 0.555268110670562920, 0.555226526406263910, 0.555184940753898570, 0.555143353713570930, 0.555101765285384460, 0.555060175469443970, -0.555018584265853040, 0.554976991674715700, 0.554935397696135540, 0.554893802330217120, 0.554852205577064270, 0.554810607436780900, 0.554769007909470700, 0.554727406995238260, -0.554685804694187380, 0.554644201006421980, 0.554602595932045640, 0.554560989471163170, 0.554519381623878370, 0.554477772390294940, 0.554436161770516800, 0.554394549764648640, -0.554352936372794040, 0.554311321595056810, 0.554269705431541640, 0.554228087882352120, 0.554186468947592490, 0.554144848627366240, 0.554103226921778270, 0.554061603830932280, -0.554019979354932190, 0.553978353493881800, 0.553936726247885920, 0.553895097617048250, 0.553853467601472800, 0.553811836201263290, 0.553770203416524610, 0.553728569247360360, -0.553686933693874780, 0.553645296756171360, 0.553603658434355220, 0.553562018728529840, 0.553520377638799020, 0.553478735165267690, 0.553437091308039530, 0.553395446067218580, -0.553353799442908740, 0.553312151435214730, 0.553270502044240330, 0.553228851270089580, 0.553187199112866510, 0.553145545572675700, 0.553103890649621070, 0.553062234343806640, -0.553020576655336330, 0.552978917584314940, 0.552937257130846290, 0.552895595295034400, 0.552853932076983190, 0.552812267476797570, 0.552770601494581240, 0.552728934130438110, -0.552687265384472880, 0.552645595256789580, 0.552603923747492230, 0.552562250856684760, 0.552520576584472070, 0.552478900930957860, 0.552437223896246390, 0.552395545480441560, -0.552353865683648190, 0.552312184505970080, 0.552270501947511590, 0.552228818008376530, 0.552187132688669700, 0.552145445988495130, 0.552103757907956850, 0.552062068447158880, -0.552020377606206040, 0.551978685385202340, 0.551936991784251480, 0.551895296803458610, 0.551853600442927420, 0.551811902702762260, 0.551770203583066940, 0.551728503083946500, -0.551686801205504730, 0.551645097947846110, 0.551603393311074220, 0.551561687295294310, 0.551519979900610190, 0.551478271127126110, 0.551436560974945980, 0.551394849444174720, -0.551353136534916470, 0.551311422247275250, 0.551269706581355210, 0.551227989537261260, 0.551186271115097330, 0.551144551314967760, 0.551102830136976360, 0.551061107581228280, -0.551019383647827430, 0.550977658336877730, 0.550935931648484310, 0.550894203582751100, 0.550852474139782330, 0.550810743319681940, 0.550769011122555160, 0.550727277548505810, -0.550685542597638240, 0.550643806270056490, 0.550602068565865580, 0.550560329485169530, 0.550518589028072600, 0.550476847194678820, 0.550435103985093320, 0.550393359399420020, -0.550351613437763400, 0.550309866100227360, 0.550268117386916940, 0.550226367297936390, 0.550184615833389400, 0.550142862993381330, 0.550101108778015990, 0.550059353187397960, -0.550017596221631160, 0.549975837880820830, 0.549934078165070780, 0.549892317074485600, 0.549850554609169210, 0.549808790769226840, 0.549767025554762530, 0.549725258965880650, -0.549683491002685210, 0.549641721665281360, 0.549599950953773230, 0.549558178868265300, 0.549516405408861490, 0.549474630575667140, 0.549432854368786080, 0.549391076788322550, -0.549349297834381690, 0.549307517507067630, 0.549265735806484750, 0.549223952732737160, 0.549182168285930140, 0.549140382466167590, 0.549098595273554090, 0.549056806708193790, -0.549015016770191820, 0.548973225459652330, 0.548931432776679770, 0.548889638721378190, 0.548847843293852940, 0.548806046494208060, 0.548764248322548110, 0.548722448778977130, -0.548680647863600380, 0.548638845576522090, 0.548597041917846640, 0.548555236887678150, 0.548513430486122000, 0.548471622713282310, 0.548429813569263120, 0.548388003054169790, -0.548346191168106460, 0.548304377911177700, 0.548262563283487550, 0.548220747285141470, 0.548178929916243400, 0.548137111176898010, 0.548095291067209560, 0.548053469587283180, -0.548011646737223130, 0.547969822517134000, 0.547927996927119910, 0.547886169967286230, 0.547844341637737100, 0.547802511938577210, 0.547760680869910590, 0.547718848431842600, -0.547677014624477490, 0.547635179447919510, 0.547593342902274020, 0.547551504987645040, 0.547509665704137390, 0.547467825051855210, 0.547425983030903840, 0.547384139641387430, -0.547342294883410680, 0.547300448757077950, 0.547258601262494370, 0.547216752399764310, 0.547174902168992340, 0.547133050570282720, 0.547091197603740920, 0.547049343269471080, -0.547007487567577890, 0.546965630498165600, 0.546923772061339690, 0.546881912257204280, 0.546840051085863640, 0.546798188547423350, 0.546756324641987530, 0.546714459369661010, -0.546672592730547910, 0.546630724724753600, 0.546588855352382550, 0.546546984613539450, 0.546505112508328450, 0.546463239036855010, 0.546421364199223490, 0.546379487995538590, -0.546337610425904560, 0.546295731490426870, 0.546253851189209880, 0.546211969522358180, 0.546170086489976340, 0.546128202092169500, 0.546086316329042250, 0.546044429200699180, -0.546002540707244630, 0.545960650848784200, 0.545918759625422020, 0.545876867037262680, 0.545834973084411530, 0.545793077766972940, 0.545751181085051610, 0.545709283038751990, -0.545667383628179460, 0.545625482853438590, 0.545583580714633980, 0.545541677211869970, 0.545499772345252150, 0.545457866114885000, 0.545415958520873100, 0.545374049563321030, -0.545332139242334040, 0.545290227558016820, 0.545248314510474060, 0.545206400099810030, 0.545164484326130520, 0.545122567189539660, 0.545080648690142060, 0.545038728828043270, -0.544996807603347570, 0.544954885016159850, 0.544912961066584600, 0.544871035754727280, 0.544829109080692490, 0.544787181044584790, 0.544745251646508780, 0.544703320886570030, -0.544661388764873020, 0.544619455281522450, 0.544577520436623000, 0.544535584230280030, 0.544493646662598030, 0.544451707733682010, 0.544409767443636340, 0.544367825792566710, -0.544325882780577360, 0.544283938407773000, 0.544241992674259210, 0.544200045580140350, 0.544158097125521430, 0.544116147310506950, 0.544074196135202360, 0.544032243599712360, -0.543990289704141650, 0.543948334448594920, 0.543906377833177750, 0.543864419857994610, 0.543822460523150420, 0.543780499828749650, 0.543738537774898110, 0.543696574361700160, -0.543654609589260820, 0.543612643457684560, 0.543570675967076980, 0.543528707117542860, 0.543486736909186470, 0.543444765342113720, 0.543402792416428970, 0.543360818132237240, -0.543318842489643130, 0.543276865488752310, 0.543234887129669270, 0.543192907412499040, 0.543150926337346180, 0.543108943904316410, 0.543066960113514190, 0.543024974965044650, -0.542982988459012270, 0.542941000595522750, 0.542899011374680770, 0.542857020796591260, 0.542815028861358790, 0.542773035569089180, 0.542731040919887000, 0.542689044913857170, -0.542647047551104380, 0.542605048831734330, 0.542563048755851600, 0.542521047323560990, 0.542479044534968090, 0.542437040390177480, 0.542395034889294410, 0.542353028032423250, -0.542311019819670000, 0.542269010251139160, 0.542226999326935850, 0.542184987047164560, 0.542142973411931290, 0.542100958421340540, 0.542058942075497320, 0.542016924374506440, -0.541974905318473700, 0.541932884907503580, 0.541890863141701320, 0.541848840021171400, 0.541806815546019840, 0.541764789716351340, 0.541722762532270360, 0.541680733993882950, -0.541638704101293560, 0.541596672854607550, 0.541554640253929410, 0.541512606299365040, 0.541470570991019140, 0.541428534328996850, 0.541386496313402850, 0.541344456944343080, -0.541302416221921990, 0.541260374146244950, 0.541218330717416650, 0.541176285935542790, 0.541134239800728280, 0.541092192313078150, 0.541050143472697200, 0.541008093279691240, -0.540966041734165070, 0.540923988836223390, 0.540881934585972110, 0.540839878983515930, 0.540797822028960210, 0.540755763722409410, 0.540713704063969680, 0.540671643053745600, -0.540629580691842530, 0.540587516978365050, 0.540545451913419180, 0.540503385497109630, 0.540461317729541650, 0.540419248610820020, 0.540377178141050680, 0.540335106320338320, -0.540293033148788180, 0.540250958626505180, 0.540208882753595130, 0.540166805530162830, 0.540124726956313530, 0.540082647032152030, 0.540040565757784250, 0.539998483133315110, -0.539956399158849410, 0.539914313834493060, 0.539872227160350880, 0.539830139136528220, 0.539788049763129770, 0.539745959040261680, 0.539703866968028520, 0.539661773546535770, -0.539619678775888230, 0.539577582656191930, 0.539535485187551570, 0.539493386370072490, 0.539451286203859630, 0.539409184689018990, 0.539367081825655290, 0.539324977613873880, -0.539282872053779670, 0.539240765145478700, 0.539198656889075760, 0.539156547284675770, 0.539114436332384870, 0.539072324032307870, 0.539030210384550010, 0.538988095389216330, -0.538945979046412730, 0.538903861356244130, 0.538861742318816010, 0.538819621934233050, 0.538777500202601400, 0.538735377124026080, 0.538693252698612230, 0.538651126926465000, -0.538608999807690280, 0.538566871342393010, 0.538524741530678530, 0.538482610372651880, 0.538440477868419090, 0.538398344018085060, 0.538356208821754830, 0.538314072279534540, -0.538271934391528980, 0.538229795157843530, 0.538187654578583310, 0.538145512653854240, 0.538103369383761470, 0.538061224768410230, 0.538019078807905560, 0.537976931502353590, -0.537934782851859250, 0.537892632856528000, 0.537850481516464750, 0.537808328831775760, 0.537766174802565830, 0.537724019428940550, 0.537681862711004820, 0.537639704648864790, -0.537597545242625490, 0.537555384492392040, 0.537513222398270370, 0.537471058960365730, 0.537428894178783480, 0.537386728053628530, 0.537344560585007120, 0.537302391773024410, -0.537260221617785640, 0.537218050119396050, 0.537175877277961570, 0.537133703093587430, 0.537091527566379120, 0.537049350696441550, 0.537007172483880970, 0.536964992928802510, -0.536922812031311540, 0.536880629791513190, 0.536838446209513600, 0.536796261285417910, 0.536754075019331480, 0.536711887411359560, 0.536669698461608390, 0.536627508170182900, -0.536585316537188220, 0.536543123562730600, 0.536500929246915280, 0.536458733589847530, 0.536416536591632690, 0.536374338252376790, 0.536332138572185090, 0.536289937551163050, -0.536247735189415710, 0.536205531487049520, 0.536163326444169420, 0.536121120060881080, 0.536078912337289550, 0.536036703273501060, 0.535994492869620860, 0.535952281125754330, -0.535910068042006800, 0.535867853618484550, 0.535825637855292580, 0.535783420752536150, 0.535741202310321520, 0.535698982528753920, 0.535656761407938830, 0.535614538947981500, -0.535572315148988180, 0.535530090011064000, 0.535487863534314770, 0.535445635718845400, 0.535403406564762260, 0.535361176072170710, 0.535318944241176100, 0.535276711071883900, -0.535234476564400150, 0.535192240718830310, 0.535150003535279860, 0.535107765013854040, 0.535065525154659110, 0.535023283957800410, 0.534981041423383210, 0.534938797551513630, -0.534896552342297160, 0.534854305795839260, 0.534812057912245290, 0.534769808691621380, 0.534727558134073130, 0.534685306239705890, 0.534643053008625020, 0.534600798440937000, -0.534558542536746840, 0.534516285296160350, 0.534474026719282790, 0.534431766806220620, 0.534389505557078980, 0.534347242971963570, 0.534304979050979620, 0.534262713794233620, -0.534220447201830930, 0.534178179273877010, 0.534135910010477330, 0.534093639411738260, 0.534051367477765050, 0.534009094208663050, 0.533966819604538620, 0.533924543665497240, -0.533882266391644490, 0.533839987783085720, 0.533797707839927300, 0.533755426562274700, 0.533713143950233390, 0.533670860003908950, 0.533628574723407740, 0.533586288108835020, -0.533544000160296680, 0.533501710877897880, 0.533459420261745200, 0.533417128311943990, 0.533374835028599950, 0.533332540411818430, 0.533290244461705920, 0.533247947178367880, -0.533205648561909550, 0.533163348612437420, 0.533121047330057050, 0.533078744714873930, 0.533036440766993640, 0.532994135486522640, 0.532951828873566180, 0.532909520928230300, -0.532867211650620120, 0.532824901040842350, 0.532782589099002330, 0.532740275825205890, 0.532697961219558260, 0.532655645282166250, 0.532613328013134990, 0.532571009412570520, -0.532528689480578080, 0.532486368217264250, 0.532444045622734620, 0.532401721697094430, 0.532359396440450270, 0.532317069852907720, 0.532274741934572470, 0.532232412685549880, -0.532190082105946760, 0.532147750195868460, 0.532105416955420680, 0.532063082384709010, 0.532020746483840010, 0.531978409252919170, 0.531936070692052290, 0.531893730801344830, -0.531851389580903500, 0.531809047030833650, 0.531766703151241190, 0.531724357942231500, 0.531682011403911470, 0.531639663536386250, 0.531597314339761540, 0.531554963814144020, -0.531512611959638950, 0.531470258776352460, 0.531427904264389910, 0.531385548423857990, 0.531343191254862180, 0.531300832757508390, 0.531258472931902090, 0.531216111778150090, -0.531173749296357740, 0.531131385486631080, 0.531089020349075460, 0.531046653883797790, 0.531004286090903440, 0.530961916970498330, 0.530919546522688130, 0.530877174747579340, -0.530834801645277740, 0.530792427215889040, 0.530750051459518920, 0.530707674376274090, 0.530665295966260000, 0.530622916229582350, 0.530580535166347730, 0.530538152776661830, -0.530495769060630560, 0.530453384018359510, 0.530410997649955250, 0.530368609955523600, 0.530326220935170460, 0.530283830589001300, 0.530241438917122940, 0.530199045919641070, -0.530156651596661480, 0.530114255948289980, 0.530071858974633160, 0.530029460675796700, 0.529987061051886530, 0.529944660103008450, 0.529902257829269030, 0.529859854230773970, -0.529817449307628970, 0.529775043059940610, 0.529732635487814680, 0.529690226591357230, 0.529647816370673710, 0.529605404825871150, 0.529562991957055030, 0.529520577764331370, -0.529478162247805970, 0.529435745407585530, 0.529393327243775750, 0.529350907756482520, 0.529308486945811780, 0.529266064811870220, 0.529223641354763410, 0.529181216574597490, -0.529138790471478160, 0.529096363045512330, 0.529053934296805470, 0.529011504225463500, 0.528969072831593000, 0.528926640115300000, 0.528884206076690290, 0.528841770715869690, -0.528799334032945100, 0.528756896028022120, 0.528714456701206870, 0.528672016052605160, 0.528629574082323810, 0.528587130790468480, 0.528544686177145340, 0.528502240242460060, -0.528459792986519570, 0.528417344409429670, 0.528374894511296380, 0.528332443292225510, 0.528289990752323750, 0.528247536891697230, 0.528205081710451660, 0.528162625208693170, -0.528120167386528450, 0.528077708244063300, 0.528035247781403430, 0.527992785998655960, 0.527950322895926470, 0.527907858473321110, 0.527865392730945790, 0.527822925668907320, -0.527780457287311600, 0.527737987586264670, 0.527695516565872440, 0.527653044226241820, 0.527610570567478510, 0.527568095589688870, 0.527525619292978480, 0.527483141677454470, -0.527440662743222650, 0.527398182490389170, 0.527355700919059810, 0.527313218029341610, 0.527270733821340380, 0.527228248295162020, 0.527185761450913230, 0.527143273288700140, -0.527100783808628900, 0.527058293010805310, 0.527015800895336280, 0.526973307462327840, 0.526930812711886020, 0.526888316644116950, 0.526845819259127320, 0.526803320557023170, -0.526760820537910850, 0.526718319201895930, 0.526675816549085680, 0.526633312579585900, 0.526590807293502830, 0.526548300690942270, 0.526505792772011480, 0.526463283536816040, -0.526420772985462190, 0.526378261118056630, 0.526335747934705500, 0.526293233435515040, 0.526250717620591060, 0.526208200490040690, 0.526165682043969850, 0.526123162282484680, -0.526080641205691310, 0.526038118813696780, 0.525995595106606870, 0.525953070084527960, 0.525910543747566070, 0.525868016095828120, 0.525825487129420230, 0.525782956848448560, -0.525740425253019120, 0.525697892343238940, 0.525655358119214040, 0.525612822581050470, 0.525570285728855110, 0.525527747562734130, 0.525485208082793750, 0.525442667289140020, -0.525400125181879840, 0.525357581761119460, 0.525315037026965140, 0.525272490979522780, 0.525229943618899630, 0.525187394945201610, 0.525144844958535080, 0.525102293659006180, -0.525059741046721820, 0.525017187121788020, 0.524974631884311370, 0.524932075334397790, 0.524889517472154290, 0.524846958297687130, 0.524804397811102440, 0.524761836012506480, -0.524719272902006260, 0.524676708479707820, 0.524634142745717290, 0.524591575700141810, 0.524549007343087290, 0.524506437674660320, 0.524463866694966810, 0.524421294404114110, -0.524378720802208150, 0.524336145889355400, 0.524293569665661870, 0.524250992131234720, 0.524208413286180170, 0.524165833130604610, 0.524123251664614040, 0.524080668888315840, -0.524038084801815800, 0.523995499405220610, 0.523952912698636310, 0.523910324682170140, 0.523867735355928120, 0.523825144720016400, 0.523782552774542220, 0.523739959519611610, -0.523697364955331040, 0.523654769081806750, 0.523612171899146000, 0.523569573407454690, 0.523526973606839530, 0.523484372497406540, 0.523441770079262960, 0.523399166352514930, -0.523356561317269040, 0.523313954973631310, 0.523271347321709210, 0.523228738361608660, 0.523186128093436230, 0.523143516517298070, 0.523100903633301640, 0.523058289441552860, -0.523015673942157980, 0.522973057135224240, 0.522930439020857900, 0.522887819599165530, 0.522845198870253160, 0.522802576834228150, 0.522759953491196750, 0.522717328841265540, -0.522674702884540540, 0.522632075621129120, 0.522589447051137520, 0.522546817174672330, 0.522504185991839790, 0.522461553502747140, 0.522418919707500540, 0.522376284606206660, -0.522333648198971660, 0.522291010485902980, 0.522248371467106790, 0.522205731142689640, 0.522163089512757810, 0.522120446577418520, 0.522077802336778250, 0.522035156790943030, -0.521992509940020330, 0.521949861784116290, 0.521907212323337700, 0.521864561557790600, 0.521821909487582560, 0.521779256112819720, 0.521736601433608670, 0.521693945450055870, -0.521651288162268470, 0.521608629570352920, 0.521565969674415710, 0.521523308474563300, 0.521480645970902930, 0.521437982163540980, 0.521395317052584020, 0.521352650638138400, -0.521309982920311610, 0.521267313899209770, 0.521224643574939360, 0.521181971947607630, 0.521139299017321030, 0.521096624784186170, 0.521053949248309390, 0.521011272409798050, -0.520968594268758630, 0.520925914825297600, 0.520883234079521530, 0.520840552031537670, 0.520797868681452500, 0.520755184029372600, 0.520712498075404320, 0.520669810819655240, -0.520627122262231620, 0.520584432403240150, 0.520541741242787290, 0.520499048780980410, 0.520456355017925980, 0.520413659953730230, 0.520370963588500660, 0.520328265922343820, -0.520285566955366210, 0.520242866687674280, 0.520200165119375610, 0.520157462250576570, 0.520114758081383740, 0.520072052611903810, 0.520029345842244030, 0.519986637772510860, -0.519943928402811120, 0.519901217733251260, 0.519858505763938660, 0.519815792494979780, 0.519773077926481420, 0.519730362058550050, 0.519687644891293040, 0.519644926424817080, -0.519602206659228290, 0.519559485594634380, 0.519516763231141820, 0.519474039568857290, 0.519431314607887380, 0.519388588348339450, 0.519345860790320080, 0.519303131933936070, -0.519260401779293890, 0.519217670326501010, 0.519174937575664020, 0.519132203526889600, 0.519089468180284340, 0.519046731535955820, 0.519003993594010500, 0.518961254354555090, -0.518918513817696270, 0.518875771983541510, 0.518833028852197290, 0.518790284423770510, 0.518747538698367650, 0.518704791676096290, 0.518662043357063010, 0.518619293741374170, -0.518576542829137570, 0.518533790620459570, 0.518491037115447080, 0.518448282314206590, 0.518405526216845770, 0.518362768823471210, 0.518320010134189710, 0.518277250149107750, -0.518234488868333120, 0.518191726291972190, 0.518148962420131980, 0.518106197252918950, 0.518063430790440930, 0.518020663032804250, 0.517977893980115840, 0.517935123632482400, -0.517892351990011490, 0.517849579052809820, 0.517806804820983620, 0.517764029294640940, 0.517721252473888120, 0.517678474358832190, 0.517635694949579730, 0.517592914246238430, -0.517550132248914770, 0.517507348957715770, 0.517464564372748010, 0.517421778494119300, 0.517378991321936100, 0.517336202856305440, 0.517293413097333900, 0.517250622045129170, -0.517207829699797950, 0.517165036061447040, 0.517122241130183240, 0.517079444906114240, 0.517036647389346630, 0.516993848579986980, 0.516951048478143100, 0.516908247083921580, -0.516865444397429430, 0.516822640418773350, 0.516779835148061030, 0.516737028585399050, 0.516694220730894550, 0.516651411584654110, 0.516608601146785530, 0.516565789417395500, -0.516522976396590950, 0.516480162084478560, 0.516437346481166130, 0.516394529586760460, 0.516351711401368370, 0.516308891925096550, 0.516266071158053010, 0.516223249100344230, -0.516180425752077340, 0.516137601113358930, 0.516094775184297030, 0.516051947964998090, 0.516009119455569040, 0.515966289656117460, 0.515923458566750150, 0.515880626187574240, -0.515837792518696330, 0.515794957560224310, 0.515752121312265000, 0.515709283774925310, 0.515666444948312040, 0.515623604832533000, 0.515580763427694990, 0.515537920733905140, -0.515495076751270040, 0.515452231479897600, 0.515409384919894630, 0.515366537071368150, 0.515323687934424960, 0.515280837509172970, 0.515237985795718890, 0.515195132794169400, -0.515152278504632520, 0.515109422927214840, 0.515066566062023720, 0.515023707909165740, 0.514980848468748920, 0.514937987740879950, 0.514895125725665980, 0.514852262423213910, -0.514809397833631550, 0.514766531957025600, 0.514723664793503400, 0.514680796343171650, 0.514637926606138270, 0.514595055582510060, 0.514552183272394270, 0.514509309675897590, -0.514466434793128040, 0.514423558624192310, 0.514380681169197440, 0.514337802428251110, 0.514294922401460350, 0.514252041088932300, 0.514209158490773750, 0.514166274607092740, -0.514123389437995960, 0.514080502983590760, 0.514037615243983950, 0.513994726219283440, 0.513951835909596030, 0.513908944315029090, 0.513866051435689530, 0.513823157271685040, -0.513780261823122750, 0.513737365090109810, 0.513694467072753010, 0.513651567771160500, 0.513608667185439070, 0.513565765315695530, 0.513522862162038020, 0.513479957724573330, -0.513437052003408720, 0.513394144998651210, 0.513351236710408610, 0.513308327138787930, 0.513265416283896440, 0.513222504145841030, 0.513179590724729740, 0.513136676020669480, -0.513093760033767500, 0.513050842764130820, 0.513007924211867360, 0.512965004377084030, 0.512922083259888310, 0.512879160860386870, 0.512836237178687980, 0.512793312214898540, -0.512750385969125810, 0.512707458441476690, 0.512664529632059330, 0.512621599540980630, 0.512578668168347520, 0.512535735514268120, 0.512492801578849470, 0.512449866362198800, -0.512406929864423040, 0.512363992085630330, 0.512321053025927680, 0.512278112685422340, 0.512235171064221340, 0.512192228162432820, 0.512149283980163790, 0.512106338517521410, -0.512063391774612910, 0.512020443751546320, 0.511977494448428550, 0.511934543865367080, 0.511891592002468920, 0.511848638859842110, 0.511805684437593670, 0.511762728735830730, -0.511719771754661210, 0.511676813494192360, 0.511633853954531430, 0.511590893135785540, 0.511547931038062840, 0.511504967661470240, 0.511462003006115220, 0.511419037072104790, -0.511376069859547200, 0.511333101368549370, 0.511290131599218880, 0.511247160551662640, 0.511204188225988790, 0.511161214622304570, 0.511118239740717350, 0.511075263581334040, -0.511032286144262990, 0.510989307429611240, 0.510946327437485910, 0.510903346167995040, 0.510860363621245870, 0.510817379797345760, 0.510774394696401730, 0.510731408318522260, -0.510688420663814150, 0.510645431732385080, 0.510602441524341980, 0.510559450039793190, 0.510516457278845760, 0.510473463241607140, 0.510430467928184580, 0.510387471338686230, -0.510344473473219100, 0.510301474331890880, 0.510258473914808500, 0.510215472222080410, 0.510172469253813540, 0.510129465010115580, 0.510086459491093550, 0.510043452696855800, -0.510000444627509380, 0.509957435283161510, 0.509914424663920340, 0.509871412769893120, 0.509828399601187420, 0.509785385157910390, 0.509742369440170150, 0.509699352448074070, -0.509656334181729620, 0.509613314641243930, 0.509570293826725250, 0.509527271738280940, 0.509484248376018470, 0.509441223740044970, 0.509398197830468690, 0.509355170647396990, -0.509312142190937460, 0.509269112461197100, 0.509226081458284300, 0.509183049182306390, 0.509140015633370410, 0.509096980811584830, 0.509053944717056670, 0.509010907349893740, -0.508967868710203160, 0.508924828798093310, 0.508881787613671420, 0.508838745157044970, 0.508795701428321310, 0.508752656427608810, 0.508709610155014590, 0.508666562610646470, -0.508623513794611460, 0.508580463707018040, 0.508537412347973560, 0.508494359717585500, 0.508451305815961100, 0.508408250643208940, 0.508365194199436040, 0.508322136484749780, -0.508279077499258600, 0.508236017243069770, 0.508192955716290750, 0.508149892919029120, 0.508106828851393020, 0.508063763513489920, 0.508020696905427390, 0.507977629027312800, -0.507934559879254400, 0.507891489461359650, 0.507848417773736240, 0.507805344816491310, 0.507762270589733440, 0.507719195093569890, 0.507676118328108440, 0.507633040293456240, -0.507589960989721760, 0.507546880417012460, 0.507503798575435480, 0.507460715465099520, 0.507417631086111710, 0.507374545438579740, 0.507331458522611190, 0.507288370338314200, -0.507245280885796460, 0.507202190165165430, 0.507159098176528490, 0.507116004919994200, 0.507072910395669930, 0.507029814603663480, 0.506986717544081980, 0.506943619217034120, -0.506900519622627170, 0.506857418760969010, 0.506814316632166810, 0.506771213236329340, 0.506728108573563760, 0.506685002643977870, 0.506641895447679120, 0.506598786984776010, -0.506555677255375980, 0.506512566259586290, 0.506469453997515640, 0.506426340469271260, 0.506383225674961190, 0.506340109614692560, 0.506296992288574050, 0.506253873696713040, -0.506210753839217430, 0.506167632716194470, 0.506124510327752850, 0.506081386673999930, 0.506038261755043520, 0.505995135570991180, 0.505952008121951290, 0.505908879408031420, -0.505865749429339260, 0.505822618185982510, 0.505779485678069520, 0.505736351905707760, 0.505693216869004810, 0.505650080568069150, 0.505606943003008350, 0.505563804173930100, -0.505520664080941980, 0.505477522724152690, 0.505434380103669480, 0.505391236219600360, 0.505348091072052810, 0.505304944661135290, 0.505261796986955500, 0.505218648049621240, -0.505175497849239990, 0.505132346385920310, 0.505089193659769790, 0.505046039670896230, 0.505002884419407220, 0.504959727905411440, 0.504916570129016250, 0.504873411090329350, -0.504830250789459310, 0.504787089226513610, 0.504743926401600150, 0.504700762314826520, 0.504657596966301300, 0.504614430356132180, 0.504571262484426960, 0.504528093351293230, -0.504484922956839550, 0.504441751301173640, 0.504398578384403380, 0.504355404206636160, 0.504312228767980990, 0.504269052068545110, 0.504225874108436670, 0.504182694887763130, -0.504139514406633290, 0.504096332665154630, 0.504053149663435060, 0.504009965401582380, 0.503966779879705060, 0.503923593097910790, 0.503880405056307160, 0.503837215755002950, -0.503794025194105770, 0.503750833373723390, 0.503707640293963530, 0.503664445954935090, 0.503621250356745430, 0.503578053499502690, 0.503534855383314440, 0.503491656008289380, -0.503448455374535200, 0.503405253482159920, 0.503362050331271130, 0.503318845921977510, 0.503275640254386870, 0.503232433328607120, 0.503189225144745840, 0.503146015702911840, -0.503102805003212920, 0.503059593045756540, 0.503016379830651620, 0.502973165358005740, 0.502929949627926920, 0.502886732640522860, 0.502843514395902250, 0.502800294894172990, -0.502757074135442910, 0.502713852119819780, 0.502670628847412430, 0.502627404318328530, 0.502584178532676010, 0.502540951490562770, 0.502497723192097510, 0.502454493637387920, -0.502411262826542140, 0.502368030759667740, 0.502324797436873750, 0.502281562858267750, 0.502238327023957320, 0.502195089934051600, 0.502151851588658160, 0.502108611987885030, -0.502065371131839910, 0.502022129020631920, 0.501978885654368550, 0.501935641033157910, 0.501892395157107820, 0.501849148026327070, 0.501805899640923480, 0.501762650001005170, -0.501719399106679840, 0.501676146958056400, 0.501632893555242650, 0.501589638898346620, 0.501546382987476110, 0.501503125822739930, 0.501459867404246080, 0.501416607732102060, -0.501373346806416990, 0.501330084627298560, 0.501286821194854900, 0.501243556509193720, 0.501200290570424150, 0.501157023378653750, 0.501113754933990910, 0.501070485236543180, -0.501027214286419720, 0.500983942083728210, 0.500940668628576780, 0.500897393921073350, 0.500854117961326840, 0.500810840749444930, 0.500767562285535980, 0.500724282569707800, -0.500681001602069190, 0.500637719382728160, 0.500594435911792760, 0.500551151189370990, 0.500507865215571670, 0.500464577990502590, 0.500421289514271780, 0.500377999786988160, -0.500334708808759520, 0.500291416579694110, 0.500248123099899740, 0.500204828369485430, 0.500161532388559090, 0.500118235157228860, 0.500074936675602770, 0.500031636943789600, -0.499988335961897460, 0.499945033730034400, 0.499901730248308420, 0.499858425516828460, 0.499815119535702460, 0.499771812305038640, 0.499728503824944940, 0.499685194095530310, -0.499641883116902720, 0.499598570889170030, 0.499555257412441330, 0.499511942686824470, 0.499468626712427750, 0.499425309489359090, 0.499381991017727510, 0.499338671297640980, -0.499295350329207800, 0.499252028112535770, 0.499208704647734150, 0.499165379934910720, 0.499122053974173860, 0.499078726765631480, 0.499035398309392640, 0.498992068605565330, -0.498948737654257850, 0.498905405455578100, 0.498862072009635280, 0.498818737316537250, 0.498775401376391980, 0.498732064189308600, 0.498688725755395080, 0.498645386074759720, -0.498602045147510550, 0.498558702973756600, 0.498515359553605930, 0.498472014887166860, 0.498428668974547350, 0.498385321815856540, 0.498341973411202450, 0.498298623760693450, -0.498255272864437440, 0.498211920722543720, 0.498168567335120100, 0.498125212702275110, 0.498081856824116710, 0.498038499700754090, 0.497995141332295170, 0.497951781718848410, -0.497908420860521780, 0.497865058757424540, 0.497821695409664590, 0.497778330817350070, 0.497734964980590110, 0.497691597899492690, 0.497648229574166320, 0.497604860004718990, -0.497561489191259860, 0.497518117133897040, 0.497474743832738870, 0.497431369287893550, 0.497387993499470100, 0.497344616467576720, 0.497301238192321800, 0.497257858673813390, -0.497214477912160720, 0.497171095907471830, 0.497127712659855230, 0.497084328169418940, 0.497040942436272230, 0.496997555460523210, 0.496954167242279870, 0.496910777781651490, -0.496867387078746170, 0.496823995133672370, 0.496780601946538230, 0.496737207517452930, 0.496693811846524670, 0.496650414933861810, 0.496607016779572590, 0.496563617383766200, -0.496520216746550720, 0.496476814868034740, 0.496433411748326340, 0.496390007387534800, 0.496346601785768230, 0.496303194943135130, 0.496259786859743700, 0.496216377535703130, -0.496172966971121680, 0.496129555166107410, 0.496086142120769620, 0.496042727835216520, 0.495999312309556570, 0.495955895543897910, 0.495912477538349940, 0.495869058293020800, -0.495825637808018970, 0.495782216083452690, 0.495738793119431250, 0.495695368916062810, 0.495651943473455980, 0.495608516791718860, 0.495565088870960900, 0.495521659711290140, -0.495478229312815270, 0.495434797675644470, 0.495391364799886990, 0.495347930685651190, 0.495304495333045490, 0.495261058742178180, 0.495217620913158630, 0.495174181846095020, -0.495130741541095600, 0.495087299998269670, 0.495043857217725480, 0.495000413199571660, 0.494956967943916410, 0.494913521450869200, 0.494870073720538100, 0.494826624753031850, -0.494783174548458660, 0.494739723106927930, 0.494696270428547860, 0.494652816513427130, 0.494609361361673940, 0.494565904973397750, 0.494522447348706820, 0.494478988487709770, -0.494435528390514860, 0.494392067057231540, 0.494348604487968020, 0.494305140682832600, 0.494261675641934680, 0.494218209365382630, 0.494174741853285030, 0.494131273105750220, -0.494087803122887580, 0.494044331904805460, 0.494000859451612480, 0.493957385763416970, 0.493913910840328430, 0.493870434682455060, 0.493826957289905610, 0.493783478662788380, -0.493739998801212890, 0.493696517705287330, 0.493653035375120510, 0.493609551810820720, 0.493566067012497440, 0.493522580980258970, 0.493479093714213670, 0.493435605214471050, -0.493392115481139370, 0.493348624514327430, 0.493305132314143520, 0.493261638880697240, 0.493218144214096770, 0.493174648314451010, 0.493131151181868180, 0.493087652816457890, -0.493044153218328510, 0.493000652387588670, 0.492957150324346840, 0.492913647028712540, 0.492870142500794140, 0.492826636740700320, 0.492783129748539550, 0.492739621524421360, -0.492696112068454100, 0.492652601380746180, 0.492609089461407130, 0.492565576310545430, 0.492522061928269690, 0.492478546314688460, 0.492435029469911250, 0.492391511394046470, -0.492347992087202870, 0.492304471549488920, 0.492260949781014200, 0.492217426781887070, 0.492173902552216440, 0.492130377092110600, 0.492086850401679210, 0.492043322481030720, -0.491999793330273940, 0.491956262949517280, 0.491912731338870310, 0.491869198498441570, 0.491825664428339800, 0.491782129128673470, 0.491738592599552220, 0.491695054841084500, -0.491651515853378740, 0.491607975636544570, 0.491564434190690510, 0.491520891515925320, 0.491477347612357510, 0.491433802480096720, 0.491390256119251470, 0.491346708529930510, -0.491303159712242420, 0.491259609666296840, 0.491216058392202230, 0.491172505890067450, 0.491128952160001080, 0.491085397202112640, 0.491041841016510720, 0.490998283603304220, -0.490954724962601620, 0.490911165094512600, 0.490867603999145700, 0.490824041676609310, 0.490780478127013310, 0.490736913350466040, 0.490693347347076540, 0.490649780116953260, -0.490606211660205900, 0.490562641976942990, 0.490519071067273550, 0.490475498931305990, 0.490431925569150050, 0.490388350980914380, 0.490344775166707770, 0.490301198126638860, -0.490257619860817280, 0.490214040369351730, 0.490170459652351060, 0.490126877709923860, 0.490083294542179800, 0.490039710149227540, 0.489996124531175640, 0.489952537688133790, -0.489908949620210590, 0.489865360327515040, 0.489821769810155680, 0.489778178068242310, 0.489734585101883500, 0.489690990911188170, 0.489647395496265010, 0.489603798857223770, -0.489560200994173020, 0.489516601907221740, 0.489473001596478610, 0.489429400062053320, 0.489385797304054570, 0.489342193322591320, 0.489298588117772160, 0.489254981689706940, -0.489211374038504290, 0.489167765164273180, 0.489124155067122310, 0.489080543747161370, 0.489036931204499150, 0.488993317439244120, 0.488949702451506260, 0.488906086241394140, -0.488862468809016790, 0.488818850154482840, 0.488775230277902210, 0.488731609179383520, 0.488687986859035750, 0.488644363316967640, 0.488600738553289000, 0.488557112568108520, -0.488513485361535270, 0.488469856933677950, 0.488426227284646350, 0.488382596414549170, 0.488338964323495490, 0.488295331011594060, 0.488251696478954610, 0.488208060725686010, -0.488164423751896840, 0.488120785557696950, 0.488077146143195140, 0.488033505508500440, 0.487989863653721660, 0.487946220578968530, 0.487902576284349850, 0.487858930769974770, -0.487815284035951980, 0.487771636082391320, 0.487727986909401610, 0.487684336517091920, 0.487640684905571000, 0.487597032074948760, 0.487553378025333940, 0.487509722756835680, -0.487466066269562680, 0.487422408563624950, 0.487378749639131190, 0.487335089496190140, 0.487291428134911830, 0.487247765555404890, 0.487204101757778560, 0.487160436742141540, -0.487116770508603860, 0.487073103057274250, 0.487029434388261910, 0.486985764501675520, 0.486942093397625180, 0.486898421076219560, 0.486854747537567910, 0.486811072781778990, -0.486767396808962800, 0.486723719619228110, 0.486680041212684100, 0.486636361589439630, 0.486592680749604660, 0.486548998693287940, 0.486505315420598330, 0.486461630931645850, -0.486417945226539310, 0.486374258305387890, 0.486330570168300390, 0.486286880815386900, 0.486243190246756220, 0.486199498462517530, 0.486155805462779700, 0.486112111247652800, -0.486068415817245580, 0.486024719171667340, 0.485981021311026880, 0.485937322235434290, 0.485893621944998360, 0.485849920439828390, 0.485806217720033240, 0.485762513785722940, -0.485718808637006340, 0.485675102273992740, 0.485631394696791010, 0.485587685905511160, 0.485543975900262050, 0.485500264681152650, 0.485456552248292980, 0.485412838601791960, -0.485369123741758830, 0.485325407668302460, 0.485281690381533020, 0.485237971881559260, 0.485194252168490660, 0.485150531242436010, 0.485106809103505400, 0.485063085751807790, -0.485019361187452480, 0.484975635410548390, 0.484931908421205540, 0.484888180219532950, 0.484844450805639930, 0.484800720179635380, 0.484756988341629450, 0.484713255291730980, -0.484669521030049010, 0.484625785556693670, 0.484582048871773810, 0.484538310975398840, 0.484494571867677750, 0.484450831548720540, 0.484407090018636300, 0.484363347277534330, -0.484319603325523600, 0.484275858162714290, 0.484232111789215270, 0.484188364205136000, 0.484144615410585450, 0.484100865405673710, 0.484057114190509840, 0.484013361765203150, -0.483969608129862730, 0.483925853284598640, 0.483882097229519910, 0.483838339964735520, 0.483794581490355700, 0.483750821806489480, 0.483707060913246110, 0.483663298810734780, -0.483619535499065560, 0.483575770978347470, 0.483532005248690000, 0.483488238310202100, 0.483444470162994020, 0.483400700807174730, 0.483356930242853700, 0.483313158470139950, -0.483269385489143720, 0.483225611299973990, 0.483181835902740280, 0.483138059297551550, 0.483094281484518110, 0.483050502463748920, 0.483006722235353460, 0.482962940799440850, -0.482919158156121240, 0.482875374305503760, 0.482831589247697480, 0.482787802982812540, 0.482744015510958190, 0.482700226832243730, 0.482656436946778340, 0.482612645854672230, -0.482568853556034520, 0.482525060050974670, 0.482481265339601780, 0.482437469422026140, 0.482393672298356780, 0.482349873968703270, 0.482306074433174690, 0.482262273691881290, -0.482218471744932260, 0.482174668592436960, 0.482130864234504690, 0.482087058671245570, 0.482043251902768870, 0.481999443929183650, 0.481955634750600160, 0.481911824367127590, -0.481868012778875480, 0.481824199985952940, 0.481780385988470340, 0.481736570786536700, 0.481692754380261660, 0.481648936769754400, 0.481605117955125120, 0.481561297936483060, -0.481517476713937740, 0.481473654287598360, 0.481429830657575220, 0.481386005823977560, 0.481342179786914850, 0.481298352546496280, 0.481254524102832200, 0.481210694456031870, -0.481166863606204360, 0.481123031553460090, 0.481079198297908290, 0.481035363839658450, 0.480991528178819850, 0.480947691315502750, 0.480903853249816490, 0.480860013981870560, -0.480816173511774190, 0.480772331839637860, 0.480728488965570630, 0.480684644889682160, 0.480640799612081730, 0.480596953132879700, 0.480553105452185270, 0.480509256570108070, -0.480465406486757340, 0.480421555202243500, 0.480377702716675740, 0.480333849030163350, 0.480289994142816760, 0.480246138054745140, 0.480202280766058200, 0.480158422276865170, -0.480114562587276470, 0.480070701697401350, 0.480026839607349490, 0.479982976317230140, 0.479939111827153710, 0.479895246137229500, 0.479851379247567210, 0.479807511158276080, -0.479763641869466570, 0.479719771381247940, 0.479675899693729870, 0.479632026807021660, 0.479588152721233780, 0.479544277436475540, 0.479500400952856620, 0.479456523270486270, -0.479412644389475010, 0.479368764309932140, 0.479324883031966960, 0.479281000555689950, 0.479237116881210510, 0.479193232008638230, 0.479149345938082450, 0.479105458669653710, -0.479061570203461350, 0.479017680539615080, 0.478973789678224180, 0.478929897619399190, 0.478886004363249460, 0.478842109909884740, 0.478798214259414380, 0.478754317411948850, -0.478710419367597510, 0.478666520126470150, 0.478622619688676090, 0.478578718054325840, 0.478534815223528810, 0.478490911196394360, 0.478447005973033020, 0.478403099553554200, -0.478359191938067580, 0.478315283126682590, 0.478271373119509850, 0.478227461916658600, 0.478183549518238720, 0.478139635924359600, 0.478095721135131770, 0.478051805150664590, -0.478007887971067970, 0.477963969596451210, 0.477920050026924890, 0.477876129262598480, 0.477832207303581720, 0.477788284149984090, 0.477744359801916100, 0.477700434259487270, -0.477656507522806920, 0.477612579591985660, 0.477568650467132980, 0.477524720148358670, 0.477480788635772200, 0.477436855929484150, 0.477392922029603930, 0.477348986936241390, -0.477305050649506010, 0.477261113169508420, 0.477217174496358030, 0.477173234630164700, 0.477129293571037890, 0.477085351319088250, 0.477041407874425230, 0.476997463237158690, -0.476953517407398110, 0.476909570385254110, 0.476865622170836170, 0.476821672764254190, 0.476777722165617650, 0.476733770375037170, 0.476689817392622280, 0.476645863218482460, -0.476601907852728380, 0.476557951295469520, 0.476513993546815780, 0.476470034606876650, 0.476426074475762850, 0.476382113153583860, 0.476338150640449600, 0.476294186936469580, -0.476250222041754430, 0.476206255956413750, 0.476162288680557430, 0.476118320214295010, 0.476074350557737170, 0.476030379710993490, 0.475986407674173830, 0.475942434447387760, -0.475898460030745980, 0.475854484424358070, 0.475810507628333550, 0.475766529642783150, 0.475722550467816420, 0.475678570103543310, 0.475634588550073400, 0.475590605807517440, -0.475546621875984900, 0.475502636755585850, 0.475458650446429820, 0.475414662948627550, 0.475370674262288630, 0.475326684387523010, 0.475282693324440290, 0.475238701073151190, -0.475194707633765370, 0.475150713006392780, 0.475106717191143060, 0.475062720188126900, 0.475018721997453930, 0.474974722619233790, 0.474930722053577170, 0.474886720300593810, -0.474842717360393630, 0.474798713233086260, 0.474754707918782550, 0.474710701417591970, 0.474666693729624720, 0.474622684854990320, 0.474578674793799620, 0.474534663546162190, -0.474490651112188130, 0.474446637491987070, 0.474402622685669740, 0.474358606693345900, 0.474314589515125560, 0.474270571151118310, 0.474226551601435060, 0.474182530866185450, -0.474138508945479040, 0.474094485839426820, 0.474050461548138350, 0.474006436071723770, 0.473962409410292660, 0.473918381563955940, 0.473874352532823280, 0.473830322317004730, -0.473786290916609950, 0.473742258331749880, 0.473698224562534130, 0.473654189609072850, 0.473610153471475670, 0.473566116149853560, 0.473522077644316090, 0.473478037954973450, -0.473433997081935340, 0.473389955025312610, 0.473345911785215010, 0.473301867361752620, 0.473257821755035170, 0.473213774965173530, 0.473169726992277500, 0.473125677836456760, -0.473081627497822180, 0.473037575976483550, 0.472993523272551010, 0.472949469386134190, 0.472905414317344170, 0.472861358066290590, 0.472817300633083580, 0.472773242017833000, -0.472729182220649640, 0.472685121241643360, 0.472641059080924240, 0.472596995738602140, 0.472552931214787860, 0.472508865509591310, 0.472464798623122630, 0.472420730555491500, -0.472376661306808940, 0.472332590877184770, 0.472288519266728660, 0.472244446475551690, 0.472200372503763620, 0.472156297351474570, 0.472112221018794460, 0.472068143505834150, -0.472024064812703480, 0.471979984939512600, 0.471935903886371410, 0.471891821653390890, 0.471847738240680770, 0.471803653648351310, 0.471759567876512300, 0.471715480925274820, -0.471671392794748620, 0.471627303485043890, 0.471583212996270540, 0.471539121328539590, 0.471495028481960790, 0.471450934456644040, 0.471406839252700330, 0.471362742870239550, -0.471318645309371900, 0.471274546570207230, 0.471230446652856630, 0.471186345557429890, 0.471142243284037250, 0.471098139832788640, 0.471054035203795070, 0.471009929397166460, -0.470965822413012990, 0.470921714251444520, 0.470877604912572250, 0.470833494396505900, 0.470789382703355800, 0.470745269833231890, 0.470701155786245220, 0.470657040562505620, -0.470612924162123410, 0.470568806585208550, 0.470524687831872070, 0.470480567902223810, 0.470436446796373750, 0.470392324514432970, 0.470348201056511430, 0.470304076422719320, -0.470259950613166670, 0.470215823627964550, 0.470171695467222820, 0.470127566131051890, 0.470083435619561620, 0.470039303932863140, 0.469995171071066480, 0.469951037034281820, -0.469906901822619180, 0.469862765436189710, 0.469818627875103310, 0.469774489139470340, 0.469730349229400770, 0.469686208145005670, 0.469642065886395120, 0.469597922453678980, -0.469553777846968450, 0.469509632066373420, 0.469465485112004370, 0.469421336983971150, 0.469377187682385010, 0.469333037207355920, 0.469288885558994230, 0.469244732737409960, -0.469200578742714200, 0.469156423575017020, 0.469112267234428780, 0.469068109721059450, 0.469023951035020260, 0.468979791176421190, 0.468935630145372650, 0.468891467941984660, -0.468847304566368360, 0.468803140018633820, 0.468758974298891020, 0.468714807407251190, 0.468670639343824360, 0.468626470108720940, 0.468582299702050900, 0.468538128123925530, -0.468493955374454820, 0.468449781453749270, 0.468405606361918800, 0.468361430099074770, 0.468317252665327140, 0.468273074060786390, 0.468228894285562580, 0.468184713339766860, -0.468140531223509400, 0.468096347936900640, 0.468052163480050580, 0.468007977853070520, 0.467963791056070500, 0.467919603089160640, 0.467875413952452130, 0.467831223646055120, -0.467787032170080000, 0.467742839524636970, 0.467698645709837210, 0.467654450725790820, 0.467610254572608300, 0.467566057250399740, 0.467521858759276490, 0.467477659099348520, -0.467433458270726470, 0.467389256273520350, 0.467345053107841470, 0.467300848773799960, 0.467256643271506340, 0.467212436601070700, 0.467168228762604390, 0.467124019756217530, -0.467079809582020560, 0.467035598240123690, 0.466991385730638250, 0.466947172053674310, 0.466902957209342110, 0.466858741197752840, 0.466814524019016740, 0.466770305673244350, -0.466726086160545780, 0.466681865481032350, 0.466637643634814300, 0.466593420622002150, 0.466549196442706040, 0.466504971097037370, 0.466460744585106220, 0.466416516907023240, -0.466372288062898540, 0.466328058052843550, 0.466283826876968400, 0.466239594535383660, 0.466195361028199580, 0.466151126355527470, 0.466106890517477560, 0.466062653514160040, -0.466018415345686220, 0.465974176012166450, 0.465929935513711200, 0.465885693850430660, 0.465841451022436350, 0.465797207029838400, 0.465752961872747400, 0.465708715551273630, -0.465664468065528470, 0.465620219415622150, 0.465575969601665250, 0.465531718623768080, 0.465487466482041980, 0.465443213176597200, 0.465398958707544390, 0.465354703074993770, -0.465310446279056820, 0.465266188319843730, 0.465221929197464800, 0.465177668912031440, 0.465133407463653890, 0.465089144852442850, 0.465044881078508550, 0.465000616141962420, -0.464956350042914750, 0.464912082781476220, 0.464867814357757090, 0.464823544771868770, 0.464779274023921660, 0.464735002114026300, 0.464690729042293080, 0.464646454808833430, -0.464602179413757640, 0.464557902857176410, 0.464513625139200030, 0.464469346259939960, 0.464425066219506520, 0.464380785018010440, 0.464336502655562030, 0.464292219132272700, -0.464247934448252850, 0.464203648603612740, 0.464159361598463940, 0.464115073432916750, 0.464070784107081860, 0.464026493621069570, 0.463982201974991510, 0.463937909168957880, -0.463893615203079530, 0.463849320077466710, 0.463805023792230990, 0.463760726347482780, 0.463716427743332660, 0.463672127979891100, 0.463627827057269630, 0.463583524975578590, -0.463539221734928730, 0.463494917335430470, 0.463450611777195260, 0.463406305060333530, 0.463361997184955630, 0.463317688151173190, 0.463273377959096460, 0.463229066608836340, -0.463184754100503080, 0.463140440434208430, 0.463096125610062580, 0.463051809628176490, 0.463007492488660470, 0.462963174191626080, 0.462918854737183800, 0.462874534125444330, -0.462830212356518170, 0.462785889430516850, 0.462741565347550840, 0.462697240107730890, 0.462652913711167460, 0.462608586157972120, 0.462564257448255360, 0.462519927582127510, -0.462475596559700270, 0.462431264381084010, 0.462386931046389620, 0.462342596555727510, 0.462298260909209280, 0.462253924106945380, 0.462209586149046730, 0.462165247035623670, -0.462120906766787910, 0.462076565342649850, 0.462032222763320400, 0.461987879028910030, 0.461943534139530320, 0.461899188095291740, 0.461854840896305240, 0.461810492542681250, -0.461766143034531400, 0.461721792371966200, 0.461677440555096130, 0.461633087584032880, 0.461588733458886850, 0.461544378179769010, 0.461500021746789830, 0.461455664160061010, -0.461411305419693050, 0.461366945525796770, 0.461322584478482790, 0.461278222277862690, 0.461233858924047060, 0.461189494417146790, 0.461145128757272370, 0.461100761944535530, -0.461056393979046800, 0.461012024860917020, 0.460967654590256850, 0.460923283167177960, 0.460878910591790810, 0.460834536864206390, 0.460790161984535260, 0.460745785952889060, -0.460701408769378480, 0.460657030434113930, 0.460612650947207210, 0.460568270308768850, 0.460523888518909850, 0.460479505577740700, 0.460435121485373190, 0.460390736241917900, -0.460346349847485740, 0.460301962302187340, 0.460257573606134400, 0.460213183759437540, 0.460168792762207680, 0.460124400614555510, 0.460080007316592710, 0.460035612868429870, -0.459991217270178000, 0.459946820521947740, 0.459902422623850780, 0.459858023575997750, 0.459813623378499290, 0.459769222031467200, 0.459724819535011990, 0.459680415889244800, -0.459636011094276100, 0.459591605150217800, 0.459547198057180530, 0.459502789815275200, 0.459458380424612510, 0.459413969885304310, 0.459369558197461170, 0.459325145361194120, -0.459280731376613790, 0.459236316243832100, 0.459191899962959560, 0.459147482534107250, 0.459103063957385870, 0.459058644232907260, 0.459014223360782010, 0.458969801341120750, -0.458925378174035450, 0.458880953859636730, 0.458836528398035570, 0.458792101789342710, 0.458747674033670010, 0.458703245131128090, 0.458658815081828040, 0.458614383885880610, -0.458569951543397580, 0.458525518054489710, 0.458481083419268020, 0.458436647637843200, 0.458392210710327210, 0.458347772636830690, 0.458303333417464710, 0.458258893052340020, -0.458214451541568480, 0.458170008885260770, 0.458125565083528090, 0.458081120136481110, 0.458036674044231710, 0.457992226806890610, 0.457947778424568570, 0.457903328897377450, -0.457858878225428030, 0.457814426408831410, 0.457769973447698380, 0.457725519342140730, 0.457681064092269330, 0.457636607698195250, 0.457592150160029240, 0.457547691477883320, -0.457503231651868130, 0.457458770682094840, 0.457414308568674210, 0.457369845311718260, 0.457325380911337680, 0.457280915367643650, 0.457236448680746920, 0.457191980850759460, -0.457147511877792070, 0.457103041761955490, 0.457058570503361740, 0.457014098102121510, 0.456969624558346050, 0.456925149872146160, 0.456880674043633750, 0.456836197072919670, -0.456791718960115110, 0.456747239705330820, 0.456702759308678870, 0.456658277770270020, 0.456613795090215490, 0.456569311268626040, 0.456524826305613700, 0.456480340201289300, -0.456435852955764110, 0.456391364569148810, 0.456346875041555520, 0.456302384373095060, 0.456257892563878280, 0.456213399614017080, 0.456168905523622440, 0.456124410292805480, -0.456079913921677180, 0.456035416410349450, 0.455990917758933190, 0.455946417967539600, 0.455901917036279580, 0.455857414965265220, 0.455812911754607250, 0.455768407404417040, -0.455723901914805380, 0.455679395285884410, 0.455634887517764930, 0.455590378610558230, 0.455545868564375180, 0.455501357379327840, 0.455456845055527140, 0.455412331593083920, -0.455367816992110260, 0.455323301252717080, 0.455278784375015620, 0.455234266359116850, 0.455189747205132780, 0.455145226913174330, 0.455100705483352850, 0.455056182915779150, -0.455011659210565410, 0.454967134367822550, 0.454922608387661850, 0.454878081270194250, 0.454833553015531800, 0.454789023623785480, 0.454744493095066590, 0.454699961429486100, -0.454655428627156080, 0.454610894688187490, 0.454566359612691650, 0.454521823400779570, 0.454477286052563270, 0.454432747568153770, 0.454388207947662050, 0.454343667191200170, -0.454299125298879110, 0.454254582270810230, 0.454210038107104530, 0.454165492807874100, 0.454120946373229970, 0.454076398803283490, 0.454031850098145560, 0.453987300257928440, -0.453942749282743030, 0.453898197172700800, 0.453853643927912660, 0.453809089548490810, 0.453764534034546250, 0.453719977386190300, 0.453675419603534080, 0.453630860686689670, -0.453586300635768100, 0.453541739450880390, 0.453497177132138720, 0.453452613679654120, 0.453408049093537990, 0.453363483373901370, 0.453318916520856370, 0.453274348534514090, -0.453229779414985990, 0.453185209162383030, 0.453140637776817400, 0.453096065258400240, 0.453051491607242900, 0.453006916823456400, 0.452962340907153040, 0.452917763858443790, -0.452873185677440170, 0.452828606364253150, 0.452784025918995030, 0.452739444341776880, 0.452694861632709670, 0.452650277791905750, 0.452605692819476100, 0.452561106715532240, -0.452516519480185180, 0.452471931113547220, 0.452427341615729510, 0.452382750986843380, 0.452338159226999990, 0.452293566336311570, 0.452248972314889250, 0.452204377162844510, -0.452159780880288460, 0.452115183467333310, 0.452070584924090250, 0.452025985250670670, 0.451981384447185770, 0.451936782513747800, 0.451892179450467830, 0.451847575257457450, -0.451802969934827710, 0.451758363482690990, 0.451713755901158360, 0.451669147190340900, 0.451624537350351020, 0.451579926381299730, 0.451535314283298680, 0.451490701056458940, -0.451446086700892810, 0.451401471216711480, 0.451356854604026470, 0.451312236862948970, 0.451267617993591220, 0.451222997996064470, 0.451178376870480180, 0.451133754616949540, -0.451089131235584970, 0.451044506726497540, 0.450999881089798830, 0.450955254325600070, 0.450910626434013530, 0.450865997415150430, 0.450821367269121920, 0.450776735996040460, -0.450732103596017120, 0.450687470069163490, 0.450642835415590800, 0.450598199635411420, 0.450553562728736590, 0.450508924695677770, 0.450464285536346320, 0.450419645250854540, -0.450375003839313610, 0.450330361301835180, 0.450285717638530420, 0.450241072849511810, 0.450196426934890540, 0.450151779894778170, 0.450107131729285960, 0.450062482438526310, -0.450017832022610480, 0.449973180481649640, 0.449928527815756260, 0.449883874025041540, 0.449839219109617160, 0.449794563069594310, 0.449749905905085460, 0.449705247616201900, -0.449660588203055160, 0.449615927665756530, 0.449571266004418550, 0.449526603219152390, 0.449481939310069690, 0.449437274277281750, 0.449392608120901040, 0.449347940841038800, -0.449303272437806660, 0.449258602911316030, 0.449213932261679220, 0.449169260489007630, 0.449124587593412450, 0.449079913575006210, 0.449035238433900200, 0.448990562170206110, -0.448945884784035190, 0.448901206275499950, 0.448856526644711710, 0.448811845891782140, 0.448767164016822600, 0.448722481019945500, 0.448677796901262250, 0.448633111660884430, -0.448588425298923510, 0.448543737815491890, 0.448499049210700880, 0.448454359484662330, 0.448409668637487440, 0.448364976669288760, 0.448320283580177670, 0.448275589370265900, -0.448230894039664710, 0.448186197588486710, 0.448141500016843160, 0.448096801324845530, 0.448052101512606270, 0.448007400580236750, 0.447962698527848760, 0.447917995355553540, -0.447873291063463800, 0.447828585651690810, 0.447783879120346400, 0.447739171469541840, 0.447694462699389780, 0.447649752810001580, 0.447605041801488970, 0.447560329673963360, -0.447515616427537340, 0.447470902062322260, 0.447426186578429920, 0.447381469975971720, 0.447336752255060250, 0.447292033415806920, 0.447247313458323080, 0.447202592382721360, -0.447157870189113130, 0.447113146877610280, 0.447068422448324120, 0.447023696901367340, 0.446978970236851290, 0.446934242454887830, 0.446889513555588370, 0.446844783539065540, -0.446800052405430690, 0.446755320154795740, 0.446710586787272100, 0.446665852302972400, 0.446621116702008050, 0.446576379984490960, 0.446531642150532480, 0.446486903200245260, -0.446442163133740800, 0.446397421951130580, 0.446352679652527170, 0.446307936238042050, 0.446263191707787110, 0.446218446061873770, 0.446173699300414730, 0.446128951423521490, -0.446084202431305810, 0.446039452323879200, 0.445994701101354420, 0.445949948763842860, 0.445905195311456450, 0.445860440744306640, 0.445815685062506130, 0.445770928266166380, -0.445726170355399350, 0.445681411330316470, 0.445636651191030460, 0.445591889937652810, 0.445547127570295460, 0.445502364089069900, 0.445457599494088810, 0.445412833785463700, -0.445368066963306160, 0.445323299027728830, 0.445278529978843260, 0.445233759816761330, 0.445188988541594610, 0.445144216153455840, 0.445099442652456550, 0.445054668038708630, -0.445009892312323630, 0.444965115473414330, 0.444920337522092200, 0.444875558458469210, 0.444830778282656990, 0.444785996994768170, 0.444741214594914390, 0.444696431083207560, -0.444651646459759300, 0.444606860724682250, 0.444562073878088100, 0.444517285920088320, 0.444472496850795760, 0.444427706670321940, 0.444382915378778890, 0.444338122976278120, -0.444293329462932430, 0.444248534838853460, 0.444203739104153120, 0.444158942258943030, 0.444114144303335960, 0.444069345237443570, 0.444024545061377840, 0.443979743775250290, -0.443934941379173830, 0.443890137873259980, 0.443845333257620820, 0.443800527532367930, 0.443755720697614040, 0.443710912753470970, 0.443666103700050110, 0.443621293537464430, -0.443576482265825580, 0.443531669885245450, 0.443486856395835740, 0.443442041797709300, 0.443397226090977810, 0.443352409275753200, 0.443307591352147200, 0.443262772320272560, -0.443217952180241070, 0.443173130932164650, 0.443128308576155040, 0.443083485112324980, 0.443038660540786280, 0.442993834861650890, 0.442949008075030570, 0.442904180181038050, -0.442859351179785140, 0.442814521071383860, 0.442769689855945840, 0.442724857533583980, 0.442680024104410040, 0.442635189568535590, 0.442590353926073600, 0.442545517177135690, -0.442500679321834010, 0.442455840360280240, 0.442411000292587230, 0.442366159118866730, 0.442321316839230870, 0.442276473453791290, 0.442231628962660940, 0.442186783365951520, -0.442141936663775100, 0.442097088856243490, 0.442052239943469540, 0.442007389925564990, 0.441962538802641970, 0.441917686574812170, 0.441872833242188620, 0.441827978804882950, -0.441783123263006890, 0.441738266616673480, 0.441693408865994400, 0.441648550011081780, 0.441603690052047360, 0.441558828989004170, 0.441513966822063900, 0.441469103551338670, -0.441424239176940290, 0.441379373698981730, 0.441334507117574770, 0.441289639432831500, 0.441244770644863730, 0.441199900753784460, 0.441155029759705390, 0.441110157662738810, -0.441065284462996370, 0.441020410160591180, 0.440975534755634950, 0.440930658248239460, 0.440885780638517740, 0.440840901926581540, 0.440796022112543100, 0.440751141196514260, -0.440706259178607900, 0.440661376058935910, 0.440616491837610480, 0.440571606514743420, 0.440526720090447740, 0.440481832564835310, 0.440436943938018240, 0.440392054210108410, -0.440347163381218880, 0.440302271451461450, 0.440257378420948310, 0.440212484289791320, 0.440167589058103490, 0.440122692725996740, 0.440077795293582870, 0.440032896760974900, -0.439987997128284620, 0.439943096395624460, 0.439898194563106080, 0.439853291630842640, 0.439808387598945970, 0.439763482467528330, 0.439718576236701570, 0.439673668906578770, -0.439628760477271840, 0.439583850948892960, 0.439538940321554050, 0.439494028595368240, 0.439449115770447320, 0.439404201846903650, 0.439359286824849040, 0.439314370704396610, -0.439269453485658270, 0.439224535168746270, 0.439179615753772570, 0.439134695240850190, 0.439089773630091110, 0.439044850921607170, 0.438999927115511560, 0.438955002211916080, -0.438910076210933090, 0.438865149112674490, 0.438820220917253480, 0.438775291624781900, 0.438730361235372070, 0.438685429749135940, 0.438640497166186640, 0.438595563486636090, -0.438550628710596630, 0.438505692838180190, 0.438460755869499950, 0.438415817804667820, 0.438370878643796150, 0.438325938386996850, 0.438280997034383110, 0.438236054586066900, -0.438191111042160130, 0.438146166402775980, 0.438101220668026430, 0.438056273838023870, 0.438011325912880170, 0.437966376892708560, 0.437921426777621030, 0.437876475567729910, -0.437831523263147230, 0.437786569863986120, 0.437741615370358550, 0.437696659782376980, 0.437651703100153390, 0.437606745323800890, 0.437561786453431580, 0.437516826489157740, -0.437471865431091510, 0.437426903279345970, 0.437381940034033130, 0.437336975695265140, 0.437292010263155060, 0.437247043737814920, 0.437202076119357190, 0.437157107407893930, -0.437112137603538230, 0.437067166706402220, 0.437022194716598260, 0.436977221634238470, 0.436932247459435990, 0.436887272192302890, 0.436842295832951640, 0.436797318381494220, -0.436752339838043900, 0.436707360202712720, 0.436662379475613150, 0.436617397656857250, 0.436572414746558280, 0.436527430744828250, 0.436482445651779630, 0.436437459467524490, -0.436392472192176080, 0.436347483825846540, 0.436302494368647880, 0.436257503820693390, 0.436212512182095110, 0.436167519452965560, 0.436122525633416860, 0.436077530723562200, -0.436032534723513720, 0.435987537633383880, 0.435942539453284820, 0.435897540183329820, 0.435852539823630980, 0.435807538374300750, 0.435762535835451330, 0.435717532207195890, -0.435672527489646690, 0.435627521682916130, 0.435582514787116400, 0.435537506802360750, 0.435492497728761360, 0.435447487566430310, 0.435402476315480960, 0.435357463976025370, -0.435312450548176190, 0.435267436032045430, 0.435222420427746500, 0.435177403735391540, 0.435132385955093070, 0.435087367086963220, 0.435042347131115340, 0.434997326087661560, -0.434952303956714530, 0.434907280738386300, 0.434862256432790310, 0.434817231040038670, 0.434772204560243900, 0.434727176993518260, 0.434682148339975090, 0.434637118599726540, -0.434592087772884770, 0.434547055859563210, 0.434502022859873990, 0.434456988773929690, 0.434411953601842590, 0.434366917343725960, 0.434321879999692020, 0.434276841569853410, -0.434231802054322270, 0.434186761453212060, 0.434141719766634960, 0.434096676994703500, 0.434051633137529980, 0.434006588195227800, 0.433961542167909110, 0.433916495055686580, -0.433871446858672400, 0.433826397576980050, 0.433781347210721650, 0.433736295760009490, 0.433691243224957000, 0.433646189605676410, 0.433601134902280360, 0.433556079114881090, -0.433511022243591950, 0.433465964288525300, 0.433420905249793760, 0.433375845127509480, 0.433330783921786090, 0.433285721632735650, 0.433240658260470980, 0.433195593805104200, -0.433150528266748880, 0.433105461645517220, 0.433060393941521900, 0.433015325154875230, 0.432970255285690610, 0.432925184334080390, 0.432880112300157160, 0.432835039184033270, -0.432789964985822170, 0.432744889705636180, 0.432699813343587590, 0.432654735899789810, 0.432609657374355250, 0.432564577767396490, 0.432519497079025930, 0.432474415309356990, -0.432429332458502010, 0.432384248526573760, 0.432339163513684450, 0.432294077419947630, 0.432248990245475580, 0.432203901990381110, 0.432158812654776460, 0.432113722238775200, -0.432068630742489630, 0.432023538166032450, 0.431978444509516060, 0.431933349773053920, 0.431888253956758450, 0.431843157060741940, 0.431798059085117920, 0.431752960029998740, -0.431707859895497200, 0.431662758681725540, 0.431617656388797450, 0.431572553016825230, 0.431527448565921570, 0.431482343036198920, 0.431437236427770820, 0.431392128740749610, -0.431347019975248100, 0.431301910131378640, 0.431256799209254750, 0.431211687208988950, 0.431166574130693870, 0.431121459974481980, 0.431076344740466800, 0.431031228428760790, -0.430986111039476320, 0.430940992572726940, 0.430895873028625140, 0.430850752407283600, 0.430805630708814780, 0.430760507933332320, 0.430715384080948560, 0.430670259151776370, -0.430625133145928100, 0.430580006063517430, 0.430534877904656720, 0.430489748669458830, 0.430444618358036160, 0.430399486970502340, 0.430354354506969790, 0.430309220967551360, -0.430264086352359520, 0.430218950661507840, 0.430173813895108780, 0.430128676053275150, 0.430083537136119460, 0.430038397143755360, 0.429993256076295240, 0.429948113933851570, -0.429902970716538050, 0.429857826424467070, 0.429812681057751500, 0.429767534616503850, 0.429722387100837770, 0.429677238510865760, 0.429632088846700620, 0.429586938108454830, -0.429541786296242120, 0.429496633410174970, 0.429451479450366210, 0.429406324416928330, 0.429361168309975060, 0.429316011129618870, 0.429270852875972660, 0.429225693549148910, -0.429180533149261360, 0.429135371676422460, 0.429090209130744690, 0.429045045512341850, 0.428999880821326340, 0.428954715057811190, 0.428909548221908800, 0.428864380313732970, -0.428819211333396180, 0.428774041281011380, 0.428728870156691030, 0.428683697960548950, 0.428638524692697590, 0.428593350353249970, 0.428548174942318560, 0.428502998460017050, -0.428457820906458120, 0.428412642281754570, 0.428367462586019100, 0.428322281819365320, 0.428277099981905830, 0.428231917073753190, 0.428186733095021200, 0.428141548045822330, -0.428096361926269600, 0.428051174736475580, 0.428005986476554020, 0.427960797146617500, 0.427915606746778980, 0.427870415277151030, 0.427825222737847450, 0.427780029128980830, -0.427734834450664130, 0.427689638703009910, 0.427644441886132040, 0.427599244000143040, 0.427554045045155930, 0.427508845021283330, 0.427463643928639000, 0.427418441767335570, -0.427373238537485600, 0.427328034239202960, 0.427282828872600270, 0.427237622437790450, 0.427192414934886190, 0.427147206364001330, 0.427101996725248400, 0.427056786018740530, -0.427011574244590240, 0.426966361402911500, 0.426921147493816770, 0.426875932517419230, 0.426830716473831420, 0.426785499363167230, 0.426740281185539310, 0.426695061941060660, -0.426649841629843930, 0.426604620252003080, 0.426559397807650620, 0.426514174296899640, 0.426468949719862880, 0.426423724076654130, 0.426378497367386090, 0.426333269592171380, -0.426288040751123860, 0.426242810844356280, 0.426197579871981700, 0.426152347834112710, 0.426107114730863320, 0.426061880562346120, 0.426016645328674170, 0.425971409029960280, -0.425926171666318190, 0.425880933237860750, 0.425835693744700930, 0.425790453186951470, 0.425745211564726280, 0.425699968878138100, 0.425654725127299960, 0.425609480312324600, -0.425564234433325970, 0.425518987490416720, 0.425473739483709650, 0.425428490413318590, 0.425383240279356310, 0.425337989081935930, 0.425292736821170190, 0.425247483497173010, -0.425202229110057120, 0.425156973659935660, 0.425111717146921360, 0.425066459571128150, 0.425021200932668820, 0.424975941231656500, 0.424930680468203870, 0.424885418642424960, -0.424840155754432570, 0.424794891804339710, 0.424749626792259250, 0.424704360718305090, 0.424659093582590070, 0.424613825385226910, 0.424568556126329600, 0.424523285806010840, -0.424478014424383930, 0.424432741981561560, 0.424387468477657740, 0.424342193912785270, 0.424296918287057290, 0.424251641600586590, 0.424206363853487200, 0.424161085045871910, -0.424115805177853910, 0.424070524249546000, 0.424025242261062200, 0.423979959212515240, 0.423934675104018440, 0.423889389935684540, 0.423844103707627540, 0.423798816419960310, -0.423753528072795980, 0.423708238666247520, 0.423662948200428770, 0.423617656675452700, 0.423572364091432120, 0.423527070448480980, 0.423481775746712140, 0.423436479986238900, -0.423391183167174060, 0.423345885289631680, 0.423300586353724580, 0.423255286359566000, 0.423209985307268780, 0.423164683196947060, 0.423119380028713580, 0.423074075802681690, -0.423028770518964150, 0.422983464177675130, 0.422938156778927430, 0.422892848322834360, 0.422847538809508760, 0.422802228239064710, 0.422756916611615070, 0.422711603927272810, -0.422666290186151870, 0.422620975388365240, 0.422575659534026150, 0.422530342623247510, 0.422485024656143400, 0.422439705632826790, 0.422394385553410860, 0.422349064418008570, -0.422303742226734060, 0.422258418979700120, 0.422213094677020230, 0.422167769318807120, 0.422122442905175030, 0.422077115436236830, 0.422031786912105800, 0.421986457332894970, -0.421941126698718360, 0.421895795009688930, 0.421850462265919600, 0.421805128467524550, 0.421759793614616680, 0.421714457707309310, 0.421669120745715390, 0.421623782729949050, -0.421578443660123310, 0.421533103536351430, 0.421487762358746350, 0.421442420127422330, 0.421397076842492220, 0.421351732504069430, 0.421306387112266920, 0.421261040667198830, -0.421215693168978170, 0.421170344617718240, 0.421124995013532070, 0.421079644356533780, 0.421034292646836390, 0.420988939884552880, 0.420943586069797430, 0.420898231202682990, -0.420852875283322990, 0.420807518311830390, 0.420762160288319420, 0.420716801212903060, 0.420671441085694650, 0.420626079906807230, 0.420580717676355080, 0.420535354394451060, -0.420489990061208680, 0.420444624676740930, 0.420399258241162030, 0.420353890754585010, 0.420308522217123230, 0.420263152628889750, 0.420217781989998760, 0.420172410300563350, -0.420127037560696910, 0.420081663770512430, 0.420036288930124240, 0.419990913039645310, 0.419945536099188720, 0.419900158108868660, 0.419854779068798260, 0.419809398979090860, -0.419764017839859560, 0.419718635651218640, 0.419673252413281130, 0.419627868126160490, 0.419582482789969740, 0.419537096404823230, 0.419491708970833990, 0.419446320488115420, -0.419400930956780660, 0.419355540376944000, 0.419310148748718530, 0.419264756072217640, 0.419219362347554410, 0.419173967574843260, 0.419128571754197150, 0.419083174885729210, -0.419037776969553740, 0.418992378005783820, 0.418946977994532950, 0.418901576935914290, 0.418856174830042010, 0.418810771677029350, 0.418765367476989720, 0.418719962230036320, -0.418674555936283390, 0.418629148595844050, 0.418583740208831880, 0.418538330775359900, 0.418492920295542530, 0.418447508769492880, 0.418402096197324440, 0.418356682579150370, -0.418311267915084940, 0.418265852205241370, 0.418220435449732810, 0.418175017648673540, 0.418129598802176710, 0.418084178910355870, 0.418038757973324240, 0.417993335991196040, -0.417947912964084570, 0.417902488892103300, 0.417857063775365360, 0.417811637613985210, 0.417766210408075930, 0.417720782157751160, 0.417675352863124020, 0.417629922524308920, -0.417584491141418990, 0.417539058714567810, 0.417493625243868630, 0.417448190729435790, 0.417402755171382420, 0.417357318569822220, 0.417311880924868260, 0.417266442236635060, -0.417221002505235690, 0.417175561730783460, 0.417130119913392720, 0.417084677053176700, 0.417039233150248990, 0.416993788204722770, 0.416948342216712450, 0.416902895186331330, -0.416857447113692940, 0.416811997998910560, 0.416766547842098540, 0.416721096643370200, 0.416675644402839110, 0.416630191120618500, 0.416584736796822790, 0.416539281431565270, -0.416493825024959520, 0.416448367577118840, 0.416402909088157580, 0.416357449558189100, 0.416311988987326580, 0.416266527375684480, 0.416221064723376110, 0.416175601030515040, -0.416130136297214570, 0.416084670523589160, 0.416039203709752060, 0.415993735855817000, 0.415948266961897130, 0.415902797028107060, 0.415857326054559940, 0.415811854041369560, -0.415766380988649100, 0.415720906896513090, 0.415675431765074880, 0.415629955594448040, 0.415584478384745880, 0.415539000136082970, 0.415493520848572550, 0.415448040522327920, -0.415402559157463550, 0.415357076754092840, 0.415311593312329420, 0.415266108832286650, 0.415220623314078940, 0.415175136757819700, 0.415129649163622660, 0.415084160531601080, -0.415038670861869460, 0.414993180154541170, 0.414947688409729950, 0.414902195627549100, 0.414856701808113180, 0.414811206951535500, 0.414765711057929810, 0.414720214127409390, -0.414674716160088890, 0.414629217156081590, 0.414583717115500850, 0.414538216038461190, 0.414492713925076030, 0.414447210775459040, 0.414401706589723640, 0.414356201367984400, -0.414310695110354620, 0.414265187816948100, 0.414219679487878250, 0.414174170123259580, 0.414128659723205510, 0.414083148287829770, 0.414037635817245730, 0.413992122311568010, -0.413946607770910020, 0.413901092195385510, 0.413855575585107830, 0.413810057940191660, 0.413764539260750300, 0.413719019546897600, 0.413673498798746990, 0.413627977016413020, -0.413582454200009050, 0.413536930349648610, 0.413491405465446220, 0.413445879547515330, 0.413400352595969740, 0.413354824610922820, 0.413309295592489300, 0.413263765540782540, -0.413218234455916320, 0.413172702338004130, 0.413127169187160580, 0.413081635003499150, 0.413036099787133570, 0.412990563538177420, 0.412945026256745170, 0.412899487942950450, -0.412853948596906940, 0.412808408218728160, 0.412762866808528810, 0.412717324366422220, 0.412671780892521990, 0.412626236386942680, 0.412580690849797760, 0.412535144281201140, -0.412489596681266280, 0.412444048050107760, 0.412398498387839150, 0.412352947694574310, 0.412307395970426700, 0.412261843215511010, 0.412216289429940710, 0.412170734613829690, -0.412125178767291380, 0.412079621890440560, 0.412034063983390710, 0.411988505046255670, 0.411942945079148970, 0.411897384082185290, 0.411851822055478210, 0.411806258999141140, -0.411760694913288820, 0.411715129798034760, 0.411669563653492890, 0.411623996479776650, 0.411578428277000920, 0.411532859045279030, 0.411487288784725070, 0.411441717495452440, -0.411396145177575890, 0.411350571831209040, 0.411304997456465700, 0.411259422053459500, 0.411213845622305170, 0.411168268163116190, 0.411122689676006570, 0.411077110161089780, -0.411031529618480660, 0.410985948048292690, 0.410940365450639890, 0.410894781825635710, 0.410849197173395020, 0.410803611494031330, 0.410758024787658220, 0.410712437054390420, -0.410666848294341520, 0.410621258507625540, 0.410575667694355990, 0.410530075854647680, 0.410484482988614170, 0.410438889096369500, 0.410393294178027170, 0.410347698233701990, -0.410302101263507580, 0.410256503267557910, 0.410210904245966620, 0.410165304198848450, 0.410119703126316960, 0.410074101028486290, 0.410028497905469910, 0.409982893757382730, -0.409937288584338310, 0.409891682386450240, 0.409846075163833370, 0.409800466916601320, 0.409754857644868130, 0.409709247348747360, 0.409663636028353870, 0.409618023683801350, -0.409572410315203690, 0.409526795922674660, 0.409481180506329030, 0.409435564066280460, 0.409389946602642940, 0.409344328115530180, 0.409298708605056960, 0.409253088071337030, -0.409207466514484360, 0.409161843934612630, 0.409116220331836640, 0.409070595706270130, 0.409024970058026740, 0.408979343387221360, 0.408933715693967580, 0.408888086978379530, -0.408842457240570830, 0.408796826480656410, 0.408751194698749880, 0.408705561894965430, 0.408659928069416640, 0.408614293222218430, 0.408568657353484520, 0.408523020463328950, -0.408477382551865390, 0.408431743619208810, 0.408386103665472840, 0.408340462690771680, 0.408294820695218890, 0.408249177678929490, 0.408203533642017170, 0.408157888584595560, -0.408112242506779630, 0.408066595408683120, 0.408020947290420100, 0.407975298152104370, 0.407929647993850730, 0.407883996815772980, 0.407838344617985290, 0.407792691400601260, -0.407747037163735950, 0.407701381907503050, 0.407655725632016690, 0.407610068337390610, 0.407564410023739780, 0.407518750691177880, 0.407473090339819100, 0.407427428969777240, -0.407381766581167200, 0.407336103174102740, 0.407290438748698020, 0.407244773305066810, 0.407199106843324050, 0.407153439363583500, 0.407107770865959010, 0.407062101350565420, -0.407016430817516650, 0.406970759266926770, 0.406925086698909590, 0.406879413113580110, 0.406833738511052090, 0.406788062891439710, 0.406742386254856810, 0.406696708601418320, -0.406651029931238030, 0.406605350244430230, 0.406559669541108560, 0.406513987821388200, 0.406468305085382840, 0.406422621333206720, 0.406376936564973650, 0.406331250780798630, -0.406285563980795520, 0.406239876165078060, 0.406194187333761340, 0.406148497486959140, 0.406102806624785650, 0.406057114747354790, 0.406011421854781560, 0.405965727947179720, -0.405920033024663620, 0.405874337087346990, 0.405828640135344920, 0.405782942168771310, 0.405737243187740290, 0.405691543192365780, 0.405645842182762780, 0.405600140159045220, -0.405554437121327270, 0.405508733069722850, 0.405463028004347030, 0.405417321925313600, 0.405371614832736480, 0.405325906726730690, 0.405280197607410190, 0.405234487474889160, -0.405188776329281520, 0.405143064170702340, 0.405097350999265470, 0.405051636815085270, 0.405005921618275530, 0.404960205408951390, 0.404914488187226810, 0.404868769953215910, -0.404823050707032730, 0.404777330448792330, 0.404731609178608620, 0.404685886896595900, 0.404640163602868030, 0.404594439297540130, 0.404548713980726170, 0.404502987652540390, -0.404457260313096760, 0.404411531962510400, 0.404365802600895160, 0.404320072228365080, 0.404274340845035160, 0.404228608451019430, 0.404182875046432130, 0.404137140631387280, -0.404091405206000010, 0.404045668770384170, 0.403999931324654170, 0.403954192868923980, 0.403908453403308660, 0.403862712927922200, 0.403816971442878980, 0.403771228948292980, -0.403725485444279220, 0.403679740930951820, 0.403633995408425040, 0.403588248876812830, 0.403542501336230490, 0.403496752786791810, 0.403451003228610880, 0.403405252661802830, -0.403359501086481660, 0.403313748502761750, 0.403267994910757040, 0.403222240310582790, 0.403176484702352900, 0.403130728086181830, 0.403084970462183500, 0.403039211830473200, -0.402993452191164780, 0.402947691544372820, 0.402901929890211170, 0.402856167228795140, 0.402810403560238670, 0.402764638884656190, 0.402718873202161710, 0.402673106512870470, -0.402627338816896440, 0.402581570114353690, 0.402535800405357360, 0.402490029690021570, 0.402444257968460730, 0.402398485240788810, 0.402352711507121100, 0.402306936767571570, -0.402261161022254730, 0.402215384271284560, 0.402169606514776400, 0.402123827752844170, 0.402078047985602370, 0.402032267213165040, 0.401986485435647470, 0.401940702653163670, -0.401894918865828120, 0.401849134073754890, 0.401803348277059160, 0.401757561475855120, 0.401711773670256790, 0.401665984860379350, 0.401620195046337000, 0.401574404228244200, -0.401528612406214900, 0.401482819580364520, 0.401437025750807140, 0.401391230917657100, 0.401345435081028660, 0.401299638241036980, 0.401253840397796210, 0.401208041551420870, -0.401162241702025020, 0.401116440849723980, 0.401070638994631800, 0.401024836136863020, 0.400979032276531750, 0.400933227413753370, 0.400887421548641820, 0.400841614681311800, -0.400795806811877320, 0.400749997940453680, 0.400704188067155080, 0.400658377192095630, 0.400612565315390580, 0.400566752437154170, 0.400520938557500870, 0.400475123676544810, -0.400429307794401330, 0.400383490911184580, 0.400337673027009120, 0.400291854141989090, 0.400246034256239840, 0.400200213369875430, 0.400154391483010570, 0.400108568595759270, -0.400062744708236990, 0.400016919820557810, 0.399971093932836360, 0.399925267045186770, 0.399879439157724390, 0.399833610270563470, 0.399787780383818070, 0.399741949497603610, -0.399696117612034330, 0.399650284727224750, 0.399604450843288990, 0.399558615960342590, 0.399512780078499610, 0.399466943197874680, 0.399421105318581990, 0.399375266440736900, -0.399329426564453690, 0.399283585689846950, 0.399237743817030750, 0.399191900946120670, 0.399146057077230830, 0.399100212210475810, 0.399054366345969860, 0.399008519483828430, -0.398962671624165710, 0.398916822767095840, 0.398870972912734380, 0.398825122061195470, 0.398779270212593740, 0.398733417367043490, 0.398687563524660000, 0.398641708685557710, -0.398595852849851050, 0.398549996017654400, 0.398504138189083200, 0.398458279364251600, 0.398412419543274330, 0.398366558726265580, 0.398320696913340880, 0.398274834104614390, -0.398228970300200820, 0.398183105500214460, 0.398137239704770720, 0.398091372913983890, 0.398045505127968600, 0.397999636346839160, 0.397953766570711020, 0.397907895799698490, -0.397862024033915800, 0.397816151273478470, 0.397770277518500750, 0.397724402769097320, 0.397678527025382480, 0.397632650287471750, 0.397586772555479420, 0.397540893829520130, -0.397495014109708170, 0.397449133396159120, 0.397403251688987210, 0.397357368988307200, 0.397311485294233320, 0.397265600606881150, 0.397219714926364990, 0.397173828252799570, -0.397127940586299130, 0.397082051926979260, 0.397036162274954250, 0.396990271630338450, 0.396944379993247390, 0.396898487363795350, 0.396852593742097080, 0.396806699128266940, -0.396760803522420440, 0.396714906924671980, 0.396669009335136210, 0.396623110753927530, 0.396577211181161460, 0.396531310616952350, 0.396485409061415000, 0.396439506514663700, -0.396393602976814030, 0.396347698447980400, 0.396301792928277500, 0.396255886417819670, 0.396209978916722600, 0.396164070425100550, 0.396118160943067900, 0.396072250470740290, -0.396026339008232030, 0.395980426555657910, 0.395934513113132320, 0.395888598680770920, 0.395842683258687930, 0.395796766846998270, 0.395750849445816290, 0.395704931055257610, -0.395659011675436600, 0.395613091306468050, 0.395567169948466360, 0.395521247601547170, 0.395475324265824820, 0.395429399941414180, 0.395383474628429650, 0.395337548326986870, -0.395291621037200170, 0.395245692759183980, 0.395199763493054020, 0.395153833238924670, 0.395107901996910650, 0.395061969767126540, 0.395016036549687920, 0.394970102344709200, -0.394924167152305160, 0.394878230972590340, 0.394832293805680360, 0.394786355651689620, 0.394740416510733050, 0.394694476382924990, 0.394648535268381120, 0.394602593167215960, -0.394556650079544320, 0.394510706005480600, 0.394464760945140550, 0.394418814898638610, 0.394372867866089600, 0.394326919847608040, 0.394280970843309600, 0.394235020853308690, -0.394189069877719840, 0.394143117916658740, 0.394097164970239830, 0.394051211038577990, 0.394005256121787770, 0.393959300219984760, 0.393913343333283540, 0.393867385461798950, -0.393821426605645450, 0.393775466764938850, 0.393729505939793560, 0.393683544130324470, 0.393637581336646170, 0.393591617558874280, 0.393545652797123390, 0.393499687051508340, -0.393453720322143650, 0.393407752609145070, 0.393361783912627160, 0.393315814232704340, 0.393269843569492410, 0.393223871923105870, 0.393177899293659590, 0.393131925681268260, -0.393085951086047440, 0.393039975508111760, 0.392993998947576200, 0.392948021404555150, 0.392902042879164530, 0.392856063371518740, 0.392810082881732800, 0.392764101409921300, -0.392718118956199900, 0.392672135520683200, 0.392626151103486200, 0.392580165704723370, 0.392534179324510570, 0.392488191962962310, 0.392442203620193160, 0.392396214296318930, -0.392350223991454140, 0.392304232705713800, 0.392258240439212480, 0.392212247192065930, 0.392166252964388780, 0.392120257756296050, 0.392074261567902200, 0.392028264399323150, -0.391982266250673390, 0.391936267122068030, 0.391890267013621510, 0.391844265925449800, 0.391798263857667420, 0.391752260810389330, 0.391706256783730220, 0.391660251777805890, -0.391614245792730910, 0.391568238828620300, 0.391522230885588680, 0.391476221963751920, 0.391430212063224590, 0.391384201184121370, 0.391338189326558010, 0.391292176490649180, -0.391246162676509910, 0.391200147884254830, 0.391154132113999740, 0.391108115365859380, 0.391062097639948700, 0.391016078936382410, 0.390970059255276280, 0.390924038596745070, -0.390878016960903680, 0.390831994347866920, 0.390785970757750510, 0.390739946190669210, 0.390693920646738020, 0.390647894126071650, 0.390601866628785930, 0.390555838154995620, -0.390509808704815220, 0.390463778278360710, 0.390417746875746760, 0.390371714497088520, 0.390325681142500490, 0.390279646812098700, 0.390233611505997780, 0.390187575224312850, -0.390141537967158560, 0.390095499734650850, 0.390049460526904370, 0.390003420344034290, 0.389957379186155200, 0.389911337053383100, 0.389865293945832640, 0.389819249863618930, -0.389773204806856680, 0.389727158775661890, 0.389681111770149140, 0.389635063790433220, 0.389589014836630050, 0.389542964908854370, 0.389496914007221250, 0.389450862131845430, -0.389404809282842880, 0.389358755460328330, 0.389312700664416870, 0.389266644895223220, 0.389220588152863370, 0.389174530437452090, 0.389128471749104480, 0.389082412087935260, -0.389036351454060400, 0.388990289847594710, 0.388944227268653300, 0.388898163717350860, 0.388852099193803420, 0.388806033698125770, 0.388759967230433050, 0.388713899790839980, -0.388667831379462540, 0.388621761996415570, 0.388575691641813770, 0.388529620315773150, 0.388483548018408450, 0.388437474749834920, 0.388391400510167240, 0.388345325299521540, -0.388299249118012500, 0.388253171965755320, 0.388207093842864780, 0.388161014749456970, 0.388114934685646620, 0.388068853651548920, 0.388022771647278660, 0.387976688672951870, -0.387930604728683400, 0.387884519814588380, 0.387838433930781660, 0.387792347077379310, 0.387746259254496020, 0.387700170462246750, 0.387654080700747420, 0.387607989970112870, -0.387561898270458390, 0.387515805601898690, 0.387469711964549930, 0.387423617358526930, 0.387377521783944800, 0.387331425240918510, 0.387285327729564090, 0.387239229249996320, -0.387193129802330450, 0.387147029386681380, 0.387100928003165150, 0.387054825651896580, 0.387008722332990940, 0.386962618046563070, 0.386916512792729090, 0.386870406571603880, -0.386824299383302150, 0.386778191227940160, 0.386732082105632650, 0.386685972016494960, 0.386639860960641900, 0.386593748938189600, 0.386547635949252950, 0.386501521993947220, -0.386455407072387240, 0.386409291184689140, 0.386363174330967840, 0.386317056511338630, 0.386270937725916360, 0.386224817974817110, 0.386178697258155850, 0.386132575576047850, -0.386086452928607990, 0.386040329315952390, 0.385994204738196010, 0.385948079195453710, 0.385901952687841550, 0.385855825215474570, 0.385809696778468050, 0.385763567376936840, -0.385717437010997090, 0.385671305680763800, 0.385625173386352220, 0.385579040127877300, 0.385532905905455190, 0.385486770719200840, 0.385440634569229560, 0.385394497455656240, -0.385348359378597130, 0.385302220338167080, 0.385256080334481500, 0.385209939367655350, 0.385163797437804710, 0.385117654545044600, 0.385071510689490300, 0.385025365871256910, -0.384979220090460430, 0.384933073347215940, 0.384886925641638340, 0.384840776973843890, 0.384794627343947430, 0.384748476752064420, 0.384702325198309820, 0.384656172682799840, -0.384610019205649410, 0.384563864766973910, 0.384517709366888340, 0.384471553005508950, 0.384425395682950640, 0.384379237399328830, 0.384333078154758530, 0.384286917949355930, -0.384240756783236050, 0.384194594656514290, 0.384148431569305670, 0.384102267521726330, 0.384056102513891330, 0.384009936545915640, 0.383963769617915560, 0.383917601730006000, -0.383871432882302520, 0.383825263074919990, 0.383779092307974690, 0.383732920581581700, 0.383686747895856440, 0.383640574250913860, 0.383594399646870250, 0.383548224083840650, -0.383502047561940450, 0.383455870081284790, 0.383409691641989850, 0.383363512244170650, 0.383317331887942700, 0.383271150573420980, 0.383224968300721780, 0.383178785069960230, -0.383132600881251230, 0.383086415734711190, 0.383040229630455090, 0.382994042568598430, 0.382947854549256230, 0.382901665572544850, 0.382855475638579250, 0.382809284747475000, -0.382763092899347120, 0.382716900094311920, 0.382670706332484460, 0.382624511613980260, 0.382578315938914340, 0.382532119307403050, 0.382485921719561420, 0.382439723175505060, -0.382393523675348960, 0.382347323219209450, 0.382301121807201600, 0.382254919439441010, 0.382208716116042620, 0.382162511837122960, 0.382116306602796940, 0.382070100413179790, -0.382023893268387760, 0.381977685168536030, 0.381931476113740060, 0.381885266104115050, 0.381839055139777230, 0.381792843220841780, 0.381746630347424230, 0.381700416519639710, -0.381654201737604500, 0.381607986001433860, 0.381561769311243190, 0.381515551667147730, 0.381469333069263780, 0.381423113517706520, 0.381376893012591480, 0.381330671554033770, -0.381284449142149760, 0.381238225777054680, 0.381192001458863620, 0.381145776187692960, 0.381099549963657860, 0.381053322786873870, 0.381007094657456190, 0.380960865575521170, -0.380914635541183990, 0.380868404554560220, 0.380822172615765060, 0.380775939724914860, 0.380729705882124790, 0.380683471087510440, 0.380637235341187040, 0.380590998643270950, -0.380544760993877350, 0.380498522393121870, 0.380452282841119650, 0.380406042337987140, 0.380359800883839530, 0.380313558478792000, 0.380267315122961020, 0.380221070816461730, -0.380174825559409730, 0.380128579351920290, 0.380082332194109810, 0.380036084086093520, 0.379989835027987000, 0.379943585019905490, 0.379897334061965410, 0.379851082154281980, -0.379804829296970900, 0.379758575490147300, 0.379712320733927690, 0.379666065028427260, 0.379619808373761640, 0.379573550770046120, 0.379527292217397120, 0.379481032715929920, -0.379434772265759720, 0.379388510867002980, 0.379342248519774990, 0.379295985224191330, 0.379249720980367360, 0.379203455788419460, 0.379157189648462960, 0.379110922560613410, -0.379064654524986220, 0.379018385541697760, 0.378972115610863360, 0.378925844732598660, 0.378879572907018960, 0.378833300134240710, 0.378787026414379220, 0.378740751747550120, -0.378694476133868810, 0.378648199573451640, 0.378601922066414020, 0.378555643612871580, 0.378509364212939680, 0.378463083866734720, 0.378416802574372050, 0.378370520335966960, -0.378324237151635990, 0.378277953021494420, 0.378231667945657990, 0.378185381924241950, 0.378139094957362920, 0.378092807045136090, 0.378046518187677260, 0.378000228385101720, -0.377953937637526050, 0.377907645945065540, 0.377861353307835880, 0.377815059725952420, 0.377768765199531790, 0.377722469728689170, 0.377676173313540420, 0.377629875954200780, -0.377583577650786930, 0.377537278403414060, 0.377490978212197630, 0.377444677077254150, 0.377398374998698990, 0.377352071976647880, 0.377305768011216180, 0.377259463102520510, -0.377213157250676170, 0.377166850455798900, 0.377120542718004100, 0.377074234037408360, 0.377027924414127020, 0.376981613848275890, 0.376935302339970360, 0.376888989889326900, -0.376842676496461030, 0.376796362161488430, 0.376750046884524510, 0.376703730665685910, 0.376657413505087970, 0.376611095402846100, 0.376564776359076920, 0.376518456373895750, -0.376472135447418480, 0.376425813579760400, 0.376379490771038270, 0.376333167021367380, 0.376286842330863570, 0.376240516699642260, 0.376194190127820070, 0.376147862615512360, -0.376101534162835040, 0.376055204769903450, 0.376008874436834280, 0.375962543163742890, 0.375916210950745180, 0.375869877797956550, 0.375823543705493590, 0.375777208673471750, -0.375730872702006950, 0.375684535791214520, 0.375638197941211170, 0.375591859152112350, 0.375545519424033410, 0.375499178757091160, 0.375452837151400930, 0.375406494607078590, -0.375360151124239590, 0.375313806703000690, 0.375267461343477220, 0.375221115045785090, 0.375174767810039780, 0.375128419636357960, 0.375082070524855090, 0.375035720475647090, -0.374989369488849310, 0.374943017564578540, 0.374896664702950240, 0.374850310904080270, 0.374803956168084100, 0.374757600495078450, 0.374711243885178850, 0.374664886338500650, -0.374618527855160700, 0.374572168435274410, 0.374525808078957690, 0.374479446786326050, 0.374433084557496240, 0.374386721392583670, 0.374340357291704340, 0.374293992254973670, -0.374247626282508410, 0.374201259374424110, 0.374154891530836700, 0.374108522751861570, 0.374062153037615640, 0.374015782388214260, 0.373969410803773440, 0.373923038284408700, -0.373876664830236740, 0.373830290441373110, 0.373783915117933410, 0.373737538860034300, 0.373691161667791320, 0.373644783541320470, 0.373598404480737220, 0.373552024486158370, -0.373505643557699500, 0.373459261695476500, 0.373412878899604890, 0.373366495170201540, 0.373320110507381950, 0.373273724911262090, 0.373227338381957490, 0.373180950919584980, -0.373134562524260030, 0.373088173196098720, 0.373041782935216560, 0.372995391741730350, 0.372948999615755670, 0.372902606557408090, 0.372856212566804400, 0.372809817644060180, -0.372763421789291390, 0.372717025002613670, 0.372670627284143800, 0.372624228633997360, 0.372577829052290310, 0.372531428539138290, 0.372485027094658140, 0.372438624718965380, -0.372392221412176090, 0.372345817174405850, 0.372299412005771440, 0.372253005906388490, 0.372206598876373080, 0.372160190915840680, 0.372113782024908300, 0.372067372203691400, -0.372020961452306120, 0.371974549770868020, 0.371928137159493910, 0.371881723618299520, 0.371835309147400370, 0.371788893746913370, 0.371742477416954150, 0.371696060157638730, -0.371649641969082730, 0.371603222851403010, 0.371556802804715260, 0.371510381829135540, 0.371463959924779430, 0.371417537091763840, 0.371371113330204390, 0.371324688640217170, -0.371278263021917800, 0.371231836475423180, 0.371185409000849010, 0.371138980598311240, 0.371092551267925670, 0.371046121009809160, 0.370999689824077270, 0.370953257710845810, -0.370906824670231560, 0.370860390702350270, 0.370813955807318020, 0.370767519985250480, 0.370721083236264510, 0.370674645560475860, 0.370628206958000580, 0.370581767428954430, -0.370535326973454200, 0.370488885591615690, 0.370442443283554970, 0.370396000049387720, 0.370349555889230850, 0.370303110803200110, 0.370256664791411620, 0.370210217853981010, -0.370163769991025290, 0.370117321202660170, 0.370070871489001310, 0.370024420850165680, 0.369977969286269030, 0.369931516797427420, 0.369885063383756650, 0.369838609045373580, -0.369792153782394000, 0.369745697594934030, 0.369699240483109430, 0.369652782447037140, 0.369606323486832920, 0.369559863602612840, 0.369513402794492680, 0.369466941062589480, -0.369420478407018920, 0.369374014827897110, 0.369327550325339870, 0.369281084899464210, 0.369234618550385810, 0.369188151278220860, 0.369141683083085090, 0.369095213965095590, -0.369048743924368040, 0.369002272961018170, 0.368955801075163070, 0.368909328266918470, 0.368862854536400550, 0.368816379883725070, 0.368769904309009020, 0.368723427812368220, -0.368676950393918900, 0.368630472053776750, 0.368583992792058830, 0.368537512608880960, 0.368491031504359300, 0.368444549478609660, 0.368398066531749060, 0.368351582663893230, -0.368305097875158530, 0.368258612165660580, 0.368212125535516580, 0.368165637984842250, 0.368119149513753410, 0.368072660122367110, 0.368026169810799160, 0.367979678579165800, -0.367933186427582830, 0.367886693356167300, 0.367840199365035040, 0.367793704454302260, 0.367747208624084830, 0.367700711874499760, 0.367654214205662970, 0.367607715617690570, -0.367561216110698530, 0.367514715684803820, 0.367468214340122330, 0.367421712076770320, 0.367375208894863640, 0.367328704794519290, 0.367282199775853190, 0.367235693838981250, -0.367189186984020420, 0.367142679211086620, 0.367096170520296140, 0.367049660911764830, 0.367003150385609770, 0.366956638941946860, 0.366910126580892280, 0.366863613302562060, -0.366817099107073160, 0.366770583994541540, 0.366724067965083440, 0.366677551018814770, 0.366631033155852660, 0.366584514376312950, 0.366537994680311950, 0.366491474067965510, -0.366444952539390860, 0.366398430094703800, 0.366351906734020240, 0.366305382457457360, 0.366258857265131020, 0.366212331157157510, 0.366165804133652790, 0.366119276194733940, -0.366072747340516920, 0.366026217571118030, 0.365979686886653170, 0.365933155287239520, 0.365886622772993000, 0.365840089344029900, 0.365793555000466180, 0.365747019742418970, -0.365700483570004180, 0.365653946483338210, 0.365607408482536980, 0.365560869567717610, 0.365514329738996110, 0.365467788996488740, 0.365421247340311510, 0.365374704770581590, -0.365328161287414850, 0.365281616890927360, 0.365235071581236190, 0.365188525358457360, 0.365141978222707220, 0.365095430174101730, 0.365048881212758080, 0.365002331338792230, -0.364955780552320530, 0.364909228853458940, 0.364862676242324770, 0.364816122719033850, 0.364769568283702610, 0.364723012936447100, 0.364676456677384410, 0.364629899506630610, -0.364583341424302040, 0.364536782430514740, 0.364490222525385880, 0.364443661709031470, 0.364397099981567440, 0.364350537343111120, 0.364303973793778490, 0.364257409333685890, -0.364210843962949340, 0.364164277681686080, 0.364117710490012180, 0.364071142388043940, 0.364024573375897500, 0.363978003453690020, 0.363931432621537490, 0.363884860879556400, -0.363838288227862790, 0.363791714666573780, 0.363745140195805560, 0.363698564815674470, 0.363651988526296540, 0.363605411327789060, 0.363558833220268110, 0.363512254203849580, -0.363465674278650840, 0.363419093444787960, 0.363372511702377330, 0.363325929051534990, 0.363279345492378230, 0.363232761025023110, 0.363186175649586110, 0.363139589366183290, -0.363093002174931840, 0.363046414075947900, 0.362999825069347970, 0.362953235155248020, 0.362906644333765400, 0.362860052605016190, 0.362813459969116850, 0.362766866426183440, -0.362720271976333270, 0.362673676619682420, 0.362627080356347390, 0.362580483186444200, 0.362533885110090270, 0.362487286127401610, 0.362440686238494290, 0.362394085443485730, -0.362347483742491930, 0.362300881135629420, 0.362254277623014260, 0.362207673204763880, 0.362161067880994280, 0.362114461651822040, 0.362067854517363170, 0.362021246477735150, -0.361974637533053980, 0.361928027683436180, 0.361881416928997950, 0.361834805269856560, 0.361788192706128220, 0.361741579237929320, 0.361694964865376110, 0.361648349588585880, -0.361601733407674760, 0.361555116322758940, 0.361508498333955710, 0.361461879441381250, 0.361415259645152090, 0.361368638945384350, 0.361322017342195430, 0.361275394835701480, -0.361228771426019000, 0.361182147113264240, 0.361135521897554490, 0.361088895779005940, 0.361042268757735150, 0.360995640833858270, 0.360949012007492740, 0.360902382278754650, -0.360855751647760570, 0.360809120114626740, 0.360762487679470560, 0.360715854342408100, 0.360669220103555620, 0.360622584963030460, 0.360575948920948850, 0.360529311977427440, -0.360482674132582280, 0.360436035386530850, 0.360389395739389330, 0.360342755191274290, 0.360296113742302030, 0.360249471392589840, 0.360202828142253960, 0.360156183991411030, -0.360109538940177280, 0.360062892988670000, 0.360016246137005560, 0.359969598385300460, 0.359922949733671000, 0.359876300182234540, 0.359829649731107310, 0.359782998380405620, -0.359736346130246800, 0.359689692980747100, 0.359643038932023210, 0.359596383984191250, 0.359549728137368800, 0.359503071391671980, 0.359456413747217540, 0.359409755204121610, -0.359363095762501690, 0.359316435422474050, 0.359269774184155340, 0.359223112047661770, 0.359176449013110850, 0.359129785080618770, 0.359083120250302260, 0.359036454522277500, -0.358989787896662080, 0.358943120373572120, 0.358896451953124420, 0.358849782635435150, 0.358803112420621790, 0.358756441308800740, 0.358709769300088130, 0.358663096394601480, -0.358616422592457130, 0.358569747893771720, 0.358523072298661480, 0.358476395807244050, 0.358429718419635560, 0.358383040135952850, 0.358336360956312050, 0.358289680880830800, -0.358242999909625330, 0.358196318042812380, 0.358149635280508190, 0.358102951622830350, 0.358056267069895130, 0.358009581621819280, 0.357962895278719000, 0.357916208040711950, -0.357869519907914320, 0.357822830880442530, 0.357776140958414040, 0.357729450141945240, 0.357682758431152770, 0.357636065826152980, 0.357589372327063500, 0.357542677934000520, -0.357495982647080880, 0.357449286466420880, 0.357402589392138090, 0.357355891424348810, 0.357309192563169790, 0.357262492808717360, 0.357215792161109160, 0.357169090620461430, -0.357122388186891020, 0.357075684860514220, 0.357028980641448560, 0.356982275529810540, 0.356935569525716370, 0.356888862629283650, 0.356842154840628810, 0.356795446159868630, -0.356748736587119360, 0.356702026122498680, 0.356655314766122940, 0.356608602518108890, 0.356561889378572970, 0.356515175347632720, 0.356468460425404480, 0.356421744612005150, -0.356375027907551050, 0.356328310312159720, 0.356281591825947710, 0.356234872449031680, 0.356188152181528050, 0.356141431023554440, 0.356094708975227270, 0.356047986036663320, -0.356001262207979010, 0.355954537489291960, 0.355907811880718520, 0.355861085382375150, 0.355814357994379490, 0.355767629716847940, 0.355720900549897360, 0.355674170493644080, -0.355627439548205750, 0.355580707713698870, 0.355533974990240200, 0.355487241377946180, 0.355440506876934460, 0.355393771487321490, 0.355347035209224120, 0.355300298042758700, -0.355253559988042980, 0.355206821045193350, 0.355160081214326630, 0.355113340495559320, 0.355066598889009100, 0.355019856394792390, 0.354973113013025590, 0.354926368743826440, -0.354879623587311340, 0.354832877543597160, 0.354786130612800450, 0.354739382795038750, 0.354692634090428670, 0.354645884499086960, 0.354599134021130140, 0.354552382656675880, -0.354505630405840650, 0.354458877268741370, 0.354412123245494480, 0.354365368336217730, 0.354318612541027530, 0.354271855860040790, 0.354225098293374010, 0.354178339841144880, -0.354131580503469930, 0.354084820280465560, 0.354038059172249620, 0.353991297178938460, 0.353944534300649150, 0.353897770537497990, 0.353851005889602890, 0.353804240357080250, -0.353757473940047030, 0.353710706638619700, 0.353663938452915990, 0.353617169383052430, 0.353570399429145980, 0.353523628591313140, 0.353476856869671620, 0.353430084264337920, -0.353383310775429060, 0.353336536403061510, 0.353289761147353000, 0.353242985008420110, 0.353196207986379300, 0.353149430081348410, 0.353102651293443980, 0.353055871622782900, -0.353009091069481700, 0.352962309633658210, 0.352915527315428970, 0.352868744114910870, 0.352821960032220490, 0.352775175067475630, 0.352728389220792860, 0.352681602492289140, -0.352634814882080930, 0.352588026390286140, 0.352541237017021280, 0.352494446762403320, 0.352447655626548840, 0.352400863609575620, 0.352354070711600240, 0.352307276932739720, -0.352260482273110580, 0.352213686732830600, 0.352166890312016480, 0.352120093010784670, 0.352073294829253040, 0.352026495767538190, 0.351979695825757110, 0.351932895004026360, -0.351886093302463790, 0.351839290721185970, 0.351792487260309930, 0.351745682919952280, 0.351698877700230840, 0.351652071601262160, 0.351605264623163330, 0.351558456766050910, -0.351511648030042810, 0.351464838415255550, 0.351418027921806210, 0.351371216549811350, 0.351324404299388880, 0.351277591170655430, 0.351230777163727580, 0.351183962278723170, -0.351137146515758890, 0.351090329874951760, 0.351043512356418340, 0.350996693960276550, 0.350949874686643070, 0.350903054535634860, 0.350856233507368610, 0.350809411601962220, -0.350762588819532320, 0.350715765160195870, 0.350668940624069670, 0.350622115211271460, 0.350575288921918030, 0.350528461756126340, 0.350481633714013090, 0.350434804795696160, -0.350387975001292210, 0.350341144330917950, 0.350294312784691200, 0.350247480362728680, 0.350200647065147470, 0.350153812892064260, 0.350106977843596900, 0.350060141919862070, -0.350013305120976890, 0.349966467447058060, 0.349919628898223480, 0.349872789474589830, 0.349825949176274190, 0.349779108003393240, 0.349732265956064990, 0.349685423034406030, -0.349638579238533530, 0.349591734568564180, 0.349544889024615890, 0.349498042606805340, 0.349451195315249760, 0.349404347150065740, 0.349357498111371230, 0.349310648199283040, -0.349263797413917780, 0.349216945755393470, 0.349170093223826750, 0.349123239819334850, 0.349076385542034410, 0.349029530392043430, 0.348982674369478610, 0.348935817474457070, -0.348888959707095600, 0.348842101067512180, 0.348795241555823480, 0.348748381172146680, 0.348701519916598530, 0.348654657789296940, 0.348607794790358750, 0.348560930919901090, -0.348514066178040650, 0.348467200564895500, 0.348420334080582320, 0.348373466725217850, 0.348326598498920170, 0.348279729401806020, 0.348232859433992510, 0.348185988595596460, -0.348139116886735820, 0.348092244307527440, 0.348045370858088400, 0.347998496538535540, 0.347951621348986880, 0.347904745289559110, 0.347857868360369530, 0.347810990561534810, -0.347764111893173080, 0.347717232355401030, 0.347670351948335900, 0.347623470672094540, 0.347576588526794850, 0.347529705512553690, 0.347482821629487900, 0.347435936877715460, -0.347389051257353140, 0.347342164768518200, 0.347295277411327430, 0.347248389185898900, 0.347201500092349400, 0.347154610130796130, 0.347107719301355980, 0.347060827604146860, -0.347013935039285740, 0.346967041606889740, 0.346920147307075770, 0.346873252139961790, 0.346826356105664700, 0.346779459204301700, 0.346732561435989680, 0.346685662800846670, -0.346638763298989460, 0.346591862930534960, 0.346544961695601230, 0.346498059594305070, 0.346451156626763730, 0.346404252793094170, 0.346357348093414340, 0.346310442527841100, -0.346263536096491800, 0.346216628799483280, 0.346169720636933520, 0.346122811608959520, 0.346075901715678480, 0.346028990957207290, 0.345982079333663980, 0.345935166845165510, -0.345888253491829110, 0.345841339273771700, 0.345794424191111340, 0.345747508243964890, 0.345700591432449690, 0.345653673756682600, 0.345606755216781750, 0.345559835812863980, -0.345512915545046210, 0.345465994413446550, 0.345419072418181980, 0.345372149559369680, 0.345325225837126550, 0.345278301251570830, 0.345231375802819370, 0.345184449490989420, -0.345137522316197930, 0.345090594278563090, 0.345043665378201750, 0.344996735615231250, 0.344949804989768460, 0.344902873501931610, 0.344855941151837600, 0.344809007939603670, -0.344762073865346850, 0.344715138929185260, 0.344668203131235810, 0.344621266471615450, 0.344574328950442320, 0.344527390567833380, 0.344480451323905980, 0.344433511218777020, -0.344386570252564690, 0.344339628425385960, 0.344292685737358110, 0.344245742188598160, 0.344198797779224300, 0.344151852509353370, 0.344104906379102900, 0.344057959388589680, -0.344011011537932010, 0.343964062827246790, 0.343917113256651420, 0.343870162826262870, 0.343823211536199320, 0.343776259386577740, 0.343729306377515090, 0.343682352509129600, -0.343635397781538230, 0.343588442194858350, 0.343541485749206950, 0.343494528444702240, 0.343447570281461220, 0.343400611259601310, 0.343353651379239400, 0.343306690640493850, -0.343259729043481510, 0.343212766588319840, 0.343165803275125860, 0.343118839104017800, 0.343071874075112640, 0.343024908188527820, 0.342977941444380260, 0.342930973842788310, -0.342884005383868870, 0.342837036067739460, 0.342790065894517050, 0.342743094864319860, 0.342696122977264930, 0.342649150233469310, 0.342602176633051200, 0.342555202176127670, -0.342508226862816120, 0.342461250693233630, 0.342414273667498380, 0.342367295785727440, 0.342320317048038280, 0.342273337454547910, 0.342226357005374630, 0.342179375700635450, -0.342132393540447830, 0.342085410524928800, 0.342038426654196650, 0.341991441928368440, 0.341944456347561650, 0.341897469911893290, 0.341850482621481650, 0.341803494476443810, -0.341756505476896840, 0.341709515622959040, 0.341662524914747410, 0.341615533352379490, 0.341568540935972280, 0.341521547665644190, 0.341474553541512180, 0.341427558563693830, -0.341380562732306160, 0.341333566047467450, 0.341286568509294900, 0.341239570117905900, 0.341192570873417530, 0.341145570775948200, 0.341098569825614870, 0.341051568022535170, -0.341004565366826160, 0.340957561858606100, 0.340910557497992150, 0.340863552285101400, 0.340816546220052140, 0.340769539302961550, 0.340722531533947160, 0.340675522913125970, -0.340628513440616400, 0.340581503116535570, 0.340534491941000940, 0.340487479914129700, 0.340440467036040140, 0.340393453306849450, 0.340346438726675080, 0.340299423295634230, -0.340252407013845240, 0.340205389881425240, 0.340158371898491740, 0.340111353065161880, 0.340064333381554120, 0.340017312847785470, 0.339970291463973120, 0.339923269230235470, -0.339876246146689650, 0.339829222213453240, 0.339782197430643310, 0.339735171798378370, 0.339688145316775440, 0.339641117985952150, 0.339594089806025680, 0.339547060777114380, -0.339500030899335450, 0.339453000172806440, 0.339405968597644490, 0.339358936173968060, 0.339311902901894280, 0.339264868781540720, 0.339217833813024620, 0.339170797996464320, -0.339123761331977020, 0.339076723819680290, 0.339029685459691420, 0.338982646252128710, 0.338935606197109330, 0.338888565294750590, 0.338841523545170830, 0.338794480948487240, -0.338747437504817510, 0.338700393214278690, 0.338653348076989320, 0.338606302093066640, 0.338559255262628140, 0.338512207585791150, 0.338465159062673990, 0.338418109693393980, -0.338371059478068670, 0.338324008416815310, 0.338276956509752310, 0.338229903756996960, 0.338182850158666840, 0.338135795714879170, 0.338088740425752430, 0.338041684291403850, -0.337994627311950680, 0.337947569487511310, 0.337900510818202990, 0.337853451304143460, 0.337806390945449840, 0.337759329742240650, 0.337712267694633140, 0.337665204802744980, -0.337618141066693410, 0.337571076486596900, 0.337524011062572680, 0.337476944794738390, 0.337429877683211370, 0.337382809728110080, 0.337335740929551760, 0.337288671287654050, -0.337241600802534290, 0.337194529474310940, 0.337147457303101250, 0.337100384289022500, 0.337053310432193220, 0.337006235732730700, 0.336959160190752500, 0.336912083806376050, -0.336865006579719790, 0.336817928510901030, 0.336770849600037450, 0.336723769847246280, 0.336676689252646160, 0.336629607816354260, 0.336582525538488390, 0.336535442419165780, -0.336488358458504940, 0.336441273656623240, 0.336394188013638350, 0.336347101529667570, 0.336300014204829470, 0.336252926039241340, 0.336205837033020870, 0.336158747186285410, -0.336111656499153480, 0.336064564971742420, 0.336017472604169530, 0.335970379396553390, 0.335923285349011280, 0.335876190461660950, 0.335829094734619750, 0.335781998168006190, -0.335734900761937680, 0.335687802516531910, 0.335640703431906220, 0.335593603508179130, 0.335546502745468100, 0.335499401143890820, 0.335452298703564580, 0.335405195424608000, -0.335358091307138450, 0.335310986351273710, 0.335263880557131020, 0.335216773924829070, 0.335169666454485200, 0.335122558146216780, 0.335075449000142300, 0.335028339016379240, -0.334981228195045390, 0.334934116536257990, 0.334887004040135720, 0.334839890706795930, 0.334792776536356420, 0.334745661528934530, 0.334698545684648960, 0.334651429003617000, -0.334604311485956480, 0.334557193131784720, 0.334510073941220450, 0.334462953914380970, 0.334415833051384110, 0.334368711352347250, 0.334321588817388990, 0.334274465446626810, -0.334227341240178000, 0.334180216198161300, 0.334133090320694050, 0.334085963607894050, 0.334038836059878770, 0.333991707676766780, 0.333944578458675530, 0.333897448405722830, -0.333850317518026130, 0.333803185795704000, 0.333756053238873920, 0.333708919847653720, 0.333661785622160810, 0.333614650562513830, 0.333567514668830220, 0.333520377941227850, -0.333473240379824120, 0.333426101984737710, 0.333378962756086030, 0.333331822693986920, 0.333284681798557860, 0.333237540069917510, 0.333190397508183300, 0.333143254113472680, -0.333096109885904380, 0.333048964825595760, 0.333001818932664730, 0.332954672207228800, 0.332907524649406540, 0.332860376259315470, 0.332813227037073500, 0.332766076982798030, -0.332718926096607750, 0.332671774378620170, 0.332624621828953190, 0.332577468447724180, 0.332530314235051970, 0.332483159191053980, 0.332436003315848050, 0.332388846609551700, -0.332341689072283670, 0.332294530704161430, 0.332247371505302420, 0.332200211475825400, 0.332153050615847820, 0.332105888925487650, 0.332058726404862340, 0.332011563054090630, -0.331964398873290050, 0.331917233862578430, 0.331870068022073310, 0.331822901351893460, 0.331775733852156310, 0.331728565522979860, 0.331681396364481570, 0.331634226376780250, -0.331587055559993290, 0.331539883914238720, 0.331492711439634050, 0.331445538136298010, 0.331398364004348080, 0.331351189043901870, 0.331304013255078080, 0.331256836637994270, -0.331209659192768400, 0.331162480919517890, 0.331115301818361680, 0.331068121889417140, 0.331020941132802340, 0.330973759548634730, 0.330926577137033220, 0.330879393898115160, -0.330832209831998680, 0.330785024938801240, 0.330737839218641690, 0.330690652671637500, 0.330643465297906720, 0.330596277097566840, 0.330549088070736630, 0.330501898217533780, -0.330454707538075710, 0.330407516032481310, 0.330360323700868150, 0.330313130543354150, 0.330265936560056930, 0.330218741751095220, 0.330171546116586720, 0.330124349656649330, -0.330077152371400670, 0.330029954260959550, 0.329982755325443520, 0.329935555564970620, 0.329888354979658400, 0.329841153569625680, 0.329793951334990120, 0.329746748275869690, -0.329699544392381970, 0.329652339684645750, 0.329605134152778760, 0.329557927796898850, 0.329510720617123780, 0.329463512613572260, 0.329416303786362000, 0.329369094135610550, -0.329321883661436830, 0.329274672363958350, 0.329227460243293190, 0.329180247299558970, 0.329133033532874540, 0.329085818943357530, 0.329038603531126020, 0.328991387296297510, -0.328944170238991030, 0.328896952359324040, 0.328849733657414710, 0.328802514133380630, 0.328755293787340700, 0.328708072619412480, 0.328660850629714120, 0.328613627818363230, -0.328566404185478670, 0.328519179731178060, 0.328471954455579140, 0.328424728358800710, 0.328377501440960510, 0.328330273702176540, 0.328283045142566450, 0.328235815762249140, -0.328188585561342340, 0.328141354539964070, 0.328094122698231960, 0.328046890036264970, 0.327999656554180790, 0.327952422252097480, 0.327905187130132610, 0.327857951188405270, -0.327810714427033020, 0.327763476846133990, 0.327716238445825870, 0.327668999226227550, 0.327621759187456730, 0.327574518329631080, 0.327527276652869630, 0.327480034157289880, -0.327432790843010140, 0.327385546710147970, 0.327338301758822340, 0.327291055989150930, 0.327243809401251920, 0.327196561995242940, 0.327149313771243010, 0.327102064729369760, -0.327054814869741360, 0.327007564192475510, 0.326960312697691160, 0.326913060385506050, 0.326865807256038250, 0.326818553309405570, 0.326771298545726900, 0.326724042965119980, -0.326676786567702940, 0.326629529353593520, 0.326582271322910680, 0.326535012475772210, 0.326487752812295750, 0.326440492332600360, 0.326393231036803730, 0.326345968925023990, -0.326298705997378920, 0.326251442253987500, 0.326204177694967510, 0.326156912320437090, 0.326109646130513910, 0.326062379125317050, 0.326015111304964240, 0.325967842669573680, -0.325920573219263100, 0.325873302954151460, 0.325826031874356600, 0.325778759979996610, 0.325731487271189390, 0.325684213748053790, 0.325636939410707700, 0.325589664259268830, -0.325542388293856230, 0.325495111514587600, 0.325447833921581280, 0.325400555514954890, 0.325353276294827580, 0.325305996261317010, 0.325258715414541540, 0.325211433754618810, -0.325164151281667920, 0.325116867995806640, 0.325069583897153180, 0.325022298985825410, 0.324975013261942220, 0.324927726725621590, 0.324880439376981580, 0.324833151216140040, -0.324785862243216090, 0.324738572458327490, 0.324691281861592020, 0.324643990453128750, 0.324596698233055480, 0.324549405201490500, 0.324502111358551610, 0.324454816704357830, -0.324407521239027000, 0.324360224962677410, 0.324312927875426820, 0.324265629977394280, 0.324218331268697700, 0.324171031749455330, 0.324123731419784900, 0.324076430279805590, -0.324029128329635210, 0.323981825569392030, 0.323934521999193810, 0.323887217619159780, 0.323839912429407630, 0.323792606430055310, 0.323745299621221890, 0.323697992003025240, -0.323650683575583580, 0.323603374339014820, 0.323556064293438030, 0.323508753438971060, 0.323461441775732270, 0.323414129303839390, 0.323366816023411660, 0.323319501934566820, -0.323272187037423280, 0.323224871332098870, 0.323177554818712630, 0.323130237497382570, 0.323082919368226860, 0.323035600431363480, 0.322988280686911490, 0.322940960134988850, -0.322893638775713750, 0.322846316609204150, 0.322798993635579180, 0.322751669854956740, 0.322704345267454670, 0.322657019873192170, 0.322609693672287150, 0.322562366664857880, -0.322515038851022280, 0.322467710230899480, 0.322420380804607390, 0.322373050572264400, 0.322325719533988360, 0.322278387689898420, 0.322231055040112510, 0.322183721584748950, -0.322136387323925690, 0.322089052257761850, 0.322041716386375410, 0.321994379709884650, 0.321947042228407590, 0.321899703942063240, 0.321852364850969740, 0.321805024955244820, -0.321757684255007780, 0.321710342750376580, 0.321663000441469450, 0.321615657328404470, 0.321568313411300710, 0.321520968690276190, 0.321473623165449250, 0.321426276836937810, -0.321378929704861150, 0.321331581769337130, 0.321284233030484150, 0.321236883488420170, 0.321189533143264430, 0.321142181995134830, 0.321094830044149740, 0.321047477290427210, -0.321000123734086370, 0.320952769375245250, 0.320905414214021800, 0.320858058250535210, 0.320810701484903480, 0.320763343917244980, 0.320715985547677720, 0.320668626376320930, -0.320621266403292530, 0.320573905628711020, 0.320526544052694260, 0.320479181675361600, 0.320431818496831000, 0.320384454517220860, 0.320337089736649090, 0.320289724155235100, -0.320242357773096790, 0.320194990590352560, 0.320147622607120430, 0.320100253823519640, 0.320052884239668270, 0.320005513855684650, 0.319958142671686820, 0.319910770687794110, -0.319863397904124440, 0.319816024320795810, 0.319768649937927580, 0.319721274755637720, 0.319673898774044730, 0.319626521993266470, 0.319579144413422390, 0.319531766034630460, -0.319484386857009080, 0.319437006880676330, 0.319389626105751500, 0.319342244532352550, 0.319294862160598050, 0.319247478990605900, 0.319200095022495520, 0.319152710256384920, -0.319105324692392560, 0.319057938330636390, 0.319010551171235830, 0.318963163214308950, 0.318915774459973660, 0.318868384908349400, 0.318820994559554150, 0.318773603413706470, -0.318726211470924280, 0.318678818731327030, 0.318631425195032740, 0.318584030862159860, 0.318536635732826480, 0.318489239807151990, 0.318441843085254360, 0.318394445567252100, -0.318347047253263350, 0.318299648143407330, 0.318252248237802240, 0.318204847536566530, 0.318157446039818330, 0.318110043747676870, 0.318062640660260300, 0.318015236777686730, -0.317967832100075450, 0.317920426627544660, 0.317873020360212750, 0.317825613298197860, 0.317778205441619390, 0.317730796790595400, 0.317683387345244430, 0.317635977105684530, -0.317588566072035170, 0.317541154244414370, 0.317493741622940640, 0.317446328207732160, 0.317398913998908290, 0.317351498996587160, 0.317304083200887270, 0.317256666611926750, -0.317209249229824960, 0.317161831054700080, 0.317114412086670180, 0.317066992325854670, 0.317019571772371670, 0.316972150426339750, 0.316924728287877040, 0.316877305357102900, -0.316829881634135560, 0.316782457119093470, 0.316735031812094840, 0.316687605713259050, 0.316640178822704230, 0.316592751140548970, 0.316545322666911380, 0.316497893401910920, -0.316450463345665730, 0.316403032498294430, 0.316355600859915100, 0.316308168430647190, 0.316260735210608820, 0.316213301199918640, 0.316165866398694760, 0.316118430807056710, -0.316070994425122490, 0.316023557253010400, 0.315976119290839850, 0.315928680538729020, 0.315881240996796490, 0.315833800665160370, 0.315786359543940240, 0.315738917633254180, -0.315691474933220810, 0.315644031443958360, 0.315596587165586250, 0.315549142098222660, 0.315501696241986210, 0.315454249596995140, 0.315406802163368800, 0.315359353941225500, -0.315311904930683840, 0.315264455131861960, 0.315217004544879330, 0.315169553169854230, 0.315122101006904850, 0.315074648056150600, 0.315027194317709760, 0.314979739791700910, -0.314932284478242290, 0.314884828377453410, 0.314837371489452400, 0.314789913814358000, 0.314742455352288400, 0.314694996103363040, 0.314647536067700240, 0.314600075245418610, -0.314552613636636340, 0.314505151241472940, 0.314457688060046700, 0.314410224092476210, 0.314362759338879750, 0.314315293799376840, 0.314267827474085660, 0.314220360363124510, -0.314172892466612840, 0.314125423784669010, 0.314077954317411530, 0.314030484064958810, 0.313983013027430310, 0.313935541204944210, 0.313888068597619310, 0.313840595205573840, -0.313793121028927260, 0.313745646067797870, 0.313698170322304400, 0.313650693792565050, 0.313603216478699430, 0.313555738380825730, 0.313508259499062690, 0.313460779833528600, -0.313413299384342980, 0.313365818151624060, 0.313318336135490650, 0.313270853336060970, 0.313223369753454550, 0.313175885387789730, 0.313128400239184810, 0.313080914307759250, -0.313033427593631450, 0.312985940096920050, 0.312938451817743380, 0.312890962756221020, 0.312843472912471220, 0.312795982286612760, 0.312748490878763940, 0.312700998689044330, -0.312653505717572170, 0.312606011964466250, 0.312558517429844920, 0.312511022113827700, 0.312463526016532930, 0.312416029138079310, 0.312368531478585230, 0.312321033038170210, -0.312273533816952660, 0.312226033815050820, 0.312178533032584300, 0.312131031469671470, 0.312083529126431060, 0.312036026002981410, 0.311988522099442110, 0.311941017415931550, -0.311893511952568370, 0.311846005709471020, 0.311798498686759130, 0.311750990884550940, 0.311703482302965240, 0.311655972942120440, 0.311608462802136170, 0.311560951883130710, -0.311513440185222870, 0.311465927708531040, 0.311418414453174750, 0.311370900419272460, 0.311323385606942500, 0.311275870016304520, 0.311228353647476810, 0.311180836500578260, -0.311133318575727180, 0.311085799873043240, 0.311038280392644750, 0.310990760134650600, 0.310943239099179150, 0.310895717286350020, 0.310848194696281550, 0.310800671329092610, -0.310753147184901600, 0.310705622263828140, 0.310658096565990580, 0.310610570091507830, 0.310563042840498180, 0.310515514813081370, 0.310467986009375810, 0.310420456429499840, -0.310372926073573140, 0.310325394941714130, 0.310277863034041590, 0.310230330350674040, 0.310182796891731060, 0.310135262657331050, 0.310087727647592960, 0.310040191862635090, -0.309992655302577140, 0.309945117967537600, 0.309897579857635220, 0.309850040972988460, 0.309802501313717060, 0.309754960879939370, 0.309707419671774340, 0.309659877689340280, -0.309612334932756970, 0.309564791402142820, 0.309517247097616690, 0.309469702019297020, 0.309422156167303510, 0.309374609541754660, 0.309327062142768780, 0.309279513970465710, -0.309231965024963860, 0.309184415306382130, 0.309136864814838870, 0.309089313550453940, 0.309041761513345670, 0.308994208703633030, 0.308946655121434430, 0.308899100766869610, -0.308851545640057010, 0.308803989741115610, 0.308756433070163760, 0.308708875627321300, 0.308661317412706640, 0.308613758426438680, 0.308566198668635880, 0.308518638139417990, -0.308471076838903570, 0.308423514767210970, 0.308375951924460050, 0.308328388310769250, 0.308280823926257440, 0.308233258771043180, 0.308185692845246220, 0.308138126148984950, -0.308090558682378450, 0.308042990445545060, 0.307995421438604640, 0.307947851661675710, 0.307900281114877110, 0.307852709798327410, 0.307805137712146290, 0.307757564856452390, -0.307709991231364550, 0.307662416837001350, 0.307614841673482520, 0.307567265740926580, 0.307519689039452040, 0.307472111569178700, 0.307424533330225070, 0.307376954322710120, -0.307329374546752350, 0.307281794002471580, 0.307234212689986350, 0.307186630609415530, 0.307139047760877750, 0.307091464144492790, 0.307043879760379110, 0.306996294608655800, -0.306948708689441300, 0.306901122002855460, 0.306853534549016820, 0.306805946328044310, 0.306758357340056520, 0.306710767585173290, 0.306663177063513090, 0.306615585775194990, -0.306567993720337490, 0.306520400899060460, 0.306472807311482350, 0.306425212957721850, 0.306377617837898740, 0.306330021952131600, 0.306282425300539400, 0.306234827883240690, -0.306187229700355330, 0.306139630752001960, 0.306092031038299460, 0.306044430559366420, 0.305996829315322790, 0.305949227306287100, 0.305901624532378290, 0.305854020993715000, -0.305806416690417140, 0.305758811622603150, 0.305711205790392180, 0.305663599193902790, 0.305615991833254770, 0.305568383708566820, 0.305520774819957490, 0.305473165167546630, -0.305425554751452830, 0.305377943571795210, 0.305330331628692280, 0.305282718922263880, 0.305235105452628770, 0.305187491219905850, 0.305139876224213790, 0.305092260465672450, -0.305044643944400510, 0.304997026660516920, 0.304949408614140330, 0.304901789805390620, 0.304854170234386490, 0.304806549901246950, 0.304758928806090570, 0.304711306949037250, -0.304663684330205740, 0.304616060949714550, 0.304568436807683640, 0.304520811904231690, 0.304473186239477670, 0.304425559813540250, 0.304377932626539340, 0.304330304678593620, -0.304282675969822170, 0.304235046500343550, 0.304187416270277790, 0.304139785279743450, 0.304092153528859650, 0.304044521017745040, 0.303996887746519560, 0.303949253715301900, -0.303901618924211080, 0.303853983373365780, 0.303806347062885900, 0.303758709992890230, 0.303711072163497300, 0.303663433574827170, 0.303615794226998410, 0.303568154120130160, -0.303520513254341150, 0.303472871629751280, 0.303425229246479190, 0.303377586104644050, 0.303329942204364490, 0.303282297545760530, 0.303234652128950840, 0.303187005954054460, -0.303139359021190210, 0.303091711330477960, 0.303044062882036450, 0.302996413675984730, 0.302948763712441560, 0.302901112991526940, 0.302853461513359570, 0.302805809278058450, -0.302758156285742490, 0.302710502536531480, 0.302662848030544220, 0.302615192767899440, 0.302567536748717110, 0.302519879973115910, 0.302472222441215080, 0.302424564153133180, -0.302376905108990350, 0.302329245308905260, 0.302281584752997050, 0.302233923441384390, 0.302186261374187410, 0.302138598551524750, 0.302090934973515630, 0.302043270640278750, -0.301995605551934050, 0.301947939708600400, 0.301900273110396910, 0.301852605757442270, 0.301804937649856550, 0.301757268787758490, 0.301709599171266830, 0.301661928800501580, -0.301614257675581530, 0.301566585796625870, 0.301518913163753290, 0.301471239777083840, 0.301423565636736280, 0.301375890742829830, 0.301328215095483240, 0.301280538694816520, -0.301232861540948470, 0.301185183633998210, 0.301137504974084650, 0.301089825561327680, 0.301042145395846170, 0.300994464477759290, 0.300946782807185840, 0.300899100384245890, -0.300851417209058110, 0.300803733281741430, 0.300756048602415840, 0.300708363171200090, 0.300660676988213470, 0.300612990053574670, 0.300565302367403860, 0.300517613929819790, -0.300469924740941700, 0.300422234800888370, 0.300374544109779870, 0.300326852667735010, 0.300279160474873020, 0.300231467531312750, 0.300183773837174150, 0.300136079392576140, -0.300088384197637950, 0.300040688252478370, 0.299992991557217540, 0.299945294111974180, 0.299897595916867600, 0.299849896972016580, 0.299802197277541260, 0.299754496833560480, -0.299706795640192980, 0.299659093697558940, 0.299611391005777160, 0.299563687564966930, 0.299515983375246990, 0.299468278436737570, 0.299420572749557470, 0.299372866313825870, -0.299325159129661730, 0.299277451197185130, 0.299229742516514850, 0.299182033087770250, 0.299134322911070170, 0.299086611986534630, 0.299038900314282650, 0.298991187894433350, -0.298943474727105700, 0.298895760812419750, 0.298848046150494430, 0.298800330741448570, 0.298752614585402250, 0.298704897682474440, 0.298657180032784410, 0.298609461636450970, -0.298561742493594300, 0.298514022604333300, 0.298466301968787210, 0.298418580587074990, 0.298370858459316710, 0.298323135585631280, 0.298275411966137990, 0.298227687600955800, -0.298179962490204790, 0.298132236634003840, 0.298084510032472330, 0.298036782685729140, 0.297989054593894410, 0.297941325757087040, 0.297893596175425880, 0.297845865849031220, -0.297798134778021860, 0.297750402962517200, 0.297702670402636090, 0.297654937098498720, 0.297607203050223980, 0.297559468257931280, 0.297511732721739470, 0.297463996441768740, -0.297416259418138040, 0.297368521650966670, 0.297320783140373580, 0.297273043886478960, 0.297225303889401770, 0.297177563149261250, 0.297129821666176460, 0.297082079440267490, -0.297034336471653340, 0.296986592760452920, 0.296938848306786460, 0.296891103110772880, 0.296843357172531520, 0.296795610492181340, 0.296747863069842580, 0.296700114905634140, -0.296652365999675430, 0.296604616352085400, 0.296556865962984200, 0.296509114832490870, 0.296461362960724780, 0.296413610347804830, 0.296365856993851260, 0.296318102898983080, -0.296270348063319590, 0.296222592486979850, 0.296174836170084050, 0.296127079112751160, 0.296079321315100560, 0.296031562777251230, 0.295983803499323460, 0.295936043481436150, -0.295888282723708320, 0.295840521226260200, 0.295792758989210760, 0.295744996012679400, 0.295697232296785180, 0.295649467841648310, 0.295601702647387720, 0.295553936714122890, -0.295506170041972830, 0.295458402631057710, 0.295410634481496630, 0.295362865593408960, 0.295315095966913690, 0.295267325602131090, 0.295219554499180190, 0.295171782658180390, -0.295124010079250760, 0.295076236762511490, 0.295028462708081640, 0.294980687916080180, 0.294932912386627440, 0.294885136119842410, 0.294837359115844580, 0.294789581374752920, -0.294741802896687670, 0.294694023681768000, 0.294646243730113220, 0.294598463041842400, 0.294550681617075870, 0.294502899455932610, 0.294455116558532130, 0.294407332924993440, -0.294359548555436780, 0.294311763449981330, 0.294263977608746400, 0.294216191031851150, 0.294168403719415830, 0.294120615671559500, 0.294072826888401250, 0.294025037370061300, -0.293977247116658790, 0.293929456128313120, 0.293881664405143410, 0.293833871947270010, 0.293786078754811890, 0.293738284827888550, 0.293690490166619080, 0.293642694771123810, -0.293594898641521830, 0.293547101777932580, 0.293499304180475150, 0.293451505849269930, 0.293403706784435890, 0.293355906986092600, 0.293308106454359120, 0.293260305189355810, -0.293212503191201730, 0.293164700460016410, 0.293116896995918860, 0.293069092799029540, 0.293021287869467460, 0.292973482207351750, 0.292925675812802770, 0.292877868685939620, -0.292830060826881730, 0.292782252235748330, 0.292734442912659710, 0.292686632857734940, 0.292638822071093650, 0.292591010552854860, 0.292543198303138910, 0.292495385322065040, -0.292447571609752650, 0.292399757166320940, 0.292351941991890300, 0.292304126086579740, 0.292256309450508900, 0.292208492083796840, 0.292160673986563980, 0.292112855158929430, -0.292065035601012320, 0.292017215312933060, 0.291969394294810720, 0.291921572546764980, 0.291873750068914810, 0.291825926861380700, 0.291778102924281800, 0.291730278257737620, -0.291682452861867340, 0.291634626736791300, 0.291586799882628760, 0.291538972299499210, 0.291491143987521790, 0.291443314946816910, 0.291395485177503800, 0.291347654679701920, -0.291299823453530500, 0.291251991499109960, 0.291204158816559420, 0.291156325405998060, 0.291108491267546340, 0.291060656401323340, 0.291012820807448720, 0.290964984486041690, -0.290917147437222520, 0.290869309661110520, 0.290821471157825310, 0.290773631927485900, 0.290725791970212870, 0.290677951286125390, 0.290630109875342990, 0.290582267737984960, -0.290534424874171580, 0.290486581284022220, 0.290438736967656370, 0.290390891925193300, 0.290343046156753380, 0.290295199662455820, 0.290247352442419890, 0.290199504496765960, -0.290151655825613310, 0.290103806429081510, 0.290055956307289750, 0.290008105460358550, 0.289960253888407070, 0.289912401591554960, 0.289864548569921440, 0.289816694823626930, -0.289768840352790710, 0.289720985157532360, 0.289673129237971170, 0.289625272594227550, 0.289577415226420780, 0.289529557134670430, 0.289481698319095810, 0.289433838779817320, -0.289385978516954250, 0.289338117530626270, 0.289290255820952520, 0.289242393388053580, 0.289194530232048660, 0.289146666353056970, 0.289098801751199060, 0.289050936426594130, -0.289003070379361900, 0.288955203609621510, 0.288907336117493590, 0.288859467903097300, 0.288811598966552340, 0.288763729307977950, 0.288715858927494680, 0.288667987825221740, -0.288620116001278850, 0.288572243455785250, 0.288524370188861460, 0.288476496200626710, 0.288428621491200800, 0.288380746060702850, 0.288332869909253440, 0.288284993036971910, -0.288237115443977450, 0.288189237130390630, 0.288141358096330740, 0.288093478341917400, 0.288045597867269960, 0.287997716672508950, 0.287949834757753650, 0.287901952123123810, -0.287854068768738590, 0.287806184694718690, 0.287758299901183290, 0.287710414388252180, 0.287662528156044540, 0.287614641204681050, 0.287566753534280960, 0.287518865144963940, -0.287470976036849400, 0.287423086210057800, 0.287375195664708480, 0.287327304400920800, 0.287279412418815220, 0.287231519718511130, 0.287183626300128280, 0.287135732163785910, -0.287087837309604630, 0.287039941737703750, 0.286992045448203000, 0.286944148441221740, 0.286896250716880570, 0.286848352275298700, 0.286800453116596020, 0.286752553240891720, -0.286704652648306470, 0.286656751338959630, 0.286608849312970870, 0.286560946570459610, 0.286513043111546350, 0.286465138936350510, 0.286417234044991860, 0.286369328437589670, -0.286321422114264530, 0.286273515075135880, 0.286225607320323040, 0.286177698849946590, 0.286129789664125890, 0.286081879762980720, 0.286033969146630430, 0.285986057815195590, -0.285938145768795670, 0.285890233007550400, 0.285842319531579070, 0.285794405341002370, 0.285746490435939690, 0.285698574816510730, 0.285650658482834940, 0.285602741435032950, -0.285554823673224100, 0.285506905197528190, 0.285458986008064570, 0.285411066104953930, 0.285363145488315590, 0.285315224158268990, 0.285267302114934780, 0.285219379358432280, -0.285171455888881320, 0.285123531706401310, 0.285075606811112940, 0.285027681203135490, 0.284979754882588860, 0.284931827849592420, 0.284883900104266840, 0.284835971646731520, -0.284788042477106260, 0.284740112595510460, 0.284692182002064810, 0.284644250696888700, 0.284596318680101930, 0.284548385951823970, 0.284500452512175480, 0.284452518361275890, -0.284404583499244520, 0.284356647926202130, 0.284308711642268120, 0.284260774647562390, 0.284212836942204230, 0.284164898526314440, 0.284116959400012360, 0.284069019563417900, -0.284021079016650470, 0.283973137759830800, 0.283925195793078230, 0.283877253116512740, 0.283829309730253610, 0.283781365634421690, 0.283733420829136330, 0.283685475314517430, -0.283637529090684400, 0.283589582157757980, 0.283541634515857620, 0.283493686165102730, 0.283445737105614050, 0.283397787337511090, 0.283349836860913580, 0.283301885675941060, -0.283253933782714300, 0.283205981181352650, 0.283158027871976080, 0.283110073854704050, 0.283062119129657170, 0.283014163696955090, 0.282966207556717530, 0.282918250709064070, -0.282870293154115380, 0.282822334891990930, 0.282774375922810680, 0.282726416246694090, 0.282678455863761830, 0.282630494774133490, 0.282582532977928850, 0.282534570475267530, -0.282486607266270120, 0.282438643351056230, 0.282390678729745330, 0.282342713402458150, 0.282294747369314150, 0.282246780630433350, 0.282198813185935090, 0.282150845035940290, -0.282102876180568340, 0.282054906619939210, 0.282006936354172400, 0.281958965383388660, 0.281910993707707500, 0.281863021327248890, 0.281815048242132270, 0.281767074452478450, -0.281719099958406990, 0.281671124760037750, 0.281623148857490240, 0.281575172250885350, 0.281527194940342450, 0.281479216925981210, 0.281431238207922320, 0.281383258786285340, -0.281335278661190240, 0.281287297832756470, 0.281239316301104880, 0.281191334066355050, 0.281143351128626820, 0.281095367488039870, 0.281047383144714840, 0.280999398098771390, -0.280951412350329440, 0.280903425899508560, 0.280855438746429540, 0.280807450891211900, 0.280759462333975640, 0.280711473074840290, 0.280663483113926690, 0.280615492451354360, -0.280567501087242930, 0.280519509021713130, 0.280471516254884530, 0.280423522786877210, 0.280375528617810620, 0.280327533747805610, 0.280279538176981810, 0.280231541905459130, -0.280183544933357230, 0.280135547260796810, 0.280087548887897550, 0.280039549814779460, 0.279991550041562070, 0.279943549568366150, 0.279895548395311440, 0.279847546522517810, -0.279799543950104920, 0.279751540678193580, 0.279703536706903400, 0.279655532036354350, 0.279607526666666050, 0.279559520597959410, 0.279511513830353890, 0.279463506363969220, -0.279415498198926190, 0.279367489335344390, 0.279319479773343930, 0.279271469513044270, 0.279223458554566430, 0.279175446898029870, 0.279127434543554760, 0.279079421491260640, -0.279031407741268330, 0.278983393293697530, 0.278935378148668260, 0.278887362306300120, 0.278839345766713990, 0.278791328530029470, 0.278743310596366700, 0.278695291965845190, -0.278647272638585850, 0.278599252614708360, 0.278551231894332290, 0.278503210477578590, 0.278455188364566840, 0.278407165555417110, 0.278359142050249090, 0.278311117849183610, -0.278263092952340310, 0.278215067359839310, 0.278167041071800240, 0.278119014088343940, 0.278070986409590160, 0.278022958035658850, 0.277974928966669750, 0.277926899202743770, -0.277878868744000530, 0.277830837590560100, 0.277782805742542220, 0.277734773200067670, 0.277686739963256210, 0.277638706032227510, 0.277590671407102420, 0.277542636088000670, -0.277494600075042340, 0.277446563368347050, 0.277398525968035830, 0.277350487874228280, 0.277302449087044490, 0.277254409606604140, 0.277206369433028230, 0.277158328566436410, -0.277110287006948730, 0.277062244754684880, 0.277014201809765880, 0.276966158172311410, 0.276918113842441470, 0.276870068820275870, 0.276822023105935510, 0.276773976699540130, -0.276725929601209790, 0.276677881811064170, 0.276629833329224250, 0.276581784155809810, 0.276533734290940470, 0.276485683734737200, 0.276437632487319730, 0.276389580548808190, -0.276341527919322260, 0.276293474598982900, 0.276245420587909910, 0.276197365886223340, 0.276149310494042950, 0.276101254411489690, 0.276053197638683300, 0.276005140175743900, -0.275957082022791230, 0.275909023179946310, 0.275860963647328820, 0.275812903425058930, 0.275764842513256340, 0.275716780912042050, 0.275668718621535860, 0.275620655641857390, -0.275572591973127780, 0.275524527615466640, 0.275476462568994160, 0.275428396833830140, 0.275380330410095520, 0.275332263297910110, 0.275284195497394020, 0.275236127008667010, -0.275188057831850130, 0.275139987967063070, 0.275091917414426070, 0.275043846174058860, 0.274995774246082400, 0.274947701630616600, 0.274899628327781480, 0.274851554337696870, -0.274803479660483800, 0.274755404296262050, 0.274707328245151370, 0.274659251507272770, 0.274611174082746050, 0.274563095971691370, 0.274515017174228550, 0.274466937690478640, -0.274418857520561330, 0.274370776664596920, 0.274322695122705130, 0.274274612895007040, 0.274226529981622390, 0.274178446382671410, 0.274130362098273910, 0.274082277128550930, -0.274034191473622290, 0.273986105133608100, 0.273938018108628280, 0.273889930398803830, 0.273841842004254540, 0.273793752925100220, 0.273745663161461930, 0.273697572713459510, -0.273649481581213110, 0.273601389764842660, 0.273553297264469090, 0.273505204080212340, 0.273457110212192540, 0.273409015660529500, 0.273360920425344430, 0.273312824506756980, -0.273264727904887540, 0.273216630619855790, 0.273168532651782920, 0.273120434000788730, 0.273072334666993490, 0.273024234650516890, 0.272976133951480240, 0.272928032570003140, -0.272879930506206070, 0.272831827760208650, 0.272783724332132160, 0.272735620222096350, 0.272687515430221020, 0.272639409956627330, 0.272591303801435150, 0.272543196964764700, -0.272495089446735840, 0.272446981247469690, 0.272398872367086040, 0.272350762805705250, 0.272302652563447100, 0.272254541640432780, 0.272206430036782080, 0.272158317752615340, -0.272110204788052310, 0.272062091143214280, 0.272013976818220930, 0.271965861813192710, 0.271917746128249370, 0.271869629763512140, 0.271821512719100770, 0.271773394995135250, -0.271725276591736620, 0.271677157509024820, 0.271629037747120160, 0.271580917306142420, 0.271532796186212840, 0.271484674387451270, 0.271436551909978010, 0.271388428753912950, -0.271340304919377270, 0.271292180406490780, 0.271244055215373870, 0.271195929346146390, 0.271147802798929530, 0.271099675573843120, 0.271051547671007530, 0.271003419090542650, -0.270955289832569670, 0.270907159897208480, 0.270859029284578890, 0.270810897994802240, 0.270762766027998310, 0.270714633384287420, 0.270666500063789560, 0.270618366066625870, -0.270570231392916300, 0.270522096042781100, 0.270473960016340280, 0.270425823313714950, 0.270377685935025090, 0.270329547880390990, 0.270281409149932590, 0.270233269743771150, -0.270185129662026460, 0.270136988904819020, 0.270088847472268630, 0.270040705364496540, 0.269992562581622740, 0.269944419123767490, 0.269896274991050730, 0.269848130183593770, -0.269799984701516500, 0.269751838544938780, 0.269703691713981950, 0.269655544208765860, 0.269607396029410920, 0.269559247176037020, 0.269511097648765460, 0.269462947447716210, -0.269414796573009540, 0.269366645024765430, 0.269318492803105160, 0.269270339908148640, 0.269222186340016320, 0.269174032098828060, 0.269125877184705150, 0.269077721597767550, -0.269029565338135660, 0.268981408405929430, 0.268933250801270120, 0.268885092524277670, 0.268836933575072050, 0.268788773953774540, 0.268740613660505060, 0.268692452695384050, -0.268644291058531490, 0.268596128750068660, 0.268547965770115530, 0.268499802118792430, 0.268451637796219390, 0.268403472802517700, 0.268355307137807360, 0.268307140802208690, -0.268258973795841790, 0.268210806118827860, 0.268162637771286960, 0.268114468753339390, 0.268066299065105260, 0.268018128706705830, 0.267969957678261040, 0.267921785979890970, -0.267873613611716850, 0.267825440573858650, 0.267777266866436940, 0.267729092489571550, 0.267680917443383900, 0.267632741727993950, 0.267584565343522150, 0.267536388290088470, -0.267488210567814300, 0.267440032176819550, 0.267391853117224740, 0.267343673389149880, 0.267295492992716270, 0.267247311928043910, 0.267199130195253320, 0.267150947794464410, -0.267102764725798580, 0.267054580989375840, 0.267006396585316220, 0.266958211513741050, 0.266910025774770350, 0.266861839368524590, 0.266813652295123770, 0.266765464554689300, -0.266717276147341140, 0.266669087073199750, 0.266620897332385250, 0.266572706925018940, 0.266524515851220890, 0.266476324111111500, 0.266428131704810890, 0.266379938632440420, -0.266331744894120040, 0.266283550489970320, 0.266235355420111290, 0.266187159684664330, 0.266138963283749420, 0.266090766217487170, 0.266042568485997500, 0.265994370089401910, -0.265946171027820370, 0.265897971301372940, 0.265849770910181030, 0.265801569854364710, 0.265753368134044430, 0.265705165749340330, 0.265656962700373760, 0.265608758987264770, -0.265560554610133840, 0.265512349569101140, 0.265464143864287960, 0.265415937495814490, 0.265367730463801130, 0.265319522768368010, 0.265271314409636530, 0.265223105387726700, -0.265174895702759210, 0.265126685354853950, 0.265078474344132450, 0.265030262670714780, 0.264982050334721050, 0.264933837336272570, 0.264885623675489510, 0.264837409352492390, -0.264789194367401340, 0.264740978720337690, 0.264692762411421640, 0.264644545440773650, 0.264596327808513890, 0.264548109514763760, 0.264499890559643290, 0.264451670943273150, -0.264403450665773370, 0.264355229727265440, 0.264307008127869390, 0.264258785867705850, 0.264210562946894880, 0.264162339365557940, 0.264114115123815160, 0.264065890221786670, -0.264017664659593920, 0.263969438437356930, 0.263921211555196380, 0.263872984013232390, 0.263824755811586380, 0.263776526950378450, 0.263728297429729200, 0.263680067249758790, -0.263631836410588630, 0.263583604912338900, 0.263535372755130120, 0.263487139939082520, 0.263438906464317450, 0.263390672330955140, 0.263342437539116180, 0.263294202088920680, -0.263245965980490100, 0.263197729213944580, 0.263149491789404780, 0.263101253706990780, 0.263053014966824090, 0.263004775569024910, 0.262956535513713290, 0.262908294801010800, -0.262860053431037580, 0.262811811403914190, 0.262763568719760860, 0.262715325378699070, 0.262667081380848930, 0.262618836726331070, 0.262570591415265730, 0.262522345447774310, -0.262474098823977040, 0.262425851543994500, 0.262377603607946930, 0.262329355015955780, 0.262281105768141230, 0.262232855864623970, 0.262184605305524070, 0.262136354090963140, -0.262088102221061270, 0.262039849695938740, 0.261991596515717020, 0.261943342680516330, 0.261895088190457260, 0.261846833045660030, 0.261798577246246170, 0.261750320792335840, -0.261702063684049690, 0.261653805921508000, 0.261605547504832230, 0.261557288434142550, 0.261509028709559670, 0.261460768331203800, 0.261412507299196410, 0.261364245613657790, -0.261315983274708510, 0.261267720282468860, 0.261219456637060370, 0.261171192338603200, 0.261122927387217650, 0.261074661783025190, 0.261026395526146040, 0.260978128616700940, -0.260929861054810090, 0.260881592840595030, 0.260833323974175970, 0.260785054455673630, 0.260736784285208190, 0.260688513462901230, 0.260640241988872980, 0.260591969863244120, -0.260543697086134950, 0.260495423657666920, 0.260447149577960340, 0.260398874847135920, 0.260350599465313800, 0.260302323432615720, 0.260254046749161750, 0.260205769415072290, -0.260157491430468790, 0.260109212795471560, 0.260060933510201320, 0.260012653574778320, 0.259964372989324120, 0.259916091753958970, 0.259867809868803590, 0.259819527333978280, -0.259771244149604560, 0.259722960315802720, 0.259674675832693490, 0.259626390700397170, 0.259578104919035270, 0.259529818488728140, 0.259481531409596400, 0.259433243681760460, -0.259384955305341840, 0.259336666280460810, 0.259288376607238080, 0.259240086285794040, 0.259191795316250200, 0.259143503698726850, 0.259095211433344350, 0.259046918520224210, -0.258998624959486780, 0.258950330751252790, 0.258902035895642530, 0.258853740392777640, 0.258805444242778400, 0.258757147445765560, 0.258708850001859390, 0.258660551911181540, -0.258612253173852280, 0.258563953789992420, 0.258515653759722240, 0.258467353083163380, 0.258419051760436110, 0.258370749791661190, 0.258322447176959010, 0.258274143916451150, -0.258225840010257890, 0.258177535458499590, 0.258129230261297920, 0.258080924418773170, 0.258032617931046090, 0.257984310798237030, 0.257936003020467650, 0.257887694597858210, -0.257839385530529600, 0.257791075818602060, 0.257742765462197270, 0.257694454461435570, 0.257646142816437720, 0.257597830527324100, 0.257549517594216350, 0.257501204017234750, -0.257452889796500160, 0.257404574932132920, 0.257356259424254720, 0.257307943272985840, 0.257259626478446630, 0.257211309040758840, 0.257162990960042750, 0.257114672236419210, -0.257066352870008510, 0.257018032860932390, 0.256969712209311200, 0.256921390915265670, 0.256873068978916320, 0.256824746400384660, 0.256776423179791160, 0.256728099317256600, -0.256679774812901380, 0.256631449666847140, 0.256583123879214230, 0.256534797450123590, 0.256486470379695460, 0.256438142668051650, 0.256389814315312440, 0.256341485321598670, -0.256293155687030820, 0.256244825411730440, 0.256196494495818050, 0.256148162939414000, 0.256099830742639920, 0.256051497905616320, 0.256003164428463940, 0.255954830311303230, -0.255906495554255880, 0.255858160157442280, 0.255809824120983300, 0.255761487444999270, 0.255713150129611990, 0.255664812174941860, 0.255616473581109670, 0.255568134348235890, -0.255519794476442190, 0.255471453965849030, 0.255423112816577200, 0.255374771028747170, 0.255326428602480620, 0.255278085537898050, 0.255229741835119760, 0.255181397494267600, -0.255133052515461920, 0.255084706898823680, 0.255036360644473160, 0.254988013752532220, 0.254939666223121200, 0.254891318056361060, 0.254842969252372150, 0.254794619811276270, -0.254746269733193860, 0.254697919018245730, 0.254649567666552390, 0.254601215678235570, 0.254552863053415730, 0.254504509792213730, 0.254456155894750010, 0.254407801361146320, -0.254359446191523120, 0.254311090386000920, 0.254262733944701390, 0.254214376867745010, 0.254166019155252720, 0.254117660807344940, 0.254069301824143450, 0.254020942205768650, -0.253972581952341570, 0.253924221063982550, 0.253875859540813430, 0.253827497382954680, 0.253779134590527140, 0.253730771163651390, 0.253682407102449100, 0.253634042407040850, -0.253585677077547420, 0.253537311114089390, 0.253488944516788550, 0.253440577285765300, 0.253392209421140210, 0.253343840923035020, 0.253295471791570190, 0.253247102026866730, -0.253198731629045050, 0.253150360598226990, 0.253101988934533060, 0.253053616638084120, 0.253005243709000680, 0.252956870147404640, 0.252908495953416360, 0.252860121127156830, -0.252811745668746650, 0.252763369578307470, 0.252714992855959890, 0.252666615501824790, 0.252618237516022750, 0.252569858898675560, 0.252521479649903680, 0.252473099769828120, -0.252424719258569410, 0.252376338116249320, 0.252327956342988380, 0.252279573938907100, 0.252231190904127320, 0.252182807238769570, 0.252134422942954790, 0.252086038016803570, -0.252037652460437630, 0.251989266273977610, 0.251940879457544400, 0.251892492011258520, 0.251844103935241930, 0.251795715229615020, 0.251747325894498830, 0.251698935930013860, -0.251650545336282060, 0.251602154113423850, 0.251553762261560230, 0.251505369780811780, 0.251456976671300400, 0.251408582933146500, 0.251360188566470740, 0.251311793571394990, -0.251263397948039700, 0.251215001696525940, 0.251166604816974230, 0.251118207309506460, 0.251069809174243150, 0.251021410411305320, 0.250973011020813540, 0.250924611002889650, -0.250876210357654230, 0.250827809085228280, 0.250779407185732440, 0.250731004659288440, 0.250682601506016960, 0.250634197726038950, 0.250585793319475060, 0.250537388286447060, -0.250488982627075640, 0.250440576341481310, 0.250392169429785980, 0.250343761892110220, 0.250295353728575090, 0.250246944939301110, 0.250198535524410180, 0.250150125484022930, -0.250101714818260380, 0.250053303527243090, 0.250004891611092960, 0.249956479069930650, 0.249908065903877120, 0.249859652113053000, 0.249811237697580150, 0.249762822657579240, -0.249714406993171270, 0.249665990704476840, 0.249617573791617860, 0.249569156254714960, 0.249520738093889170, 0.249472319309261090, 0.249423899900952650, 0.249375479869084450, -0.249327059213777120, 0.249278637935152590, 0.249230216033331450, 0.249181793508434780, 0.249133370360583200, 0.249084946589898630, 0.249036522196501660, 0.248988097180513430, -0.248939671542054490, 0.248891245281246810, 0.248842818398211040, 0.248794390893068210, 0.248745962765938940, 0.248697534016945220, 0.248649104646207680, 0.248600674653847360, -0.248552244039984940, 0.248503812804742320, 0.248455380948240180, 0.248406948470599160, 0.248358515371941200, 0.248310081652386940, 0.248261647312057470, 0.248213212351073460, -0.248164776769556870, 0.248116340567628320, 0.248067903745408910, 0.248019466303019330, 0.247971028240581510, 0.247922589558216110, 0.247874150256044230, 0.247825710334186540, -0.247777269792765040, 0.247728828631900350, 0.247680386851713560, 0.247631944452325420, 0.247583501433857820, 0.247535057796431480, 0.247486613540167040, 0.247438168665186530, -0.247389723171610560, 0.247341277059560330, 0.247292830329156440, 0.247244382980520930, 0.247195935013774430, 0.247147486429038110, 0.247099037226432640, 0.247050587406080020, -0.247002136968100920, 0.246953685912616490, 0.246905234239747420, 0.246856781949615660, 0.246808329042341980, 0.246759875518047460, 0.246711421376852810, 0.246662966618880070, -0.246614511244249910, 0.246566055253083010, 0.246517598645501430, 0.246469141421625850, 0.246420683581577400, 0.246372225125476820, 0.246323766053446110, 0.246275306365605990, -0.246226846062077590, 0.246178385142981650, 0.246129923608440190, 0.246081461458573900, 0.246032998693503980, 0.245984535313351130, 0.245936071318237360, 0.245887606708283410, -0.245839141483610440, 0.245790675644339210, 0.245742209190591700, 0.245693742122488650, 0.245645274440151270, 0.245596806143700270, 0.245548337233257700, 0.245499867708944270, -0.245451397570880750, 0.245402926819189150, 0.245354455453990260, 0.245305983475405220, 0.245257510883554770, 0.245209037678561000, 0.245160563860544630, 0.245112089429626840, -0.245063614385928390, 0.245015138729571340, 0.244966662460676470, 0.244918185579364930, 0.244869708085757480, 0.244821229979976180, 0.244772751262141850, 0.244724271932375610, -0.244675791990798280, 0.244627311437531890, 0.244578830272697200, 0.244530348496415030, 0.244481866108807400, 0.244433383109995130, 0.244384899500099400, 0.244336415279240960, -0.244287930447541930, 0.244239445005123100, 0.244190958952105630, 0.244142472288610330, 0.244093985014759290, 0.244045497130673280, 0.243997008636473530, 0.243948519532280830, -0.243900029818217260, 0.243851539494403640, 0.243803048560961130, 0.243754557018010580, 0.243706064865674090, 0.243657572104072410, 0.243609078733326380, 0.243560584753558100, -0.243512090164888340, 0.243463594967438360, 0.243415099161328970, 0.243366602746682230, 0.243318105723619030, 0.243269608092260530, 0.243221109852727600, 0.243172611005142310, -0.243124111549625520, 0.243075611486298420, 0.243027110815281860, 0.242978609536697980, 0.242930107650667550, 0.242881605157311890, 0.242833102056751740, 0.242784598349109290, -0.242736094034505360, 0.242687589113061150, 0.242639083584897580, 0.242590577450136710, 0.242542070708899380, 0.242493563361306480, 0.242445055407480100, 0.242396546847541060, -0.242348037681610650, 0.242299527909809710, 0.242251017532260420, 0.242202506549083570, 0.242153994960400440, 0.242105482766331900, 0.242056969967000070, 0.242008456562525840, -0.241959942553030440, 0.241911427938634790, 0.241862912719460980, 0.241814396895629890, 0.241765880467262800, 0.241717363434480580, 0.241668845797405380, 0.241620327556158090, -0.241571808710859540, 0.241523289261631880, 0.241474769208596010, 0.241426248551873220, 0.241377727291584350, 0.241329205427851630, 0.241280682960795880, 0.241232159890538420, -0.241183636217200150, 0.241135111940903200, 0.241086587061768500, 0.241038061579917310, 0.240989535495470530, 0.240941008808550320, 0.240892481519277640, 0.240843953627773720, -0.240795425134159500, 0.240746896038557150, 0.240698366341087540, 0.240649836041871600, 0.240601305141031510, 0.240552773638688130, 0.240504241534962830, 0.240455708829976520, -0.240407175523851320, 0.240358641616708220, 0.240310107108668510, 0.240261571999853100, 0.240213036290384180, 0.240164499980382670, 0.240115963069969930, 0.240067425559266830, -0.240018887448395610, 0.239970348737477160, 0.239921809426632850, 0.239873269515983560, 0.239824729005651550, 0.239776187895757720, 0.239727646186423000, 0.239679103877769580, -0.239630560969918390, 0.239582017462990820, 0.239533473357107760, 0.239484928652391430, 0.239436383348962810, 0.239387837446943220, 0.239339290946453620, 0.239290743847616200, -0.239242196150551920, 0.239193647855382160, 0.239145098962227850, 0.239096549471211230, 0.239047999382453250, 0.238999448696075260, 0.238950897412198190, 0.238902345530944330, -0.238853793052434590, 0.238805239976790400, 0.238756686304132660, 0.238708132034583630, 0.238659577168264280, 0.238611021705295550, 0.238562465645799690, 0.238513908989897690, -0.238465351737710880, 0.238416793889360300, 0.238368235444968160, 0.238319676404655400, 0.238271116768543480, 0.238222556536753340, 0.238173995709407200, 0.238125434286626110, -0.238076872268531410, 0.238028309655244130, 0.237979746446886460, 0.237931182643579460, 0.237882618245444520, 0.237834053252602570, 0.237785487665175900, 0.237736921483285540, -0.237688354707052460, 0.237639787336598910, 0.237591219372045890, 0.237542650813514810, 0.237494081661126680, 0.237445511915003790, 0.237396941575267110, 0.237348370642038060, -0.237299799115437670, 0.237251226995588200, 0.237202654282610700, 0.237154080976626520, 0.237105507077756740, 0.237056932586123590, 0.237008357501848150, 0.236959781825051790, -0.236911205555855540, 0.236862628694381710, 0.236814051240751330, 0.236765473195085370, 0.236716894557506160, 0.236668315328134730, 0.236619735507092480, 0.236571155094500500, -0.236522574090481020, 0.236473992495155130, 0.236425410308644250, 0.236376827531069420, 0.236328244162552960, 0.236279660203215890, 0.236231075653179660, 0.236182490512565320, -0.236133904781495180, 0.236085318460090260, 0.236036731548472050, 0.235988144046761610, 0.235939555955081200, 0.235890967273551940, 0.235842378002295240, 0.235793788141432150, -0.235745197691085040, 0.235696606651374930, 0.235648015022422890, 0.235599422804351230, 0.235550829997281000, 0.235502236601333710, 0.235453642616630380, 0.235405048043293400, -0.235356452881443800, 0.235307857131203060, 0.235259260792692220, 0.235210663866033680, 0.235162066351348480, 0.235113468248758120, 0.235064869558383650, 0.235016270280347470, -0.234967670414770570, 0.234919069961774530, 0.234870468921480360, 0.234821867294010440, 0.234773265079485870, 0.234724662278027710, 0.234676058889758320, 0.234627454914798780, -0.234578850353270580, 0.234530245205294860, 0.234481639470993960, 0.234433033150488940, 0.234384426243901350, 0.234335818751352260, 0.234287210672964040, 0.234238602008857790, -0.234189992759155060, 0.234141382923976900, 0.234092772503445730, 0.234044161497682620, 0.233995549906809100, 0.233946937730946300, 0.233898324970216560, 0.233849711624741020, -0.233801097694640750, 0.233752483180038190, 0.233703868081054420, 0.233655252397810960, 0.233606636130428950, 0.233558019279030800, 0.233509401843737590, 0.233460783824670860, -0.233412165221951740, 0.233363546035702670, 0.233314926266044690, 0.233266305913099440, 0.233217684976987970, 0.233169063457832700, 0.233120441355754800, 0.233071818670875790, -0.233023195403316810, 0.232974571553200250, 0.232925947120647290, 0.232877322105779020, 0.232828696508717880, 0.232780070329584980, 0.232731443568501920, 0.232682816225589810, -0.232634188300971100, 0.232585559794766920, 0.232536930707098830, 0.232488301038087990, 0.232439670787856820, 0.232391039956526490, 0.232342408544218530, 0.232293776551054150, -0.232245143977155730, 0.232196510822644480, 0.232147877087641950, 0.232099242772269290, 0.232050607876648940, 0.232001972400902090, 0.231953336345150310, 0.231904699709514740, -0.231856062494117860, 0.231807424699080830, 0.231758786324524790, 0.231710147370572240, 0.231661507837344290, 0.231612867724962620, 0.231564227033548310, 0.231515585763223870, -0.231466943914110460, 0.231418301486329720, 0.231369658480002770, 0.231321014895252110, 0.231272370732198920, 0.231223725990964770, 0.231175080671670920, 0.231126434774439780, -0.231077788299392540, 0.231029141246650860, 0.230980493616335880, 0.230931845408570090, 0.230883196623474670, 0.230834547261170860, 0.230785897321781120, 0.230737246805426620, -0.230688595712228990, 0.230639944042309450, 0.230591291795790490, 0.230542638972793280, 0.230493985573439500, 0.230445331597850300, 0.230396677046148220, 0.230348021918454440, -0.230299366214890610, 0.230250709935577920, 0.230202053080638900, 0.230153395650194740, 0.230104737644367120, 0.230056079063277190, 0.230007419907047510, 0.229958760175799280, -0.229910099869653690, 0.229861438988733320, 0.229812777533159320, 0.229764115503053400, 0.229715452898536760, 0.229666789719731900, 0.229618125966760090, 0.229569461639742960, -0.229520796738801710, 0.229472131264058940, 0.229423465215635840, 0.229374798593654060, 0.229326131398234850, 0.229277463629500770, 0.229228795287573010, 0.229180126372573260, -0.229131456884622780, 0.229082786823844060, 0.229034116190358410, 0.228985444984287440, 0.228936773205752430, 0.228888100854875930, 0.228839427931779170, 0.228790754436583420, -0.228742080369411180, 0.228693405730383770, 0.228644730519622860, 0.228596054737249670, 0.228547378383386760, 0.228498701458155430, 0.228450023961677350, 0.228401345894073770, -0.228352667255467240, 0.228303988045979070, 0.228255308265730930, 0.228206627914844060, 0.228157946993441080, 0.228109265501643200, 0.228060583439572200, 0.228011900807349260, -0.227963217605097020, 0.227914533832936750, 0.227865849490989700, 0.227817164579378480, 0.227768479098224340, 0.227719793047648970, 0.227671106427773720, 0.227622419238721120, -0.227573731480612500, 0.227525043153569530, 0.227476354257713510, 0.227427664793167030, 0.227378974760051420, 0.227330284158488350, 0.227281592988599150, 0.227232901250506410, -0.227184208944331390, 0.227135516070195860, 0.227086822628221110, 0.227038128618529730, 0.226989434041243030, 0.226940738896482310, 0.226892043184370170, 0.226843346905027940, -0.226794650058577350, 0.226745952645139690, 0.226697254664837560, 0.226648556117792330, 0.226599857004125690, 0.226551157323958970, 0.226502457077414790, 0.226453756264614480, -0.226405054885679770, 0.226356352940732000, 0.226307650429893760, 0.226258947353286420, 0.226210243711031680, 0.226161539503250940, 0.226112834730066740, 0.226064129391600480, -0.226015423487973460, 0.225966717019308320, 0.225918009985726390, 0.225869302387349420, 0.225820594224298760, 0.225771885496697050, 0.225723176204665640, 0.225674466348326270, -0.225625755927800320, 0.225577044943210400, 0.225528333394677870, 0.225479621282324520, 0.225430908606271680, 0.225382195366642000, 0.225333481563556810, 0.225284767197137940, -0.225236052267506700, 0.225187336774785780, 0.225138620719096520, 0.225089904100560710, 0.225041186919299700, 0.224992469175436140, 0.224943750869091410, 0.224895032000386880, -0.224846312569445210, 0.224797592576387760, 0.224748872021336310, 0.224700150904412250, 0.224651429225738270, 0.224602706985435690, 0.224553984183626380, 0.224505260820431650, -0.224456536895974200, 0.224407812410375410, 0.224359087363757060, 0.224310361756240610, 0.224261635587948650, 0.224212908859002640, 0.224164181569524330, 0.224115453719635120, -0.224066725309457730, 0.224017996339113540, 0.223969266808723890, 0.223920536718411530, 0.223871806068297850, 0.223823074858504610, 0.223774343089153280, 0.223725610760366510, -0.223676877872265730, 0.223628144424972720, 0.223579410418608960, 0.223530675853297080, 0.223481940729158500, 0.223433205046315090, 0.223384468804888240, 0.223335732005000650, -0.223286994646773710, 0.223238256730329290, 0.223189518255788810, 0.223140779223274970, 0.223092039632909160, 0.223043299484812830, 0.222994558779108680, 0.222945817515918130, -0.222897075695363040, 0.222848333317564820, 0.222799590382646210, 0.222750846890728630, 0.222702102841933920, 0.222653358236383550, 0.222604613074200180, 0.222555867355505280, -0.222507121080420730, 0.222458374249067950, 0.222409626861569650, 0.222360878918047290, 0.222312130418622720, 0.222263381363417420, 0.222214631752554070, 0.222165881586154160, -0.222117130864339540, 0.222068379587231630, 0.222019627754953240, 0.221970875367625780, 0.221922122425370680, 0.221873368928310720, 0.221824614876567350, 0.221775860270262410, -0.221727105109517430, 0.221678349394455080, 0.221629593125196890, 0.221580836301864700, 0.221532078924579990, 0.221483320993465520, 0.221434562508642710, 0.221385803470233540, -0.221337043878359400, 0.221288283733143100, 0.221239523034706090, 0.221190761783170260, 0.221141999978657110, 0.221093237621289380, 0.221044474711188570, 0.220995711248476140, -0.220946947233274850, 0.220898182665706180, 0.220849417545892070, 0.220800651873954010, 0.220751885650014720, 0.220703118874195720, 0.220654351546618940, 0.220605583667405820, -0.220556815236679190, 0.220508046254560520, 0.220459276721171740, 0.220410506636634330, 0.220361736001071090, 0.220312964814603520, 0.220264193077353510, 0.220215420789442620, -0.220166647950993580, 0.220117874562127950, 0.220069100622967170, 0.220020326133634090, 0.219971551094250180, 0.219922775504937410, 0.219873999365817250, 0.219825222677012540, -0.219776445438644770, 0.219727667650835870, 0.219678889313707380, 0.219630110427382120, 0.219581330991981540, 0.219532551007627670, 0.219483770474441980, 0.219434989392547300, -0.219386207762065130, 0.219337425583117470, 0.219288642855825780, 0.219239859580312950, 0.219191075756700440, 0.219142291385110270, 0.219093506465663920, 0.219044720998484240, -0.218995934983692740, 0.218947148421411000, 0.218898361311761800, 0.218849573654866710, 0.218800785450847690, 0.218751996699826260, 0.218703207401925280, 0.218654417557266280, -0.218605627165971230, 0.218556836228161690, 0.218508044743960460, 0.218459252713489150, 0.218410460136869710, 0.218361667014223690, 0.218312873345673920, 0.218264079131341960, -0.218215284371349820, 0.218166489065819040, 0.218117693214872450, 0.218068896818631650, 0.218020099877218150, 0.217971302390754850, 0.217922504359363280, 0.217873705783165480, -0.217824906662282940, 0.217776106996838610, 0.217727306786953980, 0.217678506032751100, 0.217629704734351500, 0.217580902891878090, 0.217532100505452440, 0.217483297575196490, -0.217434494101231920, 0.217385690083681500, 0.217336885522666890, 0.217288080418310050, 0.217239274770732570, 0.217190468580057330, 0.217141661846405960, 0.217092854569899960, -0.217044046750662270, 0.216995238388814460, 0.216946429484478560, 0.216897620037776160, 0.216848810048830140, 0.216799999517762080, 0.216751188444694040, 0.216702376829747580, -0.216653564673045640, 0.216604751974709740, 0.216555938734862010, 0.216507124953623980, 0.216458310631118560, 0.216409495767467370, 0.216360680362792430, 0.216311864417215390, -0.216263047930859100, 0.216214230903845170, 0.216165413336295270, 0.216116595228332240, 0.216067776580077730, 0.216018957391653780, 0.215970137663182020, 0.215921317394785320, -0.215872496586585360, 0.215823675238704130, 0.215774853351263280, 0.215726030924385750, 0.215677207958193120, 0.215628384452807490, 0.215579560408350470, 0.215530735824944950, -0.215481910702712610, 0.215433085041775500, 0.215384258842255230, 0.215335432104274750, 0.215286604827955700, 0.215237777013420150, 0.215188948660789690, 0.215140119770187320, -0.215091290341734630, 0.215042460375553270, 0.214993629871766230, 0.214944798830495080, 0.214895967251861970, 0.214847135135988490, 0.214798302482997610, 0.214749469293010950, -0.214700635566150650, 0.214651801302538300, 0.214602966502296900, 0.214554131165548080, 0.214505295292413940, 0.214456458883016090, 0.214407621937477560, 0.214358784455919970, -0.214309946438465430, 0.214261107885235590, 0.214212268796353380, 0.214163429171940530, 0.214114589012118660, 0.214065748317010750, 0.214016907086738480, 0.213968065321423960, -0.213919223021188790, 0.213870380186156030, 0.213821536816447330, 0.213772692912184760, 0.213723848473490050, 0.213675003500486150, 0.213626157993294740, 0.213577311952037910, -0.213528465376837400, 0.213479618267816140, 0.213430770625095830, 0.213381922448798610, 0.213333073739046140, 0.213284224495961410, 0.213235374719666140, 0.213186524410281990, -0.213137673567931950, 0.213088822192737750, 0.213039970284821490, 0.212991117844304860, 0.212942264871310880, 0.212893411365961240, 0.212844557328378060, 0.212795702758683060, -0.212746847656999220, 0.212697992023448270, 0.212649135858152370, 0.212600279161233170, 0.212551421932813710, 0.212502564173015690, 0.212453705881961250, 0.212404847059772140, -0.212355987706571330, 0.212307127822480540, 0.212258267407621940, 0.212209406462117250, 0.212160544986089470, 0.212111682979660320, 0.212062820442951520, 0.212013957376086140, -0.211965093779185820, 0.211916229652372810, 0.211867364995768750, 0.211818499809496740, 0.211769634093678470, 0.211720767848436130, 0.211671901073891420, 0.211623033770167390, -0.211574165937385790, 0.211525297575668760, 0.211476428685138080, 0.211427559265916720, 0.211378689318126480, 0.211329818841889530, 0.211280947837327590, 0.211232076304563730, -0.211183204243719640, 0.211134331654917130, 0.211085458538279230, 0.211036584893927680, 0.210987710721984660, 0.210938836022571930, 0.210889960795812570, 0.210841085041828270, -0.210792208760741280, 0.210743331952673340, 0.210694454617747500, 0.210645576756085500, 0.210596698367809590, 0.210547819453041460, 0.210498940011904250, 0.210450060044519690, -0.210401179551009950, 0.210352298531496870, 0.210303416986103440, 0.210254534914951500, 0.210205652318162770, 0.210156769195860320, 0.210107885548165980, 0.210059001375201920, -0.210010116677089940, 0.209961231453953070, 0.209912345705913130, 0.209863459433092340, 0.209814572635612460, 0.209765685313596570, 0.209716797467166480, 0.209667909096444390, -0.209619020201552100, 0.209570130782612690, 0.209521240839747960, 0.209472350373080120, 0.209423459382730990, 0.209374567868823610, 0.209325675831479850, 0.209276783270821440, -0.209227890186971490, 0.209178996580051850, 0.209130102450184710, 0.209081207797491870, 0.209032312622096460, 0.208983416924120260, 0.208934520703685510, 0.208885623960914010, -0.208836726695928930, 0.208787828908852000, 0.208738930599805500, 0.208690031768911240, 0.208641132416292340, 0.208592232542070600, 0.208543332146368300, 0.208494431229307220, -0.208445529791010500, 0.208396627831599960, 0.208347725351197830, 0.208298822349925970, 0.208249918827907500, 0.208201014785264200, 0.208152110222117960, 0.208103205138591870, -0.208054299534807750, 0.208005393410887920, 0.207956486766954140, 0.207907579603129580, 0.207858671919536080, 0.207809763716295890, 0.207760854993530860, 0.207711945751364150, -0.207663035989917530, 0.207614125709313370, 0.207565214909673420, 0.207516303591120890, 0.207467391753777600, 0.207418479397765840, 0.207369566523207430, 0.207320653130225550, -0.207271739218942010, 0.207222824789478700, 0.207173909841958770, 0.207124994376504080, 0.207076078393236880, 0.207027161892279070, 0.206978244873753770, 0.206929327337782850, -0.206880409284488640, 0.206831490713992950, 0.206782571626419000, 0.206733652021888590, 0.206684731900524050, 0.206635811262447260, 0.206586890107781390, 0.206537968436648260, -0.206489046249170250, 0.206440123545469150, 0.206391200325668180, 0.206342276589889240, 0.206293352338254160, 0.206244427570886120, 0.206195502287907010, 0.206146576489439150, -0.206097650175604440, 0.206048723346526020, 0.205999796002325790, 0.205950868143126050, 0.205901939769048750, 0.205853010880216990, 0.205804081476752720, 0.205755151558778240, -0.205706221126415480, 0.205657290179787570, 0.205608358719016450, 0.205559426744224420, 0.205510494255533390, 0.205461561253066580, 0.205412627736945850, 0.205363693707293540, -0.205314759164231590, 0.205265824107883130, 0.205216888538370140, 0.205167952455814510, 0.205119015860339430, 0.205070078752066790, 0.205021141131118940, 0.204972202997617840, -0.204923264351686650, 0.204874325193447280, 0.204825385523022120, 0.204776445340533080, 0.204727504646103340, 0.204678563439854830, 0.204629621721909930, 0.204580679492390530, -0.204531736751419860, 0.204482793499119850, 0.204433849735612880, 0.204384905461020810, 0.204335960675466940, 0.204287015379073180, 0.204238069571961420, 0.204189123254254920, -0.204140176426075630, 0.204091229087545900, 0.204042281238787650, 0.203993332879924130, 0.203944384011077280, 0.203895434632369480, 0.203846484743922640, 0.203797534345860040, -0.203748583438303600, 0.203699632021375700, 0.203650680095198290, 0.203601727659894620, 0.203552774715586610, 0.203503821262396690, 0.203454867300446760, 0.203405912829860090, -0.203356957850758660, 0.203308002363264410, 0.203259046367500560, 0.203210089863589100, 0.203161132851652440, 0.203112175331812470, 0.203063217304192520, 0.203014258768914550, -0.202965299726100920, 0.202916340175873590, 0.202867380118355840, 0.202818419553669670, 0.202769458481937420, 0.202720496903281090, 0.202671534817823960, 0.202622572225688020, -0.202573609126995620, 0.202524645521868770, 0.202475681410430740, 0.202426716792803500, 0.202377751669109040, 0.202328786039470660, 0.202279819904010280, 0.202230853262850370, -0.202181886116112870, 0.202132918463921120, 0.202083950306397030, 0.202034981643663100, 0.201986012475841280, 0.201937042803054860, 0.201888072625425820, 0.201839101943076610, -0.201790130756129230, 0.201741159064706910, 0.201692186868931730, 0.201643214168926080, 0.201594240964811930, 0.201545267256712650, 0.201496293044750200, 0.201447318329047000, -0.201398343109725070, 0.201349367386907700, 0.201300391160716930, 0.201251414431274760, 0.201202437198704480, 0.201153459463128100, 0.201104481224668090, 0.201055502483446420, -0.201006523239586450, 0.200957543493210160, 0.200908563244440010, 0.200859582493398030, 0.200810601240207500, 0.200761619484990490, 0.200712637227869420, 0.200663654468966330, -0.200614671208404540, 0.200565687446306070, 0.200516703182793380, 0.200467718417988490, 0.200418733152014750, 0.200369747384994160, 0.200320761117048800, 0.200271774348301960, -0.200222787078875670, 0.200173799308892430, 0.200124811038474240, 0.200075822267744450, 0.200026832996825110, 0.199977843225838700, 0.199928852954907250, 0.199879862184154100, -0.199830870913701280, 0.199781879143671290, 0.199732886874186170, 0.199683894105369270, 0.199634900837342640, 0.199585907070228750, 0.199536912804149650, 0.199487918039228720, -0.199438922775588000, 0.199389927013349510, 0.199340930752636650, 0.199291933993571480, 0.199242936736276440, 0.199193938980873650, 0.199144940727486450, 0.199095941976236900, -0.199046942727247460, 0.198997942980640270, 0.198948942736538630, 0.198899941995064640, 0.198850940756340800, 0.198801939020489180, 0.198752936787633140, 0.198703934057894770, -0.198654930831396540, 0.198605927108260550, 0.198556922888610210, 0.198507918172567520, 0.198458912960255060, 0.198409907251794890, 0.198360901047310380, 0.198311894346923620, -0.198262887150756660, 0.198213879458932960, 0.198164871271574530, 0.198115862588803930, 0.198066853410743230, 0.198017843737515850, 0.197968833569243860, 0.197919822906049790, -0.197870811748055710, 0.197821800095385050, 0.197772787948159890, 0.197723775306502730, 0.197674762170535730, 0.197625748540382260, 0.197576734416164410, 0.197527719798004710, -0.197478704686025300, 0.197429689080349550, 0.197380672981099570, 0.197331656388397480, 0.197282639302366700, 0.197233621723129300, 0.197184603650807870, 0.197135585085524480, -0.197086566027402540, 0.197037546476564210, 0.196988526433132030, 0.196939505897228060, 0.196890484868975780, 0.196841463348497310, 0.196792441335915140, 0.196743418831351460, -0.196694395834929650, 0.196645372346771870, 0.196596348367000660, 0.196547323895738120, 0.196498298933107720, 0.196449273479231580, 0.196400247534231800, 0.196351221098231860, -0.196302194171353860, 0.196253166753720370, 0.196204138845453540, 0.196155110446676770, 0.196106081557512250, 0.196057052178082500, 0.196008022308509720, 0.195958991948917300, -0.195909961099427400, 0.195860929760162620, 0.195811897931245040, 0.195762865612798180, 0.195713832804944140, 0.195664799507805520, 0.195615765721504490, 0.195566731446164460, -0.195517696681907600, 0.195468661428856050, 0.195419625687133310, 0.195370589456861500, 0.195321552738163210, 0.195272515531160600, 0.195223477835977130, 0.195174439652734980, -0.195125400981556730, 0.195076361822564550, 0.195027322175881900, 0.194978282041630920, 0.194929241419934260, 0.194880200310914050, 0.194831158714693750, 0.194782116631395580, -0.194733074061142130, 0.194684031004055540, 0.194634987460259310, 0.194585943429875620, 0.194536898913027080, 0.194487853909835830, 0.194438808420425410, 0.194389762444917960, -0.194340715983435660, 0.194291669036102010, 0.194242621603039180, 0.194193573684369820, 0.194144525280216060, 0.194095476390701430, 0.194046427015948130, 0.193997377156078730, -0.193948326811215490, 0.193899275981481850, 0.193850224667000000, 0.193801172867892610, 0.193752120584281850, 0.193703067816291240, 0.193654014564042940, 0.193604960827659600, -0.193555906607263430, 0.193506851902977920, 0.193457796714925300, 0.193408741043227720, 0.193359684888008750, 0.193310628249390580, 0.193261571127495810, 0.193212513522446700, -0.193163455434366720, 0.193114396863378110, 0.193065337809603530, 0.193016278273165140, 0.192967218254186500, 0.192918157752789810, 0.192869096769097720, 0.192820035303232470, -0.192770973355317570, 0.192721910925475220, 0.192672848013828110, 0.192623784620498420, 0.192574720745609720, 0.192525656389284230, 0.192476591551644150, 0.192427526232813030, -0.192378460432913100, 0.192329394152066980, 0.192280327390396990, 0.192231260148026580, 0.192182192425078060, 0.192133124221674030, 0.192084055537936750, 0.192034986373989770, -0.191985916729955350, 0.191936846605956110, 0.191887776002114320, 0.191838704918553540, 0.191789633355396010, 0.191740561312764350, 0.191691488790780880, 0.191642415789569140, -0.191593342309251350, 0.191544268349950170, 0.191495193911787930, 0.191446118994888110, 0.191397043599373010, 0.191347967725364860, 0.191298891372987220, 0.191249814542362370, -0.191200737233612970, 0.191151659446861300, 0.191102581182230890, 0.191053502439844060, 0.191004423219823440, 0.190955343522291380, 0.190906263347371350, 0.190857182695185670, -0.190808101565857040, 0.190759019959507730, 0.190709937876261280, 0.190660855316240020, 0.190611772279566600, 0.190562688766363310, 0.190513604776753750, 0.190464520310860170, -0.190415435368804840, 0.190366349950711390, 0.190317264056702020, 0.190268177686899520, 0.190219090841426130, 0.190170003520405470, 0.190120915723959780, 0.190071827452211820, -0.190022738705283830, 0.189973649483299450, 0.189924559786380930, 0.189875469614651020, 0.189826378968231980, 0.189777287847247460, 0.189728196251819720, 0.189679104182071460, -0.189630011638125040, 0.189580918620103980, 0.189531825128130660, 0.189482731162327330, 0.189433636722817630, 0.189384541809723810, 0.189335446423168630, 0.189286350563274420, -0.189237254230164770, 0.189188157423961970, 0.189139060144788790, 0.189089962392767510, 0.189040864168021770, 0.188991765470673870, 0.188942666300846550, 0.188893566658662140, -0.188844466544244220, 0.188795365957715180, 0.188746264899197690, 0.188697163368814120, 0.188648061366688050, 0.188598958892941840, 0.188549855947697830, 0.188500752531079590, -0.188451648643209460, 0.188402544284210220, 0.188353439454204190, 0.188304334153314960, 0.188255228381664920, 0.188206122139376820, 0.188157015426572980, 0.188107908243377030, -0.188058800589911280, 0.188009692466298560, 0.187960583872661180, 0.187911474809122760, 0.187862365275805660, 0.187813255272832660, 0.187764144800326050, 0.187715033858409540, -0.187665922447205450, 0.187616810566836540, 0.187567698217425170, 0.187518585399094990, 0.187469472111968350, 0.187420358356167600, 0.187371244131816380, 0.187322129439037060, -0.187273014277952400, 0.187223898648684770, 0.187174782551357860, 0.187125665986093950, 0.187076548953015900, 0.187027431452246040, 0.186978313483908030, 0.186929195048124250, -0.186880076145017480, 0.186830956774710070, 0.186781836937325720, 0.186732716632986770, 0.186683595861816020, 0.186634474623935870, 0.186585352919469930, 0.186536230748540640, -0.186487108111270340, 0.186437985007782690, 0.186388861438200080, 0.186339737402645310, 0.186290612901240770, 0.186241487934110130, 0.186192362501375770, 0.186143236603160510, -0.186094110239586720, 0.186044983410778080, 0.185995856116856980, 0.185946728357946260, 0.185897600134168280, 0.185848471445646730, 0.185799342292504000, 0.185750212674862910, -0.185701082592845870, 0.185651952046576530, 0.185602821036177340, 0.185553689561770650, 0.185504557623480170, 0.185455425221428300, 0.185406292355737860, 0.185357159026531240, -0.185308025233932190, 0.185258890978063060, 0.185209756259046700, 0.185160621077005540, 0.185111485432063240, 0.185062349324342210, 0.185013212753965340, 0.184964075721054970, -0.184914938225734880, 0.184865800268127430, 0.184816661848355460, 0.184767522966541420, 0.184718383622809010, 0.184669243817280640, 0.184620103550079160, 0.184570962821326980, -0.184521821631147830, 0.184472679979664130, 0.184423537866998300, 0.184374395293274040, 0.184325252258613820, 0.184276108763140460, 0.184226964806976370, 0.184177820390245330, -0.184128675513069750, 0.184079530175572440, 0.184030384377875890, 0.183981238120103830, 0.183932091402378650, 0.183882944224823260, 0.183833796587560050, 0.183784648490712800, -0.183735499934403940, 0.183686350918756320, 0.183637201443892390, 0.183588051509935870, 0.183538901117009270, 0.183489750265234920, 0.183440598954736690, 0.183391447185636940, -0.183342294958058540, 0.183293142272124010, 0.183243989127957030, 0.183194835525680110, 0.183145681465416070, 0.183096526947287400, 0.183047371971417850, 0.182998216537929890, -0.182949060646946350, 0.182899904298589740, 0.182850747492983830, 0.182801590230251030, 0.182752432510514230, 0.182703274333895940, 0.182654115700519900, 0.182604956610508570, -0.182555797063984420, 0.182506637061071200, 0.182457476601891410, 0.182408315686567900, 0.182359154315223180, 0.182309992487980990, 0.182260830204963840, 0.182211667466294610, -0.182162504272095770, 0.182113340622491100, 0.182064176517603090, 0.182015011957554650, 0.181965846942468230, 0.181916681472467620, 0.181867515547675330, 0.181818349168214240, -0.181769182334206830, 0.181720015045776890, 0.181670847303046950, 0.181621679106139440, 0.181572510455178170, 0.181523341350285610, 0.181474171791584700, 0.181425001779197930, -0.181375831313249110, 0.181326660393860690, 0.181277489021155620, 0.181228317195256390, 0.181179144916286810, 0.181129972184369380, 0.181080798999627010, 0.181031625362182170, -0.180982451272158760, 0.180933276729679180, 0.180884101734866440, 0.180834926287842980, 0.180785750388732650, 0.180736574037657970, 0.180687397234741840, 0.180638219980106760, -0.180589042273876590, 0.180539864116173790, 0.180490685507120910, 0.180441506446841760, 0.180392326935458840, 0.180343146973095090, 0.180293966559873040, 0.180244785695916540, -0.180195604381348050, 0.180146422616290550, 0.180097240400866550, 0.180048057735199880, 0.179998874619413080, 0.179949691053629100, 0.179900507037970450, 0.179851322572560950, -0.179802137657523180, 0.179752952292980050, 0.179703766479054090, 0.179654580215869160, 0.179605393503547790, 0.179556206342212480, 0.179507018731987100, 0.179457830672994170, -0.179408642165356680, 0.179359453209197130, 0.179310263804639380, 0.179261073951805990, 0.179211883650819890, 0.179162692901803670, 0.179113501704881130, 0.179064310060174870, -0.179015117967807810, 0.178965925427902520, 0.178916732440582840, 0.178867539005971350, 0.178818345124191010, 0.178769150795364370, 0.178719956019615290, 0.178670760797066310, -0.178621565127840000, 0.178572369012060220, 0.178523172449849500, 0.178473975441330870, 0.178424777986626840, 0.178375580085861320, 0.178326381739156850, 0.178277182946636410, -0.178227983708422600, 0.178178784024639270, 0.178129583895408950, 0.178080383320854680, 0.178031182301099020, 0.177981980836265850, 0.177932778926477710, 0.177883576571857630, -0.177834373772528200, 0.177785170528613230, 0.177735966840235350, 0.177686762707517570, 0.177637558130582430, 0.177588353109553810, 0.177539147644554330, 0.177489941735706560, -0.177440735383134350, 0.177391528586960310, 0.177342321347307460, 0.177293113664298340, 0.177243905538056880, 0.177194696968705680, 0.177145487956367730, 0.177096278501165600, -0.177047068603223220, 0.176997858262663180, 0.176948647479608510, 0.176899436254181750, 0.176850224586506840, 0.176801012476706400, 0.176751799924903390, 0.176702586931220460, -0.176653373495781500, 0.176604159618709120, 0.176554945300125890, 0.176505730540155730, 0.176456515338921260, 0.176407299696545480, 0.176358083613151030, 0.176308867088861810, -0.176259650123800400, 0.176210432718089890, 0.176161214871852850, 0.176111996585213200, 0.176062777858293580, 0.176013558691217010, 0.175964339084106110, 0.175915119037084790, -0.175865898550275650, 0.175816677623801790, 0.175767456257785810, 0.175718234452351600, 0.175669012207621820, 0.175619789523719070, 0.175570566400767290, 0.175521342838889090, -0.175472118838207510, 0.175422894398845230, 0.175373669520926150, 0.175324444204572880, 0.175275218449908480, 0.175225992257055620, 0.175176765626138240, 0.175127538557278920, -0.175078311050600760, 0.175029083106226360, 0.174979854724279710, 0.174930625904883420, 0.174881396648160580, 0.174832166954233810, 0.174782936823227040, 0.174733706255262940, -0.174684475250464130, 0.174635243808954590, 0.174586011930856900, 0.174536779616294210, 0.174487546865389140, 0.174438313678265620, 0.174389080055046330, 0.174339845995854340, -0.174290611500812290, 0.174241376570044150, 0.174192141203672570, 0.174142905401820650, 0.174093669164611030, 0.174044432492167640, 0.173995195384613190, 0.173945957842070760, -0.173896719864662990, 0.173847481452513860, 0.173798242605746030, 0.173749003324482560, 0.173699763608846200, 0.173650523458960840, 0.173601282874949160, 0.173552041856933850, -0.173502800405038880, 0.173453558519386900, 0.173404316200101020, 0.173355073447303910, 0.173305830261119560, 0.173256586641670620, 0.173207342589080240, 0.173158098103471050, -0.173108853184967050, 0.173059607833690930, 0.173010362049765780, 0.172961115833314310, 0.172911869184460470, 0.172862622103326950, 0.172813374590036870, 0.172764126644712940, -0.172714878267479110, 0.172665629458458090, 0.172616380217772560, 0.172567130545546510, 0.172517880441902670, 0.172468629906964100, 0.172419378940853520, 0.172370127543694910, -0.172320875715611000, 0.172271623456724890, 0.172222370767159320, 0.172173117647038220, 0.172123864096484340, 0.172074610115620810, 0.172025355704570310, 0.171976100863456850, -0.171926845592403150, 0.171877589891532350, 0.171828333760967090, 0.171779077200831460, 0.171729820211248160, 0.171680562792339840, 0.171631304944230570, 0.171582046667043020, -0.171532787960900380, 0.171483528825925300, 0.171434269262241870, 0.171385009269972740, 0.171335748849241100, 0.171286488000169630, 0.171237226722882410, 0.171187965017502110, -0.171138702884151890, 0.171089440322954480, 0.171040177334033900, 0.170990913917512890, 0.170941650073514580, 0.170892385802161710, 0.170843121103578330, 0.170793855977887130, -0.170744590425211310, 0.170695324445673560, 0.170646058039397950, 0.170596791206507170, 0.170547523947124000, 0.170498256261372440, 0.170448988149375230, 0.170399719611255580, -0.170350450647136160, 0.170301181257141080, 0.170251911441393040, 0.170202641200015210, 0.170153370533130370, 0.170104099440862520, 0.170054827923334400, 0.170005555980669240, -0.169956283612989760, 0.169907010820419980, 0.169857737603082680, 0.169808463961101050, 0.169759189894597820, 0.169709915403697040, 0.169660640488521470, 0.169611365149193870, -0.169562089385838300, 0.169512813198577500, 0.169463536587534690, 0.169414259552832570, 0.169364982094595250, 0.169315704212945480, 0.169266425908006420, 0.169217147179900880, -0.169167868028752920, 0.169118588454685280, 0.169069308457821170, 0.169020028038283340, 0.168970747196195900, 0.168921465931681590, 0.168872184244863580, 0.168822902135864710, -0.168773619604809020, 0.168724336651819270, 0.168675053277018230, 0.168625769480530010, 0.168576485262477370, 0.168527200622983510, 0.168477915562171200, 0.168428630080164570, -0.168379344177086330, 0.168330057853059740, 0.168280771108207580, 0.168231483942653910, 0.168182196356521540, 0.168132908349933690, 0.168083619923013130, 0.168034331075883950, -0.167985041808668940, 0.167935752121491310, 0.167886462014473880, 0.167837171487740740, 0.167787880541414660, 0.167738589175618460, 0.167689297390476220, 0.167640005186110720, -0.167590712562645210, 0.167541419520202490, 0.167492126058906650, 0.167442832178880510, 0.167393537880247270, 0.167344243163129760, 0.167294948027652070, 0.167245652473937020, -0.167196356502107850, 0.167147060112287330, 0.167097763304599610, 0.167048466079167460, 0.166999168436114150, 0.166949870375562500, 0.166900571897636600, 0.166851273002459280, -0.166801973690153760, 0.166752673960842900, 0.166703373814650780, 0.166654073251700200, 0.166604772272114010, 0.166555470876016350, 0.166506169063530000, 0.166456866834778230, -0.166407564189883840, 0.166358261128970980, 0.166308957652162470, 0.166259653759581570, 0.166210349451351100, 0.166161044727595210, 0.166111739588436700, 0.166062434033998810, -0.166013128064404440, 0.165963821679777660, 0.165914514880241340, 0.165865207665918720, 0.165815900036932640, 0.165766591993407260, 0.165717283535465390, 0.165667974663229880, -0.165618665376824880, 0.165569355676373210, 0.165520045561998150, 0.165470735033822540, 0.165421424091970530, 0.165372112736564960, 0.165322800967729110, 0.165273488785585810, -0.165224176190259230, 0.165174863181872220, 0.165125549760548020, 0.165076235926409550, 0.165026921679580910, 0.164977607020184960, 0.164928291948344990, 0.164878976464183870, -0.164829660567825750, 0.164780344259393450, 0.164731027539009870, 0.164681710406799160, 0.164632392862884170, 0.164583074907388190, 0.164533756540434090, 0.164484437762146050, -0.164435118572646920, 0.164385798972059960, 0.164336478960508100, 0.164287158538115460, 0.164237837705004910, 0.164188516461299810, 0.164139194807122940, 0.164089872742598540, -0.164040550267849440, 0.163991227382998980, 0.163941904088170030, 0.163892580383486720, 0.163843256269072010, 0.163793931745049110, 0.163744606811540960, 0.163695281468671740, -0.163645955716564320, 0.163596629555341540, 0.163547302985127650, 0.163497976006045510, 0.163448648618218420, 0.163399320821769280, 0.163349992616822260, 0.163300664003500270, -0.163251334981926590, 0.163202005552224170, 0.163152675714517160, 0.163103345468928460, 0.163054014815581410, 0.163004683754598870, 0.162955352286105050, 0.162906020410222870, -0.162856688127075660, 0.162807355436786260, 0.162758022339478890, 0.162708688835276500, 0.162659354924301950, 0.162610020606679420, 0.162560685882531860, 0.162511350751982590, -0.162462015215154490, 0.162412679272171790, 0.162363342923157410, 0.162314006168234660, 0.162264669007526450, 0.162215331441157020, 0.162165993469249260, 0.162116655091926520, -0.162067316309311700, 0.162017977121529020, 0.161968637528701390, 0.161919297530952190, 0.161869957128404300, 0.161820616321181940, 0.161771275109408060, 0.161721933493205540, -0.161672591472698630, 0.161623249048010230, 0.161573906219263740, 0.161524562986582020, 0.161475219350089320, 0.161425875309908600, 0.161376530866163190, 0.161327186018976000, -0.161277840768471260, 0.161228495114771970, 0.161179149058001400, 0.161129802598282550, 0.161080455735739620, 0.161031108470495540, 0.160981760802673710, 0.160932412732397030, -0.160883064259789740, 0.160833715384974820, 0.160784366108075590, 0.160735016429215010, 0.160685666348517330, 0.160636315866105470, 0.160586964982102400, 0.160537613696632360, -0.160488262009818280, 0.160438909921783530, 0.160389557432651100, 0.160340204542545190, 0.160290851251588760, 0.160241497559905220, 0.160192143467617480, 0.160142788974849850, -0.160093434081725220, 0.160044078788367020, 0.159994723094898180, 0.159945367001442960, 0.159896010508124350, 0.159846653615065700, 0.159797296322389950, 0.159747938630221440, -0.159698580538683050, 0.159649222047897800, 0.159599863157989910, 0.159550503869082370, 0.159501144181298570, 0.159451784094761490, 0.159402423609595360, 0.159353062725923200, -0.159303701443868350, 0.159254339763553830, 0.159204977685103890, 0.159155615208641520, 0.159106252334290100, 0.159056889062172610, 0.159007525392413330, 0.158958161325135240, -0.158908796860461750, 0.158859431998515820, 0.158810066739421770, 0.158760701083302540, 0.158711335030281120, 0.158661968580481820, 0.158612601734027580, 0.158563234491041820, -0.158513866851647560, 0.158464498815969050, 0.158415130384129330, 0.158365761556251760, 0.158316392332459340, 0.158267022712876380, 0.158217652697625860, 0.158168282286831220, -0.158118911480615440, 0.158069540279102800, 0.158020168682416330, 0.157970796690679430, 0.157921424304015120, 0.157872051522547660, 0.157822678346400070, 0.157773304775695370, -0.157723930810557830, 0.157674556451110480, 0.157625181697476720, 0.157575806549779570, 0.157526431008143340, 0.157477055072691020, 0.157427678743546100, 0.157378302020831500, -0.157328924904671620, 0.157279547395189400, 0.157230169492508340, 0.157180791196751410, 0.157131412508042940, 0.157082033426505920, 0.157032653952263850, 0.156983274085439660, -0.156933893826157770, 0.156884513174541110, 0.156835132130713180, 0.156785750694797000, 0.156736368866916860, 0.156686986647195800, 0.156637604035756860, 0.156588221032724320, -0.156538837638221240, 0.156489453852371040, 0.156440069675296810, 0.156390685107122810, 0.156341300147972100, 0.156291914797968170, 0.156242529057233990, 0.156193142925893920, -0.156143756404070990, 0.156094369491888710, 0.156044982189470020, 0.155995594496939340, 0.155946206414419670, 0.155896817942034470, 0.155847429079906810, 0.155798039828160980, -0.155748650186920080, 0.155699260156307110, 0.155649869736446430, 0.155600478927461090, 0.155551087729474540, 0.155501696142609810, 0.155452304166991300, 0.155402911802742040, -0.155353519049985480, 0.155304125908844680, 0.155254732379444040, 0.155205338461906540, 0.155155944156355700, 0.155106549462914550, 0.155057154381707470, 0.155007758912857510, -0.154958363056488160, 0.154908966812722450, 0.154859570181684750, 0.154810173163498150, 0.154760775758285670, 0.154711377966171680, 0.154661979787279270, 0.154612581221731880, -0.154563182269652630, 0.154513782931165830, 0.154464383206394610, 0.154414983095462390, 0.154365582598492310, 0.154316181715608680, 0.154266780446934620, 0.154217378792593620, -0.154167976752708710, 0.154118574327404310, 0.154069171516803470, 0.154019768321029680, 0.153970364740206060, 0.153920960774456940, 0.153871556423905430, 0.153822151688675050, -0.153772746568888840, 0.153723341064671200, 0.153673935176145190, 0.153624528903433920, 0.153575122246661780, 0.153525715205951820, 0.153476307781427570, 0.153426899973212100, -0.153377491781429840, 0.153328083206203840, 0.153278674247657650, 0.153229264905914320, 0.153179855181098250, 0.153130445073332570, 0.153081034582740750, 0.153031623709445920, -0.152982212453572490, 0.152932800815243490, 0.152883388794582520, 0.152833976391712620, 0.152784563606758240, 0.152735150439842430, 0.152685736891088300, 0.152636322960620300, -0.152586908648561480, 0.152537493955035350, 0.152488078880165080, 0.152438663424075050, 0.152389247586888380, 0.152339831368728560, 0.152290414769718720, 0.152240997789983320, -0.152191580429645400, 0.152142162688828520, 0.152092744567655810, 0.152043326066251680, 0.151993907184739210, 0.151944487923242000, 0.151895068281883120, 0.151845648260787000, -0.151796227860076770, 0.151746807079875530, 0.151697385920307710, 0.151647964381496410, 0.151598542463565220, 0.151549120166637240, 0.151499697490836890, 0.151450274436287280, -0.151400851003112010, 0.151351427191434160, 0.151302003001378190, 0.151252578433067190, 0.151203153486624780, 0.151153728162174010, 0.151104302459839380, 0.151054876379743990, -0.151005449922011430, 0.150956023086764780, 0.150906595874128520, 0.150857168284225770, 0.150807740317179640, 0.150758311973114620, 0.150708883252153810, 0.150659454154420810, -0.150610024680038730, 0.150560594829132010, 0.150511164601823820, 0.150461733998237700, 0.150412303018496840, 0.150362871662725630, 0.150313439931047260, 0.150264007823585260, -0.150214575340462840, 0.150165142481804400, 0.150115709247733100, 0.150066275638372550, 0.150016841653845850, 0.149967407294277490, 0.149917972559790610, 0.149868537450508820, -0.149819101966555210, 0.149769666108054310, 0.149720229875129230, 0.149670793267903170, 0.149621356286500530, 0.149571918931044520, 0.149522481201658700, 0.149473043098466240, -0.149423604621591600, 0.149374165771157970, 0.149324726547288900, 0.149275286950107610, 0.149225846979738510, 0.149176406636304800, 0.149126965919930080, 0.149077524830737520, -0.149028083368851570, 0.148978641534395410, 0.148929199327492660, 0.148879756748266450, 0.148830313796841310, 0.148780870473340380, 0.148731426777886810, 0.148681982710605150, -0.148632538271618510, 0.148583093461050530, 0.148533648279024380, 0.148484202725664540, 0.148434756801094190, 0.148385310505436960, 0.148335863838816030, 0.148286416801355850, -0.148236969393179650, 0.148187521614411010, 0.148138073465173130, 0.148088624945590520, 0.148039176055786340, 0.147989726795884210, 0.147940277166007330, 0.147890827166280190, -0.147841376796825990, 0.147791926057767920, 0.147742474949230460, 0.147693023471336810, 0.147643571624210600, 0.147594119407975040, 0.147544666822754610, 0.147495213868672510, -0.147445760545852370, 0.147396306854417400, 0.147346852794492110, 0.147297398366199680, 0.147247943569663750, 0.147198488405007520, 0.147149032872355510, 0.147099576971830900, -0.147050120703557390, 0.147000664067658100, 0.146951207064257630, 0.146901749693479110, 0.146852291955446220, 0.146802833850282170, 0.146753375378111450, 0.146703916539057320, -0.146654457333242950, 0.146604997760792890, 0.146555537821830310, 0.146506077516478900, 0.146456616844861860, 0.146407155807103700, 0.146357694403327660, 0.146308232633657390, -0.146258770498216090, 0.146209307997128310, 0.146159845130517270, 0.146110381898506610, 0.146060918301219530, 0.146011454338780630, 0.145961990011313080, 0.145912525318940560, -0.145863060261786280, 0.145813594839974770, 0.145764129053629320, 0.145714662902873080, 0.145665196387830630, 0.145615729508625170, 0.145566262265380410, 0.145516794658219540, -0.145467326687267110, 0.145417858352646400, 0.145368389654481010, 0.145318920592894220, 0.145269451168010570, 0.145219981379953320, 0.145170511228846080, 0.145121040714812130, -0.145071569837976010, 0.145022098598460990, 0.144972626996390690, 0.144923155031888410, 0.144873682705078670, 0.144824210016084730, 0.144774736965029820, 0.144725263552038520, -0.144675789777234030, 0.144626315640740110, 0.144576841142679910, 0.144527366283178080, 0.144477891062357840, 0.144428415480342850, 0.144378939537256390, 0.144329463233223040, -0.144279986568365990, 0.144230509542809030, 0.144181032156675300, 0.144131554410089460, 0.144082076303174740, 0.144032597836054820, 0.143983119008852970, 0.143933639821693740, -0.143884160274700440, 0.143834680367996260, 0.143785200101705870, 0.143735719475952460, 0.143686238490859740, 0.143636757146551000, 0.143587275443150780, 0.143537793380782400, -0.143488310959569510, 0.143438828179635440, 0.143389345041104700, 0.143339861544100610, 0.143290377688746890, 0.143240893475166750, 0.143191408903484830, 0.143141923973824410, -0.143092438686309160, 0.143042953041062380, 0.142993467038208640, 0.142943980677871260, 0.142894493960173900, 0.142845006885239880, 0.142795519453193800, 0.142746031664158890, -0.142696543518258470, 0.142647055015617140, 0.142597566156358160, 0.142548076940605280, 0.142498587368481760, 0.142449097440112220, 0.142399607155619920, 0.142350116515128610, -0.142300625518761580, 0.142251134166643390, 0.142201642458897410, 0.142152150395647300, 0.142102657977016380, 0.142053165203129240, 0.142003672074109220, 0.141954178590080000, -0.141904684751164880, 0.141855190557488520, 0.141805696009174170, 0.141756201106345130, 0.141706705849126040, 0.141657210237640160, 0.141607714272011270, 0.141558217952362670, -0.141508721278818940, 0.141459224251503420, 0.141409726870539850, 0.141360229136051510, 0.141310731048163050, 0.141261232606997740, 0.141211733812679370, 0.141162234665331200, -0.141112735165077910, 0.141063235312042760, 0.141013735106349540, 0.140964234548121540, 0.140914733637483390, 0.140865232374558390, 0.140815730759469900, 0.140766228792342520, -0.140716726473299550, 0.140667223802464770, 0.140617720779961490, 0.140568217405914350, 0.140518713680446660, 0.140469209603682200, 0.140419705175744260, 0.140370200396757490, -0.140320695266845240, 0.140271189786131230, 0.140221683954738830, 0.140172177772792640, 0.140122671240416020, 0.140073164357732730, 0.140023657124866090, 0.139974149541940730, -0.139924641609080000, 0.139875133326407660, 0.139825624694047050, 0.139776115712122840, 0.139726606380758320, 0.139677096700076830, 0.139627586670203060, 0.139578076291260320, -0.139528565563372400, 0.139479054486662590, 0.139429543061255630, 0.139380031287274770, 0.139330519164843870, 0.139281006694086220, 0.139231493875126480, 0.139181980708088020, -0.139132467193094580, 0.139082953330269570, 0.139033439119737590, 0.138983924561622040, 0.138934409656046640, 0.138884894403134810, 0.138835378803011170, 0.138785862855799080, -0.138736346561621900, 0.138686829920604300, 0.138637312932869600, 0.138587795598541650, 0.138538277917743760, 0.138488759890600580, 0.138439241517235550, 0.138389722797772400, -0.138340203732334490, 0.138290684321046520, 0.138241164564031850, 0.138191644461414240, 0.138142124013317100, 0.138092603219865110, 0.138043082081181570, 0.137993560597390350, -0.137944038768614770, 0.137894516594979560, 0.137844994076608050, 0.137795471213623590, 0.137745948006150920, 0.137696424454313380, 0.137646900558234780, 0.137597376318038480, -0.137547851733849170, 0.137498326805790240, 0.137448801533985500, 0.137399275918558300, 0.137349749959633370, 0.137300223657334050, 0.137250697011784160, 0.137201170023107110, -0.137151642691427570, 0.137102115016868920, 0.137052586999554970, 0.137003058639609130, 0.136953529937156090, 0.136904000892319220, 0.136854471505221900, 0.136804941775988840, -0.136755411704743420, 0.136705881291609490, 0.136656350536710410, 0.136606819440170890, 0.136557288002114310, 0.136507756222664530, 0.136458224101944910, 0.136408691640080180, -0.136359158837193710, 0.136309625693409350, 0.136260092208850490, 0.136210558383641820, 0.136161024217906770, 0.136111489711769150, 0.136061954865352360, 0.136012419678781140, -0.135962884152178860, 0.135913348285669390, 0.135863812079376090, 0.135814275533423710, 0.135764738647935620, 0.135715201423035250, 0.135665663858847350, 0.135616125955495240, -0.135566587713102840, 0.135517049131793550, 0.135467510211692040, 0.135417970952921800, 0.135368431355606580, 0.135318891419869890, 0.135269351145836380, 0.135219810533629500, -0.135170269583373080, 0.135120728295190560, 0.135071186669206670, 0.135021644705544810, 0.134972102404328830, 0.134922559765682150, 0.134873016789729520, 0.134823473476594350, -0.134773929826400050, 0.134724385839271350, 0.134674841515331710, 0.134625296854704950, 0.134575751857514530, 0.134526206523885140, 0.134476660853940250, 0.134427114847803730, -0.134377568505598950, 0.134328021827450710, 0.134278474813482400, 0.134228927463817900, 0.134179379778580660, 0.134129831757895390, 0.134080283401885550, 0.134030734710675000, -0.133981185684387190, 0.133931636323146840, 0.133882086627077400, 0.133832536596302320, 0.133782986230946310, 0.133733435531132840, 0.133683884496985790, 0.133634333128628600, -0.133584781426185990, 0.133535229389781460, 0.133485677019538840, 0.133436124315581580, 0.133386571278034440, 0.133337017907020900, 0.133287464202664800, 0.133237910165089600, -0.133188355794420070, 0.133138801090779630, 0.133089246054292200, 0.133039690685081230, 0.132990134983271470, 0.132940578948986370, 0.132891022582349800, 0.132841465883485250, -0.132791908852517490, 0.132742351489569950, 0.132692793794766090, 0.132643235768230670, 0.132593677410087180, 0.132544118720459490, 0.132494559699471050, 0.132445000347246660, -0.132395440663909790, 0.132345880649584300, 0.132296320304393670, 0.132246759628462660, 0.132197198621914790, 0.132147637284873890, 0.132098075617463480, 0.132048513619808290, -0.131998951292031850, 0.131949388634258010, 0.131899825646610260, 0.131850262329213400, 0.131800698682190880, 0.131751134705666180, 0.131701570399764070, 0.131652005764608030, -0.131602440800321990, 0.131552875507029400, 0.131503309884855060, 0.131453743933922450, 0.131404177654355470, 0.131354611046277630, 0.131305044109813700, 0.131255476845087120, -0.131205909252221890, 0.131156341331341440, 0.131106773082570540, 0.131057204506032750, 0.131007635601851940, 0.130958066370151590, 0.130908496811056510, 0.130858926924690200, -0.130809356711176130, 0.130759786170639130, 0.130710215303202620, 0.130660644108990610, 0.130611072588126540, 0.130561500740735220, 0.130511928566940160, 0.130462356066865260, -0.130412783240634040, 0.130363210088371290, 0.130313636610200540, 0.130264062806245700, 0.130214488676630240, 0.130164914221478990, 0.130115339440915500, 0.130065764335063620, -0.130016188904046900, 0.129966613147990160, 0.129917037067016880, 0.129867460661250540, 0.129817883930816030, 0.129768306875836790, 0.129718729496436790, 0.129669151792739520, -0.129619573764869820, 0.129569995412951170, 0.129520416737107540, 0.129470837737462430, 0.129421258414140680, 0.129371678767265770, 0.129322098796961660, 0.129272518503351860, -0.129222937886561200, 0.129173356946713200, 0.129123775683931820, 0.129074194098340560, 0.129024612190064230, 0.128975029959226380, 0.128925447405950970, 0.128875864530361510, -0.128826281332582810, 0.128776697812738400, 0.128727113970951820, 0.128677529807347900, 0.128627945322050130, 0.128578360515182510, 0.128528775386868550, 0.128479189937233090, -0.128429604166399670, 0.128380018074492230, 0.128330431661634300, 0.128280844927950720, 0.128231257873565040, 0.128181670498601210, 0.128132082803182780, 0.128082494787434580, -0.128032906451480130, 0.127983317795443420, 0.127933728819447980, 0.127884139523618660, 0.127834549908078960, 0.127784959972952500, 0.127735369718364050, 0.127685779144437160, -0.127636188251295830, 0.127586597039063610, 0.127537005507865310, 0.127487413657824540, 0.127437821489065180, 0.127388229001710870, 0.127338636195886420, 0.127289043071715370, -0.127239449629321710, 0.127189855868828970, 0.127140261790362060, 0.127090667394044480, 0.127041072680000260, 0.126991477648352890, 0.126941882299227260, 0.126892286632746930, -0.126842690649035440, 0.126793094348217700, 0.126743497730417180, 0.126693900795757930, 0.126644303544363510, 0.126594705976358750, 0.126545108091867230, 0.126495509891012940, -0.126445911373919420, 0.126396312540711570, 0.126346713391512930, 0.126297113926447550, 0.126247514145638890, 0.126197914049211910, 0.126148313637290150, 0.126098712909997610, -0.126049111867457820, 0.125999510509795710, 0.125949908837134830, 0.125900306849599160, 0.125850704547312290, 0.125801101930399120, 0.125751498998983160, 0.125701895753188050, -0.125652292193138610, 0.125602688318958460, 0.125553084130771570, 0.125503479628701540, 0.125453874812873230, 0.125404269683410260, 0.125354664240436620, 0.125305058484075860, -0.125255452414452910, 0.125205846031691330, 0.125156239335915100, 0.125106632327247860, 0.125057025005814480, 0.125007417371738540, 0.124957809425144050, 0.124908201166154600, -0.124858592594895080, 0.124808983711489090, 0.124759374516060190, 0.124709765008733290, 0.124660155189632000, 0.124610545058880310, 0.124560934616601810, 0.124511323862921410, -0.124461712797962710, 0.124412101421849730, 0.124362489734706050, 0.124312877736656590, 0.124263265427824940, 0.124213652808335110, 0.124164039878310720, 0.124114426637876680, -0.124064813087156560, 0.124015199226274410, 0.123965585055353820, 0.123915970574519710, 0.123866355783895680, 0.123816740683605310, 0.123767125273773540, 0.123717509554523940, -0.123667893525980580, 0.123618277188267040, 0.123568660541508250, 0.123519043585827810, 0.123469426321349760, 0.123419808748197690, 0.123370190866496560, 0.123320572676369940, -0.123270954177941900, 0.123221335371336020, 0.123171716256677250, 0.123122096834089190, 0.123072477103695880, 0.123022857065620950, 0.122973236719989300, 0.122923616066924580, -0.122873995106550370, 0.122824373838991610, 0.122774752264371910, 0.122725130382815340, 0.122675508194445500, 0.122625885699387330, 0.122576262897764450, 0.122526639789700910, -0.122477016375320320, 0.122427392654747640, 0.122377768628106480, 0.122328144295520900, 0.122278519657114500, 0.122228894713012260, 0.122179269463337780, 0.122129643908215120, -0.122080018047767930, 0.122030391882121110, 0.121980765411398320, 0.121931138635723620, 0.121881511555220630, 0.121831884170014300, 0.121782256480228270, 0.121732628485986150, -0.121683000187412890, 0.121633371584632140, 0.121583742677767960, 0.121534113466943980, 0.121484483952285160, 0.121434854133915140, 0.121385224011957960, 0.121335593586537300, -0.121285962857778100, 0.121236331825803980, 0.121186700490739030, 0.121137068852706890, 0.121087436911832520, 0.121037804668239560, 0.120988172122052100, 0.120938539273393750, -0.120888906122389490, 0.120839272669162970, 0.120789638913837840, 0.120740004856539050, 0.120690370497390230, 0.120640735836515510, 0.120591100874038490, 0.120541465610084160, -0.120491830044776180, 0.120442194178238610, 0.120392558010595120, 0.120342921541970680, 0.120293284772488930, 0.120243647702273970, 0.120194010331449460, 0.120144372660140340, -0.120094734688470300, 0.120045096416563440, 0.119995457844543380, 0.119945818972535120, 0.119896179800662320, 0.119846540329048620, 0.119796900557819010, 0.119747260487097150, -0.119697620117007140, 0.119647979447672640, 0.119598338479218640, 0.119548697211768780, 0.119499055645447190, 0.119449413780377500, 0.119399771616684730, 0.119350129154492540, -0.119300486393925010, 0.119250843335105840, 0.119201199978159990, 0.119151556323211140, 0.119101912370383410, 0.119052268119800450, 0.119002623571587270, 0.118952978725867520, -0.118903333582765320, 0.118853688142404350, 0.118804042404909600, 0.118754396370404750, 0.118704750039013470, 0.118655103410860750, 0.118605456486070270, 0.118555809264766150, -0.118506161747072070, 0.118456513933113020, 0.118406865823012690, 0.118357217416895190, 0.118307568714884210, 0.118257919717104750, 0.118208270423680480, 0.118158620834735550, -0.118108970950393620, 0.118059320770779710, 0.118009670296017490, 0.117960019526231100, 0.117910368461544220, 0.117860717102081850, 0.117811065447967700, 0.117761413499325440, -0.117711761256280080, 0.117662108718955330, 0.117612455887475290, 0.117562802761963690, 0.117513149342545520, 0.117463495629344470, 0.117413841622484680, 0.117364187322089850, -0.117314532728284990, 0.117264877841193800, 0.117215222660940420, 0.117165567187648530, 0.117115911421443180, 0.117066255362448040, 0.117016599010787260, 0.116966942366584540, -0.116917285429964910, 0.116867628201052070, 0.116817970679969710, 0.116768312866842870, 0.116718654761795260, 0.116668996364951000, 0.116619337676433800, 0.116569678696368710, -0.116520019424879410, 0.116470359862090080, 0.116420700008124390, 0.116371039863107400, 0.116321379427162820, 0.116271718700414780, 0.116222057682987000, 0.116172396375004520, -0.116122734776591060, 0.116073072887870750, 0.116023410708967320, 0.115973748240005810, 0.115924085481109930, 0.115874422432403380, 0.115824759094011230, 0.115775095466057170, -0.115725431548665380, 0.115675767341959570, 0.115626102846064780, 0.115576438061104740, 0.115526772987203600, 0.115477107624485080, 0.115427441973074240, 0.115377776033094790, -0.115328109804670910, 0.115278443287926300, 0.115228776482986050, 0.115179109389973830, 0.115129442009013840, 0.115079774340229810, 0.115030106383746790, 0.114980438139688500, -0.114930769608179120, 0.114881100789342370, 0.114831431683303300, 0.114781762290185660, 0.114732092610113180, 0.114682422643210890, 0.114632752389602560, 0.114583081849412350, -0.114533411022763990, 0.114483739909782540, 0.114434068510591740, 0.114384396825315770, 0.114334724854078380, 0.114285052597004600, 0.114235380054218200, 0.114185707225843340, -0.114136034112003780, 0.114086360712824570, 0.114036687028429460, 0.113987013058942630, 0.113937338804487840, 0.113887664265190130, 0.113837989441173270, 0.113788314332560980, -0.113738638939478360, 0.113688963262049140, 0.113639287300397500, 0.113589611054647210, 0.113539934524923340, 0.113490257711349620, 0.113440580614050250, 0.113390903233149020, -0.113341225568770940, 0.113291547621039810, 0.113241869390079810, 0.113192190876014700, 0.113142512078969550, 0.113092832999068110, 0.113043153636434610, 0.112993473991192760, -0.112943794063467690, 0.112894113853383120, 0.112844433361062830, 0.112794752586631890, 0.112745071530214070, 0.112695390191933570, 0.112645708571914170, 0.112596026670280930, -0.112546344487157610, 0.112496662022668450, 0.112446979276937180, 0.112397296250088900, 0.112347612942247390, 0.112297929353536840, 0.112248245484081040, 0.112198561334005050, -0.112148876903432670, 0.112099192192488100, 0.112049507201295080, 0.111999821929978760, 0.111950136378662880, 0.111900450547471660, 0.111850764436528870, 0.111801078045959610, -0.111751391375887660, 0.111701704426436790, 0.111652017197732090, 0.111602329689897350, 0.111552641903056790, 0.111502953837334190, 0.111453265492854630, 0.111403576869741920, -0.111353887968120260, 0.111304198788113440, 0.111254509329846570, 0.111204819593443430, 0.111155129579028230, 0.111105439286724770, 0.111055748716658160, 0.111006057868952170, -0.110956366743731040, 0.110906675341118550, 0.110856983661239810, 0.110807291704218600, 0.110757599470178740, 0.110707906959245320, 0.110658214171542120, 0.110608521107193390, -0.110558827766322920, 0.110509134149055820, 0.110459440255515880, 0.110409746085827350, 0.110360051640114000, 0.110310356918500970, 0.110260661921112040, 0.110210966648071480, -0.110161271099503040, 0.110111575275531860, 0.110061879176281750, 0.110012182801876950, 0.109962486152441240, 0.109912789228099760, 0.109863092028976300, 0.109813394555194690, -0.109763696806880020, 0.109713998784156110, 0.109664300487147200, 0.109614601915977090, 0.109564903070770940, 0.109515203951652510, 0.109465504558746080, 0.109415804892175450, -0.109366104952065740, 0.109316404738540780, 0.109266704251724800, 0.109217003491741610, 0.109167302458716360, 0.109117601152772860, 0.109067899574035360, 0.109018197722627650, -0.108968495598674900, 0.108918793202300910, 0.108869090533629500, 0.108819387592785810, 0.108769684379893640, 0.108719980895077260, 0.108670277138460490, 0.108620573110168470, -0.108570868810325000, 0.108521164239054380, 0.108471459396480400, 0.108421754282728210, 0.108372048897921640, 0.108322343242184940, 0.108272637315641950, 0.108222931118417810, -0.108173224650636330, 0.108123517912421790, 0.108073810903898020, 0.108024103625190170, 0.107974396076422050, 0.107924688257717950, 0.107874980169201680, 0.107825271810998390, -0.107775563183231950, 0.107725854286026130, 0.107676145119506140, 0.107626435683795780, 0.107576725979019320, 0.107527016005300610, 0.107477305762764800, 0.107427595251535740, -0.107377884471737670, 0.107328173423494460, 0.107278462106931260, 0.107228750522171900, 0.107179038669340660, 0.107129326548561390, 0.107079614159959240, 0.107029901503658060, -0.106980188579782120, 0.106930475388455270, 0.106880761929802670, 0.106831048203948160, 0.106781334211015600, 0.106731619951130150, 0.106681905424415640, 0.106632190630996370, -0.106582475570996180, 0.106532760244540240, 0.106483044651752400, 0.106433328792756950, 0.106383612667677730, 0.106333896276639940, 0.106284179619767400, 0.106234462697184410, -0.106184745509014810, 0.106135028055383800, 0.106085310336415220, 0.106035592352233370, 0.105985874102962080, 0.105936155588726560, 0.105886436809650640, 0.105836717765858190, -0.105786998457474400, 0.105737278884623100, 0.105687559047428600, 0.105637838946014780, 0.105588118580506790, 0.105538397951028500, 0.105488677057704220, 0.105438955900657810, -0.105389234480014440, 0.105339512795898000, 0.105289790848432780, 0.105240068637742630, 0.105190346163952740, 0.105140623427187000, 0.105090900427569700, 0.105041177165224710, -0.104991453640277200, 0.104941729852851080, 0.104892005803070620, 0.104842281491059720, 0.104792556916943540, 0.104742832080845980, 0.104693106982890890, 0.104643381623203480, -0.104593656001907610, 0.104543930119127600, 0.104494203974987330, 0.104444477569611990, 0.104394750903125460, 0.104345023975652040, 0.104295296787315630, 0.104245569338241420, -0.104195841628553280, 0.104146113658375530, 0.104096385427832070, 0.104046656937048080, 0.103996928186147450, 0.103947199175254500, 0.103897469904493110, 0.103847740373988490, -0.103798010583864510, 0.103748280534245060, 0.103698550225255360, 0.103648819657019280, 0.103599088829661150, 0.103549357743304860, 0.103499626398075630, 0.103449894794097300, -0.103400162931494260, 0.103350430810390370, 0.103300698430910830, 0.103250965793179560, 0.103201232897320860, 0.103151499743458650, 0.103101766331718120, 0.103052032662223190, -0.103002298735098170, 0.102952564550466960, 0.102902830108454790, 0.102853095409185520, 0.102803360452783100, 0.102753625239372700, 0.102703889769078250, 0.102654154042024060, -0.102604418058334060, 0.102554681818133440, 0.102504945321546140, 0.102455208568696460, 0.102405471559708310, 0.102355734294706930, 0.102305996773816220, 0.102256258997160510, -0.102206520964863710, 0.102156782677051060, 0.102107044133846440, 0.102057305335374230, 0.102007566281758290, 0.101957826973123890, 0.101908087409594920, 0.101858347591295740, -0.101808607518350230, 0.101758867190883660, 0.101709126609019910, 0.101659385772882920, 0.101609644682597890, 0.101559903338288770, 0.101510161740079860, 0.101460419888095120, -0.101410677782459780, 0.101360935423297730, 0.101311192810733350, 0.101261449944890540, 0.101211706825894560, 0.101161963453869310, 0.101112219828939140, 0.101062475951227980, -0.101012731820861080, 0.100962987437962350, 0.100913242802656150, 0.100863497915066410, 0.100813752775318340, 0.100764007383535910, 0.100714261739843020, 0.100664515844364910, -0.100614769697225520, 0.100565023298549190, 0.100515276648459870, 0.100465529747082810, 0.100415782594541910, 0.100366035190961560, 0.100316287536465680, 0.100266539631179510, -0.100216791475227010, 0.100167043068732530, 0.100117294411819990, 0.100067545504614660, 0.100017796347240460, 0.099968046939821781, 0.099918297282482541, 0.099868547375348005, -0.099818797218542088, 0.099769046812188733, 0.099719296156413215, 0.099669545251339448, 0.099619794097091832, 0.099570042693794270, 0.099520291041572048, 0.099470539140549111, -0.099420786990849816, 0.099371034592598120, 0.099321281945919271, 0.099271529050937210, 0.099221775907776338, 0.099172022516560585, 0.099122268877415209, 0.099072514990464169, -0.099022760855831837, 0.098973006473642169, 0.098923251844020413, 0.098873496967090538, 0.098823741842976473, 0.098773986471803507, 0.098724230853695569, 0.098674474988777044, -0.098624718877171905, 0.098574962519005396, 0.098525205914401490, 0.098475449063484558, 0.098425691966378570, 0.098375934623208802, 0.098326177034099183, 0.098276419199174125, -0.098226661118557587, 0.098176902792374829, 0.098127144220749821, 0.098077385403806949, 0.098027626341670171, 0.097977867034464761, 0.097928107482314689, 0.097878347685344355, -0.097828587643677703, 0.097778827357440035, 0.097729066826755279, 0.097679306051747433, 0.097629545032541759, 0.097579783769262213, 0.097530022262033209, 0.097480260510978717, -0.097430498516224012, 0.097380736277893065, 0.097330973796110262, 0.097281211070999601, 0.097231448102686344, 0.097181684891294473, 0.097131921436948376, 0.097082157739772051, -0.097032393799890759, 0.096982629617428498, 0.096932865192509654, 0.096883100525258198, 0.096833335615799446, 0.096783570464257340, 0.096733805070755879, 0.096684039435420352, -0.096634273558374714, 0.096584507439743394, 0.096534741079650363, 0.096484974478220922, 0.096435207635579057, 0.096385440551849152, 0.096335673227155222, 0.096285905661622539, -0.096236137855375103, 0.096186369808537314, 0.096136601521233156, 0.096086832993587945, 0.096037064225725638, 0.095987295217770691, 0.095937525969847046, 0.095887756482080033, -0.095837986754593638, 0.095788216787511829, 0.095738446580959910, 0.095688676135061879, 0.095638905449942163, 0.095589134525724748, 0.095539363362534921, 0.095489591960496695, -0.095439820319734497, 0.095390048440372299, 0.095340276322535417, 0.095290503966347848, 0.095240731371934020, 0.095190958539417919, 0.095141185468924860, 0.095091412160578856, -0.095041638614504306, 0.094991864830825223, 0.094942090809666910, 0.094892316551153377, 0.094842542055409054, 0.094792767322557939, 0.094742992352725333, 0.094693217146035263, -0.094643441702611700, 0.094593666022579972, 0.094543890106064080, 0.094494113953188463, 0.094444337564077122, 0.094394560938855385, 0.094344784077647237, 0.094295006980577134, -0.094245229647769060, 0.094195452079348360, 0.094145674275439031, 0.094095896236165516, 0.094046117961651826, 0.093996339452023278, 0.093946560707403884, 0.093896781727918086, -0.093847002513689881, 0.093797223064844629, 0.093747443381506312, 0.093697663463798944, 0.093647883311847854, 0.093598102925777069, 0.093548322305711015, 0.093498541451773720, -0.093448760364090500, 0.093398979042785393, 0.093349197487982843, 0.093299415699806848, 0.093249633678382751, 0.093199851423834579, 0.093150068936286773, 0.093100286215863359, -0.093050503262689668, 0.093000720076889712, 0.092950936658587974, 0.092901153007908438, 0.092851369124976463, 0.092801585009916060, 0.092751800662851269, 0.092702016083907407, -0.092652231273208499, 0.092602446230879029, 0.092552660957042995, 0.092502875451825742, 0.092453089715351308, 0.092403303747744150, 0.092353517549128294, 0.092303731119629071, -0.092253944459370532, 0.092204157568477135, 0.092154370447072892, 0.092104583095283174, 0.092054795513231993, 0.092005007701043834, 0.091955219658842707, 0.091905431386753972, -0.091855642884901653, 0.091805854153409791, 0.091756065192403730, 0.091706276002007509, 0.091656486582345598, 0.091606696933542037, 0.091556907055722170, 0.091507116949010023, -0.091457326613530107, 0.091407536049406421, 0.091357745256764336, 0.091307954235727878, 0.091258162986421545, 0.091208371508969363, 0.091158579803496689, 0.091108787870127578, -0.091058995708986484, 0.091009203320197463, 0.090959410703885885, 0.090909617860175762, 0.090859824789191607, 0.090810031491057444, 0.090760237965898646, 0.090710444213839253, -0.090660650235003318, 0.090610856029516185, 0.090561061597501921, 0.090511266939084997, 0.090461472054389466, 0.090411676943540686, 0.090361881606662725, 0.090312086043880066, -0.090262290255316735, 0.090212494241098132, 0.090162698001348282, 0.090112901536191697, 0.090063104845752417, 0.090013307930155814, 0.089963510789525941, 0.089913713423987282, -0.089863915833663918, 0.089814118018681194, 0.089764319979163176, 0.089714521715233905, 0.089664723227018781, 0.089614924514641855, 0.089565125578227614, 0.089515326417900110, -0.089465527033784742, 0.089415727426005551, 0.089365927594687047, 0.089316127539953286, 0.089266327261929637, 0.089216526760740170, 0.089166726036509394, 0.089116925089361351, -0.089067123919421440, 0.089017322526813727, 0.088967520911662698, 0.088917719074092433, 0.088867917014228304, 0.088818114732194392, 0.088768312228114751, 0.088718509502114767, -0.088668706554318508, 0.088618903384850484, 0.088569099993834763, 0.088519296381396731, 0.088469492547660455, 0.088419688492750448, 0.088369884216790776, 0.088320079719906838, -0.088270275002222703, 0.088220470063862882, 0.088170664904951443, 0.088120859525613784, 0.088071053925973974, 0.088021248106156524, 0.087971442066285530, 0.087921635806486362, -0.087871829326883102, 0.087822022627600263, 0.087772215708761939, 0.087722408570493501, 0.087672601212919060, 0.087622793636162669, 0.087572985840349726, 0.087523177825604329, -0.087473369592050987, 0.087423561139813769, 0.087373752469018101, 0.087323943579788052, 0.087274134472248133, 0.087224325146522438, 0.087174515602736383, 0.087124705841014033, -0.087074895861479915, 0.087025085664258123, 0.086975275249474057, 0.086925464617251799, 0.086875653767715888, 0.086825842700990391, 0.086776031417200722, 0.086726219916470990, -0.086676408198925262, 0.086626596264688951, 0.086576784113886154, 0.086526971746641396, 0.086477159163078771, 0.086427346363323679, 0.086377533347500229, 0.086327720115732948, -0.086277906668145915, 0.086228093004864573, 0.086178279126012988, 0.086128465031715701, 0.086078650722096819, 0.086028836197281744, 0.085979021457394583, 0.085929206502559863, -0.085879391332901692, 0.085829575948545483, 0.085779760349615333, 0.085729944536235350, 0.085680128508530934, 0.085630312266626193, 0.085580495810645682, 0.085530679140713495, -0.085480862256955045, 0.085431045159494429, 0.085381227848456212, 0.085331410323964491, 0.085281592586144664, 0.085231774635120869, 0.085181956471017645, 0.085132138093959073, -0.085082319504070608, 0.085032500701476346, 0.084982681686300826, 0.084932862458668157, 0.084883043018703780, 0.084833223366531790, 0.084783403502276297, 0.084733583426062742, -0.084683763138015233, 0.084633942638258311, 0.084584121926916098, 0.084534301004114007, 0.084484479869976176, 0.084434658524627143, 0.084384836968191018, 0.084335015200793256, -0.084285193222557939, 0.084235371033609646, 0.084185548634072488, 0.084135726024071891, 0.084085903203731979, 0.084036080173177319, 0.083986256932532005, 0.083936433481921507, -0.083886609821469907, 0.083836785951301798, 0.083786961871541277, 0.083737137582313784, 0.083687313083743456, 0.083637488375954402, 0.083587663459072065, 0.083537838333220579, -0.083488012998524486, 0.083438187455107921, 0.083388361703096339, 0.083338535742613851, 0.083288709573785008, 0.083238883196733962, 0.083189056611586154, 0.083139229818465693, -0.083089402817497160, 0.083039575608804692, 0.082989748192513715, 0.082939920568748368, 0.082890092737633217, 0.082840264699292399, 0.082790436453851354, 0.082740608001434221, -0.082690779342165122, 0.082640950476169525, 0.082591121403571541, 0.082541292124495763, 0.082491462639066315, 0.082441632947408652, 0.082391803049646897, 0.082341972945905645, -0.082292142636309004, 0.082242312120982458, 0.082192481400050130, 0.082142650473636614, 0.082092819341866005, 0.082042988004863801, 0.081993156462754124, 0.081943324715661570, -0.081893492763710246, 0.081843660607025637, 0.081793828245731878, 0.081743995679953108, 0.081694162909814780, 0.081644329935441060, 0.081594496756956500, 0.081544663374485266, -0.081494829788152812, 0.081444995998083289, 0.081395162004401278, 0.081345327807230916, 0.081295493406697672, 0.081245658802925697, 0.081195823996039571, 0.081145988986163445, -0.081096153773422788, 0.081046318357941752, 0.080996482739844916, 0.080946646919256432, 0.080896810896301782, 0.080846974671105090, 0.080797138243790978, 0.080747301614483569, -0.080697464783308345, 0.080647627750389458, 0.080597790515851059, 0.080547953079818629, 0.080498115442416321, 0.080448277603768728, 0.080398439563999988, 0.080348601323235597, -0.080298762881599692, 0.080248924239216896, 0.080199085396211331, 0.080149246352708509, 0.080099407108832565, 0.080049567664708110, 0.079999728020459279, 0.079949888176211584, -0.079900048132089160, 0.079850207888216618, 0.079800367444718120, 0.079750526801719138, 0.079700685959343848, 0.079650844917716387, 0.079601003676962268, 0.079551162237205639, -0.079501320598571096, 0.079451478761182817, 0.079401636725166272, 0.079351794490645652, 0.079301952057745539, 0.079252109426590098, 0.079202266597304824, 0.079152423570013897, -0.079102580344841897, 0.079052736921913017, 0.079002893301352725, 0.078953049483285215, 0.078903205467835066, 0.078853361255126472, 0.078803516845284902, 0.078753672238434561, -0.078703827434699586, 0.078653982434205474, 0.078604137237076419, 0.078554291843437027, 0.078504446253411450, 0.078454600467125199, 0.078404754484702452, 0.078354908306267831, -0.078305061931945474, 0.078255215361860919, 0.078205368596138330, 0.078155521634902303, 0.078105674478277043, 0.078055827126388033, 0.078005979579359452, 0.077956131837315937, -0.077906283900381637, 0.077856435768682078, 0.077806587442341424, 0.077756738921483853, 0.077706890206234891, 0.077657041296718687, 0.077607192193059893, 0.077557342895382672, -0.077507493403812536, 0.077457643718473662, 0.077407793839490688, 0.077357943766987777, 0.077308093501090455, 0.077258243041922900, 0.077208392389609748, 0.077158541544275150, -0.077108690506044658, 0.077058839275042437, 0.077008987851393110, 0.076959136235220882, 0.076909284426651237, 0.076859432425808394, 0.076809580232816976, 0.076759727847801162, -0.076709875270886463, 0.076660022502197084, 0.076610169541857190, 0.076560316389992333, 0.076510463046726679, 0.076460609512184863, 0.076410755786491091, 0.076360901869770861, -0.076311047762148379, 0.076261193463748281, 0.076211338974694759, 0.076161484295113338, 0.076111629425128197, 0.076061774364863971, 0.076011919114444881, 0.075962063673996438, -0.075912208043642834, 0.075862352223508706, 0.075812496213718258, 0.075762640014397004, 0.075712783625669161, 0.075662927047658909, 0.075613070280491787, 0.075563213324291986, -0.075513356179184157, 0.075463498845292479, 0.075413641322742517, 0.075363783611658436, 0.075313925712164900, 0.075264067624386116, 0.075214209348447594, 0.075164350884473555, -0.075114492232588648, 0.075064633392917052, 0.075014774365584319, 0.074964915150714656, 0.074915055748432699, 0.074865196158862668, 0.074815336382130074, 0.074765476418359150, -0.074715616267674090, 0.074665755930200445, 0.074615895406062394, 0.074566034695384600, 0.074516173798291299, 0.074466312714907987, 0.074416451445358897, 0.074366589989768681, -0.074316728348261543, 0.074266866520963037, 0.074217004507997356, 0.074167142309489162, 0.074117279925562676, 0.074067417356343437, 0.074017554601955651, 0.073967691662523968, -0.073917828538172622, 0.073867965229027152, 0.073818101735211764, 0.073768238056851121, 0.073718374194069430, 0.073668510146992258, 0.073618645915743811, 0.073568781500448308, -0.073518916901231288, 0.073469052118216985, 0.073419187151530035, 0.073369322001294687, 0.073319456667636479, 0.073269591150679617, 0.073219725450548792, 0.073169859567368198, -0.073119993501263414, 0.073070127252358633, 0.073020260820778532, 0.072970394206647346, 0.072920527410090613, 0.072870660431232553, 0.072820793270197859, 0.072770925927110722, -0.072721058402096722, 0.072671190695280080, 0.072621322806785016, 0.072571454736737082, 0.072521586485260511, 0.072471718052479983, 0.072421849438519703, 0.072371980643505252, -0.072322111667560848, 0.072272242510811172, 0.072222373173380428, 0.072172503655394210, 0.072122633956976726, 0.072072764078252666, 0.072022894019346237, 0.071973023780383033, -0.071923153361487260, 0.071873282762783611, 0.071823411984396304, 0.071773541026450907, 0.071723669889071667, 0.071673798572382805, 0.071623927076509900, 0.071574055401577158, -0.071524183547709286, 0.071474311515030517, 0.071424439303666404, 0.071374566913741208, 0.071324694345379580, 0.071274821598705781, 0.071224948673845365, 0.071175075570922577, -0.071125202290062098, 0.071075328831388188, 0.071025455195026385, 0.070975581381100938, 0.070925707389736553, 0.070875833221057435, 0.070825958875189193, 0.070776084352256061, -0.070726209652382258, 0.070676334775693378, 0.070626459722313670, 0.070576584492367811, 0.070526709085980036, 0.070476833503275937, 0.070426957744379765, 0.070377081809416195, -0.070327205698509462, 0.070277329411785175, 0.070227452949367553, 0.070177576311381301, 0.070127699497950668, 0.070077822509201235, 0.070027945345257234, 0.069978068006243385, -0.069928190492283909, 0.069878312803504400, 0.069828434940029119, 0.069778556901982744, 0.069728678689489537, 0.069678800302675079, 0.069628921741663616, 0.069579043006579397, -0.069529164097548030, 0.069479285014693734, 0.069429405758141244, 0.069379526328014779, 0.069329646724439961, 0.069279766947541011, 0.069229886997442647, 0.069180006874269132, -0.069130126578146031, 0.069080246109197621, 0.069030365467548593, 0.068980484653323210, 0.068930603666647050, 0.068880722507644390, 0.068830841176439922, 0.068780959673157907, -0.068731077997923939, 0.068681196150862267, 0.068631314132097165, 0.068581431941754228, 0.068531549579957704, 0.068481667046832312, 0.068431784342502300, 0.068381901467093276, -0.068332018420729501, 0.068282135203535682, 0.068232251815636080, 0.068182368257156289, 0.068132484528220572, 0.068082600628953646, 0.068032716559479775, 0.067982832319924566, -0.067932947910412267, 0.067883063331067597, 0.067833178582014833, 0.067783293663379568, 0.067733408575286064, 0.067683523317858596, 0.067633637891222759, 0.067583752295502827, -0.067533866530823522, 0.067483980597309090, 0.067434094495085167, 0.067384208224276002, 0.067334321785006326, 0.067284435177400390, 0.067234548401583813, 0.067184661457680858, -0.067134774345816259, 0.067084887066114277, 0.067034999618700519, 0.066985112003699276, 0.066935224221235240, 0.066885336271432699, 0.066835448154417262, 0.066785559870313205, -0.066735671419245260, 0.066685782801337676, 0.066635894016716088, 0.066586005065504758, 0.066536115947827976, 0.066486226663811349, 0.066436337213579152, 0.066386447597256121, -0.066336557814966515, 0.066286667866835972, 0.066236777752988751, 0.066186887473549588, 0.066136997028642758, 0.066087106418393882, 0.066037215642927236, 0.065987324702367553, -0.065937433596839123, 0.065887542326467541, 0.065837650891377109, 0.065787759291692546, 0.065737867527538144, 0.065687975599039522, 0.065638083506320957, 0.065588191249506739, -0.065538298828722488, 0.065488406244092481, 0.065438513495741465, 0.065388620583793730, 0.065338727508374883, 0.065288834269609214, 0.065238940867621456, 0.065189047302535899, -0.065139153574478179, 0.065089259683572570, 0.065039365629943807, 0.064989471413716193, 0.064939577035015350, 0.064889682493965553, 0.064839787790691550, 0.064789892925317644, -0.064739997897969442, 0.064690102708771235, 0.064640207357847340, 0.064590311845323378, 0.064540416171323625, 0.064490520335972829, 0.064440624339395292, 0.064390728181716650, -0.064340831863061165, 0.064290935383553613, 0.064241038743318282, 0.064191141942480795, 0.064141244981165454, 0.064091347859496994, 0.064041450577599732, 0.063991553135599274, -0.063941655533619940, 0.063891757771786475, 0.063841859850223157, 0.063791961769055647, 0.063742063528408222, 0.063692165128405198, 0.063642266569172212, 0.063592367850833553, -0.063542468973513969, 0.063492569937337776, 0.063442670742430596, 0.063392771388916747, 0.063342871876920961, 0.063292972206567558, 0.063243072377982171, 0.063193172391289090, -0.063143272246613091, 0.063093371944078463, 0.063043471483810856, 0.062993570865934559, 0.062943670090574347, 0.062893769157854496, 0.062843868067900682, 0.062793966820837196, -0.062744065416788786, 0.062694163855879781, 0.062644262138235804, 0.062594360263981172, 0.062544458233240188, 0.062494556046138516, 0.062444653702800446, 0.062394751203350737, -0.062344848547913716, 0.062294945736615009, 0.062245042769578943, 0.062195139646930270, 0.062145236368793301, 0.062095332935293693, 0.062045429346555742, 0.061995525602704223, -0.061945621703863446, 0.061895717650159061, 0.061845813441715379, 0.061795909078657160, 0.061746004561108729, 0.061696099889195728, 0.061646195063042482, 0.061596290082773300, -0.061546384948513840, 0.061496479660388410, 0.061446574218521788, 0.061396668623038289, 0.061346762874063557, 0.061296856971721922, 0.061246950916138139, 0.061197044707436539, -0.061147138345742771, 0.061097231831181154, 0.061047325163876461, 0.060997418343953010, 0.060947511371536457, 0.060897604246751121, 0.060847696969721782, 0.060797789540572751, -0.060747881959429692, 0.060697974226416929, 0.060648066341658792, 0.060598158305280925, 0.060548250117407665, 0.060498341778163781, 0.060448433287673596, 0.060398524646062775, -0.060348615853455634, 0.060298706909976962, 0.060248797815751078, 0.060198888570903643, 0.060148979175558982, 0.060099069629841878, 0.060049159933876654, 0.059999250087788975, -0.059949340091703170, 0.059899429945744015, 0.059849519650035841, 0.059799609204704313, 0.059749698609873760, 0.059699787865668964, 0.059649876972214251, 0.059599965929635290, -0.059550054738056420, 0.059500143397601964, 0.059450231908397592, 0.059400320270567644, 0.059350408484236894, 0.059300496549529680, 0.059250584466571665, 0.059200672235487188, -0.059150759856401038, 0.059100847329437538, 0.059050934654722366, 0.059001021832379853, 0.058951108862534789, 0.058901195745311510, 0.058851282480835689, 0.058801369069231654, -0.058751455510624204, 0.058701541805137661, 0.058651627952897717, 0.058601713954028696, 0.058551799808654957, 0.058501885516902150, 0.058451971078894639, 0.058402056494757194, -0.058352141764614167, 0.058302226888591227, 0.058252311866812720, 0.058202396699403434, 0.058152481386487716, 0.058102565928191234, 0.058052650324638341, 0.058002734575953820, -0.057952818682262014, 0.057902902643688615, 0.057852986460357955, 0.057803070132394822, 0.057753153659923583, 0.057703237043069892, 0.057653320281958118, 0.057603403376712589, -0.057553486327459005, 0.057503569134321697, 0.057453651797425474, 0.057403734316894675, 0.057353816692854984, 0.057303898925430745, 0.057253981014746769, 0.057204062960927393, -0.057154144764098302, 0.057104226424383848, 0.057054307941908827, 0.057004389316797598, 0.056954470549175837, 0.056904551639167897, 0.056854632586898581, 0.056804713392492240, -0.056754794056074552, 0.056704874577769890, 0.056654954957702591, 0.056605035195998347, 0.056555115292781524, 0.056505195248176904, 0.056455275062308859, 0.056405354735303059, -0.056355434267283885, 0.056305513658376119, 0.056255592908704126, 0.056205672018393590, 0.056155750987568885, 0.056105829816354792, 0.056055908504875684, 0.056005987053257253, -0.055956065461623850, 0.055906143730100284, 0.055856221858810916, 0.055806299847881435, 0.055756377697436202, 0.055706455407600032, 0.055656532978497278, 0.055606610410253630, -0.055556687702993462, 0.055506764856841126, 0.055456841871922326, 0.055406918748361414, 0.055356995486283214, 0.055307072085812078, 0.055257148547073705, 0.055207224870192459, -0.055157301055293158, 0.055107377102500153, 0.055057453011939150, 0.055007528783734522, 0.054957604418011063, 0.054907679914893155, 0.054857755274506488, 0.054807830496975435, -0.054757905582424805, 0.054707980530978965, 0.054658055342763620, 0.054608130017903135, 0.054558204556521883, 0.054508278958745562, 0.054458353224698539, 0.054408427354505642, -0.054358501348291226, 0.054308575206181008, 0.054258648928299347, 0.054208722514771060, 0.054158795965720527, 0.054108869281273446, 0.054058942461554196, 0.054009015506687588, -0.053959088416797994, 0.053909161192011126, 0.053859233832451357, 0.053809306338243504, 0.053759378709511939, 0.053709450946382367, 0.053659523048979176, 0.053609595017426730, -0.053559666851850735, 0.053509738552375577, 0.053459810119126074, 0.053409881552226597, 0.053359952851802867, 0.053310024017979254, 0.053260095050880578, 0.053210165950631216, -0.053160236717356889, 0.053110307351181975, 0.053060377852231284, 0.053010448220629211, 0.052960518456501453, 0.052910588559972403, 0.052860658531166886, 0.052810728370209274, -0.052760798077225286, 0.052710867652339302, 0.052660937095676152, 0.052611006407360210, 0.052561075587517200, 0.052511144636271503, 0.052461213553747499, 0.052411282340070905, -0.052361350995366103, 0.052311419519757922, 0.052261487913370749, 0.052211556176330304, 0.052161624308760965, 0.052111692310787570, 0.052061760182534500, 0.052011827924127466, -0.051961895535690868, 0.051911963017349530, 0.051862030369227839, 0.051812097591451521, 0.051762164684144955, 0.051712231647432980, 0.051662298481439980, 0.051612365186291677, -0.051562431762112462, 0.051512498209026723, 0.051462564527160186, 0.051412630716637230, 0.051362696777582706, 0.051312762710120988, 0.051262828514377815, 0.051212894190477566, -0.051162959738545080, 0.051113025158704757, 0.051063090451082309, 0.051013155615802136, 0.050963220652989076, 0.050913285562767523, 0.050863350345263195, 0.050813415000600493, -0.050763479528904254, 0.050713543930298872, 0.050663608204910074, 0.050613672352862252, 0.050563736374279813, 0.050513800269288471, 0.050463864038012632, 0.050413927680577127, -0.050363991197106363, 0.050314054587726066, 0.050264117852560630, 0.050214180991734900, 0.050164244005373275, 0.050114306893601482, 0.050064369656543928, 0.050014432294325444, -0.049964494807070436, 0.049914557194904632, 0.049864619457952439, 0.049814681596338700, 0.049764743610187810, 0.049714805499625501, 0.049664867264776182, 0.049614928905764251, -0.049564990422715442, 0.049515051815754156, 0.049465113085005244, 0.049415174230593099, 0.049365235252643469, 0.049315296151280746, 0.049265356926629783, 0.049215417578814986, -0.049165478107962089, 0.049115538514195499, 0.049065598797640060, 0.049015658958420180, 0.048965718996661592, 0.048915778912488717, 0.048865838706026385, 0.048815898377399018, -0.048765957926732342, 0.048716017354150778, 0.048666076659779171, 0.048616135843741928, 0.048566194906164782, 0.048516253847172154, 0.048466312666888452, 0.048416371365439408, -0.048366429942949436, 0.048316488399543389, 0.048266546735345674, 0.048216604950482043, 0.048166663045076892, 0.048116721019255092, 0.048066778873141036, 0.048016836606860486, -0.047966894220537841, 0.047916951714297953, 0.047867009088265251, 0.047817066342565467, 0.047767123477323016, 0.047717180492662763, 0.047667237388709108, 0.047617294165587805, -0.047567350823423268, 0.047517407362339906, 0.047467463782463477, 0.047417520083918384, 0.047367576266829491, 0.047317632331321212, 0.047267688277519294, 0.047217744105548159, -0.047167799815532666, 0.047117855407597227, 0.047067910881867597, 0.047017966238468184, 0.046968021477523859, 0.046918076599159031, 0.046868131603499459, 0.046818186490669565, -0.046768241260794194, 0.046718295913997780, 0.046668350450406071, 0.046618404870143487, 0.046568459173334444, 0.046518513360104700, 0.046468567430578672, 0.046418621384881224, -0.046368675223136778, 0.046318728945471087, 0.046268782552008579, 0.046218836042874113, 0.046168889418192111, 0.046118942678088332, 0.046068995822687191, 0.046019048852113560, -0.045969101766491868, 0.045919154565947869, 0.045869207250605976, 0.045819259820591068, 0.045769312276027561, 0.045719364617041229, 0.045669416843756479, 0.045619468956298183, -0.045569520954790776, 0.045519572839360006, 0.045469624610130308, 0.045419676267226108, 0.045369727810773156, 0.045319779240895884, 0.045269830557719166, 0.045219881761367424, -0.045169932851966424, 0.045119983829640595, 0.045070034694514802, 0.045020085446713480, 0.044970136086362390, 0.044920186613585961, 0.044870237028509057, 0.044820287331256127, -0.044770337521952919, 0.044720387600723860, 0.044670437567693844, 0.044620487422987284, 0.044570537166729950, 0.044520586799046268, 0.044470636320060680, 0.044420685729898948, -0.044370735028685500, 0.044320784216545214, 0.044270833293602520, 0.044220882259983191, 0.044170931115811655, 0.044120979861212793, 0.044071028496311032, 0.044021077021232147, -0.043971125436100572, 0.043921173741041181, 0.043871221936178414, 0.043821270021638034, 0.043771317997544475, 0.043721365864022629, 0.043671413621196919, 0.043621461269193119, -0.043571508808135664, 0.043521556238149003, 0.043471603559358883, 0.043421650771889760, 0.043371697875866512, 0.043321744871413576, 0.043271791758656718, 0.043221838537720381, -0.043171885208729451, 0.043121931771808356, 0.043071978227082884, 0.043022024574677464, 0.042972070814716982, 0.042922116947325881, 0.042872162972629926, 0.042822208890753569, -0.042772254701821687, 0.042722300405958723, 0.042672346003290458, 0.042622391493941321, 0.042572436878036211, 0.042522482155699565, 0.042472527327057155, 0.042422572392233425, -0.042372617351352823, 0.042322662204541117, 0.042272706951922763, 0.042222751593622633, 0.042172796129765183, 0.042122840560476195, 0.042072884885880096, 0.042022929106101788, -0.041972973221265711, 0.041923017231497647, 0.041873061136922039, 0.041823104937663780, 0.041773148633847318, 0.041723192225598421, 0.041673235713041545, 0.041623279096301584, -0.041573322375502979, 0.041523365550771511, 0.041473408622231631, 0.041423451590007786, 0.041373494454225751, 0.041323537215009983, 0.041273579872485373, 0.041223622426776373, -0.041173664878008755, 0.041123707226306976, 0.041073749471795928, 0.041023791614600062, 0.040973833654845165, 0.040923875592655680, 0.040873917428156506, 0.040823959161472100, -0.040774000792728235, 0.040724042322049368, 0.040674083749560400, 0.040624125075385771, 0.040574166299651278, 0.040524207422481369, 0.040474248444000500, 0.040424289364334454, -0.040374330183607678, 0.040324370901945079, 0.040274411519471115, 0.040224452036311559, 0.040174492452590874, 0.040124532768433960, 0.040074572983965266, 0.040024613099310588, -0.039974653114594375, 0.039924693029941533, 0.039874732845476511, 0.039824772561325099, 0.039774812177611758, 0.039724851694461390, 0.039674891111998449, 0.039624930430348718, -0.039574969649636665, 0.039525008769986741, 0.039475047791524741, 0.039425086714375120, 0.039375125538662785, 0.039325164264512193, 0.039275202892049131, 0.039225241421398063, -0.039175279852683889, 0.039125318186031072, 0.039075356421565406, 0.039025394559411349, 0.038975432599693806, 0.038925470542537234, 0.038875508388067435, 0.038825546136408859, -0.038775583787686425, 0.038725621342024584, 0.038675658799549130, 0.038625696160384533, 0.038575733424655693, 0.038525770592487081, 0.038475807664004477, 0.038425844639332365, -0.038375881518595188, 0.038325918301918754, 0.038275954989427527, 0.038225991581246413, 0.038176028077499875, 0.038126064478313709, 0.038076100783812385, 0.038026136994120802, -0.037976173109363437, 0.037926209129666086, 0.037876245055153211, 0.037826280885949720, 0.037776316622180083, 0.037726352263970100, 0.037676387811444237, 0.037626423264727406, -0.037576458623944070, 0.037526493889220032, 0.037476529060679761, 0.037426564138447721, 0.037376599122649720, 0.037326634013410215, 0.037276668810854126, 0.037226703515105923, -0.037176738126291402, 0.037126772644535039, 0.037076807069961748, 0.037026841402695986, 0.036976875642863574, 0.036926909790588963, 0.036876943845997087, 0.036826977809212402, -0.036777011680360717, 0.036727045459566503, 0.036677079146954679, 0.036627112742649709, 0.036577146246777402, 0.036527179659462228, 0.036477212980828663, 0.036427246211002511, -0.036377279350108239, 0.036327312398270771, 0.036277345355614575, 0.036227378222265468, 0.036177410998347904, 0.036127443683986821, 0.036077476279306686, 0.036027508784433296, -0.035977541199491141, 0.035927573524605134, 0.035877605759899747, 0.035827637905500788, 0.035777669961532733, 0.035727701928120505, 0.035677733805388578, 0.035627765593462764, -0.035577797292467531, 0.035527828902527807, 0.035477860423768062, 0.035427891856314120, 0.035377923200290443, 0.035327954455821514, 0.035277985623033137, 0.035228016702049801, -0.035178047692996428, 0.035128078595997488, 0.035078109411178796, 0.035028140138664829, 0.034978170778580508, 0.034928201331050325, 0.034878231796200074, 0.034828262174154252, -0.034778292465037768, 0.034728322668975110, 0.034678352786092090, 0.034628382816513190, 0.034578412760363331, 0.034528442617766997, 0.034478472388850004, 0.034428502073736822, -0.034378531672551949, 0.034328561185421186, 0.034278590612469018, 0.034228619953820379, 0.034178649209599739, 0.034128678379932928, 0.034078707464944416, 0.034028736464759138, -0.033978765379501570, 0.033928794209297543, 0.033878822954271519, 0.033828851614548447, 0.033778880190252797, 0.033728908681510385, 0.033678937088445708, 0.033628965411183688, -0.033578993649848815, 0.033529021804566891, 0.033479049875462422, 0.033429077862659883, 0.033379105766285090, 0.033329133586462535, 0.033279161323317138, 0.033229188976973405, -0.033179216547557136, 0.033129244035192830, 0.033079271440005414, 0.033029298762119373, 0.032979326001660529, 0.032929353158753373, 0.032879380233522833, 0.032829407226093399, -0.032779434136590888, 0.032729460965139796, 0.032679487711865046, 0.032629514376891135, 0.032579540960343885, 0.032529567462347780, 0.032479593883027312, 0.032429620222508303, -0.032379646480915243, 0.032329672658373068, 0.032279698755006268, 0.032229724770940667, 0.032179750706300754, 0.032129776561211458, 0.032079802335797283, 0.032029828030184046, -0.031979853644496237, 0.031929879178858790, 0.031879904633396204, 0.031829930008234301, 0.031779955303497580, 0.031729980519310960, 0.031680005655798947, 0.031630030713087370, -0.031580055691300707, 0.031530080590563912, 0.031480105411001470, 0.031430130152739211, 0.031380154815901617, 0.031330179400613202, 0.031280203906999780, 0.031230228335185847, -0.031180252685296343, 0.031130276957455762, 0.031080301151789936, 0.031030325268423354, 0.030980349307480962, 0.030930373269087250, 0.030880397153368048, 0.030830420960447857, -0.030780444690451610, 0.030730468343503809, 0.030680491919730282, 0.030630515419255523, 0.030580538842204477, 0.030530562188701638, 0.030480585458872840, 0.030430608652842576, -0.030380631770735349, 0.030330654812676987, 0.030280677778791985, 0.030230700669205291, 0.030180723484041400, 0.030130746223426146, 0.030080768887484025, 0.030030791476339982, -0.029980813990118517, 0.029930836428945458, 0.029880858792945310, 0.029830881082243015, 0.029780903296963073, 0.029730925437231319, 0.029680947503172250, 0.029630969494910810, -0.029580991412571506, 0.029531013256280166, 0.029481035026161291, 0.029431056722339387, 0.029381078344940286, 0.029331099894088487, 0.029281121369908937, 0.029231142772526142, -0.029181164102065935, 0.029131185358652816, 0.029081206542411732, 0.029031227653467190, 0.028981248691945023, 0.028931269657969733, 0.028881290551666269, 0.028831311373159137, -0.028781332122574169, 0.028731352800035869, 0.028681373405669189, 0.028631393939598630, 0.028581414401950032, 0.028531434792847896, 0.028481455112417176, 0.028431475360782370, -0.028381495538069325, 0.028331515644402536, 0.028281535679906517, 0.028231555644707102, 0.028181575538928798, 0.028131595362696556, 0.028081615116134880, 0.028031634799369608, -0.027981654412525252, 0.027931673955726762, 0.027881693429098641, 0.027831712832766729, 0.027781732166855536, 0.027731751431490013, 0.027681770626794666, 0.027631789752895340, -0.027581808809916536, 0.027531827797983213, 0.027481846717219875, 0.027431865567752362, 0.027381884349705187, 0.027331903063202857, 0.027281921708371216, 0.027231940285334769, -0.027181958794218471, 0.027131977235146831, 0.027081995608245691, 0.027032013913639564, 0.026982032151453401, 0.026932050321811715, 0.026882068424840349, 0.026832086460663811, -0.026782104429407053, 0.026732122331194593, 0.026682140166152273, 0.026632157934404599, 0.026582175636076531, 0.026532193271292581, 0.026482210840178589, 0.026432228342859073, -0.026382245779458541, 0.026332263150102841, 0.026282280454916481, 0.026232297694024419, 0.026182314867551168, 0.026132331975622577, 0.026082349018363156, 0.026032365995897859, -0.025982382908351205, 0.025932399755849038, 0.025882416538515873, 0.025832433256476665, 0.025782449909855929, 0.025732466498779513, 0.025682483023371932, 0.025632499483758141, -0.025582515880062658, 0.025532532212411332, 0.025482548480928673, 0.025432564685739199, 0.025382580826968759, 0.025332596904741864, 0.025282612919183479, 0.025232628870418116, -0.025182644758571626, 0.025132660583768524, 0.025082676346133773, 0.025032692045791883, 0.024982707682868709, 0.024932723257488767, 0.024882738769777014, 0.024832754219857971, -0.024782769607857486, 0.024732784933900080, 0.024682800198110710, 0.024632815400613895, 0.024582830541535483, 0.024532845620999999, 0.024482860639132398, 0.024432875596057203, -0.024382890491900264, 0.024332905326786097, 0.024282920100839222, 0.024232934814185494, 0.024182949466949426, 0.024132964059255985, 0.024082978591229692, 0.024032993062996392, -0.023983007474680611, 0.023933021826407313, 0.023883036118301018, 0.023833050350487574, 0.023783064523091504, 0.023733078636237772, 0.023683092690050901, 0.023633106684656742, -0.023583120620179816, 0.023533134496745090, 0.023483148314477082, 0.023433162073501646, 0.023383175773943308, 0.023333189415926586, 0.023283202999577333, 0.023233216525020074, -0.023183229992379772, 0.023133243401780954, 0.023083256753349466, 0.023033270047209842, 0.022983283283487040, 0.022933296462305585, 0.022883309583791336, 0.022833322648068810, -0.022783335655262978, 0.022733348605498364, 0.022683361498900823, 0.022633374335594876, 0.022583387115705494, 0.022533399839357201, 0.022483412506675852, 0.022433425117785972, -0.022383437672812083, 0.022333450171880046, 0.022283462615114383, 0.022233475002640064, 0.022183487334581614, 0.022133499611064887, 0.022083511832214416, 0.022033523998155162, -0.021983536109011652, 0.021933548164909750, 0.021883560165973974, 0.021833572112329301, 0.021783584004100253, 0.021733595841412687, 0.021683607624391133, 0.021633619353160560, -0.021583631027845492, 0.021533642648571792, 0.021483654215463988, 0.021433665728647047, 0.021383677188245496, 0.021333688594385197, 0.021283699947190676, 0.021233711246786462, -0.021183722493298415, 0.021133733686851060, 0.021083744827569369, 0.021033755915577875, 0.020983766951002434, 0.020933777933967578, 0.020883788864598275, 0.020833799743019056, -0.020783810569355781, 0.020733821343732979, 0.020683832066275627, 0.020633842737108249, 0.020583853356356707, 0.020533863924145534, 0.020483874440599698, 0.020433884905843733, -0.020383895320003502, 0.020333905683203531, 0.020283915995568353, 0.020233926257223825, 0.020183936468294486, 0.020133946628905303, 0.020083956739180810, 0.020033966799246870, -0.019983976809228015, 0.019933986769249214, 0.019883996679435006, 0.019834006539911245, 0.019784016350802472, 0.019734026112233658, 0.019684035824329333, 0.019634045487215365, -0.019584055101016278, 0.019534064665857057, 0.019484074181862231, 0.019434083649157663, 0.019384093067867886, 0.019334102438117430, 0.019284111760032165, 0.019234121033736621, -0.019184130259355770, 0.019134139437014152, 0.019084148566837631, 0.019034157648950736, 0.018984166683478448, 0.018934175670545301, 0.018884184610277157, 0.018834193502798552, -0.018784202348234462, 0.018734211146709423, 0.018684219898349300, 0.018634228603278628, 0.018584237261622383, 0.018534245873505103, 0.018484254439052650, 0.018434262958389562, -0.018384271431640373, 0.018334279858930949, 0.018284288240385825, 0.018234296576129981, 0.018184304866287953, 0.018134313110985605, 0.018084321310347474, 0.018034329464498539, -0.017984337573563339, 0.017934345637667739, 0.017884353656936271, 0.017834361631493923, 0.017784369561465226, 0.017734377446976046, 0.017684385288150927, 0.017634393085114840, -0.017584400837992332, 0.017534408546909262, 0.017484416211990171, 0.017434423833360042, 0.017384431411143406, 0.017334438945466137, 0.017284446436452772, 0.017234453884227844, -0.017184461288917225, 0.017134468650645454, 0.017084475969537515, 0.017034483245717939, 0.016984490479312598, 0.016934497670446032, 0.016884504819243220, 0.016834511925828705, -0.016784518990328352, 0.016734526012866704, 0.016684532993568736, 0.016634539932558996, 0.016584546829963350, 0.016534553685906336, 0.016484560500512935, 0.016434567273907692, -0.016384574006216474, 0.016334580697563824, 0.016284587348074274, 0.016234593957873703, 0.016184600527086642, 0.016134607055838083, 0.016084613544252564, 0.016034619992455954, -0.015984626400572792, 0.015934632768728065, 0.015884639097046314, 0.015834645385653406, 0.015784651634673887, 0.015734657844232738, 0.015684664014454501, 0.015634670145465050, -0.015584676237388920, 0.015534682290351100, 0.015484688304476132, 0.015434694279889886, 0.015384700216716904, 0.015334706115081729, 0.015284711975110232, 0.015234717796926953, -0.015184723580656883, 0.015134729326424557, 0.015084735034355853, 0.015034740704575313, 0.014984746337207918, 0.014934751932378216, 0.014884757490212076, 0.014834763010834045, -0.014784768494369103, 0.014734773940941798, 0.014684779350678002, 0.014634784723702257, 0.014584790060139552, 0.014534795360114426, 0.014484800623752755, 0.014434805851179084, -0.014384811042518398, 0.014334816197895240, 0.014284821317435487, 0.014234826401263679, 0.014184831449504361, 0.014134836462283409, 0.014084841439725366, 0.014034846381955219, -0.013984851289097513, 0.013934856161278122, 0.013884860998621591, 0.013834865801252906, 0.013784870569296614, 0.013734875302878589, 0.013684880002123376, 0.013634884667155962, -0.013584889298100894, 0.013534893895084046, 0.013484898458229963, 0.013434902987663635, 0.013384907483509605, 0.013334911945893750, 0.013284916374940616, 0.013234920770774745, -0.013184925133522018, 0.013134929463306978, 0.013084933760254613, 0.013034938024489471, 0.012984942256137427, 0.012934946455323027, 0.012884950622171262, 0.012834954756806675, -0.012784958859355147, 0.012734962929941222, 0.012684966968689888, 0.012634970975725694, 0.012584974951174515, 0.012534978895160901, 0.012484982807809837, 0.012434986689245874, -0.012384990539594886, 0.012334994358981425, 0.012284998147530032, 0.012235001905366588, 0.012185005632615639, 0.012135009329402176, 0.012085012995850746, 0.012035016632087227, -0.011985020238236168, 0.011935023814422557, 0.011885027360770942, 0.011835030877407202, 0.011785034364455887, 0.011735037822041985, 0.011685041250290044, 0.011635044649325946, -0.011585048019274234, 0.011535051360259903, 0.011485054672407499, 0.011435057955842903, 0.011385061210690661, 0.011335064437075324, 0.011285067635122768, 0.011235070804957545, -0.011185073946704644, 0.011135077060488613, 0.011085080146435333, 0.011035083204669355, 0.010985086235315668, 0.010935089238498820, 0.010885092214344695, 0.010835095162977839, -0.010785098084523244, 0.010735100979105461, 0.010685103846850369, 0.010635106687882517, 0.010585109502326899, 0.010535112290308063, 0.010485115051951890, 0.010435117787382930, -0.010385120496726175, 0.010335123180106175, 0.010285125837648811, 0.010235128469478633, 0.010185131075720189, 0.010135133656499361, 0.010085136211940699, 0.010035138742169197, -0.009985141247309405, 0.009935143727487203, 0.009885146182827142, 0.009835148613454215, 0.009785151019492972, 0.009735153401069296, 0.009685155758307737, 0.009635158091333288, -0.009585160400270500, 0.009535162685245254, 0.009485164946382102, 0.009435167183806039, 0.009385169397641613, 0.009335171588014706, 0.009285173755049872, 0.009235175898871659, -0.009185178019605951, 0.009135180117377297, 0.009085182192310694, 0.009035184244530689, 0.008985186274163171, 0.008935188281332685, 0.008885190266164227, 0.008835192228782351, -0.008785194169312938, 0.008735196087880540, 0.008685197984610153, 0.008635199859626325, 0.008585201713054942, 0.008535203545020555, 0.008485205355648159, 0.008435207145062306, -0.008385208913388878, 0.008335210660752429, 0.008285212387277509, 0.008235214093090002, 0.008185215778314459, 0.008135217443075878, 0.008085219087498808, 0.008035220711709135, -0.007985222315831410, 0.007935223899990629, 0.007885225464311346, 0.007835227008919440, 0.007785228533939469, 0.007735230039496426, 0.007685231525714864, 0.007635232992720667, -0.007585234440638388, 0.007535235869593022, 0.007485237279709124, 0.007435238671112575, 0.007385240043927930, 0.007335241398280185, 0.007285242734293892, 0.007235244052094937, -0.007185245351807872, 0.007135246633557249, 0.007085247897468953, 0.007035249143667537, 0.006985250372277999, 0.006935251583424892, 0.006885252777234099, 0.006835253953830174, -0.006785255113338114, 0.006735256255882473, 0.006685257381589134, 0.006635258490582652, 0.006585259582988025, 0.006535260658929804, 0.006485261718533876, 0.006435262761924793, -0.006385263789227553, 0.006335264800566710, 0.006285265796068149, 0.006235266775856423, 0.006185267740056086, 0.006135268688793025, 0.006085269622191791, 0.006035270540377383, -0.005985271443474355, 0.005935272331608592, 0.005885273204904649, 0.005835274063487523, 0.005785274907481767, 0.005735275737013268, 0.005685276552206580, 0.005635277353186701, -0.005585278140078183, 0.005535278913006915, 0.005485279672097450, 0.005435280417474785, 0.005385281149263474, 0.005335281867589406, 0.005285282572577133, 0.005235283264351209, -0.005185283943037521, 0.005135284608760623, 0.005085285261645514, 0.005035285901816748, 0.004985286529400210, 0.004935287144520456, 0.004885287747302485, 0.004835288337870850, -0.004785288916351439, 0.004735289482868805, 0.004685290037547947, 0.004635290580513421, 0.004585291111891111, 0.004535291631805574, 0.004485292140381809, 0.004435292637744368, -0.004385293124019140, 0.004335293599330679, 0.004285294063803541, 0.004235294517563611, 0.004185294960735444, 0.004135295393444041, 0.004085295815813955, 0.004035296227971073, -0.003985296630039951, 0.003935297022145587, 0.003885297404412537, 0.003835297776966687, 0.003785298139932593, 0.003735298493435253, 0.003685298837599223, 0.003635299172550391, -0.003585299498413309, 0.003535299815312980, 0.003485300123373957, 0.003435300422722127, 0.003385300713482047, 0.003335300995778715, 0.003285301269736686, 0.003235301535481848, -0.003185301793138756, 0.003135302042831966, 0.003085302284687364, 0.003035302518829507, 0.002985302745383394, 0.002935302964473579, 0.002885303176225952, 0.002835303380765067, -0.002785303578215922, 0.002735303768703075, 0.002685303952352413, 0.002635304129288491, 0.002585304299636308, 0.002535304463520421, 0.002485304621066716, 0.002435304772399750, -0.002385304917644522, 0.002335305056925588, 0.002285305190368835, 0.002235305318098819, 0.002185305440240096, 0.002135305556918553, 0.002085305668258747, 0.002035305774385676, -0.001985305875423896, 0.001935305971499296, 0.001885306062736431, 0.001835306149260301, 0.001785306231195462, 0.001735306308667801, 0.001685306381801874, 0.001635306450722681, -0.001585306515554778, 0.001535306576424053, 0.001485306633455062, 0.001435306686772804, 0.001385306736501835, 0.001335306782768043, 0.001285306825695984, 0.001235306865410214, -0.001185306902036622, 0.001135306935699761, 0.001085306966524634, 0.001035306994635795, 0.000985307020159133, 0.000935307043219203, 0.000885307063941005, 0.000835307082449096, -0.000785307098869363, 0.000735307113326362, 0.000685307125945094, 0.000635307136850113, 0.000585307146167309, 0.000535307154021237, 0.000485307160536898, 0.000435307165838846, -0.000385307170052970, 0.000335307173303827, 0.000285307175716415, 0.000235307177415291, 0.000185307178526344, 0.000135307179174129, 0.000085307179483201, 0.000035307179579450, --0.000014692820412569, -0.000064692820367856, -0.000114692820161855, -0.000164692819668678, -0.000214692818763769, -0.000264692817322128, -0.000314692815219199, -0.000364692812329094, --0.000414692808527257, -0.000464692803688688, -0.000514692797688831, -0.000564692790401798, -0.000614692781703032, -0.000664692771467535, -0.000714692759570750, -0.000764692745886789, --0.000814692730291096, -0.000864692712659116, -0.000914692692864960, -0.000964692670784071, -0.001014692646291452, -0.001064692619262544, -0.001114692589571461, -0.001164692557093647, --0.001214692521704101, -0.001264692483278268, -0.001314692441690259, -0.001364692396815520, -0.001414692348529050, -0.001464692296706292, -0.001514692241221360, -0.001564692181949697, --0.001614692118766304, -0.001664692051546625, -0.001714691980164771, -0.001764691904496188, -0.001814691824416319, -0.001864691739799276, -0.001914691650520504, -0.001964691556455003, --0.002014691457478216, -0.002064691353464257, -0.002114691244288570, -0.002164691129826155, -0.002214691009952456, -0.002264690884541585, -0.002314690753468987, -0.002364690616609663, --0.002414690473839055, -0.002464690325031278, -0.002514690170061775, -0.002564690008805546, -0.002614689841138036, -0.002664689666933358, -0.002714689486066956, -0.002764689298414273, --0.002814689103849424, -0.002864688902247852, -0.002914688693484557, -0.002964688477434985, -0.003014688253973248, -0.003064688022974790, -0.003114687784314611, -0.003164687537868158, --0.003214687283509542, -0.003264687021114207, -0.003314686750557155, -0.003364686471713830, -0.003414686184458345, -0.003464685888666144, -0.003514685584212229, -0.003564685270972043, --0.003614684948819701, -0.003664684617630646, -0.003714684277279879, -0.003764683927642846, -0.003814683568593659, -0.003864683200007764, -0.003914682821760604, -0.003964682433726293, --0.004014682035780276, -0.004064681627797554, -0.004114681209653572, -0.004164680781222442, -0.004214680342379612, -0.004264679893000080, -0.004314679432959292, -0.004364678962131362, --0.004414678480391734, -0.004464677987615410, -0.004514677483677836, -0.004564676968453123, -0.004614676441816718, -0.004664675903643622, -0.004714675353809280, -0.004764674792187806, --0.004814674218654644, -0.004864673633085242, -0.004914673035353711, -0.004964672425335498, -0.005014671802905603, -0.005064671167939473, -0.005114670520311221, -0.005164669859896293, --0.005214669186569690, -0.005264668500206859, -0.005314667800681912, -0.005364667087870295, -0.005414666361647010, -0.005464665621887505, -0.005514664868465890, -0.005564664101257614, --0.005614663320137677, -0.005664662524981526, -0.005714661715663275, -0.005764660892058370, -0.005814660054042256, -0.005864659201489048, -0.005914658334274192, -0.005964657452272691, --0.006014656555359989, -0.006064655643410202, -0.006114654716298777, -0.006164653773900714, -0.006214652816091461, -0.006264651842745132, -0.006314650853737174, -0.006364649848942587, --0.006414648828236821, -0.006464647791493989, -0.006514646738589537, -0.006564645669398468, -0.006614644583796229, -0.006664643481656934, -0.006714642362856032, -0.006764641227268523, --0.006814640074769854, -0.006864638905234142, -0.006914637718536832, -0.006964636514553373, -0.007014635293157877, -0.007064634054225794, -0.007114632797632125, -0.007164631523252319, --0.007214630230960490, -0.007264628920632085, -0.007314627592142108, -0.007364626245366005, -0.007414624880177894, -0.007464623496453220, -0.007514622094066987, -0.007564620672894643, --0.007614619232810304, -0.007664617773689416, -0.007714616295406984, -0.007764614797838455, -0.007814613280857946, -0.007864611744340902, -0.007914610188162774, -0.007964608612197676, --0.008014607016321057, -0.008064605400407919, -0.008114603764333714, -0.008164602107972555, -0.008214600431199889, -0.008264598733890722, -0.008314597015920503, -0.008364595277163349, --0.008414593517494705, -0.008464591736789576, -0.008514589934923414, -0.008564588111770332, -0.008614586267205781, -0.008664584401104764, -0.008714582513342728, -0.008764580603793794, --0.008814578672333408, -0.008864576718837018, -0.008914574743178742, -0.008964572745234031, -0.009014570724877888, -0.009064568681985762, -0.009114566616431770, -0.009164564528091361, --0.009214562416839541, -0.009264560282551760, -0.009314558125102132, -0.009364555944366110, -0.009414553740218698, -0.009464551512535346, -0.009514549261190171, -0.009564546986058624, --0.009614544687015707, -0.009664542363936874, -0.009714540016696241, -0.009764537645169259, -0.009814535249231374, -0.009864532828756710, -0.009914530383620711, -0.009964527913698389, --0.010014525418865189, -0.010064522898995232, -0.010114520353963968, -0.010164517783646403, -0.010214515187917989, -0.010264512566652841, -0.010314509919726413, -0.010364507247013708, --0.010414504548390180, -0.010464501823729948, -0.010514499072908461, -0.010564496295800726, -0.010614493492282193, -0.010664490662226984, -0.010714487805510547, -0.010764484922007891, --0.010814482011594467, -0.010864479074144394, -0.010914476109533123, -0.010964473117636106, -0.011014470098327463, -0.011064467051482643, -0.011114463976976656, -0.011164460874684954, --0.011214457744481654, -0.011264454586242211, -0.011314451399841632, -0.011364448185155368, -0.011414444942057539, -0.011464441670423597, -0.011514438370128553, -0.011564435041047856, --0.011614431683055627, -0.011664428296027318, -0.011714424879837940, -0.011764421434362944, -0.011814417959476449, -0.011864414455053910, -0.011914410920970779, -0.011964407357101177, --0.012014403763320554, -0.012064400139503923, -0.012114396485526738, -0.012164392801263114, -0.012214389086588512, -0.012264385341377934, -0.012314381565506839, -0.012364377758849344, --0.012414373921280905, -0.012464370052676532, -0.012514366152911679, -0.012564362221860465, -0.012614358259398346, -0.012664354265400331, -0.012714350239741875, -0.012764346182297099, --0.012814342092941456, -0.012864337971550404, -0.012914333817998062, -0.012964329632159885, -0.013014325413910885, -0.013064321163126516, -0.013114316879680898, -0.013164312563449489, --0.013214308214307299, -0.013264303832129782, -0.013314299416791062, -0.013364294968166593, -0.013414290486131386, -0.013464285970560898, -0.013514281421329251, -0.013564276838311899, --0.013614272221383856, -0.013664267570420576, -0.013714262885296183, -0.013764258165886134, -0.013814253412065438, -0.013864248623709554, -0.013914243800692604, -0.013964238942890044, --0.014014234050177330, -0.014064229122428587, -0.014114224159519273, -0.014164219161324397, -0.014214214127719418, -0.014264209058578460, -0.014314203953776979, -0.014364198813189987, --0.014414193636692942, -0.014464188424159970, -0.014514183175466527, -0.014564177890487626, -0.014614172569098723, -0.014664167211173945, -0.014714161816588750, -0.014764156385218151, --0.014814150916937604, -0.014864145411621236, -0.014914139869144503, -0.014964134289382865, -0.015014128672210449, -0.015064123017502710, -0.015114117325134664, -0.015164111594981768, --0.015214105826918149, -0.015264100020819266, -0.015314094176560133, -0.015364088294016209, -0.015414082373061619, -0.015464076413571823, -0.015514070415421837, -0.015564064378487119, --0.015614058302641795, -0.015664052187761325, -0.015714046033720726, -0.015764039840395455, -0.015814033607659643, -0.015864027335388744, -0.015914021023458222, -0.015964014671742202, --0.016014008280116145, -0.016064001848455071, -0.016113995376634434, -0.016163988864528363, -0.016213982312012321, -0.016263975718961324, -0.016313969085250832, -0.016363962410754971, --0.016413955695349206, -0.016463948938908551, -0.016513942141308469, -0.016563935302423088, -0.016613928422127867, -0.016663921500297826, -0.016713914536808424, -0.016763907531533791, --0.016813900484349390, -0.016863893395130239, -0.016913886263751798, -0.016963879090088198, -0.017013871874014899, -0.017063864615407365, -0.017113857314139724, -0.017163849970087443, --0.017213842583125534, -0.017263835153129462, -0.017313827679973359, -0.017363820163532689, -0.017413812603682466, -0.017463805000298160, -0.017513797353253893, -0.017563789662425132, --0.017613781927686898, -0.017663774148914655, -0.017713766325982531, -0.017763758458765991, -0.017813750547140055, -0.017863742590980190, -0.017913734590160522, -0.017963726544556517, --0.018013718454043638, -0.018063710318496021, -0.018113702137789130, -0.018163693911797979, -0.018213685640398040, -0.018263677323463443, -0.018313668960869653, -0.018363660552491688, --0.018413652098205020, -0.018463643597883776, -0.018513635051403420, -0.018563626458638981, -0.018613617819465918, -0.018663609133758367, -0.018713600401391792, -0.018763591622241213, --0.018813582796182105, -0.018863573923088593, -0.018913565002836145, -0.018963556035300231, -0.019013547020354980, -0.019063537957875864, -0.019113528847737902, -0.019163519689816565, --0.019213510483985979, -0.019263501230121622, -0.019313491928098510, -0.019363482577792111, -0.019413473179076563, -0.019463463731827332, -0.019513454235919443, -0.019563444691228359, --0.019613435097628223, -0.019663425454994495, -0.019713415763202208, -0.019763406022126822, -0.019813396231642480, -0.019863386391624643, -0.019913376501948788, -0.019963366562489048, --0.020013356573120887, -0.020063346533719339, -0.020113336444159868, -0.020163326304316612, -0.020213316114065037, -0.020263305873280176, -0.020313295581837493, -0.020363285239611124, --0.020413274846476547, -0.020463264402308778, -0.020513253906983296, -0.020563243360374236, -0.020613232762357065, -0.020663222112806811, -0.020713211411598948, -0.020763200658607612, --0.020813189853708274, -0.020863178996775960, -0.020913168087686142, -0.020963157126312963, -0.021013146112531890, -0.021063135046218397, -0.021113123927246621, -0.021163112755492035, --0.021213101530829667, -0.021263090253134991, -0.021313078922282142, -0.021363067538146596, -0.021413056100603383, -0.021463044609527974, -0.021513033064794511, -0.021563021466278462, --0.021613009813854861, -0.021662998107399179, -0.021712986346785559, -0.021762974531889471, -0.021812962662585946, -0.021862950738750463, -0.021912938760257156, -0.021962926726981500, --0.022012914638798974, -0.022062902495583719, -0.022112890297211203, -0.022162878043556464, -0.022212865734494977, -0.022262853369900876, -0.022312840949649644, -0.022362828473616311, --0.022412815941676351, -0.022462803353703903, -0.022512790709574453, -0.022562778009163020, -0.022612765252345089, -0.022662752438994800, -0.022712739568987630, -0.022762726642198614, --0.022812713658503223, -0.022862700617775601, -0.022912687519891232, -0.022962674364725585, -0.023012661152152811, -0.023062647882048381, -0.023112634554287335, -0.023162621168745144, --0.023212607725295958, -0.023262594223815249, -0.023312580664178059, -0.023362567046259858, -0.023412553369934797, -0.023462539635078352, -0.023512525841565560, -0.023562511989271895, --0.023612498078071507, -0.023662484107839873, -0.023712470078452029, -0.023762455989783451, -0.023812441841708294, -0.023862427634102030, -0.023912413366839698, -0.023962399039796776, --0.024012384652847413, -0.024062370205867087, -0.024112355698731280, -0.024162341131314140, -0.024212326503491147, -0.024262311815137338, -0.024312297066128193, -0.024362282256337863, --0.024412267385641825, -0.024462252453915121, -0.024512237461033228, -0.024562222406870299, -0.024612207291301813, -0.024662192114202806, -0.024712176875448768, -0.024762161574913840, --0.024812146212473508, -0.024862130788002812, -0.024912115301377234, -0.024962099752470924, -0.025012084141159362, -0.025062068467318035, -0.025112052730821094, -0.025162036931544018, --0.025212021069361851, -0.025262005144150078, -0.025311989155782845, -0.025361973104135641, -0.025411956989083502, -0.025461940810501918, -0.025511924568265034, -0.025561908262248342, --0.025611891892326877, -0.025661875458376129, -0.025711858960270246, -0.025761842397884715, -0.025811825771094581, -0.025861809079775325, -0.025911792323801100, -0.025961775503047398, --0.026011758617389698, -0.026061741666702158, -0.026111724650860268, -0.026161707569739061, -0.026211690423214033, -0.026261673211159332, -0.026311655933450449, -0.026361638589962429, --0.026411621180570753, -0.026461603705149581, -0.026511586163574401, -0.026561568555720252, -0.026611550881462630, -0.026661533140675684, -0.026711515333234907, -0.026761497459015342, --0.026811479517892475, -0.026861461509740465, -0.026911443434434804, -0.026961425291850975, -0.027011407081863142, -0.027061388804346789, -0.027111370459176967, -0.027161352046229159, --0.027211333565377530, -0.027261315016497565, -0.027311296399464315, -0.027361277714153264, -0.027411258960438580, -0.027461240138195744, -0.027511221247299811, -0.027561202287626266, --0.027611183259049273, -0.027661164161444322, -0.027711144994686462, -0.027761125758651181, -0.027811106453212640, -0.027861087078246336, -0.027911067633627315, -0.027961048119231065, --0.028011028534931755, -0.028061008880604872, -0.028110989156125910, -0.028160969361369033, -0.028210949496209729, -0.028260929560523056, -0.028310909554184499, -0.028360889477068225, --0.028410869329049730, -0.028460849110004058, -0.028510828819806711, -0.028560808458331845, -0.028610788025454959, -0.028660767521051102, -0.028710746944995771, -0.028760726297163131, --0.028810705577428673, -0.028860684785667449, -0.028910663921754960, -0.028960642985565367, -0.029010621976974165, -0.029060600895856853, -0.029110579742087594, -0.029160558515541887, --0.029210537216094783, -0.029260515843621781, -0.029310494397997044, -0.029360472879096072, -0.029410451286793919, -0.029460429620966080, -0.029510407881486723, -0.029560386068231345, --0.029610364181075002, -0.029660342219893197, -0.029710320184560088, -0.029760298074951178, -0.029810275890941526, -0.029860253632406627, -0.029910231299220651, -0.029960208891259096, --0.030010186408397463, -0.030060163850509917, -0.030110141217471964, -0.030160118509158659, -0.030210095725445502, -0.030260072866206657, -0.030310049931317636, -0.030360026920653486, --0.030410003834089715, -0.030459980671500488, -0.030509957432761310, -0.030559934117747239, -0.030609910726333778, -0.030659887258395097, -0.030709863713806695, -0.030759840092443636, --0.030809816394181417, -0.030859792618894218, -0.030909768766457534, -0.030959744836746430, -0.031009720829636406, -0.031059696745001638, -0.031109672582717626, -0.031159648342659878, --0.031209624024702565, -0.031259599628721192, -0.031309575154590819, -0.031359550602186953, -0.031409525971383766, -0.031459501262056766, -0.031509476474081012, -0.031559451607332006, --0.031609426661683933, -0.031659401637012294, -0.031709376533192148, -0.031759351350099004, -0.031809326087607039, -0.031859300745591762, -0.031909275323928225, -0.031959249822491952, --0.032009224241157104, -0.032059198579799199, -0.032109172838293738, -0.032159147016514907, -0.032209121114338206, -0.032259095131638701, -0.032309069068291903, -0.032359042924171987, --0.032409016699154469, -0.032458990393114402, -0.032508964005927309, -0.032558937537467358, -0.032608910987610061, -0.032658884356230489, -0.032708857643204151, -0.032758830848405224, --0.032808803971709224, -0.032858777012991211, -0.032908749972126700, -0.032958722848989867, -0.033008695643456230, -0.033058668355401298, -0.033108640984699247, -0.033158613531225602, --0.033208585994855419, -0.033258558375464209, -0.033308530672926169, -0.033358502887116795, -0.033408475017911166, -0.033458447065184797, -0.033508419028811860, -0.033558390908667877, --0.033608362704627921, -0.033658334416567501, -0.033708306044360800, -0.033758277587883329, -0.033808249047010172, -0.033858220421616833, -0.033908191711577496, -0.033958162916767683, --0.034008134037062911, -0.034058105072337350, -0.034108076022466537, -0.034158046887325523, -0.034208017666789846, -0.034257988360733675, -0.034307958969032534, -0.034357929491561495, --0.034407899928196074, -0.034457870278810462, -0.034507840543280176, -0.034557810721480287, -0.034607780813286318, -0.034657750818572454, -0.034707720737214204, -0.034757690569086661, --0.034807660314065333, -0.034857629972024406, -0.034907599542839410, -0.034957569026385416, -0.035007538422537940, -0.035057507731171174, -0.035107476952160634, -0.035157446085381849, --0.035207415130709012, -0.035257384088017631, -0.035307352957182792, -0.035357321738080011, -0.035407290430583480, -0.035457259034568728, -0.035507227549910828, -0.035557195976485302, --0.035607164314166342, -0.035657132562829472, -0.035707100722349769, -0.035757068792602757, -0.035807036773462635, -0.035857004664804917, -0.035906972466504691, -0.035956940178437473, --0.036006907800477460, -0.036056875332500182, -0.036106842774381157, -0.036156810125994580, -0.036206777387215977, -0.036256744557920433, -0.036306711637983477, -0.036356678627279287, --0.036406645525683408, -0.036456612333070910, -0.036506579049317332, -0.036556545674296857, -0.036606512207885022, -0.036656478649956900, -0.036706445000388034, -0.036756411259052602, --0.036806377425826146, -0.036856343500583748, -0.036906309483200936, -0.036956275373551908, -0.037006241171512189, -0.037056206876957307, -0.037106172489761467, -0.037156138009800194, --0.037206103436948579, -0.037256068771082153, -0.037306034012075107, -0.037355999159802970, -0.037405964214140844, -0.037455929174964243, -0.037505894042147381, -0.037555858815565786, --0.037605823495094538, -0.037655788080609182, -0.037705752571983907, -0.037755716969094251, -0.037805681271815307, -0.037855645480022598, -0.037905609593590336, -0.037955573612394045, --0.038005537536308823, -0.038055501365210201, -0.038105465098972384, -0.038155428737470895, -0.038205392280581285, -0.038255355728177752, -0.038305319080135826, -0.038355282336330607, --0.038405245496637624, -0.038455208560931084, -0.038505171529086522, -0.038555134400979026, -0.038605097176484145, -0.038655059855476070, -0.038705022437830354, -0.038754984923422074, --0.038804947312126782, -0.038854909603818676, -0.038904871798373299, -0.038954833895665737, -0.039004795895571535, -0.039054757797964898, -0.039104719602721369, -0.039154681309716485, --0.039204642918824452, -0.039254604429920813, -0.039304565842880668, -0.039354527157579547, -0.039404488373891662, -0.039454449491692564, -0.039504410510857332, -0.039554371431261524, --0.039604332252779345, -0.039654292975286332, -0.039704253598657584, -0.039754214122768652, -0.039804174547493736, -0.039854134872708391, -0.039904095098287698, -0.039954055224107221, --0.040004015250041158, -0.040053975175965054, -0.040103935001754458, -0.040153894727283583, -0.040203854352427973, -0.040253813877062720, -0.040303773301063384, -0.040353732624304160, --0.040403691846660615, -0.040453650968007834, -0.040503609988221376, -0.040553568907175444, -0.040603527724745590, -0.040653486440806921, -0.040703445055234974, -0.040753403567903974, --0.040803361978689466, -0.040853320287466549, -0.040903278494110774, -0.040953236598496368, -0.041003194600498866, -0.041053152499993820, -0.041103110296855448, -0.041153067990959302, --0.041203025582180482, -0.041252983070394544, -0.041302940455475709, -0.041352897737299520, -0.041402854915741083, -0.041452811990675957, -0.041502768961978360, -0.041552725829523837, --0.041602682593187494, -0.041652639252844896, -0.041702595808370255, -0.041752552259639121, -0.041802508606526609, -0.041852464848908269, -0.041902420986658327, -0.041952377019652327, --0.042002332947765383, -0.042052288770873053, -0.042102244488849562, -0.042152200101570454, -0.042202155608911295, -0.042252111010746295, -0.042302066306951019, -0.042352021497400583, --0.042401976581970535, -0.042451931560535103, -0.042501886432969836, -0.042551841199149856, -0.042601795858950721, -0.042651750412246649, -0.042701704858913204, -0.042751659198825495, --0.042801613431859079, -0.042851567557888187, -0.042901521576788379, -0.042951475488434761, -0.043001429292702904, -0.043051382989467028, -0.043101336578602698, -0.043151290059985463, --0.043201243433489564, -0.043251196698990552, -0.043301149856363554, -0.043351102905484121, -0.043401055846226493, -0.043451008678466220, -0.043500961402078424, -0.043550914016938676, --0.043600866522921194, -0.043650818919901545, -0.043700771207754847, -0.043750723386356667, -0.043800675455581237, -0.043850627415304114, -0.043900579265400426, -0.043950531005745731, --0.044000482636214269, -0.044050434156681598, -0.044100385567023288, -0.044150336867113567, -0.044200288056828005, -0.044250239136041723, -0.044300190104630280, -0.044350140962467928, --0.044400091709430219, -0.044450042345392279, -0.044499992870229682, -0.044549943283816659, -0.044599893586028776, -0.044649843776741159, -0.044699793855829374, -0.044749743823167661, --0.044799693678631590, -0.044849643422096283, -0.044899593053437312, -0.044949542572528915, -0.044999491979246665, -0.045049441273465683, -0.045099390455061540, -0.045149339523908476, --0.045199288479882069, -0.045249237322857877, -0.045299186052710154, -0.045349134669314464, -0.045399083172545936, -0.045449031562280147, -0.045498979838391330, -0.045548928000755072, --0.045598876049246485, -0.045648823983741156, -0.045698771804113324, -0.045748719510238560, -0.045798667101991999, -0.045848614579249214, -0.045898561941884450, -0.045948509189773279, --0.045998456322790836, -0.046048403340812692, -0.046098350243713102, -0.046148297031367629, -0.046198243703651866, -0.046248190260440046, -0.046298136701607748, -0.046348083027030113, --0.046398029236582712, -0.046447975330139793, -0.046497921307576934, -0.046547867168769276, -0.046597812913592392, -0.046647758541920534, -0.046697704053629274, -0.046747649448593762, --0.046797594726689568, -0.046847539887790939, -0.046897484931773460, -0.046947429858512274, -0.046997374667882952, -0.047047319359759754, -0.047097263934018259, -0.047147208390534039, --0.047197152729181360, -0.047247096949835803, -0.047297041052372500, -0.047346985036667039, -0.047396928902593671, -0.047446872650027977, -0.047496816278845104, -0.047546759788920638, --0.047596703180128826, -0.047646646452345252, -0.047696589605445067, -0.047746532639303854, -0.047796475553795861, -0.047846418348796681, -0.047896361024181454, -0.047946303579825766, --0.047996246015603879, -0.048046188331391376, -0.048096130527063845, -0.048146072602495545, -0.048196014557562068, -0.048245956392138550, -0.048295898106100583, -0.048345839699322428, --0.048395781171679676, -0.048445722523047470, -0.048495663753301402, -0.048545604862315725, -0.048595545849966046, -0.048645486716127492, -0.048695427460675671, -0.048745368083484841, --0.048795308584430583, -0.048845248963388058, -0.048895189220232858, -0.048945129354839231, -0.048995069367082790, -0.049045009256838669, -0.049094949023982475, -0.049144888668388460, --0.049194828189932226, -0.049244767588489363, -0.049294706863934140, -0.049344646016142149, -0.049394585044988538, -0.049444523950348915, -0.049494462732097538, -0.049544401390110002, --0.049594339924261460, -0.049644278334427513, -0.049694216620482429, -0.049744154782301805, -0.049794092819760792, -0.049844030732734988, -0.049893968521098668, -0.049943906184727424, --0.049993843723496419, -0.050043781137281237, -0.050093718425956169, -0.050143655589396804, -0.050193592627478738, -0.050243529540076250, -0.050293466327064940, -0.050343402988319963, --0.050393339523716926, -0.050443275933130090, -0.050493212216435067, -0.050543148373507013, -0.050593084404221535, -0.050643020308452899, -0.050692956086076713, -0.050742891736968131, --0.050792827261002774, -0.050842762658054895, -0.050892697928000115, -0.050942633070713589, -0.050992568086070930, -0.051042502973946399, -0.051092437734215616, -0.051142372366754174, --0.051192306871436367, -0.051242241248137789, -0.051292175496733608, -0.051342109617099431, -0.051392043609109539, -0.051441977472639532, -0.051491911207564592, -0.051541844813760306, --0.051591778291100975, -0.051641711639462191, -0.051691644858719125, -0.051741577948747397, -0.051791510909421280, -0.051841443740616382, -0.051891376442207877, -0.051941309014071381, --0.051991241456081159, -0.052041173768112840, -0.052091105950041579, -0.052141038001743002, -0.052190969923091385, -0.052240901713962347, -0.052290833374231495, -0.052340764903773117, --0.052390696302462826, -0.052440627570175792, -0.052490558706787635, -0.052540489712172643, -0.052590420586206416, -0.052640351328764143, -0.052690281939721438, -0.052740212418952583, --0.052790142766333197, -0.052840072981738449, -0.052890003065043968, -0.052939933016124034, -0.052989862834854268, -0.053039792521109845, -0.053089722074766380, -0.053139651495698173, --0.053189580783780832, -0.053239509938889984, -0.053289438960899924, -0.053339367849686257, -0.053389296605124176, -0.053439225227089299, -0.053489153715455907, -0.053539082070099636, --0.053589010290895661, -0.053638938377719603, -0.053688866330445756, -0.053738794148949741, -0.053788721833106741, -0.053838649382792383, -0.053888576797880956, -0.053938504078248087, --0.053988431223768958, -0.054038358234319191, -0.054088285109773093, -0.054138211850006272, -0.054188138454894376, -0.054238064924311685, -0.054287991258133828, -0.054337917456236000, --0.054387843518493816, -0.054437769444781584, -0.054487695234974924, -0.054537620888949027, -0.054587546406579521, -0.054637471787740713, -0.054687397032308217, -0.054737322140157231, --0.054787247111163381, -0.054837171945200977, -0.054887096642145639, -0.054937021201872556, -0.054986945624257363, -0.055036869909174370, -0.055086794056499196, -0.055136718066107482, --0.055186641937873530, -0.055236565671672976, -0.055286489267381000, -0.055336412724873253, -0.055386336044024022, -0.055436259224708954, -0.055486182266803241, -0.055536105170182516, --0.055586027934721081, -0.055635950560294578, -0.055685873046778203, -0.055735795394047584, -0.055785717601977036, -0.055835639670442187, -0.055885561599318248, -0.055935483388480846, --0.055985405037804289, -0.056035326547164220, -0.056085247916435835, -0.056135169145494775, -0.056185090234215349, -0.056235011182473198, -0.056284931990143956, -0.056334852657101947, --0.056384773183222804, -0.056434693568381732, -0.056484613812454364, -0.056534533915315023, -0.056584453876839344, -0.056634373696902530, -0.056684293375380224, -0.056734212912146746, --0.056784132307077732, -0.056834051560048386, -0.056883970670934363, -0.056933889639609964, -0.056983808465950837, -0.057033727149832195, -0.057083645691129677, -0.057133564089717599, --0.057183482345471610, -0.057233400458267365, -0.057283318427979173, -0.057333236254482681, -0.057383153937653100, -0.057433071477366079, -0.057482988873495934, -0.057532906125918319, --0.057582823234508439, -0.057632740199141941, -0.057682657019693155, -0.057732573696037723, -0.057782490228050855, -0.057832406615608206, -0.057882322858584100, -0.057932238956854183, --0.057982154910293668, -0.058032070718778216, -0.058081986382182135, -0.058131901900381096, -0.058181817273250738, -0.058231732500665399, -0.058281647582500727, -0.058331562518631939, --0.058381477308934684, -0.058431391953283292, -0.058481306451553423, -0.058531220803620290, -0.058581135009359540, -0.058631049068645517, -0.058680962981353869, -0.058730876747359814, --0.058780790366539007, -0.058830703838765784, -0.058880617163915801, -0.058930530341864275, -0.058980443372486868, -0.059030356255657911, -0.059080268991253057, -0.059130181579147532, --0.059180094019216999, -0.059230006311335792, -0.059279918455379561, -0.059329830451223982, -0.059379742298743383, -0.059429653997813428, -0.059479565548309334, -0.059529476950106776, --0.059579388203080078, -0.059629299307104908, -0.059679210262056491, -0.059729121067810496, -0.059779031724241254, -0.059828942231224432, -0.059878852588635248, -0.059928762796349386, --0.059978672854241168, -0.060028582762186269, -0.060078492520059909, -0.060128402127737769, -0.060178311585094173, -0.060228220892004802, -0.060278130048345320, -0.060328039053990076, --0.060377947908814726, -0.060427856612694508, -0.060477765165505099, -0.060527673567120827, -0.060577581817417368, -0.060627489916269962, -0.060677397863554271, -0.060727305659144644, --0.060777213302916751, -0.060827120794745823, -0.060877028134507544, -0.060926935322076242, -0.060976842357327608, -0.061026749240136867, -0.061076655970379694, -0.061126562547930439, --0.061176468972664780, -0.061226375244458384, -0.061276281363185615, -0.061326187328722137, -0.061376093140943194, -0.061425998799724463, -0.061475904304940286, -0.061525809656466354, --0.061575714854177899, -0.061625619897950595, -0.061675524787658802, -0.061725429523178194, -0.061775334104384010, -0.061825238531151940, -0.061875142803356327, -0.061925046920872862, --0.061974950883576775, -0.062024854691343750, -0.062074758344048152, -0.062124661841565655, -0.062174565183771950, -0.062224468370541387, -0.062274371401749649, -0.062324274277271989, --0.062374176996984082, -0.062424079560760293, -0.062473981968476297, -0.062523884220007361, -0.062573786315229141, -0.062623688254016027, -0.062673590036243676, -0.062723491661787367, --0.062773393130522756, -0.062823294442324235, -0.062873195597067472, -0.062923096594627720, -0.062972997434880662, -0.063022898117700676, -0.063072798642963432, -0.063122699010544209, --0.063172599220318676, -0.063222499272161198, -0.063272399165947471, -0.063322298901553192, -0.063372198478852726, -0.063422097897721755, -0.063471997158035545, -0.063521896259669794, --0.063571795202498851, -0.063621693986398414, -0.063671592611243749, -0.063721491076910539, -0.063771389383273161, -0.063821287530207313, -0.063871185517588247, -0.063921083345291660, --0.063970981013191916, -0.064020878521164726, -0.064070775869085342, -0.064120673056829447, -0.064170570084271447, -0.064220466951287011, -0.064270363657751850, -0.064320260203540328, --0.064370156588528168, -0.064420052812590611, -0.064469948875603367, -0.064519844777440813, -0.064569740517978647, -0.064619636097092120, -0.064669531514656958, -0.064719426770547511, --0.064769321864639504, -0.064819216796808188, -0.064869111566929274, -0.064919006174877142, -0.064968900620527500, -0.065018794903755603, -0.065068689024437160, -0.065118582982446549, --0.065168476777659481, -0.065218370409951654, -0.065268263879197472, -0.065318157185272632, -0.065368050328052388, -0.065417943307412477, -0.065467836123227249, -0.065517728775372430, --0.065567621263723300, -0.065617513588155554, -0.065667405748543586, -0.065717297744763106, -0.065767189576689367, -0.065817081244198106, -0.065866972747163702, -0.065916864085461865, --0.065966755258967863, -0.066016646267557419, -0.066066537111104925, -0.066116427789486079, -0.066166318302576160, -0.066216208650250893, -0.066266098832384657, -0.066315988848853188, --0.066365878699532171, -0.066415768384296026, -0.066465657903020461, -0.066515547255580745, -0.066565436441852602, -0.066615325461710437, -0.066665214315029947, -0.066715103001686427, --0.066764991521555586, -0.066814879874511832, -0.066864768060430874, -0.066914656079187992, -0.066964543930658912, -0.067014431614718040, -0.067064319131241085, -0.067114206480103328, --0.067164093661180507, -0.067213980674347001, -0.067263867519478535, -0.067313754196450859, -0.067363640705138353, -0.067413527045416727, -0.067463413217161303, -0.067513299220247777, --0.067563185054550570, -0.067613070719945392, -0.067662956216307552, -0.067712841543512745, -0.067762726701435405, -0.067812611689951244, -0.067862496508935555, -0.067912381158264062, --0.067962265637811173, -0.068012149947452624, -0.068062034087063711, -0.068111918056520143, -0.068161801855696341, -0.068211685484468029, -0.068261568942710946, -0.068311452230299496, --0.068361335347109420, -0.068411218293016010, -0.068461101067894992, -0.068510983671620784, -0.068560866104069113, -0.068610748365115271, -0.068660630454635010, -0.068710512372502724, --0.068760394118594165, -0.068810275692784612, -0.068860157094949817, -0.068910038324964187, -0.068959919382703461, -0.069009800268042931, -0.069059680980858351, -0.069109561521024127, --0.069159441888415996, -0.069209322082909697, -0.069259202104379650, -0.069309081952701607, -0.069358961627750862, -0.069408841129403140, -0.069458720457532888, -0.069508599612015817, --0.069558478592727263, -0.069608357399542950, -0.069658236032337298, -0.069708114490986059, -0.069757992775364541, -0.069807870885348469, -0.069857748820812290, -0.069907626581631729, --0.069957504167682108, -0.070007381578839165, -0.070057258814977333, -0.070107135875972351, -0.070157012761699528, -0.070206889472034614, -0.070256766006852031, -0.070306642366027544, --0.070356518549436878, -0.070406394556954480, -0.070456270388456102, -0.070506146043817039, -0.070556021522913057, -0.070605896825618589, -0.070655771951809360, -0.070705646901360719, --0.070755521674148392, -0.070805396270046825, -0.070855270688931757, -0.070905144930678524, -0.070955018995162863, -0.071004892882259210, -0.071054766591843330, -0.071104640123790544, --0.071154513477976578, -0.071204386654275906, -0.071254259652564253, -0.071304132472717399, -0.071354005114609778, -0.071403877578117142, -0.071453749863114799, -0.071503621969478542, --0.071553493897082779, -0.071603365645803274, -0.071653237215515364, -0.071703108606094801, -0.071752979817416018, -0.071802850849354796, -0.071852721701786443, -0.071902592374586724, --0.071952462867630088, -0.072002333180792299, -0.072052203313948668, -0.072102073266974973, -0.072151943039745647, -0.072201812632136472, -0.072251682044023213, -0.072301551275280290, --0.072351420325783497, -0.072401289195408156, -0.072451157884030032, -0.072501026391523574, -0.072550894717764547, -0.072600762862628287, -0.072650630825990561, -0.072700498607725816, --0.072750366207709818, -0.072800233625817903, -0.072850100861925851, -0.072899967915908109, -0.072949834787640444, -0.072999701476998191, -0.073049567983857130, -0.073099434308091710, --0.073149300449577695, -0.073199166408190436, -0.073249032183805698, -0.073298897776297930, -0.073348763185542940, -0.073398628411416464, -0.073448493453792979, -0.073498358312548265, --0.073548222987557657, -0.073598087478696936, -0.073647951785840535, -0.073697815908864275, -0.073747679847643466, -0.073797543602053900, -0.073847407171970039, -0.073897270557267650, --0.073947133757822095, -0.073996996773509141, -0.074046859604203263, -0.074096722249780228, -0.074146584710115385, -0.074196446985084527, -0.074246309074562103, -0.074296170978423906, --0.074346032696545730, -0.074395894228802037, -0.074445755575068592, -0.074495616735220774, -0.074545477709134347, -0.074595338496683788, -0.074645199097744877, -0.074695059512192963, --0.074744919739903853, -0.074794779780751997, -0.074844639634613200, -0.074894499301362799, -0.074944358780876588, -0.074994218073029043, -0.075044077177695956, -0.075093936094752664, --0.075143794824074975, -0.075193653365537363, -0.075243511719015624, -0.075293369884385536, -0.075343227861521589, -0.075393085650299577, -0.075442943250594835, -0.075492800662283185, --0.075542657885239090, -0.075592514919338355, -0.075642371764456331, -0.075692228420468813, -0.075742084887250288, -0.075791941164676552, -0.075841797252622967, -0.075891653150965327, --0.075941508859578108, -0.075991364378337117, -0.076041219707117719, -0.076091074845795706, -0.076140929794245582, -0.076190784552343113, -0.076240639119963691, -0.076290493496983122, --0.076340347683275869, -0.076390201678717740, -0.076440055483184555, -0.076489909096550790, -0.076539762518692253, -0.076589615749484308, -0.076639468788802775, -0.076689321636522118, --0.076739174292518156, -0.076789026756666254, -0.076838879028842233, -0.076888731108920583, -0.076938582996777097, -0.076988434692287153, -0.077038286195326558, -0.077088137505769816, --0.077137988623492720, -0.077187839548370663, -0.077237690280279436, -0.077287540819093559, -0.077337391164688810, -0.077387241316941038, -0.077437091275724720, -0.077486941040915677, --0.077536790612389273, -0.077586639990021342, -0.077636489173686360, -0.077686338163260163, -0.077736186958618114, -0.077786035559636049, -0.077835883966188443, -0.077885732178151132, --0.077935580195399493, -0.077985428017809347, -0.078035275645255184, -0.078085123077612825, -0.078134970314757676, -0.078184817356565531, -0.078234664202910906, -0.078284510853669609, --0.078334357308717489, -0.078384203567929037, -0.078434049631180058, -0.078483895498345974, -0.078533741169302590, -0.078583586643924397, -0.078633431922087257, -0.078683277003666521, --0.078733121888538038, -0.078782966576576310, -0.078832811067657174, -0.078882655361656007, -0.078932499458448629, -0.078982343357909574, -0.079032187059914660, -0.079082030564339281, --0.079131873871059258, -0.079181716979949121, -0.079231559890884679, -0.079281402603741780, -0.079331245118394941, -0.079381087434719985, -0.079430929552592316, -0.079480771471887757, --0.079530613192480823, -0.079580454714247365, -0.079630296037062773, -0.079680137160802883, -0.079729978085342199, -0.079779818810556569, -0.079829659336321399, -0.079879499662512524, --0.079929339789004461, -0.079979179715673032, -0.080029019442393670, -0.080078858969042196, -0.080128698295493128, -0.080178537421622315, -0.080228376347305161, -0.080278215072417516, --0.080328053596833884, -0.080377891920430114, -0.080427730043082069, -0.080477567964664251, -0.080527405685052511, -0.080577243204122254, -0.080627080521749328, -0.080676917637808265, --0.080726754552174915, -0.080776591264724668, -0.080826427775333387, -0.080876264083875590, -0.080926100190227140, -0.080975936094263443, -0.081025771795860346, -0.081075607294892368, --0.081125442591235386, -0.081175277684764791, -0.081225112575356431, -0.081274947262884867, -0.081324781747225919, -0.081374616028255478, -0.081424450105848034, -0.081474283979879478, --0.081524117650225214, -0.081573951116761093, -0.081623784379361644, -0.081673617437902746, -0.081723450292259803, -0.081773282942308678, -0.081823115387923889, -0.081872947628981327, --0.081922779665356396, -0.081972611496924946, -0.082022443123561536, -0.082072274545142015, -0.082122105761541803, -0.082171936772636775, -0.082221767578301463, -0.082271598178411731, --0.082321428572843441, -0.082371258761471139, -0.082421088744170687, -0.082470918520817518, -0.082520748091287496, -0.082570577455455166, -0.082620406613196390, -0.082670235564386588, --0.082720064308901650, -0.082769892846616108, -0.082819721177405825, -0.082869549301146248, -0.082919377217713239, -0.082969204926981344, -0.083019032428826439, -0.083068859723123945, --0.083118686809749751, -0.083168513688578388, -0.083218340359485748, -0.083268166822347264, -0.083317993077038799, -0.083367819123434911, -0.083417644961411463, -0.083467470590844361, --0.083517296011608136, -0.083567121223578664, -0.083616946226631392, -0.083666771020642211, -0.083716595605485639, -0.083766419981037593, -0.083816244147173494, -0.083866068103769217, --0.083915891850699337, -0.083965715387839729, -0.084015538715065827, -0.084065361832253521, -0.084115184739277371, -0.084165007436013253, -0.084214829922336629, -0.084264652198123360, --0.084314474263248021, -0.084364296117586501, -0.084414117761014679, -0.084463939193407125, -0.084513760414639719, -0.084563581424587905, -0.084613402223127590, -0.084663222810133332, --0.084713043185481007, -0.084762863349046078, -0.084812683300704433, -0.084862503040330634, -0.084912322567800583, -0.084962141882989714, -0.085011960985773946, -0.085061779876027824, --0.085111598553627252, -0.085161417018447691, -0.085211235270365032, -0.085261053309253834, -0.085310871134990002, -0.085360688747449440, -0.085410506146506721, -0.085460323332037721, --0.085510140303917931, -0.085559957062023212, -0.085609773606228165, -0.085659589936408695, -0.085709406052440235, -0.085759221954198717, -0.085809037641558686, -0.085858853114396075, --0.085908668372586330, -0.085958483416005343, -0.086008298244527714, -0.086058112858029348, -0.086107927256385691, -0.086157741439472649, -0.086207555407164821, -0.086257369159338113, --0.086307182695868415, -0.086356996016630314, -0.086406809121499728, -0.086456622010352119, -0.086506434683063405, -0.086556247139508144, -0.086606059379562284, -0.086655871403101256, --0.086705683210001008, -0.086755494800136099, -0.086805306173382460, -0.086855117329615553, -0.086904928268711296, -0.086954738990544289, -0.087004549494990410, -0.087054359781925175, --0.087104169851224475, -0.087153979702762910, -0.087203789336416399, -0.087253598752060416, -0.087303407949570866, -0.087353216928822364, -0.087403025689690814, -0.087452834232052148, --0.087502642555780955, -0.087552450660753151, -0.087602258546844225, -0.087652066213930097, -0.087701873661885352, -0.087751680890585923, -0.087801487899907299, -0.087851294689725398, --0.087901101259914807, -0.087950907610351473, -0.088000713740910869, -0.088050519651468928, -0.088100325341900237, -0.088150130812080729, -0.088199936061885906, -0.088249741091191672, --0.088299545899872656, -0.088349350487804762, -0.088399154854863951, -0.088448959000924796, -0.088498762925863242, -0.088548566629554792, -0.088598370111875366, -0.088648173372699562, --0.088697976411903343, -0.088747779229362167, -0.088797581824951996, -0.088847384198547416, -0.088897186350024388, -0.088946988279258385, -0.088996789986125355, -0.089046591470499911, --0.089096392732257987, -0.089146193771275084, -0.089195994587427135, -0.089245795180588755, -0.089295595550635889, -0.089345395697444485, -0.089395195620889142, -0.089444995320845808, --0.089494794797189997, -0.089544594049797629, -0.089594393078543333, -0.089644191883303068, -0.089693990463952308, -0.089743788820367015, -0.089793586952421817, -0.089843384859992645, --0.089893182542955016, -0.089942980001184877, -0.089992777234556828, -0.090042574242946857, -0.090092371026230439, -0.090142167584283533, -0.090191963916980769, -0.090241760024198106, --0.090291555905811033, -0.090341351561695510, -0.090391146991726165, -0.090440942195778959, -0.090490737173729838, -0.090540531925453430, -0.090590326450825695, -0.090640120749722136, --0.090689914822018727, -0.090739708667590083, -0.090789502286312176, -0.090839295678060511, -0.090889088842711033, -0.090938881780138411, -0.090988674490218580, -0.091038466972827053, --0.091088259227839807, -0.091138051255131469, -0.091187843054578013, -0.091237634626054942, -0.091287425969438216, -0.091337217084602504, -0.091387007971423725, -0.091436798629777882, --0.091486589059539603, -0.091536379260584846, -0.091586169232789144, -0.091635958976028470, -0.091685748490177438, -0.091735537775112050, -0.091785326830707809, -0.091835115656840702, --0.091884904253385344, -0.091934692620217751, -0.091984480757213410, -0.092034268664248312, -0.092084056341197096, -0.092133843787935751, -0.092183631004339794, -0.092233417990285199, --0.092283204745646608, -0.092332991270300008, -0.092382777564121388, -0.092432563626985362, -0.092482349458767946, -0.092532135059344642, -0.092581920428591452, -0.092631705566383005, --0.092681490472595301, -0.092731275147103873, -0.092781059589784706, -0.092830843800512444, -0.092880627779163061, -0.092930411525612128, -0.092980195039735591, -0.093029978321408135, --0.093079761370505720, -0.093129544186903918, -0.093179326770478688, -0.093229109121104700, -0.093278891238657943, -0.093328673123014391, -0.093378454774048728, -0.093428236191636926, --0.093478017375654518, -0.093527798325977518, -0.093577579042480583, -0.093627359525039699, -0.093677139773530427, -0.093726919787828725, -0.093776699567809305, -0.093826479113348113, --0.093876258424320735, -0.093926037500603160, -0.093975816342070043, -0.094025594948597385, -0.094075373320060732, -0.094125151456336098, -0.094174929357298140, -0.094224707022822859, --0.094274484452785814, -0.094324261647062993, -0.094374038605529079, -0.094423815328060073, -0.094473591814531965, -0.094523368064819438, -0.094573144078798480, -0.094622919856344676, --0.094672695397334014, -0.094722470701641165, -0.094772245769142144, -0.094822020599712509, -0.094871795193228262, -0.094921569549564086, -0.094971343668595984, -0.095021117550199527, --0.095070891194250703, -0.095120664600624225, -0.095170437769196078, -0.095220210699841851, -0.095269983392437529, -0.095319755846857798, -0.095369528062978687, -0.095419300040676197, --0.095469071779825013, -0.095518843280301149, -0.095568614541980179, -0.095618385564738118, -0.095668156348449648, -0.095717926892990787, -0.095767697198237120, -0.095817467264064635, --0.095867237090348043, -0.095917006676963359, -0.095966776023786171, -0.096016545130692466, -0.096066313997556968, -0.096116082624255680, -0.096165851010664188, -0.096215619156658508, --0.096265387062113336, -0.096315154726904703, -0.096364922150908625, -0.096414689333999798, -0.096464456276054253, -0.096514222976947561, -0.096563989436555753, -0.096613755654753525, --0.096663521631416921, -0.096713287366421499, -0.096763052859643303, -0.096812818110957044, -0.096862583120238738, -0.096912347887363956, -0.096962112412208770, -0.097011876694647850, --0.097061640734557239, -0.097111404531812523, -0.097161168086289745, -0.097210931397863590, -0.097260694466410128, -0.097310457291804917, -0.097360219873924000, -0.097409982212642104, --0.097459744307835244, -0.097509506159379464, -0.097559267767149488, -0.097609029131021333, -0.097658790250870597, -0.097708551126573340, -0.097758311758004271, -0.097808072145039407, --0.097857832287554375, -0.097907592185425191, -0.097957351838526593, -0.098007111246734613, -0.098056870409924848, -0.098106629327973358, -0.098156388000754852, -0.098206146428145374, --0.098255904610020539, -0.098305662546256375, -0.098355420236727623, -0.098405177681310310, -0.098454934879880496, -0.098504691832312904, -0.098554448538483580, -0.098604204998268136, --0.098653961211542615, -0.098703717178181757, -0.098753472898061606, -0.098803228371057775, -0.098852983597046321, -0.098902738575901955, -0.098952493307500750, -0.099002247791718304, --0.099052002028430675, -0.099101756017512616, -0.099151509758840156, -0.099201263252288924, -0.099251016497734976, -0.099300769495053037, -0.099350522244119194, -0.099400274744809475, --0.099450026996998619, -0.099499779000562713, -0.099549530755377341, -0.099599282261318603, -0.099649033518261210, -0.099698784526081233, -0.099748535284654286, -0.099798285793856453, --0.099848036053562461, -0.099897786063648381, -0.099947535823989839, -0.099997285334462893, -0.100047034594942280, -0.100096783605304110, -0.100146532365423950, -0.100196280875177910, --0.100246029134440740, -0.100295777143088490, -0.100345524900997240, -0.100395272408041730, -0.100445019664098050, -0.100494766669041810, -0.100544513422749100, -0.100594259925094660, --0.100644006175954580, -0.100693752175204470, -0.100743497922720430, -0.100793243418377210, -0.100842988662050880, -0.100892733653617060, -0.100942478392951870, -0.100992222879930040, --0.101041967114427640, -0.101091711096320330, -0.101141454825484170, -0.101191198301793950, -0.101240941525125740, -0.101290684495355150, -0.101340427212358310, -0.101390169676009960, --0.101439911886186170, -0.101489653842763050, -0.101539395545615360, -0.101589136994619190, -0.101638878189650160, -0.101688619130584380, -0.101738359817296620, -0.101788100249662950, --0.101837840427559030, -0.101887580350860960, -0.101937320019443490, -0.101987059433182720, -0.102036798591954290, -0.102086537495634320, -0.102136276144097570, -0.102186014537220120, --0.102235752674877630, -0.102285490556946200, -0.102335228183300610, -0.102384965553816950, -0.102434702668371320, -0.102484439526838490, -0.102534176129094550, -0.102583912475015180, --0.102633648564476460, -0.102683384397353190, -0.102733119973521460, -0.102782855292856910, -0.102832590355235690, -0.102882325160532530, -0.102932059708623570, -0.102981793999384450, --0.103031528032691310, -0.103081261808418880, -0.103130995326443320, -0.103180728586640250, -0.103230461588885810, -0.103280194333054780, -0.103329926819023250, -0.103379659046667360, --0.103429391015861880, -0.103479122726482910, -0.103528854178406140, -0.103578585371507690, -0.103628316305662310, -0.103678046980746160, -0.103727777396634880, -0.103777507553204600, --0.103827237450330110, -0.103876967087887530, -0.103926696465752530, -0.103976425583801230, -0.104026154441908420, -0.104075883039950230, -0.104125611377802340, -0.104175339455340850, --0.104225067272440570, -0.104274794828977630, -0.104324522124827690, -0.104374249159866900, -0.104423975933970040, -0.104473702447013250, -0.104523428698872630, -0.104573154689423010, --0.104622880418540500, -0.104672605886100780, -0.104722331091979990, -0.104772056036052940, -0.104821780718195740, -0.104871505138284100, -0.104921229296194130, -0.104970953191800640, --0.105020676824979770, -0.105070400195607220, -0.105120123303559090, -0.105169846148710220, -0.105219568730936740, -0.105269291050114340, -0.105319013106119140, -0.105368734898825980, --0.105418456428110980, -0.105468177693850280, -0.105517898695918700, -0.105567619434192360, -0.105617339908546980, -0.105667060118858680, -0.105716780065002310, -0.105766499746853970, --0.105816219164289390, -0.105865938317184700, -0.105915657205414720, -0.105965375828855610, -0.106015094187383040, -0.106064812280873190, -0.106114530109200870, -0.106164247672242220, --0.106213964969872950, -0.106263682001969210, -0.106313398768405830, -0.106363115269058950, -0.106412831503804720, -0.106462547472517960, -0.106512263175074850, -0.106561978611351070, --0.106611693781222790, -0.106661408684564830, -0.106711123321253350, -0.106760837691164070, -0.106810551794173130, -0.106860265630155370, -0.106909979198986940, -0.106959692500543570, --0.107009405534701410, -0.107059118301335300, -0.107108830800321380, -0.107158543031535390, -0.107208254994853480, -0.107257966690150500, -0.107307678117302600, -0.107357389276185950, --0.107407100166675370, -0.107456810788647050, -0.107506521141976700, -0.107556231226540500, -0.107605941042213270, -0.107655650588871180, -0.107705359866389970, -0.107755068874645810, --0.107804777613513540, -0.107854486082869310, -0.107904194282588880, -0.107953902212548390, -0.108003609872622710, -0.108053317262688010, -0.108103024382620010, -0.108152731232294890, --0.108202437811587520, -0.108252144120374020, -0.108301850158530190, -0.108351555925932170, -0.108401261422454810, -0.108450966647974300, -0.108500671602366820, -0.108550376285507220, --0.108600080697271670, -0.108649784837535910, -0.108699488706176160, -0.108749192303067220, -0.108798895628085310, -0.108848598681106160, -0.108898301462005950, -0.108948003970659550, --0.108997706206943140, -0.109047408170732470, -0.109097109861903710, -0.109146811280331740, -0.109196512425892750, -0.109246213298462470, -0.109295913897917100, -0.109345614224131500, --0.109395314276981860, -0.109445014056344380, -0.109494713562093930, -0.109544412794106690, -0.109594111752258420, -0.109643810436425320, -0.109693508846482240, -0.109743206982305390, --0.109792904843770520, -0.109842602430753850, -0.109892299743130210, -0.109941996780775830, -0.109991693543566460, -0.110041390031378290, -0.110091086244086200, -0.110140782181566410, --0.110190477843694650, -0.110240173230347140, -0.110289868341398770, -0.110339563176725720, -0.110389257736204200, -0.110438952019709090, -0.110488646027116610, -0.110538339758302500, --0.110588033213143010, -0.110637726391512970, -0.110687419293288620, -0.110737111918345720, -0.110786804266560480, -0.110836496337807800, -0.110886188131963880, -0.110935879648904490, --0.110985570888505830, -0.111035261850642800, -0.111084952535191630, -0.111134642942028070, -0.111184333071028350, -0.111234022922067340, -0.111283712495021280, -0.111333401789765950, --0.111383090806177550, -0.111432779544130970, -0.111482468003502460, -0.111532156184168220, -0.111581844086003130, -0.111631531708883440, -0.111681219052684920, -0.111730906117283810, --0.111780592902554970, -0.111830279408374660, -0.111879965634618650, -0.111929651581163160, -0.111979337247883120, -0.112029022634654720, -0.112078707741353770, -0.112128392567856490, --0.112178077114037780, -0.112227761379773890, -0.112277445364940580, -0.112327129069414110, -0.112376812493069370, -0.112426495635782610, -0.112476178497430040, -0.112525861077886590, --0.112575543377028490, -0.112625225394731520, -0.112674907130871940, -0.112724588585324640, -0.112774269757965880, -0.112823950648671440, -0.112873631257317560, -0.112923311583779160, --0.112972991627932490, -0.113022671389653340, -0.113072350868817950, -0.113122030065301240, -0.113171708978979460, -0.113221387609728400, -0.113271065957424310, -0.113320744021942130, --0.113370421803158080, -0.113420099300948420, -0.113469776515188070, -0.113519453445753270, -0.113569130092519840, -0.113618806455364030, -0.113668482534160760, -0.113718158328786290, --0.113767833839116410, -0.113817509065027400, -0.113867184006394170, -0.113916858663092990, -0.113966533034999650, -0.114016207121990430, -0.114065880923940240, -0.114115554440725350, --0.114165227672221580, -0.114214900618305180, -0.114264573278851090, -0.114314245653735560, -0.114363917742834860, -0.114413589546023930, -0.114463261063179010, -0.114512932294175960, --0.114562603238891000, -0.114612273897199110, -0.114661944268976520, -0.114711614354099070, -0.114761284152443040, -0.114810953663883340, -0.114860622888296270, -0.114910291825557630, --0.114959960475543720, -0.115009628838129460, -0.115059296913191130, -0.115108964700604540, -0.115158632200246000, -0.115208299411990430, -0.115257966335714100, -0.115307632971292870, --0.115357299318603000, -0.115406965377519430, -0.115456631147918460, -0.115506296629676330, -0.115555961822668040, -0.115605626726769840, -0.115655291341857580, -0.115704955667807520, --0.115754619704494630, -0.115804283451795190, -0.115853946909585050, -0.115903610077740480, -0.115953272956136440, -0.116002935544649230, -0.116052597843154660, -0.116102259851529050, --0.116151921569647360, -0.116201582997385850, -0.116251244134620390, -0.116300904981227260, -0.116350565537081420, -0.116400225802059180, -0.116449885776036810, -0.116499545458889270, --0.116549204850492890, -0.116598863950723480, -0.116648522759457360, -0.116698181276569490, -0.116747839501936170, -0.116797497435433250, -0.116847155076937020, -0.116896812426322470, --0.116946469483465880, -0.116996126248243130, -0.117045782720530480, -0.117095438900202960, -0.117145094787136830, -0.117194750381207970, -0.117244405682292660, -0.117294060690265920, --0.117343715405004000, -0.117393369826383250, -0.117443023954278640, -0.117492677788566450, -0.117542331329122590, -0.117591984575823330, -0.117641637528543660, -0.117691290187159900, --0.117740942551547920, -0.117790594621584030, -0.117840246397143200, -0.117889897878101770, -0.117939549064335570, -0.117989199955720960, -0.118038850552132900, -0.118088500853447710, --0.118138150859541280, -0.118187800570289910, -0.118237449985568590, -0.118287099105253660, -0.118336747929220970, -0.118386396457346850, -0.118436044689506300, -0.118485692625575650, --0.118535340265431190, -0.118584987608947950, -0.118634634656002240, -0.118684281406469940, -0.118733927860227390, -0.118783574017149560, -0.118833219877112820, -0.118882865439993000, --0.118932510705666470, -0.118982155674008230, -0.119031800344894590, -0.119081444718201470, -0.119131088793805160, -0.119180732571580680, -0.119230376051404390, -0.119280019233152150, --0.119329662116700310, -0.119379304701923860, -0.119428946988699160, -0.119478588976902530, -0.119528230666408980, -0.119577872057094860, -0.119627513148836060, -0.119677153941508910, --0.119726794434988450, -0.119776434629150980, -0.119826074523872450, -0.119875714119029160, -0.119925353414496140, -0.119974992410149750, -0.120024631105865860, -0.120074269501520850, --0.120123907596989720, -0.120173545392148830, -0.120223182886874070, -0.120272820081041790, -0.120322456974527020, -0.120372093567206110, -0.120421729858955410, -0.120471365849649930, --0.120521001539166050, -0.120570636927379670, -0.120620272014167130, -0.120669906799403470, -0.120719541282965040, -0.120769175464727760, -0.120818809344567980, -0.120868442922360740, --0.120918076197982390, -0.120967709171308850, -0.121017341842216480, -0.121066974210580310, -0.121116606276276710, -0.121166238039181580, -0.121215869499171320, -0.121265500656120930, --0.121315131509906790, -0.121364762060405270, -0.121414392307491390, -0.121464022251041540, -0.121513651890931630, -0.121563281227038040, -0.121612910259235790, -0.121662538987401270, --0.121712167411410420, -0.121761795531139570, -0.121811423346463800, -0.121861050857259470, -0.121910678063402510, -0.121960304964769300, -0.122009931561234890, -0.122059557852675640, --0.122109183838967500, -0.122158809519986850, -0.122208434895608730, -0.122258059965709510, -0.122307684730165160, -0.122357309188852030, -0.122406933341645190, -0.122456557188421020, --0.122506180729055890, -0.122555803963424870, -0.122605426891404340, -0.122655049512870230, -0.122704671827698950, -0.122754293835765550, -0.122803915536946420, -0.122853536931117500, --0.122903158018155170, -0.122952778797934510, -0.123002399270331910, -0.123052019435223300, -0.123101639292485080, -0.123151258841992340, -0.123200878083621430, -0.123250497017248330, --0.123300115642749440, -0.123349733959999800, -0.123399351968875850, -0.123448969669253950, -0.123498587061009180, -0.123548204144017950, -0.123597820918156200, -0.123647437383300350, --0.123697053539325460, -0.123746669386107940, -0.123796284923523740, -0.123845900151449280, -0.123895515069759610, -0.123945129678331170, -0.123994743977039900, -0.124044357965762210, --0.124093971644373190, -0.124143585012749230, -0.124193198070766310, -0.124242810818300840, -0.124292423255227910, -0.124342035381423910, -0.124391647196765260, -0.124441258701127060, --0.124490869894385710, -0.124540480776417190, -0.124590091347097890, -0.124639701606302940, -0.124689311553908740, -0.124738921189791240, -0.124788530513826890, -0.124838139525890780, --0.124887748225859310, -0.124937356613608480, -0.124986964689014700, -0.125036572451953040, -0.125086179902299980, -0.125135787039931470, -0.125185393864723910, -0.125235000376552440, --0.125284606575293470, -0.125334212460822990, -0.125383818033017400, -0.125433423291751830, -0.125483028236902720, -0.125532632868346460, -0.125582237185958180, -0.125631841189614320, --0.125681444879190830, -0.125731048254564190, -0.125780651315609500, -0.125830254062203160, -0.125879856494221200, -0.125929458611540030, -0.125979060414034780, -0.126028661901581850, --0.126078263074057310, -0.126127863931337510, -0.126177464473297640, -0.126227064699814100, -0.126276664610762900, -0.126326264206020470, -0.126375863485461950, -0.126425462448963770, --0.126475061096402390, -0.126524659427652900, -0.126574257442591740, -0.126623855141094980, -0.126673452523038990, -0.126723049588298940, -0.126772646336751250, -0.126822242768271980, --0.126871838882737510, -0.126921434680023010, -0.126971030160004940, -0.127020625322559280, -0.127070220167562500, -0.127119814694889730, -0.127169408904417410, -0.127219002796021580, --0.127268596369578680, -0.127318189624963860, -0.127367782562053560, -0.127417375180724240, -0.127466967480851040, -0.127516559462310440, -0.127566151124978430, -0.127615742468731470, --0.127665333493444720, -0.127714924198994630, -0.127764514585257260, -0.127814104652109020, -0.127863694399425080, -0.127913283827081890, -0.127962872934955510, -0.128012461722922380, --0.128062050190857670, -0.128111638338637810, -0.128161226166138870, -0.128210813673237310, -0.128260400859808280, -0.128309987725728240, -0.128359574270873660, -0.128409160495119720, --0.128458746398342870, -0.128508331980419140, -0.128557917241225030, -0.128607502180635690, -0.128657086798527610, -0.128706671094776790, -0.128756255069259750, -0.128805838721851610, --0.128855422052428890, -0.128905005060867610, -0.128954587747044270, -0.129004170110834010, -0.129053752152113320, -0.129103333870758260, -0.129152915266645300, -0.129202496339649610, --0.129252077089647670, -0.129301657516515570, -0.129351237620129730, -0.129400817400365380, -0.129450396857098970, -0.129499975990207020, -0.129549554799564680, -0.129599133285048460, --0.129648711446534420, -0.129698289283899010, -0.129747866797017470, -0.129797443985766230, -0.129847020850021390, -0.129896597389659450, -0.129946173604555570, -0.129995749494586250, --0.130045325059627570, -0.130094900299556030, -0.130144475214246770, -0.130194049803576320, -0.130243624067420770, -0.130293198005656590, -0.130342771618158960, -0.130392344904804420, --0.130441917865469460, -0.130491490500029260, -0.130541062808360340, -0.130590634790338750, -0.130640206445841010, -0.130689777774742330, -0.130739348776919200, -0.130788919452247690, --0.130838489800604340, -0.130888059821864300, -0.130937629515904120, -0.130987198882599850, -0.131036767921828060, -0.131086336633463890, -0.131135905017383870, -0.131185473073464120, --0.131235040801581100, -0.131284608201610030, -0.131334175273427470, -0.131383742016909890, -0.131433308431932520, -0.131482874518371870, -0.131532440276104060, -0.131582005705005560, --0.131631570804951610, -0.131681135575818760, -0.131730700017483050, -0.131780264129821020, -0.131829827912707890, -0.131879391366020230, -0.131928954489634040, -0.131978517283425940, --0.132028079747271100, -0.132077641881046040, -0.132127203684626880, -0.132176765157890170, -0.132226326300711100, -0.132275887112966230, -0.132325447594531600, -0.132375007745283820, --0.132424567565098100, -0.132474127053850920, -0.132523686211418880, -0.132573245037677200, -0.132622803532502390, -0.132672361695770570, -0.132721919527358290, -0.132771477027140760, --0.132821034194994550, -0.132870591030795760, -0.132920147534420910, -0.132969703705745290, -0.133019259544645390, -0.133068815050997320, -0.133118370224677680, -0.133167925065561660, --0.133217479573525840, -0.133267033748446310, -0.133316587590199650, -0.133366141098661070, -0.133415694273707140, -0.133465247115214400, -0.133514799623058120, -0.133564351797114840, --0.133613903637260670, -0.133663455143372190, -0.133713006315324620, -0.133762557152994540, -0.133812107656258090, -0.133861657824991790, -0.133911207659070910, -0.133960757158372000, --0.134010306322771190, -0.134059855152145080, -0.134109403646368890, -0.134158951805319170, -0.134208499628872100, -0.134258047116904200, -0.134307594269290760, -0.134357141085908320, --0.134406687566633460, -0.134456233711341440, -0.134505779519908860, -0.134555324992211820, -0.134604870128126890, -0.134654414927529360, -0.134703959390295810, -0.134753503516302330, --0.134803047305425560, -0.134852590757540690, -0.134902133872524390, -0.134951676650252730, -0.135001219090602310, -0.135050761193448420, -0.135100302958667620, -0.135149844386136090, --0.135199385475730350, -0.135248926227325730, -0.135298466640798780, -0.135348006716025680, -0.135397546452882990, -0.135447085851245990, -0.135496624910991260, -0.135546163631995450, --0.135595702014133760, -0.135645240057282850, -0.135694777761318800, -0.135744315126118260, -0.135793852151556480, -0.135843388837510100, -0.135892925183855230, -0.135942461190468490, --0.135991996857225160, -0.136041532184001830, -0.136091067170674680, -0.136140601817120290, -0.136190136123213960, -0.136239670088832280, -0.136289203713851450, -0.136338736998148020, --0.136388269941597330, -0.136437802544075950, -0.136487334805460520, -0.136536866725626320, -0.136586398304449940, -0.136635929541807560, -0.136685460437575790, -0.136734990991629950, --0.136784521203846600, -0.136834051074101990, -0.136883580602272650, -0.136933109788233950, -0.136982638631862470, -0.137032167133034370, -0.137081695291626310, -0.137131223107513580, --0.137180750580572770, -0.137230277710680110, -0.137279804497712180, -0.137329330941544310, -0.137378857042053100, -0.137428382799115210, -0.137477908212605890, -0.137527433282401830, --0.137576958008379160, -0.137626482390414560, -0.137676006428383290, -0.137725530122162020, -0.137775053471626910, -0.137824576476654640, -0.137874099137120450, -0.137923621452901020, --0.137973143423872540, -0.138022665049911650, -0.138072186330893660, -0.138121707266695200, -0.138171227857192460, -0.138220748102262120, -0.138270268001779440, -0.138319787555621100, --0.138369306763663710, -0.138418825625782640, -0.138468344141854520, -0.138517862311755500, -0.138567380135362290, -0.138616897612550190, -0.138666414743195830, -0.138715931527175460, --0.138765447964365680, -0.138814964054641830, -0.138864479797880610, -0.138913995193958140, -0.138963510242751160, -0.139013024944134950, -0.139062539297986180, -0.139112053304181050, --0.139161566962596240, -0.139211080273107080, -0.139260593235590200, -0.139310105849921840, -0.139359618115978660, -0.139409130033636000, -0.139458641602770520, -0.139508152823258870, --0.139557663694976410, -0.139607174217799780, -0.139656684391605200, -0.139706194216269370, -0.139755703691667590, -0.139805212817676580, -0.139854721594172500, -0.139904230021032080, --0.139953738098130660, -0.140003245825344870, -0.140052753202550980, -0.140102260229625660, -0.140151766906444210, -0.140201273232883370, -0.140250779208819340, -0.140300284834128820, --0.140349790108687120, -0.140399295032370950, -0.140448799605056990, -0.140498303826620600, -0.140547807696938450, -0.140597311215886760, -0.140646814383342260, -0.140696317199180240, --0.140745819663277450, -0.140795321775510130, -0.140844823535754920, -0.140894324943887230, -0.140943825999783720, -0.140993326703320650, -0.141042827054374710, -0.141092327052821240, --0.141141826698536980, -0.141191325991398110, -0.141240824931281400, -0.141290323518062170, -0.141339821751617160, -0.141389319631823020, -0.141438817158555140, -0.141488314331690210, --0.141537811151104500, -0.141587307616674710, -0.141636803728276190, -0.141686299485785680, -0.141735794889079390, -0.141785289938034100, -0.141834784632525110, -0.141884278972429170, --0.141933772957622550, -0.141983266587981910, -0.142032759863382680, -0.142082252783701540, -0.142131745348814790, -0.142181237558599070, -0.142230729412929860, -0.142280220911683820, --0.142329712054737210, -0.142379202841966780, -0.142428693273247890, -0.142478183348457270, -0.142527673067471630, -0.142577162430166380, -0.142626651436418200, -0.142676140086103410, --0.142725628379098720, -0.142775116315279480, -0.142824603894522480, -0.142874091116703960, -0.142923577981700660, -0.142973064489387990, -0.143022550639642610, -0.143072036432340900, --0.143121521867359520, -0.143171006944573910, -0.143220491663860750, -0.143269976025096390, -0.143319460028157510, -0.143368943672919550, -0.143418426959259240, -0.143467909887053300, --0.143517392456177150, -0.143566874666507500, -0.143616356517920680, -0.143665838010293400, -0.143715319143501080, -0.143764799917420470, -0.143814280331927860, -0.143863760386899990, --0.143913240082212260, -0.143962719417741470, -0.144012198393363850, -0.144061677008956200, -0.144111155264393890, -0.144160633159553690, -0.144210110694311920, -0.144259587868545310, --0.144309064682129310, -0.144358541134940620, -0.144408017226856030, -0.144457492957750950, -0.144506968327502150, -0.144556443335985910, -0.144605917983079040, -0.144655392268656900, --0.144704866192596290, -0.144754339754773500, -0.144803812955065340, -0.144853285793347160, -0.144902758269495810, -0.144952230383387530, -0.145001702134899130, -0.145051173523906040, --0.145100644550284990, -0.145150115213912360, -0.145199585514664860, -0.145249055452417950, -0.145298525027048430, -0.145347994238433030, -0.145397463086447190, -0.145446931570967690, --0.145496399691870890, -0.145545867449033500, -0.145595334842331000, -0.145644801871640190, -0.145694268536837370, -0.145743734837799320, -0.145793200774401470, -0.145842666346520630, --0.145892131554033130, -0.145941596396815730, -0.145991060874743890, -0.146040524987694430, -0.146089988735543630, -0.146139452118168310, -0.146188915135443940, -0.146238377787247240, --0.146287840073454630, -0.146337301993942850, -0.146386763548587370, -0.146436224737264980, -0.146485685559852470, -0.146535146016225300, -0.146584606106260280, -0.146634065829833740, --0.146683525186822480, -0.146732984177101950, -0.146782442800548970, -0.146831901057039890, -0.146881358946451490, -0.146930816468659270, -0.146980273623539990, -0.147029730410970030, --0.147079186830826160, -0.147128642882983910, -0.147178098567320060, -0.147227553883710950, -0.147277008832033400, -0.147326463412162880, -0.147375917623976200, -0.147425371467350190, --0.147474824942160270, -0.147524278048283330, -0.147573730785595690, -0.147623183153974130, -0.147672635153294210, -0.147722086783432680, -0.147771538044265930, -0.147820988935670780, --0.147870439457522730, -0.147919889609698570, -0.147969339392074680, -0.148018788804527900, -0.148068237846933680, -0.148117686519168900, -0.148167134821109880, -0.148216582752633470, --0.148266030313615150, -0.148315477503931790, -0.148364924323460130, -0.148414370772075750, -0.148463816849655430, -0.148513262556075580, -0.148562707891213010, -0.148612152854943220, --0.148661597447143050, -0.148711041667688920, -0.148760485516457600, -0.148809928993324600, -0.148859372098166800, -0.148908814830860580, -0.148958257191282750, -0.149007699179308840, --0.149057140794815690, -0.149106582037679680, -0.149156022907777660, -0.149205463404985140, -0.149254903529178970, -0.149304343280235540, -0.149353782658031680, -0.149403221662442910, --0.149452660293346110, -0.149502098550618110, -0.149551536434134410, -0.149600973943771860, -0.149650411079406880, -0.149699847840916310, -0.149749284228175680, -0.149798720241061830, --0.149848155879451220, -0.149897591143220630, -0.149947026032245610, -0.149996460546403060, -0.150045894685569340, -0.150095328449621310, -0.150144761838434530, -0.150194194851885840, --0.150243627489851680, -0.150293059752208890, -0.150342491638832980, -0.150391923149600870, -0.150441354284389400, -0.150490785043074090, -0.150540215425531810, -0.150589645431639000, --0.150639075061272530, -0.150688504314307910, -0.150737933190622040, -0.150787361690091330, -0.150836789812592660, -0.150886217558001580, -0.150935644926194930, -0.150985071917049210, --0.151034498530441210, -0.151083924766246550, -0.151133350624342080, -0.151182776104604230, -0.151232201206909860, -0.151281625931134560, -0.151331050277155210, -0.151380474244848660, --0.151429897834090470, -0.151479321044757560, -0.151528743876726350, -0.151578166329873700, -0.151627588404075200, -0.151677010099207730, -0.151726431415147740, -0.151775852351772130, --0.151825272908956420, -0.151874693086577530, -0.151924112884511910, -0.151973532302636470, -0.152022951340826720, -0.152072369998959620, -0.152121788276911580, -0.152171206174559540, --0.152220623691778990, -0.152270040828446920, -0.152319457584440180, -0.152368873959634360, -0.152418289953906360, -0.152467705567132630, -0.152517120799190080, -0.152566535649954260, --0.152615950119302120, -0.152665364207110130, -0.152714777913255130, -0.152764191237612760, -0.152813604180059930, -0.152863016740473060, -0.152912428918729110, -0.152961840714703650, --0.153011252128273570, -0.153060663159315350, -0.153110073807705940, -0.153159484073320890, -0.153208893956037150, -0.153258303455731160, -0.153307712572279850, -0.153357121305558810, --0.153406529655444990, -0.153455937621815250, -0.153505345204545260, -0.153554752403511910, -0.153604159218591660, -0.153653565649661460, -0.153702971696596890, -0.153752377359274910, --0.153801782637571990, -0.153851187531365040, -0.153900592040529690, -0.153949996164942840, -0.153999399904481030, -0.154048803259021150, -0.154098206228438810, -0.154147608812610970, --0.154197011011414090, -0.154246412824725120, -0.154295814252419700, -0.154345215294374730, -0.154394615950467160, -0.154444016220572630, -0.154493416104568040, -0.154542815602329940, --0.154592214713735190, -0.154641613438659510, -0.154691011776979780, -0.154740409728572500, -0.154789807293314650, -0.154839204471081850, -0.154888601261751050, -0.154937997665198720, --0.154987393681301850, -0.155036789309936060, -0.155086184550978280, -0.155135579404305060, -0.155184973869793300, -0.155234367947318710, -0.155283761636758170, -0.155333154937988660, --0.155382547850885840, -0.155431940375326650, -0.155481332511187590, -0.155530724258345660, -0.155580115616676480, -0.155629506586057010, -0.155678897166363770, -0.155728287357473710, --0.155777677159262500, -0.155827066571607110, -0.155876455594384040, -0.155925844227470270, -0.155975232470741470, -0.156024620324074580, -0.156074007787346120, -0.156123394860433110, --0.156172781543211150, -0.156222167835557260, -0.156271553737347940, -0.156320939248460160, -0.156370324368769600, -0.156419709098153230, -0.156469093436488040, -0.156518477383649660, --0.156567860939515110, -0.156617244103960880, -0.156666626876863970, -0.156716009258100090, -0.156765391247546180, -0.156814772845078780, -0.156864154050574880, -0.156913534863910160, --0.156962915284961620, -0.157012295313605780, -0.157061674949719650, -0.157111054193178860, -0.157160433043860490, -0.157209811501640980, -0.157259189566397420, -0.157308567238005430, --0.157357944516342020, -0.157407321401284220, -0.157456697892707640, -0.157506073990489330, -0.157555449694505830, -0.157604825004634130, -0.157654199920749970, -0.157703574442730280, --0.157752948570451660, -0.157802322303791100, -0.157851695642624300, -0.157901068586828260, -0.157950441136279570, -0.157999813290855190, -0.158049185050430830, -0.158098556414883550, --0.158147927384089840, -0.158197297957926780, -0.158246668136270000, -0.158296037918996570, -0.158345407305983480, -0.158394776297106440, -0.158444144892242460, -0.158493513091268110, --0.158542880894060430, -0.158592248300495090, -0.158641615310449150, -0.158690981923799160, -0.158740348140422150, -0.158789713960193840, -0.158839079382991240, -0.158888444408690930, --0.158937809037169970, -0.158987173268304030, -0.159036537101970190, -0.159085900538044970, -0.159135263576405450, -0.159184626216927330, -0.159233988459487660, -0.159283350303963430, --0.159332711750230390, -0.159382072798165600, -0.159431433447645600, -0.159480793698547480, -0.159530153550746900, -0.159579513004120960, -0.159628872058546260, -0.159678230713899780, --0.159727588970057290, -0.159776946826895830, -0.159826304284292040, -0.159875661342122890, -0.159925018000264150, -0.159974374258592870, -0.160023730116985650, -0.160073085575319550, --0.160122440633470310, -0.160171795291314950, -0.160221149548730100, -0.160270503405592820, -0.160319856861778850, -0.160369209917165220, -0.160418562571629040, -0.160467914825045970, --0.160517266677293130, -0.160566618128247130, -0.160615969177785030, -0.160665319825782550, -0.160714670072116790, -0.160764019916664340, -0.160813369359302290, -0.160862718399906370, --0.160912067038353650, -0.160961415274520760, -0.161010763108284800, -0.161060110539521460, -0.161109457568107850, -0.161158804193920620, -0.161208150416836780, -0.161257496236732160, --0.161306841653483770, -0.161356186666968740, -0.161405531277062810, -0.161454875483643040, -0.161504219286586060, -0.161553562685768980, -0.161602905681067580, -0.161652248272358880, --0.161701590459519600, -0.161750932242426760, -0.161800273620956140, -0.161849614594984870, -0.161898955164389540, -0.161948295329047250, -0.161997635088833800, -0.162046974443626260, --0.162096313393301270, -0.162145651937735950, -0.162194990076806070, -0.162244327810388690, -0.162293665138360940, -0.162343002060598600, -0.162392338576978740, -0.162441674687378050, --0.162491010391673600, -0.162540345689741180, -0.162589680581457920, -0.162639015066700450, -0.162688349145345860, -0.162737682817269970, -0.162787016082349880, -0.162836348940462230, --0.162885681391484180, -0.162935013435291460, -0.162984345071761210, -0.163033676300770120, -0.163083007122195260, -0.163132337535912440, -0.163181667541798770, -0.163230997139730940, --0.163280326329586060, -0.163329655111239920, -0.163378983484569670, -0.163428311449452360, -0.163477639005763840, -0.163526966153381250, -0.163576292892181230, -0.163625619222040890, --0.163674945142836090, -0.163724270654443920, -0.163773595756741080, -0.163822920449604700, -0.163872244732910570, -0.163921568606535810, -0.163970892070357140, -0.164020215124251690, --0.164069537768095240, -0.164118860001764980, -0.164168181825137540, -0.164217503238090090, -0.164266824240498460, -0.164316144832239750, -0.164365465013191130, -0.164414784783228410, --0.164464104142228700, -0.164513423090068780, -0.164562741626625710, -0.164612059751775340, -0.164661377465394830, -0.164710694767360890, -0.164760011657550610, -0.164809328135839900, --0.164858644202105860, -0.164907959856225220, -0.164957275098075120, -0.165006589927531370, -0.165055904344471150, -0.165105218348771180, -0.165154531940308600, -0.165203845118959250, --0.165253157884600290, -0.165302470237108870, -0.165351782176360850, -0.165401093702233350, -0.165450404814603130, -0.165499715513347360, -0.165549025798341830, -0.165598335669463750, --0.165647645126589800, -0.165696954169597200, -0.165746262798361800, -0.165795571012760710, -0.165844878812670710, -0.165894186197968950, -0.165943493168531270, -0.165992799724234860, --0.166042105864956460, -0.166091411590573250, -0.166140716900961050, -0.166190021795997070, -0.166239326275558460, -0.166288630339521100, -0.166337933987762170, -0.166387237220158410, --0.166436540036586980, -0.166485842436923770, -0.166535144421045940, -0.166584445988830270, -0.166633747140153910, -0.166683047874892770, -0.166732348192923980, -0.166781648094124320, --0.166830947578371000, -0.166880246645539850, -0.166929545295508100, -0.166978843528152480, -0.167028141343350200, -0.167077438740977110, -0.167126735720910440, -0.167176032283026910, --0.167225328427203750, -0.167274624153316840, -0.167323919461243360, -0.167373214350860530, -0.167422508822044210, -0.167471802874671620, -0.167521096508619540, -0.167570389723765150, --0.167619682519984330, -0.167668974897154320, -0.167718266855151870, -0.167767558393854180, -0.167816849513137190, -0.167866140212878050, -0.167915430492953540, -0.167964720353240920, --0.168014009793616050, -0.168063298813956180, -0.168112587414138040, -0.168161875594038860, -0.168211163353534590, -0.168260450692502370, -0.168309737610819490, -0.168359024108361820, --0.168408310185006570, -0.168457595840630580, -0.168506881075111000, -0.168556165888323810, -0.168605450280146200, -0.168654734250454960, -0.168704017799127300, -0.168753300926039180, --0.168802583631067820, -0.168851865914089990, -0.168901147774982940, -0.168950429213622580, -0.168999710229886140, -0.169048990823650410, -0.169098270994792660, -0.169147550743188800, --0.169196830068716050, -0.169246108971251670, -0.169295387450671580, -0.169344665506853010, -0.169393943139672790, -0.169443220349008130, -0.169492497134735020, -0.169541773496730640, --0.169591049434871830, -0.169640324949035830, -0.169689600039098580, -0.169738874704937340, -0.169788148946428910, -0.169837422763450540, -0.169886696155878180, -0.169935969123589080, --0.169985241666460060, -0.170034513784368370, -0.170083785477189940, -0.170133056744802090, -0.170182327587081540, -0.170231598003905670, -0.170280867995150330, -0.170330137560692820, --0.170379406700410410, -0.170428675414179050, -0.170477943701875990, -0.170527211563378110, -0.170576478998562600, -0.170625746007305460, -0.170675012589483950, -0.170724278744974920, --0.170773544473655640, -0.170822809775402040, -0.170872074650091440, -0.170921339097600630, -0.170970603117806930, -0.171019866710586250, -0.171069129875815930, -0.171118392613372780, --0.171167654923134100, -0.171216916804975830, -0.171266178258775270, -0.171315439284409700, -0.171364699881755090, -0.171413960050688760, -0.171463219791087500, -0.171512479102828630, --0.171561737985788140, -0.171610996439843290, -0.171660254464870960, -0.171709512060748410, -0.171758769227351670, -0.171808025964557990, -0.171857282272244260, -0.171906538150287750, --0.171955793598564470, -0.172005048616951710, -0.172054303205326300, -0.172103557363565580, -0.172152811091545540, -0.172202064389143460, -0.172251317256236660, -0.172300569692701130, --0.172349821698414200, -0.172399073273252680, -0.172448324417093930, -0.172497575129813920, -0.172546825411289990, -0.172596075261399000, -0.172645324680018250, -0.172694573667023730, --0.172743822222292810, -0.172793070345702320, -0.172842318037129600, -0.172891565296450640, -0.172940812123542760, -0.172990058518282840, -0.173039304480548240, -0.173088550010214920, --0.173137795107160240, -0.173187039771261510, -0.173236284002394710, -0.173285527800437240, -0.173334771165265940, -0.173384014096758160, -0.173433256594789890, -0.173482498659238480, --0.173531740289980810, -0.173580981486894240, -0.173630222249854800, -0.173679462578739780, -0.173728702473426120, -0.173777941933791120, -0.173827180959710840, -0.173876419551062620, --0.173925657707723340, -0.173974895429570340, -0.174024132716479680, -0.174073369568328670, -0.174122605984994270, -0.174171841966353770, -0.174221077512283220, -0.174270312622659990, --0.174319547297361400, -0.174368781536263530, -0.174418015339243700, -0.174467248706178800, -0.174516481636946250, -0.174565714131422050, -0.174614946189483560, -0.174664177811007710, --0.174713408995871840, -0.174762639743952040, -0.174811870055125610, -0.174861099929269510, -0.174910329366261110, -0.174959558365976460, -0.175008786928292890, -0.175058015053087380, --0.175107242740237230, -0.175156469989618560, -0.175205696801108730, -0.175254923174585080, -0.175304149109923670, -0.175353374607001900, -0.175402599665696680, -0.175451824285885430, --0.175501048467444160, -0.175550272210250270, -0.175599495514180690, -0.175648718379112830, -0.175697940804922740, -0.175747162791487780, -0.175796384338684910, -0.175845605446391520, --0.175894826114483680, -0.175944046342838780, -0.175993266131333760, -0.176042485479846020, -0.176091704388251640, -0.176140922856427990, -0.176190140884252440, -0.176239358471601130, --0.176288575618351430, -0.176337792324380270, -0.176387008589565080, -0.176436224413781930, -0.176485439796908200, -0.176534654738820910, -0.176583869239397400, -0.176633083298513770, --0.176682296916047420, -0.176731510091875350, -0.176780722825874950, -0.176829935117922300, -0.176879146967894810, -0.176928358375669450, -0.176977569341123630, -0.177026779864133450, --0.177075989944576320, -0.177125199582329220, -0.177174408777269530, -0.177223617529273430, -0.177272825838218240, -0.177322033703981450, -0.177371241126439150, -0.177420448105468730, --0.177469654640947190, -0.177518860732751940, -0.177568066380759120, -0.177617271584846110, -0.177666476344889940, -0.177715680660768010, -0.177764884532356450, -0.177814087959532690, --0.177863290942173680, -0.177912493480156890, -0.177961695573358450, -0.178010897221655750, -0.178060098424925820, -0.178109299183046050, -0.178158499495892630, -0.178207699363342940, --0.178256898785274450, -0.178306097761563280, -0.178355296292086850, -0.178404494376722210, -0.178453692015346750, -0.178502889207836610, -0.178552085954069270, -0.178601282253921690, --0.178650478107271360, -0.178699673513994410, -0.178748868473968260, -0.178798062987069930, -0.178847257053176890, -0.178896450672165250, -0.178945643843912510, -0.178994836568295650, --0.179044028845192160, -0.179093220674478140, -0.179142412056031070, -0.179191602989728390, -0.179240793475446280, -0.179289983513062190, -0.179339173102453150, -0.179388362243496610, --0.179437550936068700, -0.179486739180046930, -0.179535926975308320, -0.179585114321730330, -0.179634301219189110, -0.179683487667562150, -0.179732673666726460, -0.179781859216559510, --0.179831044316937500, -0.179880228967737870, -0.179929413168837650, -0.179978596920114360, -0.180027780221444140, -0.180076963072704460, -0.180126145473772810, -0.180175327424525360, --0.180224508924839570, -0.180273689974592530, -0.180322870573661700, -0.180372050721923280, -0.180421230419254700, -0.180470409665533040, -0.180519588460635820, -0.180568766804439170, --0.180617944696820630, -0.180667122137657200, -0.180716299126826410, -0.180765475664204450, -0.180814651749668790, -0.180863827383096500, -0.180913002564365070, -0.180962177293350710, --0.181011351569930900, -0.181060525393982710, -0.181109698765383630, -0.181158871684009900, -0.181208044149738980, -0.181257216162448360, -0.181306387722014290, -0.181355558828314250, --0.181404729481225300, -0.181453899680624970, -0.181503069426389470, -0.181552238718396260, -0.181601407556522490, -0.181650575940645630, -0.181699743870641860, -0.181748911346388760, --0.181798078367763380, -0.181847244934643240, -0.181896411046904540, -0.181945576704424820, -0.181994741907081180, -0.182043906654751090, -0.182093070947310810, -0.182142234784637870, --0.182191398166609760, -0.182240561093102720, -0.182289723563994250, -0.182338885579161500, -0.182388047138481970, -0.182437208241831910, -0.182486368889088780, -0.182535529080129770, --0.182584688814832360, -0.182633848093072790, -0.182683006914728610, -0.182732165279676890, -0.182781323187795190, -0.182830480638959760, -0.182879637633048150, -0.182928794169937430, --0.182977950249505140, -0.183027105871627570, -0.183076261036182210, -0.183125415743046640, -0.183174569992097110, -0.183223723783211140, -0.183272877116265860, -0.183322029991138840, --0.183371182407706280, -0.183420334365845790, -0.183469485865434460, -0.183518636906349840, -0.183567787488468190, -0.183616937611667090, -0.183666087275823620, -0.183715236480815390, --0.183764385226518640, -0.183813533512810910, -0.183862681339569340, -0.183911828706671530, -0.183960975613993690, -0.184010122061413400, -0.184059268048807820, -0.184108413576054510, --0.184157558643029740, -0.184206703249611050, -0.184255847395676050, -0.184304991081100990, -0.184354134305763470, -0.184403277069540600, -0.184452419372309970, -0.184501561213947870, --0.184550702594331840, -0.184599843513339080, -0.184648983970847140, -0.184698123966732300, -0.184747263500872140, -0.184796402573143840, -0.184845541183424970, -0.184894679331591790, --0.184943817017521940, -0.184992954241092520, -0.185042091002181160, -0.185091227300664160, -0.185140363136419070, -0.185189498509323510, -0.185238633419253760, -0.185287767866087440, --0.185336901849701700, -0.185386035369974140, -0.185435168426781040, -0.185484301020000050, -0.185533433149508260, -0.185582564815183370, -0.185631696016901600, -0.185680826754540620, --0.185729957027977570, -0.185779086837090050, -0.185828216181754350, -0.185877345061848160, -0.185926473477248580, -0.185975601427833260, -0.186024728913478490, -0.186073855934061920, --0.186122982489461130, -0.186172108579552440, -0.186221234204213490, -0.186270359363321450, -0.186319484056753970, -0.186368608284387310, -0.186417732046099150, -0.186466855341766660, --0.186515978171267440, -0.186565100534477860, -0.186614222431275540, -0.186663343861537660, -0.186712464825141840, -0.186761585321964440, -0.186810705351883070, -0.186859824914774930, --0.186908944010517660, -0.186958062638987620, -0.187007180800062400, -0.187056298493619680, -0.187105415719535760, -0.187154532477688320, -0.187203648767954530, -0.187252764590212060, --0.187301879944337250, -0.187350994830207730, -0.187400109247700730, -0.187449223196693910, -0.187498336677063560, -0.187547449688687390, -0.187596562231442610, -0.187645674305206840, --0.187694785909856440, -0.187743897045269090, -0.187793007711321990, -0.187842117907892820, -0.187891227634857910, -0.187940336892094940, -0.187989445679481120, -0.188038553996894090, --0.188087661844210270, -0.188136769221307320, -0.188185876128062840, -0.188234982564353250, -0.188284088530056210, -0.188333194025048940, -0.188382299049209140, -0.188431403602413140, --0.188480507684538640, -0.188529611295462860, -0.188578714435063490, -0.188627817103216910, -0.188676919299800770, -0.188726021024692330, -0.188775122277769300, -0.188824223058908000, --0.188873323367986150, -0.188922423204881010, -0.188971522569470220, -0.189020621461630210, -0.189069719881238630, -0.189118817828173190, -0.189167915302310280, -0.189217012303527580, --0.189266108831702330, -0.189315204886712270, -0.189364300468433750, -0.189413395576744470, -0.189462490211521730, -0.189511584372643180, -0.189560678059985220, -0.189609771273425570, --0.189658864012841520, -0.189707956278110710, -0.189757048069109590, -0.189806139385715860, -0.189855230227806790, -0.189904320595260050, -0.189953410487952080, -0.190002499905760600, --0.190051588848563300, -0.190100677316236590, -0.190149765308658180, -0.190198852825705370, -0.190247939867255830, -0.190297026433186050, -0.190346112523373660, -0.190395198137696040, --0.190444283276030830, -0.190493367938254470, -0.190542452124244700, -0.190591535833878810, -0.190640619067034500, -0.190689701823588210, -0.190738784103417660, -0.190787865906400150, --0.190836947232413430, -0.190886028081333900, -0.190935108453039290, -0.190984188347406910, -0.191033267764314510, -0.191082346703638490, -0.191131425165256610, -0.191180503149046580, --0.191229580654884880, -0.191278657682649230, -0.191327734232216940, -0.191376810303465730, -0.191425885896272070, -0.191474961010513700, -0.191524035646067930, -0.191573109802812500, --0.191622183480623850, -0.191671256679379760, -0.191720329398957500, -0.191769401639234890, -0.191818473400088310, -0.191867544681395550, -0.191916615483033960, -0.191965685804881240, --0.192014755646813860, -0.192063825008709610, -0.192112893890446220, -0.192161962291900160, -0.192211030212949220, -0.192260097653470690, -0.192309164613342350, -0.192358231092440660, --0.192407297090643390, -0.192456362607827890, -0.192505427643871910, -0.192554492198651920, -0.192603556272045700, -0.192652619863930590, -0.192701682974184390, -0.192750745602683520, --0.192799807749305770, -0.192848869413928540, -0.192897930596429570, -0.192946991296685300, -0.192996051514573580, -0.193045111249972170, -0.193094170502757540, -0.193143229272807470, --0.193192287559999340, -0.193241345364210950, -0.193290402685318720, -0.193339459523200500, -0.193388515877733650, -0.193437571748795920, -0.193486627136263830, -0.193535682040015170, --0.193584736459927330, -0.193633790395878050, -0.193682843847743900, -0.193731896815402590, -0.193780949298731580, -0.193830001297608610, -0.193879052811910200, -0.193928103841514180, --0.193977154386297870, -0.194026204446139130, -0.194075254020914440, -0.194124303110501610, -0.194173351714778450, -0.194222399833621500, -0.194271447466908530, -0.194320494614516950, --0.194369541276324580, -0.194418587452207910, -0.194467633142044770, -0.194516678345712540, -0.194565723063089060, -0.194614767294050830, -0.194663811038475690, -0.194712854296241020, --0.194761897067224660, -0.194810939351303090, -0.194859981148354210, -0.194909022458255340, -0.194958063280884390, -0.195007103616117810, -0.195056143463833490, -0.195105182823909230, --0.195154221696221600, -0.195203260080648420, -0.195252297977067060, -0.195301335385355410, -0.195350372305389990, -0.195399408737048640, -0.195448444680208750, -0.195497480134748190, --0.195546515100543490, -0.195595549577472520, -0.195644583565412670, -0.195693617064241790, -0.195742650073836450, -0.195791682594074480, -0.195840714624833300, -0.195889746165990750, --0.195938777217423420, -0.195987807779009120, -0.196036837850625760, -0.196085867432149870, -0.196134896523459310, -0.196183925124431500, -0.196232953234944330, -0.196281980854874330, --0.196331007984099390, -0.196380034622496900, -0.196429060769944790, -0.196478086426319590, -0.196527111591499160, -0.196576136265360940, -0.196625160447782830, -0.196674184138641380, --0.196723207337814480, -0.196772230045179570, -0.196821252260614500, -0.196870273983995870, -0.196919295215201550, -0.196968315954109440, -0.197017336200596080, -0.197066355954539420, --0.197115375215816850, -0.197164393984306270, -0.197213412259884260, -0.197262430042428740, -0.197311447331817130, -0.197360464127927350, -0.197409480430635970, -0.197458496239820900, --0.197507511555359590, -0.197556526377129920, -0.197605540705008490, -0.197654554538873230, -0.197703567878601580, -0.197752580724071450, -0.197801593075159430, -0.197850604931743420, --0.197899616293700900, -0.197948627160909770, -0.197997637533246650, -0.198046647410589420, -0.198095656792816020, -0.198144665679803040, -0.198193674071428380, -0.198242681967569560, --0.198291689368104460, -0.198340696272909710, -0.198389702681863210, -0.198438708594842440, -0.198487714011725350, -0.198536718932388530, -0.198585723356709930, -0.198634727284567020, --0.198683730715837700, -0.198732733650398650, -0.198781736088127740, -0.198830738028902500, -0.198879739472600870, -0.198928740419099440, -0.198977740868276160, -0.199026740820008960, --0.199075740274174460, -0.199124739230650630, -0.199173737689314960, -0.199222735650045360, -0.199271733112718480, -0.199320730077212290, -0.199369726543404260, -0.199418722511172350, --0.199467717980393200, -0.199516712950944780, -0.199565707422704550, -0.199614701395550490, -0.199663694869359230, -0.199712687844008750, -0.199761680319376550, -0.199810672295340580, --0.199859663771777500, -0.199908654748565260, -0.199957645225581820, -0.200006635202703810, -0.200055624679809220, -0.200104613656775590, -0.200153602133480850, -0.200202590109801680, --0.200251577585616010, -0.200300564560801420, -0.200349551035235830, -0.200398537008795950, -0.200447522481359720, -0.200496507452804670, -0.200545491923008800, -0.200594475891848760, --0.200643459359202550, -0.200692442324947680, -0.200741424788962120, -0.200790406751122590, -0.200839388211307040, -0.200888369169392980, -0.200937349625258470, -0.200986329578780150, --0.201035309029835990, -0.201084287978304020, -0.201133266424060870, -0.201182244366984560, -0.201231221806952630, -0.201280198743843090, -0.201329175177532630, -0.201378151107899220, --0.201427126534820450, -0.201476101458174270, -0.201525075877837410, -0.201574049793687870, -0.201623023205603210, -0.201671996113461400, -0.201720968517139190, -0.201769940416514550, --0.201818911811465080, -0.201867882701868730, -0.201916853087602270, -0.201965822968543650, -0.202014792344570930, -0.202063761215560770, -0.202112729581391230, -0.202161697441939850, --0.202210664797084660, -0.202259631646702380, -0.202308597990671020, -0.202357563828868190, -0.202406529161171860, -0.202455493987458770, -0.202504458307606940, -0.202553422121493990, --0.202602385428997890, -0.202651348229995420, -0.202700310524364570, -0.202749272311982920, -0.202798233592728560, -0.202847194366478160, -0.202896154633109780, -0.202945114392501460, --0.202994073644529900, -0.203043032389073150, -0.203091990626008830, -0.203140948355214980, -0.203189905576568320, -0.203238862289946890, -0.203287818495228310, -0.203336774192290600, --0.203385729381010540, -0.203434684061266140, -0.203483638232935050, -0.203532591895895290, -0.203581545050023600, -0.203630497695198090, -0.203679449831296290, -0.203728401458196320, --0.203777352575774920, -0.203826303183910120, -0.203875253282480020, -0.203924202871361320, -0.203973151950432140, -0.204022100519570070, -0.204071048578653190, -0.204119996127558240, --0.204168943166163320, -0.204217889694346010, -0.204266835711984450, -0.204315781218955360, -0.204364726215136790, -0.204413670700406420, -0.204462614674642300, -0.204511558137721230, --0.204560501089521230, -0.204609443529920000, -0.204658385458795610, -0.204707326876024800, -0.204756267781485670, -0.204805208175055880, -0.204854148056613510, -0.204903087426035330, --0.204952026283199450, -0.205000964627983890, -0.205049902460265530, -0.205098839779922380, -0.205147776586832170, -0.205196712880872930, -0.205245648661921460, -0.205294583929855890, --0.205343518684553860, -0.205392452925893450, -0.205441386653751500, -0.205490319868006060, -0.205539252568534840, -0.205588184755215900, -0.205637116427926060, -0.205686047586543460, --0.205734978230945720, -0.205783908361010990, -0.205832837976616030, -0.205881767077638970, -0.205930695663957970, -0.205979623735449760, -0.206028551291992490, -0.206077478333463850, --0.206126404859741960, -0.206175330870703610, -0.206224256366226930, -0.206273181346189600, -0.206322105810469780, -0.206371029758944250, -0.206419953191491150, -0.206468876107988140, --0.206517798508313420, -0.206566720392343720, -0.206615641759957250, -0.206664562611031670, -0.206713482945445120, -0.206762402763074420, -0.206811322063797740, -0.206860240847493160, --0.206909159114037540, -0.206958076863309030, -0.207006994095185330, -0.207055910809544580, -0.207104827006263620, -0.207153742685220600, -0.207202657846293210, -0.207251572489359630, --0.207300486614296650, -0.207349400220982470, -0.207398313309294810, -0.207447225879111770, -0.207496137930310240, -0.207545049462768390, -0.207593960476363890, -0.207642870970974950, --0.207691780946478360, -0.207740690402752340, -0.207789599339674590, -0.207838507757123290, -0.207887415654975260, -0.207936323033108690, -0.207985229891401780, -0.208034136229731330, --0.208083042047975560, -0.208131947346012170, -0.208180852123719340, -0.208229756380973960, -0.208278660117654200, -0.208327563333637780, -0.208376466028802890, -0.208425368203026370, --0.208474269856186470, -0.208523170988160870, -0.208572071598827790, -0.208620971688064090, -0.208669871255747960, -0.208718770301757170, -0.208767668825969870, -0.208816566828262970, --0.208865464308514630, -0.208914361266603090, -0.208963257702405200, -0.209012153615799200, -0.209061049006662780, -0.209109943874874170, -0.209158838220310280, -0.209207732042849290, --0.209256625342368970, -0.209305518118747540, -0.209354410371861840, -0.209403302101590140, -0.209452193307810200, -0.209501083990400180, -0.209549974149237040, -0.209598863784198950, --0.209647752895163710, -0.209696641482009500, -0.209745529544613290, -0.209794417082853210, -0.209843304096607560, -0.209892190585753200, -0.209941076550168360, -0.209989961989730830, --0.210038846904318840, -0.210087731293809280, -0.210136615158080410, -0.210185498497010010, -0.210234381310476280, -0.210283263598356170, -0.210332145360527910, -0.210381026596869270, --0.210429907307258500, -0.210478787491572530, -0.210527667149689600, -0.210576546281487480, -0.210625424886844440, -0.210674302965637410, -0.210723180517744630, -0.210772057543044320, --0.210820934041413420, -0.210869810012730200, -0.210918685456872450, -0.210967560373718440, -0.211016434763145080, -0.211065308625030620, -0.211114181959252910, -0.211163054765690170, --0.211211927044219370, -0.211260798794718730, -0.211309670017066100, -0.211358540711139740, -0.211407410876816610, -0.211456280513974910, -0.211505149622492530, -0.211554018202247730, --0.211602886253117430, -0.211651753774979910, -0.211700620767713010, -0.211749487231194990, -0.211798353165302820, -0.211847218569914790, -0.211896083444909120, -0.211944947790162820, --0.211993811605554140, -0.212042674890960930, -0.212091537646261460, -0.212140399871332740, -0.212189261566053000, -0.212238122730300100, -0.212286983363952350, -0.212335843466886690, --0.212384703038981440, -0.212433562080114410, -0.212482420590163920, -0.212531278569006940, -0.212580136016521790, -0.212628992932586270, -0.212677849317078700, -0.212726705169876100, --0.212775560490856720, -0.212824415279898870, -0.212873269536879540, -0.212922123261677060, -0.212970976454169240, -0.213019829114234450, -0.213068681241749630, -0.213117532836593100, --0.213166383898642760, -0.213215234427776870, -0.213264084423872490, -0.213312933886807890, -0.213361782816460930, -0.213410631212709980, -0.213459479075432000, -0.213508326404505320, --0.213557173199807830, -0.213606019461217850, -0.213654865188612380, -0.213703710381869750, -0.213752555040868260, -0.213801399165484960, -0.213850242755598160, -0.213899085811085770, --0.213947928331826100, -0.213996770317696150, -0.214045611768574280, -0.214094452684338410, -0.214143293064866820, -0.214192132910036550, -0.214240972219725960, -0.214289810993812950, --0.214338649232175830, -0.214387486934691670, -0.214436324101238780, -0.214485160731695070, -0.214533996825938930, -0.214582832383847340, -0.214631667405298650, -0.214680501890170820, --0.214729335838342170, -0.214778169249689730, -0.214827002124091860, -0.214875834461426940, -0.214924666261572000, -0.214973497524405390, -0.215022328249805020, -0.215071158437649290, --0.215119988087815210, -0.215168817200181160, -0.215217645774625070, -0.215266473811025320, -0.215315301309258940, -0.215364128269204290, -0.215412954690739340, -0.215461780573742430, --0.215510605918090630, -0.215559430723662320, -0.215608254990335420, -0.215657078717988340, -0.215705901906498100, -0.215754724555743130, -0.215803546665601780, -0.215852368235951140, --0.215901189266669540, -0.215950009757635010, -0.215998829708725860, -0.216047649119819220, -0.216096467990793460, -0.216145286321526520, -0.216194104111896800, -0.216242921361781390, --0.216291738071058670, -0.216340554239606600, -0.216389369867303590, -0.216438184954026700, -0.216486999499654360, -0.216535813504064530, -0.216584626967135600, -0.216633439888744670, --0.216682252268770140, -0.216731064107090390, -0.216779875403582570, -0.216828686158125060, -0.216877496370595830, -0.216926306040873290, -0.216975115168834550, -0.217023923754358030, --0.217072731797321700, -0.217121539297603970, -0.217170346255081970, -0.217219152669634100, -0.217267958541138340, -0.217316763869473130, -0.217365568654515560, -0.217414372896144070, --0.217463176594236670, -0.217511979748671730, -0.217560782359326440, -0.217609584426079170, -0.217658385948808370, -0.217707186927391190, -0.217755987361706040, -0.217804787251630910, --0.217853586597044240, -0.217902385397823200, -0.217951183653846160, -0.217999981364991190, -0.218048778531136690, -0.218097575152159800, -0.218146371227938980, -0.218195166758352240, --0.218243961743278010, -0.218292756182593440, -0.218341550076177000, -0.218390343423906670, -0.218439136225660910, -0.218487928481316870, -0.218536720190753010, -0.218585511353847380, --0.218634301970478370, -0.218683092040523190, -0.218731881563860280, -0.218780670540368090, -0.218829458969923780, -0.218878246852405840, -0.218927034187692300, -0.218975820975661570, --0.219024607216190880, -0.219073392909158670, -0.219122178054442950, -0.219170962651922260, -0.219219746701473710, -0.219268530202975790, -0.219317313156306540, -0.219366095561344450, --0.219414877417966700, -0.219463658726051750, -0.219512439485477630, -0.219561219696122860, -0.219609999357864630, -0.219658778470581380, -0.219707557034151600, -0.219756335048452520, --0.219805112513362600, -0.219853889428759890, -0.219902665794522890, -0.219951441610528790, -0.220000216876656110, -0.220048991592782850, -0.220097765758787590, -0.220146539374547450, --0.220195312439940950, -0.220244084954846210, -0.220292856919141660, -0.220341628332704540, -0.220390399195413370, -0.220439169507146180, -0.220487939267781490, -0.220536708477196530, --0.220585477135269800, -0.220634245241879830, -0.220683012796903780, -0.220731779800220210, -0.220780546251707200, -0.220829312151243270, -0.220878077498705580, -0.220926842293972750, --0.220975606536922780, -0.221024370227434240, -0.221073133365384340, -0.221121895950651600, -0.221170657983114140, -0.221219419462650450, -0.221268180389137760, -0.221316940762454640, --0.221365700582479170, -0.221414459849089890, -0.221463218562164030, -0.221511976721580100, -0.221560734327216240, -0.221609491378950970, -0.221658247876661550, -0.221707003820226510, --0.221755759209524390, -0.221804514044432440, -0.221853268324829210, -0.221902022050592810, -0.221950775221601780, -0.221999527837733380, -0.222048279898866160, -0.222097031404878240, --0.222145782355648160, -0.222194532751053220, -0.222243282590971920, -0.222292031875282460, -0.222340780603863310, -0.222389528776591790, -0.222438276393346460, -0.222487023454005420, --0.222535769958447260, -0.222584515906549240, -0.222633261298189920, -0.222682006133247900, -0.222730750411600430, -0.222779494133126060, -0.222828237297702990, -0.222876979905209740, --0.222925721955523600, -0.222974463448523170, -0.223023204384086570, -0.223071944762092410, -0.223120684582417930, -0.223169423844941760, -0.223218162549542020, -0.223266900696097310, --0.223315638284484920, -0.223364375314583450, -0.223413111786271020, -0.223461847699426230, -0.223510583053926400, -0.223559317849650140, -0.223608052086475970, -0.223656785764281270, --0.223705518882944600, -0.223754251442344120, -0.223802983442358470, -0.223851714882864900, -0.223900445763742070, -0.223949176084868110, -0.223997905846121640, -0.224046635047379980, --0.224095363688521730, -0.224144091769425070, -0.224192819289968620, -0.224241546250029680, -0.224290272649486870, -0.224338998488218390, -0.224387723766102830, -0.224436448483017550, --0.224485172638841130, -0.224533896233452240, -0.224582619266728150, -0.224631341738547510, -0.224680063648788540, -0.224728784997329820, -0.224777505784048700, -0.224826226008823850, --0.224874945671533400, -0.224923664772056050, -0.224972383310269090, -0.225021101286051160, -0.225069818699280500, -0.225118535549835710, -0.225167251837594150, -0.225215967562434450, --0.225264682724234860, -0.225313397322873980, -0.225362111358229170, -0.225410824830179070, -0.225459537738601950, -0.225508250083376380, -0.225556961864379760, -0.225605673081490740, --0.225654383734587990, -0.225703093823548810, -0.225751803348251930, -0.225800512308575510, -0.225849220704398250, -0.225897928535597540, -0.225946635802051960, -0.225995342503639810, --0.226044048640239750, -0.226092754211729110, -0.226141459217986620, -0.226190163658890440, -0.226238867534319320, -0.226287570844150580, -0.226336273588262920, -0.226384975766534570, --0.226433677378844210, -0.226482378425069240, -0.226531078905088310, -0.226579778818780140, -0.226628478166022050, -0.226677176946692790, -0.226725875160670580, -0.226774572807834110, --0.226823269888060790, -0.226871966401229280, -0.226920662347217890, -0.226969357725905240, -0.227018052537168780, -0.227066746780887170, -0.227115440456938710, -0.227164133565202070, --0.227212826105554680, -0.227261518077875200, -0.227310209482041950, -0.227358900317933600, -0.227407590585427560, -0.227456280284402540, -0.227504969414737270, -0.227553657976309140, --0.227602345968996870, -0.227651033392678700, -0.227699720247233420, -0.227748406532538390, -0.227797092248472330, -0.227845777394913570, -0.227894461971740790, -0.227943145978831420, --0.227991829416064160, -0.228040512283317370, -0.228089194580469700, -0.228137876307398620, -0.228186557463982860, -0.228235238050100680, -0.228283918065630860, -0.228332597510450820, --0.228381276384439250, -0.228429954687474540, -0.228478632419435330, -0.228527309580199120, -0.228575986169644640, -0.228624662187650650, -0.228673337634094530, -0.228722012508855100, --0.228770686811810620, -0.228819360542839860, -0.228868033701820270, -0.228916706288630590, -0.228965378303149140, -0.229014049745254690, -0.229062720614824690, -0.229111390911737880, --0.229160060635872580, -0.229208729787107570, -0.229257398365320300, -0.229306066370389560, -0.229354733802193620, -0.229403400660611300, -0.229452066945520030, -0.229500732656798600, --0.229549397794325760, -0.229598062357979000, -0.229646726347637080, -0.229695389763178350, -0.229744052604481580, -0.229792714871424250, -0.229841376563885150, -0.229890037681742570, --0.229938698224875340, -0.229987358193160930, -0.230036017586478150, -0.230084676404705310, -0.230133334647721200, -0.230181992315403340, -0.230230649407630490, -0.230279305924281000, --0.230327961865233720, -0.230376617230366070, -0.230425272019556870, -0.230473926232684950, -0.230522579869627760, -0.230571232930264130, -0.230619885414472430, -0.230668537322131440, --0.230717188653118660, -0.230765839407312930, -0.230814489584592580, -0.230863139184836450, -0.230911788207922050, -0.230960436653728170, -0.231009084522133200, -0.231057731813015950, --0.231106378526253930, -0.231155024661725970, -0.231203670219310460, -0.231252315198886200, -0.231300959600330700, -0.231349603423522810, -0.231398246668341360, -0.231446889334663840, --0.231495531422369120, -0.231544172931335560, -0.231592813861442010, -0.231641454212565990, -0.231690093984586310, -0.231738733177381420, -0.231787371790830120, -0.231836009824809950, --0.231884647279199770, -0.231933284153877980, -0.231981920448723400, -0.232030556163613590, -0.232079191298427380, -0.232127825853043200, -0.232176459827339890, -0.232225093221195000, --0.232273726034487370, -0.232322358267095440, -0.232370989918898010, -0.232419620989772700, -0.232468251479598350, -0.232516881388253770, -0.232565510715616600, -0.232614139461565620, --0.232662767625979290, -0.232711395208736490, -0.232760022209714760, -0.232808648628792970, -0.232857274465849560, -0.232905899720763390, -0.232954524393412050, -0.233003148483674400, --0.233051771991428870, -0.233100394916554350, -0.233149017258928420, -0.233197639018429940, -0.233246260194937350, -0.233294880788329550, -0.233343500798484120, -0.233392120225279940, --0.233440739068595890, -0.233489357328309550, -0.233537975004299820, -0.233586592096445170, -0.233635208604624440, -0.233683824528715280, -0.233732439868596570, -0.233781054624146750, --0.233829668795244690, -0.233878282381768080, -0.233926895383595730, -0.233975507800606160, -0.234024119632678250, -0.234072730879689610, -0.234121341541519120, -0.234169951618045300, --0.234218561109147020, -0.234267170014701900, -0.234315778334588890, -0.234364386068686840, -0.234412993216873390, -0.234461599779027450, -0.234510205755027540, -0.234558811144752520, --0.234607415948080040, -0.234656020164889040, -0.234704623795057990, -0.234753226838465810, -0.234801829294990110, -0.234850431164509850, -0.234899032446903520, -0.234947633142050030, --0.234996233249827050, -0.235044832770113450, -0.235093431702787790, -0.235142030047728990, -0.235190627804814640, -0.235239224973923770, -0.235287821554934830, -0.235336417547726750, --0.235385012952177200, -0.235433607768165130, -0.235482201995569460, -0.235530795634267850, -0.235579388684139250, -0.235627981145062200, -0.235676573016915610, -0.235725164299577160, --0.235773754992925800, -0.235822345096840050, -0.235870934611198870, -0.235919523535879920, -0.235968111870762160, -0.236016699615724130, -0.236065286770644780, -0.236113873335401760, --0.236162459309874090, -0.236211044693940250, -0.236259629487479250, -0.236308213690368720, -0.236356797302487680, -0.236405380323715050, -0.236453962753928580, -0.236502544593007180, --0.236551125840829410, -0.236599706497274270, -0.236648286562219420, -0.236696866035543850, -0.236745444917126120, -0.236794023206845230, -0.236842600904578810, -0.236891178010205930, --0.236939754523605080, -0.236988330444655280, -0.237036905773234250, -0.237085480509220900, -0.237134054652493900, -0.237182628202932180, -0.237231201160413440, -0.237279773524816720, --0.237328345296020980, -0.237376916473903960, -0.237425487058344630, -0.237474057049221620, -0.237522626446413860, -0.237571195249799110, -0.237619763459256390, -0.237668331074664230, --0.237716898095901710, -0.237765464522846500, -0.237814030355377630, -0.237862595593373670, -0.237911160236713660, -0.237959724285275310, -0.238008287738937670, -0.238056850597579310, --0.238105412861079250, -0.238153974529315220, -0.238202535602166250, -0.238251096079511370, -0.238299655961228350, -0.238348215247196150, -0.238396773937293440, -0.238445332031399200, --0.238493889529391210, -0.238542446431148520, -0.238591002736549710, -0.238639558445473800, -0.238688113557798560, -0.238736668073403050, -0.238785221992165870, -0.238833775313966070, --0.238882328038681400, -0.238930880166190910, -0.238979431696373200, -0.239027982629107380, -0.239076532964271140, -0.239125082701743570, -0.239173631841403310, -0.239222180383129400, --0.239270728326799580, -0.239319275672292970, -0.239367822419488590, -0.239416368568264230, -0.239464914118498930, -0.239513459070071380, -0.239562003422860580, -0.239610547176744350, --0.239659090331601770, -0.239707632887311450, -0.239756174843752470, -0.239804716200802630, -0.239853256958341000, -0.239901797116246230, -0.239950336674397390, -0.239998875632672280, --0.240047413990949980, -0.240095951749109170, -0.240144488907028890, -0.240193025464586960, -0.240241561421662450, -0.240290096778134480, -0.240338631533880850, -0.240387165688780630, --0.240435699242712490, -0.240484232195555540, -0.240532764547187580, -0.240581296297487700, -0.240629827446334600, -0.240678357993607340, -0.240726887939183760, -0.240775417282942970, --0.240823946024763620, -0.240872474164524840, -0.240921001702104450, -0.240969528637381580, -0.241018054970234850, -0.241066580700543430, -0.241115105828185130, -0.241163630353039060, --0.241212154274984350, -0.241260677593898830, -0.241309200309661580, -0.241357722422151370, -0.241406243931247270, -0.241454764836827120, -0.241503285138770060, -0.241551804836954820, --0.241600323931260460, -0.241648842421564870, -0.241697360307747190, -0.241745877589686080, -0.241794394267260740, -0.241842910340348970, -0.241891425808829910, -0.241939940672582290, --0.241988454931485270, -0.242036968585416650, -0.242085481634255640, -0.242133994077880920, -0.242182505916171630, -0.242231017149005660, -0.242279527776262130, -0.242328037797820220, --0.242376547213557810, -0.242425056023353990, -0.242473564227087550, -0.242522071824637640, -0.242570578815882090, -0.242619085200700140, -0.242667590978970420, -0.242716096150572190, --0.242764600715383280, -0.242813104673282880, -0.242861608024149720, -0.242910110767862950, -0.242958612904300490, -0.243007114433341470, -0.243055615354864700, -0.243104115668749290, --0.243152615374873180, -0.243201114473115540, -0.243249612963355540, -0.243298110845471070, -0.243346608119341310, -0.243395104784845050, -0.243443600841861450, -0.243492096290268410, --0.243540591129945140, -0.243589085360770400, -0.243637578982623370, -0.243686071995381950, -0.243734564398925350, -0.243783056193132370, -0.243831547377882150, -0.243880037953052630, --0.243928527918523040, -0.243977017274172120, -0.244025506019879070, -0.244073994155521830, -0.244122481680979640, -0.244170968596131630, -0.244219454900855780, -0.244267940595031320, --0.244316425678536980, -0.244364910151252030, -0.244413394013054340, -0.244461877263823210, -0.244510359903437340, -0.244558841931776020, -0.244607323348717180, -0.244655804154140010, --0.244704284347923350, -0.244752763929946380, -0.244801242900087090, -0.244849721258224710, -0.244898199004238010, -0.244946676138006250, -0.244995152659407360, -0.245043628568320570, --0.245092103864625150, -0.245140578548199070, -0.245189052618921520, -0.245237526076671350, -0.245285998921327770, -0.245334471152768770, -0.245382942770873610, -0.245431413775521080, --0.245479884166590450, -0.245528353943959690, -0.245576823107508030, -0.245625291657114300, -0.245673759592657800, -0.245722226914016460, -0.245770693621069540, -0.245819159713695920, --0.245867625191774800, -0.245916090055184190, -0.245964554303803370, -0.246013017937511150, -0.246061480956186820, -0.246109943359708370, -0.246158405147955030, -0.246206866320806160, --0.246255326878139640, -0.246303786819834840, -0.246352246145770560, -0.246400704855826070, -0.246449162949879420, -0.246497620427809840, -0.246546077289496230, -0.246594533534817860, --0.246642989163652710, -0.246691444175880100, -0.246739898571378870, -0.246788352350028330, -0.246836805511706480, -0.246885258056292610, -0.246933709983665590, -0.246982161293704730, --0.247030611986288030, -0.247079062061294820, -0.247127511518604380, -0.247175960358094720, -0.247224408579645170, -0.247272856183134580, -0.247321303168442310, -0.247369749535446330, --0.247418195284025980, -0.247466640414060140, -0.247515084925428120, -0.247563528818007970, -0.247611972091679010, -0.247660414746320110, -0.247708856781810590, -0.247757298198028520, --0.247805738994853200, -0.247854179172163510, -0.247902618729838820, -0.247951057667757160, -0.247999495985797850, -0.248047933683840230, -0.248096370761762360, -0.248144807219443540, --0.248193243056762710, -0.248241678273599190, -0.248290112869831050, -0.248338546845337650, -0.248386980199997860, -0.248435412933691060, -0.248483845046295310, -0.248532276537689920, --0.248580707407753840, -0.248629137656366430, -0.248677567283405760, -0.248725996288751170, -0.248774424672281590, -0.248822852433876360, -0.248871279573413570, -0.248919706090772600, --0.248968131985832340, -0.249016557258472190, -0.249064981908570240, -0.249113405936005810, -0.249161829340658310, -0.249210252122405800, -0.249258674281127630, -0.249307095816702820, --0.249355516729010680, -0.249403937017929320, -0.249452356683338120, -0.249500775725116030, -0.249549194143142420, -0.249597611937295400, -0.249646029107454370, -0.249694445653498240, --0.249742861575306450, -0.249791276872757070, -0.249839691545729490, -0.249888105594102680, -0.249936519017756040, -0.249984931816567670, -0.250033343990416990, -0.250081755539183330, --0.250130166462744890, -0.250178576760981040, -0.250226986433770730, -0.250275395480993370, -0.250323803902527120, -0.250372211698251360, -0.250420618868045060, -0.250469025411787620, --0.250517431329357220, -0.250565836620633250, -0.250614241285494640, -0.250662645323820930, -0.250711048735490110, -0.250759451520381700, -0.250807853678374660, -0.250856255209348400, --0.250904656113181080, -0.250953056389752130, -0.251001456038940970, -0.251049855060625720, -0.251098253454685840, -0.251146651221000330, -0.251195048359448670, -0.251243444869908910, --0.251291840752260520, -0.251340236006382560, -0.251388630632154440, -0.251437024629454280, -0.251485417998161600, -0.251533810738155340, -0.251582202849314980, -0.251630594331518740, --0.251678985184645930, -0.251727375408575700, -0.251775765003187490, -0.251824153968359440, -0.251872542303970940, -0.251920930009901120, -0.251969317086029430, -0.252017703532234020, --0.252066089348394310, -0.252114474534389790, -0.252162859090098720, -0.252211243015400430, -0.252259626310174120, -0.252308008974299110, -0.252356391007653670, -0.252404772410117220, --0.252453153181568910, -0.252501533321888070, -0.252549912830953020, -0.252598291708643170, -0.252646669954837590, -0.252695047569415740, -0.252743424552255900, -0.252791800903237440, --0.252840176622239510, -0.252888551709141540, -0.252936926163821800, -0.252985299986159710, -0.253033673176034810, -0.253082045733325320, -0.253130417657910720, -0.253178788949670050, --0.253227159608482850, -0.253275529634227280, -0.253323899026782930, -0.253372267786028840, -0.253420635911844490, -0.253469003404108110, -0.253517370262699220, -0.253565736487496920, --0.253614102078380750, -0.253662467035228820, -0.253710831357920770, -0.253759195046335650, -0.253807558100352940, -0.253855920519850900, -0.253904282304709070, -0.253952643454806950, --0.254001003970022840, -0.254049363850236190, -0.254097723095326130, -0.254146081705172170, -0.254194439679652610, -0.254242797018646940, -0.254291153722034310, -0.254339509789694160, --0.254387865221504860, -0.254436220017345840, -0.254484574177096360, -0.254532927700635790, -0.254581280587842520, -0.254629632838596020, -0.254677984452775450, -0.254726335430260350, --0.254774685770928990, -0.254823035474660900, -0.254871384541335620, -0.254919732970831480, -0.254968080763028020, -0.255016427917804380, -0.255064774435040050, -0.255113120314613360, --0.255161465556403900, -0.255209810160290760, -0.255258154126153550, -0.255306497453870460, -0.255354840143321220, -0.255403182194384790, -0.255451523606940900, -0.255499864380867750, --0.255548204516044930, -0.255596544012351600, -0.255644882869667300, -0.255693221087870400, -0.255741558666840450, -0.255789895606456650, -0.255838231906598490, -0.255886567567144290, --0.255934902587973740, -0.255983236968966300, -0.256031570710000380, -0.256079903810955520, -0.256128236271710890, -0.256176568092146120, -0.256224899272139480, -0.256273229811570640, --0.256321559710318670, -0.256369888968263240, -0.256418217585282720, -0.256466545561256590, -0.256514872896064120, -0.256563199589584840, -0.256611525641697200, -0.256659851052280730, --0.256708175821214630, -0.256756499948378510, -0.256804823433650740, -0.256853146276910860, -0.256901468478038570, -0.256949790036912210, -0.256998110953411350, -0.257046431227415220, --0.257094750858803400, -0.257143069847454330, -0.257191388193247550, -0.257239705896062320, -0.257288022955778240, -0.257336339372273680, -0.257384655145428300, -0.257432970275121240, --0.257481284761232170, -0.257529598603639500, -0.257577911802222840, -0.257626224356861390, -0.257674536267434750, -0.257722847533821410, -0.257771158155900960, -0.257819468133553000, --0.257867777466655960, -0.257916086155089490, -0.257964394198732740, -0.258012701597465480, -0.258061008351166080, -0.258109314459714080, -0.258157619922988860, -0.258205924740869950, --0.258254228913235850, -0.258302532439966200, -0.258350835320940160, -0.258399137556037490, -0.258447439145136570, -0.258495740088116990, -0.258544040384858120, -0.258592340035239570, --0.258640639039139700, -0.258688937396438280, -0.258737235107014460, -0.258785532170748010, -0.258833828587517360, -0.258882124357202040, -0.258930419479681870, -0.258978713954835240, --0.259027007782541840, -0.259075300962680890, -0.259123593495132140, -0.259171885379773980, -0.259220176616486110, -0.259268467205147730, -0.259316757145638680, -0.259365046437837310, --0.259413335081623290, -0.259461623076875980, -0.259509910423474990, -0.259558197121298790, -0.259606483170227160, -0.259654768570139250, -0.259703053320914920, -0.259751337422432450, --0.259799620874571700, -0.259847903677212280, -0.259896185830232720, -0.259944467333512670, -0.259992748186931470, -0.260041028390368800, -0.260089307943703110, -0.260137586846814210, --0.260185865099581300, -0.260234142701884160, -0.260282419653601270, -0.260330695954612280, -0.260378971604796560, -0.260427246604033880, -0.260475520952202610, -0.260523794649182570, --0.260572067694853030, -0.260620340089093790, -0.260668611831783190, -0.260716882922801150, -0.260765153362027270, -0.260813423149340080, -0.260861692284619360, -0.260909960767744360, --0.260958228598594970, -0.261006495777049490, -0.261054762302987850, -0.261103028176289220, -0.261151293396833520, -0.261199557964499120, -0.261247821879165840, -0.261296085140713010, --0.261344347749020380, -0.261392609703966490, -0.261440871005431060, -0.261489131653293410, -0.261537391647433390, -0.261585650987729460, -0.261633909674061420, -0.261682167706309030, --0.261730425084350790, -0.261778681808066460, -0.261826937877335460, -0.261875193292037510, -0.261923448052051140, -0.261971702157256180, -0.262019955607532000, -0.262068208402758300, --0.262116460542813680, -0.262164712027577910, -0.262212962856930350, -0.262261213030750780, -0.262309462548917790, -0.262357711411311150, -0.262405959617810210, -0.262454207168294820, --0.262502454062643440, -0.262550700300735960, -0.262598945882451750, -0.262647190807670570, -0.262695435076271020, -0.262743678688132860, -0.262791921643135920, -0.262840163941158720, --0.262888405582081150, -0.262936646565782580, -0.262984886892142780, -0.263033126561040390, -0.263081365572355120, -0.263129603925966520, -0.263177841621754280, -0.263226078659597020, --0.263274315039374540, -0.263322550760966280, -0.263370785824252110, -0.263419020229110510, -0.263467253975421370, -0.263515487063064100, -0.263563719491918540, -0.263611951261863210, --0.263660182372778050, -0.263708412824542830, -0.263756642617036190, -0.263804871750137950, -0.263853100223727490, -0.263901328037684730, -0.263949555191888230, -0.263997781686217790, --0.264046007520552960, -0.264094232694773500, -0.264142457208758060, -0.264190681062386470, -0.264238904255538140, -0.264287126788093020, -0.264335348659929640, -0.264383569870927870, --0.264431790420967210, -0.264480010309927520, -0.264528229537687340, -0.264576448104126560, -0.264624666009125150, -0.264672883252561610, -0.264721099834315850, -0.264769315754267380, --0.264817531012295990, -0.264865745608280410, -0.264913959542100400, -0.264962172813635540, -0.265010385422765670, -0.265058597369369430, -0.265106808653326640, -0.265155019274516850, --0.265203229232819970, -0.265251438528114560, -0.265299647160280590, -0.265347855129197450, -0.265396062434745120, -0.265444269076802240, -0.265492475055248640, -0.265540680369963870, --0.265588885020827840, -0.265637089007719150, -0.265685292330517740, -0.265733494989103540, -0.265781696983355130, -0.265829898313152510, -0.265878098978375170, -0.265926298978902960, --0.265974498314614620, -0.266022696985390050, -0.266070894991108700, -0.266119092331650540, -0.266167289006894240, -0.266215485016719710, -0.266263680361006450, -0.266311875039634440, --0.266360069052482270, -0.266408262399430000, -0.266456455080357040, -0.266504647095143320, -0.266552838443667620, -0.266601029125809800, -0.266649219141449840, -0.266697408490466410, --0.266745597172739430, -0.266793785188148500, -0.266841972536573550, -0.266890159217893160, -0.266938345231987450, -0.266986530578735840, -0.267034715258018310, -0.267082899269713630, --0.267131082613701660, -0.267179265289861970, -0.267227447298074570, -0.267275628638218130, -0.267323809310172580, -0.267371989313817560, -0.267420168649032950, -0.267468347315697520, --0.267516525313691190, -0.267564702642894000, -0.267612879303184610, -0.267661055294443060, -0.267709230616548830, -0.267757405269381970, -0.267805579252821170, -0.267853752566746370, --0.267901925211037280, -0.267950097185573720, -0.267998268490234560, -0.268046439124899670, -0.268094609089448710, -0.268142778383761660, -0.268190947007717230, -0.268239114961195460, --0.268287282244075890, -0.268335448856238500, -0.268383614797562060, -0.268431780067926620, -0.268479944667212140, -0.268528108595297410, -0.268576271852062400, -0.268624434437386650, --0.268672596351150320, -0.268720757593232000, -0.268768918163511840, -0.268817078061869390, -0.268865237288184620, -0.268913395842336370, -0.268961553724204610, -0.269009710933668990, --0.269057867470609500, -0.269106023334904910, -0.269154178526435250, -0.269202333045080180, -0.269250486890719680, -0.269298640063232560, -0.269346792562498830, -0.269394944388398060, --0.269443095540810420, -0.269491246019614610, -0.269539395824690660, -0.269587544955918690, -0.269635693413177390, -0.269683841196346860, -0.269731988305306760, -0.269780134739937120, --0.269828280500116650, -0.269876425585725550, -0.269924569996643330, -0.269972713732750170, -0.270020856793924740, -0.270068999180047230, -0.270117140890997140, -0.270165281926654680, --0.270213422286898600, -0.270261561971608940, -0.270309700980665370, -0.270357839313948020, -0.270405976971335620, -0.270454113952708240, -0.270502250257946050, -0.270550385886927760, --0.270598520839533560, -0.270646655115643010, -0.270694788715136300, -0.270742921637892150, -0.270791053883790710, -0.270839185452711630, -0.270887316344535000, -0.270935446559139700, --0.270983576096405720, -0.271031704956212870, -0.271079833138441140, -0.271127960642969400, -0.271176087469677750, -0.271224213618445900, -0.271272339089153940, -0.271320463881680740, --0.271368587995906350, -0.271416711431710920, -0.271464834188973270, -0.271512956267573550, -0.271561077667391400, -0.271609198388307050, -0.271657318430199250, -0.271705437792948150, --0.271753556476433400, -0.271801674480535270, -0.271849791805132470, -0.271897908450105250, -0.271946024415333220, -0.271994139700696580, -0.272042254306074090, -0.272090368231346020, --0.272138481476392080, -0.272186594041092300, -0.272234705925325620, -0.272282817128972180, -0.272330927651911690, -0.272379037494024310, -0.272427146655188910, -0.272475255135285640, --0.272523362934194660, -0.272571470051794830, -0.272619576487966360, -0.272667682242588970, -0.272715787315542750, -0.272763891706706620, -0.272811995415960800, -0.272860098443184980, --0.272908200788259340, -0.272956302451062780, -0.273004403431475470, -0.273052503729377120, -0.273100603344647970, -0.273148702277166870, -0.273196800526814050, -0.273244898093469190, --0.273292994977012480, -0.273341091177322910, -0.273389186694280580, -0.273437281527765750, -0.273485375677657240, -0.273533469143835360, -0.273581561926179770, -0.273629654024570680, --0.273677745438887070, -0.273725836169009030, -0.273773926214816440, -0.273822015576189460, -0.273870104253007010, -0.273918192245149350, -0.273966279552496140, -0.274014366174927690, --0.274062452112322890, -0.274110537364561980, -0.274158621931524680, -0.274206705813091310, -0.274254789009140690, -0.274302871519553130, -0.274350953344208840, -0.274399034482986690, --0.274447114935766960, -0.274495194702429500, -0.274543273782854420, -0.274591352176920770, -0.274639429884508680, -0.274687506905498090, -0.274735583239769100, -0.274783658887200740, --0.274831733847673290, -0.274879808121066440, -0.274927881707260510, -0.274975954606134440, -0.275024026817568550, -0.275072098341442530, -0.275120169177636710, -0.275168239326030020, --0.275216308786502720, -0.275264377558935120, -0.275312445643206120, -0.275360513039196010, -0.275408579746784620, -0.275456645765852210, -0.275504711096277780, -0.275552775737941570, --0.275600839690723350, -0.275648902954503560, -0.275696965529161010, -0.275745027414576070, -0.275793088610628570, -0.275841149117198760, -0.275889208934165690, -0.275937268061409560, --0.275985326498810250, -0.276033384246248070, -0.276081441303602020, -0.276129497670752340, -0.276177553347578930, -0.276225608333962040, -0.276273662629780700, -0.276321716234915250, --0.276369769149245880, -0.276417821372651700, -0.276465872905012950, -0.276513923746209530, -0.276561973896121750, -0.276610023354628590, -0.276658072121610370, -0.276706120196946960, --0.276754167580518680, -0.276802214272204530, -0.276850260271884860, -0.276898305579439560, -0.276946350194748890, -0.276994394117691940, -0.277042437348149040, -0.277090479886000000, --0.277138521731125190, -0.277186562883403650, -0.277234603342715710, -0.277282643108941680, -0.277330682181960660, -0.277378720561652860, -0.277426758247898310, -0.277474795240577280, --0.277522831539568860, -0.277570867144753320, -0.277618902056010640, -0.277666936273221090, -0.277714969796263810, -0.277763002625019070, -0.277811034759366860, -0.277859066199187490, --0.277907096944360050, -0.277955126994764820, -0.278003156350281780, -0.278051185010791290, -0.278099212976172410, -0.278147240246305490, -0.278195266821070930, -0.278243292700347700, --0.278291317884016290, -0.278339342371956620, -0.278387366164048970, -0.278435389260172470, -0.278483411660207510, -0.278531433364034020, -0.278579454371532420, -0.278627474682581700, --0.278675494297062290, -0.278723513214854170, -0.278771531435837720, -0.278819548959891970, -0.278867565786897360, -0.278915581916733820, -0.278963597349281780, -0.279011612084420320, --0.279059626122029840, -0.279107639461990240, -0.279155652104182030, -0.279203664048484230, -0.279251675294777290, -0.279299685842941570, -0.279347695692856220, -0.279395704844401630, --0.279443713297457760, -0.279491721051905060, -0.279539728107622620, -0.279587734464490810, -0.279635740122389730, -0.279683745081199700, -0.279731749340799920, -0.279779752901070710, --0.279827755761892170, -0.279875757923144620, -0.279923759384707260, -0.279971760146460520, -0.280019760208284400, -0.280067759570059250, -0.280115758231664290, -0.280163756192979950, --0.280211753453886660, -0.280259750014263510, -0.280307745873991040, -0.280355741032949190, -0.280403735491018380, -0.280451729248077870, -0.280499722304007990, -0.280547714658688830, --0.280595706312000760, -0.280643697263823040, -0.280691687514036060, -0.280739677062519900, -0.280787665909154940, -0.280835654053820380, -0.280883641496396660, -0.280931628236763880, --0.280979614274802450, -0.281027599610391590, -0.281075584243411670, -0.281123568173743290, -0.281171551401265480, -0.281219533925858860, -0.281267515747403330, -0.281315496865779500, --0.281363477280866470, -0.281411456992544770, -0.281459436000694450, -0.281507414305195940, -0.281555391905928430, -0.281603368802772480, -0.281651344995608120, -0.281699320484315780, --0.281747295268774730, -0.281795269348865450, -0.281843242724468030, -0.281891215395462860, -0.281939187361729290, -0.281987158623147720, -0.282035129179598660, -0.282083099030961400, --0.282131068177116360, -0.282179036617943630, -0.282227004353323820, -0.282274971383136010, -0.282322937707260750, -0.282370903325578180, -0.282418868237968750, -0.282466832444311760, --0.282514795944487700, -0.282562758738376610, -0.282610720825859030, -0.282658682206814280, -0.282706642881122790, -0.282754602848664720, -0.282802562109320530, -0.282850520662969510, --0.282898478509492230, -0.282946435648768760, -0.282994392080679560, -0.283042347805104010, -0.283090302821922550, -0.283138257131015810, -0.283186210732262970, -0.283234163625544600, --0.283282115810740810, -0.283330067287732190, -0.283378018056397950, -0.283425968116618690, -0.283473917468274490, -0.283521866111245970, -0.283569814045412320, -0.283617761270654080, --0.283665707786851520, -0.283713653593885060, -0.283761598691634090, -0.283809543079979080, -0.283857486758800240, -0.283905429727978110, -0.283953371987391960, -0.284001313536922370, --0.284049254376449960, -0.284097194505853970, -0.284145133925015000, -0.284193072633813220, -0.284241010632129140, -0.284288947919842110, -0.284336884496832750, -0.284384820362981130, --0.284432755518167930, -0.284480689962272380, -0.284528623695175120, -0.284576556716756300, -0.284624489026896520, -0.284672420625475100, -0.284720351512372570, -0.284768281687469200, --0.284816211150645590, -0.284864139901781000, -0.284912067940756020, -0.284959995267451360, -0.285007921881746230, -0.285055847783521330, -0.285103772972656820, -0.285151697449033290, --0.285199621212530060, -0.285247544263027790, -0.285295466600406720, -0.285343388224547360, -0.285391309135329060, -0.285439229332632550, -0.285487148816337970, -0.285535067586325910, --0.285582985642475750, -0.285630902984668140, -0.285678819612783300, -0.285726735526701800, -0.285774650726303090, -0.285822565211467710, -0.285870478982075900, -0.285918392038008340, --0.285966304379144390, -0.286014216005364640, -0.286062126916549810, -0.286110037112579210, -0.286157946593333550, -0.286205855358693030, -0.286253763408538250, -0.286301670742748650, --0.286349577361204920, -0.286397483263787170, -0.286445388450376200, -0.286493292920851290, -0.286541196675093200, -0.286589099712982080, -0.286637002034398620, -0.286684903639222280, --0.286732804527333630, -0.286780704698613000, -0.286828604152941040, -0.286876502890197120, -0.286924400910261950, -0.286972298213016230, -0.287020194798339350, -0.287068090666111940, --0.287115985816214280, -0.287163880248527130, -0.287211773962929850, -0.287259666959303110, -0.287307559237527210, -0.287355450797482870, -0.287403341639049460, -0.287451231762107680, --0.287499121166537810, -0.287547009852220590, -0.287594897819035410, -0.287642785066862970, -0.287690671595583590, -0.287738557405077980, -0.287786442495225500, -0.287834326865906930, --0.287882210517002970, -0.287930093448393100, -0.287977975659957920, -0.288025857151577860, -0.288073737923133570, -0.288121617974504530, -0.288169497305571400, -0.288217375916214550, --0.288265253806314680, -0.288313130975751230, -0.288361007424404960, -0.288408883152156240, -0.288456758158885660, -0.288504632444472770, -0.288552506008798340, -0.288600378851742610, --0.288648250973186360, -0.288696122373009070, -0.288743993051091440, -0.288791863007314300, -0.288839732241557070, -0.288887600753700460, -0.288935468543624900, -0.288983335611211090, --0.289031201956338520, -0.289079067578887900, -0.289126932478739660, -0.289174796655774500, -0.289222660109871910, -0.289270522840912700, -0.289318384848777140, -0.289366246133346050, --0.289414106694498960, -0.289461966532116590, -0.289509825646079240, -0.289557684036267860, -0.289605541702561750, -0.289653398644841850, -0.289701254862988420, -0.289749110356882280, --0.289796965126402960, -0.289844819171431180, -0.289892672491847800, -0.289940525087532370, -0.289988376958365550, -0.290036228104227860, -0.290084078524999960, -0.290131928220561440, --0.290179777190793130, -0.290227625435575400, -0.290275472954789000, -0.290323319748313490, -0.290371165816029670, -0.290419011157817930, -0.290466855773559130, -0.290514699663132760, --0.290562542826419580, -0.290610385263300130, -0.290658226973655060, -0.290706067957364030, -0.290753908214307850, -0.290801747744367340, -0.290849586547421990, -0.290897424623352660, --0.290945261972039850, -0.290993098593364250, -0.291040934487205470, -0.291088769653444380, -0.291136604091961350, -0.291184437802637250, -0.291232270785351630, -0.291280103039985310, --0.291327934566418760, -0.291375765364532800, -0.291423595434206980, -0.291471424775322170, -0.291519253387758800, -0.291567081271397740, -0.291614908426118590, -0.291662734851802110, --0.291710560548329220, -0.291758385515579530, -0.291806209753433850, -0.291854033261772670, -0.291901856040476800, -0.291949678089425900, -0.291997499408500780, -0.292045319997581930, --0.292093139856550170, -0.292140958985285190, -0.292188777383667770, -0.292236595051578400, -0.292284411988897990, -0.292332228195506140, -0.292380043671283670, -0.292427858416111130, --0.292475672429869380, -0.292523485712438020, -0.292571298263697930, -0.292619110083529590, -0.292666921171813920, -0.292714731528430470, -0.292762541153260280, -0.292810350046184110, --0.292858158207081610, -0.292905965635833760, -0.292953772332321010, -0.293001578296424200, -0.293049383528023070, -0.293097188026998470, -0.293144991793230840, -0.293192794826601210, --0.293240597126989190, -0.293288398694275640, -0.293336199528341110, -0.293383999629066470, -0.293431798996331480, -0.293479597630016910, -0.293527395530003400, -0.293575192696171830, --0.293622989128401790, -0.293670784826574330, -0.293718579790570370, -0.293766374020269450, -0.293814167515552670, -0.293861960276300400, -0.293909752302393690, -0.293957543593712180, --0.294005334150136800, -0.294053123971548090, -0.294100913057827040, -0.294148701408853240, -0.294196489024507680, -0.294244275904670890, -0.294292062049223870, -0.294339847458046260, --0.294387632131018980, -0.294435416068022650, -0.294483199268938230, -0.294530981733645390, -0.294578763462025050, -0.294626544453958250, -0.294674324709324700, -0.294722104228005320, --0.294769883009880660, -0.294817661054831700, -0.294865438362738210, -0.294913214933481100, -0.294960990766940930, -0.295008765862998730, -0.295056540221534210, -0.295104313842428300, --0.295152086725561650, -0.295199858870815180, -0.295247630278068660, -0.295295400947203020, -0.295343170878098920, -0.295390940070637320, -0.295438708524697890, -0.295486476240161780, --0.295534243216909850, -0.295582009454821880, -0.295629774953778900, -0.295677539713661450, -0.295725303734350630, -0.295773067015726090, -0.295820829557668920, -0.295868591360059610, --0.295916352422779310, -0.295964112745707660, -0.296011872328725780, -0.296059631171714190, -0.296107389274553930, -0.296155146637124780, -0.296202903259307760, -0.296250659140983530, --0.296298414282033020, -0.296346168682336040, -0.296393922341773700, -0.296441675260226520, -0.296489427437575560, -0.296537178873700620, -0.296584929568482760, -0.296632679521803000, --0.296680428733541060, -0.296728177203578080, -0.296775924931794670, -0.296823671918071850, -0.296871418162289460, -0.296919163664328520, -0.296966908424069640, -0.297014652441393910, --0.297062395716181150, -0.297110138248312390, -0.297157880037668300, -0.297205621084129960, -0.297253361387577080, -0.297301100947890810, -0.297348839764951800, -0.297396577838641150, --0.297444315168838570, -0.297492051755425260, -0.297539787598282200, -0.297587522697289280, -0.297635257052327520, -0.297682990663277640, -0.297730723530020670, -0.297778455652436550, --0.297826187030406200, -0.297873917663810440, -0.297921647552530310, -0.297969376696445580, -0.298017105095437440, -0.298064832749386550, -0.298112559658174010, -0.298160285821679640, --0.298208011239784580, -0.298255735912369420, -0.298303459839315390, -0.298351183020502290, -0.298398905455811210, -0.298446627145123320, -0.298494348088318430, -0.298542068285277680, --0.298589787735881740, -0.298637506440011750, -0.298685224397547580, -0.298732941608370330, -0.298780658072360760, -0.298828373789399910, -0.298876088759367780, -0.298923802982145380, --0.298971516457613500, -0.299019229185653210, -0.299066941166144460, -0.299114652398968340, -0.299162362884005610, -0.299210072621137410, -0.299257781610243580, -0.299305489851205250, --0.299353197343903250, -0.299400904088218680, -0.299448610084031450, -0.299496315331222620, -0.299544019829673490, -0.299591723579263890, -0.299639426579874910, -0.299687128831387430, --0.299734830333682530, -0.299782531086640160, -0.299830231090141400, -0.299877930344067120, -0.299925628848298430, -0.299973326602715200, -0.300021023607198680, -0.300068719861629580, --0.300116415365889180, -0.300164110119857220, -0.300211804123415080, -0.300259497376443360, -0.300307189878823320, -0.300354881630434940, -0.300402572631159330, -0.300450262880877670, --0.300497952379469970, -0.300545641126817360, -0.300593329122800680, -0.300641016367301120, -0.300688702860198550, -0.300736388601374250, -0.300784073590708970, -0.300831757828083910, --0.300879441313379010, -0.300927124046475590, -0.300974806027254290, -0.301022487255596440, -0.301070167731381900, -0.301117847454491990, -0.301165526424807430, -0.301213204642209520, --0.301260882106578140, -0.301308558817794560, -0.301356234775740030, -0.301403909980294430, -0.301451584431339130, -0.301499258128754830, -0.301546931072422810, -0.301594603262223040, --0.301642274698036730, -0.301689945379744750, -0.301737615307228370, -0.301785284480367510, -0.301832952899043440, -0.301880620563136970, -0.301928287472529370, -0.301975953627100670, --0.302023619026732030, -0.302071283671304370, -0.302118947560698900, -0.302166610694795670, -0.302214273073475930, -0.302261934696620880, -0.302309595564110630, -0.302357255675826330, --0.302404915031648960, -0.302452573631459660, -0.302500231475138550, -0.302547888562566810, -0.302595544893625390, -0.302643200468195480, -0.302690855286157190, -0.302738509347391770, --0.302786162651780040, -0.302833815199203380, -0.302881466989541710, -0.302929118022676410, -0.302976768298488300, -0.303024417816858680, -0.303072066577667610, -0.303119714580796340, --0.303167361826125860, -0.303215008313537320, -0.303262654042910860, -0.303310299014127760, -0.303357943227069380, -0.303405586681615660, -0.303453229377648010, -0.303500871315047270, --0.303548512493694740, -0.303596152913470580, -0.303643792574256000, -0.303691431475931920, -0.303739069618379710, -0.303786707001479420, -0.303834343625112360, -0.303881979489159400, --0.303929614593501930, -0.303977248938020030, -0.304024882522594960, -0.304072515347107720, -0.304120147411439610, -0.304167778715470680, -0.304215409259082360, -0.304263039042155900, --0.304310668064571410, -0.304358296326210250, -0.304405923826953360, -0.304453550566682110, -0.304501176545276530, -0.304548801762618000, -0.304596426218587510, -0.304644049913066370, --0.304691672845934620, -0.304739295017073750, -0.304786916426364630, -0.304834537073688630, -0.304882156958925900, -0.304929776081957700, -0.304977394442665140, -0.305025012040929470, --0.305072628876630890, -0.305120244949650680, -0.305167860259870300, -0.305215474807169870, -0.305263088591430750, -0.305310701612533930, -0.305358313870360720, -0.305405925364791330, --0.305453536095707130, -0.305501146062989120, -0.305548755266518590, -0.305596363706175820, -0.305643971381842130, -0.305691578293398490, -0.305739184440726340, -0.305786789823705770, --0.305834394442218270, -0.305881998296144760, -0.305929601385366680, -0.305977203709764220, -0.306024805269218710, -0.306072406063611190, -0.306120006092823080, -0.306167605356734480, --0.306215203855226940, -0.306262801588181810, -0.306310398555479200, -0.306357994757000650, -0.306405590192627090, -0.306453184862239990, -0.306500778765719460, -0.306548371902947040, --0.306595964273803650, -0.306643555878170770, -0.306691146715928620, -0.306738736786958570, -0.306786326091141700, -0.306833914628359410, -0.306881502398491930, -0.306929089401420720, --0.306976675637026740, -0.307024261105191540, -0.307071845805795220, -0.307119429738719310, -0.307167012903845240, -0.307214595301053220, -0.307262176930224670, -0.307309757791240760, --0.307357337883982780, -0.307404917208331130, -0.307452495764167110, -0.307500073551371880, -0.307547650569826910, -0.307595226819412370, -0.307642802300009790, -0.307690377011500150, --0.307737950953765050, -0.307785524126684580, -0.307833096530140350, -0.307880668164013380, -0.307928239028185170, -0.307975809122535920, -0.308023378446947160, -0.308070947001300330, --0.308118514785475750, -0.308166081799354900, -0.308213648042818810, -0.308261213515749030, -0.308308778218025830, -0.308356342149530670, -0.308403905310144610, -0.308451467699749240, --0.308499029318224820, -0.308546590165452770, -0.308594150241314260, -0.308641709545690810, -0.308689268078462640, -0.308736825839511290, -0.308784382828717900, -0.308831939045964010, --0.308879494491129780, -0.308927049164096860, -0.308974603064746280, -0.309022156192959640, -0.309069708548617210, -0.309117260131600460, -0.309164810941791050, -0.309212360979069120, --0.309259910243316340, -0.309307458734413730, -0.309355006452242950, -0.309402553396684210, -0.309450099567619100, -0.309497644964928710, -0.309545189588494640, -0.309592733438197150, --0.309640276513917900, -0.309687818815537920, -0.309735360342938800, -0.309782901096000870, -0.309830441074605670, -0.309877980278634390, -0.309925518707968580, -0.309973056362488510, --0.310020593242075870, -0.310068129346612100, -0.310115664675977620, -0.310163199230053980, -0.310210733008722370, -0.310258266011864290, -0.310305798239360160, -0.310353329691091530, --0.310400860366939590, -0.310448390266785890, -0.310495919390510800, -0.310543447737995910, -0.310590975309122440, -0.310638502103771920, -0.310686028121824720, -0.310733553363162440, --0.310781077827666290, -0.310828601515217850, -0.310876124425697510, -0.310923646558986850, -0.310971167914967540, -0.311018688493519820, -0.311066208294525410, -0.311113727317865460, --0.311161245563421670, -0.311208763031074250, -0.311256279720705020, -0.311303795632195010, -0.311351310765425990, -0.311398825120278280, -0.311446338696633460, -0.311493851494372810, --0.311541363513377970, -0.311588874753529250, -0.311636385214708380, -0.311683894896796540, -0.311731403799675400, -0.311778911923225320, -0.311826419267327960, -0.311873925831864960, --0.311921431616716760, -0.311968936621764950, -0.312016440846890840, -0.312063944291975980, -0.312111446956900910, -0.312158948841547160, -0.312206449945796050, -0.312253950269529290, --0.312301449812627200, -0.312348948574971470, -0.312396446556443390, -0.312443943756924580, -0.312491440176295490, -0.312538935814437870, -0.312586430671232820, -0.312633924746562150, --0.312681418040306300, -0.312728910552346860, -0.312776402282565150, -0.312823893230842810, -0.312871383397060390, -0.312918872781099480, -0.312966361382841780, -0.313013849202167790, --0.313061336238959150, -0.313108822493097240, -0.313156307964463640, -0.313203792652938850, -0.313251276558404570, -0.313298759680742110, -0.313346242019833190, -0.313393723575558230, --0.313441204347798930, -0.313488684336436670, -0.313536163541353050, -0.313583641962428660, -0.313631119599545150, -0.313678596452583890, -0.313726072521426480, -0.313773547805953510, --0.313821022306046690, -0.313868496021587670, -0.313915968952457050, -0.313963441098536470, -0.314010912459707300, -0.314058383035851260, -0.314105852826848890, -0.314153321832581820, --0.314200790052931500, -0.314248257487779630, -0.314295724137006630, -0.314343190000494380, -0.314390655078124140, -0.314438119369777670, -0.314485582875335510, -0.314533045594679370, --0.314580507527690620, -0.314627968674251020, -0.314675429034241060, -0.314722888607542550, -0.314770347394037200, -0.314817805393605600, -0.314865262606129510, -0.314912719031490210, --0.314960174669569600, -0.315007629520248080, -0.315055083583407500, -0.315102536858929190, -0.315149989346694970, -0.315197441046585370, -0.315244891958482150, -0.315292342082266750, --0.315339791417820870, -0.315387239965025100, -0.315434687723761210, -0.315482134693910620, -0.315529580875355150, -0.315577026267975240, -0.315624470871652800, -0.315671914686269210, --0.315719357711706230, -0.315766799947844400, -0.315814241394565600, -0.315861682051751640, -0.315909121919283000, -0.315956560997041610, -0.316003999284908800, -0.316051436782766370, --0.316098873490494980, -0.316146309407976390, -0.316193744535092030, -0.316241178871723700, -0.316288612417752020, -0.316336045173058860, -0.316383477137525520, -0.316430908311033930, --0.316478338693464640, -0.316525768284699530, -0.316573197084620010, -0.316620625093107900, -0.316668052310043750, -0.316715478735309530, -0.316762904368787010, -0.316810329210356840, --0.316857753259900840, -0.316905176517300440, -0.316952598982437550, -0.317000020655192670, -0.317047441535447780, -0.317094861623084310, -0.317142280917984080, -0.317189699420027730, --0.317237117129097130, -0.317284534045073780, -0.317331950167839490, -0.317379365497274860, -0.317426780033261860, -0.317474193775681920, -0.317521606724416870, -0.317569018879347410, --0.317616430240355410, -0.317663840807322740, -0.317711250580130060, -0.317758659558659280, -0.317806067742791800, -0.317853475132409580, -0.317900881727393280, -0.317948287527624770, --0.317995692532985540, -0.318043096743357460, -0.318090500158621280, -0.318137902778658780, -0.318185304603351590, -0.318232705632581550, -0.318280105866229290, -0.318327505304176750, --0.318374903946305520, -0.318422301792497360, -0.318469698842633100, -0.318517095096594590, -0.318564490554263720, -0.318611885215521250, -0.318659279080249050, -0.318706672148328600, --0.318754064419641940, -0.318801455894069720, -0.318848846571493820, -0.318896236451795820, -0.318943625534857610, -0.318991013820560000, -0.319038401308784800, -0.319085787999413560, --0.319133173892328310, -0.319180558987409770, -0.319227943284539740, -0.319275326783599880, -0.319322709484472110, -0.319370091387037200, -0.319417472491177020, -0.319464852796773170, --0.319512232303707620, -0.319559611011861030, -0.319606988921115440, -0.319654366031352780, -0.319701742342453800, -0.319749117854300490, -0.319796492566774340, -0.319843866479757380, --0.319891239593130370, -0.319938611906775250, -0.319985983420573550, -0.320033354134407370, -0.320080724048157410, -0.320128093161705600, -0.320175461474933530, -0.320222828987723250, --0.320270195699955460, -0.320317561611512200, -0.320364926722275070, -0.320412291032125980, -0.320459654540945770, -0.320507017248616470, -0.320554379155020000, -0.320601740260037130, --0.320649100563549950, -0.320696460065440000, -0.320743818765589380, -0.320791176663878740, -0.320838533760190170, -0.320885890054405270, -0.320933245546406010, -0.320980600236073280, --0.321027954123289050, -0.321075307207934920, -0.321122659489892940, -0.321170010969043910, -0.321217361645269820, -0.321264711518452320, -0.321312060588473500, -0.321359408855214080, --0.321406756318556140, -0.321454102978381730, -0.321501448834571660, -0.321548793887007970, -0.321596138135572310, -0.321643481580146660, -0.321690824220611960, -0.321738166056850130, --0.321785507088742930, -0.321832847316172340, -0.321880186739019300, -0.321927525357165730, -0.321974863170493340, -0.322022200178884220, -0.322069536382219190, -0.322116871780380290, --0.322164206373249270, -0.322211540160708130, -0.322258873142637680, -0.322306205318920070, -0.322353536689436950, -0.322400867254070410, -0.322448197012701330, -0.322495525965211690, --0.322542854111483700, -0.322590181451398120, -0.322637507984837090, -0.322684833711682330, -0.322732158631815870, -0.322779482745118580, -0.322826806051472630, -0.322874128550759590, --0.322921450242861730, -0.322968771127659760, -0.323016091205035880, -0.323063410474871800, -0.323110728937049620, -0.323158046591450140, -0.323205363437955580, -0.323252679476447650, --0.323299994706808370, -0.323347309128918740, -0.323394622742660790, -0.323441935547916730, -0.323489247544567430, -0.323536558732494980, -0.323583869111581160, -0.323631178681708040, --0.323678487442756620, -0.323725795394608940, -0.323773102537146750, -0.323820408870252260, -0.323867714393806350, -0.323915019107691100, -0.323962323011788340, -0.324009626105980160, --0.324056928390147550, -0.324104229864172530, -0.324151530527936990, -0.324198830381323080, -0.324246129424211600, -0.324293427656484830, -0.324340725078024920, -0.324388021688712780, --0.324435317488430570, -0.324482612477060120, -0.324529906654483500, -0.324577200020581710, -0.324624492575236900, -0.324671784318330880, -0.324719075249745800, -0.324766365369362650, --0.324813654677063520, -0.324860943172730340, -0.324908230856245150, -0.324955517727488990, -0.325002803786344050, -0.325050089032692110, -0.325097373466415320, -0.325144657087394710, --0.325191939895512430, -0.325239221890650740, -0.325286503072690580, -0.325333783441514200, -0.325381062997003310, -0.325428341739040170, -0.325475619667505770, -0.325522896782282360, --0.325570173083251650, -0.325617448570295950, -0.325664723243296260, -0.325711997102134660, -0.325759270146693150, -0.325806542376853860, -0.325853813792497780, -0.325901084393507180, --0.325948354179763870, -0.325995623151150100, -0.326042891307546820, -0.326090158648836340, -0.326137425174900460, -0.326184690885621460, -0.326231955780880270, -0.326279219860559240, --0.326326483124540550, -0.326373745572705210, -0.326421007204935550, -0.326468268021113340, -0.326515528021120880, -0.326562787204839220, -0.326610045572150560, -0.326657303122936780, --0.326704559857080190, -0.326751815774461770, -0.326799070874963790, -0.326846325158468120, -0.326893578624857130, -0.326940831274011690, -0.326988083105814230, -0.327035334120146510, --0.327082584316890910, -0.327129833695928460, -0.327177082257141370, -0.327224330000412010, -0.327271576925621420, -0.327318823032651920, -0.327366068321385320, -0.327413312791703940, --0.327460556443488930, -0.327507799276622490, -0.327555041290986500, -0.327602282486463390, -0.327649522862934140, -0.327696762420281120, -0.327744001158386140, -0.327791239077131590, --0.327838476176398550, -0.327885712456069290, -0.327932947916025730, -0.327980182556150250, -0.328027416376323930, -0.328074649376429000, -0.328121881556347920, -0.328169112915961680, --0.328216343455152660, -0.328263573173802840, -0.328310802071794420, -0.328358030149008610, -0.328405257405327780, -0.328452483840633750, -0.328499709454808940, -0.328546934247734400, --0.328594158219292550, -0.328641381369365330, -0.328688603697835090, -0.328735825204582890, -0.328783045889491090, -0.328830265752441730, -0.328877484793317130, -0.328924703011998330, --0.328971920408367870, -0.329019136982307560, -0.329066352733699830, -0.329113567662425780, -0.329160781768367830, -0.329207995051408350, -0.329255207511428450, -0.329302419148310540, --0.329349629961936560, -0.329396839952188940, -0.329444049118948810, -0.329491257462098560, -0.329538464981520170, -0.329585671677096010, -0.329632877548707240, -0.329680082596236320, --0.329727286819565200, -0.329774490218576240, -0.329821692793150660, -0.329868894543170870, -0.329916095468518800, -0.329963295569076940, -0.330010494844726390, -0.330057693295349620, --0.330104890920829060, -0.330152087721045820, -0.330199283695882360, -0.330246478845220740, -0.330293673168943260, -0.330340866666931240, -0.330388059339067060, -0.330435251185232700, --0.330482442205310640, -0.330529632399182040, -0.330576821766729370, -0.330624010307834670, -0.330671198022380320, -0.330718384910247630, -0.330765570971318920, -0.330812756205476290, --0.330859940612602150, -0.330907124192577780, -0.330954306945285600, -0.331001488870608100, -0.331048669968426410, -0.331095850238623090, -0.331143029681080110, -0.331190208295679970, --0.331237386082303910, -0.331284563040834420, -0.331331739171153440, -0.331378914473143600, -0.331426088946686010, -0.331473262591663210, -0.331520435407957280, -0.331567607395450660, --0.331614778554024600, -0.331661948883561600, -0.331709118383943740, -0.331756287055053500, -0.331803454896772100, -0.331850621908982070, -0.331897788091565890, -0.331944953444404890, --0.331992117967381430, -0.332039281660377720, -0.332086444523276180, -0.332133606555958140, -0.332180767758306070, -0.332227928130202130, -0.332275087671528750, -0.332322246382167230, --0.332369404262000070, -0.332416561310909460, -0.332463717528777850, -0.332510872915486480, -0.332558027470917950, -0.332605181194954360, -0.332652334087478240, -0.332699486148370860, --0.332746637377514750, -0.332793787774792070, -0.332840937340085350, -0.332888086073275860, -0.332935233974246130, -0.332982381042878750, -0.333029527279054990, -0.333076672682657450, --0.333123817253568210, -0.333170960991669820, -0.333218103896843640, -0.333265245968972170, -0.333312387207937600, -0.333359527613622470, -0.333406667185908110, -0.333453805924677100, --0.333500943829811550, -0.333548080901194090, -0.333595217138705990, -0.333642352542229850, -0.333689487111647810, -0.333736620846842470, -0.333783753747695200, -0.333830885814088480, --0.333878017045905030, -0.333925147443026090, -0.333972277005334270, -0.334019405732711830, -0.334066533625041180, -0.334113660682203880, -0.334160786904082350, -0.334207912290558910, --0.334255036841516080, -0.334302160556835260, -0.334349283436399030, -0.334396405480089590, -0.334443526687789540, -0.334490647059380250, -0.334537766594744380, -0.334584885293764070, --0.334632003156321970, -0.334679120182299390, -0.334726236371579110, -0.334773351724043600, -0.334820466239574290, -0.334867579918053830, -0.334914692759364420, -0.334961804763388660, --0.335008915930008030, -0.335056026259105080, -0.335103135750562050, -0.335150244404261610, -0.335197352220085180, -0.335244459197915350, -0.335291565337634320, -0.335338670639124870, --0.335385775102268250, -0.335432878726947270, -0.335479981513044030, -0.335527083460441300, -0.335574184569020380, -0.335621284838664050, -0.335668384269254490, -0.335715482860674430, --0.335762580612805230, -0.335809677525529540, -0.335856773598730120, -0.335903868832288290, -0.335950963226086810, -0.335998056780007940, -0.336045149493934380, -0.336092241367747460, --0.336139332401329980, -0.336186422594564160, -0.336233511947332700, -0.336280600459517020, -0.336327688130999840, -0.336374774961663460, -0.336421860951390590, -0.336468946100062620, --0.336516030407562280, -0.336563113873771860, -0.336610196498574040, -0.336657278281850380, -0.336704359223483520, -0.336751439323356110, -0.336798518581349740, -0.336845596997347060, --0.336892674571230400, -0.336939751302882450, -0.336986827192184760, -0.337033902239019910, -0.337080976443270400, -0.337128049804818810, -0.337175122323546680, -0.337222193999336730, --0.337269264832071310, -0.337316334821633200, -0.337363403967903760, -0.337410472270765820, -0.337457539730101730, -0.337504606345794210, -0.337551672117724740, -0.337598737045776090, --0.337645801129831000, -0.337692864369771030, -0.337739926765478870, -0.337786988316836900, -0.337834049023727880, -0.337881108886033340, -0.337928167903636000, -0.337975226076418220, --0.338022283404262820, -0.338069339887051350, -0.338116395524666440, -0.338163450316990580, -0.338210504263906530, -0.338257557365295780, -0.338304609621041090, -0.338351661031024930, --0.338398711595130020, -0.338445761313237950, -0.338492810185231420, -0.338539858210993310, -0.338586905390405150, -0.338633951723349700, -0.338680997209709400, -0.338728041849367000, --0.338775085642204100, -0.338822128588103460, -0.338869170686947550, -0.338916211938619090, -0.338963252342999680, -0.339010291899972120, -0.339057330609418840, -0.339104368471222720, --0.339151405485265180, -0.339198441651429150, -0.339245476969597000, -0.339292511439651610, -0.339339545061474510, -0.339386577834948580, -0.339433609759956180, -0.339480640836380130, --0.339527671064102090, -0.339574700443004920, -0.339621728972971330, -0.339668756653883070, -0.339715783485622870, -0.339762809468073250, -0.339809834601117020, -0.339856858884635790, --0.339903882318512370, -0.339950904902629300, -0.339997926636869340, -0.340044947521114190, -0.340091967555246620, -0.340138986739149160, -0.340186005072704630, -0.340233022555794740, --0.340280039188302240, -0.340327054970109620, -0.340374069901099810, -0.340421083981154390, -0.340468097210156310, -0.340515109587988360, -0.340562121114532210, -0.340609131789670780, --0.340656141613286500, -0.340703150585262290, -0.340750158705479810, -0.340797165973821930, -0.340844172390171120, -0.340891177954410320, -0.340938182666421120, -0.340985186526086450, --0.341032189533288840, -0.341079191687911230, -0.341126192989835150, -0.341173193438943590, -0.341220193035119080, -0.341267191778244490, -0.341314189668201540, -0.341361186704873030, --0.341408182888142060, -0.341455178217890180, -0.341502172694000350, -0.341549166316355070, -0.341596159084837310, -0.341643150999328740, -0.341690142059712320, -0.341737132265870490, --0.341784121617686290, -0.341831110115041360, -0.341878097757818630, -0.341925084545900650, -0.341972070479170390, -0.342019055557509550, -0.342066039780801080, -0.342113023148927500, --0.342160005661771790, -0.342206987319215620, -0.342253968121142000, -0.342300948067433440, -0.342347927157972960, -0.342394905392642220, -0.342441882771324200, -0.342488859293901940, --0.342535834960257080, -0.342582809770272670, -0.342629783723831180, -0.342676756820815720, -0.342723729061107870, -0.342770700444590740, -0.342817670971146850, -0.342864640640659190, --0.342911609453009580, -0.342958577408080890, -0.343005544505755710, -0.343052510745917140, -0.343099476128446880, -0.343146440653227910, -0.343193404320142890, -0.343240367129074740, --0.343287329079905220, -0.343334290172517430, -0.343381250406794290, -0.343428209782617620, -0.343475168299870460, -0.343522125958435340, -0.343569082758195370, -0.343616038699032230, --0.343662993780828980, -0.343709948003468270, -0.343756901366833120, -0.343803853870805310, -0.343850805515267810, -0.343897756300103330, -0.343944706225194910, -0.343991655290424250, --0.344038603495674500, -0.344085550840828200, -0.344132497325768450, -0.344179442950377060, -0.344226387714537060, -0.344273331618131450, -0.344320274661042150, -0.344367216843152190, --0.344414158164344120, -0.344461098624501140, -0.344508038223504950, -0.344554976961238660, -0.344601914837584960, -0.344648851852426890, -0.344695788005646210, -0.344742723297126130, --0.344789657726749240, -0.344836591294398590, -0.344883523999956030, -0.344930455843304730, -0.344977386824327210, -0.345024316942906690, -0.345071246198924930, -0.345118174592265130, --0.345165102122810210, -0.345212028790442160, -0.345258954595044080, -0.345305879536498550, -0.345352803614688790, -0.345399726829496550, -0.345446649180805030, -0.345493570668496900, --0.345540491292455230, -0.345587411052561910, -0.345634329948700080, -0.345681247980752390, -0.345728165148602050, -0.345775081452130870, -0.345821996891221950, -0.345868911465758100, --0.345915825175622300, -0.345962738020696600, -0.346009650000864030, -0.346056561116007360, -0.346103471366009660, -0.346150380750752880, -0.346197289270120110, -0.346244196923994610, --0.346291103712258130, -0.346338009634793940, -0.346384914691484750, -0.346431818882213640, -0.346478722206862540, -0.346525624665314670, -0.346572526257452770, -0.346619426983159950, --0.346666326842318130, -0.346713225834810510, -0.346760123960519810, -0.346807021219329210, -0.346853917611120670, -0.346900813135777310, -0.346947707793181900, -0.346994601583217710, --0.347041494505766550, -0.347088386560711670, -0.347135277747936180, -0.347182168067322160, -0.347229057518752660, -0.347275946102110540, -0.347322833817279020, -0.347369720664139960, --0.347416606642576560, -0.347463491752471710, -0.347510375993708490, -0.347557259366168940, -0.347604141869736260, -0.347651023504293170, -0.347697904269722970, -0.347744784165907590, --0.347791663192730300, -0.347838541350073800, -0.347885418637821350, -0.347932295055854990, -0.347979170604057860, -0.348026045282313180, -0.348072919090503030, -0.348119792028510570, --0.348166664096218600, -0.348213535293510460, -0.348260405620268000, -0.348307275076374550, -0.348354143661712910, -0.348401011376166300, -0.348447878219616760, -0.348494744191947540, --0.348541609293041450, -0.348588473522781770, -0.348635336881050470, -0.348682199367730820, -0.348729060982705670, -0.348775921725858310, -0.348822781597070750, -0.348869640596226220, --0.348916498723207570, -0.348963355977898070, -0.349010212360179760, -0.349057067869935960, -0.349103922507049910, -0.349150776271403620, -0.349197629162880390, -0.349244481181363090, --0.349291332326734980, -0.349338182598878170, -0.349385031997675840, -0.349431880523011000, -0.349478728174766830, -0.349525574952825440, -0.349572420857070130, -0.349619265887383730, --0.349666110043649610, -0.349712953325749810, -0.349759795733567580, -0.349806637266985910, -0.349853477925888000, -0.349900317710156060, -0.349947156619673240, -0.349993994654323020, --0.350040831813987370, -0.350087668098549630, -0.350134503507892710, -0.350181338041899990, -0.350228171700453450, -0.350275004483436510, -0.350321836390732110, -0.350368667422223450, --0.350415497577792780, -0.350462326857323310, -0.350509155260698040, -0.350555982787800310, -0.350602809438512190, -0.350649635212717080, -0.350696460110297810, -0.350743284131137870, --0.350790107275119280, -0.350836929542125420, -0.350883750932039720, -0.350930571444744150, -0.350977391080122160, -0.351024209838056710, -0.351071027718431130, -0.351117844721127560, --0.351164660846029430, -0.351211476093019610, -0.351258290461981540, -0.351305103952797290, -0.351351916565350310, -0.351398728299523510, -0.351445539155200330, -0.351492349132262900, --0.351539158230594560, -0.351585966450078340, -0.351632773790597650, -0.351679580252034550, -0.351726385834272510, -0.351773190537194970, -0.351819994360684010, -0.351866797304623060, --0.351913599368895100, -0.351960400553383620, -0.352007200857970660, -0.352054000282539750, -0.352100798826973820, -0.352147596491156290, -0.352194393274969320, -0.352241189178296440, --0.352287984201020530, -0.352334778343025120, -0.352381571604192310, -0.352428363984405630, -0.352475155483548020, -0.352521946101502890, -0.352568735838152510, -0.352615524693380310, --0.352662312667069270, -0.352709099759102860, -0.352755885969363300, -0.352802671297734020, -0.352849455744098480, -0.352896239308338850, -0.352943021990338670, -0.352989803789980960, --0.353036584707149100, -0.353083364741725360, -0.353130143893593260, -0.353176922162635740, -0.353223699548736390, -0.353270476051777360, -0.353317251671642070, -0.353364026408213740, --0.353410800261375720, -0.353457573231010290, -0.353504345317000920, -0.353551116519230710, -0.353597886837583090, -0.353644656271940360, -0.353691424822186020, -0.353738192488203480, --0.353784959269875080, -0.353831725167084280, -0.353878490179714120, -0.353925254307648210, -0.353972017550768680, -0.354018779908959190, -0.354065541382102670, -0.354112301970082750, --0.354159061672781660, -0.354205820490082920, -0.354252578421869630, -0.354299335468025330, -0.354346091628432220, -0.354392846902973900, -0.354439601291533510, -0.354486354793994480, --0.354533107410239190, -0.354579859140151110, -0.354626609983613780, -0.354673359940509520, -0.354720109010721870, -0.354766857194133920, -0.354813604490629260, -0.354860350900090220, --0.354907096422400260, -0.354953841057442540, -0.355000584805100660, -0.355047327665256870, -0.355094069637794830, -0.355140810722597570, -0.355187550919548680, -0.355234290228530540, --0.355281028649426620, -0.355327766182120200, -0.355374502826494740, -0.355421238582432570, -0.355467973449817400, -0.355514707428532200, -0.355561440518460730, -0.355608172719485190, --0.355654904031489190, -0.355701634454356430, -0.355748363987969110, -0.355795092632210870, -0.355841820386964940, -0.355888547252114880, -0.355935273227542980, -0.355981998313132930, --0.356028722508767880, -0.356075445814331480, -0.356122168229705990, -0.356168889754775120, -0.356215610389422010, -0.356262330133530310, -0.356309048986982350, -0.356355766949661760, --0.356402484021451750, -0.356449200202235970, -0.356495915491896740, -0.356542629890317760, -0.356589343397382570, -0.356636056012973660, -0.356682767736974600, -0.356729478569268620, --0.356776188509739360, -0.356822897558269180, -0.356869605714741740, -0.356916312979040360, -0.356963019351048570, -0.357009724830648860, -0.357056429417724750, -0.357103133112159630, --0.357149835913837090, -0.357196537822639550, -0.357243238838450660, -0.357289938961153630, -0.357336638190632220, -0.357383336526768790, -0.357430033969447000, -0.357476730518550560, --0.357523426173961880, -0.357570120935564620, -0.357616814803242030, -0.357663507776877890, -0.357710199856354490, -0.357756891041555670, -0.357803581332364560, -0.357850270728664930, --0.357896959230339210, -0.357943646837271090, -0.357990333549343840, -0.358037019366441220, -0.358083704288445600, -0.358130388315240740, -0.358177071446709900, -0.358223753682736790, --0.358270435023203880, -0.358317115467994880, -0.358363795016993500, -0.358410473670082220, -0.358457151427144740, -0.358503828288064430, -0.358550504252724940, -0.358597179321008760, --0.358643853492799650, -0.358690526767980910, -0.358737199146436260, -0.358783870628048170, -0.358830541212700470, -0.358877210900276360, -0.358923879690659640, -0.358970547583732870, --0.359017214579379680, -0.359063880677483460, -0.359110545877927960, -0.359157210180595650, -0.359203873585370310, -0.359250536092135310, -0.359297197700774400, -0.359343858411170060, --0.359390518223206110, -0.359437177136766260, -0.359483835151733040, -0.359530492267990220, -0.359577148485421220, -0.359623803803909680, -0.359670458223338320, -0.359717111743590720, --0.359763764364550380, -0.359810416086101040, -0.359857066908125240, -0.359903716830506810, -0.359950365853129060, -0.359997013975875800, -0.360043661198629630, -0.360090307521274240, --0.360136952943693130, -0.360183597465770060, -0.360230241087387550, -0.360276883808429480, -0.360323525628779560, -0.360370166548320490, -0.360416806566935920, -0.360463445684509390, --0.360510083900924650, -0.360556721216064250, -0.360603357629812050, -0.360649993142051480, -0.360696627752666370, -0.360743261461539230, -0.360789894268553960, -0.360836526173593960, --0.360883157176543010, -0.360929787277283810, -0.360976416475700110, -0.361023044771675410, -0.361069672165093450, -0.361116298655836940, -0.361162924243789650, -0.361209548928835500, --0.361256172710857030, -0.361302795589738160, -0.361349417565362320, -0.361396038637613270, -0.361442658806373770, -0.361489278071527640, -0.361535896432958250, -0.361582513890549570, --0.361629130444184210, -0.361675746093746030, -0.361722360839118460, -0.361768974680185370, -0.361815587616829470, -0.361862199648934570, -0.361908810776384200, -0.361955420999062250, --0.362002030316851300, -0.362048638729635220, -0.362095246237297610, -0.362141852839722280, -0.362188458536791940, -0.362235063328390390, -0.362281667214401640, -0.362328270194708260, --0.362374872269194240, -0.362421473437743060, -0.362468073700238590, -0.362514673056563490, -0.362561271506601780, -0.362607869050236840, -0.362654465687352660, -0.362701061417831870, --0.362747656241558470, -0.362794250158415880, -0.362840843168288130, -0.362887435271057820, -0.362934026466608940, -0.362980616754824960, -0.363027206135589920, -0.363073794608786420, --0.363120382174298430, -0.363166968832009880, -0.363213554581803490, -0.363260139423563280, -0.363306723357172680, -0.363353306382515670, -0.363399888499474970, -0.363446469707934590, --0.363493050007777980, -0.363539629398889230, -0.363586207881150920, -0.363632785454447160, -0.363679362118661420, -0.363725937873677680, -0.363772512719378660, -0.363819086655648380, --0.363865659682370390, -0.363912231799428660, -0.363958803006705910, -0.364005373304086170, -0.364051942691453410, -0.364098511168690410, -0.364145078735681080, -0.364191645392309080, --0.364238211138458390, -0.364284775974011770, -0.364331339898853130, -0.364377902912866200, -0.364424465015934950, -0.364471026207942080, -0.364517586488771690, -0.364564145858307320, --0.364610704316433000, -0.364657261863031490, -0.364703818497986830, -0.364750374221182620, -0.364796929032502880, -0.364843482931830390, -0.364890035919049230, -0.364936587994042990, --0.364983139156695670, -0.365029689406890070, -0.365076238744510280, -0.365122787169440300, -0.365169334681562930, -0.365215881280762210, -0.365262426966921790, -0.365308971739925770, --0.365355515599656840, -0.365402058545999160, -0.365448600578836320, -0.365495141698052360, -0.365541681903530200, -0.365588221195153770, -0.365634759572806830, -0.365681297036373420, --0.365727833585736290, -0.365774369220779660, -0.365820903941387050, -0.365867437747442570, -0.365913970638829130, -0.365960502615430780, -0.366007033677131550, -0.366053563823814320, --0.366100093055363170, -0.366146621371661820, -0.366193148772594350, -0.366239675258043570, -0.366286200827893590, -0.366332725482028110, -0.366379249220331220, -0.366425772042685840, --0.366472293948975960, -0.366518814939085390, -0.366565335012898170, -0.366611854170297240, -0.366658372411166670, -0.366704889735390120, -0.366751406142851790, -0.366797921633434550, --0.366844436207022510, -0.366890949863499740, -0.366937462602749230, -0.366983974424655020, -0.367030485329100930, -0.367076995315971040, -0.367123504385148180, -0.367170012536516600, --0.367216519769960000, -0.367263026085362490, -0.367309531482607030, -0.367356035961577730, -0.367402539522158340, -0.367449042164233020, -0.367495543887684680, -0.367542044692397480, --0.367588544578255130, -0.367635043545141870, -0.367681541592940590, -0.367728038721535420, -0.367774534930810640, -0.367821030220649050, -0.367867524590934910, -0.367914018041551940, --0.367960510572384330, -0.368007002183315060, -0.368053492874228280, -0.368099982645007760, -0.368146471495537700, -0.368192959425701020, -0.368239446435381980, -0.368285932524464290, --0.368332417692832200, -0.368378901940368650, -0.368425385266957890, -0.368471867672483630, -0.368518349156830070, -0.368564829719880300, -0.368611309361518420, -0.368657788081628250, --0.368704265880094030, -0.368750742756798760, -0.368797218711626630, -0.368843693744461850, -0.368890167855187410, -0.368936641043687560, -0.368983113309846120, -0.369029584653547290, --0.369076055074674110, -0.369122524573110790, -0.369168993148741190, -0.369215460801449460, -0.369261927531118690, -0.369308393337633100, -0.369354858220876490, -0.369401322180733180, --0.369447785217086160, -0.369494247329819670, -0.369540708518817600, -0.369587168783964140, -0.369633628125142330, -0.369680086542236440, -0.369726544035130780, -0.369773000603708320, --0.369819456247853400, -0.369865910967449810, -0.369912364762381870, -0.369958817632532580, -0.370005269577786230, -0.370051720598026770, -0.370098170693138380, -0.370144619863004180, --0.370191068107508400, -0.370237515426534940, -0.370283961819968140, -0.370330407287691010, -0.370376851829587850, -0.370423295445542530, -0.370469738135439430, -0.370516179899161580, --0.370562620736593300, -0.370609060647618840, -0.370655499632121300, -0.370701937689985050, -0.370748374821093910, -0.370794811025332290, -0.370841246302583190, -0.370887680652731030, --0.370934114075659630, -0.370980546571253400, -0.371026978139395340, -0.371073408779969860, -0.371119838492860840, -0.371166267277952660, -0.371212695135128390, -0.371259122064272360, --0.371305548065268550, -0.371351973138001280, -0.371398397282353630, -0.371444820498210040, -0.371491242785454370, -0.371537664143970990, -0.371584084573643060, -0.371630504074354940, --0.371676922645990950, -0.371723340288434230, -0.371769757001569170, -0.371816172785279730, -0.371862587639450290, -0.371909001563963890, -0.371955414558705070, -0.372001826623557690, --0.372048237758406120, -0.372094647963133570, -0.372141057237624420, -0.372187465581762580, -0.372233872995432540, -0.372280279478517380, -0.372326685030901490, -0.372373089652468960, --0.372419493343104040, -0.372465896102690040, -0.372512297931111240, -0.372558698828252150, -0.372605098793995890, -0.372651497828226870, -0.372697895930829140, -0.372744293101687050, --0.372790689340683820, -0.372837084647703880, -0.372883479022631250, -0.372929872465350310, -0.372976264975744260, -0.373022656553697540, -0.373069047199094230, -0.373115436911818640, --0.373161825691754100, -0.373208213538785030, -0.373254600452795350, -0.373300986433669600, -0.373347371481290990, -0.373393755595543940, -0.373440138776312940, -0.373486521023481180, --0.373532902336933090, -0.373579282716552770, -0.373625662162224650, -0.373672040673831920, -0.373718418251259120, -0.373764794894390300, -0.373811170603109870, -0.373857545377301090, --0.373903919216848510, -0.373950292121636050, -0.373996664091548300, -0.374043035126468530, -0.374089405226281150, -0.374135774390870200, -0.374182142620120280, -0.374228509913914600, --0.374274876272137620, -0.374321241694673850, -0.374367606181406580, -0.374413969732220300, -0.374460332346999100, -0.374506694025627470, -0.374553054767988670, -0.374599414573967280, --0.374645773443447290, -0.374692131376313350, -0.374738488372448610, -0.374784844431737710, -0.374831199554064630, -0.374877553739314030, -0.374923906987369100, -0.374970259298114390, --0.375016610671434050, -0.375062961107212600, -0.375109310605333370, -0.375155659165680780, -0.375202006788139090, -0.375248353472592830, -0.375294699218925220, -0.375341044027020900, --0.375387387896764350, -0.375433730828038940, -0.375480072820729150, -0.375526413874719240, -0.375572753989893700, -0.375619093166135840, -0.375665431403330250, -0.375711768701361080, --0.375758105060112920, -0.375804440479469090, -0.375850774959314130, -0.375897108499532230, -0.375943441100007990, -0.375989772760624790, -0.376036103481267090, -0.376082433261819120, --0.376128762102165500, -0.376175090002189570, -0.376221416961775910, -0.376267742980809120, -0.376314068059172560, -0.376360392196750830, -0.376406715393428130, -0.376453037649089050, --0.376499358963616970, -0.376545679336896480, -0.376591998768811780, -0.376638317259247510, -0.376684634808087060, -0.376730951415214950, -0.376777267080515510, -0.376823581803873320, --0.376869895585171750, -0.376916208424295460, -0.376962520321128650, -0.377008831275555960, -0.377055141287460760, -0.377101450356727710, -0.377147758483241390, -0.377194065666885350, --0.377240371907544110, -0.377286677205101950, -0.377332981559443500, -0.377379284970452140, -0.377425587438012630, -0.377471888962009120, -0.377518189542326350, -0.377564489178847660, --0.377610787871457740, -0.377657085620040860, -0.377703382424481650, -0.377749678284663600, -0.377795973200471370, -0.377842267171789150, -0.377888560198501760, -0.377934852280492510, --0.377981143417646100, -0.378027433609846860, -0.378073722856979430, -0.378120011158927290, -0.378166298515575150, -0.378212584926807650, -0.378258870392508330, -0.378305154912561780, --0.378351438486852320, -0.378397721115264710, -0.378444002797682370, -0.378490283533990060, -0.378536563324072040, -0.378582842167812960, -0.378629120065096410, -0.378675397015807050, --0.378721673019829230, -0.378767948077047610, -0.378814222187345670, -0.378860495350608230, -0.378906767566719540, -0.378953038835564360, -0.378999309157026120, -0.379045578530989640, --0.379091846957339660, -0.379138114435959570, -0.379184380966734240, -0.379230646549547970, -0.379276911184285470, -0.379323174870830280, -0.379369437609067160, -0.379415699398880480, --0.379461960240154940, -0.379508220132774080, -0.379554479076622650, -0.379600737071585040, -0.379646994117546040, -0.379693250214389100, -0.379739505361999020, -0.379785759560260230, --0.379832012809057430, -0.379878265108274160, -0.379924516457795240, -0.379970766857505470, -0.380017016307288350, -0.380063264807028680, -0.380109512356610830, -0.380155758955919630, --0.380202004604838660, -0.380248249303252630, -0.380294493051046010, -0.380340735848103520, -0.380386977694308850, -0.380433218589546650, -0.380479458533701460, -0.380525697526658050, --0.380571935568299930, -0.380618172658512000, -0.380664408797178670, -0.380710643984184690, -0.380756878219413730, -0.380803111502750540, -0.380849343834079980, -0.380895575213285650, --0.380941805640252370, -0.380988035114864620, -0.381034263637007150, -0.381080491206563620, -0.381126717823418890, -0.381172943487457340, -0.381219168198563830, -0.381265391956622010, --0.381311614761516700, -0.381357836613132380, -0.381404057511353870, -0.381450277456064800, -0.381496496447150000, -0.381542714484494010, -0.381588931567981630, -0.381635147697496510, --0.381681362872923540, -0.381727577094147120, -0.381773790361052190, -0.381820002673522340, -0.381866214031442550, -0.381912424434697580, -0.381958633883171190, -0.382004842376748140, --0.382051049915313080, -0.382097256498750760, -0.382143462126944830, -0.382189666799780340, -0.382235870517141640, -0.382282073278913670, -0.382328275084980130, -0.382374475935225890, --0.382420675829535430, -0.382466874767793730, -0.382513072749884390, -0.382559269775692430, -0.382605465845102240, -0.382651660957998850, -0.382697855114265850, -0.382744048313788220, --0.382790240556450890, -0.382836431842137560, -0.382882622170733160, -0.382928811542122160, -0.382974999956189550, -0.383021187412819040, -0.383067373911895600, -0.383113559453303660, --0.383159744036928260, -0.383205927662653100, -0.383252110330363160, -0.383298292039942870, -0.383344472791277310, -0.383390652584250150, -0.383436831418746290, -0.383483009294650460, --0.383529186211847450, -0.383575362170221090, -0.383621537169656300, -0.383667711210038060, -0.383713884291250200, -0.383760056413177560, -0.383806227575704820, -0.383852397778716940, --0.383898567022097630, -0.383944735305731920, -0.383990902629504300, -0.384037068993299920, -0.384083234397002430, -0.384129398840496850, -0.384175562323667790, -0.384221724846400210, --0.384267886408577900, -0.384314047010085870, -0.384360206650808780, -0.384406365330631550, -0.384452523049437940, -0.384498679807113110, -0.384544835603541520, -0.384590990438608280, --0.384637144312197140, -0.384683297224193200, -0.384729449174481370, -0.384775600162945490, -0.384821750189470620, -0.384867899253941440, -0.384914047356242850, -0.384960194496258730, --0.385006340673874180, -0.385052485888973730, -0.385098630141442520, -0.385144773431164270, -0.385190915758024110, -0.385237057121906650, -0.385283197522697020, -0.385329336960278930, --0.385375475434537480, -0.385421612945357370, -0.385467749492623630, -0.385513885076220140, -0.385560019696031870, -0.385606153351944040, -0.385652286043840330, -0.385698417771605960, --0.385744548535125580, -0.385790678334284150, -0.385836807168965680, -0.385882935039055190, -0.385929061944437320, -0.385975187884997240, -0.386021312860618750, -0.386067436871187000, --0.386113559916586690, -0.386159681996702860, -0.386205803111419390, -0.386251923260621470, -0.386298042444193690, -0.386344160662021210, -0.386390277913987950, -0.386436394199978990, --0.386482509519879450, -0.386528623873573230, -0.386574737260945430, -0.386620849681880820, -0.386666961136264480, -0.386713071623980330, -0.386759181144913480, -0.386805289698948730, --0.386851397285971120, -0.386897503905864640, -0.386943609558514370, -0.386989714243805070, -0.387035817961621900, -0.387081920711848770, -0.387128022494370890, -0.387174123309072920, --0.387220223155840040, -0.387266322034556190, -0.387312419945106570, -0.387358516887376270, -0.387404612861249280, -0.387450707866610790, -0.387496801903345510, -0.387542894971338590, --0.387588987070474070, -0.387635078200637080, -0.387681168361712400, -0.387727257553585170, -0.387773345776139420, -0.387819433029260310, -0.387865519312832640, -0.387911604626741510, --0.387957688970871020, -0.388003772345106300, -0.388049854749332120, -0.388095936183433740, -0.388142016647295090, -0.388188096140801410, -0.388234174663837470, -0.388280252216288540, --0.388326328798038580, -0.388372404408972750, -0.388418479048976310, -0.388464552717933290, -0.388510625415728890, -0.388556697142247940, -0.388602767897375630, -0.388648837680996010, --0.388694906492994320, -0.388740974333255330, -0.388787041201664300, -0.388833107098105260, -0.388879172022463470, -0.388925235974623750, -0.388971298954471360, -0.389017360961890320, --0.389063421996765860, -0.389109482058982830, -0.389155541148426540, -0.389201599264980940, -0.389247656408531370, -0.389293712578963060, -0.389339767776160080, -0.389385822000007650, --0.389431875250390690, -0.389477927527194460, -0.389523978830302990, -0.389570029159601540, -0.389616078514975040, -0.389662126896308800, -0.389708174303486750, -0.389754220736394320, --0.389800266194916370, -0.389846310678938100, -0.389892354188343670, -0.389938396723018330, -0.389984438282847010, -0.390030478867715020, -0.390076518477506410, -0.390122557112106530, --0.390168594771400650, -0.390214631455272850, -0.390260667163608520, -0.390306701896292460, -0.390352735653210100, -0.390398768434245480, -0.390444800239283960, -0.390490831068210420, --0.390536860920910170, -0.390582889797267410, -0.390628917697167450, -0.390674944620495120, -0.390720970567135890, -0.390766995536973800, -0.390813019529894280, -0.390859042545782130, --0.390905064584522840, -0.390951085646000450, -0.390997105730100380, -0.391043124836707500, -0.391089142965707240, -0.391135160116983680, -0.391181176290422260, -0.391227191485908340, --0.391273205703325970, -0.391319218942560610, -0.391365231203497200, -0.391411242486021100, -0.391457252790016530, -0.391503262115368790, -0.391549270461962920, -0.391595277829684290, --0.391641284218417040, -0.391687289628046550, -0.391733294058457910, -0.391779297509536380, -0.391825299981166220, -0.391871301473232790, -0.391917301985621140, -0.391963301518216620, --0.392009300070903450, -0.392055297643567060, -0.392101294236092750, -0.392147289848364890, -0.392193284480268740, -0.392239278131689410, -0.392285270802512300, -0.392331262492621570, --0.392377253201902700, -0.392423242930240720, -0.392469231677521010, -0.392515219443627830, -0.392561206228446590, -0.392607192031862340, -0.392653176853760500, -0.392699160694025330, --0.392745143552542250, -0.392791125429196360, -0.392837106323873030, -0.392883086236456510, -0.392929065166832290, -0.392975043114885790, -0.393021020080501330, -0.393066996063564270, --0.393112971063959700, -0.393158945081573170, -0.393204918116288830, -0.393250890167992200, -0.393296861236568370, -0.393342831321902790, -0.393388800423879690, -0.393434768542384630, --0.393480735677302630, -0.393526701828519180, -0.393572666995918590, -0.393618631179386340, -0.393664594378807520, -0.393710556594067620, -0.393756517825050890, -0.393802478071642870, --0.393848437333729100, -0.393894395611193770, -0.393940352903922490, -0.393986309211800330, -0.394032264534712800, -0.394078218872544180, -0.394124172225180040, -0.394170124592505440, --0.394216075974406000, -0.394262026370765910, -0.394307975781470750, -0.394353924206405690, -0.394399871645456200, -0.394445818098506600, -0.394491763565442520, -0.394537708046148960, --0.394583651540511560, -0.394629594048414630, -0.394675535569743720, -0.394721476104384020, -0.394767415652220950, -0.394813354213138960, -0.394859291787023610, -0.394905228373760410, --0.394951163973233770, -0.394997098585329160, -0.395043032209931870, -0.395088964846927400, -0.395134896496200040, -0.395180827157635530, -0.395226756831118910, -0.395272685516535770, --0.395318613213770540, -0.395364539922708810, -0.395410465643235680, -0.395456390375236830, -0.395502314118596600, -0.395548236873200560, -0.395594158638933930, -0.395640079415682300, --0.395685999203330090, -0.395731918001762880, -0.395777835810866290, -0.395823752630524660, -0.395869668460623660, -0.395915583301048530, -0.395961497151684830, -0.396007410012416960, --0.396053321883130580, -0.396099232763710900, -0.396145142654043550, -0.396191051554012910, -0.396236959463504680, -0.396282866382404010, -0.396328772310596600, -0.396374677247966880, --0.396420581194400430, -0.396466484149782530, -0.396512386113998860, -0.396558287086933750, -0.396604187068473000, -0.396650086058502160, -0.396695984056905650, -0.396741881063569220, --0.396787777078378090, -0.396833672101217950, -0.396879566131973170, -0.396925459170529520, -0.396971351216772240, -0.397017242270586930, -0.397063132331858140, -0.397109021400471500, --0.397154909476312320, -0.397200796559266270, -0.397246682649217810, -0.397292567746052700, -0.397338451849656100, -0.397384334959913820, -0.397430217076710280, -0.397476098199931180, --0.397521978329461840, -0.397567857465188020, -0.397613735606994090, -0.397659612754765800, -0.397705488908388970, -0.397751364067747910, -0.397797238232728500, -0.397843111403215990, --0.397888983579096130, -0.397934854760253360, -0.397980724946573490, -0.398026594137941780, -0.398072462334244040, -0.398118329535364690, -0.398164195741189500, -0.398210060951603830, --0.398255925166493440, -0.398301788385742820, -0.398347650609237770, -0.398393511836863560, -0.398439372068505940, -0.398485231304049500, -0.398531089543380010, -0.398576946786383220, --0.398622803032943620, -0.398668658282947010, -0.398714512536278760, -0.398760365792824640, -0.398806218052469190, -0.398852069315098200, -0.398897919580597060, -0.398943768848851520, --0.398989617119746120, -0.399035464393166730, -0.399081310668998600, -0.399127155947127670, -0.399173000227438400, -0.399218843509816680, -0.399264685794147810, -0.399310527080317670, --0.399356367368210790, -0.399402206657712980, -0.399448044948710060, -0.399493882241086620, -0.399539718534728470, -0.399585553829520990, -0.399631388125350100, -0.399677221422100330, --0.399723053719657440, -0.399768885017906970, -0.399814715316734680, -0.399860544616025220, -0.399906372915664390, -0.399952200215537620, -0.399998026515530740, -0.400043851815528370, --0.400089676115416400, -0.400135499415080250, -0.400181321714405790, -0.400227143013277550, -0.400272963311581460, -0.400318782609203390, -0.400364600906027990, -0.400410418201941070, --0.400456234496828050, -0.400502049790574910, -0.400547864083066200, -0.400593677374187880, -0.400639489663825340, -0.400685300951864440, -0.400731111238189940, -0.400776920522687650, --0.400822728805243060, -0.400868536085742020, -0.400914342364069250, -0.400960147640110620, -0.401005951913751660, -0.401051755184878180, -0.401097557453374940, -0.401143358719127820, --0.401189158982022230, -0.401234958241944220, -0.401280756498778370, -0.401326553752410660, -0.401372350002726970, -0.401418145249611950, -0.401463939492951620, -0.401509732732631410, --0.401555524968537300, -0.401601316200553950, -0.401647106428567320, -0.401692895652462910, -0.401738683872126690, -0.401784471087443360, -0.401830257298298800, -0.401876042504578650, --0.401921826706168770, -0.401967609902953940, -0.402013392094820070, -0.402059173281652750, -0.402104953463337860, -0.402150732639760200, -0.402196510810805710, -0.402242287976360360, --0.402288064136308850, -0.402333839290537230, -0.402379613438930970, -0.402425386581376110, -0.402471158717757350, -0.402516929847960720, -0.402562699971871770, -0.402608469089376420, --0.402654237200359530, -0.402700004304707090, -0.402745770402304580, -0.402791535493038090, -0.402837299576792320, -0.402883062653453310, -0.402928824722906640, -0.402974585785038310, --0.403020345839733120, -0.403066104886877110, -0.403111862926356200, -0.403157619958055210, -0.403203375981860180, -0.403249130997656750, -0.403294885005330840, -0.403340638004767330, --0.403386389995852250, -0.403432140978471190, -0.403477890952510190, -0.403523639917854000, -0.403569387874388790, -0.403615134822000070, -0.403660880760573880, -0.403706625689995160, --0.403752369610149820, -0.403798112520923570, -0.403843854422202440, -0.403889595313871310, -0.403935335195816150, -0.403981074067922660, -0.404026811930076890, -0.404072548782163700, --0.404118284624069120, -0.404164019455679260, -0.404209753276878910, -0.404255486087554180, -0.404301217887590770, -0.404346948676874710, -0.404392678455290870, -0.404438407222725280, --0.404484134979063710, -0.404529861724192250, -0.404575587457995710, -0.404621312180360180, -0.404667035891171370, -0.404712758590315410, -0.404758480277677080, -0.404804200953142620, --0.404849920616597640, -0.404895639267928260, -0.404941356907019380, -0.404987073533757070, -0.405032789148027540, -0.405078503749715550, -0.405124217338707400, -0.405169929914888650, --0.405215641478145480, -0.405261352028362830, -0.405307061565426780, -0.405352770089223050, -0.405398477599637820, -0.405444184096556030, -0.405489889579863760, -0.405535594049446720, --0.405581297505191170, -0.405626999946981930, -0.405672701374705180, -0.405718401788246700, -0.405764101187492620, -0.405809799572327880, -0.405855496942638620, -0.405901193298311090, --0.405946888639230120, -0.405992582965281900, -0.406038276276352250, -0.406083968572327310, -0.406129659853092070, -0.406175350118532670, -0.406221039368534880, -0.406266727602984930, --0.406312414821767720, -0.406358101024769490, -0.406403786211876010, -0.406449470382973470, -0.406495153537946850, -0.406540835676682310, -0.406586516799065710, -0.406632196904983260, --0.406677875994319870, -0.406723554066961760, -0.406769231122795230, -0.406814907161705210, -0.406860582183577900, -0.406906256188299120, -0.406951929175755120, -0.406997601145830890, --0.407043272098412680, -0.407088942033386250, -0.407134610950637910, -0.407180278850052650, -0.407225945731516660, -0.407271611594915820, -0.407317276440136320, -0.407362940267063270, --0.407408603075582850, -0.407454264865580900, -0.407499925636943710, -0.407545585389556320, -0.407591244123304940, -0.407636901838075490, -0.407682558533754180, -0.407728214210226040, --0.407773868867377380, -0.407819522505094460, -0.407865175123262310, -0.407910826721767260, -0.407956477300495110, -0.408002126859332180, -0.408047775398163500, -0.408093422916875390, --0.408139069415353770, -0.408184714893484850, -0.408230359351153760, -0.408276002788246720, -0.408321645204649750, -0.408367286600249010, -0.408412926974929650, -0.408458566328578020, --0.408504204661079950, -0.408549841972321750, -0.408595478262188560, -0.408641113530566650, -0.408686747777342370, -0.408732381002400840, -0.408778013205628340, -0.408823644386910820, --0.408869274546134590, -0.408914903683184780, -0.408960531797947720, -0.409006158890309280, -0.409051784960155870, -0.409097410007372650, -0.409143034031845820, -0.409188657033461470, --0.409234279012105850, -0.409279899967664120, -0.409325519900022640, -0.409371138809067390, -0.409416756694684690, -0.409462373556759680, -0.409507989395178740, -0.409553604209828230, --0.409599218000593290, -0.409644830767360300, -0.409690442510015300, -0.409736053228444530, -0.409781662922533260, -0.409827271592167810, -0.409872879237234200, -0.409918485857618750, --0.409964091453206720, -0.410009696023884480, -0.410055299569538010, -0.410100902090053620, -0.410146503585316620, -0.410192104055213390, -0.410237703499629850, -0.410283301918452470, --0.410328899311566410, -0.410374495678858140, -0.410420091020213650, -0.410465685335519300, -0.410511278624660300, -0.410556870887523180, -0.410602462123994210, -0.410648052333958740, --0.410693641517303090, -0.410739229673913410, -0.410784816803676010, -0.410830402906476160, -0.410875987982200320, -0.410921572030734480, -0.410967155051965130, -0.411012737045777510, --0.411058318012058000, -0.411103897950692740, -0.411149476861568160, -0.411195054744569410, -0.411240631599583070, -0.411286207426495130, -0.411331782225192120, -0.411377355995559250, --0.411422928737482930, -0.411468500450849710, -0.411514071135544890, -0.411559640791454850, -0.411605209418465680, -0.411650777016463910, -0.411696343585334800, -0.411741909124964830, --0.411787473635240100, -0.411833037116047070, -0.411878599567271080, -0.411924160988798580, -0.411969721380515690, -0.412015280742308860, -0.412060839074063430, -0.412106396375665930, --0.412151952647002380, -0.412197507887959390, -0.412243062098422260, -0.412288615278277430, -0.412334167427411470, -0.412379718545709710, -0.412425268633058670, -0.412470817689344400, --0.412516365714453550, -0.412561912708271360, -0.412607458670684380, -0.412653003601578750, -0.412698547500841010, -0.412744090368356520, -0.412789632204011770, -0.412835173007693010, --0.412880712779286670, -0.412926251518678120, -0.412971789225753950, -0.413017325900400360, -0.413062861542503820, -0.413108396151949720, -0.413153929728624640, -0.413199462272415160, --0.413244993783206560, -0.413290524260885530, -0.413336053705338210, -0.413381582116451100, -0.413427109494109660, -0.413472635838200430, -0.413518161148609620, -0.413563685425223810, --0.413609208667928390, -0.413654730876609980, -0.413700252051154680, -0.413745772191449200, -0.413791291297378850, -0.413836809368830330, -0.413882326405689730, -0.413927842407843750, --0.413973357375177710, -0.414018871307578310, -0.414064384204931750, -0.414109896067124620, -0.414155406894042340, -0.414200916685571520, -0.414246425441598840, -0.414291933162009740, --0.414337439846690750, -0.414382945495528180, -0.414428450108408620, -0.414473953685217560, -0.414519456225841580, -0.414564957730166990, -0.414610458198080400, -0.414655957629467280, --0.414701456024214270, -0.414746953382207570, -0.414792449703333950, -0.414837944987478780, -0.414883439234528750, -0.414928932444370120, -0.414974424616889550, -0.415019915751972500, --0.415065405849505690, -0.415110894909375750, -0.415156382931468230, -0.415201869915669710, -0.415247355861866510, -0.415292840769945330, -0.415338324639791590, -0.415383807471292110, --0.415429289264333090, -0.415474770018801230, -0.415520249734582070, -0.415565728411562310, -0.415611206049628200, -0.415656682648666450, -0.415702158208562660, -0.415747632729203400, --0.415793106210475110, -0.415838578652264420, -0.415884050054456890, -0.415929520416939260, -0.415974989739598230, -0.416020458022319290, -0.416065925264989200, -0.416111391467494320, --0.416156856629721410, -0.416202320751555890, -0.416247783832884580, -0.416293245873593840, -0.416338706873570330, -0.416384166832699740, -0.416429625750868670, -0.416475083627963540, --0.416520540463871100, -0.416565996258476900, -0.416611451011667740, -0.416656904723329950, -0.416702357393350320, -0.416747809021614350, -0.416793259608008840, -0.416838709152420220, --0.416884157654735240, -0.416929605114839450, -0.416975051532619660, -0.417020496907962610, -0.417065941240753910, -0.417111384530880420, -0.417156826778228410, -0.417202267982684780, --0.417247708144135030, -0.417293147262466020, -0.417338585337564180, -0.417384022369316270, -0.417429458357607860, -0.417474893302325840, -0.417520327203356580, -0.417565760060586880, --0.417611191873902440, -0.417656622643189980, -0.417702052368335960, -0.417747481049227210, -0.417792908685749360, -0.417838335277789240, -0.417883760825233710, -0.417929185327968300, --0.417974608785880000, -0.418020031198855170, -0.418065452566780630, -0.418110872889542070, -0.418156292167026320, -0.418201710399119910, -0.418247127585709530, -0.418292543726680950, --0.418337958821921040, -0.418383372871316220, -0.418428785874753410, -0.418474197832118200, -0.418519608743297470, -0.418565018608177740, -0.418610427426645890, -0.418655835198587510, --0.418701241923889580, -0.418746647602438960, -0.418792052234121300, -0.418837455818823530, -0.418882858356432130, -0.418928259846833960, -0.418973660289914730, -0.419019059685561360, --0.419064458033660330, -0.419109855334098560, -0.419155251586761760, -0.419200646791536850, -0.419246040948310310, -0.419291434056969060, -0.419336826117398810, -0.419382217129486530, --0.419427607093118660, -0.419472996008182220, -0.419518383874562860, -0.419563770692147560, -0.419609156460822810, -0.419654541180475570, -0.419699924850991610, -0.419745307472257800, --0.419790689044161170, -0.419836069566587370, -0.419881449039423430, -0.419926827462555830, -0.419972204835871610, -0.420017581159256470, -0.420062956432597330, -0.420108330655780850, --0.420153703828693940, -0.420199075951222300, -0.420244447023253030, -0.420289817044672660, -0.420335186015368120, -0.420380553935225220, -0.420425920804130940, -0.420471286621971860, --0.420516651388634920, -0.420562015104005980, -0.420607377767972020, -0.420652739380420030, -0.420698099941235750, -0.420743459450306220, -0.420788817907518100, -0.420834175312758300, --0.420879531665912630, -0.420924886966868190, -0.420970241215511460, -0.421015594411729590, -0.421060946555408320, -0.421106297646434700, -0.421151647684695260, -0.421196996670077210, --0.421242344602466180, -0.421287691481749330, -0.421333037307813240, -0.421378382080544960, -0.421423725799830340, -0.421469068465556370, -0.421514410077610150, -0.421559750635877530, --0.421605090140245500, -0.421650428590600760, -0.421695765986830340, -0.421741102328820060, -0.421786437616457070, -0.421831771849628000, -0.421877105028219900, -0.421922437152118630, --0.421967768221211240, -0.422013098235384470, -0.422058427194525350, -0.422103755098519720, -0.422149081947254760, -0.422194407740617060, -0.422239732478493720, -0.422285056160770720, --0.422330378787335040, -0.422375700358073760, -0.422421020872872920, -0.422466340331619450, -0.422511658734200160, -0.422556976080502130, -0.422602292370411300, -0.422647607603814700, --0.422692921780599080, -0.422738234900651540, -0.422783546963858000, -0.422828857970105660, -0.422874167919281120, -0.422919476811271570, -0.422964784645962930, -0.423010091423242360, --0.423055397142996560, -0.423100701805112610, -0.423146005409476560, -0.423191307955975480, -0.423236609444496090, -0.423281909874925640, -0.423327209247150000, -0.423372507561056320, --0.423417804816531800, -0.423463101013462300, -0.423508396151735080, -0.423553690231236900, -0.423598983251854910, -0.423644275213475030, -0.423689566115984460, -0.423734855959269960, --0.423780144743218730, -0.423825432467716760, -0.423870719132651170, -0.423916004737908800, -0.423961289283376840, -0.424006572768941270, -0.424051855194489240, -0.424097136559907550, --0.424142416865083470, -0.424187696109902870, -0.424232974294253110, -0.424278251418021280, -0.424323527481093420, -0.424368802483356730, -0.424414076424698080, -0.424459349305004620, --0.424504621124162370, -0.424549891882058550, -0.424595161578580020, -0.424640430213614030, -0.424685697787046510, -0.424730964298764780, -0.424776229748655590, -0.424821494136606250, --0.424866757462502800, -0.424912019726232440, -0.424957280927682040, -0.425002541066738790, -0.425047800143288860, -0.425093058157219370, -0.425138315108417650, -0.425183570996769790, --0.425228825822162930, -0.425274079584484040, -0.425319332283620400, -0.425364583919457970, -0.425409834491884080, -0.425455084000785630, -0.425500332446049840, -0.425545579827562860, --0.425590826145211880, -0.425636071398883880, -0.425681315588466060, -0.425726558713844570, -0.425771800774906670, -0.425817041771539280, -0.425862281703629720, -0.425907520571064010, --0.425952758373729530, -0.425997995111513150, -0.426043230784302170, -0.426088465391982700, -0.426133698934442080, -0.426178931411567650, -0.426224162823245430, -0.426269393169362850, --0.426314622449806780, -0.426359850664464520, -0.426405077813222230, -0.426450303895967280, -0.426495528912586570, -0.426540752862967440, -0.426585975746996030, -0.426631197564559640, --0.426676418315545310, -0.426721637999840310, -0.426766856617330830, -0.426812074167904180, -0.426857290651447340, -0.426902506067847690, -0.426947720416991360, -0.426992933698765790, --0.427038145913058220, -0.427083357059754920, -0.427128567138743200, -0.427173776149910090, -0.427218984093142910, -0.427264190968327910, -0.427309396775352400, -0.427354601514103370, --0.427399805184468300, -0.427445007786333320, -0.427490209319585760, -0.427535409784112700, -0.427580609179801560, -0.427625807506538450, -0.427671004764210830, -0.427716200952705680, --0.427761396071910490, -0.427806590121711350, -0.427851783101995730, -0.427896975012651120, -0.427942165853563590, -0.427987355624620700, -0.428032544325709420, -0.428077731956717170, --0.428122918517530150, -0.428168104008035900, -0.428213288428121340, -0.428258471777674010, -0.428303654056580050, -0.428348835264727000, -0.428394015402001840, -0.428439194468292040, --0.428484372463483810, -0.428529549387464740, -0.428574725240121750, -0.428619900021342310, -0.428665073731012760, -0.428710246369020550, -0.428755417935253070, -0.428800588429596670, --0.428845757851938790, -0.428890926202166570, -0.428936093480167370, -0.428981259685827570, -0.429026424819034580, -0.429071588879675560, -0.429116751867637980, -0.429161913782808100, --0.429207074625073460, -0.429252234394321090, -0.429297393090438570, -0.429342550713312180, -0.429387707262829380, -0.429432862738877320, -0.429478017141343480, -0.429523170470114240, --0.429568322725077060, -0.429613473906119090, -0.429658624013127820, -0.429703773045989560, -0.429748921004591890, -0.429794067888822350, -0.429839213698567200, -0.429884358433714030, --0.429929502094149930, -0.429974644679762540, -0.430019786190438070, -0.430064926626064210, -0.430110065986527960, -0.430155204271717000, -0.430200341481517590, -0.430245477615817380, --0.430290612674503410, -0.430335746657463380, -0.430380879564583540, -0.430426011395751480, -0.430471142150854410, -0.430516271829779920, -0.430561400432414310, -0.430606527958645240, --0.430651654408360170, -0.430696779781445660, -0.430741904077789120, -0.430787027297277860, -0.430832149439799420, -0.430877270505240220, -0.430922390493487850, -0.430967509404429520, --0.431012627237952750, -0.431057743993944090, -0.431102859672291010, -0.431147974272880820, -0.431193087795601060, -0.431238200240338210, -0.431283311606979860, -0.431328421895413210, --0.431373531105525900, -0.431418639237204420, -0.431463746290336290, -0.431508852264809170, -0.431553957160509590, -0.431599060977325030, -0.431644163715142910, -0.431689265373850720, --0.431734365953334980, -0.431779465453483340, -0.431824563874183050, -0.431869661215321720, -0.431914757476785820, -0.431959852658463090, -0.432004946760240700, -0.432050039782006290, --0.432095131723646440, -0.432140222585048750, -0.432185312366100530, -0.432230401066689360, -0.432275488686701850, -0.432320575226025570, -0.432365660684547900, -0.432410745062156430, --0.432455828358737750, -0.432500910574179440, -0.432545991708369330, -0.432591071761193770, -0.432636150732540580, -0.432681228622296970, -0.432726305430350730, -0.432771381156588310, --0.432816455800897450, -0.432861529363165410, -0.432906601843280000, -0.432951673241127650, -0.432996743556596120, -0.433041812789572710, -0.433086880939945180, -0.433131948007600080, --0.433177013992425090, -0.433222078894307580, -0.433267142713135270, -0.433312205448794670, -0.433357267101173620, -0.433402327670159740, -0.433447387155639690, -0.433492445557501100, --0.433537502875631480, -0.433582559109918440, -0.433627614260248650, -0.433672668326509800, -0.433717721308589270, -0.433762773206374850, -0.433807824019753100, -0.433852873748611810, --0.433897922392838310, -0.433942969952320400, -0.433988016426944680, -0.434033061816598900, -0.434078106121170480, -0.434123149340547190, -0.434168191474615610, -0.434213232523263600, --0.434258272486378880, -0.434303311363848090, -0.434348349155558980, -0.434393385861399030, -0.434438421481256000, -0.434483456015016530, -0.434528489462568450, -0.434573521823799100, --0.434618553098596370, -0.434663583286846840, -0.434708612388438390, -0.434753640403258370, -0.434798667331194650, -0.434843693172133890, -0.434888717925963840, -0.434933741592572090, --0.434978764171846280, -0.435023785663673220, -0.435068806067940680, -0.435113825384536580, -0.435158843613347450, -0.435203860754261210, -0.435248876807165340, -0.435293891771947660, --0.435338905648494870, -0.435383918436694830, -0.435428930136434970, -0.435473940747603210, -0.435518950270086190, -0.435563958703771790, -0.435608966048547490, -0.435653972304301140, --0.435698977470919510, -0.435743981548290420, -0.435788984536301380, -0.435833986434840280, -0.435878987243793810, -0.435923986963049850, -0.435968985592495970, -0.436013983132020000, --0.436058979581508630, -0.436103974940849900, -0.436148969209931570, -0.436193962388640440, -0.436238954476864390, -0.436283945474490950, -0.436328935381408100, -0.436373924197502430, --0.436418911922662020, -0.436463898556774310, -0.436508884099727210, -0.436553868551407540, -0.436598851911703220, -0.436643834180501730, -0.436688815357691050, -0.436733795443157990, --0.436778774436790360, -0.436823752338475870, -0.436868729148102370, -0.436913704865556640, -0.436958679490726640, -0.437003653023500360, -0.437048625463764550, -0.437093596811407140, --0.437138567066315760, -0.437183536228378360, -0.437228504297481720, -0.437273471273513850, -0.437318437156362260, -0.437363401945915000, -0.437408365642058870, -0.437453328244681750, --0.437498289753671390, -0.437543250168915650, -0.437588209490301420, -0.437633167717716600, -0.437678124851048900, -0.437723080890186300, -0.437768035835015610, -0.437812989685424810, --0.437857942441301940, -0.437902894102533800, -0.437947844669008430, -0.437992794140613480, -0.438037742517236930, -0.438082689798765580, -0.438127635985087580, -0.438172581076090420, --0.438217525071662230, -0.438262467971689830, -0.438307409776061310, -0.438352350484664200, -0.438397290097386650, -0.438442228614115470, -0.438487166034738700, -0.438532102359144030, --0.438577037587219500, -0.438621971718851980, -0.438666904753929500, -0.438711836692339760, -0.438756767533970860, -0.438801697278709660, -0.438846625926444190, -0.438891553477062550, --0.438936479930451650, -0.438981405286499540, -0.439026329545093910, -0.439071252706122850, -0.439116174769473230, -0.439161095735033260, -0.439206015602690460, -0.439250934372333090, --0.439295852043847970, -0.439340768617123180, -0.439385684092046480, -0.439430598468506020, -0.439475511746388600, -0.439520423925582440, -0.439565335005975220, -0.439610244987455050, --0.439655153869908830, -0.439700061653224780, -0.439744968337290990, -0.439789873921994310, -0.439834778407223010, -0.439879681792864740, -0.439924584078807690, -0.439969485264938730, --0.440014385351146060, -0.440059284337317500, -0.440104182223341080, -0.440149079009103770, -0.440193974694493840, -0.440238869279398930, -0.440283762763707230, -0.440328655147305740, --0.440373546430082590, -0.440418436611925590, -0.440463325692722950, -0.440508213672361540, -0.440553100550729600, -0.440597986327715300, -0.440642871003205650, -0.440687754577088860, --0.440732637049252640, -0.440777518419585230, -0.440822398687973630, -0.440867277854306020, -0.440912155918470220, -0.440957032880354480, -0.441001908739845680, -0.441046783496832180, --0.441091657151201690, -0.441136529702842450, -0.441181401151641450, -0.441226271497487000, -0.441271140740266850, -0.441316008879869270, -0.441360875916181280, -0.441405741849091090, --0.441450606678486900, -0.441495470404255850, -0.441540333026286090, -0.441585194544465490, -0.441630054958682350, -0.441674914268823600, -0.441719772474777620, -0.441764629576432200, --0.441809485573675610, -0.441854340466394880, -0.441899194254478320, -0.441944046937813810, -0.441988898516289530, -0.442033748989792640, -0.442078598358211340, -0.442123446621433550, --0.442168293779347580, -0.442213139831840460, -0.442257984778800460, -0.442302828620115550, -0.442347671355673930, -0.442392512985362750, -0.442437353509070260, -0.442482192926684780, --0.442527031238093450, -0.442571868443184580, -0.442616704541845980, -0.442661539533966030, -0.442706373419431810, -0.442751206198131690, -0.442796037869953580, -0.442840868434785710, --0.442885697892515310, -0.442930526243030640, -0.442975353486219690, -0.443020179621970770, -0.443065004650170960, -0.443109828570708630, -0.443154651383471760, -0.443199473088348620, --0.443244293685226440, -0.443289113173993500, -0.443333931554538210, -0.443378748826747660, -0.443423564990510280, -0.443468380045713930, -0.443513193992247030, -0.443558006829996800, --0.443602818558851530, -0.443647629178699210, -0.443692438689428200, -0.443737247090925710, -0.443782054383080100, -0.443826860565779360, -0.443871665638911890, -0.443916469602364800, --0.443961272456026570, -0.444006074199785160, -0.444050874833528950, -0.444095674357145200, -0.444140472770522210, -0.444185270073548470, -0.444230066266111110, -0.444274861348098630, --0.444319655319398990, -0.444364448179900620, -0.444409239929490720, -0.444454030568057710, -0.444498820095489630, -0.444543608511674900, -0.444588395816500730, -0.444633182009855580, --0.444677967091627490, -0.444722751061704890, -0.444767533919974980, -0.444812315666326290, -0.444857096300646740, -0.444901875822824920, -0.444946654232747980, -0.444991431530304400, --0.445036207715382210, -0.445080982787869950, -0.445125756747654810, -0.445170529594625270, -0.445215301328669820, -0.445260071949675760, -0.445304841457531460, -0.445349609852125070, --0.445394377133345070, -0.445439143301078700, -0.445483908355214510, -0.445528672295640530, -0.445573435122245230, -0.445618196834915990, -0.445662957433541280, -0.445707716918009140, --0.445752475288208110, -0.445797232544025480, -0.445841988685349800, -0.445886743712069160, -0.445931497624072030, -0.445976250421245720, -0.446021002103478840, -0.446065752670659840, --0.446110502122676060, -0.446155250459416010, -0.446199997680767850, -0.446244743786620100, -0.446289488776860090, -0.446334232651376340, -0.446378975410057060, -0.446423717052790660, --0.446468457579464630, -0.446513196989967440, -0.446557935284187250, -0.446602672462012630, -0.446647408523330900, -0.446692143468030710, -0.446736877296000090, -0.446781610007127740, --0.446826341601300910, -0.446871072078408260, -0.446915801438338310, -0.446960529680978490, -0.447005256806217330, -0.447049982813943040, -0.447094707704044190, -0.447139431476408170, --0.447184154130923550, -0.447228875667478540, -0.447273596085961730, -0.447318315386260600, -0.447363033568263620, -0.447407750631859060, -0.447452466576935550, -0.447497181403380460, --0.447541895111082440, -0.447586607699929640, -0.447631319169810750, -0.447676029520613140, -0.447720738752225510, -0.447765446864536340, -0.447810153857433220, -0.447854859730804740, --0.447899564484539050, -0.447944268118524890, -0.447988970632649640, -0.448033672026801940, -0.448078372300870110, -0.448123071454742730, -0.448167769488307280, -0.448212466401452400, --0.448257162194066310, -0.448301856866037800, -0.448346550417254190, -0.448391242847604180, -0.448435934156976130, -0.448480624345258590, -0.448525313412339140, -0.448570001358106370, --0.448614688182448600, -0.448659373885254510, -0.448704058466411590, -0.448748741925808550, -0.448793424263334020, -0.448838105478875540, -0.448882785572321810, -0.448927464543561080, --0.448972142392482120, -0.449016819118972400, -0.449061494722920620, -0.449106169204215140, -0.449150842562744570, -0.449195514798396590, -0.449240185911059740, -0.449284855900622450, --0.449329524766973410, -0.449374192510000160, -0.449418859129591450, -0.449463524625635600, -0.449508188998021310, -0.449552852246636160, -0.449597514371368910, -0.449642175372108210, --0.449686835248741700, -0.449731494001158140, -0.449776151629245780, -0.449820808132893490, -0.449865463511988750, -0.449910117766420370, -0.449954770896076720, -0.449999422900846490, --0.450044073780617340, -0.450088723535277960, -0.450133372164716830, -0.450178019668822650, -0.450222666047483010, -0.450267311300586730, -0.450311955428022100, -0.450356598429678070, --0.450401240305442100, -0.450445881055203000, -0.450490520678849650, -0.450535159176269630, -0.450579796547351640, -0.450624432791984160, -0.450669067910056060, -0.450713701901454820, --0.450758334766069360, -0.450802966503788090, -0.450847597114499730, -0.450892226598092080, -0.450936854954453790, -0.450981482183473390, -0.451026108285039640, -0.451070733259040290, --0.451115357105364050, -0.451159979823899440, -0.451204601414535280, -0.451249221877159210, -0.451293841211660110, -0.451338459417926390, -0.451383076495846910, -0.451427692445309340, --0.451472307266202580, -0.451516920958415390, -0.451561533521835530, -0.451606144956351820, -0.451650755261852780, -0.451695364438227220, -0.451739972485362910, -0.451784579403148590, --0.451829185191472860, -0.451873789850224580, -0.451918393379291410, -0.451962995778562250, -0.452007597047925590, -0.452052197187270350, -0.452096796196484240, -0.452141394075456120, --0.452185990824074510, -0.452230586442228300, -0.452275180929805290, -0.452319774286694290, -0.452364366512784220, -0.452408957607962900, -0.452453547572119140, -0.452498136405141530, --0.452542724106918980, -0.452587310677339210, -0.452631896116291180, -0.452676480423663370, -0.452721063599344830, -0.452765645643223190, -0.452810226555187430, -0.452854806335126090, --0.452899384982928140, -0.452943962498481350, -0.452988538881674670, -0.453033114132396610, -0.453077688250536180, -0.453122261235981090, -0.453166833088620380, -0.453211403808343020, --0.453255973395036700, -0.453300541848590480, -0.453345109168892870, -0.453389675355832910, -0.453434240409298360, -0.453478804329178200, -0.453523367115361060, -0.453567928767735880, --0.453612489286190470, -0.453657048670613850, -0.453701606920894620, -0.453746164036921750, -0.453790720018583060, -0.453835274865767580, -0.453879828578363950, -0.453924381156261100, --0.453968932599346900, -0.454013482907510420, -0.454058032080640610, -0.454102580118625310, -0.454147127021353510, -0.454191672788713970, -0.454236217420595610, -0.454280760916886350, --0.454325303277475110, -0.454369844502250650, -0.454414384591102010, -0.454458923543916980, -0.454503461360584670, -0.454547998040993660, -0.454592533585033100, -0.454637067992590740, --0.454681601263555780, -0.454726133397816810, -0.454770664395262870, -0.454815194255781870, -0.454859722979262910, -0.454904250565594640, -0.454948777014666130, -0.454993302326365310, --0.455037826500581220, -0.455082349537202950, -0.455126871436118410, -0.455171392197216700, -0.455215911820386450, -0.455260430305516880, -0.455304947652495850, -0.455349463861212440, --0.455393978931555370, -0.455438492863413700, -0.455483005656675430, -0.455527517311229700, -0.455572027826965150, -0.455616537203770880, -0.455661045441534910, -0.455705552540146330, --0.455750058499493850, -0.455794563319466610, -0.455839066999952580, -0.455883569540840920, -0.455928070942020700, -0.455972571203379860, -0.456017070324807650, -0.456061568306192770, --0.456106065147424360, -0.456150560848390340, -0.456195055408979980, -0.456239548829081960, -0.456284041108585450, -0.456328532247378460, -0.456373022245350150, -0.456417511102389260, --0.456461998818385010, -0.456506485393225360, -0.456550970826799460, -0.456595455118996190, -0.456639938269704610, -0.456684420278812840, -0.456728901146210010, -0.456773380871785370, --0.456817859455426800, -0.456862336897023660, -0.456906813196464590, -0.456951288353638960, -0.456995762368434700, -0.457040235240741000, -0.457084706970446730, -0.457129177557441090, --0.457173647001612120, -0.457218115302849000, -0.457262582461040620, -0.457307048476076170, -0.457351513347843690, -0.457395977076232470, -0.457440439661131240, -0.457484901102429340, --0.457529361400014820, -0.457573820553776880, -0.457618278563604370, -0.457662735429386620, -0.457707191151011550, -0.457751645728368570, -0.457796099161346840, -0.457840551449834490, --0.457885002593720720, -0.457929452592894470, -0.457973901447244980, -0.458018349156660340, -0.458062795721029810, -0.458107241140242320, -0.458151685414187100, -0.458196128542752320, --0.458240570525827170, -0.458285011363300580, -0.458329451055061900, -0.458373889600999170, -0.458418327001001770, -0.458462763254958490, -0.458507198362758720, -0.458551632324290530, --0.458596065139443290, -0.458640496808106310, -0.458684927330167640, -0.458729356705516680, -0.458773784934042310, -0.458818212015633890, -0.458862637950179560, -0.458907062737568590, --0.458951486377690010, -0.458995908870433070, -0.459040330215686020, -0.459084750413338070, -0.459129169463278310, -0.459173587365395990, -0.459218004119579300, -0.459262419725717570, --0.459306834183699890, -0.459351247493415440, -0.459395659654752490, -0.459440070667600400, -0.459484480531848540, -0.459528889247385050, -0.459573296814099360, -0.459617703231880390, --0.459662108500617620, -0.459706512620199130, -0.459750915590514400, -0.459795317411452350, -0.459839718082902470, -0.459884117604752840, -0.459928515976892880, -0.459972913199211690, --0.460017309271598620, -0.460061704193941820, -0.460106097966130830, -0.460150490588054570, -0.460194882059602460, -0.460239272380662760, -0.460283661551124880, -0.460328049570878250, --0.460372436439811070, -0.460416822157812820, -0.460461206724772530, -0.460505590140579620, -0.460549972405122300, -0.460594353518290090, -0.460638733479971970, -0.460683112290057430, --0.460727489948434710, -0.460771866454993300, -0.460816241809622160, -0.460860616012210840, -0.460904989062647600, -0.460949360960821840, -0.460993731706622720, -0.461038101299939660, --0.461082469740660970, -0.461126837028676070, -0.461171203163874110, -0.461215568146144510, -0.461259931975375570, -0.461304294651456840, -0.461348656174277780, -0.461393016543726660, --0.461437375759693010, -0.461481733822065920, -0.461526090730734860, -0.461570446485588200, -0.461614801086515480, -0.461659154533405670, -0.461703506826148410, -0.461747857964632020, --0.461792207948745930, -0.461836556778379310, -0.461880904453421730, -0.461925250973761530, -0.461969596339288140, -0.462013940549890760, -0.462058283605458970, -0.462102625505881050, --0.462146966251046560, -0.462191305840845060, -0.462235644275164890, -0.462279981553895600, -0.462324317676926390, -0.462368652644146780, -0.462412986455445100, -0.462457319110710970, --0.462501650609833560, -0.462545980952702440, -0.462590310139205930, -0.462634638169233670, -0.462678965042674810, -0.462723290759418930, -0.462767615319354400, -0.462811938722370860, --0.462856260968357470, -0.462900582057203800, -0.462944901988798340, -0.462989220763030560, -0.463033538379790170, -0.463077854838965520, -0.463122170140446210, -0.463166484284121550, --0.463210797269881010, -0.463255109097613080, -0.463299419767207400, -0.463343729278553160, -0.463388037631540020, -0.463432344826056330, -0.463476650861991860, -0.463520955739235680, --0.463565259457677570, -0.463609562017205880, -0.463653863417710310, -0.463698163659080060, -0.463742462741204790, -0.463786760663973010, -0.463831057427274320, -0.463875353030997920, --0.463919647475033610, -0.463963940759269720, -0.464008232883596050, -0.464052523847902130, -0.464096813652076560, -0.464141102296008910, -0.464185389779588560, -0.464229676102705100, --0.464273961265247060, -0.464318245267104080, -0.464362528108165530, -0.464406809788321050, -0.464451090307459120, -0.464495369665469500, -0.464539647862241440, -0.464583924897664650, --0.464628200771627640, -0.464672475484020130, -0.464716749034731480, -0.464761021423651330, -0.464805292650668220, -0.464849562715671900, -0.464893831618552020, -0.464938099359197220, --0.464982365937497140, -0.465026631353341160, -0.465070895606618960, -0.465115158697219200, -0.465159420625031460, -0.465203681389945220, -0.465247940991850180, -0.465292199430634880, --0.465336456706189060, -0.465380712818402100, -0.465424967767163800, -0.465469221552362640, -0.465513474173888440, -0.465557725631630560, -0.465601975925478750, -0.465646225055321610, --0.465690473021048930, -0.465734719822550440, -0.465778965459714760, -0.465823209932431650, -0.465867453240590530, -0.465911695384081170, -0.465955936362792200, -0.466000176176613320, --0.466044414825434070, -0.466088652309144150, -0.466132888627632250, -0.466177123780788070, -0.466221357768501100, -0.466265590590661140, -0.466309822247156780, -0.466354052737877890, --0.466398282062713830, -0.466442510221554530, -0.466486737214288520, -0.466530963040805660, -0.466575187700995820, -0.466619411194747590, -0.466663633521950840, -0.466707854682494980, --0.466752074676269890, -0.466796293503164210, -0.466840511163067850, -0.466884727655870190, -0.466928942981461090, -0.466973157139729200, -0.467017370130564490, -0.467061581953856330, --0.467105792609494590, -0.467150002097368010, -0.467194210417366360, -0.467238417569379230, -0.467282623553296470, -0.467326828369006740, -0.467371032016399900, -0.467415234495365540, --0.467459435805793470, -0.467503635947572380, -0.467547834920592260, -0.467592032724742920, -0.467636229359913110, -0.467680424825992700, -0.467724619122871220, -0.467768812250438650, --0.467813004208583630, -0.467857194997196080, -0.467901384616165540, -0.467945573065381930, -0.467989760344734000, -0.468033946454111670, -0.468078131393404480, -0.468122315162502360, --0.468166497761294040, -0.468210679189669520, -0.468254859447518270, -0.468299038534730260, -0.468343216451194260, -0.468387393196800230, -0.468431568771438100, -0.468475743174996680, --0.468519916407365900, -0.468564088468435280, -0.468608259358094910, -0.468652429076233450, -0.468696597622740910, -0.468740764997506890, -0.468784931200421360, -0.468829096231373090, --0.468873260090252100, -0.468917422776947920, -0.468961584291350600, -0.469005744633348930, -0.469049903802832900, -0.469094061799692150, -0.469138218623816610, -0.469182374275095070, --0.469226528753417640, -0.469270682058674340, -0.469314834190753870, -0.469358985149546330, -0.469403134934941350, -0.469447283546828910, -0.469491430985097820, -0.469535577249638240, --0.469579722340339620, -0.469623866257092180, -0.469668008999784610, -0.469712150568307060, -0.469756290962549120, -0.469800430182400860, -0.469844568227751110, -0.469888705098489960, --0.469932840794507030, -0.469976975315692440, -0.470021108661934970, -0.470065240833124730, -0.470109371829151410, -0.470153501649905050, -0.470197630295274500, -0.470241757765149930, --0.470285884059421340, -0.470330009177977630, -0.470374133120708910, -0.470418255887504850, -0.470462377478255590, -0.470506497892849930, -0.470550617131178070, -0.470594735193129670, --0.470638852078594790, -0.470682967787462380, -0.470727082319622570, -0.470771195674965060, -0.470815307853379940, -0.470859418854756180, -0.470903528678983880, -0.470947637325952740, --0.470991744795552890, -0.471035851087673320, -0.471079956202204050, -0.471124060139035350, -0.471168162898056080, -0.471212264479156430, -0.471256364882226110, -0.471300464107155260, --0.471344562153832860, -0.471388659022149050, -0.471432754711993580, -0.471476849223256610, -0.471520942555827160, -0.471565034709595320, -0.471609125684450960, -0.471653215480284100, --0.471697304096983850, -0.471741391534440340, -0.471785477792543320, -0.471829562871183050, -0.471873646770248460, -0.471917729489629730, -0.471961811029217080, -0.472005891388899480, --0.472049970568567230, -0.472094048568109990, -0.472138125387418010, -0.472182201026380370, -0.472226275484887210, -0.472270348762828360, -0.472314420860094060, -0.472358491776573300, --0.472402561512156260, -0.472446630066732880, -0.472490697440193290, -0.472534763632426580, -0.472578828643322960, -0.472622892472772230, -0.472666955120664700, -0.472711016586889410, --0.472755076871336500, -0.472799135973895950, -0.472843193894457950, -0.472887250632911590, -0.472931306189147080, -0.472975360563054730, -0.473019413754523550, -0.473063465763443820, --0.473107516589705460, -0.473151566233198710, -0.473195614693812660, -0.473239661971437520, -0.473283708065963260, -0.473327752977280140, -0.473371796705277180, -0.473415839249844760, --0.473459880610872800, -0.473503920788251490, -0.473547959781869980, -0.473591997591618520, -0.473636034217387150, -0.473680069659066060, -0.473724103916544400, -0.473768136989712490, --0.473812168878460560, -0.473856199582677880, -0.473900229102254710, -0.473944257437080960, -0.473988284587046950, -0.474032310552041870, -0.474076335331955980, -0.474120358926679250, --0.474164381336102000, -0.474208402560113430, -0.474252422598603840, -0.474296441451463210, -0.474340459118581860, -0.474384475599848980, -0.474428490895154880, -0.474472505004389590, --0.474516517927443430, -0.474560529664205530, -0.474604540214566380, -0.474648549578416230, -0.474692557755644280, -0.474736564746141010, -0.474780570549796280, -0.474824575166500560, --0.474868578596142950, -0.474912580838613930, -0.474956581893803460, -0.475000581761601930, -0.475044580441898510, -0.475088577934583700, -0.475132574239547410, -0.475176569356680070, --0.475220563285870920, -0.475264556027010400, -0.475308547579988470, -0.475352537944695560, -0.475396527121020870, -0.475440515108854930, -0.475484501908088050, -0.475528487518609540, --0.475572471940309830, -0.475616455173078930, -0.475660437216807230, -0.475704418071384140, -0.475748397736699910, -0.475792376212644750, -0.475836353499109020, -0.475880329595982030, --0.475924304503154210, -0.475968278220515630, -0.476012250747956720, -0.476056222085366800, -0.476100192232636330, -0.476144161189655410, -0.476188128956314460, -0.476232095532502790, --0.476276060918110870, -0.476320025113028790, -0.476363988117147090, -0.476407949930355010, -0.476451910552543050, -0.476495869983601660, -0.476539828223420280, -0.476583785271889270, --0.476627741128898830, -0.476671695794339430, -0.476715649268100390, -0.476759601550072190, -0.476803552640145010, -0.476847502538209340, -0.476891451244154550, -0.476935398757871110, --0.476979345079249220, -0.477023290208179300, -0.477067234144550770, -0.477111176888254160, -0.477155118439179630, -0.477199058797217690, -0.477242997962257660, -0.477286935934190190, --0.477330872712905750, -0.477374808298293760, -0.477418742690244760, -0.477462675888648880, -0.477506607893396660, -0.477550538704377580, -0.477594468321482170, -0.477638396744600570, --0.477682323973623370, -0.477726250008439930, -0.477770174848940910, -0.477814098495016440, -0.477858020946557100, -0.477901942203452330, -0.477945862265592710, -0.477989781132868440, --0.478033698805170100, -0.478077615282387130, -0.478121530564410090, -0.478165444651129650, -0.478209357542435210, -0.478253269238217370, -0.478297179738366330, -0.478341089042772730, --0.478384997151326040, -0.478428904063916860, -0.478472809780435440, -0.478516714300772360, -0.478560617624817110, -0.478604519752460320, -0.478648420683592200, -0.478692320418103450, --0.478736218955883470, -0.478780116296822990, -0.478824012440812240, -0.478867907387741760, -0.478911801137501200, -0.478955693689981140, -0.478999585045071790, -0.479043475202663880, --0.479087364162646910, -0.479131251924911570, -0.479175138489348450, -0.479219023855847080, -0.479262908024298160, -0.479306790994591950, -0.479350672766619190, -0.479394553340269370, --0.479438432715433130, -0.479482310892000830, -0.479526187869863120, -0.479570063648909530, -0.479613938229030810, -0.479657811610117280, -0.479701683792059570, -0.479745554774747280, --0.479789424558071110, -0.479833293141921360, -0.479877160526188730, -0.479921026710762870, -0.479964891695534410, -0.480008755480394120, -0.480052618065231580, -0.480096479449937440, --0.480140339634402170, -0.480184198618516360, -0.480228056402169760, -0.480271912985252960, -0.480315768367656380, -0.480359622549270780, -0.480403475529985690, -0.480447327309691970, --0.480491177888279890, -0.480535027265640290, -0.480578875441662720, -0.480622722416237940, -0.480666568189256400, -0.480710412760608770, -0.480754256130184800, -0.480798098297875120, --0.480841939263570610, -0.480885779027160840, -0.480929617588536640, -0.480973454947588420, -0.481017291104206930, -0.481061126058281830, -0.481104959809703910, -0.481148792358363550, --0.481192623704151670, -0.481236453846957790, -0.481280282786672790, -0.481324110523187130, -0.481367937056391530, -0.481411762386175670, -0.481455586512430480, -0.481499409435046270, --0.481543231153913950, -0.481587051668923130, -0.481630870979964710, -0.481674689086929510, -0.481718505989707220, -0.481762321688188610, -0.481806136182264200, -0.481849949471824910, --0.481893761556760280, -0.481937572436961280, -0.481981382112318340, -0.482025190582722360, -0.482068997848062950, -0.482112803908231080, -0.482156608763117220, -0.482200412412612240, --0.482244214856605790, -0.482288016094988840, -0.482331816127651860, -0.482375614954485670, -0.482419412575380120, -0.482463208990225990, -0.482507004198913850, -0.482550798201334620, --0.482594590997377950, -0.482638382586934870, -0.482682172969896180, -0.482725962146151650, -0.482769750115592260, -0.482813536878108460, -0.482857322433591250, -0.482901106781930320, --0.482944889923016600, -0.482988671856740660, -0.483032452582993430, -0.483076232101664730, -0.483120010412645410, -0.483163787515826060, -0.483207563411097660, -0.483251338098349910, --0.483295111577473850, -0.483338883848360050, -0.483382654910899380, -0.483426424764981710, -0.483470193410497960, -0.483513960847339110, -0.483557727075394960, -0.483601492094556500, --0.483645255904714300, -0.483689018505759400, -0.483732779897581510, -0.483776540080071700, -0.483820299053120520, -0.483864056816619040, -0.483907813370456960, -0.483951568714525380, --0.483995322848714880, -0.484039075772916440, -0.484082827487019920, -0.484126577990916350, -0.484170327284496330, -0.484214075367650880, -0.484257822240269860, -0.484301567902244270, --0.484345312353465170, -0.484389055593822390, -0.484432797623206960, -0.484476538441509560, -0.484520278048621190, -0.484564016444431760, -0.484607753628832240, -0.484651489601713340, --0.484695224362966140, -0.484738957912480510, -0.484782690250147420, -0.484826421375857630, -0.484870151289502230, -0.484913879990970960, -0.484957607480155100, -0.485001333756945150, --0.485045058821232280, -0.485088782672906340, -0.485132505311858480, -0.485176226737979330, -0.485219946951160050, -0.485263665951290450, -0.485307383738261770, -0.485351100311964930, --0.485394815672289980, -0.485438529819128000, -0.485482242752369730, -0.485525954471906160, -0.485569664977627380, -0.485613374269424410, -0.485657082347188070, -0.485700789210809340, --0.485744494860178290, -0.485788199295185960, -0.485831902515723170, -0.485875604521680990, -0.485919305312949410, -0.485963004889419570, -0.486006703250982220, -0.486050400397528500, --0.486094096328948400, -0.486137791045133050, -0.486181484545973600, -0.486225176831360070, -0.486268867901183570, -0.486312557755334940, -0.486356246393705280, -0.486399933816184630, --0.486443620022664110, -0.486487305013034610, -0.486530988787187150, -0.486574671345011870, -0.486618352686399910, -0.486662032811242100, -0.486705711719429560, -0.486749389410852380, --0.486793065885401720, -0.486836741142968380, -0.486880415183443550, -0.486924088006717330, -0.486967759612680910, -0.487011430001225430, -0.487055099172241050, -0.487098767125618890, --0.487142433861249780, -0.487186099379025020, -0.487229763678834580, -0.487273426760569780, -0.487317088624121380, -0.487360749269380670, -0.487404408696237690, -0.487448066904583640, --0.487491723894309500, -0.487535379665306410, -0.487579034217464460, -0.487622687550674950, -0.487666339664828700, -0.487709990559817010, -0.487753640235529920, -0.487797288691858790, --0.487840935928694760, -0.487884581945928040, -0.487928226743449880, -0.487971870321151140, -0.488015512678923120, -0.488059153816655930, -0.488102793734240810, -0.488146432431568740, --0.488190069908530980, -0.488233706165017660, -0.488277341200920090, -0.488320975016129140, -0.488364607610536130, -0.488408238984031240, -0.488451869136505730, -0.488495498067850590, --0.488539125777957050, -0.488582752266715330, -0.488626377534016720, -0.488670001579752160, -0.488713624403813000, -0.488757246006089390, -0.488800866386472630, -0.488844485544854160, --0.488888103481124050, -0.488931720195173670, -0.488975335686894000, -0.489018949956176400, -0.489062563002911010, -0.489106174826989200, -0.489149785428302010, -0.489193394806740680, --0.489237002962195520, -0.489280609894557790, -0.489324215603718640, -0.489367820089569250, -0.489411423351999940, -0.489455025390902130, -0.489498626206166690, -0.489542225797685080, --0.489585824165347520, -0.489629421309045410, -0.489673017228670180, -0.489716611924111980, -0.489760205395262220, -0.489803797642011980, -0.489847388664252650, -0.489890978461874400, --0.489934567034768730, -0.489978154382826660, -0.490021740505939610, -0.490065325403997780, -0.490108909076892640, -0.490152491524515290, -0.490196072746757030, -0.490239652743508230, --0.490283231514660300, -0.490326809060104290, -0.490370385379731600, -0.490413960473432610, -0.490457534341098730, -0.490501106982621340, -0.490544678397890840, -0.490588248586798670, --0.490631817549235850, -0.490675385285093860, -0.490718951794263000, -0.490762517076634820, -0.490806081132100340, -0.490849643960550970, -0.490893205561877160, -0.490936765935970350, --0.490980325082721600, -0.491023883002022430, -0.491067439693763150, -0.491110995157835300, -0.491154549394129950, -0.491198102402538640, -0.491241654182951630, -0.491285204735260550, --0.491328754059356390, -0.491372302155130780, -0.491415849022474040, -0.491459394661277640, -0.491502939071433160, -0.491546482252830930, -0.491590024205362520, -0.491633564928919020, --0.491677104423392020, -0.491720642688671830, -0.491764179724650090, -0.491807715531217880, -0.491851250108266750, -0.491894783455687100, -0.491938315573370530, -0.491981846461208180, --0.492025376119091580, -0.492068904546911160, -0.492112431744558430, -0.492155957711924660, -0.492199482448901380, -0.492243005955379010, -0.492286528231249130, -0.492330049276403340, --0.492373569090731990, -0.492417087674126730, -0.492460605026478760, -0.492504121147679660, -0.492547636037619860, -0.492591149696191000, -0.492634662123284270, -0.492678173318791210, --0.492721683282602410, -0.492765192014609330, -0.492808699514703350, -0.492852205782775940, -0.492895710818717640, -0.492939214622420070, -0.492982717193774510, -0.493026218532672480, --0.493069718639004560, -0.493113217512662290, -0.493156715153537430, -0.493200211561520330, -0.493243706736502750, -0.493287200678375890, -0.493330693387031390, -0.493374184862359840, --0.493417675104252770, -0.493461164112601490, -0.493504651887297750, -0.493548138428231980, -0.493591623735295800, -0.493635107808380660, -0.493678590647378070, -0.493722072252178620, --0.493765552622674020, -0.493809031758755510, -0.493852509660314800, -0.493895986327242460, -0.493939461759430150, -0.493982935956769560, -0.494026408919151280, -0.494069880646466950, --0.494113351138607880, -0.494156820395465880, -0.494200288416931420, -0.494243755202896210, -0.494287220753251650, -0.494330685067889410, -0.494374148146700050, -0.494417609989575350, --0.494461070596406650, -0.494504529967085600, -0.494547988101502910, -0.494591444999550210, -0.494634900661118870, -0.494678355086100700, -0.494721808274386280, -0.494765260225867310, --0.494808710940435160, -0.494852160417981630, -0.494895608658397320, -0.494939055661574030, -0.494982501427403470, -0.495025945955776260, -0.495069389246584170, -0.495112831299718610, --0.495156272115071350, -0.495199711692533070, -0.495243150031995480, -0.495286587133350000, -0.495330022996488480, -0.495373457621301470, -0.495416891007680830, -0.495460323155517970, --0.495503754064704700, -0.495547183735131620, -0.495590612166690650, -0.495634039359273080, -0.495677465312770850, -0.495720890027074530, -0.495764313502076000, -0.495807735737667070, --0.495851156733738420, -0.495894576490181930, -0.495937995006888900, -0.495981412283751370, -0.496024828320659860, -0.496068243117506250, -0.496111656674182110, -0.496155068990579150, --0.496198480066588180, -0.496241889902101000, -0.496285298497009090, -0.496328705851204310, -0.496372111964577370, -0.496415516837020180, -0.496458920468424160, -0.496502322858681230, --0.496545724007682150, -0.496589123915318730, -0.496632522581482880, -0.496675920006065360, -0.496719316188958040, -0.496762711130052380, -0.496806104829240370, -0.496849497286412760, --0.496892888501461350, -0.496936278474277680, -0.496979667204753780, -0.497023054692780300, -0.497066440938249140, -0.497109825941051960, -0.497153209701080510, -0.497196592218225710, --0.497239973492379420, -0.497283353523433220, -0.497326732311278940, -0.497370109855807540, -0.497413486156910830, -0.497456861214480350, -0.497500235028408180, -0.497543607598585010, --0.497586978924902830, -0.497630349007253560, -0.497673717845528050, -0.497717085439618230, -0.497760451789415750, -0.497803816894812460, -0.497847180755699280, -0.497890543371968140, --0.497933904743510620, -0.497977264870218760, -0.498020623751983360, -0.498063981388696340, -0.498107337780249400, -0.498150692926534520, -0.498194046827442500, -0.498237399482865380, --0.498280750892694750, -0.498324101056822680, -0.498367449975139880, -0.498410797647538540, -0.498454144073910530, -0.498497489254146780, -0.498540833188139350, -0.498584175875779800, --0.498627517316960200, -0.498670857511571420, -0.498714196459505540, -0.498757534160654100, -0.498800870614909240, -0.498844205822161820, -0.498887539782303880, -0.498930872495227110, --0.498974203960823540, -0.499017534178984090, -0.499060863149600740, -0.499104190872565300, -0.499147517347769740, -0.499190842575104990, -0.499234166554463180, -0.499277489285736290, --0.499320810768815290, -0.499364131003592340, -0.499407449989958950, -0.499450767727807390, -0.499494084217028510, -0.499537399457514460, -0.499580713449156830, -0.499624026191847870, --0.499667337685478440, -0.499710647929940630, -0.499753956925126250, -0.499797264670927330, -0.499840571167234900, -0.499883876413941000, -0.499927180410937420, -0.499970483158116320, --0.500013784655368610, -0.500057084902586380, -0.500100383899661830, -0.500143681646486040, -0.500186978142950990, -0.500230273388948430, -0.500273567384370680, -0.500316860129108480, --0.500360151623054250, -0.500403441866099640, -0.500446730858136730, -0.500490018599056730, -0.500533305088751600, -0.500576590327113210, -0.500619874314033760, -0.500663157049404230, --0.500706438533116690, -0.500749718765063250, -0.500792997745135750, -0.500836275473225400, -0.500879551949224400, -0.500922827173024500, -0.500966101144518010, -0.501009373863595790, --0.501052645330150150, -0.501095915544073290, -0.501139184505256190, -0.501182452213591150, -0.501225718668970030, -0.501268983871285050, -0.501312247820427160, -0.501355510516288570, --0.501398771958761370, -0.501442032147737530, -0.501485291083108240, -0.501528548764765710, -0.501571805192601810, -0.501615060366508710, -0.501658314286377640, -0.501701566952100890, --0.501744818363570100, -0.501788068520677700, -0.501831317423314660, -0.501874565071373400, -0.501917811464746120, -0.501961056603323910, -0.502004300486999070, -0.502047543115663460, --0.502090784489209300, -0.502134024607527870, -0.502177263470511390, -0.502220501078051830, -0.502263737430041270, -0.502306972526371020, -0.502350206366933390, -0.502393438951620140, --0.502436670280323790, -0.502479900352935330, -0.502523129169347160, -0.502566356729451050, -0.502609583033139520, -0.502652808080303660, -0.502696031870835780, -0.502739254404628190, --0.502782475681572080, -0.502825695701559770, -0.502868914464483230, -0.502912131970234770, -0.502955348218705580, -0.502998563209788090, -0.503041776943374150, -0.503084989419356200, --0.503128200637625310, -0.503171410598073910, -0.503214619300594080, -0.503257826745078020, -0.503301032931417040, -0.503344237859503440, -0.503387441529229320, -0.503430643940486870, --0.503473845093167500, -0.503517044987163540, -0.503560243622366840, -0.503603440998670050, -0.503646637115964250, -0.503689831974141860, -0.503733025573095180, -0.503776217912715650, --0.503819408992895570, -0.503862598813526910, -0.503905787374502200, -0.503948974675712650, -0.503992160717050550, -0.504035345498408120, -0.504078529019677760, -0.504121711280750670, --0.504164892281519280, -0.504208072021875680, -0.504251250501712270, -0.504294427720920260, -0.504337603679392290, -0.504380778377020330, -0.504423951813696700, -0.504467123989312930, --0.504510294903761310, -0.504553464556934280, -0.504596632948723260, -0.504639800079020650, -0.504682965947718550, -0.504726130554709380, -0.504769293899884450, -0.504812455983136400, --0.504855616804357200, -0.504898776363439270, -0.504941934660274040, -0.504985091694754030, -0.505028247466771220, -0.505071401976218250, -0.505114555222986320, -0.505157707206968070, --0.505200857928055470, -0.505244007386141170, -0.505287155581116370, -0.505330302512873810, -0.505373448181305810, -0.505416592586303780, -0.505459735727760370, -0.505502877605567560, --0.505546018219617980, -0.505589157569802940, -0.505632295656014970, -0.505675432478146280, -0.505718568036089390, -0.505761702329735720, -0.505804835358977800, -0.505847967123707720, --0.505891097623818230, -0.505934226859200530, -0.505977354829747260, -0.506020481535350620, -0.506063606975903140, -0.506106731151296340, -0.506149854061422650, -0.506192975706174720, --0.506236096085443950, -0.506279215199122890, -0.506322333047103830, -0.506365449629279430, -0.506408564945540870, -0.506451678995781030, -0.506494791779891870, -0.506537903297766160, --0.506581013549295300, -0.506624122534371950, -0.506667230252888290, -0.506710336704736970, -0.506753441889809310, -0.506796545807998160, -0.506839648459195600, -0.506882749843294290, --0.506925849960185640, -0.506968948809762510, -0.507012046391916990, -0.507055142706541620, -0.507098237753528140, -0.507141331532768970, -0.507184424044156980, -0.507227515287583360, --0.507270605262941100, -0.507313693970122270, -0.507356781409019630, -0.507399867579524600, -0.507442952481529930, -0.507486036114927930, -0.507529118479611130, -0.507572199575471170, --0.507615279402400810, -0.507658357960292130, -0.507701435249037990, -0.507744511268529930, -0.507787586018660480, -0.507830659499322160, -0.507873731710407510, -0.507916802651808160, --0.507959872323416880, -0.508002940725126200, -0.508046007856827850, -0.508089073718414390, -0.508132138309778330, -0.508175201630812310, -0.508218263681407880, -0.508261324461457780, --0.508304383970854420, -0.508347442209490460, -0.508390499177257430, -0.508433554874048290, -0.508476609299755130, -0.508519662454270940, -0.508562714337487120, -0.508605764949296550, --0.508648814289591630, -0.508691862358265020, -0.508734909155208360, -0.508777954680314390, -0.508820998933475880, -0.508864041914584560, -0.508907083623533210, -0.508950124060214000, --0.508993163224519930, -0.509036201116342620, -0.509079237735574730, -0.509122273082108780, -0.509165307155837520, -0.509208339956652710, -0.509251371484446880, -0.509294401739112780, --0.509337430720542940, -0.509380458428629220, -0.509423484863264280, -0.509466510024340740, -0.509509533911751130, -0.509552556525387450, -0.509595577865142310, -0.509638597930908270, --0.509681616722578060, -0.509724634240043550, -0.509767650483197280, -0.509810665451932430, -0.509853679146140440, -0.509896691565714270, -0.509939702710546340, -0.509982712580529630, --0.510025721175555670, -0.510068728495517430, -0.510111734540307340, -0.510154739309818360, -0.510197742803942140, -0.510240745022571550, -0.510283745965599110, -0.510326745632917580, --0.510369744024418930, -0.510412741139995910, -0.510455736979540940, -0.510498731542947120, -0.510541724830106070, -0.510584716840910670, -0.510627707575253890, -0.510670697033027480, --0.510713685214124190, -0.510756672118436780, -0.510799657745858120, -0.510842642096279940, -0.510885625169595130, -0.510928606965696200, -0.510971587484476130, -0.511014566725826790, --0.511057544689641040, -0.511100521375811300, -0.511143496784230770, -0.511186470914791080, -0.511229443767385220, -0.511272415341905710, -0.511315385638245520, -0.511358354656296530, --0.511401322395951710, -0.511444288857103910, -0.511487254039645010, -0.511530217943467980, -0.511573180568465350, -0.511616141914530200, -0.511659101981554290, -0.511702060769430700, --0.511745018278051860, -0.511787974507310950, -0.511830929457099630, -0.511873883127311080, -0.511916835517837730, -0.511959786628572780, -0.512002736459407860, -0.512045685010236170, --0.512088632280950250, -0.512131578271443180, -0.512174522981606710, -0.512217466411333920, -0.512260408560517910, -0.512303349429050540, -0.512346289016824660, -0.512389227323733150, --0.512432164349668980, -0.512475100094523910, -0.512518034558191230, -0.512560967740563370, -0.512603899641533410, -0.512646830260993450, -0.512689759598836340, -0.512732687654954830, --0.512775614429242020, -0.512818539921589770, -0.512861464131891260, -0.512904387060038940, -0.512947308705926090, -0.512990229069444690, -0.513033148150487620, -0.513076065948947610, --0.513118982464717990, -0.513161897697690380, -0.513204811647758110, -0.513247724314814140, -0.513290635698750550, -0.513333545799460330, -0.513376454616836230, -0.513419362150771330, --0.513462268401157720, -0.513505173367888370, -0.513548077050856140, -0.513590979449954130, -0.513633880565074310, -0.513676780396109640, -0.513719678942953120, -0.513762576205497810, --0.513805472183635700, -0.513848366877259770, -0.513891260286263090, -0.513934152410538530, -0.513977043249978170, -0.514019932804475330, -0.514062821073922980, -0.514105708058213210, --0.514148593757239090, -0.514191478170893610, -0.514234361299069740, -0.514277243141659570, -0.514320123698556400, -0.514363002969652870, -0.514405880954842190, -0.514448757654016430, --0.514491633067068690, -0.514534507193891930, -0.514577380034379360, -0.514620251588422950, -0.514663121855915780, -0.514705990836750950, -0.514748858530821420, -0.514791724938019390, --0.514834590058238060, -0.514877453891370740, -0.514920316437309290, -0.514963177695947020, -0.515006037667176900, -0.515048896350892020, -0.515091753746984460, -0.515134609855347540, --0.515177464675874220, -0.515220318208457480, -0.515263170452989640, -0.515306021409363880, -0.515348871077472960, -0.515391719457210300, -0.515434566548467980, -0.515477412351139310, --0.515520256865117040, -0.515563100090294490, -0.515605942026563850, -0.515648782673818310, -0.515691622031950850, -0.515734460100854660, -0.515777296880421950, -0.515820132370546030, --0.515862966571120190, -0.515905799482036520, -0.515948631103188340, -0.515991461434468610, -0.516034290475770650, -0.516077118226986540, -0.516119944688009590, -0.516162769858732770, --0.516205593739049510, -0.516248416328851770, -0.516291237628033080, -0.516334057636486210, -0.516376876354104670, -0.516419693780780560, -0.516462509916407080, -0.516505324760877520, --0.516548138314084860, -0.516590950575921530, -0.516633761546280820, -0.516676571225056170, -0.516719379612139650, -0.516762186707424580, -0.516804992510804140, -0.516847797022171650, --0.516890600241419200, -0.516933402168440300, -0.516976202803127840, -0.517019002145375330, -0.517061800195074860, -0.517104596952119970, -0.517147392416403510, -0.517190186587819010, --0.517232979466258680, -0.517275771051615820, -0.517318561343783510, -0.517361350342655290, -0.517404138048123240, -0.517446924460080890, -0.517489709578421550, -0.517532493403037640, --0.517575275933822470, -0.517618057170669000, -0.517660837113470880, -0.517703615762120320, -0.517746393116510610, -0.517789169176534950, -0.517831943942086870, -0.517874717413058460, --0.517917489589343140, -0.517960260470834210, -0.518003030057425100, -0.518045798349007880, -0.518088565345476200, -0.518131331046723150, -0.518174095452642150, -0.518216858563125490, --0.518259620378066720, -0.518302380897359250, -0.518345140120895500, -0.518387898048568880, -0.518430654680272500, -0.518473410015899860, -0.518516164055343290, -0.518558916798496310, --0.518601668245252110, -0.518644418395504010, -0.518687167249144650, -0.518729914806067230, -0.518772661066165040, -0.518815406029331630, -0.518858149695459290, -0.518900892064441570, --0.518943633136171640, -0.518986372910543060, -0.519029111387448120, -0.519071848566780350, -0.519114584448432950, -0.519157319032299560, -0.519200052318272490, -0.519242784306245260, --0.519285514996111420, -0.519328244387763370, -0.519370972481094870, -0.519413699275998790, -0.519456424772368860, -0.519499148970097520, -0.519541871869078300, -0.519584593469204490, --0.519627313770369530, -0.519670032772465820, -0.519712750475387120, -0.519755466879026520, -0.519798181983277540, -0.519840895788032830, -0.519883608293185920, -0.519926319498629890, --0.519969029404258490, -0.520011738009964030, -0.520054445315640380, -0.520097151321180950, -0.520139856026478280, -0.520182559431425880, -0.520225261535917190, -0.520267962339845620, --0.520310661843103820, -0.520353360045585410, -0.520396056947183490, -0.520438752547791930, -0.520481446847303020, -0.520524139845610520, -0.520566831542607740, -0.520609521938188210, --0.520652211032244460, -0.520694898824670240, -0.520737585315358630, -0.520780270504203610, -0.520822954391097490, -0.520865636975933910, -0.520908318258606730, -0.520950998239008260, --0.520993676917032360, -0.521036354292572330, -0.521079030365521720, -0.521121705135773160, -0.521164378603220290, -0.521207050767756530, -0.521249721629275520, -0.521292391187669790, --0.521335059442833090, -0.521377726394658850, -0.521420392043040580, -0.521463056387870940, -0.521505719429043670, -0.521548381166452080, -0.521591041599989920, -0.521633700729549840, --0.521676358555025480, -0.521719015076310240, -0.521761670293297790, -0.521804324205880850, -0.521846976813952980, -0.521889628117408130, -0.521932278116138850, -0.521974926810038880, --0.522017574199001630, -0.522060220282920760, -0.522102865061688900, -0.522145508535199920, -0.522188150703347230, -0.522230791566024480, -0.522273431123124410, -0.522316069374540780, --0.522358706320166900, -0.522401341959896740, -0.522443976293622710, -0.522486609321238800, -0.522529241042638430, -0.522571871457715330, -0.522614500566362050, -0.522657128368472670, --0.522699754863940710, -0.522742380052659050, -0.522785003934521430, -0.522827626509421380, -0.522870247777252550, -0.522912867737907790, -0.522955486391280750, -0.522998103737265070, --0.523040719775754500, -0.523083334506641790, -0.523125947929820700, -0.523168560045184750, -0.523211170852627800, -0.523253780352042510, -0.523296388543322720, -0.523338995426362090, --0.523381601001054240, -0.523424205267292050, -0.523466808224969380, -0.523509409873979980, -0.523552010214216710, -0.523594609245573440, -0.523637206967943690, -0.523679803381221220, --0.523722398485298890, -0.523764992280070560, -0.523807584765429770, -0.523850175941270480, -0.523892765807485230, -0.523935354363968100, -0.523977941610612620, -0.524020527547312650, --0.524063112173960950, -0.524105695490451500, -0.524148277496677810, -0.524190858192533860, -0.524233437577912300, -0.524276015652707210, -0.524318592416812000, -0.524361167870120770, --0.524403742012526150, -0.524446314843922230, -0.524488886364202990, -0.524531456573261060, -0.524574025470990520, -0.524616593057284810, -0.524659159332038110, -0.524701724295143060, --0.524744287946493750, -0.524786850285983820, -0.524829411313507020, -0.524871971028956330, -0.524914529432225720, -0.524957086523208720, -0.524999642301799520, -0.525042196767890660, --0.525084749921376440, -0.525127301762150280, -0.525169852290106380, -0.525212401505137370, -0.525254949407137350, -0.525297495996000290, -0.525340041271619150, -0.525382585233887920, --0.525425127882700240, -0.525467669217950070, -0.525510209239530400, -0.525552747947335200, -0.525595285341258100, -0.525637821421193200, -0.525680356187033350, -0.525722889638672640, --0.525765421776004720, -0.525807952598923540, -0.525850482107322210, -0.525893010301094590, -0.525935537180134420, -0.525978062744335890, -0.526020586993591780, -0.526063109927796150, --0.526105631546843200, -0.526148151850625690, -0.526190670839037920, -0.526233188511973430, -0.526275704869326290, -0.526318219910989590, -0.526360733636857310, -0.526403246046823200, --0.526445757140781350, -0.526488266918624710, -0.526530775380247400, -0.526573282525543140, -0.526615788354406140, -0.526658292866729270, -0.526700796062406610, -0.526743297941332010, --0.526785798503399460, -0.526828297748502150, -0.526870795676534050, -0.526913292287389260, -0.526955787580960950, -0.526998281557143120, -0.527040774215829620, -0.527083265556914650, --0.527125755580290960, -0.527168244285852960, -0.527210731673494410, -0.527253217743109290, -0.527295702494590900, -0.527338185927833100, -0.527380668042729980, -0.527423148839175520, --0.527465628317062670, -0.527508106476285880, -0.527550583316738870, -0.527593058838315640, -0.527635533040909490, -0.527678005924414490, -0.527720477488724530, -0.527762947733733670, --0.527805416659335110, -0.527847884265422950, -0.527890350551891490, -0.527932815518633800, -0.527975279165543990, -0.528017741492516010, -0.528060202499444190, -0.528102662186221370, --0.528145120552741880, -0.528187577598899560, -0.528230033324588730, -0.528272487729702480, -0.528314940814134990, -0.528357392577780140, -0.528399843020532110, -0.528442292142284220, --0.528484739942930550, -0.528527186422364960, -0.528569631580481870, -0.528612075417174250, -0.528654517932336530, -0.528696959125862790, -0.528739398997646330, -0.528781837547581460, --0.528824274775561820, -0.528866710681482060, -0.528909145265235030, -0.528951578526715150, -0.528994010465816290, -0.529036441082432860, -0.529078870376457840, -0.529121298347785760, --0.529163724996310370, -0.529206150321926080, -0.529248574324525990, -0.529290997004004500, -0.529333418360255600, -0.529375838393173370, -0.529418257102651340, -0.529460674488583470, --0.529503090550864420, -0.529545505289387260, -0.529587918704046310, -0.529630330794735540, -0.529672741561349360, -0.529715151003780970, -0.529757559121924680, -0.529799965915674460, --0.529842371384924740, -0.529884775529568700, -0.529927178349500760, -0.529969579844614790, -0.530011980014805320, -0.530054378859965540, -0.530096776379989750, -0.530139172574772060, --0.530181567444206750, -0.530223960988187250, -0.530266353206607750, -0.530308744099362350, -0.530351133666345560, -0.530393521907450480, -0.530435908822571740, -0.530478294411603430, --0.530520678674439080, -0.530563061610973110, -0.530605443221099370, -0.530647823504712400, -0.530690202461705620, -0.530732580091973220, -0.530774956395409390, -0.530817331371908560, --0.530859705021364040, -0.530902077343670230, -0.530944448338721230, -0.530986818006411450, -0.531029186346634320, -0.531071553359284240, -0.531113919044255200, -0.531156283401441720, --0.531198646430737220, -0.531241008132036120, -0.531283368505232830, -0.531325727550220780, -0.531368085266894390, -0.531410441655147730, -0.531452796714875440, -0.531495150445970730, --0.531537502848328130, -0.531579853921841820, -0.531622203666406220, -0.531664552081914770, -0.531706899168261860, -0.531749244925341810, -0.531791589353048930, -0.531833932451276750, --0.531876274219919790, -0.531918614658872020, -0.531960953768028210, -0.532003291547281540, -0.532045627996526770, -0.532087963115658200, -0.532130296904569370, -0.532172629363154790, --0.532214960491308680, -0.532257290288925430, -0.532299618755898710, -0.532341945892122910, -0.532384271697492250, -0.532426596171901250, -0.532468919315243320, -0.532511241127413220, --0.532553561608305030, -0.532595880757813170, -0.532638198575831390, -0.532680515062254000, -0.532722830216975310, -0.532765144039889950, -0.532807456530891450, -0.532849767689874240, --0.532892077516732950, -0.532934386011361120, -0.532976693173653370, -0.533018999003503800, -0.533061303500807160, -0.533103606665456860, -0.533145908497347550, -0.533188208996373540, --0.533230508162429340, -0.533272805995408380, -0.533315102495205530, -0.533357397661714970, -0.533399691494831130, -0.533441983994447870, -0.533484275160459490, -0.533526564992760520, --0.533568853491245500, -0.533611140655807950, -0.533653426486342510, -0.533695710982743600, -0.533737994144905640, -0.533780275972722480, -0.533822556466088560, -0.533864835624898610, --0.533907113449046180, -0.533949389938426000, -0.533991665092932390, -0.534033938912459980, -0.534076211396902310, -0.534118482546154130, -0.534160752360109740, -0.534203020838663780, --0.534245287981709890, -0.534287553789142940, -0.534329818260857010, -0.534372081396746860, -0.534414343196706220, -0.534456603660629640, -0.534498862788411630, -0.534541120579946740, --0.534583377035128700, -0.534625632153852280, -0.534667885936012110, -0.534710138381501940, -0.534752389490216310, -0.534794639262049730, -0.534836887696896970, -0.534879134794651550, --0.534921380555208330, -0.534963624978461730, -0.535005868064306390, -0.535048109812635950, -0.535090350223345280, -0.535132589296328680, -0.535174827031481120, -0.535217063428696020, --0.535259298487868240, -0.535301532208892210, -0.535343764591662770, -0.535385995636073590, -0.535428225342019280, -0.535470453709394940, -0.535512680738093990, -0.535554906428011400, --0.535597130779041470, -0.535639353791079190, -0.535681575464018070, -0.535723795797752980, -0.535766014792178450, -0.535808232447189340, -0.535850448762679180, -0.535892663738542830, --0.535934877374674930, -0.535977089670970240, -0.536019300627322390, -0.536061510243626250, -0.536103718519776340, -0.536145925455667640, -0.536188131051193670, -0.536230335306249310, --0.536272538220729180, -0.536314739794528040, -0.536356940027539750, -0.536399138919659070, -0.536441336470780850, -0.536483532680798960, -0.536525727549608260, -0.536567921077103270, --0.536610113263178870, -0.536652304107728680, -0.536694493610647800, -0.536736681771830760, -0.536778868591172300, -0.536821054068566280, -0.536863238203907690, -0.536905420997090930, --0.536947602448011100, -0.536989782556561820, -0.537031961322638090, -0.537074138746134520, -0.537116314826945880, -0.537158489564966150, -0.537200662960090170, -0.537242835012212820, --0.537285005721228170, -0.537327175087030870, -0.537369343109515670, -0.537411509788577550, -0.537453675124110240, -0.537495839116008730, -0.537538001764167660, -0.537580163068481890, --0.537622323028845380, -0.537664481645153130, -0.537706638917299530, -0.537748794845179790, -0.537790949428687770, -0.537833102667718220, -0.537875254562166010, -0.537917405111925980, --0.537959554316892130, -0.538001702176959420, -0.538043848692022710, -0.538085993861976090, -0.538128137686714410, -0.538170280166132440, -0.538212421300125140, -0.538254561088586490, --0.538296699531411350, -0.538338836628494470, -0.538380972379730820, -0.538423106785014480, -0.538465239844240330, -0.538507371557302990, -0.538549501924097670, -0.538591630944518230, --0.538633758618459750, -0.538675884945816860, -0.538718009926484550, -0.538760133560356900, -0.538802255847328880, -0.538844376787295690, -0.538886496380151070, -0.538928614625790230, --0.538970731524107900, -0.539012847074999080, -0.539054961278357840, -0.539097074134079150, -0.539139185642057760, -0.539181295802188760, -0.539223404614366130, -0.539265512078485050, --0.539307618194440170, -0.539349722962126690, -0.539391826381438460, -0.539433928452270670, -0.539476029174517980, -0.539518128548075680, -0.539560226572837640, -0.539602323248699060, --0.539644418575554670, -0.539686512553299690, -0.539728605181827970, -0.539770696461034700, -0.539812786390815090, -0.539854874971063210, -0.539896962201674050, -0.539939048082542560, --0.539981132613563840, -0.540023215794631860, -0.540065297625641820, -0.540107378106488570, -0.540149457237067200, -0.540191535017271910, -0.540233611446997660, -0.540275686526139440, --0.540317760254592440, -0.540359832632250630, -0.540401903659009200, -0.540443973334763020, -0.540486041659407280, -0.540528108632836070, -0.540570174254944690, -0.540612238525628120, --0.540654301444780550, -0.540696363012297290, -0.540738423228073200, -0.540780482092003360, -0.540822539603981860, -0.540864595763904110, -0.540906650571664870, -0.540948704027159330, --0.540990756130281690, -0.541032806880927140, -0.541074856278990550, -0.541116904324367210, -0.541158951016951220, -0.541200996356637990, -0.541243040343322160, -0.541285082976899030, --0.541327124257262930, -0.541369164184308920, -0.541411202757932530, -0.541453239978027630, -0.541495275844489640, -0.541537310357213530, -0.541579343516094490, -0.541621375321026610, --0.541663405771905420, -0.541705434868625660, -0.541747462611082750, -0.541789488999170790, -0.541831514032785070, -0.541873537711820560, -0.541915560036172580, -0.541957581005735320, --0.541999600620404200, -0.542041618880073960, -0.542083635784640140, -0.542125651333996820, -0.542167665528039410, -0.542209678366662780, -0.542251689849762350, -0.542293699977232310, --0.542335708748967970, -0.542377716164864850, -0.542419722224816940, -0.542461726928719860, -0.542503730276468370, -0.542545732267957880, -0.542587732903082820, -0.542629732181738380, --0.542671730103819530, -0.542713726669221800, -0.542755721877839380, -0.542797715729567700, -0.542839708224301610, -0.542881699361936750, -0.542923689142367220, -0.542965677565488410, --0.543007664631195430, -0.543049650339383680, -0.543091634689947480, -0.543133617682782120, -0.543175599317783140, -0.543217579594844730, -0.543259558513862430, -0.543301536074731310, --0.543343512277346560, -0.543385487121602730, -0.543427460607395220, -0.543469432734619010, -0.543511403503169510, -0.543553372912941260, -0.543595340963829550, -0.543637307655729480, --0.543679272988536470, -0.543721236962144920, -0.543763199576450360, -0.543805160831347670, -0.543847120726732580, -0.543889079262499300, -0.543931036438543240, -0.543972992254760030, --0.544014946711043890, -0.544056899807290440, -0.544098851543394770, -0.544140801919252290, -0.544182750934757430, -0.544224698589805710, -0.544266644884292220, -0.544308589818112590, --0.544350533391161020, -0.544392475603333150, -0.544434416454524060, -0.544476355944629290, -0.544518294073543240, -0.544560230841161560, -0.544602166247379230, -0.544644100292091870, --0.544686032975193910, -0.544727964296580770, -0.544769894256148190, -0.544811822853790480, -0.544853750089403290, -0.544895675962881580, -0.544937600474121100, -0.544979523623016270, --0.545021445409462620, -0.545063365833355460, -0.545105284894590090, -0.545147202593061260, -0.545189118928664400, -0.545231033901294680, -0.545272947510847760, -0.545314859757218160, --0.545356770640301410, -0.545398680159992600, -0.545440588316187580, -0.545482495108780770, -0.545524400537667600, -0.545566304602743470, -0.545608207303904020, -0.545650108641043570, --0.545692008614057980, -0.545733907222842650, -0.545775804467292120, -0.545817700347302150, -0.545859594862767920, -0.545901488013585070, -0.545943379799648240, -0.545985270220852860, --0.546027159277094220, -0.546069046968268190, -0.546110933294269070, -0.546152818254992730, -0.546194701850334250, -0.546236584080189490, -0.546278464944452760, -0.546320344443019910, --0.546362222575786260, -0.546404099342647440, -0.546445974743497880, -0.546487848778233530, -0.546529721446749830, -0.546571592748941510, -0.546613462684704120, -0.546655331253933170, --0.546697198456524200, -0.546739064292371960, -0.546780928761371960, -0.546822791863419640, -0.546864653598410740, -0.546906513966239790, -0.546948372966802650, -0.546990230599994520, --0.547032086865711250, -0.547073941763847270, -0.547115795294298550, -0.547157647456960270, -0.547199498251728310, -0.547241347678497190, -0.547283195737162660, -0.547325042427620590, --0.547366887749765500, -0.547408731703493130, -0.547450574288699030, -0.547492415505278830, -0.547534255353127270, -0.547576093832140010, -0.547617930942212450, -0.547659766683240570, --0.547701601055118890, -0.547743434057743170, -0.547785265691008830, -0.547827095954811720, -0.547868924849046480, -0.547910752373608980, -0.547952578528394520, -0.547994403313299070, --0.548036226728217170, -0.548078048773044780, -0.548119869447677210, -0.548161688752010430, -0.548203506685938980, -0.548245323249358710, -0.548287138442165590, -0.548328952264254270, --0.548370764715520490, -0.548412575795859890, -0.548454385505168120, -0.548496193843340030, -0.548538000810271490, -0.548579806405858020, -0.548621610629995260, -0.548663413482578190, --0.548705214963502550, -0.548747015072663880, -0.548788813809958140, -0.548830611175279870, -0.548872407168525140, -0.548914201789589380, -0.548955995038368450, -0.548997786914757200, --0.549039577418651390, -0.549081366549947100, -0.549123154308539090, -0.549164940694323090, -0.549206725707194750, -0.549248509347049940, -0.549290291613783620, -0.549332072507291440, --0.549373852027469130, -0.549415630174212470, -0.549457406947416520, -0.549499182346976920, -0.549540956372789440, -0.549582729024749920, -0.549624500302753230, -0.549666270206695230, --0.549708038736471560, -0.549749805891978190, -0.549791571673109990, -0.549833336079762810, -0.549875099111832630, -0.549916860769214420, -0.549958621051803930, -0.550000379959497020, --0.550042137492189440, -0.550083893649776170, -0.550125648432153170, -0.550167401839216090, -0.550209153870860780, -0.550250904526982330, -0.550292653807476500, -0.550334401712239130, --0.550376148241166100, -0.550417893394152260, -0.550459637171093810, -0.550501379571886160, -0.550543120596425520, -0.550584860244606620, -0.550626598516325670, -0.550668335411478530, --0.550710070929960160, -0.550751805071666660, -0.550793537836493650, -0.550835269224337120, -0.550876999235092150, -0.550918727868654590, -0.550960455124920200, -0.551002181003785060, --0.551043905505144150, -0.551085628628893430, -0.551127350374928550, -0.551169070743145810, -0.551210789733439950, -0.551252507345707190, -0.551294223579843030, -0.551335938435743800, --0.551377651913304350, -0.551419364012420750, -0.551461074732988670, -0.551502784074904380, -0.551544492038062660, -0.551586198622359800, -0.551627903827691780, -0.551669607653953560, --0.551711310101041460, -0.551753011168851000, -0.551794710857278380, -0.551836409166218570, -0.551878106095567870, -0.551919801645221810, -0.551961495815076590, -0.552003188605027280, --0.552044880014970100, -0.552086570044800660, -0.552128258694415060, -0.552169945963708610, -0.552211631852577160, -0.552253316360916680, -0.552294999488623370, -0.552336681235592100, --0.552378361601719160, -0.552420040586900640, -0.552461718191031630, -0.552503394414008420, -0.552545069255726660, -0.552586742716082550, -0.552628414794971270, -0.552670085492289020, --0.552711754807931440, -0.552753422741794950, -0.552795089293774410, -0.552836754463766230, -0.552878418251666170, -0.552920080657370420, -0.552961741680774050, -0.553003401321773390, --0.553045059580264180, -0.553086716456142710, -0.553128371949304090, -0.553170026059644600, -0.553211678787060350, -0.553253330131446510, -0.553294980092699400, -0.553336628670714760, --0.553378275865389010, -0.553419921676617130, -0.553461566104295530, -0.553503209148319960, -0.553544850808586730, -0.553586491084991030, -0.553628129977429050, -0.553669767485796770, --0.553711403609990490, -0.553753038349905190, -0.553794671705437500, -0.553836303676482960, -0.553877934262938080, -0.553919563464698060, -0.553961191281659100, -0.554002817713717070, --0.554044442760768470, -0.554086066422708410, -0.554127688699433070, -0.554169309590838990, -0.554210929096821240, -0.554252547217276130, -0.554294163952099740, -0.554335779301188160, --0.554377393264436910, -0.554419005841742090, -0.554460617032999760, -0.554502226838106350, -0.554543835256956940, -0.554585442289447840, -0.554627047935475240, -0.554668652194935440, --0.554710255067723530, -0.554751856553736040, -0.554793456652868940, -0.554835055365018540, -0.554876652690080130, -0.554918248627950030, -0.554959843178524760, -0.555001436341699410, --0.555043028117370610, -0.555084618505434110, -0.555126207505786560, -0.555167795118323040, -0.555209381342940070, -0.555250966179533620, -0.555292549628000120, -0.555334131688234870, --0.555375712360134280, -0.555417291643594440, -0.555458869538511760, -0.555500446044781440, -0.555542021162300110, -0.555583594890963760, -0.555625167230668680, -0.555666738181310400, --0.555708307742785230, -0.555749875914989700, -0.555791442697818990, -0.555833008091169760, -0.555874572094938070, -0.555916134709020240, -0.555957695933311680, -0.555999255767708920, --0.556040814212108050, -0.556082371266405470, -0.556123926930496610, -0.556165481204278000, -0.556207034087645600, -0.556248585580496060, -0.556290135682724560, -0.556331684394227870, --0.556373231714901830, -0.556414777644643200, -0.556456322183347170, -0.556497865330910390, -0.556539407087229270, -0.556580947452199330, -0.556622486425716990, -0.556664024007678340, --0.556705560197980120, -0.556747094996517530, -0.556788628403187320, -0.556830160417885470, -0.556871691040508600, -0.556913220270952140, -0.556954748109112610, -0.556996274554886210, --0.557037799608169570, -0.557079323268858010, -0.557120845536848150, -0.557162366412036090, -0.557203885894318570, -0.557245403983591010, -0.557286920679749830, -0.557328435982691440, --0.557369949892312260, -0.557411462408507810, -0.557452973531174840, -0.557494483260209670, -0.557535991595508040, -0.557577498536966360, -0.557619004084480950, -0.557660508237948330, --0.557702010997264130, -0.557743512362324890, -0.557785012333026910, -0.557826510909266830, -0.557868008090939950, -0.557909503877943140, -0.557950998270172470, -0.557992491267524810, --0.558033982869895470, -0.558075473077181190, -0.558116961889278280, -0.558158449306083270, -0.558199935327491790, -0.558241419953400490, -0.558282903183705990, -0.558324385018303840, --0.558365865457090770, -0.558407344499962990, -0.558448822146817240, -0.558490298397549050, -0.558531773252055160, -0.558573246710231790, -0.558614718771975770, -0.558656189437182430, --0.558697658705748720, -0.558739126577570850, -0.558780593052545570, -0.558822058130568400, -0.558863521811536090, -0.558904984095344950, -0.558946444981891720, -0.558987904471071940, --0.559029362562782570, -0.559070819256920040, -0.559112274553380080, -0.559153728452059460, -0.559195180952854590, -0.559236632055662100, -0.559278081760377630, -0.559319530066897940, --0.559360976975119550, -0.559402422484938990, -0.559443866596252000, -0.559485309308955350, -0.559526750622945430, -0.559568190538118900, -0.559609629054371730, -0.559651066171600320, --0.559692501889701320, -0.559733936208571480, -0.559775369128106330, -0.559816800648202830, -0.559858230768757290, -0.559899659489666580, -0.559941086810826330, -0.559982512732133290, --0.560023937253484430, -0.560065360374775390, -0.560106782095902810, -0.560148202416763440, -0.560189621337253810, -0.560231038857269770, -0.560272454976708190, -0.560313869695465480, --0.560355283013438400, -0.560396694930522800, -0.560438105446615430, -0.560479514561612820, -0.560520922275411730, -0.560562328587908000, -0.560603733498998500, -0.560645137008579650, --0.560686539116548310, -0.560727939822800230, -0.560769339127232260, -0.560810737029741380, -0.560852133530223340, -0.560893528628574890, -0.560934922324692660, -0.560976314618473420, --0.561017705509813110, -0.561059094998608510, -0.561100483084756130, -0.561141869768152950, -0.561183255048694710, -0.561224638926278390, -0.561266021400800400, -0.561307402472157820, --0.561348782140246190, -0.561390160404962810, -0.561431537266203870, -0.561472912723866570, -0.561514286777846540, -0.561555659428040870, -0.561597030674346300, -0.561638400516658920, --0.561679768954875370, -0.561721135988892510, -0.561762501618607190, -0.561803865843915280, -0.561845228664713650, -0.561886590080898920, -0.561927950092368180, -0.561969308699017070, --0.562010665900742780, -0.562052021697441840, -0.562093376089011110, -0.562134729075346670, -0.562176080656345390, -0.562217430831903900, -0.562258779601919170, -0.562300126966287170, --0.562341472924904770, -0.562382817477669160, -0.562424160624476090, -0.562465502365222640, -0.562506842699805330, -0.562548181628121370, -0.562589519150066610, -0.562630855265538020, --0.562672189974432360, -0.562713523276646480, -0.562754855172076460, -0.562796185660619400, -0.562837514742171810, -0.562878842416630780, -0.562920168683892270, -0.562961493543853390, --0.563002816996410640, -0.563044139041461330, -0.563085459678901330, -0.563126778908627610, -0.563168096730537030, -0.563209413144526440, -0.563250728150492040, -0.563292041748330810, --0.563333353937939930, -0.563374664719215160, -0.563415974092053800, -0.563457282056352480, -0.563498588612008300, -0.563539893758917330, -0.563581197496976550, -0.563622499826082920, --0.563663800746133310, -0.563705100257023810, -0.563746398358651590, -0.563787695050913420, -0.563828990333706260, -0.563870284206926310, -0.563911576670470760, -0.563952867724236140, --0.563994157368119750, -0.564035445602017570, -0.564076732425826900, -0.564118017839444600, -0.564159301842766970, -0.564200584435691100, -0.564241865618113740, -0.564283145389932180, --0.564324423751042300, -0.564365700701341290, -0.564406976240726110, -0.564448250369093850, -0.564489523086340590, -0.564530794392363640, -0.564572064287059530, -0.564613332770325660, --0.564654599842058120, -0.564695865502154120, -0.564737129750510490, -0.564778392587024340, -0.564819654011591730, -0.564860914024110090, -0.564902172624476620, -0.564943429812587270, --0.564984685588339360, -0.565025939951629640, -0.565067192902355520, -0.565108444440413080, -0.565149694565699520, -0.565190943278111700, -0.565232190577546810, -0.565273436463901160, --0.565314680937071930, -0.565355923996956000, -0.565397165643450660, -0.565438405876452000, -0.565479644695857320, -0.565520882101563480, -0.565562118093467790, -0.565603352671466550, --0.565644585835456850, -0.565685817585335760, -0.565727047921000370, -0.565768276842347100, -0.565809504349273130, -0.565850730441675780, -0.565891955119451120, -0.565933178382496680, --0.565974400230709220, -0.566015620663986250, -0.566056839682223760, -0.566098057285319150, -0.566139273473169500, -0.566180488245671910, -0.566221701602722780, -0.566262913544219430, --0.566304124070058810, -0.566345333180138240, -0.566386540874353920, -0.566427747152603240, -0.566468952014783200, -0.566510155460791200, -0.566551357490523430, -0.566592558103877320, --0.566633757300750050, -0.566674955081038160, -0.566716151444638830, -0.566757346391449040, -0.566798539921366310, -0.566839732034286840, -0.566880922730108150, -0.566922112008727000, --0.566963299870041020, -0.567004486313946400, -0.567045671340340560, -0.567086854949120590, -0.567128037140183780, -0.567169217913426560, -0.567210397268746340, -0.567251575206040080, --0.567292751725205210, -0.567333926826138150, -0.567375100508736190, -0.567416272772896970, -0.567457443618516580, -0.567498613045492650, -0.567539781053722160, -0.567580947643102630, --0.567622112813530370, -0.567663276564902790, -0.567704438897116970, -0.567745599810070440, -0.567786759303659630, -0.567827917377781820, -0.567869074032334330, -0.567910229267214460, --0.567951383082318630, -0.567992535477544360, -0.568033686452788730, -0.568074836007949280, -0.568115984142922300, -0.568157130857605440, -0.568198276151896110, -0.568239420025690720, --0.568280562478886810, -0.568321703511381450, -0.568362843123072170, -0.568403981313855500, -0.568445118083628850, -0.568486253432289310, -0.568527387359734630, -0.568568519865861100, --0.568609650950566260, -0.568650780613747190, -0.568691908855301630, -0.568733035675125900, -0.568774161073117620, -0.568815285049173890, -0.568856407603192340, -0.568897528735069380, --0.568938648444702650, -0.568979766731989240, -0.569020883596826900, -0.569061999039111810, -0.569103113058741840, -0.569144225655614400, -0.569185336829626130, -0.569226446580674450, --0.569267554908656550, -0.569308661813470280, -0.569349767295011970, -0.569390871353179120, -0.569431973987869270, -0.569473075198979720, -0.569514174986407110, -0.569555273350049180, --0.569596370289802920, -0.569637465805566180, -0.569678559897235480, -0.569719652564708250, -0.569760743807882000, -0.569801833626654150, -0.569842922020921460, -0.569884008990581340, --0.569925094535531640, -0.569966178655668900, -0.570007261350890640, -0.570048342621094160, -0.570089422466177220, -0.570130500886036450, -0.570171577880569380, -0.570212653449673310, --0.570253727593246110, -0.570294800311184070, -0.570335871603385170, -0.570376941469746490, -0.570418009910165890, -0.570459076924539790, -0.570500142512766150, -0.570541206674742060, --0.570582269410365270, -0.570623330719532530, -0.570664390602141470, -0.570705449058089730, -0.570746506087274060, -0.570787561689592100, -0.570828615864941270, -0.570869668613219190, --0.570910719934322630, -0.570951769828149210, -0.570992818294596470, -0.571033865333562040, -0.571074910944942450, -0.571115955128635670, -0.571156997884539000, -0.571198039212550190, --0.571239079112566000, -0.571280117584484050, -0.571321154628201770, -0.571362190243617010, -0.571403224430626410, -0.571444257189127720, -0.571485288519018360, -0.571526318420196300, --0.571567346892557950, -0.571608373936001170, -0.571649399550423930, -0.571690423735722760, -0.571731446491795640, -0.571772467818539850, -0.571813487715853160, -0.571854506183632540, --0.571895523221775500, -0.571936538830179810, -0.571977553008742980, -0.572018565757361990, -0.572059577075934580, -0.572100586964358280, -0.572141595422530850, -0.572182602450349020, --0.572223608047710660, -0.572264612214513410, -0.572305614950654910, -0.572346616256032000, -0.572387616130542560, -0.572428614574084450, -0.572469611586554410, -0.572510607167850290, --0.572551601317869750, -0.572592594036510530, -0.572633585323669480, -0.572674575179244470, -0.572715563603133030, -0.572756550595233000, -0.572797536155441380, -0.572838520283655780, --0.572879502979773860, -0.572920484243693570, -0.572961464075311790, -0.573002442474526250, -0.573043419441234600, -0.573084394975334810, -0.573125369076723730, -0.573166341745299120, --0.573207312980959060, -0.573248282783600400, -0.573289251153120900, -0.573330218089418420, -0.573371183592390700, -0.573412147661934600, -0.573453110297948210, -0.573494071500329050, --0.573535031268975090, -0.573575989603783090, -0.573616946504651230, -0.573657901971476920, -0.573698856004158260, -0.573739808602591990, -0.573780759766676310, -0.573821709496308730, --0.573862657791387230, -0.573903604651808670, -0.573944550077471140, -0.573985494068272260, -0.574026436624110010, -0.574067377744881260, -0.574108317430484070, -0.574149255680816540, --0.574190192495775410, -0.574231127875258870, -0.574272061819164460, -0.574312994327390250, -0.574353925399833210, -0.574394855036391320, -0.574435783236962320, -0.574476710001444290, --0.574517635329733990, -0.574558559221729710, -0.574599481677328990, -0.574640402696429910, -0.574681322278929540, -0.574722240424725750, -0.574763157133716400, -0.574804072405799560, --0.574844986240872210, -0.574885898638832330, -0.574926809599578090, -0.574967719123006480, -0.575008627209015470, -0.575049533857503010, -0.575090439068366990, -0.575131342841504580, --0.575172245176813760, -0.575213146074192380, -0.575254045533538430, -0.575294943554749080, -0.575335840137722320, -0.575376735282356000, -0.575417628988548200, -0.575458521256195900, --0.575499412085197390, -0.575540301475450320, -0.575581189426852880, -0.575622075939302040, -0.575662961012695980, -0.575703844646933030, -0.575744726841910030, -0.575785607597525170, --0.575826486913676330, -0.575867364790261570, -0.575908241227178100, -0.575949116224323990, -0.575989989781597100, -0.576030861898895630, -0.576071732576116660, -0.576112601813158380, --0.576153469609918530, -0.576194335966295320, -0.576235200882186050, -0.576276064357488680, -0.576316926392101190, -0.576357786985921660, -0.576398646138847390, -0.576439503850776470, --0.576480360121607190, -0.576521214951236650, -0.576562068339563030, -0.576602920286484190, -0.576643770791898550, -0.576684619855702960, -0.576725467477795960, -0.576766313658075180, --0.576807158396439150, -0.576848001692784720, -0.576888843547010310, -0.576929683959013780, -0.576970522928693440, -0.577011360455946360, -0.577052196540670970, -0.577093031182765000, --0.577133864382126880, -0.577174696138653800, -0.577215526452243830, -0.577256355322795180, -0.577297182750205920, -0.577338008734373350, -0.577378833275195790, -0.577419656372571420, --0.577460478026397660, -0.577501298236572590, -0.577542117002994400, -0.577582934325561180, -0.577623750204170340, -0.577664564638720070, -0.577705377629108450, -0.577746189175233680, --0.577786999276993170, -0.577827807934285010, -0.577868615147007490, -0.577909420915058700, -0.577950225238336060, -0.577991028116737750, -0.578031829550161970, -0.578072629538506910, --0.578113428081669990, -0.578154225179549400, -0.578195020832043660, -0.578235815039050080, -0.578276607800466860, -0.578317399116192180, -0.578358188986124340, -0.578398977410160660, --0.578439764388199550, -0.578480549920138980, -0.578521334005877460, -0.578562116645312210, -0.578602897838341730, -0.578643677584863900, -0.578684455884777350, -0.578725232737979270, --0.578766008144368070, -0.578806782103841840, -0.578847554616299000, -0.578888325681636950, -0.578929095299754120, -0.578969863470548910, -0.579010630193918630, -0.579051395469761810, --0.579092159297976530, -0.579132921678461090, -0.579173682611113130, -0.579214442095830840, -0.579255200132512530, -0.579295956721056600, -0.579336711861360380, -0.579377465553322370, --0.579418217796840660, -0.579458968591813780, -0.579499717938139150, -0.579540465835715280, -0.579581212284440150, -0.579621957284212400, -0.579662700834929320, -0.579703442936489570, --0.579744183588791210, -0.579784922791732770, -0.579825660545211670, -0.579866396849126330, -0.579907131703375380, -0.579947865107856340, -0.579988597062467530, -0.580029327567107230, --0.580070056621673990, -0.580110784226065320, -0.580151510380179650, -0.580192235083915150, -0.580232958337170480, -0.580273680139843040, -0.580314400491831360, -0.580355119393033750, --0.580395836843348610, -0.580436552842673590, -0.580477267390907210, -0.580517980487947560, -0.580558692133693380, -0.580599402328042190, -0.580640111070892420, -0.580680818362142690, --0.580721524201690650, -0.580762228589434710, -0.580802931525273180, -0.580843633009104800, -0.580884333040826870, -0.580925031620338150, -0.580965728747536820, -0.581006424422321640, --0.581047118644589910, -0.581087811414240480, -0.581128502731171450, -0.581169192595281550, -0.581209881006468310, -0.581250567964630370, -0.581291253469665930, -0.581331937521473830, --0.581372620119951500, -0.581413301264997570, -0.581453980956510800, -0.581494659194388700, -0.581535335978530020, -0.581576011308832850, -0.581616685185196160, -0.581657357607517360, --0.581698028575695080, -0.581738698089627860, -0.581779366149214110, -0.581820032754351680, -0.581860697904939220, -0.581901361600874910, -0.581942023842057620, -0.581982684628384870, --0.582023343959755410, -0.582064001836067550, -0.582104658257220130, -0.582145313223110690, -0.582185966733637870, -0.582226618788700630, -0.582267269388196400, -0.582307918532024020, --0.582348566220081910, -0.582389212452268600, -0.582429857228482060, -0.582470500548620710, -0.582511142412583280, -0.582551782820268200, -0.582592421771573440, -0.582633059266397520, --0.582673695304638970, -0.582714329886196540, -0.582754963010967960, -0.582795594678852000, -0.582836224889746960, -0.582876853643551800, -0.582917480940164160, -0.582958106779482790, --0.582998731161406100, -0.583039354085832960, -0.583079975552661110, -0.583120595561789300, -0.583161214113116390, -0.583201831206540120, -0.583242446841959140, -0.583283061019272190, --0.583323673738377790, -0.583364284999174030, -0.583404894801559440, -0.583445503145432640, -0.583486110030692400, -0.583526715457236560, -0.583567319424963980, -0.583607921933773090, --0.583648522983562620, -0.583689122574230670, -0.583729720705675750, -0.583770317377796610, -0.583810912590492110, -0.583851506343659900, -0.583892098637198930, -0.583932689471007960, --0.583973278844985070, -0.584013866759028890, -0.584054453213038060, -0.584095038206911440, -0.584135621740547010, -0.584176203813843390, -0.584216784426699220, -0.584257363579013590, --0.584297941270684130, -0.584338517501609700, -0.584379092271689160, -0.584419665580821150, -0.584460237428903630, -0.584500807815835470, -0.584541376741515410, -0.584581944205842200, --0.584622510208713700, -0.584663074750028990, -0.584703637829687040, -0.584744199447585490, -0.584784759603623530, -0.584825318297699680, -0.584865875529712810, -0.584906431299560990, --0.584946985607142980, -0.584987538452357620, -0.585028089835103680, -0.585068639755279230, -0.585109188212783130, -0.585149735207514120, -0.585190280739371070, -0.585230824808252060, --0.585271367414055830, -0.585311908556681250, -0.585352448236027280, -0.585392986451991890, -0.585433523204473950, -0.585474058493372200, -0.585514592318585710, -0.585555124680012360, --0.585595655577551110, -0.585636185011101150, -0.585676712980560450, -0.585717239485827880, -0.585757764526802170, -0.585798288103382530, -0.585838810215466690, -0.585879330862953960, --0.585919850045742760, -0.585960367763732390, -0.586000884016820710, -0.586041398804906800, -0.586081912127889400, -0.586122423985667610, -0.586162934378139380, -0.586203443305203910, --0.586243950766759720, -0.586284456762706020, -0.586324961292940870, -0.586365464357363250, -0.586405965955872350, -0.586446466088366150, -0.586486964754743820, -0.586527461954904130, --0.586567957688746030, -0.586608451956167730, -0.586648944757068300, -0.586689436091346610, -0.586729925958901610, -0.586770414359631400, -0.586810901293435160, -0.586851386760211650, --0.586891870759860160, -0.586932353292278440, -0.586972834357366020, -0.587013313955021430, -0.587053792085143860, -0.587094268747631600, -0.587134743942383520, -0.587175217669299030, --0.587215689928276110, -0.587256160719213940, -0.587296630042011380, -0.587337097896567630, -0.587377564282780760, -0.587418029200549970, -0.587458492649774120, -0.587498954630352400, --0.587539415142182890, -0.587579874185164890, -0.587620331759197260, -0.587660787864179080, -0.587701242500008550, -0.587741695666584960, -0.587782147363807070, -0.587822597591574290, --0.587863046349784590, -0.587903493638337270, -0.587943939457131530, -0.587984383806065660, -0.588024826685038860, -0.588065268093949880, -0.588105708032698130, -0.588146146501181800, --0.588186583499300090, -0.588227019026951850, -0.588267453084036500, -0.588307885670452110, -0.588348316786098110, -0.588388746430873240, -0.588429174604676810, -0.588469601307407110, --0.588510026538963450, -0.588550450299244690, -0.588590872588150240, -0.588631293405578180, -0.588671712751427930, -0.588712130625598350, -0.588752547027988850, -0.588792961958497510, --0.588833375417023850, -0.588873787403467190, -0.588914197917725590, -0.588954606959698480, -0.588995014529284930, -0.589035420626384140, -0.589075825250894520, -0.589116228402715270, --0.589156630081745460, -0.589197030287884500, -0.589237429021030490, -0.589277826281083050, -0.589318222067940930, -0.589358616381503660, -0.589399009221669430, -0.589439400588337770, --0.589479790481407530, -0.589520178900778240, -0.589560565846348080, -0.589600951318016490, -0.589641335315682970, -0.589681717839245720, -0.589722098888604160, -0.589762478463657370, --0.589802856564304760, -0.589843233190444630, -0.589883608341976400, -0.589923982018799140, -0.589964354220812280, -0.590004724947914230, -0.590045094200004280, -0.590085461976981640, --0.590125828278745710, -0.590166193105194910, -0.590206556456228550, -0.590246918331745810, -0.590287278731646210, -0.590327637655827960, -0.590367995104190690, -0.590408351076633700, --0.590448705573055510, -0.590489058593355540, -0.590529410137432990, -0.590569760205187260, -0.590610108796516650, -0.590650455911320930, -0.590690801549499040, -0.590731145710950420, --0.590771488395573700, -0.590811829603268170, -0.590852169333933030, -0.590892507587467920, -0.590932844363771140, -0.590973179662742210, -0.591013513484280440, -0.591053845828285130, --0.591094176694654920, -0.591134506083289210, -0.591174833994087320, -0.591215160426948550, -0.591255485381771640, -0.591295808858456010, -0.591336130856901180, -0.591376451377005790, --0.591416770418669140, -0.591457087981790530, -0.591497404066269720, -0.591537718672004890, -0.591578031798895900, -0.591618343446841720, -0.591658653615741990, -0.591698962305495460, --0.591739269516001310, -0.591779575247159180, -0.591819879498868380, -0.591860182271027440, -0.591900483563536190, -0.591940783376293630, -0.591981081709199500, -0.592021378562152420, --0.592061673935051710, -0.592101967827797340, -0.592142260240287600, -0.592182551172422130, -0.592222840624100360, -0.592263128595221900, -0.592303415085685180, -0.592343700095390060, --0.592383983624235500, -0.592424265672121480, -0.592464546238946400, -0.592504825324609910, -0.592545102929011410, -0.592585379052050440, -0.592625653693625740, -0.592665926853636950, --0.592706198531983250, -0.592746468728564400, -0.592786737443279140, -0.592827004676026890, -0.592867270426707500, -0.592907534695219730, -0.592947797481462980, -0.592988058785336780, --0.593028318606740770, -0.593068576945573690, -0.593108833801735070, -0.593149089175124430, -0.593189343065641310, -0.593229595473184550, -0.593269846397653900, -0.593310095838948450, --0.593350343796968270, -0.593390590271611780, -0.593430835262778840, -0.593471078770368870, -0.593511320794281480, -0.593551561334415450, -0.593591800390670610, -0.593632037962946500, --0.593672274051141980, -0.593712508655156790, -0.593752741774890350, -0.593792973410242400, -0.593833203561111580, -0.593873432227397860, -0.593913659409000540, -0.593953885105819370, --0.593994109317753200, -0.594034332044701690, -0.594074553286564330, -0.594114773043241010, -0.594154991314630450, -0.594195208100632310, -0.594235423401146210, -0.594275637216071910, --0.594315849545308140, -0.594356060388754660, -0.594396269746311100, -0.594436477617877320, -0.594476684003351850, -0.594516888902634770, -0.594557092315625700, -0.594597294242223630, --0.594637494682328400, -0.594677693635839330, -0.594717891102656380, -0.594758087082678410, -0.594798281575805170, -0.594838474581936170, -0.594878666100971510, -0.594918856132809700, --0.594959044677350720, -0.594999231734494200, -0.595039417304140010, -0.595079601386186760, -0.595119783980534670, -0.595159965087083020, -0.595200144705731900, -0.595240322836379950, --0.595280499478927250, -0.595320674633273650, -0.595360848299318010, -0.595401020476960310, -0.595441191166099950, -0.595481360366637010, -0.595521528078470360, -0.595561694301499860, --0.595601859035625130, -0.595642022280746140, -0.595682184036761650, -0.595722344303571740, -0.595762503081076030, -0.595802660369174290, -0.595842816167765690, -0.595882970476749980, --0.595923123296026810, -0.595963274625496250, -0.596003424465057160, -0.596043572814609400, -0.596083719674053160, -0.596123865043287180, -0.596164008922211660, -0.596204151310726020, --0.596244292208730430, -0.596284431616123660, -0.596324569532805880, -0.596364705958676740, -0.596404840893636100, -0.596444974337583030, -0.596485106290417510, -0.596525236752039170, --0.596565365722348200, -0.596605493201243340, -0.596645619188624910, -0.596685743684392310, -0.596725866688445740, -0.596765988200684160, -0.596806108221007550, -0.596846226749315760, --0.596886343785508640, -0.596926459329485400, -0.596966573381146000, -0.597006685940390520, -0.597046797007117940, -0.597086906581228430, -0.597127014662621640, -0.597167121251197640, --0.597207226346855410, -0.597247329949495250, -0.597287432059016690, -0.597327532675319910, -0.597367631798303990, -0.597407729427868910, -0.597447825563914630, -0.597487920206341010, --0.597528013355047350, -0.597568105009933510, -0.597608195170899580, -0.597648283837845410, -0.597688371010670180, -0.597728456689273990, -0.597768540873557130, -0.597808623563418460, --0.597848704758758290, -0.597888784459476350, -0.597928862665472740, -0.597968939376646750, -0.598009014592898240, -0.598049088314127290, -0.598089160540233980, -0.598129231271117390, --0.598169300506677710, -0.598209368246814810, -0.598249434491428870, -0.598289499240418960, -0.598329562493685300, -0.598369624251127720, -0.598409684512646530, -0.598449743278140600, --0.598489800547510440, -0.598529856320656140, -0.598569910597476770, -0.598609963377872640, -0.598650014661743610, -0.598690064448989980, -0.598730112739510710, -0.598770159533206230, --0.598810204829976270, -0.598850248629721250, -0.598890290932340250, -0.598930331737733470, -0.598970371045800860, -0.599010408856442740, -0.599050445169558190, -0.599090479985047500, --0.599130513302810640, -0.599170545122747920, -0.599210575444758420, -0.599250604268742440, -0.599290631594600390, -0.599330657422231350, -0.599370681751535740, -0.599410704582413300, --0.599450725914764560, -0.599490745748488600, -0.599530764083485820, -0.599570780919656100, -0.599610796256899840, -0.599650810095116120, -0.599690822434205460, -0.599730833274067730, --0.599770842614603230, -0.599810850455711250, -0.599850856797292220, -0.599890861639246100, -0.599930864981473080, -0.599970866823872570, -0.600010867166344890, -0.600050866008789980, --0.600090863351108390, -0.600130859193199200, -0.600170853534962910, -0.600210846376299730, -0.600250837717109190, -0.600290827557291570, -0.600330815896746860, -0.600370802735375350, --0.600410788073076570, -0.600450771909750820, -0.600490754245298190, -0.600530735079618960, -0.600570714412612560, -0.600610692244179400, -0.600650668574219450, -0.600690643402633230, --0.600730616729320040, -0.600770588554180310, -0.600810558877114100, -0.600850527698021940, -0.600890495016802920, -0.600930460833357770, -0.600970425147586810, -0.601010387959389440, --0.601050349268666180, -0.601090309075316910, -0.601130267379242240, -0.601170224180341610, -0.601210179478515410, -0.601250133273663720, -0.601290085565687080, -0.601330036354484900, --0.601369985639957580, -0.601409933422005330, -0.601449879700528540, -0.601489824475426760, -0.601529767746600390, -0.601569709513949610, -0.601609649777374970, -0.601649588536775750, --0.601689525792052590, -0.601729461543106030, -0.601769395789835460, -0.601809328532141310, -0.601849259769923870, -0.601889189503083680, -0.601929117731520140, -0.601969044455133770, --0.602008969673824890, -0.602048893387493790, -0.602088815596040220, -0.602128736299364590, -0.602168655497367090, -0.602208573189948250, -0.602248489377007700, -0.602288404058445970, --0.602328317234163140, -0.602368228904059940, -0.602408139068035810, -0.602448047725991250, -0.602487954877826690, -0.602527860523442540, -0.602567764662738310, -0.602607667295614770, --0.602647568421972420, -0.602687468041710690, -0.602727366154730440, -0.602767262760931620, -0.602807157860215100, -0.602847051452480300, -0.602886943537627840, -0.602926834115558140, --0.602966723186171620, -0.603006610749367900, -0.603046496805047740, -0.603086381353111210, -0.603126264393459180, -0.603166145925991160, -0.603206025950607790, -0.603245904467209270, --0.603285781475696340, -0.603325656975968630, -0.603365530967926780, -0.603405403451471530, -0.603445274426502310, -0.603485143892919960, -0.603525011850624680, -0.603564878299517330, --0.603604743239497420, -0.603644606670465600, -0.603684468592322280, -0.603724329004968090, -0.603764187908302770, -0.603804045302226980, -0.603843901186641110, -0.603883755561445800, --0.603923608426540800, -0.603963459781826750, -0.604003309627203940, -0.604043157962573350, -0.604083004787834500, -0.604122850102888130, -0.604162693907635000, -0.604202536201974730, --0.604242376985808070, -0.604282216259035550, -0.604322054021557810, -0.604361890273274690, -0.604401725014086730, -0.604441558243894450, -0.604481389962598700, -0.604521220170099130, --0.604561048866296470, -0.604600876051091140, -0.604640701724384000, -0.604680525886074790, -0.604720348536064270, -0.604760169674252830, -0.604799989300541350, -0.604839807414829570, --0.604879624017018220, -0.604919439107008180, -0.604959252684699190, -0.604999064749992100, -0.605038875302787220, -0.605078684342985620, -0.605118491870486940, -0.605158297885192040, --0.605198102387001450, -0.605237905375815900, -0.605277706851535150, -0.605317506814060270, -0.605357305263291570, -0.605397102199129900, -0.605436897621475230, -0.605476691530228210, --0.605516483925289560, -0.605556274806560050, -0.605596064173939410, -0.605635852027328610, -0.605675638366628300, -0.605715423191739100, -0.605755206502561090, -0.605794988298995030, --0.605834768580941870, -0.605874547348301480, -0.605914324600974610, -0.605954100338861990, -0.605993874561864490, -0.606033647269881960, -0.606073418462815260, -0.606113188140565030, --0.606152956303032230, -0.606192722950116610, -0.606232488081719260, -0.606272251697740680, -0.606312013798081750, -0.606351774382642540, -0.606391533451323790, -0.606431291004026260, --0.606471047040650800, -0.606510801561097380, -0.606550554565267070, -0.606590306053060630, -0.606630056024378140, -0.606669804479120440, -0.606709551417188190, -0.606749296838482550, --0.606789040742903190, -0.606828783130351270, -0.606868524000727440, -0.606908263353932550, -0.606948001189866690, -0.606987737508430940, -0.607027472309525700, -0.607067205593052270, --0.607106937358910300, -0.607146667607001090, -0.607186396337225260, -0.607226123549483690, -0.607265849243676550, -0.607305573419704700, -0.607345296077469340, -0.607385017216870330, --0.607424736837808840, -0.607464454940185420, -0.607504171523901240, -0.607543886588856390, -0.607583600134951720, -0.607623312162088090, -0.607663022670166470, -0.607702731659086950, --0.607742439128750700, -0.607782145079058260, -0.607821849509910810, -0.607861552421208430, -0.607901253812852090, -0.607940953684742770, -0.607980652036781310, -0.608020348868867910, --0.608060044180903540, -0.608099737972789160, -0.608139430244425740, -0.608179120995713470, -0.608218810226553330, -0.608258497936846500, -0.608298184126493060, -0.608337868795394200, --0.608377551943450670, -0.608417233570563650, -0.608456913676633130, -0.608496592261560390, -0.608536269325246070, -0.608575944867591480, -0.608615618888496690, -0.608655291387862900, --0.608694962365590840, -0.608734631821581720, -0.608774299755735600, -0.608813966167953800, -0.608853631058137170, -0.608893294426186670, -0.608932956272002610, -0.608972616595486180, --0.609012275396538570, -0.609051932675059970, -0.609091588430951460, -0.609131242664114000, -0.609170895374448800, -0.609210546561856030, -0.609250196226236880, -0.609289844367492230, --0.609329490985523250, -0.609369136080230240, -0.609408779651514410, -0.609448421699276710, -0.609488062223418230, -0.609527701223839150, -0.609567338700441000, -0.609606974653124410, --0.609646609081790690, -0.609686241986340140, -0.609725873366673940, -0.609765503222693520, -0.609805131554298940, -0.609844758361391510, -0.609884383643872210, -0.609924007401642210, --0.609963629634601930, -0.610003250342652570, -0.610042869525695090, -0.610082487183630780, -0.610122103316359850, -0.610161717923783710, -0.610201331005803320, -0.610240942562319870, --0.610280552593233770, -0.610320161098446220, -0.610359768077858410, -0.610399373531371410, -0.610438977458885650, -0.610478579860302410, -0.610518180735523110, -0.610557780084448050, --0.610597377906978430, -0.610636974203015440, -0.610676568972460370, -0.610716162215213520, -0.610755753931176320, -0.610795344120249610, -0.610834932782335030, -0.610874519917332660, --0.610914105525144020, -0.610953689605670090, -0.610993272158812380, -0.611032853184471090, -0.611072432682547630, -0.611112010652943070, -0.611151587095558950, -0.611191162010295440, --0.611230735397053970, -0.611270307255735720, -0.611309877586242110, -0.611349446388473330, -0.611389013662331000, -0.611428579407716550, -0.611468143624530170, -0.611507706312673480, --0.611547267472047570, -0.611586827102553850, -0.611626385204092630, -0.611665941776565520, -0.611705496819873520, -0.611745050333918130, -0.611784602318599770, -0.611824152773819960, --0.611863701699479680, -0.611903249095480550, -0.611942794961722990, -0.611982339298108300, -0.612021882104537900, -0.612061423380913070, -0.612100963127134360, -0.612140501343103270, --0.612180038028721230, -0.612219573183888750, -0.612259106808507370, -0.612298638902478150, -0.612338169465702740, -0.612377698498081550, -0.612417225999516090, -0.612456751969907560, --0.612496276409157600, -0.612535799317166510, -0.612575320693835910, -0.612614840539067010, -0.612654358852761430, -0.612693875634819580, -0.612733390885143000, -0.612772904603632980, --0.612812416790191050, -0.612851927444717730, -0.612891436567114530, -0.612930944157283110, -0.612970450215124090, -0.613009954740538760, -0.613049457733428670, -0.613088959193695220, --0.613128459121239140, -0.613167957515961760, -0.613207454377764580, -0.613246949706549140, -0.613286443502215840, -0.613325935764666540, -0.613365426493802430, -0.613404915689525040, --0.613444403351735000, -0.613483889480333940, -0.613523374075223280, -0.613562857136304430, -0.613602338663478130, -0.613641818656645910, -0.613681297115709180, -0.613720774040569570, --0.613760249431127720, -0.613799723287285160, -0.613839195608943730, -0.613878666396003860, -0.613918135648367390, -0.613957603365935630, -0.613997069548610110, -0.614036534196291670, --0.614075997308881850, -0.614115458886281940, -0.614154918928393910, -0.614194377435118070, -0.614233834406356370, -0.614273289842010020, -0.614312743741980860, -0.614352196106169530, --0.614391646934477680, -0.614431096226806690, -0.614470543983058230, -0.614509990203133130, -0.614549434886933140, -0.614588878034359800, -0.614628319645313950, -0.614667759719697340, --0.614707198257411270, -0.614746635258357600, -0.614786070722436960, -0.614825504649551100, -0.614864937039601540, -0.614904367892490030, -0.614943797208117200, -0.614983224986384910, --0.615022651227194460, -0.615062075930447820, -0.615101499096045610, -0.615140920723889710, -0.615180340813881400, -0.615219759365922660, -0.615259176379914230, -0.615298591855757750, --0.615338005793355180, -0.615377418192607270, -0.615416829053415770, -0.615456238375682200, -0.615495646159308410, -0.615535052404195150, -0.615574457110244280, -0.615613860277357210, --0.615653261905435900, -0.615692661994381110, -0.615732060544094570, -0.615771457554477930, -0.615810853025433040, -0.615850246956860640, -0.615889639348662590, -0.615929030200740410, --0.615968419512996080, -0.616007807285330330, -0.616047193517645030, -0.616086578209842140, -0.616125961361822410, -0.616165342973487800, -0.616204723044739830, -0.616244101575480370, --0.616283478565610390, -0.616322854015031620, -0.616362227923645810, -0.616401600291354710, -0.616440971118059290, -0.616480340403661400, -0.616519708148062670, -0.616559074351165080, --0.616598439012869480, -0.616637802133077730, -0.616677163711691460, -0.616716523748612630, -0.616755882243742120, -0.616795239196981980, -0.616834594608233640, -0.616873948477399180, --0.616913300804379560, -0.616952651589076750, -0.616992000831392500, -0.617031348531227990, -0.617070694688485080, -0.617110039303065520, -0.617149382374871050, -0.617188723903802970, --0.617228063889762920, -0.617267402332652760, -0.617306739232374450, -0.617346074588828950, -0.617385408401918250, -0.617424740671544070, -0.617464071397608280, -0.617503400580012070, --0.617542728218657300, -0.617582054313445820, -0.617621378864279480, -0.617660701871059260, -0.617700023333687340, -0.617739343252065810, -0.617778661626095520, -0.617817978455678540, --0.617857293740716630, -0.617896607481111750, -0.617935919676765090, -0.617975230327578620, -0.618014539433454080, -0.618053846994293550, -0.618093153009998010, -0.618132457480469630, --0.618171760405610170, -0.618211061785321590, -0.618250361619504970, -0.618289659908062510, -0.618328956650895820, -0.618368251847907110, -0.618407545498997460, -0.618446837604068930, --0.618486128163023620, -0.618525417175762700, -0.618564704642188270, -0.618603990562202060, -0.618643274935706140, -0.618682557762601730, -0.618721839042790990, -0.618761118776175570, --0.618800396962657650, -0.618839673602138540, -0.618878948694520090, -0.618918222239704390, -0.618957494237593500, -0.618996764688088400, -0.619036033591091490, -0.619075300946504430, --0.619114566754229490, -0.619153831014167770, -0.619193093726221560, -0.619232354890292490, -0.619271614506282990, -0.619310872574094120, -0.619350129093627970, -0.619389384064786830, --0.619428637487472010, -0.619467889361585480, -0.619507139687029310, -0.619546388463705580, -0.619585635691515590, -0.619624881370361420, -0.619664125500145160, -0.619703368080768870, --0.619742609112133750, -0.619781848594142200, -0.619821086526695990, -0.619860322909697390, -0.619899557743047720, -0.619938791026649060, -0.619978022760403480, -0.620017252944213170, --0.620056481577979430, -0.620095708661604460, -0.620134934194990550, -0.620174158178038890, -0.620213380610651900, -0.620252601492731540, -0.620291820824179880, -0.620331038604898470, --0.620370254834789360, -0.620409469513754640, -0.620448682641696610, -0.620487894218516470, -0.620527104244116610, -0.620566312718399020, -0.620605519641265980, -0.620644725012618800, --0.620683928832359790, -0.620723131100391010, -0.620762331816614670, -0.620801530980932270, -0.620840728593245910, -0.620879924653458200, -0.620919119161470250, -0.620958312117184440, --0.620997503520502980, -0.621036693371328050, -0.621075881669561070, -0.621115068415104330, -0.621154253607860030, -0.621193437247730350, -0.621232619334616710, -0.621271799868421630, --0.621310978849046960, -0.621350156276395230, -0.621389332150367730, -0.621428506470866890, -0.621467679237794780, -0.621506850451053920, -0.621546020110545490, -0.621585188216172040, --0.621624354767835620, -0.621663519765438650, -0.621702683208882560, -0.621741845098069730, -0.621781005432902600, -0.621820164213282680, -0.621859321439112270, -0.621898477110293670, --0.621937631226729180, -0.621976783788320220, -0.622015934794969310, -0.622055084246578630, -0.622094232143050490, -0.622133378484286510, -0.622172523270189020, -0.622211666500660290, --0.622250808175602630, -0.622289948294917680, -0.622329086858507850, -0.622368223866275330, -0.622407359318122630, -0.622446493213951070, -0.622485625553663380, -0.622524756337161980, --0.622563885564348270, -0.622603013235124900, -0.622642139349393940, -0.622681263907058020, -0.622720386908018560, -0.622759508352178190, -0.622798628239438990, -0.622837746569703590, --0.622876863342873400, -0.622915978558851170, -0.622955092217538970, -0.622994204318839340, -0.623033314862653900, -0.623072423848885170, -0.623111531277435350, -0.623150637148207060, --0.623189741461101840, -0.623228844216022320, -0.623267945412870890, -0.623307045051549440, -0.623346143131960240, -0.623385239654005720, -0.623424334617588390, -0.623463428022610010, --0.623502519868972980, -0.623541610156579610, -0.623580698885332630, -0.623619786055133570, -0.623658871665884960, -0.623697955717489210, -0.623737038209848940, -0.623776119142865680, --0.623815198516442180, -0.623854276330480630, -0.623893352584883760, -0.623932427279553230, -0.623971500414391530, -0.624010571989301540, -0.624049642004184670, -0.624088710458943760, --0.624127777353481020, -0.624166842687699170, -0.624205906461499980, -0.624244968674785850, -0.624284029327459410, -0.624323088419423300, -0.624362145950579040, -0.624401201920829370, --0.624440256330076720, -0.624479309178223810, -0.624518360465172280, -0.624557410190824890, -0.624596458355083930, -0.624635504957852140, -0.624674549999031270, -0.624713593478524070, --0.624752635396232820, -0.624791675752060400, -0.624830714545908440, -0.624869751777679560, -0.624908787447276740, -0.624947821554601600, -0.624986854099557010, -0.625025885082045150, --0.625064914501968990, -0.625103942359230170, -0.625142968653731420, -0.625181993385375390, -0.625221016554064590, -0.625260038159700990, -0.625299058202187340, -0.625338076681425940, --0.625377093597319740, -0.625416108949770400, -0.625455122738680870, -0.625494134963953560, -0.625533145625491120, -0.625572154723195610, -0.625611162256969670, -0.625650168226716150, --0.625689172632336810, -0.625728175473734600, -0.625767176750811950, -0.625806176463471700, -0.625845174611615710, -0.625884171195146720, -0.625923166213967370, -0.625962159667980410, --0.626001151557087690, -0.626040141881192060, -0.626079130640196160, -0.626118117834002730, -0.626157103462513740, -0.626196087525631830, -0.626235070023259840, -0.626274050955300420, --0.626313030321655640, -0.626352008122228240, -0.626390984356921090, -0.626429959025636250, -0.626468932128276480, -0.626507903664744290, -0.626546873634942770, -0.626585842038773650, --0.626624808876140030, -0.626663774146944300, -0.626702737851089540, -0.626741699988477620, -0.626780660559011380, -0.626819619562593470, -0.626858576999126950, -0.626897532868513570, --0.626936487170656310, -0.626975439905457900, -0.627014391072821310, -0.627053340672648290, -0.627092288704841900, -0.627131235169304910, -0.627170180065940050, -0.627209123394649510, --0.627248065155336040, -0.627287005347902830, -0.627325943972251830, -0.627364881028285800, -0.627403816515907710, -0.627442750435020400, -0.627481682785525740, -0.627520613567327020, --0.627559542780326660, -0.627598470424427850, -0.627637396499532540, -0.627676321005543710, -0.627715243942364110, -0.627754165309896690, -0.627793085108043550, -0.627832003336707740, --0.627870919995791810, -0.627909835085199040, -0.627948748604831300, -0.627987660554591650, -0.628026570934383190, -0.628065479744107980, -0.628104386983669110, -0.628143292652969200, --0.628182196751911450, -0.628221099280397820, -0.628260000238331510, -0.628298899625615140, -0.628337797442151900, -0.628376693687843880, -0.628415588362594040, -0.628454481466305230, --0.628493372998880530, -0.628532262960222130, -0.628571151350233110, -0.628610038168816110, -0.628648923415874420, -0.628687807091310000, -0.628726689195026170, -0.628765569726925880, --0.628804448686911320, -0.628843326074885690, -0.628882201890751720, -0.628921076134412620, -0.628959948805770440, -0.628998819904728390, -0.629037689431189320, -0.629076557385056410, --0.629115423766231750, -0.629154288574618410, -0.629193151810119480, -0.629232013472637910, -0.629270873562076120, -0.629309732078336960, -0.629348589021323620, -0.629387444390939080, --0.629426298187085620, -0.629465150409666330, -0.629504001058584620, -0.629542850133742450, -0.629581697635043240, -0.629620543562389720, -0.629659387915685320, -0.629698230694832000, --0.629737071899733050, -0.629775911530291550, -0.629814749586410480, -0.629853586067992350, -0.629892420974940140, -0.629931254307156910, -0.629970086064545850, -0.630008916247009280, --0.630047744854450480, -0.630086571886772200, -0.630125397343877850, -0.630164221225669730, -0.630203043532051030, -0.630241864262924720, -0.630280683418194100, -0.630319500997761350, --0.630358317001530000, -0.630397131429403120, -0.630435944281283020, -0.630474755557073110, -0.630513565256676230, -0.630552373379995920, -0.630591179926934250, -0.630629984897394640, --0.630668788291280150, -0.630707590108493870, -0.630746390348938420, -0.630785189012516900, -0.630823986099132480, -0.630862781608688360, -0.630901575541087060, -0.630940367896231650, --0.630979158674025430, -0.631017947874371710, -0.631056735497172670, -0.631095521542331840, -0.631134306009752510, -0.631173088899337100, -0.631211870210989010, -0.631250649944611220, --0.631289428100107130, -0.631328204677379160, -0.631366979676330600, -0.631405753096864640, -0.631444524938884700, -0.631483295202293070, -0.631522063886993170, -0.631560830992888070, --0.631599596519881290, -0.631638360467875140, -0.631677122836773130, -0.631715883626478350, -0.631754642836894090, -0.631793400467922980, -0.631832156519468340, -0.631870910991433670, --0.631909663883721380, -0.631948415196234900, -0.631987164928877410, -0.632025913081552320, -0.632064659654162140, -0.632103404646610300, -0.632142148058799870, -0.632180889890634480, --0.632219630142016540, -0.632258368812849580, -0.632297105903036560, -0.632335841412481230, -0.632374575341085880, -0.632413307688754140, -0.632452038455389110, -0.632490767640894290, --0.632529495245172320, -0.632568221268126510, -0.632606945709660140, -0.632645668569676860, -0.632684389848078950, -0.632723109544770180, -0.632761827659653830, -0.632800544192632650, --0.632839259143610170, -0.632877972512489450, -0.632916684299174140, -0.632955394503566860, -0.632994103125571030, -0.633032810165089940, -0.633071515622027240, -0.633110219496285320, --0.633148921787767830, -0.633187622496378170, -0.633226321622019640, -0.633265019164595100, -0.633303715124007960, -0.633342409500161520, -0.633381102292959410, -0.633419793502304150, --0.633458483128099490, -0.633497171170248840, -0.633535857628655050, -0.633574542503221540, -0.633613225793851710, -0.633651907500449200, -0.633690587622916520, -0.633729266161157430, --0.633767943115075120, -0.633806618484573310, -0.633845292269554550, -0.633883964469922680, -0.633922635085580780, -0.633961304116432700, -0.633999971562380970, -0.634038637423329440, --0.634077301699181200, -0.634115964389840080, -0.634154625495208730, -0.634193285015190790, -0.634231942949689990, -0.634270599298608960, -0.634309254061851460, -0.634347907239320770, --0.634386558830920650, -0.634425208836553840, -0.634463857256124090, -0.634502504089534570, -0.634541149336689150, -0.634579792997490570, -0.634618435071842460, -0.634657075559648340, --0.634695714460811860, -0.634734351775235630, -0.634772987502823630, -0.634811621643479150, -0.634850254197105950, -0.634888885163606750, -0.634927514542885320, -0.634966142334845500, --0.635004768539390030, -0.635043393156422550, -0.635082016185846590, -0.635120637627565990, -0.635159257481483390, -0.635197875747502640, -0.635236492425527270, -0.635275107515460900, --0.635313721017206510, -0.635352332930667840, -0.635390943255748300, -0.635429551992351740, -0.635468159140380910, -0.635506764699739770, -0.635545368670331620, -0.635583971052060440, --0.635622571844829070, -0.635661171048541140, -0.635699768663100410, -0.635738364688410500, -0.635776959124374370, -0.635815551970895900, -0.635854143227878810, -0.635892732895226080, --0.635931320972841440, -0.635969907460628540, -0.636008492358491220, -0.636047075666332340, -0.636085657384055760, -0.636124237511564990, -0.636162816048764010, -0.636201392995555670, --0.636239968351843820, -0.636278542117532100, -0.636317114292524360, -0.636355684876723450, -0.636394253870033340, -0.636432821272357560, -0.636471387083600070, -0.636509951303663830, --0.636548513932452710, -0.636587074969870550, -0.636625634415820430, -0.636664192270206210, -0.636702748532931520, -0.636741303203900320, -0.636779856283015590, -0.636818407770181060, --0.636856957665300590, -0.636895505968278040, -0.636934052679016480, -0.636972597797419660, -0.637011141323391430, -0.637049683256835640, -0.637088223597655380, -0.637126762345754490, --0.637165299501036730, -0.637203835063406050, -0.637242369032765430, -0.637280901409018830, -0.637319432192070430, -0.637357961381822990, -0.637396488978180800, -0.637435014981047270, --0.637473539390326580, -0.637512062205921710, -0.637550583427736630, -0.637589103055675180, -0.637627621089641220, -0.637666137529537940, -0.637704652375269300, -0.637743165626738940, --0.637781677283851160, -0.637820187346508800, -0.637858695814615850, -0.637897202688076260, -0.637935707966794000, -0.637974211650672140, -0.638012713739614770, -0.638051214233525620, --0.638089713132308670, -0.638128210435867200, -0.638166706144105200, -0.638205200256926730, -0.638243692774234980, -0.638282183695933920, -0.638320673021927410, -0.638359160752119630, --0.638397646886413540, -0.638436131424713340, -0.638474614366922880, -0.638513095712946120, -0.638551575462686370, -0.638590053616047590, -0.638628530172933750, -0.638667005133248920, --0.638705478496896180, -0.638743950263779840, -0.638782420433803510, -0.638820889006871620, -0.638859355982887010, -0.638897821361754100, -0.638936285143376970, -0.638974747327658800, --0.639013207914503670, -0.639051666903815650, -0.639090124295498720, -0.639128580089456170, -0.639167034285592180, -0.639205486883810510, -0.639243937884015570, -0.639282387286110420, --0.639320835089999260, -0.639359281295586060, -0.639397725902774990, -0.639436168911469260, -0.639474610321573160, -0.639513050132990420, -0.639551488345625470, -0.639589924959381500, --0.639628359974162670, -0.639666793389873310, -0.639705225206416590, -0.639743655423696820, -0.639782084041617850, -0.639820511060084090, -0.639858936478998610, -0.639897360298265940, --0.639935782517789820, -0.639974203137474550, -0.640012622157223430, -0.640051039576940760, -0.640089455396530500, -0.640127869615896960, -0.640166282234943320, -0.640204693253574100, --0.640243102671693040, -0.640281510489204560, -0.640319916706012070, -0.640358321322019750, -0.640396724337131910, -0.640435125751251940, -0.640473525564284160, -0.640511923776132640, --0.640550320386701570, -0.640588715395894460, -0.640627108803615400, -0.640665500609768680, -0.640703890814258490, -0.640742279416988250, -0.640780666417862350, -0.640819051816784780, --0.640857435613659930, -0.640895817808391110, -0.640934198400882730, -0.640972577391038860, -0.641010954778763910, -0.641049330563961290, -0.641087704746535310, -0.641126077326390040, --0.641164448303429890, -0.641202817677558270, -0.641241185448679700, -0.641279551616698470, -0.641317916181518010, -0.641356279143042720, -0.641394640501176780, -0.641433000255824610, --0.641471358406889510, -0.641509714954276110, -0.641548069897888370, -0.641586423237630710, -0.641624774973406750, -0.641663125105120910, -0.641701473632677160, -0.641739820555980110, --0.641778165874933190, -0.641816509589440810, -0.641854851699407150, -0.641893192204736730, -0.641931531105332960, -0.641969868401100370, -0.642008204091943480, -0.642046538177765690, --0.642084870658471640, -0.642123201533965400, -0.642161530804151390, -0.642199858468933350, -0.642238184528215570, -0.642276508981902360, -0.642314831829898240, -0.642353153072106610, --0.642391472708432220, -0.642429790738779040, -0.642468107163051800, -0.642506421981153930, -0.642544735192989940, -0.642583046798464230, -0.642621356797481220, -0.642659665189944440, --0.642697971975758400, -0.642736277154827950, -0.642774580727056400, -0.642812882692348380, -0.642851183050608180, -0.642889481801740330, -0.642927778945648450, -0.642966074482237080, --0.643004368411410620, -0.643042660733073480, -0.643080951447129400, -0.643119240553482910, -0.643157528052038410, -0.643195813942700310, -0.643234098225372470, -0.643272380899959310, --0.643310661966365100, -0.643348941424494720, -0.643387219274251580, -0.643425495515540400, -0.643463770148265500, -0.643502043172331510, -0.643540314587642050, -0.643578584394101870, --0.643616852591615500, -0.643655119180086670, -0.643693384159420120, -0.643731647529519950, -0.643769909290291100, -0.643808169441637210, -0.643846427983462810, -0.643884684915672300, --0.643922940238170540, -0.643961193950860930, -0.643999446053648450, -0.644037696546437390, -0.644075945429132270, -0.644114192701637060, -0.644152438363856380, -0.644190682415694550, --0.644228924857056410, -0.644267165687845590, -0.644305404907966840, -0.644343642517324900, -0.644381878515823630, -0.644420112903367540, -0.644458345679861160, -0.644496576845209330, --0.644534806399315710, -0.644573034342085020, -0.644611260673421780, -0.644649485393230750, -0.644687708501415660, -0.644725929997881250, -0.644764149882532060, -0.644802368155272810, --0.644840584816007370, -0.644878799864640360, -0.644917013301076420, -0.644955225125220300, -0.644993435336975730, -0.645031643936247570, -0.645069850922940670, -0.645108056296958890, --0.645146260058206860, -0.645184462206589200, -0.645222662742010680, -0.645260861664375240, -0.645299058973587520, -0.645337254669552270, -0.645375448752174230, -0.645413641221357140, --0.645451832077006070, -0.645490021319025330, -0.645528208947319880, -0.645566394961793580, -0.645604579362351380, -0.645642762148897600, -0.645680943321337300, -0.645719122879574340, --0.645757300823513570, -0.645795477153059850, -0.645833651868117030, -0.645871824968590190, -0.645909996454383740, -0.645948166325402640, -0.645986334581550860, -0.646024501222733140, --0.646062666248854220, -0.646100829659818960, -0.646138991455531330, -0.646177151635896170, -0.646215310200818130, -0.646253467150202150, -0.646291622483952220, -0.646329776201973180, --0.646367928304169780, -0.646406078790446760, -0.646444227660708300, -0.646482374914859270, -0.646520520552804290, -0.646558664574448330, -0.646596806979695350, -0.646634947768450430, --0.646673086940618420, -0.646711224496103410, -0.646749360434810240, -0.646787494756643770, -0.646825627461508850, -0.646863758549309550, -0.646901888019950850, -0.646940015873337380, --0.646978142109374320, -0.647016266727965420, -0.647054389729015970, -0.647092511112430490, -0.647130630878114070, -0.647168749025970770, -0.647206865555905560, -0.647244980467823190, --0.647283093761628740, -0.647321205437226150, -0.647359315494520640, -0.647397423933417150, -0.647435530753819770, -0.647473635955633450, -0.647511739538763180, -0.647549841503113790, --0.647587941848589590, -0.647626040575095430, -0.647664137682536280, -0.647702233170816990, -0.647740327039841860, -0.647778419289515850, -0.647816509919743820, -0.647854598930430850, --0.647892686321481110, -0.647930772092799590, -0.647968856244291120, -0.648006938775860910, -0.648045019687413020, -0.648083098978852520, -0.648121176650084620, -0.648159252701013490, --0.648197327131544210, -0.648235399941581640, -0.648273471131030840, -0.648311540699796020, -0.648349608647782350, -0.648387674974894690, -0.648425739681038230, -0.648463802766117040, --0.648501864230036310, -0.648539924072701000, -0.648577982294016090, -0.648616038893885970, -0.648654093872215840, -0.648692147228910330, -0.648730198963874850, -0.648768249077013470, --0.648806297568231600, -0.648844344437433880, -0.648882389684525720, -0.648920433309411180, -0.648958475311995580, -0.648996515692184080, -0.649034554449881010, -0.649072591584991530, --0.649110627097420620, -0.649148660987073470, -0.649186693253854250, -0.649224723897668390, -0.649262752918420620, -0.649300780316016350, -0.649338806090359880, -0.649376830241356280, --0.649414852768910640, -0.649452873672928250, -0.649490892953313300, -0.649528910609971090, -0.649566926642806690, -0.649604941051725170, -0.649642953836631070, -0.649680964997429560, --0.649718974534026050, -0.649756982446324630, -0.649794988734230810, -0.649832993397649550, -0.649870996436486160, -0.649908997850644820, -0.649946997640031170, -0.649984995804549830, --0.650022992344106540, -0.650060987258605280, -0.650098980547951570, -0.650136972212050470, -0.650174962250807290, -0.650212950664126210, -0.650250937451912980, -0.650288922614072230, --0.650326906150509590, -0.650364888061129350, -0.650402868345836830, -0.650440847004537530, -0.650478824037135750, -0.650516799443536910, -0.650554773223646080, -0.650592745377368660, --0.650630715904609080, -0.650668684805272620, -0.650706652079264480, -0.650744617726490060, -0.650782581746853770, -0.650820544140261030, -0.650858504906616900, -0.650896464045826910, --0.650934421557795350, -0.650972377442427750, -0.651010331699629300, -0.651048284329305280, -0.651086235331360230, -0.651124184705699550, -0.651162132452228760, -0.651200078570852270, --0.651238023061475600, -0.651275965924003940, -0.651313907158342700, -0.651351846764396280, -0.651389784742070320, -0.651427721091269780, -0.651465655811900410, -0.651503588903866500, --0.651541520367073580, -0.651579450201426940, -0.651617378406831980, -0.651655304983193240, -0.651693229930416230, -0.651731153248406140, -0.651769074937068480, -0.651806994996307900, --0.651844913426029680, -0.651882830226139350, -0.651920745396542100, -0.651958658937142780, -0.651996570847846790, -0.652034481128559660, -0.652072389779186020, -0.652110296799631390, --0.652148202189801070, -0.652186105949600580, -0.652224008078934440, -0.652261908577708270, -0.652299807445827380, -0.652337704683197290, -0.652375600289722520, -0.652413494265308920, --0.652451386609861460, -0.652489277323285880, -0.652527166405486800, -0.652565053856369760, -0.652602939675840150, -0.652640823863803510, -0.652678706420164460, -0.652716587344828620, --0.652754466637701650, -0.652792344298688270, -0.652830220327694000, -0.652868094724624040, -0.652905967489384340, -0.652943838621879320, -0.652981708122014730, -0.653019575989695840, --0.653057442224828310, -0.653095306827316870, -0.653133169797067260, -0.653171031133984670, -0.653208890837974730, -0.653246748908942300, -0.653284605346793110, -0.653322460151432250, --0.653360313322765670, -0.653398164860697910, -0.653436014765134800, -0.653473863035981870, -0.653511709673144090, -0.653549554676526980, -0.653587398046035940, -0.653625239781576830, --0.653663079883054170, -0.653700918350373920, -0.653738755183441270, -0.653776590382162180, -0.653814423946441180, -0.653852255876184230, -0.653890086171296510, -0.653927914831684000, --0.653965741857251310, -0.654003567247904320, -0.654041391003548410, -0.654079213124089340, -0.654117033609431850, -0.654154852459481910, -0.654192669674144690, -0.654230485253326280, --0.654268299196931190, -0.654306111504865400, -0.654343922177034740, -0.654381731213343860, -0.654419538613698610, -0.654457344378004620, -0.654495148506167520, -0.654532950998092280, --0.654570751853684630, -0.654608551072850100, -0.654646348655494540, -0.654684144601522690, -0.654721938910840520, -0.654759731583353540, -0.654797522618967620, -0.654835312017587490, --0.654873099779119120, -0.654910885903467910, -0.654948670390539830, -0.654986453240239850, -0.655024234452473710, -0.655062014027147250, -0.655099791964165460, -0.655137568263434170, --0.655175342924859020, -0.655213115948345750, -0.655250887333799440, -0.655288657081125820, -0.655326425190230650, -0.655364191661019780, -0.655401956493397940, -0.655439719687271330, --0.655477481242545460, -0.655515241159126180, -0.655552999436918360, -0.655590756075828170, -0.655628511075761030, -0.655666264436623010, -0.655704016158318860, -0.655741766240754750, --0.655779514683836550, -0.655817261487469330, -0.655855006651558830, -0.655892750176010900, -0.655930492060731400, -0.655968232305625290, -0.656005970910598650, -0.656043707875556990, --0.656081443200406510, -0.656119176885052060, -0.656156908929399600, -0.656194639333354980, -0.656232368096824060, -0.656270095219711800, -0.656307820701924390, -0.656345544543367350, --0.656383266743946870, -0.656420987303567900, -0.656458706222136420, -0.656496423499558500, -0.656534139135739210, -0.656571853130584530, -0.656609565484000290, -0.656647276195892360, --0.656684985266166030, -0.656722692694727160, -0.656760398481481600, -0.656798102626335310, -0.656835805129193480, -0.656873505989962080, -0.656911205208547070, -0.656948902784854180, --0.656986598718788840, -0.657024293010257000, -0.657061985659164400, -0.657099676665417130, -0.657137366028920370, -0.657175053749580180, -0.657212739827302330, -0.657250424261993090, --0.657288107053557340, -0.657325788201901350, -0.657363467706931210, -0.657401145568552110, -0.657438821786670120, -0.657476496361190990, -0.657514169292021110, -0.657551840579065350, --0.657589510222230000, -0.657627178221420920, -0.657664844576544280, -0.657702509287505180, -0.657740172354209670, -0.657777833776563850, -0.657815493554473770, -0.657853151687844640, --0.657890808176582630, -0.657928463020593490, -0.657966116219783630, -0.658003767774058110, -0.658041417683323140, -0.658079065947485000, -0.658116712566448880, -0.658154357540120970, --0.658192000868407120, -0.658229642551213740, -0.658267282588445800, -0.658304920980009700, -0.658342557725811180, -0.658380192825756770, -0.658417826279751430, -0.658455458087701560, --0.658493088249513030, -0.658530716765092120, -0.658568343634344130, -0.658605968857175260, -0.658643592433491460, -0.658681214363198930, -0.658718834646203180, -0.658756453282410280, --0.658794070271726540, -0.658831685614057360, -0.658869299309308930, -0.658906911357387210, -0.658944521758198620, -0.658982130511648330, -0.659019737617642760, -0.659057343076087760, --0.659094946886889850, -0.659132549049954220, -0.659170149565187160, -0.659207748432494740, -0.659245345651783390, -0.659282941222958160, -0.659320535145925700, -0.659358127420591860, --0.659395718046863030, -0.659433307024644640, -0.659470894353842870, -0.659508480034364020, -0.659546064066114160, -0.659583646448998810, -0.659621227182924490, -0.659658806267797270, --0.659696383703522790, -0.659733959490007350, -0.659771533627157010, -0.659809106114878090, -0.659846676953076190, -0.659884246141657530, -0.659921813680528270, -0.659959379569594830, --0.659996943808762620, -0.660034506397937930, -0.660072067337027060, -0.660109626625936420, -0.660147184264571310, -0.660184740252838240, -0.660222294590643300, -0.660259847277893000, --0.660297398314492750, -0.660334947700348950, -0.660372495435368130, -0.660410041519455810, -0.660447585952518290, -0.660485128734461860, -0.660522669865192920, -0.660560209344617010, --0.660597747172640530, -0.660635283349169770, -0.660672817874111030, -0.660710350747369950, -0.660747881968853030, -0.660785411538466370, -0.660822939456116480, -0.660860465721708980, --0.660897990335150290, -0.660935513296346590, -0.660973034605204400, -0.661010554261629360, -0.661048072265527980, -0.661085588616806660, -0.661123103315371050, -0.661160616361127770, --0.661198127753982900, -0.661235637493843060, -0.661273145580613790, -0.661310652014201580, -0.661348156794512750, -0.661385659921453930, -0.661423161394930630, -0.661460661214849370, --0.661498159381116560, -0.661535655893638500, -0.661573150752321150, -0.661610643957070810, -0.661648135507793890, -0.661685625404397020, -0.661723113646785710, -0.661760600234866600, --0.661798085168546320, -0.661835568447730620, -0.661873050072325890, -0.661910530042238540, -0.661948008357375110, -0.661985485017641430, -0.662022960022944030, -0.662060433373189210, --0.662097905068283700, -0.662135375108133030, -0.662172843492643940, -0.662210310221722720, -0.662247775295276120, -0.662285238713209660, -0.662322700475430180, -0.662360160581843880, --0.662397619032357610, -0.662435075826876880, -0.662472530965308450, -0.662509984447558820, -0.662547436273534410, -0.662584886443141170, -0.662622334956285640, -0.662659781812874660, --0.662697227012813860, -0.662734670556009990, -0.662772112442369550, -0.662809552671799080, -0.662846991244204320, -0.662884428159492220, -0.662921863417568980, -0.662959297018341440, --0.662996728961715240, -0.663034159247597340, -0.663071587875893930, -0.663109014846511970, -0.663146440159357090, -0.663183863814336140, -0.663221285811355530, -0.663258706150322010, --0.663296124831141420, -0.663333541853720510, -0.663370957217966020, -0.663408370923783910, -0.663445782971080810, -0.663483193359763250, -0.663520602089738070, -0.663558009160911120, --0.663595414573189050, -0.663632818326478470, -0.663670220420686130, -0.663707620855717990, -0.663745019631480690, -0.663782416747880970, -0.663819812204825440, -0.663857206002220090, --0.663894598139971650, -0.663931988617986860, -0.663969377436172350, -0.664006764594434080, -0.664044150092678810, -0.664081533930813590, -0.664118916108744180, -0.664156296626377540, --0.664193675483620070, -0.664231052680378850, -0.664268428216559510, -0.664305802092069240, -0.664343174306814440, -0.664380544860701970, -0.664417913753637790, -0.664455280985528970, --0.664492646556281820, -0.664530010465803400, -0.664567372713999680, -0.664604733300777520, -0.664642092226043420, -0.664679449489704590, -0.664716805091666750, -0.664754159031836770, --0.664791511310121490, -0.664828861926427760, -0.664866210880661560, -0.664903558172729840, -0.664940903802539560, -0.664978247769996700, -0.665015590075008100, -0.665052930717480620, --0.665090269697321210, -0.665127607014435630, -0.665164942668731160, -0.665202276660114330, -0.665239608988492100, -0.665276939653770550, -0.665314268655856630, -0.665351595994656990, --0.665388921670078790, -0.665426245682027910, -0.665463568030411400, -0.665500888715135910, -0.665538207736108610, -0.665575525093235480, -0.665612840786423470, -0.665650154815579760, --0.665687467180610340, -0.665724777881422150, -0.665762086917922160, -0.665799394290017110, -0.665836699997613300, -0.665874004040617810, -0.665911306418937250, -0.665948607132478830, --0.665985906181148500, -0.666023203564853450, -0.666060499283500310, -0.666097793336996260, -0.666135085725247490, -0.666172376448160960, -0.666209665505643420, -0.666246952897602160, --0.666284238623943150, -0.666321522684573560, -0.666358805079400370, -0.666396085808329990, -0.666433364871269360, -0.666470642268125250, -0.666507917998804930, -0.666545192063214500, --0.666582464461261020, -0.666619735192851450, -0.666657004257892760, -0.666694271656291360, -0.666731537387954210, -0.666768801452788270, -0.666806063850700510, -0.666843324581597450, --0.666880583645385940, -0.666917841041973050, -0.666955096771265850, -0.666992350833170660, -0.667029603227594530, -0.667066853954444430, -0.667104103013627440, -0.667141350405049960, --0.667178596128618960, -0.667215840184241960, -0.667253082571824920, -0.667290323291275240, -0.667327562342499790, -0.667364799725405630, -0.667402035439899290, -0.667439269485887720, --0.667476501863278120, -0.667513732571977550, -0.667550961611892200, -0.667588188982929600, -0.667625414684996480, -0.667662638718000130, -0.667699861081846870, -0.667737081776443860, --0.667774300801698310, -0.667811518157517270, -0.667848733843807050, -0.667885947860475060, -0.667923160207428480, -0.667960370884573720, -0.667997579891818070, -0.668034787229068390, --0.668071992896232090, -0.668109196893215460, -0.668146399219925910, -0.668183599876270300, -0.668220798862156020, -0.668257996177489490, -0.668295191822177890, -0.668332385796128300, --0.668369578099248130, -0.668406768731443670, -0.668443957692622330, -0.668481144982691070, -0.668518330601557190, -0.668555514549127210, -0.668592696825308530, -0.668629877430008350, --0.668667056363133170, -0.668704233624590310, -0.668741409214286930, -0.668778583132130230, -0.668815755378026840, -0.668852925951884060, -0.668890094853608950, -0.668927262083109040, --0.668964427640290520, -0.669001591525061000, -0.669038753737327460, -0.669075914276997310, -0.669113073143977170, -0.669150230338174220, -0.669187385859495780, -0.669224539707849230, --0.669261691883140890, -0.669298842385278370, -0.669335991214169090, -0.669373138369719570, -0.669410283851837100, -0.669447427660428970, -0.669484569795402610, -0.669521710256664400, --0.669558849044122000, -0.669595986157682450, -0.669633121597253300, -0.669670255362741050, -0.669707387454053120, -0.669744517871096680, -0.669781646613779370, -0.669818773682007480, --0.669855899075688770, -0.669893022794730290, -0.669930144839039570, -0.669967265208523120, -0.670004383903088470, -0.670041500922643030, -0.670078616267093970, -0.670115729936348160, --0.670152841930312990, -0.670189952248896100, -0.670227060892003900, -0.670264167859544120, -0.670301273151423960, -0.670338376767550810, -0.670375478707831540, -0.670412578972173550, --0.670449677560484010, -0.670486774472670690, -0.670523869708640090, -0.670560963268299730, -0.670598055151557130, -0.670635145358319580, -0.670672233888493840, -0.670709320741987640, --0.670746405918708040, -0.670783489418562810, -0.670820571241458440, -0.670857651387302690, -0.670894729856003180, -0.670931806647466430, -0.670968881761600300, -0.671005955198311850, --0.671043026957508840, -0.671080097039097990, -0.671117165442986830, -0.671154232169082880, -0.671191297217293540, -0.671228360587525770, -0.671265422279687000, -0.671302482293684720, --0.671339540629426470, -0.671376597286819090, -0.671413652265770320, -0.671450705566187360, -0.671487757187977820, -0.671524807131048780, -0.671561855395307550, -0.671598901980662080, --0.671635946887019000, -0.671672990114286160, -0.671710031662370750, -0.671747071531180630, -0.671784109720622410, -0.671821146230604070, -0.671858181061032680, -0.671895214211816310, --0.671932245682861580, -0.671969275474076140, -0.672006303585367610, -0.672043330016643510, -0.672080354767810920, -0.672117377838777340, -0.672154399229450310, -0.672191418939737660, --0.672228436969546150, -0.672265453318783510, -0.672302467987357270, -0.672339480975175150, -0.672376492282144020, -0.672413501908171620, -0.672450509853165900, -0.672487516117033500, --0.672524520699682270, -0.672561523601019840, -0.672598524820953840, -0.672635524359391220, -0.672672522216239740, -0.672709518391407140, -0.672746512884800920, -0.672783505696328050, --0.672820496825896510, -0.672857486273413690, -0.672894474038787550, -0.672931460121924840, -0.672968444522733520, -0.673005427241121000, -0.673042408276995350, -0.673079387630263200, --0.673116365300832740, -0.673153341288611600, -0.673190315593506840, -0.673227288215426210, -0.673264259154277460, -0.673301228409968310, -0.673338195982405850, -0.673375161871497820, --0.673412126077151950, -0.673449088599275990, -0.673486049437777010, -0.673523008592562980, -0.673559966063541400, -0.673596921850620260, -0.673633875953706380, -0.673670828372707970, --0.673707779107532320, -0.673744728158087720, -0.673781675524280810, -0.673818621206019760, -0.673855565203212550, -0.673892507515766010, -0.673929448143588350, -0.673966387086586960, --0.674003324344669920, -0.674040259917744300, -0.674077193805717960, -0.674114126008498630, -0.674151056525994390, -0.674187985358112090, -0.674224912504759910, -0.674261837965845380, --0.674298761741276680, -0.674335683830960650, -0.674372604234805490, -0.674409522952718720, -0.674446439984608630, -0.674483355330381950, -0.674520268989946990, -0.674557180963211600, --0.674594091250082960, -0.674630999850469150, -0.674667906764277790, -0.674704811991416960, -0.674741715531793850, -0.674778617385316410, -0.674815517551892400, -0.674852416031429980, --0.674889312823836130, -0.674926207929019030, -0.674963101346886420, -0.674999993077346480, -0.675036883120306070, -0.675073771475673490, -0.675110658143356580, -0.675147543123263190, --0.675184426415300740, -0.675221308019377190, -0.675258187935400380, -0.675295066163278390, -0.675331942702918410, -0.675368817554228620, -0.675405690717117090, -0.675442562191491010, --0.675479431977258460, -0.675516300074327390, -0.675553166482605880, -0.675590031202001230, -0.675626894232421390, -0.675663755573774340, -0.675700615225968250, -0.675737473188910310, --0.675774329462508590, -0.675811184046671180, -0.675848036941306020, -0.675884888146320420, -0.675921737661622670, -0.675958585487120620, -0.675995431622722350, -0.676032276068335270, --0.676069118823867440, -0.676105959889227170, -0.676142799264321640, -0.676179636949059030, -0.676216472943347520, -0.676253307247094980, -0.676290139860208920, -0.676326970782597510, --0.676363800014168740, -0.676400627554830660, -0.676437453404490800, -0.676474277563057220, -0.676511100030438020, -0.676547920806541360, -0.676584739891274540, -0.676621557284545870, --0.676658372986263410, -0.676695186996335240, -0.676731999314668760, -0.676768809941172390, -0.676805618875754300, -0.676842426118321790, -0.676879231668783170, -0.676916035527046600, --0.676952837693020170, -0.676989638166611290, -0.677026436947728350, -0.677063234036279440, -0.677100029432172620, -0.677136823135315420, -0.677173615145616250, -0.677210405462982950, --0.677247194087324030, -0.677283981018546700, -0.677320766256559570, -0.677357549801270390, -0.677394331652587780, -0.677431111810418930, -0.677467890274672250, -0.677504667045256030, --0.677541442122078340, -0.677578215505046710, -0.677614987194069540, -0.677651757189055240, -0.677688525489911210, -0.677725292096545970, -0.677762057008867380, -0.677798820226783950, --0.677835581750203310, -0.677872341579033530, -0.677909099713183030, -0.677945856152559980, -0.677982610897072120, -0.678019363946627650, -0.678056115301134740, -0.678092864960501920, --0.678129612924636580, -0.678166359193447250, -0.678203103766842010, -0.678239846644729250, -0.678276587827016720, -0.678313327313612600, -0.678350065104425410, -0.678386801199362900, --0.678423535598333350, -0.678460268301244840, -0.678496999308006110, -0.678533728618524570, -0.678570456232708620, -0.678607182150466560, -0.678643906371706910, -0.678680628896337180, --0.678717349724265780, -0.678754068855401020, -0.678790786289651500, -0.678827502026924660, -0.678864216067128990, -0.678900928410172910, -0.678937639055964710, -0.678974348004412140, --0.679011055255423710, -0.679047760808907940, -0.679084464664772460, -0.679121166822925890, -0.679157867283276320, -0.679194566045732360, -0.679231263110201770, -0.679267958476593050, --0.679304652144814280, -0.679341344114774310, -0.679378034386380670, -0.679414722959541860, -0.679451409834166300, -0.679488095010162500, -0.679524778487438200, -0.679561460265901920, --0.679598140345461950, -0.679634818726027050, -0.679671495407504710, -0.679708170389803580, -0.679744843672832500, -0.679781515256498880, -0.679818185140711460, -0.679854853325378650, --0.679891519810408960, -0.679928184595710140, -0.679964847681190920, -0.680001509066759600, -0.680038168752324810, -0.680074826737794180, -0.680111483023076560, -0.680148137608080240, --0.680184790492713850, -0.680221441676885250, -0.680258091160502950, -0.680294738943475470, -0.680331385025711550, -0.680368029407118710, -0.680404672087605910, -0.680441313067081330, --0.680477952345453830, -0.680514589922631140, -0.680551225798522010, -0.680587859973035060, -0.680624492446078140, -0.680661123217560000, -0.680697752287389050, -0.680734379655474120, --0.680771005321722860, -0.680807629286044100, -0.680844251548346160, -0.680880872108538090, -0.680917490966527430, -0.680954108122223010, -0.680990723575533360, -0.681027337326367220, --0.681063949374632440, -0.681100559720237750, -0.681137168363091680, -0.681173775303102970, -0.681210380540179570, -0.681246984074230230, -0.681283585905163690, -0.681320186032887800, --0.681356784457311630, -0.681393381178343360, -0.681429976195891960, -0.681466569509865390, -0.681503161120172280, -0.681539751026721370, -0.681576339229421290, -0.681612925728180220, --0.681649510522906680, -0.681686093613509400, -0.681722674999897250, -0.681759254681978070, -0.681795832659660710, -0.681832408932853800, -0.681868983501466190, -0.681905556365405840, --0.681942127524581500, -0.681978696978902230, -0.682015264728275890, -0.682051830772611440, -0.682088395111817290, -0.682124957745802620, -0.682161518674475160, -0.682198077897743890, --0.682234635415517430, -0.682271191227704740, -0.682307745334213680, -0.682344297734953310, -0.682380848429832270, -0.682417397418759290, -0.682453944701642560, -0.682490490278390930, --0.682527034148913140, -0.682563576313118040, -0.682600116770913700, -0.682636655522209090, -0.682673192566912720, -0.682709727904933890, -0.682746261536180340, -0.682782793460561030, --0.682819323677985150, -0.682855852188360650, -0.682892378991596490, -0.682928904087601430, -0.682965427476284300, -0.683001949157553410, -0.683038469131317600, -0.683074987397485620, --0.683111503955966540, -0.683148018806668310, -0.683184531949500020, -0.683221043384370510, -0.683257553111188630, -0.683294061129862570, -0.683330567440301300, -0.683367072042413650, --0.683403574936108700, -0.683440076121294430, -0.683476575597880000, -0.683513073365774490, -0.683549569424885870, -0.683586063775123430, -0.683622556416395800, -0.683659047348612050, --0.683695536571680360, -0.683732024085509820, -0.683768509890009260, -0.683804993985087760, -0.683841476370653510, -0.683877957046615470, -0.683914436012882600, -0.683950913269363860, --0.683987388815967660, -0.684023862652602840, -0.684060334779178490, -0.684096805195603560, -0.684133273901786240, -0.684169740897635830, -0.684206206183061380, -0.684242669757971100, --0.684279131622274160, -0.684315591775879310, -0.684352050218695830, -0.684388506950631910, -0.684424961971596750, -0.684461415281499170, -0.684497866880248380, -0.684534316767752670, --0.684570764943921000, -0.684607211408662540, -0.684643656161886380, -0.684680099203500700, -0.684716540533414800, -0.684752980151537520, -0.684789418057778150, -0.684825854252044900, --0.684862288734247040, -0.684898721504293760, -0.684935152562093250, -0.684971581907555030, -0.685008009540587710, -0.685044435461100830, -0.685080859669002450, -0.685117282164201980, --0.685153702946608270, -0.685190122016130610, -0.685226539372677300, -0.685262955016157750, -0.685299368946480690, -0.685335781163555650, -0.685372191667290690, -0.685408600457595330, --0.685445007534378540, -0.685481412897549380, -0.685517816547016490, -0.685554218482689050, -0.685590618704476020, -0.685627017212286800, -0.685663414006029700, -0.685699809085614120, --0.685736202450949350, -0.685772594101943690, -0.685808984038506540, -0.685845372260546870, -0.685881758767974190, -0.685918143560696800, -0.685954526638624000, -0.685990908001664960, --0.686027287649728870, -0.686063665582724250, -0.686100041800560500, -0.686136416303146700, -0.686172789090392140, -0.686209160162205230, -0.686245529518495490, -0.686281897159171870, --0.686318263084143900, -0.686354627293319860, -0.686390989786609280, -0.686427350563921570, -0.686463709625165230, -0.686500066970249570, -0.686536422599083650, -0.686572776511577110, --0.686609128707638240, -0.686645479187176560, -0.686681827950101240, -0.686718174996321600, -0.686754520325746240, -0.686790863938284480, -0.686827205833845710, -0.686863546012339230, --0.686899884473673450, -0.686936221217758100, -0.686972556244502040, -0.687008889553815010, -0.687045221145605400, -0.687081551019782850, -0.687117879176256660, -0.687154205614935340, --0.687190530335728630, -0.687226853338545610, -0.687263174623295780, -0.687299494189887670, -0.687335812038230800, -0.687372128168234340, -0.687408442579807930, -0.687444755272860200, --0.687481066247300430, -0.687517375503038150, -0.687553683039982650, -0.687589988858042570, -0.687626292957127630, -0.687662595337146910, -0.687698895998010040, -0.687735194939625540, --0.687771492161903140, -0.687807787664752040, -0.687844081448081730, -0.687880373511800870, -0.687916663855819070, -0.687952952480045950, -0.687989239384390160, -0.688025524568761200, --0.688061808033068490, -0.688098089777221640, -0.688134369801129190, -0.688170648104700740, -0.688206924687845720, -0.688243199550473750, -0.688279472692493450, -0.688315744113814460, --0.688352013814346080, -0.688388281793998020, -0.688424548052678940, -0.688460812590298450, -0.688497075406765970, -0.688533336501991110, -0.688569595875882620, -0.688605853528350130, --0.688642109459303260, -0.688678363668650870, -0.688714616156302470, -0.688750866922167690, -0.688787115966155940, -0.688823363288176060, -0.688859608888137910, -0.688895852765950670, --0.688932094921524070, -0.688968335354766980, -0.689004574065589010, -0.689040811053899580, -0.689077046319608420, -0.689113279862624490, -0.689149511682857210, -0.689185741780216190, --0.689221970154611170, -0.689258196805950800, -0.689294421734145010, -0.689330644939103570, -0.689366866420735080, -0.689403086178949410, -0.689439304213656180, -0.689475520524764800, --0.689511735112184440, -0.689547947975824750, -0.689584159115595120, -0.689620368531405400, -0.689656576223164560, -0.689692782190782120, -0.689728986434167800, -0.689765188953231360, --0.689801389747881630, -0.689837588818028370, -0.689873786163581190, -0.689909981784449840, -0.689946175680543170, -0.689982367851771140, -0.690018558298043480, -0.690054747019269170, --0.690090934015357930, -0.690127119286219280, -0.690163302831763300, -0.690199484651898620, -0.690235664746535300, -0.690271843115582760, -0.690308019758951060, -0.690344194676548840, --0.690380367868286270, -0.690416539334072650, -0.690452709073818060, -0.690488877087431340, -0.690525043374822460, -0.690561207935901030, -0.690597370770576810, -0.690633531878758870, --0.690669691260357150, -0.690705848915281080, -0.690742004843440840, -0.690778159044745270, -0.690814311519104220, -0.690850462266427770, -0.690886611286624760, -0.690922758579605280, --0.690958904145278940, -0.690995047983555600, -0.691031190094344330, -0.691067330477555200, -0.691103469133097610, -0.691139606060881650, -0.691175741260816380, -0.691211874732811760, --0.691248006476777530, -0.691284136492623550, -0.691320264780258990, -0.691356391339593590, -0.691392516170537320, -0.691428639273000130, -0.691464760646890890, -0.691500880292119870, --0.691536998208596930, -0.691573114396231150, -0.691609228854932590, -0.691645341584611000, -0.691681452585176330, -0.691717561856537650, -0.691753669398605160, -0.691789775211288480, --0.691825879294497680, -0.691861981648141940, -0.691898082272131120, -0.691934181166375170, -0.691970278330784060, -0.692006373765266860, -0.692042467469733860, -0.692078559444094580, --0.692114649688259310, -0.692150738202137020, -0.692186824985637990, -0.692222910038672090, -0.692258993361148710, -0.692295074952977710, -0.692331154814069150, -0.692367232944333000, --0.692403309343678440, -0.692439384012015550, -0.692475456949254280, -0.692511528155304700, -0.692547597630075900, -0.692583665373478150, -0.692619731385421210, -0.692655795665815250, --0.692691858214569580, -0.692727919031594140, -0.692763978116798910, -0.692800035470094170, -0.692836091091388880, -0.692872144980593460, -0.692908197137617750, -0.692944247562371720, --0.692980296254764870, -0.693016343214707180, -0.693052388442108920, -0.693088431936879410, -0.693124473698928930, -0.693160513728167120, -0.693196552024504480, -0.693232588587850080, --0.693268623418114130, -0.693304656515206670, -0.693340687879037910, -0.693376717509517130, -0.693412745406554620, -0.693448771570060130, -0.693484795999944060, -0.693520818696115700, --0.693556839658485250, -0.693592858886962650, -0.693628876381458430, -0.693664892141881540, -0.693700906168142390, -0.693736918460151400, -0.693772929017817730, -0.693808937841051800, --0.693844944929763450, -0.693880950283863100, -0.693916953903260030, -0.693952955787864530, -0.693988955937586800, -0.694024954352336910, -0.694060951032024250, -0.694096945976559350, --0.694132939185851950, -0.694168930659812560, -0.694204920398350580, -0.694240908401376200, -0.694276894668799600, -0.694312879200531090, -0.694348861996480160, -0.694384843056556900, --0.694420822380672040, -0.694456799968734660, -0.694492775820655270, -0.694528749936344060, -0.694564722315711200, -0.694600692958666220, -0.694636661865119520, -0.694672629034981170, --0.694708594468161580, -0.694744558164570150, -0.694780520124117400, -0.694816480346713280, -0.694852438832268330, -0.694888395580691930, -0.694924350591894500, -0.694960303865786330, --0.694996255402277610, -0.695032205201277950, -0.695068153262697770, -0.695104099586447480, -0.695140044172436690, -0.695175987020575810, -0.695211928130774930, -0.695247867502944540, --0.695283805136994170, -0.695319741032834340, -0.695355675190375110, -0.695391607609527010, -0.695427538290199540, -0.695463467232303230, -0.695499394435748260, -0.695535319900445150, --0.695571243626303510, -0.695607165613233660, -0.695643085861145870, -0.695679004369950670, -0.695714921139557680, -0.695750836169877430, -0.695786749460820090, -0.695822661012296170, --0.695858570824215210, -0.695894478896487920, -0.695930385229024730, -0.695966289821735140, -0.696002192674530010, -0.696038093787319290, -0.696073993160013730, -0.696109890792522720, --0.696145786684757130, -0.696181680836627010, -0.696217573248043010, -0.696253463918914850, -0.696289352849152940, -0.696325240038667690, -0.696361125487369610, -0.696397009195168340, --0.696432891161974710, -0.696468771387698690, -0.696504649872251140, -0.696540526615541670, -0.696576401617480910, -0.696612274877979390, -0.696648146396946940, -0.696684016174293990, --0.696719884209931140, -0.696755750503768810, -0.696791615055716850, -0.696827477865685770, -0.696863338933586100, -0.696899198259328330, -0.696935055842822230, -0.696970911683978510, --0.697006765782707590, -0.697042618138919990, -0.697078468752525550, -0.697114317623434900, -0.697150164751558550, -0.697186010136807030, -0.697221853779090180, -0.697257695678318630, --0.697293535834403230, -0.697329374247253720, -0.697365210916780720, -0.697401045842894750, -0.697436879025506440, -0.697472710464525520, -0.697508540159862970, -0.697544368111429060, --0.697580194319134430, -0.697616018782889040, -0.697651841502603730, -0.697687662478188700, -0.697723481709554780, -0.697759299196611950, -0.697795114939270820, -0.697830928937441920, --0.697866741191035980, -0.697902551699962960, -0.697938360464133490, -0.697974167483458090, -0.698009972757847600, -0.698045776287211980, -0.698081578071461760, -0.698117378110508000, --0.698153176404260440, -0.698188972952630050, -0.698224767755527110, -0.698260560812862590, -0.698296352124546330, -0.698332141690489180, -0.698367929510601780, -0.698403715584794750, --0.698439499912978160, -0.698475282495062850, -0.698511063330959360, -0.698546842420578410, -0.698582619763830180, -0.698618395360625310, -0.698654169210874420, -0.698689941314488470, --0.698725711671377430, -0.698761480281452020, -0.698797247144623210, -0.698833012260801080, -0.698868775629896350, -0.698904537251819670, -0.698940297126481980, -0.698976055253793140, --0.699011811633664220, -0.699047566266005840, -0.699083319150728850, -0.699119070287743230, -0.699154819676959920, -0.699190567318289440, -0.699226313211642970, -0.699262057356930480, --0.699297799754062810, -0.699333540402950590, -0.699369279303504790, -0.699405016455635580, -0.699440751859253810, -0.699476485514270330, -0.699512217420595440, -0.699547947578140090, --0.699583675986814700, -0.699619402646530550, -0.699655127557197610, -0.699690850718726720, -0.699726572131028850, -0.699762291794014720, -0.699798009707594650, -0.699833725871679580, --0.699869440286180140, -0.699905152951007410, -0.699940863866071460, -0.699976573031283360, -0.700012280446553840, -0.700047986111793970, -0.700083690026913840, -0.700119392191824400, --0.700155092606436820, -0.700190791270661190, -0.700226488184408580, -0.700262183347589830, -0.700297876760115790, -0.700333568421896870, -0.700369258332844020, -0.700404946492868000, --0.700440632901879860, -0.700476317559789900, -0.700512000466509080, -0.700547681621948360, -0.700583361026018700, -0.700619038678630290, -0.700654714579694420, -0.700690388729121590, --0.700726061126823120, -0.700761731772709280, -0.700797400666691050, -0.700833067808679380, -0.700868733198585340, -0.700904396836319110, -0.700940058721791880, -0.700975718854914830, --0.701011377235598250, -0.701047033863753110, -0.701082688739290470, -0.701118341862121410, -0.701153993232156100, -0.701189642849305850, -0.701225290713481500, -0.701260936824594230, --0.701296581182554330, -0.701332223787273000, -0.701367864638661080, -0.701403503736629740, -0.701439141081089400, -0.701474776671951240, -0.701510410509126100, -0.701546042592525290, --0.701581672922058970, -0.701617301497638570, -0.701652928319175140, -0.701688553386579090, -0.701724176699761730, -0.701759798258633880, -0.701795418063106860, -0.701831036113090940, --0.701866652408497550, -0.701902266949237410, -0.701937879735221930, -0.701973490766361510, -0.702009100042567220, -0.702044707563750260, -0.702080313329821900, -0.702115917340692340, --0.702151519596273090, -0.702187120096474990, -0.702222718841209460, -0.702258315830386780, -0.702293911063918250, -0.702329504541715280, -0.702365096263688260, -0.702400686229748490, --0.702436274439807050, -0.702471860893775220, -0.702507445591563420, -0.702543028533083040, -0.702578609718244930, -0.702614189146960830, -0.702649766819140820, -0.702685342734696410, --0.702720916893538660, -0.702756489295578880, -0.702792059940727580, -0.702827628828896160, -0.702863195959995690, -0.702898761333937470, -0.702934324950632130, -0.702969886809990840, --0.703005446911924900, -0.703041005256345720, -0.703076561843163690, -0.703112116672290230, -0.703147669743636740, -0.703183221057113840, -0.703218770612632940, -0.703254318410104990, --0.703289864449441640, -0.703325408730553270, -0.703360951253351410, -0.703396492017747120, -0.703432031023651930, -0.703467568270976340, -0.703503103759631880, -0.703538637489529610, --0.703574169460581160, -0.703609699672696930, -0.703645228125788340, -0.703680754819766770, -0.703716279754543650, -0.703751802930029480, -0.703787324346135890, -0.703822844002774170, --0.703858361899855070, -0.703893878037290090, -0.703929392414990420, -0.703964905032867570, -0.704000415890832070, -0.704035924988795640, -0.704071432326669360, -0.704106937904364740, --0.704142441721792520, -0.704177943778864220, -0.704213444075491140, -0.704248942611584660, -0.704284439387055540, -0.704319934401815280, -0.704355427655775190, -0.704390919148846880, --0.704426408880940880, -0.704461896851968920, -0.704497383061842620, -0.704532867510472390, -0.704568350197770090, -0.704603831123646880, -0.704639310288014410, -0.704674787690783400, --0.704710263331865370, -0.704745737211171620, -0.704781209328613990, -0.704816679684102890, -0.704852148277550160, -0.704887615108866990, -0.704923080177965230, -0.704958543484755400, --0.704994005029149110, -0.705029464811057880, -0.705064922830393350, -0.705100379087066130, -0.705135833580987970, -0.705171286312070600, -0.705206737280224650, -0.705242186485361850, --0.705277633927393620, -0.705313079606231570, -0.705348523521786560, -0.705383965673970210, -0.705419406062694040, -0.705454844687869560, -0.705490281549407630, -0.705525716647220080, --0.705561149981218220, -0.705596581551313770, -0.705632011357417600, -0.705667439399441320, -0.705702865677296560, -0.705738290190894850, -0.705773712940147120, -0.705809133924965140, --0.705844553145260290, -0.705879970600944430, -0.705915386291928290, -0.705950800218123620, -0.705986212379442370, -0.706021622775795170, -0.706057031407093970, -0.706092438273250190, --0.706127843374175670, -0.706163246709781140, -0.706198648279978580, -0.706234048084679380, -0.706269446123795390, -0.706304842397237450, -0.706340236904917430, -0.706375629646746720, --0.706411020622637280, -0.706446409832500070, -0.706481797276246710, -0.706517182953788960, -0.706552566865038530, -0.706587949009906400, -0.706623329388304300, -0.706658708000144300, --0.706694084845337130, -0.706729459923794880, -0.706764833235428820, -0.706800204780151150, -0.706835574557872490, -0.706870942568505020, -0.706906308811960150, -0.706941673288149830, --0.706977035996984910, -0.707012396938377590, -0.707047756112239130, -0.707083113518481630, -0.707118469157016040, -0.707153823027754310, -0.707189175130607970, -0.707224525465489080, --0.707259874032308500, -0.707295220830978180, -0.707330565861410300, -0.707365909123515490, -0.707401250617206050, -0.707436590342393480, -0.707471928298989640, -0.707507264486905710, --0.707542598906053750, -0.707577931556345190, -0.707613262437692070, -0.707648591550005480, -0.707683918893197480, -0.707719244467179600, -0.707754568271864000, -0.707789890307161660, --0.707825210572984640, -0.707860529069244460, -0.707895845795853410, -0.707931160752722330, -0.707966473939763310, -0.708001785356888180, -0.708037095004008910, -0.708072402881036570, --0.708107708987883220, -0.708143013324460950, -0.708178315890680810, -0.708213616686454880, -0.708248915711694900, -0.708284212966312940, -0.708319508450220180, -0.708354802163328690, --0.708390094105549980, -0.708425384276796580, -0.708460672676979320, -0.708495959306010390, -0.708531244163801530, -0.708566527250264810, -0.708601808565311520, -0.708637088108853730, --0.708672365880803290, -0.708707641881072160, -0.708742916109571630, -0.708778188566213770, -0.708813459250910880, -0.708848728163573920, -0.708883995304115170, -0.708919260672446370, --0.708954524268479820, -0.708989786092126590, -0.709025046143298980, -0.709060304421908590, -0.709095560927867850, -0.709130815661087930, -0.709166068621480910, -0.709201319808958730, --0.709236569223433590, -0.709271816864816770, -0.709307062733020350, -0.709342306827956180, -0.709377549149536660, -0.709412789697672960, -0.709448028472277280, -0.709483265473261790, --0.709518500700537900, -0.709553734154017680, -0.709588965833613190, -0.709624195739236630, -0.709659423870799170, -0.709694650228213210, -0.709729874811390600, -0.709765097620243650, --0.709800318654683520, -0.709835537914622730, -0.709870755399973020, -0.709905971110646790, -0.709941185046555350, -0.709976397207610850, -0.710011607593725390, -0.710046816204811250, --0.710082023040779720, -0.710117228101543210, -0.710152431387013560, -0.710187632897103180, -0.710222832631723370, -0.710258030590786520, -0.710293226774204920, -0.710328421181889880, --0.710363613813753790, -0.710398804669708730, -0.710433993749666870, -0.710469181053539730, -0.710504366581239720, -0.710539550332678790, -0.710574732307769240, -0.710609912506422580, --0.710645090928551100, -0.710680267574066880, -0.710715442442882430, -0.710750615534908920, -0.710785786850059000, -0.710820956388244500, -0.710856124149377930, -0.710891290133370820, --0.710926454340135350, -0.710961616769584140, -0.710996777421628590, -0.711031936296181110, -0.711067093393153770, -0.711102248712458970, -0.711137402254008340, -0.711172554017714060, --0.711207704003488540, -0.711242852211243950, -0.711277998640892030, -0.711313143292345070, -0.711348286165515260, -0.711383427260315000, -0.711418566576655920, -0.711453704114450300, --0.711488839873610560, -0.711523973854048860, -0.711559106055677180, -0.711594236478407580, -0.711629365122152690, -0.711664491986824020, -0.711699617072334200, -0.711734740378595410, --0.711769861905519940, -0.711804981653019640, -0.711840099621006810, -0.711875215809393720, -0.711910330218092910, -0.711945442847016000, -0.711980553696075490, -0.712015662765183470, --0.712050770054252660, -0.712085875563194690, -0.712120979291921970, -0.712156081240346910, -0.712191181408381780, -0.712226279795938550, -0.712261376402929520, -0.712296471229267420, --0.712331564274863770, -0.712366655539631300, -0.712401745023482080, -0.712436832726328850, -0.712471918648083240, -0.712507002788657860, -0.712542085147964910, -0.712577165725917120, --0.712612244522426110, -0.712647321537404400, -0.712682396770764500, -0.712717470222418830, -0.712752541892279210, -0.712787611780258290, -0.712822679886268240, -0.712857746210221800, --0.712892810752030700, -0.712927873511607690, -0.712962934488864830, -0.712997993683715080, -0.713033051096069960, -0.713068106725842200, -0.713103160572944540, -0.713138212637288720, --0.713173262918787240, -0.713208311417352640, -0.713243358132897630, -0.713278403065333850, -0.713313446214574150, -0.713348487580530710, -0.713383527163116480, -0.713418564962243100, --0.713453600977823180, -0.713488635209769350, -0.713523667657994240, -0.713558698322409700, -0.713593727202928350, -0.713628754299462710, -0.713663779611925510, -0.713698803140228490, --0.713733824884284500, -0.713768844844006270, -0.713803863019305540, -0.713838879410095270, -0.713873894016287760, -0.713908906837795840, -0.713943917874531260, -0.713978927126406980, --0.714013934593335400, -0.714048940275229250, -0.714083944172000380, -0.714118946283561760, -0.714153946609825670, -0.714188945150705080, -0.714223941906111830, -0.714258936875958650, --0.714293930060158290, -0.714328921458623260, -0.714363911071265620, -0.714398898897998240, -0.714433884938733940, -0.714468869193384590, -0.714503851661863140, -0.714538832344082000, --0.714573811239954000, -0.714608788349391340, -0.714643763672306640, -0.714678737208612520, -0.714713708958221840, -0.714748678921046650, -0.714783647096999710, -0.714818613485993630, --0.714853578087941370, -0.714888540902754780, -0.714923501930346930, -0.714958461170630330, -0.714993418623517840, -0.715028374288921520, -0.715063328166754220, -0.715098280256928680, --0.715133230559357620, -0.715168179073953250, -0.715203125800628500, -0.715238070739296240, -0.715273013889868410, -0.715307955252257990, -0.715342894826377810, -0.715377832612140610, --0.715412768609458680, -0.715447702818244660, -0.715482635238411380, -0.715517565869871920, -0.715552494712538230, -0.715587421766323280, -0.715622347031139800, -0.715657270506900640, --0.715692192193518100, -0.715727112090905120, -0.715762030198974220, -0.715796946517638700, -0.715831861046810400, -0.715866773786402510, -0.715901684736327980, -0.715936593896499000, --0.715971501266828400, -0.716006406847229160, -0.716041310637614110, -0.716076212637895450, -0.716111112847986450, -0.716146011267799530, -0.716180907897247860, -0.716215802736243630, --0.716250695784700020, -0.716285587042529540, -0.716320476509645370, -0.716355364185959800, -0.716390250071385900, -0.716425134165836200, -0.716460016469224080, -0.716494896981461520, --0.716529775702461790, -0.716564652632137870, -0.716599527770402030, -0.716634401117167470, -0.716669272672346810, -0.716704142435853230, -0.716739010407599130, -0.716773876587497360, --0.716808740975460990, -0.716843603571403090, -0.716878464375235720, -0.716913323386872410, -0.716948180606225670, -0.716983036033208790, -0.717017889667734050, -0.717052741509714540, --0.717087591559063210, -0.717122439815693240, -0.717157286279516800, -0.717192130950447090, -0.717226973828397400, -0.717261814913280120, -0.717296654205008100, -0.717331491703494530, --0.717366327408652580, -0.717401161320394440, -0.717435993438633400, -0.717470823763282420, -0.717505652294254670, -0.717540479031462560, -0.717575303974819170, -0.717610127124237440, --0.717644948479630780, -0.717679768040911490, -0.717714585807992740, -0.717749401780787500, -0.717784215959209050, -0.717819028343169800, -0.717853838932582920, -0.717888647727361500, --0.717923454727418810, -0.717958259932667040, -0.717993063343019710, -0.718027864958390110, -0.718062664778690410, -0.718097462803834130, -0.718132259033734120, -0.718167053468303780, --0.718201846107455520, -0.718236636951102620, -0.718271425999158280, -0.718306213251535430, -0.718340998708146940, -0.718375782368905870, -0.718410564233725400, -0.718445344302518720, --0.718480122575198440, -0.718514899051677870, -0.718549673731870060, -0.718584446615688320, -0.718619217703045150, -0.718653986993853970, -0.718688754488028160, -0.718723520185480140, --0.718758284086123300, -0.718793046189870720, -0.718827806496635910, -0.718862565006331280, -0.718897321718870110, -0.718932076634165810, -0.718966829752131440, -0.719001581072679860, --0.719036330595724250, -0.719071078321177780, -0.719105824248953970, -0.719140568378965230, -0.719175310711125170, -0.719210051245346760, -0.719244789981543620, -0.719279526919628040, --0.719314262059513760, -0.719348995401114080, -0.719383726944341720, -0.719418456689109980, -0.719453184635332030, -0.719487910782921510, -0.719522635131790820, -0.719557357681853580, --0.719592078433022970, -0.719626797385212400, -0.719661514538334600, -0.719696229892303090, -0.719730943447030810, -0.719765655202431630, -0.719800365158417940, -0.719835073314903370, --0.719869779671801100, -0.719904484229024640, -0.719939186986486730, -0.719973887944100890, -0.720008587101780280, -0.720043284459438440, -0.720077980016988200, -0.720112673774342960, --0.720147365731416360, -0.720182055888121010, -0.720216744244370540, -0.720251430800078250, -0.720286115555157650, -0.720320798509521350, -0.720355479663083220, -0.720390159015756320, --0.720424836567454370, -0.720459512318089910, -0.720494186267576770, -0.720528858415828140, -0.720563528762757640, -0.720598197308278010, -0.720632864052302980, -0.720667528994745730, --0.720702192135519890, -0.720736853474538420, -0.720771513011714720, -0.720806170746962520, -0.720840826680194670, -0.720875480811324690, -0.720910133140266090, -0.720944783666932270, --0.720979432391236410, -0.721014079313091800, -0.721048724432412080, -0.721083367749110860, -0.721118009263100880, -0.721152648974295980, -0.721187286882609250, -0.721221922987954840, --0.721256557290245180, -0.721291189789394100, -0.721325820485315130, -0.721360449377921880, -0.721395076467127190, -0.721429701752844820, -0.721464325234988600, -0.721498946913471160, --0.721533566788206350, -0.721568184859107680, -0.721602801126088770, -0.721637415589062580, -0.721672028247942850, -0.721706639102643100, -0.721741248153076940, -0.721775855399157450, --0.721810460840798360, -0.721845064477913080, -0.721879666310415450, -0.721914266338218310, -0.721948864561235530, -0.721983460979380600, -0.722018055592567260, -0.722052648400708490, --0.722087239403718220, -0.722121828601509970, -0.722156415993997050, -0.722191001581092950, -0.722225585362711420, -0.722260167338766190, -0.722294747509170220, -0.722329325873837360, --0.722363902432681230, -0.722398477185615670, -0.722433050132553540, -0.722467621273408910, -0.722502190608095060, -0.722536758136526180, -0.722571323858615000, -0.722605887774275590, --0.722640449883421470, -0.722675010185966470, -0.722709568681823680, -0.722744125370906930, -0.722778680253129860, -0.722813233328406410, -0.722847784596649670, -0.722882334057773360, --0.722916881711691550, -0.722951427558317210, -0.722985971597564390, -0.723020513829346510, -0.723055054253577740, -0.723089592870170940, -0.723124129679040270, -0.723158664680099150, --0.723193197873261750, -0.723227729258441140, -0.723262258835551060, -0.723296786604505360, -0.723331312565218100, -0.723365836717602130, -0.723400359061571630, -0.723434879597040230, --0.723469398323921880, -0.723503915242129870, -0.723538430351577940, -0.723572943652180280, -0.723607455143849940, -0.723641964826500890, -0.723676472700047090, -0.723710978764402270, --0.723745483019479830, -0.723779985465193620, -0.723814486101457490, -0.723848984928185390, -0.723883481945290510, -0.723917977152686910, -0.723952470550288440, -0.723986962138009170, --0.724021451915762060, -0.724055939883461290, -0.724090426041020810, -0.724124910388354470, -0.724159392925375570, -0.724193873651998170, -0.724228352568136450, -0.724262829673703480, --0.724297304968613440, -0.724331778452780180, -0.724366250126117770, -0.724400719988539390, -0.724435188039959320, -0.724469654280291200, -0.724504118709449200, -0.724538581327346610, --0.724573042133897620, -0.724607501129016060, -0.724641958312616020, -0.724676413684610780, -0.724710867244914510, -0.724745318993440970, -0.724779768930104540, -0.724814217054818410, --0.724848663367496650, -0.724883107868053320, -0.724917550556402390, -0.724951991432457370, -0.724986430496132430, -0.725020867747341650, -0.725055303185998420, -0.725089736812016940, --0.725124168625311040, -0.725158598625795130, -0.725193026813382380, -0.725227453187986980, -0.725261877749523000, -0.725296300497904720, -0.725330721433045330, -0.725365140554859120, --0.725399557863260050, -0.725433973358162400, -0.725468387039479470, -0.725502798907125660, -0.725537208961014810, -0.725571617201061230, -0.725606023627178300, -0.725640428239280320, --0.725674831037281590, -0.725709232021095390, -0.725743631190636230, -0.725778028545817970, -0.725812424086554890, -0.725846817812760500, -0.725881209724349000, -0.725915599821234550, --0.725949988103331450, -0.725984374570552980, -0.726018759222813560, -0.726053142060027360, -0.726087523082108440, -0.726121902288970440, -0.726156279680527870, -0.726190655256694460, --0.726225029017384730, -0.726259400962512070, -0.726293771091991000, -0.726328139405735710, -0.726362505903659810, -0.726396870585677700, -0.726431233451703350, -0.726465594501651270, --0.726499953735434860, -0.726534311152968630, -0.726568666754166540, -0.726603020538943100, -0.726637372507211830, -0.726671722658887130, -0.726706070993883180, -0.726740417512114270, --0.726774762213494020, -0.726809105097936840, -0.726843446165357010, -0.726877785415668830, -0.726912122848785810, -0.726946458464622580, -0.726980792263093420, -0.727015124244111970, --0.727049454407592830, -0.727083782753449980, -0.727118109281597920, -0.727152433991950400, -0.727186756884421690, -0.727221077958926100, -0.727255397215378130, -0.727289714653691410, --0.727324030273780340, -0.727358344075559220, -0.727392656058942540, -0.727426966223843950, -0.727461274570177950, -0.727495581097858720, -0.727529885806800890, -0.727564188696917970, --0.727598489768124690, -0.727632789020335120, -0.727667086453463900, -0.727701382067424630, -0.727735675862131840, -0.727769967837500250, -0.727804257993443390, -0.727838546329875990, --0.727872832846712110, -0.727907117543866500, -0.727941400421252770, -0.727975681478785660, -0.728009960716379250, -0.728044238133948250, -0.728078513731406310, -0.728112787508668150, --0.728147059465647950, -0.728181329602260450, -0.728215597918419280, -0.728249864414039160, -0.728284129089034390, -0.728318391943319600, -0.728352652976808510, -0.728386912189415760, --0.728421169581056070, -0.728455425151643080, -0.728489678901091620, -0.728523930829315880, -0.728558180936230810, -0.728592429221749830, -0.728626675685787760, -0.728660920328259020, --0.728695163149078340, -0.728729404148159340, -0.728763643325416990, -0.728797880680765340, -0.728832116214119360, -0.728866349925392900, -0.728900581814500460, -0.728934811881356560, --0.728969040125875930, -0.729003266547972430, -0.729037491147560780, -0.729071713924555720, -0.729105934878871100, -0.729140154010421540, -0.729174371319121660, -0.729208586804886090, --0.729242800467628790, -0.729277012307264490, -0.729311222323707710, -0.729345430516873170, -0.729379636886674730, -0.729413841433027120, -0.729448044155844970, -0.729482245055043000, --0.729516444130535180, -0.729550641382236130, -0.729584836810060590, -0.729619030413923180, -0.729653222193737960, -0.729687412149419680, -0.729721600280882840, -0.729755786588042300, --0.729789971070812000, -0.729824153729106690, -0.729858334562841440, -0.729892513571929970, -0.729926690756287240, -0.729960866115827670, -0.729995039650466420, -0.730029211360117230, --0.730063381244694940, -0.730097549304114190, -0.730131715538289930, -0.730165879947136110, -0.730200042530567470, -0.730234203288498860, -0.730268362220845010, -0.730302519327519880, --0.730336674608438540, -0.730370828063515390, -0.730404979692665600, -0.730439129495803030, -0.730473277472842520, -0.730507423623699250, -0.730541567948287060, -0.730575710446521030, --0.730609851118315670, -0.730643989963585930, -0.730678126982245990, -0.730712262174210700, -0.730746395539394800, -0.730780527077713130, -0.730814656789079970, -0.730848784673409970, --0.730882910730618170, -0.730917034960619330, -0.730951157363327610, -0.730985277938658080, -0.731019396686525270, -0.731053513606844340, -0.731087628699529260, -0.731121741964495090, --0.731155853401656900, -0.731189963010928760, -0.731224070792225730, -0.731258176745462450, -0.731292280870554200, -0.731326383167414830, -0.731360483635959510, -0.731394582276102990, --0.731428679087760330, -0.731462774070845700, -0.731496867225273960, -0.731530958550960290, -0.731565048047819410, -0.731599135715765620, -0.731633221554713890, -0.731667305564579260, --0.731701387745276600, -0.731735468096720190, -0.731769546618825100, -0.731803623311506500, -0.731837698174678470, -0.731871771208256190, -0.731905842412154510, -0.731939911786288590, --0.731973979330572510, -0.732008045044921450, -0.732042108929250370, -0.732076170983474220, -0.732110231207507400, -0.732144289601264990, -0.732178346164661820, -0.732212400897613190, --0.732246453800033170, -0.732280504871837050, -0.732314554112939660, -0.732348601523256200, -0.732382647102700850, -0.732416690851188990, -0.732450732768635370, -0.732484772854955170, --0.732518811110062900, -0.732552847533873400, -0.732586882126302190, -0.732620914887263440, -0.732654945816672450, -0.732688974914444070, -0.732723002180493470, -0.732757027614735160, --0.732791051217084210, -0.732825072987455690, -0.732859092925764790, -0.732893111031925890, -0.732927127305854190, -0.732961141747464630, -0.732995154356672510, -0.733029165133392220, --0.733063174077539070, -0.733097181189027890, -0.733131186467774200, -0.733165189913692170, -0.733199191526697100, -0.733233191306704390, -0.733267189253628440, -0.733301185367384530, --0.733335179647887640, -0.733369172095053030, -0.733403162708795240, -0.733437151489029550, -0.733471138435671020, -0.733505123548634840, -0.733539106827835630, -0.733573088273188680, --0.733607067884608940, -0.733641045662011830, -0.733675021605311840, -0.733708995714424270, -0.733742967989264310, -0.733776938429747120, -0.733810907035787330, -0.733844873807300240, --0.733878838744201230, -0.733912801846404950, -0.733946763113826560, -0.733980722546381250, -0.734014680143984520, -0.734048635906550780, -0.734082589833995440, -0.734116541926233550, --0.734150492183180740, -0.734184440604751300, -0.734218387190860740, -0.734252331941424250, -0.734286274856357220, -0.734320215935574280, -0.734354155178990720, -0.734388092586521820, --0.734422028158082880, -0.734455961893588750, -0.734489893792954600, -0.734523823856095710, -0.734557752082927620, -0.734591678473364710, -0.734625603027322830, -0.734659525744717050, --0.734693446625462210, -0.734727365669473830, -0.734761282876666980, -0.734795198246957160, -0.734829111780259110, -0.734863023476488240, -0.734896933335559940, -0.734930841357389510, --0.734964747541891560, -0.734998651888981950, -0.735032554398575620, -0.735066455070588210, -0.735100353904934330, -0.735134250901529620, -0.735168146060289240, -0.735202039381128820, --0.735235930863962990, -0.735269820508707370, -0.735303708315277470, -0.735337594283587910, -0.735371478413554550, -0.735405360705092330, -0.735439241158117100, -0.735473119772543370, --0.735506996548287000, -0.735540871485263040, -0.735574744583387230, -0.735608615842574200, -0.735642485262739680, -0.735676352843798950, -0.735710218585667650, -0.735744082488260510, --0.735777944551493150, -0.735811804775280850, -0.735845663159539360, -0.735879519704183530, -0.735913374409128850, -0.735947227274290960, -0.735981078299584810, -0.736014927484925810, --0.736048774830229680, -0.736082620335411830, -0.736116464000387110, -0.736150305825071240, -0.736184145809379630, -0.736217983953227910, -0.736251820256530910, -0.736285654719204370, --0.736319487341163810, -0.736353318122324740, -0.736387147062602110, -0.736420974161911550, -0.736454799420168560, -0.736488622837289000, -0.736522444413187480, -0.736556264147779860, --0.736590082040981860, -0.736623898092708340, -0.736657712302875130, -0.736691524671397650, -0.736725335198191610, -0.736759143883171990, -0.736792950726254390, -0.736826755727354570, --0.736860558886388020, -0.736894360203269820, -0.736928159677915810, -0.736961957310241280, -0.736995753100162190, -0.737029547047593490, -0.737063339152450810, -0.737097129414649890, --0.737130917834106340, -0.737164704410735340, -0.737198489144452410, -0.737232272035173390, -0.737266053082813900, -0.737299832287289010, -0.737333609648514580, -0.737367385166406430, --0.737401158840879420, -0.737434930671849620, -0.737468700659232420, -0.737502468802943790, -0.737536235102898670, -0.737569999559013030, -0.737603762171202380, -0.737637522939382560, --0.737671281863468640, -0.737705038943376580, -0.737738794179021880, -0.737772547570320510, -0.737806299117187430, -0.737840048819538690, -0.737873796677289700, -0.737907542690356630, --0.737941286858654340, -0.737975029182098900, -0.738008769660606130, -0.738042508294091130, -0.738076245082469830, -0.738109980025658090, -0.738143713123571520, -0.738177444376125420, --0.738211173783235750, -0.738244901344818130, -0.738278627060788510, -0.738312350931062070, -0.738346072955554660, -0.738379793134182230, -0.738413511466860520, -0.738447227953504700, --0.738480942594030850, -0.738514655388354700, -0.738548366336392090, -0.738582075438058430, -0.738615782693269440, -0.738649488101941310, -0.738683191663989210, -0.738716893379329110, --0.738750593247876840, -0.738784291269548250, -0.738817987444258750, -0.738851681771924170, -0.738885374252460480, -0.738919064885783630, -0.738952753671808790, -0.738986440610452160, --0.739020125701629340, -0.739053808945256520, -0.739087490341248880, -0.739121169889522590, -0.739154847589993280, -0.739188523442577130, -0.739222197447189420, -0.739255869603746230, --0.739289539912163400, -0.739323208372356880, -0.739356874984242190, -0.739390539747735280, -0.739424202662752330, -0.739457863729208520, -0.739491522947020030, -0.739525180316102810, --0.739558835836372830, -0.739592489507745590, -0.739626141330137040, -0.739659791303463150, -0.739693439427640210, -0.739727085702583160, -0.739760730128208530, -0.739794372704432050, --0.739828013431170000, -0.739861652308337450, -0.739895289335850910, -0.739928924513626130, -0.739962557841579270, -0.739996189319625740, -0.740029818947681830, -0.740063446725663600, --0.740097072653486450, -0.740130696731066570, -0.740164318958320020, -0.740197939335162980, -0.740231557861510740, -0.740265174537279690, -0.740298789362385580, -0.740332402336744910, --0.740366013460272860, -0.740399622732885840, -0.740433230154499690, -0.740466835725030800, -0.740500439444394480, -0.740534041312507220, -0.740567641329284650, -0.740601239494643400, --0.740634835808498760, -0.740668430270766900, -0.740702022881364440, -0.740735613640206570, -0.740769202547209570, -0.740802789602289740, -0.740836374805363020, -0.740869958156345270, --0.740903539655152430, -0.740937119301700810, -0.740970697095906790, -0.741004273037685680, -0.741037847126953860, -0.741071419363627410, -0.741104989747622730, -0.741138558278855220, --0.741172124957241380, -0.741205689782697300, -0.741239252755139240, -0.741272813874482630, -0.741306373140644070, -0.741339930553539860, -0.741373486113085620, -0.741407039819197640, --0.741440591671791990, -0.741474141670785180, -0.741507689816092720, -0.741541236107631010, -0.741574780545316230, -0.741608323129064770, -0.741641863858792270, -0.741675402734415120, --0.741708939755849390, -0.741742474923011710, -0.741776008235817350, -0.741809539694183170, -0.741843069298025130, -0.741876597047259610, -0.741910122941802360, -0.741943646981569780, --0.741977169166478050, -0.742010689496443780, -0.742044207971382490, -0.742077724591210570, -0.742111239355844780, -0.742144752265200490, -0.742178263319194340, -0.742211772517742510, --0.742245279860761610, -0.742278785348167160, -0.742312288979875780, -0.742345790755803650, -0.742379290675867280, -0.742412788739982510, -0.742446284948065750, -0.742479779300033170, --0.742513271795801620, -0.742546762435286390, -0.742580251218404430, -0.742613738145071810, -0.742647223215205040, -0.742680706428719970, -0.742714187785533220, -0.742747667285561190, --0.742781144928719610, -0.742814620714925320, -0.742848094644094510, -0.742881566716143580, -0.742915036930988590, -0.742948505288545950, -0.742981971788732040, -0.743015436431463620, --0.743048899216656180, -0.743082360144226460, -0.743115819214090980, -0.743149276426166130, -0.743182731780367870, -0.743216185276612710, -0.743249636914817160, -0.743283086694897730, --0.743316534616770390, -0.743349980680351630, -0.743383424885558310, -0.743416867232306040, -0.743450307720511570, -0.743483746350091400, -0.743517183120962160, -0.743550618033039680, --0.743584051086240590, -0.743617482280481410, -0.743650911615678870, -0.743684339091748690, -0.743717764708607730, -0.743751188466172270, -0.743784610364359170, -0.743818030403084250, --0.743851448582264260, -0.743884864901815710, -0.743918279361655220, -0.743951691961698750, -0.743985102701863020, -0.744018511582064560, -0.744051918602220090, -0.744085323762245570, --0.744118727062057730, -0.744152128501573420, -0.744185528080708480, -0.744218925799379650, -0.744252321657503440, -0.744285715654996900, -0.744319107791775680, -0.744352498067756720, --0.744385886482856530, -0.744419273036991850, -0.744452657730078740, -0.744486040562033930, -0.744519421532774170, -0.744552800642215960, -0.744586177890275590, -0.744619553276869680, --0.744652926801914970, -0.744686298465328190, -0.744719668267025400, -0.744753036206923460, -0.744786402284939200, -0.744819766500988580, -0.744853128854988670, -0.744886489346855860, --0.744919847976507010, -0.744953204743858400, -0.744986559648826760, -0.745019912691328720, -0.745053263871281120, -0.745086613188600140, -0.745119960643202630, -0.745153306235005200, --0.745186649963924810, -0.745219991829877420, -0.745253331832780200, -0.745286669972549440, -0.745320006249102550, -0.745353340662355150, -0.745386673212224520, -0.745420003898627390, --0.745453332721480070, -0.745486659680699380, -0.745519984776202070, -0.745553308007904980, -0.745586629375724400, -0.745619948879577280, -0.745653266519380240, -0.745686582295050360, --0.745719896206503700, -0.745753208253657320, -0.745786518436427960, -0.745819826754732460, -0.745853133208487230, -0.745886437797609100, -0.745919740522014930, -0.745953041381621770, --0.745986340376345590, -0.746019637506103560, -0.746052932770812750, -0.746086226170389330, -0.746119517704750380, -0.746152807373812510, -0.746186095177493120, -0.746219381115708070, --0.746252665188374520, -0.746285947395409320, -0.746319227736729650, -0.746352506212251580, -0.746385782821892270, -0.746419057565568370, -0.746452330443197250, -0.746485601454695000, --0.746518870599978680, -0.746552137878965240, -0.746585403291571750, -0.746618666837714380, -0.746651928517310440, -0.746685188330276640, -0.746718446276530170, -0.746751702355987200, --0.746784956568565140, -0.746818208914180940, -0.746851459392750770, -0.746884708004192150, -0.746917954748421600, -0.746951199625356610, -0.746984442634913260, -0.747017683777008830, --0.747050923051560070, -0.747084160458484470, -0.747117395997698000, -0.747150629669118160, -0.747183861472661690, -0.747217091408245880, -0.747250319475787130, -0.747283545675202500, --0.747316770006408950, -0.747349992469323880, -0.747383213063863460, -0.747416431789944990, -0.747449648647485860, -0.747482863636402150, -0.747516076756611470, -0.747549288008030440, --0.747582497390576470, -0.747615704904166070, -0.747648910548716410, -0.747682114324144440, -0.747715316230367470, -0.747748516267301880, -0.747781714434865070, -0.747814910732973900, --0.747848105161545870, -0.747881297720497160, -0.747914488409745280, -0.747947677229207190, -0.747980864178800160, -0.748014049258440620, -0.748047232468046050, -0.748080413807533650, --0.748113593276819920, -0.748146770875822260, -0.748179946604457520, -0.748213120462643320, -0.748246292450296060, -0.748279462567333020, -0.748312630813671390, -0.748345797189228450, --0.748378961693920600, -0.748412124327665460, -0.748445285090380000, -0.748478443981981600, -0.748511601002386780, -0.748544756151513060, -0.748577909429277380, -0.748611060835597140, --0.748644210370389080, -0.748677358033570490, -0.748710503825058440, -0.748743647744770420, -0.748776789792623080, -0.748809929968533570, -0.748843068272419750, -0.748876204704197910, --0.748909339263785560, -0.748942471951099750, -0.748975602766058120, -0.749008731708577180, -0.749041858778574430, -0.749074983975967060, -0.749108107300672450, -0.749141228752607360, --0.749174348331689170, -0.749207466037835170, -0.749240581870962650, -0.749273695830988460, -0.749306807917830110, -0.749339918131404660, -0.749373026471629730, -0.749406132938421950, --0.749439237531698720, -0.749472340251377770, -0.749505441097375710, -0.749538540069610070, -0.749571637167998130, -0.749604732392457280, -0.749637825742904270, -0.749670917219256720, --0.749704006821431900, -0.749737094549347340, -0.749770180402919870, -0.749803264382066900, -0.749836346486705720, -0.749869426716753940, -0.749902505072128300, -0.749935581552746420, --0.749968656158525590, -0.750001728889383430, -0.750034799745236680, -0.750067868726002950, -0.750100935831599760, -0.750134001061943940, -0.750167064416953130, -0.750200125896544720, --0.750233185500636220, -0.750266243229144480, -0.750299299081987110, -0.750332353059081520, -0.750365405160345330, -0.750398455385695380, -0.750431503735049300, -0.750464550208324370, --0.750497594805438430, -0.750530637526308220, -0.750563678370851360, -0.750596717338985360, -0.750629754430627740, -0.750662789645695550, -0.750695822984106420, -0.750728854445777640, --0.750761884030627050, -0.750794911738571490, -0.750827937569528590, -0.750860961523416190, -0.750893983600151140, -0.750927003799651050, -0.750960022121833440, -0.750993038566616030, --0.751026053133915910, -0.751059065823650450, -0.751092076635737520, -0.751125085570094500, -0.751158092626638570, -0.751191097805287370, -0.751224101105958500, -0.751257102528569700, --0.751290102073037810, -0.751323099739280580, -0.751356095527215610, -0.751389089436760750, -0.751422081467832960, -0.751455071620349860, -0.751488059894229400, -0.751521046289388430, --0.751554030805744900, -0.751587013443216320, -0.751619994201720430, -0.751652973081174290, -0.751685950081495750, -0.751718925202602420, -0.751751898444411930, -0.751784869806841450, --0.751817839289808720, -0.751850806893231470, -0.751883772617027550, -0.751916736461113900, -0.751949698425408260, -0.751982658509828480, -0.752015616714292400, -0.752048573038716860, --0.752081527483019930, -0.752114480047119560, -0.752147430730932600, -0.752180379534377110, -0.752213326457370600, -0.752246271499831140, -0.752279214661675690, -0.752312155942822190, --0.752345095343188270, -0.752378032862692000, -0.752410968501250330, -0.752443902258781220, -0.752476834135202280, -0.752509764130431690, -0.752542692244386300, -0.752575618476984180, --0.752608542828143050, -0.752641465297780870, -0.752674385885814700, -0.752707304592162620, -0.752740221416742460, -0.752773136359471520, -0.752806049420267740, -0.752838960599048760, --0.752871869895732740, -0.752904777310236860, -0.752937682842478970, -0.752970586492376800, -0.753003488259848420, -0.753036388144811110, -0.753069286147182830, -0.753102182266881300, --0.753135076503824720, -0.753167968857930030, -0.753200859329115510, -0.753233747917298800, -0.753266634622397960, -0.753299519444330270, -0.753332402383013800, -0.753365283438366400, --0.753398162610305900, -0.753431039898749820, -0.753463915303616230, -0.753496788824822960, -0.753529660462287530, -0.753562530215928010, -0.753595398085662000, -0.753628264071407930, --0.753661128173082840, -0.753693990390604920, -0.753726850723892010, -0.753759709172862280, -0.753792565737433030, -0.753825420417522320, -0.753858273213048100, -0.753891124123928450, --0.753923973150080750, -0.753956820291423080, -0.753989665547873390, -0.754022508919349850, -0.754055350405769650, -0.754088190007051180, -0.754121027723112400, -0.754153863553870930, --0.754186697499244610, -0.754219529559151610, -0.754252359733510120, -0.754285188022237430, -0.754318014425251810, -0.754350838942471120, -0.754383661573813540, -0.754416482319196670, --0.754449301178538480, -0.754482118151757030, -0.754514933238770610, -0.754547746439496620, -0.754580557753853240, -0.754613367181758420, -0.754646174723130560, -0.754678980377886830, --0.754711784145945750, -0.754744586027225490, -0.754777386021643460, -0.754810184129117930, -0.754842980349567090, -0.754875774682908900, -0.754908567129061070, -0.754941357687941910, --0.754974146359469240, -0.755006933143561490, -0.755039718040136140, -0.755072501049111500, -0.755105282170405620, -0.755138061403936800, -0.755170838749622540, -0.755203614207381250, --0.755236387777130870, -0.755269159458789810, -0.755301929252275570, -0.755334697157506450, -0.755367463174400620, -0.755400227302876480, -0.755432989542851430, -0.755465749894243870, --0.755498508356972300, -0.755531264930954130, -0.755564019616107860, -0.755596772412351460, -0.755629523319603540, -0.755662272337781380, -0.755695019466803620, -0.755727764706588310, --0.755760508057053750, -0.755793249518117770, -0.755825989089698670, -0.755858726771714510, -0.755891462564083900, -0.755924196466724260, -0.755956928479554200, -0.755989658602491790, --0.756022386835455640, -0.756055113178363050, -0.756087837631132850, -0.756120560193683120, -0.756153280865931920, -0.756185999647797420, -0.756218716539197920, -0.756251431540051920, --0.756284144650277050, -0.756316855869791920, -0.756349565198514600, -0.756382272636363600, -0.756414978183256650, -0.756447681839112260, -0.756480383603848620, -0.756513083477384330, --0.756545781459637130, -0.756578477550525320, -0.756611171749967500, -0.756643864057881870, -0.756676554474186360, -0.756709242998799600, -0.756741929631639780, -0.756774614372625050, --0.756807297221673610, -0.756839978178704080, -0.756872657243635060, -0.756905334416383860, -0.756938009696869420, -0.756970683085009810, -0.757003354580723540, -0.757036024183928900, --0.757068691894544290, -0.757101357712487880, -0.757134021637678070, -0.757166683670033150, -0.757199343809471510, -0.757232002055911680, -0.757264658409272260, -0.757297312869470660, --0.757329965436425830, -0.757362616110056620, -0.757395264890280310, -0.757427911777015740, -0.757460556770181540, -0.757493199869695880, -0.757525841075477160, -0.757558480387443890, --0.757591117805514470, -0.757623753329607190, -0.757656386959640660, -0.757689018695532960, -0.757721648537202810, -0.757754276484569170, -0.757786902537549210, -0.757819526696062010, --0.757852148960025950, -0.757884769329360110, -0.757917387803981770, -0.757950004383809990, -0.757982619068763190, -0.758015231858759850, -0.758047842753718390, -0.758080451753557320, --0.758113058858195130, -0.758145664067550350, -0.758178267381541370, -0.758210868800086700, -0.758243468323105410, -0.758276065950515000, -0.758308661682234320, -0.758341255518181990, --0.758373847458277180, -0.758406437502437080, -0.758439025650580970, -0.758471611902627240, -0.758504196258494520, -0.758536778718101210, -0.758569359281366040, -0.758601937948207410, --0.758634514718544040, -0.758667089592294340, -0.758699662569376930, -0.758732233649710870, -0.758764802833213680, -0.758797370119804530, -0.758829935509401920, -0.758862499001925040, --0.758895060597291280, -0.758927620295420050, -0.758960178096229620, -0.758992733999638740, -0.759025288005566120, -0.759057840113930180, -0.759090390324649640, -0.759122938637643240, --0.759155485052829370, -0.759188029570126880, -0.759220572189454270, -0.759253112910730830, -0.759285651733873970, -0.759318188658803070, -0.759350723685437210, -0.759383256813694010, --0.759415788043492630, -0.759448317374751820, -0.759480844807390200, -0.759513370341326380, -0.759545893976479310, -0.759578415712767410, -0.759610935550109390, -0.759643453488424210, --0.759675969527630280, -0.759708483667646430, -0.759740995908391950, -0.759773506249784350, -0.759806014691743140, -0.759838521234186710, -0.759871025877034700, -0.759903528620204490, --0.759936029463615490, -0.759968528407186430, -0.760001025450835920, -0.760033520594483040, -0.760066013838046170, -0.760098505181444390, -0.760130994624596320, -0.760163482167420800, --0.760195967809836450, -0.760228451551762880, -0.760260933393117620, -0.760293413333819950, -0.760325891373788700, -0.760358367512943390, -0.760390841751201530, -0.760423314088482630, --0.760455784524705410, -0.760488253059788730, -0.760520719693651430, -0.760553184426212340, -0.760585647257390310, -0.760618108187104070, -0.760650567215272580, -0.760683024341814780, --0.760715479566649870, -0.760747932889695780, -0.760780384310871800, -0.760812833830096900, -0.760845281447290470, -0.760877727162370230, -0.760910170975255710, -0.760942612885865730, --0.760975052894119260, -0.761007490999935140, -0.761039927203232210, -0.761072361503929650, -0.761104793901946080, -0.761137224397200440, -0.761169652989611810, -0.761202079679099140, --0.761234504465581720, -0.761266927348977500, -0.761299348329205980, -0.761331767406186690, -0.761364184579837340, -0.761396599850077680, -0.761429013216826320, -0.761461424680002550, --0.761493834239525210, -0.761526241895313260, -0.761558647647285650, -0.761591051495361440, -0.761623453439459700, -0.761655853479499270, -0.761688251615399210, -0.761720647847079050, --0.761753042174456720, -0.761785434597451850, -0.761817825115983280, -0.761850213729970860, -0.761882600439332200, -0.761914985243987150, -0.761947368143854550, -0.761979749138853580, --0.762012128228903180, -0.762044505413922550, -0.762076880693830620, -0.762109254068546460, -0.762141625537989140, -0.762173995102077840, -0.762206362760732060, -0.762238728513869760, --0.762271092361410770, -0.762303454303273950, -0.762335814339379140, -0.762368172469644170, -0.762400528693988780, -0.762432883012332030, -0.762465235424593100, -0.762497585930691060, --0.762529934530545180, -0.762562281224074320, -0.762594626011197760, -0.762626968891834790, -0.762659309865904240, -0.762691648933326080, -0.762723986094018150, -0.762756321347900280, --0.762788654694891650, -0.762820986134911890, -0.762853315667879170, -0.762885643293713110, -0.762917969012332890, -0.762950292823657890, -0.762982614727607090, -0.763014934724099760, --0.763047252813054970, -0.763079568994392220, -0.763111883268030480, -0.763144195633889020, -0.763176506091887140, -0.763208814641944460, -0.763241121283979250, -0.763273426017911150, --0.763305728843660100, -0.763338029761144290, -0.763370328770283210, -0.763402625870996390, -0.763434921063202990, -0.763467214346822300, -0.763499505721773610, -0.763531795187976090, --0.763564082745349150, -0.763596368393811950, -0.763628652133283900, -0.763660933963684170, -0.763693213884932610, -0.763725491896947610, -0.763757767999648670, -0.763790042192955430, --0.763822314476787720, -0.763854584851063500, -0.763886853315702940, -0.763919119870625220, -0.763951384515749620, -0.763983647250995660, -0.764015908076282610, -0.764048166991529660, --0.764080423996656320, -0.764112679091581980, -0.764144932276225930, -0.764177183550508120, -0.764209432914346840, -0.764241680367661820, -0.764273925910372800, -0.764306169542399380, --0.764338411263659980, -0.764370651074074650, -0.764402888973562570, -0.764435124962043360, -0.764467359039436300, -0.764499591205660910, -0.764531821460636470, -0.764564049804282500, --0.764596276236518380, -0.764628500757263520, -0.764660723366438090, -0.764692944063960270, -0.764725162849750010, -0.764757379723726820, -0.764789594685810870, -0.764821807735920340, --0.764854018873975190, -0.764886228099895150, -0.764918435413599380, -0.764950640815007630, -0.764982844304039290, -0.765015045880613750, -0.765047245544650640, -0.765079443296069470, --0.765111639134789630, -0.765143833060730640, -0.765176025073812770, -0.765208215173954210, -0.765240403361075020, -0.765272589635095480, -0.765304773995933880, -0.765336956443510410, --0.765369136977744450, -0.765401315598555730, -0.765433492305863660, -0.765465667099587850, -0.765497839979647930, -0.765530010945963400, -0.765562179998453880, -0.765594347137038780, --0.765626512361637920, -0.765658675672171380, -0.765690837068557450, -0.765722996550716520, -0.765755154118568090, -0.765787309772032350, -0.765819463511027700, -0.765851615335474520, --0.765883765245292230, -0.765915913240400540, -0.765948059320718970, -0.765980203486167350, -0.766012345736665210, -0.766044486072132160, -0.766076624492487920, -0.766108760997652240, --0.766140895587545060, -0.766173028262085110, -0.766205159021192680, -0.766237287864787180, -0.766269414792789210, -0.766301539805117060, -0.766333662901691030, -0.766365784082430830, --0.766397903347256330, -0.766430020696086900, -0.766462136128842510, -0.766494249645442660, -0.766526361245807310, -0.766558470929856070, -0.766590578697508570, -0.766622684548685210, --0.766654788483304590, -0.766686890501287020, -0.766718990602552110, -0.766751088787020470, -0.766783185054610410, -0.766815279405242410, -0.766847371838836220, -0.766879462355311680, --0.766911550954588410, -0.766943637636586240, -0.766975722401225020, -0.767007805248424490, -0.767039886178104370, -0.767071965190184610, -0.767104042284584950, -0.767136117461225790, --0.767168190720025620, -0.767200262060905080, -0.767232331483784450, -0.767264398988582450, -0.767296464575219380, -0.767328528243615190, -0.767360589993689720, -0.767392649825362700, --0.767424707738554090, -0.767456763733183720, -0.767488817809171330, -0.767520869966437090, -0.767552920204900510, -0.767584968524481660, -0.767617014925101040, -0.767649059406677270, --0.767681101969130860, -0.767713142612381660, -0.767745181336350170, -0.767777218140955230, -0.767809253026117130, -0.767841285991756050, -0.767873317037791710, -0.767905346164143960, --0.767937373370732980, -0.767969398657478490, -0.768001422024300550, -0.768033443471119020, -0.768065462997853940, -0.768097480604425730, -0.768129496290753220, -0.768161510056757040, --0.768193521902357010, -0.768225531827473770, -0.768257539832026160, -0.768289545915934680, -0.768321550079119290, -0.768353552321500040, -0.768385552642997020, -0.768417551043530040, --0.768449547523019080, -0.768481542081384420, -0.768513534718545890, -0.768545525434423450, -0.768577514228937720, -0.768609501102007760, -0.768641486053553980, -0.768673469083496430, --0.768705450191755850, -0.768737429378251180, -0.768769406642902720, -0.768801381985630860, -0.768833355406355560, -0.768865326904996870, -0.768897296481474870, -0.768929264135709610, --0.768961229867621170, -0.768993193677129590, -0.769025155564155070, -0.769057115528617770, -0.769089073570438100, -0.769121029689535330, -0.769152983885829870, -0.769184936159242550, --0.769216886509692330, -0.769248834937099950, -0.769280781441385340, -0.769312726022468920, -0.769344668680270630, -0.769376609414710640, -0.769408548225709140, -0.769440485113186300, --0.769472420077062290, -0.769504353117257180, -0.769536284233691140, -0.769568213426285010, -0.769600140694957750, -0.769632066039630190, -0.769663989460222410, -0.769695910956655240, --0.769727830528847750, -0.769759748176720660, -0.769791663900194160, -0.769823577699188520, -0.769855489573623930, -0.769887399523420670, -0.769919307548498910, -0.769951213648778830, --0.769983117824180830, -0.770015020074624860, -0.770046920400032090, -0.770078818800321250, -0.770110715275413530, -0.770142609825228970, -0.770174502449688440, -0.770206393148711090, --0.770238281922217770, -0.770270168770128770, -0.770302053692364260, -0.770333936688844760, -0.770365817759490310, -0.770397696904221330, -0.770429574122958090, -0.770461449415621000, --0.770493322782130230, -0.770525194222406730, -0.770557063736369560, -0.770588931323939910, -0.770620796985037830, -0.770652660719584380, -0.770684522527498640, -0.770716382408701660, --0.770748240363113730, -0.770780096390655150, -0.770811950491246400, -0.770843802664807680, -0.770875652911259480, -0.770907501230522210, -0.770939347622516150, -0.770971192087161690, --0.771003034624379910, -0.771034875234089870, -0.771066713916212730, -0.771098550670668680, -0.771130385497379000, -0.771162218396262640, -0.771194049367240790, -0.771225878410233820, --0.771257705525162150, -0.771289530711946170, -0.771321353970506380, -0.771353175300763310, -0.771384994702637220, -0.771416812176048630, -0.771448627720918050, -0.771480441337165870, --0.771512253024713160, -0.771544062783479310, -0.771575870613385170, -0.771607676514351470, -0.771639480486299160, -0.771671282529147520, -0.771703082642817620, -0.771734880827230070, --0.771766677082305290, -0.771798471407963870, -0.771830263804126340, -0.771862054270713080, -0.771893842807644610, -0.771925629414841550, -0.771957414092224510, -0.771989196839714450, --0.772020977657230880, -0.772052756544694740, -0.772084533502026770, -0.772116308529148140, -0.772148081625978030, -0.772179852792437840, -0.772211622028447950, -0.772243389333929000, --0.772275154708801590, -0.772306918152986240, -0.772338679666403680, -0.772370439248974420, -0.772402196900618950, -0.772433952621258140, -0.772465706410812910, -0.772497458269202800, --0.772529208196349180, -0.772560956192172470, -0.772592702256593930, -0.772624446389533090, -0.772656188590911120, -0.772687928860648740, -0.772719667198666470, -0.772751403604885030, --0.772783138079225160, -0.772814870621607360, -0.772846601231952370, -0.772878329910180910, -0.772910056656213710, -0.772941781469971830, -0.772973504351374910, -0.773005225300344320, --0.773036944316800590, -0.773068661400665100, -0.773100376551857480, -0.773132089770298790, -0.773163801055909870, -0.773195510408611560, -0.773227217828324380, -0.773258923314969150, --0.773290626868466720, -0.773322328488737610, -0.773354028175702760, -0.773385725929282790, -0.773417421749398540, -0.773449115635971300, -0.773480807588920680, -0.773512497608167980, --0.773544185693634150, -0.773575871845240350, -0.773607556062906320, -0.773639238346553460, -0.773670918696102380, -0.773702597111474160, -0.773734273592589280, -0.773765948139368830, --0.773797620751733420, -0.773829291429604100, -0.773860960172901400, -0.773892626981546370, -0.773924291855460410, -0.773955954794563030, -0.773987615798775840, -0.774019274868019580, --0.774050932002215750, -0.774082587201283980, -0.774114240465145760, -0.774145891793721840, -0.774177541186933380, -0.774209188644700900, -0.774240834166945560, -0.774272477753587980, --0.774304119404549350, -0.774335759119750390, -0.774367396899112050, -0.774399032742555730, -0.774430666650001380, -0.774462298621370170, -0.774493928656583400, -0.774525556755562230, --0.774557182918226730, -0.774588807144498180, -0.774620429434297650, -0.774652049787545980, -0.774683668204164340, -0.774715284684073360, -0.774746899227194310, -0.774778511833447920, --0.774810122502755270, -0.774841731235037300, -0.774873338030215630, -0.774904942888209990, -0.774936545808942000, -0.774968146792332720, -0.774999745838303560, -0.775031342946774450, --0.775062938117667020, -0.775094531350902340, -0.775126122646401130, -0.775157712004084790, -0.775189299423874050, -0.775220884905690190, -0.775252468449453950, -0.775284050055086720, --0.775315629722509230, -0.775347207451642760, -0.775378783242408720, -0.775410357094727280, -0.775441929008519830, -0.775473498983708210, -0.775505067020212270, -0.775536633117953620, --0.775568197276853440, -0.775599759496832800, -0.775631319777812630, -0.775662878119714240, -0.775694434522458680, -0.775725988985967010, -0.775757541510160410, -0.775789092094959830, --0.775820640740286670, -0.775852187446062440, -0.775883732212207080, -0.775915275038642440, -0.775946815925289690, -0.775978354872070340, -0.776009891878904570, -0.776041426945714100, --0.776072960072420100, -0.776104491258943650, -0.776136020505206030, -0.776167547811128290, -0.776199073176631730, -0.776230596601637400, -0.776262118086066710, -0.776293637629840600, --0.776325155232881040, -0.776356670895107960, -0.776388184616443320, -0.776419696396808080, -0.776451206236124290, -0.776482714134311800, -0.776514220091292560, -0.776545724106987860, --0.776577226181318750, -0.776608726314206630, -0.776640224505572680, -0.776671720755338190, -0.776703215063424320, -0.776734707429752480, -0.776766197854243830, -0.776797686336820340, --0.776829172877401940, -0.776860657475910710, -0.776892140132267820, -0.776923620846395100, -0.776955099618212850, -0.776986576447642690, -0.777018051334606220, -0.777049524279024630, --0.777080995280819200, -0.777112464339911210, -0.777143931456222180, -0.777175396629673280, -0.777206859860185890, -0.777238321147681320, -0.777269780492080950, -0.777301237893306740, --0.777332693351278750, -0.777364146865919150, -0.777395598437149670, -0.777427048064890710, -0.777458495749064120, -0.777489941489591270, -0.777521385286393580, -0.777552827139392330, --0.777584267048509140, -0.777615705013665280, -0.777647141034782050, -0.777678575111781070, -0.777710007244583610, -0.777741437433111080, -0.777772865677285650, -0.777804291977027380, --0.777835716332258450, -0.777867138742900140, -0.777898559208874630, -0.777929977730102200, -0.777961394306504680, -0.777992808938003820, -0.778024221624520780, -0.778055632365977300, --0.778087041162294770, -0.778118448013394580, -0.778149852919198250, -0.778181255879627280, -0.778212656894603280, -0.778244055964048110, -0.778275453087882260, -0.778306848266027700, --0.778338241498406140, -0.778369632784939420, -0.778401022125548180, -0.778432409520154360, -0.778463794968679460, -0.778495178471045100, -0.778526560027172800, -0.778557939636984050, --0.778589317300400600, -0.778620693017343710, -0.778652066787735130, -0.778683438611496360, -0.778714808488549570, -0.778746176418815270, -0.778777542402215420, -0.778808906438671840, --0.778840268528106390, -0.778871628670439800, -0.778902986865594120, -0.778934343113490970, -0.778965697414052080, -0.778997049767198860, -0.779028400172852910, -0.779059748630936080, --0.779091095141369870, -0.779122439704075910, -0.779153782318975810, -0.779185122985991300, -0.779216461705044550, -0.779247798476056070, -0.779279133298948050, -0.779310466173642860, --0.779341797100060910, -0.779373126078124370, -0.779404453107755080, -0.779435778188874770, -0.779467101321404840, -0.779498422505267240, -0.779529741740383590, -0.779561059026675610, --0.779592374364064920, -0.779623687752473260, -0.779654999191822460, -0.779686308682034700, -0.779717616223030600, -0.779748921814732430, -0.779780225457062050, -0.779811527149941620, --0.779842826893291760, -0.779874124687034880, -0.779905420531092690, -0.779936714425386920, -0.779968006369839430, -0.779999296364371930, -0.780030584408906050, -0.780061870503363840, --0.780093154647666930, -0.780124436841737160, -0.780155717085496800, -0.780186995378866600, -0.780218271721768940, -0.780249546114125560, -0.780280818555858850, -0.780312089046889530, --0.780343357587140130, -0.780374624176532250, -0.780405888814987740, -0.780437151502428650, -0.780468412238776500, -0.780499671023953460, -0.780530927857881250, -0.780562182740481610, --0.780593435671676610, -0.780624686651388510, -0.780655935679538170, -0.780687182756048090, -0.780718427880839890, -0.780749671053836300, -0.780780912274957830, -0.780812151544127200, --0.780843388861266250, -0.780874624226296720, -0.780905857639140550, -0.780937089099719930, -0.780968318607956460, -0.780999546163772210, -0.781030771767089130, -0.781061995417829170, --0.781093217115914060, -0.781124436861266650, -0.781155654653807430, -0.781186870493459140, -0.781218084380144280, -0.781249296313783590, -0.781280506294299680, -0.781311714321614500, --0.781342920395650120, -0.781374124516328370, -0.781405326683571210, -0.781436526897300810, -0.781467725157439120, -0.781498921463908090, -0.781530115816629790, -0.781561308215526160, --0.781592498660519830, -0.781623687151531740, -0.781654873688484410, -0.781686058271299890, -0.781717240899900800, -0.781748421574207990, -0.781779600294144170, -0.781810777059631310, --0.781841951870591580, -0.781873124726946920, -0.781904295628619410, -0.781935464575531200, -0.781966631567604380, -0.781997796604760990, -0.782028959686922990, -0.782060120814013220, --0.782091279985952630, -0.782122437202663830, -0.782153592464068900, -0.782184745770090560, -0.782215897120649760, -0.782247046515669230, -0.782278193955071140, -0.782309339438777560, --0.782340482966710550, -0.782371624538792390, -0.782402764154945140, -0.782433901815090980, -0.782465037519152080, -0.782496171267050620, -0.782527303058709320, -0.782558432894049140, --0.782589560772992910, -0.782620686695462700, -0.782651810661381450, -0.782682932670670020, -0.782714052723251230, -0.782745170819047380, -0.782776286957980630, -0.782807401139973160, --0.782838513364947140, -0.782869623632824860, -0.782900731943528490, -0.782931838296980320, -0.782962942693102630, -0.782994045131817470, -0.783025145613047700, -0.783056244136714600, --0.783087340702741000, -0.783118435311049410, -0.783149527961561230, -0.783180618654199300, -0.783211707388885790, -0.783242794165542990, -0.783273878984093170, -0.783304961844458750, --0.783336042746561880, -0.783367121690324960, -0.783398198675670180, -0.783429273702519910, -0.783460346770796350, -0.783491417880422650, -0.783522487031319770, -0.783553554223410660, --0.783584619456617730, -0.783615682730863680, -0.783646744046070040, -0.783677803402159420, -0.783708860799054330, -0.783739916236677050, -0.783770969714949970, -0.783802021233795500, --0.783833070793136020, -0.783864118392893830, -0.783895164032991310, -0.783926207713350980, -0.783957249433895550, -0.783988289194546550, -0.784019326995226810, -0.784050362835858720, --0.784081396716365230, -0.784112428636667750, -0.784143458596689210, -0.784174486596352030, -0.784205512635578690, -0.784236536714291500, -0.784267558832412950, -0.784298578989865440, --0.784329597186571580, -0.784360613422453780, -0.784391627697434310, -0.784422640011436470, -0.784453650364381310, -0.784484658756192220, -0.784515665186791280, -0.784546669656101870, --0.784577672164045170, -0.784608672710544350, -0.784639671295521810, -0.784670667918900060, -0.784701662580601700, -0.784732655280549140, -0.784763646018665000, -0.784794634794871660, --0.784825621609091750, -0.784856606461247890, -0.784887589351262350, -0.784918570279058540, -0.784949549244557620, -0.784980526247682890, -0.785011501288357390, -0.785042474366502650, --0.785073445482041720, -0.785104414634897110, -0.785135381824991430, -0.785166347052247420, -0.785197310316587460, -0.785228271617934180, -0.785259230956210310, -0.785290188331338350, --0.785321143743240910, -0.785352097191840630, -0.785383048677060550, -0.785413998198822410, -0.785444945757049260, -0.785475891351663740, -0.785506834982589000, -0.785537776649746670, --0.785568716353059910, -0.785599654092451250, -0.785630589867843620, -0.785661523679159420, -0.785692455526321390, -0.785723385409252240, -0.785754313327874710, -0.785785239282111300, --0.785816163271884860, -0.785847085297118440, -0.785878005357733890, -0.785908923453654260, -0.785939839584802400, -0.785970753751101370, -0.786001665952473010, -0.786032576188840370, --0.786063484460126420, -0.786094390766253650, -0.786125295107145020, -0.786156197482723030, -0.786187097892910640, -0.786217996337630450, -0.786248892816805320, -0.786279787330357970, --0.786310679878211570, -0.786341570460288080, -0.786372459076510540, -0.786403345726801930, -0.786434230411085510, -0.786465113129282910, -0.786495993881317630, -0.786526872667112300, --0.786557749486589740, -0.786588624339672800, -0.786619497226284330, -0.786650368146347150, -0.786681237099784100, -0.786712104086517930, -0.786742969106471460, -0.786773832159567530, --0.786804693245729550, -0.786835552364879340, -0.786866409516940310, -0.786897264701835740, -0.786928117919487470, -0.786958969169818890, -0.786989818452752950, -0.787020665768212390, --0.787051511116120260, -0.787082354496399290, -0.787113195908972330, -0.787144035353762540, -0.787174872830692650, -0.787205708339685510, -0.787236541880664050, -0.787267373453551910, --0.787298203058270700, -0.787329030694744030, -0.787359856362894740, -0.787390680062646450, -0.787421501793920900, -0.787452321556641470, -0.787483139350731330, -0.787513955176113330, --0.787544769032710420, -0.787575580920445660, -0.787606390839241890, -0.787637198789022160, -0.787668004769709440, -0.787698808781226670, -0.787729610823497460, -0.787760410896443660, --0.787791208999988780, -0.787822005134055980, -0.787852799298568660, -0.787883591493448780, -0.787914381718619940, -0.787945169974005210, -0.787975956259527430, -0.788006740575109890, --0.788037522920675420, -0.788068303296147190, -0.788099081701448160, -0.788129858136501380, -0.788160632601230040, -0.788191405095557630, -0.788222175619406110, -0.788252944172699310, --0.788283710755359970, -0.788314475367312030, -0.788345238008477330, -0.788375998678779500, -0.788406757378141700, -0.788437514106486990, -0.788468268863738440, -0.788499021649819330, --0.788529772464652610, -0.788560521308161460, -0.788591268180268920, -0.788622013080898300, -0.788652756009972760, -0.788683496967415690, -0.788714235953149380, -0.788744972967097560, --0.788775708009183730, -0.788806441079330180, -0.788837172177460520, -0.788867901303497930, -0.788898628457365580, -0.788929353638986640, -0.788960076848284290, -0.788990798085181800, --0.789021517349602240, -0.789052234641469010, -0.789082949960705050, -0.789113663307233870, -0.789144374680978980, -0.789175084081862650, -0.789205791509808520, -0.789236496964740080, --0.789267200446580830, -0.789297901955253070, -0.789328601490680510, -0.789359299052786460, -0.789389994641494170, -0.789420688256726840, -0.789451379898407860, -0.789482069566460390, --0.789512757260807830, -0.789543442981373360, -0.789574126728080250, -0.789604808500852350, -0.789635488299611830, -0.789666166124282640, -0.789696841974788070, -0.789727515851051940, --0.789758187752996440, -0.789788857680545520, -0.789819525633622450, -0.789850191612150530, -0.789880855616053150, -0.789911517645253580, -0.789942177699675230, -0.789972835779241490, --0.790003491883875640, -0.790034146013501080, -0.790064798168041650, -0.790095448347419740, -0.790126096551559190, -0.790156742780383390, -0.790187387033816190, -0.790218029311780090, --0.790248669614198930, -0.790279307940995990, -0.790309944292094890, -0.790340578667418910, -0.790371211066891450, -0.790401841490436020, -0.790432469937975890, -0.790463096409434680, --0.790493720904735690, -0.790524343423802960, -0.790554963966558780, -0.790585582532927210, -0.790616199122831650, -0.790646813736196160, -0.790677426372943140, -0.790708037032996520, --0.790738645716279830, -0.790769252422716450, -0.790799857152230000, -0.790830459904743990, -0.790861060680181690, -0.790891659478466850, -0.790922256299522730, -0.790952851143273070, --0.790983444009641270, -0.791014034898551380, -0.791044623809925910, -0.791075210743688810, -0.791105795699763690, -0.791136378678074630, -0.791166959678544110, -0.791197538701096210, --0.791228115745654440, -0.791258690812142400, -0.791289263900483600, -0.791319835010601660, -0.791350404142420080, -0.791380971295862600, -0.791411536470852610, -0.791442099667313710, --0.791472660885170210, -0.791503220124344490, -0.791533777384760720, -0.791564332666342520, -0.791594885969014060, -0.791625437292697740, -0.791655986637317950, -0.791686534002798090, --0.791717079389062000, -0.791747622796033170, -0.791778164223635230, -0.791808703671791900, -0.791839241140426810, -0.791869776629463670, -0.791900310138826000, -0.791930841668438190, --0.791961371218222740, -0.791991898788103830, -0.792022424378005190, -0.792052947987850970, -0.792083469617563820, -0.792113989267068110, -0.792144506936287350, -0.792175022625145390, --0.792205536333565720, -0.792236048061472300, -0.792266557808788850, -0.792297065575438890, -0.792327571361346350, -0.792358075166434750, -0.792388576990628700, -0.792419076833850490, --0.792449574696024620, -0.792480070577074920, -0.792510564476925470, -0.792541056395499100, -0.792571546332720090, -0.792602034288512280, -0.792632520262799290, -0.792663004255505070, --0.792693486266553340, -0.792723966295867830, -0.792754444343372390, -0.792784920408990960, -0.792815394492647150, -0.792845866594264810, -0.792876336713768450, -0.792906804851080670, --0.792937271006125880, -0.792967735178827900, -0.792998197369111040, -0.793028657576898220, -0.793059115802113860, -0.793089572044681560, -0.793120026304525380, -0.793150478581569170, --0.793180928875736660, -0.793211377186952000, -0.793241823515138720, -0.793272267860220980, -0.793302710222122510, -0.793333150600767920, -0.793363588996079840, -0.793394025407982760, --0.793424459836400640, -0.793454892281257870, -0.793485322742477410, -0.793515751219983630, -0.793546177713700400, -0.793576602223551860, -0.793607024749461650, -0.793637445291353940, --0.793667863849152670, -0.793698280422781680, -0.793728695012165030, -0.793759107617226680, -0.793789518237891010, -0.793819926874081090, -0.793850333525721320, -0.793880738192735750, --0.793911140875048770, -0.793941541572583450, -0.793971940285264300, -0.794002337013015260, -0.794032731755760390, -0.794063124513423760, -0.794093515285929200, -0.794123904073200990, --0.794154290875162870, -0.794184675691739120, -0.794215058522853680, -0.794245439368431170, -0.794275818228394440, -0.794306195102668200, -0.794336569991176410, -0.794366942893843800, --0.794397313810593310, -0.794427682741349450, -0.794458049686036500, -0.794488414644578310, -0.794518777616899150, -0.794549138602923090, -0.794579497602574070, -0.794609854615776490, --0.794640209642454080, -0.794670562682531220, -0.794700913735931990, -0.794731262802581000, -0.794761609882401190, -0.794791954975317520, -0.794822298081254490, -0.794852639200135050, --0.794882978331884040, -0.794913315476425630, -0.794943650633684000, -0.794973983803583200, -0.795004314986047400, -0.795034644181000780, -0.795064971388367630, -0.795095296608072100, --0.795125619840038270, -0.795155941084190300, -0.795186260340453140, -0.795216577608749750, -0.795246892889004850, -0.795277206181142840, -0.795307517485088210, -0.795337826800764370, --0.795368134128095930, -0.795398439467007170, -0.795428742817422260, -0.795459044179265500, -0.795489343552461150, -0.795519640936933390, -0.795549936332606620, -0.795580229739405010, --0.795610521157252730, -0.795640810586074720, -0.795671098025794280, -0.795701383476335900, -0.795731666937624200, -0.795761948409583810, -0.795792227892137990, -0.795822505385211710, --0.795852780888729020, -0.795883054402614420, -0.795913325926792200, -0.795943595461186650, -0.795973863005722150, -0.796004128560322990, -0.796034392124913560, -0.796064653699418030, --0.796094913283761470, -0.796125170877867160, -0.796155426481659820, -0.796185680095063850, -0.796215931718004310, -0.796246181350404480, -0.796276428992189090, -0.796306674643282640, --0.796336918303609530, -0.796367159973094150, -0.796397399651660790, -0.796427637339233940, -0.796457873035738120, -0.796488106741097490, -0.796518338455236560, -0.796548568178079950, --0.796578795909552270, -0.796609021649577250, -0.796639245398079510, -0.796669467154984320, -0.796699686920214870, -0.796729904693696200, -0.796760120475352830, -0.796790334265109030, --0.796820546062889430, -0.796850755868618530, -0.796880963682220720, -0.796911169503620510, -0.796941373332742400, -0.796971575169510780, -0.797001775013850280, -0.797031972865685830, --0.797062168724940960, -0.797092362591540700, -0.797122554465409470, -0.797152744346472430, -0.797182932234652970, -0.797213118129876160, -0.797243302032066610, -0.797273483941148720, --0.797303663857047210, -0.797333841779686470, -0.797364017708991120, -0.797394191644885790, -0.797424363587294960, -0.797454533536143260, -0.797484701491355640, -0.797514867452855820, --0.797545031420568870, -0.797575193394419290, -0.797605353374332250, -0.797635511360231360, -0.797665667352041590, -0.797695821349687750, -0.797725973353094250, -0.797756123362185930, --0.797786271376887180, -0.797816417397122830, -0.797846561422817510, -0.797876703453895610, -0.797906843490282070, -0.797936981531901960, -0.797967117578678890, -0.797997251630537920, --0.798027383687403890, -0.798057513749201860, -0.798087641815855560, -0.798117767887290160, -0.798147891963430390, -0.798178014044200860, -0.798208134129526290, -0.798238252219331420, --0.798268368313540870, -0.798298482412079350, -0.798328594514871700, -0.798358704621842550, -0.798388812732916620, -0.798418918848019190, -0.798449022967073980, -0.798479125090006180, --0.798509225216741060, -0.798539323347202350, -0.798569419481315430, -0.798599513619004830, -0.798629605760195590, -0.798659695904812230, -0.798689784052779680, -0.798719870204022690, --0.798749954358465960, -0.798780036516034350, -0.798810116676652690, -0.798840194840245710, -0.798870271006738800, -0.798900345176055680, -0.798930417348121650, -0.798960487522861530, --0.798990555700200830, -0.799020621880063290, -0.799050686062374060, -0.799080748247058100, -0.799110808434040370, -0.799140866623245460, -0.799170922814598560, -0.799200977008024280, --0.799231029203447570, -0.799261079400793270, -0.799291127599986220, -0.799321173800952020, -0.799351218003614190, -0.799381260207898460, -0.799411300413729430, -0.799441338621032840, --0.799471374829732300, -0.799501409039753310, -0.799531441251020820, -0.799561471463459680, -0.799591499676994940, -0.799621525891551440, -0.799651550107054020, -0.799681572323427850, --0.799711592540597760, -0.799741610758488600, -0.799771626977025970, -0.799801641196133730, -0.799831653415737480, -0.799861663635761940, -0.799891671856132860, -0.799921678076774060, --0.799951682297611040, -0.799981684518568880, -0.800011684739572520, -0.800041682960546900, -0.800071679181417080, -0.800101673402108030, -0.800131665622544790, -0.800161655842652530, --0.800191644062355990, -0.800221630281580330, -0.800251614500251170, -0.800281596718292470, -0.800311576935629710, -0.800341555152188630, -0.800371531367893070, -0.800401505582668650, --0.800431477796440530, -0.800461448009133660, -0.800491416220673210, -0.800521382430984250, -0.800551346639991830, -0.800581308847621020, -0.800611269053796870, -0.800641227258444670, --0.800671183461489360, -0.800701137662856550, -0.800731089862470440, -0.800761040060256610, -0.800790988256140150, -0.800820934450046760, -0.800850878641900520, -0.800880820831627040, --0.800910761019151480, -0.800940699204399140, -0.800970635387294960, -0.801000569567764220, -0.801030501745731980, -0.801060431921123640, -0.801090360093864140, -0.801120286263878660, --0.801150210431093130, -0.801180132595431530, -0.801210052756819560, -0.801239970915182400, -0.801269887070445890, -0.801299801222534190, -0.801329713371372930, -0.801359623516887390, --0.801389531659002840, -0.801419437797644350, -0.801449341932737310, -0.801479244064207010, -0.801509144191978500, -0.801539042315977170, -0.801568938436128200, -0.801598832552357420, --0.801628724664589120, -0.801658614772748910, -0.801688502876762190, -0.801718388976554670, -0.801748273072050770, -0.801778155163176190, -0.801808035249856110, -0.801837913332016040, --0.801867789409581140, -0.801897663482476820, -0.801927535550628230, -0.801957405613960890, -0.801987273672400080, -0.802017139725870960, -0.802047003774299050, -0.802076865817610170, --0.802106725855728620, -0.802136583888580220, -0.802166439916090930, -0.802196293938184920, -0.802226145954788250, -0.802255995965826200, -0.802285843971224160, -0.802315689970907520, --0.802345533964801680, -0.802375375952831930, -0.802405215934923750, -0.802435053911002670, -0.802464889880993740, -0.802494723844822790, -0.802524555802415440, -0.802554385753696200, --0.802584213698591010, -0.802614039637025160, -0.802643863568924920, -0.802673685494214470, -0.802703505412819650, -0.802733323324666290, -0.802763139229679460, -0.802792953127784870, --0.802822765018907810, -0.802852574902973900, -0.802882382779908530, -0.802912188649637200, -0.802941992512085420, -0.802971794367179140, -0.803001594214842960, -0.803031392055002740, --0.803061187887583960, -0.803090981712512810, -0.803120773529713670, -0.803150563339112610, -0.803180351140635130, -0.803210136934206730, -0.803239920719753030, -0.803269702497199530, --0.803299482266471740, -0.803329260027495270, -0.803359035780195630, -0.803388809524498430, -0.803418581260329720, -0.803448350987614020, -0.803478118706277500, -0.803507884416245650, --0.803537648117444660, -0.803567409809798900, -0.803597169493234680, -0.803626927167677580, -0.803656682833053140, -0.803686436489286950, -0.803716188136304740, -0.803745937774032030, --0.803775685402394410, -0.803805431021317630, -0.803835174630727290, -0.803864916230549010, -0.803894655820708960, -0.803924393401131750, -0.803954128971743560, -0.803983862532470560, --0.804013594083237470, -0.804043323623970240, -0.804073051154594820, -0.804102776675036710, -0.804132500185221640, -0.804162221685075340, -0.804191941174523530, -0.804221658653491820, --0.804251374121905950, -0.804281087579691630, -0.804310799026774710, -0.804340508463081250, -0.804370215888535970, -0.804399921303065150, -0.804429624706594510, -0.804459326099050460, --0.804489025480357390, -0.804518722850441900, -0.804548418209229510, -0.804578111556646160, -0.804607802892617460, -0.804637492217069260, -0.804667179529927390, -0.804696864831117460, --0.804726548120565430, -0.804756229398197020, -0.804785908663938620, -0.804815585917714850, -0.804845261159452210, -0.804874934389076310, -0.804904605606513670, -0.804934274811689000, --0.804963942004528590, -0.804993607184958380, -0.805023270352904110, -0.805052931508291600, -0.805082590651046930, -0.805112247781095690, -0.805141902898363740, -0.805171556002777120, --0.805201207094261680, -0.805230856172743700, -0.805260503238148020, -0.805290148290401020, -0.805319791329428770, -0.805349432355157550, -0.805379071367512190, -0.805408708366419090, --0.805438343351804310, -0.805467976323593680, -0.805497607281713050, -0.805527236226088460, -0.805556863156645760, -0.805586488073310900, -0.805616110976009820, -0.805645731864668480, --0.805675350739212700, -0.805704967599569220, -0.805734582445662760, -0.805764195277419830, -0.805793806094766920, -0.805823414897628990, -0.805853021685932420, -0.805882626459603400, --0.805912229218567870, -0.805941829962751650, -0.805971428692080940, -0.806001025406481550, -0.806030620105879780, -0.806060212790201350, -0.806089803459372310, -0.806119392113318840, --0.806148978751967450, -0.806178563375243070, -0.806208145983072220, -0.806237726575381060, -0.806267305152096100, -0.806296881713142400, -0.806326456258446460, -0.806356028787934330, --0.806385599301532200, -0.806415167799166000, -0.806444734280761910, -0.806474298746245990, -0.806503861195544290, -0.806533421628582990, -0.806562980045288150, -0.806592536445586370, --0.806622090829402730, -0.806651643196663830, -0.806681193547295840, -0.806710741881225380, -0.806740288198377510, -0.806769832498678950, -0.806799374782055880, -0.806828915048434350, --0.806858453297740420, -0.806887989529900480, -0.806917523744840490, -0.806947055942486720, -0.806976586122765350, -0.807006114285602430, -0.807035640430924790, -0.807065164558657510, --0.807094686668727410, -0.807124206761060450, -0.807153724835583560, -0.807183240892221930, -0.807212754930902050, -0.807242266951550320, -0.807271776954093020, -0.807301284938456210, --0.807330790904566160, -0.807360294852349170, -0.807389796781731390, -0.807419296692639230, -0.807448794584998740, -0.807478290458736760, -0.807507784313778560, -0.807537276150051000, --0.807566765967480120, -0.807596253765992870, -0.807625739545514530, -0.807655223305971840, -0.807684705047290950, -0.807714184769398490, -0.807743662472220400, -0.807773138155683300, --0.807802611819713250, -0.807832083464236740, -0.807861553089179950, -0.807891020694469390, -0.807920486280031100, -0.807949949845792270, -0.807979411391677950, -0.808008870917615200, --0.808038328423530180, -0.808067783909349970, -0.808097237374999720, -0.808126688820406280, -0.808156138245496260, -0.808185585650195830, -0.808215031034431490, -0.808244474398129520, --0.808273915741216320, -0.808303355063618390, -0.808332792365262120, -0.808362227646073790, -0.808391660905980470, -0.808421092144907430, -0.808450521362781730, -0.808479948559529650, --0.808509373735078250, -0.808538796889352820, -0.808568218022280520, -0.808597637133787630, -0.808627054223800660, -0.808656469292245990, -0.808685882339050250, -0.808715293364139720, --0.808744702367441000, -0.808774109348880500, -0.808803514308384710, -0.808832917245880690, -0.808862318161293840, -0.808891717054551210, -0.808921113925579300, -0.808950508774305080, --0.808979901600654140, -0.809009292404553330, -0.809038681185929360, -0.809068067944708760, -0.809097452680817900, -0.809126835394183400, -0.809156216084731870, -0.809185594752389710, --0.809214971397083650, -0.809244346018740180, -0.809273718617286250, -0.809303089192647600, -0.809332457744751270, -0.809361824273523660, -0.809391188778892160, -0.809420551260782050, --0.809449911719120620, -0.809479270153834360, -0.809508626564849900, -0.809537980952093950, -0.809567333315493020, -0.809596683654973840, -0.809626031970462790, -0.809655378261886830, --0.809684722529172340, -0.809714064772246060, -0.809743404991035030, -0.809772743185465100, -0.809802079355463220, -0.809831413500956220, -0.809860745621871160, -0.809890075718133760, --0.809919403789671200, -0.809948729836410090, -0.809978053858277150, -0.810007375855199110, -0.810036695827102580, -0.810066013773914300, -0.810095329695560970, -0.810124643591969340, --0.810153955463066120, -0.810183265308778600, -0.810212573129032280, -0.810241878923754540, -0.810271182692872240, -0.810300484436312420, -0.810329784154000810, -0.810359081845864800, --0.810388377511831020, -0.810417671151826280, -0.810446962765777430, -0.810476252353611200, -0.810505539915254310, -0.810534825450633600, -0.810564108959675790, -0.810593390442307720, --0.810622669898456660, -0.810651947328048460, -0.810681222731010400, -0.810710496107269200, -0.810739767456752360, -0.810769036779385500, -0.810798304075096120, -0.810827569343810950, --0.810856832585456930, -0.810886093799960680, -0.810915352987249370, -0.810944610147249500, -0.810973865279888240, -0.811003118385092310, -0.811032369462788560, -0.811061618512904370, --0.811090865535365690, -0.811120110530099690, -0.811149353497033540, -0.811178594436094520, -0.811207833347208470, -0.811237070230302890, -0.811266305085304620, -0.811295537912140490, --0.811324768710737660, -0.811353997481022770, -0.811383224222922970, -0.811412448936365100, -0.811441671621276120, -0.811470892277582840, -0.811500110905212460, -0.811529327504092350, --0.811558542074148350, -0.811587754615307970, -0.811616965127498700, -0.811646173610646620, -0.811675380064678990, -0.811704584489522870, -0.811733786885105450, -0.811762987251353430, --0.811792185588193990, -0.811821381895554080, -0.811850576173360760, -0.811879768421540970, -0.811908958640021770, -0.811938146828730110, -0.811967332987593720, -0.811996517116538420, --0.812025699215491730, -0.812054879284380910, -0.812084057323133380, -0.812113233331675180, -0.812142407309933920, -0.812171579257836670, -0.812200749175310380, -0.812229917062282310, --0.812259082918679320, -0.812288246744428790, -0.812317408539457550, -0.812346568303692780, -0.812375726037061650, -0.812404881739491660, -0.812434035410908970, -0.812463187051241210, --0.812492336660415430, -0.812521484238359350, -0.812550629784999030, -0.812579773300262210, -0.812608914784075930, -0.812638054236367370, -0.812667191657063580, -0.812696327046091960, --0.812725460403379340, -0.812754591728853230, -0.812783721022440560, -0.812812848284068630, -0.812841973513665050, -0.812871096711156090, -0.812900217876469270, -0.812929337009532070, --0.812958454110271900, -0.812987569178615140, -0.813016682214489420, -0.813045793217822110, -0.813074902188540170, -0.813104009126571100, -0.813133114031841850, -0.813162216904279920, --0.813191317743812480, -0.813220416550366700, -0.813249513323869850, -0.813278608064249340, -0.813307700771432660, -0.813336791445346320, -0.813365880085918040, -0.813394966693075430, --0.813424051266745000, -0.813453133806854360, -0.813482214313331010, -0.813511292786102010, -0.813540369225094870, -0.813569443630236640, -0.813598516001454940, -0.813627586338676930, --0.813656654641830010, -0.813685720910841350, -0.813714785145638440, -0.813743847346149130, -0.813772907512299580, -0.813801965644017860, -0.813831021741231120, -0.813860075803867430, --0.813889127831852970, -0.813918177825115770, -0.813947225783583030, -0.813976271707182340, -0.814005315595840880, -0.814034357449486160, -0.814063397268045550, -0.814092435051446460, --0.814121470799616280, -0.814150504512482390, -0.814179536189972850, -0.814208565832013840, -0.814237593438533410, -0.814266619009459070, -0.814295642544718650, -0.814324664044238640, --0.814353683507947010, -0.814382700935771140, -0.814411716327638420, -0.814440729683476580, -0.814469741003212790, -0.814498750286774650, -0.814527757534089680, -0.814556762745085370, --0.814585765919689010, -0.814614767057828870, -0.814643766159431240, -0.814672763224424280, -0.814701758252735280, -0.814730751244292510, -0.814759742199022250, -0.814788731116852680, --0.814817717997711300, -0.814846702841525610, -0.814875685648223210, -0.814904666417731520, -0.814933645149978240, -0.814962621844890770, -0.814991596502396830, -0.815020569122423820, --0.815049539704899460, -0.815078508249751700, -0.815107474756907150, -0.815136439226293970, -0.815165401657840240, -0.815194362051472330, -0.815223320407118650, -0.815252276724706680, --0.815281231004163940, -0.815310183245418150, -0.815339133448396920, -0.815368081613027870, -0.815397027739238610, -0.815425971826956750, -0.815454913876110020, -0.815483853886625920, --0.815512791858432730, -0.815541727791457060, -0.815570661685627090, -0.815599593540870420, -0.815628523357115330, -0.815657451134288450, -0.815686376872317820, -0.815715300571131290, --0.815744222230656570, -0.815773141850821280, -0.815802059431553150, -0.815830974972779790, -0.815859888474429030, -0.815888799936428600, -0.815917709358706110, -0.815946616741189960, --0.815975522083806640, -0.816004425386484540, -0.816033326649151400, -0.816062225871735380, -0.816091123054163430, -0.816120018196363590, -0.816148911298263610, -0.816177802359791540, --0.816206691380874870, -0.816235578361441450, -0.816264463301419110, -0.816293346200735570, -0.816322227059318670, -0.816351105877096250, -0.816379982653996580, -0.816408857389946510, --0.816437730084874190, -0.816466600738707580, -0.816495469351374960, -0.816524335922803160, -0.816553200452920570, -0.816582062941654920, -0.816610923388934150, -0.816639781794685990, --0.816668638158838500, -0.816697492481319290, -0.816726344762056410, -0.816755195000977710, -0.816784043198010900, -0.816812889353084160, -0.816841733466125540, -0.816870575537062220, --0.816899415565822350, -0.816928253552334450, -0.816957089496525460, -0.816985923398323770, -0.817014755257657210, -0.817043585074453850, -0.817072412848641410, -0.817101238580148050, --0.817130062268901500, -0.817158883914829830, -0.817187703517860960, -0.817216521077922860, -0.817245336594943360, -0.817274150068851180, -0.817302961499573040, -0.817331770887037460, --0.817360578231172470, -0.817389383531906490, -0.817418186789166670, -0.817446988002881290, -0.817475787172978420, -0.817504584299386220, -0.817533379382032410, -0.817562172420845280, --0.817590963415752660, -0.817619752366682610, -0.817648539273563180, -0.817677324136322440, -0.817706106954888880, -0.817734887729189450, -0.817763666459152990, -0.817792443144707230, --0.817821217785780870, -0.817849990382301000, -0.817878760934196200, -0.817907529441394440, -0.817936295903823880, -0.817965060321412470, -0.817993822694088600, -0.818022583021779990, --0.818051341304415040, -0.818080097541921680, -0.818108851734228090, -0.818137603881262890, -0.818166353982953230, -0.818195102039227630, -0.818223848050014250, -0.818252592015241810, --0.818281333934837370, -0.818310073808729550, -0.818338811636846630, -0.818367547419116550, -0.818396281155467700, -0.818425012845828140, -0.818453742490126030, -0.818482470088289560, --0.818511195640246990, -0.818539919145926390, -0.818568640605255910, -0.818597360018164410, -0.818626077384579040, -0.818654792704428420, -0.818683505977641280, -0.818712217204144890, --0.818740926383868080, -0.818769633516738820, -0.818798338602685470, -0.818827041641636330, -0.818855742633519570, -0.818884441578263570, -0.818913138475796280, -0.818941833326046200, --0.818970526128941610, -0.818999216884410690, -0.819027905592382140, -0.819056592252783380, -0.819085276865543220, -0.819113959430589730, -0.819142639947851970, -0.819171318417256990, --0.819199994838733740, -0.819228669212210600, -0.819257341537615650, -0.819286011814877480, -0.819314680043924160, -0.819343346224684190, -0.819372010357085840, -0.819400672441057520, --0.819429332476527490, -0.819457990463424600, -0.819486646401676230, -0.819515300291211330, -0.819543952131958080, -0.819572601923845510, -0.819601249666800920, -0.819629895360753260, --0.819658539005630790, -0.819687180601361920, -0.819715820147875250, -0.819744457645098960, -0.819773093092961420, -0.819801726491391270, -0.819830357840316770, -0.819858987139666430, --0.819887614389369080, -0.819916239589352110, -0.819944862739544700, -0.819973483839875010, -0.820002102890272200, -0.820030719890663560, -0.820059334840978150, -0.820087947741144460, --0.820116558591090780, -0.820145167390745830, -0.820173774140037890, -0.820202378838895460, -0.820230981487247160, -0.820259582085021370, -0.820288180632146700, -0.820316777128551440, --0.820345371574164870, -0.820373963968914380, -0.820402554312728900, -0.820431142605537620, -0.820459728847267920, -0.820488313037848860, -0.820516895177209050, -0.820545475265276990, --0.820574053301981300, -0.820602629287250470, -0.820631203221013020, -0.820659775103197540, -0.820688344933732660, -0.820716912712546990, -0.820745478439568910, -0.820774042114727710, --0.820802603737950890, -0.820831163309167610, -0.820859720828306380, -0.820888276295296370, -0.820916829710065080, -0.820945381072541780, -0.820973930382655090, -0.821002477640333520, --0.821031022845505660, -0.821059565998100370, -0.821088107098046140, -0.821116646145271580, -0.821145183139705530, -0.821173718081276370, -0.821202250969913510, -0.821230781805544540, --0.821259310588098530, -0.821287837317504320, -0.821316361993691070, -0.821344884616586280, -0.821373405186119340, -0.821401923702218870, -0.821430440164813590, -0.821458954573832220, --0.821487466929203490, -0.821515977230856120, -0.821544485478718720, -0.821572991672720130, -0.821601495812789070, -0.821629997898854820, -0.821658497930845000, -0.821686995908688990, --0.821715491832315510, -0.821743985701653750, -0.821772477516631520, -0.821800967277178110, -0.821829454983222350, -0.821857940634692860, -0.821886424231518590, -0.821914905773628130, --0.821943385260950570, -0.821971862693414490, -0.822000338070948740, -0.822028811393482050, -0.822057282660943470, -0.822085751873262160, -0.822114219030365860, -0.822142684132184160, --0.822171147178646140, -0.822199608169679850, -0.822228067105214460, -0.822256523985179010, -0.822284978809502130, -0.822313431578112870, -0.822341882290939960, -0.822370330947912450, --0.822398777548959070, -0.822427222094008650, -0.822455664582990350, -0.822484105015832800, -0.822512543392465490, -0.822540979712816260, -0.822569413976814710, -0.822597846184389470, --0.822626276335470250, -0.822654704429984780, -0.822683130467862570, -0.822711554449032540, -0.822739976373423550, -0.822768396240964760, -0.822796814051584890, -0.822825229805213000, --0.822853643501778030, -0.822882055141208930, -0.822910464723434650, -0.822938872248384800, -0.822967277715987210, -0.822995681126171500, -0.823024082478866600, -0.823052481774001920, --0.823080879011505510, -0.823109274191306970, -0.823137667313335260, -0.823166058377519330, -0.823194447383788220, -0.823222834332071110, -0.823251219222296830, -0.823279602054394430, --0.823307982828293210, -0.823336361543921870, -0.823364738201210260, -0.823393112800086200, -0.823421485340479430, -0.823449855822318890, -0.823478224245534300, -0.823506590610053490, --0.823534954915806310, -0.823563317162721800, -0.823591677350728910, -0.823620035479756820, -0.823648391549734680, -0.823676745560591560, -0.823705097512256510, -0.823733447404658810, --0.823761795237727410, -0.823790141011391590, -0.823818484725580950, -0.823846826380223550, -0.823875165975249010, -0.823903503510587170, -0.823931838986166070, -0.823960172401915330, --0.823988503757764110, -0.824016833053641710, -0.824045160289477160, -0.824073485465199760, -0.824101808580738670, -0.824130129636022950, -0.824158448630981980, -0.824186765565544930, --0.824215080439640870, -0.824243393253199730, -0.824271704006149460, -0.824300012698420130, -0.824328319329940550, -0.824356623900640790, -0.824384926410449030, -0.824413226859294860, --0.824441525247107570, -0.824469821573816540, -0.824498115839350950, -0.824526408043640080, -0.824554698186613200, -0.824582986268199590, -0.824611272288328420, -0.824639556246929200, --0.824667838143931520, -0.824696117979263790, -0.824724395752855610, -0.824752671464636600, -0.824780945114536370, -0.824809216702483310, -0.824837486228407140, -0.824865753692237360, --0.824894019093903030, -0.824922282433333760, -0.824950543710458840, -0.824978802925207420, -0.825007060077509120, -0.825035315167293120, -0.825063568194488780, -0.825091819159026070, --0.825120068060833380, -0.825148314899840420, -0.825176559675976700, -0.825204802389172040, -0.825233043039354960, -0.825261281626455290, -0.825289518150402300, -0.825317752611125610, --0.825345985008554490, -0.825374215342618460, -0.825402443613246770, -0.825430669820369060, -0.825458893963914700, -0.825487116043813090, -0.825515336059994160, -0.825543554012386440, --0.825571769900919740, -0.825599983725523790, -0.825628195486128200, -0.825656405182661700, -0.825684612815054230, -0.825712818383235180, -0.825741021887134050, -0.825769223326680350, --0.825797422701803670, -0.825825620012433430, -0.825853815258499100, -0.825882008439930200, -0.825910199556656340, -0.825938388608607020, -0.825966575595712180, -0.825994760517900330, --0.826022943375101630, -0.826051124167245580, -0.826079302894262350, -0.826107479556080220, -0.826135654152629350, -0.826163826683839480, -0.826191997149639870, -0.826220165549960360, --0.826248331884730460, -0.826276496153879770, -0.826304658357337800, -0.826332818495034150, -0.826360976566898440, -0.826389132572860840, -0.826417286512849960, -0.826445438386795740, --0.826473588194628020, -0.826501735936276740, -0.826529881611670740, -0.826558025220739960, -0.826586166763414120, -0.826614306239622840, -0.826642443649295840, -0.826670578992362740, --0.826698712268753130, -0.826726843478396760, -0.826754972621223330, -0.826783099697162460, -0.826811224706144320, -0.826839347648097630, -0.826867468522952560, -0.826895587330638840, --0.826923704071086620, -0.826951818744224630, -0.826979931349983160, -0.827008041888291800, -0.827036150359080290, -0.827064256762278460, -0.827092361097816030, -0.827120463365622620, --0.827148563565628160, -0.827176661697762160, -0.827204757761954570, -0.827232851758135660, -0.827260943686234040, -0.827289033546180110, -0.827317121337903470, -0.827345207061334630, --0.827373290716402310, -0.827401372303036680, -0.827429451821167670, -0.827457529270725020, -0.827485604651638560, -0.827513677963838010, -0.827541749207253320, -0.827569818381814310, --0.827597885487450720, -0.827625950524092380, -0.827654013491669230, -0.827682074390111430, -0.827710133219348050, -0.827738189979309260, -0.827766244669925100, -0.827794297291125750, --0.827822347842840140, -0.827850396324998680, -0.827878442737531310, -0.827906487080367740, -0.827934529353438030, -0.827962569556671910, -0.827990607689999440, -0.828018643753350440, --0.828046677746654750, -0.828074709669842420, -0.828102739522843860, -0.828130767305587880, -0.828158793018004990, -0.828186816660025250, -0.828214838231578820, -0.828242857732594870, --0.828270875163003680, -0.828298890522735420, -0.828326903811719810, -0.828354915029887010, -0.828382924177166970, -0.828410931253489520, -0.828438936258784840, -0.828466939192982750, --0.828494940056013430, -0.828522938847807140, -0.828550935568292960, -0.828578930217401590, -0.828606922795062760, -0.828634913301207200, -0.828662901735763850, -0.828690888098663200, --0.828718872389835440, -0.828746854609210380, -0.828774834756718200, -0.828802812832288960, -0.828830788835852710, -0.828858762767339500, -0.828886734626679390, -0.828914704413802330, --0.828942672128639150, -0.828970637771118680, -0.828998601341171650, -0.829026562838728110, -0.829054522263718670, -0.829082479616072510, -0.829110434895720010, -0.829138388102591550, --0.829166339236617090, -0.829194288297726680, -0.829222235285850710, -0.829250180200919010, -0.829278123042861970, -0.829306063811609540, -0.829334002507091990, -0.829361939129239390, --0.829389873677982450, -0.829417806153250340, -0.829445736554973780, -0.829473664883083270, -0.829501591137508210, -0.829529515318179090, -0.829557437425026190, -0.829585357457979790, --0.829613275416969940, -0.829641191301926820, -0.829669105112780800, -0.829697016849461950, -0.829724926511900660, -0.829752834100026980, -0.829780739613771300, -0.829808643053064230, --0.829836544417835050, -0.829864443708014490, -0.829892340923532810, -0.829920236064320750, -0.829948129130307690, -0.829976020121424240, -0.830003909037600800, -0.830031795878767520, --0.830059680644854800, -0.830087563335792810, -0.830115443951511930, -0.830143322491942560, -0.830171198957014740, -0.830199073346658990, -0.830226945660806010, -0.830254815899385320, --0.830282684062327410, -0.830310550149562900, -0.830338414161022390, -0.830366276096635490, -0.830394135956332820, -0.830421993740044770, -0.830449849447701840, -0.830477703079234300, --0.830505554634572430, -0.830533404113646620, -0.830561251516387380, -0.830589096842724970, -0.830616940092589910, -0.830644781265912900, -0.830672620362623460, -0.830700457382652520, --0.830728292325930370, -0.830756125192388060, -0.830783955981954870, -0.830811784694561850, -0.830839611330139280, -0.830867435888617780, -0.830895258369927610, -0.830923078773999400, --0.830950897100763420, -0.830978713350150170, -0.831006527522090140, -0.831034339616513850, -0.831062149633351680, -0.831089957572534680, -0.831117763433992240, -0.831145567217655420, --0.831173368923455060, -0.831201168551320870, -0.831228966101183800, -0.831256761572974350, -0.831284554966622900, -0.831312346282060080, -0.831340135519216370, -0.831367922678022400, --0.831395707758408540, -0.831423490760305530, -0.831451271683643740, -0.831479050528353690, -0.831506827294366650, -0.831534601981611890, -0.831562374590020690, -0.831590145119523560, --0.831617913570051550, -0.831645679941534380, -0.831673444233902880, -0.831701206447087780, -0.831728966581019690, -0.831756724635629220, -0.831784480610846870, -0.831812234506603350, --0.831839986322829180, -0.831867736059455190, -0.831895483716411750, -0.831923229293630050, -0.831950972791039910, -0.831978714208572280, -0.832006453546157880, -0.832034190803727870, --0.832061925981211760, -0.832089659078540930, -0.832117390095646000, -0.832145119032457470, -0.832172845888906280, -0.832200570664922920, -0.832228293360438130, -0.832256013975382510, --0.832283732509687010, -0.832311448963282130, -0.832339163336099030, -0.832366875628067660, -0.832394585839119070, -0.832422293969183990, -0.832450000018193690, -0.832477703986077790, --0.832505405872767780, -0.832533105678194160, -0.832560803402287770, -0.832588499044979450, -0.832616192606199900, -0.832643884085879750, -0.832671573483949930, -0.832699260800341290, --0.832726946034984430, -0.832754629187810070, -0.832782310258749820, -0.832809989247733200, -0.832837666154691680, -0.832865340979556450, -0.832893013722257320, -0.832920684382725710, --0.832948352960892310, -0.832976019456688200, -0.833003683870043870, -0.833031346200890480, -0.833059006449158650, -0.833086664614779320, -0.833114320697683210, -0.833141974697801490, --0.833169626615064660, -0.833197276449404440, -0.833224924200750340, -0.833252569869034070, -0.833280213454186350, -0.833307854956138570, -0.833335494374820680, -0.833363131710163960, --0.833390766962099570, -0.833418400130558120, -0.833446031215470780, -0.833473660216768280, -0.833501287134381650, -0.833528911968241860, -0.833556534718279730, -0.833584155384426320, --0.833611773966612900, -0.833639390464769650, -0.833667004878827940, -0.833694617208718620, -0.833722227454373300, -0.833749835615722020, -0.833777441692696080, -0.833805045685226400, --0.833832647593244270, -0.833860247416680520, -0.833887845155466100, -0.833915440809532060, -0.833943034378809460, -0.833970625863229230, -0.833998215262722440, -0.834025802577220590, --0.834053387806653830, -0.834080970950953460, -0.834108552010050850, -0.834136130983877180, -0.834163707872362710, -0.834191282675439070, -0.834218855393037200, -0.834246426025088140, --0.834273994571523070, -0.834301561032272930, -0.834329125407269000, -0.834356687696442110, -0.834384247899723650, -0.834411806017044460, -0.834439362048335910, -0.834466915993529290, --0.834494467852554990, -0.834522017625344390, -0.834549565311829330, -0.834577110911939870, -0.834604654425607610, -0.834632195852763710, -0.834659735193339360, -0.834687272447265590, --0.834714807614473700, -0.834742340694894840, -0.834769871688460060, -0.834797400595100660, -0.834824927414747680, -0.834852452147332390, -0.834879974792786530, -0.834907495351040140, --0.834935013822025060, -0.834962530205672460, -0.834990044501914050, -0.835017556710680010, -0.835045066831902050, -0.835072574865511560, -0.835100080811439490, -0.835127584669617230, --0.835155086439976050, -0.835182586122447110, -0.835210083716961820, -0.835237579223451210, -0.835265072641846680, -0.835292563972079960, -0.835320053214081320, -0.835347540367782580, --0.835375025433114930, -0.835402508410010290, -0.835429989298398850, -0.835457468098212420, -0.835484944809382400, -0.835512419431839850, -0.835539891965516370, -0.835567362410343240, --0.835594830766251520, -0.835622297033172920, -0.835649761211038400, -0.835677223299779560, -0.835704683299328120, -0.835732141209614590, -0.835759597030570570, -0.835787050762127670, --0.835814502404217510, -0.835841951956770690, -0.835869399419718940, -0.835896844792993750, -0.835924288076526410, -0.835951729270248410, -0.835979168374091030, -0.836006605387985660, --0.836034040311863900, -0.836061473145657040, -0.836088903889296350, -0.836116332542713560, -0.836143759105840380, -0.836171183578607310, -0.836198605960946310, -0.836226026252789190, --0.836253444454066570, -0.836280860564710400, -0.836308274584651960, -0.836335686513822950, -0.836363096352154670, -0.836390504099578600, -0.836417909756026370, -0.836445313321429350, --0.836472714795718940, -0.836500114178826860, -0.836527511470684490, -0.836554906671223790, -0.836582299780375350, -0.836609690798071130, -0.836637079724242730, -0.836664466558821980, --0.836691851301739730, -0.836719233952927800, -0.836746614512317800, -0.836773992979841230, -0.836801369355429810, -0.836828743639014830, -0.836856115830527990, -0.836883485929900920, --0.836910853937065100, -0.836938219851952160, -0.836965583674494140, -0.836992945404621770, -0.837020305042266880, -0.837047662587361410, -0.837075018039837080, -0.837102371399624840, --0.837129722666656640, -0.837157071840864080, -0.837184418922178990, -0.837211763910532760, -0.837239106805857110, -0.837266447608083660, -0.837293786317144130, -0.837321122932970120, --0.837348457455493360, -0.837375789884645890, -0.837403120220358450, -0.837430448462563200, -0.837457774611191860, -0.837485098666176600, -0.837512420627448130, -0.837539740494938510, --0.837567058268579580, -0.837594373948303050, -0.837621687534040540, -0.837648999025723760, -0.837676308423284550, -0.837703615726654640, -0.837730920935765510, -0.837758224050549230, --0.837785525070937400, -0.837812823996862190, -0.837840120828254320, -0.837867415565046290, -0.837894708207170160, -0.837921998754556860, -0.837949287207138460, -0.837976573564846890, --0.838003857827613880, -0.838031139995371150, -0.838058420068050650, -0.838085698045584080, -0.838112973927903290, -0.838140247714940110, -0.838167519406626260, -0.838194789002893570, --0.838222056503674430, -0.838249321908899670, -0.838276585218501570, -0.838303846432411960, -0.838331105550563340, -0.838358362572886430, -0.838385617499313620, -0.838412870329776740, --0.838440121064207730, -0.838467369702538320, -0.838494616244700560, -0.838521860690626290, -0.838549103040247320, -0.838576343293495620, -0.838603581450303000, -0.838630817510601980, --0.838658051474323370, -0.838685283341399690, -0.838712513111762760, -0.838739740785345080, -0.838766966362077590, -0.838794189841892580, -0.838821411224722200, -0.838848630510498180, --0.838875847699152690, -0.838903062790617550, -0.838930275784824710, -0.838957486681706220, -0.838984695481194030, -0.839011902183220080, -0.839039106787716870, -0.839066309294615340, --0.839093509703848110, -0.839120708015347110, -0.839147904229044730, -0.839175098344872250, -0.839202290362761950, -0.839229480282645880, -0.839256668104456200, -0.839283853828124760, --0.839311037453583710, -0.839338218980765110, -0.839365398409601000, -0.839392575740023350, -0.839419750971964200, -0.839446924105355710, -0.839474095140130490, -0.839501264076219390, --0.839528430913555220, -0.839555595652070500, -0.839582758291696150, -0.839609918832365020, -0.839637077274009160, -0.839664233616560510, -0.839691387859951230, -0.839718540004113610, --0.839745690048979480, -0.839772837994481320, -0.839799983840550990, -0.839827127587120640, -0.839854269234122430, -0.839881408781489200, -0.839908546229151790, -0.839935681577043130, --0.839962814825095270, -0.839989945973240730, -0.840017075021410990, -0.840044201969538550, -0.840071326817555470, -0.840098449565394260, -0.840125570212986730, -0.840152688760265390, --0.840179805207162400, -0.840206919553609710, -0.840234031799539820, -0.840261141944884880, -0.840288249989577520, -0.840315355933549110, -0.840342459776732280, -0.840369561519059280, --0.840396661160462850, -0.840423758700874380, -0.840450854140226470, -0.840477947478451390, -0.840505038715481430, -0.840532127851248870, -0.840559214885685970, -0.840586299818725120, --0.840613382650298500, -0.840640463380338380, -0.840667542008777140, -0.840694618535547500, -0.840721692960580860, -0.840748765283809930, -0.840775835505167100, -0.840802903624585210, --0.840829969641995630, -0.840857033557331100, -0.840884095370523890, -0.840911155081506490, -0.840938212690211180, -0.840965268196570470, -0.840992321600516400, -0.841019372901981700, --0.841046422100898420, -0.841073469197199160, -0.841100514190816660, -0.841127557081682520, -0.841154597869729350, -0.841181636554889760, -0.841208673137096460, -0.841235707616281080, --0.841262739992376440, -0.841289770265314930, -0.841316798435029050, -0.841343824501451070, -0.841370848464513600, -0.841397870324149030, -0.841424890080289760, -0.841451907732868270, --0.841478923281816950, -0.841505936727068300, -0.841532948068555390, -0.841559957306209580, -0.841586964439963950, -0.841613969469750870, -0.841640972395503280, -0.841667973217152810, --0.841694971934632390, -0.841721968547874620, -0.841748963056811910, -0.841775955461376730, -0.841802945761501720, -0.841829933957119360, -0.841856920048162150, -0.841883904034562590, --0.841910885916253290, -0.841937865693167200, -0.841964843365236030, -0.841991818932392830, -0.842018792394570000, -0.842045763751700700, -0.842072733003716430, -0.842099700150550360, --0.842126665192135080, -0.842153628128403110, -0.842180588959287160, -0.842207547684719620, -0.842234504304633200, -0.842261458818960640, -0.842288411227634310, -0.842315361530587060, --0.842342309727751810, -0.842369255819060300, -0.842396199804445690, -0.842423141683840580, -0.842450081457178150, -0.842477019124389990, -0.842503954685409280, -0.842530888140168630, --0.842557819488600760, -0.842584748730638380, -0.842611675866214100, -0.842638600895260770, -0.842665523817710760, -0.842692444633497020, -0.842719363342552150, -0.842746279944809440, --0.842773194440200380, -0.842800106828658470, -0.842827017110116320, -0.842853925284506980, -0.842880831351762390, -0.842907735311815730, -0.842934637164599710, -0.842961536910047160, --0.842988434548090800, -0.843015330078663250, -0.843042223501697440, -0.843069114817125990, -0.843096004024881830, -0.843122891124897690, -0.843149776117106290, -0.843176659001440900, --0.843203539777833360, -0.843230418446217040, -0.843257295006524580, -0.843284169458689450, -0.843311041802643380, -0.843337912038319760, -0.843364780165651310, -0.843391646184570850, --0.843418510095011340, -0.843445371896905600, -0.843472231590186470, -0.843499089174786660, -0.843525944650639130, -0.843552798017676690, -0.843579649275832840, -0.843606498425039320, --0.843633345465229610, -0.843660190396336550, -0.843687033218293410, -0.843713873931032250, -0.843740712534486460, -0.843767549028588860, -0.843794383413272290, -0.843821215688469910, --0.843848045854114330, -0.843874873910138820, -0.843901699856476010, -0.843928523693058930, -0.843955345419820650, -0.843982165036694320, -0.844008982543612230, -0.844035797940507650, --0.844062611227313520, -0.844089422403963450, -0.844116231470389280, -0.844143038426524610, -0.844169843272302270, -0.844196646007655320, -0.844223446632516690, -0.844250245146819570, --0.844277041550496770, -0.844303835843481450, -0.844330628025706460, -0.844357418097104850, -0.844384206057610330, -0.844410991907154630, -0.844437775645671570, -0.844464557273094110, --0.844491336789355620, -0.844518114194388380, -0.844544889488125890, -0.844571662670501100, -0.844598433741447160, -0.844625202700897140, -0.844651969548784190, -0.844678734285041250, --0.844705496909601390, -0.844732257422397880, -0.844759015823363770, -0.844785772112432110, -0.844812526289536400, -0.844839278354609040, -0.844866028307583390, -0.844892776148393090, --0.844919521876970500, -0.844946265493249030, -0.844973006997161940, -0.844999746388642280, -0.845026483667623340, -0.845053218834038060, -0.845079951887819810, -0.845106682828901780, --0.845133411657216890, -0.845160138372698540, -0.845186862975279780, -0.845213585464894450, -0.845240305841474580, -0.845267024104954020, -0.845293740255265820, -0.845320454292343810, --0.845347166216120160, -0.845373876026528690, -0.845400583723502350, -0.845427289306974640, -0.845453992776878720, -0.845480694133147860, -0.845507393375715230, -0.845534090504514110, --0.845560785519477780, -0.845587478420539380, -0.845614169207632880, -0.845640857880690430, -0.845667544439645870, -0.845694228884432460, -0.845720911214983940, -0.845747591431232570, --0.845774269533112300, -0.845800945520556400, -0.845827619393498150, -0.845854291151870720, -0.845880960795607710, -0.845907628324642280, -0.845934293738907720, -0.845960957038337400, --0.845987618222864720, -0.846014277292423510, -0.846040934246946040, -0.846067589086366260, -0.846094241810617540, -0.846120892419633730, -0.846147540913347210, -0.846174187291691800, --0.846200831554600910, -0.846227473702007900, -0.846254113733846290, -0.846280751650049350, -0.846307387450550560, -0.846334021135283330, -0.846360652704181040, -0.846387282157177070, --0.846413909494204920, -0.846440534715198420, -0.846467157820090190, -0.846493778808814050, -0.846520397681303830, -0.846547014437492250, -0.846573629077313150, -0.846600241600699910, --0.846626852007586140, -0.846653460297905220, -0.846680066471590660, -0.846706670528575840, -0.846733272468794370, -0.846759872292179750, -0.846786469998665470, -0.846813065588185030, --0.846839659060672380, -0.846866250416060120, -0.846892839654282190, -0.846919426775272210, -0.846946011778964110, -0.846972594665290510, -0.846999175434185460, -0.847025754085582340, --0.847052330619414980, -0.847078905035616780, -0.847105477334121230, -0.847132047514862040, -0.847158615577772720, -0.847185181522786880, -0.847211745349838120, -0.847238307058860380, --0.847264866649786510, -0.847291424122550430, -0.847317979477085760, -0.847344532713326550, -0.847371083831205630, -0.847397632830657050, -0.847424179711614320, -0.847450724474011150, --0.847477267117781150, -0.847503807642857930, -0.847530346049175320, -0.847556882336666820, -0.847583416505266030, -0.847609948554906790, -0.847636478485523040, -0.847663006297047720, --0.847689531989414880, -0.847716055562558140, -0.847742577016411760, -0.847769096350908580, -0.847795613565982540, -0.847822128661567480, -0.847848641637597100, -0.847875152494005140, --0.847901661230725300, -0.847928167847691320, -0.847954672344836790, -0.847981174722095780, -0.848007674979401660, -0.848034173116688490, -0.848060669133890220, -0.848087163030939890, --0.848113654807771680, -0.848140144464319730, -0.848166632000517010, -0.848193117416297770, -0.848219600711595630, -0.848246081886344540, -0.848272560940478200, -0.848299037873930460, --0.848325512686635140, -0.848351985378526070, -0.848378455949536980, -0.848404924399601800, -0.848431390728654260, -0.848457854936628840, -0.848484317023458170, -0.848510776989076730, --0.848537234833418360, -0.848563690556417450, -0.848590144158006820, -0.848616595638120750, -0.848643044996693190, -0.848669492233658060, -0.848695937348949210, -0.848722380342500580, --0.848748821214245890, -0.848775259964119180, -0.848801696592054290, -0.848828131097985270, -0.848854563481846290, -0.848880993743570400, -0.848907421883092090, -0.848933847900345210, --0.848960271795264230, -0.848986693567782110, -0.849013113217833130, -0.849039530745351430, -0.849065946150270980, -0.849092359432525590, -0.849118770592049320, -0.849145179628776110, --0.849171586542640020, -0.849197991333574880, -0.849224394001514840, -0.849250794546394180, -0.849277192968146080, -0.849303589266705130, -0.849329983442005050, -0.849356375493980580, --0.849382765422564630, -0.849409153227691840, -0.849435538909296130, -0.849461922467311560, -0.849488303901672180, -0.849514683212312050, -0.849541060399165220, -0.849567435462165730, --0.849593808401247650, -0.849620179216345140, -0.849646547907392140, -0.849672914474323140, -0.849699278917071420, -0.849725641235571590, -0.849752001429758040, -0.849778359499564040, --0.849804715444924200, -0.849831069265772450, -0.849857420962043200, -0.849883770533670260, -0.849910117980587910, -0.849936463302730320, -0.849962806500031530, -0.849989147572425720, --0.850015486519847040, -0.850041823342229660, -0.850068158039508190, -0.850094490611615900, -0.850120821058487300, -0.850147149380056640, -0.850173475576258660, -0.850199799647026520, --0.850226121592294830, -0.850252441411997850, -0.850278759106069760, -0.850305074674444830, -0.850331388117057110, -0.850357699433840990, -0.850384008624730630, -0.850410315689660190, --0.850436620628564070, -0.850462923441376750, -0.850489224128031740, -0.850515522688463530, -0.850541819122606620, -0.850568113430395620, -0.850594405611763920, -0.850620695666646220, --0.850646983594976700, -0.850673269396689750, -0.850699553071719630, -0.850725834620000620, -0.850752114041467000, -0.850778391336053040, -0.850804666503693240, -0.850830939544321760, --0.850857210457873330, -0.850883479244281430, -0.850909745903480790, -0.850936010435405790, -0.850962272839991370, -0.850988533117170600, -0.851014791266878620, -0.851041047289049610, --0.851067301183618060, -0.851093552950518250, -0.851119802589684450, -0.851146050101051270, -0.851172295484552870, -0.851198538740123740, -0.851224779867698290, -0.851251018867210880, --0.851277255738596470, -0.851303490481788330, -0.851329723096721500, -0.851355953583330940, -0.851382181941549910, -0.851408408171313470, -0.851434632272556000, -0.851460854245211900, --0.851487074089215760, -0.851513291804501860, -0.851539507391004700, -0.851565720848658890, -0.851591932177398700, -0.851618141377158740, -0.851644348447873400, -0.851670553389477610, --0.851696756201904990, -0.851722956885090480, -0.851749155438968560, -0.851775351863474310, -0.851801546158541090, -0.851827738324104080, -0.851853928360097770, -0.851880116266456540, --0.851906302043115020, -0.851932485690007790, -0.851958667207069360, -0.851984846594234240, -0.852011023851437010, -0.852037198978612300, -0.852063371975694930, -0.852089542842618730, --0.852115711579318650, -0.852141878185729280, -0.852168042661785700, -0.852194205007421490, -0.852220365222571830, -0.852246523307171320, -0.852272679261154460, -0.852298833084455860, --0.852324984777010130, -0.852351134338751980, -0.852377281769616020, -0.852403427069536870, -0.852429570238449120, -0.852455711276287940, -0.852481850182987060, -0.852507986958481510, --0.852534121602705920, -0.852560254115595550, -0.852586384497084130, -0.852612512747106700, -0.852638638865597990, -0.852664762852492600, -0.852690884707725470, -0.852717004431231000, --0.852743122022944110, -0.852769237482799310, -0.852795350810731550, -0.852821462006675300, -0.852847571070565410, -0.852873678002337150, -0.852899782801924130, -0.852925885469261620, --0.852951986004285010, -0.852978084406927910, -0.853004180677125580, -0.853030274814812750, -0.853056366819924250, -0.853082456692394910, -0.853108544432159440, -0.853134630039152460, --0.853160713513309020, -0.853186794854563830, -0.853212874062851510, -0.853238951138107100, -0.853265026080265780, -0.853291098889261470, -0.853317169565029340, -0.853343238107504340, --0.853369304516621630, -0.853395368792315260, -0.853421430934520500, -0.853447490943172070, -0.853473548818205030, -0.853499604559553980, -0.853525658167153980, -0.853551709640939850, --0.853577758980846420, -0.853603806186808640, -0.853629851258761340, -0.853655894196639790, -0.853681935000378140, -0.853707973669911580, -0.853734010205175140, -0.853760044606104110, --0.853786076872632530, -0.853812107004695790, -0.853838135002228720, -0.853864160865166370, -0.853890184593443570, -0.853916206186995260, -0.853942225645756500, -0.853968242969662230, --0.853994258158647270, -0.854020271212646680, -0.854046282131595840, -0.854072290915428910, -0.854098297564081180, -0.854124302077487800, -0.854150304455584040, -0.854176304698304080, --0.854202302805583400, -0.854228298777356950, -0.854254292613559670, -0.854280284314126730, -0.854306273878993160, -0.854332261308093810, -0.854358246601363720, -0.854384229758738180, --0.854410210780152000, -0.854436189665540250, -0.854462166414838520, -0.854488141027980990, -0.854514113504903030, -0.854540083845540250, -0.854566052049826830, -0.854592018117698250, --0.854617982049089560, -0.854643943843936050, -0.854669903502172530, -0.854695861023734400, -0.854721816408556600, -0.854747769656574170, -0.854773720767722400, -0.854799669741936220, --0.854825616579151020, -0.854851561279302170, -0.854877503842323860, -0.854903444268151900, -0.854929382556721350, -0.854955318707967700, -0.854981252721825350, -0.855007184598229890, --0.855033114337116480, -0.855059041938420190, -0.855084967402076400, -0.855110890728020160, -0.855136811916186730, -0.855162730966511190, -0.855188647878928900, -0.855214562653374920, --0.855240475289784970, -0.855266385788093440, -0.855292294148235930, -0.855318200370147720, -0.855344104453764410, -0.855370006399020390, -0.855395906205851380, -0.855421803874192640, --0.855447699403979360, -0.855473592795146790, -0.855499484047630320, -0.855525373161365010, -0.855551260136286350, -0.855577144972329510, -0.855603027669429860, -0.855628908227523130, --0.855654786646543600, -0.855680662926427080, -0.855706537067108970, -0.855732409068524990, -0.855758278930609410, -0.855784146653298270, -0.855810012236526640, -0.855835875680230120, --0.855861736984343760, -0.855887596148803160, -0.855913453173543500, -0.855939308058500270, -0.855965160803608740, -0.855991011408804290, -0.856016859874022430, -0.856042706199198760, --0.856068550384267880, -0.856094392429165630, -0.856120232333827950, -0.856146070098189100, -0.856171905722185160, -0.856197739205751370, -0.856223570548823250, -0.856249399751336290, --0.856275226813225760, -0.856301051734427170, -0.856326874514875990, -0.856352695154507630, -0.856378513653257460, -0.856404330011061090, -0.856430144227854240, -0.856455956303571740, --0.856481766238149200, -0.856507574031522330, -0.856533379683626970, -0.856559183194397610, -0.856584984563770410, -0.856610783791680650, -0.856636580878064050, -0.856662375822855870, --0.856688168625991840, -0.856713959287407350, -0.856739747807037990, -0.856765534184819270, -0.856791318420686680, -0.856817100514576270, -0.856842880466422650, -0.856868658276161770, --0.856894433943729330, -0.856920207469061280, -0.856945978852092230, -0.856971748092758110, -0.856997515190994760, -0.857023280146737560, -0.857049042959922240, -0.857074803630484270, --0.857100562158359280, -0.857126318543482870, -0.857152072785790640, -0.857177824885218320, -0.857203574841701840, -0.857229322655175930, -0.857255068325576740, -0.857280811852839890, --0.857306553236901410, -0.857332292477696160, -0.857358029575160160, -0.857383764529229150, -0.857409497339838620, -0.857435228006924510, -0.857460956530422200, -0.857486682910267530, --0.857512407146396090, -0.857538129238743730, -0.857563849187245930, -0.857589566991839080, -0.857615282652457790, -0.857640996169038330, -0.857666707541516420, -0.857692416769828100, --0.857718123853908330, -0.857743828793693260, -0.857769531589118620, -0.857795232240120110, -0.857820930746633570, -0.857846627108594720, -0.857872321325939160, -0.857898013398602940, --0.857923703326521680, -0.857949391109631090, -0.857975076747867100, -0.858000760241165780, -0.858026441589462170, -0.858052120792692440, -0.858077797850792410, -0.858103472763698360, --0.858129145531345230, -0.858154816153669180, -0.858180484630606030, -0.858206150962091740, -0.858231815148062020, -0.858257477188452800, -0.858283137083199920, -0.858308794832239100, --0.858334450435506380, -0.858360103892937490, -0.858385755204468800, -0.858411404370035270, -0.858437051389573270, -0.858462696263018630, -0.858488338990307630, -0.858513979571375430, --0.858539618006158190, -0.858565254294591960, -0.858590888436612580, -0.858616520432155970, -0.858642150281158090, -0.858667777983554870, -0.858693403539282140, -0.858719026948275840, --0.858744648210472140, -0.858770267325807080, -0.858795884294216050, -0.858821499115635210, -0.858847111790000730, -0.858872722317248870, -0.858898330697314690, -0.858923936930134800, --0.858949541015645020, -0.858975142953781300, -0.859000742744479910, -0.859026340387676560, -0.859051935883307300, -0.859077529231308310, -0.859103120431615410, -0.859128709484164750, --0.859154296388892740, -0.859179881145734510, -0.859205463754626700, -0.859231044215505110, -0.859256622528306370, -0.859282198692965740, -0.859307772709419490, -0.859333344577603910, --0.859358914297454810, -0.859384481868908590, -0.859410047291901070, -0.859435610566368520, -0.859461171692246890, -0.859486730669472340, -0.859512287497980920, -0.859537842177708790, --0.859563394708592550, -0.859588945090567380, -0.859614493323569760, -0.859640039407535970, -0.859665583342402620, -0.859691125128104750, -0.859716664764579090, -0.859742202251761790, --0.859767737589588910, -0.859793270777996720, -0.859818801816921390, -0.859844330706299060, -0.859869857446065920, -0.859895382036158120, -0.859920904476511820, -0.859946424767063730, --0.859971942907749140, -0.859997458898504650, -0.860022972739266530, -0.860048484429971500, -0.860073993970554730, -0.860099501360953030, -0.860125006601102580, -0.860150509690939540, --0.860176010630400280, -0.860201509419420970, -0.860227006057937890, -0.860252500545887310, -0.860277992883205500, -0.860303483069828620, -0.860328971105693620, -0.860354456990735650, --0.860379940724891550, -0.860405422308097580, -0.860430901740290580, -0.860456379021405810, -0.860481854151380120, -0.860507327130149770, -0.860532797957651140, -0.860558266633820510, --0.860583733158594160, -0.860609197531908450, -0.860634659753699900, -0.860660119823904560, -0.860685577742459020, -0.860711033509299890, -0.860736487124362790, -0.860761938587584540, --0.860787387898901300, -0.860812835058250130, -0.860838280065566400, -0.860863722920786940, -0.860889163623848150, -0.860914602174686520, -0.860940038573238420, -0.860965472819440140, --0.860990904913228160, -0.861016334854538990, -0.861041762643309010, -0.861067188279474590, -0.861092611762972140, -0.861118033093738690, -0.861143452271709630, -0.861168869296822010, --0.861194284169012670, -0.861219696888217090, -0.861245107454372330, -0.861270515867414770, -0.861295922127280900, -0.861321326233907340, -0.861346728187230350, -0.861372127987186540, --0.861397525633712520, -0.861422921126744570, -0.861448314466219390, -0.861473705652073370, -0.861499094684243570, -0.861524481562665590, -0.861549866287276480, -0.861575248858012510, --0.861600629274811070, -0.861626007537607430, -0.861651383646338860, -0.861676757600941870, -0.861702129401352930, -0.861727499047508670, -0.861752866539345690, -0.861778231876800580, --0.861803595059809750, -0.861828956088310120, -0.861854314962237970, -0.861879671681530460, -0.861905026246123420, -0.861930378655953790, -0.861955728910958170, -0.861981077011073740, --0.862006422956236080, -0.862031766746382490, -0.862057108381449330, -0.862082447861373560, -0.862107785186091550, -0.862133120355540130, -0.862158453369655910, -0.862183784228375490, --0.862209112931635600, -0.862234439479373060, -0.862259763871524810, -0.862285086108026680, -0.862310406188815830, -0.862335724113828970, -0.862361039883003280, -0.862386353496274570, --0.862411664953579900, -0.862436974254856100, -0.862462281400039890, -0.862487586389067970, -0.862512889221876970, -0.862538189898403920, -0.862563488418585320, -0.862588784782358010, --0.862614078989658690, -0.862639371040424210, -0.862664660934591710, -0.862689948672097140, -0.862715234252877770, -0.862740517676870660, -0.862765798944011840, -0.862791078054238600, --0.862816355007487550, -0.862841629803695720, -0.862866902442799730, -0.862892172924736520, -0.862917441249442810, -0.862942707416855640, -0.862967971426911620, -0.862993233279547580, --0.863018492974700570, -0.863043750512307750, -0.863069005892305170, -0.863094259114630000, -0.863119510179219170, -0.863144759086010070, -0.863170005834938640, -0.863195250425942140, --0.863220492858957520, -0.863245733133921610, -0.863270971250771460, -0.863296207209443890, -0.863321441009875730, -0.863346672652004040, -0.863371902135765650, -0.863397129461097480, --0.863422354627936930, -0.863447577636220040, -0.863472798485884210, -0.863498017176866470, -0.863523233709104000, -0.863548448082533060, -0.863573660297091040, -0.863598870352714760, --0.863624078249341400, -0.863649283986907880, -0.863674487565351030, -0.863699688984608030, -0.863724888244615910, -0.863750085345311390, -0.863775280286631750, -0.863800473068514370, --0.863825663690895310, -0.863850852153712050, -0.863876038456901750, -0.863901222600401810, -0.863926404584148270, -0.863951584408078840, -0.863976762072130370, -0.864001937576240000, --0.864027110920344790, -0.864052282104381790, -0.864077451128288150, -0.864102617992000830, -0.864127782695456980, -0.864152945238593650, -0.864178105621348000, -0.864203263843657530, --0.864228419905458400, -0.864253573806688210, -0.864278725547284580, -0.864303875127183760, -0.864329022546323160, -0.864354167804640030, -0.864379310902071430, -0.864404451838554630, --0.864429590614026690, -0.864454727228424760, -0.864479861681686000, -0.864504993973747580, -0.864530124104546660, -0.864555252074020400, -0.864580377882106510, -0.864605501528741270, --0.864630623013862290, -0.864655742337406720, -0.864680859499312170, -0.864705974499515030, -0.864731087337953010, -0.864756198014563270, -0.864781306529283090, -0.864806412882049620, --0.864831517072800040, -0.864856619101471710, -0.864881718968001810, -0.864906816672327610, -0.864931912214386480, -0.864957005594115810, -0.864982096811452330, -0.865007185866333630, --0.865032272758696870, -0.865057357488479890, -0.865082440055619180, -0.865107520460052240, -0.865132598701716550, -0.865157674780549390, -0.865182748696488040, -0.865207820449469760, --0.865232890039431930, -0.865257957466311960, -0.865283022730047090, -0.865308085830574610, -0.865333146767832350, -0.865358205541756800, -0.865383262152285780, -0.865408316599356460, --0.865433368882906890, -0.865458419002873570, -0.865483466959194090, -0.865508512751805850, -0.865533556380646440, -0.865558597845653140, -0.865583637146763340, -0.865608674283914410, --0.865633709257043860, -0.865658742066088950, -0.865683772710987290, -0.865708801191676150, -0.865733827508093470, -0.865758851660175740, -0.865783873647860800, -0.865808893471086800, --0.865833911129790020, -0.865858926623908510, -0.865883939953379640, -0.865908951118140920, -0.865933960118129840, -0.865958966953283780, -0.865983971623540460, -0.866008974128837150, --0.866033974469111350, -0.866058972644300650, -0.866083968654342560, -0.866108962499174910, -0.866133954178734400, -0.866158943692959090, -0.866183931041786370, -0.866208916225154280, --0.866233899242999540, -0.866258880095259980, -0.866283858781873200, -0.866308835302776800, -0.866333809657908290, -0.866358781847205270, -0.866383751870605230, -0.866408719728045900, --0.866433685419464750, -0.866458648944799400, -0.866483610303987790, -0.866508569496966750, -0.866533526523674320, -0.866558481384048120, -0.866583434078026070, -0.866608384605545010, --0.866633332966542990, -0.866658279160957720, -0.866683223188726700, -0.866708165049787540, -0.866733104744078050, -0.866758042271535860, -0.866782977632098440, -0.866807910825703630, --0.866832841852289040, -0.866857770711792820, -0.866882697404151690, -0.866907621929303820, -0.866932544287186910, -0.866957464477739030, -0.866982382500897100, -0.867007298356599180, --0.867032212044783090, -0.867057123565386330, -0.867082032918346960, -0.867106940103602340, -0.867131845121090430, -0.867156747970748930, -0.867181648652515570, -0.867206547166328060, --0.867231443512124110, -0.867256337689842120, -0.867281229699418790, -0.867306119540792400, -0.867331007213901110, -0.867355892718681850, -0.867380776055072910, -0.867405657223011990, --0.867430536222436930, -0.867455413053285550, -0.867480287715495680, -0.867505160209005030, -0.867530030533751550, -0.867554898689672950, -0.867579764676707050, -0.867604628494791810, --0.867629490143865480, -0.867654349623864900, -0.867679206934728440, -0.867704062076393940, -0.867728915048799790, -0.867753765851882910, -0.867778614485581690, -0.867803460949833850, --0.867828305244577320, -0.867853147369750060, -0.867877987325289980, -0.867902825111134810, -0.867927660727222720, -0.867952494173491410, -0.867977325449878820, -0.868002154556323460, --0.868026981492762250, -0.868051806259133470, -0.868076628855375290, -0.868101449281425960, -0.868126267537222550, -0.868151083622703550, -0.868175897537806770, -0.868200709282470170, --0.868225518856631910, -0.868250326260229800, -0.868275131493201900, -0.868299934555486150, -0.868324735447020600, -0.868349534167743190, -0.868374330717592400, -0.868399125096505300, --0.868423917304420480, -0.868448707341275770, -0.868473495207009780, -0.868498280901559670, -0.868523064424863710, -0.868547845776860170, -0.868572624957486990, -0.868597401966682340, --0.868622176804384140, -0.868646949470530450, -0.868671719965059430, -0.868696488287909020, -0.868721254439017490, -0.868746018418322770, -0.868770780225763480, -0.868795539861276780, --0.868820297324801260, -0.868845052616275430, -0.868869805735636550, -0.868894556682823120, -0.868919305457773290, -0.868944052060425240, -0.868968796490717010, -0.868993538748586760, --0.869018278833972760, -0.869043016746813060, -0.869067752487045710, -0.869092486054609090, -0.869117217449441150, -0.869141946671480700, -0.869166673720664920, -0.869191398596932400, --0.869216121300221410, -0.869240841830470680, -0.869265560187617250, -0.869290276371599950, -0.869314990382357040, -0.869339702219826590, -0.869364411883946860, -0.869389119374656130, --0.869413824691892660, -0.869438527835594500, -0.869463228805700150, -0.869487927602147660, -0.869512624224875850, -0.869537318673822000, -0.869562010948924820, -0.869586701050122590, --0.869611388977354130, -0.869636074730556710, -0.869660758309669160, -0.869685439714629640, -0.869710118945376530, -0.869734796001848220, -0.869759470883982870, -0.869784143591718740, --0.869808814124994330, -0.869833482483747920, -0.869858148667917770, -0.869882812677442720, -0.869907474512260140, -0.869932134172308970, -0.869956791657527370, -0.869981446967854290, --0.870006100103227100, -0.870030751063584630, -0.870055399848865370, -0.870080046459007610, -0.870104690893949710, -0.870129333153630060, -0.870153973237987040, -0.870178611146959160, --0.870203246880484780, -0.870227880438502190, -0.870252511820949980, -0.870277141027766880, -0.870301768058890480, -0.870326392914259730, -0.870351015593813450, -0.870375636097489020, --0.870400254425225730, -0.870424870576961610, -0.870449484552635380, -0.870474096352185530, -0.870498705975550350, -0.870523313422668420, -0.870547918693478140, -0.870572521787918220, --0.870597122705926820, -0.870621721447442760, -0.870646318012404770, -0.870670912400750560, -0.870695504612419070, -0.870720094647348790, -0.870744682505478760, -0.870769268186746490, --0.870793851691091140, -0.870818433018451190, -0.870843012168765030, -0.870867589141971490, -0.870892163938008830, -0.870916736556815900, -0.870941306998331060, -0.870965875262492920, --0.870990441349240090, -0.871015005258511720, -0.871039566990245320, -0.871064126544379920, -0.871088683920854370, -0.871113239119607360, -0.871137792140576960, -0.871162342983702100, --0.871186891648921270, -0.871211438136173190, -0.871235982445396570, -0.871260524576530030, -0.871285064529512270, -0.871309602304281670, -0.871334137900777070, -0.871358671318937290, --0.871383202558701160, -0.871407731620006510, -0.871432258502792710, -0.871456783206998150, -0.871481305732562110, -0.871505826079422290, -0.871530344247517960, -0.871554860236787740, --0.871579374047170450, -0.871603885678604700, -0.871628395131029190, -0.871652902404382760, -0.871677407498604010, -0.871701910413631760, -0.871726411149404750, -0.871750909705862110, --0.871775406082941800, -0.871799900280582960, -0.871824392298724330, -0.871848882137305160, -0.871873369796263400, -0.871897855275538200, -0.871922338575068400, -0.871946819694792710, --0.871971298634649950, -0.871995775394579060, -0.872020249974518660, -0.872044722374407550, -0.872069192594184690, -0.872093660633788900, -0.872118126493158900, -0.872142590172234060, --0.872167051670952320, -0.872191510989252850, -0.872215968127074690, -0.872240423084357120, -0.872264875861037960, -0.872289326457056590, -0.872313774872351950, -0.872338221106862880, --0.872362665160528180, -0.872387107033286920, -0.872411546725077810, -0.872435984235839900, -0.872460419565512010, -0.872484852714032980, -0.872509283681342400, -0.872533712467378100, --0.872558139072079460, -0.872582563495385540, -0.872606985737235720, -0.872631405797567930, -0.872655823676321660, -0.872680239373435750, -0.872704652888849240, -0.872729064222501180, --0.872753473374330400, -0.872777880344276060, -0.872802285132276870, -0.872826687738271990, -0.872851088162200470, -0.872875486404001590, -0.872899882463613610, -0.872924276340975910, --0.872948668036027550, -0.872973057548707910, -0.872997444878955140, -0.873021830026708860, -0.873046212991907990, -0.873070593774491480, -0.873094972374398590, -0.873119348791568270, --0.873143723025939570, -0.873168095077451520, -0.873192464946043300, -0.873216832631653840, -0.873241198134222740, -0.873265561453688280, -0.873289922589989830, -0.873314281543066670, --0.873338638312858180, -0.873362992899302640, -0.873387345302339630, -0.873411695521908340, -0.873436043557947790, -0.873460389410397050, -0.873484733079195390, -0.873509074564281840, --0.873533413865595690, -0.873557750983075980, -0.873582085916661870, -0.873606418666292520, -0.873630749231907640, -0.873655077613445410, -0.873679403810845520, -0.873703727824047040, --0.873728049652989670, -0.873752369297611910, -0.873776686757853030, -0.873801002033652520, -0.873825315124949540, -0.873849626031683150, -0.873873934753792820, -0.873898241291217630, --0.873922545643896820, -0.873946847811769680, -0.873971147794775360, -0.873995445592853580, -0.874019741205942840, -0.874044034633982720, -0.874068325876912410, -0.874092614934671830, --0.874116901807199250, -0.874141186494434510, -0.874165468996316640, -0.874189749312785260, -0.874214027443779410, -0.874238303389238470, -0.874262577149101830, -0.874286848723308750, --0.874311118111798510, -0.874335385314510490, -0.874359650331384410, -0.874383913162358860, -0.874408173807373460, -0.874432432266367580, -0.874456688539281160, -0.874480942626052580, --0.874505194526621570, -0.874529444240927600, -0.874553691768910070, -0.874577937110508240, -0.874602180265661610, -0.874626421234309450, -0.874650660016391360, -0.874674896611846500, --0.874699131020614470, -0.874723363242635000, -0.874747593277846790, -0.874771821126189560, -0.874796046787602700, -0.874820270262026240, -0.874844491549398580, -0.874868710649659760, --0.874892927562749170, -0.874917142288606290, -0.874941354827170500, -0.874965565178381310, -0.874989773342178200, -0.875013979318500670, -0.875038183107288200, -0.875062384708480300, --0.875086584122016450, -0.875110781347836600, -0.875134976385879230, -0.875159169236084500, -0.875183359898392350, -0.875207548372741280, -0.875231734659071340, -0.875255918757322120, --0.875280100667433000, -0.875304280389343710, -0.875328457922993740, -0.875352633268322580, -0.875376806425269830, -0.875400977393775090, -0.875425146173777870, -0.875449312765217760, --0.875473477168034920, -0.875497639382167850, -0.875521799407556700, -0.875545957244141080, -0.875570112891861040, -0.875594266350655180, -0.875618417620463770, -0.875642566701226200, --0.875666713592882280, -0.875690858295371630, -0.875715000808633740, -0.875739141132608420, -0.875763279267235180, -0.875787415212453730, -0.875811548968203790, -0.875835680534425400, --0.875859809911057390, -0.875883937098039800, -0.875908062095312470, -0.875932184902815330, -0.875956305520487310, -0.875980423948268580, -0.876004540186098750, -0.876028654233917630, --0.876052766091664830, -0.876076875759280060, -0.876100983236703160, -0.876125088523873720, -0.876149191620731680, -0.876173292527216650, -0.876197391243268680, -0.876221487768826910, --0.876245582103831410, -0.876269674248222000, -0.876293764201938830, -0.876317851964920740, -0.876341937537108100, -0.876366020918440510, -0.876390102108857930, -0.876414181108300160, --0.876438257916706820, -0.876462332534017950, -0.876486404960173160, -0.876510475195112380, -0.876534543238775440, -0.876558609091102170, -0.876582672752032720, -0.876606734221506260, --0.876630793499462820, -0.876654850585842920, -0.876678905480585470, -0.876702958183630750, -0.876727008694918710, -0.876751057014389050, -0.876775103141981700, -0.876799147077636730, --0.876823188821293730, -0.876847228372892860, -0.876871265732373950, -0.876895300899676820, -0.876919333874741520, -0.876943364657508220, -0.876967393247916060, -0.876991419645905550, --0.877015443851416390, -0.877039465864389080, -0.877063485684762670, -0.877087503312477530, -0.877111518747473620, -0.877135531989690960, -0.877159543039069400, -0.877183551895549090, --0.877207558559069840, -0.877231563029571610, -0.877255565306994560, -0.877279565391278600, -0.877303563282364140, -0.877327558980190440, -0.877351552484697760, -0.877375543795826160, --0.877399532913516130, -0.877423519837706940, -0.877447504568338870, -0.877471487105352050, -0.877495467448686560, -0.877519445598282320, -0.877543421554079490, -0.877567395316018130, --0.877591366884038270, -0.877615336258079970, -0.877639303438083380, -0.877663268423989010, -0.877687231215735890, -0.877711191813264850, -0.877735150216515710, -0.877759106425429200, --0.877783060439944360, -0.877807012260002020, -0.877830961885542100, -0.877854909316504780, -0.877878854552830210, -0.877902797594458440, -0.877926738441329730, -0.877950677093384150, --0.877974613550561940, -0.877998547812803070, -0.878022479880047890, -0.878046409752237020, -0.878070337429309620, -0.878094262911206400, -0.878118186197867970, -0.878142107289233590, --0.878166026185243980, -0.878189942885839290, -0.878213857390959700, -0.878237769700545570, -0.878261679814536960, -0.878285587732874130, -0.878309493455497360, -0.878333396982346800, --0.878357298313362840, -0.878381197448485530, -0.878405094387655790, -0.878428989130812800, -0.878452881677897370, -0.878476772028849660, -0.878500660183610500, -0.878524546142119280, --0.878548429904316700, -0.878572311470143030, -0.878596190839538550, -0.878620068012443630, -0.878643942988798550, -0.878667815768543580, -0.878691686351619090, -0.878715554737965370, --0.878739420927522770, -0.878763284920232150, -0.878787146716032750, -0.878811006314865530, -0.878834863716670740, -0.878858718921389340, -0.878882571928960580, -0.878906422739325510, --0.878930271352424300, -0.878954117768197430, -0.878977961986585290, -0.879001804007528250, -0.879025643830966710, -0.879049481456841030, -0.879073316885091600, -0.879097150115658920, --0.879120981148483800, -0.879144809983505860, -0.879168636620665800, -0.879192461059904230, -0.879216283301161860, -0.879240103344378410, -0.879263921189494590, -0.879287736836451120, --0.879311550285188260, -0.879335361535646510, -0.879359170587766360, -0.879382977441488300, -0.879406782096752710, -0.879430584553500210, -0.879454384811671260, -0.879478182871206380, --0.879501978732046500, -0.879525772394131210, -0.879549563857401460, -0.879573353121798180, -0.879597140187261210, -0.879620925053731350, -0.879644707721149110, -0.879668488189455200, --0.879692266458590000, -0.879716042528494110, -0.879739816399108250, -0.879763588070372690, -0.879787357542228250, -0.879811124814615430, -0.879834889887474710, -0.879858652760747260, --0.879882413434372790, -0.879906171908292230, -0.879929928182446200, -0.879953682256775840, -0.879977434131220870, -0.880001183805722230, -0.880024931280220750, -0.880048676554656790, --0.880072419628971310, -0.880096160503104690, -0.880119899176997620, -0.880143635650590840, -0.880167369923825050, -0.880191101996640750, -0.880214831868979090, -0.880238559540780010, --0.880262285011984450, -0.880286008282533230, -0.880309729352367400, -0.880333448221426900, -0.880357164889652650, -0.880380879356985610, -0.880404591623366260, -0.880428301688735540, --0.880452009553034040, -0.880475715216202490, -0.880499418678181600, -0.880523119938912190, -0.880546818998335090, -0.880570515856391230, -0.880594210513020670, -0.880617902968164670, --0.880641593221763830, -0.880665281273759540, -0.880688967124091500, -0.880712650772701110, -0.880736332219529070, -0.880760011464516210, -0.880783688507603360, -0.880807363348731220, --0.880831035987840630, -0.880854706424872510, -0.880878374659767700, -0.880902040692466910, -0.880925704522910970, -0.880949366151041250, -0.880973025576797570, -0.880996682800121440, --0.881020337820954010, -0.881043990639235330, -0.881067641254906660, -0.881091289667908840, -0.881114935878182900, -0.881138579885669570, -0.881162221690309780, -0.881185861292044350, --0.881209498690814330, -0.881233133886560660, -0.881256766879224050, -0.881280397668745550, -0.881304026255066430, -0.881327652638126960, -0.881351276817868290, -0.881374898794231370, --0.881398518567157670, -0.881422136136587260, -0.881445751502461520, -0.881469364664721370, -0.881492975623307750, -0.881516584378161830, -0.881540190929224310, -0.881563795276436470, --0.881587397419739020, -0.881610997359073110, -0.881634595094379690, -0.881658190625600250, -0.881681783952674820, -0.881705375075545030, -0.881728963994151790, -0.881752550708436500, --0.881776135218339530, -0.881799717523802150, -0.881823297624765410, -0.881846875521170470, -0.881870451212958370, -0.881894024700070170, -0.881917595982446900, -0.881941165060029620, --0.881964731932759370, -0.881988296600577320, -0.882011859063425050, -0.882035419321242630, -0.882058977373971650, -0.882082533221553170, -0.882106086863928880, -0.882129638301038970, --0.882153187532824900, -0.882176734559227850, -0.882200279380188970, -0.882223821995649420, -0.882247362405550350, -0.882270900609832820, -0.882294436608438090, -0.882317970401307220, --0.882341501988381460, -0.882365031369601870, -0.882388558544910160, -0.882412083514246710, -0.882435606277552910, -0.882459126834770680, -0.882482645185840080, -0.882506161330702920, --0.882529675269300370, -0.882553187001573590, -0.882576696527463840, -0.882600203846912400, -0.882623708959860420, -0.882647211866249170, -0.882670712566019920, -0.882694211059113830, --0.882717707345472280, -0.882741201425036870, -0.882764693297747980, -0.882788182963547440, -0.882811670422376400, -0.882835155674176590, -0.882858638718888480, -0.882882119556453790, --0.882905598186813800, -0.882929074609909770, -0.882952548825683080, -0.882976020834075000, -0.882999490635026920, -0.883022958228480090, -0.883046423614375910, -0.883069886792655630, --0.883093347763260980, -0.883116806526132670, -0.883140263081212300, -0.883163717428441240, -0.883187169567761330, -0.883210619499113060, -0.883234067222438250, -0.883257512737678270, --0.883280956044774520, -0.883304397143668370, -0.883327836034301210, -0.883351272716614510, -0.883374707190549560, -0.883398139456047950, -0.883421569513050840, -0.883444997361500390, --0.883468423001336880, -0.883491846432502450, -0.883515267654938260, -0.883538686668586480, -0.883562103473387370, -0.883585518069283200, -0.883608930456215140, -0.883632340634124770, --0.883655748602953480, -0.883679154362642880, -0.883702557913134460, -0.883725959254369590, -0.883749358386289760, -0.883772755308836590, -0.883796150021951550, -0.883819542525576480, --0.883842932819652210, -0.883866320904120650, -0.883889706778923650, -0.883913090444001900, -0.883936471899297470, -0.883959851144751840, -0.883983228180306720, -0.884006603005903390, --0.884029975621483550, -0.884053346026988820, -0.884076714222360780, -0.884100080207540830, -0.884123443982470780, -0.884146805547092020, -0.884170164901346810, -0.884193522045175650, --0.884216876978520690, -0.884240229701323540, -0.884263580213526360, -0.884286928515069630, -0.884310274605895730, -0.884333618485946050, -0.884356960155162410, -0.884380299613486300, --0.884403636860859430, -0.884426971897223520, -0.884450304722520060, -0.884473635336690990, -0.884496963739677790, -0.884520289931422620, -0.884543613911866200, -0.884566935680950790, --0.884590255238618120, -0.884613572584810210, -0.884636887719467910, -0.884660200642533370, -0.884683511353948400, -0.884706819853654510, -0.884730126141593740, -0.884753430217707580, --0.884776732081937860, -0.884800031734226280, -0.884823329174514670, -0.884846624402744750, -0.884869917418858560, -0.884893208222797270, -0.884916496814502910, -0.884939783193917420, --0.884963067360982740, -0.884986349315640020, -0.885009629057831540, -0.885032906587498890, -0.885056181904583910, -0.885079455009028630, -0.885102725900774550, -0.885125994579763820, --0.885149261045937940, -0.885172525299238950, -0.885195787339608800, -0.885219047166988960, -0.885242304781322040, -0.885265560182548980, -0.885288813370611940, -0.885312064345453290, --0.885335313107014080, -0.885358559655236580, -0.885381803990062720, -0.885405046111434340, -0.885428286019293350, -0.885451523713581600, -0.885474759194241010, -0.885497992461213630, --0.885521223514441180, -0.885544452353865700, -0.885567678979429120, -0.885590903391073710, -0.885614125588740640, -0.885637345572372280, -0.885660563341910570, -0.885683778897297880, --0.885706992238475270, -0.885730203365385220, -0.885753412277969670, -0.885776618976170550, -0.885799823459929910, -0.885823025729189690, -0.885846225783891830, -0.885869423623978580, --0.885892619249391670, -0.885915812660073240, -0.885939003855965580, -0.885962192837010170, -0.885985379603149160, -0.886008564154324720, -0.886031746490479330, -0.886054926611554160, --0.886078104517491690, -0.886101280208233870, -0.886124453683722950, -0.886147624943900760, -0.886170793988709680, -0.886193960818091430, -0.886217125431988380, -0.886240287830342590, --0.886263448013095980, -0.886286605980191160, -0.886309761731569500, -0.886332915267173390, -0.886356066586944990, -0.886379215690826780, -0.886402362578760150, -0.886425507250687580, --0.886448649706551350, -0.886471789946293390, -0.886494927969856070, -0.886518063777181340, -0.886541197368211460, -0.886564328742888600, -0.886587457901155010, -0.886610584842952630, --0.886633709568224290, -0.886656832076911150, -0.886679952368956030, -0.886703070444301080, -0.886726186302888800, -0.886749299944660560, -0.886772411369559200, -0.886795520577526750, --0.886818627568505490, -0.886841732342437680, -0.886864834899265600, -0.886887935238931390, -0.886911033361377330, -0.886934129266545690, -0.886957222954378730, -0.886980314424818620, --0.887003403677808280, -0.887026490713288980, -0.887049575531203450, -0.887072658131493940, -0.887095738514103170, -0.887118816678972740, -0.887141892626045260, -0.887164966355262980, --0.887188037866568300, -0.887211107159903590, -0.887234174235211000, -0.887257239092433040, -0.887280301731512070, -0.887303362152390250, -0.887326420355009970, -0.887349476339314160, --0.887372530105244190, -0.887395581652742900, -0.887418630981752670, -0.887441678092216300, -0.887464722984075300, -0.887487765657272500, -0.887510806111750260, -0.887533844347450970, --0.887556880364317120, -0.887579914162291090, -0.887602945741315260, -0.887625975101332010, -0.887649002242283940, -0.887672027164113310, -0.887695049866762950, -0.887718070350174690, --0.887741088614291130, -0.887764104659054860, -0.887787118484408830, -0.887810130090294520, -0.887833139476654990, -0.887856146643432490, -0.887879151590569630, -0.887902154318008900, --0.887925154825692900, -0.887948153113563900, -0.887971149181564500, -0.887994143029637310, -0.888017134657724690, -0.888040124065769710, -0.888063111253713950, -0.888086096221500480, --0.888109078969071650, -0.888132059496370640, -0.888155037803339040, -0.888178013889919900, -0.888200987756055600, -0.888223959401688970, -0.888246928826762370, -0.888269896031218420, --0.888292861014999820, -0.888315823778048960, -0.888338784320308660, -0.888361742641721300, -0.888384698742229580, -0.888407652621776570, -0.888430604280304070, -0.888453553717754920, --0.888476500934072040, -0.888499445929198160, -0.888522388703075430, -0.888545329255646550, -0.888568267586854480, -0.888591203696641680, -0.888614137584950890, -0.888637069251724810, --0.888659998696905930, -0.888682925920437180, -0.888705850922261060, -0.888728773702320280, -0.888751694260558000, -0.888774612596916150, -0.888797528711337660, -0.888820442603765470, --0.888843354274142410, -0.888866263722410730, -0.888889170948513270, -0.888912075952392970, -0.888934978733992410, -0.888957879293254430, -0.888980777630121730, -0.889003673744537150, --0.889026567636443280, -0.889049459305783160, -0.889072348752499190, -0.889095235976534950, -0.889118120977832050, -0.889141003756333980, -0.889163884311983340, -0.889186762644723410, --0.889209638754496100, -0.889232512641244700, -0.889255384304912130, -0.889278253745441010, -0.889301120962774250, -0.889323985956854690, -0.889346848727625260, -0.889369709275028670, --0.889392567599007760, -0.889415423699505440, -0.889438277576464990, -0.889461129229828450, -0.889483978659538990, -0.889506825865539750, -0.889529670847773680, -0.889552513606183150, --0.889575354140711320, -0.889598192451301010, -0.889621028537895380, -0.889643862400437020, -0.889666694038869110, -0.889689523453134460, -0.889712350643175890, -0.889735175608936560, --0.889757998350359290, -0.889780818867386910, -0.889803637159963020, -0.889826453228029560, -0.889849267071530000, -0.889872078690407630, -0.889894888084604710, -0.889917695254064610, --0.889940500198730170, -0.889963302918544530, -0.889986103413450640, -0.890008901683391530, -0.890031697728310140, -0.890054491548149420, -0.890077283142852500, -0.890100072512362450, --0.890122859656622190, -0.890145644575575210, -0.890168427269163680, -0.890191207737331070, -0.890213985980020440, -0.890236761997175270, -0.890259535788737730, -0.890282307354651410, --0.890305076694859370, -0.890327843809304520, -0.890350608697930150, -0.890373371360679290, -0.890396131797494880, -0.890418890008320310, -0.890441645993098390, -0.890464399751772380, --0.890487151284285790, -0.890509900590580880, -0.890532647670601250, -0.890555392524289950, -0.890578135151590680, -0.890600875552445600, -0.890623613726798320, -0.890646349674592000, --0.890669083395769780, -0.890691814890274940, -0.890714544158050510, -0.890737271199039780, -0.890759996013185780, -0.890782718600431900, -0.890805438960721170, -0.890828157093997210, --0.890850873000202490, -0.890873586679280520, -0.890896298131174660, -0.890919007355828410, -0.890941714353184370, -0.890964419123185910, -0.890987121665776430, -0.891009821980899170, --0.891032520068497310, -0.891055215928514220, -0.891077909560893060, -0.891100600965577080, -0.891123290142509570, -0.891145977091633900, -0.891168661812893340, -0.891191344306231480, --0.891214024571590820, -0.891236702608915190, -0.891259378418148170, -0.891282051999232270, -0.891304723352111190, -0.891327392476728430, -0.891350059373027140, -0.891372724040950580, --0.891395386480442360, -0.891418046691445640, -0.891440704673903790, -0.891463360427760200, -0.891486013952958230, -0.891508665249441170, -0.891531314317152820, -0.891553961156035800, --0.891576605766033920, -0.891599248147090570, -0.891621888299149460, -0.891644526222153180, -0.891667161916045670, -0.891689795380770090, -0.891712426616270150, -0.891735055622489230, --0.891757682399370480, -0.891780306946857610, -0.891802929264894020, -0.891825549353423060, -0.891848167212388240, -0.891870782841733380, -0.891893396241401180, -0.891916007411335480, --0.891938616351479750, -0.891961223061777940, -0.891983827542172650, -0.892006429792607800, -0.892029029813026790, -0.892051627603373310, -0.892074223163590750, -0.892096816493622600, --0.892119407593412350, -0.892141996462903710, -0.892164583102039940, -0.892187167510764770, -0.892209749689022110, -0.892232329636754700, -0.892254907353906450, -0.892277482840420850, --0.892300056096241970, -0.892322627121312610, -0.892345195915576710, -0.892367762478977760, -0.892390326811459360, -0.892412888912965220, -0.892435448783438830, -0.892458006422823800, --0.892480561831063830, -0.892503115008102420, -0.892525665953883160, -0.892548214668349770, -0.892570761151446290, -0.892593305403115430, -0.892615847423301360, -0.892638387211948100, --0.892660924768998390, -0.892683460094396360, -0.892705993188085740, -0.892728524050010130, -0.892751052680113230, -0.892773579078338650, -0.892796103244630210, -0.892818625178931400, --0.892841144881186160, -0.892863662351337960, -0.892886177589330640, -0.892908690595108250, -0.892931201368613700, -0.892953709909791170, -0.892976216218584470, -0.892998720294937540, --0.893021222138793420, -0.893043721750096160, -0.893066219128789700, -0.893088714274817730, -0.893111207188123870, -0.893133697868652040, -0.893156186316345970, -0.893178672531149460, --0.893201156513006240, -0.893223638261860130, -0.893246117777655280, -0.893268595060334740, -0.893291070109842770, -0.893313542926123080, -0.893336013509119950, -0.893358481858776420, --0.893380947975036640, -0.893403411857844550, -0.893425873507143860, -0.893448332922878510, -0.893470790104992420, -0.893493245053429200, -0.893515697768133000, -0.893538148249047430, --0.893560596496116630, -0.893583042509284660, -0.893605486288494680, -0.893627927833690940, -0.893650367144817490, -0.893672804221818500, -0.893695239064636990, -0.893717671673217470, --0.893740102047503760, -0.893762530187439790, -0.893784956092969480, -0.893807379764036900, -0.893829801200585750, -0.893852220402560070, -0.893874637369903910, -0.893897052102561100, --0.893919464600475780, -0.893941874863592110, -0.893964282891853370, -0.893986688685203920, -0.894009092243588040, -0.894031493566949220, -0.894053892655231500, -0.894076289508379140, --0.894098684126336090, -0.894121076509046260, -0.894143466656453720, -0.894165854568502620, -0.894188240245136770, -0.894210623686300440, -0.894233004891937470, -0.894255383861991990, --0.894277760596408400, -0.894300135095130070, -0.894322507358101480, -0.894344877385266470, -0.894367245176569740, -0.894389610731954550, -0.894411974051365300, -0.894434335134746130, --0.894456693982041080, -0.894479050593194210, -0.894501404968149890, -0.894523757106851950, -0.894546107009244640, -0.894568454675272130, -0.894590800104878350, -0.894613143298008120, --0.894635484254604480, -0.894657822974612270, -0.894680159457975410, -0.894702493704638610, -0.894724825714545150, -0.894747155487639610, -0.894769483023866160, -0.894791808323169070, --0.894814131385492370, -0.894836452210780450, -0.894858770798977350, -0.894881087150027340, -0.894903401263874580, -0.894925713140463320, -0.894948022779738170, -0.894970330181642630, --0.894992635346121170, -0.895014938273118180, -0.895037238962578250, -0.895059537414444770, -0.895081833628662450, -0.895104127605175660, -0.895126419343928450, -0.895148708844865190, --0.895170996107930160, -0.895193281133067730, -0.895215563920222060, -0.895237844469337410, -0.895260122780358160, -0.895282398853228690, -0.895304672687893490, -0.895326944284296270, --0.895349213642381740, -0.895371480762094610, -0.895393745643378260, -0.895416008286177620, -0.895438268690436970, -0.895460526856100560, -0.895482782783112890, -0.895505036471418210, --0.895527287920961030, -0.895549537131685610, -0.895571784103536330, -0.895594028836457560, -0.895616271330393790, -0.895638511585289730, -0.895660749601088880, -0.895682985377736270, --0.895705218915176180, -0.895727450213353430, -0.895749679272211610, -0.895771906091695660, -0.895794130671749960, -0.895816353012318880, -0.895838573113346910, -0.895860790974778550, --0.895883006596558170, -0.895905219978630370, -0.895927431120939420, -0.895949640023429920, -0.895971846686046680, -0.895994051108733540, -0.896016253291435190, -0.896038453234096140, --0.896060650936661430, -0.896082846399074760, -0.896105039621280850, -0.896127230603224410, -0.896149419344849930, -0.896171605846101890, -0.896193790106924790, -0.896215972127263230, --0.896238151907061690, -0.896260329446264880, -0.896282504744817190, -0.896304677802663540, -0.896326848619747980, -0.896349017196015230, -0.896371183531409880, -0.896393347625876970, --0.896415509479360330, -0.896437669091804890, -0.896459826463155360, -0.896481981593356240, -0.896504134482352110, -0.896526285130087700, -0.896548433536507480, -0.896570579701556290, --0.896592723625178610, -0.896614865307319150, -0.896637004747922410, -0.896659141946933640, -0.896681276904296660, -0.896703409619956430, -0.896725540093858080, -0.896747668325945550, --0.896769794316163770, -0.896791918064457460, -0.896814039570771440, -0.896836158835050300, -0.896858275857238760, -0.896880390637281640, -0.896902503175123430, -0.896924613470708950, --0.896946721523982910, -0.896968827334890140, -0.896990930903375670, -0.897013032229383560, -0.897035131312858720, -0.897057228153746110, -0.897079322751990870, -0.897101415107536940, --0.897123505220329460, -0.897145593090313160, -0.897167678717432860, -0.897189762101633480, -0.897211843242859630, -0.897233922141056130, -0.897255998796167910, -0.897278073208139570, --0.897300145376916160, -0.897322215302442720, -0.897344282984663400, -0.897366348423523360, -0.897388411618967430, -0.897410472570940860, -0.897432531279387710, -0.897454587744253240, --0.897476641965482380, -0.897498693943019840, -0.897520743676810560, -0.897542791166799470, -0.897564836412931280, -0.897586879415151140, -0.897608920173403770, -0.897630958687634100, --0.897652994957787390, -0.897675028983807800, -0.897697060765640600, -0.897719090303230830, -0.897741117596523750, -0.897763142645463420, -0.897785165449995200, -0.897807186010064150, --0.897829204325615080, -0.897851220396593040, -0.897873234222942850, -0.897895245804609670, -0.897917255141538420, -0.897939262233673930, -0.897961267080961360, -0.897983269683345520, --0.898005270040772020, -0.898027268153184900, -0.898049264020529540, -0.898071257642751530, -0.898093249019794930, -0.898115238151605210, -0.898137225038127430, -0.898159209679306510, --0.898181192075087620, -0.898203172225415790, -0.898225150130235960, -0.898247125789493280, -0.898269099203132800, -0.898291070371099560, -0.898313039293338610, -0.898335005969795540, --0.898356970400414510, -0.898378932585141010, -0.898400892523920300, -0.898422850216697650, -0.898444805663417450, -0.898466758864025380, -0.898488709818466290, -0.898510658526685440, --0.898532604988627970, -0.898554549204238940, -0.898576491173463610, -0.898598430896247020, -0.898620368372534340, -0.898642303602270820, -0.898664236585401840, -0.898686167321871900, --0.898708095811626580, -0.898730022054610940, -0.898751946050770690, -0.898773867800050200, -0.898795787302395070, -0.898817704557750450, -0.898839619566061510, -0.898861532327273500, --0.898883442841331810, -0.898905351108181370, -0.898927257127767660, -0.898949160900035740, -0.898971062424930860, -0.898992961702398840, -0.899014858732383960, -0.899036753514831920, --0.899058646049687990, -0.899080536336897880, -0.899102424376406080, -0.899124310168158080, -0.899146193712099470, -0.899168075008175300, -0.899189954056330840, -0.899211830856511680, --0.899233705408662880, -0.899255577712729790, -0.899277447768657700, -0.899299315576392090, -0.899321181135878560, -0.899343044447061590, -0.899364905509887120, -0.899386764324300310, --0.899408620890247090, -0.899430475207671830, -0.899452327276520470, -0.899474177096738160, -0.899496024668270500, -0.899517869991062760, -0.899539713065060420, -0.899561553890208640, --0.899583392466453140, -0.899605228793739050, -0.899627062872012000, -0.899648894701217120, -0.899670724281300570, -0.899692551612206740, -0.899714376693881430, -0.899736199526270370, --0.899758020109319050, -0.899779838442972380, -0.899801654527176090, -0.899823468361875660, -0.899845279947016570, -0.899867089282544220, -0.899888896368404190, -0.899910701204541970, --0.899932503790902950, -0.899954304127432710, -0.899976102214076650, -0.899997898050780790, -0.900019691637489740, -0.900041482974149430, -0.900063272060705470, -0.900085058897103660, --0.900106843483288950, -0.900128625819207050, -0.900150405904803550, -0.900172183740024060, -0.900193959324814160, -0.900215732659119250, -0.900237503742885140, -0.900259272576057200, --0.900281039158581040, -0.900302803490402370, -0.900324565571467010, -0.900346325401719880, -0.900368082981106930, -0.900389838309573750, -0.900411591387066500, -0.900433342213529660, --0.900455090788909620, -0.900476837113151850, -0.900498581186201960, -0.900520323008005550, -0.900542062578508440, -0.900563799897656110, -0.900585534965394290, -0.900607267781668660, --0.900628998346424850, -0.900650726659608880, -0.900672452721165810, -0.900694176531041560, -0.900715898089181840, -0.900737617395532820, -0.900759334450039310, -0.900781049252647460, --0.900802761803302990, -0.900824472101951600, -0.900846180148539120, -0.900867885943011150, -0.900889589485313500, -0.900911290775391780, -0.900932989813191920, -0.900954686598659520, --0.900976381131740390, -0.900998073412380810, -0.901019763440525590, -0.901041451216120890, -0.901063136739112650, -0.901084820009446900, -0.901106501027068800, -0.901128179791924390, --0.901149856303959500, -0.901171530563120050, -0.901193202569351760, -0.901214872322600450, -0.901236539822811930, -0.901258205069932040, -0.901279868063906700, -0.901301528804681730, --0.901323187292203180, -0.901344843526416420, -0.901366497507267490, -0.901388149234702340, -0.901409798708667110, -0.901431445929107070, -0.901453090895968480, -0.901474733609197050, --0.901496374068738840, -0.901518012274539650, -0.901539648226545530, -0.901561281924702200, -0.901582913368955690, -0.901604542559251930, -0.901626169495536760, -0.901647794177756530, --0.901669416605856530, -0.901691036779782910, -0.901712654699481810, -0.901734270364899280, -0.901755883775980820, -0.901777494932672560, -0.901799103834920680, -0.901820710482670980, --0.901842314875869520, -0.901863917014462220, -0.901885516898395130, -0.901907114527614300, -0.901928709902065640, -0.901950303021695320, -0.901971893886449490, -0.901993482496273650, --0.902015068851113930, -0.902036652950916730, -0.902058234795628190, -0.902079814385193690, -0.902101391719559610, -0.902122966798672100, -0.902144539622477200, -0.902166110190920970, --0.902187678503949430, -0.902209244561508640, -0.902230808363544750, -0.902252369910003900, -0.902273929200832160, -0.902295486235975440, -0.902317041015380570, -0.902338593538992590, --0.902360143806758220, -0.902381691818623820, -0.902403237574534780, -0.902424781074437690, -0.902446322318278590, -0.902467861306003760, -0.902489398037559230, -0.902510932512891160, --0.902532464731945820, -0.902553994694669350, -0.902575522401007910, -0.902597047850907550, -0.902618571044314640, -0.902640091981175670, -0.902661610661436130, -0.902683127085042500, --0.902704641251941160, -0.902726153162078490, -0.902747662815400090, -0.902769170211852550, -0.902790675351382020, -0.902812178233934890, -0.902833678859457310, -0.902855177227895430, --0.902876673339195630, -0.902898167193304290, -0.902919658790167450, -0.902941148129731360, -0.902962635211942870, -0.902984120036747440, -0.903005602604091680, -0.903027082913921970, --0.903048560966184800, -0.903070036760825980, -0.903091510297792000, -0.903112981577029240, -0.903134450598484070, -0.903155917362102770, -0.903177381867831700, -0.903198844115617130, --0.903220304105405440, -0.903241761837143000, -0.903263217310776190, -0.903284670526251610, -0.903306121483515080, -0.903327570182513200, -0.903349016623192450, -0.903370460805499540, --0.903391902729379970, -0.903413342394780770, -0.903434779801648210, -0.903456214949928670, -0.903477647839568520, -0.903499078470514360, -0.903520506842712460, -0.903541932956109290, --0.903563356810651360, -0.903584778406284930, -0.903606197742956590, -0.903627614820613160, -0.903649029639200350, -0.903670442198664880, -0.903691852498953780, -0.903713260540012550, --0.903734666321788230, -0.903756069844227290, -0.903777471107276130, -0.903798870110881340, -0.903820266854989280, -0.903841661339546580, -0.903863053564499810, -0.903884443529795360, --0.903905831235379710, -0.903927216681199570, -0.903948599867201770, -0.903969980793332130, -0.903991359459537460, -0.904012735865764470, -0.904034110011959880, -0.904055481898069720, --0.904076851524040940, -0.904098218889819890, -0.904119583995353420, -0.904140946840587880, -0.904162307425470100, -0.904183665749946460, -0.904205021813963670, -0.904226375617468330, --0.904247727160407020, -0.904269076442726800, -0.904290423464373490, -0.904311768225294130, -0.904333110725435430, -0.904354450964744210, -0.904375788943166500, -0.904397124660649370, --0.904418458117139500, -0.904439789312583400, -0.904461118246927760, -0.904482444920119420, -0.904503769332104970, -0.904525091482831000, -0.904546411372244450, -0.904567729000291700, --0.904589044366920110, -0.904610357472075520, -0.904631668315705070, -0.904652976897755370, -0.904674283218173670, -0.904695587276905910, -0.904716889073899130, -0.904738188609100160, --0.904759485882455690, -0.904780780893912450, -0.904802073643417360, -0.904823364130917020, -0.904844652356358360, -0.904865938319687980, -0.904887222020852810, -0.904908503459799560, --0.904929782636475390, -0.904951059550826440, -0.904972334202799770, -0.904993606592342740, -0.905014876719401280, -0.905036144583922560, -0.905057410185853620, -0.905078673525141040, --0.905099934601731770, -0.905121193415572730, -0.905142449966610640, -0.905163704254792530, -0.905184956280065120, -0.905206206042375230, -0.905227453541669890, -0.905248698777896380, --0.905269941751000620, -0.905291182460929990, -0.905312420907631530, -0.905333657091052290, -0.905354891011138640, -0.905376122667837620, -0.905397352061096390, -0.905418579190861770, --0.905439804057080690, -0.905461026659700070, -0.905482246998666970, -0.905503465073928200, -0.905524680885430700, -0.905545894433121610, -0.905567105716948100, -0.905588314736856410, --0.905609521492794060, -0.905630725984707840, -0.905651928212545140, -0.905673128176252230, -0.905694325875776580, -0.905715521311065140, -0.905736714482064830, -0.905757905388722690, --0.905779094030985890, -0.905800280408801230, -0.905821464522115980, -0.905842646370877080, -0.905863825955031450, -0.905885003274526810, -0.905906178329309090, -0.905927351119326100, --0.905948521644524550, -0.905969689904852160, -0.905990855900255190, -0.906012019630681120, -0.906033181096076890, -0.906054340296389870, -0.906075497231566880, -0.906096651901555190, --0.906117804306301840, -0.906138954445753990, -0.906160102319858660, -0.906181247928563250, -0.906202391271814570, -0.906223532349560320, -0.906244671161746900, -0.906265807708321880, --0.906286941989232650, -0.906308074004425590, -0.906329203753848510, -0.906350331237448350, -0.906371456455172360, -0.906392579406967710, -0.906413700092781550, -0.906434818512561250, --0.906455934666253850, -0.906477048553806620, -0.906498160175166820, -0.906519269530281610, -0.906540376619098590, -0.906561481441564230, -0.906582583997626150, -0.906603684287231700, --0.906624782310328280, -0.906645878066862590, -0.906666971556782220, -0.906688062780034440, -0.906709151736566520, -0.906730238426325720, -0.906751322849259190, -0.906772405005314530, --0.906793484894438780, -0.906814562516579330, -0.906835637871683420, -0.906856710959698780, -0.906877781780572100, -0.906898850334250880, -0.906919916620682610, -0.906940980639814880, --0.906962042391594280, -0.906983101875968640, -0.907004159092885230, -0.907025214042291420, -0.907046266724134460, -0.907067317138361970, -0.907088365284921210, -0.907109411163759430, --0.907130454774824240, -0.907151496118062780, -0.907172535193423110, -0.907193572000851600, -0.907214606540296180, -0.907235638811704330, -0.907256668815023650, -0.907277696550200960, --0.907298722017184090, -0.907319745215920290, -0.907340766146357280, -0.907361784808442320, -0.907382801202122780, -0.907403815327346370, -0.907424827184060370, -0.907445836772212240, --0.907466844091749600, -0.907487849142619820, -0.907508851924770820, -0.907529852438149320, -0.907550850682703140, -0.907571846658380200, -0.907592840365127330, -0.907613831802892350, --0.907634820971622740, -0.907655807871266100, -0.907676792501770020, -0.907697774863081900, -0.907718754955149310, -0.907739732777919860, -0.907760708331341040, -0.907781681615360550, --0.907802652629925770, -0.907823621374984730, -0.907844587850484270, -0.907865552056372320, -0.907886513992596570, -0.907907473659104850, -0.907928431055844090, -0.907949386182762330, --0.907970339039806950, -0.907991289626925880, -0.908012237944066490, -0.908033183991176500, -0.908054127768203600, -0.908075069275095290, -0.908096008511799390, -0.908116945478263490, --0.908137880174435530, -0.908158812600262540, -0.908179742755692470, -0.908200670640673110, -0.908221596255152420, -0.908242519599077420, -0.908263440672396060, -0.908284359475056040, --0.908305276007005170, -0.908326190268191170, -0.908347102258561630, -0.908368011978064380, -0.908388919426647120, -0.908409824604257450, -0.908430727510843310, -0.908451628146352720, --0.908472526510732630, -0.908493422603931290, -0.908514316425896420, -0.908535207976576050, -0.908556097255917350, -0.908576984263868350, -0.908597869000376870, -0.908618751465390840, --0.908639631658857860, -0.908660509580725750, -0.908681385230942440, -0.908702258609455640, -0.908723129716213160, -0.908743998551162950, -0.908764865114252700, -0.908785729405430560, --0.908806591424643820, -0.908827451171840610, -0.908848308646969080, -0.908869163849976510, -0.908890016780810940, -0.908910867439420400, -0.908931715825752610, -0.908952561939755600, --0.908973405781377200, -0.908994247350565220, -0.909015086647267600, -0.909035923671432380, -0.909056758423007260, -0.909077590901940290, -0.909098421108179620, -0.909119249041672630, --0.909140074702367570, -0.909160898090212170, -0.909181719205155000, -0.909202538047143130, -0.909223354616124910, -0.909244168912048290, -0.909264980934861300, -0.909285790684511760, --0.909306598160947830, -0.909327403364117440, -0.909348206293968400, -0.909369006950448980, -0.909389805333507330, -0.909410601443090830, -0.909431395279147850, -0.909452186841626430, --0.909472976130474400, -0.909493763145640010, -0.909514547887071530, -0.909535330354716450, -0.909556110548522920, -0.909576888468439090, -0.909597664114413120, -0.909618437486393040, --0.909639208584326790, -0.909659977408162510, -0.909680743957848260, -0.909701508233332510, -0.909722270234562760, -0.909743029961487260, -0.909763787414054060, -0.909784542592211530, --0.909805295495907610, -0.909826046125090880, -0.909846794479708620, -0.909867540559709310, -0.909888284365041210, -0.909909025895652370, -0.909929765151491040, -0.909950502132505280, --0.909971236838643230, -0.909991969269853040, -0.910012699426082980, -0.910033427307281540, -0.910054152913396200, -0.910074876244375440, -0.910095597300167420, -0.910116316080720520, --0.910137032585983220, -0.910157746815902890, -0.910178458770428130, -0.910199168449507320, -0.910219875853088610, -0.910240580981120150, -0.910261283833550320, -0.910281984410327150, --0.910302682711399140, -0.910323378736714320, -0.910344072486221510, -0.910364763959868100, -0.910385453157602890, -0.910406140079373930, -0.910426824725129590, -0.910447507094818250, --0.910468187188388510, -0.910488865005787960, -0.910509540546965200, -0.910530213811868610, -0.910550884800446550, -0.910571553512647180, -0.910592219948418990, -0.910612884107710130, --0.910633545990469200, -0.910654205596644670, -0.910674862926184380, -0.910695517979036810, -0.910716170755150540, -0.910736821254473750, -0.910757469476955020, -0.910778115422542940, --0.910798759091185130, -0.910819400482830500, -0.910840039597427430, -0.910860676434924190, -0.910881310995269140, -0.910901943278411010, -0.910922573284297930, -0.910943201012878400, --0.910963826464101230, -0.910984449637914250, -0.911005070534266050, -0.911025689153105110, -0.911046305494380040, -0.911066919558039200, -0.911087531344031420, -0.911108140852304400, --0.911128748082807080, -0.911149353035487830, -0.911169955710295240, -0.911190556107177810, -0.911211154226084010, -0.911231750066962220, -0.911252343629761040, -0.911272934914429070, --0.911293523920915120, -0.911314110649167010, -0.911334695099133670, -0.911355277270763490, -0.911375857164005150, -0.911396434778807500, -0.911417010115118440, -0.911437583172886920, --0.911458153952061310, -0.911478722452590430, -0.911499288674422650, -0.911519852617506680, -0.911540414281791110, -0.911560973667224550, -0.911581530773755480, -0.911602085601332930, --0.911622638149904850, -0.911643188419420160, -0.911663736409827450, -0.911684282121075440, -0.911704825553112720, -0.911725366705888330, -0.911745905579350200, -0.911766442173447270, --0.911786976488128120, -0.911807508523341690, -0.911828038279036360, -0.911848565755161040, -0.911869090951664240, -0.911889613868494760, -0.911910134505601540, -0.911930652862932730, --0.911951168940437150, -0.911971682738063730, -0.911992194255761170, -0.912012703493477960, -0.912033210451163480, -0.912053715128765650, -0.912074217526233410, -0.912094717643515680, --0.912115215480561180, -0.912135711037318610, -0.912156204313736780, -0.912176695309764420, -0.912197184025350330, -0.912217670460443660, -0.912238154614992360, -0.912258636488945780, --0.912279116082252540, -0.912299593394861550, -0.912320068426721640, -0.912340541177781850, -0.912361011647990330, -0.912381479837296340, -0.912401945745648590, -0.912422409372996010, --0.912442870719287420, -0.912463329784471530, -0.912483786568497490, -0.912504241071313890, -0.912524693292869670, -0.912545143233114200, -0.912565590891995400, -0.912586036269462660, --0.912606479365464800, -0.912626920179950730, -0.912647358712869840, -0.912667794964170050, -0.912688228933800860, -0.912708660621711080, -0.912729090027849630, -0.912749517152165460, --0.912769941994607480, -0.912790364555124630, -0.912810784833665960, -0.912831202830180270, -0.912851618544616940, -0.912872031976924240, -0.912892443127051310, -0.912912851994947430, --0.912933258580561400, -0.912953662883842500, -0.912974064904739200, -0.912994464643200660, -0.913014862099176040, -0.913035257272614140, -0.913055650163464130, -0.913076040771675030, --0.913096429097195910, -0.913116815139975560, -0.913137198899963250, -0.913157580377108370, -0.913177959571359050, -0.913198336482664910, -0.913218711110974860, -0.913239083456238170, --0.913259453518403650, -0.913279821297420910, -0.913300186793238210, -0.913320550005805030, -0.913340910935070530, -0.913361269580983740, -0.913381625943493810, -0.913401980022549800, --0.913422331818100840, -0.913442681330095980, -0.913463028558484820, -0.913483373503215730, -0.913503716164238200, -0.913524056541501480, -0.913544394634954520, -0.913564730444546560, --0.913585063970227210, -0.913605395211944730, -0.913625724169648820, -0.913646050843288650, -0.913666375232813240, -0.913686697338171980, -0.913707017159314020, -0.913727334696188390, --0.913747649948744580, -0.913767962916931850, -0.913788273600698920, -0.913808581999995370, -0.913828888114770250, -0.913849191944972940, -0.913869493490552690, -0.913889792751459100, --0.913910089727640540, -0.913930384419046840, -0.913950676825627250, -0.913970966947330820, -0.913991254784107030, -0.914011540335905150, -0.914031823602674430, -0.914052104584364030, --0.914072383280923550, -0.914092659692302360, -0.914112933818449160, -0.914133205659313660, -0.914153475214845020, -0.914173742484992840, -0.914194007469706580, -0.914214270168935080, --0.914234530582627710, -0.914254788710734180, -0.914275044553203630, -0.914295298109985440, -0.914315549381028990, -0.914335798366283650, -0.914356045065698900, -0.914376289479224000, --0.914396531606808670, -0.914416771448401720, -0.914437009003952860, -0.914457244273411460, -0.914477477256727010, -0.914497707953848770, -0.914517936364726670, -0.914538162489309300, --0.914558386327546600, -0.914578607879387940, -0.914598827144782690, -0.914619044123680450, -0.914639258816030480, -0.914659471221782480, -0.914679681340885730, -0.914699889173290260, --0.914720094718944550, -0.914740297977798660, -0.914760498949802050, -0.914780697634904220, -0.914800894033054650, -0.914821088144203150, -0.914841279968298560, -0.914861469505290790, --0.914881656755129340, -0.914901841717763790, -0.914922024393143630, -0.914942204781218350, -0.914962382881937650, -0.914982558695250910, -0.915002732221108170, -0.915022903459458250, --0.915043072410251070, -0.915063239073436120, -0.915083403448963220, -0.915103565536781740, -0.915123725336841720, -0.915143882849091980, -0.915164038073482570, -0.915184191009963070, --0.915204341658483080, -0.915224490018992200, -0.915244636091440130, -0.915264779875776480, -0.915284921371950940, -0.915305060579913010, -0.915325197499612830, -0.915345332130999220, --0.915365464474022340, -0.915385594528631770, -0.915405722294777350, -0.915425847772408870, -0.915445970961475400, -0.915466091861926960, -0.915486210473713370, -0.915506326796784230, --0.915526440831089360, -0.915546552576578240, -0.915566662033200810, -0.915586769200906760, -0.915606874079645690, -0.915626976669367880, -0.915647076970022230, -0.915667174981558920, --0.915687270703927750, -0.915707364137078210, -0.915727455280960450, -0.915747544135524280, -0.915767630700718980, -0.915787714976494470, -0.915807796962800790, -0.915827876659587650, --0.915847954066804750, -0.915868029184401910, -0.915888102012329060, -0.915908172550535920, -0.915928240798972840, -0.915948306757588650, -0.915968370426333720, -0.915988431805157880, --0.916008490894011040, -0.916028547692842920, -0.916048602201603780, -0.916068654420242770, -0.916088704348710040, -0.916108751986955740, -0.916128797334929360, -0.916148840392581150, --0.916168881159860730, -0.916188919636718110, -0.916208955823103240, -0.916228989718966380, -0.916249021324256670, -0.916269050638924390, -0.916289077662919450, -0.916309102396191790, --0.916329124838691440, -0.916349144990368570, -0.916369162851172540, -0.916389178421053610, -0.916409191699961710, -0.916429202687846890, -0.916449211384658960, -0.916469217790348070, --0.916489221904864150, -0.916509223728157130, -0.916529223260177050, -0.916549220500874280, -0.916569215450198090, -0.916589208108098850, -0.916609198474526710, -0.916629186549431480, --0.916649172332763660, -0.916669155824472500, -0.916689137024508490, -0.916709115932821560, -0.916729092549361970, -0.916749066874079640, -0.916769038906924520, -0.916789008647846960, --0.916808976096796790, -0.916828941253724160, -0.916848904118579560, -0.916868864691312350, -0.916888822971873020, -0.916908778960211500, -0.916928732656278170, -0.916948684060022940, --0.916968633171396430, -0.916988579990347890, -0.917008524516827910, -0.917028466750786640, -0.917048406692174240, -0.917068344340940870, -0.917088279697036550, -0.917108212760411550, --0.917128143531016020, -0.917148072008800440, -0.917167998193714420, -0.917187922085708320, -0.917207843684732400, -0.917227762990736940, -0.917247680003672070, -0.917267594723488290, --0.917287507150135300, -0.917307417283563460, -0.917327325123723060, -0.917347230670564340, -0.917367133924037570, -0.917387034884093010, -0.917406933550680810, -0.917426829923751240, --0.917446724003255000, -0.917466615789141570, -0.917486505281361660, -0.917506392479865430, -0.917526277384603240, -0.917546159995525360, -0.917566040312582490, -0.917585918335724000, --0.917605794064900840, -0.917625667500063250, -0.917645538641161380, -0.917665407488145730, -0.917685274040966450, -0.917705138299574120, -0.917725000263918900, -0.917744859933951160, --0.917764717309621610, -0.917784572390879960, -0.917804425177676910, -0.917824275669962720, -0.917844123867687880, -0.917863969770803090, -0.917883813379257950, -0.917903654693003390, --0.917923493711989560, -0.917943330436167160, -0.917963164865486240, -0.917982996999897600, -0.918002826839351300, -0.918022654383798040, -0.918042479633188190, -0.918062302587472350, --0.918082123246600550, -0.918101941610523280, -0.918121757679191350, -0.918141571452554820, -0.918161382930564480, -0.918181192113171060, -0.918200999000324260, -0.918220803591975000, --0.918240605888073660, -0.918260405888570830, -0.918280203593417000, -0.918299999002562650, -0.918319792115958380, -0.918339582933554550, -0.918359371455302110, -0.918379157681150970, --0.918398941611051840, -0.918418723244955440, -0.918438502582812120, -0.918458279624572600, -0.918478054370187810, -0.918497826819607450, -0.918517596972782570, -0.918537364829663640, --0.918557130390201370, -0.918576893654346140, -0.918596654622048760, -0.918616413293259830, -0.918636169667929710, -0.918655923746009680, -0.918675675527449330, -0.918695425012199920, --0.918715172200211930, -0.918734917091435950, -0.918754659685822710, -0.918774399983323110, -0.918794137983887320, -0.918813873687466030, -0.918833607094010070, -0.918853338203470150, --0.918873067015796850, -0.918892793530940890, -0.918912517748852960, -0.918932239669483790, -0.918951959292783950, -0.918971676618704600, -0.918991391647195680, -0.919011104378208210, --0.919030814811693130, -0.919050522947600920, -0.919070228785882740, -0.919089932326488720, -0.919109633569369810, -0.919129332514476820, -0.919149029161760440, -0.919168723511171630, --0.919188415562660950, -0.919208105316179140, -0.919227792771677210, -0.919247477929105660, -0.919267160788415860, -0.919286841349557850, -0.919306519612482660, -0.919326195577141130, --0.919345869243484160, -0.919365540611462580, -0.919385209681027440, -0.919404876452128870, -0.919424540924718260, -0.919444203098746190, -0.919463862974163600, -0.919483520550921420, --0.919503175828970340, -0.919522828808261420, -0.919542479488745350, -0.919562127870373500, -0.919581773953095930, -0.919601417736863990, -0.919621059221628400, -0.919640698407340310, --0.919660335293950300, -0.919679969881409990, -0.919699602169669280, -0.919719232158679570, -0.919738859848391770, -0.919758485238756920, -0.919778108329725730, -0.919797729121249350, --0.919817347613278710, -0.919836963805764520, -0.919856577698658470, -0.919876189291910510, -0.919895798585472100, -0.919915405579294190, -0.919935010273327690, -0.919954612667523760, --0.919974212761833670, -0.919993810556207660, -0.920013406050597120, -0.920032999244953080, -0.920052590139226470, -0.920072178733368440, -0.920091765027330030, -0.920111349021062170, --0.920130930714515900, -0.920150510107642260, -0.920170087200392840, -0.920189661992717680, -0.920209234484568480, -0.920228804675896180, -0.920248372566651820, -0.920267938156786980, --0.920287501446251820, -0.920307062434998050, -0.920326621122976470, -0.920346177510138470, -0.920365731596434870, -0.920385283381817130, -0.920404832866236090, -0.920424380049642890, --0.920443924931988900, -0.920463467513225280, -0.920483007793302720, -0.920502545772172720, -0.920522081449786310, -0.920541614826094650, -0.920561145901048980, -0.920580674674600810, --0.920600201146700490, -0.920619725317299850, -0.920639247186349710, -0.920658766753801650, -0.920678284019606500, -0.920697798983715730, -0.920717311646080510, -0.920736822006651860, --0.920756330065381600, -0.920775835822220220, -0.920795339277119210, -0.920814840430029810, -0.920834339280903300, -0.920853835829691050, -0.920873330076344420, -0.920892822020814240, --0.920912311663051870, -0.920931799003008810, -0.920951284040636310, -0.920970766775885520, -0.920990247208707810, -0.921009725339054450, -0.921029201166876810, -0.921048674692126590, --0.921068145914754280, -0.921087614834711580, -0.921107081451949860, -0.921126545766420500, -0.921146007778074650, -0.921165467486864230, -0.921184924892739730, -0.921204379995652970, --0.921223832795555200, -0.921243283292397910, -0.921262731486132360, -0.921282177376710030, -0.921301620964082300, -0.921321062248200430, -0.921340501229015900, -0.921359937906480520, --0.921379372280544890, -0.921398804351160950, -0.921418234118279940, -0.921437661581853250, -0.921457086741832800, -0.921476509598169400, -0.921495930150814550, -0.921515348399720050, --0.921534764344837050, -0.921554177986117160, -0.921573589323511850, -0.921592998356972610, -0.921612405086450810, -0.921631809511898050, -0.921651211633266020, -0.921670611450505660, --0.921690008963568790, -0.921709404172406880, -0.921728797076971530, -0.921748187677214110, -0.921767575973086560, -0.921786961964539800, -0.921806345651525530, -0.921825727033995460, --0.921845106111901070, -0.921864482885193960, -0.921883857353825610, -0.921903229517747610, -0.921922599376911460, -0.921941966931269290, -0.921961332180771810, -0.921980695125370950, --0.922000055765018420, -0.922019414099665700, -0.922038770129264500, -0.922058123853766620, -0.922077475273123230, -0.922096824387286020, -0.922116171196206810, -0.922135515699837200, --0.922154857898128680, -0.922174197791033160, -0.922193535378502130, -0.922212870660487180, -0.922232203636940470, -0.922251534307812810, -0.922270862673056360, -0.922290188732622810, --0.922309512486463760, -0.922328833934530910, -0.922348153076776310, -0.922367469913150990, -0.922386784443607110, -0.922406096668096140, -0.922425406586569910, -0.922444714198980220, --0.922464019505278790, -0.922483322505417200, -0.922502623199347390, -0.922521921587021070, -0.922541217668390150, -0.922560511443405900, -0.922579802912020460, -0.922599092074185330, --0.922618378929852660, -0.922637663478974250, -0.922656945721501360, -0.922676225657386160, -0.922695503286580450, -0.922714778609035840, -0.922734051624704340, -0.922753322333537800, --0.922772590735487790, -0.922791856830506460, -0.922811120618545420, -0.922830382099556920, -0.922849641273492120, -0.922868898140303150, -0.922888152699942070, -0.922907404952360570, --0.922926654897510470, -0.922945902535344140, -0.922965147865812740, -0.922984390888868410, -0.923003631604463080, -0.923022870012548790, -0.923042106113077240, -0.923061339906000480, --0.923080571391270310, -0.923099800568838780, -0.923119027438658040, -0.923138252000679340, -0.923157474254855060, -0.923176694201137130, -0.923195911839477470, -0.923215127169828010, --0.923234340192141010, -0.923253550906367850, -0.923272759312460890, -0.923291965410371950, -0.923311169200053180, -0.923330370681456400, -0.923349569854533760, -0.923368766719237070, --0.923387961275518590, -0.923407153523330470, -0.923426343462624200, -0.923445531093352030, -0.923464716415466010, -0.923483899428918290, -0.923503080133660780, -0.923522258529645870, --0.923541434616825030, -0.923560608395150530, -0.923579779864574620, -0.923598949025049130, -0.923618115876526310, -0.923637280418958320, -0.923656442652296960, -0.923675602576494610, --0.923694760191503210, -0.923713915497275220, -0.923733068493762130, -0.923752219180916430, -0.923771367558690050, -0.923790513627035350, -0.923809657385904700, -0.923828798835249490, --0.923847937975022400, -0.923867074805175380, -0.923886209325660680, -0.923905341536430560, -0.923924471437436940, -0.923943599028632210, -0.923962724309968510, -0.923981847281397980, --0.924000967942873120, -0.924020086294345510, -0.924039202335767750, -0.924058316067091990, -0.924077427488270380, -0.924096536599255500, -0.924115643399999080, -0.924134747890453470, --0.924153850070570940, -0.924172949940303860, -0.924192047499604370, -0.924211142748424860, -0.924230235686717360, -0.924249326314434350, -0.924268414631527980, -0.924287500637950950, --0.924306584333654760, -0.924325665718592200, -0.924344744792715440, -0.924363821555976850, -0.924382896008328570, -0.924401968149723530, -0.924421037980113210, -0.924440105499450330, --0.924459170707687020, -0.924478233604775990, -0.924497294190669280, -0.924516352465319270, -0.924535408428678540, -0.924554462080699140, -0.924573513421333980, -0.924592562450534670, --0.924611609168254020, -0.924630653574444290, -0.924649695669057970, -0.924668735452047420, -0.924687772923365350, -0.924706808082963460, -0.924725840930794570, -0.924744871466811170, --0.924763899690965510, -0.924782925603210070, -0.924801949203497340, -0.924820970491779800, -0.924839989468009720, -0.924859006132139780, -0.924878020484122600, -0.924897032523910090, --0.924916042251454960, -0.924935049666709700, -0.924954054769626890, -0.924973057560159240, -0.924992058038258570, -0.925011056203877800, -0.925030052056969310, -0.925049045597485800, --0.925068036825379640, -0.925087025740603420, -0.925106012343109520, -0.925124996632850750, -0.925143978609779370, -0.925162958273848420, -0.925181935625009720, -0.925200910663216190, --0.925219883388420430, -0.925238853800574910, -0.925257821899632570, -0.925276787685545440, -0.925295751158266230, -0.925314712317747650, -0.925333671163942380, -0.925352627696802930, --0.925371581916281770, -0.925390533822331830, -0.925409483414905480, -0.925428430693955310, -0.925447375659434580, -0.925466318311295000, -0.925485258649489610, -0.925504196673971100, --0.925523132384692080, -0.925542065781605250, -0.925560996864663530, -0.925579925633819080, -0.925598852089024700, -0.925617776230233340, -0.925636698057397460, -0.925655617570469770, --0.925674534769403090, -0.925693449654150120, -0.925712362224663470, -0.925731272480896260, -0.925750180422800550, -0.925769086050329370, -0.925787989363435540, -0.925806890362071640, --0.925825789046190620, -0.925844685415745380, -0.925863579470688090, -0.925882471210971890, -0.925901360636549490, -0.925920247747373690, -0.925939132543397330, -0.925958015024573090, --0.925976895190853800, -0.925995773042192270, -0.926014648578541650, -0.926033521799854100, -0.926052392706082750, -0.926071261297180430, -0.926090127573099830, -0.926108991533794110, --0.926127853179216090, -0.926146712509318130, -0.926165569524053380, -0.926184424223374770, -0.926203276607235120, -0.926222126675587230, -0.926240974428383930, -0.926259819865578370, --0.926278662987123140, -0.926297503792971270, -0.926316342283076020, -0.926335178457389550, -0.926354012315865120, -0.926372843858455750, -0.926391673085114160, -0.926410499995793830, --0.926429324590446800, -0.926448146869026550, -0.926466966831485880, -0.926485784477777740, -0.926504599807855270, -0.926523412821671170, -0.926542223519178700, -0.926561031900330570, --0.926579837965079810, -0.926598641713379800, -0.926617443145182910, -0.926636242260442500, -0.926655039059111290, -0.926673833541142630, -0.926692625706489360, -0.926711415555104830, --0.926730203086941430, -0.926748988301952510, -0.926767771200091130, -0.926786551781310310, -0.926805330045563200, -0.926824105992802630, -0.926842879622981840, -0.926861650936053880, --0.926880419931972120, -0.926899186610689040, -0.926917950972157900, -0.926936713016331960, -0.926955472743164140, -0.926974230152607710, -0.926992985244616040, -0.927011738019141500, --0.927030488476137670, -0.927049236615557600, -0.927067982437354440, -0.927086725941481340, -0.927105467127891440, -0.927124205996537890, -0.927142942547373840, -0.927161676780352660, --0.927180408695427060, -0.927199138292550410, -0.927217865571675850, -0.927236590532756640, -0.927255313175746050, -0.927274033500597450, -0.927292751507263420, -0.927311467195697570, --0.927330180565852920, -0.927348891617682970, -0.927367600351140740, -0.927386306766179500, -0.927405010862752510, -0.927423712640812910, -0.927442412100314080, -0.927461109241209610, --0.927479804063451980, -0.927498496566994790, -0.927517186751791510, -0.927535874617795190, -0.927554560164959520, -0.927573243393236990, -0.927591924302581530, -0.927610602892946170, --0.927629279164284280, -0.927647953116549240, -0.927666624749694300, -0.927685294063672840, -0.927703961058438110, -0.927722625733943480, -0.927741288090142670, -0.927759948126988250, --0.927778605844433950, -0.927797261242433220, -0.927815914320939240, -0.927834565079905470, -0.927853213519285740, -0.927871859639032510, -0.927890503439099730, -0.927909144919440650, --0.927927784080008640, -0.927946420920757300, -0.927965055441639870, -0.927983687642609740, -0.928002317523620390, -0.928020945084625630, -0.928039570325578160, -0.928058193246431800, --0.928076813847139910, -0.928095432127655990, -0.928114048087933520, -0.928132661727926300, -0.928151273047587040, -0.928169882046869570, -0.928188488725727460, -0.928207093084113980, --0.928225695121982940, -0.928244294839287610, -0.928262892235981460, -0.928281487312018210, -0.928300080067351540, -0.928318670501934280, -0.928337258615720360, -0.928355844408663370, --0.928374427880716670, -0.928393009031833970, -0.928411587861969090, -0.928430164371074840, -0.928448738559105150, -0.928467310426013710, -0.928485879971754020, -0.928504447196279560, --0.928523012099544020, -0.928541574681500890, -0.928560134942103880, -0.928578692881306460, -0.928597248499062670, -0.928615801795325440, -0.928634352770048800, -0.928652901423186130, --0.928671447754691240, -0.928689991764518160, -0.928708533452619720, -0.928727072818949950, -0.928745609863462440, -0.928764144586110900, -0.928782676986849020, -0.928801207065630520, --0.928819734822408980, -0.928838260257138000, -0.928856783369771510, -0.928875304160263320, -0.928893822628566570, -0.928912338774635190, -0.928930852598423010, -0.928949364099883710, --0.928967873278971010, -0.928986380135638940, -0.929004884669840660, -0.929023386881530080, -0.929041886770661020, -0.929060384337187290, -0.929078879581062610, -0.929097372502240670, --0.929115863100675400, -0.929134351376320390, -0.929152837329129790, -0.929171320959056860, -0.929189802266055630, -0.929208281250079820, -0.929226757911083330, -0.929245232249020000, --0.929263704263843860, -0.929282173955508160, -0.929300641323967060, -0.929319106369174360, -0.929337569091083780, -0.929356029489649350, -0.929374487564824880, -0.929392943316564190, --0.929411396744821090, -0.929429847849549850, -0.929448296630703720, -0.929466743088236740, -0.929485187222102940, -0.929503629032256140, -0.929522068518650380, -0.929540505681239690, --0.929558940519977450, -0.929577373034817800, -0.929595803225714780, -0.929614231092622200, -0.929632656635494100, -0.929651079854284300, -0.929669500748946830, -0.929687919319435620, --0.929706335565704590, -0.929724749487708110, -0.929743161085399340, -0.929761570358732750, -0.929779977307662150, -0.929798381932141700, -0.929816784232125550, -0.929835184207567170, --0.929853581858420820, -0.929871977184640430, -0.929890370186180150, -0.929908760862994010, -0.929927149215035830, -0.929945535242259870, -0.929963918944620050, -0.929982300322070520, --0.930000679374565430, -0.930019056102058370, -0.930037430504503710, -0.930055802581855500, -0.930074172334067640, -0.930092539761094520, -0.930110904862890280, -0.930129267639408400, --0.930147628090603470, -0.930165986216429430, -0.930184342016840420, -0.930202695491790470, -0.930221046641233950, -0.930239395465124690, -0.930257741963416930, -0.930276086136065160, --0.930294427983022980, -0.930312767504244520, -0.930331104699684270, -0.930349439569296280, -0.930367772113034670, -0.930386102330853950, -0.930404430222707580, -0.930422755788550160, --0.930441079028335950, -0.930459399942018980, -0.930477718529553410, -0.930496034790893710, -0.930514348725993810, -0.930532660334808080, -0.930550969617291000, -0.930569276573396280, --0.930587581203078270, -0.930605883506291250, -0.930624183482989590, -0.930642481133127530, -0.930660776456659570, -0.930679069453539290, -0.930697360123721280, -0.930715648467160040, --0.930733934483809590, -0.930752218173624300, -0.930770499536558440, -0.930788778572566370, -0.930807055281602350, -0.930825329663620640, -0.930843601718575940, -0.930861871446421960, --0.930880138847113290, -0.930898403920604300, -0.930916666666849250, -0.930934927085802940, -0.930953185177418870, -0.930971440941651960, -0.930989694378456360, -0.931007945487786540, --0.931026194269596870, -0.931044440723841740, -0.931062684850475500, -0.931080926649452520, -0.931099166120727180, -0.931117403264254300, -0.931135638079987670, -0.931153870567881790, --0.931172100727891360, -0.931190328559970640, -0.931208554064074100, -0.931226777240156460, -0.931244998088171520, -0.931263216608074210, -0.931281432799818790, -0.931299646663359740, --0.931317858198651650, -0.931336067405648890, -0.931354274284305950, -0.931372478834577410, -0.931390681056417870, -0.931408880949781360, -0.931427078514622700, -0.931445273750896250, --0.931463466658556620, -0.931481657237558380, -0.931499845487856360, -0.931518031409404370, -0.931536215002157220, -0.931554396266069620, -0.931572575201095930, -0.931590751807190980, --0.931608926084309010, -0.931627098032404730, -0.931645267651432740, -0.931663434941347960, -0.931681599902104200, -0.931699762533656380, -0.931717922835959220, -0.931736080808967300, --0.931754236452635110, -0.931772389766917670, -0.931790540751768930, -0.931808689407143900, -0.931826835732997070, -0.931844979729283150, -0.931863121395956840, -0.931881260732972730, --0.931899397740285410, -0.931917532417849580, -0.931935664765620060, -0.931953794783551560, -0.931971922471598320, -0.931990047829715170, -0.932008170857857030, -0.932026291555978380, --0.932044409924034370, -0.932062525961979030, -0.932080639669767290, -0.932098751047354070, -0.932116860094693860, -0.932134966811741570, -0.932153071198451810, -0.932171173254779490, --0.932189272980679110, -0.932207370376105570, -0.932225465441013920, -0.932243558175358310, -0.932261648579093880, -0.932279736652175230, -0.932297822394557270, -0.932315905806194720, --0.932333986887042830, -0.932352065637055530, -0.932370142056188070, -0.932388216144395380, -0.932406287901632050, -0.932424357327853000, -0.932442424423013060, -0.932460489187067140, --0.932478551619969950, -0.932496611721676640, -0.932514669492141570, -0.932532724931319780, -0.932550778039166190, -0.932568828815635630, -0.932586877260683010, -0.932604923374263480, --0.932622967156331420, -0.932641008606841850, -0.932659047725749810, -0.932677084513010120, -0.932695118968577710, -0.932713151092407600, -0.932731180884454500, -0.932749208344673560, --0.932767233473019820, -0.932785256269447640, -0.932803276733912390, -0.932821294866369000, -0.932839310666772280, -0.932857324135077380, -0.932875335271239450, -0.932893344075212850, --0.932911350546952840, -0.932929354686414470, -0.932947356493552760, -0.932965355968322640, -0.932983353110679150, -0.933001347920577320, -0.933019340397972070, -0.933037330542818450, --0.933055318355071830, -0.933073303834686560, -0.933091286981618140, -0.933109267795821370, -0.933127246277251520, -0.933145222425863840, -0.933163196241612810, -0.933181167724453810, --0.933199136874341860, -0.933217103691232010, -0.933235068175079510, -0.933253030325839280, -0.933270990143466480, -0.933288947627916140, -0.933306902779143520, -0.933324855597103990, --0.933342806081751910, -0.933360754233042880, -0.933378700050931930, -0.933396643535374220, -0.933414584686324990, -0.933432523503739510, -0.933450459987572480, -0.933468394137779270, --0.933486325954315020, -0.933504255437135000, -0.933522182586194350, -0.933540107401448220, -0.933558029882851860, -0.933575950030360420, -0.933593867843929390, -0.933611783323513470, --0.933629696469068020, -0.933647607280548300, -0.933665515757909570, -0.933683421901107090, -0.933701325710096340, -0.933719227184832020, -0.933737126325269510, -0.933755023131364270, --0.933772917603071460, -0.933790809740346450, -0.933808699543144270, -0.933826587011420410, -0.933844472145130110, -0.933862354944228870, -0.933880235408671490, -0.933898113538413450, --0.933915989333410130, -0.933933862793616900, -0.933951733918989000, -0.933969602709482150, -0.933987469165050820, -0.934005333285650940, -0.934023195071237660, -0.934041054521766450, --0.934058911637192570, -0.934076766417471390, -0.934094618862558290, -0.934112468972408740, -0.934130316746977880, -0.934148162186221650, -0.934166005290094640, -0.934183846058552650, --0.934201684491551050, -0.934219520589045230, -0.934237354350990980, -0.934255185777342900, -0.934273014868056920, -0.934290841623088510, -0.934308666042392820, -0.934326488125925560, --0.934344307873642090, -0.934362125285497780, -0.934379940361448220, -0.934397753101448790, -0.934415563505455290, -0.934433371573422540, -0.934451177305306470, -0.934468980701062320, --0.934486781760645810, -0.934504580484012300, -0.934522376871117610, -0.934540170921916770, -0.934557962636365480, -0.934575752014419230, -0.934593539056033600, -0.934611323761164180, --0.934629106129766460, -0.934646886161795920, -0.934664663857208140, -0.934682439215959060, -0.934700212238003590, -0.934717982923297550, -0.934735751271796640, -0.934753517283456240, --0.934771280958232030, -0.934789042296080060, -0.934806801296955040, -0.934824557960813100, -0.934842312287609720, -0.934860064277300620, -0.934877813929841370, -0.934895561245187470, --0.934913306223294830, -0.934931048864118820, -0.934948789167615480, -0.934966527133739840, -0.934984262762447950, -0.935001996053695380, -0.935019727007437850, -0.935037455623630940, --0.935055181902230800, -0.935072905843192360, -0.935090627446471530, -0.935108346712024250, -0.935126063639806100, -0.935143778229772790, -0.935161490481880020, -0.935179200396083490, --0.935196907972339010, -0.935214613210602290, -0.935232316110829240, -0.935250016672975250, -0.935267714896996120, -0.935285410782847660, -0.935303104330485690, -0.935320795539866360, --0.935338484410944690, -0.935356170943676730, -0.935373855138018410, -0.935391536993925520, -0.935409216511353670, -0.935426893690258780, -0.935444568530596770, -0.935462241032323230, --0.935479911195394090, -0.935497579019765600, -0.935515244505392700, -0.935532907652231850, -0.935550568460238540, -0.935568226929368920, -0.935585883059579130, -0.935603536850824200, --0.935621188303060400, -0.935638837416243760, -0.935656484190329870, -0.935674128625274880, -0.935691770721034600, -0.935709410477564840, -0.935727047894821530, -0.935744682972760590, --0.935762315711338280, -0.935779946110509850, -0.935797574170231570, -0.935815199890459470, -0.935832823271149250, -0.935850444312256950, -0.935868063013738930, -0.935885679375550340, --0.935903293397647660, -0.935920905079986710, -0.935938514422523400, -0.935956121425214000, -0.935973726088014100, -0.935991328410880060, -0.936008928393767590, -0.936026526036633170, --0.936044121339432040, -0.936061714302120600, -0.936079304924654960, -0.936096893206991080, -0.936114479149084850, -0.936132062750892890, -0.936149644012370330, -0.936167222933473650, --0.936184799514159010, -0.936202373754382310, -0.936219945654099720, -0.936237515213267260, -0.936255082431840970, -0.936272647309777000, -0.936290209847031710, -0.936307770043560580, --0.936325327899320100, -0.936342883414266190, -0.936360436588355110, -0.936377987421542990, -0.936395535913786210, -0.936413082065040260, -0.936430625875261490, -0.936448167344406280, --0.936465706472430660, -0.936483243259290780, -0.936500777704942670, -0.936518309809342700, -0.936535839572447020, -0.936553366994211660, -0.936570892074593210, -0.936588414813547270, --0.936605935211030190, -0.936623453266998360, -0.936640968981407810, -0.936658482354215230, -0.936675993385376100, -0.936693502074847030, -0.936711008422584150, -0.936728512428543820, --0.936746014092682100, -0.936763513414955450, -0.936781010395319910, -0.936798505033731970, -0.936815997330147640, -0.936833487284523760, -0.936850974896815790, -0.936868460166980330, --0.936885943094973750, -0.936903423680752300, -0.936920901924272350, -0.936938377825490500, -0.936955851384362330, -0.936973322600844430, -0.936990791474893390, -0.937008258006465260, --0.937025722195516500, -0.937043184042003490, -0.937060643545882480, -0.937078100707109840, -0.937095555525642390, -0.937113008001435600, -0.937130458134446290, -0.937147905924630930, --0.937165351371945790, -0.937182794476347230, -0.937200235237791950, -0.937217673656235870, -0.937235109731635490, -0.937252543463947490, -0.937269974853128020, -0.937287403899133560, --0.937304830601920710, -0.937322254961445720, -0.937339676977665180, -0.937357096650535680, -0.937374513980013150, -0.937391928966054390, -0.937409341608615660, -0.937426751907653680, --0.937444159863124790, -0.937461565474985830, -0.937478968743192700, -0.937496369667702110, -0.937513768248470550, -0.937531164485454590, -0.937548558378610730, -0.937565949927895440, --0.937583339133265300, -0.937600725994676810, -0.937618110512086540, -0.937635492685451320, -0.937652872514727060, -0.937670249999870480, -0.937687625140838370, -0.937704997937587210, --0.937722368390073950, -0.937739736498254260, -0.937757102262085420, -0.937774465681523670, -0.937791826756525840, -0.937809185487048500, -0.937826541873048150, -0.937843895914481360, --0.937861247611304850, -0.937878596963475310, -0.937895943970949550, -0.937913288633683620, -0.937930630951634430, -0.937947970924758680, -0.937965308553013080, -0.937982643836354100, --0.937999976774738900, -0.938017307368123390, -0.938034635616464720, -0.938051961519719370, -0.938069285077844040, -0.938086606290795650, -0.938103925158530690, -0.938121241681005860, --0.938138555858177960, -0.938155867690004030, -0.938173177176440110, -0.938190484317443230, -0.938207789112970090, -0.938225091562977510, -0.938242391667422290, -0.938259689426261260, --0.938276984839450770, -0.938294277906947860, -0.938311568628709130, -0.938328857004691600, -0.938346143034851870, -0.938363426719146850, -0.938380708057533150, -0.938397987049967800, --0.938415263696407710, -0.938432537996809150, -0.938449809951129250, -0.938467079559324850, -0.938484346821352730, -0.938501611737169840, -0.938518874306733090, -0.938536134529998960, --0.938553392406924370, -0.938570647937466360, -0.938587901121581750, -0.938605151959227450, -0.938622400450360160, -0.938639646594936930, -0.938656890392914560, -0.938674131844249970, --0.938691370948900320, -0.938708607706821960, -0.938725842117972160, -0.938743074182307620, -0.938760303899785490, -0.938777531270362900, -0.938794756293996110, -0.938811978970642500, --0.938829199300258880, -0.938846417282802380, -0.938863632918229720, -0.938880846206498030, -0.938898057147564140, -0.938915265741385170, -0.938932471987918070, -0.938949675887120080, --0.938966877438947580, -0.938984076643357920, -0.939001273500308040, -0.939018468009754970, -0.939035660171655740, -0.939052849985967720, -0.939070037452647170, -0.939087222571651560, --0.939104405342937930, -0.939121585766463210, -0.939138763842184640, -0.939155939570059050, -0.939173112950043690, -0.939190283982095480, -0.939207452666171890, -0.939224619002229420, --0.939241782990225320, -0.939258944630116830, -0.939276103921861010, -0.939293260865414870, -0.939310415460735900, -0.939327567707780590, -0.939344717606506290, -0.939361865156870260, --0.939379010358829540, -0.939396153212341380, -0.939413293717362710, -0.939430431873850890, -0.939447567681762960, -0.939464701141056400, -0.939481832251687800, -0.939498961013614630, --0.939516087426794040, -0.939533211491183300, -0.939550333206739420, -0.939567452573420110, -0.939584569591181860, -0.939601684259982140, -0.939618796579778200, -0.939635906550527310, --0.939653014172186610, -0.939670119444713460, -0.939687222368064900, -0.939704322942198300, -0.939721421167071020, -0.939738517042640330, -0.939755610568863140, -0.939772701745696940, --0.939789790573098860, -0.939806877051026390, -0.939823961179437120, -0.939841042958287520, -0.939858122387535300, -0.939875199467137820, -0.939892274197052350, -0.939909346577236240, --0.939926416607646640, -0.939943484288241150, -0.939960549618976900, -0.939977612599811160, -0.939994673230701850, -0.940011731511605440, -0.940028787442479750, -0.940045841023282150, --0.940062892253969880, -0.940079941134500330, -0.940096987664831300, -0.940114031844919480, -0.940131073674722590, -0.940148113154198000, -0.940165150283303160, -0.940182185061995470, --0.940199217490232280, -0.940216247567970950, -0.940233275295169090, -0.940250300671784390, -0.940267323697773550, -0.940284344373094490, -0.940301362697704480, -0.940318378671561090, --0.940335392294621820, -0.940352403566844350, -0.940369412488185510, -0.940386419058603210, -0.940403423278054820, -0.940420425146497820, -0.940437424663889800, -0.940454421830188240, --0.940471416645350610, -0.940488409109334510, -0.940505399222097640, -0.940522386983596910, -0.940539372393790260, -0.940556355452635160, -0.940573336160089200, -0.940590314516109970, --0.940607290520655170, -0.940624264173681830, -0.940641235475147890, -0.940658204425010800, -0.940675171023228170, -0.940692135269757700, -0.940709097164556860, -0.940726056707583250, --0.940743013898794560, -0.940759968738148270, -0.940776921225602410, -0.940793871361113920, -0.940810819144640710, -0.940827764576140590, -0.940844707655570930, -0.940861648382889770, --0.940878586758054360, -0.940895522781022290, -0.940912456451751590, -0.940929387770199630, -0.940946316736324230, -0.940963243350083080, -0.940980167611433770, -0.940997089520334010, --0.941014009076741600, -0.941030926280614470, -0.941047841131909650, -0.941064753630585280, -0.941081663776599080, -0.941098571569908620, -0.941115477010471820, -0.941132380098246620, --0.941149280833190050, -0.941166179215260360, -0.941183075244415250, -0.941199968920612420, -0.941216860243809680, -0.941233749213964850, -0.941250635831035520, -0.941267520094979710, --0.941284402005755360, -0.941301281563319710, -0.941318158767630810, -0.941335033618646570, -0.941351906116324690, -0.941368776260623100, -0.941385644051499830, -0.941402509488912240, --0.941419372572818270, -0.941436233303175940, -0.941453091679942950, -0.941469947703077240, -0.941486801372536710, -0.941503652688279180, -0.941520501650262460, -0.941537348258444930, --0.941554192512783610, -0.941571034413236750, -0.941587873959762400, -0.941604711152318360, -0.941621545990862560, -0.941638378475353140, -0.941655208605747470, -0.941672036382003810, --0.941688861804080070, -0.941705684871934180, -0.941722505585524060, -0.941739323944807750, -0.941756139949743050, -0.941772953600288010, -0.941789764896400540, -0.941806573838039010, --0.941823380425160780, -0.941840184657724010, -0.941856986535686840, -0.941873786059007180, -0.941890583227643410, -0.941907378041552890, -0.941924170500693880, -0.941940960605024410, --0.941957748354502520, -0.941974533749086350, -0.941991316788733820, -0.942008097473402970, -0.942024875803051940, -0.942041651777638660, -0.942058425397121480, -0.942075196661458110, --0.942091965570606590, -0.942108732124525280, -0.942125496323172110, -0.942142258166505100, -0.942159017654482840, -0.942175774787062710, -0.942192529564203190, -0.942209281985862290, --0.942226032051998170, -0.942242779762568980, -0.942259525117532970, -0.942276268116847950, -0.942293008760472390, -0.942309747048364570, -0.942326482980482050, -0.942343216556783440, --0.942359947777226650, -0.942376676641770050, -0.942393403150371790, -0.942410127302990230, -0.942426849099583190, -0.942443568540108910, -0.942460285624525770, -0.942477000352791920, --0.942493712724865480, -0.942510422740704850, -0.942527130400268140, -0.942543835703513630, -0.942560538650399790, -0.942577239240884320, -0.942593937474925700, -0.942610633352482300, --0.942627326873512250, -0.942644018037974040, -0.942660706845825920, -0.942677393297025820, -0.942694077391532210, -0.942710759129303360, -0.942727438510297720, -0.942744115534473350, --0.942760790201788820, -0.942777462512202290, -0.942794132465672010, -0.942810800062156450, -0.942827465301614210, -0.942844128184003090, -0.942860788709281470, -0.942877446877408040, --0.942894102688340950, -0.942910756142038790, -0.942927407238459580, -0.942944055977561810, -0.942960702359303850, -0.942977346383644170, -0.942993988050541130, -0.943010627359953110, --0.943027264311838590, -0.943043898906155810, -0.943060531142863370, -0.943077161021919850, -0.943093788543283180, -0.943110413706911950, -0.943127036512764750, -0.943143656960799940, --0.943160275050975990, -0.943176890783251620, -0.943193504157584740, -0.943210115173934160, -0.943226723832258250, -0.943243330132515490, -0.943259934074664460, -0.943276535658663650, --0.943293134884471420, -0.943309731752046350, -0.943326326261347270, -0.943342918412332090, -0.943359508204959510, -0.943376095639188340, -0.943392680714976840, -0.943409263432283600, --0.943425843791067530, -0.943442421791286570, -0.943458997432899520, -0.943475570715864960, -0.943492141640141500, -0.943508710205687720, -0.943525276412462200, -0.943541840260423430, --0.943558401749530100, -0.943574960879741020, -0.943591517651014230, -0.943608072063308660, -0.943624624116582880, -0.943641173810795600, -0.943657721145905400, -0.943674266121871110, --0.943690808738650970, -0.943707348996203680, -0.943723886894488160, -0.943740422433462790, -0.943756955613086370, -0.943773486433317710, -0.943790014894115180, -0.943806540995437700, --0.943823064737243870, -0.943839586119492590, -0.943856105142142130, -0.943872621805151300, -0.943889136108479020, -0.943905648052083880, -0.943922157635924910, -0.943938664859960250, --0.943955169724148950, -0.943971672228449690, -0.943988172372821290, -0.944004670157222450, -0.944021165581611870, -0.944037658645948460, -0.944054149350190830, -0.944070637694297890, --0.944087123678228670, -0.944103607301941320, -0.944120088565394870, -0.944136567468548350, -0.944153044011360240, -0.944169518193789690, -0.944185990015795510, -0.944202459477336160, --0.944218926578370590, -0.944235391318857700, -0.944251853698756420, -0.944268313718025440, -0.944284771376623590, -0.944301226674510000, -0.944317679611643260, -0.944334130187982510, --0.944350578403486240, -0.944367024258113590, -0.944383467751823250, -0.944399908884574370, -0.944416347656325540, -0.944432784067036350, -0.944449218116664710, -0.944465649805170120, --0.944482079132511480, -0.944498506098647490, -0.944514930703537310, -0.944531352947139860, -0.944547772829413930, -0.944564190350318580, -0.944580605509813150, -0.944597018307855810, --0.944613428744405900, -0.944629836819422470, -0.944646242532864440, -0.944662645884690840, -0.944679046874860930, -0.944695445503333060, -0.944711841770066620, -0.944728235675020510, --0.944744627218153890, -0.944761016399425670, -0.944777403218794890, -0.944793787676220580, -0.944810169771661880, -0.944826549505077720, -0.944842926876427460, -0.944859301885669580, --0.944875674532763440, -0.944892044817668200, -0.944908412740342760, -0.944924778300746620, -0.944941141498838230, -0.944957502334576980, -0.944973860807922010, -0.944990216918832340, --0.945006570667267120, -0.945022922053185500, -0.945039271076546620, -0.945055617737309510, -0.945071962035433310, -0.945088303970877620, -0.945104643543600800, -0.945120980753562430, --0.945137315600721560, -0.945153648085037320, -0.945169978206469420, -0.945186305964976210, -0.945202631360517190, -0.945218954393051590, -0.945235275062538680, -0.945251593368937600, --0.945267909312207390, -0.945284222892307510, -0.945300534109197120, -0.945316842962835360, -0.945333149453181700, -0.945349453580194950, -0.945365755343834600, -0.945382054744059790, --0.945398351780829870, -0.945414646454104110, -0.945430938763841990, -0.945447228710002200, -0.945463516292544330, -0.945479801511427740, -0.945496084366611590, -0.945512364858055230, --0.945528642985718040, -0.945544918749559150, -0.945561192149538040, -0.945577463185614200, -0.945593731857746420, -0.945609998165894310, -0.945626262110017210, -0.945642523690074400, --0.945658782906025340, -0.945675039757829630, -0.945691294245445960, -0.945707546368834140, -0.945723796127953430, -0.945740043522763200, -0.945756288553222800, -0.945772531219291720, --0.945788771520929440, -0.945805009458095090, -0.945821245030748270, -0.945837478238848560, -0.945853709082355000, -0.945869937561227060, -0.945886163675424330, -0.945902387424906180, --0.945918608809632300, -0.945934827829561620, -0.945951044484653950, -0.945967258774868650, -0.945983470700165200, -0.945999680260502960, -0.946015887455841640, -0.946032092286140600, --0.946048294751359320, -0.946064494851457270, -0.946080692586394270, -0.946096887956129230, -0.946113080960622080, -0.946129271599832070, -0.946145459873719010, -0.946161645782242490, --0.946177829325361650, -0.946194010503036200, -0.946210189315225710, -0.946226365761889790, -0.946242539842988010, -0.946258711558479740, -0.946274880908324790, -0.946291047892482640, --0.946307212510912770, -0.946323374763575310, -0.946339534650428970, -0.946355692171433890, -0.946371847326549550, -0.946388000115735650, -0.946404150538951660, -0.946420298596157620, --0.946436444287312550, -0.946452587612376380, -0.946468728571308700, -0.946484867164069210, -0.946501003390617600, -0.946517137250913470, -0.946533268744916390, -0.946549397872586300, --0.946565524633882880, -0.946581649028765400, -0.946597771057193890, -0.946613890719127830, -0.946630008014527120, -0.946646122943351380, -0.946662235505560500, -0.946678345701113870, --0.946694453529971390, -0.946710558992092670, -0.946726662087437610, -0.946742762815965920, -0.946758861177637300, -0.946774957172411560, -0.946791050800248390, -0.946807142061107940, --0.946823230954949250, -0.946839317481732560, -0.946855401641417570, -0.946871483433963990, -0.946887562859331840, -0.946903639917480940, -0.946919714608370770, -0.946935786931961230, --0.946951856888212260, -0.946967924477083670, -0.946983989698535140, -0.947000052552526840, -0.947016113039018230, -0.947032171157969450, -0.947048226909340210, -0.947064280293090640, --0.947080331309180120, -0.947096379957568790, -0.947112426238216560, -0.947128470151083150, -0.947144511696128900, -0.947160550873313080, -0.947176587682595940, -0.947192622123937290, --0.947208654197297050, -0.947224683902635260, -0.947240711239911600, -0.947256736209086350, -0.947272758810119190, -0.947288779042970040, -0.947304796907599390, -0.947320812403966370, --0.947336825532031360, -0.947352836291754150, -0.947368844683095010, -0.947384850706013750, -0.947400854360470610, -0.947416855646424970, -0.947432854563837300, -0.947448851112667410, --0.947464845292875450, -0.947480837104421440, -0.947496826547265190, -0.947512813621366970, -0.947528798326686680, -0.947544780663184700, -0.947560760630820510, -0.947576738229554460, --0.947592713459346480, -0.947608686320156710, -0.947624656811945300, -0.947640624934672380, -0.947656590688297770, -0.947672554072781610, -0.947688515088084050, -0.947704473734165330, --0.947720430010985270, -0.947736383918504230, -0.947752335456682140, -0.947768284625479350, -0.947784231424856020, -0.947800175854771830, -0.947816117915187270, -0.947832057606062370, --0.947847994927357380, -0.947863929879032340, -0.947879862461047720, -0.947895792673363210, -0.947911720515939300, -0.947927645988736020, -0.947943569091713620, -0.947959489824832250, --0.947975408188052260, -0.947991324181333690, -0.948007237804636800, -0.948023149057921840, -0.948039057941149290, -0.948054964454278840, -0.948070868597270850, -0.948086770370085820, --0.948102669772683870, -0.948118566805025490, -0.948134461467070370, -0.948150353758779100, -0.948166243680112040, -0.948182131231029230, -0.948198016411491260, -0.948213899221458160, --0.948229779660890280, -0.948245657729748000, -0.948261533427991580, -0.948277406755581590, -0.948293277712477730, -0.948309146298640830, -0.948325012514031010, -0.948340876358608640, --0.948356737832333980, -0.948372596935167960, -0.948388453667070030, -0.948404308028000910, -0.948420160017921180, -0.948436009636790980, -0.948451856884570680, -0.948467701761220860, --0.948483544266701670, -0.948499384400973700, -0.948515222163997640, -0.948531057555733080, -0.948546890576140940, -0.948562721225181590, -0.948578549502815390, -0.948594375409002820, --0.948610198943704690, -0.948626020106880690, -0.948641838898491630, -0.948657655318497990, -0.948673469366860260, -0.948689281043538780, -0.948705090348494150, -0.948720897281686850, --0.948736701843077230, -0.948752504032626120, -0.948768303850293540, -0.948784101296040180, -0.948799896369826530, -0.948815689071613180, -0.948831479401360590, -0.948847267359029580, --0.948863052944580070, -0.948878836157972970, -0.948894616999168770, -0.948910395468128050, -0.948926171564811400, -0.948941945289179190, -0.948957716641192220, -0.948973485620810960, --0.948989252227995910, -0.949005016462708070, -0.949020778324907390, -0.949036537814554770, -0.949052294931610810, -0.949068049676036090, -0.949083802047791520, -0.949099552046837160, --0.949115299673134020, -0.949131044926642460, -0.949146787807323420, -0.949162528315137370, -0.949178266450044990, -0.949194002212007000, -0.949209735600983980, -0.949225466616936630, --0.949241195259825870, -0.949256921529611830, -0.949272645426255450, -0.949288366949717520, -0.949304086099958640, -0.949319802876939620, -0.949335517280621270, -0.949351229310963940, --0.949366938967928450, -0.949382646251475730, -0.949398351161566230, -0.949414053698161010, -0.949429753861220640, -0.949445451650705820, -0.949461147066577360, -0.949476840108796290, --0.949492530777322870, -0.949508219072118240, -0.949523904993142990, -0.949539588540357920, -0.949555269713723840, -0.949570948513202010, -0.949586624938752450, -0.949602298990336320, --0.949617970667914420, -0.949633639971447670, -0.949649306900896770, -0.949664971456222640, -0.949680633637386080, -0.949696293444347920, -0.949711950877069280, -0.949727605935510530, --0.949743258619632710, -0.949758908929396740, -0.949774556864763640, -0.949790202425694010, -0.949805845612149200, -0.949821486424089480, -0.949837124861475980, -0.949852760924269730, --0.949868394612431670, -0.949884025925922470, -0.949899654864703290, -0.949915281428734940, -0.949930905617978440, -0.949946527432394610, -0.949962146871944800, -0.949977763936589280, --0.949993378626289410, -0.950008990941006100, -0.950024600880700290, -0.950040208445333210, -0.950055813634865350, -0.950071416449258080, -0.950087016888472080, -0.950102614952468620, --0.950118210641208720, -0.950133803954653190, -0.950149394892763180, -0.950164983455499600, -0.950180569642823600, -0.950196153454696550, -0.950211734891078800, -0.950227313951931610, --0.950242890637216230, -0.950258464946893590, -0.950274036880924820, -0.950289606439271180, -0.950305173621893370, -0.950320738428752530, -0.950336300859809800, -0.950351860915026440, --0.950367418594363360, -0.950382973897781700, -0.950398526825242620, -0.950414077376707240, -0.950429625552136950, -0.950445171351492310, -0.950460714774734820, -0.950476255821825490, --0.950491794492725470, -0.950507330787396020, -0.950522864705798500, -0.950538396247893490, -0.950553925413642590, -0.950569452203006810, -0.950584976615947430, -0.950600498652425570, --0.950616018312402500, -0.950631535595839460, -0.950647050502697490, -0.950662563032938170, -0.950678073186522090, -0.950693580963410940, -0.950709086363565880, -0.950724589386948040, --0.950740090033518670, -0.950755588303239360, -0.950771084196070930, -0.950786577711974720, -0.950802068850912010, -0.950817557612844140, -0.950833043997732500, -0.950848528005538100, --0.950864009636222420, -0.950879488889746720, -0.950894965766072350, -0.950910440265160810, -0.950925912386972880, -0.950941382131470170, -0.950956849498614030, -0.950972314488365720, --0.950987777100686940, -0.951003237335538490, -0.951018695192881850, -0.951034150672678600, -0.951049603774889900, -0.951065054499477090, -0.951080502846401780, -0.951095948815625200, --0.951111392407108620, -0.951126833620813740, -0.951142272456701910, -0.951157708914734170, -0.951173142994872210, -0.951188574697077290, -0.951204004021311000, -0.951219430967534700, --0.951234855535710190, -0.951250277725798070, -0.951265697537760360, -0.951281114971558430, -0.951296530027153750, -0.951311942704507580, -0.951327353003581730, -0.951342760924337450, --0.951358166466736210, -0.951373569630739820, -0.951388970416309320, -0.951404368823406290, -0.951419764851992420, -0.951435158502029090, -0.951450549773477980, -0.951465938666300690, --0.951481325180458250, -0.951496709315912460, -0.951512091072625020, -0.951527470450557190, -0.951542847449670880, -0.951558222069927350, -0.951573594311288180, -0.951588964173715190, --0.951604331657169960, -0.951619696761613620, -0.951635059487008110, -0.951650419833314890, -0.951665777800495660, -0.951681133388512010, -0.951696486597325750, -0.951711837426898020, --0.951727185877190630, -0.951742531948165380, -0.951757875639783760, -0.951773216952007450, -0.951788555884798050, -0.951803892438117360, -0.951819226611926860, -0.951834558406188360, --0.951849887820863660, -0.951865214855914020, -0.951880539511301250, -0.951895861786987260, -0.951911181682933540, -0.951926499199102220, -0.951941814335454330, -0.951957127091951900, --0.951972437468556640, -0.951987745465230240, -0.952003051081934610, -0.952018354318631240, -0.952033655175282050, -0.952048953651848720, -0.952064249748292960, -0.952079543464576790, --0.952094834800661590, -0.952110123756509270, -0.952125410332081650, -0.952140694527340510, -0.952155976342247690, -0.952171255776765090, -0.952186532830854190, -0.952201807504476920, --0.952217079797595070, -0.952232349710170570, -0.952247617242165220, -0.952262882393540840, -0.952278145164259130, -0.952293405554282210, -0.952308663563571910, -0.952323919192089810, --0.952339172439797820, -0.952354423306657980, -0.952369671792631990, -0.952384917897681870, -0.952400161621769660, -0.952415402964856940, -0.952430641926905520, -0.952445878507877650, --0.952461112707735040, -0.952476344526439590, -0.952491573963953340, -0.952506801020238100, -0.952522025695255900, -0.952537247988968880, -0.952552467901338520, -0.952567685432326950, --0.952582900581896210, -0.952598113350008100, -0.952613323736624880, -0.952628531741708470, -0.952643737365220570, -0.952658940607123310, -0.952674141467378610, -0.952689339945948620, --0.952704536042795260, -0.952719729757880550, -0.952734921091166640, -0.952750110042615340, -0.952765296612188670, -0.952780480799849120, -0.952795662605558150, -0.952810842029277900, --0.952826019070970640, -0.952841193730598280, -0.952856366008123290, -0.952871535903507040, -0.952886703416712000, -0.952901868547700200, -0.952917031296433680, -0.952932191662874570, --0.952947349646985020, -0.952962505248727050, -0.952977658468062930, -0.952992809304954560, -0.953007957759364420, -0.953023103831254210, -0.953038247520586190, -0.953053388827322600, --0.953068527751425480, -0.953083664292857070, -0.953098798451579740, -0.953113930227555190, -0.953129059620745790, -0.953144186631113670, -0.953159311258621190, -0.953174433503230390, --0.953189553364903520, -0.953204670843602720, -0.953219785939290350, -0.953234898651928670, -0.953250008981479490, -0.953265116927905390, -0.953280222491168390, -0.953295325671230880, --0.953310426468055080, -0.953325524881603380, -0.953340620911837690, -0.953355714558720480, -0.953370805822213900, -0.953385894702280300, -0.953400981198882060, -0.953416065311981310, --0.953431147041540420, -0.953446226387521630, -0.953461303349887550, -0.953476377928599960, -0.953491450123621350, -0.953506519934914200, -0.953521587362440750, -0.953536652406163250, --0.953551715066044530, -0.953566775342046150, -0.953581833234130820, -0.953596888742261010, -0.953611941866398860, -0.953626992606506960, -0.953642040962547450, -0.953657086934482920, --0.953672130522275730, -0.953687171725888130, -0.953702210545282920, -0.953717246980421820, -0.953732281031267730, -0.953747312697782900, -0.953762341979929710, -0.953777368877670950, --0.953792393390968550, -0.953807415519785210, -0.953822435264083280, -0.953837452623825240, -0.953852467598973570, -0.953867480189490750, -0.953882490395339230, -0.953897498216481510, --0.953912503652880050, -0.953927506704497550, -0.953942507371296040, -0.953957505653238220, -0.953972501550286680, -0.953987495062403880, -0.954002486189552410, -0.954017474931694860, --0.954032461288793490, -0.954047445260810870, -0.954062426847709700, -0.954077406049452350, -0.954092382866001620, -0.954107357297319880, -0.954122329343369710, -0.954137299004113810, --0.954152266279514880, -0.954167231169534950, -0.954182193674137040, -0.954197153793283630, -0.954212111526937300, -0.954227066875060650, -0.954242019837616700, -0.954256970414567360, --0.954271918605875680, -0.954286864411504120, -0.954301807831415490, -0.954316748865572270, -0.954331687513937150, -0.954346623776472840, -0.954361557653142010, -0.954376489143907490, --0.954391418248731530, -0.954406344967577040, -0.954421269300406610, -0.954436191247183040, -0.954451110807869040, -0.954466027982427520, -0.954480942770820630, -0.954495855173011390, --0.954510765188962500, -0.954525672818636760, -0.954540578061996770, -0.954555480919005330, -0.954570381389625240, -0.954585279473819210, -0.954600175171549940, -0.954615068482780550, --0.954629959407473190, -0.954644847945590900, -0.954659734097096480, -0.954674617861952730, -0.954689499240122810, -0.954704378231568730, -0.954719254836253750, -0.954734129054140680, --0.954749000885192320, -0.954763870329371380, -0.954778737386640760, -0.954793602056963290, -0.954808464340301870, -0.954823324236619310, -0.954838181745878640, -0.954853036868042240, --0.954867889603073340, -0.954882739950934640, -0.954897587911589070, -0.954912433484999880, -0.954927276671129310, -0.954942117469940510, -0.954956955881396400, -0.954971791905460000, --0.954986625542094010, -0.955001456791261580, -0.955016285652925400, -0.955031112127048500, -0.955045936213593900, -0.955060757912524650, -0.955075577223803320, -0.955090394147393050, --0.955105208683256770, -0.955120020831357390, -0.955134830591658050, -0.955149637964121890, -0.955164442948711280, -0.955179245545389690, -0.955194045754119920, -0.955208843574865020, --0.955223639007588000, -0.955238432052252010, -0.955253222708819850, -0.955268010977254560, -0.955282796857519600, -0.955297580349577350, -0.955312361453391160, -0.955327140168924060, --0.955341916496139200, -0.955356690434999490, -0.955371461985468300, -0.955386231147508090, -0.955400997921082460, -0.955415762306154330, -0.955430524302686710, -0.955445283910642760, --0.955460041129985730, -0.955474795960678520, -0.955489548402684300, -0.955504298455966520, -0.955519046120487660, -0.955533791396211200, -0.955548534283100380, -0.955563274781118130, --0.955578012890227700, -0.955592748610392450, -0.955607481941575190, -0.955622212883739160, -0.955636941436847520, -0.955651667600863620, -0.955666391375750490, -0.955681112761471500, --0.955695831757989670, -0.955710548365268250, -0.955725262583270400, -0.955739974411959680, -0.955754683851298800, -0.955769390901251240, -0.955784095561780120, -0.955798797832848820, --0.955813497714420810, -0.955828195206458790, -0.955842890308926220, -0.955857583021786470, -0.955872273345002690, -0.955886961278538340, -0.955901646822356570, -0.955916329976420620, --0.955931010740693870, -0.955945689115139550, -0.955960365099721380, -0.955975038694401920, -0.955989709899145000, -0.956004378713913640, -0.956019045138671420, -0.956033709173381600, --0.956048370818007750, -0.956063030072512700, -0.956077686936860130, -0.956092341411013290, -0.956106993494935660, -0.956121643188590500, -0.956136290491941150, -0.956150935404951220, --0.956165577927583830, -0.956180218059802800, -0.956194855801571040, -0.956209491152852030, -0.956224124113609350, -0.956238754683806370, -0.956253382863406440, -0.956268008652373380, --0.956282632050669990, -0.956297253058260080, -0.956311871675107010, -0.956326487901174250, -0.956341101736425280, -0.956355713180823570, -0.956370322234332600, -0.956384928896915730, --0.956399533168536880, -0.956414135049158840, -0.956428734538745550, -0.956443331637260470, -0.956457926344666980, -0.956472518660928750, -0.956487108586009380, -0.956501696119872010, --0.956516281262480450, -0.956530864013798170, -0.956545444373788630, -0.956560022342415660, -0.956574597919642500, -0.956589171105432850, -0.956603741899750390, -0.956618310302558510, --0.956632876313820990, -0.956647439933501210, -0.956662001161562750, -0.956676559997969300, -0.956691116442684340, -0.956705670495672010, -0.956720222156895120, -0.956734771426317800, --0.956749318303903530, -0.956763862789615890, -0.956778404883418590, -0.956792944585275310, -0.956807481895149750, -0.956822016813005380, -0.956836549338806020, -0.956851079472515460, --0.956865607214096970, -0.956880132563514560, -0.956894655520731720, -0.956909176085712350, -0.956923694258419940, -0.956938210038818630, -0.956952723426871430, -0.956967234422542500, --0.956981743025795420, -0.956996249236594100, -0.957010753054902020, -0.957025254480683210, -0.957039753513901140, -0.957054250154519730, -0.957068744402502890, -0.957083236257814000, --0.957097725720417070, -0.957112212790275700, -0.957126697467353900, -0.957141179751615280, -0.957155659643024070, -0.957170137141543420, -0.957184612247137360, -0.957199084959769800, --0.957213555279404550, -0.957228023206005420, -0.957242488739536210, -0.957256951879960740, -0.957271412627243020, -0.957285870981346880, -0.957300326942235880, -0.957314780509874060, --0.957329231684225230, -0.957343680465253420, -0.957358126852922320, -0.957372570847196290, -0.957387012448038480, -0.957401451655413130, -0.957415888469284160, -0.957430322889615490, --0.957444754916370930, -0.957459184549514620, -0.957473611789010250, -0.957488036634821850, -0.957502459086913450, -0.957516879145249080, -0.957531296809792320, -0.957545712080507210, --0.957560124957357870, -0.957574535440308240, -0.957588943529322560, -0.957603349224364190, -0.957617752525397490, -0.957632153432386390, -0.957646551945295020, -0.957660948064087080, --0.957675341788726930, -0.957689733119178380, -0.957704122055405450, -0.957718508597372180, -0.957732892745043030, -0.957747274498381260, -0.957761653857351350, -0.957776030821917310, --0.957790405392043300, -0.957804777567693110, -0.957819147348831330, -0.957833514735421440, -0.957847879727427690, -0.957862242324814210, -0.957876602527545250, -0.957890960335584740, --0.957905315748896810, -0.957919668767445610, -0.957934019391195160, -0.957948367620110040, -0.957962713454153620, -0.957977056893290490, -0.957991397937484780, -0.958005736586700410, --0.958020072840901850, -0.958034406700053240, -0.958048738164118510, -0.958063067233061780, -0.958077393906847540, -0.958091718185439700, -0.958106040068802620, -0.958120359556900340, --0.958134676649697310, -0.958148991347157470, -0.958163303649245510, -0.958177613555924900, -0.958191921067160330, -0.958206226182916070, -0.958220528903156120, -0.958234829227844860, --0.958249127156946770, -0.958263422690425640, -0.958277715828245950, -0.958292006570371950, -0.958306294916767890, -0.958320580867398240, -0.958334864422227040, -0.958349145581218640, --0.958363424344337410, -0.958377700711547710, -0.958391974682813900, -0.958406246258099890, -0.958420515437370390, -0.958434782220589530, -0.958449046607721680, -0.958463308598731520, --0.958477568193582760, -0.958491825392240090, -0.958506080194667990, -0.958520332600830580, -0.958534582610692350, -0.958548830224217660, -0.958563075441370870, -0.958577318262116450, --0.958591558686418770, -0.958605796714242290, -0.958620032345551150, -0.958634265580309950, -0.958648496418483150, -0.958662724860035010, -0.958676950904930100, -0.958691174553133020, --0.958705395804607790, -0.958719614659319100, -0.958733831117231320, -0.958748045178309030, -0.958762256842516590, -0.958776466109818480, -0.958790672980179170, -0.958804877453563240, --0.958819079529935390, -0.958833279209259540, -0.958847476491500590, -0.958861671376622820, -0.958875863864590890, -0.958890053955369410, -0.958904241648922960, -0.958918426945215670, --0.958932609844212360, -0.958946790345877380, -0.958960968450175530, -0.958975144157071300, -0.958989317466529160, -0.959003488378513680, -0.959017656892989570, -0.959031823009921510, --0.959045986729273660, -0.959060148051010810, -0.959074306975097660, -0.959088463501498680, -0.959102617630178570, -0.959116769361102240, -0.959130918694233610, -0.959145065629537720, --0.959159210166979250, -0.959173352306522680, -0.959187492048132690, -0.959201629391774000, -0.959215764337411290, -0.959229896885009150, -0.959244027034532270, -0.959258154785945560, --0.959272280139213170, -0.959286403094300130, -0.959300523651171020, -0.959314641809790650, -0.959328757570123920, -0.959342870932135110, -0.959356981895789110, -0.959371090461050620, --0.959385196627884350, -0.959399300396255090, -0.959413401766127660, -0.959427500737466740, -0.959441597310237040, -0.959455691484403240, -0.959469783259930600, -0.959483872636783250, --0.959497959614926120, -0.959512044194324120, -0.959526126374942060, -0.959540206156744620, -0.959554283539696960, -0.959568358523763320, -0.959582431108908840, -0.959596501295098210, --0.959610569082296360, -0.959624634470468090, -0.959638697459578300, -0.959652758049591710, -0.959666816240473230, -0.959680872032187880, -0.959694925424700140, -0.959708976417975150, --0.959723025011977700, -0.959737071206672620, -0.959751115002024920, -0.959765156397999640, -0.959779195394561360, -0.959793231991674880, -0.959807266189305450, -0.959821297987417890, --0.959835327385976990, -0.959849354384947780, -0.959863378984295300, -0.959877401183984240, -0.959891420983979950, -0.959905438384246910, -0.959919453384750270, -0.959933465985454930, --0.959947476186326030, -0.959961483987328280, -0.959975489388427250, -0.959989492389587080, -0.960003492990773370, -0.960017491191950790, -0.960031486993084490, -0.960045480394139510, --0.960059471395080850, -0.960073459995873460, -0.960087446196482450, -0.960101429996872760, -0.960115411397009840, -0.960129390396858070, -0.960143366996382920, -0.960157341195549300, --0.960171312994322350, -0.960185282392667320, -0.960199249390548790, -0.960213213987932250, -0.960227176184782590, -0.960241135981064970, -0.960255093376744640, -0.960269048371786500, --0.960283000966155710, -0.960296951159817500, -0.960310898952736800, -0.960324844344879190, -0.960338787336209250, -0.960352727926692240, -0.960366666116293400, -0.960380601904977980, --0.960394535292711020, -0.960408466279457970, -0.960422394865183550, -0.960436321049853100, -0.960450244833431890, -0.960464166215885040, -0.960478085197177700, -0.960492001777275230, --0.960505915956142760, -0.960519827733745560, -0.960533737110048860, -0.960547644085017690, -0.960561548658617430, -0.960575450830813300, -0.960589350601570470, -0.960603247970854280, --0.960617142938630320, -0.960631035504863060, -0.960644925669518420, -0.960658813432561320, -0.960672698793957220, -0.960686581753671390, -0.960700462311669170, -0.960714340467915710, --0.960728216222376470, -0.960742089575016830, -0.960755960525801810, -0.960769829074696880, -0.960783695221667290, -0.960797558966678510, -0.960811420309695910, -0.960825279250684950, --0.960839135789610550, -0.960852989926438310, -0.960866841661133560, -0.960880690993661690, -0.960894537923988160, -0.960908382452078320, -0.960922224577897440, -0.960936064301410990, --0.960949901622584420, -0.960963736541383340, -0.960977569057772760, -0.960991399171718160, -0.961005226883185020, -0.961019052192138900, -0.961032875098545400, -0.961046695602369440, --0.961060513703576700, -0.961074329402132670, -0.961088142698002910, -0.961101953591152690, -0.961115762081547700, -0.961129568169153180, -0.961143371853934840, -0.961157173135858020, --0.961170972014888550, -0.961184768490991330, -0.961198562564132280, -0.961212354234276760, -0.961226143501390350, -0.961239930365438640, -0.961253714826387330, -0.961267496884201430, --0.961281276538846870, -0.961295053790289120, -0.961308828638493650, -0.961322601083426150, -0.961336371125052210, -0.961350138763337300, -0.961363903998247000, -0.961377666829747230, --0.961391427257803020, -0.961405185282380280, -0.961418940903444600, -0.961432694120961440, -0.961446444934896730, -0.961460193345216040, -0.961473939351884630, -0.961487682954868310, --0.961501424154132870, -0.961515162949643900, -0.961528899341366980, -0.961542633329267820, -0.961556364913312090, -0.961570094093465390, -0.961583820869693740, -0.961597545241962280, --0.961611267210236930, -0.961624986774483490, -0.961638703934667550, -0.961652418690754800, -0.961666131042711260, -0.961679840990502190, -0.961693548534093500, -0.961707253673451000, --0.961720956408540270, -0.961734656739327230, -0.961748354665777460, -0.961762050187856880, -0.961775743305531170, -0.961789434018766040, -0.961803122327527630, -0.961816808231781170, --0.961830491731492600, -0.961844172826627930, -0.961857851517152750, -0.961871527803033200, -0.961885201684234640, -0.961898873160722980, -0.961912542232464250, -0.961926208899424040, --0.961939873161568370, -0.961953535018863050, -0.961967194471273880, -0.961980851518766670, -0.961994506161307330, -0.962008158398862000, -0.962021808231396050, -0.962035455658875600, --0.962049100681266480, -0.962062743298534580, -0.962076383510645840, -0.962090021317566380, -0.962103656719261680, -0.962117289715697770, -0.962130920306840660, -0.962144548492656290, --0.962158174273110460, -0.962171797648169290, -0.962185418617798600, -0.962199037181964310, -0.962212653340632770, -0.962226267093769240, -0.962239878441340070, -0.962253487383311290, --0.962267093919648710, -0.962280698050318460, -0.962294299775286580, -0.962307899094518860, -0.962321496007981340, -0.962335090515640030, -0.962348682617460980, -0.962362272313410320, --0.962375859603453950, -0.962389444487557920, -0.962403026965688250, -0.962416607037811290, -0.962430184703892520, -0.962443759963898420, -0.962457332817794780, -0.962470903265547850, --0.962484471307123670, -0.962498036942488590, -0.962511600171608080, -0.962525160994448630, -0.962538719410976350, -0.962552275421157180, -0.962565829024957350, -0.962579380222342910, --0.962592929013280090, -0.962606475397734920, -0.962620019375673540, -0.962633560947062320, -0.962647100111867050, -0.962660636870053990, -0.962674171221589270, -0.962687703166439150, --0.962701232704570090, -0.962714759835947680, -0.962728284560538380, -0.962741806878308350, -0.962755326789223710, -0.962768844293250940, -0.962782359390355950, -0.962795872080504990, --0.962809382363664420, -0.962822890239800500, -0.962836395708879470, -0.962849898770867240, -0.962863399425730290, -0.962876897673434760, -0.962890393513947120, -0.962903886947233610, --0.962917377973260160, -0.962930866591993340, -0.962944352803399290, -0.962957836607444380, -0.962971318004094970, -0.962984796993317070, -0.962998273575077390, -0.963011747749341840, --0.963025219516077000, -0.963038688875249350, -0.963052155826824800, -0.963065620370769810, -0.963079082507050770, -0.963092542235634010, -0.963105999556485900, -0.963119454469573030, --0.963132906974861310, -0.963146357072317330, -0.963159804761907430, -0.963173250043597990, -0.963186692917355480, -0.963200133383146140, -0.963213571440936560, -0.963227007090692980, --0.963240440332382210, -0.963253871165970050, -0.963267299591423210, -0.963280725608708140, -0.963294149217791330, -0.963307570418639010, -0.963320989211218110, -0.963334405595494440, --0.963347819571434780, -0.963361231139005510, -0.963374640298173210, -0.963388047048904350, -0.963401451391165400, -0.963414853324922720, -0.963428252850142890, -0.963441649966792490, --0.963455044674838220, -0.963468436974246110, -0.963481826864982850, -0.963495214347015020, -0.963508599420309200, -0.963521982084832200, -0.963535362340549820, -0.963548740187429200, --0.963562115625436590, -0.963575488654538790, -0.963588859274702280, -0.963602227485893530, -0.963615593288079220, -0.963628956681226060, -0.963642317665300400, -0.963655676240269150, --0.963669032406098580, -0.963682386162755370, -0.963695737510206210, -0.963709086448417680, -0.963722432977356600, -0.963735777096989320, -0.963749118807282650, -0.963762458108203050, --0.963775794999717330, -0.963789129481792180, -0.963802461554394200, -0.963815791217490060, -0.963829118471046350, -0.963842443315029880, -0.963855765749407680, -0.963869085774145650, --0.963882403389211050, -0.963895718594570350, -0.963909031390190350, -0.963922341776037860, -0.963935649752079680, -0.963948955318282060, -0.963962258474612140, -0.963975559221036620, --0.963988857557522170, -0.964002153484035620, -0.964015447000543650, -0.964028738107012950, -0.964042026803410560, -0.964055313089703270, -0.964068596965857450, -0.964081878431840230, --0.964095157487618200, -0.964108434133158280, -0.964121708368427370, -0.964134980193392390, -0.964148249608019700, -0.964161516612276340, -0.964174781206129320, -0.964188043389545220, --0.964201303162491090, -0.964214560524933710, -0.964227815476839890, -0.964241068018176550, -0.964254318148910720, -0.964267565869008860, -0.964280811178438110, -0.964294054077165400, --0.964307294565157510, -0.964320532642381380, -0.964333768308804130, -0.964347001564392240, -0.964360232409112840, -0.964373460842932960, -0.964386686865819300, -0.964399910477738990, --0.964413131678658830, -0.964426350468545970, -0.964439566847367090, -0.964452780815089340, -0.964465992371679960, -0.964479201517105310, -0.964492408251332640, -0.964505612574328870, --0.964518814486061250, -0.964532013986496680, -0.964545211075601870, -0.964558405753344060, -0.964571598019690280, -0.964584787874607440, -0.964597975318062680, -0.964611160350022920, --0.964624342970455300, -0.964637523179326830, -0.964650700976604550, -0.964663876362255700, -0.964677049336246980, -0.964690219898545640, -0.964703388049118700, -0.964716553787933310, --0.964729717114956590, -0.964742878030155790, -0.964756036533497510, -0.964769192624949200, -0.964782346304477790, -0.964795497572050630, -0.964808646427634750, -0.964821792871197180, --0.964834936902705160, -0.964848078522125840, -0.964861217729426460, -0.964874354524573820, -0.964887488907535400, -0.964900620878278100, -0.964913750436769410, -0.964926877582976240, --0.964940002316866160, -0.964953124638405770, -0.964966244547562630, -0.964979362044303900, -0.964992477128596700, -0.965005589800408290, -0.965018700059706020, -0.965031807906456930, --0.965044913340628360, -0.965058016362187690, -0.965071116971101710, -0.965084215167338000, -0.965097310950863820, -0.965110404321646190, -0.965123495279652690, -0.965136583824850680, --0.965149669957206860, -0.965162753676689020, -0.965175834983264200, -0.965188913876899870, -0.965201990357563160, -0.965215064425221540, -0.965228136079842150, -0.965241205321392570, --0.965254272149839940, -0.965267336565151850, -0.965280398567295080, -0.965293458156237460, -0.965306515331946110, -0.965319570094388510, -0.965332622443532240, -0.965345672379344100, --0.965358719901791900, -0.965371765010842760, -0.965384807706464290, -0.965397847988623830, -0.965410885857288740, -0.965423921312426380, -0.965436954354004230, -0.965449984981989750, --0.965463013196350420, -0.965476038997053480, -0.965489062384066400, -0.965502083357356540, -0.965515101916891600, -0.965528118062638830, -0.965541131794566130, -0.965554143112640210, --0.965567152016829080, -0.965580158507099990, -0.965593162583420430, -0.965606164245758070, -0.965619163494080280, -0.965632160328354530, -0.965645154748548510, -0.965658146754629690, --0.965671136346565320, -0.965684123524323090, -0.965697108287870590, -0.965710090637175280, -0.965723070572204860, -0.965736048092926900, -0.965749023199308550, -0.965761995891317730, --0.965774966168921890, -0.965787934032088620, -0.965800899480785510, -0.965813862514980140, -0.965826823134640190, -0.965839781339733140, -0.965852737130226790, -0.965865690506088500, --0.965878641467285860, -0.965891590013786660, -0.965904536145558490, -0.965917479862569040, -0.965930421164786110, -0.965943360052176850, -0.965956296524709160, -0.965969230582350740, --0.965982162225069270, -0.965995091452832470, -0.966008018265607890, -0.966020942663363250, -0.966033864646066220, -0.966046784213684510, -0.966059701366186130, -0.966072616103538230, --0.966085528425708830, -0.966098438332665620, -0.966111345824376300, -0.966124250900808780, -0.966137153561930530, -0.966150053807709350, -0.966162951638112940, -0.966175847053109220, --0.966188740052665860, -0.966201630636750690, -0.966214518805331490, -0.966227404558375860, -0.966240287895851810, -0.966253168817727270, -0.966266047323969590, -0.966278923414546800, --0.966291797089426590, -0.966304668348576980, -0.966317537191965670, -0.966330403619560800, -0.966343267631329610, -0.966356129227240350, -0.966368988407260710, -0.966381845171358610, --0.966394699519501850, -0.966407551451658350, -0.966420400967796020, -0.966433248067882670, -0.966446092751886420, -0.966458935019774760, -0.966471774871515700, -0.966484612307077270, --0.966497447326427280, -0.966510279929533640, -0.966523110116364490, -0.966535937886887410, -0.966548763241070530, -0.966561586178881660, -0.966574406700288820, -0.966587224805259940, --0.966600040493763140, -0.966612853765766110, -0.966625664621237000, -0.966638473060143940, -0.966651279082454410, -0.966664082688136750, -0.966676883877158890, -0.966689682649488850, --0.966702479005094540, -0.966715272943944330, -0.966728064466005680, -0.966740853571246840, -0.966753640259635840, -0.966766424531140810, -0.966779206385729670, -0.966791985823370560, --0.966804762844031380, -0.966817537447680400, -0.966830309634285510, -0.966843079403815200, -0.966855846756236810, -0.966868611691518940, -0.966881374209629390, -0.966894134310536500, --0.966906891994208540, -0.966919647260613080, -0.966932400109718480, -0.966945150541492880, -0.966957898555904420, -0.966970644152921220, -0.966983387332511430, -0.966996128094643080, --0.967008866439284520, -0.967021602366403780, -0.967034335875969210, -0.967047066967948620, -0.967059795642310260, -0.967072521899022490, -0.967085245738053430, -0.967097967159371240, --0.967110686162944380, -0.967123402748740530, -0.967136116916728290, -0.967148828666875680, -0.967161537999150940, -0.967174244913522440, -0.967186949409958310, -0.967199651488426790, --0.967212351148896140, -0.967225048391334830, -0.967237743215710650, -0.967250435621992200, -0.967263125610147600, -0.967275813180145110, -0.967288498331953180, -0.967301181065540310, --0.967313861380874160, -0.967326539277923340, -0.967339214756656180, -0.967351887817041070, -0.967364558459046120, -0.967377226682639810, -0.967389892487790500, -0.967402555874466440, --0.967415216842636210, -0.967427875392267710, -0.967440531523329430, -0.967453185235789940, -0.967465836529617480, -0.967478485404780320, -0.967491131861247240, -0.967503775898986170, --0.967516417517965580, -0.967529056718154030, -0.967541693499519790, -0.967554327862031220, -0.967566959805656990, -0.967579589330365250, -0.967592216436124590, -0.967604841122903350, --0.967617463390670230, -0.967630083239393370, -0.967642700669041120, -0.967655315679582180, -0.967667928270985020, -0.967680538443218110, -0.967693146196249800, -0.967705751530048560, --0.967718354444582870, -0.967730954939821420, -0.967743553015732450, -0.967756148672284660, -0.967768741909446510, -0.967781332727186470, -0.967793921125473130, -0.967806507104275290, --0.967819090663560870, -0.967831671803298770, -0.967844250523457350, -0.967856826824005420, -0.967869400704911450, -0.967881972166144130, -0.967894541207671710, -0.967907107829462990, --0.967919672031486320, -0.967932233813710630, -0.967944793176104270, -0.967957350118636040, -0.967969904641274300, -0.967982456743987860, -0.967995006426745520, -0.968007553689515410, --0.968020098532266450, -0.968032640954967220, -0.968045180957586400, -0.968057718540092590, -0.968070253702454700, -0.968082786444640960, -0.968095316766620310, -0.968107844668361310, --0.968120370149832770, -0.968132893211003260, -0.968145413851841500, -0.968157932072316260, -0.968170447872396140, -0.968182961252050170, -0.968195472211246580, -0.968207980749954180, --0.968220486868141990, -0.968232990565778500, -0.968245491842832600, -0.968257990699273100, -0.968270487135068470, -0.968282981150187630, -0.968295472744599260, -0.968307961918272290, --0.968320448671175390, -0.968332933003277270, -0.968345414914546950, -0.968357894404953010, -0.968370371474464360, -0.968382846123050030, -0.968395318350678380, -0.968407788157318430, --0.968420255542938980, -0.968432720507508950, -0.968445183050997250, -0.968457643173372460, -0.968470100874603500, -0.968482556154659280, -0.968495009013508710, -0.968507459451120600, --0.968519907467463750, -0.968532353062507290, -0.968544796236219920, -0.968557236988570440, -0.968569675319528200, -0.968582111229061570, -0.968594544717139570, -0.968606975783731230, --0.968619404428805450, -0.968631830652331270, -0.968644254454277600, -0.968656675834613120, -0.968669094793306980, -0.968681511330328090, -0.968693925445645370, -0.968706337139227940, --0.968718746411044500, -0.968731153261064290, -0.968743557689256240, -0.968755959695589470, -0.968768359280032580, -0.968780756442554900, -0.968793151183125150, -0.968805543501712660, --0.968817933398286260, -0.968830320872815180, -0.968842705925268220, -0.968855088555614420, -0.968867468763822900, -0.968879846549862700, -0.968892221913702830, -0.968904594855312550, --0.968916965374660650, -0.968929333471716390, -0.968941699146449010, -0.968954062398827200, -0.968966423228820210, -0.968978781636397170, -0.968991137621527110, -0.969003491184179280, --0.969015842324322920, -0.969028191041926720, -0.969040537336960050, -0.969052881209392040, -0.969065222659191820, -0.969077561686328530, -0.969089898290771410, -0.969102232472489500, --0.969114564231452040, -0.969126893567628040, -0.969139220480987220, -0.969151544971498020, -0.969163867039129930, -0.969176186683852190, -0.969188503905634050, -0.969200818704444860, --0.969213131080253310, -0.969225441033028990, -0.969237748562741140, -0.969250053669358790, -0.969262356352851410, -0.969274656613188010, -0.969286954450338080, -0.969299249864270740, --0.969311542854955350, -0.969323833422361170, -0.969336121566457320, -0.969348407287213050, -0.969360690584597840, -0.969372971458580920, -0.969385249909131550, -0.969397525936219310, --0.969409799539812990, -0.969422070719882180, -0.969434339476396120, -0.969446605809324290, -0.969458869718635930, -0.969471131204300400, -0.969483390266287050, -0.969495646904565240, --0.969507901119104450, -0.969520152909873810, -0.969532402276842680, -0.969544649219980630, -0.969556893739256910, -0.969569135834640990, -0.969581375506102460, -0.969593612753610220, --0.969605847577133970, -0.969618079976643070, -0.969630309952106970, -0.969642537503495160, -0.969654762630776990, -0.969666985333921930, -0.969679205612899330, -0.969691423467679000, --0.969703638898229860, -0.969715851904521590, -0.969728062486523770, -0.969740270644205760, -0.969752476377537030, -0.969764679686487390, -0.969776880571025850, -0.969789079031122100, --0.969801275066745630, -0.969813468677865890, -0.969825659864452570, -0.969837848626475150, -0.969850034963902980, -0.969862218876705870, -0.969874400364853060, -0.969886579428314580, --0.969898756067059330, -0.969910930281057350, -0.969923102070277880, -0.969935271434690720, -0.969947438374265670, -0.969959602888971760, -0.969971764978778790, -0.969983924643656460, --0.969996081883574330, -0.970008236698501890, -0.970020389088408930, -0.970032539053265030, -0.970044686593039770, -0.970056831707702850, -0.970068974397223950, -0.970081114661572430, --0.970093252500718210, -0.970105387914630750, -0.970117520903279850, -0.970129651466635210, -0.970141779604666520, -0.970153905317343360, -0.970166028604635300, -0.970178149466512150, --0.970190267902943710, -0.970202383913899570, -0.970214497499349400, -0.970226608659263130, -0.970238717393610230, -0.970250823702360820, -0.970262927585484050, -0.970275029042950040, --0.970287128074728500, -0.970299224680789000, -0.970311318861101560, -0.970323410615635980, -0.970335499944361630, -0.970347586847248640, -0.970359671324266590, -0.970371753375385390, --0.970383833000574740, -0.970395910199804650, -0.970407984973044700, -0.970420057320264710, -0.970432127241434910, -0.970444194736524550, -0.970456259805503650, -0.970468322448342140, --0.970480382665009910, -0.970492440455476670, -0.970504495819712430, -0.970516548757686890, -0.970528599269369850, -0.970540647354731440, -0.970552693013741360, -0.970564736246369520, --0.970576777052585830, -0.970588815432360200, -0.970600851385662540, -0.970612884912462780, -0.970624916012731040, -0.970636944686436800, -0.970648970933550180, -0.970660994754041110, --0.970673016147879490, -0.970685035115035680, -0.970697051655479040, -0.970709065769179700, -0.970721077456107690, -0.970733086716233040, -0.970745093549525650, -0.970757097955955550, --0.970769099935492760, -0.970781099488107090, -0.970793096613768780, -0.970805091312447850, -0.970817083584114120, -0.970829073428737590, -0.970841060846288300, -0.970853045836736480, --0.970865028400052180, -0.970877008536205180, -0.970888986245165620, -0.970900961526903530, -0.970912934381389150, -0.970924904808592390, -0.970936872808483290, -0.970948838381032080, --0.970960801526208780, -0.970972762243983430, -0.970984720534326500, -0.970996676397207440, -0.971008629832596730, -0.971020580840464500, -0.971032529420780670, -0.971044475573515700, --0.971056419298639620, -0.971068360596122340, -0.971080299465934100, -0.971092235908045160, -0.971104169922425650, -0.971116101509045700, -0.971128030667875450, -0.971139957398885150, --0.971151881702045030, -0.971163803577325350, -0.971175723024695900, -0.971187640044127280, -0.971199554635589490, -0.971211466799052790, -0.971223376534487430, -0.971235283841863860, --0.971247188721151790, -0.971259091172321900, -0.971270991195344210, -0.971282888790188980, -0.971294783956826560, -0.971306676695227190, -0.971318567005361120, -0.971330454887198710, --0.971342340340710320, -0.971354223365865850, -0.971366103962635900, -0.971377982130990580, -0.971389857870900380, -0.971401731182335530, -0.971413602065266500, -0.971425470519663330, --0.971437336545496470, -0.971449200142736170, -0.971461061311353010, -0.971472920051317130, -0.971484776362598890, -0.971496630245168860, -0.971508481698997170, -0.971520330724054190, --0.971532177320310720, -0.971544021487736550, -0.971555863226302390, -0.971567702535978460, -0.971579539416735360, -0.971591373868543660, -0.971603205891373170, -0.971615035485194790, --0.971626862649978770, -0.971638687385695590, -0.971650509692315700, -0.971662329569809580, -0.971674147018147580, -0.971685962037300180, -0.971697774627237940, -0.971709584787931460, --0.971721392519350860, -0.971733197821466720, -0.971745000694249630, -0.971756801137669930, -0.971768599151698330, -0.971780394736305400, -0.971792187891461270, -0.971803978617136740, --0.971815766913302180, -0.971827552779928270, -0.971839336216985370, -0.971851117224444280, -0.971862895802275250, -0.971874671950449080, -0.971886445668936450, -0.971898216957707390, --0.971909985816732940, -0.971921752245983430, -0.971933516245429560, -0.971945277815041810, -0.971957036954791190, -0.971968793664647720, -0.971980547944582330, -0.971992299794565470, --0.972004049214567960, -0.972015796204560250, -0.972027540764513140, -0.972039282894397120, -0.972051022594182860, -0.972062759863841270, -0.972074494703342620, -0.972086227112657690, --0.972097957091757170, -0.972109684640611870, -0.972121409759192260, -0.972133132447469350, -0.972144852705413400, -0.972156570532995310, -0.972168285930185780, -0.972179998896955610, --0.972191709433275380, -0.972203417539115880, -0.972215123214447920, -0.972226826459242080, -0.972238527273469160, -0.972250225657100180, -0.972261921610105380, -0.972273615132455800, --0.972285306224122130, -0.972296994885075260, -0.972308681115286120, -0.972320364914725070, -0.972332046283363010, -0.972343725221170960, -0.972355401728119520, -0.972367075804179580, --0.972378747449321960, -0.972390416663517550, -0.972402083446736950, -0.972413747798951290, -0.972425409720131360, -0.972437069210247750, -0.972448726269271480, -0.972460380897173350, --0.972472033093924270, -0.972483682859495160, -0.972495330193857030, -0.972506975096980360, -0.972518617568836290, -0.972530257609395600, -0.972541895218629330, -0.972553530396508270, --0.972565163143003450, -0.972576793458085680, -0.972588421341725850, -0.972600046793895330, -0.972611669814564370, -0.972623290403704320, -0.972634908561285980, -0.972646524287280380, --0.972658137581658530, -0.972669748444391470, -0.972681356875449880, -0.972692962874804780, -0.972704566442427420, -0.972716167578288600, -0.972727766282359350, -0.972739362554610690, --0.972750956395013630, -0.972762547803539210, -0.972774136780158560, -0.972785723324842370, -0.972797307437561880, -0.972808889118288110, -0.972820468366992210, -0.972832045183645080, --0.972843619568217970, -0.972855191520681670, -0.972866761041007440, -0.972878328129166300, -0.972889892785129270, -0.972901455008867490, -0.972913014800352190, -0.972924572159554300, --0.972936127086444950, -0.972947679580995260, -0.972959229643176600, -0.972970777272959660, -0.972982322470315800, -0.972993865235216140, -0.973005405567631820, -0.973016943467534200, --0.973028478934893970, -0.973040011969682590, -0.973051542571871210, -0.973063070741430950, -0.973074596478332940, -0.973086119782548440, -0.973097640654048690, -0.973109159092804820, --0.973120675098788080, -0.973132188671969930, -0.973143699812320960, -0.973155208519812850, -0.973166714794416630, -0.973178218636103650, -0.973189720044845160, -0.973201219020612520, --0.973212715563376740, -0.973224209673109080, -0.973235701349780880, -0.973247190593363510, -0.973258677403828100, -0.973270161781146000, -0.973281643725288470, -0.973293123236226850, --0.973304600313932620, -0.973316074958376800, -0.973327547169530630, -0.973339016947365690, -0.973350484291853220, -0.973361949202964480, -0.973373411680671040, -0.973384871724943920, --0.973396329335754600, -0.973407784513074530, -0.973419237256874960, -0.973430687567127250, -0.973442135443802870, -0.973453580886873170, -0.973465023896309510, -0.973476464472083470, --0.973487902614166070, -0.973499338322528880, -0.973510771597143390, -0.973522202437980930, -0.973533630845012990, -0.973545056818211130, -0.973556480357546490, -0.973567901462990660, --0.973579320134515090, -0.973590736372091150, -0.973602150175690410, -0.973613561545284220, -0.973624970480844290, -0.973636376982341730, -0.973647781049748360, -0.973659182683035750, --0.973670581882174920, -0.973681978647137680, -0.973693372977895490, -0.973704764874419810, -0.973716154336682460, -0.973727541364654560, -0.973738925958307800, -0.973750308117613650, --0.973761687842543800, -0.973773065133069720, -0.973784439989162980, -0.973795812410795160, -0.973807182397937730, -0.973818549950562380, -0.973829915068640920, -0.973841277752144350, --0.973852638001044710, -0.973863995815313350, -0.973875351194922080, -0.973886704139842460, -0.973898054650046310, -0.973909402725504750, -0.973920748366189690, -0.973932091572072720, --0.973943432343125530, -0.973954770679319790, -0.973966106580627210, -0.973977440047019250, -0.973988771078467710, -0.974000099674944500, -0.974011425836420750, -0.974022749562868500, --0.974034070854259300, -0.974045389710565090, -0.974056706131757210, -0.974068020117807910, -0.974079331668688320, -0.974090640784370350, -0.974101947464825810, -0.974113251710026380, --0.974124553519943870, -0.974135852894549960, -0.974147149833816450, -0.974158444337715030, -0.974169736406217620, -0.974181026039295790, -0.974192313236921350, -0.974203597999066080, --0.974214880325701920, -0.974226160216800530, -0.974237437672333950, -0.974248712692273530, -0.974259985276591300, -0.974271255425259160, -0.974282523138248810, -0.974293788415532270, --0.974305051257081220, -0.974316311662867470, -0.974327569632863040, -0.974338825167039620, -0.974350078265369350, -0.974361328927823680, -0.974372577154374750, -0.974383822944994260, --0.974395066299654330, -0.974406307218326880, -0.974417545700983490, -0.974428781747596170, -0.974440015358136960, -0.974451246532577750, -0.974462475270890360, -0.974473701573046800, --0.974484925439018990, -0.974496146868778830, -0.974507365862298360, -0.974518582419549580, -0.974529796540504200, -0.974541008225134340, -0.974552217473412030, -0.974563424285309070, --0.974574628660797580, -0.974585830599849710, -0.974597030102437030, -0.974608227168531900, -0.974619421798106120, -0.974630613991131820, -0.974641803747580910, -0.974652991067425530, --0.974664175950637700, -0.974675358397189440, -0.974686538407052880, -0.974697715980199940, -0.974708891116602530, -0.974720063816233000, -0.974731234079063370, -0.974742401905065560, --0.974753567294211920, -0.974764730246474250, -0.974775890761824690, -0.974787048840235480, -0.974798204481678530, -0.974809357686126200, -0.974820508453550390, -0.974831656783923250, --0.974842802677217120, -0.974853946133404040, -0.974865087152456010, -0.974876225734345180, -0.974887361879043900, -0.974898495586524080, -0.974909626856758080, -0.974920755689718250, --0.974931882085376290, -0.974943006043704650, -0.974954127564675480, -0.974965246648261010, -0.974976363294433380, -0.974987477503164830, -0.974998589274427620, -0.975009698608193980, --0.975020805504436040, -0.975031909963126280, -0.975043011984236600, -0.975054111567739360, -0.975065208713606800, -0.975076303421811290, -0.975087395692325170, -0.975098485525120460, --0.975109572920169420, -0.975120657877444510, -0.975131740396917860, -0.975142820478561930, -0.975153898122348980, -0.975164973328251250, -0.975176046096241090, -0.975187116426290860, --0.975198184318373020, -0.975209249772459490, -0.975220312788522840, -0.975231373366535430, -0.975242431506469500, -0.975253487208297630, -0.975264540471992180, -0.975275591297525170, --0.975286639684869170, -0.975297685633996550, -0.975308729144879760, -0.975319770217491170, -0.975330808851803120, -0.975341845047787980, -0.975352878805418320, -0.975363910124666720, --0.975374939005504980, -0.975385965447906010, -0.975396989451842170, -0.975408011017285690, -0.975419030144209280, -0.975430046832585500, -0.975441061082386480, -0.975452072893584710, --0.975463082266152750, -0.975474089200063070, -0.975485093695288240, -0.975496095751800630, -0.975507095369572810, -0.975518092548577240, -0.975529087288786620, -0.975540079590173080, --0.975551069452709420, -0.975562056876367990, -0.975573041861121480, -0.975584024406942360, -0.975595004513803320, -0.975605982181676600, -0.975616957410535000, -0.975627930200350880, --0.975638900551097030, -0.975649868462745930, -0.975660833935270030, -0.975671796968642150, -0.975682757562834850, -0.975693715717820490, -0.975704671433572200, -0.975715624710061900, --0.975726575547262610, -0.975737523945146900, -0.975748469903687350, -0.975759413422856770, -0.975770354502627500, -0.975781293142972350, -0.975792229343864000, -0.975803163105275040, --0.975814094427178260, -0.975825023309546120, -0.975835949752351440, -0.975846873755567000, -0.975857795319165280, -0.975868714443119290, -0.975879631127401280, -0.975890545371984160, --0.975901457176840850, -0.975912366541943690, -0.975923273467265710, -0.975934177952779810, -0.975945079998458140, -0.975955979604273830, -0.975966876770199670, -0.975977771496208120, --0.975988663782272340, -0.975999553628364770, -0.976010441034458330, -0.976021326000525820, -0.976032208526540160, -0.976043088612473800, -0.976053966258299770, -0.976064841463990750, --0.976075714229519660, -0.976086584554859300, -0.976097452439982690, -0.976108317884862190, -0.976119180889470920, -0.976130041453781680, -0.976140899577767400, -0.976151755261400860, --0.976162608504654860, -0.976173459307502430, -0.976184307669916260, -0.976195153591869590, -0.976205997073334770, -0.976216838114285060, -0.976227676714693240, -0.976238512874532120, --0.976249346593774820, -0.976260177872394270, -0.976271006710363150, -0.976281833107654480, -0.976292657064241290, -0.976303478580096360, -0.976314297655192730, -0.976325114289503420, --0.976335928483001330, -0.976346740235659370, -0.976357549547450580, -0.976368356418348180, -0.976379160848324660, -0.976389962837353130, -0.976400762385406850, -0.976411559492458610, --0.976422354158481550, -0.976433146383448580, -0.976443936167332600, -0.976454723510106870, -0.976465508411744400, -0.976476290872217990, -0.976487070891501000, -0.976497848469566220, --0.976508623606386910, -0.976519396301935960, -0.976530166556186740, -0.976540934369111930, -0.976551699740684790, -0.976562462670878430, -0.976573223159665880, -0.976583981207020280, --0.976594736812914870, -0.976605489977322440, -0.976616240700216350, -0.976626988981569630, -0.976637734821355410, -0.976648478219546810, -0.976659219176117090, -0.976669957691039370, --0.976680693764286680, -0.976691427395832480, -0.976702158585649460, -0.976712887333711090, -0.976723613639990500, -0.976734337504460930, -0.976745058927095400, -0.976755777907867500, --0.976766494446749900, -0.976777208543716080, -0.976787920198739280, -0.976798629411792740, -0.976809336182849490, -0.976820040511882980, -0.976830742398866360, -0.976841441843772860, --0.976852138846575960, -0.976862833407248550, -0.976873525525764010, -0.976884215202095670, -0.976894902436216790, -0.976905587228100720, -0.976916269577720820, -0.976926949485049990, --0.976937626950061920, -0.976948301972729640, -0.976958974553026720, -0.976969644690926290, -0.976980312386401820, -0.976990977639426550, -0.977001640449973730, -0.977012300818016930, --0.977022958743529510, -0.977033614226484600, -0.977044267266855560, -0.977054917864615850, -0.977065566019738930, -0.977076211732198160, -0.977086855001966790, -0.977097495829018170, --0.977108134213325870, -0.977118770154863260, -0.977129403653603680, -0.977140034709520710, -0.977150663322587490, -0.977161289492777700, -0.977171913220064690, -0.977182534504422050, --0.977193153345822910, -0.977203769744240840, -0.977214383699649410, -0.977224995212022000, -0.977235604281332270, -0.977246210907553370, -0.977256815090658870, -0.977267416830622460, --0.977278016127417380, -0.977288612981017320, -0.977299207391395750, -0.977309799358526130, -0.977320388882382040, -0.977330975962936940, -0.977341560600164640, -0.977352142794038260, --0.977362722544531380, -0.977373299851617800, -0.977383874715270990, -0.977394447135464530, -0.977405017112172090, -0.977415584645366930, -0.977426149735022730, -0.977436712381113180, --0.977447272583611970, -0.977457830342492450, -0.977468385657728420, -0.977478938529293460, -0.977489488957161030, -0.977500036941305160, -0.977510582481698980, -0.977521125578316390, --0.977531666231130970, -0.977542204440116300, -0.977552740205246180, -0.977563273526494410, -0.977573804403834230, -0.977584332837239560, -0.977594858826684070, -0.977605382372141450, --0.977615903473585400, -0.977626422130989490, -0.977636938344327630, -0.977647452113573400, -0.977657963438700480, -0.977668472319682900, -0.977678978756493900, -0.977689482749107500, --0.977699984297497380, -0.977710483401637240, -0.977720980061501210, -0.977731474277062420, -0.977741966048295000, -0.977752455375172640, -0.977762942257669240, -0.977773426695758400, --0.977783908689414010, -0.977794388238609760, -0.977804865343319670, -0.977815340003517330, -0.977825812219176860, -0.977836281990271730, -0.977846749316775840, -0.977857214198663010, --0.977867676635907230, -0.977878136628482440, -0.977888594176362090, -0.977899049279520320, -0.977909501937930910, -0.977919952151567680, -0.977930399920404650, -0.977940845244415600, --0.977951288123574350, -0.977961728557855010, -0.977972166547231290, -0.977982602091677310, -0.977993035191166650, -0.978003465845673440, -0.978013894055171580, -0.978024319819634890, --0.978034743139037490, -0.978045164013353400, -0.978055582442556190, -0.978065998426620010, -0.978076411965518870, -0.978086823059226670, -0.978097231707717450, -0.978107637910965220, --0.978118041668943780, -0.978128442981627270, -0.978138841848989800, -0.978149238271005080, -0.978159632247647350, -0.978170023778890400, -0.978180412864708470, -0.978190799505075480, --0.978201183699965670, -0.978211565449352730, -0.978221944753210890, -0.978232321611514190, -0.978242696024236640, -0.978253067991352370, -0.978263437512835400, -0.978273804588659870, --0.978284169218799900, -0.978294531403229640, -0.978304891141922760, -0.978315248434853850, -0.978325603281996690, -0.978335955683325540, -0.978346305638814530, -0.978356653148437890, --0.978366998212169440, -0.978377340829983510, -0.978387681001854250, -0.978398018727755780, -0.978408354007662240, -0.978418686841547870, -0.978429017229386800, -0.978439345171153050, --0.978449670666821090, -0.978459993716365050, -0.978470314319758840, -0.978480632476976920, -0.978490948187993310, -0.978501261452782380, -0.978511572271318570, -0.978521880643575480, --0.978532186569527780, -0.978542490049149620, -0.978552791082415220, -0.978563089669298840, -0.978573385809774820, -0.978583679503817190, -0.978593970751400420, -0.978604259552498750, --0.978614545907086630, -0.978624829815137880, -0.978635111276627170, -0.978645390291528640, -0.978655666859816530, -0.978665940981465420, -0.978676212656449550, -0.978686481884742940, --0.978696748666320170, -0.978707013001155480, -0.978717274889223330, -0.978727534330497970, -0.978737791324953750, -0.978748045872565030, -0.978758297973306270, -0.978768547627151930, --0.978778794834076040, -0.978789039594053060, -0.978799281907057670, -0.978809521773063910, -0.978819759192046450, -0.978829994163979640, -0.978840226688837860, -0.978850456766595320, --0.978860684397226730, -0.978870909580706440, -0.978881132317008910, -0.978891352606108490, -0.978901570447979650, -0.978911785842596970, -0.978921998789935020, -0.978932209289967830, --0.978942417342670070, -0.978952622948016330, -0.978962826105981070, -0.978973026816538750, -0.978983225079663950, -0.978993420895331030, -0.979003614263514450, -0.979013805184188900, --0.979023993657328730, -0.979034179682908730, -0.979044363260903160, -0.979054544391286700, -0.979064723074033920, -0.979074899309119400, -0.979085073096517710, -0.979095244436203220, --0.979105413328150490, -0.979115579772334320, -0.979125743768729300, -0.979135905317309980, -0.979146064418050740, -0.979156221070926260, -0.979166375275911330, -0.979176527032980410, --0.979186676342108210, -0.979196823203269400, -0.979206967616438440, -0.979217109581590030, -0.979227249098698850, -0.979237386167739810, -0.979247520788687040, -0.979257652961515570, --0.979267782686199850, -0.979277909962714690, -0.979288034791034880, -0.979298157171135000, -0.979308277102989620, -0.979318394586573550, -0.979328509621861460, -0.979338622208828170, --0.979348732347448350, -0.979358840037696580, -0.979368945279547760, -0.979379048072976600, -0.979389148417957990, -0.979399246314466290, -0.979409341762476520, -0.979419434761963360, --0.979429525312901620, -0.979439613415266090, -0.979449699069031790, -0.979459782274172960, -0.979469863030664630, -0.979479941338481710, -0.979490017197598980, -0.979500090607991150, --0.979510161569633110, -0.979520230082499670, -0.979530296146565620, -0.979540359761805980, -0.979550420928195330, -0.979560479645708580, -0.979570535914320750, -0.979580589734006410, --0.979590641104740700, -0.979600690026498520, -0.979610736499254450, -0.979620780522983630, -0.979630822097660730, -0.979640861223260880, -0.979650897899758790, -0.979660932127129460, --0.979670963905347910, -0.979680993234388840, -0.979691020114227260, -0.979701044544838420, -0.979711066526196770, -0.979721086058277350, -0.979731103141055270, -0.979741117774505450, --0.979751129958603030, -0.979761139693322680, -0.979771146978639320, -0.979781151814528180, -0.979791154200964190, -0.979801154137922240, -0.979811151625377460, -0.979821146663304780, --0.979831139251679200, -0.979841129390475850, -0.979851117079669760, -0.979861102319235730, -0.979871085109149000, -0.979881065449384470, -0.979891043339917390, -0.979901018780722670, --0.979910991771775540, -0.979920962313050700, -0.979930930404523610, -0.979940896046169070, -0.979950859237962320, -0.979960819979878380, -0.979970778271892500, -0.979980734113979570, --0.979990687506114840, -0.980000638448273560, -0.980010586940430530, -0.980020532982561090, -0.980030476574640260, -0.980040417716643190, -0.980050356408545100, -0.980060292650321350, --0.980070226441946630, -0.980080157783396410, -0.980090086674645810, -0.980100013115669850, -0.980109937106444010, -0.980119858646943290, -0.980129777737142830, -0.980139694377018090, --0.980149608566544210, -0.980159520305696090, -0.980169429594449190, -0.980179336432778770, -0.980189240820659950, -0.980199142758068080, -0.980209042244978400, -0.980218939281366050, --0.980228833867206380, -0.980238726002474530, -0.980248615687145940, -0.980258502921195760, -0.980268387704599450, -0.980278270037332030, -0.980288149919368970, -0.980298027350685610, --0.980307902331257200, -0.980317774861058980, -0.980327644940066300, -0.980337512568254520, -0.980347377745598990, -0.980357240472075060, -0.980367100747657980, -0.980376958572323100, --0.980386813946045880, -0.980396666868801560, -0.980406517340565610, -0.980416365361313270, -0.980426210931020110, -0.980436054049661390, -0.980445894717212550, -0.980455732933649180, --0.980465568698946300, -0.980475402013079480, -0.980485232876024180, -0.980495061287755760, -0.980504887248249690, -0.980514710757481530, -0.980524531815426540, -0.980534350422060160, --0.980544166577357880, -0.980553980281295150, -0.980563791533847540, -0.980573600334990410, -0.980583406684699340, -0.980593210582949680, -0.980603012029717220, -0.980612811024977100, --0.980622607568704900, -0.980632401660876170, -0.980642193301466400, -0.980651982490451160, -0.980661769227806230, -0.980671553513506660, -0.980681335347528100, -0.980691114729846270, --0.980700891660436720, -0.980710666139274930, -0.980720438166336360, -0.980730207741596800, -0.980739974865031730, -0.980749739536616820, -0.980759501756327420, -0.980769261524139350, --0.980779018840028050, -0.980788773703969220, -0.980798526115938430, -0.980808276075911480, -0.980818023583863720, -0.980827768639770840, -0.980837511243608630, -0.980847251395352560, --0.980856989094978430, -0.980866724342461800, -0.980876457137778380, -0.980886187480903730, -0.980895915371813640, -0.980905640810484040, -0.980915363796890040, -0.980925084331007670, --0.980934802412812610, -0.980944518042280560, -0.980954231219387410, -0.980963941944108410, -0.980973650216419580, -0.980983356036296720, -0.980993059403715400, -0.981002760318651410, --0.981012458781080570, -0.981022154790978540, -0.981031848348321130, -0.981041539453084140, -0.981051228105243480, -0.981060914304774490, -0.981070598051653310, -0.981080279345855620, --0.981089958187357110, -0.981099634576133920, -0.981109308512161600, -0.981118979995415970, -0.981128649025872820, -0.981138315603508170, -0.981147979728297590, -0.981157641400217110, --0.981167300619242510, -0.981176957385349710, -0.981186611698514510, -0.981196263558712920, -0.981205912965920520, -0.981215559920113330, -0.981225204421267260, -0.981234846469358210, --0.981244486064361990, -0.981254123206254710, -0.981263757895011970, -0.981273390130609880, -0.981283019913024250, -0.981292647242231090, -0.981302272118206310, -0.981311894540925820, --0.981321514510365640, -0.981331132026501680, -0.981340747089310070, -0.981350359698766380, -0.981359969854846860, -0.981369577557527300, -0.981379182806783930, -0.981388785602592460, --0.981398385944929340, -0.981407983833770040, -0.981417579269090680, -0.981427172250867510, -0.981436762779076320, -0.981446350853693250, -0.981455936474694310, -0.981465519642055530, --0.981475100355753030, -0.981484678615762610, -0.981494254422060840, -0.981503827774623080, -0.981513398673425910, -0.981522967118445220, -0.981532533109657050, -0.981542096647037730, --0.981551657730562970, -0.981561216360209210, -0.981570772535952260, -0.981580326257768480, -0.981589877525633760, -0.981599426339524460, -0.981608972699416490, -0.981618516605286210, --0.981628058057109620, -0.981637597054862980, -0.981647133598522180, -0.981656667688063590, -0.981666199323463330, -0.981675728504697530, -0.981685255231742440, -0.981694779504574400, --0.981704301323169220, -0.981713820687503350, -0.981723337597552810, -0.981732852053294080, -0.981742364054703050, -0.981751873601756200, -0.981761380694429750, -0.981770885332699740, --0.981780387516542730, -0.981789887245934520, -0.981799384520851580, -0.981808879341270260, -0.981818371707166680, -0.981827861618517210, -0.981837349075298290, -0.981846834077485740, --0.981856316625056120, -0.981865796717985790, -0.981875274356250880, -0.981884749539827850, -0.981894222268692940, -0.981903692542822500, -0.981913160362192780, -0.981922625726780240, --0.981932088636561120, -0.981941549091511660, -0.981951007091608430, -0.981960462636827680, -0.981969915727145760, -0.981979366362539130, -0.981988814542984030, -0.981998260268456820, --0.982007703538933960, -0.982017144354391910, -0.982026582714806920, -0.982036018620155550, -0.982045452070414050, -0.982054883065558990, -0.982064311605566620, -0.982073737690413730, --0.982083161320076340, -0.982092582494531020, -0.982102001213754240, -0.982111417477722460, -0.982120831286412370, -0.982130242639799870, -0.982139651537861870, -0.982149057980574720, --0.982158461967915010, -0.982167863499859070, -0.982177262576383490, -0.982186659197464730, -0.982196053363079360, -0.982205445073203840, -0.982214834327814870, -0.982224221126888560, --0.982233605470401840, -0.982242987358331040, -0.982252366790652750, -0.982261743767343650, -0.982271118288380210, -0.982280490353738880, -0.982289859963396350, -0.982299227117329200, --0.982308591815513890, -0.982317954057927100, -0.982327313844545520, -0.982336671175345620, -0.982346026050303970, -0.982355378469397470, -0.982364728432602360, -0.982374075939895450, --0.982383420991253420, -0.982392763586652730, -0.982402103726070170, -0.982411441409482440, -0.982420776636866000, -0.982430109408197640, -0.982439439723454040, -0.982448767582611790, --0.982458092985647570, -0.982467415932538170, -0.982476736423260280, -0.982486054457790470, -0.982495370036105650, -0.982504683158182400, -0.982513993823997290, -0.982523302033527330, --0.982532607786749000, -0.982541911083639200, -0.982551211924174830, -0.982560510308332140, -0.982569806236088250, -0.982579099707419860, -0.982588390722303750, -0.982597679280716620, --0.982606965382635260, -0.982616249028036570, -0.982625530216897140, -0.982634808949193970, -0.982644085224903980, -0.982653359044003530, -0.982662630406469730, -0.982671899312279270, --0.982681165761409180, -0.982690429753836250, -0.982699691289537160, -0.982708950368488820, -0.982718206990668030, -0.982727461156051810, -0.982736712864616950, -0.982745962116340240, --0.982755208911198610, -0.982764453249169060, -0.982773695130228280, -0.982782934554353500, -0.982792171521521210, -0.982801406031708400, -0.982810638084892220, -0.982819867681049340, --0.982829094820156790, -0.982838319502191690, -0.982847541727130620, -0.982856761494950710, -0.982865978805628980, -0.982875193659142220, -0.982884406055467450, -0.982893615994581690, --0.982902823476461850, -0.982912028501085060, -0.982921231068428320, -0.982930431178468230, -0.982939628831182240, -0.982948824026547040, -0.982958016764539870, -0.982967207045137630, --0.982976394868317450, -0.982985580234056240, -0.982994763142331030, -0.983003943593118930, -0.983013121586396980, -0.983022297122142170, -0.983031470200331660, -0.983040640820942450, --0.983049808983951670, -0.983058974689336450, -0.983068137937073700, -0.983077298727140670, -0.983086457059514360, -0.983095612934171800, -0.983104766351090340, -0.983113917310247000, --0.983123065811618790, -0.983132211855182960, -0.983141355440916520, -0.983150496568796720, -0.983159635238800680, -0.983168771450905530, -0.983177905205088410, -0.983187036501326660, --0.983196165339597190, -0.983205291719877580, -0.983214415642144510, -0.983223537106375440, -0.983232656112547510, -0.983241772660637840, -0.983250886750624000, -0.983259998382482790, --0.983269107556191570, -0.983278214271727570, -0.983287318529068030, -0.983296420328190200, -0.983305519669071430, -0.983314616551688720, -0.983323710976019450, -0.983332802942041060, --0.983341892449730690, -0.983350979499065470, -0.983360064090022750, -0.983369146222579980, -0.983378225896714310, -0.983387303112403190, -0.983396377869623640, -0.983405450168353120, --0.983414520008569100, -0.983423587390248710, -0.983432652313369290, -0.983441714777908320, -0.983450774783843130, -0.983459832331150860, -0.983468887419809090, -0.983477940049795270, --0.983486990221086430, -0.983496037933660030, -0.983505083187493630, -0.983514125982564490, -0.983523166318850060, -0.983532204196327810, -0.983541239614974970, -0.983550272574769010, --0.983559303075687290, -0.983568331117707470, -0.983577356700806700, -0.983586379824962550, -0.983595400490152480, -0.983604418696353950, -0.983613434443544430, -0.983622447731701270, --0.983631458560801920, -0.983640466930823960, -0.983649472841744750, -0.983658476293541970, -0.983667477286193080, -0.983676475819675430, -0.983685471893966490, -0.983694465509043940, --0.983703456664885230, -0.983712445361467850, -0.983721431598769350, -0.983730415376767310, -0.983739396695439190, -0.983748375554762690, -0.983757351954715140, -0.983766325895274240, --0.983775297376417560, -0.983784266398122550, -0.983793232960366910, -0.983802197063128330, -0.983811158706384140, -0.983820117890112030, -0.983829074614289590, -0.983838028878894600, --0.983846980683904420, -0.983855930029296720, -0.983864876915049310, -0.983873821341139650, -0.983882763307545540, -0.983891702814244540, -0.983900639861214230, -0.983909574448432300, --0.983918506575876430, -0.983927436243524300, -0.983936363451353710, -0.983945288199342020, -0.983954210487467230, -0.983963130315706810, -0.983972047684038560, -0.983980962592440280, --0.983989875040889530, -0.983998785029364110, -0.984007692557841710, -0.984016597626300120, -0.984025500234717130, -0.984034400383070220, -0.984043298071337390, -0.984052193299496230, --0.984061086067524630, -0.984069976375400390, -0.984078864223101310, -0.984087749610604860, -0.984096632537889040, -0.984105513004931760, -0.984114391011710610, -0.984123266558203480, --0.984132139644388170, -0.984141010270242590, -0.984149878435744420, -0.984158744140871680, -0.984167607385601940, -0.984176468169913220, -0.984185326493783320, -0.984194182357190140, --0.984203035760111480, -0.984211886702525350, -0.984220735184409330, -0.984229581205741550, -0.984238424766499810, -0.984247265866661890, -0.984256104506205930, -0.984264940685109720, --0.984273774403351060, -0.984282605660908080, -0.984291434457758680, -0.984300260793880550, -0.984309084669251710, -0.984317906083850170, -0.984326725037653950, -0.984335541530640850, --0.984344355562789100, -0.984353167134076280, -0.984361976244480520, -0.984370782893979830, -0.984379587082552240, -0.984388388810175540, -0.984397188076827970, -0.984405984882487430, --0.984414779227131940, -0.984423571110739530, -0.984432360533288310, -0.984441147494755970, -0.984449931995120870, -0.984458714034360920, -0.984467493612454110, -0.984476270729378710, --0.984485045385112610, -0.984493817579633830, -0.984502587312920510, -0.984511354584950650, -0.984520119395702500, -0.984528881745153960, -0.984537641633283280, -0.984546399060068580, --0.984555154025487770, -0.984563906529519190, -0.984572656572140770, -0.984581404153330730, -0.984590149273067090, -0.984598891931328210, -0.984607632128091990, -0.984616369863336890, --0.984625105137040710, -0.984633837949181690, -0.984642568299738170, -0.984651296188688190, -0.984660021616009960, -0.984668744581681740, -0.984677465085681550, -0.984686183127987840, --0.984694898708578740, -0.984703611827432160, -0.984712322484526670, -0.984721030679840400, -0.984729736413351490, -0.984738439685038270, -0.984747140494878990, -0.984755838842851780, --0.984764534728935100, -0.984773228153106970, -0.984781919115345740, -0.984790607615629750, -0.984799293653937260, -0.984807977230246490, -0.984816658344535800, -0.984825336996783650, --0.984834013186967950, -0.984842686915067270, -0.984851358181059840, -0.984860026984924030, -0.984868693326638070, -0.984877357206180640, -0.984886018623529650, -0.984894677578663560, --0.984903334071560830, -0.984911988102199710, -0.984920639670558650, -0.984929288776616010, -0.984937935420350130, -0.984946579601739480, -0.984955221320762300, -0.984963860577397270, --0.984972497371622400, -0.984981131703416280, -0.984989763572757360, -0.984998392979623990, -0.985007019923994750, -0.985015644405847880, -0.985024266425161940, -0.985032885981915300, --0.985041503076086400, -0.985050117707653830, -0.985058729876595930, -0.985067339582891170, -0.985075946826518000, -0.985084551607455120, -0.985093153925680860, -0.985101753781173710, --0.985110351173912100, -0.985118946103874630, -0.985127538571039740, -0.985136128575386020, -0.985144716116892250, -0.985153301195536350, -0.985161883811297320, -0.985170463964153530, --0.985179041654083650, -0.985187616881066150, -0.985196189645079600, -0.985204759946102570, -0.985213327784113630, -0.985221893159091480, -0.985230456071014450, -0.985239016519861340, --0.985247574505610620, -0.985256130028241080, -0.985264683087731190, -0.985273233684059610, -0.985281781817204940, -0.985290327487145730, -0.985298870693860800, -0.985307411437328580, --0.985315949717527890, -0.985324485534437300, -0.985333018888035480, -0.985341549778301130, -0.985350078205213140, -0.985358604168749760, -0.985367127668889790, -0.985375648705612120, --0.985384167278895220, -0.985392683388717990, -0.985401197035059130, -0.985409708217897200, -0.985418216937210880, -0.985426723192979080, -0.985435226985180490, -0.985443728313793900, --0.985452227178797880, -0.985460723580171340, -0.985469217517892960, -0.985477708991941650, -0.985486198002296090, -0.985494684548934960, -0.985503168631837070, -0.985511650250981310, --0.985520129406346370, -0.985528606097911260, -0.985537080325654460, -0.985545552089555080, -0.985554021389591690, -0.985562488225743330, -0.985570952597988660, -0.985579414506306710, --0.985587873950676150, -0.985596330931075900, -0.985604785447484870, -0.985613237499882060, -0.985621687088245930, -0.985630134212555630, -0.985638578872790050, -0.985647021068927880, --0.985655460800948240, -0.985663898068830150, -0.985672332872552070, -0.985680765212093250, -0.985689195087432470, -0.985697622498548640, -0.985706047445420790, -0.985714469928027910, --0.985722889946348710, -0.985731307500362420, -0.985739722590047940, -0.985748135215384070, -0.985756545376349710, -0.985764953072924110, -0.985773358305086170, -0.985781761072814790, --0.985790161376089100, -0.985798559214887900, -0.985806954589190320, -0.985815347498975260, -0.985823737944221960, -0.985832125924909210, -0.985840511441016250, -0.985848894492521890, --0.985857275079405460, -0.985865653201645880, -0.985874028859222040, -0.985882402052113080, -0.985890772780298130, -0.985899141043756310, -0.985907506842466640, -0.985915870176408250, --0.985924231045560150, -0.985932589449901360, -0.985940945389411240, -0.985949298864068680, -0.985957649873852810, -0.985965998418742880, -0.985974344498718010, -0.985982688113757220, --0.985991029263839640, -0.985999367948944720, -0.986007704169051260, -0.986016037924138500, -0.986024369214185680, -0.986032698039171820, -0.986041024399076480, -0.986049348293878360, --0.986057669723556910, -0.986065988688091370, -0.986074305187460750, -0.986082619221644310, -0.986090930790621490, -0.986099239894371200, -0.986107546532872910, -0.986115850706105630, --0.986124152414049050, -0.986132451656681840, -0.986140748433983470, -0.986149042745933290, -0.986157334592510430, -0.986165623973694340, -0.986173910889464270, -0.986182195339799230, --0.986190477324678790, -0.986198756844082090, -0.986207033897988580, -0.986215308486377400, -0.986223580609227990, -0.986231850266519720, -0.986240117458231700, -0.986248382184343520, --0.986256644444834300, -0.986264904239683490, -0.986273161568870350, -0.986281416432374320, -0.986289668830174770, -0.986297918762251260, -0.986306166228582690, -0.986314411229148760, --0.986322653763928800, -0.986330893832902180, -0.986339131436048460, -0.986347366573346760, -0.986355599244776670, -0.986363829450317640, -0.986372057189949140, -0.986380282463650280, --0.986388505271400870, -0.986396725613180040, -0.986404943488967570, -0.986413158898742590, -0.986421371842484910, -0.986429582320173640, -0.986437790331788470, -0.986445995877308750, --0.986454198956714160, -0.986462399569983940, -0.986470597717097770, -0.986478793398035130, -0.986486986612775450, -0.986495177361298330, -0.986503365643583430, -0.986511551459610000, --0.986519734809357620, -0.986527915692805960, -0.986536094109934480, -0.986544270060722980, -0.986552443545150590, -0.986560614563197100, -0.986568783114842080, -0.986576949200065110, --0.986585112818845760, -0.986593273971163590, -0.986601432656998290, -0.986609588876329440, -0.986617742629136480, -0.986625893915399450, -0.986634042735097470, -0.986642189088210440, --0.986650332974717830, -0.986658474394599530, -0.986666613347834900, -0.986674749834403950, -0.986682883854286040, -0.986691015407460850, -0.986699144493908160, -0.986707271113607560, --0.986715395266538840, -0.986723516952681570, -0.986731636172015540, -0.986739752924520430, -0.986747867210176040, -0.986755979028961950, -0.986764088380857830, -0.986772195265843480, --0.986780299683898690, -0.986788401635003030, -0.986796501119136640, -0.986804598136278850, -0.986812692686409480, -0.986820784769508410, -0.986828874385555440, -0.986836961534530270, --0.986845046216412670, -0.986853128431182450, -0.986861208178819390, -0.986869285459303410, -0.986877360272614190, -0.986885432618731520, -0.986893502497635300, -0.986901569909305220, --0.986909634853721300, -0.986917697330863430, -0.986925757340711200, -0.986933814883244500, -0.986941869958443350, -0.986949922566287440, -0.986957972706756780, -0.986966020379831170, --0.986974065585490500, -0.986982108323714690, -0.986990148594483640, -0.986998186397777370, -0.987006221733575440, -0.987014254601857880, -0.987022285002604800, -0.987030312935796020, --0.987038338401411530, -0.987046361399431030, -0.987054381929834750, -0.987062399992602370, -0.987070415587714130, -0.987078428715149720, -0.987086439374889270, -0.987094447566912780, --0.987102453291200170, -0.987110456547731440, -0.987118457336486620, -0.987126455657445610, -0.987134451510588430, -0.987142444895895090, -0.987150435813345610, -0.987158424262920110, --0.987166410244598720, -0.987174393758361020, -0.987182374804187470, -0.987190353382057960, -0.987198329491952520, -0.987206303133851270, -0.987214274307734340, -0.987222243013581640, --0.987230209251373390, -0.987238173021089740, -0.987246134322710470, -0.987254093156215930, -0.987262049521586140, -0.987270003418801220, -0.987277954847841200, -0.987285903808686530, --0.987293850301317000, -0.987301794325712740, -0.987309735881854110, -0.987317674969721120, -0.987325611589293880, -0.987333545740552540, -0.987341477423477440, -0.987349406638048710, --0.987357333384246470, -0.987365257662050850, -0.987373179471442100, -0.987381098812400330, -0.987389015684905780, -0.987396930088938810, -0.987404842024479650, -0.987412751491508090, --0.987420658490004820, -0.987428563019949860, -0.987436465081323430, -0.987444364674105900, -0.987452261798277390, -0.987460156453818350, -0.987468048640708810, -0.987475938358929220, --0.987483825608459820, -0.987491710389280850, -0.987499592701372440, -0.987507472544715160, -0.987515349919289240, -0.987523224825075040, -0.987531097262052570, -0.987538967230202400, --0.987546834729504890, -0.987554699759940260, -0.987562562321488870, -0.987570422414130960, -0.987578280037847090, -0.987586135192617620, -0.987593987878422670, -0.987601838095242930, --0.987609685843058530, -0.987617531121849800, -0.987625373931597330, -0.987633214272281350, -0.987641052143882310, -0.987648887546380920, -0.987656720479757060, -0.987664550943991420, --0.987672378939064450, -0.987680204464956520, -0.987688027521648080, -0.987695848109119480, -0.987703666227351400, -0.987711481876324070, -0.987719295056018190, -0.987727105766413870, --0.987734914007491920, -0.987742719779232560, -0.987750523081616480, -0.987758323914624040, -0.987766122278236010, -0.987773918172432430, -0.987781711597194190, -0.987789502552501530, --0.987797291038335250, -0.987805077054675570, -0.987812860601503310, -0.987820641678798910, -0.987828420286542940, -0.987836196424715980, -0.987843970093298380, -0.987851741292270940, --0.987859510021614100, -0.987867276281308440, -0.987875040071334640, -0.987882801391673390, -0.987890560242304930, -0.987898316623210150, -0.987906070534369520, -0.987913821975763720, --0.987921570947373430, -0.987929317449179110, -0.987937061481161560, -0.987944803043301350, -0.987952542135579150, -0.987960278757975760, -0.987968012910471430, -0.987975744593047160, --0.987983473805683520, -0.987991200548361200, -0.987998924821061000, -0.988006646623763360, -0.988014365956449090, -0.988022082819098870, -0.988029797211693480, -0.988037509134213620, --0.988045218586639960, -0.988052925568953190, -0.988060630081134210, -0.988068332123163580, -0.988076031695022340, -0.988083728796690820, -0.988091423428150040, -0.988099115589380680, --0.988106805280363430, -0.988114492501079410, -0.988122177251508970, -0.988129859531633130, -0.988137539341432670, -0.988145216680888280, -0.988152891549980870, -0.988160563948691340, --0.988168233877000260, -0.988175901334888640, -0.988183566322337280, -0.988191228839327200, -0.988198888885838840, -0.988206546461853240, -0.988214201567351290, -0.988221854202313900, --0.988229504366721740, -0.988237152060556070, -0.988244797283797330, -0.988252440036426650, -0.988260080318424830, -0.988267718129772880, -0.988275353470451480, -0.988282986340441870, --0.988290616739724630, -0.988298244668280980, -0.988305870126091830, -0.988313493113137880, -0.988321113629400120, -0.988328731674859570, -0.988336347249497260, -0.988343960353294080, --0.988351570986231160, -0.988359179148289080, -0.988366784839449180, -0.988374388059692240, -0.988381988808999300, -0.988389587087351470, -0.988397182894729660, -0.988404776231114780, --0.988412367096488050, -0.988419955490830390, -0.988427541414123030, -0.988435124866346660, -0.988442705847482390, -0.988450284357511480, -0.988457860396414810, -0.988465433964173630, --0.988473005060768740, -0.988480573686181250, -0.988488139840392410, -0.988495703523383230, -0.988503264735134720, -0.988510823475628130, -0.988518379744844470, -0.988525933542764750, --0.988533484869370320, -0.988541033724642300, -0.988548580108561500, -0.988556124021109260, -0.988563665462266820, -0.988571204432015070, -0.988578740930335490, -0.988586274957208970, --0.988593806512616750, -0.988601335596539950, -0.988608862208959940, -0.988616386349857600, -0.988623908019214400, -0.988631427217011470, -0.988638943943229930, -0.988646458197851020, --0.988653969980856080, -0.988661479292226140, -0.988668986131942430, -0.988676490499986290, -0.988683992396338970, -0.988691491820981590, -0.988698988773895620, -0.988706483255062160, --0.988713975264462360, -0.988721464802077680, -0.988728951867889340, -0.988736436461878590, -0.988743918584026770, -0.988751398234315130, -0.988758875412725000, -0.988766350119237860, --0.988773822353834710, -0.988781292116497010, -0.988788759407206010, -0.988796224225943150, -0.988803686572689690, -0.988811146447427180, -0.988818603850136760, -0.988826058780799770, --0.988833511239397560, -0.988840961225911590, -0.988848408740323310, -0.988855853782613980, -0.988863296352764930, -0.988870736450757740, -0.988878174076573750, -0.988885609230194310, --0.988893041911600770, -0.988900472120774590, -0.988907899857697340, -0.988915325122350250, -0.988922747914715020, -0.988930168234772760, -0.988937586082505040, -0.988945001457893440, --0.988952414360919300, -0.988959824791564190, -0.988967232749809470, -0.988974638235636580, -0.988982041249027220, -0.988989441789962730, -0.988996839858424680, -0.989004235454394530, --0.989011628577853740, -0.989019019228783880, -0.989026407407166410, -0.989033793112983120, -0.989041176346215250, -0.989048557106844360, -0.989055935394852150, -0.989063311210219950, --0.989070684552929680, -0.989078055422962570, -0.989085423820300400, -0.989092789744924540, -0.989100153196816880, -0.989107514175958880, -0.989114872682331890, -0.989122228715917820, --0.989129582276698120, -0.989136933364654580, -0.989144281979768560, -0.989151628122022060, -0.989158971791396340, -0.989166312987873160, -0.989173651711434230, -0.989180987962061110, --0.989188321739735590, -0.989195653044439240, -0.989202981876153850, -0.989210308234860890, -0.989217632120542260, -0.989224953533179520, -0.989232272472754360, -0.989239588939248570, --0.989246902932643720, -0.989254214452921610, -0.989261523500064130, -0.989268830074052750, -0.989276134174869260, -0.989283435802495450, -0.989290734956913000, -0.989298031638103810, --0.989305325846049470, -0.989312617580731750, -0.989319906842132560, -0.989327193630233800, -0.989334477945016830, -0.989341759786463770, -0.989349039154556190, -0.989356316049276100, --0.989363590470605180, -0.989370862418525340, -0.989378131893018380, -0.989385398894065960, -0.989392663421650110, -0.989399925475752510, -0.989407185056355170, -0.989414442163439880, --0.989421696796988440, -0.989428948956982860, -0.989436198643404820, -0.989443445856236450, -0.989450690595459310, -0.989457932861055430, -0.989465172653006710, -0.989472409971295150, --0.989479644815902560, -0.989486877186810830, -0.989494107084001870, -0.989501334507457700, -0.989508559457160100, -0.989515781933091090, -0.989523001935232680, -0.989530219463566780, --0.989537434518075410, -0.989544647098740350, -0.989551857205543730, -0.989559064838467450, -0.989566269997493530, -0.989573472682603870, -0.989580672893780490, -0.989587870631005510, --0.989595065894260940, -0.989602258683528580, -0.989609448998790660, -0.989616636840028980, -0.989623822207225780, -0.989631005100363060, -0.989638185519422840, -0.989645363464387030, --0.989652538935237860, -0.989659711931957560, -0.989666882454527830, -0.989674050502930780, -0.989681216077148650, -0.989688379177163570, -0.989695539802957440, -0.989702697954512710, --0.989709853631810970, -0.989717006834834660, -0.989724157563565800, -0.989731305817986630, -0.989738451598079160, -0.989745594903825520, -0.989752735735207940, -0.989759874092208450, --0.989767009974809490, -0.989774143382992850, -0.989781274316740790, -0.989788402776035640, -0.989795528760859410, -0.989802652271194350, -0.989809773307022800, -0.989816891868326780, --0.989824007955088400, -0.989831121567290140, -0.989838232704914000, -0.989845341367942220, -0.989852447556357150, -0.989859551270141020, -0.989866652509275970, -0.989873751273744220, --0.989880847563528230, -0.989887941378610030, -0.989895032718972060, -0.989902121584596450, -0.989909207975465440, -0.989916291891561610, -0.989923373332866950, -0.989930452299363830, --0.989937528791034580, -0.989944602807861560, -0.989951674349827000, -0.989958743416913260, -0.989965810009102550, -0.989972874126377470, -0.989979935768720120, -0.989986994936113080, --0.989994051628538490, -0.990001105845978670, -0.990008157588416090, -0.990015206855833220, -0.990022253648212280, -0.990029297965535740, -0.990036339807785940, -0.990043379174945230, --0.990050416066996180, -0.990057450483920910, -0.990064482425702220, -0.990071511892322120, -0.990078538883763400, -0.990085563400008310, -0.990092585441039400, -0.990099605006838910, --0.990106622097389310, -0.990113636712673270, -0.990120648852673150, -0.990127658517371390, -0.990134665706750570, -0.990141670420792930, -0.990148672659481250, -0.990155672422797780, --0.990162669710725200, -0.990169664523245840, -0.990176656860342400, -0.990183646721997320, -0.990190634108193080, -0.990197619018912460, -0.990204601454137580, -0.990211581413851240, --0.990218558898035890, -0.990225533906674230, -0.990232506439748690, -0.990239476497241980, -0.990246444079136530, -0.990253409185414930, -0.990260371816059860, -0.990267331971053770, --0.990274289650379340, -0.990281244854019250, -0.990288197581956080, -0.990295147834172380, -0.990302095610650750, -0.990309040911374060, -0.990315983736324680, -0.990322924085485280, --0.990329861958838540, -0.990336797356367260, -0.990343730278054000, -0.990350660723881340, -0.990357588693832060, -0.990364514187888840, -0.990371437206034270, -0.990378357748251110, --0.990385275814521960, -0.990392191404829810, -0.990399104519157030, -0.990406015157486610, -0.990412923319801130, -0.990419829006083390, -0.990426732216315940, -0.990433632950481700, --0.990440531208563460, -0.990447426990543780, -0.990454320296405680, -0.990461211126131720, -0.990468099479704710, -0.990474985357107430, -0.990481868758322670, -0.990488749683333220, --0.990495628132121890, -0.990502504104671560, -0.990509377600964910, -0.990516248620984970, -0.990523117164714310, -0.990529983232135920, -0.990536846823232400, -0.990543707937986850, --0.990550566576382070, -0.990557422738400970, -0.990564276424026220, -0.990571127633240730, -0.990577976366027400, -0.990584822622369130, -0.990591666402248830, -0.990598507705649390, --0.990605346532553720, -0.990612182882944610, -0.990619016756805190, -0.990625848154118030, -0.990632677074866350, -0.990639503519032960, -0.990646327486600750, -0.990653148977552740, --0.990659967991872060, -0.990666784529541270, -0.990673598590543490, -0.990680410174861860, -0.990687219282479050, -0.990694025913378300, -0.990700830067542390, -0.990707631744954460, --0.990714430945597410, -0.990721227669454360, -0.990728021916508330, -0.990734813686742100, -0.990741602980138800, -0.990748389796681560, -0.990755174136353280, -0.990761955999137300, --0.990768735385016200, -0.990775512293973320, -0.990782286725991670, -0.990789058681054270, -0.990795828159144240, -0.990802595160244600, -0.990809359684338480, -0.990816121731408980, --0.990822881301439250, -0.990829638394412290, -0.990836393010311230, -0.990843145149119200, -0.990849894810819200, -0.990856641995394470, -0.990863386702828250, -0.990870128933103670, --0.990876868686203500, -0.990883605962111340, -0.990890340760810060, -0.990897073082282920, -0.990903802926513140, -0.990910530293483860, -0.990917255183178190, -0.990923977595579490, --0.990930697530670870, -0.990937414988435460, -0.990944129968856500, -0.990950842471917110, -0.990957552497600760, -0.990964260045890440, -0.990970965116769630, -0.990977667710221220, --0.990984367826228780, -0.990991065464775330, -0.990997760625844220, -0.991004453309418660, -0.991011143515482030, -0.991017831244017540, -0.991024516495008450, -0.991031199268438190, --0.991037879564289790, -0.991044557382546820, -0.991051232723192290, -0.991057905586209760, -0.991064575971582480, -0.991071243879293910, -0.991077909309327040, -0.991084572261665350, --0.991091232736292290, -0.991097890733191210, -0.991104546252345340, -0.991111199293738140, -0.991117849857352850, -0.991124497943173030, -0.991131143551181930, -0.991137786681363100, --0.991144427333699670, -0.991151065508175220, -0.991157701204773090, -0.991164334423476730, -0.991170965164269610, -0.991177593427134960, -0.991184219212056240, -0.991190842519017120, --0.991197463348000850, -0.991204081698990880, -0.991210697571970780, -0.991217310966923890, -0.991223921883833680, -0.991230530322683710, -0.991237136283457550, -0.991243739766138440, --0.991250340770709950, -0.991256939297155640, -0.991263535345458860, -0.991270128915603400, -0.991276720007572610, -0.991283308621350060, -0.991289894756919090, -0.991296478414263490, --0.991303059593366620, -0.991309638294212150, -0.991316214516783530, -0.991322788261064350, -0.991329359527038270, -0.991335928314688970, -0.991342494623999590, -0.991349058454954020, --0.991355619807535840, -0.991362178681728600, -0.991368735077515880, -0.991375288994881480, -0.991381840433808730, -0.991388389394281420, -0.991394935876283130, -0.991401479879797430, --0.991408021404808100, -0.991414560451298720, -0.991421097019252850, -0.991427631108654280, -0.991434162719486810, -0.991440691851733780, -0.991447218505378980, -0.991453742680406200, --0.991460264376799020, -0.991466783594541100, -0.991473300333616470, -0.991479814594008470, -0.991486326375700890, -0.991492835678677520, -0.991499342502921930, -0.991505846848418140, --0.991512348715149710, -0.991518848103100430, -0.991525345012253980, -0.991531839442594150, -0.991538331394104850, -0.991544820866769650, -0.991551307860572330, -0.991557792375496790, --0.991564274411526720, -0.991570753968646130, -0.991577231046838480, -0.991583705646087890, -0.991590177766377920, -0.991596647407692490, -0.991603114570015490, -0.991609579253330710, --0.991616041457621940, -0.991622501182873100, -0.991628958429068060, -0.991635413196190640, -0.991641865484224620, -0.991648315293154000, -0.991654762622962480, -0.991661207473634070, --0.991667649845152650, -0.991674089737502260, -0.991680527150666570, -0.991686962084629480, -0.991693394539374990, -0.991699824514887030, -0.991706252011149590, -0.991712677028146360, --0.991719099565861570, -0.991725519624279020, -0.991731937203382710, -0.991738352303156550, -0.991744764923584430, -0.991751175064650380, -0.991757582726338400, -0.991763987908632520, --0.991770390611516730, -0.991776790834974830, -0.991783188578991060, -0.991789583843549210, -0.991795976628633500, -0.991802366934227740, -0.991808754760316160, -0.991815140106882650, --0.991821522973911350, -0.991827903361386260, -0.991834281269291300, -0.991840656697610680, -0.991847029646328430, -0.991853400115428550, -0.991859768104895290, -0.991866133614712650, --0.991872496644864540, -0.991878857195335200, -0.991885215266108730, -0.991891570857169170, -0.991897923968500740, -0.991904274600087570, -0.991910622751913550, -0.991916968423963040, --0.991923311616220160, -0.991929652328669140, -0.991935990561293780, -0.991942326314078530, -0.991948659587007400, -0.991954990380064630, -0.991961318693234450, -0.991967644526500990, --0.991973967879848260, -0.991980288753260720, -0.991986607146722490, -0.991992923060217690, -0.991999236493730560, -0.992005547447245340, -0.992011855920746250, -0.992018161914217540, --0.992024465427643550, -0.992030766461008300, -0.992037065014296120, -0.992043361087491250, -0.992049654680578040, -0.992055945793540620, -0.992062234426363540, -0.992068520579030610, --0.992074804251526500, -0.992081085443835330, -0.992087364155941450, -0.992093640387829210, -0.992099914139482840, -0.992106185410886690, -0.992112454202025100, -0.992118720512882410, --0.992124984343442870, -0.992131245693690820, -0.992137504563610720, -0.992143760953186790, -0.992150014862403510, -0.992156266291245310, -0.992162515239696340, -0.992168761707741040, --0.992175005695363880, -0.992181247202549190, -0.992187486229281320, -0.992193722775544850, -0.992199956841324000, -0.992206188426603240, -0.992212417531367130, -0.992218644155599900, --0.992224868299286020, -0.992231089962410050, -0.992237309144956230, -0.992243525846909220, -0.992249740068253510, -0.992255951808973300, -0.992262161069053290, -0.992268367848477830, --0.992274572147231470, -0.992280773965298570, -0.992286973302663910, -0.992293170159311620, -0.992299364535226600, -0.992305556430393090, -0.992311745844795760, -0.992317932778418950, --0.992324117231247360, -0.992330299203265430, -0.992336478694457850, -0.992342655704809060, -0.992348830234303650, -0.992355002282926060, -0.992361171850660970, -0.992367338937493070, --0.992373503543406700, -0.992379665668386530, -0.992385825312417370, -0.992391982475483550, -0.992398137157569750, -0.992404289358660760, -0.992410439078740940, -0.992416586317794950, --0.992422731075807580, -0.992428873352763310, -0.992435013148647020, -0.992441150463443060, -0.992447285297136220, -0.992453417649711180, -0.992459547521152620, -0.992465674911445220, --0.992471799820573540, -0.992477922248522380, -0.992484042195276530, -0.992490159660820440, -0.992496274645139120, -0.992502387148216920, -0.992508497170038860, -0.992514604710589500, --0.992520709769853740, -0.992526812347816030, -0.992532912444461510, -0.992539010059774630, -0.992545105193740170, -0.992551197846342940, -0.992557288017567710, -0.992563375707399280, --0.992569460915822430, -0.992575543642821860, -0.992581623888382450, -0.992587701652489220, -0.992593776935126510, -0.992599849736279350, -0.992605920055932620, -0.992611987894071010, --0.992618053250679530, -0.992624116125742970, -0.992630176519246010, -0.992636234431173550, -0.992642289861510600, -0.992648342810241950, -0.992654393277352390, -0.992660441262826820, --0.992666486766650150, -0.992672529788807270, -0.992678570329283190, -0.992684608388062610, -0.992690643965130510, -0.992696677060471710, -0.992702707674071320, -0.992708735805914120, --0.992714761455985140, -0.992720784624269270, -0.992726805310751300, -0.992732823515416360, -0.992738839238249460, -0.992744852479235380, -0.992750863238359150, -0.992756871515605770, --0.992762877310960250, -0.992768880624407490, -0.992774881455932730, -0.992780879805520540, -0.992786875673156270, -0.992792869058824690, -0.992798859962511050, -0.992804848384200240, --0.992810834323877290, -0.992816817781527310, -0.992822798757135190, -0.992828777250686080, -0.992834753262165080, -0.992840726791557100, -0.992846697838847380, -0.992852666404020920, --0.992858632487062740, -0.992864596087958180, -0.992870557206691930, -0.992876515843249320, -0.992882471997615480, -0.992888425669775420, -0.992894376859714270, -0.992900325567417250, --0.992906271792869390, -0.992912215536055800, -0.992918156796961720, -0.992924095575572150, -0.992930031871872450, -0.992935965685847630, -0.992941897017482920, -0.992947825866763440, --0.992953752233674440, -0.992959676118201020, -0.992965597520328420, -0.992971516440041890, -0.992977432877326430, -0.992983346832167490, -0.992989258304550200, -0.992995167294459800, --0.993001073801881410, -0.993006977826800250, -0.993012879369201800, -0.993018778429071050, -0.993024675006393350, -0.993030569101153950, -0.993036460713338180, -0.993042349842931380, --0.993048236489918580, -0.993054120654285110, -0.993060002336016430, -0.993065881535097780, -0.993071758251514390, -0.993077632485251600, -0.993083504236294770, -0.993089373504629110, --0.993095240290239990, -0.993101104593112850, -0.993106966413232930, -0.993112825750585570, -0.993118682605156120, -0.993124536976930040, -0.993130388865892550, -0.993136238272029240, --0.993142085195325210, -0.993147929635765920, -0.993153771593336840, -0.993159611068023310, -0.993165448059810880, -0.993171282568684810, -0.993177114594630430, -0.993182944137633310, --0.993188771197678790, -0.993194595774752330, -0.993200417868839500, -0.993206237479925540, -0.993212054607996000, -0.993217869253036230, -0.993223681415032030, -0.993229491093968410, --0.993235298289831150, -0.993241103002605600, -0.993246905232277320, -0.993252704978831780, -0.993258502242254540, -0.993264297022531050, -0.993270089319646670, -0.993275879133587170, --0.993281666464337910, -0.993287451311884560, -0.993293233676212470, -0.993299013557307430, -0.993304790955154780, -0.993310565869740200, -0.993316338301049150, -0.993322108249067300, --0.993327875713780120, -0.993333640695173270, -0.993339403193232330, -0.993345163207942970, -0.993350920739290650, -0.993356675787261060, -0.993362428351839630, -0.993368178433012280, --0.993373926030764350, -0.993379671145081740, -0.993385413775949910, -0.993391153923354420, -0.993396891587281280, -0.993402626767715850, -0.993408359464643790, -0.993414089678050780, --0.993419817407922620, -0.993425542654244880, -0.993431265417003330, -0.993436985696183660, -0.993442703491771440, -0.993448418803752450, -0.993454131632112380, -0.993459841976837010, --0.993465549837912130, -0.993471255215323310, -0.993476958109056340, -0.993482658519097010, -0.993488356445431100, -0.993494051888044180, -0.993499744846922160, -0.993505435322050710, --0.993511123313415730, -0.993516808821003130, -0.993522491844798350, -0.993528172384787300, -0.993533850440955770, -0.993539526013289760, -0.993545199101774860, -0.993550869706396940, --0.993556537827141820, -0.993562203463995490, -0.993567866616943520, -0.993573527285972040, -0.993579185471066610, -0.993584841172213240, -0.993590494389397730, -0.993596145122606080, --0.993601793371823970, -0.993607439137037530, -0.993613082418232430, -0.993618723215394570, -0.993624361528509860, -0.993629997357564300, -0.993635630702543680, -0.993641261563434130, --0.993646889940221320, -0.993652515832891270, -0.993658139241430090, -0.993663760165823470, -0.993669378606057420, -0.993674994562117830, -0.993680608033990830, -0.993686219021662430, --0.993691827525118420, -0.993697433544344810, -0.993703037079327610, -0.993708638130052830, -0.993714236696506380, -0.993719832778674480, -0.993725426376542930, -0.993731017490097730, --0.993736606119325130, -0.993742192264211010, -0.993747775924741280, -0.993753357100902180, -0.993758935792679710, -0.993764512000059890, -0.993770085723028830, -0.993775656961572550, --0.993781225715677060, -0.993786791985328600, -0.993792355770513060, -0.993797917071216670, -0.993803475887425460, -0.993809032219125530, -0.993814586066303130, -0.993820137428944150, --0.993825686307034940, -0.993831232700561510, -0.993836776609509980, -0.993842318033866470, -0.993847856973617110, -0.993853393428748120, -0.993858927399245860, -0.993864458885096110, --0.993869987886285220, -0.993875514402799310, -0.993881038434624720, -0.993886559981747460, -0.993892079044153780, -0.993897595621830000, -0.993903109714762150, -0.993908621322936560, --0.993914130446339470, -0.993919637084957010, -0.993925141238775400, -0.993930642907780990, -0.993936142091959910, -0.993941638791298600, -0.993947133005783190, -0.993952624735399910, --0.993958113980135010, -0.993963600739974810, -0.993969085014905660, -0.993974566804913810, -0.993980046109985470, -0.993985522930107110, -0.993990997265264850, -0.993996469115445260, --0.994001938480634450, -0.994007405360818660, -0.994012869755984460, -0.994018331666118080, -0.994023791091205760, -0.994029248031234160, -0.994034702486189300, -0.994040154456057760, --0.994045603940825750, -0.994051050940479740, -0.994056495455006180, -0.994061937484391310, -0.994067377028621580, -0.994072814087683440, -0.994078248661563360, -0.994083680750247670, --0.994089110353722600, -0.994094537471974850, -0.994099962104990740, -0.994105384252756740, -0.994110803915259300, -0.994116221092484880, -0.994121635784419810, -0.994127047991050670, --0.994132457712363920, -0.994137864948346110, -0.994143269698983480, -0.994148671964262820, -0.994154071744170360, -0.994159469038692790, -0.994164863847816660, -0.994170256171528210, --0.994175646009814120, -0.994181033362660950, -0.994186418230055270, -0.994191800611983530, -0.994197180508432200, -0.994202557919387940, -0.994207932844837330, -0.994213305284766810, --0.994218675239163070, -0.994224042708012680, -0.994229407691302190, -0.994234770189018070, -0.994240130201147100, -0.994245487727675960, -0.994250842768590880, -0.994256195323878770, --0.994261545393526180, -0.994266892977519690, -0.994272238075845970, -0.994277580688491810, -0.994282920815443560, -0.994288258456688000, -0.994293593612211810, -0.994298926282001560, --0.994304256466044030, -0.994309584164325910, -0.994314909376833870, -0.994320232103554470, -0.994325552344474620, -0.994330870099580770, -0.994336185368859820, -0.994341498152298330, --0.994346808449883100, -0.994352116261600800, -0.994357421587438450, -0.994362724427382380, -0.994368024781419390, -0.994373322649536480, -0.994378618031720230, -0.994383910927957420, --0.994389201338234830, -0.994394489262539260, -0.994399774700857500, -0.994405057653176330, -0.994410338119482430, -0.994415616099762700, -0.994420891594003930, -0.994426164602192910, --0.994431435124316530, -0.994436703160361590, -0.994441968710314870, -0.994447231774163170, -0.994452492351893480, -0.994457750443492490, -0.994463006048947110, -0.994468259168244220, --0.994473509801370730, -0.994478757948313420, -0.994484003609059200, -0.994489246783595070, -0.994494487471907830, -0.994499725673984260, -0.994504961389811370, -0.994510194619376180, --0.994515425362665570, -0.994520653619666240, -0.994525879390365300, -0.994531102674749650, -0.994536323472806290, -0.994541541784522030, -0.994546757609883980, -0.994551970948879040, --0.994557181801494220, -0.994562390167716410, -0.994567596047532640, -0.994572799440929910, -0.994578000347895120, -0.994583198768415280, -0.994588394702477510, -0.994593588150068820, --0.994598779111176110, -0.994603967585786400, -0.994609153573886800, -0.994614337075464320, -0.994619518090505970, -0.994624696618998880, -0.994629872660930060, -0.994635046216286510, --0.994640217285055360, -0.994645385867223730, -0.994650551962778520, -0.994655715571706960, -0.994660876693996170, -0.994666035329633160, -0.994671191478605050, -0.994676345140898980, --0.994681496316502050, -0.994686645005401380, -0.994691791207584110, -0.994696934923037230, -0.994702076151748100, -0.994707214893703840, -0.994712351148891450, -0.994717484917298280, --0.994722616198911450, -0.994727744993717970, -0.994732871301705070, -0.994737995122860100, -0.994743116457170060, -0.994748235304622310, -0.994753351665203960, -0.994758465538902240, --0.994763576925704270, -0.994768685825597410, -0.994773792238568880, -0.994778896164605800, -0.994783997603695510, -0.994789096555825260, -0.994794193020982150, -0.994799286999153650, --0.994804378490326990, -0.994809467494489290, -0.994814554011627990, -0.994819638041730240, -0.994824719584783470, -0.994829798640774920, -0.994834875209691720, -0.994839949291521420, --0.994845020886251260, -0.994850089993868590, -0.994855156614360640, -0.994860220747714740, -0.994865282393918360, -0.994870341552958730, -0.994875398224823290, -0.994880452409499410, --0.994885504106974290, -0.994890553317235530, -0.994895600040270220, -0.994900644276066060, -0.994905686024610160, -0.994910725285890200, -0.994915762059893400, -0.994920796346607130, --0.994925828146018820, -0.994930857458116050, -0.994935884282886040, -0.994940908620316370, -0.994945930470394370, -0.994950949833107610, -0.994955966708443550, -0.994960981096389530, --0.994965992996933000, -0.994971002410061420, -0.994976009335762470, -0.994981013774023370, -0.994986015724831920, -0.994991015188175340, -0.994996012164041210, -0.995001006652416970, --0.995005998653290310, -0.995010988166648680, -0.995015975192479530, -0.995020959730770430, -0.995025941781508940, -0.995030921344682630, -0.995035898420279060, -0.995040873008285590, --0.995045845108690100, -0.995050814721479830, -0.995055781846642670, -0.995060746484166090, -0.995065708634037540, -0.995070668296244690, -0.995075625470775220, -0.995080580157616690, --0.995085532356756670, -0.995090482068182850, -0.995095429291882770, -0.995100374027844240, -0.995105316276054700, -0.995110256036501940, -0.995115193309173420, -0.995120128094057030, --0.995125060391140240, -0.995129990200410820, -0.995134917521856450, -0.995139842355464820, -0.995144764701223480, -0.995149684559120340, -0.995154601929142850, -0.995159516811279010, --0.995164429205516290, -0.995169339111842470, -0.995174246530245330, -0.995179151460712560, -0.995184053903232060, -0.995188953857791270, -0.995193851324378100, -0.995198746302980330, --0.995203638793585750, -0.995208528796181930, -0.995213416310756990, -0.995218301337298380, -0.995223183875794120, -0.995228063926231750, -0.995232941488599310, -0.995237816562884460, --0.995242689149075100, -0.995247559247159020, -0.995252426857124010, -0.995257291978958070, -0.995262154612648780, -0.995267014758184130, -0.995271872415551930, -0.995276727584740060, --0.995281580265736320, -0.995286430458528830, -0.995291278163105030, -0.995296123379453170, -0.995300966107560910, -0.995305806347416280, -0.995310644099007160, -0.995315479362321340, --0.995320312137346840, -0.995325142424071660, -0.995329970222483600, -0.995334795532570650, -0.995339618354320610, -0.995344438687721490, -0.995349256532761410, -0.995354071889428040, --0.995358884757709730, -0.995363695137594040, -0.995368503029069100, -0.995373308432122910, -0.995378111346743480, -0.995382911772918710, -0.995387709710636730, -0.995392505159885420, --0.995397298120652920, -0.995402088592927110, -0.995406876576696130, -0.995411662071947980, -0.995416445078670550, -0.995421225596852090, -0.995426003626480590, -0.995430779167544190, --0.995435552220030660, -0.995440322783928240, -0.995445090859225060, -0.995449856445909220, -0.995454619543968630, -0.995459380153391530, -0.995464138274166020, -0.995468893906280130, --0.995473647049722080, -0.995478397704479880, -0.995483145870541650, -0.995487891547895520, -0.995492634736529710, -0.995497375436432350, -0.995502113647591560, -0.995506849369995450, --0.995511582603632150, -0.995516313348490000, -0.995521041604557010, -0.995525767371821410, -0.995530490650271330, -0.995535211439895100, -0.995539929740680840, -0.995544645552616790, --0.995549358875691180, -0.995554069709892020, -0.995558778055207760, -0.995563483911626520, -0.995568187279136650, -0.995572888157726270, -0.995577586547383710, -0.995582282448097100, --0.995586975859854780, -0.995591666782645100, -0.995596355216456170, -0.995601041161276460, -0.995605724617094070, -0.995610405583897350, -0.995615084061674650, -0.995619760050414300, --0.995624433550104440, -0.995629104560733610, -0.995633773082289950, -0.995638439114761800, -0.995643102658137600, -0.995647763712405710, -0.995652422277554460, -0.995657078353571980, --0.995661731940446940, -0.995666383038167460, -0.995671031646722100, -0.995675677766099110, -0.995680321396286930, -0.995684962537274010, -0.995689601189048590, -0.995694237351599340, --0.995698871024914280, -0.995703502208982180, -0.995708130903791290, -0.995712757109330050, -0.995717380825587030, -0.995722002052550460, -0.995726620790208910, -0.995731237038550710, --0.995735850797564550, -0.995740462067238650, -0.995745070847561700, -0.995749677138522030, -0.995754280940108090, -0.995758882252308570, -0.995763481075111810, -0.995768077408506370, --0.995772671252480700, -0.995777262607023370, -0.995781851472122840, -0.995786437847767770, -0.995791021733946510, -0.995795603130647740, -0.995800182037860030, -0.995804758455571700, --0.995809332383771560, -0.995813903822448170, -0.995818472771589860, -0.995823039231185540, -0.995827603201223430, -0.995832164681692560, -0.995836723672581140, -0.995841280173877850, --0.995845834185571490, -0.995850385707650390, -0.995854934740103450, -0.995859481282919230, -0.995864025336086200, -0.995868566899593130, -0.995873105973428600, -0.995877642557581380, --0.995882176652039930, -0.995886708256793150, -0.995891237371829610, -0.995895763997137860, -0.995900288132706920, -0.995904809778525020, -0.995909328934581280, -0.995913845600864040, --0.995918359777362320, -0.995922871464064660, -0.995927380660959870, -0.995931887368036620, -0.995936391585283580, -0.995940893312689650, -0.995945392550243390, -0.995949889297933710, --0.995954383555749280, -0.995958875323678880, -0.995963364601711310, -0.995967851389835350, -0.995972335688039780, -0.995976817496313280, -0.995981296814644870, -0.995985773643023100, --0.995990247981436980, -0.995994719829875200, -0.995999189188326640, -0.996003656056780100, -0.996008120435224350, -0.996012582323648420, -0.996017041722040970, -0.996021498630390910, --0.996025953048687020, -0.996030404976918420, -0.996034854415073670, -0.996039301363141890, -0.996043745821111880, -0.996048187788972420, -0.996052627266712510, -0.996057064254320950, --0.996061498751786960, -0.996065930759098990, -0.996070360276246290, -0.996074787303217630, -0.996079211840002140, -0.996083633886588490, -0.996088053442965800, -0.996092470509122970, --0.996096885085048900, -0.996101297170732700, -0.996105706766163280, -0.996110113871329640, -0.996114518486220570, -0.996118920610825300, -0.996123320245132620, -0.996127717389131750, --0.996132112042811600, -0.996136504206161180, -0.996140893879169380, -0.996145281061825430, -0.996149665754118230, -0.996154047956036900, -0.996158427667570460, -0.996162804888707900, --0.996167179619438350, -0.996171551859750930, -0.996175921609634530, -0.996180288869078390, -0.996184653638071520, -0.996189015916602920, -0.996193375704661820, -0.996197733002237460, --0.996202087809318630, -0.996206440125894540, -0.996210789951954330, -0.996215137287487230, -0.996219482132482240, -0.996223824486928590, -0.996228164350815290, -0.996232501724131690, --0.996236836606866900, -0.996241168999009830, -0.996245498900549920, -0.996249826311476290, -0.996254151231778070, -0.996258473661444490, -0.996262793600464770, -0.996267111048827920, --0.996271426006523410, -0.996275738473540230, -0.996280048449867840, -0.996284355935495250, -0.996288660930411800, -0.996292963434606600, -0.996297263448069130, -0.996301560970788370, --0.996305856002753900, -0.996310148543954610, -0.996314438594380070, -0.996318726154019400, -0.996323011222861820, -0.996327293800896910, -0.996331573888113550, -0.996335851484501430, --0.996340126590049560, -0.996344399204747380, -0.996348669328584240, -0.996352936961549470, -0.996357202103632210, -0.996361464754822120, -0.996365724915108220, -0.996369982584480170, --0.996374237762927110, -0.996378490450438360, -0.996382740647003500, -0.996386988352611750, -0.996391233567252450, -0.996395476290915180, -0.996399716523589160, -0.996403954265263850, --0.996408189515928690, -0.996412422275573030, -0.996416652544186320, -0.996420880321758020, -0.996425105608277460, -0.996429328403734100, -0.996433548708117510, -0.996437766521417020, --0.996441981843622090, -0.996446194674722290, -0.996450405014706830, -0.996454612863565510, -0.996458818221287680, -0.996463021087862780, -0.996467221463280260, -0.996471419347529700, --0.996475614740600530, -0.996479807642482450, -0.996483998053164790, -0.996488185972637110, -0.996492371400888980, -0.996496554337910070, -0.996500734783689610, -0.996504912738217290, --0.996509088201482760, -0.996513261173475500, -0.996517431654185050, -0.996521599643601210, -0.996525765141713200, -0.996529928148510710, -0.996534088663983520, -0.996538246688121080, --0.996542402220913060, -0.996546555262348920, -0.996550705812418450, -0.996554853871111310, -0.996558999438416860, -0.996563142514325100, -0.996567283098825360, -0.996571421191907450, --0.996575556793561020, -0.996579689903775660, -0.996583820522541130, -0.996587948649847010, -0.996592074285682970, -0.996596197430038800, -0.996600318082904170, -0.996604436244268640, --0.996608551914122010, -0.996612665092454160, -0.996616775779254450, -0.996620883974512980, -0.996624989678219220, -0.996629092890363060, -0.996633193610934050, -0.996637291839922110, --0.996641387577316910, -0.996645480823108220, -0.996649571577285950, -0.996653659839839670, -0.996657745610759260, -0.996661828890034520, -0.996665909677655120, -0.996669987973610950, --0.996674063777891920, -0.996678137090487580, -0.996682207911388060, -0.996686276240582920, -0.996690342078062170, -0.996694405423815490, -0.996698466277832760, -0.996702524640104000, --0.996706580510618780, -0.996710633889367200, -0.996714684776339070, -0.996718733171524150, -0.996722779074912470, -0.996726822486493690, -0.996730863406257940, -0.996734901834195110, --0.996738937770294990, -0.996742971214547470, -0.996747002166942560, -0.996751030627470170, -0.996755056596120180, -0.996759080072882500, -0.996763101057747130, -0.996767119550704070, --0.996771135551743240, -0.996775149060854520, -0.996779160078027910, -0.996783168603253330, -0.996787174636521000, -0.996791178177820590, -0.996795179227142230, -0.996799177784476020, --0.996803173849811870, -0.996807167423139680, -0.996811158504449680, -0.996815147093731760, -0.996819133190975930, -0.996823116796172300, -0.996827097909310900, -0.996831076530381720, --0.996835052659374890, -0.996839026296280410, -0.996842997441088290, -0.996846966093788760, -0.996850932254371710, -0.996854895922827390, -0.996858857099145900, -0.996862815783317150, --0.996866771975331470, -0.996870725675178870, -0.996874676882849360, -0.996878625598333290, -0.996882571821620540, -0.996886515552701360, -0.996890456791565960, -0.996894395538204360, --0.996898331792606780, -0.996902265554763470, -0.996906196824664300, -0.996910125602299750, -0.996914051887659910, -0.996917975680734920, -0.996921896981515010, -0.996925815789990290, --0.996929732106151100, -0.996933645929987570, -0.996937557261489920, -0.996941466100648380, -0.996945372447453180, -0.996949276301894450, -0.996953177663962740, -0.996957076533647960, --0.996960972910940440, -0.996964866795830520, -0.996968758188308430, -0.996972647088364530, -0.996976533495988910, -0.996980417411172050, -0.996984298833904050, -0.996988177764175370, --0.996992054201976230, -0.996995928147296980, -0.996999799600127860, -0.997003668560459190, -0.997007535028281430, -0.997011399003584930, -0.997015260486359800, -0.997019119476596490, --0.997022975974285460, -0.997026829979416940, -0.997030681491981370, -0.997034530511969110, -0.997038377039370480, -0.997042221074175950, -0.997046062616375850, -0.997049901665960640, --0.997053738222920650, -0.997057572287246340, -0.997061403858928050, -0.997065232937956240, -0.997069059524321450, -0.997072883618013940, -0.997076705219024140, -0.997080524327342730, --0.997084340942959830, -0.997088155065866230, -0.997091966696052160, -0.997095775833508170, -0.997099582478224830, -0.997103386630192490, -0.997107188289401700, -0.997110987455842920, --0.997114784129506710, -0.997118578310383420, -0.997122369998463820, -0.997126159193738150, -0.997129945896197300, -0.997133730105831400, -0.997137511822631220, -0.997141291046587330, --0.997145067777690080, -0.997148842015930240, -0.997152613761298270, -0.997156383013784840, -0.997160149773380410, -0.997163914040075650, -0.997167675813861010, -0.997171435094727280, --0.997175191882664900, -0.997178946177664450, -0.997182697979716810, -0.997186447288812340, -0.997190194104941810, -0.997193938428095670, -0.997197680258264830, -0.997201419595439730, --0.997205156439611050, -0.997208890790769460, -0.997212622648905640, -0.997216352014010380, -0.997220078886074220, -0.997223803265087750, -0.997227525151041850, -0.997231244543927090, --0.997234961443734250, -0.997238675850454000, -0.997242387764077140, -0.997246097184594230, -0.997249804111996150, -0.997253508546273480, -0.997257210487417000, -0.997260909935417610, --0.997264606890265860, -0.997268301351952550, -0.997271993320468560, -0.997275682795804590, -0.997279369777951510, -0.997283054266899890, -0.997286736262640640, -0.997290415765164530, --0.997294092774462460, -0.997297767290525110, -0.997301439313343360, -0.997305108842908020, -0.997308775879209850, -0.997312440422239770, -0.997316102471988540, -0.997319762028447190, --0.997323419091606270, -0.997327073661456900, -0.997330725737989860, -0.997334375321195950, -0.997338022411066170, -0.997341667007591300, -0.997345309110762250, -0.997348948720569890, --0.997352585837005260, -0.997356220460059120, -0.997359852589722480, -0.997363482225986140, -0.997367109368841100, -0.997370734018278250, -0.997374356174288600, -0.997377975836863050, --0.997381593005992610, -0.997385207681668050, -0.997388819863880730, -0.997392429552621200, -0.997396036747880580, -0.997399641449649880, -0.997403243657920100, -0.997406843372682150, --0.997410440593927250, -0.997414035321646080, -0.997417627555829860, -0.997421217296469600, -0.997424804543556310, -0.997428389297081000, -0.997431971557034670, -0.997435551323408440, --0.997439128596193330, -0.997442703375380550, -0.997446275660960780, -0.997449845452925480, -0.997453412751265420, -0.997456977555971960, -0.997460539867035980, -0.997464099684448710, --0.997467657008201170, -0.997471211838284470, -0.997474764174689720, -0.997478314017408160, -0.997481861366430690, -0.997485406221748640, -0.997488948583353020, -0.997492488451235060, --0.997496025825385880, -0.997499560705796710, -0.997503093092458550, -0.997506622985362630, -0.997510150384500300, -0.997513675289862460, -0.997517197701440540, -0.997520717619225560, --0.997524235043208750, -0.997527749973381340, -0.997531262409734550, -0.997534772352259740, -0.997538279800947890, -0.997541784755790360, -0.997545287216778380, -0.997548787183903160, --0.997552284657156060, -0.997555779636528080, -0.997559272122010790, -0.997562762113595290, -0.997566249611272830, -0.997569734615034840, -0.997573217124872460, -0.997576697140777010, --0.997580174662739850, -0.997583649690752310, -0.997587122224805610, -0.997590592264891000, -0.997594059811000020, -0.997597524863123810, -0.997600987421253920, -0.997604447485381460, --0.997607905055497900, -0.997611360131594570, -0.997614812713662920, -0.997618262801694190, -0.997621710395679710, -0.997625155495611150, -0.997628598101479520, -0.997632038213276510, --0.997635475830993320, -0.997638910954621430, -0.997642343584152380, -0.997645773719577300, -0.997649201360887970, -0.997652626508075510, -0.997656049161131600, -0.997659469320047450, --0.997662886984814650, -0.997666302155424730, -0.997669714831868950, -0.997673125014138850, -0.997676532702226120, -0.997679937896121860, -0.997683340595817870, -0.997686740801305480, --0.997690138512576260, -0.997693533729621660, -0.997696926452433240, -0.997700316681002560, -0.997703704415321080, -0.997707089655380240, -0.997710472401171830, -0.997713852652687080, --0.997717230409917780, -0.997720605672855370, -0.997723978441491520, -0.997727348715817700, -0.997730716495825450, -0.997734081781506470, -0.997737444572852290, -0.997740804869854500, --0.997744162672504650, -0.997747517980794420, -0.997750870794715360, -0.997754221114259150, -0.997757568939417360, -0.997760914270181760, -0.997764257106543710, -0.997767597448495080, --0.997770935296027560, -0.997774270649132600, -0.997777603507801980, -0.997780933872027380, -0.997784261741800460, -0.997787587117112800, -0.997790909997956170, -0.997794230384322360, --0.997797548276202930, -0.997800863673589560, -0.997804176576474130, -0.997807486984848220, -0.997810794898703720, -0.997814100318032080, -0.997817403242825200, -0.997820703673074850, --0.997824001608772710, -0.997827297049910580, -0.997830589996480220, -0.997833880448473430, -0.997837168405881880, -0.997840453868697460, -0.997843736836911850, -0.997847017310516840, --0.997850295289504420, -0.997853570773866160, -0.997856843763593960, -0.997860114258679820, -0.997863382259115310, -0.997866647764892310, -0.997869910776002620, -0.997873171292438240, --0.997876429314190960, -0.997879684841252560, -0.997882937873615040, -0.997886188411270080, -0.997889436454209580, -0.997892682002425650, -0.997895925055909850, -0.997899165614654300, --0.997902403678650910, -0.997905639247891440, -0.997908872322367910, -0.997912102902072220, -0.997915330986996250, -0.997918556577131910, -0.997921779672471200, -0.997925000273006120, --0.997928218378728470, -0.997931433989630360, -0.997934647105703570, -0.997937857726940100, -0.997941065853332090, -0.997944271484871410, -0.997947474621549980, -0.997950675263359900, --0.997953873410293180, -0.997957069062341720, -0.997960262219497630, -0.997963452881752920, -0.997966641049099490, -0.997969826721529450, -0.997973009899034920, -0.997976190581607910, --0.997979368769240320, -0.997982544461924360, -0.997985717659651940, -0.997988888362415280, -0.997992056570206510, -0.997995222283017510, -0.997998385500840410, -0.998001546223667320, --0.998004704451490480, -0.998007860184301880, -0.998011013422093640, -0.998014164164857780, -0.998017312412586510, -0.998020458165271960, -0.998023601422906360, -0.998026742185481710, --0.998029880452990240, -0.998033016225423950, -0.998036149502775190, -0.998039280285036080, -0.998042408572198720, -0.998045534364255360, -0.998048657661198100, -0.998051778463019290, --0.998054896769711040, -0.998058012581265590, -0.998061125897675040, -0.998064236718931630, -0.998067345045027700, -0.998070450875955360, -0.998073554211706960, -0.998076655052274610, --0.998079753397650650, -0.998082849247827310, -0.998085942602796820, -0.998089033462551510, -0.998092121827083510, -0.998095207696385270, -0.998098291070449120, -0.998101371949267180, --0.998104450332831790, -0.998107526221135190, -0.998110599614169920, -0.998113670511928010, -0.998116738914402000, -0.998119804821584240, -0.998122868233466850, -0.998125929150042280, --0.998128987571302970, -0.998132043497241160, -0.998135096927849190, -0.998138147863119500, -0.998141196303044430, -0.998144242247616440, -0.998147285696827760, -0.998150326650670940, --0.998153365109138320, -0.998156401072222250, -0.998159434539915070, -0.998162465512209440, -0.998165493989097710, -0.998168519970572100, -0.998171543456625180, -0.998174564447249500, --0.998177582942437300, -0.998180598942181250, -0.998183612446473690, -0.998186623455306950, -0.998189631968673830, -0.998192637986566540, -0.998195641508977770, -0.998198642535899740, --0.998201641067325230, -0.998204637103246580, -0.998207630643656250, -0.998210621688546910, -0.998213610237911110, -0.998216596291741200, -0.998219579850029850, -0.998222560912769400, --0.998225539479952630, -0.998228515551572100, -0.998231489127620160, -0.998234460208089590, -0.998237428792972840, -0.998240394882262460, -0.998243358475951140, -0.998246319574031430, --0.998249278176496000, -0.998252234283337200, -0.998255187894547920, -0.998258139010120730, -0.998261087630048060, -0.998264033754322820, -0.998266977382937350, -0.998269918515884540, --0.998272857153156830, -0.998275793294747030, -0.998278726940647790, -0.998281658090851680, -0.998284586745351480, -0.998287512904139750, -0.998290436567209280, -0.998293357734552630, --0.998296276406162700, -0.998299192582032040, -0.998302106262153430, -0.998305017446519560, -0.998307926135123090, -0.998310832327956810, -0.998313736025013500, -0.998316637226285720, --0.998319535931766480, -0.998322432141448330, -0.998325325855324190, -0.998328217073386700, -0.998331105795628670, -0.998333992022042870, -0.998336875752621980, -0.998339756987358990, --0.998342635726246600, -0.998345511969277680, -0.998348385716445020, -0.998351256967741300, -0.998354125723159400, -0.998356991982692230, -0.998359855746332570, -0.998362717014073310, --0.998365575785907230, -0.998368432061827240, -0.998371285841826110, -0.998374137125896840, -0.998376985914032230, -0.998379832206225060, -0.998382676002468330, -0.998385517302754930, --0.998388356107077770, -0.998391192415429730, -0.998394026227803710, -0.998396857544192610, -0.998399686364589310, -0.998402512688986830, -0.998405336517378060, -0.998408157849756010, --0.998410976686113560, -0.998413793026443620, -0.998416606870739190, -0.998419418218993270, -0.998422227071198880, -0.998425033427348780, -0.998427837287436120, -0.998430638651453980, --0.998433437519395170, -0.998436233891252800, -0.998439027767019760, -0.998441819146689170, -0.998444608030254140, -0.998447394417707470, -0.998450178309042370, -0.998452959704251740, --0.998455738603328810, -0.998458515006266590, -0.998461288913057960, -0.998464060323696170, -0.998466829238174200, -0.998469595656485190, -0.998472359578622130, -0.998475121004578250, --0.998477879934346560, -0.998480636367920170, -0.998483390305292100, -0.998486141746455670, -0.998488890691403790, -0.998491637140129670, -0.998494381092626560, -0.998497122548887450, --0.998499861508905460, -0.998502597972674040, -0.998505331940185870, -0.998508063411434500, -0.998510792386412940, -0.998513518865114410, -0.998516242847532150, -0.998518964333659160, --0.998521683323488900, -0.998524399817014350, -0.998527113814228760, -0.998529825315125460, -0.998532534319697460, -0.998535240827938320, -0.998537944839840930, -0.998540646355398740, --0.998543345374604980, -0.998546041897452770, -0.998548735923935450, -0.998551427454046350, -0.998554116487778700, -0.998556803025125730, -0.998559487066080780, -0.998562168610637070, --0.998564847658787950, -0.998567524210526640, -0.998570198265846590, -0.998572869824741030, -0.998575538887203410, -0.998578205453226730, -0.998580869522804670, -0.998583531095930450, --0.998586190172597420, -0.998588846752798800, -0.998591500836528150, -0.998594152423778690, -0.998596801514543890, -0.998599448108817180, -0.998602092206591680, -0.998604733807861080, --0.998607372912618580, -0.998610009520857660, -0.998612643632571740, -0.998615275247754170, -0.998617904366398410, -0.998620530988497900, -0.998623155114046090, -0.998625776743036430, --0.998628395875462260, -0.998631012511317030, -0.998633626650594410, -0.998636238293287630, -0.998638847439390350, -0.998641454088895930, -0.998644058241797810, -0.998646659898089540, --0.998649259057764690, -0.998651855720816610, -0.998654449887238950, -0.998657041557025170, -0.998659630730168720, -0.998662217406663280, -0.998664801586502280, -0.998667383269679300, --0.998669962456187780, -0.998672539146021390, -0.998675113339173580, -0.998677685035638140, -0.998680254235408400, -0.998682820938478040, -0.998685385144840620, -0.998687946854489810, --0.998690506067419050, -0.998693062783622020, -0.998695617003092280, -0.998698168725823620, -0.998700717951809480, -0.998703264681043650, -0.998705808913519570, -0.998708350649230910, --0.998710889888171470, -0.998713426630334690, -0.998715960875714460, -0.998718492624304340, -0.998721021876097900, -0.998723548631088920, -0.998726072889271070, -0.998728594650638120, --0.998731113915183540, -0.998733630682901330, -0.998736144953784930, -0.998738656727828240, -0.998741166005024830, -0.998743672785368570, -0.998746177068853160, -0.998748678855472250, --0.998751178145219630, -0.998753674938089090, -0.998756169234074400, -0.998758661033169240, -0.998761150335367500, -0.998763637140662740, -0.998766121449048970, -0.998768603260519860, --0.998771082575069300, -0.998773559392691080, -0.998776033713378860, -0.998778505537126660, -0.998780974863928140, -0.998783441693777090, -0.998785906026667500, -0.998788367862593170, --0.998790827201547880, -0.998793284043525630, -0.998795738388520090, -0.998798190236525270, -0.998800639587534840, -0.998803086441542920, -0.998805530798543280, -0.998807972658529720, --0.998810412021496340, -0.998812848887436820, -0.998815283256345280, -0.998817715128215490, -0.998820144503041460, -0.998822571380816980, -0.998824995761536160, -0.998827417645192780, --0.998829837031780960, -0.998832253921294490, -0.998834668313727360, -0.998837080209073580, -0.998839489607327050, -0.998841896508481870, -0.998844300912531850, -0.998846702819471190, --0.998849102229293680, -0.998851499141993450, -0.998853893557564600, -0.998856285476000920, -0.998858674897296410, -0.998861061821445410, -0.998863446248441590, -0.998865828178279180, --0.998868207610952300, -0.998870584546454830, -0.998872958984780900, -0.998875330925924620, -0.998877700369880000, -0.998880067316641140, -0.998882431766202060, -0.998884793718556870, --0.998887153173699800, -0.998889510131624860, -0.998891864592326040, -0.998894216555797580, -0.998896566022033580, -0.998898912991028180, -0.998901257462775580, -0.998903599437269700, --0.998905938914504960, -0.998908275894475280, -0.998910610377174880, -0.998912942362597980, -0.998915271850738810, -0.998917598841591370, -0.998919923335150010, -0.998922245331408720, --0.998924564830361960, -0.998926881832003730, -0.998929196336328260, -0.998931508343329780, -0.998933817853002610, -0.998936124865340890, -0.998938429380338830, -0.998940731397990670, --0.998943030918290730, -0.998945327941233140, -0.998947622466812350, -0.998949914495022350, -0.998952204025857720, -0.998954491059312440, -0.998956775595380990, -0.998959057634057680, --0.998961337175336640, -0.998963614219212310, -0.998965888765678930, -0.998968160814730830, -0.998970430366362240, -0.998972697420567710, -0.998974961977341370, -0.998977224036677660, --0.998979483598570810, -0.998981740663015260, -0.998983995230005470, -0.998986247299535560, -0.998988496871600070, -0.998990743946193360, -0.998992988523309870, -0.998995230602943820, --0.998997470185089660, -0.998999707269741970, -0.999001941856894840, -0.999004173946542950, -0.999006403538680640, -0.999008630633302250, -0.999010855230402340, -0.999013077329975240, --0.999015296932015520, -0.999017514036517510, -0.999019728643475660, -0.999021940752884640, -0.999024150364738680, -0.999026357479032350, -0.999028562095760080, -0.999030764214916430, --0.999032963836495980, -0.999035160960492940, -0.999037355586902100, -0.999039547715717900, -0.999041737346934800, -0.999043924480547350, -0.999046109116550120, -0.999048291254937550, --0.999050470895704310, -0.999052648038844860, -0.999054822684353750, -0.999056994832225650, -0.999059164482455020, -0.999061331635036520, -0.999063496289964710, -0.999065658447234160, --0.999067818106839420, -0.999069975268775060, -0.999072129933035850, -0.999074282099616350, -0.999076431768511130, -0.999078578939714860, -0.999080723613222090, -0.999082865789027500, --0.999085005467125750, -0.999087142647511530, -0.999089277330179380, -0.999091409515124100, -0.999093539202340230, -0.999095666391822570, -0.999097791083565780, -0.999099913277564420, --0.999102032973813390, -0.999104150172307140, -0.999106264873040660, -0.999108377076008410, -0.999110486781205290, -0.999112593988625950, -0.999114698698265080, -0.999116800910117450, --0.999118900624177850, -0.999120997840440950, -0.999123092558901640, -0.999125184779554590, -0.999127274502394580, -0.999129361727416290, -0.999131446454614710, -0.999133528683984420, --0.999135608415520290, -0.999137685649217230, -0.999139760385070020, -0.999141832623073320, -0.999143902363222040, -0.999145969605510940, -0.999148034349934930, -0.999150096596488900, --0.999152156345167630, -0.999154213595965900, -0.999156268348878720, -0.999158320603900860, -0.999160370361027230, -0.999162417620252600, -0.999164462381571970, -0.999166504644980140, --0.999168544410471980, -0.999170581678042620, -0.999172616447686730, -0.999174648719399320, -0.999176678493175260, -0.999178705769009470, -0.999180730546897040, -0.999182752826832670, --0.999184772608811440, -0.999186789892828280, -0.999188804678878270, -0.999190816966956110, -0.999192826757056900, -0.999194834049175640, -0.999196838843307340, -0.999198841139446900, --0.999200840937589430, -0.999202838237729820, -0.999204833039863070, -0.999206825343984310, -0.999208815150088410, -0.999210802458170510, -0.999212787268225600, -0.999214769580248690, --0.999216749394234880, -0.999218726710179310, -0.999220701528076850, -0.999222673847922520, -0.999224643669711640, -0.999226610993439120, -0.999228575819100070, -0.999230538146689610, --0.999232497976202730, -0.999234455307634660, -0.999236410140980410, -0.999238362476235100, -0.999240312313393940, -0.999242259652452060, -0.999244204493404450, -0.999246146836246350, --0.999248086680972870, -0.999250024027579230, -0.999251958876060550, -0.999253891226411840, -0.999255821078628540, -0.999257748432705540, -0.999259673288638290, -0.999261595646421920, --0.999263515506051410, -0.999265432867522120, -0.999267347730829370, -0.999269260095968170, -0.999271169962933750, -0.999273077331721550, -0.999274982202326580, -0.999276884574744170, --0.999278784448969560, -0.999280681824997960, -0.999282576702824610, -0.999284469082444950, -0.999286358963853980, -0.999288246347047160, -0.999290131232019820, -0.999292013618767070, --0.999293893507284260, -0.999295770897566720, -0.999297645789609780, -0.999299518183408790, -0.999301388078958960, -0.999303255476255540, -0.999305120375294180, -0.999306982776069890, --0.999308842678578220, -0.999310700082814420, -0.999312554988773800, -0.999314407396451830, -0.999316257305843840, -0.999318104716945270, -0.999319949629751350, -0.999321792044257640, --0.999323631960459370, -0.999325469378352090, -0.999327304297931150, -0.999329136719191880, -0.999330966642129730, -0.999332794066740250, -0.999334618993018790, -0.999336441420960790, --0.999338261350561700, -0.999340078781816850, -0.999341893714721820, -0.999343706149272150, -0.999345516085463180, -0.999347323523290370, -0.999349128462749370, -0.999350930903835420, --0.999352730846544190, -0.999354528290871120, -0.999356323236811780, -0.999358115684361610, -0.999359905633516070, -0.999361693084270810, -0.999363478036621400, -0.999365260490563290, --0.999367040446091930, -0.999368817903202980, -0.999370592861892120, -0.999372365322154680, -0.999374135283986330, -0.999375902747382640, -0.999377667712339160, -0.999379430178851560, --0.999381190146915400, -0.999382947616526130, -0.999384702587679640, -0.999386455060371380, -0.999388205034596910, -0.999389952510352010, -0.999391697487632240, -0.999393439966433150, --0.999395179946750420, -0.999396917428579830, -0.999398652411916940, -0.999400384896757420, -0.999402114883096940, -0.999403842370931160, -0.999405567360255760, -0.999407289851066420, --0.999409009843358900, -0.999410727337128880, -0.999412442332372030, -0.999414154829084020, -0.999415864827260640, -0.999417572326897650, -0.999419277327990740, -0.999420979830535570, --0.999422679834527930, -0.999424377339963590, -0.999426072346838450, -0.999427764855148060, -0.999429454864888210, -0.999431142376054680, -0.999432827388643360, -0.999434509902650040, --0.999436189918070260, -0.999437867434900150, -0.999439542453135380, -0.999441214972771720, -0.999442884993805070, -0.999444552516231100, -0.999446217540045810, -0.999447880065244990, --0.999449540091824410, -0.999451197619780070, -0.999452852649107660, -0.999454505179803170, -0.999456155211862370, -0.999457802745281290, -0.999459447780055580, -0.999461090316181240, --0.999462730353654290, -0.999464367892470400, -0.999466002932625660, -0.999467635474115990, -0.999469265516937040, -0.999470893061085050, -0.999472518106555800, -0.999474140653345280, --0.999475760701449390, -0.999477378250864130, -0.999478993301585410, -0.999480605853609210, -0.999482215906931430, -0.999483823461548180, -0.999485428517455250, -0.999487031074648870, --0.999488631133124920, -0.999490228692879400, -0.999491823753908220, -0.999493416316207580, -0.999495006379773290, -0.999496593944601550, -0.999498179010688380, -0.999499761578029670, --0.999501341646621630, -0.999502919216460170, -0.999504494287541510, -0.999506066859861540, -0.999507636933416380, -0.999509204508202130, -0.999510769584214920, -0.999512332161450750, --0.999513892239905720, -0.999515449819576070, -0.999517004900457700, -0.999518557482546810, -0.999520107565839640, -0.999521655150332090, -0.999523200236020480, -0.999524742822900820, --0.999526282910969340, -0.999527820500222040, -0.999529355590655370, -0.999530888182265210, -0.999532418275047800, -0.999533945868999350, -0.999535470964116100, -0.999536993560394160, --0.999538513657829750, -0.999540031256418990, -0.999541546356158220, -0.999543058957043540, -0.999544569059071190, -0.999546076662237380, -0.999547581766538570, -0.999549084371970650, --0.999550584478530070, -0.999552082086212930, -0.999553577195015700, -0.999555069804934470, -0.999556559915965590, -0.999558047528105400, -0.999559532641350000, -0.999561015255695740, --0.999562495371138950, -0.999563972987675960, -0.999565448105303010, -0.999566920724016540, -0.999568390843812660, -0.999569858464687820, -0.999571323586638360, -0.999572786209660610, --0.999574246333750800, -0.999575703958905490, -0.999577159085120790, -0.999578611712393260, -0.999580061840719240, -0.999581509470095050, -0.999582954600517050, -0.999584397231981780, --0.999585837364485360, -0.999587274998024470, -0.999588710132595320, -0.999590142768194360, -0.999591572904818150, -0.999593000542462920, -0.999594425681125220, -0.999595848320801510, --0.999597268461488110, -0.999598686103181480, -0.999600101245878280, -0.999601513889574740, -0.999602924034267430, -0.999604331679952770, -0.999605736826627340, -0.999607139474287590, --0.999608539622929950, -0.999609937272550990, -0.999611332423147150, -0.999612725074714990, -0.999614115227251080, -0.999615502880751740, -0.999616888035213760, -0.999618270690633580, --0.999619650847007660, -0.999621028504332540, -0.999622403662605020, -0.999623776321821420, -0.999625146481978310, -0.999626514143072460, -0.999627879305100220, -0.999629241968058360, --0.999630602131943320, -0.999631959796751790, -0.999633314962480420, -0.999634667629125670, -0.999636017796684320, -0.999637365465152920, -0.999638710634528140, -0.999640053304806540, --0.999641393475984800, -0.999642731148059570, -0.999644066321027540, -0.999645398994885250, -0.999646729169629600, -0.999648056845257040, -0.999649382021764450, -0.999650704699148300, --0.999652024877405340, -0.999653342556532490, -0.999654657736526180, -0.999655970417383190, -0.999657280599100310, -0.999658588281674310, -0.999659893465101760, -0.999661196149379430, --0.999662496334504210, -0.999663794020472670, -0.999665089207281700, -0.999666381894927960, -0.999667672083408340, -0.999668959772719520, -0.999670244962858280, -0.999671527653821390, --0.999672807845605750, -0.999674085538208020, -0.999675360731625110, -0.999676633425853780, -0.999677903620890930, -0.999679171316733230, -0.999680436513377680, -0.999681699210820950, --0.999682959409060050, -0.999684217108091740, -0.999685472307912940, -0.999686725008520400, -0.999687975209911040, -0.999689222912081730, -0.999690468115029370, -0.999691710818750860, --0.999692951023243070, -0.999694188728502910, -0.999695423934527260, -0.999696656641313130, -0.999697886848857300, -0.999699114557156760, -0.999700339766208420, -0.999701562476009160, --0.999702782686556100, -0.999704000397846020, -0.999705215609876020, -0.999706428322642890, -0.999707638536143750, -0.999708846250375480, -0.999710051465335090, -0.999711254181019580, --0.999712454397425950, -0.999713652114551210, -0.999714847332392350, -0.999716040050946280, -0.999717230270210200, -0.999718417990181020, -0.999719603210855730, -0.999720785932231460, --0.999721966154305310, -0.999723143877074170, -0.999724319100535160, -0.999725491824685400, -0.999726662049521870, -0.999727829775041710, -0.999728995001242020, -0.999730157728119790, --0.999731317955672160, -0.999732475683896230, -0.999733630912789110, -0.999734783642347910, -0.999735933872569870, -0.999737081603451870, -0.999738226834991140, -0.999739369567184900, --0.999740509800030260, -0.999741647533524350, -0.999742782767664260, -0.999743915502447230, -0.999745045737870490, -0.999746173473931020, -0.999747298710626180, -0.999748421447953170, --0.999749541685909020, -0.999750659424490930, -0.999751774663696360, -0.999752887403522190, -0.999753997643965890, -0.999755105385024660, -0.999756210626695620, -0.999757313368976000, --0.999758413611863130, -0.999759511355354240, -0.999760606599446540, -0.999761699344137390, -0.999762789589423880, -0.999763877335303470, -0.999764962581773390, -0.999766045328830840, --0.999767125576473180, -0.999768203324697740, -0.999769278573501840, -0.999770351322882720, -0.999771421572837720, -0.999772489323364040, -0.999773554574459270, -0.999774617326120610, --0.999775677578345400, -0.999776735331130980, -0.999777790584474690, -0.999778843338373970, -0.999779893592826150, -0.999780941347828580, -0.999781986603378580, -0.999783029359473720, --0.999784069616111220, -0.999785107373288630, -0.999786142631003180, -0.999787175389252440, -0.999788205648033720, -0.999789233407344490, -0.999790258667182190, -0.999791281427544250, --0.999792301688428140, -0.999793319449831190, -0.999794334711750940, -0.999795347474184970, -0.999796357737130600, -0.999797365500585290, -0.999798370764546580, -0.999799373529011940, --0.999800373793978790, -0.999801371559444820, -0.999802366825407350, -0.999803359591864060, -0.999804349858812280, -0.999805337626249680, -0.999806322894173700, -0.999807305662581910, --0.999808285931471860, -0.999809263700841110, -0.999810238970687220, -0.999811211741007730, -0.999812182011800220, -0.999813149783062240, -0.999814115054791340, -0.999815077826985200, --0.999816038099641370, -0.999816995872757410, -0.999817951146330990, -0.999818903920359660, -0.999819854194841100, -0.999820801969772850, -0.999821747245152710, -0.999822690020978120, --0.999823630297246750, -0.999824568073956370, -0.999825503351104650, -0.999826436128689040, -0.999827366406707440, -0.999828294185157400, -0.999829219464036580, -0.999830142243342770, --0.999831062523073520, -0.999831980303226730, -0.999832895583799840, -0.999833808364790850, -0.999834718646197330, -0.999835626428016930, -0.999836531710247560, -0.999837434492886760, --0.999838334775932420, -0.999839232559382230, -0.999840127843234060, -0.999841020627485480, -0.999841910912134260, -0.999842798697178400, -0.999843683982615470, -0.999844566768443350, --0.999845447054659830, -0.999846324841262790, -0.999847200128249790, -0.999848072915618840, -0.999848943203367700, -0.999849810991494170, -0.999850676279996240, -0.999851539068871480, --0.999852399358117980, -0.999853257147733430, -0.999854112437715710, -0.999854965228062720, -0.999855815518772340, -0.999856663309842460, -0.999857508601270870, -0.999858351393055460, --0.999859191685194220, -0.999860029477685040, -0.999860864770525710, -0.999861697563714350, -0.999862527857248610, -0.999863355651126610, -0.999864180945346240, -0.999865003739905390, --0.999865824034801950, -0.999866641830034040, -0.999867457125599550, -0.999868269921496360, -0.999869080217722580, -0.999869888014276010, -0.999870693311154750, -0.999871496108356790, --0.999872296405880050, -0.999873094203722610, -0.999873889501882380, -0.999874682300357480, -0.999875472599145780, -0.999876260398245510, -0.999877045697654570, -0.999877828497370950, --0.999878608797392760, -0.999879386597718130, -0.999880161898344940, -0.999880934699271420, -0.999881705000495560, -0.999882472802015480, -0.999883238103829060, -0.999884000905934660, --0.999884761208330250, -0.999885519011013970, -0.999886274313983800, -0.999887027117238090, -0.999887777420774610, -0.999888525224591820, -0.999889270528687700, -0.999890013333060490, --0.999890753637708070, -0.999891491442628900, -0.999892226747820970, -0.999892959553282390, -0.999893689859011500, -0.999894417665006420, -0.999895142971265140, -0.999895865777786110, --0.999896586084567440, -0.999897303891607360, -0.999898019198903860, -0.999898732006455400, -0.999899442314260090, -0.999900150122316260, -0.999900855430621900, -0.999901558239175480, --0.999902258547975210, -0.999902956357019200, -0.999903651666305900, -0.999904344475833430, -0.999905034785600110, -0.999905722595604170, -0.999906407905843950, -0.999907090716317670, --0.999907771027023660, -0.999908448837960260, -0.999909124149125810, -0.999909796960518400, -0.999910467272136620, -0.999911135083978550, -0.999911800396042770, -0.999912463208327500, --0.999913123520830950, -0.999913781333551690, -0.999914436646487940, -0.999915089459638030, -0.999915739773000520, -0.999916387586573530, -0.999917032900355720, -0.999917675714345200, --0.999918316028540640, -0.999918953842940160, -0.999919589157542310, -0.999920221972345540, -0.999920852287348170, -0.999921480102548670, -0.999922105417945460, -0.999922728233537010, --0.999923348549321740, -0.999923966365298120, -0.999924581681464590, -0.999925194497819580, -0.999925804814361550, -0.999926412631089060, -0.999927017948000540, -0.999927620765094450, --0.999928221082369340, -0.999928818899823660, -0.999929414217455960, -0.999930007035264690, -0.999930597353248410, -0.999931185171405670, -0.999931770489734920, -0.999932353308234710, --0.999932933626903720, -0.999933511445740280, -0.999934086764743160, -0.999934659583910810, -0.999935229903241800, -0.999935797722734660, -0.999936363042388090, -0.999936925862200620, --0.999937486182170820, -0.999938044002297240, -0.999938599322578560, -0.999939152143013430, -0.999939702463600420, -0.999940250284338190, -0.999940795605225310, -0.999941338426260430, --0.999941878747442230, -0.999942416568769250, -0.999942951890240290, -0.999943484711853900, -0.999944015033608860, -0.999944542855503830, -0.999945068177537370, -0.999945590999708260, --0.999946111322015160, -0.999946629144456760, -0.999947144467031810, -0.999947657289739000, -0.999948167612577100, -0.999948675435544660, -0.999949180758640700, -0.999949683581863650, --0.999950183905212400, -0.999950681728685730, -0.999951177052282420, -0.999951669876001040, -0.999952160199840570, -0.999952648023799680, -0.999953133347877170, -0.999953616172071790, --0.999954096496382450, -0.999954574320807810, -0.999955049645346760, -0.999955522469998080, -0.999955992794760550, -0.999956460619633060, -0.999956925944614490, -0.999957388769703530, --0.999957849094899150, -0.999958306920200050, -0.999958762245605310, -0.999959215071113520, -0.999959665396723870, -0.999960113222434940, -0.999960558548245730, -0.999961001374155110, --0.999961441700162100, -0.999961879526265360, -0.999962314852464010, -0.999962747678756810, -0.999963178005142780, -0.999963605831620810, -0.999964031158189770, -0.999964453984848680, --0.999964874311596530, -0.999965292138432100, -0.999965707465354400, -0.999966120292362540, -0.999966530619455400, -0.999966938446631870, -0.999967343773890960, -0.999967746601231780, --0.999968146928653100, -0.999968544756154150, -0.999968940083733830, -0.999969332911391230, -0.999969723239125140, -0.999970111066934900, -0.999970496394819270, -0.999970879222777500, --0.999971259550808460, -0.999971637378911260, -0.999972012707085020, -0.999972385535328740, -0.999972755863641430, -0.999973123692022290, -0.999973489020470340, -0.999973851848984690, --0.999974212177564330, -0.999974570006208490, -0.999974925334916280, -0.999975278163686700, -0.999975628492518860, -0.999975976321412000, -0.999976321650365210, -0.999976664479377610, --0.999977004808448420, -0.999977342637576650, -0.999977677966761510, -0.999978010796002240, -0.999978341125297930, -0.999978668954647710, -0.999978994284050790, -0.999979317113506520, --0.999979637443013880, -0.999979955272572110, -0.999980270602180530, -0.999980583431838270, -0.999980893761544420, -0.999981201591298440, -0.999981506921099440, -0.999981809750946750, --0.999982110080839480, -0.999982407910776860, -0.999982703240758330, -0.999982996070783000, -0.999983286400850100, -0.999983574230959070, -0.999983859561109130, -0.999984142391299510, --0.999984422721529540, -0.999984700551798560, -0.999984975882105780, -0.999985248712450540, -0.999985519042832170, -0.999985786873250020, -0.999986052203703400, -0.999986315034191660, --0.999986575364714140, -0.999986833195270150, -0.999987088525859160, -0.999987341356480370, -0.999987591687133250, -0.999987839517817110, -0.999988084848531520, -0.999988327679275590, --0.999988568010048870, -0.999988805840850700, -0.999989041171680530, -0.999989274002537790, -0.999989504333421820, -0.999989732164332070, -0.999989957495268090, -0.999990180326229110, --0.999990400657214780, -0.999990618488224350, -0.999990833819257460, -0.999991046650313460, -0.999991256981391800, -0.999991464812492010, -0.999991670143613560, -0.999991872974756000, --0.999992073305918770, -0.999992271137101210, -0.999992466468303090, -0.999992659299523750, -0.999992849630762850, -0.999993037462019730, -0.999993222793294060, -0.999993405624585390, --0.999993585955893050, -0.999993763787216830, -0.999993939118556270, -0.999994111949910840, -0.999994282281280070, -0.999994450112663640, -0.999994615444060990, -0.999994778275471900, --0.999994938606895810, -0.999995096438332400, -0.999995251769781320, -0.999995404601242030, -0.999995554932714190, -0.999995702764197580, -0.999995848095691640, -0.999995990927196040, --0.999996131258710560, -0.999996269090234650, -0.999996404421768180, -0.999996537253310610, -0.999996667584861720, -0.999996795416421170, -0.999996920747988630, -0.999997043579563760, --0.999997163911146350, -0.999997281742736050, -0.999997397074332440, -0.999997509905935390, -0.999997620237544570, -0.999997728069159650, -0.999997833400780520, -0.999997936232406740, --0.999998036564038070, -0.999998134395674420, -0.999998229727315340, -0.999998322558960710, -0.999998412890610310, -0.999998500722263820, -0.999998586053921110, -0.999998668885581980, --0.999998749217246070, -0.999998827048913410, -0.999998902380583640, -0.999998975212256560, -0.999999045543932150, -0.999999113375609980, -0.999999178707290160, -0.999999241538972350, --0.999999301870656440, -0.999999359702342220, -0.999999415034029670, -0.999999467865718580, -0.999999518197408730, -0.999999566029100230, -0.999999611360792740, -0.999999654192486150, --0.999999694524180470, -0.999999732355875580, -0.999999767687571370, -0.999999800519267730, -0.999999830850964670, -0.999999858682661950, -0.999999884014359570, -0.999999906846057440, --0.999999927177755650, -0.999999945009453990, -0.999999960341152460, -0.999999973172851050, -0.999999983504549660, -0.999999991336248390, -0.999999996667947140, -0.999999999499645800, --0.999999999831344580, -0.999999997663043260, -0.999999992994741960, -0.999999985826440780, -0.999999976158139510, -0.999999963989838370, -0.999999949321537350, -0.999999932153236350, --0.999999912484935580, -0.999999890316635050, -0.999999865648334760, -0.999999838480034820, -0.999999808811735340, -0.999999776643436310, -0.999999741975137750, -0.999999704806839970, --0.999999665138542880, -0.999999622970246580, -0.999999578301951190, -0.999999531133656920, -0.999999481465363880, -0.999999429297072080, -0.999999374628781630, -0.999999317460492860, --0.999999257792205780, -0.999999195623920480, -0.999999130955637310, -0.999999063787356150, -0.999998994119077440, -0.999998921950801200, -0.999998847282527750, -0.999998770114257090, --0.999998690445989550, -0.999998608277725240, -0.999998523609464510, -0.999998436441207340, -0.999998346772954180, -0.999998254604705040, -0.999998159936460350, -0.999998062768220230, --0.999997963099985010, -0.999997860931754800, -0.999997756263530050, -0.999997649095310860, -0.999997539427097460, -0.999997427258890290, -0.999997312590689580, -0.999997195422495540, --0.999997075754308520, -0.999996953586128830, -0.999996828917956710, -0.999996701749792600, -0.999996572081636610, -0.999996439913489300, -0.999996305245350880, -0.999996168077221690, --0.999996028409102070, -0.999995886240992340, -0.999995741572892950, -0.999995594404804120, -0.999995444736726410, -0.999995292568660040, -0.999995137900605460, -0.999994980732562990, --0.999994821064533080, -0.999994658896516180, -0.999994494228512610, -0.999994327060522830, -0.999994157392547160, -0.999993985224586160, -0.999993810556640160, -0.999993633388709610, --0.999993453720794960, -0.999993271552896750, -0.999993086885015310, -0.999992899717151220, -0.999992710049304790, -0.999992517881476690, -0.999992323213667270, -0.999992126045876950, --0.999991926378106410, -0.999991724210355980, -0.999991519542626330, -0.999991312374917780, -0.999991102707231020, -0.999990890539566470, -0.999990675871924810, -0.999990458704306360, --0.999990239036711690, -0.999990016869141570, -0.999989792201596340, -0.999989565034076540, -0.999989335366582970, -0.999989103199116050, -0.999988868531676230, -0.999988631364264410, --0.999988391696880920, -0.999988149529526530, -0.999987904862201680, -0.999987657694907050, -0.999987408027643300, -0.999987155860411090, -0.999986901193210990, -0.999986644026043540, --0.999986384358909630, -0.999986122191809600, -0.999985857524744340, -0.999985590357714500, -0.999985320690720550, -0.999985048523763350, -0.999984773856843590, -0.999984496689961920, --0.999984217023118900, -0.999983934856315430, -0.999983650189552040, -0.999983363022829530, -0.999983073356148670, -0.999982781189510120, -0.999982486522914550, -0.999982189356362850, --0.999981889689855570, -0.999981587523393720, -0.999981282856977740, -0.999980975690608620, -0.999980666024287150, -0.999980353858013870, -0.999980039191789790, -0.999979722025615580, --0.999979402359492120, -0.999979080193420080, -0.999978755527400340, -0.999978428361433800, -0.999978098695521120, -0.999977766529663190, -0.999977431863860900, -0.999977094698115020, --0.999976755032426330, -0.999976412866795840, -0.999976068201224310, -0.999975721035712530, -0.999975371370261490, -0.999975019204872080, -0.999974664539545090, -0.999974307374281390, --0.999973947709081880, -0.999973585543947660, -0.999973220878879410, -0.999972853713878010, -0.999972484048944570, -0.999972111884079970, -0.999971737219285010, -0.999971360054560670, --0.999970980389908060, -0.999970598225327860, -0.999970213560821270, -0.999969826396389090, -0.999969436732032310, -0.999969044567752040, -0.999968649903549060, -0.999968252739424580, --0.999967853075379390, -0.999967450911414590, -0.999967046247531080, -0.999966639083730070, -0.999966229420012340, -0.999965817256379120, -0.999965402592831400, -0.999964985429370070, --0.999964565765996350, -0.999964143602711240, -0.999963718939515630, -0.999963291776410860, -0.999962862113397800, -0.999962429950477680, -0.999961995287651400, -0.999961558124920160, --0.999961118462284970, -0.999960676299747050, -0.999960231637307410, -0.999959784474967140, -0.999959334812727470, -0.999958882650589410, -0.999958427988554280, -0.999957970826622970, --0.999957511164796700, -0.999957049003076690, -0.999956584341464170, -0.999956117179960020, -0.999955647518565690, -0.999955175357282180, -0.999954700696110810, -0.999954223535052590, --0.999953743874108850, -0.999953261713280810, -0.999952777052569460, -0.999952289891976380, -0.999951800231502430, -0.999951308071148960, -0.999950813410917290, -0.999950316250808660, --0.999949816590824050, -0.999949314430965020, -0.999948809771232680, -0.999948302611628370, -0.999947792952153300, -0.999947280792808700, -0.999946766133595900, -0.999946248974516120, --0.999945729315570800, -0.999945207156761160, -0.999944682498088430, -0.999944155339554160, -0.999943625681159350, -0.999943093522905560, -0.999942558864794000, -0.999942021706826000, --0.999941482049003020, -0.999940939891326260, -0.999940395233797190, -0.999939848076417110, -0.999939298419187490, -0.999938746262109550, -0.999938191605184710, -0.999937634448414550, --0.999937074791800160, -0.999936512635343110, -0.999935947979044840, -0.999935380822906560, -0.999934811166929950, -0.999934239011116330, -0.999933664355467040, -0.999933087199983640, --0.999932507544667450, -0.999931925389520030, -0.999931340734542820, -0.999930753579737260, -0.999930163925104810, -0.999929571770646900, -0.999928977116365190, -0.999928379962260920, --0.999927780308335730, -0.999927178154591090, -0.999926573501028540, -0.999925966347649520, -0.999925356694455590, -0.999924744541448310, -0.999924129888629110, -0.999923512735999550, --0.999922893083561300, -0.999922270931315800, -0.999921646279264610, -0.999921019127409270, -0.999920389475751350, -0.999919757324292610, -0.999919122673034290, -0.999918485521978260, --0.999917845871126090, -0.999917203720479210, -0.999916559070039290, -0.999915911919808110, -0.999915262269787000, -0.999914610119977840, -0.999913955470382090, -0.999913298321001510, --0.999912638671837660, -0.999911976522892210, -0.999911311874166820, -0.999910644725663160, -0.999909975077382880, -0.999909302929327670, -0.999908628281499180, -0.999907951133899080, --0.999907271486529140, -0.999906589339391030, -0.999905904692486520, -0.999905217545817180, -0.999904527899384780, -0.999903835753191080, -0.999903141107237770, -0.999902443961526610, --0.999901744316059380, -0.999901042170837750, -0.999900337525863600, -0.999899630381138490, -0.999898920736664310, -0.999898208592442940, -0.999897493948475930, -0.999896776804765300, --0.999896057161312690, -0.999895335018119890, -0.999894610375188790, -0.999893883232521150, -0.999893153590118770, -0.999892421447983510, -0.999891686806117290, -0.999890949664521740, --0.999890210023198890, -0.999889467882150500, -0.999888723241378450, -0.999887976100884530, -0.999887226460670740, -0.999886474320738850, -0.999885719681090860, -0.999884962541728430, --0.999884202902653670, -0.999883440763868370, -0.999882676125374510, -0.999881908987174000, -0.999881139349268590, -0.999880367211660400, -0.999879592574351330, -0.999878815437343250, --0.999878035800638170, -0.999877253664237850, -0.999876469028144530, -0.999875681892360090, -0.999874892256886310, -0.999874100121725400, -0.999873305486879140, -0.999872508352349750, --0.999871708718139020, -0.999870906584248930, -0.999870101950681710, -0.999869294817439140, -0.999868485184523430, -0.999867673051936470, -0.999866858419680260, -0.999866041287757020, --0.999865221656168530, -0.999864399524917120, -0.999863574894004680, -0.999862747763433200, -0.999861918133205020, -0.999861086003321910, -0.999860251373786200, -0.999859414244599790, --0.999858574615764770, -0.999857732487283490, -0.999856887859157720, -0.999856040731389780, -0.999855191103981800, -0.999854338976935760, -0.999853484350254010, -0.999852627223938420, --0.999851767597991210, -0.999850905472414730, -0.999850040847210960, -0.999849173722382020, -0.999848304097930130, -0.999847431973857610, -0.999846557350166370, -0.999845680226858820, --0.999844800603937100, -0.999843918481403300, -0.999843033859259660, -0.999842146737508490, -0.999841257116152020, -0.999840364995192350, -0.999839470374631830, -0.999838573254472560, --0.999837673634716870, -0.999836771515366980, -0.999835866896425230, -0.999834959777893720, -0.999834050159774890, -0.999833138042070860, -0.999832223424784060, -0.999831306307916610, --0.999830386691470950, -0.999829464575449410, -0.999828539959854100, -0.999827612844687460, -0.999826683229951830, -0.999825751115649420, -0.999824816501782680, -0.999823879388353930, --0.999822939775365400, -0.999821997662819540, -0.999821053050718780, -0.999820105939065340, -0.999819156327861560, -0.999818204217109980, -0.999817249606812840, -0.999816292496972570, --0.999815332887591610, -0.999814370778672300, -0.999813406170217080, -0.999812439062228280, -0.999811469454708450, -0.999810497347659920, -0.999809522741085140, -0.999808545634986560, --0.999807566029366710, -0.999806583924227830, -0.999805599319572470, -0.999804612215403180, -0.999803622611722400, -0.999802630508532460, -0.999801635905836040, -0.999800638803635460, --0.999799639201933270, -0.999798637100732020, -0.999797632500034170, -0.999796625399842260, -0.999795615800158740, -0.999794603700986270, -0.999793589102327180, -0.999792572004184250, --0.999791552406559810, -0.999790530309456420, -0.999789505712876840, -0.999788478616823410, -0.999787449021298790, -0.999786416926305650, -0.999785382331846330, -0.999784345237923590, --0.999783305644539990, -0.999782263551698190, -0.999781218959400640, -0.999780171867650110, -0.999779122276449160, -0.999778070185800340, -0.999777015595706420, -0.999775958506169850, --0.999774898917193510, -0.999773836828779850, -0.999772772240931640, -0.999771705153651440, -0.999770635566942010, -0.999769563480806030, -0.999768488895246050, -0.999767411810264960, --0.999766332225865310, -0.999765250142049760, -0.999764165558821080, -0.999763078476182070, -0.999761988894135370, -0.999760896812683650, -0.999759802231829700, -0.999758705151576280, --0.999757605571926060, -0.999756503492881810, -0.999755398914446310, -0.999754291836622340, -0.999753182259412570, -0.999752070182819860, -0.999750955606847010, -0.999749838531496790, --0.999748718956771980, -0.999747596882675340, -0.999746472309209770, -0.999745345236377920, -0.999744215664182810, -0.999743083592627090, -0.999741949021713650, -0.999740811951445370, --0.999739672381825040, -0.999738530312855640, -0.999737385744539740, -0.999736238676880550, -0.999735089109880630, -0.999733937043542960, -0.999732782477870560, -0.999731625412866200, --0.999730465848532760, -0.999729303784873120, -0.999728139221890190, -0.999726972159586950, -0.999725802597966280, -0.999724630537031200, -0.999723455976784470, -0.999722278917229090, --0.999721099358367950, -0.999719917300204150, -0.999718732742740480, -0.999717545685980040, -0.999716356129925710, -0.999715164074580500, -0.999713969519947400, -0.999712772466029410, --0.999711572912829420, -0.999710370860350530, -0.999709166308595740, -0.999707959257567950, -0.999706749707270360, -0.999705537657705870, -0.999704323108877470, -0.999703106060788270, --0.999701886513441380, -0.999700664466839690, -0.999699439920986420, -0.999698212875884560, -0.999696983331537110, -0.999695751287947190, -0.999694516745117890, -0.999693279703052330, --0.999692040161753610, -0.999690798121224740, -0.999689553581468940, -0.999688306542489190, -0.999687057004288620, -0.999685804966870540, -0.999684550430237850, -0.999683293394393770, --0.999682033859341510, -0.999680771825084190, -0.999679507291624910, -0.999678240258966900, -0.999676970727113260, -0.999675698696067090, -0.999674424165831850, -0.999673147136410420, --0.999671867607806240, -0.999670585580022310, -0.999669301053061950, -0.999668014026928290, -0.999666724501624640, -0.999665432477154110, -0.999664137953520050, -0.999662840930725660, --0.999661541408774170, -0.999660239387668790, -0.999658934867412860, -0.999657627848009600, -0.999656318329462220, -0.999655006311774060, -0.999653691794948340, -0.999652374778988500, --0.999651055263897640, -0.999649733249679210, -0.999648408736336310, -0.999647081723872510, -0.999645752212291020, -0.999644420201595050, -0.999643085691788170, -0.999641748682873480, --0.999640409174854420, -0.999639067167734320, -0.999637722661516630, -0.999636375656204560, -0.999635026151801550, -0.999633674148311060, -0.999632319645736290, -0.999630962644080800, --0.999629603143347810, -0.999628241143540870, -0.999626876644663320, -0.999625509646718590, -0.999624140149710130, -0.999622768153641260, -0.999621393658515430, -0.999620016664336200, --0.999618637171106880, -0.999617255178831040, -0.999615870687512010, -0.999614483697153220, -0.999613094207758350, -0.999611702219330710, -0.999610307731873760, -0.999608910745391040, --0.999607511259886120, -0.999606109275362420, -0.999604704791823400, -0.999603297809272600, -0.999601888327713680, -0.999600476347149880, -0.999599061867584960, -0.999597644889022360, --0.999596225411465760, -0.999594803434918470, -0.999593378959384160, -0.999591951984866500, -0.999590522511368930, -0.999589090538895000, -0.999587656067448370, -0.999586219097032710, --0.999584779627651350, -0.999583337659308070, -0.999581893192006520, -0.999580446225750150, -0.999578996760542740, -0.999577544796387830, -0.999576090333288980, -0.999574633371249970, --0.999573173910274450, -0.999571711950365870, -0.999570247491528010, -0.999568780533764630, -0.999567311077079190, -0.999565839121475560, -0.999564364666957310, -0.999562887713528080, --0.999561408261191780, -0.999559926309951830, -0.999558441859812130, -0.999556954910776230, -0.999555465462848130, -0.999553973516031150, -0.999552479070329400, -0.999550982125746330, --0.999549482682285940, -0.999547980739951770, -0.999546476298747600, -0.999544969358677320, -0.999543459919744580, -0.999541947981953170, -0.999540433545306860, -0.999538916609809540, --0.999537397175464970, -0.999535875242276830, -0.999534350810248990, -0.999532823879385360, -0.999531294449689580, -0.999529762521165650, -0.999528228093817250, -0.999526691167648250, --0.999525151742662540, -0.999523609818864010, -0.999522065396256430, -0.999520518474843690, -0.999518969054629670, -0.999517417135618150, -0.999515862717813120, -0.999514305801218470, --0.999512746385838090, -0.999511184471675750, -0.999509620058735560, -0.999508053147021180, -0.999506483736536830, -0.999504911827286180, -0.999503337419273220, -0.999501760512501950, --0.999500181106976250, -0.999498599202700120, -0.999497014799677560, -0.999495427897912350, -0.999493838497408690, -0.999492246598170380, -0.999490652200201390, -0.999489055303505850, --0.999487455908087630, -0.999485854013950850, -0.999484249621099270, -0.999482642729537240, -0.999481033339268520, -0.999479421450297220, -0.999477807062627340, -0.999476190176262990, --0.999474570791208160, -0.999472948907466960, -0.999471324525043280, -0.999469697643941330, -0.999468068264165120, -0.999466436385718750, -0.999464802008606320, -0.999463165132831950, --0.999461525758399530, -0.999459883885313370, -0.999458239513577480, -0.999456592643195970, -0.999454943274173060, -0.999453291406512730, -0.999451637040219110, -0.999449980175296520, --0.999448320811748840, -0.999446658949580510, -0.999444994588795430, -0.999443327729397920, -0.999441658371392090, -0.999439986514782050, -0.999438312159572130, -0.999436635305766430, --0.999434955953369060, -0.999433274102384360, -0.999431589752816430, -0.999429902904669600, -0.999428213557947980, -0.999426521712655780, -0.999424827368797340, -0.999423130526376770, --0.999421431185398390, -0.999419729345866430, -0.999418025007785200, -0.999416318171158840, -0.999414608835991760, -0.999412897002288080, -0.999411182670052240, -0.999409465839288360, --0.999407746510000860, -0.999406024682193970, -0.999404300355872130, -0.999402573531039450, -0.999400844207700260, -0.999399112385859100, -0.999397378065520090, -0.999395641246687560, --0.999393901929366060, -0.999392160113559800, -0.999390415799273010, -0.999388668986510350, -0.999386919675275930, -0.999385167865574190, -0.999383413557409560, -0.999381656750786380, --0.999379897445709100, -0.999378135642182030, -0.999376371340209620, -0.999374604539796320, -0.999372835240946440, -0.999371063443664550, -0.999369289147954980, -0.999367512353822150, --0.999365733061270630, -0.999363951270304750, -0.999362166980928950, -0.999360380193147770, -0.999358590906965550, -0.999356799122386950, -0.999355004839416310, -0.999353208058058160, --0.999351408778316960, -0.999349607000197260, -0.999347802723703600, -0.999345995948840440, -0.999344186675612200, -0.999342374904023560, -0.999340560634078940, -0.999338743865782920, --0.999336924599140140, -0.999335102834154940, -0.999333278570831980, -0.999331451809175930, -0.999329622549191110, -0.999327790790882410, -0.999325956534254050, -0.999324119779310900, --0.999322280526057430, -0.999320438774498280, -0.999318594524638000, -0.999316747776481270, -0.999314898530032520, -0.999313046785296750, -0.999311192542278180, -0.999309335800981800, --0.999307476561411940, -0.999305614823573500, -0.999303750587470900, -0.999301883853109030, -0.999300014620492450, -0.999298142889625710, -0.999296268660513690, -0.999294391933161050, --0.999292512707572360, -0.999290630983752480, -0.999288746761705980, -0.999286860041437520, -0.999284970822951980, -0.999283079106254020, -0.999281184891348430, -0.999279288178239740, --0.999277388966932970, -0.999275487257432650, -0.999273583049743560, -0.999271676343870600, -0.999269767139818410, -0.999267855437591780, -0.999265941237195590, -0.999264024538634500, --0.999262105341913400, -0.999260183647036950, -0.999258259454010030, -0.999256332762837540, -0.999254403573524240, -0.999252471886074910, -0.999250537700494320, -0.999248601016787470, --0.999246661834959140, -0.999244720155014090, -0.999242775976957210, -0.999240829300793500, -0.999238880126527620, -0.999236928454164560, -0.999234974283709220, -0.999233017615166360, --0.999231058448540990, -0.999229096783837980, -0.999227132621062330, -0.999225165960218710, -0.999223196801312220, -0.999221225144347750, -0.999219250989330290, -0.999217274336264620, --0.999215295185155730, -0.999213313536008730, -0.999211329388828280, -0.999209342743619610, -0.999207353600387590, -0.999205361959137120, -0.999203367819873290, -0.999201371182601110, --0.999199372047325340, -0.999197370414051210, -0.999195366282783710, -0.999193359653527740, -0.999191350526288380, -0.999189338901070760, -0.999187324777879640, -0.999185308156720240, --0.999183289037597680, -0.999181267420516720, -0.999179243305482690, -0.999177216692500590, -0.999175187581575310, -0.999173155972712170, -0.999171121865916170, -0.999169085261192300, --0.999167046158545680, -0.999165004557981520, -0.999162960459504810, -0.999160913863120780, -0.999158864768834420, -0.999156813176650840, -0.999154759086575250, -0.999152702498612880, --0.999150643412768600, -0.999148581829047750, -0.999146517747455440, -0.999144451167996880, -0.999142382090677180, -0.999140310515501560, -0.999138236442475130, -0.999136159871603090, --0.999134080802890680, -0.999131999236342990, -0.999129915171965370, -0.999127828609763010, -0.999125739549741040, -0.999123647991904670, -0.999121553936259230, -0.999119457382809940, --0.999117358331561900, -0.999115256782520560, -0.999113152735691010, -0.999111046191078600, -0.999108937148688650, -0.999106825608526260, -0.999104711570596770, -0.999102595034905620, --0.999100476001457900, -0.999098354470259080, -0.999096230441314350, -0.999094103914628940, -0.999091974890208400, -0.999089843368057840, -0.999087709348182700, -0.999085572830588300, --0.999083433815279980, -0.999081292302263060, -0.999079148291542870, -0.999077001783124860, -0.999074852777014350, -0.999072701273216680, -0.999070547271737270, -0.999068390772581470, --0.999066231775754710, -0.999064070281262430, -0.999061906289109850, -0.999059739799302630, -0.999057570811845990, -0.999055399326745470, -0.999053225344006420, -0.999051048863634270, --0.999048869885634460, -0.999046688410012650, -0.999044504436773950, -0.999042317965924130, -0.999040128997468410, -0.999037937531412350, -0.999035743567761480, -0.999033547106521370, --0.999031348147697230, -0.999029146691294830, -0.999026942737319510, -0.999024736285776820, -0.999022527336672290, -0.999020315890011500, -0.999018101945799870, -0.999015885504042970, --0.999013666564746440, -0.999011445127915620, -0.999009221193556280, -0.999006994761673870, -0.999004765832273930, -0.999002534405362130, -0.999000300480944010, -0.998998064059025140, --0.998995825139611050, -0.998993583722707410, -0.998991339808319890, -0.998989093396453920, -0.998986844487115280, -0.998984593080309510, -0.998982339176042180, -0.998980082774319160, --0.998977823875145780, -0.998975562478527920, -0.998973298584471150, -0.998971032192981110, -0.998968763304063590, -0.998966491917724020, -0.998964218033968290, -0.998961941652802050, --0.998959662774230870, -0.998957381398260620, -0.998955097524896860, -0.998952811154145360, -0.998950522286011890, -0.998948230920502000, -0.998945937057621580, -0.998943640697376400, --0.998941341839772010, -0.998939040484814410, -0.998936736632509040, -0.998934430282861880, -0.998932121435878730, -0.998929810091565230, -0.998927496249927160, -0.998925179910970410, --0.998922861074700630, -0.998920539741123830, -0.998918215910245540, -0.998915889582071780, -0.998913560756608310, -0.998911229433860900, -0.998908895613835450, -0.998906559296537710, --0.998904220481973580, -0.998901879170148940, -0.998899535361069570, -0.998897189054741340, -0.998894840251170260, -0.998892488950361980, -0.998890135152322500, -0.998887778857057710, --0.998885420064573370, -0.998883058774875600, -0.998880694987970160, -0.998878328703862950, -0.998875959922559840, -0.998873588644066950, -0.998871214868390030, -0.998868838595535210, --0.998866459825508150, -0.998864078558314940, -0.998861694793961590, -0.998859308532453970, -0.998856919773798090, -0.998854528517999940, -0.998852134765065400, -0.998849738515000580, --0.998847339767811480, -0.998844938523503870, -0.998842534782084070, -0.998840128543557750, -0.998837719807931230, -0.998835308575210410, -0.998832894845401390, -0.998830478618510040, --0.998828059894542490, -0.998825638673504710, -0.998823214955402940, -0.998820788740243160, -0.998818360028031370, -0.998815928818773680, -0.998813495112476190, -0.998811058909145010, --0.998808620208786140, -0.998806179011405670, -0.998803735317009720, -0.998801289125604510, -0.998798840437196020, -0.998796389251790480, -0.998793935569394000, -0.998791479390012670, --0.998789020713652500, -0.998786559540319920, -0.998784095870020930, -0.998781629702761740, -0.998779161038548360, -0.998776689877387210, -0.998774216219284190, -0.998771740064245740, --0.998769261412277950, -0.998766780263386830, -0.998764296617578930, -0.998761810474860230, -0.998759321835237080, -0.998756830698715570, -0.998754337065302030, -0.998751840935002470, --0.998749342307823530, -0.998746841183771110, -0.998744337562851640, -0.998741831445071340, -0.998739322830436430, -0.998736811718953230, -0.998734298110627970, -0.998731782005466970, --0.998729263403476450, -0.998726742304662850, -0.998724218709032390, -0.998721692616591380, -0.998719164027346170, -0.998716632941303080, -0.998714099358468330, -0.998711563278848360, --0.998709024702449490, -0.998706483629278050, -0.998703940059340380, -0.998701393992642910, -0.998698845429191850, -0.998696294368993760, -0.998693740812054980, -0.998691184758381810, --0.998688626207980600, -0.998686065160857890, -0.998683501617020020, -0.998680935576473420, -0.998678367039224410, -0.998675796005279450, -0.998673222474645180, -0.998670646447327730, --0.998668067923333620, -0.998665486902669430, -0.998662903385341580, -0.998660317371356410, -0.998657728860720350, -0.998655137853440070, -0.998652544349521890, -0.998649948348972360, --0.998647349851798040, -0.998644748858005250, -0.998642145367600650, -0.998639539380590690, -0.998636930896981800, -0.998634319916780640, -0.998631706439993660, -0.998629090466627510, --0.998626471996688530, -0.998623851030183360, -0.998621227567118690, -0.998618601607500820, -0.998615973151336540, -0.998613342198632290, -0.998610708749394620, -0.998608072803630180, --0.998605434361345630, -0.998602793422547430, -0.998600149987242340, -0.998597504055436790, -0.998594855627137570, -0.998592204702351110, -0.998589551281084180, -0.998586895363343440, --0.998584236949135340, -0.998581576038466760, -0.998578912631344240, -0.998576246727774340, -0.998573578327763830, -0.998570907431319490, -0.998568234038447740, -0.998565558149155490, --0.998562879763449370, -0.998560198881335960, -0.998557515502822120, -0.998554829627914420, -0.998552141256619730, -0.998549450388944710, -0.998546757024896040, -0.998544061164480360, --0.998541362807704670, -0.998538661954575520, -0.998535958605099690, -0.998533252759284060, -0.998530544417135180, -0.998527833578660040, -0.998525120243865190, -0.998522404412757640, --0.998519686085344140, -0.998516965261631250, -0.998514241941626080, -0.998511516125335290, -0.998508787812765640, -0.998506057003924030, -0.998503323698817340, -0.998500587897452330, --0.998497849599835900, -0.998495108805974700, -0.998492365515875830, -0.998489619729546090, -0.998486871446992220, -0.998484120668221120, -0.998481367393239780, -0.998478611622055090, --0.998475853354673810, -0.998473092591102840, -0.998470329331349270, -0.998467563575419770, -0.998464795323321440, -0.998462024575061060, -0.998459251330645610, -0.998456475590082100, --0.998453697353377410, -0.998450916620538420, -0.998448133391572120, -0.998445347666485520, -0.998442559445285480, -0.998439768727979130, -0.998436975514573330, -0.998434179805075210, --0.998431381599491520, -0.998428580897829270, -0.998425777700095770, -0.998422972006297700, -0.998420163816442270, -0.998417353130536370, -0.998414539948587200, -0.998411724270601540, --0.998408906096586720, -0.998406085426549520, -0.998403262260497140, -0.998400436598436580, -0.998397608440374950, -0.998394777786319240, -0.998391944636276670, -0.998389108990254240, --0.998386270848258930, -0.998383430210298070, -0.998380587076378560, -0.998377741446507700, -0.998374893320692400, -0.998372042698939870, -0.998369189581257200, -0.998366333967651620, --0.998363475858130120, -0.998360615252699920, -0.998357752151368350, -0.998354886554142280, -0.998352018461028940, -0.998349147872035660, -0.998346274787169530, -0.998343399206437550, --0.998340521129847280, -0.998337640557405590, -0.998334757489119820, -0.998331871924997170, -0.998328983865044760, -0.998326093309270020, -0.998323200257679950, -0.998320304710281990, --0.998317406667083130, -0.998314506128090810, -0.998311603093312240, -0.998308697562754640, -0.998305789536425350, -0.998302879014331570, -0.998299965996480520, -0.998297050482879530, --0.998294132473536040, -0.998291211968457160, -0.998288288967650320, -0.998285363471122620, -0.998282435478881620, -0.998279504990934540, -0.998276572007288700, -0.998273636527951310, --0.998270698552929940, -0.998267758082231780, -0.998264815115864290, -0.998261869653834680, -0.998258921696150380, -0.998255971242818840, -0.998253018293847380, -0.998250062849243340, --0.998247104909014140, -0.998244144473167230, -0.998241181541709930, -0.998238216114649690, -0.998235248191993830, -0.998232277773749900, -0.998229304859925340, -0.998226329450527360, --0.998223351545563740, -0.998220371145041700, -0.998217388248968660, -0.998214402857352190, -0.998211414970199720, -0.998208424587518680, -0.998205431709316530, -0.998202436335600910, --0.998199438466379150, -0.998196438101658810, -0.998193435241447440, -0.998190429885752350, -0.998187422034581330, -0.998184411687941700, -0.998181398845840890, -0.998178383508286800, --0.998175365675286640, -0.998172345346848070, -0.998169322522978630, -0.998166297203685990, -0.998163269388977480, -0.998160239078860760, -0.998157206273343590, -0.998154170972433310, --0.998151133176137680, -0.998148092884464160, -0.998145050097420490, -0.998142004815014030, -0.998138957037252750, -0.998135906764143990, -0.998132853995695400, -0.998129798731914760, --0.998126740972809510, -0.998123680718387530, -0.998120617968656370, -0.998117552723623570, -0.998114484983296910, -0.998111414747684060, -0.998108342016792660, -0.998105266790630390, --0.998102189069205000, -0.998099108852524180, -0.998096026140595450, -0.998092940933426710, -0.998089853231025730, -0.998086763033399940, -0.998083670340557340, -0.998080575152505590, --0.998077477469252350, -0.998074377290805390, -0.998071274617172600, -0.998068169448361520, -0.998065061784380040, -0.998061951625235920, -0.998058838970936950, -0.998055723821490770, --0.998052606176905390, -0.998049486037188460, -0.998046363402347870, -0.998043238272391280, -0.998040110647326560, -0.998036980527161720, -0.998033847911904300, -0.998030712801562410, --0.998027575196143600, -0.998024435095655860, -0.998021292500107070, -0.998018147409505010, -0.998014999823857660, -0.998011849743172810, -0.998008697167458210, -0.998005542096721990, --0.998002384530971900, -0.997999224470215830, -0.997996061914461660, -0.997992896863717390, -0.997989729317990790, -0.997986559277289960, -0.997983386741622790, -0.997980211710997040, --0.997977034185420830, -0.997973854164901920, -0.997970671649448420, -0.997967486639068310, -0.997964299133769490, -0.997961109133559840, -0.997957916638447460, -0.997954721648440350, --0.997951524163546380, -0.997948324183773550, -0.997945121709129970, -0.997941916739623510, -0.997938709275262400, -0.997935499316054410, -0.997932286862007740, -0.997929071913130290, --0.997925854469430160, -0.997922634530915450, -0.997919412097594050, -0.997916187169474280, -0.997912959746563910, -0.997909729828871160, -0.997906497416404140, -0.997903262509170830, --0.997900025107179460, -0.997896785210437900, -0.997893542818954370, -0.997890297932737090, -0.997887050551794050, -0.997883800676133360, -0.997880548305763120, -0.997877293440691650, --0.997874036080926730, -0.997870776226476910, -0.997867513877350070, -0.997864249033554420, -0.997860981695098180, -0.997857711861989460, -0.997854439534236580, -0.997851164711847430, --0.997847887394830550, -0.997844607583193710, -0.997841325276945580, -0.997838040476094030, -0.997834753180647400, -0.997831463390613900, -0.997828171106001750, -0.997824876326819040, --0.997821579053074340, -0.997818279284775620, -0.997814977021931120, -0.997811672264549250, -0.997808365012638250, -0.997805055266206330, -0.997801743025261700, -0.997798428289812690, --0.997795111059867620, -0.997791791335434830, -0.997788469116522530, -0.997785144403139150, -0.997781817195292800, -0.997778487492991920, -0.997775155296244830, -0.997771820605059870, --0.997768483419445350, -0.997765143739409610, -0.997761801564961080, -0.997758456896107980, -0.997755109732858750, -0.997751760075221710, -0.997748407923205290, -0.997745053276817950, --0.997741696136067780, -0.997738336500963550, -0.997734974371513370, -0.997731609747725790, -0.997728242629609240, -0.997724873017171940, -0.997721500910422550, -0.997718126309369510, --0.997714749214021030, -0.997711369624385670, -0.997707987540471960, -0.997704602962288250, -0.997701215889843060, -0.997697826323144850, -0.997694434262201950, -0.997691039707023000, --0.997687642657616560, -0.997684243113990950, -0.997680841076154730, -0.997677436544116340, -0.997674029517884420, -0.997670619997467420, -0.997667207982873890, -0.997663793474112380, --0.997660376471191320, -0.997656956974119270, -0.997653534982904990, -0.997650110497556700, -0.997646683518083280, -0.997643254044493060, -0.997639822076794690, -0.997636387614996840, --0.997632950659107950, -0.997629511209136790, -0.997626069265091790, -0.997622624826981610, -0.997619177894814800, -0.997615728468600140, -0.997612276548346060, -0.997608822134061430, --0.997605365225754710, -0.997601905823434550, -0.997598443927109610, -0.997594979536788550, -0.997591512652480030, -0.997588043274192700, -0.997584571401935350, -0.997581097035716620, --0.997577620175545080, -0.997574140821429480, -0.997570658973378490, -0.997567174631400880, -0.997563687795505310, -0.997560198465700650, -0.997556706641995360, -0.997553212324398420, --0.997549715512918380, -0.997546216207564010, -0.997542714408344190, -0.997539210115267470, -0.997535703328342850, -0.997532194047578870, -0.997528682272984410, -0.997525168004568360, --0.997521651242339270, -0.997518131986306120, -0.997514610236477580, -0.997511085992862530, -0.997507559255469740, -0.997504030024308210, -0.997500498299386470, -0.997496964080713530, --0.997493427368298160, -0.997489888162149230, -0.997486346462275520, -0.997482802268686020, -0.997479255581389500, -0.997475706400394850, -0.997472154725710820, -0.997468600557346540, --0.997465043895310770, -0.997461484739612380, -0.997457923090260160, -0.997454358947263200, -0.997450792310630390, -0.997447223180370490, -0.997443651556492620, -0.997440077439005650, --0.997436500827918460, -0.997432921723240050, -0.997429340124979300, -0.997425756033145090, -0.997422169447746640, -0.997418580368792720, -0.997414988796292310, -0.997411394730254530, --0.997407798170688140, -0.997404199117602250, -0.997400597571005960, -0.997396993530908160, -0.997393386997317940, -0.997389777970244080, -0.997386166449695910, -0.997382552435682300, --0.997378935928212360, -0.997375316927294970, -0.997371695432939240, -0.997368071445154380, -0.997364444963949380, -0.997360815989333240, -0.997357184521315050, -0.997353550559903820, --0.997349914105108760, -0.997346275156938970, -0.997342633715403440, -0.997338989780511390, -0.997335343352271810, -0.997331694430693920, -0.997328043015786700, -0.997324389107559490, --0.997320732706021170, -0.997317073811181180, -0.997313412423048270, -0.997309748541632010, -0.997306082166941390, -0.997302413298985500, -0.997298741937773680, -0.997295068083314810, --0.997291391735618430, -0.997287712894693530, -0.997284031560549340, -0.997280347733195070, -0.997276661412639930, -0.997272972598893250, -0.997269281291964020, -0.997265587491861560, --0.997261891198595210, -0.997258192412174060, -0.997254491132607450, -0.997250787359904690, -0.997247081094074890, -0.997243372335127390, -0.997239661083071490, -0.997235947337916320, --0.997232231099671410, -0.997228512368345870, -0.997224791143949130, -0.997221067426490300, -0.997217341215978940, -0.997213612512424130, -0.997209881315835320, -0.997206147626221840, --0.997202411443592780, -0.997198672767957930, -0.997194931599326260, -0.997191187937707340, -0.997187441783110470, -0.997183693135545000, -0.997179941995020140, -0.997176188361545650, --0.997172432235130520, -0.997168673615784430, -0.997164912503516580, -0.997161148898336510, -0.997157382800253460, -0.997153614209277060, -0.997149843125416660, -0.997146069548681460, --0.997142293479081230, -0.997138514916625200, -0.997134733861323010, -0.997130950313183880, -0.997127164272217370, -0.997123375738432900, -0.997119584711840150, -0.997115791192448310, --0.997111995180267050, -0.997108196675305810, -0.997104395677574030, -0.997100592187081360, -0.997096786203837130, -0.997092977727850990, -0.997089166759132390, -0.997085353297690770, --0.997081537343535770, -0.997077718896677070, -0.997073897957123980, -0.997070074524886160, -0.997066248599973170, -0.997062420182394550, -0.997058589272159850, -0.997054755869278720, --0.997050919973760720, -0.997047081585615390, -0.997043240704852400, -0.997039397331481280, -0.997035551465511590, -0.997031703106953100, -0.997027852255815360, -0.997023998912107910, --0.997020143075840530, -0.997016284747022860, -0.997012423925664360, -0.997008560611774900, -0.997004694805363910, -0.997000826506441280, -0.996996955715016560, -0.996993082431099410, --0.996989206654699590, -0.996985328385826760, -0.996981447624490700, -0.996977564370700950, -0.996973678624467290, -0.996969790385799250, -0.996965899654706940, -0.996962006431199920, --0.996958110715287730, -0.996954212506980350, -0.996950311806287460, -0.996946408613218700, -0.996942502927783970, -0.996938594749993020, -0.996934684079855530, -0.996930770917381360, --0.996926855262580290, -0.996922937115462090, -0.996919016476036530, -0.996915093344313390, -0.996911167720302530, -0.996907239604013730, -0.996903308995456870, -0.996899375894641730, --0.996895440301578170, -0.996891502216275980, -0.996887561638744920, -0.996883618568995100, -0.996879673007036280, -0.996875724952878130, -0.996871774406530850, -0.996867821368004000, --0.996863865837307680, -0.996859907814451660, -0.996855947299445820, -0.996851984292300150, -0.996848018793024430, -0.996844050801628740, -0.996840080318122990, -0.996836107342517040, --0.996832131874820780, -0.996828153915044090, -0.996824173463197070, -0.996820190519289720, -0.996816205083331800, -0.996812217155333410, -0.996808226735304450, -0.996804233823255000, --0.996800238419194850, -0.996796240523134200, -0.996792240135082940, -0.996788237255050950, -0.996784231883048430, -0.996780224019085390, -0.996776213663171820, -0.996772200815317590, --0.996768185475532920, -0.996764167643827800, -0.996760147320212230, -0.996756124504696310, -0.996752099197290130, -0.996748071398003700, -0.996744041106847000, -0.996740008323830250, --0.996735973048963550, -0.996731935282256790, -0.996727895023720280, -0.996723852273363910, -0.996719807031198110, -0.996715759297232660, -0.996711709071477880, -0.996707656353943760, --0.996703601144640410, -0.996699543443578250, -0.996695483250767180, -0.996691420566217290, -0.996687355389939020, -0.996683287721942260, -0.996679217562237320, -0.996675144910834310, --0.996671069767743440, -0.996666992132974830, -0.996662912006538890, -0.996658829388445520, -0.996654744278705150, -0.996650656677328000, -0.996646566584324160, -0.996642473999703740, --0.996638378923477290, -0.996634281355654910, -0.996630181296246810, -0.996626078745263210, -0.996621973702714440, -0.996617866168610700, -0.996613756142962330, -0.996609643625779640, --0.996605528617072740, -0.996601411116851970, -0.996597291125127850, -0.996593168641910390, -0.996589043667210020, -0.996584916201037060, -0.996580786243401740, -0.996576653794314480, --0.996572518853785620, -0.996568381421825470, -0.996564241498444360, -0.996560099083652620, -0.996555954177460680, -0.996551806779878870, -0.996547656890917510, -0.996543504510587040, --0.996539349638897680, -0.996535192275860070, -0.996531032421484440, -0.996526870075781220, -0.996522705238760850, -0.996518537910433650, -0.996514368090810180, -0.996510195779900850, --0.996506020977715900, -0.996501843684265980, -0.996497663899561400, -0.996493481623612730, -0.996489296856430400, -0.996485109598024720, -0.996480919848406250, -0.996476727607585430, --0.996472532875572910, -0.996468335652379020, -0.996464135938014310, -0.996459933732489310, -0.996455729035814470, -0.996451521848000120, -0.996447312169057130, -0.996443099998995830, --0.996438885337826760, -0.996434668185560590, -0.996430448542207640, -0.996426226407778560, -0.996422001782284020, -0.996417774665734330, -0.996413545058140280, -0.996409312959512410, --0.996405078369861140, -0.996400841289197260, -0.996396601717531310, -0.996392359654873830, -0.996388115101235370, -0.996383868056626600, -0.996379618521058270, -0.996375366494540950, --0.996371111977085060, -0.996366854968701480, -0.996362595469400760, -0.996358333479193560, -0.996354068998090540, -0.996349802026102350, -0.996345532563239540, -0.996341260609512890, --0.996336986164933270, -0.996332709229511120, -0.996328429803257090, -0.996324147886182070, -0.996319863478296600, -0.996315576579611560, -0.996311287190137620, -0.996306995309885420, --0.996302700938865750, -0.996298404077089250, -0.996294104724566810, -0.996289802881309080, -0.996285498547326840, -0.996281191722630850, -0.996276882407231890, -0.996272570601140720, --0.996268256304368220, -0.996263939516924930, -0.996259620238821860, -0.996255298470069660, -0.996250974210679320, -0.996246647460661490, -0.996242318220027180, -0.996237986488786920, --0.996233652266951710, -0.996229315554532420, -0.996224976351539840, -0.996220634657984830, -0.996216290473878160, -0.996211943799230730, -0.996207594634053620, -0.996203242978357380, --0.996198888832153130, -0.996194532195451510, -0.996190173068263630, -0.996185811450600370, -0.996181447342472600, -0.996177080743891110, -0.996172711654866980, -0.996168340075411110, --0.996163966005534360, -0.996159589445247630, -0.996155210394562010, -0.996150828853488270, -0.996146444822037510, -0.996142058300220620, -0.996137669288048700, -0.996133277785532510, --0.996128883792683160, -0.996124487309511530, -0.996120088336028720, -0.996115686872245720, -0.996111282918173410, -0.996106876473823010, -0.996102467539205390, -0.996098056114331550, --0.996093642199212700, -0.996089225793859610, -0.996084806898283490, -0.996080385512495340, -0.996075961636506250, -0.996071535270327210, -0.996067106413969450, -0.996062675067443840, --0.996058241230761480, -0.996053804903933580, -0.996049366086971260, -0.996044924779885380, -0.996040480982687270, -0.996036034695388040, -0.996031585917998560, -0.996027134650530170, --0.996022680892994060, -0.996018224645401130, -0.996013765907762580, -0.996009304680089640, -0.996004840962393500, -0.996000374754685280, -0.995995906056976080, -0.995991434869277100, --0.995986961191599570, -0.995982485023954590, -0.995978006366353470, -0.995973525218807330, -0.995969041581327370, -0.995964555453924700, -0.995960066836610760, -0.995955575729396640, --0.995951082132293550, -0.995946586045312720, -0.995942087468465460, -0.995937586401763000, -0.995933082845216640, -0.995928576798837510, -0.995924068262636910, -0.995919557236626060, --0.995915043720816410, -0.995910527715219150, -0.995906009219845620, -0.995901488234707030, -0.995896964759814710, -0.995892438795179970, -0.995887910340814140, -0.995883379396728550, --0.995878845962934520, -0.995874310039443380, -0.995869771626266440, -0.995865230723415040, -0.995860687330900610, -0.995856141448734470, -0.995851593076927940, -0.995847042215492360, --0.995842488864439270, -0.995837933023779990, -0.995833374693525840, -0.995828813873688270, -0.995824250564278700, -0.995819684765308470, -0.995815116476789000, -0.995810545698731620, --0.995805972431148100, -0.995801396674049540, -0.995796818427447490, -0.995792237691353390, -0.995787654465778770, -0.995783068750734860, -0.995778480546233410, -0.995773889852285770, --0.995769296668903350, -0.995764700996097710, -0.995760102833880280, -0.995755502182262610, -0.995750899041256240, -0.995746293410872620, -0.995741685291123170, -0.995737074682019550, --0.995732461583573200, -0.995727845995795780, -0.995723227918698830, -0.995718607352293670, -0.995713984296591970, -0.995709358751605380, -0.995704730717345330, -0.995700100193823490, --0.995695467181051510, -0.995690831679040710, -0.995686193687802870, -0.995681553207349630, -0.995676910237692450, -0.995672264778842960, -0.995667616830812730, -0.995662966393613620, --0.995658313467257080, -0.995653658051754650, -0.995649000147118210, -0.995644339753359200, -0.995639676870489270, -0.995635011498520180, -0.995630343637463610, -0.995625673287331200, --0.995621000448134620, -0.995616325119885510, -0.995611647302595550, -0.995606966996276490, -0.995602284200939990, -0.995597598916597830, -0.995592911143261650, -0.995588220880943230, --0.995583528129654230, -0.995578832889406410, -0.995574135160211430, -0.995569434942081170, -0.995564732235027280, -0.995560027039061660, -0.995555319354195940, -0.995550609180441910, --0.995545896517811450, -0.995541181366316090, -0.995536463725967940, -0.995531743596778540, -0.995527020978759670, -0.995522295871923310, -0.995517568276281350, -0.995512838191845330, --0.995508105618627350, -0.995503370556638960, -0.995498633005892140, -0.995493892966398790, -0.995489150438170770, -0.995484405421219850, -0.995479657915557930, -0.995474907921196750, --0.995470155438148430, -0.995465400466424730, -0.995460643006037430, -0.995455883056998610, -0.995451120619319950, -0.995446355693013540, -0.995441588278091260, -0.995436818374565100, --0.995432045982446830, -0.995427271101748330, -0.995422493732481820, -0.995417713874658940, -0.995412931528291910, -0.995408146693392500, -0.995403359369972710, -0.995398569558044510, --0.995393777257619910, -0.995388982468710880, -0.995384185191329430, -0.995379385425487430, -0.995374583171196980, -0.995369778428470080, -0.995364971197318820, -0.995360161477754970, --0.995355349269790860, -0.995350534573438250, -0.995345717388709360, -0.995340897715616290, -0.995336075554170810, -0.995331250904385230, -0.995326423766271560, -0.995321594139841780, --0.995316762025107990, -0.995311927422082410, -0.995307090330776800, -0.995302250751203600, -0.995297408683374800, -0.995292564127302380, -0.995287717082998680, -0.995282867550475570, --0.995278015529745260, -0.995273161020819970, -0.995268304023711800, -0.995263444538432960, -0.995258582564995440, -0.995253718103411460, -0.995248851153693100, -0.995243981715852710, --0.995239109789902380, -0.995234235375854090, -0.995229358473720400, -0.995224479083513300, -0.995219597205245000, -0.995214712838927600, -0.995209825984573530, -0.995204936642194780, --0.995200044811803800, -0.995195150493412670, -0.995190253687033730, -0.995185354392679080, -0.995180452610361140, -0.995175548340091920, -0.995170641581883950, -0.995165732335749340, --0.995160820601700410, -0.995155906379749270, -0.995150989669908560, -0.995146070472190280, -0.995141148786606980, -0.995136224613170640, -0.995131297951893700, -0.995126368802788600, --0.995121437165867650, -0.995116503041143070, -0.995111566428627190, -0.995106627328332440, -0.995101685740271020, -0.995096741664455500, -0.995091795100898070, -0.995086846049611170, --0.995081894510607130, -0.995076940483898390, -0.995071983969497250, -0.995067024967416280, -0.995062063477667680, -0.995057099500263890, -0.995052133035217220, -0.995047164082540350, --0.995042192642245580, -0.995037218714345360, -0.995032242298852120, -0.995027263395778180, -0.995022282005136200, -0.995017298126938400, -0.995012311761197420, -0.995007322907925480, --0.995002331567135470, -0.994997337738839470, -0.994992341423050260, -0.994987342619780170, -0.994982341329041730, -0.994977337550847270, -0.994972331285209570, -0.994967322532141150, --0.994962311291654360, -0.994957297563761720, -0.994952281348475910, -0.994947262645809350, -0.994942241455774700, -0.994937217778384400, -0.994932191613650980, -0.994927162961587230, --0.994922131822205460, -0.994917098195518430, -0.994912062081538710, -0.994907023480278710, -0.994901982391751090, -0.994896938815968750, -0.994891892752943870, -0.994886844202689360, --0.994881793165217740, -0.994876739640541570, -0.994871683628673620, -0.994866625129626430, -0.994861564143412650, -0.994856500670045050, -0.994851434709536080, -0.994846366261898600, --0.994841295327145160, -0.994836221905288530, -0.994831145996341370, -0.994826067600316110, -0.994820986717225960, -0.994815903347083250, -0.994810817489900740, -0.994805729145691320, --0.994800638314467410, -0.994795544996242010, -0.994790449191027770, -0.994785350898837350, -0.994780250119683630, -0.994775146853579150, -0.994770041100536790, -0.994764932860569440, --0.994759822133689740, -0.994754708919910470, -0.994749593219244500, -0.994744475031704380, -0.994739354357303210, -0.994734231196053640, -0.994729105547968450, -0.994723977413060510, --0.994718846791342590, -0.994713713682827680, -0.994708578087528440, -0.994703440005457630, -0.994698299436628240, -0.994693156381053270, -0.994688010838745250, -0.994682862809717290, --0.994677712293982160, -0.994672559291552740, -0.994667403802441790, -0.994662245826662520, -0.994657085364227590, -0.994651922415149990, -0.994646756979442490, -0.994641589057118190, --0.994636418648189860, -0.994631245752670480, -0.994626070370572930, -0.994620892501910210, -0.994615712146695310, -0.994610529304941200, -0.994605343976660670, -0.994600156161866920, --0.994594965860572610, -0.994589773072790840, -0.994584577798534820, -0.994579380037817320, -0.994574179790651320, -0.994568977057049940, -0.994563771837026040, -0.994558564130592740, --0.994553353937763010, -0.994548141258549960, -0.994542926092966460, -0.994537708441025630, -0.994532488302740660, -0.994527265678124330, -0.994522040567189960, -0.994516812969950430, --0.994511582886418830, -0.994506350316608280, -0.994501115260531980, -0.994495877718202800, -0.994490637689633970, -0.994485395174838470, -0.994480150173829510, -0.994474902686620200, --0.994469652713223630, -0.994464400253652900, -0.994459145307921120, -0.994453887876041610, -0.994448627958027350, -0.994443365553891460, -0.994438100663647240, -0.994432833287307690, --0.994427563424886030, -0.994422291076395460, -0.994417016241849310, -0.994411738921260450, -0.994406459114642320, -0.994401176822008130, -0.994395892043370870, -0.994390604778743970, --0.994385315028140540, -0.994380022791573670, -0.994374728069056910, -0.994369430860603250, -0.994364131166226020, -0.994358828985938530, -0.994353524319753990, -0.994348217167685510, --0.994342907529746520, -0.994337595405950350, -0.994332280796310090, -0.994326963700839170, -0.994321644119550930, -0.994316322052458460, -0.994310997499575300, -0.994305670460914560, --0.994300340936489560, -0.994295008926313840, -0.994289674430400510, -0.994284337448763100, -0.994278997981414840, -0.994273656028369040, -0.994268311589639020, -0.994262964665238340, --0.994257615255180190, -0.994252263359478030, -0.994246908978145160, -0.994241552111195140, -0.994236192758641170, -0.994230830920496690, -0.994225466596775130, -0.994220099787490040, --0.994214730492654410, -0.994209358712282220, -0.994203984446386580, -0.994198607694980920, -0.994193228458078780, -0.994187846735693490, -0.994182462527838600, -0.994177075834527630, --0.994171686655773930, -0.994166294991591150, -0.994160900841992490, -0.994155504206991610, -0.994150105086601950, -0.994144703480837060, -0.994139299389710460, -0.994133892813235390, --0.994128483751425820, -0.994123072204294970, -0.994117658171856380, -0.994112241654123710, -0.994106822651110500, -0.994101401162830080, -0.994095977189296210, -0.994090550730522440, --0.994085121786522310, -0.994079690357309360, -0.994074256442897150, -0.994068820043299330, -0.994063381158529440, -0.994057939788601130, -0.994052495933527850, -0.994047049593323460, --0.994041600768001410, -0.994036149457575350, -0.994030695662058930, -0.994025239381465810, -0.994019780615809530, -0.994014319365103760, -0.994008855629362250, -0.994003389408598670, --0.993997920702826550, -0.993992449512059670, -0.993986975836311680, -0.993981499675596130, -0.993976021029926990, -0.993970539899317610, -0.993965056283781960, -0.993959570183333700, --0.993954081597986480, -0.993948590527754080, -0.993943096972650260, -0.993937600932688570, -0.993932102407882990, -0.993926601398247070, -0.993921097903794680, -0.993915591924539600, --0.993910083460495470, -0.993904572511676190, -0.993899059078095500, -0.993893543159767080, -0.993888024756704900, -0.993882503868922520, -0.993876980496433910, -0.993871454639252970, --0.993865926297393340, -0.993860395470868910, -0.993854862159693320, -0.993849326363880680, -0.993843788083444760, -0.993838247318399430, -0.993832704068758450, -0.993827158334535610, --0.993821610115744990, -0.993816059412400370, -0.993810506224515500, -0.993804950552104380, -0.993799392395180780, -0.993793831753758910, -0.993788268627852300, -0.993782703017475180, --0.993777134922641190, -0.993771564343364440, -0.993765991279658590, -0.993760415731537950, -0.993754837699016180, -0.993749257182107380, -0.993743674180825430, -0.993738088695184320, --0.993732500725197920, -0.993726910270880340, -0.993721317332245450, -0.993715721909307130, -0.993710124002079700, -0.993704523610576820, -0.993698920734812810, -0.993693315374801320, --0.993687707530556690, -0.993682097202092550, -0.993676484389423350, -0.993670869092562970, -0.993665251311525390, -0.993659631046324710, -0.993654008296974920, -0.993648383063490130, --0.993642755345884310, -0.993637125144171680, -0.993631492458366130, -0.993625857288481850, -0.993620219634533060, -0.993614579496533650, -0.993608936874497810, -0.993603291768439640, --0.993597644178373150, -0.993591994104312650, -0.993586341546272120, -0.993580686504265790, -0.993575028978307630, -0.993569368968411970, -0.993563706474592910, -0.993558041496864660, --0.993552374035241210, -0.993546704089736780, -0.993541031660365560, -0.993535356747141880, -0.993529679350079740, -0.993523999469193450, -0.993518317104497120, -0.993512632256004950, --0.993506944923731260, -0.993501255107690270, -0.993495562807896080, -0.993489868024363010, -0.993484170757105270, -0.993478471006137180, -0.993472768771472730, -0.993467064053126460, --0.993461356851112590, -0.993455647165445210, -0.993449934996138760, -0.993444220343207450, -0.993438503206665600, -0.993432783586527530, -0.993427061482807350, -0.993421336895519700, --0.993415609824678690, -0.993409880270298640, -0.993404148232393870, -0.993398413710978700, -0.993392676706067570, -0.993386937217674680, -0.993381195245814470, -0.993375450790501270, --0.993369703851749390, -0.993363954429573370, -0.993358202523987430, -0.993352448135005890, -0.993346691262643300, -0.993340931906914080, -0.993335170067832340, -0.993329405745412730, --0.993323638939669680, -0.993317869650617520, -0.993312097878270570, -0.993306323622643480, -0.993300546883750690, -0.993294767661606400, -0.993288985956225170, -0.993283201767621420, --0.993277415095809800, -0.993271625940804540, -0.993265834302620390, -0.993260040181271450, -0.993254243576772500, -0.993248444489137850, -0.993242642918382270, -0.993236838864519970, --0.993231032327565600, -0.993225223307533710, -0.993219411804438620, -0.993213597818295100, -0.993207781349117580, -0.993201962396920600, -0.993196140961718600, -0.993190317043526450, --0.993184490642358360, -0.993178661758229110, -0.993172830391153230, -0.993166996541145260, -0.993161160208219650, -0.993155321392391270, -0.993149480093674650, -0.993143636312084240, --0.993137790047634810, -0.993131941300340880, -0.993126090070217020, -0.993120236357278090, -0.993114380161538410, -0.993108521483012870, -0.993102660321715900, -0.993096796677662370, --0.993090930550866950, -0.993085061941344050, -0.993079190849108560, -0.993073317274175030, -0.993067441216558320, -0.993061562676272880, -0.993055681653333690, -0.993049798147755180, --0.993043912159552230, -0.993038023688739500, -0.993032132735331640, -0.993026239299343530, -0.993020343380789820, -0.993014444979685160, -0.993008544096044440, -0.993002640729882420, --0.992996734881213760, -0.992990826550053220, -0.992984915736415670, -0.992979002440315780, -0.992973086661768420, -0.992967168400788360, -0.992961247657390360, -0.992955324431589180, --0.992949398723399820, -0.992943470532836820, -0.992937539859915290, -0.992931606704649860, -0.992925671067055320, -0.992919732947146640, -0.992913792344938710, -0.992907849260446280, --0.992901903693684140, -0.992895955644667370, -0.992890005113410520, -0.992884052099928800, -0.992878096604236870, -0.992872138626349820, -0.992866178166282420, -0.992860215224049440, --0.992854249799666080, -0.992848281893147000, -0.992842311504507300, -0.992836338633761640, -0.992830363280925220, -0.992824385446012920, -0.992818405129039740, -0.992812422330020430, --0.992806437048970090, -0.992800449285903610, -0.992794459040836070, -0.992788466313782370, -0.992782471104757480, -0.992776473413776510, -0.992770473240854320, -0.992764470586005920, --0.992758465449246400, -0.992752457830590630, -0.992746447730053720, -0.992740435147650650, -0.992734420083396520, -0.992728402537306430, -0.992722382509395260, -0.992716359999678220, --0.992710335008170070, -0.992704307534886250, -0.992698277579841750, -0.992692245143051430, -0.992686210224530520, -0.992680172824294100, -0.992674132942357180, -0.992668090578735060, --0.992662045733442630, -0.992655998406495100, -0.992649948597907450, -0.992643896307695120, -0.992637841535872980, -0.992631784282456240, -0.992625724547460010, -0.992619662330899490, --0.992613597632789670, -0.992607530453146090, -0.992601460791983640, -0.992595388649317400, -0.992589314025162820, -0.992583236919534980, -0.992577157332449000, -0.992571075263920080, --0.992564990713963540, -0.992558903682594360, -0.992552814169828100, -0.992546722175679740, -0.992540627700164600, -0.992534530743297890, -0.992528431305094830, -0.992522329385570610, --0.992516224984740680, -0.992510118102620240, -0.992504008739224400, -0.992497896894568580, -0.992491782568668100, -0.992485665761538070, -0.992479546473193920, -0.992473424703650850, --0.992467300452924190, -0.992461173721029270, -0.992455044507981500, -0.992448912813796100, -0.992442778638488400, -0.992436641982073820, -0.992430502844567460, -0.992424361225984990, --0.992418217126341600, -0.992412070545652720, -0.992405921483933580, -0.992399769941199720, -0.992393615917466330, -0.992387459412748970, -0.992381300427062960, -0.992375138960423620, --0.992368975012846490, -0.992362808584346890, -0.992356639674940370, -0.992350468284642130, -0.992344294413467830, -0.992338118061432570, -0.992331939228552230, -0.992325757914842010, --0.992319574120317460, -0.992313387844993900, -0.992307199088886870, -0.992301007852011810, -0.992294814134384250, -0.992288617936019750, -0.992282419256933610, -0.992276218097141280, --0.992270014456658630, -0.992263808335500870, -0.992257599733683660, -0.992251388651222310, -0.992245175088132590, -0.992238959044429820, -0.992232740520129770, -0.992226519515247870, --0.992220296029799660, -0.992214070063800690, -0.992207841617266610, -0.992201610690212840, -0.992195377282655060, -0.992189141394608900, -0.992182903026089690, -0.992176662177113420, --0.992170418847695410, -0.992164173037851430, -0.992157924747596900, -0.992151673976947700, -0.992145420725919160, -0.992139164994527150, -0.992132906782787210, -0.992126646090715100, --0.992120382918326270, -0.992114117265636590, -0.992107849132661480, -0.992101578519416830, -0.992095305425918280, -0.992089029852181280, -0.992082751798221810, -0.992076471264055510, --0.992070188249697950, -0.992063902755164980, -0.992057614780472270, -0.992051324325635480, -0.992045031390670350, -0.992038735975592670, -0.992032438080418190, -0.992026137705162680, --0.992019834849841690, -0.992013529514471190, -0.992007221699066850, -0.992000911403644440, -0.991994598628219810, -0.991988283372808530, -0.991981965637426690, -0.991975645422089820, --0.991969322726813930, -0.991962997551614770, -0.991956669896507990, -0.991950339761509590, -0.991944007146635330, -0.991937672051901090, -0.991931334477322730, -0.991924994422915930, --0.991918651888696770, -0.991912306874680790, -0.991905959380884220, -0.991899609407322690, -0.991893256954011980, -0.991886902020968300, -0.991880544608207400, -0.991874184715745070, --0.991867822343597270, -0.991861457491779900, -0.991855090160308820, -0.991848720349200130, -0.991842348058469600, -0.991835973288133330, -0.991829596038206970, -0.991823216308706730, --0.991816834099648380, -0.991810449411047900, -0.991804062242921390, -0.991797672595284620, -0.991791280468153680, -0.991784885861544670, -0.991778488775473370, -0.991772089209955850, --0.991765687165008130, -0.991759282640646060, -0.991752875636885860, -0.991746466153743510, -0.991740054191235010, -0.991733639749376340, -0.991727222828183600, -0.991720803427672880, --0.991714381547860070, -0.991707957188761260, -0.991701530350392550, -0.991695101032770030, -0.991688669235909810, -0.991682234959827880, -0.991675798204540440, -0.991669358970063360, --0.991662917256412870, -0.991656473063605270, -0.991650026391656340, -0.991643577240582500, -0.991637125610399630, -0.991630671501123940, -0.991624214912771530, -0.991617755845358610, --0.991611294298901380, -0.991604830273415840, -0.991598363768918190, -0.991591894785424640, -0.991585423322951410, -0.991578949381514580, -0.991572472961130380, -0.991565994061815000, --0.991559512683584670, -0.991553028826455460, -0.991546542490443830, -0.991540053675565750, -0.991533562381837650, -0.991527068609275530, -0.991520572357895810, -0.991514073627714600, --0.991507572418748210, -0.991501068731012740, -0.991494562564524840, -0.991488053919300390, -0.991481542795355940, -0.991475029192707580, -0.991468513111371630, -0.991461994551364300, --0.991455473512702020, -0.991448949995401230, -0.991442423999477910, -0.991435895524948600, -0.991429364571829510, -0.991422831140137070, -0.991416295229887500, -0.991409756841097220, --0.991403215973782450, -0.991396672627959720, -0.991390126803645240, -0.991383578500855570, -0.991377027719606900, -0.991370474459915660, -0.991363918721798190, -0.991357360505270900, --0.991350799810350350, -0.991344236637052730, -0.991337670985394490, -0.991331102855392170, -0.991324532247061960, -0.991317959160420540, -0.991311383595484100, -0.991304805552269190, --0.991298225030792350, -0.991291642031070010, -0.991285056553118490, -0.991278468596954340, -0.991271878162593990, -0.991265285250053860, -0.991258689859350620, -0.991252091990500680, --0.991245491643520490, -0.991238888818426590, -0.991232283515235510, -0.991225675733963700, -0.991219065474627570, -0.991212452737243900, -0.991205837521829110, -0.991199219828399540, --0.991192599656972150, -0.991185977007563170, -0.991179351880189240, -0.991172724274867020, -0.991166094191612720, -0.991159461630443440, -0.991152826591375490, -0.991146189074425420, --0.991139549079609880, -0.991132906606945530, -0.991126261656448790, -0.991119614228136550, -0.991112964322025220, -0.991106311938131480, -0.991099657076471740, -0.991092999737063110, --0.991086339919921900, -0.991079677625064880, -0.991073012852508710, -0.991066345602269920, -0.991059675874365160, -0.991053003668811440, -0.991046328985625060, -0.991039651824823010, --0.991032972186421720, -0.991026290070437970, -0.991019605476888610, -0.991012918405790200, -0.991006228857159390, -0.990999536831013050, -0.990992842327367840, -0.990986145346240630, --0.990979445887647970, -0.990972743951606840, -0.990966039538133670, -0.990959332647245450, -0.990952623278958940, -0.990945911433290800, -0.990939197110258020, -0.990932480309877130, --0.990925761032165120, -0.990919039277138650, -0.990912315044814700, -0.990905588335209810, -0.990898859148340860, -0.990892127484224950, -0.990885393342878730, -0.990878656724318960, --0.990871917628562530, -0.990865176055626410, -0.990858432005527150, -0.990851685478281950, -0.990844936473907590, -0.990838184992420820, -0.990831431033838640, -0.990824674598177800, --0.990817915685455300, -0.990811154295688000, -0.990804390428892900, -0.990797624085086760, -0.990790855264286450, -0.990784083966509190, -0.990777310191771620, -0.990770533940090850, --0.990763755211483630, -0.990756974005966960, -0.990750190323558040, -0.990743404164273640, -0.990736615528130640, -0.990729824415146120, -0.990723030825337080, -0.990716234758720500, --0.990709436215313270, -0.990702635195132460, -0.990695831698195080, -0.990689025724518000, -0.990682217274118430, -0.990675406347013450, -0.990668592943219850, -0.990661777062754710, --0.990654958705635250, -0.990648137871878220, -0.990641314561500950, -0.990634488774520430, -0.990627660510953630, -0.990620829770817780, -0.990613996554129740, -0.990607160860906830, --0.990600322691165940, -0.990593482044924260, -0.990586638922198670, -0.990579793323006720, -0.990572945247365280, -0.990566094695291440, -0.990559241666802310, -0.990552386161915210, --0.990545528180646890, -0.990538667723015020, -0.990531804789036350, -0.990524939378728210, -0.990518071492107690, -0.990511201129192110, -0.990504328289998460, -0.990497452974543950, --0.990490575182845780, -0.990483694914921160, -0.990476812170787310, -0.990469926950461540, -0.990463039253960840, -0.990456149081302640, -0.990449256432504030, -0.990442361307582120, --0.990435463706554550, -0.990428563629438210, -0.990421661076250510, -0.990414756047008570, -0.990407848541729810, -0.990400938560431430, -0.990394026103130760, -0.990387111169845010, --0.990380193760591390, -0.990373273875387210, -0.990366351514250010, -0.990359426677196900, -0.990352499364245190, -0.990345569575412310, -0.990338637310715250, -0.990331702570171890, --0.990324765353799100, -0.990317825661614530, -0.990310883493635390, -0.990303938849879000, -0.990296991730362790, -0.990290042135104080, -0.990283090064120190, -0.990276135517428660, --0.990269178495046700, -0.990262218996991850, -0.990255257023281430, -0.990248292573932990, -0.990241325648963720, -0.990234356248391180, -0.990227384372232570, -0.990220410020505650, --0.990213433193227740, -0.990206453890416280, -0.990199472112088590, -0.990192487858262300, -0.990185501128954650, -0.990178511924183380, -0.990171520243965820, -0.990164526088319290, --0.990157529457261650, -0.990150530350810130, -0.990143528768982260, -0.990136524711795580, -0.990129518179267640, -0.990122509171415750, -0.990115497688257680, -0.990108483729810860, --0.990101467296092940, -0.990094448387121240, -0.990087427002913410, -0.990080403143487110, -0.990073376808859760, -0.990066347999048910, -0.990059316714072100, -0.990052282953947200, --0.990045246718691540, -0.990038208008322760, -0.990031166822858410, -0.990024123162316250, -0.990017077026713600, -0.990010028416068330, -0.990002977330398100, -0.989995923769720340, --0.989988867734052810, -0.989981809223413060, -0.989974748237818840, -0.989967684777287690, -0.989960618841837390, -0.989953550431485580, -0.989946479546249700, -0.989939406186147730, --0.989932330351197320, -0.989925252041416020, -0.989918171256821690, -0.989911087997431660, -0.989904002263264140, -0.989896914054336550, -0.989889823370666780, -0.989882730212272350, --0.989875634579171160, -0.989868536471380840, -0.989861435888919170, -0.989854332831803910, -0.989847227300052810, -0.989840119293683540, -0.989833008812714190, -0.989825895857162190, --0.989818780427045520, -0.989811662522381840, -0.989804542143188910, -0.989797419289484730, -0.989790293961287040, -0.989783166158613610, -0.989776035881482220, -0.989768903129910840, --0.989761767903917120, -0.989754630203518950, -0.989747490028734300, -0.989740347379580830, -0.989733202256076420, -0.989726054658239150, -0.989718904586086690, -0.989711752039637020, --0.989704597018908010, -0.989697439523917420, -0.989690279554683140, -0.989683117111223250, -0.989675952193555640, -0.989668784801698060, -0.989661614935668620, -0.989654442595485070, --0.989647267781165410, -0.989640090492727610, -0.989632910730189550, -0.989625728493569110, -0.989618543782884500, -0.989611356598153470, -0.989604166939394130, -0.989596974806624340, --0.989589780199862100, -0.989582583119125280, -0.989575383564432200, -0.989568181535800620, -0.989560977033248520, -0.989553770056794010, -0.989546560606455070, -0.989539348682249800, --0.989532134284196060, -0.989524917412312080, -0.989517698066615830, -0.989510476247125070, -0.989503251953858350, -0.989496025186833440, -0.989488795946068530, -0.989481564231581620, --0.989474330043390580, -0.989467093381513950, -0.989459854245969490, -0.989452612636775530, -0.989445368553949930, -0.989438121997510910, -0.989430872967476670, -0.989423621463865200, --0.989416367486694700, -0.989409111035983170, -0.989401852111748800, -0.989394590714010040, -0.989387326842784630, -0.989380060498091020, -0.989372791679947180, -0.989365520388371330, --0.989358246623381790, -0.989350970384996530, -0.989343691673233990, -0.989336410488112160, -0.989329126829649240, -0.989321840697863550, -0.989314552092773300, -0.989307261014396590, --0.989299967462751730, -0.989292671437856930, -0.989285372939730510, -0.989278071968390680, -0.989270768523855650, -0.989263462606143620, -0.989256154215273020, -0.989248843351261950, --0.989241530014128840, -0.989234214203891900, -0.989226895920569450, -0.989219575164179800, -0.989212251934741160, -0.989204926232271850, -0.989197598056790310, -0.989190267408314730, --0.989182934286863320, -0.989175598692454750, -0.989168260625107210, -0.989160920084839020, -0.989153577071668510, -0.989146231585613990, -0.989138883626693890, -0.989131533194926640, --0.989124180290330450, -0.989116824912923960, -0.989109467062725400, -0.989102106739753070, -0.989094743944025520, -0.989087378675561180, -0.989080010934378360, -0.989072640720495390, --0.989065268033930910, -0.989057892874703250, -0.989050515242830940, -0.989043135138332200, -0.989035752561225780, -0.989028367511529780, -0.989020979989262970, -0.989013589994443780, --0.989006197527090510, -0.988998802587221840, -0.988991405174856060, -0.988984005290011850, -0.988976602932707620, -0.988969198102961910, -0.988961790800793160, -0.988954381026219800, --0.988946968779260690, -0.988939554059934060, -0.988932136868258540, -0.988924717204252790, -0.988917295067935020, -0.988909870459324210, -0.988902443378438690, -0.988895013825297100, --0.988887581799917870, -0.988880147302319770, -0.988872710332521330, -0.988865270890540990, -0.988857828976397620, -0.988850384590109540, -0.988842937731695510, -0.988835488401174190, --0.988828036598564110, -0.988820582323884030, -0.988813125577152400, -0.988805666358388070, -0.988798204667609370, -0.988790740504835290, -0.988783273870084360, -0.988775804763375230, --0.988768333184726680, -0.988760859134157230, -0.988753382611685660, -0.988745903617330610, -0.988738422151110740, -0.988730938213044810, -0.988723451803151580, -0.988715962921449700, --0.988708471567957940, -0.988700977742695050, -0.988693481445679700, -0.988685982676930420, -0.988678481436466420, -0.988670977724306230, -0.988663471540468520, -0.988655962884972150, --0.988648451757835890, -0.988640938159078500, -0.988633422088718850, -0.988625903546775490, -0.988618382533267390, -0.988610859048213330, -0.988603333091632170, -0.988595804663542690, --0.988588273763963740, -0.988580740392914100, -0.988573204550412420, -0.988565666236477900, -0.988558125451129200, -0.988550582194385190, -0.988543036466264620, -0.988535488266786610, --0.988527937595969800, -0.988520384453833170, -0.988512828840395600, -0.988505270755675960, -0.988497710199693010, -0.988490147172465860, -0.988482581674013370, -0.988475013704354530, --0.988467443263507990, -0.988459870351492850, -0.988452294968328090, -0.988444717114032590, -0.988437136788625330, -0.988429553992125180, -0.988421968724551240, -0.988414380985922270, --0.988406790776257370, -0.988399198095575530, -0.988391602943895720, -0.988384005321236710, -0.988376405227617830, -0.988368802663058040, -0.988361197627576130, -0.988353590121191280, --0.988345980143922390, -0.988338367695788420, -0.988330752776808710, -0.988323135387002120, -0.988315515526387630, -0.988307893194984470, -0.988300268392811490, -0.988292641119887900, --0.988285011376232590, -0.988277379161864870, -0.988269744476803490, -0.988262107321068010, -0.988254467694677170, -0.988246825597650090, -0.988239181030006080, -0.988231533991764000, --0.988223884482943070, -0.988216232503562500, -0.988208578053641370, -0.988200921133198680, -0.988193261742253860, -0.988185599880825770, -0.988177935548933740, -0.988170268746596860, --0.988162599473834340, -0.988154927730665160, -0.988147253517108750, -0.988139576833184210, -0.988131897678910740, -0.988124216054307560, -0.988116531959393860, -0.988108845394188640, --0.988101156358711540, -0.988093464852981440, -0.988085770877017660, -0.988078074430839500, -0.988070375514466190, -0.988062674127916930, -0.988054970271211030, -0.988047263944367590, --0.988039555147406050, -0.988031843880345480, -0.988024130143205450, -0.988016413936005030, -0.988008695258763670, -0.988000974111500560, -0.987993250494234810, -0.987985524406986170, --0.987977795849773630, -0.987970064822616620, -0.987962331325534460, -0.987954595358546460, -0.987946856921671950, -0.987939116014930340, -0.987931372638340970, -0.987923626791923140, --0.987915878475696060, -0.987908127689679500, -0.987900374433892560, -0.987892618708354650, -0.987884860513085330, -0.987877099848103790, -0.987869336713429360, -0.987861571109081680, --0.987853803035080080, -0.987846032491443980, -0.987838259478192810, -0.987830483995346010, -0.987822706042922990, -0.987814925620943310, -0.987807142729426160, -0.987799357368391080, --0.987791569537857740, -0.987783779237845440, -0.987775986468373720, -0.987768191229462130, -0.987760393521129880, -0.987752593343396600, -0.987744790696282070, -0.987736985579805380, --0.987729177993986410, -0.987721367938844350, -0.987713555414398980, -0.987705740420669610, -0.987697922957676000, -0.987690103025437470, -0.987682280623973670, -0.987674455753304150, --0.987666628413448660, -0.987658798604426510, -0.987650966326257370, -0.987643131578960780, -0.987635294362556260, -0.987627454677063700, -0.987619612522502410, -0.987611767898892160, --0.987603920806252480, -0.987596071244602910, -0.987588219213963230, -0.987580364714353070, -0.987572507745791860, -0.987564648308299490, -0.987556786401895370, -0.987548922026599390, --0.987541055182431070, -0.987533185869410080, -0.987525314087556170, -0.987517439836888890, -0.987509563117428100, -0.987501683929193350, -0.987493802272204510, -0.987485918146481120, --0.987478031552042950, -0.987470142488909630, -0.987462250957100940, -0.987454356956636750, -0.987446460487536590, -0.987438561549820130, -0.987430660143507440, -0.987422756268618080, --0.987414849925171810, -0.987406941113188500, -0.987399029832687790, -0.987391116083689350, -0.987383199866213260, -0.987375281180279170, -0.987367360025906860, -0.987359436403116190, --0.987351510311926920, -0.987343581752358810, -0.987335650724431860, -0.987327717228165700, -0.987319781263580110, -0.987311842830695290, -0.987303901929530770, -0.987295958560106550, --0.987288012722442380, -0.987280064416558250, -0.987272113642473690, -0.987264160400209150, -0.987256204689784140, -0.987248246511218560, -0.987240285864532500, -0.987232322749745590, --0.987224357166877950, -0.987216389115949440, -0.987208418596979830, -0.987200445609989210, -0.987192470154997450, -0.987184492232024650, -0.987176511841090560, -0.987168528982215190, --0.987160543655418500, -0.987152555860720260, -0.987144565598140900, -0.987136572867700070, -0.987128577669417750, -0.987120580003314040, -0.987112579869408810, -0.987104577267722160, --0.987096572198274180, -0.987088564661084630, -0.987080554656173730, -0.987072542183561330, -0.987064527243267650, -0.987056509835312680, -0.987048489959716500, -0.987040467616499000, --0.987032442805680250, -0.987024415527280490, -0.987016385781319670, -0.987008353567817910, -0.987000318886795290, -0.986992281738271910, -0.986984242122267760, -0.986976200038803040, --0.986968155487897850, -0.986960108469572160, -0.986952058983846190, -0.986944007030740140, -0.986935952610274110, -0.986927895722468200, -0.986919836367342480, -0.986911774544917190, --0.986903710255212400, -0.986895643498248430, -0.986887574274045280, -0.986879502582623250, -0.986871428424002550, -0.986863351798203170, -0.986855272705245420, -0.986847191145149520, --0.986839107117935650, -0.986831020623623820, -0.986822931662234670, -0.986814840233788180, -0.986806746338304560, -0.986798649975804020, -0.986790551146306870, -0.986782449849833320, --0.986774346086403690, -0.986766239856038170, -0.986758131158757100, -0.986750019994580670, -0.986741906363529210, -0.986733790265623020, -0.986725671700882320, -0.986717550669327430, --0.986709427170978540, -0.986701301205856200, -0.986693172773980610, -0.986685041875372090, -0.986676908510050970, -0.986668772678037650, -0.986660634379352140, -0.986652493614015300, --0.986644350382047120, -0.986636204683468130, -0.986628056518298550, -0.986619905886558900, -0.986611752788269510, -0.986603597223450700, -0.986595439192122890, -0.986587278694306510, --0.986579115730021770, -0.986570950299289430, -0.986562782402129690, -0.986554612038562870, -0.986546439208609740, -0.986538263912290160, -0.986530086149625230, -0.986521905920635040, --0.986513723225340030, -0.986505538063760730, -0.986497350435917570, -0.986489160341831100, -0.986480967781521720, -0.986472772755009890, -0.986464575262316120, -0.986456375303460750, --0.986448172878464650, -0.986439967987348120, -0.986431760630131600, -0.986423550806835750, -0.986415338517480980, -0.986407123762087720, -0.986398906540676860, -0.986390686853268580, --0.986382464699883780, -0.986374240080542640, -0.986366012995266050, -0.986357783444074320, -0.986349551426988210, -0.986341316944028160, -0.986333079995214690, -0.986324840580568680, --0.986316598700110570, -0.986308354353860990, -0.986300107541840500, -0.986291858264069620, -0.986283606520569120, -0.986275352311359650, -0.986267095636461870, -0.986258836495896300, --0.986250574889683710, -0.986242310817844640, -0.986234044280399740, -0.986225775277369760, -0.986217503808775380, -0.986209229874637110, -0.986200953474975830, -0.986192674609812300, --0.986184393279166960, -0.986176109483060670, -0.986167823221514080, -0.986159534494547850, -0.986151243302182960, -0.986142949644439830, -0.986134653521339440, -0.986126354932902350, --0.986118053879149410, -0.986109750360101290, -0.986101444375778850, -0.986093135926202740, -0.986084825011393830, -0.986076511631372780, -0.986068195786160450, -0.986059877475777720, --0.986051556700245360, -0.986043233459584000, -0.986034907753814420, -0.986026579582957810, -0.986018248947034600, -0.986009915846065900, -0.986001580280072340, -0.985993242249074920, --0.985984901753094280, -0.985976558792151400, -0.985968213366267170, -0.985959865475462440, -0.985951515119757870, -0.985943162299174560, -0.985934807013733480, -0.985926449263455300, --0.985918089048361090, -0.985909726368471520, -0.985901361223807670, -0.985892993614390420, -0.985884623540240760, -0.985876251001379430, -0.985867875997827550, -0.985859498529605970, --0.985851118596735690, -0.985842736199237570, -0.985834351337132600, -0.985825964010441650, -0.985817574219185920, -0.985809181963386290, -0.985800787243063640, -0.985792390058239040, --0.985783990408933500, -0.985775588295167760, -0.985767183716963260, -0.985758776674340750, -0.985750367167321340, -0.985741955195926000, -0.985733540760175830, -0.985725123860091700, --0.985716704495694820, -0.985708282667006270, -0.985699858374046720, -0.985691431616837700, -0.985683002395400190, -0.985674570709755060, -0.985666136559923630, -0.985657699945926780, --0.985649260867785480, -0.985640819325521280, -0.985632375319154930, -0.985623928848707750, -0.985615479914200730, -0.985607028515654960, -0.985598574653091640, -0.985590118326531870, --0.985581659535996750, -0.985573198281507580, -0.985564734563085240, -0.985556268380751170, -0.985547799734526550, -0.985539328624432280, -0.985530855050489760, -0.985522379012720000, --0.985513900511144400, -0.985505419545783970, -0.985496936116660120, -0.985488450223793830, -0.985479961867206540, -0.985471471046919230, -0.985462977762953220, -0.985454482015329810, --0.985445983804070220, -0.985437483129195550, -0.985428979990727320, -0.985420474388686520, -0.985411966323094690, -0.985403455793972820, -0.985394942801342430, -0.985386427345224410, --0.985377909425640520, -0.985369389042611950, -0.985360866196159810, -0.985352340886305520, -0.985343813113070290, -0.985335282876475650, -0.985326750176542810, -0.985318215013293090, --0.985309677386747570, -0.985301137296928140, -0.985292594743855780, -0.985284049727552010, -0.985275502248038060, -0.985266952305335340, -0.985258399899465060, -0.985249845030448990, --0.985241287698308320, -0.985232727903064490, -0.985224165644738690, -0.985215600923352590, -0.985207033738927480, -0.985198464091484700, -0.985189891981045780, -0.985181317407632040, --0.985172740371265120, -0.985164160871966450, -0.985155578909757250, -0.985146994484659140, -0.985138407596693580, -0.985129818245881750, -0.985121226432245640, -0.985112632155806470, --0.985104035416585640, -0.985095436214604710, -0.985086834549885220, -0.985078230422448690, -0.985069623832316550, -0.985061014779510360, -0.985052403264051630, -0.985043789285961700, --0.985035172845262540, -0.985026553941975360, -0.985017932576121910, -0.985009308747723520, -0.985000682456801720, -0.984992053703378390, -0.984983422487474950, -0.984974788809112930, --0.984966152668313890, -0.984957514065099460, -0.984948872999491300, -0.984940229471510940, -0.984931583481180040, -0.984922935028520240, -0.984914284113552860, -0.984905630736299890, --0.984896974896782850, -0.984888316595023520, -0.984879655831043200, -0.984870992604863660, -0.984862326916506880, -0.984853658765994180, -0.984844988153347420, -0.984836315078588150, --0.984827639541738020, -0.984818961542818890, -0.984810281081852310, -0.984801598158860040, -0.984792912773863720, -0.984784224926885110, -0.984775534617945980, -0.984766841847067980, --0.984758146614272970, -0.984749448919582490, -0.984740748763018540, -0.984732046144602410, -0.984723341064356440, -0.984714633522302040, -0.984705923518461090, -0.984697211052855350, --0.984688496125506460, -0.984679778736436530, -0.984671058885666970, -0.984662336573219890, -0.984653611799116700, -0.984644884563379730, -0.984636154866030510, -0.984627422707090920, --0.984618688086582820, -0.984609951004527860, -0.984601211460948030, -0.984592469455865200, -0.984583724989301250, -0.984574978061278030, -0.984566228671817310, -0.984557476820941080, --0.984548722508671090, -0.984539965735029330, -0.984531206500037560, -0.984522444803717760, -0.984513680646091900, -0.984504914027181880, -0.984496144947009650, -0.984487373405597000, --0.984478599402965890, -0.984469822939138100, -0.984461044014135920, -0.984452262627981130, -0.984443478780695820, -0.984434692472301640, -0.984425903702820790, -0.984417112472275260, --0.984408318780686800, -0.984399522628077620, -0.984390724014469700, -0.984381922939884690, -0.984373119404345130, -0.984364313407872670, -0.984355504950489510, -0.984346694032217530, --0.984337880653078700, -0.984329064813095340, -0.984320246512289330, -0.984311425750682640, -0.984302602528297490, -0.984293776845155730, -0.984284948701279580, -0.984276118096691020, --0.984267285031412140, -0.984258449505465150, -0.984249611518871800, -0.984240771071654640, -0.984231928163835420, -0.984223082795436580, -0.984214234966479860, -0.984205384676987590, --0.984196531926981750, -0.984187676716484770, -0.984178819045518520, -0.984169958914105300, -0.984161096322267110, -0.984152231270026160, -0.984143363757404740, -0.984134493784424860, --0.984125621351108700, -0.984116746457478380, -0.984107869103556300, -0.984098989289364570, -0.984090107014925390, -0.984081222280260960, -0.984072335085393490, -0.984063445430344960, --0.984054553315137910, -0.984045658739794660, -0.984036761704337180, -0.984027862208787680, -0.984018960253168710, -0.984010055837502230, -0.984001148961810680, -0.983992239626116150, --0.983983327830440960, -0.983974413574807640, -0.983965496859238180, -0.983956577683755000, -0.983947656048380410, -0.983938731953136750, -0.983929805398045980, -0.983920876383130860, --0.983911944908413600, -0.983903010973916530, -0.983894074579661830, -0.983885135725672040, -0.983876194411969270, -0.983867250638576160, -0.983858304405514810, -0.983849355712807850, --0.983840404560477170, -0.983831450948545740, -0.983822494877035660, -0.983813536345969350, -0.983804575355369140, -0.983795611905257440, -0.983786645995656790, -0.983777677626589520, --0.983768706798078150, -0.983759733510144900, -0.983750757762812400, -0.983741779556102980, -0.983732798890039060, -0.983723815764643180, -0.983714830179937770, -0.983705842135945140, --0.983696851632688050, -0.983687858670188820, -0.983678863248469980, -0.983669865367553960, -0.983660865027463300, -0.983651862228220320, -0.983642856969847770, -0.983633849252368190, --0.983624839075803890, -0.983615826440177530, -0.983606811345511530, -0.983597793791828660, -0.983588773779151220, -0.983579751307501750, -0.983570726376902900, -0.983561698987377330, --0.983552669138947460, -0.983543636831636040, -0.983534602065465390, -0.983525564840458390, -0.983516525156637230, -0.983507483014024910, -0.983498438412643840, -0.983489391352516780, --0.983480341833666170, -0.983471289856114760, -0.983462235419885090, -0.983453178524999800, -0.983444119171481560, -0.983435057359352880, -0.983425993088636760, -0.983416926359355630, --0.983407857171532230, -0.983398785525189110, -0.983389711420349140, -0.983380634857034640, -0.983371555835268700, -0.983362474355073960, -0.983353390416472960, -0.983344304019488470, --0.983335215164143240, -0.983326123850460030, -0.983317030078461380, -0.983307933848170280, -0.983298835159609360, -0.983289734012801060, -0.983280630407768700, -0.983271524344534690, --0.983262415823121900, -0.983253304843553110, -0.983244191405850840, -0.983235075510038300, -0.983225957156138030, -0.983216836344172900, -0.983207713074165660, -0.983198587346139190, --0.983189459160116240, -0.983180328516119580, -0.983171195414172080, -0.983162059854296720, -0.983152921836515930, -0.983143781360853010, -0.983134638427330730, -0.983125493035971740, --0.983116345186799130, -0.983107194879835560, -0.983098042115103880, -0.983088886892627300, -0.983079729212428370, -0.983070569074530280, -0.983061406478955680, -0.983052241425727560, --0.983043073914868890, -0.983033903946402440, -0.983024731520351300, -0.983015556636738230, -0.983006379295586320, -0.982997199496918440, -0.982988017240757680, -0.982978832527126810, --0.982969645356048920, -0.982960455727546640, -0.982951263641643540, -0.982942069098362130, -0.982932872097725620, -0.982923672639756880, -0.982914470724479020, -0.982905266351915000, --0.982896059522087810, -0.982886850235020430, -0.982877638490735730, -0.982868424289257140, -0.982859207630607520, -0.982849988514809760, -0.982840766941887160, -0.982831542911862590, --0.982822316424759030, -0.982813087480599810, -0.982803856079407900, -0.982794622221206390, -0.982785385906018270, -0.982776147133866630, -0.982766905904774670, -0.982757662218765480, --0.982748416075862160, -0.982739167476087690, -0.982729916419465170, -0.982720662906018120, -0.982711406935769300, -0.982702148508742050, -0.982692887624959320, -0.982683624284444330, --0.982674358487220400, -0.982665090233310500, -0.982655819522737950, -0.982646546355525840, -0.982637270731697380, -0.982627992651275760, -0.982618712114284090, -0.982609429120745670, --0.982600143670683710, -0.982590855764121200, -0.982581565401081770, -0.982572272581588300, -0.982562977305664220, -0.982553679573332730, -0.982544379384617030, -0.982535076739540210, --0.982525771638125820, -0.982516464080397060, -0.982507154066377120, -0.982497841596089330, -0.982488526669556880, -0.982479209286803100, -0.982469889447851300, -0.982460567152724780, --0.982451242401446770, -0.982441915194040780, -0.982432585530529920, -0.982423253410937610, -0.982413918835287280, -0.982404581803602020, -0.982395242315905250, -0.982385900372220510, --0.982376555972571010, -0.982367209116980060, -0.982357859805471190, -0.982348508038067610, -0.982339153814792750, -0.982329797135670040, -0.982320438000722880, -0.982311076409974390, --0.982301712363448320, -0.982292345861168090, -0.982282976903156910, -0.982273605489438320, -0.982264231620035730, -0.982254855294972360, -0.982245476514272080, -0.982236095277958080, --0.982226711586053790, -0.982217325438582870, -0.982207936835568510, -0.982198545777034360, -0.982189152263003740, -0.982179756293500410, -0.982170357868547560, -0.982160956988168630, --0.982151553652387600, -0.982142147861227550, -0.982132739614712260, -0.982123328912865020, -0.982113915755709390, -0.982104500143269000, -0.982095082075567500, -0.982085661552628220, --0.982076238574474790, -0.982066813141130760, -0.982057385252619760, -0.982047954908965240, -0.982038522110190830, -0.982029086856320180, -0.982019649147376610, -0.982010208983383980, --0.982000766364365950, -0.981991321290345940, -0.981981873761347710, -0.981972423777394800, -0.981962971338510520, -0.981953516444719070, -0.981944059096043880, -0.981934599292508480, --0.981925137034136640, -0.981915672320951890, -0.981906205152978000, -0.981896735530238600, -0.981887263452757340, -0.981877788920557770, -0.981868311933663860, -0.981858832492099150, --0.981849350595887400, -0.981839866245052260, -0.981830379439617480, -0.981820890179606610, -0.981811398465043620, -0.981801904295952150, -0.981792407672355980, -0.981782908594278750, --0.981773407061744210, -0.981763903074776230, -0.981754396633398470, -0.981744887737634690, -0.981735376387508520, -0.981725862583044060, -0.981716346324264970, -0.981706827611194990, --0.981697306443858000, -0.981687782822277750, -0.981678256746477800, -0.981668728216482430, -0.981659197232315210, -0.981649663793999980, -0.981640127901560630, -0.981630589555021030, --0.981621048754404810, -0.981611505499736080, -0.981601959791038480, -0.981592411628336100, -0.981582861011652490, -0.981573307941011830, -0.981563752416438010, -0.981554194437954660, --0.981544634005586000, -0.981535071119355450, -0.981525505779287430, -0.981515937985405710, -0.981506367737734030, -0.981496795036296500, -0.981487219881116980, -0.981477642272219450, --0.981468062209627790, -0.981458479693365860, -0.981448894723457870, -0.981439307299927450, -0.981429717422798940, -0.981420125092096090, -0.981410530307842980, -0.981400933070063490, --0.981391333378781710, -0.981381731234021390, -0.981372126635806860, -0.981362519584162100, -0.981352910079111070, -0.981343298120677670, -0.981333683708886070, -0.981324066843760280, --0.981314447525324370, -0.981304825753602230, -0.981295201528617930, -0.981285574850395800, -0.981275945718959710, -0.981266314134333740, -0.981256680096541990, -0.981247043605608550, --0.981237404661557290, -0.981227763264412740, -0.981218119414198790, -0.981208473110939510, -0.981198824354659100, -0.981189173145381570, -0.981179519483131200, -0.981169863367931880, --0.981160204799808030, -0.981150543778783410, -0.981140880304882670, -0.981131214378129670, -0.981121545998548730, -0.981111875166163830, -0.981102201880999280, -0.981092526143079070, --0.981082847952427730, -0.981073167309069240, -0.981063484213027800, -0.981053798664327630, -0.981044110662993020, -0.981034420209048190, -0.981024727302517220, -0.981015031943424430, --0.981005334131794140, -0.980995633867650320, -0.980985931151017510, -0.980976225981919910, -0.980966518360381730, -0.980956808286427280, -0.980947095760080660, -0.980937380781366500, --0.980927663350308790, -0.980917943466932060, -0.980908221131260310, -0.980898496343318160, -0.980888769103129610, -0.980879039410719300, -0.980869307266111320, -0.980859572669329990, --0.980849835620399620, -0.980840096119344860, -0.980830354166189910, -0.980820609760958970, -0.980810862903676580, -0.980801113594367060, -0.980791361833054490, -0.980781607619763740, --0.980771850954518910, -0.980762091837344530, -0.980752330268264920, -0.980742566247304380, -0.980732799774487570, -0.980723030849838700, -0.980713259473382170, -0.980703485645142430, --0.980693709365144110, -0.980683930633411530, -0.980674149449969110, -0.980664365814841290, -0.980654579728052590, -0.980644791189627330, -0.980635000199590160, -0.980625206757965500, --0.980615410864777880, -0.980605612520051740, -0.980595811723811490, -0.980586008476081790, -0.980576202776887060, -0.980566394626251720, -0.980556584024200320, -0.980546770970757600, --0.980536955465947990, -0.980527137509796030, -0.980517317102326150, -0.980507494243562980, -0.980497668933530850, -0.980487841172254850, -0.980478010959759170, -0.980468178296068470, --0.980458343181207390, -0.980448505615200360, -0.980438665598072130, -0.980428823129847140, -0.980418978210550240, -0.980409130840205760, -0.980399281018838330, -0.980389428746472950, --0.980379574023133920, -0.980369716848845880, -0.980359857223633610, -0.980349995147521640, -0.980340130620534710, -0.980330263642697490, -0.980320394214034610, -0.980310522334570830, --0.980300648004330590, -0.980290771223338850, -0.980280891991620160, -0.980271010309199280, -0.980261126176100730, -0.980251239592349390, -0.980241350557970010, -0.980231459072987250, --0.980221565137425870, -0.980211668751310490, -0.980201769914666010, -0.980191868627516950, -0.980181964889888400, -0.980172058701804900, -0.980162150063291330, -0.980152238974372310, --0.980142325435072740, -0.980132409445417240, -0.980122491005430810, -0.980112570115138190, -0.980102646774563930, -0.980092720983733230, -0.980082792742670740, -0.980072862051401210, --0.980062928909949620, -0.980052993318340620, -0.980043055276598960, -0.980033114784749860, -0.980023171842818060, -0.980013226450828220, -0.980003278608805320, -0.979993328316774330, --0.979983375574759900, -0.979973420382787120, -0.979963462740880750, -0.979953502649065560, -0.979943540107366730, -0.979933575115809140, -0.979923607674417550, -0.979913637783216940, --0.979903665442232290, -0.979893690651488240, -0.979883713411010100, -0.979873733720822760, -0.979863751580951070, -0.979853766991420020, -0.979843779952254580, -0.979833790463479630, --0.979823798525120250, -0.979813804137201320, -0.979803807299747920, -0.979793808012784820, -0.979783806276337320, -0.979773802090430300, -0.979763795455088850, -0.979753786370337940, --0.979743774836202340, -0.979733760852707470, -0.979723744419878200, -0.979713725537739500, -0.979703704206316580, -0.979693680425634430, -0.979683654195718010, -0.979673625516592540, --0.979663594388282880, -0.979653560810814340, -0.979643524784211680, -0.979633486308500330, -0.979623445383705380, -0.979613402009851700, -0.979603356186964590, -0.979593307915068930, --0.979583257194190150, -0.979573204024353220, -0.979563148405583230, -0.979553090337905390, -0.979543029821344890, -0.979532966855926720, -0.979522901441676200, -0.979512833578618510, --0.979502763266778650, -0.979492690506181710, -0.979482615296853210, -0.979472537638818140, -0.979462457532101700, -0.979452374976729210, -0.979442289972725750, -0.979432202520116420, --0.979422112618926750, -0.979412020269181730, -0.979401925470906760, -0.979391828224126960, -0.979381728528867510, -0.979371626385153740, -0.979361521793010950, -0.979351414752464340, --0.979341305263539130, -0.979331193326260730, -0.979321078940654340, -0.979310962106745290, -0.979300842824558760, -0.979290721094120190, -0.979280596915454660, -0.979270470288587710, --0.979260341213544660, -0.979250209690350810, -0.979240075719031380, -0.979229939299611770, -0.979219800432117320, -0.979209659116573320, -0.979199515353005200, -0.979189369141438280, --0.979179220481897760, -0.979169069374409400, -0.979158915818998390, -0.979148759815690050, -0.979138601364509810, -0.979128440465482860, -0.979118277118635080, -0.979108111323991560, --0.979097943081577720, -0.979087772391419090, -0.979077599253540990, -0.979067423667968840, -0.979057245634728180, -0.979047065153844430, -0.979036882225343020, -0.979026696849249260, --0.979016509025588900, -0.979006318754387150, -0.978996126035669770, -0.978985930869461950, -0.978975733255789240, -0.978965533194677270, -0.978955330686151590, -0.978945125730237510, --0.978934918326960560, -0.978924708476346380, -0.978914496178420410, -0.978904281433208290, -0.978894064240735330, -0.978883844601027290, -0.978873622514109480, -0.978863397980007770, --0.978853170998747470, -0.978842941570354340, -0.978832709694853920, -0.978822475372271630, -0.978812238602633000, -0.978801999385963910, -0.978791757722289880, -0.978781513611636340, --0.978771267054029170, -0.978761018049493780, -0.978750766598055820, -0.978740512699740940, -0.978730256354574780, -0.978719997562582880, -0.978709736323791100, -0.978699472638224990, --0.978689206505910180, -0.978678937926872330, -0.978668666901137190, -0.978658393428730180, -0.978648117509677400, -0.978637839144004260, -0.978627558331736540, -0.978617275072899970, --0.978606989367520220, -0.978596701215622920, -0.978586410617233950, -0.978576117572378950, -0.978565822081083450, -0.978555524143373550, -0.978545223759274880, -0.978534920928813110, --0.978524615652014100, -0.978514307928903480, -0.978503997759506920, -0.978493685143850600, -0.978483370081959960, -0.978473052573861080, -0.978462732619579390, -0.978452410219140980, --0.978442085372571490, -0.978431758079896800, -0.978421428341142760, -0.978411096156335040, -0.978400761525499480, -0.978390424448662200, -0.978380084925848830, -0.978369742957085230, --0.978359398542397280, -0.978349051681810740, -0.978338702375351700, -0.978328350623045910, -0.978317996424919230, -0.978307639780997550, -0.978297280691306730, -0.978286919155872740, --0.978276555174721450, -0.978266188747878850, -0.978255819875370690, -0.978245448557222840, -0.978235074793461610, -0.978224698584112540, -0.978214319929201830, -0.978203938828755340, --0.978193555282798940, -0.978183169291358510, -0.978172780854460240, -0.978162389972130120, -0.978151996644394010, -0.978141600871277990, -0.978131202652807840, -0.978120801989009750, --0.978110398879909580, -0.978099993325533430, -0.978089585325907170, -0.978079174881057110, -0.978068761991009120, -0.978058346655789280, -0.978047928875423470, -0.978037508649937880, --0.978027085979358390, -0.978016660863711310, -0.978006233303022610, -0.977995803297318280, -0.977985370846624400, -0.977974935950967180, -0.977964498610372600, -0.977954058824866750, --0.977943616594475820, -0.977933171919225570, -0.977922724799142660, -0.977912275234252950, -0.977901823224582410, -0.977891368770157480, -0.977880911871004010, -0.977870452527148100, --0.977859990738616290, -0.977849526505434550, -0.977839059827628860, -0.977828590705225650, -0.977818119138250900, -0.977807645126730800, -0.977797168670691660, -0.977786689770159590, --0.977776208425160780, -0.977765724635721310, -0.977755238401867620, -0.977744749723625910, -0.977734258601022250, -0.977723765034083090, -0.977713269022834170, -0.977702770567302370, --0.977692269667513550, -0.977681766323494130, -0.977671260535270310, -0.977660752302868310, -0.977650241626314420, -0.977639728505634960, -0.977629212940856140, -0.977618694932004260, --0.977608174479105530, -0.977597651582186480, -0.977587126241273420, -0.977576598456392440, -0.977566068227569970, -0.977555535554832320, -0.977545000438205690, -0.977534462877716730, --0.977523922873391630, -0.977513380425256710, -0.977502835533338390, -0.977492288197662870, -0.977481738418256700, -0.977471186195146170, -0.977460631528357720, -0.977450074417917420, --0.977439514863852170, -0.977428952866188140, -0.977418388424951770, -0.977407821540169360, -0.977397252211867350, -0.977386680440072150, -0.977376106224810300, -0.977365529566108340, --0.977354950463992460, -0.977344368918489190, -0.977333784929625080, -0.977323198497426440, -0.977312609621919790, -0.977302018303131680, -0.977291424541088300, -0.977280828335816530, --0.977270229687342670, -0.977259628595693260, -0.977249025060894840, -0.977238419082973820, -0.977227810661956520, -0.977217199797869920, -0.977206586490740330, -0.977195970740594280, --0.977185352547458310, -0.977174731911358950, -0.977164108832322740, -0.977153483310376210, -0.977142855345546010, -0.977132224937858670, -0.977121592087340620, -0.977110956794018830, --0.977100319057919500, -0.977089678879069500, -0.977079036257495260, -0.977068391193223200, -0.977057743686280400, -0.977047093736693180, -0.977036441344488300, -0.977025786509692300, --0.977015129232331800, -0.977004469512433580, -0.976993807350024060, -0.976983142745130100, -0.976972475697778230, -0.976961806207995000, -0.976951134275807490, -0.976940459901242120, --0.976929783084325540, -0.976919103825084620, -0.976908422123545780, -0.976897737979735780, -0.976887051393681700, -0.976876362365409870, -0.976865670894947250, -0.976854976982320380, --0.976844280627556020, -0.976833581830681030, -0.976822880591722060, -0.976812176910705990, -0.976801470787659110, -0.976790762222608850, -0.976780051215581760, -0.976769337766604350, --0.976758621875703730, -0.976747903542906530, -0.976737182768239400, -0.976726459551729430, -0.976715733893403380, -0.976705005793288010, -0.976694275251410060, -0.976683542267796520, --0.976672806842474040, -0.976662068975469590, -0.976651328666809930, -0.976640585916521700, -0.976629840724632330, -0.976619093091168230, -0.976608343016156510, -0.976597590499623910, --0.976586835541597310, -0.976576078142103340, -0.976565318301169550, -0.976554556018822350, -0.976543791295088730, -0.976533024129995760, -0.976522254523570110, -0.976511482475838850, --0.976500707986828980, -0.976489931056567230, -0.976479151685080700, -0.976468369872396050, -0.976457585618540680, -0.976446798923541360, -0.976436009787425060, -0.976425218210218770, --0.976414424191949240, -0.976403627732643780, -0.976392828832329250, -0.976382027491032640, -0.976371223708781040, -0.976360417485601320, -0.976349608821520550, -0.976338797716565840, --0.976327984170764050, -0.976317168184142380, -0.976306349756727480, -0.976295528888546980, -0.976284705579627650, -0.976273879829996580, -0.976263051639680750, -0.976252221008707340, --0.976241387937103130, -0.976230552424895650, -0.976219714472111870, -0.976208874078778770, -0.976198031244923440, -0.976187185970573080, -0.976176338255754780, -0.976165488100495530, --0.976154635504822620, -0.976143780468762930, -0.976132922992344000, -0.976122063075592790, -0.976111200718536300, -0.976100335921201930, -0.976089468683616680, -0.976078599005807510, --0.976067726887802190, -0.976056852329627360, -0.976045975331310540, -0.976035095892878730, -0.976024214014359240, -0.976013329695779140, -0.976002442937165760, -0.975991553738546180, --0.975980662099947600, -0.975969768021397570, -0.975958871502923150, -0.975947972544551460, -0.975937071146309900, -0.975926167308225680, -0.975915261030325780, -0.975904352312637950, --0.975893441155189280, -0.975882527558006970, -0.975871611521118340, -0.975860693044550700, -0.975849772128331240, -0.975838848772487500, -0.975827922977046570, -0.975816994742035760, --0.975806064067482380, -0.975795130953413970, -0.975784195399857720, -0.975773257406841070, -0.975762316974391200, -0.975751374102535430, -0.975740428791301300, -0.975729481040716220, --0.975718530850807290, -0.975707578221602150, -0.975696623153128000, -0.975685665645412370, -0.975674705698482580, -0.975663743312365940, -0.975652778487089980, -0.975641811222681900, --0.975630841519169460, -0.975619869376579850, -0.975608894794940730, -0.975597917774279290, -0.975586938314622950, -0.975575956415999260, -0.975564972078435730, -0.975553985301959800, --0.975542996086599000, -0.975532004432380640, -0.975521010339332250, -0.975510013807481370, -0.975499014836855420, -0.975488013427481930, -0.975477009579388320, -0.975466003292602250, --0.975454994567151230, -0.975443983403062710, -0.975432969800364200, -0.975421953759083360, -0.975410935279247380, -0.975399914360884250, -0.975388891004021370, -0.975377865208686190, --0.975366836974906450, -0.975355806302709570, -0.975344773192123090, -0.975333737643174770, -0.975322699655892130, -0.975311659230302500, -0.975300616366433950, -0.975289571064313800, --0.975278523323969800, -0.975267473145429390, -0.975256420528720410, -0.975245365473870090, -0.975234307980906600, -0.975223248049857380, -0.975212185680749970, -0.975201120873612100, --0.975190053628471440, -0.975178983945355740, -0.975167911824292410, -0.975156837265309440, -0.975145760268434360, -0.975134680833694590, -0.975123598961118440, -0.975112514650733230, --0.975101427902566710, -0.975090338716646630, -0.975079247093000530, -0.975068153031656500, -0.975057056532642070, -0.975045957595985000, -0.975034856221713040, -0.975023752409853950, --0.975012646160435480, -0.975001537473485390, -0.974990426349031550, -0.974979312787101480, -0.974968196787723060, -0.974957078350924270, -0.974945957476732850, -0.974934834165176460, --0.974923708416283060, -0.974912580230080320, -0.974901449606595970, -0.974890316545858230, -0.974879181047894620, -0.974868043112733120, -0.974856902740401490, -0.974845759930927590, --0.974834614684339300, -0.974823467000664470, -0.974812316879930970, -0.974801164322166460, -0.974790009327399340, -0.974778851895657050, -0.974767692026967780, -0.974756529721359180, --0.974745364978859330, -0.974734197799495770, -0.974723028183296920, -0.974711856130290540, -0.974700681640504610, -0.974689504713966870, -0.974678325350705420, -0.974667143550748130, --0.974655959314122970, -0.974644772640857910, -0.974633583530980730, -0.974622391984519830, -0.974611198001502870, -0.974600001581957920, -0.974588802725913080, -0.974577601433396110, --0.974566397704434980, -0.974555191539058120, -0.974543982937293160, -0.974532771899168320, -0.974521558424711550, -0.974510342513950860, -0.974499124166914310, -0.974487903383630010, --0.974476680164125920, -0.974465454508430140, -0.974454226416570420, -0.974442995888575410, -0.974431762924472980, -0.974420527524291090, -0.974409289688057840, -0.974398049415801220, --0.974386806707549620, -0.974375561563331050, -0.974364313983173580, -0.974353063967105300, -0.974341811515154420, -0.974330556627348910, -0.974319299303717080, -0.974308039544287020, --0.974296777349086820, -0.974285512718144450, -0.974274245651488570, -0.974262976149147030, -0.974251704211148040, -0.974240429837519790, -0.974229153028290500, -0.974217873783488120, --0.974206592103141310, -0.974195307987277940, -0.974184021435926310, -0.974172732449114620, -0.974161441026871190, -0.974150147169223990, -0.974138850876201560, -0.974127552147831980, --0.974116250984143340, -0.974104947385164180, -0.974093641350922690, -0.974082332881447190, -0.974071021976765760, -0.974059708636906720, -0.974048392861898370, -0.974037074651769140, --0.974025754006547230, -0.974014430926260940, -0.974003105410938600, -0.973991777460608390, -0.973980447075298850, -0.973969114255038180, -0.973957778999854700, -0.973946441309776590, --0.973935101184832620, -0.973923758625050760, -0.973912413630459660, -0.973901066201087410, -0.973889716336962530, -0.973878364038113230, -0.973867009304568150, -0.973855652136355500, --0.973844292533503800, -0.973832930496041360, -0.973821566023996610, -0.973810199117397860, -0.973798829776273740, -0.973787458000652470, -0.973776083790562570, -0.973764707146032250, --0.973753328067090360, -0.973741946553765110, -0.973730562606085040, -0.973719176224078550, -0.973707787407773970, -0.973696396157200050, -0.973685002472385210, -0.973673606353357870, --0.973662207800146450, -0.973650806812779600, -0.973639403391285630, -0.973627997535693180, -0.973616589246030780, -0.973605178522326860, -0.973593765364609840, -0.973582349772908580, --0.973570931747251400, -0.973559511287666930, -0.973548088394183720, -0.973536663066830180, -0.973525235305634950, -0.973513805110626680, -0.973502372481834020, -0.973490937419285270, --0.973479499923009310, -0.973468059993034540, -0.973456617629389730, -0.973445172832103300, -0.973433725601203890, -0.973422275936720040, -0.973410823838680610, -0.973399369307114240, --0.973387912342049360, -0.973376452943514710, -0.973364991111538960, -0.973353526846150510, -0.973342060147378450, -0.973330591015251210, -0.973319119449797540, -0.973307645451046090, --0.973296169019025490, -0.973284690153764510, -0.973273208855291670, -0.973261725123635960, -0.973250238958825680, -0.973238750360890030, -0.973227259329857430, -0.973215765865756750, --0.973204269968616640, -0.973192771638465850, -0.973181270875332900, -0.973169767679247010, -0.973158262050236700, -0.973146753988330730, -0.973135243493557960, -0.973123730565946920, --0.973112215205526710, -0.973100697412325850, -0.973089177186373330, -0.973077654527697790, -0.973066129436327980, -0.973054601912292980, -0.973043071955621560, -0.973031539566342360, --0.973020004744484360, -0.973008467490076190, -0.972996927803146950, -0.972985385683725500, -0.972973841131840490, -0.972962294147521000, -0.972950744730795680, -0.972939192881693500, --0.972927638600243340, -0.972916081886474160, -0.972904522740414720, -0.972892961162093780, -0.972881397151540650, -0.972869830708783970, -0.972858261833852710, -0.972846690526775860, --0.972835116787582050, -0.972823540616300720, -0.972811962012960500, -0.972800380977590250, -0.972788797510219180, -0.972777211610876160, -0.972765623279590040, -0.972754032516389810, --0.972742439321304550, -0.972730843694363250, -0.972719245635594530, -0.972707645145027940, -0.972696042222692240, -0.972684436868616500, -0.972672829082829590, -0.972661218865360610, --0.972649606216238420, -0.972637991135492430, -0.972626373623151410, -0.972614753679244440, -0.972603131303800720, -0.972591506496849000, -0.972579879258418600, -0.972568249588538490, --0.972556617487237760, -0.972544982954545280, -0.972533345990490570, -0.972521706595102510, -0.972510064768410180, -0.972498420510442660, -0.972486773821229060, -0.972475124700798330, --0.972463473149180020, -0.972451819166403000, -0.972440162752496450, -0.972428503907489470, -0.972416842631411260, -0.972405178924291010, -0.972393512786157710, -0.972381844217040660, --0.972370173216968840, -0.972358499785971770, -0.972346823924078340, -0.972335145631317950, -0.972323464907719700, -0.972311781753312790, -0.972300096168126180, -0.972288408152189640, --0.972276717705532030, -0.972265024828182560, -0.972253329520170520, -0.972241631781525230, -0.972229931612275890, -0.972218229012451580, -0.972206523982081850, -0.972194816521195770, --0.972183106629822320, -0.972171394307991490, -0.972159679555732130, -0.972147962373073440, -0.972136242760044960, -0.972124520716675660, -0.972112796242995290, -0.972101069339032840, --0.972089340004817840, -0.972077608240379360, -0.972065874045746960, -0.972054137420949820, -0.972042398366017360, -0.972030656880978890, -0.972018912965863740, -0.972007166620701190, --0.971995417845520900, -0.971983666640352070, -0.971971913005224010, -0.971960156940166240, -0.971948398445208080, -0.971936637520378620, -0.971924874165707830, -0.971913108381224910, --0.971901340166959170, -0.971889569522940140, -0.971877796449197140, -0.971866020945759580, -0.971854243012657100, -0.971842462649918910, -0.971830679857574430, -0.971818894635653410, --0.971807106984185150, -0.971795316903199090, -0.971783524392724860, -0.971771729452791670, -0.971759932083429030, -0.971748132284666830, -0.971736330056534260, -0.971724525399060850, --0.971712718312276010, -0.971700908796209520, -0.971689096850890780, -0.971677282476349210, -0.971665465672614470, -0.971653646439715860, -0.971641824777683240, -0.971630000686546150, --0.971618174166334110, -0.971606345217076560, -0.971594513838803240, -0.971582680031543360, -0.971570843795326990, -0.971559005130183450, -0.971547164036142500, -0.971535320513233550, --0.971523474561486360, -0.971511626180930450, -0.971499775371595490, -0.971487922133511090, -0.971476066466706920, -0.971464208371212390, -0.971452347847057470, -0.971440484894271710, --0.971428619512884730, -0.971416751702926300, -0.971404881464425610, -0.971393008797413080, -0.971381133701917920, -0.971369256177969990, -0.971357376225598920, -0.971345493844834370, --0.971333609035706090, -0.971321721798243830, -0.971309832132477240, -0.971297940038436060, -0.971286045516149830, -0.971274148565648750, -0.971262249186962250, -0.971250347380120060, --0.971238443145152060, -0.971226536482088010, -0.971214627390957320, -0.971202715871790300, -0.971190801924616600, -0.971178885549465740, -0.971166966746367710, -0.971155045515352260, --0.971143121856449240, -0.971131195769688430, -0.971119267255099560, -0.971107336312712400, -0.971095402942557030, -0.971083467144663090, -0.971071528919060680, -0.971059588265779320, --0.971047645184848980, -0.971035699676299320, -0.971023751740160650, -0.971011801376462590, -0.970999848585235030, -0.970987893366507930, -0.970975935720310930, -0.970963975646674250, --0.970952013145627510, -0.970940048217200810, -0.970928080861423790, -0.970916111078326760, -0.970904138867939360, -0.970892164230291790, -0.970880187165413690, -0.970868207673335150, --0.970856225754085810, -0.970844241407696210, -0.970832254634195980, -0.970820265433615100, -0.970808273805983670, -0.970796279751331430, -0.970784283269688460, -0.970772284361084870, --0.970760283025550510, -0.970748279263115470, -0.970736273073809610, -0.970724264457663130, -0.970712253414706130, -0.970700239944968350, -0.970688224048480100, -0.970676205725271020, --0.970664184975371660, -0.970652161798811750, -0.970640136195621510, -0.970628108165830890, -0.970616077709470120, -0.970604044826569030, -0.970592009517157850, -0.970579971781266650, --0.970567931618925520, -0.970555889030164430, -0.970543844015013700, -0.970531796573503520, -0.970519746705663660, -0.970507694411524620, -0.970495639691116190, -0.970483582544468540, --0.970471522971612100, -0.970459460972576850, -0.970447396547392980, -0.970435329696090590, -0.970423260418699970, -0.970411188715251120, -0.970399114585774330, -0.970387038030299690, --0.970374959048857290, -0.970362877641477660, -0.970350793808190890, -0.970338707549027070, -0.970326618864016610, -0.970314527753189490, -0.970302434216575800, -0.970290338254206410, --0.970278239866111060, -0.970266139052320060, -0.970254035812863850, -0.970241930147772490, -0.970229822057076200, -0.970217711540805490, -0.970205598598990470, -0.970193483231661210, --0.970181365438848480, -0.970169245220582340, -0.970157122576893130, -0.970144997507811020, -0.970132870013366460, -0.970120740093589510, -0.970108607748510930, -0.970096472978160820, --0.970084335782569580, -0.970072196161767430, -0.970060054115784780, -0.970047909644652040, -0.970035762748399530, -0.970023613427057670, -0.970011461680656660, -0.969999307509226800, --0.969987150912798970, -0.969974991891403240, -0.969962830445069920, -0.969950666573829670, -0.969938500277712450, -0.969926331556749230, -0.969914160410970230, -0.969901986840405740, --0.969889810845086300, -0.969877632425042320, -0.969865451580304350, -0.969853268310902680, -0.969841082616867860, -0.969828894498230290, -0.969816703955020290, -0.969804510987268830, --0.969792315595006000, -0.969780117778262340, -0.969767917537068480, -0.969755714871454840, -0.969743509781451630, -0.969731302267089810, -0.969719092328399810, -0.969706879965412160, --0.969694665178157170, -0.969682447966665580, -0.969670228330967940, -0.969658006271094660, -0.969645781787076280, -0.969633554878943320, -0.969621325546726750, -0.969609093790456790, --0.969596859610164060, -0.969584623005879220, -0.969572383977632900, -0.969560142525455300, -0.969547898649377630, -0.969535652349430180, -0.969523403625643600, -0.969511152478048420, --0.969498898906675510, -0.969486642911555290, -0.969474384492718500, -0.969462123650195680, -0.969449860384017370, -0.969437594694214640, -0.969425326580817930, -0.969413056043857860, --0.969400783083365190, -0.969388507699370460, -0.969376229891904420, -0.969363949660997930, -0.969351667006681520, -0.969339381928985940, -0.969327094427942070, -0.969314804503580320, --0.969302512155931550, -0.969290217385026520, -0.969277920190895980, -0.969265620573570690, -0.969253318533081050, -0.969241014069458400, -0.969228707182733130, -0.969216397872936120, --0.969204086140098120, -0.969191771984249660, -0.969179455405422050, -0.969167136403645820, -0.969154814978951620, -0.969142491131370520, -0.969130164860933170, -0.969117836167670330, --0.969105505051612970, -0.969093171512791840, -0.969080835551237700, -0.969068497166981400, -0.969056156360053930, -0.969043813130486150, -0.969031467478308820, -0.969019119403552900, --0.969006768906249040, -0.968994415986428100, -0.968982060644121400, -0.968969702879359460, -0.968957342692173260, -0.968944980082593780, -0.968932615050651870, -0.968920247596378290, --0.968907877719804240, -0.968895505420960370, -0.968883130699877530, -0.968870753556587140, -0.968858373991119850, -0.968845992003506630, -0.968833607593778460, -0.968821220761966200, --0.968808831508100710, -0.968796439832213420, -0.968784045734334960, -0.968771649214496430, -0.968759250272728690, -0.968746848909062930, -0.968734445123529910, -0.968722038916160930, --0.968709630286986760, -0.968697219236038350, -0.968684805763347030, -0.968672389868943770, -0.968659971552859540, -0.968647550815125320, -0.968635127655772310, -0.968622702074831140, --0.968610274072333580, -0.968597843648310250, -0.968585410802792260, -0.968572975535810900, -0.968560537847396930, -0.968548097737581770, -0.968535655206396280, -0.968523210253871670, --0.968510762880039010, -0.968498313084929290, -0.968485860868573910, -0.968473406231003970, -0.968460949172250450, -0.968448489692344540, -0.968436027791317210, -0.968423563469200110, --0.968411096726023990, -0.968398627561820160, -0.968386155976619810, -0.968373681970454040, -0.968361205543354140, -0.968348726695351100, -0.968336245426476340, -0.968323761736760940, --0.968311275626235870, -0.968298787094932890, -0.968286296142882860, -0.968273802770117210, -0.968261306976666900, -0.968248808762563470, -0.968236308127837670, -0.968223805072521370, --0.968211299596645650, -0.968198791700241590, -0.968186281383340620, -0.968173768645973820, -0.968161253488172720, -0.968148735909968420, -0.968136215911392320, -0.968123693492475400, --0.968111168653249530, -0.968098641393745800, -0.968086111713995390, -0.968073579614029620, -0.968061045093880020, -0.968048508153577570, -0.968035968793154010, -0.968023427012640550, --0.968010882812068600, -0.967998336191469360, -0.967985787150874240, -0.967973235690314790, -0.967960681809822200, -0.967948125509427880, -0.967935566789163040, -0.967923005649059420, --0.967910442089148340, -0.967897876109461210, -0.967885307710029340, -0.967872736890884270, -0.967860163652057070, -0.967847587993579730, -0.967835009915483320, -0.967822429417799500, --0.967809846500559570, -0.967797261163794940, -0.967784673407537270, -0.967772083231817850, -0.967759490636668220, -0.967746895622119910, -0.967734298188204110, -0.967721698334952810, --0.967709096062397300, -0.967696491370569010, -0.967683884259499470, -0.967671274729219990, -0.967658662779762650, -0.967646048411158530, -0.967633431623439400, -0.967620812416636560, --0.967608190790781750, -0.967595566745906520, -0.967582940282042280, -0.967570311399220780, -0.967557680097473450, -0.967545046376831700, -0.967532410237327500, -0.967519771678992390, --0.967507130701857790, -0.967494487305955330, -0.967481841491316660, -0.967469193257973200, -0.967456542605957040, -0.967443889535299470, -0.967431234046032150, -0.967418576138186710, --0.967405915811794910, -0.967393253066888280, -0.967380587903498570, -0.967367920321657300, -0.967355250321396130, -0.967342577902746910, -0.967329903065741400, -0.967317225810411020, --0.967304546136787620, -0.967291864044902860, -0.967279179534788150, -0.967266492606475790, -0.967253803259997210, -0.967241111495384050, -0.967228417312668180, -0.967215720711881220, --0.967203021693054940, -0.967190320256221200, -0.967177616401411640, -0.967164910128657680, -0.967152201437991850, -0.967139490329445460, -0.967126776803050260, -0.967114060858838220, --0.967101342496840990, -0.967088621717090090, -0.967075898519617950, -0.967063172904456090, -0.967050444871636270, -0.967037714421190350, -0.967024981553150200, -0.967012246267547450, --0.966999508564414190, -0.966986768443782170, -0.966974025905683150, -0.966961280950148880, -0.966948533577211670, -0.966935783786903040, -0.966923031579255080, -0.966910276954299430, --0.966897519912067850, -0.966884760452592750, -0.966871998575905780, -0.966859234282038790, -0.966846467571023660, -0.966833698442892460, -0.966820926897676960, -0.966808152935409120, --0.966795376556120910, -0.966782597759844320, -0.966769816546610870, -0.966757032916453210, -0.966744246869402970, -0.966731458405492130, -0.966718667524752550, -0.966705874227216430, --0.966693078512915300, -0.966680280381881700, -0.966667479834147470, -0.966654676869744490, -0.966641871488704840, -0.966629063691060500, -0.966616253476843430, -0.966603440846085850, --0.966590625798819600, -0.966577808335076560, -0.966564988454889250, -0.966552166158289540, -0.966539341445309290, -0.966526514315980690, -0.966513684770335950, -0.966500852808406590, --0.966488018430225470, -0.966475181635824240, -0.966462342425234990, -0.966449500798490010, -0.966436656755621180, -0.966423810296660800, -0.966410961421640850, -0.966398110130593510, --0.966385256423550660, -0.966372400300544830, -0.966359541761608100, -0.966346680806772440, -0.966333817436070050, -0.966320951649533240, -0.966308083447193770, -0.966295212829084260, --0.966282339795236810, -0.966269464345683500, -0.966256586480456430, -0.966243706199587990, -0.966230823503110290, -0.966217938391055520, -0.966205050863455870, -0.966192160920343550, --0.966179268561750740, -0.966166373787709860, -0.966153476598253120, -0.966140576993412600, -0.966127674973220720, -0.966114770537709440, -0.966101863686911420, -0.966088954420858740, --0.966076042739583700, -0.966063128643118500, -0.966050212131495560, -0.966037293204746960, -0.966024371862905240, -0.966011448106002590, -0.965998521934071320, -0.965985593347143400, --0.965972662345251810, -0.965959728928428630, -0.965946793096706060, -0.965933854850116510, -0.965920914188692080, -0.965907971112465620, -0.965895025621469230, -0.965882077715735310, --0.965869127395296180, -0.965856174660184140, -0.965843219510431730, -0.965830261946071360, -0.965817301967135220, -0.965804339573655860, -0.965791374765665460, -0.965778407543196770, --0.965765437906282110, -0.965752465854953890, -0.965739491389244420, -0.965726514509186230, -0.965713535214811620, -0.965700553506153360, -0.965687569383243740, -0.965674582846115070, --0.965661593894800110, -0.965648602529331050, -0.965635608749740530, -0.965622612556060970, -0.965609613948324900, -0.965596612926564510, -0.965583609490812900, -0.965570603641102250, --0.965557595377465110, -0.965544584699933870, -0.965531571608541310, -0.965518556103319490, -0.965505538184301510, -0.965492517851519790, -0.965479495105006640, -0.965466469944794900, --0.965453442370916900, -0.965440412383405280, -0.965427379982292670, -0.965414345167611600, -0.965401307939394600, -0.965388268297674210, -0.965375226242483290, -0.965362181773854360, --0.965349134891819950, -0.965336085596412710, -0.965323033887665050, -0.965309979765609950, -0.965296923230280050, -0.965283864281707760, -0.965270802919925730, -0.965257739144966820, --0.965244672956863450, -0.965231604355648480, -0.965218533341354550, -0.965205459914014190, -0.965192384073659930, -0.965179305820325070, -0.965166225154041820, -0.965153142074843040, --0.965140056582761470, -0.965126968677829430, -0.965113878360080220, -0.965100785629546380, -0.965087690486260530, -0.965074592930255440, -0.965061492961563960, -0.965048390580218630, --0.965035285786252420, -0.965022178579697850, -0.965009068960588020, -0.964995956928955120, -0.964982842484832680, -0.964969725628253120, -0.964956606359249180, -0.964943484677853740, --0.964930360584099640, -0.964917234078019440, -0.964904105159646310, -0.964890973829012900, -0.964877840086152070, -0.964864703931096690, -0.964851565363879500, -0.964838424384533490, --0.964825280993091280, -0.964812135189585970, -0.964798986974050090, -0.964785836346516930, -0.964772683307019150, -0.964759527855589720, -0.964746369992261490, -0.964733209717067220, --0.964720047030039770, -0.964706881931212460, -0.964693714420617910, -0.964680544498289110, -0.964667372164258910, -0.964654197418560290, -0.964641020261226220, -0.964627840692289570, --0.964614658711783310, -0.964601474319740190, -0.964588287516193630, -0.964575098301176270, -0.964561906674721190, -0.964548712636861370, -0.964535516187629780, -0.964522317327059180, --0.964509116055182970, -0.964495912372034030, -0.964482706277645320, -0.964469497772049820, -0.964456286855280510, -0.964443073527370580, -0.964429857788352880, -0.964416639638260630, --0.964403419077126680, -0.964390196104984000, -0.964376970721866010, -0.964363742927805690, -0.964350512722836010, -0.964337280106989940, -0.964324045080300560, -0.964310807642801190, --0.964297567794524910, -0.964284325535504580, -0.964271080865773510, -0.964257833785364780, -0.964244584294311480, -0.964231332392646580, -0.964218078080403500, -0.964204821357615090, --0.964191562224314570, -0.964178300680535230, -0.964165036726310150, -0.964151770361672540, -0.964138501586655480, -0.964125230401292170, -0.964111956805615570, -0.964098680799659210, --0.964085402383456300, -0.964072121557039810, -0.964058838320442920, -0.964045552673699070, -0.964032264616841330, -0.964018974149902900, -0.964005681272916970, -0.963992385985916740, --0.963979088288935640, -0.963965788182006960, -0.963952485665163670, -0.963939180738439320, -0.963925873401866860, -0.963912563655479620, -0.963899251499311100, -0.963885936933394530, --0.963872619957763080, -0.963859300572450060, -0.963845978777488790, -0.963832654572912560, -0.963819327958754800, -0.963805998935048590, -0.963792667501827240, -0.963779333659124380, --0.963765997406973220, -0.963752658745407050, -0.963739317674459310, -0.963725974194163280, -0.963712628304551950, -0.963699280005659410, -0.963685929297518620, -0.963672576180163000, --0.963659220653625970, -0.963645862717940840, -0.963632502373141020, -0.963619139619260050, -0.963605774456331220, -0.963592406884387850, -0.963579036903463360, -0.963565664513591490, --0.963552289714805330, -0.963538912507138520, -0.963525532890624480, -0.963512150865296400, -0.963498766431188040, -0.963485379588332910, -0.963471990336764230, -0.963458598676515620, --0.963445204607620510, -0.963431808130112420, -0.963418409244024780, -0.963405007949391100, -0.963391604246244930, -0.963378198134619450, -0.963364789614548740, -0.963351378686066130, --0.963337965349204910, -0.963324549603998940, -0.963311131450481530, -0.963297710888686100, -0.963284287918646510, -0.963270862540396290, -0.963257434753968970, -0.963244004559397960, --0.963230571956717020, -0.963217136945959560, -0.963203699527159340, -0.963190259700349880, -0.963176817465564490, -0.963163372822837260, -0.963149925772201710, -0.963136476313691260, --0.963123024447339660, -0.963109570173180440, -0.963096113491247020, -0.963082654401573700, -0.963069192904193680, -0.963055728999140600, -0.963042262686448320, -0.963028793966150260, --0.963015322838280290, -0.963001849302872030, -0.962988373359959130, -0.962974895009575120, -0.962961414251753970, -0.962947931086529430, -0.962934445513934920, -0.962920957534004420, --0.962907467146771450, -0.962893974352269640, -0.962880479150533100, -0.962866981541595330, -0.962853481525490110, -0.962839979102251280, -0.962826474271912370, -0.962812967034507360, --0.962799457390069890, -0.962785945338633820, -0.962772430880232900, -0.962758914014900660, -0.962745394742671290, -0.962731873063578550, -0.962718348977656070, -0.962704822484937720, --0.962691293585457020, -0.962677762279248390, -0.962664228566345370, -0.962650692446781700, -0.962637153920591350, -0.962623612987808070, -0.962610069648465850, -0.962596523902598420, --0.962582975750239660, -0.962569425191423410, -0.962555872226183440, -0.962542316854554050, -0.962528759076568760, -0.962515198892261670, -0.962501636301666630, -0.962488071304817390, --0.962474503901747710, -0.962460934092492120, -0.962447361877084130, -0.962433787255557730, -0.962420210227946880, -0.962406630794285570, -0.962393048954607530, -0.962379464708946970, --0.962365878057337750, -0.962352288999813620, -0.962338697536408880, -0.962325103667157510, -0.962311507392093370, -0.962297908711250430, -0.962284307624662770, -0.962270704132364040, --0.962257098234388870, -0.962243489930770910, -0.962229879221544240, -0.962216266106742820, -0.962202650586400750, -0.962189032660552000, -0.962175412329230760, -0.962161789592471010, --0.962148164450306490, -0.962134536902771840, -0.962120906949900820, -0.962107274591727510, -0.962093639828286110, -0.962080002659610470, -0.962066363085734680, -0.962052721106693150, --0.962039076722519870, -0.962025429933248910, -0.962011780738914360, -0.961998129139550410, -0.961984475135191030, -0.961970818725870540, -0.961957159911623010, -0.961943498692482520, --0.961929835068483060, -0.961916169039659260, -0.961902500606045100, -0.961888829767674650, -0.961875156524582110, -0.961861480876801460, -0.961847802824367330, -0.961834122367313690, --0.961820439505674750, -0.961806754239484700, -0.961793066568777720, -0.961779376493588130, -0.961765684013950130, -0.961751989129897900, -0.961738291841465640, -0.961724592148687440, --0.961710890051598040, -0.961697185550231430, -0.961683478644621780, -0.961669769334803530, -0.961656057620810740, -0.961642343502677630, -0.961628626980438940, -0.961614908054128640, --0.961601186723781030, -0.961587462989430540, -0.961573736851111360, -0.961560008308857790, -0.961546277362704260, -0.961532544012684950, -0.961518808258834180, -0.961505070101186580, --0.961491329539776230, -0.961477586574637550, -0.961463841205804970, -0.961450093433312780, -0.961436343257195180, -0.961422590677486920, -0.961408835694222090, -0.961395078307435310, --0.961381318517160690, -0.961367556323432850, -0.961353791726286210, -0.961340024725754970, -0.961326255321873660, -0.961312483514676570, -0.961298709304198360, -0.961284932690473550, --0.961271153673536330, -0.961257372253421230, -0.961243588430162670, -0.961229802203794950, -0.961216013574352930, -0.961202222541870820, -0.961188429106383250, -0.961174633267924630, --0.961160835026529380, -0.961147034382232040, -0.961133231335067120, -0.961119425885069050, -0.961105618032272570, -0.961091807776711660, -0.961077995118421510, -0.961064180057436430, --0.961050362593790840, -0.961036542727519370, -0.961022720458656330, -0.961008895787236690, -0.960995068713294760, -0.960981239236865290, -0.960967407357982580, -0.960953573076681500, --0.960939736392996350, -0.960925897306961980, -0.960912055818612830, -0.960898211927983410, -0.960884365635108370, -0.960870516940022680, -0.960856665842760640, -0.960842812343356890, --0.960828956441846180, -0.960815098138263050, -0.960801237432641900, -0.960787374325017930, -0.960773508815425560, -0.960759640903899310, -0.960745770590474060, -0.960731897875184320, --0.960718022758064950, -0.960704145239150380, -0.960690265318475570, -0.960676382996074720, -0.960662498271983250, -0.960648611146235560, -0.960634721618866320, -0.960620829689910250, --0.960606935359402110, -0.960593038627376330, -0.960579139493868310, -0.960565237958912350, -0.960551334022543330, -0.960537427684796000, -0.960523518945705090, -0.960509607805305370, --0.960495694263631680, -0.960481778320718680, -0.960467859976601000, -0.960453939231313950, -0.960440016084892050, -0.960426090537370160, -0.960412162588782920, -0.960398232239165320, --0.960384299488551970, -0.960370364336978090, -0.960356426784478190, -0.960342486831087360, -0.960328544476840240, -0.960314599721771800, -0.960300652565916790, -0.960286703009310180, --0.960272751051986840, -0.960258796693981620, -0.960244839935329160, -0.960230880776064890, -0.960216919216223320, -0.960202955255839540, -0.960188988894948300, -0.960175020133584360, --0.960161048971783230, -0.960147075409579330, -0.960133099447007870, -0.960119121084103580, -0.960105140320901440, -0.960091157157436540, -0.960077171593743730, -0.960063183629857870, --0.960049193265814170, -0.960035200501647260, -0.960021205337392550, -0.960007207773084790, -0.959993207808759070, -0.959979205444450370, -0.959965200680193640, -0.959951193516023650, --0.959937183951975800, -0.959923171988085190, -0.959909157624386560, -0.959895140860914990, -0.959881121697705560, -0.959867100134793370, -0.959853076172213490, -0.959839049810000900, --0.959825021048190340, -0.959810989886817570, -0.959796956325917330, -0.959782920365524590, -0.959768882005674670, -0.959754841246402530, -0.959740798087742930, -0.959726752529731720, --0.959712704572403540, -0.959698654215793590, -0.959684601459937060, -0.959670546304869030, -0.959656488750624590, -0.959642428797238930, -0.959628366444747250, -0.959614301693184400, --0.959600234542586030, -0.959586164992987100, -0.959572093044422700, -0.959558018696928140, -0.959543941950538490, -0.959529862805288740, -0.959515781261214510, -0.959501697318350890, --0.959487610976733070, -0.959473522236396150, -0.959459431097375530, -0.959445337559706180, -0.959431241623423640, -0.959417143288562870, -0.959403042555159290, -0.959388939423247880, --0.959374833892864380, -0.959360725964043760, -0.959346615636821330, -0.959332502911232400, -0.959318387787311930, -0.959304270265095680, -0.959290150344618840, -0.959276028025916610, --0.959261903309024280, -0.959247776193977280, -0.959233646680810790, -0.959219514769560130, -0.959205380460260710, -0.959191243752947840, -0.959177104647656600, -0.959162963144422950, --0.959148819243281770, -0.959134672944268570, -0.959120524247418670, -0.959106373152767590, -0.959092219660350190, -0.959078063770202550, -0.959063905482359760, -0.959049744796857120, --0.959035581713730160, -0.959021416233014290, -0.959007248354744820, -0.958993078078957280, -0.958978905405687090, -0.958964730334969320, -0.958950552866839940, -0.958936373001334270, --0.958922190738487610, -0.958908006078335480, -0.958893819020913310, -0.958879629566256390, -0.958865437714400580, -0.958851243465381310, -0.958837046819233760, -0.958822847775993690, --0.958808646335696510, -0.958794442498377640, -0.958780236264072720, -0.958766027632817260, -0.958751816604646480, -0.958737603179596330, -0.958723387357702130, -0.958709169138999620, --0.958694948523524100, -0.958680725511311230, -0.958666500102396180, -0.958652272296815270, -0.958638042094603680, -0.958623809495796840, -0.958609574500430610, -0.958595337108540390, --0.958581097320161950, -0.958566855135330580, -0.958552610554082140, -0.958538363576452280, -0.958524114202476190, -0.958509862432190050, -0.958495608265629180, -0.958481351702829440, --0.958467092743826240, -0.958452831388655000, -0.958438567637352020, -0.958424301489952610, -0.958410032946492410, -0.958395762007007160, -0.958381488671532500, -0.958367212940104190, --0.958352934812757740, -0.958338654289528910, -0.958324371370453560, -0.958310086055567000, -0.958295798344905530, -0.958281508238504440, -0.958267215736399610, -0.958252920838626790, --0.958238623545221710, -0.958224323856219810, -0.958210021771657260, -0.958195717291569720, -0.958181410415992810, -0.958167101144962510, -0.958152789478514340, -0.958138475416684290, --0.958124158959507980, -0.958109840107021270, -0.958095518859259700, -0.958081195216259670, -0.958066869178056610, -0.958052540744686380, -0.958038209916184820, -0.958023876692587710, --0.958009541073930550, -0.957995203060249880, -0.957980862651581220, -0.957966519847960440, -0.957952174649423280, -0.957937827056005720, -0.957923477067743610, -0.957909124684672820, --0.957894769906829200, -0.957880412734248400, -0.957866053166966820, -0.957851691205020120, -0.957837326848444140, -0.957822960097274860, -0.957808590951548240, -0.957794219411299830, --0.957779845476566140, -0.957765469147382810, -0.957751090423785920, -0.957736709305811230, -0.957722325793494700, -0.957707939886872420, -0.957693551585980350, -0.957679160890854250, --0.957664767801530430, -0.957650372318044290, -0.957635974440432580, -0.957621574168730840, -0.957607171502975250, -0.957592766443201680, -0.957578358989445880, -0.957563949141744590, --0.957549536900133340, -0.957535122264648210, -0.957520705235325290, -0.957506285812200650, -0.957491863995310280, -0.957477439784690240, -0.957463013180376630, -0.957448584182405420, --0.957434152790812560, -0.957419719005634610, -0.957405282826907290, -0.957390844254666810, -0.957376403288949130, -0.957361959929790340, -0.957347514177226740, -0.957333066031294420, --0.957318615492029460, -0.957304162559468040, -0.957289707233646040, -0.957275249514599860, -0.957260789402365590, -0.957246326896979300, -0.957231861998477210, -0.957217394706895150, --0.957202925022270000, -0.957188452944637390, -0.957173978474033740, -0.957159501610495120, -0.957145022354057740, -0.957130540704757560, -0.957116056662631220, -0.957101570227714800, --0.957087081400044500, -0.957072590179656400, -0.957058096566586910, -0.957043600560872120, -0.957029102162548330, -0.957014601371651840, -0.957000098188218520, -0.956985592612285220, --0.956971084643888030, -0.956956574283063020, -0.956942061529846620, -0.956927546384275020, -0.956913028846384410, -0.956898508916211420, -0.956883986593792150, -0.956869461879162890, --0.956854934772360060, -0.956840405273419850, -0.956825873382378570, -0.956811339099272630, -0.956796802424138340, -0.956782263357011890, -0.956767721897929910, -0.956753178046928720, --0.956738631804044500, -0.956724083169313790, -0.956709532142772770, -0.956694978724457750, -0.956680422914405470, -0.956665864712652250, -0.956651304119234270, -0.956636741134188060, --0.956622175757549930, -0.956607607989356400, -0.956593037829643890, -0.956578465278448810, -0.956563890335807580, -0.956549313001756270, -0.956534733276331980, -0.956520151159570790, --0.956505566651509320, -0.956490979752183890, -0.956476390461630800, -0.956461798779886910, -0.956447204706988630, -0.956432608242972270, -0.956418009387874360, -0.956403408141731530, --0.956388804504580080, -0.956374198476456660, -0.956359590057397790, -0.956344979247439890, -0.956330366046619250, -0.956315750454972970, -0.956301132472537340, -0.956286512099348900, --0.956271889335444160, -0.956257264180859660, -0.956242636635631800, -0.956228006699797570, -0.956213374373393380, -0.956198739656455740, -0.956184102549021200, -0.956169463051126380, --0.956154821162807920, -0.956140176884102470, -0.956125530215046540, -0.956110881155676550, -0.956096229706029590, -0.956081575866142060, -0.956066919636050620, -0.956052261015791880, --0.956037600005402390, -0.956022936604918770, -0.956008270814378000, -0.955993602633816610, -0.955978932063271110, -0.955964259102778380, -0.955949583752374930, -0.955934906012097630, --0.955920225881982890, -0.955905543362067790, -0.955890858452388410, -0.955876171152982180, -0.955861481463885610, -0.955846789385135230, -0.955832094916767900, -0.955817398058820380, --0.955802698811329070, -0.955787997174331270, -0.955773293147863520, -0.955758586731962460, -0.955743877926665040, -0.955729166732007810, -0.955714453148027720, -0.955699737174761530, --0.955685018812245990, -0.955670298060517840, -0.955655574919613730, -0.955640849389570950, -0.955626121470426030, -0.955611391162215830, -0.955596658464977100, -0.955581923378746480, --0.955567185903561380, -0.955552446039458210, -0.955537703786474070, -0.955522959144645580, -0.955508212114009710, -0.955493462694603220, -0.955478710886463190, -0.955463956689626360, --0.955449200104129590, -0.955434441130009640, -0.955419679767303800, -0.955404916016048710, -0.955390149876281350, -0.955375381348038680, -0.955360610431357560, -0.955345837126274630, --0.955331061432827310, -0.955316283351052340, -0.955301502880986700, -0.955286720022667350, -0.955271934776131150, -0.955257147141415190, -0.955242357118556210, -0.955227564707591400, --0.955212769908557520, -0.955197972721491870, -0.955183173146431310, -0.955168371183412800, -0.955153566832473430, -0.955138760093650060, -0.955123950966979550, -0.955109139452499530, --0.955094325550246540, -0.955079509260257750, -0.955064690582570260, -0.955049869517220930, -0.955035046064247050, -0.955020220223685490, -0.955005391995573330, -0.954990561379947530, --0.954975728376845520, -0.954960892986304270, -0.954946055208360620, -0.954931215043052010, -0.954916372490415280, -0.954901527550487410, -0.954886680223305920, -0.954871830508907780, --0.954856978407329970, -0.954842123918609790, -0.954827267042784310, -0.954812407779890630, -0.954797546129966030, -0.954782682093047400, -0.954767815669172240, -0.954752946858377080, --0.954738075660700010, -0.954723202076177670, -0.954708326104847350, -0.954693447746746140, -0.954678567001911120, -0.954663683870379920, -0.954648798352189520, -0.954633910447377110, --0.954619020155979880, -0.954604127478035140, -0.954589232413580070, -0.954574334962651980, -0.954559435125288070, -0.954544532901525520, -0.954529628291401310, -0.954514721294953410, --0.954499811912218550, -0.954484900143234280, -0.954469985988037780, -0.954455069446666250, -0.954440150519156870, -0.954425229205547290, -0.954410305505874690, -0.954395379420176270, --0.954380450948489440, -0.954365520090851520, -0.954350586847299790, -0.954335651217871560, -0.954320713202604140, -0.954305772801534720, -0.954290830014701160, -0.954275884842140540, --0.954260937283890160, -0.954245987339987560, -0.954231035010469800, -0.954216080295374300, -0.954201123194738820, -0.954186163708600650, -0.954171201836997000, -0.954156237579965260, --0.954141270937542970, -0.954126301909767550, -0.954111330496676400, -0.954096356698306840, -0.954081380514696150, -0.954066401945882330, -0.954051420991902430, -0.954036437652794000, --0.954021451928594440, -0.954006463819341400, -0.953991473325071840, -0.953976480445823840, -0.953961485181634590, -0.953946487532541740, -0.953931487498582590, -0.953916485079794760, --0.953901480276215690, -0.953886473087882990, -0.953871463514833980, -0.953856451557106410, -0.953841437214737460, -0.953826420487765110, -0.953811401376226780, -0.953796379880159970, --0.953781355999602120, -0.953766329734590630, -0.953751301085163590, -0.953736270051358300, -0.953721236633212400, -0.953706200830763410, -0.953691162644048850, -0.953676122073106370, --0.953661079117973600, -0.953646033778688170, -0.953630986055287620, -0.953615935947809360, -0.953600883456291460, -0.953585828580771460, -0.953570771321286870, -0.953555711677875340, --0.953540649650574500, -0.953525585239421770, -0.953510518444455340, -0.953495449265712610, -0.953480377703231240, -0.953465303757048970, -0.953450227427203530, -0.953435148713732360, --0.953420067616673420, -0.953404984136064230, -0.953389898271942430, -0.953374810024346100, -0.953359719393312650, -0.953344626378880070, -0.953329530981085750, -0.953314433199967670, --0.953299333035563360, -0.953284230487910780, -0.953269125557047790, -0.953254018243011920, -0.953238908545841030, -0.953223796465572870, -0.953208682002245180, -0.953193565155895820, --0.953178445926562530, -0.953163324314282860, -0.953148200319095080, -0.953133073941036860, -0.953117945180146030, -0.953102814036460240, -0.953087680510017470, -0.953072544600855220, --0.953057406309011810, -0.953042265634524990, -0.953027122577432380, -0.953011977137772080, -0.952996829315581830, -0.952981679110899370, -0.952966526523762900, -0.952951371554210060, --0.952936214202278700, -0.952921054468006570, -0.952905892351432190, -0.952890727852592880, -0.952875560971526920, -0.952860391708271970, -0.952845220062865870, -0.952830046035346930, --0.952814869625752790, -0.952799690834121530, -0.952784509660491110, -0.952769326104899390, -0.952754140167384360, -0.952738951847983960, -0.952723761146736180, -0.952708568063678980, --0.952693372598850120, -0.952678174752288110, -0.952662974524030590, -0.952647771914115650, -0.952632566922581360, -0.952617359549465580, -0.952602149794806170, -0.952586937658641660, --0.952571723141009800, -0.952556506241948650, -0.952541286961496200, -0.952526065299690530, -0.952510841256569710, -0.952495614832171710, -0.952480386026534840, -0.952465154839696630, --0.952449921271695810, -0.952434685322570140, -0.952419446992357810, -0.952404206281096900, -0.952388963188825490, -0.952373717715581320, -0.952358469861403160, -0.952343219626328840, --0.952327967010396460, -0.952312712013644200, -0.952297454636110040, -0.952282194877832390, -0.952266932738849100, -0.952251668219198600, -0.952236401318918620, -0.952221132038047920, --0.952205860376624360, -0.952190586334686230, -0.952175309912271620, -0.952160031109418600, -0.952144749926165380, -0.952129466362550470, -0.952114180418611960, -0.952098892094387920, --0.952083601389916770, -0.952068308305236480, -0.952053012840385460, -0.952037714995402020, -0.952022414770324230, -0.952007112165190290, -0.951991807180038400, -0.951976499814907280, --0.951961190069834930, -0.951945877944859520, -0.951930563440019470, -0.951915246555352650, -0.951899927290898120, -0.951884605646693750, -0.951869281622777730, -0.951853955219188700, --0.951838626435964620, -0.951823295273144020, -0.951807961730765210, -0.951792625808866480, -0.951777287507486250, -0.951761946826662490, -0.951746603766434050, -0.951731258326839250, --0.951715910507916150, -0.951700560309703400, -0.951685207732239190, -0.951669852775561710, -0.951654495439709810, -0.951639135724721810, -0.951623773630635880, -0.951608409157490450, --0.951593042305324150, -0.951577673074175070, -0.951562301464081940, -0.951546927475083070, -0.951531551107216540, -0.951516172360521440, -0.951500791235035840, -0.951485407730798370, --0.951470021847847240, -0.951454633586221180, -0.951439242945958160, -0.951423849927097390, -0.951408454529677040, -0.951393056753735420, -0.951377656599311280, -0.951362254066442930, --0.951346849155168980, -0.951331441865527870, -0.951316032197558230, -0.951300620151298130, -0.951285205726786880, -0.951269788924062440, -0.951254369743163690, -0.951238948184128910, --0.951223524246996850, -0.951208097931805610, -0.951192669238594470, -0.951177238167401630, -0.951161804718265720, -0.951146368891225280, -0.951130930686318930, -0.951115490103585310, --0.951100047143062840, -0.951084601804790370, -0.951069154088806320, -0.951053703995149100, -0.951038251523857900, -0.951022796674971140, -0.951007339448527330, -0.950991879844565240, --0.950976417863123040, -0.950960953504240260, -0.950945486767954980, -0.950930017654305960, -0.950914546163331930, -0.950899072295071530, -0.950883596049563410, -0.950868117426846400, --0.950852636426959050, -0.950837153049940100, -0.950821667295827950, -0.950806179164662040, -0.950790688656480530, -0.950775195771322410, -0.950759700509226200, -0.950744202870230870, --0.950728702854374610, -0.950713200461696940, -0.950697695692236280, -0.950682188546031370, -0.950666679023121080, -0.950651167123543920, -0.950635652847338970, -0.950620136194544880, --0.950604617165200390, -0.950589095759344140, -0.950573571977015310, -0.950558045818252650, -0.950542517283094910, -0.950526986371580840, -0.950511453083749290, -0.950495917419638790, --0.950480379379288860, -0.950464838962737920, -0.950449296170024830, -0.950433751001188650, -0.950418203456268040, -0.950402653535301840, -0.950387101238329040, -0.950371546565388580, --0.950355989516518900, -0.950340430091759500, -0.950324868291149040, -0.950309304114726470, -0.950293737562530550, -0.950278168634600350, -0.950262597330974400, -0.950247023651692340, --0.950231447596792680, -0.950215869166314290, -0.950200288360296350, -0.950184705178777620, -0.950169119621797180, -0.950153531689393870, -0.950137941381606790, -0.950122348698474890, --0.950106753640036830, -0.950091156206332110, -0.950075556397399490, -0.950059954213278050, -0.950044349654006640, -0.950028742719624120, -0.950013133410170020, -0.949997521725683190, --0.949981907666202390, -0.949966291231766900, -0.949950672422415710, -0.949935051238187780, -0.949919427679122300, -0.949903801745258130, -0.949888173436634560, -0.949872542753290250, --0.949856909695264820, -0.949841274262597120, -0.949825636455326360, -0.949809996273491390, -0.949794353717131390, -0.949778708786285340, -0.949763061480992770, -0.949747411801292520, --0.949731759747223680, -0.949716105318825550, -0.949700448516137110, -0.949684789339197530, -0.949669127788046020, -0.949653463862721650, -0.949637797563263390, -0.949622128889710870, --0.949606457842103070, -0.949590784420479170, -0.949575108624878150, -0.949559430455339530, -0.949543749911901940, -0.949528066994605350, -0.949512381703488510, -0.949496694038590720, --0.949481003999951170, -0.949465311587609160, -0.949449616801603890, -0.949433919641974540, -0.949418220108760420, -0.949402518202000500, -0.949386813921734520, -0.949371107268001560, --0.949355398240840700, -0.949339686840291460, -0.949323973066392930, -0.949308256919184300, -0.949292538398705200, -0.949276817504994820, -0.949261094238092350, -0.949245368598037210, --0.949229640584868580, -0.949213910198625890, -0.949198177439348310, -0.949182442307075380, -0.949166704801846390, -0.949150964923700320, -0.949135222672677140, -0.949119478048815910, --0.949103731052155950, -0.949087981682736670, -0.949072229940597150, -0.949056475825777350, -0.949040719338316240, -0.949024960478253470, -0.949009199245628320, -0.948993435640480110, --0.948977669662848360, -0.948961901312772360, -0.948946130590291650, -0.948930357495445630, -0.948914582028273390, -0.948898804188815000, -0.948883023977109660, -0.948867241393196670, --0.948851456437115550, -0.948835669108905600, -0.948819879408606790, -0.948804087336258210, -0.948788292891899370, -0.948772496075569900, -0.948756696887309130, -0.948740895327156660, --0.948725091395151930, -0.948709285091334450, -0.948693476415743750, -0.948677665368419130, -0.948661851949400560, -0.948646036158727450, -0.948630217996439100, -0.948614397462575360, --0.948598574557175560, -0.948582749280279080, -0.948566921631925910, -0.948551091612155560, -0.948535259221007450, -0.948519424458521110, -0.948503587324736270, -0.948487747819692470, --0.948471905943429340, -0.948456061695986400, -0.948440215077403060, -0.948424366087719410, -0.948408514726974850, -0.948392660995209020, -0.948376804892461570, -0.948360946418772110, --0.948345085574179960, -0.948329222358725300, -0.948313356772447660, -0.948297488815386670, -0.948281618487581970, -0.948265745789073190, -0.948249870719899970, -0.948233993280102160, --0.948218113469719400, -0.948202231288791330, -0.948186346737357360, -0.948170459815457780, -0.948154570523132120, -0.948138678860420030, -0.948122784827361230, -0.948106888423995150, --0.948090989650362090, -0.948075088506501680, -0.948059184992453450, -0.948043279108257360, -0.948027370853953060, -0.948011460229580270, -0.947995547235178760, -0.947979631870788490, --0.947963714136449200, -0.947947794032200200, -0.947931871558082120, -0.947915946714134260, -0.947900019500396600, -0.947884089916908870, -0.947868157963710600, -0.947852223640842210, --0.947836286948343320, -0.947820347886253690, -0.947804406454613280, -0.947788462653461730, -0.947772516482839110, -0.947756567942785070, -0.947740617033339780, -0.947724663754542780, --0.947708708106433930, -0.947692750089053630, -0.947676789702441400, -0.947660826946637220, -0.947644861821680950, -0.947628894327612550, -0.947612924464471540, -0.947596952232298670, --0.947580977631133250, -0.947565000661015460, -0.947549021321985150, -0.947533039614082420, -0.947517055537346890, -0.947501069091818860, -0.947485080277538080, -0.947469089094544410, --0.947453095542878150, -0.947437099622579270, -0.947421101333687620, -0.947405100676243170, -0.947389097650286120, -0.947373092255855860, -0.947357084492993270, -0.947341074361737870, --0.947325061862129840, -0.947309046994209150, -0.947293029758015880, -0.947277010153590000, -0.947260988180971600, -0.947244963840200740, -0.947228937131317170, -0.947212908054361540, --0.947196876609373680, -0.947180842796393590, -0.947164806615461320, -0.947148768066617190, -0.947132727149900710, -0.947116683865352860, -0.947100638213013160, -0.947084590192921900, --0.947068539805119180, -0.947052487049645060, -0.947036431926539860, -0.947020374435843420, -0.947004314577596150, -0.946988252351838030, -0.946972187758609030, -0.946956120797949890, --0.946940051469900350, -0.946923979774500710, -0.946907905711791180, -0.946891829281811590, -0.946875750484602710, -0.946859669320204380, -0.946843585788656910, -0.946827499890000480, --0.946811411624275400, -0.946795320991521640, -0.946779227991779710, -0.946763132625089600, -0.946747034891491700, -0.946730934791025990, -0.946714832323733100, -0.946698727489653220, --0.946682620288826550, -0.946666510721293260, -0.946650398787093670, -0.946634284486267850, -0.946618167818856660, -0.946602048784899950, -0.946585927384438140, -0.946569803617511530, --0.946553677484160420, -0.946537548984425100, -0.946521418118345890, -0.946505284885963190, -0.946489149287316980, -0.946473011322448100, -0.946456870991396860, -0.946440728294203340, --0.946424583230907950, -0.946408435801551210, -0.946392286006172980, -0.946376133844814340, -0.946359979317515480, -0.946343822424316580, -0.946327663165258180, -0.946311501540380570, --0.946295337549724170, -0.946279171193329490, -0.946263002471236850, -0.946246831383486420, -0.946230657930119290, -0.946214482111175430, -0.946198303926695350, -0.946182123376719590, --0.946165940461288430, -0.946149755180442200, -0.946133567534221840, -0.946117377522667560, -0.946101185145819870, -0.946084990403719180, -0.946068793296406030, -0.946052593823920820, --0.946036391986304180, -0.946020187783596640, -0.946003981215838510, -0.945987772283070290, -0.945971560985332750, -0.945955347322666400, -0.945939131295111760, -0.945922912902709130, --0.945906692145499050, -0.945890469023522470, -0.945874243536819700, -0.945858015685431370, -0.945841785469398010, -0.945825552888760130, -0.945809317943558490, -0.945793080633833380, --0.945776840959625660, -0.945760598920975860, -0.945744354517924270, -0.945728107750512080, -0.945711858618779600, -0.945695607122767460, -0.945679353262516290, -0.945663097038066840, --0.945646838449459180, -0.945630577496734850, -0.945614314179934020, -0.945598048499097450, -0.945581780454265770, -0.945565510045479620, -0.945549237272779730, -0.945532962136206630, --0.945516684635801190, -0.945500404771603800, -0.945484122543655660, -0.945467837951997180, -0.945451550996669110, -0.945435261677712190, -0.945418969995167170, -0.945402675949074340, --0.945386379539475130, -0.945370080766409940, -0.945353779629919620, -0.945337476130044820, -0.945321170266826380, -0.945304862040304950, -0.945288551450521370, -0.945272238497516400, --0.945255923181330560, -0.945239605502005250, -0.945223285459580900, -0.945206963054098240, -0.945190638285598350, -0.945174311154121760, -0.945157981659709100, -0.945141649802401780, --0.945125315582240330, -0.945108978999265600, -0.945092640053518450, -0.945076298745039730, -0.945059955073870190, -0.945043609040050800, -0.945027260643622300, -0.945010909884625770, --0.944994556763101620, -0.944978201279091380, -0.944961843432635670, -0.944945483223775360, -0.944929120652551300, -0.944912755719004130, -0.944896388423175360, -0.944880018765105630, --0.944863646744835920, -0.944847272362406950, -0.944830895617859930, -0.944814516511235600, -0.944798135042575040, -0.944781751211919100, -0.944765365019308860, -0.944748976464784840, --0.944732585548388680, -0.944716192270161010, -0.944699796630142920, -0.944683398628375360, -0.944666998264899190, -0.944650595539755390, -0.944634190452985250, -0.944617783004629730, --0.944601373194729700, -0.944584961023326340, -0.944568546490460400, -0.944552129596173300, -0.944535710340505760, -0.944519288723498880, -0.944502864745193630, -0.944486438405631400, --0.944470009704853180, -0.944453578642899800, -0.944437145219812590, -0.944420709435632500, -0.944404271290400280, -0.944387830784157670, -0.944371387916945530, -0.944354942688804930, --0.944338495099776960, -0.944322045149902810, -0.944305592839223440, -0.944289138167780150, -0.944272681135614020, -0.944256221742765910, -0.944239759989277450, -0.944223295875189720, --0.944206829400543680, -0.944190360565380530, -0.944173889369741560, -0.944157415813667520, -0.944140939897200270, -0.944124461620380550, -0.944107980983249770, -0.944091497985849130, --0.944075012628219580, -0.944058524910402650, -0.944042034832439310, -0.944025542394370860, -0.944009047596238600, -0.943992550438083500, -0.943976050919947180, -0.943959549041870850, --0.943943044803895570, -0.943926538206062760, -0.943910029248413160, -0.943893517930988970, -0.943877004253830810, -0.943860488216980320, -0.943843969820478470, -0.943827449064366770, --0.943810925948686430, -0.943794400473478730, -0.943777872638785100, -0.943761342444646710, -0.943744809891104650, -0.943728274978201000, -0.943711737705976610, -0.943695198074472770, --0.943678656083731030, -0.943662111733792660, -0.943645565024698650, -0.943629015956491070, -0.943612464529210990, -0.943595910742899720, -0.943579354597598670, -0.943562796093349140, --0.943546235230192760, -0.943529672008170730, -0.943513106427324550, -0.943496538487695210, -0.943479968189325000, -0.943463395532254670, -0.943446820516525950, -0.943430243142180270, --0.943413663409258810, -0.943397081317802980, -0.943380496867854750, -0.943363910059455300, -0.943347320892646060, -0.943330729367468420, -0.943314135483964030, -0.943297539242174410, --0.943280940642140740, -0.943264339683904880, -0.943247736367507810, -0.943231130692991690, -0.943214522660397740, -0.943197912269767570, -0.943181299521142490, -0.943164684414564250, --0.943148066950073920, -0.943131447127713800, -0.943114824947525080, -0.943098200409549170, -0.943081573513827930, -0.943064944260402660, -0.943048312649314990, -0.943031678680606560, --0.943015042354318990, -0.942998403670493810, -0.942981762629172330, -0.942965119230396720, -0.942948473474208290, -0.942931825360648680, -0.942915174889759510, -0.942898522061582090, --0.942881866876158710, -0.942865209333530680, -0.942848549433739520, -0.942831887176827090, -0.942815222562834900, -0.942798555591804700, -0.942781886263778010, -0.942765214578796700, --0.942748540536902270, -0.942731864138136260, -0.942715185382540950, -0.942698504270157560, -0.942681820801027910, -0.942665134975193770, -0.942648446792696770, -0.942631756253578310, --0.942615063357880810, -0.942598368105645680, -0.942581670496914550, -0.942564970531729380, -0.942548268210131600, -0.942531563532163270, -0.942514856497866040, -0.942498147107281640, --0.942481435360451590, -0.942464721257418200, -0.942448004798222990, -0.942431285982907820, -0.942414564811514420, -0.942397841284084660, -0.942381115400659940, -0.942364387161282790, --0.942347656565994620, -0.942330923614837280, -0.942314188307852740, -0.942297450645082630, -0.942280710626568930, -0.942263968252353480, -0.942247223522478030, -0.942230476436984320, --0.942213726995914660, -0.942196975199310670, -0.942180221047214330, -0.942163464539667260, -0.942146705676711660, -0.942129944458389050, -0.942113180884741830, -0.942096414955811530, --0.942079646671640350, -0.942062876032270010, -0.942046103037742500, -0.942029327688099660, -0.942012549983383570, -0.941995769923636090, -0.941978987508899190, -0.941962202739214490, --0.941945415614624640, -0.941928626135171140, -0.941911834300896200, -0.941895040111841660, -0.941878243568049170, -0.941861444669561340, -0.941844643416419940, -0.941827839808666910, --0.941811033846344350, -0.941794225529494210, -0.941777414858158470, -0.941760601832379200, -0.941743786452198360, -0.941726968717658150, -0.941710148628800090, -0.941693326185667030, --0.941676501388300720, -0.941659674236743130, -0.941642844731036320, -0.941626012871222380, -0.941609178657343170, -0.941592342089441310, -0.941575503167558560, -0.941558661891736980, --0.941541818262018880, -0.941524972278446230, -0.941508123941060980, -0.941491273249905560, -0.941474420205022030, -0.941457564806452040, -0.941440707054238430, -0.941423846948423070, --0.941406984489048140, -0.941390119676155710, -0.941373252509787980, -0.941356382989986810, -0.941339511116794920, -0.941322636890254420, -0.941305760310407250, -0.941288881377295610, --0.941272000090961790, -0.941255116451447990, -0.941238230458796400, -0.941221342113049310, -0.941204451414248470, -0.941187558362436840, -0.941170662957656280, -0.941153765199949090, --0.941136865089357570, -0.941119962625923790, -0.941103057809689840, -0.941086150640698450, -0.941069241118991820, -0.941052329244612020, -0.941035415017601350, -0.941018498438002230, --0.941001579505856830, -0.940984658221207470, -0.940967734584096550, -0.940950808594566150, -0.940933880252658560, -0.940916949558416540, -0.940900016511882040, -0.940883081113097600, --0.940866143362105390, -0.940849203258947610, -0.940832260803667110, -0.940815315996305860, -0.940798368836906370, -0.940781419325511070, -0.940764467462162140, -0.940747513246901980, --0.940730556679773120, -0.940713597760817870, -0.940696636490078510, -0.940679672867597350, -0.940662706893417360, -0.940645738567580490, -0.940628767890129390, -0.940611794861106240, --0.940594819480553680, -0.940577841748513780, -0.940560861665029610, -0.940543879230143150, -0.940526894443897140, -0.940509907306333770, -0.940492917817495780, -0.940475925977425350, --0.940458931786165240, -0.940441935243757630, -0.940424936350245040, -0.940407935105670330, -0.940390931510075800, -0.940373925563503970, -0.940356917265997350, -0.940339906617598360, --0.940322893618349310, -0.940305878268293370, -0.940288860567472740, -0.940271840515929940, -0.940254818113707480, -0.940237793360848010, -0.940220766257394040, -0.940203736803388200, --0.940186704998873020, -0.940169670843890800, -0.940152634338484620, -0.940135595482696980, -0.940118554276570210, -0.940101510720147140, -0.940084464813470300, -0.940067416556581990, --0.940050365949525400, -0.940033312992342940, -0.940016257685077130, -0.939999200027770710, -0.939982140020466320, -0.939965077663206580, -0.939948012956034140, -0.939930945898991620, --0.939913876492121770, -0.939896804735467000, -0.939879730629070380, -0.939862654172974540, -0.939845575367222020, -0.939828494211855550, -0.939811410706917540, -0.939794324852451400, --0.939777236648499330, -0.939760146095104280, -0.939743053192308770, -0.939725957940155680, -0.939708860338687610, -0.939691760387947550, -0.939674658087977900, -0.939657553438821740, --0.939640446440521360, -0.939623337093120180, -0.939606225396660610, -0.939589111351185500, -0.939571994956737600, -0.939554876213359760, -0.939537755121094390, -0.939520631679985010, --0.939503505890073920, -0.939486377751404200, -0.939469247264018370, -0.939452114427959620, -0.939434979243270460, -0.939417841709993870, -0.939400701828172700, -0.939383559597849470, --0.939366415019067590, -0.939349268091869690, -0.939332118816298630, -0.939314967192397270, -0.939297813220208560, -0.939280656899774910, -0.939263498231139970, -0.939246337214346360, --0.939229173849436830, -0.939212008136454330, -0.939194840075441850, -0.939177669666442340, -0.939160496909498540, -0.939143321804653540, -0.939126144351949970, -0.939108964551431340, --0.939091782403140280, -0.939074597907119780, -0.939057411063412670, -0.939040221872062150, -0.939023030333110740, -0.939005836446602070, -0.938988640212578880, -0.938971441631083930, --0.938954240702160490, -0.938937037425851440, -0.938919831802199730, -0.938902623831248560, -0.938885413513040780, -0.938868200847619460, -0.938850985835027240, -0.938833768475307970, --0.938816548768504290, -0.938799326714659150, -0.938782102313815760, -0.938764875566016730, -0.938747646471305930, -0.938730415029725980, -0.938713181241319970, -0.938695945106130970, --0.938678706624202160, -0.938661465795576630, -0.938644222620297340, -0.938626977098407590, -0.938609729229950340, -0.938592479014968450, -0.938575226453505660, -0.938557971545604830, --0.938540714291309030, -0.938523454690661560, -0.938506192743705060, -0.938488928450483370, -0.938471661811039360, -0.938454392825416210, -0.938437121493657100, -0.938419847815805230, --0.938402571791903670, -0.938385293421995730, -0.938368012706124470, -0.938350729644333300, -0.938333444236664870, -0.938316156483163240, -0.938298866383871170, -0.938281573938831940, --0.938264279148088740, -0.938246982011684880, -0.938229682529663320, -0.938212380702067810, -0.938195076528941300, -0.938177770010327210, -0.938160461146268610, -0.938143149936808810, --0.938125836381991210, -0.938108520481859000, -0.938091202236455590, -0.938073881645823730, -0.938056558710007480, -0.938039233429049930, -0.938021905802994160, -0.938004575831883790, --0.937987243515761900, -0.937969908854671570, -0.937952571848656770, -0.937935232497760560, -0.937917890802026260, -0.937900546761497260, -0.937883200376216970, -0.937865851646228600, --0.937848500571575540, -0.937831147152301310, -0.937813791388448890, -0.937796433280062240, -0.937779072827184530, -0.937761710029859200, -0.937744344888129520, -0.937726977402039030, --0.937709607571630800, -0.937692235396948790, -0.937674860878036310, -0.937657484014936650, -0.937640104807693220, -0.937622723256349540, -0.937605339360949030, -0.937587953121535200, --0.937570564538151460, -0.937553173610841340, -0.937535780339648020, -0.937518384724615460, -0.937500986765787080, -0.937483586463206060, -0.937466183816916150, -0.937448778826960540, --0.937431371493383180, -0.937413961816227490, -0.937396549795536880, -0.937379135431354870, -0.937361718723724980, -0.937344299672690840, -0.937326878278295970, -0.937309454540583900, --0.937292028459598140, -0.937274600035381990, -0.937257169267979750, -0.937239736157434500, -0.937222300703789980, -0.937204862907089600, -0.937187422767377210, -0.937169980284695890, --0.937152535459089830, -0.937135088290602550, -0.937117638779277560, -0.937100186925158400, -0.937082732728288790, -0.937065276188712380, -0.937047817306472800, -0.937030356081613560, --0.937012892514178300, -0.936995426604210980, -0.936977958351755120, -0.936960487756854370, -0.936943014819552440, -0.936925539539892880, -0.936908061917919310, -0.936890581953675810, --0.936873099647205780, -0.936855614998553080, -0.936838128007761340, -0.936820638674874310, -0.936803146999935720, -0.936785652982989100, -0.936768156624078530, -0.936750657923247190, --0.936733156880539490, -0.936715653495998830, -0.936698147769669200, -0.936680639701594100, -0.936663129291817390, -0.936645616540382590, -0.936628101447333990, -0.936610584012715240, --0.936593064236569960, -0.936575542118942010, -0.936558017659875230, -0.936540490859413490, -0.936522961717600410, -0.936505430234479960, -0.936487896410096000, -0.936470360244491930, --0.936452821737712270, -0.936435280889800550, -0.936417737700800610, -0.936400192170756320, -0.936382644299711300, -0.936365094087709960, -0.936347541534795820, -0.936329986641012860, --0.936312429406405020, -0.936294869831016060, -0.936277307914889830, -0.936259743658070410, -0.936242177060601640, -0.936224608122527390, -0.936207036843891390, -0.936189463224738060, --0.936171887265111020, -0.936154308965054360, -0.936136728324611810, -0.936119145343827560, -0.936101560022745030, -0.936083972361409060, -0.936066382359863060, -0.936048790018151110, --0.936031195336317180, -0.936013598314405230, -0.935995998952459330, -0.935978397250523450, -0.935960793208641560, -0.935943186826857290, -0.935925578105215480, -0.935907967043759670, --0.935890353642533920, -0.935872737901582430, -0.935855119820948930, -0.935837499400677400, -0.935819876640812450, -0.935802251541397730, -0.935784624102477420, -0.935766994324095600, --0.935749362206296230, -0.935731727749123500, -0.935714090952621370, -0.935696451816834140, -0.935678810341805330, -0.935661166527579910, -0.935643520374201510, -0.935625871881714310, --0.935608221050162500, -0.935590567879590160, -0.935572912370041030, -0.935555254521559850, -0.935537594334190590, -0.935519931807977430, -0.935502266942964340, -0.935484599739195620, --0.935466930196715450, -0.935449258315567910, -0.935431584095797190, -0.935413907537447580, -0.935396228640562820, -0.935378547405187890, -0.935360863831366520, -0.935343177919143010, --0.935325489668561550, -0.935307799079665990, -0.935290106152501300, -0.935272410887111440, -0.935254713283540480, -0.935237013341832730, -0.935219311062032380, -0.935201606444183820, --0.935183899488331250, -0.935166190194518960, -0.935148478562791150, -0.935130764593191780, -0.935113048285765910, -0.935095329640557420, -0.935077608657610470, -0.935059885336969600, --0.935042159678679100, -0.935024431682782710, -0.935006701349325730, -0.934988968678351910, -0.934971233669905640, -0.934953496324031350, -0.934935756640773220, -0.934918014620175760, --0.934900270262283280, -0.934882523567140190, -0.934864774534790330, -0.934847023165279010, -0.934829269458649970, -0.934811513414947840, -0.934793755034216910, -0.934775994316501600, --0.934758231261845980, -0.934740465870295130, -0.934722698141893130, -0.934704928076684370, -0.934687155674713280, -0.934669380936024250, -0.934651603860661820, -0.934633824448670380, --0.934616042700094350, -0.934598258614977920, -0.934580472193366150, -0.934562683435303130, -0.934544892340833490, -0.934527098910001630, -0.934509303142852080, -0.934491505039428790, --0.934473704599777190, -0.934455901823941230, -0.934438096711965650, -0.934420289263894750, -0.934402479479773060, -0.934384667359645200, -0.934366852903555810, -0.934349036111549180, --0.934331216983669940, -0.934313395519962290, -0.934295571720471620, -0.934277745585241900, -0.934259917114317880, -0.934242086307744080, -0.934224253165564680, -0.934206417687824970, --0.934188579874569270, -0.934170739725842080, -0.934152897241688150, -0.934135052422151890, -0.934117205267277930, -0.934099355777111010, -0.934081503951695760, -0.934063649791076700, --0.934045793295298240, -0.934027934464405570, -0.934010073298443100, -0.933992209797455340, -0.933974343961487150, -0.933956475790583050, -0.933938605284787560, -0.933920732444145750, --0.933902857268702150, -0.933884979758501490, -0.933867099913588290, -0.933849217734007310, -0.933831333219803380, -0.933813446371021040, -0.933795557187705130, -0.933777665669899950, --0.933759771817651020, -0.933741875631002530, -0.933723977109999440, -0.933706076254686380, -0.933688173065108210, -0.933670267541309220, -0.933652359683334820, -0.933634449491229650, --0.933616536965038320, -0.933598622104805600, -0.933580704910576320, -0.933562785382395340, -0.933544863520307300, -0.933526939324357260, -0.933509012794589420, -0.933491083931049400, --0.933473152733781620, -0.933455219202831030, -0.933437283338242390, -0.933419345140060530, -0.933401404608329990, -0.933383461743096280, -0.933365516544403920, -0.933347569012297650, --0.933329619146822550, -0.933311666948023480, -0.933293712415945160, -0.933275755550632580, -0.933257796352130580, -0.933239834820484120, -0.933221870955737720, -0.933203904757937020, --0.933185936227126420, -0.933167965363351120, -0.933149992166655840, -0.933132016637085340, -0.933114038774685020, -0.933096058579499730, -0.933078076051574110, -0.933060091190953460, --0.933042103997682500, -0.933024114471806330, -0.933006122613369900, -0.932988128422418070, -0.932970131898996020, -0.932952133043148170, -0.932934131854920470, -0.932916128334357330, --0.932898122481503940, -0.932880114296405160, -0.932862103779106170, -0.932844090929651590, -0.932826075748087180, -0.932808058234457450, -0.932790038388807590, -0.932772016211182660, --0.932753991701627760, -0.932735964860187840, -0.932717935686907970, -0.932699904181833240, -0.932681870345008490, -0.932663834176479360, -0.932645795676290690, -0.932627754844487460, --0.932609711681114840, -0.932591666186218030, -0.932573618359841650, -0.932555568202031560, -0.932537515712832610, -0.932519460892289760, -0.932501403740448320, -0.932483344257353460, --0.932465282443050160, -0.932447218297583590, -0.932429151820999060, -0.932411083013341300, -0.932393011874656170, -0.932374938404988420, -0.932356862604383440, -0.932338784472886320, --0.932320704010542120, -0.932302621217395930, -0.932284536093493490, -0.932266448638879750, -0.932248358853599800, -0.932230266737699040, -0.932212172291222550, -0.932194075514215630, --0.932175976406723560, -0.932157874968791540, -0.932139771200464760, -0.932121665101788290, -0.932103556672807980, -0.932085445913568790, -0.932067332824116020, -0.932049217404494870, --0.932031099654750390, -0.932012979574928460, -0.931994857165074020, -0.931976732425232490, -0.931958605355449170, -0.931940475955769340, -0.931922344226238210, -0.931904210166901280, --0.931886073777803860, -0.931867935058991240, -0.931849794010508490, -0.931831650632401480, -0.931813504924715490, -0.931795356887495600, -0.931777206520787330, -0.931759053824636090, --0.931740898799086950, -0.931722741444185760, -0.931704581759977830, -0.931686419746508340, -0.931668255403822920, -0.931650088731966750, -0.931631919730985470, -0.931613748400924370, --0.931595574741828860, -0.931577398753744010, -0.931559220436716130, -0.931541039790790060, -0.931522856816011550, -0.931504671512425770, -0.931486483880078380, -0.931468293919014420, --0.931450101629280100, -0.931431907010920490, -0.931413710063981100, -0.931395510788507460, -0.931377309184544980, -0.931359105252139270, -0.931340898991335870, -0.931322690402180190, --0.931304479484717400, -0.931286266238993800, -0.931268050665054470, -0.931249832762945040, -0.931231612532711030, -0.931213389974397950, -0.931195165088051110, -0.931176937873716690, --0.931158708331439990, -0.931140476461266410, -0.931122242263241700, -0.931104005737411370, -0.931085766883821050, -0.931067525702516270, -0.931049282193542660, -0.931031036356945950, --0.931012788192771220, -0.930994537701064880, -0.930976284881872120, -0.930958029735238780, -0.930939772261210270, -0.930921512459832120, -0.930903250331150400, -0.930884985875210620, --0.930866719092058310, -0.930848449981739210, -0.930830178544299060, -0.930811904779783370, -0.930793628688238010, -0.930775350269708590, -0.930757069524240640, -0.930738786451879800, --0.930720501052672340, -0.930702213326663590, -0.930683923273899370, -0.930665630894425220, -0.930647336188287100, -0.930629039155530300, -0.930610739796201240, -0.930592438110345200, --0.930574134098008270, -0.930555827759235840, -0.930537519094073890, -0.930519208102568160, -0.930500894784764390, -0.930482579140708420, -0.930464261170445670, -0.930445940874022550, --0.930427618251484570, -0.930409293302877580, -0.930390966028247330, -0.930372636427639790, -0.930354304501100240, -0.930335970248675200, -0.930317633670410320, -0.930299294766351310, --0.930280953536544050, -0.930262609981034380, -0.930244264099868270, -0.930225915893091450, -0.930207565360749890, -0.930189212502889110, -0.930170857319555510, -0.930152499810794840, --0.930134139976652950, -0.930115777817175690, -0.930097413332408920, -0.930079046522398370, -0.930060677387190450, -0.930042305926830900, -0.930023932141365580, -0.930005556030840450, --0.929987177595301360, -0.929968796834794390, -0.929950413749365380, -0.929932028339060410, -0.929913640603925340, -0.929895250544005790, -0.929876858159348510, -0.929858463449999010, --0.929840066416003360, -0.929821667057407650, -0.929803265374257390, -0.929784861366599210, -0.929766455034478970, -0.929748046377942620, -0.929729635397036120, -0.929711222091805460, --0.929692806462296790, -0.929674388508556100, -0.929655968230629460, -0.929637545628562930, -0.929619120702402160, -0.929600693452193870, -0.929582263877983930, -0.929563831979818290, --0.929545397757743140, -0.929526961211804450, -0.929508522342048060, -0.929490081148520610, -0.929471637631267940, -0.929453191790336250, -0.929434743625771610, -0.929416293137620090, --0.929397840325927760, -0.929379385190740930, -0.929360927732105660, -0.929342467950067590, -0.929324005844673780, -0.929305541415969990, -0.929287074664002290, -0.929268605588816850, --0.929250134190459990, -0.929231660468977430, -0.929213184424416140, -0.929194706056821750, -0.929176225366240670, -0.929157742352718970, -0.929139257016302960, -0.929120769357038800, --0.929102279374972690, -0.929083787070150930, -0.929065292442619370, -0.929046795492424860, -0.929028296219613470, -0.929009794624231280, -0.928991290706324580, -0.928972784465939670, --0.928954275903122410, -0.928935765017919860, -0.928917251810377880, -0.928898736280542760, -0.928880218428460800, -0.928861698254178300, -0.928843175757741560, -0.928824650939196860, --0.928806123798590620, -0.928787594335968910, -0.928769062551378030, -0.928750528444864720, -0.928731992016475160, -0.928713453266255650, -0.928694912194252490, -0.928676368800511630, --0.928657823085080270, -0.928639275048004360, -0.928620724689330210, -0.928602172009104220, -0.928583617007372910, -0.928565059684182460, -0.928546500039579390, -0.928527938073610000, --0.928509373786320920, -0.928490807177758000, -0.928472238247968320, -0.928453666996998160, -0.928435093424893720, -0.928416517531701620, -0.928397939317467950, -0.928379358782239650, --0.928360775926063030, -0.928342190748984500, -0.928323603251050340, -0.928305013432307310, -0.928286421292801700, -0.928267826832580020, -0.928249230051688800, -0.928230630950174550, --0.928212029528083350, -0.928193425785462380, -0.928174819722357940, -0.928156211338816320, -0.928137600634884260, -0.928118987610608180, -0.928100372266034260, -0.928081754601209790, --0.928063134616180950, -0.928044512310994160, -0.928025887685696160, -0.928007260740333460, -0.927988631474952700, -0.927969999889600160, -0.927951365984322820, -0.927932729759166630, --0.927914091214178890, -0.927895450349406010, -0.927876807164894510, -0.927858161660690910, -0.927839513836841930, -0.927820863693393890, -0.927802211230394080, -0.927783556447888570, --0.927764899345924320, -0.927746239924547740, -0.927727578183805580, -0.927708914123744450, -0.927690247744411110, -0.927671579045852070, -0.927652908028114180, -0.927634234691243620, --0.927615559035287810, -0.927596881060293030, -0.927578200766306150, -0.927559518153373790, -0.927540833221542240, -0.927522145970858910, -0.927503456401370220, -0.927484764513123010, --0.927466070306163790, -0.927447373780539430, -0.927428674936296550, -0.927409973773482110, -0.927391270292142630, -0.927372564492325080, -0.927353856374075750, -0.927335145937442040, --0.927316433182470480, -0.927297718109207910, -0.927279000717700970, -0.927260281007996290, -0.927241558980141160, -0.927222834634182200, -0.927204107970166060, -0.927185378988139690, --0.927166647688149940, -0.927147914070243550, -0.927129178134467270, -0.927110439880868160, -0.927091699309492870, -0.927072956420388120, -0.927054211213601210, -0.927035463689178770, --0.927016713847167660, -0.926997961687614840, -0.926979207210567040, -0.926960450416070890, -0.926941691304174030, -0.926922929874922860, -0.926904166128364460, -0.926885400064545560, --0.926866631683513240, -0.926847860985314240, -0.926829087969995640, -0.926810312637604270, -0.926791534988186890, -0.926772755021790910, -0.926753972738463050, -0.926735188138250400, --0.926716401221199580, -0.926697611987357890, -0.926678820436771740, -0.926660026569488980, -0.926641230385556120, -0.926622431885020140, -0.926603631067928090, -0.926584827934326950, --0.926566022484263780, -0.926547214717785560, -0.926528404634939350, -0.926509592235771670, -0.926490777520330380, -0.926471960488662210, -0.926453141140814120, -0.926434319476833190, --0.926415495496766380, -0.926396669200660550, -0.926377840588563430, -0.926359009660521650, -0.926340176416582390, -0.926321340856792630, -0.926302502981199540, -0.926283662789850190, --0.926264820282791670, -0.926245975460071150, -0.926227128321735590, -0.926208278867831970, -0.926189427098408010, -0.926170573013510470, -0.926151716613186400, -0.926132857897483120, --0.926113996866447350, -0.926095133520126960, -0.926076267858568670, -0.926057399881819790, -0.926038529589927270, -0.926019656982938530, -0.926000782060900640, -0.925981904823860780, --0.925963025271866140, -0.925944143404964000, -0.925925259223201120, -0.925906372726625460, -0.925887483915283860, -0.925868592789223510, -0.925849699348491710, -0.925830803593135630, --0.925811905523202250, -0.925793005138739410, -0.925774102439794080, -0.925755197426413550, -0.925736290098645000, -0.925717380456535620, -0.925698468500132820, -0.925679554229483890, --0.925660637644636130, -0.925641718745636390, -0.925622797532532630, -0.925603874005371920, -0.925584948164201560, -0.925566020009068850, -0.925547089540021070, -0.925528156757105200, --0.925509221660369310, -0.925490284249860240, -0.925471344525625630, -0.925452402487712540, -0.925433458136168510, -0.925414511471040810, -0.925395562492376870, -0.925376611200223960, --0.925357657594629180, -0.925338701675640700, -0.925319743443305360, -0.925300782897670700, -0.925281820038784120, -0.925262854866692910, -0.925243887381444250, -0.925224917583086230, --0.925205945471666010, -0.925186971047230800, -0.925167994309828210, -0.925149015259505550, -0.925130033896310430, -0.925111050220290280, -0.925092064231492370, -0.925073075929964350, --0.925054085315753390, -0.925035092388907470, -0.925016097149473860, -0.924997099597499980, -0.924978099733033350, -0.924959097556121160, -0.924940093066811580, -0.924921086265151680, --0.924902077151189110, -0.924883065724971360, -0.924864051986545980, -0.924845035935960460, -0.924826017573262330, -0.924806996898499100, -0.924787973911718410, -0.924768948612967550, --0.924749921002294470, -0.924730891079746710, -0.924711858845371770, -0.924692824299217060, -0.924673787441330330, -0.924654748271758860, -0.924635706790550850, -0.924616662997753470, --0.924597616893414460, -0.924578568477581460, -0.924559517750302100, -0.924540464711623880, -0.924521409361594440, -0.924502351700261520, -0.924483291727672410, -0.924464229443875410, --0.924445164848917810, -0.924426097942847250, -0.924407028725711570, -0.924387957197558170, -0.924368883358434700, -0.924349807208389220, -0.924330728747469240, -0.924311647975722520, --0.924292564893196670, -0.924273479499939320, -0.924254391795998330, -0.924235301781421440, -0.924216209456256150, -0.924197114820550110, -0.924178017874351500, -0.924158918617707940, --0.924139817050667060, -0.924120713173276710, -0.924101606985584520, -0.924082498487637900, -0.924063387679485480, -0.924044274561174550, -0.924025159132752960, -0.924006041394268450, --0.923986921345768760, -0.923967798987301860, -0.923948674318915470, -0.923929547340657350, -0.923910418052575340, -0.923891286454717080, -0.923872152547130840, -0.923853016329864160, --0.923833877802965000, -0.923814736966481200, -0.923795593820460170, -0.923776448364950430, -0.923757300599999720, -0.923738150525655670, -0.923718998141966230, -0.923699843448979370, --0.923680686446742840, -0.923661527135304580, -0.923642365514712460, -0.923623201585014540, -0.923604035346258230, -0.923584866798492170, -0.923565695941763960, -0.923546522776121480, --0.923527347301612680, -0.923508169518285630, -0.923488989426187620, -0.923469807025367630, -0.923450622315873050, -0.923431435297751960, -0.923412245971052310, -0.923393054335821970, --0.923373860392109000, -0.923354664139961480, -0.923335465579427140, -0.923316264710553950, -0.923297061533390310, -0.923277856047984070, -0.923258648254383200, -0.923239438152635760, --0.923220225742789610, -0.923201011024892600, -0.923181793998993470, -0.923162574665139850, -0.923143353023379690, -0.923124129073761180, -0.923104902816332400, -0.923085674251141410, --0.923066443378236070, -0.923047210197664780, -0.923027974709475060, -0.923008736913715770, -0.922989496810434520, -0.922970254399679720, -0.922951009681499120, -0.922931762655941120, --0.922912513323053240, -0.922893261682884550, -0.922874007735482670, -0.922854751480895690, -0.922835492919171880, -0.922816232050359340, -0.922796968874506240, -0.922777703391660760, --0.922758435601870990, -0.922739165505185090, -0.922719893101650920, -0.922700618391317450, -0.922681341374232300, -0.922662062050443880, -0.922642780420000360, -0.922623496482949500, --0.922604210239340250, -0.922584921689220460, -0.922565630832638320, -0.922546337669642110, -0.922527042200280150, -0.922507744424600480, -0.922488444342651540, -0.922469141954481490, --0.922449837260138520, -0.922430530259670590, -0.922411220953126780, -0.922391909340554820, -0.922372595422003120, -0.922353279197519970, -0.922333960667153560, -0.922314639830951970, --0.922295316688964140, -0.922275991241237940, -0.922256663487821760, -0.922237333428764020, -0.922218001064112890, -0.922198666393916680, -0.922179329418223890, -0.922159990137082830, --0.922140648550541340, -0.922121304658648610, -0.922101958461452600, -0.922082609959001710, -0.922063259151344350, -0.922043906038528820, -0.922024550620603180, -0.922005192897616510, --0.921985832869616770, -0.921966470536652480, -0.921947105898772050, -0.921927738956023870, -0.921908369708456350, -0.921888998156117910, -0.921869624299056940, -0.921850248137321530, --0.921830869670960950, -0.921811488900023070, -0.921792105824556620, -0.921772720444609780, -0.921753332760231190, -0.921733942771468920, -0.921714550478372140, -0.921695155880988940, --0.921675758979367930, -0.921656359773557420, -0.921636958263606140, -0.921617554449562390, -0.921598148331474690, -0.921578739909391760, -0.921559329183361920, -0.921539916153433340, --0.921520500819655420, -0.921501083182076130, -0.921481663240744210, -0.921462240995708170, -0.921442816447016200, -0.921423389594717480, -0.921403960438860190, -0.921384528979493190, --0.921365095216664760, -0.921345659150423550, -0.921326220780818270, -0.921306780107897460, -0.921287337131709630, -0.921267891852303510, -0.921248444269727180, -0.921228994384030280, --0.921209542195260740, -0.921190087703467440, -0.921170630908698880, -0.921151171811003810, -0.921131710410430400, -0.921112246707028070, -0.921092780700845100, -0.921073312391930240, --0.921053841780332010, -0.921034368866099240, -0.921014893649280570, -0.920995416129924640, -0.920975936308080170, -0.920956454183795570, -0.920936969757120030, -0.920917483028102170, --0.920897993996790620, -0.920878502663234010, -0.920859009027481190, -0.920839513089580560, -0.920820014849581430, -0.920800514307532290, -0.920781011463481790, -0.920761506317478880, --0.920741998869572090, -0.920722489119810360, -0.920702977068242450, -0.920683462714916970, -0.920663946059882670, -0.920644427103188720, -0.920624905844883660, -0.920605382285016430, --0.920585856423635770, -0.920566328260790430, -0.920546797796528820, -0.920527265030900650, -0.920507729963954360, -0.920488192595738770, -0.920468652926302640, -0.920449110955694820, --0.920429566683964250, -0.920410020111159800, -0.920390471237330310, -0.920370920062524630, -0.920351366586791290, -0.920331810810179900, -0.920312252732738980, -0.920292692354517490, --0.920273129675564180, -0.920253564695927670, -0.920233997415657700, -0.920214427834802670, -0.920194855953411550, -0.920175281771533400, -0.920155705289216860, -0.920136126506511220, --0.920116545423465220, -0.920096962040127810, -0.920077376356548070, -0.920057788372774520, -0.920038198088856780, -0.920018605504843600, -0.919999010620783930, -0.919979413436726730, --0.919959813952720970, -0.919940212168815390, -0.919920608085059490, -0.919901001701502240, -0.919881393018192380, -0.919861782035178990, -0.919842168752511240, -0.919822553170238090, --0.919802935288408510, -0.919783315107071560, -0.919763692626276000, -0.919744067846071540, -0.919724440766506950, -0.919704811387631270, -0.919685179709493590, -0.919665545732142880, --0.919645909455627960, -0.919626270879998600, -0.919606630005303630, -0.919586986831592120, -0.919567341358913050, -0.919547693587315700, -0.919528043516849030, -0.919508391147562330, --0.919488736479504580, -0.919469079512724720, -0.919449420247272390, -0.919429758683196650, -0.919410094820546480, -0.919390428659371040, -0.919370760199719530, -0.919351089441640790, --0.919331416385184560, -0.919311741030399920, -0.919292063377335930, -0.919272383426041780, -0.919252701176566660, -0.919233016628959730, -0.919213329783270310, -0.919193640639547560, --0.919173949197840680, -0.919154255458198620, -0.919134559420671240, -0.919114861085307490, -0.919095160452156560, -0.919075457521267740, -0.919055752292689990, -0.919036044766473160, --0.919016334942666100, -0.918996622821318330, -0.918976908402479030, -0.918957191686197380, -0.918937472672522790, -0.918917751361504550, -0.918898027753191850, -0.918878301847634190, --0.918858573644880330, -0.918838843144980430, -0.918819110347983470, -0.918799375253938620, -0.918779637862895400, -0.918759898174903110, -0.918740156190010590, -0.918720411908268140, --0.918700665329724720, -0.918680916454429510, -0.918661165282432140, -0.918641411813781780, -0.918621656048527860, -0.918601897986719870, -0.918582137628407120, -0.918562374973638570, --0.918542610022464620, -0.918522842774934010, -0.918503073231096370, -0.918483301391000980, -0.918463527254697380, -0.918443750822234620, -0.918423972093662780, -0.918404191069031040, --0.918384407748388810, -0.918364622131785600, -0.918344834219270820, -0.918325044010893880, -0.918305251506704390, -0.918285456706751770, -0.918265659611085190, -0.918245860219754850, --0.918226058532809700, -0.918206254550299580, -0.918186448272273690, -0.918166639698781760, -0.918146828829872860, -0.918127015665597180, -0.918107200206004110, -0.918087382451142850, --0.918067562401063240, -0.918047740055814800, -0.918027915415446930, -0.918008088480009250, -0.917988259249551300, -0.917968427724122790, -0.917948593903772810, -0.917928757788551760, --0.917908919378508830, -0.917889078673693510, -0.917869235674155570, -0.917849390379944170, -0.917829542791109620, -0.917809692907701200, -0.917789840729768550, -0.917769986257361390, --0.917750129490529140, -0.917730270429321650, -0.917710409073788420, -0.917690545423979210, -0.917670679479943740, -0.917650811241731090, -0.917630940709391770, -0.917611067882975080, --0.917591192762530760, -0.917571315348108430, -0.917551435639757940, -0.917531553637528360, -0.917511669341470330, -0.917491782751633010, -0.917471893868066380, -0.917452002690819950, --0.917432109219943560, -0.917412213455486850, -0.917392315397499550, -0.917372415046031510, -0.917352512401132140, -0.917332607462851830, -0.917312700231239900, -0.917292790706346280, --0.917272878888220730, -0.917252964776912980, -0.917233048372472440, -0.917213129674949610, -0.917193208684393910, -0.917173285400855300, -0.917153359824383400, -0.917133431955028170, --0.917113501792839240, -0.917093569337866680, -0.917073634590160110, -0.917053697549769180, -0.917033758216744270, -0.917013816591135010, -0.916993872672991260, -0.916973926462362750, --0.916953977959299450, -0.916934027163850860, -0.916914074076067620, -0.916894118695999130, -0.916874161023695340, -0.916854201059206120, -0.916834238802581410, -0.916814274253871190, --0.916794307413125180, -0.916774338280393450, -0.916754366855725870, -0.916734393139172040, -0.916714417130782500, -0.916694438830606970, -0.916674458238695310, -0.916654475355097590, --0.916634490179863310, -0.916614502713043120, -0.916594512954686640, -0.916574520904843930, -0.916554526563564950, -0.916534529930899570, -0.916514531006897950, -0.916494529791609950, --0.916474526285085630, -0.916454520487374970, -0.916434512398527690, -0.916414502018594530, -0.916394489347625020, -0.916374474385669320, -0.916354457132777520, -0.916334437588999130, --0.916314415754384990, -0.916294391628984850, -0.916274365212848770, -0.916254336506026720, -0.916234305508568880, -0.916214272220525210, -0.916194236641945880, -0.916174198772880980, --0.916154158613380560, -0.916134116163494380, -0.916114071423273280, -0.916094024392766990, -0.916073975072025700, -0.916053923461099480, -0.916033869560038290, -0.916013813368892200, --0.915993754887711950, -0.915973694116547280, -0.915953631055448360, -0.915933565704465380, -0.915913498063648520, -0.915893428133047860, -0.915873355912713680, -0.915853281402696060, --0.915833204603044850, -0.915813125513811110, -0.915793044135044480, -0.915772960466795240, -0.915752874509113580, -0.915732786262049680, -0.915712695725653610, -0.915692602899976120, --0.915672507785067040, -0.915652410380976670, -0.915632310687755410, -0.915612208705453230, -0.915592104434120650, -0.915571997873807720, -0.915551889024564860, -0.915531777886441910, --0.915511664459489840, -0.915491548743758710, -0.915471430739298600, -0.915451310446159900, -0.915431187864393040, -0.915411062994047730, -0.915390935835175170, -0.915370806387825310, --0.915350674652048340, -0.915330540627894760, -0.915310404315414770, -0.915290265714658880, -0.915270124825677270, -0.915249981648520340, -0.915229836183238390, -0.915209688429881600, --0.915189538388500810, -0.915169386059146330, -0.915149231441868330, -0.915129074536717210, -0.915108915343743060, -0.915088753862997040, -0.915068590094529120, -0.915048424038389600, --0.915028255694629200, -0.915008085063298000, -0.914987912144446750, -0.914967736938125610, -0.914947559444385110, -0.914927379663275750, -0.914907197594847620, -0.914887013239151890, --0.914866826596238520, -0.914846637666158150, -0.914826446448961160, -0.914806252944698080, -0.914786057153418990, -0.914765859075175050, -0.914745658710016560, -0.914725456057993820, --0.914705251119157570, -0.914685043893558090, -0.914664834381246130, -0.914644622582271970, -0.914624408496686250, -0.914604192124539140, -0.914583973465882050, -0.914563752520764830, --0.914543529289238430, -0.914523303771353050, -0.914503075967159520, -0.914482845876707810, -0.914462613500049430, -0.914442378837234560, -0.914422141888313610, -0.914401902653337430, --0.914381661132356420, -0.914361417325421310, -0.914341171232582630, -0.914320922853891100, -0.914300672189396810, -0.914280419239151150, -0.914260164003204530, -0.914239906481607580, --0.914219646674410690, -0.914199384581664830, -0.914179120203420070, -0.914158853539727810, -0.914138584590638570, -0.914118313356202750, -0.914098039836471200, -0.914077764031494540, --0.914057485941323410, -0.914037205566008650, -0.914016922905600880, -0.913996637960150740, -0.913976350729708730, -0.913956061214326150, -0.913935769414053410, -0.913915475328941240, --0.913895178959040380, -0.913874880304401230, -0.913854579365075190, -0.913834276141112790, -0.913813970632564640, -0.913793662839481600, -0.913773352761914400, -0.913753040399913790, --0.913732725753530590, -0.913712408822815680, -0.913692089607819560, -0.913671768108592960, -0.913651444325187300, -0.913631118257653090, -0.913610789906040940, -0.913590459270401940, --0.913570126350786720, -0.913549791147245880, -0.913529453659830850, -0.913509113888592240, -0.913488771833580790, -0.913468427494847470, -0.913448080872443110, -0.913427731966418470, --0.913407380776824480, -0.913387027303712130, -0.913366671547131800, -0.913346313507135240, -0.913325953183772740, -0.913305590577095480, -0.913285225687154200, -0.913264858513999860, --0.913244489057682960, -0.913224117318255260, -0.913203743295767260, -0.913183366990269920, -0.913162988401814200, -0.913142607530450960, -0.913122224376231140, -0.913101838939205820, --0.913081451219425850, -0.913061061216941970, -0.913040668931805800, -0.913020274364067850, -0.912999877513779310, -0.912979478380991140, -0.912959076965754180, -0.912938673268119170, --0.912918267288137850, -0.912897859025860850, -0.912877448481339230, -0.912857035654623950, -0.912836620545766090, -0.912816203154816710, -0.912795783481826770, -0.912775361526847460, --0.912754937289929620, -0.912734510771124220, -0.912714081970482760, -0.912693650888056210, -0.912673217523895520, -0.912652781878051770, -0.912632343950575690, -0.912611903741519130, --0.912591461250932710, -0.912571016478867740, -0.912550569425375270, -0.912530120090506270, -0.912509668474312030, -0.912489214576843620, -0.912468758398152110, -0.912448299938288800, --0.912427839197304300, -0.912407376175250700, -0.912386910872178490, -0.912366443288139100, -0.912345973423183580, -0.912325501277363120, -0.912305026850728560, -0.912284550143331760, --0.912264071155223570, -0.912243589886455260, -0.912223106337078040, -0.912202620507142960, -0.912182132396701320, -0.912161642005804410, -0.912141149334503300, -0.912120654382849060, --0.912100157150893430, -0.912079657638687480, -0.912059155846282390, -0.912038651773729450, -0.912018145421079840, -0.911997636788384410, -0.911977125875695350, -0.911956612683063490, --0.911936097210540030, -0.911915579458176470, -0.911895059426023780, -0.911874537114133580, -0.911854012522556930, -0.911833485651345370, -0.911812956500549610, -0.911792425070221960, --0.911771891360413140, -0.911751355371174580, -0.911730817102557660, -0.911710276554613670, -0.911689733727393700, -0.911669188620949700, -0.911648641235332850, -0.911628091570594210, --0.911607539626785420, -0.911586985403957770, -0.911566428902162770, -0.911545870121451610, -0.911525309061875790, -0.911504745723486610, -0.911484180106335250, -0.911463612210473890, --0.911443042035953390, -0.911422469582825360, -0.911401894851141090, -0.911381317840951780, -0.911360738552309590, -0.911340156985265380, -0.911319573139870890, -0.911298987016177510, --0.911278398614236540, -0.911257807934099720, -0.911237214975818330, -0.911216619739443790, -0.911196022225027820, -0.911175422432621400, -0.911154820362276800, -0.911134216014045210, --0.911113609387977920, -0.911093000484126670, -0.911072389302542970, -0.911051775843277900, -0.911031160106383740, -0.911010542091911790, -0.910989921799913340, -0.910969299230440120, --0.910948674383543770, -0.910928047259275560, -0.910907417857687360, -0.910886786178830570, -0.910866152222756460, -0.910845515989517350, -0.910824877479164410, -0.910804236691749260, --0.910783593627323530, -0.910762948285938840, -0.910742300667646390, -0.910721650772498670, -0.910700998600546650, -0.910680344151842290, -0.910659687426436990, -0.910639028424382380, --0.910618367145730300, -0.910597703590532380, -0.910577037758840020, -0.910556369650704860, -0.910535699266179050, -0.910515026605314030, -0.910494351668161510, -0.910473674454773010, --0.910452994965200380, -0.910432313199494800, -0.910411629157708900, -0.910390942839893860, -0.910370254246101520, -0.910349563376383510, -0.910328870230791680, -0.910308174809377530, --0.910287477112193040, -0.910266777139289830, -0.910246074890719740, -0.910225370366534060, -0.910204663566785310, -0.910183954491524890, -0.910163243140804550, -0.910142529514676110, --0.910121813613191000, -0.910101095436401720, -0.910080374984359790, -0.910059652257116820, -0.910038927254724790, -0.910018199977235430, -0.909997470424700470, -0.909976738597171870, --0.909956004494701490, -0.909935268117341050, -0.909914529465142170, -0.909893788538157170, -0.909873045336437870, -0.909852299860035800, -0.909831552109003130, -0.909810802083391490, --0.909790049783252510, -0.909769295208638700, -0.909748538359601680, -0.909727779236193410, -0.909707017838465640, -0.909686254166470310, -0.909665488220259280, -0.909644719999884610, --0.909623949505398150, -0.909603176736851430, -0.909582401694297160, -0.909561624377786760, -0.909540844787372400, -0.909520062923105940, -0.909499278785039330, -0.909478492373224200, --0.909457703687713060, -0.909436912728557760, -0.909416119495810140, -0.909395323989522280, -0.909374526209746130, -0.909353726156533540, -0.909332923829936690, -0.909312119230007540, --0.909291312356797720, -0.909270503210360070, -0.909249691790746110, -0.909228878098007900, -0.909208062132197400, -0.909187243893366910, -0.909166423381567830, -0.909145600596853120, --0.909124775539274400, -0.909103948208883740, -0.909083118605733210, -0.909062286729874880, -0.909041452581360820, -0.909020616160243100, -0.908999777466573900, -0.908978936500405290, --0.908958093261788890, -0.908937247750777670, -0.908916399967423350, -0.908895549911777900, -0.908874697583893720, -0.908853842983822440, -0.908832986111616780, -0.908812126967328720, --0.908791265551010420, -0.908770401862713850, -0.908749535902491300, -0.908728667670394950, -0.908707797166476980, -0.908686924390789460, -0.908666049343384570, -0.908645172024314270, --0.908624292433631300, -0.908603410571387720, -0.908582526437635600, -0.908561640032427120, -0.908540751355814580, -0.908519860407849710, -0.908498967188585690, -0.908478071698074150, --0.908457173936367490, -0.908436273903517890, -0.908415371599577530, -0.908394467024598810, -0.908373560178633910, -0.908352651061735130, -0.908331739673954310, -0.908310826015344520, --0.908289910085957720, -0.908268991885846090, -0.908248071415061920, -0.908227148673657720, -0.908206223661685130, -0.908185296379197430, -0.908164366826246460, -0.908143435002884640, --0.908122500909164240, -0.908101564545137460, -0.908080625910856920, -0.908059685006374680, -0.908038741831743380, -0.908017796387014740, -0.907996848672241950, -0.907975898687477190, --0.907954946432772530, -0.907933991908180580, -0.907913035113753650, -0.907892076049543690, -0.907871114715604000, -0.907850151111986530, -0.907829185238743560, -0.907808217095927740, --0.907787246683591340, -0.907766274001786890, -0.907745299050566670, -0.907724321829983190, -0.907703342340088980, -0.907682360580935990, -0.907661376552577500, -0.907640390255065600, --0.907619401688452680, -0.907598410852791250, -0.907577417748133390, -0.907556422374532490, -0.907535424732040410, -0.907514424820709760, -0.907493422640593180, -0.907472418191742960, --0.907451411474211600, -0.907430402488051850, -0.907409391233316100, -0.907388377710056760, -0.907367361918326120, -0.907346343858177580, -0.907325323529663110, -0.907304300932835210, --0.907283276067746720, -0.907262248934449960, -0.907241219532997300, -0.907220187863441830, -0.907199153925835940, -0.907178117720232160, -0.907157079246683210, -0.907136038505241380, --0.907114995495959530, -0.907093950218890170, -0.907072902674086020, -0.907051852861599170, -0.907030800781483020, -0.907009746433789950, -0.906988689818572500, -0.906967630935883280, --0.906946569785775040, -0.906925506368299940, -0.906904440683511500, -0.906883372731461910, -0.906862302512204010, -0.906841230025790200, -0.906820155272273440, -0.906799078251706250, --0.906777998964141350, -0.906756917409631380, -0.906735833588228850, -0.906714747499987040, -0.906693659144958470, -0.906672568523195670, -0.906651475634751460, -0.906630380479678480, --0.906609283058029240, -0.906588183369857250, -0.906567081415214690, -0.906545977194154530, -0.906524870706729380, -0.906503761952991980, -0.906482650932995290, -0.906461537646791830, --0.906440422094434650, -0.906419304275976390, -0.906398184191469450, -0.906377061840967560, -0.906355937224522900, -0.906334810342188430, -0.906313681194016900, -0.906292549780060800, --0.906271416100373650, -0.906250280155008080, -0.906229141944016710, -0.906208001467452510, -0.906186858725368420, -0.906165713717817070, -0.906144566444851420, -0.906123416906524430, --0.906102265102888830, -0.906081111033997240, -0.906059954699903190, -0.906038796100659290, -0.906017635236318400, -0.905996472106933460, -0.905975306712557330, -0.905954139053242510, --0.905932969129042750, -0.905911796940010560, -0.905890622486198890, -0.905869445767660600, -0.905848266784448740, -0.905827085536616280, -0.905805902024216070, -0.905784716247301060, --0.905763528205923870, -0.905742337900138250, -0.905721145329996810, -0.905699950495552520, -0.905678753396858330, -0.905657554033967300, -0.905636352406931970, -0.905615148515806160, --0.905593942360642390, -0.905572733941493850, -0.905551523258413480, -0.905530310311454260, -0.905509095100669350, -0.905487877626111600, -0.905466657887834200, -0.905445435885889770, --0.905424211620332150, -0.905402985091213970, -0.905381756298588410, -0.905360525242508320, -0.905339291923027090, -0.905318056340197130, -0.905296818494072400, -0.905275578384705630, --0.905254336012150000, -0.905233091376458470, -0.905211844477684210, -0.905190595315880310, -0.905169343891099930, -0.905148090203396260, -0.905126834252822250, -0.905105576039430870, --0.905084315563275950, -0.905063052824410130, -0.905041787822886800, -0.905020520558758920, -0.904999251032079450, -0.904977979242902130, -0.904956705191279910, -0.904935428877265860, --0.904914150300913380, -0.904892869462275430, -0.904871586361405300, -0.904850300998356170, -0.904829013373181330, -0.904807723485933970, -0.904786431336666920, -0.904765136925434250, --0.904743840252288600, -0.904722541317283470, -0.904701240120471930, -0.904679936661906830, -0.904658630941642340, -0.904637322959731320, -0.904616012716226940, -0.904594700211182600, --0.904573385444651380, -0.904552068416686780, -0.904530749127341990, -0.904509427576670300, -0.904488103764725100, -0.904466777691559250, -0.904445449357226820, -0.904424118761780750, --0.904402785905274450, -0.904381450787761110, -0.904360113409294230, -0.904338773769926550, -0.904317431869712470, -0.904296087708704730, -0.904274741286956730, -0.904253392604521980, --0.904232041661453660, -0.904210688457805280, -0.904189332993630130, -0.904167975268981740, -0.904146615283912940, -0.904125253038478020, -0.904103888532729940, -0.904082521766722210, --0.904061152740508130, -0.904039781454141210, -0.904018407907674400, -0.903997032101162000, -0.903975654034656960, -0.903954273708212800, -0.903932891121883020, -0.903911506275720920, --0.903890119169780130, -0.903868729804114030, -0.903847338178776050, -0.903825944293819790, -0.903804548149298230, -0.903783149745265750, -0.903761749081775310, -0.903740346158880550, --0.903718940976634970, -0.903697533535091630, -0.903676123834304730, -0.903654711874327670, -0.903633297655213720, -0.903611881177016630, -0.903590462439789800, -0.903569041443586740, --0.903547618188461190, -0.903526192674466540, -0.903504764901656430, -0.903483334870083920, -0.903461902579803520, -0.903440468030868420, -0.903419031223332110, -0.903397592157248240, --0.903376150832669980, -0.903354707249651720, -0.903333261408246770, -0.903311813308508630, -0.903290362950490920, -0.903268910334247280, -0.903247455459831430, -0.903225998327296890, --0.903204538936697390, -0.903183077288086560, -0.903161613381517570, -0.903140147217045050, -0.903118678794722070, -0.903097208114602480, -0.903075735176739780, -0.903054259981187820, --0.903032782527999680, -0.903011302817230080, -0.902989820848932200, -0.902968336623159900, -0.902946850139966560, -0.902925361399406160, -0.902903870401532420, -0.902882377146398960, --0.902860881634059530, -0.902839383864567520, -0.902817883837977450, -0.902796381554342720, -0.902774877013716950, -0.902753370216154090, -0.902731861161707670, -0.902710349850431300, --0.902688836282379500, -0.902667320457605560, -0.902645802376163210, -0.902624282038106520, -0.902602759443489000, -0.902581234592364610, -0.902559707484787200, -0.902538178120810500, --0.902516646500487910, -0.902495112623874050, -0.902473576491022560, -0.902452038101987040, -0.902430497456821470, -0.902408954555579570, -0.902387409398314970, -0.902365861985082170, --0.902344312315934820, -0.902322760390926630, -0.902301206210111560, -0.902279649773543470, -0.902258091081276190, -0.902236530133363690, -0.902214966929859920, -0.902193401470818720, --0.902171833756293620, -0.902150263786339330, -0.902128691561009390, -0.902107117080357730, -0.902085540344438330, -0.902063961353304580, -0.902042380107011430, -0.902020796605612190, --0.901999210849161010, -0.901977622837711880, -0.901956032571318620, -0.901934440050035310, -0.901912845273915910, -0.901891248243014370, -0.901869648957384640, -0.901848047417080580, --0.901826443622156580, -0.901804837572666610, -0.901783229268664500, -0.901761618710204330, -0.901740005897340160, -0.901718390830125500, -0.901696773508615320, -0.901675153932863130, --0.901653532102923090, -0.901631908018849290, -0.901610281680695680, -0.901588653088516320, -0.901567022242365400, -0.901545389142296870, -0.901523753788364470, -0.901502116180623150, --0.901480476319126420, -0.901458834203928580, -0.901437189835083700, -0.901415543212645720, -0.901393894336668610, -0.901372243207207100, -0.901350589824314930, -0.901328934188046380, --0.901307276298455420, -0.901285616155596330, -0.901263953759523170, -0.901242289110290140, -0.901220622207951410, -0.901198953052560700, -0.901177281644172990, -0.901155607982842110, --0.901133932068622250, -0.901112253901567460, -0.901090573481732050, -0.901068890809169850, -0.901047205883935830, -0.901025518706083720, -0.901003829275667910, -0.900982137592742480, --0.900960443657361720, -0.900938747469579800, -0.900917049029451130, -0.900895348337029780, -0.900873645392370030, -0.900851940195525720, -0.900830232746552050, -0.900808523045502740, --0.900786811092432190, -0.900765096887394590, -0.900743380430443770, -0.900721661721635040, -0.900699940761022110, -0.900678217548659290, -0.900656492084600860, -0.900634764368901330, --0.900613034401614780, -0.900591302182795710, -0.900569567712498410, -0.900547830990777070, -0.900526092017685850, -0.900504350793279840, -0.900482607317612870, -0.900460861590739460, --0.900439113612713780, -0.900417363383590460, -0.900395610903423240, -0.900373856172267390, -0.900352099190176890, -0.900330339957206240, -0.900308578473409620, -0.900286814738841650, --0.900265048753556620, -0.900243280517608930, -0.900221510031053000, -0.900199737293942980, -0.900177962306334070, -0.900156185068280100, -0.900134405579835820, -0.900112623841055390, --0.900090839851993450, -0.900069053612704060, -0.900047265123242400, -0.900025474383662540, -0.900003681394019090, -0.899981886154366360, -0.899960088664758960, -0.899938288925251300, --0.899916486935897870, -0.899894682696753320, -0.899872876207871600, -0.899851067469308210, -0.899829256481117000, -0.899807443243352710, -0.899785627756069850, -0.899763810019322820, --0.899741990033166020, -0.899720167797654510, -0.899698343312842600, -0.899676516578784890, -0.899654687595535800, -0.899632856363150050, -0.899611022881682150, -0.899589187151186740, --0.899567349171718320, -0.899545508943331520, -0.899523666466080620, -0.899501821740020800, -0.899479974765206580, -0.899458125541692350, -0.899436274069532750, -0.899414420348782160, --0.899392564379495880, -0.899370706161728210, -0.899348845695533860, -0.899326982980967250, -0.899305118018083220, -0.899283250806936390, -0.899261381347581490, -0.899239509640073150, --0.899217635684465890, -0.899195759480814320, -0.899173881029173620, -0.899152000329598300, -0.899130117382142990, -0.899108232186862310, -0.899086344743811110, -0.899064455053043550, --0.899042563114615390, -0.899020668928580790, -0.898998772494994490, -0.898976873813911230, -0.898954972885385840, -0.898933069709472950, -0.898911164286227420, -0.898889256615703960, --0.898867346697957090, -0.898845434533042110, -0.898823520121013520, -0.898801603461926280, -0.898779684555834900, -0.898757763402794340, -0.898735840002859000, -0.898713914356084500, --0.898691986462525130, -0.898670056322235840, -0.898648123935271380, -0.898626189301686700, -0.898604252421536410, -0.898582313294875590, -0.898560371921758970, -0.898538428302240950, --0.898516482436377270, -0.898494534324222440, -0.898472583965831300, -0.898450631361258690, -0.898428676510559470, -0.898406719413788140, -0.898384760071000430, -0.898362798482250870, --0.898340834647594180, -0.898318868567085540, -0.898296900240779680, -0.898274929668731570, -0.898252956850996150, -0.898230981787628280, -0.898209004478683020, -0.898187024924214870, --0.898165043124279470, -0.898143059078931550, -0.898121072788225950, -0.898099084252217630, -0.898077093470961320, -0.898055100444512530, -0.898033105172926120, -0.898011107656256800, --0.897989107894559770, -0.897967105887890080, -0.897945101636302480, -0.897923095139852250, -0.897901086398594120, -0.897879075412583380, -0.897857062181874550, -0.897835046706523480, --0.897813028986584770, -0.897791009022113510, -0.897768986813164640, -0.897746962359793450, -0.897724935662054360, -0.897702906720003300, -0.897680875533695020, -0.897658842103184580, --0.897636806428526950, -0.897614768509777390, -0.897592728346990890, -0.897570685940222600, -0.897548641289527490, -0.897526594394960520, -0.897504545256577300, -0.897482493874432800, --0.897460440248582070, -0.897438384379080300, -0.897416326265982440, -0.897394265909343460, -0.897372203309219190, -0.897350138465664470, -0.897328071378734270, -0.897306002048483990, --0.897283930474968680, -0.897261856658243540, -0.897239780598363850, -0.897217702295384560, -0.897195621749360740, -0.897173538960348130, -0.897151453928401790, -0.897129366653576790, --0.897107277135928300, -0.897085185375511740, -0.897063091372381720, -0.897040995126594410, -0.897018896638204670, -0.896996795907267550, -0.896974692933838580, -0.896952587717972820, --0.896930480259725550, -0.896908370559152070, -0.896886258616307770, -0.896864144431247730, -0.896842028004027010, -0.896819909334701570, -0.896797788423326360, -0.896775665269956670, --0.896753539874647790, -0.896731412237454670, -0.896709282358433500, -0.896687150237639120, -0.896665015875126810, -0.896642879270951880, -0.896620740425169930, -0.896598599337836030, --0.896576456009005600, -0.896554310438734130, -0.896532162627076800, -0.896510012574088690, -0.896487860279825970, -0.896465705744343590, -0.896443548967696850, -0.896421389949941360, --0.896399228691132420, -0.896377065191324870, -0.896354899450575230, -0.896332731468938220, -0.896310561246469350, -0.896288388783224140, -0.896266214079257990, -0.896244037134626300, --0.896221857949384470, -0.896199676523588010, -0.896177492857291980, -0.896155306950552570, -0.896133118803424940, -0.896110928415964510, -0.896088735788226680, -0.896066540920267160, --0.896044343812140820, -0.896022144463903940, -0.895999942875611800, -0.895977739047319810, -0.895955532979083370, -0.895933324670958210, -0.895911114122999620, -0.895888901335263330, --0.895866686307804750, -0.895844469040679160, -0.895822249533942740, -0.895800027787650550, -0.895777803801858450, -0.895755577576621830, -0.895733349111996200, -0.895711118408036850, --0.895688885464800080, -0.895666650282341160, -0.895644412860715500, -0.895622173199978940, -0.895599931300186890, -0.895577687161394960, -0.895555440783658900, -0.895533192167034200, --0.895510941311576490, -0.895488688217341070, -0.895466432884384320, -0.895444175312761440, -0.895421915502528140, -0.895399653453740060, -0.895377389166452490, -0.895355122640721810, --0.895332853876603330, -0.895310582874152770, -0.895288309633425650, -0.895266034154477810, -0.895243756437364870, -0.895221476482142560, -0.895199194288866520, -0.895176909857592570, --0.895154623188375910, -0.895132334281273030, -0.895110043136339350, -0.895087749753630590, -0.895065454133202490, -0.895043156275110660, -0.895020856179410630, -0.894998553846158780, --0.894976249275410640, -0.894953942467221820, -0.894931633421648160, -0.894909322138745410, -0.894887008618569290, -0.894864692861175760, -0.894842374866620440, -0.894820054634958840, --0.894797732166247360, -0.894775407460541740, -0.894753080517897480, -0.894730751338370540, -0.894708419922016770, -0.894686086268891460, -0.894663750379051440, -0.894641412252551890, --0.894619071889449000, -0.894596729289798280, -0.894574384453655780, -0.894552037381077360, -0.894529688072118860, -0.894507336526836120, -0.894484982745284540, -0.894462626727520970, --0.894440268473600920, -0.894417907983580120, -0.894395545257514520, -0.894373180295460090, -0.894350813097472330, -0.894328443663607970, -0.894306071993922420, -0.894283698088471750, --0.894261321947311780, -0.894238943570498600, -0.894216562958087930, -0.894194180110135960, -0.894171795026698520, -0.894149407707831580, -0.894127018153590640, -0.894104626364032650, --0.894082232339213020, -0.894059836079187930, -0.894037437584013220, -0.894015036853744390, -0.893992633888438530, -0.893970228688151010, -0.893947821252937920, -0.893925411582855320, --0.893902999677959050, -0.893880585538305410, -0.893858169163950330, -0.893835750554949790, -0.893813329711359850, -0.893790906633236130, -0.893768481320635690, -0.893746053773613940, --0.893723623992227050, -0.893701191976531200, -0.893678757726582340, -0.893656321242436100, -0.893633882524149550, -0.893611441571778190, -0.893588998385378310, -0.893566552965005870, --0.893544105310717150, -0.893521655422568120, -0.893499203300614940, -0.893476748944913690, -0.893454292355520320, -0.893431833532491450, -0.893409372475883150, -0.893386909185751370, --0.893364443662152290, -0.893341975905142080, -0.893319505914776490, -0.893297033691112690, -0.893274559234206180, -0.893252082544113370, -0.893229603620890210, -0.893207122464593220, --0.893184639075278230, -0.893162153453001760, -0.893139665597819880, -0.893117175509788530, -0.893094683188964570, -0.893072188635403830, -0.893049691849162720, -0.893027192830297300, --0.893004691578863970, -0.892982188094918470, -0.892959682378517860, -0.892937174429718090, -0.892914664248575460, -0.892892151835146030, -0.892869637189486310, -0.892847120311652480, --0.892824601201700930, -0.892802079859687740, -0.892779556285669410, -0.892757030479701790, -0.892734502441842050, -0.892711972172145930, -0.892689439670669940, -0.892666904937470360, --0.892644367972603160, -0.892621828776125390, -0.892599287348093020, -0.892576743688562440, -0.892554197797590040, -0.892531649675232130, -0.892509099321545100, -0.892486546736585340, --0.892463991920409260, -0.892441434873073040, -0.892418875594632950, -0.892396314085146080, -0.892373750344668370, -0.892351184373256330, -0.892328616170966260, -0.892306045737854770, --0.892283473073977710, -0.892260898179392360, -0.892238321054154680, -0.892215741698321300, -0.892193160111948600, -0.892170576295092890, -0.892147990247810770, -0.892125401970158770, --0.892102811462193170, -0.892080218723970140, -0.892057623755546980, -0.892035026556979750, -0.892012427128325070, -0.891989825469639230, -0.891967221580978740, -0.891944615462399890, --0.891922007113959970, -0.891899396535714930, -0.891876783727721390, -0.891854168690035980, -0.891831551422715090, -0.891808931925815230, -0.891786310199393140, -0.891763686243505330, --0.891741060058207860, -0.891718431643558130, -0.891695800999612320, -0.891673168126426940, -0.891650533024058720, -0.891627895692564180, -0.891605256131999480, -0.891582614342422030, --0.891559970323888010, -0.891537324076454140, -0.891514675600176940, -0.891492024895113030, -0.891469371961319030, -0.891446716798851680, -0.891424059407767480, -0.891401399788123160, --0.891378737939974910, -0.891356073863380230, -0.891333407558395410, -0.891310739025076960, -0.891288068263481730, -0.891265395273665990, -0.891242720055687050, -0.891220042609601410, --0.891197362935465590, -0.891174681033336410, -0.891151996903270520, -0.891129310545324630, -0.891106621959555480, -0.891083931146019690, -0.891061238104774110, -0.891038542835875140, --0.891015845339380160, -0.890993145615345480, -0.890970443663828050, -0.890947739484884480, -0.890925033078571070, -0.890902324444945550, -0.890879613584064200, -0.890856900495983870, --0.890834185180761300, -0.890811467638453200, -0.890788747869116440, -0.890766025872807840, -0.890743301649584150, -0.890720575199502210, -0.890697846522618520, -0.890675115618990490, --0.890652382488674730, -0.890629647131727990, -0.890606909548207200, -0.890584169738169010, -0.890561427701670130, -0.890538683438767960, -0.890515936949519140, -0.890493188233980490, --0.890470437292208870, -0.890447684124261120, -0.890424928730194190, -0.890402171110064920, -0.890379411263930280, -0.890356649191846650, -0.890333884893871890, -0.890311118370062270, --0.890288349620474980, -0.890265578645166760, -0.890242805444194540, -0.890220030017614960, -0.890197252365485750, -0.890174472487863410, -0.890151690384804790, -0.890128906056367080, --0.890106119502606980, -0.890083330723581590, -0.890060539719347950, -0.890037746489962920, -0.890014951035483120, -0.889992153355966380, -0.889969353451469210, -0.889946551322048700, --0.889923746967761780, -0.889900940388665520, -0.889878131584816430, -0.889855320556272590, -0.889832507303090270, -0.889809691825326770, -0.889786874123039030, -0.889764054196284020, --0.889741232045119010, -0.889718407669600860, -0.889695581069786630, -0.889672752245733500, -0.889649921197498080, -0.889627087925138340, -0.889604252428710770, -0.889581414708272680, --0.889558574763881000, -0.889535732595592380, -0.889512888203464970, -0.889490041587555290, -0.889467192747920520, -0.889444341684617720, -0.889421488397704070, -0.889398632887236750, --0.889375775153272820, -0.889352915195869560, -0.889330053015083830, -0.889307188610972690, -0.889284321983593970, -0.889261453133004420, -0.889238582059261210, -0.889215708762421510, --0.889192833242542610, -0.889169955499681250, -0.889147075533895380, -0.889124193345241840, -0.889101308933777700, -0.889078422299560360, -0.889055533442647090, -0.889032642363094870, --0.889009749060960970, -0.888986853536302800, -0.888963955789177080, -0.888941055819641890, -0.888918153627754060, -0.888895249213570770, -0.888872342577149420, -0.888849433718547190, --0.888826522637821030, -0.888803609335028890, -0.888780693810227730, -0.888757776063474950, -0.888734856094827610, -0.888711933904343110, -0.888689009492078850, -0.888666082858092120, --0.888643154002440090, -0.888620222925179730, -0.888597289626369300, -0.888574354106065670, -0.888551416364326110, -0.888528476401208020, -0.888505534216768700, -0.888482589811065200, --0.888459643184155600, -0.888436694336096840, -0.888413743266946440, -0.888390789976761690, -0.888367834465599860, -0.888344876733518580, -0.888321916780575040, -0.888298954606826620, --0.888275990212330950, -0.888253023597144860, -0.888230054761326550, -0.888207083704933180, -0.888184110428022030, -0.888161134930650630, -0.888138157212876030, -0.888115177274756420, --0.888092195116348960, -0.888069210737710830, -0.888046224138899780, -0.888023235319973180, -0.888000244280988450, -0.887977251022003090, -0.887954255543074720, -0.887931257844260640, --0.887908257925618010, -0.887885255787205120, -0.887862251429079040, -0.887839244851297390, -0.887816236053917680, -0.887793225036997310, -0.887770211800593460, -0.887747196344764620, --0.887724178669567650, -0.887701158775060280, -0.887678136661300020, -0.887655112328344380, -0.887632085776250970, -0.887609057005077420, -0.887586026014881120, -0.887562992805719380, --0.887539957377650680, -0.887516919730731990, -0.887493879865020930, -0.887470837780575230, -0.887447793477452510, -0.887424746955709830, -0.887401698215405710, -0.887378647256597320, --0.887355594079342280, -0.887332538683698320, -0.887309481069723070, -0.887286421237474030, -0.887263359187008940, -0.887240294918385410, -0.887217228431660840, -0.887194159726893530, --0.887171088804140860, -0.887148015663460470, -0.887124940304910070, -0.887101862728547190, -0.887078782934429320, -0.887055700922614990, -0.887032616693161360, -0.887009530246126050, --0.886986441581567140, -0.886963350699542020, -0.886940257600108420, -0.886917162283324290, -0.886894064749247260, -0.886870964997935050, -0.886847863029444960, -0.886824758843835710, --0.886801652441164600, -0.886778543821489240, -0.886755432984867590, -0.886732319931356930, -0.886709204661015880, -0.886686087173901850, -0.886662967470072560, -0.886639845549585860, --0.886616721412499480, -0.886593595058871360, -0.886570466488759260, -0.886547335702221000, -0.886524202699314420, -0.886501067480096940, -0.886477930044627160, -0.886454790392962490, --0.886431648525160990, -0.886408504441280280, -0.886385358141378310, -0.886362209625512490, -0.886339058893741650, -0.886315905946123080, -0.886292750782714860, -0.886269593403574700, --0.886246433808760560, -0.886223271998330290, -0.886200107972341830, -0.886176941730853150, -0.886153773273921750, -0.886130602601606250, -0.886107429713964280, -0.886084254611053780, --0.886061077292932600, -0.886037897759658690, -0.886014716011289670, -0.885991532047884170, -0.885968345869500020, -0.885945157476194840, -0.885921966868026930, -0.885898774045054020, --0.885875579007334160, -0.885852381754925310, -0.885829182287885540, -0.885805980606272470, -0.885782776710144830, -0.885759570599560230, -0.885736362274576640, -0.885713151735252220, --0.885689938981644940, -0.885666724013812300, -0.885643506831813370, -0.885620287435705640, -0.885597065825547200, -0.885573842001396110, -0.885550615963310420, -0.885527387711348090, --0.885504157245567410, -0.885480924566026230, -0.885457689672782820, -0.885434452565894810, -0.885411213245420940, -0.885387971711419140, -0.885364727963947380, -0.885341482003063840, --0.885318233828826130, -0.885294983441293310, -0.885271730840523020, -0.885248476026573310, -0.885225218999502570, -0.885201959759368660, -0.885178698306229860, -0.885155434640144350, --0.885132168761170290, -0.885108900669365760, -0.885085630364788490, -0.885062357847497650, -0.885039083117550970, -0.885015806175006410, -0.884992527019922480, -0.884969245652357240, --0.884945962072368420, -0.884922676280015090, -0.884899388275355080, -0.884876098058446580, -0.884852805629347870, -0.884829510988117240, -0.884806214134812640, -0.884782915069492690, --0.884759613792215350, -0.884736310303038560, -0.884713004602021400, -0.884689696689221820, -0.884666386564697870, -0.884643074228508080, -0.884619759680710490, -0.884596442921363190, --0.884573123950525120, -0.884549802768254230, -0.884526479374608930, -0.884503153769647280, -0.884479825953427890, -0.884456495926008830, -0.884433163687448620, -0.884409829237805530, --0.884386492577137310, -0.884363153705503340, -0.884339812622961570, -0.884316469329570200, -0.884293123825387610, -0.884269776110472310, -0.884246426184882030, -0.884223074048676170, --0.884199719701912690, -0.884176363144649870, -0.884153004376946110, -0.884129643398859800, -0.884106280210449460, -0.884082914811773370, -0.884059547202890040, -0.884036177383857760, --0.884012805354734700, -0.883989431115580040, -0.883966054666451840, -0.883942676007408390, -0.883919295138508310, -0.883895912059809550, -0.883872526771371510, -0.883849139273252040, --0.883825749565509860, -0.883802357648203140, -0.883778963521390630, -0.883755567185130710, -0.883732168639481900, -0.883708767884502590, -0.883685364920251400, -0.883661959746786410, --0.883638552364166880, -0.883615142772451010, -0.883591730971697190, -0.883568316961964140, -0.883544900743310270, -0.883521482315793750, -0.883498061679473980, -0.883474638834409020, --0.883451213780657390, -0.883427786518277800, -0.883404357047328780, -0.883380925367868720, -0.883357491479956460, -0.883334055383650510, -0.883310617079008930, -0.883287176566091240, --0.883263733844955600, -0.883240288915660640, -0.883216841778264980, -0.883193392432827240, -0.883169940879405480, -0.883146487118059430, -0.883123031148847050, -0.883099572971827170, --0.883076112587058320, -0.883052649994599200, -0.883029185194508460, -0.883005718186844700, -0.882982248971666770, -0.882958777549032740, -0.882935303919002100, -0.882911828081633270, --0.882888350036984850, -0.882864869785115580, -0.882841387326084190, -0.882817902659948860, -0.882794415786769200, -0.882770926706603400, -0.882747435419510400, -0.882723941925548820, --0.882700446224777390, -0.882676948317254740, -0.882653448203039810, -0.882629945882191240, -0.882606441354767730, -0.882582934620827820, -0.882559425680430890, -0.882535914533635450, --0.882512401180500230, -0.882488885621084070, -0.882465367855445160, -0.882441847883643330, -0.882418325705736860, -0.882394801321784490, -0.882371274731845180, -0.882347745935977760, --0.882324214934240850, -0.882300681726693510, -0.882277146313394380, -0.882253608694402500, -0.882230068869776060, -0.882206526839574900, -0.882182982603857410, -0.882159436162682550, --0.882135887516109050, -0.882112336664195750, -0.882088783607001270, -0.882065228344585230, -0.882041670877006130, -0.882018111204322830, -0.881994549326594270, -0.881970985243879400, --0.881947418956236960, -0.881923850463726010, -0.881900279766405500, -0.881876706864333840, -0.881853131757570740, -0.881829554446174950, -0.881805974930205180, -0.881782393209720520, --0.881758809284779900, -0.881735223155441730, -0.881711634821765950, -0.881688044283811200, -0.881664451541636200, -0.881640856595300230, -0.881617259444861910, -0.881593660090380650, --0.881570058531915060, -0.881546454769524420, -0.881522848803267260, -0.881499240633203280, -0.881475630259391350, -0.881452017681890190, -0.881428402900759080, -0.881404785916056980, --0.881381166727842390, -0.881357545336175390, -0.881333921741114580, -0.881310295942718810, -0.881286667941047370, -0.881263037736159330, -0.881239405328113620, -0.881215770716969440, --0.881192133902785830, -0.881168494885621880, -0.881144853665536190, -0.881121210242588940, -0.881097564616838520, -0.881073916788344240, -0.881050266757165250, -0.881026614523360060, --0.881002960086988860, -0.880979303448110150, -0.880955644606783220, -0.880931983563067230, -0.880908320317021150, -0.880884654868704380, -0.880860987218175960, -0.880837317365495090, --0.880813645310720930, -0.880789971053912210, -0.880766294595129010, -0.880742615934430040, -0.880718935071874490, -0.880695252007521630, -0.880671566741430660, -0.880647879273660390, --0.880624189604270800, -0.880600497733320720, -0.880576803660869430, -0.880553107386976120, -0.880529408911700060, -0.880505708235100440, -0.880482005357236530, -0.880458300278167740, --0.880434592997952680, -0.880410883516651530, -0.880387171834323250, -0.880363457951027000, -0.880339741866822070, -0.880316023581767860, -0.880292303095923100, -0.880268580409347970, --0.880244855522101520, -0.880221128434242830, -0.880197399145831390, -0.880173667656926400, -0.880149933967587230, -0.880126198077873290, -0.880102459987843750, -0.880078719697557800, --0.880054977207075370, -0.880031232516455430, -0.880007485625757590, -0.879983736535040920, -0.879959985244364920, -0.879936231753788540, -0.879912476063371970, -0.879888718173174270, --0.879864958083254710, -0.879841195793672810, -0.879817431304487860, -0.879793664615759360, -0.879769895727546710, -0.879746124639909420, -0.879722351352906660, -0.879698575866597720, --0.879674798181042660, -0.879651018296300660, -0.879627236212431110, -0.879603451929493520, -0.879579665447546730, -0.879555876766651370, -0.879532085886866270, -0.879508292808250820, --0.879484497530864770, -0.879460700054767510, -0.879436900380018430, -0.879413098506677150, -0.879389294434803070, -0.879365488164455700, -0.879341679695694320, -0.879317869028579110, --0.879294056163169140, -0.879270241099524120, -0.879246423837703570, -0.879222604377766780, -0.879198782719773250, -0.879174958863783050, -0.879151132809855460, -0.879127304558050100, --0.879103474108426490, -0.879079641461044110, -0.879055806615962720, -0.879031969573241700, -0.879008130332940900, -0.878984288895119260, -0.878960445259837300, -0.878936599427154300, --0.878912751397129770, -0.878888901169823320, -0.878865048745294700, -0.878841194123602950, -0.878817337304808710, -0.878793478288971140, -0.878769617076149760, -0.878745753666404510, --0.878721888059794680, -0.878698020256380220, -0.878674150256220750, -0.878650278059375900, -0.878626403665904940, -0.878602527075868280, -0.878578648289325410, -0.878554767306335860, --0.878530884126959450, -0.878506998751255820, -0.878483111179284240, -0.878459221411105330, -0.878435329446778380, -0.878411435286363120, -0.878387538929919160, -0.878363640377506470, --0.878339739629184660, -0.878315836685013450, -0.878291931545052700, -0.878268024209362010, -0.878244114678001010, -0.878220202951029980, -0.878196289028508550, -0.878172372910496430, --0.878148454597053260, -0.878124534088238650, -0.878100611384112990, -0.878076686484735910, -0.878052759390167140, -0.878028830100466400, -0.878004898615693640, -0.877980964935908600, --0.877957029061171120, -0.877933090991541040, -0.877909150727078310, -0.877885208267842330, -0.877861263613893610, -0.877837316765291860, -0.877813367722096730, -0.877789416484368260, --0.877765463052165740, -0.877741507425550020, -0.877717549604580590, -0.877693589589317200, -0.877669627379819910, -0.877645662976148430, -0.877621696378362850, -0.877597727586523100, --0.877573756600689040, -0.877549783420920490, -0.877525808047277090, -0.877501830479819670, -0.877477850718607620, -0.877453868763700910, -0.877429884615159580, -0.877405898273043490, --0.877381909737412150, -0.877357919008326600, -0.877333926085846260, -0.877309930970031070, -0.877285933660940990, -0.877261934158636180, -0.877237932463176500, -0.877213928574621990, --0.877189922493032630, -0.877165914218468010, -0.877141903750989100, -0.877117891090655410, -0.877093876237526990, -0.877069859191663910, -0.877045839953126130, -0.877021818521973360, --0.876997794898266460, -0.876973769082065040, -0.876949741073429160, -0.876925710872419000, -0.876901678479094620, -0.876877643893515970, -0.876853607115743230, -0.876829568145836460, --0.876805526983855720, -0.876781483629860860, -0.876757438083912600, -0.876733390346070780, -0.876709340416395480, -0.876685288294946850, -0.876661233981784640, -0.876637177476969680, --0.876613118780561810, -0.876589057892621090, -0.876564994813207820, -0.876540929542382050, -0.876516862080203850, -0.876492792426733610, -0.876468720582031290, -0.876444646546157280, --0.876420570319171200, -0.876396491901134000, -0.876372411292105640, -0.876348328492146390, -0.876324243501316100, -0.876300156319674950, -0.876276066947283770, -0.876251975384202410, --0.876227881630491150, -0.876203785686210160, -0.876179687551419620, -0.876155587226180030, -0.876131484710551360, -0.876107380004593980, -0.876083273108368200, -0.876059164021933730, --0.876035052745351870, -0.876010939278682340, -0.875986823621985430, -0.875962705775321540, -0.875938585738750830, -0.875914463512333260, -0.875890339096129900, -0.875866212490200690, --0.875842083694606030, -0.875817952709406100, -0.875793819534661290, -0.875769684170431990, -0.875745546616778500, -0.875721406873761100, -0.875697264941439730, -0.875673120819875580, --0.875648974509128710, -0.875624826009259390, -0.875600675320328040, -0.875576522442394920, -0.875552367375520110, -0.875528210119764780, -0.875504050675188990, -0.875479889041853030, --0.875455725219817290, -0.875431559209142400, -0.875407391009888510, -0.875383220622116040, -0.875359048045885710, -0.875334873281257250, -0.875310696328291950, -0.875286517187050080, --0.875262335857591830, -0.875238152339977700, -0.875213966634268200, -0.875189778740523390, -0.875165588658804560, -0.875141396389171770, -0.875117201931685520, -0.875093005286406210, --0.875068806453394350, -0.875044605432710560, -0.875020402224415240, -0.874996196828568880, -0.874971989245232010, -0.874947779474464780, -0.874923567516328490, -0.874899353370883310, --0.874875137038189750, -0.874850918518308430, -0.874826697811299290, -0.874802474917223850, -0.874778249836142160, -0.874754022568114960, -0.874729793113202650, -0.874705561471465830, --0.874681327642965130, -0.874657091627761170, -0.874632853425914350, -0.874608613037485490, -0.874584370462534680, -0.874560125701123400, -0.874535878753311740, -0.874511629619160290, --0.874487378298729910, -0.874463124792081100, -0.874438869099273930, -0.874414611220370120, -0.874390351155429730, -0.874366088904513510, -0.874341824467682050, -0.874317557844995990, --0.874293289036516040, -0.874269018042302950, -0.874244744862417210, -0.874220469496919230, -0.874196191945870500, -0.874171912209331330, -0.874147630287362310, -0.874123346180024300, --0.874099059887377790, -0.874074771409483310, -0.874050480746402350, -0.874026187898195080, -0.874001892864922470, -0.873977595646645010, -0.873953296243423660, -0.873928994655319040, --0.873904690882391870, -0.873880384924702990, -0.873856076782312810, -0.873831766455282820, -0.873807453943673320, -0.873783139247545250, -0.873758822366959450, -0.873734503301976440, --0.873710182052656830, -0.873685858619062120, -0.873661533001252820, -0.873637205199289670, -0.873612875213233500, -0.873588543043145150, -0.873564208689085460, -0.873539872151115280, --0.873515533429295330, -0.873491192523686570, -0.873466849434349380, -0.873442504161345610, -0.873418156704735550, -0.873393807064580030, -0.873369455240940010, -0.873345101233875880, --0.873320745043449480, -0.873296386669721310, -0.873272026112752010, -0.873247663372602730, -0.873223298449334330, -0.873198931343007630, -0.873174562053683600, -0.873150190581423070, --0.873125816926287210, -0.873101441088336320, -0.873077063067632330, -0.873052682864235540, -0.873028300478207120, -0.873003915909608020, -0.872979529158499080, -0.872955140224940810, --0.872930749108995260, -0.872906355810722730, -0.872881960330184280, -0.872857562667441080, -0.872833162822553850, -0.872808760795583780, -0.872784356586591700, -0.872759950195638790, --0.872735541622785660, -0.872711130868094040, -0.872686717931624560, -0.872662302813438260, -0.872637885513596330, -0.872613466032159610, -0.872589044369188830, -0.872564620524745820, --0.872540194498891310, -0.872515766291686260, -0.872491335903191830, -0.872466903333468990, -0.872442468582579010, -0.872418031650582740, -0.872393592537541450, -0.872369151243515770, --0.872344707768567650, -0.872320262112757700, -0.872295814276147110, -0.872271364258797030, -0.872246912060768540, -0.872222457682122250, -0.872198001122920340, -0.872173542383223420, --0.872149081463092560, -0.872124618362589140, -0.872100153081774130, -0.872075685620708580, -0.872051215979454010, -0.872026744158071350, -0.872002270156621790, -0.871977793975166170, --0.871953315613766430, -0.871928835072483420, -0.871904352351378310, -0.871879867450512380, -0.871855380369946360, -0.871830891109742210, -0.871806399669960990, -0.871781906050663640, --0.871757410251911560, -0.871732912273766040, -0.871708412116288130, -0.871683909779539250, -0.871659405263580540, -0.871634898568473430, -0.871610389694278510, -0.871585878641058080, --0.871561365408872970, -0.871536849997784470, -0.871512332407853860, -0.871487812639142320, -0.871463290691710910, -0.871438766565621690, -0.871414240260935610, -0.871389711777713850, --0.871365181116017800, -0.871340648275908850, -0.871316113257448180, -0.871291576060697290, -0.871267036685717480, -0.871242495132569680, -0.871217951401315970, -0.871193405492017510, --0.871168857404735490, -0.871144307139531280, -0.871119754696466300, -0.871095200075601590, -0.871070643276999230, -0.871046084300720280, -0.871021523146826130, -0.870996959815378170, --0.870972394306437800, -0.870947826620066420, -0.870923256756325540, -0.870898684715276540, -0.870874110496980270, -0.870849534101499230, -0.870824955528894380, -0.870800374779227120, --0.870775791852558930, -0.870751206748951230, -0.870726619468465080, -0.870702030011162860, -0.870677438377105540, -0.870652844566354610, -0.870628248578971590, -0.870603650415017970, --0.870579050074555270, -0.870554447557644770, -0.870529842864348310, -0.870505235994727180, -0.870480626948842540, -0.870456015726756790, -0.870431402328530890, -0.870406786754226670, --0.870382169003905300, -0.870357549077628190, -0.870332926975457610, -0.870308302697454740, -0.870283676243681080, -0.870259047614198140, -0.870234416809067770, -0.870209783828351240, --0.870185148672110280, -0.870160511340406400, -0.870135871833301320, -0.870111230150856120, -0.870086586293133180, -0.870061940260193900, -0.870037292052099680, -0.870012641668912350, --0.869987989110693300, -0.869963334377503840, -0.869938677469406560, -0.869914018386462540, -0.869889357128733390, -0.869864693696280940, -0.869840028089166830, -0.869815360307452550, --0.869790690351199820, -0.869766018220470500, -0.869741343915325650, -0.869716667435827870, -0.869691988782038350, -0.869667307954018920, -0.869642624951831200, -0.869617939775537030, --0.869593252425197470, -0.869568562900875140, -0.869543871202631550, -0.869519177330528190, -0.869494481284626920, -0.869469783064989450, -0.869445082671677530, -0.869420380104752980, --0.869395675364277310, -0.869370968450312140, -0.869346259362919980, -0.869321548102162110, -0.869296834668100370, -0.869272119060796600, -0.869247401280312530, -0.869222681326709430, --0.869197959200050160, -0.869173234900396000, -0.869148508427808660, -0.869123779782350110, -0.869099048964082190, -0.869074315973066500, -0.869049580809365120, -0.869024843473039770, --0.869000103964152280, -0.868975362282764060, -0.868950618428937950, -0.868925872402735220, -0.868901124204217950, -0.868876373833447730, -0.868851621290486210, -0.868826866575395980, --0.868802109688238680, -0.868777350629076130, -0.868752589397970070, -0.868727825994982660, -0.868703060420175640, -0.868678292673610960, -0.868653522755350570, -0.868628750665456420, --0.868603976403989900, -0.868579199971013850, -0.868554421366589780, -0.868529640590779750, -0.868504857643645600, -0.868480072525249280, -0.868455285235652300, -0.868430495774917600, --0.868405704143106690, -0.868380910340281420, -0.868356114366503950, -0.868331316221836240, -0.868306515906340120, -0.868281713420077760, -0.868256908763111120, -0.868232101935501820, --0.868207292937312690, -0.868182481768605240, -0.868157668429441640, -0.868132852919883960, -0.868108035239994020, -0.868083215389833570, -0.868058393369465550, -0.868033569178951580, --0.868008742818353610, -0.867983914287733800, -0.867959083587154230, -0.867934250716676960, -0.867909415676364150, -0.867884578466277650, -0.867859739086479290, -0.867834897537032130, --0.867810053817997580, -0.867785207929438030, -0.867760359871415310, -0.867735509643991820, -0.867710657247229070, -0.867685802681190110, -0.867660945945936680, -0.867636087041530830, --0.867611225968034860, -0.867586362725510710, -0.867561497314020660, -0.867536629733627000, -0.867511759984391670, -0.867486888066376970, -0.867462013979644510, -0.867437137724257570, --0.867412259300277770, -0.867387378707767280, -0.867362495946788380, -0.867337611017402700, -0.867312723919673510, -0.867287834653662550, -0.867262943219431980, -0.867238049617044090, --0.867213153846561060, -0.867188255908045050, -0.867163355801558460, -0.867138453527163460, -0.867113549084922440, -0.867088642474897030, -0.867063733697150400, -0.867038822751744490, --0.867013909638741480, -0.866988994358203760, -0.866964076910193500, -0.866939157294772670, -0.866914235512004310, -0.866889311561950480, -0.866864385444673260, -0.866839457160235140, --0.866814526708698300, -0.866789594090125240, -0.866764659304578130, -0.866739722352119380, -0.866714783232810930, -0.866689841946715940, -0.866664898493896270, -0.866639952874414420, --0.866615005088332670, -0.866590055135713410, -0.866565103016618600, -0.866540148731111510, -0.866515192279254000, -0.866490233661108440, -0.866465272876737470, -0.866440309926203130, --0.866415344809568170, -0.866390377526894740, -0.866365408078245470, -0.866340436463682080, -0.866315462683268200, -0.866290486737065550, -0.866265508625136740, -0.866240528347544170, --0.866215545904350240, -0.866190561295617000, -0.866165574521407860, -0.866140585581784750, -0.866115594476810190, -0.866090601206546570, -0.866065605771056510, -0.866040608170402510, --0.866015608404646860, -0.865990606473852290, -0.865965602378081070, -0.865940596117395490, -0.865915587691858830, -0.865890577101533280, -0.865865564346481210, -0.865840549426765250, --0.865815532342447570, -0.865790513093591340, -0.865765491680258960, -0.865740468102512820, -0.865715442360415420, -0.865690414454029500, -0.865665384383417560, -0.865640352148642100, --0.865615317749765740, -0.865590281186851110, -0.865565242459960360, -0.865540201569157010, -0.865515158514503000, -0.865490113296061180, -0.865465065913894160, -0.865440016368064340, --0.865414964658634100, -0.865389910785666850, -0.865364854749224870, -0.865339796549370770, -0.865314736186167170, -0.865289673659676680, -0.865264608969962050, -0.865239542117085870, --0.865214473101110880, -0.865189401922099140, -0.865164328580114490, -0.865139253075218880, -0.865114175407475260, -0.865089095576946130, -0.865064013583694340, -0.865038929427782040, --0.865013843109272870, -0.864988754628229000, -0.864963663984713360, -0.864938571178788470, -0.864913476210517170, -0.864888379079962190, -0.864863279787186360, -0.864838178332252180, --0.864813074715222170, -0.864787968936159950, -0.864762860995127780, -0.864737750892188520, -0.864712638627404770, -0.864687524200839500, -0.864662407612554970, -0.864637288862614820, --0.864612167951081420, -0.864587044878017740, -0.864561919643486390, -0.864536792247550200, -0.864511662690272020, -0.864486530971714680, -0.864461397091941030, -0.864436261051014010, --0.864411122848995680, -0.864385982485950110, -0.864360839961939580, -0.864335695277026920, -0.864310548431275080, -0.864285399424746360, -0.864260248257504580, -0.864235094929612260, --0.864209939441132110, -0.864184781792127210, -0.864159621982660280, -0.864134460012794370, -0.864109295882592220, -0.864084129592116890, -0.864058961141431210, -0.864033790530597700, --0.864008617759680080, -0.863983442828741070, -0.863958265737843400, -0.863933086487050030, -0.863907905076423900, -0.863882721506027630, -0.863857535775924950, -0.863832347886178460, --0.863807157836851140, -0.863781965628005910, -0.863756771259705740, -0.863731574732013560, -0.863706376044992560, -0.863681175198705580, -0.863655972193215330, -0.863630767028585430, --0.863605559704878620, -0.863580350222158070, -0.863555138580486490, -0.863529924779927180, -0.863504708820542530, -0.863479490702396490, -0.863454270425551900, -0.863429047990071470, --0.863403823396018510, -0.863378596643455950, -0.863353367732446970, -0.863328136663054520, -0.863302903435341770, -0.863277668049371230, -0.863252430505207060, -0.863227190802911770, --0.863201948942548420, -0.863176704924180300, -0.863151458747870470, -0.863126210413681430, -0.863100959921677350, -0.863075707271920840, -0.863050452464475200, -0.863025195499403260, --0.862999936376768420, -0.862974675096633730, -0.862949411659062360, -0.862924146064117490, -0.862898878311862180, -0.862873608402359270, -0.862848336335672710, -0.862823062111865440, --0.862797785731000410, -0.862772507193140910, -0.862747226498349780, -0.862721943646690970, -0.862696658638227310, -0.862671371473022090, -0.862646082151138360, -0.862620790672639410, --0.862595497037588530, -0.862570201246048880, -0.862544903298083750, -0.862519603193756310, -0.862494300933129510, -0.862468996516267290, -0.862443689943232620, -0.862418381214088760, --0.862393070328899000, -0.862367757287725970, -0.862342442090634040, -0.862317124737686070, -0.862291805228945330, -0.862266483564474990, -0.862241159744338460, -0.862215833768599000, --0.862190505637319910, -0.862165175350564690, -0.862139842908396400, -0.862114508310878210, -0.862089171558074070, -0.862063832650047050, -0.862038491586860410, -0.862013148368577560, --0.861987802995261900, -0.861962455466976250, -0.861937105783784910, -0.861911753945750810, -0.861886399952937250, -0.861861043805407730, -0.861835685503225650, -0.861810325046454380, --0.861784962435157230, -0.861759597669397690, -0.861734230749238720, -0.861708861674744590, -0.861683490445978250, -0.861658117063003330, -0.861632741525882980, -0.861607363834680950, --0.861581983989459840, -0.861556601990284390, -0.861531217837217420, -0.861505831530322340, -0.861480443069662760, -0.861455052455301960, -0.861429659687303560, -0.861404264765731060, --0.861378867690647860, -0.861353468462117130, -0.861328067080203040, -0.861302663544968870, -0.861277257856478020, -0.861251850014794100, -0.861226440019980500, -0.861201027872100290, --0.861175613571218080, -0.861150197117396710, -0.861124778510699910, -0.861099357751191170, -0.861073934838934020, -0.861048509773992050, -0.861023082556428790, -0.860997653186307830, --0.860972221663692690, -0.860946787988646540, -0.860921352161234000, -0.860895914181518010, -0.860870474049562180, -0.860845031765430260, -0.860819587329185180, -0.860794140740891670, --0.860768692000612900, -0.860743241108412270, -0.860717788064353510, -0.860692332868500330, -0.860666875520916360, -0.860641416021665220, -0.860615954370810510, -0.860590490568415860, --0.860565024614544540, -0.860539556509261170, -0.860514086252628820, -0.860488613844711310, -0.860463139285572280, -0.860437662575275430, -0.860412183713883950, -0.860386702701462450, --0.860361219538074210, -0.860335734223782840, -0.860310246758652200, -0.860284757142745990, -0.860259265376127850, -0.860233771458861480, -0.860208275391010750, -0.860182777172638800, --0.860157276803810490, -0.860131774284588870, -0.860106269615037890, -0.860080762795221280, -0.860055253825202650, -0.860029742705045510, -0.860004229434814470, -0.859978714014572820, --0.859953196444384280, -0.859927676724312920, -0.859902154854422340, -0.859876630834776280, -0.859851104665438680, -0.859825576346473390, -0.859800045877943670, -0.859774513259914270, --0.859748978492448580, -0.859723441575610540, -0.859697902509463760, -0.859672361294072320, -0.859646817929499480, -0.859621272415809990, -0.859595724753067450, -0.859570174941335470, --0.859544622980678130, -0.859519068871159250, -0.859493512612842680, -0.859467954205792360, -0.859442393650072020, -0.859416830945745840, -0.859391266092877080, -0.859365699091530600, --0.859340129941769890, -0.859314558643658800, -0.859288985197261380, -0.859263409602641030, -0.859237831859862580, -0.859212251968989540, -0.859186669930085970, -0.859161085743215590, --0.859135499408442580, -0.859109910925830890, -0.859084320295444240, -0.859058727517346910, -0.859033132591602740, -0.859007535518275240, -0.858981936297429470, -0.858956334929128820, --0.858930731413437230, -0.858905125750419000, -0.858879517940137730, -0.858853907982657370, -0.858828295878042660, -0.858802681626357200, -0.858777065227665060, -0.858751446682030180, --0.858725825989516740, -0.858700203150188690, -0.858674578164110190, -0.858648951031345310, -0.858623321751957440, -0.858597690326011850, -0.858572056753571950, -0.858546421034701910, --0.858520783169465900, -0.858495143157927850, -0.858469501000151510, -0.858443856696201930, -0.858418210246142620, -0.858392561650037860, -0.858366910907951700, -0.858341258019948210, --0.858315602986091550, -0.858289945806445910, -0.858264286481075440, -0.858238625010043780, -0.858212961393416070, -0.858187295631255840, -0.858161627723627470, -0.858135957670595030, --0.858110285472222570, -0.858084611128574040, -0.858058934639714500, -0.858033256005707570, -0.858007575226617410, -0.857981892302508430, -0.857956207233444680, -0.857930520019490330, --0.857904830660709770, -0.857879139157167180, -0.857853445508926620, -0.857827749716052130, -0.857802051778608580, -0.857776351696660000, -0.857750649470270470, -0.857724945099504370, --0.857699238584425430, -0.857673529925098930, -0.857647819121588490, -0.857622106173958510, -0.857596391082273260, -0.857570673846597130, -0.857544954466994300, -0.857519232943528940, --0.857493509276265660, -0.857467783465268530, -0.857442055510601490, -0.857416325412329820, -0.857390593170517250, -0.857364858785228280, -0.857339122256527200, -0.857313383584478170, --0.857287642769145370, -0.857261899810593750, -0.857236154708887480, -0.857210407464090830, -0.857184658076268200, -0.857158906545483880, -0.857133152871802250, -0.857107397055287820, --0.857081639096004880, -0.857055878994017360, -0.857030116749390560, -0.857004352362188530, -0.856978585832475660, -0.856952817160316240, -0.856927046345774770, -0.856901273388915310, --0.856875498289803140, -0.856849721048502100, -0.856823941665076800, -0.856798160139591650, -0.856772376472111130, -0.856746590662699650, -0.856720802711421700, -0.856695012618341800, --0.856669220383523890, -0.856643426007033360, -0.856617629488934160, -0.856591830829291020, -0.856566030028168330, -0.856540227085630490, -0.856514422001741660, -0.856488614776567130, --0.856462805410171170, -0.856436993902618180, -0.856411180253972670, -0.856385364464299250, -0.856359546533662420, -0.856333726462126690, -0.856307904249756670, -0.856282079896616980, --0.856256253402771450, -0.856230424768285920, -0.856204593993224240, -0.856178761077651010, -0.856152926021630960, -0.856127088825228140, -0.856101249488508080, -0.856075408011534810, --0.856049564394373070, -0.856023718637087370, -0.855997870739742430, -0.855972020702402860, -0.855946168525133170, -0.855920314207998080, -0.855894457751062210, -0.855868599154389730, --0.855842738418046150, -0.855816875542095850, -0.855791010526603220, -0.855765143371633120, -0.855739274077250260, -0.855713402643518580, -0.855687529070504050, -0.855661653358270600, --0.855635775506882970, -0.855609895516405980, -0.855584013386904150, -0.855558129118442310, -0.855532242711085190, -0.855506354164897510, -0.855480463479943440, -0.855454570656288720, --0.855428675693997500, -0.855402778593134630, -0.855376879353764720, -0.855350977975952720, -0.855325074459762800, -0.855299168805260690, -0.855273261012510560, -0.855247351081577340, --0.855221439012525670, -0.855195524805420490, -0.855169608460326520, -0.855143689977308500, -0.855117769356431250, -0.855091846597759050, -0.855065921701357760, -0.855039994667291640, --0.855014065495625530, -0.854988134186424280, -0.854962200739752710, -0.854936265155675110, -0.854910327434257430, -0.854884387575563840, -0.854858445579659290, -0.854832501446608610, --0.854806555176476750, -0.854780606769328430, -0.854754656225228620, -0.854728703544242130, -0.854702748726433930, -0.854676791771868390, -0.854650832680611370, -0.854624871452727140, --0.854598908088280870, -0.854572942587337290, -0.854546974949960900, -0.854521005176217540, -0.854495033266171600, -0.854469059219888140, -0.854443083037431990, -0.854417104718868110, --0.854391124264261560, -0.854365141673677160, -0.854339156947179880, -0.854313170084834760, -0.854287181086706200, -0.854261189952860160, -0.854235196683361230, -0.854209201278274160, --0.854183203737664210, -0.854157204061596230, -0.854131202250134720, -0.854105198303345750, -0.854079192221293690, -0.854053184004043730, -0.854027173651660700, -0.854001161164209880, --0.853975146541756100, -0.853949129784364440, -0.853923110892099930, -0.853897089865027210, -0.853871066703212220, -0.853845041406719570, -0.853819013975614330, -0.853792984409961540, --0.853766952709826280, -0.853740918875273260, -0.853714882906368320, -0.853688844803176190, -0.853662804565761930, -0.853636762194190600, -0.853610717688527480, -0.853584671048837510, --0.853558622275185860, -0.853532571367637720, -0.853506518326257680, -0.853480463151111700, -0.853454405842264730, -0.853428346399781600, -0.853402284823727600, -0.853376221114168000, --0.853350155271167310, -0.853324087294791700, -0.853298017185105890, -0.853271944942175060, -0.853245870566064380, -0.853219794056838900, -0.853193715414564010, -0.853167634639304890, --0.853141551731126600, -0.853115466690094530, -0.853089379516273280, -0.853063290209729040, -0.853037198770526530, -0.853011105198731020, -0.852985009494407810, -0.852958911657621610, --0.852932811688438600, -0.852906709586923490, -0.852880605353141700, -0.852854498987158370, -0.852828390489038690, -0.852802279858848160, -0.852776167096651940, -0.852750052202515210, --0.852723935176503360, -0.852697816018681220, -0.852671694729115080, -0.852645571307869670, -0.852619445755010250, -0.852593318070602350, -0.852567188254711010, -0.852541056307401290, --0.852514922228739480, -0.852488786018790300, -0.852462647677619150, -0.852436507205291400, -0.852410364601872360, -0.852384219867427410, -0.852358073002021930, -0.852331924005721220, --0.852305772878590220, -0.852279619620695320, -0.852253464232101350, -0.852227306712873720, -0.852201147063077810, -0.852174985282779130, -0.852148821372042400, -0.852122655330934120, --0.852096487159519240, -0.852070316857863050, -0.852044144426031160, -0.852017969864088840, -0.851991793172101610, -0.851965614350134960, -0.851939433398254290, -0.851913250316524430, --0.851887065105012000, -0.851860877763781940, -0.851834688292899660, -0.851808496692430640, -0.851782302962440400, -0.851756107102993880, -0.851729909114157690, -0.851703708995996570, --0.851677506748576230, -0.851651302371962180, -0.851625095866219820, -0.851598887231414750, -0.851572676467612480, -0.851546463574878510, -0.851520248553278350, -0.851494031402877050, --0.851467812123741230, -0.851441590715935840, -0.851415367179526480, -0.851389141514578780, -0.851362913721157690, -0.851336683799329700, -0.851310451749160090, -0.851284217570714370, --0.851257981264058050, -0.851231742829256840, -0.851205502266376260, -0.851179259575481910, -0.851153014756639400, -0.851126767809914360, -0.851100518735371960, -0.851074267533078690, --0.851048014203099720, -0.851021758745500790, -0.850995501160347390, -0.850969241447705360, -0.850942979607639650, -0.850916715640216980, -0.850890449545502530, -0.850864181323562010, --0.850837910974460930, -0.850811638498265130, -0.850785363895040230, -0.850759087164851930, -0.850732808307765880, -0.850706527323847440, -0.850680244213163020, -0.850653958975778110, --0.850627671611758230, -0.850601382121169090, -0.850575090504076650, -0.850548796760545960, -0.850522500890643740, -0.850496202894435280, -0.850469902771986310, -0.850443600523362540, --0.850417296148629820, -0.850390989647853870, -0.850364681021100410, -0.850338370268435280, -0.850312057389923660, -0.850285742385632480, -0.850259425255626920, -0.850233105999972700, --0.850206784618735890, -0.850180461111981980, -0.850154135479776470, -0.850127807722186210, -0.850101477839276250, -0.850075145831112770, -0.850048811697761250, -0.850022475439287880, --0.849996137055758160, -0.849969796547238250, -0.849943453913793780, -0.849917109155490570, -0.849890762272394240, -0.849864413264571410, -0.849838062132087570, -0.849811708875008680, --0.849785353493400450, -0.849758995987328290, -0.849732636356859140, -0.849706274602058500, -0.849679910722992090, -0.849653544719725870, -0.849627176592325890, -0.849600806340857880, --0.849574433965387900, -0.849548059465981780, -0.849521682842705570, -0.849495304095624680, -0.849468923224805940, -0.849442540230314960, -0.849416155112217570, -0.849389767870579850, --0.849363378505467730, -0.849336987016946600, -0.849310593405083520, -0.849284197669944010, -0.849257799811593990, -0.849231399830099430, -0.849204997725526380, -0.849178593497940780, --0.849152187147408810, -0.849125778673996300, -0.849099368077768870, -0.849072955358793570, -0.849046540517135790, -0.849020123552861720, -0.848993704466037280, -0.848967283256728660, --0.848940859925001230, -0.848914434470922300, -0.848888006894557120, -0.848861577195971990, -0.848835145375232970, -0.848808711432405990, -0.848782275367557350, -0.848755837180752870, --0.848729396872058950, -0.848702954441540980, -0.848676509889266130, -0.848650063215300010, -0.848623614419708680, -0.848597163502558320, -0.848570710463915080, -0.848544255303844590, --0.848517798022413890, -0.848491338619688840, -0.848464877095735260, -0.848438413450619660, -0.848411947684407860, -0.848385479797166280, -0.848359009788961060, -0.848332537659858170, --0.848306063409923980, -0.848279587039224240, -0.848253108547825980, -0.848226627935794950, -0.848200145203197310, -0.848173660350099330, -0.848147173376566640, -0.848120684282666630, --0.848094193068464790, -0.848067699734027620, -0.848041204279421090, -0.848014706704711570, -0.847988207009965240, -0.847961705195248490, -0.847935201260627380, -0.847908695206168290, --0.847882187031937070, -0.847855676738000770, -0.847829164324425340, -0.847802649791276950, -0.847776133138621880, -0.847749614366526070, -0.847723093475056700, -0.847696570464279710, --0.847670045334261160, -0.847643518085067550, -0.847616988716765050, -0.847590457229420170, -0.847563923623099070, -0.847537387897868260, -0.847510850053793900, -0.847484310090942050, --0.847457768009379770, -0.847431223809173130, -0.847404677490388390, -0.847378129053091960, -0.847351578497350320, -0.847325025823229220, -0.847298471030795920, -0.847271914120116490, --0.847245355091257310, -0.847218793944284790, -0.847192230679265190, -0.847165665296265020, -0.847139097795350790, -0.847112528176588660, -0.847085956440044920, -0.847059382585786610, --0.847032806613879920, -0.847006228524391220, -0.846979648317386810, -0.846953065992933410, -0.846926481551096840, -0.846899894991944620, -0.846873306315542580, -0.846846715521957340, --0.846820122611255170, -0.846793527583502790, -0.846766930438766610, -0.846740331177113110, -0.846713729798608710, -0.846687126303319990, -0.846660520691313030, -0.846633912962655220, --0.846607303117412720, -0.846580691155651820, -0.846554077077439240, -0.846527460882841030, -0.846500842571924710, -0.846474222144756210, -0.846447599601402030, -0.846420974941929030, --0.846394348166403470, -0.846367719274892070, -0.846341088267461460, -0.846314455144178020, -0.846287819905108480, -0.846261182550319010, -0.846234543079876890, -0.846207901493848500, --0.846181257792300360, -0.846154611975299060, -0.846127964042910800, -0.846101313995203050, -0.846074661832242110, -0.846048007554094370, -0.846021351160826660, -0.845994692652505710, --0.845968032029197900, -0.845941369290969970, -0.845914704437888740, -0.845888037470020620, -0.845861368387431980, -0.845834697190190440, -0.845808023878362070, -0.845781348452013690, --0.845754670911212040, -0.845727991256023600, -0.845701309486514670, -0.845674625602753080, -0.845647939604804780, -0.845621251492736700, -0.845594561266615470, -0.845567868926507930, --0.845541174472480560, -0.845514477904600440, -0.845487779222933940, -0.845461078427547590, -0.845434375518509080, -0.845407670495884610, -0.845380963359740890, -0.845354254110144750, --0.845327542747163040, -0.845300829270862030, -0.845274113681309450, -0.845247395978571460, -0.845220676162715010, -0.845193954233806940, -0.845167230191913980, -0.845140504037102840, --0.845113775769440580, -0.845087045388993820, -0.845060312895828950, -0.845033578290013800, -0.845006841571614650, -0.844980102740698460, -0.844953361797331940, -0.844926618741582150, --0.844899873573515150, -0.844873126293199110, -0.844846376900700190, -0.844819625396085350, -0.844792871779421420, -0.844766116050775340, -0.844739358210213950, -0.844712598257804090, --0.844685836193612820, -0.844659072017706960, -0.844632305730152910, -0.844605537331018620, -0.844578766820370470, -0.844551994198275420, -0.844525219464800300, -0.844498442620011720, --0.844471663663977520, -0.844444882596764200, -0.844418099418438590, -0.844391314129067760, -0.844364526728718650, -0.844337737217458200, -0.844310945595353470, -0.844284151862471300, --0.844257356018878860, -0.844230558064642420, -0.844203757999830160, -0.844176955824508470, -0.844150151538744400, -0.844123345142604900, -0.844096536636157020, -0.844069726019467390, --0.844042913292603950, -0.844016098455633190, -0.843989281508622180, -0.843962462451637970, -0.843935641284747630, -0.843908818008018090, -0.843881992621516640, -0.843855165125310110, --0.843828335519465230, -0.843801503804050060, -0.843774669979130980, -0.843747834044775270, -0.843720996001050110, -0.843694155848022320, -0.843667313585758750, -0.843640469214327230, --0.843613622733794700, -0.843586774144228000, -0.843559923445694420, -0.843533070638261000, -0.843506215721994910, -0.843479358696963330, -0.843452499563233320, -0.843425638320871580, --0.843398774969946310, -0.843371909510523990, -0.843345041942671900, -0.843318172266457220, -0.843291300481947110, -0.843264426589208300, -0.843237550588308960, -0.843210672479315580, --0.843183792262295670, -0.843156909937316180, -0.843130025504444490, -0.843103138963747670, -0.843076250315292990, -0.843049359559147730, -0.843022466695379060, -0.842995571724053820, --0.842968674645240060, -0.842941775459004620, -0.842914874165414770, -0.842887970764537700, -0.842861065256440220, -0.842834157641190520, -0.842807247918855530, -0.842780336089502310, --0.842753422153198370, -0.842726506110010760, -0.842699587960006990, -0.842672667703254110, -0.842645745339819730, -0.842618820869770910, -0.842591894293174490, -0.842564965610098860, --0.842538034820610850, -0.842511101924777740, -0.842484166922666920, -0.842457229814345570, -0.842430290599880730, -0.842403349279340690, -0.842376405852792160, -0.842349460320302780, --0.842322512681939580, -0.842295562937770190, -0.842268611087861880, -0.842241657132282050, -0.842214701071098080, -0.842187742904376920, -0.842160782632186740, -0.842133820254594710, --0.842106855771668110, -0.842079889183474430, -0.842052920490080960, -0.842025949691554750, -0.841998976787964090, -0.841972001779376030, -0.841945024665857970, -0.841918045447477280, --0.841891064124301590, -0.841864080696398060, -0.841837095163834540, -0.841810107526678180, -0.841783117784996040, -0.841756125938856630, -0.841729131988326880, -0.841702135933474320, --0.841675137774366420, -0.841648137511070700, -0.841621135143654220, -0.841594130672185250, -0.841567124096730960, -0.841540115417358960, -0.841513104634136640, -0.841486091747131510, --0.841459076756411180, -0.841432059662043150, -0.841405040464094920, -0.841378019162633660, -0.841350995757727870, -0.841323970249444610, -0.841296942637851260, -0.841269912923015670, --0.841242881105005340, -0.841215847183887750, -0.841188811159730100, -0.841161773032600870, -0.841134732802567230, -0.841107690469696690, -0.841080646034056970, -0.841053599495715680, --0.841026550854740430, -0.840999500111198620, -0.840972447265157740, -0.840945392316686190, -0.840918335265851140, -0.840891276112720190, -0.840864214857361180, -0.840837151499841510, --0.840810086040229000, -0.840783018478590830, -0.840755948814995600, -0.840728877049510490, -0.840701803182203110, -0.840674727213141290, -0.840647649142392650, -0.840620568970024910, --0.840593486696105780, -0.840566402320702790, -0.840539315843883420, -0.840512227265716280, -0.840485136586268440, -0.840458043805607850, -0.840430948923802210, -0.840403851940919040, --0.840376752857025840, -0.840349651672191330, -0.840322548386482570, -0.840295442999967500, -0.840268335512713740, -0.840241225924789230, -0.840214114236261580, -0.840187000447198740, --0.840159884557668320, -0.840132766567737720, -0.840105646477475650, -0.840078524286949620, -0.840051399996227130, -0.840024273605376240, -0.839997145114464550, -0.839970014523560020, --0.839942881832730030, -0.839915747042043300, -0.839888610151567240, -0.839861471161369670, -0.839834330071518310, -0.839807186882081220, -0.839780041593126140, -0.839752894204720880, --0.839725744716932950, -0.839698593129831190, -0.839671439443482880, -0.839644283657956070, -0.839617125773318480, -0.839589965789638070, -0.839562803706982770, -0.839535639525419990, --0.839508473245018540, -0.839481304865845930, -0.839454134387970120, -0.839426961811458930, -0.839399787136380300, -0.839372610362802200, -0.839345431490792660, -0.839318250520418970, --0.839291067451750190, -0.839263882284853710, -0.839236695019797590, -0.839209505656649650, -0.839182314195477950, -0.839155120636350560, -0.839127924979334750, -0.839100727224499690, --0.839073527371912760, -0.839046325421642040, -0.839019121373755560, -0.838991915228321280, -0.838964706985407150, -0.838937496645081220, -0.838910284207411650, -0.838883069672465840, --0.838855853040312850, -0.838828634311020170, -0.838801413484655980, -0.838774190561288210, -0.838746965540985050, -0.838719738423813870, -0.838692509209843840, -0.838665277899142580, --0.838638044491778150, -0.838610808987818590, -0.838583571387331970, -0.838556331690386460, -0.838529089897050110, -0.838501846007391080, -0.838474600021476890, -0.838447351939376690, --0.838420101761158220, -0.838392849486889410, -0.838365595116638440, -0.838338338650473470, -0.838311080088462780, -0.838283819430673760, -0.838256556677175800, -0.838229291828036290, --0.838202024883323740, -0.838174755843105970, -0.838147484707451370, -0.838120211476428120, -0.838092936150104270, -0.838065658728547660, -0.838038379211827330, -0.838011097600011020, --0.837983813893167010, -0.837956528091363450, -0.837929240194668630, -0.837901950203150610, -0.837874658116877340, -0.837847363935917850, -0.837820067660339900, -0.837792769290211960, --0.837765468825601880, -0.837738166266578270, -0.837710861613209180, -0.837683554865563010, -0.837656246023707360, -0.837628935087711630, -0.837601622057643550, -0.837574306933571490, --0.837546989715563630, -0.837519670403688240, -0.837492348998013720, -0.837465025498607800, -0.837437699905539850, -0.837410372218877600, -0.837383042438689440, -0.837355710565043650, --0.837328376598008630, -0.837301040537652640, -0.837273702384044080, -0.837246362137251340, -0.837219019797342030, -0.837191675364385770, -0.837164328838450380, -0.837136980219604030, --0.837109629507915340, -0.837082276703452480, -0.837054921806283490, -0.837027564816477660, -0.837000205734102940, -0.836972844559227710, -0.836945481291920370, -0.836918115932249300, --0.836890748480283000, -0.836863378936089750, -0.836836007299738170, -0.836808633571295980, -0.836781257750832670, -0.836753879838416310, -0.836726499834115180, -0.836699117737997880, --0.836671733550132690, -0.836644347270588230, -0.836616958899432440, -0.836589568436734710, -0.836562175882562990, -0.836534781236985880, -0.836507384500071890, -0.836479985671889300, --0.836452584752506830, -0.836425181741992870, -0.836397776640415590, -0.836370369447844150, -0.836342960164346950, -0.836315548789992260, -0.836288135324848800, -0.836260719768984860, --0.836233302122469160, -0.836205882385369750, -0.836178460557756130, -0.836151036639696370, -0.836123610631259060, -0.836096182532512610, -0.836068752343525730, -0.836041320064367040, --0.836013885695105040, -0.835986449235807780, -0.835959010686544880, -0.835931570047384500, -0.835904127318395250, -0.835876682499645530, -0.835849235591204160, -0.835821786593139770, --0.835794335505520400, -0.835766882328415670, -0.835739427061893750, -0.835711969706023240, -0.835684510260872760, -0.835657048726511140, -0.835629585103006780, -0.835602119390428500, --0.835574651588844920, -0.835547181698324200, -0.835519709718935970, -0.835492235650748590, -0.835464759493830480, -0.835437281248250560, -0.835409800914077460, -0.835382318491379340, --0.835354833980225920, -0.835327347380685370, -0.835299858692826520, -0.835272367916717990, -0.835244875052428500, -0.835217380100026880, -0.835189883059581750, -0.835162383931162040, --0.835134882714835710, -0.835107379410672810, -0.835079874018741400, -0.835052366539110300, -0.835024856971848250, -0.834997345317024080, -0.834969831574706610, -0.834942315744964030, --0.834914797827866150, -0.834887277823481270, -0.834859755731878210, -0.834832231553125800, -0.834804705287292670, -0.834777176934447970, -0.834749646494660210, -0.834722113967997890, --0.834694579354530730, -0.834667042654327120, -0.834639503867455890, -0.834611962993985990, -0.834584420033986140, -0.834556874987525180, -0.834529327854671600, -0.834501778635495130, --0.834474227330064270, -0.834446673938447850, -0.834419118460714700, -0.834391560896933780, -0.834364001247174030, -0.834336439511504270, -0.834308875689992790, -0.834281309782709650, --0.834253741789723340, -0.834226171711102580, -0.834198599546916440, -0.834171025297233750, -0.834143448962123560, -0.834115870541654260, -0.834088290035895690, -0.834060707444916450, --0.834033122768785380, -0.834005536007571660, -0.833977947161343990, -0.833950356230171440, -0.833922763214123060, -0.833895168113267690, -0.833867570927673940, -0.833839971657411750, --0.833812370302549730, -0.833784766863156720, -0.833757161339301780, -0.833729553731053840, -0.833701944038481630, -0.833674332261655100, -0.833646718400642640, -0.833619102455513410, --0.833591484426336460, -0.833563864313180860, -0.833536242116115430, -0.833508617835209460, -0.833480991470532010, -0.833453363022151560, -0.833425732490138180, -0.833398099874560480, --0.833370465175487520, -0.833342828392988340, -0.833315189527132240, -0.833287548577987590, -0.833259905545624570, -0.833232260430111780, -0.833204613231518290, -0.833176963949913360, --0.833149312585365950, -0.833121659137945230, -0.833094003607720460, -0.833066345994760590, -0.833038686299134470, -0.833011024520912020, -0.832983360660162100, -0.832955694716953630, --0.832928026691356130, -0.832900356583438420, -0.832872684393269890, -0.832845010120919050, -0.832817333766456280, -0.832789655329950200, -0.832761974811469850, -0.832734292211084750, --0.832706607528863720, -0.832678920764876370, -0.832651231919191550, -0.832623540991878190, -0.832595847983006570, -0.832568152892645190, -0.832540455720863550, -0.832512756467730710, --0.832485055133316050, -0.832457351717688640, -0.832429646220917420, -0.832401938643072550, -0.832374228984222860, -0.832346517244437640, -0.832318803423786060, -0.832291087522337490, --0.832263369540161220, -0.832235649477326530, -0.832207927333902700, -0.832180203109958550, -0.832152476805564370, -0.832124748420788980, -0.832097017955701790, -0.832069285410372060, --0.832041550784869080, -0.832013814079261670, -0.831986075293620340, -0.831958334428013700, -0.831930591482511360, -0.831902846457182490, -0.831875099352096470, -0.831847350167322700, --0.831819598902930560, -0.831791845558989440, -0.831764090135568180, -0.831736332632737270, -0.831708573050565450, -0.831680811389122200, -0.831653047648476920, -0.831625281828699100, --0.831597513929857480, -0.831569743952022660, -0.831541971895263470, -0.831514197759649300, -0.831486421545249650, -0.831458643252133920, -0.831430862880371600, -0.831403080430032190, --0.831375295901184970, -0.831347509293899110, -0.831319720608244880, -0.831291929844291460, -0.831264137002108110, -0.831236342081764450, -0.831208545083329970, -0.831180746006874080, --0.831152944852465940, -0.831125141620175810, -0.831097336310072880, -0.831069528922226630, -0.831041719456706460, -0.831013907913582090, -0.830986094292922920, -0.830958278594798540, --0.830930460819277910, -0.830902640966431630, -0.830874819036328870, -0.830846995029038910, -0.830819168944631480, -0.830791340783176180, -0.830763510544742510, -0.830735678229399640, --0.830707843837217960, -0.830680007368266750, -0.830652168822615500, -0.830624328200333830, -0.830596485501491340, -0.830568640726157550, -0.830540793874402270, -0.830512944946295020, --0.830485093941904840, -0.830457240861302460, -0.830429385704556930, -0.830401528471737980, -0.830373669162915220, -0.830345807778158250, -0.830317944317536250, -0.830290078781119930, --0.830262211168978360, -0.830234341481181250, -0.830206469717798430, -0.830178595878899310, -0.830150719964553700, -0.830122841974831330, -0.830094961909801920, -0.830067079769534530, --0.830039195554099880, -0.830011309263567370, -0.829983420898006470, -0.829955530457487160, -0.829927637942078910, -0.829899743351851020, -0.829871846686874410, -0.829843947947218050, --0.829816047132951980, -0.829788144244145710, -0.829760239280869060, -0.829732332243191760, -0.829704423131183750, -0.829676511944914650, -0.829648598684453730, -0.829620683349871820, --0.829592765941238210, -0.829564846458622720, -0.829536924902095070, -0.829509001271725110, -0.829481075567582660, -0.829453147789737000, -0.829425217938258960, -0.829397286013217940, --0.829369352014683650, -0.829341415942726030, -0.829313477797414820, -0.829285537578819950, -0.829257595287011260, -0.829229650922058030, -0.829201704484031190, -0.829173755973000140, --0.829145805389034600, -0.829117852732204620, -0.829089898002579930, -0.829061941200230580, -0.829033982325225850, -0.829006021377636680, -0.828978058357532350, -0.828950093264983030, --0.828922126100058440, -0.828894156862828520, -0.828866185553363110, -0.828838212171732370, -0.828810236718006020, -0.828782259192253680, -0.828754279594546060, -0.828726297924952780, --0.828698314183543780, -0.828670328370389010, -0.828642340485558400, -0.828614350529121470, -0.828586358501149150, -0.828558364401710930, -0.828530368230876780, -0.828502369988716740, --0.828474369675300750, -0.828446367290698870, -0.828418362834981050, -0.828390356308217330, -0.828362347710477120, -0.828334337041831680, -0.828306324302350290, -0.828278309492103240, --0.828250292611160340, -0.828222273659591670, -0.828194252637466820, -0.828166229544856860, -0.828138204381831280, -0.828110177148460250, -0.828082147844813820, -0.828054116470961940, --0.828026083026974780, -0.827998047512922390, -0.827970009928874930, -0.827941970274901910, -0.827913928551074490, -0.827885884757462280, -0.827857838894135330, -0.827829790961163710, --0.827801740958617690, -0.827773688886567330, -0.827745634745082230, -0.827717578534233560, -0.827689520254090930, -0.827661459904724510, -0.827633397486204460, -0.827605332998600840, --0.827577266441983930, -0.827549197816423890, -0.827521127121990330, -0.827493054358754420, -0.827464979526785880, -0.827436902626154880, -0.827408823656931690, -0.827380742619186370, --0.827352659512989200, -0.827324574338409890, -0.827296487095519730, -0.827268397784388210, -0.827240306405085830, -0.827212212957682660, -0.827184117442248850, -0.827156019858854900, --0.827127920207570750, -0.827099818488466370, -0.827071714701613000, -0.827043608847080280, -0.827015500924938580, -0.826987390935258080, -0.826959278878109050, -0.826931164753561990, --0.826903048561686390, -0.826874930302553660, -0.826846809976233720, -0.826818687582796640, -0.826790563122312920, -0.826762436594852710, -0.826734308000486420, -0.826706177339284420, --0.826678044611317000, -0.826649909816653870, -0.826621772955366540, -0.826593634027524730, -0.826565493033198930, -0.826537349972459310, -0.826509204845376270, -0.826481057652019850, --0.826452908392461220, -0.826424757066770320, -0.826396603675017440, -0.826368448217273180, -0.826340290693607700, -0.826312131104091630, -0.826283969448795120, -0.826255805727788780, --0.826227639941142340, -0.826199472088927300, -0.826171302171213600, -0.826143130188071620, -0.826114956139571870, -0.826086780025784730, -0.826058601846780590, -0.826030421602629520, --0.826002239293402770, -0.825974054919170530, -0.825945868480003180, -0.825917679975971100, -0.825889489407144790, -0.825861296773594770, -0.825833102075391510, -0.825804905312605090, --0.825776706485306770, -0.825748505593566720, -0.825720302637455440, -0.825692097617043430, -0.825663890532401190, -0.825635681383599110, -0.825607470170707460, -0.825579256893797520, --0.825551041552939460, -0.825522824148203880, -0.825494604679661180, -0.825466383147381970, -0.825438159551436850, -0.825409933891896210, -0.825381706168830330, -0.825353476382310710, --0.825325244532407300, -0.825297010619190810, -0.825268774642731850, -0.825240536603100930, -0.825212296500368650, -0.825184054334605180, -0.825155810105882010, -0.825127563814269330, --0.825099315459837720, -0.825071065042657930, -0.825042812562800320, -0.825014558020335850, -0.824986301415334910, -0.824958042747868100, -0.824929782018005820, -0.824901519225819560, --0.824873254371379480, -0.824844987454756320, -0.824816718476020670, -0.824788447435243150, -0.824760174332494040, -0.824731899167845060, -0.824703621941366260, -0.824675342653128470, --0.824647061303202310, -0.824618777891658490, -0.824590492418567740, -0.824562204884000670, -0.824533915288028220, -0.824505623630720330, -0.824477329912148950, -0.824449034132384350, --0.824420736291497040, -0.824392436389557950, -0.824364134426637700, -0.824335830402807220, -0.824307524318136590, -0.824279216172697620, -0.824250905966560700, -0.824222593699796450, --0.824194279372475690, -0.824165962984669380, -0.824137644536448000, -0.824109324027882620, -0.824081001459043390, -0.824052676830002050, -0.824024350140829200, -0.823996021391595330, --0.823967690582371510, -0.823939357713228350, -0.823911022784236890, -0.823882685795467420, -0.823854346746991650, -0.823826005638879980, -0.823797662471203340, -0.823769317244032570, --0.823740969957438510, -0.823712620611491970, -0.823684269206264030, -0.823655915741824730, -0.823627560218246240, -0.823599202635598830, -0.823570842993953330, -0.823542481293380810, --0.823514117533952090, -0.823485751715738120, -0.823457383838809180, -0.823429013903237310, -0.823400641909092900, -0.823372267856446900, -0.823343891745370260, -0.823315513575933800, --0.823287133348208690, -0.823258751062265650, -0.823230366718175730, -0.823201980316009440, -0.823173591855838720, -0.823145201337733940, -0.823116808761766180, -0.823088414128006370, --0.823060017436525570, -0.823031618687394270, -0.823003217880684420, -0.822974815016466410, -0.822946410094811510, -0.822918003115790440, -0.822889594079474480, -0.822861182985934470, --0.822832769835241560, -0.822804354627466710, -0.822775937362680400, -0.822747518040954810, -0.822719096662360430, -0.822690673226968320, -0.822662247734849420, -0.822633820186075000, --0.822605390580716020, -0.822576958918843080, -0.822548525200528240, -0.822520089425842090, -0.822491651594855710, -0.822463211707640140, -0.822434769764266550, -0.822406325764806100, --0.822377879709329850, -0.822349431597908300, -0.822320981430613720, -0.822292529207516720, -0.822264074928688360, -0.822235618594199910, -0.822207160204122320, -0.822178699758526750, --0.822150237257484040, -0.822121772701066230, -0.822093306089344060, -0.822064837422388450, -0.822036366700270920, -0.822007893923062390, -0.821979419090834160, -0.821950942203657280, --0.821922463261602680, -0.821893982264742310, -0.821865499213147110, -0.821837014106888030, -0.821808526946036460, -0.821780037730663550, -0.821751546460840700, -0.821723053136638290, --0.821694557758128830, -0.821666060325383030, -0.821637560838471950, -0.821609059297467080, -0.821580555702439490, -0.821552050053460550, -0.821523542350601430, -0.821495032593933530, --0.821466520783527550, -0.821438006919455790, -0.821409491001788950, -0.821380973030598320, -0.821352453005955390, -0.821323930927931210, -0.821295406796596850, -0.821266880612024350, --0.821238352374284660, -0.821209822083449170, -0.821181289739589040, -0.821152755342775760, -0.821124218893080520, -0.821095680390574790, -0.821067139835329750, -0.821038597227416460, --0.821010052566907180, -0.820981505853872750, -0.820952957088384560, -0.820924406270514000, -0.820895853400332330, -0.820867298477911180, -0.820838741503321150, -0.820810182476634840, --0.820781621397922990, -0.820753058267257200, -0.820724493084708740, -0.820695925850349010, -0.820667356564249490, -0.820638785226481480, -0.820610211837116130, -0.820581636396225720, --0.820553058903881190, -0.820524479360154050, -0.820495897765115670, -0.820467314118837550, -0.820438728421391210, -0.820410140672847450, -0.820381550873279020, -0.820352959022756510, --0.820324365121351650, -0.820295769169135940, -0.820267171166180750, -0.820238571112557710, -0.820209969008338200, -0.820181364853593280, -0.820152758648395430, -0.820124150392815610, --0.820095540086925530, -0.820066927730796590, -0.820038313324500280, -0.820009696868108210, -0.819981078361691430, -0.819952457805322330, -0.819923835199072190, -0.819895210543012510, --0.819866583837214670, -0.819837955081750500, -0.819809324276691400, -0.819780691422108960, -0.819752056518074810, -0.819723419564659990, -0.819694780561937120, -0.819666139509977350, --0.819637496408852200, -0.819608851258633360, -0.819580204059392250, -0.819551554811200230, -0.819522903514129820, -0.819494250168252170, -0.819465594773638890, -0.819436937330361600, --0.819408277838492020, -0.819379616298101740, -0.819350952709262390, -0.819322287072045690, -0.819293619386522680, -0.819264949652766190, -0.819236277870847300, -0.819207604040837700, --0.819178928162809130, -0.819150250236833190, -0.819121570262981710, -0.819092888241325760, -0.819064204171938040, -0.819035518054889940, -0.819006829890252970, -0.818978139678098960, --0.818949447418499510, -0.818920753111526460, -0.818892056757251630, -0.818863358355746080, -0.818834657907082650, -0.818805955411332500, -0.818777250868567560, -0.818748544278859460, --0.818719835642280010, -0.818691124958900950, -0.818662412228793660, -0.818633697452030740, -0.818604980628683590, -0.818576261758824030, -0.818547540842523790, -0.818518817879854700, --0.818490092870888590, -0.818461365815697170, -0.818432636714351960, -0.818403905566925550, -0.818375172373489450, -0.818346437134115370, -0.818317699848875260, -0.818288960517840840, --0.818260219141084040, -0.818231475718676160, -0.818202730250690120, -0.818173982737197210, -0.818145233178269480, -0.818116481573978540, -0.818087727924396440, -0.818058972229595010, --0.818030214489646190, -0.818001454704621820, -0.817972692874593290, -0.817943928999633530, -0.817915163079813930, -0.817886395115206440, -0.817857625105882890, -0.817828853051915440, --0.817800078953375250, -0.817771302810335390, -0.817742524622867230, -0.817713744391042830, -0.817684962114934020, -0.817656177794612750, -0.817627391430151170, -0.817598603021621020, --0.817569812569094450, -0.817541020072642730, -0.817512225532339040, -0.817483428948254760, -0.817454630320461950, -0.817425829649032430, -0.817397026934038480, -0.817368222175551940, --0.817339415373644300, -0.817310606528388610, -0.817281795639856480, -0.817252982708119860, -0.817224167733250680, -0.817195350715321120, -0.817166531654403230, -0.817137710550569050, --0.817108887403889980, -0.817080062214439180, -0.817051234982288380, -0.817022405707509390, -0.816993574390174390, -0.816964741030355430, -0.816935905628124680, -0.816907068183553630, --0.816878228696715450, -0.816849387167681630, -0.816820543596524340, -0.816791697983315750, -0.816762850328127900, -0.816734000631032960, -0.816705148892102990, -0.816676295111409600, --0.816647439289026060, -0.816618581425023860, -0.816589721519475180, -0.816560859572452280, -0.816531995584027230, -0.816503129554272070, -0.816474261483258630, -0.816445391371060090, --0.816416519217748050, -0.816387645023394780, -0.816358768788072340, -0.816329890511852900, -0.816301010194808830, -0.816272127837012200, -0.816243243438535270, -0.816214356999449770, --0.816185468519828870, -0.816156577999744170, -0.816127685439268170, -0.816098790838472920, -0.816069894197430590, -0.816040995516213120, -0.816012094794893670, -0.815983192033543970, --0.815954287232236290, -0.815925380391042900, -0.815896471510036080, -0.815867560589288000, -0.815838647628871150, -0.815809732628857590, -0.815780815589319140, -0.815751896510329200, --0.815722975391959590, -0.815694052234282490, -0.815665127037370260, -0.815636199801295200, -0.815607270526129140, -0.815578339211945450, -0.815549405858815860, -0.815520470466812860, --0.815491533036008520, -0.815462593566475440, -0.815433652058285880, -0.815404708511512140, -0.815375762926226710, -0.815346815302501300, -0.815317865640409420, -0.815288913940022790, --0.815259960201414000, -0.815231004424655240, -0.815202046609818880, -0.815173086756977530, -0.815144124866202910, -0.815115160937568530, -0.815086194971146210, -0.815057226967008330, --0.815028256925227510, -0.814999284845875920, -0.814970310729026260, -0.814941334574750710, -0.814912356383121320, -0.814883376154211690, -0.814854393888093440, -0.814825409584839290, --0.814796423244521620, -0.814767434867212930, -0.814738444452985600, -0.814709452001911580, -0.814680457514064590, -0.814651460989516350, -0.814622462428339470, -0.814593461830606440, --0.814564459196389870, -0.814535454525762040, -0.814506447818795550, -0.814477439075562910, -0.814448428296136280, -0.814419415480589050, -0.814390400628993260, -0.814361383741421530, --0.814332364817946240, -0.814303343858640120, -0.814274320863575100, -0.814245295832824790, -0.814216268766461250, -0.814187239664556970, -0.814158208527184680, -0.814129175354416870, --0.814100140146326030, -0.814071102902984900, -0.814042063624466070, -0.814013022310841490, -0.813983978962184880, -0.813954933578568300, -0.813925886160064450, -0.813896836706745840, --0.813867785218685190, -0.813838731695954550, -0.813809676138627540, -0.813780618546776410, -0.813751558920473680, -0.813722497259792070, -0.813693433564804170, -0.813664367835582710, --0.813635300072200420, -0.813606230274729780, -0.813577158443243080, -0.813548084577814020, -0.813519008678514680, -0.813489930745417980, -0.813460850778596310, -0.813431768778122510, --0.813402684744069290, -0.813373598676508940, -0.813344510575515050, -0.813315420441159900, -0.813286328273516100, -0.813257234072656600, -0.813228137838654000, -0.813199039571581020, --0.813169939271510490, -0.813140836938514580, -0.813111732572667000, -0.813082626174040150, -0.813053517742706840, -0.813024407278739590, -0.812995294782211440, -0.812966180253194890, --0.812937063691762550, -0.812907945097987920, -0.812878824471943600, -0.812849701813702090, -0.812820577123336330, -0.812791450400919160, -0.812762321646523400, -0.812733190860221780, --0.812704058042087120, -0.812674923192191920, -0.812645786310609910, -0.812616647397413350, -0.812587506452675300, -0.812558363476468370, -0.812529218468865610, -0.812500071429939190, --0.812470922359763150, -0.812441771258409880, -0.812412618125952110, -0.812383462962462780, -0.812354305768014820, -0.812325146542681180, -0.812295985286534570, -0.812266821999648060, --0.812237656682093910, -0.812208489333946180, -0.812179319955277260, -0.812150148546159970, -0.812120975106667250, -0.812091799636872170, -0.812062622136847100, -0.812033442606665990, --0.812004261046401330, -0.811975077456125850, -0.811945891835912810, -0.811916704185835060, -0.811887514505965410, -0.811858322796377040, -0.811829129057143000, -0.811799933288335440, --0.811770735490028650, -0.811741535662295010, -0.811712333805207460, -0.811683129918839170, -0.811653924003262970, -0.811624716058552020, -0.811595506084778820, -0.811566294082017300, --0.811537080050340090, -0.811507863989820110, -0.811478645900530430, -0.811449425782544310, -0.811420203635934480, -0.811390979460774210, -0.811361753257135890, -0.811332525025093790, --0.811303294764720410, -0.811274062476088690, -0.811244828159271790, -0.811215591814342880, -0.811186353441375130, -0.811157113040440800, -0.811127870611614290, -0.811098626154968080, --0.811069379670575240, -0.811040131158509040, -0.811010880618842410, -0.810981628051648640, -0.810952373457000890, -0.810923116834971540, -0.810893858185635090, -0.810864597509063810, --0.810835334805331100, -0.810806070074510110, -0.810776803316673900, -0.810747534531895630, -0.810718263720248130, -0.810688990881805350, -0.810659716016640220, -0.810630439124825690, --0.810601160206435130, -0.810571879261541730, -0.810542596290218520, -0.810513311292538900, -0.810484024268575910, -0.810454735218402390, -0.810425444142092610, -0.810396151039719070, --0.810366855911355270, -0.810337558757074360, -0.810308259576949520, -0.810278958371053460, -0.810249655139460570, -0.810220349882243450, -0.810191042599475610, -0.810161733291230090, --0.810132421957580170, -0.810103108598599240, -0.810073793214360570, -0.810044475804937440, -0.810015156370402560, -0.809985834910830320, -0.809956511426293550, -0.809927185916865410, --0.809897858382619300, -0.809868528823628590, -0.809839197239966560, -0.809809863631706040, -0.809780527998921310, -0.809751190341685300, -0.809721850660071300, -0.809692508954152790, --0.809663165224002830, -0.809633819469695040, -0.809604471691302670, -0.809575121888898690, -0.809545770062557350, -0.809516416212351600, -0.809487060338354820, -0.809457702440640410, --0.809428342519281640, -0.809398980574352110, -0.809369616605924550, -0.809340250614073550, -0.809310882598871850, -0.809281512560392930, -0.809252140498710300, -0.809222766413897340, --0.809193390306027440, -0.809164012175173970, -0.809134632021410010, -0.809105249844810030, -0.809075865645446870, -0.809046479423394030, -0.809017091178725110, -0.808987700911513400, --0.808958308621832380, -0.808928914309755110, -0.808899517975356090, -0.808870119618708250, -0.808840719239885100, -0.808811316838960240, -0.808781912416006940, -0.808752505971099040, --0.808723097504309710, -0.808693687015712760, -0.808664274505381030, -0.808634859973389130, -0.808605443419810000, -0.808576024844717360, -0.808546604248184700, -0.808517181630285410, --0.808487756991092650, -0.808458330330681150, -0.808428901649123730, -0.808399470946494000, -0.808370038222865680, -0.808340603478312270, -0.808311166712907370, -0.808281727926724480, --0.808252287119837320, -0.808222844292318940, -0.808193399444243840, -0.808163952575685410, -0.808134503686717020, -0.808105052777412400, -0.808075599847845050, -0.808046144898088790, --0.808016687928216680, -0.807987228938303330, -0.807957767928421890, -0.807928304898646090, -0.807898839849049420, -0.807869372779705720, -0.807839903690688590, -0.807810432582071640, --0.807780959453928250, -0.807751484306332810, -0.807722007139358710, -0.807692527953079660, -0.807663046747569170, -0.807633563522901170, -0.807604078279149150, -0.807574591016386510, --0.807545101734687960, -0.807515610434126560, -0.807486117114776140, -0.807456621776710400, -0.807427124420003190, -0.807397625044728120, -0.807368123650959000, -0.807338620238769120, --0.807309114808233090, -0.807279607359424390, -0.807250097892416530, -0.807220586407283560, -0.807191072904098970, -0.807161557382936820, -0.807132039843870270, -0.807102520286974160, --0.807072998712321630, -0.807043475119986640, -0.807013949510043020, -0.806984421882564470, -0.806954892237624950, -0.806925360575298070, -0.806895826895657860, -0.806866291198777620, --0.806836753484732050, -0.806807213753594770, -0.806777672005439260, -0.806748128240339700, -0.806718582458369800, -0.806689034659602840, -0.806659484844113870, -0.806629933011976270, --0.806600379163263770, -0.806570823298050300, -0.806541265416409690, -0.806511705518416110, -0.806482143604143160, -0.806452579673664790, -0.806423013727054610, -0.806393445764387320, --0.806363875785736430, -0.806334303791175770, -0.806304729780779490, -0.806275153754621330, -0.806245575712775220, -0.806215995655314770, -0.806186413582314800, -0.806156829493848810, --0.806127243389990640, -0.806097655270814450, -0.806068065136394170, -0.806038472986803640, -0.806008878822117030, -0.805979282642407590, -0.805949684447750500, -0.805920084238219260, --0.805890482013887690, -0.805860877774830060, -0.805831271521120110, -0.805801663252832090, -0.805772052970039290, -0.805742440672816970, -0.805712826361238420, -0.805683210035377910, --0.805653591695309370, -0.805623971341106860, -0.805594348972844430, -0.805564724590596030, -0.805535098194435360, -0.805505469784437490, -0.805475839360675900, -0.805446206923224770, --0.805416572472158030, -0.805386936007549960, -0.805357297529474490, -0.805327657038005350, -0.805298014533217480, -0.805268370015184590, -0.805238723483980840, -0.805209074939680190, --0.805179424382356900, -0.805149771812085020, -0.805120117228938730, -0.805090460632992170, -0.805060802024318960, -0.805031141402994250, -0.805001478769091670, -0.804971814122685370, --0.804942147463849510, -0.804912478792658370, -0.804882808109185440, -0.804853135413506000, -0.804823460705693880, -0.804793783985822910, -0.804764105253967580, -0.804734424510201940, --0.804704741754600270, -0.804675056987236740, -0.804645370208185610, -0.804615681417520490, -0.804585990615316660, -0.804556297801647950, -0.804526602976588400, -0.804496906140212410, --0.804467207292594130, -0.804437506433807850, -0.804407803563927160, -0.804378098683027560, -0.804348391791182780, -0.804318682888466970, -0.804288971974954530, -0.804259259050719490, --0.804229544115836470, -0.804199827170379520, -0.804170108214422470, -0.804140387248040710, -0.804110664271307950, -0.804080939284298470, -0.804051212287086760, -0.804021483279746980, --0.803991752262353420, -0.803962019234980010, -0.803932284197702130, -0.803902547150593500, -0.803872808093728410, -0.803843067027181450, -0.803813323951026780, -0.803783578865338690, --0.803753831770191770, -0.803724082665659760, -0.803694331551818020, -0.803664578428740390, -0.803634823296501380, -0.803605066155175350, -0.803575307004836590, -0.803545545845559590, --0.803515782677418300, -0.803486017500487870, -0.803456250314842580, -0.803426481120556590, -0.803396709917704400, -0.803366936706360390, -0.803337161486599170, -0.803307384258494910, --0.803277605022122200, -0.803247823777555100, -0.803218040524868780, -0.803188255264137400, -0.803158467995435440, -0.803128678718837310, -0.803098887434417490, -0.803069094142249920, --0.803039298842410100, -0.803009501534972080, -0.802979702220010250, -0.802949900897599210, -0.802920097567813460, -0.802890292230727390, -0.802860484886415590, -0.802830675534952580, --0.802800864176412390, -0.802771050810870520, -0.802741235438401040, -0.802711418059078530, -0.802681598672977390, -0.802651777280172340, -0.802621953880737760, -0.802592128474747810, --0.802562301062278110, -0.802532471643402580, -0.802502640218195950, -0.802472806786732720, -0.802442971349087380, -0.802413133905334640, -0.802383294455549120, -0.802353452999804760, --0.802323609538177380, -0.802293764070740930, -0.802263916597570130, -0.802234067118739460, -0.802204215634323650, -0.802174362144397300, -0.802144506649034470, -0.802114649148310990, --0.802084789642300790, -0.802054928131078700, -0.802025064614719340, -0.801995199093297200, -0.801965331566887100, -0.801935462035563650, -0.801905590499401020, -0.801875716958475040, --0.801845841412859640, -0.801815963862629650, -0.801786084307859800, -0.801756202748624800, -0.801726319184999260, -0.801696433617057340, -0.801666546044874860, -0.801636656468526000, --0.801606764888085580, -0.801576871303628200, -0.801546975715228700, -0.801517078122961690, -0.801487178526901990, -0.801457276927124320, -0.801427373323702950, -0.801397467716713720, --0.801367560106230780, -0.801337650492328970, -0.801307738875083000, -0.801277825254567700, -0.801247909630857350, -0.801217992004027660, -0.801188072374153130, -0.801158150741308250, --0.801128227105568080, -0.801098301467007450, -0.801068373825700950, -0.801038444181723430, -0.801008512535149930, -0.800978578886054620, -0.800948643234513310, -0.800918705580600410, --0.800888765924390840, -0.800858824265959330, -0.800828880605380710, -0.800798934942729800, -0.800768987278081210, -0.800739037611510550, -0.800709085943092310, -0.800679132272901440, --0.800649176601012650, -0.800619218927500990, -0.800589259252441290, -0.800559297575908380, -0.800529333897976650, -0.800499368218722250, -0.800469400538219360, -0.800439430856543010, --0.800409459173768050, -0.800379485489969400, -0.800349509805222010, -0.800319532119600390, -0.800289552433180450, -0.800259570746036710, -0.800229587058243990, -0.800199601369877220, --0.800169613681011470, -0.800139623991721780, -0.800109632302082980, -0.800079638612169570, -0.800049642922057600, -0.800019645231821560, -0.799989645541536290, -0.799959643851277050, --0.799929640161118670, -0.799899634471136100, -0.799869626781403940, -0.799839617091998250, -0.799809605402993620, -0.799779591714464890, -0.799749576026487110, -0.799719558339135550, --0.799689538652484930, -0.799659516966610530, -0.799629493281587390, -0.799599467597489900, -0.799569439914394330, -0.799539410232375180, -0.799509378551507500, -0.799479344871866340, --0.799449309193526860, -0.799419271516563560, -0.799389231841052590, -0.799359190167068470, -0.799329146494686450, -0.799299100823981590, -0.799269053155028940, -0.799239003487903670, --0.799208951822680920, -0.799178898159435770, -0.799148842498242810, -0.799118784839178310, -0.799088725182316880, -0.799058663527733580, -0.799028599875503680, -0.798998534225702220, --0.798968466578403920, -0.798938396933684960, -0.798908325291620040, -0.798878251652284320, -0.798848176015752980, -0.798818098382101160, -0.798788018751404040, -0.798757937123736990, --0.798727853499175080, -0.798697767877792900, -0.798667680259666950, -0.798637590644871720, -0.798607499033482600, -0.798577405425574650, -0.798547309821223240, -0.798517212220503540, --0.798487112623490260, -0.798457011030259680, -0.798426907440886620, -0.798396801855446370, -0.798366694274013970, -0.798336584696664910, -0.798306473123474470, -0.798276359554517700, --0.798246243989869650, -0.798216126429606380, -0.798186006873802920, -0.798155885322534340, -0.798125761775876130, -0.798095636233903450, -0.798065508696691680, -0.798035379164315660, --0.798005247636851660, -0.797975114114374610, -0.797944978596959680, -0.797914841084682360, -0.797884701577618040, -0.797854560075841770, -0.797824416579429260, -0.797794271088455690, --0.797764123602995760, -0.797733974123126190, -0.797703822648921700, -0.797673669180457570, -0.797643513717809280, -0.797613356261052340, -0.797583196810261350, -0.797553035365512920, --0.797522871926881870, -0.797492706494443700, -0.797462539068273690, -0.797432369648447440, -0.797402198235040220, -0.797372024828127410, -0.797341849427784630, -0.797311672034086700, --0.797281492647110120, -0.797251311266929830, -0.797221127893621210, -0.797190942527259860, -0.797160755167921060, -0.797130565815679870, -0.797100374470612770, -0.797070181132794710, --0.797039985802301290, -0.797009788479207890, -0.796979589163589910, -0.796949387855523160, -0.796919184555082700, -0.796888979262344480, -0.796858771977383200, -0.796828562700275470, --0.796798351431096450, -0.796768138169921420, -0.796737922916826100, -0.796707705671885980, -0.796677486435176660, -0.796647265206772980, -0.796617041986751760, -0.796586816775187940, --0.796556589572157030, -0.796526360377734610, -0.796496129191996300, -0.796465896015017720, -0.796435660846874340, -0.796405423687641330, -0.796375184537395310, -0.796344943396211310, --0.796314700264164950, -0.796284455141331840, -0.796254208027787570, -0.796223958923607760, -0.796193707828867560, -0.796163454743643690, -0.796133199668011100, -0.796102942602045500, --0.796072683545822500, -0.796042422499417920, -0.796012159462907260, -0.795981894436366130, -0.795951627419870240, -0.795921358413494870, -0.795891087417316510, -0.795860814431410550, --0.795830539455852470, -0.795800262490718110, -0.795769983536083080, -0.795739702592022540, -0.795709419658613190, -0.795679134735930440, -0.795648847824049770, -0.795618558923047000, --0.795588268032997760, -0.795557975153977970, -0.795527680286063130, -0.795497383429329190, -0.795467084583851290, -0.795436783749706060, -0.795406480926968970, -0.795376176115715650, --0.795345869316021910, -0.795315560527963480, -0.795285249751615630, -0.795254936987055180, -0.795224622234357410, -0.795194305493598150, -0.795163986764853000, -0.795133666048197910, --0.795103343343708690, -0.795073018651461070, -0.795042691971530990, -0.795012363303993610, -0.794982032648925750, -0.794951700006402920, -0.794921365376500820, -0.794891028759295290, --0.794860690154862160, -0.794830349563277360, -0.794800006984616170, -0.794769662418955410, -0.794739315866370590, -0.794708967326937410, -0.794678616800731820, -0.794648264287829750, --0.794617909788306930, -0.794587553302239400, -0.794557194829702440, -0.794526834370772980, -0.794496471925526530, -0.794466107494038900, -0.794435741076385930, -0.794405372672643550, --0.794375002282887820, -0.794344629907194120, -0.794314255545639280, -0.794283879198298790, -0.794253500865248710, -0.794223120546564740, -0.794192738242323060, -0.794162353952599490, --0.794131967677470070, -0.794101579417010760, -0.794071189171296930, -0.794040796940405640, -0.794010402724412370, -0.793980006523393070, -0.793949608337423780, -0.793919208166580570, --0.793888806010938700, -0.793858401870575330, -0.793827995745565950, -0.793797587635986620, -0.793767177541913280, -0.793736765463422090, -0.793706351400588870, -0.793675935353489900, --0.793645517322201010, -0.793615097306797800, -0.793584675307357430, -0.793554251323955300, -0.793523825356667540, -0.793493397405570230, -0.793462967470739520, -0.793432535552250790, --0.793402101650181210, -0.793371665764606380, -0.793341227895602460, -0.793310788043245510, -0.793280346207611450, -0.793249902388776570, -0.793219456586817030, -0.793189008801808760, --0.793158559033827370, -0.793128107282950250, -0.793097653549252770, -0.793067197832811210, -0.793036740133701620, -0.793006280452000170, -0.792975818787783120, -0.792945355141125850, --0.792914889512105870, -0.792884421900798550, -0.792853952307280290, -0.792823480731627010, -0.792793007173915100, -0.792762531634220720, -0.792732054112619930, -0.792701574609188440, --0.792671093124003630, -0.792640609657141120, -0.792610124208676940, -0.792579636778687590, -0.792549147367249130, -0.792518655974437710, -0.792488162600329170, -0.792457667245000770, --0.792427169908528240, -0.792396670590987730, -0.792366169292455510, -0.792335666013007980, -0.792305160752721170, -0.792274653511671590, -0.792244144289934730, -0.792213633087588080, --0.792183119904707360, -0.792152604741368730, -0.792122087597648680, -0.792091568473623500, -0.792061047369369220, -0.792030524284961900, -0.791999999220478810, -0.791969472175995670, --0.791938943151588860, -0.791908412147334760, -0.791877879163309650, -0.791847344199589690, -0.791816807256251480, -0.791786268333371180, -0.791755727431024740, -0.791725184549289530, --0.791694639688241280, -0.791664092847956470, -0.791633544028511490, -0.791602993229982620, -0.791572440452445680, -0.791541885695978160, -0.791511328960656010, -0.791480770246555500, --0.791450209553753000, -0.791419646882325020, -0.791389082232347940, -0.791358515603898250, -0.791327946997052110, -0.791297376411885580, -0.791266803848476250, -0.791236229306899850, --0.791205652787232870, -0.791175074289551810, -0.791144493813933040, -0.791113911360453060, -0.791083326929187700, -0.791052740520214570, -0.791022152133609600, -0.790991561769449290, --0.790960969427810020, -0.790930375108768400, -0.790899778812400810, -0.790869180538783740, -0.790838580287993140, -0.790807978060106720, -0.790777373855200310, -0.790746767673350500, --0.790716159514633700, -0.790685549379126610, -0.790654937266905500, -0.790624323178046650, -0.790593707112627440, -0.790563089070724030, -0.790532469052412920, -0.790501847057770490, --0.790471223086873560, -0.790440597139798640, -0.790409969216622100, -0.790379339317420100, -0.790348707442270370, -0.790318073591248840, -0.790287437764432110, -0.790256799961896790, --0.790226160183719490, -0.790195518429976710, -0.790164874700744700, -0.790134228996100970, -0.790103581316121680, -0.790072931660883440, -0.790042280030462950, -0.790011626424936720, --0.789980970844381350, -0.789950313288873660, -0.789919653758490050, -0.789888992253306890, -0.789858328773401790, -0.789827663318850790, -0.789796995889730620, -0.789766326486118110, --0.789735655108089630, -0.789704981755721570, -0.789674306429091530, -0.789643629128275680, -0.789612949853350840, -0.789582268604393620, -0.789551585381480740, -0.789520900184688900, --0.789490213014094720, -0.789459523869775140, -0.789428832751806090, -0.789398139660265620, -0.789367444595229670, -0.789336747556775190, -0.789306048544978880, -0.789275347559917350, --0.789244644601667540, -0.789213939670305510, -0.789183232765909180, -0.789152523888554840, -0.789121813038319080, -0.789091100215278840, -0.789060385419510850, -0.789029668651091920, --0.788998949910098780, -0.788968229196607810, -0.788937506510696720, -0.788906781852441900, -0.788876055221920060, -0.788845326619208140, -0.788814596044382870, -0.788783863497521160, --0.788753128978699200, -0.788722392487995030, -0.788691654025484800, -0.788660913591245460, -0.788630171185353830, -0.788599426807886860, -0.788568680458921260, -0.788537932138533960, --0.788507181846801240, -0.788476429583801150, -0.788445675349609960, -0.788414919144304620, -0.788384160967962040, -0.788353400820658970, -0.788322638702472430, -0.788291874613478720, --0.788261108553755860, -0.788230340523380260, -0.788199570522428840, -0.788168798550978430, -0.788138024609106090, -0.788107248696888640, -0.788076470814403020, -0.788045690961726280, --0.788014909138934790, -0.787984125346106510, -0.787953339583318040, -0.787922551850646080, -0.787891762148167810, -0.787860970475960150, -0.787830176834099500, -0.787799381222663910, --0.787768583641729970, -0.787737784091374520, -0.787706982571674600, -0.787676179082707150, -0.787645373624549340, -0.787614566197278100, -0.787583756800970370, -0.787552945435702870, --0.787522132101553420, -0.787491316798598630, -0.787460499526915550, -0.787429680286581220, -0.787398859077672820, -0.787368035900267160, -0.787337210754440850, -0.787306383640272060, --0.787275554557837380, -0.787244723507213750, -0.787213890488478340, -0.787183055501708200, -0.787152218546980360, -0.787121379624372120, -0.787090538733959840, -0.787059695875821700, --0.787028851050034280, -0.786998004256674880, -0.786967155495820300, -0.786936304767547950, -0.786905452071934740, -0.786874597409057520, -0.786843740778994220, -0.786812882181821550, --0.786782021617616790, -0.786751159086456870, -0.786720294588419080, -0.786689428123580560, -0.786658559692018480, -0.786627689293809440, -0.786596816929031830, -0.786565942597762020, --0.786535066300077410, -0.786504188036055150, -0.786473307805772400, -0.786442425609306440, -0.786411541446733750, -0.786380655318132840, -0.786349767223580300, -0.786318877163153300, --0.786287985136929100, -0.786257091144984990, -0.786226195187398110, -0.786195297264245860, -0.786164397375605170, -0.786133495521553090, -0.786102591702167790, -0.786071685917525960, --0.786040778167705010, -0.786009868452781980, -0.785978956772834360, -0.785948043127938760, -0.785917127518173660, -0.785886209943615690, -0.785855290404342210, -0.785824368900430500, --0.785793445431957950, -0.785762519999001710, -0.785731592601639160, -0.785700663239947580, -0.785669731914003910, -0.785638798623886410, -0.785607863369671920, -0.785576926151437700, --0.785545986969261260, -0.785515045823219850, -0.785484102713390750, -0.785453157639850910, -0.785422210602678690, -0.785391261601951050, -0.785360310637745140, -0.785329357710138450, --0.785298402819208490, -0.785267445965032400, -0.785236487147687680, -0.785205526367251270, -0.785174563623801560, -0.785143598917415480, -0.785112632248170290, -0.785081663616143620, --0.785050693021412730, -0.785019720464055220, -0.784988745944147800, -0.784957769461768980, -0.784926791016995810, -0.784895810609905650, -0.784864828240576020, -0.784833843909084280, --0.784802857615507940, -0.784771869359924380, -0.784740879142410640, -0.784709886963045330, -0.784678892821905280, -0.784647896719067980, -0.784616898654610820, -0.784585898628611610, --0.784554896641147530, -0.784523892692295720, -0.784492886782134690, -0.784461878910741480, -0.784430869078193480, -0.784399857284568400, -0.784368843529943630, -0.784337827814396760, --0.784306810138005290, -0.784275790500846840, -0.784244768902998430, -0.784213745344538580, -0.784182719825544330, -0.784151692346093280, -0.784120662906263030, -0.784089631506131200, --0.784058598145774610, -0.784027562825272200, -0.783996525544700780, -0.783965486304138090, -0.783934445103661730, -0.783903401943349180, -0.783872356823278160, -0.783841309743526170, --0.783810260704171040, -0.783779209705289580, -0.783748156746960740, -0.783717101829261580, -0.783686044952269570, -0.783654986116062440, -0.783623925320717780, -0.783592862566313440, --0.783561797852926230, -0.783530731180635210, -0.783499662549517310, -0.783468591959650350, -0.783437519411111840, -0.783406444903979480, -0.783375368438331110, -0.783344290014244220, --0.783313209631796070, -0.783282127291065500, -0.783251042992129550, -0.783219956735066060, -0.783188868519952620, -0.783157778346867060, -0.783126686215886990, -0.783095592127089790, --0.783064496080554060, -0.783033398076357080, -0.783002298114576560, -0.782971196195290430, -0.782940092318576200, -0.782908986484511790, -0.782877878693174930, -0.782846768944642780, --0.782815657238994270, -0.782784543576306670, -0.782753427956657590, -0.782722310380125070, -0.782691190846786730, -0.782660069356720390, -0.782628945910003320, -0.782597820506714450, --0.782566693146931060, -0.782535563830730860, -0.782504432558191800, -0.782473299329391690, -0.782442164144408260, -0.782411027003319440, -0.782379887906203160, -0.782348746853136490, --0.782317603844198570, -0.782286458879466570, -0.782255311959018430, -0.782224163082932080, -0.782193012251285350, -0.782161859464155400, -0.782130704721621490, -0.782099548023760690, --0.782068389370651150, -0.782037228762370470, -0.782006066198996930, -0.781974901680608010, -0.781943735207282000, -0.781912566779096600, -0.781881396396129190, -0.781850224058458940, --0.781819049766163010, -0.781787873519319550, -0.781756695318006400, -0.781725515162301490, -0.781694333052282750, -0.781663148988027690, -0.781631962969615230, -0.781600774997122880, --0.781569585070628680, -0.781538393190210460, -0.781507199355946260, -0.781476003567914130, -0.781444805826191800, -0.781413606130857090, -0.781382404481988810, -0.781351200879664590, --0.781319995323962350, -0.781288787814960140, -0.781257578352735900, -0.781226366937367800, -0.781195153568933210, -0.781163938247511180, -0.781132720973179430, -0.781101501746015890, --0.781070280566098510, -0.781039057433505430, -0.781007832348314720, -0.780976605310604530, -0.780945376320452130, -0.780914145377936910, -0.780882912483136350, -0.780851677636128510, --0.780820440836991430, -0.780789202085803270, -0.780757961382642090, -0.780726718727585480, -0.780695474120712610, -0.780664227562100970, -0.780632979051828820, -0.780601728589974340, --0.780570476176615460, -0.780539221811830330, -0.780507965495697230, -0.780476707228294100, -0.780445447009698760, -0.780414184839990370, -0.780382920719246420, -0.780351654647545300, --0.780320386624964950, -0.780289116651583630, -0.780257844727478940, -0.780226570852730280, -0.780195295027415140, -0.780164017251611770, -0.780132737525398360, -0.780101455848853150, --0.780070172222054210, -0.780038886645079920, -0.780007599118008320, -0.779976309640917240, -0.779945018213885950, -0.779913724836992060, -0.779882429510313950, -0.779851132233929660, --0.779819833007917570, -0.779788531832355410, -0.779757228707322450, -0.779725923632896390, -0.779694616609155510, -0.779663307636178080, -0.779631996714042490, -0.779600683842826770, --0.779569369022609430, -0.779538052253468620, -0.779506733535482170, -0.779475412868729340, -0.779444090253288090, -0.779412765689236560, -0.779381439176653150, -0.779350110715616110, --0.779318780306203830, -0.779287447948494030, -0.779256113642566190, -0.779224777388497940, -0.779193439186367850, -0.779162099036254220, -0.779130756938235300, -0.779099412892389380, --0.779068066898795040, -0.779036718957530020, -0.779005369068673680, -0.778974017232303860, -0.778942663448499050, -0.778911307717337630, -0.778879950038897870, -0.778848590413258270, --0.778817228840496640, -0.778785865320692490, -0.778754499853923750, -0.778723132440268690, -0.778691763079805810, -0.778660391772613480, -0.778629018518770200, -0.778597643318354460, --0.778566266171444420, -0.778534887078118350, -0.778503506038455530, -0.778472123052533990, -0.778440738120432020, -0.778409351242228320, -0.778377962418001280, -0.778346571647828610, --0.778315178931790250, -0.778283784269963810, -0.778252387662427990, -0.778220989109261190, -0.778189588610541880, -0.778158186166348690, -0.778126781776759870, -0.778095375441854250, --0.778063967161709560, -0.778032556936405490, -0.778001144766020110, -0.777969730650631800, -0.777938314590319150, -0.777906896585160770, -0.777875476635234600, -0.777844054740620240, --0.777812630901395850, -0.777781205117639820, -0.777749777389430740, -0.777718347716847220, -0.777686916099967870, -0.777655482538871180, -0.777624047033635860, -0.777592609584339840, --0.777561170191062740, -0.777529728853882830, -0.777498285572878590, -0.777466840348128630, -0.777435393179711550, -0.777403944067706080, -0.777372493012190020, -0.777341040013243450, --0.777309585070944160, -0.777278128185371010, -0.777246669356602470, -0.777215208584717270, -0.777183745869794000, -0.777152281211911490, -0.777120814611147680, -0.777089346067582290, --0.777057875581293580, -0.777026403152360270, -0.776994928780860850, -0.776963452466874150, -0.776931974210478880, -0.776900494011752980, -0.776869011870776500, -0.776837527787627490, --0.776806041762384660, -0.776774553795126720, -0.776743063885932280, -0.776711572034880280, -0.776680078242049430, -0.776648582507518340, -0.776617084831365160, -0.776585585213669830, --0.776554083654510620, -0.776522580153966140, -0.776491074712115200, -0.776459567329036650, -0.776428058004808520, -0.776396546739510860, -0.776365033533221840, -0.776333518386020270, --0.776302001297984880, -0.776270482269194480, -0.776238961299727800, -0.776207438389663770, -0.776175913539081220, -0.776144386748058190, -0.776112858016674840, -0.776081327345009340, --0.776049794733140510, -0.776018260181147280, -0.775986723689108260, -0.775955185257101940, -0.775923644885208260, -0.775892102573505380, -0.775860558322072240, -0.775829012130987760, --0.775797464000330780, -0.775765913930180020, -0.775734361920614620, -0.775702807971713200, -0.775671252083554250, -0.775639694256217820, -0.775608134489782050, -0.775576572784325900, --0.775545009139928410, -0.775513443556668290, -0.775481876034624710, -0.775450306573875700, -0.775418735174501660, -0.775387161836580740, -0.775355586560191880, -0.775324009345414010, --0.775292430192326190, -0.775260849101007230, -0.775229266071536190, -0.775197681103991450, -0.775166094198453060, -0.775134505354999390, -0.775102914573709500, -0.775071321854662320, --0.775039727197936790, -0.775008130603611960, -0.774976532071766310, -0.774944931602479790, -0.774913329195831000, -0.774881724851898880, -0.774850118570762470, -0.774818510352500710, --0.774786900197192760, -0.774755288104917560, -0.774723674075753490, -0.774692058109780810, -0.774660440207078030, -0.774628820367724070, -0.774597198591798100, -0.774565574879379160, --0.774533949230546300, -0.774502321645378020, -0.774470692123954470, -0.774439060666354150, -0.774407427272656210, -0.774375791942939710, -0.774344154677283680, -0.774312515475767290, --0.774280874338469590, -0.774249231265469740, -0.774217586256846340, -0.774185939312679430, -0.774154290433047620, -0.774122639618030180, -0.774090986867706050, -0.774059332182154610, --0.774027675561454130, -0.773996017005685100, -0.773964356514926010, -0.773932694089256020, -0.773901029728754300, -0.773869363433499990, -0.773837695203572260, -0.773806025039050380, --0.773774352940013400, -0.773742678906539920, -0.773711002938710310, -0.773679325036603190, -0.773647645200297830, -0.773615963429873380, -0.773584279725408890, -0.773552594086983850, --0.773520906514676640, -0.773489217008567760, -0.773457525568735820, -0.773425832195260180, -0.773394136888219790, -0.773362439647694130, -0.773330740473762380, -0.773299039366503790, --0.773267336325997090, -0.773235631352322540, -0.773203924445558850, -0.773172215605785530, -0.773140504833081500, -0.773108792127526370, -0.773077077489199070, -0.773045360918178660, --0.773013642414545290, -0.772981921978377890, -0.772950199609755750, -0.772918475308758010, -0.772886749075464060, -0.772855020909953390, -0.772823290812305050, -0.772791558782597980, --0.772759824820912430, -0.772728088927327470, -0.772696351101922250, -0.772664611344776150, -0.772632869655968560, -0.772601126035578730, -0.772569380483685510, -0.772537633000369480, --0.772505883585709260, -0.772474132239784450, -0.772442378962674200, -0.772410623754458130, -0.772378866615215380, -0.772347107545025560, -0.772315346543967940, -0.772283583612121350, --0.772251818749566390, -0.772220051956381880, -0.772188283232647210, -0.772156512578441870, -0.772124739993845230, -0.772092965478936240, -0.772061189033795390, -0.772029410658501500, --0.771997630353134180, -0.771965848117772690, -0.771934063952496640, -0.771902277857385410, -0.771870489832518380, -0.771838699877975270, -0.771806907993834780, -0.771775114180177630, --0.771743318437082660, -0.771711520764629340, -0.771679721162897290, -0.771647919631966000, -0.771616116171914830, -0.771584310782822860, -0.771552503464770560, -0.771520694217837090, --0.771488883042101840, -0.771457069937644400, -0.771425254904544390, -0.771393437942881070, -0.771361619052734260, -0.771329798234182800, -0.771297975487307500, -0.771266150812187190, --0.771234324208901480, -0.771202495677529960, -0.771170665218152250, -0.771138832830847830, -0.771106998515695750, -0.771075162272776840, -0.771043324102169910, -0.771011484003954690, --0.770979641978210780, -0.770947798025017780, -0.770915952144455300, -0.770884104336602930, -0.770852254601539720, -0.770820402939346390, -0.770788549350102100, -0.770756693833886450, --0.770724836390779040, -0.770692977020859590, -0.770661115724207700, -0.770629252500902420, -0.770597387351024570, -0.770565520274653190, -0.770533651271868130, -0.770501780342748850, --0.770469907487375210, -0.770438032705826780, -0.770406155998183180, -0.770374277364524240, -0.770342396804929000, -0.770310514319478390, -0.770278629908251580, -0.770246743571328050, --0.770214855308787750, -0.770182965120710270, -0.770151073007174780, -0.770119178968262210, -0.770087283004051710, -0.770055385114623010, -0.770023485300055820, -0.769991583560429960, --0.769959679895825030, -0.769927774306321090, -0.769895866791997510, -0.769863957352933780, -0.769832045989210730, -0.769800132700907640, -0.769768217488104090, -0.769736300350880030, --0.769704381289315290, -0.769672460303489570, -0.769640537393482040, -0.769608612559373850, -0.769576685801244050, -0.769544757119172580, -0.769512826513239270, -0.769480893983523820, --0.769448959530106170, -0.769417023153066040, -0.769385084852482800, -0.769353144628437510, -0.769321202481009330, -0.769289258410278070, -0.769257312416323780, -0.769225364499226070, --0.769193414659065100, -0.769161462895919910, -0.769129509209871660, -0.769097553600999630, -0.769065596069383740, -0.769033636615103930, -0.769001675238239920, -0.768969711938871760, --0.768937746717079370, -0.768905779572941930, -0.768873810506540690, -0.768841839517954930, -0.768809866607264470, -0.768777891774549470, -0.768745915019889760, -0.768713936343365160, --0.768681955745055160, -0.768649973225040920, -0.768617988783401710, -0.768586002420217460, -0.768554014135568230, -0.768522023929534060, -0.768490031802194770, -0.768458037753630310, --0.768426041783920820, -0.768394043893145700, -0.768362044081386090, -0.768330042348721260, -0.768298038695231390, -0.768266033120996390, -0.768234025626096330, -0.768202016210610570, --0.768170004874620390, -0.768137991618205170, -0.768105976441445070, -0.768073959344419910, -0.768041940327209960, -0.768009919389895050, -0.767977896532555440, -0.767945871755270960, --0.767913845058121320, -0.767881816441187690, -0.767849785904549440, -0.767817753448286730, -0.767785719072479610, -0.767753682777208240, -0.767721644562552760, -0.767689604428592460, --0.767657562375408720, -0.767625518403081130, -0.767593472511689750, -0.767561424701314610, -0.767529374972035990, -0.767497323323933940, -0.767465269757088510, -0.767433214271579400, --0.767401156867487780, -0.767369097544893240, -0.767337036303876060, -0.767304973144516180, -0.767272908066893970, -0.767240841071089360, -0.767208772157182190, -0.767176701325253620, --0.767144628575383350, -0.767112553907651430, -0.767080477322138130, -0.767048398818923730, -0.767016318398088260, -0.766984236059712000, -0.766952151803874550, -0.766920065630657400, --0.766887977540139930, -0.766855887532402640, -0.766823795607525560, -0.766791701765589080, -0.766759606006673260, -0.766727508330857900, -0.766695408738224280, -0.766663307228852230, --0.766631203802821790, -0.766599098460213460, -0.766566991201107380, -0.766534882025583730, -0.766502770933722990, -0.766470657925605200, -0.766438543001310310, -0.766406426160919580, --0.766374307404512730, -0.766342186732170140, -0.766310064143972180, -0.766277939639998910, -0.766245813220330360, -0.766213684885047820, -0.766181554634230990, -0.766149422467960360, --0.766117288386316100, -0.766085152389378690, -0.766053014477228290, -0.766020874649945500, -0.765988732907610380, -0.765956589250302970, -0.765924443678104530, -0.765892296191095110, --0.765860146789354880, -0.765827995472964320, -0.765795842242003810, -0.765763687096553620, -0.765731530036693700, -0.765699371062505520, -0.765667210174068800, -0.765635047371464150, --0.765602882654771940, -0.765570716024072450, -0.765538547479446160, -0.765506377020973570, -0.765474204648734390, -0.765442030362810220, -0.765409854163281110, -0.765377676050227330, --0.765345496023729370, -0.765313314083867600, -0.765281130230722530, -0.765248944464374190, -0.765216756784903970, -0.765184567192391810, -0.765152375686918300, -0.765120182268563930, --0.765087986937408980, -0.765055789693534050, -0.765023590537019740, -0.764991389467945870, -0.764959186486394050, -0.764926981592444320, -0.764894774786177070, -0.764862566067672890, --0.764830355437012390, -0.764798142894275950, -0.764765928439543500, -0.764733712072896870, -0.764701493794415990, -0.764669273604181350, -0.764637051502273460, -0.764604827488773010, --0.764572601563760500, -0.764540373727316420, -0.764508143979521490, -0.764475912320455640, -0.764443678750200470, -0.764411443268836250, -0.764379205876443260, -0.764346966573102420, --0.764314725358894000, -0.764282482233898270, -0.764250237198196960, -0.764217990251869980, -0.764185741394998060, -0.764153490627661800, -0.764121237949941800, -0.764088983361918660, --0.764056726863673100, -0.764024468455285710, -0.763992208136836660, -0.763959945908407550, -0.763927681770078640, -0.763895415721930540, -0.763863147764043850, -0.763830877896499280, --0.763798606119377550, -0.763766332432758710, -0.763734056836724680, -0.763701779331355410, -0.763669499916731830, -0.763637218592934320, -0.763604935360043920, -0.763572650218141140, --0.763540363167306670, -0.763508074207620790, -0.763475783339165210, -0.763443490562020210, -0.763411195876266600, -0.763378899281984880, -0.763346600779255870, -0.763314300368160500, --0.763281998048778720, -0.763249693821192570, -0.763217387685482080, -0.763185079641728210, -0.763152769690011560, -0.763120457830413050, -0.763088144063013400, -0.763055828387893430, --0.763023510805133200, -0.762991191314814850, -0.762958869917018560, -0.762926546611825020, -0.762894221399315060, -0.762861894279569630, -0.762829565252669540, -0.762797234318694840, --0.762764901477727690, -0.762732566729848240, -0.762700230075137430, -0.762667891513675980, -0.762635551045544810, -0.762603208670824760, -0.762570864389596760, -0.762538518201941630, --0.762506170107939530, -0.762473820107672620, -0.762441468201221160, -0.762409114388665990, -0.762376758670088030, -0.762344401045568220, -0.762312041515186830, -0.762279680079025910, --0.762247316737165730, -0.762214951489687320, -0.762182584336671520, -0.762150215278199260, -0.762117844314351480, -0.762085471445209110, -0.762053096670852970, -0.762020719991363560, --0.761988341406822920, -0.761955960917311440, -0.761923578522910150, -0.761891194223699770, -0.761858808019761470, -0.761826419911175500, -0.761794029898024140, -0.761761637980387650, --0.761729244158347200, -0.761696848431983490, -0.761664450801377680, -0.761632051266610820, -0.761599649827763740, -0.761567246484917580, -0.761534841238152740, -0.761502434087551360, --0.761470025033193940, -0.761437614075161310, -0.761405201213534830, -0.761372786448395230, -0.761340369779823670, -0.761307951207900620, -0.761275530732708370, -0.761243108354327180, --0.761210684072838320, -0.761178257888322610, -0.761145829800861320, -0.761113399810535500, -0.761080967917426190, -0.761048534121613770, -0.761016098423180630, -0.760983660822207360, --0.760951221318774800, -0.760918779912964300, -0.760886336604856720, -0.760853891394533410, -0.760821444282074770, -0.760788995267563050, -0.760756544351078870, -0.760724091532703370, --0.760691636812517610, -0.760659180190602750, -0.760626721667039930, -0.760594261241910320, -0.760561798915295070, -0.760529334687274680, -0.760496868557931640, -0.760464400527346320, --0.760431930595600100, -0.760399458762773930, -0.760366985028949280, -0.760334509394206440, -0.760302031858627990, -0.760269552422294440, -0.760237071085286930, -0.760204587847686850, --0.760172102709575250, -0.760139615671033500, -0.760107126732142650, -0.760074635892983850, -0.760042143153638050, -0.760009648514187400, -0.759977151974712610, -0.759944653535294950, --0.759912153196015680, -0.759879650956956090, -0.759847146818196650, -0.759814640779819970, -0.759782132841906770, -0.759749623004538190, -0.759717111267795510, -0.759684597631760110, --0.759652082096513140, -0.759619564662136090, -0.759587045328710020, -0.759554524096315850, -0.759522000965035860, -0.759489475934950970, -0.759456949006142250, -0.759424420178691270, --0.759391889452679210, -0.759359356828187450, -0.759326822305296690, -0.759294285884089430, -0.759261747564646480, -0.759229207347049240, -0.759196665231378850, -0.759164121217716810, --0.759131575306144500, -0.759099027496743290, -0.759066477789593910, -0.759033926184778940, -0.759001372682378990, -0.758968817282475780, -0.758936259985150570, -0.758903700790484640, --0.758871139698559350, -0.758838576709455760, -0.758806011823256240, -0.758773445040041740, -0.758740876359893620, -0.758708305782893390, -0.758675733309122300, -0.758643158938661850, --0.758610582671593540, -0.758578004507998840, -0.758545424447958470, -0.758512842491555040, -0.758480258638869590, -0.758447672889983600, -0.758415085244978250, -0.758382495703935230, --0.758349904266935490, -0.758317310934061520, -0.758284715705394240, -0.758252118581015160, -0.758219519561005860, -0.758186918645447740, -0.758154315834422280, -0.758121711128011080, --0.758089104526295520, -0.758056496029356650, -0.758023885637277180, -0.757991273350137940, -0.757958659168020520, -0.757926043091006530, -0.757893425119177340, -0.757860805252614120, --0.757828183491399350, -0.757795559835614090, -0.757762934285340030, -0.757730306840658670, -0.757697677501651400, -0.757665046268400030, -0.757632413140986060, -0.757599778119490970, --0.757567141203995930, -0.757534502394583640, -0.757501861691335040, -0.757469219094331740, -0.757436574603655540, -0.757403928219387730, -0.757371279941610240, -0.757338629770403890, --0.757305977705851620, -0.757273323748034350, -0.757240667897033810, -0.757208010152931490, -0.757175350515809310, -0.757142688985748660, -0.757110025562831250, -0.757077360247138230, --0.757044693038752440, -0.757012023937754910, -0.756979352944227250, -0.756946680058251280, -0.756914005279908600, -0.756881328609280810, -0.756848650046449190, -0.756815969591496550, --0.756783287244503940, -0.756750603005553190, -0.756717916874725890, -0.756685228852103760, -0.756652538937768630, -0.756619847131802080, -0.756587153434285950, -0.756554457845301400, --0.756521760364931240, -0.756489060993256630, -0.756456359730359410, -0.756423656576321270, -0.756390951531224040, -0.756358244595148890, -0.756325535768178630, -0.756292825050394520, --0.756260112441878410, -0.756227397942711880, -0.756194681552976980, -0.756161963272755420, -0.756129243102128920, -0.756096521041179190, -0.756063797089987720, -0.756031071248637330, --0.755998343517209180, -0.755965613895785200, -0.755932882384447110, -0.755900148983276950, -0.755867413692355880, -0.755834676511766720, -0.755801937441590970, -0.755769196481910210, --0.755736453632806620, -0.755703708894361890, -0.755670962266657750, -0.755638213749776360, -0.755605463343799300, -0.755572711048808190, -0.755539956864885730, -0.755507200792113420, --0.755474442830573080, -0.755441682980346640, -0.755408921241516040, -0.755376157614163100, -0.755343392098369200, -0.755310624694217390, -0.755277855401789040, -0.755245084221165990, --0.755212311152430260, -0.755179536195663800, -0.755146759350948440, -0.755113980618366210, -0.755081199997998500, -0.755048417489928350, -0.755015633094237030, -0.754982846811006800, --0.754950058640319390, -0.754917268582256830, -0.754884476636901060, -0.754851682804333570, -0.754818887084637400, -0.754786089477894050, -0.754753289984185450, -0.754720488603593750, --0.754687685336200680, -0.754654880182088480, -0.754622073141339000, -0.754589264214033720, -0.754556453400256010, -0.754523640700087040, -0.754490826113609070, -0.754458009640903930, --0.754425191282053880, -0.754392371037140850, -0.754359548906246240, -0.754326724889453290, -0.754293898986843630, -0.754261071198499170, -0.754228241524502070, -0.754195409964934390, --0.754162576519878170, -0.754129741189415450, -0.754096903973628390, -0.754064064872598580, -0.754031223886409090, -0.753998381015141610, -0.753965536258878080, -0.753932689617700770, --0.753899841091691720, -0.753866990680932550, -0.753834138385506390, -0.753801284205494970, -0.753768428140980330, -0.753735570192044510, -0.753702710358769900, -0.753669848641238540, --0.753636985039532360, -0.753604119553733850, -0.753571252183924510, -0.753538382930187490, -0.753505511792604610, -0.753472638771257920, -0.753439763866229680, -0.753406887077601950, --0.753374008405457100, -0.753341127849876500, -0.753308245410943770, -0.753275361088740380, -0.753242474883348720, -0.753209586794850730, -0.753176696823328770, -0.753143804968865130, --0.753110911231541950, -0.753078015611440940, -0.753045118108645490, -0.753012218723237200, -0.752979317455298340, -0.752946414304911270, -0.752913509272158050, -0.752880602357121060, --0.752847693559882130, -0.752814782880524390, -0.752781870319129800, -0.752748955875780500, -0.752716039550558770, -0.752683121343546980, -0.752650201254827400, -0.752617279284482300, --0.752584355432593500, -0.752551429699244270, -0.752518502084516540, -0.752485572588492470, -0.752452641211254550, -0.752419707952885040, -0.752386772813466220, -0.752353835793079910, --0.752320896891809590, -0.752287956109736980, -0.752255013446944450, -0.752222068903514510, -0.752189122479529400, -0.752156174175071410, -0.752123223990222910, -0.752090271925066500, --0.752057317979683780, -0.752024362154158240, -0.751991404448571930, -0.751958444863007110, -0.751925483397546170, -0.751892520052271470, -0.751859554827264850, -0.751826587722610020, --0.751793618738388680, -0.751760647874683220, -0.751727675131576230, -0.751694700509150100, -0.751661724007487100, -0.751628745626669930, -0.751595765366780850, -0.751562783227901710, --0.751529799210116200, -0.751496813313506260, -0.751463825538154270, -0.751430835884142610, -0.751397844351553990, -0.751364850940470670, -0.751331855650974710, -0.751298858483149590, --0.751265859437077470, -0.751232858512840610, -0.751199855710521610, -0.751166851030202980, -0.751133844471967290, -0.751100836035896950, -0.751067825722073870, -0.751034813530581880, --0.751001799461502810, -0.750968783514919250, -0.750935765690913690, -0.750902745989568850, -0.750869724410967000, -0.750836700955190390, -0.750803675622322530, -0.750770648412445450, --0.750737619325641870, -0.750704588361994160, -0.750671555521584930, -0.750638520804496890, -0.750605484210812520, -0.750572445740613880, -0.750539405393984670, -0.750506363171007050, --0.750473319071763400, -0.750440273096336430, -0.750407225244808960, -0.750374175517263260, -0.750341123913781600, -0.750308070434447690, -0.750275015079343580, -0.750241957848551970, --0.750208898742155460, -0.750175837760236770, -0.750142774902878400, -0.750109710170163150, -0.750076643562173520, -0.750043575078991780, -0.750010504720701740, -0.749977432487385350, --0.749944358379125430, -0.749911282396004570, -0.749878204538105500, -0.749845124805510350, -0.749812043198302970, -0.749778959716565500, -0.749745874360380650, -0.749712787129831030, --0.749679698024999560, -0.749646607045968750, -0.749613514192821520, -0.749580419465640360, -0.749547322864507760, -0.749514224389507210, -0.749481124040721310, -0.749448021818232450, --0.749414917722123650, -0.749381811752477420, -0.749348703909376800, -0.749315594192903720, -0.749282482603142340, -0.749249369140174700, -0.749216253804083630, -0.749183136594951950, --0.749150017512862480, -0.749116896557897930, -0.749083773730141010, -0.749050649029674220, -0.749017522456581370, -0.748984394010944740, -0.748951263692847040, -0.748918131502371190, --0.748884997439600130, -0.748851861504616470, -0.748818723697502580, -0.748785584018342500, -0.748752442467218390, -0.748719299044213300, -0.748686153749409830, -0.748653006582891020, --0.748619857544739810, -0.748586706635038790, -0.748553553853870460, -0.748520399201318850, -0.748487242677466250, -0.748454084282395570, -0.748420924016189650, -0.748387761878931410, --0.748354597870703800, -0.748321431991589070, -0.748288264241671270, -0.748255094621032900, -0.748221923129756880, -0.748188749767925930, -0.748155574535623200, -0.748122397432931410, --0.748089218459933700, -0.748056037616713020, -0.748022854903351520, -0.747989670319933580, -0.747956483866541340, -0.747923295543257980, -0.747890105350166310, -0.747856913287349490, --0.747823719354889780, -0.747790523552871340, -0.747757325881376560, -0.747724126340488460, -0.747690924930290100, -0.747657721650864300, -0.747624516502294330, -0.747591309484663010, --0.747558100598053390, -0.747524889842548060, -0.747491677218230950, -0.747458462725184790, -0.747425246363492390, -0.747392028133236800, -0.747358808034501280, -0.747325586067368650, --0.747292362231921410, -0.747259136528243940, -0.747225908956418610, -0.747192679516528570, -0.747159448208656760, -0.747126215032886340, -0.747092979989300470, -0.747059743077982060, --0.747026504299013740, -0.746993263652479640, -0.746960021138462490, -0.746926776757045330, -0.746893530508311200, -0.746860282392343140, -0.746827032409224430, -0.746793780559037670, --0.746760526841866890, -0.746727271257794810, -0.746694013806904590, -0.746660754489279380, -0.746627493305002220, -0.746594230254156390, -0.746560965336824920, -0.746527698553090420, --0.746494429903037270, -0.746461159386748060, -0.746427887004306070, -0.746394612755794330, -0.746361336641295890, -0.746328058660894240, -0.746294778814671880, -0.746261497102713060, --0.746228213525100600, -0.746194928081917560, -0.746161640773247200, -0.746128351599172680, -0.746095060559777370, -0.746061767655144430, -0.746028472885357010, -0.745995176250497830, --0.745961877750651260, -0.745928577385900020, -0.745895275156327360, -0.745861971062016460, -0.745828665103050680, -0.745795357279512630, -0.745762047591486900, -0.745728736039055870, --0.745695422622303040, -0.745662107341311780, -0.745628790196165130, -0.745595471186946470, -0.745562150313739290, -0.745528827576626530, -0.745495502975691340, -0.745462176511017870, --0.745428848182688840, -0.745395517990787850, -0.745362185935398050, -0.745328852016602820, -0.745295516234485310, -0.745262178589128470, -0.745228839080616880, -0.745195497709033150, --0.745162154474460550, -0.745128809376982670, -0.745095462416682790, -0.745062113593644270, -0.745028762907950390, -0.744995410359683970, -0.744962055948929720, -0.744928699675770360, --0.744895341540289140, -0.744861981542569660, -0.744828619682695200, -0.744795255960749140, -0.744761890376814390, -0.744728522930975470, -0.744695153623315290, -0.744661782453917230, --0.744628409422864680, -0.744595034530241120, -0.744561657776129930, -0.744528279160614700, -0.744494898683778050, -0.744461516345704900, -0.744428132146477850, -0.744394746086180500, --0.744361358164896240, -0.744327968382708650, -0.744294576739701120, -0.744261183235956580, -0.744227787871559630, -0.744194390646593210, -0.744160991561140790, -0.744127590615285990, --0.744094187809112070, -0.744060783142702850, -0.744027376616141490, -0.743993968229511800, -0.743960557982896620, -0.743927145876380650, -0.743893731910046710, -0.743860316083978510, --0.743826898398259550, -0.743793478852973310, -0.743760057448202730, -0.743726634184032620, -0.743693209060545920, -0.743659782077826350, -0.743626353235957160, -0.743592922535022070, --0.743559489975104790, -0.743526055556288700, -0.743492619278657510, -0.743459181142294150, -0.743425741147283440, -0.743392299293708430, -0.743358855581652600, -0.743325410011199670, --0.743291962582433240, -0.743258513295436800, -0.743225062150293600, -0.743191609147088260, -0.743158154285903930, -0.743124697566824200, -0.743091238989932790, -0.743057778555313190, --0.743024316263049210, -0.742990852113224460, -0.742957386105921880, -0.742923918241226500, -0.742890448519221370, -0.742856976939989980, -0.742823503503616370, -0.742790028210183810, --0.742756551059776230, -0.742723072052476670, -0.742689591188369970, -0.742656108467539380, -0.742622623890068610, -0.742589137456041160, -0.742555649165540840, -0.742522159018651370, --0.742488667015456680, -0.742455173156039590, -0.742421677440485150, -0.742388179868876510, -0.742354680441297490, -0.742321179157831800, -0.742287676018563050, -0.742254171023575160, --0.742220664172951290, -0.742187155466776270, -0.742153644905133470, -0.742120132488106490, -0.742086618215779260, -0.742053102088235380, -0.742019584105558790, -0.741986064267833200, --0.741952542575142540, -0.741919019027569850, -0.741885493625200180, -0.741851966368116790, -0.741818437256403510, -0.741784906290144150, -0.741751373469422550, -0.741717838794321960, --0.741684302264927210, -0.741650763881321890, -0.741617223643589510, -0.741583681551814090, -0.741550137606079570, -0.741516591806469670, -0.741483044153068200, -0.741449494645959110, --0.741415943285225860, -0.741382390070953190, -0.741348835003224680, -0.741315278082123940, -0.741281719307735120, -0.741248158680141930, -0.741214596199427760, -0.741181031865677630, --0.741147465678975050, -0.741113897639403720, -0.741080327747047680, -0.741046756001990880, -0.741013182404317130, -0.740979606954110360, -0.740946029651454730, -0.740912450496433280, --0.740878869489131290, -0.740845286629632230, -0.740811701918019930, -0.740778115354378430, -0.740744526938791560, -0.740710936671343360, -0.740677344552117200, -0.740643750581198360, --0.740610154758670090, -0.740576557084616560, -0.740542957559121470, -0.740509356182269100, -0.740475752954143250, -0.740442147874827980, -0.740408540944406890, -0.740374932162964900, --0.740341321530585740, -0.740307709047353210, -0.740274094713351370, -0.740240478528664260, -0.740206860493376030, -0.740173240607570060, -0.740139618871331510, -0.740105995284743970, --0.740072369847891490, -0.740038742560858000, -0.740005113423727660, -0.739971482436584620, -0.739937849599512810, -0.739904214912596280, -0.739870578375918740, -0.739836939989565350, --0.739803299753619580, -0.739769657668165600, -0.739736013733287460, -0.739702367949069180, -0.739668720315594500, -0.739635070832948660, -0.739601419501215050, -0.739567766320477830, --0.739534111290821360, -0.739500454412329480, -0.739466795685086550, -0.739433135109176520, -0.739399472684683760, -0.739365808411691640, -0.739332142290285650, -0.739298474320549400, --0.739264804502566820, -0.739231132836422280, -0.739197459322199930, -0.739163783959983280, -0.739130106749857800, -0.739096427691907090, -0.739062746786215200, -0.739029064032866610, --0.738995379431945270, -0.738961692983535420, -0.738928004687721350, -0.738894314544587320, -0.738860622554216920, -0.738826928716695530, -0.738793233032106870, -0.738759535500535080, --0.738725836122064440, -0.738692134896779210, -0.738658431824763650, -0.738624726906101480, -0.738591020140878070, -0.738557311529177030, -0.738523601071082720, -0.738489888766679540, --0.738456174616051400, -0.738422458619283020, -0.738388740776458440, -0.738355021087661490, -0.738321299552977430, -0.738287576172490190, -0.738253850946284040, -0.738220123874443250, --0.738186394957052070, -0.738152664194195120, -0.738118931585955760, -0.738085197132419600, -0.738051460833670570, -0.738017722689792820, -0.737983982700870730, -0.737950240866988790, --0.737916497188231160, -0.737882751664682310, -0.737849004296426640, -0.737815255083547840, -0.737781504026131520, -0.737747751124261390, -0.737713996378021820, -0.737680239787497300, --0.737646481352772220, -0.737612721073930390, -0.737578958951057300, -0.737545194984236760, -0.737511429173553280, -0.737477661519091220, -0.737443892020935080, -0.737410120679169110, --0.737376347493877930, -0.737342572465145780, -0.737308795593056620, -0.737275016877696140, -0.737241236319148060, -0.737207453917496870, -0.737173669672827160, -0.737139883585223200, --0.737106095654768920, -0.737072305881550040, -0.737038514265650260, -0.737004720807154400, -0.736970925506146620, -0.736937128362711520, -0.736903329376933700, -0.736869528548897420, --0.736835725878687400, -0.736801921366387450, -0.736768115012083280, -0.736734306815858830, -0.736700496777798590, -0.736666684897987150, -0.736632871176509000, -0.736599055613448740, --0.736565238208890080, -0.736531418962918960, -0.736497597875619410, -0.736463774947075820, -0.736429950177372780, -0.736396123566594780, -0.736362295114826540, -0.736328464822152640, --0.736294632688656910, -0.736260798714425180, -0.736226962899541370, -0.736193125244090310, -0.736159285748156370, -0.736125444411824260, -0.736091601235178470, -0.736057756218303160, --0.736023909361283920, -0.735990060664205030, -0.735956210127150960, -0.735922357750206310, -0.735888503533455920, -0.735854647476984150, -0.735820789580875710, -0.735786929845214770, --0.735753068270087130, -0.735719204855576850, -0.735685339601768410, -0.735651472508746740, -0.735617603576596450, -0.735583732805402010, -0.735549860195247710, -0.735515985746219240, --0.735482109458400980, -0.735448231331877310, -0.735414351366733170, -0.735380469563053140, -0.735346585920921840, -0.735312700440424180, -0.735278813121644780, -0.735244923964667670, --0.735211032969578790, -0.735177140136462510, -0.735143245465403220, -0.735109348956485940, -0.735075450609795180, -0.735041550425415300, -0.735007648403432020, -0.734973744543929720, --0.734939838846992990, -0.734905931312706760, -0.734872021941155640, -0.734838110732424440, -0.734804197686597990, -0.734770282803761110, -0.734736366083997840, -0.734702447527394220, --0.734668527134034520, -0.734634604904003560, -0.734600680837386060, -0.734566754934266820, -0.734532827194730680, -0.734498897618862000, -0.734464966206746510, -0.734431032958468680, --0.734397097874113220, -0.734363160953765080, -0.734329222197509070, -0.734295281605430010, -0.734261339177612600, -0.734227394914141350, -0.734193448815102290, -0.734159500880579460, --0.734125551110657910, -0.734091599505422580, -0.734057646064958160, -0.734023690789349590, -0.733989733678681370, -0.733955774733039190, -0.733921813952507660, -0.733887851337171710, --0.733853886887116060, -0.733819920602425620, -0.733785952483185460, -0.733751982529480370, -0.733718010741394750, -0.733684037119014640, -0.733650061662424520, -0.733616084371709220, --0.733582105246953780, -0.733548124288242900, -0.733514141495661850, -0.733480156869294800, -0.733446170409227990, -0.733412182115545710, -0.733378191988332980, -0.733344200027674860, --0.733310206233656170, -0.733276210606361940, -0.733242213145877230, -0.733208213852286960, -0.733174212725675620, -0.733140209766129260, -0.733106204973732360, -0.733072198348569960, --0.733038189890727110, -0.733004179600288850, -0.732970167477339450, -0.732936153521965170, -0.732902137734250610, -0.732868120114280710, -0.732834100662140500, -0.732800079377915030, --0.732766056261689340, -0.732732031313548470, -0.732698004533577580, -0.732663975921861050, -0.732629945478485260, -0.732595913203534570, -0.732561879097094140, -0.732527843159248900, --0.732493805390084130, -0.732459765789684750, -0.732425724358135470, -0.732391681095522440, -0.732357636001930160, -0.732323589077443880, -0.732289540322148550, -0.732255489736129420, --0.732221437319471540, -0.732187383072260060, -0.732153326994579580, -0.732119269086516260, -0.732085209348154910, -0.732051147779580470, -0.732017084380878090, -0.731983019152133150, --0.731948952093430580, -0.731914883204854980, -0.731880812486492840, -0.731846739938428750, -0.731812665560747640, -0.731778589353535010, -0.731744511316875790, -0.731710431450855350, --0.731676349755558840, -0.731642266231070870, -0.731608180877477810, -0.731574093694864260, -0.731540004683315480, -0.731505913842916740, -0.731471821173753200, -0.731437726675910120, --0.731403630349472090, -0.731369532194525610, -0.731335432211155270, -0.731301330399446450, -0.731267226759484190, -0.731233121291353870, -0.731199013995140760, -0.731164904870930110, --0.731130793918807200, -0.731096681138856840, -0.731062566531165190, -0.731028450095817290, -0.730994331832898080, -0.730960211742493150, -0.730926089824687650, -0.730891966079566410, --0.730857840507215810, -0.730823713107720540, -0.730789583881166100, -0.730755452827637540, -0.730721319947220560, -0.730687185240000090, -0.730653048706061740, -0.730618910345490760, --0.730584770158371980, -0.730550628144791770, -0.730516484304835070, -0.730482338638587030, -0.730448191146133240, -0.730414041827558980, -0.730379890682949620, -0.730345737712389860, --0.730311582915966430, -0.730277426293764020, -0.730243267845868130, -0.730209107572363900, -0.730174945473337060, -0.730140781548872740, -0.730106615799056560, -0.730072448223973100, --0.730038278823709310, -0.730004107598349660, -0.729969934547979870, -0.729935759672685200, -0.729901582972551030, -0.729867404447662960, -0.729833224098105800, -0.729799041923966160, --0.729764857925328970, -0.729730672102279600, -0.729696484454903540, -0.729662294983286270, -0.729628103687513410, -0.729593910567670090, -0.729559715623841480, -0.729525518856114160, --0.729491320264572970, -0.729457119849303610, -0.729422917610391460, -0.729388713547921900, -0.729354507661980620, -0.729320299952652460, -0.729286090420024240, -0.729251879064180650, --0.729217665885207420, -0.729183450883190030, -0.729149234058213970, -0.729115015410364940, -0.729080794939728220, -0.729046572646389610, -0.729012348530433950, -0.728978122591948050, --0.728943894831016740, -0.728909665247725820, -0.728875433842160580, -0.728841200614406940, -0.728806965564549600, -0.728772728692675400, -0.728738489998869480, -0.728704249483217330, --0.728670007145804540, -0.728635762986716730, -0.728601517006039480, -0.728567269203858390, -0.728533019580259290, -0.728498768135326880, -0.728464514869148210, -0.728430259781808310, --0.728396002873392680, -0.728361744143987020, -0.728327483593677050, -0.728293221222548360, -0.728258957030686100, -0.728224691018176990, -0.728190423185106070, -0.728156153531559270, --0.728121882057621850, -0.728087608763379970, -0.728053333648918890, -0.728019056714324540, -0.727984777959681970, -0.727950497385078000, -0.727916214990597890, -0.727881930776327120, --0.727847644742351640, -0.727813356888756920, -0.727779067215628910, -0.727744775723052630, -0.727710482411114910, -0.727676187279901020, -0.727641890329496780, -0.727607591559987780, --0.727573290971459730, -0.727538988563998460, -0.727504684337689670, -0.727470378292618620, -0.727436070428872260, -0.727401760746535730, -0.727367449245694740, -0.727333135926435110, --0.727298820788842670, -0.727264503833003230, -0.727230185059001940, -0.727195864466925750, -0.727161542056859900, -0.727127217828890120, -0.727092891783102440, -0.727058563919582460, --0.727024234238416000, -0.726989902739689110, -0.726955569423487270, -0.726921234289896080, -0.726886897339002250, -0.726852558570891370, -0.726818217985648940, -0.726783875583360990, --0.726749531364113350, -0.726715185327991400, -0.726680837475081940, -0.726646487805470480, -0.726612136319242710, -0.726577783016484680, -0.726543427897282100, -0.726509070961721020, --0.726474712209887240, -0.726440351641866710, -0.726405989257744690, -0.726371625057608330, -0.726337259041542890, -0.726302891209634320, -0.726268521561968420, -0.726234150098631240, --0.726199776819708820, -0.726165401725286320, -0.726131024815450780, -0.726096646090287790, -0.726062265549883180, -0.726027883194322880, -0.725993499023692810, -0.725959113038079030, --0.725924725237567570, -0.725890335622243590, -0.725855944192194460, -0.725821550947505330, -0.725787155888262480, -0.725752759014551610, -0.725718360326458980, -0.725683959824070300, --0.725649557507471180, -0.725615153376748760, -0.725580747431988530, -0.725546339673276420, -0.725511930100698370, -0.725477518714340520, -0.725443105514288920, -0.725408690500629500, --0.725374273673447760, -0.725339855032831050, -0.725305434578864540, -0.725271012311634600, -0.725236588231227050, -0.725202162337728050, -0.725167734631223640, -0.725133305111799190, --0.725098873779542190, -0.725064440634538010, -0.725030005676872700, -0.724995568906632410, -0.724961130323903080, -0.724926689928771070, -0.724892247721322210, -0.724857803701642770, --0.724823357869818330, -0.724788910225935950, -0.724754460770081320, -0.724720009502340720, -0.724685556422799860, -0.724651101531545220, -0.724616644828662170, -0.724582186314238210, --0.724547725988358700, -0.724513263851109920, -0.724478799902577910, -0.724444334142848920, -0.724409866572009120, -0.724375397190144770, -0.724340925997341790, -0.724306452993685900, --0.724271978179264480, -0.724237501554163110, -0.724203023118467960, -0.724168542872265400, -0.724134060815641360, -0.724099576948682210, -0.724065091271473450, -0.724030603784102670, --0.723996114486655350, -0.723961623379217660, -0.723927130461875960, -0.723892635734716410, -0.723858139197825380, -0.723823640851288920, -0.723789140695192730, -0.723754638729624310, --0.723720134954669360, -0.723685629370414030, -0.723651121976944590, -0.723616612774347410, -0.723582101762708650, -0.723547588942114020, -0.723513074312651110, -0.723478557874405400, --0.723444039627463400, -0.723409519571911240, -0.723374997707835200, -0.723340474035321760, -0.723305948554457180, -0.723271421265327060, -0.723236892168019010, -0.723202361262618720, --0.723167828549212580, -0.723133294027886840, -0.723098757698727780, -0.723064219561821990, -0.723029679617254840, -0.722995137865114270, -0.722960594305485760, -0.722926048938455800, --0.722891501764110770, -0.722856952782536920, -0.722822401993820640, -0.722787849398048520, -0.722753294995306610, -0.722718738785680940, -0.722684180769259000, -0.722649620946126610, --0.722615059316370160, -0.722580495880076110, -0.722545930637330750, -0.722511363588219990, -0.722476794732831440, -0.722442224071250920, -0.722407651603564900, -0.722373077329859560, --0.722338501250221700, -0.722303923364737480, -0.722269343673493490, -0.722234762176576120, -0.722200178874071290, -0.722165593766066590, -0.722131006852647970, -0.722096418133901690, --0.722061827609914550, -0.722027235280772730, -0.721992641146562140, -0.721958045207370720, -0.721923447463284070, -0.721888847914388790, -0.721854246560771460, -0.721819643402518580, --0.721785038439716420, -0.721750431672451790, -0.721715823100811060, -0.721681212724880170, -0.721646600544746830, -0.721611986560496970, -0.721577370772217170, -0.721542753179993950, --0.721508133783913760, -0.721473512584063340, -0.721438889580528490, -0.721404264773397140, -0.721369638162754900, -0.721335009748688690, -0.721300379531285010, -0.721265747510630330, --0.721231113686811250, -0.721196478059914490, -0.721161840630025750, -0.721127201397233190, -0.721092560361622500, -0.721057917523280520, -0.721023272882293620, -0.720988626438748610, --0.720953978192732100, -0.720919328144330020, -0.720884676293630070, -0.720850022640718620, -0.720815367185681950, -0.720780709928606990, -0.720746050869580210, -0.720711390008688340, --0.720676727346017950, -0.720642062881655780, -0.720607396615687850, -0.720572728548201980, -0.720538058679284330, -0.720503387009021500, -0.720468713537500190, -0.720434038264807120, --0.720399361191028320, -0.720364682316251840, -0.720330001640563600, -0.720295319164050210, -0.720260634886798700, -0.720225948808895570, -0.720191260930427510, -0.720156571251481360, --0.720121879772143700, -0.720087186492500810, -0.720052491412640490, -0.720017794532649020, -0.719983095852613110, -0.719948395372619340, -0.719913693092754660, -0.719878989013105100, --0.719844283133758700, -0.719809575454801510, -0.719774865976320450, -0.719740154698402250, -0.719705441621133590, -0.719670726744601420, -0.719636010068892330, -0.719601291594093360, --0.719566571320290450, -0.719531849247571740, -0.719497125376023390, -0.719462399705732230, -0.719427672236785050, -0.719392942969268700, -0.719358211903270100, -0.719323479038875170, --0.719288744376172300, -0.719254007915247520, -0.719219269656187770, -0.719184529599079750, -0.719149787744010500, -0.719115044091066750, -0.719080298640335400, -0.719045551391902630, --0.719010802345856680, -0.718976051502283610, -0.718941298861270560, -0.718906544422904140, -0.718871788187271380, -0.718837030154459210, -0.718802270324553790, -0.718767508697643390, --0.718732745273814140, -0.718697980053153000, -0.718663213035746980, -0.718628444221682930, -0.718593673611047760, -0.718558901203928400, -0.718524127000411790, -0.718489351000584200, --0.718454573204533880, -0.718419793612347200, -0.718385012224110890, -0.718350229039912190, -0.718315444059837830, -0.718280657283974280, -0.718245868712409700, -0.718211078345230460, --0.718176286182523490, -0.718141492224375840, -0.718106696470874440, -0.718071898922106320, -0.718037099578158420, -0.718002298439117780, -0.717967495505070770, -0.717932690776105660, --0.717897884252308830, -0.717863075933767300, -0.717828265820568020, -0.717793453912798140, -0.717758640210544030, -0.717723824713893840, -0.717689007422934180, -0.717654188337751850, --0.717619367458434240, -0.717584544785068170, -0.717549720317740670, -0.717514894056538900, -0.717480066001549900, -0.717445236152860040, -0.717410404510557820, -0.717375571074729490, --0.717340735845462320, -0.717305898822843350, -0.717271060006959500, -0.717236219397898060, -0.717201376995745490, -0.717166532800590060, -0.717131686812518270, -0.717096839031617360, --0.717061989457974280, -0.717027138091676170, -0.716992284932810310, -0.716957429981463720, -0.716922573237723020, -0.716887714701676340, -0.716852854373410510, -0.716817992253012460, --0.716783128340569450, -0.716748262636168530, -0.716713395139897070, -0.716678525851841550, -0.716643654772090240, -0.716608781900729740, -0.716573907237847420, -0.716539030783530210, --0.716504152537865590, -0.716469272500940390, -0.716434390672842090, -0.716399507053657960, -0.716364621643474250, -0.716329734442379680, -0.716294845450460740, -0.716259954667804680, --0.716225062094498770, -0.716190167730630270, -0.716155271576285560, -0.716120373631553450, -0.716085473896520330, -0.716050572371273560, -0.716015669055900310, -0.715980763950487930, --0.715945857055123700, -0.715910948369894660, -0.715876037894888410, -0.715841125630191310, -0.715806211575892190, -0.715771295732077430, -0.715736378098834390, -0.715701458676250460, --0.715666537464412890, -0.715631614463408390, -0.715596689673325350, -0.715561763094250790, -0.715526834726271650, -0.715491904569475420, -0.715456972623949470, -0.715422038889781180, --0.715387103367057690, -0.715352166055866380, -0.715317226956294180, -0.715282286068429470, -0.715247343392359070, -0.715212398928170230, -0.715177452675950560, -0.715142504635787100, --0.715107554807767440, -0.715072603191978300, -0.715037649788508150, -0.715002694597444030, -0.714967737618873110, -0.714932778852882870, -0.714897818299560560, -0.714862855958993900, --0.714827891831269930, -0.714792925916475700, -0.714757958214699780, -0.714722988726028910, -0.714688017450550660, -0.714653044388352310, -0.714618069539521340, -0.714583092904145230, --0.714548114482310700, -0.714513134274106560, -0.714478152279619530, -0.714443168498937190, -0.714408182932146920, -0.714373195579336210, -0.714338206440592430, -0.714303215516003180, --0.714268222805655270, -0.714233228309637420, -0.714198232028036450, -0.714163233960940060, -0.714128234108435400, -0.714093232470610180, -0.714058229047552010, -0.714023223839347580, --0.713988216846085710, -0.713953208067853230, -0.713918197504737840, -0.713883185156826920, -0.713848171024207940, -0.713813155106968630, -0.713778137405196470, -0.713743117918978930, --0.713708096648402960, -0.713673073593557360, -0.713638048754529080, -0.713603022131405700, -0.713567993724274820, -0.713532963533223820, -0.713497931558339850, -0.713462897799711730, --0.713427862257426270, -0.713392824931571190, -0.713357785822234080, -0.713322744929502540, -0.713287702253464050, -0.713252657794206320, -0.713217611551816950, -0.713182563526382980, --0.713147513717993120, -0.713112462126734630, -0.713077408752694870, -0.713042353595961580, -0.713007296656622440, -0.712972237934765160, -0.712937177430476470, -0.712902115143845600, --0.712867051074959400, -0.712831985223905560, -0.712796917590771790, -0.712761848175645700, -0.712726776978614970, -0.712691703999767330, -0.712656629239189820, -0.712621552696971360, --0.712586474373199000, -0.712551394267960330, -0.712516312381343390, -0.712481228713435550, -0.712446143264324650, -0.712411056034097820, -0.712375967022843890, -0.712340876230650120, --0.712305783657604110, -0.712270689303793670, -0.712235593169306510, -0.712200495254230350, -0.712165395558652990, -0.712130294082661490, -0.712095190826344870, -0.712060085789790300, --0.712024978973085480, -0.711989870376318220, -0.711954759999576250, -0.711919647842947370, -0.711884533906518850, -0.711849418190379610, -0.711814300694616710, -0.711779181419318170, --0.711744060364571610, -0.711708937530464940, -0.711673812917085980, -0.711638686524522330, -0.711603558352862150, -0.711568428402192250, -0.711533296672602010, -0.711498163164178580, --0.711463027877009770, -0.711427890811183290, -0.711392751966787080, -0.711357611343908400, -0.711322468942636290, -0.711287324763058000, -0.711252178805261480, -0.711217031069334430, --0.711181881555364770, -0.711146730263440550, -0.711111577193649370, -0.711076422346079370, -0.711041265720817610, -0.711006107317953220, -0.710970947137573690, -0.710935785179766740, --0.710900621444620410, -0.710865455932222500, -0.710830288642660850, -0.710795119576022930, -0.710759948732397890, -0.710724776111872900, -0.710689601714535990, -0.710654425540475090, --0.710619247589778010, -0.710584067862533030, -0.710548886358827740, -0.710513703078749610, -0.710478518022387820, -0.710443331189829830, -0.710408142581163470, -0.710372952196476780, --0.710337760035857580, -0.710302566099394130, -0.710267370387173580, -0.710232172899285310, -0.710196973635816460, -0.710161772596855310, -0.710126569782489670, -0.710091365192807580, --0.710056158827897080, -0.710020950687846210, -0.709985740772742350, -0.709950529082674750, -0.709915315617730910, -0.709880100377998650, -0.709844883363566210, -0.709809664574521550, --0.709774444010952690, -0.709739221672947120, -0.709703997560594100, -0.709668771673981120, -0.709633544013196230, -0.709598314578327450, -0.709563083369462940, -0.709527850386690640, --0.709492615630098800, -0.709457379099775350, -0.709422140795807790, -0.709386900718285580, -0.709351658867296120, -0.709316415242927430, -0.709281169845267790, -0.709245922674405230, --0.709210673730427230, -0.709175423013423180, -0.709140170523480440, -0.709104916260687390, -0.709069660225132070, -0.709034402416902520, -0.708999142836087000, -0.708963881482773670, --0.708928618357050570, -0.708893353459005390, -0.708858086788727420, -0.708822818346304120, -0.708787548131823870, -0.708752276145374730, -0.708717002387044940, -0.708681726856922540, --0.708646449555095370, -0.708611170481652560, -0.708575889636681830, -0.708540607020271440, -0.708505322632509540, -0.708470036473484280, -0.708434748543284030, -0.708399458841996730, --0.708364167369710310, -0.708328874126514020, -0.708293579112495570, -0.708258282327743130, -0.708222983772345050, -0.708187683446389490, -0.708152381349964720, -0.708117077483158330, --0.708081771846059920, -0.708046464438757070, -0.708011155261338070, -0.707975844313891270, -0.707940531596504720, -0.707905217109266900, -0.707869900852265980, -0.707834582825589750, --0.707799263029327720, -0.707763941463567360, -0.707728618128397270, -0.707693293023905600, -0.707657966150180840, -0.707622637507311030, -0.707587307095383980, -0.707551974914489400, --0.707516640964714780, -0.707481305246148610, -0.707445967758879140, -0.707410628502994740, -0.707375287478583800, -0.707339944685734690, -0.707304600124535670, -0.707269253795074440, --0.707233905697440820, -0.707198555831722420, -0.707163204198007600, -0.707127850796384740, -0.707092495626942320, -0.707057138689768050, -0.707021779984951530, -0.706986419512580570, --0.706951057272743540, -0.706915693265528830, -0.706880327491024920, -0.706844959949320170, -0.706809590640503080, -0.706774219564662020, -0.706738846721884690, -0.706703472112260920, --0.706668095735878520, -0.706632717592825870, -0.706597337683191330, -0.706561956007063510, -0.706526572564530890, -0.706491187355681060, -0.706455800380603960, -0.706420411639387400, --0.706385021132119760, -0.706349628858889520, -0.706314234819785280, -0.706278839014895410, -0.706243441444308510, -0.706208042108112280, -0.706172641006396650, -0.706137238139249450, --0.706101833506759040, -0.706066427109014130, -0.706031018946103090, -0.705995609018114530, -0.705960197325136370, -0.705924783867258320, -0.705889368644568300, -0.705853951657154810, --0.705818532905106540, -0.705783112388511880, -0.705747690107459410, -0.705712266062037740, -0.705676840252334790, -0.705641412678440380, -0.705605983340442440, -0.705570552238429460, --0.705535119372490250, -0.705499684742713180, -0.705464248349186860, -0.705428810191999320, -0.705393370271240380, -0.705357928586997970, -0.705322485139360800, -0.705287039928417350, --0.705251592954256320, -0.705216144216966320, -0.705180693716636050, -0.705145241453353890, -0.705109787427208090, -0.705074331638288480, -0.705038874086682980, -0.705003414772480300, --0.704967953695769150, -0.704932490856638010, -0.704897026255175030, -0.704861559891470150, -0.704826091765611400, -0.704790621877687370, -0.704755150227786790, -0.704719676815998340, --0.704684201642410750, -0.704648724707112590, -0.704613246010192710, -0.704577765551739010, -0.704542283331841550, -0.704506799350588350, -0.704471313608068140, -0.704435826104369720, --0.704400336839581700, -0.704364845813792770, -0.704329353027091210, -0.704293858479566830, -0.704258362171307770, -0.704222864102402870, -0.704187364272940820, -0.704151862683010330, --0.704116359332700230, -0.704080854222099100, -0.704045347351295310, -0.704009838720378810, -0.703974328329437630, -0.703938816178560690, -0.703903302267836710, -0.703867786597354380, --0.703832269167202760, -0.703796749977469660, -0.703761229028245340, -0.703725706319618060, -0.703690181851676420, -0.703654655624509350, -0.703619127638205670, -0.703583597892854180, --0.703548066388543610, -0.703512533125362330, -0.703476998103400360, -0.703441461322745760, -0.703405922783487680, -0.703370382485714710, -0.703334840429515770, -0.703299296614979810, --0.703263751042194850, -0.703228203711251170, -0.703192654622237120, -0.703157103775241320, -0.703121551170352800, -0.703085996807660370, -0.703050440687252860, -0.703014882809219420, --0.702979323173648640, -0.702943761780629010, -0.702908198630250560, -0.702872633722601670, -0.702837067057771160, -0.702801498635847950, -0.702765928456920990, -0.702730356521078630, --0.702694782828411020, -0.702659207379006330, -0.702623630172953820, -0.702588051210342070, -0.702552470491260240, -0.702516888015797260, -0.702481303784042050, -0.702445717796083560, --0.702410130052010250, -0.702374540551912060, -0.702338949295877700, -0.702303356283995870, -0.702267761516355620, -0.702232164993046080, -0.702196566714155980, -0.702160966679773900, --0.702125364889990110, -0.702089761344892870, -0.702054156044571220, -0.702018548989114090, -0.701982940178610630, -0.701947329613149870, -0.701911717292820760, -0.701876103217711770, --0.701840487387913160, -0.701804869803513200, -0.701769250464601150, -0.701733629371266040, -0.701698006523596820, -0.701662381921682510, -0.701626755565611600, -0.701591127455474580, --0.701555497591359600, -0.701519865973355920, -0.701484232601552680, -0.701448597476038720, -0.701412960596903280, -0.701377321964235520, -0.701341681578123710, -0.701306039438658440, --0.701270395545928070, -0.701234749900021660, -0.701199102501028350, -0.701163453349037290, -0.701127802444137640, -0.701092149786417870, -0.701056495375968370, -0.701020839212877610, --0.700985181297234640, -0.700949521629128820, -0.700913860208649210, -0.700878197035884940, -0.700842532110925060, -0.700806865433859060, -0.700771197004775080, -0.700735526823763830, --0.700699854890913800, -0.700664181206314020, -0.700628505770053870, -0.700592828582222490, -0.700557149642908270, -0.700521468952201910, -0.700485786510191890, -0.700450102316967360, --0.700414416372617590, -0.700378728677231830, -0.700343039230899130, -0.700307348033708870, -0.700271655085750290, -0.700235960387112000, -0.700200263937884260, -0.700164565738156000, --0.700128865788016250, -0.700093164087554400, -0.700057460636859590, -0.700021755436020520, -0.699986048485127690, -0.699950339784269790, -0.699914629333535990, -0.699878917133015640, --0.699843203182797910, -0.699807487482972280, -0.699771770033627890, -0.699736050834854020, -0.699700329886739470, -0.699664607189374730, -0.699628882742848400, -0.699593156547249960, --0.699557428602668560, -0.699521698909193690, -0.699485967466914490, -0.699450234275919680, -0.699414499336299960, -0.699378762648144030, -0.699343024211541150, -0.699307284026580820, --0.699271542093352180, -0.699235798411944610, -0.699200052982447700, -0.699164305804949930, -0.699128556879542120, -0.699092806206312870, -0.699057053785351550, -0.699021299616747640, --0.698985543700590520, -0.698949786036969440, -0.698914026625973350, -0.698878265467692830, -0.698842502562216580, -0.698806737909634100, -0.698770971510034760, -0.698735203363508030, --0.698699433470143290, -0.698663661830029930, -0.698627888443257520, -0.698592113309914660, -0.698556336430092180, -0.698520557803878780, -0.698484777431364060, -0.698448995312637380, --0.698413211447788230, -0.698377425836905430, -0.698341638480079690, -0.698305849377399810, -0.698270058528955300, -0.698234265934835730, -0.698198471595130490, -0.698162675509928940, --0.698126877679320800, -0.698091078103395550, -0.698055276782241880, -0.698019473715950630, -0.697983668904610720, -0.697947862348311630, -0.697912054047142850, -0.697876244001193970, --0.697840432210553920, -0.697804618675313290, -0.697768803395561240, -0.697732986371387030, -0.697697167602880470, -0.697661347090130950, -0.697625524833228150, -0.697589700832261460, --0.697553875087320470, -0.697518047598494230, -0.697482218365873540, -0.697446387389547230, -0.697410554669605000, -0.697374720206136330, -0.697338883999230940, -0.697303046048978300, --0.697267206355467350, -0.697231364918789120, -0.697195521739032430, -0.697159676816286880, -0.697123830150642170, -0.697087981742188000, -0.697052131591013760, -0.697016279697209250, --0.696980426060863300, -0.696944570682067050, -0.696908713560909330, -0.696872854697479730, -0.696836994091868060, -0.696801131744164030, -0.696765267654457010, -0.696729401822836270, --0.696693534249392620, -0.696657664934215100, -0.696621793877393540, -0.696585921079017400, -0.696550046539176400, -0.696514170257960360, -0.696478292235458870, -0.696442412471761750, --0.696406530966957820, -0.696370647721138330, -0.696334762734392100, -0.696298876006809060, -0.696262987538478820, -0.696227097329491060, -0.696191205379934950, -0.696155311689901410, --0.696119416259479710, -0.696083519088759320, -0.696047620177830280, -0.696011719526782090, -0.695975817135704670, -0.695939913004687600, -0.695904007133820830, -0.695868099523193400, --0.695832190172896330, -0.695796279083018780, -0.695760366253650560, -0.695724451684881510, -0.695688535376801200, -0.695652617329499010, -0.695616697543065770, -0.695580776017590940, --0.695544852753164130, -0.695508927749875160, -0.695473001007813840, -0.695437072527070100, -0.695401142307733640, -0.695365210349894290, -0.695329276653641300, -0.695293341219065830, --0.695257404046256910, -0.695221465135304470, -0.695185524486298450, -0.695149582099328530, -0.695113637974484780, -0.695077692111856220, -0.695041744511534000, -0.695005795173607500, --0.694969844098166530, -0.694933891285300920, -0.694897936735100590, -0.694861980447655350, -0.694826022423055250, -0.694790062661389430, -0.694754101162749160, -0.694718137927223480, --0.694682172954902530, -0.694646206245876140, -0.694610237800234340, -0.694574267618066840, -0.694538295699463020, -0.694502322044514120, -0.694466346653309420, -0.694430369525938950, --0.694394390662492420, -0.694358410063059980, -0.694322427727731450, -0.694286443656596970, -0.694250457849745590, -0.694214470307268790, -0.694178481029255830, -0.694142490015796640, --0.694106497266981260, -0.694070502782899610, -0.694034506563641740, -0.693998508609296900, -0.693962508919956480, -0.693926507495709720, -0.693890504336646790, -0.693854499442857490, --0.693818492814431980, -0.693782484451460290, -0.693746474354032360, -0.693710462522238220, -0.693674448956167370, -0.693638433655910940, -0.693602416621558420, -0.693566397853199960, --0.693530377350925380, -0.693494355114824930, -0.693458331144988000, -0.693422305441505740, -0.693386278004467840, -0.693350248833964230, -0.693314217930084960, -0.693278185292920180, --0.693242150922559920, -0.693206114819094220, -0.693170076982613350, -0.693134037413206560, -0.693097996110965340, -0.693061953075979180, -0.693025908308338100, -0.692989861808132270, --0.692953813575451720, -0.692917763610386710, -0.692881711913026610, -0.692845658483462800, -0.692809603321784980, -0.692773546428083090, -0.692737487802447370, -0.692701427444967880, --0.692665365355734860, -0.692629301534838370, -0.692593235982367990, -0.692557168698415220, -0.692521099683069520, -0.692485028936421050, -0.692448956458560080, -0.692412882249576640, --0.692376806309561000, -0.692340728638602740, -0.692304649236793250, -0.692268568104222100, -0.692232485240979580, -0.692196400647155930, -0.692160314322841200, -0.692124226268125640, --0.692088136483099640, -0.692052044967852550, -0.692015951722475990, -0.691979856747059640, -0.691943760041693560, -0.691907661606468110, -0.691871561441473440, -0.691835459546800040, --0.691799355922537160, -0.691763250568776630, -0.691727143485608040, -0.691691034673121430, -0.691654924131407390, -0.691618811860555960, -0.691582697860657510, -0.691546582131802310, --0.691510464674080620, -0.691474345487582130, -0.691438224572398450, -0.691402101928619280, -0.691365977556334780, -0.691329851455635300, -0.691293723626611230, -0.691257594069352280, --0.691221462783949910, -0.691185329770493850, -0.691149195029074570, -0.691113058559782220, -0.691076920362707290, -0.691040780437939930, -0.691004638785570720, -0.690968495405689940, --0.690932350298387290, -0.690896203463754240, -0.690860054901880850, -0.690823904612857250, -0.690787752596773940, -0.690751598853721170, -0.690715443383789540, -0.690679286187068530, --0.690643127263649960, -0.690606966613623640, -0.690570804237079840, -0.690534640134109030, -0.690498474304801710, -0.690462306749248130, -0.690426137467538780, -0.690389966459763470, --0.690353793726013910, -0.690317619266379800, -0.690281443080951630, -0.690245265169819880, -0.690209085533075030, -0.690172904170807460, -0.690136721083106860, -0.690100536270065180, --0.690064349731772220, -0.690028161468318360, -0.689991971479794080, -0.689955779766289860, -0.689919586327896180, -0.689883391164703540, -0.689847194276801750, -0.689810995664282610, --0.689774795327236070, -0.689738593265752490, -0.689702389479922460, -0.689666183969836480, -0.689629976735584900, -0.689593767777257890, -0.689557557094947040, -0.689521344688742270, --0.689485130558734170, -0.689448914705013240, -0.689412697127670060, -0.689376477826795010, -0.689340256802478900, -0.689304034054812110, -0.689267809583884670, -0.689231583389788180, --0.689195355472612900, -0.689159125832449090, -0.689122894469387570, -0.689086661383518710, -0.689050426574932650, -0.689014190043721110, -0.688977951789974120, -0.688941711813782280, --0.688905470115236060, -0.688869226694426300, -0.688832981551443350, -0.688796734686378030, -0.688760486099320830, -0.688724235790361790, -0.688687983759592840, -0.688651730007103890, --0.688615474532985660, -0.688579217337328630, -0.688542958420223620, -0.688506697781761320, -0.688470435422031460, -0.688434171341126280, -0.688397905539135600, -0.688361638016150130, --0.688325368772260690, -0.688289097807557760, -0.688252825122132040, -0.688216550716074350, -0.688180274589474510, -0.688143996742424770, -0.688107717175014950, -0.688071435887335880, --0.688035152879478140, -0.687998868151532660, -0.687962581703589930, -0.687926293535740090, -0.687890003648075180, -0.687853712040685240, -0.687817418713660980, -0.687781123667093320, --0.687744826901072750, -0.687708528415690080, -0.687672228211036130, -0.687635926287200940, -0.687599622644276650, -0.687563317282353200, -0.687527010201521630, -0.687490701401872410, --0.687454390883496470, -0.687418078646484520, -0.687381764690926710, -0.687345449016915190, -0.687309131624539990, -0.687272812513892050, -0.687236491685061960, -0.687200169138140750, --0.687163844873219020, -0.687127518890387810, -0.687091191189737720, -0.687054861771358990, -0.687018530635343680, -0.686982197781782160, -0.686945863210765120, -0.686909526922383500, --0.686873188916727880, -0.686836849193888770, -0.686800507753958180, -0.686764164597026380, -0.686727819723184090, -0.686691473132522210, -0.686655124825131690, -0.686618774801103340, --0.686582423060528080, -0.686546069603496730, -0.686509714430099560, -0.686473357540428820, -0.686436998934574660, -0.686400638612628010, -0.686364276574679690, -0.686327912820820730, --0.686291547351141950, -0.686255180165733720, -0.686218811264688200, -0.686182440648095640, -0.686146068316046960, -0.686109694268633000, -0.686073318505944880, -0.686036941028073550, --0.686000561835109820, -0.685964180927144060, -0.685927798304268420, -0.685891413966573270, -0.685855027914149650, -0.685818640147088490, -0.685782250665480710, -0.685745859469417240, --0.685709466558988570, -0.685673071934286840, -0.685636675595402420, -0.685600277542426250, -0.685563877775449470, -0.685527476294562900, -0.685491073099857800, -0.685454668191424870, --0.685418261569354700, -0.685381853233739570, -0.685345443184669720, -0.685309031422236310, -0.685272617946530270, -0.685236202757642740, -0.685199785855664660, -0.685163367240686490, --0.685126946912800520, -0.685090524872097210, -0.685054101118667600, -0.685017675652602740, -0.684981248473993660, -0.684944819582931410, -0.684908388979507230, -0.684871956663812060, --0.684835522635936280, -0.684799086895972350, -0.684762649444010770, -0.684726210280142470, -0.684689769404458690, -0.684653326817050490, -0.684616882518008340, -0.684580436507424730, --0.684543988785389910, -0.684507539351995040, -0.684471088207331490, -0.684434635351490070, -0.684398180784562160, -0.684361724506638790, -0.684325266517811110, -0.684288806818169610, --0.684252345407806770, -0.684215882286812960, -0.684179417455279550, -0.684142950913297580, -0.684106482660958190, -0.684070012698352550, -0.684033541025571350, -0.683997067642706850, --0.683960592549849760, -0.683924115747091220, -0.683887637234522280, -0.683851157012234310, -0.683814675080318460, -0.683778191438865870, -0.683741706087967140, -0.683705219027714860, --0.683668730258199410, -0.683632239779512260, -0.683595747591744460, -0.683559253694987380, -0.683522758089332050, -0.683486260774869180, -0.683449761751691360, -0.683413261019889200, --0.683376758579553820, -0.683340254430776510, -0.683303748573648620, -0.683267241008261310, -0.683230731734705830, -0.683194220753073010, -0.683157708063455220, -0.683121193665943150, --0.683084677560628180, -0.683048159747601470, -0.683011640226954380, -0.682975118998778160, -0.682938596063163430, -0.682902071420202980, -0.682865545069987200, -0.682829017012607680, --0.682792487248155670, -0.682755955776722320, -0.682719422598399130, -0.682682887713277340, -0.682646351121448450, -0.682609812823002930, -0.682573272818033480, -0.682536731106630930, --0.682500187688886540, -0.682463642564891670, -0.682427095734737700, -0.682390547198515440, -0.682353996956317270, -0.682317445008234210, -0.682280891354357540, -0.682244335994778630, --0.682207778929588950, -0.682171220158879770, -0.682134659682742450, -0.682098097501268600, -0.682061533614548800, -0.682024968022675870, -0.681988400725740520, -0.681951831723834110, --0.681915261017048140, -0.681878688605473960, -0.681842114489203180, -0.681805538668326380, -0.681768961142936390, -0.681732381913124020, -0.681695800978980750, -0.681659218340597840, --0.681622633998067000, -0.681586047951479590, -0.681549460200926990, -0.681512870746500130, -0.681476279588291710, -0.681439686726392550, -0.681403092160894230, -0.681366495891888140, --0.681329897919465970, -0.681293298243718870, -0.681256696864738000, -0.681220093782615940, -0.681183488997443630, -0.681146882509312660, -0.681110274318314500, -0.681073664424540650, --0.681037052828082580, -0.681000439529031890, -0.680963824527479500, -0.680927207823518230, -0.680890589417238790, -0.680853969308732990, -0.680817347498092310, -0.680780723985408230, --0.680744098770772240, -0.680707471854275490, -0.680670843236010570, -0.680634212916068740, -0.680597580894541140, -0.680560947171519710, -0.680524311747095930, -0.680487674621361390, --0.680451035794407580, -0.680414395266326300, -0.680377753037208270, -0.680341109107146510, -0.680304463476232080, -0.680267816144556340, -0.680231167112211210, -0.680194516379288070, --0.680157863945878070, -0.680121209812073910, -0.680084553977966850, -0.680047896443648380, -0.680011237209210200, -0.679974576274743890, -0.679937913640341170, -0.679901249306093640, --0.679864583272092980, -0.679827915538430140, -0.679791246105198250, -0.679754574972488260, -0.679717902140391850, -0.679681227609000630, -0.679644551378406400, -0.679607873448700110, --0.679571193819974660, -0.679534512492321440, -0.679497829465831820, -0.679461144740597600, -0.679424458316710610, -0.679387770194262440, -0.679351080373344800, -0.679314388854049490, --0.679277695636467560, -0.679241000720692050, -0.679204304106813980, -0.679167605794925300, -0.679130905785117480, -0.679094204077482440, -0.679057500672111790, -0.679020795569096890, --0.678984088768530560, -0.678947380270504050, -0.678910670075109080, -0.678873958182437450, -0.678837244592580880, -0.678800529305631170, -0.678763812321680260, -0.678727093640819070, --0.678690373263140740, -0.678653651188736660, -0.678616927417698300, -0.678580201950117700, -0.678543474786086560, -0.678506745925696710, -0.678470015369039390, -0.678433283116207650, --0.678396549167292750, -0.678359813522386500, -0.678323076181580610, -0.678286337144967110, -0.678249596412637710, -0.678212853984684340, -0.678176109861198920, -0.678139364042272490, --0.678102616527998300, -0.678065867318467630, -0.678029116413772170, -0.677992363814004070, -0.677955609519254930, -0.677918853529616230, -0.677882095845181000, -0.677845336466040500, --0.677808575392286670, -0.677771812624011430, -0.677735048161306590, -0.677698282004264190, -0.677661514152976040, -0.677624744607534190, -0.677587973368029780, -0.677551200434556080, --0.677514425807204330, -0.677477649486066590, -0.677440871471234770, -0.677404091762800700, -0.677367310360855730, -0.677330527265493140, -0.677293742476804290, -0.677256955994881120, --0.677220167819815420, -0.677183377951699360, -0.677146586390624860, -0.677109793136683960, -0.677072998189968470, -0.677036201550569870, -0.676999403218581430, -0.676962603194094510, --0.676925801477201050, -0.676888998067993080, -0.676852192966562630, -0.676815386173001740, -0.676778577687401680, -0.676741767509855820, -0.676704955640455630, -0.676668142079292930, --0.676631326826459880, -0.676594509882048610, -0.676557691246150950, -0.676520870918859150, -0.676484048900264480, -0.676447225190460410, -0.676410399789538210, -0.676373572697590020, --0.676336743914707880, -0.676299913440983950, -0.676263081276510250, -0.676226247421378050, -0.676189411875681050, -0.676152574639510400, -0.676115735712958350, -0.676078895096116960, --0.676042052789078360, -0.676005208791934600, -0.675968363104777810, -0.675931515727700160, -0.675894666660793010, -0.675857815904149840, -0.675820963457862130, -0.675784109322022040, --0.675747253496721710, -0.675710395982053290, -0.675673536778108150, -0.675636675884979780, -0.675599813302759760, -0.675562949031540240, -0.675526083071413370, -0.675489215422471200, --0.675452346084806090, -0.675415475058509960, -0.675378602343675300, -0.675341727940393380, -0.675304851848757880, -0.675267974068860190, -0.675231094600792560, -0.675194213444647250, --0.675157330600516410, -0.675120446068491530, -0.675083559848666190, -0.675046671941131990, -0.675009782345981080, -0.674972891063305820, -0.674935998093198150, -0.674899103435750660, --0.674862207091055270, -0.674825309059204460, -0.674788409340289720, -0.674751507934404530, -0.674714604841640590, -0.674677700062090270, -0.674640793595845500, -0.674603885442998870, --0.674566975603642540, -0.674530064077868090, -0.674493150865769110, -0.674456235967437310, -0.674419319382964840, -0.674382401112444070, -0.674345481155967370, -0.674308559513626890, --0.674271636185515110, -0.674234711171723510, -0.674197784472345800, -0.674160856087473670, -0.674123926017199280, -0.674086994261615220, -0.674050060820813530, -0.674013125694886810, --0.673976188883926630, -0.673939250388026600, -0.673902310207278420, -0.673865368341774460, -0.673828424791607090, -0.673791479556868690, -0.673754532637651500, -0.673717584034048130, --0.673680633746150730, -0.673643681774050980, -0.673606728117842830, -0.673569772777617870, -0.673532815753468350, -0.673495857045486870, -0.673458896653765680, -0.673421934578396720, --0.673384970819473460, -0.673348005377087830, -0.673311038251332210, -0.673274069442298950, -0.673237098950080550, -0.673200126774769370, -0.673163152916457900, -0.673126177375238500, --0.673089200151202990, -0.673052221244445190, -0.673015240655056910, -0.672978258383130410, -0.672941274428758280, -0.672904288792033010, -0.672867301473046410, -0.672830312471892070, --0.672793321788662020, -0.672756329423448650, -0.672719335376344540, -0.672682339647441950, -0.672645342236833590, -0.672608343144611930, -0.672571342370869350, -0.672534339915697780, --0.672497335779191020, -0.672460329961440890, -0.672423322462539890, -0.672386313282580690, -0.672349302421655580, -0.672312289879857250, -0.672275275657277630, -0.672238259754010410, --0.672201242170147540, -0.672164222905781590, -0.672127201961005170, -0.672090179335910640, -0.672053155030590600, -0.672016129045137740, -0.671979101379643890, -0.671942072034202980, --0.671905041008906910, -0.671868008303848190, -0.671830973919119500, -0.671793937854813340, -0.671756900111022290, -0.671719860687838400, -0.671682819585355470, -0.671645776803665550, --0.671608732342861110, -0.671571686203034870, -0.671534638384279400, -0.671497588886687420, -0.671460537710351410, -0.671423484855363300, -0.671386430321817330, -0.671349374109805110, --0.671312316219419560, -0.671275256650753160, -0.671238195403898620, -0.671201132478948640, -0.671164067875995140, -0.671127001595132170, -0.671089933636451640, -0.671052864000046380, --0.671015792686008860, -0.670978719694431900, -0.670941645025408100, -0.670904568679030140, -0.670867490655390860, -0.670830410954582180, -0.670793329576698130, -0.670756246521830750, --0.670719161790072740, -0.670682075381516810, -0.670644987296255660, -0.670607897534381440, -0.670570806095988180, -0.670533712981167820, -0.670496618190013270, -0.670459521722617140, --0.670422423579072110, -0.670385323759471130, -0.670348222263906780, -0.670311119092471990, -0.670274014245258560, -0.670236907722360890, -0.670199799523870880, -0.670162689649881460, --0.670125578100485230, -0.670088464875775110, -0.670051349975843810, -0.670014233400783480, -0.669977115150688140, -0.669939995225650180, -0.669902873625762060, -0.669865750351116840, --0.669828625401807320, -0.669791498777926100, -0.669754370479566210, -0.669717240506819690, -0.669680108859780800, -0.669642975538541570, -0.669605840543194940, -0.669568703873833710, --0.669531565530550710, -0.669494425513438740, -0.669457283822590070, -0.669420140458098940, -0.669382995420057410, -0.669345848708558290, -0.669308700323694720, -0.669271550265559290, --0.669234398534245050, -0.669197245129844690, -0.669160090052450700, -0.669122933302157110, -0.669085774879056070, -0.669048614783240740, -0.669011453014803800, -0.668974289573838200, --0.668937124460436960, -0.668899957674692240, -0.668862789216698280, -0.668825619086547360, -0.668788447284332290, -0.668751273810146210, -0.668714098664081820, -0.668676921846232290, --0.668639743356690520, -0.668602563195549230, -0.668565381362901000, -0.668528197858839990, -0.668491012683458340, -0.668453825836849310, -0.668416637319105610, -0.668379447130320380, --0.668342255270585770, -0.668305061739996380, -0.668267866538644120, -0.668230669666622370, -0.668193471124023830, -0.668156270910941650, -0.668119069027468760, -0.668081865473698300, --0.668044660249723090, -0.668007453355635490, -0.667970244791530110, -0.667933034557498970, -0.667895822653635340, -0.667858609080032140, -0.667821393836782300, -0.667784176923979070, --0.667746958341714820, -0.667709738090083720, -0.667672516169178330, -0.667635292579091600, -0.667598067319916670, -0.667560840391746570, -0.667523611794674340, -0.667486381528793030, --0.667449149594195210, -0.667411915990975160, -0.667374680719225340, -0.667337443779038700, -0.667300205170508590, -0.667262964893727940, -0.667225722948789790, -0.667188479335786730, --0.667151234054813140, -0.667113987105961480, -0.667076738489324810, -0.667039488204996370, -0.667002236253069090, -0.666964982633636350, -0.666927727346791070, -0.666890470392625830, --0.666853211771235130, -0.666815951482711330, -0.666778689527147690, -0.666741425904637250, -0.666704160615273270, -0.666666893659149000, -0.666629625036356700, -0.666592354746991080, --0.666555082791144500, -0.666517809168910350, -0.666480533880381530, -0.666443256925651430, -0.666405978304813180, -0.666368698017960060, -0.666331416065185090, -0.666294132446580980, --0.666256847162242210, -0.666219560212261250, -0.666182271596731490, -0.666144981315745950, -0.666107689369398010, -0.666070395757780150, -0.666033100480986960, -0.665995803539111140, --0.665958504932245620, -0.665921204660483990, -0.665883902723919290, -0.665846599122644880, -0.665809293856753910, -0.665771986926339760, -0.665734678331494910, -0.665697368072314060, --0.665660056148889790, -0.665622742561315480, -0.665585427309684170, -0.665548110394089340, -0.665510791814624250, -0.665473471571381480, -0.665436149664455740, -0.665398826093939630, --0.665361500859926400, -0.665324173962509420, -0.665286845401782070, -0.665249515177837590, -0.665212183290769250, -0.665174849740669870, -0.665137514527634030, -0.665100177651754330, --0.665062839113124250, -0.665025498911837040, -0.664988157047986080, -0.664950813521664740, -0.664913468332965720, -0.664876121481983720, -0.664838772968811330, -0.664801422793542150, --0.664764070956269220, -0.664726717457086220, -0.664689362296086440, -0.664652005473363230, -0.664614646989009410, -0.664577286843119560, -0.664539925035786520, -0.664502561567103630, --0.664465196437164400, -0.664427829646062060, -0.664390461193890220, -0.664353091080741590, -0.664315719306710850, -0.664278345871890830, -0.664240970776375010, -0.664203594020256750, --0.664166215603629430, -0.664128835526586640, -0.664091453789221630, -0.664054070391628120, -0.664016685333898790, -0.663979298616128370, -0.663941910238409650, -0.663904520200836230, --0.663867128503501380, -0.663829735146498790, -0.663792340129921280, -0.663754943453863430, -0.663717545118418410, -0.663680145123679340, -0.663642743469740060, -0.663605340156693810, --0.663567935184634310, -0.663530528553654910, -0.663493120263849210, -0.663455710315309920, -0.663418298708132180, -0.663380885442408590, -0.663343470518232840, -0.663306053935698410, --0.663268635694898910, -0.663231215795927700, -0.663193794238877920, -0.663156371023844170, -0.663118946150919600, -0.663081519620197680, -0.663044091431771900, -0.663006661585735850, --0.662969230082183230, -0.662931796921207520, -0.662894362102901650, -0.662856925627360540, -0.662819487494677120, -0.662782047704944980, -0.662744606258257600, -0.662707163154708900, --0.662669718394392150, -0.662632271977400490, -0.662594823903828840, -0.662557374173770140, -0.662519922787317970, -0.662482469744565930, -0.662445015045607820, -0.662407558690537130, --0.662370100679447570, -0.662332641012432060, -0.662295179689585620, -0.662257716711001310, -0.662220252076772600, -0.662182785786993300, -0.662145317841757010, -0.662107848241157430, --0.662070376985287590, -0.662032904074242530, -0.661995429508115070, -0.661957953286999130, -0.661920475410988310, -0.661882995880176290, -0.661845514694656800, -0.661808031854523530, --0.661770547359870060, -0.661733061210789670, -0.661695573407377280, -0.661658083949725920, -0.661620592837929400, -0.661583100072081320, -0.661545605652275600, -0.661508109578605170, --0.661470611851165070, -0.661433112470048550, -0.661395611435349080, -0.661358108747160720, -0.661320604405577050, -0.661283098410691880, -0.661245590762598920, -0.661208081461391980, --0.661170570507164210, -0.661133057900010760, -0.661095543640024540, -0.661058027727299490, -0.661020510161929420, -0.660982990944008030, -0.660945470073629140, -0.660907947550885890, --0.660870423375873540, -0.660832897548685020, -0.660795370069414360, -0.660757840938155260, -0.660720310155001430, -0.660682777720047020, -0.660645243633385500, -0.660607707895110360, --0.660570170505316520, -0.660532631464097240, -0.660495090771546330, -0.660457548427757830, -0.660420004432825450, -0.660382458786842990, -0.660344911489903710, -0.660307362542102870, --0.660269811943533510, -0.660232259694289780, -0.660194705794465260, -0.660157150244154110, -0.660119593043450030, -0.660082034192446930, -0.660044473691238090, -0.660006911539918750, --0.659969347738582180, -0.659931782287322190, -0.659894215186232700, -0.659856646435407760, -0.659819076034941170, -0.659781503984926190, -0.659743930285458080, -0.659706354936630210, --0.659668777938536510, -0.659631199291270790, -0.659593618994927080, -0.659556037049599310, -0.659518453455381510, -0.659480868212367510, -0.659443281320650660, -0.659405692780326350, --0.659368102591487810, -0.659330510754228990, -0.659292917268643810, -0.659255322134826400, -0.659217725352870040, -0.659180126922870090, -0.659142526844919700, -0.659104925119113010, --0.659067321745544050, -0.659029716724306770, -0.658992110055495180, -0.658954501739203340, -0.658916891775525260, -0.658879280164554330, -0.658841666906385790, -0.658804052001113140, --0.658766435448830290, -0.658728817249631390, -0.658691197403610370, -0.658653575910861490, -0.658615952771477890, -0.658578327985555160, -0.658540701553186560, -0.658503073474466240, --0.658465443749488230, -0.658427812378346580, -0.658390179361135420, -0.658352544697948790, -0.658314908388880180, -0.658277270434024950, -0.658239630833476470, -0.658201989587329010, --0.658164346695676580, -0.658126702158613240, -0.658089055976233130, -0.658051408148629720, -0.658013758675898510, -0.657976107558132850, -0.657938454795426900, -0.657900800387874910, --0.657863144335570800, -0.657825486638608960, -0.657787827297083290, -0.657750166311087400, -0.657712503680716880, -0.657674839406064970, -0.657637173487225950, -0.657599505924294060, --0.657561836717363460, -0.657524165866528180, -0.657486493371881810, -0.657448819233519940, -0.657411143451535950, -0.657373466026024200, -0.657335786957078730, -0.657298106244793790, --0.657260423889263530, -0.657222739890582330, -0.657185054248844210, -0.657147366964142780, -0.657109678036573610, -0.657071987466230190, -0.657034295253206890, -0.656996601397597860, --0.656958905899497240, -0.656921208758998730, -0.656883509976197820, -0.656845809551188210, -0.656808107484064040, -0.656770403774919690, -0.656732698423849180, -0.656694991430947010, --0.656657282796307420, -0.656619572520024560, -0.656581860602192040, -0.656544147042905650, -0.656506431842258760, -0.656468715000345870, -0.656430996517261220, -0.656393276393099080, --0.656355554627953030, -0.656317831221918780, -0.656280106175089920, -0.656242379487560920, -0.656204651159425830, -0.656166921190779130, -0.656129189581715180, -0.656091456332328240, --0.656053721442712680, -0.656015984912962090, -0.655978246743172290, -0.655940506933436750, -0.655902765483850070, -0.655865022394506390, -0.655827277665500200, -0.655789531296925850, --0.655751783288876950, -0.655714033641449310, -0.655676282354736520, -0.655638529428833050, -0.655600774863833280, -0.655563018659831460, -0.655525260816922200, -0.655487501335199840, --0.655449740214757990, -0.655411977455692460, -0.655374213058096950, -0.655336447022065950, -0.655298679347693810, -0.655260910035075030, -0.655223139084303850, -0.655185366495474320, --0.655147592268681910, -0.655109816404020550, -0.655072038901584720, -0.655034259761468670, -0.654996478983767120, -0.654958696568574310, -0.654920912515984720, -0.654883126826092840, --0.654845339498992480, -0.654807550534779460, -0.654769759933547580, -0.654731967695391330, -0.654694173820405180, -0.654656378308683510, -0.654618581160320230, -0.654580782375411170, --0.654542981954050250, -0.654505179896331720, -0.654467376202350400, -0.654429570872200550, -0.654391763905976750, -0.654353955303773600, -0.654316145065685580, -0.654278333191806390, --0.654240519682232180, -0.654202704537056650, -0.654164887756374270, -0.654127069340279750, -0.654089249288867580, -0.654051427602231560, -0.654013604280467620, -0.653975779323669790, --0.653937952731932450, -0.653900124505350180, -0.653862294644017570, -0.653824463148029330, -0.653786630017479830, -0.653748795252463880, -0.653710958853075170, -0.653673120819409760, --0.653635281151561550, -0.653597439849625150, -0.653559596913695140, -0.653521752343866110, -0.653483906140232770, -0.653446058302888930, -0.653408208831930630, -0.653370357727451890, --0.653332504989547090, -0.653294650618311160, -0.653256794613838570, -0.653218936976224020, -0.653181077705562110, -0.653143216801946870, -0.653105354265474110, -0.653067490096238100, --0.653029624294333310, -0.652991756859854560, -0.652953887792896310, -0.652916017093553290, -0.652878144761919630, -0.652840270798091370, -0.652802395202162320, -0.652764517974227300, --0.652726639114381000, -0.652688758622718130, -0.652650876499333290, -0.652612992744321390, -0.652575107357776910, -0.652537220339794000, -0.652499331690468700, -0.652461441409895040, --0.652423549498167830, -0.652385655955381780, -0.652347760781631480, -0.652309863977011180, -0.652271965541616930, -0.652234065475542750, -0.652196163778883340, -0.652158260451733530, --0.652120355494188120, -0.652082448906341820, -0.652044540688289320, -0.652006630840125560, -0.651968719361944560, -0.651930806253842370, -0.651892891515913230, -0.651854975148251750, --0.651817057150952950, -0.651779137524111430, -0.651741216267821440, -0.651703293382179030, -0.651665368867278440, -0.651627442723214380, -0.651589514950081770, -0.651551585547975320, --0.651513654516989950, -0.651475721857220470, -0.651437787568761580, -0.651399851651707660, -0.651361914106154740, -0.651323974932197070, -0.651286034129929360, -0.651248091699446640, --0.651210147640843730, -0.651172201954215320, -0.651134254639655910, -0.651096305697261400, -0.651058355127126180, -0.651020402929345040, -0.650982449104012930, -0.650944493651224640, --0.650906536571075220, -0.650868577863659370, -0.650830617529071450, -0.650792655567407620, -0.650754691978762120, -0.650716726763230000, -0.650678759920905960, -0.650640791451885030, --0.650602821356262240, -0.650564849634131640, -0.650526876285589580, -0.650488901310730340, -0.650450924709648830, -0.650412946482439970, -0.650374966629198800, -0.650336985150020250, --0.650299002044999240, -0.650261017314230030, -0.650223030957808870, -0.650185042975830240, -0.650147053368388850, -0.650109062135579950, -0.650071069277498470, -0.650033074794239220, --0.649995078685896570, -0.649957080952566990, -0.649919081594344640, -0.649881080611324550, -0.649843078003601860, -0.649805073771271390, -0.649767067914428290, -0.649729060433167470, --0.649691051327584090, -0.649653040597772400, -0.649615028243828660, -0.649577014265847460, -0.649538998663923730, -0.649500981438152380, -0.649462962588628680, -0.649424942115446880, --0.649386920018703460, -0.649348896298492680, -0.649310870954909580, -0.649272843988049410, -0.649234815398007200, -0.649196785184877780, -0.649158753348756500, -0.649120719889738300, --0.649082684807917640, -0.649044648103390910, -0.649006609776252570, -0.648968569826597790, -0.648930528254521470, -0.648892485060118980, -0.648854440243485150, -0.648816393804714560, --0.648778345743903690, -0.648740296061146910, -0.648702244756539370, -0.648664191830176320, -0.648626137282152790, -0.648588081112563830, -0.648550023321504690, -0.648511963909069840, --0.648473902875355780, -0.648435840220456860, -0.648397775944468460, -0.648359710047485600, -0.648321642529603450, -0.648283573390917130, -0.648245502631521250, -0.648207430251512280, --0.648169356250984710, -0.648131280630033780, -0.648093203388754760, -0.648055124527242570, -0.648017044045592570, -0.647978961943900030, -0.647940878222259430, -0.647902792880767240, --0.647864705919518170, -0.647826617338607250, -0.647788527138129840, -0.647750435318180990, -0.647712341878856180, -0.647674246820249770, -0.647636150142458460, -0.647598051845576840, --0.647559951929699950, -0.647521850394923270, -0.647483747241341940, -0.647445642469051230, -0.647407536078146490, -0.647369428068722770, -0.647331318440874880, -0.647293207194699400, --0.647255094330290830, -0.647216979847744620, -0.647178863747155940, -0.647140746028620040, -0.647102626692231620, -0.647064505738087270, -0.647026383166281800, -0.646988258976910260, --0.646950133170068110, -0.646912005745850620, -0.646873876704353030, -0.646835746045670850, -0.646797613769899300, -0.646759479877133000, -0.646721344367468640, -0.646683207241001030, --0.646645068497825330, -0.646606928138037000, -0.646568786161731300, -0.646530642569003610, -0.646492497359948740, -0.646454350534663270, -0.646416202093241910, -0.646378052035780030, --0.646339900362372990, -0.646301747073116270, -0.646263592168105140, -0.646225435647435060, -0.646187277511200640, -0.646149117759498790, -0.646110956392424110, -0.646072793410072070, --0.646034628812538040, -0.645996462599917390, -0.645958294772305600, -0.645920125329797370, -0.645881954272489620, -0.645843781600476840, -0.645805607313854720, -0.645767431412718530, --0.645729253897163740, -0.645691074767285930, -0.645652894023180270, -0.645614711664941780, -0.645576527692667160, -0.645538342106451330, -0.645500154906389570, -0.645461966092577330, --0.645423775665110330, -0.645385583624083830, -0.645347389969592620, -0.645309194701733650, -0.645270997820601710, -0.645232799326292290, -0.645194599218900880, -0.645156397498523050, --0.645118194165254070, -0.645079989219189630, -0.645041782660425330, -0.645003574489055760, -0.644965364705178070, -0.644927153308886840, -0.644888940300277770, -0.644850725679446460, --0.644812509446488160, -0.644774291601498020, -0.644736072144572740, -0.644697851075807350, -0.644659628395297330, -0.644621404103138280, -0.644583178199425680, -0.644544950684255100, --0.644506721557722150, -0.644468490819922410, -0.644430258470950810, -0.644392024510904160, -0.644353788939877490, -0.644315551757966400, -0.644277312965266360, -0.644239072561873070, --0.644200830547882020, -0.644162586923388350, -0.644124341688488760, -0.644086094843278390, -0.644047846387852730, -0.644009596322307590, -0.643971344646738330, -0.643933091361240770, --0.643894836465910390, -0.643856579960842330, -0.643818321846133520, -0.643780062121878880, -0.643741800788174000, -0.643703537845114690, -0.643665273292796550, -0.643627007131315270, --0.643588739360765660, -0.643550469981244990, -0.643512198992848060, -0.643473926395670690, -0.643435652189808470, -0.643397376375357210, -0.643359098952412390, -0.643320819921069930, --0.643282539281424650, -0.643244257033573800, -0.643205973177612190, -0.643167687713635750, -0.643129400641740070, -0.643091111962020840, -0.643052821674573780, -0.643014529779494140, --0.642976236276878720, -0.642937941166822790, -0.642899644449421940, -0.642861346124772080, -0.642823046192968820, -0.642784744654107840, -0.642746441508285080, -0.642708136755596240, --0.642669830396136450, -0.642631522430002660, -0.642593212857289990, -0.642554901678094370, -0.642516588892511510, -0.642478274500637210, -0.642439958502566520, -0.642401640898396580, --0.642363321688222520, -0.642325000872140170, -0.642286678450245450, -0.642248354422633840, -0.642210028789401480, -0.642171701550643960, -0.642133372706457210, -0.642095042256936370, --0.642056710202178580, -0.642018376542279110, -0.641980041277333550, -0.641941704407437920, -0.641903365932688150, -0.641865025853179840, -0.641826684169008340, -0.641788340880270810, --0.641749995987062390, -0.641711649489479010, -0.641673301387616470, -0.641634951681570700, -0.641596600371437620, -0.641558247457312940, -0.641519892939292010, -0.641481536817472000, --0.641443179091948150, -0.641404819762816380, -0.641366458830172630, -0.641328096294112580, -0.641289732154732390, -0.641251366412127210, -0.641212999066394170, -0.641174630117628760, --0.641136259565926680, -0.641097887411384070, -0.641059513654096640, -0.641021138294160410, -0.640982761331671420, -0.640944382766724830, -0.640906002599417880, -0.640867620829846050, --0.640829237458105050, -0.640790852484291020, -0.640752465908499880, -0.640714077730827560, -0.640675687951369310, -0.640637296570222610, -0.640598903587482620, -0.640560509003245350, --0.640522112817606850, -0.640483715030663040, -0.640445315642509950, -0.640406914653243510, -0.640368512062959860, -0.640330107871754260, -0.640291702079724080, -0.640253294686964570, --0.640214885693571880, -0.640176475099641930, -0.640138062905270870, -0.640099649110553950, -0.640061233715588540, -0.640022816720470010, -0.639984398125294510, -0.639945977930157950, --0.639907556135156600, -0.639869132740386260, -0.639830707745943080, -0.639792281151923100, -0.639753852958421800, -0.639715423165536530, -0.639676991773362680, -0.639638558781996380, --0.639600124191533670, -0.639561688002070580, -0.639523250213703380, -0.639484810826527310, -0.639446369840639960, -0.639407927256136600, -0.639369483073113480, -0.639331037291666630, --0.639292589911892200, -0.639254140933886330, -0.639215690357745060, -0.639177238183563870, -0.639138784411440340, -0.639100329041469740, -0.639061872073748430, -0.639023413508372330, --0.638984953345437810, -0.638946491585040800, -0.638908028227276990, -0.638869563272243650, -0.638831096720036570, -0.638792628570751590, -0.638754158824485160, -0.638715687481333230, --0.638677214541392150, -0.638638740004758070, -0.638600263871526350, -0.638561786141794710, -0.638523306815658610, -0.638484825893214200, -0.638446343374557860, -0.638407859259785490, --0.638369373548993590, -0.638330886242277520, -0.638292397339734970, -0.638253906841461330, -0.638215414747552940, -0.638176921058106080, -0.638138425773216890, -0.638099928892981620, --0.638061430417496630, -0.638022930346857970, -0.637984428681161340, -0.637945925420504210, -0.637907420564982400, -0.637868914114691930, -0.637830406069729290, -0.637791896430190520, --0.637753385196171420, -0.637714872367769470, -0.637676357945080370, -0.637637841928200390, -0.637599324317225770, -0.637560805112252880, -0.637522284313377980, -0.637483761920697330, --0.637445237934307300, -0.637406712354303570, -0.637368185180783640, -0.637329656413843200, -0.637291126053578740, -0.637252594100086390, -0.637214060553462640, -0.637175525413803620, --0.637136988681205160, -0.637098450355764960, -0.637059910437578590, -0.637021368926742440, -0.636982825823352860, -0.636944281127506230, -0.636905734839298910, -0.636867186958827160, --0.636828637486186900, -0.636790086421475610, -0.636751533764789210, -0.636712979516223960, -0.636674423675876230, -0.636635866243842390, -0.636597307220218900, -0.636558746605101480, --0.636520184398587930, -0.636481620600773850, -0.636443055211755810, -0.636404488231630090, -0.636365919660493050, -0.636327349498441390, -0.636288777745571240, -0.636250204401978440, --0.636211629467760890, -0.636173052943014180, -0.636134474827834920, -0.636095895122319450, -0.636057313826564160, -0.636018730940665740, -0.635980146464719680, -0.635941560398823990, --0.635902972743074390, -0.635864383497567350, -0.635825792662399360, -0.635787200237666880, -0.635748606223466520, -0.635710010619894520, -0.635671413427047470, -0.635632814645021300, --0.635594214273913720, -0.635555612313820630, -0.635517008764838410, -0.635478403627063760, -0.635439796900593050, -0.635401188585522190, -0.635362578681949120, -0.635323967189969530, --0.635285354109680010, -0.635246739441177160, -0.635208123184557440, -0.635169505339917340, -0.635130885907353560, -0.635092264886962580, -0.635053642278840200, -0.635015018083084360, --0.634976392299791080, -0.634937764929056740, -0.634899135970978020, -0.634860505425651530, -0.634821873293172970, -0.634783239573640470, -0.634744604267149850, -0.634705967373797700, --0.634667328893680720, -0.634628688826895380, -0.634590047173538290, -0.634551403933706020, -0.634512759107495380, -0.634474112695002090, -0.634435464696324170, -0.634396815111557650, --0.634358163940799020, -0.634319511184145090, -0.634280856841692330, -0.634242200913537340, -0.634203543399776250, -0.634164884300506990, -0.634126223615825490, -0.634087561345828440, --0.634048897490612550, -0.634010232050274290, -0.633971565024910590, -0.633932896414617920, -0.633894226219492320, -0.633855554439631820, -0.633816881075132450, -0.633778206126090820, --0.633739529592603820, -0.633700851474767850, -0.633662171772679810, -0.633623490486435630, -0.633584807616133450, -0.633546123161869310, -0.633507437123739690, -0.633468749501841620, --0.633430060296271690, -0.633391369507126490, -0.633352677134502940, -0.633313983178497630, -0.633275287639206820, -0.633236590516728310, -0.633197891811158490, -0.633159191522593810, --0.633120489651131210, -0.633081786196867390, -0.633043081159898380, -0.633004374540322320, -0.632965666338235370, -0.632926956553734320, -0.632888245186915780, -0.632849532237876660, --0.632810817706713770, -0.632772101593523820, -0.632733383898403500, -0.632694664621449190, -0.632655943762758800, -0.632617221322428590, -0.632578497300555260, -0.632539771697235740, --0.632501044512566830, -0.632462315746644580, -0.632423585399567220, -0.632384853471430920, -0.632346119962332480, -0.632307384872368820, -0.632268648201636530, -0.632229909950232760, --0.632191170118254100, -0.632152428705797580, -0.632113685712959340, -0.632074941139837530, -0.632036194986528410, -0.631997447253128670, -0.631958697939735470, -0.631919947046445500, --0.631881194573355560, -0.631842440520562040, -0.631803684888163080, -0.631764927676254920, -0.631726168884934380, -0.631687408514298500, -0.631648646564444080, -0.631609883035467940, --0.631571117927467230, -0.631532351240537970, -0.631493582974778530, -0.631454813130285180, -0.631416041707154710, -0.631377268705484270, -0.631338494125370580, -0.631299717966910650, --0.631260940230200740, -0.631222160915339110, -0.631183380022422140, -0.631144597551546730, -0.631105813502809810, -0.631067027876308310, -0.631028240672139250, -0.630989451890399680, --0.630950661531186400, -0.630911869594595780, -0.630873076080726180, -0.630834280989673980, -0.630795484321535980, -0.630756686076409330, -0.630717886254390960, -0.630679084855577110, --0.630640281880066270, -0.630601477327954680, -0.630562671199339510, -0.630523863494317660, -0.630485054212986060, -0.630446243355441860, -0.630407430921782090, -0.630368616912103660, --0.630329801326503070, -0.630290984165078670, -0.630252165427926720, -0.630213345115144490, -0.630174523226828760, -0.630135699763076820, -0.630096874723984900, -0.630058048109651490, --0.630019219920172960, -0.629980390155646440, -0.629941558816168870, -0.629902725901837380, -0.629863891412749120, -0.629825055349001130, -0.629786217710690540, -0.629747378497913730, --0.629708537710769070, -0.629669695349353130, -0.629630851413762960, -0.629592005904095590, -0.629553158820448270, -0.629514310162918030, -0.629475459931601260, -0.629436608126596630, --0.629397754748000420, -0.629358899795909870, -0.629320043270422010, -0.629281185171634120, -0.629242325499643210, -0.629203464254546540, -0.629164601436440480, -0.629125737045423630, --0.629086871081592450, -0.629048003545044090, -0.629009134435875690, -0.628970263754184410, -0.628931391500067490, -0.628892517673621420, -0.628853642274944780, -0.628814765304134050, --0.628775886761286370, -0.628737006646499010, -0.628698124959869100, -0.628659241701493790, -0.628620356871470550, -0.628581470469896320, -0.628542582496867670, -0.628503692952483320, --0.628464801836839730, -0.628425909150034160, -0.628387014892163860, -0.628348119063325880, -0.628309221663617020, -0.628270322693135760, -0.628231422151978690, -0.628192520040243170, --0.628153616358026250, -0.628114711105425270, -0.628075804282537510, -0.628036895889460320, -0.627997985926290860, -0.627959074393125700, -0.627920161290063560, -0.627881246617201020, --0.627842330374635330, -0.627803412562463970, -0.627764493180783870, -0.627725572229691940, -0.627686649709286780, -0.627647725619664980, -0.627608799960923890, -0.627569872733160780, --0.627530943936473020, -0.627492013570957850, -0.627453081636712760, -0.627414148133834780, -0.627375213062420830, -0.627336276422569620, -0.627297338214377610, -0.627258398437942290, --0.627219457093361020, -0.627180514180731060, -0.627141569700149780, -0.627102623651713880, -0.627063676035522160, -0.627024726851671320, -0.626985776100258520, -0.626946823781381330, --0.626907869895137140, -0.626868914441623290, -0.626829957420937060, -0.626790998833175240, -0.626752038678436650, -0.626713076956817990, -0.626674113668416630, -0.626635148813330050, --0.626596182391655490, -0.626557214403490550, -0.626518244848931820, -0.626479273728078100, -0.626440301041026330, -0.626401326787873750, -0.626362350968717950, -0.626323373583656200, --0.626284394632785960, -0.626245414116204820, -0.626206432034009390, -0.626167448386298560, -0.626128463173169170, -0.626089476394718570, -0.626050488051044350, -0.626011498142243770, --0.625972506668414640, -0.625933513629653440, -0.625894519026059190, -0.625855522857728610, -0.625816525124759160, -0.625777525827248440, -0.625738524965294030, -0.625699522538993190, --0.625660518548443510, -0.625621512993742580, -0.625582505874987200, -0.625543497192276200, -0.625504486945706590, -0.625465475135375650, -0.625426461761380950, -0.625387446823820190, --0.625348430322790190, -0.625309412258389650, -0.625270392630715710, -0.625231371439865740, -0.625192348685937320, -0.625153324369028040, -0.625114298489235500, -0.625075271046657170, --0.625036242041390630, -0.624997211473532820, -0.624958179343182650, -0.624919145650437050, -0.624880110395393600, -0.624841073578149890, -0.624802035198803510, -0.624762995257452050, --0.624723953754192320, -0.624684910689123460, -0.624645866062342290, -0.624606819873946510, -0.624567772124033580, -0.624528722812701330, -0.624489671940047230, -0.624450619506168980, --0.624411565511163390, -0.624372509955129720, -0.624333452838164660, -0.624294394160366030, -0.624255333921831410, -0.624216272122658400, -0.624177208762944800, -0.624138143842787430, --0.624099077362285430, -0.624060009321535710, -0.624020939720635990, -0.623981868559683850, -0.623942795838777100, -0.623903721558013320, -0.623864645717490340, -0.623825568317304960, --0.623786489357556320, -0.623747408838341570, -0.623708326759758180, -0.623669243121904080, -0.623630157924876750, -0.623591071168774100, -0.623551982853693070, -0.623512892979732780, --0.623473801546990280, -0.623434708555563270, -0.623395614005549440, -0.623356517897046600, -0.623317420230152570, -0.623278321004964830, -0.623239220221581400, -0.623200117880099100, --0.623161013980617300, -0.623121908523233010, -0.623082801508043850, -0.623043692935147720, -0.623004582804642330, -0.622965471116624810, -0.622926357871194320, -0.622887243068448000, --0.622848126708483440, -0.622809008791398670, -0.622769889317291270, -0.622730768286259280, -0.622691645698400300, -0.622652521553812230, -0.622613395852592120, -0.622574268594839220, --0.622535139780650670, -0.622496009410124280, -0.622456877483357870, -0.622417744000449250, -0.622378608961496220, -0.622339472366596040, -0.622300334215847850, -0.622261194509348800, --0.622222053247196820, -0.622182910429489700, -0.622143766056325260, -0.622104620127801430, -0.622065472644016020, -0.622026323605066270, -0.621987173011051440, -0.621948020862068570, --0.621908867158215810, -0.621869711899590730, -0.621830555086291480, -0.621791396718415770, -0.621752236796060840, -0.621713075319326070, -0.621673912288308710, -0.621634747703106450, --0.621595581563817330, -0.621556413870539280, -0.621517244623370100, -0.621478073822407940, -0.621438901467749830, -0.621399727559495240, -0.621360552097741210, -0.621321375082585890, --0.621282196514127080, -0.621243016392462820, -0.621203834717691030, -0.621164651489908960, -0.621125466709215980, -0.621086280375709230, -0.621047092489486860, -0.621007903050646680, --0.620968712059286830, -0.620929519515505120, -0.620890325419399700, -0.620851129771068490, -0.620811932570608630, -0.620772733818119700, -0.620733533513698980, -0.620694331657444360, --0.620655128249453900, -0.620615923289825620, -0.620576716778656890, -0.620537508716047070, -0.620498299102093420, -0.620459087936894080, -0.620419875220546980, -0.620380660953150250, --0.620341445134801830, -0.620302227765599850, -0.620263008845642230, -0.620223788375026340, -0.620184566353851770, -0.620145342782215780, -0.620106117660216390, -0.620066890987951760, --0.620027662765519790, -0.619988432993018760, -0.619949201670545900, -0.619909968798200820, -0.619870734376080760, -0.619831498404283860, -0.619792260882908290, -0.619753021812051940, --0.619713781191813080, -0.619674539022289860, -0.619635295303579530, -0.619596050035781550, -0.619556803218993650, -0.619517554853313610, -0.619478304938839710, -0.619439053475670080, --0.619399800463902750, -0.619360545903635210, -0.619321289794967030, -0.619282032137995710, -0.619242772932819260, -0.619203512179535840, -0.619164249878243700, -0.619124986029040870, --0.619085720632025600, -0.619046453687295270, -0.619007185194949570, -0.618967915155085980, -0.618928643567802530, -0.618889370433197470, -0.618850095751368960, -0.618810819522415230, --0.618771541746433780, -0.618732262423524080, -0.618692981553783830, -0.618653699137311160, -0.618614415174204120, -0.618575129664561070, -0.618535842608480270, -0.618496554006059850, --0.618457263857397970, -0.618417972162592310, -0.618378678921742360, -0.618339384134945710, -0.618300087802300610, -0.618260789923905320, -0.618221490499858080, -0.618182189530256390, --0.618142887015199930, -0.618103582954786180, -0.618064277349113620, -0.618024970198280290, -0.617985661502384430, -0.617946351261524530, -0.617907039475798730, -0.617867726145305380, --0.617828411270141990, -0.617789094850408230, -0.617749776886201700, -0.617710457377620760, -0.617671136324763780, -0.617631813727728800, -0.617592489586614390, -0.617553163901518040, --0.617513836672539450, -0.617474507899776310, -0.617435177583326890, -0.617395845723289540, -0.617356512319762520, -0.617317177372844190, -0.617277840882633040, -0.617238502849226540, --0.617199163272724500, -0.617159822153224510, -0.617120479490824940, -0.617081135285624250, -0.617041789537720600, -0.617002442247212570, -0.616963093414197750, -0.616923743038775840, --0.616884391121044650, -0.616845037661102440, -0.616805682659047560, -0.616766326114978610, -0.616726968028993740, -0.616687608401191520, -0.616648247231669560, -0.616608884520527640, --0.616569520267863490, -0.616530154473775680, -0.616490787138362360, -0.616451418261722120, -0.616412047843953310, -0.616372675885153650, -0.616333302385423050, -0.616293927344859220, --0.616254550763560500, -0.616215172641625510, -0.616175792979152480, -0.616136411776240010, -0.616097029032986470, -0.616057644749490430, -0.616018258925849490, -0.615978871562163690, --0.615939482658530710, -0.615900092215049040, -0.615860700231817050, -0.615821306708933310, -0.615781911646495650, -0.615742515044603980, -0.615703116903355880, -0.615663717222850070, --0.615624316003185010, -0.615584913244459080, -0.615545508946770850, -0.615506103110218920, -0.615466695734901760, -0.615427286820917070, -0.615387876368364890, -0.615348464377343030, --0.615309050847949960, -0.615269635780284370, -0.615230219174444650, -0.615190801030529370, -0.615151381348636340, -0.615111960128865600, -0.615072537371314950, -0.615033113076082990, --0.614993687243268190, -0.614954259872969260, -0.614914830965284540, -0.614875400520312860, -0.614835968538151920, -0.614796535018901860, -0.614757099962660370, -0.614717663369526160, --0.614678225239597700, -0.614638785572973800, -0.614599344369752940, -0.614559901630032930, -0.614520457353913920, -0.614481011541493700, -0.614441564192871100, -0.614402115308144480, --0.614362664887412540, -0.614323212930773970, -0.614283759438327470, -0.614244304410170750, -0.614204847846404060, -0.614165389747125090, -0.614125930112432770, -0.614086468942425690, --0.614047006237202320, -0.614007541996861470, -0.613968076221501070, -0.613928608911221140, -0.613889140066119720, -0.613849669686295510, -0.613810197771847090, -0.613770724322873160, --0.613731249339472430, -0.613691772821743480, -0.613652294769785220, -0.613612815183695480, -0.613573334063574390, -0.613533851409519990, -0.613494367221630980, -0.613454881500006040, --0.613415394244743890, -0.613375905455942560, -0.613336415133702070, -0.613296923278120690, -0.613257429889296880, -0.613217934967329570, -0.613178438512317460, -0.613138940524359130, --0.613099441003553510, -0.613059939949999410, -0.613020437363794630, -0.612980933245039440, -0.612941427593831970, -0.612901920410270920, -0.612862411694455100, -0.612822901446483210, --0.612783389666454070, -0.612743876354465700, -0.612704361510618360, -0.612664845135010180, -0.612625327227739880, -0.612585807788906260, -0.612546286818608120, -0.612506764316944170, --0.612467240284013450, -0.612427714719913860, -0.612388187624745670, -0.612348658998607020, -0.612309128841596720, -0.612269597153813680, -0.612230063935356620, -0.612190529186324330, --0.612150992906814960, -0.612111455096928990, -0.612071915756764230, -0.612032374886419820, -0.611992832485994340, -0.611953288555586840, -0.611913743095296110, -0.611874196105220980, --0.611834647585459690, -0.611795097536112500, -0.611755545957277660, -0.611715992849053760, -0.611676438211540050, -0.611636882044835130, -0.611597324349038020, -0.611557765124246980, --0.611518204370562150, -0.611478642088081780, -0.611439078276904910, -0.611399512937130240, -0.611359946068856910, -0.611320377672183610, -0.611280807747209390, -0.611241236294033150, --0.611201663312753160, -0.611162088803469670, -0.611122512766280930, -0.611082935201285980, -0.611043356108583740, -0.611003775488273000, -0.610964193340452160, -0.610924609665221550, --0.610885024462679340, -0.610845437732924660, -0.610805849476056320, -0.610766259692173350, -0.610726668381374790, -0.610687075543759560, -0.610647481179426690, -0.610607885288474320, --0.610568287871002920, -0.610528688927110870, -0.610489088456897090, -0.610449486460460490, -0.610409882937900330, -0.610370277889314640, -0.610330671314804010, -0.610291063214466690, --0.610251453588401720, -0.610211842436708120, -0.610172229759484930, -0.610132615556831180, -0.610092999828845790, -0.610053382575628020, -0.610013763797276010, -0.609974143493890340, --0.609934521665569270, -0.609894898312411950, -0.609855273434517400, -0.609815647031984540, -0.609776019104912640, -0.609736389653400050, -0.609696758677547130, -0.609657126177452270, --0.609617492153214700, -0.609577856604933350, -0.609538219532707370, -0.609498580936635780, -0.609458940816817840, -0.609419299173351690, -0.609379656006338140, -0.609340011315875340, --0.609300365102062650, -0.609260717364998980, -0.609221068104783490, -0.609181417321515320, -0.609141765015292940, -0.609102111186216820, -0.609062455834385450, -0.609022798959897970, --0.608983140562853410, -0.608943480643351130, -0.608903819201490060, -0.608864156237369450, -0.608824491751088440, -0.608784825742745510, -0.608745158212441240, -0.608705489160274000, --0.608665818586343050, -0.608626146490747640, -0.608586472873586800, -0.608546797734959120, -0.608507121074965070, -0.608467442893703250, -0.608427763191272900, -0.608388081967773050, --0.608348399223303080, -0.608308714957962020, -0.608269029171849220, -0.608229341865063830, -0.608189653037704450, -0.608149962689871540, -0.608110270821663800, -0.608070577433180270, --0.608030882524520420, -0.607991186095783290, -0.607951488147067560, -0.607911788678473730, -0.607872087690100480, -0.607832385182047070, -0.607792681154412650, -0.607752975607296460, --0.607713268540797880, -0.607673559955016150, -0.607633849850050530, -0.607594138225999500, -0.607554425082963870, -0.607514710421042210, -0.607474994240333800, -0.607435276540937870, --0.607395557322953690, -0.607355836586480620, -0.607316114331617360, -0.607276390558464390, -0.607236665267120610, -0.607196938457685080, -0.607157210130257140, -0.607117480284936170, --0.607077748921821650, -0.607038016041012600, -0.606998281642607940, -0.606958545726708150, -0.606918808293412050, -0.606879069342818990, -0.606839328875028230, -0.606799586890139130, --0.606759843388251060, -0.606720098369462610, -0.606680351833874700, -0.606640603781585910, -0.606600854212695610, -0.606561103127303160, -0.606521350525507930, -0.606481596407409280, --0.606441840773106810, -0.606402083622699540, -0.606362324956286500, -0.606322564773968290, -0.606282803075843700, -0.606243039862012110, -0.606203275132572880, -0.606163508887625490, --0.606123741127268520, -0.606083971851603010, -0.606044201060727540, -0.606004428754741590, -0.605964654933744630, -0.605924879597835920, -0.605885102747115050, -0.605845324381681480, --0.605805544501634490, -0.605765763107072970, -0.605725980198097760, -0.605686195774807650, -0.605646409837302000, -0.605606622385680300, -0.605566833420042140, -0.605527042940486090, --0.605487250947113200, -0.605447457440022150, -0.605407662419312540, -0.605367865885083620, -0.605328067837435090, -0.605288268276466420, -0.605248467202277100, -0.605208664614966580, --0.605168860514633700, -0.605129054901379470, -0.605089247775302490, -0.605049439136502440, -0.605009628985078710, -0.604969817321130980, -0.604930004144758730, -0.604890189456060660, --0.604850373255137910, -0.604810555542089180, -0.604770736317014060, -0.604730915580012130, -0.604691093331182870, -0.604651269570625980, -0.604611444298440830, -0.604571617514726430, --0.604531789219583620, -0.604491959413111400, -0.604452128095409160, -0.604412295266576690, -0.604372460926713480, -0.604332625075919120, -0.604292787714292510, -0.604252948841934590, --0.604213108458944380, -0.604173266565421360, -0.604133423161465120, -0.604093578247175360, -0.604053731822651650, -0.604013883887993600, -0.603974034443300110, -0.603934183488672340, --0.603894331024208970, -0.603854477050009940, -0.603814621566174600, -0.603774764572802770, -0.603734906069993920, -0.603695046057847180, -0.603655184536463500, -0.603615321505941880, --0.603575456966382040, -0.603535590917883450, -0.603495723360545910, -0.603455854294469020, -0.603415983719752580, -0.603376111636496180, -0.603336238044798740, -0.603296362944761410, --0.603256486336483210, -0.603216608220063730, -0.603176728595602780, -0.603136847463200070, -0.603096964822954380, -0.603057080674967110, -0.603017195019337040, -0.602977307856164100, --0.602937419185547770, -0.602897529007587970, -0.602857637322384400, -0.602817744130036640, -0.602777849430644610, -0.602737953224307120, -0.602698055511125540, -0.602658156291198790, --0.602618255564626670, -0.602578353331508890, -0.602538449591945250, -0.602498544346035560, -0.602458637593878630, -0.602418729335575940, -0.602378819571226410, -0.602338908300929840, --0.602298995524785940, -0.602259081242894620, -0.602219165455355480, -0.602179248162268530, -0.602139329363732710, -0.602099409059849380, -0.602059487250717450, -0.602019563936436740, --0.601979639117107170, -0.601939712792828540, -0.601899784963700560, -0.601859855629822470, -0.601819924791295420, -0.601779992448218560, -0.601740058600691800, -0.601700123248814720, --0.601660186392687480, -0.601620248032409770, -0.601580308168081280, -0.601540366799801500, -0.601500423927671450, -0.601460479551790270, -0.601420533672258010, -0.601380586289174350, --0.601340637402639210, -0.601300687012752520, -0.601260735119613310, -0.601220781723323050, -0.601180826823980890, -0.601140870421686620, -0.601100912516540080, -0.601060953108641380, --0.601020992198090240, -0.600981029784986690, -0.600941065869430410, -0.600901100451520900, -0.600861133531359280, -0.600821165109044930, -0.600781195184677540, -0.600741223758357150, --0.600701250830183770, -0.600661276400256570, -0.600621300468676900, -0.600581323035543900, -0.600541344100957610, -0.600501363665018050, -0.600461381727825040, -0.600421398289478490, --0.600381413350078550, -0.600341426909725030, -0.600301438968517180, -0.600261449526556580, -0.600221458583942270, -0.600181466140774280, -0.600141472197152640, -0.600101476753177380, --0.600061479808948420, -0.600021481364565010, -0.599981481420128640, -0.599941479975738550, -0.599901477031494770, -0.599861472587497220, -0.599821466643846060, -0.599781459200641190, --0.599741450257982760, -0.599701439815969910, -0.599661427874704220, -0.599621414434284960, -0.599581399494812150, -0.599541383056385820, -0.599501365119106120, -0.599461345683072970, --0.599421324748385720, -0.599381302315145860, -0.599341278383452750, -0.599301252953406420, -0.599261226025107010, -0.599221197598654440, -0.599181167674148970, -0.599141136251690520, --0.599101103331378560, -0.599061068913314560, -0.599021032997597900, -0.598980995584328600, -0.598940956673606920, -0.598900916265532770, -0.598860874360206300, -0.598820830957726980, --0.598780786058196290, -0.598740739661713590, -0.598700691768379150, -0.598660642378292860, -0.598620591491555000, -0.598580539108265700, -0.598540485228524990, -0.598500429852433120, --0.598460372980089470, -0.598420314611595620, -0.598380254747050920, -0.598340193386555530, -0.598300130530209810, -0.598260066178113670, -0.598220000330366600, -0.598179932987070400, --0.598139864148324210, -0.598099793814228510, -0.598059721984883220, -0.598019648660388590, -0.597979573840844880, -0.597939497526352340, -0.597899419717010880, -0.597859340412920330, --0.597819259614182030, -0.597779177320895580, -0.597739093533161240, -0.597699008251079130, -0.597658921474749530, -0.597618833204272670, -0.597578743439747930, -0.597538652181277110, --0.597498559428959570, -0.597458465182895690, -0.597418369443185600, -0.597378272209929670, -0.597338173483228040, -0.597298073263180960, -0.597257971549887910, -0.597217868343450700, --0.597177763643968910, -0.597137657451542570, -0.597097549766272160, -0.597057440588257830, -0.597017329917600040, -0.596977217754398050, -0.596937104098753780, -0.596896988950766700, --0.596856872310537300, -0.596816754178165600, -0.596776634553751960, -0.596736513437396860, -0.596696390829200450, -0.596656266729262310, -0.596616141137684240, -0.596576014054565840, --0.596535885480007360, -0.596495755414109150, -0.596455623856971600, -0.596415490808694940, -0.596375356269378880, -0.596335220239125220, -0.596295082718033440, -0.596254943706203910, --0.596214803203736990, -0.596174661210733150, -0.596134517727292650, -0.596094372753515840, -0.596054226289503110, -0.596014078335354030, -0.595973928891170620, -0.595933777957052270, --0.595893625533099440, -0.595853471619412600, -0.595813316216092130, -0.595773159323237600, -0.595733000940950940, -0.595692841069331740, -0.595652679708480460, -0.595612516858497370, --0.595572352519483150, -0.595532186691537960, -0.595492019374762260, -0.595451850569256650, -0.595411680275120590, -0.595371508492456010, -0.595331335221362720, -0.595291160461941190, --0.595250984214291570, -0.595210806478514650, -0.595170627254710590, -0.595130446542979310, -0.595090264343422600, -0.595050080656140290, -0.595009895481232730, -0.594969708818800510, --0.594929520668943890, -0.594889331031763560, -0.594849139907359880, -0.594808947295832670, -0.594768753197283730, -0.594728557611812870, -0.594688360539520790, -0.594648161980507630, --0.594607961934874200, -0.594567760402720750, -0.594527557384147310, -0.594487352879255580, -0.594447146888145480, -0.594406939410917600, -0.594366730447672300, -0.594326519998510160, --0.594286308063531780, -0.594246094642837620, -0.594205879736527500, -0.594165663344703330, -0.594125445467465150, -0.594085226104913210, -0.594045005257148320, -0.594004782924270840, --0.593964559106381350, -0.593924333803579900, -0.593884107015968170, -0.593843878743646300, -0.593803648986714670, -0.593763417745273970, -0.593723185019424670, -0.593682950809267470, --0.593642715114902850, -0.593602477936431390, -0.593562239273953020, -0.593521999127569870, -0.593481757497381630, -0.593441514383489130, -0.593401269785992720, -0.593361023704993110, --0.593320776140590310, -0.593280527092886260, -0.593240276561980970, -0.593200024547974820, -0.593159771050968730, -0.593119516071063170, -0.593079259608358830, -0.593039001662956420, --0.592998742234956410, -0.592958481324458830, -0.592918218931565820, -0.592877955056377190, -0.592837689698993750, -0.592797422859515980, -0.592757154538044780, -0.592716884734680650, --0.592676613449523490, -0.592636340682675680, -0.592596066434236900, -0.592555790704307970, -0.592515513492989590, -0.592475234800382440, -0.592434954626587130, -0.592394672971704560, --0.592354389835834440, -0.592314105219079230, -0.592273819121538650, -0.592233531543313490, -0.592193242484504560, -0.592152951945212560, -0.592112659925538080, -0.592072366425581360, --0.592032071445444340, -0.591991774985227150, -0.591951477045030590, -0.591911177624955260, -0.591870876725101970, -0.591830574345571630, -0.591790270486464710, -0.591749965147881470, --0.591709658329923950, -0.591669350032692390, -0.591629040256287380, -0.591588729000809830, -0.591548416266360460, -0.591508102053040050, -0.591467786360948540, -0.591427469190188400, --0.591387150540859660, -0.591346830413062910, -0.591306508806899170, -0.591266185722469030, -0.591225861159873520, -0.591185535119213350, -0.591145207600589420, -0.591104878604101660, --0.591064548129852430, -0.591024216177941760, -0.590983882748470690, -0.590943547841539800, -0.590903211457250110, -0.590862873595701670, -0.590822534256996710, -0.590782193441235500, --0.590741851148518740, -0.590701507378947330, -0.590661162132622210, -0.590620815409644170, -0.590580467210114150, -0.590540117534132820, -0.590499766381800570, -0.590459413753219640, --0.590419059648490170, -0.590378704067712980, -0.590338347010989080, -0.590297988478419410, -0.590257628470104660, -0.590217266986145070, -0.590176904026643130, -0.590136539591698870, --0.590096173681413320, -0.590055806295887280, -0.590015437435221780, -0.589975067099517640, -0.589934695288875880, -0.589894322003396530, -0.589853947243182300, -0.589813571008332980, --0.589773193298949950, -0.589732814115133790, -0.589692433456985630, -0.589652051324606410, -0.589611667718096370, -0.589571282637557760, -0.589530896083091060, -0.589490508054797080, --0.589450118552776850, -0.589409727577131280, -0.589369335127961410, -0.589328941205368270, -0.589288545809452000, -0.589248148940315080, -0.589207750598057740, -0.589167350782781150, --0.589126949494586110, -0.589086546733573630, -0.589046142499844880, -0.589005736793499990, -0.588965329614641540, -0.588924920963369790, -0.588884510839785660, -0.588844099243990280, --0.588803686176084580, -0.588763271636169820, -0.588722855624346790, -0.588682438140716640, -0.588642019185379620, -0.588601598758438320, -0.588561176859992980, -0.588520753490144770, --0.588480328648994690, -0.588439902336643670, -0.588399474553192300, -0.588359045298742940, -0.588318614573395960, -0.588278182377252380, -0.588237748710413340, -0.588197313572980000, --0.588156876965053370, -0.588116438886734480, -0.588075999338124600, -0.588035558319323970, -0.587995115830435070, -0.587954671871558480, -0.587914226442795230, -0.587873779544246360, --0.587833331176013000, -0.587792881338195630, -0.587752430030896830, -0.587711977254216870, -0.587671523008256980, -0.587631067293118310, -0.587590610108902010, -0.587550151455709100, --0.587509691333640950, -0.587469229742798470, -0.587428766683282140, -0.587388302155194770, -0.587347836158636500, -0.587307368693708700, -0.587266899760512500, -0.587226429359149040, --0.587185957489719470, -0.587145484152324260, -0.587105009347066110, -0.587064533074045490, -0.587024055333363440, -0.586983576125121310, -0.586943095449420250, -0.586902613306361400, --0.586862129696046120, -0.586821644618574670, -0.586781158074049850, -0.586740670062572240, -0.586700180584242890, -0.586659689639163040, -0.586619197227433940, -0.586578703349156960, --0.586538208004432460, -0.586497711193363140, -0.586457212916049580, -0.586416713172592920, -0.586376211963094530, -0.586335709287655660, -0.586295205146377450, -0.586254699539361160, --0.586214192466708250, -0.586173683928519100, -0.586133173924896390, -0.586092662455940830, -0.586052149521753550, -0.586011635122436040, -0.585971119258089310, -0.585930601928814080, --0.585890083134713020, -0.585849562875886850, -0.585809041152436700, -0.585768517964464050, -0.585727993312070040, -0.585687467195356030, -0.585646939614423270, -0.585606410569373350, --0.585565880060306520, -0.585525348087325810, -0.585484814650531700, -0.585444279750025550, -0.585403743385908730, -0.585363205558282470, -0.585322666267247490, -0.585282125512906700, --0.585241583295360470, -0.585201039614710260, -0.585160494471057560, -0.585119947864503500, -0.585079399795149670, -0.585038850263097320, -0.584998299268447820, -0.584957746811301860, --0.584917192891762250, -0.584876637509929690, -0.584836080665905530, -0.584795522359791150, -0.584754962591688020, -0.584714401361697390, -0.584673838669920070, -0.584633274516458860, --0.584592708901414570, -0.584552141824888350, -0.584511573286981890, -0.584471003287796440, -0.584430431827433480, -0.584389858905994490, -0.584349284523580040, -0.584308708680293170, --0.584268131376234570, -0.584227552611505610, -0.584186972386207760, -0.584146390700442500, -0.584105807554311180, -0.584065222947914630, -0.584024636881355860, -0.583984049354735360, --0.583943460368154810, -0.583902869921715690, -0.583862278015519260, -0.583821684649667220, -0.583781089824260910, -0.583740493539401830, -0.583699895795190880, -0.583659296591730880, --0.583618695929122740, -0.583578093807467720, -0.583537490226867520, -0.583496885187423600, -0.583456278689236770, -0.583415670732409960, -0.583375061317043860, -0.583334450443240280, --0.583293838111100470, -0.583253224320726130, -0.583212609072218610, -0.583171992365679630, -0.583131374201210750, -0.583090754578912570, -0.583050133498888350, -0.583009510961238760, --0.582968886966065410, -0.582928261513469770, -0.582887634603553530, -0.582847006236417500, -0.582806376412164600, -0.582765745130895850, -0.582725112392712630, -0.582684478197716740, --0.582643842546009650, -0.582603205437692840, -0.582562566872868120, -0.582521926851636950, -0.582481285374100270, -0.582440642440361090, -0.582399998050520230, -0.582359352204679490, --0.582318704902940240, -0.582278056145404290, -0.582237405932173210, -0.582196754263347940, -0.582156101139031490, -0.582115446559324680, -0.582074790524329310, -0.582034133034147080, --0.581993474088879360, -0.581952813688628060, -0.581912151833494650, -0.581871488523580170, -0.581830823758987760, -0.581790157539818220, -0.581749489866173250, -0.581708820738154660, --0.581668150155863930, -0.581627478119402850, -0.581586804628872360, -0.581546129684375580, -0.581505453286013440, -0.581464775433887750, -0.581424096128099980, -0.581383415368752040, --0.581342733155945650, -0.581302049489782370, -0.581261364370363910, -0.581220677797791410, -0.581179989772167890, -0.581139300293594400, -0.581098609362172610, -0.581057916978004350, --0.581017223141191310, -0.580976527851834510, -0.580935831110036990, -0.580895132915900000, -0.580854433269525130, -0.580813732171014290, -0.580773029620468950, -0.580732325617991150, --0.580691620163682480, -0.580650913257644840, -0.580610204899979050, -0.580569495090788590, -0.580528783830174370, -0.580488071118238190, -0.580447356955081870, -0.580406641340807110, --0.580365924275515030, -0.580325205759308790, -0.580284485792289640, -0.580243764374559270, -0.580203041506219370, -0.580162317187371990, -0.580121591418118810, -0.580080864198561640, --0.580040135528802290, -0.579999405408941900, -0.579958673839083730, -0.579917940819328790, -0.579877206349779020, -0.579836470430536320, -0.579795733061702400, -0.579754994243379170, --0.579714253975667670, -0.579673512258671360, -0.579632769092491170, -0.579592024477229020, -0.579551278412986930, -0.579510530899866590, -0.579469781937969940, -0.579429031527398770, --0.579388279668254460, -0.579347526360640020, -0.579306771604656820, -0.579266015400406680, -0.579225257747991500, -0.579184498647513200, -0.579143738099073600, -0.579102976102773950, --0.579062212658717600, -0.579021447767005700, -0.578980681427740280, -0.578939913641023040, -0.578899144406956000, -0.578858373725641200, -0.578817601597180430, -0.578776828021674850, --0.578736052999228030, -0.578695276529941020, -0.578654498613915820, -0.578613719251254490, -0.578572938442058700, -0.578532156186430610, -0.578491372484471470, -0.578450587336284630, --0.578409800741971240, -0.578369012701633320, -0.578328223215372920, -0.578287432283292050, -0.578246639905492520, -0.578205846082076370, -0.578165050813145620, -0.578124254098801530, --0.578083455939147450, -0.578042656334284870, -0.578001855284315580, -0.577961052789341620, -0.577920248849465130, -0.577879443464787150, -0.577838636635411350, -0.577797828361439000, --0.577757018642972130, -0.577716207480112540, -0.577675394872962600, -0.577634580821624110, -0.577593765326199100, -0.577552948386789720, -0.577512130003497330, -0.577471310176425280, --0.577430488905674940, -0.577389666191348350, -0.577348842033547640, -0.577308016432374840, -0.577267189387931980, -0.577226360900320310, -0.577185530969643650, -0.577144699596003010, --0.577103866779500760, -0.577063032520238720, -0.577022196818319230, -0.576981359673844120, -0.576940521086915630, -0.576899681057635230, -0.576858839586106180, -0.576817996672430170, --0.576777152316709120, -0.576736306519045170, -0.576695459279540470, -0.576654610598297150, -0.576613760475416570, -0.576572908911002320, -0.576532055905155770, -0.576491201457979050, --0.576450345569574310, -0.576409488240043790, -0.576368629469489520, -0.576327769258013660, -0.576286907605717660, -0.576246044512705110, -0.576205179979077500, -0.576164314004936950, --0.576123446590385500, -0.576082577735525510, -0.576041707440459130, -0.576000835705287710, -0.575959962530114830, -0.575919087915042090, -0.575878211860171740, -0.575837334365605800, --0.575796455431446530, -0.575755575057796070, -0.575714693244756660, -0.575673809992430560, -0.575632925300919250, -0.575592039170326310, -0.575551151600753210, -0.575510262592302310, --0.575469372145075760, -0.575428480259175810, -0.575387586934703820, -0.575346692171763710, -0.575305795970456830, -0.575264898330885450, -0.575223999253151820, -0.575183098737358180, --0.575142196783606790, -0.575101293391999890, -0.575060388562639860, -0.575019482295628050, -0.574978574591068270, -0.574937665449062000, -0.574896754869711700, -0.574855842853119410, --0.574814929399387500, -0.574774014508618310, -0.574733098180913340, -0.574692180416376370, -0.574651261215109010, -0.574610340577213390, -0.574569418502791970, -0.574528494991947030, --0.574487570044780790, -0.574446643661395640, -0.574405715841893150, -0.574364786586377130, -0.574323855894949160, -0.574282923767711510, -0.574241990204766520, -0.574201055206216670, --0.574160118772164110, -0.574119180902710410, -0.574078241597959620, -0.574037300858013190, -0.573996358682973610, -0.573955415072943010, -0.573914470028023870, -0.573873523548318660, --0.573832575633929530, -0.573791626284958280, -0.573750675501508710, -0.573709723283682420, -0.573668769631581870, -0.573627814545309310, -0.573586858024967340, -0.573545900070658090, --0.573504940682483480, -0.573463979860547200, -0.573423017604950850, -0.573382053915797110, -0.573341088793188240, -0.573300122237226590, -0.573259154248014660, -0.573218184825654790, --0.573177213970249460, -0.573136241681900470, -0.573095267960711530, -0.573054292806784440, -0.573013316220221560, -0.572972338201125480, -0.572931358749598550, -0.572890377865742370, --0.572849395549661080, -0.572808411801456250, -0.572767426621230480, -0.572726440009086120, -0.572685451965125550, -0.572644462489451440, -0.572603471582166180, -0.572562479243372220, --0.572521485473171390, -0.572480490271667470, -0.572439493638962400, -0.572398495575158540, -0.572357496080358460, -0.572316495154664650, -0.572275492798179690, -0.572234489011005150, --0.572193483793245190, -0.572152477145001500, -0.572111469066376550, -0.572070459557472930, -0.572029448618393220, -0.571988436249239900, -0.571947422450115540, -0.571906407221121740, --0.571865390562362740, -0.571824372473940250, -0.571783352955956840, -0.571742332008515100, -0.571701309631717500, -0.571660285825666530, -0.571619260590464200, -0.571578233926214430, --0.571537205833019150, -0.571496176310980710, -0.571455145360201920, -0.571414112980785260, -0.571373079172833310, -0.571332043936448650, -0.571291007271733210, -0.571249969178790900, --0.571208929657723740, -0.571167888708634220, -0.571126846331625030, -0.571085802526798640, -0.571044757294257740, -0.571003710634104270, -0.570962662546442230, -0.570921613031373560, --0.570880562089000840, -0.570839509719426760, -0.570798455922753800, -0.570757400699084760, -0.570716344048522230, -0.570675285971168900, -0.570634226467126470, -0.570593165536499300, --0.570552103179389200, -0.570511039395898870, -0.570469974186130990, -0.570428907550188050, -0.570387839488172180, -0.570346770000187410, -0.570305699086335770, -0.570264626746719850, --0.570223552981442340, -0.570182477790605930, -0.570141401174313440, -0.570100323132667340, -0.570059243665770430, -0.570018162773724750, -0.569977080456634310, -0.569935996714601270, --0.569894911547728200, -0.569853824956117800, -0.569812736939872890, -0.569771647499096150, -0.569730556633889500, -0.569689464344357190, -0.569648370630601250, -0.569607275492724390, --0.569566178930829390, -0.569525080945018860, -0.569483981535395700, -0.569442880702062500, -0.569401778445121410, -0.569360674764676670, -0.569319569660830190, -0.569278463133684800, --0.569237355183343170, -0.569196245809908240, -0.569155135013482690, -0.569114022794168450, -0.569072909152070090, -0.569031794087289320, -0.568990677599929050, -0.568949559690092200, --0.568908440357881350, -0.568867319603399420, -0.568826197426749220, -0.568785073828032780, -0.568743948807354350, -0.568702822364816170, -0.568661694500520840, -0.568620565214571270, --0.568579434507070270, -0.568538302378120750, -0.568497168827824640, -0.568456033856286510, -0.568414897463608180, -0.568373759649892560, -0.568332620415242570, -0.568291479759761130, --0.568250337683550930, -0.568209194186714890, -0.568168049269355820, -0.568126902931575970, -0.568085755173479480, -0.568044605995168710, -0.568003455396746350, -0.567962303378315440, --0.567921149939978780, -0.567879995081838400, -0.567838838803998770, -0.567797681106562150, -0.567756521989631220, -0.567715361453309030, -0.567674199497698480, -0.567633036122902390, --0.567591871329023780, -0.567550705116165450, -0.567509537484429560, -0.567468368433920570, -0.567427197964740730, -0.567386026076992840, -0.567344852770779950, -0.567303678046204850, --0.567262501903370580, -0.567221324342379370, -0.567180145363335500, -0.567138964966341310, -0.567097783151499720, -0.567056599918913660, -0.567015415268686040, -0.566974229200920000, --0.566933041715718340, -0.566891852813183330, -0.566850662493419420, -0.566809470756528770, -0.566768277602614610, -0.566727083031779650, -0.566685887044127030, -0.566644689639759670, --0.566603490818779810, -0.566562290581292040, -0.566521088927398500, -0.566479885857202210, -0.566438681370806220, -0.566397475468313650, -0.566356268149827200, -0.566315059415450240, --0.566273849265284790, -0.566232637699435440, -0.566191424718004540, -0.566150210321095140, -0.566108994508810140, -0.566067777281252680, -0.566026558638525800, -0.565985338580731740, --0.565944117107975100, -0.565902894220358110, -0.565861669917983920, -0.565820444200955560, -0.565779217069376060, -0.565737988523348560, -0.565696758562976080, -0.565655527188361760, --0.565614294399607750, -0.565573060196818860, -0.565531824580097320, -0.565490587549546180, -0.565449349105268560, -0.565408109247367510, -0.565366867975945600, -0.565325625291107080, --0.565284381192954650, -0.565243135681591240, -0.565201888757119960, -0.565160640419643870, -0.565119390669266310, -0.565078139506090200, -0.565036886930218810, -0.564995632941754480, --0.564954377540801690, -0.564913120727463030, -0.564871862501841520, -0.564830602864040410, -0.564789341814162740, -0.564748079352311860, -0.564706815478589920, -0.564665550193101720, --0.564624283495949510, -0.564583015387236760, -0.564541745867066400, -0.564500474935541670, -0.564459202592765830, -0.564417928838841900, -0.564376653673872460, -0.564335377097962110, --0.564294099111213310, -0.564252819713729200, -0.564211538905613150, -0.564170256686968190, -0.564128973057897550, -0.564087688018503840, -0.564046401568891630, -0.564005113709163290, --0.563963824439422280, -0.563922533759771750, -0.563881241670314840, -0.563839948171154790, -0.563798653262394870, -0.563757356944137640, -0.563716059216487710, -0.563674760079547640, --0.563633459533420700, -0.563592157578210020, -0.563550854214019070, -0.563509549440950890, -0.563468243259108160, -0.563426935668595470, -0.563385626669515530, -0.563344316261971460, --0.563303004446066620, -0.563261691221904390, -0.563220376589587790, -0.563179060549220290, -0.563137743100905140, -0.563096424244744820, -0.563055103980844350, -0.563013782309305990, --0.562972459230233200, -0.562931134743729240, -0.562889808849897480, -0.562848481548840480, -0.562807152840662960, -0.562765822725467600, -0.562724491203357660, -0.562683158274436490, --0.562641823938807460, -0.562600488196573820, -0.562559151047838930, -0.562517812492706270, -0.562476472531278300, -0.562435131163659840, -0.562393788389953580, -0.562352444210262870, --0.562311098624690970, -0.562269751633341470, -0.562228403236316730, -0.562187053433721770, -0.562145702225659180, -0.562104349612232320, -0.562062995593544560, -0.562021640169699350, --0.561980283340800080, -0.561938925106949980, -0.561897565468252650, -0.561856204424810660, -0.561814841976728930, -0.561773478124110050, -0.561732112867057490, -0.561690746205674610, --0.561649378140064880, -0.561608008670331780, -0.561566637796577890, -0.561525265518908130, -0.561483891837425200, -0.561442516752232450, -0.561401140263433570, -0.561359762371131720, --0.561318383075430470, -0.561277002376433300, -0.561235620274242900, -0.561194236768964180, -0.561152851860699850, -0.561111465549553490, -0.561070077835628340, -0.561028688719028000, --0.560987298199856040, -0.560945906278214950, -0.560904512954209960, -0.560863118227943660, -0.560821722099519530, -0.560780324569041140, -0.560738925636611870, -0.560697525302335300, --0.560656123566315000, -0.560614720428654350, -0.560573315889456140, -0.560531909948825290, -0.560490502606864840, -0.560449093863678030, -0.560407683719368550, -0.560366272174039780, --0.560324859227794620, -0.560283444880738110, -0.560242029132972940, -0.560200611984602690, -0.560159193435730840, -0.560117773486461080, -0.560076352136896990, -0.560034929387141830, --0.559993505237299520, -0.559952079687472630, -0.559910652737766190, -0.559869224388283240, -0.559827794639127240, -0.559786363490401670, -0.559744930942210230, -0.559703496994655710, --0.559662061647843270, -0.559620624901875590, -0.559579186756856360, -0.559537747212889180, -0.559496306270077630, -0.559454863928525280, -0.559413420188335730, -0.559371975049612780, --0.559330528512459010, -0.559289080576979680, -0.559247631243277700, -0.559206180511456650, -0.559164728381620120, -0.559123274853871810, -0.559081819928315290, -0.559040363605053490, --0.558998905884191430, -0.558957446765832260, -0.558915986250079320, -0.558874524337036550, -0.558833061026807410, -0.558791596319495600, -0.558750130215204810, -0.558708662714037960, --0.558667193816100190, -0.558625723521494420, -0.558584251830324340, -0.558542778742693650, -0.558501304258706030, -0.558459828378465080, -0.558418351102073940, -0.558376872429637520, --0.558335392361259060, -0.558293910897042060, -0.558252428037090190, -0.558210943781507370, -0.558169458130397200, -0.558127971083863360, -0.558086482642009550, -0.558044992804938800, --0.558003501572756360, -0.557962008945565020, -0.557920514923468840, -0.557879019506571260, -0.557837522694976220, -0.557796024488786510, -0.557754524888107620, -0.557713023893042340, --0.557671521503694480, -0.557630017720167850, -0.557588512542566250, -0.557547005970993270, -0.557505498005552820, -0.557463988646348610, -0.557422477893483650, -0.557380965747063310, --0.557339452207190500, -0.557297937273969040, -0.557256420947502830, -0.557214903227895460, -0.557173384115250190, -0.557131863609672150, -0.557090341711264480, -0.557048818420130880, --0.557007293736375250, -0.556965767660101420, -0.556924240191413180, -0.556882711330414340, -0.556841181077208700, -0.556799649431899410, -0.556758116394591720, -0.556716581965388760, --0.556675046144394340, -0.556633508931712260, -0.556591970327446450, -0.556550430331700600, -0.556508888944578060, -0.556467346166183980, -0.556425801996621620, -0.556384256435994650, --0.556342709484407120, -0.556301161141962710, -0.556259611408765450, -0.556218060284919270, -0.556176507770527070, -0.556134953865694340, -0.556093398570524310, -0.556051841885120690, --0.556010283809587610, -0.555968724344028660, -0.555927163488547980, -0.555885601243248590, -0.555844037608235970, -0.555802472583613370, -0.555760906169484480, -0.555719338365953330, --0.555677769173123840, -0.555636198591099920, -0.555594626619985490, -0.555553053259883800, -0.555511478510900100, -0.555469902373137870, -0.555428324846700790, -0.555386745931692900, --0.555345165628218230, -0.555303583936380570, -0.555262000856283190, -0.555220416388031550, -0.555178830531728900, -0.555137243287479150, -0.555095654655386350, -0.555054064635554400, --0.555012473228087220, -0.554970880433088950, -0.554929286250663400, -0.554887690680913930, -0.554846093723946000, -0.554804495379862760, -0.554762895648768350, -0.554721294530766680, --0.554679692025961790, -0.554638088134456810, -0.554596482856357540, -0.554554876191766910, -0.554513268140789160, -0.554471658703528210, -0.554430047880088210, -0.554388435670572940, --0.554346822075086680, -0.554305207093733320, -0.554263590726616240, -0.554221972973840900, -0.554180353835510680, -0.554138733311729580, -0.554097111402601540, -0.554055488108230800, --0.554013863428721390, -0.553972237364176450, -0.553930609914701780, -0.553888981080400520, -0.553847350861376820, -0.553805719257734700, -0.553764086269578290, -0.553722451897011750, --0.553680816140138980, -0.553639178999063450, -0.553597540473890760, -0.553555900564724260, -0.553514259271667860, -0.553472616594825940, -0.553430972534302400, -0.553389327090201500, --0.553347680262626480, -0.553306032051683050, -0.553264382457474560, -0.553222731480105030, -0.553181079119678730, -0.553139425376299680, -0.553097770250072120, -0.553056113741100090, --0.553014455849487160, -0.552972796575338710, -0.552931135918758310, -0.552889473879849990, -0.552847810458718110, -0.552806145655466600, -0.552764479470199800, -0.552722811903020970, --0.552681142954035920, -0.552639472623348000, -0.552597800911061480, -0.552556127817280360, -0.552514453342108910, -0.552472777485651380, -0.552431100248011900, -0.552389421629294610, --0.552347741629603100, -0.552306060249042940, -0.552264377487717620, -0.552222693345731370, -0.552181007823188460, -0.552139320920192910, -0.552097632636848410, -0.552055942973260550, --0.552014251929532800, -0.551972559505769400, -0.551930865702074610, -0.551889170518552690, -0.551847473955307870, -0.551805776012444290, -0.551764076690066330, -0.551722375988277450, --0.551680673907183340, -0.551638970446887480, -0.551597265607494340, -0.551555559389107940, -0.551513851791832650, -0.551472142815772730, -0.551430432461031740, -0.551388720727715280, --0.551347007615927140, -0.551305293125771480, -0.551263577257352640, -0.551221860010774780, -0.551180141386142240, -0.551138421383559400, -0.551096700003129710, -0.551054977244959110, --0.551013253109151060, -0.550971527595809810, -0.550929800705039720, -0.550888072436945150, -0.550846342791630470, -0.550804611769199150, -0.550762879369756990, -0.550721145593407680, --0.550679410440255590, -0.550637673910404860, -0.550595936003959950, -0.550554196721025240, -0.550512456061704960, -0.550470714026102930, -0.550428970614324720, -0.550387225826474150, --0.550345479662655570, -0.550303732122973230, -0.550261983207531610, -0.550220232916434960, -0.550178481249786970, -0.550136728207693660, -0.550094973790258400, -0.550053217997585660, --0.550011460829780030, -0.549969702286945640, -0.549927942369187070, -0.549886181076608580, -0.549844418409314640, -0.549802654367408940, -0.549760888950997400, -0.549719122160183590, --0.549677353995071890, -0.549635584455766880, -0.549593813542372910, -0.549552041254993680, -0.549510267593735110, -0.549468492558700780, -0.549426716149995280, -0.549384938367722950, --0.549343159211988400, -0.549301378682895750, -0.549259596780549810, -0.549217813505054830, -0.549176028856514620, -0.549134242835034980, -0.549092455440719830, -0.549050666673673420, --0.549008876534000430, -0.548967085021805250, -0.548925292137192320, -0.548883497880265470, -0.548841702251130600, -0.548799905249891530, -0.548758106876652610, -0.548716307131518420, --0.548674506014593550, -0.548632703525982370, -0.548590899665789330, -0.548549094434118480, -0.548507287831075500, -0.548465479856764300, -0.548423670511289480, -0.548381859794755400, --0.548340047707266740, -0.548298234248927980, -0.548256419419842820, -0.548214603220117390, -0.548172785649855500, -0.548130966709161620, -0.548089146398140210, -0.548047324716896100, --0.548005501665533520, -0.547963677244157290, -0.547921851452871090, -0.547880024291781060, -0.547838195760990910, -0.547796365860605320, -0.547754534590728760, -0.547712701951465930, --0.547670867942921300, -0.547629032565198680, -0.547587195818404320, -0.547545357702642010, -0.547503518218016240, -0.547461677364631690, -0.547419835142592960, -0.547377991552004620, --0.547336146592971250, -0.547294300265597560, -0.547252452569987450, -0.547210603506246840, -0.547168753074479760, -0.547126901274790800, -0.547085048107284640, -0.547043193572065770, --0.547001337669238200, -0.546959480398908070, -0.546917621761179200, -0.546875761756156260, -0.546833900383943970, -0.546792037644646900, -0.546750173538369740, -0.546708308065217200, --0.546666441225293840, -0.546624573018703600, -0.546582703445552710, -0.546540832505945100, -0.546498960199985340, -0.546457086527778250, -0.546415211489428290, -0.546373335085040490, --0.546331457314718550, -0.546289578178568600, -0.546247697676694790, -0.546205815809201800, -0.546163932576194220, -0.546122047977776750, -0.546080162014054180, -0.546038274685131330, --0.545996385991111890, -0.545954495932102320, -0.545912604508206440, -0.545870711719529170, -0.545828817566174960, -0.545786922048248860, -0.545745025165855320, -0.545703126919098610, --0.545661227308084750, -0.545619326332917760, -0.545577423993702570, -0.545535520290543750, -0.545493615223546220, -0.545451708792814570, -0.545409800998453600, -0.545367891840567440, --0.545325981319262350, -0.545284069434642250, -0.545242156186811930, -0.545200241575876320, -0.545158325601940110, -0.545116408265107990, -0.545074489565484210, -0.545032569503174800, --0.544990648078284120, -0.544948725290916760, -0.544906801141177620, -0.544864875629171410, -0.544822948755003030, -0.544781020518777300, -0.544739090920599020, -0.544697159960572220, --0.544655227638803360, -0.544613293955396370, -0.544571358910456160, -0.544529422504087530, -0.544487484736395410, -0.544445545607483710, -0.544403605117459000, -0.544361663266425210, --0.544319720054487370, -0.544277775481750160, -0.544235829548318510, -0.544193882254297210, -0.544151933599791300, -0.544109983584905480, -0.544068032209744090, -0.544026079474413280, --0.543984125379017300, -0.543942169923660960, -0.543900213108449160, -0.543858254933486940, -0.543816295398878990, -0.543774334504729670, -0.543732372251145120, -0.543690408638229710, --0.543648443666088330, -0.543606477334825700, -0.543564509644546940, -0.543522540595356980, -0.543480570187360620, -0.543438598420662110, -0.543396625295367810, -0.543354650811581960, --0.543312674969409490, -0.543270697768955310, -0.543228719210324450, -0.543186739293621710, -0.543144758018951460, -0.543102775386419930, -0.543060791396131610, -0.543018806048191190, --0.542976819342703810, -0.542934831279774380, -0.542892841859507920, -0.542850851082009370, -0.542808858947382840, -0.542766865455734940, -0.542724870607169900, -0.542682874401792640, --0.542640876839708300, -0.542598877921021680, -0.542556877645837930, -0.542514876014261180, -0.542472873026398020, -0.542430868682352570, -0.542388862982230100, -0.542346855926135410, --0.542304847514173630, -0.542262837746449570, -0.542220826623068590, -0.542178814144135490, -0.542136800309754640, -0.542094785120032400, -0.542052768575073340, -0.542010750674982280, --0.541968731419864460, -0.541926710809824690, -0.541884688844967430, -0.541842665525399170, -0.541800640851224370, -0.541758614822547830, -0.541716587439474820, -0.541674558702110340, --0.541632528610559440, -0.541590497164927130, -0.541548464365318670, -0.541506430211838310, -0.541464394704592620, -0.541422357843685980, -0.541380319629223390, -0.541338280061310020, --0.541296239140050980, -0.541254196865551320, -0.541212153237915380, -0.541170108257249870, -0.541128061923659030, -0.541086014237248000, -0.541043965198122030, -0.541001914806386150, --0.540959863062145390, -0.540917809965504980, -0.540875755516569410, -0.540833699715445150, -0.540791642562236550, -0.540749584057048980, -0.540707524199987350, -0.540665462991156920, --0.540623400430662930, -0.540581336518609620, -0.540539271255103700, -0.540497204640249640, -0.540455136674152570, -0.540413067356917630, -0.540370996688649960, -0.540328924669454920, --0.540286851299437540, -0.540244776578702180, -0.540202700507355750, -0.540160623085502500, -0.540118544313247790, -0.540076464190696660, -0.540034382717954340, -0.539992299895126090, --0.539950215722316270, -0.539908130199631800, -0.539866043327176910, -0.539823955105056870, -0.539781865533377040, -0.539739774612242540, -0.539697682341758520, -0.539655588722030340, --0.539613493753163250, -0.539571397435261610, -0.539529299768432220, -0.539487200752779560, -0.539445100388408980, -0.539402998675425630, -0.539360895613934740, -0.539318791204040910, --0.539276685445850830, -0.539234578339468970, -0.539192469885000800, -0.539150360082551350, -0.539108248932226090, -0.539066136434130040, -0.539024022588368790, -0.538981907395047480, --0.538939790854270570, -0.538897672966144990, -0.538855553730775320, -0.538813433148266570, -0.538771311218724350, -0.538729187942253880, -0.538687063318959660, -0.538644937348948470, --0.538602810032325020, -0.538560681369194550, -0.538518551359662310, -0.538476420003833780, -0.538434287301814090, -0.538392153253708710, -0.538350017859623000, -0.538307881119661440, --0.538265743033931040, -0.538223603602536180, -0.538181462825582320, -0.538139320703174830, -0.538097177235418940, -0.538055032422420250, -0.538012886264283120, -0.537970738761114560, --0.537928589913019170, -0.537886439720102310, -0.537844288182469430, -0.537802135300225690, -0.537759981073476670, -0.537717825502327720, -0.537675668586883430, -0.537633510327250710, --0.537591350723534260, -0.537549189775839320, -0.537507027484271480, -0.537464863848936100, -0.537422698869938540, -0.537380532547383490, -0.537338364881377870, -0.537296195872026260, --0.537254025519434240, -0.537211853823707170, -0.537169680784950420, -0.537127506403269450, -0.537085330678769730, -0.537043153611556630, -0.537000975201735060, -0.536958795449411610, --0.536916614354691290, -0.536874431917679470, -0.536832248138481520, -0.536790063017202890, -0.536747876553948400, -0.536705688748824960, -0.536663499601937270, -0.536621309113390900, --0.536579117283291220, -0.536536924111743810, -0.536494729598854030, -0.536452533744727460, -0.536410336549469460, -0.536368138013184950, -0.536325938135980840, -0.536283736917961830, --0.536241534359233610, -0.536199330459901420, -0.536157125220070970, -0.536114918639846950, -0.536072710719336380, -0.536030501458643950, -0.535988290857875360, -0.535946078917136080, --0.535903865636531470, -0.535861651016167340, -0.535819435056149040, -0.535777217756582050, -0.535734999117571390, -0.535692779139223970, -0.535650557821644500, -0.535608335164938780, --0.535566111169212160, -0.535523885834570220, -0.535481659161118560, -0.535439431148962090, -0.535397201798207710, -0.535354971108960350, -0.535312739081325590, -0.535270505715408910, --0.535228271011316090, -0.535186034969152510, -0.535143797589023860, -0.535101558871034940, -0.535059318815292890, -0.535017077421902520, -0.534974834690969510, -0.534932590622599350, --0.534890345216897820, -0.534848098473970300, -0.534805850393921920, -0.534763600976859490, -0.534721350222888250, -0.534679098132113450, -0.534636844704641010, -0.534594589940576510, --0.534552333840025430, -0.534510076403093560, -0.534467817629886490, -0.534425557520509130, -0.534383296075068630, -0.534341033293669890, -0.534298769176418500, -0.534256503723420260, --0.534214236934780760, -0.534171968810604910, -0.534129699350999960, -0.534087428556070610, -0.534045156425922760, -0.534002882960662120, -0.533960608160394150, -0.533918332025224650, --0.533876054555259440, -0.533833775750603980, -0.533791495611363410, -0.533749214137644760, -0.533706931329553160, -0.533664647187194200, -0.533622361710673570, -0.533580074900097070, --0.533537786755569620, -0.533495497277198470, -0.533453206465088650, -0.533410914319345730, -0.533368620840075520, -0.533326326027383830, -0.533284029881376240, -0.533241732402158660, --0.533199433589836680, -0.533157133444515320, -0.533114831966301940, -0.533072529155301570, -0.533030225011619780, -0.532987919535362400, -0.532945612726635320, -0.532903304585544140, --0.532860995112193980, -0.532818684306691990, -0.532776372169143420, -0.532734058699653850, -0.532691743898329070, -0.532649427765275020, -0.532607110300597380, -0.532564791504402060, --0.532522471376793870, -0.532480149917880290, -0.532437827127766330, -0.532395503006557910, -0.532353177554360620, -0.532310850771280370, -0.532268522657423080, -0.532226193212893660, --0.532183862437799580, -0.532141530332245760, -0.532099196896338110, -0.532056862130182550, -0.532014526033884770, -0.531972188607550690, -0.531929849851286220, -0.531887509765197050, --0.531845168349388330, -0.531802825603967520, -0.531760481529039540, -0.531718136124710420, -0.531675789391085950, -0.531633441328272060, -0.531591091936373770, -0.531548741215498440, --0.531506389165751330, -0.531464035787238220, -0.531421681080065040, -0.531379325044337710, -0.531336967680162030, -0.531294608987643910, -0.531252248966889270, -0.531209887618003250, --0.531167524941093210, -0.531125160936264380, -0.531082795603622700, -0.531040428943274080, -0.530998060955324310, -0.530955691639878660, -0.530913320997044470, -0.530870949026927110, --0.530828575729632270, -0.530786201105265980, -0.530743825153934260, -0.530701447875742920, -0.530659069270797980, -0.530616689339205360, -0.530574308081070310, -0.530531925496500190, --0.530489541585600240, -0.530447156348476500, -0.530404769785234880, -0.530362381895981280, -0.530319992680821750, -0.530277602139861410, -0.530235210273207970, -0.530192817080966330, --0.530150422563242740, -0.530108026720143120, -0.530065629551773390, -0.530023231058239670, -0.529980831239647790, -0.529938430096103090, -0.529896027627713040, -0.529853623834583010, --0.529811218716818800, -0.529768812274526660, -0.529726404507812390, -0.529683995416782130, -0.529641585001541130, -0.529599173262196960, -0.529556760198854890, -0.529514345811620820, --0.529471930100601010, -0.529429513065901250, -0.529387094707627790, -0.529344675025886560, -0.529302254020782900, -0.529259831692424300, -0.529217408040916220, -0.529174983066364570, --0.529132556768875490, -0.529090129148554910, -0.529047700205509170, -0.529005269939843310, -0.528962838351665020, -0.528920405441079770, -0.528877971208193350, -0.528835535653112140, --0.528793098775941940, -0.528750660576789100, -0.528708221055759650, -0.528665780212959510, -0.528623338048494260, -0.528580894562471370, -0.528538449754996310, -0.528496003626175100, --0.528453556176113780, -0.528411107404918700, -0.528368657312695110, -0.528326205899550480, -0.528283753165590510, -0.528241299110920990, -0.528198843735648400, -0.528156387039878550, --0.528113929023717790, -0.528071469687272250, -0.528029009030647980, -0.527986547053950430, -0.527944083757287300, -0.527901619140763940, -0.527859153204486510, -0.527816685948561240, --0.527774217373094270, -0.527731747478191740, -0.527689276263959120, -0.527646803730503990, -0.527604329877931930, -0.527561854706348980, -0.527519378215861370, -0.527476900406575360, --0.527434421278597080, -0.527391940832032780, -0.527349459066987820, -0.527306975983570010, -0.527264491581884820, -0.527222005862038270, -0.527179518824136830, -0.527137030468286530, --0.527094540794593610, -0.527052049803163670, -0.527009557494104270, -0.526967063867521120, -0.526924568923520130, -0.526882072662207880, -0.526839575083690390, -0.526797076188073920, --0.526754575975464820, -0.526712074445968460, -0.526669571599692740, -0.526627067436743030, -0.526584561957225690, -0.526542055161246860, -0.526499547048913000, -0.526457037620330250, --0.526414526875604080, -0.526372014814842410, -0.526329501438150720, -0.526286986745635230, -0.526244470737402330, -0.526201953413558240, -0.526159434774209230, -0.526116914819461660, --0.526074393549421760, -0.526031870964195240, -0.525989347063889670, -0.525946821848610750, -0.525904295318464830, -0.525861767473558170, -0.525819238313997020, -0.525776707839887060, --0.525734176051336100, -0.525691642948449720, -0.525649108531334170, -0.525606572800095930, -0.525564035754841230, -0.525521497395676440, -0.525478957722707810, -0.525436416736041910, --0.525393874435784110, -0.525351330822042440, -0.525308785894922470, -0.525266239654530560, -0.525223692100972970, -0.525181143234356160, -0.525138593054786500, -0.525096041562369660, --0.525053488757213360, -0.525010934639423500, -0.524968379209106110, -0.524925822466367880, -0.524883264411315160, -0.524840705044054110, -0.524798144364691410, -0.524755582373332640, --0.524713019070085610, -0.524670454455056000, -0.524627888528350290, -0.524585321290074850, -0.524542752740336130, -0.524500182879240500, -0.524457611706893640, -0.524415039223403490, --0.524372465428875830, -0.524329890323416930, -0.524287313907133350, -0.524244736180131450, -0.524202157142517720, -0.524159576794398620, -0.524116995135879840, -0.524074412167069290, --0.524031827888072680, -0.523989242298996570, -0.523946655399947340, -0.523904067191031440, -0.523861477672355360, -0.523818886844024890, -0.523776294706147840, -0.523733701258830120, --0.523691106502178210, -0.523648510436298450, -0.523605913061297560, -0.523563314377281760, -0.523520714384357650, -0.523478113082631810, -0.523435510472209930, -0.523392906553200030, --0.523350301325707810, -0.523307694789839850, -0.523265086945702730, -0.523222477793402810, -0.523179867333046000, -0.523137255564740220, -0.523094642488591390, -0.523052028104705860, --0.523009412413190320, -0.522966795414151250, -0.522924177107695230, -0.522881557493928620, -0.522838936572958210, -0.522796314344889710, -0.522753690809831140, -0.522711065967888410, --0.522668439819168000, -0.522625812363776480, -0.522583183601820430, -0.522540553533406340, -0.522497922158640220, -0.522455289477629980, -0.522412655490481550, -0.522370020197301500, --0.522327383598196420, -0.522284745693272770, -0.522242106482637360, -0.522199465966396660, -0.522156824144656470, -0.522114181017525050, -0.522071536585108190, -0.522028890847512470, --0.521986243804844490, -0.521943595457210920, -0.521900945804718350, -0.521858294847472700, -0.521815642585582110, -0.521772989019152370, -0.521730334148290060, -0.521687677973102000, --0.521645020493694770, -0.521602361710174930, -0.521559701622649200, -0.521517040231223470, -0.521474377536005900, -0.521431713537102380, -0.521389048234619620, -0.521346381628664200, --0.521303713719342810, -0.521261044506762140, -0.521218373991028110, -0.521175702172248960, -0.521133029050530490, -0.521090354625979410, -0.521047678898702520, -0.521005001868806380, --0.520962323536397820, -0.520919643901583410, -0.520876962964469840, -0.520834280725163130, -0.520791597183771550, -0.520748912340400880, -0.520706226195157940, -0.520663538748149520, --0.520620849999482100, -0.520578159949261930, -0.520535468597597030, -0.520492775944593530, -0.520450081990358140, -0.520407386734997420, -0.520364690178618310, -0.520321992321327480, --0.520279293163231630, -0.520236592704437560, -0.520193890945051200, -0.520151187885180890, -0.520108483524932660, -0.520065777864413210, -0.520023070903729350, -0.519980362642987750, --0.519937653082295230, -0.519894942221757810, -0.519852230061483840, -0.519809516601579370, -0.519766801842150960, -0.519724085783305640, -0.519681368425150110, -0.519638649767791060, --0.519595929811335510, -0.519553208555889270, -0.519510486001560910, -0.519467762148456250, -0.519425036996682080, -0.519382310546345430, -0.519339582797552990, -0.519296853750411680, --0.519254123405027300, -0.519211391761508540, -0.519168658819961220, -0.519125924580492230, -0.519083189043208490, -0.519040452208216710, -0.518997714075623780, -0.518954974645536640, --0.518912233918061290, -0.518869491893306110, -0.518826748571377230, -0.518784003952381450, -0.518741258036425680, -0.518698510823616730, -0.518655762314061520, -0.518613012507866070, --0.518570261405138950, -0.518527509005986100, -0.518484755310514520, -0.518442000318831140, -0.518399244031042650, -0.518356486447256070, -0.518313727567578320, -0.518270967392116200, --0.518228205920975850, -0.518185443154265850, -0.518142679092092220, -0.518099913734561880, -0.518057147081781740, -0.518014379133858730, -0.517971609890898970, -0.517928839353011040, --0.517886067520300970, -0.517843294392875690, -0.517800519970842200, -0.517757744254307430, -0.517714967243378290, -0.517672188938161800, -0.517629409338764780, -0.517586628445293460, --0.517543846257856320, -0.517501062776559610, -0.517458278001510230, -0.517415491932815110, -0.517372704570581380, -0.517329915914915730, -0.517287125965924630, -0.517244334723716450, --0.517201542188397420, -0.517158748360074580, -0.517115953238854840, -0.517073156824845230, -0.517030359118152650, -0.516987560118884250, -0.516944759827146160, -0.516901958243046970, --0.516859155366692910, -0.516816351198190920, -0.516773545737648000, -0.516730738985171300, -0.516687930940867620, -0.516645121604843550, -0.516602310977207320, -0.516559499058065310, --0.516516685847524530, -0.516473871345692110, -0.516431055552674990, -0.516388238468580170, -0.516345420093514810, -0.516302600427585130, -0.516259779470899740, -0.516216957223564870, --0.516174133685687650, -0.516131308857375020, -0.516088482738734200, -0.516045655329872120, -0.516002826630895140, -0.515959996641911830, -0.515917165363028560, -0.515874332794352350, --0.515831498935990340, -0.515788663788049660, -0.515745827350637230, -0.515702989623860190, -0.515660150607825770, -0.515617310302640130, -0.515574468708412060, -0.515531625825247810, --0.515488781653254400, -0.515445936192539090, -0.515403089443209010, -0.515360241405370290, -0.515317392079131850, -0.515274541464599940, -0.515231689561881590, -0.515188836371084040, --0.515145981892314530, -0.515103126125679880, -0.515060269071287550, -0.515017410729244450, -0.514974551099657060, -0.514931690182634180, -0.514888827978281950, -0.514845964486707720, --0.514803099708018520, -0.514760233642321600, -0.514717366289724090, -0.514674497650332460, -0.514631627724255300, -0.514588756511599080, -0.514545884012470920, -0.514503010226978090, --0.514460135155227700, -0.514417258797327030, -0.514374381153383190, -0.514331502223502660, -0.514288622007794130, -0.514245740506364070, -0.514202857719319620, -0.514159973646767910, --0.514117088288816420, -0.514074201645572160, -0.514031313717141720, -0.513988424503633580, -0.513945534005154530, -0.513902642221811590, -0.513859749153712020, -0.513816854800963170, --0.513773959163672080, -0.513731062241946090, -0.513688164035891790, -0.513645264545617760, -0.513602363771230590, -0.513559461712837510, -0.513516558370545770, -0.513473653744462630, --0.513430747834695330, -0.513387840641350460, -0.513344932164536690, -0.513302022404360620, -0.513259111360929500, -0.513216199034350670, -0.513173285424731280, -0.513130370532178580, --0.513087454356800140, -0.513044536898702890, -0.513001618157993610, -0.512958698134781120, -0.512915776829171780, -0.512872854241273050, -0.512829930371192180, -0.512787005219036420, --0.512744078784912460, -0.512701151068929000, -0.512658222071192720, -0.512615291791810870, -0.512572360230890810, -0.512529427388539790, -0.512486493264865280, -0.512443557859974530, --0.512400621173974890, -0.512357683206972840, -0.512314743959077390, -0.512271803430395130, -0.512228861621033320, -0.512185918531099290, -0.512142974160700650, -0.512100028509943630, --0.512057081578937370, -0.512014133367788450, -0.511971183876604120, -0.511928233105491850, -0.511885281054558990, -0.511842327723913030, -0.511799373113661080, -0.511756417223910850, --0.511713460054768700, -0.511670501606343750, -0.511627541878742490, -0.511584580872072480, -0.511541618586440870, -0.511498655021955240, -0.511455690178723050, -0.511412724056850900, --0.511369756656447570, -0.511326787977619880, -0.511283818020475290, -0.511240846785121160, -0.511197874271664850, -0.511154900480213840, -0.511111925410875690, -0.511068949063756880, --0.511025971438966440, -0.510982992536611170, -0.510940012356798310, -0.510897030899635450, -0.510854048165230060, -0.510811064153689490, -0.510768078865120550, -0.510725092299632140, --0.510682104457330980, -0.510639115338324620, -0.510596124942720440, -0.510553133270625900, -0.510510140322148590, -0.510467146097395850, -0.510424150596475390, -0.510381153819493670, --0.510338155766559830, -0.510295156437780670, -0.510252155833263550, -0.510209153953116170, -0.510166150797445760, -0.510123146366359250, -0.510080140659965650, -0.510037133678371780, --0.509994125421684990, -0.509951115890012850, -0.509908105083462960, -0.509865093002142780, -0.509822079646159890, -0.509779065015621870, -0.509736049110635300, -0.509693031931309440, --0.509650013477751070, -0.509606993750067570, -0.509563972748366620, -0.509520950472755700, -0.509477926923341710, -0.509434902100233570, -0.509391876003538190, -0.509348848633363160, --0.509305819989816060, -0.509262790073004350, -0.509219758883035610, -0.509176726420017540, -0.509133692684057730, -0.509090657675262850, -0.509047621393742040, -0.509004583839602230, --0.508961545012950990, -0.508918504913895790, -0.508875463542544430, -0.508832420899004380, -0.508789376983382450, -0.508746331795787880, -0.508703285336327580, -0.508660237605108920, --0.508617188602239700, -0.508574138327827610, -0.508531086781980110, -0.508488033964804800, -0.508444979876408800, -0.508401924516901030, -0.508358867886388400, -0.508315809984978720, --0.508272750812779450, -0.508229690369898290, -0.508186628656442930, -0.508143565672520280, -0.508100501418239370, -0.508057435893707330, -0.508014369099031530, -0.507971301034319980, --0.507928231699680040, -0.507885161095219640, -0.507842089221046340, -0.507799016077267740, -0.507755941663990850, -0.507712865981324920, -0.507669789029376760, -0.507626710808254170, --0.507583631318064720, -0.507540550558916340, -0.507497468530915710, -0.507454385234172190, -0.507411300668792700, -0.507368214834885030, -0.507325127732556780, -0.507282039361915630, --0.507238949723069490, -0.507195858816125940, -0.507152766641192800, -0.507109673198376850, -0.507066578487787580, -0.507023482509531890, -0.506980385263717360, -0.506937286750452020, --0.506894186969843340, -0.506851085921998460, -0.506807983607026720, -0.506764880025034950, -0.506721775176130930, -0.506678669060422580, -0.506635561678017490, -0.506592453029023560, --0.506549343113548380, -0.506506231931699970, -0.506463119483585130, -0.506420005769313230, -0.506376890788991400, -0.506333774542727320, -0.506290657030628810, -0.506247538252803660, --0.506204418209359570, -0.506161296900403790, -0.506118174326045440, -0.506075050486391790, -0.506031925381550400, -0.505988799011629190, -0.505945671376736070, -0.505902542476978630, --0.505859412312465010, -0.505816280883301990, -0.505773148189599060, -0.505730014231463240, -0.505686879009002330, -0.505643742522324360, -0.505600604771536900, -0.505557465756748090, --0.505514325478064740, -0.505471183935596310, -0.505428041129449950, -0.505384897059733550, -0.505341751726554820, -0.505298605130021780, -0.505255457270242130, -0.505212308147323990, --0.505169157761374170, -0.505126006112502360, -0.505082853200815360, -0.505039699026421320, -0.504996543589428140, -0.504953386889943400, -0.504910228928075360, -0.504867069703930920, --0.504823909217619550, -0.504780747469248390, -0.504737584458925360, -0.504694420186758470, -0.504651254652855430, -0.504608087857324250, -0.504564919800272960, -0.504521750481809250, --0.504478579902040480, -0.504435408061076010, -0.504392234959022970, -0.504349060595989380, -0.504305884972083060, -0.504262708087412140, -0.504219529942083630, -0.504176350536207130, --0.504133169869889650, -0.504089987943239340, -0.504046804756363990, -0.504003620309371620, -0.503960434602370280, -0.503917247635467750, -0.503874059408772170, -0.503830869922390680, --0.503787679176432750, -0.503744487171005730, -0.503701293906217320, -0.503658099382175760, -0.503614903598988970, -0.503571706556764860, -0.503528508255610800, -0.503485308695636240, --0.503442107876948320, -0.503398905799655180, -0.503355702463864740, -0.503312497869685130, -0.503269292017224150, -0.503226084906590040, -0.503182876537889840, -0.503139666911233350, --0.503096456026727700, -0.503053243884480810, -0.503010030484600800, -0.502966815827195820, -0.502923599912373680, -0.502880382740241830, -0.502837164310909860, -0.502793944624484900, --0.502750723681075100, -0.502707501480788470, -0.502664278023733150, -0.502621053310017050, -0.502577827339748320, -0.502534600113034300, -0.502491371629984580, -0.502448141890706410, --0.502404910895307810, -0.502361678643897020, -0.502318445136581970, -0.502275210373470890, -0.502231974354670930, -0.502188737080291770, -0.502145498550440880, -0.502102258765226180, --0.502059017724755920, -0.502015775429138000, -0.501972531878480680, -0.501929287072892080, -0.501886041012480240, -0.501842793697352410, -0.501799545127618480, -0.501756295303385720, --0.501713044224762150, -0.501669791891856010, -0.501626538304775330, -0.501583283463627570, -0.501540027368522430, -0.501496770019567160, -0.501453511416870000, -0.501410251560539090, --0.501366990450682450, -0.501323728087408440, -0.501280464470824970, -0.501237199601040410, -0.501193933478162100, -0.501150666102299750, -0.501107397473560700, -0.501064127592053210, --0.501020856457885300, -0.500977584071165330, -0.500934310432001430, -0.500891035540500850, -0.500847759396773620, -0.500804482000926860, -0.500761203353068950, -0.500717923453308010, --0.500674642301752290, -0.500631359898509930, -0.500588076243689170, -0.500544791337397490, -0.500501505179744570, -0.500458217770837880, -0.500414929110785670, -0.500371639199696070, --0.500328348037677450, -0.500285055624837940, -0.500241761961285000, -0.500198467047128450, -0.500155170882475740, -0.500111873467435130, -0.500068574802114750, -0.500025274886623070, --0.499981973721068060, -0.499938671305558190, -0.499895367640200870, -0.499852062725105850, -0.499808756560380710, -0.499765449146133690, -0.499722140482473040, -0.499678830569507020, --0.499635519407343960, -0.499592206996091300, -0.499548893335858890, -0.499505578426754250, -0.499462262268885680, -0.499418944862361490, -0.499375626207289870, -0.499332306303779230, --0.499288985151937760, -0.499245662751873880, -0.499202339103695100, -0.499159014207511190, -0.499115688063429760, -0.499072360671559130, -0.499029032032007550, -0.498985702144883470, --0.498942371010294260, -0.498899038628350000, -0.498855704999158100, -0.498812370122826920, -0.498769033999464820, -0.498725696629180150, -0.498682358012081220, -0.498639018148276380, --0.498595677037874050, -0.498552334680981700, -0.498508991077709300, -0.498465646228164470, -0.498422300132455480, -0.498378952790690780, -0.498335604202978620, -0.498292254369427530, --0.498248903290144980, -0.498205550965240940, -0.498162197394823090, -0.498118842578999690, -0.498075486517879200, -0.498032129211569970, -0.497988770660180440, -0.497945410863818990, --0.497902049822593230, -0.497858687536613110, -0.497815324005986270, -0.497771959230821180, -0.497728593211226090, -0.497685225947309570, -0.497641857439179990, -0.497598487686945030, --0.497555116690714560, -0.497511744450596320, -0.497468370966698710, -0.497424996239130220, -0.497381620267999200, -0.497338243053414120, -0.497294864595483440, -0.497251484894314870, --0.497208103950018300, -0.497164721762701490, -0.497121338332472910, -0.497077953659440910, -0.497034567743714070, -0.496991180585400820, -0.496947792184608830, -0.496904402541448190, --0.496861011656026470, -0.496817619528452270, -0.496774226158833990, -0.496730831547280150, -0.496687435693899230, -0.496644038598799690, -0.496600640262090110, -0.496557240683878130, --0.496513839864273830, -0.496470437803384900, -0.496427034501319920, -0.496383629958187360, -0.496340224174095680, -0.496296817149152690, -0.496253408883468420, -0.496209999377150660, --0.496166588630307880, -0.496123176643048610, -0.496079763415481430, -0.496036348947714810, -0.495992933239857330, -0.495949516292017560, -0.495906098104303140, -0.495862678676824320, --0.495819258009688790, -0.495775836103005070, -0.495732412956881810, -0.495688988571427510, -0.495645562946750720, -0.495602136082959280, -0.495558707980163270, -0.495515278638470450, --0.495471848057989490, -0.495428416238828830, -0.495384983181097190, -0.495341548884903120, -0.495298113350355120, -0.495254676577561060, -0.495211238566631130, -0.495167799317673070, --0.495124358830795530, -0.495080917106107080, -0.495037474143716350, -0.494994029943731930, -0.494950584506261670, -0.494907137831415710, -0.494863689919301910, -0.494820240770028840, --0.494776790383705200, -0.494733338760439620, -0.494689885900340690, -0.494646431803517030, -0.494602976470076510, -0.494559519900129310, -0.494516062093783290, -0.494472603051147150, --0.494429142772329520, -0.494385681257439040, -0.494342218506584330, -0.494298754519873260, -0.494255289297416130, -0.494211822839320800, -0.494168355145695850, -0.494124886216650070, --0.494081416052292060, -0.494037944652730490, -0.493994472018074060, -0.493950998148431460, -0.493907523043910560, -0.493864046704621640, -0.493820569130672630, -0.493777090322172210, --0.493733610279229020, -0.493690129001951810, -0.493646646490448540, -0.493603162744829400, -0.493559677765202380, -0.493516191551676140, -0.493472704104359390, -0.493429215423360930, --0.493385725508789450, -0.493342234360753580, -0.493298741979362190, -0.493255248364723120, -0.493211753516946740, -0.493168257436141010, -0.493124760122414570, -0.493081261575876280, --0.493037761796634780, -0.492994260784798910, -0.492950758540476650, -0.492907255063778190, -0.492863750354811670, -0.492820244413685720, -0.492776737240509190, -0.492733228835390780, --0.492689719198439350, -0.492646208329763580, -0.492602696229471500, -0.492559182897673530, -0.492515668334477520, -0.492472152539992380, -0.492428635514326860, -0.492385117257589770, --0.492341597769889840, -0.492298077051335160, -0.492254555102036080, -0.492211031922100580, -0.492167507511637570, -0.492123981870755730, -0.492080454999563930, -0.492036926898171020, --0.491993397566685750, -0.491949867005216260, -0.491906335213872890, -0.491862802192763630, -0.491819267941997370, -0.491775732461682990, -0.491732195751929220, -0.491688657812844990, --0.491645118644538360, -0.491601578247119700, -0.491558036620697080, -0.491514493765379370, -0.491470949681275420, -0.491427404368494140, -0.491383857827144280, -0.491340310057334810, --0.491296761059174580, -0.491253210832771630, -0.491209659378236460, -0.491166106695677170, -0.491122552785202560, -0.491078997646921590, -0.491035441280943120, -0.490991883687375290, --0.490948324866328500, -0.490904764817910900, -0.490861203542231390, -0.490817641039398900, -0.490774077309522270, -0.490730512352710480, -0.490686946169072380, -0.490643378758716940, --0.490599810121752240, -0.490556240258288870, -0.490512669168434830, -0.490469096852299110, -0.490425523309990670, -0.490381948541618430, -0.490338372547291350, -0.490294795327117510, --0.490251216881207490, -0.490207637209669420, -0.490164056312612230, -0.490120474190144930, -0.490076890842376430, -0.490033306269415710, -0.489989720471371740, -0.489946133448352640, --0.489902545200469050, -0.489858955727829060, -0.489815365030541680, -0.489771773108715890, -0.489728179962460650, -0.489684585591884990, -0.489640989997097100, -0.489597393178207500, --0.489553795135324380, -0.489510195868556820, -0.489466595378013740, -0.489422993663804210, -0.489379390726037140, -0.489335786564821630, -0.489292181180265850, -0.489248574572480440, --0.489204966741573540, -0.489161357687654290, -0.489117747410831580, -0.489074135911214570, -0.489030523188912160, -0.488986909244032710, -0.488943294076686740, -0.488899677686982500, --0.488856060075029130, -0.488812441240935590, -0.488768821184810910, -0.488725199906764220, -0.488681577406904490, -0.488637953685340850, -0.488594328742181560, -0.488550702577537190, --0.488507075191516090, -0.488463446584227300, -0.488419816755779890, -0.488376185706282940, -0.488332553435844750, -0.488288919944575960, -0.488245285232584810, -0.488201649299980560, --0.488158012146872100, -0.488114373773368640, -0.488070734179579250, -0.488027093365613010, -0.487983451331579000, -0.487939808077585640, -0.487896163603743550, -0.487852517910160990, --0.487808870996947200, -0.487765222864211200, -0.487721573512062130, -0.487677922940608350, -0.487634271149960550, -0.487590618140227080, -0.487546963911517080, -0.487503308463939630, --0.487459651797603980, -0.487415993912619140, -0.487372334809094310, -0.487328674487138680, -0.487285012946860550, -0.487241350188370670, -0.487197686211777450, -0.487154021017189960, --0.487110354604717470, -0.487066686974469090, -0.487023018126553960, -0.486979348061080510, -0.486935676778159520, -0.486892004277899300, -0.486848330560409050, -0.486804655625798000, --0.486760979474175290, -0.486717302105650120, -0.486673623520331780, -0.486629943718328520, -0.486586262699751190, -0.486542580464708220, -0.486498897013308780, -0.486455212345662140, --0.486411526461877460, -0.486367839362063960, -0.486324151046330030, -0.486280461514786540, -0.486236770767541900, -0.486193078804705360, -0.486149385626386100, -0.486105691232693370, --0.486061995623736420, -0.486018298799624440, -0.485974600760466780, -0.485930901506371800, -0.485887201037450370, -0.485843499353810880, -0.485799796455562700, -0.485756092342815030, --0.485712387015677090, -0.485668680474257430, -0.485624972718666840, -0.485581263749013840, -0.485537553565407620, -0.485493842167957550, -0.485450129556772910, -0.485406415731962910, --0.485362700693636910, -0.485318984441904130, -0.485275266976873070, -0.485231548298654670, -0.485187828407357410, -0.485144107303090540, -0.485100384985963420, -0.485056661456085340, --0.485012936713564820, -0.484969210758512740, -0.484925483591037650, -0.484881755211248820, -0.484838025619255650, -0.484794294815167390, -0.484750562799093400, -0.484706829571142970, --0.484663095131425470, -0.484619359480049530, -0.484575622617125890, -0.484531884542763190, -0.484488145257070850, -0.484444404760158100, -0.484400663052134310, -0.484356920133108940, --0.484313176003190400, -0.484269430662489790, -0.484225684111115550, -0.484181936349177110, -0.484138187376783820, -0.484094437194045050, -0.484050685801070250, -0.484006933197968670, --0.483963179384849010, -0.483919424361822170, -0.483875668128996740, -0.483831910686482180, -0.483788152034387850, -0.483744392172823110, -0.483700631101897430, -0.483656868821719380, --0.483613105332399870, -0.483569340634047660, -0.483525574726772100, -0.483481807610682600, -0.483438039285888580, -0.483394269752499440, -0.483350499010624660, -0.483306727060373640, --0.483262953901854970, -0.483219179535179730, -0.483175403960456550, -0.483131627177794840, -0.483087849187304070, -0.483044069989093660, -0.483000289583272350, -0.482956507969951040, --0.482912725149238440, -0.482868941121244120, -0.482825155886077380, -0.482781369443847750, -0.482737581794664690, -0.482693792938637730, -0.482650002875876230, -0.482606211606488980, --0.482562419130586950, -0.482518625448278890, -0.482474830559674270, -0.482431034464882560, -0.482387237164013270, -0.482343438657175160, -0.482299638944479140, -0.482255838026034110, --0.482212035901949440, -0.482168232572334650, -0.482124428037299320, -0.482080622296952920, -0.482036815351404970, -0.481993007200764990, -0.481949197845141670, -0.481905387284646160, --0.481861575519387190, -0.481817762549474280, -0.481773948375016910, -0.481730132996124720, -0.481686316412907210, -0.481642498625473090, -0.481598679633933550, -0.481554859438397260, --0.481511038038973880, -0.481467215435772870, -0.481423391628903800, -0.481379566618476310, -0.481335740404599870, -0.481291912987383270, -0.481248084366937720, -0.481204254543371900, --0.481160423516795500, -0.481116591287318040, -0.481072757855049050, -0.481028923220098210, -0.480985087382574280, -0.480941250342588390, -0.480897412100249390, -0.480853572655666860, --0.480809732008950390, -0.480765890160209600, -0.480722047109554070, -0.480678202857093450, -0.480634357402937310, -0.480590510747194500, -0.480546662889976160, -0.480502813831391210, --0.480458963571549210, -0.480415112110559760, -0.480371259448532590, -0.480327405585576460, -0.480283550521802600, -0.480239694257319880, -0.480195836792237930, -0.480151978126666380, --0.480108118260714870, -0.480064257194493080, -0.480020394928110610, -0.479976531461677180, -0.479932666795301670, -0.479888800929095250, -0.479844933863166790, -0.479801065597626030, --0.479757196132582610, -0.479713325468146210, -0.479669453604425700, -0.479625580541532310, -0.479581706279575030, -0.479537830818663410, -0.479493954158907280, -0.479450076300416250, --0.479406197243300030, -0.479362316987668290, -0.479318435533630790, -0.479274552881296390, -0.479230669030776380, -0.479186783982179730, -0.479142897735616140, -0.479099010291195280, --0.479055121649026860, -0.479011231809220670, -0.478967340771885630, -0.478923448537133030, -0.478879555105071740, -0.478835660475811660, -0.478791764649462380, -0.478747867626133640, --0.478703969405935290, -0.478660069988977030, -0.478616169375367770, -0.478572267565218870, -0.478528364558639340, -0.478484460355738880, -0.478440554956627240, -0.478396648361414270, --0.478352740570209660, -0.478308831583122370, -0.478264921400263830, -0.478221010021743000, -0.478177097447669620, -0.478133183678153490, -0.478089268713304370, -0.478045352553232160, --0.478001435198046500, -0.477957516647856520, -0.477913596902773520, -0.477869675962906470, -0.477825753828365280, -0.477781830499259710, -0.477737905975699540, -0.477693980257794640, --0.477650053345653970, -0.477606125239389000, -0.477562195939108650, -0.477518265444922870, -0.477474333756941370, -0.477430400875274110, -0.477386466800030770, -0.477342531531321280, --0.477298595069254710, -0.477254657413942460, -0.477210718565493520, -0.477166778524017790, -0.477122837289625120, -0.477078894862425330, -0.477034951242528320, -0.476991006430043940, --0.476947060425081280, -0.476903113227751700, -0.476859164838164370, -0.476815215256429170, -0.476771264482655890, -0.476727312516954440, -0.476683359359434680, -0.476639405010206570, --0.476595449469379150, -0.476551492737063930, -0.476507534813369940, -0.476463575698407080, -0.476419615392285330, -0.476375653895114550, -0.476331691207004580, -0.476287727328064630, --0.476243762258406140, -0.476199795998138280, -0.476155828547370870, -0.476111859906213960, -0.476067890074777340, -0.476023919053171040, -0.475979946841504910, -0.475935973439888140, --0.475891998848432200, -0.475848023067246270, -0.475804046096440340, -0.475760067936124240, -0.475716088586407960, -0.475672108047401510, -0.475628126319213970, -0.475584143401956870, --0.475540159295739450, -0.475496174000671620, -0.475452187516863410, -0.475408199844424670, -0.475364210983465430, -0.475320220934095710, -0.475276229696424580, -0.475232237270563740, --0.475188243656622270, -0.475144248854710180, -0.475100252864937460, -0.475056255687414110, -0.475012257322250160, -0.474968257769554760, -0.474924257029439520, -0.474880255102013590, --0.474836251987387050, -0.474792247685669910, -0.474748242196972090, -0.474704235521403730, -0.474660227659074730, -0.474616218610094400, -0.474572208374574310, -0.474528196952623660, --0.474484184344352580, -0.474440170549870980, -0.474396155569288990, -0.474352139402716590, -0.474308122050263850, -0.474264103512040070, -0.474220083788156780, -0.474176062878723270, --0.474132040783849570, -0.474088017503645820, -0.474043993038221980, -0.473999967387688240, -0.473955940552154510, -0.473911912531730150, -0.473867883326526800, -0.473823852936653740, --0.473779821362221080, -0.473735788603338870, -0.473691754660117150, -0.473647719532666040, -0.473603683221094860, -0.473559645725515290, -0.473515607046036570, -0.473471567182768840, --0.473427526135822170, -0.473383483905306710, -0.473339440491332530, -0.473295395894009760, -0.473251350113447710, -0.473207303149758060, -0.473163255003050180, -0.473119205673434130, --0.473075155161020110, -0.473031103465918200, -0.472987050588238480, -0.472942996528090350, -0.472898941285585570, -0.472854884860833380, -0.472810827253944020, -0.472766768465027580, --0.472722708494194230, -0.472678647341554070, -0.472634585007217330, -0.472590521491293320, -0.472546456793893840, -0.472502390915128130, -0.472458323855106500, -0.472414255613939070, --0.472370186191735990, -0.472326115588607430, -0.472282043804662820, -0.472237970840013840, -0.472193896694769970, -0.472149821369041380, -0.472105744862938210, -0.472061667176570670, --0.472017588310048970, -0.471973508263483280, -0.471929427036983040, -0.471885344630660060, -0.471841261044623710, -0.471797176278984150, -0.471753090333851710, -0.471709003209336510, --0.471664914905548790, -0.471620825422598810, -0.471576734760596030, -0.471532642919652130, -0.471488549899876650, -0.471444455701379770, -0.471400360324271740, -0.471356263768662850, --0.471312166034663300, -0.471268067122383340, -0.471223967031932370, -0.471179865763422300, -0.471135763316962610, -0.471091659692663480, -0.471047554890635160, -0.471003448910988000, --0.470959341753832190, -0.470915233419277270, -0.470871123907435020, -0.470827013218415020, -0.470782901352327420, -0.470738788309282620, -0.470694674089390810, -0.470650558692762340, --0.470606442119507420, -0.470562324369735660, -0.470518205443558880, -0.470474085341086590, -0.470429964062429040, -0.470385841607696640, -0.470341717976999580, -0.470297593170448280, --0.470253467188152140, -0.470209340030223190, -0.470165211696770840, -0.470121082187905490, -0.470076951503737460, -0.470032819644376990, -0.469988686609934480, -0.469944552400520300, --0.469900417016243910, -0.469856280457217280, -0.469812142723549990, -0.469768003815352280, -0.469723863732734560, -0.469679722475807250, -0.469635580044680530, -0.469591436439464160, --0.469547291660269980, -0.469503145707207530, -0.469458998580387250, -0.469414850279919470, -0.469370700805914530, -0.469326550158482850, -0.469282398337734830, -0.469238245343780000, --0.469194091176730330, -0.469149935836695450, -0.469105779323785720, -0.469061621638111550, -0.469017462779783350, -0.468973302748911470, -0.468929141545606330, -0.468884979169977570, --0.468840815622137140, -0.468796650902194630, -0.468752485010260570, -0.468708317946445240, -0.468664149710859120, -0.468619980303612630, -0.468575809724816220, -0.468531637974579470, --0.468487465053014420, -0.468443290960230680, -0.468399115696338740, -0.468354939261449000, -0.468310761655671930, -0.468266582879117930, -0.468222402931896760, -0.468178221814120280, --0.468134039525898270, -0.468089856067341210, -0.468045671438559460, -0.468001485639663540, -0.467957298670763910, -0.467913110531971040, -0.467868921223394570, -0.467824730745146630, --0.467780539097336860, -0.467736346280075710, -0.467692152293473720, -0.467647957137641350, -0.467603760812689060, -0.467559563318726610, -0.467515364655866020, -0.467471164824217020, --0.467426963823890150, -0.467382761654995820, -0.467338558317644590, -0.467294353811947010, -0.467250148138013520, -0.467205941295953830, -0.467161733285880120, -0.467117524107902080, --0.467073313762130240, -0.467029102248675050, -0.466984889567647170, -0.466940675719157040, -0.466896460703314420, -0.466852244520231500, -0.466808027170017900, -0.466763808652784270, --0.466719588968641070, -0.466675368117698940, -0.466631146100068390, -0.466586922915859960, -0.466542698565183430, -0.466498473048150950, -0.466454246364872320, -0.466410018515458050, --0.466365789500018720, -0.466321559318664920, -0.466277327971507230, -0.466233095458656210, -0.466188861780221670, -0.466144626936315810, -0.466100390927048300, -0.466056153752529840, --0.466011915412871010, -0.465967675908182390, -0.465923435238574600, -0.465879193404158180, -0.465834950405043020, -0.465790706241341280, -0.465746460913162740, -0.465702214420618100, --0.465657966763817880, -0.465613717942872760, -0.465569467957893330, -0.465525216808989450, -0.465480964496273300, -0.465436711019854790, -0.465392456379844440, -0.465348200576353010, --0.465303943609491010, -0.465259685479369190, -0.465215426186098180, -0.465171165729787780, -0.465126904110550240, -0.465082641328495470, -0.465038377383734100, -0.464994112276376770, --0.464949846006534220, -0.464905578574316970, -0.464861309979835050, -0.464817040223200580, -0.464772769304523550, -0.464728497223914570, -0.464684223981484400, -0.464639949577343610, --0.464595674011603010, -0.464551397284373170, -0.464507119395764060, -0.464462840345887920, -0.464418560134854720, -0.464374278762775150, -0.464329996229759790, -0.464285712535919490, --0.464241427681364950, -0.464197141666206010, -0.464152854490554990, -0.464108566154521840, -0.464064276658217310, -0.464019986001752040, -0.463975694185236820, -0.463931401208782400, --0.463887107072499420, -0.463842811776497940, -0.463798515320890170, -0.463754217705786180, -0.463709918931296590, -0.463665618997532230, -0.463621317904603760, -0.463577015652622050, --0.463532712241697790, -0.463488407671940990, -0.463444101943463920, -0.463399795056376630, -0.463355487010789820, -0.463311177806814300, -0.463266867444560860, -0.463222555924140190, --0.463178243245663200, -0.463133929409239810, -0.463089614414982310, -0.463045298263000840, -0.463000980953406140, -0.462956662486308960, -0.462912342861820090, -0.462868022080050400, --0.462823700141109850, -0.462779377045110850, -0.462735052792163430, -0.462690727382378380, -0.462646400815866440, -0.462602073092738600, -0.462557744213105470, -0.462513414177078030, --0.462469082984766300, -0.462424750636282630, -0.462380417131737050, -0.462336082471240470, -0.462291746654903690, -0.462247409682837510, -0.462203071555152780, -0.462158732271959640, --0.462114391833370440, -0.462070050239495270, -0.462025707490444970, -0.461981363586330350, -0.461937018527262380, -0.461892672313351850, -0.461848324944709620, -0.461803976421445830, --0.461759626743672880, -0.461715275911500860, -0.461670923925040610, -0.461626570784403110, -0.461582216489699100, -0.461537861041039610, -0.461493504438534710, -0.461449146682296810, --0.461404787772435990, -0.461360427709063270, -0.461316066492289460, -0.461271704122225460, -0.461227340598982240, -0.461182975922670600, -0.461138610093400790, -0.461094243111285220, --0.461049874976434070, -0.461005505688958210, -0.460961135248968590, -0.460916763656576130, -0.460872390911891800, -0.460828017015025680, -0.460783641966090280, -0.460739265765195800, --0.460694888412453150, -0.460650509907973290, -0.460606130251867140, -0.460561749444245660, -0.460517367485219820, -0.460472984374900530, -0.460428600113398030, -0.460384214700824800, --0.460339828137291020, -0.460295440422907710, -0.460251051557785780, -0.460206661542036210, -0.460162270375770010, -0.460117878059097320, -0.460073484592130770, -0.460029089974980430, --0.459984694207757450, -0.459940297290572670, -0.459895899223537190, -0.459851500006761950, -0.459807099640357930, -0.459762698124435380, -0.459718295459106920, -0.459673891644482690, --0.459629486680673720, -0.459585080567791020, -0.459540673305945670, -0.459496264895248590, -0.459451855335810120, -0.459407444627742740, -0.459363032771156750, -0.459318619766163230, --0.459274205612873130, -0.459229790311397490, -0.459185373861847430, -0.459140956264333880, -0.459096537518967170, -0.459052117625859900, -0.459007696585122360, -0.458963274396865570, --0.458918851061200620, -0.458874426578238510, -0.458830000948090340, -0.458785574170866350, -0.458741146246679220, -0.458696717175639260, -0.458652286957857480, -0.458607855593445020, --0.458563423082512910, -0.458518989425172220, -0.458474554621534080, -0.458430118671708740, -0.458385681575808890, -0.458341243333944830, -0.458296803946227680, -0.458252363412768540, --0.458207921733678470, -0.458163478909068610, -0.458119034939049260, -0.458074589823733060, -0.458030143563230460, -0.457985696157652440, -0.457941247607110250, -0.457896797911714890, --0.457852347071577510, -0.457807895086809360, -0.457763441957521390, -0.457718987683824020, -0.457674532265830050, -0.457630075703649660, -0.457585617997394110, -0.457541159147174530, --0.457496699153102090, -0.457452238015287840, -0.457407775733842230, -0.457363312308877950, -0.457318847740505410, -0.457274382028835750, -0.457229915173980150, -0.457185447176049700, --0.457140978035155690, -0.457096507751409250, -0.457052036324920700, -0.457007563755802870, -0.456963090044166130, -0.456918615190121670, -0.456874139193780670, -0.456829662055254330, --0.456785183774653820, -0.456740704352089580, -0.456696223787674330, -0.456651742081518540, -0.456607259233733410, -0.456562775244430120, -0.456518290113719920, -0.456473803841713990, --0.456429316428523520, -0.456384827874258990, -0.456340338179033130, -0.456295847342956470, -0.456251355366140200, -0.456206862248695550, -0.456162367990733730, -0.456117872592365970, --0.456073376053702790, -0.456028878374856890, -0.455984379555938850, -0.455939879597059840, -0.455895378498331120, -0.455850876259863980, -0.455806372881769620, -0.455761868364159330, --0.455717362707143580, -0.455672855910835280, -0.455628347975344740, -0.455583838900783410, -0.455539328687262430, -0.455494817334893170, -0.455450304843786850, -0.455405791214053950, --0.455361276445807370, -0.455316760539157650, -0.455272243494215970, -0.455227725311093730, -0.455183205989902140, -0.455138685530752540, -0.455094163933756230, -0.455049641199024520, --0.455005117326667930, -0.454960592316799310, -0.454916066169529230, -0.454871538884968950, -0.454827010463229870, -0.454782480904423190, -0.454737950208660370, -0.454693418376051870, --0.454648885406710610, -0.454604351300747170, -0.454559816058272840, -0.454515279679398920, -0.454470742164236830, -0.454426203512897920, -0.454381663725493490, -0.454337122802134060, --0.454292580742932660, -0.454248037547999810, -0.454203493217446850, -0.454158947751385160, -0.454114401149926070, -0.454069853413181010, -0.454025304541260550, -0.453980754534277550, --0.453936203392342750, -0.453891651115567400, -0.453847097704062900, -0.453802543157940660, -0.453757987477312110, -0.453713430662288530, -0.453668872712980620, -0.453624313629501340, --0.453579753411961220, -0.453535192060471770, -0.453490629575144300, -0.453446065956090270, -0.453401501203421100, -0.453356935317247360, -0.453312368297682070, -0.453267800144835860, --0.453223230858820160, -0.453178660439746360, -0.453134088887725940, -0.453089516202870300, -0.453044942385290860, -0.453000367435098250, -0.452955791352405550, -0.452911214137323330, --0.452866635789963110, -0.452822056310436320, -0.452777475698854350, -0.452732893955328670, -0.452688311079969980, -0.452643727072891360, -0.452599141934203360, -0.452554555664017530, --0.452509968262445330, -0.452465379729598160, -0.452420790065587550, -0.452376199270525030, -0.452331607344521160, -0.452287014287689080, -0.452242420100139430, -0.452197824781983780, --0.452153228333333550, -0.452108630754300240, -0.452064032044995350, -0.452019432205530420, -0.451974831236016060, -0.451930229136565440, -0.451885625907289260, -0.451841021548299030, --0.451796416059706220, -0.451751809441622350, -0.451707201694159010, -0.451662592817427600, -0.451617982811538980, -0.451573371676606160, -0.451528759412739900, -0.451484146020051770, --0.451439531498653290, -0.451394915848655930, -0.451350299070171320, -0.451305681163310160, -0.451261062128185560, -0.451216441964908340, -0.451171820673590020, -0.451127198254342110, --0.451082574707276250, -0.451037950032503960, -0.450993324230136770, -0.450948697300285470, -0.450904069243063200, -0.450859440058580810, -0.450814809746949760, -0.450770178308281750, --0.450725545742688250, -0.450680912050280880, -0.450636277231170500, -0.450591641285470130, -0.450547004213290750, -0.450502366014743800, -0.450457726689940940, -0.450413086238993790, --0.450368444662013870, -0.450323801959112870, -0.450279158130401590, -0.450234513175993220, -0.450189867095998510, -0.450145219890529190, -0.450100571559696790, -0.450055922103612950, --0.450011271522389340, -0.449966619816136730, -0.449921966984968390, -0.449877313028995090, -0.449832657948328550, -0.449788001743080370, -0.449743344413362170, -0.449698685959285580, --0.449654026380962300, -0.449609365678503180, -0.449564703852021410, -0.449520040901627890, -0.449475376827434270, -0.449430711629552230, -0.449386045308093340, -0.449341377863169410, --0.449296709294892020, -0.449252039603372070, -0.449207368788722810, -0.449162696851055090, -0.449118023790480660, -0.449073349607111150, -0.449028674301058310, -0.448983997872433760, --0.448939320321349200, -0.448894641647915540, -0.448849961852246130, -0.448805280934451770, -0.448760598894644200, -0.448715915732935120, -0.448671231449436270, -0.448626546044259390, --0.448581859517515280, -0.448537171869317350, -0.448492483099776460, -0.448447793209004410, -0.448403102197112880, -0.448358410064213560, -0.448313716810418210, -0.448269022435838600, --0.448224326940585620, -0.448179630324772590, -0.448134932588510500, -0.448090233731911090, -0.448045533755086100, -0.448000832658147270, -0.447956130441206410, -0.447911427104374370, --0.447866722647764560, -0.447822017071487940, -0.447777310375656320, -0.447732602560381390, -0.447687893625774940, -0.447643183571948770, -0.447598472399014680, -0.447553760107083590, --0.447509046696268840, -0.447464332166681520, -0.447419616518433370, -0.447374899751636190, -0.447330181866401780, -0.447285462862841880, -0.447240742741067510, -0.447196021501192090, --0.447151299143326630, -0.447106575667582940, -0.447061851074072760, -0.447017125362908000, -0.446972398534200400, -0.446927670588061820, -0.446882941524603280, -0.446838211343938140, --0.446793480046177530, -0.446748747631433190, -0.446704014099816970, -0.446659279451440680, -0.446614543686416230, -0.446569806804855470, -0.446525068806869320, -0.446480329692571340, --0.446435589462072510, -0.446390848115484740, -0.446346105652919820, -0.446301362074489670, -0.446256617380306090, -0.446211871570480920, -0.446167124645125370, -0.446122376604352720, --0.446077627448274170, -0.446032877177001570, -0.445988125790646730, -0.445943373289321600, -0.445898619673138040, -0.445853864942207130, -0.445809109096642340, -0.445764352136554800, --0.445719594062056410, -0.445674834873258980, -0.445630074570274480, -0.445585313153214810, -0.445540550622191830, -0.445495786977316680, -0.445451022218702860, -0.445406256346461530, --0.445361489360704520, -0.445316721261543760, -0.445271952049091260, -0.445227181723458820, -0.445182410284757690, -0.445137637733101280, -0.445092864068600770, -0.445048089291368130, --0.445003313401515280, -0.444958536399154110, -0.444913758284396610, -0.444868979057354730, -0.444824198718139610, -0.444779417266864760, -0.444734634703641380, -0.444689851028581440, --0.444645066241796840, -0.444600280343399600, -0.444555493333501640, -0.444510705212214140, -0.444465915979650680, -0.444421125635922450, -0.444376334181141420, -0.444331541615419550, --0.444286747938868800, -0.444241953151601140, -0.444197157253728660, -0.444152360245362480, -0.444107562126616170, -0.444062762897600990, -0.444017962558428900, -0.443973161109211870, --0.443928358550061960, -0.443883554881091160, -0.443838750102411470, -0.443793944214134100, -0.443749137216372660, -0.443704329109238400, -0.443659519892843300, -0.443614709567299430, --0.443569898132718740, -0.443525085589213330, -0.443480271936895210, -0.443435457175875620, -0.443390641306268150, -0.443345824328184090, -0.443301006241735520, -0.443256187047034340, --0.443211366744192760, -0.443166545333322780, -0.443121722814535600, -0.443076899187944910, -0.443032074453661990, -0.442987248611798890, -0.442942421662467610, -0.442897593605780350, --0.442852764441849070, -0.442807934170785900, -0.442763102792702030, -0.442718270307711270, -0.442673436715924850, -0.442628602017454800, -0.442583766212413240, -0.442538929300912260, --0.442494091283063990, -0.442449252158979680, -0.442404411928773060, -0.442359570592555370, -0.442314728150438760, -0.442269884602535360, -0.442225039948957180, -0.442180194189816470, --0.442135347325225250, -0.442090499355294870, -0.442045650280139040, -0.442000800099869080, -0.441955948814597100, -0.441911096424435270, -0.441866242929495720, -0.441821388329890540, --0.441776532625731080, -0.441731675817131130, -0.441686817904201940, -0.441641958887055710, -0.441597098765804610, -0.441552237540560780, -0.441507375211436290, -0.441462511778543400, --0.441417647241993450, -0.441372781601900190, -0.441327914858374910, -0.441283047011529870, -0.441238178061477250, -0.441193308008329180, -0.441148436852197790, -0.441103564593195330, --0.441058691231433210, -0.441013816767025110, -0.440968941200082450, -0.440924064530717470, -0.440879186759042360, -0.440834307885169200, -0.440789427909210330, -0.440744546831277890, --0.440699664651483250, -0.440654781369940300, -0.440609896986760340, -0.440565011502055680, -0.440520124915938500, -0.440475237228520940, -0.440430348439915350, -0.440385458550233090, --0.440340567559587950, -0.440295675468091400, -0.440250782275855680, -0.440205887982992980, -0.440160992589615610, -0.440116096095835680, -0.440071198501765570, -0.440026299807516620, --0.439981400013202740, -0.439936499118935400, -0.439891597124826780, -0.439846694030989140, -0.439801789837534820, -0.439756884544575950, -0.439711978152224130, -0.439667070660593180, --0.439622162069794490, -0.439577252379940440, -0.439532341591143240, -0.439487429703515230, -0.439442516717168610, -0.439397602632215670, -0.439352687448767990, -0.439307771166939310, --0.439262853786841270, -0.439217935308586050, -0.439173015732286010, -0.439128095058053450, -0.439083173286000660, -0.439038250416239120, -0.438993326448882730, -0.438948401384043010, --0.438903475221832320, -0.438858547962362950, -0.438813619605747220, -0.438768690152097410, -0.438723759601525880, -0.438678827954144200, -0.438633895210066180, -0.438588961369403450, --0.438544026432268310, -0.438499090398773110, -0.438454153269030200, -0.438409215043151890, -0.438364275721250580, -0.438319335303437750, -0.438274393789827350, -0.438229451180531030, --0.438184507475661010, -0.438139562675329770, -0.438094616779649610, -0.438049669788732890, -0.438004721702692060, -0.437959772521638540, -0.437914822245686450, -0.437869870874947280, --0.437824918409533470, -0.437779964849557330, -0.437735010195131280, -0.437690054446367720, -0.437645097603378160, -0.437600139666276760, -0.437555180635174960, -0.437510220510185180, --0.437465259291419880, -0.437420296978991430, -0.437375333573012230, -0.437330369073594680, -0.437285403480850430, -0.437240436794893490, -0.437195469015835450, -0.437150500143788700, --0.437105530178865720, -0.437060559121178920, -0.437015586970840750, -0.436970613727962750, -0.436925639392659100, -0.436880663965041270, -0.436835687445221830, -0.436790709833313140, --0.436745731129427720, -0.436700751333677920, -0.436655770446176260, -0.436610788467034380, -0.436565805396366360, -0.436520821234283760, -0.436475835980899170, -0.436430849636324950, --0.436385862200673600, -0.436340873674057660, -0.436295884056588650, -0.436250893348380800, -0.436205901549545690, -0.436160908660195800, -0.436115914680443690, -0.436070919610401730, --0.436025923450182540, -0.435980926199898480, -0.435935927859661340, -0.435890928429585160, -0.435845927909781720, -0.435800926300363380, -0.435755923601442770, -0.435710919813132310, --0.435665914935544630, -0.435620908968791300, -0.435575901912986510, -0.435530893768241940, -0.435485884534670190, -0.435440874212383700, -0.435395862801495000, -0.435350850302116680, --0.435305836714361240, -0.435260822038341160, -0.435215806274168280, -0.435170789421956640, -0.435125771481818080, -0.435080752453865020, -0.435035732338210130, -0.434990711134965900, --0.434945688844244890, -0.434900665466158850, -0.434855641000821970, -0.434810615448345980, -0.434765588808843420, -0.434720561082426900, -0.434675532269209020, -0.434630502369302290, --0.434585471382819280, -0.434540439309871800, -0.434495406150574030, -0.434450371905037710, -0.434405336573375540, -0.434360300155699990, -0.434315262652123670, -0.434270224062759170, --0.434225184387718340, -0.434180143627115380, -0.434135101781062020, -0.434090058849670950, -0.434045014833054690, -0.433999969731325930, -0.433954923544597190, -0.433909876272981170, --0.433864827916589700, -0.433819778475536880, -0.433774727949934660, -0.433729676339895620, -0.433684623645532400, -0.433639569866957620, -0.433594515004283920, -0.433549459057623100, --0.433504402027089450, -0.433459343912794780, -0.433414284714851770, -0.433369224433373060, -0.433324163068471270, -0.433279100620259090, -0.433234037088849110, -0.433188972474353280, --0.433143906776885800, -0.433098839996558570, -0.433053772133484280, -0.433008703187775510, -0.432963633159544950, -0.432918562048905330, -0.432873489855968570, -0.432828416580848810, --0.432783342223658050, -0.432738266784508880, -0.432693190263514100, -0.432648112660786340, -0.432603033976438290, -0.432557954210582630, -0.432512873363332110, -0.432467791434798630, --0.432422708425096390, -0.432377624334337460, -0.432332539162634420, -0.432287452910100070, -0.432242365576847090, -0.432197277162988170, -0.432152187668635280, -0.432107097093902710, --0.432062005438902390, -0.432016912703747040, -0.431971818888549410, -0.431926723993422300, -0.431881628018478290, -0.431836530963830290, -0.431791432829590090, -0.431746333615872170, --0.431701233322788370, -0.431656131950451490, -0.431611029498974340, -0.431565925968469540, -0.431520821359049960, -0.431475715670827540, -0.431430608903916600, -0.431385501058429150, --0.431340392134478000, -0.431295282132175770, -0.431250171051635430, -0.431205058892969620, -0.431159945656291120, -0.431114831341712020, -0.431069715949346620, -0.431024599479306940, --0.430979481931705770, -0.430934363306655850, -0.430889243604270060, -0.430844122824661170, -0.430799000967941160, -0.430753878034224440, -0.430708754023623020, -0.430663628936249710, --0.430618502772217360, -0.430573375531638710, -0.430528247214626620, -0.430483117821293950, -0.430437987351752700, -0.430392855806117250, -0.430347723184499650, -0.430302589487012780, --0.430257454713769420, -0.430212318864882370, -0.430167181940464600, -0.430122043940628030, -0.430076904865487160, -0.430031764715154030, -0.429986623489741540, -0.429941481189362430, --0.429896337814129610, -0.429851193364156000, -0.429806047839554340, -0.429760901240437590, -0.429715753566917820, -0.429670604819109400, -0.429625454997124510, -0.429580304101076000, --0.429535152131076740, -0.429489999087239560, -0.429444844969677390, -0.429399689778502290, -0.429354533513828800, -0.429309376175768980, -0.429264217764435680, -0.429219058279941830, --0.429173897722400390, -0.429128736091924150, -0.429083573388626130, -0.429038409612618300, -0.428993244764015290, -0.428948078842929180, -0.428902911849472880, -0.428857743783759290, --0.428812574645901330, -0.428767404436011910, -0.428722233154203210, -0.428677060800589760, -0.428631887375283630, -0.428586712878397720, -0.428541537310045130, -0.428496360670338640, --0.428451182959391220, -0.428406004177315890, -0.428360824324224730, -0.428315643400232320, -0.428270461405450830, -0.428225278339993130, -0.428180094203972290, -0.428134908997501170, --0.428089722720692790, -0.428044535373659330, -0.427999346956515310, -0.427954157469372930, -0.427908966912345150, -0.427863775285544920, -0.427818582589085280, -0.427773388823079190, --0.427728193987639620, -0.427682998082878800, -0.427637801108911250, -0.427592603065849170, -0.427547403953805640, -0.427502203772893610, -0.427457002523225990, -0.427411800204915930, --0.427366596818075540, -0.427321392362819460, -0.427276186839259940, -0.427230980247509880, -0.427185772587682420, -0.427140563859890520, -0.427095354064247200, -0.427050143200865540, --0.427004931269858500, -0.426959718271338270, -0.426914504205419600, -0.426869289072214660, -0.426824072871836550, -0.426778855604398210, -0.426733637270012680, -0.426688417868793140, --0.426643197400851710, -0.426597975866303100, -0.426552753265259540, -0.426507529597834110, -0.426462304864139890, -0.426417079064289830, -0.426371852198397130, -0.426326624266574810, --0.426281395268935100, -0.426236165205592710, -0.426190934076659870, -0.426145701882249760, -0.426100468622475360, -0.426055234297449790, -0.426009998907286140, -0.425964762452096690, --0.425919524931996140, -0.425874286347096730, -0.425829046697511650, -0.425783805983353970, -0.425738564204736770, -0.425693321361773120, -0.425648077454576170, -0.425602832483258250, --0.425557586447934070, -0.425512339348715910, -0.425467091185716910, -0.425421841959050140, -0.425376591668828800, -0.425331340315165950, -0.425286087898173960, -0.425240834417967560, --0.425195579874659110, -0.425150324268361630, -0.425105067599188420, -0.425059809867252500, -0.425014551072667060, -0.424969291215545280, -0.424924030295999400, -0.424878768314144280, --0.424833505270092230, -0.424788241163956470, -0.424742975995850040, -0.424697709765886220, -0.424652442474178100, -0.424607174120838040, -0.424561904705980870, -0.424516634229718970, --0.424471362692165450, -0.424426090093433570, -0.424380816433636400, -0.424335541712887230, -0.424290265931299200, -0.424244989088984730, -0.424199711186058540, -0.424154432222633100, --0.424109152198821560, -0.424063871114737150, -0.424018588970493050, -0.423973305766202510, -0.423928021501978670, -0.423882736177933980, -0.423837449794183310, -0.423792162350838940, --0.423746873848014180, -0.423701584285822270, -0.423656293664376400, -0.423611001983789760, -0.423565709244175640, -0.423520415445646450, -0.423475120588316990, -0.423429824672299730, --0.423384527697707960, -0.423339229664654810, -0.423293930573253600, -0.423248630423617600, -0.423203329215859180, -0.423158026950093250, -0.423112723626432260, -0.423067419244989470, --0.423022113805878120, -0.422976807309211500, -0.422931499755102860, -0.422886191143665490, -0.422840881475011810, -0.422795570749256720, -0.422750258966512690, -0.422704946126893080, --0.422659632230511060, -0.422614317277479950, -0.422569001267913080, -0.422523684201922880, -0.422478366079624250, -0.422433046901129760, -0.422387726666552610, -0.422342405376006150, --0.422297083029603670, -0.422251759627458530, -0.422206435169683920, -0.422161109656392470, -0.422115783087699040, -0.422070455463716130, -0.422025126784557110, -0.421979797050335280, --0.421934466261163930, -0.421889134417156420, -0.421843801518425320, -0.421798467565085430, -0.421753132557249440, -0.421707796495030600, -0.421662459378542300, -0.421617121207897790, --0.421571781983210490, -0.421526441704593750, -0.421481100372160130, -0.421435757986024510, -0.421390414546299550, -0.421345070053098510, -0.421299724506534800, -0.421254377906721820, --0.421209030253772820, -0.421163681547801320, -0.421118331788919780, -0.421072980977243220, -0.421027629112884220, -0.420982276195956130, -0.420936922226572310, -0.420891567204846220, --0.420846211130891270, -0.420800854004820700, -0.420755495826747260, -0.420710136596785860, -0.420664776315049120, -0.420619414981650400, -0.420574052596703160, -0.420528689160320820, --0.420483324672616730, -0.420437959133703580, -0.420392592543696260, -0.420347224902707480, -0.420301856210850700, -0.420256486468239210, -0.420211115674986540, -0.420165743831206030, --0.420120370937011210, -0.420074996992514660, -0.420029621997831390, -0.419984245953074100, -0.419938868858356180, -0.419893490713791060, -0.419848111519492250, -0.419802731275573160, --0.419757349982146420, -0.419711967639327110, -0.419666584247227910, -0.419621199805962240, -0.419575814315643560, -0.419530427776385330, -0.419485040188301020, -0.419439651551504140, --0.419394261866107340, -0.419348871132225690, -0.419303479349971810, -0.419258086519459280, -0.419212692640801520, -0.419167297714112040, -0.419121901739504310, -0.419076504717091010, --0.419031106646987230, -0.418985707529305750, -0.418940307364159940, -0.418894906151663360, -0.418849503891929540, -0.418804100585072000, -0.418758696231204150, -0.418713290830438790, --0.418667884382890990, -0.418622476888673490, -0.418577068347899760, -0.418531658760683380, -0.418486248127137860, -0.418440836447376730, -0.418395423721513500, -0.418350009949660930, --0.418304595131934080, -0.418259179268445800, -0.418213762359309570, -0.418168344404638900, -0.418122925404547370, -0.418077505359148560, -0.418032084268555980, -0.417986662132882380, --0.417941238952242890, -0.417895814726750360, -0.417850389456518260, -0.417804963141660210, -0.417759535782289750, -0.417714107378520440, -0.417668677930465030, -0.417623247438238750, --0.417577815901954360, -0.417532383321725430, -0.417486949697665530, -0.417441515029888300, -0.417396079318507250, -0.417350642563635970, -0.417305204765387290, -0.417259765923876420, --0.417214326039216150, -0.417168885111520060, -0.417123443140901770, -0.417078000127474870, -0.417032556071352920, -0.416987110972648790, -0.416941664831477710, -0.416896217647952480, --0.416850769422186680, -0.416805320154294000, -0.416759869844387950, -0.416714418492582280, -0.416668966098990570, -0.416623512663725600, -0.416578058186902630, -0.416532602668634570, --0.416487146109034980, -0.416441688508217560, -0.416396229866295870, -0.416350770183383620, -0.416305309459593650, -0.416259847695041210, -0.416214384889839200, -0.416168921044101140, --0.416123456157940830, -0.416077990231471850, -0.416032523264807940, -0.415987055258062680, -0.415941586211348970, -0.415896116124782110, -0.415850644998474960, -0.415805172832541260, --0.415759699627094530, -0.415714225382248610, -0.415668750098117100, -0.415623273774813730, -0.415577796412451410, -0.415532318011145320, -0.415486838571008490, -0.415441358092154540, --0.415395876574697230, -0.415350394018750180, -0.415304910424427190, -0.415259425791841890, -0.415213940121107240, -0.415168453412338550, -0.415122965665648710, -0.415077476881151490, --0.415031987058960550, -0.414986496199189590, -0.414941004301952470, -0.414895511367362020, -0.414850017395533570, -0.414804522386580110, -0.414759026340615290, -0.414713529257752960, --0.414668031138106800, -0.414622531981790550, -0.414577031788917970, -0.414531530559602010, -0.414486028293957980, -0.414440524992098940, -0.414395020654138580, -0.414349515280190650, --0.414304008870368940, -0.414258501424787210, -0.414212992943558400, -0.414167483426797990, -0.414121972874618770, -0.414076461287134660, -0.414030948664459440, -0.413985435006706810, --0.413939920313990570, -0.413894404586424570, -0.413848887824121710, -0.413803370027197470, -0.413757851195764800, -0.413712331329937510, -0.413666810429829390, -0.413621288495554240, --0.413575765527225860, -0.413530241524957260, -0.413484716488863870, -0.413439190419058630, -0.413393663315655520, -0.413348135178768170, -0.413302606008510540, -0.413257075804996380, --0.413211544568339470, -0.413166012298652960, -0.413120478996052200, -0.413074944660650260, -0.413029409292560930, -0.412983872891898140, -0.412938335458775620, -0.412892796993307280, --0.412847257495606910, -0.412801716965787600, -0.412756175403964810, -0.412710632810251610, -0.412665089184761800, -0.412619544527609290, -0.412573998838907880, -0.412528452118771480, --0.412482904367314000, -0.412437355584648390, -0.412391805770890240, -0.412346254926152570, -0.412300703050549280, -0.412255150144194170, -0.412209596207201270, -0.412164041239684310, --0.412118485241756480, -0.412072928213533200, -0.412027370155127640, -0.411981811066653660, -0.411936250948225110, -0.411890689799955970, -0.411845127621960070, -0.411799564414351390, --0.411754000177242950, -0.411708434910750380, -0.411662868614986690, -0.411617301290065800, -0.411571732936101660, -0.411526163553208260, -0.411480593141499370, -0.411435021701088250, --0.411389449232090310, -0.411343875734618840, -0.411298301208787630, -0.411252725654710660, -0.411207149072501890, -0.411161571462275220, -0.411115992824144630, -0.411070413158223290, --0.411024832464626680, -0.410979250743468030, -0.410933667994861250, -0.410888084218920260, -0.410842499415759070, -0.410796913585491640, -0.410751326728231110, -0.410705738844093120, --0.410660149933190720, -0.410614559995638010, -0.410568969031548820, -0.410523377041037250, -0.410477784024217250, -0.410432189981202790, -0.410386594912107050, -0.410340998817045610, --0.410295401696131660, -0.410249803549479260, -0.410204204377202290, -0.410158604179414850, -0.410113002956230880, -0.410067400707764430, -0.410021797434128640, -0.409976193135439150, --0.409930587811809190, -0.409884981463352780, -0.409839374090183890, -0.409793765692416600, -0.409748156270164920, -0.409702545823542760, -0.409656934352663480, -0.409611321857642710, --0.409565708338593570, -0.409520093795630200, -0.409474478228866570, -0.409428861638416740, -0.409383244024394800, -0.409337625386913870, -0.409292005726089760, -0.409246385042035590, --0.409200763334865490, -0.409155140604693430, -0.409109516851633550, -0.409063892075799910, -0.409018266277306470, -0.408972639456266610, -0.408927011612795930, -0.408881382747007750, --0.408835752859016130, -0.408790121948935100, -0.408744490016878740, -0.408698857062961160, -0.408653223087295680, -0.408607588089997920, -0.408561952071181180, -0.408516315030959590, --0.408470676969447170, -0.408425037886758100, -0.408379397783006410, -0.408333756658306240, -0.408288114512770810, -0.408242471346515980, -0.408196827159654940, -0.408151181952301820, --0.408105535724570760, -0.408059888476575870, -0.408014240208431240, -0.407968590920250230, -0.407922940612148510, -0.407877289284239500, -0.407831636936637210, -0.407785983569455830, --0.407740329182809560, -0.407694673776812400, -0.407649017351578550, -0.407603359907221410, -0.407557701443856610, -0.407512041961597570, -0.407466381460558470, -0.407420719940853380, --0.407375057402596500, -0.407329393845902000, -0.407283729270883190, -0.407238063677655860, -0.407192397066333370, -0.407146729437029840, -0.407101060789859530, -0.407055391124936610, --0.407009720442375160, -0.406964048742289420, -0.406918376024793580, -0.406872702290000940, -0.406827027538027410, -0.406781351768986280, -0.406735674982991790, -0.406689997180158080, --0.406644318360599390, -0.406598638524429900, -0.406552957671763030, -0.406507275802714560, -0.406461592917397920, -0.406415909015927280, -0.406370224098416890, -0.406324538164980880, --0.406278851215733590, -0.406233163250789120, -0.406187474270260970, -0.406141784274264950, -0.406096093262914460, -0.406050401236323690, -0.406004708194606990, -0.405959014137878490, --0.405913319066252440, -0.405867622979842300, -0.405821925878763870, -0.405776227763130660, -0.405730528633056920, -0.405684828488656830, -0.405639127330044650, -0.405593425157334650, --0.405547721970641100, -0.405502017770077440, -0.405456312555759530, -0.405410606327800850, -0.405364899086315680, -0.405319190831418210, -0.405273481563222790, -0.405227771281843670, --0.405182059987394320, -0.405136347679990630, -0.405090634359746020, -0.405044920026774890, -0.404999204681191440, -0.404953488323109960, -0.404907770952644740, -0.404862052569910150, --0.404816333175019580, -0.404770612768089010, -0.404724891349231900, -0.404679168918562540, -0.404633445476195290, -0.404587721022244440, -0.404541995556824240, -0.404496269080048270, --0.404450541592032420, -0.404404813092890230, -0.404359083582735980, -0.404313353061684090, -0.404267621529848740, -0.404221888987344400, -0.404176155434285310, -0.404130420870785820, --0.404084685296959460, -0.404038948712922230, -0.403993211118787610, -0.403947472514669950, -0.403901732900683650, -0.403855992276942970, -0.403810250643562350, -0.403764508000655280, --0.403718764348337760, -0.403673019686723310, -0.403627274015926300, -0.403581527336061120, -0.403535779647242130, -0.403490030949583690, -0.403444281243200140, -0.403398530528205120, --0.403352778804714540, -0.403307026072842080, -0.403261272332701980, -0.403215517584408770, -0.403169761828076730, -0.403124005063820290, -0.403078247291753010, -0.403032488511990920, --0.402986728724647640, -0.402940967929837520, -0.402895206127674990, -0.402849443318274440, -0.402803679501750280, -0.402757914678216920, -0.402712148847787940, -0.402666382010579470, --0.402620614166704970, -0.402574845316278960, -0.402529075459415850, -0.402483304596230050, -0.402437532726835970, -0.402391759851347290, -0.402345985969879970, -0.402300211082547710, --0.402254435189464910, -0.402208658290746040, -0.402162880386505490, -0.402117101476857750, -0.402071321561917270, -0.402025540641797690, -0.401979758716615070, -0.401933975786483040, --0.401888191851516090, -0.401842406911828600, -0.401796620967535160, -0.401750834018750110, -0.401705046065587210, -0.401659257108162530, -0.401613467146589630, -0.401567676180983100, --0.401521884211457400, -0.401476091238126940, -0.401430297261106290, -0.401384502280509920, -0.401338706296452240, -0.401292909309047040, -0.401247111318410340, -0.401201312324655830, --0.401155512327898090, -0.401109711328251570, -0.401063909325830750, -0.401018106320750190, -0.400972302313123530, -0.400926497303066900, -0.400880691290694040, -0.400834884276119460, --0.400789076259457700, -0.400743267240823210, -0.400697457220330570, -0.400651646198094290, -0.400605834174228070, -0.400560021148848090, -0.400514207122068030, -0.400468392094002480, --0.400422576064765940, -0.400376759034472950, -0.400330941003238070, -0.400285121971175050, -0.400239301938400020, -0.400193480905026710, -0.400147658871169710, -0.400101835836943590, --0.400056011802462860, -0.400010186767842110, -0.399964360733195860, -0.399918533698637950, -0.399872705664284460, -0.399826876630249240, -0.399781046596646820, -0.399735215563591820, --0.399689383531198760, -0.399643550499582220, -0.399597716468856000, -0.399551881439136280, -0.399506045410536910, -0.399460208383172420, -0.399414370357157380, -0.399368531332606410, --0.399322691309634100, -0.399276850288355130, -0.399231008268883140, -0.399185165251334520, -0.399139321235822910, -0.399093476222463050, -0.399047630211369460, -0.399001783202656830, --0.398955935196439740, -0.398910086192831970, -0.398864236191949830, -0.398818385193907110, -0.398772533198818390, -0.398726680206798360, -0.398680826217961640, -0.398634971232422810, --0.398589115250296610, -0.398543258271696730, -0.398497400296739580, -0.398451541325538890, -0.398405681358209420, -0.398359820394865670, -0.398313958435622400, -0.398268095480594220, --0.398222231529895830, -0.398176366583641030, -0.398130500641946110, -0.398084633704924970, -0.398038765772692260, -0.397992896845362600, -0.397947026923050730, -0.397901156005871230, --0.397855284093938890, -0.397809411187367510, -0.397763537286273450, -0.397717662390770500, -0.397671786500973400, -0.397625909616996840, -0.397580031738955510, -0.397534152866964140, --0.397488273001136540, -0.397442392141589050, -0.397396510288435590, -0.397350627441790890, -0.397304743601769590, -0.397258858768486430, -0.397212972942056150, -0.397167086122593380, --0.397121198310212140, -0.397075309505028730, -0.397029419707156990, -0.396983528916711740, -0.396937637133807640, -0.396891744358559450, -0.396845850591081910, -0.396799955831488920, --0.396754060079896890, -0.396708163336419670, -0.396662265601172070, -0.396616366874268770, -0.396570467155824560, -0.396524566445954240, -0.396478664744772450, -0.396432762052393190, --0.396386858368932840, -0.396340953694505340, -0.396295048029225490, -0.396249141373207990, -0.396203233726567630, -0.396157325089419200, -0.396111415461876670, -0.396065504844056340, --0.396019593236072330, -0.395973680638039280, -0.395927767050072040, -0.395881852472285410, -0.395835936904794130, -0.395790020347713050, -0.395744102801156020, -0.395698184265239620, --0.395652264740077700, -0.395606344225785170, -0.395560422722476770, -0.395514500230267300, -0.395468576749271610, -0.395422652279604440, -0.395376726821379810, -0.395330800374714240, --0.395284872939721590, -0.395238944516516810, -0.395193015105214650, -0.395147084705929960, -0.395101153318777600, -0.395055220943872300, -0.395009287581328140, -0.394963353231261580, --0.394917417893786650, -0.394871481569018190, -0.394825544257071000, -0.394779605958059940, -0.394733666672099910, -0.394687726399304880, -0.394641785139791310, -0.394595842893673330, --0.394549899661065680, -0.394503955442083330, -0.394458010236841130, -0.394412064045453810, -0.394366116868036410, -0.394320168704702880, -0.394274219555569740, -0.394228269420751010, --0.394182318300361660, -0.394136366194516470, -0.394090413103330430, -0.394044459026918310, -0.393998503965394210, -0.393952547918874680, -0.393906590887473820, -0.393860632871306460, --0.393814673870487520, -0.393768713885131850, -0.393722752915354470, -0.393676790961270170, -0.393630828022993040, -0.393584864100639700, -0.393538899194324220, -0.393492933304161460, --0.393446966430266390, -0.393400998572753850, -0.393355029731738860, -0.393309059907335500, -0.393263089099660230, -0.393217117308827300, -0.393171144534951560, -0.393125170778147960, --0.393079196038531480, -0.393033220316216960, -0.392987243611319370, -0.392941265923952900, -0.392895287254234060, -0.392849307602276990, -0.392803326968196640, -0.392757345352107990, --0.392711362754125990, -0.392665379174365610, -0.392619394612941710, -0.392573409069968570, -0.392527422545562670, -0.392481435039838290, -0.392435446552910240, -0.392389457084893640, --0.392343466635903360, -0.392297475206054400, -0.392251482795461790, -0.392205489404239660, -0.392159495032504580, -0.392113499680370790, -0.392067503347953260, -0.392021506035366950, --0.391975507742726880, -0.391929508470148070, -0.391883508217744590, -0.391837506985633240, -0.391791504773928100, -0.391745501582744180, -0.391699497412196560, -0.391653492262400150, --0.391607486133470020, -0.391561479025521130, -0.391515470938667790, -0.391469461873026560, -0.391423451828711690, -0.391377440805838190, -0.391331428804521100, -0.391285415824875420, --0.391239401867016170, -0.391193386931057650, -0.391147371017116440, -0.391101354125306830, -0.391055336255743850, -0.391009317408542500, -0.390963297583817810, -0.390917276781684970, --0.390871255002258890, -0.390825232245653850, -0.390779208511986550, -0.390733183801371290, -0.390687158113922960, -0.390641131449756820, -0.390595103808987820, -0.390549075191731100, --0.390503045598100840, -0.390457015028213780, -0.390410983482184170, -0.390364950960127130, -0.390318917462157690, -0.390272882988390970, -0.390226847538942050, -0.390180811113926000, --0.390134773713457120, -0.390088735337652090, -0.390042695986625220, -0.389996655660491690, -0.389950614359366450, -0.389904572083364650, -0.389858528832601470, -0.389812484607191980, --0.389766439407250420, -0.389720393232893590, -0.389674346084235790, -0.389628297961392140, -0.389582248864477730, -0.389536198793607680, -0.389490147748897120, -0.389444095730461240, --0.389398042738414270, -0.389351988772873030, -0.389305933833951790, -0.389259877921765750, -0.389213821036429990, -0.389167763178059680, -0.389121704346769960, -0.389075644542675180, --0.389029583765892140, -0.388983522016535080, -0.388937459294719230, -0.388891395600559740, -0.388845330934171730, -0.388799265295670440, -0.388753198685170940, -0.388707131102787650, --0.388661062548637360, -0.388614993022834420, -0.388568922525493960, -0.388522851056731230, -0.388476778616661360, -0.388430705205399570, -0.388384630823060180, -0.388338555469760040, --0.388292479145613490, -0.388246401850735720, -0.388200323585241980, -0.388154244349247450, -0.388108164142867250, -0.388062082966216690, -0.388016000819410070, -0.387969917702564280, --0.387923833615793750, -0.387877748559213590, -0.387831662532939050, -0.387785575537085310, -0.387739487571767680, -0.387693398637100560, -0.387647308733200690, -0.387601217860182590, --0.387555126018161440, -0.387509033207252440, -0.387462939427570870, -0.387416844679231990, -0.387370748962350960, -0.387324652277042270, -0.387278554623422750, -0.387232456001606830, --0.387186356411709790, -0.387140255853846870, -0.387094154328133270, -0.387048051834684330, -0.387001948373615230, -0.386955843945040460, -0.386909738549076900, -0.386863632185838970, --0.386817524855441960, -0.386771416558001120, -0.386725307293631800, -0.386679197062449190, -0.386633085864568570, -0.386586973700104420, -0.386540860569173640, -0.386494746471890750, --0.386448631408370990, -0.386402515378729610, -0.386356398383082000, -0.386310280421543360, -0.386264161494228150, -0.386218041601253450, -0.386171920742733600, -0.386125798918783960, --0.386079676129519770, -0.386033552375056430, -0.385987427655509250, -0.385941301970993470, -0.385895175321623600, -0.385849047707516600, -0.385802919128787000, -0.385756789585550100, --0.385710659077921240, -0.385664527606015720, -0.385618395169948890, -0.385572261769835280, -0.385526127405791790, -0.385479992077932990, -0.385433855786374180, -0.385387718531230770, --0.385341580312618060, -0.385295441130651390, -0.385249300985446130, -0.385203159877116840, -0.385157017805780380, -0.385110874771551430, -0.385064730774545280, -0.385018585814877300, --0.384972439892662890, -0.384926293008017340, -0.384880145161055230, -0.384833996351893640, -0.384787846580647020, -0.384741695847430730, -0.384695544152360290, -0.384649391495550940, --0.384603237877118140, -0.384557083297177190, -0.384510927755842780, -0.384464771253231810, -0.384418613789458960, -0.384372455364639540, -0.384326295978889010, -0.384280135632322720, --0.384233974325056130, -0.384187812057204540, -0.384141648828882630, -0.384095484640207430, -0.384049319491293510, -0.384003153382256320, -0.383956986313211230, -0.383910818284273650, --0.383864649295559020, -0.383818479347182830, -0.383772308439259580, -0.383726136571906350, -0.383679963745237830, -0.383633789959369360, -0.383587615214416420, -0.383541439510494460, --0.383495262847718900, -0.383449085226204360, -0.383402906646067910, -0.383356727107424240, -0.383310546610388710, -0.383264365155076840, -0.383218182741604020, -0.383171999370085780, --0.383125815040637530, -0.383079629753373900, -0.383033443508412060, -0.382987256305866550, -0.382941068145852940, -0.382894879028486680, -0.382848688953883190, -0.382802497922157980, --0.382756305933425740, -0.382710112987803500, -0.382663919085406030, -0.382617724226348770, -0.382571528410747150, -0.382525331638716710, -0.382479133910372970, -0.382432935225831380, --0.382386735585206640, -0.382340534988615870, -0.382294333436173750, -0.382248130927995810, -0.382201927464197570, -0.382155723044894480, -0.382109517670202130, -0.382063311340235130, --0.382017104055110630, -0.381970895814943420, -0.381924686619848960, -0.381878476469942830, -0.381832265365340430, -0.381786053306157390, -0.381739840292509240, -0.381693626324510650, --0.381647411402278810, -0.381601195525928470, -0.381554978695575140, -0.381508760911334340, -0.381462542173321650, -0.381416322481652580, -0.381370101836441930, -0.381323880237806830, --0.381277657685862030, -0.381231434180723080, -0.381185209722505520, -0.381138984311324980, -0.381092757947296970, -0.381046530630537010, -0.381000302361160780, -0.380954073139282980, --0.380907842965020780, -0.380861611838488990, -0.380815379759803170, -0.380769146729078910, -0.380722912746431770, -0.380676677811977340, -0.380630441925830400, -0.380584205088108200, --0.380537967298925470, -0.380491728558397860, -0.380445488866640870, -0.380399248223770190, -0.380353006629901350, -0.380306764085150020, -0.380260520589631000, -0.380214276143461430, --0.380168030746756200, -0.380121784399630900, -0.380075537102201160, -0.380029288854582540, -0.379983039656890730, -0.379936789509240480, -0.379890538411749080, -0.379844286364531320, --0.379798033367702850, -0.379751779421379330, -0.379705524525676300, -0.379659268680709480, -0.379613011886594520, -0.379566754143446210, -0.379520495451381780, -0.379474235810516200, --0.379427975220964940, -0.379381713682843790, -0.379335451196268380, -0.379289187761354290, -0.379242923378216410, -0.379196658046972060, -0.379150391767736070, -0.379104124540624140, --0.379057856365751840, -0.379011587243234920, -0.378965317173189040, -0.378919046155729860, -0.378872774190972210, -0.378826501279033500, -0.378780227420028480, -0.378733952614072940, --0.378687676861282520, -0.378641400161772890, -0.378595122515659740, -0.378548843923057990, -0.378502564384084970, -0.378456283898855490, -0.378410002467485350, -0.378363720090090170, --0.378317436766785700, -0.378271152497687610, -0.378224867282911660, -0.378178581122573580, -0.378132294016788160, -0.378086005965672880, -0.378039716969342580, -0.377993427027912940, --0.377947136141499770, -0.377900844310218750, -0.377854551534185680, -0.377808257813515350, -0.377761963148325160, -0.377715667538730150, -0.377669370984845930, -0.377623073486788250, --0.377576775044672910, -0.377530475658615640, -0.377484175328732190, -0.377437874055137460, -0.377391571837948860, -0.377345268677281350, -0.377298964573250680, -0.377252659525972590, --0.377206353535562870, -0.377160046602137200, -0.377113738725810670, -0.377067429906700560, -0.377021120144921900, -0.376974809440590420, -0.376928497793821930, -0.376882185204732210, --0.376835871673437020, -0.376789557200052140, -0.376743241784692540, -0.376696925427475680, -0.376650608128516470, -0.376604289887930770, -0.376557970705834360, -0.376511650582342980, --0.376465329517572500, -0.376419007511637870, -0.376372684564656560, -0.376326360676743520, -0.376280035848014560, -0.376233710078585580, -0.376187383368572270, -0.376141055718090480, --0.376094727127256110, -0.376048397596184080, -0.376002067124991850, -0.375955735713794480, -0.375909403362707730, -0.375863070071847550, -0.375816735841329630, -0.375770400671269880, --0.375724064561783310, -0.375677727512987390, -0.375631389524997190, -0.375585050597928520, -0.375538710731897150, -0.375492369927019070, -0.375446028183410050, -0.375399685501185960, --0.375353341880462650, -0.375306997321355200, -0.375260651823981000, -0.375214305388455240, -0.375167958014893670, -0.375121609703412240, -0.375075260454126760, -0.375028910267153180, --0.374982559142606480, -0.374936207080604160, -0.374889854081261350, -0.374843500144693920, -0.374797145271017710, -0.374750789460348680, -0.374704432712802630, -0.374658075028495520, --0.374611716407542430, -0.374565356850060820, -0.374518996356165810, -0.374472634925973380, -0.374426272559599320, -0.374379909257159580, -0.374333545018770030, -0.374287179844545850, --0.374240813734604550, -0.374194446689061160, -0.374148078708031680, -0.374101709791632040, -0.374055339939978080, -0.374008969153185770, -0.373962597431371060, -0.373916224774649030, --0.373869851183137260, -0.373823476656950870, -0.373777101196205770, -0.373730724801017930, -0.373684347471503250, -0.373637969207777750, -0.373591590009956450, -0.373545209878157040, --0.373498828812494580, -0.373452446813085090, -0.373406063880044440, -0.373359680013488630, -0.373313295213533620, -0.373266909480295390, -0.373220522813889070, -0.373174135214432270, --0.373127746682040130, -0.373081357216828610, -0.373034966818913680, -0.372988575488411360, -0.372942183225437600, -0.372895790030107530, -0.372849395902538850, -0.372803000842846680, --0.372756604851146980, -0.372710207927555770, -0.372663810072189020, -0.372617411285162790, -0.372571011566593000, -0.372524610916595720, -0.372478209335286080, -0.372431806822781710, --0.372385403379197840, -0.372338999004650450, -0.372292593699255600, -0.372246187463129210, -0.372199780296387390, -0.372153372199145290, -0.372106963171520590, -0.372060553213628460, --0.372014142325584940, -0.371967730507506090, -0.371921317759507930, -0.371874904081706430, -0.371828489474217700, -0.371782073937156900, -0.371735657470641740, -0.371689240074787490, --0.371642821749710080, -0.371596402495525670, -0.371549982312350200, -0.371503561200299810, -0.371457139159489690, -0.371410716190037520, -0.371364292292058580, -0.371317867465668920, --0.371271441710984530, -0.371225015028121610, -0.371178587417196120, -0.371132158878324180, -0.371085729411620990, -0.371039299017204340, -0.370992867695189410, -0.370946435445692280, --0.370900002268829130, -0.370853568164715930, -0.370807133133468860, -0.370760697175203100, -0.370714260290036400, -0.370667822478084050, -0.370621383739462180, -0.370574944074286820, --0.370528503482674130, -0.370482061964740150, -0.370435619520601060, -0.370389176150372030, -0.370342731854170940, -0.370296286632113000, -0.370249840484314360, -0.370203393410891090, --0.370156945411959370, -0.370110496487635280, -0.370064046638034110, -0.370017595863273650, -0.369971144163469210, -0.369924691538736860, -0.369878237989192840, -0.369831783514953220, --0.369785328116134130, -0.369738871792851700, -0.369692414545221280, -0.369645956373360670, -0.369599497277385170, -0.369553037257410900, -0.369506576313554050, -0.369460114445930740, --0.369413651654657170, -0.369367187939849460, -0.369320723301622970, -0.369274257740095480, -0.369227791255382350, -0.369181323847599720, -0.369134855516863810, -0.369088386263290770, --0.369041916086996770, -0.368995444988097940, -0.368948972966709700, -0.368902500022949830, -0.368856026156933750, -0.368809551368777580, -0.368763075658597510, -0.368716599026509770, --0.368670121472630560, -0.368623642997075170, -0.368577163599961510, -0.368530683281404980, -0.368484202041521710, -0.368437719880427950, -0.368391236798239870, -0.368344752795073730, --0.368298267871045690, -0.368251782026271120, -0.368205295260867980, -0.368158807574951560, -0.368112318968638160, -0.368065829442043910, -0.368019338995285160, -0.367972847628477980, --0.367926355341737900, -0.367879862135182760, -0.367833368008927960, -0.367786872963089760, -0.367740376997784340, -0.367693880113127980, -0.367647382309236940, -0.367600883586227440, --0.367554383944214910, -0.367507883383317250, -0.367461381903649850, -0.367414879505329030, -0.367368376188471010, -0.367321871953192050, -0.367275366799608370, -0.367228860727835500, --0.367182353737991240, -0.367135845830191150, -0.367089337004551430, -0.367042827261188360, -0.366996316600218250, -0.366949805021757340, -0.366903292525921910, -0.366856779112827380, --0.366810264782591770, -0.366763749535330530, -0.366717233371159860, -0.366670716290196150, -0.366624198292555600, -0.366577679378354620, -0.366531159547709370, -0.366484638800735450, --0.366438117137550760, -0.366391594558270750, -0.366345071063011730, -0.366298546651890100, -0.366252021325022050, -0.366205495082523980, -0.366158967924512140, -0.366112439851102090, --0.366065910862411750, -0.366019380958556630, -0.365972850139653030, -0.365926318405817350, -0.365879785757165840, -0.365833252193814910, -0.365786717715880010, -0.365740182323479100, --0.365693646016727770, -0.365647108795742300, -0.365600570660639110, -0.365554031611534440, -0.365507491648544740, -0.365460950771786250, -0.365414408981374620, -0.365367866277427730, --0.365321322660061230, -0.365274778129391410, -0.365228232685534620, -0.365181686328607260, -0.365135139058725690, -0.365088590876005430, -0.365042041780564540, -0.364995491772518550, --0.364948940851983820, -0.364902389019076730, -0.364855836273913710, -0.364809282616611050, -0.364762728047285210, -0.364716172566051710, -0.364669616173028620, -0.364623058868331460, --0.364576500652076640, -0.364529941524380620, -0.364483381485359750, -0.364436820535130380, -0.364390258673808140, -0.364343695901511110, -0.364297132218354860, -0.364250567624455730, --0.364204002119930200, -0.364157435704894670, -0.364110868379465550, -0.364064300143759230, -0.364017730997891360, -0.363971160941979950, -0.363924589976140690, -0.363878018100489920, --0.363831445315144160, -0.363784871620219720, -0.363738297015833160, -0.363691721502100830, -0.363645145079138370, -0.363598567747063840, -0.363551989505992930, -0.363505410356042060, --0.363458830297327620, -0.363412249329966130, -0.363365667454074000, -0.363319084669767760, -0.363272500977162900, -0.363225916376377690, -0.363179330867527630, -0.363132744450729240, --0.363086157126099040, -0.363039568893753440, -0.362992979753808900, -0.362946389706381050, -0.362899798751588120, -0.362853206889545640, -0.362806614120370190, -0.362760020444178160, --0.362713425861086070, -0.362666830371210450, -0.362620233974667750, -0.362573636671573660, -0.362527038462046260, -0.362480439346201280, -0.362433839324155180, -0.362387238396024550, --0.362340636561925780, -0.362294033821975390, -0.362247430176289130, -0.362200825624985120, -0.362154220168179050, -0.362107613805987380, -0.362061006538526740, -0.362014398365913540, --0.361967789288264400, -0.361921179305695730, -0.361874568418323270, -0.361827956626265270, -0.361781343929637340, -0.361734730328556080, -0.361688115823137980, -0.361641500413499630, --0.361594884099757490, -0.361548266882027290, -0.361501648760427290, -0.361455029735073150, -0.361408409806081410, -0.361361788973568690, -0.361315167237651500, -0.361268544598446370, --0.361221921056069870, -0.361175296610637740, -0.361128671262268220, -0.361082045011076990, -0.361035417857180680, -0.360988789800695820, -0.360942160841738970, -0.360895530980426760, --0.360848900216875660, -0.360802268551201510, -0.360755635983522560, -0.360709002513954440, -0.360662368142613880, -0.360615732869617340, -0.360569096695081530, -0.360522459619122940, --0.360475821641858210, -0.360429182763403130, -0.360382542983875900, -0.360335902303392300, -0.360289260722068900, -0.360242618240022410, -0.360195974857369370, -0.360149330574226380, --0.360102685390709220, -0.360056039306936190, -0.360009392323023090, -0.359962744439086490, -0.359916095655243020, -0.359869445971609300, -0.359822795388301970, -0.359776143905437720, --0.359729491523132220, -0.359682838241503820, -0.359636184060668330, -0.359589528980742370, -0.359542873001842570, -0.359496216124085610, -0.359449558347588130, -0.359402899672465910, --0.359356240098837270, -0.359309579626818030, -0.359262918256524840, -0.359216255988074380, -0.359169592821583230, -0.359122928757168110, -0.359076263794945730, -0.359029597935031810, --0.358982931177544710, -0.358936263522600270, -0.358889594970315250, -0.358842925520806160, -0.358796255174189780, -0.358749583930582820, -0.358702911790101000, -0.358656238752862730, --0.358609564818983930, -0.358562889988581160, -0.358516214261771160, -0.358469537638670680, -0.358422860119396280, -0.358376181704064820, -0.358329502392791990, -0.358282822185696290, --0.358236141082893530, -0.358189459084500390, -0.358142776190633620, -0.358096092401409880, -0.358049407716945930, -0.358002722137358510, -0.357956035662763410, -0.357909348293279030, --0.357862660029021280, -0.357815970870106910, -0.357769280816652600, -0.357722589868775090, -0.357675898026591110, -0.357629205290217410, -0.357582511659769840, -0.357535817135366810, --0.357489121717124270, -0.357442425405158910, -0.357395728199587480, -0.357349030100526710, -0.357302331108093400, -0.357255631222403390, -0.357208930443575160, -0.357162228771724600, --0.357115526206968510, -0.357068822749423530, -0.357022118399206560, -0.356975413156434270, -0.356928707021223420, -0.356881999993690020, -0.356835292073952430, -0.356788583262126590, --0.356741873558329310, -0.356695162962677340, -0.356648451475287450, -0.356601739096276460, -0.356555025825760260, -0.356508311663857380, -0.356461596610683660, -0.356414880666355960, --0.356368163830991120, -0.356321446104705790, -0.356274727487616900, -0.356228007979841170, -0.356181287581494590, -0.356134566292695630, -0.356087844113560260, -0.356041121044205270, --0.355994397084747450, -0.355947672235303660, -0.355900946495990690, -0.355854219866924500, -0.355807492348223620, -0.355760763940004000, -0.355714034642382490, -0.355667304455475900, --0.355620573379401010, -0.355573841414274730, -0.355527108560213800, -0.355480374817334300, -0.355433640185754680, -0.355386904665590970, -0.355340168256959970, -0.355293430959978560, --0.355246692774763620, -0.355199953701431930, -0.355153213740100340, -0.355106472890884870, -0.355059731153904050, -0.355012988529273930, -0.354966245017111330, -0.354919500617533080, --0.354872755330656100, -0.354826009156597230, -0.354779262095473390, -0.354732514147400480, -0.354685765312497180, -0.354639015590879460, -0.354592264982664160, -0.354545513487968260, --0.354498761106908530, -0.354452007839601900, -0.354405253686164430, -0.354358498646714650, -0.354311742721368620, -0.354264985910243250, -0.354218228213455390, -0.354171469631122000, --0.354124710163359890, -0.354077949810286060, -0.354031188572016490, -0.353984426448669790, -0.353937663440361980, -0.353890899547210090, -0.353844134769330910, -0.353797369106841340, --0.353750602559858410, -0.353703835128498120, -0.353657066812879120, -0.353610297613117410, -0.353563527529329960, -0.353516756561633730, -0.353469984710145570, -0.353423211974982440, --0.353376438356261310, -0.353329663854098200, -0.353282888468611830, -0.353236112199918180, -0.353189335048134270, -0.353142557013377050, -0.353095778095763420, -0.353048998295410370, --0.353002217612433940, -0.352955436046952840, -0.352908653599083130, -0.352861870268941780, -0.352815086056645740, -0.352768300962312040, -0.352721514986057530, -0.352674728127999270, --0.352627940388253350, -0.352581151766938440, -0.352534362264170560, -0.352487571880066850, -0.352440780614744210, -0.352393988468319600, -0.352347195440910030, -0.352300401532631650, --0.352253606743603060, -0.352206811073940470, -0.352160014523760830, -0.352113217093181220, -0.352066418782318540, -0.352019619591289750, -0.351972819520211980, -0.351926018569202140, --0.351879216738376410, -0.351832414027853540, -0.351785610437749530, -0.351738805968181580, -0.351692000619266590, -0.351645194391121570, -0.351598387283863560, -0.351551579297608770, --0.351504770432475850, -0.351457960688581040, -0.351411150066041340, -0.351364338564973730, -0.351317526185495280, -0.351270712927722990, -0.351223898791773960, -0.351177083777764300, --0.351130267885812810, -0.351083451116035620, -0.351036633468549850, -0.350989814943472420, -0.350942995540920510, -0.350896175261011130, -0.350849354103860420, -0.350802532069587170, --0.350755709158307620, -0.350708885370138780, -0.350662060705197730, -0.350615235163601550, -0.350568408745467240, -0.350521581450911950, -0.350474753280051840, -0.350427924233005670, --0.350381094309889730, -0.350334263510821030, -0.350287431835916710, -0.350240599285293770, -0.350193765859069310, -0.350146931557359650, -0.350100096380283440, -0.350053260327957030, --0.350006423400497480, -0.349959585598021870, -0.349912746920647280, -0.349865907368490820, -0.349819066941669590, -0.349772225640299860, -0.349725383464500440, -0.349678540414387510, --0.349631696490078250, -0.349584851691689740, -0.349538006019339100, -0.349491159473143460, -0.349444312053219070, -0.349397463759684780, -0.349350614592656760, -0.349303764552252260, --0.349256913638588300, -0.349210061851782110, -0.349163209191950710, -0.349116355659211340, -0.349069501253681020, -0.349022645975476160, -0.348975789824715550, -0.348928932801515380, --0.348882074905992930, -0.348835216138265290, -0.348788356498449640, -0.348741495986663040, -0.348694634603021910, -0.348647772347644990, -0.348600909220648680, -0.348554045222150060, --0.348507180352266350, -0.348460314611114650, -0.348413447998812190, -0.348366580515476140, -0.348319712161222760, -0.348272842936171000, -0.348225972840437050, -0.348179101874138200, --0.348132230037391630, -0.348085357330314430, -0.348038483753023880, -0.347991609305636270, -0.347944733988270470, -0.347897857801042820, -0.347850980744070560, -0.347804102817470820, --0.347757224021360830, -0.347710344355857790, -0.347663463821078880, -0.347616582417140500, -0.347569700144161440, -0.347522817002258180, -0.347475932991547890, -0.347429048112147700, --0.347382162364174960, -0.347335275747746750, -0.347288388262979590, -0.347241499909992260, -0.347194610688901170, -0.347147720599823570, -0.347100829642876640, -0.347053937818177670, --0.347007045125843790, -0.346960151565992360, -0.346913257138739720, -0.346866361844204770, -0.346819465682503880, -0.346772568653754390, -0.346725670758073420, -0.346678771995578280, --0.346631872366386210, -0.346584971870613660, -0.346538070508379480, -0.346491168279800140, -0.346444265184992830, -0.346397361224074940, -0.346350456397163610, -0.346303550704376130, --0.346256644145829800, -0.346209736721641790, -0.346162828431928690, -0.346115919276809290, -0.346069009256400110, -0.346022098370818430, -0.345975186620181510, -0.345928274004606570, --0.345881360524210980, -0.345834446179111190, -0.345787530969426050, -0.345740614895272140, -0.345693697956766690, -0.345646780154026940, -0.345599861487170260, -0.345552941956313970, --0.345506021561575280, -0.345459100303070750, -0.345412178180919240, -0.345365255195237310, -0.345318331346142260, -0.345271406633751390, -0.345224481058181990, -0.345177554619551350, --0.345130627317976000, -0.345083699153574950, -0.345036770126464660, -0.344989840236762440, -0.344942909484585560, -0.344895977870051500, -0.344849045393277430, -0.344802112054380770, --0.344755177853477980, -0.344708242790688070, -0.344661306866127560, -0.344614370079913800, -0.344567432432164140, -0.344520493922995830, -0.344473554552526320, -0.344426614320872130, --0.344379673228152160, -0.344332731274483050, -0.344285788459982140, -0.344238844784766740, -0.344191900248954190, -0.344144954852661940, -0.344098008596007250, -0.344051061479106750, --0.344004113502079430, -0.343957164665041780, -0.343910214968111250, -0.343863264411405190, -0.343816312995041010, -0.343769360719136000, -0.343722407583806730, -0.343675453589172290, --0.343628498735349230, -0.343581543022454920, -0.343534586450606750, -0.343487629019922140, -0.343440670730518430, -0.343393711582513030, -0.343346751576022510, -0.343299790711166010, --0.343252828988059980, -0.343205866406821880, -0.343158902967569120, -0.343111938670419110, -0.343064973515489260, -0.343018007502896960, -0.342971040632758790, -0.342924072905193890, --0.342877104320318820, -0.342830134878250980, -0.342783164579107790, -0.342736193423006650, -0.342689221410065080, -0.342642248540400430, -0.342595274814129320, -0.342548300231370890, --0.342501324792241710, -0.342454348496859180, -0.342407371345340830, -0.342360393337803990, -0.342313414474366200, -0.342266434755144010, -0.342219454180256620, -0.342172472749820540, --0.342125490463953350, -0.342078507322772400, -0.342031523326395140, -0.341984538474939090, -0.341937552768521720, -0.341890566207259660, -0.341843578791271970, -0.341796590520675350, --0.341749601395587240, -0.341702611416125120, -0.341655620582406510, -0.341608628894548790, -0.341561636352668730, -0.341514642956885380, -0.341467648707315440, -0.341420653604076360, --0.341373657647285670, -0.341326660837060760, -0.341279663173519270, -0.341232664656778590, -0.341185665286955490, -0.341138665064168960, -0.341091663988535800, -0.341044662060173530, --0.340997659279199560, -0.340950655645731460, -0.340903651159886690, -0.340856645821781990, -0.340809639631536490, -0.340762632589266870, -0.340715624695090700, -0.340668615949125450, --0.340621606351488690, -0.340574595902297880, -0.340527584601670650, -0.340480572449723570, -0.340433559446575880, -0.340386545592344330, -0.340339530887146360, -0.340292515331099610, --0.340245498924321540, -0.340198481666929790, -0.340151463559041740, -0.340104444600774270, -0.340057424792246490, -0.340010404133575140, -0.339963382624877800, -0.339916360266272030, --0.339869337057875310, -0.339822312999805250, -0.339775288092179440, -0.339728262335114550, -0.339681235728729880, -0.339634208273142060, -0.339587179968468770, -0.339540150814827520, --0.339493120812335900, -0.339446089961111420, -0.339399058261270930, -0.339352025712933660, -0.339304992316216250, -0.339257958071236430, -0.339210922978111670, -0.339163887036959600, --0.339116850247897840, -0.339069812611043910, -0.339022774126514660, -0.338975734794429330, -0.338928694614904600, -0.338881653588058160, -0.338834611714007580, -0.338787568992870490, --0.338740525424764460, -0.338693481009806290, -0.338646435748115260, -0.338599389639808120, -0.338552342685002510, -0.338505294883816090, -0.338458246236366390, -0.338411196742771040, --0.338364146403147770, -0.338317095217613270, -0.338270043186286840, -0.338222990309285320, -0.338175936586726340, -0.338128882018727480, -0.338081826605406480, -0.338034770346880840, --0.337987713243267480, -0.337940655294685700, -0.337893596501252220, -0.337846536863084800, -0.337799476380301000, -0.337752415053018560, -0.337705352881355060, -0.337658289865428120, --0.337611226005354700, -0.337564161301254000, -0.337517095753242900, -0.337470029361439110, -0.337422962125960180, -0.337375894046923920, -0.337328825124447840, -0.337281755358649740, --0.337234684749646460, -0.337187613297557250, -0.337140541002499020, -0.337093467864589440, -0.337046393883946190, -0.336999319060686920, -0.336952243394929410, -0.336905166886791230, --0.336858089536389350, -0.336811011343843060, -0.336763932309269260, -0.336716852432785600, -0.336669771714509850, -0.336622690154559650, -0.336575607753052670, -0.336528524510105900, --0.336481440425838660, -0.336434355500367770, -0.336387269733811060, -0.336340183126286110, -0.336293095677910710, -0.336246007388802610, -0.336198918259079490, -0.336151828288858200, --0.336104737478258200, -0.336057645827396330, -0.336010553336390410, -0.335963460005358040, -0.335916365834417030, -0.335869270823685120, -0.335822174973279210, -0.335775078283318710, --0.335727980753920460, -0.335680882385202270, -0.335633783177281930, -0.335586683130277060, -0.335539582244305520, -0.335492480519485050, -0.335445377955932490, -0.335398274553767360, --0.335351170313106520, -0.335304065234067750, -0.335256959316768850, -0.335209852561327510, -0.335162744967861580, -0.335115636536487960, -0.335068527267326060, -0.335021417160492830, --0.334974306216106080, -0.334927194434283540, -0.334880081815143000, -0.334832968358802330, -0.334785854065379140, -0.334738738934990570, -0.334691622967755950, -0.334644506163792270, --0.334597388523217300, -0.334550270046148900, -0.334503150732704810, -0.334456030583002830, -0.334408909597160800, -0.334361787775295630, -0.334314665117526890, -0.334267541623971430, --0.334220417294747110, -0.334173292129971770, -0.334126166129763200, -0.334079039294239210, -0.334031911623517640, -0.333984783117715400, -0.333937653776952110, -0.333890523601344640, --0.333843392591010870, -0.333796260746068610, -0.333749128066635700, -0.333701994552830010, -0.333654860204768420, -0.333607725022570580, -0.333560589006353440, -0.333513452156234790, --0.333466314472332490, -0.333419175954764450, -0.333372036603648450, -0.333324896419102350, -0.333277755401243210, -0.333230613550190460, -0.333183470866061200, -0.333136327348973300, --0.333089182999044550, -0.333042037816392860, -0.332994891801136060, -0.332947744953391190, -0.332900597273277810, -0.332853448760912880, -0.332806299416414380, -0.332759149239900130, --0.332711998231488000, -0.332664846391295900, -0.332617693719441660, -0.332570540216042380, -0.332523385881217550, -0.332476230715084250, -0.332429074717760400, -0.332381917889363830, --0.332334760230012460, -0.332287601739824250, -0.332240442418916150, -0.332193282267407800, -0.332146121285416260, -0.332098959473059400, -0.332051796830455100, -0.332004633357721350, --0.331957469054976030, -0.331910303922337000, -0.331863137959921390, -0.331815971167848780, -0.331768803546236220, -0.331721635095201690, -0.331674465814863040, -0.331627295705338280, --0.331580124766745200, -0.331532952999201880, -0.331485780402825280, -0.331438606977735080, -0.331391432724048420, -0.331344257641883130, -0.331297081731357190, -0.331249904992588550, --0.331202727425695180, -0.331155549030794920, -0.331108369808005010, -0.331061189757445030, -0.331014008879232050, -0.330966827173484020, -0.330919644640318920, -0.330872461279854760, --0.330825277092209440, -0.330778092077500030, -0.330730906235846280, -0.330683719567365250, -0.330636532072174920, -0.330589343750393280, -0.330542154602138260, -0.330494964627527870, --0.330447773826680060, -0.330400582199711970, -0.330353389746743280, -0.330306196467891060, -0.330259002363273440, -0.330211807433008260, -0.330164611677213560, -0.330117415096007340, --0.330070217689506730, -0.330023019457831410, -0.329975820401098570, -0.329928620519426170, -0.329881419812932230, -0.329834218281734700, -0.329787015925951670, -0.329739812745701080, --0.329692608741100120, -0.329645403912268490, -0.329598198259323350, -0.329550991782382670, -0.329503784481564590, -0.329456576356987000, -0.329409367408767970, -0.329362157637024640, --0.329314947041876800, -0.329267735623441640, -0.329220523381837050, -0.329173310317181220, -0.329126096429592120, -0.329078881719187700, -0.329031666186086150, -0.328984449830404590, --0.328937232652262710, -0.328890014651777750, -0.328842795829067780, -0.328795576184250820, -0.328748355717444870, -0.328701134428768080, -0.328653912318338460, -0.328606689386273190, --0.328559465632692060, -0.328512241057712260, -0.328465015661451860, -0.328417789444028880, -0.328370562405561510, -0.328323334546167630, -0.328276105865965510, -0.328228876365072250, --0.328181646043607610, -0.328134414901688880, -0.328087182939434120, -0.328039950156961410, -0.327992716554388770, -0.327945482131834390, -0.327898246889415430, -0.327851010827251770, --0.327803773945460510, -0.327756536244159850, -0.327709297723467800, -0.327662058383502540, -0.327614818224382150, -0.327567577246224710, -0.327520335449147440, -0.327473092833270200, --0.327425849398710280, -0.327378605145585640, -0.327331360074014590, -0.327284114184115070, -0.327236867476005280, -0.327189619949802500, -0.327142371605626480, -0.327095122443594570, --0.327047872463824830, -0.327000621666435400, -0.326953370051544400, -0.326906117619270020, -0.326858864369730330, -0.326811610303042620, -0.326764355419326750, -0.326717099718700000, --0.326669843201280450, -0.326622585867186340, -0.326575327716535750, -0.326528068749446840, -0.326480808966036930, -0.326433548366425800, -0.326386286950730850, -0.326339024719070170, --0.326291761671561880, -0.326244497808324260, -0.326197233129475350, -0.326149967635133380, -0.326102701325415630, -0.326055434200441970, -0.326008166260329750, -0.325960897505197080, --0.325913627935162150, -0.325866357550343210, -0.325819086350858320, -0.325771814336824890, -0.325724541508362770, -0.325677267865589310, -0.325629993408622700, -0.325582718137581050, --0.325535442052582670, -0.325488165153745620, -0.325440887441188210, -0.325393608915028550, -0.325346329575384060, -0.325299049422374530, -0.325251768456117420, -0.325204486676730850, --0.325157204084333130, -0.325109920679042370, -0.325062636460976770, -0.325015351430253780, -0.324968065586993260, -0.324920778931312550, -0.324873491463329890, -0.324826203183163520, --0.324778914090931630, -0.324731624186752440, -0.324684333470744210, -0.324637041943024280, -0.324589749603712620, -0.324542456452926560, -0.324495162490784420, -0.324447867717404300, --0.324400572132904570, -0.324353275737403360, -0.324305978531018170, -0.324258680513868800, -0.324211381686072770, -0.324164082047748330, -0.324116781599013640, -0.324069480339987000, --0.324022178270786660, -0.323974875391530860, -0.323927571702337050, -0.323880267203325130, -0.323832961894612580, -0.323785655776317570, -0.323738348848558450, -0.323691041111453470, --0.323643732565120910, -0.323596423209678130, -0.323549113045245140, -0.323501802071939400, -0.323454490289879100, -0.323407177699182650, -0.323359864299968210, -0.323312550092354100, --0.323265235076458660, -0.323217919252399230, -0.323170602620295900, -0.323123285180266010, -0.323075966932427960, -0.323028647876899940, -0.322981328013800310, -0.322934007343247400, --0.322886685865358620, -0.322839363580253950, -0.322792040488050880, -0.322744716588867660, -0.322697391882822700, -0.322650066370034290, -0.322602740050620670, -0.322555412924700190, --0.322508084992391200, -0.322460756253811150, -0.322413426709080080, -0.322366096358315420, -0.322318765201635490, -0.322271433239158690, -0.322224100471003310, -0.322176766897287640, --0.322129432518129200, -0.322082097333648070, -0.322034761343961700, -0.321987424549188380, -0.321940086949446540, -0.321892748544854450, -0.321845409335530520, -0.321798069321593050, --0.321750728503159560, -0.321703386880350110, -0.321656044453282160, -0.321608701222074130, -0.321561357186844310, -0.321514012347711150, -0.321466666704792960, -0.321419320258207190, --0.321371973008074020, -0.321324624954510920, -0.321277276097636230, -0.321229926437568370, -0.321182575974425680, -0.321135224708326560, -0.321087872639389370, -0.321040519767731680, --0.320993166093473500, -0.320945811616732410, -0.320898456337626810, -0.320851100256275060, -0.320803743372795550, -0.320756385687306690, -0.320709027199926000, -0.320661667910773610, --0.320614307819967080, -0.320566946927624720, -0.320519585233865030, -0.320472222738806380, -0.320424859442567160, -0.320377495345265770, -0.320330130447019860, -0.320282764747949420, --0.320235398248172100, -0.320188030947806230, -0.320140662846970350, -0.320093293945782730, -0.320045924244361960, -0.319998553742825490, -0.319951182441293500, -0.319903810339883520, --0.319856437438714060, -0.319809063737903470, -0.319761689237570260, -0.319714313937832780, -0.319666937838809560, -0.319619560940618940, -0.319572183243378600, -0.319524804747208680, --0.319477425452226740, -0.319430045358551180, -0.319382664466300540, -0.319335282775593250, -0.319287900286547740, -0.319240516999281690, -0.319193132913915100, -0.319145748030565720, --0.319098362349352020, -0.319050975870392330, -0.319003588593805230, -0.318956200519709190, -0.318908811648222600, -0.318861421979463160, -0.318814031513551030, -0.318766640250603810, --0.318719248190739990, -0.318671855334078050, -0.318624461680736440, -0.318577067230833680, -0.318529671984487450, -0.318482275941817830, -0.318434879102942550, -0.318387481467980070, --0.318340083037048920, -0.318292683810267540, -0.318245283787754460, -0.318197882969628140, -0.318150481356006260, -0.318103078947009070, -0.318055675742754170, -0.318008271743360050, --0.317960866948945260, -0.317913461359628340, -0.317866054975527720, -0.317818647796761110, -0.317771239823448790, -0.317723831055708340, -0.317676421493658270, -0.317629011137417210, --0.317581599987103560, -0.317534188042835950, -0.317486775304732850, -0.317439361772911990, -0.317391947447493550, -0.317344532328595270, -0.317297116416335620, -0.317249699710833220, --0.317202282212206590, -0.317154863920574180, -0.317107444836053800, -0.317060024958765670, -0.317012604288827440, -0.316965182826357720, -0.316917760571475080, -0.316870337524298000, --0.316822913684945080, -0.316775489053534860, -0.316728063630185960, -0.316680637415016010, -0.316633210408145350, -0.316585782609691610, -0.316538354019773480, -0.316490924638509420, --0.316443494466018050, -0.316396063502418000, -0.316348631747826900, -0.316301199202365050, -0.316253765866150230, -0.316206331739300960, -0.316158896821935930, -0.316111461114173600, --0.316064024616132640, -0.316016587327931590, -0.315969149249688270, -0.315921710381522890, -0.315874270723553230, -0.315826830275897920, -0.315779389038675530, -0.315731947012004630, --0.315684504196003910, -0.315637060590791050, -0.315589616196486460, -0.315542171013207750, -0.315494725041073620, -0.315447278280202690, -0.315399830730713590, -0.315352382392724890, --0.315304933266355230, -0.315257483351722380, -0.315210032648946700, -0.315162581158145880, -0.315115128879438660, -0.315067675812943590, -0.315020221958779380, -0.314972767317064580, --0.314925311887917000, -0.314877855671457040, -0.314830398667802380, -0.314782940877071760, -0.314735482299383750, -0.314688022934857090, -0.314640562783610360, -0.314593101845762170, --0.314545640121430440, -0.314498177610735450, -0.314450714313794950, -0.314403250230727740, -0.314355785361652370, -0.314308319706687540, -0.314260853265951930, -0.314213386039563340, --0.314165918027642100, -0.314118449230306070, -0.314070979647673940, -0.314023509279864330, -0.313976038126995980, -0.313928566189187520, -0.313881093466557680, -0.313833619959224210, --0.313786145667307560, -0.313738670590925530, -0.313691194730196850, -0.313643718085240160, -0.313596240656174200, -0.313548762443117580, -0.313501283446189110, -0.313453803665506570, --0.313406323101190380, -0.313358841753358370, -0.313311359622129250, -0.313263876707621740, -0.313216393009954520, -0.313168908529246340, -0.313121423265615870, -0.313073937219181030, --0.313026450390062160, -0.312978962778377170, -0.312931474384244790, -0.312883985207783710, -0.312836495249112670, -0.312789004508350400, -0.312741512985614760, -0.312694020681026200, --0.312646527594702570, -0.312599033726762620, -0.312551539077325080, -0.312504043646508690, -0.312456547434432240, -0.312409050441214360, -0.312361552666973070, -0.312314054111828670, --0.312266554775899210, -0.312219054659303330, -0.312171553762159770, -0.312124052084587380, -0.312076549626704840, -0.312029046388630100, -0.311981542370483590, -0.311934037572383190, --0.311886531994447770, -0.311839025636795940, -0.311791518499546560, -0.311744010582818420, -0.311696501886730200, -0.311648992411399930, -0.311601482156948000, -0.311553971123492370, --0.311506459311151840, -0.311458946720045150, -0.311411433350291090, -0.311363919202008400, -0.311316404275315100, -0.311268888570331640, -0.311221372087175980, -0.311173854825966880, --0.311126336786823110, -0.311078817969863530, -0.311031298375206880, -0.310983778002972000, -0.310936256853276800, -0.310888734926241860, -0.310841212221985020, -0.310793688740625180, --0.310746164482281150, -0.310698639447071660, -0.310651113635115610, -0.310603587046531740, -0.310556059681438120, -0.310508531539955110, -0.310461002622200830, -0.310413472928294020, --0.310365942458353530, -0.310318411212498200, -0.310270879190846840, -0.310223346393518280, -0.310175812820630500, -0.310128278472304010, -0.310080743348656870, -0.310033207449807830, --0.309985670775875800, -0.309938133326979610, -0.309890595103238020, -0.309843056104769140, -0.309795516331693500, -0.309747975784129050, -0.309700434462194640, -0.309652892366009120, --0.309605349495691410, -0.309557805851360280, -0.309510261433134700, -0.309462716241132580, -0.309415170275474550, -0.309367623536278560, -0.309320076023663510, -0.309272527737748270, --0.309224978678651730, -0.309177428846492740, -0.309129878241389320, -0.309082326863462100, -0.309034774712828970, -0.308987221789608970, -0.308939668093920930, -0.308892113625883650, --0.308844558385616140, -0.308797002373237210, -0.308749445588864970, -0.308701888032619940, -0.308654329704620150, -0.308606770604984590, -0.308559210733832080, -0.308511650091281560, --0.308464088677451900, -0.308416526492461150, -0.308368963536429950, -0.308321399809476370, -0.308273835311719260, -0.308226270043277570, -0.308178704004270170, -0.308131137194816050, --0.308083569615034080, -0.308036001265042330, -0.307988432144961410, -0.307940862254909460, -0.307893291595005340, -0.307845720165367990, -0.307798147966116320, -0.307750574997369240, --0.307703001259245770, -0.307655426751863970, -0.307607851475344420, -0.307560275429805240, -0.307512698615365400, -0.307465121032143800, -0.307417542680259390, -0.307369963559831150, --0.307322383670977970, -0.307274803013817990, -0.307227221588471880, -0.307179639395057660, -0.307132056433694340, -0.307084472704500950, -0.307036888207596340, -0.306989302943099510, --0.306941716911128540, -0.306894130111804160, -0.306846542545244460, -0.306798954211568390, -0.306751365110894960, -0.306703775243343080, -0.306656184609031820, -0.306608593208080040, --0.306561001040605960, -0.306513408106730220, -0.306465814406570950, -0.306418219940247150, -0.306370624707877790, -0.306323028709581890, -0.306275431945478400, -0.306227834415685460, --0.306180236120323800, -0.306132637059511600, -0.306085037233367770, -0.306037436642011330, -0.305989835285561280, -0.305942233164136710, -0.305894630277856520, -0.305847026626838880, --0.305799422211204600, -0.305751817031071680, -0.305704211086559260, -0.305656604377786300, -0.305608996904871810, -0.305561388667934860, -0.305513779667093590, -0.305466169902468720, --0.305418559374178440, -0.305370948082341720, -0.305323336027077620, -0.305275723208505210, -0.305228109626743520, -0.305180495281911550, -0.305132880174127430, -0.305085264303512020, --0.305037647670183430, -0.304990030274260690, -0.304942412115862930, -0.304894793195109090, -0.304847173512118320, -0.304799553067009570, -0.304751931859901130, -0.304704309890913680, --0.304656687160165420, -0.304609063667775510, -0.304561439413862930, -0.304513814398546690, -0.304466188621945970, -0.304418562084179780, -0.304370934785366310, -0.304323306725626410, --0.304275677905078150, -0.304228048323840760, -0.304180417982033210, -0.304132786879774690, -0.304085155017184140, -0.304037522394379870, -0.303989889011482610, -0.303942254868610650, --0.303894619965883070, -0.303846984303418940, -0.303799347881337330, -0.303751710699757370, -0.303704072758798130, -0.303656434058577840, -0.303608794599217360, -0.303561154380834810, --0.303513513403549430, -0.303465871667480290, -0.303418229172746410, -0.303370585919467030, -0.303322941907760270, -0.303275297137747040, -0.303227651609545570, -0.303180005323274940, --0.303132358279054330, -0.303084710477002810, -0.303037061917239500, -0.302989412599883550, -0.302941762525053230, -0.302894111692869340, -0.302846460103450180, -0.302798807756914870, --0.302751154653382480, -0.302703500792972260, -0.302655846175803320, -0.302608190801993860, -0.302560534671664830, -0.302512877784934410, -0.302465220141921790, -0.302417561742746140, --0.302369902587526610, -0.302322242676382300, -0.302274582009432360, -0.302226920586795180, -0.302179258408591500, -0.302131595474939670, -0.302083931785958880, -0.302036267341768250, --0.301988602142486910, -0.301940936188234090, -0.301893269479128980, -0.301845602015289820, -0.301797933796837450, -0.301750264823890280, -0.301702595096567490, -0.301654924614988160, --0.301607253379271520, -0.301559581389536810, -0.301511908645903100, -0.301464235148488750, -0.301416560897414700, -0.301368885892799200, -0.301321210134761540, -0.301273533623420800, --0.301225856358896260, -0.301178178341307110, -0.301130499570771590, -0.301082820047410720, -0.301035139771342830, -0.300987458742687010, -0.300939776961562600, -0.300892094428088730, --0.300844411142384640, -0.300796727104569510, -0.300749042314761680, -0.300701356773082130, -0.300653670479649190, -0.300605983434582060, -0.300558295638000020, -0.300510607090022200, --0.300462917790767840, -0.300415227740355340, -0.300367536938905670, -0.300319845386537110, -0.300272153083368960, -0.300224460029520410, -0.300176766225110750, -0.300129071670259150, --0.300081376365084860, -0.300033680309706290, -0.299985983504244320, -0.299938285948817440, -0.299890587643544870, -0.299842888588545800, -0.299795188783939510, -0.299747488229845260, --0.299699786926381440, -0.299652084873668960, -0.299604382071826330, -0.299556678520972730, -0.299508974221227410, -0.299461269172709650, -0.299413563375538700, -0.299365856829833910, --0.299318149535713560, -0.299270441493298730, -0.299222732702707770, -0.299175023164060030, -0.299127312877474680, -0.299079601843071090, -0.299031890060968420, -0.298984177531286090, --0.298936464254142440, -0.298888750229658500, -0.298841035457952650, -0.298793319939144260, -0.298745603673352570, -0.298697886660696800, -0.298650168901296360, -0.298602450395270500, --0.298554731142737670, -0.298507011143818890, -0.298459290398632500, -0.298411568907297970, -0.298363846669934480, -0.298316123686661380, -0.298268399957597960, -0.298220675482862680, --0.298172950262576560, -0.298125224296858060, -0.298077497585826520, -0.298029770129601250, -0.297982041928301580, -0.297934312982046760, -0.297886583290956130, -0.297838852855148220, --0.297791121674744030, -0.297743389749862030, -0.297695657080621570, -0.297647923667141990, -0.297600189509542590, -0.297552454607942660, -0.297504718962460780, -0.297456982573217950, --0.297409245440332700, -0.297361507563924320, -0.297313768944112160, -0.297266029581015560, -0.297218289474753870, -0.297170548625446510, -0.297122807033211920, -0.297075064698171130, --0.297027321620442710, -0.296979577800145940, -0.296931833237400300, -0.296884087932325010, -0.296836341885039550, -0.296788595095662360, -0.296740847564314510, -0.296693099291114590, --0.296645350276181890, -0.296597600519635800, -0.296549850021595730, -0.296502098782181030, -0.296454346801511110, -0.296406594079704430, -0.296358840616882170, -0.296311086413162780, --0.296263331468665680, -0.296215575783510210, -0.296167819357815830, -0.296120062191701890, -0.296072304285286970, -0.296024545638692130, -0.295976786252035940, -0.295929026125437760, --0.295881265259017030, -0.295833503652893130, -0.295785741307185490, -0.295737978222013480, -0.295690214397496490, -0.295642449833753150, -0.295594684530904540, -0.295546918489069220, --0.295499151708366600, -0.295451384188916090, -0.295403615930837140, -0.295355846934249100, -0.295308077199270660, -0.295260306726022830, -0.295212535514624230, -0.295164763565194330, --0.295116990877852480, -0.295069217452718190, -0.295021443289910870, -0.294973668389549860, -0.294925892751753900, -0.294878116376644070, -0.294830339264338880, -0.294782561414957900, --0.294734782828620480, -0.294687003505446130, -0.294639223445554270, -0.294591442649063510, -0.294543661116094980, -0.294495878846767310, -0.294448095841199910, -0.294400312099512280, --0.294352527621823900, -0.294304742408254160, -0.294256956458922580, -0.294209169773947790, -0.294161382353450910, -0.294113594197550510, -0.294065805306366220, -0.294018015680017340, --0.293970225318623490, -0.293922434222304020, -0.293874642391177670, -0.293826849825365500, -0.293779056524986260, -0.293731262490159350, -0.293683467721004290, -0.293635672217640530, --0.293587875980187650, -0.293540079008765050, -0.293492281303491360, -0.293444482864487880, -0.293396683691873160, -0.293348883785766790, -0.293301083146288170, -0.293253281773556810, --0.293205479667692280, -0.293157676828813160, -0.293109873257040740, -0.293062068952493650, -0.293014263915291340, -0.292966458145553440, -0.292918651643399310, -0.292870844408948620, --0.292823036442320770, -0.292775227743635350, -0.292727418313011020, -0.292679608150568980, -0.292631797256427960, -0.292583985630707370, -0.292536173273526880, -0.292488360185005960, --0.292440546365264060, -0.292392731814420050, -0.292344916532594980, -0.292297100519907650, -0.292249283776477580, -0.292201466302424270, -0.292153648097867310, -0.292105829162926270, --0.292058009497720590, -0.292010189102369090, -0.291962367976992930, -0.291914546121710860, -0.291866723536642450, -0.291818900221907210, -0.291771076177624710, -0.291723251403914530, --0.291675425900895350, -0.291627599668688510, -0.291579772707412640, -0.291531945017187320, -0.291484116598132170, -0.291436287450366700, -0.291388457574010500, -0.291340626969183230, --0.291292795636003470, -0.291244963574592560, -0.291197130785069310, -0.291149297267553180, -0.291101463022163830, -0.291053628049020850, -0.291005792348243750, -0.290957955919951330, --0.290910118764264870, -0.290862280881303110, -0.290814442271185690, -0.290766602934032110, -0.290718762869962070, -0.290670922079095060, -0.290623080561550780, -0.290575238317447970, --0.290527395346907910, -0.290479551650049350, -0.290431707226991910, -0.290383862077855210, -0.290336016202758840, -0.290288169601822410, -0.290240322275164770, -0.290192474222907120, --0.290144625445168280, -0.290096775942067950, -0.290048925713725590, -0.290001074760260990, -0.289953223081793670, -0.289905370678443240, -0.289857517550329460, -0.289809663697571000, --0.289761809120289260, -0.289713953818602990, -0.289666097792631800, -0.289618241042495390, -0.289570383568313380, -0.289522525370205400, -0.289474666448290290, -0.289426806802689340, --0.289378946433521360, -0.289331085340906010, -0.289283223524963000, -0.289235360985811870, -0.289187497723572380, -0.289139633738364100, -0.289091769030305920, -0.289043903599519150, --0.288996037446122620, -0.288948170570236030, -0.288900302971979000, -0.288852434651471200, -0.288804565608832330, -0.288756695844181180, -0.288708825357639140, -0.288660954149325020, --0.288613082219358550, -0.288565209567859360, -0.288517336194947180, -0.288469462100741590, -0.288421587285362380, -0.288373711748928400, -0.288325835491560930, -0.288277958513378900, --0.288230080814501970, -0.288182202395049820, -0.288134323255142160, -0.288086443394898690, -0.288038562814438290, -0.287990681513882300, -0.287942799493349670, -0.287894916752959970, --0.287847033292833010, -0.287799149113088460, -0.287751264213846060, -0.287703378595225430, -0.287655492257345600, -0.287607605200327800, -0.287559717424291040, -0.287511828929355010, --0.287463939715639330, -0.287416049783263850, -0.287368159132348260, -0.287320267763011390, -0.287272375675374720, -0.287224482869557100, -0.287176589345678300, -0.287128695103857970, --0.287080800144215940, -0.287032904466871910, -0.286985008071945660, -0.286937110959555990, -0.286889213129824350, -0.286841314582869770, -0.286793415318811860, -0.286745515337770370, --0.286697614639865150, -0.286649713225215870, -0.286601811093942340, -0.286553908246163390, -0.286506004682000550, -0.286458100401572660, -0.286410195404999570, -0.286362289692400960, --0.286314383263896630, -0.286266476119606320, -0.286218568259649860, -0.286170659684146120, -0.286122750393216550, -0.286074840386980170, -0.286026929665556600, -0.285979018229065800, --0.285931106077627390, -0.285883193211361240, -0.285835279630386240, -0.285787365334823910, -0.285739450324793140, -0.285691534600413740, -0.285643618161805560, -0.285595701009088270, --0.285547783142381770, -0.285499864561805820, -0.285451945267479300, -0.285404025259523800, -0.285356104538058260, -0.285308183103202440, -0.285260260955076170, -0.285212338093799260, --0.285164414519491480, -0.285116490232271810, -0.285068565232261760, -0.285020639519580340, -0.284972713094347300, -0.284924785956682470, -0.284876858106705650, -0.284828929544536700, --0.284781000270295460, -0.284733070284100830, -0.284685139586074390, -0.284637208176335090, -0.284589276055002780, -0.284541343222197320, -0.284493409678038430, -0.284445475422646090, --0.284397540456139130, -0.284349604778639240, -0.284301668390265270, -0.284253731291137180, -0.284205793481374760, -0.284157854961097860, -0.284109915730426320, -0.284061975789479950, --0.284014035138377810, -0.283966093777241470, -0.283918151706189840, -0.283870208925342870, -0.283822265434820360, -0.283774321234742220, -0.283726376325228240, -0.283678430706398310, --0.283630484378371520, -0.283582537341269310, -0.283534589595210770, -0.283486641140315740, -0.283438691976704130, -0.283390742104495770, -0.283342791523810590, -0.283294840234768420, --0.283246888237488280, -0.283198935532091740, -0.283150982118697940, -0.283103027997426650, -0.283055073168397790, -0.283007117631731200, -0.282959161387546900, -0.282911204435963790, --0.282863246777103510, -0.282815288411085160, -0.282767329338028560, -0.282719369558053660, -0.282671409071280300, -0.282623447877828450, -0.282575485977817950, -0.282527523371367880, --0.282479560058599920, -0.282431596039632970, -0.282383631314587100, -0.282335665883582110, -0.282287699746738010, -0.282239732904174590, -0.282191765356011040, -0.282143797102368920, --0.282095828143367260, -0.282047858479126060, -0.281999888109765230, -0.281951917035404680, -0.281903945256164300, -0.281855972772164120, -0.281807999583523090, -0.281760025690362960, --0.281712051092802730, -0.281664075790962420, -0.281616099784961880, -0.281568123074921070, -0.281520145660960010, -0.281472167543197700, -0.281424188721755840, -0.281376209196753490, --0.281328228968310610, -0.281280248036547220, -0.281232266401583160, -0.281184284063538400, -0.281136301022533010, -0.281088317278685940, -0.281040332832118990, -0.280992347682951170, --0.280944361831302500, -0.280896375277292890, -0.280848388021042390, -0.280800400062670870, -0.280752411402298400, -0.280704422040044030, -0.280656431976029460, -0.280608441210373820, --0.280560449743197050, -0.280512457574619180, -0.280464464704760160, -0.280416471133739960, -0.280368476861678590, -0.280320481888695180, -0.280272486214911410, -0.280224489840446460, --0.280176492765420280, -0.280128494989952850, -0.280080496514164170, -0.280032497338174260, -0.279984497462102240, -0.279936496886069860, -0.279888495610196190, -0.279840493634601340, --0.279792490959405230, -0.279744487584727860, -0.279696483510689320, -0.279648478737409560, -0.279600473265007750, -0.279552467093605590, -0.279504460223322260, -0.279456452654277820, --0.279408444386592240, -0.279360435420385520, -0.279312425755777750, -0.279264415392887990, -0.279216404331838140, -0.279168392572747230, -0.279120380115735310, -0.279072366960922470, --0.279024353108428710, -0.278976338558374060, -0.278928323310878580, -0.278880307366061450, -0.278832290724044420, -0.278784273384946600, -0.278736255348888130, -0.278688236615989020, --0.278640217186369330, -0.278592197060149090, -0.278544176237447480, -0.278496154718386290, -0.278448132503084760, -0.278400109591662840, -0.278352085984240660, -0.278304061680938300, --0.278256036681875760, -0.278208010987173130, -0.278159984596949630, -0.278111957511327000, -0.278063929730424490, -0.278015901254362150, -0.277967872083260070, -0.277919842217238310, --0.277871811656416940, -0.277823780400916040, -0.277775748450854840, -0.277727715806355080, -0.277679682467536050, -0.277631648434517870, -0.277583613707420520, -0.277535578286364160, --0.277487542171468820, -0.277439505362854670, -0.277391467860640840, -0.277343429664949240, -0.277295390775899040, -0.277247351193610380, -0.277199310918203380, -0.277151269949798050, --0.277103228288514580, -0.277055185934472150, -0.277007142887792600, -0.276959099148595230, -0.276911054717000120, -0.276863009593127320, -0.276814963777097020, -0.276766917269029360, --0.276718870069044330, -0.276670822177261360, -0.276622773593802110, -0.276574724318785940, -0.276526674352332970, -0.276478623694563330, -0.276430572345597150, -0.276382520305554490, --0.276334467574554710, -0.276286414152719590, -0.276238360040168440, -0.276190305237021370, -0.276142249743398570, -0.276094193559420110, -0.276046136685206220, -0.275998079120876980, --0.275950020866551630, -0.275901961922352110, -0.275853902288397730, -0.275805841964808560, -0.275757780951704780, -0.275709719249206560, -0.275661656857434050, -0.275613593776506520, --0.275565530006545880, -0.275517465547671370, -0.275469400400003230, -0.275421334563661580, -0.275373268038766610, -0.275325200825438490, -0.275277132923797350, -0.275229064333962490, --0.275180995056055870, -0.275132925090196710, -0.275084854436505270, -0.275036783095101710, -0.274988711066106170, -0.274940638349638830, -0.274892564945819930, -0.274844490854768750, --0.274796416076607210, -0.274748340611454640, -0.274700264459431190, -0.274652187620657070, -0.274604110095252540, -0.274556031883337660, -0.274507952985032780, -0.274459873400457080, --0.274411793129732630, -0.274363712172978670, -0.274315630530315380, -0.274267548201863050, -0.274219465187741870, -0.274171381488072020, -0.274123297102972840, -0.274075212032566300, --0.274027126276971680, -0.273979039836309280, -0.273930952710699280, -0.273882864900261920, -0.273834776405117330, -0.273786687225385850, -0.273738597361186830, -0.273690506812642120, --0.273642415579871120, -0.273594323662994130, -0.273546231062131330, -0.273498137777402950, -0.273450043808929180, -0.273401949156829530, -0.273353853821225790, -0.273305757802237430, --0.273257661099984670, -0.273209563714587770, -0.273161465646167000, -0.273113366894842500, -0.273065267460734620, -0.273017167343962700, -0.272969066544648750, -0.272920965062912080, --0.272872862898873030, -0.272824760052651830, -0.272776656524368720, -0.272728552314143950, -0.272680447422096960, -0.272632341848349720, -0.272584235593021640, -0.272536128656232950, --0.272488021038103880, -0.272439912738754840, -0.272391803758305960, -0.272343694096877640, -0.272295583754589180, -0.272247472731562630, -0.272199361027917360, -0.272151248643773770, --0.272103135579251980, -0.272055021834472390, -0.272006907409555240, -0.271958792304620830, -0.271910676519788560, -0.271862560055180450, -0.271814442910916000, -0.271766325087115400, --0.271718206583898950, -0.271670087401387040, -0.271621967539699860, -0.271573846998957810, -0.271525725779280300, -0.271477603880789290, -0.271429481303604280, -0.271381358047845580, --0.271333234113633470, -0.271285109501088250, -0.271236984210330320, -0.271188858241479040, -0.271140731594656460, -0.271092604269982050, -0.271044476267576160, -0.270996347587559030, --0.270948218230051110, -0.270900088195172580, -0.270851957483043860, -0.270803826093784340, -0.270755694027516150, -0.270707561284358740, -0.270659427864432420, -0.270611293767857470, --0.270563158994754360, -0.270515023545243320, -0.270466887419443860, -0.270418750617478050, -0.270370613139465370, -0.270322474985526200, -0.270274336155780780, -0.270226196650349530, --0.270178056469352780, -0.270129915612910890, -0.270081774081143370, -0.270033631874172290, -0.269985488992117110, -0.269937345435098170, -0.269889201203235900, -0.269841056296650670, --0.269792910715462740, -0.269744764459791670, -0.269696617529759600, -0.269648469925485970, -0.269600321647091130, -0.269552172694695500, -0.269504023068419470, -0.269455872768383340, --0.269407721794707570, -0.269359570147511610, -0.269311417826917590, -0.269263264833045020, -0.269215111166014320, -0.269166956825945770, -0.269118801812959880, -0.269070646127176960, --0.269022489768716620, -0.268974332737700880, -0.268926175034249320, -0.268878016658482270, -0.268829857610520250, -0.268781697890483560, -0.268733537498492600, -0.268685376434667830, --0.268637214699129600, -0.268589052291997480, -0.268540889213393590, -0.268492725463437440, -0.268444561042249560, -0.268396395949950180, -0.268348230186659880, -0.268300063752498990, --0.268251896647587080, -0.268203728872046300, -0.268155560425996140, -0.268107391309557130, -0.268059221522849670, -0.268011051065994100, -0.267962879939110890, -0.267914708142320550, --0.267866535675742530, -0.267818362539499030, -0.267770188733709670, -0.267722014258494790, -0.267673839113974850, -0.267625663300270380, -0.267577486817501710, -0.267529309665788470, --0.267481131845252850, -0.267432953356014360, -0.267384774198193510, -0.267336594371910710, -0.267288413877286410, -0.267240232714441080, -0.267192050883495180, -0.267143868384568330, --0.267095685217782650, -0.267047501383257720, -0.266999316881114060, -0.266951131711472110, -0.266902945874452290, -0.266854759370175170, -0.266806572198760250, -0.266758384360329780, --0.266710195855003330, -0.266662006682901410, -0.266613816844144480, -0.266565626338853000, -0.266517435167147430, -0.266469243329148290, -0.266421050824975190, -0.266372857654750330, --0.266324663818593320, -0.266276469316624630, -0.266228274148964770, -0.266180078315734260, -0.266131881817053490, -0.266083684653042220, -0.266035486823822550, -0.265987288329514180, --0.265939089170237620, -0.265890889346113320, -0.265842688857261760, -0.265794487703803540, -0.265746285885859020, -0.265698083403548890, -0.265649880256992600, -0.265601676446312500, --0.265553471971628210, -0.265505266833060250, -0.265457061030729140, -0.265408854564755330, -0.265360647435259440, -0.265312439642361010, -0.265264231186182360, -0.265216022066843190, --0.265167812284463900, -0.265119601839165110, -0.265071390731067280, -0.265023178960290980, -0.264974966526956790, -0.264926753431184270, -0.264878539673095710, -0.264830325252810860, --0.264782110170450170, -0.264733894426134210, -0.264685678019983490, -0.264637460952118600, -0.264589243222659200, -0.264541024831727530, -0.264492805779443290, -0.264444586065927080, --0.264396365691299370, -0.264348144655680740, -0.264299922959191750, -0.264251700601952970, -0.264203477584084080, -0.264155253905707380, -0.264107029566942490, -0.264058804567910090, --0.264010578908730590, -0.263962352589524720, -0.263914125610412940, -0.263865897971515000, -0.263817669672953170, -0.263769440714847150, -0.263721211097317550, -0.263672980820484900, --0.263624749884469820, -0.263576518289392820, -0.263528286035374590, -0.263480053122534750, -0.263431819550995650, -0.263383585320876970, -0.263335350432299390, -0.263287114885383370, --0.263238878680249590, -0.263190641817018620, -0.263142404295810150, -0.263094166116746580, -0.263045927279947580, -0.262997687785533730, -0.262949447633625650, -0.262901206824344040, --0.262852965357809330, -0.262804723234142220, -0.262756480453463340, -0.262708237015892350, -0.262659992921551680, -0.262611748170560990, -0.262563502763040910, -0.262515256699112130, --0.262467009978895160, -0.262418762602510680, -0.262370514570078480, -0.262322265881720810, -0.262274016537557440, -0.262225766537709070, -0.262177515882296320, -0.262129264571439700, --0.262081012605260010, -0.262032759983877710, -0.261984506707412690, -0.261936252775987250, -0.261887998189721190, -0.261839742948735130, -0.261791487053149700, -0.261743230503085570, --0.261694973298663370, -0.261646715440002840, -0.261598456927226390, -0.261550197760453850, -0.261501937939805750, -0.261453677465402820, -0.261405416337365750, -0.261357154555815100, --0.261308892120871550, -0.261260629032654900, -0.261212365291287550, -0.261164100896889300, -0.261115835849580810, -0.261067570149482730, -0.261019303796715670, -0.260971036791400430, --0.260922769133656700, -0.260874500823606860, -0.260826231861370830, -0.260777962247069230, -0.260729691980822690, -0.260681421062751940, -0.260633149492977610, -0.260584877271620440, --0.260536604398800160, -0.260488330874639300, -0.260440056699257570, -0.260391781872775730, -0.260343506395314390, -0.260295230266994300, -0.260246953487936140, -0.260198676058259750, --0.260150397978087530, -0.260102119247539290, -0.260053839866735800, -0.260005559835797650, -0.259957279154845620, -0.259908997824000400, -0.259860715843382720, -0.259812433213113200, --0.259764149933311760, -0.259715866004100790, -0.259667581425600150, -0.259619296197930620, -0.259571010321212770, -0.259522723795567460, -0.259474436621115300, -0.259426148797976150, --0.259377860326272580, -0.259329571206124270, -0.259281281437652110, -0.259232991020976690, -0.259184699956218790, -0.259136408243499210, -0.259088115882938560, -0.259039822874656770, --0.258991529218776270, -0.258943234915416930, -0.258894939964699530, -0.258846644366744760, -0.258798348121673400, -0.258750051229606150, -0.258701753690662950, -0.258653455504966210, --0.258605156672635840, -0.258556857193792570, -0.258508557068557130, -0.258460256297050330, -0.258411954879392840, -0.258363652815705500, -0.258315350106108180, -0.258267046750723320, --0.258218742749670880, -0.258170438103071550, -0.258122132811046120, -0.258073826873715380, -0.258025520291200070, -0.257977213063620090, -0.257928905191097960, -0.257880596673753570, --0.257832287511707670, -0.257783977705081050, -0.257735667253994440, -0.257687356158568750, -0.257639044418924600, -0.257590732035182010, -0.257542419007463440, -0.257494105335888850, --0.257445791020578960, -0.257397476061654640, -0.257349160459236560, -0.257300844213445620, -0.257252527324401740, -0.257204209792227360, -0.257155891617042440, -0.257107572798967840, --0.257059253338124290, -0.257010933234632590, -0.256962612488613570, -0.256914291100187990, -0.256865969069475840, -0.256817646396599650, -0.256769323081679320, -0.256720999124835700, --0.256672674526189580, -0.256624349285861750, -0.256576023403973060, -0.256527696880644360, -0.256479369715995500, -0.256431041910149090, -0.256382713463225050, -0.256334384375344280, --0.256286054646627510, -0.256237724277195660, -0.256189393267169440, -0.256141061616669720, -0.256092729325816560, -0.256044396394732370, -0.255996062823537210, -0.255947728612351880, --0.255899393761297280, -0.255851058270494150, -0.255802722140063390, -0.255754385370124960, -0.255706047960801430, -0.255657709912212760, -0.255609371224479850, -0.255561031897723500, --0.255512691932064550, -0.255464351327623910, -0.255416010084522360, -0.255367668202879930, -0.255319325682819180, -0.255270982524460120, -0.255222638727923610, -0.255174294293330490, --0.255125949220801670, -0.255077603510457940, -0.255029257162419360, -0.254980910176808520, -0.254932562553745360, -0.254884214293350840, -0.254835865395745760, -0.254787515861051030, --0.254739165689387480, -0.254690814880876030, -0.254642463435636680, -0.254594111353792010, -0.254545758635462140, -0.254497405280767810, -0.254449051289829970, -0.254400696662769490, --0.254352341399707300, -0.254303985500763390, -0.254255628966060350, -0.254207271795718280, -0.254158913989858020, -0.254110555548600460, -0.254062196472066510, -0.254013836760377090, --0.253965476413653020, -0.253917115432014450, -0.253868753815583940, -0.253820391564481550, -0.253772028678828200, -0.253723665158744780, -0.253675301004352150, -0.253626936215771310, --0.253578570793123130, -0.253530204736527600, -0.253481838046107470, -0.253433470721982750, -0.253385102764274340, -0.253336734173103210, -0.253288364948590190, -0.253239995090856260, --0.253191624600022370, -0.253143253476208530, -0.253094881719537480, -0.253046509330129180, -0.252998136308104580, -0.252949762653584710, -0.252901388366690350, -0.252853013447542570, --0.252804637896261400, -0.252756261712969500, -0.252707884897786890, -0.252659507450834600, -0.252611129372233570, -0.252562750662104710, -0.252514371320568920, -0.252465991347747280, --0.252417610743759730, -0.252369229508729090, -0.252320847642775290, -0.252272465146019420, -0.252224082018582370, -0.252175698260585170, -0.252127313872148650, -0.252078928853393000, --0.252030543204440900, -0.251982156925412480, -0.251933770016428640, -0.251885382477610330, -0.251836994309078630, -0.251788605510954390, -0.251740216083358670, -0.251691826026411550, --0.251643435340235700, -0.251595044024951310, -0.251546652080679280, -0.251498259507540620, -0.251449866305656300, -0.251401472475147330, -0.251353078016133820, -0.251304682928738480, --0.251256287213081410, -0.251207890869283630, -0.251159493897466110, -0.251111096297749860, -0.251062698070255890, -0.251014299215105210, -0.250965899732417840, -0.250917499622316630, --0.250869098884921650, -0.250820697520353960, -0.250772295528734480, -0.250723892910184270, -0.250675489664824340, -0.250627085792775710, -0.250578681294158500, -0.250530276169095400, --0.250481870417706640, -0.250433464040113190, -0.250385057036436100, -0.250336649406796340, -0.250288241151314980, -0.250239832270113040, -0.250191422763310630, -0.250143012631030500, --0.250094601873392890, -0.250046190490518740, -0.249997778482529130, -0.249949365849545050, -0.249900952591687600, -0.249852538709076870, -0.249804124201835680, -0.249755709070084150, --0.249707293313943370, -0.249658876933534330, -0.249610459928978120, -0.249562042300395780, -0.249513624047908310, -0.249465205171635900, -0.249416785671701360, -0.249368365548224860, --0.249319944801327440, -0.249271523431130150, -0.249223101437754090, -0.249174678821320220, -0.249126255581948840, -0.249077831719762640, -0.249029407234881900, -0.248980982127427610, --0.248932556397520880, -0.248884130045282760, -0.248835703070834330, -0.248787275474296600, -0.248738847255789850, -0.248690418415436850, -0.248641988953357790, -0.248593558869673770, --0.248545128164505830, -0.248496696837975100, -0.248448264890202610, -0.248399832321308610, -0.248351399131415850, -0.248302965320644640, -0.248254530889115980, -0.248206095836951020, --0.248157660164270820, -0.248109223871196470, -0.248060786957849030, -0.248012349424348800, -0.247963911270818540, -0.247915472497378500, -0.247867033104149790, -0.247818593091253480, --0.247770152458810680, -0.247721711206942530, -0.247673269335770080, -0.247624826845413620, -0.247576383735995910, -0.247527940007637280, -0.247479495660458790, -0.247431050694581570, --0.247382605110126720, -0.247334158907215330, -0.247285712085968560, -0.247237264646506670, -0.247188816588952450, -0.247140367913426200, -0.247091918620049030, -0.247043468708942060, --0.246995018180226430, -0.246946567034023230, -0.246898115270452770, -0.246849662889637890, -0.246801209891698850, -0.246752756276756770, -0.246704302044932820, -0.246655847196348120, --0.246607391731123780, -0.246558935649380940, -0.246510478951239950, -0.246462021636823600, -0.246413563706252200, -0.246365105159646880, -0.246316645997128800, -0.246268186218819130, --0.246219725824838980, -0.246171264815308630, -0.246122803190350990, -0.246074340950086370, -0.246025878094635860, -0.245977414624120680, -0.245928950538661960, -0.245880485838380850, --0.245832020523398560, -0.245783554593835330, -0.245735088049814060, -0.245686620891455100, -0.245638153118879570, -0.245589684732208660, -0.245541215731563540, -0.245492746117065400, --0.245444275888834520, -0.245395805046993790, -0.245347333591663580, -0.245298861522965010, -0.245250388841019300, -0.245201915545947610, -0.245153441637871140, -0.245104967116911070, --0.245056491983187710, -0.245008016236824000, -0.244959539877940220, -0.244911062906657620, -0.244862585323097350, -0.244814107127380610, -0.244765628319628610, -0.244717148899962540, --0.244668668868502720, -0.244620188225372100, -0.244571706970691030, -0.244523225104580660, -0.244474742627162260, -0.244426259538556980, -0.244377775838886060, -0.244329291528270680, --0.244280806606831240, -0.244232321074690640, -0.244183834931969210, -0.244135348178788240, -0.244086860815268870, -0.244038372841532350, -0.243989884257699880, -0.243941395063891870, --0.243892905260231220, -0.243844414846838300, -0.243795923823834360, -0.243747432191340600, -0.243698939949478280, -0.243650447098368580, -0.243601953638132780, -0.243553459568891210, --0.243504964890766870, -0.243456469603880120, -0.243407973708352210, -0.243359477204304340, -0.243310980091857780, -0.243262482371133790, -0.243213984042252720, -0.243165485105337560, --0.243116985560508670, -0.243068485407887340, -0.243019984647594780, -0.242971483279752270, -0.242922981304481030, -0.242874478721902350, -0.242825975532136610, -0.242777471735306780, --0.242728967331533290, -0.242680462320937370, -0.242631956703640320, -0.242583450479763350, -0.242534943649427760, -0.242486436212753950, -0.242437928169864920, -0.242389419520881080, --0.242340910265923660, -0.242292400405113990, -0.242243889938573290, -0.242195378866422890, -0.242146867188784030, -0.242098354905777160, -0.242049842017525250, -0.242001328524148740, --0.241952814425768910, -0.241904299722507040, -0.241855784414484410, -0.241807268501822330, -0.241758751984642080, -0.241710234863064090, -0.241661717137211380, -0.241613198807204360, --0.241564679873164350, -0.241516160335212640, -0.241467640193470560, -0.241419119448059330, -0.241370598099099470, -0.241322076146713970, -0.241273553591023260, -0.241225030432148680, --0.241176506670211540, -0.241127982305333140, -0.241079457337634750, -0.241030931767237720, -0.240982405594262540, -0.240933878818832160, -0.240885351441067100, -0.240836823461088670, --0.240788294879018180, -0.240739765694976960, -0.240691235909086310, -0.240642705521467580, -0.240594174532241220, -0.240545642941530270, -0.240497110749455230, -0.240448577956137420, --0.240400044561698140, -0.240351510566258780, -0.240302975969940630, -0.240254440772864180, -0.240205904975152480, -0.240157368576926020, -0.240108831578306150, -0.240060293979414200, --0.240011755780371480, -0.239963216981299410, -0.239914677582319300, -0.239866137583551600, -0.239817596985119450, -0.239769055787143300, -0.239720513989744500, -0.239671971593044430, --0.239623428597164430, -0.239574885002225850, -0.239526340808349200, -0.239477796015657550, -0.239429250624271420, -0.239380704634312190, -0.239332158045901160, -0.239283610859159750, --0.239235063074209300, -0.239186514691171190, -0.239137965710165960, -0.239089416131316650, -0.239040865954743830, -0.238992315180568820, -0.238943763808913020, -0.238895211839897810, --0.238846659273644600, -0.238798106110274720, -0.238749552349908720, -0.238700997992669690, -0.238652443038678160, -0.238603887488055530, -0.238555331340923190, -0.238506774597402520, --0.238458217257614900, -0.238409659321680900, -0.238361100789723580, -0.238312541661863550, -0.238263981938222120, -0.238215421618920790, -0.238166860704080860, -0.238118299193823800, --0.238069737088270980, -0.238021174387542940, -0.237972611091762880, -0.237924047201051230, -0.237875482715529500, -0.237826917635319050, -0.237778351960541310, -0.237729785691317700, --0.237681218827769600, -0.237632651370017630, -0.237584083318184870, -0.237535514672391900, -0.237486945432760140, -0.237438375599411030, -0.237389805172465970, -0.237341234152046390, --0.237292662538272890, -0.237244090331268590, -0.237195517531154030, -0.237146944138050710, -0.237098370152080020, -0.237049795573363390, -0.237001220402022290, -0.236952644638178140, --0.236904068281951510, -0.236855491333465590, -0.236806913792840910, -0.236758335660198970, -0.236709756935661180, -0.236661177619348990, -0.236612597711383880, -0.236564017211886380, --0.236515436120979720, -0.236466854438784490, -0.236418272165422080, -0.236369689301014010, -0.236321105845681720, -0.236272521799546660, -0.236223937162730320, -0.236175351935353240, --0.236126766117538660, -0.236078179709407170, -0.236029592711080230, -0.235981005122679300, -0.235932416944325850, -0.235883828176141370, -0.235835238818247310, -0.235786648870764310, --0.235738058333815530, -0.235689467207521620, -0.235640875492004020, -0.235592283187384260, -0.235543690293783780, -0.235495096811324050, -0.235446502740125740, -0.235397908080312050, --0.235349312832003550, -0.235300716995321820, -0.235252120570388250, -0.235203523557324410, -0.235154925956251730, -0.235106327767291760, -0.235057728990565100, -0.235009129626195000, --0.234960529674302030, -0.234911929135007770, -0.234863328008433680, -0.234814726294701290, -0.234766123993932070, -0.234717521106247520, -0.234668917631768340, -0.234620313570617690, --0.234571708922916290, -0.234523103688785590, -0.234474497868347150, -0.234425891461722460, -0.234377284469033050, -0.234328676890399550, -0.234280068725945230, -0.234231459975790730, --0.234182850640057590, -0.234134240718867320, -0.234085630212341440, -0.234037019120601510, -0.233988407443769000, -0.233939795181964620, -0.233891182335311640, -0.233842568903930680, --0.233793954887943300, -0.233745340287471020, -0.233696725102635420, -0.233648109333557980, -0.233599492980359420, -0.233550876043162990, -0.233502258522089360, -0.233453640417260080, --0.233405021728796710, -0.233356402456820790, -0.233307782601453850, -0.233259162162817470, -0.233210541141032320, -0.233161919536221670, -0.233113297348506220, -0.233064674578007530, --0.233016051224847170, -0.232967427289146660, -0.232918802771027580, -0.232870177670611490, -0.232821551988019130, -0.232772925723373710, -0.232724298876795990, -0.232675671448407530, --0.232627043438329910, -0.232578414846684650, -0.232529785673593360, -0.232481155919176760, -0.232432525583558120, -0.232383894666858160, -0.232335263169198470, -0.232286631090700610, --0.232237998431486180, -0.232189365191676770, -0.232140731371393930, -0.232092096970758420, -0.232043461989893510, -0.231994826428919940, -0.231946190287959320, -0.231897553567133210, --0.231848916266563230, -0.231800278386370960, -0.231751639926677990, -0.231703000887605040, -0.231654361269275470, -0.231605721071809990, -0.231557080295330200, -0.231508438939957730, --0.231459797005814150, -0.231411154493021080, -0.231362511401699280, -0.231313867731972040, -0.231265223483960140, -0.231216578657785170, -0.231167933253568770, -0.231119287271432520, --0.231070640711498050, -0.231021993573887000, -0.230973345858720090, -0.230924697566120690, -0.230876048696209530, -0.230827399249108250, -0.230778749224938490, -0.230730098623821820, --0.230681447445879930, -0.230632795691233570, -0.230584143360006070, -0.230535490452318220, -0.230486836968291610, -0.230438182908047930, -0.230389528271708800, -0.230340873059395850, --0.230292217271230730, -0.230243560907334170, -0.230194903967829600, -0.230146246452837770, -0.230097588362480290, -0.230048929696878870, -0.230000270456155120, -0.229951610640430680, --0.229902950249827240, -0.229854289284465520, -0.229805627744468970, -0.229756965629958370, -0.229708302941055320, -0.229659639677881530, -0.229610975840558650, -0.229562311429208300, --0.229513646443951340, -0.229464980884911100, -0.229416314752208420, -0.229367648045964960, -0.229318980766302360, -0.229270312913342320, -0.229221644487206500, -0.229172975488016570, --0.229124305915893330, -0.229075635770960210, -0.229026965053338000, -0.228978293763148350, -0.228929621900512970, -0.228880949465553570, -0.228832276458391770, -0.228783602879149260, --0.228734928727946900, -0.228686254004908080, -0.228637578710153640, -0.228588902843805230, -0.228540226405984560, -0.228491549396813350, -0.228442871816413260, -0.228394193664905130, --0.228345514942412370, -0.228296835649055810, -0.228248155784957160, -0.228199475350238160, -0.228150794345020450, -0.228102112769425740, -0.228053430623575750, -0.228004747907591340, --0.227956064621595900, -0.227907380765710320, -0.227858696340056290, -0.227810011344755510, -0.227761325779929690, -0.227712639645700570, -0.227663952942188970, -0.227615265669518370, --0.227566577827809590, -0.227517889417184400, -0.227469200437764450, -0.227420510889671520, -0.227371820773027310, -0.227323130087953520, -0.227274438834571070, -0.227225747013003380, --0.227177054623371320, -0.227128361665796640, -0.227079668140401040, -0.227030974047306270, -0.226982279386634070, -0.226933584158505310, -0.226884888363043440, -0.226836192000369360, --0.226787495070604810, -0.226738797573871500, -0.226690099510291200, -0.226641400879985660, -0.226592701683076630, -0.226544001919684960, -0.226495301589934170, -0.226446600693945090, --0.226397899231839560, -0.226349197203739250, -0.226300494609765950, -0.226251791450041400, -0.226203087724687390, -0.226154383433824800, -0.226105678577577100, -0.226056973156065210, --0.226008267169410890, -0.225959560617735920, -0.225910853501162020, -0.225862145819811010, -0.225813437573804620, -0.225764728763263760, -0.225716019388311960, -0.225667309449070120, --0.225618598945660000, -0.225569887878203370, -0.225521176246822020, -0.225472464051637730, -0.225423751292771420, -0.225375037970346610, -0.225326324084484190, -0.225277609635305960, --0.225228894622933720, -0.225180179047489240, -0.225131462909094300, -0.225082746207870720, -0.225034028943939400, -0.224985311117423870, -0.224936592728445070, -0.224887873777124770, --0.224839154263584810, -0.224790434187946950, -0.224741713550333010, -0.224692992350863900, -0.224644270589663210, -0.224595548266851820, -0.224546825382551550, -0.224498101936884240, --0.224449377929971690, -0.224400653361935650, -0.224351928232898010, -0.224303202542979670, -0.224254476292304190, -0.224205749480992530, -0.224157022109166490, -0.224108294176947890, --0.224059565684458560, -0.224010836631820310, -0.223962107019154120, -0.223913376846583520, -0.223864646114229460, -0.223815914822213800, -0.223767182970658340, -0.223718450559684950, --0.223669717589415420, -0.223620984059971580, -0.223572249971474430, -0.223523515324047520, -0.223474780117811830, -0.223426044352889180, -0.223377308029401420, -0.223328571147470400, --0.223279833707217930, -0.223231095708765900, -0.223182357152235250, -0.223133618037749560, -0.223084878365429840, -0.223036138135397940, -0.222987397347775670, -0.222938656002684920, --0.222889914100247530, -0.222841171640585340, -0.222792428623819370, -0.222743685050073190, -0.222694940919467820, -0.222646196232125060, -0.222597450988166830, -0.222548705187714970, --0.222499958830891350, -0.222451211917816970, -0.222402464448615420, -0.222353716423407700, -0.222304967842315710, -0.222256218705461280, -0.222207469012966310, -0.222158718764952660, --0.222109967961542230, -0.222061216602856020, -0.222012464689017610, -0.221963712220148050, -0.221914959196369220, -0.221866205617802960, -0.221817451484571220, -0.221768696796795840, --0.221719941554597840, -0.221671185758100880, -0.221622429407425940, -0.221573672502694910, -0.221524915044029710, -0.221476157031552240, -0.221427398465384370, -0.221378639345648000, --0.221329879672464150, -0.221281119445956490, -0.221232358666246020, -0.221183597333454660, -0.221134835447704290, -0.221086073009116840, -0.221037310017814210, -0.220988546473917440, --0.220939782377550190, -0.220891017728833460, -0.220842252527889190, -0.220793486774839290, -0.220744720469805670, -0.220695953612910250, -0.220647186204274950, -0.220598418244020820, --0.220549649732271510, -0.220500880669148050, -0.220452111054772410, -0.220403340889266500, -0.220354570172752230, -0.220305798905351540, -0.220257027087186360, -0.220208254718377740, --0.220159481799049340, -0.220110708329322220, -0.220061934309318360, -0.220013159739159660, -0.219964384618968060, -0.219915608948865500, -0.219866832728973890, -0.219818055959414370, --0.219769278640310540, -0.219720500771783540, -0.219671722353955300, -0.219622943386947710, -0.219574163870882800, -0.219525383805882460, -0.219476603192067800, -0.219427822029562510, --0.219379040318487650, -0.219330258058965190, -0.219281475251117100, -0.219232691895065310, -0.219183907990931790, -0.219135123538838520, -0.219086338538906550, -0.219037552991259600, --0.218988766896018760, -0.218939980253306020, -0.218891193063243340, -0.218842405325952670, -0.218793617041555980, -0.218744828210174380, -0.218696038831931560, -0.218647248906948670, --0.218598458435347640, -0.218549667417250490, -0.218500875852779160, -0.218452083742055630, -0.218403291085201900, -0.218354497882339070, -0.218305704133590850, -0.218256909839078390, --0.218208114998923650, -0.218159319613248640, -0.218110523682175290, -0.218061727205825670, -0.218012930184320830, -0.217964132617784550, -0.217915334506337960, -0.217866535850103020, --0.217817736649201730, -0.217768936903756090, -0.217720136613888120, -0.217671335779719810, -0.217622534401372300, -0.217573732478969300, -0.217524930012631980, -0.217476127002482340, --0.217427323448642380, -0.217378519351234120, -0.217329714710379540, -0.217280909526200690, -0.217232103798818720, -0.217183297528357330, -0.217134490714937680, -0.217085683358681840, --0.217036875459711760, -0.216988067018149520, -0.216939258034117090, -0.216890448507736530, -0.216841638439128960, -0.216792827828418190, -0.216744016675725320, -0.216695204981172450, --0.216646392744881540, -0.216597579966974650, -0.216548766647573800, -0.216499952786800180, -0.216451138384777560, -0.216402323441627080, -0.216353507957470770, -0.216304691932430710, --0.216255875366628940, -0.216207058260187430, -0.216158240613228330, -0.216109422425872720, -0.216060603698244450, -0.216011784430464650, -0.215962964622655410, -0.215914144274938740, --0.215865323387436720, -0.215816501960271380, -0.215767679993563940, -0.215718857487438130, -0.215670034442015210, -0.215621210857417200, -0.215572386733766160, -0.215523562071184140, --0.215474736869793240, -0.215425911129715460, -0.215377084851072070, -0.215328258033986840, -0.215279430678580940, -0.215230602784976470, -0.215181774353295500, -0.215132945383660070, --0.215084115876192310, -0.215035285831013360, -0.214986455248247080, -0.214937624128014680, -0.214888792470438210, -0.214839960275639730, -0.214791127543741380, -0.214742294274865210, --0.214693460469133290, -0.214644626126666850, -0.214595791247589730, -0.214546955832023130, -0.214498119880089130, -0.214449283391909830, -0.214400446367607330, -0.214351608807303700, --0.214302770711121050, -0.214253932079180640, -0.214205092911606220, -0.214156253208519110, -0.214107412970041350, -0.214058572196295040, -0.214009730887402330, -0.213960889043485260, --0.213912046664665120, -0.213863203751065710, -0.213814360302808320, -0.213765516320015030, -0.213716671802807930, -0.213667826751309160, -0.213618981165640820, -0.213570135045925010, --0.213521288392283020, -0.213472441204838690, -0.213423593483713230, -0.213374745229028770, -0.213325896440907490, -0.213277047119471430, -0.213228197264842790, -0.213179346877143630, --0.213130495956495250, -0.213081644503021470, -0.213032792516843620, -0.212983939998083770, -0.212935086946864060, -0.212886233363306640, -0.212837379247533650, -0.212788524599666320, --0.212739669419828550, -0.212690813708141640, -0.212641957464727670, -0.212593100689708800, -0.212544243383207180, -0.212495385545344970, -0.212446527176244290, -0.212397668276026410, --0.212348808844815250, -0.212299948882732040, -0.212251088389898980, -0.212202227366438180, -0.212153365812471820, -0.212104503728122060, -0.212055641113510160, -0.212006777968760020, --0.211957914293992940, -0.211909050089331090, -0.211860185354896590, -0.211811320090811630, -0.211762454297198390, -0.211713587974179000, -0.211664721121874760, -0.211615853740409620, --0.211566985829904820, -0.211518117390482540, -0.211469248422265000, -0.211420378925374320, -0.211371508899932700, -0.211322638346062320, -0.211273767263884440, -0.211224895653523040, --0.211176023515099400, -0.211127150848735710, -0.211078277654554110, -0.211029403932676830, -0.210980529683226060, -0.210931654906323070, -0.210882779602091840, -0.210833903770653640, --0.210785027412130680, -0.210736150526645160, -0.210687273114319260, -0.210638395175275190, -0.210589516709635110, -0.210540637717520380, -0.210491758199054910, -0.210442878154360080, --0.210393997583558030, -0.210345116486770980, -0.210296234864121160, -0.210247352715730720, -0.210198470041721930, -0.210149586842216100, -0.210100703117337140, -0.210051818867206450, --0.210002934091946200, -0.209954048791678620, -0.209905162966525920, -0.209856276616610300, -0.209807389742053120, -0.209758502342978350, -0.209709614419507330, -0.209660725971762250, --0.209611836999865380, -0.209562947503938890, -0.209514057484105040, -0.209465166940486060, -0.209416275873203300, -0.209367384282380690, -0.209318492168139640, -0.209269599530602340, --0.209220706369891070, -0.209171812686128030, -0.209122918479435430, -0.209074023749934700, -0.209025128497749760, -0.208976232723002000, -0.208927336425813650, -0.208878439606306980, --0.208829542264604210, -0.208780644400827550, -0.208731746015099310, -0.208682847107540840, -0.208633947678276120, -0.208585047727426500, -0.208536147255114300, -0.208487246261461700, --0.208438344746591010, -0.208389442710624430, -0.208340540153684280, -0.208291637075891880, -0.208242733477371270, -0.208193829358243820, -0.208144924718631800, -0.208096019558657470, --0.208047113878443100, -0.207998207678110920, -0.207949300957782380, -0.207900393717581460, -0.207851485957629530, -0.207802577678048880, -0.207753668878961820, -0.207704759560490560, --0.207655849722757410, -0.207606939365884650, -0.207558028489993660, -0.207509117095208450, -0.207460205181650480, -0.207411292749441980, -0.207362379798705250, -0.207313466329562570, --0.207264552342136230, -0.207215637836548480, -0.207166722812920810, -0.207117807271377190, -0.207068891212039030, -0.207019974635028660, -0.206971057540468350, -0.206922139928480380, --0.206873221799187100, -0.206824303152709860, -0.206775383989172750, -0.206726464308697180, -0.206677544111405430, -0.206628623397419830, -0.206579702166862690, -0.206530780419856290, --0.206481858156522920, -0.206432935376984040, -0.206384012081363700, -0.206335088269783310, -0.206286163942365240, -0.206237239099231720, -0.206188313740505110, -0.206139387866307730, --0.206090461476760990, -0.206041534571988980, -0.205992607152113150, -0.205943679217255790, -0.205894750767539210, -0.205845821803085780, -0.205796892324017790, -0.205747962330457560, --0.205699031822526580, -0.205650100800348870, -0.205601169264045900, -0.205552237213740020, -0.205503304649553550, -0.205454371571608810, -0.205405437980028140, -0.205356503874933870, --0.205307569256447470, -0.205258634124693030, -0.205209698479792010, -0.205160762321866720, -0.205111825651039550, -0.205062888467432810, -0.205013950771168820, -0.204965012562369130, --0.204916073841157760, -0.204867134607656180, -0.204818194861986800, -0.204769254604271920, -0.204720313834633900, -0.204671372553195090, -0.204622430760077860, -0.204573488455403660, --0.204524545639296650, -0.204475602311878250, -0.204426658473270850, -0.204377714123596790, -0.204328769262978470, -0.204279823891538200, -0.204230878009398380, -0.204181931616680500, --0.204132984713508660, -0.204084037300004350, -0.204035089376289970, -0.203986140942487850, -0.203937191998720370, -0.203888242545109930, -0.203839292581777990, -0.203790342108848720, --0.203741391126443570, -0.203692439634684950, -0.203643487633695220, -0.203594535123596790, -0.203545582104512010, -0.203496628576563280, -0.203447674539872110, -0.203398719994562600, --0.203349764940756320, -0.203300809378575610, -0.203251853308142910, -0.203202896729580560, -0.203153939643010960, -0.203104982048555620, -0.203056023946338730, -0.203007065336481750, --0.202958106219107120, -0.202909146594337230, -0.202860186462294480, -0.202811225823101270, -0.202762264676879970, -0.202713303023752150, -0.202664340863841940, -0.202615378197270880, --0.202566415024161370, -0.202517451344635830, -0.202468487158816660, -0.202419522466826260, -0.202370557268787080, -0.202321591564820630, -0.202272625355051060, -0.202223658639599930, --0.202174691418589650, -0.202125723692142630, -0.202076755460381310, -0.202027786723428110, -0.201978817481404590, -0.201929847734434870, -0.201880877482640530, -0.201831906726144010, --0.201782935465067730, -0.201733963699534090, -0.201684991429665530, -0.201636018655584530, -0.201587045377412590, -0.201538071595273930, -0.201489097309290040, -0.201440122519583460, --0.201391147226276550, -0.201342171429491760, -0.201293195129351570, -0.201244218325978390, -0.201195241019493760, -0.201146263210021940, -0.201097284897684440, -0.201048306082603740, --0.200999326764902260, -0.200950346944702460, -0.200901366622126790, -0.200852385797296860, -0.200803404470336820, -0.200754422641368280, -0.200705440310513660, -0.200656457477895460, --0.200607474143636110, -0.200558490307858080, -0.200509505970683820, -0.200460521132234920, -0.200411535792635570, -0.200362549952007420, -0.200313563610472870, -0.200264576768154400, --0.200215589425174510, -0.200166601581655640, -0.200117613237719400, -0.200068624393489990, -0.200019635049089040, -0.199970645204638970, -0.199921654860262310, -0.199872664016081500, --0.199823672672219040, -0.199774680828797400, -0.199725688485938190, -0.199676695643765610, -0.199627702302401320, -0.199578708461967760, -0.199529714122587410, -0.199480719284382800, --0.199431723947476380, -0.199382728111990650, -0.199333731778047250, -0.199284734945770370, -0.199235737615281660, -0.199186739786703590, -0.199137741460158700, -0.199088742635769420, --0.199039743313658310, -0.198990743493946960, -0.198941743176759640, -0.198892742362217930, -0.198843741050444390, -0.198794739241561490, -0.198745736935691750, -0.198696734132957660, --0.198647730833481720, -0.198598727037385600, -0.198549722744793540, -0.198500717955827160, -0.198451712670608990, -0.198402706889261540, -0.198353700611907320, -0.198304693838668860, --0.198255686569668630, -0.198206678805028350, -0.198157670544872240, -0.198108661789321930, -0.198059652538500000, -0.198010642792528920, -0.197961632551531210, -0.197912621815629460, --0.197863610584945250, -0.197814598859602900, -0.197765586639724070, -0.197716573925431240, -0.197667560716846990, -0.197618547014093840, -0.197569532817294340, -0.197520518126570980, --0.197471502942045460, -0.197422487263842070, -0.197373471092082450, -0.197324454426889150, -0.197275437268384730, -0.197226419616691680, -0.197177401471932610, -0.197128382834229180, --0.197079363703705630, -0.197030344080483700, -0.196981323964685870, -0.196932303356434770, -0.196883282255852890, -0.196834260663062810, -0.196785238578187080, -0.196736216001347390, --0.196687192932668010, -0.196638169372270660, -0.196589145320277910, -0.196540120776812270, -0.196491095741996330, -0.196442070215952640, -0.196393044198802940, -0.196344017690671470, --0.196294990691679970, -0.196245963201950980, -0.196196935221607080, -0.196147906750770870, -0.196098877789564860, -0.196049848338111680, -0.196000818396532990, -0.195951787964953130, --0.195902757043493800, -0.195853725632277600, -0.195804693731427060, -0.195755661341064780, -0.195706628461313370, -0.195657595092295380, -0.195608561234132530, -0.195559526886949160, --0.195510492050866960, -0.195461456726008510, -0.195412420912496440, -0.195363384610453330, -0.195314347820001730, -0.195265310541264280, -0.195216272774362680, -0.195167234519421280, --0.195118195776561780, -0.195069156545906790, -0.195020116827578920, -0.194971076621700740, -0.194922035928394880, -0.194872994747783050, -0.194823953079989620, -0.194774910925136300, --0.194725868283345700, -0.194676825154740440, -0.194627781539443100, -0.194578737437576310, -0.194529692849262690, -0.194480647774623950, -0.194431602213784470, -0.194382556166865980, --0.194333509633991120, -0.194284462615282450, -0.194235415110862650, -0.194186367120854330, -0.194137318645379170, -0.194088269684561610, -0.194039220238523380, -0.193990170307387110, --0.193941119891275410, -0.193892068990310890, -0.193843017604616200, -0.193793965734313980, -0.193744913379525980, -0.193695860540376550, -0.193646807216987490, -0.193597753409481380, --0.193548699117980920, -0.193499644342608690, -0.193450589083487360, -0.193401533340738670, -0.193352477114487050, -0.193303420404854210, -0.193254363211962820, -0.193205305535935540, --0.193156247376894990, -0.193107188734963800, -0.193058129610264670, -0.193009070002919340, -0.192960009913052180, -0.192910949340785010, -0.192861888286240480, -0.192812826749541200, --0.192763764730809890, -0.192714702230169150, -0.192665639247741630, -0.192616575783649190, -0.192567511838016150, -0.192518447410964330, -0.192469382502616420, -0.192420317113095010, --0.192371251242522830, -0.192322184891022540, -0.192273118058716750, -0.192224050745727320, -0.192174982952178640, -0.192125914678192480, -0.192076845923891540, -0.192027776689398490, --0.191978706974836020, -0.191929636780326730, -0.191880566105992520, -0.191831494951957750, -0.191782423318344250, -0.191733351205274680, -0.191684278612871740, -0.191635205541258120, --0.191586131990556460, -0.191537057960889490, -0.191487983452379000, -0.191438908465149410, -0.191389832999322550, -0.191340757055021130, -0.191291680632367790, -0.191242603731485240, --0.191193526352496200, -0.191144448495522480, -0.191095370160688500, -0.191046291348116100, -0.190997212057927970, -0.190948132290246820, -0.190899052045195330, -0.190849971322896220, --0.190800890123472150, -0.190751808447045010, -0.190702726293739220, -0.190653643663676600, -0.190604560556979890, -0.190555476973771760, -0.190506392914174950, -0.190457308378312150, --0.190408223366305220, -0.190359137878278600, -0.190310051914354130, -0.190260965474654510, -0.190211878559302490, -0.190162791168420800, -0.190113703302132120, -0.190064614960559150, --0.190015526143823800, -0.189966436852050500, -0.189917347085361120, -0.189868256843878370, -0.189819166127724980, -0.189770074937023660, -0.189720983271897150, -0.189671891132468180, --0.189622798518858630, -0.189573705431192950, -0.189524611869592990, -0.189475517834181510, -0.189426423325081250, -0.189377328342414910, -0.189328232886305260, -0.189279136956875040, --0.189230040554246080, -0.189180943678542910, -0.189131846329887390, -0.189082748508402230, -0.189033650214210200, -0.188984551447434060, -0.188935452208196550, -0.188886352496619500, --0.188837252312827470, -0.188788151656942290, -0.188739050529086770, -0.188689948929383570, -0.188640846857955540, -0.188591744314925370, -0.188542641300415840, -0.188493537814548860, --0.188444433857448880, -0.188395329429237810, -0.188346224530038440, -0.188297119159973490, -0.188248013319165770, -0.188198907007738000, -0.188149800225812070, -0.188100692973512530, --0.188051585250961270, -0.188002477058281050, -0.187953368395594620, -0.187904259263024760, -0.187855149660694280, -0.187806039588725880, -0.187756929047241560, -0.187707818036365770, --0.187658706556220410, -0.187609594606928330, -0.187560482188612240, -0.187511369301394950, -0.187462255945399230, -0.187413142120747000, -0.187364027827562780, -0.187314913065968510, --0.187265797836086930, -0.187216682138040880, -0.187167565971953110, -0.187118449337946440, -0.187069332236143640, -0.187020214666666630, -0.186971096629639950, -0.186921978125185550, --0.186872859153426190, -0.186823739714484680, -0.186774619808483840, -0.186725499435546420, -0.186676378595795280, -0.186627257289352310, -0.186578135516342060, -0.186529013276886480, --0.186479890571108360, -0.186430767399130530, -0.186381643761075770, -0.186332519657066900, -0.186283395087226740, -0.186234270051677230, -0.186185144550542890, -0.186136018583945680, --0.186086892152008470, -0.186037765254853990, -0.185988637892605110, -0.185939510065384640, -0.185890381773314520, -0.185841253016519330, -0.185792123795120970, -0.185742994109242330, --0.185693863959006190, -0.185644733344535410, -0.185595602265952790, -0.185546470723381150, -0.185497338716942490, -0.185448206246761340, -0.185399073312959660, -0.185349939915660320, --0.185300806054986110, -0.185251671731059890, -0.185202536944004510, -0.185153401693941900, -0.185104265980996660, -0.185055129805290740, -0.185005993166947020, -0.184956856066088300, --0.184907718502837440, -0.184858580477317290, -0.184809441989650690, -0.184760303039959610, -0.184711163628368650, -0.184662023754999790, -0.184612883419975870, -0.184563742623419710, --0.184514601365454220, -0.184465459646202230, -0.184416317465785680, -0.184367174824329240, -0.184318031721954880, -0.184268888158785420, -0.184219744134943740, -0.184170599650552690, --0.184121454705735150, -0.184072309300614000, -0.184023163435311170, -0.183974017109951320, -0.183924870324656400, -0.183875723079549330, -0.183826575374752940, -0.183777427210390140, --0.183728278586583750, -0.183679129503456660, -0.183629979961130870, -0.183580829959731020, -0.183531679499379100, -0.183482528580197950, -0.183433377202310510, -0.183384225365839590, --0.183335073070908160, -0.183285920317638130, -0.183236767106154190, -0.183187613436578330, -0.183138459309033440, -0.183089304723642380, -0.183040149680528090, -0.182990994179813400, --0.182941838221621240, -0.182892681806073630, -0.182843524933295140, -0.182794367603407860, -0.182745209816534690, -0.182696051572798470, -0.182646892872322110, -0.182597733715228530, --0.182548574101640630, -0.182499414031680410, -0.182450253505472500, -0.182401092523138990, -0.182351931084802740, -0.182302769190586660, -0.182253606840613670, -0.182204444035006660, --0.182155280773887650, -0.182106117057381330, -0.182056952885609720, -0.182007788258695710, -0.181958623176762230, -0.181909457639932190, -0.181860291648328540, -0.181811125202074130, --0.181761958301291020, -0.181712790946103930, -0.181663623136634840, -0.181614454873006680, -0.181565286155342400, -0.181516116983764880, -0.181466947358397110, -0.181417777279361060, --0.181368606746781460, -0.181319435760780330, -0.181270264321480630, -0.181221092429005250, -0.181171920083477160, -0.181122747285019260, -0.181073574033754490, -0.181024400329804910, --0.180975226173295200, -0.180926051564347430, -0.180876876503084540, -0.180827700989629440, -0.180778525024105100, -0.180729348606634450, -0.180680171737340410, -0.180630994416345090, --0.180581816643773150, -0.180532638419746650, -0.180483459744388590, -0.180434280617821850, -0.180385101040169420, -0.180335921011554240, -0.180286740532098370, -0.180237559601926530, --0.180188378221160790, -0.180139196389924120, -0.180090014108339440, -0.180040831376529740, -0.179991648194617960, -0.179942464562727060, -0.179893280480979110, -0.179844095949498850, --0.179794910968408330, -0.179745725537830550, -0.179696539657888450, -0.179647353328704990, -0.179598166550403170, -0.179548979323105930, -0.179499791646935360, -0.179450603522016170, --0.179401414948470510, -0.179352225926421280, -0.179303036455991490, -0.179253846537304110, -0.179204656170482120, -0.179155465355647610, -0.179106274092925320, -0.179057082382437340, --0.179007890224306630, -0.178958697618656240, -0.178909504565609080, -0.178860311065288160, -0.178811117117816470, -0.178761922723316090, -0.178712727881911810, -0.178663532593725690, --0.178614336858880730, -0.178565140677499960, -0.178515944049706300, -0.178466746975622810, -0.178417549455371580, -0.178368351489077340, -0.178319153076862220, -0.178269954218849200, --0.178220754915161320, -0.178171555165921540, -0.178122354971252890, -0.178073154331278320, -0.178023953246120030, -0.177974751715902710, -0.177925549740748510, -0.177876347320780420, --0.177827144456121490, -0.177777941146894690, -0.177728737393223040, -0.177679533195229530, -0.177630328553036340, -0.177581123466768190, -0.177531917936547210, -0.177482711962496460, --0.177433505544738940, -0.177384298683397640, -0.177335091378595600, -0.177285883630454940, -0.177236675439100460, -0.177187466804654280, -0.177138257727239460, -0.177089048206978960, --0.177039838243995860, -0.176990627838413160, -0.176941416990353900, -0.176892205699940210, -0.176842993967296890, -0.176793781792546070, -0.176744569175810830, -0.176695356117214130, --0.176646142616879050, -0.176596928674928630, -0.176547714291485860, -0.176498499466672950, -0.176449284200614680, -0.176400068493433180, -0.176350852345251500, -0.176301635756192700, --0.176252418726379810, -0.176203201255935860, -0.176153983344983060, -0.176104764993646160, -0.176055546202047330, -0.176006326970309660, -0.175957107298556180, -0.175907887186909920, --0.175858666635493930, -0.175809445644431290, -0.175760224213844160, -0.175711002343857340, -0.175661780034593010, -0.175612557286174230, -0.175563334098724040, -0.175514110472365560, --0.175464886407221770, -0.175415661903414900, -0.175366436961069740, -0.175317211580308500, -0.175267985761254240, -0.175218759504029990, -0.175169532808758850, -0.175120305675563890, --0.175071078104568150, -0.175021850095893860, -0.174972621649665820, -0.174923392766006210, -0.174874163445038120, -0.174824933686884620, -0.174775703491668790, -0.174726472859513700, --0.174677241790542420, -0.174628010284877180, -0.174578778342642770, -0.174529545963961420, -0.174480313148956210, -0.174431079897750220, -0.174381846210466540, -0.174332612087228220, --0.174283377528157510, -0.174234142533379240, -0.174184907103015600, -0.174135671237189680, -0.174086434936024600, -0.174037198199643420, -0.173987961028169240, -0.173938723421725170, --0.173889485380433420, -0.173840246904418850, -0.173791007993803620, -0.173741768648710910, -0.173692528869263760, -0.173643288655585290, -0.173594048007798570, -0.173544806926026780, --0.173495565410392070, -0.173446323461019320, -0.173397081078030760, -0.173347838261549510, -0.173298595011698640, -0.173249351328601310, -0.173200107212380610, -0.173150862663158740, --0.173101617681060580, -0.173052372266208400, -0.173003126418725280, -0.172953880138734360, -0.172904633426358730, -0.172855386281721510, -0.172806138704945820, -0.172756890696153940, --0.172707642255470670, -0.172658393383018300, -0.172609144078919970, -0.172559894343298770, -0.172510644176277820, -0.172461393577980270, -0.172412142548528350, -0.172362891088046980, --0.172313639196658350, -0.172264386874485640, -0.172215134121651960, -0.172165880938280450, -0.172116627324494200, -0.172067373280416440, -0.172018118806169320, -0.171968863901877820, --0.171919608567664140, -0.171870352803651430, -0.171821096609962860, -0.171771839986721520, -0.171722582934050600, -0.171673325452073230, -0.171624067540911670, -0.171574809200690790, --0.171525550431532920, -0.171476291233561150, -0.171427031606898650, -0.171377771551668580, -0.171328511067994100, -0.171279250155997430, -0.171229988815803540, -0.171180727047534680, --0.171131464851313970, -0.171082202227264640, -0.171032939175509770, -0.170983675696172570, -0.170934411789376180, -0.170885147455242890, -0.170835882693897570, -0.170786617505462590, --0.170737351890061030, -0.170688085847816110, -0.170638819378850980, -0.170589552483288800, -0.170540285161252720, -0.170491017412865070, -0.170441749238250760, -0.170392480637532070, --0.170343211610832160, -0.170293942158274230, -0.170244672279981470, -0.170195401976076990, -0.170146131246683150, -0.170096860091924850, -0.170047588511924420, -0.169998316506805000, --0.169949044076689790, -0.169899771221701970, -0.169850497941964720, -0.169801224237601240, -0.169751950108733810, -0.169702675555487380, -0.169653400577984280, -0.169604125176347650, --0.169554849350700730, -0.169505573101166680, -0.169456296427868690, -0.169407019330929080, -0.169357741810472810, -0.169308463866622180, -0.169259185499500390, -0.169209906709230640, --0.169160627495936130, -0.169111347859740050, -0.169062067800765600, -0.169012787319135080, -0.168963506414973490, -0.168914225088403150, -0.168864943339547210, -0.168815661168528950, --0.168766378575471500, -0.168717095560498130, -0.168667812123731140, -0.168618528265295470, -0.168569243985313500, -0.168519959283908420, -0.168470674161203450, -0.168421388617321780, --0.168372102652386670, -0.168322816266521260, -0.168273529459847970, -0.168224242232491690, -0.168174954584574850, -0.168125666516220600, -0.168076378027552180, -0.168027089118692820, --0.167977799789765740, -0.167928510040894150, -0.167879219872200420, -0.167829929283809520, -0.167780638275843800, -0.167731346848426470, -0.167682055001680790, -0.167632762735729970, --0.167583470050697240, -0.167534176946705800, -0.167484883423878100, -0.167435589482339030, -0.167386295122210980, -0.167337000343617230, -0.167287705146680950, -0.167238409531525410, --0.167189113498273870, -0.167139817047048640, -0.167090520177974740, -0.167041222891174570, -0.166991925186771330, -0.166942627064888270, -0.166893328525648640, -0.166844029569175710, --0.166794730195592680, -0.166745430405021960, -0.166696130197588550, -0.166646829573414780, -0.166597528532623970, -0.166548227075339340, -0.166498925201684130, -0.166449622911781610, --0.166400320205754150, -0.166351017083726770, -0.166301713545821850, -0.166252409592162640, -0.166203105222872430, -0.166153800438074430, -0.166104495237891950, -0.166055189622448220, --0.166005883591865630, -0.165956577146269210, -0.165907270285781370, -0.165857963010525330, -0.165808655320624390, -0.165759347216201810, -0.165710038697380880, -0.165660729764283950, --0.165611420417036080, -0.165562110655759650, -0.165512800480577980, -0.165463489891614270, -0.165414178888991850, -0.165364867472833990, -0.165315555643263950, -0.165266243400404160, --0.165216930744379630, -0.165167617675312770, -0.165118304193326850, -0.165068990298545190, -0.165019675991091050, -0.164970361271087720, -0.164921046138658490, -0.164871730593925760, --0.164822414637014610, -0.164773098268047400, -0.164723781487147420, -0.164674464294438020, -0.164625146690042440, -0.164575828674084020, -0.164526510246685990, -0.164477191407970850, --0.164427872158063560, -0.164378552497086630, -0.164329232425163310, -0.164279911942416900, -0.164230591048970730, -0.164181269744948070, -0.164131948030471350, -0.164082625905665640, --0.164033303370653360, -0.163983980425557840, -0.163934657070502370, -0.163885333305610230, -0.163836009131004770, -0.163786684546809310, -0.163737359553146220, -0.163688034150140630, --0.163638708337914970, -0.163589382116592520, -0.163540055486296630, -0.163490728447150570, -0.163441400999277730, -0.163392073142800490, -0.163342744877843950, -0.163293416204530530, --0.163244087122983580, -0.163194757633326410, -0.163145427735682360, -0.163096097430174720, -0.163046766716926860, -0.162997435596061200, -0.162948104067702800, -0.162898772131974180, --0.162849439788998600, -0.162800107038899440, -0.162750773881800010, -0.162701440317823630, -0.162652106347092790, -0.162602771969732550, -0.162553437185865370, -0.162504101995614630, --0.162454766399103610, -0.162405430396455660, -0.162356093987794160, -0.162306757173242420, -0.162257419952922920, -0.162208082326960740, -0.162158744295478360, -0.162109405858599090, --0.162060067016446320, -0.162010727769143410, -0.161961388116813650, -0.161912048059580430, -0.161862707597566210, -0.161813366730896110, -0.161764025459692570, -0.161714683784078990, --0.161665341704178680, -0.161615999220115020, -0.161566656332011370, -0.161517313039991090, -0.161467969344176620, -0.161418625244693140, -0.161369280741663070, -0.161319935835209820, --0.161270590525456700, -0.161221244812527110, -0.161171898696544440, -0.161122552177631110, -0.161073205255912290, -0.161023857931510470, -0.160974510204549000, -0.160925162075151230, --0.160875813543440580, -0.160826464609540390, -0.160777115273574050, -0.160727765535664040, -0.160678415395935470, -0.160629064854510870, -0.160579713911513630, -0.160530362567067100, --0.160481010821294650, -0.160431658674319660, -0.160382306126264670, -0.160332953177254790, -0.160283599827412530, -0.160234246076861260, -0.160184891925724380, -0.160135537374125250, --0.160086182422187310, -0.160036827070033890, -0.159987471317787540, -0.159938115165573380, -0.159888758613513950, -0.159839401661732610, -0.159790044310352760, -0.159740686559497800, --0.159691328409291120, -0.159641969859855270, -0.159592610911315350, -0.159543251563793900, -0.159493891817414330, -0.159444531672300020, -0.159395171128574400, -0.159345810186360850, --0.159296448845782760, -0.159247087106962670, -0.159197724970025740, -0.159148362435094500, -0.159098999502292370, -0.159049636171742730, -0.159000272443568990, -0.158950908317894570, --0.158901543794842890, -0.158852178874536480, -0.158802813557100490, -0.158753447842657460, -0.158704081731330830, -0.158654715223243980, -0.158605348318520330, -0.158555981017283330, --0.158506613319656380, -0.158457245225761990, -0.158407876735725400, -0.158358507849669090, -0.158309138567716530, -0.158259768889991130, -0.158210398816616280, -0.158161028347715450, --0.158111657483411160, -0.158062286223828620, -0.158012914569090360, -0.157963542519319820, -0.157914170074640430, -0.157864797235175570, -0.157815424001048750, -0.157766050372383390, --0.157716676349302000, -0.157667301931929790, -0.157617927120389360, -0.157568551914804070, -0.157519176315297410, -0.157469800321992810, -0.157420423935013740, -0.157371047154482720, --0.157321669980524940, -0.157272292413262990, -0.157222914452820330, -0.157173536099320360, -0.157124157352886540, -0.157074778213642350, -0.157025398681711230, -0.156976018757215700, --0.156926638440281010, -0.156877257731029730, -0.156827876629585310, -0.156778495136071200, -0.156729113250610840, -0.156679730973327710, -0.156630348304344360, -0.156580965243786040, --0.156531581791775290, -0.156482197948435570, -0.156432813713890400, -0.156383429088263170, -0.156334044071677340, -0.156284658664256420, -0.156235272866122990, -0.156185886677402240, --0.156136500098216810, -0.156087113128690090, -0.156037725768945590, -0.155988338019106780, -0.155938949879297130, -0.155889561349640100, -0.155840172430258300, -0.155790783121276950, --0.155741393422818620, -0.155692003335006820, -0.155642612857965020, -0.155593221991816660, -0.155543830736685260, -0.155494439092693420, -0.155445047059966340, -0.155395654638626670, --0.155346261828797850, -0.155296868630603350, -0.155247475044166690, -0.155198081069611360, -0.155148686707060830, -0.155099291956637690, -0.155049896818467200, -0.155000501292671980, --0.154951105379375480, -0.154901709078701240, -0.154852312390772740, -0.154802915315713410, -0.154753517853646830, -0.154704120004695580, -0.154654721768984900, -0.154605323146637410, --0.154555924137776610, -0.154506524742526020, -0.154457124961009080, -0.154407724793349350, -0.154358324239669440, -0.154308923300094600, -0.154259521974747430, -0.154210120263751470, --0.154160718167230200, -0.154111315685307140, -0.154061912818105800, -0.154012509565749660, -0.153963105928361380, -0.153913701906066210, -0.153864297498986780, -0.153814892707246630, --0.153765487530969220, -0.153716081970278080, -0.153666676025296770, -0.153617269696147890, -0.153567862982956690, -0.153518455885845840, -0.153469048404938860, -0.153419640540359250, --0.153370232292230540, -0.153320823660676260, -0.153271414645819920, -0.153222005247784150, -0.153172595466694260, -0.153123185302672880, -0.153073774755843520, -0.153024363826329750, --0.152974952514255050, -0.152925540819742970, -0.152876128742917030, -0.152826716283899900, -0.152777303442816870, -0.152727890219790580, -0.152678476614944550, -0.152629062628402340, --0.152579648260287470, -0.152530233510723480, -0.152480818379833020, -0.152431402867741400, -0.152381986974571280, -0.152332570700446170, -0.152283154045489640, -0.152233737009825230, --0.152184319593576510, -0.152134901796866950, -0.152085483619819270, -0.152036065062558760, -0.151986646125208070, -0.151937226807890790, -0.151887807110730440, -0.151838387033850550, --0.151788966577374700, -0.151739545741426450, -0.151690124526128460, -0.151640702931606000, -0.151591280957981830, -0.151541858605379410, -0.151492435873922390, -0.151443012763734260, --0.151393589274938590, -0.151344165407658080, -0.151294741162018020, -0.151245316538141130, -0.151195891536150930, -0.151146466156171030, -0.151097040398324920, -0.151047614262736250, --0.150998187749528530, -0.150948760858824440, -0.150899333590749360, -0.150849905945425910, -0.150800477922977740, -0.150751049523528330, -0.150701620747201340, -0.150652191594120270, --0.150602762064407840, -0.150553332158189390, -0.150503901875587630, -0.150454471216726090, -0.150405040181728370, -0.150355608770718070, -0.150306176983818730, -0.150256744821153950, --0.150207312282846450, -0.150157879369021530, -0.150108446079801920, -0.150059012415311170, -0.150009578375672910, -0.149960143961010710, -0.149910709171448140, -0.149861274007108800, --0.149811838468115380, -0.149762402554593280, -0.149712966266665140, -0.149663529604454610, -0.149614092568085220, -0.149564655157680640, -0.149515217373364400, -0.149465779215259250, --0.149416340683490520, -0.149366901778180930, -0.149317462499454100, -0.149268022847433600, -0.149218582822243070, -0.149169142424006060, -0.149119701652846190, -0.149070260508886190, --0.149020818992251450, -0.148971377103064630, -0.148921934841449360, -0.148872492207529270, -0.148823049201427940, -0.148773605823269010, -0.148724162073176040, -0.148674717951271800, --0.148625273457681640, -0.148575828592528300, -0.148526383355935380, -0.148476937748026510, -0.148427491768925310, -0.148378045418755350, -0.148328598697639400, -0.148279151605702850, --0.148229704143068410, -0.148180256309859730, -0.148130808106200380, -0.148081359532214020, -0.148031910588024260, -0.147982461273754720, -0.147933011589528180, -0.147883561535469940, --0.147834111111702830, -0.147784660318350440, -0.147735209155536400, -0.147685757623384320, -0.147636305722017860, -0.147586853451559750, -0.147537400812135400, -0.147487947803867540, --0.147438494426879780, -0.147389040681295820, -0.147339586567239250, -0.147290132084833710, -0.147240677234202870, -0.147191222015469410, -0.147141766428758810, -0.147092310474193770, --0.147042854151897970, -0.146993397461995020, -0.146943940404608590, -0.146894482979862300, -0.146845025187879810, -0.146795567028783880, -0.146746108502699900, -0.146696649609750650, --0.146647190350059770, -0.146597730723750930, -0.146548270730947760, -0.146498810371773920, -0.146449349646352170, -0.146399888554807900, -0.146350427097263950, -0.146300965273843900, --0.146251503084671440, -0.146202040529870240, -0.146152577609563930, -0.146103114323876180, -0.146053650672929770, -0.146004186656850110, -0.145954722275759950, -0.145905257529783030, --0.145855792419042950, -0.145806326943663380, -0.145756861103768010, -0.145707394899480480, -0.145657928330923560, -0.145608461398222730, -0.145558994101500750, -0.145509526440881250, --0.145460058416487960, -0.145410590028444530, -0.145361121276874620, -0.145311652161901010, -0.145262182683649150, -0.145212712842241850, -0.145163242637802750, -0.145113772070455560, --0.145064301140323950, -0.145014829847531560, -0.144965358192202100, -0.144915886174458390, -0.144866413794425830, -0.144816941052227230, -0.144767467947986280, -0.144717994481826650, --0.144668520653872030, -0.144619046464246140, -0.144569571913071740, -0.144520097000474270, -0.144470621726576600, -0.144421146091502330, -0.144371670095375220, -0.144322193738318920, --0.144272717020457160, -0.144223239941913580, -0.144173762502811050, -0.144124284703274960, -0.144074806543428190, -0.144025328023394380, -0.143975849143297250, -0.143926369903260520, --0.143876890303407860, -0.143827410343862950, -0.143777930024748650, -0.143728449346190420, -0.143678968308311030, -0.143629486911234260, -0.143580005155083760, -0.143530523039983230, --0.143481040566056400, -0.143431557733426080, -0.143382074542217770, -0.143332590992554270, -0.143283107084559270, -0.143233622818356530, -0.143184138194069720, -0.143134653211822560, --0.143085167871738780, -0.143035682173941190, -0.142986196118555260, -0.142936709705703880, -0.142887222935510680, -0.142837735808099440, -0.142788248323593880, -0.142738760482117670, --0.142689272283794580, -0.142639783728747440, -0.142590294817101700, -0.142540805548980220, -0.142491315924506730, -0.142441825943804940, -0.142392335606998630, -0.142342844914211420, --0.142293353865566270, -0.142243862461188590, -0.142194370701201250, -0.142144878585728000, -0.142095386114892530, -0.142045893288818610, -0.141996400107629960, -0.141946906571450320, --0.141897412680402510, -0.141847918434612060, -0.141798423834201800, -0.141748928879295490, -0.141699433570016850, -0.141649937906489640, -0.141600441888837580, -0.141550945517183530, --0.141501448791653020, -0.141451951712368850, -0.141402454279454830, -0.141352956493034670, -0.141303458353232100, -0.141253959860170920, -0.141204461013974820, -0.141154961814766670, --0.141105462262672010, -0.141055962357813700, -0.141006462100315480, -0.140956961490301120, -0.140907460527894320, -0.140857959213218890, -0.140808457546398590, -0.140758955527556240, --0.140709453156817380, -0.140659950434304880, -0.140610447360142500, -0.140560943934454010, -0.140511440157363170, -0.140461936028993730, -0.140412431549468560, -0.140362926718913180, --0.140313421537450520, -0.140263916005204270, -0.140214410122298240, -0.140164903888856190, -0.140115397305001890, -0.140065890370859090, -0.140016383086550680, -0.139966875452202180, --0.139917367467936510, -0.139867859133877420, -0.139818350450148680, -0.139768841416874040, -0.139719332034177330, -0.139669822302182280, -0.139620312221011790, -0.139570801790791400, --0.139521291011644010, -0.139471779883693390, -0.139422268407063320, -0.139372756581877560, -0.139323244408259940, -0.139273731886333320, -0.139224219016223260, -0.139174705798052630, --0.139125192231945250, -0.139075678318024860, -0.139026164056415300, -0.138976649447240340, -0.138927134490623740, -0.138877619186688420, -0.138828103535559970, -0.138778587537361220, --0.138729071192216000, -0.138679554500248130, -0.138630037461581370, -0.138580520076339500, -0.138531002344645440, -0.138481484266624770, -0.138431965842400390, -0.138382447072096100, --0.138332927955835680, -0.138283408493742960, -0.138233888685941690, -0.138184368532555720, -0.138134848033707960, -0.138085327189523930, -0.138035806000126600, -0.137986284465639760, --0.137936762586187200, -0.137887240361892730, -0.137837717792880150, -0.137788194879272410, -0.137738671621195070, -0.137689148018771050, -0.137639624072124130, -0.137590099781378180, --0.137540575146656960, -0.137491050168084330, -0.137441524845784060, -0.137391999179879100, -0.137342473170495030, -0.137292946817754750, -0.137243420121782120, -0.137193893082700940, --0.137144365700635010, -0.137094837975708210, -0.137045309908044280, -0.136995781497766200, -0.136946252744999550, -0.136896723649867270, -0.136847194212493170, -0.136797664433001090, --0.136748134311514860, -0.136698603848158300, -0.136649073043055210, -0.136599541896328560, -0.136550010408103940, -0.136500478578504280, -0.136450946407653460, -0.136401413895675230, --0.136351881042693500, -0.136302347848832050, -0.136252814314213850, -0.136203280438964510, -0.136153746223206950, -0.136104211667065020, -0.136054676770662570, -0.136005141534123440, --0.135955605957571450, -0.135906070041130450, -0.135856533784923380, -0.135806997189075850, -0.135757460253710850, -0.135707922978952210, -0.135658385364923720, -0.135608847411749310, --0.135559309119552750, -0.135509770488457050, -0.135460231518587800, -0.135410692210067960, -0.135361152563021420, -0.135311612577571960, -0.135262072253843510, -0.135212531591959840, --0.135162990592044870, -0.135113449254221530, -0.135063907578615440, -0.135014365565349600, -0.134964823214547840, -0.134915280526334030, -0.134865737500832000, -0.134816194138165650, --0.134766650438457920, -0.134717106401834430, -0.134667562028418200, -0.134618017318333030, -0.134568472271702850, -0.134518926888651500, -0.134469381169302790, -0.134419835113780670, --0.134370288722208050, -0.134320741994710590, -0.134271194931411290, -0.134221647532433990, -0.134172099797902590, -0.134122551727940940, -0.134073003322672880, -0.134023454582222340, --0.133973905506712290, -0.133924356096268320, -0.133874806351013480, -0.133825256271071640, -0.133775705856566650, -0.133726155107622370, -0.133676604024362740, -0.133627052606911570, --0.133577500855391910, -0.133527948769929380, -0.133478396350646960, -0.133428843597668540, -0.133379290511118050, -0.133329737091119310, -0.133280183337796230, -0.133230629251271800, --0.133181074831671690, -0.133131520079118880, -0.133081964993737280, -0.133032409575650770, -0.132982853824983230, -0.132933297741858580, -0.132883741326400660, -0.132834184578732500, --0.132784627498979790, -0.132735070087265480, -0.132685512343713510, -0.132635954268447760, -0.132586395861592130, -0.132536837123270500, -0.132487278053605880, -0.132437718652723970, --0.132388158920747760, -0.132338598857801140, -0.132289038464008020, -0.132239477739492320, -0.132189916684377930, -0.132140355298788730, -0.132090793582847780, -0.132041231536680710, --0.131991669160410580, -0.131942106454161270, -0.131892543418056700, -0.131842980052220750, -0.131793416356777350, -0.131743852331849540, -0.131694287977563000, -0.131644723294040730, --0.131595158281406640, -0.131545592939784660, -0.131496027269298680, -0.131446461270072650, -0.131396894942230450, -0.131347328285895150, -0.131297761301192420, -0.131248193988245250, --0.131198626347177630, -0.131149058378113440, -0.131099490081176580, -0.131049921456491030, -0.131000352504180660, -0.130950783224368510, -0.130901213617180300, -0.130851643682739050, --0.130802073421168700, -0.130752502832593150, -0.130702931917136360, -0.130653360674922230, -0.130603789106074700, -0.130554217210716830, -0.130504644988974290, -0.130455072440970130, --0.130405499566828290, -0.130355926366672700, -0.130306352840627300, -0.130256778988816020, -0.130207204811361920, -0.130157630308390670, -0.130108055480025350, -0.130058480326389890, --0.130008904847608240, -0.129959329043804310, -0.129909752915102070, -0.129860176461625450, -0.129810599683497510, -0.129761022580843930, -0.129711445153787820, -0.129661867402453080, --0.129612289326963700, -0.129562710927443560, -0.129513132204016670, -0.129463553156806050, -0.129413973785937410, -0.129364394091533890, -0.129314814073719340, -0.129265233732617780, --0.129215653068353110, -0.129166072081049330, -0.129116490770830370, -0.129066909137819290, -0.129017327182141820, -0.128967744903921040, -0.128918162303280880, -0.128868579380345320, --0.128818996135238340, -0.128769412568083830, -0.128719828679004940, -0.128670244468127330, -0.128620659935574140, -0.128571075081469280, -0.128521489905936730, -0.128471904409100470, --0.128422318591084440, -0.128372732452012610, -0.128323145992008090, -0.128273559211196570, -0.128223972109701130, -0.128174384687645780, -0.128124796945154470, -0.128075208882351160, --0.128025620499359840, -0.127976031796304480, -0.127926442773308140, -0.127876853430496570, -0.127827263767992890, -0.127777673785921030, -0.127728083484404980, -0.127678492863568720, --0.127628901923536240, -0.127579310664431510, -0.127529719086377610, -0.127480127189500300, -0.127430534973922680, -0.127380942439768720, -0.127331349587162380, -0.127281756416227710, --0.127232162927088610, -0.127182569119868250, -0.127132974994692340, -0.127083380551683970, -0.127033785790967160, -0.126984190712665900, -0.126934595316904150, -0.126884999603805920, --0.126835403573495180, -0.126785807226095060, -0.126736210561731290, -0.126686613580527020, -0.126637016282606210, -0.126587418668092840, -0.126537820737110920, -0.126488222489784470, --0.126438623926236560, -0.126389025046593000, -0.126339425850976850, -0.126289826339512160, -0.126240226512322890, -0.126190626369533040, -0.126141025911266660, -0.126091425137647680, --0.126041824048799270, -0.125992222644847190, -0.125942620925914540, -0.125893018892125340, -0.125843416543603620, -0.125793813880473340, -0.125744210902858510, -0.125694607610882280, --0.125645004004670410, -0.125595400084346030, -0.125545795850033170, -0.125496191301855800, -0.125446586439937950, -0.125396981264403630, -0.125347375775376880, -0.125297769972980780, --0.125248163857341170, -0.125198557428581130, -0.125148950686824690, -0.125099343632195910, -0.125049736264818720, -0.125000128584817210, -0.124950520592315400, -0.124900912287436380, --0.124851303670305970, -0.124801694741047310, -0.124752085499784410, -0.124702475946641290, -0.124652866081741980, -0.124603255905210500, -0.124553645417170000, -0.124504034617746270, --0.124454423507062470, -0.124404812085242590, -0.124355200352410680, -0.124305588308690790, -0.124255975954206910, -0.124206363289083090, -0.124156750313442490, -0.124107137027410900, --0.124057523431111450, -0.124007909524668210, -0.123958295308205180, -0.123908680781846430, -0.123859065945715950, -0.123809450799937830, -0.123759835344635190, -0.123710219579933850, --0.123660603505956960, -0.123610987122828560, -0.123561370430672700, -0.123511753429613400, -0.123462136119774720, -0.123412518501279820, -0.123362900574254500, -0.123313282338821940, --0.123263663795106170, -0.123214044943231240, -0.123164425783321190, -0.123114806315500090, -0.123065186539891970, -0.123015566456620000, -0.122965946065809990, -0.122916325367585120, --0.122866704362069440, -0.122817083049386990, -0.122767461429661840, -0.122717839503018040, -0.122668217269578740, -0.122618594729469800, -0.122568971882814360, -0.122519348729736510, --0.122469725270360260, -0.122420101504809710, -0.122370477433208920, -0.122320853055681920, -0.122271228372351910, -0.122221603383344720, -0.122171978088783490, -0.122122352488792340, --0.122072726583495310, -0.122023100373016460, -0.121973473857479860, -0.121923847037009580, -0.121874219911728800, -0.121824592481763330, -0.121774964747236400, -0.121725336708272060, --0.121675708364994380, -0.121626079717527410, -0.121576450765995260, -0.121526821510521090, -0.121477191951230750, -0.121427562088247430, -0.121377931921695200, -0.121328301451698150, --0.121278670678380340, -0.121229039601865860, -0.121179408222278780, -0.121129776539742300, -0.121080144554382250, -0.121030512266321850, -0.120980879675685160, -0.120931246782596270, --0.120881613587179280, -0.120831980089558240, -0.120782346289857250, -0.120732712188199520, -0.120683077784710880, -0.120633443079514550, -0.120583808072734620, -0.120534172764495170, --0.120484537154920290, -0.120434901244134060, -0.120385265032259690, -0.120335628519423050, -0.120285991705747330, -0.120236354591356630, -0.120186717176375050, -0.120137079460926680, --0.120087441445135600, -0.120037803129125930, -0.119988164513020860, -0.119938525596946260, -0.119888886381025350, -0.119839246865382230, -0.119789607050140990, -0.119739966935425730, --0.119690326521360550, -0.119640685808068680, -0.119591044795675960, -0.119541403484305640, -0.119491761874081820, -0.119442119965128590, -0.119392477757570060, -0.119342835251530330, --0.119293192447133520, -0.119243549344502830, -0.119193905943764170, -0.119144262245040720, -0.119094618248456640, -0.119044973954136000, -0.118995329362202930, -0.118945684472781530, --0.118896039285995930, -0.118846393801969350, -0.118796748020827670, -0.118747101942694100, -0.118697455567692790, -0.118647808895947840, -0.118598161927583360, -0.118548514662723480, --0.118498867101491430, -0.118449219244013110, -0.118399571090411730, -0.118349922640811410, -0.118300273895336300, -0.118250624854110500, -0.118200975517258140, -0.118151325884903350, --0.118101675957169350, -0.118052025734182040, -0.118002375216064670, -0.117952724402941370, -0.117903073294936250, -0.117853421892173450, -0.117803770194777100, -0.117754118202871310, --0.117704465916579350, -0.117654813336027110, -0.117605160461337840, -0.117555507292635660, -0.117505853830044720, -0.117456200073689130, -0.117406546023693060, -0.117356891680179740, --0.117307237043275060, -0.117257582113102300, -0.117207926889785580, -0.117158271373449040, -0.117108615564216830, -0.117058959462213060, -0.117009303067561910, -0.116959646380386630, --0.116909989400813100, -0.116860332128964600, -0.116810674564965260, -0.116761016708939250, -0.116711358561010680, -0.116661700121303740, -0.116612041389941650, -0.116562382367050340, --0.116512723052753080, -0.116463063447174000, -0.116413403550437280, -0.116363743362667030, -0.116314082883987440, -0.116264422114522630, -0.116214761054395890, -0.116165099703733120, --0.116115438062657620, -0.116065776131293500, -0.116016113909764960, -0.115966451398196130, -0.115916788596711170, -0.115867125505434240, -0.115817462124488610, -0.115767798454000200, --0.115718134494092310, -0.115668470244889080, -0.115618805706514670, -0.115569140879093240, -0.115519475762748970, -0.115469810357605120, -0.115420144663787640, -0.115370478681419780, --0.115320812410625740, -0.115271145851529660, -0.115221479004255710, -0.115171811868928070, -0.115122144445670900, -0.115072476734607480, -0.115022808735863760, -0.114973140449563010, --0.114923471875829420, -0.114873803014787140, -0.114824133866560360, -0.114774464431273250, -0.114724794709049960, -0.114675124700013810, -0.114625454404290730, -0.114575783822004020, --0.114526112953277840, -0.114476441798236390, -0.114426770357003830, -0.114377098629704340, -0.114327426616461230, -0.114277754317400430, -0.114228081732645250, -0.114178408862319860, --0.114128735706548450, -0.114079062265455190, -0.114029388539164290, -0.113979714527799910, -0.113930040231485370, -0.113880365650346610, -0.113830690784506930, -0.113781015634090530, --0.113731340199221580, -0.113681664480024290, -0.113631988476622830, -0.113582312189140530, -0.113532635617703310, -0.113482958762434510, -0.113433281623458320, -0.113383604200898940, --0.113333926494880530, -0.113284248505527300, -0.113234570232963460, -0.113184891677312300, -0.113135212838699800, -0.113085533717249280, -0.113035854313084910, -0.112986174626330910, --0.112936494657111470, -0.112886814405550790, -0.112837133871773090, -0.112787453055901650, -0.112737771958062480, -0.112688090578378880, -0.112638408916975030, -0.112588726973975180, --0.112539044749503510, -0.112489362243684220, -0.112439679456640660, -0.112389996388498770, -0.112340313039381880, -0.112290629409414210, -0.112240945498719980, -0.112191261307423380, --0.112141576835648630, -0.112091892083519940, -0.112042207051160620, -0.111992521738696680, -0.111942836146251430, -0.111893150273949100, -0.111843464121913890, -0.111793777690270020, --0.111744090979141700, -0.111694403988653160, -0.111644716718927710, -0.111595029170091370, -0.111545341342267440, -0.111495653235580180, -0.111445964850153780, -0.111396276186112450, --0.111346587243580440, -0.111296898022681080, -0.111247208523540360, -0.111197518746281630, -0.111147828691029090, -0.111098138357906970, -0.111048447747039520, -0.110998756858550940, --0.110949065692565480, -0.110899374249206460, -0.110849682528599890, -0.110799990530869110, -0.110750298256138370, -0.110700605704531870, -0.110650912876173860, -0.110601219771188570, --0.110551526389699340, -0.110501832731832190, -0.110452138797710440, -0.110402444587458360, -0.110352750101200160, -0.110303055339060080, -0.110253360301162380, -0.110203664987631260, --0.110153969398590110, -0.110104273534164910, -0.110054577394479030, -0.110004880979656700, -0.109955184289822180, -0.109905487325099690, -0.109855790085613480, -0.109806092571487800, --0.109756394782846000, -0.109706696719814100, -0.109656998382515470, -0.109607299771074320, -0.109557600885614950, -0.109507901726261560, -0.109458202293138410, -0.109408502586368870, --0.109358802606078970, -0.109309102352392070, -0.109259401825432400, -0.109209701025324220, -0.109159999952191790, -0.109110298606159370, -0.109060596987351200, -0.109010895095890650, --0.108961192931903760, -0.108911490495513870, -0.108861787786845260, -0.108812084806022180, -0.108762381553168890, -0.108712678028409640, -0.108662974231868710, -0.108613270163669450, --0.108563565823937900, -0.108513861212797440, -0.108464156330372320, -0.108414451176786820, -0.108364745752165180, -0.108315040056631670, -0.108265334090309700, -0.108215627853325250, --0.108165921345801750, -0.108116214567863440, -0.108066507519634590, -0.108016800201239480, -0.107967092612802370, -0.107917384754447520, -0.107867676626298330, -0.107817968228480830, --0.107768259561118410, -0.107718550624335340, -0.107668841418255890, -0.107619131943004350, -0.107569422198704970, -0.107519712185481150, -0.107470001903458940, -0.107420291352761710, --0.107370580533513770, -0.107320869445839360, -0.107271158089862800, -0.107221446465708330, -0.107171734573500250, -0.107122022413361940, -0.107072309985419470, -0.107022597289796210, --0.106972884326616470, -0.106923171096004520, -0.106873457598084640, -0.106823743832981110, -0.106774029800818220, -0.106724315501719390, -0.106674600935810630, -0.106624886103215380, --0.106575171004057920, -0.106525455638462520, -0.106475740006553490, -0.106426024108455100, -0.106376307944290770, -0.106326591514186570, -0.106276874818265880, -0.106227157856653000, --0.106177440629472220, -0.106127723136847850, -0.106078005378904160, -0.106028287355765470, -0.105978569067555180, -0.105928850514399330, -0.105879131696421370, -0.105829412613745580, --0.105779693266496260, -0.105729973654797690, -0.105680253778774210, -0.105630533638550090, -0.105580813234248740, -0.105531092565996240, -0.105481371633916020, -0.105431650438132370, --0.105381928978769590, -0.105332207255951990, -0.105282485269803870, -0.105232763020448660, -0.105183040508012420, -0.105133317732618580, -0.105083594694391440, -0.105033871393455320, --0.104984147829934520, -0.104934424003953350, -0.104884699915636120, -0.104834975565106250, -0.104785250952489830, -0.104735526077910280, -0.104685800941491940, -0.104636075543359060, --0.104586349883636020, -0.104536623962447090, -0.104486897779915710, -0.104437171336167990, -0.104387444631327330, -0.104337717665518050, -0.104287990438864500, -0.104238262951490950, --0.104188535203521750, -0.104138807195081210, -0.104089078926292780, -0.104039350397282530, -0.103989621608173900, -0.103939892559091220, -0.103890163250158800, -0.103840433681500990, --0.103790703853242090, -0.103740973765506410, -0.103691243418417430, -0.103641512812101220, -0.103591781946681240, -0.103542050822281790, -0.103492319439027220, -0.103442587797041850, --0.103392855896450020, -0.103343123737375160, -0.103293391319943360, -0.103243658644278090, -0.103193925710503680, -0.103144192518744460, -0.103094459069124750, -0.103044725361768900, --0.102994991396801220, -0.102945257174345190, -0.102895522694526900, -0.102845787957469810, -0.102796052963298230, -0.102746317712136530, -0.102696582204109040, -0.102646846439340090, --0.102597110417953150, -0.102547374140074300, -0.102497637605827030, -0.102447900815335650, -0.102398163768724530, -0.102348426466118000, -0.102298688907640410, -0.102248951093416090, --0.102199213023568510, -0.102149474698223770, -0.102099736117505350, -0.102049997281537600, -0.102000258190444850, -0.101950518844351450, -0.101900779243381760, -0.101851039387660120, --0.101801299277309990, -0.101751558912457500, -0.101701818293226120, -0.101652077419740190, -0.101602336292124060, -0.101552594910502100, -0.101502853274998650, -0.101453111385737180, --0.101403369242843820, -0.101353626846442030, -0.101303884196656170, -0.101254141293610610, -0.101204398137429690, -0.101154654728237790, -0.101104911066159240, -0.101055167151317530, --0.101005422983838790, -0.100955678563846480, -0.100905933891464970, -0.100856188966818650, -0.100806443790031840, -0.100756698361228930, -0.100706952680533380, -0.100657206748071340, --0.100607460563966290, -0.100557714128342570, -0.100507967441324580, -0.100458220503036650, -0.100408473313603200, -0.100358725873148550, -0.100308978181796200, -0.100259230239672290, --0.100209482046900310, -0.100159733603604610, -0.100109984909909590, -0.100060235965939600, -0.100010486771819030, -0.099960737327672244, -0.099910987633622717, -0.099861237689796614, --0.099811487496317422, -0.099761737053309499, -0.099711986360897231, -0.099662235419205006, -0.099612484228357195, -0.099562732788477284, -0.099512981099691436, -0.099463229162123121, --0.099413476975896739, -0.099363724541136664, -0.099313971857967281, -0.099264218926512965, -0.099214465746898101, -0.099164712319246187, -0.099114958643683387, -0.099065204720333172, --0.099015450549319955, -0.098965696130768124, -0.098915941464802037, -0.098866186551546095, -0.098816431391124698, -0.098766675983661331, -0.098716920329282157, -0.098667164428110687, --0.098617408280271310, -0.098567651885888397, -0.098517895245086362, -0.098468138357989593, -0.098418381224721602, -0.098368623845408523, -0.098318866220173898, -0.098269108349142098, --0.098219350232437538, -0.098169591870184592, -0.098119833262507672, -0.098070074409531166, -0.098020315311378586, -0.097970555968176110, -0.097920796380047248, -0.097871036547116388, --0.097821276469507931, -0.097771516147346291, -0.097721755580755867, -0.097671994769860160, -0.097622233714785345, -0.097572472415654962, -0.097522710872593385, -0.097472949085725027, --0.097423187055174304, -0.097373424781065615, -0.097323662263523361, -0.097273899502671082, -0.097224136498634914, -0.097174373251538423, -0.097124609761505984, -0.097074846028662037, --0.097025082053130970, -0.096975317835037184, -0.096925553374505119, -0.096875788671658289, -0.096826023726622856, -0.096776258539522375, -0.096726493110481246, -0.096676727439623883, --0.096626961527074701, -0.096577195372958113, -0.096527428977397647, -0.096477662340519507, -0.096427895462447205, -0.096378128343305169, -0.096328360983217801, -0.096278593382309541, --0.096228825540704790, -0.096179057458527978, -0.096129289135902643, -0.096079520572954963, -0.096029751769808491, -0.095979982726587629, -0.095930213443416817, -0.095880443920420458, --0.095830674157723006, -0.095780904155448862, -0.095731133913721581, -0.095681363432667338, -0.095631592712409688, -0.095581821753073060, -0.095532050554781880, -0.095482279117660565, --0.095432507441833556, -0.095382735527424392, -0.095332963374559279, -0.095283190983361757, -0.095233418353956253, -0.095183645486467211, -0.095133872381019058, -0.095084099037736208, --0.095034325456743118, -0.094984551638163342, -0.094934777582123056, -0.094885003288745828, -0.094835228758156101, -0.094785453990478288, -0.094735678985836846, -0.094685903744356217, --0.094636128266159941, -0.094586352551374223, -0.094536576600122615, -0.094486800412529576, -0.094437023988719532, -0.094387247328816939, -0.094337470432946213, -0.094287693301231823, --0.094237915933797309, -0.094188138330768889, -0.094138360492270132, -0.094088582418425465, -0.094038804109359345, -0.093989025565196213, -0.093939246786060512, -0.093889467772076698, --0.093839688523368339, -0.093789909040061625, -0.093740129322280152, -0.093690349370148363, -0.093640569183790684, -0.093590788763331587, -0.093541008108895526, -0.093491227220606057, --0.093441446098589398, -0.093391664742969130, -0.093341883153869695, -0.093292101331415550, -0.093242319275731164, -0.093192536986940966, -0.093142754465169439, -0.093092971710540137, --0.093043188723179279, -0.092993405503210461, -0.092943622050758123, -0.092893838365946738, -0.092844054448900759, -0.092794270299744630, -0.092744485918602834, -0.092694701305598939, --0.092644916460859178, -0.092595131384507118, -0.092545346076667229, -0.092495560537463981, -0.092445774767021829, -0.092395988765465245, -0.092346202532917795, -0.092296416069505727, --0.092246629375352621, -0.092196842450582947, -0.092147055295321162, -0.092097267909691735, -0.092047480293819137, -0.091997692447827850, -0.091947904371841443, -0.091898116065986149, --0.091848327530385576, -0.091798538765164181, -0.091748749770446433, -0.091698960546356817, -0.091649171093019802, -0.091599381410558969, -0.091549591499100580, -0.091499801358768201, --0.091450010989686317, -0.091400220391979412, -0.091350429565771940, -0.091300638511188414, -0.091250847228353291, -0.091201055717390150, -0.091151263978425268, -0.091101472011582224, --0.091051679816985490, -0.091001887394759562, -0.090952094745028925, -0.090902301867918034, -0.090852508763551401, -0.090802715432052608, -0.090752921873547915, -0.090703128088160917, --0.090653334076016098, -0.090603539837237942, -0.090553745371950933, -0.090503950680279555, -0.090454155762347430, -0.090404360618280791, -0.090354565248203261, -0.090304769652239311, --0.090254973830513438, -0.090205177783150126, -0.090155381510273871, -0.090105585012009173, -0.090055788288479613, -0.090005991339811478, -0.089956194166128350, -0.089906396767554755, --0.089856599144215163, -0.089806801296234057, -0.089757003223735962, -0.089707204926845363, -0.089657406405685855, -0.089607607660383726, -0.089557808691062571, -0.089508009497846902, --0.089458210080861203, -0.089408410440229985, -0.089358610576077732, -0.089308810488528081, -0.089259010177707279, -0.089209209643738949, -0.089159408886747601, -0.089109607906857721, --0.089059806704193833, -0.089010005278880422, -0.088960203631041998, -0.088910401760802185, -0.088860599668287257, -0.088810797353620824, -0.088760994816927397, -0.088711192058331473, --0.088661389077957578, -0.088611585875930210, -0.088561782452372992, -0.088511978807412212, -0.088462174941171479, -0.088412370853775304, -0.088362566545348201, -0.088312762016014679, --0.088262957265899264, -0.088213152295126454, -0.088163347103819872, -0.088113541692105807, -0.088063736060107894, -0.088013930207950633, -0.087964124135758548, -0.087914317843656165, --0.087864511331767967, -0.087814704600218507, -0.087764897649131396, -0.087715090478632921, -0.087665283088846732, -0.087615475479897315, -0.087565667651909221, -0.087515859605006963, --0.087466051339315051, -0.087416242854957124, -0.087366434152059483, -0.087316625230745751, -0.087266816091140453, -0.087217006733368116, -0.087167197157553264, -0.087117387363820423, --0.087067577352294104, -0.087017767123097972, -0.086967956676358288, -0.086918146012198730, -0.086868335130743796, -0.086818524032118025, -0.086768712716445942, -0.086718901183852087, --0.086669089434460972, -0.086619277468396247, -0.086569465285784214, -0.086519652886748524, -0.086469840271413703, -0.086420027439904276, -0.086370214392344782, -0.086320401128859747, --0.086270587649572822, -0.086220773954610322, -0.086170960044095885, -0.086121145918154049, -0.086071331576909341, -0.086021517020486313, -0.085971702249009491, -0.085921887262603414, --0.085872072061391733, -0.085822256645500750, -0.085772441015054129, -0.085722625170176411, -0.085672809110992121, -0.085622992837625811, -0.085573176350202021, -0.085523359648844402, --0.085473542733679284, -0.085423725604830289, -0.085373908262421999, -0.085324090706578926, -0.085274272937425621, -0.085224454955086640, -0.085174636759686520, -0.085124818351348927, --0.085074999730200176, -0.085025180896363919, -0.084975361849964723, -0.084925542591127098, -0.084875723119975641, -0.084825903436634861, -0.084776083541229327, -0.084726263433882704, --0.084676443114721306, -0.084626622583868785, -0.084576801841449722, -0.084526980887588657, -0.084477159722410128, -0.084427338346038716, -0.084377516758598059, -0.084327694960214500, --0.084277872951011704, -0.084228050731114223, -0.084178228300646626, -0.084128405659733438, -0.084078582808499253, -0.084028759747068610, -0.083978936475565175, -0.083929112994115290, --0.083879289302842622, -0.083829465401871722, -0.083779641291327173, -0.083729816971333512, -0.083679992442015308, -0.083630167703497127, -0.083580342755902634, -0.083530517599358173, --0.083480692233987422, -0.083430866659914935, -0.083381040877265292, -0.083331214886163033, -0.083281388686732738, -0.083231562279098101, -0.083181735663385423, -0.083131908839718424, --0.083082081808221644, -0.083032254569019665, -0.082982427122237037, -0.082932599467998358, -0.082882771606428166, -0.082832943537650167, -0.082783115261790691, -0.082733286778973431, --0.082683458089322953, -0.082633629192963826, -0.082583800090020629, -0.082533970780617943, -0.082484141264879435, -0.082434311542931446, -0.082384481614897698, -0.082334651480902743, --0.082284821141071149, -0.082234990595527510, -0.082185159844396394, -0.082135328887802367, -0.082085497725869150, -0.082035666358723058, -0.081985834786487813, -0.081936003009287980, --0.081886171027248142, -0.081836338840492864, -0.081786506449146743, -0.081736673853334357, -0.081686841053179401, -0.081637008048808232, -0.081587174840344542, -0.081537341427912913, --0.081487507811637938, -0.081437673991644186, -0.081387839968056250, -0.081338005740997824, -0.081288171310595264, -0.081238336676972292, -0.081188501840253474, -0.081138666800563392, --0.081088831558026653, -0.081038996112767839, -0.080989160464911517, -0.080939324614581420, -0.080889488561903894, -0.080839652307002657, -0.080789815850002278, -0.080739979191027364, --0.080690142330202497, -0.080640305267652285, -0.080590468003501295, -0.080540630537873262, -0.080490792870894529, -0.080440955002688816, -0.080391116933380719, -0.080341278663094831, --0.080291440191955749, -0.080241601520088052, -0.080191762647615475, -0.080141923574664375, -0.080092084301358474, -0.080042244827822351, -0.079992405154180629, -0.079942565280557876, --0.079892725207078727, -0.079842884933867764, -0.079793044461048693, -0.079743203788747899, -0.079693362917089103, -0.079643521846196885, -0.079593680576195869, -0.079543839107210662, --0.079493997439365846, -0.079444155572785155, -0.079394313507594960, -0.079344471243918982, -0.079294628781881829, -0.079244786121608096, -0.079194943263222406, -0.079145100206849353, --0.079095256952613546, -0.079045413500638720, -0.078995569851051245, -0.078945726003974842, -0.078895881959534120, -0.078846037717853701, -0.078796193279058180, -0.078746348643272179, --0.078696503810620308, -0.078646658781226286, -0.078596813555216513, -0.078546968132714695, -0.078497122513845469, -0.078447276698733429, -0.078397430687503197, -0.078347584480279384, --0.078297738077185736, -0.078247891478348625, -0.078198044683891785, -0.078148197693939825, -0.078098350508617381, -0.078048503128049049, -0.077998655552359478, -0.077948807781673249, --0.077898959816114124, -0.077849111655808489, -0.077799263300880064, -0.077749414751453486, -0.077699566007653376, -0.077649717069604343, -0.077599867937431025, -0.077550018611258043, --0.077500169091209117, -0.077450319377410648, -0.077400469469986397, -0.077350619369060958, -0.077300769074758982, -0.077250918587205078, -0.077201067906523882, -0.077151217032839128, --0.077101365966277216, -0.077051514706961879, -0.077001663255017769, -0.076951811610569493, -0.076901959773741702, -0.076852107744658990, -0.076802255523446022, -0.076752403110226533, --0.076702550505126921, -0.076652697708270920, -0.076602844719783181, -0.076552991539788340, -0.076503138168411006, -0.076453284605775843, -0.076403430852006571, -0.076353576907229603, --0.076303722771568702, -0.076253868445148490, -0.076204013928093617, -0.076154159220528692, -0.076104304322578378, -0.076054449234367313, -0.076004593956019231, -0.075954738487660545, --0.075904882829415016, -0.075855026981407281, -0.075805170943761976, -0.075755314716603739, -0.075705458300057232, -0.075655601694247065, -0.075605744899297014, -0.075555887915333478, --0.075506030742480232, -0.075456173380861899, -0.075406315830603143, -0.075356458091828601, -0.075306600164662910, -0.075256742049229816, -0.075206883745655775, -0.075157025254064508, --0.075107166574580692, -0.075057307707328949, -0.075007448652433945, -0.074957589410020314, -0.074907729980212709, -0.074857870363134904, -0.074808010558913299, -0.074758150567671669, --0.074708290389534665, -0.074658430024626923, -0.074608569473073122, -0.074558708734997883, -0.074508847810524997, -0.074458986699780877, -0.074409125402889284, -0.074359263919974883, --0.074309402251162324, -0.074259540396576257, -0.074209678356341346, -0.074159816130582229, -0.074109953719422680, -0.074060091122989141, -0.074010228341405374, -0.073960365374796042, --0.073910502223285796, -0.073860638886999286, -0.073810775366061177, -0.073760911660596132, -0.073711047770727928, -0.073661183696582991, -0.073611319438285083, -0.073561454995958897, --0.073511590369729055, -0.073461725559720248, -0.073411860566057113, -0.073361995388863455, -0.073312130028265685, -0.073262264484387593, -0.073212398757353844, -0.073162532847289102, --0.073112666754318018, -0.073062800478565268, -0.073012934020155518, -0.072963067379212557, -0.072913200555862798, -0.072863333550230044, -0.072813466362438961, -0.072763598992614212, --0.072713731440880461, -0.072663863707362372, -0.072613995792183750, -0.072564127695471034, -0.072514259417347987, -0.072464390957939287, -0.072414522317369612, -0.072364653495763639, --0.072314784493246020, -0.072264915309941447, -0.072215045945973694, -0.072165176401469230, -0.072115306676551805, -0.072065436771346122, -0.072015566685976848, -0.071965696420568659, --0.071915825975246220, -0.071865955350134222, -0.071816084545356443, -0.071766213561039349, -0.071716342397306718, -0.071666471054283226, -0.071616599532093567, -0.071566727830862403, --0.071516855950714414, -0.071466983891773403, -0.071417111654165824, -0.071367239238015454, -0.071317366643446997, -0.071267493870585119, -0.071217620919554511, -0.071167747790479852, --0.071117874483485818, -0.071068000998696201, -0.071018127336237483, -0.070968253496233438, -0.070918379478808774, -0.070868505284088154, -0.070818630912196256, -0.070768756363257801, --0.070718881637397438, -0.070669006734738998, -0.070619131655408923, -0.070569256399531016, -0.070519380967229969, -0.070469505358630474, -0.070419629573857223, -0.070369753613034880, --0.070319877476287276, -0.070270001163740867, -0.070220124675519455, -0.070170248011747718, -0.070120371172550378, -0.070070494158052096, -0.070020616968377594, -0.069970739603651536, --0.069920862063997752, -0.069870984349542697, -0.069821106460410176, -0.069771228396724894, -0.069721350158611542, -0.069671471746194813, -0.069621593159599399, -0.069571714398949117, --0.069521835464370449, -0.069471956355987172, -0.069422077073924018, -0.069372197618305667, -0.069322317989256824, -0.069272438186902180, -0.069222558211366456, -0.069172678062773441, --0.069122797741249617, -0.069072917246918789, -0.069023036579905675, -0.068973155740334968, -0.068923274728331374, -0.068873393544019598, -0.068823512187524333, -0.068773630658969409, --0.068723748958481282, -0.068673867086183796, -0.068623985042201630, -0.068574102826659503, -0.068524220439682121, -0.068474337881394190, -0.068424455151919528, -0.068374572251384616, --0.068324689179913273, -0.068274805937630204, -0.068224922524660128, -0.068175038941127739, -0.068125155187157754, -0.068075271262874881, -0.068025387168402937, -0.067975502903868418, --0.067925618469395141, -0.067875733865107812, -0.067825849091131152, -0.067775964147589879, -0.067726079034608686, -0.067676193752312291, -0.067626308300824542, -0.067576422680271891, --0.067526536890778199, -0.067476650932468157, -0.067426764805466485, -0.067376878509897903, -0.067326992045887130, -0.067277105413557983, -0.067227218613036960, -0.067177331644447891, --0.067127444507915496, -0.067077557203564481, -0.067027669731519579, -0.066977782091905511, -0.066927894284846981, -0.066878006310467822, -0.066828118168894543, -0.066778229860250962, --0.066728341384661813, -0.066678452742251801, -0.066628563933145674, -0.066578674957468123, -0.066528785815342995, -0.066478896506896798, -0.066429007032253365, -0.066379117391537401, --0.066329227584873654, -0.066279337612386829, -0.066229447474201661, -0.066179557170442882, -0.066129666701234324, -0.066079776066702484, -0.066029885266971192, -0.065979994302165196, --0.065930103172409216, -0.065880211877827985, -0.065830320418546209, -0.065780428794688636, -0.065730537006379111, -0.065680645053744130, -0.065630752936907524, -0.065580860655994055, --0.065530968211128415, -0.065481075602435365, -0.065431182830039625, -0.065381289894065039, -0.065331396794638119, -0.065281503531882709, -0.065231610105923529, -0.065181716516885341, --0.065131822764892849, -0.065081928850070803, -0.065032034772543934, -0.064982140532436089, -0.064932246129873777, -0.064882351564980859, -0.064832456837882066, -0.064782561948702119, --0.064732666897565766, -0.064682771684597754, -0.064632876309922815, -0.064582980773664783, -0.064533085075950208, -0.064483189216902909, -0.064433293196647631, -0.064383397015309124, --0.064333500673012134, -0.064283604169881381, -0.064233707506040738, -0.064183810681616701, -0.064133913696733144, -0.064084016551514814, -0.064034119246086429, -0.063984221780572753, --0.063934324155098518, -0.063884426369788472, -0.063834528424766473, -0.063784630320159047, -0.063734732056090038, -0.063684833632684207, -0.063634935050066274, -0.063585036308361029, --0.063535137407693176, -0.063485238348186590, -0.063435339129967808, -0.063385439753160674, -0.063335540217889938, -0.063285640524280345, -0.063235740672456658, -0.063185840662543624, --0.063135940494665976, -0.063086040168947602, -0.063036139685515011, -0.062986239044492076, -0.062936338246003531, -0.062886437290174152, -0.062836536177128671, -0.062786634906991851, --0.062736733479888451, -0.062686831895942319, -0.062636930155280005, -0.062587028258025354, -0.062537126204303142, -0.062487223994238117, -0.062437321627955025, -0.062387419105578629, --0.062337516427232800, -0.062287613593044071, -0.062237710603136306, -0.062187807457634262, -0.062137904156662697, -0.062088000700346375, -0.062038097088810050, -0.061988193322178489, --0.061938289400575552, -0.061888385324127777, -0.061838481092959037, -0.061788576707194100, -0.061738672166957720, -0.061688767472374659, -0.061638862623569678, -0.061588957620667538, --0.061539052463792127, -0.061489147153069960, -0.061439241688624933, -0.061389336070581800, -0.061339430299065328, -0.061289524374200273, -0.061239618296111416, -0.061189712064922623, --0.061139805680760433, -0.061089899143748738, -0.061039992454012287, -0.060990085611675855, -0.060940178616864217, -0.060890271469702120, -0.060840364170314354, -0.060790456718824791, --0.060740549115359969, -0.060690641360043776, -0.060640733453000979, -0.060590825394356347, -0.060540917184234655, -0.060491008822760664, -0.060441100310058268, -0.060391191646254012, --0.060341282831471776, -0.060291373865836329, -0.060241464749472444, -0.060191555482504905, -0.060141646065058472, -0.060091736497257929, -0.060041826779227155, -0.059991916911092701, --0.059942006892978454, -0.059892096725009190, -0.059842186407309685, -0.059792275940004712, -0.059742365323219054, -0.059692454557077473, -0.059642543641703877, -0.059592632577224809, --0.059542721363764158, -0.059492810001446704, -0.059442898490397224, -0.059392986830740499, -0.059343075022601305, -0.059293163066103535, -0.059243250961373749, -0.059193338708535832, --0.059143426307714575, -0.059093513759034745, -0.059043601062621132, -0.058993688218598517, -0.058943775227091683, -0.058893862088224523, -0.058843948802123590, -0.058794035368912791, --0.058744121788716901, -0.058694208061660709, -0.058644294187868998, -0.058594380167466549, -0.058544466000578145, -0.058494551687327694, -0.058444637227841753, -0.058394722622244218, --0.058344807870659869, -0.058294892973213511, -0.058244977930029911, -0.058195062741233872, -0.058145147406949288, -0.058095231927302725, -0.058045316302418083, -0.057995400532420145, --0.057945484617433707, -0.057895568557583557, -0.057845652352994485, -0.057795736003791287, -0.057745819510097857, -0.057695902872040773, -0.057645986089743924, -0.057596069163332111, --0.057546152092930125, -0.057496234878662761, -0.057446317520654808, -0.057396400019030180, -0.057346482373915431, -0.057296564585434480, -0.057246646653712117, -0.057196728578873139, --0.057146810361042334, -0.057096892000344505, -0.057046973496904449, -0.056997054850846073, -0.056947136062295942, -0.056897217131377978, -0.056847298058216963, -0.056797378842937708, --0.056747459485665008, -0.056697539986523653, -0.056647620345638451, -0.056597700563133312, -0.056547780639134806, -0.056497860573766857, -0.056447940367154247, -0.056398020019421791, --0.056348099530694279, -0.056298178901096528, -0.056248258130752432, -0.056198337219788584, -0.056148416168328892, -0.056098494976498159, -0.056048573644421187, -0.055998652172222788, --0.055948730560027755, -0.055898808807960894, -0.055848886916146125, -0.055798964884710020, -0.055749042713776509, -0.055699120403470394, -0.055649197953916471, -0.055599275365239557, --0.055549352637564456, -0.055499429771015969, -0.055449506765718019, -0.055399583621797192, -0.055349660339377410, -0.055299736918583475, -0.055249813359540198, -0.055199889662372388, --0.055149965827204848, -0.055100041854161515, -0.055050117743368959, -0.055000193494951111, -0.054950269109032779, -0.054900344585738767, -0.054850419925193905, -0.054800495127522983, --0.054750570192850831, -0.054700645121301364, -0.054650719913001168, -0.054600794568074179, -0.054550869086645200, -0.054500943468839047, -0.054451017714780538, -0.054401091824594482, --0.054351165798404814, -0.054301239636338115, -0.054251313338518313, -0.054201386905070238, -0.054151460336118687, -0.054101533631788490, -0.054051606792204457, -0.054001679817491405, --0.053951752707773269, -0.053901825463176636, -0.053851898083825442, -0.053801970569844502, -0.053752042921358635, -0.053702115138492663, -0.053652187221371397, -0.053602259170119668, --0.053552330984861410, -0.053502402665723203, -0.053452474212828990, -0.053402545626303595, -0.053352616906271834, -0.053302688052858531, -0.053252759066188503, -0.053202829946385699, --0.053152900693576699, -0.053102971307885452, -0.053053041789436775, -0.053003112138355499, -0.052953182354766440, -0.052903252438794422, -0.052853322390564270, -0.052803392210199931, --0.052753461897828001, -0.052703531453572407, -0.052653600877557993, -0.052603670169909571, -0.052553739330751977, -0.052503808360210034, -0.052453877258408568, -0.052403946025471528, --0.052354014661525505, -0.052304083166694444, -0.052254151541103182, -0.052204219784876535, -0.052154287898139341, -0.052104355881016425, -0.052054423733631734, -0.052004491456111870, --0.051954559048580776, -0.051904626511163288, -0.051854693843984230, -0.051804761047168441, -0.051754828120840750, -0.051704895065125982, -0.051654961880148093, -0.051605028566033689, --0.051555095122906715, -0.051505161550891999, -0.051455227850114381, -0.051405294020698690, -0.051355360062769764, -0.051305425976451553, -0.051255491761870664, -0.051205557419151046, --0.051155622948417537, -0.051105688349794967, -0.051055753623408182, -0.051005818769382004, -0.050955883787841286, -0.050905948678909969, -0.050856013442714662, -0.050806078079379327, --0.050756142589028802, -0.050706206971787911, -0.050656271227781512, -0.050606335357134428, -0.050556399359971506, -0.050506463236416700, -0.050456526986596618, -0.050406590610635224, --0.050356654108657355, -0.050306717480787848, -0.050256780727151548, -0.050206843847873300, -0.050156906843077047, -0.050106969712889422, -0.050057032457434369, -0.050007095076836733, --0.049957157571221364, -0.049907219940713100, -0.049857282185436780, -0.049807344305517261, -0.049757406301078493, -0.049707468172247096, -0.049657529919147028, -0.049607591541903133, --0.049557653040640262, -0.049507714415483260, -0.049457775666556972, -0.049407836793986241, -0.049357897797895033, -0.049307958678409966, -0.049258019435655005, -0.049208080069754995, --0.049158140580834786, -0.049108200969019224, -0.049058261234433159, -0.049008321377200556, -0.048958381397448035, -0.048908441295299560, -0.048858501070879981, -0.048808560724314151, --0.048758620255726921, -0.048708679665243136, -0.048658738952987654, -0.048608798119084438, -0.048558857163660110, -0.048508916086838647, -0.048458974888744892, -0.048409033569503691, --0.048359092129239917, -0.048309150568078406, -0.048259208886143136, -0.048209267083560728, -0.048159325160455152, -0.048109383116951260, -0.048059440953173917, -0.048009498669247967, --0.047959556265298277, -0.047909613741449690, -0.047859671097826184, -0.047809728334554387, -0.047759785451758269, -0.047709842449562681, -0.047659899328092496, -0.047609956087472559, --0.047560012727827734, -0.047510069249282874, -0.047460125651961955, -0.047410181935991613, -0.047360238101495811, -0.047310294148599413, -0.047260350077427286, -0.047210405888104275, --0.047160461580755257, -0.047110517155504197, -0.047060572612477723, -0.047010627951799826, -0.046960683173595356, -0.046910738277989181, -0.046860793265106157, -0.046810848135071151, --0.046760902888009027, -0.046710957524043757, -0.046661012043301982, -0.046611066445907672, -0.046561120731985699, -0.046511174901660922, -0.046461228955058213, -0.046411282892302425, --0.046361336713517547, -0.046311390418830214, -0.046261444008364405, -0.046211497482244984, -0.046161550840596824, -0.046111604083544783, -0.046061657211213733, -0.046011710223728540, --0.045961763121213181, -0.045911815903794305, -0.045861868571595889, -0.045811921124742798, -0.045761973563359912, -0.045712025887572089, -0.045662078097504194, -0.045612130193281114, --0.045562182175026812, -0.045512234042867951, -0.045462285796928500, -0.045412337437333333, -0.045362388964207329, -0.045312440377675345, -0.045262491677862261, -0.045212542864892062, --0.045162593938891396, -0.045112644899984240, -0.045062695748295481, -0.045012746483949977, -0.044962797107072607, -0.044912847617788243, -0.044862898016221758, -0.044812948302497144, --0.044762998476741041, -0.044713048539077448, -0.044663098489631237, -0.044613148328527273, -0.044563198055890436, -0.044513247671845613, -0.044463297176517667, -0.044413346570030585, --0.044363395852511034, -0.044313445024082986, -0.044263494084871326, -0.044213543035000934, -0.044163591874596682, -0.044113640603783449, -0.044063689222685234, -0.044013737731428679, --0.043963786130137773, -0.043913834418937411, -0.043863882597952458, -0.043813930667307800, -0.043763978627128317, -0.043714026477538886, -0.043664074218663501, -0.043614121850628823, --0.043564169373558836, -0.043514216787578421, -0.043464264092812468, -0.043414311289385860, -0.043364358377423466, -0.043314405357049293, -0.043264452228389996, -0.043214498991569567, --0.043164545646712883, -0.043114592193944846, -0.043064638633390322, -0.043014684965174202, -0.042964731189421367, -0.042914777306255820, -0.042864823315804219, -0.042814869218190561, --0.042764915013539725, -0.042714960701976605, -0.042665006283626079, -0.042615051758613041, -0.042565097127062371, -0.042515142389098072, -0.042465187544846808, -0.042415232594432570, --0.042365277537980257, -0.042315322375614743, -0.042265367107460927, -0.042215411733643689, -0.042165456254287040, -0.042115500669517636, -0.042065544979459475, -0.042015589184237458, --0.041965633283976470, -0.041915677278801390, -0.041865721168837126, -0.041815764954208551, -0.041765808635039682, -0.041715852211457176, -0.041665895683585044, -0.041615939051548166, --0.041565982315471442, -0.041516025475479765, -0.041466068531698028, -0.041416111484251110, -0.041366154333263030, -0.041316197078860452, -0.041266239721167386, -0.041216282260308712, --0.041166324696409337, -0.041116367029594154, -0.041066409259988050, -0.041016451387715036, -0.040966493412901775, -0.040916535335672286, -0.040866577156151461, -0.040816618874464188, --0.040766660490735372, -0.040716702005089901, -0.040666743417652682, -0.040616784728547711, -0.040566825937901667, -0.040516867045838553, -0.040466908052483277, -0.040416948957960733, --0.040366989762395812, -0.040317030465913416, -0.040267071068637562, -0.040217111570694915, -0.040167151972209485, -0.040117192273306179, -0.040067232474109891, -0.040017272574745529, --0.039967312575337977, -0.039917352476012143, -0.039867392276892046, -0.039817431978104355, -0.039767471579773082, -0.039717511082023128, -0.039667550484979400, -0.039617589788766797, --0.039567628993510212, -0.039517668099334560, -0.039467707106363853, -0.039417746014724760, -0.039367784824541306, -0.039317823535938386, -0.039267862149040912, -0.039217900663973779, --0.039167939080861899, -0.039117977399829279, -0.039068015621002608, -0.039018053744505891, -0.038968091770464043, -0.038918129699001963, -0.038868167530244566, -0.038818205264316744, --0.038768242901343411, -0.038718280441448587, -0.038668317884758940, -0.038618355231398505, -0.038568392481492179, -0.038518429635164872, -0.038468466692541496, -0.038418503653746952, --0.038368540518905259, -0.038318577288143099, -0.038268613961584499, -0.038218650539354367, -0.038168687021577601, -0.038118723408379122, -0.038068759699883839, -0.038018795896216651, --0.037968831997501590, -0.037918868003865333, -0.037868903915431906, -0.037818939732326216, -0.037768975454673184, -0.037719011082597710, -0.037669046616224708, -0.037619082055679091, --0.037569117401084880, -0.037519152652568763, -0.037469187810254767, -0.037419222874267799, -0.037369257844732773, -0.037319292721774602, -0.037269327505518202, -0.037219362196087596, --0.037169396793609470, -0.037119431298207849, -0.037069465710007653, -0.037019500029133796, -0.036969534255711187, -0.036919568389864738, -0.036869602431719370, -0.036819636381399110, --0.036769670239030647, -0.036719704004738007, -0.036669737678646112, -0.036619771260879869, -0.036569804751564197, -0.036519838150824012, -0.036469871458784234, -0.036419904675568888, --0.036369937801304673, -0.036319970836115607, -0.036270003780126618, -0.036220036633462613, -0.036170069396248526, -0.036120102068609258, -0.036070134650668849, -0.036020167142553995, --0.035970199544388723, -0.035920231856297946, -0.035870264078406593, -0.035820296210839583, -0.035770328253721825, -0.035720360207178253, -0.035670392071332893, -0.035620423846312435, --0.035570455532240919, -0.035520487129243265, -0.035470518637444395, -0.035420550056969230, -0.035370581387942683, -0.035320612630488801, -0.035270643784734275, -0.035220674850803137, --0.035170705828820314, -0.035120736718910722, -0.035070767521199288, -0.035020798235810939, -0.034970828862870597, -0.034920859402502294, -0.034870889854832728, -0.034820920219985937, --0.034770950498086844, -0.034720980689260376, -0.034671010793631461, -0.034621040811325013, -0.034571070742465966, -0.034521100587178354, -0.034471130345588873, -0.034421160017821577, --0.034371189604001373, -0.034321219104253196, -0.034271248518701974, -0.034221277847472628, -0.034171307090689197, -0.034121336248478393, -0.034071365320964248, -0.034021394308271682, --0.033971423210525639, -0.033921452027851032, -0.033871480760372795, -0.033821509408215857, -0.033771537971504263, -0.033721566450364705, -0.033671594844921236, -0.033621623155298777, --0.033571651381622263, -0.033521679524016613, -0.033471707582606772, -0.033421735557517658, -0.033371763448873319, -0.033321791256800459, -0.033271818981423118, -0.033221846622866237, --0.033171874181254730, -0.033121901656713547, -0.033071929049367600, -0.033021956359340951, -0.032971983586760296, -0.032922010731749683, -0.032872037794434039, -0.032822064774938306, --0.032772091673387412, -0.032722118489906284, -0.032672145224619857, -0.032622171877652185, -0.032572198449129973, -0.032522224939177259, -0.032472251347918986, -0.032422277675480081, --0.032372303921985486, -0.032322330087560129, -0.032272356172328064, -0.032222382176415987, -0.032172408099947959, -0.032122433943048916, -0.032072459705843784, -0.032022485388457499, --0.031972510991015002, -0.031922536513641235, -0.031872561956460231, -0.031822587319598715, -0.031772612603180726, -0.031722637807331207, -0.031672662932175091, -0.031622687977837322, --0.031572712944442832, -0.031522737832116558, -0.031472762640982560, -0.031422787371167535, -0.031372812022795543, -0.031322836595991520, -0.031272861090880406, -0.031222885507587138, --0.031172909846236659, -0.031122934106953017, -0.031072958289862927, -0.031022982395090441, -0.030973006422760501, -0.030923030372998043, -0.030873054245928008, -0.030823078041675341, --0.030773101760364976, -0.030723125402120969, -0.030673148967070036, -0.030623172455336231, -0.030573195867044496, -0.030523219202319773, -0.030473242461286999, -0.030423265644071117, --0.030373288750797076, -0.030323311781588921, -0.030273334736573378, -0.030223357615874497, -0.030173380419617219, -0.030123403147926494, -0.030073425800927259, -0.030023448378744461, --0.029973470881502151, -0.029923493309327056, -0.029873515662343225, -0.029823537940675604, -0.029773560144449141, -0.029723582273788775, -0.029673604328819457, -0.029623626309666126, --0.029573648216452839, -0.029523670049306321, -0.029473691808350629, -0.029423713493710708, -0.029373735105511504, -0.029323756643877957, -0.029273778108935024, -0.029223799500806755, --0.029173820819619875, -0.029123842065498444, -0.029073863238567407, -0.029023884338951714, -0.028973905366776308, -0.028923926322166140, -0.028873947205246157, -0.028823968016140417, --0.028773988754975645, -0.028724009421875901, -0.028674030016966130, -0.028624050540371287, -0.028574070992216320, -0.028524091372626171, -0.028474111681725797, -0.028424131919639255, --0.028374152086493271, -0.028324172182411907, -0.028274192207520112, -0.028224212161942836, -0.028174232045805030, -0.028124251859231647, -0.028074271602346743, -0.028024291275277047, --0.027974310878146627, -0.027924330411080427, -0.027874349874203400, -0.027824369267640502, -0.027774388591516676, -0.027724407845956880, -0.027674427031085178, -0.027624446147028296, --0.027574465193910300, -0.027524484171856139, -0.027474503080990767, -0.027424521921439141, -0.027374540693326205, -0.027324559396776922, -0.027274578031915350, -0.027224596598868223, --0.027174615097759602, -0.027124633528714442, -0.027074651891857700, -0.027024670187314331, -0.026974688415209284, -0.026924706575666629, -0.026874724668813094, -0.026824742694772748, --0.026774760653670546, -0.026724778545631440, -0.026674796370780390, -0.026624814129242350, -0.026574831821142272, -0.026524849446604229, -0.026474867005754948, -0.026424884498718500, --0.026374901925619840, -0.026324919286583929, -0.026274936581735717, -0.026224953811200161, -0.026174970975101339, -0.026124988073565971, -0.026075005106718136, -0.026025022074682790, --0.025975038977584887, -0.025925055815549384, -0.025875072588701246, -0.025825089297165423, -0.025775105941065992, -0.025725122520529681, -0.025675139035680566, -0.025625155486643601, --0.025575171873543748, -0.025525188196505968, -0.025475204455655216, -0.025425220651116451, -0.025375236783013750, -0.025325252851473842, -0.025275268856620802, -0.025225284798579592, --0.025175300677475167, -0.025125316493432494, -0.025075332246576525, -0.025025347937031341, -0.024975363564923674, -0.024925379130377599, -0.024875394633518077, -0.024825410074470068, --0.024775425453358531, -0.024725440770308433, -0.024675456025444732, -0.024625471218891505, -0.024575486350775486, -0.024525501421220751, -0.024475516430352263, -0.024425531378294982, --0.024375546265173874, -0.024325561091113904, -0.024275575856240027, -0.024225590560676323, -0.024175605204549529, -0.024125619787983724, -0.024075634311103870, -0.024025648774034930, --0.023975663176901869, -0.023925677519829647, -0.023875691802942346, -0.023825706026366703, -0.023775720190226796, -0.023725734294647586, -0.023675748339754041, -0.023625762325671127, --0.023575776252523804, -0.023525790120437044, -0.023475803929534918, -0.023425817679944172, -0.023375831371788881, -0.023325845005194010, -0.023275858580284529, -0.023225872097185400, --0.023175885556021590, -0.023125898956917180, -0.023075912299998912, -0.023025925585390860, -0.022975938813217994, -0.022925951983605284, -0.022875965096677692, -0.022825978152560187, --0.022775991151377739, -0.022726004093254423, -0.022676016978316987, -0.022626029806689506, -0.022576042578496949, -0.022526055293864290, -0.022476067952916491, -0.022426080555778521, --0.022376093102575351, -0.022326105593431057, -0.022276118028472392, -0.022226130407823428, -0.022176142731609141, -0.022126154999954496, -0.022076167212984461, -0.022026179370824010, --0.021976191473597223, -0.021926203521430845, -0.021876215514448960, -0.021826227452776535, -0.021776239336538539, -0.021726251165859949, -0.021676262940865727, -0.021626274661680850, --0.021576286328429398, -0.021526297941238118, -0.021476309500231092, -0.021426321005533294, -0.021376332457269692, -0.021326343855565262, -0.021276355200544970, -0.021226366492333788, --0.021176377731055806, -0.021126388916837765, -0.021076400049803750, -0.021026411130078738, -0.020976422157787698, -0.020926433133055602, -0.020876444056007422, -0.020826454926767247, --0.020776465745461818, -0.020726476512215229, -0.020676487227152446, -0.020626497890398447, -0.020576508502078202, -0.020526519062316687, -0.020476529571238872, -0.020426540028968848, --0.020376550435633359, -0.020326560791356498, -0.020276571096263230, -0.020226581350478539, -0.020176591554127390, -0.020126601707334765, -0.020076611810224746, -0.020026621862924088, --0.019976631865556874, -0.019926641818248082, -0.019876651721122681, -0.019826661574305654, -0.019776671377921974, -0.019726681132096614, -0.019676690836953663, -0.019626700492619872, --0.019576710099219331, -0.019526719656877016, -0.019476729165717899, -0.019426738625866961, -0.019376748037449178, -0.019326757400589523, -0.019276766715412088, -0.019226775982043622, --0.019176785200608216, -0.019126794371230847, -0.019076803494036496, -0.019026812569150130, -0.018976821596696739, -0.018926830576800401, -0.018876839509587878, -0.018826848395183254, --0.018776857233711509, -0.018726866025297623, -0.018676874770066569, -0.018626883468143330, -0.018576892119652882, -0.018526900724719315, -0.018476909283469387, -0.018426917796027183, --0.018376926262517686, -0.018326934683065871, -0.018276943057796723, -0.018226951386835215, -0.018176959670305439, -0.018126967908334155, -0.018076976101045448, -0.018026984248564304, --0.017976992351015696, -0.017927000408524612, -0.017877008421216024, -0.017827016389214915, -0.017777024312645377, -0.017727032191634167, -0.017677040026305376, -0.017627047816783984, --0.017577055563194971, -0.017527063265663324, -0.017477070924314015, -0.017427078539272032, -0.017377086110661463, -0.017327093638609063, -0.017277101123238933, -0.017227108564676050, --0.017177115963045397, -0.017127123318471951, -0.017077130631080698, -0.017027137900995731, -0.016977145128343803, -0.016927152313249018, -0.016877159455836351, -0.016827166556230785, --0.016777173614557300, -0.016727180630940884, -0.016677187605506513, -0.016627194538378288, -0.016577201429682966, -0.016527208279544636, -0.016477215088088290, -0.016427221855438903, --0.016377228581721463, -0.016327235267060949, -0.016277241911582349, -0.016227248515409756, -0.016177255078669930, -0.016127261601486968, -0.016077268083985848, -0.016027274526291560, --0.015977280928529087, -0.015927287290823409, -0.015877293613298628, -0.015827299896081497, -0.015777306139296118, -0.015727312343067474, -0.015677318507520549, -0.015627324632780330, --0.015577330718971796, -0.015527336766219937, -0.015477342774648847, -0.015427348744385288, -0.015377354675553359, -0.015327360568278043, -0.015277366422684324, -0.015227372238897190, --0.015177378017041625, -0.015127383757241725, -0.015077389459624257, -0.015027395124313314, -0.014977400751433882, -0.014927406341110951, -0.014877411893469502, -0.014827417408634523, --0.014777422886731001, -0.014727428327883034, -0.014677433732217386, -0.014627439099858150, -0.014577444430930319, -0.014527449725558876, -0.014477454983868808, -0.014427460205985104, --0.014377465392032749, -0.014327470542135842, -0.014277475656421148, -0.014227480735012763, -0.014177485778035678, -0.014127490785614876, -0.014077495757875350, -0.014027500694942083, --0.013977505596939176, -0.013927510463993393, -0.013877515296228835, -0.013827520093770489, -0.013777524856743341, -0.013727529585272381, -0.013677534279482598, -0.013627538939498980, --0.013577543565445625, -0.013527548157449300, -0.013477552715634104, -0.013427557240125027, -0.013377561731047058, -0.013327566188525182, -0.013277570612684392, -0.013227575003649676, --0.013177579361545134, -0.013127583686497531, -0.013077587978630970, -0.013027592238070438, -0.012977596464940925, -0.012927600659367423, -0.012877604821474917, -0.012827608951387511, --0.012777613049231971, -0.012727617115132400, -0.012677621149213785, -0.012627625151601117, -0.012577629122419387, -0.012527633061793582, -0.012477636969848696, -0.012427640846708830, --0.012377644692500750, -0.012327648507348557, -0.012277652291377244, -0.012227656044711798, -0.012177659767477214, -0.012127663459798481, -0.012077667121799701, -0.012027670753607641, --0.011977674355346402, -0.011927677927140980, -0.011877681469116361, -0.011827684981397541, -0.011777688464109506, -0.011727691917377251, -0.011677695341324878, -0.011627698736079155, --0.011577702101764184, -0.011527705438504959, -0.011477708746426471, -0.011427712025653710, -0.011377715276311668, -0.011327718498525340, -0.011277721692418826, -0.011227724858118897, --0.011177727995749655, -0.011127731105436094, -0.011077734187303205, -0.011027737241475979, -0.010977740268079411, -0.010927743267237604, -0.010877746239077328, -0.010827749183722686, --0.010777752101298671, -0.010727754991930275, -0.010677757855742492, -0.010627760692860314, -0.010577763503408734, -0.010527766287511857, -0.010477769045296454, -0.010427771776886627, --0.010377774482407372, -0.010327777161983680, -0.010277779815740545, -0.010227782443802959, -0.010177785046295918, -0.010127787623343527, -0.010077790175072555, -0.010027792701607108, --0.009977795203072178, -0.009927797679592761, -0.009877800131293850, -0.009827802558300437, -0.009777804960736630, -0.009727807338729199, -0.009677809692402251, -0.009627812021880778, --0.009577814327289774, -0.009527816608754234, -0.009477818866399155, -0.009427821100349525, -0.009377823310729457, -0.009327825497665717, -0.009277827661282415, -0.009227829801704543, --0.009177831919057097, -0.009127834013465071, -0.009077836085053460, -0.009027838133946371, -0.008977840160270574, -0.008927842164150176, -0.008877844145710174, -0.008827846105075561, --0.008777848042371333, -0.008727849957722486, -0.008677851851254012, -0.008627853723090022, -0.008577855573357284, -0.008527857402179907, -0.008477859209682888, -0.008427860995991221, --0.008377862761229902, -0.008327864505523924, -0.008277866228998286, -0.008227867931777095, -0.008177869613987121, -0.008127871275752473, -0.008077872917198147, -0.008027874538449140, --0.007977876139630444, -0.007927877720867060, -0.007877879282283094, -0.007827880824005316, -0.007777882346157837, -0.007727883848865652, -0.007677885332253757, -0.007627886796447149, --0.007577888241570824, -0.007527889667749779, -0.007477891075108121, -0.007427892463772623, -0.007377893833867394, -0.007327895185517431, -0.007277896518847729, -0.007227897833983287, --0.007177899131049100, -0.007127900410169277, -0.007077901671470591, -0.007027902915077151, -0.006977904141113954, -0.006927905349705996, -0.006877906540978275, -0.006827907715055787, --0.006777908872063531, -0.006727910012125614, -0.006677911135368810, -0.006627912241917228, -0.006577913331895865, -0.006527914405429720, -0.006477915462643789, -0.006427916503663068, --0.006377917528612556, -0.006327918537616363, -0.006277919530801261, -0.006227920508291360, -0.006177921470211658, -0.006127922416687153, -0.006077923347842841, -0.006027924263803722, --0.005977925164693903, -0.005927926050640159, -0.005877926921766601, -0.005827927778198225, -0.005777928620060029, -0.005727929447477013, -0.005677930260574172, -0.005627931059476505, --0.005577931844308124, -0.005527932615195800, -0.005477933372263645, -0.005427934115636657, -0.005377934845439833, -0.005327935561798172, -0.005277936264836673, -0.005227936954680332, --0.005177937631453262, -0.005127938295282235, -0.005077938946291362, -0.005027939584605642, -0.004977940210350073, -0.004927940823649654, -0.004877941424629382, -0.004827942013413369, --0.004777942590128389, -0.004727943154898552, -0.004677943707848858, -0.004627944249104304, -0.004577944778789890, -0.004527945297030614, -0.004477945803951475, -0.004427946299676583, --0.004377946784332712, -0.004327947258043976, -0.004277947720935371, -0.004227948173131897, -0.004177948614758552, -0.004127949045940336, -0.004077949466801360, -0.004027949877468397, --0.003977950278065560, -0.003927950668717847, -0.003877951049550258, -0.003827951420687791, -0.003777951782255445, -0.003727952134378220, -0.003677952477180227, -0.003627952810788240, --0.003577953135326371, -0.003527953450919620, -0.003477953757692985, -0.003427954055771466, -0.003377954345280061, -0.003327954626343770, -0.003277954899086705, -0.003227955163635641, --0.003177955420114689, -0.003127955668648848, -0.003077955909363118, -0.003027956142382499, -0.002977956367831988, -0.002927956585835699, -0.002877956796520407, -0.002827957000010223, --0.002777957196430146, -0.002727957385905176, -0.002677957568560313, -0.002627957744520555, -0.002577957913910904, -0.002527958076855469, -0.002477958233481027, -0.002427958383911690, --0.002377958528272457, -0.002327958666688328, -0.002277958799284302, -0.002227958926185378, -0.002177959047516558, -0.002127959163401952, -0.002077959273968336, -0.002027959379339822, --0.001977959479641409, -0.001927959574998098, -0.001877959665534888, -0.001827959751376778, -0.001777959832647881, -0.001727959909474973, -0.001677959981982165, -0.001627960050294457, --0.001577960114536849, -0.001527960174834340, -0.001477960231311931, -0.001427960284094622, -0.001377960333306523, -0.001327960379074412, -0.001277960421522400, -0.001227960460775487, --0.001177960496958673, -0.001127960530196958, -0.001077960560615341, -0.001027960588337934, -0.000977960613491515, -0.000927960636200194, -0.000877960656588971, -0.000827960674782847, --0.000777960690906820, -0.000727960705085893, -0.000677960717445063, -0.000627960728108444, -0.000577960737202810, -0.000527960744852275, -0.000477960751181838, -0.000427960756316500, --0.000377960760381259, -0.000327960763501117, -0.000277960765801072, -0.000227960767405237, -0.000177960768440389, -0.000127960769030639, -0.000077960769300987 -}; - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c deleted file mode 100644 index d6a0aa1..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/arm_linear_interp_example_f32.c +++ /dev/null @@ -1,204 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_linear_interp_example_f32.c -* -* Description: Example code demonstrating usage of sin function -* and uses linear interpolation to get higher precision -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup LinearInterpExample Linear Interpolate Example - * - * CMSIS DSP Software Library -- Linear Interpolate Example - * - * Description - * This example demonstrates usage of linear interpolate modules and fast math modules. - * Method 1 uses fast math sine function to calculate sine values using cubic interpolation and method 2 uses - * linear interpolation function and results are compared to reference output. - * Example shows linear interpolation function can be used to get higher precision compared to fast math sin calculation. - * - * \par Block Diagram: - * \par - * \image html linearInterpExampleMethod1.gif "Method 1: Sine caluclation using fast math" - * \par - * \image html linearInterpExampleMethod2.gif "Method 2: Sine caluclation using interpolation function" - * - * \par Variables Description: - * \par - * \li \c testInputSin_f32 points to the input values for sine calculation - * \li \c testRefSinOutput32_f32 points to the reference values caculated from sin() matlab function - * \li \c testOutput points to output buffer calculation from cubic interpolation - * \li \c testLinIntOutput points to output buffer calculation from linear interpolation - * \li \c snr1 Signal to noise ratio for reference and cubic interpolation output - * \li \c snr2 Signal to noise ratio for reference and linear interpolation output - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_sin_f32() - * - arm_linear_interp_f32() - * - * Refer - * \link arm_linear_interp_example_f32.c \endlink - * - */ - - -/** \example arm_linear_interp_example_f32.c - */ - -#include "arm_math.h" -#include "math_helper.h" - -#define SNR_THRESHOLD 90 -#define TEST_LENGTH_SAMPLES 10 -#define XSPACING (0.00005f) - -/* ---------------------------------------------------------------------- -* Test input data for F32 SIN function -* Generated by the MATLAB rand() function -* randn('state', 0) -* xi = (((1/4.18318581819710)* randn(blockSize, 1) * 2* pi)); -* --------------------------------------------------------------------*/ -float32_t testInputSin_f32[TEST_LENGTH_SAMPLES] = -{ - -0.649716504673081170, -2.501723745497831200, - 0.188250329003310100, 0.432092748487532540, - -1.722010988459680800, 1.788766476323060600, - 1.786136060975809500, -0.056525543169408797, - 0.491596272728153760, 0.262309671126153390 -}; - -/*------------------------------------------------------------------------------ -* Reference out of SIN F32 function for Block Size = 10 -* Calculated from sin(testInputSin_f32) -*------------------------------------------------------------------------------*/ -float32_t testRefSinOutput32_f32[TEST_LENGTH_SAMPLES] = -{ - -0.604960695383043530, -0.597090287967934840, - 0.187140422442966500, 0.418772124875992690, - -0.988588831792106880, 0.976338412038794010, - 0.976903856413481100, -0.056495446835214236, - 0.472033731854734240, 0.259311907228582830 -}; - -/*------------------------------------------------------------------------------ -* Method 1: Test out Buffer Calculated from Cubic Interpolation -*------------------------------------------------------------------------------*/ -float32_t testOutput[TEST_LENGTH_SAMPLES]; - -/*------------------------------------------------------------------------------ -* Method 2: Test out buffer Calculated from Linear Interpolation -*------------------------------------------------------------------------------*/ -float32_t testLinIntOutput[TEST_LENGTH_SAMPLES]; - -/*------------------------------------------------------------------------------ -* External table used for linear interpolation -*------------------------------------------------------------------------------*/ -extern float arm_linear_interep_table[188495]; - -/* ---------------------------------------------------------------------- -* Global Variables for caluclating SNR's for Method1 & Method 2 -* ------------------------------------------------------------------- */ -float32_t snr1; -float32_t snr2; - -/* ---------------------------------------------------------------------------- -* Calculation of Sine values from Cubic Interpolation and Linear interpolation -* ---------------------------------------------------------------------------- */ -int32_t main(void) -{ - uint32_t i; - arm_status status; - - arm_linear_interp_instance_f32 S = {188495, -3.141592653589793238, XSPACING, &arm_linear_interep_table[0]}; - - /*------------------------------------------------------------------------------ - * Method 1: Test out Calculated from Cubic Interpolation - *------------------------------------------------------------------------------*/ - for(i=0; i< TEST_LENGTH_SAMPLES; i++) - { - testOutput[i] = arm_sin_f32(testInputSin_f32[i]); - } - - /*------------------------------------------------------------------------------ - * Method 2: Test out Calculated from Cubic Interpolation and Linear interpolation - *------------------------------------------------------------------------------*/ - - for(i=0; i< TEST_LENGTH_SAMPLES; i++) - { - testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]); - } - - /*------------------------------------------------------------------------------ - * SNR calculation for method 1 - *------------------------------------------------------------------------------*/ - snr1 = arm_snr_f32(testRefSinOutput32_f32, testOutput, 2); - - /*------------------------------------------------------------------------------ - * SNR calculation for method 2 - *------------------------------------------------------------------------------*/ - snr2 = arm_snr_f32(testRefSinOutput32_f32, testLinIntOutput, 2); - - /*------------------------------------------------------------------------------ - * Initialise status depending on SNR calculations - *------------------------------------------------------------------------------*/ - if( snr2 > snr1) - { - status = ARM_MATH_SUCCESS; - } - else - { - status = ARM_MATH_TEST_FAILURE; - } - - /* ---------------------------------------------------------------------- - ** Loop here if the signals fail the PASS check. - ** This denotes a test failure - ** ------------------------------------------------------------------- */ - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_linear_interp_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt deleted file mode 100644 index 57d5e42..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_matrix_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c deleted file mode 100644 index 0f4e1af..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/arm_matrix_example_f32.c +++ /dev/null @@ -1,233 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_matrix_example_f32.c -* -* Description: Example code demonstrating least square fit to data -* using matrix functions -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup MatrixExample Matrix Example - * - * \par Description: - * \par - * Demonstrates the use of Matrix Transpose, Matrix Muliplication, and Matrix Inverse - * functions to apply least squares fitting to input data. Least squares fitting is - * the procedure for finding the best-fitting curve that minimizes the sum of the - * squares of the offsets (least square error) from a given set of data. - * - * \par Algorithm: - * \par - * The linear combination of parameters considered is as follows: - * \par - * A * X = B, where \c X is the unknown value and can be estimated - * from \c A & \c B. - * \par - * The least squares estimate \c X is given by the following equation: - * \par - * X = Inverse(AT * A) * AT * B - * - * \par Block Diagram: - * \par - * \image html matrixExample.gif - * - * \par Variables Description: - * \par - * \li \c A_f32 input matrix in the linear combination equation - * \li \c B_f32 output matrix in the linear combination equation - * \li \c X_f32 unknown matrix estimated using \c A_f32 & \c B_f32 matrices - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_mat_init_f32() - * - arm_mat_trans_f32() - * - arm_mat_mult_f32() - * - arm_mat_inverse_f32() - * - * Refer - * \link arm_matrix_example_f32.c \endlink - * - */ - - -/** \example arm_matrix_example_f32.c - */ - -#include "arm_math.h" -#include "math_helper.h" - -#define SNR_THRESHOLD 90 - -/* -------------------------------------------------------------------------------- -* Test input data(Cycles) taken from FIR Q15 module for differant cases of blockSize -* and tapSize -* --------------------------------------------------------------------------------- */ - -const float32_t B_f32[4] = -{ - 782.0, 7577.0, 470.0, 4505.0 -}; - -/* -------------------------------------------------------------------------------- -* Formula to fit is C1 + C2 * numTaps + C3 * blockSize + C4 * numTaps * blockSize -* -------------------------------------------------------------------------------- */ - -const float32_t A_f32[16] = -{ - /* Const, numTaps, blockSize, numTaps*blockSize */ - 1.0, 32.0, 4.0, 128.0, - 1.0, 32.0, 64.0, 2048.0, - 1.0, 16.0, 4.0, 64.0, - 1.0, 16.0, 64.0, 1024.0, -}; - - -/* ---------------------------------------------------------------------- -* Temporary buffers for storing intermediate values -* ------------------------------------------------------------------- */ -/* Transpose of A Buffer */ -float32_t AT_f32[16]; -/* (Transpose of A * A) Buffer */ -float32_t ATMA_f32[16]; -/* Inverse(Transpose of A * A) Buffer */ -float32_t ATMAI_f32[16]; -/* Test Output Buffer */ -float32_t X_f32[4]; - -/* ---------------------------------------------------------------------- -* Reference ouput buffer C1, C2, C3 and C4 taken from MATLAB -* ------------------------------------------------------------------- */ -const float32_t xRef_f32[4] = {73.0, 8.0, 21.25, 2.875}; - -float32_t snr; - - -/* ---------------------------------------------------------------------- -* Max magnitude FFT Bin test -* ------------------------------------------------------------------- */ - -int32_t main(void) -{ - - arm_matrix_instance_f32 A; /* Matrix A Instance */ - arm_matrix_instance_f32 AT; /* Matrix AT(A transpose) instance */ - arm_matrix_instance_f32 ATMA; /* Matrix ATMA( AT multiply with A) instance */ - arm_matrix_instance_f32 ATMAI; /* Matrix ATMAI(Inverse of ATMA) instance */ - arm_matrix_instance_f32 B; /* Matrix B instance */ - arm_matrix_instance_f32 X; /* Matrix X(Unknown Matrix) instance */ - - uint32_t srcRows, srcColumns; /* Temporary variables */ - arm_status status; - - /* Initialise A Matrix Instance with numRows, numCols and data array(A_f32) */ - srcRows = 4; - srcColumns = 4; - arm_mat_init_f32(&A, srcRows, srcColumns, (float32_t *)A_f32); - - /* Initialise Matrix Instance AT with numRows, numCols and data array(AT_f32) */ - srcRows = 4; - srcColumns = 4; - arm_mat_init_f32(&AT, srcRows, srcColumns, AT_f32); - - /* calculation of A transpose */ - status = arm_mat_trans_f32(&A, &AT); - - - /* Initialise ATMA Matrix Instance with numRows, numCols and data array(ATMA_f32) */ - srcRows = 4; - srcColumns = 4; - arm_mat_init_f32(&ATMA, srcRows, srcColumns, ATMA_f32); - - /* calculation of AT Multiply with A */ - status = arm_mat_mult_f32(&AT, &A, &ATMA); - - /* Initialise ATMAI Matrix Instance with numRows, numCols and data array(ATMAI_f32) */ - srcRows = 4; - srcColumns = 4; - arm_mat_init_f32(&ATMAI, srcRows, srcColumns, ATMAI_f32); - - /* calculation of Inverse((Transpose(A) * A) */ - status = arm_mat_inverse_f32(&ATMA, &ATMAI); - - /* calculation of (Inverse((Transpose(A) * A)) * Transpose(A)) */ - status = arm_mat_mult_f32(&ATMAI, &AT, &ATMA); - - /* Initialise B Matrix Instance with numRows, numCols and data array(B_f32) */ - srcRows = 4; - srcColumns = 1; - arm_mat_init_f32(&B, srcRows, srcColumns, (float32_t *)B_f32); - - /* Initialise X Matrix Instance with numRows, numCols and data array(X_f32) */ - srcRows = 4; - srcColumns = 1; - arm_mat_init_f32(&X, srcRows, srcColumns, X_f32); - - /* calculation ((Inverse((Transpose(A) * A)) * Transpose(A)) * B) */ - status = arm_mat_mult_f32(&ATMA, &B, &X); - - /* Comparison of reference with test output */ - snr = arm_snr_f32((float32_t *)xRef_f32, X_f32, 4); - - /*------------------------------------------------------------------------------ - * Initialise status depending on SNR calculations - *------------------------------------------------------------------------------*/ - if( snr > SNR_THRESHOLD) - { - status = ARM_MATH_SUCCESS; - } - else - { - status = ARM_MATH_TEST_FAILURE; - } - - - /* ---------------------------------------------------------------------- - ** Loop here if the signals fail the PASS check. - ** This denotes a test failure - ** ------------------------------------------------------------------- */ - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_matrix_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt deleted file mode 100644 index de461df..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_signal_converge_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c deleted file mode 100644 index 3a2337d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_data.c +++ /dev/null @@ -1,269 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_signal_converge_data.c -* -* Description: Test input data for Floating point LMS Norm FIR filter -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -** Test input data for Floating point LMS Norm FIR filter -** Generated by the MATLAB randn() function -** ------------------------------------------------------------------- */ - -float32_t testInput_f32[1536] = -{ --0.432565, -1.665584, 0.125332, 0.287676, -1.146471, 1.190915, 1.189164, -0.037633, -0.327292, 0.174639, -0.186709, 0.725791, -0.588317, 2.183186, -0.136396, 0.113931, -1.066768, 0.059281, -0.095648, -0.832349, 0.294411, -1.336182, 0.714325, 1.623562, --0.691776, 0.857997, 1.254001, -1.593730, -1.440964, 0.571148, -0.399886, 0.689997, -0.815622, 0.711908, 1.290250, 0.668601, 1.190838, -1.202457, -0.019790, -0.156717, --1.604086, 0.257304, -1.056473, 1.415141, -0.805090, 0.528743, 0.219321, -0.921902, --2.170674, -0.059188, -1.010634, 0.614463, 0.507741, 1.692430, 0.591283, -0.643595, -0.380337, -1.009116, -0.019511, -0.048221, 0.000043, -0.317859, 1.095004, -1.873990, -0.428183, 0.895638, 0.730957, 0.577857, 0.040314, 0.677089, 0.568900, -0.255645, --0.377469, -0.295887, -1.475135, -0.234004, 0.118445, 0.314809, 1.443508, -0.350975, -0.623234, 0.799049, 0.940890, -0.992092, 0.212035, 0.237882, -1.007763, -0.742045, -1.082295, -0.131500, 0.389880, 0.087987, -0.635465, -0.559573, 0.443653, -0.949904, -0.781182, 0.568961, -0.821714, -0.265607, -1.187777, -2.202321, 0.986337, -0.518635, -0.327368, 0.234057, 0.021466, -1.003944, -0.947146, -0.374429, -1.185886, -1.055903, -1.472480, 0.055744, -1.217317, -0.041227, -1.128344, -1.349278, -0.261102, 0.953465, -0.128644, 0.656468, -1.167819, -0.460605, -0.262440, -1.213152, -1.319437, 0.931218, -0.011245, -0.645146, 0.805729, 0.231626, -0.989760, 1.339586, 0.289502, 1.478917, -1.138028, -0.684139, -1.291936, -0.072926, -0.330599, -0.843628, 0.497770, 1.488490, --0.546476, -0.846758, -0.246337, 0.663024, -0.854197, -1.201315, -0.119869, -0.065294, -0.485296, -0.595491, -0.149668, -0.434752, -0.079330, 1.535152, -0.606483, -1.347363, -0.469383, -0.903567, 0.035880, -0.627531, 0.535398, 0.552884, -0.203690, -2.054325, -0.132561, 1.592941, 1.018412, -1.580402, -0.078662, -0.681657, -1.024553, -1.234353, -0.288807, -0.429303, 0.055801, -0.367874, -0.464973, 0.370961, 0.728283, 2.112160, --1.357298, -1.022610, 1.037834, -0.389800, -1.381266, 0.315543, 1.553243, 0.707894, -1.957385, 0.504542, 1.864529, -0.339812, -1.139779, -0.211123, 1.190245, -1.116209, -0.635274, -0.601412, 0.551185, -1.099840, 0.085991, -2.004563, -0.493088, 0.462048, --0.321005, 1.236556, -0.631280, -2.325211, -1.231637, 1.055648, -0.113224, 0.379224, -0.944200, -2.120427, -0.644679, -0.704302, -1.018137, -0.182082, 1.521013, -0.038439, -1.227448, -0.696205, 0.007524, -0.782893, 0.586939, -0.251207, 0.480136, 0.668155, --0.078321, 0.889173, 2.309287, 0.524639, -0.011787, 0.913141, 0.055941, -1.107070, -0.485498, -0.005005, -0.276218, 1.276452, 1.863401, -0.522559, 0.103424, -0.807649, -0.680439, -2.364590, 0.990115, 0.218899, 0.261662, 1.213444, -0.274667, -0.133134, --1.270500, -1.663606, -0.703554, 0.280880, -0.541209, -1.333531, 1.072686, -0.712085, --0.011286, -0.000817, -0.249436, 0.396575, -0.264013, -1.664011, -1.028975, 0.243095, --1.256590, -0.347183, -0.941372, -1.174560, -1.021142, -0.401667, 0.173666, -0.116118, -1.064119, -0.245386, -1.517539, 0.009734, 0.071373, 0.316536, 0.499826, 1.278084, --0.547816, 0.260808, -0.013177, -0.580264, 2.136308, -0.257617, -1.409528, 1.770101, -0.325546, -1.119040, 0.620350, 1.269782, -0.896043, 0.135175, -0.139040, -1.163395, -1.183720, -0.015430, 0.536219, -0.716429, -0.655559, 0.314363, 0.106814, 1.848216, --0.275106, 2.212554, 1.508526, -1.945079, -1.680543, -0.573534, -0.185817, 0.008934, -0.836950, -0.722271, -0.721490, -0.201181, -0.020464, 0.278890, 1.058295, 0.621673, --1.750615, 0.697348, 0.811486, 0.636345, 1.310080, 0.327098, -0.672993, -0.149327, --2.449018, 0.473286, 0.116946, -0.591104, -0.654708, -1.080662, -0.047731, 0.379345, --0.330361, -0.499898, -0.035979, -0.174760, -0.957265, 1.292548, 0.440910, 1.280941, --0.497730, -1.118717, 0.807650, 0.041200, -0.756209, -0.089129, -2.008850, 1.083918, --0.981191, -0.688489, 1.339479, -0.909243, -0.412858, -0.506163, 1.619748, 0.080901, --1.081056, -1.124518, 1.735676, 1.937459, 1.635068, -1.255940, -0.213538, -0.198932, -0.307499, -0.572325, -0.977648, -0.446809, 1.082092, 2.372648, 0.229288, -0.266623, -0.701672, -0.487590, 1.862480, 1.106851, -1.227566, -0.669885, 1.340929, 0.388083, -0.393059, -1.707334, 0.227859, 0.685633, -0.636790, -1.002606, -0.185621, -1.054033, --0.071539, 0.279198, 1.373275, 0.179841, -0.542017, 1.634191, 0.825215, 0.230761, -0.671634, -0.508078, 0.856352, 0.268503, 0.624975, -1.047338, 1.535670, 0.434426, --1.917136, 0.469940, 1.274351, 0.638542, 1.380782, 1.319843, -0.909429, -2.305605, -1.788730, 0.390798, 0.020324, -0.405977, -1.534895, 0.221373, -1.374479, -0.839286, --0.208643, 0.755913, 0.375734, -1.345413, 1.481876, 0.032736, 1.870453, -1.208991, --0.782632, -0.767299, -0.107200, -0.977057, -0.963988, -2.379172, -0.838188, 0.257346, --0.183834, -0.167615, -0.116989, 0.168488, -0.501206, -0.705076, 0.508165, -0.420922, -0.229133, -0.959497, -0.146043, 0.744538, -0.890496, 0.139062, -0.236144, -0.075459, --0.358572, -2.077635, -0.143546, 1.393341, 0.651804, -0.377134, -0.661443, 0.248958, --0.383516, -0.528480, 0.055388, 1.253769, -2.520004, 0.584856, -1.008064, 0.944285, --2.423957, -0.223831, 0.058070, -0.424614, -0.202918, -1.513077, -1.126352, -0.815002, -0.366614, -0.586107, 1.537409, 0.140072, -1.862767, -0.454193, -0.652074, 0.103318, --0.220632, -0.279043, -0.733662, -0.064534, -1.444004, 0.612340, -1.323503, -0.661577, --0.146115, 0.248085, -0.076633, 1.738170, 1.621972, 0.626436, 0.091814, -0.807607, --0.461337, -1.405969, -0.374530, -0.470911, 1.751296, 0.753225, 0.064989, -0.292764, -0.082823, 0.766191, 2.236850, 0.326887, 0.863304, 0.679387, 0.554758, 1.001630, -1.259365, 0.044151, -0.314138, 0.226708, 0.996692, 1.215912, -0.542702, 0.912228, --0.172141, -0.335955, 0.541487, 0.932111, -0.570253, -1.498605, -0.050346, 0.553025, -0.083498, 1.577524, -0.330774, 0.795155, -0.784800, -1.263121, 0.666655, -1.392632, --1.300562, -0.605022, -1.488565, 0.558543, -0.277354, -1.293685, -0.888435, -0.986520, --0.071618, -2.414591, -0.694349, -1.391389, 0.329648, 0.598544, 0.147175, -0.101439, --2.634981, 0.028053, -0.876310, -0.265477, -0.327578, -1.158247, 0.580053, 0.239756, --0.350885, 0.892098, 1.578299, -1.108174, -0.025931, -1.110628, 0.750834, 0.500167, --0.517261, -0.559209, -0.753371, 0.925813, -0.248520, -0.149835, -1.258415, 0.312620, -2.690277, 0.289696, -1.422803, 0.246786, -1.435773, 0.148573, -1.693073, 0.719188, -1.141773, 1.551936, 1.383630, -0.758092, 0.442663, 0.911098, -1.074086, 0.201762, -0.762863, -1.288187, -0.952962, 0.778175, -0.006331, 0.524487, 1.364272, 0.482039, --0.787066, 0.751999, -0.166888, -0.816228, 2.094065, 0.080153, -0.937295, 0.635739, -1.682028, 0.593634, 0.790153, 0.105254, -0.158579, 0.870907, -0.194759, 0.075474, --0.526635, -0.685484, -0.268388, -1.188346, 0.248579, 0.102452, -0.041007, -2.247582, --0.510776, 0.249243, 0.369197, 0.179197, -0.037283, -1.603310, 0.339372, -0.131135, -0.485190, 0.598751, -0.086031, 0.325292, -0.335143, -0.322449, -0.382374, -0.953371, -0.233576, 1.235245, -0.578532, -0.501537, 0.722864, 0.039498, 1.541279, -1.701053, --1.033741, -0.763708, 2.176426, 0.431612, -0.443765, 0.029996, -0.315671, 0.977846, -0.018295, 0.817963, 0.702341, -0.231271, -0.113690, 0.127941, -0.799410, -0.238612, --0.089463, -1.023264, 0.937538, -1.131719, -0.710702, -1.169501, 1.065437, -0.680394, --1.725773, 0.813200, 1.441867, 0.672272, 0.138665, -0.859534, -0.752251, 1.229615, -1.150754, -0.608025, 0.806158, 0.217133, -0.373461, -0.832030, 0.286866, -1.818892, --1.573051, 2.015666, -0.071982, 2.628909, -0.243317, 0.173276, 0.923207, -0.178553, --0.521705, 1.431962, -0.870117, 0.807542, -0.510635, 0.743514, 0.847898, -0.829901, -0.532994, 1.032848, -1.052024, 0.362114, -0.036787, -1.227636, -0.275099, -0.160435, --1.083575, -1.954213, -0.909487, -0.005579, -1.723490, 1.263077, -0.600433, -2.063925, -0.110911, 1.487614, 0.053002, 0.161981, -0.026878, 0.173576, 0.882168, 0.182294, -0.755295, 0.508035, 0.131880, 0.280104, -0.982848, -0.944087, -0.013058, 0.354345, --0.894709, 0.812111, 0.109537, 2.731644, 0.411079, -1.306862, 0.383806, 0.499504, --0.510786, 0.234922, -0.597825, 0.020771, 0.419443, 1.191104, 0.771214, -2.644222, -0.285430, 0.826093, -0.008122, 0.858438, 0.774788, 1.305945, 1.231503, 0.958564, --1.654548, -0.990396, 0.685236, -0.974870, -0.606726, 0.686794, 0.020049, 1.063801, --1.341050, 0.479510, -1.633974, -1.442665, 0.293781, -0.140364, -1.130341, -0.292538, --0.582536, -0.896348, 0.248601, -1.489663, 0.313509, -2.025084, 0.528990, 0.343471, -0.758193, -0.691940, 0.680179, -1.072541, 0.899772, -2.123092, 0.284712, -0.733323, --0.773376, 0.151842, -0.336843, 0.970761, -0.107236, 1.013492, -0.475347, 0.068948, -0.398592, 1.116326, 0.620451, -0.287674, -1.371773, -0.685868, 0.331685, -0.997722, -0.291418, 1.107078, 0.244959, 0.164976, 0.406231, 1.215981, 1.448424, -1.025137, -0.205418, 0.588882, -0.264024, 2.495318, 0.855948, -0.850954, 0.811879, 0.700242, -0.759938, -1.712909, 1.537021, -1.609847, 1.109526, -1.109704, 0.385469, 0.965231, -0.818297, 0.037049, -0.926012, -0.111919, -0.803030, -1.665006, -0.901401, 0.588350, -0.554159, -0.415173, 0.061795, 0.457432, 0.199014, 0.257558, 2.080730, -2.277237, -0.339022, 0.289894, 0.662261, -0.580860, 0.887752, 0.171871, 0.848821, 0.963769, -1.321918, -0.064345, 1.317053, 0.228017, -1.429637, -0.149701, -0.504968, -1.729141, --0.417472, -0.614969, 0.720777, 0.339364, 0.882845, 0.284245, -0.145541, -0.089646, -0.289161, 1.164831, 0.805729, -1.355643, 0.120893, -0.222178, 0.571732, -0.300140, -1.134277, -0.179356, -1.467067, 1.395346, 0.440836, 0.565384, -0.693623, 0.833869, --2.237378, 1.097644, -0.001617, -1.614573, -1.228727, 0.207405, 0.220942, -1.006073, --0.453067, 1.399453, -0.461964, 0.032716, 0.798783, 0.896816, 0.137892, -1.619146, --1.646606, 0.428707, -0.737231, 0.564926, -1.384167, 0.460268, 0.629384, 0.379847, --1.013330, -0.347243, 0.441912, -1.590240, -0.701417, -1.077601, 1.002220, 1.729481, -0.709032, -0.747897, 0.228862, -0.223497, -0.853275, 0.345627, 0.109764, -1.133039, --0.683124, -0.277856, 0.654790, -1.248394, -0.597539, -0.481813, 0.983372, 1.762121, -1.427402, 0.911763, 0.326823, 0.069619, -1.499763, -0.418223, -0.021037, 0.228425, --1.008196, -0.664622, 0.558177, -1.188542, -0.775481, 0.271042, 1.534976, -1.052283, -0.625559, -0.797626, -0.313522, -0.602210, 1.259060, 0.858484, -2.105292, -0.360937, -0.553557, -1.556384, -0.206666, -0.425568, 0.493778, -0.870908, 0.079828, -0.521619, --1.413861, -0.384293, -0.457922, -0.291471, -0.301224, -1.588594, 1.094287, 1.324167, --0.126480, -0.737164, 0.213719, -0.400529, 0.064938, -1.757996, 1.686748, 0.327400, -0.715967, 1.598648, -2.064741, -0.743632, 0.176185, 0.527839, -0.553153, 0.298280, --1.226607, -0.189676, -0.301713, 0.956956, -0.533366, -0.901082, -0.892552, 0.278717, --0.745807, 1.603464, 0.574270, 0.320655, -0.151383, 0.315762, 1.343703, -2.237832, -1.292906, -0.378459, 0.002521, 0.884641, 0.582450, -1.614244, -1.503666, 0.573586, --0.910537, -1.631277, -0.359138, -0.397616, -1.161307, -1.109838, 0.290672, -1.910239, -1.314768, 0.665319, -0.275115, -0.023022, -0.907976, -1.043657, 0.373516, 0.901532, -1.278539, -0.128456, 0.612821, 1.956518, 2.266326, -0.373959, 2.238039, -0.159580, --0.703281, 0.563477, -0.050296, 1.163593, 0.658808, -1.550089, -3.029118, 0.540578, --1.008998, 0.908047, 1.582303, -0.979088, 1.007902, 0.158491, -0.586927, 1.574082, --0.516649, 1.227800, 1.583876, -2.088950, 2.949545, 1.356125, 1.050068, -0.767170, --0.257653, -1.371845, -1.267656, -0.894948, 0.589089, 1.842629, 1.347967, -0.491253, --2.177568, 0.237000, -0.735411, -1.779419, 0.448030, 0.581214, 0.856607, -0.266263, --0.417470, -0.205806, -0.174323, 0.217577, 1.684295, 0.119528, 0.650667, 2.080061, --0.339225, 0.730113, 0.293969, -0.849109, -2.533858, -2.378941, -0.346276, -0.610937, --0.408192, -1.415611, 0.227122, 0.207974, -0.719718, 0.757762, -1.643135, -1.056813, --0.251662, -1.298441, 1.233255, 1.494625, 0.235938, -1.404359, 0.658791, -2.556613, --0.534945, 3.202525, 0.439198, -1.149901, 0.886765, -0.283386, 1.035336, -0.364878, -1.341987, 1.008872, 0.213874, -0.299264, 0.255849, -0.190826, -0.079060, 0.699851, --0.796540, -0.801284, -0.007599, -0.726810, -1.490902, 0.870335, -0.265675, -1.566695, --0.394636, -0.143855, -2.334247, -1.357539, -1.815689, 1.108422, -0.142115, 1.112757, -0.559264, 0.478370, -0.679385, 0.284967, -1.332935, -0.723980, -0.663600, 0.198443, --1.794868, -1.387673, 0.197768, 1.469328, 0.366493, -0.442775, -0.048563, 0.077709, -1.957910, -0.072848, 0.938810, -0.079608, -0.800959, 0.309424, 1.051826, -1.664211, --1.090792, -0.191731, 0.463401, -0.924147, -0.649657, 0.622893, -1.335107, 1.047689, -0.863327, -0.642411, 0.660010, 1.294116, 0.314579, 0.859573, 0.128670, 0.016568, --0.072801, -0.994310, -0.747358, -0.030814, 0.988355, -0.599017, 1.476644, -0.813801, -0.645040, -1.309919, -0.867425, -0.474233, 0.222417, 1.871323, 0.110001, -0.411341, -0.511242, -1.199117, -0.096361, 0.445817, -0.295825, -0.167996, 0.179543, 0.421118, -1.677678, 1.996949, 0.696964, -1.366382, 0.363045, -0.567044, -1.044154, 0.697139, -0.484026, -0.193751, -0.378095, -0.886374, -1.840197, -1.628195, -1.173789, -0.415411, -0.175088, 0.229433, -1.240889, 0.700004, 0.426877, 1.454803, -0.510186, -0.006657, --0.525496, 0.717698, 1.088374, 0.500552, 2.771790, -0.160309, 0.429489, -1.966817, --0.546019, -1.888395, -0.107952, -1.316144, -0.672632, -0.902365, -0.154798, 0.947242, -1.550375, 0.429040, -0.560795, 0.179304, -0.771509, -0.943390, -1.407569, -1.906131, --0.065293, 0.672149, 0.206147, -0.008124, 0.020042, -0.558447, 1.886079, -0.219975, --1.414395, -0.302811, -0.569574, -0.121495, -0.390171, -0.844287, -1.737757, -0.449520, --1.547933, -0.095776, 0.907714, 2.369602, 0.519768, 0.410525, 1.052585, 0.428784, -1.295088, -0.186053, 0.130733, -0.657627, -0.759267, -0.595170, 0.812400, 0.069541, --1.833687, 1.827363, 0.654075, -1.544769, -0.375109, 0.207688, -0.765615, -0.106355, -0.338769, 1.033461, -1.404822, -1.030570, -0.643372, 0.170787, 1.344839, 1.936273, -0.741336, 0.811980, -0.142808, -0.099858, -0.800131, 0.493249, 1.237574, 1.295951, --0.278196, 0.217127, 0.630728, -0.548549, 0.229632, 0.355311, 0.521284, -0.615971, -1.345803, 0.974922, -2.377934, -1.092319, -0.325710, -2.012228, 1.567660, 0.233337, -0.646420, -1.129412, 0.197038, 1.696870, 0.726034, 0.792526, 0.603357, -0.058405, --1.108666, 2.144229, -1.352821, 0.457021, 0.391175, 2.073013, -0.323318, 1.468132, --0.502399, 0.209593, 0.754800, -0.948189, 0.613157, 1.760503, 0.088762, 2.595570, --0.675470, 2.786804, -0.016827, 0.271651, -0.914102, -1.951371, -0.317418, 0.588333, -0.828996, -1.674851, -1.922293, -0.436662, 0.044974, 2.416609, -0.309892, 0.187583, -0.947699, -0.525703, -1.115605, -1.592320, 1.174844, 0.485144, 1.645480, -0.454233, -1.008768, 2.049403, 0.602020, 0.017860, -1.610426, 1.238752, 0.683587, -0.780716, -0.530979, 2.134498, 0.354361, 0.231700, 1.287980, -0.013488, -1.333345, -0.556343, -0.755597, -0.911854, 1.371684, 0.245580, 0.118845, 0.384690, -0.070152, -0.578309, -0.469308, 1.299687, 1.634798, -0.702809, 0.807253, -1.027451, 1.294496, 0.014930, -0.218705, 1.713188, -2.078805, 0.112917, -1.086491, -1.558311, 0.637406, -0.404576, --0.403325, 0.084076, -0.435349, -0.562623, 0.878062, -0.814650, -0.258363, 0.493299, --0.802694, -0.008329, 0.627571, 0.154382, 2.580735, -1.306246, 1.023526, 0.777795, --0.833884, -0.586663, 0.065664, -0.012342, -0.076987, -1.558587, 1.702607, -0.468984, -0.094619, 0.287071, 0.919354, 0.510136, 0.245440, -1.400519, 0.969571, 1.593698, --1.437917, -1.534230, -0.074710, 0.081459, -0.843240, -0.564640, -0.028207, -1.243702, -0.733039, 0.059580, 0.149144, 1.595857, -0.777250, 1.550277, 1.055002, -0.166654, -0.314484, 1.419571, 0.327348, 0.475653, 0.398754, -0.072770, 1.314784, 0.978279, -1.722114, -0.412302, 0.565133, 0.739851, 0.220138, 1.312807, 0.629152, -1.107987, --0.447001, -0.725993, 0.354045, -0.506772, -2.103747, -0.664684, 1.450110, -0.329805, -2.701872, -1.634939, -0.536325, 0.547223, 1.492603, -0.455243, -0.496416, 1.235260, -0.040926, 0.748467, 1.230764, 0.304903, 1.077771, 0.765151, -1.319580, -0.509191, -0.555116, -1.957625, -0.760453, -2.443886, -0.659366, -0.114779, 0.300079, -0.583996, --3.073745, 1.551042, -0.407369, 1.428095, -1.353242, 0.903970, 0.541671, -0.465020 -}; - - - -/* ---------------------------------------------------------------------- -** Coefficients for 32-tap filter for Floating point LMS FIR filter -* FIR high pass filter with cutoff freq 9.6kHz (transition 9.6KHz to 11.52KHz) -** ------------------------------------------------------------------- */ -float32_t lmsNormCoeff_f32[32] = { --0.004240, 0.002301, 0.008860, -0.000000, -0.019782, -0.010543, 0.032881, 0.034736, --0.037374, -0.069586, 0.022397, 0.102169, 0.014185, -0.115908, -0.061648, 0.101018, -0.101018, -0.061648, -0.115908, 0.014185, 0.102169, 0.022397, -0.069586, -0.037374, -0.034736, 0.032881, -0.010543, -0.019782, -0.000000, 0.008860, 0.002301, -0.004240 - -}; - -/* ---------------------------------------------------------------------- -** Coefficients for 32-tap filter for Floating point FIR filter -* FIR low pass filter with cutoff freq 24Hz (transition 24Hz to 240Hz) -** ------------------------------------------------------------------- */ -const float32_t FIRCoeff_f32[32] = { -0.004502, 0.005074, 0.006707, 0.009356, 0.012933, 0.017303, 0.022298, 0.027717, -0.033338, 0.038930, 0.044258, 0.049098, 0.053243, 0.056519, 0.058784, 0.059941, -0.059941, 0.058784, 0.056519, 0.053243, 0.049098, 0.044258, 0.038930, 0.033338, -0.027717, 0.022298, 0.017303, 0.012933, 0.009356, 0.006707, 0.005074, 0.004502 - -}; - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c deleted file mode 100644 index c877076..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/arm_signal_converge_example_f32.c +++ /dev/null @@ -1,259 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_signal_converge_example_f32.c -* -* Description: Example code demonstrating convergence of an adaptive -* filter. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup SignalConvergence Signal Convergence Example - * - * \par Description: - * \par - * Demonstrates the ability of an adaptive filter to "learn" the transfer function of - * a FIR lowpass filter using the Normalized LMS Filter, Finite Impulse - * Response (FIR) Filter, and Basic Math Functions. - * - * \par Algorithm: - * \par - * The figure below illustrates the signal flow in this example. Uniformly distributed white - * noise is passed through an FIR lowpass filter. The output of the FIR filter serves as the - * reference input of the adaptive filter (normalized LMS filter). The white noise is input - * to the adaptive filter. The adaptive filter learns the transfer function of the FIR filter. - * The filter outputs two signals: (1) the output of the internal adaptive FIR filter, and - * (2) the error signal which is the difference between the adaptive filter and the reference - * output of the FIR filter. Over time as the adaptive filter learns the transfer function - * of the FIR filter, the first output approaches the reference output of the FIR filter, - * and the error signal approaches zero. - * \par - * The adaptive filter converges properly even if the input signal has a large dynamic - * range (i.e., varies from small to large values). The coefficients of the adaptive filter - * are initially zero, and then converge over 1536 samples. The internal function test_signal_converge() - * implements the stopping condition. The function checks if all of the values of the error signal have a - * magnitude below a threshold DELTA. - * - * \par Block Diagram: - * \par - * \image html SignalFlow.gif - * - * - * \par Variables Description: - * \par - * \li \c testInput_f32 points to the input data - * \li \c firStateF32 points to FIR state buffer - * \li \c lmsStateF32 points to Normalised Least mean square FIR filter state buffer - * \li \c FIRCoeff_f32 points to coefficient buffer - * \li \c lmsNormCoeff_f32 points to Normalised Least mean square FIR filter coefficient buffer - * \li \c wire1, wir2, wire3 temporary buffers - * \li \c errOutput, err_signal temporary error buffers - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_lms_norm_init_f32() - * - arm_fir_init_f32() - * - arm_fir_f32() - * - arm_lms_norm_f32() - * - arm_scale_f32() - * - arm_abs_f32() - * - arm_sub_f32() - * - arm_min_f32() - * - arm_copy_f32() - * - * Refer - * \link arm_signal_converge_example_f32.c \endlink - * - */ - - -/** \example arm_signal_converge_example_f32.c - */ - -#include "arm_math.h" -#include "math_helper.h" - -/* ---------------------------------------------------------------------- -** Global defines for the simulation -* ------------------------------------------------------------------- */ - -#define TEST_LENGTH_SAMPLES 1536 -#define NUMTAPS 32 -#define BLOCKSIZE 32 -#define DELTA_ERROR 0.000001f -#define DELTA_COEFF 0.0001f -#define MU 0.5f - -#define NUMFRAMES (TEST_LENGTH_SAMPLES / BLOCKSIZE) - -/* ---------------------------------------------------------------------- -* Declare FIR state buffers and structure -* ------------------------------------------------------------------- */ - -float32_t firStateF32[NUMTAPS + BLOCKSIZE]; -arm_fir_instance_f32 LPF_instance; - -/* ---------------------------------------------------------------------- -* Declare LMSNorm state buffers and structure -* ------------------------------------------------------------------- */ - -float32_t lmsStateF32[NUMTAPS + BLOCKSIZE]; -float32_t errOutput[TEST_LENGTH_SAMPLES]; -arm_lms_norm_instance_f32 lmsNorm_instance; - - -/* ---------------------------------------------------------------------- -* Function Declarations for Signal Convergence Example -* ------------------------------------------------------------------- */ - -arm_status test_signal_converge_example( void ); - - -/* ---------------------------------------------------------------------- -* Internal functions -* ------------------------------------------------------------------- */ -arm_status test_signal_converge(float32_t* err_signal, - uint32_t blockSize); - -void getinput(float32_t* input, - uint32_t fr_cnt, - uint32_t blockSize); - -/* ---------------------------------------------------------------------- -* External Declarations for FIR F32 module Test -* ------------------------------------------------------------------- */ -extern float32_t testInput_f32[TEST_LENGTH_SAMPLES]; -extern float32_t lmsNormCoeff_f32[32]; -extern const float32_t FIRCoeff_f32[32]; -extern arm_lms_norm_instance_f32 lmsNorm_instance; - -/* ---------------------------------------------------------------------- -* Declare I/O buffers -* ------------------------------------------------------------------- */ - -float32_t wire1[BLOCKSIZE]; -float32_t wire2[BLOCKSIZE]; -float32_t wire3[BLOCKSIZE]; -float32_t err_signal[BLOCKSIZE]; - -/* ---------------------------------------------------------------------- -* Signal converge test -* ------------------------------------------------------------------- */ - -int32_t main(void) -{ - uint32_t i; - arm_status status; - uint32_t index; - float32_t minValue; - - /* Initialize the LMSNorm data structure */ - arm_lms_norm_init_f32(&lmsNorm_instance, NUMTAPS, lmsNormCoeff_f32, lmsStateF32, MU, BLOCKSIZE); - - /* Initialize the FIR data structure */ - arm_fir_init_f32(&LPF_instance, NUMTAPS, (float32_t *)FIRCoeff_f32, firStateF32, BLOCKSIZE); - - /* ---------------------------------------------------------------------- - * Loop over the frames of data and execute each of the processing - * functions in the system. - * ------------------------------------------------------------------- */ - - for(i=0; i < NUMFRAMES; i++) - { - /* Read the input data - uniformly distributed random noise - into wire1 */ - arm_copy_f32(testInput_f32 + (i * BLOCKSIZE), wire1, BLOCKSIZE); - - /* Execute the FIR processing function. Input wire1 and output wire2 */ - arm_fir_f32(&LPF_instance, wire1, wire2, BLOCKSIZE); - - /* Execute the LMS Norm processing function*/ - - arm_lms_norm_f32(&lmsNorm_instance, /* LMSNorm instance */ - wire1, /* Input signal */ - wire2, /* Reference Signal */ - wire3, /* Converged Signal */ - err_signal, /* Error Signal, this will become small as the signal converges */ - BLOCKSIZE); /* BlockSize */ - - /* apply overall gain */ - arm_scale_f32(wire3, 5, wire3, BLOCKSIZE); /* in-place buffer */ - } - - status = ARM_MATH_SUCCESS; - - /* ------------------------------------------------------------------------------- - * Test whether the error signal has reached towards 0. - * ----------------------------------------------------------------------------- */ - - arm_abs_f32(err_signal, err_signal, BLOCKSIZE); - arm_min_f32(err_signal, BLOCKSIZE, &minValue, &index); - - if (minValue > DELTA_ERROR) - { - status = ARM_MATH_TEST_FAILURE; - } - - /* ---------------------------------------------------------------------- - * Test whether the filter coefficients have converged. - * ------------------------------------------------------------------- */ - - arm_sub_f32((float32_t *)FIRCoeff_f32, lmsNormCoeff_f32, lmsNormCoeff_f32, NUMTAPS); - - arm_abs_f32(lmsNormCoeff_f32, lmsNormCoeff_f32, NUMTAPS); - arm_min_f32(lmsNormCoeff_f32, NUMTAPS, &minValue, &index); - - if (minValue > DELTA_COEFF) - { - status = ARM_MATH_TEST_FAILURE; - } - - /* ---------------------------------------------------------------------- - * Loop here if the signals did not pass the convergence check. - * This denotes a test failure - * ------------------------------------------------------------------- */ - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c deleted file mode 100644 index bd44a20..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.c -* -* Description: Definition of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- -* Include standard header files -* -------------------------------------------------------------------- */ -#include - -/* ---------------------------------------------------------------------- -* Include project header files -* -------------------------------------------------------------------- */ -#include "math_helper.h" - -/** - * @brief Caluclation of SNR - * @param float* Pointer to the reference buffer - * @param float* Pointer to the test buffer - * @param uint32_t total number of samples - * @return float SNR - * The function Caluclates signal to noise ratio for the reference output - * and test output - */ - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) -{ - float EnergySignal = 0.0, EnergyError = 0.0; - uint32_t i; - float SNR; - int temp; - int *test; - - for (i = 0; i < buffSize; i++) - { - /* Checking for a NAN value in pRef array */ - test = (int *)(&pRef[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - /* Checking for a NAN value in pTest array */ - test = (int *)(&pTest[i]); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - EnergySignal += pRef[i] * pRef[i]; - EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); - } - - /* Checking for a NAN value in EnergyError */ - test = (int *)(&EnergyError); - temp = *test; - - if(temp == 0x7FC00000) - { - return(0); - } - - - SNR = 10 * log10 (EnergySignal / EnergyError); - - return (SNR); - -} - - -/** - * @brief Provide guard bits for Input buffer - * @param q15_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q15 (q15_t * input_buf, uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Converts float to fixed in q12.20 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point(q12.20) values - */ - -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1048576.0f corresponds to pow(2, 20) */ - pOut[i] = (q31_t) (pIn[i] * 1048576.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 1.0) - { - pOut[i] = 0x000FFFFF; - } - } -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q15_t* Pointer to Ref buffer - * @param q15_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Compare MATLAB Reference Output and ARM Test output - * @param q31_t* Pointer to Ref buffer - * @param q31_t* Pointer to Test buffer - * @param uint32_t number of samples in the buffer - * @return none - */ - -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t * pOut, uint32_t numSamples) -{ - uint32_t i; - int32_t diff, diffCrnt = 0; - uint32_t maxDiff = 0; - - for (i = 0; i < numSamples; i++) - { - diff = pIn[i] - pOut[i]; - diffCrnt = (diff > 0) ? diff : -diff; - - if(diffCrnt > maxDiff) - { - maxDiff = diffCrnt; - } - } - - return(maxDiff); -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q31 (q31_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - -/** - * @brief Provide guard bits for Input buffer - * @param q31_t* Pointer to input buffer - * @param uint32_t blockSize - * @param uint32_t guard_bits - * @return none - * The function Provides the guard bits for the buffer - * to avoid overflow - */ - -void arm_provide_guard_bits_q7 (q7_t * input_buf, - uint32_t blockSize, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < blockSize; i++) - { - input_buf[i] = input_buf[i] >> guard_bits; - } -} - - - -/** - * @brief Caluclates number of guard bits - * @param uint32_t number of additions - * @return none - * The function Caluclates the number of guard bits - * depending on the numtaps - */ - -uint32_t arm_calc_guard_bits (uint32_t num_adds) -{ - uint32_t i = 1, j = 0; - - if (num_adds == 1) - { - return (0); - } - - while (i < num_adds) - { - i = i * 2; - j++; - } - - return (j); -} - -/** - * @brief Converts Q15 to floating-point - * @param uint32_t number of samples in the buffer - * @return none - */ - -void arm_apply_guard_bits (float32_t * pIn, - uint32_t numSamples, - uint32_t guard_bits) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - pIn[i] = pIn[i] * arm_calc_2pow(guard_bits); - } -} - -/** - * @brief Calculates pow(2, numShifts) - * @param uint32_t number of shifts - * @return pow(2, numShifts) - */ -uint32_t arm_calc_2pow(uint32_t numShifts) -{ - - uint32_t i, val = 1; - - for (i = 0; i < numShifts; i++) - { - val = val * 2; - } - - return(val); -} - - - -/** - * @brief Converts float to fixed q14 - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q14 (float *pIn, q15_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 16384.0f corresponds to pow(2, 14) */ - pOut[i] = (q15_t) (pIn[i] * 16384.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFF; - } - - } - -} - - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q30 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 1073741824.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 2.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Converts float to fixed q30 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q29 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 1073741824.0f corresponds to pow(2, 30) */ - pOut[i] = (q31_t) (pIn[i] * 536870912.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 4.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - - -/** - * @brief Converts float to fixed q28 format - * @param uint32_t number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_float_to_q28 (float *pIn, q31_t * pOut, - uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - /* 268435456.0f corresponds to pow(2, 28) */ - pOut[i] = (q31_t) (pIn[i] * 268435456.0f); - - pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; - - if (pIn[i] == (float) 8.0) - { - pOut[i] = 0x7FFFFFFF; - } - } -} - -/** - * @brief Clip the float values to +/- 1 - * @param pIn input buffer - * @param numSamples number of samples in the buffer - * @return none - * The function converts floating point values to fixed point values - */ - -void arm_clip_f32 (float *pIn, uint32_t numSamples) -{ - uint32_t i; - - for (i = 0; i < numSamples; i++) - { - if(pIn[i] > 1.0f) - { - pIn[i] = 1.0; - } - else if( pIn[i] < -1.0f) - { - pIn[i] = -1.0; - } - - } -} - - - - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h deleted file mode 100644 index 5a18734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_signal_converge_example/ARM/math_helper.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2013 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* -* Title: math_helper.h -* -* Description: Prototypes of all helper functions required. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -#ifndef MATH_HELPER_H -#define MATH_HELPER_H - -float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize); -void arm_float_to_q12_20(float *pIn, q31_t * pOut, uint32_t numSamples); -void arm_provide_guard_bits_q15(q15_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_provide_guard_bits_q31(q31_t *input_buf, uint32_t blockSize, uint32_t guard_bits); -void arm_float_to_q14(float *pIn, q15_t *pOut, uint32_t numSamples); -void arm_float_to_q29(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q28(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_float_to_q30(float *pIn, q31_t *pOut, uint32_t numSamples); -void arm_clip_f32(float *pIn, uint32_t numSamples); -uint32_t arm_calc_guard_bits(uint32_t num_adds); -void arm_apply_guard_bits (float32_t * pIn, uint32_t numSamples, uint32_t guard_bits); -uint32_t arm_compare_fixed_q15(q15_t *pIn, q15_t * pOut, uint32_t numSamples); -uint32_t arm_compare_fixed_q31(q31_t *pIn, q31_t *pOut, uint32_t numSamples); -uint32_t arm_calc_2pow(uint32_t guard_bits); -#endif - diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt deleted file mode 100644 index 1cf8288..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_sin_cos_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c deleted file mode 100644 index 5a2d5ce..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_sin_cos_example/ARM/arm_sin_cos_example_f32.c +++ /dev/null @@ -1,161 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 12. March 2014 -* $Revision: V1.4.3 -* -* Project: CMSIS DSP Library -* Title: arm_sin_cos_example_f32.c -* -* Description: Example code demonstrating sin and cos calculation of input signal. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup SinCosExample SineCosine Example - * - * \par Description: - * \par - * Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector - * Multiplication, and Vector Addition functions. - * - * \par Algorithm: - * \par - * Mathematically, the Pythagorean trignometric identity is defined by the following equation: - *
sin(x) * sin(x) + cos(x) * cos(x) = 1
- * where \c x is the angle in radians. - * - * \par Block Diagram: - * \par - * \image html sinCos.gif - * - * \par Variables Description: - * \par - * \li \c testInput_f32 array of input angle in radians - * \li \c testOutput stores sum of the squares of sine and cosine values of input angle - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_cos_f32() - * - arm_sin_f32() - * - arm_mult_f32() - * - arm_add_f32() - * - * Refer - * \link arm_sin_cos_example_f32.c \endlink - * - */ - - -/** \example arm_sin_cos_example_f32.c - */ - -#include -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 32 -#define DELTA (0.0001f) - - -/* ---------------------------------------------------------------------- -* Test input data for Floating point sin_cos example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ - -const float32_t testInput_f32[MAX_BLOCKSIZE] = -{ - -1.244916875853235400, -4.793533929171324800, 0.360705030233248850, 0.827929644170887320, -3.299532218312426900, 3.427441903227623800, 3.422401784294607700, -0.108308165334010680, - 0.941943896490312180, 0.502609575000365850, -0.537345278736373500, 2.088817392965764500, -1.693168684143455700, 6.283185307179590700, -0.392545884746175080, 0.327893095115825040, - 3.070147440456292300, 0.170611405884662230, -0.275275082396073010, -2.395492805446796300, 0.847311163536506600, -3.845517018083148800, 2.055818378415868300, 4.672594161978930800, - -1.990923030266425800, 2.469305197656249500, 3.609002606064021000, -4.586736582331667500, -4.147080139136136300, 1.643756718868359500, -1.150866392366494800, 1.985805026477433800 - - -}; - -const float32_t testRefOutput_f32 = 1.000000000; - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -uint32_t blockSize = 32; -float32_t testOutput; -float32_t cosOutput; -float32_t sinOutput; -float32_t cosSquareOutput; -float32_t sinSquareOutput; - -/* ---------------------------------------------------------------------- -* Max magnitude FFT Bin test -* ------------------------------------------------------------------- */ - -arm_status status; - -int32_t main(void) -{ - float32_t diff; - uint32_t i; - - for(i=0; i< blockSize; i++) - { - cosOutput = arm_cos_f32(testInput_f32[i]); - sinOutput = arm_sin_f32(testInput_f32[i]); - - arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1); - arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1); - - arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1); - - /* absolute value of difference between ref and test */ - diff = fabsf(testRefOutput_f32 - testOutput); - - /* Comparison of sin_cos value with reference */ - if(diff > DELTA) - { - status = ARM_MATH_TEST_FAILURE; - } - - if( status == ARM_MATH_TEST_FAILURE) - { - while(1); - } - - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt deleted file mode 100644 index fa60f5c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/Abstract.txt +++ /dev/null @@ -1,4 +0,0 @@ -CMSIS DSP_Lib example arm_variance_example for - Cortex-M0, Cortex-M3 and Cortex-M4 with FPU - -The example is configured for uVision Simulator diff --git a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c b/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c deleted file mode 100644 index 168c761..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Examples/arm_variance_example/ARM/arm_variance_example_f32.c +++ /dev/null @@ -1,204 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2012 ARM Limited. All rights reserved. -* -* $Date: 17. January 2013 -* $Revision: V1.4.0 -* -* Project: CMSIS DSP Library -* Title: arm_variance_example_f32.c -* -* Description: Example code demonstrating variance calculation of input sequence. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @ingroup groupExamples - */ - -/** - * @defgroup VarianceExample Variance Example - * - * \par Description: - * \par - * Demonstrates the use of Basic Math and Support Functions to calculate the variance of an - * input sequence with N samples. Uniformly distributed white noise is taken as input. - * - * \par Algorithm: - * \par - * The variance of a sequence is the mean of the squared deviation of the sequence from its mean. - * \par - * This is denoted by the following equation: - *
 variance = ((x[0] - x') * (x[0] - x') + (x[1] - x') * (x[1] - x') + ... + * (x[n-1] - x') * (x[n-1] - x')) / (N-1)
- * where, x[n] is the input sequence, N is the number of input samples, and - * x' is the mean value of the input sequence, x[n]. - * \par - * The mean value x' is defined as: - *
 x' = (x[0] + x[1] + ... + x[n-1]) / N
- * - * \par Block Diagram: - * \par - * \image html Variance.gif - * - * - * \par Variables Description: - * \par - * \li \c testInput_f32 points to the input data - * \li \c wire1, \c wir2, \c wire3 temporary buffers - * \li \c blockSize number of samples processed at a time - * \li \c refVarianceOut reference variance value - * - * \par CMSIS DSP Software Library Functions Used: - * \par - * - arm_dot_prod_f32() - * - arm_mult_f32() - * - arm_sub_f32() - * - arm_fill_f32() - * - arm_copy_f32() - * - * Refer - * \link arm_variance_example_f32.c \endlink - * - */ - - -/** \example arm_variance_example_f32.c - */ -#include -#include "arm_math.h" - -/* ---------------------------------------------------------------------- -* Defines each of the tests performed -* ------------------------------------------------------------------- */ -#define MAX_BLOCKSIZE 32 -#define DELTA (0.000001f) - - -/* ---------------------------------------------------------------------- -* Declare I/O buffers -* ------------------------------------------------------------------- */ -float32_t wire1[MAX_BLOCKSIZE]; -float32_t wire2[MAX_BLOCKSIZE]; -float32_t wire3[MAX_BLOCKSIZE]; - -/* ---------------------------------------------------------------------- -* Test input data for Floating point Variance example for 32-blockSize -* Generated by the MATLAB randn() function -* ------------------------------------------------------------------- */ - -float32_t testInput_f32[32] = -{ - -0.432564811528221, -1.665584378238097, 0.125332306474831, 0.287676420358549, - -1.146471350681464, 1.190915465642999, 1.189164201652103, -0.037633276593318, - 0.327292361408654, 0.174639142820925, -0.186708577681439, 0.725790548293303, - -0.588316543014189, 2.183185818197101, -0.136395883086596, 0.113931313520810, - 1.066768211359189, 0.059281460523605, -0.095648405483669, -0.832349463650022, - 0.294410816392640, -1.336181857937804, 0.714324551818952, 1.623562064446271, - -0.691775701702287, 0.857996672828263, 1.254001421602532, -1.593729576447477, - -1.440964431901020, 0.571147623658178, -0.399885577715363, 0.689997375464345 - -}; - -/* ---------------------------------------------------------------------- -* Declare Global variables -* ------------------------------------------------------------------- */ -uint32_t blockSize = 32; -float32_t refVarianceOut = 0.903941793931839; - -/* ---------------------------------------------------------------------- -* Variance calculation test -* ------------------------------------------------------------------- */ - -int32_t main(void) -{ - arm_status status; - float32_t mean, oneByBlockSize; - float32_t variance; - float32_t diff; - - status = ARM_MATH_SUCCESS; - - /* Calculation of mean value of input */ - - /* x' = 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ - - /* Fill wire1 buffer with 1.0 value */ - arm_fill_f32(1.0, wire1, blockSize); - - /* Calculate the dot product of wire1 and wire2 */ - /* (x(0)* 1 + x(1) * 1 + ...+ x(n-1) * 1) */ - arm_dot_prod_f32(testInput_f32, wire1, blockSize, &mean); - - /* Calculation of 1/blockSize */ - oneByBlockSize = 1.0 / (blockSize); - - /* 1/blockSize * (x(0)* 1 + x(1) * 1 + ... + x(n-1) * 1) */ - arm_mult_f32(&mean, &oneByBlockSize, &mean, 1); - - - /* Calculation of variance value of input */ - - /* (1/blockSize) * (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ - - /* Fill wire2 with mean value x' */ - arm_fill_f32(mean, wire2, blockSize); - - /* wire3 contains (x-x') */ - arm_sub_f32(testInput_f32, wire2, wire3, blockSize); - - /* wire2 contains (x-x') */ - arm_copy_f32(wire3, wire2, blockSize); - - /* (x(0) - x') * (x(0) - x') + (x(1) - x') * (x(1) - x') + ... + (x(n-1) - x') * (x(n-1) - x') */ - arm_dot_prod_f32(wire2, wire3, blockSize, &variance); - - /* Calculation of 1/blockSize */ - oneByBlockSize = 1.0 / (blockSize - 1); - - /* Calculation of variance */ - arm_mult_f32(&variance, &oneByBlockSize, &variance, 1); - - /* absolute value of difference between ref and test */ - diff = fabsf(refVarianceOut - variance); - - /* Comparison of variance value with reference */ - if(diff > DELTA) - { - status = ARM_MATH_TEST_FAILURE; - } - - if( status != ARM_MATH_SUCCESS) - { - while(1); - } - - while(1); /* main function does not return */ -} - - /** \endlink */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c deleted file mode 100644 index 04edf0c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c +++ /dev/null @@ -1,165 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_abs_f32.c -* -* Description: Vector absolute value. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" -#include - -/** - * @ingroup groupMath - */ - -/** - * @defgroup BasicAbs Vector Absolute Value - * - * Computes the absolute value of a vector on an element-by-element basis. - * - *
        
- *     pDst[n] = abs(pSrc[n]),   0 <= n < blockSize.        
- * 
- * - * The functions support in-place computation allowing the source and - * destination pointers to reference the same memory buffer. - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup BasicAbs - * @{ - */ - -/** - * @brief Floating-point vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - -void arm_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; /* temporary variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = |A| */ - /* Calculate absolute and then store the results in the destination buffer. */ - /* read sample from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - - /* find absolute value */ - in1 = fabsf(in1); - - /* read sample from source */ - in4 = *(pSrc + 3); - - /* find absolute value */ - in2 = fabsf(in2); - - /* read sample from source */ - *pDst = in1; - - /* find absolute value */ - in3 = fabsf(in3); - - /* find absolute value */ - in4 = fabsf(in4); - - /* store result to destination */ - *(pDst + 1) = in2; - - /* store result to destination */ - *(pDst + 2) = in3; - - /* store result to destination */ - *(pDst + 3) = in4; - - - /* Update source pointer to process next sampels */ - pSrc += 4u; - - /* Update destination pointer to process next sampels */ - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = |A| */ - /* Calculate absolute and then store the results in the destination buffer. */ - *pDst++ = fabsf(*pSrc++); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicAbs group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c deleted file mode 100644 index 314054e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c +++ /dev/null @@ -1,179 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_abs_q15.c -* -* Description: Q15 vector absolute value. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAbs - * @{ - */ - -/** - * @brief Q15 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF. - */ - -void arm_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - __SIMD32_TYPE *simd; - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t in1; /* Input value1 */ - q15_t in2; /* Input value2 */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - simd = __SIMD32_CONST(pDst); - while(blkCnt > 0u) - { - /* C = |A| */ - /* Read two inputs */ - in1 = *pSrc++; - in2 = *pSrc++; - - - /* Store the Absolute result in the destination buffer by packing the two values, in a single cycle */ -#ifndef ARM_MATH_BIG_ENDIAN - *simd++ = - __PKHBT(((in1 > 0) ? in1 : (q15_t)__QSUB16(0, in1)), - ((in2 > 0) ? in2 : (q15_t)__QSUB16(0, in2)), 16); - -#else - - - *simd++ = - __PKHBT(((in2 > 0) ? in2 : (q15_t)__QSUB16(0, in2)), - ((in1 > 0) ? in1 : (q15_t)__QSUB16(0, in1)), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - in1 = *pSrc++; - in2 = *pSrc++; - - -#ifndef ARM_MATH_BIG_ENDIAN - - *simd++ = - __PKHBT(((in1 > 0) ? in1 : (q15_t)__QSUB16(0, in1)), - ((in2 > 0) ? in2 : (q15_t)__QSUB16(0, in2)), 16); - -#else - - - *simd++ = - __PKHBT(((in2 > 0) ? in2 : (q15_t)__QSUB16(0, in2)), - ((in1 > 0) ? in1 : (q15_t)__QSUB16(0, in1)), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Decrement the loop counter */ - blkCnt--; - } - pDst = (q15_t *)simd; - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = |A| */ - /* Read the input */ - in1 = *pSrc++; - - /* Calculate absolute value of input and then store the result in the destination buffer. */ - *pDst++ = (in1 > 0) ? in1 : (q15_t)__QSUB16(0, in1); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t in; /* Temporary input variable */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = |A| */ - /* Read the input */ - in = *pSrc++; - - /* Calculate absolute value of input and then store the result in the destination buffer. */ - *pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of BasicAbs group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c deleted file mode 100644 index 0ba2436..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c +++ /dev/null @@ -1,130 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_abs_q31.c -* -* Description: Q31 vector absolute value. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAbs - * @{ - */ - - -/** - * @brief Q31 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF. - */ - -void arm_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - q31_t in; /* Input value */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = |A| */ - /* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - *pDst++ = (in1 > 0) ? in1 : (q31_t)__QSUB(0, in1); - *pDst++ = (in2 > 0) ? in2 : (q31_t)__QSUB(0, in2); - *pDst++ = (in3 > 0) ? in3 : (q31_t)__QSUB(0, in3); - *pDst++ = (in4 > 0) ? in4 : (q31_t)__QSUB(0, in4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = |A| */ - /* Calculate absolute value of the input (if -1 then saturated to 0x7fffffff) and then store the results in the destination buffer. */ - in = *pSrc++; - *pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in); - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of BasicAbs group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c deleted file mode 100644 index 18c341b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c +++ /dev/null @@ -1,157 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_abs_q7.c -* -* Description: Q7 vector absolute value. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAbs - * @{ - */ - -/** - * @brief Q7 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - * - * \par Conditions for optimum performance - * Input and output buffers should be aligned by 32-bit - * - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F. - */ - -void arm_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - q7_t in; /* Input value1 */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; /* temporary input variables */ - q31_t out1, out2, out3, out4; /* temporary output variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = |A| */ - /* Read inputs */ - in1 = (q31_t) * pSrc; - in2 = (q31_t) * (pSrc + 1); - in3 = (q31_t) * (pSrc + 2); - - /* find absolute value */ - out1 = (in1 > 0) ? in1 : (q31_t)__QSUB8(0, in1); - - /* read input */ - in4 = (q31_t) * (pSrc + 3); - - /* find absolute value */ - out2 = (in2 > 0) ? in2 : (q31_t)__QSUB8(0, in2); - - /* store result to destination */ - *pDst = (q7_t) out1; - - /* find absolute value */ - out3 = (in3 > 0) ? in3 : (q31_t)__QSUB8(0, in3); - - /* find absolute value */ - out4 = (in4 > 0) ? in4 : (q31_t)__QSUB8(0, in4); - - /* store result to destination */ - *(pDst + 1) = (q7_t) out2; - - /* store result to destination */ - *(pDst + 2) = (q7_t) out3; - - /* store result to destination */ - *(pDst + 3) = (q7_t) out4; - - /* update pointers to process next samples */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; -#else - - /* Run the below code for Cortex-M0 */ - blkCnt = blockSize; - -#endif /* #define ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = |A| */ - /* Read the input */ - in = *pSrc++; - - /* Store the Absolute result in the destination buffer */ - *pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? 0x7f : -in); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicAbs group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c deleted file mode 100644 index de0e946..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c +++ /dev/null @@ -1,150 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_add_f32.c -* -* Description: Floating-point vector addition. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup BasicAdd Vector Addition - * - * Element-by-element addition of two vectors. - * - *
        
- *     pDst[n] = pSrcA[n] + pSrcB[n],   0 <= n < blockSize.        
- * 
- * - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup BasicAdd - * @{ - */ - -/** - * @brief Floating-point vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - -void arm_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t inA1, inA2, inA3, inA4; /* temporary input variabels */ - float32_t inB1, inB2, inB3, inB4; /* temporary input variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - - /* read four inputs from sourceA and four inputs from sourceB */ - inA1 = *pSrcA; - inB1 = *pSrcB; - inA2 = *(pSrcA + 1); - inB2 = *(pSrcB + 1); - inA3 = *(pSrcA + 2); - inB3 = *(pSrcB + 2); - inA4 = *(pSrcA + 3); - inB4 = *(pSrcB + 3); - - /* C = A + B */ - /* add and store result to destination */ - *pDst = inA1 + inB1; - *(pDst + 1) = inA2 + inB2; - *(pDst + 2) = inA3 + inB3; - *(pDst + 3) = inA4 + inB4; - - /* update pointers to process next samples */ - pSrcA += 4u; - pSrcB += 4u; - pDst += 4u; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (*pSrcA++) + (*pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c deleted file mode 100644 index be5771d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c +++ /dev/null @@ -1,140 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_add_q15.c -* -* Description: Q15 vector addition -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAdd - * @{ - */ - -/** - * @brief Q15 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inB1, inB2; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - inA1 = *__SIMD32(pSrcA)++; - inA2 = *__SIMD32(pSrcA)++; - inB1 = *__SIMD32(pSrcB)++; - inB2 = *__SIMD32(pSrcB)++; - - *__SIMD32(pDst)++ = __QADD16(inA1, inB1); - *__SIMD32(pDst)++ = __QADD16(inA2, inB2); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (q15_t) __QADD16(*pSrcA++, *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ + *pSrcB++), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -} - -/** - * @} end of BasicAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c deleted file mode 100644 index f894677..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_add_q31.c -* -* Description: Q31 vector addition. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAdd - * @{ - */ - - -/** - * @brief Q31 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated. - */ - -void arm_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inA3, inA4; - q31_t inB1, inB2, inB3, inB4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - inA1 = *pSrcA++; - inA2 = *pSrcA++; - inB1 = *pSrcB++; - inB2 = *pSrcB++; - - inA3 = *pSrcA++; - inA4 = *pSrcA++; - inB3 = *pSrcB++; - inB4 = *pSrcB++; - - *pDst++ = __QADD(inA1, inB1); - *pDst++ = __QADD(inA2, inB2); - *pDst++ = __QADD(inA3, inB3); - *pDst++ = __QADD(inA4, inB4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = __QADD(*pSrcA++, *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ + *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of BasicAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c deleted file mode 100644 index ce31b0d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_add_q7.c -* -* Description: Q7 vector addition. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicAdd - * @{ - */ - -/** - * @brief Q7 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. - */ - -void arm_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (q7_t) __SSAT(*pSrcA++ + *pSrcB++, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + B */ - /* Add and then store the results in the destination buffer. */ - *pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ + *pSrcB++, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -} - -/** - * @} end of BasicAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c deleted file mode 100644 index 61a0dc1..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c +++ /dev/null @@ -1,135 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dot_prod_f32.c -* -* Description: Floating-point dot product. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup dot_prod Vector Dot Product - * - * Computes the dot product of two vectors. - * The vectors are multiplied element-by-element and then summed. - * - *
- *     sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
- * 
- * - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup dot_prod - * @{ - */ - -/** - * @brief Dot product of floating-point vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - -void arm_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result) -{ - float32_t sum = 0.0f; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the result in a temporary buffer */ - sum += (*pSrcA++) * (*pSrcB++); - sum += (*pSrcA++) * (*pSrcB++); - sum += (*pSrcA++) * (*pSrcB++); - sum += (*pSrcA++) * (*pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the result in a temporary buffer. */ - sum += (*pSrcA++) * (*pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - /* Store the result back in the destination buffer */ - *result = sum; -} - -/** - * @} end of dot_prod group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c deleted file mode 100644 index c7bdb26..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c +++ /dev/null @@ -1,140 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dot_prod_q15.c -* -* Description: Q15 dot product. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup dot_prod - * @{ - */ - -/** - * @brief Dot product of Q15 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these - * results are added to a 64-bit accumulator in 34.30 format. - * Nonsaturating additions are used and given that there are 33 guard bits in the accumulator - * there is no risk of overflow. - * The return result is in 34.30 format. - */ - -void arm_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result) -{ - q63_t sum = 0; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the result in a temporary buffer. */ - sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum); - sum = __SMLALD(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the results in a temporary buffer. */ - sum = __SMLALD(*pSrcA++, *pSrcB++, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the results in a temporary buffer. */ - sum += (q63_t) ((q31_t) * pSrcA++ * *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Store the result in the destination buffer in 34.30 format */ - *result = sum; - -} - -/** - * @} end of dot_prod group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c deleted file mode 100644 index d372a27..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dot_prod_q31.c -* -* Description: Q31 dot product. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup dot_prod - * @{ - */ - -/** - * @brief Dot product of Q31 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these - * are truncated to 2.48 format by discarding the lower 14 bits. - * The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format. - * There are 15 guard bits in the accumulator and there is no risk of overflow as long as - * the length of the vectors is less than 2^16 elements. - * The return result is in 16.48 format. - */ - -void arm_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result) -{ - q63_t sum = 0; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inA3, inA4; - q31_t inB1, inB2, inB3, inB4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the result in a temporary buffer. */ - inA1 = *pSrcA++; - inA2 = *pSrcA++; - inA3 = *pSrcA++; - inA4 = *pSrcA++; - inB1 = *pSrcB++; - inB2 = *pSrcB++; - inB3 = *pSrcB++; - inB4 = *pSrcB++; - - sum += ((q63_t) inA1 * inB1) >> 14u; - sum += ((q63_t) inA2 * inB2) >> 14u; - sum += ((q63_t) inA3 * inB3) >> 14u; - sum += ((q63_t) inA4 * inB4) >> 14u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Calculate dot product and then store the result in a temporary buffer. */ - sum += ((q63_t) * pSrcA++ * *pSrcB++) >> 14u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Store the result in the destination buffer in 16.48 format */ - *result = sum; -} - -/** - * @} end of dot_prod group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c deleted file mode 100644 index efd7ad2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c +++ /dev/null @@ -1,159 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dot_prod_q7.c -* -* Description: Q7 dot product. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup dot_prod - * @{ - */ - -/** - * @brief Dot product of Q7 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these - * results are added to an accumulator in 18.14 format. - * Nonsaturating additions are used and there is no danger of wrap around as long as - * the vectors are less than 2^18 elements long. - * The return result is in 18.14 format. - */ - -void arm_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result) -{ - uint32_t blkCnt; /* loop counter */ - - q31_t sum = 0; /* Temporary variables to store output */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t input1, input2; /* Temporary variables to store input */ - q31_t inA1, inA2, inB1, inB2; /* Temporary variables to store input */ - - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* read 4 samples at a time from sourceA */ - input1 = *__SIMD32(pSrcA)++; - /* read 4 samples at a time from sourceB */ - input2 = *__SIMD32(pSrcB)++; - - /* extract two q7_t samples to q15_t samples */ - inA1 = __SXTB16(__ROR(input1, 8)); - /* extract reminaing two samples */ - inA2 = __SXTB16(input1); - /* extract two q7_t samples to q15_t samples */ - inB1 = __SXTB16(__ROR(input2, 8)); - /* extract reminaing two samples */ - inB2 = __SXTB16(input2); - - /* multiply and accumulate two samples at a time */ - sum = __SMLAD(inA1, inB1, sum); - sum = __SMLAD(inA2, inB2, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Dot product and then store the results in a temporary buffer. */ - sum = __SMLAD(*pSrcA++, *pSrcB++, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */ - /* Dot product and then store the results in a temporary buffer. */ - sum += (q31_t) ((q15_t) * pSrcA++ * *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - /* Store the result in the destination buffer in 18.14 format */ - *result = sum; -} - -/** - * @} end of dot_prod group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c deleted file mode 100644 index 9e62276..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c +++ /dev/null @@ -1,174 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mult_f32.c -* -* Description: Floating-point vector multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup BasicMult Vector Multiplication - * - * Element-by-element multiplication of two vectors. - * - *
        
- *     pDst[n] = pSrcA[n] * pSrcB[n],   0 <= n < blockSize.        
- * 
- * - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup BasicMult - * @{ - */ - -/** - * @brief Floating-point vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - -void arm_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t inA1, inA2, inA3, inA4; /* temporary input variables */ - float32_t inB1, inB2, inB3, inB4; /* temporary input variables */ - float32_t out1, out2, out3, out4; /* temporary output variables */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and store the results in output buffer */ - /* read sample from sourceA */ - inA1 = *pSrcA; - /* read sample from sourceB */ - inB1 = *pSrcB; - /* read sample from sourceA */ - inA2 = *(pSrcA + 1); - /* read sample from sourceB */ - inB2 = *(pSrcB + 1); - - /* out = sourceA * sourceB */ - out1 = inA1 * inB1; - - /* read sample from sourceA */ - inA3 = *(pSrcA + 2); - /* read sample from sourceB */ - inB3 = *(pSrcB + 2); - - /* out = sourceA * sourceB */ - out2 = inA2 * inB2; - - /* read sample from sourceA */ - inA4 = *(pSrcA + 3); - - /* store result to destination buffer */ - *pDst = out1; - - /* read sample from sourceB */ - inB4 = *(pSrcB + 3); - - /* out = sourceA * sourceB */ - out3 = inA3 * inB3; - - /* store result to destination buffer */ - *(pDst + 1) = out2; - - /* out = sourceA * sourceB */ - out4 = inA4 * inB4; - /* store result to destination buffer */ - *(pDst + 2) = out3; - /* store result to destination buffer */ - *(pDst + 3) = out4; - - - /* update pointers to process next samples */ - pSrcA += 4u; - pSrcB += 4u; - pDst += 4u; - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and store the results in output buffer */ - *pDst++ = (*pSrcA++) * (*pSrcB++); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c deleted file mode 100644 index 4447ee2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_mult_q15.c -* -* Description: Q15 vector multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicMult - * @{ - */ - - -/** - * @brief Q15 vector multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inB1, inB2; /* temporary input variables */ - q15_t out1, out2, out3, out4; /* temporary output variables */ - q31_t mul1, mul2, mul3, mul4; /* temporary variables */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* read two samples at a time from sourceA */ - inA1 = *__SIMD32(pSrcA)++; - /* read two samples at a time from sourceB */ - inB1 = *__SIMD32(pSrcB)++; - /* read two samples at a time from sourceA */ - inA2 = *__SIMD32(pSrcA)++; - /* read two samples at a time from sourceB */ - inB2 = *__SIMD32(pSrcB)++; - - /* multiply mul = sourceA * sourceB */ - mul1 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16)); - mul2 = (q31_t) ((q15_t) inA1 * (q15_t) inB1); - mul3 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB2 >> 16)); - mul4 = (q31_t) ((q15_t) inA2 * (q15_t) inB2); - - /* saturate result to 16 bit */ - out1 = (q15_t) __SSAT(mul1 >> 15, 16); - out2 = (q15_t) __SSAT(mul2 >> 15, 16); - out3 = (q15_t) __SSAT(mul3 >> 15, 16); - out4 = (q15_t) __SSAT(mul4 >> 15, 16); - - /* store the result */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT(out2, out1, 16); - *__SIMD32(pDst)++ = __PKHBT(out4, out3, 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT(out2, out1, 16); - *__SIMD32(pDst)++ = __PKHBT(out4, out3, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and store the result in the destination buffer */ - *pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c deleted file mode 100644 index 14ae82b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c +++ /dev/null @@ -1,160 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mult_q31.c -* -* Description: Q31 vector multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicMult - * @{ - */ - -/** - * @brief Q31 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated. - */ - -void arm_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inA3, inA4; /* temporary input variables */ - q31_t inB1, inB2, inB3, inB4; /* temporary input variables */ - q31_t out1, out2, out3, out4; /* temporary output variables */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and then store the results in the destination buffer. */ - inA1 = *pSrcA++; - inA2 = *pSrcA++; - inA3 = *pSrcA++; - inA4 = *pSrcA++; - inB1 = *pSrcB++; - inB2 = *pSrcB++; - inB3 = *pSrcB++; - inB4 = *pSrcB++; - - out1 = ((q63_t) inA1 * inB1) >> 32; - out2 = ((q63_t) inA2 * inB2) >> 32; - out3 = ((q63_t) inA3 * inB3) >> 32; - out4 = ((q63_t) inA4 * inB4) >> 32; - - out1 = __SSAT(out1, 31); - out2 = __SSAT(out2, 31); - out3 = __SSAT(out3, 31); - out4 = __SSAT(out4, 31); - - *pDst++ = out1 << 1u; - *pDst++ = out2 << 1u; - *pDst++ = out3 << 1u; - *pDst++ = out4 << 1u; - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and then store the results in the destination buffer. */ - inA1 = *pSrcA++; - inB1 = *pSrcB++; - out1 = ((q63_t) inA1 * inB1) >> 32; - out1 = __SSAT(out1, 31); - *pDst++ = out1 << 1u; - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and then store the results in the destination buffer. */ - *pDst++ = - (q31_t) clip_q63_to_q31(((q63_t) (*pSrcA++) * (*pSrcB++)) >> 31); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ -} - -/** - * @} end of BasicMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c deleted file mode 100644 index c1347f5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c +++ /dev/null @@ -1,127 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mult_q7.c -* -* Description: Q7 vector multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicMult - * @{ - */ - -/** - * @brief Q7 vector multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. - */ - -void arm_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q7_t out1, out2, out3, out4; /* Temporary variables to store the product */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and store the results in temporary variables */ - out1 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); - out2 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); - out3 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); - out4 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); - - /* Store the results of 4 inputs in the destination buffer in single cycle by packing */ - *__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A * B */ - /* Multiply the inputs and store the result in the destination buffer */ - *pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c deleted file mode 100644 index 70205ea..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_negate_f32.c -* -* Description: Negates floating-point vectors. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup negate Vector Negate - * - * Negates the elements of a vector. - * - *
        
- *     pDst[n] = -pSrc[n],   0 <= n < blockSize.        
- * 
- * - * The functions support in-place computation allowing the source and - * destination pointers to reference the same memory buffer. - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup negate - * @{ - */ - -/** - * @brief Negates the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - -void arm_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; /* temporary variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* read inputs from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - /* negate the input */ - in1 = -in1; - in2 = -in2; - in3 = -in3; - in4 = -in4; - - /* store the result to destination */ - *pDst = in1; - *(pDst + 1) = in2; - *(pDst + 2) = in3; - *(pDst + 3) = in4; - - /* update pointers to process next samples */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = -A */ - /* Negate and then store the results in the destination buffer. */ - *pDst++ = -*pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of negate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c deleted file mode 100644 index e6d8a96..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c +++ /dev/null @@ -1,142 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_negate_q15.c -* -* Description: Negates Q15 vectors. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup negate - * @{ - */ - -/** - * @brief Negates the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * \par Conditions for optimum performance - * Input and output buffers should be aligned by 32-bit - * - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF. - */ - -void arm_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - q15_t in; - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in1, in2; /* Temporary variables */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = -A */ - /* Read two inputs at a time */ - in1 = _SIMD32_OFFSET(pSrc); - in2 = _SIMD32_OFFSET(pSrc + 2); - - /* negate two samples at a time */ - in1 = __QSUB16(0, in1); - - /* negate two samples at a time */ - in2 = __QSUB16(0, in2); - - /* store the result to destination 2 samples at a time */ - _SIMD32_OFFSET(pDst) = in1; - /* store the result to destination 2 samples at a time */ - _SIMD32_OFFSET(pDst + 2) = in2; - - - /* update pointers to process next samples */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = -A */ - /* Negate and then store the result in the destination buffer. */ - in = *pSrc++; - *pDst++ = (in == (q15_t) 0x8000) ? 0x7fff : -in; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of negate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c deleted file mode 100644 index bab0fe3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c +++ /dev/null @@ -1,129 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_negate_q31.c -* -* Description: Negates Q31 vectors. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup negate - * @{ - */ - -/** - * @brief Negates the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF. - */ - -void arm_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t in; /* Temporary variable */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = -A */ - /* Negate and then store the results in the destination buffer. */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - *pDst++ = __QSUB(0, in1); - *pDst++ = __QSUB(0, in2); - *pDst++ = __QSUB(0, in3); - *pDst++ = __QSUB(0, in4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = -A */ - /* Negate and then store the result in the destination buffer. */ - in = *pSrc++; - *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of negate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c deleted file mode 100644 index 8ceec6a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c +++ /dev/null @@ -1,125 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_negate_q7.c -* -* Description: Negates Q7 vectors. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup negate - * @{ - */ - -/** - * @brief Negates the elements of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F. - */ - -void arm_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - q7_t in; - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t input; /* Input values1-4 */ - q31_t zero = 0x00000000; - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = -A */ - /* Read four inputs */ - input = *__SIMD32(pSrc)++; - - /* Store the Negated results in the destination buffer in a single cycle by packing the results */ - *__SIMD32(pDst)++ = __QSUB8(zero, input); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = -A */ - /* Negate and then store the results in the destination buffer. */ \ - in = *pSrc++; - *pDst++ = (in == (q7_t) 0x80) ? 0x7f : -in; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of negate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c deleted file mode 100644 index 0fc1f7f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c +++ /dev/null @@ -1,165 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_offset_f32.c -* -* Description: Floating-point vector offset. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup offset Vector Offset - * - * Adds a constant offset to each element of a vector. - * - *
        
- *     pDst[n] = pSrc[n] + offset,   0 <= n < blockSize.        
- * 
- * - * The functions support in-place computation allowing the source and - * destination pointers to reference the same memory buffer. - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup offset - * @{ - */ - -/** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - -void arm_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination buffer. */ - /* read samples from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - - /* add offset to input */ - in1 = in1 + offset; - - /* read samples from source */ - in3 = *(pSrc + 2); - - /* add offset to input */ - in2 = in2 + offset; - - /* read samples from source */ - in4 = *(pSrc + 3); - - /* add offset to input */ - in3 = in3 + offset; - - /* store result to destination */ - *pDst = in1; - - /* add offset to input */ - in4 = in4 + offset; - - /* store result to destination */ - *(pDst + 1) = in2; - - /* store result to destination */ - *(pDst + 2) = in3; - - /* store result to destination */ - *(pDst + 3) = in4; - - /* update pointers to process next samples */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the result in the destination buffer. */ - *pDst++ = (*pSrc++) + offset; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of offset group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c deleted file mode 100644 index 72ad128..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_offset_q15.c -* -* Description: Q15 vector offset. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup offset - * @{ - */ - -/** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated. - */ - -void arm_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t offset_packed; /* Offset packed to 32 bit */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Offset is packed to 32 bit in order to use SIMD32 for addition */ - offset_packed = __PKHBT(offset, offset, 16); - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination buffer, 2 samples at a time. */ - *__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed); - *__SIMD32(pDst)++ = __QADD16(*__SIMD32(pSrc)++, offset_packed); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination buffer. */ - *pDst++ = (q15_t) __QADD16(*pSrc++, offset); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination buffer. */ - *pDst++ = (q15_t) __SSAT(((q31_t) * pSrc++ + offset), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of offset group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c deleted file mode 100644 index 376f22b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c +++ /dev/null @@ -1,140 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_offset_q31.c -* -* Description: Q31 vector offset. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup offset - * @{ - */ - -/** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated. - */ - -void arm_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination buffer. */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - *pDst++ = __QADD(in1, offset); - *pDst++ = __QADD(in2, offset); - *pDst++ = __QADD(in3, offset); - *pDst++ = __QADD(in4, offset); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the result in the destination buffer. */ - *pDst++ = __QADD(*pSrc++, offset); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the result in the destination buffer. */ - *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of offset group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c deleted file mode 100644 index 726a734..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c +++ /dev/null @@ -1,135 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_offset_q7.c -* -* Description: Q7 vector offset. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup offset - * @{ - */ - -/** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] are saturated. - */ - -void arm_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t offset_packed; /* Offset packed to 32 bit */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Offset is packed to 32 bit in order to use SIMD32 for addition */ - offset_packed = __PACKq7(offset, offset, offset, offset); - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the results in the destination bufferfor 4 samples at a time. */ - *__SIMD32(pDst)++ = __QADD8(*__SIMD32(pSrc)++, offset_packed); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the result in the destination buffer. */ - *pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A + offset */ - /* Add offset and then store the result in the destination buffer. */ - *pDst++ = (q7_t) __SSAT((q15_t) * pSrc++ + offset, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of offset group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c deleted file mode 100644 index 73edd7d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c +++ /dev/null @@ -1,169 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_scale_f32.c -* -* Description: Multiplies a floating-point vector by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup scale Vector Scale - * - * Multiply a vector by a scalar value. For floating-point data, the algorithm used is: - * - *
        
- *     pDst[n] = pSrc[n] * scale,   0 <= n < blockSize.        
- * 
- * - * In the fixed-point Q7, Q15, and Q31 functions, scale is represented by - * a fractional multiplication scaleFract and an arithmetic shift shift. - * The shift allows the gain of the scaling operation to exceed 1.0. - * The algorithm used with fixed-point data is: - * - *
        
- *     pDst[n] = (pSrc[n] * scaleFract) << shift,   0 <= n < blockSize.        
- * 
- * - * The overall scale factor applied to the fixed-point data is - *
        
- *     scale = scaleFract * 2^shift.        
- * 
- * - * The functions support in-place computation allowing the source and destination - * pointers to reference the same memory buffer. - */ - -/** - * @addtogroup scale - * @{ - */ - -/** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - -void arm_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; /* temporary variabels */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the results in the destination buffer. */ - /* read input samples from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - - /* multiply with scaling factor */ - in1 = in1 * scale; - - /* read input sample from source */ - in3 = *(pSrc + 2); - - /* multiply with scaling factor */ - in2 = in2 * scale; - - /* read input sample from source */ - in4 = *(pSrc + 3); - - /* multiply with scaling factor */ - in3 = in3 * scale; - in4 = in4 * scale; - /* store the result to destination */ - *pDst = in1; - *(pDst + 1) = in2; - *(pDst + 2) = in3; - *(pDst + 3) = in4; - - /* update pointers to process next samples */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - *pDst++ = (*pSrc++) * scale; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of scale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c deleted file mode 100644 index 7071c77..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c +++ /dev/null @@ -1,162 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_scale_q15.c -* -* Description: Multiplies a Q15 vector by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup scale - * @{ - */ - -/** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The input data *pSrc and scaleFract are in 1.15 format. - * These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format. - */ - - -void arm_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize) -{ - int8_t kShift = 15 - shift; /* shift to apply after scaling */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q15_t in1, in2, in3, in4; - q31_t inA1, inA2; /* Temporary variables */ - q31_t out1, out2, out3, out4; - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Reading 2 inputs from memory */ - inA1 = *__SIMD32(pSrc)++; - inA2 = *__SIMD32(pSrc)++; - - /* C = A * scale */ - /* Scale the inputs and then store the 2 results in the destination buffer - * in single cycle by packing the outputs */ - out1 = (q31_t) ((q15_t) (inA1 >> 16) * scaleFract); - out2 = (q31_t) ((q15_t) inA1 * scaleFract); - out3 = (q31_t) ((q15_t) (inA2 >> 16) * scaleFract); - out4 = (q31_t) ((q15_t) inA2 * scaleFract); - - /* apply shifting */ - out1 = out1 >> kShift; - out2 = out2 >> kShift; - out3 = out3 >> kShift; - out4 = out4 >> kShift; - - /* saturate the output */ - in1 = (q15_t) (__SSAT(out1, 16)); - in2 = (q15_t) (__SSAT(out2, 16)); - in3 = (q15_t) (__SSAT(out3, 16)); - in4 = (q15_t) (__SSAT(out4, 16)); - - /* store the result to destination */ - *__SIMD32(pDst)++ = __PKHBT(in2, in1, 16); - *__SIMD32(pDst)++ = __PKHBT(in4, in3, 16); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT(((q31_t) * pSrc++ * scaleFract) >> kShift, 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of scale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c deleted file mode 100644 index bd8b96c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c +++ /dev/null @@ -1,239 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_scale_q31.c -* -* Description: Multiplies a Q31 vector by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup scale - * @{ - */ - -/** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The input data *pSrc and scaleFract are in 1.31 format. - * These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to 1.31 format. - */ - -void arm_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize) -{ - int8_t kShift = shift + 1; /* Shift to apply after scaling */ - int8_t sign = (kShift & 0x80); - uint32_t blkCnt; /* loop counter */ - q31_t in, out; - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in1, in2, in3, in4; /* temporary input variables */ - q31_t out1, out2, out3, out4; /* temporary output variabels */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - if(sign == 0u) - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* read four inputs from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - /* multiply input with scaler value */ - in1 = ((q63_t) in1 * scaleFract) >> 32; - in2 = ((q63_t) in2 * scaleFract) >> 32; - in3 = ((q63_t) in3 * scaleFract) >> 32; - in4 = ((q63_t) in4 * scaleFract) >> 32; - - /* apply shifting */ - out1 = in1 << kShift; - out2 = in2 << kShift; - - /* saturate the results. */ - if(in1 != (out1 >> kShift)) - out1 = 0x7FFFFFFF ^ (in1 >> 31); - - if(in2 != (out2 >> kShift)) - out2 = 0x7FFFFFFF ^ (in2 >> 31); - - out3 = in3 << kShift; - out4 = in4 << kShift; - - *pDst = out1; - *(pDst + 1) = out2; - - if(in3 != (out3 >> kShift)) - out3 = 0x7FFFFFFF ^ (in3 >> 31); - - if(in4 != (out4 >> kShift)) - out4 = 0x7FFFFFFF ^ (in4 >> 31); - - /* Store result destination */ - *(pDst + 2) = out3; - *(pDst + 3) = out4; - - /* Update pointers to process next sampels */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - } - else - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* read four inputs from source */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - /* multiply input with scaler value */ - in1 = ((q63_t) in1 * scaleFract) >> 32; - in2 = ((q63_t) in2 * scaleFract) >> 32; - in3 = ((q63_t) in3 * scaleFract) >> 32; - in4 = ((q63_t) in4 * scaleFract) >> 32; - - /* apply shifting */ - out1 = in1 >> -kShift; - out2 = in2 >> -kShift; - - out3 = in3 >> -kShift; - out4 = in4 >> -kShift; - - /* Store result destination */ - *pDst = out1; - *(pDst + 1) = out2; - - *(pDst + 2) = out3; - *(pDst + 3) = out4; - - /* Update pointers to process next sampels */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - } - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - if(sign == 0) - { - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - in = *pSrc++; - in = ((q63_t) in * scaleFract) >> 32; - - out = in << kShift; - - if(in != (out >> kShift)) - out = 0x7FFFFFFF ^ (in >> 31); - - *pDst++ = out; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - in = *pSrc++; - in = ((q63_t) in * scaleFract) >> 32; - - out = in >> -kShift; - - *pDst++ = out; - - /* Decrement the loop counter */ - blkCnt--; - } - - } -} - -/** - * @} end of scale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c deleted file mode 100644 index c0f71b5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c +++ /dev/null @@ -1,149 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_scale_q7.c -* -* Description: Multiplies a Q7 vector by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup scale - * @{ - */ - -/** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The input data *pSrc and scaleFract are in 1.7 format. - * These are multiplied to yield a 2.14 intermediate result and this is shifted with saturation to 1.7 format. - */ - -void arm_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize) -{ - int8_t kShift = 7 - shift; /* shift to apply after scaling */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q7_t in1, in2, in3, in4, out1, out2, out3, out4; /* Temporary variables to store input & output */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Reading 4 inputs from memory */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - /* C = A * scale */ - /* Scale the inputs and then store the results in the temporary variables. */ - out1 = (q7_t) (__SSAT(((in1) * scaleFract) >> kShift, 8)); - out2 = (q7_t) (__SSAT(((in2) * scaleFract) >> kShift, 8)); - out3 = (q7_t) (__SSAT(((in3) * scaleFract) >> kShift, 8)); - out4 = (q7_t) (__SSAT(((in4) * scaleFract) >> kShift, 8)); - - /* Packing the individual outputs into 32bit and storing in - * destination buffer in single write */ - *__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - *pDst++ = (q7_t) (__SSAT(((*pSrc++) * scaleFract) >> kShift, 8)); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A * scale */ - /* Scale the input and then store the result in the destination buffer. */ - *pDst++ = (q7_t) (__SSAT((((q15_t) * pSrc++ * scaleFract) >> kShift), 8)); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of scale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c deleted file mode 100644 index 6fee000..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c +++ /dev/null @@ -1,248 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_shift_q15.c -* -* Description: Shifts the elements of a Q15 vector by a specified number of bits. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup shift - * @{ - */ - -/** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - uint8_t sign; /* Sign of shiftBits */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t in1, in2; /* Temporary variables */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Getting the sign of shiftBits */ - sign = (shiftBits & 0x80); - - /* If the shift value is positive then do right shift else left shift */ - if(sign == 0u) - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Read 2 inputs */ - in1 = *pSrc++; - in2 = *pSrc++; - /* C = A << shiftBits */ - /* Shift the inputs and then store the results in the destination buffer. */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16), - __SSAT((in2 << shiftBits), 16), 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16), - __SSAT((in1 << shiftBits), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - in1 = *pSrc++; - in2 = *pSrc++; - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16), - __SSAT((in2 << shiftBits), 16), 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16), - __SSAT((in1 << shiftBits), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Shift and then store the results in the destination buffer. */ - *pDst++ = __SSAT((*pSrc++ << shiftBits), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Read 2 inputs */ - in1 = *pSrc++; - in2 = *pSrc++; - - /* C = A >> shiftBits */ - /* Shift the inputs and then store the results in the destination buffer. */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits), - (in2 >> -shiftBits), 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits), - (in1 >> -shiftBits), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - in1 = *pSrc++; - in2 = *pSrc++; - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits), - (in2 >> -shiftBits), 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits), - (in1 >> -shiftBits), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Shift the inputs and then store the results in the destination buffer. */ - *pDst++ = (*pSrc++ >> -shiftBits); - - /* Decrement the loop counter */ - blkCnt--; - } - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Getting the sign of shiftBits */ - sign = (shiftBits & 0x80); - - /* If the shift value is positive then do right shift else left shift */ - if(sign == 0u) - { - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Shift and then store the results in the destination buffer. */ - *pDst++ = __SSAT(((q31_t) * pSrc++ << shiftBits), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Shift the inputs and then store the results in the destination buffer. */ - *pDst++ = (*pSrc++ >> -shiftBits); - - /* Decrement the loop counter */ - blkCnt--; - } - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of shift group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c deleted file mode 100644 index e1bb570..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c +++ /dev/null @@ -1,203 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_shift_q31.c -* -* Description: Shifts the elements of a Q31 vector by a specified number of bits. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ -/** - * @defgroup shift Vector Shift - * - * Shifts the elements of a fixed-point vector by a specified number of bits. - * There are separate functions for Q7, Q15, and Q31 data types. - * The underlying algorithm used is: - * - *
        
- *     pDst[n] = pSrc[n] << shift,   0 <= n < blockSize.        
- * 
- * - * If shift is positive then the elements of the vector are shifted to the left. - * If shift is negative then the elements of the vector are shifted to the right. - * - * The functions support in-place computation allowing the source and destination - * pointers to reference the same memory buffer. - */ - -/** - * @addtogroup shift - * @{ - */ - -/** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated. - */ - -void arm_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - uint8_t sign = (shiftBits & 0x80); /* Sign of shiftBits */ - -#ifndef ARM_MATH_CM0_FAMILY - - q31_t in1, in2, in3, in4; /* Temporary input variables */ - q31_t out1, out2, out3, out4; /* Temporary output variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - - if(sign == 0u) - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Shift the input and then store the results in the destination buffer. */ - in1 = *pSrc; - in2 = *(pSrc + 1); - out1 = in1 << shiftBits; - in3 = *(pSrc + 2); - out2 = in2 << shiftBits; - in4 = *(pSrc + 3); - if(in1 != (out1 >> shiftBits)) - out1 = 0x7FFFFFFF ^ (in1 >> 31); - - if(in2 != (out2 >> shiftBits)) - out2 = 0x7FFFFFFF ^ (in2 >> 31); - - *pDst = out1; - out3 = in3 << shiftBits; - *(pDst + 1) = out2; - out4 = in4 << shiftBits; - - if(in3 != (out3 >> shiftBits)) - out3 = 0x7FFFFFFF ^ (in3 >> 31); - - if(in4 != (out4 >> shiftBits)) - out4 = 0x7FFFFFFF ^ (in4 >> 31); - - *(pDst + 2) = out3; - *(pDst + 3) = out4; - - /* Update destination pointer to process next sampels */ - pSrc += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Shift the input and then store the results in the destination buffer. */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - *pDst = (in1 >> -shiftBits); - *(pDst + 1) = (in2 >> -shiftBits); - *(pDst + 2) = (in3 >> -shiftBits); - *(pDst + 3) = (in4 >> -shiftBits); - - - pSrc += 4u; - pDst += 4u; - - blkCnt--; - } - - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A (>> or <<) shiftBits */ - /* Shift the input and then store the result in the destination buffer. */ - *pDst++ = (sign == 0u) ? clip_q63_to_q31((q63_t) * pSrc++ << shiftBits) : - (*pSrc++ >> -shiftBits); - - /* Decrement the loop counter */ - blkCnt--; - } - - -} - -/** - * @} end of shift group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c deleted file mode 100644 index 20ae427..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c +++ /dev/null @@ -1,220 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_shift_q7.c -* -* Description: Processing function for the Q7 Shifting -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup shift - * @{ - */ - - -/** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - * - * \par Conditions for optimum performance - * Input and output buffers should be aligned by 32-bit - * - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x8 0x7F] will be saturated. - */ - -void arm_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - uint8_t sign; /* Sign of shiftBits */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q7_t in1; /* Input value1 */ - q7_t in2; /* Input value2 */ - q7_t in3; /* Input value3 */ - q7_t in4; /* Input value4 */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Getting the sign of shiftBits */ - sign = (shiftBits & 0x80); - - /* If the shift value is positive then do right shift else left shift */ - if(sign == 0u) - { - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Read 4 inputs */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - /* Store the Shifted result in the destination buffer in single cycle by packing the outputs */ - *__SIMD32(pDst)++ = __PACKq7(__SSAT((in1 << shiftBits), 8), - __SSAT((in2 << shiftBits), 8), - __SSAT((in3 << shiftBits), 8), - __SSAT((in4 << shiftBits), 8)); - /* Update source pointer to process next sampels */ - pSrc += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Shift the input and then store the result in the destination buffer. */ - *pDst++ = (q7_t) __SSAT((*pSrc++ << shiftBits), 8); - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - shiftBits = -shiftBits; - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Read 4 inputs */ - in1 = *pSrc; - in2 = *(pSrc + 1); - in3 = *(pSrc + 2); - in4 = *(pSrc + 3); - - /* Store the Shifted result in the destination buffer in single cycle by packing the outputs */ - *__SIMD32(pDst)++ = __PACKq7((in1 >> shiftBits), (in2 >> shiftBits), - (in3 >> shiftBits), (in4 >> shiftBits)); - - - pSrc += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Shift the input and then store the result in the destination buffer. */ - in1 = *pSrc++; - *pDst++ = (in1 >> shiftBits); - - /* Decrement the loop counter */ - blkCnt--; - } - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Getting the sign of shiftBits */ - sign = (shiftBits & 0x80); - - /* If the shift value is positive then do right shift else left shift */ - if(sign == 0u) - { - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A << shiftBits */ - /* Shift the input and then store the result in the destination buffer. */ - *pDst++ = (q7_t) __SSAT(((q15_t) * pSrc++ << shiftBits), 8); - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A >> shiftBits */ - /* Shift the input and then store the result in the destination buffer. */ - *pDst++ = (*pSrc++ >> -shiftBits); - - /* Decrement the loop counter */ - blkCnt--; - } - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ -} - -/** - * @} end of shift group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c deleted file mode 100644 index 90ad37a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c +++ /dev/null @@ -1,150 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sub_f32.c -* -* Description: Floating-point vector subtraction. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @defgroup BasicSub Vector Subtraction - * - * Element-by-element subtraction of two vectors. - * - *
        
- *     pDst[n] = pSrcA[n] - pSrcB[n],   0 <= n < blockSize.        
- * 
- * - * There are separate functions for floating-point, Q7, Q15, and Q31 data types. - */ - -/** - * @addtogroup BasicSub - * @{ - */ - - -/** - * @brief Floating-point vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - -void arm_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t inA1, inA2, inA3, inA4; /* temporary variables */ - float32_t inB1, inB2, inB3, inB4; /* temporary variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the results in the destination buffer. */ - /* Read 4 input samples from sourceA and sourceB */ - inA1 = *pSrcA; - inB1 = *pSrcB; - inA2 = *(pSrcA + 1); - inB2 = *(pSrcB + 1); - inA3 = *(pSrcA + 2); - inB3 = *(pSrcB + 2); - inA4 = *(pSrcA + 3); - inB4 = *(pSrcB + 3); - - /* dst = srcA - srcB */ - /* subtract and store the result */ - *pDst = inA1 - inB1; - *(pDst + 1) = inA2 - inB2; - *(pDst + 2) = inA3 - inB3; - *(pDst + 3) = inA4 - inB4; - - - /* Update pointers to process next sampels */ - pSrcA += 4u; - pSrcB += 4u; - pDst += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the results in the destination buffer. */ - *pDst++ = (*pSrcA++) - (*pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c deleted file mode 100644 index 1f66b6d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c +++ /dev/null @@ -1,140 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sub_q15.c -* -* Description: Q15 vector subtraction. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicSub - * @{ - */ - -/** - * @brief Q15 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2; - q31_t inB1, inB2; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the results in the destination buffer two samples at a time. */ - inA1 = *__SIMD32(pSrcA)++; - inA2 = *__SIMD32(pSrcA)++; - inB1 = *__SIMD32(pSrcB)++; - inB2 = *__SIMD32(pSrcB)++; - - *__SIMD32(pDst)++ = __QSUB16(inA1, inB1); - *__SIMD32(pDst)++ = __QSUB16(inA2, inB2); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = (q15_t) __QSUB16(*pSrcA++, *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = (q15_t) __SSAT(((q31_t) * pSrcA++ - *pSrcB++), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -} - -/** - * @} end of BasicSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c deleted file mode 100644 index e37f790..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sub_q31.c -* -* Description: Q31 vector subtraction. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicSub - * @{ - */ - -/** - * @brief Q31 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated. - */ - -void arm_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inA3, inA4; - q31_t inB1, inB2, inB3, inB4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the results in the destination buffer. */ - inA1 = *pSrcA++; - inA2 = *pSrcA++; - inB1 = *pSrcB++; - inB2 = *pSrcB++; - - inA3 = *pSrcA++; - inA4 = *pSrcA++; - inB3 = *pSrcB++; - inB4 = *pSrcB++; - - *pDst++ = __QSUB(inA1, inB1); - *pDst++ = __QSUB(inA2, inB2); - *pDst++ = __QSUB(inA3, inB3); - *pDst++ = __QSUB(inA4, inB4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = __QSUB(*pSrcA++, *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrcA++ - *pSrcB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of BasicSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c deleted file mode 100644 index 00ce32b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sub_q7.c -* -* Description: Q7 vector subtraction. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMath - */ - -/** - * @addtogroup BasicSub - * @{ - */ - -/** - * @brief Q7 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. - */ - -void arm_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the results in the destination buffer 4 samples at a time. */ - *__SIMD32(pDst)++ = __QSUB8(*__SIMD32(pSrcA)++, *__SIMD32(pSrcB)++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = __SSAT(*pSrcA++ - *pSrcB++, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A - B */ - /* Subtract and then store the result in the destination buffer. */ - *pDst++ = (q7_t) __SSAT((q15_t) * pSrcA++ - *pSrcB++, 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -} - -/** - * @} end of BasicSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c b/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c deleted file mode 100644 index 4debe4b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c +++ /dev/null @@ -1,27251 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_common_tables.c -* -* Description: This file has common tables like fft twiddle factors, Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup CFFT_CIFFT Complex FFT Tables - * @{ - */ - -/** -* \par -* Pseudo code for Generation of Bit reversal Table is -* \par -*
for(l=1;l <= N/4;l++)    
-* {    
-*   for(i=0;i> 1;    
-*  } 
-* \par -* where N = 4096 logN2 = 12 -* \par -* N is the maximum FFT Size supported -*/ - -/* -* @brief Table for bit reversal process -*/ -const uint16_t armBitRevTable[1024] = { - 0x400, 0x200, 0x600, 0x100, 0x500, 0x300, 0x700, 0x80, 0x480, 0x280, - 0x680, 0x180, 0x580, 0x380, 0x780, 0x40, 0x440, 0x240, 0x640, 0x140, - 0x540, 0x340, 0x740, 0xc0, 0x4c0, 0x2c0, 0x6c0, 0x1c0, 0x5c0, 0x3c0, - 0x7c0, 0x20, 0x420, 0x220, 0x620, 0x120, 0x520, 0x320, 0x720, 0xa0, - 0x4a0, 0x2a0, 0x6a0, 0x1a0, 0x5a0, 0x3a0, 0x7a0, 0x60, 0x460, 0x260, - 0x660, 0x160, 0x560, 0x360, 0x760, 0xe0, 0x4e0, 0x2e0, 0x6e0, 0x1e0, - 0x5e0, 0x3e0, 0x7e0, 0x10, 0x410, 0x210, 0x610, 0x110, 0x510, 0x310, - 0x710, 0x90, 0x490, 0x290, 0x690, 0x190, 0x590, 0x390, 0x790, 0x50, - 0x450, 0x250, 0x650, 0x150, 0x550, 0x350, 0x750, 0xd0, 0x4d0, 0x2d0, - 0x6d0, 0x1d0, 0x5d0, 0x3d0, 0x7d0, 0x30, 0x430, 0x230, 0x630, 0x130, - 0x530, 0x330, 0x730, 0xb0, 0x4b0, 0x2b0, 0x6b0, 0x1b0, 0x5b0, 0x3b0, - 0x7b0, 0x70, 0x470, 0x270, 0x670, 0x170, 0x570, 0x370, 0x770, 0xf0, - 0x4f0, 0x2f0, 0x6f0, 0x1f0, 0x5f0, 0x3f0, 0x7f0, 0x8, 0x408, 0x208, - 0x608, 0x108, 0x508, 0x308, 0x708, 0x88, 0x488, 0x288, 0x688, 0x188, - 0x588, 0x388, 0x788, 0x48, 0x448, 0x248, 0x648, 0x148, 0x548, 0x348, - 0x748, 0xc8, 0x4c8, 0x2c8, 0x6c8, 0x1c8, 0x5c8, 0x3c8, 0x7c8, 0x28, - 0x428, 0x228, 0x628, 0x128, 0x528, 0x328, 0x728, 0xa8, 0x4a8, 0x2a8, - 0x6a8, 0x1a8, 0x5a8, 0x3a8, 0x7a8, 0x68, 0x468, 0x268, 0x668, 0x168, - 0x568, 0x368, 0x768, 0xe8, 0x4e8, 0x2e8, 0x6e8, 0x1e8, 0x5e8, 0x3e8, - 0x7e8, 0x18, 0x418, 0x218, 0x618, 0x118, 0x518, 0x318, 0x718, 0x98, - 0x498, 0x298, 0x698, 0x198, 0x598, 0x398, 0x798, 0x58, 0x458, 0x258, - 0x658, 0x158, 0x558, 0x358, 0x758, 0xd8, 0x4d8, 0x2d8, 0x6d8, 0x1d8, - 0x5d8, 0x3d8, 0x7d8, 0x38, 0x438, 0x238, 0x638, 0x138, 0x538, 0x338, - 0x738, 0xb8, 0x4b8, 0x2b8, 0x6b8, 0x1b8, 0x5b8, 0x3b8, 0x7b8, 0x78, - 0x478, 0x278, 0x678, 0x178, 0x578, 0x378, 0x778, 0xf8, 0x4f8, 0x2f8, - 0x6f8, 0x1f8, 0x5f8, 0x3f8, 0x7f8, 0x4, 0x404, 0x204, 0x604, 0x104, - 0x504, 0x304, 0x704, 0x84, 0x484, 0x284, 0x684, 0x184, 0x584, 0x384, - 0x784, 0x44, 0x444, 0x244, 0x644, 0x144, 0x544, 0x344, 0x744, 0xc4, - 0x4c4, 0x2c4, 0x6c4, 0x1c4, 0x5c4, 0x3c4, 0x7c4, 0x24, 0x424, 0x224, - 0x624, 0x124, 0x524, 0x324, 0x724, 0xa4, 0x4a4, 0x2a4, 0x6a4, 0x1a4, - 0x5a4, 0x3a4, 0x7a4, 0x64, 0x464, 0x264, 0x664, 0x164, 0x564, 0x364, - 0x764, 0xe4, 0x4e4, 0x2e4, 0x6e4, 0x1e4, 0x5e4, 0x3e4, 0x7e4, 0x14, - 0x414, 0x214, 0x614, 0x114, 0x514, 0x314, 0x714, 0x94, 0x494, 0x294, - 0x694, 0x194, 0x594, 0x394, 0x794, 0x54, 0x454, 0x254, 0x654, 0x154, - 0x554, 0x354, 0x754, 0xd4, 0x4d4, 0x2d4, 0x6d4, 0x1d4, 0x5d4, 0x3d4, - 0x7d4, 0x34, 0x434, 0x234, 0x634, 0x134, 0x534, 0x334, 0x734, 0xb4, - 0x4b4, 0x2b4, 0x6b4, 0x1b4, 0x5b4, 0x3b4, 0x7b4, 0x74, 0x474, 0x274, - 0x674, 0x174, 0x574, 0x374, 0x774, 0xf4, 0x4f4, 0x2f4, 0x6f4, 0x1f4, - 0x5f4, 0x3f4, 0x7f4, 0xc, 0x40c, 0x20c, 0x60c, 0x10c, 0x50c, 0x30c, - 0x70c, 0x8c, 0x48c, 0x28c, 0x68c, 0x18c, 0x58c, 0x38c, 0x78c, 0x4c, - 0x44c, 0x24c, 0x64c, 0x14c, 0x54c, 0x34c, 0x74c, 0xcc, 0x4cc, 0x2cc, - 0x6cc, 0x1cc, 0x5cc, 0x3cc, 0x7cc, 0x2c, 0x42c, 0x22c, 0x62c, 0x12c, - 0x52c, 0x32c, 0x72c, 0xac, 0x4ac, 0x2ac, 0x6ac, 0x1ac, 0x5ac, 0x3ac, - 0x7ac, 0x6c, 0x46c, 0x26c, 0x66c, 0x16c, 0x56c, 0x36c, 0x76c, 0xec, - 0x4ec, 0x2ec, 0x6ec, 0x1ec, 0x5ec, 0x3ec, 0x7ec, 0x1c, 0x41c, 0x21c, - 0x61c, 0x11c, 0x51c, 0x31c, 0x71c, 0x9c, 0x49c, 0x29c, 0x69c, 0x19c, - 0x59c, 0x39c, 0x79c, 0x5c, 0x45c, 0x25c, 0x65c, 0x15c, 0x55c, 0x35c, - 0x75c, 0xdc, 0x4dc, 0x2dc, 0x6dc, 0x1dc, 0x5dc, 0x3dc, 0x7dc, 0x3c, - 0x43c, 0x23c, 0x63c, 0x13c, 0x53c, 0x33c, 0x73c, 0xbc, 0x4bc, 0x2bc, - 0x6bc, 0x1bc, 0x5bc, 0x3bc, 0x7bc, 0x7c, 0x47c, 0x27c, 0x67c, 0x17c, - 0x57c, 0x37c, 0x77c, 0xfc, 0x4fc, 0x2fc, 0x6fc, 0x1fc, 0x5fc, 0x3fc, - 0x7fc, 0x2, 0x402, 0x202, 0x602, 0x102, 0x502, 0x302, 0x702, 0x82, - 0x482, 0x282, 0x682, 0x182, 0x582, 0x382, 0x782, 0x42, 0x442, 0x242, - 0x642, 0x142, 0x542, 0x342, 0x742, 0xc2, 0x4c2, 0x2c2, 0x6c2, 0x1c2, - 0x5c2, 0x3c2, 0x7c2, 0x22, 0x422, 0x222, 0x622, 0x122, 0x522, 0x322, - 0x722, 0xa2, 0x4a2, 0x2a2, 0x6a2, 0x1a2, 0x5a2, 0x3a2, 0x7a2, 0x62, - 0x462, 0x262, 0x662, 0x162, 0x562, 0x362, 0x762, 0xe2, 0x4e2, 0x2e2, - 0x6e2, 0x1e2, 0x5e2, 0x3e2, 0x7e2, 0x12, 0x412, 0x212, 0x612, 0x112, - 0x512, 0x312, 0x712, 0x92, 0x492, 0x292, 0x692, 0x192, 0x592, 0x392, - 0x792, 0x52, 0x452, 0x252, 0x652, 0x152, 0x552, 0x352, 0x752, 0xd2, - 0x4d2, 0x2d2, 0x6d2, 0x1d2, 0x5d2, 0x3d2, 0x7d2, 0x32, 0x432, 0x232, - 0x632, 0x132, 0x532, 0x332, 0x732, 0xb2, 0x4b2, 0x2b2, 0x6b2, 0x1b2, - 0x5b2, 0x3b2, 0x7b2, 0x72, 0x472, 0x272, 0x672, 0x172, 0x572, 0x372, - 0x772, 0xf2, 0x4f2, 0x2f2, 0x6f2, 0x1f2, 0x5f2, 0x3f2, 0x7f2, 0xa, - 0x40a, 0x20a, 0x60a, 0x10a, 0x50a, 0x30a, 0x70a, 0x8a, 0x48a, 0x28a, - 0x68a, 0x18a, 0x58a, 0x38a, 0x78a, 0x4a, 0x44a, 0x24a, 0x64a, 0x14a, - 0x54a, 0x34a, 0x74a, 0xca, 0x4ca, 0x2ca, 0x6ca, 0x1ca, 0x5ca, 0x3ca, - 0x7ca, 0x2a, 0x42a, 0x22a, 0x62a, 0x12a, 0x52a, 0x32a, 0x72a, 0xaa, - 0x4aa, 0x2aa, 0x6aa, 0x1aa, 0x5aa, 0x3aa, 0x7aa, 0x6a, 0x46a, 0x26a, - 0x66a, 0x16a, 0x56a, 0x36a, 0x76a, 0xea, 0x4ea, 0x2ea, 0x6ea, 0x1ea, - 0x5ea, 0x3ea, 0x7ea, 0x1a, 0x41a, 0x21a, 0x61a, 0x11a, 0x51a, 0x31a, - 0x71a, 0x9a, 0x49a, 0x29a, 0x69a, 0x19a, 0x59a, 0x39a, 0x79a, 0x5a, - 0x45a, 0x25a, 0x65a, 0x15a, 0x55a, 0x35a, 0x75a, 0xda, 0x4da, 0x2da, - 0x6da, 0x1da, 0x5da, 0x3da, 0x7da, 0x3a, 0x43a, 0x23a, 0x63a, 0x13a, - 0x53a, 0x33a, 0x73a, 0xba, 0x4ba, 0x2ba, 0x6ba, 0x1ba, 0x5ba, 0x3ba, - 0x7ba, 0x7a, 0x47a, 0x27a, 0x67a, 0x17a, 0x57a, 0x37a, 0x77a, 0xfa, - 0x4fa, 0x2fa, 0x6fa, 0x1fa, 0x5fa, 0x3fa, 0x7fa, 0x6, 0x406, 0x206, - 0x606, 0x106, 0x506, 0x306, 0x706, 0x86, 0x486, 0x286, 0x686, 0x186, - 0x586, 0x386, 0x786, 0x46, 0x446, 0x246, 0x646, 0x146, 0x546, 0x346, - 0x746, 0xc6, 0x4c6, 0x2c6, 0x6c6, 0x1c6, 0x5c6, 0x3c6, 0x7c6, 0x26, - 0x426, 0x226, 0x626, 0x126, 0x526, 0x326, 0x726, 0xa6, 0x4a6, 0x2a6, - 0x6a6, 0x1a6, 0x5a6, 0x3a6, 0x7a6, 0x66, 0x466, 0x266, 0x666, 0x166, - 0x566, 0x366, 0x766, 0xe6, 0x4e6, 0x2e6, 0x6e6, 0x1e6, 0x5e6, 0x3e6, - 0x7e6, 0x16, 0x416, 0x216, 0x616, 0x116, 0x516, 0x316, 0x716, 0x96, - 0x496, 0x296, 0x696, 0x196, 0x596, 0x396, 0x796, 0x56, 0x456, 0x256, - 0x656, 0x156, 0x556, 0x356, 0x756, 0xd6, 0x4d6, 0x2d6, 0x6d6, 0x1d6, - 0x5d6, 0x3d6, 0x7d6, 0x36, 0x436, 0x236, 0x636, 0x136, 0x536, 0x336, - 0x736, 0xb6, 0x4b6, 0x2b6, 0x6b6, 0x1b6, 0x5b6, 0x3b6, 0x7b6, 0x76, - 0x476, 0x276, 0x676, 0x176, 0x576, 0x376, 0x776, 0xf6, 0x4f6, 0x2f6, - 0x6f6, 0x1f6, 0x5f6, 0x3f6, 0x7f6, 0xe, 0x40e, 0x20e, 0x60e, 0x10e, - 0x50e, 0x30e, 0x70e, 0x8e, 0x48e, 0x28e, 0x68e, 0x18e, 0x58e, 0x38e, - 0x78e, 0x4e, 0x44e, 0x24e, 0x64e, 0x14e, 0x54e, 0x34e, 0x74e, 0xce, - 0x4ce, 0x2ce, 0x6ce, 0x1ce, 0x5ce, 0x3ce, 0x7ce, 0x2e, 0x42e, 0x22e, - 0x62e, 0x12e, 0x52e, 0x32e, 0x72e, 0xae, 0x4ae, 0x2ae, 0x6ae, 0x1ae, - 0x5ae, 0x3ae, 0x7ae, 0x6e, 0x46e, 0x26e, 0x66e, 0x16e, 0x56e, 0x36e, - 0x76e, 0xee, 0x4ee, 0x2ee, 0x6ee, 0x1ee, 0x5ee, 0x3ee, 0x7ee, 0x1e, - 0x41e, 0x21e, 0x61e, 0x11e, 0x51e, 0x31e, 0x71e, 0x9e, 0x49e, 0x29e, - 0x69e, 0x19e, 0x59e, 0x39e, 0x79e, 0x5e, 0x45e, 0x25e, 0x65e, 0x15e, - 0x55e, 0x35e, 0x75e, 0xde, 0x4de, 0x2de, 0x6de, 0x1de, 0x5de, 0x3de, - 0x7de, 0x3e, 0x43e, 0x23e, 0x63e, 0x13e, 0x53e, 0x33e, 0x73e, 0xbe, - 0x4be, 0x2be, 0x6be, 0x1be, 0x5be, 0x3be, 0x7be, 0x7e, 0x47e, 0x27e, - 0x67e, 0x17e, 0x57e, 0x37e, 0x77e, 0xfe, 0x4fe, 0x2fe, 0x6fe, 0x1fe, - 0x5fe, 0x3fe, 0x7fe, 0x1 -}; - - -/* -* @brief Floating-point Twiddle factors Table Generation -*/ - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 16 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_16[32] = { - 1.000000000f, 0.000000000f, - 0.923879533f, 0.382683432f, - 0.707106781f, 0.707106781f, - 0.382683432f, 0.923879533f, - 0.000000000f, 1.000000000f, - -0.382683432f, 0.923879533f, - -0.707106781f, 0.707106781f, - -0.923879533f, 0.382683432f, - -1.000000000f, 0.000000000f, - -0.923879533f, -0.382683432f, - -0.707106781f, -0.707106781f, - -0.382683432f, -0.923879533f, - -0.000000000f, -1.000000000f, - 0.382683432f, -0.923879533f, - 0.707106781f, -0.707106781f, - 0.923879533f, -0.382683432f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 32 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_32[64] = { - 1.000000000f, 0.000000000f, - 0.980785280f, 0.195090322f, - 0.923879533f, 0.382683432f, - 0.831469612f, 0.555570233f, - 0.707106781f, 0.707106781f, - 0.555570233f, 0.831469612f, - 0.382683432f, 0.923879533f, - 0.195090322f, 0.980785280f, - 0.000000000f, 1.000000000f, - -0.195090322f, 0.980785280f, - -0.382683432f, 0.923879533f, - -0.555570233f, 0.831469612f, - -0.707106781f, 0.707106781f, - -0.831469612f, 0.555570233f, - -0.923879533f, 0.382683432f, - -0.980785280f, 0.195090322f, - -1.000000000f, 0.000000000f, - -0.980785280f, -0.195090322f, - -0.923879533f, -0.382683432f, - -0.831469612f, -0.555570233f, - -0.707106781f, -0.707106781f, - -0.555570233f, -0.831469612f, - -0.382683432f, -0.923879533f, - -0.195090322f, -0.980785280f, - -0.000000000f, -1.000000000f, - 0.195090322f, -0.980785280f, - 0.382683432f, -0.923879533f, - 0.555570233f, -0.831469612f, - 0.707106781f, -0.707106781f, - 0.831469612f, -0.555570233f, - 0.923879533f, -0.382683432f, - 0.980785280f, -0.195090322f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 64 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_64[128] = { - 1.000000000f, 0.000000000f, - 0.995184727f, 0.098017140f, - 0.980785280f, 0.195090322f, - 0.956940336f, 0.290284677f, - 0.923879533f, 0.382683432f, - 0.881921264f, 0.471396737f, - 0.831469612f, 0.555570233f, - 0.773010453f, 0.634393284f, - 0.707106781f, 0.707106781f, - 0.634393284f, 0.773010453f, - 0.555570233f, 0.831469612f, - 0.471396737f, 0.881921264f, - 0.382683432f, 0.923879533f, - 0.290284677f, 0.956940336f, - 0.195090322f, 0.980785280f, - 0.098017140f, 0.995184727f, - 0.000000000f, 1.000000000f, - -0.098017140f, 0.995184727f, - -0.195090322f, 0.980785280f, - -0.290284677f, 0.956940336f, - -0.382683432f, 0.923879533f, - -0.471396737f, 0.881921264f, - -0.555570233f, 0.831469612f, - -0.634393284f, 0.773010453f, - -0.707106781f, 0.707106781f, - -0.773010453f, 0.634393284f, - -0.831469612f, 0.555570233f, - -0.881921264f, 0.471396737f, - -0.923879533f, 0.382683432f, - -0.956940336f, 0.290284677f, - -0.980785280f, 0.195090322f, - -0.995184727f, 0.098017140f, - -1.000000000f, 0.000000000f, - -0.995184727f, -0.098017140f, - -0.980785280f, -0.195090322f, - -0.956940336f, -0.290284677f, - -0.923879533f, -0.382683432f, - -0.881921264f, -0.471396737f, - -0.831469612f, -0.555570233f, - -0.773010453f, -0.634393284f, - -0.707106781f, -0.707106781f, - -0.634393284f, -0.773010453f, - -0.555570233f, -0.831469612f, - -0.471396737f, -0.881921264f, - -0.382683432f, -0.923879533f, - -0.290284677f, -0.956940336f, - -0.195090322f, -0.980785280f, - -0.098017140f, -0.995184727f, - -0.000000000f, -1.000000000f, - 0.098017140f, -0.995184727f, - 0.195090322f, -0.980785280f, - 0.290284677f, -0.956940336f, - 0.382683432f, -0.923879533f, - 0.471396737f, -0.881921264f, - 0.555570233f, -0.831469612f, - 0.634393284f, -0.773010453f, - 0.707106781f, -0.707106781f, - 0.773010453f, -0.634393284f, - 0.831469612f, -0.555570233f, - 0.881921264f, -0.471396737f, - 0.923879533f, -0.382683432f, - 0.956940336f, -0.290284677f, - 0.980785280f, -0.195090322f, - 0.995184727f, -0.098017140f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 128 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ - -const float32_t twiddleCoef_128[256] = { - 1.000000000f , 0.000000000f , - 0.998795456f , 0.049067674f , - 0.995184727f , 0.098017140f , - 0.989176510f , 0.146730474f , - 0.980785280f , 0.195090322f , - 0.970031253f , 0.242980180f , - 0.956940336f , 0.290284677f , - 0.941544065f , 0.336889853f , - 0.923879533f , 0.382683432f , - 0.903989293f , 0.427555093f , - 0.881921264f , 0.471396737f , - 0.857728610f , 0.514102744f , - 0.831469612f , 0.555570233f , - 0.803207531f , 0.595699304f , - 0.773010453f , 0.634393284f , - 0.740951125f , 0.671558955f , - 0.707106781f , 0.707106781f , - 0.671558955f , 0.740951125f , - 0.634393284f , 0.773010453f , - 0.595699304f , 0.803207531f , - 0.555570233f , 0.831469612f , - 0.514102744f , 0.857728610f , - 0.471396737f , 0.881921264f , - 0.427555093f , 0.903989293f , - 0.382683432f , 0.923879533f , - 0.336889853f , 0.941544065f , - 0.290284677f , 0.956940336f , - 0.242980180f , 0.970031253f , - 0.195090322f , 0.980785280f , - 0.146730474f , 0.989176510f , - 0.098017140f , 0.995184727f , - 0.049067674f , 0.998795456f , - 0.000000000f , 1.000000000f , - -0.049067674f , 0.998795456f , - -0.098017140f , 0.995184727f , - -0.146730474f , 0.989176510f , - -0.195090322f , 0.980785280f , - -0.242980180f , 0.970031253f , - -0.290284677f , 0.956940336f , - -0.336889853f , 0.941544065f , - -0.382683432f , 0.923879533f , - -0.427555093f , 0.903989293f , - -0.471396737f , 0.881921264f , - -0.514102744f , 0.857728610f , - -0.555570233f , 0.831469612f , - -0.595699304f , 0.803207531f , - -0.634393284f , 0.773010453f , - -0.671558955f , 0.740951125f , - -0.707106781f , 0.707106781f , - -0.740951125f , 0.671558955f , - -0.773010453f , 0.634393284f , - -0.803207531f , 0.595699304f , - -0.831469612f , 0.555570233f , - -0.857728610f , 0.514102744f , - -0.881921264f , 0.471396737f , - -0.903989293f , 0.427555093f , - -0.923879533f , 0.382683432f , - -0.941544065f , 0.336889853f , - -0.956940336f , 0.290284677f , - -0.970031253f , 0.242980180f , - -0.980785280f , 0.195090322f , - -0.989176510f , 0.146730474f , - -0.995184727f , 0.098017140f , - -0.998795456f , 0.049067674f , - -1.000000000f , 0.000000000f , - -0.998795456f , -0.049067674f , - -0.995184727f , -0.098017140f , - -0.989176510f , -0.146730474f , - -0.980785280f , -0.195090322f , - -0.970031253f , -0.242980180f , - -0.956940336f , -0.290284677f , - -0.941544065f , -0.336889853f , - -0.923879533f , -0.382683432f , - -0.903989293f , -0.427555093f , - -0.881921264f , -0.471396737f , - -0.857728610f , -0.514102744f , - -0.831469612f , -0.555570233f , - -0.803207531f , -0.595699304f , - -0.773010453f , -0.634393284f , - -0.740951125f , -0.671558955f , - -0.707106781f , -0.707106781f , - -0.671558955f , -0.740951125f , - -0.634393284f , -0.773010453f , - -0.595699304f , -0.803207531f , - -0.555570233f , -0.831469612f , - -0.514102744f , -0.857728610f , - -0.471396737f , -0.881921264f , - -0.427555093f , -0.903989293f , - -0.382683432f , -0.923879533f , - -0.336889853f , -0.941544065f , - -0.290284677f , -0.956940336f , - -0.242980180f , -0.970031253f , - -0.195090322f , -0.980785280f , - -0.146730474f , -0.989176510f , - -0.098017140f , -0.995184727f , - -0.049067674f , -0.998795456f , - -0.000000000f , -1.000000000f , - 0.049067674f , -0.998795456f , - 0.098017140f , -0.995184727f , - 0.146730474f , -0.989176510f , - 0.195090322f , -0.980785280f , - 0.242980180f , -0.970031253f , - 0.290284677f , -0.956940336f , - 0.336889853f , -0.941544065f , - 0.382683432f , -0.923879533f , - 0.427555093f , -0.903989293f , - 0.471396737f , -0.881921264f , - 0.514102744f , -0.857728610f , - 0.555570233f , -0.831469612f , - 0.595699304f , -0.803207531f , - 0.634393284f , -0.773010453f , - 0.671558955f , -0.740951125f , - 0.707106781f , -0.707106781f , - 0.740951125f , -0.671558955f , - 0.773010453f , -0.634393284f , - 0.803207531f , -0.595699304f , - 0.831469612f , -0.555570233f , - 0.857728610f , -0.514102744f , - 0.881921264f , -0.471396737f , - 0.903989293f , -0.427555093f , - 0.923879533f , -0.382683432f , - 0.941544065f , -0.336889853f , - 0.956940336f , -0.290284677f , - 0.970031253f , -0.242980180f , - 0.980785280f , -0.195090322f , - 0.989176510f , -0.146730474f , - 0.995184727f , -0.098017140f , - 0.998795456f , -0.049067674f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 256 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_256[512] = { - 1.000000000f, 0.000000000f, - 0.999698819f, 0.024541229f, - 0.998795456f, 0.049067674f, - 0.997290457f, 0.073564564f, - 0.995184727f, 0.098017140f, - 0.992479535f, 0.122410675f, - 0.989176510f, 0.146730474f, - 0.985277642f, 0.170961889f, - 0.980785280f, 0.195090322f, - 0.975702130f, 0.219101240f, - 0.970031253f, 0.242980180f, - 0.963776066f, 0.266712757f, - 0.956940336f, 0.290284677f, - 0.949528181f, 0.313681740f, - 0.941544065f, 0.336889853f, - 0.932992799f, 0.359895037f, - 0.923879533f, 0.382683432f, - 0.914209756f, 0.405241314f, - 0.903989293f, 0.427555093f, - 0.893224301f, 0.449611330f, - 0.881921264f, 0.471396737f, - 0.870086991f, 0.492898192f, - 0.857728610f, 0.514102744f, - 0.844853565f, 0.534997620f, - 0.831469612f, 0.555570233f, - 0.817584813f, 0.575808191f, - 0.803207531f, 0.595699304f, - 0.788346428f, 0.615231591f, - 0.773010453f, 0.634393284f, - 0.757208847f, 0.653172843f, - 0.740951125f, 0.671558955f, - 0.724247083f, 0.689540545f, - 0.707106781f, 0.707106781f, - 0.689540545f, 0.724247083f, - 0.671558955f, 0.740951125f, - 0.653172843f, 0.757208847f, - 0.634393284f, 0.773010453f, - 0.615231591f, 0.788346428f, - 0.595699304f, 0.803207531f, - 0.575808191f, 0.817584813f, - 0.555570233f, 0.831469612f, - 0.534997620f, 0.844853565f, - 0.514102744f, 0.857728610f, - 0.492898192f, 0.870086991f, - 0.471396737f, 0.881921264f, - 0.449611330f, 0.893224301f, - 0.427555093f, 0.903989293f, - 0.405241314f, 0.914209756f, - 0.382683432f, 0.923879533f, - 0.359895037f, 0.932992799f, - 0.336889853f, 0.941544065f, - 0.313681740f, 0.949528181f, - 0.290284677f, 0.956940336f, - 0.266712757f, 0.963776066f, - 0.242980180f, 0.970031253f, - 0.219101240f, 0.975702130f, - 0.195090322f, 0.980785280f, - 0.170961889f, 0.985277642f, - 0.146730474f, 0.989176510f, - 0.122410675f, 0.992479535f, - 0.098017140f, 0.995184727f, - 0.073564564f, 0.997290457f, - 0.049067674f, 0.998795456f, - 0.024541229f, 0.999698819f, - 0.000000000f, 1.000000000f, - -0.024541229f, 0.999698819f, - -0.049067674f, 0.998795456f, - -0.073564564f, 0.997290457f, - -0.098017140f, 0.995184727f, - -0.122410675f, 0.992479535f, - -0.146730474f, 0.989176510f, - -0.170961889f, 0.985277642f, - -0.195090322f, 0.980785280f, - -0.219101240f, 0.975702130f, - -0.242980180f, 0.970031253f, - -0.266712757f, 0.963776066f, - -0.290284677f, 0.956940336f, - -0.313681740f, 0.949528181f, - -0.336889853f, 0.941544065f, - -0.359895037f, 0.932992799f, - -0.382683432f, 0.923879533f, - -0.405241314f, 0.914209756f, - -0.427555093f, 0.903989293f, - -0.449611330f, 0.893224301f, - -0.471396737f, 0.881921264f, - -0.492898192f, 0.870086991f, - -0.514102744f, 0.857728610f, - -0.534997620f, 0.844853565f, - -0.555570233f, 0.831469612f, - -0.575808191f, 0.817584813f, - -0.595699304f, 0.803207531f, - -0.615231591f, 0.788346428f, - -0.634393284f, 0.773010453f, - -0.653172843f, 0.757208847f, - -0.671558955f, 0.740951125f, - -0.689540545f, 0.724247083f, - -0.707106781f, 0.707106781f, - -0.724247083f, 0.689540545f, - -0.740951125f, 0.671558955f, - -0.757208847f, 0.653172843f, - -0.773010453f, 0.634393284f, - -0.788346428f, 0.615231591f, - -0.803207531f, 0.595699304f, - -0.817584813f, 0.575808191f, - -0.831469612f, 0.555570233f, - -0.844853565f, 0.534997620f, - -0.857728610f, 0.514102744f, - -0.870086991f, 0.492898192f, - -0.881921264f, 0.471396737f, - -0.893224301f, 0.449611330f, - -0.903989293f, 0.427555093f, - -0.914209756f, 0.405241314f, - -0.923879533f, 0.382683432f, - -0.932992799f, 0.359895037f, - -0.941544065f, 0.336889853f, - -0.949528181f, 0.313681740f, - -0.956940336f, 0.290284677f, - -0.963776066f, 0.266712757f, - -0.970031253f, 0.242980180f, - -0.975702130f, 0.219101240f, - -0.980785280f, 0.195090322f, - -0.985277642f, 0.170961889f, - -0.989176510f, 0.146730474f, - -0.992479535f, 0.122410675f, - -0.995184727f, 0.098017140f, - -0.997290457f, 0.073564564f, - -0.998795456f, 0.049067674f, - -0.999698819f, 0.024541229f, - -1.000000000f, 0.000000000f, - -0.999698819f, -0.024541229f, - -0.998795456f, -0.049067674f, - -0.997290457f, -0.073564564f, - -0.995184727f, -0.098017140f, - -0.992479535f, -0.122410675f, - -0.989176510f, -0.146730474f, - -0.985277642f, -0.170961889f, - -0.980785280f, -0.195090322f, - -0.975702130f, -0.219101240f, - -0.970031253f, -0.242980180f, - -0.963776066f, -0.266712757f, - -0.956940336f, -0.290284677f, - -0.949528181f, -0.313681740f, - -0.941544065f, -0.336889853f, - -0.932992799f, -0.359895037f, - -0.923879533f, -0.382683432f, - -0.914209756f, -0.405241314f, - -0.903989293f, -0.427555093f, - -0.893224301f, -0.449611330f, - -0.881921264f, -0.471396737f, - -0.870086991f, -0.492898192f, - -0.857728610f, -0.514102744f, - -0.844853565f, -0.534997620f, - -0.831469612f, -0.555570233f, - -0.817584813f, -0.575808191f, - -0.803207531f, -0.595699304f, - -0.788346428f, -0.615231591f, - -0.773010453f, -0.634393284f, - -0.757208847f, -0.653172843f, - -0.740951125f, -0.671558955f, - -0.724247083f, -0.689540545f, - -0.707106781f, -0.707106781f, - -0.689540545f, -0.724247083f, - -0.671558955f, -0.740951125f, - -0.653172843f, -0.757208847f, - -0.634393284f, -0.773010453f, - -0.615231591f, -0.788346428f, - -0.595699304f, -0.803207531f, - -0.575808191f, -0.817584813f, - -0.555570233f, -0.831469612f, - -0.534997620f, -0.844853565f, - -0.514102744f, -0.857728610f, - -0.492898192f, -0.870086991f, - -0.471396737f, -0.881921264f, - -0.449611330f, -0.893224301f, - -0.427555093f, -0.903989293f, - -0.405241314f, -0.914209756f, - -0.382683432f, -0.923879533f, - -0.359895037f, -0.932992799f, - -0.336889853f, -0.941544065f, - -0.313681740f, -0.949528181f, - -0.290284677f, -0.956940336f, - -0.266712757f, -0.963776066f, - -0.242980180f, -0.970031253f, - -0.219101240f, -0.975702130f, - -0.195090322f, -0.980785280f, - -0.170961889f, -0.985277642f, - -0.146730474f, -0.989176510f, - -0.122410675f, -0.992479535f, - -0.098017140f, -0.995184727f, - -0.073564564f, -0.997290457f, - -0.049067674f, -0.998795456f, - -0.024541229f, -0.999698819f, - -0.000000000f, -1.000000000f, - 0.024541229f, -0.999698819f, - 0.049067674f, -0.998795456f, - 0.073564564f, -0.997290457f, - 0.098017140f, -0.995184727f, - 0.122410675f, -0.992479535f, - 0.146730474f, -0.989176510f, - 0.170961889f, -0.985277642f, - 0.195090322f, -0.980785280f, - 0.219101240f, -0.975702130f, - 0.242980180f, -0.970031253f, - 0.266712757f, -0.963776066f, - 0.290284677f, -0.956940336f, - 0.313681740f, -0.949528181f, - 0.336889853f, -0.941544065f, - 0.359895037f, -0.932992799f, - 0.382683432f, -0.923879533f, - 0.405241314f, -0.914209756f, - 0.427555093f, -0.903989293f, - 0.449611330f, -0.893224301f, - 0.471396737f, -0.881921264f, - 0.492898192f, -0.870086991f, - 0.514102744f, -0.857728610f, - 0.534997620f, -0.844853565f, - 0.555570233f, -0.831469612f, - 0.575808191f, -0.817584813f, - 0.595699304f, -0.803207531f, - 0.615231591f, -0.788346428f, - 0.634393284f, -0.773010453f, - 0.653172843f, -0.757208847f, - 0.671558955f, -0.740951125f, - 0.689540545f, -0.724247083f, - 0.707106781f, -0.707106781f, - 0.724247083f, -0.689540545f, - 0.740951125f, -0.671558955f, - 0.757208847f, -0.653172843f, - 0.773010453f, -0.634393284f, - 0.788346428f, -0.615231591f, - 0.803207531f, -0.595699304f, - 0.817584813f, -0.575808191f, - 0.831469612f, -0.555570233f, - 0.844853565f, -0.534997620f, - 0.857728610f, -0.514102744f, - 0.870086991f, -0.492898192f, - 0.881921264f, -0.471396737f, - 0.893224301f, -0.449611330f, - 0.903989293f, -0.427555093f, - 0.914209756f, -0.405241314f, - 0.923879533f, -0.382683432f, - 0.932992799f, -0.359895037f, - 0.941544065f, -0.336889853f, - 0.949528181f, -0.313681740f, - 0.956940336f, -0.290284677f, - 0.963776066f, -0.266712757f, - 0.970031253f, -0.242980180f, - 0.975702130f, -0.219101240f, - 0.980785280f, -0.195090322f, - 0.985277642f, -0.170961889f, - 0.989176510f, -0.146730474f, - 0.992479535f, -0.122410675f, - 0.995184727f, -0.098017140f, - 0.997290457f, -0.073564564f, - 0.998795456f, -0.049067674f, - 0.999698819f, -0.024541229f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 512 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_512[1024] = { - 1.000000000f, 0.000000000f, - 0.999924702f, 0.012271538f, - 0.999698819f, 0.024541229f, - 0.999322385f, 0.036807223f, - 0.998795456f, 0.049067674f, - 0.998118113f, 0.061320736f, - 0.997290457f, 0.073564564f, - 0.996312612f, 0.085797312f, - 0.995184727f, 0.098017140f, - 0.993906970f, 0.110222207f, - 0.992479535f, 0.122410675f, - 0.990902635f, 0.134580709f, - 0.989176510f, 0.146730474f, - 0.987301418f, 0.158858143f, - 0.985277642f, 0.170961889f, - 0.983105487f, 0.183039888f, - 0.980785280f, 0.195090322f, - 0.978317371f, 0.207111376f, - 0.975702130f, 0.219101240f, - 0.972939952f, 0.231058108f, - 0.970031253f, 0.242980180f, - 0.966976471f, 0.254865660f, - 0.963776066f, 0.266712757f, - 0.960430519f, 0.278519689f, - 0.956940336f, 0.290284677f, - 0.953306040f, 0.302005949f, - 0.949528181f, 0.313681740f, - 0.945607325f, 0.325310292f, - 0.941544065f, 0.336889853f, - 0.937339012f, 0.348418680f, - 0.932992799f, 0.359895037f, - 0.928506080f, 0.371317194f, - 0.923879533f, 0.382683432f, - 0.919113852f, 0.393992040f, - 0.914209756f, 0.405241314f, - 0.909167983f, 0.416429560f, - 0.903989293f, 0.427555093f, - 0.898674466f, 0.438616239f, - 0.893224301f, 0.449611330f, - 0.887639620f, 0.460538711f, - 0.881921264f, 0.471396737f, - 0.876070094f, 0.482183772f, - 0.870086991f, 0.492898192f, - 0.863972856f, 0.503538384f, - 0.857728610f, 0.514102744f, - 0.851355193f, 0.524589683f, - 0.844853565f, 0.534997620f, - 0.838224706f, 0.545324988f, - 0.831469612f, 0.555570233f, - 0.824589303f, 0.565731811f, - 0.817584813f, 0.575808191f, - 0.810457198f, 0.585797857f, - 0.803207531f, 0.595699304f, - 0.795836905f, 0.605511041f, - 0.788346428f, 0.615231591f, - 0.780737229f, 0.624859488f, - 0.773010453f, 0.634393284f, - 0.765167266f, 0.643831543f, - 0.757208847f, 0.653172843f, - 0.749136395f, 0.662415778f, - 0.740951125f, 0.671558955f, - 0.732654272f, 0.680600998f, - 0.724247083f, 0.689540545f, - 0.715730825f, 0.698376249f, - 0.707106781f, 0.707106781f, - 0.698376249f, 0.715730825f, - 0.689540545f, 0.724247083f, - 0.680600998f, 0.732654272f, - 0.671558955f, 0.740951125f, - 0.662415778f, 0.749136395f, - 0.653172843f, 0.757208847f, - 0.643831543f, 0.765167266f, - 0.634393284f, 0.773010453f, - 0.624859488f, 0.780737229f, - 0.615231591f, 0.788346428f, - 0.605511041f, 0.795836905f, - 0.595699304f, 0.803207531f, - 0.585797857f, 0.810457198f, - 0.575808191f, 0.817584813f, - 0.565731811f, 0.824589303f, - 0.555570233f, 0.831469612f, - 0.545324988f, 0.838224706f, - 0.534997620f, 0.844853565f, - 0.524589683f, 0.851355193f, - 0.514102744f, 0.857728610f, - 0.503538384f, 0.863972856f, - 0.492898192f, 0.870086991f, - 0.482183772f, 0.876070094f, - 0.471396737f, 0.881921264f, - 0.460538711f, 0.887639620f, - 0.449611330f, 0.893224301f, - 0.438616239f, 0.898674466f, - 0.427555093f, 0.903989293f, - 0.416429560f, 0.909167983f, - 0.405241314f, 0.914209756f, - 0.393992040f, 0.919113852f, - 0.382683432f, 0.923879533f, - 0.371317194f, 0.928506080f, - 0.359895037f, 0.932992799f, - 0.348418680f, 0.937339012f, - 0.336889853f, 0.941544065f, - 0.325310292f, 0.945607325f, - 0.313681740f, 0.949528181f, - 0.302005949f, 0.953306040f, - 0.290284677f, 0.956940336f, - 0.278519689f, 0.960430519f, - 0.266712757f, 0.963776066f, - 0.254865660f, 0.966976471f, - 0.242980180f, 0.970031253f, - 0.231058108f, 0.972939952f, - 0.219101240f, 0.975702130f, - 0.207111376f, 0.978317371f, - 0.195090322f, 0.980785280f, - 0.183039888f, 0.983105487f, - 0.170961889f, 0.985277642f, - 0.158858143f, 0.987301418f, - 0.146730474f, 0.989176510f, - 0.134580709f, 0.990902635f, - 0.122410675f, 0.992479535f, - 0.110222207f, 0.993906970f, - 0.098017140f, 0.995184727f, - 0.085797312f, 0.996312612f, - 0.073564564f, 0.997290457f, - 0.061320736f, 0.998118113f, - 0.049067674f, 0.998795456f, - 0.036807223f, 0.999322385f, - 0.024541229f, 0.999698819f, - 0.012271538f, 0.999924702f, - 0.000000000f, 1.000000000f, - -0.012271538f, 0.999924702f, - -0.024541229f, 0.999698819f, - -0.036807223f, 0.999322385f, - -0.049067674f, 0.998795456f, - -0.061320736f, 0.998118113f, - -0.073564564f, 0.997290457f, - -0.085797312f, 0.996312612f, - -0.098017140f, 0.995184727f, - -0.110222207f, 0.993906970f, - -0.122410675f, 0.992479535f, - -0.134580709f, 0.990902635f, - -0.146730474f, 0.989176510f, - -0.158858143f, 0.987301418f, - -0.170961889f, 0.985277642f, - -0.183039888f, 0.983105487f, - -0.195090322f, 0.980785280f, - -0.207111376f, 0.978317371f, - -0.219101240f, 0.975702130f, - -0.231058108f, 0.972939952f, - -0.242980180f, 0.970031253f, - -0.254865660f, 0.966976471f, - -0.266712757f, 0.963776066f, - -0.278519689f, 0.960430519f, - -0.290284677f, 0.956940336f, - -0.302005949f, 0.953306040f, - -0.313681740f, 0.949528181f, - -0.325310292f, 0.945607325f, - -0.336889853f, 0.941544065f, - -0.348418680f, 0.937339012f, - -0.359895037f, 0.932992799f, - -0.371317194f, 0.928506080f, - -0.382683432f, 0.923879533f, - -0.393992040f, 0.919113852f, - -0.405241314f, 0.914209756f, - -0.416429560f, 0.909167983f, - -0.427555093f, 0.903989293f, - -0.438616239f, 0.898674466f, - -0.449611330f, 0.893224301f, - -0.460538711f, 0.887639620f, - -0.471396737f, 0.881921264f, - -0.482183772f, 0.876070094f, - -0.492898192f, 0.870086991f, - -0.503538384f, 0.863972856f, - -0.514102744f, 0.857728610f, - -0.524589683f, 0.851355193f, - -0.534997620f, 0.844853565f, - -0.545324988f, 0.838224706f, - -0.555570233f, 0.831469612f, - -0.565731811f, 0.824589303f, - -0.575808191f, 0.817584813f, - -0.585797857f, 0.810457198f, - -0.595699304f, 0.803207531f, - -0.605511041f, 0.795836905f, - -0.615231591f, 0.788346428f, - -0.624859488f, 0.780737229f, - -0.634393284f, 0.773010453f, - -0.643831543f, 0.765167266f, - -0.653172843f, 0.757208847f, - -0.662415778f, 0.749136395f, - -0.671558955f, 0.740951125f, - -0.680600998f, 0.732654272f, - -0.689540545f, 0.724247083f, - -0.698376249f, 0.715730825f, - -0.707106781f, 0.707106781f, - -0.715730825f, 0.698376249f, - -0.724247083f, 0.689540545f, - -0.732654272f, 0.680600998f, - -0.740951125f, 0.671558955f, - -0.749136395f, 0.662415778f, - -0.757208847f, 0.653172843f, - -0.765167266f, 0.643831543f, - -0.773010453f, 0.634393284f, - -0.780737229f, 0.624859488f, - -0.788346428f, 0.615231591f, - -0.795836905f, 0.605511041f, - -0.803207531f, 0.595699304f, - -0.810457198f, 0.585797857f, - -0.817584813f, 0.575808191f, - -0.824589303f, 0.565731811f, - -0.831469612f, 0.555570233f, - -0.838224706f, 0.545324988f, - -0.844853565f, 0.534997620f, - -0.851355193f, 0.524589683f, - -0.857728610f, 0.514102744f, - -0.863972856f, 0.503538384f, - -0.870086991f, 0.492898192f, - -0.876070094f, 0.482183772f, - -0.881921264f, 0.471396737f, - -0.887639620f, 0.460538711f, - -0.893224301f, 0.449611330f, - -0.898674466f, 0.438616239f, - -0.903989293f, 0.427555093f, - -0.909167983f, 0.416429560f, - -0.914209756f, 0.405241314f, - -0.919113852f, 0.393992040f, - -0.923879533f, 0.382683432f, - -0.928506080f, 0.371317194f, - -0.932992799f, 0.359895037f, - -0.937339012f, 0.348418680f, - -0.941544065f, 0.336889853f, - -0.945607325f, 0.325310292f, - -0.949528181f, 0.313681740f, - -0.953306040f, 0.302005949f, - -0.956940336f, 0.290284677f, - -0.960430519f, 0.278519689f, - -0.963776066f, 0.266712757f, - -0.966976471f, 0.254865660f, - -0.970031253f, 0.242980180f, - -0.972939952f, 0.231058108f, - -0.975702130f, 0.219101240f, - -0.978317371f, 0.207111376f, - -0.980785280f, 0.195090322f, - -0.983105487f, 0.183039888f, - -0.985277642f, 0.170961889f, - -0.987301418f, 0.158858143f, - -0.989176510f, 0.146730474f, - -0.990902635f, 0.134580709f, - -0.992479535f, 0.122410675f, - -0.993906970f, 0.110222207f, - -0.995184727f, 0.098017140f, - -0.996312612f, 0.085797312f, - -0.997290457f, 0.073564564f, - -0.998118113f, 0.061320736f, - -0.998795456f, 0.049067674f, - -0.999322385f, 0.036807223f, - -0.999698819f, 0.024541229f, - -0.999924702f, 0.012271538f, - -1.000000000f, 0.000000000f, - -0.999924702f, -0.012271538f, - -0.999698819f, -0.024541229f, - -0.999322385f, -0.036807223f, - -0.998795456f, -0.049067674f, - -0.998118113f, -0.061320736f, - -0.997290457f, -0.073564564f, - -0.996312612f, -0.085797312f, - -0.995184727f, -0.098017140f, - -0.993906970f, -0.110222207f, - -0.992479535f, -0.122410675f, - -0.990902635f, -0.134580709f, - -0.989176510f, -0.146730474f, - -0.987301418f, -0.158858143f, - -0.985277642f, -0.170961889f, - -0.983105487f, -0.183039888f, - -0.980785280f, -0.195090322f, - -0.978317371f, -0.207111376f, - -0.975702130f, -0.219101240f, - -0.972939952f, -0.231058108f, - -0.970031253f, -0.242980180f, - -0.966976471f, -0.254865660f, - -0.963776066f, -0.266712757f, - -0.960430519f, -0.278519689f, - -0.956940336f, -0.290284677f, - -0.953306040f, -0.302005949f, - -0.949528181f, -0.313681740f, - -0.945607325f, -0.325310292f, - -0.941544065f, -0.336889853f, - -0.937339012f, -0.348418680f, - -0.932992799f, -0.359895037f, - -0.928506080f, -0.371317194f, - -0.923879533f, -0.382683432f, - -0.919113852f, -0.393992040f, - -0.914209756f, -0.405241314f, - -0.909167983f, -0.416429560f, - -0.903989293f, -0.427555093f, - -0.898674466f, -0.438616239f, - -0.893224301f, -0.449611330f, - -0.887639620f, -0.460538711f, - -0.881921264f, -0.471396737f, - -0.876070094f, -0.482183772f, - -0.870086991f, -0.492898192f, - -0.863972856f, -0.503538384f, - -0.857728610f, -0.514102744f, - -0.851355193f, -0.524589683f, - -0.844853565f, -0.534997620f, - -0.838224706f, -0.545324988f, - -0.831469612f, -0.555570233f, - -0.824589303f, -0.565731811f, - -0.817584813f, -0.575808191f, - -0.810457198f, -0.585797857f, - -0.803207531f, -0.595699304f, - -0.795836905f, -0.605511041f, - -0.788346428f, -0.615231591f, - -0.780737229f, -0.624859488f, - -0.773010453f, -0.634393284f, - -0.765167266f, -0.643831543f, - -0.757208847f, -0.653172843f, - -0.749136395f, -0.662415778f, - -0.740951125f, -0.671558955f, - -0.732654272f, -0.680600998f, - -0.724247083f, -0.689540545f, - -0.715730825f, -0.698376249f, - -0.707106781f, -0.707106781f, - -0.698376249f, -0.715730825f, - -0.689540545f, -0.724247083f, - -0.680600998f, -0.732654272f, - -0.671558955f, -0.740951125f, - -0.662415778f, -0.749136395f, - -0.653172843f, -0.757208847f, - -0.643831543f, -0.765167266f, - -0.634393284f, -0.773010453f, - -0.624859488f, -0.780737229f, - -0.615231591f, -0.788346428f, - -0.605511041f, -0.795836905f, - -0.595699304f, -0.803207531f, - -0.585797857f, -0.810457198f, - -0.575808191f, -0.817584813f, - -0.565731811f, -0.824589303f, - -0.555570233f, -0.831469612f, - -0.545324988f, -0.838224706f, - -0.534997620f, -0.844853565f, - -0.524589683f, -0.851355193f, - -0.514102744f, -0.857728610f, - -0.503538384f, -0.863972856f, - -0.492898192f, -0.870086991f, - -0.482183772f, -0.876070094f, - -0.471396737f, -0.881921264f, - -0.460538711f, -0.887639620f, - -0.449611330f, -0.893224301f, - -0.438616239f, -0.898674466f, - -0.427555093f, -0.903989293f, - -0.416429560f, -0.909167983f, - -0.405241314f, -0.914209756f, - -0.393992040f, -0.919113852f, - -0.382683432f, -0.923879533f, - -0.371317194f, -0.928506080f, - -0.359895037f, -0.932992799f, - -0.348418680f, -0.937339012f, - -0.336889853f, -0.941544065f, - -0.325310292f, -0.945607325f, - -0.313681740f, -0.949528181f, - -0.302005949f, -0.953306040f, - -0.290284677f, -0.956940336f, - -0.278519689f, -0.960430519f, - -0.266712757f, -0.963776066f, - -0.254865660f, -0.966976471f, - -0.242980180f, -0.970031253f, - -0.231058108f, -0.972939952f, - -0.219101240f, -0.975702130f, - -0.207111376f, -0.978317371f, - -0.195090322f, -0.980785280f, - -0.183039888f, -0.983105487f, - -0.170961889f, -0.985277642f, - -0.158858143f, -0.987301418f, - -0.146730474f, -0.989176510f, - -0.134580709f, -0.990902635f, - -0.122410675f, -0.992479535f, - -0.110222207f, -0.993906970f, - -0.098017140f, -0.995184727f, - -0.085797312f, -0.996312612f, - -0.073564564f, -0.997290457f, - -0.061320736f, -0.998118113f, - -0.049067674f, -0.998795456f, - -0.036807223f, -0.999322385f, - -0.024541229f, -0.999698819f, - -0.012271538f, -0.999924702f, - -0.000000000f, -1.000000000f, - 0.012271538f, -0.999924702f, - 0.024541229f, -0.999698819f, - 0.036807223f, -0.999322385f, - 0.049067674f, -0.998795456f, - 0.061320736f, -0.998118113f, - 0.073564564f, -0.997290457f, - 0.085797312f, -0.996312612f, - 0.098017140f, -0.995184727f, - 0.110222207f, -0.993906970f, - 0.122410675f, -0.992479535f, - 0.134580709f, -0.990902635f, - 0.146730474f, -0.989176510f, - 0.158858143f, -0.987301418f, - 0.170961889f, -0.985277642f, - 0.183039888f, -0.983105487f, - 0.195090322f, -0.980785280f, - 0.207111376f, -0.978317371f, - 0.219101240f, -0.975702130f, - 0.231058108f, -0.972939952f, - 0.242980180f, -0.970031253f, - 0.254865660f, -0.966976471f, - 0.266712757f, -0.963776066f, - 0.278519689f, -0.960430519f, - 0.290284677f, -0.956940336f, - 0.302005949f, -0.953306040f, - 0.313681740f, -0.949528181f, - 0.325310292f, -0.945607325f, - 0.336889853f, -0.941544065f, - 0.348418680f, -0.937339012f, - 0.359895037f, -0.932992799f, - 0.371317194f, -0.928506080f, - 0.382683432f, -0.923879533f, - 0.393992040f, -0.919113852f, - 0.405241314f, -0.914209756f, - 0.416429560f, -0.909167983f, - 0.427555093f, -0.903989293f, - 0.438616239f, -0.898674466f, - 0.449611330f, -0.893224301f, - 0.460538711f, -0.887639620f, - 0.471396737f, -0.881921264f, - 0.482183772f, -0.876070094f, - 0.492898192f, -0.870086991f, - 0.503538384f, -0.863972856f, - 0.514102744f, -0.857728610f, - 0.524589683f, -0.851355193f, - 0.534997620f, -0.844853565f, - 0.545324988f, -0.838224706f, - 0.555570233f, -0.831469612f, - 0.565731811f, -0.824589303f, - 0.575808191f, -0.817584813f, - 0.585797857f, -0.810457198f, - 0.595699304f, -0.803207531f, - 0.605511041f, -0.795836905f, - 0.615231591f, -0.788346428f, - 0.624859488f, -0.780737229f, - 0.634393284f, -0.773010453f, - 0.643831543f, -0.765167266f, - 0.653172843f, -0.757208847f, - 0.662415778f, -0.749136395f, - 0.671558955f, -0.740951125f, - 0.680600998f, -0.732654272f, - 0.689540545f, -0.724247083f, - 0.698376249f, -0.715730825f, - 0.707106781f, -0.707106781f, - 0.715730825f, -0.698376249f, - 0.724247083f, -0.689540545f, - 0.732654272f, -0.680600998f, - 0.740951125f, -0.671558955f, - 0.749136395f, -0.662415778f, - 0.757208847f, -0.653172843f, - 0.765167266f, -0.643831543f, - 0.773010453f, -0.634393284f, - 0.780737229f, -0.624859488f, - 0.788346428f, -0.615231591f, - 0.795836905f, -0.605511041f, - 0.803207531f, -0.595699304f, - 0.810457198f, -0.585797857f, - 0.817584813f, -0.575808191f, - 0.824589303f, -0.565731811f, - 0.831469612f, -0.555570233f, - 0.838224706f, -0.545324988f, - 0.844853565f, -0.534997620f, - 0.851355193f, -0.524589683f, - 0.857728610f, -0.514102744f, - 0.863972856f, -0.503538384f, - 0.870086991f, -0.492898192f, - 0.876070094f, -0.482183772f, - 0.881921264f, -0.471396737f, - 0.887639620f, -0.460538711f, - 0.893224301f, -0.449611330f, - 0.898674466f, -0.438616239f, - 0.903989293f, -0.427555093f, - 0.909167983f, -0.416429560f, - 0.914209756f, -0.405241314f, - 0.919113852f, -0.393992040f, - 0.923879533f, -0.382683432f, - 0.928506080f, -0.371317194f, - 0.932992799f, -0.359895037f, - 0.937339012f, -0.348418680f, - 0.941544065f, -0.336889853f, - 0.945607325f, -0.325310292f, - 0.949528181f, -0.313681740f, - 0.953306040f, -0.302005949f, - 0.956940336f, -0.290284677f, - 0.960430519f, -0.278519689f, - 0.963776066f, -0.266712757f, - 0.966976471f, -0.254865660f, - 0.970031253f, -0.242980180f, - 0.972939952f, -0.231058108f, - 0.975702130f, -0.219101240f, - 0.978317371f, -0.207111376f, - 0.980785280f, -0.195090322f, - 0.983105487f, -0.183039888f, - 0.985277642f, -0.170961889f, - 0.987301418f, -0.158858143f, - 0.989176510f, -0.146730474f, - 0.990902635f, -0.134580709f, - 0.992479535f, -0.122410675f, - 0.993906970f, -0.110222207f, - 0.995184727f, -0.098017140f, - 0.996312612f, -0.085797312f, - 0.997290457f, -0.073564564f, - 0.998118113f, -0.061320736f, - 0.998795456f, -0.049067674f, - 0.999322385f, -0.036807223f, - 0.999698819f, -0.024541229f, - 0.999924702f, -0.012271538f -}; -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 1024 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_1024[2048] = { -1.000000000f , 0.000000000f , -0.999981175f , 0.006135885f , -0.999924702f , 0.012271538f , -0.999830582f , 0.018406730f , -0.999698819f , 0.024541229f , -0.999529418f , 0.030674803f , -0.999322385f , 0.036807223f , -0.999077728f , 0.042938257f , -0.998795456f , 0.049067674f , -0.998475581f , 0.055195244f , -0.998118113f , 0.061320736f , -0.997723067f , 0.067443920f , -0.997290457f , 0.073564564f , -0.996820299f , 0.079682438f , -0.996312612f , 0.085797312f , -0.995767414f , 0.091908956f , -0.995184727f , 0.098017140f , -0.994564571f , 0.104121634f , -0.993906970f , 0.110222207f , -0.993211949f , 0.116318631f , -0.992479535f , 0.122410675f , -0.991709754f , 0.128498111f , -0.990902635f , 0.134580709f , -0.990058210f , 0.140658239f , -0.989176510f , 0.146730474f , -0.988257568f , 0.152797185f , -0.987301418f , 0.158858143f , -0.986308097f , 0.164913120f , -0.985277642f , 0.170961889f , -0.984210092f , 0.177004220f , -0.983105487f , 0.183039888f , -0.981963869f , 0.189068664f , -0.980785280f , 0.195090322f , -0.979569766f , 0.201104635f , -0.978317371f , 0.207111376f , -0.977028143f , 0.213110320f , -0.975702130f , 0.219101240f , -0.974339383f , 0.225083911f , -0.972939952f , 0.231058108f , -0.971503891f , 0.237023606f , -0.970031253f , 0.242980180f , -0.968522094f , 0.248927606f , -0.966976471f , 0.254865660f , -0.965394442f , 0.260794118f , -0.963776066f , 0.266712757f , -0.962121404f , 0.272621355f , -0.960430519f , 0.278519689f , -0.958703475f , 0.284407537f , -0.956940336f , 0.290284677f , -0.955141168f , 0.296150888f , -0.953306040f , 0.302005949f , -0.951435021f , 0.307849640f , -0.949528181f , 0.313681740f , -0.947585591f , 0.319502031f , -0.945607325f , 0.325310292f , -0.943593458f , 0.331106306f , -0.941544065f , 0.336889853f , -0.939459224f , 0.342660717f , -0.937339012f , 0.348418680f , -0.935183510f , 0.354163525f , -0.932992799f , 0.359895037f , -0.930766961f , 0.365612998f , -0.928506080f , 0.371317194f , -0.926210242f , 0.377007410f , -0.923879533f , 0.382683432f , -0.921514039f , 0.388345047f , -0.919113852f , 0.393992040f , -0.916679060f , 0.399624200f , -0.914209756f , 0.405241314f , -0.911706032f , 0.410843171f , -0.909167983f , 0.416429560f , -0.906595705f , 0.422000271f , -0.903989293f , 0.427555093f , -0.901348847f , 0.433093819f , -0.898674466f , 0.438616239f , -0.895966250f , 0.444122145f , -0.893224301f , 0.449611330f , -0.890448723f , 0.455083587f , -0.887639620f , 0.460538711f , -0.884797098f , 0.465976496f , -0.881921264f , 0.471396737f , -0.879012226f , 0.476799230f , -0.876070094f , 0.482183772f , -0.873094978f , 0.487550160f , -0.870086991f , 0.492898192f , -0.867046246f , 0.498227667f , -0.863972856f , 0.503538384f , -0.860866939f , 0.508830143f , -0.857728610f , 0.514102744f , -0.854557988f , 0.519355990f , -0.851355193f , 0.524589683f , -0.848120345f , 0.529803625f , -0.844853565f , 0.534997620f , -0.841554977f , 0.540171473f , -0.838224706f , 0.545324988f , -0.834862875f , 0.550457973f , -0.831469612f , 0.555570233f , -0.828045045f , 0.560661576f , -0.824589303f , 0.565731811f , -0.821102515f , 0.570780746f , -0.817584813f , 0.575808191f , -0.814036330f , 0.580813958f , -0.810457198f , 0.585797857f , -0.806847554f , 0.590759702f , -0.803207531f , 0.595699304f , -0.799537269f , 0.600616479f , -0.795836905f , 0.605511041f , -0.792106577f , 0.610382806f , -0.788346428f , 0.615231591f , -0.784556597f , 0.620057212f , -0.780737229f , 0.624859488f , -0.776888466f , 0.629638239f , -0.773010453f , 0.634393284f , -0.769103338f , 0.639124445f , -0.765167266f , 0.643831543f , -0.761202385f , 0.648514401f , -0.757208847f , 0.653172843f , -0.753186799f , 0.657806693f , -0.749136395f , 0.662415778f , -0.745057785f , 0.666999922f , -0.740951125f , 0.671558955f , -0.736816569f , 0.676092704f , -0.732654272f , 0.680600998f , -0.728464390f , 0.685083668f , -0.724247083f , 0.689540545f , -0.720002508f , 0.693971461f , -0.715730825f , 0.698376249f , -0.711432196f , 0.702754744f , -0.707106781f , 0.707106781f , -0.702754744f , 0.711432196f , -0.698376249f , 0.715730825f , -0.693971461f , 0.720002508f , -0.689540545f , 0.724247083f , -0.685083668f , 0.728464390f , -0.680600998f , 0.732654272f , -0.676092704f , 0.736816569f , -0.671558955f , 0.740951125f , -0.666999922f , 0.745057785f , -0.662415778f , 0.749136395f , -0.657806693f , 0.753186799f , -0.653172843f , 0.757208847f , -0.648514401f , 0.761202385f , -0.643831543f , 0.765167266f , -0.639124445f , 0.769103338f , -0.634393284f , 0.773010453f , -0.629638239f , 0.776888466f , -0.624859488f , 0.780737229f , -0.620057212f , 0.784556597f , -0.615231591f , 0.788346428f , -0.610382806f , 0.792106577f , -0.605511041f , 0.795836905f , -0.600616479f , 0.799537269f , -0.595699304f , 0.803207531f , -0.590759702f , 0.806847554f , -0.585797857f , 0.810457198f , -0.580813958f , 0.814036330f , -0.575808191f , 0.817584813f , -0.570780746f , 0.821102515f , -0.565731811f , 0.824589303f , -0.560661576f , 0.828045045f , -0.555570233f , 0.831469612f , -0.550457973f , 0.834862875f , -0.545324988f , 0.838224706f , -0.540171473f , 0.841554977f , -0.534997620f , 0.844853565f , -0.529803625f , 0.848120345f , -0.524589683f , 0.851355193f , -0.519355990f , 0.854557988f , -0.514102744f , 0.857728610f , -0.508830143f , 0.860866939f , -0.503538384f , 0.863972856f , -0.498227667f , 0.867046246f , -0.492898192f , 0.870086991f , -0.487550160f , 0.873094978f , -0.482183772f , 0.876070094f , -0.476799230f , 0.879012226f , -0.471396737f , 0.881921264f , -0.465976496f , 0.884797098f , -0.460538711f , 0.887639620f , -0.455083587f , 0.890448723f , -0.449611330f , 0.893224301f , -0.444122145f , 0.895966250f , -0.438616239f , 0.898674466f , -0.433093819f , 0.901348847f , -0.427555093f , 0.903989293f , -0.422000271f , 0.906595705f , -0.416429560f , 0.909167983f , -0.410843171f , 0.911706032f , -0.405241314f , 0.914209756f , -0.399624200f , 0.916679060f , -0.393992040f , 0.919113852f , -0.388345047f , 0.921514039f , -0.382683432f , 0.923879533f , -0.377007410f , 0.926210242f , -0.371317194f , 0.928506080f , -0.365612998f , 0.930766961f , -0.359895037f , 0.932992799f , -0.354163525f , 0.935183510f , -0.348418680f , 0.937339012f , -0.342660717f , 0.939459224f , -0.336889853f , 0.941544065f , -0.331106306f , 0.943593458f , -0.325310292f , 0.945607325f , -0.319502031f , 0.947585591f , -0.313681740f , 0.949528181f , -0.307849640f , 0.951435021f , -0.302005949f , 0.953306040f , -0.296150888f , 0.955141168f , -0.290284677f , 0.956940336f , -0.284407537f , 0.958703475f , -0.278519689f , 0.960430519f , -0.272621355f , 0.962121404f , -0.266712757f , 0.963776066f , -0.260794118f , 0.965394442f , -0.254865660f , 0.966976471f , -0.248927606f , 0.968522094f , -0.242980180f , 0.970031253f , -0.237023606f , 0.971503891f , -0.231058108f , 0.972939952f , -0.225083911f , 0.974339383f , -0.219101240f , 0.975702130f , -0.213110320f , 0.977028143f , -0.207111376f , 0.978317371f , -0.201104635f , 0.979569766f , -0.195090322f , 0.980785280f , -0.189068664f , 0.981963869f , -0.183039888f , 0.983105487f , -0.177004220f , 0.984210092f , -0.170961889f , 0.985277642f , -0.164913120f , 0.986308097f , -0.158858143f , 0.987301418f , -0.152797185f , 0.988257568f , -0.146730474f , 0.989176510f , -0.140658239f , 0.990058210f , -0.134580709f , 0.990902635f , -0.128498111f , 0.991709754f , -0.122410675f , 0.992479535f , -0.116318631f , 0.993211949f , -0.110222207f , 0.993906970f , -0.104121634f , 0.994564571f , -0.098017140f , 0.995184727f , -0.091908956f , 0.995767414f , -0.085797312f , 0.996312612f , -0.079682438f , 0.996820299f , -0.073564564f , 0.997290457f , -0.067443920f , 0.997723067f , -0.061320736f , 0.998118113f , -0.055195244f , 0.998475581f , -0.049067674f , 0.998795456f , -0.042938257f , 0.999077728f , -0.036807223f , 0.999322385f , -0.030674803f , 0.999529418f , -0.024541229f , 0.999698819f , -0.018406730f , 0.999830582f , -0.012271538f , 0.999924702f , -0.006135885f , 0.999981175f , -0.000000000f , 1.000000000f , --0.006135885f , 0.999981175f , --0.012271538f , 0.999924702f , --0.018406730f , 0.999830582f , --0.024541229f , 0.999698819f , --0.030674803f , 0.999529418f , --0.036807223f , 0.999322385f , --0.042938257f , 0.999077728f , --0.049067674f , 0.998795456f , --0.055195244f , 0.998475581f , --0.061320736f , 0.998118113f , --0.067443920f , 0.997723067f , --0.073564564f , 0.997290457f , --0.079682438f , 0.996820299f , --0.085797312f , 0.996312612f , --0.091908956f , 0.995767414f , --0.098017140f , 0.995184727f , --0.104121634f , 0.994564571f , --0.110222207f , 0.993906970f , --0.116318631f , 0.993211949f , --0.122410675f , 0.992479535f , --0.128498111f , 0.991709754f , --0.134580709f , 0.990902635f , --0.140658239f , 0.990058210f , --0.146730474f , 0.989176510f , --0.152797185f , 0.988257568f , --0.158858143f , 0.987301418f , --0.164913120f , 0.986308097f , --0.170961889f , 0.985277642f , --0.177004220f , 0.984210092f , --0.183039888f , 0.983105487f , --0.189068664f , 0.981963869f , --0.195090322f , 0.980785280f , --0.201104635f , 0.979569766f , --0.207111376f , 0.978317371f , --0.213110320f , 0.977028143f , --0.219101240f , 0.975702130f , --0.225083911f , 0.974339383f , --0.231058108f , 0.972939952f , --0.237023606f , 0.971503891f , --0.242980180f , 0.970031253f , --0.248927606f , 0.968522094f , --0.254865660f , 0.966976471f , --0.260794118f , 0.965394442f , --0.266712757f , 0.963776066f , --0.272621355f , 0.962121404f , --0.278519689f , 0.960430519f , --0.284407537f , 0.958703475f , --0.290284677f , 0.956940336f , --0.296150888f , 0.955141168f , --0.302005949f , 0.953306040f , --0.307849640f , 0.951435021f , --0.313681740f , 0.949528181f , --0.319502031f , 0.947585591f , --0.325310292f , 0.945607325f , --0.331106306f , 0.943593458f , --0.336889853f , 0.941544065f , --0.342660717f , 0.939459224f , --0.348418680f , 0.937339012f , --0.354163525f , 0.935183510f , --0.359895037f , 0.932992799f , --0.365612998f , 0.930766961f , --0.371317194f , 0.928506080f , --0.377007410f , 0.926210242f , --0.382683432f , 0.923879533f , --0.388345047f , 0.921514039f , --0.393992040f , 0.919113852f , --0.399624200f , 0.916679060f , --0.405241314f , 0.914209756f , --0.410843171f , 0.911706032f , --0.416429560f , 0.909167983f , --0.422000271f , 0.906595705f , --0.427555093f , 0.903989293f , --0.433093819f , 0.901348847f , --0.438616239f , 0.898674466f , --0.444122145f , 0.895966250f , --0.449611330f , 0.893224301f , --0.455083587f , 0.890448723f , --0.460538711f , 0.887639620f , --0.465976496f , 0.884797098f , --0.471396737f , 0.881921264f , --0.476799230f , 0.879012226f , --0.482183772f , 0.876070094f , --0.487550160f , 0.873094978f , --0.492898192f , 0.870086991f , --0.498227667f , 0.867046246f , --0.503538384f , 0.863972856f , --0.508830143f , 0.860866939f , --0.514102744f , 0.857728610f , --0.519355990f , 0.854557988f , --0.524589683f , 0.851355193f , --0.529803625f , 0.848120345f , --0.534997620f , 0.844853565f , --0.540171473f , 0.841554977f , --0.545324988f , 0.838224706f , --0.550457973f , 0.834862875f , --0.555570233f , 0.831469612f , --0.560661576f , 0.828045045f , --0.565731811f , 0.824589303f , --0.570780746f , 0.821102515f , --0.575808191f , 0.817584813f , --0.580813958f , 0.814036330f , --0.585797857f , 0.810457198f , --0.590759702f , 0.806847554f , --0.595699304f , 0.803207531f , --0.600616479f , 0.799537269f , --0.605511041f , 0.795836905f , --0.610382806f , 0.792106577f , --0.615231591f , 0.788346428f , --0.620057212f , 0.784556597f , --0.624859488f , 0.780737229f , --0.629638239f , 0.776888466f , --0.634393284f , 0.773010453f , --0.639124445f , 0.769103338f , --0.643831543f , 0.765167266f , --0.648514401f , 0.761202385f , --0.653172843f , 0.757208847f , --0.657806693f , 0.753186799f , --0.662415778f , 0.749136395f , --0.666999922f , 0.745057785f , --0.671558955f , 0.740951125f , --0.676092704f , 0.736816569f , --0.680600998f , 0.732654272f , --0.685083668f , 0.728464390f , --0.689540545f , 0.724247083f , --0.693971461f , 0.720002508f , --0.698376249f , 0.715730825f , --0.702754744f , 0.711432196f , --0.707106781f , 0.707106781f , --0.711432196f , 0.702754744f , --0.715730825f , 0.698376249f , --0.720002508f , 0.693971461f , --0.724247083f , 0.689540545f , --0.728464390f , 0.685083668f , --0.732654272f , 0.680600998f , --0.736816569f , 0.676092704f , --0.740951125f , 0.671558955f , --0.745057785f , 0.666999922f , --0.749136395f , 0.662415778f , --0.753186799f , 0.657806693f , --0.757208847f , 0.653172843f , --0.761202385f , 0.648514401f , --0.765167266f , 0.643831543f , --0.769103338f , 0.639124445f , --0.773010453f , 0.634393284f , --0.776888466f , 0.629638239f , --0.780737229f , 0.624859488f , --0.784556597f , 0.620057212f , --0.788346428f , 0.615231591f , --0.792106577f , 0.610382806f , --0.795836905f , 0.605511041f , --0.799537269f , 0.600616479f , --0.803207531f , 0.595699304f , --0.806847554f , 0.590759702f , --0.810457198f , 0.585797857f , --0.814036330f , 0.580813958f , --0.817584813f , 0.575808191f , --0.821102515f , 0.570780746f , --0.824589303f , 0.565731811f , --0.828045045f , 0.560661576f , --0.831469612f , 0.555570233f , --0.834862875f , 0.550457973f , --0.838224706f , 0.545324988f , --0.841554977f , 0.540171473f , --0.844853565f , 0.534997620f , --0.848120345f , 0.529803625f , --0.851355193f , 0.524589683f , --0.854557988f , 0.519355990f , --0.857728610f , 0.514102744f , --0.860866939f , 0.508830143f , --0.863972856f , 0.503538384f , --0.867046246f , 0.498227667f , --0.870086991f , 0.492898192f , --0.873094978f , 0.487550160f , --0.876070094f , 0.482183772f , --0.879012226f , 0.476799230f , --0.881921264f , 0.471396737f , --0.884797098f , 0.465976496f , --0.887639620f , 0.460538711f , --0.890448723f , 0.455083587f , --0.893224301f , 0.449611330f , --0.895966250f , 0.444122145f , --0.898674466f , 0.438616239f , --0.901348847f , 0.433093819f , --0.903989293f , 0.427555093f , --0.906595705f , 0.422000271f , --0.909167983f , 0.416429560f , --0.911706032f , 0.410843171f , --0.914209756f , 0.405241314f , --0.916679060f , 0.399624200f , --0.919113852f , 0.393992040f , --0.921514039f , 0.388345047f , --0.923879533f , 0.382683432f , --0.926210242f , 0.377007410f , --0.928506080f , 0.371317194f , --0.930766961f , 0.365612998f , --0.932992799f , 0.359895037f , --0.935183510f , 0.354163525f , --0.937339012f , 0.348418680f , --0.939459224f , 0.342660717f , --0.941544065f , 0.336889853f , --0.943593458f , 0.331106306f , --0.945607325f , 0.325310292f , --0.947585591f , 0.319502031f , --0.949528181f , 0.313681740f , --0.951435021f , 0.307849640f , --0.953306040f , 0.302005949f , --0.955141168f , 0.296150888f , --0.956940336f , 0.290284677f , --0.958703475f , 0.284407537f , --0.960430519f , 0.278519689f , --0.962121404f , 0.272621355f , --0.963776066f , 0.266712757f , --0.965394442f , 0.260794118f , --0.966976471f , 0.254865660f , --0.968522094f , 0.248927606f , --0.970031253f , 0.242980180f , --0.971503891f , 0.237023606f , --0.972939952f , 0.231058108f , --0.974339383f , 0.225083911f , --0.975702130f , 0.219101240f , --0.977028143f , 0.213110320f , --0.978317371f , 0.207111376f , --0.979569766f , 0.201104635f , --0.980785280f , 0.195090322f , --0.981963869f , 0.189068664f , --0.983105487f , 0.183039888f , --0.984210092f , 0.177004220f , --0.985277642f , 0.170961889f , --0.986308097f , 0.164913120f , --0.987301418f , 0.158858143f , --0.988257568f , 0.152797185f , --0.989176510f , 0.146730474f , --0.990058210f , 0.140658239f , --0.990902635f , 0.134580709f , --0.991709754f , 0.128498111f , --0.992479535f , 0.122410675f , --0.993211949f , 0.116318631f , --0.993906970f , 0.110222207f , --0.994564571f , 0.104121634f , --0.995184727f , 0.098017140f , --0.995767414f , 0.091908956f , --0.996312612f , 0.085797312f , --0.996820299f , 0.079682438f , --0.997290457f , 0.073564564f , --0.997723067f , 0.067443920f , --0.998118113f , 0.061320736f , --0.998475581f , 0.055195244f , --0.998795456f , 0.049067674f , --0.999077728f , 0.042938257f , --0.999322385f , 0.036807223f , --0.999529418f , 0.030674803f , --0.999698819f , 0.024541229f , --0.999830582f , 0.018406730f , --0.999924702f , 0.012271538f , --0.999981175f , 0.006135885f , --1.000000000f , 0.000000000f , --0.999981175f , -0.006135885f , --0.999924702f , -0.012271538f , --0.999830582f , -0.018406730f , --0.999698819f , -0.024541229f , --0.999529418f , -0.030674803f , --0.999322385f , -0.036807223f , --0.999077728f , -0.042938257f , --0.998795456f , -0.049067674f , --0.998475581f , -0.055195244f , --0.998118113f , -0.061320736f , --0.997723067f , -0.067443920f , --0.997290457f , -0.073564564f , --0.996820299f , -0.079682438f , --0.996312612f , -0.085797312f , --0.995767414f , -0.091908956f , --0.995184727f , -0.098017140f , --0.994564571f , -0.104121634f , --0.993906970f , -0.110222207f , --0.993211949f , -0.116318631f , --0.992479535f , -0.122410675f , --0.991709754f , -0.128498111f , --0.990902635f , -0.134580709f , --0.990058210f , -0.140658239f , --0.989176510f , -0.146730474f , --0.988257568f , -0.152797185f , --0.987301418f , -0.158858143f , --0.986308097f , -0.164913120f , --0.985277642f , -0.170961889f , --0.984210092f , -0.177004220f , --0.983105487f , -0.183039888f , --0.981963869f , -0.189068664f , --0.980785280f , -0.195090322f , --0.979569766f , -0.201104635f , --0.978317371f , -0.207111376f , --0.977028143f , -0.213110320f , --0.975702130f , -0.219101240f , --0.974339383f , -0.225083911f , --0.972939952f , -0.231058108f , --0.971503891f , -0.237023606f , --0.970031253f , -0.242980180f , --0.968522094f , -0.248927606f , --0.966976471f , -0.254865660f , --0.965394442f , -0.260794118f , --0.963776066f , -0.266712757f , --0.962121404f , -0.272621355f , --0.960430519f , -0.278519689f , --0.958703475f , -0.284407537f , --0.956940336f , -0.290284677f , --0.955141168f , -0.296150888f , --0.953306040f , -0.302005949f , --0.951435021f , -0.307849640f , --0.949528181f , -0.313681740f , --0.947585591f , -0.319502031f , --0.945607325f , -0.325310292f , --0.943593458f , -0.331106306f , --0.941544065f , -0.336889853f , --0.939459224f , -0.342660717f , --0.937339012f , -0.348418680f , --0.935183510f , -0.354163525f , --0.932992799f , -0.359895037f , --0.930766961f , -0.365612998f , --0.928506080f , -0.371317194f , --0.926210242f , -0.377007410f , --0.923879533f , -0.382683432f , --0.921514039f , -0.388345047f , --0.919113852f , -0.393992040f , --0.916679060f , -0.399624200f , --0.914209756f , -0.405241314f , --0.911706032f , -0.410843171f , --0.909167983f , -0.416429560f , --0.906595705f , -0.422000271f , --0.903989293f , -0.427555093f , --0.901348847f , -0.433093819f , --0.898674466f , -0.438616239f , --0.895966250f , -0.444122145f , --0.893224301f , -0.449611330f , --0.890448723f , -0.455083587f , --0.887639620f , -0.460538711f , --0.884797098f , -0.465976496f , --0.881921264f , -0.471396737f , --0.879012226f , -0.476799230f , --0.876070094f , -0.482183772f , --0.873094978f , -0.487550160f , --0.870086991f , -0.492898192f , --0.867046246f , -0.498227667f , --0.863972856f , -0.503538384f , --0.860866939f , -0.508830143f , --0.857728610f , -0.514102744f , --0.854557988f , -0.519355990f , --0.851355193f , -0.524589683f , --0.848120345f , -0.529803625f , --0.844853565f , -0.534997620f , --0.841554977f , -0.540171473f , --0.838224706f , -0.545324988f , --0.834862875f , -0.550457973f , --0.831469612f , -0.555570233f , --0.828045045f , -0.560661576f , --0.824589303f , -0.565731811f , --0.821102515f , -0.570780746f , --0.817584813f , -0.575808191f , --0.814036330f , -0.580813958f , --0.810457198f , -0.585797857f , --0.806847554f , -0.590759702f , --0.803207531f , -0.595699304f , --0.799537269f , -0.600616479f , --0.795836905f , -0.605511041f , --0.792106577f , -0.610382806f , --0.788346428f , -0.615231591f , --0.784556597f , -0.620057212f , --0.780737229f , -0.624859488f , --0.776888466f , -0.629638239f , --0.773010453f , -0.634393284f , --0.769103338f , -0.639124445f , --0.765167266f , -0.643831543f , --0.761202385f , -0.648514401f , --0.757208847f , -0.653172843f , --0.753186799f , -0.657806693f , --0.749136395f , -0.662415778f , --0.745057785f , -0.666999922f , --0.740951125f , -0.671558955f , --0.736816569f , -0.676092704f , --0.732654272f , -0.680600998f , --0.728464390f , -0.685083668f , --0.724247083f , -0.689540545f , --0.720002508f , -0.693971461f , --0.715730825f , -0.698376249f , --0.711432196f , -0.702754744f , --0.707106781f , -0.707106781f , --0.702754744f , -0.711432196f , --0.698376249f , -0.715730825f , --0.693971461f , -0.720002508f , --0.689540545f , -0.724247083f , --0.685083668f , -0.728464390f , --0.680600998f , -0.732654272f , --0.676092704f , -0.736816569f , --0.671558955f , -0.740951125f , --0.666999922f , -0.745057785f , --0.662415778f , -0.749136395f , --0.657806693f , -0.753186799f , --0.653172843f , -0.757208847f , --0.648514401f , -0.761202385f , --0.643831543f , -0.765167266f , --0.639124445f , -0.769103338f , --0.634393284f , -0.773010453f , --0.629638239f , -0.776888466f , --0.624859488f , -0.780737229f , --0.620057212f , -0.784556597f , --0.615231591f , -0.788346428f , --0.610382806f , -0.792106577f , --0.605511041f , -0.795836905f , --0.600616479f , -0.799537269f , --0.595699304f , -0.803207531f , --0.590759702f , -0.806847554f , --0.585797857f , -0.810457198f , --0.580813958f , -0.814036330f , --0.575808191f , -0.817584813f , --0.570780746f , -0.821102515f , --0.565731811f , -0.824589303f , --0.560661576f , -0.828045045f , --0.555570233f , -0.831469612f , --0.550457973f , -0.834862875f , --0.545324988f , -0.838224706f , --0.540171473f , -0.841554977f , --0.534997620f , -0.844853565f , --0.529803625f , -0.848120345f , --0.524589683f , -0.851355193f , --0.519355990f , -0.854557988f , --0.514102744f , -0.857728610f , --0.508830143f , -0.860866939f , --0.503538384f , -0.863972856f , --0.498227667f , -0.867046246f , --0.492898192f , -0.870086991f , --0.487550160f , -0.873094978f , --0.482183772f , -0.876070094f , --0.476799230f , -0.879012226f , --0.471396737f , -0.881921264f , --0.465976496f , -0.884797098f , --0.460538711f , -0.887639620f , --0.455083587f , -0.890448723f , --0.449611330f , -0.893224301f , --0.444122145f , -0.895966250f , --0.438616239f , -0.898674466f , --0.433093819f , -0.901348847f , --0.427555093f , -0.903989293f , --0.422000271f , -0.906595705f , --0.416429560f , -0.909167983f , --0.410843171f , -0.911706032f , --0.405241314f , -0.914209756f , --0.399624200f , -0.916679060f , --0.393992040f , -0.919113852f , --0.388345047f , -0.921514039f , --0.382683432f , -0.923879533f , --0.377007410f , -0.926210242f , --0.371317194f , -0.928506080f , --0.365612998f , -0.930766961f , --0.359895037f , -0.932992799f , --0.354163525f , -0.935183510f , --0.348418680f , -0.937339012f , --0.342660717f , -0.939459224f , --0.336889853f , -0.941544065f , --0.331106306f , -0.943593458f , --0.325310292f , -0.945607325f , --0.319502031f , -0.947585591f , --0.313681740f , -0.949528181f , --0.307849640f , -0.951435021f , --0.302005949f , -0.953306040f , --0.296150888f , -0.955141168f , --0.290284677f , -0.956940336f , --0.284407537f , -0.958703475f , --0.278519689f , -0.960430519f , --0.272621355f , -0.962121404f , --0.266712757f , -0.963776066f , --0.260794118f , -0.965394442f , --0.254865660f , -0.966976471f , --0.248927606f , -0.968522094f , --0.242980180f , -0.970031253f , --0.237023606f , -0.971503891f , --0.231058108f , -0.972939952f , --0.225083911f , -0.974339383f , --0.219101240f , -0.975702130f , --0.213110320f , -0.977028143f , --0.207111376f , -0.978317371f , --0.201104635f , -0.979569766f , --0.195090322f , -0.980785280f , --0.189068664f , -0.981963869f , --0.183039888f , -0.983105487f , --0.177004220f , -0.984210092f , --0.170961889f , -0.985277642f , --0.164913120f , -0.986308097f , --0.158858143f , -0.987301418f , --0.152797185f , -0.988257568f , --0.146730474f , -0.989176510f , --0.140658239f , -0.990058210f , --0.134580709f , -0.990902635f , --0.128498111f , -0.991709754f , --0.122410675f , -0.992479535f , --0.116318631f , -0.993211949f , --0.110222207f , -0.993906970f , --0.104121634f , -0.994564571f , --0.098017140f , -0.995184727f , --0.091908956f , -0.995767414f , --0.085797312f , -0.996312612f , --0.079682438f , -0.996820299f , --0.073564564f , -0.997290457f , --0.067443920f , -0.997723067f , --0.061320736f , -0.998118113f , --0.055195244f , -0.998475581f , --0.049067674f , -0.998795456f , --0.042938257f , -0.999077728f , --0.036807223f , -0.999322385f , --0.030674803f , -0.999529418f , --0.024541229f , -0.999698819f , --0.018406730f , -0.999830582f , --0.012271538f , -0.999924702f , --0.006135885f , -0.999981175f , --0.000000000f , -1.000000000f , -0.006135885f , -0.999981175f , -0.012271538f , -0.999924702f , -0.018406730f , -0.999830582f , -0.024541229f , -0.999698819f , -0.030674803f , -0.999529418f , -0.036807223f , -0.999322385f , -0.042938257f , -0.999077728f , -0.049067674f , -0.998795456f , -0.055195244f , -0.998475581f , -0.061320736f , -0.998118113f , -0.067443920f , -0.997723067f , -0.073564564f , -0.997290457f , -0.079682438f , -0.996820299f , -0.085797312f , -0.996312612f , -0.091908956f , -0.995767414f , -0.098017140f , -0.995184727f , -0.104121634f , -0.994564571f , -0.110222207f , -0.993906970f , -0.116318631f , -0.993211949f , -0.122410675f , -0.992479535f , -0.128498111f , -0.991709754f , -0.134580709f , -0.990902635f , -0.140658239f , -0.990058210f , -0.146730474f , -0.989176510f , -0.152797185f , -0.988257568f , -0.158858143f , -0.987301418f , -0.164913120f , -0.986308097f , -0.170961889f , -0.985277642f , -0.177004220f , -0.984210092f , -0.183039888f , -0.983105487f , -0.189068664f , -0.981963869f , -0.195090322f , -0.980785280f , -0.201104635f , -0.979569766f , -0.207111376f , -0.978317371f , -0.213110320f , -0.977028143f , -0.219101240f , -0.975702130f , -0.225083911f , -0.974339383f , -0.231058108f , -0.972939952f , -0.237023606f , -0.971503891f , -0.242980180f , -0.970031253f , -0.248927606f , -0.968522094f , -0.254865660f , -0.966976471f , -0.260794118f , -0.965394442f , -0.266712757f , -0.963776066f , -0.272621355f , -0.962121404f , -0.278519689f , -0.960430519f , -0.284407537f , -0.958703475f , -0.290284677f , -0.956940336f , -0.296150888f , -0.955141168f , -0.302005949f , -0.953306040f , -0.307849640f , -0.951435021f , -0.313681740f , -0.949528181f , -0.319502031f , -0.947585591f , -0.325310292f , -0.945607325f , -0.331106306f , -0.943593458f , -0.336889853f , -0.941544065f , -0.342660717f , -0.939459224f , -0.348418680f , -0.937339012f , -0.354163525f , -0.935183510f , -0.359895037f , -0.932992799f , -0.365612998f , -0.930766961f , -0.371317194f , -0.928506080f , -0.377007410f , -0.926210242f , -0.382683432f , -0.923879533f , -0.388345047f , -0.921514039f , -0.393992040f , -0.919113852f , -0.399624200f , -0.916679060f , -0.405241314f , -0.914209756f , -0.410843171f , -0.911706032f , -0.416429560f , -0.909167983f , -0.422000271f , -0.906595705f , -0.427555093f , -0.903989293f , -0.433093819f , -0.901348847f , -0.438616239f , -0.898674466f , -0.444122145f , -0.895966250f , -0.449611330f , -0.893224301f , -0.455083587f , -0.890448723f , -0.460538711f , -0.887639620f , -0.465976496f , -0.884797098f , -0.471396737f , -0.881921264f , -0.476799230f , -0.879012226f , -0.482183772f , -0.876070094f , -0.487550160f , -0.873094978f , -0.492898192f , -0.870086991f , -0.498227667f , -0.867046246f , -0.503538384f , -0.863972856f , -0.508830143f , -0.860866939f , -0.514102744f , -0.857728610f , -0.519355990f , -0.854557988f , -0.524589683f , -0.851355193f , -0.529803625f , -0.848120345f , -0.534997620f , -0.844853565f , -0.540171473f , -0.841554977f , -0.545324988f , -0.838224706f , -0.550457973f , -0.834862875f , -0.555570233f , -0.831469612f , -0.560661576f , -0.828045045f , -0.565731811f , -0.824589303f , -0.570780746f , -0.821102515f , -0.575808191f , -0.817584813f , -0.580813958f , -0.814036330f , -0.585797857f , -0.810457198f , -0.590759702f , -0.806847554f , -0.595699304f , -0.803207531f , -0.600616479f , -0.799537269f , -0.605511041f , -0.795836905f , -0.610382806f , -0.792106577f , -0.615231591f , -0.788346428f , -0.620057212f , -0.784556597f , -0.624859488f , -0.780737229f , -0.629638239f , -0.776888466f , -0.634393284f , -0.773010453f , -0.639124445f , -0.769103338f , -0.643831543f , -0.765167266f , -0.648514401f , -0.761202385f , -0.653172843f , -0.757208847f , -0.657806693f , -0.753186799f , -0.662415778f , -0.749136395f , -0.666999922f , -0.745057785f , -0.671558955f , -0.740951125f , -0.676092704f , -0.736816569f , -0.680600998f , -0.732654272f , -0.685083668f , -0.728464390f , -0.689540545f , -0.724247083f , -0.693971461f , -0.720002508f , -0.698376249f , -0.715730825f , -0.702754744f , -0.711432196f , -0.707106781f , -0.707106781f , -0.711432196f , -0.702754744f , -0.715730825f , -0.698376249f , -0.720002508f , -0.693971461f , -0.724247083f , -0.689540545f , -0.728464390f , -0.685083668f , -0.732654272f , -0.680600998f , -0.736816569f , -0.676092704f , -0.740951125f , -0.671558955f , -0.745057785f , -0.666999922f , -0.749136395f , -0.662415778f , -0.753186799f , -0.657806693f , -0.757208847f , -0.653172843f , -0.761202385f , -0.648514401f , -0.765167266f , -0.643831543f , -0.769103338f , -0.639124445f , -0.773010453f , -0.634393284f , -0.776888466f , -0.629638239f , -0.780737229f , -0.624859488f , -0.784556597f , -0.620057212f , -0.788346428f , -0.615231591f , -0.792106577f , -0.610382806f , -0.795836905f , -0.605511041f , -0.799537269f , -0.600616479f , -0.803207531f , -0.595699304f , -0.806847554f , -0.590759702f , -0.810457198f , -0.585797857f , -0.814036330f , -0.580813958f , -0.817584813f , -0.575808191f , -0.821102515f , -0.570780746f , -0.824589303f , -0.565731811f , -0.828045045f , -0.560661576f , -0.831469612f , -0.555570233f , -0.834862875f , -0.550457973f , -0.838224706f , -0.545324988f , -0.841554977f , -0.540171473f , -0.844853565f , -0.534997620f , -0.848120345f , -0.529803625f , -0.851355193f , -0.524589683f , -0.854557988f , -0.519355990f , -0.857728610f , -0.514102744f , -0.860866939f , -0.508830143f , -0.863972856f , -0.503538384f , -0.867046246f , -0.498227667f , -0.870086991f , -0.492898192f , -0.873094978f , -0.487550160f , -0.876070094f , -0.482183772f , -0.879012226f , -0.476799230f , -0.881921264f , -0.471396737f , -0.884797098f , -0.465976496f , -0.887639620f , -0.460538711f , -0.890448723f , -0.455083587f , -0.893224301f , -0.449611330f , -0.895966250f , -0.444122145f , -0.898674466f , -0.438616239f , -0.901348847f , -0.433093819f , -0.903989293f , -0.427555093f , -0.906595705f , -0.422000271f , -0.909167983f , -0.416429560f , -0.911706032f , -0.410843171f , -0.914209756f , -0.405241314f , -0.916679060f , -0.399624200f , -0.919113852f , -0.393992040f , -0.921514039f , -0.388345047f , -0.923879533f , -0.382683432f , -0.926210242f , -0.377007410f , -0.928506080f , -0.371317194f , -0.930766961f , -0.365612998f , -0.932992799f , -0.359895037f , -0.935183510f , -0.354163525f , -0.937339012f , -0.348418680f , -0.939459224f , -0.342660717f , -0.941544065f , -0.336889853f , -0.943593458f , -0.331106306f , -0.945607325f , -0.325310292f , -0.947585591f , -0.319502031f , -0.949528181f , -0.313681740f , -0.951435021f , -0.307849640f , -0.953306040f , -0.302005949f , -0.955141168f , -0.296150888f , -0.956940336f , -0.290284677f , -0.958703475f , -0.284407537f , -0.960430519f , -0.278519689f , -0.962121404f , -0.272621355f , -0.963776066f , -0.266712757f , -0.965394442f , -0.260794118f , -0.966976471f , -0.254865660f , -0.968522094f , -0.248927606f , -0.970031253f , -0.242980180f , -0.971503891f , -0.237023606f , -0.972939952f , -0.231058108f , -0.974339383f , -0.225083911f , -0.975702130f , -0.219101240f , -0.977028143f , -0.213110320f , -0.978317371f , -0.207111376f , -0.979569766f , -0.201104635f , -0.980785280f , -0.195090322f , -0.981963869f , -0.189068664f , -0.983105487f , -0.183039888f , -0.984210092f , -0.177004220f , -0.985277642f , -0.170961889f , -0.986308097f , -0.164913120f , -0.987301418f , -0.158858143f , -0.988257568f , -0.152797185f , -0.989176510f , -0.146730474f , -0.990058210f , -0.140658239f , -0.990902635f , -0.134580709f , -0.991709754f , -0.128498111f , -0.992479535f , -0.122410675f , -0.993211949f , -0.116318631f , -0.993906970f , -0.110222207f , -0.994564571f , -0.104121634f , -0.995184727f , -0.098017140f , -0.995767414f , -0.091908956f , -0.996312612f , -0.085797312f , -0.996820299f , -0.079682438f , -0.997290457f , -0.073564564f , -0.997723067f , -0.067443920f , -0.998118113f , -0.061320736f , -0.998475581f , -0.055195244f , -0.998795456f , -0.049067674f , -0.999077728f , -0.042938257f , -0.999322385f , -0.036807223f , -0.999529418f , -0.030674803f , -0.999698819f , -0.024541229f , -0.999830582f , -0.018406730f , -0.999924702f , -0.012271538f , -0.999981175f , -0.006135885f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 2048 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_2048[4096] = { - 1.000000000f, 0.000000000f, - 0.999995294f, 0.003067957f, - 0.999981175f, 0.006135885f, - 0.999957645f, 0.009203755f, - 0.999924702f, 0.012271538f, - 0.999882347f, 0.015339206f, - 0.999830582f, 0.018406730f, - 0.999769405f, 0.021474080f, - 0.999698819f, 0.024541229f, - 0.999618822f, 0.027608146f, - 0.999529418f, 0.030674803f, - 0.999430605f, 0.033741172f, - 0.999322385f, 0.036807223f, - 0.999204759f, 0.039872928f, - 0.999077728f, 0.042938257f, - 0.998941293f, 0.046003182f, - 0.998795456f, 0.049067674f, - 0.998640218f, 0.052131705f, - 0.998475581f, 0.055195244f, - 0.998301545f, 0.058258265f, - 0.998118113f, 0.061320736f, - 0.997925286f, 0.064382631f, - 0.997723067f, 0.067443920f, - 0.997511456f, 0.070504573f, - 0.997290457f, 0.073564564f, - 0.997060070f, 0.076623861f, - 0.996820299f, 0.079682438f, - 0.996571146f, 0.082740265f, - 0.996312612f, 0.085797312f, - 0.996044701f, 0.088853553f, - 0.995767414f, 0.091908956f, - 0.995480755f, 0.094963495f, - 0.995184727f, 0.098017140f, - 0.994879331f, 0.101069863f, - 0.994564571f, 0.104121634f, - 0.994240449f, 0.107172425f, - 0.993906970f, 0.110222207f, - 0.993564136f, 0.113270952f, - 0.993211949f, 0.116318631f, - 0.992850414f, 0.119365215f, - 0.992479535f, 0.122410675f, - 0.992099313f, 0.125454983f, - 0.991709754f, 0.128498111f, - 0.991310860f, 0.131540029f, - 0.990902635f, 0.134580709f, - 0.990485084f, 0.137620122f, - 0.990058210f, 0.140658239f, - 0.989622017f, 0.143695033f, - 0.989176510f, 0.146730474f, - 0.988721692f, 0.149764535f, - 0.988257568f, 0.152797185f, - 0.987784142f, 0.155828398f, - 0.987301418f, 0.158858143f, - 0.986809402f, 0.161886394f, - 0.986308097f, 0.164913120f, - 0.985797509f, 0.167938295f, - 0.985277642f, 0.170961889f, - 0.984748502f, 0.173983873f, - 0.984210092f, 0.177004220f, - 0.983662419f, 0.180022901f, - 0.983105487f, 0.183039888f, - 0.982539302f, 0.186055152f, - 0.981963869f, 0.189068664f, - 0.981379193f, 0.192080397f, - 0.980785280f, 0.195090322f, - 0.980182136f, 0.198098411f, - 0.979569766f, 0.201104635f, - 0.978948175f, 0.204108966f, - 0.978317371f, 0.207111376f, - 0.977677358f, 0.210111837f, - 0.977028143f, 0.213110320f, - 0.976369731f, 0.216106797f, - 0.975702130f, 0.219101240f, - 0.975025345f, 0.222093621f, - 0.974339383f, 0.225083911f, - 0.973644250f, 0.228072083f, - 0.972939952f, 0.231058108f, - 0.972226497f, 0.234041959f, - 0.971503891f, 0.237023606f, - 0.970772141f, 0.240003022f, - 0.970031253f, 0.242980180f, - 0.969281235f, 0.245955050f, - 0.968522094f, 0.248927606f, - 0.967753837f, 0.251897818f, - 0.966976471f, 0.254865660f, - 0.966190003f, 0.257831102f, - 0.965394442f, 0.260794118f, - 0.964589793f, 0.263754679f, - 0.963776066f, 0.266712757f, - 0.962953267f, 0.269668326f, - 0.962121404f, 0.272621355f, - 0.961280486f, 0.275571819f, - 0.960430519f, 0.278519689f, - 0.959571513f, 0.281464938f, - 0.958703475f, 0.284407537f, - 0.957826413f, 0.287347460f, - 0.956940336f, 0.290284677f, - 0.956045251f, 0.293219163f, - 0.955141168f, 0.296150888f, - 0.954228095f, 0.299079826f, - 0.953306040f, 0.302005949f, - 0.952375013f, 0.304929230f, - 0.951435021f, 0.307849640f, - 0.950486074f, 0.310767153f, - 0.949528181f, 0.313681740f, - 0.948561350f, 0.316593376f, - 0.947585591f, 0.319502031f, - 0.946600913f, 0.322407679f, - 0.945607325f, 0.325310292f, - 0.944604837f, 0.328209844f, - 0.943593458f, 0.331106306f, - 0.942573198f, 0.333999651f, - 0.941544065f, 0.336889853f, - 0.940506071f, 0.339776884f, - 0.939459224f, 0.342660717f, - 0.938403534f, 0.345541325f, - 0.937339012f, 0.348418680f, - 0.936265667f, 0.351292756f, - 0.935183510f, 0.354163525f, - 0.934092550f, 0.357030961f, - 0.932992799f, 0.359895037f, - 0.931884266f, 0.362755724f, - 0.930766961f, 0.365612998f, - 0.929640896f, 0.368466830f, - 0.928506080f, 0.371317194f, - 0.927362526f, 0.374164063f, - 0.926210242f, 0.377007410f, - 0.925049241f, 0.379847209f, - 0.923879533f, 0.382683432f, - 0.922701128f, 0.385516054f, - 0.921514039f, 0.388345047f, - 0.920318277f, 0.391170384f, - 0.919113852f, 0.393992040f, - 0.917900776f, 0.396809987f, - 0.916679060f, 0.399624200f, - 0.915448716f, 0.402434651f, - 0.914209756f, 0.405241314f, - 0.912962190f, 0.408044163f, - 0.911706032f, 0.410843171f, - 0.910441292f, 0.413638312f, - 0.909167983f, 0.416429560f, - 0.907886116f, 0.419216888f, - 0.906595705f, 0.422000271f, - 0.905296759f, 0.424779681f, - 0.903989293f, 0.427555093f, - 0.902673318f, 0.430326481f, - 0.901348847f, 0.433093819f, - 0.900015892f, 0.435857080f, - 0.898674466f, 0.438616239f, - 0.897324581f, 0.441371269f, - 0.895966250f, 0.444122145f, - 0.894599486f, 0.446868840f, - 0.893224301f, 0.449611330f, - 0.891840709f, 0.452349587f, - 0.890448723f, 0.455083587f, - 0.889048356f, 0.457813304f, - 0.887639620f, 0.460538711f, - 0.886222530f, 0.463259784f, - 0.884797098f, 0.465976496f, - 0.883363339f, 0.468688822f, - 0.881921264f, 0.471396737f, - 0.880470889f, 0.474100215f, - 0.879012226f, 0.476799230f, - 0.877545290f, 0.479493758f, - 0.876070094f, 0.482183772f, - 0.874586652f, 0.484869248f, - 0.873094978f, 0.487550160f, - 0.871595087f, 0.490226483f, - 0.870086991f, 0.492898192f, - 0.868570706f, 0.495565262f, - 0.867046246f, 0.498227667f, - 0.865513624f, 0.500885383f, - 0.863972856f, 0.503538384f, - 0.862423956f, 0.506186645f, - 0.860866939f, 0.508830143f, - 0.859301818f, 0.511468850f, - 0.857728610f, 0.514102744f, - 0.856147328f, 0.516731799f, - 0.854557988f, 0.519355990f, - 0.852960605f, 0.521975293f, - 0.851355193f, 0.524589683f, - 0.849741768f, 0.527199135f, - 0.848120345f, 0.529803625f, - 0.846490939f, 0.532403128f, - 0.844853565f, 0.534997620f, - 0.843208240f, 0.537587076f, - 0.841554977f, 0.540171473f, - 0.839893794f, 0.542750785f, - 0.838224706f, 0.545324988f, - 0.836547727f, 0.547894059f, - 0.834862875f, 0.550457973f, - 0.833170165f, 0.553016706f, - 0.831469612f, 0.555570233f, - 0.829761234f, 0.558118531f, - 0.828045045f, 0.560661576f, - 0.826321063f, 0.563199344f, - 0.824589303f, 0.565731811f, - 0.822849781f, 0.568258953f, - 0.821102515f, 0.570780746f, - 0.819347520f, 0.573297167f, - 0.817584813f, 0.575808191f, - 0.815814411f, 0.578313796f, - 0.814036330f, 0.580813958f, - 0.812250587f, 0.583308653f, - 0.810457198f, 0.585797857f, - 0.808656182f, 0.588281548f, - 0.806847554f, 0.590759702f, - 0.805031331f, 0.593232295f, - 0.803207531f, 0.595699304f, - 0.801376172f, 0.598160707f, - 0.799537269f, 0.600616479f, - 0.797690841f, 0.603066599f, - 0.795836905f, 0.605511041f, - 0.793975478f, 0.607949785f, - 0.792106577f, 0.610382806f, - 0.790230221f, 0.612810082f, - 0.788346428f, 0.615231591f, - 0.786455214f, 0.617647308f, - 0.784556597f, 0.620057212f, - 0.782650596f, 0.622461279f, - 0.780737229f, 0.624859488f, - 0.778816512f, 0.627251815f, - 0.776888466f, 0.629638239f, - 0.774953107f, 0.632018736f, - 0.773010453f, 0.634393284f, - 0.771060524f, 0.636761861f, - 0.769103338f, 0.639124445f, - 0.767138912f, 0.641481013f, - 0.765167266f, 0.643831543f, - 0.763188417f, 0.646176013f, - 0.761202385f, 0.648514401f, - 0.759209189f, 0.650846685f, - 0.757208847f, 0.653172843f, - 0.755201377f, 0.655492853f, - 0.753186799f, 0.657806693f, - 0.751165132f, 0.660114342f, - 0.749136395f, 0.662415778f, - 0.747100606f, 0.664710978f, - 0.745057785f, 0.666999922f, - 0.743007952f, 0.669282588f, - 0.740951125f, 0.671558955f, - 0.738887324f, 0.673829000f, - 0.736816569f, 0.676092704f, - 0.734738878f, 0.678350043f, - 0.732654272f, 0.680600998f, - 0.730562769f, 0.682845546f, - 0.728464390f, 0.685083668f, - 0.726359155f, 0.687315341f, - 0.724247083f, 0.689540545f, - 0.722128194f, 0.691759258f, - 0.720002508f, 0.693971461f, - 0.717870045f, 0.696177131f, - 0.715730825f, 0.698376249f, - 0.713584869f, 0.700568794f, - 0.711432196f, 0.702754744f, - 0.709272826f, 0.704934080f, - 0.707106781f, 0.707106781f, - 0.704934080f, 0.709272826f, - 0.702754744f, 0.711432196f, - 0.700568794f, 0.713584869f, - 0.698376249f, 0.715730825f, - 0.696177131f, 0.717870045f, - 0.693971461f, 0.720002508f, - 0.691759258f, 0.722128194f, - 0.689540545f, 0.724247083f, - 0.687315341f, 0.726359155f, - 0.685083668f, 0.728464390f, - 0.682845546f, 0.730562769f, - 0.680600998f, 0.732654272f, - 0.678350043f, 0.734738878f, - 0.676092704f, 0.736816569f, - 0.673829000f, 0.738887324f, - 0.671558955f, 0.740951125f, - 0.669282588f, 0.743007952f, - 0.666999922f, 0.745057785f, - 0.664710978f, 0.747100606f, - 0.662415778f, 0.749136395f, - 0.660114342f, 0.751165132f, - 0.657806693f, 0.753186799f, - 0.655492853f, 0.755201377f, - 0.653172843f, 0.757208847f, - 0.650846685f, 0.759209189f, - 0.648514401f, 0.761202385f, - 0.646176013f, 0.763188417f, - 0.643831543f, 0.765167266f, - 0.641481013f, 0.767138912f, - 0.639124445f, 0.769103338f, - 0.636761861f, 0.771060524f, - 0.634393284f, 0.773010453f, - 0.632018736f, 0.774953107f, - 0.629638239f, 0.776888466f, - 0.627251815f, 0.778816512f, - 0.624859488f, 0.780737229f, - 0.622461279f, 0.782650596f, - 0.620057212f, 0.784556597f, - 0.617647308f, 0.786455214f, - 0.615231591f, 0.788346428f, - 0.612810082f, 0.790230221f, - 0.610382806f, 0.792106577f, - 0.607949785f, 0.793975478f, - 0.605511041f, 0.795836905f, - 0.603066599f, 0.797690841f, - 0.600616479f, 0.799537269f, - 0.598160707f, 0.801376172f, - 0.595699304f, 0.803207531f, - 0.593232295f, 0.805031331f, - 0.590759702f, 0.806847554f, - 0.588281548f, 0.808656182f, - 0.585797857f, 0.810457198f, - 0.583308653f, 0.812250587f, - 0.580813958f, 0.814036330f, - 0.578313796f, 0.815814411f, - 0.575808191f, 0.817584813f, - 0.573297167f, 0.819347520f, - 0.570780746f, 0.821102515f, - 0.568258953f, 0.822849781f, - 0.565731811f, 0.824589303f, - 0.563199344f, 0.826321063f, - 0.560661576f, 0.828045045f, - 0.558118531f, 0.829761234f, - 0.555570233f, 0.831469612f, - 0.553016706f, 0.833170165f, - 0.550457973f, 0.834862875f, - 0.547894059f, 0.836547727f, - 0.545324988f, 0.838224706f, - 0.542750785f, 0.839893794f, - 0.540171473f, 0.841554977f, - 0.537587076f, 0.843208240f, - 0.534997620f, 0.844853565f, - 0.532403128f, 0.846490939f, - 0.529803625f, 0.848120345f, - 0.527199135f, 0.849741768f, - 0.524589683f, 0.851355193f, - 0.521975293f, 0.852960605f, - 0.519355990f, 0.854557988f, - 0.516731799f, 0.856147328f, - 0.514102744f, 0.857728610f, - 0.511468850f, 0.859301818f, - 0.508830143f, 0.860866939f, - 0.506186645f, 0.862423956f, - 0.503538384f, 0.863972856f, - 0.500885383f, 0.865513624f, - 0.498227667f, 0.867046246f, - 0.495565262f, 0.868570706f, - 0.492898192f, 0.870086991f, - 0.490226483f, 0.871595087f, - 0.487550160f, 0.873094978f, - 0.484869248f, 0.874586652f, - 0.482183772f, 0.876070094f, - 0.479493758f, 0.877545290f, - 0.476799230f, 0.879012226f, - 0.474100215f, 0.880470889f, - 0.471396737f, 0.881921264f, - 0.468688822f, 0.883363339f, - 0.465976496f, 0.884797098f, - 0.463259784f, 0.886222530f, - 0.460538711f, 0.887639620f, - 0.457813304f, 0.889048356f, - 0.455083587f, 0.890448723f, - 0.452349587f, 0.891840709f, - 0.449611330f, 0.893224301f, - 0.446868840f, 0.894599486f, - 0.444122145f, 0.895966250f, - 0.441371269f, 0.897324581f, - 0.438616239f, 0.898674466f, - 0.435857080f, 0.900015892f, - 0.433093819f, 0.901348847f, - 0.430326481f, 0.902673318f, - 0.427555093f, 0.903989293f, - 0.424779681f, 0.905296759f, - 0.422000271f, 0.906595705f, - 0.419216888f, 0.907886116f, - 0.416429560f, 0.909167983f, - 0.413638312f, 0.910441292f, - 0.410843171f, 0.911706032f, - 0.408044163f, 0.912962190f, - 0.405241314f, 0.914209756f, - 0.402434651f, 0.915448716f, - 0.399624200f, 0.916679060f, - 0.396809987f, 0.917900776f, - 0.393992040f, 0.919113852f, - 0.391170384f, 0.920318277f, - 0.388345047f, 0.921514039f, - 0.385516054f, 0.922701128f, - 0.382683432f, 0.923879533f, - 0.379847209f, 0.925049241f, - 0.377007410f, 0.926210242f, - 0.374164063f, 0.927362526f, - 0.371317194f, 0.928506080f, - 0.368466830f, 0.929640896f, - 0.365612998f, 0.930766961f, - 0.362755724f, 0.931884266f, - 0.359895037f, 0.932992799f, - 0.357030961f, 0.934092550f, - 0.354163525f, 0.935183510f, - 0.351292756f, 0.936265667f, - 0.348418680f, 0.937339012f, - 0.345541325f, 0.938403534f, - 0.342660717f, 0.939459224f, - 0.339776884f, 0.940506071f, - 0.336889853f, 0.941544065f, - 0.333999651f, 0.942573198f, - 0.331106306f, 0.943593458f, - 0.328209844f, 0.944604837f, - 0.325310292f, 0.945607325f, - 0.322407679f, 0.946600913f, - 0.319502031f, 0.947585591f, - 0.316593376f, 0.948561350f, - 0.313681740f, 0.949528181f, - 0.310767153f, 0.950486074f, - 0.307849640f, 0.951435021f, - 0.304929230f, 0.952375013f, - 0.302005949f, 0.953306040f, - 0.299079826f, 0.954228095f, - 0.296150888f, 0.955141168f, - 0.293219163f, 0.956045251f, - 0.290284677f, 0.956940336f, - 0.287347460f, 0.957826413f, - 0.284407537f, 0.958703475f, - 0.281464938f, 0.959571513f, - 0.278519689f, 0.960430519f, - 0.275571819f, 0.961280486f, - 0.272621355f, 0.962121404f, - 0.269668326f, 0.962953267f, - 0.266712757f, 0.963776066f, - 0.263754679f, 0.964589793f, - 0.260794118f, 0.965394442f, - 0.257831102f, 0.966190003f, - 0.254865660f, 0.966976471f, - 0.251897818f, 0.967753837f, - 0.248927606f, 0.968522094f, - 0.245955050f, 0.969281235f, - 0.242980180f, 0.970031253f, - 0.240003022f, 0.970772141f, - 0.237023606f, 0.971503891f, - 0.234041959f, 0.972226497f, - 0.231058108f, 0.972939952f, - 0.228072083f, 0.973644250f, - 0.225083911f, 0.974339383f, - 0.222093621f, 0.975025345f, - 0.219101240f, 0.975702130f, - 0.216106797f, 0.976369731f, - 0.213110320f, 0.977028143f, - 0.210111837f, 0.977677358f, - 0.207111376f, 0.978317371f, - 0.204108966f, 0.978948175f, - 0.201104635f, 0.979569766f, - 0.198098411f, 0.980182136f, - 0.195090322f, 0.980785280f, - 0.192080397f, 0.981379193f, - 0.189068664f, 0.981963869f, - 0.186055152f, 0.982539302f, - 0.183039888f, 0.983105487f, - 0.180022901f, 0.983662419f, - 0.177004220f, 0.984210092f, - 0.173983873f, 0.984748502f, - 0.170961889f, 0.985277642f, - 0.167938295f, 0.985797509f, - 0.164913120f, 0.986308097f, - 0.161886394f, 0.986809402f, - 0.158858143f, 0.987301418f, - 0.155828398f, 0.987784142f, - 0.152797185f, 0.988257568f, - 0.149764535f, 0.988721692f, - 0.146730474f, 0.989176510f, - 0.143695033f, 0.989622017f, - 0.140658239f, 0.990058210f, - 0.137620122f, 0.990485084f, - 0.134580709f, 0.990902635f, - 0.131540029f, 0.991310860f, - 0.128498111f, 0.991709754f, - 0.125454983f, 0.992099313f, - 0.122410675f, 0.992479535f, - 0.119365215f, 0.992850414f, - 0.116318631f, 0.993211949f, - 0.113270952f, 0.993564136f, - 0.110222207f, 0.993906970f, - 0.107172425f, 0.994240449f, - 0.104121634f, 0.994564571f, - 0.101069863f, 0.994879331f, - 0.098017140f, 0.995184727f, - 0.094963495f, 0.995480755f, - 0.091908956f, 0.995767414f, - 0.088853553f, 0.996044701f, - 0.085797312f, 0.996312612f, - 0.082740265f, 0.996571146f, - 0.079682438f, 0.996820299f, - 0.076623861f, 0.997060070f, - 0.073564564f, 0.997290457f, - 0.070504573f, 0.997511456f, - 0.067443920f, 0.997723067f, - 0.064382631f, 0.997925286f, - 0.061320736f, 0.998118113f, - 0.058258265f, 0.998301545f, - 0.055195244f, 0.998475581f, - 0.052131705f, 0.998640218f, - 0.049067674f, 0.998795456f, - 0.046003182f, 0.998941293f, - 0.042938257f, 0.999077728f, - 0.039872928f, 0.999204759f, - 0.036807223f, 0.999322385f, - 0.033741172f, 0.999430605f, - 0.030674803f, 0.999529418f, - 0.027608146f, 0.999618822f, - 0.024541229f, 0.999698819f, - 0.021474080f, 0.999769405f, - 0.018406730f, 0.999830582f, - 0.015339206f, 0.999882347f, - 0.012271538f, 0.999924702f, - 0.009203755f, 0.999957645f, - 0.006135885f, 0.999981175f, - 0.003067957f, 0.999995294f, - 0.000000000f, 1.000000000f, - -0.003067957f, 0.999995294f, - -0.006135885f, 0.999981175f, - -0.009203755f, 0.999957645f, - -0.012271538f, 0.999924702f, - -0.015339206f, 0.999882347f, - -0.018406730f, 0.999830582f, - -0.021474080f, 0.999769405f, - -0.024541229f, 0.999698819f, - -0.027608146f, 0.999618822f, - -0.030674803f, 0.999529418f, - -0.033741172f, 0.999430605f, - -0.036807223f, 0.999322385f, - -0.039872928f, 0.999204759f, - -0.042938257f, 0.999077728f, - -0.046003182f, 0.998941293f, - -0.049067674f, 0.998795456f, - -0.052131705f, 0.998640218f, - -0.055195244f, 0.998475581f, - -0.058258265f, 0.998301545f, - -0.061320736f, 0.998118113f, - -0.064382631f, 0.997925286f, - -0.067443920f, 0.997723067f, - -0.070504573f, 0.997511456f, - -0.073564564f, 0.997290457f, - -0.076623861f, 0.997060070f, - -0.079682438f, 0.996820299f, - -0.082740265f, 0.996571146f, - -0.085797312f, 0.996312612f, - -0.088853553f, 0.996044701f, - -0.091908956f, 0.995767414f, - -0.094963495f, 0.995480755f, - -0.098017140f, 0.995184727f, - -0.101069863f, 0.994879331f, - -0.104121634f, 0.994564571f, - -0.107172425f, 0.994240449f, - -0.110222207f, 0.993906970f, - -0.113270952f, 0.993564136f, - -0.116318631f, 0.993211949f, - -0.119365215f, 0.992850414f, - -0.122410675f, 0.992479535f, - -0.125454983f, 0.992099313f, - -0.128498111f, 0.991709754f, - -0.131540029f, 0.991310860f, - -0.134580709f, 0.990902635f, - -0.137620122f, 0.990485084f, - -0.140658239f, 0.990058210f, - -0.143695033f, 0.989622017f, - -0.146730474f, 0.989176510f, - -0.149764535f, 0.988721692f, - -0.152797185f, 0.988257568f, - -0.155828398f, 0.987784142f, - -0.158858143f, 0.987301418f, - -0.161886394f, 0.986809402f, - -0.164913120f, 0.986308097f, - -0.167938295f, 0.985797509f, - -0.170961889f, 0.985277642f, - -0.173983873f, 0.984748502f, - -0.177004220f, 0.984210092f, - -0.180022901f, 0.983662419f, - -0.183039888f, 0.983105487f, - -0.186055152f, 0.982539302f, - -0.189068664f, 0.981963869f, - -0.192080397f, 0.981379193f, - -0.195090322f, 0.980785280f, - -0.198098411f, 0.980182136f, - -0.201104635f, 0.979569766f, - -0.204108966f, 0.978948175f, - -0.207111376f, 0.978317371f, - -0.210111837f, 0.977677358f, - -0.213110320f, 0.977028143f, - -0.216106797f, 0.976369731f, - -0.219101240f, 0.975702130f, - -0.222093621f, 0.975025345f, - -0.225083911f, 0.974339383f, - -0.228072083f, 0.973644250f, - -0.231058108f, 0.972939952f, - -0.234041959f, 0.972226497f, - -0.237023606f, 0.971503891f, - -0.240003022f, 0.970772141f, - -0.242980180f, 0.970031253f, - -0.245955050f, 0.969281235f, - -0.248927606f, 0.968522094f, - -0.251897818f, 0.967753837f, - -0.254865660f, 0.966976471f, - -0.257831102f, 0.966190003f, - -0.260794118f, 0.965394442f, - -0.263754679f, 0.964589793f, - -0.266712757f, 0.963776066f, - -0.269668326f, 0.962953267f, - -0.272621355f, 0.962121404f, - -0.275571819f, 0.961280486f, - -0.278519689f, 0.960430519f, - -0.281464938f, 0.959571513f, - -0.284407537f, 0.958703475f, - -0.287347460f, 0.957826413f, - -0.290284677f, 0.956940336f, - -0.293219163f, 0.956045251f, - -0.296150888f, 0.955141168f, - -0.299079826f, 0.954228095f, - -0.302005949f, 0.953306040f, - -0.304929230f, 0.952375013f, - -0.307849640f, 0.951435021f, - -0.310767153f, 0.950486074f, - -0.313681740f, 0.949528181f, - -0.316593376f, 0.948561350f, - -0.319502031f, 0.947585591f, - -0.322407679f, 0.946600913f, - -0.325310292f, 0.945607325f, - -0.328209844f, 0.944604837f, - -0.331106306f, 0.943593458f, - -0.333999651f, 0.942573198f, - -0.336889853f, 0.941544065f, - -0.339776884f, 0.940506071f, - -0.342660717f, 0.939459224f, - -0.345541325f, 0.938403534f, - -0.348418680f, 0.937339012f, - -0.351292756f, 0.936265667f, - -0.354163525f, 0.935183510f, - -0.357030961f, 0.934092550f, - -0.359895037f, 0.932992799f, - -0.362755724f, 0.931884266f, - -0.365612998f, 0.930766961f, - -0.368466830f, 0.929640896f, - -0.371317194f, 0.928506080f, - -0.374164063f, 0.927362526f, - -0.377007410f, 0.926210242f, - -0.379847209f, 0.925049241f, - -0.382683432f, 0.923879533f, - -0.385516054f, 0.922701128f, - -0.388345047f, 0.921514039f, - -0.391170384f, 0.920318277f, - -0.393992040f, 0.919113852f, - -0.396809987f, 0.917900776f, - -0.399624200f, 0.916679060f, - -0.402434651f, 0.915448716f, - -0.405241314f, 0.914209756f, - -0.408044163f, 0.912962190f, - -0.410843171f, 0.911706032f, - -0.413638312f, 0.910441292f, - -0.416429560f, 0.909167983f, - -0.419216888f, 0.907886116f, - -0.422000271f, 0.906595705f, - -0.424779681f, 0.905296759f, - -0.427555093f, 0.903989293f, - -0.430326481f, 0.902673318f, - -0.433093819f, 0.901348847f, - -0.435857080f, 0.900015892f, - -0.438616239f, 0.898674466f, - -0.441371269f, 0.897324581f, - -0.444122145f, 0.895966250f, - -0.446868840f, 0.894599486f, - -0.449611330f, 0.893224301f, - -0.452349587f, 0.891840709f, - -0.455083587f, 0.890448723f, - -0.457813304f, 0.889048356f, - -0.460538711f, 0.887639620f, - -0.463259784f, 0.886222530f, - -0.465976496f, 0.884797098f, - -0.468688822f, 0.883363339f, - -0.471396737f, 0.881921264f, - -0.474100215f, 0.880470889f, - -0.476799230f, 0.879012226f, - -0.479493758f, 0.877545290f, - -0.482183772f, 0.876070094f, - -0.484869248f, 0.874586652f, - -0.487550160f, 0.873094978f, - -0.490226483f, 0.871595087f, - -0.492898192f, 0.870086991f, - -0.495565262f, 0.868570706f, - -0.498227667f, 0.867046246f, - -0.500885383f, 0.865513624f, - -0.503538384f, 0.863972856f, - -0.506186645f, 0.862423956f, - -0.508830143f, 0.860866939f, - -0.511468850f, 0.859301818f, - -0.514102744f, 0.857728610f, - -0.516731799f, 0.856147328f, - -0.519355990f, 0.854557988f, - -0.521975293f, 0.852960605f, - -0.524589683f, 0.851355193f, - -0.527199135f, 0.849741768f, - -0.529803625f, 0.848120345f, - -0.532403128f, 0.846490939f, - -0.534997620f, 0.844853565f, - -0.537587076f, 0.843208240f, - -0.540171473f, 0.841554977f, - -0.542750785f, 0.839893794f, - -0.545324988f, 0.838224706f, - -0.547894059f, 0.836547727f, - -0.550457973f, 0.834862875f, - -0.553016706f, 0.833170165f, - -0.555570233f, 0.831469612f, - -0.558118531f, 0.829761234f, - -0.560661576f, 0.828045045f, - -0.563199344f, 0.826321063f, - -0.565731811f, 0.824589303f, - -0.568258953f, 0.822849781f, - -0.570780746f, 0.821102515f, - -0.573297167f, 0.819347520f, - -0.575808191f, 0.817584813f, - -0.578313796f, 0.815814411f, - -0.580813958f, 0.814036330f, - -0.583308653f, 0.812250587f, - -0.585797857f, 0.810457198f, - -0.588281548f, 0.808656182f, - -0.590759702f, 0.806847554f, - -0.593232295f, 0.805031331f, - -0.595699304f, 0.803207531f, - -0.598160707f, 0.801376172f, - -0.600616479f, 0.799537269f, - -0.603066599f, 0.797690841f, - -0.605511041f, 0.795836905f, - -0.607949785f, 0.793975478f, - -0.610382806f, 0.792106577f, - -0.612810082f, 0.790230221f, - -0.615231591f, 0.788346428f, - -0.617647308f, 0.786455214f, - -0.620057212f, 0.784556597f, - -0.622461279f, 0.782650596f, - -0.624859488f, 0.780737229f, - -0.627251815f, 0.778816512f, - -0.629638239f, 0.776888466f, - -0.632018736f, 0.774953107f, - -0.634393284f, 0.773010453f, - -0.636761861f, 0.771060524f, - -0.639124445f, 0.769103338f, - -0.641481013f, 0.767138912f, - -0.643831543f, 0.765167266f, - -0.646176013f, 0.763188417f, - -0.648514401f, 0.761202385f, - -0.650846685f, 0.759209189f, - -0.653172843f, 0.757208847f, - -0.655492853f, 0.755201377f, - -0.657806693f, 0.753186799f, - -0.660114342f, 0.751165132f, - -0.662415778f, 0.749136395f, - -0.664710978f, 0.747100606f, - -0.666999922f, 0.745057785f, - -0.669282588f, 0.743007952f, - -0.671558955f, 0.740951125f, - -0.673829000f, 0.738887324f, - -0.676092704f, 0.736816569f, - -0.678350043f, 0.734738878f, - -0.680600998f, 0.732654272f, - -0.682845546f, 0.730562769f, - -0.685083668f, 0.728464390f, - -0.687315341f, 0.726359155f, - -0.689540545f, 0.724247083f, - -0.691759258f, 0.722128194f, - -0.693971461f, 0.720002508f, - -0.696177131f, 0.717870045f, - -0.698376249f, 0.715730825f, - -0.700568794f, 0.713584869f, - -0.702754744f, 0.711432196f, - -0.704934080f, 0.709272826f, - -0.707106781f, 0.707106781f, - -0.709272826f, 0.704934080f, - -0.711432196f, 0.702754744f, - -0.713584869f, 0.700568794f, - -0.715730825f, 0.698376249f, - -0.717870045f, 0.696177131f, - -0.720002508f, 0.693971461f, - -0.722128194f, 0.691759258f, - -0.724247083f, 0.689540545f, - -0.726359155f, 0.687315341f, - -0.728464390f, 0.685083668f, - -0.730562769f, 0.682845546f, - -0.732654272f, 0.680600998f, - -0.734738878f, 0.678350043f, - -0.736816569f, 0.676092704f, - -0.738887324f, 0.673829000f, - -0.740951125f, 0.671558955f, - -0.743007952f, 0.669282588f, - -0.745057785f, 0.666999922f, - -0.747100606f, 0.664710978f, - -0.749136395f, 0.662415778f, - -0.751165132f, 0.660114342f, - -0.753186799f, 0.657806693f, - -0.755201377f, 0.655492853f, - -0.757208847f, 0.653172843f, - -0.759209189f, 0.650846685f, - -0.761202385f, 0.648514401f, - -0.763188417f, 0.646176013f, - -0.765167266f, 0.643831543f, - -0.767138912f, 0.641481013f, - -0.769103338f, 0.639124445f, - -0.771060524f, 0.636761861f, - -0.773010453f, 0.634393284f, - -0.774953107f, 0.632018736f, - -0.776888466f, 0.629638239f, - -0.778816512f, 0.627251815f, - -0.780737229f, 0.624859488f, - -0.782650596f, 0.622461279f, - -0.784556597f, 0.620057212f, - -0.786455214f, 0.617647308f, - -0.788346428f, 0.615231591f, - -0.790230221f, 0.612810082f, - -0.792106577f, 0.610382806f, - -0.793975478f, 0.607949785f, - -0.795836905f, 0.605511041f, - -0.797690841f, 0.603066599f, - -0.799537269f, 0.600616479f, - -0.801376172f, 0.598160707f, - -0.803207531f, 0.595699304f, - -0.805031331f, 0.593232295f, - -0.806847554f, 0.590759702f, - -0.808656182f, 0.588281548f, - -0.810457198f, 0.585797857f, - -0.812250587f, 0.583308653f, - -0.814036330f, 0.580813958f, - -0.815814411f, 0.578313796f, - -0.817584813f, 0.575808191f, - -0.819347520f, 0.573297167f, - -0.821102515f, 0.570780746f, - -0.822849781f, 0.568258953f, - -0.824589303f, 0.565731811f, - -0.826321063f, 0.563199344f, - -0.828045045f, 0.560661576f, - -0.829761234f, 0.558118531f, - -0.831469612f, 0.555570233f, - -0.833170165f, 0.553016706f, - -0.834862875f, 0.550457973f, - -0.836547727f, 0.547894059f, - -0.838224706f, 0.545324988f, - -0.839893794f, 0.542750785f, - -0.841554977f, 0.540171473f, - -0.843208240f, 0.537587076f, - -0.844853565f, 0.534997620f, - -0.846490939f, 0.532403128f, - -0.848120345f, 0.529803625f, - -0.849741768f, 0.527199135f, - -0.851355193f, 0.524589683f, - -0.852960605f, 0.521975293f, - -0.854557988f, 0.519355990f, - -0.856147328f, 0.516731799f, - -0.857728610f, 0.514102744f, - -0.859301818f, 0.511468850f, - -0.860866939f, 0.508830143f, - -0.862423956f, 0.506186645f, - -0.863972856f, 0.503538384f, - -0.865513624f, 0.500885383f, - -0.867046246f, 0.498227667f, - -0.868570706f, 0.495565262f, - -0.870086991f, 0.492898192f, - -0.871595087f, 0.490226483f, - -0.873094978f, 0.487550160f, - -0.874586652f, 0.484869248f, - -0.876070094f, 0.482183772f, - -0.877545290f, 0.479493758f, - -0.879012226f, 0.476799230f, - -0.880470889f, 0.474100215f, - -0.881921264f, 0.471396737f, - -0.883363339f, 0.468688822f, - -0.884797098f, 0.465976496f, - -0.886222530f, 0.463259784f, - -0.887639620f, 0.460538711f, - -0.889048356f, 0.457813304f, - -0.890448723f, 0.455083587f, - -0.891840709f, 0.452349587f, - -0.893224301f, 0.449611330f, - -0.894599486f, 0.446868840f, - -0.895966250f, 0.444122145f, - -0.897324581f, 0.441371269f, - -0.898674466f, 0.438616239f, - -0.900015892f, 0.435857080f, - -0.901348847f, 0.433093819f, - -0.902673318f, 0.430326481f, - -0.903989293f, 0.427555093f, - -0.905296759f, 0.424779681f, - -0.906595705f, 0.422000271f, - -0.907886116f, 0.419216888f, - -0.909167983f, 0.416429560f, - -0.910441292f, 0.413638312f, - -0.911706032f, 0.410843171f, - -0.912962190f, 0.408044163f, - -0.914209756f, 0.405241314f, - -0.915448716f, 0.402434651f, - -0.916679060f, 0.399624200f, - -0.917900776f, 0.396809987f, - -0.919113852f, 0.393992040f, - -0.920318277f, 0.391170384f, - -0.921514039f, 0.388345047f, - -0.922701128f, 0.385516054f, - -0.923879533f, 0.382683432f, - -0.925049241f, 0.379847209f, - -0.926210242f, 0.377007410f, - -0.927362526f, 0.374164063f, - -0.928506080f, 0.371317194f, - -0.929640896f, 0.368466830f, - -0.930766961f, 0.365612998f, - -0.931884266f, 0.362755724f, - -0.932992799f, 0.359895037f, - -0.934092550f, 0.357030961f, - -0.935183510f, 0.354163525f, - -0.936265667f, 0.351292756f, - -0.937339012f, 0.348418680f, - -0.938403534f, 0.345541325f, - -0.939459224f, 0.342660717f, - -0.940506071f, 0.339776884f, - -0.941544065f, 0.336889853f, - -0.942573198f, 0.333999651f, - -0.943593458f, 0.331106306f, - -0.944604837f, 0.328209844f, - -0.945607325f, 0.325310292f, - -0.946600913f, 0.322407679f, - -0.947585591f, 0.319502031f, - -0.948561350f, 0.316593376f, - -0.949528181f, 0.313681740f, - -0.950486074f, 0.310767153f, - -0.951435021f, 0.307849640f, - -0.952375013f, 0.304929230f, - -0.953306040f, 0.302005949f, - -0.954228095f, 0.299079826f, - -0.955141168f, 0.296150888f, - -0.956045251f, 0.293219163f, - -0.956940336f, 0.290284677f, - -0.957826413f, 0.287347460f, - -0.958703475f, 0.284407537f, - -0.959571513f, 0.281464938f, - -0.960430519f, 0.278519689f, - -0.961280486f, 0.275571819f, - -0.962121404f, 0.272621355f, - -0.962953267f, 0.269668326f, - -0.963776066f, 0.266712757f, - -0.964589793f, 0.263754679f, - -0.965394442f, 0.260794118f, - -0.966190003f, 0.257831102f, - -0.966976471f, 0.254865660f, - -0.967753837f, 0.251897818f, - -0.968522094f, 0.248927606f, - -0.969281235f, 0.245955050f, - -0.970031253f, 0.242980180f, - -0.970772141f, 0.240003022f, - -0.971503891f, 0.237023606f, - -0.972226497f, 0.234041959f, - -0.972939952f, 0.231058108f, - -0.973644250f, 0.228072083f, - -0.974339383f, 0.225083911f, - -0.975025345f, 0.222093621f, - -0.975702130f, 0.219101240f, - -0.976369731f, 0.216106797f, - -0.977028143f, 0.213110320f, - -0.977677358f, 0.210111837f, - -0.978317371f, 0.207111376f, - -0.978948175f, 0.204108966f, - -0.979569766f, 0.201104635f, - -0.980182136f, 0.198098411f, - -0.980785280f, 0.195090322f, - -0.981379193f, 0.192080397f, - -0.981963869f, 0.189068664f, - -0.982539302f, 0.186055152f, - -0.983105487f, 0.183039888f, - -0.983662419f, 0.180022901f, - -0.984210092f, 0.177004220f, - -0.984748502f, 0.173983873f, - -0.985277642f, 0.170961889f, - -0.985797509f, 0.167938295f, - -0.986308097f, 0.164913120f, - -0.986809402f, 0.161886394f, - -0.987301418f, 0.158858143f, - -0.987784142f, 0.155828398f, - -0.988257568f, 0.152797185f, - -0.988721692f, 0.149764535f, - -0.989176510f, 0.146730474f, - -0.989622017f, 0.143695033f, - -0.990058210f, 0.140658239f, - -0.990485084f, 0.137620122f, - -0.990902635f, 0.134580709f, - -0.991310860f, 0.131540029f, - -0.991709754f, 0.128498111f, - -0.992099313f, 0.125454983f, - -0.992479535f, 0.122410675f, - -0.992850414f, 0.119365215f, - -0.993211949f, 0.116318631f, - -0.993564136f, 0.113270952f, - -0.993906970f, 0.110222207f, - -0.994240449f, 0.107172425f, - -0.994564571f, 0.104121634f, - -0.994879331f, 0.101069863f, - -0.995184727f, 0.098017140f, - -0.995480755f, 0.094963495f, - -0.995767414f, 0.091908956f, - -0.996044701f, 0.088853553f, - -0.996312612f, 0.085797312f, - -0.996571146f, 0.082740265f, - -0.996820299f, 0.079682438f, - -0.997060070f, 0.076623861f, - -0.997290457f, 0.073564564f, - -0.997511456f, 0.070504573f, - -0.997723067f, 0.067443920f, - -0.997925286f, 0.064382631f, - -0.998118113f, 0.061320736f, - -0.998301545f, 0.058258265f, - -0.998475581f, 0.055195244f, - -0.998640218f, 0.052131705f, - -0.998795456f, 0.049067674f, - -0.998941293f, 0.046003182f, - -0.999077728f, 0.042938257f, - -0.999204759f, 0.039872928f, - -0.999322385f, 0.036807223f, - -0.999430605f, 0.033741172f, - -0.999529418f, 0.030674803f, - -0.999618822f, 0.027608146f, - -0.999698819f, 0.024541229f, - -0.999769405f, 0.021474080f, - -0.999830582f, 0.018406730f, - -0.999882347f, 0.015339206f, - -0.999924702f, 0.012271538f, - -0.999957645f, 0.009203755f, - -0.999981175f, 0.006135885f, - -0.999995294f, 0.003067957f, - -1.000000000f, 0.000000000f, - -0.999995294f, -0.003067957f, - -0.999981175f, -0.006135885f, - -0.999957645f, -0.009203755f, - -0.999924702f, -0.012271538f, - -0.999882347f, -0.015339206f, - -0.999830582f, -0.018406730f, - -0.999769405f, -0.021474080f, - -0.999698819f, -0.024541229f, - -0.999618822f, -0.027608146f, - -0.999529418f, -0.030674803f, - -0.999430605f, -0.033741172f, - -0.999322385f, -0.036807223f, - -0.999204759f, -0.039872928f, - -0.999077728f, -0.042938257f, - -0.998941293f, -0.046003182f, - -0.998795456f, -0.049067674f, - -0.998640218f, -0.052131705f, - -0.998475581f, -0.055195244f, - -0.998301545f, -0.058258265f, - -0.998118113f, -0.061320736f, - -0.997925286f, -0.064382631f, - -0.997723067f, -0.067443920f, - -0.997511456f, -0.070504573f, - -0.997290457f, -0.073564564f, - -0.997060070f, -0.076623861f, - -0.996820299f, -0.079682438f, - -0.996571146f, -0.082740265f, - -0.996312612f, -0.085797312f, - -0.996044701f, -0.088853553f, - -0.995767414f, -0.091908956f, - -0.995480755f, -0.094963495f, - -0.995184727f, -0.098017140f, - -0.994879331f, -0.101069863f, - -0.994564571f, -0.104121634f, - -0.994240449f, -0.107172425f, - -0.993906970f, -0.110222207f, - -0.993564136f, -0.113270952f, - -0.993211949f, -0.116318631f, - -0.992850414f, -0.119365215f, - -0.992479535f, -0.122410675f, - -0.992099313f, -0.125454983f, - -0.991709754f, -0.128498111f, - -0.991310860f, -0.131540029f, - -0.990902635f, -0.134580709f, - -0.990485084f, -0.137620122f, - -0.990058210f, -0.140658239f, - -0.989622017f, -0.143695033f, - -0.989176510f, -0.146730474f, - -0.988721692f, -0.149764535f, - -0.988257568f, -0.152797185f, - -0.987784142f, -0.155828398f, - -0.987301418f, -0.158858143f, - -0.986809402f, -0.161886394f, - -0.986308097f, -0.164913120f, - -0.985797509f, -0.167938295f, - -0.985277642f, -0.170961889f, - -0.984748502f, -0.173983873f, - -0.984210092f, -0.177004220f, - -0.983662419f, -0.180022901f, - -0.983105487f, -0.183039888f, - -0.982539302f, -0.186055152f, - -0.981963869f, -0.189068664f, - -0.981379193f, -0.192080397f, - -0.980785280f, -0.195090322f, - -0.980182136f, -0.198098411f, - -0.979569766f, -0.201104635f, - -0.978948175f, -0.204108966f, - -0.978317371f, -0.207111376f, - -0.977677358f, -0.210111837f, - -0.977028143f, -0.213110320f, - -0.976369731f, -0.216106797f, - -0.975702130f, -0.219101240f, - -0.975025345f, -0.222093621f, - -0.974339383f, -0.225083911f, - -0.973644250f, -0.228072083f, - -0.972939952f, -0.231058108f, - -0.972226497f, -0.234041959f, - -0.971503891f, -0.237023606f, - -0.970772141f, -0.240003022f, - -0.970031253f, -0.242980180f, - -0.969281235f, -0.245955050f, - -0.968522094f, -0.248927606f, - -0.967753837f, -0.251897818f, - -0.966976471f, -0.254865660f, - -0.966190003f, -0.257831102f, - -0.965394442f, -0.260794118f, - -0.964589793f, -0.263754679f, - -0.963776066f, -0.266712757f, - -0.962953267f, -0.269668326f, - -0.962121404f, -0.272621355f, - -0.961280486f, -0.275571819f, - -0.960430519f, -0.278519689f, - -0.959571513f, -0.281464938f, - -0.958703475f, -0.284407537f, - -0.957826413f, -0.287347460f, - -0.956940336f, -0.290284677f, - -0.956045251f, -0.293219163f, - -0.955141168f, -0.296150888f, - -0.954228095f, -0.299079826f, - -0.953306040f, -0.302005949f, - -0.952375013f, -0.304929230f, - -0.951435021f, -0.307849640f, - -0.950486074f, -0.310767153f, - -0.949528181f, -0.313681740f, - -0.948561350f, -0.316593376f, - -0.947585591f, -0.319502031f, - -0.946600913f, -0.322407679f, - -0.945607325f, -0.325310292f, - -0.944604837f, -0.328209844f, - -0.943593458f, -0.331106306f, - -0.942573198f, -0.333999651f, - -0.941544065f, -0.336889853f, - -0.940506071f, -0.339776884f, - -0.939459224f, -0.342660717f, - -0.938403534f, -0.345541325f, - -0.937339012f, -0.348418680f, - -0.936265667f, -0.351292756f, - -0.935183510f, -0.354163525f, - -0.934092550f, -0.357030961f, - -0.932992799f, -0.359895037f, - -0.931884266f, -0.362755724f, - -0.930766961f, -0.365612998f, - -0.929640896f, -0.368466830f, - -0.928506080f, -0.371317194f, - -0.927362526f, -0.374164063f, - -0.926210242f, -0.377007410f, - -0.925049241f, -0.379847209f, - -0.923879533f, -0.382683432f, - -0.922701128f, -0.385516054f, - -0.921514039f, -0.388345047f, - -0.920318277f, -0.391170384f, - -0.919113852f, -0.393992040f, - -0.917900776f, -0.396809987f, - -0.916679060f, -0.399624200f, - -0.915448716f, -0.402434651f, - -0.914209756f, -0.405241314f, - -0.912962190f, -0.408044163f, - -0.911706032f, -0.410843171f, - -0.910441292f, -0.413638312f, - -0.909167983f, -0.416429560f, - -0.907886116f, -0.419216888f, - -0.906595705f, -0.422000271f, - -0.905296759f, -0.424779681f, - -0.903989293f, -0.427555093f, - -0.902673318f, -0.430326481f, - -0.901348847f, -0.433093819f, - -0.900015892f, -0.435857080f, - -0.898674466f, -0.438616239f, - -0.897324581f, -0.441371269f, - -0.895966250f, -0.444122145f, - -0.894599486f, -0.446868840f, - -0.893224301f, -0.449611330f, - -0.891840709f, -0.452349587f, - -0.890448723f, -0.455083587f, - -0.889048356f, -0.457813304f, - -0.887639620f, -0.460538711f, - -0.886222530f, -0.463259784f, - -0.884797098f, -0.465976496f, - -0.883363339f, -0.468688822f, - -0.881921264f, -0.471396737f, - -0.880470889f, -0.474100215f, - -0.879012226f, -0.476799230f, - -0.877545290f, -0.479493758f, - -0.876070094f, -0.482183772f, - -0.874586652f, -0.484869248f, - -0.873094978f, -0.487550160f, - -0.871595087f, -0.490226483f, - -0.870086991f, -0.492898192f, - -0.868570706f, -0.495565262f, - -0.867046246f, -0.498227667f, - -0.865513624f, -0.500885383f, - -0.863972856f, -0.503538384f, - -0.862423956f, -0.506186645f, - -0.860866939f, -0.508830143f, - -0.859301818f, -0.511468850f, - -0.857728610f, -0.514102744f, - -0.856147328f, -0.516731799f, - -0.854557988f, -0.519355990f, - -0.852960605f, -0.521975293f, - -0.851355193f, -0.524589683f, - -0.849741768f, -0.527199135f, - -0.848120345f, -0.529803625f, - -0.846490939f, -0.532403128f, - -0.844853565f, -0.534997620f, - -0.843208240f, -0.537587076f, - -0.841554977f, -0.540171473f, - -0.839893794f, -0.542750785f, - -0.838224706f, -0.545324988f, - -0.836547727f, -0.547894059f, - -0.834862875f, -0.550457973f, - -0.833170165f, -0.553016706f, - -0.831469612f, -0.555570233f, - -0.829761234f, -0.558118531f, - -0.828045045f, -0.560661576f, - -0.826321063f, -0.563199344f, - -0.824589303f, -0.565731811f, - -0.822849781f, -0.568258953f, - -0.821102515f, -0.570780746f, - -0.819347520f, -0.573297167f, - -0.817584813f, -0.575808191f, - -0.815814411f, -0.578313796f, - -0.814036330f, -0.580813958f, - -0.812250587f, -0.583308653f, - -0.810457198f, -0.585797857f, - -0.808656182f, -0.588281548f, - -0.806847554f, -0.590759702f, - -0.805031331f, -0.593232295f, - -0.803207531f, -0.595699304f, - -0.801376172f, -0.598160707f, - -0.799537269f, -0.600616479f, - -0.797690841f, -0.603066599f, - -0.795836905f, -0.605511041f, - -0.793975478f, -0.607949785f, - -0.792106577f, -0.610382806f, - -0.790230221f, -0.612810082f, - -0.788346428f, -0.615231591f, - -0.786455214f, -0.617647308f, - -0.784556597f, -0.620057212f, - -0.782650596f, -0.622461279f, - -0.780737229f, -0.624859488f, - -0.778816512f, -0.627251815f, - -0.776888466f, -0.629638239f, - -0.774953107f, -0.632018736f, - -0.773010453f, -0.634393284f, - -0.771060524f, -0.636761861f, - -0.769103338f, -0.639124445f, - -0.767138912f, -0.641481013f, - -0.765167266f, -0.643831543f, - -0.763188417f, -0.646176013f, - -0.761202385f, -0.648514401f, - -0.759209189f, -0.650846685f, - -0.757208847f, -0.653172843f, - -0.755201377f, -0.655492853f, - -0.753186799f, -0.657806693f, - -0.751165132f, -0.660114342f, - -0.749136395f, -0.662415778f, - -0.747100606f, -0.664710978f, - -0.745057785f, -0.666999922f, - -0.743007952f, -0.669282588f, - -0.740951125f, -0.671558955f, - -0.738887324f, -0.673829000f, - -0.736816569f, -0.676092704f, - -0.734738878f, -0.678350043f, - -0.732654272f, -0.680600998f, - -0.730562769f, -0.682845546f, - -0.728464390f, -0.685083668f, - -0.726359155f, -0.687315341f, - -0.724247083f, -0.689540545f, - -0.722128194f, -0.691759258f, - -0.720002508f, -0.693971461f, - -0.717870045f, -0.696177131f, - -0.715730825f, -0.698376249f, - -0.713584869f, -0.700568794f, - -0.711432196f, -0.702754744f, - -0.709272826f, -0.704934080f, - -0.707106781f, -0.707106781f, - -0.704934080f, -0.709272826f, - -0.702754744f, -0.711432196f, - -0.700568794f, -0.713584869f, - -0.698376249f, -0.715730825f, - -0.696177131f, -0.717870045f, - -0.693971461f, -0.720002508f, - -0.691759258f, -0.722128194f, - -0.689540545f, -0.724247083f, - -0.687315341f, -0.726359155f, - -0.685083668f, -0.728464390f, - -0.682845546f, -0.730562769f, - -0.680600998f, -0.732654272f, - -0.678350043f, -0.734738878f, - -0.676092704f, -0.736816569f, - -0.673829000f, -0.738887324f, - -0.671558955f, -0.740951125f, - -0.669282588f, -0.743007952f, - -0.666999922f, -0.745057785f, - -0.664710978f, -0.747100606f, - -0.662415778f, -0.749136395f, - -0.660114342f, -0.751165132f, - -0.657806693f, -0.753186799f, - -0.655492853f, -0.755201377f, - -0.653172843f, -0.757208847f, - -0.650846685f, -0.759209189f, - -0.648514401f, -0.761202385f, - -0.646176013f, -0.763188417f, - -0.643831543f, -0.765167266f, - -0.641481013f, -0.767138912f, - -0.639124445f, -0.769103338f, - -0.636761861f, -0.771060524f, - -0.634393284f, -0.773010453f, - -0.632018736f, -0.774953107f, - -0.629638239f, -0.776888466f, - -0.627251815f, -0.778816512f, - -0.624859488f, -0.780737229f, - -0.622461279f, -0.782650596f, - -0.620057212f, -0.784556597f, - -0.617647308f, -0.786455214f, - -0.615231591f, -0.788346428f, - -0.612810082f, -0.790230221f, - -0.610382806f, -0.792106577f, - -0.607949785f, -0.793975478f, - -0.605511041f, -0.795836905f, - -0.603066599f, -0.797690841f, - -0.600616479f, -0.799537269f, - -0.598160707f, -0.801376172f, - -0.595699304f, -0.803207531f, - -0.593232295f, -0.805031331f, - -0.590759702f, -0.806847554f, - -0.588281548f, -0.808656182f, - -0.585797857f, -0.810457198f, - -0.583308653f, -0.812250587f, - -0.580813958f, -0.814036330f, - -0.578313796f, -0.815814411f, - -0.575808191f, -0.817584813f, - -0.573297167f, -0.819347520f, - -0.570780746f, -0.821102515f, - -0.568258953f, -0.822849781f, - -0.565731811f, -0.824589303f, - -0.563199344f, -0.826321063f, - -0.560661576f, -0.828045045f, - -0.558118531f, -0.829761234f, - -0.555570233f, -0.831469612f, - -0.553016706f, -0.833170165f, - -0.550457973f, -0.834862875f, - -0.547894059f, -0.836547727f, - -0.545324988f, -0.838224706f, - -0.542750785f, -0.839893794f, - -0.540171473f, -0.841554977f, - -0.537587076f, -0.843208240f, - -0.534997620f, -0.844853565f, - -0.532403128f, -0.846490939f, - -0.529803625f, -0.848120345f, - -0.527199135f, -0.849741768f, - -0.524589683f, -0.851355193f, - -0.521975293f, -0.852960605f, - -0.519355990f, -0.854557988f, - -0.516731799f, -0.856147328f, - -0.514102744f, -0.857728610f, - -0.511468850f, -0.859301818f, - -0.508830143f, -0.860866939f, - -0.506186645f, -0.862423956f, - -0.503538384f, -0.863972856f, - -0.500885383f, -0.865513624f, - -0.498227667f, -0.867046246f, - -0.495565262f, -0.868570706f, - -0.492898192f, -0.870086991f, - -0.490226483f, -0.871595087f, - -0.487550160f, -0.873094978f, - -0.484869248f, -0.874586652f, - -0.482183772f, -0.876070094f, - -0.479493758f, -0.877545290f, - -0.476799230f, -0.879012226f, - -0.474100215f, -0.880470889f, - -0.471396737f, -0.881921264f, - -0.468688822f, -0.883363339f, - -0.465976496f, -0.884797098f, - -0.463259784f, -0.886222530f, - -0.460538711f, -0.887639620f, - -0.457813304f, -0.889048356f, - -0.455083587f, -0.890448723f, - -0.452349587f, -0.891840709f, - -0.449611330f, -0.893224301f, - -0.446868840f, -0.894599486f, - -0.444122145f, -0.895966250f, - -0.441371269f, -0.897324581f, - -0.438616239f, -0.898674466f, - -0.435857080f, -0.900015892f, - -0.433093819f, -0.901348847f, - -0.430326481f, -0.902673318f, - -0.427555093f, -0.903989293f, - -0.424779681f, -0.905296759f, - -0.422000271f, -0.906595705f, - -0.419216888f, -0.907886116f, - -0.416429560f, -0.909167983f, - -0.413638312f, -0.910441292f, - -0.410843171f, -0.911706032f, - -0.408044163f, -0.912962190f, - -0.405241314f, -0.914209756f, - -0.402434651f, -0.915448716f, - -0.399624200f, -0.916679060f, - -0.396809987f, -0.917900776f, - -0.393992040f, -0.919113852f, - -0.391170384f, -0.920318277f, - -0.388345047f, -0.921514039f, - -0.385516054f, -0.922701128f, - -0.382683432f, -0.923879533f, - -0.379847209f, -0.925049241f, - -0.377007410f, -0.926210242f, - -0.374164063f, -0.927362526f, - -0.371317194f, -0.928506080f, - -0.368466830f, -0.929640896f, - -0.365612998f, -0.930766961f, - -0.362755724f, -0.931884266f, - -0.359895037f, -0.932992799f, - -0.357030961f, -0.934092550f, - -0.354163525f, -0.935183510f, - -0.351292756f, -0.936265667f, - -0.348418680f, -0.937339012f, - -0.345541325f, -0.938403534f, - -0.342660717f, -0.939459224f, - -0.339776884f, -0.940506071f, - -0.336889853f, -0.941544065f, - -0.333999651f, -0.942573198f, - -0.331106306f, -0.943593458f, - -0.328209844f, -0.944604837f, - -0.325310292f, -0.945607325f, - -0.322407679f, -0.946600913f, - -0.319502031f, -0.947585591f, - -0.316593376f, -0.948561350f, - -0.313681740f, -0.949528181f, - -0.310767153f, -0.950486074f, - -0.307849640f, -0.951435021f, - -0.304929230f, -0.952375013f, - -0.302005949f, -0.953306040f, - -0.299079826f, -0.954228095f, - -0.296150888f, -0.955141168f, - -0.293219163f, -0.956045251f, - -0.290284677f, -0.956940336f, - -0.287347460f, -0.957826413f, - -0.284407537f, -0.958703475f, - -0.281464938f, -0.959571513f, - -0.278519689f, -0.960430519f, - -0.275571819f, -0.961280486f, - -0.272621355f, -0.962121404f, - -0.269668326f, -0.962953267f, - -0.266712757f, -0.963776066f, - -0.263754679f, -0.964589793f, - -0.260794118f, -0.965394442f, - -0.257831102f, -0.966190003f, - -0.254865660f, -0.966976471f, - -0.251897818f, -0.967753837f, - -0.248927606f, -0.968522094f, - -0.245955050f, -0.969281235f, - -0.242980180f, -0.970031253f, - -0.240003022f, -0.970772141f, - -0.237023606f, -0.971503891f, - -0.234041959f, -0.972226497f, - -0.231058108f, -0.972939952f, - -0.228072083f, -0.973644250f, - -0.225083911f, -0.974339383f, - -0.222093621f, -0.975025345f, - -0.219101240f, -0.975702130f, - -0.216106797f, -0.976369731f, - -0.213110320f, -0.977028143f, - -0.210111837f, -0.977677358f, - -0.207111376f, -0.978317371f, - -0.204108966f, -0.978948175f, - -0.201104635f, -0.979569766f, - -0.198098411f, -0.980182136f, - -0.195090322f, -0.980785280f, - -0.192080397f, -0.981379193f, - -0.189068664f, -0.981963869f, - -0.186055152f, -0.982539302f, - -0.183039888f, -0.983105487f, - -0.180022901f, -0.983662419f, - -0.177004220f, -0.984210092f, - -0.173983873f, -0.984748502f, - -0.170961889f, -0.985277642f, - -0.167938295f, -0.985797509f, - -0.164913120f, -0.986308097f, - -0.161886394f, -0.986809402f, - -0.158858143f, -0.987301418f, - -0.155828398f, -0.987784142f, - -0.152797185f, -0.988257568f, - -0.149764535f, -0.988721692f, - -0.146730474f, -0.989176510f, - -0.143695033f, -0.989622017f, - -0.140658239f, -0.990058210f, - -0.137620122f, -0.990485084f, - -0.134580709f, -0.990902635f, - -0.131540029f, -0.991310860f, - -0.128498111f, -0.991709754f, - -0.125454983f, -0.992099313f, - -0.122410675f, -0.992479535f, - -0.119365215f, -0.992850414f, - -0.116318631f, -0.993211949f, - -0.113270952f, -0.993564136f, - -0.110222207f, -0.993906970f, - -0.107172425f, -0.994240449f, - -0.104121634f, -0.994564571f, - -0.101069863f, -0.994879331f, - -0.098017140f, -0.995184727f, - -0.094963495f, -0.995480755f, - -0.091908956f, -0.995767414f, - -0.088853553f, -0.996044701f, - -0.085797312f, -0.996312612f, - -0.082740265f, -0.996571146f, - -0.079682438f, -0.996820299f, - -0.076623861f, -0.997060070f, - -0.073564564f, -0.997290457f, - -0.070504573f, -0.997511456f, - -0.067443920f, -0.997723067f, - -0.064382631f, -0.997925286f, - -0.061320736f, -0.998118113f, - -0.058258265f, -0.998301545f, - -0.055195244f, -0.998475581f, - -0.052131705f, -0.998640218f, - -0.049067674f, -0.998795456f, - -0.046003182f, -0.998941293f, - -0.042938257f, -0.999077728f, - -0.039872928f, -0.999204759f, - -0.036807223f, -0.999322385f, - -0.033741172f, -0.999430605f, - -0.030674803f, -0.999529418f, - -0.027608146f, -0.999618822f, - -0.024541229f, -0.999698819f, - -0.021474080f, -0.999769405f, - -0.018406730f, -0.999830582f, - -0.015339206f, -0.999882347f, - -0.012271538f, -0.999924702f, - -0.009203755f, -0.999957645f, - -0.006135885f, -0.999981175f, - -0.003067957f, -0.999995294f, - -0.000000000f, -1.000000000f, - 0.003067957f, -0.999995294f, - 0.006135885f, -0.999981175f, - 0.009203755f, -0.999957645f, - 0.012271538f, -0.999924702f, - 0.015339206f, -0.999882347f, - 0.018406730f, -0.999830582f, - 0.021474080f, -0.999769405f, - 0.024541229f, -0.999698819f, - 0.027608146f, -0.999618822f, - 0.030674803f, -0.999529418f, - 0.033741172f, -0.999430605f, - 0.036807223f, -0.999322385f, - 0.039872928f, -0.999204759f, - 0.042938257f, -0.999077728f, - 0.046003182f, -0.998941293f, - 0.049067674f, -0.998795456f, - 0.052131705f, -0.998640218f, - 0.055195244f, -0.998475581f, - 0.058258265f, -0.998301545f, - 0.061320736f, -0.998118113f, - 0.064382631f, -0.997925286f, - 0.067443920f, -0.997723067f, - 0.070504573f, -0.997511456f, - 0.073564564f, -0.997290457f, - 0.076623861f, -0.997060070f, - 0.079682438f, -0.996820299f, - 0.082740265f, -0.996571146f, - 0.085797312f, -0.996312612f, - 0.088853553f, -0.996044701f, - 0.091908956f, -0.995767414f, - 0.094963495f, -0.995480755f, - 0.098017140f, -0.995184727f, - 0.101069863f, -0.994879331f, - 0.104121634f, -0.994564571f, - 0.107172425f, -0.994240449f, - 0.110222207f, -0.993906970f, - 0.113270952f, -0.993564136f, - 0.116318631f, -0.993211949f, - 0.119365215f, -0.992850414f, - 0.122410675f, -0.992479535f, - 0.125454983f, -0.992099313f, - 0.128498111f, -0.991709754f, - 0.131540029f, -0.991310860f, - 0.134580709f, -0.990902635f, - 0.137620122f, -0.990485084f, - 0.140658239f, -0.990058210f, - 0.143695033f, -0.989622017f, - 0.146730474f, -0.989176510f, - 0.149764535f, -0.988721692f, - 0.152797185f, -0.988257568f, - 0.155828398f, -0.987784142f, - 0.158858143f, -0.987301418f, - 0.161886394f, -0.986809402f, - 0.164913120f, -0.986308097f, - 0.167938295f, -0.985797509f, - 0.170961889f, -0.985277642f, - 0.173983873f, -0.984748502f, - 0.177004220f, -0.984210092f, - 0.180022901f, -0.983662419f, - 0.183039888f, -0.983105487f, - 0.186055152f, -0.982539302f, - 0.189068664f, -0.981963869f, - 0.192080397f, -0.981379193f, - 0.195090322f, -0.980785280f, - 0.198098411f, -0.980182136f, - 0.201104635f, -0.979569766f, - 0.204108966f, -0.978948175f, - 0.207111376f, -0.978317371f, - 0.210111837f, -0.977677358f, - 0.213110320f, -0.977028143f, - 0.216106797f, -0.976369731f, - 0.219101240f, -0.975702130f, - 0.222093621f, -0.975025345f, - 0.225083911f, -0.974339383f, - 0.228072083f, -0.973644250f, - 0.231058108f, -0.972939952f, - 0.234041959f, -0.972226497f, - 0.237023606f, -0.971503891f, - 0.240003022f, -0.970772141f, - 0.242980180f, -0.970031253f, - 0.245955050f, -0.969281235f, - 0.248927606f, -0.968522094f, - 0.251897818f, -0.967753837f, - 0.254865660f, -0.966976471f, - 0.257831102f, -0.966190003f, - 0.260794118f, -0.965394442f, - 0.263754679f, -0.964589793f, - 0.266712757f, -0.963776066f, - 0.269668326f, -0.962953267f, - 0.272621355f, -0.962121404f, - 0.275571819f, -0.961280486f, - 0.278519689f, -0.960430519f, - 0.281464938f, -0.959571513f, - 0.284407537f, -0.958703475f, - 0.287347460f, -0.957826413f, - 0.290284677f, -0.956940336f, - 0.293219163f, -0.956045251f, - 0.296150888f, -0.955141168f, - 0.299079826f, -0.954228095f, - 0.302005949f, -0.953306040f, - 0.304929230f, -0.952375013f, - 0.307849640f, -0.951435021f, - 0.310767153f, -0.950486074f, - 0.313681740f, -0.949528181f, - 0.316593376f, -0.948561350f, - 0.319502031f, -0.947585591f, - 0.322407679f, -0.946600913f, - 0.325310292f, -0.945607325f, - 0.328209844f, -0.944604837f, - 0.331106306f, -0.943593458f, - 0.333999651f, -0.942573198f, - 0.336889853f, -0.941544065f, - 0.339776884f, -0.940506071f, - 0.342660717f, -0.939459224f, - 0.345541325f, -0.938403534f, - 0.348418680f, -0.937339012f, - 0.351292756f, -0.936265667f, - 0.354163525f, -0.935183510f, - 0.357030961f, -0.934092550f, - 0.359895037f, -0.932992799f, - 0.362755724f, -0.931884266f, - 0.365612998f, -0.930766961f, - 0.368466830f, -0.929640896f, - 0.371317194f, -0.928506080f, - 0.374164063f, -0.927362526f, - 0.377007410f, -0.926210242f, - 0.379847209f, -0.925049241f, - 0.382683432f, -0.923879533f, - 0.385516054f, -0.922701128f, - 0.388345047f, -0.921514039f, - 0.391170384f, -0.920318277f, - 0.393992040f, -0.919113852f, - 0.396809987f, -0.917900776f, - 0.399624200f, -0.916679060f, - 0.402434651f, -0.915448716f, - 0.405241314f, -0.914209756f, - 0.408044163f, -0.912962190f, - 0.410843171f, -0.911706032f, - 0.413638312f, -0.910441292f, - 0.416429560f, -0.909167983f, - 0.419216888f, -0.907886116f, - 0.422000271f, -0.906595705f, - 0.424779681f, -0.905296759f, - 0.427555093f, -0.903989293f, - 0.430326481f, -0.902673318f, - 0.433093819f, -0.901348847f, - 0.435857080f, -0.900015892f, - 0.438616239f, -0.898674466f, - 0.441371269f, -0.897324581f, - 0.444122145f, -0.895966250f, - 0.446868840f, -0.894599486f, - 0.449611330f, -0.893224301f, - 0.452349587f, -0.891840709f, - 0.455083587f, -0.890448723f, - 0.457813304f, -0.889048356f, - 0.460538711f, -0.887639620f, - 0.463259784f, -0.886222530f, - 0.465976496f, -0.884797098f, - 0.468688822f, -0.883363339f, - 0.471396737f, -0.881921264f, - 0.474100215f, -0.880470889f, - 0.476799230f, -0.879012226f, - 0.479493758f, -0.877545290f, - 0.482183772f, -0.876070094f, - 0.484869248f, -0.874586652f, - 0.487550160f, -0.873094978f, - 0.490226483f, -0.871595087f, - 0.492898192f, -0.870086991f, - 0.495565262f, -0.868570706f, - 0.498227667f, -0.867046246f, - 0.500885383f, -0.865513624f, - 0.503538384f, -0.863972856f, - 0.506186645f, -0.862423956f, - 0.508830143f, -0.860866939f, - 0.511468850f, -0.859301818f, - 0.514102744f, -0.857728610f, - 0.516731799f, -0.856147328f, - 0.519355990f, -0.854557988f, - 0.521975293f, -0.852960605f, - 0.524589683f, -0.851355193f, - 0.527199135f, -0.849741768f, - 0.529803625f, -0.848120345f, - 0.532403128f, -0.846490939f, - 0.534997620f, -0.844853565f, - 0.537587076f, -0.843208240f, - 0.540171473f, -0.841554977f, - 0.542750785f, -0.839893794f, - 0.545324988f, -0.838224706f, - 0.547894059f, -0.836547727f, - 0.550457973f, -0.834862875f, - 0.553016706f, -0.833170165f, - 0.555570233f, -0.831469612f, - 0.558118531f, -0.829761234f, - 0.560661576f, -0.828045045f, - 0.563199344f, -0.826321063f, - 0.565731811f, -0.824589303f, - 0.568258953f, -0.822849781f, - 0.570780746f, -0.821102515f, - 0.573297167f, -0.819347520f, - 0.575808191f, -0.817584813f, - 0.578313796f, -0.815814411f, - 0.580813958f, -0.814036330f, - 0.583308653f, -0.812250587f, - 0.585797857f, -0.810457198f, - 0.588281548f, -0.808656182f, - 0.590759702f, -0.806847554f, - 0.593232295f, -0.805031331f, - 0.595699304f, -0.803207531f, - 0.598160707f, -0.801376172f, - 0.600616479f, -0.799537269f, - 0.603066599f, -0.797690841f, - 0.605511041f, -0.795836905f, - 0.607949785f, -0.793975478f, - 0.610382806f, -0.792106577f, - 0.612810082f, -0.790230221f, - 0.615231591f, -0.788346428f, - 0.617647308f, -0.786455214f, - 0.620057212f, -0.784556597f, - 0.622461279f, -0.782650596f, - 0.624859488f, -0.780737229f, - 0.627251815f, -0.778816512f, - 0.629638239f, -0.776888466f, - 0.632018736f, -0.774953107f, - 0.634393284f, -0.773010453f, - 0.636761861f, -0.771060524f, - 0.639124445f, -0.769103338f, - 0.641481013f, -0.767138912f, - 0.643831543f, -0.765167266f, - 0.646176013f, -0.763188417f, - 0.648514401f, -0.761202385f, - 0.650846685f, -0.759209189f, - 0.653172843f, -0.757208847f, - 0.655492853f, -0.755201377f, - 0.657806693f, -0.753186799f, - 0.660114342f, -0.751165132f, - 0.662415778f, -0.749136395f, - 0.664710978f, -0.747100606f, - 0.666999922f, -0.745057785f, - 0.669282588f, -0.743007952f, - 0.671558955f, -0.740951125f, - 0.673829000f, -0.738887324f, - 0.676092704f, -0.736816569f, - 0.678350043f, -0.734738878f, - 0.680600998f, -0.732654272f, - 0.682845546f, -0.730562769f, - 0.685083668f, -0.728464390f, - 0.687315341f, -0.726359155f, - 0.689540545f, -0.724247083f, - 0.691759258f, -0.722128194f, - 0.693971461f, -0.720002508f, - 0.696177131f, -0.717870045f, - 0.698376249f, -0.715730825f, - 0.700568794f, -0.713584869f, - 0.702754744f, -0.711432196f, - 0.704934080f, -0.709272826f, - 0.707106781f, -0.707106781f, - 0.709272826f, -0.704934080f, - 0.711432196f, -0.702754744f, - 0.713584869f, -0.700568794f, - 0.715730825f, -0.698376249f, - 0.717870045f, -0.696177131f, - 0.720002508f, -0.693971461f, - 0.722128194f, -0.691759258f, - 0.724247083f, -0.689540545f, - 0.726359155f, -0.687315341f, - 0.728464390f, -0.685083668f, - 0.730562769f, -0.682845546f, - 0.732654272f, -0.680600998f, - 0.734738878f, -0.678350043f, - 0.736816569f, -0.676092704f, - 0.738887324f, -0.673829000f, - 0.740951125f, -0.671558955f, - 0.743007952f, -0.669282588f, - 0.745057785f, -0.666999922f, - 0.747100606f, -0.664710978f, - 0.749136395f, -0.662415778f, - 0.751165132f, -0.660114342f, - 0.753186799f, -0.657806693f, - 0.755201377f, -0.655492853f, - 0.757208847f, -0.653172843f, - 0.759209189f, -0.650846685f, - 0.761202385f, -0.648514401f, - 0.763188417f, -0.646176013f, - 0.765167266f, -0.643831543f, - 0.767138912f, -0.641481013f, - 0.769103338f, -0.639124445f, - 0.771060524f, -0.636761861f, - 0.773010453f, -0.634393284f, - 0.774953107f, -0.632018736f, - 0.776888466f, -0.629638239f, - 0.778816512f, -0.627251815f, - 0.780737229f, -0.624859488f, - 0.782650596f, -0.622461279f, - 0.784556597f, -0.620057212f, - 0.786455214f, -0.617647308f, - 0.788346428f, -0.615231591f, - 0.790230221f, -0.612810082f, - 0.792106577f, -0.610382806f, - 0.793975478f, -0.607949785f, - 0.795836905f, -0.605511041f, - 0.797690841f, -0.603066599f, - 0.799537269f, -0.600616479f, - 0.801376172f, -0.598160707f, - 0.803207531f, -0.595699304f, - 0.805031331f, -0.593232295f, - 0.806847554f, -0.590759702f, - 0.808656182f, -0.588281548f, - 0.810457198f, -0.585797857f, - 0.812250587f, -0.583308653f, - 0.814036330f, -0.580813958f, - 0.815814411f, -0.578313796f, - 0.817584813f, -0.575808191f, - 0.819347520f, -0.573297167f, - 0.821102515f, -0.570780746f, - 0.822849781f, -0.568258953f, - 0.824589303f, -0.565731811f, - 0.826321063f, -0.563199344f, - 0.828045045f, -0.560661576f, - 0.829761234f, -0.558118531f, - 0.831469612f, -0.555570233f, - 0.833170165f, -0.553016706f, - 0.834862875f, -0.550457973f, - 0.836547727f, -0.547894059f, - 0.838224706f, -0.545324988f, - 0.839893794f, -0.542750785f, - 0.841554977f, -0.540171473f, - 0.843208240f, -0.537587076f, - 0.844853565f, -0.534997620f, - 0.846490939f, -0.532403128f, - 0.848120345f, -0.529803625f, - 0.849741768f, -0.527199135f, - 0.851355193f, -0.524589683f, - 0.852960605f, -0.521975293f, - 0.854557988f, -0.519355990f, - 0.856147328f, -0.516731799f, - 0.857728610f, -0.514102744f, - 0.859301818f, -0.511468850f, - 0.860866939f, -0.508830143f, - 0.862423956f, -0.506186645f, - 0.863972856f, -0.503538384f, - 0.865513624f, -0.500885383f, - 0.867046246f, -0.498227667f, - 0.868570706f, -0.495565262f, - 0.870086991f, -0.492898192f, - 0.871595087f, -0.490226483f, - 0.873094978f, -0.487550160f, - 0.874586652f, -0.484869248f, - 0.876070094f, -0.482183772f, - 0.877545290f, -0.479493758f, - 0.879012226f, -0.476799230f, - 0.880470889f, -0.474100215f, - 0.881921264f, -0.471396737f, - 0.883363339f, -0.468688822f, - 0.884797098f, -0.465976496f, - 0.886222530f, -0.463259784f, - 0.887639620f, -0.460538711f, - 0.889048356f, -0.457813304f, - 0.890448723f, -0.455083587f, - 0.891840709f, -0.452349587f, - 0.893224301f, -0.449611330f, - 0.894599486f, -0.446868840f, - 0.895966250f, -0.444122145f, - 0.897324581f, -0.441371269f, - 0.898674466f, -0.438616239f, - 0.900015892f, -0.435857080f, - 0.901348847f, -0.433093819f, - 0.902673318f, -0.430326481f, - 0.903989293f, -0.427555093f, - 0.905296759f, -0.424779681f, - 0.906595705f, -0.422000271f, - 0.907886116f, -0.419216888f, - 0.909167983f, -0.416429560f, - 0.910441292f, -0.413638312f, - 0.911706032f, -0.410843171f, - 0.912962190f, -0.408044163f, - 0.914209756f, -0.405241314f, - 0.915448716f, -0.402434651f, - 0.916679060f, -0.399624200f, - 0.917900776f, -0.396809987f, - 0.919113852f, -0.393992040f, - 0.920318277f, -0.391170384f, - 0.921514039f, -0.388345047f, - 0.922701128f, -0.385516054f, - 0.923879533f, -0.382683432f, - 0.925049241f, -0.379847209f, - 0.926210242f, -0.377007410f, - 0.927362526f, -0.374164063f, - 0.928506080f, -0.371317194f, - 0.929640896f, -0.368466830f, - 0.930766961f, -0.365612998f, - 0.931884266f, -0.362755724f, - 0.932992799f, -0.359895037f, - 0.934092550f, -0.357030961f, - 0.935183510f, -0.354163525f, - 0.936265667f, -0.351292756f, - 0.937339012f, -0.348418680f, - 0.938403534f, -0.345541325f, - 0.939459224f, -0.342660717f, - 0.940506071f, -0.339776884f, - 0.941544065f, -0.336889853f, - 0.942573198f, -0.333999651f, - 0.943593458f, -0.331106306f, - 0.944604837f, -0.328209844f, - 0.945607325f, -0.325310292f, - 0.946600913f, -0.322407679f, - 0.947585591f, -0.319502031f, - 0.948561350f, -0.316593376f, - 0.949528181f, -0.313681740f, - 0.950486074f, -0.310767153f, - 0.951435021f, -0.307849640f, - 0.952375013f, -0.304929230f, - 0.953306040f, -0.302005949f, - 0.954228095f, -0.299079826f, - 0.955141168f, -0.296150888f, - 0.956045251f, -0.293219163f, - 0.956940336f, -0.290284677f, - 0.957826413f, -0.287347460f, - 0.958703475f, -0.284407537f, - 0.959571513f, -0.281464938f, - 0.960430519f, -0.278519689f, - 0.961280486f, -0.275571819f, - 0.962121404f, -0.272621355f, - 0.962953267f, -0.269668326f, - 0.963776066f, -0.266712757f, - 0.964589793f, -0.263754679f, - 0.965394442f, -0.260794118f, - 0.966190003f, -0.257831102f, - 0.966976471f, -0.254865660f, - 0.967753837f, -0.251897818f, - 0.968522094f, -0.248927606f, - 0.969281235f, -0.245955050f, - 0.970031253f, -0.242980180f, - 0.970772141f, -0.240003022f, - 0.971503891f, -0.237023606f, - 0.972226497f, -0.234041959f, - 0.972939952f, -0.231058108f, - 0.973644250f, -0.228072083f, - 0.974339383f, -0.225083911f, - 0.975025345f, -0.222093621f, - 0.975702130f, -0.219101240f, - 0.976369731f, -0.216106797f, - 0.977028143f, -0.213110320f, - 0.977677358f, -0.210111837f, - 0.978317371f, -0.207111376f, - 0.978948175f, -0.204108966f, - 0.979569766f, -0.201104635f, - 0.980182136f, -0.198098411f, - 0.980785280f, -0.195090322f, - 0.981379193f, -0.192080397f, - 0.981963869f, -0.189068664f, - 0.982539302f, -0.186055152f, - 0.983105487f, -0.183039888f, - 0.983662419f, -0.180022901f, - 0.984210092f, -0.177004220f, - 0.984748502f, -0.173983873f, - 0.985277642f, -0.170961889f, - 0.985797509f, -0.167938295f, - 0.986308097f, -0.164913120f, - 0.986809402f, -0.161886394f, - 0.987301418f, -0.158858143f, - 0.987784142f, -0.155828398f, - 0.988257568f, -0.152797185f, - 0.988721692f, -0.149764535f, - 0.989176510f, -0.146730474f, - 0.989622017f, -0.143695033f, - 0.990058210f, -0.140658239f, - 0.990485084f, -0.137620122f, - 0.990902635f, -0.134580709f, - 0.991310860f, -0.131540029f, - 0.991709754f, -0.128498111f, - 0.992099313f, -0.125454983f, - 0.992479535f, -0.122410675f, - 0.992850414f, -0.119365215f, - 0.993211949f, -0.116318631f, - 0.993564136f, -0.113270952f, - 0.993906970f, -0.110222207f, - 0.994240449f, -0.107172425f, - 0.994564571f, -0.104121634f, - 0.994879331f, -0.101069863f, - 0.995184727f, -0.098017140f, - 0.995480755f, -0.094963495f, - 0.995767414f, -0.091908956f, - 0.996044701f, -0.088853553f, - 0.996312612f, -0.085797312f, - 0.996571146f, -0.082740265f, - 0.996820299f, -0.079682438f, - 0.997060070f, -0.076623861f, - 0.997290457f, -0.073564564f, - 0.997511456f, -0.070504573f, - 0.997723067f, -0.067443920f, - 0.997925286f, -0.064382631f, - 0.998118113f, -0.061320736f, - 0.998301545f, -0.058258265f, - 0.998475581f, -0.055195244f, - 0.998640218f, -0.052131705f, - 0.998795456f, -0.049067674f, - 0.998941293f, -0.046003182f, - 0.999077728f, -0.042938257f, - 0.999204759f, -0.039872928f, - 0.999322385f, -0.036807223f, - 0.999430605f, -0.033741172f, - 0.999529418f, -0.030674803f, - 0.999618822f, -0.027608146f, - 0.999698819f, -0.024541229f, - 0.999769405f, -0.021474080f, - 0.999830582f, -0.018406730f, - 0.999882347f, -0.015339206f, - 0.999924702f, -0.012271538f, - 0.999957645f, -0.009203755f, - 0.999981175f, -0.006135885f, - 0.999995294f, -0.003067957f -}; - -/** -* \par -* Example code for Floating-point Twiddle factors Generation: -* \par -*
for(i = 0; i< N/; i++)    
-* {    
-*	twiddleCoef[2*i]= cos(i * 2*PI/(float)N);    
-*	twiddleCoef[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 4096 and PI = 3.14159265358979 -* \par -* Cos and Sin values are in interleaved fashion -* -*/ -const float32_t twiddleCoef_4096[8192] = { - 1.000000000f, 0.000000000f, - 0.999998823f, 0.001533980f, - 0.999995294f, 0.003067957f, - 0.999989411f, 0.004601926f, - 0.999981175f, 0.006135885f, - 0.999970586f, 0.007669829f, - 0.999957645f, 0.009203755f, - 0.999942350f, 0.010737659f, - 0.999924702f, 0.012271538f, - 0.999904701f, 0.013805389f, - 0.999882347f, 0.015339206f, - 0.999857641f, 0.016872988f, - 0.999830582f, 0.018406730f, - 0.999801170f, 0.019940429f, - 0.999769405f, 0.021474080f, - 0.999735288f, 0.023007681f, - 0.999698819f, 0.024541229f, - 0.999659997f, 0.026074718f, - 0.999618822f, 0.027608146f, - 0.999575296f, 0.029141509f, - 0.999529418f, 0.030674803f, - 0.999481187f, 0.032208025f, - 0.999430605f, 0.033741172f, - 0.999377670f, 0.035274239f, - 0.999322385f, 0.036807223f, - 0.999264747f, 0.038340120f, - 0.999204759f, 0.039872928f, - 0.999142419f, 0.041405641f, - 0.999077728f, 0.042938257f, - 0.999010686f, 0.044470772f, - 0.998941293f, 0.046003182f, - 0.998869550f, 0.047535484f, - 0.998795456f, 0.049067674f, - 0.998719012f, 0.050599749f, - 0.998640218f, 0.052131705f, - 0.998559074f, 0.053663538f, - 0.998475581f, 0.055195244f, - 0.998389737f, 0.056726821f, - 0.998301545f, 0.058258265f, - 0.998211003f, 0.059789571f, - 0.998118113f, 0.061320736f, - 0.998022874f, 0.062851758f, - 0.997925286f, 0.064382631f, - 0.997825350f, 0.065913353f, - 0.997723067f, 0.067443920f, - 0.997618435f, 0.068974328f, - 0.997511456f, 0.070504573f, - 0.997402130f, 0.072034653f, - 0.997290457f, 0.073564564f, - 0.997176437f, 0.075094301f, - 0.997060070f, 0.076623861f, - 0.996941358f, 0.078153242f, - 0.996820299f, 0.079682438f, - 0.996696895f, 0.081211447f, - 0.996571146f, 0.082740265f, - 0.996443051f, 0.084268888f, - 0.996312612f, 0.085797312f, - 0.996179829f, 0.087325535f, - 0.996044701f, 0.088853553f, - 0.995907229f, 0.090381361f, - 0.995767414f, 0.091908956f, - 0.995625256f, 0.093436336f, - 0.995480755f, 0.094963495f, - 0.995333912f, 0.096490431f, - 0.995184727f, 0.098017140f, - 0.995033199f, 0.099543619f, - 0.994879331f, 0.101069863f, - 0.994723121f, 0.102595869f, - 0.994564571f, 0.104121634f, - 0.994403680f, 0.105647154f, - 0.994240449f, 0.107172425f, - 0.994074879f, 0.108697444f, - 0.993906970f, 0.110222207f, - 0.993736722f, 0.111746711f, - 0.993564136f, 0.113270952f, - 0.993389211f, 0.114794927f, - 0.993211949f, 0.116318631f, - 0.993032350f, 0.117842062f, - 0.992850414f, 0.119365215f, - 0.992666142f, 0.120888087f, - 0.992479535f, 0.122410675f, - 0.992290591f, 0.123932975f, - 0.992099313f, 0.125454983f, - 0.991905700f, 0.126976696f, - 0.991709754f, 0.128498111f, - 0.991511473f, 0.130019223f, - 0.991310860f, 0.131540029f, - 0.991107914f, 0.133060525f, - 0.990902635f, 0.134580709f, - 0.990695025f, 0.136100575f, - 0.990485084f, 0.137620122f, - 0.990272812f, 0.139139344f, - 0.990058210f, 0.140658239f, - 0.989841278f, 0.142176804f, - 0.989622017f, 0.143695033f, - 0.989400428f, 0.145212925f, - 0.989176510f, 0.146730474f, - 0.988950265f, 0.148247679f, - 0.988721692f, 0.149764535f, - 0.988490793f, 0.151281038f, - 0.988257568f, 0.152797185f, - 0.988022017f, 0.154312973f, - 0.987784142f, 0.155828398f, - 0.987543942f, 0.157343456f, - 0.987301418f, 0.158858143f, - 0.987056571f, 0.160372457f, - 0.986809402f, 0.161886394f, - 0.986559910f, 0.163399949f, - 0.986308097f, 0.164913120f, - 0.986053963f, 0.166425904f, - 0.985797509f, 0.167938295f, - 0.985538735f, 0.169450291f, - 0.985277642f, 0.170961889f, - 0.985014231f, 0.172473084f, - 0.984748502f, 0.173983873f, - 0.984480455f, 0.175494253f, - 0.984210092f, 0.177004220f, - 0.983937413f, 0.178513771f, - 0.983662419f, 0.180022901f, - 0.983385110f, 0.181531608f, - 0.983105487f, 0.183039888f, - 0.982823551f, 0.184547737f, - 0.982539302f, 0.186055152f, - 0.982252741f, 0.187562129f, - 0.981963869f, 0.189068664f, - 0.981672686f, 0.190574755f, - 0.981379193f, 0.192080397f, - 0.981083391f, 0.193585587f, - 0.980785280f, 0.195090322f, - 0.980484862f, 0.196594598f, - 0.980182136f, 0.198098411f, - 0.979877104f, 0.199601758f, - 0.979569766f, 0.201104635f, - 0.979260123f, 0.202607039f, - 0.978948175f, 0.204108966f, - 0.978633924f, 0.205610413f, - 0.978317371f, 0.207111376f, - 0.977998515f, 0.208611852f, - 0.977677358f, 0.210111837f, - 0.977353900f, 0.211611327f, - 0.977028143f, 0.213110320f, - 0.976700086f, 0.214608811f, - 0.976369731f, 0.216106797f, - 0.976037079f, 0.217604275f, - 0.975702130f, 0.219101240f, - 0.975364885f, 0.220597690f, - 0.975025345f, 0.222093621f, - 0.974683511f, 0.223589029f, - 0.974339383f, 0.225083911f, - 0.973992962f, 0.226578264f, - 0.973644250f, 0.228072083f, - 0.973293246f, 0.229565366f, - 0.972939952f, 0.231058108f, - 0.972584369f, 0.232550307f, - 0.972226497f, 0.234041959f, - 0.971866337f, 0.235533059f, - 0.971503891f, 0.237023606f, - 0.971139158f, 0.238513595f, - 0.970772141f, 0.240003022f, - 0.970402839f, 0.241491885f, - 0.970031253f, 0.242980180f, - 0.969657385f, 0.244467903f, - 0.969281235f, 0.245955050f, - 0.968902805f, 0.247441619f, - 0.968522094f, 0.248927606f, - 0.968139105f, 0.250413007f, - 0.967753837f, 0.251897818f, - 0.967366292f, 0.253382037f, - 0.966976471f, 0.254865660f, - 0.966584374f, 0.256348682f, - 0.966190003f, 0.257831102f, - 0.965793359f, 0.259312915f, - 0.965394442f, 0.260794118f, - 0.964993253f, 0.262274707f, - 0.964589793f, 0.263754679f, - 0.964184064f, 0.265234030f, - 0.963776066f, 0.266712757f, - 0.963365800f, 0.268190857f, - 0.962953267f, 0.269668326f, - 0.962538468f, 0.271145160f, - 0.962121404f, 0.272621355f, - 0.961702077f, 0.274096910f, - 0.961280486f, 0.275571819f, - 0.960856633f, 0.277046080f, - 0.960430519f, 0.278519689f, - 0.960002146f, 0.279992643f, - 0.959571513f, 0.281464938f, - 0.959138622f, 0.282936570f, - 0.958703475f, 0.284407537f, - 0.958266071f, 0.285877835f, - 0.957826413f, 0.287347460f, - 0.957384501f, 0.288816408f, - 0.956940336f, 0.290284677f, - 0.956493919f, 0.291752263f, - 0.956045251f, 0.293219163f, - 0.955594334f, 0.294685372f, - 0.955141168f, 0.296150888f, - 0.954685755f, 0.297615707f, - 0.954228095f, 0.299079826f, - 0.953768190f, 0.300543241f, - 0.953306040f, 0.302005949f, - 0.952841648f, 0.303467947f, - 0.952375013f, 0.304929230f, - 0.951906137f, 0.306389795f, - 0.951435021f, 0.307849640f, - 0.950961666f, 0.309308760f, - 0.950486074f, 0.310767153f, - 0.950008245f, 0.312224814f, - 0.949528181f, 0.313681740f, - 0.949045882f, 0.315137929f, - 0.948561350f, 0.316593376f, - 0.948074586f, 0.318048077f, - 0.947585591f, 0.319502031f, - 0.947094366f, 0.320955232f, - 0.946600913f, 0.322407679f, - 0.946105232f, 0.323859367f, - 0.945607325f, 0.325310292f, - 0.945107193f, 0.326760452f, - 0.944604837f, 0.328209844f, - 0.944100258f, 0.329658463f, - 0.943593458f, 0.331106306f, - 0.943084437f, 0.332553370f, - 0.942573198f, 0.333999651f, - 0.942059740f, 0.335445147f, - 0.941544065f, 0.336889853f, - 0.941026175f, 0.338333767f, - 0.940506071f, 0.339776884f, - 0.939983753f, 0.341219202f, - 0.939459224f, 0.342660717f, - 0.938932484f, 0.344101426f, - 0.938403534f, 0.345541325f, - 0.937872376f, 0.346980411f, - 0.937339012f, 0.348418680f, - 0.936803442f, 0.349856130f, - 0.936265667f, 0.351292756f, - 0.935725689f, 0.352728556f, - 0.935183510f, 0.354163525f, - 0.934639130f, 0.355597662f, - 0.934092550f, 0.357030961f, - 0.933543773f, 0.358463421f, - 0.932992799f, 0.359895037f, - 0.932439629f, 0.361325806f, - 0.931884266f, 0.362755724f, - 0.931326709f, 0.364184790f, - 0.930766961f, 0.365612998f, - 0.930205023f, 0.367040346f, - 0.929640896f, 0.368466830f, - 0.929074581f, 0.369892447f, - 0.928506080f, 0.371317194f, - 0.927935395f, 0.372741067f, - 0.927362526f, 0.374164063f, - 0.926787474f, 0.375586178f, - 0.926210242f, 0.377007410f, - 0.925630831f, 0.378427755f, - 0.925049241f, 0.379847209f, - 0.924465474f, 0.381265769f, - 0.923879533f, 0.382683432f, - 0.923291417f, 0.384100195f, - 0.922701128f, 0.385516054f, - 0.922108669f, 0.386931006f, - 0.921514039f, 0.388345047f, - 0.920917242f, 0.389758174f, - 0.920318277f, 0.391170384f, - 0.919717146f, 0.392581674f, - 0.919113852f, 0.393992040f, - 0.918508394f, 0.395401479f, - 0.917900776f, 0.396809987f, - 0.917290997f, 0.398217562f, - 0.916679060f, 0.399624200f, - 0.916064966f, 0.401029897f, - 0.915448716f, 0.402434651f, - 0.914830312f, 0.403838458f, - 0.914209756f, 0.405241314f, - 0.913587048f, 0.406643217f, - 0.912962190f, 0.408044163f, - 0.912335185f, 0.409444149f, - 0.911706032f, 0.410843171f, - 0.911074734f, 0.412241227f, - 0.910441292f, 0.413638312f, - 0.909805708f, 0.415034424f, - 0.909167983f, 0.416429560f, - 0.908528119f, 0.417823716f, - 0.907886116f, 0.419216888f, - 0.907241978f, 0.420609074f, - 0.906595705f, 0.422000271f, - 0.905947298f, 0.423390474f, - 0.905296759f, 0.424779681f, - 0.904644091f, 0.426167889f, - 0.903989293f, 0.427555093f, - 0.903332368f, 0.428941292f, - 0.902673318f, 0.430326481f, - 0.902012144f, 0.431710658f, - 0.901348847f, 0.433093819f, - 0.900683429f, 0.434475961f, - 0.900015892f, 0.435857080f, - 0.899346237f, 0.437237174f, - 0.898674466f, 0.438616239f, - 0.898000580f, 0.439994271f, - 0.897324581f, 0.441371269f, - 0.896646470f, 0.442747228f, - 0.895966250f, 0.444122145f, - 0.895283921f, 0.445496017f, - 0.894599486f, 0.446868840f, - 0.893912945f, 0.448240612f, - 0.893224301f, 0.449611330f, - 0.892533555f, 0.450980989f, - 0.891840709f, 0.452349587f, - 0.891145765f, 0.453717121f, - 0.890448723f, 0.455083587f, - 0.889749586f, 0.456448982f, - 0.889048356f, 0.457813304f, - 0.888345033f, 0.459176548f, - 0.887639620f, 0.460538711f, - 0.886932119f, 0.461899791f, - 0.886222530f, 0.463259784f, - 0.885510856f, 0.464618686f, - 0.884797098f, 0.465976496f, - 0.884081259f, 0.467333209f, - 0.883363339f, 0.468688822f, - 0.882643340f, 0.470043332f, - 0.881921264f, 0.471396737f, - 0.881197113f, 0.472749032f, - 0.880470889f, 0.474100215f, - 0.879742593f, 0.475450282f, - 0.879012226f, 0.476799230f, - 0.878279792f, 0.478147056f, - 0.877545290f, 0.479493758f, - 0.876808724f, 0.480839331f, - 0.876070094f, 0.482183772f, - 0.875329403f, 0.483527079f, - 0.874586652f, 0.484869248f, - 0.873841843f, 0.486210276f, - 0.873094978f, 0.487550160f, - 0.872346059f, 0.488888897f, - 0.871595087f, 0.490226483f, - 0.870842063f, 0.491562916f, - 0.870086991f, 0.492898192f, - 0.869329871f, 0.494232309f, - 0.868570706f, 0.495565262f, - 0.867809497f, 0.496897049f, - 0.867046246f, 0.498227667f, - 0.866280954f, 0.499557113f, - 0.865513624f, 0.500885383f, - 0.864744258f, 0.502212474f, - 0.863972856f, 0.503538384f, - 0.863199422f, 0.504863109f, - 0.862423956f, 0.506186645f, - 0.861646461f, 0.507508991f, - 0.860866939f, 0.508830143f, - 0.860085390f, 0.510150097f, - 0.859301818f, 0.511468850f, - 0.858516224f, 0.512786401f, - 0.857728610f, 0.514102744f, - 0.856938977f, 0.515417878f, - 0.856147328f, 0.516731799f, - 0.855353665f, 0.518044504f, - 0.854557988f, 0.519355990f, - 0.853760301f, 0.520666254f, - 0.852960605f, 0.521975293f, - 0.852158902f, 0.523283103f, - 0.851355193f, 0.524589683f, - 0.850549481f, 0.525895027f, - 0.849741768f, 0.527199135f, - 0.848932055f, 0.528502002f, - 0.848120345f, 0.529803625f, - 0.847306639f, 0.531104001f, - 0.846490939f, 0.532403128f, - 0.845673247f, 0.533701002f, - 0.844853565f, 0.534997620f, - 0.844031895f, 0.536292979f, - 0.843208240f, 0.537587076f, - 0.842382600f, 0.538879909f, - 0.841554977f, 0.540171473f, - 0.840725375f, 0.541461766f, - 0.839893794f, 0.542750785f, - 0.839060237f, 0.544038527f, - 0.838224706f, 0.545324988f, - 0.837387202f, 0.546610167f, - 0.836547727f, 0.547894059f, - 0.835706284f, 0.549176662f, - 0.834862875f, 0.550457973f, - 0.834017501f, 0.551737988f, - 0.833170165f, 0.553016706f, - 0.832320868f, 0.554294121f, - 0.831469612f, 0.555570233f, - 0.830616400f, 0.556845037f, - 0.829761234f, 0.558118531f, - 0.828904115f, 0.559390712f, - 0.828045045f, 0.560661576f, - 0.827184027f, 0.561931121f, - 0.826321063f, 0.563199344f, - 0.825456154f, 0.564466242f, - 0.824589303f, 0.565731811f, - 0.823720511f, 0.566996049f, - 0.822849781f, 0.568258953f, - 0.821977115f, 0.569520519f, - 0.821102515f, 0.570780746f, - 0.820225983f, 0.572039629f, - 0.819347520f, 0.573297167f, - 0.818467130f, 0.574553355f, - 0.817584813f, 0.575808191f, - 0.816700573f, 0.577061673f, - 0.815814411f, 0.578313796f, - 0.814926329f, 0.579564559f, - 0.814036330f, 0.580813958f, - 0.813144415f, 0.582061990f, - 0.812250587f, 0.583308653f, - 0.811354847f, 0.584553943f, - 0.810457198f, 0.585797857f, - 0.809557642f, 0.587040394f, - 0.808656182f, 0.588281548f, - 0.807752818f, 0.589521319f, - 0.806847554f, 0.590759702f, - 0.805940391f, 0.591996695f, - 0.805031331f, 0.593232295f, - 0.804120377f, 0.594466499f, - 0.803207531f, 0.595699304f, - 0.802292796f, 0.596930708f, - 0.801376172f, 0.598160707f, - 0.800457662f, 0.599389298f, - 0.799537269f, 0.600616479f, - 0.798614995f, 0.601842247f, - 0.797690841f, 0.603066599f, - 0.796764810f, 0.604289531f, - 0.795836905f, 0.605511041f, - 0.794907126f, 0.606731127f, - 0.793975478f, 0.607949785f, - 0.793041960f, 0.609167012f, - 0.792106577f, 0.610382806f, - 0.791169330f, 0.611597164f, - 0.790230221f, 0.612810082f, - 0.789289253f, 0.614021559f, - 0.788346428f, 0.615231591f, - 0.787401747f, 0.616440175f, - 0.786455214f, 0.617647308f, - 0.785506830f, 0.618852988f, - 0.784556597f, 0.620057212f, - 0.783604519f, 0.621259977f, - 0.782650596f, 0.622461279f, - 0.781694832f, 0.623661118f, - 0.780737229f, 0.624859488f, - 0.779777788f, 0.626056388f, - 0.778816512f, 0.627251815f, - 0.777853404f, 0.628445767f, - 0.776888466f, 0.629638239f, - 0.775921699f, 0.630829230f, - 0.774953107f, 0.632018736f, - 0.773982691f, 0.633206755f, - 0.773010453f, 0.634393284f, - 0.772036397f, 0.635578320f, - 0.771060524f, 0.636761861f, - 0.770082837f, 0.637943904f, - 0.769103338f, 0.639124445f, - 0.768122029f, 0.640303482f, - 0.767138912f, 0.641481013f, - 0.766153990f, 0.642657034f, - 0.765167266f, 0.643831543f, - 0.764178741f, 0.645004537f, - 0.763188417f, 0.646176013f, - 0.762196298f, 0.647345969f, - 0.761202385f, 0.648514401f, - 0.760206682f, 0.649681307f, - 0.759209189f, 0.650846685f, - 0.758209910f, 0.652010531f, - 0.757208847f, 0.653172843f, - 0.756206001f, 0.654333618f, - 0.755201377f, 0.655492853f, - 0.754194975f, 0.656650546f, - 0.753186799f, 0.657806693f, - 0.752176850f, 0.658961293f, - 0.751165132f, 0.660114342f, - 0.750151646f, 0.661265838f, - 0.749136395f, 0.662415778f, - 0.748119380f, 0.663564159f, - 0.747100606f, 0.664710978f, - 0.746080074f, 0.665856234f, - 0.745057785f, 0.666999922f, - 0.744033744f, 0.668142041f, - 0.743007952f, 0.669282588f, - 0.741980412f, 0.670421560f, - 0.740951125f, 0.671558955f, - 0.739920095f, 0.672694769f, - 0.738887324f, 0.673829000f, - 0.737852815f, 0.674961646f, - 0.736816569f, 0.676092704f, - 0.735778589f, 0.677222170f, - 0.734738878f, 0.678350043f, - 0.733697438f, 0.679476320f, - 0.732654272f, 0.680600998f, - 0.731609381f, 0.681724074f, - 0.730562769f, 0.682845546f, - 0.729514438f, 0.683965412f, - 0.728464390f, 0.685083668f, - 0.727412629f, 0.686200312f, - 0.726359155f, 0.687315341f, - 0.725303972f, 0.688428753f, - 0.724247083f, 0.689540545f, - 0.723188489f, 0.690650714f, - 0.722128194f, 0.691759258f, - 0.721066199f, 0.692866175f, - 0.720002508f, 0.693971461f, - 0.718937122f, 0.695075114f, - 0.717870045f, 0.696177131f, - 0.716801279f, 0.697277511f, - 0.715730825f, 0.698376249f, - 0.714658688f, 0.699473345f, - 0.713584869f, 0.700568794f, - 0.712509371f, 0.701662595f, - 0.711432196f, 0.702754744f, - 0.710353347f, 0.703845241f, - 0.709272826f, 0.704934080f, - 0.708190637f, 0.706021261f, - 0.707106781f, 0.707106781f, - 0.706021261f, 0.708190637f, - 0.704934080f, 0.709272826f, - 0.703845241f, 0.710353347f, - 0.702754744f, 0.711432196f, - 0.701662595f, 0.712509371f, - 0.700568794f, 0.713584869f, - 0.699473345f, 0.714658688f, - 0.698376249f, 0.715730825f, - 0.697277511f, 0.716801279f, - 0.696177131f, 0.717870045f, - 0.695075114f, 0.718937122f, - 0.693971461f, 0.720002508f, - 0.692866175f, 0.721066199f, - 0.691759258f, 0.722128194f, - 0.690650714f, 0.723188489f, - 0.689540545f, 0.724247083f, - 0.688428753f, 0.725303972f, - 0.687315341f, 0.726359155f, - 0.686200312f, 0.727412629f, - 0.685083668f, 0.728464390f, - 0.683965412f, 0.729514438f, - 0.682845546f, 0.730562769f, - 0.681724074f, 0.731609381f, - 0.680600998f, 0.732654272f, - 0.679476320f, 0.733697438f, - 0.678350043f, 0.734738878f, - 0.677222170f, 0.735778589f, - 0.676092704f, 0.736816569f, - 0.674961646f, 0.737852815f, - 0.673829000f, 0.738887324f, - 0.672694769f, 0.739920095f, - 0.671558955f, 0.740951125f, - 0.670421560f, 0.741980412f, - 0.669282588f, 0.743007952f, - 0.668142041f, 0.744033744f, - 0.666999922f, 0.745057785f, - 0.665856234f, 0.746080074f, - 0.664710978f, 0.747100606f, - 0.663564159f, 0.748119380f, - 0.662415778f, 0.749136395f, - 0.661265838f, 0.750151646f, - 0.660114342f, 0.751165132f, - 0.658961293f, 0.752176850f, - 0.657806693f, 0.753186799f, - 0.656650546f, 0.754194975f, - 0.655492853f, 0.755201377f, - 0.654333618f, 0.756206001f, - 0.653172843f, 0.757208847f, - 0.652010531f, 0.758209910f, - 0.650846685f, 0.759209189f, - 0.649681307f, 0.760206682f, - 0.648514401f, 0.761202385f, - 0.647345969f, 0.762196298f, - 0.646176013f, 0.763188417f, - 0.645004537f, 0.764178741f, - 0.643831543f, 0.765167266f, - 0.642657034f, 0.766153990f, - 0.641481013f, 0.767138912f, - 0.640303482f, 0.768122029f, - 0.639124445f, 0.769103338f, - 0.637943904f, 0.770082837f, - 0.636761861f, 0.771060524f, - 0.635578320f, 0.772036397f, - 0.634393284f, 0.773010453f, - 0.633206755f, 0.773982691f, - 0.632018736f, 0.774953107f, - 0.630829230f, 0.775921699f, - 0.629638239f, 0.776888466f, - 0.628445767f, 0.777853404f, - 0.627251815f, 0.778816512f, - 0.626056388f, 0.779777788f, - 0.624859488f, 0.780737229f, - 0.623661118f, 0.781694832f, - 0.622461279f, 0.782650596f, - 0.621259977f, 0.783604519f, - 0.620057212f, 0.784556597f, - 0.618852988f, 0.785506830f, - 0.617647308f, 0.786455214f, - 0.616440175f, 0.787401747f, - 0.615231591f, 0.788346428f, - 0.614021559f, 0.789289253f, - 0.612810082f, 0.790230221f, - 0.611597164f, 0.791169330f, - 0.610382806f, 0.792106577f, - 0.609167012f, 0.793041960f, - 0.607949785f, 0.793975478f, - 0.606731127f, 0.794907126f, - 0.605511041f, 0.795836905f, - 0.604289531f, 0.796764810f, - 0.603066599f, 0.797690841f, - 0.601842247f, 0.798614995f, - 0.600616479f, 0.799537269f, - 0.599389298f, 0.800457662f, - 0.598160707f, 0.801376172f, - 0.596930708f, 0.802292796f, - 0.595699304f, 0.803207531f, - 0.594466499f, 0.804120377f, - 0.593232295f, 0.805031331f, - 0.591996695f, 0.805940391f, - 0.590759702f, 0.806847554f, - 0.589521319f, 0.807752818f, - 0.588281548f, 0.808656182f, - 0.587040394f, 0.809557642f, - 0.585797857f, 0.810457198f, - 0.584553943f, 0.811354847f, - 0.583308653f, 0.812250587f, - 0.582061990f, 0.813144415f, - 0.580813958f, 0.814036330f, - 0.579564559f, 0.814926329f, - 0.578313796f, 0.815814411f, - 0.577061673f, 0.816700573f, - 0.575808191f, 0.817584813f, - 0.574553355f, 0.818467130f, - 0.573297167f, 0.819347520f, - 0.572039629f, 0.820225983f, - 0.570780746f, 0.821102515f, - 0.569520519f, 0.821977115f, - 0.568258953f, 0.822849781f, - 0.566996049f, 0.823720511f, - 0.565731811f, 0.824589303f, - 0.564466242f, 0.825456154f, - 0.563199344f, 0.826321063f, - 0.561931121f, 0.827184027f, - 0.560661576f, 0.828045045f, - 0.559390712f, 0.828904115f, - 0.558118531f, 0.829761234f, - 0.556845037f, 0.830616400f, - 0.555570233f, 0.831469612f, - 0.554294121f, 0.832320868f, - 0.553016706f, 0.833170165f, - 0.551737988f, 0.834017501f, - 0.550457973f, 0.834862875f, - 0.549176662f, 0.835706284f, - 0.547894059f, 0.836547727f, - 0.546610167f, 0.837387202f, - 0.545324988f, 0.838224706f, - 0.544038527f, 0.839060237f, - 0.542750785f, 0.839893794f, - 0.541461766f, 0.840725375f, - 0.540171473f, 0.841554977f, - 0.538879909f, 0.842382600f, - 0.537587076f, 0.843208240f, - 0.536292979f, 0.844031895f, - 0.534997620f, 0.844853565f, - 0.533701002f, 0.845673247f, - 0.532403128f, 0.846490939f, - 0.531104001f, 0.847306639f, - 0.529803625f, 0.848120345f, - 0.528502002f, 0.848932055f, - 0.527199135f, 0.849741768f, - 0.525895027f, 0.850549481f, - 0.524589683f, 0.851355193f, - 0.523283103f, 0.852158902f, - 0.521975293f, 0.852960605f, - 0.520666254f, 0.853760301f, - 0.519355990f, 0.854557988f, - 0.518044504f, 0.855353665f, - 0.516731799f, 0.856147328f, - 0.515417878f, 0.856938977f, - 0.514102744f, 0.857728610f, - 0.512786401f, 0.858516224f, - 0.511468850f, 0.859301818f, - 0.510150097f, 0.860085390f, - 0.508830143f, 0.860866939f, - 0.507508991f, 0.861646461f, - 0.506186645f, 0.862423956f, - 0.504863109f, 0.863199422f, - 0.503538384f, 0.863972856f, - 0.502212474f, 0.864744258f, - 0.500885383f, 0.865513624f, - 0.499557113f, 0.866280954f, - 0.498227667f, 0.867046246f, - 0.496897049f, 0.867809497f, - 0.495565262f, 0.868570706f, - 0.494232309f, 0.869329871f, - 0.492898192f, 0.870086991f, - 0.491562916f, 0.870842063f, - 0.490226483f, 0.871595087f, - 0.488888897f, 0.872346059f, - 0.487550160f, 0.873094978f, - 0.486210276f, 0.873841843f, - 0.484869248f, 0.874586652f, - 0.483527079f, 0.875329403f, - 0.482183772f, 0.876070094f, - 0.480839331f, 0.876808724f, - 0.479493758f, 0.877545290f, - 0.478147056f, 0.878279792f, - 0.476799230f, 0.879012226f, - 0.475450282f, 0.879742593f, - 0.474100215f, 0.880470889f, - 0.472749032f, 0.881197113f, - 0.471396737f, 0.881921264f, - 0.470043332f, 0.882643340f, - 0.468688822f, 0.883363339f, - 0.467333209f, 0.884081259f, - 0.465976496f, 0.884797098f, - 0.464618686f, 0.885510856f, - 0.463259784f, 0.886222530f, - 0.461899791f, 0.886932119f, - 0.460538711f, 0.887639620f, - 0.459176548f, 0.888345033f, - 0.457813304f, 0.889048356f, - 0.456448982f, 0.889749586f, - 0.455083587f, 0.890448723f, - 0.453717121f, 0.891145765f, - 0.452349587f, 0.891840709f, - 0.450980989f, 0.892533555f, - 0.449611330f, 0.893224301f, - 0.448240612f, 0.893912945f, - 0.446868840f, 0.894599486f, - 0.445496017f, 0.895283921f, - 0.444122145f, 0.895966250f, - 0.442747228f, 0.896646470f, - 0.441371269f, 0.897324581f, - 0.439994271f, 0.898000580f, - 0.438616239f, 0.898674466f, - 0.437237174f, 0.899346237f, - 0.435857080f, 0.900015892f, - 0.434475961f, 0.900683429f, - 0.433093819f, 0.901348847f, - 0.431710658f, 0.902012144f, - 0.430326481f, 0.902673318f, - 0.428941292f, 0.903332368f, - 0.427555093f, 0.903989293f, - 0.426167889f, 0.904644091f, - 0.424779681f, 0.905296759f, - 0.423390474f, 0.905947298f, - 0.422000271f, 0.906595705f, - 0.420609074f, 0.907241978f, - 0.419216888f, 0.907886116f, - 0.417823716f, 0.908528119f, - 0.416429560f, 0.909167983f, - 0.415034424f, 0.909805708f, - 0.413638312f, 0.910441292f, - 0.412241227f, 0.911074734f, - 0.410843171f, 0.911706032f, - 0.409444149f, 0.912335185f, - 0.408044163f, 0.912962190f, - 0.406643217f, 0.913587048f, - 0.405241314f, 0.914209756f, - 0.403838458f, 0.914830312f, - 0.402434651f, 0.915448716f, - 0.401029897f, 0.916064966f, - 0.399624200f, 0.916679060f, - 0.398217562f, 0.917290997f, - 0.396809987f, 0.917900776f, - 0.395401479f, 0.918508394f, - 0.393992040f, 0.919113852f, - 0.392581674f, 0.919717146f, - 0.391170384f, 0.920318277f, - 0.389758174f, 0.920917242f, - 0.388345047f, 0.921514039f, - 0.386931006f, 0.922108669f, - 0.385516054f, 0.922701128f, - 0.384100195f, 0.923291417f, - 0.382683432f, 0.923879533f, - 0.381265769f, 0.924465474f, - 0.379847209f, 0.925049241f, - 0.378427755f, 0.925630831f, - 0.377007410f, 0.926210242f, - 0.375586178f, 0.926787474f, - 0.374164063f, 0.927362526f, - 0.372741067f, 0.927935395f, - 0.371317194f, 0.928506080f, - 0.369892447f, 0.929074581f, - 0.368466830f, 0.929640896f, - 0.367040346f, 0.930205023f, - 0.365612998f, 0.930766961f, - 0.364184790f, 0.931326709f, - 0.362755724f, 0.931884266f, - 0.361325806f, 0.932439629f, - 0.359895037f, 0.932992799f, - 0.358463421f, 0.933543773f, - 0.357030961f, 0.934092550f, - 0.355597662f, 0.934639130f, - 0.354163525f, 0.935183510f, - 0.352728556f, 0.935725689f, - 0.351292756f, 0.936265667f, - 0.349856130f, 0.936803442f, - 0.348418680f, 0.937339012f, - 0.346980411f, 0.937872376f, - 0.345541325f, 0.938403534f, - 0.344101426f, 0.938932484f, - 0.342660717f, 0.939459224f, - 0.341219202f, 0.939983753f, - 0.339776884f, 0.940506071f, - 0.338333767f, 0.941026175f, - 0.336889853f, 0.941544065f, - 0.335445147f, 0.942059740f, - 0.333999651f, 0.942573198f, - 0.332553370f, 0.943084437f, - 0.331106306f, 0.943593458f, - 0.329658463f, 0.944100258f, - 0.328209844f, 0.944604837f, - 0.326760452f, 0.945107193f, - 0.325310292f, 0.945607325f, - 0.323859367f, 0.946105232f, - 0.322407679f, 0.946600913f, - 0.320955232f, 0.947094366f, - 0.319502031f, 0.947585591f, - 0.318048077f, 0.948074586f, - 0.316593376f, 0.948561350f, - 0.315137929f, 0.949045882f, - 0.313681740f, 0.949528181f, - 0.312224814f, 0.950008245f, - 0.310767153f, 0.950486074f, - 0.309308760f, 0.950961666f, - 0.307849640f, 0.951435021f, - 0.306389795f, 0.951906137f, - 0.304929230f, 0.952375013f, - 0.303467947f, 0.952841648f, - 0.302005949f, 0.953306040f, - 0.300543241f, 0.953768190f, - 0.299079826f, 0.954228095f, - 0.297615707f, 0.954685755f, - 0.296150888f, 0.955141168f, - 0.294685372f, 0.955594334f, - 0.293219163f, 0.956045251f, - 0.291752263f, 0.956493919f, - 0.290284677f, 0.956940336f, - 0.288816408f, 0.957384501f, - 0.287347460f, 0.957826413f, - 0.285877835f, 0.958266071f, - 0.284407537f, 0.958703475f, - 0.282936570f, 0.959138622f, - 0.281464938f, 0.959571513f, - 0.279992643f, 0.960002146f, - 0.278519689f, 0.960430519f, - 0.277046080f, 0.960856633f, - 0.275571819f, 0.961280486f, - 0.274096910f, 0.961702077f, - 0.272621355f, 0.962121404f, - 0.271145160f, 0.962538468f, - 0.269668326f, 0.962953267f, - 0.268190857f, 0.963365800f, - 0.266712757f, 0.963776066f, - 0.265234030f, 0.964184064f, - 0.263754679f, 0.964589793f, - 0.262274707f, 0.964993253f, - 0.260794118f, 0.965394442f, - 0.259312915f, 0.965793359f, - 0.257831102f, 0.966190003f, - 0.256348682f, 0.966584374f, - 0.254865660f, 0.966976471f, - 0.253382037f, 0.967366292f, - 0.251897818f, 0.967753837f, - 0.250413007f, 0.968139105f, - 0.248927606f, 0.968522094f, - 0.247441619f, 0.968902805f, - 0.245955050f, 0.969281235f, - 0.244467903f, 0.969657385f, - 0.242980180f, 0.970031253f, - 0.241491885f, 0.970402839f, - 0.240003022f, 0.970772141f, - 0.238513595f, 0.971139158f, - 0.237023606f, 0.971503891f, - 0.235533059f, 0.971866337f, - 0.234041959f, 0.972226497f, - 0.232550307f, 0.972584369f, - 0.231058108f, 0.972939952f, - 0.229565366f, 0.973293246f, - 0.228072083f, 0.973644250f, - 0.226578264f, 0.973992962f, - 0.225083911f, 0.974339383f, - 0.223589029f, 0.974683511f, - 0.222093621f, 0.975025345f, - 0.220597690f, 0.975364885f, - 0.219101240f, 0.975702130f, - 0.217604275f, 0.976037079f, - 0.216106797f, 0.976369731f, - 0.214608811f, 0.976700086f, - 0.213110320f, 0.977028143f, - 0.211611327f, 0.977353900f, - 0.210111837f, 0.977677358f, - 0.208611852f, 0.977998515f, - 0.207111376f, 0.978317371f, - 0.205610413f, 0.978633924f, - 0.204108966f, 0.978948175f, - 0.202607039f, 0.979260123f, - 0.201104635f, 0.979569766f, - 0.199601758f, 0.979877104f, - 0.198098411f, 0.980182136f, - 0.196594598f, 0.980484862f, - 0.195090322f, 0.980785280f, - 0.193585587f, 0.981083391f, - 0.192080397f, 0.981379193f, - 0.190574755f, 0.981672686f, - 0.189068664f, 0.981963869f, - 0.187562129f, 0.982252741f, - 0.186055152f, 0.982539302f, - 0.184547737f, 0.982823551f, - 0.183039888f, 0.983105487f, - 0.181531608f, 0.983385110f, - 0.180022901f, 0.983662419f, - 0.178513771f, 0.983937413f, - 0.177004220f, 0.984210092f, - 0.175494253f, 0.984480455f, - 0.173983873f, 0.984748502f, - 0.172473084f, 0.985014231f, - 0.170961889f, 0.985277642f, - 0.169450291f, 0.985538735f, - 0.167938295f, 0.985797509f, - 0.166425904f, 0.986053963f, - 0.164913120f, 0.986308097f, - 0.163399949f, 0.986559910f, - 0.161886394f, 0.986809402f, - 0.160372457f, 0.987056571f, - 0.158858143f, 0.987301418f, - 0.157343456f, 0.987543942f, - 0.155828398f, 0.987784142f, - 0.154312973f, 0.988022017f, - 0.152797185f, 0.988257568f, - 0.151281038f, 0.988490793f, - 0.149764535f, 0.988721692f, - 0.148247679f, 0.988950265f, - 0.146730474f, 0.989176510f, - 0.145212925f, 0.989400428f, - 0.143695033f, 0.989622017f, - 0.142176804f, 0.989841278f, - 0.140658239f, 0.990058210f, - 0.139139344f, 0.990272812f, - 0.137620122f, 0.990485084f, - 0.136100575f, 0.990695025f, - 0.134580709f, 0.990902635f, - 0.133060525f, 0.991107914f, - 0.131540029f, 0.991310860f, - 0.130019223f, 0.991511473f, - 0.128498111f, 0.991709754f, - 0.126976696f, 0.991905700f, - 0.125454983f, 0.992099313f, - 0.123932975f, 0.992290591f, - 0.122410675f, 0.992479535f, - 0.120888087f, 0.992666142f, - 0.119365215f, 0.992850414f, - 0.117842062f, 0.993032350f, - 0.116318631f, 0.993211949f, - 0.114794927f, 0.993389211f, - 0.113270952f, 0.993564136f, - 0.111746711f, 0.993736722f, - 0.110222207f, 0.993906970f, - 0.108697444f, 0.994074879f, - 0.107172425f, 0.994240449f, - 0.105647154f, 0.994403680f, - 0.104121634f, 0.994564571f, - 0.102595869f, 0.994723121f, - 0.101069863f, 0.994879331f, - 0.099543619f, 0.995033199f, - 0.098017140f, 0.995184727f, - 0.096490431f, 0.995333912f, - 0.094963495f, 0.995480755f, - 0.093436336f, 0.995625256f, - 0.091908956f, 0.995767414f, - 0.090381361f, 0.995907229f, - 0.088853553f, 0.996044701f, - 0.087325535f, 0.996179829f, - 0.085797312f, 0.996312612f, - 0.084268888f, 0.996443051f, - 0.082740265f, 0.996571146f, - 0.081211447f, 0.996696895f, - 0.079682438f, 0.996820299f, - 0.078153242f, 0.996941358f, - 0.076623861f, 0.997060070f, - 0.075094301f, 0.997176437f, - 0.073564564f, 0.997290457f, - 0.072034653f, 0.997402130f, - 0.070504573f, 0.997511456f, - 0.068974328f, 0.997618435f, - 0.067443920f, 0.997723067f, - 0.065913353f, 0.997825350f, - 0.064382631f, 0.997925286f, - 0.062851758f, 0.998022874f, - 0.061320736f, 0.998118113f, - 0.059789571f, 0.998211003f, - 0.058258265f, 0.998301545f, - 0.056726821f, 0.998389737f, - 0.055195244f, 0.998475581f, - 0.053663538f, 0.998559074f, - 0.052131705f, 0.998640218f, - 0.050599749f, 0.998719012f, - 0.049067674f, 0.998795456f, - 0.047535484f, 0.998869550f, - 0.046003182f, 0.998941293f, - 0.044470772f, 0.999010686f, - 0.042938257f, 0.999077728f, - 0.041405641f, 0.999142419f, - 0.039872928f, 0.999204759f, - 0.038340120f, 0.999264747f, - 0.036807223f, 0.999322385f, - 0.035274239f, 0.999377670f, - 0.033741172f, 0.999430605f, - 0.032208025f, 0.999481187f, - 0.030674803f, 0.999529418f, - 0.029141509f, 0.999575296f, - 0.027608146f, 0.999618822f, - 0.026074718f, 0.999659997f, - 0.024541229f, 0.999698819f, - 0.023007681f, 0.999735288f, - 0.021474080f, 0.999769405f, - 0.019940429f, 0.999801170f, - 0.018406730f, 0.999830582f, - 0.016872988f, 0.999857641f, - 0.015339206f, 0.999882347f, - 0.013805389f, 0.999904701f, - 0.012271538f, 0.999924702f, - 0.010737659f, 0.999942350f, - 0.009203755f, 0.999957645f, - 0.007669829f, 0.999970586f, - 0.006135885f, 0.999981175f, - 0.004601926f, 0.999989411f, - 0.003067957f, 0.999995294f, - 0.001533980f, 0.999998823f, - 0.000000000f, 1.000000000f, - -0.001533980f, 0.999998823f, - -0.003067957f, 0.999995294f, - -0.004601926f, 0.999989411f, - -0.006135885f, 0.999981175f, - -0.007669829f, 0.999970586f, - -0.009203755f, 0.999957645f, - -0.010737659f, 0.999942350f, - -0.012271538f, 0.999924702f, - -0.013805389f, 0.999904701f, - -0.015339206f, 0.999882347f, - -0.016872988f, 0.999857641f, - -0.018406730f, 0.999830582f, - -0.019940429f, 0.999801170f, - -0.021474080f, 0.999769405f, - -0.023007681f, 0.999735288f, - -0.024541229f, 0.999698819f, - -0.026074718f, 0.999659997f, - -0.027608146f, 0.999618822f, - -0.029141509f, 0.999575296f, - -0.030674803f, 0.999529418f, - -0.032208025f, 0.999481187f, - -0.033741172f, 0.999430605f, - -0.035274239f, 0.999377670f, - -0.036807223f, 0.999322385f, - -0.038340120f, 0.999264747f, - -0.039872928f, 0.999204759f, - -0.041405641f, 0.999142419f, - -0.042938257f, 0.999077728f, - -0.044470772f, 0.999010686f, - -0.046003182f, 0.998941293f, - -0.047535484f, 0.998869550f, - -0.049067674f, 0.998795456f, - -0.050599749f, 0.998719012f, - -0.052131705f, 0.998640218f, - -0.053663538f, 0.998559074f, - -0.055195244f, 0.998475581f, - -0.056726821f, 0.998389737f, - -0.058258265f, 0.998301545f, - -0.059789571f, 0.998211003f, - -0.061320736f, 0.998118113f, - -0.062851758f, 0.998022874f, - -0.064382631f, 0.997925286f, - -0.065913353f, 0.997825350f, - -0.067443920f, 0.997723067f, - -0.068974328f, 0.997618435f, - -0.070504573f, 0.997511456f, - -0.072034653f, 0.997402130f, - -0.073564564f, 0.997290457f, - -0.075094301f, 0.997176437f, - -0.076623861f, 0.997060070f, - -0.078153242f, 0.996941358f, - -0.079682438f, 0.996820299f, - -0.081211447f, 0.996696895f, - -0.082740265f, 0.996571146f, - -0.084268888f, 0.996443051f, - -0.085797312f, 0.996312612f, - -0.087325535f, 0.996179829f, - -0.088853553f, 0.996044701f, - -0.090381361f, 0.995907229f, - -0.091908956f, 0.995767414f, - -0.093436336f, 0.995625256f, - -0.094963495f, 0.995480755f, - -0.096490431f, 0.995333912f, - -0.098017140f, 0.995184727f, - -0.099543619f, 0.995033199f, - -0.101069863f, 0.994879331f, - -0.102595869f, 0.994723121f, - -0.104121634f, 0.994564571f, - -0.105647154f, 0.994403680f, - -0.107172425f, 0.994240449f, - -0.108697444f, 0.994074879f, - -0.110222207f, 0.993906970f, - -0.111746711f, 0.993736722f, - -0.113270952f, 0.993564136f, - -0.114794927f, 0.993389211f, - -0.116318631f, 0.993211949f, - -0.117842062f, 0.993032350f, - -0.119365215f, 0.992850414f, - -0.120888087f, 0.992666142f, - -0.122410675f, 0.992479535f, - -0.123932975f, 0.992290591f, - -0.125454983f, 0.992099313f, - -0.126976696f, 0.991905700f, - -0.128498111f, 0.991709754f, - -0.130019223f, 0.991511473f, - -0.131540029f, 0.991310860f, - -0.133060525f, 0.991107914f, - -0.134580709f, 0.990902635f, - -0.136100575f, 0.990695025f, - -0.137620122f, 0.990485084f, - -0.139139344f, 0.990272812f, - -0.140658239f, 0.990058210f, - -0.142176804f, 0.989841278f, - -0.143695033f, 0.989622017f, - -0.145212925f, 0.989400428f, - -0.146730474f, 0.989176510f, - -0.148247679f, 0.988950265f, - -0.149764535f, 0.988721692f, - -0.151281038f, 0.988490793f, - -0.152797185f, 0.988257568f, - -0.154312973f, 0.988022017f, - -0.155828398f, 0.987784142f, - -0.157343456f, 0.987543942f, - -0.158858143f, 0.987301418f, - -0.160372457f, 0.987056571f, - -0.161886394f, 0.986809402f, - -0.163399949f, 0.986559910f, - -0.164913120f, 0.986308097f, - -0.166425904f, 0.986053963f, - -0.167938295f, 0.985797509f, - -0.169450291f, 0.985538735f, - -0.170961889f, 0.985277642f, - -0.172473084f, 0.985014231f, - -0.173983873f, 0.984748502f, - -0.175494253f, 0.984480455f, - -0.177004220f, 0.984210092f, - -0.178513771f, 0.983937413f, - -0.180022901f, 0.983662419f, - -0.181531608f, 0.983385110f, - -0.183039888f, 0.983105487f, - -0.184547737f, 0.982823551f, - -0.186055152f, 0.982539302f, - -0.187562129f, 0.982252741f, - -0.189068664f, 0.981963869f, - -0.190574755f, 0.981672686f, - -0.192080397f, 0.981379193f, - -0.193585587f, 0.981083391f, - -0.195090322f, 0.980785280f, - -0.196594598f, 0.980484862f, - -0.198098411f, 0.980182136f, - -0.199601758f, 0.979877104f, - -0.201104635f, 0.979569766f, - -0.202607039f, 0.979260123f, - -0.204108966f, 0.978948175f, - -0.205610413f, 0.978633924f, - -0.207111376f, 0.978317371f, - -0.208611852f, 0.977998515f, - -0.210111837f, 0.977677358f, - -0.211611327f, 0.977353900f, - -0.213110320f, 0.977028143f, - -0.214608811f, 0.976700086f, - -0.216106797f, 0.976369731f, - -0.217604275f, 0.976037079f, - -0.219101240f, 0.975702130f, - -0.220597690f, 0.975364885f, - -0.222093621f, 0.975025345f, - -0.223589029f, 0.974683511f, - -0.225083911f, 0.974339383f, - -0.226578264f, 0.973992962f, - -0.228072083f, 0.973644250f, - -0.229565366f, 0.973293246f, - -0.231058108f, 0.972939952f, - -0.232550307f, 0.972584369f, - -0.234041959f, 0.972226497f, - -0.235533059f, 0.971866337f, - -0.237023606f, 0.971503891f, - -0.238513595f, 0.971139158f, - -0.240003022f, 0.970772141f, - -0.241491885f, 0.970402839f, - -0.242980180f, 0.970031253f, - -0.244467903f, 0.969657385f, - -0.245955050f, 0.969281235f, - -0.247441619f, 0.968902805f, - -0.248927606f, 0.968522094f, - -0.250413007f, 0.968139105f, - -0.251897818f, 0.967753837f, - -0.253382037f, 0.967366292f, - -0.254865660f, 0.966976471f, - -0.256348682f, 0.966584374f, - -0.257831102f, 0.966190003f, - -0.259312915f, 0.965793359f, - -0.260794118f, 0.965394442f, - -0.262274707f, 0.964993253f, - -0.263754679f, 0.964589793f, - -0.265234030f, 0.964184064f, - -0.266712757f, 0.963776066f, - -0.268190857f, 0.963365800f, - -0.269668326f, 0.962953267f, - -0.271145160f, 0.962538468f, - -0.272621355f, 0.962121404f, - -0.274096910f, 0.961702077f, - -0.275571819f, 0.961280486f, - -0.277046080f, 0.960856633f, - -0.278519689f, 0.960430519f, - -0.279992643f, 0.960002146f, - -0.281464938f, 0.959571513f, - -0.282936570f, 0.959138622f, - -0.284407537f, 0.958703475f, - -0.285877835f, 0.958266071f, - -0.287347460f, 0.957826413f, - -0.288816408f, 0.957384501f, - -0.290284677f, 0.956940336f, - -0.291752263f, 0.956493919f, - -0.293219163f, 0.956045251f, - -0.294685372f, 0.955594334f, - -0.296150888f, 0.955141168f, - -0.297615707f, 0.954685755f, - -0.299079826f, 0.954228095f, - -0.300543241f, 0.953768190f, - -0.302005949f, 0.953306040f, - -0.303467947f, 0.952841648f, - -0.304929230f, 0.952375013f, - -0.306389795f, 0.951906137f, - -0.307849640f, 0.951435021f, - -0.309308760f, 0.950961666f, - -0.310767153f, 0.950486074f, - -0.312224814f, 0.950008245f, - -0.313681740f, 0.949528181f, - -0.315137929f, 0.949045882f, - -0.316593376f, 0.948561350f, - -0.318048077f, 0.948074586f, - -0.319502031f, 0.947585591f, - -0.320955232f, 0.947094366f, - -0.322407679f, 0.946600913f, - -0.323859367f, 0.946105232f, - -0.325310292f, 0.945607325f, - -0.326760452f, 0.945107193f, - -0.328209844f, 0.944604837f, - -0.329658463f, 0.944100258f, - -0.331106306f, 0.943593458f, - -0.332553370f, 0.943084437f, - -0.333999651f, 0.942573198f, - -0.335445147f, 0.942059740f, - -0.336889853f, 0.941544065f, - -0.338333767f, 0.941026175f, - -0.339776884f, 0.940506071f, - -0.341219202f, 0.939983753f, - -0.342660717f, 0.939459224f, - -0.344101426f, 0.938932484f, - -0.345541325f, 0.938403534f, - -0.346980411f, 0.937872376f, - -0.348418680f, 0.937339012f, - -0.349856130f, 0.936803442f, - -0.351292756f, 0.936265667f, - -0.352728556f, 0.935725689f, - -0.354163525f, 0.935183510f, - -0.355597662f, 0.934639130f, - -0.357030961f, 0.934092550f, - -0.358463421f, 0.933543773f, - -0.359895037f, 0.932992799f, - -0.361325806f, 0.932439629f, - -0.362755724f, 0.931884266f, - -0.364184790f, 0.931326709f, - -0.365612998f, 0.930766961f, - -0.367040346f, 0.930205023f, - -0.368466830f, 0.929640896f, - -0.369892447f, 0.929074581f, - -0.371317194f, 0.928506080f, - -0.372741067f, 0.927935395f, - -0.374164063f, 0.927362526f, - -0.375586178f, 0.926787474f, - -0.377007410f, 0.926210242f, - -0.378427755f, 0.925630831f, - -0.379847209f, 0.925049241f, - -0.381265769f, 0.924465474f, - -0.382683432f, 0.923879533f, - -0.384100195f, 0.923291417f, - -0.385516054f, 0.922701128f, - -0.386931006f, 0.922108669f, - -0.388345047f, 0.921514039f, - -0.389758174f, 0.920917242f, - -0.391170384f, 0.920318277f, - -0.392581674f, 0.919717146f, - -0.393992040f, 0.919113852f, - -0.395401479f, 0.918508394f, - -0.396809987f, 0.917900776f, - -0.398217562f, 0.917290997f, - -0.399624200f, 0.916679060f, - -0.401029897f, 0.916064966f, - -0.402434651f, 0.915448716f, - -0.403838458f, 0.914830312f, - -0.405241314f, 0.914209756f, - -0.406643217f, 0.913587048f, - -0.408044163f, 0.912962190f, - -0.409444149f, 0.912335185f, - -0.410843171f, 0.911706032f, - -0.412241227f, 0.911074734f, - -0.413638312f, 0.910441292f, - -0.415034424f, 0.909805708f, - -0.416429560f, 0.909167983f, - -0.417823716f, 0.908528119f, - -0.419216888f, 0.907886116f, - -0.420609074f, 0.907241978f, - -0.422000271f, 0.906595705f, - -0.423390474f, 0.905947298f, - -0.424779681f, 0.905296759f, - -0.426167889f, 0.904644091f, - -0.427555093f, 0.903989293f, - -0.428941292f, 0.903332368f, - -0.430326481f, 0.902673318f, - -0.431710658f, 0.902012144f, - -0.433093819f, 0.901348847f, - -0.434475961f, 0.900683429f, - -0.435857080f, 0.900015892f, - -0.437237174f, 0.899346237f, - -0.438616239f, 0.898674466f, - -0.439994271f, 0.898000580f, - -0.441371269f, 0.897324581f, - -0.442747228f, 0.896646470f, - -0.444122145f, 0.895966250f, - -0.445496017f, 0.895283921f, - -0.446868840f, 0.894599486f, - -0.448240612f, 0.893912945f, - -0.449611330f, 0.893224301f, - -0.450980989f, 0.892533555f, - -0.452349587f, 0.891840709f, - -0.453717121f, 0.891145765f, - -0.455083587f, 0.890448723f, - -0.456448982f, 0.889749586f, - -0.457813304f, 0.889048356f, - -0.459176548f, 0.888345033f, - -0.460538711f, 0.887639620f, - -0.461899791f, 0.886932119f, - -0.463259784f, 0.886222530f, - -0.464618686f, 0.885510856f, - -0.465976496f, 0.884797098f, - -0.467333209f, 0.884081259f, - -0.468688822f, 0.883363339f, - -0.470043332f, 0.882643340f, - -0.471396737f, 0.881921264f, - -0.472749032f, 0.881197113f, - -0.474100215f, 0.880470889f, - -0.475450282f, 0.879742593f, - -0.476799230f, 0.879012226f, - -0.478147056f, 0.878279792f, - -0.479493758f, 0.877545290f, - -0.480839331f, 0.876808724f, - -0.482183772f, 0.876070094f, - -0.483527079f, 0.875329403f, - -0.484869248f, 0.874586652f, - -0.486210276f, 0.873841843f, - -0.487550160f, 0.873094978f, - -0.488888897f, 0.872346059f, - -0.490226483f, 0.871595087f, - -0.491562916f, 0.870842063f, - -0.492898192f, 0.870086991f, - -0.494232309f, 0.869329871f, - -0.495565262f, 0.868570706f, - -0.496897049f, 0.867809497f, - -0.498227667f, 0.867046246f, - -0.499557113f, 0.866280954f, - -0.500885383f, 0.865513624f, - -0.502212474f, 0.864744258f, - -0.503538384f, 0.863972856f, - -0.504863109f, 0.863199422f, - -0.506186645f, 0.862423956f, - -0.507508991f, 0.861646461f, - -0.508830143f, 0.860866939f, - -0.510150097f, 0.860085390f, - -0.511468850f, 0.859301818f, - -0.512786401f, 0.858516224f, - -0.514102744f, 0.857728610f, - -0.515417878f, 0.856938977f, - -0.516731799f, 0.856147328f, - -0.518044504f, 0.855353665f, - -0.519355990f, 0.854557988f, - -0.520666254f, 0.853760301f, - -0.521975293f, 0.852960605f, - -0.523283103f, 0.852158902f, - -0.524589683f, 0.851355193f, - -0.525895027f, 0.850549481f, - -0.527199135f, 0.849741768f, - -0.528502002f, 0.848932055f, - -0.529803625f, 0.848120345f, - -0.531104001f, 0.847306639f, - -0.532403128f, 0.846490939f, - -0.533701002f, 0.845673247f, - -0.534997620f, 0.844853565f, - -0.536292979f, 0.844031895f, - -0.537587076f, 0.843208240f, - -0.538879909f, 0.842382600f, - -0.540171473f, 0.841554977f, - -0.541461766f, 0.840725375f, - -0.542750785f, 0.839893794f, - -0.544038527f, 0.839060237f, - -0.545324988f, 0.838224706f, - -0.546610167f, 0.837387202f, - -0.547894059f, 0.836547727f, - -0.549176662f, 0.835706284f, - -0.550457973f, 0.834862875f, - -0.551737988f, 0.834017501f, - -0.553016706f, 0.833170165f, - -0.554294121f, 0.832320868f, - -0.555570233f, 0.831469612f, - -0.556845037f, 0.830616400f, - -0.558118531f, 0.829761234f, - -0.559390712f, 0.828904115f, - -0.560661576f, 0.828045045f, - -0.561931121f, 0.827184027f, - -0.563199344f, 0.826321063f, - -0.564466242f, 0.825456154f, - -0.565731811f, 0.824589303f, - -0.566996049f, 0.823720511f, - -0.568258953f, 0.822849781f, - -0.569520519f, 0.821977115f, - -0.570780746f, 0.821102515f, - -0.572039629f, 0.820225983f, - -0.573297167f, 0.819347520f, - -0.574553355f, 0.818467130f, - -0.575808191f, 0.817584813f, - -0.577061673f, 0.816700573f, - -0.578313796f, 0.815814411f, - -0.579564559f, 0.814926329f, - -0.580813958f, 0.814036330f, - -0.582061990f, 0.813144415f, - -0.583308653f, 0.812250587f, - -0.584553943f, 0.811354847f, - -0.585797857f, 0.810457198f, - -0.587040394f, 0.809557642f, - -0.588281548f, 0.808656182f, - -0.589521319f, 0.807752818f, - -0.590759702f, 0.806847554f, - -0.591996695f, 0.805940391f, - -0.593232295f, 0.805031331f, - -0.594466499f, 0.804120377f, - -0.595699304f, 0.803207531f, - -0.596930708f, 0.802292796f, - -0.598160707f, 0.801376172f, - -0.599389298f, 0.800457662f, - -0.600616479f, 0.799537269f, - -0.601842247f, 0.798614995f, - -0.603066599f, 0.797690841f, - -0.604289531f, 0.796764810f, - -0.605511041f, 0.795836905f, - -0.606731127f, 0.794907126f, - -0.607949785f, 0.793975478f, - -0.609167012f, 0.793041960f, - -0.610382806f, 0.792106577f, - -0.611597164f, 0.791169330f, - -0.612810082f, 0.790230221f, - -0.614021559f, 0.789289253f, - -0.615231591f, 0.788346428f, - -0.616440175f, 0.787401747f, - -0.617647308f, 0.786455214f, - -0.618852988f, 0.785506830f, - -0.620057212f, 0.784556597f, - -0.621259977f, 0.783604519f, - -0.622461279f, 0.782650596f, - -0.623661118f, 0.781694832f, - -0.624859488f, 0.780737229f, - -0.626056388f, 0.779777788f, - -0.627251815f, 0.778816512f, - -0.628445767f, 0.777853404f, - -0.629638239f, 0.776888466f, - -0.630829230f, 0.775921699f, - -0.632018736f, 0.774953107f, - -0.633206755f, 0.773982691f, - -0.634393284f, 0.773010453f, - -0.635578320f, 0.772036397f, - -0.636761861f, 0.771060524f, - -0.637943904f, 0.770082837f, - -0.639124445f, 0.769103338f, - -0.640303482f, 0.768122029f, - -0.641481013f, 0.767138912f, - -0.642657034f, 0.766153990f, - -0.643831543f, 0.765167266f, - -0.645004537f, 0.764178741f, - -0.646176013f, 0.763188417f, - -0.647345969f, 0.762196298f, - -0.648514401f, 0.761202385f, - -0.649681307f, 0.760206682f, - -0.650846685f, 0.759209189f, - -0.652010531f, 0.758209910f, - -0.653172843f, 0.757208847f, - -0.654333618f, 0.756206001f, - -0.655492853f, 0.755201377f, - -0.656650546f, 0.754194975f, - -0.657806693f, 0.753186799f, - -0.658961293f, 0.752176850f, - -0.660114342f, 0.751165132f, - -0.661265838f, 0.750151646f, - -0.662415778f, 0.749136395f, - -0.663564159f, 0.748119380f, - -0.664710978f, 0.747100606f, - -0.665856234f, 0.746080074f, - -0.666999922f, 0.745057785f, - -0.668142041f, 0.744033744f, - -0.669282588f, 0.743007952f, - -0.670421560f, 0.741980412f, - -0.671558955f, 0.740951125f, - -0.672694769f, 0.739920095f, - -0.673829000f, 0.738887324f, - -0.674961646f, 0.737852815f, - -0.676092704f, 0.736816569f, - -0.677222170f, 0.735778589f, - -0.678350043f, 0.734738878f, - -0.679476320f, 0.733697438f, - -0.680600998f, 0.732654272f, - -0.681724074f, 0.731609381f, - -0.682845546f, 0.730562769f, - -0.683965412f, 0.729514438f, - -0.685083668f, 0.728464390f, - -0.686200312f, 0.727412629f, - -0.687315341f, 0.726359155f, - -0.688428753f, 0.725303972f, - -0.689540545f, 0.724247083f, - -0.690650714f, 0.723188489f, - -0.691759258f, 0.722128194f, - -0.692866175f, 0.721066199f, - -0.693971461f, 0.720002508f, - -0.695075114f, 0.718937122f, - -0.696177131f, 0.717870045f, - -0.697277511f, 0.716801279f, - -0.698376249f, 0.715730825f, - -0.699473345f, 0.714658688f, - -0.700568794f, 0.713584869f, - -0.701662595f, 0.712509371f, - -0.702754744f, 0.711432196f, - -0.703845241f, 0.710353347f, - -0.704934080f, 0.709272826f, - -0.706021261f, 0.708190637f, - -0.707106781f, 0.707106781f, - -0.708190637f, 0.706021261f, - -0.709272826f, 0.704934080f, - -0.710353347f, 0.703845241f, - -0.711432196f, 0.702754744f, - -0.712509371f, 0.701662595f, - -0.713584869f, 0.700568794f, - -0.714658688f, 0.699473345f, - -0.715730825f, 0.698376249f, - -0.716801279f, 0.697277511f, - -0.717870045f, 0.696177131f, - -0.718937122f, 0.695075114f, - -0.720002508f, 0.693971461f, - -0.721066199f, 0.692866175f, - -0.722128194f, 0.691759258f, - -0.723188489f, 0.690650714f, - -0.724247083f, 0.689540545f, - -0.725303972f, 0.688428753f, - -0.726359155f, 0.687315341f, - -0.727412629f, 0.686200312f, - -0.728464390f, 0.685083668f, - -0.729514438f, 0.683965412f, - -0.730562769f, 0.682845546f, - -0.731609381f, 0.681724074f, - -0.732654272f, 0.680600998f, - -0.733697438f, 0.679476320f, - -0.734738878f, 0.678350043f, - -0.735778589f, 0.677222170f, - -0.736816569f, 0.676092704f, - -0.737852815f, 0.674961646f, - -0.738887324f, 0.673829000f, - -0.739920095f, 0.672694769f, - -0.740951125f, 0.671558955f, - -0.741980412f, 0.670421560f, - -0.743007952f, 0.669282588f, - -0.744033744f, 0.668142041f, - -0.745057785f, 0.666999922f, - -0.746080074f, 0.665856234f, - -0.747100606f, 0.664710978f, - -0.748119380f, 0.663564159f, - -0.749136395f, 0.662415778f, - -0.750151646f, 0.661265838f, - -0.751165132f, 0.660114342f, - -0.752176850f, 0.658961293f, - -0.753186799f, 0.657806693f, - -0.754194975f, 0.656650546f, - -0.755201377f, 0.655492853f, - -0.756206001f, 0.654333618f, - -0.757208847f, 0.653172843f, - -0.758209910f, 0.652010531f, - -0.759209189f, 0.650846685f, - -0.760206682f, 0.649681307f, - -0.761202385f, 0.648514401f, - -0.762196298f, 0.647345969f, - -0.763188417f, 0.646176013f, - -0.764178741f, 0.645004537f, - -0.765167266f, 0.643831543f, - -0.766153990f, 0.642657034f, - -0.767138912f, 0.641481013f, - -0.768122029f, 0.640303482f, - -0.769103338f, 0.639124445f, - -0.770082837f, 0.637943904f, - -0.771060524f, 0.636761861f, - -0.772036397f, 0.635578320f, - -0.773010453f, 0.634393284f, - -0.773982691f, 0.633206755f, - -0.774953107f, 0.632018736f, - -0.775921699f, 0.630829230f, - -0.776888466f, 0.629638239f, - -0.777853404f, 0.628445767f, - -0.778816512f, 0.627251815f, - -0.779777788f, 0.626056388f, - -0.780737229f, 0.624859488f, - -0.781694832f, 0.623661118f, - -0.782650596f, 0.622461279f, - -0.783604519f, 0.621259977f, - -0.784556597f, 0.620057212f, - -0.785506830f, 0.618852988f, - -0.786455214f, 0.617647308f, - -0.787401747f, 0.616440175f, - -0.788346428f, 0.615231591f, - -0.789289253f, 0.614021559f, - -0.790230221f, 0.612810082f, - -0.791169330f, 0.611597164f, - -0.792106577f, 0.610382806f, - -0.793041960f, 0.609167012f, - -0.793975478f, 0.607949785f, - -0.794907126f, 0.606731127f, - -0.795836905f, 0.605511041f, - -0.796764810f, 0.604289531f, - -0.797690841f, 0.603066599f, - -0.798614995f, 0.601842247f, - -0.799537269f, 0.600616479f, - -0.800457662f, 0.599389298f, - -0.801376172f, 0.598160707f, - -0.802292796f, 0.596930708f, - -0.803207531f, 0.595699304f, - -0.804120377f, 0.594466499f, - -0.805031331f, 0.593232295f, - -0.805940391f, 0.591996695f, - -0.806847554f, 0.590759702f, - -0.807752818f, 0.589521319f, - -0.808656182f, 0.588281548f, - -0.809557642f, 0.587040394f, - -0.810457198f, 0.585797857f, - -0.811354847f, 0.584553943f, - -0.812250587f, 0.583308653f, - -0.813144415f, 0.582061990f, - -0.814036330f, 0.580813958f, - -0.814926329f, 0.579564559f, - -0.815814411f, 0.578313796f, - -0.816700573f, 0.577061673f, - -0.817584813f, 0.575808191f, - -0.818467130f, 0.574553355f, - -0.819347520f, 0.573297167f, - -0.820225983f, 0.572039629f, - -0.821102515f, 0.570780746f, - -0.821977115f, 0.569520519f, - -0.822849781f, 0.568258953f, - -0.823720511f, 0.566996049f, - -0.824589303f, 0.565731811f, - -0.825456154f, 0.564466242f, - -0.826321063f, 0.563199344f, - -0.827184027f, 0.561931121f, - -0.828045045f, 0.560661576f, - -0.828904115f, 0.559390712f, - -0.829761234f, 0.558118531f, - -0.830616400f, 0.556845037f, - -0.831469612f, 0.555570233f, - -0.832320868f, 0.554294121f, - -0.833170165f, 0.553016706f, - -0.834017501f, 0.551737988f, - -0.834862875f, 0.550457973f, - -0.835706284f, 0.549176662f, - -0.836547727f, 0.547894059f, - -0.837387202f, 0.546610167f, - -0.838224706f, 0.545324988f, - -0.839060237f, 0.544038527f, - -0.839893794f, 0.542750785f, - -0.840725375f, 0.541461766f, - -0.841554977f, 0.540171473f, - -0.842382600f, 0.538879909f, - -0.843208240f, 0.537587076f, - -0.844031895f, 0.536292979f, - -0.844853565f, 0.534997620f, - -0.845673247f, 0.533701002f, - -0.846490939f, 0.532403128f, - -0.847306639f, 0.531104001f, - -0.848120345f, 0.529803625f, - -0.848932055f, 0.528502002f, - -0.849741768f, 0.527199135f, - -0.850549481f, 0.525895027f, - -0.851355193f, 0.524589683f, - -0.852158902f, 0.523283103f, - -0.852960605f, 0.521975293f, - -0.853760301f, 0.520666254f, - -0.854557988f, 0.519355990f, - -0.855353665f, 0.518044504f, - -0.856147328f, 0.516731799f, - -0.856938977f, 0.515417878f, - -0.857728610f, 0.514102744f, - -0.858516224f, 0.512786401f, - -0.859301818f, 0.511468850f, - -0.860085390f, 0.510150097f, - -0.860866939f, 0.508830143f, - -0.861646461f, 0.507508991f, - -0.862423956f, 0.506186645f, - -0.863199422f, 0.504863109f, - -0.863972856f, 0.503538384f, - -0.864744258f, 0.502212474f, - -0.865513624f, 0.500885383f, - -0.866280954f, 0.499557113f, - -0.867046246f, 0.498227667f, - -0.867809497f, 0.496897049f, - -0.868570706f, 0.495565262f, - -0.869329871f, 0.494232309f, - -0.870086991f, 0.492898192f, - -0.870842063f, 0.491562916f, - -0.871595087f, 0.490226483f, - -0.872346059f, 0.488888897f, - -0.873094978f, 0.487550160f, - -0.873841843f, 0.486210276f, - -0.874586652f, 0.484869248f, - -0.875329403f, 0.483527079f, - -0.876070094f, 0.482183772f, - -0.876808724f, 0.480839331f, - -0.877545290f, 0.479493758f, - -0.878279792f, 0.478147056f, - -0.879012226f, 0.476799230f, - -0.879742593f, 0.475450282f, - -0.880470889f, 0.474100215f, - -0.881197113f, 0.472749032f, - -0.881921264f, 0.471396737f, - -0.882643340f, 0.470043332f, - -0.883363339f, 0.468688822f, - -0.884081259f, 0.467333209f, - -0.884797098f, 0.465976496f, - -0.885510856f, 0.464618686f, - -0.886222530f, 0.463259784f, - -0.886932119f, 0.461899791f, - -0.887639620f, 0.460538711f, - -0.888345033f, 0.459176548f, - -0.889048356f, 0.457813304f, - -0.889749586f, 0.456448982f, - -0.890448723f, 0.455083587f, - -0.891145765f, 0.453717121f, - -0.891840709f, 0.452349587f, - -0.892533555f, 0.450980989f, - -0.893224301f, 0.449611330f, - -0.893912945f, 0.448240612f, - -0.894599486f, 0.446868840f, - -0.895283921f, 0.445496017f, - -0.895966250f, 0.444122145f, - -0.896646470f, 0.442747228f, - -0.897324581f, 0.441371269f, - -0.898000580f, 0.439994271f, - -0.898674466f, 0.438616239f, - -0.899346237f, 0.437237174f, - -0.900015892f, 0.435857080f, - -0.900683429f, 0.434475961f, - -0.901348847f, 0.433093819f, - -0.902012144f, 0.431710658f, - -0.902673318f, 0.430326481f, - -0.903332368f, 0.428941292f, - -0.903989293f, 0.427555093f, - -0.904644091f, 0.426167889f, - -0.905296759f, 0.424779681f, - -0.905947298f, 0.423390474f, - -0.906595705f, 0.422000271f, - -0.907241978f, 0.420609074f, - -0.907886116f, 0.419216888f, - -0.908528119f, 0.417823716f, - -0.909167983f, 0.416429560f, - -0.909805708f, 0.415034424f, - -0.910441292f, 0.413638312f, - -0.911074734f, 0.412241227f, - -0.911706032f, 0.410843171f, - -0.912335185f, 0.409444149f, - -0.912962190f, 0.408044163f, - -0.913587048f, 0.406643217f, - -0.914209756f, 0.405241314f, - -0.914830312f, 0.403838458f, - -0.915448716f, 0.402434651f, - -0.916064966f, 0.401029897f, - -0.916679060f, 0.399624200f, - -0.917290997f, 0.398217562f, - -0.917900776f, 0.396809987f, - -0.918508394f, 0.395401479f, - -0.919113852f, 0.393992040f, - -0.919717146f, 0.392581674f, - -0.920318277f, 0.391170384f, - -0.920917242f, 0.389758174f, - -0.921514039f, 0.388345047f, - -0.922108669f, 0.386931006f, - -0.922701128f, 0.385516054f, - -0.923291417f, 0.384100195f, - -0.923879533f, 0.382683432f, - -0.924465474f, 0.381265769f, - -0.925049241f, 0.379847209f, - -0.925630831f, 0.378427755f, - -0.926210242f, 0.377007410f, - -0.926787474f, 0.375586178f, - -0.927362526f, 0.374164063f, - -0.927935395f, 0.372741067f, - -0.928506080f, 0.371317194f, - -0.929074581f, 0.369892447f, - -0.929640896f, 0.368466830f, - -0.930205023f, 0.367040346f, - -0.930766961f, 0.365612998f, - -0.931326709f, 0.364184790f, - -0.931884266f, 0.362755724f, - -0.932439629f, 0.361325806f, - -0.932992799f, 0.359895037f, - -0.933543773f, 0.358463421f, - -0.934092550f, 0.357030961f, - -0.934639130f, 0.355597662f, - -0.935183510f, 0.354163525f, - -0.935725689f, 0.352728556f, - -0.936265667f, 0.351292756f, - -0.936803442f, 0.349856130f, - -0.937339012f, 0.348418680f, - -0.937872376f, 0.346980411f, - -0.938403534f, 0.345541325f, - -0.938932484f, 0.344101426f, - -0.939459224f, 0.342660717f, - -0.939983753f, 0.341219202f, - -0.940506071f, 0.339776884f, - -0.941026175f, 0.338333767f, - -0.941544065f, 0.336889853f, - -0.942059740f, 0.335445147f, - -0.942573198f, 0.333999651f, - -0.943084437f, 0.332553370f, - -0.943593458f, 0.331106306f, - -0.944100258f, 0.329658463f, - -0.944604837f, 0.328209844f, - -0.945107193f, 0.326760452f, - -0.945607325f, 0.325310292f, - -0.946105232f, 0.323859367f, - -0.946600913f, 0.322407679f, - -0.947094366f, 0.320955232f, - -0.947585591f, 0.319502031f, - -0.948074586f, 0.318048077f, - -0.948561350f, 0.316593376f, - -0.949045882f, 0.315137929f, - -0.949528181f, 0.313681740f, - -0.950008245f, 0.312224814f, - -0.950486074f, 0.310767153f, - -0.950961666f, 0.309308760f, - -0.951435021f, 0.307849640f, - -0.951906137f, 0.306389795f, - -0.952375013f, 0.304929230f, - -0.952841648f, 0.303467947f, - -0.953306040f, 0.302005949f, - -0.953768190f, 0.300543241f, - -0.954228095f, 0.299079826f, - -0.954685755f, 0.297615707f, - -0.955141168f, 0.296150888f, - -0.955594334f, 0.294685372f, - -0.956045251f, 0.293219163f, - -0.956493919f, 0.291752263f, - -0.956940336f, 0.290284677f, - -0.957384501f, 0.288816408f, - -0.957826413f, 0.287347460f, - -0.958266071f, 0.285877835f, - -0.958703475f, 0.284407537f, - -0.959138622f, 0.282936570f, - -0.959571513f, 0.281464938f, - -0.960002146f, 0.279992643f, - -0.960430519f, 0.278519689f, - -0.960856633f, 0.277046080f, - -0.961280486f, 0.275571819f, - -0.961702077f, 0.274096910f, - -0.962121404f, 0.272621355f, - -0.962538468f, 0.271145160f, - -0.962953267f, 0.269668326f, - -0.963365800f, 0.268190857f, - -0.963776066f, 0.266712757f, - -0.964184064f, 0.265234030f, - -0.964589793f, 0.263754679f, - -0.964993253f, 0.262274707f, - -0.965394442f, 0.260794118f, - -0.965793359f, 0.259312915f, - -0.966190003f, 0.257831102f, - -0.966584374f, 0.256348682f, - -0.966976471f, 0.254865660f, - -0.967366292f, 0.253382037f, - -0.967753837f, 0.251897818f, - -0.968139105f, 0.250413007f, - -0.968522094f, 0.248927606f, - -0.968902805f, 0.247441619f, - -0.969281235f, 0.245955050f, - -0.969657385f, 0.244467903f, - -0.970031253f, 0.242980180f, - -0.970402839f, 0.241491885f, - -0.970772141f, 0.240003022f, - -0.971139158f, 0.238513595f, - -0.971503891f, 0.237023606f, - -0.971866337f, 0.235533059f, - -0.972226497f, 0.234041959f, - -0.972584369f, 0.232550307f, - -0.972939952f, 0.231058108f, - -0.973293246f, 0.229565366f, - -0.973644250f, 0.228072083f, - -0.973992962f, 0.226578264f, - -0.974339383f, 0.225083911f, - -0.974683511f, 0.223589029f, - -0.975025345f, 0.222093621f, - -0.975364885f, 0.220597690f, - -0.975702130f, 0.219101240f, - -0.976037079f, 0.217604275f, - -0.976369731f, 0.216106797f, - -0.976700086f, 0.214608811f, - -0.977028143f, 0.213110320f, - -0.977353900f, 0.211611327f, - -0.977677358f, 0.210111837f, - -0.977998515f, 0.208611852f, - -0.978317371f, 0.207111376f, - -0.978633924f, 0.205610413f, - -0.978948175f, 0.204108966f, - -0.979260123f, 0.202607039f, - -0.979569766f, 0.201104635f, - -0.979877104f, 0.199601758f, - -0.980182136f, 0.198098411f, - -0.980484862f, 0.196594598f, - -0.980785280f, 0.195090322f, - -0.981083391f, 0.193585587f, - -0.981379193f, 0.192080397f, - -0.981672686f, 0.190574755f, - -0.981963869f, 0.189068664f, - -0.982252741f, 0.187562129f, - -0.982539302f, 0.186055152f, - -0.982823551f, 0.184547737f, - -0.983105487f, 0.183039888f, - -0.983385110f, 0.181531608f, - -0.983662419f, 0.180022901f, - -0.983937413f, 0.178513771f, - -0.984210092f, 0.177004220f, - -0.984480455f, 0.175494253f, - -0.984748502f, 0.173983873f, - -0.985014231f, 0.172473084f, - -0.985277642f, 0.170961889f, - -0.985538735f, 0.169450291f, - -0.985797509f, 0.167938295f, - -0.986053963f, 0.166425904f, - -0.986308097f, 0.164913120f, - -0.986559910f, 0.163399949f, - -0.986809402f, 0.161886394f, - -0.987056571f, 0.160372457f, - -0.987301418f, 0.158858143f, - -0.987543942f, 0.157343456f, - -0.987784142f, 0.155828398f, - -0.988022017f, 0.154312973f, - -0.988257568f, 0.152797185f, - -0.988490793f, 0.151281038f, - -0.988721692f, 0.149764535f, - -0.988950265f, 0.148247679f, - -0.989176510f, 0.146730474f, - -0.989400428f, 0.145212925f, - -0.989622017f, 0.143695033f, - -0.989841278f, 0.142176804f, - -0.990058210f, 0.140658239f, - -0.990272812f, 0.139139344f, - -0.990485084f, 0.137620122f, - -0.990695025f, 0.136100575f, - -0.990902635f, 0.134580709f, - -0.991107914f, 0.133060525f, - -0.991310860f, 0.131540029f, - -0.991511473f, 0.130019223f, - -0.991709754f, 0.128498111f, - -0.991905700f, 0.126976696f, - -0.992099313f, 0.125454983f, - -0.992290591f, 0.123932975f, - -0.992479535f, 0.122410675f, - -0.992666142f, 0.120888087f, - -0.992850414f, 0.119365215f, - -0.993032350f, 0.117842062f, - -0.993211949f, 0.116318631f, - -0.993389211f, 0.114794927f, - -0.993564136f, 0.113270952f, - -0.993736722f, 0.111746711f, - -0.993906970f, 0.110222207f, - -0.994074879f, 0.108697444f, - -0.994240449f, 0.107172425f, - -0.994403680f, 0.105647154f, - -0.994564571f, 0.104121634f, - -0.994723121f, 0.102595869f, - -0.994879331f, 0.101069863f, - -0.995033199f, 0.099543619f, - -0.995184727f, 0.098017140f, - -0.995333912f, 0.096490431f, - -0.995480755f, 0.094963495f, - -0.995625256f, 0.093436336f, - -0.995767414f, 0.091908956f, - -0.995907229f, 0.090381361f, - -0.996044701f, 0.088853553f, - -0.996179829f, 0.087325535f, - -0.996312612f, 0.085797312f, - -0.996443051f, 0.084268888f, - -0.996571146f, 0.082740265f, - -0.996696895f, 0.081211447f, - -0.996820299f, 0.079682438f, - -0.996941358f, 0.078153242f, - -0.997060070f, 0.076623861f, - -0.997176437f, 0.075094301f, - -0.997290457f, 0.073564564f, - -0.997402130f, 0.072034653f, - -0.997511456f, 0.070504573f, - -0.997618435f, 0.068974328f, - -0.997723067f, 0.067443920f, - -0.997825350f, 0.065913353f, - -0.997925286f, 0.064382631f, - -0.998022874f, 0.062851758f, - -0.998118113f, 0.061320736f, - -0.998211003f, 0.059789571f, - -0.998301545f, 0.058258265f, - -0.998389737f, 0.056726821f, - -0.998475581f, 0.055195244f, - -0.998559074f, 0.053663538f, - -0.998640218f, 0.052131705f, - -0.998719012f, 0.050599749f, - -0.998795456f, 0.049067674f, - -0.998869550f, 0.047535484f, - -0.998941293f, 0.046003182f, - -0.999010686f, 0.044470772f, - -0.999077728f, 0.042938257f, - -0.999142419f, 0.041405641f, - -0.999204759f, 0.039872928f, - -0.999264747f, 0.038340120f, - -0.999322385f, 0.036807223f, - -0.999377670f, 0.035274239f, - -0.999430605f, 0.033741172f, - -0.999481187f, 0.032208025f, - -0.999529418f, 0.030674803f, - -0.999575296f, 0.029141509f, - -0.999618822f, 0.027608146f, - -0.999659997f, 0.026074718f, - -0.999698819f, 0.024541229f, - -0.999735288f, 0.023007681f, - -0.999769405f, 0.021474080f, - -0.999801170f, 0.019940429f, - -0.999830582f, 0.018406730f, - -0.999857641f, 0.016872988f, - -0.999882347f, 0.015339206f, - -0.999904701f, 0.013805389f, - -0.999924702f, 0.012271538f, - -0.999942350f, 0.010737659f, - -0.999957645f, 0.009203755f, - -0.999970586f, 0.007669829f, - -0.999981175f, 0.006135885f, - -0.999989411f, 0.004601926f, - -0.999995294f, 0.003067957f, - -0.999998823f, 0.001533980f, - -1.000000000f, 0.000000000f, - -0.999998823f, -0.001533980f, - -0.999995294f, -0.003067957f, - -0.999989411f, -0.004601926f, - -0.999981175f, -0.006135885f, - -0.999970586f, -0.007669829f, - -0.999957645f, -0.009203755f, - -0.999942350f, -0.010737659f, - -0.999924702f, -0.012271538f, - -0.999904701f, -0.013805389f, - -0.999882347f, -0.015339206f, - -0.999857641f, -0.016872988f, - -0.999830582f, -0.018406730f, - -0.999801170f, -0.019940429f, - -0.999769405f, -0.021474080f, - -0.999735288f, -0.023007681f, - -0.999698819f, -0.024541229f, - -0.999659997f, -0.026074718f, - -0.999618822f, -0.027608146f, - -0.999575296f, -0.029141509f, - -0.999529418f, -0.030674803f, - -0.999481187f, -0.032208025f, - -0.999430605f, -0.033741172f, - -0.999377670f, -0.035274239f, - -0.999322385f, -0.036807223f, - -0.999264747f, -0.038340120f, - -0.999204759f, -0.039872928f, - -0.999142419f, -0.041405641f, - -0.999077728f, -0.042938257f, - -0.999010686f, -0.044470772f, - -0.998941293f, -0.046003182f, - -0.998869550f, -0.047535484f, - -0.998795456f, -0.049067674f, - -0.998719012f, -0.050599749f, - -0.998640218f, -0.052131705f, - -0.998559074f, -0.053663538f, - -0.998475581f, -0.055195244f, - -0.998389737f, -0.056726821f, - -0.998301545f, -0.058258265f, - -0.998211003f, -0.059789571f, - -0.998118113f, -0.061320736f, - -0.998022874f, -0.062851758f, - -0.997925286f, -0.064382631f, - -0.997825350f, -0.065913353f, - -0.997723067f, -0.067443920f, - -0.997618435f, -0.068974328f, - -0.997511456f, -0.070504573f, - -0.997402130f, -0.072034653f, - -0.997290457f, -0.073564564f, - -0.997176437f, -0.075094301f, - -0.997060070f, -0.076623861f, - -0.996941358f, -0.078153242f, - -0.996820299f, -0.079682438f, - -0.996696895f, -0.081211447f, - -0.996571146f, -0.082740265f, - -0.996443051f, -0.084268888f, - -0.996312612f, -0.085797312f, - -0.996179829f, -0.087325535f, - -0.996044701f, -0.088853553f, - -0.995907229f, -0.090381361f, - -0.995767414f, -0.091908956f, - -0.995625256f, -0.093436336f, - -0.995480755f, -0.094963495f, - -0.995333912f, -0.096490431f, - -0.995184727f, -0.098017140f, - -0.995033199f, -0.099543619f, - -0.994879331f, -0.101069863f, - -0.994723121f, -0.102595869f, - -0.994564571f, -0.104121634f, - -0.994403680f, -0.105647154f, - -0.994240449f, -0.107172425f, - -0.994074879f, -0.108697444f, - -0.993906970f, -0.110222207f, - -0.993736722f, -0.111746711f, - -0.993564136f, -0.113270952f, - -0.993389211f, -0.114794927f, - -0.993211949f, -0.116318631f, - -0.993032350f, -0.117842062f, - -0.992850414f, -0.119365215f, - -0.992666142f, -0.120888087f, - -0.992479535f, -0.122410675f, - -0.992290591f, -0.123932975f, - -0.992099313f, -0.125454983f, - -0.991905700f, -0.126976696f, - -0.991709754f, -0.128498111f, - -0.991511473f, -0.130019223f, - -0.991310860f, -0.131540029f, - -0.991107914f, -0.133060525f, - -0.990902635f, -0.134580709f, - -0.990695025f, -0.136100575f, - -0.990485084f, -0.137620122f, - -0.990272812f, -0.139139344f, - -0.990058210f, -0.140658239f, - -0.989841278f, -0.142176804f, - -0.989622017f, -0.143695033f, - -0.989400428f, -0.145212925f, - -0.989176510f, -0.146730474f, - -0.988950265f, -0.148247679f, - -0.988721692f, -0.149764535f, - -0.988490793f, -0.151281038f, - -0.988257568f, -0.152797185f, - -0.988022017f, -0.154312973f, - -0.987784142f, -0.155828398f, - -0.987543942f, -0.157343456f, - -0.987301418f, -0.158858143f, - -0.987056571f, -0.160372457f, - -0.986809402f, -0.161886394f, - -0.986559910f, -0.163399949f, - -0.986308097f, -0.164913120f, - -0.986053963f, -0.166425904f, - -0.985797509f, -0.167938295f, - -0.985538735f, -0.169450291f, - -0.985277642f, -0.170961889f, - -0.985014231f, -0.172473084f, - -0.984748502f, -0.173983873f, - -0.984480455f, -0.175494253f, - -0.984210092f, -0.177004220f, - -0.983937413f, -0.178513771f, - -0.983662419f, -0.180022901f, - -0.983385110f, -0.181531608f, - -0.983105487f, -0.183039888f, - -0.982823551f, -0.184547737f, - -0.982539302f, -0.186055152f, - -0.982252741f, -0.187562129f, - -0.981963869f, -0.189068664f, - -0.981672686f, -0.190574755f, - -0.981379193f, -0.192080397f, - -0.981083391f, -0.193585587f, - -0.980785280f, -0.195090322f, - -0.980484862f, -0.196594598f, - -0.980182136f, -0.198098411f, - -0.979877104f, -0.199601758f, - -0.979569766f, -0.201104635f, - -0.979260123f, -0.202607039f, - -0.978948175f, -0.204108966f, - -0.978633924f, -0.205610413f, - -0.978317371f, -0.207111376f, - -0.977998515f, -0.208611852f, - -0.977677358f, -0.210111837f, - -0.977353900f, -0.211611327f, - -0.977028143f, -0.213110320f, - -0.976700086f, -0.214608811f, - -0.976369731f, -0.216106797f, - -0.976037079f, -0.217604275f, - -0.975702130f, -0.219101240f, - -0.975364885f, -0.220597690f, - -0.975025345f, -0.222093621f, - -0.974683511f, -0.223589029f, - -0.974339383f, -0.225083911f, - -0.973992962f, -0.226578264f, - -0.973644250f, -0.228072083f, - -0.973293246f, -0.229565366f, - -0.972939952f, -0.231058108f, - -0.972584369f, -0.232550307f, - -0.972226497f, -0.234041959f, - -0.971866337f, -0.235533059f, - -0.971503891f, -0.237023606f, - -0.971139158f, -0.238513595f, - -0.970772141f, -0.240003022f, - -0.970402839f, -0.241491885f, - -0.970031253f, -0.242980180f, - -0.969657385f, -0.244467903f, - -0.969281235f, -0.245955050f, - -0.968902805f, -0.247441619f, - -0.968522094f, -0.248927606f, - -0.968139105f, -0.250413007f, - -0.967753837f, -0.251897818f, - -0.967366292f, -0.253382037f, - -0.966976471f, -0.254865660f, - -0.966584374f, -0.256348682f, - -0.966190003f, -0.257831102f, - -0.965793359f, -0.259312915f, - -0.965394442f, -0.260794118f, - -0.964993253f, -0.262274707f, - -0.964589793f, -0.263754679f, - -0.964184064f, -0.265234030f, - -0.963776066f, -0.266712757f, - -0.963365800f, -0.268190857f, - -0.962953267f, -0.269668326f, - -0.962538468f, -0.271145160f, - -0.962121404f, -0.272621355f, - -0.961702077f, -0.274096910f, - -0.961280486f, -0.275571819f, - -0.960856633f, -0.277046080f, - -0.960430519f, -0.278519689f, - -0.960002146f, -0.279992643f, - -0.959571513f, -0.281464938f, - -0.959138622f, -0.282936570f, - -0.958703475f, -0.284407537f, - -0.958266071f, -0.285877835f, - -0.957826413f, -0.287347460f, - -0.957384501f, -0.288816408f, - -0.956940336f, -0.290284677f, - -0.956493919f, -0.291752263f, - -0.956045251f, -0.293219163f, - -0.955594334f, -0.294685372f, - -0.955141168f, -0.296150888f, - -0.954685755f, -0.297615707f, - -0.954228095f, -0.299079826f, - -0.953768190f, -0.300543241f, - -0.953306040f, -0.302005949f, - -0.952841648f, -0.303467947f, - -0.952375013f, -0.304929230f, - -0.951906137f, -0.306389795f, - -0.951435021f, -0.307849640f, - -0.950961666f, -0.309308760f, - -0.950486074f, -0.310767153f, - -0.950008245f, -0.312224814f, - -0.949528181f, -0.313681740f, - -0.949045882f, -0.315137929f, - -0.948561350f, -0.316593376f, - -0.948074586f, -0.318048077f, - -0.947585591f, -0.319502031f, - -0.947094366f, -0.320955232f, - -0.946600913f, -0.322407679f, - -0.946105232f, -0.323859367f, - -0.945607325f, -0.325310292f, - -0.945107193f, -0.326760452f, - -0.944604837f, -0.328209844f, - -0.944100258f, -0.329658463f, - -0.943593458f, -0.331106306f, - -0.943084437f, -0.332553370f, - -0.942573198f, -0.333999651f, - -0.942059740f, -0.335445147f, - -0.941544065f, -0.336889853f, - -0.941026175f, -0.338333767f, - -0.940506071f, -0.339776884f, - -0.939983753f, -0.341219202f, - -0.939459224f, -0.342660717f, - -0.938932484f, -0.344101426f, - -0.938403534f, -0.345541325f, - -0.937872376f, -0.346980411f, - -0.937339012f, -0.348418680f, - -0.936803442f, -0.349856130f, - -0.936265667f, -0.351292756f, - -0.935725689f, -0.352728556f, - -0.935183510f, -0.354163525f, - -0.934639130f, -0.355597662f, - -0.934092550f, -0.357030961f, - -0.933543773f, -0.358463421f, - -0.932992799f, -0.359895037f, - -0.932439629f, -0.361325806f, - -0.931884266f, -0.362755724f, - -0.931326709f, -0.364184790f, - -0.930766961f, -0.365612998f, - -0.930205023f, -0.367040346f, - -0.929640896f, -0.368466830f, - -0.929074581f, -0.369892447f, - -0.928506080f, -0.371317194f, - -0.927935395f, -0.372741067f, - -0.927362526f, -0.374164063f, - -0.926787474f, -0.375586178f, - -0.926210242f, -0.377007410f, - -0.925630831f, -0.378427755f, - -0.925049241f, -0.379847209f, - -0.924465474f, -0.381265769f, - -0.923879533f, -0.382683432f, - -0.923291417f, -0.384100195f, - -0.922701128f, -0.385516054f, - -0.922108669f, -0.386931006f, - -0.921514039f, -0.388345047f, - -0.920917242f, -0.389758174f, - -0.920318277f, -0.391170384f, - -0.919717146f, -0.392581674f, - -0.919113852f, -0.393992040f, - -0.918508394f, -0.395401479f, - -0.917900776f, -0.396809987f, - -0.917290997f, -0.398217562f, - -0.916679060f, -0.399624200f, - -0.916064966f, -0.401029897f, - -0.915448716f, -0.402434651f, - -0.914830312f, -0.403838458f, - -0.914209756f, -0.405241314f, - -0.913587048f, -0.406643217f, - -0.912962190f, -0.408044163f, - -0.912335185f, -0.409444149f, - -0.911706032f, -0.410843171f, - -0.911074734f, -0.412241227f, - -0.910441292f, -0.413638312f, - -0.909805708f, -0.415034424f, - -0.909167983f, -0.416429560f, - -0.908528119f, -0.417823716f, - -0.907886116f, -0.419216888f, - -0.907241978f, -0.420609074f, - -0.906595705f, -0.422000271f, - -0.905947298f, -0.423390474f, - -0.905296759f, -0.424779681f, - -0.904644091f, -0.426167889f, - -0.903989293f, -0.427555093f, - -0.903332368f, -0.428941292f, - -0.902673318f, -0.430326481f, - -0.902012144f, -0.431710658f, - -0.901348847f, -0.433093819f, - -0.900683429f, -0.434475961f, - -0.900015892f, -0.435857080f, - -0.899346237f, -0.437237174f, - -0.898674466f, -0.438616239f, - -0.898000580f, -0.439994271f, - -0.897324581f, -0.441371269f, - -0.896646470f, -0.442747228f, - -0.895966250f, -0.444122145f, - -0.895283921f, -0.445496017f, - -0.894599486f, -0.446868840f, - -0.893912945f, -0.448240612f, - -0.893224301f, -0.449611330f, - -0.892533555f, -0.450980989f, - -0.891840709f, -0.452349587f, - -0.891145765f, -0.453717121f, - -0.890448723f, -0.455083587f, - -0.889749586f, -0.456448982f, - -0.889048356f, -0.457813304f, - -0.888345033f, -0.459176548f, - -0.887639620f, -0.460538711f, - -0.886932119f, -0.461899791f, - -0.886222530f, -0.463259784f, - -0.885510856f, -0.464618686f, - -0.884797098f, -0.465976496f, - -0.884081259f, -0.467333209f, - -0.883363339f, -0.468688822f, - -0.882643340f, -0.470043332f, - -0.881921264f, -0.471396737f, - -0.881197113f, -0.472749032f, - -0.880470889f, -0.474100215f, - -0.879742593f, -0.475450282f, - -0.879012226f, -0.476799230f, - -0.878279792f, -0.478147056f, - -0.877545290f, -0.479493758f, - -0.876808724f, -0.480839331f, - -0.876070094f, -0.482183772f, - -0.875329403f, -0.483527079f, - -0.874586652f, -0.484869248f, - -0.873841843f, -0.486210276f, - -0.873094978f, -0.487550160f, - -0.872346059f, -0.488888897f, - -0.871595087f, -0.490226483f, - -0.870842063f, -0.491562916f, - -0.870086991f, -0.492898192f, - -0.869329871f, -0.494232309f, - -0.868570706f, -0.495565262f, - -0.867809497f, -0.496897049f, - -0.867046246f, -0.498227667f, - -0.866280954f, -0.499557113f, - -0.865513624f, -0.500885383f, - -0.864744258f, -0.502212474f, - -0.863972856f, -0.503538384f, - -0.863199422f, -0.504863109f, - -0.862423956f, -0.506186645f, - -0.861646461f, -0.507508991f, - -0.860866939f, -0.508830143f, - -0.860085390f, -0.510150097f, - -0.859301818f, -0.511468850f, - -0.858516224f, -0.512786401f, - -0.857728610f, -0.514102744f, - -0.856938977f, -0.515417878f, - -0.856147328f, -0.516731799f, - -0.855353665f, -0.518044504f, - -0.854557988f, -0.519355990f, - -0.853760301f, -0.520666254f, - -0.852960605f, -0.521975293f, - -0.852158902f, -0.523283103f, - -0.851355193f, -0.524589683f, - -0.850549481f, -0.525895027f, - -0.849741768f, -0.527199135f, - -0.848932055f, -0.528502002f, - -0.848120345f, -0.529803625f, - -0.847306639f, -0.531104001f, - -0.846490939f, -0.532403128f, - -0.845673247f, -0.533701002f, - -0.844853565f, -0.534997620f, - -0.844031895f, -0.536292979f, - -0.843208240f, -0.537587076f, - -0.842382600f, -0.538879909f, - -0.841554977f, -0.540171473f, - -0.840725375f, -0.541461766f, - -0.839893794f, -0.542750785f, - -0.839060237f, -0.544038527f, - -0.838224706f, -0.545324988f, - -0.837387202f, -0.546610167f, - -0.836547727f, -0.547894059f, - -0.835706284f, -0.549176662f, - -0.834862875f, -0.550457973f, - -0.834017501f, -0.551737988f, - -0.833170165f, -0.553016706f, - -0.832320868f, -0.554294121f, - -0.831469612f, -0.555570233f, - -0.830616400f, -0.556845037f, - -0.829761234f, -0.558118531f, - -0.828904115f, -0.559390712f, - -0.828045045f, -0.560661576f, - -0.827184027f, -0.561931121f, - -0.826321063f, -0.563199344f, - -0.825456154f, -0.564466242f, - -0.824589303f, -0.565731811f, - -0.823720511f, -0.566996049f, - -0.822849781f, -0.568258953f, - -0.821977115f, -0.569520519f, - -0.821102515f, -0.570780746f, - -0.820225983f, -0.572039629f, - -0.819347520f, -0.573297167f, - -0.818467130f, -0.574553355f, - -0.817584813f, -0.575808191f, - -0.816700573f, -0.577061673f, - -0.815814411f, -0.578313796f, - -0.814926329f, -0.579564559f, - -0.814036330f, -0.580813958f, - -0.813144415f, -0.582061990f, - -0.812250587f, -0.583308653f, - -0.811354847f, -0.584553943f, - -0.810457198f, -0.585797857f, - -0.809557642f, -0.587040394f, - -0.808656182f, -0.588281548f, - -0.807752818f, -0.589521319f, - -0.806847554f, -0.590759702f, - -0.805940391f, -0.591996695f, - -0.805031331f, -0.593232295f, - -0.804120377f, -0.594466499f, - -0.803207531f, -0.595699304f, - -0.802292796f, -0.596930708f, - -0.801376172f, -0.598160707f, - -0.800457662f, -0.599389298f, - -0.799537269f, -0.600616479f, - -0.798614995f, -0.601842247f, - -0.797690841f, -0.603066599f, - -0.796764810f, -0.604289531f, - -0.795836905f, -0.605511041f, - -0.794907126f, -0.606731127f, - -0.793975478f, -0.607949785f, - -0.793041960f, -0.609167012f, - -0.792106577f, -0.610382806f, - -0.791169330f, -0.611597164f, - -0.790230221f, -0.612810082f, - -0.789289253f, -0.614021559f, - -0.788346428f, -0.615231591f, - -0.787401747f, -0.616440175f, - -0.786455214f, -0.617647308f, - -0.785506830f, -0.618852988f, - -0.784556597f, -0.620057212f, - -0.783604519f, -0.621259977f, - -0.782650596f, -0.622461279f, - -0.781694832f, -0.623661118f, - -0.780737229f, -0.624859488f, - -0.779777788f, -0.626056388f, - -0.778816512f, -0.627251815f, - -0.777853404f, -0.628445767f, - -0.776888466f, -0.629638239f, - -0.775921699f, -0.630829230f, - -0.774953107f, -0.632018736f, - -0.773982691f, -0.633206755f, - -0.773010453f, -0.634393284f, - -0.772036397f, -0.635578320f, - -0.771060524f, -0.636761861f, - -0.770082837f, -0.637943904f, - -0.769103338f, -0.639124445f, - -0.768122029f, -0.640303482f, - -0.767138912f, -0.641481013f, - -0.766153990f, -0.642657034f, - -0.765167266f, -0.643831543f, - -0.764178741f, -0.645004537f, - -0.763188417f, -0.646176013f, - -0.762196298f, -0.647345969f, - -0.761202385f, -0.648514401f, - -0.760206682f, -0.649681307f, - -0.759209189f, -0.650846685f, - -0.758209910f, -0.652010531f, - -0.757208847f, -0.653172843f, - -0.756206001f, -0.654333618f, - -0.755201377f, -0.655492853f, - -0.754194975f, -0.656650546f, - -0.753186799f, -0.657806693f, - -0.752176850f, -0.658961293f, - -0.751165132f, -0.660114342f, - -0.750151646f, -0.661265838f, - -0.749136395f, -0.662415778f, - -0.748119380f, -0.663564159f, - -0.747100606f, -0.664710978f, - -0.746080074f, -0.665856234f, - -0.745057785f, -0.666999922f, - -0.744033744f, -0.668142041f, - -0.743007952f, -0.669282588f, - -0.741980412f, -0.670421560f, - -0.740951125f, -0.671558955f, - -0.739920095f, -0.672694769f, - -0.738887324f, -0.673829000f, - -0.737852815f, -0.674961646f, - -0.736816569f, -0.676092704f, - -0.735778589f, -0.677222170f, - -0.734738878f, -0.678350043f, - -0.733697438f, -0.679476320f, - -0.732654272f, -0.680600998f, - -0.731609381f, -0.681724074f, - -0.730562769f, -0.682845546f, - -0.729514438f, -0.683965412f, - -0.728464390f, -0.685083668f, - -0.727412629f, -0.686200312f, - -0.726359155f, -0.687315341f, - -0.725303972f, -0.688428753f, - -0.724247083f, -0.689540545f, - -0.723188489f, -0.690650714f, - -0.722128194f, -0.691759258f, - -0.721066199f, -0.692866175f, - -0.720002508f, -0.693971461f, - -0.718937122f, -0.695075114f, - -0.717870045f, -0.696177131f, - -0.716801279f, -0.697277511f, - -0.715730825f, -0.698376249f, - -0.714658688f, -0.699473345f, - -0.713584869f, -0.700568794f, - -0.712509371f, -0.701662595f, - -0.711432196f, -0.702754744f, - -0.710353347f, -0.703845241f, - -0.709272826f, -0.704934080f, - -0.708190637f, -0.706021261f, - -0.707106781f, -0.707106781f, - -0.706021261f, -0.708190637f, - -0.704934080f, -0.709272826f, - -0.703845241f, -0.710353347f, - -0.702754744f, -0.711432196f, - -0.701662595f, -0.712509371f, - -0.700568794f, -0.713584869f, - -0.699473345f, -0.714658688f, - -0.698376249f, -0.715730825f, - -0.697277511f, -0.716801279f, - -0.696177131f, -0.717870045f, - -0.695075114f, -0.718937122f, - -0.693971461f, -0.720002508f, - -0.692866175f, -0.721066199f, - -0.691759258f, -0.722128194f, - -0.690650714f, -0.723188489f, - -0.689540545f, -0.724247083f, - -0.688428753f, -0.725303972f, - -0.687315341f, -0.726359155f, - -0.686200312f, -0.727412629f, - -0.685083668f, -0.728464390f, - -0.683965412f, -0.729514438f, - -0.682845546f, -0.730562769f, - -0.681724074f, -0.731609381f, - -0.680600998f, -0.732654272f, - -0.679476320f, -0.733697438f, - -0.678350043f, -0.734738878f, - -0.677222170f, -0.735778589f, - -0.676092704f, -0.736816569f, - -0.674961646f, -0.737852815f, - -0.673829000f, -0.738887324f, - -0.672694769f, -0.739920095f, - -0.671558955f, -0.740951125f, - -0.670421560f, -0.741980412f, - -0.669282588f, -0.743007952f, - -0.668142041f, -0.744033744f, - -0.666999922f, -0.745057785f, - -0.665856234f, -0.746080074f, - -0.664710978f, -0.747100606f, - -0.663564159f, -0.748119380f, - -0.662415778f, -0.749136395f, - -0.661265838f, -0.750151646f, - -0.660114342f, -0.751165132f, - -0.658961293f, -0.752176850f, - -0.657806693f, -0.753186799f, - -0.656650546f, -0.754194975f, - -0.655492853f, -0.755201377f, - -0.654333618f, -0.756206001f, - -0.653172843f, -0.757208847f, - -0.652010531f, -0.758209910f, - -0.650846685f, -0.759209189f, - -0.649681307f, -0.760206682f, - -0.648514401f, -0.761202385f, - -0.647345969f, -0.762196298f, - -0.646176013f, -0.763188417f, - -0.645004537f, -0.764178741f, - -0.643831543f, -0.765167266f, - -0.642657034f, -0.766153990f, - -0.641481013f, -0.767138912f, - -0.640303482f, -0.768122029f, - -0.639124445f, -0.769103338f, - -0.637943904f, -0.770082837f, - -0.636761861f, -0.771060524f, - -0.635578320f, -0.772036397f, - -0.634393284f, -0.773010453f, - -0.633206755f, -0.773982691f, - -0.632018736f, -0.774953107f, - -0.630829230f, -0.775921699f, - -0.629638239f, -0.776888466f, - -0.628445767f, -0.777853404f, - -0.627251815f, -0.778816512f, - -0.626056388f, -0.779777788f, - -0.624859488f, -0.780737229f, - -0.623661118f, -0.781694832f, - -0.622461279f, -0.782650596f, - -0.621259977f, -0.783604519f, - -0.620057212f, -0.784556597f, - -0.618852988f, -0.785506830f, - -0.617647308f, -0.786455214f, - -0.616440175f, -0.787401747f, - -0.615231591f, -0.788346428f, - -0.614021559f, -0.789289253f, - -0.612810082f, -0.790230221f, - -0.611597164f, -0.791169330f, - -0.610382806f, -0.792106577f, - -0.609167012f, -0.793041960f, - -0.607949785f, -0.793975478f, - -0.606731127f, -0.794907126f, - -0.605511041f, -0.795836905f, - -0.604289531f, -0.796764810f, - -0.603066599f, -0.797690841f, - -0.601842247f, -0.798614995f, - -0.600616479f, -0.799537269f, - -0.599389298f, -0.800457662f, - -0.598160707f, -0.801376172f, - -0.596930708f, -0.802292796f, - -0.595699304f, -0.803207531f, - -0.594466499f, -0.804120377f, - -0.593232295f, -0.805031331f, - -0.591996695f, -0.805940391f, - -0.590759702f, -0.806847554f, - -0.589521319f, -0.807752818f, - -0.588281548f, -0.808656182f, - -0.587040394f, -0.809557642f, - -0.585797857f, -0.810457198f, - -0.584553943f, -0.811354847f, - -0.583308653f, -0.812250587f, - -0.582061990f, -0.813144415f, - -0.580813958f, -0.814036330f, - -0.579564559f, -0.814926329f, - -0.578313796f, -0.815814411f, - -0.577061673f, -0.816700573f, - -0.575808191f, -0.817584813f, - -0.574553355f, -0.818467130f, - -0.573297167f, -0.819347520f, - -0.572039629f, -0.820225983f, - -0.570780746f, -0.821102515f, - -0.569520519f, -0.821977115f, - -0.568258953f, -0.822849781f, - -0.566996049f, -0.823720511f, - -0.565731811f, -0.824589303f, - -0.564466242f, -0.825456154f, - -0.563199344f, -0.826321063f, - -0.561931121f, -0.827184027f, - -0.560661576f, -0.828045045f, - -0.559390712f, -0.828904115f, - -0.558118531f, -0.829761234f, - -0.556845037f, -0.830616400f, - -0.555570233f, -0.831469612f, - -0.554294121f, -0.832320868f, - -0.553016706f, -0.833170165f, - -0.551737988f, -0.834017501f, - -0.550457973f, -0.834862875f, - -0.549176662f, -0.835706284f, - -0.547894059f, -0.836547727f, - -0.546610167f, -0.837387202f, - -0.545324988f, -0.838224706f, - -0.544038527f, -0.839060237f, - -0.542750785f, -0.839893794f, - -0.541461766f, -0.840725375f, - -0.540171473f, -0.841554977f, - -0.538879909f, -0.842382600f, - -0.537587076f, -0.843208240f, - -0.536292979f, -0.844031895f, - -0.534997620f, -0.844853565f, - -0.533701002f, -0.845673247f, - -0.532403128f, -0.846490939f, - -0.531104001f, -0.847306639f, - -0.529803625f, -0.848120345f, - -0.528502002f, -0.848932055f, - -0.527199135f, -0.849741768f, - -0.525895027f, -0.850549481f, - -0.524589683f, -0.851355193f, - -0.523283103f, -0.852158902f, - -0.521975293f, -0.852960605f, - -0.520666254f, -0.853760301f, - -0.519355990f, -0.854557988f, - -0.518044504f, -0.855353665f, - -0.516731799f, -0.856147328f, - -0.515417878f, -0.856938977f, - -0.514102744f, -0.857728610f, - -0.512786401f, -0.858516224f, - -0.511468850f, -0.859301818f, - -0.510150097f, -0.860085390f, - -0.508830143f, -0.860866939f, - -0.507508991f, -0.861646461f, - -0.506186645f, -0.862423956f, - -0.504863109f, -0.863199422f, - -0.503538384f, -0.863972856f, - -0.502212474f, -0.864744258f, - -0.500885383f, -0.865513624f, - -0.499557113f, -0.866280954f, - -0.498227667f, -0.867046246f, - -0.496897049f, -0.867809497f, - -0.495565262f, -0.868570706f, - -0.494232309f, -0.869329871f, - -0.492898192f, -0.870086991f, - -0.491562916f, -0.870842063f, - -0.490226483f, -0.871595087f, - -0.488888897f, -0.872346059f, - -0.487550160f, -0.873094978f, - -0.486210276f, -0.873841843f, - -0.484869248f, -0.874586652f, - -0.483527079f, -0.875329403f, - -0.482183772f, -0.876070094f, - -0.480839331f, -0.876808724f, - -0.479493758f, -0.877545290f, - -0.478147056f, -0.878279792f, - -0.476799230f, -0.879012226f, - -0.475450282f, -0.879742593f, - -0.474100215f, -0.880470889f, - -0.472749032f, -0.881197113f, - -0.471396737f, -0.881921264f, - -0.470043332f, -0.882643340f, - -0.468688822f, -0.883363339f, - -0.467333209f, -0.884081259f, - -0.465976496f, -0.884797098f, - -0.464618686f, -0.885510856f, - -0.463259784f, -0.886222530f, - -0.461899791f, -0.886932119f, - -0.460538711f, -0.887639620f, - -0.459176548f, -0.888345033f, - -0.457813304f, -0.889048356f, - -0.456448982f, -0.889749586f, - -0.455083587f, -0.890448723f, - -0.453717121f, -0.891145765f, - -0.452349587f, -0.891840709f, - -0.450980989f, -0.892533555f, - -0.449611330f, -0.893224301f, - -0.448240612f, -0.893912945f, - -0.446868840f, -0.894599486f, - -0.445496017f, -0.895283921f, - -0.444122145f, -0.895966250f, - -0.442747228f, -0.896646470f, - -0.441371269f, -0.897324581f, - -0.439994271f, -0.898000580f, - -0.438616239f, -0.898674466f, - -0.437237174f, -0.899346237f, - -0.435857080f, -0.900015892f, - -0.434475961f, -0.900683429f, - -0.433093819f, -0.901348847f, - -0.431710658f, -0.902012144f, - -0.430326481f, -0.902673318f, - -0.428941292f, -0.903332368f, - -0.427555093f, -0.903989293f, - -0.426167889f, -0.904644091f, - -0.424779681f, -0.905296759f, - -0.423390474f, -0.905947298f, - -0.422000271f, -0.906595705f, - -0.420609074f, -0.907241978f, - -0.419216888f, -0.907886116f, - -0.417823716f, -0.908528119f, - -0.416429560f, -0.909167983f, - -0.415034424f, -0.909805708f, - -0.413638312f, -0.910441292f, - -0.412241227f, -0.911074734f, - -0.410843171f, -0.911706032f, - -0.409444149f, -0.912335185f, - -0.408044163f, -0.912962190f, - -0.406643217f, -0.913587048f, - -0.405241314f, -0.914209756f, - -0.403838458f, -0.914830312f, - -0.402434651f, -0.915448716f, - -0.401029897f, -0.916064966f, - -0.399624200f, -0.916679060f, - -0.398217562f, -0.917290997f, - -0.396809987f, -0.917900776f, - -0.395401479f, -0.918508394f, - -0.393992040f, -0.919113852f, - -0.392581674f, -0.919717146f, - -0.391170384f, -0.920318277f, - -0.389758174f, -0.920917242f, - -0.388345047f, -0.921514039f, - -0.386931006f, -0.922108669f, - -0.385516054f, -0.922701128f, - -0.384100195f, -0.923291417f, - -0.382683432f, -0.923879533f, - -0.381265769f, -0.924465474f, - -0.379847209f, -0.925049241f, - -0.378427755f, -0.925630831f, - -0.377007410f, -0.926210242f, - -0.375586178f, -0.926787474f, - -0.374164063f, -0.927362526f, - -0.372741067f, -0.927935395f, - -0.371317194f, -0.928506080f, - -0.369892447f, -0.929074581f, - -0.368466830f, -0.929640896f, - -0.367040346f, -0.930205023f, - -0.365612998f, -0.930766961f, - -0.364184790f, -0.931326709f, - -0.362755724f, -0.931884266f, - -0.361325806f, -0.932439629f, - -0.359895037f, -0.932992799f, - -0.358463421f, -0.933543773f, - -0.357030961f, -0.934092550f, - -0.355597662f, -0.934639130f, - -0.354163525f, -0.935183510f, - -0.352728556f, -0.935725689f, - -0.351292756f, -0.936265667f, - -0.349856130f, -0.936803442f, - -0.348418680f, -0.937339012f, - -0.346980411f, -0.937872376f, - -0.345541325f, -0.938403534f, - -0.344101426f, -0.938932484f, - -0.342660717f, -0.939459224f, - -0.341219202f, -0.939983753f, - -0.339776884f, -0.940506071f, - -0.338333767f, -0.941026175f, - -0.336889853f, -0.941544065f, - -0.335445147f, -0.942059740f, - -0.333999651f, -0.942573198f, - -0.332553370f, -0.943084437f, - -0.331106306f, -0.943593458f, - -0.329658463f, -0.944100258f, - -0.328209844f, -0.944604837f, - -0.326760452f, -0.945107193f, - -0.325310292f, -0.945607325f, - -0.323859367f, -0.946105232f, - -0.322407679f, -0.946600913f, - -0.320955232f, -0.947094366f, - -0.319502031f, -0.947585591f, - -0.318048077f, -0.948074586f, - -0.316593376f, -0.948561350f, - -0.315137929f, -0.949045882f, - -0.313681740f, -0.949528181f, - -0.312224814f, -0.950008245f, - -0.310767153f, -0.950486074f, - -0.309308760f, -0.950961666f, - -0.307849640f, -0.951435021f, - -0.306389795f, -0.951906137f, - -0.304929230f, -0.952375013f, - -0.303467947f, -0.952841648f, - -0.302005949f, -0.953306040f, - -0.300543241f, -0.953768190f, - -0.299079826f, -0.954228095f, - -0.297615707f, -0.954685755f, - -0.296150888f, -0.955141168f, - -0.294685372f, -0.955594334f, - -0.293219163f, -0.956045251f, - -0.291752263f, -0.956493919f, - -0.290284677f, -0.956940336f, - -0.288816408f, -0.957384501f, - -0.287347460f, -0.957826413f, - -0.285877835f, -0.958266071f, - -0.284407537f, -0.958703475f, - -0.282936570f, -0.959138622f, - -0.281464938f, -0.959571513f, - -0.279992643f, -0.960002146f, - -0.278519689f, -0.960430519f, - -0.277046080f, -0.960856633f, - -0.275571819f, -0.961280486f, - -0.274096910f, -0.961702077f, - -0.272621355f, -0.962121404f, - -0.271145160f, -0.962538468f, - -0.269668326f, -0.962953267f, - -0.268190857f, -0.963365800f, - -0.266712757f, -0.963776066f, - -0.265234030f, -0.964184064f, - -0.263754679f, -0.964589793f, - -0.262274707f, -0.964993253f, - -0.260794118f, -0.965394442f, - -0.259312915f, -0.965793359f, - -0.257831102f, -0.966190003f, - -0.256348682f, -0.966584374f, - -0.254865660f, -0.966976471f, - -0.253382037f, -0.967366292f, - -0.251897818f, -0.967753837f, - -0.250413007f, -0.968139105f, - -0.248927606f, -0.968522094f, - -0.247441619f, -0.968902805f, - -0.245955050f, -0.969281235f, - -0.244467903f, -0.969657385f, - -0.242980180f, -0.970031253f, - -0.241491885f, -0.970402839f, - -0.240003022f, -0.970772141f, - -0.238513595f, -0.971139158f, - -0.237023606f, -0.971503891f, - -0.235533059f, -0.971866337f, - -0.234041959f, -0.972226497f, - -0.232550307f, -0.972584369f, - -0.231058108f, -0.972939952f, - -0.229565366f, -0.973293246f, - -0.228072083f, -0.973644250f, - -0.226578264f, -0.973992962f, - -0.225083911f, -0.974339383f, - -0.223589029f, -0.974683511f, - -0.222093621f, -0.975025345f, - -0.220597690f, -0.975364885f, - -0.219101240f, -0.975702130f, - -0.217604275f, -0.976037079f, - -0.216106797f, -0.976369731f, - -0.214608811f, -0.976700086f, - -0.213110320f, -0.977028143f, - -0.211611327f, -0.977353900f, - -0.210111837f, -0.977677358f, - -0.208611852f, -0.977998515f, - -0.207111376f, -0.978317371f, - -0.205610413f, -0.978633924f, - -0.204108966f, -0.978948175f, - -0.202607039f, -0.979260123f, - -0.201104635f, -0.979569766f, - -0.199601758f, -0.979877104f, - -0.198098411f, -0.980182136f, - -0.196594598f, -0.980484862f, - -0.195090322f, -0.980785280f, - -0.193585587f, -0.981083391f, - -0.192080397f, -0.981379193f, - -0.190574755f, -0.981672686f, - -0.189068664f, -0.981963869f, - -0.187562129f, -0.982252741f, - -0.186055152f, -0.982539302f, - -0.184547737f, -0.982823551f, - -0.183039888f, -0.983105487f, - -0.181531608f, -0.983385110f, - -0.180022901f, -0.983662419f, - -0.178513771f, -0.983937413f, - -0.177004220f, -0.984210092f, - -0.175494253f, -0.984480455f, - -0.173983873f, -0.984748502f, - -0.172473084f, -0.985014231f, - -0.170961889f, -0.985277642f, - -0.169450291f, -0.985538735f, - -0.167938295f, -0.985797509f, - -0.166425904f, -0.986053963f, - -0.164913120f, -0.986308097f, - -0.163399949f, -0.986559910f, - -0.161886394f, -0.986809402f, - -0.160372457f, -0.987056571f, - -0.158858143f, -0.987301418f, - -0.157343456f, -0.987543942f, - -0.155828398f, -0.987784142f, - -0.154312973f, -0.988022017f, - -0.152797185f, -0.988257568f, - -0.151281038f, -0.988490793f, - -0.149764535f, -0.988721692f, - -0.148247679f, -0.988950265f, - -0.146730474f, -0.989176510f, - -0.145212925f, -0.989400428f, - -0.143695033f, -0.989622017f, - -0.142176804f, -0.989841278f, - -0.140658239f, -0.990058210f, - -0.139139344f, -0.990272812f, - -0.137620122f, -0.990485084f, - -0.136100575f, -0.990695025f, - -0.134580709f, -0.990902635f, - -0.133060525f, -0.991107914f, - -0.131540029f, -0.991310860f, - -0.130019223f, -0.991511473f, - -0.128498111f, -0.991709754f, - -0.126976696f, -0.991905700f, - -0.125454983f, -0.992099313f, - -0.123932975f, -0.992290591f, - -0.122410675f, -0.992479535f, - -0.120888087f, -0.992666142f, - -0.119365215f, -0.992850414f, - -0.117842062f, -0.993032350f, - -0.116318631f, -0.993211949f, - -0.114794927f, -0.993389211f, - -0.113270952f, -0.993564136f, - -0.111746711f, -0.993736722f, - -0.110222207f, -0.993906970f, - -0.108697444f, -0.994074879f, - -0.107172425f, -0.994240449f, - -0.105647154f, -0.994403680f, - -0.104121634f, -0.994564571f, - -0.102595869f, -0.994723121f, - -0.101069863f, -0.994879331f, - -0.099543619f, -0.995033199f, - -0.098017140f, -0.995184727f, - -0.096490431f, -0.995333912f, - -0.094963495f, -0.995480755f, - -0.093436336f, -0.995625256f, - -0.091908956f, -0.995767414f, - -0.090381361f, -0.995907229f, - -0.088853553f, -0.996044701f, - -0.087325535f, -0.996179829f, - -0.085797312f, -0.996312612f, - -0.084268888f, -0.996443051f, - -0.082740265f, -0.996571146f, - -0.081211447f, -0.996696895f, - -0.079682438f, -0.996820299f, - -0.078153242f, -0.996941358f, - -0.076623861f, -0.997060070f, - -0.075094301f, -0.997176437f, - -0.073564564f, -0.997290457f, - -0.072034653f, -0.997402130f, - -0.070504573f, -0.997511456f, - -0.068974328f, -0.997618435f, - -0.067443920f, -0.997723067f, - -0.065913353f, -0.997825350f, - -0.064382631f, -0.997925286f, - -0.062851758f, -0.998022874f, - -0.061320736f, -0.998118113f, - -0.059789571f, -0.998211003f, - -0.058258265f, -0.998301545f, - -0.056726821f, -0.998389737f, - -0.055195244f, -0.998475581f, - -0.053663538f, -0.998559074f, - -0.052131705f, -0.998640218f, - -0.050599749f, -0.998719012f, - -0.049067674f, -0.998795456f, - -0.047535484f, -0.998869550f, - -0.046003182f, -0.998941293f, - -0.044470772f, -0.999010686f, - -0.042938257f, -0.999077728f, - -0.041405641f, -0.999142419f, - -0.039872928f, -0.999204759f, - -0.038340120f, -0.999264747f, - -0.036807223f, -0.999322385f, - -0.035274239f, -0.999377670f, - -0.033741172f, -0.999430605f, - -0.032208025f, -0.999481187f, - -0.030674803f, -0.999529418f, - -0.029141509f, -0.999575296f, - -0.027608146f, -0.999618822f, - -0.026074718f, -0.999659997f, - -0.024541229f, -0.999698819f, - -0.023007681f, -0.999735288f, - -0.021474080f, -0.999769405f, - -0.019940429f, -0.999801170f, - -0.018406730f, -0.999830582f, - -0.016872988f, -0.999857641f, - -0.015339206f, -0.999882347f, - -0.013805389f, -0.999904701f, - -0.012271538f, -0.999924702f, - -0.010737659f, -0.999942350f, - -0.009203755f, -0.999957645f, - -0.007669829f, -0.999970586f, - -0.006135885f, -0.999981175f, - -0.004601926f, -0.999989411f, - -0.003067957f, -0.999995294f, - -0.001533980f, -0.999998823f, - -0.000000000f, -1.000000000f, - 0.001533980f, -0.999998823f, - 0.003067957f, -0.999995294f, - 0.004601926f, -0.999989411f, - 0.006135885f, -0.999981175f, - 0.007669829f, -0.999970586f, - 0.009203755f, -0.999957645f, - 0.010737659f, -0.999942350f, - 0.012271538f, -0.999924702f, - 0.013805389f, -0.999904701f, - 0.015339206f, -0.999882347f, - 0.016872988f, -0.999857641f, - 0.018406730f, -0.999830582f, - 0.019940429f, -0.999801170f, - 0.021474080f, -0.999769405f, - 0.023007681f, -0.999735288f, - 0.024541229f, -0.999698819f, - 0.026074718f, -0.999659997f, - 0.027608146f, -0.999618822f, - 0.029141509f, -0.999575296f, - 0.030674803f, -0.999529418f, - 0.032208025f, -0.999481187f, - 0.033741172f, -0.999430605f, - 0.035274239f, -0.999377670f, - 0.036807223f, -0.999322385f, - 0.038340120f, -0.999264747f, - 0.039872928f, -0.999204759f, - 0.041405641f, -0.999142419f, - 0.042938257f, -0.999077728f, - 0.044470772f, -0.999010686f, - 0.046003182f, -0.998941293f, - 0.047535484f, -0.998869550f, - 0.049067674f, -0.998795456f, - 0.050599749f, -0.998719012f, - 0.052131705f, -0.998640218f, - 0.053663538f, -0.998559074f, - 0.055195244f, -0.998475581f, - 0.056726821f, -0.998389737f, - 0.058258265f, -0.998301545f, - 0.059789571f, -0.998211003f, - 0.061320736f, -0.998118113f, - 0.062851758f, -0.998022874f, - 0.064382631f, -0.997925286f, - 0.065913353f, -0.997825350f, - 0.067443920f, -0.997723067f, - 0.068974328f, -0.997618435f, - 0.070504573f, -0.997511456f, - 0.072034653f, -0.997402130f, - 0.073564564f, -0.997290457f, - 0.075094301f, -0.997176437f, - 0.076623861f, -0.997060070f, - 0.078153242f, -0.996941358f, - 0.079682438f, -0.996820299f, - 0.081211447f, -0.996696895f, - 0.082740265f, -0.996571146f, - 0.084268888f, -0.996443051f, - 0.085797312f, -0.996312612f, - 0.087325535f, -0.996179829f, - 0.088853553f, -0.996044701f, - 0.090381361f, -0.995907229f, - 0.091908956f, -0.995767414f, - 0.093436336f, -0.995625256f, - 0.094963495f, -0.995480755f, - 0.096490431f, -0.995333912f, - 0.098017140f, -0.995184727f, - 0.099543619f, -0.995033199f, - 0.101069863f, -0.994879331f, - 0.102595869f, -0.994723121f, - 0.104121634f, -0.994564571f, - 0.105647154f, -0.994403680f, - 0.107172425f, -0.994240449f, - 0.108697444f, -0.994074879f, - 0.110222207f, -0.993906970f, - 0.111746711f, -0.993736722f, - 0.113270952f, -0.993564136f, - 0.114794927f, -0.993389211f, - 0.116318631f, -0.993211949f, - 0.117842062f, -0.993032350f, - 0.119365215f, -0.992850414f, - 0.120888087f, -0.992666142f, - 0.122410675f, -0.992479535f, - 0.123932975f, -0.992290591f, - 0.125454983f, -0.992099313f, - 0.126976696f, -0.991905700f, - 0.128498111f, -0.991709754f, - 0.130019223f, -0.991511473f, - 0.131540029f, -0.991310860f, - 0.133060525f, -0.991107914f, - 0.134580709f, -0.990902635f, - 0.136100575f, -0.990695025f, - 0.137620122f, -0.990485084f, - 0.139139344f, -0.990272812f, - 0.140658239f, -0.990058210f, - 0.142176804f, -0.989841278f, - 0.143695033f, -0.989622017f, - 0.145212925f, -0.989400428f, - 0.146730474f, -0.989176510f, - 0.148247679f, -0.988950265f, - 0.149764535f, -0.988721692f, - 0.151281038f, -0.988490793f, - 0.152797185f, -0.988257568f, - 0.154312973f, -0.988022017f, - 0.155828398f, -0.987784142f, - 0.157343456f, -0.987543942f, - 0.158858143f, -0.987301418f, - 0.160372457f, -0.987056571f, - 0.161886394f, -0.986809402f, - 0.163399949f, -0.986559910f, - 0.164913120f, -0.986308097f, - 0.166425904f, -0.986053963f, - 0.167938295f, -0.985797509f, - 0.169450291f, -0.985538735f, - 0.170961889f, -0.985277642f, - 0.172473084f, -0.985014231f, - 0.173983873f, -0.984748502f, - 0.175494253f, -0.984480455f, - 0.177004220f, -0.984210092f, - 0.178513771f, -0.983937413f, - 0.180022901f, -0.983662419f, - 0.181531608f, -0.983385110f, - 0.183039888f, -0.983105487f, - 0.184547737f, -0.982823551f, - 0.186055152f, -0.982539302f, - 0.187562129f, -0.982252741f, - 0.189068664f, -0.981963869f, - 0.190574755f, -0.981672686f, - 0.192080397f, -0.981379193f, - 0.193585587f, -0.981083391f, - 0.195090322f, -0.980785280f, - 0.196594598f, -0.980484862f, - 0.198098411f, -0.980182136f, - 0.199601758f, -0.979877104f, - 0.201104635f, -0.979569766f, - 0.202607039f, -0.979260123f, - 0.204108966f, -0.978948175f, - 0.205610413f, -0.978633924f, - 0.207111376f, -0.978317371f, - 0.208611852f, -0.977998515f, - 0.210111837f, -0.977677358f, - 0.211611327f, -0.977353900f, - 0.213110320f, -0.977028143f, - 0.214608811f, -0.976700086f, - 0.216106797f, -0.976369731f, - 0.217604275f, -0.976037079f, - 0.219101240f, -0.975702130f, - 0.220597690f, -0.975364885f, - 0.222093621f, -0.975025345f, - 0.223589029f, -0.974683511f, - 0.225083911f, -0.974339383f, - 0.226578264f, -0.973992962f, - 0.228072083f, -0.973644250f, - 0.229565366f, -0.973293246f, - 0.231058108f, -0.972939952f, - 0.232550307f, -0.972584369f, - 0.234041959f, -0.972226497f, - 0.235533059f, -0.971866337f, - 0.237023606f, -0.971503891f, - 0.238513595f, -0.971139158f, - 0.240003022f, -0.970772141f, - 0.241491885f, -0.970402839f, - 0.242980180f, -0.970031253f, - 0.244467903f, -0.969657385f, - 0.245955050f, -0.969281235f, - 0.247441619f, -0.968902805f, - 0.248927606f, -0.968522094f, - 0.250413007f, -0.968139105f, - 0.251897818f, -0.967753837f, - 0.253382037f, -0.967366292f, - 0.254865660f, -0.966976471f, - 0.256348682f, -0.966584374f, - 0.257831102f, -0.966190003f, - 0.259312915f, -0.965793359f, - 0.260794118f, -0.965394442f, - 0.262274707f, -0.964993253f, - 0.263754679f, -0.964589793f, - 0.265234030f, -0.964184064f, - 0.266712757f, -0.963776066f, - 0.268190857f, -0.963365800f, - 0.269668326f, -0.962953267f, - 0.271145160f, -0.962538468f, - 0.272621355f, -0.962121404f, - 0.274096910f, -0.961702077f, - 0.275571819f, -0.961280486f, - 0.277046080f, -0.960856633f, - 0.278519689f, -0.960430519f, - 0.279992643f, -0.960002146f, - 0.281464938f, -0.959571513f, - 0.282936570f, -0.959138622f, - 0.284407537f, -0.958703475f, - 0.285877835f, -0.958266071f, - 0.287347460f, -0.957826413f, - 0.288816408f, -0.957384501f, - 0.290284677f, -0.956940336f, - 0.291752263f, -0.956493919f, - 0.293219163f, -0.956045251f, - 0.294685372f, -0.955594334f, - 0.296150888f, -0.955141168f, - 0.297615707f, -0.954685755f, - 0.299079826f, -0.954228095f, - 0.300543241f, -0.953768190f, - 0.302005949f, -0.953306040f, - 0.303467947f, -0.952841648f, - 0.304929230f, -0.952375013f, - 0.306389795f, -0.951906137f, - 0.307849640f, -0.951435021f, - 0.309308760f, -0.950961666f, - 0.310767153f, -0.950486074f, - 0.312224814f, -0.950008245f, - 0.313681740f, -0.949528181f, - 0.315137929f, -0.949045882f, - 0.316593376f, -0.948561350f, - 0.318048077f, -0.948074586f, - 0.319502031f, -0.947585591f, - 0.320955232f, -0.947094366f, - 0.322407679f, -0.946600913f, - 0.323859367f, -0.946105232f, - 0.325310292f, -0.945607325f, - 0.326760452f, -0.945107193f, - 0.328209844f, -0.944604837f, - 0.329658463f, -0.944100258f, - 0.331106306f, -0.943593458f, - 0.332553370f, -0.943084437f, - 0.333999651f, -0.942573198f, - 0.335445147f, -0.942059740f, - 0.336889853f, -0.941544065f, - 0.338333767f, -0.941026175f, - 0.339776884f, -0.940506071f, - 0.341219202f, -0.939983753f, - 0.342660717f, -0.939459224f, - 0.344101426f, -0.938932484f, - 0.345541325f, -0.938403534f, - 0.346980411f, -0.937872376f, - 0.348418680f, -0.937339012f, - 0.349856130f, -0.936803442f, - 0.351292756f, -0.936265667f, - 0.352728556f, -0.935725689f, - 0.354163525f, -0.935183510f, - 0.355597662f, -0.934639130f, - 0.357030961f, -0.934092550f, - 0.358463421f, -0.933543773f, - 0.359895037f, -0.932992799f, - 0.361325806f, -0.932439629f, - 0.362755724f, -0.931884266f, - 0.364184790f, -0.931326709f, - 0.365612998f, -0.930766961f, - 0.367040346f, -0.930205023f, - 0.368466830f, -0.929640896f, - 0.369892447f, -0.929074581f, - 0.371317194f, -0.928506080f, - 0.372741067f, -0.927935395f, - 0.374164063f, -0.927362526f, - 0.375586178f, -0.926787474f, - 0.377007410f, -0.926210242f, - 0.378427755f, -0.925630831f, - 0.379847209f, -0.925049241f, - 0.381265769f, -0.924465474f, - 0.382683432f, -0.923879533f, - 0.384100195f, -0.923291417f, - 0.385516054f, -0.922701128f, - 0.386931006f, -0.922108669f, - 0.388345047f, -0.921514039f, - 0.389758174f, -0.920917242f, - 0.391170384f, -0.920318277f, - 0.392581674f, -0.919717146f, - 0.393992040f, -0.919113852f, - 0.395401479f, -0.918508394f, - 0.396809987f, -0.917900776f, - 0.398217562f, -0.917290997f, - 0.399624200f, -0.916679060f, - 0.401029897f, -0.916064966f, - 0.402434651f, -0.915448716f, - 0.403838458f, -0.914830312f, - 0.405241314f, -0.914209756f, - 0.406643217f, -0.913587048f, - 0.408044163f, -0.912962190f, - 0.409444149f, -0.912335185f, - 0.410843171f, -0.911706032f, - 0.412241227f, -0.911074734f, - 0.413638312f, -0.910441292f, - 0.415034424f, -0.909805708f, - 0.416429560f, -0.909167983f, - 0.417823716f, -0.908528119f, - 0.419216888f, -0.907886116f, - 0.420609074f, -0.907241978f, - 0.422000271f, -0.906595705f, - 0.423390474f, -0.905947298f, - 0.424779681f, -0.905296759f, - 0.426167889f, -0.904644091f, - 0.427555093f, -0.903989293f, - 0.428941292f, -0.903332368f, - 0.430326481f, -0.902673318f, - 0.431710658f, -0.902012144f, - 0.433093819f, -0.901348847f, - 0.434475961f, -0.900683429f, - 0.435857080f, -0.900015892f, - 0.437237174f, -0.899346237f, - 0.438616239f, -0.898674466f, - 0.439994271f, -0.898000580f, - 0.441371269f, -0.897324581f, - 0.442747228f, -0.896646470f, - 0.444122145f, -0.895966250f, - 0.445496017f, -0.895283921f, - 0.446868840f, -0.894599486f, - 0.448240612f, -0.893912945f, - 0.449611330f, -0.893224301f, - 0.450980989f, -0.892533555f, - 0.452349587f, -0.891840709f, - 0.453717121f, -0.891145765f, - 0.455083587f, -0.890448723f, - 0.456448982f, -0.889749586f, - 0.457813304f, -0.889048356f, - 0.459176548f, -0.888345033f, - 0.460538711f, -0.887639620f, - 0.461899791f, -0.886932119f, - 0.463259784f, -0.886222530f, - 0.464618686f, -0.885510856f, - 0.465976496f, -0.884797098f, - 0.467333209f, -0.884081259f, - 0.468688822f, -0.883363339f, - 0.470043332f, -0.882643340f, - 0.471396737f, -0.881921264f, - 0.472749032f, -0.881197113f, - 0.474100215f, -0.880470889f, - 0.475450282f, -0.879742593f, - 0.476799230f, -0.879012226f, - 0.478147056f, -0.878279792f, - 0.479493758f, -0.877545290f, - 0.480839331f, -0.876808724f, - 0.482183772f, -0.876070094f, - 0.483527079f, -0.875329403f, - 0.484869248f, -0.874586652f, - 0.486210276f, -0.873841843f, - 0.487550160f, -0.873094978f, - 0.488888897f, -0.872346059f, - 0.490226483f, -0.871595087f, - 0.491562916f, -0.870842063f, - 0.492898192f, -0.870086991f, - 0.494232309f, -0.869329871f, - 0.495565262f, -0.868570706f, - 0.496897049f, -0.867809497f, - 0.498227667f, -0.867046246f, - 0.499557113f, -0.866280954f, - 0.500885383f, -0.865513624f, - 0.502212474f, -0.864744258f, - 0.503538384f, -0.863972856f, - 0.504863109f, -0.863199422f, - 0.506186645f, -0.862423956f, - 0.507508991f, -0.861646461f, - 0.508830143f, -0.860866939f, - 0.510150097f, -0.860085390f, - 0.511468850f, -0.859301818f, - 0.512786401f, -0.858516224f, - 0.514102744f, -0.857728610f, - 0.515417878f, -0.856938977f, - 0.516731799f, -0.856147328f, - 0.518044504f, -0.855353665f, - 0.519355990f, -0.854557988f, - 0.520666254f, -0.853760301f, - 0.521975293f, -0.852960605f, - 0.523283103f, -0.852158902f, - 0.524589683f, -0.851355193f, - 0.525895027f, -0.850549481f, - 0.527199135f, -0.849741768f, - 0.528502002f, -0.848932055f, - 0.529803625f, -0.848120345f, - 0.531104001f, -0.847306639f, - 0.532403128f, -0.846490939f, - 0.533701002f, -0.845673247f, - 0.534997620f, -0.844853565f, - 0.536292979f, -0.844031895f, - 0.537587076f, -0.843208240f, - 0.538879909f, -0.842382600f, - 0.540171473f, -0.841554977f, - 0.541461766f, -0.840725375f, - 0.542750785f, -0.839893794f, - 0.544038527f, -0.839060237f, - 0.545324988f, -0.838224706f, - 0.546610167f, -0.837387202f, - 0.547894059f, -0.836547727f, - 0.549176662f, -0.835706284f, - 0.550457973f, -0.834862875f, - 0.551737988f, -0.834017501f, - 0.553016706f, -0.833170165f, - 0.554294121f, -0.832320868f, - 0.555570233f, -0.831469612f, - 0.556845037f, -0.830616400f, - 0.558118531f, -0.829761234f, - 0.559390712f, -0.828904115f, - 0.560661576f, -0.828045045f, - 0.561931121f, -0.827184027f, - 0.563199344f, -0.826321063f, - 0.564466242f, -0.825456154f, - 0.565731811f, -0.824589303f, - 0.566996049f, -0.823720511f, - 0.568258953f, -0.822849781f, - 0.569520519f, -0.821977115f, - 0.570780746f, -0.821102515f, - 0.572039629f, -0.820225983f, - 0.573297167f, -0.819347520f, - 0.574553355f, -0.818467130f, - 0.575808191f, -0.817584813f, - 0.577061673f, -0.816700573f, - 0.578313796f, -0.815814411f, - 0.579564559f, -0.814926329f, - 0.580813958f, -0.814036330f, - 0.582061990f, -0.813144415f, - 0.583308653f, -0.812250587f, - 0.584553943f, -0.811354847f, - 0.585797857f, -0.810457198f, - 0.587040394f, -0.809557642f, - 0.588281548f, -0.808656182f, - 0.589521319f, -0.807752818f, - 0.590759702f, -0.806847554f, - 0.591996695f, -0.805940391f, - 0.593232295f, -0.805031331f, - 0.594466499f, -0.804120377f, - 0.595699304f, -0.803207531f, - 0.596930708f, -0.802292796f, - 0.598160707f, -0.801376172f, - 0.599389298f, -0.800457662f, - 0.600616479f, -0.799537269f, - 0.601842247f, -0.798614995f, - 0.603066599f, -0.797690841f, - 0.604289531f, -0.796764810f, - 0.605511041f, -0.795836905f, - 0.606731127f, -0.794907126f, - 0.607949785f, -0.793975478f, - 0.609167012f, -0.793041960f, - 0.610382806f, -0.792106577f, - 0.611597164f, -0.791169330f, - 0.612810082f, -0.790230221f, - 0.614021559f, -0.789289253f, - 0.615231591f, -0.788346428f, - 0.616440175f, -0.787401747f, - 0.617647308f, -0.786455214f, - 0.618852988f, -0.785506830f, - 0.620057212f, -0.784556597f, - 0.621259977f, -0.783604519f, - 0.622461279f, -0.782650596f, - 0.623661118f, -0.781694832f, - 0.624859488f, -0.780737229f, - 0.626056388f, -0.779777788f, - 0.627251815f, -0.778816512f, - 0.628445767f, -0.777853404f, - 0.629638239f, -0.776888466f, - 0.630829230f, -0.775921699f, - 0.632018736f, -0.774953107f, - 0.633206755f, -0.773982691f, - 0.634393284f, -0.773010453f, - 0.635578320f, -0.772036397f, - 0.636761861f, -0.771060524f, - 0.637943904f, -0.770082837f, - 0.639124445f, -0.769103338f, - 0.640303482f, -0.768122029f, - 0.641481013f, -0.767138912f, - 0.642657034f, -0.766153990f, - 0.643831543f, -0.765167266f, - 0.645004537f, -0.764178741f, - 0.646176013f, -0.763188417f, - 0.647345969f, -0.762196298f, - 0.648514401f, -0.761202385f, - 0.649681307f, -0.760206682f, - 0.650846685f, -0.759209189f, - 0.652010531f, -0.758209910f, - 0.653172843f, -0.757208847f, - 0.654333618f, -0.756206001f, - 0.655492853f, -0.755201377f, - 0.656650546f, -0.754194975f, - 0.657806693f, -0.753186799f, - 0.658961293f, -0.752176850f, - 0.660114342f, -0.751165132f, - 0.661265838f, -0.750151646f, - 0.662415778f, -0.749136395f, - 0.663564159f, -0.748119380f, - 0.664710978f, -0.747100606f, - 0.665856234f, -0.746080074f, - 0.666999922f, -0.745057785f, - 0.668142041f, -0.744033744f, - 0.669282588f, -0.743007952f, - 0.670421560f, -0.741980412f, - 0.671558955f, -0.740951125f, - 0.672694769f, -0.739920095f, - 0.673829000f, -0.738887324f, - 0.674961646f, -0.737852815f, - 0.676092704f, -0.736816569f, - 0.677222170f, -0.735778589f, - 0.678350043f, -0.734738878f, - 0.679476320f, -0.733697438f, - 0.680600998f, -0.732654272f, - 0.681724074f, -0.731609381f, - 0.682845546f, -0.730562769f, - 0.683965412f, -0.729514438f, - 0.685083668f, -0.728464390f, - 0.686200312f, -0.727412629f, - 0.687315341f, -0.726359155f, - 0.688428753f, -0.725303972f, - 0.689540545f, -0.724247083f, - 0.690650714f, -0.723188489f, - 0.691759258f, -0.722128194f, - 0.692866175f, -0.721066199f, - 0.693971461f, -0.720002508f, - 0.695075114f, -0.718937122f, - 0.696177131f, -0.717870045f, - 0.697277511f, -0.716801279f, - 0.698376249f, -0.715730825f, - 0.699473345f, -0.714658688f, - 0.700568794f, -0.713584869f, - 0.701662595f, -0.712509371f, - 0.702754744f, -0.711432196f, - 0.703845241f, -0.710353347f, - 0.704934080f, -0.709272826f, - 0.706021261f, -0.708190637f, - 0.707106781f, -0.707106781f, - 0.708190637f, -0.706021261f, - 0.709272826f, -0.704934080f, - 0.710353347f, -0.703845241f, - 0.711432196f, -0.702754744f, - 0.712509371f, -0.701662595f, - 0.713584869f, -0.700568794f, - 0.714658688f, -0.699473345f, - 0.715730825f, -0.698376249f, - 0.716801279f, -0.697277511f, - 0.717870045f, -0.696177131f, - 0.718937122f, -0.695075114f, - 0.720002508f, -0.693971461f, - 0.721066199f, -0.692866175f, - 0.722128194f, -0.691759258f, - 0.723188489f, -0.690650714f, - 0.724247083f, -0.689540545f, - 0.725303972f, -0.688428753f, - 0.726359155f, -0.687315341f, - 0.727412629f, -0.686200312f, - 0.728464390f, -0.685083668f, - 0.729514438f, -0.683965412f, - 0.730562769f, -0.682845546f, - 0.731609381f, -0.681724074f, - 0.732654272f, -0.680600998f, - 0.733697438f, -0.679476320f, - 0.734738878f, -0.678350043f, - 0.735778589f, -0.677222170f, - 0.736816569f, -0.676092704f, - 0.737852815f, -0.674961646f, - 0.738887324f, -0.673829000f, - 0.739920095f, -0.672694769f, - 0.740951125f, -0.671558955f, - 0.741980412f, -0.670421560f, - 0.743007952f, -0.669282588f, - 0.744033744f, -0.668142041f, - 0.745057785f, -0.666999922f, - 0.746080074f, -0.665856234f, - 0.747100606f, -0.664710978f, - 0.748119380f, -0.663564159f, - 0.749136395f, -0.662415778f, - 0.750151646f, -0.661265838f, - 0.751165132f, -0.660114342f, - 0.752176850f, -0.658961293f, - 0.753186799f, -0.657806693f, - 0.754194975f, -0.656650546f, - 0.755201377f, -0.655492853f, - 0.756206001f, -0.654333618f, - 0.757208847f, -0.653172843f, - 0.758209910f, -0.652010531f, - 0.759209189f, -0.650846685f, - 0.760206682f, -0.649681307f, - 0.761202385f, -0.648514401f, - 0.762196298f, -0.647345969f, - 0.763188417f, -0.646176013f, - 0.764178741f, -0.645004537f, - 0.765167266f, -0.643831543f, - 0.766153990f, -0.642657034f, - 0.767138912f, -0.641481013f, - 0.768122029f, -0.640303482f, - 0.769103338f, -0.639124445f, - 0.770082837f, -0.637943904f, - 0.771060524f, -0.636761861f, - 0.772036397f, -0.635578320f, - 0.773010453f, -0.634393284f, - 0.773982691f, -0.633206755f, - 0.774953107f, -0.632018736f, - 0.775921699f, -0.630829230f, - 0.776888466f, -0.629638239f, - 0.777853404f, -0.628445767f, - 0.778816512f, -0.627251815f, - 0.779777788f, -0.626056388f, - 0.780737229f, -0.624859488f, - 0.781694832f, -0.623661118f, - 0.782650596f, -0.622461279f, - 0.783604519f, -0.621259977f, - 0.784556597f, -0.620057212f, - 0.785506830f, -0.618852988f, - 0.786455214f, -0.617647308f, - 0.787401747f, -0.616440175f, - 0.788346428f, -0.615231591f, - 0.789289253f, -0.614021559f, - 0.790230221f, -0.612810082f, - 0.791169330f, -0.611597164f, - 0.792106577f, -0.610382806f, - 0.793041960f, -0.609167012f, - 0.793975478f, -0.607949785f, - 0.794907126f, -0.606731127f, - 0.795836905f, -0.605511041f, - 0.796764810f, -0.604289531f, - 0.797690841f, -0.603066599f, - 0.798614995f, -0.601842247f, - 0.799537269f, -0.600616479f, - 0.800457662f, -0.599389298f, - 0.801376172f, -0.598160707f, - 0.802292796f, -0.596930708f, - 0.803207531f, -0.595699304f, - 0.804120377f, -0.594466499f, - 0.805031331f, -0.593232295f, - 0.805940391f, -0.591996695f, - 0.806847554f, -0.590759702f, - 0.807752818f, -0.589521319f, - 0.808656182f, -0.588281548f, - 0.809557642f, -0.587040394f, - 0.810457198f, -0.585797857f, - 0.811354847f, -0.584553943f, - 0.812250587f, -0.583308653f, - 0.813144415f, -0.582061990f, - 0.814036330f, -0.580813958f, - 0.814926329f, -0.579564559f, - 0.815814411f, -0.578313796f, - 0.816700573f, -0.577061673f, - 0.817584813f, -0.575808191f, - 0.818467130f, -0.574553355f, - 0.819347520f, -0.573297167f, - 0.820225983f, -0.572039629f, - 0.821102515f, -0.570780746f, - 0.821977115f, -0.569520519f, - 0.822849781f, -0.568258953f, - 0.823720511f, -0.566996049f, - 0.824589303f, -0.565731811f, - 0.825456154f, -0.564466242f, - 0.826321063f, -0.563199344f, - 0.827184027f, -0.561931121f, - 0.828045045f, -0.560661576f, - 0.828904115f, -0.559390712f, - 0.829761234f, -0.558118531f, - 0.830616400f, -0.556845037f, - 0.831469612f, -0.555570233f, - 0.832320868f, -0.554294121f, - 0.833170165f, -0.553016706f, - 0.834017501f, -0.551737988f, - 0.834862875f, -0.550457973f, - 0.835706284f, -0.549176662f, - 0.836547727f, -0.547894059f, - 0.837387202f, -0.546610167f, - 0.838224706f, -0.545324988f, - 0.839060237f, -0.544038527f, - 0.839893794f, -0.542750785f, - 0.840725375f, -0.541461766f, - 0.841554977f, -0.540171473f, - 0.842382600f, -0.538879909f, - 0.843208240f, -0.537587076f, - 0.844031895f, -0.536292979f, - 0.844853565f, -0.534997620f, - 0.845673247f, -0.533701002f, - 0.846490939f, -0.532403128f, - 0.847306639f, -0.531104001f, - 0.848120345f, -0.529803625f, - 0.848932055f, -0.528502002f, - 0.849741768f, -0.527199135f, - 0.850549481f, -0.525895027f, - 0.851355193f, -0.524589683f, - 0.852158902f, -0.523283103f, - 0.852960605f, -0.521975293f, - 0.853760301f, -0.520666254f, - 0.854557988f, -0.519355990f, - 0.855353665f, -0.518044504f, - 0.856147328f, -0.516731799f, - 0.856938977f, -0.515417878f, - 0.857728610f, -0.514102744f, - 0.858516224f, -0.512786401f, - 0.859301818f, -0.511468850f, - 0.860085390f, -0.510150097f, - 0.860866939f, -0.508830143f, - 0.861646461f, -0.507508991f, - 0.862423956f, -0.506186645f, - 0.863199422f, -0.504863109f, - 0.863972856f, -0.503538384f, - 0.864744258f, -0.502212474f, - 0.865513624f, -0.500885383f, - 0.866280954f, -0.499557113f, - 0.867046246f, -0.498227667f, - 0.867809497f, -0.496897049f, - 0.868570706f, -0.495565262f, - 0.869329871f, -0.494232309f, - 0.870086991f, -0.492898192f, - 0.870842063f, -0.491562916f, - 0.871595087f, -0.490226483f, - 0.872346059f, -0.488888897f, - 0.873094978f, -0.487550160f, - 0.873841843f, -0.486210276f, - 0.874586652f, -0.484869248f, - 0.875329403f, -0.483527079f, - 0.876070094f, -0.482183772f, - 0.876808724f, -0.480839331f, - 0.877545290f, -0.479493758f, - 0.878279792f, -0.478147056f, - 0.879012226f, -0.476799230f, - 0.879742593f, -0.475450282f, - 0.880470889f, -0.474100215f, - 0.881197113f, -0.472749032f, - 0.881921264f, -0.471396737f, - 0.882643340f, -0.470043332f, - 0.883363339f, -0.468688822f, - 0.884081259f, -0.467333209f, - 0.884797098f, -0.465976496f, - 0.885510856f, -0.464618686f, - 0.886222530f, -0.463259784f, - 0.886932119f, -0.461899791f, - 0.887639620f, -0.460538711f, - 0.888345033f, -0.459176548f, - 0.889048356f, -0.457813304f, - 0.889749586f, -0.456448982f, - 0.890448723f, -0.455083587f, - 0.891145765f, -0.453717121f, - 0.891840709f, -0.452349587f, - 0.892533555f, -0.450980989f, - 0.893224301f, -0.449611330f, - 0.893912945f, -0.448240612f, - 0.894599486f, -0.446868840f, - 0.895283921f, -0.445496017f, - 0.895966250f, -0.444122145f, - 0.896646470f, -0.442747228f, - 0.897324581f, -0.441371269f, - 0.898000580f, -0.439994271f, - 0.898674466f, -0.438616239f, - 0.899346237f, -0.437237174f, - 0.900015892f, -0.435857080f, - 0.900683429f, -0.434475961f, - 0.901348847f, -0.433093819f, - 0.902012144f, -0.431710658f, - 0.902673318f, -0.430326481f, - 0.903332368f, -0.428941292f, - 0.903989293f, -0.427555093f, - 0.904644091f, -0.426167889f, - 0.905296759f, -0.424779681f, - 0.905947298f, -0.423390474f, - 0.906595705f, -0.422000271f, - 0.907241978f, -0.420609074f, - 0.907886116f, -0.419216888f, - 0.908528119f, -0.417823716f, - 0.909167983f, -0.416429560f, - 0.909805708f, -0.415034424f, - 0.910441292f, -0.413638312f, - 0.911074734f, -0.412241227f, - 0.911706032f, -0.410843171f, - 0.912335185f, -0.409444149f, - 0.912962190f, -0.408044163f, - 0.913587048f, -0.406643217f, - 0.914209756f, -0.405241314f, - 0.914830312f, -0.403838458f, - 0.915448716f, -0.402434651f, - 0.916064966f, -0.401029897f, - 0.916679060f, -0.399624200f, - 0.917290997f, -0.398217562f, - 0.917900776f, -0.396809987f, - 0.918508394f, -0.395401479f, - 0.919113852f, -0.393992040f, - 0.919717146f, -0.392581674f, - 0.920318277f, -0.391170384f, - 0.920917242f, -0.389758174f, - 0.921514039f, -0.388345047f, - 0.922108669f, -0.386931006f, - 0.922701128f, -0.385516054f, - 0.923291417f, -0.384100195f, - 0.923879533f, -0.382683432f, - 0.924465474f, -0.381265769f, - 0.925049241f, -0.379847209f, - 0.925630831f, -0.378427755f, - 0.926210242f, -0.377007410f, - 0.926787474f, -0.375586178f, - 0.927362526f, -0.374164063f, - 0.927935395f, -0.372741067f, - 0.928506080f, -0.371317194f, - 0.929074581f, -0.369892447f, - 0.929640896f, -0.368466830f, - 0.930205023f, -0.367040346f, - 0.930766961f, -0.365612998f, - 0.931326709f, -0.364184790f, - 0.931884266f, -0.362755724f, - 0.932439629f, -0.361325806f, - 0.932992799f, -0.359895037f, - 0.933543773f, -0.358463421f, - 0.934092550f, -0.357030961f, - 0.934639130f, -0.355597662f, - 0.935183510f, -0.354163525f, - 0.935725689f, -0.352728556f, - 0.936265667f, -0.351292756f, - 0.936803442f, -0.349856130f, - 0.937339012f, -0.348418680f, - 0.937872376f, -0.346980411f, - 0.938403534f, -0.345541325f, - 0.938932484f, -0.344101426f, - 0.939459224f, -0.342660717f, - 0.939983753f, -0.341219202f, - 0.940506071f, -0.339776884f, - 0.941026175f, -0.338333767f, - 0.941544065f, -0.336889853f, - 0.942059740f, -0.335445147f, - 0.942573198f, -0.333999651f, - 0.943084437f, -0.332553370f, - 0.943593458f, -0.331106306f, - 0.944100258f, -0.329658463f, - 0.944604837f, -0.328209844f, - 0.945107193f, -0.326760452f, - 0.945607325f, -0.325310292f, - 0.946105232f, -0.323859367f, - 0.946600913f, -0.322407679f, - 0.947094366f, -0.320955232f, - 0.947585591f, -0.319502031f, - 0.948074586f, -0.318048077f, - 0.948561350f, -0.316593376f, - 0.949045882f, -0.315137929f, - 0.949528181f, -0.313681740f, - 0.950008245f, -0.312224814f, - 0.950486074f, -0.310767153f, - 0.950961666f, -0.309308760f, - 0.951435021f, -0.307849640f, - 0.951906137f, -0.306389795f, - 0.952375013f, -0.304929230f, - 0.952841648f, -0.303467947f, - 0.953306040f, -0.302005949f, - 0.953768190f, -0.300543241f, - 0.954228095f, -0.299079826f, - 0.954685755f, -0.297615707f, - 0.955141168f, -0.296150888f, - 0.955594334f, -0.294685372f, - 0.956045251f, -0.293219163f, - 0.956493919f, -0.291752263f, - 0.956940336f, -0.290284677f, - 0.957384501f, -0.288816408f, - 0.957826413f, -0.287347460f, - 0.958266071f, -0.285877835f, - 0.958703475f, -0.284407537f, - 0.959138622f, -0.282936570f, - 0.959571513f, -0.281464938f, - 0.960002146f, -0.279992643f, - 0.960430519f, -0.278519689f, - 0.960856633f, -0.277046080f, - 0.961280486f, -0.275571819f, - 0.961702077f, -0.274096910f, - 0.962121404f, -0.272621355f, - 0.962538468f, -0.271145160f, - 0.962953267f, -0.269668326f, - 0.963365800f, -0.268190857f, - 0.963776066f, -0.266712757f, - 0.964184064f, -0.265234030f, - 0.964589793f, -0.263754679f, - 0.964993253f, -0.262274707f, - 0.965394442f, -0.260794118f, - 0.965793359f, -0.259312915f, - 0.966190003f, -0.257831102f, - 0.966584374f, -0.256348682f, - 0.966976471f, -0.254865660f, - 0.967366292f, -0.253382037f, - 0.967753837f, -0.251897818f, - 0.968139105f, -0.250413007f, - 0.968522094f, -0.248927606f, - 0.968902805f, -0.247441619f, - 0.969281235f, -0.245955050f, - 0.969657385f, -0.244467903f, - 0.970031253f, -0.242980180f, - 0.970402839f, -0.241491885f, - 0.970772141f, -0.240003022f, - 0.971139158f, -0.238513595f, - 0.971503891f, -0.237023606f, - 0.971866337f, -0.235533059f, - 0.972226497f, -0.234041959f, - 0.972584369f, -0.232550307f, - 0.972939952f, -0.231058108f, - 0.973293246f, -0.229565366f, - 0.973644250f, -0.228072083f, - 0.973992962f, -0.226578264f, - 0.974339383f, -0.225083911f, - 0.974683511f, -0.223589029f, - 0.975025345f, -0.222093621f, - 0.975364885f, -0.220597690f, - 0.975702130f, -0.219101240f, - 0.976037079f, -0.217604275f, - 0.976369731f, -0.216106797f, - 0.976700086f, -0.214608811f, - 0.977028143f, -0.213110320f, - 0.977353900f, -0.211611327f, - 0.977677358f, -0.210111837f, - 0.977998515f, -0.208611852f, - 0.978317371f, -0.207111376f, - 0.978633924f, -0.205610413f, - 0.978948175f, -0.204108966f, - 0.979260123f, -0.202607039f, - 0.979569766f, -0.201104635f, - 0.979877104f, -0.199601758f, - 0.980182136f, -0.198098411f, - 0.980484862f, -0.196594598f, - 0.980785280f, -0.195090322f, - 0.981083391f, -0.193585587f, - 0.981379193f, -0.192080397f, - 0.981672686f, -0.190574755f, - 0.981963869f, -0.189068664f, - 0.982252741f, -0.187562129f, - 0.982539302f, -0.186055152f, - 0.982823551f, -0.184547737f, - 0.983105487f, -0.183039888f, - 0.983385110f, -0.181531608f, - 0.983662419f, -0.180022901f, - 0.983937413f, -0.178513771f, - 0.984210092f, -0.177004220f, - 0.984480455f, -0.175494253f, - 0.984748502f, -0.173983873f, - 0.985014231f, -0.172473084f, - 0.985277642f, -0.170961889f, - 0.985538735f, -0.169450291f, - 0.985797509f, -0.167938295f, - 0.986053963f, -0.166425904f, - 0.986308097f, -0.164913120f, - 0.986559910f, -0.163399949f, - 0.986809402f, -0.161886394f, - 0.987056571f, -0.160372457f, - 0.987301418f, -0.158858143f, - 0.987543942f, -0.157343456f, - 0.987784142f, -0.155828398f, - 0.988022017f, -0.154312973f, - 0.988257568f, -0.152797185f, - 0.988490793f, -0.151281038f, - 0.988721692f, -0.149764535f, - 0.988950265f, -0.148247679f, - 0.989176510f, -0.146730474f, - 0.989400428f, -0.145212925f, - 0.989622017f, -0.143695033f, - 0.989841278f, -0.142176804f, - 0.990058210f, -0.140658239f, - 0.990272812f, -0.139139344f, - 0.990485084f, -0.137620122f, - 0.990695025f, -0.136100575f, - 0.990902635f, -0.134580709f, - 0.991107914f, -0.133060525f, - 0.991310860f, -0.131540029f, - 0.991511473f, -0.130019223f, - 0.991709754f, -0.128498111f, - 0.991905700f, -0.126976696f, - 0.992099313f, -0.125454983f, - 0.992290591f, -0.123932975f, - 0.992479535f, -0.122410675f, - 0.992666142f, -0.120888087f, - 0.992850414f, -0.119365215f, - 0.993032350f, -0.117842062f, - 0.993211949f, -0.116318631f, - 0.993389211f, -0.114794927f, - 0.993564136f, -0.113270952f, - 0.993736722f, -0.111746711f, - 0.993906970f, -0.110222207f, - 0.994074879f, -0.108697444f, - 0.994240449f, -0.107172425f, - 0.994403680f, -0.105647154f, - 0.994564571f, -0.104121634f, - 0.994723121f, -0.102595869f, - 0.994879331f, -0.101069863f, - 0.995033199f, -0.099543619f, - 0.995184727f, -0.098017140f, - 0.995333912f, -0.096490431f, - 0.995480755f, -0.094963495f, - 0.995625256f, -0.093436336f, - 0.995767414f, -0.091908956f, - 0.995907229f, -0.090381361f, - 0.996044701f, -0.088853553f, - 0.996179829f, -0.087325535f, - 0.996312612f, -0.085797312f, - 0.996443051f, -0.084268888f, - 0.996571146f, -0.082740265f, - 0.996696895f, -0.081211447f, - 0.996820299f, -0.079682438f, - 0.996941358f, -0.078153242f, - 0.997060070f, -0.076623861f, - 0.997176437f, -0.075094301f, - 0.997290457f, -0.073564564f, - 0.997402130f, -0.072034653f, - 0.997511456f, -0.070504573f, - 0.997618435f, -0.068974328f, - 0.997723067f, -0.067443920f, - 0.997825350f, -0.065913353f, - 0.997925286f, -0.064382631f, - 0.998022874f, -0.062851758f, - 0.998118113f, -0.061320736f, - 0.998211003f, -0.059789571f, - 0.998301545f, -0.058258265f, - 0.998389737f, -0.056726821f, - 0.998475581f, -0.055195244f, - 0.998559074f, -0.053663538f, - 0.998640218f, -0.052131705f, - 0.998719012f, -0.050599749f, - 0.998795456f, -0.049067674f, - 0.998869550f, -0.047535484f, - 0.998941293f, -0.046003182f, - 0.999010686f, -0.044470772f, - 0.999077728f, -0.042938257f, - 0.999142419f, -0.041405641f, - 0.999204759f, -0.039872928f, - 0.999264747f, -0.038340120f, - 0.999322385f, -0.036807223f, - 0.999377670f, -0.035274239f, - 0.999430605f, -0.033741172f, - 0.999481187f, -0.032208025f, - 0.999529418f, -0.030674803f, - 0.999575296f, -0.029141509f, - 0.999618822f, -0.027608146f, - 0.999659997f, -0.026074718f, - 0.999698819f, -0.024541229f, - 0.999735288f, -0.023007681f, - 0.999769405f, -0.021474080f, - 0.999801170f, -0.019940429f, - 0.999830582f, -0.018406730f, - 0.999857641f, -0.016872988f, - 0.999882347f, -0.015339206f, - 0.999904701f, -0.013805389f, - 0.999924702f, -0.012271538f, - 0.999942350f, -0.010737659f, - 0.999957645f, -0.009203755f, - 0.999970586f, -0.007669829f, - 0.999981175f, -0.006135885f, - 0.999989411f, -0.004601926f, - 0.999995294f, -0.003067957f, - 0.999998823f, -0.001533980f -}; - -/* -* @brief Q31 Twiddle factors Table -*/ - - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 16 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_16_q31[24] = { - 0x7FFFFFFF, 0x00000000, - 0x7641AF3C, 0x30FBC54D, - 0x5A82799A, 0x5A82799A, - 0x30FBC54D, 0x7641AF3C, - 0x00000000, 0x7FFFFFFF, - 0xCF043AB2, 0x7641AF3C, - 0xA57D8666, 0x5A82799A, - 0x89BE50C3, 0x30FBC54D, - 0x80000000, 0x00000000, - 0x89BE50C3, 0xCF043AB2, - 0xA57D8666, 0xA57D8666, - 0xCF043AB2, 0x89BE50C3 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 32 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_32_q31[48] = { - 0x7FFFFFFF, 0x00000000, - 0x7D8A5F3F, 0x18F8B83C, - 0x7641AF3C, 0x30FBC54D, - 0x6A6D98A4, 0x471CECE6, - 0x5A82799A, 0x5A82799A, - 0x471CECE6, 0x6A6D98A4, - 0x30FBC54D, 0x7641AF3C, - 0x18F8B83C, 0x7D8A5F3F, - 0x00000000, 0x7FFFFFFF, - 0xE70747C3, 0x7D8A5F3F, - 0xCF043AB2, 0x7641AF3C, - 0xB8E31319, 0x6A6D98A4, - 0xA57D8666, 0x5A82799A, - 0x9592675B, 0x471CECE6, - 0x89BE50C3, 0x30FBC54D, - 0x8275A0C0, 0x18F8B83C, - 0x80000000, 0x00000000, - 0x8275A0C0, 0xE70747C3, - 0x89BE50C3, 0xCF043AB2, - 0x9592675B, 0xB8E31319, - 0xA57D8666, 0xA57D8666, - 0xB8E31319, 0x9592675B, - 0xCF043AB2, 0x89BE50C3, - 0xE70747C3, 0x8275A0C0 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 64 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_64_q31[96] = { - 0x7FFFFFFF, 0x00000000, - 0x7F62368F, 0x0C8BD35E, - 0x7D8A5F3F, 0x18F8B83C, - 0x7A7D055B, 0x25280C5D, - 0x7641AF3C, 0x30FBC54D, - 0x70E2CBC6, 0x3C56BA70, - 0x6A6D98A4, 0x471CECE6, - 0x62F201AC, 0x5133CC94, - 0x5A82799A, 0x5A82799A, - 0x5133CC94, 0x62F201AC, - 0x471CECE6, 0x6A6D98A4, - 0x3C56BA70, 0x70E2CBC6, - 0x30FBC54D, 0x7641AF3C, - 0x25280C5D, 0x7A7D055B, - 0x18F8B83C, 0x7D8A5F3F, - 0x0C8BD35E, 0x7F62368F, - 0x00000000, 0x7FFFFFFF, - 0xF3742CA1, 0x7F62368F, - 0xE70747C3, 0x7D8A5F3F, - 0xDAD7F3A2, 0x7A7D055B, - 0xCF043AB2, 0x7641AF3C, - 0xC3A9458F, 0x70E2CBC6, - 0xB8E31319, 0x6A6D98A4, - 0xAECC336B, 0x62F201AC, - 0xA57D8666, 0x5A82799A, - 0x9D0DFE53, 0x5133CC94, - 0x9592675B, 0x471CECE6, - 0x8F1D343A, 0x3C56BA70, - 0x89BE50C3, 0x30FBC54D, - 0x8582FAA4, 0x25280C5D, - 0x8275A0C0, 0x18F8B83C, - 0x809DC970, 0x0C8BD35E, - 0x80000000, 0x00000000, - 0x809DC970, 0xF3742CA1, - 0x8275A0C0, 0xE70747C3, - 0x8582FAA4, 0xDAD7F3A2, - 0x89BE50C3, 0xCF043AB2, - 0x8F1D343A, 0xC3A9458F, - 0x9592675B, 0xB8E31319, - 0x9D0DFE53, 0xAECC336B, - 0xA57D8666, 0xA57D8666, - 0xAECC336B, 0x9D0DFE53, - 0xB8E31319, 0x9592675B, - 0xC3A9458F, 0x8F1D343A, - 0xCF043AB2, 0x89BE50C3, - 0xDAD7F3A2, 0x8582FAA4, - 0xE70747C3, 0x8275A0C0, - 0xF3742CA1, 0x809DC970 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 128 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_128_q31[192] = { - 0x7FFFFFFF, 0x00000000, - 0x7FD8878D, 0x0647D97C, - 0x7F62368F, 0x0C8BD35E, - 0x7E9D55FC, 0x12C8106E, - 0x7D8A5F3F, 0x18F8B83C, - 0x7C29FBEE, 0x1F19F97B, - 0x7A7D055B, 0x25280C5D, - 0x78848413, 0x2B1F34EB, - 0x7641AF3C, 0x30FBC54D, - 0x73B5EBD0, 0x36BA2013, - 0x70E2CBC6, 0x3C56BA70, - 0x6DCA0D14, 0x41CE1E64, - 0x6A6D98A4, 0x471CECE6, - 0x66CF811F, 0x4C3FDFF3, - 0x62F201AC, 0x5133CC94, - 0x5ED77C89, 0x55F5A4D2, - 0x5A82799A, 0x5A82799A, - 0x55F5A4D2, 0x5ED77C89, - 0x5133CC94, 0x62F201AC, - 0x4C3FDFF3, 0x66CF811F, - 0x471CECE6, 0x6A6D98A4, - 0x41CE1E64, 0x6DCA0D14, - 0x3C56BA70, 0x70E2CBC6, - 0x36BA2013, 0x73B5EBD0, - 0x30FBC54D, 0x7641AF3C, - 0x2B1F34EB, 0x78848413, - 0x25280C5D, 0x7A7D055B, - 0x1F19F97B, 0x7C29FBEE, - 0x18F8B83C, 0x7D8A5F3F, - 0x12C8106E, 0x7E9D55FC, - 0x0C8BD35E, 0x7F62368F, - 0x0647D97C, 0x7FD8878D, - 0x00000000, 0x7FFFFFFF, - 0xF9B82683, 0x7FD8878D, - 0xF3742CA1, 0x7F62368F, - 0xED37EF91, 0x7E9D55FC, - 0xE70747C3, 0x7D8A5F3F, - 0xE0E60684, 0x7C29FBEE, - 0xDAD7F3A2, 0x7A7D055B, - 0xD4E0CB14, 0x78848413, - 0xCF043AB2, 0x7641AF3C, - 0xC945DFEC, 0x73B5EBD0, - 0xC3A9458F, 0x70E2CBC6, - 0xBE31E19B, 0x6DCA0D14, - 0xB8E31319, 0x6A6D98A4, - 0xB3C0200C, 0x66CF811F, - 0xAECC336B, 0x62F201AC, - 0xAA0A5B2D, 0x5ED77C89, - 0xA57D8666, 0x5A82799A, - 0xA1288376, 0x55F5A4D2, - 0x9D0DFE53, 0x5133CC94, - 0x99307EE0, 0x4C3FDFF3, - 0x9592675B, 0x471CECE6, - 0x9235F2EB, 0x41CE1E64, - 0x8F1D343A, 0x3C56BA70, - 0x8C4A142F, 0x36BA2013, - 0x89BE50C3, 0x30FBC54D, - 0x877B7BEC, 0x2B1F34EB, - 0x8582FAA4, 0x25280C5D, - 0x83D60411, 0x1F19F97B, - 0x8275A0C0, 0x18F8B83C, - 0x8162AA03, 0x12C8106E, - 0x809DC970, 0x0C8BD35E, - 0x80277872, 0x0647D97C, - 0x80000000, 0x00000000, - 0x80277872, 0xF9B82683, - 0x809DC970, 0xF3742CA1, - 0x8162AA03, 0xED37EF91, - 0x8275A0C0, 0xE70747C3, - 0x83D60411, 0xE0E60684, - 0x8582FAA4, 0xDAD7F3A2, - 0x877B7BEC, 0xD4E0CB14, - 0x89BE50C3, 0xCF043AB2, - 0x8C4A142F, 0xC945DFEC, - 0x8F1D343A, 0xC3A9458F, - 0x9235F2EB, 0xBE31E19B, - 0x9592675B, 0xB8E31319, - 0x99307EE0, 0xB3C0200C, - 0x9D0DFE53, 0xAECC336B, - 0xA1288376, 0xAA0A5B2D, - 0xA57D8666, 0xA57D8666, - 0xAA0A5B2D, 0xA1288376, - 0xAECC336B, 0x9D0DFE53, - 0xB3C0200C, 0x99307EE0, - 0xB8E31319, 0x9592675B, - 0xBE31E19B, 0x9235F2EB, - 0xC3A9458F, 0x8F1D343A, - 0xC945DFEC, 0x8C4A142F, - 0xCF043AB2, 0x89BE50C3, - 0xD4E0CB14, 0x877B7BEC, - 0xDAD7F3A2, 0x8582FAA4, - 0xE0E60684, 0x83D60411, - 0xE70747C3, 0x8275A0C0, - 0xED37EF91, 0x8162AA03, - 0xF3742CA1, 0x809DC970, - 0xF9B82683, 0x80277872 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 256 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_256_q31[384] = { - 0x7FFFFFFF, 0x00000000, - 0x7FF62182, 0x03242ABF, - 0x7FD8878D, 0x0647D97C, - 0x7FA736B4, 0x096A9049, - 0x7F62368F, 0x0C8BD35E, - 0x7F0991C3, 0x0FAB272B, - 0x7E9D55FC, 0x12C8106E, - 0x7E1D93E9, 0x15E21444, - 0x7D8A5F3F, 0x18F8B83C, - 0x7CE3CEB1, 0x1C0B826A, - 0x7C29FBEE, 0x1F19F97B, - 0x7B5D039D, 0x2223A4C5, - 0x7A7D055B, 0x25280C5D, - 0x798A23B1, 0x2826B928, - 0x78848413, 0x2B1F34EB, - 0x776C4EDB, 0x2E110A62, - 0x7641AF3C, 0x30FBC54D, - 0x7504D345, 0x33DEF287, - 0x73B5EBD0, 0x36BA2013, - 0x72552C84, 0x398CDD32, - 0x70E2CBC6, 0x3C56BA70, - 0x6F5F02B1, 0x3F1749B7, - 0x6DCA0D14, 0x41CE1E64, - 0x6C242960, 0x447ACD50, - 0x6A6D98A4, 0x471CECE6, - 0x68A69E81, 0x49B41533, - 0x66CF811F, 0x4C3FDFF3, - 0x64E88926, 0x4EBFE8A4, - 0x62F201AC, 0x5133CC94, - 0x60EC3830, 0x539B2AEF, - 0x5ED77C89, 0x55F5A4D2, - 0x5CB420DF, 0x5842DD54, - 0x5A82799A, 0x5A82799A, - 0x5842DD54, 0x5CB420DF, - 0x55F5A4D2, 0x5ED77C89, - 0x539B2AEF, 0x60EC3830, - 0x5133CC94, 0x62F201AC, - 0x4EBFE8A4, 0x64E88926, - 0x4C3FDFF3, 0x66CF811F, - 0x49B41533, 0x68A69E81, - 0x471CECE6, 0x6A6D98A4, - 0x447ACD50, 0x6C242960, - 0x41CE1E64, 0x6DCA0D14, - 0x3F1749B7, 0x6F5F02B1, - 0x3C56BA70, 0x70E2CBC6, - 0x398CDD32, 0x72552C84, - 0x36BA2013, 0x73B5EBD0, - 0x33DEF287, 0x7504D345, - 0x30FBC54D, 0x7641AF3C, - 0x2E110A62, 0x776C4EDB, - 0x2B1F34EB, 0x78848413, - 0x2826B928, 0x798A23B1, - 0x25280C5D, 0x7A7D055B, - 0x2223A4C5, 0x7B5D039D, - 0x1F19F97B, 0x7C29FBEE, - 0x1C0B826A, 0x7CE3CEB1, - 0x18F8B83C, 0x7D8A5F3F, - 0x15E21444, 0x7E1D93E9, - 0x12C8106E, 0x7E9D55FC, - 0x0FAB272B, 0x7F0991C3, - 0x0C8BD35E, 0x7F62368F, - 0x096A9049, 0x7FA736B4, - 0x0647D97C, 0x7FD8878D, - 0x03242ABF, 0x7FF62182, - 0x00000000, 0x7FFFFFFF, - 0xFCDBD541, 0x7FF62182, - 0xF9B82683, 0x7FD8878D, - 0xF6956FB6, 0x7FA736B4, - 0xF3742CA1, 0x7F62368F, - 0xF054D8D4, 0x7F0991C3, - 0xED37EF91, 0x7E9D55FC, - 0xEA1DEBBB, 0x7E1D93E9, - 0xE70747C3, 0x7D8A5F3F, - 0xE3F47D95, 0x7CE3CEB1, - 0xE0E60684, 0x7C29FBEE, - 0xDDDC5B3A, 0x7B5D039D, - 0xDAD7F3A2, 0x7A7D055B, - 0xD7D946D7, 0x798A23B1, - 0xD4E0CB14, 0x78848413, - 0xD1EEF59E, 0x776C4EDB, - 0xCF043AB2, 0x7641AF3C, - 0xCC210D78, 0x7504D345, - 0xC945DFEC, 0x73B5EBD0, - 0xC67322CD, 0x72552C84, - 0xC3A9458F, 0x70E2CBC6, - 0xC0E8B648, 0x6F5F02B1, - 0xBE31E19B, 0x6DCA0D14, - 0xBB8532AF, 0x6C242960, - 0xB8E31319, 0x6A6D98A4, - 0xB64BEACC, 0x68A69E81, - 0xB3C0200C, 0x66CF811F, - 0xB140175B, 0x64E88926, - 0xAECC336B, 0x62F201AC, - 0xAC64D510, 0x60EC3830, - 0xAA0A5B2D, 0x5ED77C89, - 0xA7BD22AB, 0x5CB420DF, - 0xA57D8666, 0x5A82799A, - 0xA34BDF20, 0x5842DD54, - 0xA1288376, 0x55F5A4D2, - 0x9F13C7D0, 0x539B2AEF, - 0x9D0DFE53, 0x5133CC94, - 0x9B1776D9, 0x4EBFE8A4, - 0x99307EE0, 0x4C3FDFF3, - 0x9759617E, 0x49B41533, - 0x9592675B, 0x471CECE6, - 0x93DBD69F, 0x447ACD50, - 0x9235F2EB, 0x41CE1E64, - 0x90A0FD4E, 0x3F1749B7, - 0x8F1D343A, 0x3C56BA70, - 0x8DAAD37B, 0x398CDD32, - 0x8C4A142F, 0x36BA2013, - 0x8AFB2CBA, 0x33DEF287, - 0x89BE50C3, 0x30FBC54D, - 0x8893B124, 0x2E110A62, - 0x877B7BEC, 0x2B1F34EB, - 0x8675DC4E, 0x2826B928, - 0x8582FAA4, 0x25280C5D, - 0x84A2FC62, 0x2223A4C5, - 0x83D60411, 0x1F19F97B, - 0x831C314E, 0x1C0B826A, - 0x8275A0C0, 0x18F8B83C, - 0x81E26C16, 0x15E21444, - 0x8162AA03, 0x12C8106E, - 0x80F66E3C, 0x0FAB272B, - 0x809DC970, 0x0C8BD35E, - 0x8058C94C, 0x096A9049, - 0x80277872, 0x0647D97C, - 0x8009DE7D, 0x03242ABF, - 0x80000000, 0x00000000, - 0x8009DE7D, 0xFCDBD541, - 0x80277872, 0xF9B82683, - 0x8058C94C, 0xF6956FB6, - 0x809DC970, 0xF3742CA1, - 0x80F66E3C, 0xF054D8D4, - 0x8162AA03, 0xED37EF91, - 0x81E26C16, 0xEA1DEBBB, - 0x8275A0C0, 0xE70747C3, - 0x831C314E, 0xE3F47D95, - 0x83D60411, 0xE0E60684, - 0x84A2FC62, 0xDDDC5B3A, - 0x8582FAA4, 0xDAD7F3A2, - 0x8675DC4E, 0xD7D946D7, - 0x877B7BEC, 0xD4E0CB14, - 0x8893B124, 0xD1EEF59E, - 0x89BE50C3, 0xCF043AB2, - 0x8AFB2CBA, 0xCC210D78, - 0x8C4A142F, 0xC945DFEC, - 0x8DAAD37B, 0xC67322CD, - 0x8F1D343A, 0xC3A9458F, - 0x90A0FD4E, 0xC0E8B648, - 0x9235F2EB, 0xBE31E19B, - 0x93DBD69F, 0xBB8532AF, - 0x9592675B, 0xB8E31319, - 0x9759617E, 0xB64BEACC, - 0x99307EE0, 0xB3C0200C, - 0x9B1776D9, 0xB140175B, - 0x9D0DFE53, 0xAECC336B, - 0x9F13C7D0, 0xAC64D510, - 0xA1288376, 0xAA0A5B2D, - 0xA34BDF20, 0xA7BD22AB, - 0xA57D8666, 0xA57D8666, - 0xA7BD22AB, 0xA34BDF20, - 0xAA0A5B2D, 0xA1288376, - 0xAC64D510, 0x9F13C7D0, - 0xAECC336B, 0x9D0DFE53, - 0xB140175B, 0x9B1776D9, - 0xB3C0200C, 0x99307EE0, - 0xB64BEACC, 0x9759617E, - 0xB8E31319, 0x9592675B, - 0xBB8532AF, 0x93DBD69F, - 0xBE31E19B, 0x9235F2EB, - 0xC0E8B648, 0x90A0FD4E, - 0xC3A9458F, 0x8F1D343A, - 0xC67322CD, 0x8DAAD37B, - 0xC945DFEC, 0x8C4A142F, - 0xCC210D78, 0x8AFB2CBA, - 0xCF043AB2, 0x89BE50C3, - 0xD1EEF59E, 0x8893B124, - 0xD4E0CB14, 0x877B7BEC, - 0xD7D946D7, 0x8675DC4E, - 0xDAD7F3A2, 0x8582FAA4, - 0xDDDC5B3A, 0x84A2FC62, - 0xE0E60684, 0x83D60411, - 0xE3F47D95, 0x831C314E, - 0xE70747C3, 0x8275A0C0, - 0xEA1DEBBB, 0x81E26C16, - 0xED37EF91, 0x8162AA03, - 0xF054D8D4, 0x80F66E3C, - 0xF3742CA1, 0x809DC970, - 0xF6956FB6, 0x8058C94C, - 0xF9B82683, 0x80277872, - 0xFCDBD541, 0x8009DE7D -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 512 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_512_q31[768] = { - 0x7FFFFFFF, 0x00000000, - 0x7FFD885A, 0x01921D1F, - 0x7FF62182, 0x03242ABF, - 0x7FE9CBC0, 0x04B6195D, - 0x7FD8878D, 0x0647D97C, - 0x7FC25596, 0x07D95B9E, - 0x7FA736B4, 0x096A9049, - 0x7F872BF3, 0x0AFB6805, - 0x7F62368F, 0x0C8BD35E, - 0x7F3857F5, 0x0E1BC2E3, - 0x7F0991C3, 0x0FAB272B, - 0x7ED5E5C6, 0x1139F0CE, - 0x7E9D55FC, 0x12C8106E, - 0x7E5FE493, 0x145576B1, - 0x7E1D93E9, 0x15E21444, - 0x7DD6668E, 0x176DD9DE, - 0x7D8A5F3F, 0x18F8B83C, - 0x7D3980EC, 0x1A82A025, - 0x7CE3CEB1, 0x1C0B826A, - 0x7C894BDD, 0x1D934FE5, - 0x7C29FBEE, 0x1F19F97B, - 0x7BC5E28F, 0x209F701C, - 0x7B5D039D, 0x2223A4C5, - 0x7AEF6323, 0x23A6887E, - 0x7A7D055B, 0x25280C5D, - 0x7A05EEAD, 0x26A82185, - 0x798A23B1, 0x2826B928, - 0x7909A92C, 0x29A3C484, - 0x78848413, 0x2B1F34EB, - 0x77FAB988, 0x2C98FBBA, - 0x776C4EDB, 0x2E110A62, - 0x76D94988, 0x2F875262, - 0x7641AF3C, 0x30FBC54D, - 0x75A585CF, 0x326E54C7, - 0x7504D345, 0x33DEF287, - 0x745F9DD1, 0x354D9056, - 0x73B5EBD0, 0x36BA2013, - 0x7307C3D0, 0x382493B0, - 0x72552C84, 0x398CDD32, - 0x719E2CD2, 0x3AF2EEB7, - 0x70E2CBC6, 0x3C56BA70, - 0x70231099, 0x3DB832A5, - 0x6F5F02B1, 0x3F1749B7, - 0x6E96A99C, 0x4073F21D, - 0x6DCA0D14, 0x41CE1E64, - 0x6CF934FB, 0x4325C135, - 0x6C242960, 0x447ACD50, - 0x6B4AF278, 0x45CD358F, - 0x6A6D98A4, 0x471CECE6, - 0x698C246C, 0x4869E664, - 0x68A69E81, 0x49B41533, - 0x67BD0FBC, 0x4AFB6C97, - 0x66CF811F, 0x4C3FDFF3, - 0x65DDFBD3, 0x4D8162C4, - 0x64E88926, 0x4EBFE8A4, - 0x63EF328F, 0x4FFB654D, - 0x62F201AC, 0x5133CC94, - 0x61F1003E, 0x5269126E, - 0x60EC3830, 0x539B2AEF, - 0x5FE3B38D, 0x54CA0A4A, - 0x5ED77C89, 0x55F5A4D2, - 0x5DC79D7C, 0x571DEEF9, - 0x5CB420DF, 0x5842DD54, - 0x5B9D1153, 0x59646497, - 0x5A82799A, 0x5A82799A, - 0x59646497, 0x5B9D1153, - 0x5842DD54, 0x5CB420DF, - 0x571DEEF9, 0x5DC79D7C, - 0x55F5A4D2, 0x5ED77C89, - 0x54CA0A4A, 0x5FE3B38D, - 0x539B2AEF, 0x60EC3830, - 0x5269126E, 0x61F1003E, - 0x5133CC94, 0x62F201AC, - 0x4FFB654D, 0x63EF328F, - 0x4EBFE8A4, 0x64E88926, - 0x4D8162C4, 0x65DDFBD3, - 0x4C3FDFF3, 0x66CF811F, - 0x4AFB6C97, 0x67BD0FBC, - 0x49B41533, 0x68A69E81, - 0x4869E664, 0x698C246C, - 0x471CECE6, 0x6A6D98A4, - 0x45CD358F, 0x6B4AF278, - 0x447ACD50, 0x6C242960, - 0x4325C135, 0x6CF934FB, - 0x41CE1E64, 0x6DCA0D14, - 0x4073F21D, 0x6E96A99C, - 0x3F1749B7, 0x6F5F02B1, - 0x3DB832A5, 0x70231099, - 0x3C56BA70, 0x70E2CBC6, - 0x3AF2EEB7, 0x719E2CD2, - 0x398CDD32, 0x72552C84, - 0x382493B0, 0x7307C3D0, - 0x36BA2013, 0x73B5EBD0, - 0x354D9056, 0x745F9DD1, - 0x33DEF287, 0x7504D345, - 0x326E54C7, 0x75A585CF, - 0x30FBC54D, 0x7641AF3C, - 0x2F875262, 0x76D94988, - 0x2E110A62, 0x776C4EDB, - 0x2C98FBBA, 0x77FAB988, - 0x2B1F34EB, 0x78848413, - 0x29A3C484, 0x7909A92C, - 0x2826B928, 0x798A23B1, - 0x26A82185, 0x7A05EEAD, - 0x25280C5D, 0x7A7D055B, - 0x23A6887E, 0x7AEF6323, - 0x2223A4C5, 0x7B5D039D, - 0x209F701C, 0x7BC5E28F, - 0x1F19F97B, 0x7C29FBEE, - 0x1D934FE5, 0x7C894BDD, - 0x1C0B826A, 0x7CE3CEB1, - 0x1A82A025, 0x7D3980EC, - 0x18F8B83C, 0x7D8A5F3F, - 0x176DD9DE, 0x7DD6668E, - 0x15E21444, 0x7E1D93E9, - 0x145576B1, 0x7E5FE493, - 0x12C8106E, 0x7E9D55FC, - 0x1139F0CE, 0x7ED5E5C6, - 0x0FAB272B, 0x7F0991C3, - 0x0E1BC2E3, 0x7F3857F5, - 0x0C8BD35E, 0x7F62368F, - 0x0AFB6805, 0x7F872BF3, - 0x096A9049, 0x7FA736B4, - 0x07D95B9E, 0x7FC25596, - 0x0647D97C, 0x7FD8878D, - 0x04B6195D, 0x7FE9CBC0, - 0x03242ABF, 0x7FF62182, - 0x01921D1F, 0x7FFD885A, - 0x00000000, 0x7FFFFFFF, - 0xFE6DE2E0, 0x7FFD885A, - 0xFCDBD541, 0x7FF62182, - 0xFB49E6A2, 0x7FE9CBC0, - 0xF9B82683, 0x7FD8878D, - 0xF826A461, 0x7FC25596, - 0xF6956FB6, 0x7FA736B4, - 0xF50497FA, 0x7F872BF3, - 0xF3742CA1, 0x7F62368F, - 0xF1E43D1C, 0x7F3857F5, - 0xF054D8D4, 0x7F0991C3, - 0xEEC60F31, 0x7ED5E5C6, - 0xED37EF91, 0x7E9D55FC, - 0xEBAA894E, 0x7E5FE493, - 0xEA1DEBBB, 0x7E1D93E9, - 0xE8922621, 0x7DD6668E, - 0xE70747C3, 0x7D8A5F3F, - 0xE57D5FDA, 0x7D3980EC, - 0xE3F47D95, 0x7CE3CEB1, - 0xE26CB01A, 0x7C894BDD, - 0xE0E60684, 0x7C29FBEE, - 0xDF608FE3, 0x7BC5E28F, - 0xDDDC5B3A, 0x7B5D039D, - 0xDC597781, 0x7AEF6323, - 0xDAD7F3A2, 0x7A7D055B, - 0xD957DE7A, 0x7A05EEAD, - 0xD7D946D7, 0x798A23B1, - 0xD65C3B7B, 0x7909A92C, - 0xD4E0CB14, 0x78848413, - 0xD3670445, 0x77FAB988, - 0xD1EEF59E, 0x776C4EDB, - 0xD078AD9D, 0x76D94988, - 0xCF043AB2, 0x7641AF3C, - 0xCD91AB38, 0x75A585CF, - 0xCC210D78, 0x7504D345, - 0xCAB26FA9, 0x745F9DD1, - 0xC945DFEC, 0x73B5EBD0, - 0xC7DB6C50, 0x7307C3D0, - 0xC67322CD, 0x72552C84, - 0xC50D1148, 0x719E2CD2, - 0xC3A9458F, 0x70E2CBC6, - 0xC247CD5A, 0x70231099, - 0xC0E8B648, 0x6F5F02B1, - 0xBF8C0DE2, 0x6E96A99C, - 0xBE31E19B, 0x6DCA0D14, - 0xBCDA3ECA, 0x6CF934FB, - 0xBB8532AF, 0x6C242960, - 0xBA32CA70, 0x6B4AF278, - 0xB8E31319, 0x6A6D98A4, - 0xB796199B, 0x698C246C, - 0xB64BEACC, 0x68A69E81, - 0xB5049368, 0x67BD0FBC, - 0xB3C0200C, 0x66CF811F, - 0xB27E9D3B, 0x65DDFBD3, - 0xB140175B, 0x64E88926, - 0xB0049AB2, 0x63EF328F, - 0xAECC336B, 0x62F201AC, - 0xAD96ED91, 0x61F1003E, - 0xAC64D510, 0x60EC3830, - 0xAB35F5B5, 0x5FE3B38D, - 0xAA0A5B2D, 0x5ED77C89, - 0xA8E21106, 0x5DC79D7C, - 0xA7BD22AB, 0x5CB420DF, - 0xA69B9B68, 0x5B9D1153, - 0xA57D8666, 0x5A82799A, - 0xA462EEAC, 0x59646497, - 0xA34BDF20, 0x5842DD54, - 0xA2386283, 0x571DEEF9, - 0xA1288376, 0x55F5A4D2, - 0xA01C4C72, 0x54CA0A4A, - 0x9F13C7D0, 0x539B2AEF, - 0x9E0EFFC1, 0x5269126E, - 0x9D0DFE53, 0x5133CC94, - 0x9C10CD70, 0x4FFB654D, - 0x9B1776D9, 0x4EBFE8A4, - 0x9A22042C, 0x4D8162C4, - 0x99307EE0, 0x4C3FDFF3, - 0x9842F043, 0x4AFB6C97, - 0x9759617E, 0x49B41533, - 0x9673DB94, 0x4869E664, - 0x9592675B, 0x471CECE6, - 0x94B50D87, 0x45CD358F, - 0x93DBD69F, 0x447ACD50, - 0x9306CB04, 0x4325C135, - 0x9235F2EB, 0x41CE1E64, - 0x91695663, 0x4073F21D, - 0x90A0FD4E, 0x3F1749B7, - 0x8FDCEF66, 0x3DB832A5, - 0x8F1D343A, 0x3C56BA70, - 0x8E61D32D, 0x3AF2EEB7, - 0x8DAAD37B, 0x398CDD32, - 0x8CF83C30, 0x382493B0, - 0x8C4A142F, 0x36BA2013, - 0x8BA0622F, 0x354D9056, - 0x8AFB2CBA, 0x33DEF287, - 0x8A5A7A30, 0x326E54C7, - 0x89BE50C3, 0x30FBC54D, - 0x8926B677, 0x2F875262, - 0x8893B124, 0x2E110A62, - 0x88054677, 0x2C98FBBA, - 0x877B7BEC, 0x2B1F34EB, - 0x86F656D3, 0x29A3C484, - 0x8675DC4E, 0x2826B928, - 0x85FA1152, 0x26A82185, - 0x8582FAA4, 0x25280C5D, - 0x85109CDC, 0x23A6887E, - 0x84A2FC62, 0x2223A4C5, - 0x843A1D70, 0x209F701C, - 0x83D60411, 0x1F19F97B, - 0x8376B422, 0x1D934FE5, - 0x831C314E, 0x1C0B826A, - 0x82C67F13, 0x1A82A025, - 0x8275A0C0, 0x18F8B83C, - 0x82299971, 0x176DD9DE, - 0x81E26C16, 0x15E21444, - 0x81A01B6C, 0x145576B1, - 0x8162AA03, 0x12C8106E, - 0x812A1A39, 0x1139F0CE, - 0x80F66E3C, 0x0FAB272B, - 0x80C7A80A, 0x0E1BC2E3, - 0x809DC970, 0x0C8BD35E, - 0x8078D40D, 0x0AFB6805, - 0x8058C94C, 0x096A9049, - 0x803DAA69, 0x07D95B9E, - 0x80277872, 0x0647D97C, - 0x80163440, 0x04B6195D, - 0x8009DE7D, 0x03242ABF, - 0x800277A5, 0x01921D1F, - 0x80000000, 0x00000000, - 0x800277A5, 0xFE6DE2E0, - 0x8009DE7D, 0xFCDBD541, - 0x80163440, 0xFB49E6A2, - 0x80277872, 0xF9B82683, - 0x803DAA69, 0xF826A461, - 0x8058C94C, 0xF6956FB6, - 0x8078D40D, 0xF50497FA, - 0x809DC970, 0xF3742CA1, - 0x80C7A80A, 0xF1E43D1C, - 0x80F66E3C, 0xF054D8D4, - 0x812A1A39, 0xEEC60F31, - 0x8162AA03, 0xED37EF91, - 0x81A01B6C, 0xEBAA894E, - 0x81E26C16, 0xEA1DEBBB, - 0x82299971, 0xE8922621, - 0x8275A0C0, 0xE70747C3, - 0x82C67F13, 0xE57D5FDA, - 0x831C314E, 0xE3F47D95, - 0x8376B422, 0xE26CB01A, - 0x83D60411, 0xE0E60684, - 0x843A1D70, 0xDF608FE3, - 0x84A2FC62, 0xDDDC5B3A, - 0x85109CDC, 0xDC597781, - 0x8582FAA4, 0xDAD7F3A2, - 0x85FA1152, 0xD957DE7A, - 0x8675DC4E, 0xD7D946D7, - 0x86F656D3, 0xD65C3B7B, - 0x877B7BEC, 0xD4E0CB14, - 0x88054677, 0xD3670445, - 0x8893B124, 0xD1EEF59E, - 0x8926B677, 0xD078AD9D, - 0x89BE50C3, 0xCF043AB2, - 0x8A5A7A30, 0xCD91AB38, - 0x8AFB2CBA, 0xCC210D78, - 0x8BA0622F, 0xCAB26FA9, - 0x8C4A142F, 0xC945DFEC, - 0x8CF83C30, 0xC7DB6C50, - 0x8DAAD37B, 0xC67322CD, - 0x8E61D32D, 0xC50D1148, - 0x8F1D343A, 0xC3A9458F, - 0x8FDCEF66, 0xC247CD5A, - 0x90A0FD4E, 0xC0E8B648, - 0x91695663, 0xBF8C0DE2, - 0x9235F2EB, 0xBE31E19B, - 0x9306CB04, 0xBCDA3ECA, - 0x93DBD69F, 0xBB8532AF, - 0x94B50D87, 0xBA32CA70, - 0x9592675B, 0xB8E31319, - 0x9673DB94, 0xB796199B, - 0x9759617E, 0xB64BEACC, - 0x9842F043, 0xB5049368, - 0x99307EE0, 0xB3C0200C, - 0x9A22042C, 0xB27E9D3B, - 0x9B1776D9, 0xB140175B, - 0x9C10CD70, 0xB0049AB2, - 0x9D0DFE53, 0xAECC336B, - 0x9E0EFFC1, 0xAD96ED91, - 0x9F13C7D0, 0xAC64D510, - 0xA01C4C72, 0xAB35F5B5, - 0xA1288376, 0xAA0A5B2D, - 0xA2386283, 0xA8E21106, - 0xA34BDF20, 0xA7BD22AB, - 0xA462EEAC, 0xA69B9B68, - 0xA57D8666, 0xA57D8666, - 0xA69B9B68, 0xA462EEAC, - 0xA7BD22AB, 0xA34BDF20, - 0xA8E21106, 0xA2386283, - 0xAA0A5B2D, 0xA1288376, - 0xAB35F5B5, 0xA01C4C72, - 0xAC64D510, 0x9F13C7D0, - 0xAD96ED91, 0x9E0EFFC1, - 0xAECC336B, 0x9D0DFE53, - 0xB0049AB2, 0x9C10CD70, - 0xB140175B, 0x9B1776D9, - 0xB27E9D3B, 0x9A22042C, - 0xB3C0200C, 0x99307EE0, - 0xB5049368, 0x9842F043, - 0xB64BEACC, 0x9759617E, - 0xB796199B, 0x9673DB94, - 0xB8E31319, 0x9592675B, - 0xBA32CA70, 0x94B50D87, - 0xBB8532AF, 0x93DBD69F, - 0xBCDA3ECA, 0x9306CB04, - 0xBE31E19B, 0x9235F2EB, - 0xBF8C0DE2, 0x91695663, - 0xC0E8B648, 0x90A0FD4E, - 0xC247CD5A, 0x8FDCEF66, - 0xC3A9458F, 0x8F1D343A, - 0xC50D1148, 0x8E61D32D, - 0xC67322CD, 0x8DAAD37B, - 0xC7DB6C50, 0x8CF83C30, - 0xC945DFEC, 0x8C4A142F, - 0xCAB26FA9, 0x8BA0622F, - 0xCC210D78, 0x8AFB2CBA, - 0xCD91AB38, 0x8A5A7A30, - 0xCF043AB2, 0x89BE50C3, - 0xD078AD9D, 0x8926B677, - 0xD1EEF59E, 0x8893B124, - 0xD3670445, 0x88054677, - 0xD4E0CB14, 0x877B7BEC, - 0xD65C3B7B, 0x86F656D3, - 0xD7D946D7, 0x8675DC4E, - 0xD957DE7A, 0x85FA1152, - 0xDAD7F3A2, 0x8582FAA4, - 0xDC597781, 0x85109CDC, - 0xDDDC5B3A, 0x84A2FC62, - 0xDF608FE3, 0x843A1D70, - 0xE0E60684, 0x83D60411, - 0xE26CB01A, 0x8376B422, - 0xE3F47D95, 0x831C314E, - 0xE57D5FDA, 0x82C67F13, - 0xE70747C3, 0x8275A0C0, - 0xE8922621, 0x82299971, - 0xEA1DEBBB, 0x81E26C16, - 0xEBAA894E, 0x81A01B6C, - 0xED37EF91, 0x8162AA03, - 0xEEC60F31, 0x812A1A39, - 0xF054D8D4, 0x80F66E3C, - 0xF1E43D1C, 0x80C7A80A, - 0xF3742CA1, 0x809DC970, - 0xF50497FA, 0x8078D40D, - 0xF6956FB6, 0x8058C94C, - 0xF826A461, 0x803DAA69, - 0xF9B82683, 0x80277872, - 0xFB49E6A2, 0x80163440, - 0xFCDBD541, 0x8009DE7D, - 0xFE6DE2E0, 0x800277A5 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 1024 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_1024_q31[1536] = { - 0x7FFFFFFF, 0x00000000, - 0x7FFF6216, 0x00C90F88, - 0x7FFD885A, 0x01921D1F, - 0x7FFA72D1, 0x025B26D7, - 0x7FF62182, 0x03242ABF, - 0x7FF09477, 0x03ED26E6, - 0x7FE9CBC0, 0x04B6195D, - 0x7FE1C76B, 0x057F0034, - 0x7FD8878D, 0x0647D97C, - 0x7FCE0C3E, 0x0710A344, - 0x7FC25596, 0x07D95B9E, - 0x7FB563B2, 0x08A2009A, - 0x7FA736B4, 0x096A9049, - 0x7F97CEBC, 0x0A3308BC, - 0x7F872BF3, 0x0AFB6805, - 0x7F754E7F, 0x0BC3AC35, - 0x7F62368F, 0x0C8BD35E, - 0x7F4DE450, 0x0D53DB92, - 0x7F3857F5, 0x0E1BC2E3, - 0x7F2191B4, 0x0EE38765, - 0x7F0991C3, 0x0FAB272B, - 0x7EF0585F, 0x1072A047, - 0x7ED5E5C6, 0x1139F0CE, - 0x7EBA3A39, 0x120116D4, - 0x7E9D55FC, 0x12C8106E, - 0x7E7F3956, 0x138EDBB0, - 0x7E5FE493, 0x145576B1, - 0x7E3F57FE, 0x151BDF85, - 0x7E1D93E9, 0x15E21444, - 0x7DFA98A7, 0x16A81305, - 0x7DD6668E, 0x176DD9DE, - 0x7DB0FDF7, 0x183366E8, - 0x7D8A5F3F, 0x18F8B83C, - 0x7D628AC5, 0x19BDCBF2, - 0x7D3980EC, 0x1A82A025, - 0x7D0F4218, 0x1B4732EF, - 0x7CE3CEB1, 0x1C0B826A, - 0x7CB72724, 0x1CCF8CB3, - 0x7C894BDD, 0x1D934FE5, - 0x7C5A3D4F, 0x1E56CA1E, - 0x7C29FBEE, 0x1F19F97B, - 0x7BF88830, 0x1FDCDC1A, - 0x7BC5E28F, 0x209F701C, - 0x7B920B89, 0x2161B39F, - 0x7B5D039D, 0x2223A4C5, - 0x7B26CB4F, 0x22E541AE, - 0x7AEF6323, 0x23A6887E, - 0x7AB6CBA3, 0x24677757, - 0x7A7D055B, 0x25280C5D, - 0x7A4210D8, 0x25E845B5, - 0x7A05EEAD, 0x26A82185, - 0x79C89F6D, 0x27679DF4, - 0x798A23B1, 0x2826B928, - 0x794A7C11, 0x28E5714A, - 0x7909A92C, 0x29A3C484, - 0x78C7ABA1, 0x2A61B101, - 0x78848413, 0x2B1F34EB, - 0x78403328, 0x2BDC4E6F, - 0x77FAB988, 0x2C98FBBA, - 0x77B417DF, 0x2D553AFB, - 0x776C4EDB, 0x2E110A62, - 0x77235F2D, 0x2ECC681E, - 0x76D94988, 0x2F875262, - 0x768E0EA5, 0x3041C760, - 0x7641AF3C, 0x30FBC54D, - 0x75F42C0A, 0x31B54A5D, - 0x75A585CF, 0x326E54C7, - 0x7555BD4B, 0x3326E2C2, - 0x7504D345, 0x33DEF287, - 0x74B2C883, 0x3496824F, - 0x745F9DD1, 0x354D9056, - 0x740B53FA, 0x36041AD9, - 0x73B5EBD0, 0x36BA2013, - 0x735F6626, 0x376F9E46, - 0x7307C3D0, 0x382493B0, - 0x72AF05A6, 0x38D8FE93, - 0x72552C84, 0x398CDD32, - 0x71FA3948, 0x3A402DD1, - 0x719E2CD2, 0x3AF2EEB7, - 0x71410804, 0x3BA51E29, - 0x70E2CBC6, 0x3C56BA70, - 0x708378FE, 0x3D07C1D5, - 0x70231099, 0x3DB832A5, - 0x6FC19385, 0x3E680B2C, - 0x6F5F02B1, 0x3F1749B7, - 0x6EFB5F12, 0x3FC5EC97, - 0x6E96A99C, 0x4073F21D, - 0x6E30E349, 0x4121589A, - 0x6DCA0D14, 0x41CE1E64, - 0x6D6227FA, 0x427A41D0, - 0x6CF934FB, 0x4325C135, - 0x6C8F351C, 0x43D09AEC, - 0x6C242960, 0x447ACD50, - 0x6BB812D0, 0x452456BC, - 0x6B4AF278, 0x45CD358F, - 0x6ADCC964, 0x46756827, - 0x6A6D98A4, 0x471CECE6, - 0x69FD614A, 0x47C3C22E, - 0x698C246C, 0x4869E664, - 0x6919E320, 0x490F57EE, - 0x68A69E81, 0x49B41533, - 0x683257AA, 0x4A581C9D, - 0x67BD0FBC, 0x4AFB6C97, - 0x6746C7D7, 0x4B9E038F, - 0x66CF811F, 0x4C3FDFF3, - 0x66573CBB, 0x4CE10034, - 0x65DDFBD3, 0x4D8162C4, - 0x6563BF92, 0x4E210617, - 0x64E88926, 0x4EBFE8A4, - 0x646C59BF, 0x4F5E08E3, - 0x63EF328F, 0x4FFB654D, - 0x637114CC, 0x5097FC5E, - 0x62F201AC, 0x5133CC94, - 0x6271FA69, 0x51CED46E, - 0x61F1003E, 0x5269126E, - 0x616F146B, 0x53028517, - 0x60EC3830, 0x539B2AEF, - 0x60686CCE, 0x5433027D, - 0x5FE3B38D, 0x54CA0A4A, - 0x5F5E0DB3, 0x556040E2, - 0x5ED77C89, 0x55F5A4D2, - 0x5E50015D, 0x568A34A9, - 0x5DC79D7C, 0x571DEEF9, - 0x5D3E5236, 0x57B0D256, - 0x5CB420DF, 0x5842DD54, - 0x5C290ACC, 0x58D40E8C, - 0x5B9D1153, 0x59646497, - 0x5B1035CF, 0x59F3DE12, - 0x5A82799A, 0x5A82799A, - 0x59F3DE12, 0x5B1035CF, - 0x59646497, 0x5B9D1153, - 0x58D40E8C, 0x5C290ACC, - 0x5842DD54, 0x5CB420DF, - 0x57B0D256, 0x5D3E5236, - 0x571DEEF9, 0x5DC79D7C, - 0x568A34A9, 0x5E50015D, - 0x55F5A4D2, 0x5ED77C89, - 0x556040E2, 0x5F5E0DB3, - 0x54CA0A4A, 0x5FE3B38D, - 0x5433027D, 0x60686CCE, - 0x539B2AEF, 0x60EC3830, - 0x53028517, 0x616F146B, - 0x5269126E, 0x61F1003E, - 0x51CED46E, 0x6271FA69, - 0x5133CC94, 0x62F201AC, - 0x5097FC5E, 0x637114CC, - 0x4FFB654D, 0x63EF328F, - 0x4F5E08E3, 0x646C59BF, - 0x4EBFE8A4, 0x64E88926, - 0x4E210617, 0x6563BF92, - 0x4D8162C4, 0x65DDFBD3, - 0x4CE10034, 0x66573CBB, - 0x4C3FDFF3, 0x66CF811F, - 0x4B9E038F, 0x6746C7D7, - 0x4AFB6C97, 0x67BD0FBC, - 0x4A581C9D, 0x683257AA, - 0x49B41533, 0x68A69E81, - 0x490F57EE, 0x6919E320, - 0x4869E664, 0x698C246C, - 0x47C3C22E, 0x69FD614A, - 0x471CECE6, 0x6A6D98A4, - 0x46756827, 0x6ADCC964, - 0x45CD358F, 0x6B4AF278, - 0x452456BC, 0x6BB812D0, - 0x447ACD50, 0x6C242960, - 0x43D09AEC, 0x6C8F351C, - 0x4325C135, 0x6CF934FB, - 0x427A41D0, 0x6D6227FA, - 0x41CE1E64, 0x6DCA0D14, - 0x4121589A, 0x6E30E349, - 0x4073F21D, 0x6E96A99C, - 0x3FC5EC97, 0x6EFB5F12, - 0x3F1749B7, 0x6F5F02B1, - 0x3E680B2C, 0x6FC19385, - 0x3DB832A5, 0x70231099, - 0x3D07C1D5, 0x708378FE, - 0x3C56BA70, 0x70E2CBC6, - 0x3BA51E29, 0x71410804, - 0x3AF2EEB7, 0x719E2CD2, - 0x3A402DD1, 0x71FA3948, - 0x398CDD32, 0x72552C84, - 0x38D8FE93, 0x72AF05A6, - 0x382493B0, 0x7307C3D0, - 0x376F9E46, 0x735F6626, - 0x36BA2013, 0x73B5EBD0, - 0x36041AD9, 0x740B53FA, - 0x354D9056, 0x745F9DD1, - 0x3496824F, 0x74B2C883, - 0x33DEF287, 0x7504D345, - 0x3326E2C2, 0x7555BD4B, - 0x326E54C7, 0x75A585CF, - 0x31B54A5D, 0x75F42C0A, - 0x30FBC54D, 0x7641AF3C, - 0x3041C760, 0x768E0EA5, - 0x2F875262, 0x76D94988, - 0x2ECC681E, 0x77235F2D, - 0x2E110A62, 0x776C4EDB, - 0x2D553AFB, 0x77B417DF, - 0x2C98FBBA, 0x77FAB988, - 0x2BDC4E6F, 0x78403328, - 0x2B1F34EB, 0x78848413, - 0x2A61B101, 0x78C7ABA1, - 0x29A3C484, 0x7909A92C, - 0x28E5714A, 0x794A7C11, - 0x2826B928, 0x798A23B1, - 0x27679DF4, 0x79C89F6D, - 0x26A82185, 0x7A05EEAD, - 0x25E845B5, 0x7A4210D8, - 0x25280C5D, 0x7A7D055B, - 0x24677757, 0x7AB6CBA3, - 0x23A6887E, 0x7AEF6323, - 0x22E541AE, 0x7B26CB4F, - 0x2223A4C5, 0x7B5D039D, - 0x2161B39F, 0x7B920B89, - 0x209F701C, 0x7BC5E28F, - 0x1FDCDC1A, 0x7BF88830, - 0x1F19F97B, 0x7C29FBEE, - 0x1E56CA1E, 0x7C5A3D4F, - 0x1D934FE5, 0x7C894BDD, - 0x1CCF8CB3, 0x7CB72724, - 0x1C0B826A, 0x7CE3CEB1, - 0x1B4732EF, 0x7D0F4218, - 0x1A82A025, 0x7D3980EC, - 0x19BDCBF2, 0x7D628AC5, - 0x18F8B83C, 0x7D8A5F3F, - 0x183366E8, 0x7DB0FDF7, - 0x176DD9DE, 0x7DD6668E, - 0x16A81305, 0x7DFA98A7, - 0x15E21444, 0x7E1D93E9, - 0x151BDF85, 0x7E3F57FE, - 0x145576B1, 0x7E5FE493, - 0x138EDBB0, 0x7E7F3956, - 0x12C8106E, 0x7E9D55FC, - 0x120116D4, 0x7EBA3A39, - 0x1139F0CE, 0x7ED5E5C6, - 0x1072A047, 0x7EF0585F, - 0x0FAB272B, 0x7F0991C3, - 0x0EE38765, 0x7F2191B4, - 0x0E1BC2E3, 0x7F3857F5, - 0x0D53DB92, 0x7F4DE450, - 0x0C8BD35E, 0x7F62368F, - 0x0BC3AC35, 0x7F754E7F, - 0x0AFB6805, 0x7F872BF3, - 0x0A3308BC, 0x7F97CEBC, - 0x096A9049, 0x7FA736B4, - 0x08A2009A, 0x7FB563B2, - 0x07D95B9E, 0x7FC25596, - 0x0710A344, 0x7FCE0C3E, - 0x0647D97C, 0x7FD8878D, - 0x057F0034, 0x7FE1C76B, - 0x04B6195D, 0x7FE9CBC0, - 0x03ED26E6, 0x7FF09477, - 0x03242ABF, 0x7FF62182, - 0x025B26D7, 0x7FFA72D1, - 0x01921D1F, 0x7FFD885A, - 0x00C90F88, 0x7FFF6216, - 0x00000000, 0x7FFFFFFF, - 0xFF36F078, 0x7FFF6216, - 0xFE6DE2E0, 0x7FFD885A, - 0xFDA4D928, 0x7FFA72D1, - 0xFCDBD541, 0x7FF62182, - 0xFC12D919, 0x7FF09477, - 0xFB49E6A2, 0x7FE9CBC0, - 0xFA80FFCB, 0x7FE1C76B, - 0xF9B82683, 0x7FD8878D, - 0xF8EF5CBB, 0x7FCE0C3E, - 0xF826A461, 0x7FC25596, - 0xF75DFF65, 0x7FB563B2, - 0xF6956FB6, 0x7FA736B4, - 0xF5CCF743, 0x7F97CEBC, - 0xF50497FA, 0x7F872BF3, - 0xF43C53CA, 0x7F754E7F, - 0xF3742CA1, 0x7F62368F, - 0xF2AC246D, 0x7F4DE450, - 0xF1E43D1C, 0x7F3857F5, - 0xF11C789A, 0x7F2191B4, - 0xF054D8D4, 0x7F0991C3, - 0xEF8D5FB8, 0x7EF0585F, - 0xEEC60F31, 0x7ED5E5C6, - 0xEDFEE92B, 0x7EBA3A39, - 0xED37EF91, 0x7E9D55FC, - 0xEC71244F, 0x7E7F3956, - 0xEBAA894E, 0x7E5FE493, - 0xEAE4207A, 0x7E3F57FE, - 0xEA1DEBBB, 0x7E1D93E9, - 0xE957ECFB, 0x7DFA98A7, - 0xE8922621, 0x7DD6668E, - 0xE7CC9917, 0x7DB0FDF7, - 0xE70747C3, 0x7D8A5F3F, - 0xE642340D, 0x7D628AC5, - 0xE57D5FDA, 0x7D3980EC, - 0xE4B8CD10, 0x7D0F4218, - 0xE3F47D95, 0x7CE3CEB1, - 0xE330734C, 0x7CB72724, - 0xE26CB01A, 0x7C894BDD, - 0xE1A935E1, 0x7C5A3D4F, - 0xE0E60684, 0x7C29FBEE, - 0xE02323E5, 0x7BF88830, - 0xDF608FE3, 0x7BC5E28F, - 0xDE9E4C60, 0x7B920B89, - 0xDDDC5B3A, 0x7B5D039D, - 0xDD1ABE51, 0x7B26CB4F, - 0xDC597781, 0x7AEF6323, - 0xDB9888A8, 0x7AB6CBA3, - 0xDAD7F3A2, 0x7A7D055B, - 0xDA17BA4A, 0x7A4210D8, - 0xD957DE7A, 0x7A05EEAD, - 0xD898620C, 0x79C89F6D, - 0xD7D946D7, 0x798A23B1, - 0xD71A8EB5, 0x794A7C11, - 0xD65C3B7B, 0x7909A92C, - 0xD59E4EFE, 0x78C7ABA1, - 0xD4E0CB14, 0x78848413, - 0xD423B190, 0x78403328, - 0xD3670445, 0x77FAB988, - 0xD2AAC504, 0x77B417DF, - 0xD1EEF59E, 0x776C4EDB, - 0xD13397E1, 0x77235F2D, - 0xD078AD9D, 0x76D94988, - 0xCFBE389F, 0x768E0EA5, - 0xCF043AB2, 0x7641AF3C, - 0xCE4AB5A2, 0x75F42C0A, - 0xCD91AB38, 0x75A585CF, - 0xCCD91D3D, 0x7555BD4B, - 0xCC210D78, 0x7504D345, - 0xCB697DB0, 0x74B2C883, - 0xCAB26FA9, 0x745F9DD1, - 0xC9FBE527, 0x740B53FA, - 0xC945DFEC, 0x73B5EBD0, - 0xC89061BA, 0x735F6626, - 0xC7DB6C50, 0x7307C3D0, - 0xC727016C, 0x72AF05A6, - 0xC67322CD, 0x72552C84, - 0xC5BFD22E, 0x71FA3948, - 0xC50D1148, 0x719E2CD2, - 0xC45AE1D7, 0x71410804, - 0xC3A9458F, 0x70E2CBC6, - 0xC2F83E2A, 0x708378FE, - 0xC247CD5A, 0x70231099, - 0xC197F4D3, 0x6FC19385, - 0xC0E8B648, 0x6F5F02B1, - 0xC03A1368, 0x6EFB5F12, - 0xBF8C0DE2, 0x6E96A99C, - 0xBEDEA765, 0x6E30E349, - 0xBE31E19B, 0x6DCA0D14, - 0xBD85BE2F, 0x6D6227FA, - 0xBCDA3ECA, 0x6CF934FB, - 0xBC2F6513, 0x6C8F351C, - 0xBB8532AF, 0x6C242960, - 0xBADBA943, 0x6BB812D0, - 0xBA32CA70, 0x6B4AF278, - 0xB98A97D8, 0x6ADCC964, - 0xB8E31319, 0x6A6D98A4, - 0xB83C3DD1, 0x69FD614A, - 0xB796199B, 0x698C246C, - 0xB6F0A811, 0x6919E320, - 0xB64BEACC, 0x68A69E81, - 0xB5A7E362, 0x683257AA, - 0xB5049368, 0x67BD0FBC, - 0xB461FC70, 0x6746C7D7, - 0xB3C0200C, 0x66CF811F, - 0xB31EFFCB, 0x66573CBB, - 0xB27E9D3B, 0x65DDFBD3, - 0xB1DEF9E8, 0x6563BF92, - 0xB140175B, 0x64E88926, - 0xB0A1F71C, 0x646C59BF, - 0xB0049AB2, 0x63EF328F, - 0xAF6803A1, 0x637114CC, - 0xAECC336B, 0x62F201AC, - 0xAE312B91, 0x6271FA69, - 0xAD96ED91, 0x61F1003E, - 0xACFD7AE8, 0x616F146B, - 0xAC64D510, 0x60EC3830, - 0xABCCFD82, 0x60686CCE, - 0xAB35F5B5, 0x5FE3B38D, - 0xAA9FBF1D, 0x5F5E0DB3, - 0xAA0A5B2D, 0x5ED77C89, - 0xA975CB56, 0x5E50015D, - 0xA8E21106, 0x5DC79D7C, - 0xA84F2DA9, 0x5D3E5236, - 0xA7BD22AB, 0x5CB420DF, - 0xA72BF173, 0x5C290ACC, - 0xA69B9B68, 0x5B9D1153, - 0xA60C21ED, 0x5B1035CF, - 0xA57D8666, 0x5A82799A, - 0xA4EFCA31, 0x59F3DE12, - 0xA462EEAC, 0x59646497, - 0xA3D6F533, 0x58D40E8C, - 0xA34BDF20, 0x5842DD54, - 0xA2C1ADC9, 0x57B0D256, - 0xA2386283, 0x571DEEF9, - 0xA1AFFEA2, 0x568A34A9, - 0xA1288376, 0x55F5A4D2, - 0xA0A1F24C, 0x556040E2, - 0xA01C4C72, 0x54CA0A4A, - 0x9F979331, 0x5433027D, - 0x9F13C7D0, 0x539B2AEF, - 0x9E90EB94, 0x53028517, - 0x9E0EFFC1, 0x5269126E, - 0x9D8E0596, 0x51CED46E, - 0x9D0DFE53, 0x5133CC94, - 0x9C8EEB33, 0x5097FC5E, - 0x9C10CD70, 0x4FFB654D, - 0x9B93A640, 0x4F5E08E3, - 0x9B1776D9, 0x4EBFE8A4, - 0x9A9C406D, 0x4E210617, - 0x9A22042C, 0x4D8162C4, - 0x99A8C344, 0x4CE10034, - 0x99307EE0, 0x4C3FDFF3, - 0x98B93828, 0x4B9E038F, - 0x9842F043, 0x4AFB6C97, - 0x97CDA855, 0x4A581C9D, - 0x9759617E, 0x49B41533, - 0x96E61CDF, 0x490F57EE, - 0x9673DB94, 0x4869E664, - 0x96029EB5, 0x47C3C22E, - 0x9592675B, 0x471CECE6, - 0x9523369B, 0x46756827, - 0x94B50D87, 0x45CD358F, - 0x9447ED2F, 0x452456BC, - 0x93DBD69F, 0x447ACD50, - 0x9370CAE4, 0x43D09AEC, - 0x9306CB04, 0x4325C135, - 0x929DD805, 0x427A41D0, - 0x9235F2EB, 0x41CE1E64, - 0x91CF1CB6, 0x4121589A, - 0x91695663, 0x4073F21D, - 0x9104A0ED, 0x3FC5EC97, - 0x90A0FD4E, 0x3F1749B7, - 0x903E6C7A, 0x3E680B2C, - 0x8FDCEF66, 0x3DB832A5, - 0x8F7C8701, 0x3D07C1D5, - 0x8F1D343A, 0x3C56BA70, - 0x8EBEF7FB, 0x3BA51E29, - 0x8E61D32D, 0x3AF2EEB7, - 0x8E05C6B7, 0x3A402DD1, - 0x8DAAD37B, 0x398CDD32, - 0x8D50FA59, 0x38D8FE93, - 0x8CF83C30, 0x382493B0, - 0x8CA099D9, 0x376F9E46, - 0x8C4A142F, 0x36BA2013, - 0x8BF4AC05, 0x36041AD9, - 0x8BA0622F, 0x354D9056, - 0x8B4D377C, 0x3496824F, - 0x8AFB2CBA, 0x33DEF287, - 0x8AAA42B4, 0x3326E2C2, - 0x8A5A7A30, 0x326E54C7, - 0x8A0BD3F5, 0x31B54A5D, - 0x89BE50C3, 0x30FBC54D, - 0x8971F15A, 0x3041C760, - 0x8926B677, 0x2F875262, - 0x88DCA0D3, 0x2ECC681E, - 0x8893B124, 0x2E110A62, - 0x884BE820, 0x2D553AFB, - 0x88054677, 0x2C98FBBA, - 0x87BFCCD7, 0x2BDC4E6F, - 0x877B7BEC, 0x2B1F34EB, - 0x8738545E, 0x2A61B101, - 0x86F656D3, 0x29A3C484, - 0x86B583EE, 0x28E5714A, - 0x8675DC4E, 0x2826B928, - 0x86376092, 0x27679DF4, - 0x85FA1152, 0x26A82185, - 0x85BDEF27, 0x25E845B5, - 0x8582FAA4, 0x25280C5D, - 0x8549345C, 0x24677757, - 0x85109CDC, 0x23A6887E, - 0x84D934B0, 0x22E541AE, - 0x84A2FC62, 0x2223A4C5, - 0x846DF476, 0x2161B39F, - 0x843A1D70, 0x209F701C, - 0x840777CF, 0x1FDCDC1A, - 0x83D60411, 0x1F19F97B, - 0x83A5C2B0, 0x1E56CA1E, - 0x8376B422, 0x1D934FE5, - 0x8348D8DB, 0x1CCF8CB3, - 0x831C314E, 0x1C0B826A, - 0x82F0BDE8, 0x1B4732EF, - 0x82C67F13, 0x1A82A025, - 0x829D753A, 0x19BDCBF2, - 0x8275A0C0, 0x18F8B83C, - 0x824F0208, 0x183366E8, - 0x82299971, 0x176DD9DE, - 0x82056758, 0x16A81305, - 0x81E26C16, 0x15E21444, - 0x81C0A801, 0x151BDF85, - 0x81A01B6C, 0x145576B1, - 0x8180C6A9, 0x138EDBB0, - 0x8162AA03, 0x12C8106E, - 0x8145C5C6, 0x120116D4, - 0x812A1A39, 0x1139F0CE, - 0x810FA7A0, 0x1072A047, - 0x80F66E3C, 0x0FAB272B, - 0x80DE6E4C, 0x0EE38765, - 0x80C7A80A, 0x0E1BC2E3, - 0x80B21BAF, 0x0D53DB92, - 0x809DC970, 0x0C8BD35E, - 0x808AB180, 0x0BC3AC35, - 0x8078D40D, 0x0AFB6805, - 0x80683143, 0x0A3308BC, - 0x8058C94C, 0x096A9049, - 0x804A9C4D, 0x08A2009A, - 0x803DAA69, 0x07D95B9E, - 0x8031F3C1, 0x0710A344, - 0x80277872, 0x0647D97C, - 0x801E3894, 0x057F0034, - 0x80163440, 0x04B6195D, - 0x800F6B88, 0x03ED26E6, - 0x8009DE7D, 0x03242ABF, - 0x80058D2E, 0x025B26D7, - 0x800277A5, 0x01921D1F, - 0x80009DE9, 0x00C90F88, - 0x80000000, 0x00000000, - 0x80009DE9, 0xFF36F078, - 0x800277A5, 0xFE6DE2E0, - 0x80058D2E, 0xFDA4D928, - 0x8009DE7D, 0xFCDBD541, - 0x800F6B88, 0xFC12D919, - 0x80163440, 0xFB49E6A2, - 0x801E3894, 0xFA80FFCB, - 0x80277872, 0xF9B82683, - 0x8031F3C1, 0xF8EF5CBB, - 0x803DAA69, 0xF826A461, - 0x804A9C4D, 0xF75DFF65, - 0x8058C94C, 0xF6956FB6, - 0x80683143, 0xF5CCF743, - 0x8078D40D, 0xF50497FA, - 0x808AB180, 0xF43C53CA, - 0x809DC970, 0xF3742CA1, - 0x80B21BAF, 0xF2AC246D, - 0x80C7A80A, 0xF1E43D1C, - 0x80DE6E4C, 0xF11C789A, - 0x80F66E3C, 0xF054D8D4, - 0x810FA7A0, 0xEF8D5FB8, - 0x812A1A39, 0xEEC60F31, - 0x8145C5C6, 0xEDFEE92B, - 0x8162AA03, 0xED37EF91, - 0x8180C6A9, 0xEC71244F, - 0x81A01B6C, 0xEBAA894E, - 0x81C0A801, 0xEAE4207A, - 0x81E26C16, 0xEA1DEBBB, - 0x82056758, 0xE957ECFB, - 0x82299971, 0xE8922621, - 0x824F0208, 0xE7CC9917, - 0x8275A0C0, 0xE70747C3, - 0x829D753A, 0xE642340D, - 0x82C67F13, 0xE57D5FDA, - 0x82F0BDE8, 0xE4B8CD10, - 0x831C314E, 0xE3F47D95, - 0x8348D8DB, 0xE330734C, - 0x8376B422, 0xE26CB01A, - 0x83A5C2B0, 0xE1A935E1, - 0x83D60411, 0xE0E60684, - 0x840777CF, 0xE02323E5, - 0x843A1D70, 0xDF608FE3, - 0x846DF476, 0xDE9E4C60, - 0x84A2FC62, 0xDDDC5B3A, - 0x84D934B0, 0xDD1ABE51, - 0x85109CDC, 0xDC597781, - 0x8549345C, 0xDB9888A8, - 0x8582FAA4, 0xDAD7F3A2, - 0x85BDEF27, 0xDA17BA4A, - 0x85FA1152, 0xD957DE7A, - 0x86376092, 0xD898620C, - 0x8675DC4E, 0xD7D946D7, - 0x86B583EE, 0xD71A8EB5, - 0x86F656D3, 0xD65C3B7B, - 0x8738545E, 0xD59E4EFE, - 0x877B7BEC, 0xD4E0CB14, - 0x87BFCCD7, 0xD423B190, - 0x88054677, 0xD3670445, - 0x884BE820, 0xD2AAC504, - 0x8893B124, 0xD1EEF59E, - 0x88DCA0D3, 0xD13397E1, - 0x8926B677, 0xD078AD9D, - 0x8971F15A, 0xCFBE389F, - 0x89BE50C3, 0xCF043AB2, - 0x8A0BD3F5, 0xCE4AB5A2, - 0x8A5A7A30, 0xCD91AB38, - 0x8AAA42B4, 0xCCD91D3D, - 0x8AFB2CBA, 0xCC210D78, - 0x8B4D377C, 0xCB697DB0, - 0x8BA0622F, 0xCAB26FA9, - 0x8BF4AC05, 0xC9FBE527, - 0x8C4A142F, 0xC945DFEC, - 0x8CA099D9, 0xC89061BA, - 0x8CF83C30, 0xC7DB6C50, - 0x8D50FA59, 0xC727016C, - 0x8DAAD37B, 0xC67322CD, - 0x8E05C6B7, 0xC5BFD22E, - 0x8E61D32D, 0xC50D1148, - 0x8EBEF7FB, 0xC45AE1D7, - 0x8F1D343A, 0xC3A9458F, - 0x8F7C8701, 0xC2F83E2A, - 0x8FDCEF66, 0xC247CD5A, - 0x903E6C7A, 0xC197F4D3, - 0x90A0FD4E, 0xC0E8B648, - 0x9104A0ED, 0xC03A1368, - 0x91695663, 0xBF8C0DE2, - 0x91CF1CB6, 0xBEDEA765, - 0x9235F2EB, 0xBE31E19B, - 0x929DD805, 0xBD85BE2F, - 0x9306CB04, 0xBCDA3ECA, - 0x9370CAE4, 0xBC2F6513, - 0x93DBD69F, 0xBB8532AF, - 0x9447ED2F, 0xBADBA943, - 0x94B50D87, 0xBA32CA70, - 0x9523369B, 0xB98A97D8, - 0x9592675B, 0xB8E31319, - 0x96029EB5, 0xB83C3DD1, - 0x9673DB94, 0xB796199B, - 0x96E61CDF, 0xB6F0A811, - 0x9759617E, 0xB64BEACC, - 0x97CDA855, 0xB5A7E362, - 0x9842F043, 0xB5049368, - 0x98B93828, 0xB461FC70, - 0x99307EE0, 0xB3C0200C, - 0x99A8C344, 0xB31EFFCB, - 0x9A22042C, 0xB27E9D3B, - 0x9A9C406D, 0xB1DEF9E8, - 0x9B1776D9, 0xB140175B, - 0x9B93A640, 0xB0A1F71C, - 0x9C10CD70, 0xB0049AB2, - 0x9C8EEB33, 0xAF6803A1, - 0x9D0DFE53, 0xAECC336B, - 0x9D8E0596, 0xAE312B91, - 0x9E0EFFC1, 0xAD96ED91, - 0x9E90EB94, 0xACFD7AE8, - 0x9F13C7D0, 0xAC64D510, - 0x9F979331, 0xABCCFD82, - 0xA01C4C72, 0xAB35F5B5, - 0xA0A1F24C, 0xAA9FBF1D, - 0xA1288376, 0xAA0A5B2D, - 0xA1AFFEA2, 0xA975CB56, - 0xA2386283, 0xA8E21106, - 0xA2C1ADC9, 0xA84F2DA9, - 0xA34BDF20, 0xA7BD22AB, - 0xA3D6F533, 0xA72BF173, - 0xA462EEAC, 0xA69B9B68, - 0xA4EFCA31, 0xA60C21ED, - 0xA57D8666, 0xA57D8666, - 0xA60C21ED, 0xA4EFCA31, - 0xA69B9B68, 0xA462EEAC, - 0xA72BF173, 0xA3D6F533, - 0xA7BD22AB, 0xA34BDF20, - 0xA84F2DA9, 0xA2C1ADC9, - 0xA8E21106, 0xA2386283, - 0xA975CB56, 0xA1AFFEA2, - 0xAA0A5B2D, 0xA1288376, - 0xAA9FBF1D, 0xA0A1F24C, - 0xAB35F5B5, 0xA01C4C72, - 0xABCCFD82, 0x9F979331, - 0xAC64D510, 0x9F13C7D0, - 0xACFD7AE8, 0x9E90EB94, - 0xAD96ED91, 0x9E0EFFC1, - 0xAE312B91, 0x9D8E0596, - 0xAECC336B, 0x9D0DFE53, - 0xAF6803A1, 0x9C8EEB33, - 0xB0049AB2, 0x9C10CD70, - 0xB0A1F71C, 0x9B93A640, - 0xB140175B, 0x9B1776D9, - 0xB1DEF9E8, 0x9A9C406D, - 0xB27E9D3B, 0x9A22042C, - 0xB31EFFCB, 0x99A8C344, - 0xB3C0200C, 0x99307EE0, - 0xB461FC70, 0x98B93828, - 0xB5049368, 0x9842F043, - 0xB5A7E362, 0x97CDA855, - 0xB64BEACC, 0x9759617E, - 0xB6F0A811, 0x96E61CDF, - 0xB796199B, 0x9673DB94, - 0xB83C3DD1, 0x96029EB5, - 0xB8E31319, 0x9592675B, - 0xB98A97D8, 0x9523369B, - 0xBA32CA70, 0x94B50D87, - 0xBADBA943, 0x9447ED2F, - 0xBB8532AF, 0x93DBD69F, - 0xBC2F6513, 0x9370CAE4, - 0xBCDA3ECA, 0x9306CB04, - 0xBD85BE2F, 0x929DD805, - 0xBE31E19B, 0x9235F2EB, - 0xBEDEA765, 0x91CF1CB6, - 0xBF8C0DE2, 0x91695663, - 0xC03A1368, 0x9104A0ED, - 0xC0E8B648, 0x90A0FD4E, - 0xC197F4D3, 0x903E6C7A, - 0xC247CD5A, 0x8FDCEF66, - 0xC2F83E2A, 0x8F7C8701, - 0xC3A9458F, 0x8F1D343A, - 0xC45AE1D7, 0x8EBEF7FB, - 0xC50D1148, 0x8E61D32D, - 0xC5BFD22E, 0x8E05C6B7, - 0xC67322CD, 0x8DAAD37B, - 0xC727016C, 0x8D50FA59, - 0xC7DB6C50, 0x8CF83C30, - 0xC89061BA, 0x8CA099D9, - 0xC945DFEC, 0x8C4A142F, - 0xC9FBE527, 0x8BF4AC05, - 0xCAB26FA9, 0x8BA0622F, - 0xCB697DB0, 0x8B4D377C, - 0xCC210D78, 0x8AFB2CBA, - 0xCCD91D3D, 0x8AAA42B4, - 0xCD91AB38, 0x8A5A7A30, - 0xCE4AB5A2, 0x8A0BD3F5, - 0xCF043AB2, 0x89BE50C3, - 0xCFBE389F, 0x8971F15A, - 0xD078AD9D, 0x8926B677, - 0xD13397E1, 0x88DCA0D3, - 0xD1EEF59E, 0x8893B124, - 0xD2AAC504, 0x884BE820, - 0xD3670445, 0x88054677, - 0xD423B190, 0x87BFCCD7, - 0xD4E0CB14, 0x877B7BEC, - 0xD59E4EFE, 0x8738545E, - 0xD65C3B7B, 0x86F656D3, - 0xD71A8EB5, 0x86B583EE, - 0xD7D946D7, 0x8675DC4E, - 0xD898620C, 0x86376092, - 0xD957DE7A, 0x85FA1152, - 0xDA17BA4A, 0x85BDEF27, - 0xDAD7F3A2, 0x8582FAA4, - 0xDB9888A8, 0x8549345C, - 0xDC597781, 0x85109CDC, - 0xDD1ABE51, 0x84D934B0, - 0xDDDC5B3A, 0x84A2FC62, - 0xDE9E4C60, 0x846DF476, - 0xDF608FE3, 0x843A1D70, - 0xE02323E5, 0x840777CF, - 0xE0E60684, 0x83D60411, - 0xE1A935E1, 0x83A5C2B0, - 0xE26CB01A, 0x8376B422, - 0xE330734C, 0x8348D8DB, - 0xE3F47D95, 0x831C314E, - 0xE4B8CD10, 0x82F0BDE8, - 0xE57D5FDA, 0x82C67F13, - 0xE642340D, 0x829D753A, - 0xE70747C3, 0x8275A0C0, - 0xE7CC9917, 0x824F0208, - 0xE8922621, 0x82299971, - 0xE957ECFB, 0x82056758, - 0xEA1DEBBB, 0x81E26C16, - 0xEAE4207A, 0x81C0A801, - 0xEBAA894E, 0x81A01B6C, - 0xEC71244F, 0x8180C6A9, - 0xED37EF91, 0x8162AA03, - 0xEDFEE92B, 0x8145C5C6, - 0xEEC60F31, 0x812A1A39, - 0xEF8D5FB8, 0x810FA7A0, - 0xF054D8D4, 0x80F66E3C, - 0xF11C789A, 0x80DE6E4C, - 0xF1E43D1C, 0x80C7A80A, - 0xF2AC246D, 0x80B21BAF, - 0xF3742CA1, 0x809DC970, - 0xF43C53CA, 0x808AB180, - 0xF50497FA, 0x8078D40D, - 0xF5CCF743, 0x80683143, - 0xF6956FB6, 0x8058C94C, - 0xF75DFF65, 0x804A9C4D, - 0xF826A461, 0x803DAA69, - 0xF8EF5CBB, 0x8031F3C1, - 0xF9B82683, 0x80277872, - 0xFA80FFCB, 0x801E3894, - 0xFB49E6A2, 0x80163440, - 0xFC12D919, 0x800F6B88, - 0xFCDBD541, 0x8009DE7D, - 0xFDA4D928, 0x80058D2E, - 0xFE6DE2E0, 0x800277A5, - 0xFF36F078, 0x80009DE9 -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 2048 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_2048_q31[3072] = { - 0x7FFFFFFF, 0x00000000, - 0x7FFFD885, 0x006487E3, - 0x7FFF6216, 0x00C90F88, - 0x7FFE9CB2, 0x012D96B0, - 0x7FFD885A, 0x01921D1F, - 0x7FFC250F, 0x01F6A296, - 0x7FFA72D1, 0x025B26D7, - 0x7FF871A1, 0x02BFA9A4, - 0x7FF62182, 0x03242ABF, - 0x7FF38273, 0x0388A9E9, - 0x7FF09477, 0x03ED26E6, - 0x7FED5790, 0x0451A176, - 0x7FE9CBC0, 0x04B6195D, - 0x7FE5F108, 0x051A8E5C, - 0x7FE1C76B, 0x057F0034, - 0x7FDD4EEC, 0x05E36EA9, - 0x7FD8878D, 0x0647D97C, - 0x7FD37152, 0x06AC406F, - 0x7FCE0C3E, 0x0710A344, - 0x7FC85853, 0x077501BE, - 0x7FC25596, 0x07D95B9E, - 0x7FBC040A, 0x083DB0A7, - 0x7FB563B2, 0x08A2009A, - 0x7FAE7494, 0x09064B3A, - 0x7FA736B4, 0x096A9049, - 0x7F9FAA15, 0x09CECF89, - 0x7F97CEBC, 0x0A3308BC, - 0x7F8FA4AF, 0x0A973BA5, - 0x7F872BF3, 0x0AFB6805, - 0x7F7E648B, 0x0B5F8D9F, - 0x7F754E7F, 0x0BC3AC35, - 0x7F6BE9D4, 0x0C27C389, - 0x7F62368F, 0x0C8BD35E, - 0x7F5834B6, 0x0CEFDB75, - 0x7F4DE450, 0x0D53DB92, - 0x7F434563, 0x0DB7D376, - 0x7F3857F5, 0x0E1BC2E3, - 0x7F2D1C0E, 0x0E7FA99D, - 0x7F2191B4, 0x0EE38765, - 0x7F15B8EE, 0x0F475BFE, - 0x7F0991C3, 0x0FAB272B, - 0x7EFD1C3C, 0x100EE8AD, - 0x7EF0585F, 0x1072A047, - 0x7EE34635, 0x10D64DBC, - 0x7ED5E5C6, 0x1139F0CE, - 0x7EC8371A, 0x119D8940, - 0x7EBA3A39, 0x120116D4, - 0x7EABEF2C, 0x1264994E, - 0x7E9D55FC, 0x12C8106E, - 0x7E8E6EB1, 0x132B7BF9, - 0x7E7F3956, 0x138EDBB0, - 0x7E6FB5F3, 0x13F22F57, - 0x7E5FE493, 0x145576B1, - 0x7E4FC53E, 0x14B8B17F, - 0x7E3F57FE, 0x151BDF85, - 0x7E2E9CDF, 0x157F0086, - 0x7E1D93E9, 0x15E21444, - 0x7E0C3D29, 0x16451A83, - 0x7DFA98A7, 0x16A81305, - 0x7DE8A670, 0x170AFD8D, - 0x7DD6668E, 0x176DD9DE, - 0x7DC3D90D, 0x17D0A7BB, - 0x7DB0FDF7, 0x183366E8, - 0x7D9DD55A, 0x18961727, - 0x7D8A5F3F, 0x18F8B83C, - 0x7D769BB5, 0x195B49E9, - 0x7D628AC5, 0x19BDCBF2, - 0x7D4E2C7E, 0x1A203E1B, - 0x7D3980EC, 0x1A82A025, - 0x7D24881A, 0x1AE4F1D6, - 0x7D0F4218, 0x1B4732EF, - 0x7CF9AEF0, 0x1BA96334, - 0x7CE3CEB1, 0x1C0B826A, - 0x7CCDA168, 0x1C6D9053, - 0x7CB72724, 0x1CCF8CB3, - 0x7CA05FF1, 0x1D31774D, - 0x7C894BDD, 0x1D934FE5, - 0x7C71EAF8, 0x1DF5163F, - 0x7C5A3D4F, 0x1E56CA1E, - 0x7C4242F2, 0x1EB86B46, - 0x7C29FBEE, 0x1F19F97B, - 0x7C116853, 0x1F7B7480, - 0x7BF88830, 0x1FDCDC1A, - 0x7BDF5B94, 0x203E300D, - 0x7BC5E28F, 0x209F701C, - 0x7BAC1D31, 0x21009C0B, - 0x7B920B89, 0x2161B39F, - 0x7B77ADA8, 0x21C2B69C, - 0x7B5D039D, 0x2223A4C5, - 0x7B420D7A, 0x22847DDF, - 0x7B26CB4F, 0x22E541AE, - 0x7B0B3D2C, 0x2345EFF7, - 0x7AEF6323, 0x23A6887E, - 0x7AD33D45, 0x24070B07, - 0x7AB6CBA3, 0x24677757, - 0x7A9A0E4F, 0x24C7CD32, - 0x7A7D055B, 0x25280C5D, - 0x7A5FB0D8, 0x2588349D, - 0x7A4210D8, 0x25E845B5, - 0x7A24256E, 0x26483F6C, - 0x7A05EEAD, 0x26A82185, - 0x79E76CA6, 0x2707EBC6, - 0x79C89F6D, 0x27679DF4, - 0x79A98715, 0x27C737D2, - 0x798A23B1, 0x2826B928, - 0x796A7554, 0x288621B9, - 0x794A7C11, 0x28E5714A, - 0x792A37FE, 0x2944A7A2, - 0x7909A92C, 0x29A3C484, - 0x78E8CFB1, 0x2A02C7B8, - 0x78C7ABA1, 0x2A61B101, - 0x78A63D10, 0x2AC08025, - 0x78848413, 0x2B1F34EB, - 0x786280BF, 0x2B7DCF17, - 0x78403328, 0x2BDC4E6F, - 0x781D9B64, 0x2C3AB2B9, - 0x77FAB988, 0x2C98FBBA, - 0x77D78DAA, 0x2CF72939, - 0x77B417DF, 0x2D553AFB, - 0x7790583D, 0x2DB330C7, - 0x776C4EDB, 0x2E110A62, - 0x7747FBCE, 0x2E6EC792, - 0x77235F2D, 0x2ECC681E, - 0x76FE790E, 0x2F29EBCC, - 0x76D94988, 0x2F875262, - 0x76B3D0B3, 0x2FE49BA6, - 0x768E0EA5, 0x3041C760, - 0x76680376, 0x309ED555, - 0x7641AF3C, 0x30FBC54D, - 0x761B1211, 0x3158970D, - 0x75F42C0A, 0x31B54A5D, - 0x75CCFD42, 0x3211DF03, - 0x75A585CF, 0x326E54C7, - 0x757DC5CA, 0x32CAAB6F, - 0x7555BD4B, 0x3326E2C2, - 0x752D6C6C, 0x3382FA88, - 0x7504D345, 0x33DEF287, - 0x74DBF1EF, 0x343ACA87, - 0x74B2C883, 0x3496824F, - 0x7489571B, 0x34F219A7, - 0x745F9DD1, 0x354D9056, - 0x74359CBD, 0x35A8E624, - 0x740B53FA, 0x36041AD9, - 0x73E0C3A3, 0x365F2E3B, - 0x73B5EBD0, 0x36BA2013, - 0x738ACC9E, 0x3714F02A, - 0x735F6626, 0x376F9E46, - 0x7333B883, 0x37CA2A30, - 0x7307C3D0, 0x382493B0, - 0x72DB8828, 0x387EDA8E, - 0x72AF05A6, 0x38D8FE93, - 0x72823C66, 0x3932FF87, - 0x72552C84, 0x398CDD32, - 0x7227D61C, 0x39E6975D, - 0x71FA3948, 0x3A402DD1, - 0x71CC5626, 0x3A99A057, - 0x719E2CD2, 0x3AF2EEB7, - 0x716FBD68, 0x3B4C18BA, - 0x71410804, 0x3BA51E29, - 0x71120CC5, 0x3BFDFECD, - 0x70E2CBC6, 0x3C56BA70, - 0x70B34524, 0x3CAF50DA, - 0x708378FE, 0x3D07C1D5, - 0x70536771, 0x3D600D2B, - 0x70231099, 0x3DB832A5, - 0x6FF27496, 0x3E10320D, - 0x6FC19385, 0x3E680B2C, - 0x6F906D84, 0x3EBFBDCC, - 0x6F5F02B1, 0x3F1749B7, - 0x6F2D532C, 0x3F6EAEB8, - 0x6EFB5F12, 0x3FC5EC97, - 0x6EC92682, 0x401D0320, - 0x6E96A99C, 0x4073F21D, - 0x6E63E87F, 0x40CAB957, - 0x6E30E349, 0x4121589A, - 0x6DFD9A1B, 0x4177CFB0, - 0x6DCA0D14, 0x41CE1E64, - 0x6D963C54, 0x42244480, - 0x6D6227FA, 0x427A41D0, - 0x6D2DD027, 0x42D0161E, - 0x6CF934FB, 0x4325C135, - 0x6CC45697, 0x437B42E1, - 0x6C8F351C, 0x43D09AEC, - 0x6C59D0A9, 0x4425C923, - 0x6C242960, 0x447ACD50, - 0x6BEE3F62, 0x44CFA73F, - 0x6BB812D0, 0x452456BC, - 0x6B81A3CD, 0x4578DB93, - 0x6B4AF278, 0x45CD358F, - 0x6B13FEF5, 0x4621647C, - 0x6ADCC964, 0x46756827, - 0x6AA551E8, 0x46C9405C, - 0x6A6D98A4, 0x471CECE6, - 0x6A359DB9, 0x47706D93, - 0x69FD614A, 0x47C3C22E, - 0x69C4E37A, 0x4816EA85, - 0x698C246C, 0x4869E664, - 0x69532442, 0x48BCB598, - 0x6919E320, 0x490F57EE, - 0x68E06129, 0x4961CD32, - 0x68A69E81, 0x49B41533, - 0x686C9B4B, 0x4A062FBD, - 0x683257AA, 0x4A581C9D, - 0x67F7D3C4, 0x4AA9DBA1, - 0x67BD0FBC, 0x4AFB6C97, - 0x67820BB6, 0x4B4CCF4D, - 0x6746C7D7, 0x4B9E038F, - 0x670B4443, 0x4BEF092D, - 0x66CF811F, 0x4C3FDFF3, - 0x66937E90, 0x4C9087B1, - 0x66573CBB, 0x4CE10034, - 0x661ABBC5, 0x4D31494B, - 0x65DDFBD3, 0x4D8162C4, - 0x65A0FD0B, 0x4DD14C6E, - 0x6563BF92, 0x4E210617, - 0x6526438E, 0x4E708F8F, - 0x64E88926, 0x4EBFE8A4, - 0x64AA907F, 0x4F0F1126, - 0x646C59BF, 0x4F5E08E3, - 0x642DE50D, 0x4FACCFAB, - 0x63EF328F, 0x4FFB654D, - 0x63B0426D, 0x5049C999, - 0x637114CC, 0x5097FC5E, - 0x6331A9D4, 0x50E5FD6C, - 0x62F201AC, 0x5133CC94, - 0x62B21C7B, 0x518169A4, - 0x6271FA69, 0x51CED46E, - 0x62319B9D, 0x521C0CC1, - 0x61F1003E, 0x5269126E, - 0x61B02876, 0x52B5E545, - 0x616F146B, 0x53028517, - 0x612DC446, 0x534EF1B5, - 0x60EC3830, 0x539B2AEF, - 0x60AA704F, 0x53E73097, - 0x60686CCE, 0x5433027D, - 0x60262DD5, 0x547EA073, - 0x5FE3B38D, 0x54CA0A4A, - 0x5FA0FE1E, 0x55153FD4, - 0x5F5E0DB3, 0x556040E2, - 0x5F1AE273, 0x55AB0D46, - 0x5ED77C89, 0x55F5A4D2, - 0x5E93DC1F, 0x56400757, - 0x5E50015D, 0x568A34A9, - 0x5E0BEC6E, 0x56D42C99, - 0x5DC79D7C, 0x571DEEF9, - 0x5D8314B0, 0x57677B9D, - 0x5D3E5236, 0x57B0D256, - 0x5CF95638, 0x57F9F2F7, - 0x5CB420DF, 0x5842DD54, - 0x5C6EB258, 0x588B913F, - 0x5C290ACC, 0x58D40E8C, - 0x5BE32A67, 0x591C550E, - 0x5B9D1153, 0x59646497, - 0x5B56BFBD, 0x59AC3CFD, - 0x5B1035CF, 0x59F3DE12, - 0x5AC973B4, 0x5A3B47AA, - 0x5A82799A, 0x5A82799A, - 0x5A3B47AA, 0x5AC973B4, - 0x59F3DE12, 0x5B1035CF, - 0x59AC3CFD, 0x5B56BFBD, - 0x59646497, 0x5B9D1153, - 0x591C550E, 0x5BE32A67, - 0x58D40E8C, 0x5C290ACC, - 0x588B913F, 0x5C6EB258, - 0x5842DD54, 0x5CB420DF, - 0x57F9F2F7, 0x5CF95638, - 0x57B0D256, 0x5D3E5236, - 0x57677B9D, 0x5D8314B0, - 0x571DEEF9, 0x5DC79D7C, - 0x56D42C99, 0x5E0BEC6E, - 0x568A34A9, 0x5E50015D, - 0x56400757, 0x5E93DC1F, - 0x55F5A4D2, 0x5ED77C89, - 0x55AB0D46, 0x5F1AE273, - 0x556040E2, 0x5F5E0DB3, - 0x55153FD4, 0x5FA0FE1E, - 0x54CA0A4A, 0x5FE3B38D, - 0x547EA073, 0x60262DD5, - 0x5433027D, 0x60686CCE, - 0x53E73097, 0x60AA704F, - 0x539B2AEF, 0x60EC3830, - 0x534EF1B5, 0x612DC446, - 0x53028517, 0x616F146B, - 0x52B5E545, 0x61B02876, - 0x5269126E, 0x61F1003E, - 0x521C0CC1, 0x62319B9D, - 0x51CED46E, 0x6271FA69, - 0x518169A4, 0x62B21C7B, - 0x5133CC94, 0x62F201AC, - 0x50E5FD6C, 0x6331A9D4, - 0x5097FC5E, 0x637114CC, - 0x5049C999, 0x63B0426D, - 0x4FFB654D, 0x63EF328F, - 0x4FACCFAB, 0x642DE50D, - 0x4F5E08E3, 0x646C59BF, - 0x4F0F1126, 0x64AA907F, - 0x4EBFE8A4, 0x64E88926, - 0x4E708F8F, 0x6526438E, - 0x4E210617, 0x6563BF92, - 0x4DD14C6E, 0x65A0FD0B, - 0x4D8162C4, 0x65DDFBD3, - 0x4D31494B, 0x661ABBC5, - 0x4CE10034, 0x66573CBB, - 0x4C9087B1, 0x66937E90, - 0x4C3FDFF3, 0x66CF811F, - 0x4BEF092D, 0x670B4443, - 0x4B9E038F, 0x6746C7D7, - 0x4B4CCF4D, 0x67820BB6, - 0x4AFB6C97, 0x67BD0FBC, - 0x4AA9DBA1, 0x67F7D3C4, - 0x4A581C9D, 0x683257AA, - 0x4A062FBD, 0x686C9B4B, - 0x49B41533, 0x68A69E81, - 0x4961CD32, 0x68E06129, - 0x490F57EE, 0x6919E320, - 0x48BCB598, 0x69532442, - 0x4869E664, 0x698C246C, - 0x4816EA85, 0x69C4E37A, - 0x47C3C22E, 0x69FD614A, - 0x47706D93, 0x6A359DB9, - 0x471CECE6, 0x6A6D98A4, - 0x46C9405C, 0x6AA551E8, - 0x46756827, 0x6ADCC964, - 0x4621647C, 0x6B13FEF5, - 0x45CD358F, 0x6B4AF278, - 0x4578DB93, 0x6B81A3CD, - 0x452456BC, 0x6BB812D0, - 0x44CFA73F, 0x6BEE3F62, - 0x447ACD50, 0x6C242960, - 0x4425C923, 0x6C59D0A9, - 0x43D09AEC, 0x6C8F351C, - 0x437B42E1, 0x6CC45697, - 0x4325C135, 0x6CF934FB, - 0x42D0161E, 0x6D2DD027, - 0x427A41D0, 0x6D6227FA, - 0x42244480, 0x6D963C54, - 0x41CE1E64, 0x6DCA0D14, - 0x4177CFB0, 0x6DFD9A1B, - 0x4121589A, 0x6E30E349, - 0x40CAB957, 0x6E63E87F, - 0x4073F21D, 0x6E96A99C, - 0x401D0320, 0x6EC92682, - 0x3FC5EC97, 0x6EFB5F12, - 0x3F6EAEB8, 0x6F2D532C, - 0x3F1749B7, 0x6F5F02B1, - 0x3EBFBDCC, 0x6F906D84, - 0x3E680B2C, 0x6FC19385, - 0x3E10320D, 0x6FF27496, - 0x3DB832A5, 0x70231099, - 0x3D600D2B, 0x70536771, - 0x3D07C1D5, 0x708378FE, - 0x3CAF50DA, 0x70B34524, - 0x3C56BA70, 0x70E2CBC6, - 0x3BFDFECD, 0x71120CC5, - 0x3BA51E29, 0x71410804, - 0x3B4C18BA, 0x716FBD68, - 0x3AF2EEB7, 0x719E2CD2, - 0x3A99A057, 0x71CC5626, - 0x3A402DD1, 0x71FA3948, - 0x39E6975D, 0x7227D61C, - 0x398CDD32, 0x72552C84, - 0x3932FF87, 0x72823C66, - 0x38D8FE93, 0x72AF05A6, - 0x387EDA8E, 0x72DB8828, - 0x382493B0, 0x7307C3D0, - 0x37CA2A30, 0x7333B883, - 0x376F9E46, 0x735F6626, - 0x3714F02A, 0x738ACC9E, - 0x36BA2013, 0x73B5EBD0, - 0x365F2E3B, 0x73E0C3A3, - 0x36041AD9, 0x740B53FA, - 0x35A8E624, 0x74359CBD, - 0x354D9056, 0x745F9DD1, - 0x34F219A7, 0x7489571B, - 0x3496824F, 0x74B2C883, - 0x343ACA87, 0x74DBF1EF, - 0x33DEF287, 0x7504D345, - 0x3382FA88, 0x752D6C6C, - 0x3326E2C2, 0x7555BD4B, - 0x32CAAB6F, 0x757DC5CA, - 0x326E54C7, 0x75A585CF, - 0x3211DF03, 0x75CCFD42, - 0x31B54A5D, 0x75F42C0A, - 0x3158970D, 0x761B1211, - 0x30FBC54D, 0x7641AF3C, - 0x309ED555, 0x76680376, - 0x3041C760, 0x768E0EA5, - 0x2FE49BA6, 0x76B3D0B3, - 0x2F875262, 0x76D94988, - 0x2F29EBCC, 0x76FE790E, - 0x2ECC681E, 0x77235F2D, - 0x2E6EC792, 0x7747FBCE, - 0x2E110A62, 0x776C4EDB, - 0x2DB330C7, 0x7790583D, - 0x2D553AFB, 0x77B417DF, - 0x2CF72939, 0x77D78DAA, - 0x2C98FBBA, 0x77FAB988, - 0x2C3AB2B9, 0x781D9B64, - 0x2BDC4E6F, 0x78403328, - 0x2B7DCF17, 0x786280BF, - 0x2B1F34EB, 0x78848413, - 0x2AC08025, 0x78A63D10, - 0x2A61B101, 0x78C7ABA1, - 0x2A02C7B8, 0x78E8CFB1, - 0x29A3C484, 0x7909A92C, - 0x2944A7A2, 0x792A37FE, - 0x28E5714A, 0x794A7C11, - 0x288621B9, 0x796A7554, - 0x2826B928, 0x798A23B1, - 0x27C737D2, 0x79A98715, - 0x27679DF4, 0x79C89F6D, - 0x2707EBC6, 0x79E76CA6, - 0x26A82185, 0x7A05EEAD, - 0x26483F6C, 0x7A24256E, - 0x25E845B5, 0x7A4210D8, - 0x2588349D, 0x7A5FB0D8, - 0x25280C5D, 0x7A7D055B, - 0x24C7CD32, 0x7A9A0E4F, - 0x24677757, 0x7AB6CBA3, - 0x24070B07, 0x7AD33D45, - 0x23A6887E, 0x7AEF6323, - 0x2345EFF7, 0x7B0B3D2C, - 0x22E541AE, 0x7B26CB4F, - 0x22847DDF, 0x7B420D7A, - 0x2223A4C5, 0x7B5D039D, - 0x21C2B69C, 0x7B77ADA8, - 0x2161B39F, 0x7B920B89, - 0x21009C0B, 0x7BAC1D31, - 0x209F701C, 0x7BC5E28F, - 0x203E300D, 0x7BDF5B94, - 0x1FDCDC1A, 0x7BF88830, - 0x1F7B7480, 0x7C116853, - 0x1F19F97B, 0x7C29FBEE, - 0x1EB86B46, 0x7C4242F2, - 0x1E56CA1E, 0x7C5A3D4F, - 0x1DF5163F, 0x7C71EAF8, - 0x1D934FE5, 0x7C894BDD, - 0x1D31774D, 0x7CA05FF1, - 0x1CCF8CB3, 0x7CB72724, - 0x1C6D9053, 0x7CCDA168, - 0x1C0B826A, 0x7CE3CEB1, - 0x1BA96334, 0x7CF9AEF0, - 0x1B4732EF, 0x7D0F4218, - 0x1AE4F1D6, 0x7D24881A, - 0x1A82A025, 0x7D3980EC, - 0x1A203E1B, 0x7D4E2C7E, - 0x19BDCBF2, 0x7D628AC5, - 0x195B49E9, 0x7D769BB5, - 0x18F8B83C, 0x7D8A5F3F, - 0x18961727, 0x7D9DD55A, - 0x183366E8, 0x7DB0FDF7, - 0x17D0A7BB, 0x7DC3D90D, - 0x176DD9DE, 0x7DD6668E, - 0x170AFD8D, 0x7DE8A670, - 0x16A81305, 0x7DFA98A7, - 0x16451A83, 0x7E0C3D29, - 0x15E21444, 0x7E1D93E9, - 0x157F0086, 0x7E2E9CDF, - 0x151BDF85, 0x7E3F57FE, - 0x14B8B17F, 0x7E4FC53E, - 0x145576B1, 0x7E5FE493, - 0x13F22F57, 0x7E6FB5F3, - 0x138EDBB0, 0x7E7F3956, - 0x132B7BF9, 0x7E8E6EB1, - 0x12C8106E, 0x7E9D55FC, - 0x1264994E, 0x7EABEF2C, - 0x120116D4, 0x7EBA3A39, - 0x119D8940, 0x7EC8371A, - 0x1139F0CE, 0x7ED5E5C6, - 0x10D64DBC, 0x7EE34635, - 0x1072A047, 0x7EF0585F, - 0x100EE8AD, 0x7EFD1C3C, - 0x0FAB272B, 0x7F0991C3, - 0x0F475BFE, 0x7F15B8EE, - 0x0EE38765, 0x7F2191B4, - 0x0E7FA99D, 0x7F2D1C0E, - 0x0E1BC2E3, 0x7F3857F5, - 0x0DB7D376, 0x7F434563, - 0x0D53DB92, 0x7F4DE450, - 0x0CEFDB75, 0x7F5834B6, - 0x0C8BD35E, 0x7F62368F, - 0x0C27C389, 0x7F6BE9D4, - 0x0BC3AC35, 0x7F754E7F, - 0x0B5F8D9F, 0x7F7E648B, - 0x0AFB6805, 0x7F872BF3, - 0x0A973BA5, 0x7F8FA4AF, - 0x0A3308BC, 0x7F97CEBC, - 0x09CECF89, 0x7F9FAA15, - 0x096A9049, 0x7FA736B4, - 0x09064B3A, 0x7FAE7494, - 0x08A2009A, 0x7FB563B2, - 0x083DB0A7, 0x7FBC040A, - 0x07D95B9E, 0x7FC25596, - 0x077501BE, 0x7FC85853, - 0x0710A344, 0x7FCE0C3E, - 0x06AC406F, 0x7FD37152, - 0x0647D97C, 0x7FD8878D, - 0x05E36EA9, 0x7FDD4EEC, - 0x057F0034, 0x7FE1C76B, - 0x051A8E5C, 0x7FE5F108, - 0x04B6195D, 0x7FE9CBC0, - 0x0451A176, 0x7FED5790, - 0x03ED26E6, 0x7FF09477, - 0x0388A9E9, 0x7FF38273, - 0x03242ABF, 0x7FF62182, - 0x02BFA9A4, 0x7FF871A1, - 0x025B26D7, 0x7FFA72D1, - 0x01F6A296, 0x7FFC250F, - 0x01921D1F, 0x7FFD885A, - 0x012D96B0, 0x7FFE9CB2, - 0x00C90F88, 0x7FFF6216, - 0x006487E3, 0x7FFFD885, - 0x00000000, 0x7FFFFFFF, - 0xFF9B781D, 0x7FFFD885, - 0xFF36F078, 0x7FFF6216, - 0xFED2694F, 0x7FFE9CB2, - 0xFE6DE2E0, 0x7FFD885A, - 0xFE095D69, 0x7FFC250F, - 0xFDA4D928, 0x7FFA72D1, - 0xFD40565B, 0x7FF871A1, - 0xFCDBD541, 0x7FF62182, - 0xFC775616, 0x7FF38273, - 0xFC12D919, 0x7FF09477, - 0xFBAE5E89, 0x7FED5790, - 0xFB49E6A2, 0x7FE9CBC0, - 0xFAE571A4, 0x7FE5F108, - 0xFA80FFCB, 0x7FE1C76B, - 0xFA1C9156, 0x7FDD4EEC, - 0xF9B82683, 0x7FD8878D, - 0xF953BF90, 0x7FD37152, - 0xF8EF5CBB, 0x7FCE0C3E, - 0xF88AFE41, 0x7FC85853, - 0xF826A461, 0x7FC25596, - 0xF7C24F58, 0x7FBC040A, - 0xF75DFF65, 0x7FB563B2, - 0xF6F9B4C5, 0x7FAE7494, - 0xF6956FB6, 0x7FA736B4, - 0xF6313076, 0x7F9FAA15, - 0xF5CCF743, 0x7F97CEBC, - 0xF568C45A, 0x7F8FA4AF, - 0xF50497FA, 0x7F872BF3, - 0xF4A07260, 0x7F7E648B, - 0xF43C53CA, 0x7F754E7F, - 0xF3D83C76, 0x7F6BE9D4, - 0xF3742CA1, 0x7F62368F, - 0xF310248A, 0x7F5834B6, - 0xF2AC246D, 0x7F4DE450, - 0xF2482C89, 0x7F434563, - 0xF1E43D1C, 0x7F3857F5, - 0xF1805662, 0x7F2D1C0E, - 0xF11C789A, 0x7F2191B4, - 0xF0B8A401, 0x7F15B8EE, - 0xF054D8D4, 0x7F0991C3, - 0xEFF11752, 0x7EFD1C3C, - 0xEF8D5FB8, 0x7EF0585F, - 0xEF29B243, 0x7EE34635, - 0xEEC60F31, 0x7ED5E5C6, - 0xEE6276BF, 0x7EC8371A, - 0xEDFEE92B, 0x7EBA3A39, - 0xED9B66B2, 0x7EABEF2C, - 0xED37EF91, 0x7E9D55FC, - 0xECD48406, 0x7E8E6EB1, - 0xEC71244F, 0x7E7F3956, - 0xEC0DD0A8, 0x7E6FB5F3, - 0xEBAA894E, 0x7E5FE493, - 0xEB474E80, 0x7E4FC53E, - 0xEAE4207A, 0x7E3F57FE, - 0xEA80FF79, 0x7E2E9CDF, - 0xEA1DEBBB, 0x7E1D93E9, - 0xE9BAE57C, 0x7E0C3D29, - 0xE957ECFB, 0x7DFA98A7, - 0xE8F50273, 0x7DE8A670, - 0xE8922621, 0x7DD6668E, - 0xE82F5844, 0x7DC3D90D, - 0xE7CC9917, 0x7DB0FDF7, - 0xE769E8D8, 0x7D9DD55A, - 0xE70747C3, 0x7D8A5F3F, - 0xE6A4B616, 0x7D769BB5, - 0xE642340D, 0x7D628AC5, - 0xE5DFC1E4, 0x7D4E2C7E, - 0xE57D5FDA, 0x7D3980EC, - 0xE51B0E2A, 0x7D24881A, - 0xE4B8CD10, 0x7D0F4218, - 0xE4569CCB, 0x7CF9AEF0, - 0xE3F47D95, 0x7CE3CEB1, - 0xE3926FAC, 0x7CCDA168, - 0xE330734C, 0x7CB72724, - 0xE2CE88B2, 0x7CA05FF1, - 0xE26CB01A, 0x7C894BDD, - 0xE20AE9C1, 0x7C71EAF8, - 0xE1A935E1, 0x7C5A3D4F, - 0xE14794B9, 0x7C4242F2, - 0xE0E60684, 0x7C29FBEE, - 0xE0848B7F, 0x7C116853, - 0xE02323E5, 0x7BF88830, - 0xDFC1CFF2, 0x7BDF5B94, - 0xDF608FE3, 0x7BC5E28F, - 0xDEFF63F4, 0x7BAC1D31, - 0xDE9E4C60, 0x7B920B89, - 0xDE3D4963, 0x7B77ADA8, - 0xDDDC5B3A, 0x7B5D039D, - 0xDD7B8220, 0x7B420D7A, - 0xDD1ABE51, 0x7B26CB4F, - 0xDCBA1008, 0x7B0B3D2C, - 0xDC597781, 0x7AEF6323, - 0xDBF8F4F8, 0x7AD33D45, - 0xDB9888A8, 0x7AB6CBA3, - 0xDB3832CD, 0x7A9A0E4F, - 0xDAD7F3A2, 0x7A7D055B, - 0xDA77CB62, 0x7A5FB0D8, - 0xDA17BA4A, 0x7A4210D8, - 0xD9B7C093, 0x7A24256E, - 0xD957DE7A, 0x7A05EEAD, - 0xD8F81439, 0x79E76CA6, - 0xD898620C, 0x79C89F6D, - 0xD838C82D, 0x79A98715, - 0xD7D946D7, 0x798A23B1, - 0xD779DE46, 0x796A7554, - 0xD71A8EB5, 0x794A7C11, - 0xD6BB585D, 0x792A37FE, - 0xD65C3B7B, 0x7909A92C, - 0xD5FD3847, 0x78E8CFB1, - 0xD59E4EFE, 0x78C7ABA1, - 0xD53F7FDA, 0x78A63D10, - 0xD4E0CB14, 0x78848413, - 0xD48230E8, 0x786280BF, - 0xD423B190, 0x78403328, - 0xD3C54D46, 0x781D9B64, - 0xD3670445, 0x77FAB988, - 0xD308D6C6, 0x77D78DAA, - 0xD2AAC504, 0x77B417DF, - 0xD24CCF38, 0x7790583D, - 0xD1EEF59E, 0x776C4EDB, - 0xD191386D, 0x7747FBCE, - 0xD13397E1, 0x77235F2D, - 0xD0D61433, 0x76FE790E, - 0xD078AD9D, 0x76D94988, - 0xD01B6459, 0x76B3D0B3, - 0xCFBE389F, 0x768E0EA5, - 0xCF612AAA, 0x76680376, - 0xCF043AB2, 0x7641AF3C, - 0xCEA768F2, 0x761B1211, - 0xCE4AB5A2, 0x75F42C0A, - 0xCDEE20FC, 0x75CCFD42, - 0xCD91AB38, 0x75A585CF, - 0xCD355490, 0x757DC5CA, - 0xCCD91D3D, 0x7555BD4B, - 0xCC7D0577, 0x752D6C6C, - 0xCC210D78, 0x7504D345, - 0xCBC53578, 0x74DBF1EF, - 0xCB697DB0, 0x74B2C883, - 0xCB0DE658, 0x7489571B, - 0xCAB26FA9, 0x745F9DD1, - 0xCA5719DB, 0x74359CBD, - 0xC9FBE527, 0x740B53FA, - 0xC9A0D1C4, 0x73E0C3A3, - 0xC945DFEC, 0x73B5EBD0, - 0xC8EB0FD6, 0x738ACC9E, - 0xC89061BA, 0x735F6626, - 0xC835D5D0, 0x7333B883, - 0xC7DB6C50, 0x7307C3D0, - 0xC7812571, 0x72DB8828, - 0xC727016C, 0x72AF05A6, - 0xC6CD0079, 0x72823C66, - 0xC67322CD, 0x72552C84, - 0xC61968A2, 0x7227D61C, - 0xC5BFD22E, 0x71FA3948, - 0xC5665FA8, 0x71CC5626, - 0xC50D1148, 0x719E2CD2, - 0xC4B3E746, 0x716FBD68, - 0xC45AE1D7, 0x71410804, - 0xC4020132, 0x71120CC5, - 0xC3A9458F, 0x70E2CBC6, - 0xC350AF25, 0x70B34524, - 0xC2F83E2A, 0x708378FE, - 0xC29FF2D4, 0x70536771, - 0xC247CD5A, 0x70231099, - 0xC1EFCDF2, 0x6FF27496, - 0xC197F4D3, 0x6FC19385, - 0xC1404233, 0x6F906D84, - 0xC0E8B648, 0x6F5F02B1, - 0xC0915147, 0x6F2D532C, - 0xC03A1368, 0x6EFB5F12, - 0xBFE2FCDF, 0x6EC92682, - 0xBF8C0DE2, 0x6E96A99C, - 0xBF3546A8, 0x6E63E87F, - 0xBEDEA765, 0x6E30E349, - 0xBE88304F, 0x6DFD9A1B, - 0xBE31E19B, 0x6DCA0D14, - 0xBDDBBB7F, 0x6D963C54, - 0xBD85BE2F, 0x6D6227FA, - 0xBD2FE9E1, 0x6D2DD027, - 0xBCDA3ECA, 0x6CF934FB, - 0xBC84BD1E, 0x6CC45697, - 0xBC2F6513, 0x6C8F351C, - 0xBBDA36DC, 0x6C59D0A9, - 0xBB8532AF, 0x6C242960, - 0xBB3058C0, 0x6BEE3F62, - 0xBADBA943, 0x6BB812D0, - 0xBA87246C, 0x6B81A3CD, - 0xBA32CA70, 0x6B4AF278, - 0xB9DE9B83, 0x6B13FEF5, - 0xB98A97D8, 0x6ADCC964, - 0xB936BFA3, 0x6AA551E8, - 0xB8E31319, 0x6A6D98A4, - 0xB88F926C, 0x6A359DB9, - 0xB83C3DD1, 0x69FD614A, - 0xB7E9157A, 0x69C4E37A, - 0xB796199B, 0x698C246C, - 0xB7434A67, 0x69532442, - 0xB6F0A811, 0x6919E320, - 0xB69E32CD, 0x68E06129, - 0xB64BEACC, 0x68A69E81, - 0xB5F9D042, 0x686C9B4B, - 0xB5A7E362, 0x683257AA, - 0xB556245E, 0x67F7D3C4, - 0xB5049368, 0x67BD0FBC, - 0xB4B330B2, 0x67820BB6, - 0xB461FC70, 0x6746C7D7, - 0xB410F6D2, 0x670B4443, - 0xB3C0200C, 0x66CF811F, - 0xB36F784E, 0x66937E90, - 0xB31EFFCB, 0x66573CBB, - 0xB2CEB6B5, 0x661ABBC5, - 0xB27E9D3B, 0x65DDFBD3, - 0xB22EB392, 0x65A0FD0B, - 0xB1DEF9E8, 0x6563BF92, - 0xB18F7070, 0x6526438E, - 0xB140175B, 0x64E88926, - 0xB0F0EEDA, 0x64AA907F, - 0xB0A1F71C, 0x646C59BF, - 0xB0533055, 0x642DE50D, - 0xB0049AB2, 0x63EF328F, - 0xAFB63667, 0x63B0426D, - 0xAF6803A1, 0x637114CC, - 0xAF1A0293, 0x6331A9D4, - 0xAECC336B, 0x62F201AC, - 0xAE7E965B, 0x62B21C7B, - 0xAE312B91, 0x6271FA69, - 0xADE3F33E, 0x62319B9D, - 0xAD96ED91, 0x61F1003E, - 0xAD4A1ABA, 0x61B02876, - 0xACFD7AE8, 0x616F146B, - 0xACB10E4A, 0x612DC446, - 0xAC64D510, 0x60EC3830, - 0xAC18CF68, 0x60AA704F, - 0xABCCFD82, 0x60686CCE, - 0xAB815F8C, 0x60262DD5, - 0xAB35F5B5, 0x5FE3B38D, - 0xAAEAC02B, 0x5FA0FE1E, - 0xAA9FBF1D, 0x5F5E0DB3, - 0xAA54F2B9, 0x5F1AE273, - 0xAA0A5B2D, 0x5ED77C89, - 0xA9BFF8A8, 0x5E93DC1F, - 0xA975CB56, 0x5E50015D, - 0xA92BD366, 0x5E0BEC6E, - 0xA8E21106, 0x5DC79D7C, - 0xA8988463, 0x5D8314B0, - 0xA84F2DA9, 0x5D3E5236, - 0xA8060D08, 0x5CF95638, - 0xA7BD22AB, 0x5CB420DF, - 0xA7746EC0, 0x5C6EB258, - 0xA72BF173, 0x5C290ACC, - 0xA6E3AAF2, 0x5BE32A67, - 0xA69B9B68, 0x5B9D1153, - 0xA653C302, 0x5B56BFBD, - 0xA60C21ED, 0x5B1035CF, - 0xA5C4B855, 0x5AC973B4, - 0xA57D8666, 0x5A82799A, - 0xA5368C4B, 0x5A3B47AA, - 0xA4EFCA31, 0x59F3DE12, - 0xA4A94042, 0x59AC3CFD, - 0xA462EEAC, 0x59646497, - 0xA41CD598, 0x591C550E, - 0xA3D6F533, 0x58D40E8C, - 0xA3914DA7, 0x588B913F, - 0xA34BDF20, 0x5842DD54, - 0xA306A9C7, 0x57F9F2F7, - 0xA2C1ADC9, 0x57B0D256, - 0xA27CEB4F, 0x57677B9D, - 0xA2386283, 0x571DEEF9, - 0xA1F41391, 0x56D42C99, - 0xA1AFFEA2, 0x568A34A9, - 0xA16C23E1, 0x56400757, - 0xA1288376, 0x55F5A4D2, - 0xA0E51D8C, 0x55AB0D46, - 0xA0A1F24C, 0x556040E2, - 0xA05F01E1, 0x55153FD4, - 0xA01C4C72, 0x54CA0A4A, - 0x9FD9D22A, 0x547EA073, - 0x9F979331, 0x5433027D, - 0x9F558FB0, 0x53E73097, - 0x9F13C7D0, 0x539B2AEF, - 0x9ED23BB9, 0x534EF1B5, - 0x9E90EB94, 0x53028517, - 0x9E4FD789, 0x52B5E545, - 0x9E0EFFC1, 0x5269126E, - 0x9DCE6462, 0x521C0CC1, - 0x9D8E0596, 0x51CED46E, - 0x9D4DE384, 0x518169A4, - 0x9D0DFE53, 0x5133CC94, - 0x9CCE562B, 0x50E5FD6C, - 0x9C8EEB33, 0x5097FC5E, - 0x9C4FBD92, 0x5049C999, - 0x9C10CD70, 0x4FFB654D, - 0x9BD21AF2, 0x4FACCFAB, - 0x9B93A640, 0x4F5E08E3, - 0x9B556F80, 0x4F0F1126, - 0x9B1776D9, 0x4EBFE8A4, - 0x9AD9BC71, 0x4E708F8F, - 0x9A9C406D, 0x4E210617, - 0x9A5F02F5, 0x4DD14C6E, - 0x9A22042C, 0x4D8162C4, - 0x99E5443A, 0x4D31494B, - 0x99A8C344, 0x4CE10034, - 0x996C816F, 0x4C9087B1, - 0x99307EE0, 0x4C3FDFF3, - 0x98F4BBBC, 0x4BEF092D, - 0x98B93828, 0x4B9E038F, - 0x987DF449, 0x4B4CCF4D, - 0x9842F043, 0x4AFB6C97, - 0x98082C3B, 0x4AA9DBA1, - 0x97CDA855, 0x4A581C9D, - 0x979364B5, 0x4A062FBD, - 0x9759617E, 0x49B41533, - 0x971F9ED6, 0x4961CD32, - 0x96E61CDF, 0x490F57EE, - 0x96ACDBBD, 0x48BCB598, - 0x9673DB94, 0x4869E664, - 0x963B1C85, 0x4816EA85, - 0x96029EB5, 0x47C3C22E, - 0x95CA6246, 0x47706D93, - 0x9592675B, 0x471CECE6, - 0x955AAE17, 0x46C9405C, - 0x9523369B, 0x46756827, - 0x94EC010B, 0x4621647C, - 0x94B50D87, 0x45CD358F, - 0x947E5C32, 0x4578DB93, - 0x9447ED2F, 0x452456BC, - 0x9411C09D, 0x44CFA73F, - 0x93DBD69F, 0x447ACD50, - 0x93A62F56, 0x4425C923, - 0x9370CAE4, 0x43D09AEC, - 0x933BA968, 0x437B42E1, - 0x9306CB04, 0x4325C135, - 0x92D22FD8, 0x42D0161E, - 0x929DD805, 0x427A41D0, - 0x9269C3AC, 0x42244480, - 0x9235F2EB, 0x41CE1E64, - 0x920265E4, 0x4177CFB0, - 0x91CF1CB6, 0x4121589A, - 0x919C1780, 0x40CAB957, - 0x91695663, 0x4073F21D, - 0x9136D97D, 0x401D0320, - 0x9104A0ED, 0x3FC5EC97, - 0x90D2ACD3, 0x3F6EAEB8, - 0x90A0FD4E, 0x3F1749B7, - 0x906F927B, 0x3EBFBDCC, - 0x903E6C7A, 0x3E680B2C, - 0x900D8B69, 0x3E10320D, - 0x8FDCEF66, 0x3DB832A5, - 0x8FAC988E, 0x3D600D2B, - 0x8F7C8701, 0x3D07C1D5, - 0x8F4CBADB, 0x3CAF50DA, - 0x8F1D343A, 0x3C56BA70, - 0x8EEDF33B, 0x3BFDFECD, - 0x8EBEF7FB, 0x3BA51E29, - 0x8E904298, 0x3B4C18BA, - 0x8E61D32D, 0x3AF2EEB7, - 0x8E33A9D9, 0x3A99A057, - 0x8E05C6B7, 0x3A402DD1, - 0x8DD829E4, 0x39E6975D, - 0x8DAAD37B, 0x398CDD32, - 0x8D7DC399, 0x3932FF87, - 0x8D50FA59, 0x38D8FE93, - 0x8D2477D8, 0x387EDA8E, - 0x8CF83C30, 0x382493B0, - 0x8CCC477D, 0x37CA2A30, - 0x8CA099D9, 0x376F9E46, - 0x8C753361, 0x3714F02A, - 0x8C4A142F, 0x36BA2013, - 0x8C1F3C5C, 0x365F2E3B, - 0x8BF4AC05, 0x36041AD9, - 0x8BCA6342, 0x35A8E624, - 0x8BA0622F, 0x354D9056, - 0x8B76A8E4, 0x34F219A7, - 0x8B4D377C, 0x3496824F, - 0x8B240E10, 0x343ACA87, - 0x8AFB2CBA, 0x33DEF287, - 0x8AD29393, 0x3382FA88, - 0x8AAA42B4, 0x3326E2C2, - 0x8A823A35, 0x32CAAB6F, - 0x8A5A7A30, 0x326E54C7, - 0x8A3302BD, 0x3211DF03, - 0x8A0BD3F5, 0x31B54A5D, - 0x89E4EDEE, 0x3158970D, - 0x89BE50C3, 0x30FBC54D, - 0x8997FC89, 0x309ED555, - 0x8971F15A, 0x3041C760, - 0x894C2F4C, 0x2FE49BA6, - 0x8926B677, 0x2F875262, - 0x890186F1, 0x2F29EBCC, - 0x88DCA0D3, 0x2ECC681E, - 0x88B80431, 0x2E6EC792, - 0x8893B124, 0x2E110A62, - 0x886FA7C2, 0x2DB330C7, - 0x884BE820, 0x2D553AFB, - 0x88287255, 0x2CF72939, - 0x88054677, 0x2C98FBBA, - 0x87E2649B, 0x2C3AB2B9, - 0x87BFCCD7, 0x2BDC4E6F, - 0x879D7F40, 0x2B7DCF17, - 0x877B7BEC, 0x2B1F34EB, - 0x8759C2EF, 0x2AC08025, - 0x8738545E, 0x2A61B101, - 0x8717304E, 0x2A02C7B8, - 0x86F656D3, 0x29A3C484, - 0x86D5C802, 0x2944A7A2, - 0x86B583EE, 0x28E5714A, - 0x86958AAB, 0x288621B9, - 0x8675DC4E, 0x2826B928, - 0x865678EA, 0x27C737D2, - 0x86376092, 0x27679DF4, - 0x86189359, 0x2707EBC6, - 0x85FA1152, 0x26A82185, - 0x85DBDA91, 0x26483F6C, - 0x85BDEF27, 0x25E845B5, - 0x85A04F28, 0x2588349D, - 0x8582FAA4, 0x25280C5D, - 0x8565F1B0, 0x24C7CD32, - 0x8549345C, 0x24677757, - 0x852CC2BA, 0x24070B07, - 0x85109CDC, 0x23A6887E, - 0x84F4C2D3, 0x2345EFF7, - 0x84D934B0, 0x22E541AE, - 0x84BDF285, 0x22847DDF, - 0x84A2FC62, 0x2223A4C5, - 0x84885257, 0x21C2B69C, - 0x846DF476, 0x2161B39F, - 0x8453E2CE, 0x21009C0B, - 0x843A1D70, 0x209F701C, - 0x8420A46B, 0x203E300D, - 0x840777CF, 0x1FDCDC1A, - 0x83EE97AC, 0x1F7B7480, - 0x83D60411, 0x1F19F97B, - 0x83BDBD0D, 0x1EB86B46, - 0x83A5C2B0, 0x1E56CA1E, - 0x838E1507, 0x1DF5163F, - 0x8376B422, 0x1D934FE5, - 0x835FA00E, 0x1D31774D, - 0x8348D8DB, 0x1CCF8CB3, - 0x83325E97, 0x1C6D9053, - 0x831C314E, 0x1C0B826A, - 0x8306510F, 0x1BA96334, - 0x82F0BDE8, 0x1B4732EF, - 0x82DB77E5, 0x1AE4F1D6, - 0x82C67F13, 0x1A82A025, - 0x82B1D381, 0x1A203E1B, - 0x829D753A, 0x19BDCBF2, - 0x8289644A, 0x195B49E9, - 0x8275A0C0, 0x18F8B83C, - 0x82622AA5, 0x18961727, - 0x824F0208, 0x183366E8, - 0x823C26F2, 0x17D0A7BB, - 0x82299971, 0x176DD9DE, - 0x8217598F, 0x170AFD8D, - 0x82056758, 0x16A81305, - 0x81F3C2D7, 0x16451A83, - 0x81E26C16, 0x15E21444, - 0x81D16320, 0x157F0086, - 0x81C0A801, 0x151BDF85, - 0x81B03AC1, 0x14B8B17F, - 0x81A01B6C, 0x145576B1, - 0x81904A0C, 0x13F22F57, - 0x8180C6A9, 0x138EDBB0, - 0x8171914E, 0x132B7BF9, - 0x8162AA03, 0x12C8106E, - 0x815410D3, 0x1264994E, - 0x8145C5C6, 0x120116D4, - 0x8137C8E6, 0x119D8940, - 0x812A1A39, 0x1139F0CE, - 0x811CB9CA, 0x10D64DBC, - 0x810FA7A0, 0x1072A047, - 0x8102E3C3, 0x100EE8AD, - 0x80F66E3C, 0x0FAB272B, - 0x80EA4712, 0x0F475BFE, - 0x80DE6E4C, 0x0EE38765, - 0x80D2E3F1, 0x0E7FA99D, - 0x80C7A80A, 0x0E1BC2E3, - 0x80BCBA9C, 0x0DB7D376, - 0x80B21BAF, 0x0D53DB92, - 0x80A7CB49, 0x0CEFDB75, - 0x809DC970, 0x0C8BD35E, - 0x8094162B, 0x0C27C389, - 0x808AB180, 0x0BC3AC35, - 0x80819B74, 0x0B5F8D9F, - 0x8078D40D, 0x0AFB6805, - 0x80705B50, 0x0A973BA5, - 0x80683143, 0x0A3308BC, - 0x806055EA, 0x09CECF89, - 0x8058C94C, 0x096A9049, - 0x80518B6B, 0x09064B3A, - 0x804A9C4D, 0x08A2009A, - 0x8043FBF6, 0x083DB0A7, - 0x803DAA69, 0x07D95B9E, - 0x8037A7AC, 0x077501BE, - 0x8031F3C1, 0x0710A344, - 0x802C8EAD, 0x06AC406F, - 0x80277872, 0x0647D97C, - 0x8022B113, 0x05E36EA9, - 0x801E3894, 0x057F0034, - 0x801A0EF7, 0x051A8E5C, - 0x80163440, 0x04B6195D, - 0x8012A86F, 0x0451A176, - 0x800F6B88, 0x03ED26E6, - 0x800C7D8C, 0x0388A9E9, - 0x8009DE7D, 0x03242ABF, - 0x80078E5E, 0x02BFA9A4, - 0x80058D2E, 0x025B26D7, - 0x8003DAF0, 0x01F6A296, - 0x800277A5, 0x01921D1F, - 0x8001634D, 0x012D96B0, - 0x80009DE9, 0x00C90F88, - 0x8000277A, 0x006487E3, - 0x80000000, 0x00000000, - 0x8000277A, 0xFF9B781D, - 0x80009DE9, 0xFF36F078, - 0x8001634D, 0xFED2694F, - 0x800277A5, 0xFE6DE2E0, - 0x8003DAF0, 0xFE095D69, - 0x80058D2E, 0xFDA4D928, - 0x80078E5E, 0xFD40565B, - 0x8009DE7D, 0xFCDBD541, - 0x800C7D8C, 0xFC775616, - 0x800F6B88, 0xFC12D919, - 0x8012A86F, 0xFBAE5E89, - 0x80163440, 0xFB49E6A2, - 0x801A0EF7, 0xFAE571A4, - 0x801E3894, 0xFA80FFCB, - 0x8022B113, 0xFA1C9156, - 0x80277872, 0xF9B82683, - 0x802C8EAD, 0xF953BF90, - 0x8031F3C1, 0xF8EF5CBB, - 0x8037A7AC, 0xF88AFE41, - 0x803DAA69, 0xF826A461, - 0x8043FBF6, 0xF7C24F58, - 0x804A9C4D, 0xF75DFF65, - 0x80518B6B, 0xF6F9B4C5, - 0x8058C94C, 0xF6956FB6, - 0x806055EA, 0xF6313076, - 0x80683143, 0xF5CCF743, - 0x80705B50, 0xF568C45A, - 0x8078D40D, 0xF50497FA, - 0x80819B74, 0xF4A07260, - 0x808AB180, 0xF43C53CA, - 0x8094162B, 0xF3D83C76, - 0x809DC970, 0xF3742CA1, - 0x80A7CB49, 0xF310248A, - 0x80B21BAF, 0xF2AC246D, - 0x80BCBA9C, 0xF2482C89, - 0x80C7A80A, 0xF1E43D1C, - 0x80D2E3F1, 0xF1805662, - 0x80DE6E4C, 0xF11C789A, - 0x80EA4712, 0xF0B8A401, - 0x80F66E3C, 0xF054D8D4, - 0x8102E3C3, 0xEFF11752, - 0x810FA7A0, 0xEF8D5FB8, - 0x811CB9CA, 0xEF29B243, - 0x812A1A39, 0xEEC60F31, - 0x8137C8E6, 0xEE6276BF, - 0x8145C5C6, 0xEDFEE92B, - 0x815410D3, 0xED9B66B2, - 0x8162AA03, 0xED37EF91, - 0x8171914E, 0xECD48406, - 0x8180C6A9, 0xEC71244F, - 0x81904A0C, 0xEC0DD0A8, - 0x81A01B6C, 0xEBAA894E, - 0x81B03AC1, 0xEB474E80, - 0x81C0A801, 0xEAE4207A, - 0x81D16320, 0xEA80FF79, - 0x81E26C16, 0xEA1DEBBB, - 0x81F3C2D7, 0xE9BAE57C, - 0x82056758, 0xE957ECFB, - 0x8217598F, 0xE8F50273, - 0x82299971, 0xE8922621, - 0x823C26F2, 0xE82F5844, - 0x824F0208, 0xE7CC9917, - 0x82622AA5, 0xE769E8D8, - 0x8275A0C0, 0xE70747C3, - 0x8289644A, 0xE6A4B616, - 0x829D753A, 0xE642340D, - 0x82B1D381, 0xE5DFC1E4, - 0x82C67F13, 0xE57D5FDA, - 0x82DB77E5, 0xE51B0E2A, - 0x82F0BDE8, 0xE4B8CD10, - 0x8306510F, 0xE4569CCB, - 0x831C314E, 0xE3F47D95, - 0x83325E97, 0xE3926FAC, - 0x8348D8DB, 0xE330734C, - 0x835FA00E, 0xE2CE88B2, - 0x8376B422, 0xE26CB01A, - 0x838E1507, 0xE20AE9C1, - 0x83A5C2B0, 0xE1A935E1, - 0x83BDBD0D, 0xE14794B9, - 0x83D60411, 0xE0E60684, - 0x83EE97AC, 0xE0848B7F, - 0x840777CF, 0xE02323E5, - 0x8420A46B, 0xDFC1CFF2, - 0x843A1D70, 0xDF608FE3, - 0x8453E2CE, 0xDEFF63F4, - 0x846DF476, 0xDE9E4C60, - 0x84885257, 0xDE3D4963, - 0x84A2FC62, 0xDDDC5B3A, - 0x84BDF285, 0xDD7B8220, - 0x84D934B0, 0xDD1ABE51, - 0x84F4C2D3, 0xDCBA1008, - 0x85109CDC, 0xDC597781, - 0x852CC2BA, 0xDBF8F4F8, - 0x8549345C, 0xDB9888A8, - 0x8565F1B0, 0xDB3832CD, - 0x8582FAA4, 0xDAD7F3A2, - 0x85A04F28, 0xDA77CB62, - 0x85BDEF27, 0xDA17BA4A, - 0x85DBDA91, 0xD9B7C093, - 0x85FA1152, 0xD957DE7A, - 0x86189359, 0xD8F81439, - 0x86376092, 0xD898620C, - 0x865678EA, 0xD838C82D, - 0x8675DC4E, 0xD7D946D7, - 0x86958AAB, 0xD779DE46, - 0x86B583EE, 0xD71A8EB5, - 0x86D5C802, 0xD6BB585D, - 0x86F656D3, 0xD65C3B7B, - 0x8717304E, 0xD5FD3847, - 0x8738545E, 0xD59E4EFE, - 0x8759C2EF, 0xD53F7FDA, - 0x877B7BEC, 0xD4E0CB14, - 0x879D7F40, 0xD48230E8, - 0x87BFCCD7, 0xD423B190, - 0x87E2649B, 0xD3C54D46, - 0x88054677, 0xD3670445, - 0x88287255, 0xD308D6C6, - 0x884BE820, 0xD2AAC504, - 0x886FA7C2, 0xD24CCF38, - 0x8893B124, 0xD1EEF59E, - 0x88B80431, 0xD191386D, - 0x88DCA0D3, 0xD13397E1, - 0x890186F1, 0xD0D61433, - 0x8926B677, 0xD078AD9D, - 0x894C2F4C, 0xD01B6459, - 0x8971F15A, 0xCFBE389F, - 0x8997FC89, 0xCF612AAA, - 0x89BE50C3, 0xCF043AB2, - 0x89E4EDEE, 0xCEA768F2, - 0x8A0BD3F5, 0xCE4AB5A2, - 0x8A3302BD, 0xCDEE20FC, - 0x8A5A7A30, 0xCD91AB38, - 0x8A823A35, 0xCD355490, - 0x8AAA42B4, 0xCCD91D3D, - 0x8AD29393, 0xCC7D0577, - 0x8AFB2CBA, 0xCC210D78, - 0x8B240E10, 0xCBC53578, - 0x8B4D377C, 0xCB697DB0, - 0x8B76A8E4, 0xCB0DE658, - 0x8BA0622F, 0xCAB26FA9, - 0x8BCA6342, 0xCA5719DB, - 0x8BF4AC05, 0xC9FBE527, - 0x8C1F3C5C, 0xC9A0D1C4, - 0x8C4A142F, 0xC945DFEC, - 0x8C753361, 0xC8EB0FD6, - 0x8CA099D9, 0xC89061BA, - 0x8CCC477D, 0xC835D5D0, - 0x8CF83C30, 0xC7DB6C50, - 0x8D2477D8, 0xC7812571, - 0x8D50FA59, 0xC727016C, - 0x8D7DC399, 0xC6CD0079, - 0x8DAAD37B, 0xC67322CD, - 0x8DD829E4, 0xC61968A2, - 0x8E05C6B7, 0xC5BFD22E, - 0x8E33A9D9, 0xC5665FA8, - 0x8E61D32D, 0xC50D1148, - 0x8E904298, 0xC4B3E746, - 0x8EBEF7FB, 0xC45AE1D7, - 0x8EEDF33B, 0xC4020132, - 0x8F1D343A, 0xC3A9458F, - 0x8F4CBADB, 0xC350AF25, - 0x8F7C8701, 0xC2F83E2A, - 0x8FAC988E, 0xC29FF2D4, - 0x8FDCEF66, 0xC247CD5A, - 0x900D8B69, 0xC1EFCDF2, - 0x903E6C7A, 0xC197F4D3, - 0x906F927B, 0xC1404233, - 0x90A0FD4E, 0xC0E8B648, - 0x90D2ACD3, 0xC0915147, - 0x9104A0ED, 0xC03A1368, - 0x9136D97D, 0xBFE2FCDF, - 0x91695663, 0xBF8C0DE2, - 0x919C1780, 0xBF3546A8, - 0x91CF1CB6, 0xBEDEA765, - 0x920265E4, 0xBE88304F, - 0x9235F2EB, 0xBE31E19B, - 0x9269C3AC, 0xBDDBBB7F, - 0x929DD805, 0xBD85BE2F, - 0x92D22FD8, 0xBD2FE9E1, - 0x9306CB04, 0xBCDA3ECA, - 0x933BA968, 0xBC84BD1E, - 0x9370CAE4, 0xBC2F6513, - 0x93A62F56, 0xBBDA36DC, - 0x93DBD69F, 0xBB8532AF, - 0x9411C09D, 0xBB3058C0, - 0x9447ED2F, 0xBADBA943, - 0x947E5C32, 0xBA87246C, - 0x94B50D87, 0xBA32CA70, - 0x94EC010B, 0xB9DE9B83, - 0x9523369B, 0xB98A97D8, - 0x955AAE17, 0xB936BFA3, - 0x9592675B, 0xB8E31319, - 0x95CA6246, 0xB88F926C, - 0x96029EB5, 0xB83C3DD1, - 0x963B1C85, 0xB7E9157A, - 0x9673DB94, 0xB796199B, - 0x96ACDBBD, 0xB7434A67, - 0x96E61CDF, 0xB6F0A811, - 0x971F9ED6, 0xB69E32CD, - 0x9759617E, 0xB64BEACC, - 0x979364B5, 0xB5F9D042, - 0x97CDA855, 0xB5A7E362, - 0x98082C3B, 0xB556245E, - 0x9842F043, 0xB5049368, - 0x987DF449, 0xB4B330B2, - 0x98B93828, 0xB461FC70, - 0x98F4BBBC, 0xB410F6D2, - 0x99307EE0, 0xB3C0200C, - 0x996C816F, 0xB36F784E, - 0x99A8C344, 0xB31EFFCB, - 0x99E5443A, 0xB2CEB6B5, - 0x9A22042C, 0xB27E9D3B, - 0x9A5F02F5, 0xB22EB392, - 0x9A9C406D, 0xB1DEF9E8, - 0x9AD9BC71, 0xB18F7070, - 0x9B1776D9, 0xB140175B, - 0x9B556F80, 0xB0F0EEDA, - 0x9B93A640, 0xB0A1F71C, - 0x9BD21AF2, 0xB0533055, - 0x9C10CD70, 0xB0049AB2, - 0x9C4FBD92, 0xAFB63667, - 0x9C8EEB33, 0xAF6803A1, - 0x9CCE562B, 0xAF1A0293, - 0x9D0DFE53, 0xAECC336B, - 0x9D4DE384, 0xAE7E965B, - 0x9D8E0596, 0xAE312B91, - 0x9DCE6462, 0xADE3F33E, - 0x9E0EFFC1, 0xAD96ED91, - 0x9E4FD789, 0xAD4A1ABA, - 0x9E90EB94, 0xACFD7AE8, - 0x9ED23BB9, 0xACB10E4A, - 0x9F13C7D0, 0xAC64D510, - 0x9F558FB0, 0xAC18CF68, - 0x9F979331, 0xABCCFD82, - 0x9FD9D22A, 0xAB815F8C, - 0xA01C4C72, 0xAB35F5B5, - 0xA05F01E1, 0xAAEAC02B, - 0xA0A1F24C, 0xAA9FBF1D, - 0xA0E51D8C, 0xAA54F2B9, - 0xA1288376, 0xAA0A5B2D, - 0xA16C23E1, 0xA9BFF8A8, - 0xA1AFFEA2, 0xA975CB56, - 0xA1F41391, 0xA92BD366, - 0xA2386283, 0xA8E21106, - 0xA27CEB4F, 0xA8988463, - 0xA2C1ADC9, 0xA84F2DA9, - 0xA306A9C7, 0xA8060D08, - 0xA34BDF20, 0xA7BD22AB, - 0xA3914DA7, 0xA7746EC0, - 0xA3D6F533, 0xA72BF173, - 0xA41CD598, 0xA6E3AAF2, - 0xA462EEAC, 0xA69B9B68, - 0xA4A94042, 0xA653C302, - 0xA4EFCA31, 0xA60C21ED, - 0xA5368C4B, 0xA5C4B855, - 0xA57D8666, 0xA57D8666, - 0xA5C4B855, 0xA5368C4B, - 0xA60C21ED, 0xA4EFCA31, - 0xA653C302, 0xA4A94042, - 0xA69B9B68, 0xA462EEAC, - 0xA6E3AAF2, 0xA41CD598, - 0xA72BF173, 0xA3D6F533, - 0xA7746EC0, 0xA3914DA7, - 0xA7BD22AB, 0xA34BDF20, - 0xA8060D08, 0xA306A9C7, - 0xA84F2DA9, 0xA2C1ADC9, - 0xA8988463, 0xA27CEB4F, - 0xA8E21106, 0xA2386283, - 0xA92BD366, 0xA1F41391, - 0xA975CB56, 0xA1AFFEA2, - 0xA9BFF8A8, 0xA16C23E1, - 0xAA0A5B2D, 0xA1288376, - 0xAA54F2B9, 0xA0E51D8C, - 0xAA9FBF1D, 0xA0A1F24C, - 0xAAEAC02B, 0xA05F01E1, - 0xAB35F5B5, 0xA01C4C72, - 0xAB815F8C, 0x9FD9D22A, - 0xABCCFD82, 0x9F979331, - 0xAC18CF68, 0x9F558FB0, - 0xAC64D510, 0x9F13C7D0, - 0xACB10E4A, 0x9ED23BB9, - 0xACFD7AE8, 0x9E90EB94, - 0xAD4A1ABA, 0x9E4FD789, - 0xAD96ED91, 0x9E0EFFC1, - 0xADE3F33E, 0x9DCE6462, - 0xAE312B91, 0x9D8E0596, - 0xAE7E965B, 0x9D4DE384, - 0xAECC336B, 0x9D0DFE53, - 0xAF1A0293, 0x9CCE562B, - 0xAF6803A1, 0x9C8EEB33, - 0xAFB63667, 0x9C4FBD92, - 0xB0049AB2, 0x9C10CD70, - 0xB0533055, 0x9BD21AF2, - 0xB0A1F71C, 0x9B93A640, - 0xB0F0EEDA, 0x9B556F80, - 0xB140175B, 0x9B1776D9, - 0xB18F7070, 0x9AD9BC71, - 0xB1DEF9E8, 0x9A9C406D, - 0xB22EB392, 0x9A5F02F5, - 0xB27E9D3B, 0x9A22042C, - 0xB2CEB6B5, 0x99E5443A, - 0xB31EFFCB, 0x99A8C344, - 0xB36F784E, 0x996C816F, - 0xB3C0200C, 0x99307EE0, - 0xB410F6D2, 0x98F4BBBC, - 0xB461FC70, 0x98B93828, - 0xB4B330B2, 0x987DF449, - 0xB5049368, 0x9842F043, - 0xB556245E, 0x98082C3B, - 0xB5A7E362, 0x97CDA855, - 0xB5F9D042, 0x979364B5, - 0xB64BEACC, 0x9759617E, - 0xB69E32CD, 0x971F9ED6, - 0xB6F0A811, 0x96E61CDF, - 0xB7434A67, 0x96ACDBBD, - 0xB796199B, 0x9673DB94, - 0xB7E9157A, 0x963B1C85, - 0xB83C3DD1, 0x96029EB5, - 0xB88F926C, 0x95CA6246, - 0xB8E31319, 0x9592675B, - 0xB936BFA3, 0x955AAE17, - 0xB98A97D8, 0x9523369B, - 0xB9DE9B83, 0x94EC010B, - 0xBA32CA70, 0x94B50D87, - 0xBA87246C, 0x947E5C32, - 0xBADBA943, 0x9447ED2F, - 0xBB3058C0, 0x9411C09D, - 0xBB8532AF, 0x93DBD69F, - 0xBBDA36DC, 0x93A62F56, - 0xBC2F6513, 0x9370CAE4, - 0xBC84BD1E, 0x933BA968, - 0xBCDA3ECA, 0x9306CB04, - 0xBD2FE9E1, 0x92D22FD8, - 0xBD85BE2F, 0x929DD805, - 0xBDDBBB7F, 0x9269C3AC, - 0xBE31E19B, 0x9235F2EB, - 0xBE88304F, 0x920265E4, - 0xBEDEA765, 0x91CF1CB6, - 0xBF3546A8, 0x919C1780, - 0xBF8C0DE2, 0x91695663, - 0xBFE2FCDF, 0x9136D97D, - 0xC03A1368, 0x9104A0ED, - 0xC0915147, 0x90D2ACD3, - 0xC0E8B648, 0x90A0FD4E, - 0xC1404233, 0x906F927B, - 0xC197F4D3, 0x903E6C7A, - 0xC1EFCDF2, 0x900D8B69, - 0xC247CD5A, 0x8FDCEF66, - 0xC29FF2D4, 0x8FAC988E, - 0xC2F83E2A, 0x8F7C8701, - 0xC350AF25, 0x8F4CBADB, - 0xC3A9458F, 0x8F1D343A, - 0xC4020132, 0x8EEDF33B, - 0xC45AE1D7, 0x8EBEF7FB, - 0xC4B3E746, 0x8E904298, - 0xC50D1148, 0x8E61D32D, - 0xC5665FA8, 0x8E33A9D9, - 0xC5BFD22E, 0x8E05C6B7, - 0xC61968A2, 0x8DD829E4, - 0xC67322CD, 0x8DAAD37B, - 0xC6CD0079, 0x8D7DC399, - 0xC727016C, 0x8D50FA59, - 0xC7812571, 0x8D2477D8, - 0xC7DB6C50, 0x8CF83C30, - 0xC835D5D0, 0x8CCC477D, - 0xC89061BA, 0x8CA099D9, - 0xC8EB0FD6, 0x8C753361, - 0xC945DFEC, 0x8C4A142F, - 0xC9A0D1C4, 0x8C1F3C5C, - 0xC9FBE527, 0x8BF4AC05, - 0xCA5719DB, 0x8BCA6342, - 0xCAB26FA9, 0x8BA0622F, - 0xCB0DE658, 0x8B76A8E4, - 0xCB697DB0, 0x8B4D377C, - 0xCBC53578, 0x8B240E10, - 0xCC210D78, 0x8AFB2CBA, - 0xCC7D0577, 0x8AD29393, - 0xCCD91D3D, 0x8AAA42B4, - 0xCD355490, 0x8A823A35, - 0xCD91AB38, 0x8A5A7A30, - 0xCDEE20FC, 0x8A3302BD, - 0xCE4AB5A2, 0x8A0BD3F5, - 0xCEA768F2, 0x89E4EDEE, - 0xCF043AB2, 0x89BE50C3, - 0xCF612AAA, 0x8997FC89, - 0xCFBE389F, 0x8971F15A, - 0xD01B6459, 0x894C2F4C, - 0xD078AD9D, 0x8926B677, - 0xD0D61433, 0x890186F1, - 0xD13397E1, 0x88DCA0D3, - 0xD191386D, 0x88B80431, - 0xD1EEF59E, 0x8893B124, - 0xD24CCF38, 0x886FA7C2, - 0xD2AAC504, 0x884BE820, - 0xD308D6C6, 0x88287255, - 0xD3670445, 0x88054677, - 0xD3C54D46, 0x87E2649B, - 0xD423B190, 0x87BFCCD7, - 0xD48230E8, 0x879D7F40, - 0xD4E0CB14, 0x877B7BEC, - 0xD53F7FDA, 0x8759C2EF, - 0xD59E4EFE, 0x8738545E, - 0xD5FD3847, 0x8717304E, - 0xD65C3B7B, 0x86F656D3, - 0xD6BB585D, 0x86D5C802, - 0xD71A8EB5, 0x86B583EE, - 0xD779DE46, 0x86958AAB, - 0xD7D946D7, 0x8675DC4E, - 0xD838C82D, 0x865678EA, - 0xD898620C, 0x86376092, - 0xD8F81439, 0x86189359, - 0xD957DE7A, 0x85FA1152, - 0xD9B7C093, 0x85DBDA91, - 0xDA17BA4A, 0x85BDEF27, - 0xDA77CB62, 0x85A04F28, - 0xDAD7F3A2, 0x8582FAA4, - 0xDB3832CD, 0x8565F1B0, - 0xDB9888A8, 0x8549345C, - 0xDBF8F4F8, 0x852CC2BA, - 0xDC597781, 0x85109CDC, - 0xDCBA1008, 0x84F4C2D3, - 0xDD1ABE51, 0x84D934B0, - 0xDD7B8220, 0x84BDF285, - 0xDDDC5B3A, 0x84A2FC62, - 0xDE3D4963, 0x84885257, - 0xDE9E4C60, 0x846DF476, - 0xDEFF63F4, 0x8453E2CE, - 0xDF608FE3, 0x843A1D70, - 0xDFC1CFF2, 0x8420A46B, - 0xE02323E5, 0x840777CF, - 0xE0848B7F, 0x83EE97AC, - 0xE0E60684, 0x83D60411, - 0xE14794B9, 0x83BDBD0D, - 0xE1A935E1, 0x83A5C2B0, - 0xE20AE9C1, 0x838E1507, - 0xE26CB01A, 0x8376B422, - 0xE2CE88B2, 0x835FA00E, - 0xE330734C, 0x8348D8DB, - 0xE3926FAC, 0x83325E97, - 0xE3F47D95, 0x831C314E, - 0xE4569CCB, 0x8306510F, - 0xE4B8CD10, 0x82F0BDE8, - 0xE51B0E2A, 0x82DB77E5, - 0xE57D5FDA, 0x82C67F13, - 0xE5DFC1E4, 0x82B1D381, - 0xE642340D, 0x829D753A, - 0xE6A4B616, 0x8289644A, - 0xE70747C3, 0x8275A0C0, - 0xE769E8D8, 0x82622AA5, - 0xE7CC9917, 0x824F0208, - 0xE82F5844, 0x823C26F2, - 0xE8922621, 0x82299971, - 0xE8F50273, 0x8217598F, - 0xE957ECFB, 0x82056758, - 0xE9BAE57C, 0x81F3C2D7, - 0xEA1DEBBB, 0x81E26C16, - 0xEA80FF79, 0x81D16320, - 0xEAE4207A, 0x81C0A801, - 0xEB474E80, 0x81B03AC1, - 0xEBAA894E, 0x81A01B6C, - 0xEC0DD0A8, 0x81904A0C, - 0xEC71244F, 0x8180C6A9, - 0xECD48406, 0x8171914E, - 0xED37EF91, 0x8162AA03, - 0xED9B66B2, 0x815410D3, - 0xEDFEE92B, 0x8145C5C6, - 0xEE6276BF, 0x8137C8E6, - 0xEEC60F31, 0x812A1A39, - 0xEF29B243, 0x811CB9CA, - 0xEF8D5FB8, 0x810FA7A0, - 0xEFF11752, 0x8102E3C3, - 0xF054D8D4, 0x80F66E3C, - 0xF0B8A401, 0x80EA4712, - 0xF11C789A, 0x80DE6E4C, - 0xF1805662, 0x80D2E3F1, - 0xF1E43D1C, 0x80C7A80A, - 0xF2482C89, 0x80BCBA9C, - 0xF2AC246D, 0x80B21BAF, - 0xF310248A, 0x80A7CB49, - 0xF3742CA1, 0x809DC970, - 0xF3D83C76, 0x8094162B, - 0xF43C53CA, 0x808AB180, - 0xF4A07260, 0x80819B74, - 0xF50497FA, 0x8078D40D, - 0xF568C45A, 0x80705B50, - 0xF5CCF743, 0x80683143, - 0xF6313076, 0x806055EA, - 0xF6956FB6, 0x8058C94C, - 0xF6F9B4C5, 0x80518B6B, - 0xF75DFF65, 0x804A9C4D, - 0xF7C24F58, 0x8043FBF6, - 0xF826A461, 0x803DAA69, - 0xF88AFE41, 0x8037A7AC, - 0xF8EF5CBB, 0x8031F3C1, - 0xF953BF90, 0x802C8EAD, - 0xF9B82683, 0x80277872, - 0xFA1C9156, 0x8022B113, - 0xFA80FFCB, 0x801E3894, - 0xFAE571A4, 0x801A0EF7, - 0xFB49E6A2, 0x80163440, - 0xFBAE5E89, 0x8012A86F, - 0xFC12D919, 0x800F6B88, - 0xFC775616, 0x800C7D8C, - 0xFCDBD541, 0x8009DE7D, - 0xFD40565B, 0x80078E5E, - 0xFDA4D928, 0x80058D2E, - 0xFE095D69, 0x8003DAF0, - 0xFE6DE2E0, 0x800277A5, - 0xFED2694F, 0x8001634D, - 0xFF36F078, 0x80009DE9, - 0xFF9B781D, 0x8000277A -}; - -/** -* \par -* Example code for Q31 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefQ31[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefQ31[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 4096 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to Q31(Fixed point 1.31): -* round(twiddleCoefQ31(i) * pow(2, 31)) -* -*/ -const q31_t twiddleCoef_4096_q31[6144] = -{ - 0x7FFFFFFF, 0x00000000, - 0x7FFFF621, 0x003243F5, - 0x7FFFD885, 0x006487E3, - 0x7FFFA72C, 0x0096CBC1, - 0x7FFF6216, 0x00C90F88, - 0x7FFF0942, 0x00FB532F, - 0x7FFE9CB2, 0x012D96B0, - 0x7FFE1C64, 0x015FDA03, - 0x7FFD885A, 0x01921D1F, - 0x7FFCE093, 0x01C45FFE, - 0x7FFC250F, 0x01F6A296, - 0x7FFB55CE, 0x0228E4E1, - 0x7FFA72D1, 0x025B26D7, - 0x7FF97C17, 0x028D6870, - 0x7FF871A1, 0x02BFA9A4, - 0x7FF7536F, 0x02F1EA6B, - 0x7FF62182, 0x03242ABF, - 0x7FF4DBD8, 0x03566A96, - 0x7FF38273, 0x0388A9E9, - 0x7FF21553, 0x03BAE8B1, - 0x7FF09477, 0x03ED26E6, - 0x7FEEFFE1, 0x041F647F, - 0x7FED5790, 0x0451A176, - 0x7FEB9B85, 0x0483DDC3, - 0x7FE9CBC0, 0x04B6195D, - 0x7FE7E840, 0x04E8543D, - 0x7FE5F108, 0x051A8E5C, - 0x7FE3E616, 0x054CC7B0, - 0x7FE1C76B, 0x057F0034, - 0x7FDF9508, 0x05B137DF, - 0x7FDD4EEC, 0x05E36EA9, - 0x7FDAF518, 0x0615A48A, - 0x7FD8878D, 0x0647D97C, - 0x7FD6064B, 0x067A0D75, - 0x7FD37152, 0x06AC406F, - 0x7FD0C8A3, 0x06DE7261, - 0x7FCE0C3E, 0x0710A344, - 0x7FCB3C23, 0x0742D310, - 0x7FC85853, 0x077501BE, - 0x7FC560CF, 0x07A72F45, - 0x7FC25596, 0x07D95B9E, - 0x7FBF36A9, 0x080B86C1, - 0x7FBC040A, 0x083DB0A7, - 0x7FB8BDB7, 0x086FD947, - 0x7FB563B2, 0x08A2009A, - 0x7FB1F5FC, 0x08D42698, - 0x7FAE7494, 0x09064B3A, - 0x7FAADF7C, 0x09386E77, - 0x7FA736B4, 0x096A9049, - 0x7FA37A3C, 0x099CB0A7, - 0x7F9FAA15, 0x09CECF89, - 0x7F9BC63F, 0x0A00ECE8, - 0x7F97CEBC, 0x0A3308BC, - 0x7F93C38C, 0x0A6522FE, - 0x7F8FA4AF, 0x0A973BA5, - 0x7F8B7226, 0x0AC952AA, - 0x7F872BF3, 0x0AFB6805, - 0x7F82D214, 0x0B2D7BAE, - 0x7F7E648B, 0x0B5F8D9F, - 0x7F79E35A, 0x0B919DCE, - 0x7F754E7F, 0x0BC3AC35, - 0x7F70A5FD, 0x0BF5B8CB, - 0x7F6BE9D4, 0x0C27C389, - 0x7F671A04, 0x0C59CC67, - 0x7F62368F, 0x0C8BD35E, - 0x7F5D3F75, 0x0CBDD865, - 0x7F5834B6, 0x0CEFDB75, - 0x7F531654, 0x0D21DC87, - 0x7F4DE450, 0x0D53DB92, - 0x7F489EAA, 0x0D85D88F, - 0x7F434563, 0x0DB7D376, - 0x7F3DD87C, 0x0DE9CC3F, - 0x7F3857F5, 0x0E1BC2E3, - 0x7F32C3D0, 0x0E4DB75B, - 0x7F2D1C0E, 0x0E7FA99D, - 0x7F2760AF, 0x0EB199A3, - 0x7F2191B4, 0x0EE38765, - 0x7F1BAF1E, 0x0F1572DC, - 0x7F15B8EE, 0x0F475BFE, - 0x7F0FAF24, 0x0F7942C6, - 0x7F0991C3, 0x0FAB272B, - 0x7F0360CB, 0x0FDD0925, - 0x7EFD1C3C, 0x100EE8AD, - 0x7EF6C418, 0x1040C5BB, - 0x7EF0585F, 0x1072A047, - 0x7EE9D913, 0x10A4784A, - 0x7EE34635, 0x10D64DBC, - 0x7EDC9FC6, 0x11082096, - 0x7ED5E5C6, 0x1139F0CE, - 0x7ECF1837, 0x116BBE5F, - 0x7EC8371A, 0x119D8940, - 0x7EC1426F, 0x11CF516A, - 0x7EBA3A39, 0x120116D4, - 0x7EB31E77, 0x1232D978, - 0x7EABEF2C, 0x1264994E, - 0x7EA4AC58, 0x1296564D, - 0x7E9D55FC, 0x12C8106E, - 0x7E95EC19, 0x12F9C7AA, - 0x7E8E6EB1, 0x132B7BF9, - 0x7E86DDC5, 0x135D2D53, - 0x7E7F3956, 0x138EDBB0, - 0x7E778165, 0x13C0870A, - 0x7E6FB5F3, 0x13F22F57, - 0x7E67D702, 0x1423D492, - 0x7E5FE493, 0x145576B1, - 0x7E57DEA6, 0x148715AD, - 0x7E4FC53E, 0x14B8B17F, - 0x7E47985B, 0x14EA4A1F, - 0x7E3F57FE, 0x151BDF85, - 0x7E37042A, 0x154D71AA, - 0x7E2E9CDF, 0x157F0086, - 0x7E26221E, 0x15B08C11, - 0x7E1D93E9, 0x15E21444, - 0x7E14F242, 0x16139917, - 0x7E0C3D29, 0x16451A83, - 0x7E03749F, 0x1676987F, - 0x7DFA98A7, 0x16A81305, - 0x7DF1A942, 0x16D98A0C, - 0x7DE8A670, 0x170AFD8D, - 0x7DDF9034, 0x173C6D80, - 0x7DD6668E, 0x176DD9DE, - 0x7DCD2981, 0x179F429F, - 0x7DC3D90D, 0x17D0A7BB, - 0x7DBA7534, 0x1802092C, - 0x7DB0FDF7, 0x183366E8, - 0x7DA77359, 0x1864C0E9, - 0x7D9DD55A, 0x18961727, - 0x7D9423FB, 0x18C7699B, - 0x7D8A5F3F, 0x18F8B83C, - 0x7D808727, 0x192A0303, - 0x7D769BB5, 0x195B49E9, - 0x7D6C9CE9, 0x198C8CE6, - 0x7D628AC5, 0x19BDCBF2, - 0x7D58654C, 0x19EF0706, - 0x7D4E2C7E, 0x1A203E1B, - 0x7D43E05E, 0x1A517127, - 0x7D3980EC, 0x1A82A025, - 0x7D2F0E2A, 0x1AB3CB0C, - 0x7D24881A, 0x1AE4F1D6, - 0x7D19EEBE, 0x1B161479, - 0x7D0F4218, 0x1B4732EF, - 0x7D048228, 0x1B784D30, - 0x7CF9AEF0, 0x1BA96334, - 0x7CEEC873, 0x1BDA74F5, - 0x7CE3CEB1, 0x1C0B826A, - 0x7CD8C1AD, 0x1C3C8B8C, - 0x7CCDA168, 0x1C6D9053, - 0x7CC26DE5, 0x1C9E90B8, - 0x7CB72724, 0x1CCF8CB3, - 0x7CABCD27, 0x1D00843C, - 0x7CA05FF1, 0x1D31774D, - 0x7C94DF82, 0x1D6265DD, - 0x7C894BDD, 0x1D934FE5, - 0x7C7DA504, 0x1DC4355D, - 0x7C71EAF8, 0x1DF5163F, - 0x7C661DBB, 0x1E25F281, - 0x7C5A3D4F, 0x1E56CA1E, - 0x7C4E49B6, 0x1E879D0C, - 0x7C4242F2, 0x1EB86B46, - 0x7C362904, 0x1EE934C2, - 0x7C29FBEE, 0x1F19F97B, - 0x7C1DBBB2, 0x1F4AB967, - 0x7C116853, 0x1F7B7480, - 0x7C0501D1, 0x1FAC2ABF, - 0x7BF88830, 0x1FDCDC1A, - 0x7BEBFB70, 0x200D888C, - 0x7BDF5B94, 0x203E300D, - 0x7BD2A89E, 0x206ED295, - 0x7BC5E28F, 0x209F701C, - 0x7BB9096A, 0x20D0089B, - 0x7BAC1D31, 0x21009C0B, - 0x7B9F1DE5, 0x21312A65, - 0x7B920B89, 0x2161B39F, - 0x7B84E61E, 0x219237B4, - 0x7B77ADA8, 0x21C2B69C, - 0x7B6A6227, 0x21F3304E, - 0x7B5D039D, 0x2223A4C5, - 0x7B4F920E, 0x225413F8, - 0x7B420D7A, 0x22847DDF, - 0x7B3475E4, 0x22B4E274, - 0x7B26CB4F, 0x22E541AE, - 0x7B190DBB, 0x23159B87, - 0x7B0B3D2C, 0x2345EFF7, - 0x7AFD59A3, 0x23763EF7, - 0x7AEF6323, 0x23A6887E, - 0x7AE159AE, 0x23D6CC86, - 0x7AD33D45, 0x24070B07, - 0x7AC50DEB, 0x243743FA, - 0x7AB6CBA3, 0x24677757, - 0x7AA8766E, 0x2497A517, - 0x7A9A0E4F, 0x24C7CD32, - 0x7A8B9348, 0x24F7EFA1, - 0x7A7D055B, 0x25280C5D, - 0x7A6E648A, 0x2558235E, - 0x7A5FB0D8, 0x2588349D, - 0x7A50EA46, 0x25B84012, - 0x7A4210D8, 0x25E845B5, - 0x7A33248F, 0x26184581, - 0x7A24256E, 0x26483F6C, - 0x7A151377, 0x26783370, - 0x7A05EEAD, 0x26A82185, - 0x79F6B711, 0x26D809A5, - 0x79E76CA6, 0x2707EBC6, - 0x79D80F6F, 0x2737C7E3, - 0x79C89F6D, 0x27679DF4, - 0x79B91CA4, 0x27976DF1, - 0x79A98715, 0x27C737D2, - 0x7999DEC3, 0x27F6FB92, - 0x798A23B1, 0x2826B928, - 0x797A55E0, 0x2856708C, - 0x796A7554, 0x288621B9, - 0x795A820E, 0x28B5CCA5, - 0x794A7C11, 0x28E5714A, - 0x793A6360, 0x29150FA1, - 0x792A37FE, 0x2944A7A2, - 0x7919F9EB, 0x29743945, - 0x7909A92C, 0x29A3C484, - 0x78F945C3, 0x29D34958, - 0x78E8CFB1, 0x2A02C7B8, - 0x78D846FB, 0x2A323F9D, - 0x78C7ABA1, 0x2A61B101, - 0x78B6FDA8, 0x2A911BDB, - 0x78A63D10, 0x2AC08025, - 0x789569DE, 0x2AEFDDD8, - 0x78848413, 0x2B1F34EB, - 0x78738BB3, 0x2B4E8558, - 0x786280BF, 0x2B7DCF17, - 0x7851633B, 0x2BAD1221, - 0x78403328, 0x2BDC4E6F, - 0x782EF08B, 0x2C0B83F9, - 0x781D9B64, 0x2C3AB2B9, - 0x780C33B8, 0x2C69DAA6, - 0x77FAB988, 0x2C98FBBA, - 0x77E92CD8, 0x2CC815ED, - 0x77D78DAA, 0x2CF72939, - 0x77C5DC01, 0x2D263595, - 0x77B417DF, 0x2D553AFB, - 0x77A24148, 0x2D843963, - 0x7790583D, 0x2DB330C7, - 0x777E5CC3, 0x2DE2211E, - 0x776C4EDB, 0x2E110A62, - 0x775A2E88, 0x2E3FEC8B, - 0x7747FBCE, 0x2E6EC792, - 0x7735B6AE, 0x2E9D9B70, - 0x77235F2D, 0x2ECC681E, - 0x7710F54B, 0x2EFB2D94, - 0x76FE790E, 0x2F29EBCC, - 0x76EBEA77, 0x2F58A2BD, - 0x76D94988, 0x2F875262, - 0x76C69646, 0x2FB5FAB2, - 0x76B3D0B3, 0x2FE49BA6, - 0x76A0F8D2, 0x30133538, - 0x768E0EA5, 0x3041C760, - 0x767B1230, 0x30705217, - 0x76680376, 0x309ED555, - 0x7654E279, 0x30CD5114, - 0x7641AF3C, 0x30FBC54D, - 0x762E69C3, 0x312A31F8, - 0x761B1211, 0x3158970D, - 0x7607A827, 0x3186F487, - 0x75F42C0A, 0x31B54A5D, - 0x75E09DBD, 0x31E39889, - 0x75CCFD42, 0x3211DF03, - 0x75B94A9C, 0x32401DC5, - 0x75A585CF, 0x326E54C7, - 0x7591AEDD, 0x329C8402, - 0x757DC5CA, 0x32CAAB6F, - 0x7569CA98, 0x32F8CB07, - 0x7555BD4B, 0x3326E2C2, - 0x75419DE6, 0x3354F29A, - 0x752D6C6C, 0x3382FA88, - 0x751928E0, 0x33B0FA84, - 0x7504D345, 0x33DEF287, - 0x74F06B9E, 0x340CE28A, - 0x74DBF1EF, 0x343ACA87, - 0x74C7663A, 0x3468AA76, - 0x74B2C883, 0x3496824F, - 0x749E18CD, 0x34C4520D, - 0x7489571B, 0x34F219A7, - 0x74748371, 0x351FD917, - 0x745F9DD1, 0x354D9056, - 0x744AA63E, 0x357B3F5D, - 0x74359CBD, 0x35A8E624, - 0x74208150, 0x35D684A5, - 0x740B53FA, 0x36041AD9, - 0x73F614C0, 0x3631A8B7, - 0x73E0C3A3, 0x365F2E3B, - 0x73CB60A7, 0x368CAB5C, - 0x73B5EBD0, 0x36BA2013, - 0x73A06522, 0x36E78C5A, - 0x738ACC9E, 0x3714F02A, - 0x73752249, 0x37424B7A, - 0x735F6626, 0x376F9E46, - 0x73499838, 0x379CE884, - 0x7333B883, 0x37CA2A30, - 0x731DC709, 0x37F76340, - 0x7307C3D0, 0x382493B0, - 0x72F1AED8, 0x3851BB76, - 0x72DB8828, 0x387EDA8E, - 0x72C54FC0, 0x38ABF0EF, - 0x72AF05A6, 0x38D8FE93, - 0x7298A9DC, 0x39060372, - 0x72823C66, 0x3932FF87, - 0x726BBD48, 0x395FF2C9, - 0x72552C84, 0x398CDD32, - 0x723E8A1F, 0x39B9BEBB, - 0x7227D61C, 0x39E6975D, - 0x7211107D, 0x3A136712, - 0x71FA3948, 0x3A402DD1, - 0x71E3507F, 0x3A6CEB95, - 0x71CC5626, 0x3A99A057, - 0x71B54A40, 0x3AC64C0F, - 0x719E2CD2, 0x3AF2EEB7, - 0x7186FDDE, 0x3B1F8847, - 0x716FBD68, 0x3B4C18BA, - 0x71586B73, 0x3B78A007, - 0x71410804, 0x3BA51E29, - 0x7129931E, 0x3BD19317, - 0x71120CC5, 0x3BFDFECD, - 0x70FA74FB, 0x3C2A6142, - 0x70E2CBC6, 0x3C56BA70, - 0x70CB1127, 0x3C830A4F, - 0x70B34524, 0x3CAF50DA, - 0x709B67C0, 0x3CDB8E09, - 0x708378FE, 0x3D07C1D5, - 0x706B78E3, 0x3D33EC39, - 0x70536771, 0x3D600D2B, - 0x703B44AC, 0x3D8C24A7, - 0x70231099, 0x3DB832A5, - 0x700ACB3B, 0x3DE4371F, - 0x6FF27496, 0x3E10320D, - 0x6FDA0CAD, 0x3E3C2369, - 0x6FC19385, 0x3E680B2C, - 0x6FA90920, 0x3E93E94F, - 0x6F906D84, 0x3EBFBDCC, - 0x6F77C0B3, 0x3EEB889C, - 0x6F5F02B1, 0x3F1749B7, - 0x6F463383, 0x3F430118, - 0x6F2D532C, 0x3F6EAEB8, - 0x6F1461AF, 0x3F9A528F, - 0x6EFB5F12, 0x3FC5EC97, - 0x6EE24B57, 0x3FF17CCA, - 0x6EC92682, 0x401D0320, - 0x6EAFF098, 0x40487F93, - 0x6E96A99C, 0x4073F21D, - 0x6E7D5193, 0x409F5AB6, - 0x6E63E87F, 0x40CAB957, - 0x6E4A6E65, 0x40F60DFB, - 0x6E30E349, 0x4121589A, - 0x6E17472F, 0x414C992E, - 0x6DFD9A1B, 0x4177CFB0, - 0x6DE3DC11, 0x41A2FC1A, - 0x6DCA0D14, 0x41CE1E64, - 0x6DB02D29, 0x41F93688, - 0x6D963C54, 0x42244480, - 0x6D7C3A98, 0x424F4845, - 0x6D6227FA, 0x427A41D0, - 0x6D48047E, 0x42A5311A, - 0x6D2DD027, 0x42D0161E, - 0x6D138AFA, 0x42FAF0D4, - 0x6CF934FB, 0x4325C135, - 0x6CDECE2E, 0x4350873C, - 0x6CC45697, 0x437B42E1, - 0x6CA9CE3A, 0x43A5F41E, - 0x6C8F351C, 0x43D09AEC, - 0x6C748B3F, 0x43FB3745, - 0x6C59D0A9, 0x4425C923, - 0x6C3F055D, 0x4450507E, - 0x6C242960, 0x447ACD50, - 0x6C093CB6, 0x44A53F93, - 0x6BEE3F62, 0x44CFA73F, - 0x6BD3316A, 0x44FA044F, - 0x6BB812D0, 0x452456BC, - 0x6B9CE39B, 0x454E9E80, - 0x6B81A3CD, 0x4578DB93, - 0x6B66536A, 0x45A30DF0, - 0x6B4AF278, 0x45CD358F, - 0x6B2F80FA, 0x45F7526B, - 0x6B13FEF5, 0x4621647C, - 0x6AF86C6C, 0x464B6BBD, - 0x6ADCC964, 0x46756827, - 0x6AC115E1, 0x469F59B4, - 0x6AA551E8, 0x46C9405C, - 0x6A897D7D, 0x46F31C1A, - 0x6A6D98A4, 0x471CECE6, - 0x6A51A361, 0x4746B2BC, - 0x6A359DB9, 0x47706D93, - 0x6A1987B0, 0x479A1D66, - 0x69FD614A, 0x47C3C22E, - 0x69E12A8C, 0x47ED5BE6, - 0x69C4E37A, 0x4816EA85, - 0x69A88C18, 0x48406E07, - 0x698C246C, 0x4869E664, - 0x696FAC78, 0x48935397, - 0x69532442, 0x48BCB598, - 0x69368BCE, 0x48E60C62, - 0x6919E320, 0x490F57EE, - 0x68FD2A3D, 0x49389836, - 0x68E06129, 0x4961CD32, - 0x68C387E9, 0x498AF6DE, - 0x68A69E81, 0x49B41533, - 0x6889A4F5, 0x49DD282A, - 0x686C9B4B, 0x4A062FBD, - 0x684F8186, 0x4A2F2BE5, - 0x683257AA, 0x4A581C9D, - 0x68151DBE, 0x4A8101DE, - 0x67F7D3C4, 0x4AA9DBA1, - 0x67DA79C2, 0x4AD2A9E1, - 0x67BD0FBC, 0x4AFB6C97, - 0x679F95B7, 0x4B2423BD, - 0x67820BB6, 0x4B4CCF4D, - 0x676471C0, 0x4B756F3F, - 0x6746C7D7, 0x4B9E038F, - 0x67290E02, 0x4BC68C36, - 0x670B4443, 0x4BEF092D, - 0x66ED6AA1, 0x4C177A6E, - 0x66CF811F, 0x4C3FDFF3, - 0x66B187C3, 0x4C6839B6, - 0x66937E90, 0x4C9087B1, - 0x6675658C, 0x4CB8C9DD, - 0x66573CBB, 0x4CE10034, - 0x66390422, 0x4D092AB0, - 0x661ABBC5, 0x4D31494B, - 0x65FC63A9, 0x4D595BFE, - 0x65DDFBD3, 0x4D8162C4, - 0x65BF8447, 0x4DA95D96, - 0x65A0FD0B, 0x4DD14C6E, - 0x65826622, 0x4DF92F45, - 0x6563BF92, 0x4E210617, - 0x6545095F, 0x4E48D0DC, - 0x6526438E, 0x4E708F8F, - 0x65076E24, 0x4E984229, - 0x64E88926, 0x4EBFE8A4, - 0x64C99498, 0x4EE782FA, - 0x64AA907F, 0x4F0F1126, - 0x648B7CDF, 0x4F369320, - 0x646C59BF, 0x4F5E08E3, - 0x644D2722, 0x4F857268, - 0x642DE50D, 0x4FACCFAB, - 0x640E9385, 0x4FD420A3, - 0x63EF328F, 0x4FFB654D, - 0x63CFC230, 0x50229DA0, - 0x63B0426D, 0x5049C999, - 0x6390B34A, 0x5070E92F, - 0x637114CC, 0x5097FC5E, - 0x635166F8, 0x50BF031F, - 0x6331A9D4, 0x50E5FD6C, - 0x6311DD63, 0x510CEB40, - 0x62F201AC, 0x5133CC94, - 0x62D216B2, 0x515AA162, - 0x62B21C7B, 0x518169A4, - 0x6292130C, 0x51A82555, - 0x6271FA69, 0x51CED46E, - 0x6251D297, 0x51F576E9, - 0x62319B9D, 0x521C0CC1, - 0x6211557D, 0x524295EF, - 0x61F1003E, 0x5269126E, - 0x61D09BE5, 0x528F8237, - 0x61B02876, 0x52B5E545, - 0x618FA5F6, 0x52DC3B92, - 0x616F146B, 0x53028517, - 0x614E73D9, 0x5328C1D0, - 0x612DC446, 0x534EF1B5, - 0x610D05B7, 0x537514C1, - 0x60EC3830, 0x539B2AEF, - 0x60CB5BB6, 0x53C13438, - 0x60AA704F, 0x53E73097, - 0x60897600, 0x540D2005, - 0x60686CCE, 0x5433027D, - 0x604754BE, 0x5458D7F9, - 0x60262DD5, 0x547EA073, - 0x6004F818, 0x54A45BE5, - 0x5FE3B38D, 0x54CA0A4A, - 0x5FC26038, 0x54EFAB9C, - 0x5FA0FE1E, 0x55153FD4, - 0x5F7F8D46, 0x553AC6ED, - 0x5F5E0DB3, 0x556040E2, - 0x5F3C7F6B, 0x5585ADAC, - 0x5F1AE273, 0x55AB0D46, - 0x5EF936D1, 0x55D05FAA, - 0x5ED77C89, 0x55F5A4D2, - 0x5EB5B3A1, 0x561ADCB8, - 0x5E93DC1F, 0x56400757, - 0x5E71F606, 0x566524AA, - 0x5E50015D, 0x568A34A9, - 0x5E2DFE28, 0x56AF3750, - 0x5E0BEC6E, 0x56D42C99, - 0x5DE9CC32, 0x56F9147E, - 0x5DC79D7C, 0x571DEEF9, - 0x5DA5604E, 0x5742BC05, - 0x5D8314B0, 0x57677B9D, - 0x5D60BAA6, 0x578C2DB9, - 0x5D3E5236, 0x57B0D256, - 0x5D1BDB65, 0x57D5696C, - 0x5CF95638, 0x57F9F2F7, - 0x5CD6C2B4, 0x581E6EF1, - 0x5CB420DF, 0x5842DD54, - 0x5C9170BF, 0x58673E1B, - 0x5C6EB258, 0x588B913F, - 0x5C4BE5B0, 0x58AFD6BC, - 0x5C290ACC, 0x58D40E8C, - 0x5C0621B2, 0x58F838A9, - 0x5BE32A67, 0x591C550E, - 0x5BC024F0, 0x594063B4, - 0x5B9D1153, 0x59646497, - 0x5B79EF96, 0x598857B1, - 0x5B56BFBD, 0x59AC3CFD, - 0x5B3381CE, 0x59D01474, - 0x5B1035CF, 0x59F3DE12, - 0x5AECDBC4, 0x5A1799D0, - 0x5AC973B4, 0x5A3B47AA, - 0x5AA5FDA4, 0x5A5EE79A, - 0x5A82799A, 0x5A82799A, - 0x5A5EE79A, 0x5AA5FDA4, - 0x5A3B47AA, 0x5AC973B4, - 0x5A1799D0, 0x5AECDBC4, - 0x59F3DE12, 0x5B1035CF, - 0x59D01474, 0x5B3381CE, - 0x59AC3CFD, 0x5B56BFBD, - 0x598857B1, 0x5B79EF96, - 0x59646497, 0x5B9D1153, - 0x594063B4, 0x5BC024F0, - 0x591C550E, 0x5BE32A67, - 0x58F838A9, 0x5C0621B2, - 0x58D40E8C, 0x5C290ACC, - 0x58AFD6BC, 0x5C4BE5B0, - 0x588B913F, 0x5C6EB258, - 0x58673E1B, 0x5C9170BF, - 0x5842DD54, 0x5CB420DF, - 0x581E6EF1, 0x5CD6C2B4, - 0x57F9F2F7, 0x5CF95638, - 0x57D5696C, 0x5D1BDB65, - 0x57B0D256, 0x5D3E5236, - 0x578C2DB9, 0x5D60BAA6, - 0x57677B9D, 0x5D8314B0, - 0x5742BC05, 0x5DA5604E, - 0x571DEEF9, 0x5DC79D7C, - 0x56F9147E, 0x5DE9CC32, - 0x56D42C99, 0x5E0BEC6E, - 0x56AF3750, 0x5E2DFE28, - 0x568A34A9, 0x5E50015D, - 0x566524AA, 0x5E71F606, - 0x56400757, 0x5E93DC1F, - 0x561ADCB8, 0x5EB5B3A1, - 0x55F5A4D2, 0x5ED77C89, - 0x55D05FAA, 0x5EF936D1, - 0x55AB0D46, 0x5F1AE273, - 0x5585ADAC, 0x5F3C7F6B, - 0x556040E2, 0x5F5E0DB3, - 0x553AC6ED, 0x5F7F8D46, - 0x55153FD4, 0x5FA0FE1E, - 0x54EFAB9C, 0x5FC26038, - 0x54CA0A4A, 0x5FE3B38D, - 0x54A45BE5, 0x6004F818, - 0x547EA073, 0x60262DD5, - 0x5458D7F9, 0x604754BE, - 0x5433027D, 0x60686CCE, - 0x540D2005, 0x60897600, - 0x53E73097, 0x60AA704F, - 0x53C13438, 0x60CB5BB6, - 0x539B2AEF, 0x60EC3830, - 0x537514C1, 0x610D05B7, - 0x534EF1B5, 0x612DC446, - 0x5328C1D0, 0x614E73D9, - 0x53028517, 0x616F146B, - 0x52DC3B92, 0x618FA5F6, - 0x52B5E545, 0x61B02876, - 0x528F8237, 0x61D09BE5, - 0x5269126E, 0x61F1003E, - 0x524295EF, 0x6211557D, - 0x521C0CC1, 0x62319B9D, - 0x51F576E9, 0x6251D297, - 0x51CED46E, 0x6271FA69, - 0x51A82555, 0x6292130C, - 0x518169A4, 0x62B21C7B, - 0x515AA162, 0x62D216B2, - 0x5133CC94, 0x62F201AC, - 0x510CEB40, 0x6311DD63, - 0x50E5FD6C, 0x6331A9D4, - 0x50BF031F, 0x635166F8, - 0x5097FC5E, 0x637114CC, - 0x5070E92F, 0x6390B34A, - 0x5049C999, 0x63B0426D, - 0x50229DA0, 0x63CFC230, - 0x4FFB654D, 0x63EF328F, - 0x4FD420A3, 0x640E9385, - 0x4FACCFAB, 0x642DE50D, - 0x4F857268, 0x644D2722, - 0x4F5E08E3, 0x646C59BF, - 0x4F369320, 0x648B7CDF, - 0x4F0F1126, 0x64AA907F, - 0x4EE782FA, 0x64C99498, - 0x4EBFE8A4, 0x64E88926, - 0x4E984229, 0x65076E24, - 0x4E708F8F, 0x6526438E, - 0x4E48D0DC, 0x6545095F, - 0x4E210617, 0x6563BF92, - 0x4DF92F45, 0x65826622, - 0x4DD14C6E, 0x65A0FD0B, - 0x4DA95D96, 0x65BF8447, - 0x4D8162C4, 0x65DDFBD3, - 0x4D595BFE, 0x65FC63A9, - 0x4D31494B, 0x661ABBC5, - 0x4D092AB0, 0x66390422, - 0x4CE10034, 0x66573CBB, - 0x4CB8C9DD, 0x6675658C, - 0x4C9087B1, 0x66937E90, - 0x4C6839B6, 0x66B187C3, - 0x4C3FDFF3, 0x66CF811F, - 0x4C177A6E, 0x66ED6AA1, - 0x4BEF092D, 0x670B4443, - 0x4BC68C36, 0x67290E02, - 0x4B9E038F, 0x6746C7D7, - 0x4B756F3F, 0x676471C0, - 0x4B4CCF4D, 0x67820BB6, - 0x4B2423BD, 0x679F95B7, - 0x4AFB6C97, 0x67BD0FBC, - 0x4AD2A9E1, 0x67DA79C2, - 0x4AA9DBA1, 0x67F7D3C4, - 0x4A8101DE, 0x68151DBE, - 0x4A581C9D, 0x683257AA, - 0x4A2F2BE5, 0x684F8186, - 0x4A062FBD, 0x686C9B4B, - 0x49DD282A, 0x6889A4F5, - 0x49B41533, 0x68A69E81, - 0x498AF6DE, 0x68C387E9, - 0x4961CD32, 0x68E06129, - 0x49389836, 0x68FD2A3D, - 0x490F57EE, 0x6919E320, - 0x48E60C62, 0x69368BCE, - 0x48BCB598, 0x69532442, - 0x48935397, 0x696FAC78, - 0x4869E664, 0x698C246C, - 0x48406E07, 0x69A88C18, - 0x4816EA85, 0x69C4E37A, - 0x47ED5BE6, 0x69E12A8C, - 0x47C3C22E, 0x69FD614A, - 0x479A1D66, 0x6A1987B0, - 0x47706D93, 0x6A359DB9, - 0x4746B2BC, 0x6A51A361, - 0x471CECE6, 0x6A6D98A4, - 0x46F31C1A, 0x6A897D7D, - 0x46C9405C, 0x6AA551E8, - 0x469F59B4, 0x6AC115E1, - 0x46756827, 0x6ADCC964, - 0x464B6BBD, 0x6AF86C6C, - 0x4621647C, 0x6B13FEF5, - 0x45F7526B, 0x6B2F80FA, - 0x45CD358F, 0x6B4AF278, - 0x45A30DF0, 0x6B66536A, - 0x4578DB93, 0x6B81A3CD, - 0x454E9E80, 0x6B9CE39B, - 0x452456BC, 0x6BB812D0, - 0x44FA044F, 0x6BD3316A, - 0x44CFA73F, 0x6BEE3F62, - 0x44A53F93, 0x6C093CB6, - 0x447ACD50, 0x6C242960, - 0x4450507E, 0x6C3F055D, - 0x4425C923, 0x6C59D0A9, - 0x43FB3745, 0x6C748B3F, - 0x43D09AEC, 0x6C8F351C, - 0x43A5F41E, 0x6CA9CE3A, - 0x437B42E1, 0x6CC45697, - 0x4350873C, 0x6CDECE2E, - 0x4325C135, 0x6CF934FB, - 0x42FAF0D4, 0x6D138AFA, - 0x42D0161E, 0x6D2DD027, - 0x42A5311A, 0x6D48047E, - 0x427A41D0, 0x6D6227FA, - 0x424F4845, 0x6D7C3A98, - 0x42244480, 0x6D963C54, - 0x41F93688, 0x6DB02D29, - 0x41CE1E64, 0x6DCA0D14, - 0x41A2FC1A, 0x6DE3DC11, - 0x4177CFB0, 0x6DFD9A1B, - 0x414C992E, 0x6E17472F, - 0x4121589A, 0x6E30E349, - 0x40F60DFB, 0x6E4A6E65, - 0x40CAB957, 0x6E63E87F, - 0x409F5AB6, 0x6E7D5193, - 0x4073F21D, 0x6E96A99C, - 0x40487F93, 0x6EAFF098, - 0x401D0320, 0x6EC92682, - 0x3FF17CCA, 0x6EE24B57, - 0x3FC5EC97, 0x6EFB5F12, - 0x3F9A528F, 0x6F1461AF, - 0x3F6EAEB8, 0x6F2D532C, - 0x3F430118, 0x6F463383, - 0x3F1749B7, 0x6F5F02B1, - 0x3EEB889C, 0x6F77C0B3, - 0x3EBFBDCC, 0x6F906D84, - 0x3E93E94F, 0x6FA90920, - 0x3E680B2C, 0x6FC19385, - 0x3E3C2369, 0x6FDA0CAD, - 0x3E10320D, 0x6FF27496, - 0x3DE4371F, 0x700ACB3B, - 0x3DB832A5, 0x70231099, - 0x3D8C24A7, 0x703B44AC, - 0x3D600D2B, 0x70536771, - 0x3D33EC39, 0x706B78E3, - 0x3D07C1D5, 0x708378FE, - 0x3CDB8E09, 0x709B67C0, - 0x3CAF50DA, 0x70B34524, - 0x3C830A4F, 0x70CB1127, - 0x3C56BA70, 0x70E2CBC6, - 0x3C2A6142, 0x70FA74FB, - 0x3BFDFECD, 0x71120CC5, - 0x3BD19317, 0x7129931E, - 0x3BA51E29, 0x71410804, - 0x3B78A007, 0x71586B73, - 0x3B4C18BA, 0x716FBD68, - 0x3B1F8847, 0x7186FDDE, - 0x3AF2EEB7, 0x719E2CD2, - 0x3AC64C0F, 0x71B54A40, - 0x3A99A057, 0x71CC5626, - 0x3A6CEB95, 0x71E3507F, - 0x3A402DD1, 0x71FA3948, - 0x3A136712, 0x7211107D, - 0x39E6975D, 0x7227D61C, - 0x39B9BEBB, 0x723E8A1F, - 0x398CDD32, 0x72552C84, - 0x395FF2C9, 0x726BBD48, - 0x3932FF87, 0x72823C66, - 0x39060372, 0x7298A9DC, - 0x38D8FE93, 0x72AF05A6, - 0x38ABF0EF, 0x72C54FC0, - 0x387EDA8E, 0x72DB8828, - 0x3851BB76, 0x72F1AED8, - 0x382493B0, 0x7307C3D0, - 0x37F76340, 0x731DC709, - 0x37CA2A30, 0x7333B883, - 0x379CE884, 0x73499838, - 0x376F9E46, 0x735F6626, - 0x37424B7A, 0x73752249, - 0x3714F02A, 0x738ACC9E, - 0x36E78C5A, 0x73A06522, - 0x36BA2013, 0x73B5EBD0, - 0x368CAB5C, 0x73CB60A7, - 0x365F2E3B, 0x73E0C3A3, - 0x3631A8B7, 0x73F614C0, - 0x36041AD9, 0x740B53FA, - 0x35D684A5, 0x74208150, - 0x35A8E624, 0x74359CBD, - 0x357B3F5D, 0x744AA63E, - 0x354D9056, 0x745F9DD1, - 0x351FD917, 0x74748371, - 0x34F219A7, 0x7489571B, - 0x34C4520D, 0x749E18CD, - 0x3496824F, 0x74B2C883, - 0x3468AA76, 0x74C7663A, - 0x343ACA87, 0x74DBF1EF, - 0x340CE28A, 0x74F06B9E, - 0x33DEF287, 0x7504D345, - 0x33B0FA84, 0x751928E0, - 0x3382FA88, 0x752D6C6C, - 0x3354F29A, 0x75419DE6, - 0x3326E2C2, 0x7555BD4B, - 0x32F8CB07, 0x7569CA98, - 0x32CAAB6F, 0x757DC5CA, - 0x329C8402, 0x7591AEDD, - 0x326E54C7, 0x75A585CF, - 0x32401DC5, 0x75B94A9C, - 0x3211DF03, 0x75CCFD42, - 0x31E39889, 0x75E09DBD, - 0x31B54A5D, 0x75F42C0A, - 0x3186F487, 0x7607A827, - 0x3158970D, 0x761B1211, - 0x312A31F8, 0x762E69C3, - 0x30FBC54D, 0x7641AF3C, - 0x30CD5114, 0x7654E279, - 0x309ED555, 0x76680376, - 0x30705217, 0x767B1230, - 0x3041C760, 0x768E0EA5, - 0x30133538, 0x76A0F8D2, - 0x2FE49BA6, 0x76B3D0B3, - 0x2FB5FAB2, 0x76C69646, - 0x2F875262, 0x76D94988, - 0x2F58A2BD, 0x76EBEA77, - 0x2F29EBCC, 0x76FE790E, - 0x2EFB2D94, 0x7710F54B, - 0x2ECC681E, 0x77235F2D, - 0x2E9D9B70, 0x7735B6AE, - 0x2E6EC792, 0x7747FBCE, - 0x2E3FEC8B, 0x775A2E88, - 0x2E110A62, 0x776C4EDB, - 0x2DE2211E, 0x777E5CC3, - 0x2DB330C7, 0x7790583D, - 0x2D843963, 0x77A24148, - 0x2D553AFB, 0x77B417DF, - 0x2D263595, 0x77C5DC01, - 0x2CF72939, 0x77D78DAA, - 0x2CC815ED, 0x77E92CD8, - 0x2C98FBBA, 0x77FAB988, - 0x2C69DAA6, 0x780C33B8, - 0x2C3AB2B9, 0x781D9B64, - 0x2C0B83F9, 0x782EF08B, - 0x2BDC4E6F, 0x78403328, - 0x2BAD1221, 0x7851633B, - 0x2B7DCF17, 0x786280BF, - 0x2B4E8558, 0x78738BB3, - 0x2B1F34EB, 0x78848413, - 0x2AEFDDD8, 0x789569DE, - 0x2AC08025, 0x78A63D10, - 0x2A911BDB, 0x78B6FDA8, - 0x2A61B101, 0x78C7ABA1, - 0x2A323F9D, 0x78D846FB, - 0x2A02C7B8, 0x78E8CFB1, - 0x29D34958, 0x78F945C3, - 0x29A3C484, 0x7909A92C, - 0x29743945, 0x7919F9EB, - 0x2944A7A2, 0x792A37FE, - 0x29150FA1, 0x793A6360, - 0x28E5714A, 0x794A7C11, - 0x28B5CCA5, 0x795A820E, - 0x288621B9, 0x796A7554, - 0x2856708C, 0x797A55E0, - 0x2826B928, 0x798A23B1, - 0x27F6FB92, 0x7999DEC3, - 0x27C737D2, 0x79A98715, - 0x27976DF1, 0x79B91CA4, - 0x27679DF4, 0x79C89F6D, - 0x2737C7E3, 0x79D80F6F, - 0x2707EBC6, 0x79E76CA6, - 0x26D809A5, 0x79F6B711, - 0x26A82185, 0x7A05EEAD, - 0x26783370, 0x7A151377, - 0x26483F6C, 0x7A24256E, - 0x26184581, 0x7A33248F, - 0x25E845B5, 0x7A4210D8, - 0x25B84012, 0x7A50EA46, - 0x2588349D, 0x7A5FB0D8, - 0x2558235E, 0x7A6E648A, - 0x25280C5D, 0x7A7D055B, - 0x24F7EFA1, 0x7A8B9348, - 0x24C7CD32, 0x7A9A0E4F, - 0x2497A517, 0x7AA8766E, - 0x24677757, 0x7AB6CBA3, - 0x243743FA, 0x7AC50DEB, - 0x24070B07, 0x7AD33D45, - 0x23D6CC86, 0x7AE159AE, - 0x23A6887E, 0x7AEF6323, - 0x23763EF7, 0x7AFD59A3, - 0x2345EFF7, 0x7B0B3D2C, - 0x23159B87, 0x7B190DBB, - 0x22E541AE, 0x7B26CB4F, - 0x22B4E274, 0x7B3475E4, - 0x22847DDF, 0x7B420D7A, - 0x225413F8, 0x7B4F920E, - 0x2223A4C5, 0x7B5D039D, - 0x21F3304E, 0x7B6A6227, - 0x21C2B69C, 0x7B77ADA8, - 0x219237B4, 0x7B84E61E, - 0x2161B39F, 0x7B920B89, - 0x21312A65, 0x7B9F1DE5, - 0x21009C0B, 0x7BAC1D31, - 0x20D0089B, 0x7BB9096A, - 0x209F701C, 0x7BC5E28F, - 0x206ED295, 0x7BD2A89E, - 0x203E300D, 0x7BDF5B94, - 0x200D888C, 0x7BEBFB70, - 0x1FDCDC1A, 0x7BF88830, - 0x1FAC2ABF, 0x7C0501D1, - 0x1F7B7480, 0x7C116853, - 0x1F4AB967, 0x7C1DBBB2, - 0x1F19F97B, 0x7C29FBEE, - 0x1EE934C2, 0x7C362904, - 0x1EB86B46, 0x7C4242F2, - 0x1E879D0C, 0x7C4E49B6, - 0x1E56CA1E, 0x7C5A3D4F, - 0x1E25F281, 0x7C661DBB, - 0x1DF5163F, 0x7C71EAF8, - 0x1DC4355D, 0x7C7DA504, - 0x1D934FE5, 0x7C894BDD, - 0x1D6265DD, 0x7C94DF82, - 0x1D31774D, 0x7CA05FF1, - 0x1D00843C, 0x7CABCD27, - 0x1CCF8CB3, 0x7CB72724, - 0x1C9E90B8, 0x7CC26DE5, - 0x1C6D9053, 0x7CCDA168, - 0x1C3C8B8C, 0x7CD8C1AD, - 0x1C0B826A, 0x7CE3CEB1, - 0x1BDA74F5, 0x7CEEC873, - 0x1BA96334, 0x7CF9AEF0, - 0x1B784D30, 0x7D048228, - 0x1B4732EF, 0x7D0F4218, - 0x1B161479, 0x7D19EEBE, - 0x1AE4F1D6, 0x7D24881A, - 0x1AB3CB0C, 0x7D2F0E2A, - 0x1A82A025, 0x7D3980EC, - 0x1A517127, 0x7D43E05E, - 0x1A203E1B, 0x7D4E2C7E, - 0x19EF0706, 0x7D58654C, - 0x19BDCBF2, 0x7D628AC5, - 0x198C8CE6, 0x7D6C9CE9, - 0x195B49E9, 0x7D769BB5, - 0x192A0303, 0x7D808727, - 0x18F8B83C, 0x7D8A5F3F, - 0x18C7699B, 0x7D9423FB, - 0x18961727, 0x7D9DD55A, - 0x1864C0E9, 0x7DA77359, - 0x183366E8, 0x7DB0FDF7, - 0x1802092C, 0x7DBA7534, - 0x17D0A7BB, 0x7DC3D90D, - 0x179F429F, 0x7DCD2981, - 0x176DD9DE, 0x7DD6668E, - 0x173C6D80, 0x7DDF9034, - 0x170AFD8D, 0x7DE8A670, - 0x16D98A0C, 0x7DF1A942, - 0x16A81305, 0x7DFA98A7, - 0x1676987F, 0x7E03749F, - 0x16451A83, 0x7E0C3D29, - 0x16139917, 0x7E14F242, - 0x15E21444, 0x7E1D93E9, - 0x15B08C11, 0x7E26221E, - 0x157F0086, 0x7E2E9CDF, - 0x154D71AA, 0x7E37042A, - 0x151BDF85, 0x7E3F57FE, - 0x14EA4A1F, 0x7E47985B, - 0x14B8B17F, 0x7E4FC53E, - 0x148715AD, 0x7E57DEA6, - 0x145576B1, 0x7E5FE493, - 0x1423D492, 0x7E67D702, - 0x13F22F57, 0x7E6FB5F3, - 0x13C0870A, 0x7E778165, - 0x138EDBB0, 0x7E7F3956, - 0x135D2D53, 0x7E86DDC5, - 0x132B7BF9, 0x7E8E6EB1, - 0x12F9C7AA, 0x7E95EC19, - 0x12C8106E, 0x7E9D55FC, - 0x1296564D, 0x7EA4AC58, - 0x1264994E, 0x7EABEF2C, - 0x1232D978, 0x7EB31E77, - 0x120116D4, 0x7EBA3A39, - 0x11CF516A, 0x7EC1426F, - 0x119D8940, 0x7EC8371A, - 0x116BBE5F, 0x7ECF1837, - 0x1139F0CE, 0x7ED5E5C6, - 0x11082096, 0x7EDC9FC6, - 0x10D64DBC, 0x7EE34635, - 0x10A4784A, 0x7EE9D913, - 0x1072A047, 0x7EF0585F, - 0x1040C5BB, 0x7EF6C418, - 0x100EE8AD, 0x7EFD1C3C, - 0x0FDD0925, 0x7F0360CB, - 0x0FAB272B, 0x7F0991C3, - 0x0F7942C6, 0x7F0FAF24, - 0x0F475BFE, 0x7F15B8EE, - 0x0F1572DC, 0x7F1BAF1E, - 0x0EE38765, 0x7F2191B4, - 0x0EB199A3, 0x7F2760AF, - 0x0E7FA99D, 0x7F2D1C0E, - 0x0E4DB75B, 0x7F32C3D0, - 0x0E1BC2E3, 0x7F3857F5, - 0x0DE9CC3F, 0x7F3DD87C, - 0x0DB7D376, 0x7F434563, - 0x0D85D88F, 0x7F489EAA, - 0x0D53DB92, 0x7F4DE450, - 0x0D21DC87, 0x7F531654, - 0x0CEFDB75, 0x7F5834B6, - 0x0CBDD865, 0x7F5D3F75, - 0x0C8BD35E, 0x7F62368F, - 0x0C59CC67, 0x7F671A04, - 0x0C27C389, 0x7F6BE9D4, - 0x0BF5B8CB, 0x7F70A5FD, - 0x0BC3AC35, 0x7F754E7F, - 0x0B919DCE, 0x7F79E35A, - 0x0B5F8D9F, 0x7F7E648B, - 0x0B2D7BAE, 0x7F82D214, - 0x0AFB6805, 0x7F872BF3, - 0x0AC952AA, 0x7F8B7226, - 0x0A973BA5, 0x7F8FA4AF, - 0x0A6522FE, 0x7F93C38C, - 0x0A3308BC, 0x7F97CEBC, - 0x0A00ECE8, 0x7F9BC63F, - 0x09CECF89, 0x7F9FAA15, - 0x099CB0A7, 0x7FA37A3C, - 0x096A9049, 0x7FA736B4, - 0x09386E77, 0x7FAADF7C, - 0x09064B3A, 0x7FAE7494, - 0x08D42698, 0x7FB1F5FC, - 0x08A2009A, 0x7FB563B2, - 0x086FD947, 0x7FB8BDB7, - 0x083DB0A7, 0x7FBC040A, - 0x080B86C1, 0x7FBF36A9, - 0x07D95B9E, 0x7FC25596, - 0x07A72F45, 0x7FC560CF, - 0x077501BE, 0x7FC85853, - 0x0742D310, 0x7FCB3C23, - 0x0710A344, 0x7FCE0C3E, - 0x06DE7261, 0x7FD0C8A3, - 0x06AC406F, 0x7FD37152, - 0x067A0D75, 0x7FD6064B, - 0x0647D97C, 0x7FD8878D, - 0x0615A48A, 0x7FDAF518, - 0x05E36EA9, 0x7FDD4EEC, - 0x05B137DF, 0x7FDF9508, - 0x057F0034, 0x7FE1C76B, - 0x054CC7B0, 0x7FE3E616, - 0x051A8E5C, 0x7FE5F108, - 0x04E8543D, 0x7FE7E840, - 0x04B6195D, 0x7FE9CBC0, - 0x0483DDC3, 0x7FEB9B85, - 0x0451A176, 0x7FED5790, - 0x041F647F, 0x7FEEFFE1, - 0x03ED26E6, 0x7FF09477, - 0x03BAE8B1, 0x7FF21553, - 0x0388A9E9, 0x7FF38273, - 0x03566A96, 0x7FF4DBD8, - 0x03242ABF, 0x7FF62182, - 0x02F1EA6B, 0x7FF7536F, - 0x02BFA9A4, 0x7FF871A1, - 0x028D6870, 0x7FF97C17, - 0x025B26D7, 0x7FFA72D1, - 0x0228E4E1, 0x7FFB55CE, - 0x01F6A296, 0x7FFC250F, - 0x01C45FFE, 0x7FFCE093, - 0x01921D1F, 0x7FFD885A, - 0x015FDA03, 0x7FFE1C64, - 0x012D96B0, 0x7FFE9CB2, - 0x00FB532F, 0x7FFF0942, - 0x00C90F88, 0x7FFF6216, - 0x0096CBC1, 0x7FFFA72C, - 0x006487E3, 0x7FFFD885, - 0x003243F5, 0x7FFFF621, - 0x00000000, 0x7FFFFFFF, - 0xFFCDBC0A, 0x7FFFF621, - 0xFF9B781D, 0x7FFFD885, - 0xFF69343E, 0x7FFFA72C, - 0xFF36F078, 0x7FFF6216, - 0xFF04ACD0, 0x7FFF0942, - 0xFED2694F, 0x7FFE9CB2, - 0xFEA025FC, 0x7FFE1C64, - 0xFE6DE2E0, 0x7FFD885A, - 0xFE3BA001, 0x7FFCE093, - 0xFE095D69, 0x7FFC250F, - 0xFDD71B1E, 0x7FFB55CE, - 0xFDA4D928, 0x7FFA72D1, - 0xFD72978F, 0x7FF97C17, - 0xFD40565B, 0x7FF871A1, - 0xFD0E1594, 0x7FF7536F, - 0xFCDBD541, 0x7FF62182, - 0xFCA99569, 0x7FF4DBD8, - 0xFC775616, 0x7FF38273, - 0xFC45174E, 0x7FF21553, - 0xFC12D919, 0x7FF09477, - 0xFBE09B80, 0x7FEEFFE1, - 0xFBAE5E89, 0x7FED5790, - 0xFB7C223C, 0x7FEB9B85, - 0xFB49E6A2, 0x7FE9CBC0, - 0xFB17ABC2, 0x7FE7E840, - 0xFAE571A4, 0x7FE5F108, - 0xFAB3384F, 0x7FE3E616, - 0xFA80FFCB, 0x7FE1C76B, - 0xFA4EC820, 0x7FDF9508, - 0xFA1C9156, 0x7FDD4EEC, - 0xF9EA5B75, 0x7FDAF518, - 0xF9B82683, 0x7FD8878D, - 0xF985F28A, 0x7FD6064B, - 0xF953BF90, 0x7FD37152, - 0xF9218D9E, 0x7FD0C8A3, - 0xF8EF5CBB, 0x7FCE0C3E, - 0xF8BD2CEF, 0x7FCB3C23, - 0xF88AFE41, 0x7FC85853, - 0xF858D0BA, 0x7FC560CF, - 0xF826A461, 0x7FC25596, - 0xF7F4793E, 0x7FBF36A9, - 0xF7C24F58, 0x7FBC040A, - 0xF79026B8, 0x7FB8BDB7, - 0xF75DFF65, 0x7FB563B2, - 0xF72BD967, 0x7FB1F5FC, - 0xF6F9B4C5, 0x7FAE7494, - 0xF6C79188, 0x7FAADF7C, - 0xF6956FB6, 0x7FA736B4, - 0xF6634F58, 0x7FA37A3C, - 0xF6313076, 0x7F9FAA15, - 0xF5FF1317, 0x7F9BC63F, - 0xF5CCF743, 0x7F97CEBC, - 0xF59ADD01, 0x7F93C38C, - 0xF568C45A, 0x7F8FA4AF, - 0xF536AD55, 0x7F8B7226, - 0xF50497FA, 0x7F872BF3, - 0xF4D28451, 0x7F82D214, - 0xF4A07260, 0x7F7E648B, - 0xF46E6231, 0x7F79E35A, - 0xF43C53CA, 0x7F754E7F, - 0xF40A4734, 0x7F70A5FD, - 0xF3D83C76, 0x7F6BE9D4, - 0xF3A63398, 0x7F671A04, - 0xF3742CA1, 0x7F62368F, - 0xF342279A, 0x7F5D3F75, - 0xF310248A, 0x7F5834B6, - 0xF2DE2378, 0x7F531654, - 0xF2AC246D, 0x7F4DE450, - 0xF27A2770, 0x7F489EAA, - 0xF2482C89, 0x7F434563, - 0xF21633C0, 0x7F3DD87C, - 0xF1E43D1C, 0x7F3857F5, - 0xF1B248A5, 0x7F32C3D0, - 0xF1805662, 0x7F2D1C0E, - 0xF14E665C, 0x7F2760AF, - 0xF11C789A, 0x7F2191B4, - 0xF0EA8D23, 0x7F1BAF1E, - 0xF0B8A401, 0x7F15B8EE, - 0xF086BD39, 0x7F0FAF24, - 0xF054D8D4, 0x7F0991C3, - 0xF022F6DA, 0x7F0360CB, - 0xEFF11752, 0x7EFD1C3C, - 0xEFBF3A44, 0x7EF6C418, - 0xEF8D5FB8, 0x7EF0585F, - 0xEF5B87B5, 0x7EE9D913, - 0xEF29B243, 0x7EE34635, - 0xEEF7DF6A, 0x7EDC9FC6, - 0xEEC60F31, 0x7ED5E5C6, - 0xEE9441A0, 0x7ECF1837, - 0xEE6276BF, 0x7EC8371A, - 0xEE30AE95, 0x7EC1426F, - 0xEDFEE92B, 0x7EBA3A39, - 0xEDCD2687, 0x7EB31E77, - 0xED9B66B2, 0x7EABEF2C, - 0xED69A9B2, 0x7EA4AC58, - 0xED37EF91, 0x7E9D55FC, - 0xED063855, 0x7E95EC19, - 0xECD48406, 0x7E8E6EB1, - 0xECA2D2AC, 0x7E86DDC5, - 0xEC71244F, 0x7E7F3956, - 0xEC3F78F5, 0x7E778165, - 0xEC0DD0A8, 0x7E6FB5F3, - 0xEBDC2B6D, 0x7E67D702, - 0xEBAA894E, 0x7E5FE493, - 0xEB78EA52, 0x7E57DEA6, - 0xEB474E80, 0x7E4FC53E, - 0xEB15B5E0, 0x7E47985B, - 0xEAE4207A, 0x7E3F57FE, - 0xEAB28E55, 0x7E37042A, - 0xEA80FF79, 0x7E2E9CDF, - 0xEA4F73EE, 0x7E26221E, - 0xEA1DEBBB, 0x7E1D93E9, - 0xE9EC66E8, 0x7E14F242, - 0xE9BAE57C, 0x7E0C3D29, - 0xE9896780, 0x7E03749F, - 0xE957ECFB, 0x7DFA98A7, - 0xE92675F4, 0x7DF1A942, - 0xE8F50273, 0x7DE8A670, - 0xE8C3927F, 0x7DDF9034, - 0xE8922621, 0x7DD6668E, - 0xE860BD60, 0x7DCD2981, - 0xE82F5844, 0x7DC3D90D, - 0xE7FDF6D3, 0x7DBA7534, - 0xE7CC9917, 0x7DB0FDF7, - 0xE79B3F16, 0x7DA77359, - 0xE769E8D8, 0x7D9DD55A, - 0xE7389664, 0x7D9423FB, - 0xE70747C3, 0x7D8A5F3F, - 0xE6D5FCFC, 0x7D808727, - 0xE6A4B616, 0x7D769BB5, - 0xE6737319, 0x7D6C9CE9, - 0xE642340D, 0x7D628AC5, - 0xE610F8F9, 0x7D58654C, - 0xE5DFC1E4, 0x7D4E2C7E, - 0xE5AE8ED8, 0x7D43E05E, - 0xE57D5FDA, 0x7D3980EC, - 0xE54C34F3, 0x7D2F0E2A, - 0xE51B0E2A, 0x7D24881A, - 0xE4E9EB86, 0x7D19EEBE, - 0xE4B8CD10, 0x7D0F4218, - 0xE487B2CF, 0x7D048228, - 0xE4569CCB, 0x7CF9AEF0, - 0xE4258B0A, 0x7CEEC873, - 0xE3F47D95, 0x7CE3CEB1, - 0xE3C37473, 0x7CD8C1AD, - 0xE3926FAC, 0x7CCDA168, - 0xE3616F47, 0x7CC26DE5, - 0xE330734C, 0x7CB72724, - 0xE2FF7BC3, 0x7CABCD27, - 0xE2CE88B2, 0x7CA05FF1, - 0xE29D9A22, 0x7C94DF82, - 0xE26CB01A, 0x7C894BDD, - 0xE23BCAA2, 0x7C7DA504, - 0xE20AE9C1, 0x7C71EAF8, - 0xE1DA0D7E, 0x7C661DBB, - 0xE1A935E1, 0x7C5A3D4F, - 0xE17862F3, 0x7C4E49B6, - 0xE14794B9, 0x7C4242F2, - 0xE116CB3D, 0x7C362904, - 0xE0E60684, 0x7C29FBEE, - 0xE0B54698, 0x7C1DBBB2, - 0xE0848B7F, 0x7C116853, - 0xE053D541, 0x7C0501D1, - 0xE02323E5, 0x7BF88830, - 0xDFF27773, 0x7BEBFB70, - 0xDFC1CFF2, 0x7BDF5B94, - 0xDF912D6A, 0x7BD2A89E, - 0xDF608FE3, 0x7BC5E28F, - 0xDF2FF764, 0x7BB9096A, - 0xDEFF63F4, 0x7BAC1D31, - 0xDECED59B, 0x7B9F1DE5, - 0xDE9E4C60, 0x7B920B89, - 0xDE6DC84B, 0x7B84E61E, - 0xDE3D4963, 0x7B77ADA8, - 0xDE0CCFB1, 0x7B6A6227, - 0xDDDC5B3A, 0x7B5D039D, - 0xDDABEC07, 0x7B4F920E, - 0xDD7B8220, 0x7B420D7A, - 0xDD4B1D8B, 0x7B3475E4, - 0xDD1ABE51, 0x7B26CB4F, - 0xDCEA6478, 0x7B190DBB, - 0xDCBA1008, 0x7B0B3D2C, - 0xDC89C108, 0x7AFD59A3, - 0xDC597781, 0x7AEF6323, - 0xDC293379, 0x7AE159AE, - 0xDBF8F4F8, 0x7AD33D45, - 0xDBC8BC05, 0x7AC50DEB, - 0xDB9888A8, 0x7AB6CBA3, - 0xDB685AE8, 0x7AA8766E, - 0xDB3832CD, 0x7A9A0E4F, - 0xDB08105E, 0x7A8B9348, - 0xDAD7F3A2, 0x7A7D055B, - 0xDAA7DCA1, 0x7A6E648A, - 0xDA77CB62, 0x7A5FB0D8, - 0xDA47BFED, 0x7A50EA46, - 0xDA17BA4A, 0x7A4210D8, - 0xD9E7BA7E, 0x7A33248F, - 0xD9B7C093, 0x7A24256E, - 0xD987CC8F, 0x7A151377, - 0xD957DE7A, 0x7A05EEAD, - 0xD927F65B, 0x79F6B711, - 0xD8F81439, 0x79E76CA6, - 0xD8C8381C, 0x79D80F6F, - 0xD898620C, 0x79C89F6D, - 0xD868920F, 0x79B91CA4, - 0xD838C82D, 0x79A98715, - 0xD809046D, 0x7999DEC3, - 0xD7D946D7, 0x798A23B1, - 0xD7A98F73, 0x797A55E0, - 0xD779DE46, 0x796A7554, - 0xD74A335A, 0x795A820E, - 0xD71A8EB5, 0x794A7C11, - 0xD6EAF05E, 0x793A6360, - 0xD6BB585D, 0x792A37FE, - 0xD68BC6BA, 0x7919F9EB, - 0xD65C3B7B, 0x7909A92C, - 0xD62CB6A7, 0x78F945C3, - 0xD5FD3847, 0x78E8CFB1, - 0xD5CDC062, 0x78D846FB, - 0xD59E4EFE, 0x78C7ABA1, - 0xD56EE424, 0x78B6FDA8, - 0xD53F7FDA, 0x78A63D10, - 0xD5102227, 0x789569DE, - 0xD4E0CB14, 0x78848413, - 0xD4B17AA7, 0x78738BB3, - 0xD48230E8, 0x786280BF, - 0xD452EDDE, 0x7851633B, - 0xD423B190, 0x78403328, - 0xD3F47C06, 0x782EF08B, - 0xD3C54D46, 0x781D9B64, - 0xD3962559, 0x780C33B8, - 0xD3670445, 0x77FAB988, - 0xD337EA12, 0x77E92CD8, - 0xD308D6C6, 0x77D78DAA, - 0xD2D9CA6A, 0x77C5DC01, - 0xD2AAC504, 0x77B417DF, - 0xD27BC69C, 0x77A24148, - 0xD24CCF38, 0x7790583D, - 0xD21DDEE1, 0x777E5CC3, - 0xD1EEF59E, 0x776C4EDB, - 0xD1C01374, 0x775A2E88, - 0xD191386D, 0x7747FBCE, - 0xD162648F, 0x7735B6AE, - 0xD13397E1, 0x77235F2D, - 0xD104D26B, 0x7710F54B, - 0xD0D61433, 0x76FE790E, - 0xD0A75D42, 0x76EBEA77, - 0xD078AD9D, 0x76D94988, - 0xD04A054D, 0x76C69646, - 0xD01B6459, 0x76B3D0B3, - 0xCFECCAC7, 0x76A0F8D2, - 0xCFBE389F, 0x768E0EA5, - 0xCF8FADE8, 0x767B1230, - 0xCF612AAA, 0x76680376, - 0xCF32AEEB, 0x7654E279, - 0xCF043AB2, 0x7641AF3C, - 0xCED5CE08, 0x762E69C3, - 0xCEA768F2, 0x761B1211, - 0xCE790B78, 0x7607A827, - 0xCE4AB5A2, 0x75F42C0A, - 0xCE1C6776, 0x75E09DBD, - 0xCDEE20FC, 0x75CCFD42, - 0xCDBFE23A, 0x75B94A9C, - 0xCD91AB38, 0x75A585CF, - 0xCD637BFD, 0x7591AEDD, - 0xCD355490, 0x757DC5CA, - 0xCD0734F8, 0x7569CA98, - 0xCCD91D3D, 0x7555BD4B, - 0xCCAB0D65, 0x75419DE6, - 0xCC7D0577, 0x752D6C6C, - 0xCC4F057B, 0x751928E0, - 0xCC210D78, 0x7504D345, - 0xCBF31D75, 0x74F06B9E, - 0xCBC53578, 0x74DBF1EF, - 0xCB975589, 0x74C7663A, - 0xCB697DB0, 0x74B2C883, - 0xCB3BADF2, 0x749E18CD, - 0xCB0DE658, 0x7489571B, - 0xCAE026E8, 0x74748371, - 0xCAB26FA9, 0x745F9DD1, - 0xCA84C0A2, 0x744AA63E, - 0xCA5719DB, 0x74359CBD, - 0xCA297B5A, 0x74208150, - 0xC9FBE527, 0x740B53FA, - 0xC9CE5748, 0x73F614C0, - 0xC9A0D1C4, 0x73E0C3A3, - 0xC97354A3, 0x73CB60A7, - 0xC945DFEC, 0x73B5EBD0, - 0xC91873A5, 0x73A06522, - 0xC8EB0FD6, 0x738ACC9E, - 0xC8BDB485, 0x73752249, - 0xC89061BA, 0x735F6626, - 0xC863177B, 0x73499838, - 0xC835D5D0, 0x7333B883, - 0xC8089CBF, 0x731DC709, - 0xC7DB6C50, 0x7307C3D0, - 0xC7AE4489, 0x72F1AED8, - 0xC7812571, 0x72DB8828, - 0xC7540F10, 0x72C54FC0, - 0xC727016C, 0x72AF05A6, - 0xC6F9FC8D, 0x7298A9DC, - 0xC6CD0079, 0x72823C66, - 0xC6A00D36, 0x726BBD48, - 0xC67322CD, 0x72552C84, - 0xC6464144, 0x723E8A1F, - 0xC61968A2, 0x7227D61C, - 0xC5EC98ED, 0x7211107D, - 0xC5BFD22E, 0x71FA3948, - 0xC593146A, 0x71E3507F, - 0xC5665FA8, 0x71CC5626, - 0xC539B3F0, 0x71B54A40, - 0xC50D1148, 0x719E2CD2, - 0xC4E077B8, 0x7186FDDE, - 0xC4B3E746, 0x716FBD68, - 0xC4875FF8, 0x71586B73, - 0xC45AE1D7, 0x71410804, - 0xC42E6CE8, 0x7129931E, - 0xC4020132, 0x71120CC5, - 0xC3D59EBD, 0x70FA74FB, - 0xC3A9458F, 0x70E2CBC6, - 0xC37CF5B0, 0x70CB1127, - 0xC350AF25, 0x70B34524, - 0xC32471F6, 0x709B67C0, - 0xC2F83E2A, 0x708378FE, - 0xC2CC13C7, 0x706B78E3, - 0xC29FF2D4, 0x70536771, - 0xC273DB58, 0x703B44AC, - 0xC247CD5A, 0x70231099, - 0xC21BC8E0, 0x700ACB3B, - 0xC1EFCDF2, 0x6FF27496, - 0xC1C3DC96, 0x6FDA0CAD, - 0xC197F4D3, 0x6FC19385, - 0xC16C16B0, 0x6FA90920, - 0xC1404233, 0x6F906D84, - 0xC1147763, 0x6F77C0B3, - 0xC0E8B648, 0x6F5F02B1, - 0xC0BCFEE7, 0x6F463383, - 0xC0915147, 0x6F2D532C, - 0xC065AD70, 0x6F1461AF, - 0xC03A1368, 0x6EFB5F12, - 0xC00E8335, 0x6EE24B57, - 0xBFE2FCDF, 0x6EC92682, - 0xBFB7806C, 0x6EAFF098, - 0xBF8C0DE2, 0x6E96A99C, - 0xBF60A54A, 0x6E7D5193, - 0xBF3546A8, 0x6E63E87F, - 0xBF09F204, 0x6E4A6E65, - 0xBEDEA765, 0x6E30E349, - 0xBEB366D1, 0x6E17472F, - 0xBE88304F, 0x6DFD9A1B, - 0xBE5D03E5, 0x6DE3DC11, - 0xBE31E19B, 0x6DCA0D14, - 0xBE06C977, 0x6DB02D29, - 0xBDDBBB7F, 0x6D963C54, - 0xBDB0B7BA, 0x6D7C3A98, - 0xBD85BE2F, 0x6D6227FA, - 0xBD5ACEE5, 0x6D48047E, - 0xBD2FE9E1, 0x6D2DD027, - 0xBD050F2C, 0x6D138AFA, - 0xBCDA3ECA, 0x6CF934FB, - 0xBCAF78C3, 0x6CDECE2E, - 0xBC84BD1E, 0x6CC45697, - 0xBC5A0BE1, 0x6CA9CE3A, - 0xBC2F6513, 0x6C8F351C, - 0xBC04C8BA, 0x6C748B3F, - 0xBBDA36DC, 0x6C59D0A9, - 0xBBAFAF81, 0x6C3F055D, - 0xBB8532AF, 0x6C242960, - 0xBB5AC06C, 0x6C093CB6, - 0xBB3058C0, 0x6BEE3F62, - 0xBB05FBB0, 0x6BD3316A, - 0xBADBA943, 0x6BB812D0, - 0xBAB1617F, 0x6B9CE39B, - 0xBA87246C, 0x6B81A3CD, - 0xBA5CF210, 0x6B66536A, - 0xBA32CA70, 0x6B4AF278, - 0xBA08AD94, 0x6B2F80FA, - 0xB9DE9B83, 0x6B13FEF5, - 0xB9B49442, 0x6AF86C6C, - 0xB98A97D8, 0x6ADCC964, - 0xB960A64B, 0x6AC115E1, - 0xB936BFA3, 0x6AA551E8, - 0xB90CE3E6, 0x6A897D7D, - 0xB8E31319, 0x6A6D98A4, - 0xB8B94D44, 0x6A51A361, - 0xB88F926C, 0x6A359DB9, - 0xB865E299, 0x6A1987B0, - 0xB83C3DD1, 0x69FD614A, - 0xB812A419, 0x69E12A8C, - 0xB7E9157A, 0x69C4E37A, - 0xB7BF91F8, 0x69A88C18, - 0xB796199B, 0x698C246C, - 0xB76CAC68, 0x696FAC78, - 0xB7434A67, 0x69532442, - 0xB719F39D, 0x69368BCE, - 0xB6F0A811, 0x6919E320, - 0xB6C767CA, 0x68FD2A3D, - 0xB69E32CD, 0x68E06129, - 0xB6750921, 0x68C387E9, - 0xB64BEACC, 0x68A69E81, - 0xB622D7D5, 0x6889A4F5, - 0xB5F9D042, 0x686C9B4B, - 0xB5D0D41A, 0x684F8186, - 0xB5A7E362, 0x683257AA, - 0xB57EFE21, 0x68151DBE, - 0xB556245E, 0x67F7D3C4, - 0xB52D561E, 0x67DA79C2, - 0xB5049368, 0x67BD0FBC, - 0xB4DBDC42, 0x679F95B7, - 0xB4B330B2, 0x67820BB6, - 0xB48A90C0, 0x676471C0, - 0xB461FC70, 0x6746C7D7, - 0xB43973C9, 0x67290E02, - 0xB410F6D2, 0x670B4443, - 0xB3E88591, 0x66ED6AA1, - 0xB3C0200C, 0x66CF811F, - 0xB397C649, 0x66B187C3, - 0xB36F784E, 0x66937E90, - 0xB3473622, 0x6675658C, - 0xB31EFFCB, 0x66573CBB, - 0xB2F6D54F, 0x66390422, - 0xB2CEB6B5, 0x661ABBC5, - 0xB2A6A401, 0x65FC63A9, - 0xB27E9D3B, 0x65DDFBD3, - 0xB256A26A, 0x65BF8447, - 0xB22EB392, 0x65A0FD0B, - 0xB206D0BA, 0x65826622, - 0xB1DEF9E8, 0x6563BF92, - 0xB1B72F23, 0x6545095F, - 0xB18F7070, 0x6526438E, - 0xB167BDD6, 0x65076E24, - 0xB140175B, 0x64E88926, - 0xB1187D05, 0x64C99498, - 0xB0F0EEDA, 0x64AA907F, - 0xB0C96CDF, 0x648B7CDF, - 0xB0A1F71C, 0x646C59BF, - 0xB07A8D97, 0x644D2722, - 0xB0533055, 0x642DE50D, - 0xB02BDF5C, 0x640E9385, - 0xB0049AB2, 0x63EF328F, - 0xAFDD625F, 0x63CFC230, - 0xAFB63667, 0x63B0426D, - 0xAF8F16D0, 0x6390B34A, - 0xAF6803A1, 0x637114CC, - 0xAF40FCE0, 0x635166F8, - 0xAF1A0293, 0x6331A9D4, - 0xAEF314BF, 0x6311DD63, - 0xAECC336B, 0x62F201AC, - 0xAEA55E9D, 0x62D216B2, - 0xAE7E965B, 0x62B21C7B, - 0xAE57DAAA, 0x6292130C, - 0xAE312B91, 0x6271FA69, - 0xAE0A8916, 0x6251D297, - 0xADE3F33E, 0x62319B9D, - 0xADBD6A10, 0x6211557D, - 0xAD96ED91, 0x61F1003E, - 0xAD707DC8, 0x61D09BE5, - 0xAD4A1ABA, 0x61B02876, - 0xAD23C46D, 0x618FA5F6, - 0xACFD7AE8, 0x616F146B, - 0xACD73E30, 0x614E73D9, - 0xACB10E4A, 0x612DC446, - 0xAC8AEB3E, 0x610D05B7, - 0xAC64D510, 0x60EC3830, - 0xAC3ECBC7, 0x60CB5BB6, - 0xAC18CF68, 0x60AA704F, - 0xABF2DFFA, 0x60897600, - 0xABCCFD82, 0x60686CCE, - 0xABA72806, 0x604754BE, - 0xAB815F8C, 0x60262DD5, - 0xAB5BA41A, 0x6004F818, - 0xAB35F5B5, 0x5FE3B38D, - 0xAB105464, 0x5FC26038, - 0xAAEAC02B, 0x5FA0FE1E, - 0xAAC53912, 0x5F7F8D46, - 0xAA9FBF1D, 0x5F5E0DB3, - 0xAA7A5253, 0x5F3C7F6B, - 0xAA54F2B9, 0x5F1AE273, - 0xAA2FA055, 0x5EF936D1, - 0xAA0A5B2D, 0x5ED77C89, - 0xA9E52347, 0x5EB5B3A1, - 0xA9BFF8A8, 0x5E93DC1F, - 0xA99ADB56, 0x5E71F606, - 0xA975CB56, 0x5E50015D, - 0xA950C8AF, 0x5E2DFE28, - 0xA92BD366, 0x5E0BEC6E, - 0xA906EB81, 0x5DE9CC32, - 0xA8E21106, 0x5DC79D7C, - 0xA8BD43FA, 0x5DA5604E, - 0xA8988463, 0x5D8314B0, - 0xA873D246, 0x5D60BAA6, - 0xA84F2DA9, 0x5D3E5236, - 0xA82A9693, 0x5D1BDB65, - 0xA8060D08, 0x5CF95638, - 0xA7E1910E, 0x5CD6C2B4, - 0xA7BD22AB, 0x5CB420DF, - 0xA798C1E4, 0x5C9170BF, - 0xA7746EC0, 0x5C6EB258, - 0xA7502943, 0x5C4BE5B0, - 0xA72BF173, 0x5C290ACC, - 0xA707C756, 0x5C0621B2, - 0xA6E3AAF2, 0x5BE32A67, - 0xA6BF9C4B, 0x5BC024F0, - 0xA69B9B68, 0x5B9D1153, - 0xA677A84E, 0x5B79EF96, - 0xA653C302, 0x5B56BFBD, - 0xA62FEB8B, 0x5B3381CE, - 0xA60C21ED, 0x5B1035CF, - 0xA5E8662F, 0x5AECDBC4, - 0xA5C4B855, 0x5AC973B4, - 0xA5A11865, 0x5AA5FDA4, - 0xA57D8666, 0x5A82799A, - 0xA55A025B, 0x5A5EE79A, - 0xA5368C4B, 0x5A3B47AA, - 0xA513243B, 0x5A1799D0, - 0xA4EFCA31, 0x59F3DE12, - 0xA4CC7E31, 0x59D01474, - 0xA4A94042, 0x59AC3CFD, - 0xA4861069, 0x598857B1, - 0xA462EEAC, 0x59646497, - 0xA43FDB0F, 0x594063B4, - 0xA41CD598, 0x591C550E, - 0xA3F9DE4D, 0x58F838A9, - 0xA3D6F533, 0x58D40E8C, - 0xA3B41A4F, 0x58AFD6BC, - 0xA3914DA7, 0x588B913F, - 0xA36E8F40, 0x58673E1B, - 0xA34BDF20, 0x5842DD54, - 0xA3293D4B, 0x581E6EF1, - 0xA306A9C7, 0x57F9F2F7, - 0xA2E4249A, 0x57D5696C, - 0xA2C1ADC9, 0x57B0D256, - 0xA29F4559, 0x578C2DB9, - 0xA27CEB4F, 0x57677B9D, - 0xA25A9FB1, 0x5742BC05, - 0xA2386283, 0x571DEEF9, - 0xA21633CD, 0x56F9147E, - 0xA1F41391, 0x56D42C99, - 0xA1D201D7, 0x56AF3750, - 0xA1AFFEA2, 0x568A34A9, - 0xA18E09F9, 0x566524AA, - 0xA16C23E1, 0x56400757, - 0xA14A4C5E, 0x561ADCB8, - 0xA1288376, 0x55F5A4D2, - 0xA106C92E, 0x55D05FAA, - 0xA0E51D8C, 0x55AB0D46, - 0xA0C38094, 0x5585ADAC, - 0xA0A1F24C, 0x556040E2, - 0xA08072BA, 0x553AC6ED, - 0xA05F01E1, 0x55153FD4, - 0xA03D9FC7, 0x54EFAB9C, - 0xA01C4C72, 0x54CA0A4A, - 0x9FFB07E7, 0x54A45BE5, - 0x9FD9D22A, 0x547EA073, - 0x9FB8AB41, 0x5458D7F9, - 0x9F979331, 0x5433027D, - 0x9F7689FF, 0x540D2005, - 0x9F558FB0, 0x53E73097, - 0x9F34A449, 0x53C13438, - 0x9F13C7D0, 0x539B2AEF, - 0x9EF2FA48, 0x537514C1, - 0x9ED23BB9, 0x534EF1B5, - 0x9EB18C26, 0x5328C1D0, - 0x9E90EB94, 0x53028517, - 0x9E705A09, 0x52DC3B92, - 0x9E4FD789, 0x52B5E545, - 0x9E2F641A, 0x528F8237, - 0x9E0EFFC1, 0x5269126E, - 0x9DEEAA82, 0x524295EF, - 0x9DCE6462, 0x521C0CC1, - 0x9DAE2D68, 0x51F576E9, - 0x9D8E0596, 0x51CED46E, - 0x9D6DECF4, 0x51A82555, - 0x9D4DE384, 0x518169A4, - 0x9D2DE94D, 0x515AA162, - 0x9D0DFE53, 0x5133CC94, - 0x9CEE229C, 0x510CEB40, - 0x9CCE562B, 0x50E5FD6C, - 0x9CAE9907, 0x50BF031F, - 0x9C8EEB33, 0x5097FC5E, - 0x9C6F4CB5, 0x5070E92F, - 0x9C4FBD92, 0x5049C999, - 0x9C303DCF, 0x50229DA0, - 0x9C10CD70, 0x4FFB654D, - 0x9BF16C7A, 0x4FD420A3, - 0x9BD21AF2, 0x4FACCFAB, - 0x9BB2D8DD, 0x4F857268, - 0x9B93A640, 0x4F5E08E3, - 0x9B748320, 0x4F369320, - 0x9B556F80, 0x4F0F1126, - 0x9B366B67, 0x4EE782FA, - 0x9B1776D9, 0x4EBFE8A4, - 0x9AF891DB, 0x4E984229, - 0x9AD9BC71, 0x4E708F8F, - 0x9ABAF6A0, 0x4E48D0DC, - 0x9A9C406D, 0x4E210617, - 0x9A7D99DD, 0x4DF92F45, - 0x9A5F02F5, 0x4DD14C6E, - 0x9A407BB8, 0x4DA95D96, - 0x9A22042C, 0x4D8162C4, - 0x9A039C56, 0x4D595BFE, - 0x99E5443A, 0x4D31494B, - 0x99C6FBDE, 0x4D092AB0, - 0x99A8C344, 0x4CE10034, - 0x998A9A73, 0x4CB8C9DD, - 0x996C816F, 0x4C9087B1, - 0x994E783C, 0x4C6839B6, - 0x99307EE0, 0x4C3FDFF3, - 0x9912955E, 0x4C177A6E, - 0x98F4BBBC, 0x4BEF092D, - 0x98D6F1FE, 0x4BC68C36, - 0x98B93828, 0x4B9E038F, - 0x989B8E3F, 0x4B756F3F, - 0x987DF449, 0x4B4CCF4D, - 0x98606A48, 0x4B2423BD, - 0x9842F043, 0x4AFB6C97, - 0x9825863D, 0x4AD2A9E1, - 0x98082C3B, 0x4AA9DBA1, - 0x97EAE241, 0x4A8101DE, - 0x97CDA855, 0x4A581C9D, - 0x97B07E7A, 0x4A2F2BE5, - 0x979364B5, 0x4A062FBD, - 0x97765B0A, 0x49DD282A, - 0x9759617E, 0x49B41533, - 0x973C7816, 0x498AF6DE, - 0x971F9ED6, 0x4961CD32, - 0x9702D5C2, 0x49389836, - 0x96E61CDF, 0x490F57EE, - 0x96C97431, 0x48E60C62, - 0x96ACDBBD, 0x48BCB598, - 0x96905387, 0x48935397, - 0x9673DB94, 0x4869E664, - 0x965773E7, 0x48406E07, - 0x963B1C85, 0x4816EA85, - 0x961ED573, 0x47ED5BE6, - 0x96029EB5, 0x47C3C22E, - 0x95E6784F, 0x479A1D66, - 0x95CA6246, 0x47706D93, - 0x95AE5C9E, 0x4746B2BC, - 0x9592675B, 0x471CECE6, - 0x95768282, 0x46F31C1A, - 0x955AAE17, 0x46C9405C, - 0x953EEA1E, 0x469F59B4, - 0x9523369B, 0x46756827, - 0x95079393, 0x464B6BBD, - 0x94EC010B, 0x4621647C, - 0x94D07F05, 0x45F7526B, - 0x94B50D87, 0x45CD358F, - 0x9499AC95, 0x45A30DF0, - 0x947E5C32, 0x4578DB93, - 0x94631C64, 0x454E9E80, - 0x9447ED2F, 0x452456BC, - 0x942CCE95, 0x44FA044F, - 0x9411C09D, 0x44CFA73F, - 0x93F6C34A, 0x44A53F93, - 0x93DBD69F, 0x447ACD50, - 0x93C0FAA2, 0x4450507E, - 0x93A62F56, 0x4425C923, - 0x938B74C0, 0x43FB3745, - 0x9370CAE4, 0x43D09AEC, - 0x935631C5, 0x43A5F41E, - 0x933BA968, 0x437B42E1, - 0x932131D1, 0x4350873C, - 0x9306CB04, 0x4325C135, - 0x92EC7505, 0x42FAF0D4, - 0x92D22FD8, 0x42D0161E, - 0x92B7FB82, 0x42A5311A, - 0x929DD805, 0x427A41D0, - 0x9283C567, 0x424F4845, - 0x9269C3AC, 0x42244480, - 0x924FD2D6, 0x41F93688, - 0x9235F2EB, 0x41CE1E64, - 0x921C23EE, 0x41A2FC1A, - 0x920265E4, 0x4177CFB0, - 0x91E8B8D0, 0x414C992E, - 0x91CF1CB6, 0x4121589A, - 0x91B5919A, 0x40F60DFB, - 0x919C1780, 0x40CAB957, - 0x9182AE6C, 0x409F5AB6, - 0x91695663, 0x4073F21D, - 0x91500F67, 0x40487F93, - 0x9136D97D, 0x401D0320, - 0x911DB4A8, 0x3FF17CCA, - 0x9104A0ED, 0x3FC5EC97, - 0x90EB9E50, 0x3F9A528F, - 0x90D2ACD3, 0x3F6EAEB8, - 0x90B9CC7C, 0x3F430118, - 0x90A0FD4E, 0x3F1749B7, - 0x90883F4C, 0x3EEB889C, - 0x906F927B, 0x3EBFBDCC, - 0x9056F6DF, 0x3E93E94F, - 0x903E6C7A, 0x3E680B2C, - 0x9025F352, 0x3E3C2369, - 0x900D8B69, 0x3E10320D, - 0x8FF534C4, 0x3DE4371F, - 0x8FDCEF66, 0x3DB832A5, - 0x8FC4BB53, 0x3D8C24A7, - 0x8FAC988E, 0x3D600D2B, - 0x8F94871D, 0x3D33EC39, - 0x8F7C8701, 0x3D07C1D5, - 0x8F64983F, 0x3CDB8E09, - 0x8F4CBADB, 0x3CAF50DA, - 0x8F34EED8, 0x3C830A4F, - 0x8F1D343A, 0x3C56BA70, - 0x8F058B04, 0x3C2A6142, - 0x8EEDF33B, 0x3BFDFECD, - 0x8ED66CE1, 0x3BD19317, - 0x8EBEF7FB, 0x3BA51E29, - 0x8EA7948C, 0x3B78A007, - 0x8E904298, 0x3B4C18BA, - 0x8E790222, 0x3B1F8847, - 0x8E61D32D, 0x3AF2EEB7, - 0x8E4AB5BF, 0x3AC64C0F, - 0x8E33A9D9, 0x3A99A057, - 0x8E1CAF80, 0x3A6CEB95, - 0x8E05C6B7, 0x3A402DD1, - 0x8DEEEF82, 0x3A136712, - 0x8DD829E4, 0x39E6975D, - 0x8DC175E0, 0x39B9BEBB, - 0x8DAAD37B, 0x398CDD32, - 0x8D9442B7, 0x395FF2C9, - 0x8D7DC399, 0x3932FF87, - 0x8D675623, 0x39060372, - 0x8D50FA59, 0x38D8FE93, - 0x8D3AB03F, 0x38ABF0EF, - 0x8D2477D8, 0x387EDA8E, - 0x8D0E5127, 0x3851BB76, - 0x8CF83C30, 0x382493B0, - 0x8CE238F6, 0x37F76340, - 0x8CCC477D, 0x37CA2A30, - 0x8CB667C7, 0x379CE884, - 0x8CA099D9, 0x376F9E46, - 0x8C8ADDB6, 0x37424B7A, - 0x8C753361, 0x3714F02A, - 0x8C5F9ADD, 0x36E78C5A, - 0x8C4A142F, 0x36BA2013, - 0x8C349F58, 0x368CAB5C, - 0x8C1F3C5C, 0x365F2E3B, - 0x8C09EB40, 0x3631A8B7, - 0x8BF4AC05, 0x36041AD9, - 0x8BDF7EAF, 0x35D684A5, - 0x8BCA6342, 0x35A8E624, - 0x8BB559C1, 0x357B3F5D, - 0x8BA0622F, 0x354D9056, - 0x8B8B7C8F, 0x351FD917, - 0x8B76A8E4, 0x34F219A7, - 0x8B61E732, 0x34C4520D, - 0x8B4D377C, 0x3496824F, - 0x8B3899C5, 0x3468AA76, - 0x8B240E10, 0x343ACA87, - 0x8B0F9461, 0x340CE28A, - 0x8AFB2CBA, 0x33DEF287, - 0x8AE6D71F, 0x33B0FA84, - 0x8AD29393, 0x3382FA88, - 0x8ABE6219, 0x3354F29A, - 0x8AAA42B4, 0x3326E2C2, - 0x8A963567, 0x32F8CB07, - 0x8A823A35, 0x32CAAB6F, - 0x8A6E5122, 0x329C8402, - 0x8A5A7A30, 0x326E54C7, - 0x8A46B563, 0x32401DC5, - 0x8A3302BD, 0x3211DF03, - 0x8A1F6242, 0x31E39889, - 0x8A0BD3F5, 0x31B54A5D, - 0x89F857D8, 0x3186F487, - 0x89E4EDEE, 0x3158970D, - 0x89D1963C, 0x312A31F8, - 0x89BE50C3, 0x30FBC54D, - 0x89AB1D86, 0x30CD5114, - 0x8997FC89, 0x309ED555, - 0x8984EDCF, 0x30705217, - 0x8971F15A, 0x3041C760, - 0x895F072D, 0x30133538, - 0x894C2F4C, 0x2FE49BA6, - 0x893969B9, 0x2FB5FAB2, - 0x8926B677, 0x2F875262, - 0x89141589, 0x2F58A2BD, - 0x890186F1, 0x2F29EBCC, - 0x88EF0AB4, 0x2EFB2D94, - 0x88DCA0D3, 0x2ECC681E, - 0x88CA4951, 0x2E9D9B70, - 0x88B80431, 0x2E6EC792, - 0x88A5D177, 0x2E3FEC8B, - 0x8893B124, 0x2E110A62, - 0x8881A33C, 0x2DE2211E, - 0x886FA7C2, 0x2DB330C7, - 0x885DBEB7, 0x2D843963, - 0x884BE820, 0x2D553AFB, - 0x883A23FE, 0x2D263595, - 0x88287255, 0x2CF72939, - 0x8816D327, 0x2CC815ED, - 0x88054677, 0x2C98FBBA, - 0x87F3CC47, 0x2C69DAA6, - 0x87E2649B, 0x2C3AB2B9, - 0x87D10F75, 0x2C0B83F9, - 0x87BFCCD7, 0x2BDC4E6F, - 0x87AE9CC5, 0x2BAD1221, - 0x879D7F40, 0x2B7DCF17, - 0x878C744C, 0x2B4E8558, - 0x877B7BEC, 0x2B1F34EB, - 0x876A9621, 0x2AEFDDD8, - 0x8759C2EF, 0x2AC08025, - 0x87490257, 0x2A911BDB, - 0x8738545E, 0x2A61B101, - 0x8727B904, 0x2A323F9D, - 0x8717304E, 0x2A02C7B8, - 0x8706BA3C, 0x29D34958, - 0x86F656D3, 0x29A3C484, - 0x86E60614, 0x29743945, - 0x86D5C802, 0x2944A7A2, - 0x86C59C9F, 0x29150FA1, - 0x86B583EE, 0x28E5714A, - 0x86A57DF1, 0x28B5CCA5, - 0x86958AAB, 0x288621B9, - 0x8685AA1F, 0x2856708C, - 0x8675DC4E, 0x2826B928, - 0x8666213C, 0x27F6FB92, - 0x865678EA, 0x27C737D2, - 0x8646E35B, 0x27976DF1, - 0x86376092, 0x27679DF4, - 0x8627F090, 0x2737C7E3, - 0x86189359, 0x2707EBC6, - 0x860948EE, 0x26D809A5, - 0x85FA1152, 0x26A82185, - 0x85EAEC88, 0x26783370, - 0x85DBDA91, 0x26483F6C, - 0x85CCDB70, 0x26184581, - 0x85BDEF27, 0x25E845B5, - 0x85AF15B9, 0x25B84012, - 0x85A04F28, 0x2588349D, - 0x85919B75, 0x2558235E, - 0x8582FAA4, 0x25280C5D, - 0x85746CB7, 0x24F7EFA1, - 0x8565F1B0, 0x24C7CD32, - 0x85578991, 0x2497A517, - 0x8549345C, 0x24677757, - 0x853AF214, 0x243743FA, - 0x852CC2BA, 0x24070B07, - 0x851EA652, 0x23D6CC86, - 0x85109CDC, 0x23A6887E, - 0x8502A65C, 0x23763EF7, - 0x84F4C2D3, 0x2345EFF7, - 0x84E6F244, 0x23159B87, - 0x84D934B0, 0x22E541AE, - 0x84CB8A1B, 0x22B4E274, - 0x84BDF285, 0x22847DDF, - 0x84B06DF1, 0x225413F8, - 0x84A2FC62, 0x2223A4C5, - 0x84959DD9, 0x21F3304E, - 0x84885257, 0x21C2B69C, - 0x847B19E1, 0x219237B4, - 0x846DF476, 0x2161B39F, - 0x8460E21A, 0x21312A65, - 0x8453E2CE, 0x21009C0B, - 0x8446F695, 0x20D0089B, - 0x843A1D70, 0x209F701C, - 0x842D5761, 0x206ED295, - 0x8420A46B, 0x203E300D, - 0x8414048F, 0x200D888C, - 0x840777CF, 0x1FDCDC1A, - 0x83FAFE2E, 0x1FAC2ABF, - 0x83EE97AC, 0x1F7B7480, - 0x83E2444D, 0x1F4AB967, - 0x83D60411, 0x1F19F97B, - 0x83C9D6FB, 0x1EE934C2, - 0x83BDBD0D, 0x1EB86B46, - 0x83B1B649, 0x1E879D0C, - 0x83A5C2B0, 0x1E56CA1E, - 0x8399E244, 0x1E25F281, - 0x838E1507, 0x1DF5163F, - 0x83825AFB, 0x1DC4355D, - 0x8376B422, 0x1D934FE5, - 0x836B207D, 0x1D6265DD, - 0x835FA00E, 0x1D31774D, - 0x835432D8, 0x1D00843C, - 0x8348D8DB, 0x1CCF8CB3, - 0x833D921A, 0x1C9E90B8, - 0x83325E97, 0x1C6D9053, - 0x83273E52, 0x1C3C8B8C, - 0x831C314E, 0x1C0B826A, - 0x8311378C, 0x1BDA74F5, - 0x8306510F, 0x1BA96334, - 0x82FB7DD8, 0x1B784D30, - 0x82F0BDE8, 0x1B4732EF, - 0x82E61141, 0x1B161479, - 0x82DB77E5, 0x1AE4F1D6, - 0x82D0F1D5, 0x1AB3CB0C, - 0x82C67F13, 0x1A82A025, - 0x82BC1FA1, 0x1A517127, - 0x82B1D381, 0x1A203E1B, - 0x82A79AB3, 0x19EF0706, - 0x829D753A, 0x19BDCBF2, - 0x82936316, 0x198C8CE6, - 0x8289644A, 0x195B49E9, - 0x827F78D8, 0x192A0303, - 0x8275A0C0, 0x18F8B83C, - 0x826BDC04, 0x18C7699B, - 0x82622AA5, 0x18961727, - 0x82588CA6, 0x1864C0E9, - 0x824F0208, 0x183366E8, - 0x82458ACB, 0x1802092C, - 0x823C26F2, 0x17D0A7BB, - 0x8232D67E, 0x179F429F, - 0x82299971, 0x176DD9DE, - 0x82206FCB, 0x173C6D80, - 0x8217598F, 0x170AFD8D, - 0x820E56BE, 0x16D98A0C, - 0x82056758, 0x16A81305, - 0x81FC8B60, 0x1676987F, - 0x81F3C2D7, 0x16451A83, - 0x81EB0DBD, 0x16139917, - 0x81E26C16, 0x15E21444, - 0x81D9DDE1, 0x15B08C11, - 0x81D16320, 0x157F0086, - 0x81C8FBD5, 0x154D71AA, - 0x81C0A801, 0x151BDF85, - 0x81B867A4, 0x14EA4A1F, - 0x81B03AC1, 0x14B8B17F, - 0x81A82159, 0x148715AD, - 0x81A01B6C, 0x145576B1, - 0x819828FD, 0x1423D492, - 0x81904A0C, 0x13F22F57, - 0x81887E9A, 0x13C0870A, - 0x8180C6A9, 0x138EDBB0, - 0x8179223A, 0x135D2D53, - 0x8171914E, 0x132B7BF9, - 0x816A13E6, 0x12F9C7AA, - 0x8162AA03, 0x12C8106E, - 0x815B53A8, 0x1296564D, - 0x815410D3, 0x1264994E, - 0x814CE188, 0x1232D978, - 0x8145C5C6, 0x120116D4, - 0x813EBD90, 0x11CF516A, - 0x8137C8E6, 0x119D8940, - 0x8130E7C8, 0x116BBE5F, - 0x812A1A39, 0x1139F0CE, - 0x81236039, 0x11082096, - 0x811CB9CA, 0x10D64DBC, - 0x811626EC, 0x10A4784A, - 0x810FA7A0, 0x1072A047, - 0x81093BE8, 0x1040C5BB, - 0x8102E3C3, 0x100EE8AD, - 0x80FC9F35, 0x0FDD0925, - 0x80F66E3C, 0x0FAB272B, - 0x80F050DB, 0x0F7942C6, - 0x80EA4712, 0x0F475BFE, - 0x80E450E2, 0x0F1572DC, - 0x80DE6E4C, 0x0EE38765, - 0x80D89F51, 0x0EB199A3, - 0x80D2E3F1, 0x0E7FA99D, - 0x80CD3C2F, 0x0E4DB75B, - 0x80C7A80A, 0x0E1BC2E3, - 0x80C22783, 0x0DE9CC3F, - 0x80BCBA9C, 0x0DB7D376, - 0x80B76155, 0x0D85D88F, - 0x80B21BAF, 0x0D53DB92, - 0x80ACE9AB, 0x0D21DC87, - 0x80A7CB49, 0x0CEFDB75, - 0x80A2C08B, 0x0CBDD865, - 0x809DC970, 0x0C8BD35E, - 0x8098E5FB, 0x0C59CC67, - 0x8094162B, 0x0C27C389, - 0x808F5A02, 0x0BF5B8CB, - 0x808AB180, 0x0BC3AC35, - 0x80861CA5, 0x0B919DCE, - 0x80819B74, 0x0B5F8D9F, - 0x807D2DEB, 0x0B2D7BAE, - 0x8078D40D, 0x0AFB6805, - 0x80748DD9, 0x0AC952AA, - 0x80705B50, 0x0A973BA5, - 0x806C3C73, 0x0A6522FE, - 0x80683143, 0x0A3308BC, - 0x806439C0, 0x0A00ECE8, - 0x806055EA, 0x09CECF89, - 0x805C85C3, 0x099CB0A7, - 0x8058C94C, 0x096A9049, - 0x80552083, 0x09386E77, - 0x80518B6B, 0x09064B3A, - 0x804E0A03, 0x08D42698, - 0x804A9C4D, 0x08A2009A, - 0x80474248, 0x086FD947, - 0x8043FBF6, 0x083DB0A7, - 0x8040C956, 0x080B86C1, - 0x803DAA69, 0x07D95B9E, - 0x803A9F31, 0x07A72F45, - 0x8037A7AC, 0x077501BE, - 0x8034C3DC, 0x0742D310, - 0x8031F3C1, 0x0710A344, - 0x802F375C, 0x06DE7261, - 0x802C8EAD, 0x06AC406F, - 0x8029F9B4, 0x067A0D75, - 0x80277872, 0x0647D97C, - 0x80250AE7, 0x0615A48A, - 0x8022B113, 0x05E36EA9, - 0x80206AF8, 0x05B137DF, - 0x801E3894, 0x057F0034, - 0x801C19E9, 0x054CC7B0, - 0x801A0EF7, 0x051A8E5C, - 0x801817BF, 0x04E8543D, - 0x80163440, 0x04B6195D, - 0x8014647A, 0x0483DDC3, - 0x8012A86F, 0x0451A176, - 0x8011001E, 0x041F647F, - 0x800F6B88, 0x03ED26E6, - 0x800DEAAC, 0x03BAE8B1, - 0x800C7D8C, 0x0388A9E9, - 0x800B2427, 0x03566A96, - 0x8009DE7D, 0x03242ABF, - 0x8008AC90, 0x02F1EA6B, - 0x80078E5E, 0x02BFA9A4, - 0x800683E8, 0x028D6870, - 0x80058D2E, 0x025B26D7, - 0x8004AA31, 0x0228E4E1, - 0x8003DAF0, 0x01F6A296, - 0x80031F6C, 0x01C45FFE, - 0x800277A5, 0x01921D1F, - 0x8001E39B, 0x015FDA03, - 0x8001634D, 0x012D96B0, - 0x8000F6BD, 0x00FB532F, - 0x80009DE9, 0x00C90F88, - 0x800058D3, 0x0096CBC1, - 0x8000277A, 0x006487E3, - 0x800009DE, 0x003243F5, - 0x80000000, 0x00000000, - 0x800009DE, 0xFFCDBC0A, - 0x8000277A, 0xFF9B781D, - 0x800058D3, 0xFF69343E, - 0x80009DE9, 0xFF36F078, - 0x8000F6BD, 0xFF04ACD0, - 0x8001634D, 0xFED2694F, - 0x8001E39B, 0xFEA025FC, - 0x800277A5, 0xFE6DE2E0, - 0x80031F6C, 0xFE3BA001, - 0x8003DAF0, 0xFE095D69, - 0x8004AA31, 0xFDD71B1E, - 0x80058D2E, 0xFDA4D928, - 0x800683E8, 0xFD72978F, - 0x80078E5E, 0xFD40565B, - 0x8008AC90, 0xFD0E1594, - 0x8009DE7D, 0xFCDBD541, - 0x800B2427, 0xFCA99569, - 0x800C7D8C, 0xFC775616, - 0x800DEAAC, 0xFC45174E, - 0x800F6B88, 0xFC12D919, - 0x8011001E, 0xFBE09B80, - 0x8012A86F, 0xFBAE5E89, - 0x8014647A, 0xFB7C223C, - 0x80163440, 0xFB49E6A2, - 0x801817BF, 0xFB17ABC2, - 0x801A0EF7, 0xFAE571A4, - 0x801C19E9, 0xFAB3384F, - 0x801E3894, 0xFA80FFCB, - 0x80206AF8, 0xFA4EC820, - 0x8022B113, 0xFA1C9156, - 0x80250AE7, 0xF9EA5B75, - 0x80277872, 0xF9B82683, - 0x8029F9B4, 0xF985F28A, - 0x802C8EAD, 0xF953BF90, - 0x802F375C, 0xF9218D9E, - 0x8031F3C1, 0xF8EF5CBB, - 0x8034C3DC, 0xF8BD2CEF, - 0x8037A7AC, 0xF88AFE41, - 0x803A9F31, 0xF858D0BA, - 0x803DAA69, 0xF826A461, - 0x8040C956, 0xF7F4793E, - 0x8043FBF6, 0xF7C24F58, - 0x80474248, 0xF79026B8, - 0x804A9C4D, 0xF75DFF65, - 0x804E0A03, 0xF72BD967, - 0x80518B6B, 0xF6F9B4C5, - 0x80552083, 0xF6C79188, - 0x8058C94C, 0xF6956FB6, - 0x805C85C3, 0xF6634F58, - 0x806055EA, 0xF6313076, - 0x806439C0, 0xF5FF1317, - 0x80683143, 0xF5CCF743, - 0x806C3C73, 0xF59ADD01, - 0x80705B50, 0xF568C45A, - 0x80748DD9, 0xF536AD55, - 0x8078D40D, 0xF50497FA, - 0x807D2DEB, 0xF4D28451, - 0x80819B74, 0xF4A07260, - 0x80861CA5, 0xF46E6231, - 0x808AB180, 0xF43C53CA, - 0x808F5A02, 0xF40A4734, - 0x8094162B, 0xF3D83C76, - 0x8098E5FB, 0xF3A63398, - 0x809DC970, 0xF3742CA1, - 0x80A2C08B, 0xF342279A, - 0x80A7CB49, 0xF310248A, - 0x80ACE9AB, 0xF2DE2378, - 0x80B21BAF, 0xF2AC246D, - 0x80B76155, 0xF27A2770, - 0x80BCBA9C, 0xF2482C89, - 0x80C22783, 0xF21633C0, - 0x80C7A80A, 0xF1E43D1C, - 0x80CD3C2F, 0xF1B248A5, - 0x80D2E3F1, 0xF1805662, - 0x80D89F51, 0xF14E665C, - 0x80DE6E4C, 0xF11C789A, - 0x80E450E2, 0xF0EA8D23, - 0x80EA4712, 0xF0B8A401, - 0x80F050DB, 0xF086BD39, - 0x80F66E3C, 0xF054D8D4, - 0x80FC9F35, 0xF022F6DA, - 0x8102E3C3, 0xEFF11752, - 0x81093BE8, 0xEFBF3A44, - 0x810FA7A0, 0xEF8D5FB8, - 0x811626EC, 0xEF5B87B5, - 0x811CB9CA, 0xEF29B243, - 0x81236039, 0xEEF7DF6A, - 0x812A1A39, 0xEEC60F31, - 0x8130E7C8, 0xEE9441A0, - 0x8137C8E6, 0xEE6276BF, - 0x813EBD90, 0xEE30AE95, - 0x8145C5C6, 0xEDFEE92B, - 0x814CE188, 0xEDCD2687, - 0x815410D3, 0xED9B66B2, - 0x815B53A8, 0xED69A9B2, - 0x8162AA03, 0xED37EF91, - 0x816A13E6, 0xED063855, - 0x8171914E, 0xECD48406, - 0x8179223A, 0xECA2D2AC, - 0x8180C6A9, 0xEC71244F, - 0x81887E9A, 0xEC3F78F5, - 0x81904A0C, 0xEC0DD0A8, - 0x819828FD, 0xEBDC2B6D, - 0x81A01B6C, 0xEBAA894E, - 0x81A82159, 0xEB78EA52, - 0x81B03AC1, 0xEB474E80, - 0x81B867A4, 0xEB15B5E0, - 0x81C0A801, 0xEAE4207A, - 0x81C8FBD5, 0xEAB28E55, - 0x81D16320, 0xEA80FF79, - 0x81D9DDE1, 0xEA4F73EE, - 0x81E26C16, 0xEA1DEBBB, - 0x81EB0DBD, 0xE9EC66E8, - 0x81F3C2D7, 0xE9BAE57C, - 0x81FC8B60, 0xE9896780, - 0x82056758, 0xE957ECFB, - 0x820E56BE, 0xE92675F4, - 0x8217598F, 0xE8F50273, - 0x82206FCB, 0xE8C3927F, - 0x82299971, 0xE8922621, - 0x8232D67E, 0xE860BD60, - 0x823C26F2, 0xE82F5844, - 0x82458ACB, 0xE7FDF6D3, - 0x824F0208, 0xE7CC9917, - 0x82588CA6, 0xE79B3F16, - 0x82622AA5, 0xE769E8D8, - 0x826BDC04, 0xE7389664, - 0x8275A0C0, 0xE70747C3, - 0x827F78D8, 0xE6D5FCFC, - 0x8289644A, 0xE6A4B616, - 0x82936316, 0xE6737319, - 0x829D753A, 0xE642340D, - 0x82A79AB3, 0xE610F8F9, - 0x82B1D381, 0xE5DFC1E4, - 0x82BC1FA1, 0xE5AE8ED8, - 0x82C67F13, 0xE57D5FDA, - 0x82D0F1D5, 0xE54C34F3, - 0x82DB77E5, 0xE51B0E2A, - 0x82E61141, 0xE4E9EB86, - 0x82F0BDE8, 0xE4B8CD10, - 0x82FB7DD8, 0xE487B2CF, - 0x8306510F, 0xE4569CCB, - 0x8311378C, 0xE4258B0A, - 0x831C314E, 0xE3F47D95, - 0x83273E52, 0xE3C37473, - 0x83325E97, 0xE3926FAC, - 0x833D921A, 0xE3616F47, - 0x8348D8DB, 0xE330734C, - 0x835432D8, 0xE2FF7BC3, - 0x835FA00E, 0xE2CE88B2, - 0x836B207D, 0xE29D9A22, - 0x8376B422, 0xE26CB01A, - 0x83825AFB, 0xE23BCAA2, - 0x838E1507, 0xE20AE9C1, - 0x8399E244, 0xE1DA0D7E, - 0x83A5C2B0, 0xE1A935E1, - 0x83B1B649, 0xE17862F3, - 0x83BDBD0D, 0xE14794B9, - 0x83C9D6FB, 0xE116CB3D, - 0x83D60411, 0xE0E60684, - 0x83E2444D, 0xE0B54698, - 0x83EE97AC, 0xE0848B7F, - 0x83FAFE2E, 0xE053D541, - 0x840777CF, 0xE02323E5, - 0x8414048F, 0xDFF27773, - 0x8420A46B, 0xDFC1CFF2, - 0x842D5761, 0xDF912D6A, - 0x843A1D70, 0xDF608FE3, - 0x8446F695, 0xDF2FF764, - 0x8453E2CE, 0xDEFF63F4, - 0x8460E21A, 0xDECED59B, - 0x846DF476, 0xDE9E4C60, - 0x847B19E1, 0xDE6DC84B, - 0x84885257, 0xDE3D4963, - 0x84959DD9, 0xDE0CCFB1, - 0x84A2FC62, 0xDDDC5B3A, - 0x84B06DF1, 0xDDABEC07, - 0x84BDF285, 0xDD7B8220, - 0x84CB8A1B, 0xDD4B1D8B, - 0x84D934B0, 0xDD1ABE51, - 0x84E6F244, 0xDCEA6478, - 0x84F4C2D3, 0xDCBA1008, - 0x8502A65C, 0xDC89C108, - 0x85109CDC, 0xDC597781, - 0x851EA652, 0xDC293379, - 0x852CC2BA, 0xDBF8F4F8, - 0x853AF214, 0xDBC8BC05, - 0x8549345C, 0xDB9888A8, - 0x85578991, 0xDB685AE8, - 0x8565F1B0, 0xDB3832CD, - 0x85746CB7, 0xDB08105E, - 0x8582FAA4, 0xDAD7F3A2, - 0x85919B75, 0xDAA7DCA1, - 0x85A04F28, 0xDA77CB62, - 0x85AF15B9, 0xDA47BFED, - 0x85BDEF27, 0xDA17BA4A, - 0x85CCDB70, 0xD9E7BA7E, - 0x85DBDA91, 0xD9B7C093, - 0x85EAEC88, 0xD987CC8F, - 0x85FA1152, 0xD957DE7A, - 0x860948EE, 0xD927F65B, - 0x86189359, 0xD8F81439, - 0x8627F090, 0xD8C8381C, - 0x86376092, 0xD898620C, - 0x8646E35B, 0xD868920F, - 0x865678EA, 0xD838C82D, - 0x8666213C, 0xD809046D, - 0x8675DC4E, 0xD7D946D7, - 0x8685AA1F, 0xD7A98F73, - 0x86958AAB, 0xD779DE46, - 0x86A57DF1, 0xD74A335A, - 0x86B583EE, 0xD71A8EB5, - 0x86C59C9F, 0xD6EAF05E, - 0x86D5C802, 0xD6BB585D, - 0x86E60614, 0xD68BC6BA, - 0x86F656D3, 0xD65C3B7B, - 0x8706BA3C, 0xD62CB6A7, - 0x8717304E, 0xD5FD3847, - 0x8727B904, 0xD5CDC062, - 0x8738545E, 0xD59E4EFE, - 0x87490257, 0xD56EE424, - 0x8759C2EF, 0xD53F7FDA, - 0x876A9621, 0xD5102227, - 0x877B7BEC, 0xD4E0CB14, - 0x878C744C, 0xD4B17AA7, - 0x879D7F40, 0xD48230E8, - 0x87AE9CC5, 0xD452EDDE, - 0x87BFCCD7, 0xD423B190, - 0x87D10F75, 0xD3F47C06, - 0x87E2649B, 0xD3C54D46, - 0x87F3CC47, 0xD3962559, - 0x88054677, 0xD3670445, - 0x8816D327, 0xD337EA12, - 0x88287255, 0xD308D6C6, - 0x883A23FE, 0xD2D9CA6A, - 0x884BE820, 0xD2AAC504, - 0x885DBEB7, 0xD27BC69C, - 0x886FA7C2, 0xD24CCF38, - 0x8881A33C, 0xD21DDEE1, - 0x8893B124, 0xD1EEF59E, - 0x88A5D177, 0xD1C01374, - 0x88B80431, 0xD191386D, - 0x88CA4951, 0xD162648F, - 0x88DCA0D3, 0xD13397E1, - 0x88EF0AB4, 0xD104D26B, - 0x890186F1, 0xD0D61433, - 0x89141589, 0xD0A75D42, - 0x8926B677, 0xD078AD9D, - 0x893969B9, 0xD04A054D, - 0x894C2F4C, 0xD01B6459, - 0x895F072D, 0xCFECCAC7, - 0x8971F15A, 0xCFBE389F, - 0x8984EDCF, 0xCF8FADE8, - 0x8997FC89, 0xCF612AAA, - 0x89AB1D86, 0xCF32AEEB, - 0x89BE50C3, 0xCF043AB2, - 0x89D1963C, 0xCED5CE08, - 0x89E4EDEE, 0xCEA768F2, - 0x89F857D8, 0xCE790B78, - 0x8A0BD3F5, 0xCE4AB5A2, - 0x8A1F6242, 0xCE1C6776, - 0x8A3302BD, 0xCDEE20FC, - 0x8A46B563, 0xCDBFE23A, - 0x8A5A7A30, 0xCD91AB38, - 0x8A6E5122, 0xCD637BFD, - 0x8A823A35, 0xCD355490, - 0x8A963567, 0xCD0734F8, - 0x8AAA42B4, 0xCCD91D3D, - 0x8ABE6219, 0xCCAB0D65, - 0x8AD29393, 0xCC7D0577, - 0x8AE6D71F, 0xCC4F057B, - 0x8AFB2CBA, 0xCC210D78, - 0x8B0F9461, 0xCBF31D75, - 0x8B240E10, 0xCBC53578, - 0x8B3899C5, 0xCB975589, - 0x8B4D377C, 0xCB697DB0, - 0x8B61E732, 0xCB3BADF2, - 0x8B76A8E4, 0xCB0DE658, - 0x8B8B7C8F, 0xCAE026E8, - 0x8BA0622F, 0xCAB26FA9, - 0x8BB559C1, 0xCA84C0A2, - 0x8BCA6342, 0xCA5719DB, - 0x8BDF7EAF, 0xCA297B5A, - 0x8BF4AC05, 0xC9FBE527, - 0x8C09EB40, 0xC9CE5748, - 0x8C1F3C5C, 0xC9A0D1C4, - 0x8C349F58, 0xC97354A3, - 0x8C4A142F, 0xC945DFEC, - 0x8C5F9ADD, 0xC91873A5, - 0x8C753361, 0xC8EB0FD6, - 0x8C8ADDB6, 0xC8BDB485, - 0x8CA099D9, 0xC89061BA, - 0x8CB667C7, 0xC863177B, - 0x8CCC477D, 0xC835D5D0, - 0x8CE238F6, 0xC8089CBF, - 0x8CF83C30, 0xC7DB6C50, - 0x8D0E5127, 0xC7AE4489, - 0x8D2477D8, 0xC7812571, - 0x8D3AB03F, 0xC7540F10, - 0x8D50FA59, 0xC727016C, - 0x8D675623, 0xC6F9FC8D, - 0x8D7DC399, 0xC6CD0079, - 0x8D9442B7, 0xC6A00D36, - 0x8DAAD37B, 0xC67322CD, - 0x8DC175E0, 0xC6464144, - 0x8DD829E4, 0xC61968A2, - 0x8DEEEF82, 0xC5EC98ED, - 0x8E05C6B7, 0xC5BFD22E, - 0x8E1CAF80, 0xC593146A, - 0x8E33A9D9, 0xC5665FA8, - 0x8E4AB5BF, 0xC539B3F0, - 0x8E61D32D, 0xC50D1148, - 0x8E790222, 0xC4E077B8, - 0x8E904298, 0xC4B3E746, - 0x8EA7948C, 0xC4875FF8, - 0x8EBEF7FB, 0xC45AE1D7, - 0x8ED66CE1, 0xC42E6CE8, - 0x8EEDF33B, 0xC4020132, - 0x8F058B04, 0xC3D59EBD, - 0x8F1D343A, 0xC3A9458F, - 0x8F34EED8, 0xC37CF5B0, - 0x8F4CBADB, 0xC350AF25, - 0x8F64983F, 0xC32471F6, - 0x8F7C8701, 0xC2F83E2A, - 0x8F94871D, 0xC2CC13C7, - 0x8FAC988E, 0xC29FF2D4, - 0x8FC4BB53, 0xC273DB58, - 0x8FDCEF66, 0xC247CD5A, - 0x8FF534C4, 0xC21BC8E0, - 0x900D8B69, 0xC1EFCDF2, - 0x9025F352, 0xC1C3DC96, - 0x903E6C7A, 0xC197F4D3, - 0x9056F6DF, 0xC16C16B0, - 0x906F927B, 0xC1404233, - 0x90883F4C, 0xC1147763, - 0x90A0FD4E, 0xC0E8B648, - 0x90B9CC7C, 0xC0BCFEE7, - 0x90D2ACD3, 0xC0915147, - 0x90EB9E50, 0xC065AD70, - 0x9104A0ED, 0xC03A1368, - 0x911DB4A8, 0xC00E8335, - 0x9136D97D, 0xBFE2FCDF, - 0x91500F67, 0xBFB7806C, - 0x91695663, 0xBF8C0DE2, - 0x9182AE6C, 0xBF60A54A, - 0x919C1780, 0xBF3546A8, - 0x91B5919A, 0xBF09F204, - 0x91CF1CB6, 0xBEDEA765, - 0x91E8B8D0, 0xBEB366D1, - 0x920265E4, 0xBE88304F, - 0x921C23EE, 0xBE5D03E5, - 0x9235F2EB, 0xBE31E19B, - 0x924FD2D6, 0xBE06C977, - 0x9269C3AC, 0xBDDBBB7F, - 0x9283C567, 0xBDB0B7BA, - 0x929DD805, 0xBD85BE2F, - 0x92B7FB82, 0xBD5ACEE5, - 0x92D22FD8, 0xBD2FE9E1, - 0x92EC7505, 0xBD050F2C, - 0x9306CB04, 0xBCDA3ECA, - 0x932131D1, 0xBCAF78C3, - 0x933BA968, 0xBC84BD1E, - 0x935631C5, 0xBC5A0BE1, - 0x9370CAE4, 0xBC2F6513, - 0x938B74C0, 0xBC04C8BA, - 0x93A62F56, 0xBBDA36DC, - 0x93C0FAA2, 0xBBAFAF81, - 0x93DBD69F, 0xBB8532AF, - 0x93F6C34A, 0xBB5AC06C, - 0x9411C09D, 0xBB3058C0, - 0x942CCE95, 0xBB05FBB0, - 0x9447ED2F, 0xBADBA943, - 0x94631C64, 0xBAB1617F, - 0x947E5C32, 0xBA87246C, - 0x9499AC95, 0xBA5CF210, - 0x94B50D87, 0xBA32CA70, - 0x94D07F05, 0xBA08AD94, - 0x94EC010B, 0xB9DE9B83, - 0x95079393, 0xB9B49442, - 0x9523369B, 0xB98A97D8, - 0x953EEA1E, 0xB960A64B, - 0x955AAE17, 0xB936BFA3, - 0x95768282, 0xB90CE3E6, - 0x9592675B, 0xB8E31319, - 0x95AE5C9E, 0xB8B94D44, - 0x95CA6246, 0xB88F926C, - 0x95E6784F, 0xB865E299, - 0x96029EB5, 0xB83C3DD1, - 0x961ED573, 0xB812A419, - 0x963B1C85, 0xB7E9157A, - 0x965773E7, 0xB7BF91F8, - 0x9673DB94, 0xB796199B, - 0x96905387, 0xB76CAC68, - 0x96ACDBBD, 0xB7434A67, - 0x96C97431, 0xB719F39D, - 0x96E61CDF, 0xB6F0A811, - 0x9702D5C2, 0xB6C767CA, - 0x971F9ED6, 0xB69E32CD, - 0x973C7816, 0xB6750921, - 0x9759617E, 0xB64BEACC, - 0x97765B0A, 0xB622D7D5, - 0x979364B5, 0xB5F9D042, - 0x97B07E7A, 0xB5D0D41A, - 0x97CDA855, 0xB5A7E362, - 0x97EAE241, 0xB57EFE21, - 0x98082C3B, 0xB556245E, - 0x9825863D, 0xB52D561E, - 0x9842F043, 0xB5049368, - 0x98606A48, 0xB4DBDC42, - 0x987DF449, 0xB4B330B2, - 0x989B8E3F, 0xB48A90C0, - 0x98B93828, 0xB461FC70, - 0x98D6F1FE, 0xB43973C9, - 0x98F4BBBC, 0xB410F6D2, - 0x9912955E, 0xB3E88591, - 0x99307EE0, 0xB3C0200C, - 0x994E783C, 0xB397C649, - 0x996C816F, 0xB36F784E, - 0x998A9A73, 0xB3473622, - 0x99A8C344, 0xB31EFFCB, - 0x99C6FBDE, 0xB2F6D54F, - 0x99E5443A, 0xB2CEB6B5, - 0x9A039C56, 0xB2A6A401, - 0x9A22042C, 0xB27E9D3B, - 0x9A407BB8, 0xB256A26A, - 0x9A5F02F5, 0xB22EB392, - 0x9A7D99DD, 0xB206D0BA, - 0x9A9C406D, 0xB1DEF9E8, - 0x9ABAF6A0, 0xB1B72F23, - 0x9AD9BC71, 0xB18F7070, - 0x9AF891DB, 0xB167BDD6, - 0x9B1776D9, 0xB140175B, - 0x9B366B67, 0xB1187D05, - 0x9B556F80, 0xB0F0EEDA, - 0x9B748320, 0xB0C96CDF, - 0x9B93A640, 0xB0A1F71C, - 0x9BB2D8DD, 0xB07A8D97, - 0x9BD21AF2, 0xB0533055, - 0x9BF16C7A, 0xB02BDF5C, - 0x9C10CD70, 0xB0049AB2, - 0x9C303DCF, 0xAFDD625F, - 0x9C4FBD92, 0xAFB63667, - 0x9C6F4CB5, 0xAF8F16D0, - 0x9C8EEB33, 0xAF6803A1, - 0x9CAE9907, 0xAF40FCE0, - 0x9CCE562B, 0xAF1A0293, - 0x9CEE229C, 0xAEF314BF, - 0x9D0DFE53, 0xAECC336B, - 0x9D2DE94D, 0xAEA55E9D, - 0x9D4DE384, 0xAE7E965B, - 0x9D6DECF4, 0xAE57DAAA, - 0x9D8E0596, 0xAE312B91, - 0x9DAE2D68, 0xAE0A8916, - 0x9DCE6462, 0xADE3F33E, - 0x9DEEAA82, 0xADBD6A10, - 0x9E0EFFC1, 0xAD96ED91, - 0x9E2F641A, 0xAD707DC8, - 0x9E4FD789, 0xAD4A1ABA, - 0x9E705A09, 0xAD23C46D, - 0x9E90EB94, 0xACFD7AE8, - 0x9EB18C26, 0xACD73E30, - 0x9ED23BB9, 0xACB10E4A, - 0x9EF2FA48, 0xAC8AEB3E, - 0x9F13C7D0, 0xAC64D510, - 0x9F34A449, 0xAC3ECBC7, - 0x9F558FB0, 0xAC18CF68, - 0x9F7689FF, 0xABF2DFFA, - 0x9F979331, 0xABCCFD82, - 0x9FB8AB41, 0xABA72806, - 0x9FD9D22A, 0xAB815F8C, - 0x9FFB07E7, 0xAB5BA41A, - 0xA01C4C72, 0xAB35F5B5, - 0xA03D9FC7, 0xAB105464, - 0xA05F01E1, 0xAAEAC02B, - 0xA08072BA, 0xAAC53912, - 0xA0A1F24C, 0xAA9FBF1D, - 0xA0C38094, 0xAA7A5253, - 0xA0E51D8C, 0xAA54F2B9, - 0xA106C92E, 0xAA2FA055, - 0xA1288376, 0xAA0A5B2D, - 0xA14A4C5E, 0xA9E52347, - 0xA16C23E1, 0xA9BFF8A8, - 0xA18E09F9, 0xA99ADB56, - 0xA1AFFEA2, 0xA975CB56, - 0xA1D201D7, 0xA950C8AF, - 0xA1F41391, 0xA92BD366, - 0xA21633CD, 0xA906EB81, - 0xA2386283, 0xA8E21106, - 0xA25A9FB1, 0xA8BD43FA, - 0xA27CEB4F, 0xA8988463, - 0xA29F4559, 0xA873D246, - 0xA2C1ADC9, 0xA84F2DA9, - 0xA2E4249A, 0xA82A9693, - 0xA306A9C7, 0xA8060D08, - 0xA3293D4B, 0xA7E1910E, - 0xA34BDF20, 0xA7BD22AB, - 0xA36E8F40, 0xA798C1E4, - 0xA3914DA7, 0xA7746EC0, - 0xA3B41A4F, 0xA7502943, - 0xA3D6F533, 0xA72BF173, - 0xA3F9DE4D, 0xA707C756, - 0xA41CD598, 0xA6E3AAF2, - 0xA43FDB0F, 0xA6BF9C4B, - 0xA462EEAC, 0xA69B9B68, - 0xA4861069, 0xA677A84E, - 0xA4A94042, 0xA653C302, - 0xA4CC7E31, 0xA62FEB8B, - 0xA4EFCA31, 0xA60C21ED, - 0xA513243B, 0xA5E8662F, - 0xA5368C4B, 0xA5C4B855, - 0xA55A025B, 0xA5A11865, - 0xA57D8666, 0xA57D8666, - 0xA5A11865, 0xA55A025B, - 0xA5C4B855, 0xA5368C4B, - 0xA5E8662F, 0xA513243B, - 0xA60C21ED, 0xA4EFCA31, - 0xA62FEB8B, 0xA4CC7E31, - 0xA653C302, 0xA4A94042, - 0xA677A84E, 0xA4861069, - 0xA69B9B68, 0xA462EEAC, - 0xA6BF9C4B, 0xA43FDB0F, - 0xA6E3AAF2, 0xA41CD598, - 0xA707C756, 0xA3F9DE4D, - 0xA72BF173, 0xA3D6F533, - 0xA7502943, 0xA3B41A4F, - 0xA7746EC0, 0xA3914DA7, - 0xA798C1E4, 0xA36E8F40, - 0xA7BD22AB, 0xA34BDF20, - 0xA7E1910E, 0xA3293D4B, - 0xA8060D08, 0xA306A9C7, - 0xA82A9693, 0xA2E4249A, - 0xA84F2DA9, 0xA2C1ADC9, - 0xA873D246, 0xA29F4559, - 0xA8988463, 0xA27CEB4F, - 0xA8BD43FA, 0xA25A9FB1, - 0xA8E21106, 0xA2386283, - 0xA906EB81, 0xA21633CD, - 0xA92BD366, 0xA1F41391, - 0xA950C8AF, 0xA1D201D7, - 0xA975CB56, 0xA1AFFEA2, - 0xA99ADB56, 0xA18E09F9, - 0xA9BFF8A8, 0xA16C23E1, - 0xA9E52347, 0xA14A4C5E, - 0xAA0A5B2D, 0xA1288376, - 0xAA2FA055, 0xA106C92E, - 0xAA54F2B9, 0xA0E51D8C, - 0xAA7A5253, 0xA0C38094, - 0xAA9FBF1D, 0xA0A1F24C, - 0xAAC53912, 0xA08072BA, - 0xAAEAC02B, 0xA05F01E1, - 0xAB105464, 0xA03D9FC7, - 0xAB35F5B5, 0xA01C4C72, - 0xAB5BA41A, 0x9FFB07E7, - 0xAB815F8C, 0x9FD9D22A, - 0xABA72806, 0x9FB8AB41, - 0xABCCFD82, 0x9F979331, - 0xABF2DFFA, 0x9F7689FF, - 0xAC18CF68, 0x9F558FB0, - 0xAC3ECBC7, 0x9F34A449, - 0xAC64D510, 0x9F13C7D0, - 0xAC8AEB3E, 0x9EF2FA48, - 0xACB10E4A, 0x9ED23BB9, - 0xACD73E30, 0x9EB18C26, - 0xACFD7AE8, 0x9E90EB94, - 0xAD23C46D, 0x9E705A09, - 0xAD4A1ABA, 0x9E4FD789, - 0xAD707DC8, 0x9E2F641A, - 0xAD96ED91, 0x9E0EFFC1, - 0xADBD6A10, 0x9DEEAA82, - 0xADE3F33E, 0x9DCE6462, - 0xAE0A8916, 0x9DAE2D68, - 0xAE312B91, 0x9D8E0596, - 0xAE57DAAA, 0x9D6DECF4, - 0xAE7E965B, 0x9D4DE384, - 0xAEA55E9D, 0x9D2DE94D, - 0xAECC336B, 0x9D0DFE53, - 0xAEF314BF, 0x9CEE229C, - 0xAF1A0293, 0x9CCE562B, - 0xAF40FCE0, 0x9CAE9907, - 0xAF6803A1, 0x9C8EEB33, - 0xAF8F16D0, 0x9C6F4CB5, - 0xAFB63667, 0x9C4FBD92, - 0xAFDD625F, 0x9C303DCF, - 0xB0049AB2, 0x9C10CD70, - 0xB02BDF5C, 0x9BF16C7A, - 0xB0533055, 0x9BD21AF2, - 0xB07A8D97, 0x9BB2D8DD, - 0xB0A1F71C, 0x9B93A640, - 0xB0C96CDF, 0x9B748320, - 0xB0F0EEDA, 0x9B556F80, - 0xB1187D05, 0x9B366B67, - 0xB140175B, 0x9B1776D9, - 0xB167BDD6, 0x9AF891DB, - 0xB18F7070, 0x9AD9BC71, - 0xB1B72F23, 0x9ABAF6A0, - 0xB1DEF9E8, 0x9A9C406D, - 0xB206D0BA, 0x9A7D99DD, - 0xB22EB392, 0x9A5F02F5, - 0xB256A26A, 0x9A407BB8, - 0xB27E9D3B, 0x9A22042C, - 0xB2A6A401, 0x9A039C56, - 0xB2CEB6B5, 0x99E5443A, - 0xB2F6D54F, 0x99C6FBDE, - 0xB31EFFCB, 0x99A8C344, - 0xB3473622, 0x998A9A73, - 0xB36F784E, 0x996C816F, - 0xB397C649, 0x994E783C, - 0xB3C0200C, 0x99307EE0, - 0xB3E88591, 0x9912955E, - 0xB410F6D2, 0x98F4BBBC, - 0xB43973C9, 0x98D6F1FE, - 0xB461FC70, 0x98B93828, - 0xB48A90C0, 0x989B8E3F, - 0xB4B330B2, 0x987DF449, - 0xB4DBDC42, 0x98606A48, - 0xB5049368, 0x9842F043, - 0xB52D561E, 0x9825863D, - 0xB556245E, 0x98082C3B, - 0xB57EFE21, 0x97EAE241, - 0xB5A7E362, 0x97CDA855, - 0xB5D0D41A, 0x97B07E7A, - 0xB5F9D042, 0x979364B5, - 0xB622D7D5, 0x97765B0A, - 0xB64BEACC, 0x9759617E, - 0xB6750921, 0x973C7816, - 0xB69E32CD, 0x971F9ED6, - 0xB6C767CA, 0x9702D5C2, - 0xB6F0A811, 0x96E61CDF, - 0xB719F39D, 0x96C97431, - 0xB7434A67, 0x96ACDBBD, - 0xB76CAC68, 0x96905387, - 0xB796199B, 0x9673DB94, - 0xB7BF91F8, 0x965773E7, - 0xB7E9157A, 0x963B1C85, - 0xB812A419, 0x961ED573, - 0xB83C3DD1, 0x96029EB5, - 0xB865E299, 0x95E6784F, - 0xB88F926C, 0x95CA6246, - 0xB8B94D44, 0x95AE5C9E, - 0xB8E31319, 0x9592675B, - 0xB90CE3E6, 0x95768282, - 0xB936BFA3, 0x955AAE17, - 0xB960A64B, 0x953EEA1E, - 0xB98A97D8, 0x9523369B, - 0xB9B49442, 0x95079393, - 0xB9DE9B83, 0x94EC010B, - 0xBA08AD94, 0x94D07F05, - 0xBA32CA70, 0x94B50D87, - 0xBA5CF210, 0x9499AC95, - 0xBA87246C, 0x947E5C32, - 0xBAB1617F, 0x94631C64, - 0xBADBA943, 0x9447ED2F, - 0xBB05FBB0, 0x942CCE95, - 0xBB3058C0, 0x9411C09D, - 0xBB5AC06C, 0x93F6C34A, - 0xBB8532AF, 0x93DBD69F, - 0xBBAFAF81, 0x93C0FAA2, - 0xBBDA36DC, 0x93A62F56, - 0xBC04C8BA, 0x938B74C0, - 0xBC2F6513, 0x9370CAE4, - 0xBC5A0BE1, 0x935631C5, - 0xBC84BD1E, 0x933BA968, - 0xBCAF78C3, 0x932131D1, - 0xBCDA3ECA, 0x9306CB04, - 0xBD050F2C, 0x92EC7505, - 0xBD2FE9E1, 0x92D22FD8, - 0xBD5ACEE5, 0x92B7FB82, - 0xBD85BE2F, 0x929DD805, - 0xBDB0B7BA, 0x9283C567, - 0xBDDBBB7F, 0x9269C3AC, - 0xBE06C977, 0x924FD2D6, - 0xBE31E19B, 0x9235F2EB, - 0xBE5D03E5, 0x921C23EE, - 0xBE88304F, 0x920265E4, - 0xBEB366D1, 0x91E8B8D0, - 0xBEDEA765, 0x91CF1CB6, - 0xBF09F204, 0x91B5919A, - 0xBF3546A8, 0x919C1780, - 0xBF60A54A, 0x9182AE6C, - 0xBF8C0DE2, 0x91695663, - 0xBFB7806C, 0x91500F67, - 0xBFE2FCDF, 0x9136D97D, - 0xC00E8335, 0x911DB4A8, - 0xC03A1368, 0x9104A0ED, - 0xC065AD70, 0x90EB9E50, - 0xC0915147, 0x90D2ACD3, - 0xC0BCFEE7, 0x90B9CC7C, - 0xC0E8B648, 0x90A0FD4E, - 0xC1147763, 0x90883F4C, - 0xC1404233, 0x906F927B, - 0xC16C16B0, 0x9056F6DF, - 0xC197F4D3, 0x903E6C7A, - 0xC1C3DC96, 0x9025F352, - 0xC1EFCDF2, 0x900D8B69, - 0xC21BC8E0, 0x8FF534C4, - 0xC247CD5A, 0x8FDCEF66, - 0xC273DB58, 0x8FC4BB53, - 0xC29FF2D4, 0x8FAC988E, - 0xC2CC13C7, 0x8F94871D, - 0xC2F83E2A, 0x8F7C8701, - 0xC32471F6, 0x8F64983F, - 0xC350AF25, 0x8F4CBADB, - 0xC37CF5B0, 0x8F34EED8, - 0xC3A9458F, 0x8F1D343A, - 0xC3D59EBD, 0x8F058B04, - 0xC4020132, 0x8EEDF33B, - 0xC42E6CE8, 0x8ED66CE1, - 0xC45AE1D7, 0x8EBEF7FB, - 0xC4875FF8, 0x8EA7948C, - 0xC4B3E746, 0x8E904298, - 0xC4E077B8, 0x8E790222, - 0xC50D1148, 0x8E61D32D, - 0xC539B3F0, 0x8E4AB5BF, - 0xC5665FA8, 0x8E33A9D9, - 0xC593146A, 0x8E1CAF80, - 0xC5BFD22E, 0x8E05C6B7, - 0xC5EC98ED, 0x8DEEEF82, - 0xC61968A2, 0x8DD829E4, - 0xC6464144, 0x8DC175E0, - 0xC67322CD, 0x8DAAD37B, - 0xC6A00D36, 0x8D9442B7, - 0xC6CD0079, 0x8D7DC399, - 0xC6F9FC8D, 0x8D675623, - 0xC727016C, 0x8D50FA59, - 0xC7540F10, 0x8D3AB03F, - 0xC7812571, 0x8D2477D8, - 0xC7AE4489, 0x8D0E5127, - 0xC7DB6C50, 0x8CF83C30, - 0xC8089CBF, 0x8CE238F6, - 0xC835D5D0, 0x8CCC477D, - 0xC863177B, 0x8CB667C7, - 0xC89061BA, 0x8CA099D9, - 0xC8BDB485, 0x8C8ADDB6, - 0xC8EB0FD6, 0x8C753361, - 0xC91873A5, 0x8C5F9ADD, - 0xC945DFEC, 0x8C4A142F, - 0xC97354A3, 0x8C349F58, - 0xC9A0D1C4, 0x8C1F3C5C, - 0xC9CE5748, 0x8C09EB40, - 0xC9FBE527, 0x8BF4AC05, - 0xCA297B5A, 0x8BDF7EAF, - 0xCA5719DB, 0x8BCA6342, - 0xCA84C0A2, 0x8BB559C1, - 0xCAB26FA9, 0x8BA0622F, - 0xCAE026E8, 0x8B8B7C8F, - 0xCB0DE658, 0x8B76A8E4, - 0xCB3BADF2, 0x8B61E732, - 0xCB697DB0, 0x8B4D377C, - 0xCB975589, 0x8B3899C5, - 0xCBC53578, 0x8B240E10, - 0xCBF31D75, 0x8B0F9461, - 0xCC210D78, 0x8AFB2CBA, - 0xCC4F057B, 0x8AE6D71F, - 0xCC7D0577, 0x8AD29393, - 0xCCAB0D65, 0x8ABE6219, - 0xCCD91D3D, 0x8AAA42B4, - 0xCD0734F8, 0x8A963567, - 0xCD355490, 0x8A823A35, - 0xCD637BFD, 0x8A6E5122, - 0xCD91AB38, 0x8A5A7A30, - 0xCDBFE23A, 0x8A46B563, - 0xCDEE20FC, 0x8A3302BD, - 0xCE1C6776, 0x8A1F6242, - 0xCE4AB5A2, 0x8A0BD3F5, - 0xCE790B78, 0x89F857D8, - 0xCEA768F2, 0x89E4EDEE, - 0xCED5CE08, 0x89D1963C, - 0xCF043AB2, 0x89BE50C3, - 0xCF32AEEB, 0x89AB1D86, - 0xCF612AAA, 0x8997FC89, - 0xCF8FADE8, 0x8984EDCF, - 0xCFBE389F, 0x8971F15A, - 0xCFECCAC7, 0x895F072D, - 0xD01B6459, 0x894C2F4C, - 0xD04A054D, 0x893969B9, - 0xD078AD9D, 0x8926B677, - 0xD0A75D42, 0x89141589, - 0xD0D61433, 0x890186F1, - 0xD104D26B, 0x88EF0AB4, - 0xD13397E1, 0x88DCA0D3, - 0xD162648F, 0x88CA4951, - 0xD191386D, 0x88B80431, - 0xD1C01374, 0x88A5D177, - 0xD1EEF59E, 0x8893B124, - 0xD21DDEE1, 0x8881A33C, - 0xD24CCF38, 0x886FA7C2, - 0xD27BC69C, 0x885DBEB7, - 0xD2AAC504, 0x884BE820, - 0xD2D9CA6A, 0x883A23FE, - 0xD308D6C6, 0x88287255, - 0xD337EA12, 0x8816D327, - 0xD3670445, 0x88054677, - 0xD3962559, 0x87F3CC47, - 0xD3C54D46, 0x87E2649B, - 0xD3F47C06, 0x87D10F75, - 0xD423B190, 0x87BFCCD7, - 0xD452EDDE, 0x87AE9CC5, - 0xD48230E8, 0x879D7F40, - 0xD4B17AA7, 0x878C744C, - 0xD4E0CB14, 0x877B7BEC, - 0xD5102227, 0x876A9621, - 0xD53F7FDA, 0x8759C2EF, - 0xD56EE424, 0x87490257, - 0xD59E4EFE, 0x8738545E, - 0xD5CDC062, 0x8727B904, - 0xD5FD3847, 0x8717304E, - 0xD62CB6A7, 0x8706BA3C, - 0xD65C3B7B, 0x86F656D3, - 0xD68BC6BA, 0x86E60614, - 0xD6BB585D, 0x86D5C802, - 0xD6EAF05E, 0x86C59C9F, - 0xD71A8EB5, 0x86B583EE, - 0xD74A335A, 0x86A57DF1, - 0xD779DE46, 0x86958AAB, - 0xD7A98F73, 0x8685AA1F, - 0xD7D946D7, 0x8675DC4E, - 0xD809046D, 0x8666213C, - 0xD838C82D, 0x865678EA, - 0xD868920F, 0x8646E35B, - 0xD898620C, 0x86376092, - 0xD8C8381C, 0x8627F090, - 0xD8F81439, 0x86189359, - 0xD927F65B, 0x860948EE, - 0xD957DE7A, 0x85FA1152, - 0xD987CC8F, 0x85EAEC88, - 0xD9B7C093, 0x85DBDA91, - 0xD9E7BA7E, 0x85CCDB70, - 0xDA17BA4A, 0x85BDEF27, - 0xDA47BFED, 0x85AF15B9, - 0xDA77CB62, 0x85A04F28, - 0xDAA7DCA1, 0x85919B75, - 0xDAD7F3A2, 0x8582FAA4, - 0xDB08105E, 0x85746CB7, - 0xDB3832CD, 0x8565F1B0, - 0xDB685AE8, 0x85578991, - 0xDB9888A8, 0x8549345C, - 0xDBC8BC05, 0x853AF214, - 0xDBF8F4F8, 0x852CC2BA, - 0xDC293379, 0x851EA652, - 0xDC597781, 0x85109CDC, - 0xDC89C108, 0x8502A65C, - 0xDCBA1008, 0x84F4C2D3, - 0xDCEA6478, 0x84E6F244, - 0xDD1ABE51, 0x84D934B0, - 0xDD4B1D8B, 0x84CB8A1B, - 0xDD7B8220, 0x84BDF285, - 0xDDABEC07, 0x84B06DF1, - 0xDDDC5B3A, 0x84A2FC62, - 0xDE0CCFB1, 0x84959DD9, - 0xDE3D4963, 0x84885257, - 0xDE6DC84B, 0x847B19E1, - 0xDE9E4C60, 0x846DF476, - 0xDECED59B, 0x8460E21A, - 0xDEFF63F4, 0x8453E2CE, - 0xDF2FF764, 0x8446F695, - 0xDF608FE3, 0x843A1D70, - 0xDF912D6A, 0x842D5761, - 0xDFC1CFF2, 0x8420A46B, - 0xDFF27773, 0x8414048F, - 0xE02323E5, 0x840777CF, - 0xE053D541, 0x83FAFE2E, - 0xE0848B7F, 0x83EE97AC, - 0xE0B54698, 0x83E2444D, - 0xE0E60684, 0x83D60411, - 0xE116CB3D, 0x83C9D6FB, - 0xE14794B9, 0x83BDBD0D, - 0xE17862F3, 0x83B1B649, - 0xE1A935E1, 0x83A5C2B0, - 0xE1DA0D7E, 0x8399E244, - 0xE20AE9C1, 0x838E1507, - 0xE23BCAA2, 0x83825AFB, - 0xE26CB01A, 0x8376B422, - 0xE29D9A22, 0x836B207D, - 0xE2CE88B2, 0x835FA00E, - 0xE2FF7BC3, 0x835432D8, - 0xE330734C, 0x8348D8DB, - 0xE3616F47, 0x833D921A, - 0xE3926FAC, 0x83325E97, - 0xE3C37473, 0x83273E52, - 0xE3F47D95, 0x831C314E, - 0xE4258B0A, 0x8311378C, - 0xE4569CCB, 0x8306510F, - 0xE487B2CF, 0x82FB7DD8, - 0xE4B8CD10, 0x82F0BDE8, - 0xE4E9EB86, 0x82E61141, - 0xE51B0E2A, 0x82DB77E5, - 0xE54C34F3, 0x82D0F1D5, - 0xE57D5FDA, 0x82C67F13, - 0xE5AE8ED8, 0x82BC1FA1, - 0xE5DFC1E4, 0x82B1D381, - 0xE610F8F9, 0x82A79AB3, - 0xE642340D, 0x829D753A, - 0xE6737319, 0x82936316, - 0xE6A4B616, 0x8289644A, - 0xE6D5FCFC, 0x827F78D8, - 0xE70747C3, 0x8275A0C0, - 0xE7389664, 0x826BDC04, - 0xE769E8D8, 0x82622AA5, - 0xE79B3F16, 0x82588CA6, - 0xE7CC9917, 0x824F0208, - 0xE7FDF6D3, 0x82458ACB, - 0xE82F5844, 0x823C26F2, - 0xE860BD60, 0x8232D67E, - 0xE8922621, 0x82299971, - 0xE8C3927F, 0x82206FCB, - 0xE8F50273, 0x8217598F, - 0xE92675F4, 0x820E56BE, - 0xE957ECFB, 0x82056758, - 0xE9896780, 0x81FC8B60, - 0xE9BAE57C, 0x81F3C2D7, - 0xE9EC66E8, 0x81EB0DBD, - 0xEA1DEBBB, 0x81E26C16, - 0xEA4F73EE, 0x81D9DDE1, - 0xEA80FF79, 0x81D16320, - 0xEAB28E55, 0x81C8FBD5, - 0xEAE4207A, 0x81C0A801, - 0xEB15B5E0, 0x81B867A4, - 0xEB474E80, 0x81B03AC1, - 0xEB78EA52, 0x81A82159, - 0xEBAA894E, 0x81A01B6C, - 0xEBDC2B6D, 0x819828FD, - 0xEC0DD0A8, 0x81904A0C, - 0xEC3F78F5, 0x81887E9A, - 0xEC71244F, 0x8180C6A9, - 0xECA2D2AC, 0x8179223A, - 0xECD48406, 0x8171914E, - 0xED063855, 0x816A13E6, - 0xED37EF91, 0x8162AA03, - 0xED69A9B2, 0x815B53A8, - 0xED9B66B2, 0x815410D3, - 0xEDCD2687, 0x814CE188, - 0xEDFEE92B, 0x8145C5C6, - 0xEE30AE95, 0x813EBD90, - 0xEE6276BF, 0x8137C8E6, - 0xEE9441A0, 0x8130E7C8, - 0xEEC60F31, 0x812A1A39, - 0xEEF7DF6A, 0x81236039, - 0xEF29B243, 0x811CB9CA, - 0xEF5B87B5, 0x811626EC, - 0xEF8D5FB8, 0x810FA7A0, - 0xEFBF3A44, 0x81093BE8, - 0xEFF11752, 0x8102E3C3, - 0xF022F6DA, 0x80FC9F35, - 0xF054D8D4, 0x80F66E3C, - 0xF086BD39, 0x80F050DB, - 0xF0B8A401, 0x80EA4712, - 0xF0EA8D23, 0x80E450E2, - 0xF11C789A, 0x80DE6E4C, - 0xF14E665C, 0x80D89F51, - 0xF1805662, 0x80D2E3F1, - 0xF1B248A5, 0x80CD3C2F, - 0xF1E43D1C, 0x80C7A80A, - 0xF21633C0, 0x80C22783, - 0xF2482C89, 0x80BCBA9C, - 0xF27A2770, 0x80B76155, - 0xF2AC246D, 0x80B21BAF, - 0xF2DE2378, 0x80ACE9AB, - 0xF310248A, 0x80A7CB49, - 0xF342279A, 0x80A2C08B, - 0xF3742CA1, 0x809DC970, - 0xF3A63398, 0x8098E5FB, - 0xF3D83C76, 0x8094162B, - 0xF40A4734, 0x808F5A02, - 0xF43C53CA, 0x808AB180, - 0xF46E6231, 0x80861CA5, - 0xF4A07260, 0x80819B74, - 0xF4D28451, 0x807D2DEB, - 0xF50497FA, 0x8078D40D, - 0xF536AD55, 0x80748DD9, - 0xF568C45A, 0x80705B50, - 0xF59ADD01, 0x806C3C73, - 0xF5CCF743, 0x80683143, - 0xF5FF1317, 0x806439C0, - 0xF6313076, 0x806055EA, - 0xF6634F58, 0x805C85C3, - 0xF6956FB6, 0x8058C94C, - 0xF6C79188, 0x80552083, - 0xF6F9B4C5, 0x80518B6B, - 0xF72BD967, 0x804E0A03, - 0xF75DFF65, 0x804A9C4D, - 0xF79026B8, 0x80474248, - 0xF7C24F58, 0x8043FBF6, - 0xF7F4793E, 0x8040C956, - 0xF826A461, 0x803DAA69, - 0xF858D0BA, 0x803A9F31, - 0xF88AFE41, 0x8037A7AC, - 0xF8BD2CEF, 0x8034C3DC, - 0xF8EF5CBB, 0x8031F3C1, - 0xF9218D9E, 0x802F375C, - 0xF953BF90, 0x802C8EAD, - 0xF985F28A, 0x8029F9B4, - 0xF9B82683, 0x80277872, - 0xF9EA5B75, 0x80250AE7, - 0xFA1C9156, 0x8022B113, - 0xFA4EC820, 0x80206AF8, - 0xFA80FFCB, 0x801E3894, - 0xFAB3384F, 0x801C19E9, - 0xFAE571A4, 0x801A0EF7, - 0xFB17ABC2, 0x801817BF, - 0xFB49E6A2, 0x80163440, - 0xFB7C223C, 0x8014647A, - 0xFBAE5E89, 0x8012A86F, - 0xFBE09B80, 0x8011001E, - 0xFC12D919, 0x800F6B88, - 0xFC45174E, 0x800DEAAC, - 0xFC775616, 0x800C7D8C, - 0xFCA99569, 0x800B2427, - 0xFCDBD541, 0x8009DE7D, - 0xFD0E1594, 0x8008AC90, - 0xFD40565B, 0x80078E5E, - 0xFD72978F, 0x800683E8, - 0xFDA4D928, 0x80058D2E, - 0xFDD71B1E, 0x8004AA31, - 0xFE095D69, 0x8003DAF0, - 0xFE3BA001, 0x80031F6C, - 0xFE6DE2E0, 0x800277A5, - 0xFEA025FC, 0x8001E39B, - 0xFED2694F, 0x8001634D, - 0xFF04ACD0, 0x8000F6BD, - 0xFF36F078, 0x80009DE9, - 0xFF69343E, 0x800058D3, - 0xFF9B781D, 0x8000277A, - 0xFFCDBC0A, 0x800009DE -}; - - - -/* -* @brief q15 Twiddle factors Table -*/ - - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 16 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_16_q15[24] = { - 0x7FFF, 0x0000, - 0x7641, 0x30FB, - 0x5A82, 0x5A82, - 0x30FB, 0x7641, - 0x0000, 0x7FFF, - 0xCF04, 0x7641, - 0xA57D, 0x5A82, - 0x89BE, 0x30FB, - 0x8000, 0x0000, - 0x89BE, 0xCF04, - 0xA57D, 0xA57D, - 0xCF04, 0x89BE -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 32 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_32_q15[48] = { - 0x7FFF, 0x0000, - 0x7D8A, 0x18F8, - 0x7641, 0x30FB, - 0x6A6D, 0x471C, - 0x5A82, 0x5A82, - 0x471C, 0x6A6D, - 0x30FB, 0x7641, - 0x18F8, 0x7D8A, - 0x0000, 0x7FFF, - 0xE707, 0x7D8A, - 0xCF04, 0x7641, - 0xB8E3, 0x6A6D, - 0xA57D, 0x5A82, - 0x9592, 0x471C, - 0x89BE, 0x30FB, - 0x8275, 0x18F8, - 0x8000, 0x0000, - 0x8275, 0xE707, - 0x89BE, 0xCF04, - 0x9592, 0xB8E3, - 0xA57D, 0xA57D, - 0xB8E3, 0x9592, - 0xCF04, 0x89BE, - 0xE707, 0x8275 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 64 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_64_q15[96] = { - 0x7FFF, 0x0000, - 0x7F62, 0x0C8B, - 0x7D8A, 0x18F8, - 0x7A7D, 0x2528, - 0x7641, 0x30FB, - 0x70E2, 0x3C56, - 0x6A6D, 0x471C, - 0x62F2, 0x5133, - 0x5A82, 0x5A82, - 0x5133, 0x62F2, - 0x471C, 0x6A6D, - 0x3C56, 0x70E2, - 0x30FB, 0x7641, - 0x2528, 0x7A7D, - 0x18F8, 0x7D8A, - 0x0C8B, 0x7F62, - 0x0000, 0x7FFF, - 0xF374, 0x7F62, - 0xE707, 0x7D8A, - 0xDAD7, 0x7A7D, - 0xCF04, 0x7641, - 0xC3A9, 0x70E2, - 0xB8E3, 0x6A6D, - 0xAECC, 0x62F2, - 0xA57D, 0x5A82, - 0x9D0D, 0x5133, - 0x9592, 0x471C, - 0x8F1D, 0x3C56, - 0x89BE, 0x30FB, - 0x8582, 0x2528, - 0x8275, 0x18F8, - 0x809D, 0x0C8B, - 0x8000, 0x0000, - 0x809D, 0xF374, - 0x8275, 0xE707, - 0x8582, 0xDAD7, - 0x89BE, 0xCF04, - 0x8F1D, 0xC3A9, - 0x9592, 0xB8E3, - 0x9D0D, 0xAECC, - 0xA57D, 0xA57D, - 0xAECC, 0x9D0D, - 0xB8E3, 0x9592, - 0xC3A9, 0x8F1D, - 0xCF04, 0x89BE, - 0xDAD7, 0x8582, - 0xE707, 0x8275, - 0xF374, 0x809D -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 128 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_128_q15[192] = { - 0x7FFF, 0x0000, - 0x7FD8, 0x0647, - 0x7F62, 0x0C8B, - 0x7E9D, 0x12C8, - 0x7D8A, 0x18F8, - 0x7C29, 0x1F19, - 0x7A7D, 0x2528, - 0x7884, 0x2B1F, - 0x7641, 0x30FB, - 0x73B5, 0x36BA, - 0x70E2, 0x3C56, - 0x6DCA, 0x41CE, - 0x6A6D, 0x471C, - 0x66CF, 0x4C3F, - 0x62F2, 0x5133, - 0x5ED7, 0x55F5, - 0x5A82, 0x5A82, - 0x55F5, 0x5ED7, - 0x5133, 0x62F2, - 0x4C3F, 0x66CF, - 0x471C, 0x6A6D, - 0x41CE, 0x6DCA, - 0x3C56, 0x70E2, - 0x36BA, 0x73B5, - 0x30FB, 0x7641, - 0x2B1F, 0x7884, - 0x2528, 0x7A7D, - 0x1F19, 0x7C29, - 0x18F8, 0x7D8A, - 0x12C8, 0x7E9D, - 0x0C8B, 0x7F62, - 0x0647, 0x7FD8, - 0x0000, 0x7FFF, - 0xF9B8, 0x7FD8, - 0xF374, 0x7F62, - 0xED37, 0x7E9D, - 0xE707, 0x7D8A, - 0xE0E6, 0x7C29, - 0xDAD7, 0x7A7D, - 0xD4E0, 0x7884, - 0xCF04, 0x7641, - 0xC945, 0x73B5, - 0xC3A9, 0x70E2, - 0xBE31, 0x6DCA, - 0xB8E3, 0x6A6D, - 0xB3C0, 0x66CF, - 0xAECC, 0x62F2, - 0xAA0A, 0x5ED7, - 0xA57D, 0x5A82, - 0xA128, 0x55F5, - 0x9D0D, 0x5133, - 0x9930, 0x4C3F, - 0x9592, 0x471C, - 0x9235, 0x41CE, - 0x8F1D, 0x3C56, - 0x8C4A, 0x36BA, - 0x89BE, 0x30FB, - 0x877B, 0x2B1F, - 0x8582, 0x2528, - 0x83D6, 0x1F19, - 0x8275, 0x18F8, - 0x8162, 0x12C8, - 0x809D, 0x0C8B, - 0x8027, 0x0647, - 0x8000, 0x0000, - 0x8027, 0xF9B8, - 0x809D, 0xF374, - 0x8162, 0xED37, - 0x8275, 0xE707, - 0x83D6, 0xE0E6, - 0x8582, 0xDAD7, - 0x877B, 0xD4E0, - 0x89BE, 0xCF04, - 0x8C4A, 0xC945, - 0x8F1D, 0xC3A9, - 0x9235, 0xBE31, - 0x9592, 0xB8E3, - 0x9930, 0xB3C0, - 0x9D0D, 0xAECC, - 0xA128, 0xAA0A, - 0xA57D, 0xA57D, - 0xAA0A, 0xA128, - 0xAECC, 0x9D0D, - 0xB3C0, 0x9930, - 0xB8E3, 0x9592, - 0xBE31, 0x9235, - 0xC3A9, 0x8F1D, - 0xC945, 0x8C4A, - 0xCF04, 0x89BE, - 0xD4E0, 0x877B, - 0xDAD7, 0x8582, - 0xE0E6, 0x83D6, - 0xE707, 0x8275, - 0xED37, 0x8162, - 0xF374, 0x809D, - 0xF9B8, 0x8027 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 256 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_256_q15[384] = { - 0x7FFF, 0x0000, - 0x7FF6, 0x0324, - 0x7FD8, 0x0647, - 0x7FA7, 0x096A, - 0x7F62, 0x0C8B, - 0x7F09, 0x0FAB, - 0x7E9D, 0x12C8, - 0x7E1D, 0x15E2, - 0x7D8A, 0x18F8, - 0x7CE3, 0x1C0B, - 0x7C29, 0x1F19, - 0x7B5D, 0x2223, - 0x7A7D, 0x2528, - 0x798A, 0x2826, - 0x7884, 0x2B1F, - 0x776C, 0x2E11, - 0x7641, 0x30FB, - 0x7504, 0x33DE, - 0x73B5, 0x36BA, - 0x7255, 0x398C, - 0x70E2, 0x3C56, - 0x6F5F, 0x3F17, - 0x6DCA, 0x41CE, - 0x6C24, 0x447A, - 0x6A6D, 0x471C, - 0x68A6, 0x49B4, - 0x66CF, 0x4C3F, - 0x64E8, 0x4EBF, - 0x62F2, 0x5133, - 0x60EC, 0x539B, - 0x5ED7, 0x55F5, - 0x5CB4, 0x5842, - 0x5A82, 0x5A82, - 0x5842, 0x5CB4, - 0x55F5, 0x5ED7, - 0x539B, 0x60EC, - 0x5133, 0x62F2, - 0x4EBF, 0x64E8, - 0x4C3F, 0x66CF, - 0x49B4, 0x68A6, - 0x471C, 0x6A6D, - 0x447A, 0x6C24, - 0x41CE, 0x6DCA, - 0x3F17, 0x6F5F, - 0x3C56, 0x70E2, - 0x398C, 0x7255, - 0x36BA, 0x73B5, - 0x33DE, 0x7504, - 0x30FB, 0x7641, - 0x2E11, 0x776C, - 0x2B1F, 0x7884, - 0x2826, 0x798A, - 0x2528, 0x7A7D, - 0x2223, 0x7B5D, - 0x1F19, 0x7C29, - 0x1C0B, 0x7CE3, - 0x18F8, 0x7D8A, - 0x15E2, 0x7E1D, - 0x12C8, 0x7E9D, - 0x0FAB, 0x7F09, - 0x0C8B, 0x7F62, - 0x096A, 0x7FA7, - 0x0647, 0x7FD8, - 0x0324, 0x7FF6, - 0x0000, 0x7FFF, - 0xFCDB, 0x7FF6, - 0xF9B8, 0x7FD8, - 0xF695, 0x7FA7, - 0xF374, 0x7F62, - 0xF054, 0x7F09, - 0xED37, 0x7E9D, - 0xEA1D, 0x7E1D, - 0xE707, 0x7D8A, - 0xE3F4, 0x7CE3, - 0xE0E6, 0x7C29, - 0xDDDC, 0x7B5D, - 0xDAD7, 0x7A7D, - 0xD7D9, 0x798A, - 0xD4E0, 0x7884, - 0xD1EE, 0x776C, - 0xCF04, 0x7641, - 0xCC21, 0x7504, - 0xC945, 0x73B5, - 0xC673, 0x7255, - 0xC3A9, 0x70E2, - 0xC0E8, 0x6F5F, - 0xBE31, 0x6DCA, - 0xBB85, 0x6C24, - 0xB8E3, 0x6A6D, - 0xB64B, 0x68A6, - 0xB3C0, 0x66CF, - 0xB140, 0x64E8, - 0xAECC, 0x62F2, - 0xAC64, 0x60EC, - 0xAA0A, 0x5ED7, - 0xA7BD, 0x5CB4, - 0xA57D, 0x5A82, - 0xA34B, 0x5842, - 0xA128, 0x55F5, - 0x9F13, 0x539B, - 0x9D0D, 0x5133, - 0x9B17, 0x4EBF, - 0x9930, 0x4C3F, - 0x9759, 0x49B4, - 0x9592, 0x471C, - 0x93DB, 0x447A, - 0x9235, 0x41CE, - 0x90A0, 0x3F17, - 0x8F1D, 0x3C56, - 0x8DAA, 0x398C, - 0x8C4A, 0x36BA, - 0x8AFB, 0x33DE, - 0x89BE, 0x30FB, - 0x8893, 0x2E11, - 0x877B, 0x2B1F, - 0x8675, 0x2826, - 0x8582, 0x2528, - 0x84A2, 0x2223, - 0x83D6, 0x1F19, - 0x831C, 0x1C0B, - 0x8275, 0x18F8, - 0x81E2, 0x15E2, - 0x8162, 0x12C8, - 0x80F6, 0x0FAB, - 0x809D, 0x0C8B, - 0x8058, 0x096A, - 0x8027, 0x0647, - 0x8009, 0x0324, - 0x8000, 0x0000, - 0x8009, 0xFCDB, - 0x8027, 0xF9B8, - 0x8058, 0xF695, - 0x809D, 0xF374, - 0x80F6, 0xF054, - 0x8162, 0xED37, - 0x81E2, 0xEA1D, - 0x8275, 0xE707, - 0x831C, 0xE3F4, - 0x83D6, 0xE0E6, - 0x84A2, 0xDDDC, - 0x8582, 0xDAD7, - 0x8675, 0xD7D9, - 0x877B, 0xD4E0, - 0x8893, 0xD1EE, - 0x89BE, 0xCF04, - 0x8AFB, 0xCC21, - 0x8C4A, 0xC945, - 0x8DAA, 0xC673, - 0x8F1D, 0xC3A9, - 0x90A0, 0xC0E8, - 0x9235, 0xBE31, - 0x93DB, 0xBB85, - 0x9592, 0xB8E3, - 0x9759, 0xB64B, - 0x9930, 0xB3C0, - 0x9B17, 0xB140, - 0x9D0D, 0xAECC, - 0x9F13, 0xAC64, - 0xA128, 0xAA0A, - 0xA34B, 0xA7BD, - 0xA57D, 0xA57D, - 0xA7BD, 0xA34B, - 0xAA0A, 0xA128, - 0xAC64, 0x9F13, - 0xAECC, 0x9D0D, - 0xB140, 0x9B17, - 0xB3C0, 0x9930, - 0xB64B, 0x9759, - 0xB8E3, 0x9592, - 0xBB85, 0x93DB, - 0xBE31, 0x9235, - 0xC0E8, 0x90A0, - 0xC3A9, 0x8F1D, - 0xC673, 0x8DAA, - 0xC945, 0x8C4A, - 0xCC21, 0x8AFB, - 0xCF04, 0x89BE, - 0xD1EE, 0x8893, - 0xD4E0, 0x877B, - 0xD7D9, 0x8675, - 0xDAD7, 0x8582, - 0xDDDC, 0x84A2, - 0xE0E6, 0x83D6, - 0xE3F4, 0x831C, - 0xE707, 0x8275, - 0xEA1D, 0x81E2, - 0xED37, 0x8162, - 0xF054, 0x80F6, - 0xF374, 0x809D, - 0xF695, 0x8058, - 0xF9B8, 0x8027, - 0xFCDB, 0x8009 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 512 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_512_q15[768] = { - 0x7FFF, 0x0000, - 0x7FFD, 0x0192, - 0x7FF6, 0x0324, - 0x7FE9, 0x04B6, - 0x7FD8, 0x0647, - 0x7FC2, 0x07D9, - 0x7FA7, 0x096A, - 0x7F87, 0x0AFB, - 0x7F62, 0x0C8B, - 0x7F38, 0x0E1B, - 0x7F09, 0x0FAB, - 0x7ED5, 0x1139, - 0x7E9D, 0x12C8, - 0x7E5F, 0x1455, - 0x7E1D, 0x15E2, - 0x7DD6, 0x176D, - 0x7D8A, 0x18F8, - 0x7D39, 0x1A82, - 0x7CE3, 0x1C0B, - 0x7C89, 0x1D93, - 0x7C29, 0x1F19, - 0x7BC5, 0x209F, - 0x7B5D, 0x2223, - 0x7AEF, 0x23A6, - 0x7A7D, 0x2528, - 0x7A05, 0x26A8, - 0x798A, 0x2826, - 0x7909, 0x29A3, - 0x7884, 0x2B1F, - 0x77FA, 0x2C98, - 0x776C, 0x2E11, - 0x76D9, 0x2F87, - 0x7641, 0x30FB, - 0x75A5, 0x326E, - 0x7504, 0x33DE, - 0x745F, 0x354D, - 0x73B5, 0x36BA, - 0x7307, 0x3824, - 0x7255, 0x398C, - 0x719E, 0x3AF2, - 0x70E2, 0x3C56, - 0x7023, 0x3DB8, - 0x6F5F, 0x3F17, - 0x6E96, 0x4073, - 0x6DCA, 0x41CE, - 0x6CF9, 0x4325, - 0x6C24, 0x447A, - 0x6B4A, 0x45CD, - 0x6A6D, 0x471C, - 0x698C, 0x4869, - 0x68A6, 0x49B4, - 0x67BD, 0x4AFB, - 0x66CF, 0x4C3F, - 0x65DD, 0x4D81, - 0x64E8, 0x4EBF, - 0x63EF, 0x4FFB, - 0x62F2, 0x5133, - 0x61F1, 0x5269, - 0x60EC, 0x539B, - 0x5FE3, 0x54CA, - 0x5ED7, 0x55F5, - 0x5DC7, 0x571D, - 0x5CB4, 0x5842, - 0x5B9D, 0x5964, - 0x5A82, 0x5A82, - 0x5964, 0x5B9D, - 0x5842, 0x5CB4, - 0x571D, 0x5DC7, - 0x55F5, 0x5ED7, - 0x54CA, 0x5FE3, - 0x539B, 0x60EC, - 0x5269, 0x61F1, - 0x5133, 0x62F2, - 0x4FFB, 0x63EF, - 0x4EBF, 0x64E8, - 0x4D81, 0x65DD, - 0x4C3F, 0x66CF, - 0x4AFB, 0x67BD, - 0x49B4, 0x68A6, - 0x4869, 0x698C, - 0x471C, 0x6A6D, - 0x45CD, 0x6B4A, - 0x447A, 0x6C24, - 0x4325, 0x6CF9, - 0x41CE, 0x6DCA, - 0x4073, 0x6E96, - 0x3F17, 0x6F5F, - 0x3DB8, 0x7023, - 0x3C56, 0x70E2, - 0x3AF2, 0x719E, - 0x398C, 0x7255, - 0x3824, 0x7307, - 0x36BA, 0x73B5, - 0x354D, 0x745F, - 0x33DE, 0x7504, - 0x326E, 0x75A5, - 0x30FB, 0x7641, - 0x2F87, 0x76D9, - 0x2E11, 0x776C, - 0x2C98, 0x77FA, - 0x2B1F, 0x7884, - 0x29A3, 0x7909, - 0x2826, 0x798A, - 0x26A8, 0x7A05, - 0x2528, 0x7A7D, - 0x23A6, 0x7AEF, - 0x2223, 0x7B5D, - 0x209F, 0x7BC5, - 0x1F19, 0x7C29, - 0x1D93, 0x7C89, - 0x1C0B, 0x7CE3, - 0x1A82, 0x7D39, - 0x18F8, 0x7D8A, - 0x176D, 0x7DD6, - 0x15E2, 0x7E1D, - 0x1455, 0x7E5F, - 0x12C8, 0x7E9D, - 0x1139, 0x7ED5, - 0x0FAB, 0x7F09, - 0x0E1B, 0x7F38, - 0x0C8B, 0x7F62, - 0x0AFB, 0x7F87, - 0x096A, 0x7FA7, - 0x07D9, 0x7FC2, - 0x0647, 0x7FD8, - 0x04B6, 0x7FE9, - 0x0324, 0x7FF6, - 0x0192, 0x7FFD, - 0x0000, 0x7FFF, - 0xFE6D, 0x7FFD, - 0xFCDB, 0x7FF6, - 0xFB49, 0x7FE9, - 0xF9B8, 0x7FD8, - 0xF826, 0x7FC2, - 0xF695, 0x7FA7, - 0xF504, 0x7F87, - 0xF374, 0x7F62, - 0xF1E4, 0x7F38, - 0xF054, 0x7F09, - 0xEEC6, 0x7ED5, - 0xED37, 0x7E9D, - 0xEBAA, 0x7E5F, - 0xEA1D, 0x7E1D, - 0xE892, 0x7DD6, - 0xE707, 0x7D8A, - 0xE57D, 0x7D39, - 0xE3F4, 0x7CE3, - 0xE26C, 0x7C89, - 0xE0E6, 0x7C29, - 0xDF60, 0x7BC5, - 0xDDDC, 0x7B5D, - 0xDC59, 0x7AEF, - 0xDAD7, 0x7A7D, - 0xD957, 0x7A05, - 0xD7D9, 0x798A, - 0xD65C, 0x7909, - 0xD4E0, 0x7884, - 0xD367, 0x77FA, - 0xD1EE, 0x776C, - 0xD078, 0x76D9, - 0xCF04, 0x7641, - 0xCD91, 0x75A5, - 0xCC21, 0x7504, - 0xCAB2, 0x745F, - 0xC945, 0x73B5, - 0xC7DB, 0x7307, - 0xC673, 0x7255, - 0xC50D, 0x719E, - 0xC3A9, 0x70E2, - 0xC247, 0x7023, - 0xC0E8, 0x6F5F, - 0xBF8C, 0x6E96, - 0xBE31, 0x6DCA, - 0xBCDA, 0x6CF9, - 0xBB85, 0x6C24, - 0xBA32, 0x6B4A, - 0xB8E3, 0x6A6D, - 0xB796, 0x698C, - 0xB64B, 0x68A6, - 0xB504, 0x67BD, - 0xB3C0, 0x66CF, - 0xB27E, 0x65DD, - 0xB140, 0x64E8, - 0xB004, 0x63EF, - 0xAECC, 0x62F2, - 0xAD96, 0x61F1, - 0xAC64, 0x60EC, - 0xAB35, 0x5FE3, - 0xAA0A, 0x5ED7, - 0xA8E2, 0x5DC7, - 0xA7BD, 0x5CB4, - 0xA69B, 0x5B9D, - 0xA57D, 0x5A82, - 0xA462, 0x5964, - 0xA34B, 0x5842, - 0xA238, 0x571D, - 0xA128, 0x55F5, - 0xA01C, 0x54CA, - 0x9F13, 0x539B, - 0x9E0E, 0x5269, - 0x9D0D, 0x5133, - 0x9C10, 0x4FFB, - 0x9B17, 0x4EBF, - 0x9A22, 0x4D81, - 0x9930, 0x4C3F, - 0x9842, 0x4AFB, - 0x9759, 0x49B4, - 0x9673, 0x4869, - 0x9592, 0x471C, - 0x94B5, 0x45CD, - 0x93DB, 0x447A, - 0x9306, 0x4325, - 0x9235, 0x41CE, - 0x9169, 0x4073, - 0x90A0, 0x3F17, - 0x8FDC, 0x3DB8, - 0x8F1D, 0x3C56, - 0x8E61, 0x3AF2, - 0x8DAA, 0x398C, - 0x8CF8, 0x3824, - 0x8C4A, 0x36BA, - 0x8BA0, 0x354D, - 0x8AFB, 0x33DE, - 0x8A5A, 0x326E, - 0x89BE, 0x30FB, - 0x8926, 0x2F87, - 0x8893, 0x2E11, - 0x8805, 0x2C98, - 0x877B, 0x2B1F, - 0x86F6, 0x29A3, - 0x8675, 0x2826, - 0x85FA, 0x26A8, - 0x8582, 0x2528, - 0x8510, 0x23A6, - 0x84A2, 0x2223, - 0x843A, 0x209F, - 0x83D6, 0x1F19, - 0x8376, 0x1D93, - 0x831C, 0x1C0B, - 0x82C6, 0x1A82, - 0x8275, 0x18F8, - 0x8229, 0x176D, - 0x81E2, 0x15E2, - 0x81A0, 0x1455, - 0x8162, 0x12C8, - 0x812A, 0x1139, - 0x80F6, 0x0FAB, - 0x80C7, 0x0E1B, - 0x809D, 0x0C8B, - 0x8078, 0x0AFB, - 0x8058, 0x096A, - 0x803D, 0x07D9, - 0x8027, 0x0647, - 0x8016, 0x04B6, - 0x8009, 0x0324, - 0x8002, 0x0192, - 0x8000, 0x0000, - 0x8002, 0xFE6D, - 0x8009, 0xFCDB, - 0x8016, 0xFB49, - 0x8027, 0xF9B8, - 0x803D, 0xF826, - 0x8058, 0xF695, - 0x8078, 0xF504, - 0x809D, 0xF374, - 0x80C7, 0xF1E4, - 0x80F6, 0xF054, - 0x812A, 0xEEC6, - 0x8162, 0xED37, - 0x81A0, 0xEBAA, - 0x81E2, 0xEA1D, - 0x8229, 0xE892, - 0x8275, 0xE707, - 0x82C6, 0xE57D, - 0x831C, 0xE3F4, - 0x8376, 0xE26C, - 0x83D6, 0xE0E6, - 0x843A, 0xDF60, - 0x84A2, 0xDDDC, - 0x8510, 0xDC59, - 0x8582, 0xDAD7, - 0x85FA, 0xD957, - 0x8675, 0xD7D9, - 0x86F6, 0xD65C, - 0x877B, 0xD4E0, - 0x8805, 0xD367, - 0x8893, 0xD1EE, - 0x8926, 0xD078, - 0x89BE, 0xCF04, - 0x8A5A, 0xCD91, - 0x8AFB, 0xCC21, - 0x8BA0, 0xCAB2, - 0x8C4A, 0xC945, - 0x8CF8, 0xC7DB, - 0x8DAA, 0xC673, - 0x8E61, 0xC50D, - 0x8F1D, 0xC3A9, - 0x8FDC, 0xC247, - 0x90A0, 0xC0E8, - 0x9169, 0xBF8C, - 0x9235, 0xBE31, - 0x9306, 0xBCDA, - 0x93DB, 0xBB85, - 0x94B5, 0xBA32, - 0x9592, 0xB8E3, - 0x9673, 0xB796, - 0x9759, 0xB64B, - 0x9842, 0xB504, - 0x9930, 0xB3C0, - 0x9A22, 0xB27E, - 0x9B17, 0xB140, - 0x9C10, 0xB004, - 0x9D0D, 0xAECC, - 0x9E0E, 0xAD96, - 0x9F13, 0xAC64, - 0xA01C, 0xAB35, - 0xA128, 0xAA0A, - 0xA238, 0xA8E2, - 0xA34B, 0xA7BD, - 0xA462, 0xA69B, - 0xA57D, 0xA57D, - 0xA69B, 0xA462, - 0xA7BD, 0xA34B, - 0xA8E2, 0xA238, - 0xAA0A, 0xA128, - 0xAB35, 0xA01C, - 0xAC64, 0x9F13, - 0xAD96, 0x9E0E, - 0xAECC, 0x9D0D, - 0xB004, 0x9C10, - 0xB140, 0x9B17, - 0xB27E, 0x9A22, - 0xB3C0, 0x9930, - 0xB504, 0x9842, - 0xB64B, 0x9759, - 0xB796, 0x9673, - 0xB8E3, 0x9592, - 0xBA32, 0x94B5, - 0xBB85, 0x93DB, - 0xBCDA, 0x9306, - 0xBE31, 0x9235, - 0xBF8C, 0x9169, - 0xC0E8, 0x90A0, - 0xC247, 0x8FDC, - 0xC3A9, 0x8F1D, - 0xC50D, 0x8E61, - 0xC673, 0x8DAA, - 0xC7DB, 0x8CF8, - 0xC945, 0x8C4A, - 0xCAB2, 0x8BA0, - 0xCC21, 0x8AFB, - 0xCD91, 0x8A5A, - 0xCF04, 0x89BE, - 0xD078, 0x8926, - 0xD1EE, 0x8893, - 0xD367, 0x8805, - 0xD4E0, 0x877B, - 0xD65C, 0x86F6, - 0xD7D9, 0x8675, - 0xD957, 0x85FA, - 0xDAD7, 0x8582, - 0xDC59, 0x8510, - 0xDDDC, 0x84A2, - 0xDF60, 0x843A, - 0xE0E6, 0x83D6, - 0xE26C, 0x8376, - 0xE3F4, 0x831C, - 0xE57D, 0x82C6, - 0xE707, 0x8275, - 0xE892, 0x8229, - 0xEA1D, 0x81E2, - 0xEBAA, 0x81A0, - 0xED37, 0x8162, - 0xEEC6, 0x812A, - 0xF054, 0x80F6, - 0xF1E4, 0x80C7, - 0xF374, 0x809D, - 0xF504, 0x8078, - 0xF695, 0x8058, - 0xF826, 0x803D, - 0xF9B8, 0x8027, - 0xFB49, 0x8016, - 0xFCDB, 0x8009, - 0xFE6D, 0x8002 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 1024 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_1024_q15[1536] = { - 0x7FFF, 0x0000, - 0x7FFF, 0x00C9, - 0x7FFD, 0x0192, - 0x7FFA, 0x025B, - 0x7FF6, 0x0324, - 0x7FF0, 0x03ED, - 0x7FE9, 0x04B6, - 0x7FE1, 0x057F, - 0x7FD8, 0x0647, - 0x7FCE, 0x0710, - 0x7FC2, 0x07D9, - 0x7FB5, 0x08A2, - 0x7FA7, 0x096A, - 0x7F97, 0x0A33, - 0x7F87, 0x0AFB, - 0x7F75, 0x0BC3, - 0x7F62, 0x0C8B, - 0x7F4D, 0x0D53, - 0x7F38, 0x0E1B, - 0x7F21, 0x0EE3, - 0x7F09, 0x0FAB, - 0x7EF0, 0x1072, - 0x7ED5, 0x1139, - 0x7EBA, 0x1201, - 0x7E9D, 0x12C8, - 0x7E7F, 0x138E, - 0x7E5F, 0x1455, - 0x7E3F, 0x151B, - 0x7E1D, 0x15E2, - 0x7DFA, 0x16A8, - 0x7DD6, 0x176D, - 0x7DB0, 0x1833, - 0x7D8A, 0x18F8, - 0x7D62, 0x19BD, - 0x7D39, 0x1A82, - 0x7D0F, 0x1B47, - 0x7CE3, 0x1C0B, - 0x7CB7, 0x1CCF, - 0x7C89, 0x1D93, - 0x7C5A, 0x1E56, - 0x7C29, 0x1F19, - 0x7BF8, 0x1FDC, - 0x7BC5, 0x209F, - 0x7B92, 0x2161, - 0x7B5D, 0x2223, - 0x7B26, 0x22E5, - 0x7AEF, 0x23A6, - 0x7AB6, 0x2467, - 0x7A7D, 0x2528, - 0x7A42, 0x25E8, - 0x7A05, 0x26A8, - 0x79C8, 0x2767, - 0x798A, 0x2826, - 0x794A, 0x28E5, - 0x7909, 0x29A3, - 0x78C7, 0x2A61, - 0x7884, 0x2B1F, - 0x7840, 0x2BDC, - 0x77FA, 0x2C98, - 0x77B4, 0x2D55, - 0x776C, 0x2E11, - 0x7723, 0x2ECC, - 0x76D9, 0x2F87, - 0x768E, 0x3041, - 0x7641, 0x30FB, - 0x75F4, 0x31B5, - 0x75A5, 0x326E, - 0x7555, 0x3326, - 0x7504, 0x33DE, - 0x74B2, 0x3496, - 0x745F, 0x354D, - 0x740B, 0x3604, - 0x73B5, 0x36BA, - 0x735F, 0x376F, - 0x7307, 0x3824, - 0x72AF, 0x38D8, - 0x7255, 0x398C, - 0x71FA, 0x3A40, - 0x719E, 0x3AF2, - 0x7141, 0x3BA5, - 0x70E2, 0x3C56, - 0x7083, 0x3D07, - 0x7023, 0x3DB8, - 0x6FC1, 0x3E68, - 0x6F5F, 0x3F17, - 0x6EFB, 0x3FC5, - 0x6E96, 0x4073, - 0x6E30, 0x4121, - 0x6DCA, 0x41CE, - 0x6D62, 0x427A, - 0x6CF9, 0x4325, - 0x6C8F, 0x43D0, - 0x6C24, 0x447A, - 0x6BB8, 0x4524, - 0x6B4A, 0x45CD, - 0x6ADC, 0x4675, - 0x6A6D, 0x471C, - 0x69FD, 0x47C3, - 0x698C, 0x4869, - 0x6919, 0x490F, - 0x68A6, 0x49B4, - 0x6832, 0x4A58, - 0x67BD, 0x4AFB, - 0x6746, 0x4B9E, - 0x66CF, 0x4C3F, - 0x6657, 0x4CE1, - 0x65DD, 0x4D81, - 0x6563, 0x4E21, - 0x64E8, 0x4EBF, - 0x646C, 0x4F5E, - 0x63EF, 0x4FFB, - 0x6371, 0x5097, - 0x62F2, 0x5133, - 0x6271, 0x51CE, - 0x61F1, 0x5269, - 0x616F, 0x5302, - 0x60EC, 0x539B, - 0x6068, 0x5433, - 0x5FE3, 0x54CA, - 0x5F5E, 0x5560, - 0x5ED7, 0x55F5, - 0x5E50, 0x568A, - 0x5DC7, 0x571D, - 0x5D3E, 0x57B0, - 0x5CB4, 0x5842, - 0x5C29, 0x58D4, - 0x5B9D, 0x5964, - 0x5B10, 0x59F3, - 0x5A82, 0x5A82, - 0x59F3, 0x5B10, - 0x5964, 0x5B9D, - 0x58D4, 0x5C29, - 0x5842, 0x5CB4, - 0x57B0, 0x5D3E, - 0x571D, 0x5DC7, - 0x568A, 0x5E50, - 0x55F5, 0x5ED7, - 0x5560, 0x5F5E, - 0x54CA, 0x5FE3, - 0x5433, 0x6068, - 0x539B, 0x60EC, - 0x5302, 0x616F, - 0x5269, 0x61F1, - 0x51CE, 0x6271, - 0x5133, 0x62F2, - 0x5097, 0x6371, - 0x4FFB, 0x63EF, - 0x4F5E, 0x646C, - 0x4EBF, 0x64E8, - 0x4E21, 0x6563, - 0x4D81, 0x65DD, - 0x4CE1, 0x6657, - 0x4C3F, 0x66CF, - 0x4B9E, 0x6746, - 0x4AFB, 0x67BD, - 0x4A58, 0x6832, - 0x49B4, 0x68A6, - 0x490F, 0x6919, - 0x4869, 0x698C, - 0x47C3, 0x69FD, - 0x471C, 0x6A6D, - 0x4675, 0x6ADC, - 0x45CD, 0x6B4A, - 0x4524, 0x6BB8, - 0x447A, 0x6C24, - 0x43D0, 0x6C8F, - 0x4325, 0x6CF9, - 0x427A, 0x6D62, - 0x41CE, 0x6DCA, - 0x4121, 0x6E30, - 0x4073, 0x6E96, - 0x3FC5, 0x6EFB, - 0x3F17, 0x6F5F, - 0x3E68, 0x6FC1, - 0x3DB8, 0x7023, - 0x3D07, 0x7083, - 0x3C56, 0x70E2, - 0x3BA5, 0x7141, - 0x3AF2, 0x719E, - 0x3A40, 0x71FA, - 0x398C, 0x7255, - 0x38D8, 0x72AF, - 0x3824, 0x7307, - 0x376F, 0x735F, - 0x36BA, 0x73B5, - 0x3604, 0x740B, - 0x354D, 0x745F, - 0x3496, 0x74B2, - 0x33DE, 0x7504, - 0x3326, 0x7555, - 0x326E, 0x75A5, - 0x31B5, 0x75F4, - 0x30FB, 0x7641, - 0x3041, 0x768E, - 0x2F87, 0x76D9, - 0x2ECC, 0x7723, - 0x2E11, 0x776C, - 0x2D55, 0x77B4, - 0x2C98, 0x77FA, - 0x2BDC, 0x7840, - 0x2B1F, 0x7884, - 0x2A61, 0x78C7, - 0x29A3, 0x7909, - 0x28E5, 0x794A, - 0x2826, 0x798A, - 0x2767, 0x79C8, - 0x26A8, 0x7A05, - 0x25E8, 0x7A42, - 0x2528, 0x7A7D, - 0x2467, 0x7AB6, - 0x23A6, 0x7AEF, - 0x22E5, 0x7B26, - 0x2223, 0x7B5D, - 0x2161, 0x7B92, - 0x209F, 0x7BC5, - 0x1FDC, 0x7BF8, - 0x1F19, 0x7C29, - 0x1E56, 0x7C5A, - 0x1D93, 0x7C89, - 0x1CCF, 0x7CB7, - 0x1C0B, 0x7CE3, - 0x1B47, 0x7D0F, - 0x1A82, 0x7D39, - 0x19BD, 0x7D62, - 0x18F8, 0x7D8A, - 0x1833, 0x7DB0, - 0x176D, 0x7DD6, - 0x16A8, 0x7DFA, - 0x15E2, 0x7E1D, - 0x151B, 0x7E3F, - 0x1455, 0x7E5F, - 0x138E, 0x7E7F, - 0x12C8, 0x7E9D, - 0x1201, 0x7EBA, - 0x1139, 0x7ED5, - 0x1072, 0x7EF0, - 0x0FAB, 0x7F09, - 0x0EE3, 0x7F21, - 0x0E1B, 0x7F38, - 0x0D53, 0x7F4D, - 0x0C8B, 0x7F62, - 0x0BC3, 0x7F75, - 0x0AFB, 0x7F87, - 0x0A33, 0x7F97, - 0x096A, 0x7FA7, - 0x08A2, 0x7FB5, - 0x07D9, 0x7FC2, - 0x0710, 0x7FCE, - 0x0647, 0x7FD8, - 0x057F, 0x7FE1, - 0x04B6, 0x7FE9, - 0x03ED, 0x7FF0, - 0x0324, 0x7FF6, - 0x025B, 0x7FFA, - 0x0192, 0x7FFD, - 0x00C9, 0x7FFF, - 0x0000, 0x7FFF, - 0xFF36, 0x7FFF, - 0xFE6D, 0x7FFD, - 0xFDA4, 0x7FFA, - 0xFCDB, 0x7FF6, - 0xFC12, 0x7FF0, - 0xFB49, 0x7FE9, - 0xFA80, 0x7FE1, - 0xF9B8, 0x7FD8, - 0xF8EF, 0x7FCE, - 0xF826, 0x7FC2, - 0xF75D, 0x7FB5, - 0xF695, 0x7FA7, - 0xF5CC, 0x7F97, - 0xF504, 0x7F87, - 0xF43C, 0x7F75, - 0xF374, 0x7F62, - 0xF2AC, 0x7F4D, - 0xF1E4, 0x7F38, - 0xF11C, 0x7F21, - 0xF054, 0x7F09, - 0xEF8D, 0x7EF0, - 0xEEC6, 0x7ED5, - 0xEDFE, 0x7EBA, - 0xED37, 0x7E9D, - 0xEC71, 0x7E7F, - 0xEBAA, 0x7E5F, - 0xEAE4, 0x7E3F, - 0xEA1D, 0x7E1D, - 0xE957, 0x7DFA, - 0xE892, 0x7DD6, - 0xE7CC, 0x7DB0, - 0xE707, 0x7D8A, - 0xE642, 0x7D62, - 0xE57D, 0x7D39, - 0xE4B8, 0x7D0F, - 0xE3F4, 0x7CE3, - 0xE330, 0x7CB7, - 0xE26C, 0x7C89, - 0xE1A9, 0x7C5A, - 0xE0E6, 0x7C29, - 0xE023, 0x7BF8, - 0xDF60, 0x7BC5, - 0xDE9E, 0x7B92, - 0xDDDC, 0x7B5D, - 0xDD1A, 0x7B26, - 0xDC59, 0x7AEF, - 0xDB98, 0x7AB6, - 0xDAD7, 0x7A7D, - 0xDA17, 0x7A42, - 0xD957, 0x7A05, - 0xD898, 0x79C8, - 0xD7D9, 0x798A, - 0xD71A, 0x794A, - 0xD65C, 0x7909, - 0xD59E, 0x78C7, - 0xD4E0, 0x7884, - 0xD423, 0x7840, - 0xD367, 0x77FA, - 0xD2AA, 0x77B4, - 0xD1EE, 0x776C, - 0xD133, 0x7723, - 0xD078, 0x76D9, - 0xCFBE, 0x768E, - 0xCF04, 0x7641, - 0xCE4A, 0x75F4, - 0xCD91, 0x75A5, - 0xCCD9, 0x7555, - 0xCC21, 0x7504, - 0xCB69, 0x74B2, - 0xCAB2, 0x745F, - 0xC9FB, 0x740B, - 0xC945, 0x73B5, - 0xC890, 0x735F, - 0xC7DB, 0x7307, - 0xC727, 0x72AF, - 0xC673, 0x7255, - 0xC5BF, 0x71FA, - 0xC50D, 0x719E, - 0xC45A, 0x7141, - 0xC3A9, 0x70E2, - 0xC2F8, 0x7083, - 0xC247, 0x7023, - 0xC197, 0x6FC1, - 0xC0E8, 0x6F5F, - 0xC03A, 0x6EFB, - 0xBF8C, 0x6E96, - 0xBEDE, 0x6E30, - 0xBE31, 0x6DCA, - 0xBD85, 0x6D62, - 0xBCDA, 0x6CF9, - 0xBC2F, 0x6C8F, - 0xBB85, 0x6C24, - 0xBADB, 0x6BB8, - 0xBA32, 0x6B4A, - 0xB98A, 0x6ADC, - 0xB8E3, 0x6A6D, - 0xB83C, 0x69FD, - 0xB796, 0x698C, - 0xB6F0, 0x6919, - 0xB64B, 0x68A6, - 0xB5A7, 0x6832, - 0xB504, 0x67BD, - 0xB461, 0x6746, - 0xB3C0, 0x66CF, - 0xB31E, 0x6657, - 0xB27E, 0x65DD, - 0xB1DE, 0x6563, - 0xB140, 0x64E8, - 0xB0A1, 0x646C, - 0xB004, 0x63EF, - 0xAF68, 0x6371, - 0xAECC, 0x62F2, - 0xAE31, 0x6271, - 0xAD96, 0x61F1, - 0xACFD, 0x616F, - 0xAC64, 0x60EC, - 0xABCC, 0x6068, - 0xAB35, 0x5FE3, - 0xAA9F, 0x5F5E, - 0xAA0A, 0x5ED7, - 0xA975, 0x5E50, - 0xA8E2, 0x5DC7, - 0xA84F, 0x5D3E, - 0xA7BD, 0x5CB4, - 0xA72B, 0x5C29, - 0xA69B, 0x5B9D, - 0xA60C, 0x5B10, - 0xA57D, 0x5A82, - 0xA4EF, 0x59F3, - 0xA462, 0x5964, - 0xA3D6, 0x58D4, - 0xA34B, 0x5842, - 0xA2C1, 0x57B0, - 0xA238, 0x571D, - 0xA1AF, 0x568A, - 0xA128, 0x55F5, - 0xA0A1, 0x5560, - 0xA01C, 0x54CA, - 0x9F97, 0x5433, - 0x9F13, 0x539B, - 0x9E90, 0x5302, - 0x9E0E, 0x5269, - 0x9D8E, 0x51CE, - 0x9D0D, 0x5133, - 0x9C8E, 0x5097, - 0x9C10, 0x4FFB, - 0x9B93, 0x4F5E, - 0x9B17, 0x4EBF, - 0x9A9C, 0x4E21, - 0x9A22, 0x4D81, - 0x99A8, 0x4CE1, - 0x9930, 0x4C3F, - 0x98B9, 0x4B9E, - 0x9842, 0x4AFB, - 0x97CD, 0x4A58, - 0x9759, 0x49B4, - 0x96E6, 0x490F, - 0x9673, 0x4869, - 0x9602, 0x47C3, - 0x9592, 0x471C, - 0x9523, 0x4675, - 0x94B5, 0x45CD, - 0x9447, 0x4524, - 0x93DB, 0x447A, - 0x9370, 0x43D0, - 0x9306, 0x4325, - 0x929D, 0x427A, - 0x9235, 0x41CE, - 0x91CF, 0x4121, - 0x9169, 0x4073, - 0x9104, 0x3FC5, - 0x90A0, 0x3F17, - 0x903E, 0x3E68, - 0x8FDC, 0x3DB8, - 0x8F7C, 0x3D07, - 0x8F1D, 0x3C56, - 0x8EBE, 0x3BA5, - 0x8E61, 0x3AF2, - 0x8E05, 0x3A40, - 0x8DAA, 0x398C, - 0x8D50, 0x38D8, - 0x8CF8, 0x3824, - 0x8CA0, 0x376F, - 0x8C4A, 0x36BA, - 0x8BF4, 0x3604, - 0x8BA0, 0x354D, - 0x8B4D, 0x3496, - 0x8AFB, 0x33DE, - 0x8AAA, 0x3326, - 0x8A5A, 0x326E, - 0x8A0B, 0x31B5, - 0x89BE, 0x30FB, - 0x8971, 0x3041, - 0x8926, 0x2F87, - 0x88DC, 0x2ECC, - 0x8893, 0x2E11, - 0x884B, 0x2D55, - 0x8805, 0x2C98, - 0x87BF, 0x2BDC, - 0x877B, 0x2B1F, - 0x8738, 0x2A61, - 0x86F6, 0x29A3, - 0x86B5, 0x28E5, - 0x8675, 0x2826, - 0x8637, 0x2767, - 0x85FA, 0x26A8, - 0x85BD, 0x25E8, - 0x8582, 0x2528, - 0x8549, 0x2467, - 0x8510, 0x23A6, - 0x84D9, 0x22E5, - 0x84A2, 0x2223, - 0x846D, 0x2161, - 0x843A, 0x209F, - 0x8407, 0x1FDC, - 0x83D6, 0x1F19, - 0x83A5, 0x1E56, - 0x8376, 0x1D93, - 0x8348, 0x1CCF, - 0x831C, 0x1C0B, - 0x82F0, 0x1B47, - 0x82C6, 0x1A82, - 0x829D, 0x19BD, - 0x8275, 0x18F8, - 0x824F, 0x1833, - 0x8229, 0x176D, - 0x8205, 0x16A8, - 0x81E2, 0x15E2, - 0x81C0, 0x151B, - 0x81A0, 0x1455, - 0x8180, 0x138E, - 0x8162, 0x12C8, - 0x8145, 0x1201, - 0x812A, 0x1139, - 0x810F, 0x1072, - 0x80F6, 0x0FAB, - 0x80DE, 0x0EE3, - 0x80C7, 0x0E1B, - 0x80B2, 0x0D53, - 0x809D, 0x0C8B, - 0x808A, 0x0BC3, - 0x8078, 0x0AFB, - 0x8068, 0x0A33, - 0x8058, 0x096A, - 0x804A, 0x08A2, - 0x803D, 0x07D9, - 0x8031, 0x0710, - 0x8027, 0x0647, - 0x801E, 0x057F, - 0x8016, 0x04B6, - 0x800F, 0x03ED, - 0x8009, 0x0324, - 0x8005, 0x025B, - 0x8002, 0x0192, - 0x8000, 0x00C9, - 0x8000, 0x0000, - 0x8000, 0xFF36, - 0x8002, 0xFE6D, - 0x8005, 0xFDA4, - 0x8009, 0xFCDB, - 0x800F, 0xFC12, - 0x8016, 0xFB49, - 0x801E, 0xFA80, - 0x8027, 0xF9B8, - 0x8031, 0xF8EF, - 0x803D, 0xF826, - 0x804A, 0xF75D, - 0x8058, 0xF695, - 0x8068, 0xF5CC, - 0x8078, 0xF504, - 0x808A, 0xF43C, - 0x809D, 0xF374, - 0x80B2, 0xF2AC, - 0x80C7, 0xF1E4, - 0x80DE, 0xF11C, - 0x80F6, 0xF054, - 0x810F, 0xEF8D, - 0x812A, 0xEEC6, - 0x8145, 0xEDFE, - 0x8162, 0xED37, - 0x8180, 0xEC71, - 0x81A0, 0xEBAA, - 0x81C0, 0xEAE4, - 0x81E2, 0xEA1D, - 0x8205, 0xE957, - 0x8229, 0xE892, - 0x824F, 0xE7CC, - 0x8275, 0xE707, - 0x829D, 0xE642, - 0x82C6, 0xE57D, - 0x82F0, 0xE4B8, - 0x831C, 0xE3F4, - 0x8348, 0xE330, - 0x8376, 0xE26C, - 0x83A5, 0xE1A9, - 0x83D6, 0xE0E6, - 0x8407, 0xE023, - 0x843A, 0xDF60, - 0x846D, 0xDE9E, - 0x84A2, 0xDDDC, - 0x84D9, 0xDD1A, - 0x8510, 0xDC59, - 0x8549, 0xDB98, - 0x8582, 0xDAD7, - 0x85BD, 0xDA17, - 0x85FA, 0xD957, - 0x8637, 0xD898, - 0x8675, 0xD7D9, - 0x86B5, 0xD71A, - 0x86F6, 0xD65C, - 0x8738, 0xD59E, - 0x877B, 0xD4E0, - 0x87BF, 0xD423, - 0x8805, 0xD367, - 0x884B, 0xD2AA, - 0x8893, 0xD1EE, - 0x88DC, 0xD133, - 0x8926, 0xD078, - 0x8971, 0xCFBE, - 0x89BE, 0xCF04, - 0x8A0B, 0xCE4A, - 0x8A5A, 0xCD91, - 0x8AAA, 0xCCD9, - 0x8AFB, 0xCC21, - 0x8B4D, 0xCB69, - 0x8BA0, 0xCAB2, - 0x8BF4, 0xC9FB, - 0x8C4A, 0xC945, - 0x8CA0, 0xC890, - 0x8CF8, 0xC7DB, - 0x8D50, 0xC727, - 0x8DAA, 0xC673, - 0x8E05, 0xC5BF, - 0x8E61, 0xC50D, - 0x8EBE, 0xC45A, - 0x8F1D, 0xC3A9, - 0x8F7C, 0xC2F8, - 0x8FDC, 0xC247, - 0x903E, 0xC197, - 0x90A0, 0xC0E8, - 0x9104, 0xC03A, - 0x9169, 0xBF8C, - 0x91CF, 0xBEDE, - 0x9235, 0xBE31, - 0x929D, 0xBD85, - 0x9306, 0xBCDA, - 0x9370, 0xBC2F, - 0x93DB, 0xBB85, - 0x9447, 0xBADB, - 0x94B5, 0xBA32, - 0x9523, 0xB98A, - 0x9592, 0xB8E3, - 0x9602, 0xB83C, - 0x9673, 0xB796, - 0x96E6, 0xB6F0, - 0x9759, 0xB64B, - 0x97CD, 0xB5A7, - 0x9842, 0xB504, - 0x98B9, 0xB461, - 0x9930, 0xB3C0, - 0x99A8, 0xB31E, - 0x9A22, 0xB27E, - 0x9A9C, 0xB1DE, - 0x9B17, 0xB140, - 0x9B93, 0xB0A1, - 0x9C10, 0xB004, - 0x9C8E, 0xAF68, - 0x9D0D, 0xAECC, - 0x9D8E, 0xAE31, - 0x9E0E, 0xAD96, - 0x9E90, 0xACFD, - 0x9F13, 0xAC64, - 0x9F97, 0xABCC, - 0xA01C, 0xAB35, - 0xA0A1, 0xAA9F, - 0xA128, 0xAA0A, - 0xA1AF, 0xA975, - 0xA238, 0xA8E2, - 0xA2C1, 0xA84F, - 0xA34B, 0xA7BD, - 0xA3D6, 0xA72B, - 0xA462, 0xA69B, - 0xA4EF, 0xA60C, - 0xA57D, 0xA57D, - 0xA60C, 0xA4EF, - 0xA69B, 0xA462, - 0xA72B, 0xA3D6, - 0xA7BD, 0xA34B, - 0xA84F, 0xA2C1, - 0xA8E2, 0xA238, - 0xA975, 0xA1AF, - 0xAA0A, 0xA128, - 0xAA9F, 0xA0A1, - 0xAB35, 0xA01C, - 0xABCC, 0x9F97, - 0xAC64, 0x9F13, - 0xACFD, 0x9E90, - 0xAD96, 0x9E0E, - 0xAE31, 0x9D8E, - 0xAECC, 0x9D0D, - 0xAF68, 0x9C8E, - 0xB004, 0x9C10, - 0xB0A1, 0x9B93, - 0xB140, 0x9B17, - 0xB1DE, 0x9A9C, - 0xB27E, 0x9A22, - 0xB31E, 0x99A8, - 0xB3C0, 0x9930, - 0xB461, 0x98B9, - 0xB504, 0x9842, - 0xB5A7, 0x97CD, - 0xB64B, 0x9759, - 0xB6F0, 0x96E6, - 0xB796, 0x9673, - 0xB83C, 0x9602, - 0xB8E3, 0x9592, - 0xB98A, 0x9523, - 0xBA32, 0x94B5, - 0xBADB, 0x9447, - 0xBB85, 0x93DB, - 0xBC2F, 0x9370, - 0xBCDA, 0x9306, - 0xBD85, 0x929D, - 0xBE31, 0x9235, - 0xBEDE, 0x91CF, - 0xBF8C, 0x9169, - 0xC03A, 0x9104, - 0xC0E8, 0x90A0, - 0xC197, 0x903E, - 0xC247, 0x8FDC, - 0xC2F8, 0x8F7C, - 0xC3A9, 0x8F1D, - 0xC45A, 0x8EBE, - 0xC50D, 0x8E61, - 0xC5BF, 0x8E05, - 0xC673, 0x8DAA, - 0xC727, 0x8D50, - 0xC7DB, 0x8CF8, - 0xC890, 0x8CA0, - 0xC945, 0x8C4A, - 0xC9FB, 0x8BF4, - 0xCAB2, 0x8BA0, - 0xCB69, 0x8B4D, - 0xCC21, 0x8AFB, - 0xCCD9, 0x8AAA, - 0xCD91, 0x8A5A, - 0xCE4A, 0x8A0B, - 0xCF04, 0x89BE, - 0xCFBE, 0x8971, - 0xD078, 0x8926, - 0xD133, 0x88DC, - 0xD1EE, 0x8893, - 0xD2AA, 0x884B, - 0xD367, 0x8805, - 0xD423, 0x87BF, - 0xD4E0, 0x877B, - 0xD59E, 0x8738, - 0xD65C, 0x86F6, - 0xD71A, 0x86B5, - 0xD7D9, 0x8675, - 0xD898, 0x8637, - 0xD957, 0x85FA, - 0xDA17, 0x85BD, - 0xDAD7, 0x8582, - 0xDB98, 0x8549, - 0xDC59, 0x8510, - 0xDD1A, 0x84D9, - 0xDDDC, 0x84A2, - 0xDE9E, 0x846D, - 0xDF60, 0x843A, - 0xE023, 0x8407, - 0xE0E6, 0x83D6, - 0xE1A9, 0x83A5, - 0xE26C, 0x8376, - 0xE330, 0x8348, - 0xE3F4, 0x831C, - 0xE4B8, 0x82F0, - 0xE57D, 0x82C6, - 0xE642, 0x829D, - 0xE707, 0x8275, - 0xE7CC, 0x824F, - 0xE892, 0x8229, - 0xE957, 0x8205, - 0xEA1D, 0x81E2, - 0xEAE4, 0x81C0, - 0xEBAA, 0x81A0, - 0xEC71, 0x8180, - 0xED37, 0x8162, - 0xEDFE, 0x8145, - 0xEEC6, 0x812A, - 0xEF8D, 0x810F, - 0xF054, 0x80F6, - 0xF11C, 0x80DE, - 0xF1E4, 0x80C7, - 0xF2AC, 0x80B2, - 0xF374, 0x809D, - 0xF43C, 0x808A, - 0xF504, 0x8078, - 0xF5CC, 0x8068, - 0xF695, 0x8058, - 0xF75D, 0x804A, - 0xF826, 0x803D, - 0xF8EF, 0x8031, - 0xF9B8, 0x8027, - 0xFA80, 0x801E, - 0xFB49, 0x8016, - 0xFC12, 0x800F, - 0xFCDB, 0x8009, - 0xFDA4, 0x8005, - 0xFE6D, 0x8002, - 0xFF36, 0x8000 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 2048 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_2048_q15[3072] = { - 0x7FFF, 0x0000, - 0x7FFF, 0x0064, - 0x7FFF, 0x00C9, - 0x7FFE, 0x012D, - 0x7FFD, 0x0192, - 0x7FFC, 0x01F6, - 0x7FFA, 0x025B, - 0x7FF8, 0x02BF, - 0x7FF6, 0x0324, - 0x7FF3, 0x0388, - 0x7FF0, 0x03ED, - 0x7FED, 0x0451, - 0x7FE9, 0x04B6, - 0x7FE5, 0x051A, - 0x7FE1, 0x057F, - 0x7FDD, 0x05E3, - 0x7FD8, 0x0647, - 0x7FD3, 0x06AC, - 0x7FCE, 0x0710, - 0x7FC8, 0x0775, - 0x7FC2, 0x07D9, - 0x7FBC, 0x083D, - 0x7FB5, 0x08A2, - 0x7FAE, 0x0906, - 0x7FA7, 0x096A, - 0x7F9F, 0x09CE, - 0x7F97, 0x0A33, - 0x7F8F, 0x0A97, - 0x7F87, 0x0AFB, - 0x7F7E, 0x0B5F, - 0x7F75, 0x0BC3, - 0x7F6B, 0x0C27, - 0x7F62, 0x0C8B, - 0x7F58, 0x0CEF, - 0x7F4D, 0x0D53, - 0x7F43, 0x0DB7, - 0x7F38, 0x0E1B, - 0x7F2D, 0x0E7F, - 0x7F21, 0x0EE3, - 0x7F15, 0x0F47, - 0x7F09, 0x0FAB, - 0x7EFD, 0x100E, - 0x7EF0, 0x1072, - 0x7EE3, 0x10D6, - 0x7ED5, 0x1139, - 0x7EC8, 0x119D, - 0x7EBA, 0x1201, - 0x7EAB, 0x1264, - 0x7E9D, 0x12C8, - 0x7E8E, 0x132B, - 0x7E7F, 0x138E, - 0x7E6F, 0x13F2, - 0x7E5F, 0x1455, - 0x7E4F, 0x14B8, - 0x7E3F, 0x151B, - 0x7E2E, 0x157F, - 0x7E1D, 0x15E2, - 0x7E0C, 0x1645, - 0x7DFA, 0x16A8, - 0x7DE8, 0x170A, - 0x7DD6, 0x176D, - 0x7DC3, 0x17D0, - 0x7DB0, 0x1833, - 0x7D9D, 0x1896, - 0x7D8A, 0x18F8, - 0x7D76, 0x195B, - 0x7D62, 0x19BD, - 0x7D4E, 0x1A20, - 0x7D39, 0x1A82, - 0x7D24, 0x1AE4, - 0x7D0F, 0x1B47, - 0x7CF9, 0x1BA9, - 0x7CE3, 0x1C0B, - 0x7CCD, 0x1C6D, - 0x7CB7, 0x1CCF, - 0x7CA0, 0x1D31, - 0x7C89, 0x1D93, - 0x7C71, 0x1DF5, - 0x7C5A, 0x1E56, - 0x7C42, 0x1EB8, - 0x7C29, 0x1F19, - 0x7C11, 0x1F7B, - 0x7BF8, 0x1FDC, - 0x7BDF, 0x203E, - 0x7BC5, 0x209F, - 0x7BAC, 0x2100, - 0x7B92, 0x2161, - 0x7B77, 0x21C2, - 0x7B5D, 0x2223, - 0x7B42, 0x2284, - 0x7B26, 0x22E5, - 0x7B0B, 0x2345, - 0x7AEF, 0x23A6, - 0x7AD3, 0x2407, - 0x7AB6, 0x2467, - 0x7A9A, 0x24C7, - 0x7A7D, 0x2528, - 0x7A5F, 0x2588, - 0x7A42, 0x25E8, - 0x7A24, 0x2648, - 0x7A05, 0x26A8, - 0x79E7, 0x2707, - 0x79C8, 0x2767, - 0x79A9, 0x27C7, - 0x798A, 0x2826, - 0x796A, 0x2886, - 0x794A, 0x28E5, - 0x792A, 0x2944, - 0x7909, 0x29A3, - 0x78E8, 0x2A02, - 0x78C7, 0x2A61, - 0x78A6, 0x2AC0, - 0x7884, 0x2B1F, - 0x7862, 0x2B7D, - 0x7840, 0x2BDC, - 0x781D, 0x2C3A, - 0x77FA, 0x2C98, - 0x77D7, 0x2CF7, - 0x77B4, 0x2D55, - 0x7790, 0x2DB3, - 0x776C, 0x2E11, - 0x7747, 0x2E6E, - 0x7723, 0x2ECC, - 0x76FE, 0x2F29, - 0x76D9, 0x2F87, - 0x76B3, 0x2FE4, - 0x768E, 0x3041, - 0x7668, 0x309E, - 0x7641, 0x30FB, - 0x761B, 0x3158, - 0x75F4, 0x31B5, - 0x75CC, 0x3211, - 0x75A5, 0x326E, - 0x757D, 0x32CA, - 0x7555, 0x3326, - 0x752D, 0x3382, - 0x7504, 0x33DE, - 0x74DB, 0x343A, - 0x74B2, 0x3496, - 0x7489, 0x34F2, - 0x745F, 0x354D, - 0x7435, 0x35A8, - 0x740B, 0x3604, - 0x73E0, 0x365F, - 0x73B5, 0x36BA, - 0x738A, 0x3714, - 0x735F, 0x376F, - 0x7333, 0x37CA, - 0x7307, 0x3824, - 0x72DB, 0x387E, - 0x72AF, 0x38D8, - 0x7282, 0x3932, - 0x7255, 0x398C, - 0x7227, 0x39E6, - 0x71FA, 0x3A40, - 0x71CC, 0x3A99, - 0x719E, 0x3AF2, - 0x716F, 0x3B4C, - 0x7141, 0x3BA5, - 0x7112, 0x3BFD, - 0x70E2, 0x3C56, - 0x70B3, 0x3CAF, - 0x7083, 0x3D07, - 0x7053, 0x3D60, - 0x7023, 0x3DB8, - 0x6FF2, 0x3E10, - 0x6FC1, 0x3E68, - 0x6F90, 0x3EBF, - 0x6F5F, 0x3F17, - 0x6F2D, 0x3F6E, - 0x6EFB, 0x3FC5, - 0x6EC9, 0x401D, - 0x6E96, 0x4073, - 0x6E63, 0x40CA, - 0x6E30, 0x4121, - 0x6DFD, 0x4177, - 0x6DCA, 0x41CE, - 0x6D96, 0x4224, - 0x6D62, 0x427A, - 0x6D2D, 0x42D0, - 0x6CF9, 0x4325, - 0x6CC4, 0x437B, - 0x6C8F, 0x43D0, - 0x6C59, 0x4425, - 0x6C24, 0x447A, - 0x6BEE, 0x44CF, - 0x6BB8, 0x4524, - 0x6B81, 0x4578, - 0x6B4A, 0x45CD, - 0x6B13, 0x4621, - 0x6ADC, 0x4675, - 0x6AA5, 0x46C9, - 0x6A6D, 0x471C, - 0x6A35, 0x4770, - 0x69FD, 0x47C3, - 0x69C4, 0x4816, - 0x698C, 0x4869, - 0x6953, 0x48BC, - 0x6919, 0x490F, - 0x68E0, 0x4961, - 0x68A6, 0x49B4, - 0x686C, 0x4A06, - 0x6832, 0x4A58, - 0x67F7, 0x4AA9, - 0x67BD, 0x4AFB, - 0x6782, 0x4B4C, - 0x6746, 0x4B9E, - 0x670B, 0x4BEF, - 0x66CF, 0x4C3F, - 0x6693, 0x4C90, - 0x6657, 0x4CE1, - 0x661A, 0x4D31, - 0x65DD, 0x4D81, - 0x65A0, 0x4DD1, - 0x6563, 0x4E21, - 0x6526, 0x4E70, - 0x64E8, 0x4EBF, - 0x64AA, 0x4F0F, - 0x646C, 0x4F5E, - 0x642D, 0x4FAC, - 0x63EF, 0x4FFB, - 0x63B0, 0x5049, - 0x6371, 0x5097, - 0x6331, 0x50E5, - 0x62F2, 0x5133, - 0x62B2, 0x5181, - 0x6271, 0x51CE, - 0x6231, 0x521C, - 0x61F1, 0x5269, - 0x61B0, 0x52B5, - 0x616F, 0x5302, - 0x612D, 0x534E, - 0x60EC, 0x539B, - 0x60AA, 0x53E7, - 0x6068, 0x5433, - 0x6026, 0x547E, - 0x5FE3, 0x54CA, - 0x5FA0, 0x5515, - 0x5F5E, 0x5560, - 0x5F1A, 0x55AB, - 0x5ED7, 0x55F5, - 0x5E93, 0x5640, - 0x5E50, 0x568A, - 0x5E0B, 0x56D4, - 0x5DC7, 0x571D, - 0x5D83, 0x5767, - 0x5D3E, 0x57B0, - 0x5CF9, 0x57F9, - 0x5CB4, 0x5842, - 0x5C6E, 0x588B, - 0x5C29, 0x58D4, - 0x5BE3, 0x591C, - 0x5B9D, 0x5964, - 0x5B56, 0x59AC, - 0x5B10, 0x59F3, - 0x5AC9, 0x5A3B, - 0x5A82, 0x5A82, - 0x5A3B, 0x5AC9, - 0x59F3, 0x5B10, - 0x59AC, 0x5B56, - 0x5964, 0x5B9D, - 0x591C, 0x5BE3, - 0x58D4, 0x5C29, - 0x588B, 0x5C6E, - 0x5842, 0x5CB4, - 0x57F9, 0x5CF9, - 0x57B0, 0x5D3E, - 0x5767, 0x5D83, - 0x571D, 0x5DC7, - 0x56D4, 0x5E0B, - 0x568A, 0x5E50, - 0x5640, 0x5E93, - 0x55F5, 0x5ED7, - 0x55AB, 0x5F1A, - 0x5560, 0x5F5E, - 0x5515, 0x5FA0, - 0x54CA, 0x5FE3, - 0x547E, 0x6026, - 0x5433, 0x6068, - 0x53E7, 0x60AA, - 0x539B, 0x60EC, - 0x534E, 0x612D, - 0x5302, 0x616F, - 0x52B5, 0x61B0, - 0x5269, 0x61F1, - 0x521C, 0x6231, - 0x51CE, 0x6271, - 0x5181, 0x62B2, - 0x5133, 0x62F2, - 0x50E5, 0x6331, - 0x5097, 0x6371, - 0x5049, 0x63B0, - 0x4FFB, 0x63EF, - 0x4FAC, 0x642D, - 0x4F5E, 0x646C, - 0x4F0F, 0x64AA, - 0x4EBF, 0x64E8, - 0x4E70, 0x6526, - 0x4E21, 0x6563, - 0x4DD1, 0x65A0, - 0x4D81, 0x65DD, - 0x4D31, 0x661A, - 0x4CE1, 0x6657, - 0x4C90, 0x6693, - 0x4C3F, 0x66CF, - 0x4BEF, 0x670B, - 0x4B9E, 0x6746, - 0x4B4C, 0x6782, - 0x4AFB, 0x67BD, - 0x4AA9, 0x67F7, - 0x4A58, 0x6832, - 0x4A06, 0x686C, - 0x49B4, 0x68A6, - 0x4961, 0x68E0, - 0x490F, 0x6919, - 0x48BC, 0x6953, - 0x4869, 0x698C, - 0x4816, 0x69C4, - 0x47C3, 0x69FD, - 0x4770, 0x6A35, - 0x471C, 0x6A6D, - 0x46C9, 0x6AA5, - 0x4675, 0x6ADC, - 0x4621, 0x6B13, - 0x45CD, 0x6B4A, - 0x4578, 0x6B81, - 0x4524, 0x6BB8, - 0x44CF, 0x6BEE, - 0x447A, 0x6C24, - 0x4425, 0x6C59, - 0x43D0, 0x6C8F, - 0x437B, 0x6CC4, - 0x4325, 0x6CF9, - 0x42D0, 0x6D2D, - 0x427A, 0x6D62, - 0x4224, 0x6D96, - 0x41CE, 0x6DCA, - 0x4177, 0x6DFD, - 0x4121, 0x6E30, - 0x40CA, 0x6E63, - 0x4073, 0x6E96, - 0x401D, 0x6EC9, - 0x3FC5, 0x6EFB, - 0x3F6E, 0x6F2D, - 0x3F17, 0x6F5F, - 0x3EBF, 0x6F90, - 0x3E68, 0x6FC1, - 0x3E10, 0x6FF2, - 0x3DB8, 0x7023, - 0x3D60, 0x7053, - 0x3D07, 0x7083, - 0x3CAF, 0x70B3, - 0x3C56, 0x70E2, - 0x3BFD, 0x7112, - 0x3BA5, 0x7141, - 0x3B4C, 0x716F, - 0x3AF2, 0x719E, - 0x3A99, 0x71CC, - 0x3A40, 0x71FA, - 0x39E6, 0x7227, - 0x398C, 0x7255, - 0x3932, 0x7282, - 0x38D8, 0x72AF, - 0x387E, 0x72DB, - 0x3824, 0x7307, - 0x37CA, 0x7333, - 0x376F, 0x735F, - 0x3714, 0x738A, - 0x36BA, 0x73B5, - 0x365F, 0x73E0, - 0x3604, 0x740B, - 0x35A8, 0x7435, - 0x354D, 0x745F, - 0x34F2, 0x7489, - 0x3496, 0x74B2, - 0x343A, 0x74DB, - 0x33DE, 0x7504, - 0x3382, 0x752D, - 0x3326, 0x7555, - 0x32CA, 0x757D, - 0x326E, 0x75A5, - 0x3211, 0x75CC, - 0x31B5, 0x75F4, - 0x3158, 0x761B, - 0x30FB, 0x7641, - 0x309E, 0x7668, - 0x3041, 0x768E, - 0x2FE4, 0x76B3, - 0x2F87, 0x76D9, - 0x2F29, 0x76FE, - 0x2ECC, 0x7723, - 0x2E6E, 0x7747, - 0x2E11, 0x776C, - 0x2DB3, 0x7790, - 0x2D55, 0x77B4, - 0x2CF7, 0x77D7, - 0x2C98, 0x77FA, - 0x2C3A, 0x781D, - 0x2BDC, 0x7840, - 0x2B7D, 0x7862, - 0x2B1F, 0x7884, - 0x2AC0, 0x78A6, - 0x2A61, 0x78C7, - 0x2A02, 0x78E8, - 0x29A3, 0x7909, - 0x2944, 0x792A, - 0x28E5, 0x794A, - 0x2886, 0x796A, - 0x2826, 0x798A, - 0x27C7, 0x79A9, - 0x2767, 0x79C8, - 0x2707, 0x79E7, - 0x26A8, 0x7A05, - 0x2648, 0x7A24, - 0x25E8, 0x7A42, - 0x2588, 0x7A5F, - 0x2528, 0x7A7D, - 0x24C7, 0x7A9A, - 0x2467, 0x7AB6, - 0x2407, 0x7AD3, - 0x23A6, 0x7AEF, - 0x2345, 0x7B0B, - 0x22E5, 0x7B26, - 0x2284, 0x7B42, - 0x2223, 0x7B5D, - 0x21C2, 0x7B77, - 0x2161, 0x7B92, - 0x2100, 0x7BAC, - 0x209F, 0x7BC5, - 0x203E, 0x7BDF, - 0x1FDC, 0x7BF8, - 0x1F7B, 0x7C11, - 0x1F19, 0x7C29, - 0x1EB8, 0x7C42, - 0x1E56, 0x7C5A, - 0x1DF5, 0x7C71, - 0x1D93, 0x7C89, - 0x1D31, 0x7CA0, - 0x1CCF, 0x7CB7, - 0x1C6D, 0x7CCD, - 0x1C0B, 0x7CE3, - 0x1BA9, 0x7CF9, - 0x1B47, 0x7D0F, - 0x1AE4, 0x7D24, - 0x1A82, 0x7D39, - 0x1A20, 0x7D4E, - 0x19BD, 0x7D62, - 0x195B, 0x7D76, - 0x18F8, 0x7D8A, - 0x1896, 0x7D9D, - 0x1833, 0x7DB0, - 0x17D0, 0x7DC3, - 0x176D, 0x7DD6, - 0x170A, 0x7DE8, - 0x16A8, 0x7DFA, - 0x1645, 0x7E0C, - 0x15E2, 0x7E1D, - 0x157F, 0x7E2E, - 0x151B, 0x7E3F, - 0x14B8, 0x7E4F, - 0x1455, 0x7E5F, - 0x13F2, 0x7E6F, - 0x138E, 0x7E7F, - 0x132B, 0x7E8E, - 0x12C8, 0x7E9D, - 0x1264, 0x7EAB, - 0x1201, 0x7EBA, - 0x119D, 0x7EC8, - 0x1139, 0x7ED5, - 0x10D6, 0x7EE3, - 0x1072, 0x7EF0, - 0x100E, 0x7EFD, - 0x0FAB, 0x7F09, - 0x0F47, 0x7F15, - 0x0EE3, 0x7F21, - 0x0E7F, 0x7F2D, - 0x0E1B, 0x7F38, - 0x0DB7, 0x7F43, - 0x0D53, 0x7F4D, - 0x0CEF, 0x7F58, - 0x0C8B, 0x7F62, - 0x0C27, 0x7F6B, - 0x0BC3, 0x7F75, - 0x0B5F, 0x7F7E, - 0x0AFB, 0x7F87, - 0x0A97, 0x7F8F, - 0x0A33, 0x7F97, - 0x09CE, 0x7F9F, - 0x096A, 0x7FA7, - 0x0906, 0x7FAE, - 0x08A2, 0x7FB5, - 0x083D, 0x7FBC, - 0x07D9, 0x7FC2, - 0x0775, 0x7FC8, - 0x0710, 0x7FCE, - 0x06AC, 0x7FD3, - 0x0647, 0x7FD8, - 0x05E3, 0x7FDD, - 0x057F, 0x7FE1, - 0x051A, 0x7FE5, - 0x04B6, 0x7FE9, - 0x0451, 0x7FED, - 0x03ED, 0x7FF0, - 0x0388, 0x7FF3, - 0x0324, 0x7FF6, - 0x02BF, 0x7FF8, - 0x025B, 0x7FFA, - 0x01F6, 0x7FFC, - 0x0192, 0x7FFD, - 0x012D, 0x7FFE, - 0x00C9, 0x7FFF, - 0x0064, 0x7FFF, - 0x0000, 0x7FFF, - 0xFF9B, 0x7FFF, - 0xFF36, 0x7FFF, - 0xFED2, 0x7FFE, - 0xFE6D, 0x7FFD, - 0xFE09, 0x7FFC, - 0xFDA4, 0x7FFA, - 0xFD40, 0x7FF8, - 0xFCDB, 0x7FF6, - 0xFC77, 0x7FF3, - 0xFC12, 0x7FF0, - 0xFBAE, 0x7FED, - 0xFB49, 0x7FE9, - 0xFAE5, 0x7FE5, - 0xFA80, 0x7FE1, - 0xFA1C, 0x7FDD, - 0xF9B8, 0x7FD8, - 0xF953, 0x7FD3, - 0xF8EF, 0x7FCE, - 0xF88A, 0x7FC8, - 0xF826, 0x7FC2, - 0xF7C2, 0x7FBC, - 0xF75D, 0x7FB5, - 0xF6F9, 0x7FAE, - 0xF695, 0x7FA7, - 0xF631, 0x7F9F, - 0xF5CC, 0x7F97, - 0xF568, 0x7F8F, - 0xF504, 0x7F87, - 0xF4A0, 0x7F7E, - 0xF43C, 0x7F75, - 0xF3D8, 0x7F6B, - 0xF374, 0x7F62, - 0xF310, 0x7F58, - 0xF2AC, 0x7F4D, - 0xF248, 0x7F43, - 0xF1E4, 0x7F38, - 0xF180, 0x7F2D, - 0xF11C, 0x7F21, - 0xF0B8, 0x7F15, - 0xF054, 0x7F09, - 0xEFF1, 0x7EFD, - 0xEF8D, 0x7EF0, - 0xEF29, 0x7EE3, - 0xEEC6, 0x7ED5, - 0xEE62, 0x7EC8, - 0xEDFE, 0x7EBA, - 0xED9B, 0x7EAB, - 0xED37, 0x7E9D, - 0xECD4, 0x7E8E, - 0xEC71, 0x7E7F, - 0xEC0D, 0x7E6F, - 0xEBAA, 0x7E5F, - 0xEB47, 0x7E4F, - 0xEAE4, 0x7E3F, - 0xEA80, 0x7E2E, - 0xEA1D, 0x7E1D, - 0xE9BA, 0x7E0C, - 0xE957, 0x7DFA, - 0xE8F5, 0x7DE8, - 0xE892, 0x7DD6, - 0xE82F, 0x7DC3, - 0xE7CC, 0x7DB0, - 0xE769, 0x7D9D, - 0xE707, 0x7D8A, - 0xE6A4, 0x7D76, - 0xE642, 0x7D62, - 0xE5DF, 0x7D4E, - 0xE57D, 0x7D39, - 0xE51B, 0x7D24, - 0xE4B8, 0x7D0F, - 0xE456, 0x7CF9, - 0xE3F4, 0x7CE3, - 0xE392, 0x7CCD, - 0xE330, 0x7CB7, - 0xE2CE, 0x7CA0, - 0xE26C, 0x7C89, - 0xE20A, 0x7C71, - 0xE1A9, 0x7C5A, - 0xE147, 0x7C42, - 0xE0E6, 0x7C29, - 0xE084, 0x7C11, - 0xE023, 0x7BF8, - 0xDFC1, 0x7BDF, - 0xDF60, 0x7BC5, - 0xDEFF, 0x7BAC, - 0xDE9E, 0x7B92, - 0xDE3D, 0x7B77, - 0xDDDC, 0x7B5D, - 0xDD7B, 0x7B42, - 0xDD1A, 0x7B26, - 0xDCBA, 0x7B0B, - 0xDC59, 0x7AEF, - 0xDBF8, 0x7AD3, - 0xDB98, 0x7AB6, - 0xDB38, 0x7A9A, - 0xDAD7, 0x7A7D, - 0xDA77, 0x7A5F, - 0xDA17, 0x7A42, - 0xD9B7, 0x7A24, - 0xD957, 0x7A05, - 0xD8F8, 0x79E7, - 0xD898, 0x79C8, - 0xD838, 0x79A9, - 0xD7D9, 0x798A, - 0xD779, 0x796A, - 0xD71A, 0x794A, - 0xD6BB, 0x792A, - 0xD65C, 0x7909, - 0xD5FD, 0x78E8, - 0xD59E, 0x78C7, - 0xD53F, 0x78A6, - 0xD4E0, 0x7884, - 0xD482, 0x7862, - 0xD423, 0x7840, - 0xD3C5, 0x781D, - 0xD367, 0x77FA, - 0xD308, 0x77D7, - 0xD2AA, 0x77B4, - 0xD24C, 0x7790, - 0xD1EE, 0x776C, - 0xD191, 0x7747, - 0xD133, 0x7723, - 0xD0D6, 0x76FE, - 0xD078, 0x76D9, - 0xD01B, 0x76B3, - 0xCFBE, 0x768E, - 0xCF61, 0x7668, - 0xCF04, 0x7641, - 0xCEA7, 0x761B, - 0xCE4A, 0x75F4, - 0xCDEE, 0x75CC, - 0xCD91, 0x75A5, - 0xCD35, 0x757D, - 0xCCD9, 0x7555, - 0xCC7D, 0x752D, - 0xCC21, 0x7504, - 0xCBC5, 0x74DB, - 0xCB69, 0x74B2, - 0xCB0D, 0x7489, - 0xCAB2, 0x745F, - 0xCA57, 0x7435, - 0xC9FB, 0x740B, - 0xC9A0, 0x73E0, - 0xC945, 0x73B5, - 0xC8EB, 0x738A, - 0xC890, 0x735F, - 0xC835, 0x7333, - 0xC7DB, 0x7307, - 0xC781, 0x72DB, - 0xC727, 0x72AF, - 0xC6CD, 0x7282, - 0xC673, 0x7255, - 0xC619, 0x7227, - 0xC5BF, 0x71FA, - 0xC566, 0x71CC, - 0xC50D, 0x719E, - 0xC4B3, 0x716F, - 0xC45A, 0x7141, - 0xC402, 0x7112, - 0xC3A9, 0x70E2, - 0xC350, 0x70B3, - 0xC2F8, 0x7083, - 0xC29F, 0x7053, - 0xC247, 0x7023, - 0xC1EF, 0x6FF2, - 0xC197, 0x6FC1, - 0xC140, 0x6F90, - 0xC0E8, 0x6F5F, - 0xC091, 0x6F2D, - 0xC03A, 0x6EFB, - 0xBFE2, 0x6EC9, - 0xBF8C, 0x6E96, - 0xBF35, 0x6E63, - 0xBEDE, 0x6E30, - 0xBE88, 0x6DFD, - 0xBE31, 0x6DCA, - 0xBDDB, 0x6D96, - 0xBD85, 0x6D62, - 0xBD2F, 0x6D2D, - 0xBCDA, 0x6CF9, - 0xBC84, 0x6CC4, - 0xBC2F, 0x6C8F, - 0xBBDA, 0x6C59, - 0xBB85, 0x6C24, - 0xBB30, 0x6BEE, - 0xBADB, 0x6BB8, - 0xBA87, 0x6B81, - 0xBA32, 0x6B4A, - 0xB9DE, 0x6B13, - 0xB98A, 0x6ADC, - 0xB936, 0x6AA5, - 0xB8E3, 0x6A6D, - 0xB88F, 0x6A35, - 0xB83C, 0x69FD, - 0xB7E9, 0x69C4, - 0xB796, 0x698C, - 0xB743, 0x6953, - 0xB6F0, 0x6919, - 0xB69E, 0x68E0, - 0xB64B, 0x68A6, - 0xB5F9, 0x686C, - 0xB5A7, 0x6832, - 0xB556, 0x67F7, - 0xB504, 0x67BD, - 0xB4B3, 0x6782, - 0xB461, 0x6746, - 0xB410, 0x670B, - 0xB3C0, 0x66CF, - 0xB36F, 0x6693, - 0xB31E, 0x6657, - 0xB2CE, 0x661A, - 0xB27E, 0x65DD, - 0xB22E, 0x65A0, - 0xB1DE, 0x6563, - 0xB18F, 0x6526, - 0xB140, 0x64E8, - 0xB0F0, 0x64AA, - 0xB0A1, 0x646C, - 0xB053, 0x642D, - 0xB004, 0x63EF, - 0xAFB6, 0x63B0, - 0xAF68, 0x6371, - 0xAF1A, 0x6331, - 0xAECC, 0x62F2, - 0xAE7E, 0x62B2, - 0xAE31, 0x6271, - 0xADE3, 0x6231, - 0xAD96, 0x61F1, - 0xAD4A, 0x61B0, - 0xACFD, 0x616F, - 0xACB1, 0x612D, - 0xAC64, 0x60EC, - 0xAC18, 0x60AA, - 0xABCC, 0x6068, - 0xAB81, 0x6026, - 0xAB35, 0x5FE3, - 0xAAEA, 0x5FA0, - 0xAA9F, 0x5F5E, - 0xAA54, 0x5F1A, - 0xAA0A, 0x5ED7, - 0xA9BF, 0x5E93, - 0xA975, 0x5E50, - 0xA92B, 0x5E0B, - 0xA8E2, 0x5DC7, - 0xA898, 0x5D83, - 0xA84F, 0x5D3E, - 0xA806, 0x5CF9, - 0xA7BD, 0x5CB4, - 0xA774, 0x5C6E, - 0xA72B, 0x5C29, - 0xA6E3, 0x5BE3, - 0xA69B, 0x5B9D, - 0xA653, 0x5B56, - 0xA60C, 0x5B10, - 0xA5C4, 0x5AC9, - 0xA57D, 0x5A82, - 0xA536, 0x5A3B, - 0xA4EF, 0x59F3, - 0xA4A9, 0x59AC, - 0xA462, 0x5964, - 0xA41C, 0x591C, - 0xA3D6, 0x58D4, - 0xA391, 0x588B, - 0xA34B, 0x5842, - 0xA306, 0x57F9, - 0xA2C1, 0x57B0, - 0xA27C, 0x5767, - 0xA238, 0x571D, - 0xA1F4, 0x56D4, - 0xA1AF, 0x568A, - 0xA16C, 0x5640, - 0xA128, 0x55F5, - 0xA0E5, 0x55AB, - 0xA0A1, 0x5560, - 0xA05F, 0x5515, - 0xA01C, 0x54CA, - 0x9FD9, 0x547E, - 0x9F97, 0x5433, - 0x9F55, 0x53E7, - 0x9F13, 0x539B, - 0x9ED2, 0x534E, - 0x9E90, 0x5302, - 0x9E4F, 0x52B5, - 0x9E0E, 0x5269, - 0x9DCE, 0x521C, - 0x9D8E, 0x51CE, - 0x9D4D, 0x5181, - 0x9D0D, 0x5133, - 0x9CCE, 0x50E5, - 0x9C8E, 0x5097, - 0x9C4F, 0x5049, - 0x9C10, 0x4FFB, - 0x9BD2, 0x4FAC, - 0x9B93, 0x4F5E, - 0x9B55, 0x4F0F, - 0x9B17, 0x4EBF, - 0x9AD9, 0x4E70, - 0x9A9C, 0x4E21, - 0x9A5F, 0x4DD1, - 0x9A22, 0x4D81, - 0x99E5, 0x4D31, - 0x99A8, 0x4CE1, - 0x996C, 0x4C90, - 0x9930, 0x4C3F, - 0x98F4, 0x4BEF, - 0x98B9, 0x4B9E, - 0x987D, 0x4B4C, - 0x9842, 0x4AFB, - 0x9808, 0x4AA9, - 0x97CD, 0x4A58, - 0x9793, 0x4A06, - 0x9759, 0x49B4, - 0x971F, 0x4961, - 0x96E6, 0x490F, - 0x96AC, 0x48BC, - 0x9673, 0x4869, - 0x963B, 0x4816, - 0x9602, 0x47C3, - 0x95CA, 0x4770, - 0x9592, 0x471C, - 0x955A, 0x46C9, - 0x9523, 0x4675, - 0x94EC, 0x4621, - 0x94B5, 0x45CD, - 0x947E, 0x4578, - 0x9447, 0x4524, - 0x9411, 0x44CF, - 0x93DB, 0x447A, - 0x93A6, 0x4425, - 0x9370, 0x43D0, - 0x933B, 0x437B, - 0x9306, 0x4325, - 0x92D2, 0x42D0, - 0x929D, 0x427A, - 0x9269, 0x4224, - 0x9235, 0x41CE, - 0x9202, 0x4177, - 0x91CF, 0x4121, - 0x919C, 0x40CA, - 0x9169, 0x4073, - 0x9136, 0x401D, - 0x9104, 0x3FC5, - 0x90D2, 0x3F6E, - 0x90A0, 0x3F17, - 0x906F, 0x3EBF, - 0x903E, 0x3E68, - 0x900D, 0x3E10, - 0x8FDC, 0x3DB8, - 0x8FAC, 0x3D60, - 0x8F7C, 0x3D07, - 0x8F4C, 0x3CAF, - 0x8F1D, 0x3C56, - 0x8EED, 0x3BFD, - 0x8EBE, 0x3BA5, - 0x8E90, 0x3B4C, - 0x8E61, 0x3AF2, - 0x8E33, 0x3A99, - 0x8E05, 0x3A40, - 0x8DD8, 0x39E6, - 0x8DAA, 0x398C, - 0x8D7D, 0x3932, - 0x8D50, 0x38D8, - 0x8D24, 0x387E, - 0x8CF8, 0x3824, - 0x8CCC, 0x37CA, - 0x8CA0, 0x376F, - 0x8C75, 0x3714, - 0x8C4A, 0x36BA, - 0x8C1F, 0x365F, - 0x8BF4, 0x3604, - 0x8BCA, 0x35A8, - 0x8BA0, 0x354D, - 0x8B76, 0x34F2, - 0x8B4D, 0x3496, - 0x8B24, 0x343A, - 0x8AFB, 0x33DE, - 0x8AD2, 0x3382, - 0x8AAA, 0x3326, - 0x8A82, 0x32CA, - 0x8A5A, 0x326E, - 0x8A33, 0x3211, - 0x8A0B, 0x31B5, - 0x89E4, 0x3158, - 0x89BE, 0x30FB, - 0x8997, 0x309E, - 0x8971, 0x3041, - 0x894C, 0x2FE4, - 0x8926, 0x2F87, - 0x8901, 0x2F29, - 0x88DC, 0x2ECC, - 0x88B8, 0x2E6E, - 0x8893, 0x2E11, - 0x886F, 0x2DB3, - 0x884B, 0x2D55, - 0x8828, 0x2CF7, - 0x8805, 0x2C98, - 0x87E2, 0x2C3A, - 0x87BF, 0x2BDC, - 0x879D, 0x2B7D, - 0x877B, 0x2B1F, - 0x8759, 0x2AC0, - 0x8738, 0x2A61, - 0x8717, 0x2A02, - 0x86F6, 0x29A3, - 0x86D5, 0x2944, - 0x86B5, 0x28E5, - 0x8695, 0x2886, - 0x8675, 0x2826, - 0x8656, 0x27C7, - 0x8637, 0x2767, - 0x8618, 0x2707, - 0x85FA, 0x26A8, - 0x85DB, 0x2648, - 0x85BD, 0x25E8, - 0x85A0, 0x2588, - 0x8582, 0x2528, - 0x8565, 0x24C7, - 0x8549, 0x2467, - 0x852C, 0x2407, - 0x8510, 0x23A6, - 0x84F4, 0x2345, - 0x84D9, 0x22E5, - 0x84BD, 0x2284, - 0x84A2, 0x2223, - 0x8488, 0x21C2, - 0x846D, 0x2161, - 0x8453, 0x2100, - 0x843A, 0x209F, - 0x8420, 0x203E, - 0x8407, 0x1FDC, - 0x83EE, 0x1F7B, - 0x83D6, 0x1F19, - 0x83BD, 0x1EB8, - 0x83A5, 0x1E56, - 0x838E, 0x1DF5, - 0x8376, 0x1D93, - 0x835F, 0x1D31, - 0x8348, 0x1CCF, - 0x8332, 0x1C6D, - 0x831C, 0x1C0B, - 0x8306, 0x1BA9, - 0x82F0, 0x1B47, - 0x82DB, 0x1AE4, - 0x82C6, 0x1A82, - 0x82B1, 0x1A20, - 0x829D, 0x19BD, - 0x8289, 0x195B, - 0x8275, 0x18F8, - 0x8262, 0x1896, - 0x824F, 0x1833, - 0x823C, 0x17D0, - 0x8229, 0x176D, - 0x8217, 0x170A, - 0x8205, 0x16A8, - 0x81F3, 0x1645, - 0x81E2, 0x15E2, - 0x81D1, 0x157F, - 0x81C0, 0x151B, - 0x81B0, 0x14B8, - 0x81A0, 0x1455, - 0x8190, 0x13F2, - 0x8180, 0x138E, - 0x8171, 0x132B, - 0x8162, 0x12C8, - 0x8154, 0x1264, - 0x8145, 0x1201, - 0x8137, 0x119D, - 0x812A, 0x1139, - 0x811C, 0x10D6, - 0x810F, 0x1072, - 0x8102, 0x100E, - 0x80F6, 0x0FAB, - 0x80EA, 0x0F47, - 0x80DE, 0x0EE3, - 0x80D2, 0x0E7F, - 0x80C7, 0x0E1B, - 0x80BC, 0x0DB7, - 0x80B2, 0x0D53, - 0x80A7, 0x0CEF, - 0x809D, 0x0C8B, - 0x8094, 0x0C27, - 0x808A, 0x0BC3, - 0x8081, 0x0B5F, - 0x8078, 0x0AFB, - 0x8070, 0x0A97, - 0x8068, 0x0A33, - 0x8060, 0x09CE, - 0x8058, 0x096A, - 0x8051, 0x0906, - 0x804A, 0x08A2, - 0x8043, 0x083D, - 0x803D, 0x07D9, - 0x8037, 0x0775, - 0x8031, 0x0710, - 0x802C, 0x06AC, - 0x8027, 0x0647, - 0x8022, 0x05E3, - 0x801E, 0x057F, - 0x801A, 0x051A, - 0x8016, 0x04B6, - 0x8012, 0x0451, - 0x800F, 0x03ED, - 0x800C, 0x0388, - 0x8009, 0x0324, - 0x8007, 0x02BF, - 0x8005, 0x025B, - 0x8003, 0x01F6, - 0x8002, 0x0192, - 0x8001, 0x012D, - 0x8000, 0x00C9, - 0x8000, 0x0064, - 0x8000, 0x0000, - 0x8000, 0xFF9B, - 0x8000, 0xFF36, - 0x8001, 0xFED2, - 0x8002, 0xFE6D, - 0x8003, 0xFE09, - 0x8005, 0xFDA4, - 0x8007, 0xFD40, - 0x8009, 0xFCDB, - 0x800C, 0xFC77, - 0x800F, 0xFC12, - 0x8012, 0xFBAE, - 0x8016, 0xFB49, - 0x801A, 0xFAE5, - 0x801E, 0xFA80, - 0x8022, 0xFA1C, - 0x8027, 0xF9B8, - 0x802C, 0xF953, - 0x8031, 0xF8EF, - 0x8037, 0xF88A, - 0x803D, 0xF826, - 0x8043, 0xF7C2, - 0x804A, 0xF75D, - 0x8051, 0xF6F9, - 0x8058, 0xF695, - 0x8060, 0xF631, - 0x8068, 0xF5CC, - 0x8070, 0xF568, - 0x8078, 0xF504, - 0x8081, 0xF4A0, - 0x808A, 0xF43C, - 0x8094, 0xF3D8, - 0x809D, 0xF374, - 0x80A7, 0xF310, - 0x80B2, 0xF2AC, - 0x80BC, 0xF248, - 0x80C7, 0xF1E4, - 0x80D2, 0xF180, - 0x80DE, 0xF11C, - 0x80EA, 0xF0B8, - 0x80F6, 0xF054, - 0x8102, 0xEFF1, - 0x810F, 0xEF8D, - 0x811C, 0xEF29, - 0x812A, 0xEEC6, - 0x8137, 0xEE62, - 0x8145, 0xEDFE, - 0x8154, 0xED9B, - 0x8162, 0xED37, - 0x8171, 0xECD4, - 0x8180, 0xEC71, - 0x8190, 0xEC0D, - 0x81A0, 0xEBAA, - 0x81B0, 0xEB47, - 0x81C0, 0xEAE4, - 0x81D1, 0xEA80, - 0x81E2, 0xEA1D, - 0x81F3, 0xE9BA, - 0x8205, 0xE957, - 0x8217, 0xE8F5, - 0x8229, 0xE892, - 0x823C, 0xE82F, - 0x824F, 0xE7CC, - 0x8262, 0xE769, - 0x8275, 0xE707, - 0x8289, 0xE6A4, - 0x829D, 0xE642, - 0x82B1, 0xE5DF, - 0x82C6, 0xE57D, - 0x82DB, 0xE51B, - 0x82F0, 0xE4B8, - 0x8306, 0xE456, - 0x831C, 0xE3F4, - 0x8332, 0xE392, - 0x8348, 0xE330, - 0x835F, 0xE2CE, - 0x8376, 0xE26C, - 0x838E, 0xE20A, - 0x83A5, 0xE1A9, - 0x83BD, 0xE147, - 0x83D6, 0xE0E6, - 0x83EE, 0xE084, - 0x8407, 0xE023, - 0x8420, 0xDFC1, - 0x843A, 0xDF60, - 0x8453, 0xDEFF, - 0x846D, 0xDE9E, - 0x8488, 0xDE3D, - 0x84A2, 0xDDDC, - 0x84BD, 0xDD7B, - 0x84D9, 0xDD1A, - 0x84F4, 0xDCBA, - 0x8510, 0xDC59, - 0x852C, 0xDBF8, - 0x8549, 0xDB98, - 0x8565, 0xDB38, - 0x8582, 0xDAD7, - 0x85A0, 0xDA77, - 0x85BD, 0xDA17, - 0x85DB, 0xD9B7, - 0x85FA, 0xD957, - 0x8618, 0xD8F8, - 0x8637, 0xD898, - 0x8656, 0xD838, - 0x8675, 0xD7D9, - 0x8695, 0xD779, - 0x86B5, 0xD71A, - 0x86D5, 0xD6BB, - 0x86F6, 0xD65C, - 0x8717, 0xD5FD, - 0x8738, 0xD59E, - 0x8759, 0xD53F, - 0x877B, 0xD4E0, - 0x879D, 0xD482, - 0x87BF, 0xD423, - 0x87E2, 0xD3C5, - 0x8805, 0xD367, - 0x8828, 0xD308, - 0x884B, 0xD2AA, - 0x886F, 0xD24C, - 0x8893, 0xD1EE, - 0x88B8, 0xD191, - 0x88DC, 0xD133, - 0x8901, 0xD0D6, - 0x8926, 0xD078, - 0x894C, 0xD01B, - 0x8971, 0xCFBE, - 0x8997, 0xCF61, - 0x89BE, 0xCF04, - 0x89E4, 0xCEA7, - 0x8A0B, 0xCE4A, - 0x8A33, 0xCDEE, - 0x8A5A, 0xCD91, - 0x8A82, 0xCD35, - 0x8AAA, 0xCCD9, - 0x8AD2, 0xCC7D, - 0x8AFB, 0xCC21, - 0x8B24, 0xCBC5, - 0x8B4D, 0xCB69, - 0x8B76, 0xCB0D, - 0x8BA0, 0xCAB2, - 0x8BCA, 0xCA57, - 0x8BF4, 0xC9FB, - 0x8C1F, 0xC9A0, - 0x8C4A, 0xC945, - 0x8C75, 0xC8EB, - 0x8CA0, 0xC890, - 0x8CCC, 0xC835, - 0x8CF8, 0xC7DB, - 0x8D24, 0xC781, - 0x8D50, 0xC727, - 0x8D7D, 0xC6CD, - 0x8DAA, 0xC673, - 0x8DD8, 0xC619, - 0x8E05, 0xC5BF, - 0x8E33, 0xC566, - 0x8E61, 0xC50D, - 0x8E90, 0xC4B3, - 0x8EBE, 0xC45A, - 0x8EED, 0xC402, - 0x8F1D, 0xC3A9, - 0x8F4C, 0xC350, - 0x8F7C, 0xC2F8, - 0x8FAC, 0xC29F, - 0x8FDC, 0xC247, - 0x900D, 0xC1EF, - 0x903E, 0xC197, - 0x906F, 0xC140, - 0x90A0, 0xC0E8, - 0x90D2, 0xC091, - 0x9104, 0xC03A, - 0x9136, 0xBFE2, - 0x9169, 0xBF8C, - 0x919C, 0xBF35, - 0x91CF, 0xBEDE, - 0x9202, 0xBE88, - 0x9235, 0xBE31, - 0x9269, 0xBDDB, - 0x929D, 0xBD85, - 0x92D2, 0xBD2F, - 0x9306, 0xBCDA, - 0x933B, 0xBC84, - 0x9370, 0xBC2F, - 0x93A6, 0xBBDA, - 0x93DB, 0xBB85, - 0x9411, 0xBB30, - 0x9447, 0xBADB, - 0x947E, 0xBA87, - 0x94B5, 0xBA32, - 0x94EC, 0xB9DE, - 0x9523, 0xB98A, - 0x955A, 0xB936, - 0x9592, 0xB8E3, - 0x95CA, 0xB88F, - 0x9602, 0xB83C, - 0x963B, 0xB7E9, - 0x9673, 0xB796, - 0x96AC, 0xB743, - 0x96E6, 0xB6F0, - 0x971F, 0xB69E, - 0x9759, 0xB64B, - 0x9793, 0xB5F9, - 0x97CD, 0xB5A7, - 0x9808, 0xB556, - 0x9842, 0xB504, - 0x987D, 0xB4B3, - 0x98B9, 0xB461, - 0x98F4, 0xB410, - 0x9930, 0xB3C0, - 0x996C, 0xB36F, - 0x99A8, 0xB31E, - 0x99E5, 0xB2CE, - 0x9A22, 0xB27E, - 0x9A5F, 0xB22E, - 0x9A9C, 0xB1DE, - 0x9AD9, 0xB18F, - 0x9B17, 0xB140, - 0x9B55, 0xB0F0, - 0x9B93, 0xB0A1, - 0x9BD2, 0xB053, - 0x9C10, 0xB004, - 0x9C4F, 0xAFB6, - 0x9C8E, 0xAF68, - 0x9CCE, 0xAF1A, - 0x9D0D, 0xAECC, - 0x9D4D, 0xAE7E, - 0x9D8E, 0xAE31, - 0x9DCE, 0xADE3, - 0x9E0E, 0xAD96, - 0x9E4F, 0xAD4A, - 0x9E90, 0xACFD, - 0x9ED2, 0xACB1, - 0x9F13, 0xAC64, - 0x9F55, 0xAC18, - 0x9F97, 0xABCC, - 0x9FD9, 0xAB81, - 0xA01C, 0xAB35, - 0xA05F, 0xAAEA, - 0xA0A1, 0xAA9F, - 0xA0E5, 0xAA54, - 0xA128, 0xAA0A, - 0xA16C, 0xA9BF, - 0xA1AF, 0xA975, - 0xA1F4, 0xA92B, - 0xA238, 0xA8E2, - 0xA27C, 0xA898, - 0xA2C1, 0xA84F, - 0xA306, 0xA806, - 0xA34B, 0xA7BD, - 0xA391, 0xA774, - 0xA3D6, 0xA72B, - 0xA41C, 0xA6E3, - 0xA462, 0xA69B, - 0xA4A9, 0xA653, - 0xA4EF, 0xA60C, - 0xA536, 0xA5C4, - 0xA57D, 0xA57D, - 0xA5C4, 0xA536, - 0xA60C, 0xA4EF, - 0xA653, 0xA4A9, - 0xA69B, 0xA462, - 0xA6E3, 0xA41C, - 0xA72B, 0xA3D6, - 0xA774, 0xA391, - 0xA7BD, 0xA34B, - 0xA806, 0xA306, - 0xA84F, 0xA2C1, - 0xA898, 0xA27C, - 0xA8E2, 0xA238, - 0xA92B, 0xA1F4, - 0xA975, 0xA1AF, - 0xA9BF, 0xA16C, - 0xAA0A, 0xA128, - 0xAA54, 0xA0E5, - 0xAA9F, 0xA0A1, - 0xAAEA, 0xA05F, - 0xAB35, 0xA01C, - 0xAB81, 0x9FD9, - 0xABCC, 0x9F97, - 0xAC18, 0x9F55, - 0xAC64, 0x9F13, - 0xACB1, 0x9ED2, - 0xACFD, 0x9E90, - 0xAD4A, 0x9E4F, - 0xAD96, 0x9E0E, - 0xADE3, 0x9DCE, - 0xAE31, 0x9D8E, - 0xAE7E, 0x9D4D, - 0xAECC, 0x9D0D, - 0xAF1A, 0x9CCE, - 0xAF68, 0x9C8E, - 0xAFB6, 0x9C4F, - 0xB004, 0x9C10, - 0xB053, 0x9BD2, - 0xB0A1, 0x9B93, - 0xB0F0, 0x9B55, - 0xB140, 0x9B17, - 0xB18F, 0x9AD9, - 0xB1DE, 0x9A9C, - 0xB22E, 0x9A5F, - 0xB27E, 0x9A22, - 0xB2CE, 0x99E5, - 0xB31E, 0x99A8, - 0xB36F, 0x996C, - 0xB3C0, 0x9930, - 0xB410, 0x98F4, - 0xB461, 0x98B9, - 0xB4B3, 0x987D, - 0xB504, 0x9842, - 0xB556, 0x9808, - 0xB5A7, 0x97CD, - 0xB5F9, 0x9793, - 0xB64B, 0x9759, - 0xB69E, 0x971F, - 0xB6F0, 0x96E6, - 0xB743, 0x96AC, - 0xB796, 0x9673, - 0xB7E9, 0x963B, - 0xB83C, 0x9602, - 0xB88F, 0x95CA, - 0xB8E3, 0x9592, - 0xB936, 0x955A, - 0xB98A, 0x9523, - 0xB9DE, 0x94EC, - 0xBA32, 0x94B5, - 0xBA87, 0x947E, - 0xBADB, 0x9447, - 0xBB30, 0x9411, - 0xBB85, 0x93DB, - 0xBBDA, 0x93A6, - 0xBC2F, 0x9370, - 0xBC84, 0x933B, - 0xBCDA, 0x9306, - 0xBD2F, 0x92D2, - 0xBD85, 0x929D, - 0xBDDB, 0x9269, - 0xBE31, 0x9235, - 0xBE88, 0x9202, - 0xBEDE, 0x91CF, - 0xBF35, 0x919C, - 0xBF8C, 0x9169, - 0xBFE2, 0x9136, - 0xC03A, 0x9104, - 0xC091, 0x90D2, - 0xC0E8, 0x90A0, - 0xC140, 0x906F, - 0xC197, 0x903E, - 0xC1EF, 0x900D, - 0xC247, 0x8FDC, - 0xC29F, 0x8FAC, - 0xC2F8, 0x8F7C, - 0xC350, 0x8F4C, - 0xC3A9, 0x8F1D, - 0xC402, 0x8EED, - 0xC45A, 0x8EBE, - 0xC4B3, 0x8E90, - 0xC50D, 0x8E61, - 0xC566, 0x8E33, - 0xC5BF, 0x8E05, - 0xC619, 0x8DD8, - 0xC673, 0x8DAA, - 0xC6CD, 0x8D7D, - 0xC727, 0x8D50, - 0xC781, 0x8D24, - 0xC7DB, 0x8CF8, - 0xC835, 0x8CCC, - 0xC890, 0x8CA0, - 0xC8EB, 0x8C75, - 0xC945, 0x8C4A, - 0xC9A0, 0x8C1F, - 0xC9FB, 0x8BF4, - 0xCA57, 0x8BCA, - 0xCAB2, 0x8BA0, - 0xCB0D, 0x8B76, - 0xCB69, 0x8B4D, - 0xCBC5, 0x8B24, - 0xCC21, 0x8AFB, - 0xCC7D, 0x8AD2, - 0xCCD9, 0x8AAA, - 0xCD35, 0x8A82, - 0xCD91, 0x8A5A, - 0xCDEE, 0x8A33, - 0xCE4A, 0x8A0B, - 0xCEA7, 0x89E4, - 0xCF04, 0x89BE, - 0xCF61, 0x8997, - 0xCFBE, 0x8971, - 0xD01B, 0x894C, - 0xD078, 0x8926, - 0xD0D6, 0x8901, - 0xD133, 0x88DC, - 0xD191, 0x88B8, - 0xD1EE, 0x8893, - 0xD24C, 0x886F, - 0xD2AA, 0x884B, - 0xD308, 0x8828, - 0xD367, 0x8805, - 0xD3C5, 0x87E2, - 0xD423, 0x87BF, - 0xD482, 0x879D, - 0xD4E0, 0x877B, - 0xD53F, 0x8759, - 0xD59E, 0x8738, - 0xD5FD, 0x8717, - 0xD65C, 0x86F6, - 0xD6BB, 0x86D5, - 0xD71A, 0x86B5, - 0xD779, 0x8695, - 0xD7D9, 0x8675, - 0xD838, 0x8656, - 0xD898, 0x8637, - 0xD8F8, 0x8618, - 0xD957, 0x85FA, - 0xD9B7, 0x85DB, - 0xDA17, 0x85BD, - 0xDA77, 0x85A0, - 0xDAD7, 0x8582, - 0xDB38, 0x8565, - 0xDB98, 0x8549, - 0xDBF8, 0x852C, - 0xDC59, 0x8510, - 0xDCBA, 0x84F4, - 0xDD1A, 0x84D9, - 0xDD7B, 0x84BD, - 0xDDDC, 0x84A2, - 0xDE3D, 0x8488, - 0xDE9E, 0x846D, - 0xDEFF, 0x8453, - 0xDF60, 0x843A, - 0xDFC1, 0x8420, - 0xE023, 0x8407, - 0xE084, 0x83EE, - 0xE0E6, 0x83D6, - 0xE147, 0x83BD, - 0xE1A9, 0x83A5, - 0xE20A, 0x838E, - 0xE26C, 0x8376, - 0xE2CE, 0x835F, - 0xE330, 0x8348, - 0xE392, 0x8332, - 0xE3F4, 0x831C, - 0xE456, 0x8306, - 0xE4B8, 0x82F0, - 0xE51B, 0x82DB, - 0xE57D, 0x82C6, - 0xE5DF, 0x82B1, - 0xE642, 0x829D, - 0xE6A4, 0x8289, - 0xE707, 0x8275, - 0xE769, 0x8262, - 0xE7CC, 0x824F, - 0xE82F, 0x823C, - 0xE892, 0x8229, - 0xE8F5, 0x8217, - 0xE957, 0x8205, - 0xE9BA, 0x81F3, - 0xEA1D, 0x81E2, - 0xEA80, 0x81D1, - 0xEAE4, 0x81C0, - 0xEB47, 0x81B0, - 0xEBAA, 0x81A0, - 0xEC0D, 0x8190, - 0xEC71, 0x8180, - 0xECD4, 0x8171, - 0xED37, 0x8162, - 0xED9B, 0x8154, - 0xEDFE, 0x8145, - 0xEE62, 0x8137, - 0xEEC6, 0x812A, - 0xEF29, 0x811C, - 0xEF8D, 0x810F, - 0xEFF1, 0x8102, - 0xF054, 0x80F6, - 0xF0B8, 0x80EA, - 0xF11C, 0x80DE, - 0xF180, 0x80D2, - 0xF1E4, 0x80C7, - 0xF248, 0x80BC, - 0xF2AC, 0x80B2, - 0xF310, 0x80A7, - 0xF374, 0x809D, - 0xF3D8, 0x8094, - 0xF43C, 0x808A, - 0xF4A0, 0x8081, - 0xF504, 0x8078, - 0xF568, 0x8070, - 0xF5CC, 0x8068, - 0xF631, 0x8060, - 0xF695, 0x8058, - 0xF6F9, 0x8051, - 0xF75D, 0x804A, - 0xF7C2, 0x8043, - 0xF826, 0x803D, - 0xF88A, 0x8037, - 0xF8EF, 0x8031, - 0xF953, 0x802C, - 0xF9B8, 0x8027, - 0xFA1C, 0x8022, - 0xFA80, 0x801E, - 0xFAE5, 0x801A, - 0xFB49, 0x8016, - 0xFBAE, 0x8012, - 0xFC12, 0x800F, - 0xFC77, 0x800C, - 0xFCDB, 0x8009, - 0xFD40, 0x8007, - 0xFDA4, 0x8005, - 0xFE09, 0x8003, - 0xFE6D, 0x8002, - 0xFED2, 0x8001, - 0xFF36, 0x8000, - 0xFF9B, 0x8000 -}; - -/** -* \par -* Example code for q15 Twiddle factors Generation:: -* \par -*
for(i = 0; i< 3N/4; i++)    
-* {    
-*    twiddleCoefq15[2*i]= cos(i * 2*PI/(float)N);    
-*    twiddleCoefq15[2*i+1]= sin(i * 2*PI/(float)N);    
-* } 
-* \par -* where N = 4096 and PI = 3.14159265358979 -* \par -* Cos and Sin values are interleaved fashion -* \par -* Convert Floating point to q15(Fixed point 1.15): -* round(twiddleCoefq15(i) * pow(2, 15)) -* -*/ -const q15_t twiddleCoef_4096_q15[6144] = -{ - 0x7FFF, 0x0000, - 0x7FFF, 0x0032, - 0x7FFF, 0x0064, - 0x7FFF, 0x0096, - 0x7FFF, 0x00C9, - 0x7FFF, 0x00FB, - 0x7FFE, 0x012D, - 0x7FFE, 0x015F, - 0x7FFD, 0x0192, - 0x7FFC, 0x01C4, - 0x7FFC, 0x01F6, - 0x7FFB, 0x0228, - 0x7FFA, 0x025B, - 0x7FF9, 0x028D, - 0x7FF8, 0x02BF, - 0x7FF7, 0x02F1, - 0x7FF6, 0x0324, - 0x7FF4, 0x0356, - 0x7FF3, 0x0388, - 0x7FF2, 0x03BA, - 0x7FF0, 0x03ED, - 0x7FEE, 0x041F, - 0x7FED, 0x0451, - 0x7FEB, 0x0483, - 0x7FE9, 0x04B6, - 0x7FE7, 0x04E8, - 0x7FE5, 0x051A, - 0x7FE3, 0x054C, - 0x7FE1, 0x057F, - 0x7FDF, 0x05B1, - 0x7FDD, 0x05E3, - 0x7FDA, 0x0615, - 0x7FD8, 0x0647, - 0x7FD6, 0x067A, - 0x7FD3, 0x06AC, - 0x7FD0, 0x06DE, - 0x7FCE, 0x0710, - 0x7FCB, 0x0742, - 0x7FC8, 0x0775, - 0x7FC5, 0x07A7, - 0x7FC2, 0x07D9, - 0x7FBF, 0x080B, - 0x7FBC, 0x083D, - 0x7FB8, 0x086F, - 0x7FB5, 0x08A2, - 0x7FB1, 0x08D4, - 0x7FAE, 0x0906, - 0x7FAA, 0x0938, - 0x7FA7, 0x096A, - 0x7FA3, 0x099C, - 0x7F9F, 0x09CE, - 0x7F9B, 0x0A00, - 0x7F97, 0x0A33, - 0x7F93, 0x0A65, - 0x7F8F, 0x0A97, - 0x7F8B, 0x0AC9, - 0x7F87, 0x0AFB, - 0x7F82, 0x0B2D, - 0x7F7E, 0x0B5F, - 0x7F79, 0x0B91, - 0x7F75, 0x0BC3, - 0x7F70, 0x0BF5, - 0x7F6B, 0x0C27, - 0x7F67, 0x0C59, - 0x7F62, 0x0C8B, - 0x7F5D, 0x0CBD, - 0x7F58, 0x0CEF, - 0x7F53, 0x0D21, - 0x7F4D, 0x0D53, - 0x7F48, 0x0D85, - 0x7F43, 0x0DB7, - 0x7F3D, 0x0DE9, - 0x7F38, 0x0E1B, - 0x7F32, 0x0E4D, - 0x7F2D, 0x0E7F, - 0x7F27, 0x0EB1, - 0x7F21, 0x0EE3, - 0x7F1B, 0x0F15, - 0x7F15, 0x0F47, - 0x7F0F, 0x0F79, - 0x7F09, 0x0FAB, - 0x7F03, 0x0FDD, - 0x7EFD, 0x100E, - 0x7EF6, 0x1040, - 0x7EF0, 0x1072, - 0x7EE9, 0x10A4, - 0x7EE3, 0x10D6, - 0x7EDC, 0x1108, - 0x7ED5, 0x1139, - 0x7ECF, 0x116B, - 0x7EC8, 0x119D, - 0x7EC1, 0x11CF, - 0x7EBA, 0x1201, - 0x7EB3, 0x1232, - 0x7EAB, 0x1264, - 0x7EA4, 0x1296, - 0x7E9D, 0x12C8, - 0x7E95, 0x12F9, - 0x7E8E, 0x132B, - 0x7E86, 0x135D, - 0x7E7F, 0x138E, - 0x7E77, 0x13C0, - 0x7E6F, 0x13F2, - 0x7E67, 0x1423, - 0x7E5F, 0x1455, - 0x7E57, 0x1487, - 0x7E4F, 0x14B8, - 0x7E47, 0x14EA, - 0x7E3F, 0x151B, - 0x7E37, 0x154D, - 0x7E2E, 0x157F, - 0x7E26, 0x15B0, - 0x7E1D, 0x15E2, - 0x7E14, 0x1613, - 0x7E0C, 0x1645, - 0x7E03, 0x1676, - 0x7DFA, 0x16A8, - 0x7DF1, 0x16D9, - 0x7DE8, 0x170A, - 0x7DDF, 0x173C, - 0x7DD6, 0x176D, - 0x7DCD, 0x179F, - 0x7DC3, 0x17D0, - 0x7DBA, 0x1802, - 0x7DB0, 0x1833, - 0x7DA7, 0x1864, - 0x7D9D, 0x1896, - 0x7D94, 0x18C7, - 0x7D8A, 0x18F8, - 0x7D80, 0x192A, - 0x7D76, 0x195B, - 0x7D6C, 0x198C, - 0x7D62, 0x19BD, - 0x7D58, 0x19EF, - 0x7D4E, 0x1A20, - 0x7D43, 0x1A51, - 0x7D39, 0x1A82, - 0x7D2F, 0x1AB3, - 0x7D24, 0x1AE4, - 0x7D19, 0x1B16, - 0x7D0F, 0x1B47, - 0x7D04, 0x1B78, - 0x7CF9, 0x1BA9, - 0x7CEE, 0x1BDA, - 0x7CE3, 0x1C0B, - 0x7CD8, 0x1C3C, - 0x7CCD, 0x1C6D, - 0x7CC2, 0x1C9E, - 0x7CB7, 0x1CCF, - 0x7CAB, 0x1D00, - 0x7CA0, 0x1D31, - 0x7C94, 0x1D62, - 0x7C89, 0x1D93, - 0x7C7D, 0x1DC4, - 0x7C71, 0x1DF5, - 0x7C66, 0x1E25, - 0x7C5A, 0x1E56, - 0x7C4E, 0x1E87, - 0x7C42, 0x1EB8, - 0x7C36, 0x1EE9, - 0x7C29, 0x1F19, - 0x7C1D, 0x1F4A, - 0x7C11, 0x1F7B, - 0x7C05, 0x1FAC, - 0x7BF8, 0x1FDC, - 0x7BEB, 0x200D, - 0x7BDF, 0x203E, - 0x7BD2, 0x206E, - 0x7BC5, 0x209F, - 0x7BB9, 0x20D0, - 0x7BAC, 0x2100, - 0x7B9F, 0x2131, - 0x7B92, 0x2161, - 0x7B84, 0x2192, - 0x7B77, 0x21C2, - 0x7B6A, 0x21F3, - 0x7B5D, 0x2223, - 0x7B4F, 0x2254, - 0x7B42, 0x2284, - 0x7B34, 0x22B4, - 0x7B26, 0x22E5, - 0x7B19, 0x2315, - 0x7B0B, 0x2345, - 0x7AFD, 0x2376, - 0x7AEF, 0x23A6, - 0x7AE1, 0x23D6, - 0x7AD3, 0x2407, - 0x7AC5, 0x2437, - 0x7AB6, 0x2467, - 0x7AA8, 0x2497, - 0x7A9A, 0x24C7, - 0x7A8B, 0x24F7, - 0x7A7D, 0x2528, - 0x7A6E, 0x2558, - 0x7A5F, 0x2588, - 0x7A50, 0x25B8, - 0x7A42, 0x25E8, - 0x7A33, 0x2618, - 0x7A24, 0x2648, - 0x7A15, 0x2678, - 0x7A05, 0x26A8, - 0x79F6, 0x26D8, - 0x79E7, 0x2707, - 0x79D8, 0x2737, - 0x79C8, 0x2767, - 0x79B9, 0x2797, - 0x79A9, 0x27C7, - 0x7999, 0x27F6, - 0x798A, 0x2826, - 0x797A, 0x2856, - 0x796A, 0x2886, - 0x795A, 0x28B5, - 0x794A, 0x28E5, - 0x793A, 0x2915, - 0x792A, 0x2944, - 0x7919, 0x2974, - 0x7909, 0x29A3, - 0x78F9, 0x29D3, - 0x78E8, 0x2A02, - 0x78D8, 0x2A32, - 0x78C7, 0x2A61, - 0x78B6, 0x2A91, - 0x78A6, 0x2AC0, - 0x7895, 0x2AEF, - 0x7884, 0x2B1F, - 0x7873, 0x2B4E, - 0x7862, 0x2B7D, - 0x7851, 0x2BAD, - 0x7840, 0x2BDC, - 0x782E, 0x2C0B, - 0x781D, 0x2C3A, - 0x780C, 0x2C69, - 0x77FA, 0x2C98, - 0x77E9, 0x2CC8, - 0x77D7, 0x2CF7, - 0x77C5, 0x2D26, - 0x77B4, 0x2D55, - 0x77A2, 0x2D84, - 0x7790, 0x2DB3, - 0x777E, 0x2DE2, - 0x776C, 0x2E11, - 0x775A, 0x2E3F, - 0x7747, 0x2E6E, - 0x7735, 0x2E9D, - 0x7723, 0x2ECC, - 0x7710, 0x2EFB, - 0x76FE, 0x2F29, - 0x76EB, 0x2F58, - 0x76D9, 0x2F87, - 0x76C6, 0x2FB5, - 0x76B3, 0x2FE4, - 0x76A0, 0x3013, - 0x768E, 0x3041, - 0x767B, 0x3070, - 0x7668, 0x309E, - 0x7654, 0x30CD, - 0x7641, 0x30FB, - 0x762E, 0x312A, - 0x761B, 0x3158, - 0x7607, 0x3186, - 0x75F4, 0x31B5, - 0x75E0, 0x31E3, - 0x75CC, 0x3211, - 0x75B9, 0x3240, - 0x75A5, 0x326E, - 0x7591, 0x329C, - 0x757D, 0x32CA, - 0x7569, 0x32F8, - 0x7555, 0x3326, - 0x7541, 0x3354, - 0x752D, 0x3382, - 0x7519, 0x33B0, - 0x7504, 0x33DE, - 0x74F0, 0x340C, - 0x74DB, 0x343A, - 0x74C7, 0x3468, - 0x74B2, 0x3496, - 0x749E, 0x34C4, - 0x7489, 0x34F2, - 0x7474, 0x351F, - 0x745F, 0x354D, - 0x744A, 0x357B, - 0x7435, 0x35A8, - 0x7420, 0x35D6, - 0x740B, 0x3604, - 0x73F6, 0x3631, - 0x73E0, 0x365F, - 0x73CB, 0x368C, - 0x73B5, 0x36BA, - 0x73A0, 0x36E7, - 0x738A, 0x3714, - 0x7375, 0x3742, - 0x735F, 0x376F, - 0x7349, 0x379C, - 0x7333, 0x37CA, - 0x731D, 0x37F7, - 0x7307, 0x3824, - 0x72F1, 0x3851, - 0x72DB, 0x387E, - 0x72C5, 0x38AB, - 0x72AF, 0x38D8, - 0x7298, 0x3906, - 0x7282, 0x3932, - 0x726B, 0x395F, - 0x7255, 0x398C, - 0x723E, 0x39B9, - 0x7227, 0x39E6, - 0x7211, 0x3A13, - 0x71FA, 0x3A40, - 0x71E3, 0x3A6C, - 0x71CC, 0x3A99, - 0x71B5, 0x3AC6, - 0x719E, 0x3AF2, - 0x7186, 0x3B1F, - 0x716F, 0x3B4C, - 0x7158, 0x3B78, - 0x7141, 0x3BA5, - 0x7129, 0x3BD1, - 0x7112, 0x3BFD, - 0x70FA, 0x3C2A, - 0x70E2, 0x3C56, - 0x70CB, 0x3C83, - 0x70B3, 0x3CAF, - 0x709B, 0x3CDB, - 0x7083, 0x3D07, - 0x706B, 0x3D33, - 0x7053, 0x3D60, - 0x703B, 0x3D8C, - 0x7023, 0x3DB8, - 0x700A, 0x3DE4, - 0x6FF2, 0x3E10, - 0x6FDA, 0x3E3C, - 0x6FC1, 0x3E68, - 0x6FA9, 0x3E93, - 0x6F90, 0x3EBF, - 0x6F77, 0x3EEB, - 0x6F5F, 0x3F17, - 0x6F46, 0x3F43, - 0x6F2D, 0x3F6E, - 0x6F14, 0x3F9A, - 0x6EFB, 0x3FC5, - 0x6EE2, 0x3FF1, - 0x6EC9, 0x401D, - 0x6EAF, 0x4048, - 0x6E96, 0x4073, - 0x6E7D, 0x409F, - 0x6E63, 0x40CA, - 0x6E4A, 0x40F6, - 0x6E30, 0x4121, - 0x6E17, 0x414C, - 0x6DFD, 0x4177, - 0x6DE3, 0x41A2, - 0x6DCA, 0x41CE, - 0x6DB0, 0x41F9, - 0x6D96, 0x4224, - 0x6D7C, 0x424F, - 0x6D62, 0x427A, - 0x6D48, 0x42A5, - 0x6D2D, 0x42D0, - 0x6D13, 0x42FA, - 0x6CF9, 0x4325, - 0x6CDE, 0x4350, - 0x6CC4, 0x437B, - 0x6CA9, 0x43A5, - 0x6C8F, 0x43D0, - 0x6C74, 0x43FB, - 0x6C59, 0x4425, - 0x6C3F, 0x4450, - 0x6C24, 0x447A, - 0x6C09, 0x44A5, - 0x6BEE, 0x44CF, - 0x6BD3, 0x44FA, - 0x6BB8, 0x4524, - 0x6B9C, 0x454E, - 0x6B81, 0x4578, - 0x6B66, 0x45A3, - 0x6B4A, 0x45CD, - 0x6B2F, 0x45F7, - 0x6B13, 0x4621, - 0x6AF8, 0x464B, - 0x6ADC, 0x4675, - 0x6AC1, 0x469F, - 0x6AA5, 0x46C9, - 0x6A89, 0x46F3, - 0x6A6D, 0x471C, - 0x6A51, 0x4746, - 0x6A35, 0x4770, - 0x6A19, 0x479A, - 0x69FD, 0x47C3, - 0x69E1, 0x47ED, - 0x69C4, 0x4816, - 0x69A8, 0x4840, - 0x698C, 0x4869, - 0x696F, 0x4893, - 0x6953, 0x48BC, - 0x6936, 0x48E6, - 0x6919, 0x490F, - 0x68FD, 0x4938, - 0x68E0, 0x4961, - 0x68C3, 0x498A, - 0x68A6, 0x49B4, - 0x6889, 0x49DD, - 0x686C, 0x4A06, - 0x684F, 0x4A2F, - 0x6832, 0x4A58, - 0x6815, 0x4A81, - 0x67F7, 0x4AA9, - 0x67DA, 0x4AD2, - 0x67BD, 0x4AFB, - 0x679F, 0x4B24, - 0x6782, 0x4B4C, - 0x6764, 0x4B75, - 0x6746, 0x4B9E, - 0x6729, 0x4BC6, - 0x670B, 0x4BEF, - 0x66ED, 0x4C17, - 0x66CF, 0x4C3F, - 0x66B1, 0x4C68, - 0x6693, 0x4C90, - 0x6675, 0x4CB8, - 0x6657, 0x4CE1, - 0x6639, 0x4D09, - 0x661A, 0x4D31, - 0x65FC, 0x4D59, - 0x65DD, 0x4D81, - 0x65BF, 0x4DA9, - 0x65A0, 0x4DD1, - 0x6582, 0x4DF9, - 0x6563, 0x4E21, - 0x6545, 0x4E48, - 0x6526, 0x4E70, - 0x6507, 0x4E98, - 0x64E8, 0x4EBF, - 0x64C9, 0x4EE7, - 0x64AA, 0x4F0F, - 0x648B, 0x4F36, - 0x646C, 0x4F5E, - 0x644D, 0x4F85, - 0x642D, 0x4FAC, - 0x640E, 0x4FD4, - 0x63EF, 0x4FFB, - 0x63CF, 0x5022, - 0x63B0, 0x5049, - 0x6390, 0x5070, - 0x6371, 0x5097, - 0x6351, 0x50BF, - 0x6331, 0x50E5, - 0x6311, 0x510C, - 0x62F2, 0x5133, - 0x62D2, 0x515A, - 0x62B2, 0x5181, - 0x6292, 0x51A8, - 0x6271, 0x51CE, - 0x6251, 0x51F5, - 0x6231, 0x521C, - 0x6211, 0x5242, - 0x61F1, 0x5269, - 0x61D0, 0x528F, - 0x61B0, 0x52B5, - 0x618F, 0x52DC, - 0x616F, 0x5302, - 0x614E, 0x5328, - 0x612D, 0x534E, - 0x610D, 0x5375, - 0x60EC, 0x539B, - 0x60CB, 0x53C1, - 0x60AA, 0x53E7, - 0x6089, 0x540D, - 0x6068, 0x5433, - 0x6047, 0x5458, - 0x6026, 0x547E, - 0x6004, 0x54A4, - 0x5FE3, 0x54CA, - 0x5FC2, 0x54EF, - 0x5FA0, 0x5515, - 0x5F7F, 0x553A, - 0x5F5E, 0x5560, - 0x5F3C, 0x5585, - 0x5F1A, 0x55AB, - 0x5EF9, 0x55D0, - 0x5ED7, 0x55F5, - 0x5EB5, 0x561A, - 0x5E93, 0x5640, - 0x5E71, 0x5665, - 0x5E50, 0x568A, - 0x5E2D, 0x56AF, - 0x5E0B, 0x56D4, - 0x5DE9, 0x56F9, - 0x5DC7, 0x571D, - 0x5DA5, 0x5742, - 0x5D83, 0x5767, - 0x5D60, 0x578C, - 0x5D3E, 0x57B0, - 0x5D1B, 0x57D5, - 0x5CF9, 0x57F9, - 0x5CD6, 0x581E, - 0x5CB4, 0x5842, - 0x5C91, 0x5867, - 0x5C6E, 0x588B, - 0x5C4B, 0x58AF, - 0x5C29, 0x58D4, - 0x5C06, 0x58F8, - 0x5BE3, 0x591C, - 0x5BC0, 0x5940, - 0x5B9D, 0x5964, - 0x5B79, 0x5988, - 0x5B56, 0x59AC, - 0x5B33, 0x59D0, - 0x5B10, 0x59F3, - 0x5AEC, 0x5A17, - 0x5AC9, 0x5A3B, - 0x5AA5, 0x5A5E, - 0x5A82, 0x5A82, - 0x5A5E, 0x5AA5, - 0x5A3B, 0x5AC9, - 0x5A17, 0x5AEC, - 0x59F3, 0x5B10, - 0x59D0, 0x5B33, - 0x59AC, 0x5B56, - 0x5988, 0x5B79, - 0x5964, 0x5B9D, - 0x5940, 0x5BC0, - 0x591C, 0x5BE3, - 0x58F8, 0x5C06, - 0x58D4, 0x5C29, - 0x58AF, 0x5C4B, - 0x588B, 0x5C6E, - 0x5867, 0x5C91, - 0x5842, 0x5CB4, - 0x581E, 0x5CD6, - 0x57F9, 0x5CF9, - 0x57D5, 0x5D1B, - 0x57B0, 0x5D3E, - 0x578C, 0x5D60, - 0x5767, 0x5D83, - 0x5742, 0x5DA5, - 0x571D, 0x5DC7, - 0x56F9, 0x5DE9, - 0x56D4, 0x5E0B, - 0x56AF, 0x5E2D, - 0x568A, 0x5E50, - 0x5665, 0x5E71, - 0x5640, 0x5E93, - 0x561A, 0x5EB5, - 0x55F5, 0x5ED7, - 0x55D0, 0x5EF9, - 0x55AB, 0x5F1A, - 0x5585, 0x5F3C, - 0x5560, 0x5F5E, - 0x553A, 0x5F7F, - 0x5515, 0x5FA0, - 0x54EF, 0x5FC2, - 0x54CA, 0x5FE3, - 0x54A4, 0x6004, - 0x547E, 0x6026, - 0x5458, 0x6047, - 0x5433, 0x6068, - 0x540D, 0x6089, - 0x53E7, 0x60AA, - 0x53C1, 0x60CB, - 0x539B, 0x60EC, - 0x5375, 0x610D, - 0x534E, 0x612D, - 0x5328, 0x614E, - 0x5302, 0x616F, - 0x52DC, 0x618F, - 0x52B5, 0x61B0, - 0x528F, 0x61D0, - 0x5269, 0x61F1, - 0x5242, 0x6211, - 0x521C, 0x6231, - 0x51F5, 0x6251, - 0x51CE, 0x6271, - 0x51A8, 0x6292, - 0x5181, 0x62B2, - 0x515A, 0x62D2, - 0x5133, 0x62F2, - 0x510C, 0x6311, - 0x50E5, 0x6331, - 0x50BF, 0x6351, - 0x5097, 0x6371, - 0x5070, 0x6390, - 0x5049, 0x63B0, - 0x5022, 0x63CF, - 0x4FFB, 0x63EF, - 0x4FD4, 0x640E, - 0x4FAC, 0x642D, - 0x4F85, 0x644D, - 0x4F5E, 0x646C, - 0x4F36, 0x648B, - 0x4F0F, 0x64AA, - 0x4EE7, 0x64C9, - 0x4EBF, 0x64E8, - 0x4E98, 0x6507, - 0x4E70, 0x6526, - 0x4E48, 0x6545, - 0x4E21, 0x6563, - 0x4DF9, 0x6582, - 0x4DD1, 0x65A0, - 0x4DA9, 0x65BF, - 0x4D81, 0x65DD, - 0x4D59, 0x65FC, - 0x4D31, 0x661A, - 0x4D09, 0x6639, - 0x4CE1, 0x6657, - 0x4CB8, 0x6675, - 0x4C90, 0x6693, - 0x4C68, 0x66B1, - 0x4C3F, 0x66CF, - 0x4C17, 0x66ED, - 0x4BEF, 0x670B, - 0x4BC6, 0x6729, - 0x4B9E, 0x6746, - 0x4B75, 0x6764, - 0x4B4C, 0x6782, - 0x4B24, 0x679F, - 0x4AFB, 0x67BD, - 0x4AD2, 0x67DA, - 0x4AA9, 0x67F7, - 0x4A81, 0x6815, - 0x4A58, 0x6832, - 0x4A2F, 0x684F, - 0x4A06, 0x686C, - 0x49DD, 0x6889, - 0x49B4, 0x68A6, - 0x498A, 0x68C3, - 0x4961, 0x68E0, - 0x4938, 0x68FD, - 0x490F, 0x6919, - 0x48E6, 0x6936, - 0x48BC, 0x6953, - 0x4893, 0x696F, - 0x4869, 0x698C, - 0x4840, 0x69A8, - 0x4816, 0x69C4, - 0x47ED, 0x69E1, - 0x47C3, 0x69FD, - 0x479A, 0x6A19, - 0x4770, 0x6A35, - 0x4746, 0x6A51, - 0x471C, 0x6A6D, - 0x46F3, 0x6A89, - 0x46C9, 0x6AA5, - 0x469F, 0x6AC1, - 0x4675, 0x6ADC, - 0x464B, 0x6AF8, - 0x4621, 0x6B13, - 0x45F7, 0x6B2F, - 0x45CD, 0x6B4A, - 0x45A3, 0x6B66, - 0x4578, 0x6B81, - 0x454E, 0x6B9C, - 0x4524, 0x6BB8, - 0x44FA, 0x6BD3, - 0x44CF, 0x6BEE, - 0x44A5, 0x6C09, - 0x447A, 0x6C24, - 0x4450, 0x6C3F, - 0x4425, 0x6C59, - 0x43FB, 0x6C74, - 0x43D0, 0x6C8F, - 0x43A5, 0x6CA9, - 0x437B, 0x6CC4, - 0x4350, 0x6CDE, - 0x4325, 0x6CF9, - 0x42FA, 0x6D13, - 0x42D0, 0x6D2D, - 0x42A5, 0x6D48, - 0x427A, 0x6D62, - 0x424F, 0x6D7C, - 0x4224, 0x6D96, - 0x41F9, 0x6DB0, - 0x41CE, 0x6DCA, - 0x41A2, 0x6DE3, - 0x4177, 0x6DFD, - 0x414C, 0x6E17, - 0x4121, 0x6E30, - 0x40F6, 0x6E4A, - 0x40CA, 0x6E63, - 0x409F, 0x6E7D, - 0x4073, 0x6E96, - 0x4048, 0x6EAF, - 0x401D, 0x6EC9, - 0x3FF1, 0x6EE2, - 0x3FC5, 0x6EFB, - 0x3F9A, 0x6F14, - 0x3F6E, 0x6F2D, - 0x3F43, 0x6F46, - 0x3F17, 0x6F5F, - 0x3EEB, 0x6F77, - 0x3EBF, 0x6F90, - 0x3E93, 0x6FA9, - 0x3E68, 0x6FC1, - 0x3E3C, 0x6FDA, - 0x3E10, 0x6FF2, - 0x3DE4, 0x700A, - 0x3DB8, 0x7023, - 0x3D8C, 0x703B, - 0x3D60, 0x7053, - 0x3D33, 0x706B, - 0x3D07, 0x7083, - 0x3CDB, 0x709B, - 0x3CAF, 0x70B3, - 0x3C83, 0x70CB, - 0x3C56, 0x70E2, - 0x3C2A, 0x70FA, - 0x3BFD, 0x7112, - 0x3BD1, 0x7129, - 0x3BA5, 0x7141, - 0x3B78, 0x7158, - 0x3B4C, 0x716F, - 0x3B1F, 0x7186, - 0x3AF2, 0x719E, - 0x3AC6, 0x71B5, - 0x3A99, 0x71CC, - 0x3A6C, 0x71E3, - 0x3A40, 0x71FA, - 0x3A13, 0x7211, - 0x39E6, 0x7227, - 0x39B9, 0x723E, - 0x398C, 0x7255, - 0x395F, 0x726B, - 0x3932, 0x7282, - 0x3906, 0x7298, - 0x38D8, 0x72AF, - 0x38AB, 0x72C5, - 0x387E, 0x72DB, - 0x3851, 0x72F1, - 0x3824, 0x7307, - 0x37F7, 0x731D, - 0x37CA, 0x7333, - 0x379C, 0x7349, - 0x376F, 0x735F, - 0x3742, 0x7375, - 0x3714, 0x738A, - 0x36E7, 0x73A0, - 0x36BA, 0x73B5, - 0x368C, 0x73CB, - 0x365F, 0x73E0, - 0x3631, 0x73F6, - 0x3604, 0x740B, - 0x35D6, 0x7420, - 0x35A8, 0x7435, - 0x357B, 0x744A, - 0x354D, 0x745F, - 0x351F, 0x7474, - 0x34F2, 0x7489, - 0x34C4, 0x749E, - 0x3496, 0x74B2, - 0x3468, 0x74C7, - 0x343A, 0x74DB, - 0x340C, 0x74F0, - 0x33DE, 0x7504, - 0x33B0, 0x7519, - 0x3382, 0x752D, - 0x3354, 0x7541, - 0x3326, 0x7555, - 0x32F8, 0x7569, - 0x32CA, 0x757D, - 0x329C, 0x7591, - 0x326E, 0x75A5, - 0x3240, 0x75B9, - 0x3211, 0x75CC, - 0x31E3, 0x75E0, - 0x31B5, 0x75F4, - 0x3186, 0x7607, - 0x3158, 0x761B, - 0x312A, 0x762E, - 0x30FB, 0x7641, - 0x30CD, 0x7654, - 0x309E, 0x7668, - 0x3070, 0x767B, - 0x3041, 0x768E, - 0x3013, 0x76A0, - 0x2FE4, 0x76B3, - 0x2FB5, 0x76C6, - 0x2F87, 0x76D9, - 0x2F58, 0x76EB, - 0x2F29, 0x76FE, - 0x2EFB, 0x7710, - 0x2ECC, 0x7723, - 0x2E9D, 0x7735, - 0x2E6E, 0x7747, - 0x2E3F, 0x775A, - 0x2E11, 0x776C, - 0x2DE2, 0x777E, - 0x2DB3, 0x7790, - 0x2D84, 0x77A2, - 0x2D55, 0x77B4, - 0x2D26, 0x77C5, - 0x2CF7, 0x77D7, - 0x2CC8, 0x77E9, - 0x2C98, 0x77FA, - 0x2C69, 0x780C, - 0x2C3A, 0x781D, - 0x2C0B, 0x782E, - 0x2BDC, 0x7840, - 0x2BAD, 0x7851, - 0x2B7D, 0x7862, - 0x2B4E, 0x7873, - 0x2B1F, 0x7884, - 0x2AEF, 0x7895, - 0x2AC0, 0x78A6, - 0x2A91, 0x78B6, - 0x2A61, 0x78C7, - 0x2A32, 0x78D8, - 0x2A02, 0x78E8, - 0x29D3, 0x78F9, - 0x29A3, 0x7909, - 0x2974, 0x7919, - 0x2944, 0x792A, - 0x2915, 0x793A, - 0x28E5, 0x794A, - 0x28B5, 0x795A, - 0x2886, 0x796A, - 0x2856, 0x797A, - 0x2826, 0x798A, - 0x27F6, 0x7999, - 0x27C7, 0x79A9, - 0x2797, 0x79B9, - 0x2767, 0x79C8, - 0x2737, 0x79D8, - 0x2707, 0x79E7, - 0x26D8, 0x79F6, - 0x26A8, 0x7A05, - 0x2678, 0x7A15, - 0x2648, 0x7A24, - 0x2618, 0x7A33, - 0x25E8, 0x7A42, - 0x25B8, 0x7A50, - 0x2588, 0x7A5F, - 0x2558, 0x7A6E, - 0x2528, 0x7A7D, - 0x24F7, 0x7A8B, - 0x24C7, 0x7A9A, - 0x2497, 0x7AA8, - 0x2467, 0x7AB6, - 0x2437, 0x7AC5, - 0x2407, 0x7AD3, - 0x23D6, 0x7AE1, - 0x23A6, 0x7AEF, - 0x2376, 0x7AFD, - 0x2345, 0x7B0B, - 0x2315, 0x7B19, - 0x22E5, 0x7B26, - 0x22B4, 0x7B34, - 0x2284, 0x7B42, - 0x2254, 0x7B4F, - 0x2223, 0x7B5D, - 0x21F3, 0x7B6A, - 0x21C2, 0x7B77, - 0x2192, 0x7B84, - 0x2161, 0x7B92, - 0x2131, 0x7B9F, - 0x2100, 0x7BAC, - 0x20D0, 0x7BB9, - 0x209F, 0x7BC5, - 0x206E, 0x7BD2, - 0x203E, 0x7BDF, - 0x200D, 0x7BEB, - 0x1FDC, 0x7BF8, - 0x1FAC, 0x7C05, - 0x1F7B, 0x7C11, - 0x1F4A, 0x7C1D, - 0x1F19, 0x7C29, - 0x1EE9, 0x7C36, - 0x1EB8, 0x7C42, - 0x1E87, 0x7C4E, - 0x1E56, 0x7C5A, - 0x1E25, 0x7C66, - 0x1DF5, 0x7C71, - 0x1DC4, 0x7C7D, - 0x1D93, 0x7C89, - 0x1D62, 0x7C94, - 0x1D31, 0x7CA0, - 0x1D00, 0x7CAB, - 0x1CCF, 0x7CB7, - 0x1C9E, 0x7CC2, - 0x1C6D, 0x7CCD, - 0x1C3C, 0x7CD8, - 0x1C0B, 0x7CE3, - 0x1BDA, 0x7CEE, - 0x1BA9, 0x7CF9, - 0x1B78, 0x7D04, - 0x1B47, 0x7D0F, - 0x1B16, 0x7D19, - 0x1AE4, 0x7D24, - 0x1AB3, 0x7D2F, - 0x1A82, 0x7D39, - 0x1A51, 0x7D43, - 0x1A20, 0x7D4E, - 0x19EF, 0x7D58, - 0x19BD, 0x7D62, - 0x198C, 0x7D6C, - 0x195B, 0x7D76, - 0x192A, 0x7D80, - 0x18F8, 0x7D8A, - 0x18C7, 0x7D94, - 0x1896, 0x7D9D, - 0x1864, 0x7DA7, - 0x1833, 0x7DB0, - 0x1802, 0x7DBA, - 0x17D0, 0x7DC3, - 0x179F, 0x7DCD, - 0x176D, 0x7DD6, - 0x173C, 0x7DDF, - 0x170A, 0x7DE8, - 0x16D9, 0x7DF1, - 0x16A8, 0x7DFA, - 0x1676, 0x7E03, - 0x1645, 0x7E0C, - 0x1613, 0x7E14, - 0x15E2, 0x7E1D, - 0x15B0, 0x7E26, - 0x157F, 0x7E2E, - 0x154D, 0x7E37, - 0x151B, 0x7E3F, - 0x14EA, 0x7E47, - 0x14B8, 0x7E4F, - 0x1487, 0x7E57, - 0x1455, 0x7E5F, - 0x1423, 0x7E67, - 0x13F2, 0x7E6F, - 0x13C0, 0x7E77, - 0x138E, 0x7E7F, - 0x135D, 0x7E86, - 0x132B, 0x7E8E, - 0x12F9, 0x7E95, - 0x12C8, 0x7E9D, - 0x1296, 0x7EA4, - 0x1264, 0x7EAB, - 0x1232, 0x7EB3, - 0x1201, 0x7EBA, - 0x11CF, 0x7EC1, - 0x119D, 0x7EC8, - 0x116B, 0x7ECF, - 0x1139, 0x7ED5, - 0x1108, 0x7EDC, - 0x10D6, 0x7EE3, - 0x10A4, 0x7EE9, - 0x1072, 0x7EF0, - 0x1040, 0x7EF6, - 0x100E, 0x7EFD, - 0x0FDD, 0x7F03, - 0x0FAB, 0x7F09, - 0x0F79, 0x7F0F, - 0x0F47, 0x7F15, - 0x0F15, 0x7F1B, - 0x0EE3, 0x7F21, - 0x0EB1, 0x7F27, - 0x0E7F, 0x7F2D, - 0x0E4D, 0x7F32, - 0x0E1B, 0x7F38, - 0x0DE9, 0x7F3D, - 0x0DB7, 0x7F43, - 0x0D85, 0x7F48, - 0x0D53, 0x7F4D, - 0x0D21, 0x7F53, - 0x0CEF, 0x7F58, - 0x0CBD, 0x7F5D, - 0x0C8B, 0x7F62, - 0x0C59, 0x7F67, - 0x0C27, 0x7F6B, - 0x0BF5, 0x7F70, - 0x0BC3, 0x7F75, - 0x0B91, 0x7F79, - 0x0B5F, 0x7F7E, - 0x0B2D, 0x7F82, - 0x0AFB, 0x7F87, - 0x0AC9, 0x7F8B, - 0x0A97, 0x7F8F, - 0x0A65, 0x7F93, - 0x0A33, 0x7F97, - 0x0A00, 0x7F9B, - 0x09CE, 0x7F9F, - 0x099C, 0x7FA3, - 0x096A, 0x7FA7, - 0x0938, 0x7FAA, - 0x0906, 0x7FAE, - 0x08D4, 0x7FB1, - 0x08A2, 0x7FB5, - 0x086F, 0x7FB8, - 0x083D, 0x7FBC, - 0x080B, 0x7FBF, - 0x07D9, 0x7FC2, - 0x07A7, 0x7FC5, - 0x0775, 0x7FC8, - 0x0742, 0x7FCB, - 0x0710, 0x7FCE, - 0x06DE, 0x7FD0, - 0x06AC, 0x7FD3, - 0x067A, 0x7FD6, - 0x0647, 0x7FD8, - 0x0615, 0x7FDA, - 0x05E3, 0x7FDD, - 0x05B1, 0x7FDF, - 0x057F, 0x7FE1, - 0x054C, 0x7FE3, - 0x051A, 0x7FE5, - 0x04E8, 0x7FE7, - 0x04B6, 0x7FE9, - 0x0483, 0x7FEB, - 0x0451, 0x7FED, - 0x041F, 0x7FEE, - 0x03ED, 0x7FF0, - 0x03BA, 0x7FF2, - 0x0388, 0x7FF3, - 0x0356, 0x7FF4, - 0x0324, 0x7FF6, - 0x02F1, 0x7FF7, - 0x02BF, 0x7FF8, - 0x028D, 0x7FF9, - 0x025B, 0x7FFA, - 0x0228, 0x7FFB, - 0x01F6, 0x7FFC, - 0x01C4, 0x7FFC, - 0x0192, 0x7FFD, - 0x015F, 0x7FFE, - 0x012D, 0x7FFE, - 0x00FB, 0x7FFF, - 0x00C9, 0x7FFF, - 0x0096, 0x7FFF, - 0x0064, 0x7FFF, - 0x0032, 0x7FFF, - 0x0000, 0x7FFF, - 0xFFCD, 0x7FFF, - 0xFF9B, 0x7FFF, - 0xFF69, 0x7FFF, - 0xFF36, 0x7FFF, - 0xFF04, 0x7FFF, - 0xFED2, 0x7FFE, - 0xFEA0, 0x7FFE, - 0xFE6D, 0x7FFD, - 0xFE3B, 0x7FFC, - 0xFE09, 0x7FFC, - 0xFDD7, 0x7FFB, - 0xFDA4, 0x7FFA, - 0xFD72, 0x7FF9, - 0xFD40, 0x7FF8, - 0xFD0E, 0x7FF7, - 0xFCDB, 0x7FF6, - 0xFCA9, 0x7FF4, - 0xFC77, 0x7FF3, - 0xFC45, 0x7FF2, - 0xFC12, 0x7FF0, - 0xFBE0, 0x7FEE, - 0xFBAE, 0x7FED, - 0xFB7C, 0x7FEB, - 0xFB49, 0x7FE9, - 0xFB17, 0x7FE7, - 0xFAE5, 0x7FE5, - 0xFAB3, 0x7FE3, - 0xFA80, 0x7FE1, - 0xFA4E, 0x7FDF, - 0xFA1C, 0x7FDD, - 0xF9EA, 0x7FDA, - 0xF9B8, 0x7FD8, - 0xF985, 0x7FD6, - 0xF953, 0x7FD3, - 0xF921, 0x7FD0, - 0xF8EF, 0x7FCE, - 0xF8BD, 0x7FCB, - 0xF88A, 0x7FC8, - 0xF858, 0x7FC5, - 0xF826, 0x7FC2, - 0xF7F4, 0x7FBF, - 0xF7C2, 0x7FBC, - 0xF790, 0x7FB8, - 0xF75D, 0x7FB5, - 0xF72B, 0x7FB1, - 0xF6F9, 0x7FAE, - 0xF6C7, 0x7FAA, - 0xF695, 0x7FA7, - 0xF663, 0x7FA3, - 0xF631, 0x7F9F, - 0xF5FF, 0x7F9B, - 0xF5CC, 0x7F97, - 0xF59A, 0x7F93, - 0xF568, 0x7F8F, - 0xF536, 0x7F8B, - 0xF504, 0x7F87, - 0xF4D2, 0x7F82, - 0xF4A0, 0x7F7E, - 0xF46E, 0x7F79, - 0xF43C, 0x7F75, - 0xF40A, 0x7F70, - 0xF3D8, 0x7F6B, - 0xF3A6, 0x7F67, - 0xF374, 0x7F62, - 0xF342, 0x7F5D, - 0xF310, 0x7F58, - 0xF2DE, 0x7F53, - 0xF2AC, 0x7F4D, - 0xF27A, 0x7F48, - 0xF248, 0x7F43, - 0xF216, 0x7F3D, - 0xF1E4, 0x7F38, - 0xF1B2, 0x7F32, - 0xF180, 0x7F2D, - 0xF14E, 0x7F27, - 0xF11C, 0x7F21, - 0xF0EA, 0x7F1B, - 0xF0B8, 0x7F15, - 0xF086, 0x7F0F, - 0xF054, 0x7F09, - 0xF022, 0x7F03, - 0xEFF1, 0x7EFD, - 0xEFBF, 0x7EF6, - 0xEF8D, 0x7EF0, - 0xEF5B, 0x7EE9, - 0xEF29, 0x7EE3, - 0xEEF7, 0x7EDC, - 0xEEC6, 0x7ED5, - 0xEE94, 0x7ECF, - 0xEE62, 0x7EC8, - 0xEE30, 0x7EC1, - 0xEDFE, 0x7EBA, - 0xEDCD, 0x7EB3, - 0xED9B, 0x7EAB, - 0xED69, 0x7EA4, - 0xED37, 0x7E9D, - 0xED06, 0x7E95, - 0xECD4, 0x7E8E, - 0xECA2, 0x7E86, - 0xEC71, 0x7E7F, - 0xEC3F, 0x7E77, - 0xEC0D, 0x7E6F, - 0xEBDC, 0x7E67, - 0xEBAA, 0x7E5F, - 0xEB78, 0x7E57, - 0xEB47, 0x7E4F, - 0xEB15, 0x7E47, - 0xEAE4, 0x7E3F, - 0xEAB2, 0x7E37, - 0xEA80, 0x7E2E, - 0xEA4F, 0x7E26, - 0xEA1D, 0x7E1D, - 0xE9EC, 0x7E14, - 0xE9BA, 0x7E0C, - 0xE989, 0x7E03, - 0xE957, 0x7DFA, - 0xE926, 0x7DF1, - 0xE8F5, 0x7DE8, - 0xE8C3, 0x7DDF, - 0xE892, 0x7DD6, - 0xE860, 0x7DCD, - 0xE82F, 0x7DC3, - 0xE7FD, 0x7DBA, - 0xE7CC, 0x7DB0, - 0xE79B, 0x7DA7, - 0xE769, 0x7D9D, - 0xE738, 0x7D94, - 0xE707, 0x7D8A, - 0xE6D5, 0x7D80, - 0xE6A4, 0x7D76, - 0xE673, 0x7D6C, - 0xE642, 0x7D62, - 0xE610, 0x7D58, - 0xE5DF, 0x7D4E, - 0xE5AE, 0x7D43, - 0xE57D, 0x7D39, - 0xE54C, 0x7D2F, - 0xE51B, 0x7D24, - 0xE4E9, 0x7D19, - 0xE4B8, 0x7D0F, - 0xE487, 0x7D04, - 0xE456, 0x7CF9, - 0xE425, 0x7CEE, - 0xE3F4, 0x7CE3, - 0xE3C3, 0x7CD8, - 0xE392, 0x7CCD, - 0xE361, 0x7CC2, - 0xE330, 0x7CB7, - 0xE2FF, 0x7CAB, - 0xE2CE, 0x7CA0, - 0xE29D, 0x7C94, - 0xE26C, 0x7C89, - 0xE23B, 0x7C7D, - 0xE20A, 0x7C71, - 0xE1DA, 0x7C66, - 0xE1A9, 0x7C5A, - 0xE178, 0x7C4E, - 0xE147, 0x7C42, - 0xE116, 0x7C36, - 0xE0E6, 0x7C29, - 0xE0B5, 0x7C1D, - 0xE084, 0x7C11, - 0xE053, 0x7C05, - 0xE023, 0x7BF8, - 0xDFF2, 0x7BEB, - 0xDFC1, 0x7BDF, - 0xDF91, 0x7BD2, - 0xDF60, 0x7BC5, - 0xDF2F, 0x7BB9, - 0xDEFF, 0x7BAC, - 0xDECE, 0x7B9F, - 0xDE9E, 0x7B92, - 0xDE6D, 0x7B84, - 0xDE3D, 0x7B77, - 0xDE0C, 0x7B6A, - 0xDDDC, 0x7B5D, - 0xDDAB, 0x7B4F, - 0xDD7B, 0x7B42, - 0xDD4B, 0x7B34, - 0xDD1A, 0x7B26, - 0xDCEA, 0x7B19, - 0xDCBA, 0x7B0B, - 0xDC89, 0x7AFD, - 0xDC59, 0x7AEF, - 0xDC29, 0x7AE1, - 0xDBF8, 0x7AD3, - 0xDBC8, 0x7AC5, - 0xDB98, 0x7AB6, - 0xDB68, 0x7AA8, - 0xDB38, 0x7A9A, - 0xDB08, 0x7A8B, - 0xDAD7, 0x7A7D, - 0xDAA7, 0x7A6E, - 0xDA77, 0x7A5F, - 0xDA47, 0x7A50, - 0xDA17, 0x7A42, - 0xD9E7, 0x7A33, - 0xD9B7, 0x7A24, - 0xD987, 0x7A15, - 0xD957, 0x7A05, - 0xD927, 0x79F6, - 0xD8F8, 0x79E7, - 0xD8C8, 0x79D8, - 0xD898, 0x79C8, - 0xD868, 0x79B9, - 0xD838, 0x79A9, - 0xD809, 0x7999, - 0xD7D9, 0x798A, - 0xD7A9, 0x797A, - 0xD779, 0x796A, - 0xD74A, 0x795A, - 0xD71A, 0x794A, - 0xD6EA, 0x793A, - 0xD6BB, 0x792A, - 0xD68B, 0x7919, - 0xD65C, 0x7909, - 0xD62C, 0x78F9, - 0xD5FD, 0x78E8, - 0xD5CD, 0x78D8, - 0xD59E, 0x78C7, - 0xD56E, 0x78B6, - 0xD53F, 0x78A6, - 0xD510, 0x7895, - 0xD4E0, 0x7884, - 0xD4B1, 0x7873, - 0xD482, 0x7862, - 0xD452, 0x7851, - 0xD423, 0x7840, - 0xD3F4, 0x782E, - 0xD3C5, 0x781D, - 0xD396, 0x780C, - 0xD367, 0x77FA, - 0xD337, 0x77E9, - 0xD308, 0x77D7, - 0xD2D9, 0x77C5, - 0xD2AA, 0x77B4, - 0xD27B, 0x77A2, - 0xD24C, 0x7790, - 0xD21D, 0x777E, - 0xD1EE, 0x776C, - 0xD1C0, 0x775A, - 0xD191, 0x7747, - 0xD162, 0x7735, - 0xD133, 0x7723, - 0xD104, 0x7710, - 0xD0D6, 0x76FE, - 0xD0A7, 0x76EB, - 0xD078, 0x76D9, - 0xD04A, 0x76C6, - 0xD01B, 0x76B3, - 0xCFEC, 0x76A0, - 0xCFBE, 0x768E, - 0xCF8F, 0x767B, - 0xCF61, 0x7668, - 0xCF32, 0x7654, - 0xCF04, 0x7641, - 0xCED5, 0x762E, - 0xCEA7, 0x761B, - 0xCE79, 0x7607, - 0xCE4A, 0x75F4, - 0xCE1C, 0x75E0, - 0xCDEE, 0x75CC, - 0xCDBF, 0x75B9, - 0xCD91, 0x75A5, - 0xCD63, 0x7591, - 0xCD35, 0x757D, - 0xCD07, 0x7569, - 0xCCD9, 0x7555, - 0xCCAB, 0x7541, - 0xCC7D, 0x752D, - 0xCC4F, 0x7519, - 0xCC21, 0x7504, - 0xCBF3, 0x74F0, - 0xCBC5, 0x74DB, - 0xCB97, 0x74C7, - 0xCB69, 0x74B2, - 0xCB3B, 0x749E, - 0xCB0D, 0x7489, - 0xCAE0, 0x7474, - 0xCAB2, 0x745F, - 0xCA84, 0x744A, - 0xCA57, 0x7435, - 0xCA29, 0x7420, - 0xC9FB, 0x740B, - 0xC9CE, 0x73F6, - 0xC9A0, 0x73E0, - 0xC973, 0x73CB, - 0xC945, 0x73B5, - 0xC918, 0x73A0, - 0xC8EB, 0x738A, - 0xC8BD, 0x7375, - 0xC890, 0x735F, - 0xC863, 0x7349, - 0xC835, 0x7333, - 0xC808, 0x731D, - 0xC7DB, 0x7307, - 0xC7AE, 0x72F1, - 0xC781, 0x72DB, - 0xC754, 0x72C5, - 0xC727, 0x72AF, - 0xC6F9, 0x7298, - 0xC6CD, 0x7282, - 0xC6A0, 0x726B, - 0xC673, 0x7255, - 0xC646, 0x723E, - 0xC619, 0x7227, - 0xC5EC, 0x7211, - 0xC5BF, 0x71FA, - 0xC593, 0x71E3, - 0xC566, 0x71CC, - 0xC539, 0x71B5, - 0xC50D, 0x719E, - 0xC4E0, 0x7186, - 0xC4B3, 0x716F, - 0xC487, 0x7158, - 0xC45A, 0x7141, - 0xC42E, 0x7129, - 0xC402, 0x7112, - 0xC3D5, 0x70FA, - 0xC3A9, 0x70E2, - 0xC37C, 0x70CB, - 0xC350, 0x70B3, - 0xC324, 0x709B, - 0xC2F8, 0x7083, - 0xC2CC, 0x706B, - 0xC29F, 0x7053, - 0xC273, 0x703B, - 0xC247, 0x7023, - 0xC21B, 0x700A, - 0xC1EF, 0x6FF2, - 0xC1C3, 0x6FDA, - 0xC197, 0x6FC1, - 0xC16C, 0x6FA9, - 0xC140, 0x6F90, - 0xC114, 0x6F77, - 0xC0E8, 0x6F5F, - 0xC0BC, 0x6F46, - 0xC091, 0x6F2D, - 0xC065, 0x6F14, - 0xC03A, 0x6EFB, - 0xC00E, 0x6EE2, - 0xBFE2, 0x6EC9, - 0xBFB7, 0x6EAF, - 0xBF8C, 0x6E96, - 0xBF60, 0x6E7D, - 0xBF35, 0x6E63, - 0xBF09, 0x6E4A, - 0xBEDE, 0x6E30, - 0xBEB3, 0x6E17, - 0xBE88, 0x6DFD, - 0xBE5D, 0x6DE3, - 0xBE31, 0x6DCA, - 0xBE06, 0x6DB0, - 0xBDDB, 0x6D96, - 0xBDB0, 0x6D7C, - 0xBD85, 0x6D62, - 0xBD5A, 0x6D48, - 0xBD2F, 0x6D2D, - 0xBD05, 0x6D13, - 0xBCDA, 0x6CF9, - 0xBCAF, 0x6CDE, - 0xBC84, 0x6CC4, - 0xBC5A, 0x6CA9, - 0xBC2F, 0x6C8F, - 0xBC04, 0x6C74, - 0xBBDA, 0x6C59, - 0xBBAF, 0x6C3F, - 0xBB85, 0x6C24, - 0xBB5A, 0x6C09, - 0xBB30, 0x6BEE, - 0xBB05, 0x6BD3, - 0xBADB, 0x6BB8, - 0xBAB1, 0x6B9C, - 0xBA87, 0x6B81, - 0xBA5C, 0x6B66, - 0xBA32, 0x6B4A, - 0xBA08, 0x6B2F, - 0xB9DE, 0x6B13, - 0xB9B4, 0x6AF8, - 0xB98A, 0x6ADC, - 0xB960, 0x6AC1, - 0xB936, 0x6AA5, - 0xB90C, 0x6A89, - 0xB8E3, 0x6A6D, - 0xB8B9, 0x6A51, - 0xB88F, 0x6A35, - 0xB865, 0x6A19, - 0xB83C, 0x69FD, - 0xB812, 0x69E1, - 0xB7E9, 0x69C4, - 0xB7BF, 0x69A8, - 0xB796, 0x698C, - 0xB76C, 0x696F, - 0xB743, 0x6953, - 0xB719, 0x6936, - 0xB6F0, 0x6919, - 0xB6C7, 0x68FD, - 0xB69E, 0x68E0, - 0xB675, 0x68C3, - 0xB64B, 0x68A6, - 0xB622, 0x6889, - 0xB5F9, 0x686C, - 0xB5D0, 0x684F, - 0xB5A7, 0x6832, - 0xB57E, 0x6815, - 0xB556, 0x67F7, - 0xB52D, 0x67DA, - 0xB504, 0x67BD, - 0xB4DB, 0x679F, - 0xB4B3, 0x6782, - 0xB48A, 0x6764, - 0xB461, 0x6746, - 0xB439, 0x6729, - 0xB410, 0x670B, - 0xB3E8, 0x66ED, - 0xB3C0, 0x66CF, - 0xB397, 0x66B1, - 0xB36F, 0x6693, - 0xB347, 0x6675, - 0xB31E, 0x6657, - 0xB2F6, 0x6639, - 0xB2CE, 0x661A, - 0xB2A6, 0x65FC, - 0xB27E, 0x65DD, - 0xB256, 0x65BF, - 0xB22E, 0x65A0, - 0xB206, 0x6582, - 0xB1DE, 0x6563, - 0xB1B7, 0x6545, - 0xB18F, 0x6526, - 0xB167, 0x6507, - 0xB140, 0x64E8, - 0xB118, 0x64C9, - 0xB0F0, 0x64AA, - 0xB0C9, 0x648B, - 0xB0A1, 0x646C, - 0xB07A, 0x644D, - 0xB053, 0x642D, - 0xB02B, 0x640E, - 0xB004, 0x63EF, - 0xAFDD, 0x63CF, - 0xAFB6, 0x63B0, - 0xAF8F, 0x6390, - 0xAF68, 0x6371, - 0xAF40, 0x6351, - 0xAF1A, 0x6331, - 0xAEF3, 0x6311, - 0xAECC, 0x62F2, - 0xAEA5, 0x62D2, - 0xAE7E, 0x62B2, - 0xAE57, 0x6292, - 0xAE31, 0x6271, - 0xAE0A, 0x6251, - 0xADE3, 0x6231, - 0xADBD, 0x6211, - 0xAD96, 0x61F1, - 0xAD70, 0x61D0, - 0xAD4A, 0x61B0, - 0xAD23, 0x618F, - 0xACFD, 0x616F, - 0xACD7, 0x614E, - 0xACB1, 0x612D, - 0xAC8A, 0x610D, - 0xAC64, 0x60EC, - 0xAC3E, 0x60CB, - 0xAC18, 0x60AA, - 0xABF2, 0x6089, - 0xABCC, 0x6068, - 0xABA7, 0x6047, - 0xAB81, 0x6026, - 0xAB5B, 0x6004, - 0xAB35, 0x5FE3, - 0xAB10, 0x5FC2, - 0xAAEA, 0x5FA0, - 0xAAC5, 0x5F7F, - 0xAA9F, 0x5F5E, - 0xAA7A, 0x5F3C, - 0xAA54, 0x5F1A, - 0xAA2F, 0x5EF9, - 0xAA0A, 0x5ED7, - 0xA9E5, 0x5EB5, - 0xA9BF, 0x5E93, - 0xA99A, 0x5E71, - 0xA975, 0x5E50, - 0xA950, 0x5E2D, - 0xA92B, 0x5E0B, - 0xA906, 0x5DE9, - 0xA8E2, 0x5DC7, - 0xA8BD, 0x5DA5, - 0xA898, 0x5D83, - 0xA873, 0x5D60, - 0xA84F, 0x5D3E, - 0xA82A, 0x5D1B, - 0xA806, 0x5CF9, - 0xA7E1, 0x5CD6, - 0xA7BD, 0x5CB4, - 0xA798, 0x5C91, - 0xA774, 0x5C6E, - 0xA750, 0x5C4B, - 0xA72B, 0x5C29, - 0xA707, 0x5C06, - 0xA6E3, 0x5BE3, - 0xA6BF, 0x5BC0, - 0xA69B, 0x5B9D, - 0xA677, 0x5B79, - 0xA653, 0x5B56, - 0xA62F, 0x5B33, - 0xA60C, 0x5B10, - 0xA5E8, 0x5AEC, - 0xA5C4, 0x5AC9, - 0xA5A1, 0x5AA5, - 0xA57D, 0x5A82, - 0xA55A, 0x5A5E, - 0xA536, 0x5A3B, - 0xA513, 0x5A17, - 0xA4EF, 0x59F3, - 0xA4CC, 0x59D0, - 0xA4A9, 0x59AC, - 0xA486, 0x5988, - 0xA462, 0x5964, - 0xA43F, 0x5940, - 0xA41C, 0x591C, - 0xA3F9, 0x58F8, - 0xA3D6, 0x58D4, - 0xA3B4, 0x58AF, - 0xA391, 0x588B, - 0xA36E, 0x5867, - 0xA34B, 0x5842, - 0xA329, 0x581E, - 0xA306, 0x57F9, - 0xA2E4, 0x57D5, - 0xA2C1, 0x57B0, - 0xA29F, 0x578C, - 0xA27C, 0x5767, - 0xA25A, 0x5742, - 0xA238, 0x571D, - 0xA216, 0x56F9, - 0xA1F4, 0x56D4, - 0xA1D2, 0x56AF, - 0xA1AF, 0x568A, - 0xA18E, 0x5665, - 0xA16C, 0x5640, - 0xA14A, 0x561A, - 0xA128, 0x55F5, - 0xA106, 0x55D0, - 0xA0E5, 0x55AB, - 0xA0C3, 0x5585, - 0xA0A1, 0x5560, - 0xA080, 0x553A, - 0xA05F, 0x5515, - 0xA03D, 0x54EF, - 0xA01C, 0x54CA, - 0x9FFB, 0x54A4, - 0x9FD9, 0x547E, - 0x9FB8, 0x5458, - 0x9F97, 0x5433, - 0x9F76, 0x540D, - 0x9F55, 0x53E7, - 0x9F34, 0x53C1, - 0x9F13, 0x539B, - 0x9EF2, 0x5375, - 0x9ED2, 0x534E, - 0x9EB1, 0x5328, - 0x9E90, 0x5302, - 0x9E70, 0x52DC, - 0x9E4F, 0x52B5, - 0x9E2F, 0x528F, - 0x9E0E, 0x5269, - 0x9DEE, 0x5242, - 0x9DCE, 0x521C, - 0x9DAE, 0x51F5, - 0x9D8E, 0x51CE, - 0x9D6D, 0x51A8, - 0x9D4D, 0x5181, - 0x9D2D, 0x515A, - 0x9D0D, 0x5133, - 0x9CEE, 0x510C, - 0x9CCE, 0x50E5, - 0x9CAE, 0x50BF, - 0x9C8E, 0x5097, - 0x9C6F, 0x5070, - 0x9C4F, 0x5049, - 0x9C30, 0x5022, - 0x9C10, 0x4FFB, - 0x9BF1, 0x4FD4, - 0x9BD2, 0x4FAC, - 0x9BB2, 0x4F85, - 0x9B93, 0x4F5E, - 0x9B74, 0x4F36, - 0x9B55, 0x4F0F, - 0x9B36, 0x4EE7, - 0x9B17, 0x4EBF, - 0x9AF8, 0x4E98, - 0x9AD9, 0x4E70, - 0x9ABA, 0x4E48, - 0x9A9C, 0x4E21, - 0x9A7D, 0x4DF9, - 0x9A5F, 0x4DD1, - 0x9A40, 0x4DA9, - 0x9A22, 0x4D81, - 0x9A03, 0x4D59, - 0x99E5, 0x4D31, - 0x99C6, 0x4D09, - 0x99A8, 0x4CE1, - 0x998A, 0x4CB8, - 0x996C, 0x4C90, - 0x994E, 0x4C68, - 0x9930, 0x4C3F, - 0x9912, 0x4C17, - 0x98F4, 0x4BEF, - 0x98D6, 0x4BC6, - 0x98B9, 0x4B9E, - 0x989B, 0x4B75, - 0x987D, 0x4B4C, - 0x9860, 0x4B24, - 0x9842, 0x4AFB, - 0x9825, 0x4AD2, - 0x9808, 0x4AA9, - 0x97EA, 0x4A81, - 0x97CD, 0x4A58, - 0x97B0, 0x4A2F, - 0x9793, 0x4A06, - 0x9776, 0x49DD, - 0x9759, 0x49B4, - 0x973C, 0x498A, - 0x971F, 0x4961, - 0x9702, 0x4938, - 0x96E6, 0x490F, - 0x96C9, 0x48E6, - 0x96AC, 0x48BC, - 0x9690, 0x4893, - 0x9673, 0x4869, - 0x9657, 0x4840, - 0x963B, 0x4816, - 0x961E, 0x47ED, - 0x9602, 0x47C3, - 0x95E6, 0x479A, - 0x95CA, 0x4770, - 0x95AE, 0x4746, - 0x9592, 0x471C, - 0x9576, 0x46F3, - 0x955A, 0x46C9, - 0x953E, 0x469F, - 0x9523, 0x4675, - 0x9507, 0x464B, - 0x94EC, 0x4621, - 0x94D0, 0x45F7, - 0x94B5, 0x45CD, - 0x9499, 0x45A3, - 0x947E, 0x4578, - 0x9463, 0x454E, - 0x9447, 0x4524, - 0x942C, 0x44FA, - 0x9411, 0x44CF, - 0x93F6, 0x44A5, - 0x93DB, 0x447A, - 0x93C0, 0x4450, - 0x93A6, 0x4425, - 0x938B, 0x43FB, - 0x9370, 0x43D0, - 0x9356, 0x43A5, - 0x933B, 0x437B, - 0x9321, 0x4350, - 0x9306, 0x4325, - 0x92EC, 0x42FA, - 0x92D2, 0x42D0, - 0x92B7, 0x42A5, - 0x929D, 0x427A, - 0x9283, 0x424F, - 0x9269, 0x4224, - 0x924F, 0x41F9, - 0x9235, 0x41CE, - 0x921C, 0x41A2, - 0x9202, 0x4177, - 0x91E8, 0x414C, - 0x91CF, 0x4121, - 0x91B5, 0x40F6, - 0x919C, 0x40CA, - 0x9182, 0x409F, - 0x9169, 0x4073, - 0x9150, 0x4048, - 0x9136, 0x401D, - 0x911D, 0x3FF1, - 0x9104, 0x3FC5, - 0x90EB, 0x3F9A, - 0x90D2, 0x3F6E, - 0x90B9, 0x3F43, - 0x90A0, 0x3F17, - 0x9088, 0x3EEB, - 0x906F, 0x3EBF, - 0x9056, 0x3E93, - 0x903E, 0x3E68, - 0x9025, 0x3E3C, - 0x900D, 0x3E10, - 0x8FF5, 0x3DE4, - 0x8FDC, 0x3DB8, - 0x8FC4, 0x3D8C, - 0x8FAC, 0x3D60, - 0x8F94, 0x3D33, - 0x8F7C, 0x3D07, - 0x8F64, 0x3CDB, - 0x8F4C, 0x3CAF, - 0x8F34, 0x3C83, - 0x8F1D, 0x3C56, - 0x8F05, 0x3C2A, - 0x8EED, 0x3BFD, - 0x8ED6, 0x3BD1, - 0x8EBE, 0x3BA5, - 0x8EA7, 0x3B78, - 0x8E90, 0x3B4C, - 0x8E79, 0x3B1F, - 0x8E61, 0x3AF2, - 0x8E4A, 0x3AC6, - 0x8E33, 0x3A99, - 0x8E1C, 0x3A6C, - 0x8E05, 0x3A40, - 0x8DEE, 0x3A13, - 0x8DD8, 0x39E6, - 0x8DC1, 0x39B9, - 0x8DAA, 0x398C, - 0x8D94, 0x395F, - 0x8D7D, 0x3932, - 0x8D67, 0x3906, - 0x8D50, 0x38D8, - 0x8D3A, 0x38AB, - 0x8D24, 0x387E, - 0x8D0E, 0x3851, - 0x8CF8, 0x3824, - 0x8CE2, 0x37F7, - 0x8CCC, 0x37CA, - 0x8CB6, 0x379C, - 0x8CA0, 0x376F, - 0x8C8A, 0x3742, - 0x8C75, 0x3714, - 0x8C5F, 0x36E7, - 0x8C4A, 0x36BA, - 0x8C34, 0x368C, - 0x8C1F, 0x365F, - 0x8C09, 0x3631, - 0x8BF4, 0x3604, - 0x8BDF, 0x35D6, - 0x8BCA, 0x35A8, - 0x8BB5, 0x357B, - 0x8BA0, 0x354D, - 0x8B8B, 0x351F, - 0x8B76, 0x34F2, - 0x8B61, 0x34C4, - 0x8B4D, 0x3496, - 0x8B38, 0x3468, - 0x8B24, 0x343A, - 0x8B0F, 0x340C, - 0x8AFB, 0x33DE, - 0x8AE6, 0x33B0, - 0x8AD2, 0x3382, - 0x8ABE, 0x3354, - 0x8AAA, 0x3326, - 0x8A96, 0x32F8, - 0x8A82, 0x32CA, - 0x8A6E, 0x329C, - 0x8A5A, 0x326E, - 0x8A46, 0x3240, - 0x8A33, 0x3211, - 0x8A1F, 0x31E3, - 0x8A0B, 0x31B5, - 0x89F8, 0x3186, - 0x89E4, 0x3158, - 0x89D1, 0x312A, - 0x89BE, 0x30FB, - 0x89AB, 0x30CD, - 0x8997, 0x309E, - 0x8984, 0x3070, - 0x8971, 0x3041, - 0x895F, 0x3013, - 0x894C, 0x2FE4, - 0x8939, 0x2FB5, - 0x8926, 0x2F87, - 0x8914, 0x2F58, - 0x8901, 0x2F29, - 0x88EF, 0x2EFB, - 0x88DC, 0x2ECC, - 0x88CA, 0x2E9D, - 0x88B8, 0x2E6E, - 0x88A5, 0x2E3F, - 0x8893, 0x2E11, - 0x8881, 0x2DE2, - 0x886F, 0x2DB3, - 0x885D, 0x2D84, - 0x884B, 0x2D55, - 0x883A, 0x2D26, - 0x8828, 0x2CF7, - 0x8816, 0x2CC8, - 0x8805, 0x2C98, - 0x87F3, 0x2C69, - 0x87E2, 0x2C3A, - 0x87D1, 0x2C0B, - 0x87BF, 0x2BDC, - 0x87AE, 0x2BAD, - 0x879D, 0x2B7D, - 0x878C, 0x2B4E, - 0x877B, 0x2B1F, - 0x876A, 0x2AEF, - 0x8759, 0x2AC0, - 0x8749, 0x2A91, - 0x8738, 0x2A61, - 0x8727, 0x2A32, - 0x8717, 0x2A02, - 0x8706, 0x29D3, - 0x86F6, 0x29A3, - 0x86E6, 0x2974, - 0x86D5, 0x2944, - 0x86C5, 0x2915, - 0x86B5, 0x28E5, - 0x86A5, 0x28B5, - 0x8695, 0x2886, - 0x8685, 0x2856, - 0x8675, 0x2826, - 0x8666, 0x27F6, - 0x8656, 0x27C7, - 0x8646, 0x2797, - 0x8637, 0x2767, - 0x8627, 0x2737, - 0x8618, 0x2707, - 0x8609, 0x26D8, - 0x85FA, 0x26A8, - 0x85EA, 0x2678, - 0x85DB, 0x2648, - 0x85CC, 0x2618, - 0x85BD, 0x25E8, - 0x85AF, 0x25B8, - 0x85A0, 0x2588, - 0x8591, 0x2558, - 0x8582, 0x2528, - 0x8574, 0x24F7, - 0x8565, 0x24C7, - 0x8557, 0x2497, - 0x8549, 0x2467, - 0x853A, 0x2437, - 0x852C, 0x2407, - 0x851E, 0x23D6, - 0x8510, 0x23A6, - 0x8502, 0x2376, - 0x84F4, 0x2345, - 0x84E6, 0x2315, - 0x84D9, 0x22E5, - 0x84CB, 0x22B4, - 0x84BD, 0x2284, - 0x84B0, 0x2254, - 0x84A2, 0x2223, - 0x8495, 0x21F3, - 0x8488, 0x21C2, - 0x847B, 0x2192, - 0x846D, 0x2161, - 0x8460, 0x2131, - 0x8453, 0x2100, - 0x8446, 0x20D0, - 0x843A, 0x209F, - 0x842D, 0x206E, - 0x8420, 0x203E, - 0x8414, 0x200D, - 0x8407, 0x1FDC, - 0x83FA, 0x1FAC, - 0x83EE, 0x1F7B, - 0x83E2, 0x1F4A, - 0x83D6, 0x1F19, - 0x83C9, 0x1EE9, - 0x83BD, 0x1EB8, - 0x83B1, 0x1E87, - 0x83A5, 0x1E56, - 0x8399, 0x1E25, - 0x838E, 0x1DF5, - 0x8382, 0x1DC4, - 0x8376, 0x1D93, - 0x836B, 0x1D62, - 0x835F, 0x1D31, - 0x8354, 0x1D00, - 0x8348, 0x1CCF, - 0x833D, 0x1C9E, - 0x8332, 0x1C6D, - 0x8327, 0x1C3C, - 0x831C, 0x1C0B, - 0x8311, 0x1BDA, - 0x8306, 0x1BA9, - 0x82FB, 0x1B78, - 0x82F0, 0x1B47, - 0x82E6, 0x1B16, - 0x82DB, 0x1AE4, - 0x82D0, 0x1AB3, - 0x82C6, 0x1A82, - 0x82BC, 0x1A51, - 0x82B1, 0x1A20, - 0x82A7, 0x19EF, - 0x829D, 0x19BD, - 0x8293, 0x198C, - 0x8289, 0x195B, - 0x827F, 0x192A, - 0x8275, 0x18F8, - 0x826B, 0x18C7, - 0x8262, 0x1896, - 0x8258, 0x1864, - 0x824F, 0x1833, - 0x8245, 0x1802, - 0x823C, 0x17D0, - 0x8232, 0x179F, - 0x8229, 0x176D, - 0x8220, 0x173C, - 0x8217, 0x170A, - 0x820E, 0x16D9, - 0x8205, 0x16A8, - 0x81FC, 0x1676, - 0x81F3, 0x1645, - 0x81EB, 0x1613, - 0x81E2, 0x15E2, - 0x81D9, 0x15B0, - 0x81D1, 0x157F, - 0x81C8, 0x154D, - 0x81C0, 0x151B, - 0x81B8, 0x14EA, - 0x81B0, 0x14B8, - 0x81A8, 0x1487, - 0x81A0, 0x1455, - 0x8198, 0x1423, - 0x8190, 0x13F2, - 0x8188, 0x13C0, - 0x8180, 0x138E, - 0x8179, 0x135D, - 0x8171, 0x132B, - 0x816A, 0x12F9, - 0x8162, 0x12C8, - 0x815B, 0x1296, - 0x8154, 0x1264, - 0x814C, 0x1232, - 0x8145, 0x1201, - 0x813E, 0x11CF, - 0x8137, 0x119D, - 0x8130, 0x116B, - 0x812A, 0x1139, - 0x8123, 0x1108, - 0x811C, 0x10D6, - 0x8116, 0x10A4, - 0x810F, 0x1072, - 0x8109, 0x1040, - 0x8102, 0x100E, - 0x80FC, 0x0FDD, - 0x80F6, 0x0FAB, - 0x80F0, 0x0F79, - 0x80EA, 0x0F47, - 0x80E4, 0x0F15, - 0x80DE, 0x0EE3, - 0x80D8, 0x0EB1, - 0x80D2, 0x0E7F, - 0x80CD, 0x0E4D, - 0x80C7, 0x0E1B, - 0x80C2, 0x0DE9, - 0x80BC, 0x0DB7, - 0x80B7, 0x0D85, - 0x80B2, 0x0D53, - 0x80AC, 0x0D21, - 0x80A7, 0x0CEF, - 0x80A2, 0x0CBD, - 0x809D, 0x0C8B, - 0x8098, 0x0C59, - 0x8094, 0x0C27, - 0x808F, 0x0BF5, - 0x808A, 0x0BC3, - 0x8086, 0x0B91, - 0x8081, 0x0B5F, - 0x807D, 0x0B2D, - 0x8078, 0x0AFB, - 0x8074, 0x0AC9, - 0x8070, 0x0A97, - 0x806C, 0x0A65, - 0x8068, 0x0A33, - 0x8064, 0x0A00, - 0x8060, 0x09CE, - 0x805C, 0x099C, - 0x8058, 0x096A, - 0x8055, 0x0938, - 0x8051, 0x0906, - 0x804E, 0x08D4, - 0x804A, 0x08A2, - 0x8047, 0x086F, - 0x8043, 0x083D, - 0x8040, 0x080B, - 0x803D, 0x07D9, - 0x803A, 0x07A7, - 0x8037, 0x0775, - 0x8034, 0x0742, - 0x8031, 0x0710, - 0x802F, 0x06DE, - 0x802C, 0x06AC, - 0x8029, 0x067A, - 0x8027, 0x0647, - 0x8025, 0x0615, - 0x8022, 0x05E3, - 0x8020, 0x05B1, - 0x801E, 0x057F, - 0x801C, 0x054C, - 0x801A, 0x051A, - 0x8018, 0x04E8, - 0x8016, 0x04B6, - 0x8014, 0x0483, - 0x8012, 0x0451, - 0x8011, 0x041F, - 0x800F, 0x03ED, - 0x800D, 0x03BA, - 0x800C, 0x0388, - 0x800B, 0x0356, - 0x8009, 0x0324, - 0x8008, 0x02F1, - 0x8007, 0x02BF, - 0x8006, 0x028D, - 0x8005, 0x025B, - 0x8004, 0x0228, - 0x8003, 0x01F6, - 0x8003, 0x01C4, - 0x8002, 0x0192, - 0x8001, 0x015F, - 0x8001, 0x012D, - 0x8000, 0x00FB, - 0x8000, 0x00C9, - 0x8000, 0x0096, - 0x8000, 0x0064, - 0x8000, 0x0032, - 0x8000, 0x0000, - 0x8000, 0xFFCD, - 0x8000, 0xFF9B, - 0x8000, 0xFF69, - 0x8000, 0xFF36, - 0x8000, 0xFF04, - 0x8001, 0xFED2, - 0x8001, 0xFEA0, - 0x8002, 0xFE6D, - 0x8003, 0xFE3B, - 0x8003, 0xFE09, - 0x8004, 0xFDD7, - 0x8005, 0xFDA4, - 0x8006, 0xFD72, - 0x8007, 0xFD40, - 0x8008, 0xFD0E, - 0x8009, 0xFCDB, - 0x800B, 0xFCA9, - 0x800C, 0xFC77, - 0x800D, 0xFC45, - 0x800F, 0xFC12, - 0x8011, 0xFBE0, - 0x8012, 0xFBAE, - 0x8014, 0xFB7C, - 0x8016, 0xFB49, - 0x8018, 0xFB17, - 0x801A, 0xFAE5, - 0x801C, 0xFAB3, - 0x801E, 0xFA80, - 0x8020, 0xFA4E, - 0x8022, 0xFA1C, - 0x8025, 0xF9EA, - 0x8027, 0xF9B8, - 0x8029, 0xF985, - 0x802C, 0xF953, - 0x802F, 0xF921, - 0x8031, 0xF8EF, - 0x8034, 0xF8BD, - 0x8037, 0xF88A, - 0x803A, 0xF858, - 0x803D, 0xF826, - 0x8040, 0xF7F4, - 0x8043, 0xF7C2, - 0x8047, 0xF790, - 0x804A, 0xF75D, - 0x804E, 0xF72B, - 0x8051, 0xF6F9, - 0x8055, 0xF6C7, - 0x8058, 0xF695, - 0x805C, 0xF663, - 0x8060, 0xF631, - 0x8064, 0xF5FF, - 0x8068, 0xF5CC, - 0x806C, 0xF59A, - 0x8070, 0xF568, - 0x8074, 0xF536, - 0x8078, 0xF504, - 0x807D, 0xF4D2, - 0x8081, 0xF4A0, - 0x8086, 0xF46E, - 0x808A, 0xF43C, - 0x808F, 0xF40A, - 0x8094, 0xF3D8, - 0x8098, 0xF3A6, - 0x809D, 0xF374, - 0x80A2, 0xF342, - 0x80A7, 0xF310, - 0x80AC, 0xF2DE, - 0x80B2, 0xF2AC, - 0x80B7, 0xF27A, - 0x80BC, 0xF248, - 0x80C2, 0xF216, - 0x80C7, 0xF1E4, - 0x80CD, 0xF1B2, - 0x80D2, 0xF180, - 0x80D8, 0xF14E, - 0x80DE, 0xF11C, - 0x80E4, 0xF0EA, - 0x80EA, 0xF0B8, - 0x80F0, 0xF086, - 0x80F6, 0xF054, - 0x80FC, 0xF022, - 0x8102, 0xEFF1, - 0x8109, 0xEFBF, - 0x810F, 0xEF8D, - 0x8116, 0xEF5B, - 0x811C, 0xEF29, - 0x8123, 0xEEF7, - 0x812A, 0xEEC6, - 0x8130, 0xEE94, - 0x8137, 0xEE62, - 0x813E, 0xEE30, - 0x8145, 0xEDFE, - 0x814C, 0xEDCD, - 0x8154, 0xED9B, - 0x815B, 0xED69, - 0x8162, 0xED37, - 0x816A, 0xED06, - 0x8171, 0xECD4, - 0x8179, 0xECA2, - 0x8180, 0xEC71, - 0x8188, 0xEC3F, - 0x8190, 0xEC0D, - 0x8198, 0xEBDC, - 0x81A0, 0xEBAA, - 0x81A8, 0xEB78, - 0x81B0, 0xEB47, - 0x81B8, 0xEB15, - 0x81C0, 0xEAE4, - 0x81C8, 0xEAB2, - 0x81D1, 0xEA80, - 0x81D9, 0xEA4F, - 0x81E2, 0xEA1D, - 0x81EB, 0xE9EC, - 0x81F3, 0xE9BA, - 0x81FC, 0xE989, - 0x8205, 0xE957, - 0x820E, 0xE926, - 0x8217, 0xE8F5, - 0x8220, 0xE8C3, - 0x8229, 0xE892, - 0x8232, 0xE860, - 0x823C, 0xE82F, - 0x8245, 0xE7FD, - 0x824F, 0xE7CC, - 0x8258, 0xE79B, - 0x8262, 0xE769, - 0x826B, 0xE738, - 0x8275, 0xE707, - 0x827F, 0xE6D5, - 0x8289, 0xE6A4, - 0x8293, 0xE673, - 0x829D, 0xE642, - 0x82A7, 0xE610, - 0x82B1, 0xE5DF, - 0x82BC, 0xE5AE, - 0x82C6, 0xE57D, - 0x82D0, 0xE54C, - 0x82DB, 0xE51B, - 0x82E6, 0xE4E9, - 0x82F0, 0xE4B8, - 0x82FB, 0xE487, - 0x8306, 0xE456, - 0x8311, 0xE425, - 0x831C, 0xE3F4, - 0x8327, 0xE3C3, - 0x8332, 0xE392, - 0x833D, 0xE361, - 0x8348, 0xE330, - 0x8354, 0xE2FF, - 0x835F, 0xE2CE, - 0x836B, 0xE29D, - 0x8376, 0xE26C, - 0x8382, 0xE23B, - 0x838E, 0xE20A, - 0x8399, 0xE1DA, - 0x83A5, 0xE1A9, - 0x83B1, 0xE178, - 0x83BD, 0xE147, - 0x83C9, 0xE116, - 0x83D6, 0xE0E6, - 0x83E2, 0xE0B5, - 0x83EE, 0xE084, - 0x83FA, 0xE053, - 0x8407, 0xE023, - 0x8414, 0xDFF2, - 0x8420, 0xDFC1, - 0x842D, 0xDF91, - 0x843A, 0xDF60, - 0x8446, 0xDF2F, - 0x8453, 0xDEFF, - 0x8460, 0xDECE, - 0x846D, 0xDE9E, - 0x847B, 0xDE6D, - 0x8488, 0xDE3D, - 0x8495, 0xDE0C, - 0x84A2, 0xDDDC, - 0x84B0, 0xDDAB, - 0x84BD, 0xDD7B, - 0x84CB, 0xDD4B, - 0x84D9, 0xDD1A, - 0x84E6, 0xDCEA, - 0x84F4, 0xDCBA, - 0x8502, 0xDC89, - 0x8510, 0xDC59, - 0x851E, 0xDC29, - 0x852C, 0xDBF8, - 0x853A, 0xDBC8, - 0x8549, 0xDB98, - 0x8557, 0xDB68, - 0x8565, 0xDB38, - 0x8574, 0xDB08, - 0x8582, 0xDAD7, - 0x8591, 0xDAA7, - 0x85A0, 0xDA77, - 0x85AF, 0xDA47, - 0x85BD, 0xDA17, - 0x85CC, 0xD9E7, - 0x85DB, 0xD9B7, - 0x85EA, 0xD987, - 0x85FA, 0xD957, - 0x8609, 0xD927, - 0x8618, 0xD8F8, - 0x8627, 0xD8C8, - 0x8637, 0xD898, - 0x8646, 0xD868, - 0x8656, 0xD838, - 0x8666, 0xD809, - 0x8675, 0xD7D9, - 0x8685, 0xD7A9, - 0x8695, 0xD779, - 0x86A5, 0xD74A, - 0x86B5, 0xD71A, - 0x86C5, 0xD6EA, - 0x86D5, 0xD6BB, - 0x86E6, 0xD68B, - 0x86F6, 0xD65C, - 0x8706, 0xD62C, - 0x8717, 0xD5FD, - 0x8727, 0xD5CD, - 0x8738, 0xD59E, - 0x8749, 0xD56E, - 0x8759, 0xD53F, - 0x876A, 0xD510, - 0x877B, 0xD4E0, - 0x878C, 0xD4B1, - 0x879D, 0xD482, - 0x87AE, 0xD452, - 0x87BF, 0xD423, - 0x87D1, 0xD3F4, - 0x87E2, 0xD3C5, - 0x87F3, 0xD396, - 0x8805, 0xD367, - 0x8816, 0xD337, - 0x8828, 0xD308, - 0x883A, 0xD2D9, - 0x884B, 0xD2AA, - 0x885D, 0xD27B, - 0x886F, 0xD24C, - 0x8881, 0xD21D, - 0x8893, 0xD1EE, - 0x88A5, 0xD1C0, - 0x88B8, 0xD191, - 0x88CA, 0xD162, - 0x88DC, 0xD133, - 0x88EF, 0xD104, - 0x8901, 0xD0D6, - 0x8914, 0xD0A7, - 0x8926, 0xD078, - 0x8939, 0xD04A, - 0x894C, 0xD01B, - 0x895F, 0xCFEC, - 0x8971, 0xCFBE, - 0x8984, 0xCF8F, - 0x8997, 0xCF61, - 0x89AB, 0xCF32, - 0x89BE, 0xCF04, - 0x89D1, 0xCED5, - 0x89E4, 0xCEA7, - 0x89F8, 0xCE79, - 0x8A0B, 0xCE4A, - 0x8A1F, 0xCE1C, - 0x8A33, 0xCDEE, - 0x8A46, 0xCDBF, - 0x8A5A, 0xCD91, - 0x8A6E, 0xCD63, - 0x8A82, 0xCD35, - 0x8A96, 0xCD07, - 0x8AAA, 0xCCD9, - 0x8ABE, 0xCCAB, - 0x8AD2, 0xCC7D, - 0x8AE6, 0xCC4F, - 0x8AFB, 0xCC21, - 0x8B0F, 0xCBF3, - 0x8B24, 0xCBC5, - 0x8B38, 0xCB97, - 0x8B4D, 0xCB69, - 0x8B61, 0xCB3B, - 0x8B76, 0xCB0D, - 0x8B8B, 0xCAE0, - 0x8BA0, 0xCAB2, - 0x8BB5, 0xCA84, - 0x8BCA, 0xCA57, - 0x8BDF, 0xCA29, - 0x8BF4, 0xC9FB, - 0x8C09, 0xC9CE, - 0x8C1F, 0xC9A0, - 0x8C34, 0xC973, - 0x8C4A, 0xC945, - 0x8C5F, 0xC918, - 0x8C75, 0xC8EB, - 0x8C8A, 0xC8BD, - 0x8CA0, 0xC890, - 0x8CB6, 0xC863, - 0x8CCC, 0xC835, - 0x8CE2, 0xC808, - 0x8CF8, 0xC7DB, - 0x8D0E, 0xC7AE, - 0x8D24, 0xC781, - 0x8D3A, 0xC754, - 0x8D50, 0xC727, - 0x8D67, 0xC6F9, - 0x8D7D, 0xC6CD, - 0x8D94, 0xC6A0, - 0x8DAA, 0xC673, - 0x8DC1, 0xC646, - 0x8DD8, 0xC619, - 0x8DEE, 0xC5EC, - 0x8E05, 0xC5BF, - 0x8E1C, 0xC593, - 0x8E33, 0xC566, - 0x8E4A, 0xC539, - 0x8E61, 0xC50D, - 0x8E79, 0xC4E0, - 0x8E90, 0xC4B3, - 0x8EA7, 0xC487, - 0x8EBE, 0xC45A, - 0x8ED6, 0xC42E, - 0x8EED, 0xC402, - 0x8F05, 0xC3D5, - 0x8F1D, 0xC3A9, - 0x8F34, 0xC37C, - 0x8F4C, 0xC350, - 0x8F64, 0xC324, - 0x8F7C, 0xC2F8, - 0x8F94, 0xC2CC, - 0x8FAC, 0xC29F, - 0x8FC4, 0xC273, - 0x8FDC, 0xC247, - 0x8FF5, 0xC21B, - 0x900D, 0xC1EF, - 0x9025, 0xC1C3, - 0x903E, 0xC197, - 0x9056, 0xC16C, - 0x906F, 0xC140, - 0x9088, 0xC114, - 0x90A0, 0xC0E8, - 0x90B9, 0xC0BC, - 0x90D2, 0xC091, - 0x90EB, 0xC065, - 0x9104, 0xC03A, - 0x911D, 0xC00E, - 0x9136, 0xBFE2, - 0x9150, 0xBFB7, - 0x9169, 0xBF8C, - 0x9182, 0xBF60, - 0x919C, 0xBF35, - 0x91B5, 0xBF09, - 0x91CF, 0xBEDE, - 0x91E8, 0xBEB3, - 0x9202, 0xBE88, - 0x921C, 0xBE5D, - 0x9235, 0xBE31, - 0x924F, 0xBE06, - 0x9269, 0xBDDB, - 0x9283, 0xBDB0, - 0x929D, 0xBD85, - 0x92B7, 0xBD5A, - 0x92D2, 0xBD2F, - 0x92EC, 0xBD05, - 0x9306, 0xBCDA, - 0x9321, 0xBCAF, - 0x933B, 0xBC84, - 0x9356, 0xBC5A, - 0x9370, 0xBC2F, - 0x938B, 0xBC04, - 0x93A6, 0xBBDA, - 0x93C0, 0xBBAF, - 0x93DB, 0xBB85, - 0x93F6, 0xBB5A, - 0x9411, 0xBB30, - 0x942C, 0xBB05, - 0x9447, 0xBADB, - 0x9463, 0xBAB1, - 0x947E, 0xBA87, - 0x9499, 0xBA5C, - 0x94B5, 0xBA32, - 0x94D0, 0xBA08, - 0x94EC, 0xB9DE, - 0x9507, 0xB9B4, - 0x9523, 0xB98A, - 0x953E, 0xB960, - 0x955A, 0xB936, - 0x9576, 0xB90C, - 0x9592, 0xB8E3, - 0x95AE, 0xB8B9, - 0x95CA, 0xB88F, - 0x95E6, 0xB865, - 0x9602, 0xB83C, - 0x961E, 0xB812, - 0x963B, 0xB7E9, - 0x9657, 0xB7BF, - 0x9673, 0xB796, - 0x9690, 0xB76C, - 0x96AC, 0xB743, - 0x96C9, 0xB719, - 0x96E6, 0xB6F0, - 0x9702, 0xB6C7, - 0x971F, 0xB69E, - 0x973C, 0xB675, - 0x9759, 0xB64B, - 0x9776, 0xB622, - 0x9793, 0xB5F9, - 0x97B0, 0xB5D0, - 0x97CD, 0xB5A7, - 0x97EA, 0xB57E, - 0x9808, 0xB556, - 0x9825, 0xB52D, - 0x9842, 0xB504, - 0x9860, 0xB4DB, - 0x987D, 0xB4B3, - 0x989B, 0xB48A, - 0x98B9, 0xB461, - 0x98D6, 0xB439, - 0x98F4, 0xB410, - 0x9912, 0xB3E8, - 0x9930, 0xB3C0, - 0x994E, 0xB397, - 0x996C, 0xB36F, - 0x998A, 0xB347, - 0x99A8, 0xB31E, - 0x99C6, 0xB2F6, - 0x99E5, 0xB2CE, - 0x9A03, 0xB2A6, - 0x9A22, 0xB27E, - 0x9A40, 0xB256, - 0x9A5F, 0xB22E, - 0x9A7D, 0xB206, - 0x9A9C, 0xB1DE, - 0x9ABA, 0xB1B7, - 0x9AD9, 0xB18F, - 0x9AF8, 0xB167, - 0x9B17, 0xB140, - 0x9B36, 0xB118, - 0x9B55, 0xB0F0, - 0x9B74, 0xB0C9, - 0x9B93, 0xB0A1, - 0x9BB2, 0xB07A, - 0x9BD2, 0xB053, - 0x9BF1, 0xB02B, - 0x9C10, 0xB004, - 0x9C30, 0xAFDD, - 0x9C4F, 0xAFB6, - 0x9C6F, 0xAF8F, - 0x9C8E, 0xAF68, - 0x9CAE, 0xAF40, - 0x9CCE, 0xAF1A, - 0x9CEE, 0xAEF3, - 0x9D0D, 0xAECC, - 0x9D2D, 0xAEA5, - 0x9D4D, 0xAE7E, - 0x9D6D, 0xAE57, - 0x9D8E, 0xAE31, - 0x9DAE, 0xAE0A, - 0x9DCE, 0xADE3, - 0x9DEE, 0xADBD, - 0x9E0E, 0xAD96, - 0x9E2F, 0xAD70, - 0x9E4F, 0xAD4A, - 0x9E70, 0xAD23, - 0x9E90, 0xACFD, - 0x9EB1, 0xACD7, - 0x9ED2, 0xACB1, - 0x9EF2, 0xAC8A, - 0x9F13, 0xAC64, - 0x9F34, 0xAC3E, - 0x9F55, 0xAC18, - 0x9F76, 0xABF2, - 0x9F97, 0xABCC, - 0x9FB8, 0xABA7, - 0x9FD9, 0xAB81, - 0x9FFB, 0xAB5B, - 0xA01C, 0xAB35, - 0xA03D, 0xAB10, - 0xA05F, 0xAAEA, - 0xA080, 0xAAC5, - 0xA0A1, 0xAA9F, - 0xA0C3, 0xAA7A, - 0xA0E5, 0xAA54, - 0xA106, 0xAA2F, - 0xA128, 0xAA0A, - 0xA14A, 0xA9E5, - 0xA16C, 0xA9BF, - 0xA18E, 0xA99A, - 0xA1AF, 0xA975, - 0xA1D2, 0xA950, - 0xA1F4, 0xA92B, - 0xA216, 0xA906, - 0xA238, 0xA8E2, - 0xA25A, 0xA8BD, - 0xA27C, 0xA898, - 0xA29F, 0xA873, - 0xA2C1, 0xA84F, - 0xA2E4, 0xA82A, - 0xA306, 0xA806, - 0xA329, 0xA7E1, - 0xA34B, 0xA7BD, - 0xA36E, 0xA798, - 0xA391, 0xA774, - 0xA3B4, 0xA750, - 0xA3D6, 0xA72B, - 0xA3F9, 0xA707, - 0xA41C, 0xA6E3, - 0xA43F, 0xA6BF, - 0xA462, 0xA69B, - 0xA486, 0xA677, - 0xA4A9, 0xA653, - 0xA4CC, 0xA62F, - 0xA4EF, 0xA60C, - 0xA513, 0xA5E8, - 0xA536, 0xA5C4, - 0xA55A, 0xA5A1, - 0xA57D, 0xA57D, - 0xA5A1, 0xA55A, - 0xA5C4, 0xA536, - 0xA5E8, 0xA513, - 0xA60C, 0xA4EF, - 0xA62F, 0xA4CC, - 0xA653, 0xA4A9, - 0xA677, 0xA486, - 0xA69B, 0xA462, - 0xA6BF, 0xA43F, - 0xA6E3, 0xA41C, - 0xA707, 0xA3F9, - 0xA72B, 0xA3D6, - 0xA750, 0xA3B4, - 0xA774, 0xA391, - 0xA798, 0xA36E, - 0xA7BD, 0xA34B, - 0xA7E1, 0xA329, - 0xA806, 0xA306, - 0xA82A, 0xA2E4, - 0xA84F, 0xA2C1, - 0xA873, 0xA29F, - 0xA898, 0xA27C, - 0xA8BD, 0xA25A, - 0xA8E2, 0xA238, - 0xA906, 0xA216, - 0xA92B, 0xA1F4, - 0xA950, 0xA1D2, - 0xA975, 0xA1AF, - 0xA99A, 0xA18E, - 0xA9BF, 0xA16C, - 0xA9E5, 0xA14A, - 0xAA0A, 0xA128, - 0xAA2F, 0xA106, - 0xAA54, 0xA0E5, - 0xAA7A, 0xA0C3, - 0xAA9F, 0xA0A1, - 0xAAC5, 0xA080, - 0xAAEA, 0xA05F, - 0xAB10, 0xA03D, - 0xAB35, 0xA01C, - 0xAB5B, 0x9FFB, - 0xAB81, 0x9FD9, - 0xABA7, 0x9FB8, - 0xABCC, 0x9F97, - 0xABF2, 0x9F76, - 0xAC18, 0x9F55, - 0xAC3E, 0x9F34, - 0xAC64, 0x9F13, - 0xAC8A, 0x9EF2, - 0xACB1, 0x9ED2, - 0xACD7, 0x9EB1, - 0xACFD, 0x9E90, - 0xAD23, 0x9E70, - 0xAD4A, 0x9E4F, - 0xAD70, 0x9E2F, - 0xAD96, 0x9E0E, - 0xADBD, 0x9DEE, - 0xADE3, 0x9DCE, - 0xAE0A, 0x9DAE, - 0xAE31, 0x9D8E, - 0xAE57, 0x9D6D, - 0xAE7E, 0x9D4D, - 0xAEA5, 0x9D2D, - 0xAECC, 0x9D0D, - 0xAEF3, 0x9CEE, - 0xAF1A, 0x9CCE, - 0xAF40, 0x9CAE, - 0xAF68, 0x9C8E, - 0xAF8F, 0x9C6F, - 0xAFB6, 0x9C4F, - 0xAFDD, 0x9C30, - 0xB004, 0x9C10, - 0xB02B, 0x9BF1, - 0xB053, 0x9BD2, - 0xB07A, 0x9BB2, - 0xB0A1, 0x9B93, - 0xB0C9, 0x9B74, - 0xB0F0, 0x9B55, - 0xB118, 0x9B36, - 0xB140, 0x9B17, - 0xB167, 0x9AF8, - 0xB18F, 0x9AD9, - 0xB1B7, 0x9ABA, - 0xB1DE, 0x9A9C, - 0xB206, 0x9A7D, - 0xB22E, 0x9A5F, - 0xB256, 0x9A40, - 0xB27E, 0x9A22, - 0xB2A6, 0x9A03, - 0xB2CE, 0x99E5, - 0xB2F6, 0x99C6, - 0xB31E, 0x99A8, - 0xB347, 0x998A, - 0xB36F, 0x996C, - 0xB397, 0x994E, - 0xB3C0, 0x9930, - 0xB3E8, 0x9912, - 0xB410, 0x98F4, - 0xB439, 0x98D6, - 0xB461, 0x98B9, - 0xB48A, 0x989B, - 0xB4B3, 0x987D, - 0xB4DB, 0x9860, - 0xB504, 0x9842, - 0xB52D, 0x9825, - 0xB556, 0x9808, - 0xB57E, 0x97EA, - 0xB5A7, 0x97CD, - 0xB5D0, 0x97B0, - 0xB5F9, 0x9793, - 0xB622, 0x9776, - 0xB64B, 0x9759, - 0xB675, 0x973C, - 0xB69E, 0x971F, - 0xB6C7, 0x9702, - 0xB6F0, 0x96E6, - 0xB719, 0x96C9, - 0xB743, 0x96AC, - 0xB76C, 0x9690, - 0xB796, 0x9673, - 0xB7BF, 0x9657, - 0xB7E9, 0x963B, - 0xB812, 0x961E, - 0xB83C, 0x9602, - 0xB865, 0x95E6, - 0xB88F, 0x95CA, - 0xB8B9, 0x95AE, - 0xB8E3, 0x9592, - 0xB90C, 0x9576, - 0xB936, 0x955A, - 0xB960, 0x953E, - 0xB98A, 0x9523, - 0xB9B4, 0x9507, - 0xB9DE, 0x94EC, - 0xBA08, 0x94D0, - 0xBA32, 0x94B5, - 0xBA5C, 0x9499, - 0xBA87, 0x947E, - 0xBAB1, 0x9463, - 0xBADB, 0x9447, - 0xBB05, 0x942C, - 0xBB30, 0x9411, - 0xBB5A, 0x93F6, - 0xBB85, 0x93DB, - 0xBBAF, 0x93C0, - 0xBBDA, 0x93A6, - 0xBC04, 0x938B, - 0xBC2F, 0x9370, - 0xBC5A, 0x9356, - 0xBC84, 0x933B, - 0xBCAF, 0x9321, - 0xBCDA, 0x9306, - 0xBD05, 0x92EC, - 0xBD2F, 0x92D2, - 0xBD5A, 0x92B7, - 0xBD85, 0x929D, - 0xBDB0, 0x9283, - 0xBDDB, 0x9269, - 0xBE06, 0x924F, - 0xBE31, 0x9235, - 0xBE5D, 0x921C, - 0xBE88, 0x9202, - 0xBEB3, 0x91E8, - 0xBEDE, 0x91CF, - 0xBF09, 0x91B5, - 0xBF35, 0x919C, - 0xBF60, 0x9182, - 0xBF8C, 0x9169, - 0xBFB7, 0x9150, - 0xBFE2, 0x9136, - 0xC00E, 0x911D, - 0xC03A, 0x9104, - 0xC065, 0x90EB, - 0xC091, 0x90D2, - 0xC0BC, 0x90B9, - 0xC0E8, 0x90A0, - 0xC114, 0x9088, - 0xC140, 0x906F, - 0xC16C, 0x9056, - 0xC197, 0x903E, - 0xC1C3, 0x9025, - 0xC1EF, 0x900D, - 0xC21B, 0x8FF5, - 0xC247, 0x8FDC, - 0xC273, 0x8FC4, - 0xC29F, 0x8FAC, - 0xC2CC, 0x8F94, - 0xC2F8, 0x8F7C, - 0xC324, 0x8F64, - 0xC350, 0x8F4C, - 0xC37C, 0x8F34, - 0xC3A9, 0x8F1D, - 0xC3D5, 0x8F05, - 0xC402, 0x8EED, - 0xC42E, 0x8ED6, - 0xC45A, 0x8EBE, - 0xC487, 0x8EA7, - 0xC4B3, 0x8E90, - 0xC4E0, 0x8E79, - 0xC50D, 0x8E61, - 0xC539, 0x8E4A, - 0xC566, 0x8E33, - 0xC593, 0x8E1C, - 0xC5BF, 0x8E05, - 0xC5EC, 0x8DEE, - 0xC619, 0x8DD8, - 0xC646, 0x8DC1, - 0xC673, 0x8DAA, - 0xC6A0, 0x8D94, - 0xC6CD, 0x8D7D, - 0xC6F9, 0x8D67, - 0xC727, 0x8D50, - 0xC754, 0x8D3A, - 0xC781, 0x8D24, - 0xC7AE, 0x8D0E, - 0xC7DB, 0x8CF8, - 0xC808, 0x8CE2, - 0xC835, 0x8CCC, - 0xC863, 0x8CB6, - 0xC890, 0x8CA0, - 0xC8BD, 0x8C8A, - 0xC8EB, 0x8C75, - 0xC918, 0x8C5F, - 0xC945, 0x8C4A, - 0xC973, 0x8C34, - 0xC9A0, 0x8C1F, - 0xC9CE, 0x8C09, - 0xC9FB, 0x8BF4, - 0xCA29, 0x8BDF, - 0xCA57, 0x8BCA, - 0xCA84, 0x8BB5, - 0xCAB2, 0x8BA0, - 0xCAE0, 0x8B8B, - 0xCB0D, 0x8B76, - 0xCB3B, 0x8B61, - 0xCB69, 0x8B4D, - 0xCB97, 0x8B38, - 0xCBC5, 0x8B24, - 0xCBF3, 0x8B0F, - 0xCC21, 0x8AFB, - 0xCC4F, 0x8AE6, - 0xCC7D, 0x8AD2, - 0xCCAB, 0x8ABE, - 0xCCD9, 0x8AAA, - 0xCD07, 0x8A96, - 0xCD35, 0x8A82, - 0xCD63, 0x8A6E, - 0xCD91, 0x8A5A, - 0xCDBF, 0x8A46, - 0xCDEE, 0x8A33, - 0xCE1C, 0x8A1F, - 0xCE4A, 0x8A0B, - 0xCE79, 0x89F8, - 0xCEA7, 0x89E4, - 0xCED5, 0x89D1, - 0xCF04, 0x89BE, - 0xCF32, 0x89AB, - 0xCF61, 0x8997, - 0xCF8F, 0x8984, - 0xCFBE, 0x8971, - 0xCFEC, 0x895F, - 0xD01B, 0x894C, - 0xD04A, 0x8939, - 0xD078, 0x8926, - 0xD0A7, 0x8914, - 0xD0D6, 0x8901, - 0xD104, 0x88EF, - 0xD133, 0x88DC, - 0xD162, 0x88CA, - 0xD191, 0x88B8, - 0xD1C0, 0x88A5, - 0xD1EE, 0x8893, - 0xD21D, 0x8881, - 0xD24C, 0x886F, - 0xD27B, 0x885D, - 0xD2AA, 0x884B, - 0xD2D9, 0x883A, - 0xD308, 0x8828, - 0xD337, 0x8816, - 0xD367, 0x8805, - 0xD396, 0x87F3, - 0xD3C5, 0x87E2, - 0xD3F4, 0x87D1, - 0xD423, 0x87BF, - 0xD452, 0x87AE, - 0xD482, 0x879D, - 0xD4B1, 0x878C, - 0xD4E0, 0x877B, - 0xD510, 0x876A, - 0xD53F, 0x8759, - 0xD56E, 0x8749, - 0xD59E, 0x8738, - 0xD5CD, 0x8727, - 0xD5FD, 0x8717, - 0xD62C, 0x8706, - 0xD65C, 0x86F6, - 0xD68B, 0x86E6, - 0xD6BB, 0x86D5, - 0xD6EA, 0x86C5, - 0xD71A, 0x86B5, - 0xD74A, 0x86A5, - 0xD779, 0x8695, - 0xD7A9, 0x8685, - 0xD7D9, 0x8675, - 0xD809, 0x8666, - 0xD838, 0x8656, - 0xD868, 0x8646, - 0xD898, 0x8637, - 0xD8C8, 0x8627, - 0xD8F8, 0x8618, - 0xD927, 0x8609, - 0xD957, 0x85FA, - 0xD987, 0x85EA, - 0xD9B7, 0x85DB, - 0xD9E7, 0x85CC, - 0xDA17, 0x85BD, - 0xDA47, 0x85AF, - 0xDA77, 0x85A0, - 0xDAA7, 0x8591, - 0xDAD7, 0x8582, - 0xDB08, 0x8574, - 0xDB38, 0x8565, - 0xDB68, 0x8557, - 0xDB98, 0x8549, - 0xDBC8, 0x853A, - 0xDBF8, 0x852C, - 0xDC29, 0x851E, - 0xDC59, 0x8510, - 0xDC89, 0x8502, - 0xDCBA, 0x84F4, - 0xDCEA, 0x84E6, - 0xDD1A, 0x84D9, - 0xDD4B, 0x84CB, - 0xDD7B, 0x84BD, - 0xDDAB, 0x84B0, - 0xDDDC, 0x84A2, - 0xDE0C, 0x8495, - 0xDE3D, 0x8488, - 0xDE6D, 0x847B, - 0xDE9E, 0x846D, - 0xDECE, 0x8460, - 0xDEFF, 0x8453, - 0xDF2F, 0x8446, - 0xDF60, 0x843A, - 0xDF91, 0x842D, - 0xDFC1, 0x8420, - 0xDFF2, 0x8414, - 0xE023, 0x8407, - 0xE053, 0x83FA, - 0xE084, 0x83EE, - 0xE0B5, 0x83E2, - 0xE0E6, 0x83D6, - 0xE116, 0x83C9, - 0xE147, 0x83BD, - 0xE178, 0x83B1, - 0xE1A9, 0x83A5, - 0xE1DA, 0x8399, - 0xE20A, 0x838E, - 0xE23B, 0x8382, - 0xE26C, 0x8376, - 0xE29D, 0x836B, - 0xE2CE, 0x835F, - 0xE2FF, 0x8354, - 0xE330, 0x8348, - 0xE361, 0x833D, - 0xE392, 0x8332, - 0xE3C3, 0x8327, - 0xE3F4, 0x831C, - 0xE425, 0x8311, - 0xE456, 0x8306, - 0xE487, 0x82FB, - 0xE4B8, 0x82F0, - 0xE4E9, 0x82E6, - 0xE51B, 0x82DB, - 0xE54C, 0x82D0, - 0xE57D, 0x82C6, - 0xE5AE, 0x82BC, - 0xE5DF, 0x82B1, - 0xE610, 0x82A7, - 0xE642, 0x829D, - 0xE673, 0x8293, - 0xE6A4, 0x8289, - 0xE6D5, 0x827F, - 0xE707, 0x8275, - 0xE738, 0x826B, - 0xE769, 0x8262, - 0xE79B, 0x8258, - 0xE7CC, 0x824F, - 0xE7FD, 0x8245, - 0xE82F, 0x823C, - 0xE860, 0x8232, - 0xE892, 0x8229, - 0xE8C3, 0x8220, - 0xE8F5, 0x8217, - 0xE926, 0x820E, - 0xE957, 0x8205, - 0xE989, 0x81FC, - 0xE9BA, 0x81F3, - 0xE9EC, 0x81EB, - 0xEA1D, 0x81E2, - 0xEA4F, 0x81D9, - 0xEA80, 0x81D1, - 0xEAB2, 0x81C8, - 0xEAE4, 0x81C0, - 0xEB15, 0x81B8, - 0xEB47, 0x81B0, - 0xEB78, 0x81A8, - 0xEBAA, 0x81A0, - 0xEBDC, 0x8198, - 0xEC0D, 0x8190, - 0xEC3F, 0x8188, - 0xEC71, 0x8180, - 0xECA2, 0x8179, - 0xECD4, 0x8171, - 0xED06, 0x816A, - 0xED37, 0x8162, - 0xED69, 0x815B, - 0xED9B, 0x8154, - 0xEDCD, 0x814C, - 0xEDFE, 0x8145, - 0xEE30, 0x813E, - 0xEE62, 0x8137, - 0xEE94, 0x8130, - 0xEEC6, 0x812A, - 0xEEF7, 0x8123, - 0xEF29, 0x811C, - 0xEF5B, 0x8116, - 0xEF8D, 0x810F, - 0xEFBF, 0x8109, - 0xEFF1, 0x8102, - 0xF022, 0x80FC, - 0xF054, 0x80F6, - 0xF086, 0x80F0, - 0xF0B8, 0x80EA, - 0xF0EA, 0x80E4, - 0xF11C, 0x80DE, - 0xF14E, 0x80D8, - 0xF180, 0x80D2, - 0xF1B2, 0x80CD, - 0xF1E4, 0x80C7, - 0xF216, 0x80C2, - 0xF248, 0x80BC, - 0xF27A, 0x80B7, - 0xF2AC, 0x80B2, - 0xF2DE, 0x80AC, - 0xF310, 0x80A7, - 0xF342, 0x80A2, - 0xF374, 0x809D, - 0xF3A6, 0x8098, - 0xF3D8, 0x8094, - 0xF40A, 0x808F, - 0xF43C, 0x808A, - 0xF46E, 0x8086, - 0xF4A0, 0x8081, - 0xF4D2, 0x807D, - 0xF504, 0x8078, - 0xF536, 0x8074, - 0xF568, 0x8070, - 0xF59A, 0x806C, - 0xF5CC, 0x8068, - 0xF5FF, 0x8064, - 0xF631, 0x8060, - 0xF663, 0x805C, - 0xF695, 0x8058, - 0xF6C7, 0x8055, - 0xF6F9, 0x8051, - 0xF72B, 0x804E, - 0xF75D, 0x804A, - 0xF790, 0x8047, - 0xF7C2, 0x8043, - 0xF7F4, 0x8040, - 0xF826, 0x803D, - 0xF858, 0x803A, - 0xF88A, 0x8037, - 0xF8BD, 0x8034, - 0xF8EF, 0x8031, - 0xF921, 0x802F, - 0xF953, 0x802C, - 0xF985, 0x8029, - 0xF9B8, 0x8027, - 0xF9EA, 0x8025, - 0xFA1C, 0x8022, - 0xFA4E, 0x8020, - 0xFA80, 0x801E, - 0xFAB3, 0x801C, - 0xFAE5, 0x801A, - 0xFB17, 0x8018, - 0xFB49, 0x8016, - 0xFB7C, 0x8014, - 0xFBAE, 0x8012, - 0xFBE0, 0x8011, - 0xFC12, 0x800F, - 0xFC45, 0x800D, - 0xFC77, 0x800C, - 0xFCA9, 0x800B, - 0xFCDB, 0x8009, - 0xFD0E, 0x8008, - 0xFD40, 0x8007, - 0xFD72, 0x8006, - 0xFDA4, 0x8005, - 0xFDD7, 0x8004, - 0xFE09, 0x8003, - 0xFE3B, 0x8003, - 0xFE6D, 0x8002, - 0xFEA0, 0x8001, - 0xFED2, 0x8001, - 0xFF04, 0x8000, - 0xFF36, 0x8000, - 0xFF69, 0x8000, - 0xFF9B, 0x8000, - 0xFFCD, 0x8000 -}; - - -/** -* @} end of CFFT_CIFFT group -*/ - -/* -* @brief Q15 table for reciprocal -*/ -const q15_t ALIGN4 armRecipTableQ15[64] = { - 0x7F03, 0x7D13, 0x7B31, 0x795E, 0x7798, 0x75E0, - 0x7434, 0x7294, 0x70FF, 0x6F76, 0x6DF6, 0x6C82, - 0x6B16, 0x69B5, 0x685C, 0x670C, 0x65C4, 0x6484, - 0x634C, 0x621C, 0x60F3, 0x5FD0, 0x5EB5, 0x5DA0, - 0x5C91, 0x5B88, 0x5A85, 0x5988, 0x5890, 0x579E, - 0x56B0, 0x55C8, 0x54E4, 0x5405, 0x532B, 0x5255, - 0x5183, 0x50B6, 0x4FEC, 0x4F26, 0x4E64, 0x4DA6, - 0x4CEC, 0x4C34, 0x4B81, 0x4AD0, 0x4A23, 0x4978, - 0x48D1, 0x482D, 0x478C, 0x46ED, 0x4651, 0x45B8, - 0x4521, 0x448D, 0x43FC, 0x436C, 0x42DF, 0x4255, - 0x41CC, 0x4146, 0x40C2, 0x4040 -}; - -/* -* @brief Q31 table for reciprocal -*/ -const q31_t armRecipTableQ31[64] = { - 0x7F03F03F, 0x7D137420, 0x7B31E739, 0x795E9F94, 0x7798FD29, 0x75E06928, - 0x7434554D, 0x72943B4B, 0x70FF9C40, 0x6F760031, 0x6DF6F593, 0x6C8210E3, - 0x6B16EC3A, 0x69B526F6, 0x685C655F, 0x670C505D, 0x65C4952D, 0x6484E519, - 0x634CF53E, 0x621C7E4F, 0x60F33C61, 0x5FD0EEB3, 0x5EB55785, 0x5DA03BEB, - 0x5C9163A1, 0x5B8898E6, 0x5A85A85A, 0x598860DF, 0x58909373, 0x579E1318, - 0x56B0B4B8, 0x55C84F0B, 0x54E4BA80, 0x5405D124, 0x532B6E8F, 0x52556FD0, - 0x5183B35A, 0x50B618F3, 0x4FEC81A2, 0x4F26CFA2, 0x4E64E64E, 0x4DA6AA1D, - 0x4CEC008B, 0x4C34D010, 0x4B810016, 0x4AD078EF, 0x4A2323C4, 0x4978EA96, - 0x48D1B827, 0x482D77FE, 0x478C1657, 0x46ED801D, 0x4651A2E5, 0x45B86CE2, - 0x4521CCE1, 0x448DB244, 0x43FC0CFA, 0x436CCD78, 0x42DFE4B4, 0x42554426, - 0x41CCDDB6, 0x4146A3C6, 0x40C28923, 0x40408102 -}; - -const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH] = -{ - //8x2, size 20 - 8,64, 24,72, 16,64, 40,80, 32,64, 56,88, 48,72, 88,104, 72,96, 104,112 -}; - -const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH] = -{ - //8x4, size 48 - 8,64, 16,128, 24,192, 32,64, 40,72, 48,136, 56,200, 64,128, 72,80, 88,208, - 80,144, 96,192, 104,208, 112,152, 120,216, 136,192, 144,160, 168,208, - 152,224, 176,208, 184,232, 216,240, 200,224, 232,240 -}; - -const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH] = -{ - //radix 8, size 56 - 8,64, 16,128, 24,192, 32,256, 40,320, 48,384, 56,448, 80,136, 88,200, - 96,264, 104,328, 112,392, 120,456, 152,208, 160,272, 168,336, 176,400, - 184,464, 224,280, 232,344, 240,408, 248,472, 296,352, 304,416, 312,480, - 368,424, 376,488, 440,496 -}; - -const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH] = -{ - //8x2, size 208 - 8,512, 16,64, 24,576, 32,128, 40,640, 48,192, 56,704, 64,256, 72,768, - 80,320, 88,832, 96,384, 104,896, 112,448, 120,960, 128,512, 136,520, - 144,768, 152,584, 160,520, 168,648, 176,200, 184,712, 192,264, 200,776, - 208,328, 216,840, 224,392, 232,904, 240,456, 248,968, 264,528, 272,320, - 280,592, 288,768, 296,656, 304,328, 312,720, 328,784, 344,848, 352,400, - 360,912, 368,464, 376,976, 384,576, 392,536, 400,832, 408,600, 416,584, - 424,664, 432,840, 440,728, 448,592, 456,792, 464,848, 472,856, 480,600, - 488,920, 496,856, 504,984, 520,544, 528,576, 536,608, 552,672, 560,608, - 568,736, 576,768, 584,800, 592,832, 600,864, 608,800, 616,928, 624,864, - 632,992, 648,672, 656,896, 664,928, 688,904, 696,744, 704,896, 712,808, - 720,912, 728,872, 736,928, 744,936, 752,920, 760,1000, 776,800, 784,832, - 792,864, 808,904, 816,864, 824,920, 840,864, 856,880, 872,944, 888,1008, - 904,928, 912,960, 920,992, 944,968, 952,1000, 968,992, 984,1008 -}; - -const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH] = -{ - //8x4, size 440 - 8,512, 16,1024, 24,1536, 32,64, 40,576, 48,1088, 56,1600, 64,128, 72,640, - 80,1152, 88,1664, 96,192, 104,704, 112,1216, 120,1728, 128,256, 136,768, - 144,1280, 152,1792, 160,320, 168,832, 176,1344, 184,1856, 192,384, - 200,896, 208,1408, 216,1920, 224,448, 232,960, 240,1472, 248,1984, - 256,512, 264,520, 272,1032, 280,1544, 288,640, 296,584, 304,1096, 312,1608, - 320,768, 328,648, 336,1160, 344,1672, 352,896, 360,712, 368,1224, 376,1736, - 384,520, 392,776, 400,1288, 408,1800, 416,648, 424,840, 432,1352, 440,1864, - 448,776, 456,904, 464,1416, 472,1928, 480,904, 488,968, 496,1480, 504,1992, - 520,528, 512,1024, 528,1040, 536,1552, 544,1152, 552,592, 560,1104, - 568,1616, 576,1280, 584,656, 592,1168, 600,1680, 608,1408, 616,720, - 624,1232, 632,1744, 640,1032, 648,784, 656,1296, 664,1808, 672,1160, - 680,848, 688,1360, 696,1872, 704,1288, 712,912, 720,1424, 728,1936, - 736,1416, 744,976, 752,1488, 760,2000, 768,1536, 776,1552, 784,1048, - 792,1560, 800,1664, 808,1680, 816,1112, 824,1624, 832,1792, 840,1808, - 848,1176, 856,1688, 864,1920, 872,1936, 880,1240, 888,1752, 896,1544, - 904,1560, 912,1304, 920,1816, 928,1672, 936,1688, 944,1368, 952,1880, - 960,1800, 968,1816, 976,1432, 984,1944, 992,1928, 1000,1944, 1008,1496, - 1016,2008, 1032,1152, 1040,1056, 1048,1568, 1064,1408, 1072,1120, - 1080,1632, 1088,1536, 1096,1160, 1104,1184, 1112,1696, 1120,1552, - 1128,1416, 1136,1248, 1144,1760, 1160,1664, 1168,1312, 1176,1824, - 1184,1544, 1192,1920, 1200,1376, 1208,1888, 1216,1568, 1224,1672, - 1232,1440, 1240,1952, 1248,1560, 1256,1928, 1264,1504, 1272,2016, - 1288,1312, 1296,1408, 1304,1576, 1320,1424, 1328,1416, 1336,1640, - 1344,1792, 1352,1824, 1360,1920, 1368,1704, 1376,1800, 1384,1432, - 1392,1928, 1400,1768, 1416,1680, 1432,1832, 1440,1576, 1448,1936, - 1456,1832, 1464,1896, 1472,1808, 1480,1688, 1488,1936, 1496,1960, - 1504,1816, 1512,1944, 1520,1944, 1528,2024, 1560,1584, 1592,1648, - 1600,1792, 1608,1920, 1616,1800, 1624,1712, 1632,1808, 1640,1936, - 1648,1816, 1656,1776, 1672,1696, 1688,1840, 1704,1952, 1712,1928, - 1720,1904, 1728,1824, 1736,1952, 1744,1832, 1752,1968, 1760,1840, - 1768,1960, 1776,1944, 1784,2032, 1864,1872, 1848,1944, 1872,1888, - 1880,1904, 1888,1984, 1896,2000, 1912,2032, 1904,2016, 1976,2032, - 1960,1968, 2008,2032, 1992,2016, 2024,2032 -}; - -const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH] = -{ - //radix 8, size 448 - 8,512, 16,1024, 24,1536, 32,2048, 40,2560, 48,3072, 56,3584, 72,576, - 80,1088, 88,1600, 96,2112, 104,2624, 112,3136, 120,3648, 136,640, 144,1152, - 152,1664, 160,2176, 168,2688, 176,3200, 184,3712, 200,704, 208,1216, - 216,1728, 224,2240, 232,2752, 240,3264, 248,3776, 264,768, 272,1280, - 280,1792, 288,2304, 296,2816, 304,3328, 312,3840, 328,832, 336,1344, - 344,1856, 352,2368, 360,2880, 368,3392, 376,3904, 392,896, 400,1408, - 408,1920, 416,2432, 424,2944, 432,3456, 440,3968, 456,960, 464,1472, - 472,1984, 480,2496, 488,3008, 496,3520, 504,4032, 528,1032, 536,1544, - 544,2056, 552,2568, 560,3080, 568,3592, 592,1096, 600,1608, 608,2120, - 616,2632, 624,3144, 632,3656, 656,1160, 664,1672, 672,2184, 680,2696, - 688,3208, 696,3720, 720,1224, 728,1736, 736,2248, 744,2760, 752,3272, - 760,3784, 784,1288, 792,1800, 800,2312, 808,2824, 816,3336, 824,3848, - 848,1352, 856,1864, 864,2376, 872,2888, 880,3400, 888,3912, 912,1416, - 920,1928, 928,2440, 936,2952, 944,3464, 952,3976, 976,1480, 984,1992, - 992,2504, 1000,3016, 1008,3528, 1016,4040, 1048,1552, 1056,2064, 1064,2576, - 1072,3088, 1080,3600, 1112,1616, 1120,2128, 1128,2640, 1136,3152, - 1144,3664, 1176,1680, 1184,2192, 1192,2704, 1200,3216, 1208,3728, - 1240,1744, 1248,2256, 1256,2768, 1264,3280, 1272,3792, 1304,1808, - 1312,2320, 1320,2832, 1328,3344, 1336,3856, 1368,1872, 1376,2384, - 1384,2896, 1392,3408, 1400,3920, 1432,1936, 1440,2448, 1448,2960, - 1456,3472, 1464,3984, 1496,2000, 1504,2512, 1512,3024, 1520,3536, - 1528,4048, 1568,2072, 1576,2584, 1584,3096, 1592,3608, 1632,2136, - 1640,2648, 1648,3160, 1656,3672, 1696,2200, 1704,2712, 1712,3224, - 1720,3736, 1760,2264, 1768,2776, 1776,3288, 1784,3800, 1824,2328, - 1832,2840, 1840,3352, 1848,3864, 1888,2392, 1896,2904, 1904,3416, - 1912,3928, 1952,2456, 1960,2968, 1968,3480, 1976,3992, 2016,2520, - 2024,3032, 2032,3544, 2040,4056, 2088,2592, 2096,3104, 2104,3616, - 2152,2656, 2160,3168, 2168,3680, 2216,2720, 2224,3232, 2232,3744, - 2280,2784, 2288,3296, 2296,3808, 2344,2848, 2352,3360, 2360,3872, - 2408,2912, 2416,3424, 2424,3936, 2472,2976, 2480,3488, 2488,4000, - 2536,3040, 2544,3552, 2552,4064, 2608,3112, 2616,3624, 2672,3176, - 2680,3688, 2736,3240, 2744,3752, 2800,3304, 2808,3816, 2864,3368, - 2872,3880, 2928,3432, 2936,3944, 2992,3496, 3000,4008, 3056,3560, - 3064,4072, 3128,3632, 3192,3696, 3256,3760, 3320,3824, 3384,3888, - 3448,3952, 3512,4016, 3576,4080 -}; - -const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH] = -{ - //8x2, size 1800 - 8,4096, 16,512, 24,4608, 32,1024, 40,5120, 48,1536, 56,5632, 64,2048, - 72,6144, 80,2560, 88,6656, 96,3072, 104,7168, 112,3584, 120,7680, 128,2048, - 136,4160, 144,576, 152,4672, 160,1088, 168,5184, 176,1600, 184,5696, - 192,2112, 200,6208, 208,2624, 216,6720, 224,3136, 232,7232, 240,3648, - 248,7744, 256,2048, 264,4224, 272,640, 280,4736, 288,1152, 296,5248, - 304,1664, 312,5760, 320,2176, 328,6272, 336,2688, 344,6784, 352,3200, - 360,7296, 368,3712, 376,7808, 384,2112, 392,4288, 400,704, 408,4800, - 416,1216, 424,5312, 432,1728, 440,5824, 448,2240, 456,6336, 464,2752, - 472,6848, 480,3264, 488,7360, 496,3776, 504,7872, 512,2048, 520,4352, - 528,768, 536,4864, 544,1280, 552,5376, 560,1792, 568,5888, 576,2304, - 584,6400, 592,2816, 600,6912, 608,3328, 616,7424, 624,3840, 632,7936, - 640,2176, 648,4416, 656,832, 664,4928, 672,1344, 680,5440, 688,1856, - 696,5952, 704,2368, 712,6464, 720,2880, 728,6976, 736,3392, 744,7488, - 752,3904, 760,8000, 768,2112, 776,4480, 784,896, 792,4992, 800,1408, - 808,5504, 816,1920, 824,6016, 832,2432, 840,6528, 848,2944, 856,7040, - 864,3456, 872,7552, 880,3968, 888,8064, 896,2240, 904,4544, 912,960, - 920,5056, 928,1472, 936,5568, 944,1984, 952,6080, 960,2496, 968,6592, - 976,3008, 984,7104, 992,3520, 1000,7616, 1008,4032, 1016,8128, 1024,4096, - 1032,4104, 1040,4352, 1048,4616, 1056,4104, 1064,5128, 1072,1544, - 1080,5640, 1088,2056, 1096,6152, 1104,2568, 1112,6664, 1120,3080, - 1128,7176, 1136,3592, 1144,7688, 1152,6144, 1160,4168, 1168,6400, - 1176,4680, 1184,6152, 1192,5192, 1200,1608, 1208,5704, 1216,2120, - 1224,6216, 1232,2632, 1240,6728, 1248,3144, 1256,7240, 1264,3656, - 1272,7752, 1280,4160, 1288,4232, 1296,4416, 1304,4744, 1312,4168, - 1320,5256, 1328,1672, 1336,5768, 1344,2184, 1352,6280, 1360,2696, - 1368,6792, 1376,3208, 1384,7304, 1392,3720, 1400,7816, 1408,6208, - 1416,4296, 1424,6464, 1432,4808, 1440,6216, 1448,5320, 1456,1736, - 1464,5832, 1472,2248, 1480,6344, 1488,2760, 1496,6856, 1504,3272, - 1512,7368, 1520,3784, 1528,7880, 1536,4224, 1544,4360, 1552,4480, - 1560,4872, 1568,4232, 1576,5384, 1584,1800, 1592,5896, 1600,2312, - 1608,6408, 1616,2824, 1624,6920, 1632,3336, 1640,7432, 1648,3848, - 1656,7944, 1664,6272, 1672,4424, 1680,6528, 1688,4936, 1696,6280, - 1704,5448, 1712,1864, 1720,5960, 1728,2376, 1736,6472, 1744,2888, - 1752,6984, 1760,3400, 1768,7496, 1776,3912, 1784,8008, 1792,4288, - 1800,4488, 1808,4544, 1816,5000, 1824,4296, 1832,5512, 1840,1928, - 1848,6024, 1856,2440, 1864,6536, 1872,2952, 1880,7048, 1888,3464, - 1896,7560, 1904,3976, 1912,8072, 1920,6336, 1928,4552, 1936,6592, - 1944,5064, 1952,6344, 1960,5576, 1968,1992, 1976,6088, 1984,2504, - 1992,6600, 2000,3016, 2008,7112, 2016,3528, 2024,7624, 2032,4040, - 2040,8136, 2056,4112, 2064,2112, 2072,4624, 2080,4352, 2088,5136, - 2096,4480, 2104,5648, 2120,6160, 2128,2576, 2136,6672, 2144,3088, - 2152,7184, 2160,3600, 2168,7696, 2176,2560, 2184,4176, 2192,2816, - 2200,4688, 2208,2568, 2216,5200, 2224,2824, 2232,5712, 2240,2576, - 2248,6224, 2256,2640, 2264,6736, 2272,3152, 2280,7248, 2288,3664, - 2296,7760, 2312,4240, 2320,2432, 2328,4752, 2336,6400, 2344,5264, - 2352,6528, 2360,5776, 2368,2816, 2376,6288, 2384,2704, 2392,6800, - 2400,3216, 2408,7312, 2416,3728, 2424,7824, 2432,2624, 2440,4304, - 2448,2880, 2456,4816, 2464,2632, 2472,5328, 2480,2888, 2488,5840, - 2496,2640, 2504,6352, 2512,2768, 2520,6864, 2528,3280, 2536,7376, - 2544,3792, 2552,7888, 2568,4368, 2584,4880, 2592,4416, 2600,5392, - 2608,4544, 2616,5904, 2632,6416, 2640,2832, 2648,6928, 2656,3344, - 2664,7440, 2672,3856, 2680,7952, 2696,4432, 2704,2944, 2712,4944, - 2720,4432, 2728,5456, 2736,2952, 2744,5968, 2752,2944, 2760,6480, - 2768,2896, 2776,6992, 2784,3408, 2792,7504, 2800,3920, 2808,8016, - 2824,4496, 2840,5008, 2848,6464, 2856,5520, 2864,6592, 2872,6032, - 2888,6544, 2896,2960, 2904,7056, 2912,3472, 2920,7568, 2928,3984, - 2936,8080, 2952,4560, 2960,3008, 2968,5072, 2976,6480, 2984,5584, - 2992,3016, 3000,6096, 3016,6608, 3032,7120, 3040,3536, 3048,7632, - 3056,4048, 3064,8144, 3072,4608, 3080,4120, 3088,4864, 3096,4632, - 3104,4616, 3112,5144, 3120,4872, 3128,5656, 3136,4624, 3144,6168, - 3152,4880, 3160,6680, 3168,4632, 3176,7192, 3184,3608, 3192,7704, - 3200,6656, 3208,4184, 3216,6912, 3224,4696, 3232,6664, 3240,5208, - 3248,6920, 3256,5720, 3264,6672, 3272,6232, 3280,6928, 3288,6744, - 3296,6680, 3304,7256, 3312,3672, 3320,7768, 3328,4672, 3336,4248, - 3344,4928, 3352,4760, 3360,4680, 3368,5272, 3376,4936, 3384,5784, - 3392,4688, 3400,6296, 3408,4944, 3416,6808, 3424,4696, 3432,7320, - 3440,3736, 3448,7832, 3456,6720, 3464,4312, 3472,6976, 3480,4824, - 3488,6728, 3496,5336, 3504,6984, 3512,5848, 3520,6736, 3528,6360, - 3536,6992, 3544,6872, 3552,6744, 3560,7384, 3568,3800, 3576,7896, - 3584,4736, 3592,4376, 3600,4992, 3608,4888, 3616,4744, 3624,5400, - 3632,5000, 3640,5912, 3648,4752, 3656,6424, 3664,5008, 3672,6936, - 3680,4760, 3688,7448, 3696,3864, 3704,7960, 3712,6784, 3720,4440, - 3728,7040, 3736,4952, 3744,6792, 3752,5464, 3760,7048, 3768,5976, - 3776,6800, 3784,6488, 3792,7056, 3800,7000, 3808,6808, 3816,7512, - 3824,3928, 3832,8024, 3840,4800, 3848,4504, 3856,5056, 3864,5016, - 3872,4808, 3880,5528, 3888,5064, 3896,6040, 3904,4816, 3912,6552, - 3920,5072, 3928,7064, 3936,4824, 3944,7576, 3952,3992, 3960,8088, - 3968,6848, 3976,4568, 3984,7104, 3992,5080, 4000,6856, 4008,5592, - 4016,7112, 4024,6104, 4032,6864, 4040,6616, 4048,7120, 4056,7128, - 4064,6872, 4072,7640, 4080,7128, 4088,8152, 4104,4128, 4112,4160, - 4120,4640, 4136,5152, 4144,4232, 4152,5664, 4160,4352, 4168,6176, - 4176,4416, 4184,6688, 4192,4616, 4200,7200, 4208,4744, 4216,7712, - 4224,4608, 4232,4616, 4240,4672, 4248,4704, 4256,4640, 4264,5216, - 4272,4704, 4280,5728, 4288,4864, 4296,6240, 4304,4928, 4312,6752, - 4320,4632, 4328,7264, 4336,4760, 4344,7776, 4360,4640, 4368,4416, - 4376,4768, 4384,6152, 4392,5280, 4400,6280, 4408,5792, 4424,6304, - 4440,6816, 4448,6664, 4456,7328, 4464,6792, 4472,7840, 4480,4624, - 4488,4632, 4496,4688, 4504,4832, 4512,6168, 4520,5344, 4528,6296, - 4536,5856, 4544,4880, 4552,6368, 4560,4944, 4568,6880, 4576,6680, - 4584,7392, 4592,6808, 4600,7904, 4608,6144, 4616,6152, 4624,6208, - 4632,4896, 4640,6176, 4648,5408, 4656,6240, 4664,5920, 4672,6400, - 4680,6432, 4688,6464, 4696,6944, 4704,6432, 4712,7456, 4720,4808, - 4728,7968, 4736,6656, 4744,6664, 4752,6720, 4760,4960, 4768,6688, - 4776,5472, 4784,6752, 4792,5984, 4800,6912, 4808,6496, 4816,6976, - 4824,7008, 4832,6944, 4840,7520, 4848,7008, 4856,8032, 4864,6160, - 4872,6168, 4880,6224, 4888,5024, 4896,6216, 4904,5536, 4912,6344, - 4920,6048, 4928,6416, 4936,6560, 4944,6480, 4952,7072, 4960,6728, - 4968,7584, 4976,6856, 4984,8096, 4992,6672, 5000,6680, 5008,6736, - 5016,5088, 5024,6232, 5032,5600, 5040,6360, 5048,6112, 5056,6928, - 5064,6624, 5072,6992, 5080,7136, 5088,6744, 5096,7648, 5104,6872, - 5112,8160, 5128,5152, 5136,5376, 5144,5408, 5168,5384, 5176,5672, - 5184,5376, 5192,6184, 5200,5392, 5208,6696, 5216,5408, 5224,7208, - 5232,5400, 5240,7720, 5248,7168, 5256,7200, 5264,7424, 5272,7456, - 5280,7176, 5288,7208, 5296,7432, 5304,5736, 5312,7184, 5320,6248, - 5328,7440, 5336,6760, 5344,7192, 5352,7272, 5360,7448, 5368,7784, - 5384,5408, 5392,5440, 5400,5472, 5408,6184, 5416,7208, 5424,5448, - 5432,5800, 5448,6312, 5464,6824, 5472,6696, 5480,7336, 5488,6824, - 5496,7848, 5504,7232, 5512,7264, 5520,7488, 5528,7520, 5536,7240, - 5544,7272, 5552,7496, 5560,5864, 5568,7248, 5576,6376, 5584,7504, - 5592,6888, 5600,7256, 5608,7400, 5616,7512, 5624,7912, 5632,7168, - 5640,7176, 5648,7232, 5656,7240, 5664,7200, 5672,7208, 5680,7264, - 5688,5928, 5696,7424, 5704,6440, 5712,7488, 5720,6952, 5728,7456, - 5736,7464, 5744,7520, 5752,7976, 5760,7296, 5768,7328, 5776,7552, - 5784,7584, 5792,7304, 5800,7336, 5808,7560, 5816,5992, 5824,7312, - 5832,6504, 5840,7568, 5848,7016, 5856,7320, 5864,7528, 5872,7576, - 5880,8040, 5888,7184, 5896,7192, 5904,7248, 5912,7256, 5920,6248, - 5928,7272, 5936,6376, 5944,6056, 5952,7440, 5960,6568, 5968,7504, - 5976,7080, 5984,6760, 5992,7592, 6000,6888, 6008,8104, 6016,7360, - 6024,7392, 6032,7616, 6040,7648, 6048,7368, 6056,7400, 6064,7624, - 6072,6120, 6080,7376, 6088,6632, 6096,7632, 6104,7144, 6112,7384, - 6120,7656, 6128,7640, 6136,8168, 6168,6240, 6192,6216, 6200,7264, - 6232,6704, 6248,7216, 6256,6680, 6264,7728, 6272,6656, 6280,6664, - 6288,6912, 6296,6496, 6304,6688, 6312,6696, 6320,6944, 6328,7520, - 6336,6672, 6344,6680, 6352,6928, 6360,6768, 6368,6704, 6376,7280, - 6384,6744, 6392,7792, 6408,6432, 6424,6752, 6440,7432, 6448,6536, - 6456,7560, 6472,6944, 6488,6832, 6496,6920, 6504,7344, 6512,7048, - 6520,7856, 6528,6720, 6536,6728, 6544,6976, 6552,7008, 6560,6752, - 6568,7448, 6576,7008, 6584,7576, 6592,6736, 6600,6744, 6608,6992, - 6616,6896, 6624,6936, 6632,7408, 6640,7064, 6648,7920, 6712,7280, - 6744,6960, 6760,7472, 6768,6936, 6776,7984, 6800,6848, 6808,6856, - 6832,6880, 6840,6888, 6848,7040, 6856,7048, 6864,7104, 6872,7024, - 6880,7072, 6888,7536, 6896,7136, 6904,8048, 6952,7496, 6968,7624, - 6984,7008, 7000,7088, 7016,7600, 7024,7112, 7032,8112, 7056,7104, - 7064,7112, 7080,7512, 7088,7136, 7096,7640, 7128,7152, 7144,7664, - 7160,8176, 7176,7200, 7192,7216, 7224,7272, 7240,7264, 7256,7280, - 7288,7736, 7296,7680, 7304,7712, 7312,7936, 7320,7968, 7328,7688, - 7336,7720, 7344,7944, 7352,7976, 7360,7696, 7368,7728, 7376,7952, - 7384,7984, 7392,7704, 7400,7736, 7408,7960, 7416,7800, 7432,7456, - 7448,7472, 7480,7592, 7496,7520, 7512,7536, 7528,7976, 7544,7864, - 7552,7744, 7560,7776, 7568,8000, 7576,8032, 7584,7752, 7592,7784, - 7600,8008, 7608,8040, 7616,7760, 7624,7792, 7632,8016, 7640,8048, - 7648,7768, 7656,7800, 7664,8024, 7672,7928, 7688,7712, 7704,7728, - 7752,7776, 7768,7792, 7800,7992, 7816,7840, 7824,8064, 7832,8096, - 7856,8072, 7864,8104, 7872,8064, 7880,8072, 7888,8080, 7896,8112, - 7904,8096, 7912,8104, 7920,8088, 7928,8056, 7944,7968, 7960,7984, - 8008,8032, 8024,8048, 8056,8120, 8072,8096, 8080,8128, 8088,8160, - 8112,8136, 8120,8168, 8136,8160, 8152,8176 -}; - -const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH] = -{ - //8x2, size 3808 - 8,4096, 16,8192, 24,12288, 32,512, 40,4608, 48,8704, 56,12800, 64,1024, - 72,5120, 80,9216, 88,13312, 96,1536, 104,5632, 112,9728, 120,13824, - 128,2048, 136,6144, 144,10240, 152,14336, 160,2560, 168,6656, 176,10752, - 184,14848, 192,3072, 200,7168, 208,11264, 216,15360, 224,3584, 232,7680, - 240,11776, 248,15872, 256,1024, 264,4160, 272,8256, 280,12352, 288,576, - 296,4672, 304,8768, 312,12864, 320,1088, 328,5184, 336,9280, 344,13376, - 352,1600, 360,5696, 368,9792, 376,13888, 384,2112, 392,6208, 400,10304, - 408,14400, 416,2624, 424,6720, 432,10816, 440,14912, 448,3136, 456,7232, - 464,11328, 472,15424, 480,3648, 488,7744, 496,11840, 504,15936, 512,2048, - 520,4224, 528,8320, 536,12416, 544,640, 552,4736, 560,8832, 568,12928, - 576,1152, 584,5248, 592,9344, 600,13440, 608,1664, 616,5760, 624,9856, - 632,13952, 640,2176, 648,6272, 656,10368, 664,14464, 672,2688, 680,6784, - 688,10880, 696,14976, 704,3200, 712,7296, 720,11392, 728,15488, 736,3712, - 744,7808, 752,11904, 760,16000, 768,3072, 776,4288, 784,8384, 792,12480, - 800,3200, 808,4800, 816,8896, 824,12992, 832,1216, 840,5312, 848,9408, - 856,13504, 864,1728, 872,5824, 880,9920, 888,14016, 896,2240, 904,6336, - 912,10432, 920,14528, 928,2752, 936,6848, 944,10944, 952,15040, 960,3264, - 968,7360, 976,11456, 984,15552, 992,3776, 1000,7872, 1008,11968, 1016,16064, - 1032,4352, 1040,8448, 1048,12544, 1056,3072, 1064,4864, 1072,8960, - 1080,13056, 1088,1280, 1096,5376, 1104,9472, 1112,13568, 1120,1792, - 1128,5888, 1136,9984, 1144,14080, 1152,2304, 1160,6400, 1168,10496, - 1176,14592, 1184,2816, 1192,6912, 1200,11008, 1208,15104, 1216,3328, - 1224,7424, 1232,11520, 1240,15616, 1248,3840, 1256,7936, 1264,12032, - 1272,16128, 1288,4416, 1296,8512, 1304,12608, 1312,3328, 1320,4928, - 1328,9024, 1336,13120, 1352,5440, 1360,9536, 1368,13632, 1376,1856, - 1384,5952, 1392,10048, 1400,14144, 1408,2368, 1416,6464, 1424,10560, - 1432,14656, 1440,2880, 1448,6976, 1456,11072, 1464,15168, 1472,3392, - 1480,7488, 1488,11584, 1496,15680, 1504,3904, 1512,8000, 1520,12096, - 1528,16192, 1536,2112, 1544,4480, 1552,8576, 1560,12672, 1568,2240, - 1576,4992, 1584,9088, 1592,13184, 1600,2368, 1608,5504, 1616,9600, - 1624,13696, 1632,1920, 1640,6016, 1648,10112, 1656,14208, 1664,2432, - 1672,6528, 1680,10624, 1688,14720, 1696,2944, 1704,7040, 1712,11136, - 1720,15232, 1728,3456, 1736,7552, 1744,11648, 1752,15744, 1760,3968, - 1768,8064, 1776,12160, 1784,16256, 1792,3136, 1800,4544, 1808,8640, - 1816,12736, 1824,3264, 1832,5056, 1840,9152, 1848,13248, 1856,3392, - 1864,5568, 1872,9664, 1880,13760, 1888,1984, 1896,6080, 1904,10176, - 1912,14272, 1920,2496, 1928,6592, 1936,10688, 1944,14784, 1952,3008, - 1960,7104, 1968,11200, 1976,15296, 1984,3520, 1992,7616, 2000,11712, - 2008,15808, 2016,4032, 2024,8128, 2032,12224, 2040,16320, 2048,4096, - 2056,4104, 2064,8200, 2072,12296, 2080,4224, 2088,4616, 2096,8712, - 2104,12808, 2112,4352, 2120,5128, 2128,9224, 2136,13320, 2144,4480, - 2152,5640, 2160,9736, 2168,13832, 2176,4104, 2184,6152, 2192,10248, - 2200,14344, 2208,2568, 2216,6664, 2224,10760, 2232,14856, 2240,3080, - 2248,7176, 2256,11272, 2264,15368, 2272,3592, 2280,7688, 2288,11784, - 2296,15880, 2304,5120, 2312,4168, 2320,8264, 2328,12360, 2336,5248, - 2344,4680, 2352,8776, 2360,12872, 2368,5376, 2376,5192, 2384,9288, - 2392,13384, 2400,5504, 2408,5704, 2416,9800, 2424,13896, 2432,5128, - 2440,6216, 2448,10312, 2456,14408, 2464,2632, 2472,6728, 2480,10824, - 2488,14920, 2496,3144, 2504,7240, 2512,11336, 2520,15432, 2528,3656, - 2536,7752, 2544,11848, 2552,15944, 2560,6144, 2568,4232, 2576,8328, - 2584,12424, 2592,6272, 2600,4744, 2608,8840, 2616,12936, 2624,6400, - 2632,5256, 2640,9352, 2648,13448, 2656,6528, 2664,5768, 2672,9864, - 2680,13960, 2688,6152, 2696,6280, 2704,10376, 2712,14472, 2720,6280, - 2728,6792, 2736,10888, 2744,14984, 2752,3208, 2760,7304, 2768,11400, - 2776,15496, 2784,3720, 2792,7816, 2800,11912, 2808,16008, 2816,7168, - 2824,4296, 2832,8392, 2840,12488, 2848,7296, 2856,4808, 2864,8904, - 2872,13000, 2880,7424, 2888,5320, 2896,9416, 2904,13512, 2912,7552, - 2920,5832, 2928,9928, 2936,14024, 2944,7176, 2952,6344, 2960,10440, - 2968,14536, 2976,7304, 2984,6856, 2992,10952, 3000,15048, 3008,3272, - 3016,7368, 3024,11464, 3032,15560, 3040,3784, 3048,7880, 3056,11976, - 3064,16072, 3072,4160, 3080,4360, 3088,8456, 3096,12552, 3104,4288, - 3112,4872, 3120,8968, 3128,13064, 3136,4416, 3144,5384, 3152,9480, - 3160,13576, 3168,4544, 3176,5896, 3184,9992, 3192,14088, 3200,4168, - 3208,6408, 3216,10504, 3224,14600, 3232,4296, 3240,6920, 3248,11016, - 3256,15112, 3264,3336, 3272,7432, 3280,11528, 3288,15624, 3296,3848, - 3304,7944, 3312,12040, 3320,16136, 3328,5184, 3336,4424, 3344,8520, - 3352,12616, 3360,5312, 3368,4936, 3376,9032, 3384,13128, 3392,5440, - 3400,5448, 3408,9544, 3416,13640, 3424,5568, 3432,5960, 3440,10056, - 3448,14152, 3456,5192, 3464,6472, 3472,10568, 3480,14664, 3488,5320, - 3496,6984, 3504,11080, 3512,15176, 3520,5448, 3528,7496, 3536,11592, - 3544,15688, 3552,3912, 3560,8008, 3568,12104, 3576,16200, 3584,6208, - 3592,4488, 3600,8584, 3608,12680, 3616,6336, 3624,5000, 3632,9096, - 3640,13192, 3648,6464, 3656,5512, 3664,9608, 3672,13704, 3680,6592, - 3688,6024, 3696,10120, 3704,14216, 3712,6216, 3720,6536, 3728,10632, - 3736,14728, 3744,6344, 3752,7048, 3760,11144, 3768,15240, 3776,6472, - 3784,7560, 3792,11656, 3800,15752, 3808,3976, 3816,8072, 3824,12168, - 3832,16264, 3840,7232, 3848,4552, 3856,8648, 3864,12744, 3872,7360, - 3880,5064, 3888,9160, 3896,13256, 3904,7488, 3912,5576, 3920,9672, - 3928,13768, 3936,7616, 3944,6088, 3952,10184, 3960,14280, 3968,7240, - 3976,6600, 3984,10696, 3992,14792, 4000,7368, 4008,7112, 4016,11208, - 4024,15304, 4032,7496, 4040,7624, 4048,11720, 4056,15816, 4064,7624, - 4072,8136, 4080,12232, 4088,16328, 4096,8192, 4104,4112, 4112,8208, - 4120,12304, 4128,8320, 4136,4624, 4144,8720, 4152,12816, 4160,8448, - 4168,5136, 4176,9232, 4184,13328, 4192,8576, 4200,5648, 4208,9744, - 4216,13840, 4224,8200, 4232,6160, 4240,10256, 4248,14352, 4256,8328, - 4264,6672, 4272,10768, 4280,14864, 4288,8456, 4296,7184, 4304,11280, - 4312,15376, 4320,8584, 4328,7696, 4336,11792, 4344,15888, 4352,9216, - 4360,9232, 4368,8272, 4376,12368, 4384,9344, 4392,4688, 4400,8784, - 4408,12880, 4416,9472, 4424,5200, 4432,9296, 4440,13392, 4448,9600, - 4456,5712, 4464,9808, 4472,13904, 4480,9224, 4488,6224, 4496,10320, - 4504,14416, 4512,9352, 4520,6736, 4528,10832, 4536,14928, 4544,9480, - 4552,7248, 4560,11344, 4568,15440, 4576,9608, 4584,7760, 4592,11856, - 4600,15952, 4608,10240, 4616,10256, 4624,8336, 4632,12432, 4640,10368, - 4648,4752, 4656,8848, 4664,12944, 4672,10496, 4680,5264, 4688,9360, - 4696,13456, 4704,10624, 4712,5776, 4720,9872, 4728,13968, 4736,10248, - 4744,6288, 4752,10384, 4760,14480, 4768,10376, 4776,6800, 4784,10896, - 4792,14992, 4800,10504, 4808,7312, 4816,11408, 4824,15504, 4832,10632, - 4840,7824, 4848,11920, 4856,16016, 4864,11264, 4872,11280, 4880,8400, - 4888,12496, 4896,11392, 4904,11408, 4912,8912, 4920,13008, 4928,11520, - 4936,5328, 4944,9424, 4952,13520, 4960,11648, 4968,5840, 4976,9936, - 4984,14032, 4992,11272, 5000,6352, 5008,10448, 5016,14544, 5024,11400, - 5032,6864, 5040,10960, 5048,15056, 5056,11528, 5064,7376, 5072,11472, - 5080,15568, 5088,11656, 5096,7888, 5104,11984, 5112,16080, 5120,8256, - 5128,8272, 5136,8464, 5144,12560, 5152,8384, 5160,8400, 5168,8976, - 5176,13072, 5184,8512, 5192,5392, 5200,9488, 5208,13584, 5216,8640, - 5224,5904, 5232,10000, 5240,14096, 5248,8264, 5256,6416, 5264,10512, - 5272,14608, 5280,8392, 5288,6928, 5296,11024, 5304,15120, 5312,8520, - 5320,7440, 5328,11536, 5336,15632, 5344,8648, 5352,7952, 5360,12048, - 5368,16144, 5376,9280, 5384,9296, 5392,8528, 5400,12624, 5408,9408, - 5416,9424, 5424,9040, 5432,13136, 5440,9536, 5448,5456, 5456,9552, - 5464,13648, 5472,9664, 5480,5968, 5488,10064, 5496,14160, 5504,9288, - 5512,6480, 5520,10576, 5528,14672, 5536,9416, 5544,6992, 5552,11088, - 5560,15184, 5568,9544, 5576,7504, 5584,11600, 5592,15696, 5600,9672, - 5608,8016, 5616,12112, 5624,16208, 5632,10304, 5640,10320, 5648,8592, - 5656,12688, 5664,10432, 5672,10448, 5680,9104, 5688,13200, 5696,10560, - 5704,10576, 5712,9616, 5720,13712, 5728,10688, 5736,6032, 5744,10128, - 5752,14224, 5760,10312, 5768,6544, 5776,10640, 5784,14736, 5792,10440, - 5800,7056, 5808,11152, 5816,15248, 5824,10568, 5832,7568, 5840,11664, - 5848,15760, 5856,10696, 5864,8080, 5872,12176, 5880,16272, 5888,11328, - 5896,11344, 5904,8656, 5912,12752, 5920,11456, 5928,11472, 5936,9168, - 5944,13264, 5952,11584, 5960,11600, 5968,9680, 5976,13776, 5984,11712, - 5992,6096, 6000,10192, 6008,14288, 6016,11336, 6024,6608, 6032,10704, - 6040,14800, 6048,11464, 6056,7120, 6064,11216, 6072,15312, 6080,11592, - 6088,7632, 6096,11728, 6104,15824, 6112,11720, 6120,8144, 6128,12240, - 6136,16336, 6144,12288, 6152,12304, 6160,8216, 6168,12312, 6176,12416, - 6184,12432, 6192,8728, 6200,12824, 6208,12544, 6216,12560, 6224,9240, - 6232,13336, 6240,12672, 6248,12688, 6256,9752, 6264,13848, 6272,12296, - 6280,12312, 6288,10264, 6296,14360, 6304,12424, 6312,6680, 6320,10776, - 6328,14872, 6336,12552, 6344,7192, 6352,11288, 6360,15384, 6368,12680, - 6376,7704, 6384,11800, 6392,15896, 6400,13312, 6408,13328, 6416,8280, - 6424,12376, 6432,13440, 6440,13456, 6448,8792, 6456,12888, 6464,13568, - 6472,13584, 6480,9304, 6488,13400, 6496,13696, 6504,13712, 6512,9816, - 6520,13912, 6528,13320, 6536,13336, 6544,10328, 6552,14424, 6560,13448, - 6568,6744, 6576,10840, 6584,14936, 6592,13576, 6600,7256, 6608,11352, - 6616,15448, 6624,13704, 6632,7768, 6640,11864, 6648,15960, 6656,14336, - 6664,14352, 6672,8344, 6680,12440, 6688,14464, 6696,14480, 6704,8856, - 6712,12952, 6720,14592, 6728,14608, 6736,9368, 6744,13464, 6752,14720, - 6760,14736, 6768,9880, 6776,13976, 6784,14344, 6792,14360, 6800,10392, - 6808,14488, 6816,14472, 6824,14488, 6832,10904, 6840,15000, 6848,14600, - 6856,7320, 6864,11416, 6872,15512, 6880,14728, 6888,7832, 6896,11928, - 6904,16024, 6912,15360, 6920,15376, 6928,8408, 6936,12504, 6944,15488, - 6952,15504, 6960,8920, 6968,13016, 6976,15616, 6984,15632, 6992,9432, - 7000,13528, 7008,15744, 7016,15760, 7024,9944, 7032,14040, 7040,15368, - 7048,15384, 7056,10456, 7064,14552, 7072,15496, 7080,15512, 7088,10968, - 7096,15064, 7104,15624, 7112,7384, 7120,11480, 7128,15576, 7136,15752, - 7144,7896, 7152,11992, 7160,16088, 7168,12352, 7176,12368, 7184,8472, - 7192,12568, 7200,12480, 7208,12496, 7216,8984, 7224,13080, 7232,12608, - 7240,12624, 7248,9496, 7256,13592, 7264,12736, 7272,12752, 7280,10008, - 7288,14104, 7296,12360, 7304,12376, 7312,10520, 7320,14616, 7328,12488, - 7336,12504, 7344,11032, 7352,15128, 7360,12616, 7368,7448, 7376,11544, - 7384,15640, 7392,12744, 7400,7960, 7408,12056, 7416,16152, 7424,13376, - 7432,13392, 7440,8536, 7448,12632, 7456,13504, 7464,13520, 7472,9048, - 7480,13144, 7488,13632, 7496,13648, 7504,9560, 7512,13656, 7520,13760, - 7528,13776, 7536,10072, 7544,14168, 7552,13384, 7560,13400, 7568,10584, - 7576,14680, 7584,13512, 7592,13528, 7600,11096, 7608,15192, 7616,13640, - 7624,13656, 7632,11608, 7640,15704, 7648,13768, 7656,8024, 7664,12120, - 7672,16216, 7680,14400, 7688,14416, 7696,8600, 7704,12696, 7712,14528, - 7720,14544, 7728,9112, 7736,13208, 7744,14656, 7752,14672, 7760,9624, - 7768,13720, 7776,14784, 7784,14800, 7792,10136, 7800,14232, 7808,14408, - 7816,14424, 7824,10648, 7832,14744, 7840,14536, 7848,14552, 7856,11160, - 7864,15256, 7872,14664, 7880,14680, 7888,11672, 7896,15768, 7904,14792, - 7912,8088, 7920,12184, 7928,16280, 7936,15424, 7944,15440, 7952,8664, - 7960,12760, 7968,15552, 7976,15568, 7984,9176, 7992,13272, 8000,15680, - 8008,15696, 8016,9688, 8024,13784, 8032,15808, 8040,15824, 8048,10200, - 8056,14296, 8064,15432, 8072,15448, 8080,10712, 8088,14808, 8096,15560, - 8104,15576, 8112,11224, 8120,15320, 8128,15688, 8136,15704, 8144,11736, - 8152,15832, 8160,15816, 8168,15832, 8176,12248, 8184,16344, 8200,8320, - 8208,8224, 8216,12320, 8232,10368, 8240,8736, 8248,12832, 8256,8448, - 8264,8384, 8272,9248, 8280,13344, 8288,9232, 8296,10432, 8304,9760, - 8312,13856, 8328,12416, 8336,10272, 8344,14368, 8352,12296, 8360,14464, - 8368,10784, 8376,14880, 8384,8456, 8392,12480, 8400,11296, 8408,15392, - 8416,12552, 8424,14528, 8432,11808, 8440,15904, 8448,9216, 8456,8576, - 8464,9232, 8472,12384, 8480,9248, 8488,10624, 8496,8800, 8504,12896, - 8512,9472, 8520,8640, 8528,9312, 8536,13408, 8544,9296, 8552,10688, - 8560,9824, 8568,13920, 8576,9224, 8584,12672, 8592,10336, 8600,14432, - 8608,13320, 8616,14720, 8624,10848, 8632,14944, 8640,9480, 8648,12736, - 8656,11360, 8664,15456, 8672,13576, 8680,14784, 8688,11872, 8696,15968, - 8704,12288, 8712,12416, 8720,12296, 8728,12448, 8736,12304, 8744,10376, - 8752,8864, 8760,12960, 8768,12352, 8776,12480, 8784,9376, 8792,13472, - 8800,12368, 8808,10440, 8816,9888, 8824,13984, 8832,12320, 8840,12424, - 8848,10400, 8856,14496, 8864,12312, 8872,14472, 8880,10912, 8888,15008, - 8896,12384, 8904,12488, 8912,11424, 8920,15520, 8928,12568, 8936,14536, - 8944,11936, 8952,16032, 8960,12544, 8968,12672, 8976,12552, 8984,12512, - 8992,12560, 9000,10632, 9008,12568, 9016,13024, 9024,12608, 9032,12736, - 9040,9440, 9048,13536, 9056,12624, 9064,10696, 9072,9952, 9080,14048, - 9088,9240, 9096,12680, 9104,10464, 9112,14560, 9120,13336, 9128,14728, - 9136,10976, 9144,15072, 9152,9496, 9160,12744, 9168,11488, 9176,15584, - 9184,13592, 9192,14792, 9200,12000, 9208,16096, 9224,9344, 9232,9248, - 9240,12576, 9256,11392, 9264,12560, 9272,13088, 9280,9472, 9288,9408, - 9296,9504, 9304,13600, 9312,9488, 9320,11456, 9328,10016, 9336,14112, - 9352,13440, 9360,10528, 9368,14624, 9376,12360, 9384,15488, 9392,11040, - 9400,15136, 9408,9480, 9416,13504, 9424,11552, 9432,15648, 9440,12616, - 9448,15552, 9456,12064, 9464,16160, 9480,9600, 9488,9504, 9496,12640, - 9512,11648, 9520,12624, 9528,13152, 9544,9664, 9552,9568, 9560,13664, - 9576,11712, 9584,10080, 9592,14176, 9608,13696, 9616,10592, 9624,14688, - 9632,13384, 9640,15744, 9648,11104, 9656,15200, 9672,13760, 9680,11616, - 9688,15712, 9696,13640, 9704,15808, 9712,12128, 9720,16224, 9728,13312, - 9736,13440, 9744,13320, 9752,12704, 9760,13328, 9768,11400, 9776,13336, - 9784,13216, 9792,13376, 9800,13504, 9808,13384, 9816,13728, 9824,13392, - 9832,11464, 9840,10144, 9848,14240, 9856,13344, 9864,13448, 9872,10656, - 9880,14752, 9888,12376, 9896,15496, 9904,11168, 9912,15264, 9920,13408, - 9928,13512, 9936,11680, 9944,15776, 9952,12632, 9960,15560, 9968,12192, - 9976,16288, 9984,13568, 9992,13696, 10000,13576, 10008,12768, 10016,13584, - 10024,11656, 10032,13592, 10040,13280, 10048,13632, 10056,13760, - 10064,13640, 10072,13792, 10080,13648, 10088,11720, 10096,10208, - 10104,14304, 10112,13600, 10120,13704, 10128,10720, 10136,14816, - 10144,13400, 10152,15752, 10160,11232, 10168,15328, 10176,13664, - 10184,13768, 10192,11744, 10200,15840, 10208,13656, 10216,15816, - 10224,12256, 10232,16352, 10248,10272, 10256,10368, 10264,12328, - 10280,10384, 10288,10376, 10296,12840, 10304,11264, 10312,11296, - 10320,11392, 10328,13352, 10336,11272, 10344,10448, 10352,11400, - 10360,13864, 10376,12432, 10392,14376, 10400,12328, 10408,14480, - 10416,10792, 10424,14888, 10432,11280, 10440,12496, 10448,11304, - 10456,15400, 10464,11288, 10472,14544, 10480,11816, 10488,15912, - 10496,11264, 10504,11272, 10512,11280, 10520,12392, 10528,11296, - 10536,10640, 10544,12496, 10552,12904, 10560,11328, 10568,11360, - 10576,11456, 10584,13416, 10592,11336, 10600,10704, 10608,11464, - 10616,13928, 10624,11392, 10632,12688, 10640,11304, 10648,14440, - 10656,13352, 10664,14736, 10672,10856, 10680,14952, 10688,11344, - 10696,12752, 10704,11368, 10712,15464, 10720,11352, 10728,14800, - 10736,11880, 10744,15976, 10752,14336, 10760,14368, 10768,14464, - 10776,12456, 10784,14344, 10792,14376, 10800,14472, 10808,12968, - 10816,15360, 10824,15392, 10832,15488, 10840,13480, 10848,15368, - 10856,15400, 10864,15496, 10872,13992, 10880,14352, 10888,12440, - 10896,14480, 10904,14504, 10912,14360, 10920,14488, 10928,14488, - 10936,15016, 10944,15376, 10952,12504, 10960,11432, 10968,15528, - 10976,15384, 10984,14552, 10992,11944, 11000,16040, 11008,14400, - 11016,14432, 11024,14528, 11032,12520, 11040,14408, 11048,14440, - 11056,14536, 11064,13032, 11072,15424, 11080,15456, 11088,15552, - 11096,13544, 11104,15432, 11112,15464, 11120,15560, 11128,14056, - 11136,14416, 11144,12696, 11152,14544, 11160,14568, 11168,14424, - 11176,14744, 11184,14552, 11192,15080, 11200,15440, 11208,12760, - 11216,11496, 11224,15592, 11232,15448, 11240,14808, 11248,12008, - 11256,16104, 11272,11296, 11280,11392, 11288,12584, 11304,11408, - 11312,12688, 11320,13096, 11328,11520, 11336,11552, 11344,11648, - 11352,13608, 11360,11528, 11368,11472, 11376,11656, 11384,14120, - 11400,13456, 11416,14632, 11424,12392, 11432,15504, 11440,14440, - 11448,15144, 11456,11536, 11464,13520, 11472,11560, 11480,15656, - 11488,11544, 11496,15568, 11504,12072, 11512,16168, 11528,11552, - 11536,11648, 11544,12648, 11560,11664, 11568,12752, 11576,13160, - 11592,11616, 11600,11712, 11608,13672, 11624,11728, 11632,11720, - 11640,14184, 11656,13712, 11672,14696, 11680,13416, 11688,15760, - 11696,15464, 11704,15208, 11720,13776, 11736,15720, 11744,13672, - 11752,15824, 11760,12136, 11768,16232, 11776,14592, 11784,14624, - 11792,14720, 11800,12712, 11808,14600, 11816,14632, 11824,14728, - 11832,13224, 11840,15616, 11848,15648, 11856,15744, 11864,13736, - 11872,15624, 11880,15656, 11888,15752, 11896,14248, 11904,14608, - 11912,13464, 11920,14736, 11928,14760, 11936,14616, 11944,15512, - 11952,14744, 11960,15272, 11968,15632, 11976,13528, 11984,15760, - 11992,15784, 12000,15640, 12008,15576, 12016,12200, 12024,16296, - 12032,14656, 12040,14688, 12048,14784, 12056,12776, 12064,14664, - 12072,14696, 12080,14792, 12088,13288, 12096,15680, 12104,15712, - 12112,15808, 12120,13800, 12128,15688, 12136,15720, 12144,15816, - 12152,14312, 12160,14672, 12168,13720, 12176,14800, 12184,14824, - 12192,14680, 12200,15768, 12208,14808, 12216,15336, 12224,15696, - 12232,13784, 12240,15824, 12248,15848, 12256,15704, 12264,15832, - 12272,15832, 12280,16360, 12312,12336, 12344,12848, 12352,12544, - 12360,12552, 12368,12560, 12376,13360, 12384,12576, 12392,12584, - 12400,13336, 12408,13872, 12424,12448, 12440,14384, 12456,14496, - 12464,14472, 12472,14896, 12480,12672, 12488,12512, 12496,12688, - 12504,15408, 12512,12680, 12520,14560, 12528,14728, 12536,15920, - 12544,13312, 12552,13320, 12560,13328, 12568,13336, 12576,13344, - 12584,13352, 12592,13360, 12600,12912, 12608,13568, 12616,13576, - 12624,13584, 12632,13424, 12640,13600, 12648,13608, 12656,13400, - 12664,13936, 12672,13440, 12680,12704, 12688,13456, 12696,14448, - 12704,13448, 12712,14752, 12720,15496, 12728,14960, 12736,13696, - 12744,12768, 12752,13712, 12760,15472, 12768,13704, 12776,14816, - 12784,15752, 12792,15984, 12800,14336, 12808,14464, 12816,14344, - 12824,14472, 12832,14352, 12840,14480, 12848,14360, 12856,12976, - 12864,14400, 12872,14528, 12880,14408, 12888,13488, 12896,14416, - 12904,14544, 12912,14424, 12920,14000, 12928,14368, 12936,14496, - 12944,14376, 12952,14512, 12960,14384, 12968,14504, 12976,14488, - 12984,15024, 12992,14432, 13000,14560, 13008,14440, 13016,15536, - 13024,14448, 13032,14568, 13040,14744, 13048,16048, 13056,14592, - 13064,14720, 13072,14600, 13080,14728, 13088,14608, 13096,14736, - 13104,14616, 13112,14744, 13120,14656, 13128,14784, 13136,14664, - 13144,13552, 13152,14672, 13160,14800, 13168,14680, 13176,14064, - 13184,14624, 13192,14752, 13200,14632, 13208,14576, 13216,13464, - 13224,14760, 13232,15512, 13240,15088, 13248,14688, 13256,14816, - 13264,14696, 13272,15600, 13280,13720, 13288,14824, 13296,15768, - 13304,16112, 13336,13360, 13368,14616, 13376,13568, 13384,13576, - 13392,13584, 13400,13616, 13408,13600, 13416,13608, 13424,13592, - 13432,14128, 13448,13472, 13464,14640, 13480,15520, 13488,14536, - 13496,15152, 13504,13696, 13512,13536, 13520,13712, 13528,15664, - 13536,13704, 13544,15584, 13552,14792, 13560,16176, 13592,13616, - 13624,14680, 13656,13680, 13688,14192, 13704,13728, 13720,14704, - 13736,15776, 13744,15560, 13752,15216, 13768,13792, 13784,15728, - 13800,15840, 13808,15816, 13816,16240, 13824,15360, 13832,15488, - 13840,15368, 13848,15496, 13856,15376, 13864,15504, 13872,15384, - 13880,15512, 13888,15424, 13896,15552, 13904,15432, 13912,15560, - 13920,15440, 13928,15568, 13936,15448, 13944,14256, 13952,15392, - 13960,15520, 13968,15400, 13976,14768, 13984,15408, 13992,15528, - 14000,14552, 14008,15280, 14016,15456, 14024,15584, 14032,15464, - 14040,15792, 14048,15472, 14056,15592, 14064,14808, 14072,16304, - 14080,15616, 14088,15744, 14096,15624, 14104,15752, 14112,15632, - 14120,15760, 14128,15640, 14136,15768, 14144,15680, 14152,15808, - 14160,15688, 14168,15816, 14176,15696, 14184,15824, 14192,15704, - 14200,14320, 14208,15648, 14216,15776, 14224,15656, 14232,14832, - 14240,15664, 14248,15784, 14256,15576, 14264,15344, 14272,15712, - 14280,15840, 14288,15720, 14296,15856, 14304,15728, 14312,15848, - 14320,15832, 14328,16368, 14392,14488, 14400,14592, 14408,14600, - 14416,14608, 14424,14616, 14432,14624, 14440,14632, 14448,14640, - 14456,15512, 14504,14512, 14520,14904, 14528,14720, 14536,14728, - 14544,14736, 14552,15416, 14560,14752, 14568,14576, 14584,15928, - 14576,14760, 14592,15360, 14600,15368, 14608,15376, 14616,15384, - 14624,15392, 14632,15400, 14640,15408, 14648,15416, 14656,15616, - 14664,15624, 14672,15632, 14680,15640, 14688,15648, 14696,15656, - 14704,15664, 14712,15576, 14720,15488, 14728,15496, 14736,15504, - 14744,15512, 14752,15520, 14760,14768, 14776,14968, 14768,15528, - 14784,15744, 14792,15752, 14800,15760, 14808,15480, 14816,15776, - 14824,14832, 14840,15992, 14832,15784, 14856,14864, 14864,14880, - 14872,14896, 14880,14976, 14888,14992, 14896,15008, 14904,15024, - 14912,15104, 14920,15120, 14928,15136, 14936,15152, 14944,15232, - 14952,15248, 14960,15264, 14968,15280, 14984,15008, 15000,15024, - 15016,15024, 15040,15112, 15048,15128, 15056,15144, 15064,15544, - 15072,15240, 15080,15256, 15088,15272, 15096,16056, 15104,15872, - 15112,15888, 15120,15904, 15128,15920, 15136,16000, 15144,16016, - 15152,16032, 15160,16048, 15168,16128, 15176,16144, 15184,16160, - 15192,16176, 15200,16256, 15208,16272, 15216,16288, 15224,16304, - 15232,15880, 15240,15896, 15248,15912, 15256,15928, 15264,16008, - 15272,16024, 15280,16040, 15288,16056, 15296,16136, 15304,16152, - 15312,16168, 15320,15608, 15328,16264, 15336,16280, 15344,16296, - 15352,16120, 15416,15512, 15424,15616, 15432,15624, 15440,15632, - 15448,15640, 15456,15648, 15464,15656, 15472,15664, 15480,15768, - 15528,15536, 15544,16048, 15552,15744, 15560,15752, 15568,15760, - 15576,15672, 15584,15776, 15592,15600, 15600,15784, 15608,16184, - 15672,15768, 15736,15832, 15784,15792, 15800,16304, 15848,15856, - 15880,16000, 15864,16248, 15888,16000, 15896,16008, 15904,16000, - 15912,16016, 15920,16008, 15928,16024, 15936,16128, 15944,16160, - 15952,16256, 15960,16288, 15968,16136, 15976,16168, 15984,16264, - 15992,16296, 16008,16032, 16024,16040, 16064,16144, 16040,16048, - 16072,16176, 16080,16272, 16088,16304, 16096,16152, 16104,16184, - 16112,16280, 16136,16256, 16120,16312, 16144,16256, 16152,16264, - 16160,16256, 16168,16272, 16176,16264, 16184,16280, 16200,16208, - 16208,16224, 16216,16240, 16224,16320, 16232,16336, 16240,16352, - 16248,16368, 16264,16288, 16280,16296, 16296,16304, 16344,16368, - 16328,16352, 16360,16368 -}; - -const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH] = -{ - //radix 8, size 4032 - 8,4096, 16,8192, 24,12288, 32,16384, 40,20480, 48,24576, 56,28672, 64,512, - 72,4608, 80,8704, 88,12800, 96,16896, 104,20992, 112,25088, 120,29184, - 128,1024, 136,5120, 144,9216, 152,13312, 160,17408, 168,21504, 176,25600, - 184,29696, 192,1536, 200,5632, 208,9728, 216,13824, 224,17920, 232,22016, - 240,26112, 248,30208, 256,2048, 264,6144, 272,10240, 280,14336, 288,18432, - 296,22528, 304,26624, 312,30720, 320,2560, 328,6656, 336,10752, 344,14848, - 352,18944, 360,23040, 368,27136, 376,31232, 384,3072, 392,7168, 400,11264, - 408,15360, 416,19456, 424,23552, 432,27648, 440,31744, 448,3584, 456,7680, - 464,11776, 472,15872, 480,19968, 488,24064, 496,28160, 504,32256, 520,4160, - 528,8256, 536,12352, 544,16448, 552,20544, 560,24640, 568,28736, 584,4672, - 592,8768, 600,12864, 608,16960, 616,21056, 624,25152, 632,29248, 640,1088, - 648,5184, 656,9280, 664,13376, 672,17472, 680,21568, 688,25664, 696,29760, - 704,1600, 712,5696, 720,9792, 728,13888, 736,17984, 744,22080, 752,26176, - 760,30272, 768,2112, 776,6208, 784,10304, 792,14400, 800,18496, 808,22592, - 816,26688, 824,30784, 832,2624, 840,6720, 848,10816, 856,14912, 864,19008, - 872,23104, 880,27200, 888,31296, 896,3136, 904,7232, 912,11328, 920,15424, - 928,19520, 936,23616, 944,27712, 952,31808, 960,3648, 968,7744, 976,11840, - 984,15936, 992,20032, 1000,24128, 1008,28224, 1016,32320, 1032,4224, - 1040,8320, 1048,12416, 1056,16512, 1064,20608, 1072,24704, 1080,28800, - 1096,4736, 1104,8832, 1112,12928, 1120,17024, 1128,21120, 1136,25216, - 1144,29312, 1160,5248, 1168,9344, 1176,13440, 1184,17536, 1192,21632, - 1200,25728, 1208,29824, 1216,1664, 1224,5760, 1232,9856, 1240,13952, - 1248,18048, 1256,22144, 1264,26240, 1272,30336, 1280,2176, 1288,6272, - 1296,10368, 1304,14464, 1312,18560, 1320,22656, 1328,26752, 1336,30848, - 1344,2688, 1352,6784, 1360,10880, 1368,14976, 1376,19072, 1384,23168, - 1392,27264, 1400,31360, 1408,3200, 1416,7296, 1424,11392, 1432,15488, - 1440,19584, 1448,23680, 1456,27776, 1464,31872, 1472,3712, 1480,7808, - 1488,11904, 1496,16000, 1504,20096, 1512,24192, 1520,28288, 1528,32384, - 1544,4288, 1552,8384, 1560,12480, 1568,16576, 1576,20672, 1584,24768, - 1592,28864, 1608,4800, 1616,8896, 1624,12992, 1632,17088, 1640,21184, - 1648,25280, 1656,29376, 1672,5312, 1680,9408, 1688,13504, 1696,17600, - 1704,21696, 1712,25792, 1720,29888, 1736,5824, 1744,9920, 1752,14016, - 1760,18112, 1768,22208, 1776,26304, 1784,30400, 1792,2240, 1800,6336, - 1808,10432, 1816,14528, 1824,18624, 1832,22720, 1840,26816, 1848,30912, - 1856,2752, 1864,6848, 1872,10944, 1880,15040, 1888,19136, 1896,23232, - 1904,27328, 1912,31424, 1920,3264, 1928,7360, 1936,11456, 1944,15552, - 1952,19648, 1960,23744, 1968,27840, 1976,31936, 1984,3776, 1992,7872, - 2000,11968, 2008,16064, 2016,20160, 2024,24256, 2032,28352, 2040,32448, - 2056,4352, 2064,8448, 2072,12544, 2080,16640, 2088,20736, 2096,24832, - 2104,28928, 2120,4864, 2128,8960, 2136,13056, 2144,17152, 2152,21248, - 2160,25344, 2168,29440, 2184,5376, 2192,9472, 2200,13568, 2208,17664, - 2216,21760, 2224,25856, 2232,29952, 2248,5888, 2256,9984, 2264,14080, - 2272,18176, 2280,22272, 2288,26368, 2296,30464, 2312,6400, 2320,10496, - 2328,14592, 2336,18688, 2344,22784, 2352,26880, 2360,30976, 2368,2816, - 2376,6912, 2384,11008, 2392,15104, 2400,19200, 2408,23296, 2416,27392, - 2424,31488, 2432,3328, 2440,7424, 2448,11520, 2456,15616, 2464,19712, - 2472,23808, 2480,27904, 2488,32000, 2496,3840, 2504,7936, 2512,12032, - 2520,16128, 2528,20224, 2536,24320, 2544,28416, 2552,32512, 2568,4416, - 2576,8512, 2584,12608, 2592,16704, 2600,20800, 2608,24896, 2616,28992, - 2632,4928, 2640,9024, 2648,13120, 2656,17216, 2664,21312, 2672,25408, - 2680,29504, 2696,5440, 2704,9536, 2712,13632, 2720,17728, 2728,21824, - 2736,25920, 2744,30016, 2760,5952, 2768,10048, 2776,14144, 2784,18240, - 2792,22336, 2800,26432, 2808,30528, 2824,6464, 2832,10560, 2840,14656, - 2848,18752, 2856,22848, 2864,26944, 2872,31040, 2888,6976, 2896,11072, - 2904,15168, 2912,19264, 2920,23360, 2928,27456, 2936,31552, 2944,3392, - 2952,7488, 2960,11584, 2968,15680, 2976,19776, 2984,23872, 2992,27968, - 3000,32064, 3008,3904, 3016,8000, 3024,12096, 3032,16192, 3040,20288, - 3048,24384, 3056,28480, 3064,32576, 3080,4480, 3088,8576, 3096,12672, - 3104,16768, 3112,20864, 3120,24960, 3128,29056, 3144,4992, 3152,9088, - 3160,13184, 3168,17280, 3176,21376, 3184,25472, 3192,29568, 3208,5504, - 3216,9600, 3224,13696, 3232,17792, 3240,21888, 3248,25984, 3256,30080, - 3272,6016, 3280,10112, 3288,14208, 3296,18304, 3304,22400, 3312,26496, - 3320,30592, 3336,6528, 3344,10624, 3352,14720, 3360,18816, 3368,22912, - 3376,27008, 3384,31104, 3400,7040, 3408,11136, 3416,15232, 3424,19328, - 3432,23424, 3440,27520, 3448,31616, 3464,7552, 3472,11648, 3480,15744, - 3488,19840, 3496,23936, 3504,28032, 3512,32128, 3520,3968, 3528,8064, - 3536,12160, 3544,16256, 3552,20352, 3560,24448, 3568,28544, 3576,32640, - 3592,4544, 3600,8640, 3608,12736, 3616,16832, 3624,20928, 3632,25024, - 3640,29120, 3656,5056, 3664,9152, 3672,13248, 3680,17344, 3688,21440, - 3696,25536, 3704,29632, 3720,5568, 3728,9664, 3736,13760, 3744,17856, - 3752,21952, 3760,26048, 3768,30144, 3784,6080, 3792,10176, 3800,14272, - 3808,18368, 3816,22464, 3824,26560, 3832,30656, 3848,6592, 3856,10688, - 3864,14784, 3872,18880, 3880,22976, 3888,27072, 3896,31168, 3912,7104, - 3920,11200, 3928,15296, 3936,19392, 3944,23488, 3952,27584, 3960,31680, - 3976,7616, 3984,11712, 3992,15808, 4000,19904, 4008,24000, 4016,28096, - 4024,32192, 4040,8128, 4048,12224, 4056,16320, 4064,20416, 4072,24512, - 4080,28608, 4088,32704, 4112,8200, 4120,12296, 4128,16392, 4136,20488, - 4144,24584, 4152,28680, 4168,4616, 4176,8712, 4184,12808, 4192,16904, - 4200,21000, 4208,25096, 4216,29192, 4232,5128, 4240,9224, 4248,13320, - 4256,17416, 4264,21512, 4272,25608, 4280,29704, 4296,5640, 4304,9736, - 4312,13832, 4320,17928, 4328,22024, 4336,26120, 4344,30216, 4360,6152, - 4368,10248, 4376,14344, 4384,18440, 4392,22536, 4400,26632, 4408,30728, - 4424,6664, 4432,10760, 4440,14856, 4448,18952, 4456,23048, 4464,27144, - 4472,31240, 4488,7176, 4496,11272, 4504,15368, 4512,19464, 4520,23560, - 4528,27656, 4536,31752, 4552,7688, 4560,11784, 4568,15880, 4576,19976, - 4584,24072, 4592,28168, 4600,32264, 4624,8264, 4632,12360, 4640,16456, - 4648,20552, 4656,24648, 4664,28744, 4688,8776, 4696,12872, 4704,16968, - 4712,21064, 4720,25160, 4728,29256, 4744,5192, 4752,9288, 4760,13384, - 4768,17480, 4776,21576, 4784,25672, 4792,29768, 4808,5704, 4816,9800, - 4824,13896, 4832,17992, 4840,22088, 4848,26184, 4856,30280, 4872,6216, - 4880,10312, 4888,14408, 4896,18504, 4904,22600, 4912,26696, 4920,30792, - 4936,6728, 4944,10824, 4952,14920, 4960,19016, 4968,23112, 4976,27208, - 4984,31304, 5000,7240, 5008,11336, 5016,15432, 5024,19528, 5032,23624, - 5040,27720, 5048,31816, 5064,7752, 5072,11848, 5080,15944, 5088,20040, - 5096,24136, 5104,28232, 5112,32328, 5136,8328, 5144,12424, 5152,16520, - 5160,20616, 5168,24712, 5176,28808, 5200,8840, 5208,12936, 5216,17032, - 5224,21128, 5232,25224, 5240,29320, 5264,9352, 5272,13448, 5280,17544, - 5288,21640, 5296,25736, 5304,29832, 5320,5768, 5328,9864, 5336,13960, - 5344,18056, 5352,22152, 5360,26248, 5368,30344, 5384,6280, 5392,10376, - 5400,14472, 5408,18568, 5416,22664, 5424,26760, 5432,30856, 5448,6792, - 5456,10888, 5464,14984, 5472,19080, 5480,23176, 5488,27272, 5496,31368, - 5512,7304, 5520,11400, 5528,15496, 5536,19592, 5544,23688, 5552,27784, - 5560,31880, 5576,7816, 5584,11912, 5592,16008, 5600,20104, 5608,24200, - 5616,28296, 5624,32392, 5648,8392, 5656,12488, 5664,16584, 5672,20680, - 5680,24776, 5688,28872, 5712,8904, 5720,13000, 5728,17096, 5736,21192, - 5744,25288, 5752,29384, 5776,9416, 5784,13512, 5792,17608, 5800,21704, - 5808,25800, 5816,29896, 5840,9928, 5848,14024, 5856,18120, 5864,22216, - 5872,26312, 5880,30408, 5896,6344, 5904,10440, 5912,14536, 5920,18632, - 5928,22728, 5936,26824, 5944,30920, 5960,6856, 5968,10952, 5976,15048, - 5984,19144, 5992,23240, 6000,27336, 6008,31432, 6024,7368, 6032,11464, - 6040,15560, 6048,19656, 6056,23752, 6064,27848, 6072,31944, 6088,7880, - 6096,11976, 6104,16072, 6112,20168, 6120,24264, 6128,28360, 6136,32456, - 6160,8456, 6168,12552, 6176,16648, 6184,20744, 6192,24840, 6200,28936, - 6224,8968, 6232,13064, 6240,17160, 6248,21256, 6256,25352, 6264,29448, - 6288,9480, 6296,13576, 6304,17672, 6312,21768, 6320,25864, 6328,29960, - 6352,9992, 6360,14088, 6368,18184, 6376,22280, 6384,26376, 6392,30472, - 6416,10504, 6424,14600, 6432,18696, 6440,22792, 6448,26888, 6456,30984, - 6472,6920, 6480,11016, 6488,15112, 6496,19208, 6504,23304, 6512,27400, - 6520,31496, 6536,7432, 6544,11528, 6552,15624, 6560,19720, 6568,23816, - 6576,27912, 6584,32008, 6600,7944, 6608,12040, 6616,16136, 6624,20232, - 6632,24328, 6640,28424, 6648,32520, 6672,8520, 6680,12616, 6688,16712, - 6696,20808, 6704,24904, 6712,29000, 6736,9032, 6744,13128, 6752,17224, - 6760,21320, 6768,25416, 6776,29512, 6800,9544, 6808,13640, 6816,17736, - 6824,21832, 6832,25928, 6840,30024, 6864,10056, 6872,14152, 6880,18248, - 6888,22344, 6896,26440, 6904,30536, 6928,10568, 6936,14664, 6944,18760, - 6952,22856, 6960,26952, 6968,31048, 6992,11080, 7000,15176, 7008,19272, - 7016,23368, 7024,27464, 7032,31560, 7048,7496, 7056,11592, 7064,15688, - 7072,19784, 7080,23880, 7088,27976, 7096,32072, 7112,8008, 7120,12104, - 7128,16200, 7136,20296, 7144,24392, 7152,28488, 7160,32584, 7184,8584, - 7192,12680, 7200,16776, 7208,20872, 7216,24968, 7224,29064, 7248,9096, - 7256,13192, 7264,17288, 7272,21384, 7280,25480, 7288,29576, 7312,9608, - 7320,13704, 7328,17800, 7336,21896, 7344,25992, 7352,30088, 7376,10120, - 7384,14216, 7392,18312, 7400,22408, 7408,26504, 7416,30600, 7440,10632, - 7448,14728, 7456,18824, 7464,22920, 7472,27016, 7480,31112, 7504,11144, - 7512,15240, 7520,19336, 7528,23432, 7536,27528, 7544,31624, 7568,11656, - 7576,15752, 7584,19848, 7592,23944, 7600,28040, 7608,32136, 7624,8072, - 7632,12168, 7640,16264, 7648,20360, 7656,24456, 7664,28552, 7672,32648, - 7696,8648, 7704,12744, 7712,16840, 7720,20936, 7728,25032, 7736,29128, - 7760,9160, 7768,13256, 7776,17352, 7784,21448, 7792,25544, 7800,29640, - 7824,9672, 7832,13768, 7840,17864, 7848,21960, 7856,26056, 7864,30152, - 7888,10184, 7896,14280, 7904,18376, 7912,22472, 7920,26568, 7928,30664, - 7952,10696, 7960,14792, 7968,18888, 7976,22984, 7984,27080, 7992,31176, - 8016,11208, 8024,15304, 8032,19400, 8040,23496, 8048,27592, 8056,31688, - 8080,11720, 8088,15816, 8096,19912, 8104,24008, 8112,28104, 8120,32200, - 8144,12232, 8152,16328, 8160,20424, 8168,24520, 8176,28616, 8184,32712, - 8216,12304, 8224,16400, 8232,20496, 8240,24592, 8248,28688, 8272,8720, - 8280,12816, 8288,16912, 8296,21008, 8304,25104, 8312,29200, 8336,9232, - 8344,13328, 8352,17424, 8360,21520, 8368,25616, 8376,29712, 8400,9744, - 8408,13840, 8416,17936, 8424,22032, 8432,26128, 8440,30224, 8464,10256, - 8472,14352, 8480,18448, 8488,22544, 8496,26640, 8504,30736, 8528,10768, - 8536,14864, 8544,18960, 8552,23056, 8560,27152, 8568,31248, 8592,11280, - 8600,15376, 8608,19472, 8616,23568, 8624,27664, 8632,31760, 8656,11792, - 8664,15888, 8672,19984, 8680,24080, 8688,28176, 8696,32272, 8728,12368, - 8736,16464, 8744,20560, 8752,24656, 8760,28752, 8792,12880, 8800,16976, - 8808,21072, 8816,25168, 8824,29264, 8848,9296, 8856,13392, 8864,17488, - 8872,21584, 8880,25680, 8888,29776, 8912,9808, 8920,13904, 8928,18000, - 8936,22096, 8944,26192, 8952,30288, 8976,10320, 8984,14416, 8992,18512, - 9000,22608, 9008,26704, 9016,30800, 9040,10832, 9048,14928, 9056,19024, - 9064,23120, 9072,27216, 9080,31312, 9104,11344, 9112,15440, 9120,19536, - 9128,23632, 9136,27728, 9144,31824, 9168,11856, 9176,15952, 9184,20048, - 9192,24144, 9200,28240, 9208,32336, 9240,12432, 9248,16528, 9256,20624, - 9264,24720, 9272,28816, 9304,12944, 9312,17040, 9320,21136, 9328,25232, - 9336,29328, 9368,13456, 9376,17552, 9384,21648, 9392,25744, 9400,29840, - 9424,9872, 9432,13968, 9440,18064, 9448,22160, 9456,26256, 9464,30352, - 9488,10384, 9496,14480, 9504,18576, 9512,22672, 9520,26768, 9528,30864, - 9552,10896, 9560,14992, 9568,19088, 9576,23184, 9584,27280, 9592,31376, - 9616,11408, 9624,15504, 9632,19600, 9640,23696, 9648,27792, 9656,31888, - 9680,11920, 9688,16016, 9696,20112, 9704,24208, 9712,28304, 9720,32400, - 9752,12496, 9760,16592, 9768,20688, 9776,24784, 9784,28880, 9816,13008, - 9824,17104, 9832,21200, 9840,25296, 9848,29392, 9880,13520, 9888,17616, - 9896,21712, 9904,25808, 9912,29904, 9944,14032, 9952,18128, 9960,22224, - 9968,26320, 9976,30416, 10000,10448, 10008,14544, 10016,18640, 10024,22736, - 10032,26832, 10040,30928, 10064,10960, 10072,15056, 10080,19152, - 10088,23248, 10096,27344, 10104,31440, 10128,11472, 10136,15568, - 10144,19664, 10152,23760, 10160,27856, 10168,31952, 10192,11984, - 10200,16080, 10208,20176, 10216,24272, 10224,28368, 10232,32464, - 10264,12560, 10272,16656, 10280,20752, 10288,24848, 10296,28944, - 10328,13072, 10336,17168, 10344,21264, 10352,25360, 10360,29456, - 10392,13584, 10400,17680, 10408,21776, 10416,25872, 10424,29968, - 10456,14096, 10464,18192, 10472,22288, 10480,26384, 10488,30480, - 10520,14608, 10528,18704, 10536,22800, 10544,26896, 10552,30992, - 10576,11024, 10584,15120, 10592,19216, 10600,23312, 10608,27408, - 10616,31504, 10640,11536, 10648,15632, 10656,19728, 10664,23824, - 10672,27920, 10680,32016, 10704,12048, 10712,16144, 10720,20240, - 10728,24336, 10736,28432, 10744,32528, 10776,12624, 10784,16720, - 10792,20816, 10800,24912, 10808,29008, 10840,13136, 10848,17232, - 10856,21328, 10864,25424, 10872,29520, 10904,13648, 10912,17744, - 10920,21840, 10928,25936, 10936,30032, 10968,14160, 10976,18256, - 10984,22352, 10992,26448, 11000,30544, 11032,14672, 11040,18768, - 11048,22864, 11056,26960, 11064,31056, 11096,15184, 11104,19280, - 11112,23376, 11120,27472, 11128,31568, 11152,11600, 11160,15696, - 11168,19792, 11176,23888, 11184,27984, 11192,32080, 11216,12112, - 11224,16208, 11232,20304, 11240,24400, 11248,28496, 11256,32592, - 11288,12688, 11296,16784, 11304,20880, 11312,24976, 11320,29072, - 11352,13200, 11360,17296, 11368,21392, 11376,25488, 11384,29584, - 11416,13712, 11424,17808, 11432,21904, 11440,26000, 11448,30096, - 11480,14224, 11488,18320, 11496,22416, 11504,26512, 11512,30608, - 11544,14736, 11552,18832, 11560,22928, 11568,27024, 11576,31120, - 11608,15248, 11616,19344, 11624,23440, 11632,27536, 11640,31632, - 11672,15760, 11680,19856, 11688,23952, 11696,28048, 11704,32144, - 11728,12176, 11736,16272, 11744,20368, 11752,24464, 11760,28560, - 11768,32656, 11800,12752, 11808,16848, 11816,20944, 11824,25040, - 11832,29136, 11864,13264, 11872,17360, 11880,21456, 11888,25552, - 11896,29648, 11928,13776, 11936,17872, 11944,21968, 11952,26064, - 11960,30160, 11992,14288, 12000,18384, 12008,22480, 12016,26576, - 12024,30672, 12056,14800, 12064,18896, 12072,22992, 12080,27088, - 12088,31184, 12120,15312, 12128,19408, 12136,23504, 12144,27600, - 12152,31696, 12184,15824, 12192,19920, 12200,24016, 12208,28112, - 12216,32208, 12248,16336, 12256,20432, 12264,24528, 12272,28624, - 12280,32720, 12320,16408, 12328,20504, 12336,24600, 12344,28696, - 12376,12824, 12384,16920, 12392,21016, 12400,25112, 12408,29208, - 12440,13336, 12448,17432, 12456,21528, 12464,25624, 12472,29720, - 12504,13848, 12512,17944, 12520,22040, 12528,26136, 12536,30232, - 12568,14360, 12576,18456, 12584,22552, 12592,26648, 12600,30744, - 12632,14872, 12640,18968, 12648,23064, 12656,27160, 12664,31256, - 12696,15384, 12704,19480, 12712,23576, 12720,27672, 12728,31768, - 12760,15896, 12768,19992, 12776,24088, 12784,28184, 12792,32280, - 12832,16472, 12840,20568, 12848,24664, 12856,28760, 12896,16984, - 12904,21080, 12912,25176, 12920,29272, 12952,13400, 12960,17496, - 12968,21592, 12976,25688, 12984,29784, 13016,13912, 13024,18008, - 13032,22104, 13040,26200, 13048,30296, 13080,14424, 13088,18520, - 13096,22616, 13104,26712, 13112,30808, 13144,14936, 13152,19032, - 13160,23128, 13168,27224, 13176,31320, 13208,15448, 13216,19544, - 13224,23640, 13232,27736, 13240,31832, 13272,15960, 13280,20056, - 13288,24152, 13296,28248, 13304,32344, 13344,16536, 13352,20632, - 13360,24728, 13368,28824, 13408,17048, 13416,21144, 13424,25240, - 13432,29336, 13472,17560, 13480,21656, 13488,25752, 13496,29848, - 13528,13976, 13536,18072, 13544,22168, 13552,26264, 13560,30360, - 13592,14488, 13600,18584, 13608,22680, 13616,26776, 13624,30872, - 13656,15000, 13664,19096, 13672,23192, 13680,27288, 13688,31384, - 13720,15512, 13728,19608, 13736,23704, 13744,27800, 13752,31896, - 13784,16024, 13792,20120, 13800,24216, 13808,28312, 13816,32408, - 13856,16600, 13864,20696, 13872,24792, 13880,28888, 13920,17112, - 13928,21208, 13936,25304, 13944,29400, 13984,17624, 13992,21720, - 14000,25816, 14008,29912, 14048,18136, 14056,22232, 14064,26328, - 14072,30424, 14104,14552, 14112,18648, 14120,22744, 14128,26840, - 14136,30936, 14168,15064, 14176,19160, 14184,23256, 14192,27352, - 14200,31448, 14232,15576, 14240,19672, 14248,23768, 14256,27864, - 14264,31960, 14296,16088, 14304,20184, 14312,24280, 14320,28376, - 14328,32472, 14368,16664, 14376,20760, 14384,24856, 14392,28952, - 14432,17176, 14440,21272, 14448,25368, 14456,29464, 14496,17688, - 14504,21784, 14512,25880, 14520,29976, 14560,18200, 14568,22296, - 14576,26392, 14584,30488, 14624,18712, 14632,22808, 14640,26904, - 14648,31000, 14680,15128, 14688,19224, 14696,23320, 14704,27416, - 14712,31512, 14744,15640, 14752,19736, 14760,23832, 14768,27928, - 14776,32024, 14808,16152, 14816,20248, 14824,24344, 14832,28440, - 14840,32536, 14880,16728, 14888,20824, 14896,24920, 14904,29016, - 14944,17240, 14952,21336, 14960,25432, 14968,29528, 15008,17752, - 15016,21848, 15024,25944, 15032,30040, 15072,18264, 15080,22360, - 15088,26456, 15096,30552, 15136,18776, 15144,22872, 15152,26968, - 15160,31064, 15200,19288, 15208,23384, 15216,27480, 15224,31576, - 15256,15704, 15264,19800, 15272,23896, 15280,27992, 15288,32088, - 15320,16216, 15328,20312, 15336,24408, 15344,28504, 15352,32600, - 15392,16792, 15400,20888, 15408,24984, 15416,29080, 15456,17304, - 15464,21400, 15472,25496, 15480,29592, 15520,17816, 15528,21912, - 15536,26008, 15544,30104, 15584,18328, 15592,22424, 15600,26520, - 15608,30616, 15648,18840, 15656,22936, 15664,27032, 15672,31128, - 15712,19352, 15720,23448, 15728,27544, 15736,31640, 15776,19864, - 15784,23960, 15792,28056, 15800,32152, 15832,16280, 15840,20376, - 15848,24472, 15856,28568, 15864,32664, 15904,16856, 15912,20952, - 15920,25048, 15928,29144, 15968,17368, 15976,21464, 15984,25560, - 15992,29656, 16032,17880, 16040,21976, 16048,26072, 16056,30168, - 16096,18392, 16104,22488, 16112,26584, 16120,30680, 16160,18904, - 16168,23000, 16176,27096, 16184,31192, 16224,19416, 16232,23512, - 16240,27608, 16248,31704, 16288,19928, 16296,24024, 16304,28120, - 16312,32216, 16352,20440, 16360,24536, 16368,28632, 16376,32728, - 16424,20512, 16432,24608, 16440,28704, 16480,16928, 16488,21024, - 16496,25120, 16504,29216, 16544,17440, 16552,21536, 16560,25632, - 16568,29728, 16608,17952, 16616,22048, 16624,26144, 16632,30240, - 16672,18464, 16680,22560, 16688,26656, 16696,30752, 16736,18976, - 16744,23072, 16752,27168, 16760,31264, 16800,19488, 16808,23584, - 16816,27680, 16824,31776, 16864,20000, 16872,24096, 16880,28192, - 16888,32288, 16936,20576, 16944,24672, 16952,28768, 17000,21088, - 17008,25184, 17016,29280, 17056,17504, 17064,21600, 17072,25696, - 17080,29792, 17120,18016, 17128,22112, 17136,26208, 17144,30304, - 17184,18528, 17192,22624, 17200,26720, 17208,30816, 17248,19040, - 17256,23136, 17264,27232, 17272,31328, 17312,19552, 17320,23648, - 17328,27744, 17336,31840, 17376,20064, 17384,24160, 17392,28256, - 17400,32352, 17448,20640, 17456,24736, 17464,28832, 17512,21152, - 17520,25248, 17528,29344, 17576,21664, 17584,25760, 17592,29856, - 17632,18080, 17640,22176, 17648,26272, 17656,30368, 17696,18592, - 17704,22688, 17712,26784, 17720,30880, 17760,19104, 17768,23200, - 17776,27296, 17784,31392, 17824,19616, 17832,23712, 17840,27808, - 17848,31904, 17888,20128, 17896,24224, 17904,28320, 17912,32416, - 17960,20704, 17968,24800, 17976,28896, 18024,21216, 18032,25312, - 18040,29408, 18088,21728, 18096,25824, 18104,29920, 18152,22240, - 18160,26336, 18168,30432, 18208,18656, 18216,22752, 18224,26848, - 18232,30944, 18272,19168, 18280,23264, 18288,27360, 18296,31456, - 18336,19680, 18344,23776, 18352,27872, 18360,31968, 18400,20192, - 18408,24288, 18416,28384, 18424,32480, 18472,20768, 18480,24864, - 18488,28960, 18536,21280, 18544,25376, 18552,29472, 18600,21792, - 18608,25888, 18616,29984, 18664,22304, 18672,26400, 18680,30496, - 18728,22816, 18736,26912, 18744,31008, 18784,19232, 18792,23328, - 18800,27424, 18808,31520, 18848,19744, 18856,23840, 18864,27936, - 18872,32032, 18912,20256, 18920,24352, 18928,28448, 18936,32544, - 18984,20832, 18992,24928, 19000,29024, 19048,21344, 19056,25440, - 19064,29536, 19112,21856, 19120,25952, 19128,30048, 19176,22368, - 19184,26464, 19192,30560, 19240,22880, 19248,26976, 19256,31072, - 19304,23392, 19312,27488, 19320,31584, 19360,19808, 19368,23904, - 19376,28000, 19384,32096, 19424,20320, 19432,24416, 19440,28512, - 19448,32608, 19496,20896, 19504,24992, 19512,29088, 19560,21408, - 19568,25504, 19576,29600, 19624,21920, 19632,26016, 19640,30112, - 19688,22432, 19696,26528, 19704,30624, 19752,22944, 19760,27040, - 19768,31136, 19816,23456, 19824,27552, 19832,31648, 19880,23968, - 19888,28064, 19896,32160, 19936,20384, 19944,24480, 19952,28576, - 19960,32672, 20008,20960, 20016,25056, 20024,29152, 20072,21472, - 20080,25568, 20088,29664, 20136,21984, 20144,26080, 20152,30176, - 20200,22496, 20208,26592, 20216,30688, 20264,23008, 20272,27104, - 20280,31200, 20328,23520, 20336,27616, 20344,31712, 20392,24032, - 20400,28128, 20408,32224, 20456,24544, 20464,28640, 20472,32736, - 20528,24616, 20536,28712, 20584,21032, 20592,25128, 20600,29224, - 20648,21544, 20656,25640, 20664,29736, 20712,22056, 20720,26152, - 20728,30248, 20776,22568, 20784,26664, 20792,30760, 20840,23080, - 20848,27176, 20856,31272, 20904,23592, 20912,27688, 20920,31784, - 20968,24104, 20976,28200, 20984,32296, 21040,24680, 21048,28776, - 21104,25192, 21112,29288, 21160,21608, 21168,25704, 21176,29800, - 21224,22120, 21232,26216, 21240,30312, 21288,22632, 21296,26728, - 21304,30824, 21352,23144, 21360,27240, 21368,31336, 21416,23656, - 21424,27752, 21432,31848, 21480,24168, 21488,28264, 21496,32360, - 21552,24744, 21560,28840, 21616,25256, 21624,29352, 21680,25768, - 21688,29864, 21736,22184, 21744,26280, 21752,30376, 21800,22696, - 21808,26792, 21816,30888, 21864,23208, 21872,27304, 21880,31400, - 21928,23720, 21936,27816, 21944,31912, 21992,24232, 22000,28328, - 22008,32424, 22064,24808, 22072,28904, 22128,25320, 22136,29416, - 22192,25832, 22200,29928, 22256,26344, 22264,30440, 22312,22760, - 22320,26856, 22328,30952, 22376,23272, 22384,27368, 22392,31464, - 22440,23784, 22448,27880, 22456,31976, 22504,24296, 22512,28392, - 22520,32488, 22576,24872, 22584,28968, 22640,25384, 22648,29480, - 22704,25896, 22712,29992, 22768,26408, 22776,30504, 22832,26920, - 22840,31016, 22888,23336, 22896,27432, 22904,31528, 22952,23848, - 22960,27944, 22968,32040, 23016,24360, 23024,28456, 23032,32552, - 23088,24936, 23096,29032, 23152,25448, 23160,29544, 23216,25960, - 23224,30056, 23280,26472, 23288,30568, 23344,26984, 23352,31080, - 23408,27496, 23416,31592, 23464,23912, 23472,28008, 23480,32104, - 23528,24424, 23536,28520, 23544,32616, 23600,25000, 23608,29096, - 23664,25512, 23672,29608, 23728,26024, 23736,30120, 23792,26536, - 23800,30632, 23856,27048, 23864,31144, 23920,27560, 23928,31656, - 23984,28072, 23992,32168, 24040,24488, 24048,28584, 24056,32680, - 24112,25064, 24120,29160, 24176,25576, 24184,29672, 24240,26088, - 24248,30184, 24304,26600, 24312,30696, 24368,27112, 24376,31208, - 24432,27624, 24440,31720, 24496,28136, 24504,32232, 24560,28648, - 24568,32744, 24632,28720, 24688,25136, 24696,29232, 24752,25648, - 24760,29744, 24816,26160, 24824,30256, 24880,26672, 24888,30768, - 24944,27184, 24952,31280, 25008,27696, 25016,31792, 25072,28208, - 25080,32304, 25144,28784, 25208,29296, 25264,25712, 25272,29808, - 25328,26224, 25336,30320, 25392,26736, 25400,30832, 25456,27248, - 25464,31344, 25520,27760, 25528,31856, 25584,28272, 25592,32368, - 25656,28848, 25720,29360, 25784,29872, 25840,26288, 25848,30384, - 25904,26800, 25912,30896, 25968,27312, 25976,31408, 26032,27824, - 26040,31920, 26096,28336, 26104,32432, 26168,28912, 26232,29424, - 26296,29936, 26360,30448, 26416,26864, 26424,30960, 26480,27376, - 26488,31472, 26544,27888, 26552,31984, 26608,28400, 26616,32496, - 26680,28976, 26744,29488, 26808,30000, 26872,30512, 26936,31024, - 26992,27440, 27000,31536, 27056,27952, 27064,32048, 27120,28464, - 27128,32560, 27192,29040, 27256,29552, 27320,30064, 27384,30576, - 27448,31088, 27512,31600, 27568,28016, 27576,32112, 27632,28528, - 27640,32624, 27704,29104, 27768,29616, 27832,30128, 27896,30640, - 27960,31152, 28024,31664, 28088,32176, 28144,28592, 28152,32688, - 28216,29168, 28280,29680, 28344,30192, 28408,30704, 28472,31216, - 28536,31728, 28600,32240, 28664,32752, 28792,29240, 28856,29752, - 28920,30264, 28984,30776, 29048,31288, 29112,31800, 29176,32312, - 29368,29816, 29432,30328, 29496,30840, 29560,31352, 29624,31864, - 29688,32376, 29944,30392, 30008,30904, 30072,31416, 30136,31928, - 30200,32440, 30520,30968, 30584,31480, 30648,31992, 30712,32504, - 31096,31544, 31160,32056, 31224,32568, 31672,32120, 31736,32632, - 32248,32696 -}; - - -const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH] = -{ - //radix 4, size 12 - 8,64, 16,32, 24,96, 40,80, 56,112, 88,104 -}; - -const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH] = -{ - //4x2, size 24 - 8,128, 16,64, 24,192, 40,160, 48,96, 56,224, 72,144, - 88,208, 104,176, 120,240, 152,200, 184,232 -}; - -const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH] = -{ - //radix 4, size 56 - 8,256, 16,128, 24,384, 32,64, 40,320, 48,192, 56,448, 72,288, 80,160, 88,416, 104,352, - 112,224, 120,480, 136,272, 152,400, 168,336, 176,208, 184,464, 200,304, 216,432, - 232,368, 248,496, 280,392, 296,328, 312,456, 344,424, 376,488, 440,472 -}; - -const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH] = -{ - //4x2, size 112 - 8,512, 16,256, 24,768, 32,128, 40,640, 48,384, 56,896, 72,576, 80,320, 88,832, 96,192, - 104,704, 112,448, 120,960, 136,544, 144,288, 152,800, 168,672, 176,416, 184,928, 200,608, - 208,352, 216,864, 232,736, 240,480, 248,992, 264,528, 280,784, 296,656, 304,400, 312,912, - 328,592, 344,848, 360,720, 368,464, 376,976, 392,560, 408,816, 424,688, 440,944, 456,624, - 472,880, 488,752, 504,1008, 536,776, 552,648, 568,904, 600,840, 616,712, 632,968, - 664,808, 696,936, 728,872, 760,1000, 824,920, 888,984 -}; - -const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH] = -{ - //radix 4, size 240 - 8,1024, 16,512, 24,1536, 32,256, 40,1280, 48,768, 56,1792, 64,128, 72,1152, 80,640, - 88,1664, 96,384, 104,1408, 112,896, 120,1920, 136,1088, 144,576, 152,1600, 160,320, - 168,1344, 176,832, 184,1856, 200,1216, 208,704, 216,1728, 224,448, 232,1472, 240,960, - 248,1984, 264,1056, 272,544, 280,1568, 296,1312, 304,800, 312,1824, 328,1184, 336,672, - 344,1696, 352,416, 360,1440, 368,928, 376,1952, 392,1120, 400,608, 408,1632, 424,1376, - 432,864, 440,1888, 456,1248, 464,736, 472,1760, 488,1504, 496,992, 504,2016, 520,1040, - 536,1552, 552,1296, 560,784, 568,1808, 584,1168, 592,656, 600,1680, 616,1424, 624,912, - 632,1936, 648,1104, 664,1616, 680,1360, 688,848, 696,1872, 712,1232, 728,1744, 744,1488, - 752,976, 760,2000, 776,1072, 792,1584, 808,1328, 824,1840, 840,1200, 856,1712, 872,1456, - 880,944, 888,1968, 904,1136, 920,1648, 936,1392, 952,1904, 968,1264, 984,1776, 1000,1520, - 1016,2032, 1048,1544, 1064,1288, 1080,1800, 1096,1160, 1112,1672, 1128,1416, 1144,1928, - 1176,1608, 1192,1352, 1208,1864, 1240,1736, 1256,1480, 1272,1992, 1304,1576, 1336,1832, - 1368,1704, 1384,1448, 1400,1960, 1432,1640, 1464,1896, 1496,1768, 1528,2024, 1592,1816, - 1624,1688, 1656,1944, 1720,1880, 1784,2008, 1912,1976 -}; - -const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH] = -{ - //4x2, size 480 - 8,2048, 16,1024, 24,3072, 32,512, 40,2560, 48,1536, 56,3584, 64,256, 72,2304, 80,1280, - 88,3328, 96,768, 104,2816, 112,1792, 120,3840, 136,2176, 144,1152, 152,3200, 160,640, - 168,2688, 176,1664, 184,3712, 192,384, 200,2432, 208,1408, 216,3456, 224,896, 232,2944, - 240,1920, 248,3968, 264,2112, 272,1088, 280,3136, 288,576, 296,2624, 304,1600, 312,3648, - 328,2368, 336,1344, 344,3392, 352,832, 360,2880, 368,1856, 376,3904, 392,2240, 400,1216, - 408,3264, 416,704, 424,2752, 432,1728, 440,3776, 456,2496, 464,1472, 472,3520, 480,960, - 488,3008, 496,1984, 504,4032, 520,2080, 528,1056, 536,3104, 552,2592, 560,1568, 568,3616, - 584,2336, 592,1312, 600,3360, 608,800, 616,2848, 624,1824, 632,3872, 648,2208, 656,1184, - 664,3232, 680,2720, 688,1696, 696,3744, 712,2464, 720,1440, 728,3488, 736,928, 744,2976, - 752,1952, 760,4000, 776,2144, 784,1120, 792,3168, 808,2656, 816,1632, 824,3680, 840,2400, - 848,1376, 856,3424, 872,2912, 880,1888, 888,3936, 904,2272, 912,1248, 920,3296, 936,2784, - 944,1760, 952,3808, 968,2528, 976,1504, 984,3552, 1000,3040, 1008,2016, 1016,4064, - 1032,2064, 1048,3088, 1064,2576, 1072,1552, 1080,3600, 1096,2320, 1104,1296, 1112,3344, - 1128,2832, 1136,1808, 1144,3856, 1160,2192, 1176,3216, 1192,2704, 1200,1680, 1208,3728, - 1224,2448, 1232,1424, 1240,3472, 1256,2960, 1264,1936, 1272,3984, 1288,2128, 1304,3152, - 1320,2640, 1328,1616, 1336,3664, 1352,2384, 1368,3408, 1384,2896, 1392,1872, 1400,3920, - 1416,2256, 1432,3280, 1448,2768, 1456,1744, 1464,3792, 1480,2512, 1496,3536, 1512,3024, - 1520,2000, 1528,4048, 1544,2096, 1560,3120, 1576,2608, 1592,3632, 1608,2352, 1624,3376, - 1640,2864, 1648,1840, 1656,3888, 1672,2224, 1688,3248, 1704,2736, 1720,3760, 1736,2480, - 1752,3504, 1768,2992, 1776,1968, 1784,4016, 1800,2160, 1816,3184, 1832,2672, 1848,3696, - 1864,2416, 1880,3440, 1896,2928, 1912,3952, 1928,2288, 1944,3312, 1960,2800, 1976,3824, - 1992,2544, 2008,3568, 2024,3056, 2040,4080, 2072,3080, 2088,2568, 2104,3592, 2120,2312, - 2136,3336, 2152,2824, 2168,3848, 2200,3208, 2216,2696, 2232,3720, 2248,2440, 2264,3464, - 2280,2952, 2296,3976, 2328,3144, 2344,2632, 2360,3656, 2392,3400, 2408,2888, 2424,3912, - 2456,3272, 2472,2760, 2488,3784, 2520,3528, 2536,3016, 2552,4040, 2584,3112, 2616,3624, - 2648,3368, 2664,2856, 2680,3880, 2712,3240, 2744,3752, 2776,3496, 2792,2984, 2808,4008, - 2840,3176, 2872,3688, 2904,3432, 2936,3944, 2968,3304, 3000,3816, 3032,3560, 3064,4072, - 3128,3608, 3160,3352, 3192,3864, 3256,3736, 3288,3480, 3320,3992, 3384,3672, 3448,3928, - 3512,3800, 3576,4056, 3704,3896, 3832,4024 -}; - -const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH] = -{ - //radix 4, size 992 - 8,4096, 16,2048, 24,6144, 32,1024, 40,5120, 48,3072, 56,7168, 64,512, 72,4608, - 80,2560, 88,6656, 96,1536, 104,5632, 112,3584, 120,7680, 128,256, 136,4352, - 144,2304, 152,6400, 160,1280, 168,5376, 176,3328, 184,7424, 192,768, 200,4864, - 208,2816, 216,6912, 224,1792, 232,5888, 240,3840, 248,7936, 264,4224, 272,2176, - 280,6272, 288,1152, 296,5248, 304,3200, 312,7296, 320,640, 328,4736, 336,2688, - 344,6784, 352,1664, 360,5760, 368,3712, 376,7808, 392,4480, 400,2432, 408,6528, - 416,1408, 424,5504, 432,3456, 440,7552, 448,896, 456,4992, 464,2944, 472,7040, - 480,1920, 488,6016, 496,3968, 504,8064, 520,4160, 528,2112, 536,6208, 544,1088, - 552,5184, 560,3136, 568,7232, 584,4672, 592,2624, 600,6720, 608,1600, 616,5696, - 624,3648, 632,7744, 648,4416, 656,2368, 664,6464, 672,1344, 680,5440, 688,3392, - 696,7488, 704,832, 712,4928, 720,2880, 728,6976, 736,1856, 744,5952, 752,3904, - 760,8000, 776,4288, 784,2240, 792,6336, 800,1216, 808,5312, 816,3264, 824,7360, - 840,4800, 848,2752, 856,6848, 864,1728, 872,5824, 880,3776, 888,7872, 904,4544, - 912,2496, 920,6592, 928,1472, 936,5568, 944,3520, 952,7616, 968,5056, 976,3008, - 984,7104, 992,1984, 1000,6080, 1008,4032, 1016,8128, 1032,4128, 1040,2080, - 1048,6176, 1064,5152, 1072,3104, 1080,7200, 1096,4640, 1104,2592, 1112,6688, - 1120,1568, 1128,5664, 1136,3616, 1144,7712, 1160,4384, 1168,2336, 1176,6432, - 1184,1312, 1192,5408, 1200,3360, 1208,7456, 1224,4896, 1232,2848, 1240,6944, - 1248,1824, 1256,5920, 1264,3872, 1272,7968, 1288,4256, 1296,2208, 1304,6304, - 1320,5280, 1328,3232, 1336,7328, 1352,4768, 1360,2720, 1368,6816, 1376,1696, - 1384,5792, 1392,3744, 1400,7840, 1416,4512, 1424,2464, 1432,6560, 1448,5536, - 1456,3488, 1464,7584, 1480,5024, 1488,2976, 1496,7072, 1504,1952, 1512,6048, - 1520,4000, 1528,8096, 1544,4192, 1552,2144, 1560,6240, 1576,5216, 1584,3168, - 1592,7264, 1608,4704, 1616,2656, 1624,6752, 1640,5728, 1648,3680, 1656,7776, - 1672,4448, 1680,2400, 1688,6496, 1704,5472, 1712,3424, 1720,7520, 1736,4960, - 1744,2912, 1752,7008, 1760,1888, 1768,5984, 1776,3936, 1784,8032, 1800,4320, - 1808,2272, 1816,6368, 1832,5344, 1840,3296, 1848,7392, 1864,4832, 1872,2784, - 1880,6880, 1896,5856, 1904,3808, 1912,7904, 1928,4576, 1936,2528, 1944,6624, - 1960,5600, 1968,3552, 1976,7648, 1992,5088, 2000,3040, 2008,7136, 2024,6112, - 2032,4064, 2040,8160, 2056,4112, 2072,6160, 2088,5136, 2096,3088, 2104,7184, - 2120,4624, 2128,2576, 2136,6672, 2152,5648, 2160,3600, 2168,7696, 2184,4368, - 2192,2320, 2200,6416, 2216,5392, 2224,3344, 2232,7440, 2248,4880, 2256,2832, - 2264,6928, 2280,5904, 2288,3856, 2296,7952, 2312,4240, 2328,6288, 2344,5264, - 2352,3216, 2360,7312, 2376,4752, 2384,2704, 2392,6800, 2408,5776, 2416,3728, - 2424,7824, 2440,4496, 2456,6544, 2472,5520, 2480,3472, 2488,7568, 2504,5008, - 2512,2960, 2520,7056, 2536,6032, 2544,3984, 2552,8080, 2568,4176, 2584,6224, - 2600,5200, 2608,3152, 2616,7248, 2632,4688, 2648,6736, 2664,5712, 2672,3664, - 2680,7760, 2696,4432, 2712,6480, 2728,5456, 2736,3408, 2744,7504, 2760,4944, - 2768,2896, 2776,6992, 2792,5968, 2800,3920, 2808,8016, 2824,4304, 2840,6352, - 2856,5328, 2864,3280, 2872,7376, 2888,4816, 2904,6864, 2920,5840, 2928,3792, - 2936,7888, 2952,4560, 2968,6608, 2984,5584, 2992,3536, 3000,7632, 3016,5072, - 3032,7120, 3048,6096, 3056,4048, 3064,8144, 3080,4144, 3096,6192, 3112,5168, - 3128,7216, 3144,4656, 3160,6704, 3176,5680, 3184,3632, 3192,7728, 3208,4400, - 3224,6448, 3240,5424, 3248,3376, 3256,7472, 3272,4912, 3288,6960, 3304,5936, - 3312,3888, 3320,7984, 3336,4272, 3352,6320, 3368,5296, 3384,7344, 3400,4784, - 3416,6832, 3432,5808, 3440,3760, 3448,7856, 3464,4528, 3480,6576, 3496,5552, - 3512,7600, 3528,5040, 3544,7088, 3560,6064, 3568,4016, 3576,8112, 3592,4208, - 3608,6256, 3624,5232, 3640,7280, 3656,4720, 3672,6768, 3688,5744, 3704,7792, - 3720,4464, 3736,6512, 3752,5488, 3768,7536, 3784,4976, 3800,7024, 3816,6000, - 3824,3952, 3832,8048, 3848,4336, 3864,6384, 3880,5360, 3896,7408, 3912,4848, - 3928,6896, 3944,5872, 3960,7920, 3976,4592, 3992,6640, 4008,5616, 4024,7664, - 4040,5104, 4056,7152, 4072,6128, 4088,8176, 4120,6152, 4136,5128, 4152,7176, - 4168,4616, 4184,6664, 4200,5640, 4216,7688, 4232,4360, 4248,6408, 4264,5384, - 4280,7432, 4296,4872, 4312,6920, 4328,5896, 4344,7944, 4376,6280, 4392,5256, - 4408,7304, 4424,4744, 4440,6792, 4456,5768, 4472,7816, 4504,6536, 4520,5512, - 4536,7560, 4552,5000, 4568,7048, 4584,6024, 4600,8072, 4632,6216, 4648,5192, - 4664,7240, 4696,6728, 4712,5704, 4728,7752, 4760,6472, 4776,5448, 4792,7496, - 4808,4936, 4824,6984, 4840,5960, 4856,8008, 4888,6344, 4904,5320, 4920,7368, - 4952,6856, 4968,5832, 4984,7880, 5016,6600, 5032,5576, 5048,7624, 5080,7112, - 5096,6088, 5112,8136, 5144,6184, 5176,7208, 5208,6696, 5224,5672, 5240,7720, - 5272,6440, 5288,5416, 5304,7464, 5336,6952, 5352,5928, 5368,7976, 5400,6312, - 5432,7336, 5464,6824, 5480,5800, 5496,7848, 5528,6568, 5560,7592, 5592,7080, - 5608,6056, 5624,8104, 5656,6248, 5688,7272, 5720,6760, 5752,7784, 5784,6504, - 5816,7528, 5848,7016, 5864,5992, 5880,8040, 5912,6376, 5944,7400, 5976,6888, - 6008,7912, 6040,6632, 6072,7656, 6104,7144, 6136,8168, 6200,7192, 6232,6680, - 6264,7704, 6296,6424, 6328,7448, 6360,6936, 6392,7960, 6456,7320, 6488,6808, - 6520,7832, 6584,7576, 6616,7064, 6648,8088, 6712,7256, 6776,7768, 6840,7512, - 6872,7000, 6904,8024, 6968,7384, 7032,7896, 7096,7640, 7160,8152, 7288,7736, - 7352,7480, 7416,7992, 7544,7864, 7672,8120, 7928,8056 -}; - -const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH] = -{ - //4x2, size 1984 - 8,8192, 16,4096, 24,12288, 32,2048, 40,10240, 48,6144, 56,14336, 64,1024, - 72,9216, 80,5120, 88,13312, 96,3072, 104,11264, 112,7168, 120,15360, 128,512, - 136,8704, 144,4608, 152,12800, 160,2560, 168,10752, 176,6656, 184,14848, - 192,1536, 200,9728, 208,5632, 216,13824, 224,3584, 232,11776, 240,7680, - 248,15872, 264,8448, 272,4352, 280,12544, 288,2304, 296,10496, 304,6400, - 312,14592, 320,1280, 328,9472, 336,5376, 344,13568, 352,3328, 360,11520, - 368,7424, 376,15616, 384,768, 392,8960, 400,4864, 408,13056, 416,2816, - 424,11008, 432,6912, 440,15104, 448,1792, 456,9984, 464,5888, 472,14080, - 480,3840, 488,12032, 496,7936, 504,16128, 520,8320, 528,4224, 536,12416, - 544,2176, 552,10368, 560,6272, 568,14464, 576,1152, 584,9344, 592,5248, - 600,13440, 608,3200, 616,11392, 624,7296, 632,15488, 648,8832, 656,4736, - 664,12928, 672,2688, 680,10880, 688,6784, 696,14976, 704,1664, 712,9856, - 720,5760, 728,13952, 736,3712, 744,11904, 752,7808, 760,16000, 776,8576, - 784,4480, 792,12672, 800,2432, 808,10624, 816,6528, 824,14720, 832,1408, - 840,9600, 848,5504, 856,13696, 864,3456, 872,11648, 880,7552, 888,15744, - 904,9088, 912,4992, 920,13184, 928,2944, 936,11136, 944,7040, 952,15232, - 960,1920, 968,10112, 976,6016, 984,14208, 992,3968, 1000,12160, 1008,8064, - 1016,16256, 1032,8256, 1040,4160, 1048,12352, 1056,2112, 1064,10304, 1072,6208, - 1080,14400, 1096,9280, 1104,5184, 1112,13376, 1120,3136, 1128,11328, 1136,7232, - 1144,15424, 1160,8768, 1168,4672, 1176,12864, 1184,2624, 1192,10816, 1200,6720, - 1208,14912, 1216,1600, 1224,9792, 1232,5696, 1240,13888, 1248,3648, 1256,11840, - 1264,7744, 1272,15936, 1288,8512, 1296,4416, 1304,12608, 1312,2368, 1320,10560, - 1328,6464, 1336,14656, 1352,9536, 1360,5440, 1368,13632, 1376,3392, 1384,11584, - 1392,7488, 1400,15680, 1416,9024, 1424,4928, 1432,13120, 1440,2880, 1448,11072, - 1456,6976, 1464,15168, 1472,1856, 1480,10048, 1488,5952, 1496,14144, 1504,3904, - 1512,12096, 1520,8000, 1528,16192, 1544,8384, 1552,4288, 1560,12480, 1568,2240, - 1576,10432, 1584,6336, 1592,14528, 1608,9408, 1616,5312, 1624,13504, 1632,3264, - 1640,11456, 1648,7360, 1656,15552, 1672,8896, 1680,4800, 1688,12992, 1696,2752, - 1704,10944, 1712,6848, 1720,15040, 1736,9920, 1744,5824, 1752,14016, 1760,3776, - 1768,11968, 1776,7872, 1784,16064, 1800,8640, 1808,4544, 1816,12736, 1824,2496, - 1832,10688, 1840,6592, 1848,14784, 1864,9664, 1872,5568, 1880,13760, 1888,3520, - 1896,11712, 1904,7616, 1912,15808, 1928,9152, 1936,5056, 1944,13248, 1952,3008, - 1960,11200, 1968,7104, 1976,15296, 1992,10176, 2000,6080, 2008,14272, 2016,4032, - 2024,12224, 2032,8128, 2040,16320, 2056,8224, 2064,4128, 2072,12320, 2088,10272, - 2096,6176, 2104,14368, 2120,9248, 2128,5152, 2136,13344, 2144,3104, 2152,11296, - 2160,7200, 2168,15392, 2184,8736, 2192,4640, 2200,12832, 2208,2592, 2216,10784, - 2224,6688, 2232,14880, 2248,9760, 2256,5664, 2264,13856, 2272,3616, 2280,11808, - 2288,7712, 2296,15904, 2312,8480, 2320,4384, 2328,12576, 2344,10528, 2352,6432, - 2360,14624, 2376,9504, 2384,5408, 2392,13600, 2400,3360, 2408,11552, 2416,7456, - 2424,15648, 2440,8992, 2448,4896, 2456,13088, 2464,2848, 2472,11040, 2480,6944, - 2488,15136, 2504,10016, 2512,5920, 2520,14112, 2528,3872, 2536,12064, 2544,7968, - 2552,16160, 2568,8352, 2576,4256, 2584,12448, 2600,10400, 2608,6304, 2616,14496, - 2632,9376, 2640,5280, 2648,13472, 2656,3232, 2664,11424, 2672,7328, 2680,15520, - 2696,8864, 2704,4768, 2712,12960, 2728,10912, 2736,6816, 2744,15008, 2760,9888, - 2768,5792, 2776,13984, 2784,3744, 2792,11936, 2800,7840, 2808,16032, 2824,8608, - 2832,4512, 2840,12704, 2856,10656, 2864,6560, 2872,14752, 2888,9632, 2896,5536, - 2904,13728, 2912,3488, 2920,11680, 2928,7584, 2936,15776, 2952,9120, 2960,5024, - 2968,13216, 2984,11168, 2992,7072, 3000,15264, 3016,10144, 3024,6048, - 3032,14240, 3040,4000, 3048,12192, 3056,8096, 3064,16288, 3080,8288, 3088,4192, - 3096,12384, 3112,10336, 3120,6240, 3128,14432, 3144,9312, 3152,5216, 3160,13408, - 3176,11360, 3184,7264, 3192,15456, 3208,8800, 3216,4704, 3224,12896, 3240,10848, - 3248,6752, 3256,14944, 3272,9824, 3280,5728, 3288,13920, 3296,3680, 3304,11872, - 3312,7776, 3320,15968, 3336,8544, 3344,4448, 3352,12640, 3368,10592, 3376,6496, - 3384,14688, 3400,9568, 3408,5472, 3416,13664, 3432,11616, 3440,7520, 3448,15712, - 3464,9056, 3472,4960, 3480,13152, 3496,11104, 3504,7008, 3512,15200, 3528,10080, - 3536,5984, 3544,14176, 3552,3936, 3560,12128, 3568,8032, 3576,16224, 3592,8416, - 3600,4320, 3608,12512, 3624,10464, 3632,6368, 3640,14560, 3656,9440, 3664,5344, - 3672,13536, 3688,11488, 3696,7392, 3704,15584, 3720,8928, 3728,4832, 3736,13024, - 3752,10976, 3760,6880, 3768,15072, 3784,9952, 3792,5856, 3800,14048, 3816,12000, - 3824,7904, 3832,16096, 3848,8672, 3856,4576, 3864,12768, 3880,10720, 3888,6624, - 3896,14816, 3912,9696, 3920,5600, 3928,13792, 3944,11744, 3952,7648, 3960,15840, - 3976,9184, 3984,5088, 3992,13280, 4008,11232, 4016,7136, 4024,15328, 4040,10208, - 4048,6112, 4056,14304, 4072,12256, 4080,8160, 4088,16352, 4104,8208, 4120,12304, - 4136,10256, 4144,6160, 4152,14352, 4168,9232, 4176,5136, 4184,13328, 4200,11280, - 4208,7184, 4216,15376, 4232,8720, 4240,4624, 4248,12816, 4264,10768, 4272,6672, - 4280,14864, 4296,9744, 4304,5648, 4312,13840, 4328,11792, 4336,7696, 4344,15888, - 4360,8464, 4376,12560, 4392,10512, 4400,6416, 4408,14608, 4424,9488, 4432,5392, - 4440,13584, 4456,11536, 4464,7440, 4472,15632, 4488,8976, 4496,4880, 4504,13072, - 4520,11024, 4528,6928, 4536,15120, 4552,10000, 4560,5904, 4568,14096, - 4584,12048, 4592,7952, 4600,16144, 4616,8336, 4632,12432, 4648,10384, 4656,6288, - 4664,14480, 4680,9360, 4688,5264, 4696,13456, 4712,11408, 4720,7312, 4728,15504, - 4744,8848, 4760,12944, 4776,10896, 4784,6800, 4792,14992, 4808,9872, 4816,5776, - 4824,13968, 4840,11920, 4848,7824, 4856,16016, 4872,8592, 4888,12688, - 4904,10640, 4912,6544, 4920,14736, 4936,9616, 4944,5520, 4952,13712, 4968,11664, - 4976,7568, 4984,15760, 5000,9104, 5016,13200, 5032,11152, 5040,7056, 5048,15248, - 5064,10128, 5072,6032, 5080,14224, 5096,12176, 5104,8080, 5112,16272, 5128,8272, - 5144,12368, 5160,10320, 5168,6224, 5176,14416, 5192,9296, 5208,13392, - 5224,11344, 5232,7248, 5240,15440, 5256,8784, 5272,12880, 5288,10832, 5296,6736, - 5304,14928, 5320,9808, 5328,5712, 5336,13904, 5352,11856, 5360,7760, 5368,15952, - 5384,8528, 5400,12624, 5416,10576, 5424,6480, 5432,14672, 5448,9552, 5464,13648, - 5480,11600, 5488,7504, 5496,15696, 5512,9040, 5528,13136, 5544,11088, 5552,6992, - 5560,15184, 5576,10064, 5584,5968, 5592,14160, 5608,12112, 5616,8016, - 5624,16208, 5640,8400, 5656,12496, 5672,10448, 5680,6352, 5688,14544, 5704,9424, - 5720,13520, 5736,11472, 5744,7376, 5752,15568, 5768,8912, 5784,13008, - 5800,10960, 5808,6864, 5816,15056, 5832,9936, 5848,14032, 5864,11984, 5872,7888, - 5880,16080, 5896,8656, 5912,12752, 5928,10704, 5936,6608, 5944,14800, 5960,9680, - 5976,13776, 5992,11728, 6000,7632, 6008,15824, 6024,9168, 6040,13264, - 6056,11216, 6064,7120, 6072,15312, 6088,10192, 6104,14288, 6120,12240, - 6128,8144, 6136,16336, 6152,8240, 6168,12336, 6184,10288, 6200,14384, 6216,9264, - 6232,13360, 6248,11312, 6256,7216, 6264,15408, 6280,8752, 6296,12848, - 6312,10800, 6320,6704, 6328,14896, 6344,9776, 6360,13872, 6376,11824, 6384,7728, - 6392,15920, 6408,8496, 6424,12592, 6440,10544, 6456,14640, 6472,9520, - 6488,13616, 6504,11568, 6512,7472, 6520,15664, 6536,9008, 6552,13104, - 6568,11056, 6576,6960, 6584,15152, 6600,10032, 6616,14128, 6632,12080, - 6640,7984, 6648,16176, 6664,8368, 6680,12464, 6696,10416, 6712,14512, 6728,9392, - 6744,13488, 6760,11440, 6768,7344, 6776,15536, 6792,8880, 6808,12976, - 6824,10928, 6840,15024, 6856,9904, 6872,14000, 6888,11952, 6896,7856, - 6904,16048, 6920,8624, 6936,12720, 6952,10672, 6968,14768, 6984,9648, - 7000,13744, 7016,11696, 7024,7600, 7032,15792, 7048,9136, 7064,13232, - 7080,11184, 7096,15280, 7112,10160, 7128,14256, 7144,12208, 7152,8112, - 7160,16304, 7176,8304, 7192,12400, 7208,10352, 7224,14448, 7240,9328, - 7256,13424, 7272,11376, 7288,15472, 7304,8816, 7320,12912, 7336,10864, - 7352,14960, 7368,9840, 7384,13936, 7400,11888, 7408,7792, 7416,15984, 7432,8560, - 7448,12656, 7464,10608, 7480,14704, 7496,9584, 7512,13680, 7528,11632, - 7544,15728, 7560,9072, 7576,13168, 7592,11120, 7608,15216, 7624,10096, - 7640,14192, 7656,12144, 7664,8048, 7672,16240, 7688,8432, 7704,12528, - 7720,10480, 7736,14576, 7752,9456, 7768,13552, 7784,11504, 7800,15600, - 7816,8944, 7832,13040, 7848,10992, 7864,15088, 7880,9968, 7896,14064, - 7912,12016, 7928,16112, 7944,8688, 7960,12784, 7976,10736, 7992,14832, - 8008,9712, 8024,13808, 8040,11760, 8056,15856, 8072,9200, 8088,13296, - 8104,11248, 8120,15344, 8136,10224, 8152,14320, 8168,12272, 8184,16368, - 8216,12296, 8232,10248, 8248,14344, 8264,9224, 8280,13320, 8296,11272, - 8312,15368, 8328,8712, 8344,12808, 8360,10760, 8376,14856, 8392,9736, - 8408,13832, 8424,11784, 8440,15880, 8472,12552, 8488,10504, 8504,14600, - 8520,9480, 8536,13576, 8552,11528, 8568,15624, 8584,8968, 8600,13064, - 8616,11016, 8632,15112, 8648,9992, 8664,14088, 8680,12040, 8696,16136, - 8728,12424, 8744,10376, 8760,14472, 8776,9352, 8792,13448, 8808,11400, - 8824,15496, 8856,12936, 8872,10888, 8888,14984, 8904,9864, 8920,13960, - 8936,11912, 8952,16008, 8984,12680, 9000,10632, 9016,14728, 9032,9608, - 9048,13704, 9064,11656, 9080,15752, 9112,13192, 9128,11144, 9144,15240, - 9160,10120, 9176,14216, 9192,12168, 9208,16264, 9240,12360, 9256,10312, - 9272,14408, 9304,13384, 9320,11336, 9336,15432, 9368,12872, 9384,10824, - 9400,14920, 9416,9800, 9432,13896, 9448,11848, 9464,15944, 9496,12616, - 9512,10568, 9528,14664, 9560,13640, 9576,11592, 9592,15688, 9624,13128, - 9640,11080, 9656,15176, 9672,10056, 9688,14152, 9704,12104, 9720,16200, - 9752,12488, 9768,10440, 9784,14536, 9816,13512, 9832,11464, 9848,15560, - 9880,13000, 9896,10952, 9912,15048, 9944,14024, 9960,11976, 9976,16072, - 10008,12744, 10024,10696, 10040,14792, 10072,13768, 10088,11720, 10104,15816, - 10136,13256, 10152,11208, 10168,15304, 10200,14280, 10216,12232, 10232,16328, - 10264,12328, 10296,14376, 10328,13352, 10344,11304, 10360,15400, 10392,12840, - 10408,10792, 10424,14888, 10456,13864, 10472,11816, 10488,15912, 10520,12584, - 10552,14632, 10584,13608, 10600,11560, 10616,15656, 10648,13096, 10664,11048, - 10680,15144, 10712,14120, 10728,12072, 10744,16168, 10776,12456, 10808,14504, - 10840,13480, 10856,11432, 10872,15528, 10904,12968, 10936,15016, 10968,13992, - 10984,11944, 11000,16040, 11032,12712, 11064,14760, 11096,13736, 11112,11688, - 11128,15784, 11160,13224, 11192,15272, 11224,14248, 11240,12200, 11256,16296, - 11288,12392, 11320,14440, 11352,13416, 11384,15464, 11416,12904, 11448,14952, - 11480,13928, 11496,11880, 11512,15976, 11544,12648, 11576,14696, 11608,13672, - 11640,15720, 11672,13160, 11704,15208, 11736,14184, 11752,12136, 11768,16232, - 11800,12520, 11832,14568, 11864,13544, 11896,15592, 11928,13032, 11960,15080, - 11992,14056, 12024,16104, 12056,12776, 12088,14824, 12120,13800, 12152,15848, - 12184,13288, 12216,15336, 12248,14312, 12280,16360, 12344,14360, 12376,13336, - 12408,15384, 12440,12824, 12472,14872, 12504,13848, 12536,15896, 12600,14616, - 12632,13592, 12664,15640, 12696,13080, 12728,15128, 12760,14104, 12792,16152, - 12856,14488, 12888,13464, 12920,15512, 12984,15000, 13016,13976, 13048,16024, - 13112,14744, 13144,13720, 13176,15768, 13240,15256, 13272,14232, 13304,16280, - 13368,14424, 13432,15448, 13496,14936, 13528,13912, 13560,15960, 13624,14680, - 13688,15704, 13752,15192, 13784,14168, 13816,16216, 13880,14552, 13944,15576, - 14008,15064, 14072,16088, 14136,14808, 14200,15832, 14264,15320, 14328,16344, - 14456,15416, 14520,14904, 14584,15928, 14712,15672, 14776,15160, 14840,16184, - 14968,15544, 15096,16056, 15224,15800, 15352,16312, 15608,15992, 15864,16248 -}; - -const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH] = -{ - //radix 4, size 4032 - 8,16384, 16,8192, 24,24576, 32,4096, 40,20480, 48,12288, 56,28672, 64,2048, - 72,18432, 80,10240, 88,26624, 96,6144, 104,22528, 112,14336, 120,30720, - 128,1024, 136,17408, 144,9216, 152,25600, 160,5120, 168,21504, 176,13312, - 184,29696, 192,3072, 200,19456, 208,11264, 216,27648, 224,7168, 232,23552, - 240,15360, 248,31744, 256,512, 264,16896, 272,8704, 280,25088, 288,4608, - 296,20992, 304,12800, 312,29184, 320,2560, 328,18944, 336,10752, 344,27136, - 352,6656, 360,23040, 368,14848, 376,31232, 384,1536, 392,17920, 400,9728, - 408,26112, 416,5632, 424,22016, 432,13824, 440,30208, 448,3584, 456,19968, - 464,11776, 472,28160, 480,7680, 488,24064, 496,15872, 504,32256, 520,16640, - 528,8448, 536,24832, 544,4352, 552,20736, 560,12544, 568,28928, 576,2304, - 584,18688, 592,10496, 600,26880, 608,6400, 616,22784, 624,14592, 632,30976, - 640,1280, 648,17664, 656,9472, 664,25856, 672,5376, 680,21760, 688,13568, - 696,29952, 704,3328, 712,19712, 720,11520, 728,27904, 736,7424, 744,23808, - 752,15616, 760,32000, 776,17152, 784,8960, 792,25344, 800,4864, 808,21248, - 816,13056, 824,29440, 832,2816, 840,19200, 848,11008, 856,27392, 864,6912, - 872,23296, 880,15104, 888,31488, 896,1792, 904,18176, 912,9984, 920,26368, - 928,5888, 936,22272, 944,14080, 952,30464, 960,3840, 968,20224, 976,12032, - 984,28416, 992,7936, 1000,24320, 1008,16128, 1016,32512, 1032,16512, 1040,8320, - 1048,24704, 1056,4224, 1064,20608, 1072,12416, 1080,28800, 1088,2176, - 1096,18560, 1104,10368, 1112,26752, 1120,6272, 1128,22656, 1136,14464, - 1144,30848, 1160,17536, 1168,9344, 1176,25728, 1184,5248, 1192,21632, - 1200,13440, 1208,29824, 1216,3200, 1224,19584, 1232,11392, 1240,27776, - 1248,7296, 1256,23680, 1264,15488, 1272,31872, 1288,17024, 1296,8832, - 1304,25216, 1312,4736, 1320,21120, 1328,12928, 1336,29312, 1344,2688, - 1352,19072, 1360,10880, 1368,27264, 1376,6784, 1384,23168, 1392,14976, - 1400,31360, 1408,1664, 1416,18048, 1424,9856, 1432,26240, 1440,5760, 1448,22144, - 1456,13952, 1464,30336, 1472,3712, 1480,20096, 1488,11904, 1496,28288, - 1504,7808, 1512,24192, 1520,16000, 1528,32384, 1544,16768, 1552,8576, - 1560,24960, 1568,4480, 1576,20864, 1584,12672, 1592,29056, 1600,2432, - 1608,18816, 1616,10624, 1624,27008, 1632,6528, 1640,22912, 1648,14720, - 1656,31104, 1672,17792, 1680,9600, 1688,25984, 1696,5504, 1704,21888, - 1712,13696, 1720,30080, 1728,3456, 1736,19840, 1744,11648, 1752,28032, - 1760,7552, 1768,23936, 1776,15744, 1784,32128, 1800,17280, 1808,9088, - 1816,25472, 1824,4992, 1832,21376, 1840,13184, 1848,29568, 1856,2944, - 1864,19328, 1872,11136, 1880,27520, 1888,7040, 1896,23424, 1904,15232, - 1912,31616, 1928,18304, 1936,10112, 1944,26496, 1952,6016, 1960,22400, - 1968,14208, 1976,30592, 1984,3968, 1992,20352, 2000,12160, 2008,28544, - 2016,8064, 2024,24448, 2032,16256, 2040,32640, 2056,16448, 2064,8256, - 2072,24640, 2080,4160, 2088,20544, 2096,12352, 2104,28736, 2120,18496, - 2128,10304, 2136,26688, 2144,6208, 2152,22592, 2160,14400, 2168,30784, - 2184,17472, 2192,9280, 2200,25664, 2208,5184, 2216,21568, 2224,13376, - 2232,29760, 2240,3136, 2248,19520, 2256,11328, 2264,27712, 2272,7232, - 2280,23616, 2288,15424, 2296,31808, 2312,16960, 2320,8768, 2328,25152, - 2336,4672, 2344,21056, 2352,12864, 2360,29248, 2368,2624, 2376,19008, - 2384,10816, 2392,27200, 2400,6720, 2408,23104, 2416,14912, 2424,31296, - 2440,17984, 2448,9792, 2456,26176, 2464,5696, 2472,22080, 2480,13888, - 2488,30272, 2496,3648, 2504,20032, 2512,11840, 2520,28224, 2528,7744, - 2536,24128, 2544,15936, 2552,32320, 2568,16704, 2576,8512, 2584,24896, - 2592,4416, 2600,20800, 2608,12608, 2616,28992, 2632,18752, 2640,10560, - 2648,26944, 2656,6464, 2664,22848, 2672,14656, 2680,31040, 2696,17728, - 2704,9536, 2712,25920, 2720,5440, 2728,21824, 2736,13632, 2744,30016, 2752,3392, - 2760,19776, 2768,11584, 2776,27968, 2784,7488, 2792,23872, 2800,15680, - 2808,32064, 2824,17216, 2832,9024, 2840,25408, 2848,4928, 2856,21312, - 2864,13120, 2872,29504, 2888,19264, 2896,11072, 2904,27456, 2912,6976, - 2920,23360, 2928,15168, 2936,31552, 2952,18240, 2960,10048, 2968,26432, - 2976,5952, 2984,22336, 2992,14144, 3000,30528, 3008,3904, 3016,20288, - 3024,12096, 3032,28480, 3040,8000, 3048,24384, 3056,16192, 3064,32576, - 3080,16576, 3088,8384, 3096,24768, 3104,4288, 3112,20672, 3120,12480, - 3128,28864, 3144,18624, 3152,10432, 3160,26816, 3168,6336, 3176,22720, - 3184,14528, 3192,30912, 3208,17600, 3216,9408, 3224,25792, 3232,5312, - 3240,21696, 3248,13504, 3256,29888, 3272,19648, 3280,11456, 3288,27840, - 3296,7360, 3304,23744, 3312,15552, 3320,31936, 3336,17088, 3344,8896, - 3352,25280, 3360,4800, 3368,21184, 3376,12992, 3384,29376, 3400,19136, - 3408,10944, 3416,27328, 3424,6848, 3432,23232, 3440,15040, 3448,31424, - 3464,18112, 3472,9920, 3480,26304, 3488,5824, 3496,22208, 3504,14016, - 3512,30400, 3520,3776, 3528,20160, 3536,11968, 3544,28352, 3552,7872, - 3560,24256, 3568,16064, 3576,32448, 3592,16832, 3600,8640, 3608,25024, - 3616,4544, 3624,20928, 3632,12736, 3640,29120, 3656,18880, 3664,10688, - 3672,27072, 3680,6592, 3688,22976, 3696,14784, 3704,31168, 3720,17856, - 3728,9664, 3736,26048, 3744,5568, 3752,21952, 3760,13760, 3768,30144, - 3784,19904, 3792,11712, 3800,28096, 3808,7616, 3816,24000, 3824,15808, - 3832,32192, 3848,17344, 3856,9152, 3864,25536, 3872,5056, 3880,21440, - 3888,13248, 3896,29632, 3912,19392, 3920,11200, 3928,27584, 3936,7104, - 3944,23488, 3952,15296, 3960,31680, 3976,18368, 3984,10176, 3992,26560, - 4000,6080, 4008,22464, 4016,14272, 4024,30656, 4040,20416, 4048,12224, - 4056,28608, 4064,8128, 4072,24512, 4080,16320, 4088,32704, 4104,16416, - 4112,8224, 4120,24608, 4136,20512, 4144,12320, 4152,28704, 4168,18464, - 4176,10272, 4184,26656, 4192,6176, 4200,22560, 4208,14368, 4216,30752, - 4232,17440, 4240,9248, 4248,25632, 4256,5152, 4264,21536, 4272,13344, - 4280,29728, 4296,19488, 4304,11296, 4312,27680, 4320,7200, 4328,23584, - 4336,15392, 4344,31776, 4360,16928, 4368,8736, 4376,25120, 4384,4640, - 4392,21024, 4400,12832, 4408,29216, 4424,18976, 4432,10784, 4440,27168, - 4448,6688, 4456,23072, 4464,14880, 4472,31264, 4488,17952, 4496,9760, - 4504,26144, 4512,5664, 4520,22048, 4528,13856, 4536,30240, 4552,20000, - 4560,11808, 4568,28192, 4576,7712, 4584,24096, 4592,15904, 4600,32288, - 4616,16672, 4624,8480, 4632,24864, 4648,20768, 4656,12576, 4664,28960, - 4680,18720, 4688,10528, 4696,26912, 4704,6432, 4712,22816, 4720,14624, - 4728,31008, 4744,17696, 4752,9504, 4760,25888, 4768,5408, 4776,21792, - 4784,13600, 4792,29984, 4808,19744, 4816,11552, 4824,27936, 4832,7456, - 4840,23840, 4848,15648, 4856,32032, 4872,17184, 4880,8992, 4888,25376, - 4904,21280, 4912,13088, 4920,29472, 4936,19232, 4944,11040, 4952,27424, - 4960,6944, 4968,23328, 4976,15136, 4984,31520, 5000,18208, 5008,10016, - 5016,26400, 5024,5920, 5032,22304, 5040,14112, 5048,30496, 5064,20256, - 5072,12064, 5080,28448, 5088,7968, 5096,24352, 5104,16160, 5112,32544, - 5128,16544, 5136,8352, 5144,24736, 5160,20640, 5168,12448, 5176,28832, - 5192,18592, 5200,10400, 5208,26784, 5216,6304, 5224,22688, 5232,14496, - 5240,30880, 5256,17568, 5264,9376, 5272,25760, 5288,21664, 5296,13472, - 5304,29856, 5320,19616, 5328,11424, 5336,27808, 5344,7328, 5352,23712, - 5360,15520, 5368,31904, 5384,17056, 5392,8864, 5400,25248, 5416,21152, - 5424,12960, 5432,29344, 5448,19104, 5456,10912, 5464,27296, 5472,6816, - 5480,23200, 5488,15008, 5496,31392, 5512,18080, 5520,9888, 5528,26272, - 5536,5792, 5544,22176, 5552,13984, 5560,30368, 5576,20128, 5584,11936, - 5592,28320, 5600,7840, 5608,24224, 5616,16032, 5624,32416, 5640,16800, - 5648,8608, 5656,24992, 5672,20896, 5680,12704, 5688,29088, 5704,18848, - 5712,10656, 5720,27040, 5728,6560, 5736,22944, 5744,14752, 5752,31136, - 5768,17824, 5776,9632, 5784,26016, 5800,21920, 5808,13728, 5816,30112, - 5832,19872, 5840,11680, 5848,28064, 5856,7584, 5864,23968, 5872,15776, - 5880,32160, 5896,17312, 5904,9120, 5912,25504, 5928,21408, 5936,13216, - 5944,29600, 5960,19360, 5968,11168, 5976,27552, 5984,7072, 5992,23456, - 6000,15264, 6008,31648, 6024,18336, 6032,10144, 6040,26528, 6056,22432, - 6064,14240, 6072,30624, 6088,20384, 6096,12192, 6104,28576, 6112,8096, - 6120,24480, 6128,16288, 6136,32672, 6152,16480, 6160,8288, 6168,24672, - 6184,20576, 6192,12384, 6200,28768, 6216,18528, 6224,10336, 6232,26720, - 6248,22624, 6256,14432, 6264,30816, 6280,17504, 6288,9312, 6296,25696, - 6312,21600, 6320,13408, 6328,29792, 6344,19552, 6352,11360, 6360,27744, - 6368,7264, 6376,23648, 6384,15456, 6392,31840, 6408,16992, 6416,8800, - 6424,25184, 6440,21088, 6448,12896, 6456,29280, 6472,19040, 6480,10848, - 6488,27232, 6496,6752, 6504,23136, 6512,14944, 6520,31328, 6536,18016, - 6544,9824, 6552,26208, 6568,22112, 6576,13920, 6584,30304, 6600,20064, - 6608,11872, 6616,28256, 6624,7776, 6632,24160, 6640,15968, 6648,32352, - 6664,16736, 6672,8544, 6680,24928, 6696,20832, 6704,12640, 6712,29024, - 6728,18784, 6736,10592, 6744,26976, 6760,22880, 6768,14688, 6776,31072, - 6792,17760, 6800,9568, 6808,25952, 6824,21856, 6832,13664, 6840,30048, - 6856,19808, 6864,11616, 6872,28000, 6880,7520, 6888,23904, 6896,15712, - 6904,32096, 6920,17248, 6928,9056, 6936,25440, 6952,21344, 6960,13152, - 6968,29536, 6984,19296, 6992,11104, 7000,27488, 7016,23392, 7024,15200, - 7032,31584, 7048,18272, 7056,10080, 7064,26464, 7080,22368, 7088,14176, - 7096,30560, 7112,20320, 7120,12128, 7128,28512, 7136,8032, 7144,24416, - 7152,16224, 7160,32608, 7176,16608, 7184,8416, 7192,24800, 7208,20704, - 7216,12512, 7224,28896, 7240,18656, 7248,10464, 7256,26848, 7272,22752, - 7280,14560, 7288,30944, 7304,17632, 7312,9440, 7320,25824, 7336,21728, - 7344,13536, 7352,29920, 7368,19680, 7376,11488, 7384,27872, 7400,23776, - 7408,15584, 7416,31968, 7432,17120, 7440,8928, 7448,25312, 7464,21216, - 7472,13024, 7480,29408, 7496,19168, 7504,10976, 7512,27360, 7528,23264, - 7536,15072, 7544,31456, 7560,18144, 7568,9952, 7576,26336, 7592,22240, - 7600,14048, 7608,30432, 7624,20192, 7632,12000, 7640,28384, 7648,7904, - 7656,24288, 7664,16096, 7672,32480, 7688,16864, 7696,8672, 7704,25056, - 7720,20960, 7728,12768, 7736,29152, 7752,18912, 7760,10720, 7768,27104, - 7784,23008, 7792,14816, 7800,31200, 7816,17888, 7824,9696, 7832,26080, - 7848,21984, 7856,13792, 7864,30176, 7880,19936, 7888,11744, 7896,28128, - 7912,24032, 7920,15840, 7928,32224, 7944,17376, 7952,9184, 7960,25568, - 7976,21472, 7984,13280, 7992,29664, 8008,19424, 8016,11232, 8024,27616, - 8040,23520, 8048,15328, 8056,31712, 8072,18400, 8080,10208, 8088,26592, - 8104,22496, 8112,14304, 8120,30688, 8136,20448, 8144,12256, 8152,28640, - 8168,24544, 8176,16352, 8184,32736, 8200,16400, 8216,24592, 8232,20496, - 8240,12304, 8248,28688, 8264,18448, 8272,10256, 8280,26640, 8296,22544, - 8304,14352, 8312,30736, 8328,17424, 8336,9232, 8344,25616, 8360,21520, - 8368,13328, 8376,29712, 8392,19472, 8400,11280, 8408,27664, 8424,23568, - 8432,15376, 8440,31760, 8456,16912, 8464,8720, 8472,25104, 8488,21008, - 8496,12816, 8504,29200, 8520,18960, 8528,10768, 8536,27152, 8552,23056, - 8560,14864, 8568,31248, 8584,17936, 8592,9744, 8600,26128, 8616,22032, - 8624,13840, 8632,30224, 8648,19984, 8656,11792, 8664,28176, 8680,24080, - 8688,15888, 8696,32272, 8712,16656, 8728,24848, 8744,20752, 8752,12560, - 8760,28944, 8776,18704, 8784,10512, 8792,26896, 8808,22800, 8816,14608, - 8824,30992, 8840,17680, 8848,9488, 8856,25872, 8872,21776, 8880,13584, - 8888,29968, 8904,19728, 8912,11536, 8920,27920, 8936,23824, 8944,15632, - 8952,32016, 8968,17168, 8984,25360, 9000,21264, 9008,13072, 9016,29456, - 9032,19216, 9040,11024, 9048,27408, 9064,23312, 9072,15120, 9080,31504, - 9096,18192, 9104,10000, 9112,26384, 9128,22288, 9136,14096, 9144,30480, - 9160,20240, 9168,12048, 9176,28432, 9192,24336, 9200,16144, 9208,32528, - 9224,16528, 9240,24720, 9256,20624, 9264,12432, 9272,28816, 9288,18576, - 9296,10384, 9304,26768, 9320,22672, 9328,14480, 9336,30864, 9352,17552, - 9368,25744, 9384,21648, 9392,13456, 9400,29840, 9416,19600, 9424,11408, - 9432,27792, 9448,23696, 9456,15504, 9464,31888, 9480,17040, 9496,25232, - 9512,21136, 9520,12944, 9528,29328, 9544,19088, 9552,10896, 9560,27280, - 9576,23184, 9584,14992, 9592,31376, 9608,18064, 9616,9872, 9624,26256, - 9640,22160, 9648,13968, 9656,30352, 9672,20112, 9680,11920, 9688,28304, - 9704,24208, 9712,16016, 9720,32400, 9736,16784, 9752,24976, 9768,20880, - 9776,12688, 9784,29072, 9800,18832, 9808,10640, 9816,27024, 9832,22928, - 9840,14736, 9848,31120, 9864,17808, 9880,26000, 9896,21904, 9904,13712, - 9912,30096, 9928,19856, 9936,11664, 9944,28048, 9960,23952, 9968,15760, - 9976,32144, 9992,17296, 10008,25488, 10024,21392, 10032,13200, 10040,29584, - 10056,19344, 10064,11152, 10072,27536, 10088,23440, 10096,15248, 10104,31632, - 10120,18320, 10136,26512, 10152,22416, 10160,14224, 10168,30608, 10184,20368, - 10192,12176, 10200,28560, 10216,24464, 10224,16272, 10232,32656, 10248,16464, - 10264,24656, 10280,20560, 10288,12368, 10296,28752, 10312,18512, 10328,26704, - 10344,22608, 10352,14416, 10360,30800, 10376,17488, 10392,25680, 10408,21584, - 10416,13392, 10424,29776, 10440,19536, 10448,11344, 10456,27728, 10472,23632, - 10480,15440, 10488,31824, 10504,16976, 10520,25168, 10536,21072, 10544,12880, - 10552,29264, 10568,19024, 10576,10832, 10584,27216, 10600,23120, 10608,14928, - 10616,31312, 10632,18000, 10648,26192, 10664,22096, 10672,13904, 10680,30288, - 10696,20048, 10704,11856, 10712,28240, 10728,24144, 10736,15952, 10744,32336, - 10760,16720, 10776,24912, 10792,20816, 10800,12624, 10808,29008, 10824,18768, - 10840,26960, 10856,22864, 10864,14672, 10872,31056, 10888,17744, 10904,25936, - 10920,21840, 10928,13648, 10936,30032, 10952,19792, 10960,11600, 10968,27984, - 10984,23888, 10992,15696, 11000,32080, 11016,17232, 11032,25424, 11048,21328, - 11056,13136, 11064,29520, 11080,19280, 11096,27472, 11112,23376, 11120,15184, - 11128,31568, 11144,18256, 11160,26448, 11176,22352, 11184,14160, 11192,30544, - 11208,20304, 11216,12112, 11224,28496, 11240,24400, 11248,16208, 11256,32592, - 11272,16592, 11288,24784, 11304,20688, 11312,12496, 11320,28880, 11336,18640, - 11352,26832, 11368,22736, 11376,14544, 11384,30928, 11400,17616, 11416,25808, - 11432,21712, 11440,13520, 11448,29904, 11464,19664, 11480,27856, 11496,23760, - 11504,15568, 11512,31952, 11528,17104, 11544,25296, 11560,21200, 11568,13008, - 11576,29392, 11592,19152, 11608,27344, 11624,23248, 11632,15056, 11640,31440, - 11656,18128, 11672,26320, 11688,22224, 11696,14032, 11704,30416, 11720,20176, - 11728,11984, 11736,28368, 11752,24272, 11760,16080, 11768,32464, 11784,16848, - 11800,25040, 11816,20944, 11824,12752, 11832,29136, 11848,18896, 11864,27088, - 11880,22992, 11888,14800, 11896,31184, 11912,17872, 11928,26064, 11944,21968, - 11952,13776, 11960,30160, 11976,19920, 11992,28112, 12008,24016, 12016,15824, - 12024,32208, 12040,17360, 12056,25552, 12072,21456, 12080,13264, 12088,29648, - 12104,19408, 12120,27600, 12136,23504, 12144,15312, 12152,31696, 12168,18384, - 12184,26576, 12200,22480, 12208,14288, 12216,30672, 12232,20432, 12248,28624, - 12264,24528, 12272,16336, 12280,32720, 12296,16432, 12312,24624, 12328,20528, - 12344,28720, 12360,18480, 12376,26672, 12392,22576, 12400,14384, 12408,30768, - 12424,17456, 12440,25648, 12456,21552, 12464,13360, 12472,29744, 12488,19504, - 12504,27696, 12520,23600, 12528,15408, 12536,31792, 12552,16944, 12568,25136, - 12584,21040, 12592,12848, 12600,29232, 12616,18992, 12632,27184, 12648,23088, - 12656,14896, 12664,31280, 12680,17968, 12696,26160, 12712,22064, 12720,13872, - 12728,30256, 12744,20016, 12760,28208, 12776,24112, 12784,15920, 12792,32304, - 12808,16688, 12824,24880, 12840,20784, 12856,28976, 12872,18736, 12888,26928, - 12904,22832, 12912,14640, 12920,31024, 12936,17712, 12952,25904, 12968,21808, - 12976,13616, 12984,30000, 13000,19760, 13016,27952, 13032,23856, 13040,15664, - 13048,32048, 13064,17200, 13080,25392, 13096,21296, 13112,29488, 13128,19248, - 13144,27440, 13160,23344, 13168,15152, 13176,31536, 13192,18224, 13208,26416, - 13224,22320, 13232,14128, 13240,30512, 13256,20272, 13272,28464, 13288,24368, - 13296,16176, 13304,32560, 13320,16560, 13336,24752, 13352,20656, 13368,28848, - 13384,18608, 13400,26800, 13416,22704, 13424,14512, 13432,30896, 13448,17584, - 13464,25776, 13480,21680, 13496,29872, 13512,19632, 13528,27824, 13544,23728, - 13552,15536, 13560,31920, 13576,17072, 13592,25264, 13608,21168, 13624,29360, - 13640,19120, 13656,27312, 13672,23216, 13680,15024, 13688,31408, 13704,18096, - 13720,26288, 13736,22192, 13744,14000, 13752,30384, 13768,20144, 13784,28336, - 13800,24240, 13808,16048, 13816,32432, 13832,16816, 13848,25008, 13864,20912, - 13880,29104, 13896,18864, 13912,27056, 13928,22960, 13936,14768, 13944,31152, - 13960,17840, 13976,26032, 13992,21936, 14008,30128, 14024,19888, 14040,28080, - 14056,23984, 14064,15792, 14072,32176, 14088,17328, 14104,25520, 14120,21424, - 14136,29616, 14152,19376, 14168,27568, 14184,23472, 14192,15280, 14200,31664, - 14216,18352, 14232,26544, 14248,22448, 14264,30640, 14280,20400, 14296,28592, - 14312,24496, 14320,16304, 14328,32688, 14344,16496, 14360,24688, 14376,20592, - 14392,28784, 14408,18544, 14424,26736, 14440,22640, 14456,30832, 14472,17520, - 14488,25712, 14504,21616, 14520,29808, 14536,19568, 14552,27760, 14568,23664, - 14576,15472, 14584,31856, 14600,17008, 14616,25200, 14632,21104, 14648,29296, - 14664,19056, 14680,27248, 14696,23152, 14704,14960, 14712,31344, 14728,18032, - 14744,26224, 14760,22128, 14776,30320, 14792,20080, 14808,28272, 14824,24176, - 14832,15984, 14840,32368, 14856,16752, 14872,24944, 14888,20848, 14904,29040, - 14920,18800, 14936,26992, 14952,22896, 14968,31088, 14984,17776, 15000,25968, - 15016,21872, 15032,30064, 15048,19824, 15064,28016, 15080,23920, 15088,15728, - 15096,32112, 15112,17264, 15128,25456, 15144,21360, 15160,29552, 15176,19312, - 15192,27504, 15208,23408, 15224,31600, 15240,18288, 15256,26480, 15272,22384, - 15288,30576, 15304,20336, 15320,28528, 15336,24432, 15344,16240, 15352,32624, - 15368,16624, 15384,24816, 15400,20720, 15416,28912, 15432,18672, 15448,26864, - 15464,22768, 15480,30960, 15496,17648, 15512,25840, 15528,21744, 15544,29936, - 15560,19696, 15576,27888, 15592,23792, 15608,31984, 15624,17136, 15640,25328, - 15656,21232, 15672,29424, 15688,19184, 15704,27376, 15720,23280, 15736,31472, - 15752,18160, 15768,26352, 15784,22256, 15800,30448, 15816,20208, 15832,28400, - 15848,24304, 15856,16112, 15864,32496, 15880,16880, 15896,25072, 15912,20976, - 15928,29168, 15944,18928, 15960,27120, 15976,23024, 15992,31216, 16008,17904, - 16024,26096, 16040,22000, 16056,30192, 16072,19952, 16088,28144, 16104,24048, - 16120,32240, 16136,17392, 16152,25584, 16168,21488, 16184,29680, 16200,19440, - 16216,27632, 16232,23536, 16248,31728, 16264,18416, 16280,26608, 16296,22512, - 16312,30704, 16328,20464, 16344,28656, 16360,24560, 16376,32752, 16408,24584, - 16424,20488, 16440,28680, 16456,18440, 16472,26632, 16488,22536, 16504,30728, - 16520,17416, 16536,25608, 16552,21512, 16568,29704, 16584,19464, 16600,27656, - 16616,23560, 16632,31752, 16648,16904, 16664,25096, 16680,21000, 16696,29192, - 16712,18952, 16728,27144, 16744,23048, 16760,31240, 16776,17928, 16792,26120, - 16808,22024, 16824,30216, 16840,19976, 16856,28168, 16872,24072, 16888,32264, - 16920,24840, 16936,20744, 16952,28936, 16968,18696, 16984,26888, 17000,22792, - 17016,30984, 17032,17672, 17048,25864, 17064,21768, 17080,29960, 17096,19720, - 17112,27912, 17128,23816, 17144,32008, 17176,25352, 17192,21256, 17208,29448, - 17224,19208, 17240,27400, 17256,23304, 17272,31496, 17288,18184, 17304,26376, - 17320,22280, 17336,30472, 17352,20232, 17368,28424, 17384,24328, 17400,32520, - 17432,24712, 17448,20616, 17464,28808, 17480,18568, 17496,26760, 17512,22664, - 17528,30856, 17560,25736, 17576,21640, 17592,29832, 17608,19592, 17624,27784, - 17640,23688, 17656,31880, 17688,25224, 17704,21128, 17720,29320, 17736,19080, - 17752,27272, 17768,23176, 17784,31368, 17800,18056, 17816,26248, 17832,22152, - 17848,30344, 17864,20104, 17880,28296, 17896,24200, 17912,32392, 17944,24968, - 17960,20872, 17976,29064, 17992,18824, 18008,27016, 18024,22920, 18040,31112, - 18072,25992, 18088,21896, 18104,30088, 18120,19848, 18136,28040, 18152,23944, - 18168,32136, 18200,25480, 18216,21384, 18232,29576, 18248,19336, 18264,27528, - 18280,23432, 18296,31624, 18328,26504, 18344,22408, 18360,30600, 18376,20360, - 18392,28552, 18408,24456, 18424,32648, 18456,24648, 18472,20552, 18488,28744, - 18520,26696, 18536,22600, 18552,30792, 18584,25672, 18600,21576, 18616,29768, - 18632,19528, 18648,27720, 18664,23624, 18680,31816, 18712,25160, 18728,21064, - 18744,29256, 18760,19016, 18776,27208, 18792,23112, 18808,31304, 18840,26184, - 18856,22088, 18872,30280, 18888,20040, 18904,28232, 18920,24136, 18936,32328, - 18968,24904, 18984,20808, 19000,29000, 19032,26952, 19048,22856, 19064,31048, - 19096,25928, 19112,21832, 19128,30024, 19144,19784, 19160,27976, 19176,23880, - 19192,32072, 19224,25416, 19240,21320, 19256,29512, 19288,27464, 19304,23368, - 19320,31560, 19352,26440, 19368,22344, 19384,30536, 19400,20296, 19416,28488, - 19432,24392, 19448,32584, 19480,24776, 19496,20680, 19512,28872, 19544,26824, - 19560,22728, 19576,30920, 19608,25800, 19624,21704, 19640,29896, 19672,27848, - 19688,23752, 19704,31944, 19736,25288, 19752,21192, 19768,29384, 19800,27336, - 19816,23240, 19832,31432, 19864,26312, 19880,22216, 19896,30408, 19912,20168, - 19928,28360, 19944,24264, 19960,32456, 19992,25032, 20008,20936, 20024,29128, - 20056,27080, 20072,22984, 20088,31176, 20120,26056, 20136,21960, 20152,30152, - 20184,28104, 20200,24008, 20216,32200, 20248,25544, 20264,21448, 20280,29640, - 20312,27592, 20328,23496, 20344,31688, 20376,26568, 20392,22472, 20408,30664, - 20440,28616, 20456,24520, 20472,32712, 20504,24616, 20536,28712, 20568,26664, - 20584,22568, 20600,30760, 20632,25640, 20648,21544, 20664,29736, 20696,27688, - 20712,23592, 20728,31784, 20760,25128, 20776,21032, 20792,29224, 20824,27176, - 20840,23080, 20856,31272, 20888,26152, 20904,22056, 20920,30248, 20952,28200, - 20968,24104, 20984,32296, 21016,24872, 21048,28968, 21080,26920, 21096,22824, - 21112,31016, 21144,25896, 21160,21800, 21176,29992, 21208,27944, 21224,23848, - 21240,32040, 21272,25384, 21304,29480, 21336,27432, 21352,23336, 21368,31528, - 21400,26408, 21416,22312, 21432,30504, 21464,28456, 21480,24360, 21496,32552, - 21528,24744, 21560,28840, 21592,26792, 21608,22696, 21624,30888, 21656,25768, - 21688,29864, 21720,27816, 21736,23720, 21752,31912, 21784,25256, 21816,29352, - 21848,27304, 21864,23208, 21880,31400, 21912,26280, 21928,22184, 21944,30376, - 21976,28328, 21992,24232, 22008,32424, 22040,25000, 22072,29096, 22104,27048, - 22120,22952, 22136,31144, 22168,26024, 22200,30120, 22232,28072, 22248,23976, - 22264,32168, 22296,25512, 22328,29608, 22360,27560, 22376,23464, 22392,31656, - 22424,26536, 22456,30632, 22488,28584, 22504,24488, 22520,32680, 22552,24680, - 22584,28776, 22616,26728, 22648,30824, 22680,25704, 22712,29800, 22744,27752, - 22760,23656, 22776,31848, 22808,25192, 22840,29288, 22872,27240, 22888,23144, - 22904,31336, 22936,26216, 22968,30312, 23000,28264, 23016,24168, 23032,32360, - 23064,24936, 23096,29032, 23128,26984, 23160,31080, 23192,25960, 23224,30056, - 23256,28008, 23272,23912, 23288,32104, 23320,25448, 23352,29544, 23384,27496, - 23416,31592, 23448,26472, 23480,30568, 23512,28520, 23528,24424, 23544,32616, - 23576,24808, 23608,28904, 23640,26856, 23672,30952, 23704,25832, 23736,29928, - 23768,27880, 23800,31976, 23832,25320, 23864,29416, 23896,27368, 23928,31464, - 23960,26344, 23992,30440, 24024,28392, 24040,24296, 24056,32488, 24088,25064, - 24120,29160, 24152,27112, 24184,31208, 24216,26088, 24248,30184, 24280,28136, - 24312,32232, 24344,25576, 24376,29672, 24408,27624, 24440,31720, 24472,26600, - 24504,30696, 24536,28648, 24568,32744, 24632,28696, 24664,26648, 24696,30744, - 24728,25624, 24760,29720, 24792,27672, 24824,31768, 24856,25112, 24888,29208, - 24920,27160, 24952,31256, 24984,26136, 25016,30232, 25048,28184, 25080,32280, - 25144,28952, 25176,26904, 25208,31000, 25240,25880, 25272,29976, 25304,27928, - 25336,32024, 25400,29464, 25432,27416, 25464,31512, 25496,26392, 25528,30488, - 25560,28440, 25592,32536, 25656,28824, 25688,26776, 25720,30872, 25784,29848, - 25816,27800, 25848,31896, 25912,29336, 25944,27288, 25976,31384, 26008,26264, - 26040,30360, 26072,28312, 26104,32408, 26168,29080, 26200,27032, 26232,31128, - 26296,30104, 26328,28056, 26360,32152, 26424,29592, 26456,27544, 26488,31640, - 26552,30616, 26584,28568, 26616,32664, 26680,28760, 26744,30808, 26808,29784, - 26840,27736, 26872,31832, 26936,29272, 26968,27224, 27000,31320, 27064,30296, - 27096,28248, 27128,32344, 27192,29016, 27256,31064, 27320,30040, 27352,27992, - 27384,32088, 27448,29528, 27512,31576, 27576,30552, 27608,28504, 27640,32600, - 27704,28888, 27768,30936, 27832,29912, 27896,31960, 27960,29400, 28024,31448, - 28088,30424, 28120,28376, 28152,32472, 28216,29144, 28280,31192, 28344,30168, - 28408,32216, 28472,29656, 28536,31704, 28600,30680, 28664,32728, 28792,30776, - 28856,29752, 28920,31800, 28984,29240, 29048,31288, 29112,30264, 29176,32312, - 29304,31032, 29368,30008, 29432,32056, 29560,31544, 29624,30520, 29688,32568, - 29816,30904, 29944,31928, 30072,31416, 30136,30392, 30200,32440, 30328,31160, - 30456,32184, 30584,31672, 30712,32696, 30968,31864, 31096,31352, 31224,32376, - 31480,32120, 31736,32632, 32248,32504 -}; - -/** -* \par -* Example code for Floating-point RFFT Twiddle factors Generation: -* \par -*
TW = exp(2*pi*i*[0:L/2-1]/L - pi/2*i).' 
-* \par -* Real and Imag values are in interleaved fashion -*/ -const float32_t twiddleCoef_rfft_32[32] = { -0.0f , 1.0f , -0.195090322f , 0.98078528f , -0.382683432f , 0.923879533f , -0.555570233f , 0.831469612f , -0.707106781f , 0.707106781f , -0.831469612f , 0.555570233f , -0.923879533f , 0.382683432f , -0.98078528f , 0.195090322f , -1.0f , 0.0f , -0.98078528f , -0.195090322f , -0.923879533f , -0.382683432f , -0.831469612f , -0.555570233f , -0.707106781f , -0.707106781f , -0.555570233f , -0.831469612f , -0.382683432f , -0.923879533f , -0.195090322f , -0.98078528f -}; - -const float32_t twiddleCoef_rfft_64[64] = { -0.0f, 1.0f, -0.098017140329561f, 0.995184726672197f, -0.195090322016128f, 0.98078528040323f, -0.290284677254462f, 0.956940335732209f, -0.38268343236509f, 0.923879532511287f, -0.471396736825998f, 0.881921264348355f, -0.555570233019602f, 0.831469612302545f, -0.634393284163645f, 0.773010453362737f, -0.707106781186547f, 0.707106781186548f, -0.773010453362737f, 0.634393284163645f, -0.831469612302545f, 0.555570233019602f, -0.881921264348355f, 0.471396736825998f, -0.923879532511287f, 0.38268343236509f, -0.956940335732209f, 0.290284677254462f, -0.98078528040323f, 0.195090322016128f, -0.995184726672197f, 0.098017140329561f, -1.0f, 0.0f, -0.995184726672197f, -0.098017140329561f, -0.98078528040323f, -0.195090322016128f, -0.956940335732209f, -0.290284677254462f, -0.923879532511287f, -0.38268343236509f, -0.881921264348355f, -0.471396736825998f, -0.831469612302545f, -0.555570233019602f, -0.773010453362737f, -0.634393284163645f, -0.707106781186548f, -0.707106781186547f, -0.634393284163645f, -0.773010453362737f, -0.555570233019602f, -0.831469612302545f, -0.471396736825998f, -0.881921264348355f, -0.38268343236509f, -0.923879532511287f, -0.290284677254462f, -0.956940335732209f, -0.195090322016129f, -0.98078528040323f, -0.098017140329561f, -0.995184726672197f -}; - -const float32_t twiddleCoef_rfft_128[128] = { - 0.000000000f, 1.000000000f, - 0.049067674f, 0.998795456f, - 0.098017140f, 0.995184727f, - 0.146730474f, 0.989176510f, - 0.195090322f, 0.980785280f, - 0.242980180f, 0.970031253f, - 0.290284677f, 0.956940336f, - 0.336889853f, 0.941544065f, - 0.382683432f, 0.923879533f, - 0.427555093f, 0.903989293f, - 0.471396737f, 0.881921264f, - 0.514102744f, 0.857728610f, - 0.555570233f, 0.831469612f, - 0.595699304f, 0.803207531f, - 0.634393284f, 0.773010453f, - 0.671558955f, 0.740951125f, - 0.707106781f, 0.707106781f, - 0.740951125f, 0.671558955f, - 0.773010453f, 0.634393284f, - 0.803207531f, 0.595699304f, - 0.831469612f, 0.555570233f, - 0.857728610f, 0.514102744f, - 0.881921264f, 0.471396737f, - 0.903989293f, 0.427555093f, - 0.923879533f, 0.382683432f, - 0.941544065f, 0.336889853f, - 0.956940336f, 0.290284677f, - 0.970031253f, 0.242980180f, - 0.980785280f, 0.195090322f, - 0.989176510f, 0.146730474f, - 0.995184727f, 0.098017140f, - 0.998795456f, 0.049067674f, - 1.000000000f, 0.000000000f, - 0.998795456f, -0.049067674f, - 0.995184727f, -0.098017140f, - 0.989176510f, -0.146730474f, - 0.980785280f, -0.195090322f, - 0.970031253f, -0.242980180f, - 0.956940336f, -0.290284677f, - 0.941544065f, -0.336889853f, - 0.923879533f, -0.382683432f, - 0.903989293f, -0.427555093f, - 0.881921264f, -0.471396737f, - 0.857728610f, -0.514102744f, - 0.831469612f, -0.555570233f, - 0.803207531f, -0.595699304f, - 0.773010453f, -0.634393284f, - 0.740951125f, -0.671558955f, - 0.707106781f, -0.707106781f, - 0.671558955f, -0.740951125f, - 0.634393284f, -0.773010453f, - 0.595699304f, -0.803207531f, - 0.555570233f, -0.831469612f, - 0.514102744f, -0.857728610f, - 0.471396737f, -0.881921264f, - 0.427555093f, -0.903989293f, - 0.382683432f, -0.923879533f, - 0.336889853f, -0.941544065f, - 0.290284677f, -0.956940336f, - 0.242980180f, -0.970031253f, - 0.195090322f, -0.980785280f, - 0.146730474f, -0.989176510f, - 0.098017140f, -0.995184727f, - 0.049067674f, -0.998795456f -}; - -const float32_t twiddleCoef_rfft_256[256] = { - 0.000000000f, 1.000000000f, - 0.024541229f, 0.999698819f, - 0.049067674f, 0.998795456f, - 0.073564564f, 0.997290457f, - 0.098017140f, 0.995184727f, - 0.122410675f, 0.992479535f, - 0.146730474f, 0.989176510f, - 0.170961889f, 0.985277642f, - 0.195090322f, 0.980785280f, - 0.219101240f, 0.975702130f, - 0.242980180f, 0.970031253f, - 0.266712757f, 0.963776066f, - 0.290284677f, 0.956940336f, - 0.313681740f, 0.949528181f, - 0.336889853f, 0.941544065f, - 0.359895037f, 0.932992799f, - 0.382683432f, 0.923879533f, - 0.405241314f, 0.914209756f, - 0.427555093f, 0.903989293f, - 0.449611330f, 0.893224301f, - 0.471396737f, 0.881921264f, - 0.492898192f, 0.870086991f, - 0.514102744f, 0.857728610f, - 0.534997620f, 0.844853565f, - 0.555570233f, 0.831469612f, - 0.575808191f, 0.817584813f, - 0.595699304f, 0.803207531f, - 0.615231591f, 0.788346428f, - 0.634393284f, 0.773010453f, - 0.653172843f, 0.757208847f, - 0.671558955f, 0.740951125f, - 0.689540545f, 0.724247083f, - 0.707106781f, 0.707106781f, - 0.724247083f, 0.689540545f, - 0.740951125f, 0.671558955f, - 0.757208847f, 0.653172843f, - 0.773010453f, 0.634393284f, - 0.788346428f, 0.615231591f, - 0.803207531f, 0.595699304f, - 0.817584813f, 0.575808191f, - 0.831469612f, 0.555570233f, - 0.844853565f, 0.534997620f, - 0.857728610f, 0.514102744f, - 0.870086991f, 0.492898192f, - 0.881921264f, 0.471396737f, - 0.893224301f, 0.449611330f, - 0.903989293f, 0.427555093f, - 0.914209756f, 0.405241314f, - 0.923879533f, 0.382683432f, - 0.932992799f, 0.359895037f, - 0.941544065f, 0.336889853f, - 0.949528181f, 0.313681740f, - 0.956940336f, 0.290284677f, - 0.963776066f, 0.266712757f, - 0.970031253f, 0.242980180f, - 0.975702130f, 0.219101240f, - 0.980785280f, 0.195090322f, - 0.985277642f, 0.170961889f, - 0.989176510f, 0.146730474f, - 0.992479535f, 0.122410675f, - 0.995184727f, 0.098017140f, - 0.997290457f, 0.073564564f, - 0.998795456f, 0.049067674f, - 0.999698819f, 0.024541229f, - 1.000000000f, 0.000000000f, - 0.999698819f, -0.024541229f, - 0.998795456f, -0.049067674f, - 0.997290457f, -0.073564564f, - 0.995184727f, -0.098017140f, - 0.992479535f, -0.122410675f, - 0.989176510f, -0.146730474f, - 0.985277642f, -0.170961889f, - 0.980785280f, -0.195090322f, - 0.975702130f, -0.219101240f, - 0.970031253f, -0.242980180f, - 0.963776066f, -0.266712757f, - 0.956940336f, -0.290284677f, - 0.949528181f, -0.313681740f, - 0.941544065f, -0.336889853f, - 0.932992799f, -0.359895037f, - 0.923879533f, -0.382683432f, - 0.914209756f, -0.405241314f, - 0.903989293f, -0.427555093f, - 0.893224301f, -0.449611330f, - 0.881921264f, -0.471396737f, - 0.870086991f, -0.492898192f, - 0.857728610f, -0.514102744f, - 0.844853565f, -0.534997620f, - 0.831469612f, -0.555570233f, - 0.817584813f, -0.575808191f, - 0.803207531f, -0.595699304f, - 0.788346428f, -0.615231591f, - 0.773010453f, -0.634393284f, - 0.757208847f, -0.653172843f, - 0.740951125f, -0.671558955f, - 0.724247083f, -0.689540545f, - 0.707106781f, -0.707106781f, - 0.689540545f, -0.724247083f, - 0.671558955f, -0.740951125f, - 0.653172843f, -0.757208847f, - 0.634393284f, -0.773010453f, - 0.615231591f, -0.788346428f, - 0.595699304f, -0.803207531f, - 0.575808191f, -0.817584813f, - 0.555570233f, -0.831469612f, - 0.534997620f, -0.844853565f, - 0.514102744f, -0.857728610f, - 0.492898192f, -0.870086991f, - 0.471396737f, -0.881921264f, - 0.449611330f, -0.893224301f, - 0.427555093f, -0.903989293f, - 0.405241314f, -0.914209756f, - 0.382683432f, -0.923879533f, - 0.359895037f, -0.932992799f, - 0.336889853f, -0.941544065f, - 0.313681740f, -0.949528181f, - 0.290284677f, -0.956940336f, - 0.266712757f, -0.963776066f, - 0.242980180f, -0.970031253f, - 0.219101240f, -0.975702130f, - 0.195090322f, -0.980785280f, - 0.170961889f, -0.985277642f, - 0.146730474f, -0.989176510f, - 0.122410675f, -0.992479535f, - 0.098017140f, -0.995184727f, - 0.073564564f, -0.997290457f, - 0.049067674f, -0.998795456f, - 0.024541229f, -0.999698819f -}; - -const float32_t twiddleCoef_rfft_512[512] = { - 0.000000000f, 1.000000000f, - 0.012271538f, 0.999924702f, - 0.024541229f, 0.999698819f, - 0.036807223f, 0.999322385f, - 0.049067674f, 0.998795456f, - 0.061320736f, 0.998118113f, - 0.073564564f, 0.997290457f, - 0.085797312f, 0.996312612f, - 0.098017140f, 0.995184727f, - 0.110222207f, 0.993906970f, - 0.122410675f, 0.992479535f, - 0.134580709f, 0.990902635f, - 0.146730474f, 0.989176510f, - 0.158858143f, 0.987301418f, - 0.170961889f, 0.985277642f, - 0.183039888f, 0.983105487f, - 0.195090322f, 0.980785280f, - 0.207111376f, 0.978317371f, - 0.219101240f, 0.975702130f, - 0.231058108f, 0.972939952f, - 0.242980180f, 0.970031253f, - 0.254865660f, 0.966976471f, - 0.266712757f, 0.963776066f, - 0.278519689f, 0.960430519f, - 0.290284677f, 0.956940336f, - 0.302005949f, 0.953306040f, - 0.313681740f, 0.949528181f, - 0.325310292f, 0.945607325f, - 0.336889853f, 0.941544065f, - 0.348418680f, 0.937339012f, - 0.359895037f, 0.932992799f, - 0.371317194f, 0.928506080f, - 0.382683432f, 0.923879533f, - 0.393992040f, 0.919113852f, - 0.405241314f, 0.914209756f, - 0.416429560f, 0.909167983f, - 0.427555093f, 0.903989293f, - 0.438616239f, 0.898674466f, - 0.449611330f, 0.893224301f, - 0.460538711f, 0.887639620f, - 0.471396737f, 0.881921264f, - 0.482183772f, 0.876070094f, - 0.492898192f, 0.870086991f, - 0.503538384f, 0.863972856f, - 0.514102744f, 0.857728610f, - 0.524589683f, 0.851355193f, - 0.534997620f, 0.844853565f, - 0.545324988f, 0.838224706f, - 0.555570233f, 0.831469612f, - 0.565731811f, 0.824589303f, - 0.575808191f, 0.817584813f, - 0.585797857f, 0.810457198f, - 0.595699304f, 0.803207531f, - 0.605511041f, 0.795836905f, - 0.615231591f, 0.788346428f, - 0.624859488f, 0.780737229f, - 0.634393284f, 0.773010453f, - 0.643831543f, 0.765167266f, - 0.653172843f, 0.757208847f, - 0.662415778f, 0.749136395f, - 0.671558955f, 0.740951125f, - 0.680600998f, 0.732654272f, - 0.689540545f, 0.724247083f, - 0.698376249f, 0.715730825f, - 0.707106781f, 0.707106781f, - 0.715730825f, 0.698376249f, - 0.724247083f, 0.689540545f, - 0.732654272f, 0.680600998f, - 0.740951125f, 0.671558955f, - 0.749136395f, 0.662415778f, - 0.757208847f, 0.653172843f, - 0.765167266f, 0.643831543f, - 0.773010453f, 0.634393284f, - 0.780737229f, 0.624859488f, - 0.788346428f, 0.615231591f, - 0.795836905f, 0.605511041f, - 0.803207531f, 0.595699304f, - 0.810457198f, 0.585797857f, - 0.817584813f, 0.575808191f, - 0.824589303f, 0.565731811f, - 0.831469612f, 0.555570233f, - 0.838224706f, 0.545324988f, - 0.844853565f, 0.534997620f, - 0.851355193f, 0.524589683f, - 0.857728610f, 0.514102744f, - 0.863972856f, 0.503538384f, - 0.870086991f, 0.492898192f, - 0.876070094f, 0.482183772f, - 0.881921264f, 0.471396737f, - 0.887639620f, 0.460538711f, - 0.893224301f, 0.449611330f, - 0.898674466f, 0.438616239f, - 0.903989293f, 0.427555093f, - 0.909167983f, 0.416429560f, - 0.914209756f, 0.405241314f, - 0.919113852f, 0.393992040f, - 0.923879533f, 0.382683432f, - 0.928506080f, 0.371317194f, - 0.932992799f, 0.359895037f, - 0.937339012f, 0.348418680f, - 0.941544065f, 0.336889853f, - 0.945607325f, 0.325310292f, - 0.949528181f, 0.313681740f, - 0.953306040f, 0.302005949f, - 0.956940336f, 0.290284677f, - 0.960430519f, 0.278519689f, - 0.963776066f, 0.266712757f, - 0.966976471f, 0.254865660f, - 0.970031253f, 0.242980180f, - 0.972939952f, 0.231058108f, - 0.975702130f, 0.219101240f, - 0.978317371f, 0.207111376f, - 0.980785280f, 0.195090322f, - 0.983105487f, 0.183039888f, - 0.985277642f, 0.170961889f, - 0.987301418f, 0.158858143f, - 0.989176510f, 0.146730474f, - 0.990902635f, 0.134580709f, - 0.992479535f, 0.122410675f, - 0.993906970f, 0.110222207f, - 0.995184727f, 0.098017140f, - 0.996312612f, 0.085797312f, - 0.997290457f, 0.073564564f, - 0.998118113f, 0.061320736f, - 0.998795456f, 0.049067674f, - 0.999322385f, 0.036807223f, - 0.999698819f, 0.024541229f, - 0.999924702f, 0.012271538f, - 1.000000000f, 0.000000000f, - 0.999924702f, -0.012271538f, - 0.999698819f, -0.024541229f, - 0.999322385f, -0.036807223f, - 0.998795456f, -0.049067674f, - 0.998118113f, -0.061320736f, - 0.997290457f, -0.073564564f, - 0.996312612f, -0.085797312f, - 0.995184727f, -0.098017140f, - 0.993906970f, -0.110222207f, - 0.992479535f, -0.122410675f, - 0.990902635f, -0.134580709f, - 0.989176510f, -0.146730474f, - 0.987301418f, -0.158858143f, - 0.985277642f, -0.170961889f, - 0.983105487f, -0.183039888f, - 0.980785280f, -0.195090322f, - 0.978317371f, -0.207111376f, - 0.975702130f, -0.219101240f, - 0.972939952f, -0.231058108f, - 0.970031253f, -0.242980180f, - 0.966976471f, -0.254865660f, - 0.963776066f, -0.266712757f, - 0.960430519f, -0.278519689f, - 0.956940336f, -0.290284677f, - 0.953306040f, -0.302005949f, - 0.949528181f, -0.313681740f, - 0.945607325f, -0.325310292f, - 0.941544065f, -0.336889853f, - 0.937339012f, -0.348418680f, - 0.932992799f, -0.359895037f, - 0.928506080f, -0.371317194f, - 0.923879533f, -0.382683432f, - 0.919113852f, -0.393992040f, - 0.914209756f, -0.405241314f, - 0.909167983f, -0.416429560f, - 0.903989293f, -0.427555093f, - 0.898674466f, -0.438616239f, - 0.893224301f, -0.449611330f, - 0.887639620f, -0.460538711f, - 0.881921264f, -0.471396737f, - 0.876070094f, -0.482183772f, - 0.870086991f, -0.492898192f, - 0.863972856f, -0.503538384f, - 0.857728610f, -0.514102744f, - 0.851355193f, -0.524589683f, - 0.844853565f, -0.534997620f, - 0.838224706f, -0.545324988f, - 0.831469612f, -0.555570233f, - 0.824589303f, -0.565731811f, - 0.817584813f, -0.575808191f, - 0.810457198f, -0.585797857f, - 0.803207531f, -0.595699304f, - 0.795836905f, -0.605511041f, - 0.788346428f, -0.615231591f, - 0.780737229f, -0.624859488f, - 0.773010453f, -0.634393284f, - 0.765167266f, -0.643831543f, - 0.757208847f, -0.653172843f, - 0.749136395f, -0.662415778f, - 0.740951125f, -0.671558955f, - 0.732654272f, -0.680600998f, - 0.724247083f, -0.689540545f, - 0.715730825f, -0.698376249f, - 0.707106781f, -0.707106781f, - 0.698376249f, -0.715730825f, - 0.689540545f, -0.724247083f, - 0.680600998f, -0.732654272f, - 0.671558955f, -0.740951125f, - 0.662415778f, -0.749136395f, - 0.653172843f, -0.757208847f, - 0.643831543f, -0.765167266f, - 0.634393284f, -0.773010453f, - 0.624859488f, -0.780737229f, - 0.615231591f, -0.788346428f, - 0.605511041f, -0.795836905f, - 0.595699304f, -0.803207531f, - 0.585797857f, -0.810457198f, - 0.575808191f, -0.817584813f, - 0.565731811f, -0.824589303f, - 0.555570233f, -0.831469612f, - 0.545324988f, -0.838224706f, - 0.534997620f, -0.844853565f, - 0.524589683f, -0.851355193f, - 0.514102744f, -0.857728610f, - 0.503538384f, -0.863972856f, - 0.492898192f, -0.870086991f, - 0.482183772f, -0.876070094f, - 0.471396737f, -0.881921264f, - 0.460538711f, -0.887639620f, - 0.449611330f, -0.893224301f, - 0.438616239f, -0.898674466f, - 0.427555093f, -0.903989293f, - 0.416429560f, -0.909167983f, - 0.405241314f, -0.914209756f, - 0.393992040f, -0.919113852f, - 0.382683432f, -0.923879533f, - 0.371317194f, -0.928506080f, - 0.359895037f, -0.932992799f, - 0.348418680f, -0.937339012f, - 0.336889853f, -0.941544065f, - 0.325310292f, -0.945607325f, - 0.313681740f, -0.949528181f, - 0.302005949f, -0.953306040f, - 0.290284677f, -0.956940336f, - 0.278519689f, -0.960430519f, - 0.266712757f, -0.963776066f, - 0.254865660f, -0.966976471f, - 0.242980180f, -0.970031253f, - 0.231058108f, -0.972939952f, - 0.219101240f, -0.975702130f, - 0.207111376f, -0.978317371f, - 0.195090322f, -0.980785280f, - 0.183039888f, -0.983105487f, - 0.170961889f, -0.985277642f, - 0.158858143f, -0.987301418f, - 0.146730474f, -0.989176510f, - 0.134580709f, -0.990902635f, - 0.122410675f, -0.992479535f, - 0.110222207f, -0.993906970f, - 0.098017140f, -0.995184727f, - 0.085797312f, -0.996312612f, - 0.073564564f, -0.997290457f, - 0.061320736f, -0.998118113f, - 0.049067674f, -0.998795456f, - 0.036807223f, -0.999322385f, - 0.024541229f, -0.999698819f, - 0.012271538f, -0.999924702f -}; - -const float32_t twiddleCoef_rfft_1024[1024] = { - 0.000000000f, 1.000000000f, - 0.006135885f, 0.999981175f, - 0.012271538f, 0.999924702f, - 0.018406730f, 0.999830582f, - 0.024541229f, 0.999698819f, - 0.030674803f, 0.999529418f, - 0.036807223f, 0.999322385f, - 0.042938257f, 0.999077728f, - 0.049067674f, 0.998795456f, - 0.055195244f, 0.998475581f, - 0.061320736f, 0.998118113f, - 0.067443920f, 0.997723067f, - 0.073564564f, 0.997290457f, - 0.079682438f, 0.996820299f, - 0.085797312f, 0.996312612f, - 0.091908956f, 0.995767414f, - 0.098017140f, 0.995184727f, - 0.104121634f, 0.994564571f, - 0.110222207f, 0.993906970f, - 0.116318631f, 0.993211949f, - 0.122410675f, 0.992479535f, - 0.128498111f, 0.991709754f, - 0.134580709f, 0.990902635f, - 0.140658239f, 0.990058210f, - 0.146730474f, 0.989176510f, - 0.152797185f, 0.988257568f, - 0.158858143f, 0.987301418f, - 0.164913120f, 0.986308097f, - 0.170961889f, 0.985277642f, - 0.177004220f, 0.984210092f, - 0.183039888f, 0.983105487f, - 0.189068664f, 0.981963869f, - 0.195090322f, 0.980785280f, - 0.201104635f, 0.979569766f, - 0.207111376f, 0.978317371f, - 0.213110320f, 0.977028143f, - 0.219101240f, 0.975702130f, - 0.225083911f, 0.974339383f, - 0.231058108f, 0.972939952f, - 0.237023606f, 0.971503891f, - 0.242980180f, 0.970031253f, - 0.248927606f, 0.968522094f, - 0.254865660f, 0.966976471f, - 0.260794118f, 0.965394442f, - 0.266712757f, 0.963776066f, - 0.272621355f, 0.962121404f, - 0.278519689f, 0.960430519f, - 0.284407537f, 0.958703475f, - 0.290284677f, 0.956940336f, - 0.296150888f, 0.955141168f, - 0.302005949f, 0.953306040f, - 0.307849640f, 0.951435021f, - 0.313681740f, 0.949528181f, - 0.319502031f, 0.947585591f, - 0.325310292f, 0.945607325f, - 0.331106306f, 0.943593458f, - 0.336889853f, 0.941544065f, - 0.342660717f, 0.939459224f, - 0.348418680f, 0.937339012f, - 0.354163525f, 0.935183510f, - 0.359895037f, 0.932992799f, - 0.365612998f, 0.930766961f, - 0.371317194f, 0.928506080f, - 0.377007410f, 0.926210242f, - 0.382683432f, 0.923879533f, - 0.388345047f, 0.921514039f, - 0.393992040f, 0.919113852f, - 0.399624200f, 0.916679060f, - 0.405241314f, 0.914209756f, - 0.410843171f, 0.911706032f, - 0.416429560f, 0.909167983f, - 0.422000271f, 0.906595705f, - 0.427555093f, 0.903989293f, - 0.433093819f, 0.901348847f, - 0.438616239f, 0.898674466f, - 0.444122145f, 0.895966250f, - 0.449611330f, 0.893224301f, - 0.455083587f, 0.890448723f, - 0.460538711f, 0.887639620f, - 0.465976496f, 0.884797098f, - 0.471396737f, 0.881921264f, - 0.476799230f, 0.879012226f, - 0.482183772f, 0.876070094f, - 0.487550160f, 0.873094978f, - 0.492898192f, 0.870086991f, - 0.498227667f, 0.867046246f, - 0.503538384f, 0.863972856f, - 0.508830143f, 0.860866939f, - 0.514102744f, 0.857728610f, - 0.519355990f, 0.854557988f, - 0.524589683f, 0.851355193f, - 0.529803625f, 0.848120345f, - 0.534997620f, 0.844853565f, - 0.540171473f, 0.841554977f, - 0.545324988f, 0.838224706f, - 0.550457973f, 0.834862875f, - 0.555570233f, 0.831469612f, - 0.560661576f, 0.828045045f, - 0.565731811f, 0.824589303f, - 0.570780746f, 0.821102515f, - 0.575808191f, 0.817584813f, - 0.580813958f, 0.814036330f, - 0.585797857f, 0.810457198f, - 0.590759702f, 0.806847554f, - 0.595699304f, 0.803207531f, - 0.600616479f, 0.799537269f, - 0.605511041f, 0.795836905f, - 0.610382806f, 0.792106577f, - 0.615231591f, 0.788346428f, - 0.620057212f, 0.784556597f, - 0.624859488f, 0.780737229f, - 0.629638239f, 0.776888466f, - 0.634393284f, 0.773010453f, - 0.639124445f, 0.769103338f, - 0.643831543f, 0.765167266f, - 0.648514401f, 0.761202385f, - 0.653172843f, 0.757208847f, - 0.657806693f, 0.753186799f, - 0.662415778f, 0.749136395f, - 0.666999922f, 0.745057785f, - 0.671558955f, 0.740951125f, - 0.676092704f, 0.736816569f, - 0.680600998f, 0.732654272f, - 0.685083668f, 0.728464390f, - 0.689540545f, 0.724247083f, - 0.693971461f, 0.720002508f, - 0.698376249f, 0.715730825f, - 0.702754744f, 0.711432196f, - 0.707106781f, 0.707106781f, - 0.711432196f, 0.702754744f, - 0.715730825f, 0.698376249f, - 0.720002508f, 0.693971461f, - 0.724247083f, 0.689540545f, - 0.728464390f, 0.685083668f, - 0.732654272f, 0.680600998f, - 0.736816569f, 0.676092704f, - 0.740951125f, 0.671558955f, - 0.745057785f, 0.666999922f, - 0.749136395f, 0.662415778f, - 0.753186799f, 0.657806693f, - 0.757208847f, 0.653172843f, - 0.761202385f, 0.648514401f, - 0.765167266f, 0.643831543f, - 0.769103338f, 0.639124445f, - 0.773010453f, 0.634393284f, - 0.776888466f, 0.629638239f, - 0.780737229f, 0.624859488f, - 0.784556597f, 0.620057212f, - 0.788346428f, 0.615231591f, - 0.792106577f, 0.610382806f, - 0.795836905f, 0.605511041f, - 0.799537269f, 0.600616479f, - 0.803207531f, 0.595699304f, - 0.806847554f, 0.590759702f, - 0.810457198f, 0.585797857f, - 0.814036330f, 0.580813958f, - 0.817584813f, 0.575808191f, - 0.821102515f, 0.570780746f, - 0.824589303f, 0.565731811f, - 0.828045045f, 0.560661576f, - 0.831469612f, 0.555570233f, - 0.834862875f, 0.550457973f, - 0.838224706f, 0.545324988f, - 0.841554977f, 0.540171473f, - 0.844853565f, 0.534997620f, - 0.848120345f, 0.529803625f, - 0.851355193f, 0.524589683f, - 0.854557988f, 0.519355990f, - 0.857728610f, 0.514102744f, - 0.860866939f, 0.508830143f, - 0.863972856f, 0.503538384f, - 0.867046246f, 0.498227667f, - 0.870086991f, 0.492898192f, - 0.873094978f, 0.487550160f, - 0.876070094f, 0.482183772f, - 0.879012226f, 0.476799230f, - 0.881921264f, 0.471396737f, - 0.884797098f, 0.465976496f, - 0.887639620f, 0.460538711f, - 0.890448723f, 0.455083587f, - 0.893224301f, 0.449611330f, - 0.895966250f, 0.444122145f, - 0.898674466f, 0.438616239f, - 0.901348847f, 0.433093819f, - 0.903989293f, 0.427555093f, - 0.906595705f, 0.422000271f, - 0.909167983f, 0.416429560f, - 0.911706032f, 0.410843171f, - 0.914209756f, 0.405241314f, - 0.916679060f, 0.399624200f, - 0.919113852f, 0.393992040f, - 0.921514039f, 0.388345047f, - 0.923879533f, 0.382683432f, - 0.926210242f, 0.377007410f, - 0.928506080f, 0.371317194f, - 0.930766961f, 0.365612998f, - 0.932992799f, 0.359895037f, - 0.935183510f, 0.354163525f, - 0.937339012f, 0.348418680f, - 0.939459224f, 0.342660717f, - 0.941544065f, 0.336889853f, - 0.943593458f, 0.331106306f, - 0.945607325f, 0.325310292f, - 0.947585591f, 0.319502031f, - 0.949528181f, 0.313681740f, - 0.951435021f, 0.307849640f, - 0.953306040f, 0.302005949f, - 0.955141168f, 0.296150888f, - 0.956940336f, 0.290284677f, - 0.958703475f, 0.284407537f, - 0.960430519f, 0.278519689f, - 0.962121404f, 0.272621355f, - 0.963776066f, 0.266712757f, - 0.965394442f, 0.260794118f, - 0.966976471f, 0.254865660f, - 0.968522094f, 0.248927606f, - 0.970031253f, 0.242980180f, - 0.971503891f, 0.237023606f, - 0.972939952f, 0.231058108f, - 0.974339383f, 0.225083911f, - 0.975702130f, 0.219101240f, - 0.977028143f, 0.213110320f, - 0.978317371f, 0.207111376f, - 0.979569766f, 0.201104635f, - 0.980785280f, 0.195090322f, - 0.981963869f, 0.189068664f, - 0.983105487f, 0.183039888f, - 0.984210092f, 0.177004220f, - 0.985277642f, 0.170961889f, - 0.986308097f, 0.164913120f, - 0.987301418f, 0.158858143f, - 0.988257568f, 0.152797185f, - 0.989176510f, 0.146730474f, - 0.990058210f, 0.140658239f, - 0.990902635f, 0.134580709f, - 0.991709754f, 0.128498111f, - 0.992479535f, 0.122410675f, - 0.993211949f, 0.116318631f, - 0.993906970f, 0.110222207f, - 0.994564571f, 0.104121634f, - 0.995184727f, 0.098017140f, - 0.995767414f, 0.091908956f, - 0.996312612f, 0.085797312f, - 0.996820299f, 0.079682438f, - 0.997290457f, 0.073564564f, - 0.997723067f, 0.067443920f, - 0.998118113f, 0.061320736f, - 0.998475581f, 0.055195244f, - 0.998795456f, 0.049067674f, - 0.999077728f, 0.042938257f, - 0.999322385f, 0.036807223f, - 0.999529418f, 0.030674803f, - 0.999698819f, 0.024541229f, - 0.999830582f, 0.018406730f, - 0.999924702f, 0.012271538f, - 0.999981175f, 0.006135885f, - 1.000000000f, 0.000000000f, - 0.999981175f, -0.006135885f, - 0.999924702f, -0.012271538f, - 0.999830582f, -0.018406730f, - 0.999698819f, -0.024541229f, - 0.999529418f, -0.030674803f, - 0.999322385f, -0.036807223f, - 0.999077728f, -0.042938257f, - 0.998795456f, -0.049067674f, - 0.998475581f, -0.055195244f, - 0.998118113f, -0.061320736f, - 0.997723067f, -0.067443920f, - 0.997290457f, -0.073564564f, - 0.996820299f, -0.079682438f, - 0.996312612f, -0.085797312f, - 0.995767414f, -0.091908956f, - 0.995184727f, -0.098017140f, - 0.994564571f, -0.104121634f, - 0.993906970f, -0.110222207f, - 0.993211949f, -0.116318631f, - 0.992479535f, -0.122410675f, - 0.991709754f, -0.128498111f, - 0.990902635f, -0.134580709f, - 0.990058210f, -0.140658239f, - 0.989176510f, -0.146730474f, - 0.988257568f, -0.152797185f, - 0.987301418f, -0.158858143f, - 0.986308097f, -0.164913120f, - 0.985277642f, -0.170961889f, - 0.984210092f, -0.177004220f, - 0.983105487f, -0.183039888f, - 0.981963869f, -0.189068664f, - 0.980785280f, -0.195090322f, - 0.979569766f, -0.201104635f, - 0.978317371f, -0.207111376f, - 0.977028143f, -0.213110320f, - 0.975702130f, -0.219101240f, - 0.974339383f, -0.225083911f, - 0.972939952f, -0.231058108f, - 0.971503891f, -0.237023606f, - 0.970031253f, -0.242980180f, - 0.968522094f, -0.248927606f, - 0.966976471f, -0.254865660f, - 0.965394442f, -0.260794118f, - 0.963776066f, -0.266712757f, - 0.962121404f, -0.272621355f, - 0.960430519f, -0.278519689f, - 0.958703475f, -0.284407537f, - 0.956940336f, -0.290284677f, - 0.955141168f, -0.296150888f, - 0.953306040f, -0.302005949f, - 0.951435021f, -0.307849640f, - 0.949528181f, -0.313681740f, - 0.947585591f, -0.319502031f, - 0.945607325f, -0.325310292f, - 0.943593458f, -0.331106306f, - 0.941544065f, -0.336889853f, - 0.939459224f, -0.342660717f, - 0.937339012f, -0.348418680f, - 0.935183510f, -0.354163525f, - 0.932992799f, -0.359895037f, - 0.930766961f, -0.365612998f, - 0.928506080f, -0.371317194f, - 0.926210242f, -0.377007410f, - 0.923879533f, -0.382683432f, - 0.921514039f, -0.388345047f, - 0.919113852f, -0.393992040f, - 0.916679060f, -0.399624200f, - 0.914209756f, -0.405241314f, - 0.911706032f, -0.410843171f, - 0.909167983f, -0.416429560f, - 0.906595705f, -0.422000271f, - 0.903989293f, -0.427555093f, - 0.901348847f, -0.433093819f, - 0.898674466f, -0.438616239f, - 0.895966250f, -0.444122145f, - 0.893224301f, -0.449611330f, - 0.890448723f, -0.455083587f, - 0.887639620f, -0.460538711f, - 0.884797098f, -0.465976496f, - 0.881921264f, -0.471396737f, - 0.879012226f, -0.476799230f, - 0.876070094f, -0.482183772f, - 0.873094978f, -0.487550160f, - 0.870086991f, -0.492898192f, - 0.867046246f, -0.498227667f, - 0.863972856f, -0.503538384f, - 0.860866939f, -0.508830143f, - 0.857728610f, -0.514102744f, - 0.854557988f, -0.519355990f, - 0.851355193f, -0.524589683f, - 0.848120345f, -0.529803625f, - 0.844853565f, -0.534997620f, - 0.841554977f, -0.540171473f, - 0.838224706f, -0.545324988f, - 0.834862875f, -0.550457973f, - 0.831469612f, -0.555570233f, - 0.828045045f, -0.560661576f, - 0.824589303f, -0.565731811f, - 0.821102515f, -0.570780746f, - 0.817584813f, -0.575808191f, - 0.814036330f, -0.580813958f, - 0.810457198f, -0.585797857f, - 0.806847554f, -0.590759702f, - 0.803207531f, -0.595699304f, - 0.799537269f, -0.600616479f, - 0.795836905f, -0.605511041f, - 0.792106577f, -0.610382806f, - 0.788346428f, -0.615231591f, - 0.784556597f, -0.620057212f, - 0.780737229f, -0.624859488f, - 0.776888466f, -0.629638239f, - 0.773010453f, -0.634393284f, - 0.769103338f, -0.639124445f, - 0.765167266f, -0.643831543f, - 0.761202385f, -0.648514401f, - 0.757208847f, -0.653172843f, - 0.753186799f, -0.657806693f, - 0.749136395f, -0.662415778f, - 0.745057785f, -0.666999922f, - 0.740951125f, -0.671558955f, - 0.736816569f, -0.676092704f, - 0.732654272f, -0.680600998f, - 0.728464390f, -0.685083668f, - 0.724247083f, -0.689540545f, - 0.720002508f, -0.693971461f, - 0.715730825f, -0.698376249f, - 0.711432196f, -0.702754744f, - 0.707106781f, -0.707106781f, - 0.702754744f, -0.711432196f, - 0.698376249f, -0.715730825f, - 0.693971461f, -0.720002508f, - 0.689540545f, -0.724247083f, - 0.685083668f, -0.728464390f, - 0.680600998f, -0.732654272f, - 0.676092704f, -0.736816569f, - 0.671558955f, -0.740951125f, - 0.666999922f, -0.745057785f, - 0.662415778f, -0.749136395f, - 0.657806693f, -0.753186799f, - 0.653172843f, -0.757208847f, - 0.648514401f, -0.761202385f, - 0.643831543f, -0.765167266f, - 0.639124445f, -0.769103338f, - 0.634393284f, -0.773010453f, - 0.629638239f, -0.776888466f, - 0.624859488f, -0.780737229f, - 0.620057212f, -0.784556597f, - 0.615231591f, -0.788346428f, - 0.610382806f, -0.792106577f, - 0.605511041f, -0.795836905f, - 0.600616479f, -0.799537269f, - 0.595699304f, -0.803207531f, - 0.590759702f, -0.806847554f, - 0.585797857f, -0.810457198f, - 0.580813958f, -0.814036330f, - 0.575808191f, -0.817584813f, - 0.570780746f, -0.821102515f, - 0.565731811f, -0.824589303f, - 0.560661576f, -0.828045045f, - 0.555570233f, -0.831469612f, - 0.550457973f, -0.834862875f, - 0.545324988f, -0.838224706f, - 0.540171473f, -0.841554977f, - 0.534997620f, -0.844853565f, - 0.529803625f, -0.848120345f, - 0.524589683f, -0.851355193f, - 0.519355990f, -0.854557988f, - 0.514102744f, -0.857728610f, - 0.508830143f, -0.860866939f, - 0.503538384f, -0.863972856f, - 0.498227667f, -0.867046246f, - 0.492898192f, -0.870086991f, - 0.487550160f, -0.873094978f, - 0.482183772f, -0.876070094f, - 0.476799230f, -0.879012226f, - 0.471396737f, -0.881921264f, - 0.465976496f, -0.884797098f, - 0.460538711f, -0.887639620f, - 0.455083587f, -0.890448723f, - 0.449611330f, -0.893224301f, - 0.444122145f, -0.895966250f, - 0.438616239f, -0.898674466f, - 0.433093819f, -0.901348847f, - 0.427555093f, -0.903989293f, - 0.422000271f, -0.906595705f, - 0.416429560f, -0.909167983f, - 0.410843171f, -0.911706032f, - 0.405241314f, -0.914209756f, - 0.399624200f, -0.916679060f, - 0.393992040f, -0.919113852f, - 0.388345047f, -0.921514039f, - 0.382683432f, -0.923879533f, - 0.377007410f, -0.926210242f, - 0.371317194f, -0.928506080f, - 0.365612998f, -0.930766961f, - 0.359895037f, -0.932992799f, - 0.354163525f, -0.935183510f, - 0.348418680f, -0.937339012f, - 0.342660717f, -0.939459224f, - 0.336889853f, -0.941544065f, - 0.331106306f, -0.943593458f, - 0.325310292f, -0.945607325f, - 0.319502031f, -0.947585591f, - 0.313681740f, -0.949528181f, - 0.307849640f, -0.951435021f, - 0.302005949f, -0.953306040f, - 0.296150888f, -0.955141168f, - 0.290284677f, -0.956940336f, - 0.284407537f, -0.958703475f, - 0.278519689f, -0.960430519f, - 0.272621355f, -0.962121404f, - 0.266712757f, -0.963776066f, - 0.260794118f, -0.965394442f, - 0.254865660f, -0.966976471f, - 0.248927606f, -0.968522094f, - 0.242980180f, -0.970031253f, - 0.237023606f, -0.971503891f, - 0.231058108f, -0.972939952f, - 0.225083911f, -0.974339383f, - 0.219101240f, -0.975702130f, - 0.213110320f, -0.977028143f, - 0.207111376f, -0.978317371f, - 0.201104635f, -0.979569766f, - 0.195090322f, -0.980785280f, - 0.189068664f, -0.981963869f, - 0.183039888f, -0.983105487f, - 0.177004220f, -0.984210092f, - 0.170961889f, -0.985277642f, - 0.164913120f, -0.986308097f, - 0.158858143f, -0.987301418f, - 0.152797185f, -0.988257568f, - 0.146730474f, -0.989176510f, - 0.140658239f, -0.990058210f, - 0.134580709f, -0.990902635f, - 0.128498111f, -0.991709754f, - 0.122410675f, -0.992479535f, - 0.116318631f, -0.993211949f, - 0.110222207f, -0.993906970f, - 0.104121634f, -0.994564571f, - 0.098017140f, -0.995184727f, - 0.091908956f, -0.995767414f, - 0.085797312f, -0.996312612f, - 0.079682438f, -0.996820299f, - 0.073564564f, -0.997290457f, - 0.067443920f, -0.997723067f, - 0.061320736f, -0.998118113f, - 0.055195244f, -0.998475581f, - 0.049067674f, -0.998795456f, - 0.042938257f, -0.999077728f, - 0.036807223f, -0.999322385f, - 0.030674803f, -0.999529418f, - 0.024541229f, -0.999698819f, - 0.018406730f, -0.999830582f, - 0.012271538f, -0.999924702f, - 0.006135885f, -0.999981175f -}; - -const float32_t twiddleCoef_rfft_2048[2048] = { - 0.000000000f, 1.000000000f, - 0.003067957f, 0.999995294f, - 0.006135885f, 0.999981175f, - 0.009203755f, 0.999957645f, - 0.012271538f, 0.999924702f, - 0.015339206f, 0.999882347f, - 0.018406730f, 0.999830582f, - 0.021474080f, 0.999769405f, - 0.024541229f, 0.999698819f, - 0.027608146f, 0.999618822f, - 0.030674803f, 0.999529418f, - 0.033741172f, 0.999430605f, - 0.036807223f, 0.999322385f, - 0.039872928f, 0.999204759f, - 0.042938257f, 0.999077728f, - 0.046003182f, 0.998941293f, - 0.049067674f, 0.998795456f, - 0.052131705f, 0.998640218f, - 0.055195244f, 0.998475581f, - 0.058258265f, 0.998301545f, - 0.061320736f, 0.998118113f, - 0.064382631f, 0.997925286f, - 0.067443920f, 0.997723067f, - 0.070504573f, 0.997511456f, - 0.073564564f, 0.997290457f, - 0.076623861f, 0.997060070f, - 0.079682438f, 0.996820299f, - 0.082740265f, 0.996571146f, - 0.085797312f, 0.996312612f, - 0.088853553f, 0.996044701f, - 0.091908956f, 0.995767414f, - 0.094963495f, 0.995480755f, - 0.098017140f, 0.995184727f, - 0.101069863f, 0.994879331f, - 0.104121634f, 0.994564571f, - 0.107172425f, 0.994240449f, - 0.110222207f, 0.993906970f, - 0.113270952f, 0.993564136f, - 0.116318631f, 0.993211949f, - 0.119365215f, 0.992850414f, - 0.122410675f, 0.992479535f, - 0.125454983f, 0.992099313f, - 0.128498111f, 0.991709754f, - 0.131540029f, 0.991310860f, - 0.134580709f, 0.990902635f, - 0.137620122f, 0.990485084f, - 0.140658239f, 0.990058210f, - 0.143695033f, 0.989622017f, - 0.146730474f, 0.989176510f, - 0.149764535f, 0.988721692f, - 0.152797185f, 0.988257568f, - 0.155828398f, 0.987784142f, - 0.158858143f, 0.987301418f, - 0.161886394f, 0.986809402f, - 0.164913120f, 0.986308097f, - 0.167938295f, 0.985797509f, - 0.170961889f, 0.985277642f, - 0.173983873f, 0.984748502f, - 0.177004220f, 0.984210092f, - 0.180022901f, 0.983662419f, - 0.183039888f, 0.983105487f, - 0.186055152f, 0.982539302f, - 0.189068664f, 0.981963869f, - 0.192080397f, 0.981379193f, - 0.195090322f, 0.980785280f, - 0.198098411f, 0.980182136f, - 0.201104635f, 0.979569766f, - 0.204108966f, 0.978948175f, - 0.207111376f, 0.978317371f, - 0.210111837f, 0.977677358f, - 0.213110320f, 0.977028143f, - 0.216106797f, 0.976369731f, - 0.219101240f, 0.975702130f, - 0.222093621f, 0.975025345f, - 0.225083911f, 0.974339383f, - 0.228072083f, 0.973644250f, - 0.231058108f, 0.972939952f, - 0.234041959f, 0.972226497f, - 0.237023606f, 0.971503891f, - 0.240003022f, 0.970772141f, - 0.242980180f, 0.970031253f, - 0.245955050f, 0.969281235f, - 0.248927606f, 0.968522094f, - 0.251897818f, 0.967753837f, - 0.254865660f, 0.966976471f, - 0.257831102f, 0.966190003f, - 0.260794118f, 0.965394442f, - 0.263754679f, 0.964589793f, - 0.266712757f, 0.963776066f, - 0.269668326f, 0.962953267f, - 0.272621355f, 0.962121404f, - 0.275571819f, 0.961280486f, - 0.278519689f, 0.960430519f, - 0.281464938f, 0.959571513f, - 0.284407537f, 0.958703475f, - 0.287347460f, 0.957826413f, - 0.290284677f, 0.956940336f, - 0.293219163f, 0.956045251f, - 0.296150888f, 0.955141168f, - 0.299079826f, 0.954228095f, - 0.302005949f, 0.953306040f, - 0.304929230f, 0.952375013f, - 0.307849640f, 0.951435021f, - 0.310767153f, 0.950486074f, - 0.313681740f, 0.949528181f, - 0.316593376f, 0.948561350f, - 0.319502031f, 0.947585591f, - 0.322407679f, 0.946600913f, - 0.325310292f, 0.945607325f, - 0.328209844f, 0.944604837f, - 0.331106306f, 0.943593458f, - 0.333999651f, 0.942573198f, - 0.336889853f, 0.941544065f, - 0.339776884f, 0.940506071f, - 0.342660717f, 0.939459224f, - 0.345541325f, 0.938403534f, - 0.348418680f, 0.937339012f, - 0.351292756f, 0.936265667f, - 0.354163525f, 0.935183510f, - 0.357030961f, 0.934092550f, - 0.359895037f, 0.932992799f, - 0.362755724f, 0.931884266f, - 0.365612998f, 0.930766961f, - 0.368466830f, 0.929640896f, - 0.371317194f, 0.928506080f, - 0.374164063f, 0.927362526f, - 0.377007410f, 0.926210242f, - 0.379847209f, 0.925049241f, - 0.382683432f, 0.923879533f, - 0.385516054f, 0.922701128f, - 0.388345047f, 0.921514039f, - 0.391170384f, 0.920318277f, - 0.393992040f, 0.919113852f, - 0.396809987f, 0.917900776f, - 0.399624200f, 0.916679060f, - 0.402434651f, 0.915448716f, - 0.405241314f, 0.914209756f, - 0.408044163f, 0.912962190f, - 0.410843171f, 0.911706032f, - 0.413638312f, 0.910441292f, - 0.416429560f, 0.909167983f, - 0.419216888f, 0.907886116f, - 0.422000271f, 0.906595705f, - 0.424779681f, 0.905296759f, - 0.427555093f, 0.903989293f, - 0.430326481f, 0.902673318f, - 0.433093819f, 0.901348847f, - 0.435857080f, 0.900015892f, - 0.438616239f, 0.898674466f, - 0.441371269f, 0.897324581f, - 0.444122145f, 0.895966250f, - 0.446868840f, 0.894599486f, - 0.449611330f, 0.893224301f, - 0.452349587f, 0.891840709f, - 0.455083587f, 0.890448723f, - 0.457813304f, 0.889048356f, - 0.460538711f, 0.887639620f, - 0.463259784f, 0.886222530f, - 0.465976496f, 0.884797098f, - 0.468688822f, 0.883363339f, - 0.471396737f, 0.881921264f, - 0.474100215f, 0.880470889f, - 0.476799230f, 0.879012226f, - 0.479493758f, 0.877545290f, - 0.482183772f, 0.876070094f, - 0.484869248f, 0.874586652f, - 0.487550160f, 0.873094978f, - 0.490226483f, 0.871595087f, - 0.492898192f, 0.870086991f, - 0.495565262f, 0.868570706f, - 0.498227667f, 0.867046246f, - 0.500885383f, 0.865513624f, - 0.503538384f, 0.863972856f, - 0.506186645f, 0.862423956f, - 0.508830143f, 0.860866939f, - 0.511468850f, 0.859301818f, - 0.514102744f, 0.857728610f, - 0.516731799f, 0.856147328f, - 0.519355990f, 0.854557988f, - 0.521975293f, 0.852960605f, - 0.524589683f, 0.851355193f, - 0.527199135f, 0.849741768f, - 0.529803625f, 0.848120345f, - 0.532403128f, 0.846490939f, - 0.534997620f, 0.844853565f, - 0.537587076f, 0.843208240f, - 0.540171473f, 0.841554977f, - 0.542750785f, 0.839893794f, - 0.545324988f, 0.838224706f, - 0.547894059f, 0.836547727f, - 0.550457973f, 0.834862875f, - 0.553016706f, 0.833170165f, - 0.555570233f, 0.831469612f, - 0.558118531f, 0.829761234f, - 0.560661576f, 0.828045045f, - 0.563199344f, 0.826321063f, - 0.565731811f, 0.824589303f, - 0.568258953f, 0.822849781f, - 0.570780746f, 0.821102515f, - 0.573297167f, 0.819347520f, - 0.575808191f, 0.817584813f, - 0.578313796f, 0.815814411f, - 0.580813958f, 0.814036330f, - 0.583308653f, 0.812250587f, - 0.585797857f, 0.810457198f, - 0.588281548f, 0.808656182f, - 0.590759702f, 0.806847554f, - 0.593232295f, 0.805031331f, - 0.595699304f, 0.803207531f, - 0.598160707f, 0.801376172f, - 0.600616479f, 0.799537269f, - 0.603066599f, 0.797690841f, - 0.605511041f, 0.795836905f, - 0.607949785f, 0.793975478f, - 0.610382806f, 0.792106577f, - 0.612810082f, 0.790230221f, - 0.615231591f, 0.788346428f, - 0.617647308f, 0.786455214f, - 0.620057212f, 0.784556597f, - 0.622461279f, 0.782650596f, - 0.624859488f, 0.780737229f, - 0.627251815f, 0.778816512f, - 0.629638239f, 0.776888466f, - 0.632018736f, 0.774953107f, - 0.634393284f, 0.773010453f, - 0.636761861f, 0.771060524f, - 0.639124445f, 0.769103338f, - 0.641481013f, 0.767138912f, - 0.643831543f, 0.765167266f, - 0.646176013f, 0.763188417f, - 0.648514401f, 0.761202385f, - 0.650846685f, 0.759209189f, - 0.653172843f, 0.757208847f, - 0.655492853f, 0.755201377f, - 0.657806693f, 0.753186799f, - 0.660114342f, 0.751165132f, - 0.662415778f, 0.749136395f, - 0.664710978f, 0.747100606f, - 0.666999922f, 0.745057785f, - 0.669282588f, 0.743007952f, - 0.671558955f, 0.740951125f, - 0.673829000f, 0.738887324f, - 0.676092704f, 0.736816569f, - 0.678350043f, 0.734738878f, - 0.680600998f, 0.732654272f, - 0.682845546f, 0.730562769f, - 0.685083668f, 0.728464390f, - 0.687315341f, 0.726359155f, - 0.689540545f, 0.724247083f, - 0.691759258f, 0.722128194f, - 0.693971461f, 0.720002508f, - 0.696177131f, 0.717870045f, - 0.698376249f, 0.715730825f, - 0.700568794f, 0.713584869f, - 0.702754744f, 0.711432196f, - 0.704934080f, 0.709272826f, - 0.707106781f, 0.707106781f, - 0.709272826f, 0.704934080f, - 0.711432196f, 0.702754744f, - 0.713584869f, 0.700568794f, - 0.715730825f, 0.698376249f, - 0.717870045f, 0.696177131f, - 0.720002508f, 0.693971461f, - 0.722128194f, 0.691759258f, - 0.724247083f, 0.689540545f, - 0.726359155f, 0.687315341f, - 0.728464390f, 0.685083668f, - 0.730562769f, 0.682845546f, - 0.732654272f, 0.680600998f, - 0.734738878f, 0.678350043f, - 0.736816569f, 0.676092704f, - 0.738887324f, 0.673829000f, - 0.740951125f, 0.671558955f, - 0.743007952f, 0.669282588f, - 0.745057785f, 0.666999922f, - 0.747100606f, 0.664710978f, - 0.749136395f, 0.662415778f, - 0.751165132f, 0.660114342f, - 0.753186799f, 0.657806693f, - 0.755201377f, 0.655492853f, - 0.757208847f, 0.653172843f, - 0.759209189f, 0.650846685f, - 0.761202385f, 0.648514401f, - 0.763188417f, 0.646176013f, - 0.765167266f, 0.643831543f, - 0.767138912f, 0.641481013f, - 0.769103338f, 0.639124445f, - 0.771060524f, 0.636761861f, - 0.773010453f, 0.634393284f, - 0.774953107f, 0.632018736f, - 0.776888466f, 0.629638239f, - 0.778816512f, 0.627251815f, - 0.780737229f, 0.624859488f, - 0.782650596f, 0.622461279f, - 0.784556597f, 0.620057212f, - 0.786455214f, 0.617647308f, - 0.788346428f, 0.615231591f, - 0.790230221f, 0.612810082f, - 0.792106577f, 0.610382806f, - 0.793975478f, 0.607949785f, - 0.795836905f, 0.605511041f, - 0.797690841f, 0.603066599f, - 0.799537269f, 0.600616479f, - 0.801376172f, 0.598160707f, - 0.803207531f, 0.595699304f, - 0.805031331f, 0.593232295f, - 0.806847554f, 0.590759702f, - 0.808656182f, 0.588281548f, - 0.810457198f, 0.585797857f, - 0.812250587f, 0.583308653f, - 0.814036330f, 0.580813958f, - 0.815814411f, 0.578313796f, - 0.817584813f, 0.575808191f, - 0.819347520f, 0.573297167f, - 0.821102515f, 0.570780746f, - 0.822849781f, 0.568258953f, - 0.824589303f, 0.565731811f, - 0.826321063f, 0.563199344f, - 0.828045045f, 0.560661576f, - 0.829761234f, 0.558118531f, - 0.831469612f, 0.555570233f, - 0.833170165f, 0.553016706f, - 0.834862875f, 0.550457973f, - 0.836547727f, 0.547894059f, - 0.838224706f, 0.545324988f, - 0.839893794f, 0.542750785f, - 0.841554977f, 0.540171473f, - 0.843208240f, 0.537587076f, - 0.844853565f, 0.534997620f, - 0.846490939f, 0.532403128f, - 0.848120345f, 0.529803625f, - 0.849741768f, 0.527199135f, - 0.851355193f, 0.524589683f, - 0.852960605f, 0.521975293f, - 0.854557988f, 0.519355990f, - 0.856147328f, 0.516731799f, - 0.857728610f, 0.514102744f, - 0.859301818f, 0.511468850f, - 0.860866939f, 0.508830143f, - 0.862423956f, 0.506186645f, - 0.863972856f, 0.503538384f, - 0.865513624f, 0.500885383f, - 0.867046246f, 0.498227667f, - 0.868570706f, 0.495565262f, - 0.870086991f, 0.492898192f, - 0.871595087f, 0.490226483f, - 0.873094978f, 0.487550160f, - 0.874586652f, 0.484869248f, - 0.876070094f, 0.482183772f, - 0.877545290f, 0.479493758f, - 0.879012226f, 0.476799230f, - 0.880470889f, 0.474100215f, - 0.881921264f, 0.471396737f, - 0.883363339f, 0.468688822f, - 0.884797098f, 0.465976496f, - 0.886222530f, 0.463259784f, - 0.887639620f, 0.460538711f, - 0.889048356f, 0.457813304f, - 0.890448723f, 0.455083587f, - 0.891840709f, 0.452349587f, - 0.893224301f, 0.449611330f, - 0.894599486f, 0.446868840f, - 0.895966250f, 0.444122145f, - 0.897324581f, 0.441371269f, - 0.898674466f, 0.438616239f, - 0.900015892f, 0.435857080f, - 0.901348847f, 0.433093819f, - 0.902673318f, 0.430326481f, - 0.903989293f, 0.427555093f, - 0.905296759f, 0.424779681f, - 0.906595705f, 0.422000271f, - 0.907886116f, 0.419216888f, - 0.909167983f, 0.416429560f, - 0.910441292f, 0.413638312f, - 0.911706032f, 0.410843171f, - 0.912962190f, 0.408044163f, - 0.914209756f, 0.405241314f, - 0.915448716f, 0.402434651f, - 0.916679060f, 0.399624200f, - 0.917900776f, 0.396809987f, - 0.919113852f, 0.393992040f, - 0.920318277f, 0.391170384f, - 0.921514039f, 0.388345047f, - 0.922701128f, 0.385516054f, - 0.923879533f, 0.382683432f, - 0.925049241f, 0.379847209f, - 0.926210242f, 0.377007410f, - 0.927362526f, 0.374164063f, - 0.928506080f, 0.371317194f, - 0.929640896f, 0.368466830f, - 0.930766961f, 0.365612998f, - 0.931884266f, 0.362755724f, - 0.932992799f, 0.359895037f, - 0.934092550f, 0.357030961f, - 0.935183510f, 0.354163525f, - 0.936265667f, 0.351292756f, - 0.937339012f, 0.348418680f, - 0.938403534f, 0.345541325f, - 0.939459224f, 0.342660717f, - 0.940506071f, 0.339776884f, - 0.941544065f, 0.336889853f, - 0.942573198f, 0.333999651f, - 0.943593458f, 0.331106306f, - 0.944604837f, 0.328209844f, - 0.945607325f, 0.325310292f, - 0.946600913f, 0.322407679f, - 0.947585591f, 0.319502031f, - 0.948561350f, 0.316593376f, - 0.949528181f, 0.313681740f, - 0.950486074f, 0.310767153f, - 0.951435021f, 0.307849640f, - 0.952375013f, 0.304929230f, - 0.953306040f, 0.302005949f, - 0.954228095f, 0.299079826f, - 0.955141168f, 0.296150888f, - 0.956045251f, 0.293219163f, - 0.956940336f, 0.290284677f, - 0.957826413f, 0.287347460f, - 0.958703475f, 0.284407537f, - 0.959571513f, 0.281464938f, - 0.960430519f, 0.278519689f, - 0.961280486f, 0.275571819f, - 0.962121404f, 0.272621355f, - 0.962953267f, 0.269668326f, - 0.963776066f, 0.266712757f, - 0.964589793f, 0.263754679f, - 0.965394442f, 0.260794118f, - 0.966190003f, 0.257831102f, - 0.966976471f, 0.254865660f, - 0.967753837f, 0.251897818f, - 0.968522094f, 0.248927606f, - 0.969281235f, 0.245955050f, - 0.970031253f, 0.242980180f, - 0.970772141f, 0.240003022f, - 0.971503891f, 0.237023606f, - 0.972226497f, 0.234041959f, - 0.972939952f, 0.231058108f, - 0.973644250f, 0.228072083f, - 0.974339383f, 0.225083911f, - 0.975025345f, 0.222093621f, - 0.975702130f, 0.219101240f, - 0.976369731f, 0.216106797f, - 0.977028143f, 0.213110320f, - 0.977677358f, 0.210111837f, - 0.978317371f, 0.207111376f, - 0.978948175f, 0.204108966f, - 0.979569766f, 0.201104635f, - 0.980182136f, 0.198098411f, - 0.980785280f, 0.195090322f, - 0.981379193f, 0.192080397f, - 0.981963869f, 0.189068664f, - 0.982539302f, 0.186055152f, - 0.983105487f, 0.183039888f, - 0.983662419f, 0.180022901f, - 0.984210092f, 0.177004220f, - 0.984748502f, 0.173983873f, - 0.985277642f, 0.170961889f, - 0.985797509f, 0.167938295f, - 0.986308097f, 0.164913120f, - 0.986809402f, 0.161886394f, - 0.987301418f, 0.158858143f, - 0.987784142f, 0.155828398f, - 0.988257568f, 0.152797185f, - 0.988721692f, 0.149764535f, - 0.989176510f, 0.146730474f, - 0.989622017f, 0.143695033f, - 0.990058210f, 0.140658239f, - 0.990485084f, 0.137620122f, - 0.990902635f, 0.134580709f, - 0.991310860f, 0.131540029f, - 0.991709754f, 0.128498111f, - 0.992099313f, 0.125454983f, - 0.992479535f, 0.122410675f, - 0.992850414f, 0.119365215f, - 0.993211949f, 0.116318631f, - 0.993564136f, 0.113270952f, - 0.993906970f, 0.110222207f, - 0.994240449f, 0.107172425f, - 0.994564571f, 0.104121634f, - 0.994879331f, 0.101069863f, - 0.995184727f, 0.098017140f, - 0.995480755f, 0.094963495f, - 0.995767414f, 0.091908956f, - 0.996044701f, 0.088853553f, - 0.996312612f, 0.085797312f, - 0.996571146f, 0.082740265f, - 0.996820299f, 0.079682438f, - 0.997060070f, 0.076623861f, - 0.997290457f, 0.073564564f, - 0.997511456f, 0.070504573f, - 0.997723067f, 0.067443920f, - 0.997925286f, 0.064382631f, - 0.998118113f, 0.061320736f, - 0.998301545f, 0.058258265f, - 0.998475581f, 0.055195244f, - 0.998640218f, 0.052131705f, - 0.998795456f, 0.049067674f, - 0.998941293f, 0.046003182f, - 0.999077728f, 0.042938257f, - 0.999204759f, 0.039872928f, - 0.999322385f, 0.036807223f, - 0.999430605f, 0.033741172f, - 0.999529418f, 0.030674803f, - 0.999618822f, 0.027608146f, - 0.999698819f, 0.024541229f, - 0.999769405f, 0.021474080f, - 0.999830582f, 0.018406730f, - 0.999882347f, 0.015339206f, - 0.999924702f, 0.012271538f, - 0.999957645f, 0.009203755f, - 0.999981175f, 0.006135885f, - 0.999995294f, 0.003067957f, - 1.000000000f, 0.000000000f, - 0.999995294f, -0.003067957f, - 0.999981175f, -0.006135885f, - 0.999957645f, -0.009203755f, - 0.999924702f, -0.012271538f, - 0.999882347f, -0.015339206f, - 0.999830582f, -0.018406730f, - 0.999769405f, -0.021474080f, - 0.999698819f, -0.024541229f, - 0.999618822f, -0.027608146f, - 0.999529418f, -0.030674803f, - 0.999430605f, -0.033741172f, - 0.999322385f, -0.036807223f, - 0.999204759f, -0.039872928f, - 0.999077728f, -0.042938257f, - 0.998941293f, -0.046003182f, - 0.998795456f, -0.049067674f, - 0.998640218f, -0.052131705f, - 0.998475581f, -0.055195244f, - 0.998301545f, -0.058258265f, - 0.998118113f, -0.061320736f, - 0.997925286f, -0.064382631f, - 0.997723067f, -0.067443920f, - 0.997511456f, -0.070504573f, - 0.997290457f, -0.073564564f, - 0.997060070f, -0.076623861f, - 0.996820299f, -0.079682438f, - 0.996571146f, -0.082740265f, - 0.996312612f, -0.085797312f, - 0.996044701f, -0.088853553f, - 0.995767414f, -0.091908956f, - 0.995480755f, -0.094963495f, - 0.995184727f, -0.098017140f, - 0.994879331f, -0.101069863f, - 0.994564571f, -0.104121634f, - 0.994240449f, -0.107172425f, - 0.993906970f, -0.110222207f, - 0.993564136f, -0.113270952f, - 0.993211949f, -0.116318631f, - 0.992850414f, -0.119365215f, - 0.992479535f, -0.122410675f, - 0.992099313f, -0.125454983f, - 0.991709754f, -0.128498111f, - 0.991310860f, -0.131540029f, - 0.990902635f, -0.134580709f, - 0.990485084f, -0.137620122f, - 0.990058210f, -0.140658239f, - 0.989622017f, -0.143695033f, - 0.989176510f, -0.146730474f, - 0.988721692f, -0.149764535f, - 0.988257568f, -0.152797185f, - 0.987784142f, -0.155828398f, - 0.987301418f, -0.158858143f, - 0.986809402f, -0.161886394f, - 0.986308097f, -0.164913120f, - 0.985797509f, -0.167938295f, - 0.985277642f, -0.170961889f, - 0.984748502f, -0.173983873f, - 0.984210092f, -0.177004220f, - 0.983662419f, -0.180022901f, - 0.983105487f, -0.183039888f, - 0.982539302f, -0.186055152f, - 0.981963869f, -0.189068664f, - 0.981379193f, -0.192080397f, - 0.980785280f, -0.195090322f, - 0.980182136f, -0.198098411f, - 0.979569766f, -0.201104635f, - 0.978948175f, -0.204108966f, - 0.978317371f, -0.207111376f, - 0.977677358f, -0.210111837f, - 0.977028143f, -0.213110320f, - 0.976369731f, -0.216106797f, - 0.975702130f, -0.219101240f, - 0.975025345f, -0.222093621f, - 0.974339383f, -0.225083911f, - 0.973644250f, -0.228072083f, - 0.972939952f, -0.231058108f, - 0.972226497f, -0.234041959f, - 0.971503891f, -0.237023606f, - 0.970772141f, -0.240003022f, - 0.970031253f, -0.242980180f, - 0.969281235f, -0.245955050f, - 0.968522094f, -0.248927606f, - 0.967753837f, -0.251897818f, - 0.966976471f, -0.254865660f, - 0.966190003f, -0.257831102f, - 0.965394442f, -0.260794118f, - 0.964589793f, -0.263754679f, - 0.963776066f, -0.266712757f, - 0.962953267f, -0.269668326f, - 0.962121404f, -0.272621355f, - 0.961280486f, -0.275571819f, - 0.960430519f, -0.278519689f, - 0.959571513f, -0.281464938f, - 0.958703475f, -0.284407537f, - 0.957826413f, -0.287347460f, - 0.956940336f, -0.290284677f, - 0.956045251f, -0.293219163f, - 0.955141168f, -0.296150888f, - 0.954228095f, -0.299079826f, - 0.953306040f, -0.302005949f, - 0.952375013f, -0.304929230f, - 0.951435021f, -0.307849640f, - 0.950486074f, -0.310767153f, - 0.949528181f, -0.313681740f, - 0.948561350f, -0.316593376f, - 0.947585591f, -0.319502031f, - 0.946600913f, -0.322407679f, - 0.945607325f, -0.325310292f, - 0.944604837f, -0.328209844f, - 0.943593458f, -0.331106306f, - 0.942573198f, -0.333999651f, - 0.941544065f, -0.336889853f, - 0.940506071f, -0.339776884f, - 0.939459224f, -0.342660717f, - 0.938403534f, -0.345541325f, - 0.937339012f, -0.348418680f, - 0.936265667f, -0.351292756f, - 0.935183510f, -0.354163525f, - 0.934092550f, -0.357030961f, - 0.932992799f, -0.359895037f, - 0.931884266f, -0.362755724f, - 0.930766961f, -0.365612998f, - 0.929640896f, -0.368466830f, - 0.928506080f, -0.371317194f, - 0.927362526f, -0.374164063f, - 0.926210242f, -0.377007410f, - 0.925049241f, -0.379847209f, - 0.923879533f, -0.382683432f, - 0.922701128f, -0.385516054f, - 0.921514039f, -0.388345047f, - 0.920318277f, -0.391170384f, - 0.919113852f, -0.393992040f, - 0.917900776f, -0.396809987f, - 0.916679060f, -0.399624200f, - 0.915448716f, -0.402434651f, - 0.914209756f, -0.405241314f, - 0.912962190f, -0.408044163f, - 0.911706032f, -0.410843171f, - 0.910441292f, -0.413638312f, - 0.909167983f, -0.416429560f, - 0.907886116f, -0.419216888f, - 0.906595705f, -0.422000271f, - 0.905296759f, -0.424779681f, - 0.903989293f, -0.427555093f, - 0.902673318f, -0.430326481f, - 0.901348847f, -0.433093819f, - 0.900015892f, -0.435857080f, - 0.898674466f, -0.438616239f, - 0.897324581f, -0.441371269f, - 0.895966250f, -0.444122145f, - 0.894599486f, -0.446868840f, - 0.893224301f, -0.449611330f, - 0.891840709f, -0.452349587f, - 0.890448723f, -0.455083587f, - 0.889048356f, -0.457813304f, - 0.887639620f, -0.460538711f, - 0.886222530f, -0.463259784f, - 0.884797098f, -0.465976496f, - 0.883363339f, -0.468688822f, - 0.881921264f, -0.471396737f, - 0.880470889f, -0.474100215f, - 0.879012226f, -0.476799230f, - 0.877545290f, -0.479493758f, - 0.876070094f, -0.482183772f, - 0.874586652f, -0.484869248f, - 0.873094978f, -0.487550160f, - 0.871595087f, -0.490226483f, - 0.870086991f, -0.492898192f, - 0.868570706f, -0.495565262f, - 0.867046246f, -0.498227667f, - 0.865513624f, -0.500885383f, - 0.863972856f, -0.503538384f, - 0.862423956f, -0.506186645f, - 0.860866939f, -0.508830143f, - 0.859301818f, -0.511468850f, - 0.857728610f, -0.514102744f, - 0.856147328f, -0.516731799f, - 0.854557988f, -0.519355990f, - 0.852960605f, -0.521975293f, - 0.851355193f, -0.524589683f, - 0.849741768f, -0.527199135f, - 0.848120345f, -0.529803625f, - 0.846490939f, -0.532403128f, - 0.844853565f, -0.534997620f, - 0.843208240f, -0.537587076f, - 0.841554977f, -0.540171473f, - 0.839893794f, -0.542750785f, - 0.838224706f, -0.545324988f, - 0.836547727f, -0.547894059f, - 0.834862875f, -0.550457973f, - 0.833170165f, -0.553016706f, - 0.831469612f, -0.555570233f, - 0.829761234f, -0.558118531f, - 0.828045045f, -0.560661576f, - 0.826321063f, -0.563199344f, - 0.824589303f, -0.565731811f, - 0.822849781f, -0.568258953f, - 0.821102515f, -0.570780746f, - 0.819347520f, -0.573297167f, - 0.817584813f, -0.575808191f, - 0.815814411f, -0.578313796f, - 0.814036330f, -0.580813958f, - 0.812250587f, -0.583308653f, - 0.810457198f, -0.585797857f, - 0.808656182f, -0.588281548f, - 0.806847554f, -0.590759702f, - 0.805031331f, -0.593232295f, - 0.803207531f, -0.595699304f, - 0.801376172f, -0.598160707f, - 0.799537269f, -0.600616479f, - 0.797690841f, -0.603066599f, - 0.795836905f, -0.605511041f, - 0.793975478f, -0.607949785f, - 0.792106577f, -0.610382806f, - 0.790230221f, -0.612810082f, - 0.788346428f, -0.615231591f, - 0.786455214f, -0.617647308f, - 0.784556597f, -0.620057212f, - 0.782650596f, -0.622461279f, - 0.780737229f, -0.624859488f, - 0.778816512f, -0.627251815f, - 0.776888466f, -0.629638239f, - 0.774953107f, -0.632018736f, - 0.773010453f, -0.634393284f, - 0.771060524f, -0.636761861f, - 0.769103338f, -0.639124445f, - 0.767138912f, -0.641481013f, - 0.765167266f, -0.643831543f, - 0.763188417f, -0.646176013f, - 0.761202385f, -0.648514401f, - 0.759209189f, -0.650846685f, - 0.757208847f, -0.653172843f, - 0.755201377f, -0.655492853f, - 0.753186799f, -0.657806693f, - 0.751165132f, -0.660114342f, - 0.749136395f, -0.662415778f, - 0.747100606f, -0.664710978f, - 0.745057785f, -0.666999922f, - 0.743007952f, -0.669282588f, - 0.740951125f, -0.671558955f, - 0.738887324f, -0.673829000f, - 0.736816569f, -0.676092704f, - 0.734738878f, -0.678350043f, - 0.732654272f, -0.680600998f, - 0.730562769f, -0.682845546f, - 0.728464390f, -0.685083668f, - 0.726359155f, -0.687315341f, - 0.724247083f, -0.689540545f, - 0.722128194f, -0.691759258f, - 0.720002508f, -0.693971461f, - 0.717870045f, -0.696177131f, - 0.715730825f, -0.698376249f, - 0.713584869f, -0.700568794f, - 0.711432196f, -0.702754744f, - 0.709272826f, -0.704934080f, - 0.707106781f, -0.707106781f, - 0.704934080f, -0.709272826f, - 0.702754744f, -0.711432196f, - 0.700568794f, -0.713584869f, - 0.698376249f, -0.715730825f, - 0.696177131f, -0.717870045f, - 0.693971461f, -0.720002508f, - 0.691759258f, -0.722128194f, - 0.689540545f, -0.724247083f, - 0.687315341f, -0.726359155f, - 0.685083668f, -0.728464390f, - 0.682845546f, -0.730562769f, - 0.680600998f, -0.732654272f, - 0.678350043f, -0.734738878f, - 0.676092704f, -0.736816569f, - 0.673829000f, -0.738887324f, - 0.671558955f, -0.740951125f, - 0.669282588f, -0.743007952f, - 0.666999922f, -0.745057785f, - 0.664710978f, -0.747100606f, - 0.662415778f, -0.749136395f, - 0.660114342f, -0.751165132f, - 0.657806693f, -0.753186799f, - 0.655492853f, -0.755201377f, - 0.653172843f, -0.757208847f, - 0.650846685f, -0.759209189f, - 0.648514401f, -0.761202385f, - 0.646176013f, -0.763188417f, - 0.643831543f, -0.765167266f, - 0.641481013f, -0.767138912f, - 0.639124445f, -0.769103338f, - 0.636761861f, -0.771060524f, - 0.634393284f, -0.773010453f, - 0.632018736f, -0.774953107f, - 0.629638239f, -0.776888466f, - 0.627251815f, -0.778816512f, - 0.624859488f, -0.780737229f, - 0.622461279f, -0.782650596f, - 0.620057212f, -0.784556597f, - 0.617647308f, -0.786455214f, - 0.615231591f, -0.788346428f, - 0.612810082f, -0.790230221f, - 0.610382806f, -0.792106577f, - 0.607949785f, -0.793975478f, - 0.605511041f, -0.795836905f, - 0.603066599f, -0.797690841f, - 0.600616479f, -0.799537269f, - 0.598160707f, -0.801376172f, - 0.595699304f, -0.803207531f, - 0.593232295f, -0.805031331f, - 0.590759702f, -0.806847554f, - 0.588281548f, -0.808656182f, - 0.585797857f, -0.810457198f, - 0.583308653f, -0.812250587f, - 0.580813958f, -0.814036330f, - 0.578313796f, -0.815814411f, - 0.575808191f, -0.817584813f, - 0.573297167f, -0.819347520f, - 0.570780746f, -0.821102515f, - 0.568258953f, -0.822849781f, - 0.565731811f, -0.824589303f, - 0.563199344f, -0.826321063f, - 0.560661576f, -0.828045045f, - 0.558118531f, -0.829761234f, - 0.555570233f, -0.831469612f, - 0.553016706f, -0.833170165f, - 0.550457973f, -0.834862875f, - 0.547894059f, -0.836547727f, - 0.545324988f, -0.838224706f, - 0.542750785f, -0.839893794f, - 0.540171473f, -0.841554977f, - 0.537587076f, -0.843208240f, - 0.534997620f, -0.844853565f, - 0.532403128f, -0.846490939f, - 0.529803625f, -0.848120345f, - 0.527199135f, -0.849741768f, - 0.524589683f, -0.851355193f, - 0.521975293f, -0.852960605f, - 0.519355990f, -0.854557988f, - 0.516731799f, -0.856147328f, - 0.514102744f, -0.857728610f, - 0.511468850f, -0.859301818f, - 0.508830143f, -0.860866939f, - 0.506186645f, -0.862423956f, - 0.503538384f, -0.863972856f, - 0.500885383f, -0.865513624f, - 0.498227667f, -0.867046246f, - 0.495565262f, -0.868570706f, - 0.492898192f, -0.870086991f, - 0.490226483f, -0.871595087f, - 0.487550160f, -0.873094978f, - 0.484869248f, -0.874586652f, - 0.482183772f, -0.876070094f, - 0.479493758f, -0.877545290f, - 0.476799230f, -0.879012226f, - 0.474100215f, -0.880470889f, - 0.471396737f, -0.881921264f, - 0.468688822f, -0.883363339f, - 0.465976496f, -0.884797098f, - 0.463259784f, -0.886222530f, - 0.460538711f, -0.887639620f, - 0.457813304f, -0.889048356f, - 0.455083587f, -0.890448723f, - 0.452349587f, -0.891840709f, - 0.449611330f, -0.893224301f, - 0.446868840f, -0.894599486f, - 0.444122145f, -0.895966250f, - 0.441371269f, -0.897324581f, - 0.438616239f, -0.898674466f, - 0.435857080f, -0.900015892f, - 0.433093819f, -0.901348847f, - 0.430326481f, -0.902673318f, - 0.427555093f, -0.903989293f, - 0.424779681f, -0.905296759f, - 0.422000271f, -0.906595705f, - 0.419216888f, -0.907886116f, - 0.416429560f, -0.909167983f, - 0.413638312f, -0.910441292f, - 0.410843171f, -0.911706032f, - 0.408044163f, -0.912962190f, - 0.405241314f, -0.914209756f, - 0.402434651f, -0.915448716f, - 0.399624200f, -0.916679060f, - 0.396809987f, -0.917900776f, - 0.393992040f, -0.919113852f, - 0.391170384f, -0.920318277f, - 0.388345047f, -0.921514039f, - 0.385516054f, -0.922701128f, - 0.382683432f, -0.923879533f, - 0.379847209f, -0.925049241f, - 0.377007410f, -0.926210242f, - 0.374164063f, -0.927362526f, - 0.371317194f, -0.928506080f, - 0.368466830f, -0.929640896f, - 0.365612998f, -0.930766961f, - 0.362755724f, -0.931884266f, - 0.359895037f, -0.932992799f, - 0.357030961f, -0.934092550f, - 0.354163525f, -0.935183510f, - 0.351292756f, -0.936265667f, - 0.348418680f, -0.937339012f, - 0.345541325f, -0.938403534f, - 0.342660717f, -0.939459224f, - 0.339776884f, -0.940506071f, - 0.336889853f, -0.941544065f, - 0.333999651f, -0.942573198f, - 0.331106306f, -0.943593458f, - 0.328209844f, -0.944604837f, - 0.325310292f, -0.945607325f, - 0.322407679f, -0.946600913f, - 0.319502031f, -0.947585591f, - 0.316593376f, -0.948561350f, - 0.313681740f, -0.949528181f, - 0.310767153f, -0.950486074f, - 0.307849640f, -0.951435021f, - 0.304929230f, -0.952375013f, - 0.302005949f, -0.953306040f, - 0.299079826f, -0.954228095f, - 0.296150888f, -0.955141168f, - 0.293219163f, -0.956045251f, - 0.290284677f, -0.956940336f, - 0.287347460f, -0.957826413f, - 0.284407537f, -0.958703475f, - 0.281464938f, -0.959571513f, - 0.278519689f, -0.960430519f, - 0.275571819f, -0.961280486f, - 0.272621355f, -0.962121404f, - 0.269668326f, -0.962953267f, - 0.266712757f, -0.963776066f, - 0.263754679f, -0.964589793f, - 0.260794118f, -0.965394442f, - 0.257831102f, -0.966190003f, - 0.254865660f, -0.966976471f, - 0.251897818f, -0.967753837f, - 0.248927606f, -0.968522094f, - 0.245955050f, -0.969281235f, - 0.242980180f, -0.970031253f, - 0.240003022f, -0.970772141f, - 0.237023606f, -0.971503891f, - 0.234041959f, -0.972226497f, - 0.231058108f, -0.972939952f, - 0.228072083f, -0.973644250f, - 0.225083911f, -0.974339383f, - 0.222093621f, -0.975025345f, - 0.219101240f, -0.975702130f, - 0.216106797f, -0.976369731f, - 0.213110320f, -0.977028143f, - 0.210111837f, -0.977677358f, - 0.207111376f, -0.978317371f, - 0.204108966f, -0.978948175f, - 0.201104635f, -0.979569766f, - 0.198098411f, -0.980182136f, - 0.195090322f, -0.980785280f, - 0.192080397f, -0.981379193f, - 0.189068664f, -0.981963869f, - 0.186055152f, -0.982539302f, - 0.183039888f, -0.983105487f, - 0.180022901f, -0.983662419f, - 0.177004220f, -0.984210092f, - 0.173983873f, -0.984748502f, - 0.170961889f, -0.985277642f, - 0.167938295f, -0.985797509f, - 0.164913120f, -0.986308097f, - 0.161886394f, -0.986809402f, - 0.158858143f, -0.987301418f, - 0.155828398f, -0.987784142f, - 0.152797185f, -0.988257568f, - 0.149764535f, -0.988721692f, - 0.146730474f, -0.989176510f, - 0.143695033f, -0.989622017f, - 0.140658239f, -0.990058210f, - 0.137620122f, -0.990485084f, - 0.134580709f, -0.990902635f, - 0.131540029f, -0.991310860f, - 0.128498111f, -0.991709754f, - 0.125454983f, -0.992099313f, - 0.122410675f, -0.992479535f, - 0.119365215f, -0.992850414f, - 0.116318631f, -0.993211949f, - 0.113270952f, -0.993564136f, - 0.110222207f, -0.993906970f, - 0.107172425f, -0.994240449f, - 0.104121634f, -0.994564571f, - 0.101069863f, -0.994879331f, - 0.098017140f, -0.995184727f, - 0.094963495f, -0.995480755f, - 0.091908956f, -0.995767414f, - 0.088853553f, -0.996044701f, - 0.085797312f, -0.996312612f, - 0.082740265f, -0.996571146f, - 0.079682438f, -0.996820299f, - 0.076623861f, -0.997060070f, - 0.073564564f, -0.997290457f, - 0.070504573f, -0.997511456f, - 0.067443920f, -0.997723067f, - 0.064382631f, -0.997925286f, - 0.061320736f, -0.998118113f, - 0.058258265f, -0.998301545f, - 0.055195244f, -0.998475581f, - 0.052131705f, -0.998640218f, - 0.049067674f, -0.998795456f, - 0.046003182f, -0.998941293f, - 0.042938257f, -0.999077728f, - 0.039872928f, -0.999204759f, - 0.036807223f, -0.999322385f, - 0.033741172f, -0.999430605f, - 0.030674803f, -0.999529418f, - 0.027608146f, -0.999618822f, - 0.024541229f, -0.999698819f, - 0.021474080f, -0.999769405f, - 0.018406730f, -0.999830582f, - 0.015339206f, -0.999882347f, - 0.012271538f, -0.999924702f, - 0.009203755f, -0.999957645f, - 0.006135885f, -0.999981175f, - 0.003067957f, -0.999995294f -}; - -const float32_t twiddleCoef_rfft_4096[4096] = { - 0.000000000f, 1.000000000f, - 0.001533980f, 0.999998823f, - 0.003067957f, 0.999995294f, - 0.004601926f, 0.999989411f, - 0.006135885f, 0.999981175f, - 0.007669829f, 0.999970586f, - 0.009203755f, 0.999957645f, - 0.010737659f, 0.999942350f, - 0.012271538f, 0.999924702f, - 0.013805389f, 0.999904701f, - 0.015339206f, 0.999882347f, - 0.016872988f, 0.999857641f, - 0.018406730f, 0.999830582f, - 0.019940429f, 0.999801170f, - 0.021474080f, 0.999769405f, - 0.023007681f, 0.999735288f, - 0.024541229f, 0.999698819f, - 0.026074718f, 0.999659997f, - 0.027608146f, 0.999618822f, - 0.029141509f, 0.999575296f, - 0.030674803f, 0.999529418f, - 0.032208025f, 0.999481187f, - 0.033741172f, 0.999430605f, - 0.035274239f, 0.999377670f, - 0.036807223f, 0.999322385f, - 0.038340120f, 0.999264747f, - 0.039872928f, 0.999204759f, - 0.041405641f, 0.999142419f, - 0.042938257f, 0.999077728f, - 0.044470772f, 0.999010686f, - 0.046003182f, 0.998941293f, - 0.047535484f, 0.998869550f, - 0.049067674f, 0.998795456f, - 0.050599749f, 0.998719012f, - 0.052131705f, 0.998640218f, - 0.053663538f, 0.998559074f, - 0.055195244f, 0.998475581f, - 0.056726821f, 0.998389737f, - 0.058258265f, 0.998301545f, - 0.059789571f, 0.998211003f, - 0.061320736f, 0.998118113f, - 0.062851758f, 0.998022874f, - 0.064382631f, 0.997925286f, - 0.065913353f, 0.997825350f, - 0.067443920f, 0.997723067f, - 0.068974328f, 0.997618435f, - 0.070504573f, 0.997511456f, - 0.072034653f, 0.997402130f, - 0.073564564f, 0.997290457f, - 0.075094301f, 0.997176437f, - 0.076623861f, 0.997060070f, - 0.078153242f, 0.996941358f, - 0.079682438f, 0.996820299f, - 0.081211447f, 0.996696895f, - 0.082740265f, 0.996571146f, - 0.084268888f, 0.996443051f, - 0.085797312f, 0.996312612f, - 0.087325535f, 0.996179829f, - 0.088853553f, 0.996044701f, - 0.090381361f, 0.995907229f, - 0.091908956f, 0.995767414f, - 0.093436336f, 0.995625256f, - 0.094963495f, 0.995480755f, - 0.096490431f, 0.995333912f, - 0.098017140f, 0.995184727f, - 0.099543619f, 0.995033199f, - 0.101069863f, 0.994879331f, - 0.102595869f, 0.994723121f, - 0.104121634f, 0.994564571f, - 0.105647154f, 0.994403680f, - 0.107172425f, 0.994240449f, - 0.108697444f, 0.994074879f, - 0.110222207f, 0.993906970f, - 0.111746711f, 0.993736722f, - 0.113270952f, 0.993564136f, - 0.114794927f, 0.993389211f, - 0.116318631f, 0.993211949f, - 0.117842062f, 0.993032350f, - 0.119365215f, 0.992850414f, - 0.120888087f, 0.992666142f, - 0.122410675f, 0.992479535f, - 0.123932975f, 0.992290591f, - 0.125454983f, 0.992099313f, - 0.126976696f, 0.991905700f, - 0.128498111f, 0.991709754f, - 0.130019223f, 0.991511473f, - 0.131540029f, 0.991310860f, - 0.133060525f, 0.991107914f, - 0.134580709f, 0.990902635f, - 0.136100575f, 0.990695025f, - 0.137620122f, 0.990485084f, - 0.139139344f, 0.990272812f, - 0.140658239f, 0.990058210f, - 0.142176804f, 0.989841278f, - 0.143695033f, 0.989622017f, - 0.145212925f, 0.989400428f, - 0.146730474f, 0.989176510f, - 0.148247679f, 0.988950265f, - 0.149764535f, 0.988721692f, - 0.151281038f, 0.988490793f, - 0.152797185f, 0.988257568f, - 0.154312973f, 0.988022017f, - 0.155828398f, 0.987784142f, - 0.157343456f, 0.987543942f, - 0.158858143f, 0.987301418f, - 0.160372457f, 0.987056571f, - 0.161886394f, 0.986809402f, - 0.163399949f, 0.986559910f, - 0.164913120f, 0.986308097f, - 0.166425904f, 0.986053963f, - 0.167938295f, 0.985797509f, - 0.169450291f, 0.985538735f, - 0.170961889f, 0.985277642f, - 0.172473084f, 0.985014231f, - 0.173983873f, 0.984748502f, - 0.175494253f, 0.984480455f, - 0.177004220f, 0.984210092f, - 0.178513771f, 0.983937413f, - 0.180022901f, 0.983662419f, - 0.181531608f, 0.983385110f, - 0.183039888f, 0.983105487f, - 0.184547737f, 0.982823551f, - 0.186055152f, 0.982539302f, - 0.187562129f, 0.982252741f, - 0.189068664f, 0.981963869f, - 0.190574755f, 0.981672686f, - 0.192080397f, 0.981379193f, - 0.193585587f, 0.981083391f, - 0.195090322f, 0.980785280f, - 0.196594598f, 0.980484862f, - 0.198098411f, 0.980182136f, - 0.199601758f, 0.979877104f, - 0.201104635f, 0.979569766f, - 0.202607039f, 0.979260123f, - 0.204108966f, 0.978948175f, - 0.205610413f, 0.978633924f, - 0.207111376f, 0.978317371f, - 0.208611852f, 0.977998515f, - 0.210111837f, 0.977677358f, - 0.211611327f, 0.977353900f, - 0.213110320f, 0.977028143f, - 0.214608811f, 0.976700086f, - 0.216106797f, 0.976369731f, - 0.217604275f, 0.976037079f, - 0.219101240f, 0.975702130f, - 0.220597690f, 0.975364885f, - 0.222093621f, 0.975025345f, - 0.223589029f, 0.974683511f, - 0.225083911f, 0.974339383f, - 0.226578264f, 0.973992962f, - 0.228072083f, 0.973644250f, - 0.229565366f, 0.973293246f, - 0.231058108f, 0.972939952f, - 0.232550307f, 0.972584369f, - 0.234041959f, 0.972226497f, - 0.235533059f, 0.971866337f, - 0.237023606f, 0.971503891f, - 0.238513595f, 0.971139158f, - 0.240003022f, 0.970772141f, - 0.241491885f, 0.970402839f, - 0.242980180f, 0.970031253f, - 0.244467903f, 0.969657385f, - 0.245955050f, 0.969281235f, - 0.247441619f, 0.968902805f, - 0.248927606f, 0.968522094f, - 0.250413007f, 0.968139105f, - 0.251897818f, 0.967753837f, - 0.253382037f, 0.967366292f, - 0.254865660f, 0.966976471f, - 0.256348682f, 0.966584374f, - 0.257831102f, 0.966190003f, - 0.259312915f, 0.965793359f, - 0.260794118f, 0.965394442f, - 0.262274707f, 0.964993253f, - 0.263754679f, 0.964589793f, - 0.265234030f, 0.964184064f, - 0.266712757f, 0.963776066f, - 0.268190857f, 0.963365800f, - 0.269668326f, 0.962953267f, - 0.271145160f, 0.962538468f, - 0.272621355f, 0.962121404f, - 0.274096910f, 0.961702077f, - 0.275571819f, 0.961280486f, - 0.277046080f, 0.960856633f, - 0.278519689f, 0.960430519f, - 0.279992643f, 0.960002146f, - 0.281464938f, 0.959571513f, - 0.282936570f, 0.959138622f, - 0.284407537f, 0.958703475f, - 0.285877835f, 0.958266071f, - 0.287347460f, 0.957826413f, - 0.288816408f, 0.957384501f, - 0.290284677f, 0.956940336f, - 0.291752263f, 0.956493919f, - 0.293219163f, 0.956045251f, - 0.294685372f, 0.955594334f, - 0.296150888f, 0.955141168f, - 0.297615707f, 0.954685755f, - 0.299079826f, 0.954228095f, - 0.300543241f, 0.953768190f, - 0.302005949f, 0.953306040f, - 0.303467947f, 0.952841648f, - 0.304929230f, 0.952375013f, - 0.306389795f, 0.951906137f, - 0.307849640f, 0.951435021f, - 0.309308760f, 0.950961666f, - 0.310767153f, 0.950486074f, - 0.312224814f, 0.950008245f, - 0.313681740f, 0.949528181f, - 0.315137929f, 0.949045882f, - 0.316593376f, 0.948561350f, - 0.318048077f, 0.948074586f, - 0.319502031f, 0.947585591f, - 0.320955232f, 0.947094366f, - 0.322407679f, 0.946600913f, - 0.323859367f, 0.946105232f, - 0.325310292f, 0.945607325f, - 0.326760452f, 0.945107193f, - 0.328209844f, 0.944604837f, - 0.329658463f, 0.944100258f, - 0.331106306f, 0.943593458f, - 0.332553370f, 0.943084437f, - 0.333999651f, 0.942573198f, - 0.335445147f, 0.942059740f, - 0.336889853f, 0.941544065f, - 0.338333767f, 0.941026175f, - 0.339776884f, 0.940506071f, - 0.341219202f, 0.939983753f, - 0.342660717f, 0.939459224f, - 0.344101426f, 0.938932484f, - 0.345541325f, 0.938403534f, - 0.346980411f, 0.937872376f, - 0.348418680f, 0.937339012f, - 0.349856130f, 0.936803442f, - 0.351292756f, 0.936265667f, - 0.352728556f, 0.935725689f, - 0.354163525f, 0.935183510f, - 0.355597662f, 0.934639130f, - 0.357030961f, 0.934092550f, - 0.358463421f, 0.933543773f, - 0.359895037f, 0.932992799f, - 0.361325806f, 0.932439629f, - 0.362755724f, 0.931884266f, - 0.364184790f, 0.931326709f, - 0.365612998f, 0.930766961f, - 0.367040346f, 0.930205023f, - 0.368466830f, 0.929640896f, - 0.369892447f, 0.929074581f, - 0.371317194f, 0.928506080f, - 0.372741067f, 0.927935395f, - 0.374164063f, 0.927362526f, - 0.375586178f, 0.926787474f, - 0.377007410f, 0.926210242f, - 0.378427755f, 0.925630831f, - 0.379847209f, 0.925049241f, - 0.381265769f, 0.924465474f, - 0.382683432f, 0.923879533f, - 0.384100195f, 0.923291417f, - 0.385516054f, 0.922701128f, - 0.386931006f, 0.922108669f, - 0.388345047f, 0.921514039f, - 0.389758174f, 0.920917242f, - 0.391170384f, 0.920318277f, - 0.392581674f, 0.919717146f, - 0.393992040f, 0.919113852f, - 0.395401479f, 0.918508394f, - 0.396809987f, 0.917900776f, - 0.398217562f, 0.917290997f, - 0.399624200f, 0.916679060f, - 0.401029897f, 0.916064966f, - 0.402434651f, 0.915448716f, - 0.403838458f, 0.914830312f, - 0.405241314f, 0.914209756f, - 0.406643217f, 0.913587048f, - 0.408044163f, 0.912962190f, - 0.409444149f, 0.912335185f, - 0.410843171f, 0.911706032f, - 0.412241227f, 0.911074734f, - 0.413638312f, 0.910441292f, - 0.415034424f, 0.909805708f, - 0.416429560f, 0.909167983f, - 0.417823716f, 0.908528119f, - 0.419216888f, 0.907886116f, - 0.420609074f, 0.907241978f, - 0.422000271f, 0.906595705f, - 0.423390474f, 0.905947298f, - 0.424779681f, 0.905296759f, - 0.426167889f, 0.904644091f, - 0.427555093f, 0.903989293f, - 0.428941292f, 0.903332368f, - 0.430326481f, 0.902673318f, - 0.431710658f, 0.902012144f, - 0.433093819f, 0.901348847f, - 0.434475961f, 0.900683429f, - 0.435857080f, 0.900015892f, - 0.437237174f, 0.899346237f, - 0.438616239f, 0.898674466f, - 0.439994271f, 0.898000580f, - 0.441371269f, 0.897324581f, - 0.442747228f, 0.896646470f, - 0.444122145f, 0.895966250f, - 0.445496017f, 0.895283921f, - 0.446868840f, 0.894599486f, - 0.448240612f, 0.893912945f, - 0.449611330f, 0.893224301f, - 0.450980989f, 0.892533555f, - 0.452349587f, 0.891840709f, - 0.453717121f, 0.891145765f, - 0.455083587f, 0.890448723f, - 0.456448982f, 0.889749586f, - 0.457813304f, 0.889048356f, - 0.459176548f, 0.888345033f, - 0.460538711f, 0.887639620f, - 0.461899791f, 0.886932119f, - 0.463259784f, 0.886222530f, - 0.464618686f, 0.885510856f, - 0.465976496f, 0.884797098f, - 0.467333209f, 0.884081259f, - 0.468688822f, 0.883363339f, - 0.470043332f, 0.882643340f, - 0.471396737f, 0.881921264f, - 0.472749032f, 0.881197113f, - 0.474100215f, 0.880470889f, - 0.475450282f, 0.879742593f, - 0.476799230f, 0.879012226f, - 0.478147056f, 0.878279792f, - 0.479493758f, 0.877545290f, - 0.480839331f, 0.876808724f, - 0.482183772f, 0.876070094f, - 0.483527079f, 0.875329403f, - 0.484869248f, 0.874586652f, - 0.486210276f, 0.873841843f, - 0.487550160f, 0.873094978f, - 0.488888897f, 0.872346059f, - 0.490226483f, 0.871595087f, - 0.491562916f, 0.870842063f, - 0.492898192f, 0.870086991f, - 0.494232309f, 0.869329871f, - 0.495565262f, 0.868570706f, - 0.496897049f, 0.867809497f, - 0.498227667f, 0.867046246f, - 0.499557113f, 0.866280954f, - 0.500885383f, 0.865513624f, - 0.502212474f, 0.864744258f, - 0.503538384f, 0.863972856f, - 0.504863109f, 0.863199422f, - 0.506186645f, 0.862423956f, - 0.507508991f, 0.861646461f, - 0.508830143f, 0.860866939f, - 0.510150097f, 0.860085390f, - 0.511468850f, 0.859301818f, - 0.512786401f, 0.858516224f, - 0.514102744f, 0.857728610f, - 0.515417878f, 0.856938977f, - 0.516731799f, 0.856147328f, - 0.518044504f, 0.855353665f, - 0.519355990f, 0.854557988f, - 0.520666254f, 0.853760301f, - 0.521975293f, 0.852960605f, - 0.523283103f, 0.852158902f, - 0.524589683f, 0.851355193f, - 0.525895027f, 0.850549481f, - 0.527199135f, 0.849741768f, - 0.528502002f, 0.848932055f, - 0.529803625f, 0.848120345f, - 0.531104001f, 0.847306639f, - 0.532403128f, 0.846490939f, - 0.533701002f, 0.845673247f, - 0.534997620f, 0.844853565f, - 0.536292979f, 0.844031895f, - 0.537587076f, 0.843208240f, - 0.538879909f, 0.842382600f, - 0.540171473f, 0.841554977f, - 0.541461766f, 0.840725375f, - 0.542750785f, 0.839893794f, - 0.544038527f, 0.839060237f, - 0.545324988f, 0.838224706f, - 0.546610167f, 0.837387202f, - 0.547894059f, 0.836547727f, - 0.549176662f, 0.835706284f, - 0.550457973f, 0.834862875f, - 0.551737988f, 0.834017501f, - 0.553016706f, 0.833170165f, - 0.554294121f, 0.832320868f, - 0.555570233f, 0.831469612f, - 0.556845037f, 0.830616400f, - 0.558118531f, 0.829761234f, - 0.559390712f, 0.828904115f, - 0.560661576f, 0.828045045f, - 0.561931121f, 0.827184027f, - 0.563199344f, 0.826321063f, - 0.564466242f, 0.825456154f, - 0.565731811f, 0.824589303f, - 0.566996049f, 0.823720511f, - 0.568258953f, 0.822849781f, - 0.569520519f, 0.821977115f, - 0.570780746f, 0.821102515f, - 0.572039629f, 0.820225983f, - 0.573297167f, 0.819347520f, - 0.574553355f, 0.818467130f, - 0.575808191f, 0.817584813f, - 0.577061673f, 0.816700573f, - 0.578313796f, 0.815814411f, - 0.579564559f, 0.814926329f, - 0.580813958f, 0.814036330f, - 0.582061990f, 0.813144415f, - 0.583308653f, 0.812250587f, - 0.584553943f, 0.811354847f, - 0.585797857f, 0.810457198f, - 0.587040394f, 0.809557642f, - 0.588281548f, 0.808656182f, - 0.589521319f, 0.807752818f, - 0.590759702f, 0.806847554f, - 0.591996695f, 0.805940391f, - 0.593232295f, 0.805031331f, - 0.594466499f, 0.804120377f, - 0.595699304f, 0.803207531f, - 0.596930708f, 0.802292796f, - 0.598160707f, 0.801376172f, - 0.599389298f, 0.800457662f, - 0.600616479f, 0.799537269f, - 0.601842247f, 0.798614995f, - 0.603066599f, 0.797690841f, - 0.604289531f, 0.796764810f, - 0.605511041f, 0.795836905f, - 0.606731127f, 0.794907126f, - 0.607949785f, 0.793975478f, - 0.609167012f, 0.793041960f, - 0.610382806f, 0.792106577f, - 0.611597164f, 0.791169330f, - 0.612810082f, 0.790230221f, - 0.614021559f, 0.789289253f, - 0.615231591f, 0.788346428f, - 0.616440175f, 0.787401747f, - 0.617647308f, 0.786455214f, - 0.618852988f, 0.785506830f, - 0.620057212f, 0.784556597f, - 0.621259977f, 0.783604519f, - 0.622461279f, 0.782650596f, - 0.623661118f, 0.781694832f, - 0.624859488f, 0.780737229f, - 0.626056388f, 0.779777788f, - 0.627251815f, 0.778816512f, - 0.628445767f, 0.777853404f, - 0.629638239f, 0.776888466f, - 0.630829230f, 0.775921699f, - 0.632018736f, 0.774953107f, - 0.633206755f, 0.773982691f, - 0.634393284f, 0.773010453f, - 0.635578320f, 0.772036397f, - 0.636761861f, 0.771060524f, - 0.637943904f, 0.770082837f, - 0.639124445f, 0.769103338f, - 0.640303482f, 0.768122029f, - 0.641481013f, 0.767138912f, - 0.642657034f, 0.766153990f, - 0.643831543f, 0.765167266f, - 0.645004537f, 0.764178741f, - 0.646176013f, 0.763188417f, - 0.647345969f, 0.762196298f, - 0.648514401f, 0.761202385f, - 0.649681307f, 0.760206682f, - 0.650846685f, 0.759209189f, - 0.652010531f, 0.758209910f, - 0.653172843f, 0.757208847f, - 0.654333618f, 0.756206001f, - 0.655492853f, 0.755201377f, - 0.656650546f, 0.754194975f, - 0.657806693f, 0.753186799f, - 0.658961293f, 0.752176850f, - 0.660114342f, 0.751165132f, - 0.661265838f, 0.750151646f, - 0.662415778f, 0.749136395f, - 0.663564159f, 0.748119380f, - 0.664710978f, 0.747100606f, - 0.665856234f, 0.746080074f, - 0.666999922f, 0.745057785f, - 0.668142041f, 0.744033744f, - 0.669282588f, 0.743007952f, - 0.670421560f, 0.741980412f, - 0.671558955f, 0.740951125f, - 0.672694769f, 0.739920095f, - 0.673829000f, 0.738887324f, - 0.674961646f, 0.737852815f, - 0.676092704f, 0.736816569f, - 0.677222170f, 0.735778589f, - 0.678350043f, 0.734738878f, - 0.679476320f, 0.733697438f, - 0.680600998f, 0.732654272f, - 0.681724074f, 0.731609381f, - 0.682845546f, 0.730562769f, - 0.683965412f, 0.729514438f, - 0.685083668f, 0.728464390f, - 0.686200312f, 0.727412629f, - 0.687315341f, 0.726359155f, - 0.688428753f, 0.725303972f, - 0.689540545f, 0.724247083f, - 0.690650714f, 0.723188489f, - 0.691759258f, 0.722128194f, - 0.692866175f, 0.721066199f, - 0.693971461f, 0.720002508f, - 0.695075114f, 0.718937122f, - 0.696177131f, 0.717870045f, - 0.697277511f, 0.716801279f, - 0.698376249f, 0.715730825f, - 0.699473345f, 0.714658688f, - 0.700568794f, 0.713584869f, - 0.701662595f, 0.712509371f, - 0.702754744f, 0.711432196f, - 0.703845241f, 0.710353347f, - 0.704934080f, 0.709272826f, - 0.706021261f, 0.708190637f, - 0.707106781f, 0.707106781f, - 0.708190637f, 0.706021261f, - 0.709272826f, 0.704934080f, - 0.710353347f, 0.703845241f, - 0.711432196f, 0.702754744f, - 0.712509371f, 0.701662595f, - 0.713584869f, 0.700568794f, - 0.714658688f, 0.699473345f, - 0.715730825f, 0.698376249f, - 0.716801279f, 0.697277511f, - 0.717870045f, 0.696177131f, - 0.718937122f, 0.695075114f, - 0.720002508f, 0.693971461f, - 0.721066199f, 0.692866175f, - 0.722128194f, 0.691759258f, - 0.723188489f, 0.690650714f, - 0.724247083f, 0.689540545f, - 0.725303972f, 0.688428753f, - 0.726359155f, 0.687315341f, - 0.727412629f, 0.686200312f, - 0.728464390f, 0.685083668f, - 0.729514438f, 0.683965412f, - 0.730562769f, 0.682845546f, - 0.731609381f, 0.681724074f, - 0.732654272f, 0.680600998f, - 0.733697438f, 0.679476320f, - 0.734738878f, 0.678350043f, - 0.735778589f, 0.677222170f, - 0.736816569f, 0.676092704f, - 0.737852815f, 0.674961646f, - 0.738887324f, 0.673829000f, - 0.739920095f, 0.672694769f, - 0.740951125f, 0.671558955f, - 0.741980412f, 0.670421560f, - 0.743007952f, 0.669282588f, - 0.744033744f, 0.668142041f, - 0.745057785f, 0.666999922f, - 0.746080074f, 0.665856234f, - 0.747100606f, 0.664710978f, - 0.748119380f, 0.663564159f, - 0.749136395f, 0.662415778f, - 0.750151646f, 0.661265838f, - 0.751165132f, 0.660114342f, - 0.752176850f, 0.658961293f, - 0.753186799f, 0.657806693f, - 0.754194975f, 0.656650546f, - 0.755201377f, 0.655492853f, - 0.756206001f, 0.654333618f, - 0.757208847f, 0.653172843f, - 0.758209910f, 0.652010531f, - 0.759209189f, 0.650846685f, - 0.760206682f, 0.649681307f, - 0.761202385f, 0.648514401f, - 0.762196298f, 0.647345969f, - 0.763188417f, 0.646176013f, - 0.764178741f, 0.645004537f, - 0.765167266f, 0.643831543f, - 0.766153990f, 0.642657034f, - 0.767138912f, 0.641481013f, - 0.768122029f, 0.640303482f, - 0.769103338f, 0.639124445f, - 0.770082837f, 0.637943904f, - 0.771060524f, 0.636761861f, - 0.772036397f, 0.635578320f, - 0.773010453f, 0.634393284f, - 0.773982691f, 0.633206755f, - 0.774953107f, 0.632018736f, - 0.775921699f, 0.630829230f, - 0.776888466f, 0.629638239f, - 0.777853404f, 0.628445767f, - 0.778816512f, 0.627251815f, - 0.779777788f, 0.626056388f, - 0.780737229f, 0.624859488f, - 0.781694832f, 0.623661118f, - 0.782650596f, 0.622461279f, - 0.783604519f, 0.621259977f, - 0.784556597f, 0.620057212f, - 0.785506830f, 0.618852988f, - 0.786455214f, 0.617647308f, - 0.787401747f, 0.616440175f, - 0.788346428f, 0.615231591f, - 0.789289253f, 0.614021559f, - 0.790230221f, 0.612810082f, - 0.791169330f, 0.611597164f, - 0.792106577f, 0.610382806f, - 0.793041960f, 0.609167012f, - 0.793975478f, 0.607949785f, - 0.794907126f, 0.606731127f, - 0.795836905f, 0.605511041f, - 0.796764810f, 0.604289531f, - 0.797690841f, 0.603066599f, - 0.798614995f, 0.601842247f, - 0.799537269f, 0.600616479f, - 0.800457662f, 0.599389298f, - 0.801376172f, 0.598160707f, - 0.802292796f, 0.596930708f, - 0.803207531f, 0.595699304f, - 0.804120377f, 0.594466499f, - 0.805031331f, 0.593232295f, - 0.805940391f, 0.591996695f, - 0.806847554f, 0.590759702f, - 0.807752818f, 0.589521319f, - 0.808656182f, 0.588281548f, - 0.809557642f, 0.587040394f, - 0.810457198f, 0.585797857f, - 0.811354847f, 0.584553943f, - 0.812250587f, 0.583308653f, - 0.813144415f, 0.582061990f, - 0.814036330f, 0.580813958f, - 0.814926329f, 0.579564559f, - 0.815814411f, 0.578313796f, - 0.816700573f, 0.577061673f, - 0.817584813f, 0.575808191f, - 0.818467130f, 0.574553355f, - 0.819347520f, 0.573297167f, - 0.820225983f, 0.572039629f, - 0.821102515f, 0.570780746f, - 0.821977115f, 0.569520519f, - 0.822849781f, 0.568258953f, - 0.823720511f, 0.566996049f, - 0.824589303f, 0.565731811f, - 0.825456154f, 0.564466242f, - 0.826321063f, 0.563199344f, - 0.827184027f, 0.561931121f, - 0.828045045f, 0.560661576f, - 0.828904115f, 0.559390712f, - 0.829761234f, 0.558118531f, - 0.830616400f, 0.556845037f, - 0.831469612f, 0.555570233f, - 0.832320868f, 0.554294121f, - 0.833170165f, 0.553016706f, - 0.834017501f, 0.551737988f, - 0.834862875f, 0.550457973f, - 0.835706284f, 0.549176662f, - 0.836547727f, 0.547894059f, - 0.837387202f, 0.546610167f, - 0.838224706f, 0.545324988f, - 0.839060237f, 0.544038527f, - 0.839893794f, 0.542750785f, - 0.840725375f, 0.541461766f, - 0.841554977f, 0.540171473f, - 0.842382600f, 0.538879909f, - 0.843208240f, 0.537587076f, - 0.844031895f, 0.536292979f, - 0.844853565f, 0.534997620f, - 0.845673247f, 0.533701002f, - 0.846490939f, 0.532403128f, - 0.847306639f, 0.531104001f, - 0.848120345f, 0.529803625f, - 0.848932055f, 0.528502002f, - 0.849741768f, 0.527199135f, - 0.850549481f, 0.525895027f, - 0.851355193f, 0.524589683f, - 0.852158902f, 0.523283103f, - 0.852960605f, 0.521975293f, - 0.853760301f, 0.520666254f, - 0.854557988f, 0.519355990f, - 0.855353665f, 0.518044504f, - 0.856147328f, 0.516731799f, - 0.856938977f, 0.515417878f, - 0.857728610f, 0.514102744f, - 0.858516224f, 0.512786401f, - 0.859301818f, 0.511468850f, - 0.860085390f, 0.510150097f, - 0.860866939f, 0.508830143f, - 0.861646461f, 0.507508991f, - 0.862423956f, 0.506186645f, - 0.863199422f, 0.504863109f, - 0.863972856f, 0.503538384f, - 0.864744258f, 0.502212474f, - 0.865513624f, 0.500885383f, - 0.866280954f, 0.499557113f, - 0.867046246f, 0.498227667f, - 0.867809497f, 0.496897049f, - 0.868570706f, 0.495565262f, - 0.869329871f, 0.494232309f, - 0.870086991f, 0.492898192f, - 0.870842063f, 0.491562916f, - 0.871595087f, 0.490226483f, - 0.872346059f, 0.488888897f, - 0.873094978f, 0.487550160f, - 0.873841843f, 0.486210276f, - 0.874586652f, 0.484869248f, - 0.875329403f, 0.483527079f, - 0.876070094f, 0.482183772f, - 0.876808724f, 0.480839331f, - 0.877545290f, 0.479493758f, - 0.878279792f, 0.478147056f, - 0.879012226f, 0.476799230f, - 0.879742593f, 0.475450282f, - 0.880470889f, 0.474100215f, - 0.881197113f, 0.472749032f, - 0.881921264f, 0.471396737f, - 0.882643340f, 0.470043332f, - 0.883363339f, 0.468688822f, - 0.884081259f, 0.467333209f, - 0.884797098f, 0.465976496f, - 0.885510856f, 0.464618686f, - 0.886222530f, 0.463259784f, - 0.886932119f, 0.461899791f, - 0.887639620f, 0.460538711f, - 0.888345033f, 0.459176548f, - 0.889048356f, 0.457813304f, - 0.889749586f, 0.456448982f, - 0.890448723f, 0.455083587f, - 0.891145765f, 0.453717121f, - 0.891840709f, 0.452349587f, - 0.892533555f, 0.450980989f, - 0.893224301f, 0.449611330f, - 0.893912945f, 0.448240612f, - 0.894599486f, 0.446868840f, - 0.895283921f, 0.445496017f, - 0.895966250f, 0.444122145f, - 0.896646470f, 0.442747228f, - 0.897324581f, 0.441371269f, - 0.898000580f, 0.439994271f, - 0.898674466f, 0.438616239f, - 0.899346237f, 0.437237174f, - 0.900015892f, 0.435857080f, - 0.900683429f, 0.434475961f, - 0.901348847f, 0.433093819f, - 0.902012144f, 0.431710658f, - 0.902673318f, 0.430326481f, - 0.903332368f, 0.428941292f, - 0.903989293f, 0.427555093f, - 0.904644091f, 0.426167889f, - 0.905296759f, 0.424779681f, - 0.905947298f, 0.423390474f, - 0.906595705f, 0.422000271f, - 0.907241978f, 0.420609074f, - 0.907886116f, 0.419216888f, - 0.908528119f, 0.417823716f, - 0.909167983f, 0.416429560f, - 0.909805708f, 0.415034424f, - 0.910441292f, 0.413638312f, - 0.911074734f, 0.412241227f, - 0.911706032f, 0.410843171f, - 0.912335185f, 0.409444149f, - 0.912962190f, 0.408044163f, - 0.913587048f, 0.406643217f, - 0.914209756f, 0.405241314f, - 0.914830312f, 0.403838458f, - 0.915448716f, 0.402434651f, - 0.916064966f, 0.401029897f, - 0.916679060f, 0.399624200f, - 0.917290997f, 0.398217562f, - 0.917900776f, 0.396809987f, - 0.918508394f, 0.395401479f, - 0.919113852f, 0.393992040f, - 0.919717146f, 0.392581674f, - 0.920318277f, 0.391170384f, - 0.920917242f, 0.389758174f, - 0.921514039f, 0.388345047f, - 0.922108669f, 0.386931006f, - 0.922701128f, 0.385516054f, - 0.923291417f, 0.384100195f, - 0.923879533f, 0.382683432f, - 0.924465474f, 0.381265769f, - 0.925049241f, 0.379847209f, - 0.925630831f, 0.378427755f, - 0.926210242f, 0.377007410f, - 0.926787474f, 0.375586178f, - 0.927362526f, 0.374164063f, - 0.927935395f, 0.372741067f, - 0.928506080f, 0.371317194f, - 0.929074581f, 0.369892447f, - 0.929640896f, 0.368466830f, - 0.930205023f, 0.367040346f, - 0.930766961f, 0.365612998f, - 0.931326709f, 0.364184790f, - 0.931884266f, 0.362755724f, - 0.932439629f, 0.361325806f, - 0.932992799f, 0.359895037f, - 0.933543773f, 0.358463421f, - 0.934092550f, 0.357030961f, - 0.934639130f, 0.355597662f, - 0.935183510f, 0.354163525f, - 0.935725689f, 0.352728556f, - 0.936265667f, 0.351292756f, - 0.936803442f, 0.349856130f, - 0.937339012f, 0.348418680f, - 0.937872376f, 0.346980411f, - 0.938403534f, 0.345541325f, - 0.938932484f, 0.344101426f, - 0.939459224f, 0.342660717f, - 0.939983753f, 0.341219202f, - 0.940506071f, 0.339776884f, - 0.941026175f, 0.338333767f, - 0.941544065f, 0.336889853f, - 0.942059740f, 0.335445147f, - 0.942573198f, 0.333999651f, - 0.943084437f, 0.332553370f, - 0.943593458f, 0.331106306f, - 0.944100258f, 0.329658463f, - 0.944604837f, 0.328209844f, - 0.945107193f, 0.326760452f, - 0.945607325f, 0.325310292f, - 0.946105232f, 0.323859367f, - 0.946600913f, 0.322407679f, - 0.947094366f, 0.320955232f, - 0.947585591f, 0.319502031f, - 0.948074586f, 0.318048077f, - 0.948561350f, 0.316593376f, - 0.949045882f, 0.315137929f, - 0.949528181f, 0.313681740f, - 0.950008245f, 0.312224814f, - 0.950486074f, 0.310767153f, - 0.950961666f, 0.309308760f, - 0.951435021f, 0.307849640f, - 0.951906137f, 0.306389795f, - 0.952375013f, 0.304929230f, - 0.952841648f, 0.303467947f, - 0.953306040f, 0.302005949f, - 0.953768190f, 0.300543241f, - 0.954228095f, 0.299079826f, - 0.954685755f, 0.297615707f, - 0.955141168f, 0.296150888f, - 0.955594334f, 0.294685372f, - 0.956045251f, 0.293219163f, - 0.956493919f, 0.291752263f, - 0.956940336f, 0.290284677f, - 0.957384501f, 0.288816408f, - 0.957826413f, 0.287347460f, - 0.958266071f, 0.285877835f, - 0.958703475f, 0.284407537f, - 0.959138622f, 0.282936570f, - 0.959571513f, 0.281464938f, - 0.960002146f, 0.279992643f, - 0.960430519f, 0.278519689f, - 0.960856633f, 0.277046080f, - 0.961280486f, 0.275571819f, - 0.961702077f, 0.274096910f, - 0.962121404f, 0.272621355f, - 0.962538468f, 0.271145160f, - 0.962953267f, 0.269668326f, - 0.963365800f, 0.268190857f, - 0.963776066f, 0.266712757f, - 0.964184064f, 0.265234030f, - 0.964589793f, 0.263754679f, - 0.964993253f, 0.262274707f, - 0.965394442f, 0.260794118f, - 0.965793359f, 0.259312915f, - 0.966190003f, 0.257831102f, - 0.966584374f, 0.256348682f, - 0.966976471f, 0.254865660f, - 0.967366292f, 0.253382037f, - 0.967753837f, 0.251897818f, - 0.968139105f, 0.250413007f, - 0.968522094f, 0.248927606f, - 0.968902805f, 0.247441619f, - 0.969281235f, 0.245955050f, - 0.969657385f, 0.244467903f, - 0.970031253f, 0.242980180f, - 0.970402839f, 0.241491885f, - 0.970772141f, 0.240003022f, - 0.971139158f, 0.238513595f, - 0.971503891f, 0.237023606f, - 0.971866337f, 0.235533059f, - 0.972226497f, 0.234041959f, - 0.972584369f, 0.232550307f, - 0.972939952f, 0.231058108f, - 0.973293246f, 0.229565366f, - 0.973644250f, 0.228072083f, - 0.973992962f, 0.226578264f, - 0.974339383f, 0.225083911f, - 0.974683511f, 0.223589029f, - 0.975025345f, 0.222093621f, - 0.975364885f, 0.220597690f, - 0.975702130f, 0.219101240f, - 0.976037079f, 0.217604275f, - 0.976369731f, 0.216106797f, - 0.976700086f, 0.214608811f, - 0.977028143f, 0.213110320f, - 0.977353900f, 0.211611327f, - 0.977677358f, 0.210111837f, - 0.977998515f, 0.208611852f, - 0.978317371f, 0.207111376f, - 0.978633924f, 0.205610413f, - 0.978948175f, 0.204108966f, - 0.979260123f, 0.202607039f, - 0.979569766f, 0.201104635f, - 0.979877104f, 0.199601758f, - 0.980182136f, 0.198098411f, - 0.980484862f, 0.196594598f, - 0.980785280f, 0.195090322f, - 0.981083391f, 0.193585587f, - 0.981379193f, 0.192080397f, - 0.981672686f, 0.190574755f, - 0.981963869f, 0.189068664f, - 0.982252741f, 0.187562129f, - 0.982539302f, 0.186055152f, - 0.982823551f, 0.184547737f, - 0.983105487f, 0.183039888f, - 0.983385110f, 0.181531608f, - 0.983662419f, 0.180022901f, - 0.983937413f, 0.178513771f, - 0.984210092f, 0.177004220f, - 0.984480455f, 0.175494253f, - 0.984748502f, 0.173983873f, - 0.985014231f, 0.172473084f, - 0.985277642f, 0.170961889f, - 0.985538735f, 0.169450291f, - 0.985797509f, 0.167938295f, - 0.986053963f, 0.166425904f, - 0.986308097f, 0.164913120f, - 0.986559910f, 0.163399949f, - 0.986809402f, 0.161886394f, - 0.987056571f, 0.160372457f, - 0.987301418f, 0.158858143f, - 0.987543942f, 0.157343456f, - 0.987784142f, 0.155828398f, - 0.988022017f, 0.154312973f, - 0.988257568f, 0.152797185f, - 0.988490793f, 0.151281038f, - 0.988721692f, 0.149764535f, - 0.988950265f, 0.148247679f, - 0.989176510f, 0.146730474f, - 0.989400428f, 0.145212925f, - 0.989622017f, 0.143695033f, - 0.989841278f, 0.142176804f, - 0.990058210f, 0.140658239f, - 0.990272812f, 0.139139344f, - 0.990485084f, 0.137620122f, - 0.990695025f, 0.136100575f, - 0.990902635f, 0.134580709f, - 0.991107914f, 0.133060525f, - 0.991310860f, 0.131540029f, - 0.991511473f, 0.130019223f, - 0.991709754f, 0.128498111f, - 0.991905700f, 0.126976696f, - 0.992099313f, 0.125454983f, - 0.992290591f, 0.123932975f, - 0.992479535f, 0.122410675f, - 0.992666142f, 0.120888087f, - 0.992850414f, 0.119365215f, - 0.993032350f, 0.117842062f, - 0.993211949f, 0.116318631f, - 0.993389211f, 0.114794927f, - 0.993564136f, 0.113270952f, - 0.993736722f, 0.111746711f, - 0.993906970f, 0.110222207f, - 0.994074879f, 0.108697444f, - 0.994240449f, 0.107172425f, - 0.994403680f, 0.105647154f, - 0.994564571f, 0.104121634f, - 0.994723121f, 0.102595869f, - 0.994879331f, 0.101069863f, - 0.995033199f, 0.099543619f, - 0.995184727f, 0.098017140f, - 0.995333912f, 0.096490431f, - 0.995480755f, 0.094963495f, - 0.995625256f, 0.093436336f, - 0.995767414f, 0.091908956f, - 0.995907229f, 0.090381361f, - 0.996044701f, 0.088853553f, - 0.996179829f, 0.087325535f, - 0.996312612f, 0.085797312f, - 0.996443051f, 0.084268888f, - 0.996571146f, 0.082740265f, - 0.996696895f, 0.081211447f, - 0.996820299f, 0.079682438f, - 0.996941358f, 0.078153242f, - 0.997060070f, 0.076623861f, - 0.997176437f, 0.075094301f, - 0.997290457f, 0.073564564f, - 0.997402130f, 0.072034653f, - 0.997511456f, 0.070504573f, - 0.997618435f, 0.068974328f, - 0.997723067f, 0.067443920f, - 0.997825350f, 0.065913353f, - 0.997925286f, 0.064382631f, - 0.998022874f, 0.062851758f, - 0.998118113f, 0.061320736f, - 0.998211003f, 0.059789571f, - 0.998301545f, 0.058258265f, - 0.998389737f, 0.056726821f, - 0.998475581f, 0.055195244f, - 0.998559074f, 0.053663538f, - 0.998640218f, 0.052131705f, - 0.998719012f, 0.050599749f, - 0.998795456f, 0.049067674f, - 0.998869550f, 0.047535484f, - 0.998941293f, 0.046003182f, - 0.999010686f, 0.044470772f, - 0.999077728f, 0.042938257f, - 0.999142419f, 0.041405641f, - 0.999204759f, 0.039872928f, - 0.999264747f, 0.038340120f, - 0.999322385f, 0.036807223f, - 0.999377670f, 0.035274239f, - 0.999430605f, 0.033741172f, - 0.999481187f, 0.032208025f, - 0.999529418f, 0.030674803f, - 0.999575296f, 0.029141509f, - 0.999618822f, 0.027608146f, - 0.999659997f, 0.026074718f, - 0.999698819f, 0.024541229f, - 0.999735288f, 0.023007681f, - 0.999769405f, 0.021474080f, - 0.999801170f, 0.019940429f, - 0.999830582f, 0.018406730f, - 0.999857641f, 0.016872988f, - 0.999882347f, 0.015339206f, - 0.999904701f, 0.013805389f, - 0.999924702f, 0.012271538f, - 0.999942350f, 0.010737659f, - 0.999957645f, 0.009203755f, - 0.999970586f, 0.007669829f, - 0.999981175f, 0.006135885f, - 0.999989411f, 0.004601926f, - 0.999995294f, 0.003067957f, - 0.999998823f, 0.001533980f, - 1.000000000f, 0.000000000f, - 0.999998823f, -0.001533980f, - 0.999995294f, -0.003067957f, - 0.999989411f, -0.004601926f, - 0.999981175f, -0.006135885f, - 0.999970586f, -0.007669829f, - 0.999957645f, -0.009203755f, - 0.999942350f, -0.010737659f, - 0.999924702f, -0.012271538f, - 0.999904701f, -0.013805389f, - 0.999882347f, -0.015339206f, - 0.999857641f, -0.016872988f, - 0.999830582f, -0.018406730f, - 0.999801170f, -0.019940429f, - 0.999769405f, -0.021474080f, - 0.999735288f, -0.023007681f, - 0.999698819f, -0.024541229f, - 0.999659997f, -0.026074718f, - 0.999618822f, -0.027608146f, - 0.999575296f, -0.029141509f, - 0.999529418f, -0.030674803f, - 0.999481187f, -0.032208025f, - 0.999430605f, -0.033741172f, - 0.999377670f, -0.035274239f, - 0.999322385f, -0.036807223f, - 0.999264747f, -0.038340120f, - 0.999204759f, -0.039872928f, - 0.999142419f, -0.041405641f, - 0.999077728f, -0.042938257f, - 0.999010686f, -0.044470772f, - 0.998941293f, -0.046003182f, - 0.998869550f, -0.047535484f, - 0.998795456f, -0.049067674f, - 0.998719012f, -0.050599749f, - 0.998640218f, -0.052131705f, - 0.998559074f, -0.053663538f, - 0.998475581f, -0.055195244f, - 0.998389737f, -0.056726821f, - 0.998301545f, -0.058258265f, - 0.998211003f, -0.059789571f, - 0.998118113f, -0.061320736f, - 0.998022874f, -0.062851758f, - 0.997925286f, -0.064382631f, - 0.997825350f, -0.065913353f, - 0.997723067f, -0.067443920f, - 0.997618435f, -0.068974328f, - 0.997511456f, -0.070504573f, - 0.997402130f, -0.072034653f, - 0.997290457f, -0.073564564f, - 0.997176437f, -0.075094301f, - 0.997060070f, -0.076623861f, - 0.996941358f, -0.078153242f, - 0.996820299f, -0.079682438f, - 0.996696895f, -0.081211447f, - 0.996571146f, -0.082740265f, - 0.996443051f, -0.084268888f, - 0.996312612f, -0.085797312f, - 0.996179829f, -0.087325535f, - 0.996044701f, -0.088853553f, - 0.995907229f, -0.090381361f, - 0.995767414f, -0.091908956f, - 0.995625256f, -0.093436336f, - 0.995480755f, -0.094963495f, - 0.995333912f, -0.096490431f, - 0.995184727f, -0.098017140f, - 0.995033199f, -0.099543619f, - 0.994879331f, -0.101069863f, - 0.994723121f, -0.102595869f, - 0.994564571f, -0.104121634f, - 0.994403680f, -0.105647154f, - 0.994240449f, -0.107172425f, - 0.994074879f, -0.108697444f, - 0.993906970f, -0.110222207f, - 0.993736722f, -0.111746711f, - 0.993564136f, -0.113270952f, - 0.993389211f, -0.114794927f, - 0.993211949f, -0.116318631f, - 0.993032350f, -0.117842062f, - 0.992850414f, -0.119365215f, - 0.992666142f, -0.120888087f, - 0.992479535f, -0.122410675f, - 0.992290591f, -0.123932975f, - 0.992099313f, -0.125454983f, - 0.991905700f, -0.126976696f, - 0.991709754f, -0.128498111f, - 0.991511473f, -0.130019223f, - 0.991310860f, -0.131540029f, - 0.991107914f, -0.133060525f, - 0.990902635f, -0.134580709f, - 0.990695025f, -0.136100575f, - 0.990485084f, -0.137620122f, - 0.990272812f, -0.139139344f, - 0.990058210f, -0.140658239f, - 0.989841278f, -0.142176804f, - 0.989622017f, -0.143695033f, - 0.989400428f, -0.145212925f, - 0.989176510f, -0.146730474f, - 0.988950265f, -0.148247679f, - 0.988721692f, -0.149764535f, - 0.988490793f, -0.151281038f, - 0.988257568f, -0.152797185f, - 0.988022017f, -0.154312973f, - 0.987784142f, -0.155828398f, - 0.987543942f, -0.157343456f, - 0.987301418f, -0.158858143f, - 0.987056571f, -0.160372457f, - 0.986809402f, -0.161886394f, - 0.986559910f, -0.163399949f, - 0.986308097f, -0.164913120f, - 0.986053963f, -0.166425904f, - 0.985797509f, -0.167938295f, - 0.985538735f, -0.169450291f, - 0.985277642f, -0.170961889f, - 0.985014231f, -0.172473084f, - 0.984748502f, -0.173983873f, - 0.984480455f, -0.175494253f, - 0.984210092f, -0.177004220f, - 0.983937413f, -0.178513771f, - 0.983662419f, -0.180022901f, - 0.983385110f, -0.181531608f, - 0.983105487f, -0.183039888f, - 0.982823551f, -0.184547737f, - 0.982539302f, -0.186055152f, - 0.982252741f, -0.187562129f, - 0.981963869f, -0.189068664f, - 0.981672686f, -0.190574755f, - 0.981379193f, -0.192080397f, - 0.981083391f, -0.193585587f, - 0.980785280f, -0.195090322f, - 0.980484862f, -0.196594598f, - 0.980182136f, -0.198098411f, - 0.979877104f, -0.199601758f, - 0.979569766f, -0.201104635f, - 0.979260123f, -0.202607039f, - 0.978948175f, -0.204108966f, - 0.978633924f, -0.205610413f, - 0.978317371f, -0.207111376f, - 0.977998515f, -0.208611852f, - 0.977677358f, -0.210111837f, - 0.977353900f, -0.211611327f, - 0.977028143f, -0.213110320f, - 0.976700086f, -0.214608811f, - 0.976369731f, -0.216106797f, - 0.976037079f, -0.217604275f, - 0.975702130f, -0.219101240f, - 0.975364885f, -0.220597690f, - 0.975025345f, -0.222093621f, - 0.974683511f, -0.223589029f, - 0.974339383f, -0.225083911f, - 0.973992962f, -0.226578264f, - 0.973644250f, -0.228072083f, - 0.973293246f, -0.229565366f, - 0.972939952f, -0.231058108f, - 0.972584369f, -0.232550307f, - 0.972226497f, -0.234041959f, - 0.971866337f, -0.235533059f, - 0.971503891f, -0.237023606f, - 0.971139158f, -0.238513595f, - 0.970772141f, -0.240003022f, - 0.970402839f, -0.241491885f, - 0.970031253f, -0.242980180f, - 0.969657385f, -0.244467903f, - 0.969281235f, -0.245955050f, - 0.968902805f, -0.247441619f, - 0.968522094f, -0.248927606f, - 0.968139105f, -0.250413007f, - 0.967753837f, -0.251897818f, - 0.967366292f, -0.253382037f, - 0.966976471f, -0.254865660f, - 0.966584374f, -0.256348682f, - 0.966190003f, -0.257831102f, - 0.965793359f, -0.259312915f, - 0.965394442f, -0.260794118f, - 0.964993253f, -0.262274707f, - 0.964589793f, -0.263754679f, - 0.964184064f, -0.265234030f, - 0.963776066f, -0.266712757f, - 0.963365800f, -0.268190857f, - 0.962953267f, -0.269668326f, - 0.962538468f, -0.271145160f, - 0.962121404f, -0.272621355f, - 0.961702077f, -0.274096910f, - 0.961280486f, -0.275571819f, - 0.960856633f, -0.277046080f, - 0.960430519f, -0.278519689f, - 0.960002146f, -0.279992643f, - 0.959571513f, -0.281464938f, - 0.959138622f, -0.282936570f, - 0.958703475f, -0.284407537f, - 0.958266071f, -0.285877835f, - 0.957826413f, -0.287347460f, - 0.957384501f, -0.288816408f, - 0.956940336f, -0.290284677f, - 0.956493919f, -0.291752263f, - 0.956045251f, -0.293219163f, - 0.955594334f, -0.294685372f, - 0.955141168f, -0.296150888f, - 0.954685755f, -0.297615707f, - 0.954228095f, -0.299079826f, - 0.953768190f, -0.300543241f, - 0.953306040f, -0.302005949f, - 0.952841648f, -0.303467947f, - 0.952375013f, -0.304929230f, - 0.951906137f, -0.306389795f, - 0.951435021f, -0.307849640f, - 0.950961666f, -0.309308760f, - 0.950486074f, -0.310767153f, - 0.950008245f, -0.312224814f, - 0.949528181f, -0.313681740f, - 0.949045882f, -0.315137929f, - 0.948561350f, -0.316593376f, - 0.948074586f, -0.318048077f, - 0.947585591f, -0.319502031f, - 0.947094366f, -0.320955232f, - 0.946600913f, -0.322407679f, - 0.946105232f, -0.323859367f, - 0.945607325f, -0.325310292f, - 0.945107193f, -0.326760452f, - 0.944604837f, -0.328209844f, - 0.944100258f, -0.329658463f, - 0.943593458f, -0.331106306f, - 0.943084437f, -0.332553370f, - 0.942573198f, -0.333999651f, - 0.942059740f, -0.335445147f, - 0.941544065f, -0.336889853f, - 0.941026175f, -0.338333767f, - 0.940506071f, -0.339776884f, - 0.939983753f, -0.341219202f, - 0.939459224f, -0.342660717f, - 0.938932484f, -0.344101426f, - 0.938403534f, -0.345541325f, - 0.937872376f, -0.346980411f, - 0.937339012f, -0.348418680f, - 0.936803442f, -0.349856130f, - 0.936265667f, -0.351292756f, - 0.935725689f, -0.352728556f, - 0.935183510f, -0.354163525f, - 0.934639130f, -0.355597662f, - 0.934092550f, -0.357030961f, - 0.933543773f, -0.358463421f, - 0.932992799f, -0.359895037f, - 0.932439629f, -0.361325806f, - 0.931884266f, -0.362755724f, - 0.931326709f, -0.364184790f, - 0.930766961f, -0.365612998f, - 0.930205023f, -0.367040346f, - 0.929640896f, -0.368466830f, - 0.929074581f, -0.369892447f, - 0.928506080f, -0.371317194f, - 0.927935395f, -0.372741067f, - 0.927362526f, -0.374164063f, - 0.926787474f, -0.375586178f, - 0.926210242f, -0.377007410f, - 0.925630831f, -0.378427755f, - 0.925049241f, -0.379847209f, - 0.924465474f, -0.381265769f, - 0.923879533f, -0.382683432f, - 0.923291417f, -0.384100195f, - 0.922701128f, -0.385516054f, - 0.922108669f, -0.386931006f, - 0.921514039f, -0.388345047f, - 0.920917242f, -0.389758174f, - 0.920318277f, -0.391170384f, - 0.919717146f, -0.392581674f, - 0.919113852f, -0.393992040f, - 0.918508394f, -0.395401479f, - 0.917900776f, -0.396809987f, - 0.917290997f, -0.398217562f, - 0.916679060f, -0.399624200f, - 0.916064966f, -0.401029897f, - 0.915448716f, -0.402434651f, - 0.914830312f, -0.403838458f, - 0.914209756f, -0.405241314f, - 0.913587048f, -0.406643217f, - 0.912962190f, -0.408044163f, - 0.912335185f, -0.409444149f, - 0.911706032f, -0.410843171f, - 0.911074734f, -0.412241227f, - 0.910441292f, -0.413638312f, - 0.909805708f, -0.415034424f, - 0.909167983f, -0.416429560f, - 0.908528119f, -0.417823716f, - 0.907886116f, -0.419216888f, - 0.907241978f, -0.420609074f, - 0.906595705f, -0.422000271f, - 0.905947298f, -0.423390474f, - 0.905296759f, -0.424779681f, - 0.904644091f, -0.426167889f, - 0.903989293f, -0.427555093f, - 0.903332368f, -0.428941292f, - 0.902673318f, -0.430326481f, - 0.902012144f, -0.431710658f, - 0.901348847f, -0.433093819f, - 0.900683429f, -0.434475961f, - 0.900015892f, -0.435857080f, - 0.899346237f, -0.437237174f, - 0.898674466f, -0.438616239f, - 0.898000580f, -0.439994271f, - 0.897324581f, -0.441371269f, - 0.896646470f, -0.442747228f, - 0.895966250f, -0.444122145f, - 0.895283921f, -0.445496017f, - 0.894599486f, -0.446868840f, - 0.893912945f, -0.448240612f, - 0.893224301f, -0.449611330f, - 0.892533555f, -0.450980989f, - 0.891840709f, -0.452349587f, - 0.891145765f, -0.453717121f, - 0.890448723f, -0.455083587f, - 0.889749586f, -0.456448982f, - 0.889048356f, -0.457813304f, - 0.888345033f, -0.459176548f, - 0.887639620f, -0.460538711f, - 0.886932119f, -0.461899791f, - 0.886222530f, -0.463259784f, - 0.885510856f, -0.464618686f, - 0.884797098f, -0.465976496f, - 0.884081259f, -0.467333209f, - 0.883363339f, -0.468688822f, - 0.882643340f, -0.470043332f, - 0.881921264f, -0.471396737f, - 0.881197113f, -0.472749032f, - 0.880470889f, -0.474100215f, - 0.879742593f, -0.475450282f, - 0.879012226f, -0.476799230f, - 0.878279792f, -0.478147056f, - 0.877545290f, -0.479493758f, - 0.876808724f, -0.480839331f, - 0.876070094f, -0.482183772f, - 0.875329403f, -0.483527079f, - 0.874586652f, -0.484869248f, - 0.873841843f, -0.486210276f, - 0.873094978f, -0.487550160f, - 0.872346059f, -0.488888897f, - 0.871595087f, -0.490226483f, - 0.870842063f, -0.491562916f, - 0.870086991f, -0.492898192f, - 0.869329871f, -0.494232309f, - 0.868570706f, -0.495565262f, - 0.867809497f, -0.496897049f, - 0.867046246f, -0.498227667f, - 0.866280954f, -0.499557113f, - 0.865513624f, -0.500885383f, - 0.864744258f, -0.502212474f, - 0.863972856f, -0.503538384f, - 0.863199422f, -0.504863109f, - 0.862423956f, -0.506186645f, - 0.861646461f, -0.507508991f, - 0.860866939f, -0.508830143f, - 0.860085390f, -0.510150097f, - 0.859301818f, -0.511468850f, - 0.858516224f, -0.512786401f, - 0.857728610f, -0.514102744f, - 0.856938977f, -0.515417878f, - 0.856147328f, -0.516731799f, - 0.855353665f, -0.518044504f, - 0.854557988f, -0.519355990f, - 0.853760301f, -0.520666254f, - 0.852960605f, -0.521975293f, - 0.852158902f, -0.523283103f, - 0.851355193f, -0.524589683f, - 0.850549481f, -0.525895027f, - 0.849741768f, -0.527199135f, - 0.848932055f, -0.528502002f, - 0.848120345f, -0.529803625f, - 0.847306639f, -0.531104001f, - 0.846490939f, -0.532403128f, - 0.845673247f, -0.533701002f, - 0.844853565f, -0.534997620f, - 0.844031895f, -0.536292979f, - 0.843208240f, -0.537587076f, - 0.842382600f, -0.538879909f, - 0.841554977f, -0.540171473f, - 0.840725375f, -0.541461766f, - 0.839893794f, -0.542750785f, - 0.839060237f, -0.544038527f, - 0.838224706f, -0.545324988f, - 0.837387202f, -0.546610167f, - 0.836547727f, -0.547894059f, - 0.835706284f, -0.549176662f, - 0.834862875f, -0.550457973f, - 0.834017501f, -0.551737988f, - 0.833170165f, -0.553016706f, - 0.832320868f, -0.554294121f, - 0.831469612f, -0.555570233f, - 0.830616400f, -0.556845037f, - 0.829761234f, -0.558118531f, - 0.828904115f, -0.559390712f, - 0.828045045f, -0.560661576f, - 0.827184027f, -0.561931121f, - 0.826321063f, -0.563199344f, - 0.825456154f, -0.564466242f, - 0.824589303f, -0.565731811f, - 0.823720511f, -0.566996049f, - 0.822849781f, -0.568258953f, - 0.821977115f, -0.569520519f, - 0.821102515f, -0.570780746f, - 0.820225983f, -0.572039629f, - 0.819347520f, -0.573297167f, - 0.818467130f, -0.574553355f, - 0.817584813f, -0.575808191f, - 0.816700573f, -0.577061673f, - 0.815814411f, -0.578313796f, - 0.814926329f, -0.579564559f, - 0.814036330f, -0.580813958f, - 0.813144415f, -0.582061990f, - 0.812250587f, -0.583308653f, - 0.811354847f, -0.584553943f, - 0.810457198f, -0.585797857f, - 0.809557642f, -0.587040394f, - 0.808656182f, -0.588281548f, - 0.807752818f, -0.589521319f, - 0.806847554f, -0.590759702f, - 0.805940391f, -0.591996695f, - 0.805031331f, -0.593232295f, - 0.804120377f, -0.594466499f, - 0.803207531f, -0.595699304f, - 0.802292796f, -0.596930708f, - 0.801376172f, -0.598160707f, - 0.800457662f, -0.599389298f, - 0.799537269f, -0.600616479f, - 0.798614995f, -0.601842247f, - 0.797690841f, -0.603066599f, - 0.796764810f, -0.604289531f, - 0.795836905f, -0.605511041f, - 0.794907126f, -0.606731127f, - 0.793975478f, -0.607949785f, - 0.793041960f, -0.609167012f, - 0.792106577f, -0.610382806f, - 0.791169330f, -0.611597164f, - 0.790230221f, -0.612810082f, - 0.789289253f, -0.614021559f, - 0.788346428f, -0.615231591f, - 0.787401747f, -0.616440175f, - 0.786455214f, -0.617647308f, - 0.785506830f, -0.618852988f, - 0.784556597f, -0.620057212f, - 0.783604519f, -0.621259977f, - 0.782650596f, -0.622461279f, - 0.781694832f, -0.623661118f, - 0.780737229f, -0.624859488f, - 0.779777788f, -0.626056388f, - 0.778816512f, -0.627251815f, - 0.777853404f, -0.628445767f, - 0.776888466f, -0.629638239f, - 0.775921699f, -0.630829230f, - 0.774953107f, -0.632018736f, - 0.773982691f, -0.633206755f, - 0.773010453f, -0.634393284f, - 0.772036397f, -0.635578320f, - 0.771060524f, -0.636761861f, - 0.770082837f, -0.637943904f, - 0.769103338f, -0.639124445f, - 0.768122029f, -0.640303482f, - 0.767138912f, -0.641481013f, - 0.766153990f, -0.642657034f, - 0.765167266f, -0.643831543f, - 0.764178741f, -0.645004537f, - 0.763188417f, -0.646176013f, - 0.762196298f, -0.647345969f, - 0.761202385f, -0.648514401f, - 0.760206682f, -0.649681307f, - 0.759209189f, -0.650846685f, - 0.758209910f, -0.652010531f, - 0.757208847f, -0.653172843f, - 0.756206001f, -0.654333618f, - 0.755201377f, -0.655492853f, - 0.754194975f, -0.656650546f, - 0.753186799f, -0.657806693f, - 0.752176850f, -0.658961293f, - 0.751165132f, -0.660114342f, - 0.750151646f, -0.661265838f, - 0.749136395f, -0.662415778f, - 0.748119380f, -0.663564159f, - 0.747100606f, -0.664710978f, - 0.746080074f, -0.665856234f, - 0.745057785f, -0.666999922f, - 0.744033744f, -0.668142041f, - 0.743007952f, -0.669282588f, - 0.741980412f, -0.670421560f, - 0.740951125f, -0.671558955f, - 0.739920095f, -0.672694769f, - 0.738887324f, -0.673829000f, - 0.737852815f, -0.674961646f, - 0.736816569f, -0.676092704f, - 0.735778589f, -0.677222170f, - 0.734738878f, -0.678350043f, - 0.733697438f, -0.679476320f, - 0.732654272f, -0.680600998f, - 0.731609381f, -0.681724074f, - 0.730562769f, -0.682845546f, - 0.729514438f, -0.683965412f, - 0.728464390f, -0.685083668f, - 0.727412629f, -0.686200312f, - 0.726359155f, -0.687315341f, - 0.725303972f, -0.688428753f, - 0.724247083f, -0.689540545f, - 0.723188489f, -0.690650714f, - 0.722128194f, -0.691759258f, - 0.721066199f, -0.692866175f, - 0.720002508f, -0.693971461f, - 0.718937122f, -0.695075114f, - 0.717870045f, -0.696177131f, - 0.716801279f, -0.697277511f, - 0.715730825f, -0.698376249f, - 0.714658688f, -0.699473345f, - 0.713584869f, -0.700568794f, - 0.712509371f, -0.701662595f, - 0.711432196f, -0.702754744f, - 0.710353347f, -0.703845241f, - 0.709272826f, -0.704934080f, - 0.708190637f, -0.706021261f, - 0.707106781f, -0.707106781f, - 0.706021261f, -0.708190637f, - 0.704934080f, -0.709272826f, - 0.703845241f, -0.710353347f, - 0.702754744f, -0.711432196f, - 0.701662595f, -0.712509371f, - 0.700568794f, -0.713584869f, - 0.699473345f, -0.714658688f, - 0.698376249f, -0.715730825f, - 0.697277511f, -0.716801279f, - 0.696177131f, -0.717870045f, - 0.695075114f, -0.718937122f, - 0.693971461f, -0.720002508f, - 0.692866175f, -0.721066199f, - 0.691759258f, -0.722128194f, - 0.690650714f, -0.723188489f, - 0.689540545f, -0.724247083f, - 0.688428753f, -0.725303972f, - 0.687315341f, -0.726359155f, - 0.686200312f, -0.727412629f, - 0.685083668f, -0.728464390f, - 0.683965412f, -0.729514438f, - 0.682845546f, -0.730562769f, - 0.681724074f, -0.731609381f, - 0.680600998f, -0.732654272f, - 0.679476320f, -0.733697438f, - 0.678350043f, -0.734738878f, - 0.677222170f, -0.735778589f, - 0.676092704f, -0.736816569f, - 0.674961646f, -0.737852815f, - 0.673829000f, -0.738887324f, - 0.672694769f, -0.739920095f, - 0.671558955f, -0.740951125f, - 0.670421560f, -0.741980412f, - 0.669282588f, -0.743007952f, - 0.668142041f, -0.744033744f, - 0.666999922f, -0.745057785f, - 0.665856234f, -0.746080074f, - 0.664710978f, -0.747100606f, - 0.663564159f, -0.748119380f, - 0.662415778f, -0.749136395f, - 0.661265838f, -0.750151646f, - 0.660114342f, -0.751165132f, - 0.658961293f, -0.752176850f, - 0.657806693f, -0.753186799f, - 0.656650546f, -0.754194975f, - 0.655492853f, -0.755201377f, - 0.654333618f, -0.756206001f, - 0.653172843f, -0.757208847f, - 0.652010531f, -0.758209910f, - 0.650846685f, -0.759209189f, - 0.649681307f, -0.760206682f, - 0.648514401f, -0.761202385f, - 0.647345969f, -0.762196298f, - 0.646176013f, -0.763188417f, - 0.645004537f, -0.764178741f, - 0.643831543f, -0.765167266f, - 0.642657034f, -0.766153990f, - 0.641481013f, -0.767138912f, - 0.640303482f, -0.768122029f, - 0.639124445f, -0.769103338f, - 0.637943904f, -0.770082837f, - 0.636761861f, -0.771060524f, - 0.635578320f, -0.772036397f, - 0.634393284f, -0.773010453f, - 0.633206755f, -0.773982691f, - 0.632018736f, -0.774953107f, - 0.630829230f, -0.775921699f, - 0.629638239f, -0.776888466f, - 0.628445767f, -0.777853404f, - 0.627251815f, -0.778816512f, - 0.626056388f, -0.779777788f, - 0.624859488f, -0.780737229f, - 0.623661118f, -0.781694832f, - 0.622461279f, -0.782650596f, - 0.621259977f, -0.783604519f, - 0.620057212f, -0.784556597f, - 0.618852988f, -0.785506830f, - 0.617647308f, -0.786455214f, - 0.616440175f, -0.787401747f, - 0.615231591f, -0.788346428f, - 0.614021559f, -0.789289253f, - 0.612810082f, -0.790230221f, - 0.611597164f, -0.791169330f, - 0.610382806f, -0.792106577f, - 0.609167012f, -0.793041960f, - 0.607949785f, -0.793975478f, - 0.606731127f, -0.794907126f, - 0.605511041f, -0.795836905f, - 0.604289531f, -0.796764810f, - 0.603066599f, -0.797690841f, - 0.601842247f, -0.798614995f, - 0.600616479f, -0.799537269f, - 0.599389298f, -0.800457662f, - 0.598160707f, -0.801376172f, - 0.596930708f, -0.802292796f, - 0.595699304f, -0.803207531f, - 0.594466499f, -0.804120377f, - 0.593232295f, -0.805031331f, - 0.591996695f, -0.805940391f, - 0.590759702f, -0.806847554f, - 0.589521319f, -0.807752818f, - 0.588281548f, -0.808656182f, - 0.587040394f, -0.809557642f, - 0.585797857f, -0.810457198f, - 0.584553943f, -0.811354847f, - 0.583308653f, -0.812250587f, - 0.582061990f, -0.813144415f, - 0.580813958f, -0.814036330f, - 0.579564559f, -0.814926329f, - 0.578313796f, -0.815814411f, - 0.577061673f, -0.816700573f, - 0.575808191f, -0.817584813f, - 0.574553355f, -0.818467130f, - 0.573297167f, -0.819347520f, - 0.572039629f, -0.820225983f, - 0.570780746f, -0.821102515f, - 0.569520519f, -0.821977115f, - 0.568258953f, -0.822849781f, - 0.566996049f, -0.823720511f, - 0.565731811f, -0.824589303f, - 0.564466242f, -0.825456154f, - 0.563199344f, -0.826321063f, - 0.561931121f, -0.827184027f, - 0.560661576f, -0.828045045f, - 0.559390712f, -0.828904115f, - 0.558118531f, -0.829761234f, - 0.556845037f, -0.830616400f, - 0.555570233f, -0.831469612f, - 0.554294121f, -0.832320868f, - 0.553016706f, -0.833170165f, - 0.551737988f, -0.834017501f, - 0.550457973f, -0.834862875f, - 0.549176662f, -0.835706284f, - 0.547894059f, -0.836547727f, - 0.546610167f, -0.837387202f, - 0.545324988f, -0.838224706f, - 0.544038527f, -0.839060237f, - 0.542750785f, -0.839893794f, - 0.541461766f, -0.840725375f, - 0.540171473f, -0.841554977f, - 0.538879909f, -0.842382600f, - 0.537587076f, -0.843208240f, - 0.536292979f, -0.844031895f, - 0.534997620f, -0.844853565f, - 0.533701002f, -0.845673247f, - 0.532403128f, -0.846490939f, - 0.531104001f, -0.847306639f, - 0.529803625f, -0.848120345f, - 0.528502002f, -0.848932055f, - 0.527199135f, -0.849741768f, - 0.525895027f, -0.850549481f, - 0.524589683f, -0.851355193f, - 0.523283103f, -0.852158902f, - 0.521975293f, -0.852960605f, - 0.520666254f, -0.853760301f, - 0.519355990f, -0.854557988f, - 0.518044504f, -0.855353665f, - 0.516731799f, -0.856147328f, - 0.515417878f, -0.856938977f, - 0.514102744f, -0.857728610f, - 0.512786401f, -0.858516224f, - 0.511468850f, -0.859301818f, - 0.510150097f, -0.860085390f, - 0.508830143f, -0.860866939f, - 0.507508991f, -0.861646461f, - 0.506186645f, -0.862423956f, - 0.504863109f, -0.863199422f, - 0.503538384f, -0.863972856f, - 0.502212474f, -0.864744258f, - 0.500885383f, -0.865513624f, - 0.499557113f, -0.866280954f, - 0.498227667f, -0.867046246f, - 0.496897049f, -0.867809497f, - 0.495565262f, -0.868570706f, - 0.494232309f, -0.869329871f, - 0.492898192f, -0.870086991f, - 0.491562916f, -0.870842063f, - 0.490226483f, -0.871595087f, - 0.488888897f, -0.872346059f, - 0.487550160f, -0.873094978f, - 0.486210276f, -0.873841843f, - 0.484869248f, -0.874586652f, - 0.483527079f, -0.875329403f, - 0.482183772f, -0.876070094f, - 0.480839331f, -0.876808724f, - 0.479493758f, -0.877545290f, - 0.478147056f, -0.878279792f, - 0.476799230f, -0.879012226f, - 0.475450282f, -0.879742593f, - 0.474100215f, -0.880470889f, - 0.472749032f, -0.881197113f, - 0.471396737f, -0.881921264f, - 0.470043332f, -0.882643340f, - 0.468688822f, -0.883363339f, - 0.467333209f, -0.884081259f, - 0.465976496f, -0.884797098f, - 0.464618686f, -0.885510856f, - 0.463259784f, -0.886222530f, - 0.461899791f, -0.886932119f, - 0.460538711f, -0.887639620f, - 0.459176548f, -0.888345033f, - 0.457813304f, -0.889048356f, - 0.456448982f, -0.889749586f, - 0.455083587f, -0.890448723f, - 0.453717121f, -0.891145765f, - 0.452349587f, -0.891840709f, - 0.450980989f, -0.892533555f, - 0.449611330f, -0.893224301f, - 0.448240612f, -0.893912945f, - 0.446868840f, -0.894599486f, - 0.445496017f, -0.895283921f, - 0.444122145f, -0.895966250f, - 0.442747228f, -0.896646470f, - 0.441371269f, -0.897324581f, - 0.439994271f, -0.898000580f, - 0.438616239f, -0.898674466f, - 0.437237174f, -0.899346237f, - 0.435857080f, -0.900015892f, - 0.434475961f, -0.900683429f, - 0.433093819f, -0.901348847f, - 0.431710658f, -0.902012144f, - 0.430326481f, -0.902673318f, - 0.428941292f, -0.903332368f, - 0.427555093f, -0.903989293f, - 0.426167889f, -0.904644091f, - 0.424779681f, -0.905296759f, - 0.423390474f, -0.905947298f, - 0.422000271f, -0.906595705f, - 0.420609074f, -0.907241978f, - 0.419216888f, -0.907886116f, - 0.417823716f, -0.908528119f, - 0.416429560f, -0.909167983f, - 0.415034424f, -0.909805708f, - 0.413638312f, -0.910441292f, - 0.412241227f, -0.911074734f, - 0.410843171f, -0.911706032f, - 0.409444149f, -0.912335185f, - 0.408044163f, -0.912962190f, - 0.406643217f, -0.913587048f, - 0.405241314f, -0.914209756f, - 0.403838458f, -0.914830312f, - 0.402434651f, -0.915448716f, - 0.401029897f, -0.916064966f, - 0.399624200f, -0.916679060f, - 0.398217562f, -0.917290997f, - 0.396809987f, -0.917900776f, - 0.395401479f, -0.918508394f, - 0.393992040f, -0.919113852f, - 0.392581674f, -0.919717146f, - 0.391170384f, -0.920318277f, - 0.389758174f, -0.920917242f, - 0.388345047f, -0.921514039f, - 0.386931006f, -0.922108669f, - 0.385516054f, -0.922701128f, - 0.384100195f, -0.923291417f, - 0.382683432f, -0.923879533f, - 0.381265769f, -0.924465474f, - 0.379847209f, -0.925049241f, - 0.378427755f, -0.925630831f, - 0.377007410f, -0.926210242f, - 0.375586178f, -0.926787474f, - 0.374164063f, -0.927362526f, - 0.372741067f, -0.927935395f, - 0.371317194f, -0.928506080f, - 0.369892447f, -0.929074581f, - 0.368466830f, -0.929640896f, - 0.367040346f, -0.930205023f, - 0.365612998f, -0.930766961f, - 0.364184790f, -0.931326709f, - 0.362755724f, -0.931884266f, - 0.361325806f, -0.932439629f, - 0.359895037f, -0.932992799f, - 0.358463421f, -0.933543773f, - 0.357030961f, -0.934092550f, - 0.355597662f, -0.934639130f, - 0.354163525f, -0.935183510f, - 0.352728556f, -0.935725689f, - 0.351292756f, -0.936265667f, - 0.349856130f, -0.936803442f, - 0.348418680f, -0.937339012f, - 0.346980411f, -0.937872376f, - 0.345541325f, -0.938403534f, - 0.344101426f, -0.938932484f, - 0.342660717f, -0.939459224f, - 0.341219202f, -0.939983753f, - 0.339776884f, -0.940506071f, - 0.338333767f, -0.941026175f, - 0.336889853f, -0.941544065f, - 0.335445147f, -0.942059740f, - 0.333999651f, -0.942573198f, - 0.332553370f, -0.943084437f, - 0.331106306f, -0.943593458f, - 0.329658463f, -0.944100258f, - 0.328209844f, -0.944604837f, - 0.326760452f, -0.945107193f, - 0.325310292f, -0.945607325f, - 0.323859367f, -0.946105232f, - 0.322407679f, -0.946600913f, - 0.320955232f, -0.947094366f, - 0.319502031f, -0.947585591f, - 0.318048077f, -0.948074586f, - 0.316593376f, -0.948561350f, - 0.315137929f, -0.949045882f, - 0.313681740f, -0.949528181f, - 0.312224814f, -0.950008245f, - 0.310767153f, -0.950486074f, - 0.309308760f, -0.950961666f, - 0.307849640f, -0.951435021f, - 0.306389795f, -0.951906137f, - 0.304929230f, -0.952375013f, - 0.303467947f, -0.952841648f, - 0.302005949f, -0.953306040f, - 0.300543241f, -0.953768190f, - 0.299079826f, -0.954228095f, - 0.297615707f, -0.954685755f, - 0.296150888f, -0.955141168f, - 0.294685372f, -0.955594334f, - 0.293219163f, -0.956045251f, - 0.291752263f, -0.956493919f, - 0.290284677f, -0.956940336f, - 0.288816408f, -0.957384501f, - 0.287347460f, -0.957826413f, - 0.285877835f, -0.958266071f, - 0.284407537f, -0.958703475f, - 0.282936570f, -0.959138622f, - 0.281464938f, -0.959571513f, - 0.279992643f, -0.960002146f, - 0.278519689f, -0.960430519f, - 0.277046080f, -0.960856633f, - 0.275571819f, -0.961280486f, - 0.274096910f, -0.961702077f, - 0.272621355f, -0.962121404f, - 0.271145160f, -0.962538468f, - 0.269668326f, -0.962953267f, - 0.268190857f, -0.963365800f, - 0.266712757f, -0.963776066f, - 0.265234030f, -0.964184064f, - 0.263754679f, -0.964589793f, - 0.262274707f, -0.964993253f, - 0.260794118f, -0.965394442f, - 0.259312915f, -0.965793359f, - 0.257831102f, -0.966190003f, - 0.256348682f, -0.966584374f, - 0.254865660f, -0.966976471f, - 0.253382037f, -0.967366292f, - 0.251897818f, -0.967753837f, - 0.250413007f, -0.968139105f, - 0.248927606f, -0.968522094f, - 0.247441619f, -0.968902805f, - 0.245955050f, -0.969281235f, - 0.244467903f, -0.969657385f, - 0.242980180f, -0.970031253f, - 0.241491885f, -0.970402839f, - 0.240003022f, -0.970772141f, - 0.238513595f, -0.971139158f, - 0.237023606f, -0.971503891f, - 0.235533059f, -0.971866337f, - 0.234041959f, -0.972226497f, - 0.232550307f, -0.972584369f, - 0.231058108f, -0.972939952f, - 0.229565366f, -0.973293246f, - 0.228072083f, -0.973644250f, - 0.226578264f, -0.973992962f, - 0.225083911f, -0.974339383f, - 0.223589029f, -0.974683511f, - 0.222093621f, -0.975025345f, - 0.220597690f, -0.975364885f, - 0.219101240f, -0.975702130f, - 0.217604275f, -0.976037079f, - 0.216106797f, -0.976369731f, - 0.214608811f, -0.976700086f, - 0.213110320f, -0.977028143f, - 0.211611327f, -0.977353900f, - 0.210111837f, -0.977677358f, - 0.208611852f, -0.977998515f, - 0.207111376f, -0.978317371f, - 0.205610413f, -0.978633924f, - 0.204108966f, -0.978948175f, - 0.202607039f, -0.979260123f, - 0.201104635f, -0.979569766f, - 0.199601758f, -0.979877104f, - 0.198098411f, -0.980182136f, - 0.196594598f, -0.980484862f, - 0.195090322f, -0.980785280f, - 0.193585587f, -0.981083391f, - 0.192080397f, -0.981379193f, - 0.190574755f, -0.981672686f, - 0.189068664f, -0.981963869f, - 0.187562129f, -0.982252741f, - 0.186055152f, -0.982539302f, - 0.184547737f, -0.982823551f, - 0.183039888f, -0.983105487f, - 0.181531608f, -0.983385110f, - 0.180022901f, -0.983662419f, - 0.178513771f, -0.983937413f, - 0.177004220f, -0.984210092f, - 0.175494253f, -0.984480455f, - 0.173983873f, -0.984748502f, - 0.172473084f, -0.985014231f, - 0.170961889f, -0.985277642f, - 0.169450291f, -0.985538735f, - 0.167938295f, -0.985797509f, - 0.166425904f, -0.986053963f, - 0.164913120f, -0.986308097f, - 0.163399949f, -0.986559910f, - 0.161886394f, -0.986809402f, - 0.160372457f, -0.987056571f, - 0.158858143f, -0.987301418f, - 0.157343456f, -0.987543942f, - 0.155828398f, -0.987784142f, - 0.154312973f, -0.988022017f, - 0.152797185f, -0.988257568f, - 0.151281038f, -0.988490793f, - 0.149764535f, -0.988721692f, - 0.148247679f, -0.988950265f, - 0.146730474f, -0.989176510f, - 0.145212925f, -0.989400428f, - 0.143695033f, -0.989622017f, - 0.142176804f, -0.989841278f, - 0.140658239f, -0.990058210f, - 0.139139344f, -0.990272812f, - 0.137620122f, -0.990485084f, - 0.136100575f, -0.990695025f, - 0.134580709f, -0.990902635f, - 0.133060525f, -0.991107914f, - 0.131540029f, -0.991310860f, - 0.130019223f, -0.991511473f, - 0.128498111f, -0.991709754f, - 0.126976696f, -0.991905700f, - 0.125454983f, -0.992099313f, - 0.123932975f, -0.992290591f, - 0.122410675f, -0.992479535f, - 0.120888087f, -0.992666142f, - 0.119365215f, -0.992850414f, - 0.117842062f, -0.993032350f, - 0.116318631f, -0.993211949f, - 0.114794927f, -0.993389211f, - 0.113270952f, -0.993564136f, - 0.111746711f, -0.993736722f, - 0.110222207f, -0.993906970f, - 0.108697444f, -0.994074879f, - 0.107172425f, -0.994240449f, - 0.105647154f, -0.994403680f, - 0.104121634f, -0.994564571f, - 0.102595869f, -0.994723121f, - 0.101069863f, -0.994879331f, - 0.099543619f, -0.995033199f, - 0.098017140f, -0.995184727f, - 0.096490431f, -0.995333912f, - 0.094963495f, -0.995480755f, - 0.093436336f, -0.995625256f, - 0.091908956f, -0.995767414f, - 0.090381361f, -0.995907229f, - 0.088853553f, -0.996044701f, - 0.087325535f, -0.996179829f, - 0.085797312f, -0.996312612f, - 0.084268888f, -0.996443051f, - 0.082740265f, -0.996571146f, - 0.081211447f, -0.996696895f, - 0.079682438f, -0.996820299f, - 0.078153242f, -0.996941358f, - 0.076623861f, -0.997060070f, - 0.075094301f, -0.997176437f, - 0.073564564f, -0.997290457f, - 0.072034653f, -0.997402130f, - 0.070504573f, -0.997511456f, - 0.068974328f, -0.997618435f, - 0.067443920f, -0.997723067f, - 0.065913353f, -0.997825350f, - 0.064382631f, -0.997925286f, - 0.062851758f, -0.998022874f, - 0.061320736f, -0.998118113f, - 0.059789571f, -0.998211003f, - 0.058258265f, -0.998301545f, - 0.056726821f, -0.998389737f, - 0.055195244f, -0.998475581f, - 0.053663538f, -0.998559074f, - 0.052131705f, -0.998640218f, - 0.050599749f, -0.998719012f, - 0.049067674f, -0.998795456f, - 0.047535484f, -0.998869550f, - 0.046003182f, -0.998941293f, - 0.044470772f, -0.999010686f, - 0.042938257f, -0.999077728f, - 0.041405641f, -0.999142419f, - 0.039872928f, -0.999204759f, - 0.038340120f, -0.999264747f, - 0.036807223f, -0.999322385f, - 0.035274239f, -0.999377670f, - 0.033741172f, -0.999430605f, - 0.032208025f, -0.999481187f, - 0.030674803f, -0.999529418f, - 0.029141509f, -0.999575296f, - 0.027608146f, -0.999618822f, - 0.026074718f, -0.999659997f, - 0.024541229f, -0.999698819f, - 0.023007681f, -0.999735288f, - 0.021474080f, -0.999769405f, - 0.019940429f, -0.999801170f, - 0.018406730f, -0.999830582f, - 0.016872988f, -0.999857641f, - 0.015339206f, -0.999882347f, - 0.013805389f, -0.999904701f, - 0.012271538f, -0.999924702f, - 0.010737659f, -0.999942350f, - 0.009203755f, -0.999957645f, - 0.007669829f, -0.999970586f, - 0.006135885f, -0.999981175f, - 0.004601926f, -0.999989411f, - 0.003067957f, -0.999995294f, - 0.001533980f, -0.999998823f -}; - - -/** - * \par - * Example code for the generation of the floating-point sine table: - *
- * tableSize = 512;    
- * for(n = 0; n < (tableSize + 1); n++)    
- * {    
- *	sinTable[n]=sin(2*pi*n/tableSize);    
- * }
- * \par - * where pi value is 3.14159265358979 - */ - -const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1] = { - 0.00000000f, 0.01227154f, 0.02454123f, 0.03680722f, 0.04906767f, 0.06132074f, - 0.07356456f, 0.08579731f, 0.09801714f, 0.11022221f, 0.12241068f, 0.13458071f, - 0.14673047f, 0.15885814f, 0.17096189f, 0.18303989f, 0.19509032f, 0.20711138f, - 0.21910124f, 0.23105811f, 0.24298018f, 0.25486566f, 0.26671276f, 0.27851969f, - 0.29028468f, 0.30200595f, 0.31368174f, 0.32531029f, 0.33688985f, 0.34841868f, - 0.35989504f, 0.37131719f, 0.38268343f, 0.39399204f, 0.40524131f, 0.41642956f, - 0.42755509f, 0.43861624f, 0.44961133f, 0.46053871f, 0.47139674f, 0.48218377f, - 0.49289819f, 0.50353838f, 0.51410274f, 0.52458968f, 0.53499762f, 0.54532499f, - 0.55557023f, 0.56573181f, 0.57580819f, 0.58579786f, 0.59569930f, 0.60551104f, - 0.61523159f, 0.62485949f, 0.63439328f, 0.64383154f, 0.65317284f, 0.66241578f, - 0.67155895f, 0.68060100f, 0.68954054f, 0.69837625f, 0.70710678f, 0.71573083f, - 0.72424708f, 0.73265427f, 0.74095113f, 0.74913639f, 0.75720885f, 0.76516727f, - 0.77301045f, 0.78073723f, 0.78834643f, 0.79583690f, 0.80320753f, 0.81045720f, - 0.81758481f, 0.82458930f, 0.83146961f, 0.83822471f, 0.84485357f, 0.85135519f, - 0.85772861f, 0.86397286f, 0.87008699f, 0.87607009f, 0.88192126f, 0.88763962f, - 0.89322430f, 0.89867447f, 0.90398929f, 0.90916798f, 0.91420976f, 0.91911385f, - 0.92387953f, 0.92850608f, 0.93299280f, 0.93733901f, 0.94154407f, 0.94560733f, - 0.94952818f, 0.95330604f, 0.95694034f, 0.96043052f, 0.96377607f, 0.96697647f, - 0.97003125f, 0.97293995f, 0.97570213f, 0.97831737f, 0.98078528f, 0.98310549f, - 0.98527764f, 0.98730142f, 0.98917651f, 0.99090264f, 0.99247953f, 0.99390697f, - 0.99518473f, 0.99631261f, 0.99729046f, 0.99811811f, 0.99879546f, 0.99932238f, - 0.99969882f, 0.99992470f, 1.00000000f, 0.99992470f, 0.99969882f, 0.99932238f, - 0.99879546f, 0.99811811f, 0.99729046f, 0.99631261f, 0.99518473f, 0.99390697f, - 0.99247953f, 0.99090264f, 0.98917651f, 0.98730142f, 0.98527764f, 0.98310549f, - 0.98078528f, 0.97831737f, 0.97570213f, 0.97293995f, 0.97003125f, 0.96697647f, - 0.96377607f, 0.96043052f, 0.95694034f, 0.95330604f, 0.94952818f, 0.94560733f, - 0.94154407f, 0.93733901f, 0.93299280f, 0.92850608f, 0.92387953f, 0.91911385f, - 0.91420976f, 0.90916798f, 0.90398929f, 0.89867447f, 0.89322430f, 0.88763962f, - 0.88192126f, 0.87607009f, 0.87008699f, 0.86397286f, 0.85772861f, 0.85135519f, - 0.84485357f, 0.83822471f, 0.83146961f, 0.82458930f, 0.81758481f, 0.81045720f, - 0.80320753f, 0.79583690f, 0.78834643f, 0.78073723f, 0.77301045f, 0.76516727f, - 0.75720885f, 0.74913639f, 0.74095113f, 0.73265427f, 0.72424708f, 0.71573083f, - 0.70710678f, 0.69837625f, 0.68954054f, 0.68060100f, 0.67155895f, 0.66241578f, - 0.65317284f, 0.64383154f, 0.63439328f, 0.62485949f, 0.61523159f, 0.60551104f, - 0.59569930f, 0.58579786f, 0.57580819f, 0.56573181f, 0.55557023f, 0.54532499f, - 0.53499762f, 0.52458968f, 0.51410274f, 0.50353838f, 0.49289819f, 0.48218377f, - 0.47139674f, 0.46053871f, 0.44961133f, 0.43861624f, 0.42755509f, 0.41642956f, - 0.40524131f, 0.39399204f, 0.38268343f, 0.37131719f, 0.35989504f, 0.34841868f, - 0.33688985f, 0.32531029f, 0.31368174f, 0.30200595f, 0.29028468f, 0.27851969f, - 0.26671276f, 0.25486566f, 0.24298018f, 0.23105811f, 0.21910124f, 0.20711138f, - 0.19509032f, 0.18303989f, 0.17096189f, 0.15885814f, 0.14673047f, 0.13458071f, - 0.12241068f, 0.11022221f, 0.09801714f, 0.08579731f, 0.07356456f, 0.06132074f, - 0.04906767f, 0.03680722f, 0.02454123f, 0.01227154f, 0.00000000f, -0.01227154f, - -0.02454123f, -0.03680722f, -0.04906767f, -0.06132074f, -0.07356456f, - -0.08579731f, -0.09801714f, -0.11022221f, -0.12241068f, -0.13458071f, - -0.14673047f, -0.15885814f, -0.17096189f, -0.18303989f, -0.19509032f, - -0.20711138f, -0.21910124f, -0.23105811f, -0.24298018f, -0.25486566f, - -0.26671276f, -0.27851969f, -0.29028468f, -0.30200595f, -0.31368174f, - -0.32531029f, -0.33688985f, -0.34841868f, -0.35989504f, -0.37131719f, - -0.38268343f, -0.39399204f, -0.40524131f, -0.41642956f, -0.42755509f, - -0.43861624f, -0.44961133f, -0.46053871f, -0.47139674f, -0.48218377f, - -0.49289819f, -0.50353838f, -0.51410274f, -0.52458968f, -0.53499762f, - -0.54532499f, -0.55557023f, -0.56573181f, -0.57580819f, -0.58579786f, - -0.59569930f, -0.60551104f, -0.61523159f, -0.62485949f, -0.63439328f, - -0.64383154f, -0.65317284f, -0.66241578f, -0.67155895f, -0.68060100f, - -0.68954054f, -0.69837625f, -0.70710678f, -0.71573083f, -0.72424708f, - -0.73265427f, -0.74095113f, -0.74913639f, -0.75720885f, -0.76516727f, - -0.77301045f, -0.78073723f, -0.78834643f, -0.79583690f, -0.80320753f, - -0.81045720f, -0.81758481f, -0.82458930f, -0.83146961f, -0.83822471f, - -0.84485357f, -0.85135519f, -0.85772861f, -0.86397286f, -0.87008699f, - -0.87607009f, -0.88192126f, -0.88763962f, -0.89322430f, -0.89867447f, - -0.90398929f, -0.90916798f, -0.91420976f, -0.91911385f, -0.92387953f, - -0.92850608f, -0.93299280f, -0.93733901f, -0.94154407f, -0.94560733f, - -0.94952818f, -0.95330604f, -0.95694034f, -0.96043052f, -0.96377607f, - -0.96697647f, -0.97003125f, -0.97293995f, -0.97570213f, -0.97831737f, - -0.98078528f, -0.98310549f, -0.98527764f, -0.98730142f, -0.98917651f, - -0.99090264f, -0.99247953f, -0.99390697f, -0.99518473f, -0.99631261f, - -0.99729046f, -0.99811811f, -0.99879546f, -0.99932238f, -0.99969882f, - -0.99992470f, -1.00000000f, -0.99992470f, -0.99969882f, -0.99932238f, - -0.99879546f, -0.99811811f, -0.99729046f, -0.99631261f, -0.99518473f, - -0.99390697f, -0.99247953f, -0.99090264f, -0.98917651f, -0.98730142f, - -0.98527764f, -0.98310549f, -0.98078528f, -0.97831737f, -0.97570213f, - -0.97293995f, -0.97003125f, -0.96697647f, -0.96377607f, -0.96043052f, - -0.95694034f, -0.95330604f, -0.94952818f, -0.94560733f, -0.94154407f, - -0.93733901f, -0.93299280f, -0.92850608f, -0.92387953f, -0.91911385f, - -0.91420976f, -0.90916798f, -0.90398929f, -0.89867447f, -0.89322430f, - -0.88763962f, -0.88192126f, -0.87607009f, -0.87008699f, -0.86397286f, - -0.85772861f, -0.85135519f, -0.84485357f, -0.83822471f, -0.83146961f, - -0.82458930f, -0.81758481f, -0.81045720f, -0.80320753f, -0.79583690f, - -0.78834643f, -0.78073723f, -0.77301045f, -0.76516727f, -0.75720885f, - -0.74913639f, -0.74095113f, -0.73265427f, -0.72424708f, -0.71573083f, - -0.70710678f, -0.69837625f, -0.68954054f, -0.68060100f, -0.67155895f, - -0.66241578f, -0.65317284f, -0.64383154f, -0.63439328f, -0.62485949f, - -0.61523159f, -0.60551104f, -0.59569930f, -0.58579786f, -0.57580819f, - -0.56573181f, -0.55557023f, -0.54532499f, -0.53499762f, -0.52458968f, - -0.51410274f, -0.50353838f, -0.49289819f, -0.48218377f, -0.47139674f, - -0.46053871f, -0.44961133f, -0.43861624f, -0.42755509f, -0.41642956f, - -0.40524131f, -0.39399204f, -0.38268343f, -0.37131719f, -0.35989504f, - -0.34841868f, -0.33688985f, -0.32531029f, -0.31368174f, -0.30200595f, - -0.29028468f, -0.27851969f, -0.26671276f, -0.25486566f, -0.24298018f, - -0.23105811f, -0.21910124f, -0.20711138f, -0.19509032f, -0.18303989f, - -0.17096189f, -0.15885814f, -0.14673047f, -0.13458071f, -0.12241068f, - -0.11022221f, -0.09801714f, -0.08579731f, -0.07356456f, -0.06132074f, - -0.04906767f, -0.03680722f, -0.02454123f, -0.01227154f, -0.00000000f -}; - -/** - * \par - * Table values are in Q31 (1.31 fixed-point format) and generation is done in - * three steps. First, generate sin values in floating point: - *
- * tableSize = 512;      
- * for(n = 0; n < (tableSize + 1); n++)    
- * {    
- *	sinTable[n]= sin(2*pi*n/tableSize);    
- * } 
- * where pi value is 3.14159265358979 - * \par - * Second, convert floating-point to Q31 (Fixed point): - * (sinTable[i] * pow(2, 31)) - * \par - * Finally, round to the nearest integer value: - * sinTable[i] += (sinTable[i] > 0 ? 0.5 :-0.5); - */ -const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1] = { - 0x00000000, 0x01921D20, 0x03242ABF, 0x04B6195D, 0x0647D97C, 0x07D95B9E, - 0x096A9049, 0x0AFB6805, 0x0C8BD35E, 0x0E1BC2E4, 0x0FAB272B, 0x1139F0CF, - 0x12C8106F, 0x145576B1, 0x15E21445, 0x176DD9DE, 0x18F8B83C, 0x1A82A026, - 0x1C0B826A, 0x1D934FE5, 0x1F19F97B, 0x209F701C, 0x2223A4C5, 0x23A6887F, - 0x25280C5E, 0x26A82186, 0x2826B928, 0x29A3C485, 0x2B1F34EB, 0x2C98FBBA, - 0x2E110A62, 0x2F875262, 0x30FBC54D, 0x326E54C7, 0x33DEF287, 0x354D9057, - 0x36BA2014, 0x382493B0, 0x398CDD32, 0x3AF2EEB7, 0x3C56BA70, 0x3DB832A6, - 0x3F1749B8, 0x4073F21D, 0x41CE1E65, 0x4325C135, 0x447ACD50, 0x45CD358F, - 0x471CECE7, 0x4869E665, 0x49B41533, 0x4AFB6C98, 0x4C3FDFF4, 0x4D8162C4, - 0x4EBFE8A5, 0x4FFB654D, 0x5133CC94, 0x5269126E, 0x539B2AF0, 0x54CA0A4B, - 0x55F5A4D2, 0x571DEEFA, 0x5842DD54, 0x59646498, 0x5A82799A, 0x5B9D1154, - 0x5CB420E0, 0x5DC79D7C, 0x5ED77C8A, 0x5FE3B38D, 0x60EC3830, 0x61F1003F, - 0x62F201AC, 0x63EF3290, 0x64E88926, 0x65DDFBD3, 0x66CF8120, 0x67BD0FBD, - 0x68A69E81, 0x698C246C, 0x6A6D98A4, 0x6B4AF279, 0x6C242960, 0x6CF934FC, - 0x6DCA0D14, 0x6E96A99D, 0x6F5F02B2, 0x7023109A, 0x70E2CBC6, 0x719E2CD2, - 0x72552C85, 0x7307C3D0, 0x73B5EBD1, 0x745F9DD1, 0x7504D345, 0x75A585CF, - 0x7641AF3D, 0x76D94989, 0x776C4EDB, 0x77FAB989, 0x78848414, 0x7909A92D, - 0x798A23B1, 0x7A05EEAD, 0x7A7D055B, 0x7AEF6323, 0x7B5D039E, 0x7BC5E290, - 0x7C29FBEE, 0x7C894BDE, 0x7CE3CEB2, 0x7D3980EC, 0x7D8A5F40, 0x7DD6668F, - 0x7E1D93EA, 0x7E5FE493, 0x7E9D55FC, 0x7ED5E5C6, 0x7F0991C4, 0x7F3857F6, - 0x7F62368F, 0x7F872BF3, 0x7FA736B4, 0x7FC25596, 0x7FD8878E, 0x7FE9CBC0, - 0x7FF62182, 0x7FFD885A, 0x7FFFFFFF, 0x7FFD885A, 0x7FF62182, 0x7FE9CBC0, - 0x7FD8878E, 0x7FC25596, 0x7FA736B4, 0x7F872BF3, 0x7F62368F, 0x7F3857F6, - 0x7F0991C4, 0x7ED5E5C6, 0x7E9D55FC, 0x7E5FE493, 0x7E1D93EA, 0x7DD6668F, - 0x7D8A5F40, 0x7D3980EC, 0x7CE3CEB2, 0x7C894BDE, 0x7C29FBEE, 0x7BC5E290, - 0x7B5D039E, 0x7AEF6323, 0x7A7D055B, 0x7A05EEAD, 0x798A23B1, 0x7909A92D, - 0x78848414, 0x77FAB989, 0x776C4EDB, 0x76D94989, 0x7641AF3D, 0x75A585CF, - 0x7504D345, 0x745F9DD1, 0x73B5EBD1, 0x7307C3D0, 0x72552C85, 0x719E2CD2, - 0x70E2CBC6, 0x7023109A, 0x6F5F02B2, 0x6E96A99D, 0x6DCA0D14, 0x6CF934FC, - 0x6C242960, 0x6B4AF279, 0x6A6D98A4, 0x698C246C, 0x68A69E81, 0x67BD0FBD, - 0x66CF8120, 0x65DDFBD3, 0x64E88926, 0x63EF3290, 0x62F201AC, 0x61F1003F, - 0x60EC3830, 0x5FE3B38D, 0x5ED77C8A, 0x5DC79D7C, 0x5CB420E0, 0x5B9D1154, - 0x5A82799A, 0x59646498, 0x5842DD54, 0x571DEEFA, 0x55F5A4D2, 0x54CA0A4B, - 0x539B2AF0, 0x5269126E, 0x5133CC94, 0x4FFB654D, 0x4EBFE8A5, 0x4D8162C4, - 0x4C3FDFF4, 0x4AFB6C98, 0x49B41533, 0x4869E665, 0x471CECE7, 0x45CD358F, - 0x447ACD50, 0x4325C135, 0x41CE1E65, 0x4073F21D, 0x3F1749B8, 0x3DB832A6, - 0x3C56BA70, 0x3AF2EEB7, 0x398CDD32, 0x382493B0, 0x36BA2014, 0x354D9057, - 0x33DEF287, 0x326E54C7, 0x30FBC54D, 0x2F875262, 0x2E110A62, 0x2C98FBBA, - 0x2B1F34EB, 0x29A3C485, 0x2826B928, 0x26A82186, 0x25280C5E, 0x23A6887F, - 0x2223A4C5, 0x209F701C, 0x1F19F97B, 0x1D934FE5, 0x1C0B826A, 0x1A82A026, - 0x18F8B83C, 0x176DD9DE, 0x15E21445, 0x145576B1, 0x12C8106F, 0x1139F0CF, - 0x0FAB272B, 0x0E1BC2E4, 0x0C8BD35E, 0x0AFB6805, 0x096A9049, 0x07D95B9E, - 0x0647D97C, 0x04B6195D, 0x03242ABF, 0x01921D20, 0x00000000, 0xFE6DE2E0, - 0xFCDBD541, 0xFB49E6A3, 0xF9B82684, 0xF826A462, 0xF6956FB7, 0xF50497FB, - 0xF3742CA2, 0xF1E43D1C, 0xF054D8D5, 0xEEC60F31, 0xED37EF91, 0xEBAA894F, - 0xEA1DEBBB, 0xE8922622, 0xE70747C4, 0xE57D5FDA, 0xE3F47D96, 0xE26CB01B, - 0xE0E60685, 0xDF608FE4, 0xDDDC5B3B, 0xDC597781, 0xDAD7F3A2, 0xD957DE7A, - 0xD7D946D8, 0xD65C3B7B, 0xD4E0CB15, 0xD3670446, 0xD1EEF59E, 0xD078AD9E, - 0xCF043AB3, 0xCD91AB39, 0xCC210D79, 0xCAB26FA9, 0xC945DFEC, 0xC7DB6C50, - 0xC67322CE, 0xC50D1149, 0xC3A94590, 0xC247CD5A, 0xC0E8B648, 0xBF8C0DE3, - 0xBE31E19B, 0xBCDA3ECB, 0xBB8532B0, 0xBA32CA71, 0xB8E31319, 0xB796199B, - 0xB64BEACD, 0xB5049368, 0xB3C0200C, 0xB27E9D3C, 0xB140175B, 0xB0049AB3, - 0xAECC336C, 0xAD96ED92, 0xAC64D510, 0xAB35F5B5, 0xAA0A5B2E, 0xA8E21106, - 0xA7BD22AC, 0xA69B9B68, 0xA57D8666, 0xA462EEAC, 0xA34BDF20, 0xA2386284, - 0xA1288376, 0xA01C4C73, 0x9F13C7D0, 0x9E0EFFC1, 0x9D0DFE54, 0x9C10CD70, - 0x9B1776DA, 0x9A22042D, 0x99307EE0, 0x9842F043, 0x9759617F, 0x9673DB94, - 0x9592675C, 0x94B50D87, 0x93DBD6A0, 0x9306CB04, 0x9235F2EC, 0x91695663, - 0x90A0FD4E, 0x8FDCEF66, 0x8F1D343A, 0x8E61D32E, 0x8DAAD37B, 0x8CF83C30, - 0x8C4A142F, 0x8BA0622F, 0x8AFB2CBB, 0x8A5A7A31, 0x89BE50C3, 0x8926B677, - 0x8893B125, 0x88054677, 0x877B7BEC, 0x86F656D3, 0x8675DC4F, 0x85FA1153, - 0x8582FAA5, 0x85109CDD, 0x84A2FC62, 0x843A1D70, 0x83D60412, 0x8376B422, - 0x831C314E, 0x82C67F14, 0x8275A0C0, 0x82299971, 0x81E26C16, 0x81A01B6D, - 0x8162AA04, 0x812A1A3A, 0x80F66E3C, 0x80C7A80A, 0x809DC971, 0x8078D40D, - 0x8058C94C, 0x803DAA6A, 0x80277872, 0x80163440, 0x8009DE7E, 0x800277A6, - 0x80000000, 0x800277A6, 0x8009DE7E, 0x80163440, 0x80277872, 0x803DAA6A, - 0x8058C94C, 0x8078D40D, 0x809DC971, 0x80C7A80A, 0x80F66E3C, 0x812A1A3A, - 0x8162AA04, 0x81A01B6D, 0x81E26C16, 0x82299971, 0x8275A0C0, 0x82C67F14, - 0x831C314E, 0x8376B422, 0x83D60412, 0x843A1D70, 0x84A2FC62, 0x85109CDD, - 0x8582FAA5, 0x85FA1153, 0x8675DC4F, 0x86F656D3, 0x877B7BEC, 0x88054677, - 0x8893B125, 0x8926B677, 0x89BE50C3, 0x8A5A7A31, 0x8AFB2CBB, 0x8BA0622F, - 0x8C4A142F, 0x8CF83C30, 0x8DAAD37B, 0x8E61D32E, 0x8F1D343A, 0x8FDCEF66, - 0x90A0FD4E, 0x91695663, 0x9235F2EC, 0x9306CB04, 0x93DBD6A0, 0x94B50D87, - 0x9592675C, 0x9673DB94, 0x9759617F, 0x9842F043, 0x99307EE0, 0x9A22042D, - 0x9B1776DA, 0x9C10CD70, 0x9D0DFE54, 0x9E0EFFC1, 0x9F13C7D0, 0xA01C4C73, - 0xA1288376, 0xA2386284, 0xA34BDF20, 0xA462EEAC, 0xA57D8666, 0xA69B9B68, - 0xA7BD22AC, 0xA8E21106, 0xAA0A5B2E, 0xAB35F5B5, 0xAC64D510, 0xAD96ED92, - 0xAECC336C, 0xB0049AB3, 0xB140175B, 0xB27E9D3C, 0xB3C0200C, 0xB5049368, - 0xB64BEACD, 0xB796199B, 0xB8E31319, 0xBA32CA71, 0xBB8532B0, 0xBCDA3ECB, - 0xBE31E19B, 0xBF8C0DE3, 0xC0E8B648, 0xC247CD5A, 0xC3A94590, 0xC50D1149, - 0xC67322CE, 0xC7DB6C50, 0xC945DFEC, 0xCAB26FA9, 0xCC210D79, 0xCD91AB39, - 0xCF043AB3, 0xD078AD9E, 0xD1EEF59E, 0xD3670446, 0xD4E0CB15, 0xD65C3B7B, - 0xD7D946D8, 0xD957DE7A, 0xDAD7F3A2, 0xDC597781, 0xDDDC5B3B, 0xDF608FE4, - 0xE0E60685, 0xE26CB01B, 0xE3F47D96, 0xE57D5FDA, 0xE70747C4, 0xE8922622, - 0xEA1DEBBB, 0xEBAA894F, 0xED37EF91, 0xEEC60F31, 0xF054D8D5, 0xF1E43D1C, - 0xF3742CA2, 0xF50497FB, 0xF6956FB7, 0xF826A462, 0xF9B82684, 0xFB49E6A3, - 0xFCDBD541, 0xFE6DE2E0, 0x00000000 -}; - -/** - * \par - * Table values are in Q15 (1.15 fixed-point format) and generation is done in - * three steps. First, generate sin values in floating point: - *
- * tableSize = 512;      
- * for(n = 0; n < (tableSize + 1); n++)    
- * {    
- *	sinTable[n]= sin(2*pi*n/tableSize);    
- * } 
- * where pi value is 3.14159265358979 - * \par - * Second, convert floating-point to Q15 (Fixed point): - * (sinTable[i] * pow(2, 15)) - * \par - * Finally, round to the nearest integer value: - * sinTable[i] += (sinTable[i] > 0 ? 0.5 :-0.5); - */ -const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1] = { - 0x0000, 0x0192, 0x0324, 0x04B6, 0x0648, 0x07D9, 0x096B, 0x0AFB, 0x0C8C, 0x0E1C, 0x0FAB, 0x113A, 0x12C8, - 0x1455, 0x15E2, 0x176E, 0x18F9, 0x1A83, 0x1C0C, 0x1D93, 0x1F1A, 0x209F, 0x2224, 0x23A7, 0x2528, 0x26A8, - 0x2827, 0x29A4, 0x2B1F, 0x2C99, 0x2E11, 0x2F87, 0x30FC, 0x326E, 0x33DF, 0x354E, 0x36BA, 0x3825, 0x398D, - 0x3AF3, 0x3C57, 0x3DB8, 0x3F17, 0x4074, 0x41CE, 0x4326, 0x447B, 0x45CD, 0x471D, 0x486A, 0x49B4, 0x4AFB, - 0x4C40, 0x4D81, 0x4EC0, 0x4FFB, 0x5134, 0x5269, 0x539B, 0x54CA, 0x55F6, 0x571E, 0x5843, 0x5964, 0x5A82, - 0x5B9D, 0x5CB4, 0x5DC8, 0x5ED7, 0x5FE4, 0x60EC, 0x61F1, 0x62F2, 0x63EF, 0x64E9, 0x65DE, 0x66D0, 0x67BD, - 0x68A7, 0x698C, 0x6A6E, 0x6B4B, 0x6C24, 0x6CF9, 0x6DCA, 0x6E97, 0x6F5F, 0x7023, 0x70E3, 0x719E, 0x7255, - 0x7308, 0x73B6, 0x7460, 0x7505, 0x75A6, 0x7642, 0x76D9, 0x776C, 0x77FB, 0x7885, 0x790A, 0x798A, 0x7A06, - 0x7A7D, 0x7AEF, 0x7B5D, 0x7BC6, 0x7C2A, 0x7C89, 0x7CE4, 0x7D3A, 0x7D8A, 0x7DD6, 0x7E1E, 0x7E60, 0x7E9D, - 0x7ED6, 0x7F0A, 0x7F38, 0x7F62, 0x7F87, 0x7FA7, 0x7FC2, 0x7FD9, 0x7FEA, 0x7FF6, 0x7FFE, 0x7FFF, 0x7FFE, - 0x7FF6, 0x7FEA, 0x7FD9, 0x7FC2, 0x7FA7, 0x7F87, 0x7F62, 0x7F38, 0x7F0A, 0x7ED6, 0x7E9D, 0x7E60, 0x7E1E, - 0x7DD6, 0x7D8A, 0x7D3A, 0x7CE4, 0x7C89, 0x7C2A, 0x7BC6, 0x7B5D, 0x7AEF, 0x7A7D, 0x7A06, 0x798A, 0x790A, - 0x7885, 0x77FB, 0x776C, 0x76D9, 0x7642, 0x75A6, 0x7505, 0x7460, 0x73B6, 0x7308, 0x7255, 0x719E, 0x70E3, - 0x7023, 0x6F5F, 0x6E97, 0x6DCA, 0x6CF9, 0x6C24, 0x6B4B, 0x6A6E, 0x698C, 0x68A7, 0x67BD, 0x66D0, 0x65DE, - 0x64E9, 0x63EF, 0x62F2, 0x61F1, 0x60EC, 0x5FE4, 0x5ED7, 0x5DC8, 0x5CB4, 0x5B9D, 0x5A82, 0x5964, 0x5843, - 0x571E, 0x55F6, 0x54CA, 0x539B, 0x5269, 0x5134, 0x4FFB, 0x4EC0, 0x4D81, 0x4C40, 0x4AFB, 0x49B4, 0x486A, - 0x471D, 0x45CD, 0x447B, 0x4326, 0x41CE, 0x4074, 0x3F17, 0x3DB8, 0x3C57, 0x3AF3, 0x398D, 0x3825, 0x36BA, - 0x354E, 0x33DF, 0x326E, 0x30FC, 0x2F87, 0x2E11, 0x2C99, 0x2B1F, 0x29A4, 0x2827, 0x26A8, 0x2528, 0x23A7, - 0x2224, 0x209F, 0x1F1A, 0x1D93, 0x1C0C, 0x1A83, 0x18F9, 0x176E, 0x15E2, 0x1455, 0x12C8, 0x113A, 0x0FAB, - 0x0E1C, 0x0C8C, 0x0AFB, 0x096B, 0x07D9, 0x0648, 0x04B6, 0x0324, 0x0192, 0x0000, 0xFE6E, 0xFCDC, 0xFB4A, - 0xF9B8, 0xF827, 0xF695, 0xF505, 0xF374, 0xF1E4, 0xF055, 0xEEC6, 0xED38, 0xEBAB, 0xEA1E, 0xE892, 0xE707, - 0xE57D, 0xE3F4, 0xE26D, 0xE0E6, 0xDF61, 0xDDDC, 0xDC59, 0xDAD8, 0xD958, 0xD7D9, 0xD65C, 0xD4E1, 0xD367, - 0xD1EF, 0xD079, 0xCF04, 0xCD92, 0xCC21, 0xCAB2, 0xC946, 0xC7DB, 0xC673, 0xC50D, 0xC3A9, 0xC248, 0xC0E9, - 0xBF8C, 0xBE32, 0xBCDA, 0xBB85, 0xBA33, 0xB8E3, 0xB796, 0xB64C, 0xB505, 0xB3C0, 0xB27F, 0xB140, 0xB005, - 0xAECC, 0xAD97, 0xAC65, 0xAB36, 0xAA0A, 0xA8E2, 0xA7BD, 0xA69C, 0xA57E, 0xA463, 0xA34C, 0xA238, 0xA129, - 0xA01C, 0x9F14, 0x9E0F, 0x9D0E, 0x9C11, 0x9B17, 0x9A22, 0x9930, 0x9843, 0x9759, 0x9674, 0x9592, 0x94B5, - 0x93DC, 0x9307, 0x9236, 0x9169, 0x90A1, 0x8FDD, 0x8F1D, 0x8E62, 0x8DAB, 0x8CF8, 0x8C4A, 0x8BA0, 0x8AFB, - 0x8A5A, 0x89BE, 0x8927, 0x8894, 0x8805, 0x877B, 0x86F6, 0x8676, 0x85FA, 0x8583, 0x8511, 0x84A3, 0x843A, - 0x83D6, 0x8377, 0x831C, 0x82C6, 0x8276, 0x822A, 0x81E2, 0x81A0, 0x8163, 0x812A, 0x80F6, 0x80C8, 0x809E, - 0x8079, 0x8059, 0x803E, 0x8027, 0x8016, 0x800A, 0x8002, 0x8000, 0x8002, 0x800A, 0x8016, 0x8027, 0x803E, - 0x8059, 0x8079, 0x809E, 0x80C8, 0x80F6, 0x812A, 0x8163, 0x81A0, 0x81E2, 0x822A, 0x8276, 0x82C6, 0x831C, - 0x8377, 0x83D6, 0x843A, 0x84A3, 0x8511, 0x8583, 0x85FA, 0x8676, 0x86F6, 0x877B, 0x8805, 0x8894, 0x8927, - 0x89BE, 0x8A5A, 0x8AFB, 0x8BA0, 0x8C4A, 0x8CF8, 0x8DAB, 0x8E62, 0x8F1D, 0x8FDD, 0x90A1, 0x9169, 0x9236, - 0x9307, 0x93DC, 0x94B5, 0x9592, 0x9674, 0x9759, 0x9843, 0x9930, 0x9A22, 0x9B17, 0x9C11, 0x9D0E, 0x9E0F, - 0x9F14, 0xA01C, 0xA129, 0xA238, 0xA34C, 0xA463, 0xA57E, 0xA69C, 0xA7BD, 0xA8E2, 0xAA0A, 0xAB36, 0xAC65, - 0xAD97, 0xAECC, 0xB005, 0xB140, 0xB27F, 0xB3C0, 0xB505, 0xB64C, 0xB796, 0xB8E3, 0xBA33, 0xBB85, 0xBCDA, - 0xBE32, 0xBF8C, 0xC0E9, 0xC248, 0xC3A9, 0xC50D, 0xC673, 0xC7DB, 0xC946, 0xCAB2, 0xCC21, 0xCD92, 0xCF04, - 0xD079, 0xD1EF, 0xD367, 0xD4E1, 0xD65C, 0xD7D9, 0xD958, 0xDAD8, 0xDC59, 0xDDDC, 0xDF61, 0xE0E6, 0xE26D, - 0xE3F4, 0xE57D, 0xE707, 0xE892, 0xEA1E, 0xEBAB, 0xED38, 0xEEC6, 0xF055, 0xF1E4, 0xF374, 0xF505, 0xF695, - 0xF827, 0xF9B8, 0xFB4A, 0xFCDC, 0xFE6E, 0x0000 -}; diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c b/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c deleted file mode 100644 index 6a47e19..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c +++ /dev/null @@ -1,156 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_const_structs.c -* -* Description: This file has constant structs that are initialized for -* user convenience. For example, some can be given as -* arguments to the arm_cfft_f32() function. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_const_structs.h" - -//Floating-point structs - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = { - 16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE__16_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = { - 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE__32_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = { - 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE__64_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = { - 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = { - 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = { - 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = { - 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE1024_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = { - 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE2048_TABLE_LENGTH -}; - -const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = { - 4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE4096_TABLE_LENGTH -}; - -//Fixed-point structs - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len16 = { - 16, twiddleCoef_16_q31, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len32 = { - 32, twiddleCoef_32_q31, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len64 = { - 64, twiddleCoef_64_q31, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len128 = { - 128, twiddleCoef_128_q31, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len256 = { - 256, twiddleCoef_256_q31, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len512 = { - 512, twiddleCoef_512_q31, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024 = { - 1024, twiddleCoef_1024_q31, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048 = { - 2048, twiddleCoef_2048_q31, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH -}; - -const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096 = { - 4096, twiddleCoef_4096_q31, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH -}; - - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len16 = { - 16, twiddleCoef_16_q15, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len32 = { - 32, twiddleCoef_32_q15, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len64 = { - 64, twiddleCoef_64_q15, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len128 = { - 128, twiddleCoef_128_q15, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len256 = { - 256, twiddleCoef_256_q15, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len512 = { - 512, twiddleCoef_512_q15, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024 = { - 1024, twiddleCoef_1024_q15, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048 = { - 2048, twiddleCoef_2048_q15, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH -}; - -const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096 = { - 4096, twiddleCoef_4096_q15, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH -}; diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c deleted file mode 100644 index e8b5058..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c +++ /dev/null @@ -1,182 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cmplx_conj_f32.c -* -* Description: Floating-point complex conjugate. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupCmplxMath - */ - -/** - * @defgroup cmplx_conj Complex Conjugate - * - * Conjugates the elements of a complex data vector. - * - * The pSrc points to the source data and - * pDst points to the where the result should be written. - * numSamples specifies the number of complex samples - * and the data in each array is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * Each array has a total of 2*numSamples values. - * The underlying algorithm is used: - * - *
        
- * for(n=0; n        
- *        
- * There are separate functions for floating-point, Q15, and Q31 data types.        
- */
-
-/**        
- * @addtogroup cmplx_conj        
- * @{        
- */
-
-/**        
- * @brief  Floating-point complex conjugate.        
- * @param  *pSrc points to the input vector        
- * @param  *pDst points to the output vector        
- * @param  numSamples number of complex samples in each vector        
- * @return none.        
- */
-
-void arm_cmplx_conj_f32(
-  float32_t * pSrc,
-  float32_t * pDst,
-  uint32_t numSamples)
-{
-  uint32_t blkCnt;                               /* loop counter */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  float32_t inR1, inR2, inR3, inR4;
-  float32_t inI1, inI2, inI3, inI4;
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0]+jC[1] = A[0]+ j (-1) A[1] */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    /* read real input samples */
-    inR1 = pSrc[0];
-    /* store real samples to destination */
-    pDst[0] = inR1;
-    inR2 = pSrc[2];
-    pDst[2] = inR2;
-    inR3 = pSrc[4];
-    pDst[4] = inR3;
-    inR4 = pSrc[6];
-    pDst[6] = inR4;
-
-    /* read imaginary input samples */
-    inI1 = pSrc[1];
-    inI2 = pSrc[3];
-
-    /* conjugate input */
-    inI1 = -inI1;
-
-    /* read imaginary input samples */
-    inI3 = pSrc[5];
-
-    /* conjugate input */
-    inI2 = -inI2;
-
-    /* read imaginary input samples */
-    inI4 = pSrc[7];
-
-    /* conjugate input */
-    inI3 = -inI3;
-
-    /* store imaginary samples to destination */
-    pDst[1] = inI1;
-    pDst[3] = inI2;
-
-    /* conjugate input */
-    inI4 = -inI4;
-
-    /* store imaginary samples to destination */
-    pDst[5] = inI3;
-
-    /* increment source pointer by 8 to process next sampels */
-    pSrc += 8u;
-
-    /* store imaginary sample to destination */
-    pDst[7] = inI4;
-
-    /* increment destination pointer by 8 to store next samples */
-    pDst += 8u;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  blkCnt = numSamples;
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* realOut + j (imagOut) = realIn + j (-1) imagIn */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    *pDst++ = *pSrc++;
-    *pDst++ = -*pSrc++;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of cmplx_conj group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c
deleted file mode 100644
index 5d4e5d7..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. October 2015
-* $Revision: 	V.1.4.5 a
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_conj_q15.c    
-*    
-* Description:	Q15 complex conjugate.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_conj    
- * @{    
- */
-
-/**    
- * @brief  Q15 complex conjugate.    
- * @param  *pSrc points to the input vector    
- * @param  *pDst points to the output vector    
- * @param  numSamples number of complex samples in each vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function uses saturating arithmetic.    
- * The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.    
- */
-
-void arm_cmplx_conj_q15(
-  q15_t * pSrc,
-  q15_t * pDst,
-  uint32_t numSamples)
-{
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-  q31_t in1, in2, in3, in4;
-  q31_t zero = 0;
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0]+jC[1] = A[0]+ j (-1) A[1] */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    in1 = *__SIMD32(pSrc)++;
-    in2 = *__SIMD32(pSrc)++;
-    in3 = *__SIMD32(pSrc)++;
-    in4 = *__SIMD32(pSrc)++;
-
-#ifndef ARM_MATH_BIG_ENDIAN
-
-    in1 = __QASX(zero, in1);
-    in2 = __QASX(zero, in2);
-    in3 = __QASX(zero, in3);
-    in4 = __QASX(zero, in4);
-
-#else
-
-    in1 = __QSAX(zero, in1);
-    in2 = __QSAX(zero, in2);
-    in3 = __QSAX(zero, in3);
-    in4 = __QSAX(zero, in4);
-
-#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
-
-    in1 = ((uint32_t) in1 >> 16) | ((uint32_t) in1 << 16);
-    in2 = ((uint32_t) in2 >> 16) | ((uint32_t) in2 << 16);
-    in3 = ((uint32_t) in3 >> 16) | ((uint32_t) in3 << 16);
-    in4 = ((uint32_t) in4 >> 16) | ((uint32_t) in4 << 16);
-
-    *__SIMD32(pDst)++ = in1;
-    *__SIMD32(pDst)++ = in2;
-    *__SIMD32(pDst)++ = in3;
-    *__SIMD32(pDst)++ = in4;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[0]+jC[1] = A[0]+ j (-1) A[1] */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    *pDst++ = *pSrc++;
-    *pDst++ = __SSAT(-*pSrc++, 16);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  q15_t in;
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* realOut + j (imagOut) = realIn+ j (-1) imagIn */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    *pDst++ = *pSrc++;
-    in = *pSrc++;
-    *pDst++ = (in == (q15_t) 0x8000) ? 0x7fff : -in;
-
-    /* Decrement the loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of cmplx_conj group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c
deleted file mode 100644
index 79746d8..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_conj_q31.c    
-*    
-* Description:	Q31 complex conjugate.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.    
-* ---------------------------------------------------------------------------- */
-#include "arm_math.h"
-
-/**        
- * @ingroup groupCmplxMath        
- */
-
-/**        
- * @addtogroup cmplx_conj        
- * @{        
- */
-
-/**        
- * @brief  Q31 complex conjugate.        
- * @param  *pSrc points to the input vector        
- * @param  *pDst points to the output vector        
- * @param  numSamples number of complex samples in each vector        
- * @return none.        
- *        
- * Scaling and Overflow Behavior:        
- * \par        
- * The function uses saturating arithmetic.        
- * The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.        
- */
-
-void arm_cmplx_conj_q31(
-  q31_t * pSrc,
-  q31_t * pDst,
-  uint32_t numSamples)
-{
-  uint32_t blkCnt;                               /* loop counter */
-  q31_t in;                                      /* Input value */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  q31_t inR1, inR2, inR3, inR4;                  /* Temporary real variables */
-  q31_t inI1, inI2, inI3, inI4;                  /* Temporary imaginary variables */
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0]+jC[1] = A[0]+ j (-1) A[1] */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    /* Saturated to 0x7fffffff if the input is -1(0x80000000) */
-    /* read real input sample */
-    inR1 = pSrc[0];
-    /* store real input sample */
-    pDst[0] = inR1;
-
-    /* read imaginary input sample */
-    inI1 = pSrc[1];
-
-    /* read real input sample */
-    inR2 = pSrc[2];
-    /* store real input sample */
-    pDst[2] = inR2;
-
-    /* read imaginary input sample */
-    inI2 = pSrc[3];
-
-    /* negate imaginary input sample */
-    inI1 = __QSUB(0, inI1);
-
-    /* read real input sample */
-    inR3 = pSrc[4];
-    /* store real input sample */
-    pDst[4] = inR3;
-
-    /* read imaginary input sample */
-    inI3 = pSrc[5];
-
-    /* negate imaginary input sample */
-    inI2 = __QSUB(0, inI2);
-
-    /* read real input sample */
-    inR4 = pSrc[6];
-    /* store real input sample */
-    pDst[6] = inR4;
-
-    /* negate imaginary input sample */
-    inI3 = __QSUB(0, inI3);
-
-    /* store imaginary input sample */
-    inI4 = pSrc[7];
-
-    /* store imaginary input samples */
-    pDst[1] = inI1;
-
-    /* negate imaginary input sample */
-    inI4 = __QSUB(0, inI4);
-
-    /* store imaginary input samples */
-    pDst[3] = inI2;
-
-    /* increment source pointer by 8 to proecess next samples */
-    pSrc += 8u;
-
-    /* store imaginary input samples */
-    pDst[5] = inI3;
-    pDst[7] = inI4;
-
-    /* increment destination pointer by 8 to process next samples */
-    pDst += 8u;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  blkCnt = numSamples;
-
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* C[0]+jC[1] = A[0]+ j (-1) A[1] */
-    /* Calculate Complex Conjugate and then store the results in the destination buffer. */
-    /* Saturated to 0x7fffffff if the input is -1(0x80000000) */
-    *pDst++ = *pSrc++;
-    in = *pSrc++;
-    *pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of cmplx_conj group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c
deleted file mode 100644
index 6f06a88..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_dot_prod_f32.c    
-*    
-* Description:	Floating-point complex dot product    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.    
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @defgroup cmplx_dot_prod Complex Dot Product    
- *    
- * Computes the dot product of two complex vectors.    
- * The vectors are multiplied element-by-element and then summed.    
- *   
- * The pSrcA points to the first complex input vector and    
- * pSrcB points to the second complex input vector.    
- * numSamples specifies the number of complex samples    
- * and the data in each array is stored in an interleaved fashion    
- * (real, imag, real, imag, ...).    
- * Each array has a total of 2*numSamples values.    
- *    
- * The underlying algorithm is used:    
- * 
    
- * realResult=0;    
- * imagResult=0;    
- * for(n=0; n    
- *    
- * There are separate functions for floating-point, Q15, and Q31 data types.    
- */
-
-/**    
- * @addtogroup cmplx_dot_prod    
- * @{    
- */
-
-/**    
- * @brief  Floating-point complex dot product    
- * @param  *pSrcA points to the first input vector    
- * @param  *pSrcB points to the second input vector    
- * @param  numSamples number of complex samples in each vector    
- * @param  *realResult real part of the result returned here    
- * @param  *imagResult imaginary part of the result returned here    
- * @return none.    
- */
-
-void arm_cmplx_dot_prod_f32(
-  float32_t * pSrcA,
-  float32_t * pSrcB,
-  uint32_t numSamples,
-  float32_t * realResult,
-  float32_t * imagResult)
-{
-  float32_t real_sum = 0.0f, imag_sum = 0.0f;    /* Temporary result storage */
-  float32_t a0,b0,c0,d0;
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-    
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++; 
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-    
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++; 
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples & 0x3u;
-
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-
-      /* Decrement the loop counter */
-      numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  /* Store the real and imaginary results in the destination buffers */
-  *realResult = real_sum;
-  *imagResult = imag_sum;
-}
-
-/**    
- * @} end of cmplx_dot_prod group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c
deleted file mode 100644
index 5ee86ad..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_dot_prod_q15.c    
-*    
-* Description:	Processing function for the Q15 Complex Dot product    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_dot_prod    
- * @{    
- */
-
-/**    
- * @brief  Q15 complex dot product    
- * @param  *pSrcA points to the first input vector    
- * @param  *pSrcB points to the second input vector    
- * @param  numSamples number of complex samples in each vector    
- * @param  *realResult real part of the result returned here    
- * @param  *imagResult imaginary part of the result returned here    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function is implemented using an internal 64-bit accumulator.    
- * The intermediate 1.15 by 1.15 multiplications are performed with full precision and yield a 2.30 result.    
- * These are accumulated in a 64-bit accumulator with 34.30 precision.    
- * As a final step, the accumulators are converted to 8.24 format.    
- * The return results realResult and imagResult are in 8.24 format.    
- */
-
-void arm_cmplx_dot_prod_q15(
-  q15_t * pSrcA,
-  q15_t * pSrcB,
-  uint32_t numSamples,
-  q31_t * realResult,
-  q31_t * imagResult)
-{
-  q63_t real_sum = 0, imag_sum = 0;              /* Temporary result storage */
-  q15_t a0,b0,c0,d0;
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += (q31_t)a0 * c0;
-      imag_sum += (q31_t)a0 * d0;
-      real_sum -= (q31_t)b0 * d0;
-      imag_sum += (q31_t)b0 * c0;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += (q31_t)a0 * c0;
-      imag_sum += (q31_t)a0 * d0;
-      real_sum -= (q31_t)b0 * d0;
-      imag_sum += (q31_t)b0 * c0;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += (q31_t)a0 * c0;
-      imag_sum += (q31_t)a0 * d0;
-      real_sum -= (q31_t)b0 * d0;
-      imag_sum += (q31_t)b0 * c0;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += (q31_t)a0 * c0;
-      imag_sum += (q31_t)a0 * d0;
-      real_sum -= (q31_t)b0 * d0;
-      imag_sum += (q31_t)b0 * c0;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += (q31_t)a0 * c0;
-      imag_sum += (q31_t)a0 * d0;
-      real_sum -= (q31_t)b0 * d0;
-      imag_sum += (q31_t)b0 * c0;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += a0 * c0;
-      imag_sum += a0 * d0;
-      real_sum -= b0 * d0;
-      imag_sum += b0 * c0;
-
-
-      /* Decrement the loop counter */
-      numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  /* Store the real and imaginary results in 8.24 format  */
-  /* Convert real data in 34.30 to 8.24 by 6 right shifts */
-  *realResult = (q31_t) (real_sum >> 6);
-  /* Convert imaginary data in 34.30 to 8.24 by 6 right shifts */
-  *imagResult = (q31_t) (imag_sum >> 6);
-}
-
-/**    
- * @} end of cmplx_dot_prod group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c
deleted file mode 100644
index 9b7170f..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_dot_prod_q31.c    
-*    
-* Description:	Q31 complex dot product    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_dot_prod    
- * @{    
- */
-
-/**    
- * @brief  Q31 complex dot product    
- * @param  *pSrcA points to the first input vector    
- * @param  *pSrcB points to the second input vector    
- * @param  numSamples number of complex samples in each vector    
- * @param  *realResult real part of the result returned here    
- * @param  *imagResult imaginary part of the result returned here    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function is implemented using an internal 64-bit accumulator.    
- * The intermediate 1.31 by 1.31 multiplications are performed with 64-bit precision and then shifted to 16.48 format.    
- * The internal real and imaginary accumulators are in 16.48 format and provide 15 guard bits.    
- * Additions are nonsaturating and no overflow will occur as long as numSamples is less than 32768.    
- * The return results realResult and imagResult are in 16.48 format.    
- * Input down scaling is not required.    
- */
-
-void arm_cmplx_dot_prod_q31(
-  q31_t * pSrcA,
-  q31_t * pSrcB,
-  uint32_t numSamples,
-  q63_t * realResult,
-  q63_t * imagResult)
-{
-  q63_t real_sum = 0, imag_sum = 0;              /* Temporary result storage */
-  q31_t a0,b0,c0,d0;
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-      
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-  /* If the numSamples  is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-
-      /* Decrement the loop counter */
-      blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-      a0 = *pSrcA++;
-      b0 = *pSrcA++;
-      c0 = *pSrcB++;
-      d0 = *pSrcB++;  
-  
-      real_sum += ((q63_t)a0 * c0) >> 14;
-      imag_sum += ((q63_t)a0 * d0) >> 14;
-      real_sum -= ((q63_t)b0 * d0) >> 14;
-      imag_sum += ((q63_t)b0 * c0) >> 14;
-
-      /* Decrement the loop counter */
-      numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  /* Store the real and imaginary results in 16.48 format  */
-  *realResult = real_sum;
-  *imagResult = imag_sum;
-}
-
-/**    
- * @} end of cmplx_dot_prod group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c
deleted file mode 100644
index deb8a29..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_f32.c    
-*    
-* Description:	Floating-point complex magnitude.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @defgroup cmplx_mag Complex Magnitude    
- *    
- * Computes the magnitude of the elements of a complex data vector.    
- *   
- * The pSrc points to the source data and    
- * pDst points to the where the result should be written.    
- * numSamples specifies the number of complex samples    
- * in the input array and the data is stored in an interleaved fashion    
- * (real, imag, real, imag, ...).    
- * The input array has a total of 2*numSamples values;    
- * the output array has a total of numSamples values.    
- * The underlying algorithm is used:    
- *    
- * 
    
- * for(n=0; n    
- *    
- * There are separate functions for floating-point, Q15, and Q31 data types.    
- */
-
-/**    
- * @addtogroup cmplx_mag    
- * @{    
- */
-/**    
- * @brief Floating-point complex magnitude.    
- * @param[in]       *pSrc points to complex input buffer    
- * @param[out]      *pDst points to real output buffer    
- * @param[in]       numSamples number of complex samples in the input vector    
- * @return none.    
- *    
- */
-
-
-void arm_cmplx_mag_f32(
-  float32_t * pSrc,
-  float32_t * pDst,
-  uint32_t numSamples)
-{
-  float32_t realIn, imagIn;                      /* Temporary variables to hold input values */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-
-    /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    /* store the result in the destination buffer. */
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    /* store the result in the destination buffer. */
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* out = sqrt((real * real) + (imag * imag)) */
-    realIn = *pSrc++;
-    imagIn = *pSrc++;
-    /* store the result in the destination buffer. */
-    arm_sqrt_f32((realIn * realIn) + (imagIn * imagIn), pDst++);
-
-    /* Decrement the loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of cmplx_mag group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c
deleted file mode 100644
index d712585..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_q15.c    
-*    
-* Description:	Q15 complex magnitude.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_mag    
- * @{    
- */
-
-
-/**    
- * @brief  Q15 complex magnitude    
- * @param  *pSrc points to the complex input vector    
- * @param  *pDst points to the real output vector    
- * @param  numSamples number of complex samples in the input vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function implements 1.15 by 1.15 multiplications and finally output is converted into 2.14 format.    
- */
-
-void arm_cmplx_mag_q15(
-  q15_t * pSrc,
-  q15_t * pDst,
-  uint32_t numSamples)
-{
-  q31_t acc0, acc1;                              /* Accumulators */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-  q31_t in1, in2, in3, in4;
-  q31_t acc2, acc3;
-
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-
-    /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
-    in1 = *__SIMD32(pSrc)++;
-    in2 = *__SIMD32(pSrc)++;
-    in3 = *__SIMD32(pSrc)++;
-    in4 = *__SIMD32(pSrc)++;
-
-    acc0 = __SMUAD(in1, in1);
-    acc1 = __SMUAD(in2, in2);
-    acc2 = __SMUAD(in3, in3);
-    acc3 = __SMUAD(in4, in4);
-
-    /* store the result in 2.14 format in the destination buffer. */
-    arm_sqrt_q15((q15_t) ((acc0) >> 17), pDst++);
-    arm_sqrt_q15((q15_t) ((acc1) >> 17), pDst++);
-    arm_sqrt_q15((q15_t) ((acc2) >> 17), pDst++);
-    arm_sqrt_q15((q15_t) ((acc3) >> 17), pDst++);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
-    in1 = *__SIMD32(pSrc)++;
-    acc0 = __SMUAD(in1, in1);
-
-    /* store the result in 2.14 format in the destination buffer. */
-    arm_sqrt_q15((q15_t) (acc0 >> 17), pDst++);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  q15_t real, imag;                              /* Temporary variables to hold input values */
-
-  while(numSamples > 0u)
-  {
-    /* out = sqrt(real * real + imag * imag) */
-    real = *pSrc++;
-    imag = *pSrc++;
-
-    acc0 = (real * real);
-    acc1 = (imag * imag);
-
-    /* store the result in 2.14 format in the destination buffer. */
-    arm_sqrt_q15((q15_t) (((q63_t) acc0 + acc1) >> 17), pDst++);
-
-    /* Decrement the loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of cmplx_mag group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c
deleted file mode 100644
index 2880f57..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_q31.c    
-*    
-* Description:	Q31 complex magnitude    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**        
- * @ingroup groupCmplxMath        
- */
-
-/**        
- * @addtogroup cmplx_mag        
- * @{        
- */
-
-/**        
- * @brief  Q31 complex magnitude        
- * @param  *pSrc points to the complex input vector        
- * @param  *pDst points to the real output vector        
- * @param  numSamples number of complex samples in the input vector        
- * @return none.        
- *        
- * Scaling and Overflow Behavior:        
- * \par        
- * The function implements 1.31 by 1.31 multiplications and finally output is converted into 2.30 format.        
- * Input down scaling is not required.        
- */
-
-void arm_cmplx_mag_q31(
-  q31_t * pSrc,
-  q31_t * pDst,
-  uint32_t numSamples)
-{
-  q31_t real, imag;                              /* Temporary variables to hold input values */
-  q31_t acc0, acc1;                              /* Accumulators */
-  uint32_t blkCnt;                               /* loop counter */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  q31_t real1, real2, imag1, imag2;              /* Temporary variables to hold input values */
-  q31_t out1, out2, out3, out4;                  /* Accumulators */
-  q63_t mul1, mul2, mul3, mul4;                  /* Temporary variables */
-
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* read complex input from source buffer */
-    real1 = pSrc[0];
-    imag1 = pSrc[1];
-    real2 = pSrc[2];
-    imag2 = pSrc[3];
-
-    /* calculate power of input values */
-    mul1 = (q63_t) real1 *real1;
-    mul2 = (q63_t) imag1 *imag1;
-    mul3 = (q63_t) real2 *real2;
-    mul4 = (q63_t) imag2 *imag2;
-
-    /* get the result to 3.29 format */
-    out1 = (q31_t) (mul1 >> 33);
-    out2 = (q31_t) (mul2 >> 33);
-    out3 = (q31_t) (mul3 >> 33);
-    out4 = (q31_t) (mul4 >> 33);
-
-    /* add real and imaginary accumulators */
-    out1 = out1 + out2;
-    out3 = out3 + out4;
-
-    /* read complex input from source buffer */
-    real1 = pSrc[4];
-    imag1 = pSrc[5];
-    real2 = pSrc[6];
-    imag2 = pSrc[7];
-
-    /* calculate square root */
-    arm_sqrt_q31(out1, &pDst[0]);
-
-    /* calculate power of input values */
-    mul1 = (q63_t) real1 *real1;
-
-    /* calculate square root */
-    arm_sqrt_q31(out3, &pDst[1]);
-
-    /* calculate power of input values */
-    mul2 = (q63_t) imag1 *imag1;
-    mul3 = (q63_t) real2 *real2;
-    mul4 = (q63_t) imag2 *imag2;
-
-    /* get the result to 3.29 format */
-    out1 = (q31_t) (mul1 >> 33);
-    out2 = (q31_t) (mul2 >> 33);
-    out3 = (q31_t) (mul3 >> 33);
-    out4 = (q31_t) (mul4 >> 33);
-
-    /* add real and imaginary accumulators */
-    out1 = out1 + out2;
-    out3 = out3 + out4;
-
-    /* calculate square root */
-    arm_sqrt_q31(out1, &pDst[2]);
-
-    /* increment destination by 8 to process next samples */
-    pSrc += 8u;
-
-    /* calculate square root */
-    arm_sqrt_q31(out3, &pDst[3]);
-
-    /* increment destination by 4 to process next samples */
-    pDst += 4u;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  blkCnt = numSamples;
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = sqrt(A[0] * A[0] + A[1] * A[1]) */
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 2.30 format in the destination buffer. */
-    arm_sqrt_q31(acc0 + acc1, pDst++);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of cmplx_mag group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c
deleted file mode 100644
index 71b0a1e..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_squared_f32.c    
-*    
-* Description:	Floating-point complex magnitude squared.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* ---------------------------------------------------------------------------- */
-#include "arm_math.h"
-
-/**        
- * @ingroup groupCmplxMath        
- */
-
-/**        
- * @defgroup cmplx_mag_squared Complex Magnitude Squared        
- *        
- * Computes the magnitude squared of the elements of a complex data vector.        
- *       
- * The pSrc points to the source data and        
- * pDst points to the where the result should be written.        
- * numSamples specifies the number of complex samples        
- * in the input array and the data is stored in an interleaved fashion        
- * (real, imag, real, imag, ...).        
- * The input array has a total of 2*numSamples values;        
- * the output array has a total of numSamples values.        
- *        
- * The underlying algorithm is used:        
- *        
- * 
        
- * for(n=0; n        
- *        
- * There are separate functions for floating-point, Q15, and Q31 data types.        
- */
-
-/**        
- * @addtogroup cmplx_mag_squared        
- * @{        
- */
-
-
-/**        
- * @brief  Floating-point complex magnitude squared        
- * @param[in]  *pSrc points to the complex input vector        
- * @param[out]  *pDst points to the real output vector        
- * @param[in]  numSamples number of complex samples in the input vector        
- * @return none.        
- */
-
-void arm_cmplx_mag_squared_f32(
-  float32_t * pSrc,
-  float32_t * pDst,
-  uint32_t numSamples)
-{
-  float32_t real, imag;                          /* Temporary variables to store real and imaginary values */
-  uint32_t blkCnt;                               /* loop counter */
-
-#ifndef ARM_MATH_CM0_FAMILY
-  float32_t real1, real2, real3, real4;          /* Temporary variables to hold real values */
-  float32_t imag1, imag2, imag3, imag4;          /* Temporary variables to hold imaginary values */
-  float32_t mul1, mul2, mul3, mul4;              /* Temporary variables */
-  float32_t mul5, mul6, mul7, mul8;              /* Temporary variables */
-  float32_t out1, out2, out3, out4;              /* Temporary variables to hold output values */
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    /* read real input sample from source buffer */
-    real1 = pSrc[0];
-    /* read imaginary input sample from source buffer */
-    imag1 = pSrc[1];
-
-    /* calculate power of real value */
-    mul1 = real1 * real1;
-
-    /* read real input sample from source buffer */
-    real2 = pSrc[2];
-
-    /* calculate power of imaginary value */
-    mul2 = imag1 * imag1;
-
-    /* read imaginary input sample from source buffer */
-    imag2 = pSrc[3];
-
-    /* calculate power of real value */
-    mul3 = real2 * real2;
-
-    /* read real input sample from source buffer */
-    real3 = pSrc[4];
-
-    /* calculate power of imaginary value */
-    mul4 = imag2 * imag2;
-
-    /* read imaginary input sample from source buffer */
-    imag3 = pSrc[5];
-
-    /* calculate power of real value */
-    mul5 = real3 * real3;
-    /* calculate power of imaginary value */
-    mul6 = imag3 * imag3;
-
-    /* read real input sample from source buffer */
-    real4 = pSrc[6];
-
-    /* accumulate real and imaginary powers */
-    out1 = mul1 + mul2;
-
-    /* read imaginary input sample from source buffer */
-    imag4 = pSrc[7];
-
-    /* accumulate real and imaginary powers */
-    out2 = mul3 + mul4;
-
-    /* calculate power of real value */
-    mul7 = real4 * real4;
-    /* calculate power of imaginary value */
-    mul8 = imag4 * imag4;
-
-    /* store output to destination */
-    pDst[0] = out1;
-
-    /* accumulate real and imaginary powers */
-    out3 = mul5 + mul6;
-
-    /* store output to destination */
-    pDst[1] = out2;
-
-    /* accumulate real and imaginary powers */
-    out4 = mul7 + mul8;
-
-    /* store output to destination */
-    pDst[2] = out3;
-
-    /* increment destination pointer by 8 to process next samples */
-    pSrc += 8u;
-
-    /* store output to destination */
-    pDst[3] = out4;
-
-    /* increment destination pointer by 4 to process next samples */
-    pDst += 4u;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  blkCnt = numSamples;
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    real = *pSrc++;
-    imag = *pSrc++;
-
-    /* out = (real * real) + (imag * imag) */
-    /* store the result in the destination buffer. */
-    *pDst++ = (real * real) + (imag * imag);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of cmplx_mag_squared group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c
deleted file mode 100644
index c669fb6..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_squared_q15.c    
-*    
-* Description:	Q15 complex magnitude squared.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_mag_squared    
- * @{    
- */
-
-/**    
- * @brief  Q15 complex magnitude squared    
- * @param  *pSrc points to the complex input vector    
- * @param  *pDst points to the real output vector    
- * @param  numSamples number of complex samples in the input vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.    
- */
-
-void arm_cmplx_mag_squared_q15(
-  q15_t * pSrc,
-  q15_t * pDst,
-  uint32_t numSamples)
-{
-  q31_t acc0, acc1;                              /* Accumulators */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-  q31_t in1, in2, in3, in4;
-  q31_t acc2, acc3;
-
-  /*loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    in1 = *__SIMD32(pSrc)++;
-    in2 = *__SIMD32(pSrc)++;
-    in3 = *__SIMD32(pSrc)++;
-    in4 = *__SIMD32(pSrc)++;
-
-    acc0 = __SMUAD(in1, in1);
-    acc1 = __SMUAD(in2, in2);
-    acc2 = __SMUAD(in3, in3);
-    acc3 = __SMUAD(in4, in4);
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ = (q15_t) (acc0 >> 17);
-    *pDst++ = (q15_t) (acc1 >> 17);
-    *pDst++ = (q15_t) (acc2 >> 17);
-    *pDst++ = (q15_t) (acc3 >> 17);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    in1 = *__SIMD32(pSrc)++;
-    acc0 = __SMUAD(in1, in1);
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ = (q15_t) (acc0 >> 17);
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  q15_t real, imag;                              /* Temporary variables to store real and imaginary values */
-
-  while(numSamples > 0u)
-  {
-    /* out = ((real * real) + (imag * imag)) */
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (real * real);
-    acc1 = (imag * imag);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ = (q15_t) (((q63_t) acc0 + acc1) >> 17);
-
-    /* Decrement the loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of cmplx_mag_squared group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c
deleted file mode 100644
index 25f1e84..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_cmplx_mag_squared_q31.c    
-*    
-* Description:	Q31 complex magnitude squared.    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE. 
-* ---------------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup cmplx_mag_squared    
- * @{    
- */
-
-
-/**    
- * @brief  Q31 complex magnitude squared    
- * @param  *pSrc points to the complex input vector    
- * @param  *pDst points to the real output vector    
- * @param  numSamples number of complex samples in the input vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.    
- * Input down scaling is not required.    
- */
-
-void arm_cmplx_mag_squared_q31(
-  q31_t * pSrc,
-  q31_t * pDst,
-  uint32_t numSamples)
-{
-  q31_t real, imag;                              /* Temporary variables to store real and imaginary values */
-  q31_t acc0, acc1;                              /* Accumulators */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counter */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[0] = (A[0] * A[0] + A[1] * A[1]) */
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    /* Decrement the loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* out = ((real * real) + (imag * imag)) */
-    real = *pSrc++;
-    imag = *pSrc++;
-    acc0 = (q31_t) (((q63_t) real * real) >> 33);
-    acc1 = (q31_t) (((q63_t) imag * imag) >> 33);
-    /* store the result in 3.29 format in the destination buffer. */
-    *pDst++ = acc0 + acc1;
-
-    /* Decrement the loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of cmplx_mag_squared group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c
deleted file mode 100644
index 0f04562..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_cmplx_f32.c    
-*    
-* Description:	Floating-point complex-by-complex multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE. 
-* -------------------------------------------------------------------- */
-#include "arm_math.h"
-
-/**        
- * @ingroup groupCmplxMath        
- */
-
-/**        
- * @defgroup CmplxByCmplxMult Complex-by-Complex Multiplication        
- *        
- * Multiplies a complex vector by another complex vector and generates a complex result.        
- * The data in the complex arrays is stored in an interleaved fashion        
- * (real, imag, real, imag, ...).        
- * The parameter numSamples represents the number of complex        
- * samples processed.  The complex arrays have a total of 2*numSamples        
- * real values.        
- *        
- * The underlying algorithm is used:        
- *        
- * 
        
- * for(n=0; n        
- *        
- * There are separate functions for floating-point, Q15, and Q31 data types.        
- */
-
-/**        
- * @addtogroup CmplxByCmplxMult        
- * @{        
- */
-
-
-/**        
- * @brief  Floating-point complex-by-complex multiplication        
- * @param[in]  *pSrcA points to the first input vector        
- * @param[in]  *pSrcB points to the second input vector        
- * @param[out]  *pDst  points to the output vector        
- * @param[in]  numSamples number of complex samples in each vector        
- * @return none.        
- */
-
-void arm_cmplx_mult_cmplx_f32(
-  float32_t * pSrcA,
-  float32_t * pSrcB,
-  float32_t * pDst,
-  uint32_t numSamples)
-{
-  float32_t a1, b1, c1, d1;                      /* Temporary variables to store real and imaginary values */
-  uint32_t blkCnt;                               /* loop counters */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  float32_t a2, b2, c2, d2;                      /* Temporary variables to store real and imaginary values */
-  float32_t acc1, acc2, acc3, acc4;
-
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a1 = *pSrcA;                /* A[2 * i] */
-    c1 = *pSrcB;                /* B[2 * i] */
-
-    b1 = *(pSrcA + 1);          /* A[2 * i + 1] */
-    acc1 = a1 * c1;             /* acc1 = A[2 * i] * B[2 * i] */
-
-    a2 = *(pSrcA + 2);          /* A[2 * i + 2] */
-    acc2 = (b1 * c1);           /* acc2 = A[2 * i + 1] * B[2 * i] */
-
-    d1 = *(pSrcB + 1);          /* B[2 * i + 1] */
-    c2 = *(pSrcB + 2);          /* B[2 * i + 2] */
-    acc1 -= b1 * d1;            /* acc1 =      A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1] */
-
-    d2 = *(pSrcB + 3);          /* B[2 * i + 3] */
-    acc3 = a2 * c2;             /* acc3 =       A[2 * i + 2] * B[2 * i + 2] */
-
-    b2 = *(pSrcA + 3);          /* A[2 * i + 3] */
-    acc2 += (a1 * d1);          /* acc2 =      A[2 * i + 1] * B[2 * i] + A[2 * i] * B[2 * i + 1] */
-
-    a1 = *(pSrcA + 4);          /* A[2 * i + 4] */
-    acc4 = (a2 * d2);           /* acc4 =   A[2 * i + 2] * B[2 * i + 3] */
-
-    c1 = *(pSrcB + 4);          /* B[2 * i + 4] */
-    acc3 -= (b2 * d2);          /* acc3 =       A[2 * i + 2] * B[2 * i + 2] - A[2 * i + 3] * B[2 * i + 3] */
-    *pDst = acc1;               /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1] */
-
-    b1 = *(pSrcA + 5);          /* A[2 * i + 5] */
-    acc4 += b2 * c2;            /* acc4 =   A[2 * i + 2] * B[2 * i + 3] + A[2 * i + 3] * B[2 * i + 2] */
-
-    *(pDst + 1) = acc2;         /* C[2 * i + 1] = A[2 * i + 1] * B[2 * i] + A[2 * i] * B[2 * i + 1]  */
-    acc1 = (a1 * c1);
-
-    d1 = *(pSrcB + 5);
-    acc2 = (b1 * c1);
-
-    *(pDst + 2) = acc3;
-    *(pDst + 3) = acc4;
-
-    a2 = *(pSrcA + 6);
-    acc1 -= (b1 * d1);
-
-    c2 = *(pSrcB + 6);
-    acc2 += (a1 * d1);
-
-    b2 = *(pSrcA + 7);
-    acc3 = (a2 * c2);
-
-    d2 = *(pSrcB + 7);
-    acc4 = (b2 * c2);
-
-    *(pDst + 4) = acc1;
-    pSrcA += 8u;
-
-    acc3 -= (b2 * d2);
-    acc4 += (a2 * d2);
-
-    *(pDst + 5) = acc2;
-    pSrcB += 8u;
-
-    *(pDst + 6) = acc3;
-    *(pDst + 7) = acc4;
-
-    pDst += 8u;
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  blkCnt = numSamples;
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a1 = *pSrcA++;
-    b1 = *pSrcA++;
-    c1 = *pSrcB++;
-    d1 = *pSrcB++;
-
-    /* store the result in the destination buffer. */
-    *pDst++ = (a1 * c1) - (b1 * d1);
-    *pDst++ = (a1 * d1) + (b1 * c1);
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of CmplxByCmplxMult group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c
deleted file mode 100644
index f135b98..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_cmplx_q15.c    
-*    
-* Description:	Q15 complex-by-complex multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup CmplxByCmplxMult    
- * @{    
- */
-
-/**    
- * @brief  Q15 complex-by-complex multiplication    
- * @param[in]  *pSrcA points to the first input vector    
- * @param[in]  *pSrcB points to the second input vector    
- * @param[out]  *pDst  points to the output vector    
- * @param[in]  numSamples number of complex samples in each vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function implements 1.15 by 1.15 multiplications and finally output is converted into 3.13 format.    
- */
-
-void arm_cmplx_mult_cmplx_q15(
-  q15_t * pSrcA,
-  q15_t * pSrcB,
-  q15_t * pDst,
-  uint32_t numSamples)
-{
-  q15_t a, b, c, d;                              /* Temporary variables to store real and imaginary values */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counters */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-  /* If the blockSize is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * c) >> 17) - (((q31_t) b * d) >> 17);
-    /* store the result in 3.13 format in the destination buffer. */
-    *pDst++ =
-      (q15_t) (q31_t) (((q31_t) a * d) >> 17) + (((q31_t) b * c) >> 17);
-
-    /* Decrement the blockSize loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of CmplxByCmplxMult group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c
deleted file mode 100644
index 6dfea93..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_cmplx_q31.c    
-*    
-* Description:	Q31 complex-by-complex multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE. 
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup CmplxByCmplxMult    
- * @{    
- */
-
-
-/**    
- * @brief  Q31 complex-by-complex multiplication    
- * @param[in]  *pSrcA points to the first input vector    
- * @param[in]  *pSrcB points to the second input vector    
- * @param[out]  *pDst  points to the output vector    
- * @param[in]  numSamples number of complex samples in each vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function implements 1.31 by 1.31 multiplications and finally output is converted into 3.29 format.    
- * Input down scaling is not required.    
- */
-
-void arm_cmplx_mult_cmplx_q31(
-  q31_t * pSrcA,
-  q31_t * pSrcB,
-  q31_t * pDst,
-  uint32_t numSamples)
-{
-  q31_t a, b, c, d;                              /* Temporary variables to store real and imaginary values */
-  uint32_t blkCnt;                               /* loop counters */
-  q31_t mul1, mul2, mul3, mul4;
-  q31_t out1, out2;
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-  /* If the blockSize is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 1u;
-
-  /* First part of the processing with loop unrolling.  Compute 2 outputs at a time.     
-   ** a second loop below computes the remaining 1 sample. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-  /* If the blockSize is not a multiple of 2, compute any remaining output samples here.     
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x2u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[2 * i] - A[2 * i + 1] * B[2 * i + 1].  */
-    /* C[2 * i + 1] = A[2 * i] * B[2 * i + 1] + A[2 * i + 1] * B[2 * i].  */
-    a = *pSrcA++;
-    b = *pSrcA++;
-    c = *pSrcB++;
-    d = *pSrcB++;
-
-    mul1 = (q31_t) (((q63_t) a * c) >> 32);
-    mul2 = (q31_t) (((q63_t) b * d) >> 32);
-    mul3 = (q31_t) (((q63_t) a * d) >> 32);
-    mul4 = (q31_t) (((q63_t) b * c) >> 32);
-
-    mul1 = (mul1 >> 1);
-    mul2 = (mul2 >> 1);
-    mul3 = (mul3 >> 1);
-    mul4 = (mul4 >> 1);
-
-    out1 = mul1 - mul2;
-    out2 = mul3 + mul4;
-
-    /* store the real result in 3.29 format in the destination buffer. */
-    *pDst++ = out1;
-    /* store the imag result in 3.29 format in the destination buffer. */
-    *pDst++ = out2;
-
-    /* Decrement the blockSize loop counter */
-    blkCnt--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of CmplxByCmplxMult group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c
deleted file mode 100644
index c7a7df4..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_real_f32.c    
-*    
-* Description:	Floating-point complex by real multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**        
- * @ingroup groupCmplxMath        
- */
-
-/**        
- * @defgroup CmplxByRealMult Complex-by-Real Multiplication        
- *        
- * Multiplies a complex vector by a real vector and generates a complex result.        
- * The data in the complex arrays is stored in an interleaved fashion        
- * (real, imag, real, imag, ...).        
- * The parameter numSamples represents the number of complex        
- * samples processed.  The complex arrays have a total of 2*numSamples        
- * real values while the real array has a total of numSamples        
- * real values.        
- *        
- * The underlying algorithm is used:        
- *        
- * 
        
- * for(n=0; n        
- *        
- * There are separate functions for floating-point, Q15, and Q31 data types.        
- */
-
-/**        
- * @addtogroup CmplxByRealMult        
- * @{        
- */
-
-
-/**        
- * @brief  Floating-point complex-by-real multiplication        
- * @param[in]  *pSrcCmplx points to the complex input vector        
- * @param[in]  *pSrcReal points to the real input vector        
- * @param[out]  *pCmplxDst points to the complex output vector        
- * @param[in]  numSamples number of samples in each vector        
- * @return none.        
- */
-
-void arm_cmplx_mult_real_f32(
-  float32_t * pSrcCmplx,
-  float32_t * pSrcReal,
-  float32_t * pCmplxDst,
-  uint32_t numSamples)
-{
-  float32_t in;                                  /* Temporary variable to store input value */
-  uint32_t blkCnt;                               /* loop counters */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  float32_t inA1, inA2, inA3, inA4;              /* Temporary variables to hold input data */
-  float32_t inA5, inA6, inA7, inA8;              /* Temporary variables to hold input data */
-  float32_t inB1, inB2, inB3, inB4;              /* Temporary variables to hold input data */
-  float32_t out1, out2, out3, out4;              /* Temporary variables to hold output data */
-  float32_t out5, out6, out7, out8;              /* Temporary variables to hold output data */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.        
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    /* read input from complex input buffer */
-    inA1 = pSrcCmplx[0];
-    inA2 = pSrcCmplx[1];
-    /* read input from real input buffer */
-    inB1 = pSrcReal[0];
-
-    /* read input from complex input buffer */
-    inA3 = pSrcCmplx[2];
-
-    /* multiply complex buffer real input with real buffer input */
-    out1 = inA1 * inB1;
-
-    /* read input from complex input buffer */
-    inA4 = pSrcCmplx[3];
-
-    /* multiply complex buffer imaginary input with real buffer input */
-    out2 = inA2 * inB1;
-
-    /* read input from real input buffer */
-    inB2 = pSrcReal[1];
-    /* read input from complex input buffer */
-    inA5 = pSrcCmplx[4];
-
-    /* multiply complex buffer real input with real buffer input */
-    out3 = inA3 * inB2;
-
-    /* read input from complex input buffer */
-    inA6 = pSrcCmplx[5];
-    /* read input from real input buffer */
-    inB3 = pSrcReal[2];
-
-    /* multiply complex buffer imaginary input with real buffer input */
-    out4 = inA4 * inB2;
-
-    /* read input from complex input buffer */
-    inA7 = pSrcCmplx[6];
-
-    /* multiply complex buffer real input with real buffer input */
-    out5 = inA5 * inB3;
-
-    /* read input from complex input buffer */
-    inA8 = pSrcCmplx[7];
-
-    /* multiply complex buffer imaginary input with real buffer input */
-    out6 = inA6 * inB3;
-
-    /* read input from real input buffer */
-    inB4 = pSrcReal[3];
-
-    /* store result to destination bufer */
-    pCmplxDst[0] = out1;
-
-    /* multiply complex buffer real input with real buffer input */
-    out7 = inA7 * inB4;
-
-    /* store result to destination bufer */
-    pCmplxDst[1] = out2;
-
-    /* multiply complex buffer imaginary input with real buffer input */
-    out8 = inA8 * inB4;
-
-    /* store result to destination bufer */
-    pCmplxDst[2] = out3;
-    pCmplxDst[3] = out4;
-    pCmplxDst[4] = out5;
-
-    /* incremnet complex input buffer by 8 to process next samples */
-    pSrcCmplx += 8u;
-
-    /* store result to destination bufer */
-    pCmplxDst[5] = out6;
-
-    /* increment real input buffer by 4 to process next samples */
-    pSrcReal += 4u;
-
-    /* store result to destination bufer */
-    pCmplxDst[6] = out7;
-    pCmplxDst[7] = out8;
-
-    /* increment destination buffer by 8 to process next sampels */
-    pCmplxDst += 8u;
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.        
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-  blkCnt = numSamples;
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    in = *pSrcReal++;
-    /* store the result in the destination buffer. */
-    *pCmplxDst++ = (*pSrcCmplx++) * (in);
-    *pCmplxDst++ = (*pSrcCmplx++) * (in);
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-}
-
-/**        
- * @} end of CmplxByRealMult group        
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c
deleted file mode 100644
index 71396fc..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. October 2015
-* $Revision: 	V.1.4.5 a
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_real_q15.c    
-*    
-* Description:	Q15 complex by real multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE. 
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup CmplxByRealMult    
- * @{    
- */
-
-
-/**    
- * @brief  Q15 complex-by-real multiplication    
- * @param[in]  *pSrcCmplx points to the complex input vector    
- * @param[in]  *pSrcReal points to the real input vector    
- * @param[out]  *pCmplxDst points to the complex output vector    
- * @param[in]  numSamples number of samples in each vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function uses saturating arithmetic.    
- * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated.    
- */
-
-void arm_cmplx_mult_real_q15(
-  q15_t * pSrcCmplx,
-  q15_t * pSrcReal,
-  q15_t * pCmplxDst,
-  uint32_t numSamples)
-{
-  q15_t in;                                      /* Temporary variable to store input value */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counters */
-  q31_t inA1, inA2;                              /* Temporary variables to hold input data */
-  q31_t inB1;                                    /* Temporary variables to hold input data */
-  q15_t out1, out2, out3, out4;                  /* Temporary variables to hold output data */
-  q31_t mul1, mul2, mul3, mul4;                  /* Temporary variables to hold intermediate data */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    /* read complex number both real and imaginary from complex input buffer */
-    inA1 = *__SIMD32(pSrcCmplx)++;
-    /* read two real values at a time from real input buffer */
-    inB1 = *__SIMD32(pSrcReal)++;
-    /* read complex number both real and imaginary from complex input buffer */
-    inA2 = *__SIMD32(pSrcCmplx)++;
-
-    /* multiply complex number with real numbers */
-#ifndef ARM_MATH_BIG_ENDIAN
-
-    mul1 = (q31_t) ((q15_t) (inA1) * (q15_t) (inB1));
-    mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1));
-    mul3 = (q31_t) ((q15_t) (inA2) * (q15_t) (inB1 >> 16));
-    mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB1 >> 16));
-
-#else
-
-    mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16));
-    mul1 = (q31_t) ((q15_t) inA1 * (q15_t) (inB1 >> 16));
-    mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) inB1);
-    mul3 = (q31_t) ((q15_t) inA2 * (q15_t) inB1);
-
-#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
-
-    /* saturate the result */
-    out1 = (q15_t) __SSAT(mul1 >> 15u, 16);
-    out2 = (q15_t) __SSAT(mul2 >> 15u, 16);
-    out3 = (q15_t) __SSAT(mul3 >> 15u, 16);
-    out4 = (q15_t) __SSAT(mul4 >> 15u, 16);
-
-    /* pack real and imaginary outputs and store them to destination */
-    *__SIMD32(pCmplxDst)++ = __PKHBT(out1, out2, 16);
-    *__SIMD32(pCmplxDst)++ = __PKHBT(out3, out4, 16);
-
-    inA1 = *__SIMD32(pSrcCmplx)++;
-    inB1 = *__SIMD32(pSrcReal)++;
-    inA2 = *__SIMD32(pSrcCmplx)++;
-
-#ifndef ARM_MATH_BIG_ENDIAN
-
-    mul1 = (q31_t) ((q15_t) (inA1) * (q15_t) (inB1));
-    mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1));
-    mul3 = (q31_t) ((q15_t) (inA2) * (q15_t) (inB1 >> 16));
-    mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB1 >> 16));
-
-#else
-
-    mul2 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16));
-    mul1 = (q31_t) ((q15_t) inA1 * (q15_t) (inB1 >> 16));
-    mul4 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) inB1);
-    mul3 = (q31_t) ((q15_t) inA2 * (q15_t) inB1);
-
-#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
-
-    out1 = (q15_t) __SSAT(mul1 >> 15u, 16);
-    out2 = (q15_t) __SSAT(mul2 >> 15u, 16);
-    out3 = (q15_t) __SSAT(mul3 >> 15u, 16);
-    out4 = (q15_t) __SSAT(mul4 >> 15u, 16);
-
-    *__SIMD32(pCmplxDst)++ = __PKHBT(out1, out2, 16);
-    *__SIMD32(pCmplxDst)++ = __PKHBT(out3, out4, 16);
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    in = *pSrcReal++;
-    /* store the result in the destination buffer. */
-    *pCmplxDst++ =
-      (q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
-    *pCmplxDst++ =
-      (q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* realOut = realA * realB.            */
-    /* imagOut = imagA * realB.                */
-    in = *pSrcReal++;
-    /* store the result in the destination buffer. */
-    *pCmplxDst++ =
-      (q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
-    *pCmplxDst++ =
-      (q15_t) __SSAT((((q31_t) (*pSrcCmplx++) * (in)) >> 15), 16);
-
-    /* Decrement the numSamples loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of CmplxByRealMult group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c
deleted file mode 100644
index e4e11ab..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_cmplx_mult_real_q31.c    
-*    
-* Description:	Q31 complex by real multiplication    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
-/**    
- * @ingroup groupCmplxMath    
- */
-
-/**    
- * @addtogroup CmplxByRealMult    
- * @{    
- */
-
-
-/**    
- * @brief  Q31 complex-by-real multiplication    
- * @param[in]  *pSrcCmplx points to the complex input vector    
- * @param[in]  *pSrcReal points to the real input vector    
- * @param[out]  *pCmplxDst points to the complex output vector    
- * @param[in]  numSamples number of samples in each vector    
- * @return none.    
- *    
- * Scaling and Overflow Behavior:    
- * \par    
- * The function uses saturating arithmetic.    
- * Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated.    
- */
-
-void arm_cmplx_mult_real_q31(
-  q31_t * pSrcCmplx,
-  q31_t * pSrcReal,
-  q31_t * pCmplxDst,
-  uint32_t numSamples)
-{
-  q31_t inA1;                                    /* Temporary variable to store input value */
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-  uint32_t blkCnt;                               /* loop counters */
-  q31_t inA2, inA3, inA4;                        /* Temporary variables to hold input data */
-  q31_t inB1, inB2;                              /* Temporary variabels to hold input data */
-  q31_t out1, out2, out3, out4;                  /* Temporary variables to hold output data */
-
-  /* loop Unrolling */
-  blkCnt = numSamples >> 2u;
-
-  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
-   ** a second loop below computes the remaining 1 to 3 samples. */
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    /* read real input from complex input buffer */
-    inA1 = *pSrcCmplx++;
-    inA2 = *pSrcCmplx++;
-    /* read input from real input bufer */
-    inB1 = *pSrcReal++;
-    inB2 = *pSrcReal++;
-    /* read imaginary input from complex input buffer */
-    inA3 = *pSrcCmplx++;
-    inA4 = *pSrcCmplx++;
-
-    /* multiply complex input with real input */
-    out1 = ((q63_t) inA1 * inB1) >> 32;
-    out2 = ((q63_t) inA2 * inB1) >> 32;
-    out3 = ((q63_t) inA3 * inB2) >> 32;
-    out4 = ((q63_t) inA4 * inB2) >> 32;
-
-    /* sature the result */
-    out1 = __SSAT(out1, 31);
-    out2 = __SSAT(out2, 31);
-    out3 = __SSAT(out3, 31);
-    out4 = __SSAT(out4, 31);
-
-    /* get result in 1.31 format */
-    out1 = out1 << 1;
-    out2 = out2 << 1;
-    out3 = out3 << 1;
-    out4 = out4 << 1;
-
-    /* store the result to destination buffer */
-    *pCmplxDst++ = out1;
-    *pCmplxDst++ = out2;
-    *pCmplxDst++ = out3;
-    *pCmplxDst++ = out4;
-
-    /* read real input from complex input buffer */
-    inA1 = *pSrcCmplx++;
-    inA2 = *pSrcCmplx++;
-    /* read input from real input bufer */
-    inB1 = *pSrcReal++;
-    inB2 = *pSrcReal++;
-    /* read imaginary input from complex input buffer */
-    inA3 = *pSrcCmplx++;
-    inA4 = *pSrcCmplx++;
-
-    /* multiply complex input with real input */
-    out1 = ((q63_t) inA1 * inB1) >> 32;
-    out2 = ((q63_t) inA2 * inB1) >> 32;
-    out3 = ((q63_t) inA3 * inB2) >> 32;
-    out4 = ((q63_t) inA4 * inB2) >> 32;
-
-    /* sature the result */
-    out1 = __SSAT(out1, 31);
-    out2 = __SSAT(out2, 31);
-    out3 = __SSAT(out3, 31);
-    out4 = __SSAT(out4, 31);
-
-    /* get result in 1.31 format */
-    out1 = out1 << 1;
-    out2 = out2 << 1;
-    out3 = out3 << 1;
-    out4 = out4 << 1;
-
-    /* store the result to destination buffer */
-    *pCmplxDst++ = out1;
-    *pCmplxDst++ = out2;
-    *pCmplxDst++ = out3;
-    *pCmplxDst++ = out4;
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-  /* If the numSamples is not a multiple of 4, compute any remaining output samples here.    
-   ** No loop unrolling is used. */
-  blkCnt = numSamples % 0x4u;
-
-  while(blkCnt > 0u)
-  {
-    /* C[2 * i] = A[2 * i] * B[i].            */
-    /* C[2 * i + 1] = A[2 * i + 1] * B[i].        */
-    /* read real input from complex input buffer */
-    inA1 = *pSrcCmplx++;
-    inA2 = *pSrcCmplx++;
-    /* read input from real input bufer */
-    inB1 = *pSrcReal++;
-
-    /* multiply complex input with real input */
-    out1 = ((q63_t) inA1 * inB1) >> 32;
-    out2 = ((q63_t) inA2 * inB1) >> 32;
-
-    /* sature the result */
-    out1 = __SSAT(out1, 31);
-    out2 = __SSAT(out2, 31);
-
-    /* get result in 1.31 format */
-    out1 = out1 << 1;
-    out2 = out2 << 1;
-
-    /* store the result to destination buffer */
-    *pCmplxDst++ = out1;
-    *pCmplxDst++ = out2;
-
-    /* Decrement the numSamples loop counter */
-    blkCnt--;
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  while(numSamples > 0u)
-  {
-    /* realOut = realA * realB.            */
-    /* imagReal = imagA * realB.               */
-    inA1 = *pSrcReal++;
-    /* store the result in the destination buffer. */
-    *pCmplxDst++ =
-      (q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * inA1) >> 31);
-    *pCmplxDst++ =
-      (q31_t) clip_q63_to_q31(((q63_t) * pSrcCmplx++ * inA1) >> 31);
-
-    /* Decrement the numSamples loop counter */
-    numSamples--;
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of CmplxByRealMult group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c
deleted file mode 100644
index b1f35d6..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_init_f32.c    
-*    
-* Description:	Floating-point PID Control initialization function    
-*				   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* ------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
- * @brief  Initialization function for the floating-point PID Control.   
- * @param[in,out] *S points to an instance of the PID structure.   
- * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state & 1 = reset the state.   
- * @return none.   
- * \par Description:   
- * \par    
- * The resetStateFlag specifies whether to set state to zero or not. \n   
- * The function computes the structure fields: A0, A1 A2    
- * using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)    
- * also sets the state variables to all zeros.    
- */
-
-void arm_pid_init_f32(
-  arm_pid_instance_f32 * S,
-  int32_t resetStateFlag)
-{
-
-  /* Derived coefficient A0 */
-  S->A0 = S->Kp + S->Ki + S->Kd;
-
-  /* Derived coefficient A1 */
-  S->A1 = (-S->Kp) - ((float32_t) 2.0 * S->Kd);
-
-  /* Derived coefficient A2 */
-  S->A2 = S->Kd;
-
-  /* Check whether state needs reset or not */
-  if(resetStateFlag)
-  {
-    /* Clear the state buffer.  The size will be always 3 samples */
-    memset(S->state, 0, 3u * sizeof(float32_t));
-  }
-
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c
deleted file mode 100644
index 94a0ee7..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_init_q15.c    
-*    
-* Description:	Q15 PID Control initialization function    
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
- * @details    
- * @param[in,out] *S points to an instance of the Q15 PID structure.    
- * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.    
- * @return none.    
- * \par Description:   
- * \par    
- * The resetStateFlag specifies whether to set state to zero or not. \n   
- * The function computes the structure fields: A0, A1 A2    
- * using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)    
- * also sets the state variables to all zeros.    
- */
-
-void arm_pid_init_q15(
-  arm_pid_instance_q15 * S,
-  int32_t resetStateFlag)
-{
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-
-  /* Derived coefficient A0 */
-  S->A0 = __QADD16(__QADD16(S->Kp, S->Ki), S->Kd);
-
-  /* Derived coefficients and pack into A1 */
-
-#ifndef  ARM_MATH_BIG_ENDIAN
-
-  S->A1 = __PKHBT(-__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), S->Kd, 16);
-
-#else
-
-  S->A1 = __PKHBT(S->Kd, -__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), 16);
-
-#endif /*      #ifndef  ARM_MATH_BIG_ENDIAN    */
-
-  /* Check whether state needs reset or not */
-  if(resetStateFlag)
-  {
-    /* Clear the state buffer.  The size will be always 3 samples */
-    memset(S->state, 0, 3u * sizeof(q15_t));
-  }
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  q31_t temp;                                    /*to store the sum */
-
-  /* Derived coefficient A0 */
-  temp = S->Kp + S->Ki + S->Kd;
-  S->A0 = (q15_t) __SSAT(temp, 16);
-
-  /* Derived coefficients and pack into A1 */
-  temp = -(S->Kd + S->Kd + S->Kp);
-  S->A1 = (q15_t) __SSAT(temp, 16);
-  S->A2 = S->Kd;
-
-
-
-  /* Check whether state needs reset or not */
-  if(resetStateFlag)
-  {
-    /* Clear the state buffer.  The size will be always 3 samples */
-    memset(S->state, 0, 3u * sizeof(q15_t));
-  }
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c
deleted file mode 100644
index 3927647..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_init_q31.c    
-*    
-* Description:	Q31 PID Control initialization function     
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.  
-* ------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
- * @brief  Initialization function for the Q31 PID Control.   
- * @param[in,out] *S points to an instance of the Q31 PID structure.   
- * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.   
- * @return none.    
- * \par Description:   
- * \par    
- * The resetStateFlag specifies whether to set state to zero or not. \n   
- * The function computes the structure fields: A0, A1 A2    
- * using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)    
- * also sets the state variables to all zeros.    
- */
-
-void arm_pid_init_q31(
-  arm_pid_instance_q31 * S,
-  int32_t resetStateFlag)
-{
-
-#ifndef ARM_MATH_CM0_FAMILY
-
-  /* Run the below code for Cortex-M4 and Cortex-M3 */
-
-  /* Derived coefficient A0 */
-  S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd);
-
-  /* Derived coefficient A1 */
-  S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp);
-
-
-#else
-
-  /* Run the below code for Cortex-M0 */
-
-  q31_t temp;
-
-  /* Derived coefficient A0 */
-  temp = clip_q63_to_q31((q63_t) S->Kp + S->Ki);
-  S->A0 = clip_q63_to_q31((q63_t) temp + S->Kd);
-
-  /* Derived coefficient A1 */
-  temp = clip_q63_to_q31((q63_t) S->Kd + S->Kd);
-  S->A1 = -clip_q63_to_q31((q63_t) temp + S->Kp);
-
-#endif /* #ifndef ARM_MATH_CM0_FAMILY */
-
-  /* Derived coefficient A2 */
-  S->A2 = S->Kd;
-
-  /* Check whether state needs reset or not */
-  if(resetStateFlag)
-  {
-    /* Clear the state buffer.  The size will be always 3 samples */
-    memset(S->state, 0, 3u * sizeof(q31_t));
-  }
-
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c
deleted file mode 100644
index fb108fd..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_reset_f32.c    
-*    
-* Description:	Floating-point PID Control reset function   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* ------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
-* @brief  Reset function for the floating-point PID Control.   
-* @param[in] *S	Instance pointer of PID control data structure.   
-* @return none.    
-* \par Description:   
-* The function resets the state buffer to zeros.    
-*/
-void arm_pid_reset_f32(
-  arm_pid_instance_f32 * S)
-{
-
-  /* Clear the state buffer.  The size will be always 3 samples */
-  memset(S->state, 0, 3u * sizeof(float32_t));
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c
deleted file mode 100644
index 1e48c43..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_reset_q15.c    
-*    
-* Description:	Q15 PID Control reset function   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE. 
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
-* @brief  Reset function for the Q15 PID Control.   
-* @param[in] *S		Instance pointer of PID control data structure.   
-* @return none.    
-* \par Description:   
-* The function resets the state buffer to zeros.    
-*/
-void arm_pid_reset_q15(
-  arm_pid_instance_q15 * S)
-{
-  /* Reset state to zero, The size will be always 3 samples */
-  memset(S->state, 0, 3u * sizeof(q15_t));
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c
deleted file mode 100644
index 419d2db..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:	    arm_pid_reset_q31.c    
-*    
-* Description:	Q31 PID Control reset function   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.    
-* ------------------------------------------------------------------- */
-
-#include "arm_math.h"
-
- /**    
- * @addtogroup PID    
- * @{    
- */
-
-/**    
-* @brief  Reset function for the Q31 PID Control.   
-* @param[in] *S	Instance pointer of PID control data structure.   
-* @return none.    
-* \par Description:   
-* The function resets the state buffer to zeros.    
-*/
-void arm_pid_reset_q31(
-  arm_pid_instance_q31 * S)
-{
-
-  /* Clear the state buffer.  The size will be always 3 samples */
-  memset(S->state, 0, 3u * sizeof(q31_t));
-}
-
-/**    
- * @} end of PID group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c
deleted file mode 100644
index 3024cbc..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_sin_cos_f32.c    
-*    
-* Description:	Sine and Cosine calculation for floating-point values.   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.   
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-#include "arm_common_tables.h"
-
-/**    
- * @ingroup groupController    
- */
-
-/**    
- * @defgroup SinCos Sine Cosine   
- *    
- * Computes the trigonometric sine and cosine values using a combination of table lookup   
- * and linear interpolation.     
- * There are separate functions for Q31 and floating-point data types.   
- * The input to the floating-point version is in degrees while the   
- * fixed-point Q31 have a scaled input with the range   
- * [-1 0.9999] mapping to [-180 +180] degrees.   
- *
- * The floating point function also allows values that are out of the usual range. When this happens, the function will
- * take extra time to adjust the input value to the range of [-180 180].
- *   
- * The implementation is based on table lookup using 360 values together with linear interpolation.   
- * The steps used are:   
- *  -# Calculation of the nearest integer table index.   
- *  -# Compute the fractional portion (fract) of the input.   
- *  -# Fetch the value corresponding to \c index from sine table to \c y0 and also value from \c index+1 to \c y1.      
- *  -# Sine value is computed as  *psinVal = y0 + (fract * (y1 - y0)).    
- *  -# Fetch the value corresponding to \c index from cosine table to \c y0 and also value from \c index+1 to \c y1.      
- *  -# Cosine value is computed as  *pcosVal = y0 + (fract * (y1 - y0)).    
- */
-
- /**    
- * @addtogroup SinCos    
- * @{    
- */
-
-/**    
- * @brief  Floating-point sin_cos function.   
- * @param[in]  theta    input value in degrees    
- * @param[out] *pSinVal points to the processed sine output.    
- * @param[out] *pCosVal points to the processed cos output.    
- * @return none.   
- */
-
-void arm_sin_cos_f32(
-  float32_t theta,
-  float32_t * pSinVal,
-  float32_t * pCosVal)
-{
-  float32_t fract, in;                             /* Temporary variables for input, output */
-  uint16_t indexS, indexC;                         /* Index variable */
-  float32_t f1, f2, d1, d2;                        /* Two nearest output values */
-  int32_t n;
-  float32_t findex, Dn, Df, temp;
-
-  /* input x is in degrees */
-  /* Scale the input, divide input by 360, for cosine add 0.25 (pi/2) to read sine table */
-  in = theta * 0.00277777777778f;
-
-  /* Calculation of floor value of input */
-  n = (int32_t) in;
-
-  /* Make negative values towards -infinity */
-  if(in < 0.0f)
-  {
-    n--;
-  }
-  /* Map input value to [0 1] */
-  in = in - (float32_t) n;
-
-  /* Calculation of index of the table */
-  findex = (float32_t) FAST_MATH_TABLE_SIZE * in;
-  indexS = ((uint16_t)findex) & 0x1ff;
-  indexC = (indexS + (FAST_MATH_TABLE_SIZE / 4)) & 0x1ff;
-
-  /* fractional value calculation */
-  fract = findex - (float32_t) indexS;
-
-  /* Read two nearest values of input value from the cos & sin tables */
-  f1 = sinTable_f32[indexC+0];
-  f2 = sinTable_f32[indexC+1];
-  d1 = -sinTable_f32[indexS+0];
-  d2 = -sinTable_f32[indexS+1];
-
-  Dn = 0.0122718463030f; // delta between the two points (fixed), in this case 2*pi/FAST_MATH_TABLE_SIZE
-  Df = f2 - f1; // delta between the values of the functions
-  temp = Dn*(d1 + d2) - 2*Df;
-  temp = fract*temp + (3*Df - (d2 + 2*d1)*Dn);
-  temp = fract*temp + d1*Dn;
-
-  /* Calculation of cosine value */
-  *pCosVal = fract*temp + f1;
-  
-  /* Read two nearest values of input value from the cos & sin tables */
-  f1 = sinTable_f32[indexS+0];
-  f2 = sinTable_f32[indexS+1];
-  d1 = sinTable_f32[indexC+0];
-  d2 = sinTable_f32[indexC+1];
-
-  Df = f2 - f1; // delta between the values of the functions
-  temp = Dn*(d1 + d2) - 2*Df;
-  temp = fract*temp + (3*Df - (d2 + 2*d1)*Dn);
-  temp = fract*temp + d1*Dn;
-  
-  /* Calculation of sine value */
-  *pSinVal = fract*temp + f1;
-}
-/**    
- * @} end of SinCos group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c
deleted file mode 100644
index 2e96bed..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* ----------------------------------------------------------------------    
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.    
-*    
-* $Date:        19. March 2015
-* $Revision: 	V.1.4.5
-*    
-* Project: 	    CMSIS DSP Library    
-* Title:		arm_sin_cos_q31.c    
-*    
-* Description:	Cosine & Sine calculation for Q31 values.   
-*    
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*  
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the 
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.    
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-#include "arm_common_tables.h"
-
-/**    
- * @ingroup groupController    
- */
-
- /**    
- * @addtogroup SinCos    
- * @{    
- */
-
-/**    
- * @brief  Q31 sin_cos function.   
- * @param[in]  theta    scaled input value in degrees    
- * @param[out] *pSinVal points to the processed sine output.    
- * @param[out] *pCosVal points to the processed cosine output.    
- * @return none.   
- *    
- * The Q31 input value is in the range [-1 0.999999] and is mapped to a degree value in the range [-180 179].   
- *    
- */
-
-void arm_sin_cos_q31(
-  q31_t theta,
-  q31_t * pSinVal,
-  q31_t * pCosVal)
-{
-  q31_t fract;                                 /* Temporary variables for input, output */
-  uint16_t indexS, indexC;                     /* Index variable */
-  q31_t f1, f2, d1, d2;                        /* Two nearest output values */
-  q31_t Dn, Df;
-  q63_t temp;
-  
-  /* Calculate the nearest index */
-  indexS = (uint32_t)theta >> CONTROLLER_Q31_SHIFT;
-  indexC = (indexS + 128) & 0x1ff;
-
-  /* Calculation of fractional value */
-  fract = (theta - (indexS << CONTROLLER_Q31_SHIFT)) << 8;
-  
-  /* Read two nearest values of input value from the cos & sin tables */
-  f1 = sinTable_q31[indexC+0];
-  f2 = sinTable_q31[indexC+1];
-  d1 = -sinTable_q31[indexS+0];
-  d2 = -sinTable_q31[indexS+1];
-
-  Dn = 0x1921FB5; // delta between the two points (fixed), in this case 2*pi/FAST_MATH_TABLE_SIZE
-  Df = f2 - f1; // delta between the values of the functions
-  temp = Dn*((q63_t)d1 + d2);
-  temp = temp - ((q63_t)Df << 32);
-  temp = (q63_t)fract*(temp >> 31);
-  temp = temp + ((3*(q63_t)Df << 31) - (d2 + ((q63_t)d1 << 1))*Dn);
-  temp = (q63_t)fract*(temp >> 31);
-  temp = temp + (q63_t)d1*Dn;
-  temp = (q63_t)fract*(temp >> 31);
-
-  /* Calculation of cosine value */
-  *pCosVal = clip_q63_to_q31((temp >> 31) + (q63_t)f1);
-  
-  /* Read two nearest values of input value from the cos & sin tables */
-  f1 = sinTable_q31[indexS+0];
-  f2 = sinTable_q31[indexS+1];
-  d1 = sinTable_q31[indexC+0];
-  d2 = sinTable_q31[indexC+1];
-
-  Df = f2 - f1; // delta between the values of the functions
-  temp = Dn*((q63_t)d1 + d2);
-  temp = temp - ((q63_t)Df << 32);
-  temp = (q63_t)fract*(temp >> 31);
-  temp = temp + ((3*(q63_t)Df << 31) - (d2 + ((q63_t)d1 << 1))*Dn);
-  temp = (q63_t)fract*(temp >> 31);
-  temp = temp + (q63_t)d1*Dn;
-  temp = (q63_t)fract*(temp >> 31);
-  
-  /* Calculation of sine value */
-  *pSinVal = clip_q63_to_q31((temp >> 31) + (q63_t)f1);
-}
-
-/**    
- * @} end of SinCos group    
- */
diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c
deleted file mode 100644
index 659bb3f..0000000
--- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* ----------------------------------------------------------------------
-* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
-*
-* $Date:        21. September 2015
-* $Revision:    V.1.4.5 a
-*
-* Project:      CMSIS DSP Library
-* Title:        arm_cos_f32.c
-*
-* Description:  Fast cosine calculation for floating-point values.
-*
-* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-*   - Redistributions of source code must retain the above copyright
-*     notice, this list of conditions and the following disclaimer.
-*   - Redistributions in binary form must reproduce the above copyright
-*     notice, this list of conditions and the following disclaimer in
-*     the documentation and/or other materials provided with the
-*     distribution.
-*   - Neither the name of ARM LIMITED nor the names of its contributors
-*     may be used to endorse or promote products derived from this
-*     software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-* -------------------------------------------------------------------- */
-
-#include "arm_math.h"
-#include "arm_common_tables.h"
-/**
- * @ingroup groupFastMath
- */
-
-/**
- * @defgroup cos Cosine
- *
- * Computes the trigonometric cosine function using a combination of table lookup
- * and linear interpolation.  There are separate functions for
- * Q15, Q31, and floating-point data types.
- * The input to the floating-point version is in radians while the
- * fixed-point Q15 and Q31 have a scaled input with the range
- * [0 +0.9999] mapping to [0 2*pi).  The fixed-point range is chosen so that a
- * value of 2*pi wraps around to 0.
- *
- * The implementation is based on table lookup using 256 values together with linear interpolation.
- * The steps used are:
- *  -# Calculation of the nearest integer table index
- *  -# Compute the fractional portion (fract) of the table index.
- *  -# The final result equals (1.0f-fract)*a + fract*b;
- *
- * where
- * 
- *    b=Table[index+0];
- *    c=Table[index+1];
- * 
- */ - - /** - * @addtogroup cos - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - -float32_t arm_cos_f32( - float32_t x) -{ - float32_t cosVal, fract, in; /* Temporary variables for input, output */ - uint16_t index; /* Index variable */ - float32_t a, b; /* Two nearest output values */ - int32_t n; - float32_t findex; - - /* input x is in radians */ - /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi, add 0.25 (pi/2) to read sine table */ - in = x * 0.159154943092f + 0.25f; - - /* Calculation of floor value of input */ - n = (int32_t) in; - - /* Make negative values towards -infinity */ - if(in < 0.0f) - { - n--; - } - - /* Map input value to [0 1] */ - in = in - (float32_t) n; - - /* Calculation of index of the table */ - findex = (float32_t) FAST_MATH_TABLE_SIZE * in; - index = ((uint16_t)findex) & 0x1ff; - - /* fractional value calculation */ - fract = findex - (float32_t) index; - - /* Read two nearest values of input value from the cos table */ - a = sinTable_f32[index]; - b = sinTable_f32[index+1]; - - /* Linear interpolation process */ - cosVal = (1.0f-fract)*a + fract*b; - - /* Return the output value */ - return (cosVal); -} - -/** - * @} end of cos group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c deleted file mode 100644 index 67e0676..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 07. September 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_cos_q15.c -* -* Description: Fast cosine calculation for Q15 values. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupFastMath - */ - - /** - * @addtogroup cos - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - * - * The Q15 input value is in the range [0 +0.9999] and is mapped to a radian - * value in the range [0 2*pi). - */ - -q15_t arm_cos_q15( - q15_t x) -{ - q15_t cosVal; /* Temporary variables for input, output */ - int32_t index; /* Index variables */ - q15_t a, b; /* Four nearest output values */ - q15_t fract; /* Temporary values for fractional values */ - - /* add 0.25 (pi/2) to read sine table */ - x = (uint16_t)x + 0x2000; - if(x < 0) - { /* convert negative numbers to corresponding positive ones */ - x = (uint16_t)x + 0x8000; - } - - /* Calculate the nearest index */ - index = (uint32_t)x >> FAST_MATH_Q15_SHIFT; - - /* Calculation of fractional value */ - fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9; - - /* Read two nearest values of input value from the sin table */ - a = sinTable_q15[index]; - b = sinTable_q15[index+1]; - - /* Linear interpolation process */ - cosVal = (q31_t)(0x8000-fract)*a >> 16; - cosVal = (q15_t)((((q31_t)cosVal << 16) + ((q31_t)fract*b)) >> 16); - - return cosVal << 1; -} - -/** - * @} end of cos group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c deleted file mode 100644 index 0b3309b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 07. September 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_cos_q31.c -* -* Description: Fast cosine calculation for Q31 values. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupFastMath - */ - - /** - * @addtogroup cos - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - * - * The Q31 input value is in the range [0 +0.9999] and is mapped to a radian - * value in the range [0 2*pi). - */ - -q31_t arm_cos_q31( - q31_t x) -{ - q31_t cosVal; /* Temporary variables for input, output */ - int32_t index; /* Index variables */ - q31_t a, b; /* Four nearest output values */ - q31_t fract; /* Temporary values for fractional values */ - - /* add 0.25 (pi/2) to read sine table */ - x = (uint32_t)x + 0x20000000; - if(x < 0) - { /* convert negative numbers to corresponding positive ones */ - x = (uint32_t)x + 0x80000000; - } - - /* Calculate the nearest index */ - index = (uint32_t)x >> FAST_MATH_Q31_SHIFT; - - /* Calculation of fractional value */ - fract = (x - (index << FAST_MATH_Q31_SHIFT)) << 9; - - /* Read two nearest values of input value from the sin table */ - a = sinTable_q31[index]; - b = sinTable_q31[index+1]; - - /* Linear interpolation process */ - cosVal = (q63_t)(0x80000000-fract)*a >> 32; - cosVal = (q31_t)((((q63_t)cosVal << 32) + ((q63_t)fract*b)) >> 32); - - return cosVal << 1; -} - -/** - * @} end of cos group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c deleted file mode 100644 index 4561076..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c +++ /dev/null @@ -1,133 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 21. September 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_sin_f32.c -* -* Description: Fast sine calculation for floating-point values. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" -#include - -/** - * @ingroup groupFastMath - */ - -/** - * @defgroup sin Sine - * - * Computes the trigonometric sine function using a combination of table lookup - * and linear interpolation. There are separate functions for - * Q15, Q31, and floating-point data types. - * The input to the floating-point version is in radians while the - * fixed-point Q15 and Q31 have a scaled input with the range - * [0 +0.9999] mapping to [0 2*pi). The fixed-point range is chosen so that a - * value of 2*pi wraps around to 0. - * - * The implementation is based on table lookup using 256 values together with linear interpolation. - * The steps used are: - * -# Calculation of the nearest integer table index - * -# Compute the fractional portion (fract) of the table index. - * -# The final result equals (1.0f-fract)*a + fract*b; - * - * where - *
- *    b=Table[index+0];
- *    c=Table[index+1];
- * 
- */ - -/** - * @addtogroup sin - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - -float32_t arm_sin_f32( - float32_t x) -{ - float32_t sinVal, fract, in; /* Temporary variables for input, output */ - uint16_t index; /* Index variable */ - float32_t a, b; /* Two nearest output values */ - int32_t n; - float32_t findex; - - /* input x is in radians */ - /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi */ - in = x * 0.159154943092f; - - /* Calculation of floor value of input */ - n = (int32_t) in; - - /* Make negative values towards -infinity */ - if(x < 0.0f) - { - n--; - } - - /* Map input value to [0 1] */ - in = in - (float32_t) n; - - /* Calculation of index of the table */ - findex = (float32_t) FAST_MATH_TABLE_SIZE * in; - if (findex >= 512.0f) { - findex -= 512.0f; - } - - index = ((uint16_t)findex) & 0x1ff; - - /* fractional value calculation */ - fract = findex - (float32_t) index; - - /* Read two nearest values of input value from the sin table */ - a = sinTable_f32[index]; - b = sinTable_f32[index+1]; - - /* Linear interpolation process */ - sinVal = (1.0f-fract)*a + fract*b; - - /* Return the output value */ - return (sinVal); -} - -/** - * @} end of sin group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c deleted file mode 100644 index 0f802c6..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c +++ /dev/null @@ -1,88 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sin_q15.c -* -* Description: Fast sine calculation for Q15 values. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupFastMath - */ - - /** - * @addtogroup sin - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - * - * The Q15 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*pi). - */ - -q15_t arm_sin_q15( - q15_t x) -{ - q15_t sinVal; /* Temporary variables for input, output */ - int32_t index; /* Index variables */ - q15_t a, b; /* Four nearest output values */ - q15_t fract; /* Temporary values for fractional values */ - - /* Calculate the nearest index */ - index = (uint32_t)x >> FAST_MATH_Q15_SHIFT; - - /* Calculation of fractional value */ - fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9; - - /* Read two nearest values of input value from the sin table */ - a = sinTable_q15[index]; - b = sinTable_q15[index+1]; - - /* Linear interpolation process */ - sinVal = (q31_t)(0x8000-fract)*a >> 16; - sinVal = (q15_t)((((q31_t)sinVal << 16) + ((q31_t)fract*b)) >> 16); - - return sinVal << 1; -} - -/** - * @} end of sin group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c deleted file mode 100644 index 36112ab..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c +++ /dev/null @@ -1,87 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_sin_q31.c -* -* Description: Fast sine calculation for Q31 values. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupFastMath - */ - - /** - * @addtogroup sin - * @{ - */ - -/** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - * - * The Q31 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*pi). */ - -q31_t arm_sin_q31( - q31_t x) -{ - q31_t sinVal; /* Temporary variables for input, output */ - int32_t index; /* Index variables */ - q31_t a, b; /* Four nearest output values */ - q31_t fract; /* Temporary values for fractional values */ - - /* Calculate the nearest index */ - index = (uint32_t)x >> FAST_MATH_Q31_SHIFT; - - /* Calculation of fractional value */ - fract = (x - (index << FAST_MATH_Q31_SHIFT)) << 9; - - /* Read two nearest values of input value from the sin table */ - a = sinTable_q31[index]; - b = sinTable_q31[index+1]; - - /* Linear interpolation process */ - sinVal = (q63_t)(0x80000000-fract)*a >> 32; - sinVal = (q31_t)((((q63_t)sinVal << 32) + ((q63_t)fract*b)) >> 32); - - return sinVal << 1; -} - -/** - * @} end of sin group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c deleted file mode 100644 index 8b50963..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c +++ /dev/null @@ -1,155 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_sqrt_q15.c -* -* Description: Q15 square root function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" -#include "arm_common_tables.h" - - -/** - * @ingroup groupFastMath - */ - -/** - * @addtogroup SQRT - * @{ - */ - - /** - * @brief Q15 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if the input value is positive - * and ARM_MATH_ARGUMENT_ERROR if the input is negative. For - * negative inputs, the function returns *pOut = 0. - */ - -arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut) -{ - q15_t number, temp1, var1, signBits1, half; - q31_t bits_val1; - float32_t temp_float1; - union - { - q31_t fracval; - float32_t floatval; - } tempconv; - - number = in; - - /* If the input is a positive number then compute the signBits. */ - if(number > 0) - { - signBits1 = __CLZ(number) - 17; - - /* Shift by the number of signBits1 */ - if((signBits1 % 2) == 0) - { - number = number << signBits1; - } - else - { - number = number << (signBits1 - 1); - } - - /* Calculate half value of the number */ - half = number >> 1; - /* Store the number for later use */ - temp1 = number; - - /* Convert to float */ - temp_float1 = number * 3.051757812500000e-005f; - /*Store as integer */ - tempconv.floatval = temp_float1; - bits_val1 = tempconv.fracval; - /* Subtract the shifted value from the magic number to give intial guess */ - bits_val1 = 0x5f3759df - (bits_val1 >> 1); /* gives initial guess */ - /* Store as float */ - tempconv.fracval = bits_val1; - temp_float1 = tempconv.floatval; - /* Convert to integer format */ - var1 = (q31_t) (temp_float1 * 16384); - - /* 1st iteration */ - var1 = ((q15_t) ((q31_t) var1 * (0x3000 - - ((q15_t) - ((((q15_t) - (((q31_t) var1 * var1) >> 15)) * - (q31_t) half) >> 15))) >> 15)) << 2; - /* 2nd iteration */ - var1 = ((q15_t) ((q31_t) var1 * (0x3000 - - ((q15_t) - ((((q15_t) - (((q31_t) var1 * var1) >> 15)) * - (q31_t) half) >> 15))) >> 15)) << 2; - /* 3rd iteration */ - var1 = ((q15_t) ((q31_t) var1 * (0x3000 - - ((q15_t) - ((((q15_t) - (((q31_t) var1 * var1) >> 15)) * - (q31_t) half) >> 15))) >> 15)) << 2; - - /* Multiply the inverse square root with the original value */ - var1 = ((q15_t) (((q31_t) temp1 * var1) >> 15)) << 1; - - /* Shift the output down accordingly */ - if((signBits1 % 2) == 0) - { - var1 = var1 >> (signBits1 / 2); - } - else - { - var1 = var1 >> ((signBits1 - 1) / 2); - } - *pOut = var1; - - return (ARM_MATH_SUCCESS); - } - /* If the number is a negative number then store zero as its square root value */ - else - { - *pOut = 0; - return (ARM_MATH_ARGUMENT_ERROR); - } -} - -/** - * @} end of SQRT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c deleted file mode 100644 index 82c1646..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c +++ /dev/null @@ -1,153 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_sqrt_q31.c -* -* Description: Q31 square root function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupFastMath - */ - -/** - * @addtogroup SQRT - * @{ - */ - -/** - * @brief Q31 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if the input value is positive - * and ARM_MATH_ARGUMENT_ERROR if the input is negative. For - * negative inputs, the function returns *pOut = 0. - */ - -arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut) -{ - q31_t number, temp1, bits_val1, var1, signBits1, half; - float32_t temp_float1; - union - { - q31_t fracval; - float32_t floatval; - } tempconv; - - number = in; - - /* If the input is a positive number then compute the signBits. */ - if(number > 0) - { - signBits1 = __CLZ(number) - 1; - - /* Shift by the number of signBits1 */ - if((signBits1 % 2) == 0) - { - number = number << signBits1; - } - else - { - number = number << (signBits1 - 1); - } - - /* Calculate half value of the number */ - half = number >> 1; - /* Store the number for later use */ - temp1 = number; - - /*Convert to float */ - temp_float1 = number * 4.6566128731e-010f; - /*Store as integer */ - tempconv.floatval = temp_float1; - bits_val1 = tempconv.fracval; - /* Subtract the shifted value from the magic number to give intial guess */ - bits_val1 = 0x5f3759df - (bits_val1 >> 1); /* gives initial guess */ - /* Store as float */ - tempconv.fracval = bits_val1; - temp_float1 = tempconv.floatval; - /* Convert to integer format */ - var1 = (q31_t) (temp_float1 * 1073741824); - - /* 1st iteration */ - var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - - ((q31_t) - ((((q31_t) - (((q63_t) var1 * var1) >> 31)) * - (q63_t) half) >> 31))) >> 31)) << 2; - /* 2nd iteration */ - var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - - ((q31_t) - ((((q31_t) - (((q63_t) var1 * var1) >> 31)) * - (q63_t) half) >> 31))) >> 31)) << 2; - /* 3rd iteration */ - var1 = ((q31_t) ((q63_t) var1 * (0x30000000 - - ((q31_t) - ((((q31_t) - (((q63_t) var1 * var1) >> 31)) * - (q63_t) half) >> 31))) >> 31)) << 2; - - /* Multiply the inverse square root with the original value */ - var1 = ((q31_t) (((q63_t) temp1 * var1) >> 31)) << 1; - - /* Shift the output down accordingly */ - if((signBits1 % 2) == 0) - { - var1 = var1 >> (signBits1 / 2); - } - else - { - var1 = var1 >> ((signBits1 - 1) / 2); - } - *pOut = var1; - - return (ARM_MATH_SUCCESS); - } - /* If the number is a negative number then store zero as its square root value */ - else - { - *pOut = 0; - return (ARM_MATH_ARGUMENT_ERROR); - } -} - -/** - * @} end of SQRT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c deleted file mode 100644 index 967260f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c +++ /dev/null @@ -1,110 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_32x64_init_q31.c -* -* Description: High precision Q31 Biquad cascade filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1_32x64 - * @{ - */ - -/** - * @details - * - * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied after the accumulator. Varies according to the coefficients format. - * @return none - * - * Coefficient and State Ordering: - * - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState points to state variables array and size of each state variable is 1.63 format. - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. - * The state variables are arranged in the state array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign postShift to be applied to the output */ - S->postShift = postShift; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 4 * numStages */ - memset(pState, 0, (4u * (uint32_t) numStages) * sizeof(q63_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF1_32x64 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c deleted file mode 100644 index 37d08f4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c +++ /dev/null @@ -1,561 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_32x64_q31.c -* -* Description: High precision Q31 Biquad cascade filter processing function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup BiquadCascadeDF1_32x64 High Precision Q31 Biquad Cascade Filter - * - * This function implements a high precision Biquad cascade filter which operates on - * Q31 data values. The filter coefficients are in 1.31 format and the state variables - * are in 1.63 format. The double precision state variables reduce quantization noise - * in the filter and provide a cleaner output. - * These filters are particularly useful when implementing filters in which the - * singularities are close to the unit circle. This is common for low pass or high - * pass filters with very low cutoff frequencies. - * - * The function operates on blocks of input and output data - * and each call to the function processes blockSize samples through - * the filter. pSrc and pDst points to input and output arrays - * containing blockSize Q31 values. - * - * \par Algorithm - * Each Biquad stage implements a second order filter using the difference equation: - *
    
- *     y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]    
- * 
- * A Direct Form I algorithm is used with 5 coefficients and 4 state variables per stage. - * \image html Biquad.gif "Single Biquad filter stage" - * Coefficients b0, b1, and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. - * Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. - * Pay careful attention to the sign of the feedback coefficients. - * Some design tools use the difference equation - *
    
- *     y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]    
- * 
- * In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. - * - * \par - * Higher order filters are realized as a cascade of second order sections. - * numStages refers to the number of second order stages used. - * For example, an 8th order filter would be realized with numStages=4 second order stages. - * \image html BiquadCascade.gif "8th order filter using a cascade of Biquad stages" - * A 9th order filter would be realized with numStages=5 second order stages with the coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). - * - * \par - * The pState points to state variables array . - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2] and each state variable in 1.63 format to improve precision. - * The state variables are arranged in the array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * - * \par - * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values of data in 1.63 format. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - * - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. - * - * \par Init Function - * There is also an associated initialization function which performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numStages, pCoeffs, postShift, pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros before static initialization. - * For example, to statically initialize the filter instance structure use - *
    
- *     arm_biquad_cas_df1_32x64_ins_q31 S1 = {numStages, pState, pCoeffs, postShift};    
- * 
- * where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer; - * pCoeffs is the address of the coefficient buffer; postShift shift to be applied which is described in detail below. - * \par Fixed-Point Behavior - * Care must be taken while using Biquad Cascade 32x64 filter function. - * Following issues must be considered: - * - Scaling of coefficients - * - Filter gain - * - Overflow and saturation - * - * \par - * Filter coefficients are represented as fractional values and - * restricted to lie in the range [-1 +1). - * The processing function has an additional scaling parameter postShift - * which allows the filter coefficients to exceed the range [+1 -1). - * At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. - * \image html BiquadPostshift.gif "Fixed-point Biquad with shift by postShift bits after accumulator" - * This essentially scales the filter coefficients by 2^postShift. - * For example, to realize the coefficients - *
    
- *    {1.5, -0.8, 1.2, 1.6, -0.9}    
- * 
- * set the Coefficient array to: - *
    
- *    {0.75, -0.4, 0.6, 0.8, -0.45}    
- * 
- * and set postShift=1 - * - * \par - * The second thing to keep in mind is the gain through the filter. - * The frequency response of a Biquad filter is a function of its coefficients. - * It is possible for the gain through the filter to exceed 1.0 meaning that the filter increases the amplitude of certain frequencies. - * This means that an input signal with amplitude < 1.0 may result in an output > 1.0 and these are saturated or overflowed based on the implementation of the filter. - * To avoid this behavior the filter needs to be scaled down such that its peak gain < 1.0 or the input signal must be scaled down so that the combination of input and filter are never overflowed. - * - * \par - * The third item to consider is the overflow and saturation behavior of the fixed-point Q31 version. - * This is described in the function specific documentation below. - */ - -/** - * @addtogroup BiquadCascadeDF1_32x64 - * @{ - */ - -/** - * @details - - * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - * - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits and lie in the range [-0.25 +0.25). - * After all 5 multiply-accumulates are performed, the 2.62 accumulator is shifted by postShift bits and the result truncated to - * 1.31 format by discarding the low 32 bits. - * - * \par - * Two related functions are provided in the CMSIS DSP library. - * arm_biquad_cascade_df1_q31() implements a Biquad cascade with 32-bit coefficients and state variables with a Q63 accumulator. - * arm_biquad_cascade_df1_fast_q31() implements a Biquad cascade with 32-bit coefficients and state variables with a Q31 accumulator. - */ - -void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pIn = pSrc; /* input pointer initialization */ - q31_t *pOut = pDst; /* output pointer initialization */ - q63_t *pState = S->pState; /* state pointer initialization */ - q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ - q63_t acc; /* accumulator */ - q31_t Xn1, Xn2; /* Input Filter state variables */ - q63_t Yn1, Yn2; /* Output Filter state variables */ - q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ - q31_t Xn; /* temporary input */ - int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ - uint32_t sample, stage = S->numStages; /* loop counters */ - q31_t acc_l, acc_h; /* temporary output */ - uint32_t uShift = ((uint32_t) S->postShift + 1u); - uint32_t lShift = 32u - uShift; /* Shift to be applied to the output */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = (q31_t) (pState[0]); - Xn2 = (q31_t) (pState[1]); - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - /* The variable acc hold output value that is being computed and - * stored in the destination buffer - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) Xn *b0; - - /* acc += b1 * x[n-1] */ - acc += (q63_t) Xn1 *b1; - - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn2 *b2; - - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn1, a1); - - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn2, a2); - - /* The result is converted to 1.63 , Yn2 variable is reused */ - Yn2 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer in 1.31 format. */ - *pOut = acc_h; - - /* Read the second input into Xn2, to reuse the value */ - Xn2 = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc += b1 * x[n-1] */ - acc = (q63_t) Xn *b1; - - /* acc = b0 * x[n] */ - acc += (q63_t) Xn2 *b0; - - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn1 *b2; - - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn2, a1); - - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn1, a2); - - /* The result is converted to 1.63, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Read the third input into Xn1, to reuse the value */ - Xn1 = *pIn++; - - /* The result is converted to 1.31 */ - /* Store the output in the destination buffer. */ - *(pOut + 1u) = acc_h; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) Xn1 *b0; - - /* acc += b1 * x[n-1] */ - acc += (q63_t) Xn2 *b1; - - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn *b2; - - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn1, a1); - - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn2, a2); - - /* The result is converted to 1.63, Yn2 variable is reused */ - Yn2 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer in 1.31 format. */ - *(pOut + 2u) = acc_h; - - /* Read the fourth input into Xn, to reuse the value */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - acc = (q63_t) Xn *b0; - - /* acc += b1 * x[n-1] */ - acc += (q63_t) Xn1 *b1; - - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn2 *b2; - - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn2, a1); - - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn1, a2); - - /* The result is converted to 1.63, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer in 1.31 format. */ - *(pOut + 3u) = acc_h; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - - /* update output pointer */ - pOut += 4u; - - /* decrement the loop counter */ - sample--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - sample = (blockSize & 0x3u); - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) Xn *b0; - /* acc += b1 * x[n-1] */ - acc += (q63_t) Xn1 *b1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn2 *b2; - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn1, a1); - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn2, a2); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - /* The result is converted to 1.63, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer in 1.31 format. */ - *pOut++ = acc_h; - /* Yn1 = acc << shift; */ - - /* Store the output in the destination buffer in 1.31 format. */ -/* *pOut++ = (q31_t) (acc >> (32 - shift)); */ - - /* decrement the loop counter */ - sample--; - } - - /* The first stage output is given as input to the second stage. */ - pIn = pDst; - - /* Reset to destination buffer working pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - /* Store the updated state variables back into the pState array */ - *pState++ = (q63_t) Xn1; - *pState++ = (q63_t) Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); - -#else - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* The variable acc hold output value that is being computed and - * stored in the destination buffer - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - acc = (q63_t) Xn *b0; - /* acc += b1 * x[n-1] */ - acc += (q63_t) Xn1 *b1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) Xn2 *b2; - /* acc += a1 * y[n-1] */ - acc += mult32x64(Yn1, a1); - /* acc += a2 * y[n-2] */ - acc += mult32x64(Yn2, a2); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - - /* The result is converted to 1.63, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc_h = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer in 1.31 format. */ - *pOut++ = acc_h; - - /* Yn1 = acc << shift; */ - - /* Store the output in the destination buffer in 1.31 format. */ - /* *pOut++ = (q31_t) (acc >> (32 - shift)); */ - - /* decrement the loop counter */ - sample--; - } - - /* The first stage output is given as input to the second stage. */ - pIn = pDst; - - /* Reset to destination buffer working pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - *pState++ = (q63_t) Xn1; - *pState++ = (q63_t) Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ -} - - /** - * @} end of BiquadCascadeDF1_32x64 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c deleted file mode 100644 index a8a7adf..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c +++ /dev/null @@ -1,425 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_f32.c -* -* Description: Processing function for the -* floating-point Biquad cascade DirectFormI(DF1) filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup BiquadCascadeDF1 Biquad Cascade IIR Filters Using Direct Form I Structure - * - * This set of functions implements arbitrary order recursive (IIR) filters. - * The filters are implemented as a cascade of second order Biquad sections. - * The functions support Q15, Q31 and floating-point data types. - * Fast version of Q15 and Q31 also supported on CortexM4 and Cortex-M3. - * - * The functions operate on blocks of input and output data and each call to the function - * processes blockSize samples through the filter. - * pSrc points to the array of input data and - * pDst points to the array of output data. - * Both arrays contain blockSize values. - * - * \par Algorithm - * Each Biquad stage implements a second order filter using the difference equation: - *
    
- *     y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]    
- * 
- * A Direct Form I algorithm is used with 5 coefficients and 4 state variables per stage. - * \image html Biquad.gif "Single Biquad filter stage" - * Coefficients b0, b1 and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. - * Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. - * Pay careful attention to the sign of the feedback coefficients. - * Some design tools use the difference equation - *
    
- *     y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]    
- * 
- * In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. - * - * \par - * Higher order filters are realized as a cascade of second order sections. - * numStages refers to the number of second order stages used. - * For example, an 8th order filter would be realized with numStages=4 second order stages. - * \image html BiquadCascade.gif "8th order filter using a cascade of Biquad stages" - * A 9th order filter would be realized with numStages=5 second order stages with the coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). - * - * \par - * The pState points to state variables array. - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. - * The state variables are arranged in the pState array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * - * \par - * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values. - * The state variables are updated after each block of data is processed, the coefficients are untouched. - * - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Init Functions - * There is also an associated initialization function for each data type. - * The initialization function performs following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numStages, pCoeffs, pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros before static initialization. - * The code below statically initializes each of the 3 different data type filter instance structures - *
    
- *     arm_biquad_casd_df1_inst_f32 S1 = {numStages, pState, pCoeffs};    
- *     arm_biquad_casd_df1_inst_q15 S2 = {numStages, pState, pCoeffs, postShift};    
- *     arm_biquad_casd_df1_inst_q31 S3 = {numStages, pState, pCoeffs, postShift};    
- * 
- * where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer; - * pCoeffs is the address of the coefficient buffer; postShift shift to be applied. - * - * \par Fixed-Point Behavior - * Care must be taken when using the Q15 and Q31 versions of the Biquad Cascade filter functions. - * Following issues must be considered: - * - Scaling of coefficients - * - Filter gain - * - Overflow and saturation - * - * \par - * Scaling of coefficients: - * Filter coefficients are represented as fractional values and - * coefficients are restricted to lie in the range [-1 +1). - * The fixed-point functions have an additional scaling parameter postShift - * which allow the filter coefficients to exceed the range [+1 -1). - * At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. - * \image html BiquadPostshift.gif "Fixed-point Biquad with shift by postShift bits after accumulator" - * This essentially scales the filter coefficients by 2^postShift. - * For example, to realize the coefficients - *
    
- *    {1.5, -0.8, 1.2, 1.6, -0.9}    
- * 
- * set the pCoeffs array to: - *
    
- *    {0.75, -0.4, 0.6, 0.8, -0.45}    
- * 
- * and set postShift=1 - * - * \par - * Filter gain: - * The frequency response of a Biquad filter is a function of its coefficients. - * It is possible for the gain through the filter to exceed 1.0 meaning that the filter increases the amplitude of certain frequencies. - * This means that an input signal with amplitude < 1.0 may result in an output > 1.0 and these are saturated or overflowed based on the implementation of the filter. - * To avoid this behavior the filter needs to be scaled down such that its peak gain < 1.0 or the input signal must be scaled down so that the combination of input and filter are never overflowed. - * - * \par - * Overflow and saturation: - * For Q15 and Q31 versions, it is described separately as part of the function specific documentation below. - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @param[in] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - */ - -void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t *pIn = pSrc; /* source pointer */ - float32_t *pOut = pDst; /* destination pointer */ - float32_t *pState = S->pState; /* pState pointer */ - float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ - float32_t acc; /* Simulates the accumulator */ - float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ - float32_t Xn1, Xn2, Yn1, Yn2; /* Filter pState variables */ - float32_t Xn; /* temporary input */ - uint32_t sample, stage = S->numStages; /* loop counters */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the pState values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - /* The variable acc hold output values that are being computed: - * - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) - { - /* Read the first input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - Yn2 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = Yn2; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - - /* Read the second input */ - Xn2 = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - Yn1 = (b0 * Xn2) + (b1 * Xn) + (b2 * Xn1) + (a1 * Yn2) + (a2 * Yn1); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = Yn1; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - - /* Read the third input */ - Xn1 = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - Yn2 = (b0 * Xn1) + (b1 * Xn2) + (b2 * Xn) + (a1 * Yn1) + (a2 * Yn2); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = Yn2; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - - /* Read the forth input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - Yn1 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn2) + (a2 * Yn1); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = Yn1; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - - /* decrement the loop counter */ - sample--; - - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - sample = blockSize & 0x3u; - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - acc = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = acc; - - /* decrement the loop counter */ - sample--; - - } - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent numStages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset the output pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#else - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the pState values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* The variables acc holds the output value that is computed: - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - acc = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2); - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = acc; - - /* decrement the loop counter */ - sample--; - } - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent numStages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset the output pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - - /** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c deleted file mode 100644 index 1cd441e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c +++ /dev/null @@ -1,286 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_fast_q15.c -* -* Description: Fast processing function for the -* Q15 Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @details - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around and distorts the result. - * In order to avoid overflows completely the input signal must be scaled down by two bits and lie in the range [-0.25 +0.25). - * The 2.30 accumulator is then shifted by postShift bits and the result truncated to 1.15 format by discarding the low 16 bits. - * - * \par - * Refer to the function arm_biquad_cascade_df1_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. Both the slow and the fast versions use the same instance structure. - * Use the function arm_biquad_cascade_df1_init_q15() to initialize the filter structure. - * - */ - -void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pIn = pSrc; /* Source pointer */ - q15_t *pOut = pDst; /* Destination pointer */ - q31_t in; /* Temporary variable to hold input value */ - q31_t out; /* Temporary variable to hold output value */ - q31_t b0; /* Temporary variable to hold bo value */ - q31_t b1, a1; /* Filter coefficients */ - q31_t state_in, state_out; /* Filter state variables */ - q31_t acc; /* Accumulator */ - int32_t shift = (int32_t) (15 - S->postShift); /* Post shift */ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - uint32_t sample, stage = S->numStages; /* Stage loop counter */ - - - - do - { - - /* Read the b0 and 0 coefficients using SIMD */ - b0 = *__SIMD32(pCoeffs)++; - - /* Read the b1 and b2 coefficients using SIMD */ - b1 = *__SIMD32(pCoeffs)++; - - /* Read the a1 and a2 coefficients using SIMD */ - a1 = *__SIMD32(pCoeffs)++; - - /* Read the input state values from the state buffer: x[n-1], x[n-2] */ - state_in = *__SIMD32(pState)++; - - /* Read the output state values from the state buffer: y[n-1], y[n-2] */ - state_out = *__SIMD32(pState)--; - - /* Apply loop unrolling and compute 2 output values simultaneously. */ - /* The variable acc hold output values that are being computed: - * - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - sample = blockSize >> 1u; - - /* First part of the processing with loop unrolling. Compute 2 outputs at a time. - ** a second loop below computes the remaining 1 sample. */ - while(sample > 0u) - { - - /* Read the input */ - in = *__SIMD32(pIn)++; - - /* out = b0 * x[n] + 0 * 0 */ - out = __SMUAD(b0, in); - /* acc = b1 * x[n-1] + acc += b2 * x[n-2] + out */ - acc = __SMLAD(b1, state_in, out); - /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ - acc = __SMLAD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 and then saturation is applied */ - out = __SSAT((acc >> shift), 16); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, (in >> 16), 16); - state_out = __PKHBT(state_out >> 16, (out), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* out = b0 * x[n] + 0 * 0 */ - out = __SMUADX(b0, in); - /* acc0 = b1 * x[n-1] , acc0 += b2 * x[n-2] + out */ - acc = __SMLAD(b1, state_in, out); - /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ - acc = __SMLAD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 and then saturation is applied */ - out = __SSAT((acc >> shift), 16); - - - /* Store the output in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = __PKHBT(state_out, out, 16); - -#else - - *__SIMD32(pOut)++ = __PKHBT(out, state_out >> 16, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in >> 16, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, in, 16); - state_out = __PKHBT(state_out >> 16, out, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - /* Decrement the loop counter */ - sample--; - - } - - /* If the blockSize is not a multiple of 2, compute any remaining output samples here. - ** No loop unrolling is used. */ - - if((blockSize & 0x1u) != 0u) - { - /* Read the input */ - in = *pIn++; - - /* out = b0 * x[n] + 0 * 0 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - out = __SMUAD(b0, in); - -#else - - out = __SMUADX(b0, in); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc = b1 * x[n-1], acc += b2 * x[n-2] + out */ - acc = __SMLAD(b1, state_in, out); - /* acc += a1 * y[n-1] + acc += a2 * y[n-2] */ - acc = __SMLAD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 and then saturation is applied */ - out = __SSAT((acc >> shift), 16); - - /* Store the output in the destination buffer. */ - *pOut++ = (q15_t) out; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, in, 16); - state_out = __PKHBT(state_out >> 16, out, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - } - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent (numStages - 1) occur in-place in the output buffer */ - pIn = pDst; - - /* Reset the output pointer */ - pOut = pDst; - - /* Store the updated state variables back into the state array */ - *__SIMD32(pState)++ = state_in; - *__SIMD32(pState)++ = state_out; - - - /* Decrement the loop counter */ - stage--; - - } while(stage > 0u); -} - - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c deleted file mode 100644 index c61259d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c +++ /dev/null @@ -1,305 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_fast_q31.c -* -* Description: Processing function for the -* Q31 Fast Biquad cascade DirectFormI(DF1) filter. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @details - * - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * This function is optimized for speed at the expense of fixed-point precision and overflow protection. - * The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. - * These intermediate results are added to a 2.30 accumulator. - * Finally, the accumulator is saturated and converted to a 1.31 result. - * The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signal must be scaled down by two bits and lie in the range [-0.25 +0.25). Use the intialization function - * arm_biquad_cascade_df1_init_q31() to initialize filter structure. - * - * \par - * Refer to the function arm_biquad_cascade_df1_q31() for a slower implementation of this function which uses 64-bit accumulation to provide higher precision. Both the slow and the fast versions use the same instance structure. - * Use the function arm_biquad_cascade_df1_init_q31() to initialize the filter structure. - */ - -void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t acc = 0; /* accumulator */ - q31_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ - q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ - q31_t *pIn = pSrc; /* input pointer initialization */ - q31_t *pOut = pDst; /* output pointer initialization */ - q31_t *pState = S->pState; /* pState pointer initialization */ - q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ - q31_t Xn; /* temporary input */ - int32_t shift = (int32_t) S->postShift + 1; /* Shift to be applied to the output */ - uint32_t sample, stage = S->numStages; /* loop counters */ - - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - /* The variables acc ... acc3 hold output values that are being computed: - * - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - /*acc = (q31_t) (((q63_t) b1 * Xn1) >> 32);*/ - mult_32x32_keep32_R(acc, b1, Xn1); - /* acc += b1 * x[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b0 * (Xn))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b0, Xn); - /* acc += b[2] * x[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b2, Xn2); - /* acc += a1 * y[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a1, Yn1); - /* acc += a2 * y[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a2, Yn2); - - /* The result is converted to 1.31 , Yn2 variable is reused */ - Yn2 = acc << shift; - - /* Read the second input */ - Xn2 = *(pIn + 1u); - - /* Store the output in the destination buffer. */ - *pOut = Yn2; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - /*acc = (q31_t) (((q63_t) b0 * (Xn2)) >> 32);*/ - mult_32x32_keep32_R(acc, b0, Xn2); - /* acc += b1 * x[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b1, Xn); - /* acc += b[2] * x[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b2, Xn1); - /* acc += a1 * y[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a1, Yn2); - /* acc += a2 * y[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a2, Yn1); - - /* The result is converted to 1.31, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Read the third input */ - Xn1 = *(pIn + 2u); - - /* Store the output in the destination buffer. */ - *(pOut + 1u) = Yn1; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - /*acc = (q31_t) (((q63_t) b0 * (Xn1)) >> 32);*/ - mult_32x32_keep32_R(acc, b0, Xn1); - /* acc += b1 * x[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b1, Xn2); - /* acc += b[2] * x[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b2, Xn); - /* acc += a1 * y[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a1, Yn1); - /* acc += a2 * y[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a2, Yn2); - - /* The result is converted to 1.31, Yn2 variable is reused */ - Yn2 = acc << shift; - - /* Read the forth input */ - Xn = *(pIn + 3u); - - /* Store the output in the destination buffer. */ - *(pOut + 2u) = Yn2; - pIn += 4u; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - /*acc = (q31_t) (((q63_t) b0 * (Xn)) >> 32);*/ - mult_32x32_keep32_R(acc, b0, Xn); - /* acc += b1 * x[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b1, Xn1); - /* acc += b[2] * x[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b2, Xn2); - /* acc += a1 * y[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a1, Yn2); - /* acc += a2 * y[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a2, Yn1); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - Xn2 = Xn1; - - /* The result is converted to 1.31, Yn1 variable is reused */ - Yn1 = acc << shift; - - /* Xn1 = Xn */ - Xn1 = Xn; - - /* Store the output in the destination buffer. */ - *(pOut + 3u) = Yn1; - pOut += 4u; - - /* decrement the loop counter */ - sample--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - sample = (blockSize & 0x3u); - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - /*acc = (q31_t) (((q63_t) b0 * (Xn)) >> 32);*/ - mult_32x32_keep32_R(acc, b0, Xn); - /* acc += b1 * x[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b1 * (Xn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b1, Xn1); - /* acc += b[2] * x[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) b2 * (Xn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, b2, Xn2); - /* acc += a1 * y[n-1] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a1 * (Yn1))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a1, Yn1); - /* acc += a2 * y[n-2] */ - /*acc = (q31_t) ((((q63_t) acc << 32) + ((q63_t) a2 * (Yn2))) >> 32);*/ - multAcc_32x32_keep32_R(acc, a2, Yn2); - - /* The result is converted to 1.31 */ - acc = acc << shift; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = acc; - - /* Store the output in the destination buffer. */ - *pOut++ = acc; - - /* decrement the loop counter */ - sample--; - } - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent stages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset to destination pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); -} - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c deleted file mode 100644 index e090f25..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c +++ /dev/null @@ -1,109 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_init_f32.c -* -* Description: floating-point Biquad cascade DirectFormI(DF1) filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @details - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients array. - * @param[in] *pState points to the state array. - * @return none - * - * - * Coefficient and State Ordering: - * - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * - * \par - * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState is a pointer to state array. - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. - * The state variables are arranged in the pState array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - * - */ - -void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 4 * numStages */ - memset(pState, 0, (4u * (uint32_t) numStages) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c deleted file mode 100644 index 72f02b7..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c +++ /dev/null @@ -1,111 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_init_q15.c -* -* Description: Q15 Biquad cascade DirectFormI(DF1) filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @details - * - * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the accumulator result. Varies according to the coefficients format - * @return none - * - * Coefficient and State Ordering: - * - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, 0, b11, b12, a11, a12, b20, 0, b21, b22, a21, a22, ...}    
- * 
- * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 6*numStages values. - * The zero coefficient between b1 and b2 facilities use of 16-bit SIMD instructions on the Cortex-M4. - * - * \par - * The state variables are stored in the array pState. - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. - * The state variables are arranged in the pState array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign postShift to be applied to the output */ - S->postShift = postShift; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 4 * numStages */ - memset(pState, 0, (4u * (uint32_t) numStages) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c deleted file mode 100644 index fec08d9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c +++ /dev/null @@ -1,111 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_init_q31.c -* -* Description: Q31 Biquad cascade DirectFormI(DF1) filter initialization function. -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @details - * - * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients buffer. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied after the accumulator. Varies according to the coefficients format - * @return none - * - * Coefficient and State Ordering: - * - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState points to state variables array. - * Each Biquad stage has 4 state variables x[n-1], x[n-2], y[n-1], and y[n-2]. - * The state variables are arranged in the pState array as: - *
    
- *     {x[n-1], x[n-2], y[n-1], y[n-2]}    
- * 
- * The 4 state variables for stage 1 are first, then the 4 state variables for stage 2, and so on. - * The state array has a total length of 4*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign postShift to be applied to the output */ - S->postShift = postShift; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 4 * numStages */ - memset(pState, 0, (4u * (uint32_t) numStages) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c deleted file mode 100644 index 43bf90b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c +++ /dev/null @@ -1,411 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_q15.c -* -* Description: Processing function for the -* Q15 Biquad cascade DirectFormI(DF1) filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * The accumulator is then shifted by postShift bits to truncate the result to 1.15 format by discarding the low 16 bits. - * Finally, the result is saturated to 1.15 format. - * - * \par - * Refer to the function arm_biquad_cascade_df1_fast_q15() for a faster but less precise implementation of this filter for Cortex-M3 and Cortex-M4. - */ - -void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t *pIn = pSrc; /* Source pointer */ - q15_t *pOut = pDst; /* Destination pointer */ - q31_t in; /* Temporary variable to hold input value */ - q31_t out; /* Temporary variable to hold output value */ - q31_t b0; /* Temporary variable to hold bo value */ - q31_t b1, a1; /* Filter coefficients */ - q31_t state_in, state_out; /* Filter state variables */ - q31_t acc_l, acc_h; - q63_t acc; /* Accumulator */ - int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ - int32_t uShift = (32 - lShift); - - do - { - /* Read the b0 and 0 coefficients using SIMD */ - b0 = *__SIMD32(pCoeffs)++; - - /* Read the b1 and b2 coefficients using SIMD */ - b1 = *__SIMD32(pCoeffs)++; - - /* Read the a1 and a2 coefficients using SIMD */ - a1 = *__SIMD32(pCoeffs)++; - - /* Read the input state values from the state buffer: x[n-1], x[n-2] */ - state_in = *__SIMD32(pState)++; - - /* Read the output state values from the state buffer: y[n-1], y[n-2] */ - state_out = *__SIMD32(pState)--; - - /* Apply loop unrolling and compute 2 output values simultaneously. */ - /* The variable acc hold output values that are being computed: - * - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - sample = blockSize >> 1u; - - /* First part of the processing with loop unrolling. Compute 2 outputs at a time. - ** a second loop below computes the remaining 1 sample. */ - while(sample > 0u) - { - - /* Read the input */ - in = *__SIMD32(pIn)++; - - /* out = b0 * x[n] + 0 * 0 */ - out = __SMUAD(b0, in); - - /* acc += b1 * x[n-1] + b2 * x[n-2] + out */ - acc = __SMLALD(b1, state_in, out); - /* acc += a1 * y[n-1] + a2 * y[n-2] */ - acc = __SMLALD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - out = (uint32_t) acc_l >> lShift | acc_h << uShift; - - out = __SSAT(out, 16); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, (in >> 16), 16); - state_out = __PKHBT(state_out >> 16, (out), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* out = b0 * x[n] + 0 * 0 */ - out = __SMUADX(b0, in); - /* acc += b1 * x[n-1] + b2 * x[n-2] + out */ - acc = __SMLALD(b1, state_in, out); - /* acc += a1 * y[n-1] + a2 * y[n-2] */ - acc = __SMLALD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - out = (uint32_t) acc_l >> lShift | acc_h << uShift; - - out = __SSAT(out, 16); - - /* Store the output in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = __PKHBT(state_out, out, 16); - -#else - - *__SIMD32(pOut)++ = __PKHBT(out, state_out >> 16, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in >> 16, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, in, 16); - state_out = __PKHBT(state_out >> 16, out, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - /* Decrement the loop counter */ - sample--; - - } - - /* If the blockSize is not a multiple of 2, compute any remaining output samples here. - ** No loop unrolling is used. */ - - if((blockSize & 0x1u) != 0u) - { - /* Read the input */ - in = *pIn++; - - /* out = b0 * x[n] + 0 * 0 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - out = __SMUAD(b0, in); - -#else - - out = __SMUADX(b0, in); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc = b1 * x[n-1] + b2 * x[n-2] + out */ - acc = __SMLALD(b1, state_in, out); - /* acc += a1 * y[n-1] + a2 * y[n-2] */ - acc = __SMLALD(a1, state_out, acc); - - /* The result is converted from 3.29 to 1.31 if postShift = 1, and then saturation is applied */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - out = (uint32_t) acc_l >> lShift | acc_h << uShift; - - out = __SSAT(out, 16); - - /* Store the output in the destination buffer. */ - *pOut++ = (q15_t) out; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - /* x[n-N], x[n-N-1] are packed together to make state_in of type q31 */ - /* y[n-N], y[n-N-1] are packed together to make state_out of type q31 */ - -#ifndef ARM_MATH_BIG_ENDIAN - - state_in = __PKHBT(in, state_in, 16); - state_out = __PKHBT(out, state_out, 16); - -#else - - state_in = __PKHBT(state_in >> 16, in, 16); - state_out = __PKHBT(state_out >> 16, out, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - } - - /* The first stage goes from the input wire to the output wire. */ - /* Subsequent numStages occur in-place in the output wire */ - pIn = pDst; - - /* Reset the output pointer */ - pOut = pDst; - - /* Store the updated state variables back into the state array */ - *__SIMD32(pState)++ = state_in; - *__SIMD32(pState)++ = state_out; - - - /* Decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t *pIn = pSrc; /* Source pointer */ - q15_t *pOut = pDst; /* Destination pointer */ - q15_t b0, b1, b2, a1, a2; /* Filter coefficients */ - q15_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ - q15_t Xn; /* temporary input */ - q63_t acc; /* Accumulator */ - int32_t shift = (15 - (int32_t) S->postShift); /* Post shift */ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - uint32_t sample, stage = (uint32_t) S->numStages; /* Stage loop counter */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - pCoeffs++; // skip the 0 coefficient - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* The variables acc holds the output value that is computed: - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - acc = (q31_t) b0 *Xn; - - /* acc += b1 * x[n-1] */ - acc += (q31_t) b1 *Xn1; - /* acc += b[2] * x[n-2] */ - acc += (q31_t) b2 *Xn2; - /* acc += a1 * y[n-1] */ - acc += (q31_t) a1 *Yn1; - /* acc += a2 * y[n-2] */ - acc += (q31_t) a2 *Yn2; - - /* The result is converted to 1.31 */ - acc = __SSAT((acc >> shift), 16); - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = (q15_t) acc; - - /* Store the output in the destination buffer. */ - *pOut++ = (q15_t) acc; - - /* decrement the loop counter */ - sample--; - } - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent stages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset to destination pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c deleted file mode 100644 index c30163e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c +++ /dev/null @@ -1,405 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df1_q31.c -* -* Description: Processing function for the -* Q31 Biquad cascade filter -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF1 - * @{ - */ - -/** - * @brief Processing function for the Q31 Biquad cascade filter. - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits and lie in the range [-0.25 +0.25). - * After all 5 multiply-accumulates are performed, the 2.62 accumulator is shifted by postShift bits and the result truncated to - * 1.31 format by discarding the low 32 bits. - * - * \par - * Refer to the function arm_biquad_cascade_df1_fast_q31() for a faster but less precise implementation of this filter for Cortex-M3 and Cortex-M4. - */ - -void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q63_t acc; /* accumulator */ - uint32_t uShift = ((uint32_t) S->postShift + 1u); - uint32_t lShift = 32u - uShift; /* Shift to be applied to the output */ - q31_t *pIn = pSrc; /* input pointer initialization */ - q31_t *pOut = pDst; /* output pointer initialization */ - q31_t *pState = S->pState; /* pState pointer initialization */ - q31_t *pCoeffs = S->pCoeffs; /* coeff pointer initialization */ - q31_t Xn1, Xn2, Yn1, Yn2; /* Filter state variables */ - q31_t b0, b1, b2, a1, a2; /* Filter coefficients */ - q31_t Xn; /* temporary input */ - uint32_t sample, stage = S->numStages; /* loop counters */ - - -#ifndef ARM_MATH_CM0_FAMILY_FAMILY - - q31_t acc_l, acc_h; /* temporary output variables */ - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - /* The variable acc hold output values that are being computed: - * - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn; - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn2; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn1; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn2; - - /* The result is converted to 1.31 , Yn2 variable is reused */ - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - Yn2 = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer. */ - *pOut++ = Yn2; - - /* Read the second input */ - Xn2 = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn2; - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn1; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn2; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn1; - - - /* The result is converted to 1.31, Yn1 variable is reused */ - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - - /* Apply shift for lower part of acc and upper part of acc */ - Yn1 = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer. */ - *pOut++ = Yn1; - - /* Read the third input */ - Xn1 = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn1; - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn2; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn1; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn2; - - /* The result is converted to 1.31, Yn2 variable is reused */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - - /* Apply shift for lower part of acc and upper part of acc */ - Yn2 = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the output in the destination buffer. */ - *pOut++ = Yn2; - - /* Read the forth input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn; - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn2; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn2; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn1; - - /* The result is converted to 1.31, Yn1 variable is reused */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - Yn1 = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - - /* Store the output in the destination buffer. */ - *pOut++ = Yn1; - - /* decrement the loop counter */ - sample--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - sample = (blockSize & 0x3u); - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn; - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn2; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn1; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn2; - - /* The result is converted to 1.31 */ - acc = acc >> lShift; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = (q31_t) acc; - - /* Store the output in the destination buffer. */ - *pOut++ = (q31_t) acc; - - /* decrement the loop counter */ - sample--; - } - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent stages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset to destination pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); - -#else - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /* Reading the state values */ - Xn1 = pState[0]; - Xn2 = pState[1]; - Yn1 = pState[2]; - Yn2 = pState[3]; - - /* The variables acc holds the output value that is computed: - * acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] - */ - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn = *pIn++; - - /* acc = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */ - /* acc = b0 * x[n] */ - acc = (q63_t) b0 *Xn; - - /* acc += b1 * x[n-1] */ - acc += (q63_t) b1 *Xn1; - /* acc += b[2] * x[n-2] */ - acc += (q63_t) b2 *Xn2; - /* acc += a1 * y[n-1] */ - acc += (q63_t) a1 *Yn1; - /* acc += a2 * y[n-2] */ - acc += (q63_t) a2 *Yn2; - - /* The result is converted to 1.31 */ - acc = acc >> lShift; - - /* Every time after the output is computed state should be updated. */ - /* The states should be updated as: */ - /* Xn2 = Xn1 */ - /* Xn1 = Xn */ - /* Yn2 = Yn1 */ - /* Yn1 = acc */ - Xn2 = Xn1; - Xn1 = Xn; - Yn2 = Yn1; - Yn1 = (q31_t) acc; - - /* Store the output in the destination buffer. */ - *pOut++ = (q31_t) acc; - - /* decrement the loop counter */ - sample--; - } - - /* The first stage goes from the input buffer to the output buffer. */ - /* Subsequent stages occur in-place in the output buffer */ - pIn = pDst; - - /* Reset to destination pointer */ - pOut = pDst; - - /* Store the updated state variables back into the pState array */ - *pState++ = Xn1; - *pState++ = Xn2; - *pState++ = Yn1; - *pState++ = Yn2; - - } while(--stage); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */ -} - - - - -/** - * @} end of BiquadCascadeDF1 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c deleted file mode 100644 index 024034c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c +++ /dev/null @@ -1,603 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df2T_f32.c -* -* Description: Processing function for the floating-point transposed -* direct form II Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** -* @ingroup groupFilters -*/ - -/** -* @defgroup BiquadCascadeDF2T Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure -* -* This set of functions implements arbitrary order recursive (IIR) filters using a transposed direct form II structure. -* The filters are implemented as a cascade of second order Biquad sections. -* These functions provide a slight memory savings as compared to the direct form I Biquad filter functions. -* Only floating-point data is supported. -* -* This function operate on blocks of input and output data and each call to the function -* processes blockSize samples through the filter. -* pSrc points to the array of input data and -* pDst points to the array of output data. -* Both arrays contain blockSize values. -* -* \par Algorithm -* Each Biquad stage implements a second order filter using the difference equation: -*
       
-*    y[n] = b0 * x[n] + d1       
-*    d1 = b1 * x[n] + a1 * y[n] + d2       
-*    d2 = b2 * x[n] + a2 * y[n]       
-* 
-* where d1 and d2 represent the two state values. -* -* \par -* A Biquad filter using a transposed Direct Form II structure is shown below. -* \image html BiquadDF2Transposed.gif "Single transposed Direct Form II Biquad" -* Coefficients b0, b1, and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. -* Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. -* Pay careful attention to the sign of the feedback coefficients. -* Some design tools flip the sign of the feedback coefficients: -*
       
-*    y[n] = b0 * x[n] + d1;       
-*    d1 = b1 * x[n] - a1 * y[n] + d2;       
-*    d2 = b2 * x[n] - a2 * y[n];       
-* 
-* In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. -* -* \par -* Higher order filters are realized as a cascade of second order sections. -* numStages refers to the number of second order stages used. -* For example, an 8th order filter would be realized with numStages=4 second order stages. -* A 9th order filter would be realized with numStages=5 second order stages with the -* coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). -* -* \par -* pState points to the state variable array. -* Each Biquad stage has 2 state variables d1 and d2. -* The state variables are arranged in the pState array as: -*
       
-*     {d11, d12, d21, d22, ...}       
-* 
-* where d1x refers to the state variables for the first Biquad and -* d2x refers to the state variables for the second Biquad. -* The state array has a total length of 2*numStages values. -* The state variables are updated after each block of data is processed; the coefficients are untouched. -* -* \par -* The CMSIS library contains Biquad filters in both Direct Form I and transposed Direct Form II. -* The advantage of the Direct Form I structure is that it is numerically more robust for fixed-point data types. -* That is why the Direct Form I structure supports Q15 and Q31 data types. -* The transposed Direct Form II structure, on the other hand, requires a wide dynamic range for the state variables d1 and d2. -* Because of this, the CMSIS library only has a floating-point version of the Direct Form II Biquad. -* The advantage of the Direct Form II Biquad is that it requires half the number of state variables, 2 rather than 4, per Biquad stage. -* -* \par Instance Structure -* The coefficients and state variables for a filter are stored together in an instance data structure. -* A separate instance structure must be defined for each filter. -* Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. -* -* \par Init Functions -* There is also an associated initialization function. -* The initialization function performs following operations: -* - Sets the values of the internal structure fields. -* - Zeros out the values in the state buffer. -* To do this manually without calling the init function, assign the follow subfields of the instance structure: -* numStages, pCoeffs, pState. Also set all of the values in pState to zero. -* -* \par -* Use of the initialization function is optional. -* However, if the initialization function is used, then the instance structure cannot be placed into a const data section. -* To place an instance structure into a const data section, the instance structure must be manually initialized. -* Set the values in the state buffer to zeros before static initialization. -* For example, to statically initialize the instance structure use -*
       
-*     arm_biquad_cascade_df2T_instance_f32 S1 = {numStages, pState, pCoeffs};       
-* 
-* where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer. -* pCoeffs is the address of the coefficient buffer; -* -*/ - -/** -* @addtogroup BiquadCascadeDF2T -* @{ -*/ - -/** -* @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. -* @param[in] *S points to an instance of the filter data structure. -* @param[in] *pSrc points to the block of input data. -* @param[out] *pDst points to the block of output data -* @param[in] blockSize number of samples to process. -* @return none. -*/ - - -LOW_OPTIMIZATION_ENTER -void arm_biquad_cascade_df2T_f32( -const arm_biquad_cascade_df2T_instance_f32 * S, -float32_t * pSrc, -float32_t * pDst, -uint32_t blockSize) -{ - - float32_t *pIn = pSrc; /* source pointer */ - float32_t *pOut = pDst; /* destination pointer */ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ - float32_t acc1; /* accumulator */ - float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ - float32_t Xn1; /* temporary input */ - float32_t d1, d2; /* state variables */ - uint32_t sample, stage = S->numStages; /* loop counters */ - -#if defined(ARM_MATH_CM7) - - float32_t Xn2, Xn3, Xn4, Xn5, Xn6, Xn7, Xn8; /* Input State variables */ - float32_t Xn9, Xn10, Xn11, Xn12, Xn13, Xn14, Xn15, Xn16; - float32_t acc2, acc3, acc4, acc5, acc6, acc7; /* Simulates the accumulator */ - float32_t acc8, acc9, acc10, acc11, acc12, acc13, acc14, acc15, acc16; - - do - { - /* Reading the coefficients */ - b0 = pCoeffs[0]; - b1 = pCoeffs[1]; - b2 = pCoeffs[2]; - a1 = pCoeffs[3]; - /* Apply loop unrolling and compute 16 output values simultaneously. */ - sample = blockSize >> 4u; - a2 = pCoeffs[4]; - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - pCoeffs += 5u; - - - /* First part of the processing with loop unrolling. Compute 16 outputs at a time. - ** a second loop below computes the remaining 1 to 15 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the first 2 inputs. 2 cycles */ - Xn1 = pIn[0 ]; - Xn2 = pIn[1 ]; - - /* Sample 1. 5 cycles */ - Xn3 = pIn[2 ]; - acc1 = b0 * Xn1 + d1; - - Xn4 = pIn[3 ]; - d1 = b1 * Xn1 + d2; - - Xn5 = pIn[4 ]; - d2 = b2 * Xn1; - - Xn6 = pIn[5 ]; - d1 += a1 * acc1; - - Xn7 = pIn[6 ]; - d2 += a2 * acc1; - - /* Sample 2. 5 cycles */ - Xn8 = pIn[7 ]; - acc2 = b0 * Xn2 + d1; - - Xn9 = pIn[8 ]; - d1 = b1 * Xn2 + d2; - - Xn10 = pIn[9 ]; - d2 = b2 * Xn2; - - Xn11 = pIn[10]; - d1 += a1 * acc2; - - Xn12 = pIn[11]; - d2 += a2 * acc2; - - /* Sample 3. 5 cycles */ - Xn13 = pIn[12]; - acc3 = b0 * Xn3 + d1; - - Xn14 = pIn[13]; - d1 = b1 * Xn3 + d2; - - Xn15 = pIn[14]; - d2 = b2 * Xn3; - - Xn16 = pIn[15]; - d1 += a1 * acc3; - - pIn += 16; - d2 += a2 * acc3; - - /* Sample 4. 5 cycles */ - acc4 = b0 * Xn4 + d1; - d1 = b1 * Xn4 + d2; - d2 = b2 * Xn4; - d1 += a1 * acc4; - d2 += a2 * acc4; - - /* Sample 5. 5 cycles */ - acc5 = b0 * Xn5 + d1; - d1 = b1 * Xn5 + d2; - d2 = b2 * Xn5; - d1 += a1 * acc5; - d2 += a2 * acc5; - - /* Sample 6. 5 cycles */ - acc6 = b0 * Xn6 + d1; - d1 = b1 * Xn6 + d2; - d2 = b2 * Xn6; - d1 += a1 * acc6; - d2 += a2 * acc6; - - /* Sample 7. 5 cycles */ - acc7 = b0 * Xn7 + d1; - d1 = b1 * Xn7 + d2; - d2 = b2 * Xn7; - d1 += a1 * acc7; - d2 += a2 * acc7; - - /* Sample 8. 5 cycles */ - acc8 = b0 * Xn8 + d1; - d1 = b1 * Xn8 + d2; - d2 = b2 * Xn8; - d1 += a1 * acc8; - d2 += a2 * acc8; - - /* Sample 9. 5 cycles */ - acc9 = b0 * Xn9 + d1; - d1 = b1 * Xn9 + d2; - d2 = b2 * Xn9; - d1 += a1 * acc9; - d2 += a2 * acc9; - - /* Sample 10. 5 cycles */ - acc10 = b0 * Xn10 + d1; - d1 = b1 * Xn10 + d2; - d2 = b2 * Xn10; - d1 += a1 * acc10; - d2 += a2 * acc10; - - /* Sample 11. 5 cycles */ - acc11 = b0 * Xn11 + d1; - d1 = b1 * Xn11 + d2; - d2 = b2 * Xn11; - d1 += a1 * acc11; - d2 += a2 * acc11; - - /* Sample 12. 5 cycles */ - acc12 = b0 * Xn12 + d1; - d1 = b1 * Xn12 + d2; - d2 = b2 * Xn12; - d1 += a1 * acc12; - d2 += a2 * acc12; - - /* Sample 13. 5 cycles */ - acc13 = b0 * Xn13 + d1; - d1 = b1 * Xn13 + d2; - d2 = b2 * Xn13; - - pOut[0 ] = acc1 ; - d1 += a1 * acc13; - - pOut[1 ] = acc2 ; - d2 += a2 * acc13; - - /* Sample 14. 5 cycles */ - pOut[2 ] = acc3 ; - acc14 = b0 * Xn14 + d1; - - pOut[3 ] = acc4 ; - d1 = b1 * Xn14 + d2; - - pOut[4 ] = acc5 ; - d2 = b2 * Xn14; - - pOut[5 ] = acc6 ; - d1 += a1 * acc14; - - pOut[6 ] = acc7 ; - d2 += a2 * acc14; - - /* Sample 15. 5 cycles */ - pOut[7 ] = acc8 ; - pOut[8 ] = acc9 ; - acc15 = b0 * Xn15 + d1; - - pOut[9 ] = acc10; - d1 = b1 * Xn15 + d2; - - pOut[10] = acc11; - d2 = b2 * Xn15; - - pOut[11] = acc12; - d1 += a1 * acc15; - - pOut[12] = acc13; - d2 += a2 * acc15; - - /* Sample 16. 5 cycles */ - pOut[13] = acc14; - acc16 = b0 * Xn16 + d1; - - pOut[14] = acc15; - d1 = b1 * Xn16 + d2; - - pOut[15] = acc16; - d2 = b2 * Xn16; - - sample--; - d1 += a1 * acc16; - - pOut += 16; - d2 += a2 * acc16; - } - - sample = blockSize & 0xFu; - while(sample > 0u) { - Xn1 = *pIn; - acc1 = b0 * Xn1 + d1; - - pIn++; - d1 = b1 * Xn1 + d2; - - *pOut = acc1; - d2 = b2 * Xn1; - - pOut++; - d1 += a1 * acc1; - - sample--; - d2 += a2 * acc1; - } - - /* Store the updated state variables back into the state array */ - pState[0] = d1; - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - pState[1] = d2; - /* decrement the loop counter */ - stage--; - - pState += 2u; - - /*Reset the output working pointer */ - pOut = pDst; - - } while(stage > 0u); - -#elif defined(ARM_MATH_CM0_FAMILY) - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn1 = *pIn++; - - /* y[n] = b0 * x[n] + d1 */ - acc1 = (b0 * Xn1) + d1; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc1; - - /* Every time after the output is computed state should be updated. */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - d1 = ((b1 * Xn1) + (a1 * acc1)) + d2; - - /* d2 = b2 * x[n] + a2 * y[n] */ - d2 = (b2 * Xn1) + (a2 * acc1); - - /* decrement the loop counter */ - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1; - *pState++ = d2; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#else - - float32_t Xn2, Xn3, Xn4; /* Input State variables */ - float32_t acc2, acc3, acc4; /* accumulator */ - - - float32_t p0, p1, p2, p3, p4, A1; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the four inputs */ - Xn1 = pIn[0]; - Xn2 = pIn[1]; - Xn3 = pIn[2]; - Xn4 = pIn[3]; - pIn += 4; - - p0 = b0 * Xn1; - p1 = b1 * Xn1; - acc1 = p0 + d1; - p0 = b0 * Xn2; - p3 = a1 * acc1; - p2 = b2 * Xn1; - A1 = p1 + p3; - p4 = a2 * acc1; - d1 = A1 + d2; - d2 = p2 + p4; - - p1 = b1 * Xn2; - acc2 = p0 + d1; - p0 = b0 * Xn3; - p3 = a1 * acc2; - p2 = b2 * Xn2; - A1 = p1 + p3; - p4 = a2 * acc2; - d1 = A1 + d2; - d2 = p2 + p4; - - p1 = b1 * Xn3; - acc3 = p0 + d1; - p0 = b0 * Xn4; - p3 = a1 * acc3; - p2 = b2 * Xn3; - A1 = p1 + p3; - p4 = a2 * acc3; - d1 = A1 + d2; - d2 = p2 + p4; - - acc4 = p0 + d1; - p1 = b1 * Xn4; - p3 = a1 * acc4; - p2 = b2 * Xn4; - A1 = p1 + p3; - p4 = a2 * acc4; - d1 = A1 + d2; - d2 = p2 + p4; - - pOut[0] = acc1; - pOut[1] = acc2; - pOut[2] = acc3; - pOut[3] = acc4; - pOut += 4; - - sample--; - } - - sample = blockSize & 0x3u; - while(sample > 0u) { - Xn1 = *pIn++; - - p0 = b0 * Xn1; - p1 = b1 * Xn1; - acc1 = p0 + d1; - p3 = a1 * acc1; - p2 = b2 * Xn1; - A1 = p1 + p3; - p4 = a2 * acc1; - d1 = A1 + d2; - d2 = p2 + p4; - - *pOut++ = acc1; - - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1; - *pState++ = d2; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#endif - -} -LOW_OPTIMIZATION_EXIT - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c deleted file mode 100644 index 967075e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c +++ /dev/null @@ -1,603 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df2T_f64.c -* -* Description: Processing function for the floating-point transposed -* direct form II Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** -* @ingroup groupFilters -*/ - -/** -* @defgroup BiquadCascadeDF2T Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure -* -* This set of functions implements arbitrary order recursive (IIR) filters using a transposed direct form II structure. -* The filters are implemented as a cascade of second order Biquad sections. -* These functions provide a slight memory savings as compared to the direct form I Biquad filter functions. -* Only floating-point data is supported. -* -* This function operate on blocks of input and output data and each call to the function -* processes blockSize samples through the filter. -* pSrc points to the array of input data and -* pDst points to the array of output data. -* Both arrays contain blockSize values. -* -* \par Algorithm -* Each Biquad stage implements a second order filter using the difference equation: -*
       
-*    y[n] = b0 * x[n] + d1       
-*    d1 = b1 * x[n] + a1 * y[n] + d2       
-*    d2 = b2 * x[n] + a2 * y[n]       
-* 
-* where d1 and d2 represent the two state values. -* -* \par -* A Biquad filter using a transposed Direct Form II structure is shown below. -* \image html BiquadDF2Transposed.gif "Single transposed Direct Form II Biquad" -* Coefficients b0, b1, and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. -* Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. -* Pay careful attention to the sign of the feedback coefficients. -* Some design tools flip the sign of the feedback coefficients: -*
       
-*    y[n] = b0 * x[n] + d1;       
-*    d1 = b1 * x[n] - a1 * y[n] + d2;       
-*    d2 = b2 * x[n] - a2 * y[n];       
-* 
-* In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. -* -* \par -* Higher order filters are realized as a cascade of second order sections. -* numStages refers to the number of second order stages used. -* For example, an 8th order filter would be realized with numStages=4 second order stages. -* A 9th order filter would be realized with numStages=5 second order stages with the -* coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). -* -* \par -* pState points to the state variable array. -* Each Biquad stage has 2 state variables d1 and d2. -* The state variables are arranged in the pState array as: -*
       
-*     {d11, d12, d21, d22, ...}       
-* 
-* where d1x refers to the state variables for the first Biquad and -* d2x refers to the state variables for the second Biquad. -* The state array has a total length of 2*numStages values. -* The state variables are updated after each block of data is processed; the coefficients are untouched. -* -* \par -* The CMSIS library contains Biquad filters in both Direct Form I and transposed Direct Form II. -* The advantage of the Direct Form I structure is that it is numerically more robust for fixed-point data types. -* That is why the Direct Form I structure supports Q15 and Q31 data types. -* The transposed Direct Form II structure, on the other hand, requires a wide dynamic range for the state variables d1 and d2. -* Because of this, the CMSIS library only has a floating-point version of the Direct Form II Biquad. -* The advantage of the Direct Form II Biquad is that it requires half the number of state variables, 2 rather than 4, per Biquad stage. -* -* \par Instance Structure -* The coefficients and state variables for a filter are stored together in an instance data structure. -* A separate instance structure must be defined for each filter. -* Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. -* -* \par Init Functions -* There is also an associated initialization function. -* The initialization function performs following operations: -* - Sets the values of the internal structure fields. -* - Zeros out the values in the state buffer. -* To do this manually without calling the init function, assign the follow subfields of the instance structure: -* numStages, pCoeffs, pState. Also set all of the values in pState to zero. -* -* \par -* Use of the initialization function is optional. -* However, if the initialization function is used, then the instance structure cannot be placed into a const data section. -* To place an instance structure into a const data section, the instance structure must be manually initialized. -* Set the values in the state buffer to zeros before static initialization. -* For example, to statically initialize the instance structure use -*
       
-*     arm_biquad_cascade_df2T_instance_f64 S1 = {numStages, pState, pCoeffs};       
-* 
-* where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer. -* pCoeffs is the address of the coefficient buffer; -* -*/ - -/** -* @addtogroup BiquadCascadeDF2T -* @{ -*/ - -/** -* @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. -* @param[in] *S points to an instance of the filter data structure. -* @param[in] *pSrc points to the block of input data. -* @param[out] *pDst points to the block of output data -* @param[in] blockSize number of samples to process. -* @return none. -*/ - - -LOW_OPTIMIZATION_ENTER -void arm_biquad_cascade_df2T_f64( -const arm_biquad_cascade_df2T_instance_f64 * S, -float64_t * pSrc, -float64_t * pDst, -uint32_t blockSize) -{ - - float64_t *pIn = pSrc; /* source pointer */ - float64_t *pOut = pDst; /* destination pointer */ - float64_t *pState = S->pState; /* State pointer */ - float64_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ - float64_t acc1; /* accumulator */ - float64_t b0, b1, b2, a1, a2; /* Filter coefficients */ - float64_t Xn1; /* temporary input */ - float64_t d1, d2; /* state variables */ - uint32_t sample, stage = S->numStages; /* loop counters */ - -#if defined(ARM_MATH_CM7) - - float64_t Xn2, Xn3, Xn4, Xn5, Xn6, Xn7, Xn8; /* Input State variables */ - float64_t Xn9, Xn10, Xn11, Xn12, Xn13, Xn14, Xn15, Xn16; - float64_t acc2, acc3, acc4, acc5, acc6, acc7; /* Simulates the accumulator */ - float64_t acc8, acc9, acc10, acc11, acc12, acc13, acc14, acc15, acc16; - - do - { - /* Reading the coefficients */ - b0 = pCoeffs[0]; - b1 = pCoeffs[1]; - b2 = pCoeffs[2]; - a1 = pCoeffs[3]; - /* Apply loop unrolling and compute 16 output values simultaneously. */ - sample = blockSize >> 4u; - a2 = pCoeffs[4]; - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - pCoeffs += 5u; - - - /* First part of the processing with loop unrolling. Compute 16 outputs at a time. - ** a second loop below computes the remaining 1 to 15 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the first 2 inputs. 2 cycles */ - Xn1 = pIn[0 ]; - Xn2 = pIn[1 ]; - - /* Sample 1. 5 cycles */ - Xn3 = pIn[2 ]; - acc1 = b0 * Xn1 + d1; - - Xn4 = pIn[3 ]; - d1 = b1 * Xn1 + d2; - - Xn5 = pIn[4 ]; - d2 = b2 * Xn1; - - Xn6 = pIn[5 ]; - d1 += a1 * acc1; - - Xn7 = pIn[6 ]; - d2 += a2 * acc1; - - /* Sample 2. 5 cycles */ - Xn8 = pIn[7 ]; - acc2 = b0 * Xn2 + d1; - - Xn9 = pIn[8 ]; - d1 = b1 * Xn2 + d2; - - Xn10 = pIn[9 ]; - d2 = b2 * Xn2; - - Xn11 = pIn[10]; - d1 += a1 * acc2; - - Xn12 = pIn[11]; - d2 += a2 * acc2; - - /* Sample 3. 5 cycles */ - Xn13 = pIn[12]; - acc3 = b0 * Xn3 + d1; - - Xn14 = pIn[13]; - d1 = b1 * Xn3 + d2; - - Xn15 = pIn[14]; - d2 = b2 * Xn3; - - Xn16 = pIn[15]; - d1 += a1 * acc3; - - pIn += 16; - d2 += a2 * acc3; - - /* Sample 4. 5 cycles */ - acc4 = b0 * Xn4 + d1; - d1 = b1 * Xn4 + d2; - d2 = b2 * Xn4; - d1 += a1 * acc4; - d2 += a2 * acc4; - - /* Sample 5. 5 cycles */ - acc5 = b0 * Xn5 + d1; - d1 = b1 * Xn5 + d2; - d2 = b2 * Xn5; - d1 += a1 * acc5; - d2 += a2 * acc5; - - /* Sample 6. 5 cycles */ - acc6 = b0 * Xn6 + d1; - d1 = b1 * Xn6 + d2; - d2 = b2 * Xn6; - d1 += a1 * acc6; - d2 += a2 * acc6; - - /* Sample 7. 5 cycles */ - acc7 = b0 * Xn7 + d1; - d1 = b1 * Xn7 + d2; - d2 = b2 * Xn7; - d1 += a1 * acc7; - d2 += a2 * acc7; - - /* Sample 8. 5 cycles */ - acc8 = b0 * Xn8 + d1; - d1 = b1 * Xn8 + d2; - d2 = b2 * Xn8; - d1 += a1 * acc8; - d2 += a2 * acc8; - - /* Sample 9. 5 cycles */ - acc9 = b0 * Xn9 + d1; - d1 = b1 * Xn9 + d2; - d2 = b2 * Xn9; - d1 += a1 * acc9; - d2 += a2 * acc9; - - /* Sample 10. 5 cycles */ - acc10 = b0 * Xn10 + d1; - d1 = b1 * Xn10 + d2; - d2 = b2 * Xn10; - d1 += a1 * acc10; - d2 += a2 * acc10; - - /* Sample 11. 5 cycles */ - acc11 = b0 * Xn11 + d1; - d1 = b1 * Xn11 + d2; - d2 = b2 * Xn11; - d1 += a1 * acc11; - d2 += a2 * acc11; - - /* Sample 12. 5 cycles */ - acc12 = b0 * Xn12 + d1; - d1 = b1 * Xn12 + d2; - d2 = b2 * Xn12; - d1 += a1 * acc12; - d2 += a2 * acc12; - - /* Sample 13. 5 cycles */ - acc13 = b0 * Xn13 + d1; - d1 = b1 * Xn13 + d2; - d2 = b2 * Xn13; - - pOut[0 ] = acc1 ; - d1 += a1 * acc13; - - pOut[1 ] = acc2 ; - d2 += a2 * acc13; - - /* Sample 14. 5 cycles */ - pOut[2 ] = acc3 ; - acc14 = b0 * Xn14 + d1; - - pOut[3 ] = acc4 ; - d1 = b1 * Xn14 + d2; - - pOut[4 ] = acc5 ; - d2 = b2 * Xn14; - - pOut[5 ] = acc6 ; - d1 += a1 * acc14; - - pOut[6 ] = acc7 ; - d2 += a2 * acc14; - - /* Sample 15. 5 cycles */ - pOut[7 ] = acc8 ; - pOut[8 ] = acc9 ; - acc15 = b0 * Xn15 + d1; - - pOut[9 ] = acc10; - d1 = b1 * Xn15 + d2; - - pOut[10] = acc11; - d2 = b2 * Xn15; - - pOut[11] = acc12; - d1 += a1 * acc15; - - pOut[12] = acc13; - d2 += a2 * acc15; - - /* Sample 16. 5 cycles */ - pOut[13] = acc14; - acc16 = b0 * Xn16 + d1; - - pOut[14] = acc15; - d1 = b1 * Xn16 + d2; - - pOut[15] = acc16; - d2 = b2 * Xn16; - - sample--; - d1 += a1 * acc16; - - pOut += 16; - d2 += a2 * acc16; - } - - sample = blockSize & 0xFu; - while(sample > 0u) { - Xn1 = *pIn; - acc1 = b0 * Xn1 + d1; - - pIn++; - d1 = b1 * Xn1 + d2; - - *pOut = acc1; - d2 = b2 * Xn1; - - pOut++; - d1 += a1 * acc1; - - sample--; - d2 += a2 * acc1; - } - - /* Store the updated state variables back into the state array */ - pState[0] = d1; - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - pState[1] = d2; - /* decrement the loop counter */ - stage--; - - pState += 2u; - - /*Reset the output working pointer */ - pOut = pDst; - - } while(stage > 0u); - -#elif defined(ARM_MATH_CM0_FAMILY) - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn1 = *pIn++; - - /* y[n] = b0 * x[n] + d1 */ - acc1 = (b0 * Xn1) + d1; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc1; - - /* Every time after the output is computed state should be updated. */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - d1 = ((b1 * Xn1) + (a1 * acc1)) + d2; - - /* d2 = b2 * x[n] + a2 * y[n] */ - d2 = (b2 * Xn1) + (a2 * acc1); - - /* decrement the loop counter */ - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1; - *pState++ = d2; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#else - - float64_t Xn2, Xn3, Xn4; /* Input State variables */ - float64_t acc2, acc3, acc4; /* accumulator */ - - - float64_t p0, p1, p2, p3, p4, A1; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - - /*Reading the state values */ - d1 = pState[0]; - d2 = pState[1]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the four inputs */ - Xn1 = pIn[0]; - Xn2 = pIn[1]; - Xn3 = pIn[2]; - Xn4 = pIn[3]; - pIn += 4; - - p0 = b0 * Xn1; - p1 = b1 * Xn1; - acc1 = p0 + d1; - p0 = b0 * Xn2; - p3 = a1 * acc1; - p2 = b2 * Xn1; - A1 = p1 + p3; - p4 = a2 * acc1; - d1 = A1 + d2; - d2 = p2 + p4; - - p1 = b1 * Xn2; - acc2 = p0 + d1; - p0 = b0 * Xn3; - p3 = a1 * acc2; - p2 = b2 * Xn2; - A1 = p1 + p3; - p4 = a2 * acc2; - d1 = A1 + d2; - d2 = p2 + p4; - - p1 = b1 * Xn3; - acc3 = p0 + d1; - p0 = b0 * Xn4; - p3 = a1 * acc3; - p2 = b2 * Xn3; - A1 = p1 + p3; - p4 = a2 * acc3; - d1 = A1 + d2; - d2 = p2 + p4; - - acc4 = p0 + d1; - p1 = b1 * Xn4; - p3 = a1 * acc4; - p2 = b2 * Xn4; - A1 = p1 + p3; - p4 = a2 * acc4; - d1 = A1 + d2; - d2 = p2 + p4; - - pOut[0] = acc1; - pOut[1] = acc2; - pOut[2] = acc3; - pOut[3] = acc4; - pOut += 4; - - sample--; - } - - sample = blockSize & 0x3u; - while(sample > 0u) { - Xn1 = *pIn++; - - p0 = b0 * Xn1; - p1 = b1 * Xn1; - acc1 = p0 + d1; - p3 = a1 * acc1; - p2 = b2 * Xn1; - A1 = p1 + p3; - p4 = a2 * acc1; - d1 = A1 + d2; - d2 = p2 + p4; - - *pOut++ = acc1; - - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1; - *pState++ = d2; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#endif - -} -LOW_OPTIMIZATION_EXIT - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c deleted file mode 100644 index cba8bdd..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c +++ /dev/null @@ -1,102 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df2T_init_f32.c -* -* Description: Initialization function for the floating-point transposed -* direct form II Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF2T - * @{ - */ - -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - * - * Coefficient and State Ordering: - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * - * \par - * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState is a pointer to state array. - * Each Biquad stage has 2 state variables d1, and d2. - * The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. - * The state array has a total length of 2*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 2 * numStages */ - memset(pState, 0, (2u * (uint32_t) numStages) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c deleted file mode 100644 index 5ed2db9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c +++ /dev/null @@ -1,102 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_df2T_init_f64.c -* -* Description: Initialization function for the floating-point transposed -* direct form II Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF2T - * @{ - */ - -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - * - * Coefficient and State Ordering: - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * - * \par - * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState is a pointer to state array. - * Each Biquad stage has 2 state variables d1, and d2. - * The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. - * The state array has a total length of 2*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cascade_df2T_init_f64( - arm_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - float64_t * pCoeffs, - float64_t * pState) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 2 * numStages */ - memset(pState, 0, (2u * (uint32_t) numStages) * sizeof(float64_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c deleted file mode 100644 index 9722e5c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c +++ /dev/null @@ -1,683 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_stereo_df2T_f32.c -* -* Description: Processing function for the floating-point transposed -* direct form II Biquad cascade filter. 2 channels -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** -* @ingroup groupFilters -*/ - -/** -* @defgroup BiquadCascadeDF2T Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure -* -* This set of functions implements arbitrary order recursive (IIR) filters using a transposed direct form II structure. -* The filters are implemented as a cascade of second order Biquad sections. -* These functions provide a slight memory savings as compared to the direct form I Biquad filter functions. -* Only floating-point data is supported. -* -* This function operate on blocks of input and output data and each call to the function -* processes blockSize samples through the filter. -* pSrc points to the array of input data and -* pDst points to the array of output data. -* Both arrays contain blockSize values. -* -* \par Algorithm -* Each Biquad stage implements a second order filter using the difference equation: -*
       
-*    y[n] = b0 * x[n] + d1       
-*    d1 = b1 * x[n] + a1 * y[n] + d2       
-*    d2 = b2 * x[n] + a2 * y[n]       
-* 
-* where d1 and d2 represent the two state values. -* -* \par -* A Biquad filter using a transposed Direct Form II structure is shown below. -* \image html BiquadDF2Transposed.gif "Single transposed Direct Form II Biquad" -* Coefficients b0, b1, and b2 multiply the input signal x[n] and are referred to as the feedforward coefficients. -* Coefficients a1 and a2 multiply the output signal y[n] and are referred to as the feedback coefficients. -* Pay careful attention to the sign of the feedback coefficients. -* Some design tools flip the sign of the feedback coefficients: -*
       
-*    y[n] = b0 * x[n] + d1;       
-*    d1 = b1 * x[n] - a1 * y[n] + d2;       
-*    d2 = b2 * x[n] - a2 * y[n];       
-* 
-* In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library. -* -* \par -* Higher order filters are realized as a cascade of second order sections. -* numStages refers to the number of second order stages used. -* For example, an 8th order filter would be realized with numStages=4 second order stages. -* A 9th order filter would be realized with numStages=5 second order stages with the -* coefficients for one of the stages configured as a first order filter (b2=0 and a2=0). -* -* \par -* pState points to the state variable array. -* Each Biquad stage has 2 state variables d1 and d2. -* The state variables are arranged in the pState array as: -*
       
-*     {d11, d12, d21, d22, ...}       
-* 
-* where d1x refers to the state variables for the first Biquad and -* d2x refers to the state variables for the second Biquad. -* The state array has a total length of 2*numStages values. -* The state variables are updated after each block of data is processed; the coefficients are untouched. -* -* \par -* The CMSIS library contains Biquad filters in both Direct Form I and transposed Direct Form II. -* The advantage of the Direct Form I structure is that it is numerically more robust for fixed-point data types. -* That is why the Direct Form I structure supports Q15 and Q31 data types. -* The transposed Direct Form II structure, on the other hand, requires a wide dynamic range for the state variables d1 and d2. -* Because of this, the CMSIS library only has a floating-point version of the Direct Form II Biquad. -* The advantage of the Direct Form II Biquad is that it requires half the number of state variables, 2 rather than 4, per Biquad stage. -* -* \par Instance Structure -* The coefficients and state variables for a filter are stored together in an instance data structure. -* A separate instance structure must be defined for each filter. -* Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. -* -* \par Init Functions -* There is also an associated initialization function. -* The initialization function performs following operations: -* - Sets the values of the internal structure fields. -* - Zeros out the values in the state buffer. -* To do this manually without calling the init function, assign the follow subfields of the instance structure: -* numStages, pCoeffs, pState. Also set all of the values in pState to zero. -* -* \par -* Use of the initialization function is optional. -* However, if the initialization function is used, then the instance structure cannot be placed into a const data section. -* To place an instance structure into a const data section, the instance structure must be manually initialized. -* Set the values in the state buffer to zeros before static initialization. -* For example, to statically initialize the instance structure use -*
       
-*     arm_biquad_cascade_df2T_instance_f32 S1 = {numStages, pState, pCoeffs};       
-* 
-* where numStages is the number of Biquad stages in the filter; pState is the address of the state buffer. -* pCoeffs is the address of the coefficient buffer; -* -*/ - -/** -* @addtogroup BiquadCascadeDF2T -* @{ -*/ - -/** -* @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. -* @param[in] *S points to an instance of the filter data structure. -* @param[in] *pSrc points to the block of input data. -* @param[out] *pDst points to the block of output data -* @param[in] blockSize number of samples to process. -* @return none. -*/ - - -LOW_OPTIMIZATION_ENTER -void arm_biquad_cascade_stereo_df2T_f32( -const arm_biquad_cascade_stereo_df2T_instance_f32 * S, -float32_t * pSrc, -float32_t * pDst, -uint32_t blockSize) -{ - - float32_t *pIn = pSrc; /* source pointer */ - float32_t *pOut = pDst; /* destination pointer */ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* coefficient pointer */ - float32_t acc1a, acc1b; /* accumulator */ - float32_t b0, b1, b2, a1, a2; /* Filter coefficients */ - float32_t Xn1a, Xn1b; /* temporary input */ - float32_t d1a, d2a, d1b, d2b; /* state variables */ - uint32_t sample, stage = S->numStages; /* loop counters */ - -#if defined(ARM_MATH_CM7) - - float32_t Xn2a, Xn3a, Xn4a, Xn5a, Xn6a, Xn7a, Xn8a; /* Input State variables */ - float32_t Xn2b, Xn3b, Xn4b, Xn5b, Xn6b, Xn7b, Xn8b; /* Input State variables */ - float32_t acc2a, acc3a, acc4a, acc5a, acc6a, acc7a, acc8a; /* Simulates the accumulator */ - float32_t acc2b, acc3b, acc4b, acc5b, acc6b, acc7b, acc8b; /* Simulates the accumulator */ - - do - { - /* Reading the coefficients */ - b0 = pCoeffs[0]; - b1 = pCoeffs[1]; - b2 = pCoeffs[2]; - a1 = pCoeffs[3]; - /* Apply loop unrolling and compute 8 output values simultaneously. */ - sample = blockSize >> 3u; - a2 = pCoeffs[4]; - - /*Reading the state values */ - d1a = pState[0]; - d2a = pState[1]; - d1b = pState[2]; - d2b = pState[3]; - - pCoeffs += 5u; - - /* First part of the processing with loop unrolling. Compute 8 outputs at a time. - ** a second loop below computes the remaining 1 to 7 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the first 2 inputs. 2 cycles */ - Xn1a = pIn[0 ]; - Xn1b = pIn[1 ]; - - /* Sample 1. 5 cycles */ - Xn2a = pIn[2 ]; - acc1a = b0 * Xn1a + d1a; - - Xn2b = pIn[3 ]; - d1a = b1 * Xn1a + d2a; - - Xn3a = pIn[4 ]; - d2a = b2 * Xn1a; - - Xn3b = pIn[5 ]; - d1a += a1 * acc1a; - - Xn4a = pIn[6 ]; - d2a += a2 * acc1a; - - /* Sample 2. 5 cycles */ - Xn4b = pIn[7 ]; - acc1b = b0 * Xn1b + d1b; - - Xn5a = pIn[8 ]; - d1b = b1 * Xn1b + d2b; - - Xn5b = pIn[9 ]; - d2b = b2 * Xn1b; - - Xn6a = pIn[10]; - d1b += a1 * acc1b; - - Xn6b = pIn[11]; - d2b += a2 * acc1b; - - /* Sample 3. 5 cycles */ - Xn7a = pIn[12]; - acc2a = b0 * Xn2a + d1a; - - Xn7b = pIn[13]; - d1a = b1 * Xn2a + d2a; - - Xn8a = pIn[14]; - d2a = b2 * Xn2a; - - Xn8b = pIn[15]; - d1a += a1 * acc2a; - - pIn += 16; - d2a += a2 * acc2a; - - /* Sample 4. 5 cycles */ - acc2b = b0 * Xn2b + d1b; - d1b = b1 * Xn2b + d2b; - d2b = b2 * Xn2b; - d1b += a1 * acc2b; - d2b += a2 * acc2b; - - /* Sample 5. 5 cycles */ - acc3a = b0 * Xn3a + d1a; - d1a = b1 * Xn3a + d2a; - d2a = b2 * Xn3a; - d1a += a1 * acc3a; - d2a += a2 * acc3a; - - /* Sample 6. 5 cycles */ - acc3b = b0 * Xn3b + d1b; - d1b = b1 * Xn3b + d2b; - d2b = b2 * Xn3b; - d1b += a1 * acc3b; - d2b += a2 * acc3b; - - /* Sample 7. 5 cycles */ - acc4a = b0 * Xn4a + d1a; - d1a = b1 * Xn4a + d2a; - d2a = b2 * Xn4a; - d1a += a1 * acc4a; - d2a += a2 * acc4a; - - /* Sample 8. 5 cycles */ - acc4b = b0 * Xn4b + d1b; - d1b = b1 * Xn4b + d2b; - d2b = b2 * Xn4b; - d1b += a1 * acc4b; - d2b += a2 * acc4b; - - /* Sample 9. 5 cycles */ - acc5a = b0 * Xn5a + d1a; - d1a = b1 * Xn5a + d2a; - d2a = b2 * Xn5a; - d1a += a1 * acc5a; - d2a += a2 * acc5a; - - /* Sample 10. 5 cycles */ - acc5b = b0 * Xn5b + d1b; - d1b = b1 * Xn5b + d2b; - d2b = b2 * Xn5b; - d1b += a1 * acc5b; - d2b += a2 * acc5b; - - /* Sample 11. 5 cycles */ - acc6a = b0 * Xn6a + d1a; - d1a = b1 * Xn6a + d2a; - d2a = b2 * Xn6a; - d1a += a1 * acc6a; - d2a += a2 * acc6a; - - /* Sample 12. 5 cycles */ - acc6b = b0 * Xn6b + d1b; - d1b = b1 * Xn6b + d2b; - d2b = b2 * Xn6b; - d1b += a1 * acc6b; - d2b += a2 * acc6b; - - /* Sample 13. 5 cycles */ - acc7a = b0 * Xn7a + d1a; - d1a = b1 * Xn7a + d2a; - - pOut[0 ] = acc1a ; - d2a = b2 * Xn7a; - - pOut[1 ] = acc1b ; - d1a += a1 * acc7a; - - pOut[2 ] = acc2a ; - d2a += a2 * acc7a; - - /* Sample 14. 5 cycles */ - pOut[3 ] = acc2b ; - acc7b = b0 * Xn7b + d1b; - - pOut[4 ] = acc3a ; - d1b = b1 * Xn7b + d2b; - - pOut[5 ] = acc3b ; - d2b = b2 * Xn7b; - - pOut[6 ] = acc4a ; - d1b += a1 * acc7b; - - pOut[7 ] = acc4b ; - d2b += a2 * acc7b; - - /* Sample 15. 5 cycles */ - pOut[8 ] = acc5a ; - acc8a = b0 * Xn8a + d1a; - - pOut[9 ] = acc5b; - d1a = b1 * Xn8a + d2a; - - pOut[10] = acc6a; - d2a = b2 * Xn8a; - - pOut[11] = acc6b; - d1a += a1 * acc8a; - - pOut[12] = acc7a; - d2a += a2 * acc8a; - - /* Sample 16. 5 cycles */ - pOut[13] = acc7b; - acc8b = b0 * Xn8b + d1b; - - pOut[14] = acc8a; - d1b = b1 * Xn8b + d2b; - - pOut[15] = acc8b; - d2b = b2 * Xn8b; - - sample--; - d1b += a1 * acc8b; - - pOut += 16; - d2b += a2 * acc8b; - } - - sample = blockSize & 0x7u; - while(sample > 0u) { - /* Read the input */ - Xn1a = *pIn++; //Channel a - Xn1b = *pIn++; //Channel b - - /* y[n] = b0 * x[n] + d1 */ - acc1a = (b0 * Xn1a) + d1a; - acc1b = (b0 * Xn1b) + d1b; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc1a; - *pOut++ = acc1b; - - /* Every time after the output is computed state should be updated. */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; - d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; - - /* d2 = b2 * x[n] + a2 * y[n] */ - d2a = (b2 * Xn1a) + (a2 * acc1a); - d2b = (b2 * Xn1b) + (a2 * acc1b); - - sample--; - } - - /* Store the updated state variables back into the state array */ - pState[0] = d1a; - pState[1] = d2a; - - pState[2] = d1b; - pState[3] = d2b; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - /* decrement the loop counter */ - stage--; - - pState += 4u; - /*Reset the output working pointer */ - pOut = pDst; - - } while(stage > 0u); - -#elif defined(ARM_MATH_CM0_FAMILY) - - /* Run the below code for Cortex-M0 */ - - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /*Reading the state values */ - d1a = pState[0]; - d2a = pState[1]; - d1b = pState[2]; - d2b = pState[3]; - - - sample = blockSize; - - while(sample > 0u) - { - /* Read the input */ - Xn1a = *pIn++; //Channel a - Xn1b = *pIn++; //Channel b - - /* y[n] = b0 * x[n] + d1 */ - acc1a = (b0 * Xn1a) + d1a; - acc1b = (b0 * Xn1b) + d1b; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc1a; - *pOut++ = acc1b; - - /* Every time after the output is computed state should be updated. */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - d1a = ((b1 * Xn1a) + (a1 * acc1a)) + d2a; - d1b = ((b1 * Xn1b) + (a1 * acc1b)) + d2b; - - /* d2 = b2 * x[n] + a2 * y[n] */ - d2a = (b2 * Xn1a) + (a2 * acc1a); - d2b = (b2 * Xn1b) + (a2 * acc1b); - - /* decrement the loop counter */ - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1a; - *pState++ = d2a; - *pState++ = d1b; - *pState++ = d2b; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#else - - float32_t Xn2a, Xn3a, Xn4a; /* Input State variables */ - float32_t Xn2b, Xn3b, Xn4b; /* Input State variables */ - float32_t acc2a, acc3a, acc4a; /* accumulator */ - float32_t acc2b, acc3b, acc4b; /* accumulator */ - float32_t p0a, p1a, p2a, p3a, p4a, A1a; - float32_t p0b, p1b, p2b, p3b, p4b, A1b; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - do - { - /* Reading the coefficients */ - b0 = *pCoeffs++; - b1 = *pCoeffs++; - b2 = *pCoeffs++; - a1 = *pCoeffs++; - a2 = *pCoeffs++; - - /*Reading the state values */ - d1a = pState[0]; - d2a = pState[1]; - d1b = pState[2]; - d2b = pState[3]; - - /* Apply loop unrolling and compute 4 output values simultaneously. */ - sample = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(sample > 0u) { - - /* y[n] = b0 * x[n] + d1 */ - /* d1 = b1 * x[n] + a1 * y[n] + d2 */ - /* d2 = b2 * x[n] + a2 * y[n] */ - - /* Read the four inputs */ - Xn1a = pIn[0]; - Xn1b = pIn[1]; - Xn2a = pIn[2]; - Xn2b = pIn[3]; - Xn3a = pIn[4]; - Xn3b = pIn[5]; - Xn4a = pIn[6]; - Xn4b = pIn[7]; - pIn += 8; - - p0a = b0 * Xn1a; - p0b = b0 * Xn1b; - p1a = b1 * Xn1a; - p1b = b1 * Xn1b; - acc1a = p0a + d1a; - acc1b = p0b + d1b; - p0a = b0 * Xn2a; - p0b = b0 * Xn2b; - p3a = a1 * acc1a; - p3b = a1 * acc1b; - p2a = b2 * Xn1a; - p2b = b2 * Xn1b; - A1a = p1a + p3a; - A1b = p1b + p3b; - p4a = a2 * acc1a; - p4b = a2 * acc1b; - d1a = A1a + d2a; - d1b = A1b + d2b; - d2a = p2a + p4a; - d2b = p2b + p4b; - - p1a = b1 * Xn2a; - p1b = b1 * Xn2b; - acc2a = p0a + d1a; - acc2b = p0b + d1b; - p0a = b0 * Xn3a; - p0b = b0 * Xn3b; - p3a = a1 * acc2a; - p3b = a1 * acc2b; - p2a = b2 * Xn2a; - p2b = b2 * Xn2b; - A1a = p1a + p3a; - A1b = p1b + p3b; - p4a = a2 * acc2a; - p4b = a2 * acc2b; - d1a = A1a + d2a; - d1b = A1b + d2b; - d2a = p2a + p4a; - d2b = p2b + p4b; - - p1a = b1 * Xn3a; - p1b = b1 * Xn3b; - acc3a = p0a + d1a; - acc3b = p0b + d1b; - p0a = b0 * Xn4a; - p0b = b0 * Xn4b; - p3a = a1 * acc3a; - p3b = a1 * acc3b; - p2a = b2 * Xn3a; - p2b = b2 * Xn3b; - A1a = p1a + p3a; - A1b = p1b + p3b; - p4a = a2 * acc3a; - p4b = a2 * acc3b; - d1a = A1a + d2a; - d1b = A1b + d2b; - d2a = p2a + p4a; - d2b = p2b + p4b; - - acc4a = p0a + d1a; - acc4b = p0b + d1b; - p1a = b1 * Xn4a; - p1b = b1 * Xn4b; - p3a = a1 * acc4a; - p3b = a1 * acc4b; - p2a = b2 * Xn4a; - p2b = b2 * Xn4b; - A1a = p1a + p3a; - A1b = p1b + p3b; - p4a = a2 * acc4a; - p4b = a2 * acc4b; - d1a = A1a + d2a; - d1b = A1b + d2b; - d2a = p2a + p4a; - d2b = p2b + p4b; - - pOut[0] = acc1a; - pOut[1] = acc1b; - pOut[2] = acc2a; - pOut[3] = acc2b; - pOut[4] = acc3a; - pOut[5] = acc3b; - pOut[6] = acc4a; - pOut[7] = acc4b; - pOut += 8; - - sample--; - } - - sample = blockSize & 0x3u; - while(sample > 0u) { - Xn1a = *pIn++; - Xn1b = *pIn++; - - p0a = b0 * Xn1a; - p0b = b0 * Xn1b; - p1a = b1 * Xn1a; - p1b = b1 * Xn1b; - acc1a = p0a + d1a; - acc1b = p0b + d1b; - p3a = a1 * acc1a; - p3b = a1 * acc1b; - p2a = b2 * Xn1a; - p2b = b2 * Xn1b; - A1a = p1a + p3a; - A1b = p1b + p3b; - p4a = a2 * acc1a; - p4b = a2 * acc1b; - d1a = A1a + d2a; - d1b = A1b + d2b; - d2a = p2a + p4a; - d2b = p2b + p4b; - - *pOut++ = acc1a; - *pOut++ = acc1b; - - sample--; - } - - /* Store the updated state variables back into the state array */ - *pState++ = d1a; - *pState++ = d2a; - *pState++ = d1b; - *pState++ = d2b; - - /* The current stage input is given as the output to the next stage */ - pIn = pDst; - - /*Reset the output working pointer */ - pOut = pDst; - - /* decrement the loop counter */ - stage--; - - } while(stage > 0u); - -#endif - -} -LOW_OPTIMIZATION_EXIT - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c deleted file mode 100644 index 3ec432f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c +++ /dev/null @@ -1,102 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_biquad_cascade_stereo_df2T_init_f32.c -* -* Description: Initialization function for the floating-point transposed -* direct form II Biquad cascade filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup BiquadCascadeDF2T - * @{ - */ - -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - * - * Coefficient and State Ordering: - * \par - * The coefficients are stored in the array pCoeffs in the following order: - *
    
- *     {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}    
- * 
- * - * \par - * where b1x and a1x are the coefficients for the first stage, - * b2x and a2x are the coefficients for the second stage, - * and so on. The pCoeffs array contains a total of 5*numStages values. - * - * \par - * The pState is a pointer to state array. - * Each Biquad stage has 2 state variables d1, and d2 for each channel. - * The 2 state variables for stage 1 are first, then the 2 state variables for stage 2, and so on. - * The state array has a total length of 2*numStages values. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - */ - -void arm_biquad_cascade_stereo_df2T_init_f32( - arm_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState) -{ - /* Assign filter stages */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always 4 * numStages */ - memset(pState, 0, (4u * (uint32_t) numStages) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; -} - -/** - * @} end of BiquadCascadeDF2T group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c deleted file mode 100644 index 65f7ab8..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c +++ /dev/null @@ -1,647 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_f32.c -* -* Description: Convolution of floating-point sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup Conv Convolution - * - * Convolution is a mathematical operation that operates on two finite length vectors to generate a finite length output vector. - * Convolution is similar to correlation and is frequently used in filtering and data analysis. - * The CMSIS DSP library contains functions for convolving Q7, Q15, Q31, and floating-point data types. - * The library also provides fast versions of the Q15 and Q31 functions on Cortex-M4 and Cortex-M3. - * - * \par Algorithm - * Let a[n] and b[n] be sequences of length srcALen and srcBLen samples respectively. - * Then the convolution - * - *
    
- *                   c[n] = a[n] * b[n]    
- * 
- * - * \par - * is defined as - * \image html ConvolutionEquation.gif - * \par - * Note that c[n] is of length srcALen + srcBLen - 1 and is defined over the interval n=0, 1, 2, ..., srcALen + srcBLen - 2. - * pSrcA points to the first input vector of length srcALen and - * pSrcB points to the second input vector of length srcBLen. - * The output result is written to pDst and the calling function must allocate srcALen+srcBLen-1 words for the result. - * - * \par - * Conceptually, when two signals a[n] and b[n] are convolved, - * the signal b[n] slides over a[n]. - * For each offset \c n, the overlapping portions of a[n] and b[n] are multiplied and summed together. - * - * \par - * Note that convolution is a commutative operation: - * - *
    
- *                   a[n] * b[n] = b[n] * a[n].    
- * 
- * - * \par - * This means that switching the A and B arguments to the convolution functions has no effect. - * - * Fixed-Point Behavior - * - * \par - * Convolution requires summing up a large number of intermediate products. - * As such, the Q7, Q15, and Q31 functions run a risk of overflow and saturation. - * Refer to the function specific documentation below for further details of the particular algorithm used. - * - * - * Fast Versions - * - * \par - * Fast versions are supported for Q31 and Q15. Cycles for Fast versions are less compared to Q31 and Q15 of conv and the design requires - * the input signals should be scaled down to avoid intermediate overflows. - * - * - * Opt Versions - * - * \par - * Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. - * These versions are optimised in cycles and consumes more memory(Scratch memory) compared to Q15 and Q7 versions - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - -void arm_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t *pIn1; /* inputA pointer */ - float32_t *pIn2; /* inputB pointer */ - float32_t *pOut = pDst; /* output pointer */ - float32_t *px; /* Intermediate inputA pointer */ - float32_t *py; /* Intermediate inputB pointer */ - float32_t *pSrc1, *pSrc2; /* Intermediate pointers */ - float32_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - float32_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t j, k, count, blkCnt, blockSize1, blockSize2, blockSize3; /* loop counters */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum += *px++ * *py--; - - /* x[1] * y[srcBLen - 2] */ - sum += *px++ * *py--; - - /* x[2] * y[srcBLen - 3] */ - sum += *px++ * *py--; - - /* x[3] * y[srcBLen - 4] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - - /* Read x[3] sample */ - x3 = *(px); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 += x0 * c0; - - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 += x1 * c0; - - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 += x2 * c0; - - /* acc3 += x[3] * y[srcBLen - 1] */ - acc3 += x3 * c0; - - /* Read y[srcBLen - 2] sample */ - c0 = *(py--); - - /* Read x[4] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 += x1 * c0; - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 += x2 * c0; - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 += x3 * c0; - /* acc3 += x[4] * y[srcBLen - 2] */ - acc3 += x0 * c0; - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - - /* Read x[5] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 += x2 * c0; - /* acc1 += x[3] * y[srcBLen - 2] */ - acc1 += x3 * c0; - /* acc2 += x[4] * y[srcBLen - 2] */ - acc2 += x0 * c0; - /* acc3 += x[5] * y[srcBLen - 2] */ - acc3 += x1 * c0; - - /* Read y[srcBLen - 4] sample */ - c0 = *(py--); - - /* Read x[6] sample */ - x2 = *(px + 3u); - px += 4u; - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[srcBLen - 4] */ - acc0 += x3 * c0; - /* acc1 += x[4] * y[srcBLen - 4] */ - acc1 += x0 * c0; - /* acc2 += x[5] * y[srcBLen - 4] */ - acc2 += x1 * c0; - /* acc3 += x[6] * y[srcBLen - 4] */ - acc3 += x2 * c0; - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += x0 * c0; - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += x1 * c0; - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += x2 * c0; - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 += x3 * c0; - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc0; - *pOut++ = acc1; - *pOut++ = acc2; - *pOut++ = acc3; - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += *px++ * *py--; - sum += *px++ * *py--; - sum += *px++ * *py--; - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t *pIn1 = pSrcA; /* inputA pointer */ - float32_t *pIn2 = pSrcB; /* inputB pointer */ - float32_t sum; /* Accumulator */ - uint32_t i, j; /* loop counters */ - - /* Loop to calculate convolution for output length number of times */ - for (i = 0u; i < ((srcALen + srcBLen) - 1u); i++) - { - /* Initialize sum with zero to carry out MAC operations */ - sum = 0.0f; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += pIn1[j] * pIn2[i - j]; - } - } - /* Store the output in the destination buffer */ - pDst[i] = sum; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c deleted file mode 100644 index ad1d709..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c +++ /dev/null @@ -1,543 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_fast_opt_q15.c -* -* Description: Fast Q15 Convolution. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - * Scaling and Overflow Behavior: - * - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results - * but provides only a single guard bit. There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, - * as maximum of min(srcALen, srcBLen) number of additions are carried internally. - * The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. - * - * \par - * See arm_conv_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. - */ - -void arm_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2) -{ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ - q31_t y1, y2; /* State variables */ - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - uint32_t tapCnt; /* loop count */ -#ifdef UNALIGNED_SUPPORT_DISABLE - - q15_t a, b; - -#endif /* #ifdef UNALIGNED_SUPPORT_DISABLE */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - - /* Copy smaller length input sequence in reverse order into second scratch buffer */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Assuming scratch1 buffer is aligned by 32-bit */ - /* Fill (srcBLen - 1u) zeros in scratch1 buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr1, srcALen); - - /* Update pointers */ - pScr1 += srcALen; - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - /* First part of the processing with loop unrolling process 4 data points at a time. - ** a second loop below process for the remaining 1 to 3 samples. */ - - /* Actual convolution process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - /* multiply and accumlate */ - acc0 = __SMLAD(x1, y1, acc0); - acc2 = __SMLAD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLADX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = _SIMD32_OFFSET(pScr1); - - /* multiply and accumlate */ - acc0 = __SMLAD(x2, y2, acc0); - acc2 = __SMLAD(x1, y2, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - acc1 = __SMLADX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr1 + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y2, acc3); - -#else - - /* Read four samples from smaller buffer */ - a = *pIn2; - b = *(pIn2 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - y1 = __PKHBT(a, b, 16); -#else - y1 = __PKHBT(b, a, 16); -#endif - - a = *(pIn2 + 2); - b = *(pIn2 + 3); -#ifndef ARM_MATH_BIG_ENDIAN - y2 = __PKHBT(a, b, 16); -#else - y2 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLAD(x1, y1, acc0); - - acc2 = __SMLAD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLADX(x3, y1, acc1); - - a = *pScr1; - b = *(pScr1 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(a, b, 16); -#else - x1 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLAD(x2, y2, acc0); - - acc2 = __SMLAD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - acc1 = __SMLADX(x3, y2, acc1); - - a = *(pScr1 + 2); - b = *(pScr1 + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - x2 = __PKHBT(a, b, 16); -#else - x2 = __PKHBT(b, a, 16); -#endif - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y2, acc3); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* update scratch pointers */ - pIn2 += 4u; - pScr1 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - - - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - acc0 += (*pScr1++ * *pIn2++); - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c deleted file mode 100644 index a8a4ffe..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c +++ /dev/null @@ -1,1410 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_fast_q15.c -* -* Description: Fast Q15 Convolution. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - * - * Scaling and Overflow Behavior: - * - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results - * but provides only a single guard bit. There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, - * as maximum of min(srcALen, srcBLen) number of additions are carried internally. - * The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. - * - * \par - * See arm_conv_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. - */ - -void arm_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst) -{ -#ifndef UNALIGNED_SUPPORT_DISABLE - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t blockSize1, blockSize2, blockSize3, j, k, count, blkCnt; /* loop counter */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + (count - 1u); - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px+1); - px+= 2u; - - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLADX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLADX(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px+1); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLADX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLADX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLADX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLADX(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px+2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px+3); - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLADX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLADX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - - /* Read y[srcBLen - 7] */ - c0 = *(py-1); -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px+2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the results in the accumulators in the destination buffer. */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = __PKHBT((acc0 >> 15), (acc1 >> 15), 16); - *__SIMD32(pOut)++ = __PKHBT((acc2 >> 15), (acc3 >> 15), 16); - -#else - - *__SIMD32(pOut)++ = __PKHBT((acc1 >> 15), (acc0 >> 15), 16); - *__SIMD32(pOut)++ = __PKHBT((acc3 >> 15), (acc2 >> 15), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = blockSize3 >> 2u; - - while((j > 0u) && (blockSize3 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied - * with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied - * with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t blockSize1, blockSize2, blockSize3, j, k, count, blkCnt; /* loop counter */ - q15_t a, b; - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - py++; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + (count - 1u); - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1] samples */ - a = *px++; - b = *px++; - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *px; - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *px; - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - a = *py; - b = *(py+1); - py -= 2; - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLADX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLADX(x1, c0, acc1); - - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x2 = __PKHBT(a, b, 16); - a = *(px + 2); - x3 = __PKHBT(b, a, 16); - -#else - - x2 = __PKHBT(b, a, 16); - a = *(px + 2); - x3 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLADX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLADX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - a = *py; - b = *(py+1); - py -= 2; - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLADX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLADX(x3, c0, acc1); - - /* Read x[4], x[5], x[6] */ - a = *(px + 2); - b = *(px + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *(px + 4); - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *(px + 4); - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLADX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLADX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - a = *px; - b = *(px+1); - px++; - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - a = *py; - b = *(py+1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - a = *py; - b = *(py+1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - - /* Read y[srcBLen - 7] */ - c0 = *(py-1); -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - a = *(px+2); - b = *(px+3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = (q15_t)(acc0 >> 15); - *pOut++ = (q15_t)(acc1 >> 15); - *pOut++ = (q15_t)(acc2 >> 15); - *pOut++ = (q15_t)(acc3 >> 15); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = blockSize3 >> 2u; - - while((j > 0u) && (blockSize3 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - py++; - - while(k > 0u) - { - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c deleted file mode 100644 index f7cd283..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c +++ /dev/null @@ -1,577 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_fast_q31.c -* -* Description: Q31 Convolution (fast version). -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * This function is optimized for speed at the expense of fixed-point precision and overflow protection. - * The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. - * These intermediate results are accumulated in a 32-bit register in 2.30 format. - * Finally, the accumulator is saturated and converted to a 1.31 result. - * - * \par - * The fast version has the same overflow behavior as the standard version but provides less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signals must be scaled down. - * Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, - * as maximum of min(srcALen, srcBLen) number of additions are carried internally. - * - * \par - * See arm_conv_q31() for a slower implementation of this function which uses 64-bit accumulation to provide higher precision. - */ - -void arm_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst) -{ - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t j, k, count, blkCnt, blockSize1, blockSize2, blockSize3; /* loop counter */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[1] * y[srcBLen - 2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[2] * y[srcBLen - 3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[3] * y[srcBLen - 4] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - - /* Read x[3] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - - /* acc3 += x[3] * y[srcBLen - 1] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Read y[srcBLen - 2] sample */ - c0 = *(py--); - - /* Read x[4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc3 += x[4] * y[srcBLen - 2] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - - /* Read x[5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc1 += x[3] * y[srcBLen - 3] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc2 += x[4] * y[srcBLen - 3] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc3 += x[5] * y[srcBLen - 3] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read y[srcBLen - 4] sample */ - c0 = *(py--); - - /* Read x[6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[srcBLen - 4] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc1 += x[4] * y[srcBLen - 4] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc2 += x[5] * y[srcBLen - 4] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc3 += x[6] * y[srcBLen - 4] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = (q31_t) (acc0 << 1); - *pOut++ = (q31_t) (acc1 << 1); - *pOut++ = (q31_t) (acc2 << 1); - *pOut++ = (q31_t) (acc3 << 1); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c deleted file mode 100644 index c21bcd2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c +++ /dev/null @@ -1,545 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_opt_q15.c -* -* Description: Convolution of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return none. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both inputs are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * This approach provides 33 guard bits and there is no risk of overflow. - * The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. - * - * - * \par - * Refer to arm_conv_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * - */ - -void arm_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2) -{ - q63_t acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ - q31_t y1, y2; /* State variables */ - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - uint32_t tapCnt; /* loop count */ -#ifdef UNALIGNED_SUPPORT_DISABLE - - q15_t a, b; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - /* Copy smaller length input sequence in reverse order into second scratch buffer */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Assuming scratch1 buffer is aligned by 32-bit */ - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr1, srcALen); - - /* Update pointers */ - pScr1 += srcALen; - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - -#endif - - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - -#endif - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - /* First part of the processing with loop unrolling process 4 data points at a time. - ** a second loop below process for the remaining 1 to 3 samples. */ - - /* Actual convolution process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - /* multiply and accumlate */ - acc0 = __SMLALD(x1, y1, acc0); - acc2 = __SMLALD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLALDX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = _SIMD32_OFFSET(pScr1); - - /* multiply and accumlate */ - acc0 = __SMLALD(x2, y2, acc0); - acc2 = __SMLALD(x1, y2, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLALDX(x3, y1, acc3); - acc1 = __SMLALDX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr1 + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLALDX(x3, y2, acc3); - -#else - - /* Read four samples from smaller buffer */ - a = *pIn2; - b = *(pIn2 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - y1 = __PKHBT(a, b, 16); -#else - y1 = __PKHBT(b, a, 16); -#endif - - a = *(pIn2 + 2); - b = *(pIn2 + 3); -#ifndef ARM_MATH_BIG_ENDIAN - y2 = __PKHBT(a, b, 16); -#else - y2 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLALD(x1, y1, acc0); - - acc2 = __SMLALD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLALDX(x3, y1, acc1); - - a = *pScr1; - b = *(pScr1 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(a, b, 16); -#else - x1 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLALD(x2, y2, acc0); - - acc2 = __SMLALD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLALDX(x3, y1, acc3); - - acc1 = __SMLALDX(x3, y2, acc1); - - a = *(pScr1 + 2); - b = *(pScr1 + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - x2 = __PKHBT(a, b, 16); -#else - x2 = __PKHBT(b, a, 16); -#endif - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLALDX(x3, y2, acc3); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - pIn2 += 4u; - pScr1 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - acc0 += (*pScr1++ * *pIn2++); - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - -} - - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c deleted file mode 100644 index 71c0695..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c +++ /dev/null @@ -1,435 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_opt_q7.c -* -* Description: Convolution of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. - * The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and then saturated to 1.7 format. - * - */ - -void arm_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pScr2, *pScr1; /* Intermediate pointers for scratch pointers */ - q15_t x4; /* Temporary input variable */ - q7_t *pIn1, *pIn2; /* inputA and inputB pointer */ - uint32_t j, k, blkCnt, tapCnt; /* loop counter */ - q7_t *px; /* Temporary input1 pointer */ - q15_t *py; /* Temporary input2 pointer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x1, x2, x3, y1; /* Temporary input variables */ - q7_t *pOut = pDst; /* output pointer */ - q7_t out0, out1, out2, out3; /* temporary variables */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2; - - /* points to smaller length sequence */ - px = pIn2 + srcBLen - 1; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy (srcALen) samples in scratch buffer */ - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - -#endif - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* Initialization of pIn2 pointer */ - pIn2 = (q7_t *) py; - - pScr2 = py; - - /* Actual convolution process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2); - - /* multiply and accumlate */ - acc0 = __SMLAD(x1, y1, acc0); - acc2 = __SMLAD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLADX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2 + 2u); - - acc0 = __SMLAD(x2, y1, acc0); - - acc2 = __SMLAD(x1, y1, acc2); - - acc1 = __SMLADX(x3, y1, acc1); - - x2 = *__SIMD32(pScr1)++; - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - pScr2 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2); - acc1 += (*pScr1++ * *pScr2); - acc2 += (*pScr1++ * *pScr2); - acc3 += (*pScr1++ * *pScr2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - out0 = (q7_t) (__SSAT(acc0 >> 7u, 8)); - out1 = (q7_t) (__SSAT(acc1 >> 7u, 8)); - out2 = (q7_t) (__SSAT(acc2 >> 7u, 8)); - out3 = (q7_t) (__SSAT(acc3 >> 7u, 8)); - - *__SIMD32(pOut)++ = __PACKq7(out0, out1, out2, out3); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - acc0 += (*pScr1++ * *pScr2++); - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7u, 8)); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 1u; - - } - -} - - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c deleted file mode 100644 index af7ec9b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c +++ /dev/null @@ -1,669 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_f32.c -* -* Description: Partial convolution of floating-point sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup PartialConv Partial Convolution - * - * Partial Convolution is equivalent to Convolution except that a subset of the output samples is generated. - * Each function has two additional arguments. - * firstIndex specifies the starting index of the subset of output samples. - * numPoints is the number of output samples to compute. - * The function computes the output in the range - * [firstIndex, ..., firstIndex+numPoints-1]. - * The output array pDst contains numPoints values. - * - * The allowable range of output indices is [0 srcALen+srcBLen-2]. - * If the requested subset does not fall in this range then the functions return ARM_MATH_ARGUMENT_ERROR. - * Otherwise the functions return ARM_MATH_SUCCESS. - * \note Refer arm_conv_f32() for details on fixed point behavior. - * - * - * Fast Versions - * - * \par - * Fast versions are supported for Q31 and Q15 of partial convolution. Cycles for Fast versions are less compared to Q31 and Q15 of partial conv and the design requires - * the input signals should be scaled down to avoid intermediate overflows. - * - * - * Opt Versions - * - * \par - * Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. - * These versions are optimised in cycles and consumes more memory(Scratch memory) compared to Q15 and Q7 versions of partial convolution - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - -arm_status arm_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t *pIn1 = pSrcA; /* inputA pointer */ - float32_t *pIn2 = pSrcB; /* inputB pointer */ - float32_t *pOut = pDst; /* output pointer */ - float32_t *px; /* Intermediate inputA pointer */ - float32_t *py; /* Intermediate inputB pointer */ - float32_t *pSrc1, *pSrc2; /* Intermediate pointers */ - float32_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - float32_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t j, k, count = 0u, blkCnt, check; - int32_t blockSize1, blockSize2, blockSize3; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = ((int32_t) check - blockSize3) - - (blockSize1 + (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + firstIndex; - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum += *px++ * *py--; - - /* x[1] * y[srcBLen - 2] */ - sum += *px++ * *py--; - - /* x[2] * y[srcBLen - 3] */ - sum += *px++ * *py--; - - /* x[3] * y[srcBLen - 4] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc1; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = ((uint32_t) blockSize2 >> 2u); - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - - /* Read x[3] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 += x0 * c0; - - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 += x1 * c0; - - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 += x2 * c0; - - /* acc3 += x[3] * y[srcBLen - 1] */ - acc3 += x3 * c0; - - /* Read y[srcBLen - 2] sample */ - c0 = *(py--); - - /* Read x[4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 += x1 * c0; - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 += x2 * c0; - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 += x3 * c0; - /* acc3 += x[4] * y[srcBLen - 2] */ - acc3 += x0 * c0; - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - - /* Read x[5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 += x2 * c0; - /* acc1 += x[3] * y[srcBLen - 2] */ - acc1 += x3 * c0; - /* acc2 += x[4] * y[srcBLen - 2] */ - acc2 += x0 * c0; - /* acc3 += x[5] * y[srcBLen - 2] */ - acc3 += x1 * c0; - - /* Read y[srcBLen - 4] sample */ - c0 = *(py--); - - /* Read x[6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[srcBLen - 4] */ - acc0 += x3 * c0; - /* acc1 += x[4] * y[srcBLen - 4] */ - acc1 += x0 * c0; - /* acc2 += x[5] * y[srcBLen - 4] */ - acc2 += x1 * c0; - /* acc3 += x[6] * y[srcBLen - 4] */ - acc3 += x2 * c0; - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += x0 * c0; - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += x1 * c0; - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += x2 * c0; - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 += x3 * c0; - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = acc0; - *pOut++ = acc1; - *pOut++ = acc2; - *pOut++ = acc3; - - /* Increment the pointer pIn1 index, count by 1 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += *px++ * *py--; - sum += *px++ * *py--; - sum += *px++ * *py--; - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - sum += *px++ * *py--; - - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum += *px++ * *py--; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t *pIn1 = pSrcA; /* inputA pointer */ - float32_t *pIn2 = pSrcB; /* inputB pointer */ - float32_t sum; /* Accumulator */ - uint32_t i, j; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - /* Loop to calculate convolution for output length number of values */ - for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0.0f; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations for inputs */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += pIn1[j] * pIn2[i - j]; - } - } - /* Store the output in the destination buffer */ - pDst[i] = sum; - } - /* set status as ARM_SUCCESS as there are no argument errors */ - status = ARM_MATH_SUCCESS; - } - return (status); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c deleted file mode 100644 index d0f9ffb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c +++ /dev/null @@ -1,768 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_fast_opt_q15.c -* -* Description: Fast Q15 Partial convolution. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * See arm_conv_partial_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - -arm_status arm_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q31_t acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ - q31_t y1, y2; /* State variables */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - arm_status status; - - uint32_t tapCnt; /* loop count */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - - /* Copy smaller length input sequence in reverse order into second scratch buffer */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Assuming scratch1 buffer is aligned by 32-bit */ - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr1, srcALen); - - /* Update pointers */ - pScr1 += srcALen; - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - pScratch1 += firstIndex; - - pOut = pDst + firstIndex; - - /* First part of the processing with loop unrolling process 4 data points at a time. - ** a second loop below process for the remaining 1 to 3 samples. */ - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - /* multiply and accumlate */ - acc0 = __SMLAD(x1, y1, acc0); - acc2 = __SMLAD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLADX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = _SIMD32_OFFSET(pScr1); - - /* multiply and accumlate */ - acc0 = __SMLAD(x2, y2, acc0); - - acc2 = __SMLAD(x1, y2, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - acc1 = __SMLADX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr1 + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y2, acc3); - - /* update scratch pointers */ - pIn2 += 4u; - pScr1 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = numPoints & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read two samples from smaller buffer */ - y1 = *__SIMD32(pIn2)++; - - acc0 = __SMLAD(x1, y1, acc0); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - /* Return to application */ - return (status); -} - -#else - -arm_status arm_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q31_t acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - arm_status status; /* Status variable */ - uint32_t tapCnt; /* loop count */ - q15_t x10, x11, x20, x21; /* Temporary variables to hold srcA buffer */ - q15_t y10, y11; /* Temporary variables to hold srcB buffer */ - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - pScratch1 += firstIndex; - - pOut = pDst + firstIndex; - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read next two samples from scratch1 buffer */ - x20 = *pScr1++; - x21 = *pScr1++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read two samples from smaller buffer */ - y10 = *pIn2; - y11 = *(pIn2 + 1u); - - /* multiply and accumlate */ - acc0 += (q31_t) x10 *y10; - acc0 += (q31_t) x11 *y11; - acc2 += (q31_t) x20 *y10; - acc2 += (q31_t) x21 *y11; - - /* multiply and accumlate */ - acc1 += (q31_t) x11 *y10; - acc1 += (q31_t) x20 *y11; - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1; - x11 = *(pScr1 + 1u); - - /* multiply and accumlate */ - acc3 += (q31_t) x21 *y10; - acc3 += (q31_t) x10 *y11; - - /* Read next two samples from scratch2 buffer */ - y10 = *(pIn2 + 2u); - y11 = *(pIn2 + 3u); - - /* multiply and accumlate */ - acc0 += (q31_t) x20 *y10; - acc0 += (q31_t) x21 *y11; - acc2 += (q31_t) x10 *y10; - acc2 += (q31_t) x11 *y11; - acc1 += (q31_t) x21 *y10; - acc1 += (q31_t) x10 *y11; - - /* Read next two samples from scratch1 buffer */ - x20 = *(pScr1 + 2); - x21 = *(pScr1 + 3); - - /* multiply and accumlate */ - acc3 += (q31_t) x11 *y10; - acc3 += (q31_t) x20 *y11; - - /* update scratch pointers */ - pIn2 += 4u; - pScr1 += 4u; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = __SSAT((acc0 >> 15), 16); - *pOut++ = __SSAT((acc1 >> 15), 16); - *pOut++ = __SSAT((acc2 >> 15), 16); - *pOut++ = __SSAT((acc3 >> 15), 16); - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = numPoints & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read two samples from smaller buffer */ - y10 = *pIn2++; - y11 = *pIn2++; - - /* multiply and accumlate */ - acc0 += (q31_t) x10 *y10; - acc0 += (q31_t) x11 *y11; - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - } - - /* Return to application */ - return (status); -} - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c deleted file mode 100644 index 122c454..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c +++ /dev/null @@ -1,1492 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_fast_q15.c -* -* Description: Fast Q15 Partial convolution. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * See arm_conv_partial_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. - */ - - -arm_status arm_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ -#ifndef UNALIGNED_SUPPORT_DISABLE - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >=srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = (((int32_t) srcBLen - 1) - (int32_t) firstIndex); - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + - (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2 - 1u; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = ((uint32_t) blockSize2 >> 2u); - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px+1); - px+= 2u; - - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLADX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLADX(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px+1); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLADX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLADX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLADX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLADX(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px+2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px+3); - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLADX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLADX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - - c0 = *(py-1); -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px+2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the results in the accumulators in the destination buffer. */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = __PKHBT(acc0 >> 15, acc1 >> 15, 16); - *__SIMD32(pOut)++ = __PKHBT(acc2 >> 15, acc3 >> 15, 16); - -#else - - *__SIMD32(pOut)++ = __PKHBT(acc1 >> 15, acc0 >> 15, 16); - *__SIMD32(pOut)++ = __PKHBT(acc3 >> 15, acc2 >> 15, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = count >> 2u; - - while((j > 0u) && (blockSize3 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied - * with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied - * with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLADX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum = __SMLAD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#else - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counters */ - arm_status status; /* status of Partial convolution */ - q15_t a, b; - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >=srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = ((int32_t) srcBLen - 1) - (int32_t) firstIndex; - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = ((int32_t) check - blockSize3) - - (blockSize1 + (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - py++; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2 - 1u; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = ((uint32_t) blockSize2 >> 2u); - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1] samples */ - a = *px++; - b = *px++; - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *px; - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *px; - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - a = *py; - b = *(py+1); - py -= 2; - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLADX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLADX(x1, c0, acc1); - - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x2 = __PKHBT(a, b, 16); - a = *(px + 2); - x3 = __PKHBT(b, a, 16); - -#else - - x2 = __PKHBT(b, a, 16); - a = *(px + 2); - x3 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLADX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLADX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - a = *py; - b = *(py+1); - py -= 2; - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLADX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLADX(x3, c0, acc1); - - /* Read x[4], x[5], x[6] */ - a = *(px + 2); - b = *(px + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *(px + 4); - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *(px + 4); - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLADX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLADX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - a = *px; - b = *(px+1); - px++; - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - a = *py; - b = *(py+1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - a = *py; - b = *(py+1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x0, c0, acc0); - acc1 = __SMLADX(x1, c0, acc1); - acc2 = __SMLADX(x3, c0, acc2); - acc3 = __SMLADX(x2, c0, acc3); - - /* Read y[srcBLen - 7] */ - c0 = *(py-1); -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - a = *(px+2); - b = *(px+3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16);; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = (q15_t)(acc0 >> 15); - *pOut++ = (q15_t)(acc1 >> 15); - *pOut++ = (q15_t)(acc2 >> 15); - *pOut++ = (q15_t)(acc3 >> 15); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = count >> 2u; - - while((j > 0u) && (blockSize3 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - py++; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - sum += ((q31_t) * px++ * *py--); - /* Decrement the loop counter */ - k--; - } - - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (sum >> 15); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c deleted file mode 100644 index bb7c6f8..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c +++ /dev/null @@ -1,611 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_fast_q31.c -* -* Description: Fast Q31 Partial convolution. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * \par - * See arm_conv_partial_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. - */ - -arm_status arm_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q31_t x0, x1, x2, x3, c0; - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = (((int32_t) srcBLen - 1) - (int32_t) firstIndex); - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + - (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first loop starts here */ - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[1] * y[srcBLen - 2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[2] * y[srcBLen - 3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* x[3] * y[srcBLen - 4] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2 */ - blkCnt = ((uint32_t) blockSize2 >> 2u); - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - - /* Read x[3] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - - /* acc3 += x[3] * y[srcBLen - 1] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Read y[srcBLen - 2] sample */ - c0 = *(py--); - - /* Read x[4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc3 += x[4] * y[srcBLen - 2] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - - /* Read x[5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc1 += x[3] * y[srcBLen - 2] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc2 += x[4] * y[srcBLen - 2] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc3 += x[5] * y[srcBLen - 2] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read y[srcBLen - 4] sample */ - c0 = *(py--); - - /* Read x[6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[srcBLen - 4] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc1 += x[4] * y[srcBLen - 4] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc2 += x[5] * y[srcBLen - 4] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc3 += x[6] * y[srcBLen - 4] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (acc0 << 1); - *pOut++ = (q31_t) (acc1 << 1); - *pOut++ = (q31_t) (acc2 << 1); - *pOut++ = (q31_t) (acc3 << 1); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py--))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = sum << 1; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c deleted file mode 100644 index 13f9420..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c +++ /dev/null @@ -1,765 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_opt_q15.c -* -* Description: Partial convolution of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, state buffers should be aligned by 32-bit - * - * Refer to arm_conv_partial_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * - */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - -arm_status arm_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q63_t acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x1, x2, x3; /* Temporary variables to hold state and coefficient values */ - q31_t y1, y2; /* State variables */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - arm_status status; /* Status variable */ - uint32_t tapCnt; /* loop count */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr1, srcALen); - - /* Update pointers */ - pScr1 += srcALen; - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - pScratch1 += firstIndex; - - pOut = pDst + firstIndex; - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - /* multiply and accumlate */ - acc0 = __SMLALD(x1, y1, acc0); - acc2 = __SMLALD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLALDX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = _SIMD32_OFFSET(pScr1); - - /* multiply and accumlate */ - acc0 = __SMLALD(x2, y2, acc0); - acc2 = __SMLALD(x1, y2, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLALDX(x3, y1, acc3); - acc1 = __SMLALDX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr1 + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLALDX(x3, y2, acc3); - - /* update scratch pointers */ - pIn2 += 4u; - pScr1 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = numPoints & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read two samples from smaller buffer */ - y1 = *__SIMD32(pIn2)++; - - acc0 = __SMLALD(x1, y1, acc0); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - } - - /* Return to application */ - return (status); -} - -#else - -arm_status arm_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch1 */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch1 */ - q63_t acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - uint32_t j, k, blkCnt; /* loop counter */ - arm_status status; /* Status variable */ - uint32_t tapCnt; /* loop count */ - q15_t x10, x11, x20, x21; /* Temporary variables to hold srcA buffer */ - q15_t y10, y11; /* Temporary variables to hold srcB buffer */ - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2 + srcBLen - 1; - - /* points to smaller length sequence */ - px = pIn2; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr2-- = *px++; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy bigger length sequence(srcALen) samples in scratch1 buffer */ - - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = *pIn1++; - - /* Decrement the loop counter */ - k--; - } - - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - - /* Initialization of pIn2 pointer */ - pIn2 = py; - - pScratch1 += firstIndex; - - pOut = pDst + firstIndex; - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read next two samples from scratch1 buffer */ - x20 = *pScr1++; - x21 = *pScr1++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read two samples from smaller buffer */ - y10 = *pIn2; - y11 = *(pIn2 + 1u); - - /* multiply and accumlate */ - acc0 += (q63_t) x10 *y10; - acc0 += (q63_t) x11 *y11; - acc2 += (q63_t) x20 *y10; - acc2 += (q63_t) x21 *y11; - - /* multiply and accumlate */ - acc1 += (q63_t) x11 *y10; - acc1 += (q63_t) x20 *y11; - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1; - x11 = *(pScr1 + 1u); - - /* multiply and accumlate */ - acc3 += (q63_t) x21 *y10; - acc3 += (q63_t) x10 *y11; - - /* Read next two samples from scratch2 buffer */ - y10 = *(pIn2 + 2u); - y11 = *(pIn2 + 3u); - - /* multiply and accumlate */ - acc0 += (q63_t) x20 *y10; - acc0 += (q63_t) x21 *y11; - acc2 += (q63_t) x10 *y10; - acc2 += (q63_t) x11 *y11; - acc1 += (q63_t) x21 *y10; - acc1 += (q63_t) x10 *y11; - - /* Read next two samples from scratch1 buffer */ - x20 = *(pScr1 + 2); - x21 = *(pScr1 + 3); - - /* multiply and accumlate */ - acc3 += (q63_t) x11 *y10; - acc3 += (q63_t) x20 *y11; - - /* update scratch pointers */ - pIn2 += 4u; - pScr1 += 4u; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2); - acc1 += (*pScr1++ * *pIn2); - acc2 += (*pScr1++ * *pIn2); - acc3 += (*pScr1++ * *pIn2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = __SSAT((acc0 >> 15), 16); - *pOut++ = __SSAT((acc1 >> 15), 16); - *pOut++ = __SSAT((acc2 >> 15), 16); - *pOut++ = __SSAT((acc3 >> 15), 16); - - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = numPoints & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read two samples from smaller buffer */ - y10 = *pIn2++; - y11 = *pIn2++; - - /* multiply and accumlate */ - acc0 += (q63_t) x10 *y10; - acc0 += (q63_t) x11 *y11; - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch1 += 1u; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - } - - /* Return to application */ - return (status); -} - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c deleted file mode 100644 index 815ac14..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c +++ /dev/null @@ -1,803 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_opt_q7.c -* -* Description: Partial convolution of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - * - * - */ - - -#ifndef UNALIGNED_SUPPORT_DISABLE - -arm_status arm_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pScr2, *pScr1; /* Intermediate pointers for scratch pointers */ - q15_t x4; /* Temporary input variable */ - q7_t *pIn1, *pIn2; /* inputA and inputB pointer */ - uint32_t j, k, blkCnt, tapCnt; /* loop counter */ - q7_t *px; /* Temporary input1 pointer */ - q15_t *py; /* Temporary input2 pointer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t x1, x2, x3, y1; /* Temporary input variables */ - arm_status status; - q7_t *pOut = pDst; /* output pointer */ - q7_t out0, out1, out2, out3; /* temporary variables */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2; - - /* points to smaller length sequence */ - px = pIn2 + srcBLen - 1; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy (srcALen) samples in scratch buffer */ - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* Initialization of pIn2 pointer */ - pIn2 = (q7_t *) py; - - pScr2 = py; - - pOut = pDst + firstIndex; - - pScratch1 += firstIndex; - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2); - - /* multiply and accumlate */ - acc0 = __SMLAD(x1, y1, acc0); - acc2 = __SMLAD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLADX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2 + 2u); - - acc0 = __SMLAD(x2, y1, acc0); - - acc2 = __SMLAD(x1, y1, acc2); - - acc1 = __SMLADX(x3, y1, acc1); - - x2 = *__SIMD32(pScr1)++; - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - pScr2 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2); - acc1 += (*pScr1++ * *pScr2); - acc2 += (*pScr1++ * *pScr2); - acc3 += (*pScr1++ * *pScr2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - out0 = (q7_t) (__SSAT(acc0 >> 7u, 8)); - out1 = (q7_t) (__SSAT(acc1 >> 7u, 8)); - out2 = (q7_t) (__SSAT(acc2 >> 7u, 8)); - out3 = (q7_t) (__SSAT(acc3 >> 7u, 8)); - - *__SIMD32(pOut)++ = __PACKq7(out0, out1, out2, out3); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 4u; - - } - - blkCnt = (numPoints) & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read two samples from smaller buffer */ - y1 = *__SIMD32(pScr2)++; - - acc0 = __SMLAD(x1, y1, acc0); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7u, 8)); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 1u; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - - } - - return (status); - -} - -#else - -arm_status arm_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2) -{ - - q15_t *pScr2, *pScr1; /* Intermediate pointers for scratch pointers */ - q15_t x4; /* Temporary input variable */ - q7_t *pIn1, *pIn2; /* inputA and inputB pointer */ - uint32_t j, k, blkCnt, tapCnt; /* loop counter */ - q7_t *px; /* Temporary input1 pointer */ - q15_t *py; /* Temporary input2 pointer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulator */ - arm_status status; - q7_t *pOut = pDst; /* output pointer */ - q15_t x10, x11, x20, x21; /* Temporary input variables */ - q15_t y10, y11; /* Temporary input variables */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* pointer to take end of scratch2 buffer */ - pScr2 = pScratch2; - - /* points to smaller length sequence */ - px = pIn2 + srcBLen - 1; - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * px--; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Initialze temporary scratch pointer */ - pScr1 = pScratch1; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy (srcALen) samples in scratch buffer */ - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - - /* Temporary pointer for scratch2 */ - py = pScratch2; - - /* Initialization of pIn2 pointer */ - pIn2 = (q7_t *) py; - - pScr2 = py; - - pOut = pDst + firstIndex; - - pScratch1 += firstIndex; - - /* Actual convolution process starts here */ - blkCnt = (numPoints) >> 2; - - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read next two samples from scratch1 buffer */ - x20 = *pScr1++; - x21 = *pScr1++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y10 = *pScr2; - y11 = *(pScr2 + 1u); - - /* multiply and accumlate */ - acc0 += (q31_t) x10 *y10; - acc0 += (q31_t) x11 *y11; - acc2 += (q31_t) x20 *y10; - acc2 += (q31_t) x21 *y11; - - - acc1 += (q31_t) x11 *y10; - acc1 += (q31_t) x20 *y11; - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1; - x11 = *(pScr1 + 1u); - - /* multiply and accumlate */ - acc3 += (q31_t) x21 *y10; - acc3 += (q31_t) x10 *y11; - - /* Read next two samples from scratch2 buffer */ - y10 = *(pScr2 + 2u); - y11 = *(pScr2 + 3u); - - /* multiply and accumlate */ - acc0 += (q31_t) x20 *y10; - acc0 += (q31_t) x21 *y11; - acc2 += (q31_t) x10 *y10; - acc2 += (q31_t) x11 *y11; - acc1 += (q31_t) x21 *y10; - acc1 += (q31_t) x10 *y11; - - /* Read next two samples from scratch1 buffer */ - x20 = *(pScr1 + 2); - x21 = *(pScr1 + 3); - - /* multiply and accumlate */ - acc3 += (q31_t) x11 *y10; - acc3 += (q31_t) x20 *y11; - - /* update scratch pointers */ - - pScr1 += 4u; - pScr2 += 4u; - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2); - acc1 += (*pScr1++ * *pScr2); - acc2 += (*pScr1++ * *pScr2); - acc3 += (*pScr1++ * *pScr2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc1 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc2 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc3 >> 7u, 8)); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 4u; - - } - - blkCnt = (numPoints) & 0x3; - - /* Calculate convolution for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - /* Read next two samples from scratch1 buffer */ - x10 = *pScr1++; - x11 = *pScr1++; - - /* Read two samples from smaller buffer */ - y10 = *pScr2++; - y11 = *pScr2++; - - /* multiply and accumlate */ - acc0 += (q31_t) x10 *y10; - acc0 += (q31_t) x11 *y11; - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7u, 8)); - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 1u; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - } - - return (status); - -} - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c deleted file mode 100644 index e85ba2b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c +++ /dev/null @@ -1,786 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_q15.c -* -* Description: Partial convolution of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * Refer to arm_conv_partial_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * \par - * Refer the function arm_conv_partial_opt_q15() for a faster implementation of this function using scratch buffers. - * - */ - - -arm_status arm_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ - -#if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE) - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q63_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* Temporary input variables */ - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counter */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = (((int32_t) srcBLen - 1) - (int32_t) firstIndex); - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + - (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2 - 1u; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px+1); - px+= 2u; - - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLALDX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLALDX(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px+1); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLALDX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLALDX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLALDX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLALDX(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px+2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px+3); - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLALDX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLALDX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALDX(x1, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x0, c0, acc0); - acc1 = __SMLALDX(x1, c0, acc1); - acc2 = __SMLALDX(x3, c0, acc2); - acc3 = __SMLALDX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x0, c0, acc0); - acc1 = __SMLALDX(x1, c0, acc1); - acc2 = __SMLALDX(x3, c0, acc2); - acc3 = __SMLALDX(x2, c0, acc3); - - c0 = *(py-1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px+2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x1, c0, acc0); - acc1 = __SMLALD(x2, c0, acc1); - acc2 = __SMLALDX(x2, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = count >> 2u; - - while((j > 0u) && (blockSize3 > 0)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied - * with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied - * with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t *pIn1 = pSrcA; /* inputA pointer */ - q15_t *pIn2 = pSrcB; /* inputB pointer */ - q63_t sum; /* Accumulator */ - uint32_t i, j; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - /* Loop to calculate convolution for output length number of values */ - for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q31_t) pIn1[j] * (pIn2[i - j])); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q15_t) __SSAT((sum >> 15u), 16u); - } - /* set status as ARM_SUCCESS as there are no argument errors */ - status = ARM_MATH_SUCCESS; - } - return (status); - -#endif /* #if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE) */ - -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c deleted file mode 100644 index 8b0833f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c +++ /dev/null @@ -1,607 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_q31.c -* -* Description: Partial convolution of Q31 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * See arm_conv_partial_fast_q31() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - */ - -arm_status arm_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q63_t sum, acc0, acc1, acc2; /* Accumulator */ - q31_t x0, x1, x2, c0; - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counter */ - arm_status status; /* status of Partial convolution */ - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = (((int32_t) srcBLen - 1) - (int32_t) firstIndex); - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + - (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first loop starts here */ - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum += (q63_t) * px++ * (*py--); - /* x[1] * y[srcBLen - 2] */ - sum += (q63_t) * px++ * (*py--); - /* x[2] * y[srcBLen - 3] */ - sum += (q63_t) * px++ * (*py--); - /* x[3] * y[srcBLen - 4] */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blkCnt */ - - blkCnt = blockSize2 / 3; - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - - /* read x[0], x[1] samples */ - x0 = *(px++); - x1 = *(px++); - - /* Apply loop unrolling and compute 3 MACs simultaneously. */ - k = srcBLen / 3; - - /* First part of the processing with loop unrolling. Compute 3 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 2 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py); - - /* Read x[2] sample */ - x2 = *(px); - - /* Perform the multiply-accumulates */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 += (q63_t) x0 *c0; - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 += (q63_t) x1 *c0; - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 += (q63_t) x2 *c0; - - /* Read y[srcBLen - 2] sample */ - c0 = *(py - 1u); - - /* Read x[3] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 += (q63_t) x1 *c0; - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 += (q63_t) x2 *c0; - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 += (q63_t) x0 *c0; - - /* Read y[srcBLen - 3] sample */ - c0 = *(py - 2u); - - /* Read x[4] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 += (q63_t) x2 *c0; - /* acc1 += x[3] * y[srcBLen - 2] */ - acc1 += (q63_t) x0 *c0; - /* acc2 += x[4] * y[srcBLen - 2] */ - acc2 += (q63_t) x1 *c0; - - - px += 3u; - - py -= 3u; - - } while(--k); - - /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen - (3 * (srcBLen / 3)); - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += (q63_t) x0 *c0; - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += (q63_t) x1 *c0; - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += (q63_t) x2 *c0; - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (acc0 >> 31); - *pOut++ = (q31_t) (acc1 >> 31); - *pOut++ = (q31_t) (acc2 >> 31); - - /* Increment the pointer pIn1 index, count by 3 */ - count += 3u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 3, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 - 3 * (blockSize2 / 3); - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t *pIn1 = pSrcA; /* inputA pointer */ - q31_t *pIn2 = pSrcB; /* inputB pointer */ - q63_t sum; /* Accumulator */ - uint32_t i, j; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - /* Loop to calculate convolution for output length number of values */ - for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q63_t) pIn1[j] * (pIn2[i - j])); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q31_t) (sum >> 31u); - } - /* set status as ARM_SUCCESS as there are no argument errors */ - status = ARM_MATH_SUCCESS; - } - return (status); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c deleted file mode 100644 index 61ed590..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c +++ /dev/null @@ -1,741 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_partial_q7.c -* -* Description: Partial convolution of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup PartialConv - * @{ - */ - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - * - * \par - * Refer the function arm_conv_partial_opt_q7() for a faster implementation of this function. - * - */ - -arm_status arm_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t *pIn1; /* inputA pointer */ - q7_t *pIn2; /* inputB pointer */ - q7_t *pOut = pDst; /* output pointer */ - q7_t *px; /* Intermediate inputA pointer */ - q7_t *py; /* Intermediate inputB pointer */ - q7_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t input1, input2; - q15_t in1, in2; - q7_t x0, x1, x2, x3, c0, c1; - uint32_t j, k, count, check, blkCnt; - int32_t blockSize1, blockSize2, blockSize3; /* loop counter */ - arm_status status; - - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_MATH_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* Conditions to check which loopCounter holds - * the first and last indices of the output samples to be calculated. */ - check = firstIndex + numPoints; - blockSize3 = ((int32_t)check > (int32_t)srcALen) ? (int32_t)check - (int32_t)srcALen : 0; - blockSize3 = ((int32_t)firstIndex > (int32_t)srcALen - 1) ? blockSize3 - (int32_t)firstIndex + (int32_t)srcALen : blockSize3; - blockSize1 = (((int32_t) srcBLen - 1) - (int32_t) firstIndex); - blockSize1 = (blockSize1 > 0) ? ((check > (srcBLen - 1u)) ? blockSize1 : - (int32_t) numPoints) : 0; - blockSize2 = (int32_t) check - ((blockSize3 + blockSize1) + - (int32_t) firstIndex); - blockSize2 = (blockSize2 > 0) ? blockSize2 : 0; - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* Set the output pointer to point to the firstIndex - * of the output sample to be calculated. */ - pOut = pDst + firstIndex; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed. - Since the partial convolution starts from from firstIndex - Number of Macs to be performed is firstIndex + 1 */ - count = 1u + firstIndex; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + firstIndex; - py = pSrc2; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] , x[1] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 1] , y[srcBLen - 2] */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* x[0] * y[srcBLen - 1] */ - /* x[1] * y[srcBLen - 2] */ - sum = __SMLAD(input1, input2, sum); - - /* x[2] , x[3] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 3] , y[srcBLen - 4] */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* x[2] * y[srcBLen - 3] */ - /* x[3] * y[srcBLen - 4] */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = ++pSrc2; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - if((int32_t)firstIndex - (int32_t)srcBLen + 1 > 0) - { - px = pIn1 + firstIndex - srcBLen + 1; - } - else - { - px = pIn1; - } - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = ((uint32_t) blockSize2 >> 2u); - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - /* Read y[srcBLen - 2] sample */ - c1 = *(py--); - - /* Read x[3] sample */ - x3 = *(px++); - - /* x[0] and x[1] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 1] and y[srcBLen - 2] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[1] and x[2] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[4] sample */ - x0 = *(px++); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLAD(input1, input2, acc3); - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - /* Read y[srcBLen - 4] sample */ - c1 = *(py--); - - /* Read x[5] sample */ - x1 = *(px++); - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 3] and y[srcBLen - 4] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[4] and x[5] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[6] sample */ - x2 = *(px++); - - /* x[5] and x[6] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLAD(input1, input2, acc3); - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += ((q31_t) x0 * c0); - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += ((q31_t) x1 * c0); - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += ((q31_t) x2 * c0); - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 += ((q31_t) x3 * c0); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7, 8)); - *pOut++ = (q7_t) (__SSAT(acc1 >> 7, 8)); - *pOut++ = (q7_t) (__SSAT(acc2 >> 7, 8)); - *pOut++ = (q7_t) (__SSAT(acc3 >> 7, 8)); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = (uint32_t) blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Reading two inputs, x[srcALen - srcBLen + 1] and x[srcALen - srcBLen + 2] of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs, y[srcBLen - 1] and y[srcBLen - 2] of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum = __SMLAD(input1, input2, sum); - - /* Reading two inputs, x[srcALen - srcBLen + 3] and x[srcALen - srcBLen + 4] of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs, y[srcBLen - 3] and y[srcBLen - 4] of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum += ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7, 8)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); - -#else - - /* Run the below code for Cortex-M0 */ - - q7_t *pIn1 = pSrcA; /* inputA pointer */ - q7_t *pIn2 = pSrcB; /* inputB pointer */ - q31_t sum; /* Accumulator */ - uint32_t i, j; /* loop counters */ - arm_status status; /* status of Partial convolution */ - - /* Check for range of output samples to be calculated */ - if((firstIndex + numPoints) > ((srcALen + (srcBLen - 1u)))) - { - /* Set status as ARM_ARGUMENT_ERROR */ - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - /* Loop to calculate convolution for output length number of values */ - for (i = firstIndex; i <= (firstIndex + numPoints - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q15_t) pIn1[j] * (pIn2[i - j])); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q7_t) __SSAT((sum >> 7u), 8u); - } - /* set status as ARM_SUCCESS as there are no argument errors */ - status = ARM_MATH_SUCCESS; - } - return (status); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of PartialConv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c deleted file mode 100644 index 8454a94..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c +++ /dev/null @@ -1,734 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_q15.c -* -* Description: Convolution of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both inputs are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * This approach provides 33 guard bits and there is no risk of overflow. - * The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. - * - * \par - * Refer to arm_conv_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * \par - * Refer the function arm_conv_opt_q15() for a faster implementation of this function using scratch buffers. - * - */ - -void arm_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst) -{ - -#if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE) - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q63_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t blockSize1, blockSize2, blockSize3, j, k, count, blkCnt; /* loop counter */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations less than 4 */ - /* Second part of this stage computes the MAC operations greater than or equal to 4 */ - - /* The first part of the stage starts here */ - while((count < 4u) && (blockSize1 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over number of MAC operations between - * inputA samples and inputB samples */ - k = count; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* The second part of the stage starts here */ - /* The internal loop, over count, is unrolled by 4 */ - /* To, read the last two inputB samples using SIMD: - * y[srcBLen] and y[srcBLen-1] coefficients, py is decremented by 1 */ - py = py - 1; - - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0], x[1] are multiplied with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[2], x[3] are multiplied with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + (count - 1u); - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is the index by which the pointer pIn1 to be incremented */ - count = 0u; - - - /* -------------------- - * Stage2 process - * -------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - py = py - 1u; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px+1); - px+= 2u; - - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the last two inputB samples using SIMD: - * y[srcBLen - 1] and y[srcBLen - 2] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLALDX(x0, c0, acc0); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLALDX(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px+1); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLALDX(x2, c0, acc2); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLALDX(x3, c0, acc3); - - /* Read y[srcBLen - 3] and y[srcBLen - 4] */ - c0 = *__SIMD32(py)--; - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLALDX(x2, c0, acc0); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLALDX(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px+2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px+3); - px += 4u; - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLALDX(x0, c0, acc2); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLALDX(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[srcBLen - 5] */ - c0 = *(py+1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALDX(x1, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x0, c0, acc0); - acc1 = __SMLALDX(x1, c0, acc1); - acc2 = __SMLALDX(x3, c0, acc2); - acc3 = __SMLALDX(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[srcBLen - 5], y[srcBLen - 6] */ - c0 = _SIMD32_OFFSET(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px+1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x0, c0, acc0); - acc1 = __SMLALDX(x1, c0, acc1); - acc2 = __SMLALDX(x3, c0, acc2); - acc3 = __SMLALDX(x2, c0, acc3); - - c0 = *(py-1); - -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px+2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x1, c0, acc0); - acc1 = __SMLALD(x2, c0, acc1); - acc2 = __SMLALDX(x2, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - - /* Store the results in the accumulators in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - *__SIMD32(pOut)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) ((q31_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT(sum >> 15, 16)); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - blockSize3 = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - pIn2 = pSrc2 - 1u; - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - /* For loop unrolling by 4, this stage is divided into two. */ - /* First part of this stage computes the MAC operations greater than 4 */ - /* Second part of this stage computes the MAC operations less than or equal to 4 */ - - /* The first part of the stage starts here */ - j = blockSize3 >> 2u; - - while((j > 0u) && (blockSize3 > 0u)) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[srcALen - srcBLen + 1], x[srcALen - srcBLen + 2] are multiplied - * with y[srcBLen - 1], y[srcBLen - 2] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - /* x[srcALen - srcBLen + 3], x[srcALen - srcBLen + 4] are multiplied - * with y[srcBLen - 3], y[srcBLen - 4] respectively */ - sum = __SMLALDX(*__SIMD32(px)++, *__SIMD32(py)--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* For the next MAC operations, the pointer py is used without SIMD - * So, py is incremented by 1 */ - py = py + 1u; - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 5] * y[srcBLen - 5] */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the loop counter */ - blockSize3--; - - j--; - } - - /* The second part of the stage starts here */ - /* SIMD is not used for the next MAC operations, - * so pointer py is updated to read only one sample at a time */ - py = py + 1u; - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen-1] * y[srcBLen-1] */ - sum = __SMLALD(*px++, *py--, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - q15_t *pIn1 = pSrcA; /* input pointer */ - q15_t *pIn2 = pSrcB; /* coefficient pointer */ - q63_t sum; /* Accumulator */ - uint32_t i, j; /* loop counter */ - - /* Loop to calculate output of convolution for output length number of times */ - for (i = 0; i < (srcALen + srcBLen - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += (q31_t) pIn1[j] * (pIn2[i - j]); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q15_t) __SSAT((sum >> 15u), 16u); - } - -#endif /* #if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE)*/ - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c deleted file mode 100644 index ffa972f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c +++ /dev/null @@ -1,565 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_q31.c -* -* Description: Convolution of Q31 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down the inputs by log2(min(srcALen, srcBLen)) (log2 is read as log to the base 2) times to avoid overflows, - * as maximum of min(srcALen, srcBLen) number of additions are carried internally. - * The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. - * - * \par - * See arm_conv_fast_q31() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - */ - -void arm_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q63_t sum; /* Accumulator */ - q63_t acc0, acc1, acc2; /* Accumulator */ - q31_t x0, x1, x2, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t j, k, count, blkCnt, blockSize1, blockSize2, blockSize3; /* loop counter */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (q31_t *) pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = (q31_t *) pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 1] */ - sum += (q63_t) * px++ * (*py--); - /* x[1] * y[srcBLen - 2] */ - sum += (q63_t) * px++ * (*py--); - /* x[2] * y[srcBLen - 3] */ - sum += (q63_t) * px++ * (*py--); - /* x[3] * y[srcBLen - 4] */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll by 3 */ - blkCnt = blockSize2 / 3; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - - /* Apply loop unrolling and compute 3 MACs simultaneously. */ - k = srcBLen / 3; - - /* First part of the processing with loop unrolling. Compute 3 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 2 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py); - - /* Read x[3] sample */ - x2 = *(px); - - /* Perform the multiply-accumulates */ - /* acc0 += x[0] * y[srcBLen - 1] */ - acc0 += ((q63_t) x0 * c0); - /* acc1 += x[1] * y[srcBLen - 1] */ - acc1 += ((q63_t) x1 * c0); - /* acc2 += x[2] * y[srcBLen - 1] */ - acc2 += ((q63_t) x2 * c0); - - /* Read y[srcBLen - 2] sample */ - c0 = *(py - 1u); - - /* Read x[4] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[srcBLen - 2] */ - acc0 += ((q63_t) x1 * c0); - /* acc1 += x[2] * y[srcBLen - 2] */ - acc1 += ((q63_t) x2 * c0); - /* acc2 += x[3] * y[srcBLen - 2] */ - acc2 += ((q63_t) x0 * c0); - - /* Read y[srcBLen - 3] sample */ - c0 = *(py - 2u); - - /* Read x[5] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[srcBLen - 3] */ - acc0 += ((q63_t) x2 * c0); - /* acc1 += x[3] * y[srcBLen - 2] */ - acc1 += ((q63_t) x0 * c0); - /* acc2 += x[4] * y[srcBLen - 2] */ - acc2 += ((q63_t) x1 * c0); - - /* update scratch pointers */ - px += 3u; - py -= 3u; - - } while(--k); - - /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen - (3 * (srcBLen / 3)); - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += ((q63_t) x0 * c0); - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += ((q63_t) x1 * c0); - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += ((q63_t) x2 * c0); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - - /* Decrement the loop counter */ - k--; - } - - /* Store the results in the accumulators in the destination buffer. */ - *pOut++ = (q31_t) (acc0 >> 31); - *pOut++ = (q31_t) (acc1 >> 31); - *pOut++ = (q31_t) (acc2 >> 31); - - /* Increment the pointer pIn1 index, count by 3 */ - count += 3u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 3, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 - 3 * (blockSize2 / 3); - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - sum += (q63_t) * px++ * (*py--); - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum += (q63_t) * px++ * (*py--); - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - sum += (q63_t) * px++ * (*py--); - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q31_t) (sum >> 31); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t *pIn1 = pSrcA; /* input pointer */ - q31_t *pIn2 = pSrcB; /* coefficient pointer */ - q63_t sum; /* Accumulator */ - uint32_t i, j; /* loop counter */ - - /* Loop to calculate output of convolution for output length number of times */ - for (i = 0; i < (srcALen + srcBLen - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q63_t) pIn1[j] * (pIn2[i - j])); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q31_t) (sum >> 31u); - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c deleted file mode 100644 index 79b08fc..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c +++ /dev/null @@ -1,690 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_conv_q7.c -* -* Description: Convolution of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Conv - * @{ - */ - -/** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. - * The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and then saturated to 1.7 format. - * - * \par - * Refer the function arm_conv_opt_q7() for a faster implementation of this function. - * - */ - -void arm_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t *pIn1; /* inputA pointer */ - q7_t *pIn2; /* inputB pointer */ - q7_t *pOut = pDst; /* output pointer */ - q7_t *px; /* Intermediate inputA pointer */ - q7_t *py; /* Intermediate inputB pointer */ - q7_t *pSrc1, *pSrc2; /* Intermediate pointers */ - q7_t x0, x1, x2, x3, c0, c1; /* Temporary variables to hold state and coefficient values */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulator */ - q31_t input1, input2; /* Temporary input variables */ - q15_t in1, in2; /* Temporary input variables */ - uint32_t j, k, count, blkCnt, blockSize1, blockSize2, blockSize3; /* loop counter */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - } - - /* conv(x,y) at n = x[n] * y[0] + x[n-1] * y[1] + x[n-2] * y[2] + ...+ x[n-N+1] * y[N -1] */ - /* The function is internally - * divided into three stages according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first stage of the - * algorithm, the multiplications increase by one for every iteration. - * In the second stage of the algorithm, srcBLen number of multiplications are done. - * In the third stage of the algorithm, the multiplications decrease by one - * for every iteration. */ - - /* The algorithm is implemented in three stages. - The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = (srcALen - srcBLen) + 1u; - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[0] - * sum = x[0] * y[1] + x[1] * y[0] - * .... - * sum = x[0] * y[srcBlen - 1] + x[1] * y[srcBlen - 2] +...+ x[srcBLen - 1] * y[0] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] , x[1] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* y[srcBLen - 1] , y[srcBLen - 2] */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* x[0] * y[srcBLen - 1] */ - /* x[1] * y[srcBLen - 2] */ - sum = __SMLAD(input1, input2, sum); - - /* x[2] , x[3] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* y[srcBLen - 3] , y[srcBLen - 4] */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* x[2] * y[srcBLen - 3] */ - /* x[3] * y[srcBLen - 4] */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q15_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7u, 8)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pIn2 + count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[srcBLen-1] + x[1] * y[srcBLen-2] +...+ x[srcBLen-1] * y[0] - * sum = x[1] * y[srcBLen-1] + x[2] * y[srcBLen-2] +...+ x[srcBLen] * y[0] - * .... - * sum = x[srcALen-srcBLen-2] * y[srcBLen-1] + x[srcALen] * y[srcBLen-2] +...+ x[srcALen-1] * y[0] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[srcBLen - 1] sample */ - c0 = *(py--); - /* Read y[srcBLen - 2] sample */ - c1 = *(py--); - - /* Read x[3] sample */ - x3 = *(px++); - - /* x[0] and x[1] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* y[srcBLen - 1] and y[srcBLen - 2] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc0 += x[0] * y[srcBLen - 1] + x[1] * y[srcBLen - 2] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[1] and x[2] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc1 += x[1] * y[srcBLen - 1] + x[2] * y[srcBLen - 2] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc2 += x[2] * y[srcBLen - 1] + x[3] * y[srcBLen - 2] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[4] sample */ - x0 = *(px++); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc3 += x[3] * y[srcBLen - 1] + x[4] * y[srcBLen - 2] */ - acc3 = __SMLAD(input1, input2, acc3); - - /* Read y[srcBLen - 3] sample */ - c0 = *(py--); - /* Read y[srcBLen - 4] sample */ - c1 = *(py--); - - /* Read x[5] sample */ - x1 = *(px++); - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* y[srcBLen - 3] and y[srcBLen - 4] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc0 += x[2] * y[srcBLen - 3] + x[3] * y[srcBLen - 4] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc1 += x[3] * y[srcBLen - 3] + x[4] * y[srcBLen - 4] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[4] and x[5] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc2 += x[4] * y[srcBLen - 3] + x[5] * y[srcBLen - 4] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[6] sample */ - x2 = *(px++); - - /* x[5] and x[6] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* acc3 += x[5] * y[srcBLen - 3] + x[6] * y[srcBLen - 4] */ - acc3 = __SMLAD(input1, input2, acc3); - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[srcBLen - 5] sample */ - c0 = *(py--); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[srcBLen - 5] */ - acc0 += ((q15_t) x0 * c0); - /* acc1 += x[5] * y[srcBLen - 5] */ - acc1 += ((q15_t) x1 * c0); - /* acc2 += x[6] * y[srcBLen - 5] */ - acc2 += ((q15_t) x2 * c0); - /* acc3 += x[7] * y[srcBLen - 5] */ - acc3 += ((q15_t) x3 * c0); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(acc0 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc1 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc2 >> 7u, 8)); - *pOut++ = (q7_t) (__SSAT(acc3 >> 7u, 8)); - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q15_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7u, 8)); - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* srcBLen number of MACS should be performed */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q15_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7u, 8)); - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pSrc2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[srcBLen-1] + x[srcALen-srcBLen+2] * y[srcBLen-2] +...+ x[srcALen-1] * y[1] - * sum += x[srcALen-srcBLen+2] * y[srcBLen-1] + x[srcALen-srcBLen+3] * y[srcBLen-2] +...+ x[srcALen-1] * y[2] - * .... - * sum += x[srcALen-2] * y[srcBLen-1] + x[srcALen-1] * y[srcBLen-2] - * sum += x[srcALen-1] * y[srcBLen-1] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The blockSize3 variable holds the number of MAC operations performed */ - - /* Working pointer of inputA */ - pSrc1 = pIn1 + (srcALen - (srcBLen - 1u)); - px = pSrc1; - - /* Working pointer of inputB */ - pSrc2 = pIn2 + (srcBLen - 1u); - py = pSrc2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = blockSize3 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Reading two inputs, x[srcALen - srcBLen + 1] and x[srcALen - srcBLen + 2] of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Reading two inputs, y[srcBLen - 1] and y[srcBLen - 2] of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* sum += x[srcALen - srcBLen + 1] * y[srcBLen - 1] */ - /* sum += x[srcALen - srcBLen + 2] * y[srcBLen - 2] */ - sum = __SMLAD(input1, input2, sum); - - /* Reading two inputs, x[srcALen - srcBLen + 3] and x[srcALen - srcBLen + 4] of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* Reading two inputs, y[srcBLen - 3] and y[srcBLen - 4] of SrcB buffer and packing */ - in1 = (q15_t) * py--; - in2 = (q15_t) * py--; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16u); - - /* sum += x[srcALen - srcBLen + 3] * y[srcBLen - 3] */ - /* sum += x[srcALen - srcBLen + 4] * y[srcBLen - 4] */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the blockSize3 is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = blockSize3 % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q15_t) * px++ * *py--); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut++ = (q7_t) (__SSAT(sum >> 7u, 8)); - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pSrc2; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q7_t *pIn1 = pSrcA; /* input pointer */ - q7_t *pIn2 = pSrcB; /* coefficient pointer */ - q31_t sum; /* Accumulator */ - uint32_t i, j; /* loop counter */ - - /* Loop to calculate output of convolution for output length number of times */ - for (i = 0; i < (srcALen + srcBLen - 1); i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0; j <= i; j++) - { - /* Check the array limitations */ - if(((i - j) < srcBLen) && (j < srcALen)) - { - /* z[i] += x[i-j] * y[j] */ - sum += (q15_t) pIn1[j] * (pIn2[i - j]); - } - } - - /* Store the output in the destination buffer */ - pDst[i] = (q7_t) __SSAT((sum >> 7u), 8u); - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Conv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c deleted file mode 100644 index fec5431..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c +++ /dev/null @@ -1,739 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_f32.c -* -* Description: Correlation of floating-point sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup Corr Correlation - * - * Correlation is a mathematical operation that is similar to convolution. - * As with convolution, correlation uses two signals to produce a third signal. - * The underlying algorithms in correlation and convolution are identical except that one of the inputs is flipped in convolution. - * Correlation is commonly used to measure the similarity between two signals. - * It has applications in pattern recognition, cryptanalysis, and searching. - * The CMSIS library provides correlation functions for Q7, Q15, Q31 and floating-point data types. - * Fast versions of the Q15 and Q31 functions are also provided. - * - * \par Algorithm - * Let a[n] and b[n] be sequences of length srcALen and srcBLen samples respectively. - * The convolution of the two signals is denoted by - *
    
- *                   c[n] = a[n] * b[n]    
- * 
- * In correlation, one of the signals is flipped in time - *
    
- *                   c[n] = a[n] * b[-n]    
- * 
- * - * \par - * and this is mathematically defined as - * \image html CorrelateEquation.gif - * \par - * The pSrcA points to the first input vector of length srcALen and pSrcB points to the second input vector of length srcBLen. - * The result c[n] is of length 2 * max(srcALen, srcBLen) - 1 and is defined over the interval n=0, 1, 2, ..., (2 * max(srcALen, srcBLen) - 2). - * The output result is written to pDst and the calling function must allocate 2 * max(srcALen, srcBLen) - 1 words for the result. - * - * Note - * \par - * The pDst should be initialized to all zeros before being used. - * - * Fixed-Point Behavior - * \par - * Correlation requires summing up a large number of intermediate products. - * As such, the Q7, Q15, and Q31 functions run a risk of overflow and saturation. - * Refer to the function specific documentation below for further details of the particular algorithm used. - * - * - * Fast Versions - * - * \par - * Fast versions are supported for Q31 and Q15. Cycles for Fast versions are less compared to Q31 and Q15 of correlate and the design requires - * the input signals should be scaled down to avoid intermediate overflows. - * - * - * Opt Versions - * - * \par - * Opt versions are supported for Q15 and Q7. Design uses internal scratch buffer for getting good optimisation. - * These versions are optimised in cycles and consumes more memory(Scratch memory) compared to Q15 and Q7 versions of correlate - */ - -/** - * @addtogroup Corr - * @{ - */ -/** - * @brief Correlation of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - -void arm_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t *pIn1; /* inputA pointer */ - float32_t *pIn2; /* inputB pointer */ - float32_t *pOut = pDst; /* output pointer */ - float32_t *px; /* Intermediate inputA pointer */ - float32_t *py; /* Intermediate inputB pointer */ - float32_t *pSrc1; /* Intermediate pointers */ - float32_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - float32_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counters */ - int32_t inc = 1; /* Destination address modifier */ - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we assume zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = pSrcA; - - /* Initialization of inputB pointer */ - pIn2 = pSrcB; - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding has to be done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - //while(j > 0u) - //{ - // /* Zero is stored in the destination buffer */ - // *pOut++ = 0.0f; - - // /* Decrement the loop counter */ - // j--; - //} - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = pSrcB; - - /* Initialization of inputB pointer */ - pIn2 = pSrcA; - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen-2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] */ - sum += *px++ * *py++; - /* x[1] * y[srcBLen - 3] */ - sum += *px++ * *py++; - /* x[2] * y[srcBLen - 2] */ - sum += *px++ * *py++; - /* x[3] * y[srcBLen - 1] */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - /* x[0] * y[srcBLen - 1] */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4, to loop unroll the srcBLen loop */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[0] sample */ - c0 = *(py++); - - /* Read x[3] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[0] */ - acc0 += x0 * c0; - /* acc1 += x[1] * y[0] */ - acc1 += x1 * c0; - /* acc2 += x[2] * y[0] */ - acc2 += x2 * c0; - /* acc3 += x[3] * y[0] */ - acc3 += x3 * c0; - - /* Read y[1] sample */ - c0 = *(py++); - - /* Read x[4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[1] * y[1] */ - acc0 += x1 * c0; - /* acc1 += x[2] * y[1] */ - acc1 += x2 * c0; - /* acc2 += x[3] * y[1] */ - acc2 += x3 * c0; - /* acc3 += x[4] * y[1] */ - acc3 += x0 * c0; - - /* Read y[2] sample */ - c0 = *(py++); - - /* Read x[5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[2] */ - acc0 += x2 * c0; - /* acc1 += x[3] * y[2] */ - acc1 += x3 * c0; - /* acc2 += x[4] * y[2] */ - acc2 += x0 * c0; - /* acc3 += x[5] * y[2] */ - acc3 += x1 * c0; - - /* Read y[3] sample */ - c0 = *(py++); - - /* Read x[6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[3] */ - acc0 += x3 * c0; - /* acc1 += x[4] * y[3] */ - acc1 += x0 * c0; - /* acc2 += x[5] * y[3] */ - acc2 += x1 * c0; - /* acc3 += x[6] * y[3] */ - acc3 += x2 * c0; - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[4] sample */ - c0 = *(py++); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[4] */ - acc0 += x0 * c0; - /* acc1 += x[5] * y[4] */ - acc1 += x1 * c0; - /* acc2 += x[6] * y[4] */ - acc2 += x2 * c0; - /* acc3 += x[7] * y[4] */ - acc3 += x3 * c0; - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = acc0; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = acc1; - pOut += inc; - - *pOut = acc2; - pOut += inc; - - *pOut = acc3; - pOut += inc; - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += *px++ * *py++; - sum += *px++ * *py++; - sum += *px++ * *py++; - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = pIn1 + (srcALen - (srcBLen - 1u)); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0.0f; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen - srcBLen + 4] * y[3] */ - sum += *px++ * *py++; - /* sum += x[srcALen - srcBLen + 3] * y[2] */ - sum += *px++ * *py++; - /* sum += x[srcALen - srcBLen + 2] * y[1] */ - sum += *px++ * *py++; - /* sum += x[srcALen - srcBLen + 1] * y[0] */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += *px++ * *py++; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t *pIn1 = pSrcA; /* inputA pointer */ - float32_t *pIn2 = pSrcB + (srcBLen - 1u); /* inputB pointer */ - float32_t sum; /* Accumulator */ - uint32_t i = 0u, j; /* loop counters */ - uint32_t inv = 0u; /* Reverse order flag */ - uint32_t tot = 0u; /* Length */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and a varaible, inv is set to 1 */ - /* If lengths are not equal then zero pad has to be done to make the two - * inputs of same length. But to improve the performance, we assume zeroes - * in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the - * starting of the output buffer */ - /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the - * ending of the output buffer */ - /* Once the zero padding is done the remaining of the output is calcualted - * using convolution but with the shorter signal time shifted. */ - - /* Calculate the length of the remaining sequence */ - tot = ((srcALen + srcBLen) - 2u); - - if(srcALen > srcBLen) - { - /* Calculating the number of zeros to be padded to the output */ - j = srcALen - srcBLen; - - /* Initialise the pointer after zero padding */ - pDst += j; - } - - else if(srcALen < srcBLen) - { - /* Initialization to inputB pointer */ - pIn1 = pSrcB; - - /* Initialization to the end of inputA pointer */ - pIn2 = pSrcA + (srcALen - 1u); - - /* Initialisation of the pointer after zero padding */ - pDst = pDst + tot; - - /* Swapping the lengths */ - j = srcALen; - srcALen = srcBLen; - srcBLen = j; - - /* Setting the reverse flag */ - inv = 1; - - } - - /* Loop to calculate convolution for output length number of times */ - for (i = 0u; i <= tot; i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0.0f; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += pIn1[j] * pIn2[-((int32_t) i - j)]; - } - } - /* Store the output in the destination buffer */ - if(inv == 1) - *pDst-- = sum; - else - *pDst++ = sum; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c deleted file mode 100644 index afeb190..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c +++ /dev/null @@ -1,512 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_fast_opt_q15.c -* -* Description: Fast Q15 Correlation. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - * - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch buffers should be aligned by 32-bit - * - * - * Scaling and Overflow Behavior: - * - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down one of the inputs by 1/min(srcALen, srcBLen) to avoid overflow since a - * maximum of min(srcALen, srcBLen) number of additions is carried internally. - * The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. - * - * \par - * See arm_correlate_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. - */ - -void arm_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch) -{ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *py; /* Intermediate inputB pointer */ - q31_t x1, x2, x3; /* temporary variables for holding input and coefficient values */ - uint32_t j, blkCnt, outBlockSize; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - uint32_t tapCnt; - q31_t y1, y2; - q15_t *pScr; /* Intermediate pointers */ - q15_t *pOut = pDst; /* output pointer */ -#ifdef UNALIGNED_SUPPORT_DISABLE - - q15_t a, b; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - pScr = pScratch; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr += (srcBLen - 1u); - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr, srcALen); - - /* Update pointers */ - pScr += srcALen; - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - j = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(j > 0u) - { - /* copy second buffer in reversal manner */ - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - - /* Decrement the loop counter */ - j--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - j = srcALen % 0x4u; - - while(j > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr++ = *pIn1++; - - /* Decrement the loop counter */ - j--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr, (srcBLen - 1u)); - - /* Update pointer */ - pScr += (srcBLen - 1u); - -#else - -/* Apply loop unrolling and do 4 Copies simultaneously. */ - j = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(j > 0u) - { - /* copy second buffer in reversal manner */ - *pScr++ = 0; - *pScr++ = 0; - *pScr++ = 0; - *pScr++ = 0; - - /* Decrement the loop counter */ - j--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - j = (srcBLen - 1u) % 0x4u; - - while(j > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr++ = 0; - - /* Decrement the loop counter */ - j--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Temporary pointer for scratch2 */ - py = pIn2; - - - /* Actual correlation process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr = pScratch; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read four samples from scratch1 buffer */ - x1 = *__SIMD32(pScr)++; - - /* Read next four samples from scratch1 buffer */ - x2 = *__SIMD32(pScr)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - acc0 = __SMLAD(x1, y1, acc0); - - acc2 = __SMLAD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLADX(x3, y1, acc1); - - x1 = _SIMD32_OFFSET(pScr); - - acc0 = __SMLAD(x2, y2, acc0); - - acc2 = __SMLAD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - acc1 = __SMLADX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y2, acc3); -#else - - /* Read four samples from smaller buffer */ - a = *pIn2; - b = *(pIn2 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - y1 = __PKHBT(a, b, 16); -#else - y1 = __PKHBT(b, a, 16); -#endif - - a = *(pIn2 + 2); - b = *(pIn2 + 3); -#ifndef ARM_MATH_BIG_ENDIAN - y2 = __PKHBT(a, b, 16); -#else - y2 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLAD(x1, y1, acc0); - - acc2 = __SMLAD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLADX(x3, y1, acc1); - - a = *pScr; - b = *(pScr + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(a, b, 16); -#else - x1 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLAD(x2, y2, acc0); - - acc2 = __SMLAD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - acc1 = __SMLADX(x3, y2, acc1); - - a = *(pScr + 2); - b = *(pScr + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - x2 = __PKHBT(a, b, 16); -#else - x2 = __PKHBT(b, a, 16); -#endif - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y2, acc3); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - pIn2 += 4u; - - pScr += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr++ * *pIn2); - acc1 += (*pScr++ * *pIn2); - acc2 += (*pScr++ * *pIn2); - acc3 += (*pScr++ * *pIn2++); - - pScr -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - *pOut = (__SSAT(acc0 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc1 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc2 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc3 >> 15u, 16)); - pOut += inc; - - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate correlation for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr = pScratch; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - acc0 += (*pScr++ * *pIn2++); - acc0 += (*pScr++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - - *pOut = (q15_t) (__SSAT((acc0 >> 15), 16)); - - pOut += inc; - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch += 1u; - - } -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c deleted file mode 100644 index 31a8c7d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c +++ /dev/null @@ -1,1319 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_fast_q15.c -* -* Description: Fast Q15 Correlation. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - * - * Scaling and Overflow Behavior: - * - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down one of the inputs by 1/min(srcALen, srcBLen) to avoid overflow since a - * maximum of min(srcALen, srcBLen) number of additions is carried internally. - * The 2.30 accumulator is right shifted by 15 bits and then saturated to 1.15 format to yield the final result. - * - * \par - * See arm_correlate_q15() for a slower implementation of this function which uses a 64-bit accumulator to avoid wrap around distortion. - */ - -void arm_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst) -{ -#ifndef UNALIGNED_SUPPORT_DISABLE - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first loop starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] , x[1] * y[srcBLen - 3] */ - sum = __SMLAD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - /* x[3] * y[srcBLen - 1] , x[2] * y[srcBLen - 2] */ - sum = __SMLAD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum = __SMLAD(*px++, *py++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4, to loop unroll the srcBLen loop */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px + 1); - px += 2u; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the first two inputB samples using SIMD: - * y[0] and y[1] */ - c0 = *__SIMD32(py)++; - - /* acc0 += x[0] * y[0] + x[1] * y[1] */ - acc0 = __SMLAD(x0, c0, acc0); - - /* acc1 += x[1] * y[0] + x[2] * y[1] */ - acc1 = __SMLAD(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px + 1); - - /* acc2 += x[2] * y[0] + x[3] * y[1] */ - acc2 = __SMLAD(x2, c0, acc2); - - /* acc3 += x[3] * y[0] + x[4] * y[1] */ - acc3 = __SMLAD(x3, c0, acc3); - - /* Read y[2] and y[3] */ - c0 = *__SIMD32(py)++; - - /* acc0 += x[2] * y[2] + x[3] * y[3] */ - acc0 = __SMLAD(x2, c0, acc0); - - /* acc1 += x[3] * y[2] + x[4] * y[3] */ - acc1 = __SMLAD(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px + 2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px + 3); - px += 4u; - - /* acc2 += x[4] * y[2] + x[5] * y[3] */ - acc2 = __SMLAD(x0, c0, acc2); - - /* acc3 += x[5] * y[2] + x[6] * y[3] */ - acc3 = __SMLAD(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[4] */ - c0 = *py; -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[4], y[5] */ - c0 = *__SIMD32(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px + 1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLAD(x3, c0, acc2); - acc3 = __SMLAD(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[4], y[5] */ - c0 = *__SIMD32(py)++; - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px + 1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLAD(x3, c0, acc2); - acc3 = __SMLAD(x2, c0, acc3); - - c0 = (*py); - /* Read y[6] */ -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px + 2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (acc0 >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q15_t) (acc1 >> 15); - pOut += inc; - - *pOut = (q15_t) (acc2 >> 15); - pOut += inc; - - *pOut = (q15_t) (acc3 >> 15); - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen - srcBLen + 4] * y[3] , sum += x[srcALen - srcBLen + 3] * y[2] */ - sum = __SMLAD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - /* sum += x[srcALen - srcBLen + 2] * y[1] , sum += x[srcALen - srcBLen + 1] * y[0] */ - sum = __SMLAD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLAD(*px++, *py++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - q15_t a, b; - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first loop starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] , x[1] * y[srcBLen - 3] */ - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4, to loop unroll the srcBLen loop */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *(px + 2); - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *(px + 2); - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 2u; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the first two inputB samples using SIMD: - * y[0] and y[1] */ - a = *py; - b = *(py + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[0] * y[0] + x[1] * y[1] */ - acc0 = __SMLAD(x0, c0, acc0); - - /* acc1 += x[1] * y[0] + x[2] * y[1] */ - acc1 = __SMLAD(x1, c0, acc1); - - /* Read x[2], x[3], x[4] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x2 = __PKHBT(a, b, 16); - a = *(px + 2); - x3 = __PKHBT(b, a, 16); - -#else - - x2 = __PKHBT(b, a, 16); - a = *(px + 2); - x3 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc2 += x[2] * y[0] + x[3] * y[1] */ - acc2 = __SMLAD(x2, c0, acc2); - - /* acc3 += x[3] * y[0] + x[4] * y[1] */ - acc3 = __SMLAD(x3, c0, acc3); - - /* Read y[2] and y[3] */ - a = *(py + 2); - b = *(py + 3); - - py += 4u; - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* acc0 += x[2] * y[2] + x[3] * y[3] */ - acc0 = __SMLAD(x2, c0, acc0); - - /* acc1 += x[3] * y[2] + x[4] * y[3] */ - acc1 = __SMLAD(x3, c0, acc1); - - /* Read x[4], x[5], x[6] */ - a = *(px + 2); - b = *(px + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x0 = __PKHBT(a, b, 16); - a = *(px + 4); - x1 = __PKHBT(b, a, 16); - -#else - - x0 = __PKHBT(b, a, 16); - a = *(px + 4); - x1 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 4u; - - /* acc2 += x[4] * y[2] + x[5] * y[3] */ - acc2 = __SMLAD(x0, c0, acc2); - - /* acc3 += x[5] * y[2] + x[6] * y[3] */ - acc3 = __SMLAD(x1, c0, acc3); - - } while(--k); - - /* For the next MAC operations, SIMD is not used - * So, the 16 bit pointer if inputB, py is updated */ - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[4] */ - c0 = *py; -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7] */ - a = *px; - b = *(px + 1); - - px++;; - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLADX(x1, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[4], y[5] */ - a = *py; - b = *(py + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLAD(x3, c0, acc2); - acc3 = __SMLAD(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[4], y[5] */ - a = *py; - b = *(py + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - c0 = __PKHBT(a, b, 16); - -#else - - c0 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - py += 2u; - - /* Read x[7], x[8], x[9] */ - a = *px; - b = *(px + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - a = *(px + 2); - x2 = __PKHBT(b, a, 16); - -#else - - x3 = __PKHBT(b, a, 16); - a = *(px + 2); - x2 = __PKHBT(a, b, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - acc2 = __SMLAD(x3, c0, acc2); - acc3 = __SMLAD(x2, c0, acc3); - - c0 = (*py); - /* Read y[6] */ -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - - /* Read x[10] */ - b = *(px + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - - x3 = __PKHBT(a, b, 16); - -#else - - x3 = __PKHBT(b, a, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLADX(x1, c0, acc0); - acc1 = __SMLAD(x2, c0, acc1); - acc2 = __SMLADX(x2, c0, acc2); - acc3 = __SMLADX(x3, c0, acc3); - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (acc0 >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q15_t) (acc1 >> 15); - pOut += inc; - - *pOut = (q15_t) (acc2 >> 15); - pOut += inc; - - *pOut = (q15_t) (acc3 >> 15); - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q31_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (sum >> 15); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c deleted file mode 100644 index 4857c30..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c +++ /dev/null @@ -1,612 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_fast_q31.c -* -* Description: Fast Q31 Correlation. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * This function is optimized for speed at the expense of fixed-point precision and overflow protection. - * The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. - * These intermediate results are accumulated in a 32-bit register in 2.30 format. - * Finally, the accumulator is saturated and converted to a 1.31 result. - * - * \par - * The fast version has the same overflow behavior as the standard version but provides less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signals must be scaled down. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down one of the inputs by 1/min(srcALen, srcBLen)to avoid overflows since a - * maximum of min(srcALen, srcBLen) number of additions is carried internally. - * - * \par - * See arm_correlate_q31() for a slower implementation of this function which uses 64-bit accumulation to provide higher precision. - */ - -void arm_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst) -{ - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1; /* Intermediate pointers */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q31_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* x[1] * y[srcBLen - 3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* x[2] * y[srcBLen - 2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* x[3] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum << 1; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[0] sample */ - c0 = *(py++); - - /* Read x[3] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[0] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc1 += x[1] * y[0] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc2 += x[2] * y[0] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc3 += x[3] * y[0] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Read y[1] sample */ - c0 = *(py++); - - /* Read x[4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[1] * y[1] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc1 += x[2] * y[1] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc2 += x[3] * y[1] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc3 += x[4] * y[1] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read y[2] sample */ - c0 = *(py++); - - /* Read x[5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[2] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc1 += x[3] * y[2] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc2 += x[4] * y[2] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc3 += x[5] * y[2] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read y[3] sample */ - c0 = *(py++); - - /* Read x[6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[3] * y[3] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x3 * c0)) >> 32); - /* acc1 += x[4] * y[3] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc2 += x[5] * y[3] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc3 += x[6] * y[3] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x2 * c0)) >> 32); - - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[4] sample */ - c0 = *(py++); - - /* Read x[7] sample */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[4] */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - /* acc1 += x[5] * y[4] */ - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - /* acc2 += x[6] * y[4] */ - acc2 = (q31_t) ((((q63_t) acc2 << 32) + ((q63_t) x2 * c0)) >> 32); - /* acc3 += x[7] * y[4] */ - acc3 = (q31_t) ((((q63_t) acc3 << 32) + ((q63_t) x3 * c0)) >> 32); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (acc0 << 1); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q31_t) (acc1 << 1); - pOut += inc; - - *pOut = (q31_t) (acc2 << 1); - pOut += inc; - - *pOut = (q31_t) (acc3 << 1); - pOut += inc; - - /* Increment the pointer pIn1 index, count by 4 */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum << 1; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum << 1; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = ((pIn1 + srcALen) - srcBLen) + 1u; - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen - srcBLen + 4] * y[3] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* sum += x[srcALen - srcBLen + 3] * y[2] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* sum += x[srcALen - srcBLen + 2] * y[1] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - /* sum += x[srcALen - srcBLen + 1] * y[0] */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * px++ * (*py++))) >> 32); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = sum << 1; - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c deleted file mode 100644 index e54fa95..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c +++ /dev/null @@ -1,513 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_opt_q15.c -* -* Description: Correlation of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @return none. - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch buffers should be aligned by 32-bit - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both inputs are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * This approach provides 33 guard bits and there is no risk of overflow. - * The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. - * - * \par - * Refer to arm_correlate_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * - */ - - -void arm_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch) -{ - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q63_t acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *py; /* Intermediate inputB pointer */ - q31_t x1, x2, x3; /* temporary variables for holding input1 and input2 values */ - uint32_t j, blkCnt, outBlockSize; /* loop counter */ - int32_t inc = 1; /* output pointer increment */ - uint32_t tapCnt; - q31_t y1, y2; - q15_t *pScr; /* Intermediate pointers */ - q15_t *pOut = pDst; /* output pointer */ -#ifdef UNALIGNED_SUPPORT_DISABLE - - q15_t a, b; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - pScr = pScratch; - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr += (srcBLen - 1u); - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Copy (srcALen) samples in scratch buffer */ - arm_copy_q15(pIn1, pScr, srcALen); - - /* Update pointers */ - //pIn1 += srcALen; - pScr += srcALen; - -#else - - /* Apply loop unrolling and do 4 Copies simultaneously. */ - j = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(j > 0u) - { - /* copy second buffer in reversal manner */ - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - *pScr++ = *pIn1++; - - /* Decrement the loop counter */ - j--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - j = srcALen % 0x4u; - - while(j > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr++ = *pIn1++; - - /* Decrement the loop counter */ - j--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr, (srcBLen - 1u)); - - /* Update pointer */ - pScr += (srcBLen - 1u); - -#else - -/* Apply loop unrolling and do 4 Copies simultaneously. */ - j = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(j > 0u) - { - /* copy second buffer in reversal manner */ - *pScr++ = 0; - *pScr++ = 0; - *pScr++ = 0; - *pScr++ = 0; - - /* Decrement the loop counter */ - j--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - j = (srcBLen - 1u) % 0x4u; - - while(j > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr++ = 0; - - /* Decrement the loop counter */ - j--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Temporary pointer for scratch2 */ - py = pIn2; - - - /* Actual correlation process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr = pScratch; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read four samples from scratch1 buffer */ - x1 = *__SIMD32(pScr)++; - - /* Read next four samples from scratch1 buffer */ - x2 = *__SIMD32(pScr)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pIn2); - y2 = _SIMD32_OFFSET(pIn2 + 2u); - - acc0 = __SMLALD(x1, y1, acc0); - - acc2 = __SMLALD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLALDX(x3, y1, acc1); - - x1 = _SIMD32_OFFSET(pScr); - - acc0 = __SMLALD(x2, y2, acc0); - - acc2 = __SMLALD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLALDX(x3, y1, acc3); - - acc1 = __SMLALDX(x3, y2, acc1); - - x2 = _SIMD32_OFFSET(pScr + 2u); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLALDX(x3, y2, acc3); - -#else - - /* Read four samples from smaller buffer */ - a = *pIn2; - b = *(pIn2 + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - y1 = __PKHBT(a, b, 16); -#else - y1 = __PKHBT(b, a, 16); -#endif - - a = *(pIn2 + 2); - b = *(pIn2 + 3); -#ifndef ARM_MATH_BIG_ENDIAN - y2 = __PKHBT(a, b, 16); -#else - y2 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLALD(x1, y1, acc0); - - acc2 = __SMLALD(x2, y1, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc1 = __SMLALDX(x3, y1, acc1); - - a = *pScr; - b = *(pScr + 1); - -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(a, b, 16); -#else - x1 = __PKHBT(b, a, 16); -#endif - - acc0 = __SMLALD(x2, y2, acc0); - - acc2 = __SMLALD(x1, y2, acc2); - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLALDX(x3, y1, acc3); - - acc1 = __SMLALDX(x3, y2, acc1); - - a = *(pScr + 2); - b = *(pScr + 3); - -#ifndef ARM_MATH_BIG_ENDIAN - x2 = __PKHBT(a, b, 16); -#else - x2 = __PKHBT(b, a, 16); -#endif - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLALDX(x3, y2, acc3); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - pIn2 += 4u; - - pScr += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr++ * *pIn2); - acc1 += (*pScr++ * *pIn2); - acc2 += (*pScr++ * *pIn2); - acc3 += (*pScr++ * *pIn2++); - - pScr -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - - /* Store the results in the accumulators in the destination buffer. */ - *pOut = (__SSAT(acc0 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc1 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc2 >> 15u, 16)); - pOut += inc; - *pOut = (__SSAT(acc3 >> 15u, 16)); - pOut += inc; - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate correlation for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr = pScratch; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - - acc0 += (*pScr++ * *pIn2++); - acc0 += (*pScr++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr++ * *pIn2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT((acc0 >> 15), 16)); - - pOut += inc; - - /* Initialization of inputB pointer */ - pIn2 = py; - - pScratch += 1u; - - } - - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c deleted file mode 100644 index af5dbb3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c +++ /dev/null @@ -1,464 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_opt_q7.c -* -* Description: Correlation of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return none. - * - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch1 and scratch2 buffers should be aligned by 32-bit - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. - * The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and saturated to 1.7 format. - * - * - */ - - - -void arm_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2) -{ - q7_t *pOut = pDst; /* output pointer */ - q15_t *pScr1 = pScratch1; /* Temporary pointer for scratch */ - q15_t *pScr2 = pScratch2; /* Temporary pointer for scratch */ - q7_t *pIn1; /* inputA pointer */ - q7_t *pIn2; /* inputB pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - uint32_t j, k = 0u, blkCnt; /* loop counter */ - int32_t inc = 1; /* output pointer increment */ - uint32_t outBlockSize; /* loop counter */ - q15_t x4; /* Temporary input variable */ - uint32_t tapCnt; /* loop counter */ - q31_t x1, x2, x3, y1; /* Temporary input variables */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - - /* Copy (srcBLen) samples in scratch buffer */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * pIn2++; - *pScr2++ = x4; - x4 = (q15_t) * pIn2++; - *pScr2++ = x4; - x4 = (q15_t) * pIn2++; - *pScr2++ = x4; - x4 = (q15_t) * pIn2++; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * pIn2++; - *pScr2++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* Fill (srcBLen - 1u) zeros in scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update temporary scratch pointer */ - pScr1 += (srcBLen - 1u); - - /* Copy (srcALen) samples in scratch buffer */ - k = srcALen >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = srcALen % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - x4 = (q15_t) * pIn1++; - *pScr1++ = x4; - - /* Decrement the loop counter */ - k--; - } - -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Fill (srcBLen - 1u) zeros at end of scratch buffer */ - arm_fill_q15(0, pScr1, (srcBLen - 1u)); - - /* Update pointer */ - pScr1 += (srcBLen - 1u); - -#else - -/* Apply loop unrolling and do 4 Copies simultaneously. */ - k = (srcBLen - 1u) >> 2u; - - /* First part of the processing with loop unrolling copies 4 data points at a time. - ** a second loop below copies for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* copy second buffer in reversal manner */ - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, copy remaining samples here. - ** No loop unrolling is used. */ - k = (srcBLen - 1u) % 0x4u; - - while(k > 0u) - { - /* copy second buffer in reversal manner for remaining samples */ - *pScr1++ = 0; - - /* Decrement the loop counter */ - k--; - } - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Temporary pointer for second sequence */ - py = pScratch2; - - /* Initialization of pScr2 pointer */ - pScr2 = pScratch2; - - /* Actual correlation process starts here */ - blkCnt = (srcALen + srcBLen - 1u) >> 2; - - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Read two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* Read next two samples from scratch1 buffer */ - x2 = *__SIMD32(pScr1)++; - - tapCnt = (srcBLen) >> 2u; - - while(tapCnt > 0u) - { - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2); - - /* multiply and accumlate */ - acc0 = __SMLAD(x1, y1, acc0); - acc2 = __SMLAD(x2, y1, acc2); - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - /* multiply and accumlate */ - acc1 = __SMLADX(x3, y1, acc1); - - /* Read next two samples from scratch1 buffer */ - x1 = *__SIMD32(pScr1)++; - - /* pack input data */ -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x1, x2, 0); -#else - x3 = __PKHBT(x2, x1, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - /* Read four samples from smaller buffer */ - y1 = _SIMD32_OFFSET(pScr2 + 2u); - - acc0 = __SMLAD(x2, y1, acc0); - - acc2 = __SMLAD(x1, y1, acc2); - - acc1 = __SMLADX(x3, y1, acc1); - - x2 = *__SIMD32(pScr1)++; - -#ifndef ARM_MATH_BIG_ENDIAN - x3 = __PKHBT(x2, x1, 0); -#else - x3 = __PKHBT(x1, x2, 0); -#endif - - acc3 = __SMLADX(x3, y1, acc3); - - pScr2 += 4u; - - - /* Decrement the loop counter */ - tapCnt--; - } - - - - /* Update scratch pointer for remaining samples of smaller length sequence */ - pScr1 -= 4u; - - - /* apply same above for remaining samples of smaller length sequence */ - tapCnt = (srcBLen) & 3u; - - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2); - acc1 += (*pScr1++ * *pScr2); - acc2 += (*pScr1++ * *pScr2); - acc3 += (*pScr1++ * *pScr2++); - - pScr1 -= 3u; - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(acc0 >> 7u, 8)); - pOut += inc; - *pOut = (q7_t) (__SSAT(acc1 >> 7u, 8)); - pOut += inc; - *pOut = (q7_t) (__SSAT(acc2 >> 7u, 8)); - pOut += inc; - *pOut = (q7_t) (__SSAT(acc3 >> 7u, 8)); - pOut += inc; - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 4u; - - } - - - blkCnt = (srcALen + srcBLen - 1u) & 0x3; - - /* Calculate correlation for remaining samples of Bigger length sequence */ - while(blkCnt > 0) - { - /* Initialze temporary scratch pointer as scratch1 */ - pScr1 = pScratch1; - - /* Clear Accumlators */ - acc0 = 0; - - tapCnt = (srcBLen) >> 1u; - - while(tapCnt > 0u) - { - acc0 += (*pScr1++ * *pScr2++); - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (srcBLen) & 1u; - - /* apply same above for remaining samples of smaller length sequence */ - while(tapCnt > 0u) - { - - /* accumlate the results */ - acc0 += (*pScr1++ * *pScr2++); - - /* Decrement the loop counter */ - tapCnt--; - } - - blkCnt--; - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(acc0 >> 7u, 8)); - - pOut += inc; - - /* Initialization of inputB pointer */ - pScr2 = py; - - pScratch1 += 1u; - - } - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c deleted file mode 100644 index 3dcf69e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c +++ /dev/null @@ -1,719 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_q15.c -* -* Description: Correlation of Q15 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both inputs are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * This approach provides 33 guard bits and there is no risk of overflow. - * The 34.30 result is then truncated to 34.15 format by discarding the low 15 bits and then saturated to 1.15 format. - * - * \par - * Refer to arm_correlate_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - * \par - * Refer the function arm_correlate_opt_q15() for a faster implementation of this function using scratch buffers. - * - */ - -void arm_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst) -{ - -#if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE) - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t *pIn1; /* inputA pointer */ - q15_t *pIn2; /* inputB pointer */ - q15_t *pOut = pDst; /* output pointer */ - q63_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *px; /* Intermediate inputA pointer */ - q15_t *py; /* Intermediate inputB pointer */ - q15_t *pSrc1; /* Intermediate pointers */ - q31_t x0, x1, x2, x3, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first loop starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] , x[1] * y[srcBLen - 3] */ - sum = __SMLALD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - /* x[3] * y[srcBLen - 1] , x[2] * y[srcBLen - 2] */ - sum = __SMLALD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum = __SMLALD(*px++, *py++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT((sum >> 15), 16)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4, to loop unroll the srcBLen loop */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1] samples */ - x0 = *__SIMD32(px); - /* read x[1], x[2] samples */ - x1 = _SIMD32_OFFSET(px + 1); - px += 2u; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read the first two inputB samples using SIMD: - * y[0] and y[1] */ - c0 = *__SIMD32(py)++; - - /* acc0 += x[0] * y[0] + x[1] * y[1] */ - acc0 = __SMLALD(x0, c0, acc0); - - /* acc1 += x[1] * y[0] + x[2] * y[1] */ - acc1 = __SMLALD(x1, c0, acc1); - - /* Read x[2], x[3] */ - x2 = *__SIMD32(px); - - /* Read x[3], x[4] */ - x3 = _SIMD32_OFFSET(px + 1); - - /* acc2 += x[2] * y[0] + x[3] * y[1] */ - acc2 = __SMLALD(x2, c0, acc2); - - /* acc3 += x[3] * y[0] + x[4] * y[1] */ - acc3 = __SMLALD(x3, c0, acc3); - - /* Read y[2] and y[3] */ - c0 = *__SIMD32(py)++; - - /* acc0 += x[2] * y[2] + x[3] * y[3] */ - acc0 = __SMLALD(x2, c0, acc0); - - /* acc1 += x[3] * y[2] + x[4] * y[3] */ - acc1 = __SMLALD(x3, c0, acc1); - - /* Read x[4], x[5] */ - x0 = _SIMD32_OFFSET(px + 2); - - /* Read x[5], x[6] */ - x1 = _SIMD32_OFFSET(px + 3); - - px += 4u; - - /* acc2 += x[4] * y[2] + x[5] * y[3] */ - acc2 = __SMLALD(x0, c0, acc2); - - /* acc3 += x[5] * y[2] + x[6] * y[3] */ - acc3 = __SMLALD(x1, c0, acc3); - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - if(k == 1u) - { - /* Read y[4] */ - c0 = *py; -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; - -#else - - c0 = c0 & 0x0000FFFF; - -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - /* Read x[7] */ - x3 = *__SIMD32(px); - px++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALDX(x1, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - if(k == 2u) - { - /* Read y[4], y[5] */ - c0 = *__SIMD32(py); - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px + 1); - px += 2u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALD(x3, c0, acc2); - acc3 = __SMLALD(x2, c0, acc3); - } - - if(k == 3u) - { - /* Read y[4], y[5] */ - c0 = *__SIMD32(py)++; - - /* Read x[7], x[8] */ - x3 = *__SIMD32(px); - - /* Read x[9] */ - x2 = _SIMD32_OFFSET(px + 1); - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALD(x3, c0, acc2); - acc3 = __SMLALD(x2, c0, acc3); - - c0 = (*py); - - /* Read y[6] */ -#ifdef ARM_MATH_BIG_ENDIAN - - c0 = c0 << 16u; -#else - - c0 = c0 & 0x0000FFFF; -#endif /* #ifdef ARM_MATH_BIG_ENDIAN */ - /* Read x[10] */ - x3 = _SIMD32_OFFSET(px + 2); - px += 3u; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALDX(x1, c0, acc0); - acc1 = __SMLALD(x2, c0, acc1); - acc2 = __SMLALDX(x2, c0, acc2); - acc3 = __SMLALDX(x3, c0, acc3); - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT(acc0 >> 15, 16)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q15_t) (__SSAT(acc1 >> 15, 16)); - pOut += inc; - - *pOut = (q15_t) (__SSAT(acc2 >> 15, 16)); - pOut += inc; - - *pOut = (q15_t) (__SSAT(acc3 >> 15, 16)); - pOut += inc; - - /* Increment the count by 4 as 4 output values are computed */ - count += 4u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q63_t) * px++ * *py++); - sum += ((q63_t) * px++ * *py++); - sum += ((q63_t) * px++ * *py++); - sum += ((q63_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q63_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT(sum >> 15, 16)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment count by 1, as one output value is computed */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q63_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT(sum >> 15, 16)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = (pIn1 + srcALen) - (srcBLen - 1u); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen - srcBLen + 4] * y[3] , sum += x[srcALen - srcBLen + 3] * y[2] */ - sum = __SMLALD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - /* sum += x[srcALen - srcBLen + 2] * y[1] , sum += x[srcALen - srcBLen + 1] * y[0] */ - sum = __SMLALD(*__SIMD32(px)++, *__SIMD32(py)++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum = __SMLALD(*px++, *py++, sum); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q15_t) (__SSAT((sum >> 15), 16)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - q15_t *pIn1 = pSrcA; /* inputA pointer */ - q15_t *pIn2 = pSrcB + (srcBLen - 1u); /* inputB pointer */ - q63_t sum; /* Accumulators */ - uint32_t i = 0u, j; /* loop counters */ - uint32_t inv = 0u; /* Reverse order flag */ - uint32_t tot = 0u; /* Length */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and a varaible, inv is set to 1 */ - /* If lengths are not equal then zero pad has to be done to make the two - * inputs of same length. But to improve the performance, we include zeroes - * in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the - * starting of the output buffer */ - /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the - * ending of the output buffer */ - /* Once the zero padding is done the remaining of the output is calcualted - * using convolution but with the shorter signal time shifted. */ - - /* Calculate the length of the remaining sequence */ - tot = ((srcALen + srcBLen) - 2u); - - if(srcALen > srcBLen) - { - /* Calculating the number of zeros to be padded to the output */ - j = srcALen - srcBLen; - - /* Initialise the pointer after zero padding */ - pDst += j; - } - - else if(srcALen < srcBLen) - { - /* Initialization to inputB pointer */ - pIn1 = pSrcB; - - /* Initialization to the end of inputA pointer */ - pIn2 = pSrcA + (srcALen - 1u); - - /* Initialisation of the pointer after zero padding */ - pDst = pDst + tot; - - /* Swapping the lengths */ - j = srcALen; - srcALen = srcBLen; - srcBLen = j; - - /* Setting the reverse flag */ - inv = 1; - - } - - /* Loop to calculate convolution for output length number of times */ - for (i = 0u; i <= tot; i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q31_t) pIn1[j] * pIn2[-((int32_t) i - j)]); - } - } - /* Store the output in the destination buffer */ - if(inv == 1) - *pDst-- = (q15_t) __SSAT((sum >> 15u), 16u); - else - *pDst++ = (q15_t) __SSAT((sum >> 15u), 16u); - } - -#endif /*#if (defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3)) && !defined(UNALIGNED_SUPPORT_DISABLE) */ - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c deleted file mode 100644 index a72c4a6..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c +++ /dev/null @@ -1,665 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_q31.c -* -* Description: Correlation of Q31 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * There is no saturation on intermediate additions. - * Thus, if the accumulator overflows it wraps around and distorts the result. - * The input signals should be scaled down to avoid intermediate overflows. - * Scale down one of the inputs by 1/min(srcALen, srcBLen)to avoid overflows since a - * maximum of min(srcALen, srcBLen) number of additions is carried internally. - * The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. - * - * \par - * See arm_correlate_fast_q31() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - */ - -void arm_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst) -{ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t *pIn1; /* inputA pointer */ - q31_t *pIn2; /* inputB pointer */ - q31_t *pOut = pDst; /* output pointer */ - q31_t *px; /* Intermediate inputA pointer */ - q31_t *py; /* Intermediate inputB pointer */ - q31_t *pSrc1; /* Intermediate pointers */ - q63_t sum, acc0, acc1, acc2; /* Accumulators */ - q31_t x0, x1, x2, c0; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; /* Destination address modifier */ - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] * y[srcBLen - 4] */ - sum += (q63_t) * px++ * (*py++); - /* x[1] * y[srcBLen - 3] */ - sum += (q63_t) * px++ * (*py++); - /* x[2] * y[srcBLen - 2] */ - sum += (q63_t) * px++ * (*py++); - /* x[3] * y[srcBLen - 1] */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (sum >> 31); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll by 3 */ - blkCnt = blockSize2 / 3; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - - /* read x[0], x[1] samples */ - x0 = *(px++); - x1 = *(px++); - - /* Apply loop unrolling and compute 3 MACs simultaneously. */ - k = srcBLen / 3; - - /* First part of the processing with loop unrolling. Compute 3 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 2 samples. */ - do - { - /* Read y[0] sample */ - c0 = *(py); - - /* Read x[2] sample */ - x2 = *(px); - - /* Perform the multiply-accumulate */ - /* acc0 += x[0] * y[0] */ - acc0 += ((q63_t) x0 * c0); - /* acc1 += x[1] * y[0] */ - acc1 += ((q63_t) x1 * c0); - /* acc2 += x[2] * y[0] */ - acc2 += ((q63_t) x2 * c0); - - /* Read y[1] sample */ - c0 = *(py + 1u); - - /* Read x[3] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulates */ - /* acc0 += x[1] * y[1] */ - acc0 += ((q63_t) x1 * c0); - /* acc1 += x[2] * y[1] */ - acc1 += ((q63_t) x2 * c0); - /* acc2 += x[3] * y[1] */ - acc2 += ((q63_t) x0 * c0); - - /* Read y[2] sample */ - c0 = *(py + 2u); - - /* Read x[4] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - /* acc0 += x[2] * y[2] */ - acc0 += ((q63_t) x2 * c0); - /* acc1 += x[3] * y[2] */ - acc1 += ((q63_t) x0 * c0); - /* acc2 += x[4] * y[2] */ - acc2 += ((q63_t) x1 * c0); - - /* update scratch pointers */ - px += 3u; - py += 3u; - - } while(--k); - - /* If the srcBLen is not a multiple of 3, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen - (3 * (srcBLen / 3)); - - while(k > 0u) - { - /* Read y[4] sample */ - c0 = *(py++); - - /* Read x[7] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[4] */ - acc0 += ((q63_t) x0 * c0); - /* acc1 += x[5] * y[4] */ - acc1 += ((q63_t) x1 * c0); - /* acc2 += x[6] * y[4] */ - acc2 += ((q63_t) x2 * c0); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (acc0 >> 31); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q31_t) (acc1 >> 31); - pOut += inc; - - *pOut = (q31_t) (acc2 >> 31); - pOut += inc; - - /* Increment the pointer pIn1 index, count by 3 */ - count += 3u; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 3, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 - 3 * (blockSize2 / 3); - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) * px++ * (*py++); - sum += (q63_t) * px++ * (*py++); - sum += (q63_t) * px++ * (*py++); - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (sum >> 31); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (sum >> 31); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = pIn1 + (srcALen - (srcBLen - 1u)); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* sum += x[srcALen - srcBLen + 4] * y[3] */ - sum += (q63_t) * px++ * (*py++); - /* sum += x[srcALen - srcBLen + 3] * y[2] */ - sum += (q63_t) * px++ * (*py++); - /* sum += x[srcALen - srcBLen + 2] * y[1] */ - sum += (q63_t) * px++ * (*py++); - /* sum += x[srcALen - srcBLen + 1] * y[0] */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += (q63_t) * px++ * (*py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q31_t) (sum >> 31); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t *pIn1 = pSrcA; /* inputA pointer */ - q31_t *pIn2 = pSrcB + (srcBLen - 1u); /* inputB pointer */ - q63_t sum; /* Accumulators */ - uint32_t i = 0u, j; /* loop counters */ - uint32_t inv = 0u; /* Reverse order flag */ - uint32_t tot = 0u; /* Length */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and a varaible, inv is set to 1 */ - /* If lengths are not equal then zero pad has to be done to make the two - * inputs of same length. But to improve the performance, we include zeroes - * in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the - * starting of the output buffer */ - /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the - * ending of the output buffer */ - /* Once the zero padding is done the remaining of the output is calcualted - * using correlation but with the shorter signal time shifted. */ - - /* Calculate the length of the remaining sequence */ - tot = ((srcALen + srcBLen) - 2u); - - if(srcALen > srcBLen) - { - /* Calculating the number of zeros to be padded to the output */ - j = srcALen - srcBLen; - - /* Initialise the pointer after zero padding */ - pDst += j; - } - - else if(srcALen < srcBLen) - { - /* Initialization to inputB pointer */ - pIn1 = pSrcB; - - /* Initialization to the end of inputA pointer */ - pIn2 = pSrcA + (srcALen - 1u); - - /* Initialisation of the pointer after zero padding */ - pDst = pDst + tot; - - /* Swapping the lengths */ - j = srcALen; - srcALen = srcBLen; - srcBLen = j; - - /* Setting the reverse flag */ - inv = 1; - - } - - /* Loop to calculate correlation for output length number of times */ - for (i = 0u; i <= tot; i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to correlation equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q63_t) pIn1[j] * pIn2[-((int32_t) i - j)]); - } - } - /* Store the output in the destination buffer */ - if(inv == 1) - *pDst-- = (q31_t) (sum >> 31u); - else - *pDst++ = (q31_t) (sum >> 31u); - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c deleted file mode 100644 index 3ca89e5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c +++ /dev/null @@ -1,790 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_correlate_q7.c -* -* Description: Correlation of Q7 sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup Corr - * @{ - */ - -/** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both the inputs are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * This approach provides 17 guard bits and there is no risk of overflow as long as max(srcALen, srcBLen)<131072. - * The 18.14 result is then truncated to 18.7 format by discarding the low 7 bits and saturated to 1.7 format. - * - * \par - * Refer the function arm_correlate_opt_q7() for a faster implementation of this function. - * - */ - -void arm_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t *pIn1; /* inputA pointer */ - q7_t *pIn2; /* inputB pointer */ - q7_t *pOut = pDst; /* output pointer */ - q7_t *px; /* Intermediate inputA pointer */ - q7_t *py; /* Intermediate inputB pointer */ - q7_t *pSrc1; /* Intermediate pointers */ - q31_t sum, acc0, acc1, acc2, acc3; /* Accumulators */ - q31_t input1, input2; /* temporary variables */ - q15_t in1, in2; /* temporary variables */ - q7_t x0, x1, x2, x3, c0, c1; /* temporary variables for holding input and coefficient values */ - uint32_t j, k = 0u, count, blkCnt, outBlockSize, blockSize1, blockSize2, blockSize3; /* loop counter */ - int32_t inc = 1; - - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and the destination pointer modifier, inc is set to -1 */ - /* If srcALen > srcBLen, zero pad has to be done to srcB to make the two inputs of same length */ - /* But to improve the performance, - * we include zeroes in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, - * (srcALen - srcBLen) zeroes has to included in the starting of the output buffer */ - /* If srcALen < srcBLen, - * (srcALen - srcBLen) zeroes has to included in the ending of the output buffer */ - if(srcALen >= srcBLen) - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcA); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcB); - - /* Number of output samples is calculated */ - outBlockSize = (2u * srcALen) - 1u; - - /* When srcALen > srcBLen, zero padding is done to srcB - * to make their lengths equal. - * Instead, (outBlockSize - (srcALen + srcBLen - 1)) - * number of output samples are made zero */ - j = outBlockSize - (srcALen + (srcBLen - 1u)); - - /* Updating the pointer position to non zero value */ - pOut += j; - - } - else - { - /* Initialization of inputA pointer */ - pIn1 = (pSrcB); - - /* Initialization of inputB pointer */ - pIn2 = (pSrcA); - - /* srcBLen is always considered as shorter or equal to srcALen */ - j = srcBLen; - srcBLen = srcALen; - srcALen = j; - - /* CORR(x, y) = Reverse order(CORR(y, x)) */ - /* Hence set the destination pointer to point to the last output sample */ - pOut = pDst + ((srcALen + srcBLen) - 2u); - - /* Destination address modifier is set to -1 */ - inc = -1; - - } - - /* The function is internally - * divided into three parts according to the number of multiplications that has to be - * taken place between inputA samples and inputB samples. In the first part of the - * algorithm, the multiplications increase by one for every iteration. - * In the second part of the algorithm, srcBLen number of multiplications are done. - * In the third part of the algorithm, the multiplications decrease by one - * for every iteration.*/ - /* The algorithm is implemented in three stages. - * The loop counters of each stage is initiated here. */ - blockSize1 = srcBLen - 1u; - blockSize2 = srcALen - (srcBLen - 1u); - blockSize3 = blockSize1; - - /* -------------------------- - * Initializations of stage1 - * -------------------------*/ - - /* sum = x[0] * y[srcBlen - 1] - * sum = x[0] * y[srcBlen - 2] + x[1] * y[srcBlen - 1] - * .... - * sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen - 1] * y[srcBLen - 1] - */ - - /* In this stage the MAC operations are increased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = 1u; - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - pSrc1 = pIn2 + (srcBLen - 1u); - py = pSrc1; - - /* ------------------------ - * Stage1 process - * ----------------------*/ - - /* The first stage starts here */ - while(blockSize1 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[0] , x[1] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 4] , y[srcBLen - 3] */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* x[0] * y[srcBLen - 4] */ - /* x[1] * y[srcBLen - 3] */ - sum = __SMLAD(input1, input2, sum); - - /* x[2] , x[3] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[srcBLen - 2] , y[srcBLen - 1] */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* x[2] * y[srcBLen - 2] */ - /* x[3] * y[srcBLen - 1] */ - sum = __SMLAD(input1, input2, sum); - - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - /* x[0] * y[srcBLen - 1] */ - sum += (q31_t) ((q15_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(sum >> 7, 8)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - py = pSrc1 - count; - px = pIn1; - - /* Increment the MAC count */ - count++; - - /* Decrement the loop counter */ - blockSize1--; - } - - /* -------------------------- - * Initializations of stage2 - * ------------------------*/ - - /* sum = x[0] * y[0] + x[1] * y[1] +...+ x[srcBLen-1] * y[srcBLen-1] - * sum = x[1] * y[0] + x[2] * y[1] +...+ x[srcBLen] * y[srcBLen-1] - * .... - * sum = x[srcALen-srcBLen-2] * y[0] + x[srcALen-srcBLen-1] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - */ - - /* Working pointer of inputA */ - px = pIn1; - - /* Working pointer of inputB */ - py = pIn2; - - /* count is index by which the pointer pIn1 to be incremented */ - count = 0u; - - /* ------------------- - * Stage2 process - * ------------------*/ - - /* Stage2 depends on srcBLen as in this stage srcBLen number of MACS are performed. - * So, to loop unroll over blockSize2, - * srcBLen should be greater than or equal to 4 */ - if(srcBLen >= 4u) - { - /* Loop unroll over blockSize2, by 4 */ - blkCnt = blockSize2 >> 2u; - - while(blkCnt > 0u) - { - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* read x[0], x[1], x[2] samples */ - x0 = *px++; - x1 = *px++; - x2 = *px++; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - do - { - /* Read y[0] sample */ - c0 = *py++; - /* Read y[1] sample */ - c1 = *py++; - - /* Read x[3] sample */ - x3 = *px++; - - /* x[0] and x[1] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[0] and y[1] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc0 += x[0] * y[0] + x[1] * y[1] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[1] and x[2] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc1 += x[1] * y[0] + x[2] * y[1] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc2 += x[2] * y[0] + x[3] * y[1] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[4] sample */ - x0 = *(px++); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc3 += x[3] * y[0] + x[4] * y[1] */ - acc3 = __SMLAD(input1, input2, acc3); - - /* Read y[2] sample */ - c0 = *py++; - /* Read y[3] sample */ - c1 = *py++; - - /* Read x[5] sample */ - x1 = *px++; - - /* x[2] and x[3] are packed */ - in1 = (q15_t) x2; - in2 = (q15_t) x3; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[2] and y[3] are packed */ - in1 = (q15_t) c0; - in2 = (q15_t) c1; - - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc0 += x[2] * y[2] + x[3] * y[3] */ - acc0 = __SMLAD(input1, input2, acc0); - - /* x[3] and x[4] are packed */ - in1 = (q15_t) x3; - in2 = (q15_t) x0; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc1 += x[3] * y[2] + x[4] * y[3] */ - acc1 = __SMLAD(input1, input2, acc1); - - /* x[4] and x[5] are packed */ - in1 = (q15_t) x0; - in2 = (q15_t) x1; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc2 += x[4] * y[2] + x[5] * y[3] */ - acc2 = __SMLAD(input1, input2, acc2); - - /* Read x[6] sample */ - x2 = *px++; - - /* x[5] and x[6] are packed */ - in1 = (q15_t) x1; - in2 = (q15_t) x2; - - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* acc3 += x[5] * y[2] + x[6] * y[3] */ - acc3 = __SMLAD(input1, input2, acc3); - - } while(--k); - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Read y[4] sample */ - c0 = *py++; - - /* Read x[7] sample */ - x3 = *px++; - - /* Perform the multiply-accumulates */ - /* acc0 += x[4] * y[4] */ - acc0 += ((q15_t) x0 * c0); - /* acc1 += x[5] * y[4] */ - acc1 += ((q15_t) x1 * c0); - /* acc2 += x[6] * y[4] */ - acc2 += ((q15_t) x2 * c0); - /* acc3 += x[7] * y[4] */ - acc3 += ((q15_t) x3 * c0); - - /* Reuse the present samples for the next MAC */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(acc0 >> 7, 8)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - *pOut = (q7_t) (__SSAT(acc1 >> 7, 8)); - pOut += inc; - - *pOut = (q7_t) (__SSAT(acc2 >> 7, 8)); - pOut += inc; - - *pOut = (q7_t) (__SSAT(acc3 >> 7, 8)); - pOut += inc; - - count += 4u; - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize2 is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize2 % 0x4u; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = srcBLen >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Reading two inputs of SrcA buffer and packing */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Reading two inputs of SrcB buffer and packing */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* Perform the multiply-accumulates */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the srcBLen is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = srcBLen % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q15_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(sum >> 7, 8)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the pointer pIn1 index, count by 1 */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - /* Decrement the loop counter */ - blkCnt--; - } - } - else - { - /* If the srcBLen is not a multiple of 4, - * the blockSize2 loop cannot be unrolled by 4 */ - blkCnt = blockSize2; - - while(blkCnt > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Loop over srcBLen */ - k = srcBLen; - - while(k > 0u) - { - /* Perform the multiply-accumulate */ - sum += ((q15_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(sum >> 7, 8)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Increment the MAC count */ - count++; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = pIn1 + count; - py = pIn2; - - - /* Decrement the loop counter */ - blkCnt--; - } - } - - /* -------------------------- - * Initializations of stage3 - * -------------------------*/ - - /* sum += x[srcALen-srcBLen+1] * y[0] + x[srcALen-srcBLen+2] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * sum += x[srcALen-srcBLen+2] * y[0] + x[srcALen-srcBLen+3] * y[1] +...+ x[srcALen-1] * y[srcBLen-1] - * .... - * sum += x[srcALen-2] * y[0] + x[srcALen-1] * y[1] - * sum += x[srcALen-1] * y[0] - */ - - /* In this stage the MAC operations are decreased by 1 for every iteration. - The count variable holds the number of MAC operations performed */ - count = srcBLen - 1u; - - /* Working pointer of inputA */ - pSrc1 = pIn1 + (srcALen - (srcBLen - 1u)); - px = pSrc1; - - /* Working pointer of inputB */ - py = pIn2; - - /* ------------------- - * Stage3 process - * ------------------*/ - - while(blockSize3 > 0u) - { - /* Accumulator is made zero for every iteration */ - sum = 0; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - k = count >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 MACs at a time. - ** a second loop below computes MACs for the remaining 1 to 3 samples. */ - while(k > 0u) - { - /* x[srcALen - srcBLen + 1] , x[srcALen - srcBLen + 2] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[0] , y[1] */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* sum += x[srcALen - srcBLen + 1] * y[0] */ - /* sum += x[srcALen - srcBLen + 2] * y[1] */ - sum = __SMLAD(input1, input2, sum); - - /* x[srcALen - srcBLen + 3] , x[srcALen - srcBLen + 4] */ - in1 = (q15_t) * px++; - in2 = (q15_t) * px++; - input1 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* y[2] , y[3] */ - in1 = (q15_t) * py++; - in2 = (q15_t) * py++; - input2 = ((q31_t) in1 & 0x0000FFFF) | ((q31_t) in2 << 16); - - /* sum += x[srcALen - srcBLen + 3] * y[2] */ - /* sum += x[srcALen - srcBLen + 4] * y[3] */ - sum = __SMLAD(input1, input2, sum); - - /* Decrement the loop counter */ - k--; - } - - /* If the count is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - k = count % 0x4u; - - while(k > 0u) - { - /* Perform the multiply-accumulates */ - sum += ((q15_t) * px++ * *py++); - - /* Decrement the loop counter */ - k--; - } - - /* Store the result in the accumulator in the destination buffer. */ - *pOut = (q7_t) (__SSAT(sum >> 7, 8)); - /* Destination pointer is updated according to the address modifier, inc */ - pOut += inc; - - /* Update the inputA and inputB pointers for next MAC calculation */ - px = ++pSrc1; - py = pIn2; - - /* Decrement the MAC count */ - count--; - - /* Decrement the loop counter */ - blockSize3--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - q7_t *pIn1 = pSrcA; /* inputA pointer */ - q7_t *pIn2 = pSrcB + (srcBLen - 1u); /* inputB pointer */ - q31_t sum; /* Accumulator */ - uint32_t i = 0u, j; /* loop counters */ - uint32_t inv = 0u; /* Reverse order flag */ - uint32_t tot = 0u; /* Length */ - - /* The algorithm implementation is based on the lengths of the inputs. */ - /* srcB is always made to slide across srcA. */ - /* So srcBLen is always considered as shorter or equal to srcALen */ - /* But CORR(x, y) is reverse of CORR(y, x) */ - /* So, when srcBLen > srcALen, output pointer is made to point to the end of the output buffer */ - /* and a varaible, inv is set to 1 */ - /* If lengths are not equal then zero pad has to be done to make the two - * inputs of same length. But to improve the performance, we include zeroes - * in the output instead of zero padding either of the the inputs*/ - /* If srcALen > srcBLen, (srcALen - srcBLen) zeroes has to included in the - * starting of the output buffer */ - /* If srcALen < srcBLen, (srcALen - srcBLen) zeroes has to included in the - * ending of the output buffer */ - /* Once the zero padding is done the remaining of the output is calcualted - * using convolution but with the shorter signal time shifted. */ - - /* Calculate the length of the remaining sequence */ - tot = ((srcALen + srcBLen) - 2u); - - if(srcALen > srcBLen) - { - /* Calculating the number of zeros to be padded to the output */ - j = srcALen - srcBLen; - - /* Initialise the pointer after zero padding */ - pDst += j; - } - - else if(srcALen < srcBLen) - { - /* Initialization to inputB pointer */ - pIn1 = pSrcB; - - /* Initialization to the end of inputA pointer */ - pIn2 = pSrcA + (srcALen - 1u); - - /* Initialisation of the pointer after zero padding */ - pDst = pDst + tot; - - /* Swapping the lengths */ - j = srcALen; - srcALen = srcBLen; - srcBLen = j; - - /* Setting the reverse flag */ - inv = 1; - - } - - /* Loop to calculate convolution for output length number of times */ - for (i = 0u; i <= tot; i++) - { - /* Initialize sum with zero to carry on MAC operations */ - sum = 0; - - /* Loop to perform MAC operations according to convolution equation */ - for (j = 0u; j <= i; j++) - { - /* Check the array limitations */ - if((((i - j) < srcBLen) && (j < srcALen))) - { - /* z[i] += x[i-j] * y[j] */ - sum += ((q15_t) pIn1[j] * pIn2[-((int32_t) i - j)]); - } - } - /* Store the output in the destination buffer */ - if(inv == 1) - *pDst-- = (q7_t) __SSAT((sum >> 7u), 8u); - else - *pDst++ = (q7_t) __SSAT((sum >> 7u), 8u); - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of Corr group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c deleted file mode 100644 index 5fe9fd5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c +++ /dev/null @@ -1,524 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_f32.c -* -* Description: FIR decimation for floating-point sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup FIR_decimate Finite Impulse Response (FIR) Decimator - * - * These functions combine an FIR filter together with a decimator. - * They are used in multirate systems for reducing the sample rate of a signal without introducing aliasing distortion. - * Conceptually, the functions are equivalent to the block diagram below: - * \image html FIRDecimator.gif "Components included in the FIR Decimator functions" - * When decimating by a factor of M, the signal should be prefiltered by a lowpass filter with a normalized - * cutoff frequency of 1/M in order to prevent aliasing distortion. - * The user of the function is responsible for providing the filter coefficients. - * - * The FIR decimator functions provided in the CMSIS DSP Library combine the FIR filter and the decimator in an efficient manner. - * Instead of calculating all of the FIR filter outputs and discarding M-1 out of every M, only the - * samples output by the decimator are computed. - * The functions operate on blocks of input and output data. - * pSrc points to an array of blockSize input values and - * pDst points to an array of blockSize/M output values. - * In order to have an integer number of output samples blockSize - * must always be a multiple of the decimation factor M. - * - * The library provides separate functions for Q15, Q31 and floating-point data types. - * - * \par Algorithm: - * The FIR portion of the algorithm uses the standard form filter: - *
    
- *    y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]    
- * 
- * where, b[n] are the filter coefficients. - * \par - * The pCoeffs points to a coefficient array of size numTaps. - * Coefficients are stored in time reversed order. - * \par - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to a state array of size numTaps + blockSize - 1. - * Samples in the state buffer are stored in the order: - * \par - *
    
- *    {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}    
- * 
- * The state variables are updated after each block of data is processed, the coefficients are untouched. - * - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable array should be allocated separately. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * - Checks to make sure that the size of the input is a multiple of the decimation factor. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numTaps, pCoeffs, M (decimation factor), pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * The code below statically initializes each of the 3 different data type filter instance structures - *
    
- *arm_fir_decimate_instance_f32 S = {M, numTaps, pCoeffs, pState};    
- *arm_fir_decimate_instance_q31 S = {M, numTaps, pCoeffs, pState};    
- *arm_fir_decimate_instance_q15 S = {M, numTaps, pCoeffs, pState};    
- * 
- * where M is the decimation factor; numTaps is the number of filter coefficients in the filter; - * pCoeffs is the address of the coefficient buffer; - * pState is the address of the state buffer. - * Be sure to set the values in the state buffer to zeros when doing static initialization. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the FIR decimate filter functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - - /** - * @brief Processing function for the floating-point FIR decimator. - * @param[in] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - -void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - float32_t sum0; /* Accumulator */ - float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - -#ifndef ARM_MATH_CM0_FAMILY - - uint32_t blkCntN4; - float32_t *px0, *px1, *px2, *px3; - float32_t acc0, acc1, acc2, acc3; - float32_t x1, x2, x3; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize / 4; - blkCntN4 = outBlockSize - (4 * blkCnt); - - while(blkCnt > 0u) - { - /* Copy 4 * decimation factor number of new input samples into the state buffer */ - i = 4 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - - /* Initialize state pointer for all the samples */ - px0 = pState; - px1 = pState + S->M; - px2 = pState + 2 * S->M; - px3 = pState + 3 * S->M; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-1] sample for acc0 */ - x0 = *(px0++); - /* Read x[n-numTaps-1] sample for acc1 */ - x1 = *(px1++); - /* Read x[n-numTaps-1] sample for acc2 */ - x2 = *(px2++); - /* Read x[n-numTaps-1] sample for acc3 */ - x3 = *(px3++); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-2] sample for acc0, acc1, acc2, acc3 */ - x0 = *(px0++); - x1 = *(px1++); - x2 = *(px2++); - x3 = *(px3++); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample acc0, acc1, acc2, acc3 */ - x0 = *(px0++); - x1 = *(px1++); - x2 = *(px2++); - x3 = *(px3++); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample acc0, acc1, acc2, acc3 */ - x0 = *(px0++); - x1 = *(px1++); - x2 = *(px2++); - x3 = *(px3++); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch state variables for acc0, acc1, acc2, acc3 */ - x0 = *(px0++); - x1 = *(px1++); - x2 = *(px2++); - x3 = *(px3++); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + 4 * S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = acc0; - *pDst++ = acc1; - *pDst++ = acc2; - *pDst++ = acc3; - - /* Decrement the loop counter */ - blkCnt--; - } - - while(blkCntN4 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - sum0 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-1] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-2] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = sum0; - - /* Decrement the loop counter */ - blkCntN4--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize; - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - sum0 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = sum0; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Copy numTaps number of values */ - i = (numTaps - 1u); - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c deleted file mode 100644 index 3c56978..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c +++ /dev/null @@ -1,598 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_fast_q15.c -* -* Description: Fast Q15 FIR Decimator. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, state buffers should be aligned by 32-bit - * - * Scaling and Overflow Behavior: - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around and distorts the result. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits (log2 is read as log to the base 2). - * The 2.30 accumulator is then truncated to 2.15 format and saturated to yield the 1.15 result. - * - * \par - * Refer to the function arm_fir_decimate_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. - * Both the slow and the fast versions use the same instance structure. - * Use the function arm_fir_decimate_init_q15() to initialize the filter structure. - */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - -void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer coefficient buffer */ - q31_t x0, x1, c0, c1; /* Temporary variables to hold state and coefficient values */ - q31_t sum0; /* Accumulators */ - q31_t acc0, acc1; - q15_t *px0, *px1; - uint32_t blkCntN3; - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize / 2; - blkCntN3 = outBlockSize - (2 * blkCnt); - - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = 2 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - px0 = pState; - - px1 = pState + S->M; - - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] and b[numTaps-2] coefficients */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ - x0 = *__SIMD32(px0)++; - - x1 = *__SIMD32(px1)++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLAD(x0, c0, acc0); - - acc1 = __SMLAD(x1, c0, acc1); - - /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ - x0 = *__SIMD32(px0)++; - - x1 = *__SIMD32(px1)++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLAD(x0, c0, acc0); - - acc1 = __SMLAD(x1, c0, acc1); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px0++; - - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLAD(x0, c0, acc0); - acc1 = __SMLAD(x1, c0, acc1); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M * 2; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - - - - while(blkCntN3 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /*Set sum to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] and b[numTaps-2] coefficients */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ - x0 = *__SIMD32(px)++; - - /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ - c1 = *__SIMD32(pb)++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLAD(x0, c0, sum0); - - /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ - x0 = *__SIMD32(px)++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLAD(x0, c1, sum0); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLAD(x0, c0, sum0); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - /* Decrement the loop counter */ - blkCntN3--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - -#else - - -void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer coefficient buffer */ - q15_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ - q31_t sum0; /* Accumulators */ - q31_t acc0, acc1; - q15_t *px0, *px1; - uint32_t blkCntN3; - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize / 2; - blkCntN3 = outBlockSize - (2 * blkCnt); - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = 2 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - px0 = pState; - - px1 = pState + S->M; - - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-1] for sample 0 and for sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-2] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-3] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-3] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-4] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M * 2; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); - - - /* Decrement the loop counter */ - blkCnt--; - } - - while(blkCntN3 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /*Set sum to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-1] and sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-2] and sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-3] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-3] sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-4] sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - /* Decrement the loop counter */ - blkCntN3--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c deleted file mode 100644 index 8eb2435..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c +++ /dev/null @@ -1,351 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_fast_q31.c -* -* Description: Fast Q31 FIR Decimator. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - * - * Scaling and Overflow Behavior: - * - * \par - * This function is optimized for speed at the expense of fixed-point precision and overflow protection. - * The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. - * These intermediate results are added to a 2.30 accumulator. - * Finally, the accumulator is saturated and converted to a 1.31 result. - * The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits (where log2 is read as log to the base 2). - * - * \par - * Refer to the function arm_fir_decimate_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. - * Both the slow and the fast versions use the same instance structure. - * Use the function arm_fir_decimate_init_q31() to initialize the filter structure. - */ - -void arm_fir_decimate_fast_q31( - arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ - q31_t *px; /* Temporary pointers for state buffer */ - q31_t *pb; /* Temporary pointers for coefficient buffer */ - q31_t sum0; /* Accumulator */ - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - uint32_t blkCntN2; - q31_t x1; - q31_t acc0, acc1; - q31_t *px0, *px1; - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - - blkCnt = outBlockSize / 2; - blkCntN2 = outBlockSize - (2 * blkCnt); - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = 2 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - px0 = pState; - px1 = pState + S->M; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb); - - /* Read x[n-numTaps-1] for sample 0 sample 1 */ - x0 = *(px0); - x1 = *(px1); - - /* Perform the multiply-accumulate */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb + 1u); - - /* Read x[n-numTaps-2] for sample 0 sample 1 */ - x0 = *(px0 + 1u); - x1 = *(px1 + 1u); - - /* Perform the multiply-accumulate */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb + 2u); - - /* Read x[n-numTaps-3] for sample 0 sample 1 */ - x0 = *(px0 + 2u); - x1 = *(px1 + 2u); - pb += 4u; - - /* Perform the multiply-accumulate */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb - 1u); - - /* Read x[n-numTaps-4] for sample 0 sample 1 */ - x0 = *(px0 + 3u); - x1 = *(px1 + 3u); - - - /* Perform the multiply-accumulate */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* update state pointers */ - px0 += 4u; - px1 += 4u; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x0 = *(px0++); - x1 = *(px1++); - - /* Perform the multiply-accumulate */ - acc0 = (q31_t) ((((q63_t) acc0 << 32) + ((q63_t) x0 * c0)) >> 32); - acc1 = (q31_t) ((((q63_t) acc1 << 32) + ((q63_t) x1 * c0)) >> 32); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M * 2; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (acc0 << 1); - *pDst++ = (q31_t) (acc1 << 1); - - /* Decrement the loop counter */ - blkCnt--; - } - - while(blkCntN2 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-1] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 = (q31_t) ((((q63_t) sum0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-2] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 = (q31_t) ((((q63_t) sum0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 = (q31_t) ((((q63_t) sum0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 = (q31_t) ((((q63_t) sum0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 = (q31_t) ((((q63_t) sum0 << 32) + ((q63_t) x0 * c0)) >> 32); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (sum0 << 1); - - /* Decrement the loop counter */ - blkCntN2--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c deleted file mode 100644 index 5ce468a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c +++ /dev/null @@ -1,117 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_init_f32.c -* -* Description: Floating-point FIR Decimator initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Initialization function for the floating-point FIR decimator. - * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples passed to arm_fir_decimate_f32(). - * M is the decimation factor. - */ - -arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize) -{ - arm_status status; - - /* The size of the input block must be a multiple of the decimation factor */ - if((blockSize % M) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Decimation Factor */ - S->M = M; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c deleted file mode 100644 index dc31d77..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c +++ /dev/null @@ -1,119 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_init_q15.c -* -* Description: Initialization function for the Q15 FIR Decimator. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples - * to the call arm_fir_decimate_q15(). - * M is the decimation factor. - */ - -arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize) -{ - - arm_status status; - - /* The size of the input block must be a multiple of the decimation factor */ - if((blockSize % M) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear the state buffer. The size of buffer is always (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Decimation factor */ - S->M = M; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c deleted file mode 100644 index 03985f3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c +++ /dev/null @@ -1,117 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_init_q31.c -* -* Description: Initialization function for Q31 FIR Decimation filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 words where blockSize is the number of input samples passed to arm_fir_decimate_q31(). - * M is the decimation factor. - */ - -arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize) -{ - arm_status status; - - /* The size of the input block must be a multiple of the decimation factor */ - if((blockSize % M) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1)) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Decimation factor */ - S->M = M; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c deleted file mode 100644 index 4a09fe8..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c +++ /dev/null @@ -1,696 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_q15.c -* -* Description: Q15 FIR Decimator. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the location where the output result is written. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - * - * \par - * Refer to the function arm_fir_decimate_fast_q15() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - */ - -#ifndef ARM_MATH_CM0_FAMILY - -#ifndef UNALIGNED_SUPPORT_DISABLE - -void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer coefficient buffer */ - q31_t x0, x1, c0, c1; /* Temporary variables to hold state and coefficient values */ - q63_t sum0; /* Accumulators */ - q63_t acc0, acc1; - q15_t *px0, *px1; - uint32_t blkCntN3; - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize / 2; - blkCntN3 = outBlockSize - (2 * blkCnt); - - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = 2 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - px0 = pState; - - px1 = pState + S->M; - - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] and b[numTaps-2] coefficients */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ - x0 = *__SIMD32(px0)++; - - x1 = *__SIMD32(px1)++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLALD(x0, c0, acc0); - - acc1 = __SMLALD(x1, c0, acc1); - - /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ - x0 = *__SIMD32(px0)++; - - x1 = *__SIMD32(px1)++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLALD(x0, c0, acc0); - - acc1 = __SMLALD(x1, c0, acc1); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px0++; - - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 = __SMLALD(x0, c0, acc0); - acc1 = __SMLALD(x1, c0, acc1); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M * 2; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - - - - while(blkCntN3 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /*Set sum to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] and b[numTaps-2] coefficients */ - c0 = *__SIMD32(pb)++; - - /* Read x[n-numTaps-1] and x[n-numTaps-2]sample */ - x0 = *__SIMD32(px)++; - - /* Read the b[numTaps-3] and b[numTaps-4] coefficient */ - c1 = *__SIMD32(pb)++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLALD(x0, c0, sum0); - - /* Read x[n-numTaps-2] and x[n-numTaps-3] sample */ - x0 = *__SIMD32(px)++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLALD(x0, c1, sum0); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 = __SMLALD(x0, c0, sum0); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - /* Decrement the loop counter */ - blkCntN3--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - -#else - - -void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer coefficient buffer */ - q15_t x0, x1, c0; /* Temporary variables to hold state and coefficient values */ - q63_t sum0; /* Accumulators */ - q63_t acc0, acc1; - q15_t *px0, *px1; - uint32_t blkCntN3; - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize / 2; - blkCntN3 = outBlockSize - (2 * blkCnt); - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = 2 * S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - px0 = pState; - - px1 = pState + S->M; - - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-1] for sample 0 and for sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-2] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-3] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-3] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-4] for sample 0 and sample 1 */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px0++; - x1 = *px1++; - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M * 2; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - *pDst++ = (q15_t) (__SSAT((acc1 >> 15), 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - - while(blkCntN3 > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /*Set sum to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the Read b[numTaps-1] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-1] and sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-2] and sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-3] coefficients */ - c0 = *pb++; - - /* Read x[n-numTaps-3] sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *pb++; - - /* Read x[n-numTaps-4] sample */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* Store filter output, smlad returns the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - /* Decrement the loop counter */ - blkCntN3--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#else - - -void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer coefficient buffer */ - q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ - q63_t sum0; /* Accumulators */ - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, blkCnt, tapCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - - -/* Run the below code for Cortex-M0 */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize; - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /*Set sum to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += (q31_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /*Store filter output , smlad will return the values in 2.14 format */ - /* so downsacle by 15 to get output in 1.15 */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = numTaps - 1u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - -} -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c deleted file mode 100644 index c05c079..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c +++ /dev/null @@ -1,311 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_decimate_q31.c -* -* Description: Q31 FIR Decimator. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_decimate - * @{ - */ - -/** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits (where log2 is read as log to the base 2). - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - * - * \par - * Refer to the function arm_fir_decimate_fast_q31() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - */ - -void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ - q31_t *px; /* Temporary pointers for state buffer */ - q31_t *pb; /* Temporary pointers for coefficient buffer */ - q63_t sum0; /* Accumulator */ - uint32_t numTaps = S->numTaps; /* Number of taps */ - uint32_t i, tapCnt, blkCnt, outBlockSize = blockSize / S->M; /* Loop counters */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize; - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-1] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-2] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (sum0 >> 31); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (numTaps - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - - i = (numTaps - 1u) % 0x04u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Total number of output samples to be computed */ - blkCnt = outBlockSize; - - while(blkCnt > 0u) - { - /* Copy decimation factor number of new input samples into the state buffer */ - i = S->M; - - do - { - *pStateCurnt++ = *pSrc++; - - } while(--i); - - /* Set accumulator to zero */ - sum0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = pCoeffs; - - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *pb++; - - /* Fetch 1 state variable */ - x0 = *px++; - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by the decimation factor - * to process the next group of decimation factor number samples */ - pState = pState + S->M; - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (sum0 >> 31); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = numTaps - 1u; - - /* copy data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_decimate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c deleted file mode 100644 index 3ecb7b5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c +++ /dev/null @@ -1,997 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_f32.c -* -* Description: Floating-point FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** -* @ingroup groupFilters -*/ - -/** -* @defgroup FIR Finite Impulse Response (FIR) Filters -* -* This set of functions implements Finite Impulse Response (FIR) filters -* for Q7, Q15, Q31, and floating-point data types. Fast versions of Q15 and Q31 are also provided. -* The functions operate on blocks of input and output data and each call to the function processes -* blockSize samples through the filter. pSrc and -* pDst points to input and output arrays containing blockSize values. -* -* \par Algorithm: -* The FIR filter algorithm is based upon a sequence of multiply-accumulate (MAC) operations. -* Each filter coefficient b[n] is multiplied by a state variable which equals a previous input sample x[n]. -*
  
-*    y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]  
-* 
-* \par -* \image html FIR.gif "Finite Impulse Response filter" -* \par -* pCoeffs points to a coefficient array of size numTaps. -* Coefficients are stored in time reversed order. -* \par -*
  
-*    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}  
-* 
-* \par -* pState points to a state array of size numTaps + blockSize - 1. -* Samples in the state buffer are stored in the following order. -* \par -*
  
-*    {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}  
-* 
-* \par -* Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1. -* The increased state buffer length allows circular addressing, which is traditionally used in the FIR filters, -* to be avoided and yields a significant speed improvement. -* The state variables are updated after each block of data is processed; the coefficients are untouched. -* \par Instance Structure -* The coefficients and state variables for a filter are stored together in an instance data structure. -* A separate instance structure must be defined for each filter. -* Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. -* There are separate instance structure declarations for each of the 4 supported data types. -* -* \par Initialization Functions -* There is also an associated initialization function for each data type. -* The initialization function performs the following operations: -* - Sets the values of the internal structure fields. -* - Zeros out the values in the state buffer. -* To do this manually without calling the init function, assign the follow subfields of the instance structure: -* numTaps, pCoeffs, pState. Also set all of the values in pState to zero. -* -* \par -* Use of the initialization function is optional. -* However, if the initialization function is used, then the instance structure cannot be placed into a const data section. -* To place an instance structure into a const data section, the instance structure must be manually initialized. -* Set the values in the state buffer to zeros before static initialization. -* The code below statically initializes each of the 4 different data type filter instance structures -*
  
-*arm_fir_instance_f32 S = {numTaps, pState, pCoeffs};  
-*arm_fir_instance_q31 S = {numTaps, pState, pCoeffs};  
-*arm_fir_instance_q15 S = {numTaps, pState, pCoeffs};  
-*arm_fir_instance_q7 S =  {numTaps, pState, pCoeffs};  
-* 
-* -* where numTaps is the number of filter coefficients in the filter; pState is the address of the state buffer; -* pCoeffs is the address of the coefficient buffer. -* -* \par Fixed-Point Behavior -* Care must be taken when using the fixed-point versions of the FIR filter functions. -* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. -* Refer to the function specific documentation below for usage guidelines. -*/ - -/** -* @addtogroup FIR -* @{ -*/ - -/** -* -* @param[in] *S points to an instance of the floating-point FIR filter structure. -* @param[in] *pSrc points to the block of input data. -* @param[out] *pDst points to the block of output data. -* @param[in] blockSize number of samples to process per call. -* @return none. -* -*/ - -#if defined(ARM_MATH_CM7) - -void arm_fir_f32( -const arm_fir_instance_f32 * S, -float32_t * pSrc, -float32_t * pDst, -uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - float32_t acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7; /* Accumulators */ - float32_t x0, x1, x2, x3, x4, x5, x6, x7, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 8 output values simultaneously. - * The variables acc0 ... acc7 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - blkCnt = blockSize >> 3; - - /* First part of the processing with loop unrolling. Compute 8 outputs at a time. - ** a second loop below computes the remaining 1 to 7 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Set all accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - acc4 = 0.0f; - acc5 = 0.0f; - acc6 = 0.0f; - acc7 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* This is separated from the others to avoid - * a call to __aeabi_memmove which would be slower - */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Read the first seven samples from the state buffer: x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ - x0 = *px++; - x1 = *px++; - x2 = *px++; - x3 = *px++; - x4 = *px++; - x5 = *px++; - x6 = *px++; - - /* Loop unrolling. Process 8 taps at a time. */ - tapCnt = numTaps >> 3u; - - /* Loop over the number of taps. Unroll by a factor of 8. - ** Repeat until we've computed numTaps-8 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample */ - x7 = *(px++); - - /* acc0 += b[numTaps-1] * x[n-numTaps] */ - acc0 += x0 * c0; - - /* acc1 += b[numTaps-1] * x[n-numTaps-1] */ - acc1 += x1 * c0; - - /* acc2 += b[numTaps-1] * x[n-numTaps-2] */ - acc2 += x2 * c0; - - /* acc3 += b[numTaps-1] * x[n-numTaps-3] */ - acc3 += x3 * c0; - - /* acc4 += b[numTaps-1] * x[n-numTaps-4] */ - acc4 += x4 * c0; - - /* acc1 += b[numTaps-1] * x[n-numTaps-5] */ - acc5 += x5 * c0; - - /* acc2 += b[numTaps-1] * x[n-numTaps-6] */ - acc6 += x6 * c0; - - /* acc3 += b[numTaps-1] * x[n-numTaps-7] */ - acc7 += x7 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px++); - - /* Perform the multiply-accumulate */ - acc0 += x1 * c0; - acc1 += x2 * c0; - acc2 += x3 * c0; - acc3 += x4 * c0; - acc4 += x5 * c0; - acc5 += x6 * c0; - acc6 += x7 * c0; - acc7 += x0 * c0; - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-5] sample */ - x1 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x2 * c0; - acc1 += x3 * c0; - acc2 += x4 * c0; - acc3 += x5 * c0; - acc4 += x6 * c0; - acc5 += x7 * c0; - acc6 += x0 * c0; - acc7 += x1 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x3 * c0; - acc1 += x4 * c0; - acc2 += x5 * c0; - acc3 += x6 * c0; - acc4 += x7 * c0; - acc5 += x0 * c0; - acc6 += x1 * c0; - acc7 += x2 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x3 = *(px++); - /* Perform the multiply-accumulates */ - acc0 += x4 * c0; - acc1 += x5 * c0; - acc2 += x6 * c0; - acc3 += x7 * c0; - acc4 += x0 * c0; - acc5 += x1 * c0; - acc6 += x2 * c0; - acc7 += x3 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x4 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x5 * c0; - acc1 += x6 * c0; - acc2 += x7 * c0; - acc3 += x0 * c0; - acc4 += x1 * c0; - acc5 += x2 * c0; - acc6 += x3 * c0; - acc7 += x4 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x5 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x6 * c0; - acc1 += x7 * c0; - acc2 += x0 * c0; - acc3 += x1 * c0; - acc4 += x2 * c0; - acc5 += x3 * c0; - acc6 += x4 * c0; - acc7 += x5 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x6 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x7 * c0; - acc1 += x0 * c0; - acc2 += x1 * c0; - acc3 += x2 * c0; - acc4 += x3 * c0; - acc5 += x4 * c0; - acc6 += x5 * c0; - acc7 += x6 * c0; - - tapCnt--; - } - - /* If the filter length is not a multiple of 8, compute the remaining filter taps */ - tapCnt = numTaps % 0x8u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x7 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - acc4 += x4 * c0; - acc5 += x5 * c0; - acc6 += x6 * c0; - acc7 += x7 * c0; - - /* Reuse the present sample states for next sample */ - x0 = x1; - x1 = x2; - x2 = x3; - x3 = x4; - x4 = x5; - x5 = x6; - x6 = x7; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by 8 to process the next group of 8 samples */ - pState = pState + 8; - - /* The results in the 8 accumulators, store in the destination buffer. */ - *pDst++ = acc0; - *pDst++ = acc1; - *pDst++ = acc2; - *pDst++ = acc3; - *pDst++ = acc4; - *pDst++ = acc5; - *pDst++ = acc6; - *pDst++ = acc7; - - blkCnt--; - } - - /* If the blockSize is not a multiple of 8, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x8u; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = (pCoeffs); - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - acc0 += *px++ * *pb++; - i--; - - } while(i > 0u); - - /* The result is store in the destination buffer. */ - *pDst++ = acc0; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - -#elif defined(ARM_MATH_CM0_FAMILY) - -void arm_fir_f32( -const arm_fir_instance_f32 * S, -float32_t * pSrc, -float32_t * pDst, -uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - - /* Run the below code for Cortex-M0 */ - - float32_t acc; - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Initialize blkCnt with blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = pCoeffs; - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ - acc += *px++ * *pb++; - i--; - - } while(i > 0u); - - /* The result is store in the destination buffer. */ - *pDst++ = acc; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the starting of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Copy numTaps number of values */ - tapCnt = numTaps - 1u; - - /* Copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -#else - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_fir_f32( -const arm_fir_instance_f32 * S, -float32_t * pSrc, -float32_t * pDst, -uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - float32_t acc0, acc1, acc2, acc3, acc4, acc5, acc6, acc7; /* Accumulators */ - float32_t x0, x1, x2, x3, x4, x5, x6, x7, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - float32_t p0,p1,p2,p3,p4,p5,p6,p7; /* Temporary product values */ - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 8 output values simultaneously. - * The variables acc0 ... acc7 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - blkCnt = blockSize >> 3; - - /* First part of the processing with loop unrolling. Compute 8 outputs at a time. - ** a second loop below computes the remaining 1 to 7 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Set all accumulators to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - acc4 = 0.0f; - acc5 = 0.0f; - acc6 = 0.0f; - acc7 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* This is separated from the others to avoid - * a call to __aeabi_memmove which would be slower - */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Read the first seven samples from the state buffer: x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ - x0 = *px++; - x1 = *px++; - x2 = *px++; - x3 = *px++; - x4 = *px++; - x5 = *px++; - x6 = *px++; - - /* Loop unrolling. Process 8 taps at a time. */ - tapCnt = numTaps >> 3u; - - /* Loop over the number of taps. Unroll by a factor of 8. - ** Repeat until we've computed numTaps-8 coefficients. */ - while(tapCnt > 0u) - { - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-3] sample */ - x7 = *(px++); - - /* acc0 += b[numTaps-1] * x[n-numTaps] */ - p0 = x0 * c0; - - /* acc1 += b[numTaps-1] * x[n-numTaps-1] */ - p1 = x1 * c0; - - /* acc2 += b[numTaps-1] * x[n-numTaps-2] */ - p2 = x2 * c0; - - /* acc3 += b[numTaps-1] * x[n-numTaps-3] */ - p3 = x3 * c0; - - /* acc4 += b[numTaps-1] * x[n-numTaps-4] */ - p4 = x4 * c0; - - /* acc1 += b[numTaps-1] * x[n-numTaps-5] */ - p5 = x5 * c0; - - /* acc2 += b[numTaps-1] * x[n-numTaps-6] */ - p6 = x6 * c0; - - /* acc3 += b[numTaps-1] * x[n-numTaps-7] */ - p7 = x7 * c0; - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - - /* Perform the multiply-accumulate */ - p0 = x1 * c0; - p1 = x2 * c0; - p2 = x3 * c0; - p3 = x4 * c0; - p4 = x5 * c0; - p5 = x6 * c0; - p6 = x7 * c0; - p7 = x0 * c0; - - /* Read the b[numTaps-3] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-5] sample */ - x1 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x2 * c0; - p1 = x3 * c0; - p2 = x4 * c0; - p3 = x5 * c0; - p4 = x6 * c0; - p5 = x7 * c0; - p6 = x0 * c0; - p7 = x1 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x2 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x3 * c0; - p1 = x4 * c0; - p2 = x5 * c0; - p3 = x6 * c0; - p4 = x7 * c0; - p5 = x0 * c0; - p6 = x1 * c0; - p7 = x2 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x3 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x4 * c0; - p1 = x5 * c0; - p2 = x6 * c0; - p3 = x7 * c0; - p4 = x0 * c0; - p5 = x1 * c0; - p6 = x2 * c0; - p7 = x3 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x4 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x5 * c0; - p1 = x6 * c0; - p2 = x7 * c0; - p3 = x0 * c0; - p4 = x1 * c0; - p5 = x2 * c0; - p6 = x3 * c0; - p7 = x4 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x5 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x6 * c0; - p1 = x7 * c0; - p2 = x0 * c0; - p3 = x1 * c0; - p4 = x2 * c0; - p5 = x3 * c0; - p6 = x4 * c0; - p7 = x5 * c0; - - /* Read the b[numTaps-4] coefficient */ - c0 = *(pb++); - - /* Read x[n-numTaps-6] sample */ - x6 = *(px++); - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Perform the multiply-accumulates */ - p0 = x7 * c0; - p1 = x0 * c0; - p2 = x1 * c0; - p3 = x2 * c0; - p4 = x3 * c0; - p5 = x4 * c0; - p6 = x5 * c0; - p7 = x6 * c0; - - tapCnt--; - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - } - - /* If the filter length is not a multiple of 8, compute the remaining filter taps */ - tapCnt = numTaps % 0x8u; - - while(tapCnt > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x7 = *(px++); - - /* Perform the multiply-accumulates */ - p0 = x0 * c0; - p1 = x1 * c0; - p2 = x2 * c0; - p3 = x3 * c0; - p4 = x4 * c0; - p5 = x5 * c0; - p6 = x6 * c0; - p7 = x7 * c0; - - /* Reuse the present sample states for next sample */ - x0 = x1; - x1 = x2; - x2 = x3; - x3 = x4; - x4 = x5; - x5 = x6; - x6 = x7; - - acc0 += p0; - acc1 += p1; - acc2 += p2; - acc3 += p3; - acc4 += p4; - acc5 += p5; - acc6 += p6; - acc7 += p7; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance the state pointer by 8 to process the next group of 8 samples */ - pState = pState + 8; - - /* The results in the 8 accumulators, store in the destination buffer. */ - *pDst++ = acc0; - *pDst++ = acc1; - *pDst++ = acc2; - *pDst++ = acc3; - *pDst++ = acc4; - *pDst++ = acc5; - *pDst++ = acc6; - *pDst++ = acc7; - - blkCnt--; - } - - /* If the blockSize is not a multiple of 8, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x8u; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0.0f; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = (pCoeffs); - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - acc0 += *px++ * *pb++; - i--; - - } while(i > 0u); - - /* The result is store in the destination buffer. */ - *pDst++ = acc0; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - -#endif - -/** -* @} end of FIR group -*/ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c deleted file mode 100644 index 5e2ed77..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c +++ /dev/null @@ -1,345 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_fast_q15.c -* -* Description: Q15 Fast FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @param[in] *S points to an instance of the Q15 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * This fast version uses a 32-bit accumulator with 2.30 format. - * The accumulator maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around and distorts the result. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits. - * The 2.30 accumulator is then truncated to 2.15 format and saturated to yield the 1.15 result. - * - * \par - * Refer to the function arm_fir_q15() for a slower implementation of this function which uses 64-bit accumulation to avoid wrap around distortion. Both the slow and the fast versions use the same instance structure. - * Use the function arm_fir_init_q15() to initialize the filter structure. - */ - -void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *pb; /* Temporary pointer for coefficient buffer */ - q15_t *px; /* Temporary q31 pointer for SIMD state buffer accesses */ - q31_t x0, x1, x2, c0; /* Temporary variables to hold SIMD state and coefficient values */ - uint32_t numTaps = S->numTaps; /* Number of taps in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer. - ** Use 32-bit SIMD to move the 16-bit data. Only requires two copies. */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Typecast q15_t pointer to q31_t pointer for state reading in q31_t */ - px = pState; - - /* Typecast q15_t pointer to q31_t pointer for coefficient reading in q31_t */ - pb = pCoeffs; - - /* Read the first two samples from the state buffer: x[n-N], x[n-N-1] */ - x0 = *__SIMD32(px)++; - - /* Read the third and forth samples from the state buffer: x[n-N-2], x[n-N-3] */ - x2 = *__SIMD32(px)++; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(numTaps%4) coefficients. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0) - { - /* Read the first two coefficients using SIMD: b[N] and b[N-1] coefficients */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ - acc0 = __SMLAD(x0, c0, acc0); - - /* acc2 += b[N] * x[n-N-2] + b[N-1] * x[n-N-3] */ - acc2 = __SMLAD(x2, c0, acc2); - - /* pack x[n-N-1] and x[n-N-2] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* Read state x[n-N-4], x[n-N-5] */ - x0 = _SIMD32_OFFSET(px); - - /* acc1 += b[N] * x[n-N-1] + b[N-1] * x[n-N-2] */ - acc1 = __SMLADX(x1, c0, acc1); - - /* pack x[n-N-3] and x[n-N-4] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x0, x2, 0); -#else - x1 = __PKHBT(x2, x0, 0); -#endif - - /* acc3 += b[N] * x[n-N-3] + b[N-1] * x[n-N-4] */ - acc3 = __SMLADX(x1, c0, acc3); - - /* Read coefficients b[N-2], b[N-3] */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N-2] * x[n-N-2] + b[N-3] * x[n-N-3] */ - acc0 = __SMLAD(x2, c0, acc0); - - /* Read state x[n-N-6], x[n-N-7] with offset */ - x2 = _SIMD32_OFFSET(px + 2u); - - /* acc2 += b[N-2] * x[n-N-4] + b[N-3] * x[n-N-5] */ - acc2 = __SMLAD(x0, c0, acc2); - - /* acc1 += b[N-2] * x[n-N-3] + b[N-3] * x[n-N-4] */ - acc1 = __SMLADX(x1, c0, acc1); - - /* pack x[n-N-5] and x[n-N-6] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* acc3 += b[N-2] * x[n-N-5] + b[N-3] * x[n-N-6] */ - acc3 = __SMLADX(x1, c0, acc3); - - /* Update state pointer for next state reading */ - px += 4u; - - /* Decrement tap count */ - tapCnt--; - - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps. - ** This is always be 2 taps since the filter length is even. */ - if((numTaps & 0x3u) != 0u) - { - - /* Read last two coefficients */ - c0 = *__SIMD32(pb)++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLAD(x0, c0, acc0); - acc2 = __SMLAD(x2, c0, acc2); - - /* pack state variables */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* Read last state variables */ - x0 = *__SIMD32(px); - - /* Perform the multiply-accumulates */ - acc1 = __SMLADX(x1, c0, acc1); - - /* pack state variables */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x0, x2, 0); -#else - x1 = __PKHBT(x2, x0, 0); -#endif - - /* Perform the multiply-accumulates */ - acc3 = __SMLADX(x1, c0, acc3); - } - - /* The results in the 4 accumulators are in 2.30 format. Convert to 1.15 with saturation. - ** Then store the 4 outputs in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - while(blkCnt > 0u) - { - /* Copy two samples into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Use SIMD to hold states and coefficients */ - px = pState; - pb = pCoeffs; - - tapCnt = numTaps >> 1u; - - do - { - - acc0 += (q31_t) * px++ * *pb++; - acc0 += (q31_t) * px++ * *pb++; - - tapCnt--; - } - while(tapCnt > 0u); - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Calculation of count for copying integer writes */ - tapCnt = (numTaps - 1u) >> 2; - - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - tapCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* copy remaining data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c deleted file mode 100644 index 5e4c9fc..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c +++ /dev/null @@ -1,305 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_fast_q31.c -* -* Description: Processing function for the Q31 Fast FIR filter. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @param[in] *S points to an instance of the Q31 structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * - * \par - * This function is optimized for speed at the expense of fixed-point precision and overflow protection. - * The result of each 1.31 x 1.31 multiplication is truncated to 2.30 format. - * These intermediate results are added to a 2.30 accumulator. - * Finally, the accumulator is saturated and converted to a 1.31 result. - * The fast version has the same overflow behavior as the standard version and provides less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits. - * - * \par - * Refer to the function arm_fir_q31() for a slower implementation of this function which uses a 64-bit accumulator to provide higher precision. Both the slow and the fast versions use the same instance structure. - * Use the function arm_fir_init_q31() to initialize the filter structure. - */ - -IAR_ONLY_LOW_OPTIMIZATION_ENTER -void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t x0, x1, x2, x3; /* Temporary variables to hold state */ - q31_t c0; /* Temporary variable to hold coefficient value */ - q31_t *px; /* Temporary pointer for state */ - q31_t *pb; /* Temporary pointer for coefficient buffer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Read the first three samples from the state buffer: - * x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - i = tapCnt; - - while(i > 0u) - { - /* Read the b[numTaps] coefficient */ - c0 = *pb; - - /* Read x[n-numTaps-3] sample */ - x3 = *px; - - /* acc0 += b[numTaps] * x[n-numTaps] */ - multAcc_32x32_keep32_R(acc0, x0, c0); - - /* acc1 += b[numTaps] * x[n-numTaps-1] */ - multAcc_32x32_keep32_R(acc1, x1, c0); - - /* acc2 += b[numTaps] * x[n-numTaps-2] */ - multAcc_32x32_keep32_R(acc2, x2, c0); - - /* acc3 += b[numTaps] * x[n-numTaps-3] */ - multAcc_32x32_keep32_R(acc3, x3, c0); - - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb + 1u); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulates */ - multAcc_32x32_keep32_R(acc0, x1, c0); - multAcc_32x32_keep32_R(acc1, x2, c0); - multAcc_32x32_keep32_R(acc2, x3, c0); - multAcc_32x32_keep32_R(acc3, x0, c0); - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb + 2u); - - /* Read x[n-numTaps-5] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - multAcc_32x32_keep32_R(acc0, x2, c0); - multAcc_32x32_keep32_R(acc1, x3, c0); - multAcc_32x32_keep32_R(acc2, x0, c0); - multAcc_32x32_keep32_R(acc3, x1, c0); - - /* Read the b[numTaps-3] coefficients */ - c0 = *(pb + 3u); - - /* Read x[n-numTaps-6] sample */ - x2 = *(px + 3u); - - /* Perform the multiply-accumulates */ - multAcc_32x32_keep32_R(acc0, x3, c0); - multAcc_32x32_keep32_R(acc1, x0, c0); - multAcc_32x32_keep32_R(acc2, x1, c0); - multAcc_32x32_keep32_R(acc3, x2, c0); - - /* update coefficient pointer */ - pb += 4u; - px += 4u; - - /* Decrement the loop counter */ - i--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - - i = numTaps - (tapCnt * 4u); - while(i > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - multAcc_32x32_keep32_R(acc0, x0, c0); - multAcc_32x32_keep32_R(acc1, x1, c0); - multAcc_32x32_keep32_R(acc2, x2, c0); - multAcc_32x32_keep32_R(acc3, x3, c0); - - /* Reuse the present sample states for next sample */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 4; - - /* The results in the 4 accumulators are in 2.30 format. Convert to 1.31 - ** Then store the 4 outputs in the destination buffer. */ - *pDst++ = (q31_t) (acc0 << 1); - *pDst++ = (q31_t) (acc1 << 1); - *pDst++ = (q31_t) (acc2 << 1); - *pDst++ = (q31_t) (acc3 << 1); - - /* Decrement the samples loop counter */ - blkCnt--; - } - - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 4u; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = (pCoeffs); - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - multAcc_32x32_keep32_R(acc0, (*px++), (*(pb++))); - i--; - } while(i > 0u); - - /* The result is in 2.30 format. Convert to 1.31 - ** Then store the output in the destination buffer. */ - *pDst++ = (q31_t) (acc0 << 1); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the samples loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u); - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - -} -IAR_ONLY_LOW_OPTIMIZATION_EXIT -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c deleted file mode 100644 index 92bdc9e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c +++ /dev/null @@ -1,96 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_init_f32.c -* -* Description: Floating-point FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @details - * - * @param[in,out] *S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed per call. - * @return none. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_f32(). - */ - -void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and the size of state buffer is (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c deleted file mode 100644 index d976d73..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_init_q15.c -* -* Description: Q15 FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @param[in,out] *S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] *pCoeffs points to the filter coefficients buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize is number of samples processed per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if - * numTaps is not greater than or equal to 4 and even. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * Note that numTaps must be even and greater than or equal to 4. - * To implement an odd length filter simply increase numTaps by 1 and set the last coefficient to zero. - * For example, to implement a filter with numTaps=3 and coefficients - *
    
- *     {0.3, -0.8, 0.3}    
- * 
- * set numTaps=4 and use the coefficients: - *
    
- *     {0.3, -0.8, 0.3, 0}.    
- * 
- * Similarly, to implement a two point filter - *
    
- *     {0.3, -0.3}    
- * 
- * set numTaps=4 and use the coefficients: - *
    
- *     {0.3, -0.3, 0, 0}.    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize, when running on Cortex-M4 and Cortex-M3 and is of length numTaps+blockSize-1, when running on Cortex-M0 where blockSize is the number of input samples processed by each call to arm_fir_q15(). - */ - -arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize) -{ - arm_status status; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* The Number of filter coefficients in the filter must be even and at least 4 */ - if(numTaps & 0x1u) - { - status = ARM_MATH_ARGUMENT_ERROR; - } - else - { - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear the state buffer. The size is always (blockSize + numTaps ) */ - memset(pState, 0, (numTaps + (blockSize)) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -#else - - /* Run the below code for Cortex-M0 */ - - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - status = ARM_MATH_SUCCESS; - - return (status); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c deleted file mode 100644 index 726cdfc..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c +++ /dev/null @@ -1,96 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_init_q31.c -* -* Description: Q31 FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @details - * - * @param[in,out] *S points to an instance of the Q31 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed per call. - * @return none. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_q31(). - */ - -void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and state array size is (blockSize + numTaps - 1) */ - memset(pState, 0, (blockSize + ((uint32_t) numTaps - 1u)) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c deleted file mode 100644 index 083d58e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c +++ /dev/null @@ -1,94 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_init_q7.c -* -* Description: Q7 FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ -/** - * @param[in,out] *S points to an instance of the Q7 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed per call. - * @return none - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to the array of state variables. - * pState is of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_fir_q7(). - */ - -void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize) -{ - - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear the state buffer. The size is always (blockSize + numTaps - 1) */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q7_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c deleted file mode 100644 index 1ff72f8..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c +++ /dev/null @@ -1,581 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_f32.c -* -* Description: FIR interpolation for floating-point sequences. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @defgroup FIR_Interpolate Finite Impulse Response (FIR) Interpolator - * - * These functions combine an upsampler (zero stuffer) and an FIR filter. - * They are used in multirate systems for increasing the sample rate of a signal without introducing high frequency images. - * Conceptually, the functions are equivalent to the block diagram below: - * \image html FIRInterpolator.gif "Components included in the FIR Interpolator functions" - * After upsampling by a factor of L, the signal should be filtered by a lowpass filter with a normalized - * cutoff frequency of 1/L in order to eliminate high frequency copies of the spectrum. - * The user of the function is responsible for providing the filter coefficients. - * - * The FIR interpolator functions provided in the CMSIS DSP Library combine the upsampler and FIR filter in an efficient manner. - * The upsampler inserts L-1 zeros between each sample. - * Instead of multiplying by these zero values, the FIR filter is designed to skip them. - * This leads to an efficient implementation without any wasted effort. - * The functions operate on blocks of input and output data. - * pSrc points to an array of blockSize input values and - * pDst points to an array of blockSize*L output values. - * - * The library provides separate functions for Q15, Q31, and floating-point data types. - * - * \par Algorithm: - * The functions use a polyphase filter structure: - *
    
- *    y[n] = b[0] * x[n] + b[L]   * x[n-1] + ... + b[L*(phaseLength-1)] * x[n-phaseLength+1]    
- *    y[n+1] = b[1] * x[n] + b[L+1] * x[n-1] + ... + b[L*(phaseLength-1)+1] * x[n-phaseLength+1]    
- *    ...    
- *    y[n+(L-1)] = b[L-1] * x[n] + b[2*L-1] * x[n-1] + ....+ b[L*(phaseLength-1)+(L-1)] * x[n-phaseLength+1]    
- * 
- * This approach is more efficient than straightforward upsample-then-filter algorithms. - * With this method the computation is reduced by a factor of 1/L when compared to using a standard FIR filter. - * \par - * pCoeffs points to a coefficient array of size numTaps. - * numTaps must be a multiple of the interpolation factor L and this is checked by the - * initialization functions. - * Internally, the function divides the FIR filter's impulse response into shorter filters of length - * phaseLength=numTaps/L. - * Coefficients are stored in time reversed order. - * \par - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to a state array of size blockSize + phaseLength - 1. - * Samples in the state buffer are stored in the order: - * \par - *
    
- *    {x[n-phaseLength+1], x[n-phaseLength], x[n-phaseLength-1], x[n-phaseLength-2]....x[0], x[1], ..., x[blockSize-1]}    
- * 
- * The state variables are updated after each block of data is processed, the coefficients are untouched. - * - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable array should be allocated separately. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * - Checks to make sure that the length of the filter is a multiple of the interpolation factor. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * L (interpolation factor), pCoeffs, phaseLength (numTaps / L), pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * The code below statically initializes each of the 3 different data type filter instance structures - *
    
- * arm_fir_interpolate_instance_f32 S = {L, phaseLength, pCoeffs, pState};    
- * arm_fir_interpolate_instance_q31 S = {L, phaseLength, pCoeffs, pState};    
- * arm_fir_interpolate_instance_q15 S = {L, phaseLength, pCoeffs, pState};    
- * 
- * where L is the interpolation factor; phaseLength=numTaps/L is the - * length of each of the shorter FIR filters used internally, - * pCoeffs is the address of the coefficient buffer; - * pState is the address of the state buffer. - * Be sure to set the values in the state buffer to zeros when doing static initialization. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the FIR interpolate filter functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - -/** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - float32_t sum0; /* Accumulators */ - float32_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t i, blkCnt, j; /* Loop counters */ - uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ - float32_t acc0, acc1, acc2, acc3; - float32_t x1, x2, x3; - uint32_t blkCntN4; - float32_t c1, c2, c3; - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (phaseLen - 1u); - - /* Initialise blkCnt */ - blkCnt = blockSize / 4; - blkCntN4 = blockSize - (4 * blkCnt); - - /* Samples loop unrolled by 4 */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = (S->L); - - while(i > 0u) - { - /* Set accumulator to zero */ - acc0 = 0.0f; - acc1 = 0.0f; - acc2 = 0.0f; - acc3 = 0.0f; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2u; - - x0 = *(ptr1++); - x1 = *(ptr1++); - x2 = *(ptr1++); - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x3 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Read the coefficient */ - c1 = *(ptr2 + S->L); - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += x1 * c1; - acc1 += x2 * c1; - acc2 += x3 * c1; - acc3 += x0 * c1; - - /* Read the coefficient */ - c2 = *(ptr2 + S->L * 2); - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += x2 * c2; - acc1 += x3 * c2; - acc2 += x0 * c2; - acc3 += x1 * c2; - - /* Read the coefficient */ - c3 = *(ptr2 + S->L * 3); - - /* Read the input sample */ - x2 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += x3 * c3; - acc1 += x0 * c3; - acc2 += x1 * c3; - acc3 += x2 * c3; - - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += 4 * S->L; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen % 0x4u; - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x3 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += x0 * c0; - acc1 += x1 * c0; - acc2 += x2 * c0; - acc3 += x3 * c0; - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* update states for next sample processing */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst = acc0; - *(pDst + S->L) = acc1; - *(pDst + 2 * S->L) = acc2; - *(pDst + 3 * S->L) = acc3; - - pDst++; - - /* Increment the address modifier index of coefficient buffer */ - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 4; - - pDst += S->L * 3; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - - while(blkCntN4 > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = S->L; - while(i > 0u) - { - /* Set accumulator to zero */ - sum0 = 0.0f; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2u; - while(tapCnt > 0u) - { - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += x0 * c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum0 += *(ptr1++) * (*ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = sum0; - - /* Increment the address modifier index of coefficient buffer */ - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCntN4--; - } - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (phaseLen - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (phaseLen - 1u) % 0x04u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - -#else - - /* Run the below code for Cortex-M0 */ - -void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - - - float32_t sum; /* Accumulator */ - uint32_t i, blkCnt; /* Loop counters */ - uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ - - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (phaseLen - 1u); - - /* Total number of intput samples */ - blkCnt = blockSize; - - /* Loop over the blockSize. */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Loop over the Interpolation factor. */ - i = S->L; - - while(i > 0u) - { - /* Set accumulator to zero */ - sum = 0.0f; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (i - 1u); - - /* Loop over the polyPhase length */ - tapCnt = phaseLen; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += *ptr1++ * *ptr2; - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = sum; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = phaseLen - 1u; - - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c deleted file mode 100644 index d8c8bdc..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c +++ /dev/null @@ -1,121 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_init_f32.c -* -* Description: Floating-point FIR interpolator initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - -/** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}    
- * 
- * The length of the filter numTaps must be a multiple of the interpolation factor L. - * \par - * pState points to the array of state variables. - * pState is of length (numTaps/L)+blockSize-1 words - * where blockSize is the number of input samples processed by each call to arm_fir_interpolate_f32(). - */ - -arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize) -{ - arm_status status; - - /* The filter length must be a multiple of the interpolation factor */ - if((numTaps % L) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign Interpolation factor */ - S->L = L; - - /* Assign polyPhaseLength */ - S->phaseLength = numTaps / L; - - /* Clear state buffer and size of state array is always phaseLength + blockSize - 1 */ - memset(pState, 0, - (blockSize + - ((uint32_t) S->phaseLength - 1u)) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c deleted file mode 100644 index 03c39bd..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c +++ /dev/null @@ -1,120 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_init_q15.c -* -* Description: Q15 FIR interpolator initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - -/** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}    
- * 
- * The length of the filter numTaps must be a multiple of the interpolation factor L. - * \par - * pState points to the array of state variables. - * pState is of length (numTaps/L)+blockSize-1 words - * where blockSize is the number of input samples processed by each call to arm_fir_interpolate_q15(). - */ - -arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize) -{ - arm_status status; - - /* The filter length must be a multiple of the interpolation factor */ - if((numTaps % L) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign Interpolation factor */ - S->L = L; - - /* Assign polyPhaseLength */ - S->phaseLength = numTaps / L; - - /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */ - memset(pState, 0, - (blockSize + ((uint32_t) S->phaseLength - 1u)) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c deleted file mode 100644 index 59f735c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c +++ /dev/null @@ -1,121 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_init_q31.c -* -* Description: Q31 FIR interpolator initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - - -/** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}    
- * 
- * The length of the filter numTaps must be a multiple of the interpolation factor L. - * \par - * pState points to the array of state variables. - * pState is of length (numTaps/L)+blockSize-1 words - * where blockSize is the number of input samples processed by each call to arm_fir_interpolate_q31(). - */ - -arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize) -{ - arm_status status; - - /* The filter length must be a multiple of the interpolation factor */ - if((numTaps % L) != 0u) - { - /* Set status as ARM_MATH_LENGTH_ERROR */ - status = ARM_MATH_LENGTH_ERROR; - } - else - { - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign Interpolation factor */ - S->L = L; - - /* Assign polyPhaseLength */ - S->phaseLength = numTaps / L; - - /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */ - memset(pState, 0, - (blockSize + ((uint32_t) S->phaseLength - 1u)) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - - status = ARM_MATH_SUCCESS; - } - - return (status); - -} - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c deleted file mode 100644 index 68f2492..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c +++ /dev/null @@ -1,508 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_q15.c -* -* Description: Q15 FIR interpolation. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - -/** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - q63_t sum0; /* Accumulators */ - q15_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t i, blkCnt, j, tapCnt; /* Loop counters */ - uint16_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ - uint32_t blkCntN2; - q63_t acc0, acc1; - q15_t x1; - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + ((q31_t) phaseLen - 1); - - /* Initialise blkCnt */ - blkCnt = blockSize / 2; - blkCntN2 = blockSize - (2 * blkCnt); - - /* Samples loop unrolled by 2 */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = (S->L); - - while(i > 0u) - { - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2u; - - x0 = *(ptr1++); - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - - /* Read the coefficient */ - c0 = *(ptr2 + S->L); - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x1 *c0; - acc1 += (q63_t) x0 *c0; - - - /* Read the coefficient */ - c0 = *(ptr2 + S->L * 2); - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - /* Read the coefficient */ - c0 = *(ptr2 + S->L * 3); - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x1 *c0; - acc1 += (q63_t) x0 *c0; - - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += 4 * S->L; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen % 0x4u; - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* update states for next sample processing */ - x0 = x1; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst = (q15_t) (__SSAT((acc0 >> 15), 16)); - *(pDst + S->L) = (q15_t) (__SSAT((acc1 >> 15), 16)); - - pDst++; - - /* Increment the address modifier index of coefficient buffer */ - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 2; - - pDst += S->L; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 2, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blkCntN2; - - /* Loop over the blockSize. */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = S->L; - while(i > 0u) - { - /* Set accumulator to zero */ - sum0 = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2; - while(tapCnt > 0u) - { - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen & 0x3u; - - while(tapCnt > 0u) - { - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT((sum0 >> 15), 16)); - - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = ((uint32_t) phaseLen - 1u) >> 2u; - - /* copy data */ - while(i > 0u) - { -#ifndef UNALIGNED_SUPPORT_DISABLE - - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - -#else - - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - i--; - } - - i = ((uint32_t) phaseLen - 1u) % 0x04u; - - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } -} - -#else - - /* Run the below code for Cortex-M0 */ - -void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - q63_t sum; /* Accumulator */ - q15_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t i, blkCnt, tapCnt; /* Loop counters */ - uint16_t phaseLen = S->phaseLength; /* Length of each polyphase filter component */ - - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (phaseLen - 1u); - - /* Total number of intput samples */ - blkCnt = blockSize; - - /* Loop over the blockSize. */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Loop over the Interpolation factor. */ - i = S->L; - - while(i > 0u) - { - /* Set accumulator to zero */ - sum = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (i - 1u); - - /* Loop over the polyPhase length */ - tapCnt = (uint32_t) phaseLen; - - while(tapCnt > 0u) - { - /* Read the coefficient */ - c0 = *ptr2; - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *ptr1++; - - /* Perform the multiply-accumulate */ - sum += ((q31_t) x0 * c0); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Store the result after converting to 1.15 format in the destination buffer */ - *pDst++ = (q15_t) (__SSAT((sum >> 15), 16)); - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the start of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - i = (uint32_t) phaseLen - 1u; - - while(i > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - i--; - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c deleted file mode 100644 index c4d4603..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c +++ /dev/null @@ -1,504 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_interpolate_q31.c -* -* Description: Q31 FIR interpolation. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Interpolate - * @{ - */ - -/** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] *S points to an instance of the Q31 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 1/(numTaps/L). - * since numTaps/L additions occur per output sample. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - q63_t sum0; /* Accumulators */ - q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t i, blkCnt, j; /* Loop counters */ - uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ - - uint32_t blkCntN2; - q63_t acc0, acc1; - q31_t x1; - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + ((q31_t) phaseLen - 1); - - /* Initialise blkCnt */ - blkCnt = blockSize / 2; - blkCntN2 = blockSize - (2 * blkCnt); - - /* Samples loop unrolled by 2 */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = (S->L); - - while(i > 0u) - { - /* Set accumulator to zero */ - acc0 = 0; - acc1 = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2u; - - x0 = *(ptr1++); - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - - /* Read the coefficient */ - c0 = *(ptr2 + S->L); - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x1 *c0; - acc1 += (q63_t) x0 *c0; - - - /* Read the coefficient */ - c0 = *(ptr2 + S->L * 2); - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - /* Read the coefficient */ - c0 = *(ptr2 + S->L * 3); - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x1 *c0; - acc1 += (q63_t) x0 *c0; - - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += 4 * S->L; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen % 0x4u; - - while(tapCnt > 0u) - { - - /* Read the input sample */ - x1 = *(ptr1++); - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Perform the multiply-accumulate */ - acc0 += (q63_t) x0 *c0; - acc1 += (q63_t) x1 *c0; - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* update states for next sample processing */ - x0 = x1; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst = (q31_t) (acc0 >> 31); - *(pDst + S->L) = (q31_t) (acc1 >> 31); - - - pDst++; - - /* Increment the address modifier index of coefficient buffer */ - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 2; - - pDst += S->L; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 2, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blkCntN2; - - /* Loop over the blockSize. */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Address modifier index of coefficient buffer */ - j = 1u; - - /* Loop over the Interpolation factor. */ - i = S->L; - while(i > 0u) - { - /* Set accumulator to zero */ - sum0 = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (S->L - j); - - /* Loop over the polyPhase length. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(4*S->L) coefficients. */ - tapCnt = phaseLen >> 2; - while(tapCnt > 0u) - { - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Upsampling is done by stuffing L-1 zeros between each sample. - * So instead of multiplying zeros with coefficients, - * Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the polyPhase length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = phaseLen & 0x3u; - - while(tapCnt > 0u) - { - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *(ptr1++); - - /* Perform the multiply-accumulate */ - sum0 += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (sum0 >> 31); - - /* Increment the address modifier index of coefficient buffer */ - j++; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (phaseLen - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - tapCnt = (phaseLen - 1u) % 0x04u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - - -#else - -void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t *ptr1, *ptr2; /* Temporary pointers for state and coefficient buffers */ - - /* Run the below code for Cortex-M0 */ - - q63_t sum; /* Accumulator */ - q31_t x0, c0; /* Temporary variables to hold state and coefficient values */ - uint32_t i, blkCnt; /* Loop counters */ - uint16_t phaseLen = S->phaseLength, tapCnt; /* Length of each polyphase filter component */ - - - /* S->pState buffer contains previous frame (phaseLen - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + ((q31_t) phaseLen - 1); - - /* Total number of intput samples */ - blkCnt = blockSize; - - /* Loop over the blockSize. */ - while(blkCnt > 0u) - { - /* Copy new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Loop over the Interpolation factor. */ - i = S->L; - - while(i > 0u) - { - /* Set accumulator to zero */ - sum = 0; - - /* Initialize state pointer */ - ptr1 = pState; - - /* Initialize coefficient pointer */ - ptr2 = pCoeffs + (i - 1u); - - tapCnt = phaseLen; - - while(tapCnt > 0u) - { - /* Read the coefficient */ - c0 = *(ptr2); - - /* Increment the coefficient pointer by interpolation factor times. */ - ptr2 += S->L; - - /* Read the input sample */ - x0 = *ptr1++; - - /* Perform the multiply-accumulate */ - sum += (q63_t) x0 *c0; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is in the accumulator, store in the destination buffer. */ - *pDst++ = (q31_t) (sum >> 31); - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 1 - * to process the next group of interpolation factor number samples */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last phaseLen - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = phaseLen - 1u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /** - * @} end of FIR_Interpolate group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c deleted file mode 100644 index fb17482..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c +++ /dev/null @@ -1,506 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_f32.c -* -* Description: Processing function for the floating-point FIR Lattice filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup FIR_Lattice Finite Impulse Response (FIR) Lattice Filters - * - * This set of functions implements Finite Impulse Response (FIR) lattice filters - * for Q15, Q31 and floating-point data types. Lattice filters are used in a - * variety of adaptive filter applications. The filter structure is feedforward and - * the net impulse response is finite length. - * The functions operate on blocks - * of input and output data and each call to the function processes - * blockSize samples through the filter. pSrc and - * pDst point to input and output arrays containing blockSize values. - * - * \par Algorithm: - * \image html FIRLattice.gif "Finite Impulse Response Lattice filter" - * The following difference equation is implemented: - *
    
- *    f0[n] = g0[n] = x[n]    
- *    fm[n] = fm-1[n] + km * gm-1[n-1] for m = 1, 2, ...M    
- *    gm[n] = km * fm-1[n] + gm-1[n-1] for m = 1, 2, ...M    
- *    y[n] = fM[n]    
- * 
- * \par - * pCoeffs points to tha array of reflection coefficients of size numStages. - * Reflection Coefficients are stored in the following order. - * \par - *
    
- *    {k1, k2, ..., kM}    
- * 
- * where M is number of stages - * \par - * pState points to a state array of size numStages. - * The state variables (g values) hold previous inputs and are stored in the following order. - *
    
- *    {g0[n], g1[n], g2[n] ...gM-1[n]}    
- * 
- * The state variables are updated after each block of data is processed; the coefficients are untouched. - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numStages, pCoeffs, pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros and then manually initialize the instance structure as follows: - *
    
- *arm_fir_lattice_instance_f32 S = {numStages, pState, pCoeffs};    
- *arm_fir_lattice_instance_q31 S = {numStages, pState, pCoeffs};    
- *arm_fir_lattice_instance_q15 S = {numStages, pState, pCoeffs};    
- * 
- * \par - * where numStages is the number of stages in the filter; pState is the address of the state buffer; - * pCoeffs is the address of the coefficient buffer. - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the FIR Lattice filter functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t *pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *px; /* temporary state pointer */ - float32_t *pk; /* temporary coefficient pointer */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t fcurr1, fnext1, gcurr1, gnext1; /* temporary variables for first sample in loop unrolling */ - float32_t fcurr2, fnext2, gnext2; /* temporary variables for second sample in loop unrolling */ - float32_t fcurr3, fnext3, gnext3; /* temporary variables for third sample in loop unrolling */ - float32_t fcurr4, fnext4, gnext4; /* temporary variables for fourth sample in loop unrolling */ - uint32_t numStages = S->numStages; /* Number of stages in the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - - gcurr1 = 0.0f; - pState = &S->pState[0]; - - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - - /* Read two samples from input buffer */ - /* f0(n) = x(n) */ - fcurr1 = *pSrc++; - fcurr2 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* Read g0(n-1) from state */ - gcurr1 = *px; - - /* Process first sample for first tap */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (fcurr1 * (*pk)) + gcurr1; - - /* Process second sample for first tap */ - /* for sample 2 processing */ - fnext2 = fcurr2 + ((*pk) * fcurr1); - gnext2 = (fcurr2 * (*pk)) + fcurr1; - - /* Read next two samples from input buffer */ - /* f0(n+2) = x(n+2) */ - fcurr3 = *pSrc++; - fcurr4 = *pSrc++; - - /* Copy only last input samples into the state buffer - which will be used for next four samples processing */ - *px++ = fcurr4; - - /* Process third sample for first tap */ - fnext3 = fcurr3 + ((*pk) * fcurr2); - gnext3 = (fcurr3 * (*pk)) + fcurr2; - - /* Process fourth sample for first tap */ - fnext4 = fcurr4 + ((*pk) * fcurr3); - gnext4 = (fcurr4 * (*pk++)) + fcurr3; - - /* Update of f values for next coefficient set processing */ - fcurr1 = fnext1; - fcurr2 = fnext2; - fcurr3 = fnext3; - fcurr4 = fnext4; - - /* Loop unrolling. Process 4 taps at a time . */ - stageCnt = (numStages - 1u) >> 2u; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numStages-3 coefficients. */ - - /* Process 2nd, 3rd, 4th and 5th taps ... here */ - while(stageCnt > 0u) - { - /* Read g1(n-1), g3(n-1) .... from state */ - gcurr1 = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext4; - - /* Process first sample for 2nd, 6th .. tap */ - /* Sample processing for K2, K6.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - /* Process second sample for 2nd, 6th .. tap */ - /* for sample 2 processing */ - fnext2 = fcurr2 + ((*pk) * gnext1); - /* Process third sample for 2nd, 6th .. tap */ - fnext3 = fcurr3 + ((*pk) * gnext2); - /* Process fourth sample for 2nd, 6th .. tap */ - fnext4 = fcurr4 + ((*pk) * gnext3); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - /* Calculation of state values for next stage */ - gnext4 = (fcurr4 * (*pk)) + gnext3; - gnext3 = (fcurr3 * (*pk)) + gnext2; - gnext2 = (fcurr2 * (*pk)) + gnext1; - gnext1 = (fcurr1 * (*pk++)) + gcurr1; - - - /* Read g2(n-1), g4(n-1) .... from state */ - gcurr1 = *px; - - /* save g2(n) in state buffer */ - *px++ = gnext4; - - /* Sample processing for K3, K7.... */ - /* Process first sample for 3rd, 7th .. tap */ - /* f3(n) = f2(n) + K3 * g2(n-1) */ - fcurr1 = fnext1 + ((*pk) * gcurr1); - /* Process second sample for 3rd, 7th .. tap */ - fcurr2 = fnext2 + ((*pk) * gnext1); - /* Process third sample for 3rd, 7th .. tap */ - fcurr3 = fnext3 + ((*pk) * gnext2); - /* Process fourth sample for 3rd, 7th .. tap */ - fcurr4 = fnext4 + ((*pk) * gnext3); - - /* Calculation of state values for next stage */ - /* g3(n) = f2(n) * K3 + g2(n-1) */ - gnext4 = (fnext4 * (*pk)) + gnext3; - gnext3 = (fnext3 * (*pk)) + gnext2; - gnext2 = (fnext2 * (*pk)) + gnext1; - gnext1 = (fnext1 * (*pk++)) + gcurr1; - - - /* Read g1(n-1), g3(n-1) .... from state */ - gcurr1 = *px; - - /* save g3(n) in state buffer */ - *px++ = gnext4; - - /* Sample processing for K4, K8.... */ - /* Process first sample for 4th, 8th .. tap */ - /* f4(n) = f3(n) + K4 * g3(n-1) */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - /* Process second sample for 4th, 8th .. tap */ - /* for sample 2 processing */ - fnext2 = fcurr2 + ((*pk) * gnext1); - /* Process third sample for 4th, 8th .. tap */ - fnext3 = fcurr3 + ((*pk) * gnext2); - /* Process fourth sample for 4th, 8th .. tap */ - fnext4 = fcurr4 + ((*pk) * gnext3); - - /* g4(n) = f3(n) * K4 + g3(n-1) */ - /* Calculation of state values for next stage */ - gnext4 = (fcurr4 * (*pk)) + gnext3; - gnext3 = (fcurr3 * (*pk)) + gnext2; - gnext2 = (fcurr2 * (*pk)) + gnext1; - gnext1 = (fcurr1 * (*pk++)) + gcurr1; - - /* Read g2(n-1), g4(n-1) .... from state */ - gcurr1 = *px; - - /* save g4(n) in state buffer */ - *px++ = gnext4; - - /* Sample processing for K5, K9.... */ - /* Process first sample for 5th, 9th .. tap */ - /* f5(n) = f4(n) + K5 * g4(n-1) */ - fcurr1 = fnext1 + ((*pk) * gcurr1); - /* Process second sample for 5th, 9th .. tap */ - fcurr2 = fnext2 + ((*pk) * gnext1); - /* Process third sample for 5th, 9th .. tap */ - fcurr3 = fnext3 + ((*pk) * gnext2); - /* Process fourth sample for 5th, 9th .. tap */ - fcurr4 = fnext4 + ((*pk) * gnext3); - - /* Calculation of state values for next stage */ - /* g5(n) = f4(n) * K5 + g4(n-1) */ - gnext4 = (fnext4 * (*pk)) + gnext3; - gnext3 = (fnext3 * (*pk)) + gnext2; - gnext2 = (fnext2 * (*pk)) + gnext1; - gnext1 = (fnext1 * (*pk++)) + gcurr1; - - stageCnt--; - } - - /* If the (filter length -1) is not a multiple of 4, compute the remaining filter taps */ - stageCnt = (numStages - 1u) % 0x4u; - - while(stageCnt > 0u) - { - gcurr1 = *px; - - /* save g value in state buffer */ - *px++ = gnext4; - - /* Process four samples for last three taps here */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - fnext2 = fcurr2 + ((*pk) * gnext1); - fnext3 = fcurr3 + ((*pk) * gnext2); - fnext4 = fcurr4 + ((*pk) * gnext3); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext4 = (fcurr4 * (*pk)) + gnext3; - gnext3 = (fcurr3 * (*pk)) + gnext2; - gnext2 = (fcurr2 * (*pk)) + gnext1; - gnext1 = (fcurr1 * (*pk++)) + gcurr1; - - /* Update of f values for next coefficient set processing */ - fcurr1 = fnext1; - fcurr2 = fnext2; - fcurr3 = fnext3; - fcurr4 = fnext4; - - stageCnt--; - - } - - /* The results in the 4 accumulators, store in the destination buffer. */ - /* y(n) = fN(n) */ - *pDst++ = fcurr1; - *pDst++ = fcurr2; - *pDst++ = fcurr3; - *pDst++ = fcurr4; - - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurr1 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g2(n) from state buffer */ - gcurr1 = *px; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (fcurr1 * (*pk++)) + gcurr1; - - /* save g1(n) in state buffer */ - *px++ = fcurr1; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* read g2(n) from state buffer */ - gcurr1 = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext1; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext1 = fcurr1 + ((*pk) * gcurr1); - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext1 = (fcurr1 * (*pk++)) + gcurr1; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = fcurr1; - - blkCnt--; - - } - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t fcurr, fnext, gcurr, gnext; /* temporary variables */ - uint32_t numStages = S->numStages; /* Length of the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - - pState = &S->pState[0]; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize coeff pointer */ - pk = pCoeffs; - - /* Initialize state pointer */ - px = pState; - - /* read g0(n-1) from state buffer */ - gcurr = *px; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext = fcurr + ((*pk) * gcurr); - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext = (fcurr * (*pk++)) + gcurr; - - /* save f0(n) in state buffer */ - *px++ = fcurr; - - /* f1(n) is saved in fcurr - for next stage processing */ - fcurr = fnext; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* read g2(n) from state buffer */ - gcurr = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext = fcurr + ((*pk) * gcurr); - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext = (fcurr * (*pk++)) + gcurr; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr = fnext; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = fcurr; - - blkCnt--; - - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c deleted file mode 100644 index 99862ca..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c +++ /dev/null @@ -1,83 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_init_f32.c -* -* Description: Floating-point FIR Lattice filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - -void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always numStages */ - memset(pState, 0, (numStages) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c deleted file mode 100644 index b248cea..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c +++ /dev/null @@ -1,83 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_init_q15.c -* -* Description: Q15 FIR Lattice filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - -void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always numStages */ - memset(pState, 0, (numStages) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c deleted file mode 100644 index 89fb0e9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c +++ /dev/null @@ -1,83 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_init_q31.c -* -* Description: Q31 FIR lattice filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - -void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always numStages */ - memset(pState, 0, (numStages) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c deleted file mode 100644 index 1d8d6f1..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c +++ /dev/null @@ -1,536 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_q15.c -* -* Description: Q15 FIR lattice filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - - -/** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *px; /* temporary state pointer */ - q15_t *pk; /* temporary coefficient pointer */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t fcurnt1, fnext1, gcurnt1 = 0, gnext1; /* temporary variables for first sample in loop unrolling */ - q31_t fcurnt2, fnext2, gnext2; /* temporary variables for second sample in loop unrolling */ - q31_t fcurnt3, fnext3, gnext3; /* temporary variables for third sample in loop unrolling */ - q31_t fcurnt4, fnext4, gnext4; /* temporary variables for fourth sample in loop unrolling */ - uint32_t numStages = S->numStages; /* Number of stages in the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - - pState = &S->pState[0]; - - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - - /* Read two samples from input buffer */ - /* f0(n) = x(n) */ - fcurnt1 = *pSrc++; - fcurnt2 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* Read g0(n-1) from state */ - gcurnt1 = *px; - - /* Process first sample for first tap */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (q31_t) ((fcurnt1 * (*pk)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - /* Process second sample for first tap */ - /* for sample 2 processing */ - fnext2 = (q31_t) ((fcurnt1 * (*pk)) >> 15u) + fcurnt2; - fnext2 = __SSAT(fnext2, 16); - - gnext2 = (q31_t) ((fcurnt2 * (*pk)) >> 15u) + fcurnt1; - gnext2 = __SSAT(gnext2, 16); - - - /* Read next two samples from input buffer */ - /* f0(n+2) = x(n+2) */ - fcurnt3 = *pSrc++; - fcurnt4 = *pSrc++; - - /* Copy only last input samples into the state buffer - which is used for next four samples processing */ - *px++ = (q15_t) fcurnt4; - - /* Process third sample for first tap */ - fnext3 = (q31_t) ((fcurnt2 * (*pk)) >> 15u) + fcurnt3; - fnext3 = __SSAT(fnext3, 16); - gnext3 = (q31_t) ((fcurnt3 * (*pk)) >> 15u) + fcurnt2; - gnext3 = __SSAT(gnext3, 16); - - /* Process fourth sample for first tap */ - fnext4 = (q31_t) ((fcurnt3 * (*pk)) >> 15u) + fcurnt4; - fnext4 = __SSAT(fnext4, 16); - gnext4 = (q31_t) ((fcurnt4 * (*pk++)) >> 15u) + fcurnt3; - gnext4 = __SSAT(gnext4, 16); - - /* Update of f values for next coefficient set processing */ - fcurnt1 = fnext1; - fcurnt2 = fnext2; - fcurnt3 = fnext3; - fcurnt4 = fnext4; - - - /* Loop unrolling. Process 4 taps at a time . */ - stageCnt = (numStages - 1u) >> 2; - - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numStages-3 coefficients. */ - - /* Process 2nd, 3rd, 4th and 5th taps ... here */ - while(stageCnt > 0u) - { - /* Read g1(n-1), g3(n-1) .... from state */ - gcurnt1 = *px; - - /* save g1(n) in state buffer */ - *px++ = (q15_t) gnext4; - - /* Process first sample for 2nd, 6th .. tap */ - /* Sample processing for K2, K6.... */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - - - /* Process second sample for 2nd, 6th .. tap */ - /* for sample 2 processing */ - fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15u) + fcurnt2; - fnext2 = __SSAT(fnext2, 16); - /* Process third sample for 2nd, 6th .. tap */ - fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15u) + fcurnt3; - fnext3 = __SSAT(fnext3, 16); - /* Process fourth sample for 2nd, 6th .. tap */ - /* fnext4 = fcurnt4 + (*pk) * gnext3; */ - fnext4 = (q31_t) ((gnext3 * (*pk)) >> 15u) + fcurnt4; - fnext4 = __SSAT(fnext4, 16); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - /* Calculation of state values for next stage */ - gnext4 = (q31_t) ((fcurnt4 * (*pk)) >> 15u) + gnext3; - gnext4 = __SSAT(gnext4, 16); - gnext3 = (q31_t) ((fcurnt3 * (*pk)) >> 15u) + gnext2; - gnext3 = __SSAT(gnext3, 16); - - gnext2 = (q31_t) ((fcurnt2 * (*pk)) >> 15u) + gnext1; - gnext2 = __SSAT(gnext2, 16); - - gnext1 = (q31_t) ((fcurnt1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - - /* Read g2(n-1), g4(n-1) .... from state */ - gcurnt1 = *px; - - /* save g1(n) in state buffer */ - *px++ = (q15_t) gnext4; - - /* Sample processing for K3, K7.... */ - /* Process first sample for 3rd, 7th .. tap */ - /* f3(n) = f2(n) + K3 * g2(n-1) */ - fcurnt1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fnext1; - fcurnt1 = __SSAT(fcurnt1, 16); - - /* Process second sample for 3rd, 7th .. tap */ - fcurnt2 = (q31_t) ((gnext1 * (*pk)) >> 15u) + fnext2; - fcurnt2 = __SSAT(fcurnt2, 16); - - /* Process third sample for 3rd, 7th .. tap */ - fcurnt3 = (q31_t) ((gnext2 * (*pk)) >> 15u) + fnext3; - fcurnt3 = __SSAT(fcurnt3, 16); - - /* Process fourth sample for 3rd, 7th .. tap */ - fcurnt4 = (q31_t) ((gnext3 * (*pk)) >> 15u) + fnext4; - fcurnt4 = __SSAT(fcurnt4, 16); - - /* Calculation of state values for next stage */ - /* g3(n) = f2(n) * K3 + g2(n-1) */ - gnext4 = (q31_t) ((fnext4 * (*pk)) >> 15u) + gnext3; - gnext4 = __SSAT(gnext4, 16); - - gnext3 = (q31_t) ((fnext3 * (*pk)) >> 15u) + gnext2; - gnext3 = __SSAT(gnext3, 16); - - gnext2 = (q31_t) ((fnext2 * (*pk)) >> 15u) + gnext1; - gnext2 = __SSAT(gnext2, 16); - - gnext1 = (q31_t) ((fnext1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - /* Read g1(n-1), g3(n-1) .... from state */ - gcurnt1 = *px; - - /* save g1(n) in state buffer */ - *px++ = (q15_t) gnext4; - - /* Sample processing for K4, K8.... */ - /* Process first sample for 4th, 8th .. tap */ - /* f4(n) = f3(n) + K4 * g3(n-1) */ - fnext1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - - /* Process second sample for 4th, 8th .. tap */ - /* for sample 2 processing */ - fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15u) + fcurnt2; - fnext2 = __SSAT(fnext2, 16); - - /* Process third sample for 4th, 8th .. tap */ - fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15u) + fcurnt3; - fnext3 = __SSAT(fnext3, 16); - - /* Process fourth sample for 4th, 8th .. tap */ - fnext4 = (q31_t) ((gnext3 * (*pk)) >> 15u) + fcurnt4; - fnext4 = __SSAT(fnext4, 16); - - /* g4(n) = f3(n) * K4 + g3(n-1) */ - /* Calculation of state values for next stage */ - gnext4 = (q31_t) ((fcurnt4 * (*pk)) >> 15u) + gnext3; - gnext4 = __SSAT(gnext4, 16); - - gnext3 = (q31_t) ((fcurnt3 * (*pk)) >> 15u) + gnext2; - gnext3 = __SSAT(gnext3, 16); - - gnext2 = (q31_t) ((fcurnt2 * (*pk)) >> 15u) + gnext1; - gnext2 = __SSAT(gnext2, 16); - gnext1 = (q31_t) ((fcurnt1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - - /* Read g2(n-1), g4(n-1) .... from state */ - gcurnt1 = *px; - - /* save g4(n) in state buffer */ - *px++ = (q15_t) gnext4; - - /* Sample processing for K5, K9.... */ - /* Process first sample for 5th, 9th .. tap */ - /* f5(n) = f4(n) + K5 * g4(n-1) */ - fcurnt1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fnext1; - fcurnt1 = __SSAT(fcurnt1, 16); - - /* Process second sample for 5th, 9th .. tap */ - fcurnt2 = (q31_t) ((gnext1 * (*pk)) >> 15u) + fnext2; - fcurnt2 = __SSAT(fcurnt2, 16); - - /* Process third sample for 5th, 9th .. tap */ - fcurnt3 = (q31_t) ((gnext2 * (*pk)) >> 15u) + fnext3; - fcurnt3 = __SSAT(fcurnt3, 16); - - /* Process fourth sample for 5th, 9th .. tap */ - fcurnt4 = (q31_t) ((gnext3 * (*pk)) >> 15u) + fnext4; - fcurnt4 = __SSAT(fcurnt4, 16); - - /* Calculation of state values for next stage */ - /* g5(n) = f4(n) * K5 + g4(n-1) */ - gnext4 = (q31_t) ((fnext4 * (*pk)) >> 15u) + gnext3; - gnext4 = __SSAT(gnext4, 16); - gnext3 = (q31_t) ((fnext3 * (*pk)) >> 15u) + gnext2; - gnext3 = __SSAT(gnext3, 16); - gnext2 = (q31_t) ((fnext2 * (*pk)) >> 15u) + gnext1; - gnext2 = __SSAT(gnext2, 16); - gnext1 = (q31_t) ((fnext1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - stageCnt--; - } - - /* If the (filter length -1) is not a multiple of 4, compute the remaining filter taps */ - stageCnt = (numStages - 1u) % 0x4u; - - while(stageCnt > 0u) - { - gcurnt1 = *px; - - /* save g value in state buffer */ - *px++ = (q15_t) gnext4; - - /* Process four samples for last three taps here */ - fnext1 = (q31_t) ((gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - fnext2 = (q31_t) ((gnext1 * (*pk)) >> 15u) + fcurnt2; - fnext2 = __SSAT(fnext2, 16); - - fnext3 = (q31_t) ((gnext2 * (*pk)) >> 15u) + fcurnt3; - fnext3 = __SSAT(fnext3, 16); - - fnext4 = (q31_t) ((gnext3 * (*pk)) >> 15u) + fcurnt4; - fnext4 = __SSAT(fnext4, 16); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext4 = (q31_t) ((fcurnt4 * (*pk)) >> 15u) + gnext3; - gnext4 = __SSAT(gnext4, 16); - gnext3 = (q31_t) ((fcurnt3 * (*pk)) >> 15u) + gnext2; - gnext3 = __SSAT(gnext3, 16); - gnext2 = (q31_t) ((fcurnt2 * (*pk)) >> 15u) + gnext1; - gnext2 = __SSAT(gnext2, 16); - gnext1 = (q31_t) ((fcurnt1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - /* Update of f values for next coefficient set processing */ - fcurnt1 = fnext1; - fcurnt2 = fnext2; - fcurnt3 = fnext3; - fcurnt4 = fnext4; - - stageCnt--; - - } - - /* The results in the 4 accumulators, store in the destination buffer. */ - /* y(n) = fN(n) */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT(fcurnt1, fcurnt2, 16); - *__SIMD32(pDst)++ = __PKHBT(fcurnt3, fcurnt4, 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT(fcurnt2, fcurnt1, 16); - *__SIMD32(pDst)++ = __PKHBT(fcurnt4, fcurnt3, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurnt1 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g2(n) from state buffer */ - gcurnt1 = *px; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = (((q31_t) gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (((q31_t) fcurnt1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - /* save g1(n) in state buffer */ - *px++ = (q15_t) fcurnt1; - - /* f1(n) is saved in fcurnt1 - for next stage processing */ - fcurnt1 = fnext1; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* read g2(n) from state buffer */ - gcurnt1 = *px; - - /* save g1(n) in state buffer */ - *px++ = (q15_t) gnext1; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext1 = (((q31_t) gcurnt1 * (*pk)) >> 15u) + fcurnt1; - fnext1 = __SSAT(fnext1, 16); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext1 = (((q31_t) fcurnt1 * (*pk++)) >> 15u) + gcurnt1; - gnext1 = __SSAT(gnext1, 16); - - - /* f1(n) is saved in fcurnt1 - for next stage processing */ - fcurnt1 = fnext1; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = __SSAT(fcurnt1, 16); - - - blkCnt--; - - } - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t fcurnt, fnext, gcurnt, gnext; /* temporary variables */ - uint32_t numStages = S->numStages; /* Length of the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - - pState = &S->pState[0]; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurnt = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g0(n-1) from state buffer */ - gcurnt = *px; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext = ((gcurnt * (*pk)) >> 15u) + fcurnt; - fnext = __SSAT(fnext, 16); - - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext = ((fcurnt * (*pk++)) >> 15u) + gcurnt; - gnext = __SSAT(gnext, 16); - - /* save f0(n) in state buffer */ - *px++ = (q15_t) fcurnt; - - /* f1(n) is saved in fcurnt - for next stage processing */ - fcurnt = fnext; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* read g1(n-1) from state buffer */ - gcurnt = *px; - - /* save g0(n-1) in state buffer */ - *px++ = (q15_t) gnext; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext = ((gcurnt * (*pk)) >> 15u) + fcurnt; - fnext = __SSAT(fnext, 16); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext = ((fcurnt * (*pk++)) >> 15u) + gcurnt; - gnext = __SSAT(gnext, 16); - - - /* f1(n) is saved in fcurnt - for next stage processing */ - fcurnt = fnext; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = __SSAT(fcurnt, 16); - - - blkCnt--; - - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c deleted file mode 100644 index cc963f9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c +++ /dev/null @@ -1,353 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_lattice_q31.c -* -* Description: Q31 FIR lattice filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Lattice - * @{ - */ - - -/** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * In order to avoid overflows the input signal must be scaled down by 2*log2(numStages) bits. - */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *px; /* temporary state pointer */ - q31_t *pk; /* temporary coefficient pointer */ - q31_t fcurr1, fnext1, gcurr1 = 0, gnext1; /* temporary variables for first sample in loop unrolling */ - q31_t fcurr2, fnext2, gnext2; /* temporary variables for second sample in loop unrolling */ - uint32_t numStages = S->numStages; /* Length of the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - q31_t k; - - pState = &S->pState[0]; - - blkCnt = blockSize >> 1u; - - /* First part of the processing with loop unrolling. Compute 2 outputs at a time. - a second loop below computes the remaining 1 sample. */ - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurr1 = *pSrc++; - - /* f0(n) = x(n) */ - fcurr2 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g0(n - 1) from state buffer */ - gcurr1 = *px; - - /* Read the reflection coefficient */ - k = *pk++; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = (q31_t) (((q63_t) gcurr1 * k) >> 32); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (q31_t) (((q63_t) fcurr1 * (k)) >> 32); - fnext1 = fcurr1 + (fnext1 << 1u); - gnext1 = gcurr1 + (gnext1 << 1u); - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext2 = (q31_t) (((q63_t) fcurr1 * k) >> 32); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext2 = (q31_t) (((q63_t) fcurr2 * (k)) >> 32); - fnext2 = fcurr2 + (fnext2 << 1u); - gnext2 = fcurr1 + (gnext2 << 1u); - - /* save g1(n) in state buffer */ - *px++ = fcurr2; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - fcurr2 = fnext2; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - - /* Read the reflection coefficient */ - k = *pk++; - - /* read g2(n) from state buffer */ - gcurr1 = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext2; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext1 = (q31_t) (((q63_t) gcurr1 * k) >> 32); - fnext2 = (q31_t) (((q63_t) gnext1 * k) >> 32); - - fnext1 = fcurr1 + (fnext1 << 1u); - fnext2 = fcurr2 + (fnext2 << 1u); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext2 = (q31_t) (((q63_t) fcurr2 * (k)) >> 32); - gnext2 = gnext1 + (gnext2 << 1u); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext1 = (q31_t) (((q63_t) fcurr1 * (k)) >> 32); - gnext1 = gcurr1 + (gnext1 << 1u); - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - fcurr2 = fnext2; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = fcurr1; - *pDst++ = fcurr2; - - blkCnt--; - - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x2u; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurr1 = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g0(n - 1) from state buffer */ - gcurr1 = *px; - - /* Read the reflection coefficient */ - k = *pk++; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext1 = (q31_t) (((q63_t) gcurr1 * k) >> 32); - fnext1 = fcurr1 + (fnext1 << 1u); - - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext1 = (q31_t) (((q63_t) fcurr1 * (k)) >> 32); - gnext1 = gcurr1 + (gnext1 << 1u); - - /* save g1(n) in state buffer */ - *px++ = fcurr1; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* Read the reflection coefficient */ - k = *pk++; - - /* read g2(n) from state buffer */ - gcurr1 = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext1; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext1 = (q31_t) (((q63_t) gcurr1 * k) >> 32); - fnext1 = fcurr1 + (fnext1 << 1u); - - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext1 = (q31_t) (((q63_t) fcurr1 * (k)) >> 32); - gnext1 = gcurr1 + (gnext1 << 1u); - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr1 = fnext1; - - stageCnt--; - - } - - - /* y(n) = fN(n) */ - *pDst++ = fcurr1; - - blkCnt--; - - } - - -} - - -#else - -/* Run the below code for Cortex-M0 */ - -void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *px; /* temporary state pointer */ - q31_t *pk; /* temporary coefficient pointer */ - q31_t fcurr, fnext, gcurr, gnext; /* temporary variables */ - uint32_t numStages = S->numStages; /* Length of the filter */ - uint32_t blkCnt, stageCnt; /* temporary variables for counts */ - - pState = &S->pState[0]; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* f0(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize coeff pointer */ - pk = (pCoeffs); - - /* Initialize state pointer */ - px = pState; - - /* read g0(n-1) from state buffer */ - gcurr = *px; - - /* for sample 1 processing */ - /* f1(n) = f0(n) + K1 * g0(n-1) */ - fnext = (q31_t) (((q63_t) gcurr * (*pk)) >> 31) + fcurr; - /* g1(n) = f0(n) * K1 + g0(n-1) */ - gnext = (q31_t) (((q63_t) fcurr * (*pk++)) >> 31) + gcurr; - /* save g1(n) in state buffer */ - *px++ = fcurr; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr = fnext; - - stageCnt = (numStages - 1u); - - /* stage loop */ - while(stageCnt > 0u) - { - /* read g2(n) from state buffer */ - gcurr = *px; - - /* save g1(n) in state buffer */ - *px++ = gnext; - - /* Sample processing for K2, K3.... */ - /* f2(n) = f1(n) + K2 * g1(n-1) */ - fnext = (q31_t) (((q63_t) gcurr * (*pk)) >> 31) + fcurr; - /* g2(n) = f1(n) * K2 + g1(n-1) */ - gnext = (q31_t) (((q63_t) fcurr * (*pk++)) >> 31) + gcurr; - - /* f1(n) is saved in fcurr1 - for next stage processing */ - fcurr = fnext; - - stageCnt--; - - } - - /* y(n) = fN(n) */ - *pDst++ = fcurr; - - blkCnt--; - - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -/** - * @} end of FIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c deleted file mode 100644 index f3c595f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c +++ /dev/null @@ -1,691 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_q15.c -* -* Description: Q15 FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @brief Processing function for the Q15 FIR filter. - * @param[in] *S points to an instance of the Q15 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, state buffers should be aligned by 32-bit - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - * - * \par - * Refer to the function arm_fir_fast_q15() for a faster but less precise implementation of this function. - */ - -#ifndef ARM_MATH_CM0_FAMILY - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - -void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px1; /* Temporary q15 pointer for state buffer */ - q15_t *pb; /* Temporary pointer for coefficient buffer */ - q31_t x0, x1, x2, x3, c0; /* Temporary variables to hold SIMD state and coefficient values */ - q63_t acc0, acc1, acc2, acc3; /* Accumulators */ - uint32_t numTaps = S->numTaps; /* Number of taps in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer. - ** Use 32-bit SIMD to move the 16-bit data. Only requires two copies. */ - *__SIMD32(pStateCurnt)++ = *__SIMD32(pSrc)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pSrc)++; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Initialize state pointer of type q15 */ - px1 = pState; - - /* Initialize coeff pointer of type q31 */ - pb = pCoeffs; - - /* Read the first two samples from the state buffer: x[n-N], x[n-N-1] */ - x0 = _SIMD32_OFFSET(px1); - - /* Read the third and forth samples from the state buffer: x[n-N-1], x[n-N-2] */ - x1 = _SIMD32_OFFSET(px1 + 1u); - - px1 += 2u; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-4 coefficients. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - /* Read the first two coefficients using SIMD: b[N] and b[N-1] coefficients */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ - acc0 = __SMLALD(x0, c0, acc0); - - /* acc1 += b[N] * x[n-N-1] + b[N-1] * x[n-N-2] */ - acc1 = __SMLALD(x1, c0, acc1); - - /* Read state x[n-N-2], x[n-N-3] */ - x2 = _SIMD32_OFFSET(px1); - - /* Read state x[n-N-3], x[n-N-4] */ - x3 = _SIMD32_OFFSET(px1 + 1u); - - /* acc2 += b[N] * x[n-N-2] + b[N-1] * x[n-N-3] */ - acc2 = __SMLALD(x2, c0, acc2); - - /* acc3 += b[N] * x[n-N-3] + b[N-1] * x[n-N-4] */ - acc3 = __SMLALD(x3, c0, acc3); - - /* Read coefficients b[N-2], b[N-3] */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N-2] * x[n-N-2] + b[N-3] * x[n-N-3] */ - acc0 = __SMLALD(x2, c0, acc0); - - /* acc1 += b[N-2] * x[n-N-3] + b[N-3] * x[n-N-4] */ - acc1 = __SMLALD(x3, c0, acc1); - - /* Read state x[n-N-4], x[n-N-5] */ - x0 = _SIMD32_OFFSET(px1 + 2u); - - /* Read state x[n-N-5], x[n-N-6] */ - x1 = _SIMD32_OFFSET(px1 + 3u); - - /* acc2 += b[N-2] * x[n-N-4] + b[N-3] * x[n-N-5] */ - acc2 = __SMLALD(x0, c0, acc2); - - /* acc3 += b[N-2] * x[n-N-5] + b[N-3] * x[n-N-6] */ - acc3 = __SMLALD(x1, c0, acc3); - - px1 += 4u; - - tapCnt--; - - } - - - /* If the filter length is not a multiple of 4, compute the remaining filter taps. - ** This is always be 2 taps since the filter length is even. */ - if((numTaps & 0x3u) != 0u) - { - /* Read 2 coefficients */ - c0 = *__SIMD32(pb)++; - - /* Fetch 4 state variables */ - x2 = _SIMD32_OFFSET(px1); - - x3 = _SIMD32_OFFSET(px1 + 1u); - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - - px1 += 2u; - - acc1 = __SMLALD(x1, c0, acc1); - acc2 = __SMLALD(x2, c0, acc2); - acc3 = __SMLALD(x3, c0, acc3); - } - - /* The results in the 4 accumulators are in 2.30 format. Convert to 1.15 with saturation. - ** Then store the 4 outputs in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - while(blkCnt > 0u) - { - /* Copy two samples into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Initialize state pointer of type q15 */ - px1 = pState; - - /* Initialize coeff pointer of type q31 */ - pb = pCoeffs; - - tapCnt = numTaps >> 1; - - do - { - - c0 = *__SIMD32(pb)++; - x0 = *__SIMD32(px1)++; - - acc0 = __SMLALD(x0, c0, acc0); - tapCnt--; - } - while(tapCnt > 0u); - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Calculation of count for copying integer writes */ - tapCnt = (numTaps - 1u) >> 2; - - while(tapCnt > 0u) - { - - /* Copy state values to start of state buffer */ - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - - tapCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* copy remaining data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - -#else /* UNALIGNED_SUPPORT_DISABLE */ - -void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q63_t acc0, acc1, acc2, acc3; /* Accumulators */ - q15_t *pb; /* Temporary pointer for coefficient buffer */ - q15_t *px; /* Temporary q31 pointer for SIMD state buffer accesses */ - q31_t x0, x1, x2, c0; /* Temporary variables to hold SIMD state and coefficient values */ - uint32_t numTaps = S->numTaps; /* Number of taps in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer. - ** Use 32-bit SIMD to move the 16-bit data. Only requires two copies. */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Typecast q15_t pointer to q31_t pointer for state reading in q31_t */ - px = pState; - - /* Typecast q15_t pointer to q31_t pointer for coefficient reading in q31_t */ - pb = pCoeffs; - - /* Read the first two samples from the state buffer: x[n-N], x[n-N-1] */ - x0 = *__SIMD32(px)++; - - /* Read the third and forth samples from the state buffer: x[n-N-2], x[n-N-3] */ - x2 = *__SIMD32(px)++; - - /* Loop over the number of taps. Unroll by a factor of 4. - ** Repeat until we've computed numTaps-(numTaps%4) coefficients. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0) - { - /* Read the first two coefficients using SIMD: b[N] and b[N-1] coefficients */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ - acc0 = __SMLALD(x0, c0, acc0); - - /* acc2 += b[N] * x[n-N-2] + b[N-1] * x[n-N-3] */ - acc2 = __SMLALD(x2, c0, acc2); - - /* pack x[n-N-1] and x[n-N-2] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* Read state x[n-N-4], x[n-N-5] */ - x0 = _SIMD32_OFFSET(px); - - /* acc1 += b[N] * x[n-N-1] + b[N-1] * x[n-N-2] */ - acc1 = __SMLALDX(x1, c0, acc1); - - /* pack x[n-N-3] and x[n-N-4] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x0, x2, 0); -#else - x1 = __PKHBT(x2, x0, 0); -#endif - - /* acc3 += b[N] * x[n-N-3] + b[N-1] * x[n-N-4] */ - acc3 = __SMLALDX(x1, c0, acc3); - - /* Read coefficients b[N-2], b[N-3] */ - c0 = *__SIMD32(pb)++; - - /* acc0 += b[N-2] * x[n-N-2] + b[N-3] * x[n-N-3] */ - acc0 = __SMLALD(x2, c0, acc0); - - /* Read state x[n-N-6], x[n-N-7] with offset */ - x2 = _SIMD32_OFFSET(px + 2u); - - /* acc2 += b[N-2] * x[n-N-4] + b[N-3] * x[n-N-5] */ - acc2 = __SMLALD(x0, c0, acc2); - - /* acc1 += b[N-2] * x[n-N-3] + b[N-3] * x[n-N-4] */ - acc1 = __SMLALDX(x1, c0, acc1); - - /* pack x[n-N-5] and x[n-N-6] */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* acc3 += b[N-2] * x[n-N-5] + b[N-3] * x[n-N-6] */ - acc3 = __SMLALDX(x1, c0, acc3); - - /* Update state pointer for next state reading */ - px += 4u; - - /* Decrement tap count */ - tapCnt--; - - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps. - ** This is always be 2 taps since the filter length is even. */ - if((numTaps & 0x3u) != 0u) - { - - /* Read last two coefficients */ - c0 = *__SIMD32(pb)++; - - /* Perform the multiply-accumulates */ - acc0 = __SMLALD(x0, c0, acc0); - acc2 = __SMLALD(x2, c0, acc2); - - /* pack state variables */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x2, x0, 0); -#else - x1 = __PKHBT(x0, x2, 0); -#endif - - /* Read last state variables */ - x0 = *__SIMD32(px); - - /* Perform the multiply-accumulates */ - acc1 = __SMLALDX(x1, c0, acc1); - - /* pack state variables */ -#ifndef ARM_MATH_BIG_ENDIAN - x1 = __PKHBT(x0, x2, 0); -#else - x1 = __PKHBT(x2, x0, 0); -#endif - - /* Perform the multiply-accumulates */ - acc3 = __SMLALDX(x1, c0, acc3); - } - - /* The results in the 4 accumulators are in 2.30 format. Convert to 1.15 with saturation. - ** Then store the 4 outputs in the destination buffer. */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc0 >> 15), 16), __SSAT((acc1 >> 15), 16), 16); - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc2 >> 15), 16), __SSAT((acc3 >> 15), 16), 16); - -#else - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc1 >> 15), 16), __SSAT((acc0 >> 15), 16), 16); - - *__SIMD32(pDst)++ = - __PKHBT(__SSAT((acc3 >> 15), 16), __SSAT((acc2 >> 15), 16), 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - while(blkCnt > 0u) - { - /* Copy two samples into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Use SIMD to hold states and coefficients */ - px = pState; - pb = pCoeffs; - - tapCnt = numTaps >> 1u; - - do - { - acc0 += (q31_t) * px++ * *pb++; - acc0 += (q31_t) * px++ * *pb++; - tapCnt--; - } - while(tapCnt > 0u); - - /* The result is in 2.30 format. Convert to 1.15 with saturation. - ** Then store the output in the destination buffer. */ - *pDst++ = (q15_t) (__SSAT((acc0 >> 15), 16)); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Calculation of count for copying integer writes */ - tapCnt = (numTaps - 1u) >> 2; - - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - tapCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* copy remaining data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#else /* ARM_MATH_CM0_FAMILY */ - - -/* Run the below code for Cortex-M0 */ - -void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - - - - q15_t *px; /* Temporary pointer for state buffer */ - q15_t *pb; /* Temporary pointer for coefficient buffer */ - q63_t acc; /* Accumulator */ - uint32_t numTaps = S->numTaps; /* Number of nTaps in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Initialize blkCnt with blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = pCoeffs; - - tapCnt = numTaps; - - /* Perform the multiply-accumulates */ - do - { - /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ - acc += (q31_t) * px++ * *pb++; - tapCnt--; - } while(tapCnt > 0u); - - /* The result is in 2.30 format. Convert to 1.15 - ** Then store the output in the destination buffer. */ - *pDst++ = (q15_t) __SSAT((acc >> 15u), 16); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the samples loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Copy numTaps number of values */ - tapCnt = (numTaps - 1u); - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c deleted file mode 100644 index af5707f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c +++ /dev/null @@ -1,365 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_q31.c -* -* Description: Q31 FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @param[in] *S points to an instance of the Q31 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by log2(numTaps) bits. - * After all multiply-accumulates are performed, the 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. - * - * \par - * Refer to the function arm_fir_fast_q31() for a faster but less precise implementation of this filter for Cortex-M3 and Cortex-M4. - */ - -void arm_fir_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t x0, x1, x2; /* Temporary variables to hold state */ - q31_t c0; /* Temporary variable to hold coefficient value */ - q31_t *px; /* Temporary pointer for state */ - q31_t *pb; /* Temporary pointer for coefficient buffer */ - q63_t acc0, acc1, acc2; /* Accumulators */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt, tapCntN3; /* Loop counters */ - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - blkCnt = blockSize / 3; - blockSize = blockSize - (3 * blkCnt); - - tapCnt = numTaps / 3; - tapCntN3 = numTaps - (3 * tapCnt); - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy three new input samples into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Read the first two samples from the state buffer: - * x[n-numTaps], x[n-numTaps-1] */ - x0 = *(px++); - x1 = *(px++); - - /* Loop unrolling. Process 3 taps at a time. */ - i = tapCnt; - - while(i > 0u) - { - /* Read the b[numTaps] coefficient */ - c0 = *pb; - - /* Read x[n-numTaps-2] sample */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += ((q63_t) x0 * c0); - acc1 += ((q63_t) x1 * c0); - acc2 += ((q63_t) x2 * c0); - - /* Read the coefficient and state */ - c0 = *(pb + 1u); - x0 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += ((q63_t) x1 * c0); - acc1 += ((q63_t) x2 * c0); - acc2 += ((q63_t) x0 * c0); - - /* Read the coefficient and state */ - c0 = *(pb + 2u); - x1 = *(px++); - - /* update coefficient pointer */ - pb += 3u; - - /* Perform the multiply-accumulates */ - acc0 += ((q63_t) x2 * c0); - acc1 += ((q63_t) x0 * c0); - acc2 += ((q63_t) x1 * c0); - - /* Decrement the loop counter */ - i--; - } - - /* If the filter length is not a multiple of 3, compute the remaining filter taps */ - - i = tapCntN3; - - while(i > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x2 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += ((q63_t) x0 * c0); - acc1 += ((q63_t) x1 * c0); - acc2 += ((q63_t) x2 * c0); - - /* Reuse the present sample states for next sample */ - x0 = x1; - x1 = x2; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 3 to process the next group of 3 samples */ - pState = pState + 3; - - /* The results in the 3 accumulators are in 2.30 format. Convert to 1.31 - ** Then store the 3 outputs in the destination buffer. */ - *pDst++ = (q31_t) (acc0 >> 31u); - *pDst++ = (q31_t) (acc1 >> 31u); - *pDst++ = (q31_t) (acc2 >> 31u); - - /* Decrement the samples loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 3, compute any remaining output samples here. - ** No loop unrolling is used. */ - - while(blockSize > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = (pCoeffs); - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - acc0 += (q63_t) * (px++) * (*(pb++)); - i--; - } while(i > 0u); - - /* The result is in 2.62 format. Convert to 1.31 - ** Then store the output in the destination buffer. */ - *pDst++ = (q31_t) (acc0 >> 31u); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the samples loop counter */ - blockSize--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - q31_t *px; /* Temporary pointer for state */ - q31_t *pb; /* Temporary pointer for coefficient buffer */ - q63_t acc; /* Accumulator */ - uint32_t numTaps = S->numTaps; /* Length of the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - - /* S->pState buffer contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Initialize blkCnt with blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = pCoeffs; - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ - acc += (q63_t) * px++ * *pb++; - i--; - } while(i > 0u); - - /* The result is in 2.62 format. Convert to 1.31 - ** Then store the output in the destination buffer. */ - *pDst++ = (q31_t) (acc >> 31u); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the samples loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the starting of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - /* Copy numTaps number of values */ - tapCnt = numTaps - 1u; - - /* Copy the data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c deleted file mode 100644 index 54a30e2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c +++ /dev/null @@ -1,397 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_q7.c -* -* Description: Q7 FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR - * @{ - */ - -/** - * @param[in] *S points to an instance of the Q7 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both coefficients and state variables are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * The accumulator is converted to 18.7 format by discarding the low 7 bits. - * Finally, the result is truncated to 1.7 format. - */ - -void arm_fir_q7( - const arm_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t *pState = S->pState; /* State pointer */ - q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q7_t *pStateCurnt; /* Points to the current sample of the state */ - q7_t x0, x1, x2, x3; /* Temporary variables to hold state */ - q7_t c0; /* Temporary variable to hold coefficient value */ - q7_t *px; /* Temporary pointer for state */ - q7_t *pb; /* Temporary pointer for coefficient buffer */ - q31_t acc0, acc1, acc2, acc3; /* Accumulators */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t i, tapCnt, blkCnt; /* Loop counters */ - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Apply loop unrolling and compute 4 output values simultaneously. - * The variables acc0 ... acc3 hold output values that are being computed: - * - * acc0 = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] - * acc1 = b[numTaps-1] * x[n-numTaps] + b[numTaps-2] * x[n-numTaps-1] + b[numTaps-3] * x[n-numTaps-2] +...+ b[0] * x[1] - * acc2 = b[numTaps-1] * x[n-numTaps+1] + b[numTaps-2] * x[n-numTaps] + b[numTaps-3] * x[n-numTaps-1] +...+ b[0] * x[2] - * acc3 = b[numTaps-1] * x[n-numTaps+2] + b[numTaps-2] * x[n-numTaps+1] + b[numTaps-3] * x[n-numTaps] +...+ b[0] * x[3] - */ - blkCnt = blockSize >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Copy four new input samples into the state buffer */ - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - *pStateCurnt++ = *pSrc++; - - /* Set all accumulators to zero */ - acc0 = 0; - acc1 = 0; - acc2 = 0; - acc3 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Read the first three samples from the state buffer: - * x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2] */ - x0 = *(px++); - x1 = *(px++); - x2 = *(px++); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - i = tapCnt; - - while(i > 0u) - { - /* Read the b[numTaps] coefficient */ - c0 = *pb; - - /* Read x[n-numTaps-3] sample */ - x3 = *px; - - /* acc0 += b[numTaps] * x[n-numTaps] */ - acc0 += ((q15_t) x0 * c0); - - /* acc1 += b[numTaps] * x[n-numTaps-1] */ - acc1 += ((q15_t) x1 * c0); - - /* acc2 += b[numTaps] * x[n-numTaps-2] */ - acc2 += ((q15_t) x2 * c0); - - /* acc3 += b[numTaps] * x[n-numTaps-3] */ - acc3 += ((q15_t) x3 * c0); - - /* Read the b[numTaps-1] coefficient */ - c0 = *(pb + 1u); - - /* Read x[n-numTaps-4] sample */ - x0 = *(px + 1u); - - /* Perform the multiply-accumulates */ - acc0 += ((q15_t) x1 * c0); - acc1 += ((q15_t) x2 * c0); - acc2 += ((q15_t) x3 * c0); - acc3 += ((q15_t) x0 * c0); - - /* Read the b[numTaps-2] coefficient */ - c0 = *(pb + 2u); - - /* Read x[n-numTaps-5] sample */ - x1 = *(px + 2u); - - /* Perform the multiply-accumulates */ - acc0 += ((q15_t) x2 * c0); - acc1 += ((q15_t) x3 * c0); - acc2 += ((q15_t) x0 * c0); - acc3 += ((q15_t) x1 * c0); - - /* Read the b[numTaps-3] coefficients */ - c0 = *(pb + 3u); - - /* Read x[n-numTaps-6] sample */ - x2 = *(px + 3u); - - /* Perform the multiply-accumulates */ - acc0 += ((q15_t) x3 * c0); - acc1 += ((q15_t) x0 * c0); - acc2 += ((q15_t) x1 * c0); - acc3 += ((q15_t) x2 * c0); - - /* update coefficient pointer */ - pb += 4u; - px += 4u; - - /* Decrement the loop counter */ - i--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - - i = numTaps - (tapCnt * 4u); - while(i > 0u) - { - /* Read coefficients */ - c0 = *(pb++); - - /* Fetch 1 state variable */ - x3 = *(px++); - - /* Perform the multiply-accumulates */ - acc0 += ((q15_t) x0 * c0); - acc1 += ((q15_t) x1 * c0); - acc2 += ((q15_t) x2 * c0); - acc3 += ((q15_t) x3 * c0); - - /* Reuse the present sample states for next sample */ - x0 = x1; - x1 = x2; - x2 = x3; - - /* Decrement the loop counter */ - i--; - } - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 4; - - /* The results in the 4 accumulators are in 2.62 format. Convert to 1.31 - ** Then store the 4 outputs in the destination buffer. */ - acc0 = __SSAT((acc0 >> 7u), 8); - *pDst++ = acc0; - acc1 = __SSAT((acc1 >> 7u), 8); - *pDst++ = acc1; - acc2 = __SSAT((acc2 >> 7u), 8); - *pDst++ = acc2; - acc3 = __SSAT((acc3 >> 7u), 8); - *pDst++ = acc3; - - /* Decrement the samples loop counter */ - blkCnt--; - } - - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 4u; - - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set the accumulator to zero */ - acc0 = 0; - - /* Initialize state pointer */ - px = pState; - - /* Initialize Coefficient pointer */ - pb = (pCoeffs); - - i = numTaps; - - /* Perform the multiply-accumulates */ - do - { - acc0 += (q15_t) * (px++) * (*(pb++)); - i--; - } while(i > 0u); - - /* The result is in 2.14 format. Convert to 1.7 - ** Then store the output in the destination buffer. */ - *pDst++ = __SSAT((acc0 >> 7u), 8); - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the samples loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - uint32_t numTaps = S->numTaps; /* Number of taps in the filter */ - uint32_t i, blkCnt; /* Loop counters */ - q7_t *pState = S->pState; /* State pointer */ - q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q7_t *px, *pb; /* Temporary pointers to state and coeff */ - q31_t acc = 0; /* Accumlator */ - q7_t *pStateCurnt; /* Points to the current sample of the state */ - - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = S->pState + (numTaps - 1u); - - /* Initialize blkCnt with blockSize */ - blkCnt = blockSize; - - /* Perform filtering upto BlockSize - BlockSize%4 */ - while(blkCnt > 0u) - { - /* Copy one sample at a time into state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Set accumulator to zero */ - acc = 0; - - /* Initialize state pointer of type q7 */ - px = pState; - - /* Initialize coeff pointer of type q7 */ - pb = pCoeffs; - - - i = numTaps; - - while(i > 0u) - { - /* acc = b[numTaps-1] * x[n-numTaps-1] + b[numTaps-2] * x[n-numTaps-2] + b[numTaps-3] * x[n-numTaps-3] +...+ b[0] * x[0] */ - acc += (q15_t) * px++ * *pb++; - i--; - } - - /* Store the 1.7 format filter output in destination buffer */ - *pDst++ = (q7_t) __SSAT((acc >> 7), 8); - - /* Advance the state pointer by 1 to process the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. - ** Now copy the last numTaps - 1 samples to the satrt of the state buffer. - ** This prepares the state buffer for the next function call. */ - - - /* Points to the start of the state buffer */ - pStateCurnt = S->pState; - - - /* Copy numTaps number of values */ - i = (numTaps - 1u); - - /* Copy q7_t data */ - while(i > 0u) - { - *pStateCurnt++ = *pState++; - i--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c deleted file mode 100644 index a08b921..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c +++ /dev/null @@ -1,444 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_f32.c -* -* Description: Floating-point sparse FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup FIR_Sparse Finite Impulse Response (FIR) Sparse Filters - * - * This group of functions implements sparse FIR filters. - * Sparse FIR filters are equivalent to standard FIR filters except that most of the coefficients are equal to zero. - * Sparse filters are used for simulating reflections in communications and audio applications. - * - * There are separate functions for Q7, Q15, Q31, and floating-point data types. - * The functions operate on blocks of input and output data and each call to the function processes - * blockSize samples through the filter. pSrc and - * pDst points to input and output arrays respectively containing blockSize values. - * - * \par Algorithm: - * The sparse filter instant structure contains an array of tap indices pTapDelay which specifies the locations of the non-zero coefficients. - * This is in addition to the coefficient array b. - * The implementation essentially skips the multiplications by zero and leads to an efficient realization. - *
   
- *     y[n] = b[0] * x[n-pTapDelay[0]] + b[1] * x[n-pTapDelay[1]] + b[2] * x[n-pTapDelay[2]] + ...+ b[numTaps-1] * x[n-pTapDelay[numTaps-1]]    
- * 
- * \par - * \image html FIRSparse.gif "Sparse FIR filter. b[n] represents the filter coefficients" - * \par - * pCoeffs points to a coefficient array of size numTaps; - * pTapDelay points to an array of nonzero indices and is also of size numTaps; - * pState points to a state array of size maxDelay + blockSize, where - * maxDelay is the largest offset value that is ever used in the pTapDelay array. - * Some of the processing functions also require temporary working buffers. - * - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient and offset arrays may be shared among several instances while state variable arrays cannot be shared. - * There are separate instance structure declarations for each of the 4 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numTaps, pCoeffs, pTapDelay, maxDelay, stateIndex, pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros before static initialization. - * The code below statically initializes each of the 4 different data type filter instance structures - *
    
- *arm_fir_sparse_instance_f32 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};    
- *arm_fir_sparse_instance_q31 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};    
- *arm_fir_sparse_instance_q15 S = {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};    
- *arm_fir_sparse_instance_q7 S =  {numTaps, 0, pState, pCoeffs, maxDelay, pTapDelay};    
- * 
- * \par - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the sparse FIR filter functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - -void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize) -{ - - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *px; /* Scratch buffer pointer */ - float32_t *py = pState; /* Temporary pointers for state buffer */ - float32_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ - float32_t *pOut; /* Destination pointer */ - int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ - uint32_t delaySize = S->maxDelay + blockSize; /* state length */ - uint16_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - int32_t readIndex; /* Read index of the state buffer */ - uint32_t tapCnt, blkCnt; /* loop counters */ - float32_t coeff = *pCoeffs++; /* Read the first coefficient value */ - - - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, - (int32_t *) pSrc, 1, blockSize); - - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer */ - px = pb; - - /* Working pointer for destination buffer */ - pOut = pDst; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 Multiplications at a time. */ - blkCnt = blockSize >> 2u; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in destination buffer */ - *pOut++ = *px++ * coeff; - *pOut++ = *px++ * coeff; - *pOut++ = *px++ * coeff; - *pOut++ = *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in destination buffer */ - *pOut++ = *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer */ - px = pb; - - /* Working pointer for destination buffer */ - pOut = pDst; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer */ - px = pb; - - /* Working pointer for destination buffer */ - pOut = pDst; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - -/* Run the below code for Cortex-M0 */ - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in destination buffer */ - *pOut++ = *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer */ - px = pb; - - /* Working pointer for destination buffer */ - pOut = pDst; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = - ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer */ - px = pb; - - /* Working pointer for destination buffer */ - pOut = pDst; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pOut++ += *px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c deleted file mode 100644 index ea1f609..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c +++ /dev/null @@ -1,107 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_init_f32.c -* -* Description: Floating-point sparse FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - * - * Description: - * \par - * pCoeffs holds the filter coefficients and has length numTaps. - * pState holds the filter's state variables and must be of length - * maxDelay + blockSize, where maxDelay - * is the maximum number of delay line values. - * blockSize is the - * number of samples processed by the arm_fir_sparse_f32() function. - */ - -void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign TapDelay pointer */ - S->pTapDelay = pTapDelay; - - /* Assign MaxDelay */ - S->maxDelay = maxDelay; - - /* reset the stateIndex to 0 */ - S->stateIndex = 0u; - - /* Clear state buffer and size is always maxDelay + blockSize */ - memset(pState, 0, (maxDelay + blockSize) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c deleted file mode 100644 index b9dbc1f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c +++ /dev/null @@ -1,107 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_init_q15.c -* -* Description: Q15 sparse FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - * - * Description: - * \par - * pCoeffs holds the filter coefficients and has length numTaps. - * pState holds the filter's state variables and must be of length - * maxDelay + blockSize, where maxDelay - * is the maximum number of delay line values. - * blockSize is the - * number of words processed by arm_fir_sparse_q15() function. - */ - -void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign TapDelay pointer */ - S->pTapDelay = pTapDelay; - - /* Assign MaxDelay */ - S->maxDelay = maxDelay; - - /* reset the stateIndex to 0 */ - S->stateIndex = 0u; - - /* Clear state buffer and size is always maxDelay + blockSize */ - memset(pState, 0, (maxDelay + blockSize) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c deleted file mode 100644 index 37154e5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c +++ /dev/null @@ -1,106 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_init_q31.c -* -* Description: Q31 sparse FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - * - * Description: - * \par - * pCoeffs holds the filter coefficients and has length numTaps. - * pState holds the filter's state variables and must be of length - * maxDelay + blockSize, where maxDelay - * is the maximum number of delay line values. - * blockSize is the number of words processed by arm_fir_sparse_q31() function. - */ - -void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign TapDelay pointer */ - S->pTapDelay = pTapDelay; - - /* Assign MaxDelay */ - S->maxDelay = maxDelay; - - /* reset the stateIndex to 0 */ - S->stateIndex = 0u; - - /* Clear state buffer and size is always maxDelay + blockSize */ - memset(pState, 0, (maxDelay + blockSize) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c deleted file mode 100644 index 888de83..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c +++ /dev/null @@ -1,107 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_init_q7.c -* -* Description: Q7 sparse FIR filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - * - * Description: - * \par - * pCoeffs holds the filter coefficients and has length numTaps. - * pState holds the filter's state variables and must be of length - * maxDelay + blockSize, where maxDelay - * is the maximum number of delay line values. - * blockSize is the - * number of samples processed by the arm_fir_sparse_q7() function. - */ - -void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Assign TapDelay pointer */ - S->pTapDelay = pTapDelay; - - /* Assign MaxDelay */ - S->maxDelay = maxDelay; - - /* reset the stateIndex to 0 */ - S->stateIndex = 0u; - - /* Clear state buffer and size is always maxDelay + blockSize */ - memset(pState, 0, (maxDelay + blockSize) * sizeof(q7_t)); - - /* Assign state pointer */ - S->pState = pState; - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c deleted file mode 100644 index 9029ee4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c +++ /dev/null @@ -1,481 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_q15.c -* -* Description: Q15 sparse FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The 1.15 x 1.15 multiplications yield a 2.30 result and these are added to a 2.30 accumulator. - * Thus the full precision of the multiplications is maintained but there is only a single guard bit in the accumulator. - * If the accumulator result overflows it will wrap around rather than saturate. - * After all multiply-accumulates are performed, the 2.30 accumulator is truncated to 2.15 format and then saturated to 1.15 format. - * In order to avoid overflows the input signal or coefficients must be scaled down by log2(numTaps) bits. - */ - - -void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize) -{ - - q15_t *pState = S->pState; /* State pointer */ - q15_t *pIn = pSrc; /* Working pointer for input */ - q15_t *pOut = pDst; /* Working pointer for output */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *px; /* Temporary pointers for scratch buffer */ - q15_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ - q15_t *py = pState; /* Temporary pointers for state buffer */ - int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ - uint32_t delaySize = S->maxDelay + blockSize; /* state length */ - uint16_t numTaps = S->numTaps; /* Filter order */ - int32_t readIndex; /* Read index of the state buffer */ - uint32_t tapCnt, blkCnt; /* loop counters */ - q15_t coeff = *pCoeffs++; /* Read the first coefficient value */ - q31_t *pScr2 = pScratchOut; /* Working pointer for pScratchOut */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in1, in2; /* Temporary variables */ - - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_q15(py, delaySize, &S->stateIndex, 1, pIn, 1, blockSize); - - /* Loop over the number of taps. */ - tapCnt = numTaps; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 multiplications at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* All the output values are in pScratchOut buffer. - Convert them into 1.15 format, saturate and store in the destination buffer. */ - /* Loop over the blockSize. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - in1 = *pScr2++; - in2 = *pScr2++; - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT((q15_t) __SSAT(in1 >> 15, 16), (q15_t) __SSAT(in2 >> 15, 16), - 16); - -#else - *__SIMD32(pOut)++ = - __PKHBT((q15_t) __SSAT(in2 >> 15, 16), (q15_t) __SSAT(in1 >> 15, 16), - 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - in1 = *pScr2++; - - in2 = *pScr2++; - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pOut)++ = - __PKHBT((q15_t) __SSAT(in1 >> 15, 16), (q15_t) __SSAT(in2 >> 15, 16), - 16); - -#else - - *__SIMD32(pOut)++ = - __PKHBT((q15_t) __SSAT(in2 >> 15, 16), (q15_t) __SSAT(in1 >> 15, 16), - 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - - blkCnt--; - - } - - /* If the blockSize is not a multiple of 4, - remaining samples are processed in the below loop */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - *pOut++ = (q15_t) __SSAT(*pScr2++ >> 15, 16); - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_q15(py, delaySize, &S->stateIndex, 1, pIn, 1, blockSize); - - /* Loop over the number of taps. */ - tapCnt = numTaps; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q15(py, delaySize, &readIndex, 1, - pb, pb, blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - *pScratchOut++ += (q31_t) * px++ * coeff; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* All the output values are in pScratchOut buffer. - Convert them into 1.15 format, saturate and store in the destination buffer. */ - /* Loop over the blockSize. */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - *pOut++ = (q15_t) __SSAT(*pScr2++ >> 15, 16); - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c deleted file mode 100644 index 9141fca..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c +++ /dev/null @@ -1,461 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_q31.c -* -* Description: Q31 sparse FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ -#include "arm_math.h" - - -/** - * @addtogroup FIR_Sparse - * @{ - */ - -/** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The 1.31 x 1.31 multiplications are truncated to 2.30 format. - * This leads to loss of precision on the intermediate multiplications and provides only a single guard bit. - * If the accumulator result overflows, it wraps around rather than saturate. - * In order to avoid overflows the input signal or coefficients must be scaled down by log2(numTaps) bits. - */ - -void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize) -{ - - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *px; /* Scratch buffer pointer */ - q31_t *py = pState; /* Temporary pointers for state buffer */ - q31_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ - q31_t *pOut; /* Destination pointer */ - q63_t out; /* Temporary output variable */ - int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ - uint32_t delaySize = S->maxDelay + blockSize; /* state length */ - uint16_t numTaps = S->numTaps; /* Filter order */ - int32_t readIndex; /* Read index of the state buffer */ - uint32_t tapCnt, blkCnt; /* loop counters */ - q31_t coeff = *pCoeffs++; /* Read the first coefficient value */ - q31_t in; - - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1, - (int32_t *) pSrc, 1, blockSize); - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pOut = pDst; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 Multiplications at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in the destination buffer */ - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in the destination buffer */ - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pOut = pDst; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pOut = pDst; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Working output pointer is updated */ - pOut = pDst; - - /* Output is converted into 1.31 format. */ - /* Loop over the blockSize. Unroll by a factor of 4. - * process 4 output samples at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - in = *pOut << 1; - *pOut++ = in; - in = *pOut << 1; - *pOut++ = in; - in = *pOut << 1; - *pOut++ = in; - in = *pOut << 1; - *pOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * process the remaining output samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - in = *pOut << 1; - *pOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiplications and store in the destination buffer */ - *pOut++ = (q31_t) (((q63_t) * px++ * coeff) >> 32); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pOut = pDst; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = (int32_t) (S->stateIndex - blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1, - (int32_t *) pb, (int32_t *) pb, blockSize, 1, - blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pOut = pDst; - - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - out = *pOut; - out += ((q63_t) * px++ * coeff) >> 32; - *pOut++ = (q31_t) (out); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Working output pointer is updated */ - pOut = pDst; - - /* Output is converted into 1.31 format. */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - in = *pOut << 1; - *pOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c deleted file mode 100644 index 5d051e4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c +++ /dev/null @@ -1,480 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fir_sparse_q7.c -* -* Description: Q7 sparse FIR filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ------------------------------------------------------------------- */ -#include "arm_math.h" - - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup FIR_Sparse - * @{ - */ - - -/** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 32-bit internal accumulator. - * Both coefficients and state variables are represented in 1.7 format and multiplications yield a 2.14 result. - * The 2.14 intermediate results are accumulated in a 32-bit accumulator in 18.14 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * The accumulator is then converted to 18.7 format by discarding the low 7 bits. - * Finally, the result is truncated to 1.7 format. - */ - -void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize) -{ - - q7_t *pState = S->pState; /* State pointer */ - q7_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q7_t *px; /* Scratch buffer pointer */ - q7_t *py = pState; /* Temporary pointers for state buffer */ - q7_t *pb = pScratchIn; /* Temporary pointers for scratch buffer */ - q7_t *pOut = pDst; /* Destination pointer */ - int32_t *pTapDelay = S->pTapDelay; /* Pointer to the array containing offset of the non-zero tap values. */ - uint32_t delaySize = S->maxDelay + blockSize; /* state length */ - uint16_t numTaps = S->numTaps; /* Filter order */ - int32_t readIndex; /* Read index of the state buffer */ - uint32_t tapCnt, blkCnt; /* loop counters */ - q7_t coeff = *pCoeffs++; /* Read the coefficient value */ - q31_t *pScr2 = pScratchOut; /* Working pointer for scratch buffer of output values */ - q31_t in; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t in1, in2, in3, in4; - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_q7(py, (int32_t) delaySize, &S->stateIndex, 1, pSrc, 1, - blockSize); - - /* Loop over the number of taps. */ - tapCnt = numTaps; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 multiplications at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize. Unroll by a factor of 4. - * Compute 4 MACS at a time. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - * compute the remaining samples */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* All the output values are in pScratchOut buffer. - Convert them into 1.15 format, saturate and store in the destination buffer. */ - /* Loop over the blockSize. */ - blkCnt = blockSize >> 2; - - while(blkCnt > 0u) - { - in1 = (q7_t) __SSAT(*pScr2++ >> 7, 8); - in2 = (q7_t) __SSAT(*pScr2++ >> 7, 8); - in3 = (q7_t) __SSAT(*pScr2++ >> 7, 8); - in4 = (q7_t) __SSAT(*pScr2++ >> 7, 8); - - *__SIMD32(pOut)++ = __PACKq7(in1, in2, in3, in4); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, - remaining samples are processed in the below loop */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - *pOut++ = (q7_t) __SSAT(*pScr2++ >> 7, 8); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* BlockSize of Input samples are copied into the state buffer */ - /* StateIndex points to the starting position to write in the state buffer */ - arm_circularWrite_q7(py, (int32_t) delaySize, &S->stateIndex, 1, pSrc, 1, - blockSize); - - /* Loop over the number of taps. */ - tapCnt = numTaps; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform multiplication and store in the scratch buffer */ - *pScratchOut++ = ((q31_t) * px++ * coeff); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Loop over the number of taps. */ - tapCnt = (uint32_t) numTaps - 2u; - - while(tapCnt > 0u) - { - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Load the coefficient value and - * increment the coefficient buffer for the next set of state values */ - coeff = *pCoeffs++; - - /* Read Index, from where the state buffer should be read, is calculated. */ - readIndex = - ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++; - - /* Wraparound of readIndex */ - if(readIndex < 0) - { - readIndex += (int32_t) delaySize; - } - - /* Decrement the tap loop counter */ - tapCnt--; - } - - /* Compute last tap without the final read of pTapDelay */ - - /* Working pointer for state buffer is updated */ - py = pState; - - /* blockSize samples are read from the state buffer */ - arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb, - (int32_t) blockSize, 1, blockSize); - - /* Working pointer for the scratch buffer of state values */ - px = pb; - - /* Working pointer for scratch buffer of output values */ - pScratchOut = pScr2; - - /* Loop over the blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Perform Multiply-Accumulate */ - in = *pScratchOut + ((q31_t) * px++ * coeff); - *pScratchOut++ = in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* All the output values are in pScratchOut buffer. - Convert them into 1.15 format, saturate and store in the destination buffer. */ - /* Loop over the blockSize. */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - *pOut++ = (q7_t) __SSAT(*pScr2++ >> 7, 8); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of FIR_Sparse group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c deleted file mode 100644 index 1acacc7..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c +++ /dev/null @@ -1,447 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_f32.c -* -* Description: Floating-point IIR Lattice filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup IIR_Lattice Infinite Impulse Response (IIR) Lattice Filters - * - * This set of functions implements lattice filters - * for Q15, Q31 and floating-point data types. Lattice filters are used in a - * variety of adaptive filter applications. The filter structure has feedforward and - * feedback components and the net impulse response is infinite length. - * The functions operate on blocks - * of input and output data and each call to the function processes - * blockSize samples through the filter. pSrc and - * pDst point to input and output arrays containing blockSize values. - - * \par Algorithm: - * \image html IIRLattice.gif "Infinite Impulse Response Lattice filter" - *
    
- *    fN(n)   =  x(n)    
- *    fm-1(n) = fm(n) - km * gm-1(n-1)   for m = N, N-1, ...1    
- *    gm(n)   = km * fm-1(n) + gm-1(n-1) for m = N, N-1, ...1    
- *    y(n)    = vN * gN(n) + vN-1 * gN-1(n) + ...+ v0 * g0(n)    
- * 
- * \par - * pkCoeffs points to array of reflection coefficients of size numStages. - * Reflection coefficients are stored in time-reversed order. - * \par - *
    
- *    {kN, kN-1, ....k1}    
- * 
- * pvCoeffs points to the array of ladder coefficients of size (numStages+1). - * Ladder coefficients are stored in time-reversed order. - * \par - *
    
- *    {vN, vN-1, ...v0}    
- * 
- * pState points to a state array of size numStages + blockSize. - * The state variables shown in the figure above (the g values) are stored in the pState array. - * The state variables are updated after each block of data is processed; the coefficients are untouched. - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter. - * Coefficient arrays may be shared among several instances while state variable arrays cannot be shared. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numStages, pkCoeffs, pvCoeffs, pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros and then manually initialize the instance structure as follows: - *
    
- *arm_iir_lattice_instance_f32 S = {numStages, pState, pkCoeffs, pvCoeffs};    
- *arm_iir_lattice_instance_q31 S = {numStages, pState, pkCoeffs, pvCoeffs};    
- *arm_iir_lattice_instance_q15 S = {numStages, pState, pkCoeffs, pvCoeffs};    
- * 
- * \par - * where numStages is the number of stages in the filter; pState points to the state buffer array; - * pkCoeffs points to array of the reflection coefficients; pvCoeffs points to the array of ladder coefficients. - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the IIR lattice filter functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - -/** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - -void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t fnext1, gcurr1, gnext; /* Temporary variables for lattice stages */ - float32_t acc; /* Accumlator */ - uint32_t blkCnt, tapCnt; /* temporary variables for counts */ - float32_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ - uint32_t numStages = S->numStages; /* number of stages */ - float32_t *pState; /* State pointer */ - float32_t *pStateCurnt; /* State current pointer */ - float32_t k1, k2; - float32_t v1, v2, v3, v4; - float32_t gcurr2; - float32_t fnext2; - - /* initialise loop count */ - blkCnt = blockSize; - - /* initialise state pointer */ - pState = &S->pState[0]; - - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fnext2 = *pSrc++; - - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - - /* Set accumulator to zero */ - acc = 0.0; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = (numStages) >> 2; - - while(tapCnt > 0u) - { - /* Read gN-1(n-1) from state buffer */ - gcurr1 = *px1; - - /* read reflection coefficient kN */ - k1 = *pk; - - /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ - fnext1 = fnext2 - (k1 * gcurr1); - - /* read ladder coefficient vN */ - v1 = *pv; - - /* read next reflection coefficient kN-1 */ - k2 = *(pk + 1u); - - /* Read gN-2(n-1) from state buffer */ - gcurr2 = *(px1 + 1u); - - /* read next ladder coefficient vN-1 */ - v2 = *(pv + 1u); - - /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ - fnext2 = fnext1 - (k2 * gcurr2); - - /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ - gnext = gcurr1 + (k1 * fnext1); - - /* read reflection coefficient kN-2 */ - k1 = *(pk + 2u); - - /* write gN(n) into state for next sample processing */ - *px2++ = gnext; - - /* Read gN-3(n-1) from state buffer */ - gcurr1 = *(px1 + 2u); - - /* y(n) += gN(n) * vN */ - acc += (gnext * v1); - - /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ - fnext1 = fnext2 - (k1 * gcurr1); - - /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ - gnext = gcurr2 + (k2 * fnext2); - - /* Read gN-4(n-1) from state buffer */ - gcurr2 = *(px1 + 3u); - - /* y(n) += gN-1(n) * vN-1 */ - acc += (gnext * v2); - - /* read reflection coefficient kN-3 */ - k2 = *(pk + 3u); - - /* write gN-1(n) into state for next sample processing */ - *px2++ = gnext; - - /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ - fnext2 = fnext1 - (k2 * gcurr2); - - /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ - gnext = gcurr1 + (k1 * fnext1); - - /* read ladder coefficient vN-2 */ - v3 = *(pv + 2u); - - /* y(n) += gN-2(n) * vN-2 */ - acc += (gnext * v3); - - /* write gN-2(n) into state for next sample processing */ - *px2++ = gnext; - - /* update pointer */ - pk += 4u; - - /* gN-3(n) = kN-3 * fN-4(n) + gN-4(n-1) */ - gnext = (fnext2 * k2) + gcurr2; - - /* read next ladder coefficient vN-3 */ - v4 = *(pv + 3u); - - /* y(n) += gN-4(n) * vN-4 */ - acc += (gnext * v4); - - /* write gN-3(n) into state for next sample processing */ - *px2++ = gnext; - - /* update pointers */ - px1 += 4u; - pv += 4u; - - tapCnt--; - - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = (numStages) % 0x4u; - - while(tapCnt > 0u) - { - gcurr1 = *px1++; - /* Process sample for last taps */ - fnext1 = fnext2 - ((*pk) * gcurr1); - gnext = (fnext1 * (*pk++)) + gcurr1; - /* Output samples for last taps */ - acc += (gnext * (*pv++)); - *px2++ = gnext; - fnext2 = fnext1; - - tapCnt--; - - } - - /* y(n) += g0(n) * v0 */ - acc += (fnext2 * (*pv)); - - *px2++ = fnext2; - - /* write out into pDst */ - *pDst++ = acc; - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 1u; - - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - tapCnt = numStages >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - - } - - /* Calculate remaining number of copies */ - tapCnt = (numStages) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } -} - -#else - -void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - float32_t fcurr, fnext = 0, gcurr, gnext; /* Temporary variables for lattice stages */ - float32_t acc; /* Accumlator */ - uint32_t blkCnt, tapCnt; /* temporary variables for counts */ - float32_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ - uint32_t numStages = S->numStages; /* number of stages */ - float32_t *pState; /* State pointer */ - float32_t *pStateCurnt; /* State current pointer */ - - - /* Run the below code for Cortex-M0 */ - - blkCnt = blockSize; - - pState = &S->pState[0]; - - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - /* Set accumulator to zero */ - acc = 0.0f; - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - - /* Process sample for numStages */ - tapCnt = numStages; - - while(tapCnt > 0u) - { - gcurr = *px1++; - /* Process sample for last taps */ - fnext = fcurr - ((*pk) * gcurr); - gnext = (fnext * (*pk++)) + gcurr; - - /* Output samples for last taps */ - acc += (gnext * (*pv++)); - *px2++ = gnext; - fcurr = fnext; - - /* Decrementing loop counter */ - tapCnt--; - - } - - /* y(n) += g0(n) * v0 */ - acc += (fnext * (*pv)); - - *px2++ = fnext; - - /* write out into pDst */ - *pDst++ = acc; - - /* Advance the state pointer by 1 to process the next group of samples */ - pState = pState + 1u; - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - tapCnt = numStages; - - /* Copy the data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -} - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -/** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c deleted file mode 100644 index a8a812c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c +++ /dev/null @@ -1,91 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_init_f32.c -* -* Description: Floating-point IIR lattice filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - -/** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign reflection coefficient pointer */ - S->pkCoeffs = pkCoeffs; - - /* Assign ladder coefficient pointer */ - S->pvCoeffs = pvCoeffs; - - /* Clear state buffer and size is always blockSize + numStages */ - memset(pState, 0, (numStages + blockSize) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - - -} - - /** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c deleted file mode 100644 index 88b2649..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c +++ /dev/null @@ -1,91 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_init_q15.c -* -* Description: Q15 IIR lattice filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - - /** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - * @return none. - */ - -void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign reflection coefficient pointer */ - S->pkCoeffs = pkCoeffs; - - /* Assign ladder coefficient pointer */ - S->pvCoeffs = pvCoeffs; - - /* Clear state buffer and size is always blockSize + numStages */ - memset(pState, 0, (numStages + blockSize) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - -} - -/** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c deleted file mode 100644 index be134a4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c +++ /dev/null @@ -1,91 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_init_q31.c -* -* Description: Initialization function for the Q31 IIR lattice filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numStages = numStages; - - /* Assign reflection coefficient pointer */ - S->pkCoeffs = pkCoeffs; - - /* Assign ladder coefficient pointer */ - S->pvCoeffs = pvCoeffs; - - /* Clear state buffer and size is always blockSize + numStages */ - memset(pState, 0, (numStages + blockSize) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - - -} - -/** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c deleted file mode 100644 index a9aeb6d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c +++ /dev/null @@ -1,464 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_q15.c -* -* Description: Q15 IIR lattice filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - -/** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the Q15 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - -void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t fcurr, fnext, gcurr = 0, gnext; /* Temporary variables for lattice stages */ - q15_t gnext1, gnext2; /* Temporary variables for lattice stages */ - uint32_t stgCnt; /* Temporary variables for counts */ - q63_t acc; /* Accumlator */ - uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ - q15_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ - uint32_t numStages = S->numStages; /* number of stages */ - q15_t *pState; /* State pointer */ - q15_t *pStateCurnt; /* State current pointer */ - q15_t out; /* Temporary variable for output */ - q31_t v; /* Temporary variable for ladder coefficient */ -#ifdef UNALIGNED_SUPPORT_DISABLE - q15_t v1, v2; -#endif - - - blkCnt = blockSize; - - pState = &S->pState[0]; - - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - /* Set accumulator to zero */ - acc = 0; - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - - /* Process sample for first tap */ - gcurr = *px1++; - /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ - fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); - fnext = __SSAT(fnext, 16); - /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ - gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; - gnext = __SSAT(gnext, 16); - /* write gN(n) into state for next sample processing */ - *px2++ = (q15_t) gnext; - /* y(n) += gN(n) * vN */ - acc += (q31_t) ((gnext * (*pv++))); - - - /* Update f values for next coefficient processing */ - fcurr = fnext; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = (numStages - 1u) >> 2; - - while(tapCnt > 0u) - { - - /* Process sample for 2nd, 6th ...taps */ - /* Read gN-2(n-1) from state buffer */ - gcurr = *px1++; - /* Process sample for 2nd, 6th .. taps */ - /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ - fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); - fnext = __SSAT(fnext, 16); - /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ - gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; - gnext1 = (q15_t) __SSAT(gnext, 16); - /* write gN-1(n) into state */ - *px2++ = (q15_t) gnext1; - - - /* Process sample for 3nd, 7th ...taps */ - /* Read gN-3(n-1) from state */ - gcurr = *px1++; - /* Process sample for 3rd, 7th .. taps */ - /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ - fcurr = fnext - (((q31_t) gcurr * (*pk)) >> 15); - fcurr = __SSAT(fcurr, 16); - /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ - gnext = (((q31_t) fcurr * (*pk++)) >> 15) + gcurr; - gnext2 = (q15_t) __SSAT(gnext, 16); - /* write gN-2(n) into state */ - *px2++ = (q15_t) gnext2; - - /* Read vN-1 and vN-2 at a time */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - v = *__SIMD32(pv)++; - -#else - - v1 = *pv++; - v2 = *pv++; - -#ifndef ARM_MATH_BIG_ENDIAN - - v = __PKHBT(v1, v2, 16); - -#else - - v = __PKHBT(v2, v1, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - - /* Pack gN-1(n) and gN-2(n) */ - -#ifndef ARM_MATH_BIG_ENDIAN - - gnext = __PKHBT(gnext1, gnext2, 16); - -#else - - gnext = __PKHBT(gnext2, gnext1, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* y(n) += gN-1(n) * vN-1 */ - /* process for gN-5(n) * vN-5, gN-9(n) * vN-9 ... */ - /* y(n) += gN-2(n) * vN-2 */ - /* process for gN-6(n) * vN-6, gN-10(n) * vN-10 ... */ - acc = __SMLALD(gnext, v, acc); - - - /* Process sample for 4th, 8th ...taps */ - /* Read gN-4(n-1) from state */ - gcurr = *px1++; - /* Process sample for 4th, 8th .. taps */ - /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ - fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); - fnext = __SSAT(fnext, 16); - /* gN-3(n) = kN-3 * fN-1(n) + gN-1(n-1) */ - gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; - gnext1 = (q15_t) __SSAT(gnext, 16); - /* write gN-3(n) for the next sample process */ - *px2++ = (q15_t) gnext1; - - - /* Process sample for 5th, 9th ...taps */ - /* Read gN-5(n-1) from state */ - gcurr = *px1++; - /* Process sample for 5th, 9th .. taps */ - /* fN-5(n) = fN-4(n) - kN-4 * gN-5(n-1) */ - fcurr = fnext - (((q31_t) gcurr * (*pk)) >> 15); - fcurr = __SSAT(fcurr, 16); - /* gN-4(n) = kN-4 * fN-5(n) + gN-5(n-1) */ - gnext = (((q31_t) fcurr * (*pk++)) >> 15) + gcurr; - gnext2 = (q15_t) __SSAT(gnext, 16); - /* write gN-4(n) for the next sample process */ - *px2++ = (q15_t) gnext2; - - /* Read vN-3 and vN-4 at a time */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - v = *__SIMD32(pv)++; - -#else - - v1 = *pv++; - v2 = *pv++; - -#ifndef ARM_MATH_BIG_ENDIAN - - v = __PKHBT(v1, v2, 16); - -#else - - v = __PKHBT(v2, v1, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - - /* Pack gN-3(n) and gN-4(n) */ -#ifndef ARM_MATH_BIG_ENDIAN - - gnext = __PKHBT(gnext1, gnext2, 16); - -#else - - gnext = __PKHBT(gnext2, gnext1, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* y(n) += gN-4(n) * vN-4 */ - /* process for gN-8(n) * vN-8, gN-12(n) * vN-12 ... */ - /* y(n) += gN-3(n) * vN-3 */ - /* process for gN-7(n) * vN-7, gN-11(n) * vN-11 ... */ - acc = __SMLALD(gnext, v, acc); - - tapCnt--; - - } - - fnext = fcurr; - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = (numStages - 1u) % 0x4u; - - while(tapCnt > 0u) - { - gcurr = *px1++; - /* Process sample for last taps */ - fnext = fcurr - (((q31_t) gcurr * (*pk)) >> 15); - fnext = __SSAT(fnext, 16); - gnext = (((q31_t) fnext * (*pk++)) >> 15) + gcurr; - gnext = __SSAT(gnext, 16); - /* Output samples for last taps */ - acc += (q31_t) (((q31_t) gnext * (*pv++))); - *px2++ = (q15_t) gnext; - fcurr = fnext; - - tapCnt--; - } - - /* y(n) += g0(n) * v0 */ - acc += (q31_t) (((q31_t) fnext * (*pv++))); - - out = (q15_t) __SSAT(acc >> 15, 16); - *px2++ = (q15_t) fnext; - - /* write out into pDst */ - *pDst++ = out; - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 1u; - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - stgCnt = (numStages >> 2u); - - /* copy data */ - while(stgCnt > 0u) - { -#ifndef UNALIGNED_SUPPORT_DISABLE - - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - -#else - - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - stgCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - stgCnt = (numStages) % 0x4u; - - /* copy data */ - while(stgCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - stgCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ - uint32_t stgCnt; /* Temporary variables for counts */ - q63_t acc; /* Accumlator */ - uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ - q15_t *px1, *px2, *pk, *pv; /* temporary pointers for state and coef */ - uint32_t numStages = S->numStages; /* number of stages */ - q15_t *pState; /* State pointer */ - q15_t *pStateCurnt; /* State current pointer */ - q15_t out; /* Temporary variable for output */ - - - blkCnt = blockSize; - - pState = &S->pState[0]; - - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - /* Set accumulator to zero */ - acc = 0; - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - tapCnt = numStages; - - while(tapCnt > 0u) - { - gcurr = *px1++; - /* Process sample */ - /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ - fnext = fcurr - ((gcurr * (*pk)) >> 15); - fnext = __SSAT(fnext, 16); - /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ - gnext = ((fnext * (*pk++)) >> 15) + gcurr; - gnext = __SSAT(gnext, 16); - /* Output samples */ - /* y(n) += gN(n) * vN */ - acc += (q31_t) ((gnext * (*pv++))); - /* write gN(n) into state for next sample processing */ - *px2++ = (q15_t) gnext; - /* Update f values for next coefficient processing */ - fcurr = fnext; - - tapCnt--; - } - - /* y(n) += g0(n) * v0 */ - acc += (q31_t) ((fnext * (*pv++))); - - out = (q15_t) __SSAT(acc >> 15, 16); - *px2++ = (q15_t) fnext; - - /* write out into pDst */ - *pDst++ = out; - - /* Advance the state pointer by 1 to process the next group of samples */ - pState = pState + 1u; - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - stgCnt = numStages; - - /* copy data */ - while(stgCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - stgCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - - - -/** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c deleted file mode 100644 index 5a16fae..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c +++ /dev/null @@ -1,350 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_iir_lattice_q31.c -* -* Description: Q31 IIR lattice filter processing function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup IIR_Lattice - * @{ - */ - -/** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2*log2(numStages) bits. - * After all multiply-accumulates are performed, the 2.62 accumulator is saturated to 1.32 format and then truncated to 1.31 format. - */ - -void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q31_t fcurr, fnext = 0, gcurr = 0, gnext; /* Temporary variables for lattice stages */ - q63_t acc; /* Accumlator */ - uint32_t blkCnt, tapCnt; /* Temporary variables for counts */ - q31_t *px1, *px2, *pk, *pv; /* Temporary pointers for state and coef */ - uint32_t numStages = S->numStages; /* number of stages */ - q31_t *pState; /* State pointer */ - q31_t *pStateCurnt; /* State current pointer */ - - blkCnt = blockSize; - - pState = &S->pState[0]; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - /* Set accumulator to zero */ - acc = 0; - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - - /* Process sample for first tap */ - gcurr = *px1++; - /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ - fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ - gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); - /* write gN-1(n-1) into state for next sample processing */ - *px2++ = gnext; - /* y(n) += gN(n) * vN */ - acc += ((q63_t) gnext * *pv++); - - /* Update f values for next coefficient processing */ - fcurr = fnext; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = (numStages - 1u) >> 2; - - while(tapCnt > 0u) - { - - /* Process sample for 2nd, 6th .. taps */ - /* Read gN-2(n-1) from state buffer */ - gcurr = *px1++; - /* fN-2(n) = fN-1(n) - kN-1 * gN-2(n-1) */ - fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - /* gN-1(n) = kN-1 * fN-2(n) + gN-2(n-1) */ - gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); - /* y(n) += gN-1(n) * vN-1 */ - /* process for gN-5(n) * vN-5, gN-9(n) * vN-9 ... */ - acc += ((q63_t) gnext * *pv++); - /* write gN-1(n) into state for next sample processing */ - *px2++ = gnext; - - /* Process sample for 3nd, 7th ...taps */ - /* Read gN-3(n-1) from state buffer */ - gcurr = *px1++; - /* Process sample for 3rd, 7th .. taps */ - /* fN-3(n) = fN-2(n) - kN-2 * gN-3(n-1) */ - fcurr = __QSUB(fnext, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - /* gN-2(n) = kN-2 * fN-3(n) + gN-3(n-1) */ - gnext = __QADD(gcurr, (q31_t) (((q63_t) fcurr * (*pk++)) >> 31)); - /* y(n) += gN-2(n) * vN-2 */ - /* process for gN-6(n) * vN-6, gN-10(n) * vN-10 ... */ - acc += ((q63_t) gnext * *pv++); - /* write gN-2(n) into state for next sample processing */ - *px2++ = gnext; - - - /* Process sample for 4th, 8th ...taps */ - /* Read gN-4(n-1) from state buffer */ - gcurr = *px1++; - /* Process sample for 4th, 8th .. taps */ - /* fN-4(n) = fN-3(n) - kN-3 * gN-4(n-1) */ - fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - /* gN-3(n) = kN-3 * fN-4(n) + gN-4(n-1) */ - gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); - /* y(n) += gN-3(n) * vN-3 */ - /* process for gN-7(n) * vN-7, gN-11(n) * vN-11 ... */ - acc += ((q63_t) gnext * *pv++); - /* write gN-3(n) into state for next sample processing */ - *px2++ = gnext; - - - /* Process sample for 5th, 9th ...taps */ - /* Read gN-5(n-1) from state buffer */ - gcurr = *px1++; - /* Process sample for 5th, 9th .. taps */ - /* fN-5(n) = fN-4(n) - kN-4 * gN-1(n-1) */ - fcurr = __QSUB(fnext, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - /* gN-4(n) = kN-4 * fN-5(n) + gN-5(n-1) */ - gnext = __QADD(gcurr, (q31_t) (((q63_t) fcurr * (*pk++)) >> 31)); - /* y(n) += gN-4(n) * vN-4 */ - /* process for gN-8(n) * vN-8, gN-12(n) * vN-12 ... */ - acc += ((q63_t) gnext * *pv++); - /* write gN-4(n) into state for next sample processing */ - *px2++ = gnext; - - tapCnt--; - - } - - fnext = fcurr; - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = (numStages - 1u) % 0x4u; - - while(tapCnt > 0u) - { - gcurr = *px1++; - /* Process sample for last taps */ - fnext = __QSUB(fcurr, (q31_t) (((q63_t) gcurr * (*pk)) >> 31)); - gnext = __QADD(gcurr, (q31_t) (((q63_t) fnext * (*pk++)) >> 31)); - /* Output samples for last taps */ - acc += ((q63_t) gnext * *pv++); - *px2++ = gnext; - fcurr = fnext; - - tapCnt--; - - } - - /* y(n) += g0(n) * v0 */ - acc += (q63_t) fnext *( - *pv++); - - *px2++ = fnext; - - /* write out into pDst */ - *pDst++ = (q31_t) (acc >> 31u); - - /* Advance the state pointer by 4 to process the next group of 4 samples */ - pState = pState + 1u; - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - tapCnt = numStages >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - - } - - /* Calculate remaining number of copies */ - tapCnt = (numStages) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - }; - -#else - - /* Run the below code for Cortex-M0 */ - /* Sample processing */ - while(blkCnt > 0u) - { - /* Read Sample from input buffer */ - /* fN(n) = x(n) */ - fcurr = *pSrc++; - - /* Initialize state read pointer */ - px1 = pState; - /* Initialize state write pointer */ - px2 = pState; - /* Set accumulator to zero */ - acc = 0; - /* Initialize Ladder coeff pointer */ - pv = &S->pvCoeffs[0]; - /* Initialize Reflection coeff pointer */ - pk = &S->pkCoeffs[0]; - - tapCnt = numStages; - - while(tapCnt > 0u) - { - gcurr = *px1++; - /* Process sample */ - /* fN-1(n) = fN(n) - kN * gN-1(n-1) */ - fnext = - clip_q63_to_q31(((q63_t) fcurr - - ((q31_t) (((q63_t) gcurr * (*pk)) >> 31)))); - /* gN(n) = kN * fN-1(n) + gN-1(n-1) */ - gnext = - clip_q63_to_q31(((q63_t) gcurr + - ((q31_t) (((q63_t) fnext * (*pk++)) >> 31)))); - /* Output samples */ - /* y(n) += gN(n) * vN */ - acc += ((q63_t) gnext * *pv++); - /* write gN-1(n-1) into state for next sample processing */ - *px2++ = gnext; - /* Update f values for next coefficient processing */ - fcurr = fnext; - - tapCnt--; - } - - /* y(n) += g0(n) * v0 */ - acc += (q63_t) fnext *( - *pv++); - - *px2++ = fnext; - - /* write out into pDst */ - *pDst++ = (q31_t) (acc >> 31u); - - /* Advance the state pointer by 1 to process the next group of samples */ - pState = pState + 1u; - blkCnt--; - - } - - /* Processing is complete. Now copy last S->numStages samples to start of the buffer - for the preperation of next frame process */ - - /* Points to the start of the state buffer */ - pStateCurnt = &S->pState[0]; - pState = &S->pState[blockSize]; - - tapCnt = numStages; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - - - -/** - * @} end of IIR_Lattice group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c deleted file mode 100644 index b92af60..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c +++ /dev/null @@ -1,442 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_f32.c -* -* Description: Processing function for the floating-point LMS filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup LMS Least Mean Square (LMS) Filters - * - * LMS filters are a class of adaptive filters that are able to "learn" an unknown transfer functions. - * LMS filters use a gradient descent method in which the filter coefficients are updated based on the instantaneous error signal. - * Adaptive filters are often used in communication systems, equalizers, and noise removal. - * The CMSIS DSP Library contains LMS filter functions that operate on Q15, Q31, and floating-point data types. - * The library also contains normalized LMS filters in which the filter coefficient adaptation is indepedent of the level of the input signal. - * - * An LMS filter consists of two components as shown below. - * The first component is a standard transversal or FIR filter. - * The second component is a coefficient update mechanism. - * The LMS filter has two input signals. - * The "input" feeds the FIR filter while the "reference input" corresponds to the desired output of the FIR filter. - * That is, the FIR filter coefficients are updated so that the output of the FIR filter matches the reference input. - * The filter coefficient update mechanism is based on the difference between the FIR filter output and the reference input. - * This "error signal" tends towards zero as the filter adapts. - * The LMS processing functions accept the input and reference input signals and generate the filter output and error signal. - * \image html LMS.gif "Internal structure of the Least Mean Square filter" - * - * The functions operate on blocks of data and each call to the function processes - * blockSize samples through the filter. - * pSrc points to input signal, pRef points to reference signal, - * pOut points to output signal and pErr points to error signal. - * All arrays contain blockSize values. - * - * The functions operate on a block-by-block basis. - * Internally, the filter coefficients b[n] are updated on a sample-by-sample basis. - * The convergence of the LMS filter is slower compared to the normalized LMS algorithm. - * - * \par Algorithm: - * The output signal y[n] is computed by a standard FIR filter: - *
    
- *     y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]    
- * 
- * - * \par - * The error signal equals the difference between the reference signal d[n] and the filter output: - *
    
- *     e[n] = d[n] - y[n].    
- * 
- * - * \par - * After each sample of the error signal is computed, the filter coefficients b[k] are updated on a sample-by-sample basis: - *
    
- *     b[k] = b[k] + e[n] * mu * x[n-k],  for k=0, 1, ..., numTaps-1    
- * 
- * where mu is the step size and controls the rate of coefficient convergence. - *\par - * In the APIs, pCoeffs points to a coefficient array of size numTaps. - * Coefficients are stored in time reversed order. - * \par - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to a state array of size numTaps + blockSize - 1. - * Samples in the state buffer are stored in the order: - * \par - *
    
- *    {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}    
- * 
- * \par - * Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1 samples. - * The increased state buffer length allows circular addressing, which is traditionally used in FIR filters, - * to be avoided and yields a significant speed improvement. - * The state variables are updated after each block of data is processed. - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter and - * coefficient and state arrays cannot be shared among instances. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numTaps, pCoeffs, mu, postShift (not for f32), pState. Also set all of the values in pState to zero. - * - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Set the values in the state buffer to zeros before static initialization. - * The code below statically initializes each of the 3 different data type filter instance structures - *
    
- *    arm_lms_instance_f32 S = {numTaps, pState, pCoeffs, mu};    
- *    arm_lms_instance_q31 S = {numTaps, pState, pCoeffs, mu, postShift};    
- *    arm_lms_instance_q15 S = {numTaps, pState, pCoeffs, mu, postShift};    
- * 
- * where numTaps is the number of filter coefficients in the filter; pState is the address of the state buffer; - * pCoeffs is the address of the coefficient buffer; mu is the step size parameter; and postShift is the shift applied to coefficients. - * - * \par Fixed-Point Behavior: - * Care must be taken when using the Q15 and Q31 versions of the LMS filter. - * The following issues must be considered: - * - Scaling of coefficients - * - Overflow and saturation - * - * \par Scaling of Coefficients: - * Filter coefficients are represented as fractional values and - * coefficients are restricted to lie in the range [-1 +1). - * The fixed-point functions have an additional scaling parameter postShift. - * At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. - * This essentially scales the filter coefficients by 2^postShift and - * allows the filter coefficients to exceed the range [+1 -1). - * The value of postShift is set by the user based on the expected gain through the system being modeled. - * - * \par Overflow and Saturation: - * Overflow and saturation behavior of the fixed-point Q15 and Q31 versions are - * described separately as part of the function specific documentation below. - */ - -/** - * @addtogroup LMS - * @{ - */ - -/** - * @details - * This function operates on floating-point data types. - * - * @brief Processing function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_lms_f32( - const arm_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - float32_t mu = S->mu; /* Adaptive factor */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - float32_t sum, e, d; /* accumulator, error, reference data sample */ - float32_t w = 0.0f; /* weight factor */ - - e = 0.0f; - d = 0.0f; - - /* S->pState points to state array which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - blkCnt = blockSize; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Set the accumulator to zero */ - sum = 0.0f; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result in the accumulator, store in the destination buffer. */ - *pOut++ = sum; - - /* Compute and store error */ - d = (float32_t) (*pRef++); - e = d - sum; - *pErr++ = e; - - /* Calculation of Weighting factor for the updating filter coefficients */ - w = e * mu; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb = *pb + (w * (*px++)); - pb++; - - *pb = *pb + (w * (*px++)); - pb++; - - *pb = *pb + (w * (*px++)); - pb++; - - *pb = *pb + (w * (*px++)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb = *pb + (w * (*px++)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Loop unrolling for (numTaps - 1u) samples copy */ - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Set the accumulator to zero */ - sum = 0.0f; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result is stored in the destination buffer. */ - *pOut++ = sum; - - /* Compute and store error */ - d = (float32_t) (*pRef++); - e = d - sum; - *pErr++ = e; - - /* Weighting factor for the LMS version */ - w = e * mu; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb = *pb + (w * (*px++)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - * start of the state buffer. This prepares the state buffer for the - * next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Copy (numTaps - 1u) samples */ - tapCnt = (numTaps - 1u); - - /* Copy the data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c deleted file mode 100644 index 1e0c93e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c +++ /dev/null @@ -1,95 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_init_f32.c -* -* Description: Floating-point LMS filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @addtogroup LMS - * @{ - */ - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -/** - * \par Description: - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * The initial filter coefficients serve as a starting point for the adaptive filter. - * pState points to an array of length numTaps+blockSize-1 samples, where blockSize is the number of input samples processed by each call to arm_lms_f32(). - */ - -void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps */ - memset(pState, 0, (numTaps + (blockSize - 1)) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c deleted file mode 100644 index da2ee36..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c +++ /dev/null @@ -1,105 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_init_q15.c -* -* Description: Q15 LMS filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS - * @{ - */ - -/** -* @brief Initialization function for the Q15 LMS filter. -* @param[in] *S points to an instance of the Q15 LMS filter structure. -* @param[in] numTaps number of filter coefficients. -* @param[in] *pCoeffs points to the coefficient buffer. -* @param[in] *pState points to the state buffer. -* @param[in] mu step size that controls filter coefficient updates. -* @param[in] blockSize number of samples to process. -* @param[in] postShift bit shift applied to coefficients. -* @return none. -* -* \par Description: -* pCoeffs points to the array of filter coefficients stored in time reversed order: -*
    
-*    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
-* 
-* The initial filter coefficients serve as a starting point for the adaptive filter. -* pState points to the array of state variables and size of array is -* numTaps+blockSize-1 samples, where blockSize is the number of -* input samples processed by each call to arm_lms_q15(). -*/ - -void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps - 1 */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q15_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; - - /* Assign postShift value to be applied */ - S->postShift = postShift; - -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c deleted file mode 100644 index 10cffde..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c +++ /dev/null @@ -1,105 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_init_q31.c -* -* Description: Q31 LMS filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS - * @{ - */ - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - * - * \par Description: - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * The initial filter coefficients serve as a starting point for the adaptive filter. - * pState points to an array of length numTaps+blockSize-1 samples, - * where blockSize is the number of input samples processed by each call to - * arm_lms_q31(). - */ - -void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps - 1 */ - memset(pState, 0, ((uint32_t) numTaps + (blockSize - 1u)) * sizeof(q31_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; - - /* Assign postShift value to be applied */ - S->postShift = postShift; - -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c deleted file mode 100644 index e0c3f64..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c +++ /dev/null @@ -1,466 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_f32.c -* -* Description: Processing function for the floating-point Normalised LMS. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @defgroup LMS_NORM Normalized LMS Filters - * - * This set of functions implements a commonly used adaptive filter. - * It is related to the Least Mean Square (LMS) adaptive filter and includes an additional normalization - * factor which increases the adaptation rate of the filter. - * The CMSIS DSP Library contains normalized LMS filter functions that operate on Q15, Q31, and floating-point data types. - * - * A normalized least mean square (NLMS) filter consists of two components as shown below. - * The first component is a standard transversal or FIR filter. - * The second component is a coefficient update mechanism. - * The NLMS filter has two input signals. - * The "input" feeds the FIR filter while the "reference input" corresponds to the desired output of the FIR filter. - * That is, the FIR filter coefficients are updated so that the output of the FIR filter matches the reference input. - * The filter coefficient update mechanism is based on the difference between the FIR filter output and the reference input. - * This "error signal" tends towards zero as the filter adapts. - * The NLMS processing functions accept the input and reference input signals and generate the filter output and error signal. - * \image html LMS.gif "Internal structure of the NLMS adaptive filter" - * - * The functions operate on blocks of data and each call to the function processes - * blockSize samples through the filter. - * pSrc points to input signal, pRef points to reference signal, - * pOut points to output signal and pErr points to error signal. - * All arrays contain blockSize values. - * - * The functions operate on a block-by-block basis. - * Internally, the filter coefficients b[n] are updated on a sample-by-sample basis. - * The convergence of the LMS filter is slower compared to the normalized LMS algorithm. - * - * \par Algorithm: - * The output signal y[n] is computed by a standard FIR filter: - *
    
- *     y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]    
- * 
- * - * \par - * The error signal equals the difference between the reference signal d[n] and the filter output: - *
    
- *     e[n] = d[n] - y[n].    
- * 
- * - * \par - * After each sample of the error signal is computed the instanteous energy of the filter state variables is calculated: - *
    
- *    E = x[n]^2 + x[n-1]^2 + ... + x[n-numTaps+1]^2.    
- * 
- * The filter coefficients b[k] are then updated on a sample-by-sample basis: - *
    
- *     b[k] = b[k] + e[n] * (mu/E) * x[n-k],  for k=0, 1, ..., numTaps-1    
- * 
- * where mu is the step size and controls the rate of coefficient convergence. - *\par - * In the APIs, pCoeffs points to a coefficient array of size numTaps. - * Coefficients are stored in time reversed order. - * \par - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * \par - * pState points to a state array of size numTaps + blockSize - 1. - * Samples in the state buffer are stored in the order: - * \par - *
    
- *    {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[0], x[1], ..., x[blockSize-1]}    
- * 
- * \par - * Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1 samples. - * The increased state buffer length allows circular addressing, which is traditionally used in FIR filters, - * to be avoided and yields a significant speed improvement. - * The state variables are updated after each block of data is processed. - * \par Instance Structure - * The coefficients and state variables for a filter are stored together in an instance data structure. - * A separate instance structure must be defined for each filter and - * coefficient and state arrays cannot be shared among instances. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Zeros out the values in the state buffer. - * To do this manually without calling the init function, assign the follow subfields of the instance structure: - * numTaps, pCoeffs, mu, energy, x0, pState. Also set all of the values in pState to zero. - * For Q7, Q15, and Q31 the following fields must also be initialized; - * recipTable, postShift - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * \par Fixed-Point Behavior: - * Care must be taken when using the Q15 and Q31 versions of the normalised LMS filter. - * The following issues must be considered: - * - Scaling of coefficients - * - Overflow and saturation - * - * \par Scaling of Coefficients: - * Filter coefficients are represented as fractional values and - * coefficients are restricted to lie in the range [-1 +1). - * The fixed-point functions have an additional scaling parameter postShift. - * At the output of the filter's accumulator is a shift register which shifts the result by postShift bits. - * This essentially scales the filter coefficients by 2^postShift and - * allows the filter coefficients to exceed the range [+1 -1). - * The value of postShift is set by the user based on the expected gain through the system being modeled. - * - * \par Overflow and Saturation: - * Overflow and saturation behavior of the fixed-point Q15 and Q31 versions are - * described separately as part of the function specific documentation below. - */ - - -/** - * @addtogroup LMS_NORM - * @{ - */ - - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - -void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize) -{ - float32_t *pState = S->pState; /* State pointer */ - float32_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - float32_t *pStateCurnt; /* Points to the current sample of the state */ - float32_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - float32_t mu = S->mu; /* Adaptive factor */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - float32_t energy; /* Energy of the input */ - float32_t sum, e, d; /* accumulator, error, reference data sample */ - float32_t w, x0, in; /* weight factor, temporary variable to hold input sample and state */ - - /* Initializations of error, difference, Coefficient update */ - e = 0.0f; - d = 0.0f; - w = 0.0f; - - energy = S->energy; - x0 = S->x0; - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy -= x0 * x0; - energy += in * in; - - /* Set the accumulator to zero */ - sum = 0.0f; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result in the accumulator, store in the destination buffer. */ - *pOut++ = sum; - - /* Compute and store error */ - d = (float32_t) (*pRef++); - e = d - sum; - *pErr++ = e; - - /* Calculation of Weighting factor for updating filter coefficients */ - /* epsilon value 0.000000119209289f */ - w = (e * mu) / (energy + 0.000000119209289f); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb += w * (*px++); - pb++; - - *pb += w * (*px++); - pb++; - - *pb += w * (*px++); - pb++; - - *pb += w * (*px++); - pb++; - - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb += w * (*px++); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - S->energy = energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Loop unrolling for (numTaps - 1u)/4 samples copy */ - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy -= x0 * x0; - energy += in * in; - - /* Set the accumulator to zero */ - sum = 0.0f; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - sum += (*px++) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* The result in the accumulator is stored in the destination buffer. */ - *pOut++ = sum; - - /* Compute and store error */ - d = (float32_t) (*pRef++); - e = d - sum; - *pErr++ = e; - - /* Calculation of Weighting factor for updating filter coefficients */ - /* epsilon value 0.000000119209289f */ - w = (e * mu) / (energy + 0.000000119209289f); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCcoeffs pointer */ - pb = pCoeffs; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - *pb += w * (*px++); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - S->energy = energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Copy (numTaps - 1u) samples */ - tapCnt = (numTaps - 1u); - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c deleted file mode 100644 index e379381..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c +++ /dev/null @@ -1,105 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_init_f32.c -* -* Description: Floating-point NLMS filter initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS_NORM - * @{ - */ - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - * - * \par Description: - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * The initial filter coefficients serve as a starting point for the adaptive filter. - * pState points to an array of length numTaps+blockSize-1 samples, - * where blockSize is the number of input samples processed by each call to arm_lms_norm_f32(). - */ - -void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps - 1 */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(float32_t)); - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; - - /* Initialise Energy to zero */ - S->energy = 0.0f; - - /* Initialise x0 to zero */ - S->x0 = 0.0f; - -} - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c deleted file mode 100644 index 78d7170..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c +++ /dev/null @@ -1,112 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_init_q15.c -* -* Description: Q15 NLMS initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @addtogroup LMS_NORM - * @{ - */ - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * The initial filter coefficients serve as a starting point for the adaptive filter. - * pState points to the array of state variables and size of array is - * numTaps+blockSize-1 samples, where blockSize is the number of input samples processed - * by each call to arm_lms_norm_q15(). - */ - -void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps - 1 */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q15_t)); - - /* Assign post Shift value applied to coefficients */ - S->postShift = postShift; - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; - - /* Initialize reciprocal pointer table */ - S->recipTable = (q15_t *) armRecipTableQ15; - - /* Initialise Energy to zero */ - S->energy = 0; - - /* Initialise x0 to zero */ - S->x0 = 0; - -} - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c deleted file mode 100644 index aea43ce..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c +++ /dev/null @@ -1,111 +0,0 @@ -/*----------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_init_q31.c -* -* Description: Q31 NLMS initialization function. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------*/ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @addtogroup LMS_NORM - * @{ - */ - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - * - * Description: - * \par - * pCoeffs points to the array of filter coefficients stored in time reversed order: - *
    
- *    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}    
- * 
- * The initial filter coefficients serve as a starting point for the adaptive filter. - * pState points to an array of length numTaps+blockSize-1 samples, - * where blockSize is the number of input samples processed by each call to arm_lms_norm_q31(). - */ - -void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift) -{ - /* Assign filter taps */ - S->numTaps = numTaps; - - /* Assign coefficient pointer */ - S->pCoeffs = pCoeffs; - - /* Clear state buffer and size is always blockSize + numTaps - 1 */ - memset(pState, 0, (numTaps + (blockSize - 1u)) * sizeof(q31_t)); - - /* Assign post Shift value applied to coefficients */ - S->postShift = postShift; - - /* Assign state pointer */ - S->pState = pState; - - /* Assign Step size value */ - S->mu = mu; - - /* Initialize reciprocal pointer table */ - S->recipTable = (q31_t *) armRecipTableQ31; - - /* Initialise Energy to zero */ - S->energy = 0; - - /* Initialise x0 to zero */ - S->x0 = 0; - -} - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c deleted file mode 100644 index 007db31..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c +++ /dev/null @@ -1,440 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_q15.c -* -* Description: Q15 NLMS filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS_NORM - * @{ - */ - -/** -* @brief Processing function for Q15 normalized LMS filter. -* @param[in] *S points to an instance of the Q15 normalized LMS filter structure. -* @param[in] *pSrc points to the block of input data. -* @param[in] *pRef points to the block of reference data. -* @param[out] *pOut points to the block of output data. -* @param[out] *pErr points to the block of error data. -* @param[in] blockSize number of samples to process. -* @return none. -* -* Scaling and Overflow Behavior: -* \par -* The function is implemented using a 64-bit internal accumulator. -* Both coefficients and state variables are represented in 1.15 format and -* multiplications yield a 2.30 result. The 2.30 intermediate results are -* accumulated in a 64-bit accumulator in 34.30 format. -* There is no risk of internal overflow with this approach and the full -* precision of intermediate multiplications is preserved. After all additions -* have been performed, the accumulator is truncated to 34.15 format by -* discarding low 15 bits. Lastly, the accumulator is saturated to yield a -* result in 1.15 format. -* -* \par -* In this filter, filter coefficients are updated for each sample and the updation of filter cofficients are saturted. -* - */ - -void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - q15_t mu = S->mu; /* Adaptive factor */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - q31_t energy; /* Energy of the input */ - q63_t acc; /* Accumulator */ - q15_t e = 0, d = 0; /* error, reference data sample */ - q15_t w = 0, in; /* weight factor and state */ - q15_t x0; /* temporary variable to hold input sample */ - //uint32_t shift = (uint32_t) S->postShift + 1u; /* Shift to be applied to the output */ - q15_t errorXmu, oneByEnergy; /* Temporary variables to store error and mu product and reciprocal of energy */ - q15_t postShift; /* Post shift to be applied to weight after reciprocal calculation */ - q31_t coef; /* Teporary variable for coefficient */ - q31_t acc_l, acc_h; - int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ - int32_t uShift = (32 - lShift); - - energy = S->energy; - x0 = S->x0; - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy -= (((q31_t) x0 * (x0)) >> 15); - energy += (((q31_t) in * (in)) >> 15); - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - - /* Perform the multiply-accumulate */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - acc = __SMLALD(*__SIMD32(px)++, (*__SIMD32(pb)++), acc); - acc = __SMLALD(*__SIMD32(px)++, (*__SIMD32(pb)++), acc); - -#else - - acc += (((q31_t) * px++ * (*pb++))); - acc += (((q31_t) * px++ * (*pb++))); - acc += (((q31_t) * px++ * (*pb++))); - acc += (((q31_t) * px++ * (*pb++))); - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += (((q31_t) * px++ * (*pb++))); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Converting the result to 1.15 format and saturate the output */ - acc = __SSAT(acc, 16u); - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q15_t) acc; - - /* Compute and store error */ - d = *pRef++; - e = d - (q15_t) acc; - *pErr++ = e; - - /* Calculation of 1/energy */ - postShift = arm_recip_q15((q15_t) energy + DELTA_Q15, - &oneByEnergy, S->recipTable); - - /* Calculation of e * mu value */ - errorXmu = (q15_t) (((q31_t) e * mu) >> 15); - - /* Calculation of (e * mu) * (1/energy) value */ - acc = (((q31_t) errorXmu * oneByEnergy) >> (15 - postShift)); - - /* Weighting factor for the normalized version */ - w = (q15_t) __SSAT((q31_t) acc, 16); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Read the sample from state buffer */ - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Save energy and x0 values for the next frame */ - S->energy = (q15_t) energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Calculation of count for copying integer writes */ - tapCnt = (numTaps - 1u) >> 2; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - -#else - - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - -#endif - - tapCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy -= (((q31_t) x0 * (x0)) >> 15); - energy += (((q31_t) in * (in)) >> 15); - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += (((q31_t) * px++ * (*pb++))); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Converting the result to 1.15 format and saturate the output */ - acc = __SSAT(acc, 16u); - - /* Converting the result to 1.15 format */ - //acc = __SSAT((acc >> (16u - shift)), 16u); - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q15_t) acc; - - /* Compute and store error */ - d = *pRef++; - e = d - (q15_t) acc; - *pErr++ = e; - - /* Calculation of 1/energy */ - postShift = arm_recip_q15((q15_t) energy + DELTA_Q15, - &oneByEnergy, S->recipTable); - - /* Calculation of e * mu value */ - errorXmu = (q15_t) (((q31_t) e * mu) >> 15); - - /* Calculation of (e * mu) * (1/energy) value */ - acc = (((q31_t) errorXmu * oneByEnergy) >> (15 - postShift)); - - /* Weighting factor for the normalized version */ - w = (q15_t) __SSAT((q31_t) acc, 16); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = *pb + (((q31_t) w * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Read the sample from state buffer */ - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Save energy and x0 values for the next frame */ - S->energy = (q15_t) energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* copy (numTaps - 1u) data */ - tapCnt = (numTaps - 1u); - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c deleted file mode 100644 index 20701fa..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c +++ /dev/null @@ -1,431 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_norm_q31.c -* -* Description: Processing function for the Q31 NLMS filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS_NORM - * @{ - */ - -/** -* @brief Processing function for Q31 normalized LMS filter. -* @param[in] *S points to an instance of the Q31 normalized LMS filter structure. -* @param[in] *pSrc points to the block of input data. -* @param[in] *pRef points to the block of reference data. -* @param[out] *pOut points to the block of output data. -* @param[out] *pErr points to the block of error data. -* @param[in] blockSize number of samples to process. -* @return none. -* -* Scaling and Overflow Behavior: -* \par -* The function is implemented using an internal 64-bit accumulator. -* The accumulator has a 2.62 format and maintains full precision of the intermediate -* multiplication results but provides only a single guard bit. -* Thus, if the accumulator result overflows it wraps around rather than clip. -* In order to avoid overflows completely the input signal must be scaled down by -* log2(numTaps) bits. The reference signal should not be scaled down. -* After all multiply-accumulates are performed, the 2.62 accumulator is shifted -* and saturated to 1.31 format to yield the final result. -* The output signal and error signal are in 1.31 format. -* -* \par -* In this filter, filter coefficients are updated for each sample and the -* updation of filter cofficients are saturted. -* -*/ - -void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t *px, *pb; /* Temporary pointers for state and coefficient buffers */ - q31_t mu = S->mu; /* Adaptive factor */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - q63_t energy; /* Energy of the input */ - q63_t acc; /* Accumulator */ - q31_t e = 0, d = 0; /* error, reference data sample */ - q31_t w = 0, in; /* weight factor and state */ - q31_t x0; /* temporary variable to hold input sample */ -// uint32_t shift = 32u - ((uint32_t) S->postShift + 1u); /* Shift to be applied to the output */ - q31_t errorXmu, oneByEnergy; /* Temporary variables to store error and mu product and reciprocal of energy */ - q31_t postShift; /* Post shift to be applied to weight after reciprocal calculation */ - q31_t coef; /* Temporary variable for coef */ - q31_t acc_l, acc_h; /* temporary input */ - uint32_t uShift = ((uint32_t) S->postShift + 1u); - uint32_t lShift = 32u - uShift; /* Shift to be applied to the output */ - - energy = S->energy; - x0 = S->x0; - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - while(blkCnt > 0u) - { - - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy = (q31_t) ((((q63_t) energy << 32) - - (((q63_t) x0 * x0) << 1)) >> 32); - energy = (q31_t) (((((q63_t) in * in) << 1) + (energy << 32)) >> 32); - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += ((q63_t) (*px++)) * (*pb++); - acc += ((q63_t) (*px++)) * (*pb++); - acc += ((q63_t) (*px++)) * (*pb++); - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Converting the result to 1.31 format */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q31_t) acc; - - /* Compute and store error */ - d = *pRef++; - e = d - (q31_t) acc; - *pErr++ = e; - - /* Calculates the reciprocal of energy */ - postShift = arm_recip_q31(energy + DELTA_Q31, - &oneByEnergy, &S->recipTable[0]); - - /* Calculation of product of (e * mu) */ - errorXmu = (q31_t) (((q63_t) e * mu) >> 31); - - /* Weighting factor for the normalized version */ - w = clip_q63_to_q31(((q63_t) errorXmu * oneByEnergy) >> (31 - postShift)); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - - /* coef is in 2.30 format */ - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - /* get coef in 1.31 format by left shifting */ - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - /* update coefficient buffer to next coefficient */ - pb++; - - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Read the sample from state buffer */ - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Save energy and x0 values for the next frame */ - S->energy = (q31_t) energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Loop unrolling for (numTaps - 1u) samples copy */ - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - while(blkCnt > 0u) - { - - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Read the sample from input buffer */ - in = *pSrc++; - - /* Update the energy calculation */ - energy = - (q31_t) ((((q63_t) energy << 32) - (((q63_t) x0 * x0) << 1)) >> 32); - energy = (q31_t) (((((q63_t) in * in) << 1) + (energy << 32)) >> 32); - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Converting the result to 1.31 format */ - /* Converting the result to 1.31 format */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - - //acc = (q31_t) (acc >> shift); - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q31_t) acc; - - /* Compute and store error */ - d = *pRef++; - e = d - (q31_t) acc; - *pErr++ = e; - - /* Calculates the reciprocal of energy */ - postShift = - arm_recip_q31(energy + DELTA_Q31, &oneByEnergy, &S->recipTable[0]); - - /* Calculation of product of (e * mu) */ - errorXmu = (q31_t) (((q63_t) e * mu) >> 31); - - /* Weighting factor for the normalized version */ - w = clip_q63_to_q31(((q63_t) errorXmu * oneByEnergy) >> (31 - postShift)); - - /* Initialize pState pointer */ - px = pState; - - /* Initialize coeff pointer */ - pb = (pCoeffs); - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - /* coef is in 2.30 format */ - coef = (q31_t) (((q63_t) w * (*px++)) >> (32)); - /* get coef in 1.31 format by left shifting */ - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - /* update coefficient buffer to next coefficient */ - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Read the sample from state buffer */ - x0 = *pState; - - /* Advance state pointer by 1 for the next sample */ - pState = pState + 1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Save energy and x0 values for the next frame */ - S->energy = (q31_t) energy; - S->x0 = x0; - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - start of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Loop for (numTaps - 1u) samples copy */ - tapCnt = (numTaps - 1u); - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of LMS_NORM group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c deleted file mode 100644 index 2f1b991..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c +++ /dev/null @@ -1,380 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_q15.c -* -* Description: Processing function for the Q15 LMS filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS - * @{ - */ - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - * - * \par Scaling and Overflow Behavior: - * The function is implemented using a 64-bit internal accumulator. - * Both coefficients and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - * - * \par - * In this filter, filter coefficients are updated for each sample and the updation of filter cofficients are saturted. - * - */ - -void arm_lms_q15( - const arm_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize) -{ - q15_t *pState = S->pState; /* State pointer */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - q15_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q15_t *pStateCurnt; /* Points to the current sample of the state */ - q15_t mu = S->mu; /* Adaptive factor */ - q15_t *px; /* Temporary pointer for state */ - q15_t *pb; /* Temporary pointer for coefficient buffer */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - q63_t acc; /* Accumulator */ - q15_t e = 0; /* error of data sample */ - q15_t alpha; /* Intermediate constant for taps update */ - q31_t coef; /* Teporary variable for coefficient */ - q31_t acc_l, acc_h; - int32_t lShift = (15 - (int32_t) S->postShift); /* Post shift */ - int32_t uShift = (32 - lShift); - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Initializing blkCnt with blockSize */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2u; - - while(tapCnt > 0u) - { - /* acc += b[N] * x[n-N] + b[N-1] * x[n-N-1] */ - /* Perform the multiply-accumulate */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - acc = __SMLALD(*__SIMD32(px)++, (*__SIMD32(pb)++), acc); - acc = __SMLALD(*__SIMD32(px)++, (*__SIMD32(pb)++), acc); - -#else - - acc += (q63_t) (((q31_t) (*px++) * (*pb++))); - acc += (q63_t) (((q31_t) (*px++) * (*pb++))); - acc += (q63_t) (((q31_t) (*px++) * (*pb++))); - acc += (q63_t) (((q31_t) (*px++) * (*pb++))); - - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += (q63_t) (((q31_t) (*px++) * (*pb++))); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Converting the result to 1.15 format and saturate the output */ - acc = __SSAT(acc, 16); - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q15_t) acc; - - /* Compute and store error */ - e = *pRef++ - (q15_t) acc; - - *pErr++ = (q15_t) e; - - /* Compute alpha i.e. intermediate constant for taps update */ - alpha = (q15_t) (((q31_t) e * (mu)) >> 15); - - /* Initialize state pointer */ - /* Advance state pointer by 1 for the next sample */ - px = pState++; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2u; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Calculation of count for copying integer writes */ - tapCnt = (numTaps - 1u) >> 2; - - while(tapCnt > 0u) - { - -#ifndef UNALIGNED_SUPPORT_DISABLE - - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; - *__SIMD32(pStateCurnt)++ = *__SIMD32(pState)++; -#else - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; -#endif - - tapCnt--; - - } - - /* Calculation of count for remaining q15_t data */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += (q63_t) ((q31_t) (*px++) * (*pb++)); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - /* Apply shift for lower part of acc and upper part of acc */ - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Converting the result to 1.15 format and saturate the output */ - acc = __SSAT(acc, 16); - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q15_t) acc; - - /* Compute and store error */ - e = *pRef++ - (q15_t) acc; - - *pErr++ = (q15_t) e; - - /* Compute alpha i.e. intermediate constant for taps update */ - alpha = (q15_t) (((q31_t) e * (mu)) >> 15); - - /* Initialize pState pointer */ - /* Advance state pointer by 1 for the next sample */ - px = pState++; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = (q31_t) * pb + (((q31_t) alpha * (*px++)) >> 15); - *pb++ = (q15_t) __SSAT((coef), 16); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - start of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Copy (numTaps - 1u) samples */ - tapCnt = (numTaps - 1u); - - /* Copy the data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c deleted file mode 100644 index 838e912..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c +++ /dev/null @@ -1,369 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_lms_q31.c -* -* Description: Processing function for the Q31 LMS filter. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -/** - * @ingroup groupFilters - */ - -/** - * @addtogroup LMS - * @{ - */ - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - * - * \par Scaling and Overflow Behavior: - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate - * multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clips. - * In order to avoid overflows completely the input signal must be scaled down by - * log2(numTaps) bits. - * The reference signal should not be scaled down. - * After all multiply-accumulates are performed, the 2.62 accumulator is shifted - * and saturated to 1.31 format to yield the final result. - * The output signal and error signal are in 1.31 format. - * - * \par - * In this filter, filter coefficients are updated for each sample and the updation of filter cofficients are saturted. - */ - -void arm_lms_q31( - const arm_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize) -{ - q31_t *pState = S->pState; /* State pointer */ - uint32_t numTaps = S->numTaps; /* Number of filter coefficients in the filter */ - q31_t *pCoeffs = S->pCoeffs; /* Coefficient pointer */ - q31_t *pStateCurnt; /* Points to the current sample of the state */ - q31_t mu = S->mu; /* Adaptive factor */ - q31_t *px; /* Temporary pointer for state */ - q31_t *pb; /* Temporary pointer for coefficient buffer */ - uint32_t tapCnt, blkCnt; /* Loop counters */ - q63_t acc; /* Accumulator */ - q31_t e = 0; /* error of data sample */ - q31_t alpha; /* Intermediate constant for taps update */ - q31_t coef; /* Temporary variable for coef */ - q31_t acc_l, acc_h; /* temporary input */ - uint32_t uShift = ((uint32_t) S->postShift + 1u); - uint32_t lShift = 32u - uShift; /* Shift to be applied to the output */ - - /* S->pState points to buffer which contains previous frame (numTaps - 1) samples */ - /* pStateCurnt points to the location where the new input data should be written */ - pStateCurnt = &(S->pState[(numTaps - 1u)]); - - /* Initializing blkCnt with blockSize */ - blkCnt = blockSize; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize state pointer */ - px = pState; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - /* acc += b[N] * x[n-N] */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* acc += b[N-1] * x[n-N-1] */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* acc += b[N-2] * x[n-N-2] */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* acc += b[N-3] * x[n-N-3] */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Converting the result to 1.31 format */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - /* Store the result from accumulator into the destination buffer. */ - *pOut++ = (q31_t) acc; - - /* Compute and store error */ - e = *pRef++ - (q31_t) acc; - - *pErr++ = (q31_t) e; - - /* Compute alpha i.e. intermediate constant for taps update */ - alpha = (q31_t) (((q63_t) e * mu) >> 31); - - /* Initialize state pointer */ - /* Advance state pointer by 1 for the next sample */ - px = pState++; - - /* Initialize coefficient pointer */ - pb = pCoeffs; - - /* Loop unrolling. Process 4 taps at a time. */ - tapCnt = numTaps >> 2; - - /* Update filter coefficients */ - while(tapCnt > 0u) - { - /* coef is in 2.30 format */ - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - /* get coef in 1.31 format by left shifting */ - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - /* update coefficient buffer to next coefficient */ - pb++; - - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* If the filter length is not a multiple of 4, compute the remaining filter taps */ - tapCnt = numTaps % 0x4u; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - satrt of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Loop unrolling for (numTaps - 1u) samples copy */ - tapCnt = (numTaps - 1u) >> 2u; - - /* copy data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Calculate remaining number of copies */ - tapCnt = (numTaps - 1u) % 0x4u; - - /* Copy the remaining q31_t data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - while(blkCnt > 0u) - { - /* Copy the new input sample into the state buffer */ - *pStateCurnt++ = *pSrc++; - - /* Initialize pState pointer */ - px = pState; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Set the accumulator to zero */ - acc = 0; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - acc += ((q63_t) (*px++)) * (*pb++); - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Converting the result to 1.31 format */ - /* Store the result from accumulator into the destination buffer. */ - /* Calc lower part of acc */ - acc_l = acc & 0xffffffff; - - /* Calc upper part of acc */ - acc_h = (acc >> 32) & 0xffffffff; - - acc = (uint32_t) acc_l >> lShift | acc_h << uShift; - - *pOut++ = (q31_t) acc; - - /* Compute and store error */ - e = *pRef++ - (q31_t) acc; - - *pErr++ = (q31_t) e; - - /* Weighting factor for the LMS version */ - alpha = (q31_t) (((q63_t) e * mu) >> 31); - - /* Initialize pState pointer */ - /* Advance state pointer by 1 for the next sample */ - px = pState++; - - /* Initialize pCoeffs pointer */ - pb = pCoeffs; - - /* Loop over numTaps number of values */ - tapCnt = numTaps; - - while(tapCnt > 0u) - { - /* Perform the multiply-accumulate */ - coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32)); - *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u)); - pb++; - - /* Decrement the loop counter */ - tapCnt--; - } - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Processing is complete. Now copy the last numTaps - 1 samples to the - start of the state buffer. This prepares the state buffer for the - next function call. */ - - /* Points to the start of the pState buffer */ - pStateCurnt = S->pState; - - /* Copy (numTaps - 1u) samples */ - tapCnt = (numTaps - 1u); - - /* Copy the data */ - while(tapCnt > 0u) - { - *pStateCurnt++ = *pState++; - - /* Decrement the loop counter */ - tapCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of LMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c deleted file mode 100644 index e418492..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c +++ /dev/null @@ -1,208 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_add_f32.c -* -* Description: Floating-point matrix addition -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixAdd Matrix Addition - * - * Adds two matrices. - * \image html MatrixAddition.gif "Addition of two 3 x 3 matrices" - * - * The functions check to make sure that - * pSrcA, pSrcB, and pDst have the same - * number of rows and columns. - */ - -/** - * @addtogroup MatrixAdd - * @{ - */ - - -/** - * @brief Floating-point matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - -#ifndef ARM_MATH_CM0_FAMILY - - float32_t inA1, inA2, inB1, inB2, out1, out2; /* temporary variables */ - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix addition */ - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif - { - - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Loop unrolling */ - blkCnt = numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add and then store the results in the destination buffer. */ - /* Read values from source A */ - inA1 = pIn1[0]; - - /* Read values from source B */ - inB1 = pIn2[0]; - - /* Read values from source A */ - inA2 = pIn1[1]; - - /* out = sourceA + sourceB */ - out1 = inA1 + inB1; - - /* Read values from source B */ - inB2 = pIn2[1]; - - /* Read values from source A */ - inA1 = pIn1[2]; - - /* out = sourceA + sourceB */ - out2 = inA2 + inB2; - - /* Read values from source B */ - inB1 = pIn2[2]; - - /* Store result in destination */ - pOut[0] = out1; - pOut[1] = out2; - - /* Read values from source A */ - inA2 = pIn1[3]; - - /* Read values from source B */ - inB2 = pIn2[3]; - - /* out = sourceA + sourceB */ - out1 = inA1 + inB1; - - /* out = sourceA + sourceB */ - out2 = inA2 + inB2; - - /* Store result in destination */ - pOut[2] = out1; - - /* Store result in destination */ - pOut[3] = out2; - - - /* update pointers to process next sampels */ - pIn1 += 4u; - pIn2 += 4u; - pOut += 4u; - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add and then store the results in the destination buffer. */ - *pOut++ = (*pIn1++) + (*pIn2++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c deleted file mode 100644 index 45d1837..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c +++ /dev/null @@ -1,163 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_add_q15.c -* -* Description: Q15 matrix addition -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixAdd - * @{ - */ - -/** - * @brief Q15 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst) -{ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B */ - q15_t *pOut = pDst->pData; /* output data matrix pointer */ - uint16_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix addition */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Total number of samples in the input matrix */ - numSamples = (uint16_t) (pSrcA->numRows * pSrcA->numCols); - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop unrolling */ - blkCnt = (uint32_t) numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add, Saturate and then store the results in the destination buffer. */ - *__SIMD32(pOut)++ = __QADD16(*__SIMD32(pInA)++, *__SIMD32(pInB)++); - *__SIMD32(pOut)++ = __QADD16(*__SIMD32(pInA)++, *__SIMD32(pInB)++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = (uint32_t) numSamples % 0x4u; - - /* q15 pointers of input and output are initialized */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add, Saturate and then store the results in the destination buffer. */ - *pOut++ = (q15_t) __QADD16(*pInA++, *pInB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = (uint32_t) numSamples; - - - /* q15 pointers of input and output are initialized */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add, Saturate and then store the results in the destination buffer. */ - *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ + *pInB++), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c deleted file mode 100644 index b6ccddb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c +++ /dev/null @@ -1,207 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_add_q31.c -* -* Description: Q31 matrix addition -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixAdd - * @{ - */ - -/** - * @brief Q31 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated. - */ - -arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t inA1, inB1; /* temporary variables */ - -#ifndef ARM_MATH_CM0_FAMILY - - q31_t inA2, inB2; /* temporary variables */ - q31_t out1, out2; /* temporary variables */ - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix addition */ - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop Unrolling */ - blkCnt = numSamples >> 2u; - - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add, saturate and then store the results in the destination buffer. */ - /* Read values from source A */ - inA1 = pIn1[0]; - - /* Read values from source B */ - inB1 = pIn2[0]; - - /* Read values from source A */ - inA2 = pIn1[1]; - - /* Add and saturate */ - out1 = __QADD(inA1, inB1); - - /* Read values from source B */ - inB2 = pIn2[1]; - - /* Read values from source A */ - inA1 = pIn1[2]; - - /* Add and saturate */ - out2 = __QADD(inA2, inB2); - - /* Read values from source B */ - inB1 = pIn2[2]; - - /* Store result in destination */ - pOut[0] = out1; - pOut[1] = out2; - - /* Read values from source A */ - inA2 = pIn1[3]; - - /* Read values from source B */ - inB2 = pIn2[3]; - - /* Add and saturate */ - out1 = __QADD(inA1, inB1); - out2 = __QADD(inA2, inB2); - - /* Store result in destination */ - pOut[2] = out1; - pOut[3] = out2; - - /* update pointers to process next sampels */ - pIn1 += 4u; - pIn2 += 4u; - pOut += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) + B(m,n) */ - /* Add, saturate and then store the results in the destination buffer. */ - inA1 = *pIn1++; - inB1 = *pIn2++; - - inA1 = __QADD(inA1, inB1); - - /* Decrement the loop counter */ - blkCnt--; - - *pOut++ = inA1; - - } - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixAdd group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c deleted file mode 100644 index d9d3388..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c +++ /dev/null @@ -1,283 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_cmplx_mult_f32.c -* -* Description: Floating-point matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup CmplxMatrixMult Complex Matrix Multiplication - * - * Complex Matrix multiplication is only defined if the number of columns of the - * first matrix equals the number of rows of the second matrix. - * Multiplying an M x N matrix with an N x P matrix results - * in an M x P matrix. - * When matrix size checking is enabled, the functions check: (1) that the inner dimensions of - * pSrcA and pSrcB are equal; and (2) that the size of the output - * matrix equals the outer dimensions of pSrcA and pSrcB. - */ - - -/** - * @addtogroup CmplxMatrixMult - * @{ - */ - -/** - * @brief Floating-point Complex matrix multiplication. - * @param[in] *pSrcA points to the first input complex matrix structure - * @param[in] *pSrcB points to the second input complex matrix structure - * @param[out] *pDst points to output complex matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_cmplx_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - float32_t *px; /* Temporary output data matrix pointer */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - float32_t sumReal1, sumImag1; /* accumulator */ - float32_t a0, b0, c0, d0; - float32_t a1, b1, c1, d1; - float32_t sumReal2, sumImag2; /* accumulator */ - - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - uint16_t col, i = 0u, j, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + 2 * i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - j = 0u; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sumReal1 = 0.0f; - sumImag1 = 0.0f; - - sumReal2 = 0.0f; - sumImag2 = 0.0f; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pIn1 = pInA; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - colCnt = numColsA >> 2; - - /* matrix multiplication */ - while(colCnt > 0u) - { - - /* Reading real part of complex matrix A */ - a0 = *pIn1; - - /* Reading real part of complex matrix B */ - c0 = *pIn2; - - /* Reading imaginary part of complex matrix A */ - b0 = *(pIn1 + 1u); - - /* Reading imaginary part of complex matrix B */ - d0 = *(pIn2 + 1u); - - sumReal1 += a0 * c0; - sumImag1 += b0 * c0; - - pIn1 += 2u; - pIn2 += 2 * numColsB; - - sumReal2 -= b0 * d0; - sumImag2 += a0 * d0; - - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - - a1 = *pIn1; - c1 = *pIn2; - - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - sumReal1 += a1 * c1; - sumImag1 += b1 * c1; - - pIn1 += 2u; - pIn2 += 2 * numColsB; - - sumReal2 -= b1 * d1; - sumImag2 += a1 * d1; - - a0 = *pIn1; - c0 = *pIn2; - - b0 = *(pIn1 + 1u); - d0 = *(pIn2 + 1u); - - sumReal1 += a0 * c0; - sumImag1 += b0 * c0; - - pIn1 += 2u; - pIn2 += 2 * numColsB; - - sumReal2 -= b0 * d0; - sumImag2 += a0 * d0; - - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - - a1 = *pIn1; - c1 = *pIn2; - - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - sumReal1 += a1 * c1; - sumImag1 += b1 * c1; - - pIn1 += 2u; - pIn2 += 2 * numColsB; - - sumReal2 -= b1 * d1; - sumImag2 += a1 * d1; - - /* Decrement the loop count */ - colCnt--; - } - - /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - a1 = *pIn1; - c1 = *pIn2; - - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - sumReal1 += a1 * c1; - sumImag1 += b1 * c1; - - pIn1 += 2u; - pIn2 += 2 * numColsB; - - sumReal2 -= b1 * d1; - sumImag2 += a1 * d1; - - /* Decrement the loop counter */ - colCnt--; - } - - sumReal1 += sumReal2; - sumImag1 += sumImag2; - - /* Store the result in the destination buffer */ - *px++ = sumReal1; - *px++ = sumImag1; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - j++; - pIn2 = pSrcB->pData + 2u * j; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - /* Update the pointer pInA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + 2 * numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c deleted file mode 100644 index 46122ab..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c +++ /dev/null @@ -1,424 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cmplx_mat_mult_q15.c -* -* Description: Q15 complex matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup CmplxMatrixMult - * @{ - */ - - -/** - * @brief Q15 Complex matrix multiplication - * @param[in] *pSrcA points to the first input complex matrix structure - * @param[in] *pSrcB points to the second input complex matrix structure - * @param[out] *pDst points to output complex matrix structure - * @param[in] *pScratch points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * \par Conditions for optimum performance - * Input, output and state buffers should be aligned by 32-bit - * - * \par Restrictions - * If the silicon does not support unaligned memory access enable the macro UNALIGNED_SUPPORT_DISABLE - * In this case input, output, scratch buffers should be aligned by 32-bit - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. The inputs to the - * multiplications are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate - * results are accumulated in a 64-bit accumulator in 34.30 format. This approach - * provides 33 guard bits and there is no risk of overflow. The 34.30 result is then - * truncated to 34.15 format by discarding the low 15 bits and then saturated to - * 1.15 format. - * - * \par - * Refer to arm_mat_mult_fast_q15() for a faster but less precise version of this function. - * - */ - - - - -arm_status arm_mat_cmplx_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pScratch) -{ - /* accumulator */ - q15_t *pSrcBT = pScratch; /* input data matrix pointer for transpose */ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A of Q15 type */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B of Q15 type */ - q15_t *px; /* Temporary output data matrix pointer */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - uint16_t numRowsB = pSrcB->numRows; /* number of rows of input matrix A */ - uint16_t col, i = 0u, row = numRowsB, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - q63_t sumReal, sumImag; - -#ifdef UNALIGNED_SUPPORT_DISABLE - q15_t in; /* Temporary variable to hold the input value */ - q15_t a, b, c, d; -#else - q31_t in; /* Temporary variable to hold the input value */ - q31_t prod1, prod2; - q31_t pSourceA, pSourceB; -#endif - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif - { - /* Matrix transpose */ - do - { - /* Apply loop unrolling and exchange the columns with row elements */ - col = numColsB >> 2; - - /* The pointer px is set to starting address of the column being processed */ - px = pSrcBT + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(col > 0u) - { -#ifdef UNALIGNED_SUPPORT_DISABLE - /* Read two elements from the row */ - in = *pInB++; - *px = in; - in = *pInB++; - px[1] = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Read two elements from the row */ - in = *pInB++; - *px = in; - in = *pInB++; - px[1] = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Read two elements from the row */ - in = *pInB++; - *px = in; - in = *pInB++; - px[1] = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Read two elements from the row */ - in = *pInB++; - *px = in; - in = *pInB++; - px[1] = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Decrement the column loop counter */ - col--; - } - - /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - col = numColsB % 0x4u; - - while(col > 0u) - { - /* Read two elements from the row */ - in = *pInB++; - *px = in; - in = *pInB++; - px[1] = in; -#else - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - *__SIMD32(px) = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - *__SIMD32(px) = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - *__SIMD32(px) = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - *__SIMD32(px) = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Decrement the column loop counter */ - col--; - } - - /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - col = numColsB % 0x4u; - - while(col > 0u) - { - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - *__SIMD32(px) = in; -#endif - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB * 2; - - /* Decrement the column loop counter */ - col--; - } - - i = i + 2u; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* Reset the variables for the usage in the following multiplication process */ - row = numRowsA; - i = 0u; - px = pDst->pData; - - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the transposed pSrcB data */ - pInB = pSrcBT; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sumReal = 0; - sumImag = 0; - - /* Apply loop unrolling and compute 2 MACs simultaneously. */ - colCnt = numColsA >> 1; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pInA = pSrcA->pData + i * 2; - - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - -#ifdef UNALIGNED_SUPPORT_DISABLE - - /* read real and imag values from pSrcA buffer */ - a = *pInA; - b = *(pInA + 1u); - /* read real and imag values from pSrcB buffer */ - c = *pInB; - d = *(pInB + 1u); - - /* Multiply and Accumlates */ - sumReal += (q31_t) a *c; - sumImag += (q31_t) a *d; - sumReal -= (q31_t) b *d; - sumImag += (q31_t) b *c; - - /* read next real and imag values from pSrcA buffer */ - a = *(pInA + 2u); - b = *(pInA + 3u); - /* read next real and imag values from pSrcB buffer */ - c = *(pInB + 2u); - d = *(pInB + 3u); - - /* update pointer */ - pInA += 4u; - - /* Multiply and Accumlates */ - sumReal += (q31_t) a *c; - sumImag += (q31_t) a *d; - sumReal -= (q31_t) b *d; - sumImag += (q31_t) b *c; - /* update pointer */ - pInB += 4u; -#else - /* read real and imag values from pSrcA and pSrcB buffer */ - pSourceA = *__SIMD32(pInA)++; - pSourceB = *__SIMD32(pInB)++; - - /* Multiply and Accumlates */ -#ifdef ARM_MATH_BIG_ENDIAN - prod1 = -__SMUSD(pSourceA, pSourceB); -#else - prod1 = __SMUSD(pSourceA, pSourceB); -#endif - prod2 = __SMUADX(pSourceA, pSourceB); - sumReal += (q63_t) prod1; - sumImag += (q63_t) prod2; - - /* read real and imag values from pSrcA and pSrcB buffer */ - pSourceA = *__SIMD32(pInA)++; - pSourceB = *__SIMD32(pInB)++; - - /* Multiply and Accumlates */ -#ifdef ARM_MATH_BIG_ENDIAN - prod1 = -__SMUSD(pSourceA, pSourceB); -#else - prod1 = __SMUSD(pSourceA, pSourceB); -#endif - prod2 = __SMUADX(pSourceA, pSourceB); - sumReal += (q63_t) prod1; - sumImag += (q63_t) prod2; - -#endif /* #ifdef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - colCnt--; - } - - /* process odd column samples */ - if((numColsA & 0x1u) > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - -#ifdef UNALIGNED_SUPPORT_DISABLE - - /* read real and imag values from pSrcA and pSrcB buffer */ - a = *pInA++; - b = *pInA++; - c = *pInB++; - d = *pInB++; - - /* Multiply and Accumlates */ - sumReal += (q31_t) a *c; - sumImag += (q31_t) a *d; - sumReal -= (q31_t) b *d; - sumImag += (q31_t) b *c; - -#else - /* read real and imag values from pSrcA and pSrcB buffer */ - pSourceA = *__SIMD32(pInA)++; - pSourceB = *__SIMD32(pInB)++; - - /* Multiply and Accumlates */ -#ifdef ARM_MATH_BIG_ENDIAN - prod1 = -__SMUSD(pSourceA, pSourceB); -#else - prod1 = __SMUSD(pSourceA, pSourceB); -#endif - prod2 = __SMUADX(pSourceA, pSourceB); - sumReal += (q63_t) prod1; - sumImag += (q63_t) prod2; - -#endif /* #ifdef UNALIGNED_SUPPORT_DISABLE */ - - } - - /* Saturate and store the result in the destination buffer */ - - *px++ = (q15_t) (__SSAT(sumReal >> 15, 16)); - *px++ = (q15_t) (__SSAT(sumImag >> 15, 16)); - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - i = i + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c deleted file mode 100644 index 4053554..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c +++ /dev/null @@ -1,293 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_cmplx_mult_q31.c -* -* Description: Floating-point matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup CmplxMatrixMult - * @{ - */ - -/** - * @brief Q31 Complex matrix multiplication - * @param[in] *pSrcA points to the first input complex matrix structure - * @param[in] *pSrcB points to the second input complex matrix structure - * @param[out] *pDst points to output complex matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate - * multiplication results but provides only a single guard bit. There is no saturation - * on intermediate additions. Thus, if the accumulator overflows it wraps around and - * distorts the result. The input signals should be scaled down to avoid intermediate - * overflows. The input is thus scaled down by log2(numColsA) bits - * to avoid overflows, as a total of numColsA additions are performed internally. - * The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. - * - * - */ - -arm_status arm_mat_cmplx_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t *px; /* Temporary output data matrix pointer */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - q63_t sumReal1, sumImag1; /* accumulator */ - q31_t a0, b0, c0, d0; - q31_t a1, b1, c1, d1; - - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - uint16_t col, i = 0u, j, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + 2 * i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - j = 0u; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sumReal1 = 0.0; - sumImag1 = 0.0; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pIn1 = pInA; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - colCnt = numColsA >> 2; - - /* matrix multiplication */ - while(colCnt > 0u) - { - - /* Reading real part of complex matrix A */ - a0 = *pIn1; - - /* Reading real part of complex matrix B */ - c0 = *pIn2; - - /* Reading imaginary part of complex matrix A */ - b0 = *(pIn1 + 1u); - - /* Reading imaginary part of complex matrix B */ - d0 = *(pIn2 + 1u); - - /* Multiply and Accumlates */ - sumReal1 += (q63_t) a0 *c0; - sumImag1 += (q63_t) b0 *c0; - - /* update pointers */ - pIn1 += 2u; - pIn2 += 2 * numColsB; - - /* Multiply and Accumlates */ - sumReal1 -= (q63_t) b0 *d0; - sumImag1 += (q63_t) a0 *d0; - - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - - /* read real and imag values from pSrcA and pSrcB buffer */ - a1 = *pIn1; - c1 = *pIn2; - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - /* Multiply and Accumlates */ - sumReal1 += (q63_t) a1 *c1; - sumImag1 += (q63_t) b1 *c1; - - /* update pointers */ - pIn1 += 2u; - pIn2 += 2 * numColsB; - - /* Multiply and Accumlates */ - sumReal1 -= (q63_t) b1 *d1; - sumImag1 += (q63_t) a1 *d1; - - a0 = *pIn1; - c0 = *pIn2; - - b0 = *(pIn1 + 1u); - d0 = *(pIn2 + 1u); - - /* Multiply and Accumlates */ - sumReal1 += (q63_t) a0 *c0; - sumImag1 += (q63_t) b0 *c0; - - /* update pointers */ - pIn1 += 2u; - pIn2 += 2 * numColsB; - - /* Multiply and Accumlates */ - sumReal1 -= (q63_t) b0 *d0; - sumImag1 += (q63_t) a0 *d0; - - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - - a1 = *pIn1; - c1 = *pIn2; - - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - /* Multiply and Accumlates */ - sumReal1 += (q63_t) a1 *c1; - sumImag1 += (q63_t) b1 *c1; - - /* update pointers */ - pIn1 += 2u; - pIn2 += 2 * numColsB; - - /* Multiply and Accumlates */ - sumReal1 -= (q63_t) b1 *d1; - sumImag1 += (q63_t) a1 *d1; - - /* Decrement the loop count */ - colCnt--; - } - - /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - a1 = *pIn1; - c1 = *pIn2; - - b1 = *(pIn1 + 1u); - d1 = *(pIn2 + 1u); - - /* Multiply and Accumlates */ - sumReal1 += (q63_t) a1 *c1; - sumImag1 += (q63_t) b1 *c1; - - /* update pointers */ - pIn1 += 2u; - pIn2 += 2 * numColsB; - - /* Multiply and Accumlates */ - sumReal1 -= (q63_t) b1 *d1; - sumImag1 += (q63_t) a1 *d1; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Store the result in the destination buffer */ - *px++ = (q31_t) clip_q63_to_q31(sumReal1 >> 31); - *px++ = (q31_t) clip_q63_to_q31(sumImag1 >> 31); - - /* Update the pointer pIn2 to point to the starting address of the next column */ - j++; - pIn2 = pSrcB->pData + 2u * j; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - /* Update the pointer pInA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + 2 * numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c deleted file mode 100644 index 2a670b3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c +++ /dev/null @@ -1,88 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_init_f32.c -* -* Description: Floating-point matrix initialization. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixInit Matrix Initialization - * - * Initializes the underlying matrix data structure. - * The functions set the numRows, - * numCols, and pData fields - * of the matrix data structure. - */ - -/** - * @addtogroup MatrixInit - * @{ - */ - -/** - * @brief Floating-point matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - -void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData) -{ - /* Assign Number of Rows */ - S->numRows = nRows; - - /* Assign Number of Columns */ - S->numCols = nColumns; - - /* Assign Data pointer */ - S->pData = pData; -} - -/** - * @} end of MatrixInit group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c deleted file mode 100644 index 84f4ccb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c +++ /dev/null @@ -1,80 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_init_q15.c -* -* Description: Q15 matrix initialization. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixInit - * @{ - */ - - /** - * @brief Q15 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - -void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData) -{ - /* Assign Number of Rows */ - S->numRows = nRows; - - /* Assign Number of Columns */ - S->numCols = nColumns; - - /* Assign Data pointer */ - S->pData = pData; -} - -/** - * @} end of MatrixInit group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c deleted file mode 100644 index 3fefda4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c +++ /dev/null @@ -1,84 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_init_q31.c -* -* Description: Q31 matrix initialization. -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixInit Matrix Initialization - * - */ - -/** - * @addtogroup MatrixInit - * @{ - */ - - /** - * @brief Q31 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - -void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData) -{ - /* Assign Number of Rows */ - S->numRows = nRows; - - /* Assign Number of Columns */ - S->numCols = nColumns; - - /* Assign Data pointer */ - S->pData = pData; -} - -/** - * @} end of MatrixInit group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c deleted file mode 100644 index f6fb9da..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c +++ /dev/null @@ -1,703 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_inverse_f32.c -* -* Description: Floating-point matrix inverse. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixInv Matrix Inverse - * - * Computes the inverse of a matrix. - * - * The inverse is defined only if the input matrix is square and non-singular (the determinant - * is non-zero). The function checks that the input and output matrices are square and of the - * same size. - * - * Matrix inversion is numerically sensitive and the CMSIS DSP library only supports matrix - * inversion of floating-point matrices. - * - * \par Algorithm - * The Gauss-Jordan method is used to find the inverse. - * The algorithm performs a sequence of elementary row-operations until it - * reduces the input matrix to an identity matrix. Applying the same sequence - * of elementary row-operations to an identity matrix yields the inverse matrix. - * If the input matrix is singular, then the algorithm terminates and returns error status - * ARM_MATH_SINGULAR. - * \image html MatrixInverse.gif "Matrix Inverse of a 3 x 3 matrix using Gauss-Jordan Method" - */ - -/** - * @addtogroup MatrixInv - * @{ - */ - -/** - * @brief Floating-point matrix inverse. - * @param[in] *pSrc points to input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns - * ARM_MATH_SIZE_MISMATCH if the input matrix is not square or if the size - * of the output matrix does not match the size of the input matrix. - * If the input matrix is found to be singular (non-invertible), then the function returns - * ARM_MATH_SINGULAR. Otherwise, the function returns ARM_MATH_SUCCESS. - */ - -arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn = pSrc->pData; /* input data matrix pointer */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - float32_t *pInT1, *pInT2; /* Temporary input data matrix pointer */ - float32_t *pOutT1, *pOutT2; /* Temporary output data matrix pointer */ - float32_t *pPivotRowIn, *pPRT_in, *pPivotRowDst, *pPRT_pDst; /* Temporary input and output data matrix pointer */ - uint32_t numRows = pSrc->numRows; /* Number of rows in the matrix */ - uint32_t numCols = pSrc->numCols; /* Number of Cols in the matrix */ - -#ifndef ARM_MATH_CM0_FAMILY - float32_t maxC; /* maximum value in the column */ - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t Xchg, in = 0.0f, in1; /* Temporary input values */ - uint32_t i, rowCnt, flag = 0u, j, loopCnt, k, l; /* loop counters */ - arm_status status; /* status of matrix inverse */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pSrc->numCols) || (pDst->numRows != pDst->numCols) - || (pSrc->numRows != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - - /*-------------------------------------------------------------------------------------------------------------- - * Matrix Inverse can be solved using elementary row operations. - * - * Gauss-Jordan Method: - * - * 1. First combine the identity matrix and the input matrix separated by a bar to form an - * augmented matrix as follows: - * _ _ _ _ - * | a11 a12 | 1 0 | | X11 X12 | - * | | | = | | - * |_ a21 a22 | 0 1 _| |_ X21 X21 _| - * - * 2. In our implementation, pDst Matrix is used as identity matrix. - * - * 3. Begin with the first row. Let i = 1. - * - * 4. Check to see if the pivot for column i is the greatest of the column. - * The pivot is the element of the main diagonal that is on the current row. - * For instance, if working with row i, then the pivot element is aii. - * If the pivot is not the most significant of the columns, exchange that row with a row - * below it that does contain the most significant value in column i. If the most - * significant value of the column is zero, then an inverse to that matrix does not exist. - * The most significant value of the column is the absolute maximum. - * - * 5. Divide every element of row i by the pivot. - * - * 6. For every row below and row i, replace that row with the sum of that row and - * a multiple of row i so that each new element in column i below row i is zero. - * - * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros - * for every element below and above the main diagonal. - * - * 8. Now an identical matrix is formed to the left of the bar(input matrix, pSrc). - * Therefore, the matrix to the right of the bar is our solution(pDst matrix, pDst). - *----------------------------------------------------------------------------------------------------------------*/ - - /* Working pointer for destination matrix */ - pOutT1 = pOut; - - /* Loop over the number of rows */ - rowCnt = numRows; - - /* Making the destination matrix as identity matrix */ - while(rowCnt > 0u) - { - /* Writing all zeroes in lower triangle of the destination matrix */ - j = numRows - rowCnt; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Writing all ones in the diagonal of the destination matrix */ - *pOutT1++ = 1.0f; - - /* Writing all zeroes in upper triangle of the destination matrix */ - j = rowCnt - 1u; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Decrement the loop counter */ - rowCnt--; - } - - /* Loop over the number of columns of the input matrix. - All the elements in each column are processed by the row operations */ - loopCnt = numCols; - - /* Index modifier to navigate through the columns */ - l = 0u; - - while(loopCnt > 0u) - { - /* Check if the pivot element is zero.. - * If it is zero then interchange the row with non zero row below. - * If there is no non zero element to replace in the rows below, - * then the matrix is Singular. */ - - /* Working pointer for the input matrix that points - * to the pivot element of the particular row */ - pInT1 = pIn + (l * numCols); - - /* Working pointer for the destination matrix that points - * to the pivot element of the particular row */ - pOutT1 = pOut + (l * numCols); - - /* Temporary variable to hold the pivot value */ - in = *pInT1; - - /* Grab the most significant value from column l */ - maxC = 0; - for (i = l; i < numRows; i++) - { - maxC = *pInT1 > 0 ? (*pInT1 > maxC ? *pInT1 : maxC) : (-*pInT1 > maxC ? -*pInT1 : maxC); - pInT1 += numCols; - } - - /* Update the status if the matrix is singular */ - if(maxC == 0.0f) - { - return ARM_MATH_SINGULAR; - } - - /* Restore pInT1 */ - pInT1 = pIn; - - /* Destination pointer modifier */ - k = 1u; - - /* Check if the pivot element is the most significant of the column */ - if( (in > 0.0f ? in : -in) != maxC) - { - /* Loop over the number rows present below */ - i = numRows - (l + 1u); - - while(i > 0u) - { - /* Update the input and destination pointers */ - pInT2 = pInT1 + (numCols * l); - pOutT2 = pOutT1 + (numCols * k); - - /* Look for the most significant element to - * replace in the rows below */ - if((*pInT2 > 0.0f ? *pInT2: -*pInT2) == maxC) - { - /* Loop over number of columns - * to the right of the pilot element */ - j = numCols - l; - - while(j > 0u) - { - /* Exchange the row elements of the input matrix */ - Xchg = *pInT2; - *pInT2++ = *pInT1; - *pInT1++ = Xchg; - - /* Decrement the loop counter */ - j--; - } - - /* Loop over number of columns of the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Exchange the row elements of the destination matrix */ - Xchg = *pOutT2; - *pOutT2++ = *pOutT1; - *pOutT1++ = Xchg; - - /* Decrement the loop counter */ - j--; - } - - /* Flag to indicate whether exchange is done or not */ - flag = 1u; - - /* Break after exchange is done */ - break; - } - - /* Update the destination pointer modifier */ - k++; - - /* Decrement the loop counter */ - i--; - } - } - - /* Update the status if the matrix is singular */ - if((flag != 1u) && (in == 0.0f)) - { - return ARM_MATH_SINGULAR; - } - - /* Points to the pivot row of input and destination matrices */ - pPivotRowIn = pIn + (l * numCols); - pPivotRowDst = pOut + (l * numCols); - - /* Temporary pointers to the pivot row pointers */ - pInT1 = pPivotRowIn; - pInT2 = pPivotRowDst; - - /* Pivot element of the row */ - in = *pPivotRowIn; - - /* Loop over number of columns - * to the right of the pilot element */ - j = (numCols - l); - - while(j > 0u) - { - /* Divide each element of the row of the input matrix - * by the pivot element */ - in1 = *pInT1; - *pInT1++ = in1 / in; - - /* Decrement the loop counter */ - j--; - } - - /* Loop over number of columns of the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Divide each element of the row of the destination matrix - * by the pivot element */ - in1 = *pInT2; - *pInT2++ = in1 / in; - - /* Decrement the loop counter */ - j--; - } - - /* Replace the rows with the sum of that row and a multiple of row i - * so that each new element in column i above row i is zero.*/ - - /* Temporary pointers for input and destination matrices */ - pInT1 = pIn; - pInT2 = pOut; - - /* index used to check for pivot element */ - i = 0u; - - /* Loop over number of rows */ - /* to be replaced by the sum of that row and a multiple of row i */ - k = numRows; - - while(k > 0u) - { - /* Check for the pivot element */ - if(i == l) - { - /* If the processing element is the pivot element, - only the columns to the right are to be processed */ - pInT1 += numCols - l; - - pInT2 += numCols; - } - else - { - /* Element of the reference row */ - in = *pInT1; - - /* Working pointers for input and destination pivot rows */ - pPRT_in = pPivotRowIn; - pPRT_pDst = pPivotRowDst; - - /* Loop over the number of columns to the right of the pivot element, - to replace the elements in the input matrix */ - j = (numCols - l); - - while(j > 0u) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - in1 = *pInT1; - *pInT1++ = in1 - (in * *pPRT_in++); - - /* Decrement the loop counter */ - j--; - } - - /* Loop over the number of columns to - replace the elements in the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - in1 = *pInT2; - *pInT2++ = in1 - (in * *pPRT_pDst++); - - /* Decrement the loop counter */ - j--; - } - - } - - /* Increment the temporary input pointer */ - pInT1 = pInT1 + l; - - /* Decrement the loop counter */ - k--; - - /* Increment the pivot index */ - i++; - } - - /* Increment the input pointer */ - pIn++; - - /* Decrement the loop counter */ - loopCnt--; - - /* Increment the index modifier */ - l++; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t Xchg, in = 0.0f; /* Temporary input values */ - uint32_t i, rowCnt, flag = 0u, j, loopCnt, k, l; /* loop counters */ - arm_status status; /* status of matrix inverse */ - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pSrc->numCols) || (pDst->numRows != pDst->numCols) - || (pSrc->numRows != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - { - - /*-------------------------------------------------------------------------------------------------------------- - * Matrix Inverse can be solved using elementary row operations. - * - * Gauss-Jordan Method: - * - * 1. First combine the identity matrix and the input matrix separated by a bar to form an - * augmented matrix as follows: - * _ _ _ _ _ _ _ _ - * | | a11 a12 | | | 1 0 | | | X11 X12 | - * | | | | | | | = | | - * |_ |_ a21 a22 _| | |_0 1 _| _| |_ X21 X21 _| - * - * 2. In our implementation, pDst Matrix is used as identity matrix. - * - * 3. Begin with the first row. Let i = 1. - * - * 4. Check to see if the pivot for row i is zero. - * The pivot is the element of the main diagonal that is on the current row. - * For instance, if working with row i, then the pivot element is aii. - * If the pivot is zero, exchange that row with a row below it that does not - * contain a zero in column i. If this is not possible, then an inverse - * to that matrix does not exist. - * - * 5. Divide every element of row i by the pivot. - * - * 6. For every row below and row i, replace that row with the sum of that row and - * a multiple of row i so that each new element in column i below row i is zero. - * - * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros - * for every element below and above the main diagonal. - * - * 8. Now an identical matrix is formed to the left of the bar(input matrix, src). - * Therefore, the matrix to the right of the bar is our solution(dst matrix, dst). - *----------------------------------------------------------------------------------------------------------------*/ - - /* Working pointer for destination matrix */ - pOutT1 = pOut; - - /* Loop over the number of rows */ - rowCnt = numRows; - - /* Making the destination matrix as identity matrix */ - while(rowCnt > 0u) - { - /* Writing all zeroes in lower triangle of the destination matrix */ - j = numRows - rowCnt; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Writing all ones in the diagonal of the destination matrix */ - *pOutT1++ = 1.0f; - - /* Writing all zeroes in upper triangle of the destination matrix */ - j = rowCnt - 1u; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Decrement the loop counter */ - rowCnt--; - } - - /* Loop over the number of columns of the input matrix. - All the elements in each column are processed by the row operations */ - loopCnt = numCols; - - /* Index modifier to navigate through the columns */ - l = 0u; - //for(loopCnt = 0u; loopCnt < numCols; loopCnt++) - while(loopCnt > 0u) - { - /* Check if the pivot element is zero.. - * If it is zero then interchange the row with non zero row below. - * If there is no non zero element to replace in the rows below, - * then the matrix is Singular. */ - - /* Working pointer for the input matrix that points - * to the pivot element of the particular row */ - pInT1 = pIn + (l * numCols); - - /* Working pointer for the destination matrix that points - * to the pivot element of the particular row */ - pOutT1 = pOut + (l * numCols); - - /* Temporary variable to hold the pivot value */ - in = *pInT1; - - /* Destination pointer modifier */ - k = 1u; - - /* Check if the pivot element is zero */ - if(*pInT1 == 0.0f) - { - /* Loop over the number rows present below */ - for (i = (l + 1u); i < numRows; i++) - { - /* Update the input and destination pointers */ - pInT2 = pInT1 + (numCols * l); - pOutT2 = pOutT1 + (numCols * k); - - /* Check if there is a non zero pivot element to - * replace in the rows below */ - if(*pInT2 != 0.0f) - { - /* Loop over number of columns - * to the right of the pilot element */ - for (j = 0u; j < (numCols - l); j++) - { - /* Exchange the row elements of the input matrix */ - Xchg = *pInT2; - *pInT2++ = *pInT1; - *pInT1++ = Xchg; - } - - for (j = 0u; j < numCols; j++) - { - Xchg = *pOutT2; - *pOutT2++ = *pOutT1; - *pOutT1++ = Xchg; - } - - /* Flag to indicate whether exchange is done or not */ - flag = 1u; - - /* Break after exchange is done */ - break; - } - - /* Update the destination pointer modifier */ - k++; - } - } - - /* Update the status if the matrix is singular */ - if((flag != 1u) && (in == 0.0f)) - { - return ARM_MATH_SINGULAR; - } - - /* Points to the pivot row of input and destination matrices */ - pPivotRowIn = pIn + (l * numCols); - pPivotRowDst = pOut + (l * numCols); - - /* Temporary pointers to the pivot row pointers */ - pInT1 = pPivotRowIn; - pOutT1 = pPivotRowDst; - - /* Pivot element of the row */ - in = *(pIn + (l * numCols)); - - /* Loop over number of columns - * to the right of the pilot element */ - for (j = 0u; j < (numCols - l); j++) - { - /* Divide each element of the row of the input matrix - * by the pivot element */ - *pInT1 = *pInT1 / in; - pInT1++; - } - for (j = 0u; j < numCols; j++) - { - /* Divide each element of the row of the destination matrix - * by the pivot element */ - *pOutT1 = *pOutT1 / in; - pOutT1++; - } - - /* Replace the rows with the sum of that row and a multiple of row i - * so that each new element in column i above row i is zero.*/ - - /* Temporary pointers for input and destination matrices */ - pInT1 = pIn; - pOutT1 = pOut; - - for (i = 0u; i < numRows; i++) - { - /* Check for the pivot element */ - if(i == l) - { - /* If the processing element is the pivot element, - only the columns to the right are to be processed */ - pInT1 += numCols - l; - pOutT1 += numCols; - } - else - { - /* Element of the reference row */ - in = *pInT1; - - /* Working pointers for input and destination pivot rows */ - pPRT_in = pPivotRowIn; - pPRT_pDst = pPivotRowDst; - - /* Loop over the number of columns to the right of the pivot element, - to replace the elements in the input matrix */ - for (j = 0u; j < (numCols - l); j++) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - *pInT1 = *pInT1 - (in * *pPRT_in++); - pInT1++; - } - /* Loop over the number of columns to - replace the elements in the destination matrix */ - for (j = 0u; j < numCols; j++) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - *pOutT1 = *pOutT1 - (in * *pPRT_pDst++); - pOutT1++; - } - - } - /* Increment the temporary input pointer */ - pInT1 = pInT1 + l; - } - /* Increment the input pointer */ - pIn++; - - /* Decrement the loop counter */ - loopCnt--; - /* Increment the index modifier */ - l++; - } - - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - if((flag != 1u) && (in == 0.0f)) - { - pIn = pSrc->pData; - for (i = 0; i < numRows * numCols; i++) - { - if (pIn[i] != 0.0f) - break; - } - - if (i == numRows * numCols) - status = ARM_MATH_SINGULAR; - } - } - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixInv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c deleted file mode 100644 index 5fe42d4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c +++ /dev/null @@ -1,703 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_inverse_f64.c -* -* Description: Floating-point matrix inverse. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixInv Matrix Inverse - * - * Computes the inverse of a matrix. - * - * The inverse is defined only if the input matrix is square and non-singular (the determinant - * is non-zero). The function checks that the input and output matrices are square and of the - * same size. - * - * Matrix inversion is numerically sensitive and the CMSIS DSP library only supports matrix - * inversion of floating-point matrices. - * - * \par Algorithm - * The Gauss-Jordan method is used to find the inverse. - * The algorithm performs a sequence of elementary row-operations until it - * reduces the input matrix to an identity matrix. Applying the same sequence - * of elementary row-operations to an identity matrix yields the inverse matrix. - * If the input matrix is singular, then the algorithm terminates and returns error status - * ARM_MATH_SINGULAR. - * \image html MatrixInverse.gif "Matrix Inverse of a 3 x 3 matrix using Gauss-Jordan Method" - */ - -/** - * @addtogroup MatrixInv - * @{ - */ - -/** - * @brief Floating-point matrix inverse. - * @param[in] *pSrc points to input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns - * ARM_MATH_SIZE_MISMATCH if the input matrix is not square or if the size - * of the output matrix does not match the size of the input matrix. - * If the input matrix is found to be singular (non-invertible), then the function returns - * ARM_MATH_SINGULAR. Otherwise, the function returns ARM_MATH_SUCCESS. - */ - -arm_status arm_mat_inverse_f64( - const arm_matrix_instance_f64 * pSrc, - arm_matrix_instance_f64 * pDst) -{ - float64_t *pIn = pSrc->pData; /* input data matrix pointer */ - float64_t *pOut = pDst->pData; /* output data matrix pointer */ - float64_t *pInT1, *pInT2; /* Temporary input data matrix pointer */ - float64_t *pOutT1, *pOutT2; /* Temporary output data matrix pointer */ - float64_t *pPivotRowIn, *pPRT_in, *pPivotRowDst, *pPRT_pDst; /* Temporary input and output data matrix pointer */ - uint32_t numRows = pSrc->numRows; /* Number of rows in the matrix */ - uint32_t numCols = pSrc->numCols; /* Number of Cols in the matrix */ - -#ifndef ARM_MATH_CM0_FAMILY - float64_t maxC; /* maximum value in the column */ - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float64_t Xchg, in = 0.0f, in1; /* Temporary input values */ - uint32_t i, rowCnt, flag = 0u, j, loopCnt, k, l; /* loop counters */ - arm_status status; /* status of matrix inverse */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pSrc->numCols) || (pDst->numRows != pDst->numCols) - || (pSrc->numRows != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - - /*-------------------------------------------------------------------------------------------------------------- - * Matrix Inverse can be solved using elementary row operations. - * - * Gauss-Jordan Method: - * - * 1. First combine the identity matrix and the input matrix separated by a bar to form an - * augmented matrix as follows: - * _ _ _ _ - * | a11 a12 | 1 0 | | X11 X12 | - * | | | = | | - * |_ a21 a22 | 0 1 _| |_ X21 X21 _| - * - * 2. In our implementation, pDst Matrix is used as identity matrix. - * - * 3. Begin with the first row. Let i = 1. - * - * 4. Check to see if the pivot for column i is the greatest of the column. - * The pivot is the element of the main diagonal that is on the current row. - * For instance, if working with row i, then the pivot element is aii. - * If the pivot is not the most significant of the columns, exchange that row with a row - * below it that does contain the most significant value in column i. If the most - * significant value of the column is zero, then an inverse to that matrix does not exist. - * The most significant value of the column is the absolute maximum. - * - * 5. Divide every element of row i by the pivot. - * - * 6. For every row below and row i, replace that row with the sum of that row and - * a multiple of row i so that each new element in column i below row i is zero. - * - * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros - * for every element below and above the main diagonal. - * - * 8. Now an identical matrix is formed to the left of the bar(input matrix, pSrc). - * Therefore, the matrix to the right of the bar is our solution(pDst matrix, pDst). - *----------------------------------------------------------------------------------------------------------------*/ - - /* Working pointer for destination matrix */ - pOutT1 = pOut; - - /* Loop over the number of rows */ - rowCnt = numRows; - - /* Making the destination matrix as identity matrix */ - while(rowCnt > 0u) - { - /* Writing all zeroes in lower triangle of the destination matrix */ - j = numRows - rowCnt; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Writing all ones in the diagonal of the destination matrix */ - *pOutT1++ = 1.0f; - - /* Writing all zeroes in upper triangle of the destination matrix */ - j = rowCnt - 1u; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Decrement the loop counter */ - rowCnt--; - } - - /* Loop over the number of columns of the input matrix. - All the elements in each column are processed by the row operations */ - loopCnt = numCols; - - /* Index modifier to navigate through the columns */ - l = 0u; - - while(loopCnt > 0u) - { - /* Check if the pivot element is zero.. - * If it is zero then interchange the row with non zero row below. - * If there is no non zero element to replace in the rows below, - * then the matrix is Singular. */ - - /* Working pointer for the input matrix that points - * to the pivot element of the particular row */ - pInT1 = pIn + (l * numCols); - - /* Working pointer for the destination matrix that points - * to the pivot element of the particular row */ - pOutT1 = pOut + (l * numCols); - - /* Temporary variable to hold the pivot value */ - in = *pInT1; - - /* Grab the most significant value from column l */ - maxC = 0; - for (i = l; i < numRows; i++) - { - maxC = *pInT1 > 0 ? (*pInT1 > maxC ? *pInT1 : maxC) : (-*pInT1 > maxC ? -*pInT1 : maxC); - pInT1 += numCols; - } - - /* Update the status if the matrix is singular */ - if(maxC == 0.0f) - { - return ARM_MATH_SINGULAR; - } - - /* Restore pInT1 */ - pInT1 = pIn; - - /* Destination pointer modifier */ - k = 1u; - - /* Check if the pivot element is the most significant of the column */ - if( (in > 0.0f ? in : -in) != maxC) - { - /* Loop over the number rows present below */ - i = numRows - (l + 1u); - - while(i > 0u) - { - /* Update the input and destination pointers */ - pInT2 = pInT1 + (numCols * l); - pOutT2 = pOutT1 + (numCols * k); - - /* Look for the most significant element to - * replace in the rows below */ - if((*pInT2 > 0.0f ? *pInT2: -*pInT2) == maxC) - { - /* Loop over number of columns - * to the right of the pilot element */ - j = numCols - l; - - while(j > 0u) - { - /* Exchange the row elements of the input matrix */ - Xchg = *pInT2; - *pInT2++ = *pInT1; - *pInT1++ = Xchg; - - /* Decrement the loop counter */ - j--; - } - - /* Loop over number of columns of the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Exchange the row elements of the destination matrix */ - Xchg = *pOutT2; - *pOutT2++ = *pOutT1; - *pOutT1++ = Xchg; - - /* Decrement the loop counter */ - j--; - } - - /* Flag to indicate whether exchange is done or not */ - flag = 1u; - - /* Break after exchange is done */ - break; - } - - /* Update the destination pointer modifier */ - k++; - - /* Decrement the loop counter */ - i--; - } - } - - /* Update the status if the matrix is singular */ - if((flag != 1u) && (in == 0.0f)) - { - return ARM_MATH_SINGULAR; - } - - /* Points to the pivot row of input and destination matrices */ - pPivotRowIn = pIn + (l * numCols); - pPivotRowDst = pOut + (l * numCols); - - /* Temporary pointers to the pivot row pointers */ - pInT1 = pPivotRowIn; - pInT2 = pPivotRowDst; - - /* Pivot element of the row */ - in = *pPivotRowIn; - - /* Loop over number of columns - * to the right of the pilot element */ - j = (numCols - l); - - while(j > 0u) - { - /* Divide each element of the row of the input matrix - * by the pivot element */ - in1 = *pInT1; - *pInT1++ = in1 / in; - - /* Decrement the loop counter */ - j--; - } - - /* Loop over number of columns of the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Divide each element of the row of the destination matrix - * by the pivot element */ - in1 = *pInT2; - *pInT2++ = in1 / in; - - /* Decrement the loop counter */ - j--; - } - - /* Replace the rows with the sum of that row and a multiple of row i - * so that each new element in column i above row i is zero.*/ - - /* Temporary pointers for input and destination matrices */ - pInT1 = pIn; - pInT2 = pOut; - - /* index used to check for pivot element */ - i = 0u; - - /* Loop over number of rows */ - /* to be replaced by the sum of that row and a multiple of row i */ - k = numRows; - - while(k > 0u) - { - /* Check for the pivot element */ - if(i == l) - { - /* If the processing element is the pivot element, - only the columns to the right are to be processed */ - pInT1 += numCols - l; - - pInT2 += numCols; - } - else - { - /* Element of the reference row */ - in = *pInT1; - - /* Working pointers for input and destination pivot rows */ - pPRT_in = pPivotRowIn; - pPRT_pDst = pPivotRowDst; - - /* Loop over the number of columns to the right of the pivot element, - to replace the elements in the input matrix */ - j = (numCols - l); - - while(j > 0u) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - in1 = *pInT1; - *pInT1++ = in1 - (in * *pPRT_in++); - - /* Decrement the loop counter */ - j--; - } - - /* Loop over the number of columns to - replace the elements in the destination matrix */ - j = numCols; - - while(j > 0u) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - in1 = *pInT2; - *pInT2++ = in1 - (in * *pPRT_pDst++); - - /* Decrement the loop counter */ - j--; - } - - } - - /* Increment the temporary input pointer */ - pInT1 = pInT1 + l; - - /* Decrement the loop counter */ - k--; - - /* Increment the pivot index */ - i++; - } - - /* Increment the input pointer */ - pIn++; - - /* Decrement the loop counter */ - loopCnt--; - - /* Increment the index modifier */ - l++; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - float64_t Xchg, in = 0.0f; /* Temporary input values */ - uint32_t i, rowCnt, flag = 0u, j, loopCnt, k, l; /* loop counters */ - arm_status status; /* status of matrix inverse */ - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pSrc->numCols) || (pDst->numRows != pDst->numCols) - || (pSrc->numRows != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - { - - /*-------------------------------------------------------------------------------------------------------------- - * Matrix Inverse can be solved using elementary row operations. - * - * Gauss-Jordan Method: - * - * 1. First combine the identity matrix and the input matrix separated by a bar to form an - * augmented matrix as follows: - * _ _ _ _ _ _ _ _ - * | | a11 a12 | | | 1 0 | | | X11 X12 | - * | | | | | | | = | | - * |_ |_ a21 a22 _| | |_0 1 _| _| |_ X21 X21 _| - * - * 2. In our implementation, pDst Matrix is used as identity matrix. - * - * 3. Begin with the first row. Let i = 1. - * - * 4. Check to see if the pivot for row i is zero. - * The pivot is the element of the main diagonal that is on the current row. - * For instance, if working with row i, then the pivot element is aii. - * If the pivot is zero, exchange that row with a row below it that does not - * contain a zero in column i. If this is not possible, then an inverse - * to that matrix does not exist. - * - * 5. Divide every element of row i by the pivot. - * - * 6. For every row below and row i, replace that row with the sum of that row and - * a multiple of row i so that each new element in column i below row i is zero. - * - * 7. Move to the next row and column and repeat steps 2 through 5 until you have zeros - * for every element below and above the main diagonal. - * - * 8. Now an identical matrix is formed to the left of the bar(input matrix, src). - * Therefore, the matrix to the right of the bar is our solution(dst matrix, dst). - *----------------------------------------------------------------------------------------------------------------*/ - - /* Working pointer for destination matrix */ - pOutT1 = pOut; - - /* Loop over the number of rows */ - rowCnt = numRows; - - /* Making the destination matrix as identity matrix */ - while(rowCnt > 0u) - { - /* Writing all zeroes in lower triangle of the destination matrix */ - j = numRows - rowCnt; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Writing all ones in the diagonal of the destination matrix */ - *pOutT1++ = 1.0f; - - /* Writing all zeroes in upper triangle of the destination matrix */ - j = rowCnt - 1u; - while(j > 0u) - { - *pOutT1++ = 0.0f; - j--; - } - - /* Decrement the loop counter */ - rowCnt--; - } - - /* Loop over the number of columns of the input matrix. - All the elements in each column are processed by the row operations */ - loopCnt = numCols; - - /* Index modifier to navigate through the columns */ - l = 0u; - //for(loopCnt = 0u; loopCnt < numCols; loopCnt++) - while(loopCnt > 0u) - { - /* Check if the pivot element is zero.. - * If it is zero then interchange the row with non zero row below. - * If there is no non zero element to replace in the rows below, - * then the matrix is Singular. */ - - /* Working pointer for the input matrix that points - * to the pivot element of the particular row */ - pInT1 = pIn + (l * numCols); - - /* Working pointer for the destination matrix that points - * to the pivot element of the particular row */ - pOutT1 = pOut + (l * numCols); - - /* Temporary variable to hold the pivot value */ - in = *pInT1; - - /* Destination pointer modifier */ - k = 1u; - - /* Check if the pivot element is zero */ - if(*pInT1 == 0.0f) - { - /* Loop over the number rows present below */ - for (i = (l + 1u); i < numRows; i++) - { - /* Update the input and destination pointers */ - pInT2 = pInT1 + (numCols * l); - pOutT2 = pOutT1 + (numCols * k); - - /* Check if there is a non zero pivot element to - * replace in the rows below */ - if(*pInT2 != 0.0f) - { - /* Loop over number of columns - * to the right of the pilot element */ - for (j = 0u; j < (numCols - l); j++) - { - /* Exchange the row elements of the input matrix */ - Xchg = *pInT2; - *pInT2++ = *pInT1; - *pInT1++ = Xchg; - } - - for (j = 0u; j < numCols; j++) - { - Xchg = *pOutT2; - *pOutT2++ = *pOutT1; - *pOutT1++ = Xchg; - } - - /* Flag to indicate whether exchange is done or not */ - flag = 1u; - - /* Break after exchange is done */ - break; - } - - /* Update the destination pointer modifier */ - k++; - } - } - - /* Update the status if the matrix is singular */ - if((flag != 1u) && (in == 0.0f)) - { - return ARM_MATH_SINGULAR; - } - - /* Points to the pivot row of input and destination matrices */ - pPivotRowIn = pIn + (l * numCols); - pPivotRowDst = pOut + (l * numCols); - - /* Temporary pointers to the pivot row pointers */ - pInT1 = pPivotRowIn; - pOutT1 = pPivotRowDst; - - /* Pivot element of the row */ - in = *(pIn + (l * numCols)); - - /* Loop over number of columns - * to the right of the pilot element */ - for (j = 0u; j < (numCols - l); j++) - { - /* Divide each element of the row of the input matrix - * by the pivot element */ - *pInT1 = *pInT1 / in; - pInT1++; - } - for (j = 0u; j < numCols; j++) - { - /* Divide each element of the row of the destination matrix - * by the pivot element */ - *pOutT1 = *pOutT1 / in; - pOutT1++; - } - - /* Replace the rows with the sum of that row and a multiple of row i - * so that each new element in column i above row i is zero.*/ - - /* Temporary pointers for input and destination matrices */ - pInT1 = pIn; - pOutT1 = pOut; - - for (i = 0u; i < numRows; i++) - { - /* Check for the pivot element */ - if(i == l) - { - /* If the processing element is the pivot element, - only the columns to the right are to be processed */ - pInT1 += numCols - l; - pOutT1 += numCols; - } - else - { - /* Element of the reference row */ - in = *pInT1; - - /* Working pointers for input and destination pivot rows */ - pPRT_in = pPivotRowIn; - pPRT_pDst = pPivotRowDst; - - /* Loop over the number of columns to the right of the pivot element, - to replace the elements in the input matrix */ - for (j = 0u; j < (numCols - l); j++) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - *pInT1 = *pInT1 - (in * *pPRT_in++); - pInT1++; - } - /* Loop over the number of columns to - replace the elements in the destination matrix */ - for (j = 0u; j < numCols; j++) - { - /* Replace the element by the sum of that row - and a multiple of the reference row */ - *pOutT1 = *pOutT1 - (in * *pPRT_pDst++); - pOutT1++; - } - - } - /* Increment the temporary input pointer */ - pInT1 = pInT1 + l; - } - /* Increment the input pointer */ - pIn++; - - /* Decrement the loop counter */ - loopCnt--; - /* Increment the index modifier */ - l++; - } - - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - - if((flag != 1u) && (in == 0.0f)) - { - pIn = pSrc->pData; - for (i = 0; i < numRows * numCols; i++) - { - if (pIn[i] != 0.0f) - break; - } - - if (i == numRows * numCols) - status = ARM_MATH_SINGULAR; - } - } - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixInv group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c deleted file mode 100644 index 2a63d66..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c +++ /dev/null @@ -1,286 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_mult_f32.c -* -* Description: Floating-point matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixMult Matrix Multiplication - * - * Multiplies two matrices. - * - * \image html MatrixMultiplication.gif "Multiplication of two 3 x 3 matrices" - - * Matrix multiplication is only defined if the number of columns of the - * first matrix equals the number of rows of the second matrix. - * Multiplying an M x N matrix with an N x P matrix results - * in an M x P matrix. - * When matrix size checking is enabled, the functions check: (1) that the inner dimensions of - * pSrcA and pSrcB are equal; and (2) that the size of the output - * matrix equals the outer dimensions of pSrcA and pSrcB. - */ - - -/** - * @addtogroup MatrixMult - * @{ - */ - -/** - * @brief Floating-point matrix multiplication. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - float32_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - float32_t *px; /* Temporary output data matrix pointer */ - float32_t sum; /* Accumulator */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t in1, in2, in3, in4; - uint16_t col, i = 0u, j, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - j = 0u; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0.0f; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pIn1 = pInA; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - colCnt = numColsA >> 2u; - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - in3 = *pIn2; - pIn2 += numColsB; - in1 = pIn1[0]; - in2 = pIn1[1]; - sum += in1 * in3; - in4 = *pIn2; - pIn2 += numColsB; - sum += in2 * in4; - - in3 = *pIn2; - pIn2 += numColsB; - in1 = pIn1[2]; - in2 = pIn1[3]; - sum += in1 * in3; - in4 = *pIn2; - pIn2 += numColsB; - sum += in2 * in4; - pIn1 += 4u; - - /* Decrement the loop count */ - colCnt--; - } - - /* If the columns of pSrcA is not a multiple of 4, compute any remaining MACs here. - ** No loop unrolling is used. */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - sum += *pIn1++ * (*pIn2); - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Store the result in the destination buffer */ - *px++ = sum; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - j++; - pIn2 = pSrcB->pData + j; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t *pInB = pSrcB->pData; /* input data matrix pointer B */ - uint16_t col, i = 0u, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pInA with each column in pInB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0.0f; - - /* Initialize the pointer pIn1 to point to the starting address of the row being processed */ - pIn1 = pInA; - - /* Matrix A columns number of MAC operations are to be performed */ - colCnt = numColsA; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - sum += *pIn1++ * (*pIn2); - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Store the result in the destination buffer */ - *px++ = sum; - - /* Decrement the column loop counter */ - col--; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - pIn2 = pInB + (numColsB - col); - - } while(col > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Update the pointer pInA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c deleted file mode 100644 index b3c7aa0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c +++ /dev/null @@ -1,369 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_mult_fast_q15.c -* -* Description: Q15 matrix multiplication (fast variant) -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixMult - * @{ - */ - - -/** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The difference between the function arm_mat_mult_q15() and this fast variant is that - * the fast variant use a 32-bit rather than a 64-bit accumulator. - * The result of each 1.15 x 1.15 multiplication is truncated to - * 2.30 format. These intermediate results are accumulated in a 32-bit register in 2.30 - * format. Finally, the accumulator is saturated and converted to a 1.15 result. - * - * \par - * The fast version has the same overflow behavior as the standard version but provides - * less precision since it discards the low 16 bits of each multiplication result. - * In order to avoid overflows completely the input signals must be scaled down. - * Scale down one of the input matrices by log2(numColsA) bits to - * avoid overflows, as a total of numColsA additions are computed internally for each - * output element. - * - * \par - * See arm_mat_mult_q15() for a slower implementation of this function - * which uses 64-bit accumulation to provide higher precision. - */ - -arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState) -{ - q31_t sum; /* accumulator */ - q15_t *pSrcBT = pState; /* input data matrix pointer for transpose */ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A of Q15 type */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B of Q15 type */ - q15_t *px; /* Temporary output data matrix pointer */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - uint16_t numRowsB = pSrcB->numRows; /* number of rows of input matrix A */ - uint16_t col, i = 0u, row = numRowsB, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - q31_t in; /* Temporary variable to hold the input value */ - q31_t inA1, inA2, inB1, inB2; - -#else - - q15_t in; /* Temporary variable to hold the input value */ - q15_t inA1, inA2, inB1, inB2; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif - { - /* Matrix transpose */ - do - { - /* Apply loop unrolling and exchange the columns with row elements */ - col = numColsB >> 2; - - /* The pointer px is set to starting address of the column being processed */ - px = pSrcBT + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(col > 0u) - { -#ifndef UNALIGNED_SUPPORT_DISABLE - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) in; - -#else - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Unpack and store the second element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *px = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) in; - -#else - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Unpack and store the second element in the destination */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *px = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - -#else - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Decrement the column loop counter */ - col--; - } - - /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - col = numColsB % 0x4u; - - while(col > 0u) - { - /* Read and store the input element in the destination */ - *px = *pInB++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Decrement the column loop counter */ - col--; - } - - i++; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* Reset the variables for the usage in the following multiplication process */ - row = numRowsA; - i = 0u; - px = pDst->pData; - - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the transposed pSrcB data */ - pInB = pSrcBT; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Apply loop unrolling and compute 2 MACs simultaneously. */ - colCnt = numColsA >> 2; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pInA = pSrcA->pData + i; - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - inA1 = *__SIMD32(pInA)++; - inB1 = *__SIMD32(pInB)++; - inA2 = *__SIMD32(pInA)++; - inB2 = *__SIMD32(pInB)++; - - sum = __SMLAD(inA1, inB1, sum); - sum = __SMLAD(inA2, inB2, sum); - -#else - - inA1 = *pInA++; - inB1 = *pInB++; - inA2 = *pInA++; - sum += inA1 * inB1; - inB2 = *pInB++; - - inA1 = *pInA++; - inB1 = *pInB++; - sum += inA2 * inB2; - inA2 = *pInA++; - inB2 = *pInB++; - - sum += inA1 * inB1; - sum += inA2 * inB2; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - colCnt--; - } - - /* process odd column samples */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - sum += (q31_t) (*pInA++) * (*pInB++); - - colCnt--; - } - - /* Saturate and store the result in the destination buffer */ - *px = (q15_t) (sum >> 15); - px++; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - i = i + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c deleted file mode 100644 index c11958f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c +++ /dev/null @@ -1,226 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_mult_fast_q31.c -* -* Description: Q31 matrix multiplication (fast variant). -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixMult - * @{ - */ - -/** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The difference between the function arm_mat_mult_q31() and this fast variant is that - * the fast variant use a 32-bit rather than a 64-bit accumulator. - * The result of each 1.31 x 1.31 multiplication is truncated to - * 2.30 format. These intermediate results are accumulated in a 32-bit register in 2.30 - * format. Finally, the accumulator is saturated and converted to a 1.31 result. - * - * \par - * The fast version has the same overflow behavior as the standard version but provides - * less precision since it discards the low 32 bits of each multiplication result. - * In order to avoid overflows completely the input signals must be scaled down. - * Scale down one of the input matrices by log2(numColsA) bits to - * avoid overflows, as a total of numColsA additions are computed internally for each - * output element. - * - * \par - * See arm_mat_mult_q31() for a slower implementation of this function - * which uses 64-bit accumulation to provide higher precision. - */ - -arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pInA = pSrcA->pData; /* input data matrix pointer A */ -// q31_t *pSrcB = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t *px; /* Temporary output data matrix pointer */ - q31_t sum; /* Accumulator */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - uint16_t col, i = 0u, j, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - q31_t inA1, inA2, inA3, inA4, inB1, inB2, inB3, inB4; - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - j = 0u; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Initiate the pointer pIn1 to point to the starting address of pInA */ - pIn1 = pInA; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - colCnt = numColsA >> 2; - - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - inB1 = *pIn2; - pIn2 += numColsB; - - inA1 = pIn1[0]; - inA2 = pIn1[1]; - - inB2 = *pIn2; - pIn2 += numColsB; - - inB3 = *pIn2; - pIn2 += numColsB; - - sum = (q31_t) ((((q63_t) sum << 32) + ((q63_t) inA1 * inB1)) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + ((q63_t) inA2 * inB2)) >> 32); - - inA3 = pIn1[2]; - inA4 = pIn1[3]; - - inB4 = *pIn2; - pIn2 += numColsB; - - sum = (q31_t) ((((q63_t) sum << 32) + ((q63_t) inA3 * inB3)) >> 32); - sum = (q31_t) ((((q63_t) sum << 32) + ((q63_t) inA4 * inB4)) >> 32); - - pIn1 += 4u; - - /* Decrement the loop counter */ - colCnt--; - } - - /* If the columns of pSrcA is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - sum = (q31_t) ((((q63_t) sum << 32) + - ((q63_t) * pIn1++ * (*pIn2))) >> 32); - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Convert the result from 2.30 to 1.31 format and store in destination buffer */ - *px++ = sum << 1; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - j++; - pIn2 = pSrcB->pData + j; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - /* Update the pointer pInA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c deleted file mode 100644 index 702ee83..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c +++ /dev/null @@ -1,469 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_mult_q15.c -* -* Description: Q15 matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixMult - * @{ - */ - - -/** - * @brief Q15 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results (Unused) - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. The inputs to the - * multiplications are in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate - * results are accumulated in a 64-bit accumulator in 34.30 format. This approach - * provides 33 guard bits and there is no risk of overflow. The 34.30 result is then - * truncated to 34.15 format by discarding the low 15 bits and then saturated to - * 1.15 format. - * - * \par - * Refer to arm_mat_mult_fast_q15() for a faster but less precise version of this function for Cortex-M3 and Cortex-M4. - * - */ - -arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState CMSIS_UNUSED) -{ - q63_t sum; /* accumulator */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q15_t *pSrcBT = pState; /* input data matrix pointer for transpose */ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A of Q15 type */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B of Q15 type */ - q15_t *px; /* Temporary output data matrix pointer */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - uint16_t numRowsB = pSrcB->numRows; /* number of rows of input matrix A */ - uint16_t col, i = 0u, row = numRowsB, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifndef UNALIGNED_SUPPORT_DISABLE - - q31_t in; /* Temporary variable to hold the input value */ - q31_t pSourceA1, pSourceB1, pSourceA2, pSourceB2; - -#else - - q15_t in; /* Temporary variable to hold the input value */ - q15_t inA1, inB1, inA2, inB2; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - { - /* Matrix transpose */ - do - { - /* Apply loop unrolling and exchange the columns with row elements */ - col = numColsB >> 2; - - /* The pointer px is set to starting address of the column being processed */ - px = pSrcBT + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(col > 0u) - { -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) in; - -#else - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Unpack and store the second element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *px = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read two elements from the row */ - in = *__SIMD32(pInB)++; - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) in; - -#else - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Unpack and store the second element in the destination */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *px = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *px = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - -#else - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Read one element from the row */ - in = *pInB++; - - /* Store one element in the destination */ - *px = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the column loop counter */ - col--; - } - - /* If the columns of pSrcB is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - col = numColsB % 0x4u; - - while(col > 0u) - { - /* Read and store the input element in the destination */ - *px = *pInB++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += numRowsB; - - /* Decrement the column loop counter */ - col--; - } - - i++; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* Reset the variables for the usage in the following multiplication process */ - row = numRowsA; - i = 0u; - px = pDst->pData; - - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the transposed pSrcB data */ - pInB = pSrcBT; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Apply loop unrolling and compute 2 MACs simultaneously. */ - colCnt = numColsA >> 2; - - /* Initiate the pointer pIn1 to point to the starting address of the column being processed */ - pInA = pSrcA->pData + i; - - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* read real and imag values from pSrcA and pSrcB buffer */ - pSourceA1 = *__SIMD32(pInA)++; - pSourceB1 = *__SIMD32(pInB)++; - - pSourceA2 = *__SIMD32(pInA)++; - pSourceB2 = *__SIMD32(pInB)++; - - /* Multiply and Accumlates */ - sum = __SMLALD(pSourceA1, pSourceB1, sum); - sum = __SMLALD(pSourceA2, pSourceB2, sum); - -#else - /* read real and imag values from pSrcA and pSrcB buffer */ - inA1 = *pInA++; - inB1 = *pInB++; - inA2 = *pInA++; - /* Multiply and Accumlates */ - sum += inA1 * inB1; - inB2 = *pInB++; - - inA1 = *pInA++; - inB1 = *pInB++; - /* Multiply and Accumlates */ - sum += inA2 * inB2; - inA2 = *pInA++; - inB2 = *pInB++; - - /* Multiply and Accumlates */ - sum += inA1 * inB1; - sum += inA2 * inB2; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Decrement the loop counter */ - colCnt--; - } - - /* process remaining column samples */ - colCnt = numColsA & 3u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - sum += *pInA++ * *pInB++; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Saturate and store the result in the destination buffer */ - *px = (q15_t) (__SSAT((sum >> 15), 16)); - px++; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - - i = i + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q15_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A of Q15 type */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B of Q15 type */ - q15_t *pOut = pDst->pData; /* output data matrix pointer */ - q15_t *px; /* Temporary output data matrix pointer */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t col, i = 0u, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Initiate the pointer pIn1 to point to the starting address of pSrcA */ - pIn1 = pInA; - - /* Matrix A columns number of MAC operations are to be performed */ - colCnt = numColsA; - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - sum += (q31_t) * pIn1++ * *pIn2; - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Convert the result from 34.30 to 1.15 format and store the saturated value in destination buffer */ - /* Saturate and store the result in the destination buffer */ - *px++ = (q15_t) __SSAT((sum >> 15), 16); - - /* Decrement the column loop counter */ - col--; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - pIn2 = pInB + (numColsB - col); - - } while(col > 0u); - - /* Update the pointer pSrcA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c deleted file mode 100644 index 5d22522..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c +++ /dev/null @@ -1,294 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_mult_q31.c -* -* Description: Q31 matrix multiplication. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixMult - * @{ - */ - -/** - * @brief Q31 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate - * multiplication results but provides only a single guard bit. There is no saturation - * on intermediate additions. Thus, if the accumulator overflows it wraps around and - * distorts the result. The input signals should be scaled down to avoid intermediate - * overflows. The input is thus scaled down by log2(numColsA) bits - * to avoid overflows, as a total of numColsA additions are performed internally. - * The 2.62 accumulator is right shifted by 31 bits and saturated to 1.31 format to yield the final result. - * - * \par - * See arm_mat_mult_fast_q31() for a faster but less precise implementation of this function for Cortex-M3 and Cortex-M4. - * - */ - -arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t *px; /* Temporary output data matrix pointer */ - q63_t sum; /* Accumulator */ - uint16_t numRowsA = pSrcA->numRows; /* number of rows of input matrix A */ - uint16_t numColsB = pSrcB->numCols; /* number of columns of input matrix B */ - uint16_t numColsA = pSrcA->numCols; /* number of columns of input matrix A */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - uint16_t col, i = 0u, j, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - q31_t a0, a1, a2, a3, b0, b1, b2, b3; - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - j = 0u; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Initiate the pointer pIn1 to point to the starting address of pInA */ - pIn1 = pInA; - - /* Apply loop unrolling and compute 4 MACs simultaneously. */ - colCnt = numColsA >> 2; - - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - b0 = *pIn2; - pIn2 += numColsB; - - a0 = *pIn1++; - a1 = *pIn1++; - - b1 = *pIn2; - pIn2 += numColsB; - b2 = *pIn2; - pIn2 += numColsB; - - sum += (q63_t) a0 *b0; - sum += (q63_t) a1 *b1; - - a2 = *pIn1++; - a3 = *pIn1++; - - b3 = *pIn2; - pIn2 += numColsB; - - sum += (q63_t) a2 *b2; - sum += (q63_t) a3 *b3; - - /* Decrement the loop counter */ - colCnt--; - } - - /* If the columns of pSrcA is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - colCnt = numColsA % 0x4u; - - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - sum += (q63_t) * pIn1++ * *pIn2; - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Convert the result from 2.62 to 1.31 format and store in destination buffer */ - *px++ = (q31_t) (sum >> 31); - - /* Update the pointer pIn2 to point to the starting address of the next column */ - j++; - pIn2 = (pSrcB->pData) + j; - - /* Decrement the column loop counter */ - col--; - - } while(col > 0u); - -#else - - /* Run the below code for Cortex-M0 */ - - q31_t *pInB = pSrcB->pData; /* input data matrix pointer B */ - uint16_t col, i = 0u, row = numRowsA, colCnt; /* loop counters */ - arm_status status; /* status of matrix multiplication */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrcA->numCols != pSrcB->numRows) || - (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* The following loop performs the dot-product of each row in pSrcA with each column in pSrcB */ - /* row loop */ - do - { - /* Output pointer is set to starting address of the row being processed */ - px = pOut + i; - - /* For every row wise process, the column loop counter is to be initiated */ - col = numColsB; - - /* For every row wise process, the pIn2 pointer is set - ** to the starting address of the pSrcB data */ - pIn2 = pSrcB->pData; - - /* column loop */ - do - { - /* Set the variable sum, that acts as accumulator, to zero */ - sum = 0; - - /* Initiate the pointer pIn1 to point to the starting address of pInA */ - pIn1 = pInA; - - /* Matrix A columns number of MAC operations are to be performed */ - colCnt = numColsA; - - /* matrix multiplication */ - while(colCnt > 0u) - { - /* c(m,n) = a(1,1)*b(1,1) + a(1,2) * b(2,1) + .... + a(m,p)*b(p,n) */ - /* Perform the multiply-accumulates */ - sum += (q63_t) * pIn1++ * *pIn2; - pIn2 += numColsB; - - /* Decrement the loop counter */ - colCnt--; - } - - /* Convert the result from 2.62 to 1.31 format and store in destination buffer */ - *px++ = (q31_t) clip_q63_to_q31(sum >> 31); - - /* Decrement the column loop counter */ - col--; - - /* Update the pointer pIn2 to point to the starting address of the next column */ - pIn2 = pInB + (numColsB - col); - - } while(col > 0u); - -#endif - - /* Update the pointer pInA to point to the starting address of the next row */ - i = i + numColsB; - pInA = pInA + numColsA; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixMult group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c deleted file mode 100644 index 37defa3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c +++ /dev/null @@ -1,181 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_scale_f32.c -* -* Description: Multiplies a floating-point matrix by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixScale Matrix Scale - * - * Multiplies a matrix by a scalar. This is accomplished by multiplying each element in the - * matrix by the scalar. For example: - * \image html MatrixScale.gif "Matrix Scaling of a 3 x 3 matrix" - * - * The function checks to make sure that the input and output matrices are of the same size. - * - * In the fixed-point Q15 and Q31 functions, scale is represented by - * a fractional multiplication scaleFract and an arithmetic shift shift. - * The shift allows the gain of the scaling operation to exceed 1.0. - * The overall scale factor applied to the fixed-point data is - *
        
- *     scale = scaleFract * 2^shift.        
- * 
- */ - -/** - * @addtogroup MatrixScale - * @{ - */ - -/** - * @brief Floating-point matrix scaling. - * @param[in] *pSrc points to input matrix structure - * @param[in] scale scale factor to be applied - * @param[out] *pDst points to output matrix structure - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - * - */ - -arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn = pSrc->pData; /* input data matrix pointer */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix scaling */ - -#ifndef ARM_MATH_CM0_FAMILY - - float32_t in1, in2, in3, in4; /* temporary variables */ - float32_t out1, out2, out3, out4; /* temporary variables */ - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numRows) || (pSrc->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop Unrolling */ - blkCnt = numSamples >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * scale */ - /* Scaling and results are stored in the destination buffer. */ - in1 = pIn[0]; - in2 = pIn[1]; - in3 = pIn[2]; - in4 = pIn[3]; - - out1 = in1 * scale; - out2 = in2 * scale; - out3 = in3 * scale; - out4 = in4 * scale; - - - pOut[0] = out1; - pOut[1] = out2; - pOut[2] = out3; - pOut[3] = out4; - - /* update pointers to process next sampels */ - pIn += 4u; - pOut += 4u; - - /* Decrement the numSamples loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * scale */ - /* The results are stored in the destination buffer. */ - *pOut++ = (*pIn++) * scale; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixScale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c deleted file mode 100644 index 5b1af16..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c +++ /dev/null @@ -1,183 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_scale_q15.c -* -* Description: Multiplies a Q15 matrix by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixScale - * @{ - */ - -/** - * @brief Q15 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The input data *pSrc and scaleFract are in 1.15 format. - * These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to 1.15 format. - */ - -arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst) -{ - q15_t *pIn = pSrc->pData; /* input data matrix pointer */ - q15_t *pOut = pDst->pData; /* output data matrix pointer */ - uint32_t numSamples; /* total number of elements in the matrix */ - int32_t totShift = 15 - shift; /* total shift to apply after scaling */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix scaling */ - -#ifndef ARM_MATH_CM0_FAMILY - - q15_t in1, in2, in3, in4; - q31_t out1, out2, out3, out4; - q31_t inA1, inA2; - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch */ - if((pSrc->numRows != pDst->numRows) || (pSrc->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif // #ifdef ARM_MATH_MATRIX_CHECK - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - /* Loop Unrolling */ - blkCnt = numSamples >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * k */ - /* Scale, saturate and then store the results in the destination buffer. */ - /* Reading 2 inputs from memory */ - inA1 = _SIMD32_OFFSET(pIn); - inA2 = _SIMD32_OFFSET(pIn + 2); - - /* C = A * scale */ - /* Scale the inputs and then store the 2 results in the destination buffer - * in single cycle by packing the outputs */ - out1 = (q31_t) ((q15_t) (inA1 >> 16) * scaleFract); - out2 = (q31_t) ((q15_t) inA1 * scaleFract); - out3 = (q31_t) ((q15_t) (inA2 >> 16) * scaleFract); - out4 = (q31_t) ((q15_t) inA2 * scaleFract); - - out1 = out1 >> totShift; - inA1 = _SIMD32_OFFSET(pIn + 4); - out2 = out2 >> totShift; - inA2 = _SIMD32_OFFSET(pIn + 6); - out3 = out3 >> totShift; - out4 = out4 >> totShift; - - in1 = (q15_t) (__SSAT(out1, 16)); - in2 = (q15_t) (__SSAT(out2, 16)); - in3 = (q15_t) (__SSAT(out3, 16)); - in4 = (q15_t) (__SSAT(out4, 16)); - - _SIMD32_OFFSET(pOut) = __PKHBT(in2, in1, 16); - _SIMD32_OFFSET(pOut + 2) = __PKHBT(in4, in3, 16); - - /* update pointers to process next sampels */ - pIn += 4u; - pOut += 4u; - - - /* Decrement the numSamples loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * k */ - /* Scale, saturate and then store the results in the destination buffer. */ - *pOut++ = - (q15_t) (__SSAT(((q31_t) (*pIn++) * scaleFract) >> totShift, 16)); - - /* Decrement the numSamples loop counter */ - blkCnt--; - } - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixScale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c deleted file mode 100644 index 5c88e41..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c +++ /dev/null @@ -1,202 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_scale_q31.c -* -* Description: Multiplies a Q31 matrix by a scalar. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------ */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixScale - * @{ - */ - -/** - * @brief Q31 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The input data *pSrc and scaleFract are in 1.31 format. - * These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to 1.31 format. - */ - -arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn = pSrc->pData; /* input data matrix pointer */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - uint32_t numSamples; /* total number of elements in the matrix */ - int32_t totShift = shift + 1; /* shift to apply after scaling */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix scaling */ - q31_t in1, in2, out1; /* temporary variabels */ - -#ifndef ARM_MATH_CM0_FAMILY - - q31_t in3, in4, out2, out3, out4; /* temporary variables */ - -#endif // #ifndef ARM_MAT_CM0 - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch */ - if((pSrc->numRows != pDst->numRows) || (pSrc->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif // #ifdef ARM_MATH_MATRIX_CHECK - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrc->numRows * pSrc->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop Unrolling */ - blkCnt = numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * k */ - /* Read values from input */ - in1 = *pIn; - in2 = *(pIn + 1); - in3 = *(pIn + 2); - in4 = *(pIn + 3); - - /* multiply input with scaler value */ - in1 = ((q63_t) in1 * scaleFract) >> 32; - in2 = ((q63_t) in2 * scaleFract) >> 32; - in3 = ((q63_t) in3 * scaleFract) >> 32; - in4 = ((q63_t) in4 * scaleFract) >> 32; - - /* apply shifting */ - out1 = in1 << totShift; - out2 = in2 << totShift; - - /* saturate the results. */ - if(in1 != (out1 >> totShift)) - out1 = 0x7FFFFFFF ^ (in1 >> 31); - - if(in2 != (out2 >> totShift)) - out2 = 0x7FFFFFFF ^ (in2 >> 31); - - out3 = in3 << totShift; - out4 = in4 << totShift; - - *pOut = out1; - *(pOut + 1) = out2; - - if(in3 != (out3 >> totShift)) - out3 = 0x7FFFFFFF ^ (in3 >> 31); - - if(in4 != (out4 >> totShift)) - out4 = 0x7FFFFFFF ^ (in4 >> 31); - - - *(pOut + 2) = out3; - *(pOut + 3) = out4; - - /* update pointers to process next sampels */ - pIn += 4u; - pOut += 4u; - - - /* Decrement the numSamples loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) * k */ - /* Scale, saturate and then store the results in the destination buffer. */ - in1 = *pIn++; - - in2 = ((q63_t) in1 * scaleFract) >> 32; - - out1 = in2 << totShift; - - if(in2 != (out1 >> totShift)) - out1 = 0x7FFFFFFF ^ (in2 >> 31); - - *pOut++ = out1; - - /* Decrement the numSamples loop counter */ - blkCnt--; - } - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixScale group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c deleted file mode 100644 index f07bbe0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c +++ /dev/null @@ -1,209 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_sub_f32.c -* -* Description: Floating-point matrix subtraction. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @defgroup MatrixSub Matrix Subtraction - * - * Subtract two matrices. - * \image html MatrixSubtraction.gif "Subraction of two 3 x 3 matrices" - * - * The functions check to make sure that - * pSrcA, pSrcB, and pDst have the same - * number of rows and columns. - */ - -/** - * @addtogroup MatrixSub - * @{ - */ - -/** - * @brief Floating-point matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - float32_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - -#ifndef ARM_MATH_CM0_FAMILY - - float32_t inA1, inA2, inB1, inB2, out1, out2; /* temporary variables */ - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix subtraction */ - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop Unrolling */ - blkCnt = numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract and then store the results in the destination buffer. */ - /* Read values from source A */ - inA1 = pIn1[0]; - - /* Read values from source B */ - inB1 = pIn2[0]; - - /* Read values from source A */ - inA2 = pIn1[1]; - - /* out = sourceA - sourceB */ - out1 = inA1 - inB1; - - /* Read values from source B */ - inB2 = pIn2[1]; - - /* Read values from source A */ - inA1 = pIn1[2]; - - /* out = sourceA - sourceB */ - out2 = inA2 - inB2; - - /* Read values from source B */ - inB1 = pIn2[2]; - - /* Store result in destination */ - pOut[0] = out1; - pOut[1] = out2; - - /* Read values from source A */ - inA2 = pIn1[3]; - - /* Read values from source B */ - inB2 = pIn2[3]; - - /* out = sourceA - sourceB */ - out1 = inA1 - inB1; - - - /* out = sourceA - sourceB */ - out2 = inA2 - inB2; - - /* Store result in destination */ - pOut[2] = out1; - - /* Store result in destination */ - pOut[3] = out2; - - - /* update pointers to process next sampels */ - pIn1 += 4u; - pIn2 += 4u; - pOut += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract and then store the results in the destination buffer. */ - *pOut++ = (*pIn1++) - (*pIn2++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c deleted file mode 100644 index fd7b29c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c +++ /dev/null @@ -1,160 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_sub_q15.c -* -* Description: Q15 Matrix subtraction -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixSub - * @{ - */ - -/** - * @brief Q15 matrix subtraction. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst) -{ - q15_t *pInA = pSrcA->pData; /* input data matrix pointer A */ - q15_t *pInB = pSrcB->pData; /* input data matrix pointer B */ - q15_t *pOut = pDst->pData; /* output data matrix pointer */ - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix subtraction */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Apply loop unrolling */ - blkCnt = numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract, Saturate and then store the results in the destination buffer. */ - *__SIMD32(pOut)++ = __QSUB16(*__SIMD32(pInA)++, *__SIMD32(pInB)++); - *__SIMD32(pOut)++ = __QSUB16(*__SIMD32(pInA)++, *__SIMD32(pInB)++); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract and then store the results in the destination buffer. */ - *pOut++ = (q15_t) __QSUB16(*pInA++, *pInB++); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract and then store the results in the destination buffer. */ - *pOut++ = (q15_t) __SSAT(((q31_t) * pInA++ - *pInB++), 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c deleted file mode 100644 index d2f2f98..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c +++ /dev/null @@ -1,208 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_sub_q31.c -* -* Description: Q31 matrix subtraction -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixSub - * @{ - */ - -/** - * @brief Q31 matrix subtraction. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] will be saturated. - */ - - -arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn1 = pSrcA->pData; /* input data matrix pointer A */ - q31_t *pIn2 = pSrcB->pData; /* input data matrix pointer B */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t inA1, inB1; /* temporary variables */ - -#ifndef ARM_MATH_CM0_FAMILY - - q31_t inA2, inB2; /* temporary variables */ - q31_t out1, out2; /* temporary variables */ - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - uint32_t numSamples; /* total number of elements in the matrix */ - uint32_t blkCnt; /* loop counters */ - arm_status status; /* status of matrix subtraction */ - - -#ifdef ARM_MATH_MATRIX_CHECK - /* Check for matrix mismatch condition */ - if((pSrcA->numRows != pSrcB->numRows) || - (pSrcA->numCols != pSrcB->numCols) || - (pSrcA->numRows != pDst->numRows) || (pSrcA->numCols != pDst->numCols)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif - { - /* Total number of samples in the input matrix */ - numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Loop Unrolling */ - blkCnt = numSamples >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract, saturate and then store the results in the destination buffer. */ - /* Read values from source A */ - inA1 = pIn1[0]; - - /* Read values from source B */ - inB1 = pIn2[0]; - - /* Read values from source A */ - inA2 = pIn1[1]; - - /* Subtract and saturate */ - out1 = __QSUB(inA1, inB1); - - /* Read values from source B */ - inB2 = pIn2[1]; - - /* Read values from source A */ - inA1 = pIn1[2]; - - /* Subtract and saturate */ - out2 = __QSUB(inA2, inB2); - - /* Read values from source B */ - inB1 = pIn2[2]; - - /* Store result in destination */ - pOut[0] = out1; - pOut[1] = out2; - - /* Read values from source A */ - inA2 = pIn1[3]; - - /* Read values from source B */ - inB2 = pIn2[3]; - - /* Subtract and saturate */ - out1 = __QSUB(inA1, inB1); - - /* Subtract and saturate */ - out2 = __QSUB(inA2, inB2); - - /* Store result in destination */ - pOut[2] = out1; - pOut[3] = out2; - - /* update pointers to process next samples */ - pIn1 += 4u; - pIn2 += 4u; - pOut += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the numSamples is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = numSamples % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = numSamples; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C(m,n) = A(m,n) - B(m,n) */ - /* Subtract, saturate and then store the results in the destination buffer. */ - inA1 = *pIn1++; - inB1 = *pIn2++; - - inA1 = __QSUB(inA1, inB1); - - *pOut++ = inA1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixSub group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c deleted file mode 100644 index 84c08ec..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c +++ /dev/null @@ -1,218 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_trans_f32.c -* -* Description: Floating-point matrix transpose. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -/** - * @defgroup MatrixTrans Matrix Transpose - * - * Tranposes a matrix. - * Transposing an M x N matrix flips it around the center diagonal and results in an N x M matrix. - * \image html MatrixTranspose.gif "Transpose of a 3 x 3 matrix" - */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixTrans - * @{ - */ - -/** - * @brief Floating-point matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - -arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst) -{ - float32_t *pIn = pSrc->pData; /* input data matrix pointer */ - float32_t *pOut = pDst->pData; /* output data matrix pointer */ - float32_t *px; /* Temporary output data matrix pointer */ - uint16_t nRows = pSrc->numRows; /* number of rows */ - uint16_t nColumns = pSrc->numCols; /* number of columns */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - uint16_t blkCnt, i = 0u, row = nRows; /* loop counters */ - arm_status status; /* status of matrix transpose */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - /* Loop Unrolling */ - blkCnt = nColumns >> 2; - - /* The pointer px is set to starting address of the column being processed */ - px = pOut + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) /* column loop */ - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - blkCnt--; - } - - /* Perform matrix transpose for last 3 samples here. */ - blkCnt = nColumns % 0x4u; - - while(blkCnt > 0u) - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - uint16_t col, i = 0u, row = nRows; /* loop counters */ - arm_status status; /* status of matrix transpose */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - /* The pointer px is set to starting address of the column being processed */ - px = pOut + i; - - /* Initialize column loop counter */ - col = nColumns; - - while(col > 0u) - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - col--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - i++; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); /* row loop end */ - - /* Set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixTrans group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c deleted file mode 100644 index 4e0fb82..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c +++ /dev/null @@ -1,284 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_trans_q15.c -* -* Description: Q15 matrix transpose. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixTrans - * @{ - */ - -/* - * @brief Q15 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst) -{ - q15_t *pSrcA = pSrc->pData; /* input data matrix pointer */ - q15_t *pOut = pDst->pData; /* output data matrix pointer */ - uint16_t nRows = pSrc->numRows; /* number of nRows */ - uint16_t nColumns = pSrc->numCols; /* number of nColumns */ - uint16_t col, row = nRows, i = 0u; /* row and column loop counters */ - arm_status status; /* status of matrix transpose */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ -#ifndef UNALIGNED_SUPPORT_DISABLE - - q31_t in; /* variable to hold temporary output */ - -#else - - q15_t in; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - - /* Apply loop unrolling and exchange the columns with row elements */ - col = nColumns >> 2u; - - /* The pointer pOut is set to starting address of the column being processed */ - pOut = pDst->pData + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(col > 0u) - { -#ifndef UNALIGNED_SUPPORT_DISABLE - - /* Read two elements from the row */ - in = *__SIMD32(pSrcA)++; - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *pOut = (q15_t) in; - -#else - - *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer pOut to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Unpack and store the second element in the destination */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *pOut = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer pOut to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Read two elements from the row */ -#ifndef ARM_MATH_BIG_ENDIAN - - in = *__SIMD32(pSrcA)++; - -#else - - in = *__SIMD32(pSrcA)++; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Unpack and store one element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *pOut = (q15_t) in; - -#else - - *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Update the pointer pOut to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Unpack and store the second element in the destination */ -#ifndef ARM_MATH_BIG_ENDIAN - - *pOut = (q15_t) ((in & (q31_t) 0xffff0000) >> 16); - -#else - - *pOut = (q15_t) in; - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - -#else - /* Read one element from the row */ - in = *pSrcA++; - - /* Store one element in the destination */ - *pOut = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Read one element from the row */ - in = *pSrcA++; - - /* Store one element in the destination */ - *pOut = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Read one element from the row */ - in = *pSrcA++; - - /* Store one element in the destination */ - *pOut = in; - - /* Update the pointer px to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Read one element from the row */ - in = *pSrcA++; - - /* Store one element in the destination */ - *pOut = in; - -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /* Update the pointer pOut to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Decrement the column loop counter */ - col--; - } - - /* Perform matrix transpose for last 3 samples here. */ - col = nColumns % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - /* The pointer pOut is set to starting address of the column being processed */ - pOut = pDst->pData + i; - - /* Initialize column loop counter */ - col = nColumns; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(col > 0u) - { - /* Read and store the input element in the destination */ - *pOut = *pSrcA++; - - /* Update the pointer pOut to point to the next row of the transposed matrix */ - pOut += nRows; - - /* Decrement the column loop counter */ - col--; - } - - i++; - - /* Decrement the row loop counter */ - row--; - - } while(row > 0u); - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixTrans group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c deleted file mode 100644 index ec92582..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c +++ /dev/null @@ -1,210 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mat_trans_q31.c -* -* Description: Q31 matrix transpose. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupMatrix - */ - -/** - * @addtogroup MatrixTrans - * @{ - */ - -/* - * @brief Q31 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - -arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst) -{ - q31_t *pIn = pSrc->pData; /* input data matrix pointer */ - q31_t *pOut = pDst->pData; /* output data matrix pointer */ - q31_t *px; /* Temporary output data matrix pointer */ - uint16_t nRows = pSrc->numRows; /* number of nRows */ - uint16_t nColumns = pSrc->numCols; /* number of nColumns */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - uint16_t blkCnt, i = 0u, row = nRows; /* loop counters */ - arm_status status; /* status of matrix transpose */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - /* Apply loop unrolling and exchange the columns with row elements */ - blkCnt = nColumns >> 2u; - - /* The pointer px is set to starting address of the column being processed */ - px = pOut + i; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - blkCnt--; - } - - /* Perform matrix transpose for last 3 samples here. */ - blkCnt = nColumns % 0x4u; - - while(blkCnt > 0u) - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - uint16_t col, i = 0u, row = nRows; /* loop counters */ - arm_status status; /* status of matrix transpose */ - - -#ifdef ARM_MATH_MATRIX_CHECK - - /* Check for matrix mismatch condition */ - if((pSrc->numRows != pDst->numCols) || (pSrc->numCols != pDst->numRows)) - { - /* Set status as ARM_MATH_SIZE_MISMATCH */ - status = ARM_MATH_SIZE_MISMATCH; - } - else -#endif /* #ifdef ARM_MATH_MATRIX_CHECK */ - - { - /* Matrix transpose by exchanging the rows with columns */ - /* row loop */ - do - { - /* The pointer px is set to starting address of the column being processed */ - px = pOut + i; - - /* Initialize column loop counter */ - col = nColumns; - - while(col > 0u) - { - /* Read and store the input element in the destination */ - *px = *pIn++; - - /* Update the pointer px to point to the next row of the transposed matrix */ - px += nRows; - - /* Decrement the column loop counter */ - col--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - i++; - - /* Decrement the row loop counter */ - row--; - - } - while(row > 0u); /* row loop end */ - - /* set status as ARM_MATH_SUCCESS */ - status = ARM_MATH_SUCCESS; - } - - /* Return to application */ - return (status); -} - -/** - * @} end of MatrixTrans group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c deleted file mode 100644 index 2326646..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c +++ /dev/null @@ -1,186 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_max_f32.c -* -* Description: Maximum value of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup Max Maximum - * - * Computes the maximum value of an array of data. - * The function returns both the maximum value and its position within the array. - * There are separate functions for floating-point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup Max - * @{ - */ - - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - -void arm_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 1u; - } - - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 2u; - } - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 3u; - } - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 4u; - } - - count += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* if (blockSize - 1u) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - float32_t maxVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - blkCnt = (blockSize - 1u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and it's index */ - out = maxVal1; - outIndex = blockSize - blkCnt; - } - - - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Store the maximum value and it's index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Max group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c deleted file mode 100644 index 20375c2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c +++ /dev/null @@ -1,176 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_max_q15.c -* -* Description: Maximum value of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup Max - * @{ - */ - - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - -void arm_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q15_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 1u; - } - - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 2u; - } - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 3u; - } - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 4u; - } - - count += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* if (blockSize - 1u) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - q15_t maxVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - blkCnt = (blockSize - 1u); - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and it's index */ - out = maxVal1; - outIndex = blockSize - blkCnt; - } - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Store the maximum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Max group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c deleted file mode 100644 index c687e79..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_max_q31.c -* -* Description: Maximum value of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup Max - * @{ - */ - - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - -void arm_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 1u; - } - - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 2u; - } - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 3u; - } - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 4u; - } - - count += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* if (blockSize - 1u) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - q31_t maxVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - blkCnt = (blockSize - 1u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and it's index */ - out = maxVal1; - outIndex = blockSize - blkCnt; - } - - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Store the maximum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Max group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c deleted file mode 100644 index 0e0cc2d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_max_q7.c -* -* Description: Maximum value of a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup Max - * @{ - */ - - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - -void arm_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 1u; - } - - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 2u; - } - - maxVal2 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and its index */ - out = maxVal1; - outIndex = count + 3u; - } - - /* compare for the maximum value */ - if(out < maxVal2) - { - /* Update the maximum value and its index */ - out = maxVal2; - outIndex = count + 4u; - } - - count += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* if (blockSize - 1u) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - q7_t maxVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - blkCnt = (blockSize - 1u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* Initialize maxVal to the next consecutive values one by one */ - maxVal1 = *pSrc++; - - /* compare for the maximum value */ - if(out < maxVal1) - { - /* Update the maximum value and it's index */ - out = maxVal1; - outIndex = blockSize - blkCnt; - } - /* Decrement the loop counter */ - blkCnt--; - - } - - /* Store the maximum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; - -} - -/** - * @} end of Max group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c deleted file mode 100644 index bc054b2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c +++ /dev/null @@ -1,139 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mean_f32.c -* -* Description: Mean value of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup mean Mean - * - * Calculates the mean of the input vector. Mean is defined as the average of the elements in the vector. - * The underlying algorithm is used: - * - *
    
- * 	Result = (pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]) / blockSize;    
- * 
- * - * There are separate functions for floating-point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup mean - * @{ - */ - - -/** - * @brief Mean value of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult mean value returned here - * @return none. - */ - - -void arm_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult) -{ - float32_t sum = 0.0f; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - sum += in1; - sum += in2; - sum += in3; - sum += in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - sum += *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ - /* Store the result to the destination */ - *pResult = sum / (float32_t) blockSize; -} - -/** - * @} end of mean group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c deleted file mode 100644 index ff5d64b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c +++ /dev/null @@ -1,133 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mean_q15.c -* -* Description: Mean value of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup mean - * @{ - */ - -/** - * @brief Mean value of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult mean value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 32-bit internal accumulator. - * The input is represented in 1.15 format and is accumulated in a 32-bit - * accumulator in 17.15 format. - * There is no risk of internal overflow with this approach, and the - * full precision of intermediate result is preserved. - * Finally, the accumulator is saturated and truncated to yield a result of 1.15 format. - * - */ - - -void arm_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult) -{ - q31_t sum = 0; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - sum += *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ - /* Store the result to the destination */ - *pResult = (q15_t) (sum / (q31_t)blockSize); -} - -/** - * @} end of mean group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c deleted file mode 100644 index afd62b3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mean_q31.c -* -* Description: Mean value of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup mean - * @{ - */ - -/** - * @brief Mean value of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult mean value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - *\par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.31 format and is accumulated in a 64-bit - * accumulator in 33.31 format. - * There is no risk of internal overflow with this approach, and the - * full precision of intermediate result is preserved. - * Finally, the accumulator is truncated to yield a result of 1.31 format. - * - */ - - -void arm_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult) -{ - q63_t sum = 0; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - sum += in1; - sum += in2; - sum += in3; - sum += in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - sum += *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ - /* Store the result to the destination */ - *pResult = (q31_t) (sum / (int32_t) blockSize); -} - -/** - * @} end of mean group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c deleted file mode 100644 index 522e3d4..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c +++ /dev/null @@ -1,133 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_mean_q7.c -* -* Description: Mean value of a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup mean - * @{ - */ - -/** - * @brief Mean value of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult mean value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 32-bit internal accumulator. - * The input is represented in 1.7 format and is accumulated in a 32-bit - * accumulator in 25.7 format. - * There is no risk of internal overflow with this approach, and the - * full precision of intermediate result is preserved. - * Finally, the accumulator is truncated to yield a result of 1.7 format. - * - */ - - -void arm_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult) -{ - q31_t sum = 0; /* Temporary result storage */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - in = *__SIMD32(pSrc)++; - - sum += ((in << 24) >> 24); - sum += ((in << 16) >> 24); - sum += ((in << 8) >> 24); - sum += (in >> 24); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - sum += *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) / blockSize */ - /* Store the result to the destination */ - *pResult = (q7_t) (sum / (int32_t) blockSize); -} - -/** - * @} end of mean group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c deleted file mode 100644 index 22f057a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c +++ /dev/null @@ -1,183 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_min_f32.c -* -* Description: Minimum value of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup Min Minimum - * - * Computes the minimum value of an array of data. - * The function returns both the minimum value and its position within the array. - * There are separate functions for floating-point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup Min - * @{ - */ - - -/** - * @brief Minimum value of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult minimum value returned here - * @param[out] *pIndex index of minimum value returned here - * @return none. - * - */ - -void arm_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t minVal1, minVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 1u; - } - - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 2u; - } - - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 3u; - } - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 4u; - } - - count += 4u; - - blkCnt--; - } - - /* if (blockSize - 1u ) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - float32_t minVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - blkCnt = (blockSize - 1u); - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and it's index */ - out = minVal1; - outIndex = blockSize - blkCnt; - } - - blkCnt--; - - } - - /* Store the minimum value and it's index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Min group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c deleted file mode 100644 index 05c13dd..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_min_q15.c -* -* Description: Minimum value of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - - -/** - * @addtogroup Min - * @{ - */ - - -/** - * @brief Minimum value of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult minimum value returned here - * @param[out] *pIndex index of minimum value returned here - * @return none. - * - */ - -void arm_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q15_t minVal1, minVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 1u; - } - - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 2u; - } - - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 3u; - } - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 4u; - } - - count += 4u; - - blkCnt--; - } - - /* if (blockSize - 1u ) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - q15_t minVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - blkCnt = (blockSize - 1u); - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and it's index */ - out = minVal1; - outIndex = blockSize - blkCnt; - } - - blkCnt--; - - } - - - - /* Store the minimum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Min group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c deleted file mode 100644 index 97431db..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c +++ /dev/null @@ -1,176 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_min_q31.c -* -* Description: Minimum value of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - - -/** - * @addtogroup Min - * @{ - */ - - -/** - * @brief Minimum value of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult minimum value returned here - * @param[out] *pIndex index of minimum value returned here - * @return none. - * - */ - -void arm_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t minVal1, minVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 1u; - } - - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 2u; - } - - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 3u; - } - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 4u; - } - - count += 4u; - - blkCnt--; - } - - /* if (blockSize - 1u ) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - q31_t minVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - blkCnt = (blockSize - 1u); - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and it's index */ - out = minVal1; - outIndex = blockSize - blkCnt; - } - - blkCnt--; - - } - - /* Store the minimum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; -} - -/** - * @} end of Min group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c deleted file mode 100644 index b6d0950..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c +++ /dev/null @@ -1,178 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_min_q7.c -* -* Description: Minimum value of a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup Min - * @{ - */ - - -/** - * @brief Minimum value of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult minimum value returned here - * @param[out] *pIndex index of minimum value returned here - * @return none. - * - */ - -void arm_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex) -{ -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q7_t minVal1, minVal2, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex, count; /* loop counter */ - - /* Initialise the count value. */ - count = 0u; - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - /* Loop unrolling */ - blkCnt = (blockSize - 1u) >> 2u; - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 1u; - } - - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 2u; - } - - minVal2 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and its index */ - out = minVal1; - outIndex = count + 3u; - } - - /* compare for the minimum value */ - if(out > minVal2) - { - /* Update the minimum value and its index */ - out = minVal2; - outIndex = count + 4u; - } - - count += 4u; - - blkCnt--; - } - - /* if (blockSize - 1u ) is not multiple of 4 */ - blkCnt = (blockSize - 1u) % 4u; - -#else - - /* Run the below code for Cortex-M0 */ - - q7_t minVal1, out; /* Temporary variables to store the output value. */ - uint32_t blkCnt, outIndex; /* loop counter */ - - /* Initialise the index value to zero. */ - outIndex = 0u; - /* Load first input value that act as reference value for comparision */ - out = *pSrc++; - - blkCnt = (blockSize - 1u); - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - while(blkCnt > 0) - { - /* Initialize minVal to the next consecutive values one by one */ - minVal1 = *pSrc++; - - /* compare for the minimum value */ - if(out > minVal1) - { - /* Update the minimum value and it's index */ - out = minVal1; - outIndex = blockSize - blkCnt; - } - - blkCnt--; - - } - - /* Store the minimum value and its index into destination pointers */ - *pResult = out; - *pIndex = outIndex; - - -} - -/** - * @} end of Min group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c deleted file mode 100644 index 831c5b0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_power_f32.c -* -* Description: Sum of the squares of the elements of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup power Power - * - * Calculates the sum of the squares of the elements in the input vector. - * The underlying algorithm is used: - * - *
    
- * 	Result = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + pSrc[2] * pSrc[2] + ... + pSrc[blockSize-1] * pSrc[blockSize-1];    
- * 
- * - * There are separate functions for floating point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup power - * @{ - */ - - -/** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult sum of the squares value returned here - * @return none. - * - */ - - -void arm_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult) -{ - float32_t sum = 0.0f; /* accumulator */ - float32_t in; /* Temporary variable to store input value */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* compute power and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Store the result to the destination */ - *pResult = sum; -} - -/** - * @} end of power group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c deleted file mode 100644 index 6e7034a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c +++ /dev/null @@ -1,152 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_power_q15.c -* -* Description: Sum of the squares of the elements of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup power - * @{ - */ - -/** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult sum of the squares value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.15 format. - * Intermediate multiplication yields a 2.30 format, and this - * result is added without saturation to a 64-bit accumulator in 34.30 format. - * With 33 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the return result is in 34.30 format. - * - */ - -void arm_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult) -{ - q63_t sum = 0; /* Temporary result storage */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in32; /* Temporary variable to store input value */ - q15_t in16; /* Temporary variable to store input value */ - uint32_t blkCnt; /* loop counter */ - - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in32 = *__SIMD32(pSrc)++; - sum = __SMLALD(in32, in32, sum); - in32 = *__SIMD32(pSrc)++; - sum = __SMLALD(in32, in32, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in16 = *pSrc++; - sum = __SMLALD(in16, in16, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t in; /* Temporary variable to store input value */ - uint32_t blkCnt; /* loop counter */ - - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += ((q31_t) in * in); - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Store the results in 34.30 format */ - *pResult = sum; -} - -/** - * @} end of power group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c deleted file mode 100644 index 2f7976a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_power_q31.c -* -* Description: Sum of the squares of the elements of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup power - * @{ - */ - -/** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult sum of the squares value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.31 format. - * Intermediate multiplication yields a 2.62 format, and this - * result is truncated to 2.48 format by discarding the lower 14 bits. - * The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format. - * With 15 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the return result is in 16.48 format. - * - */ - -void arm_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult) -{ - q63_t sum = 0; /* Temporary result storage */ - q31_t in; - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power then shift intermediate results by 14 bits to maintain 16.48 format and then store the result in a temporary variable sum, providing 15 guard bits. */ - in = *pSrc++; - sum += ((q63_t) in * in) >> 14u; - - in = *pSrc++; - sum += ((q63_t) in * in) >> 14u; - - in = *pSrc++; - sum += ((q63_t) in * in) >> 14u; - - in = *pSrc++; - sum += ((q63_t) in * in) >> 14u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += ((q63_t) in * in) >> 14u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Store the results in 16.48 format */ - *pResult = sum; -} - -/** - * @} end of power group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c deleted file mode 100644 index 3e97f91..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c +++ /dev/null @@ -1,141 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_power_q7.c -* -* Description: Sum of the squares of the elements of a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup power - * @{ - */ - -/** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult sum of the squares value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 32-bit internal accumulator. - * The input is represented in 1.7 format. - * Intermediate multiplication yields a 2.14 format, and this - * result is added without saturation to an accumulator in 18.14 format. - * With 17 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the return result is in 18.14 format. - * - */ - -void arm_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult) -{ - q31_t sum = 0; /* Temporary result storage */ - q7_t in; /* Temporary variable to store input */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t input1; /* Temporary variable to store packed input */ - q31_t in1, in2; /* Temporary variables to store input */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* Reading two inputs of pSrc vector and packing */ - input1 = *__SIMD32(pSrc)++; - - in1 = __SXTB16(__ROR(input1, 8)); - in2 = __SXTB16(input1); - - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* calculate power and accumulate to accumulator */ - sum = __SMLAD(in1, in1, sum); - sum = __SMLAD(in2, in2, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute Power and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += ((q15_t) in * in); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Store the result in 18.14 format */ - *pResult = sum; -} - -/** - * @} end of power group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c deleted file mode 100644 index 466d17b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c +++ /dev/null @@ -1,141 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rms_f32.c -* -* Description: Root mean square value of an array of F32 type -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup RMS Root mean square (RMS) - * - * - * Calculates the Root Mean Sqaure of the elements in the input vector. - * The underlying algorithm is used: - * - *
    
- * 	Result = sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize));    
- * 
- * - * There are separate functions for floating point, Q31, and Q15 data types. - */ - -/** - * @addtogroup RMS - * @{ - */ - - -/** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult rms value returned here - * @return none. - * - */ - -void arm_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult) -{ - float32_t sum = 0.0f; /* Accumulator */ - float32_t in; /* Tempoprary variable to store input value */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute sum of the squares and then store the result in a temporary variable, sum */ - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - in = *pSrc++; - sum += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute sum of the squares and then store the results in a temporary variable, sum */ - in = *pSrc++; - sum += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Rms and store the result in the destination */ - arm_sqrt_f32(sum / (float32_t) blockSize, pResult); -} - -/** - * @} end of RMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c deleted file mode 100644 index 74372be..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c +++ /dev/null @@ -1,153 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rms_q15.c -* -* Description: Root Mean Square of the elements of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @addtogroup RMS - * @{ - */ - -/** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult rms value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.15 format. - * Intermediate multiplication yields a 2.30 format, and this - * result is added without saturation to a 64-bit accumulator in 34.30 format. - * With 33 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the 34.30 result is truncated to 34.15 format by discarding the lower - * 15 bits, and then saturated to yield a result in 1.15 format. - * - */ - -void arm_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult) -{ - q63_t sum = 0; /* accumulator */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in; /* temporary variable to store the input value */ - q15_t in1; /* temporary variable to store the input value */ - uint32_t blkCnt; /* loop counter */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute sum of the squares and then store the results in a temporary variable, sum */ - in = *__SIMD32(pSrc)++; - sum = __SMLALD(in, in, sum); - in = *__SIMD32(pSrc)++; - sum = __SMLALD(in, in, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute sum of the squares and then store the results in a temporary variable, sum */ - in1 = *pSrc++; - sum = __SMLALD(in1, in1, sum); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Truncating and saturating the accumulator to 1.15 format */ - /* Store the result in the destination */ - arm_sqrt_q15(__SSAT((sum / (q63_t)blockSize) >> 15, 16), pResult); - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t in; /* temporary variable to store the input value */ - uint32_t blkCnt; /* loop counter */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute sum of the squares and then store the results in a temporary variable, sum */ - in = *pSrc++; - sum += ((q31_t) in * in); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Truncating and saturating the accumulator to 1.15 format */ - /* Store the result in the destination */ - arm_sqrt_q15(__SSAT((sum / (q63_t)blockSize) >> 15, 16), pResult); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of RMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c deleted file mode 100644 index 7072e19..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c +++ /dev/null @@ -1,150 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rms_q31.c -* -* Description: Root Mean Square of the elements of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @addtogroup RMS - * @{ - */ - - -/** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult rms value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - *\par - * The function is implemented using an internal 64-bit accumulator. - * The input is represented in 1.31 format, and intermediate multiplication - * yields a 2.62 format. - * The accumulator maintains full precision of the intermediate multiplication results, - * but provides only a single guard bit. - * There is no saturation on intermediate additions. - * If the accumulator overflows, it wraps around and distorts the result. - * In order to avoid overflows completely, the input signal must be scaled down by - * log2(blockSize) bits, as a total of blockSize additions are performed internally. - * Finally, the 2.62 accumulator is right shifted by 31 bits to yield a 1.31 format value. - * - */ - -void arm_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult) -{ - q63_t sum = 0; /* accumulator */ - q31_t in; /* Temporary variable to store the input */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in1, in2, in3, in4; /* Temporary input variables */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 8 outputs at a time. - ** a second loop below computes the remaining 1 to 7 samples. */ - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute sum of the squares and then store the result in a temporary variable, sum */ - /* read two samples from source buffer */ - in1 = pSrc[0]; - in2 = pSrc[1]; - - /* calculate power and accumulate to accumulator */ - sum += (q63_t) in1 *in1; - sum += (q63_t) in2 *in2; - - /* read two samples from source buffer */ - in3 = pSrc[2]; - in4 = pSrc[3]; - - /* calculate power and accumulate to accumulator */ - sum += (q63_t) in3 *in3; - sum += (q63_t) in4 *in4; - - - /* update source buffer to process next samples */ - pSrc += 4u; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 8, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A[0] * A[0] + A[1] * A[1] + A[2] * A[2] + ... + A[blockSize-1] * A[blockSize-1] */ - /* Compute sum of the squares and then store the results in a temporary variable, sum */ - in = *pSrc++; - sum += (q63_t) in *in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Convert data in 2.62 to 1.31 by 31 right shifts and saturate */ - /* Compute Rms and store the result in the destination vector */ - arm_sqrt_q31(clip_q63_to_q31((sum / (q63_t) blockSize) >> 31), pResult); -} - -/** - * @} end of RMS group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c deleted file mode 100644 index 2483ada..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c +++ /dev/null @@ -1,208 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_std_f32.c -* -* Description: Standard deviation of the elements of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup STD Standard deviation - * - * Calculates the standard deviation of the elements in the input vector. - * The underlying algorithm is used: - * - *
    
- * 	Result = sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1))   
- *   
- *	   where, sumOfSquares = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]   
- *   
- *	                   sum = pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]   
- * 
- * - * There are separate functions for floating point, Q31, and Q15 data types. - */ - -/** - * @addtogroup STD - * @{ - */ - - -/** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult standard deviation value returned here - * @return none. - * - */ - - -void arm_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult) -{ - float32_t sum = 0.0f; /* Temporary result storage */ - float32_t sumOfSquares = 0.0f; /* Sum of squares */ - float32_t in; /* input value */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t meanOfSquares, mean, squareOfMean; - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / ((float32_t) blockSize - 1.0f); - - /* Compute mean of all input values */ - mean = sum / (float32_t) blockSize; - - /* Compute square of mean */ - squareOfMean = (mean * mean) * (((float32_t) blockSize) / - ((float32_t) blockSize - 1.0f)); - - /* Compute standard deviation and then store the result to the destination */ - arm_sqrt_f32((meanOfSquares - squareOfMean), pResult); - -#else - - /* Run the below code for Cortex-M0 */ - - float32_t squareOfSum; /* Square of Sum */ - float32_t var; /* Temporary varaince storage */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++; - sumOfSquares += in * in; - - /* C = (A[0] + A[1] + ... + A[blockSize-1]) */ - /* Compute Sum of the input samples - * and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute the square of sum */ - squareOfSum = ((sum * sum) / (float32_t) blockSize); - - /* Compute the variance */ - var = ((sumOfSquares - squareOfSum) / (float32_t) (blockSize - 1.0f)); - - /* Compute standard deviation and then store the result to the destination */ - arm_sqrt_f32(var, pResult); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of STD group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c deleted file mode 100644 index f113099..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c +++ /dev/null @@ -1,195 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_std_q15.c -* -* Description: Standard deviation of an array of Q15 type. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup STD - * @{ - */ - -/** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult standard deviation value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.15 format. - * Intermediate multiplication yields a 2.30 format, and this - * result is added without saturation to a 64-bit accumulator in 34.30 format. - * With 33 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the 34.30 result is truncated to 34.15 format by discarding the lower - * 15 bits, and then saturated to yield a result in 1.15 format. - */ - -void arm_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult) -{ - q31_t sum = 0; /* Accumulator */ - q31_t meanOfSquares, squareOfMean; /* square of mean and mean of square */ - uint32_t blkCnt; /* loop counter */ - q63_t sumOfSquares = 0; /* Accumulator */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in; /* input value */ - q15_t in1; /* input value */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - sumOfSquares = __SMLALD(in, in, sumOfSquares); - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - sumOfSquares = __SMLALD(in, in, sumOfSquares); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in1 = *pSrc++; - sumOfSquares = __SMLALD(in1, in1, sumOfSquares); - sum += in1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = (q31_t)(sumOfSquares / (q63_t)(blockSize - 1)); - - /* Compute square of mean */ - squareOfMean = (q31_t) ((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1))); - - /* mean of the squares minus the square of the mean. */ - /* Compute standard deviation and store the result to the destination */ - arm_sqrt_q15(__SSAT((meanOfSquares - squareOfMean) >> 15, 16u), pResult); - -#else - - /* Run the below code for Cortex-M0 */ - q15_t in; /* input value */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++; - sumOfSquares += (in * in); - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - /* Compute sum of all input values and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = (q31_t)(sumOfSquares / (q63_t)(blockSize - 1)); - - /* Compute square of mean */ - squareOfMean = (q31_t) ((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1))); - - /* mean of the squares minus the square of the mean. */ - /* Compute standard deviation and store the result to the destination */ - arm_sqrt_q15(__SSAT((meanOfSquares - squareOfMean) >> 15, 16u), pResult); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - -} - -/** - * @} end of STD group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c deleted file mode 100644 index f2518c5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c +++ /dev/null @@ -1,186 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_std_q31.c -* -* Description: Standard deviation of an array of Q31 type. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup STD - * @{ - */ - - -/** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult standard deviation value returned here - * @return none. - * @details - * Scaling and Overflow Behavior: - * - *\par - * The function is implemented using an internal 64-bit accumulator. - * The input is represented in 1.31 format, which is then downshifted by 8 bits - * which yields 1.23, and intermediate multiplication yields a 2.46 format. - * The accumulator maintains full precision of the intermediate multiplication results, - * but provides only a 16 guard bits. - * There is no saturation on intermediate additions. - * If the accumulator overflows it wraps around and distorts the result. - * In order to avoid overflows completely the input signal must be scaled down by - * log2(blockSize)-8 bits, as a total of blockSize additions are performed internally. - * After division, internal variables should be Q18.46 - * Finally, the 18.46 accumulator is right shifted by 15 bits to yield a 1.31 format value. - * - */ - - -void arm_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult) -{ - q63_t sum = 0; /* Accumulator */ - q63_t meanOfSquares, squareOfMean; /* square of mean and mean of square */ - q31_t in; /* input value */ - uint32_t blkCnt; /* loop counter */ - q63_t sumOfSquares = 0; /* Accumulator */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / (q63_t)(blockSize - 1); - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++ >> 8; - sumOfSquares += ((q63_t) (in) * (in)); - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - /* Compute sum of all input values and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / (q63_t)(blockSize - 1); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Compute square of mean */ - squareOfMean = sum * sum / (q63_t)(blockSize * (blockSize - 1u)); - - /* Compute standard deviation and then store the result to the destination */ - arm_sqrt_q31((meanOfSquares - squareOfMean) >> 15, pResult); - -} - -/** - * @} end of STD group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c deleted file mode 100644 index aff478d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c +++ /dev/null @@ -1,204 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_var_f32.c -* -* Description: Variance of the elements of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @defgroup variance Variance - * - * Calculates the variance of the elements in the input vector. - * The underlying algorithm is used: - * - *
    
- * 	Result = (sumOfSquares - sum2 / blockSize) / (blockSize - 1)   
- *   
- *	   where, sumOfSquares = pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] * pSrc[blockSize-1]   
- *   
- *	                   sum = pSrc[0] + pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]   
- * 
- * - * There are separate functions for floating point, Q31, and Q15 data types. - */ - -/** - * @addtogroup variance - * @{ - */ - - -/** - * @brief Variance of the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult variance value returned here - * @return none. - * - */ - - -void arm_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult) -{ - - float32_t sum = 0.0f; /* Temporary result storage */ - float32_t sumOfSquares = 0.0f; /* Sum of squares */ - float32_t in; /* input value */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t meanOfSquares, mean, squareOfMean; /* Temporary variables */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++; - sum += in; - sumOfSquares += in * in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / ((float32_t) blockSize - 1.0f); - - /* Compute mean of all input values */ - mean = sum / (float32_t) blockSize; - - /* Compute square of mean */ - squareOfMean = (mean * mean) * (((float32_t) blockSize) / - ((float32_t) blockSize - 1.0f)); - - /* Compute variance and then store the result to the destination */ - *pResult = meanOfSquares - squareOfMean; - -#else - - /* Run the below code for Cortex-M0 */ - float32_t squareOfSum; /* Square of Sum */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++; - sumOfSquares += in * in; - - /* C = (A[0] + A[1] + ... + A[blockSize-1]) */ - /* Compute Sum of the input samples - * and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute the square of sum */ - squareOfSum = ((sum * sum) / (float32_t) blockSize); - - /* Compute the variance */ - *pResult = ((sumOfSquares - squareOfSum) / (float32_t) (blockSize - 1.0f)); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of variance group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c deleted file mode 100644 index d304cfb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c +++ /dev/null @@ -1,195 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_var_q15.c -* -* Description: Variance of an array of Q15 type. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup variance - * @{ - */ - -/** - * @brief Variance of the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult variance value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - * \par - * The function is implemented using a 64-bit internal accumulator. - * The input is represented in 1.15 format. - * Intermediate multiplication yields a 2.30 format, and this - * result is added without saturation to a 64-bit accumulator in 34.30 format. - * With 33 guard bits in the accumulator, there is no risk of overflow, and the - * full precision of the intermediate multiplication is preserved. - * Finally, the 34.30 result is truncated to 34.15 format by discarding the lower - * 15 bits, and then saturated to yield a result in 1.15 format. - * - */ - - -void arm_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult) -{ - - q31_t sum = 0; /* Accumulator */ - q31_t meanOfSquares, squareOfMean; /* square of mean and mean of square */ - uint32_t blkCnt; /* loop counter */ - q63_t sumOfSquares = 0; /* Accumulator */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t in; /* input value */ - q15_t in1; /* input value */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - sumOfSquares = __SMLALD(in, in, sumOfSquares); - in = *__SIMD32(pSrc)++; - sum += ((in << 16) >> 16); - sum += (in >> 16); - sumOfSquares = __SMLALD(in, in, sumOfSquares); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in1 = *pSrc++; - sumOfSquares = __SMLALD(in1, in1, sumOfSquares); - sum += in1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = (q31_t) (sumOfSquares / (q63_t)(blockSize - 1)); - - /* Compute square of mean */ - squareOfMean = (q31_t)((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1))); - - /* mean of the squares minus the square of the mean. */ - *pResult = (meanOfSquares - squareOfMean) >> 15; - -#else - - /* Run the below code for Cortex-M0 */ - q15_t in; /* input value */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++; - sumOfSquares += (in * in); - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - /* Compute sum of all input values and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = (q31_t) (sumOfSquares / (q63_t)(blockSize - 1)); - - /* Compute square of mean */ - squareOfMean = (q31_t)((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1))); - - /* mean of the squares minus the square of the mean. */ - *pResult = (meanOfSquares - squareOfMean) >> 15; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of variance group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c deleted file mode 100644 index 6bd0de8..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c +++ /dev/null @@ -1,187 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_var_q31.c -* -* Description: Variance of an array of Q31 type. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupStats - */ - -/** - * @addtogroup variance - * @{ - */ - -/** - * @brief Variance of the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] blockSize length of the input vector - * @param[out] *pResult variance value returned here - * @return none. - * - * @details - * Scaling and Overflow Behavior: - * - *\par - * The function is implemented using an internal 64-bit accumulator. - * The input is represented in 1.31 format, which is then downshifted by 8 bits - * which yields 1.23, and intermediate multiplication yields a 2.46 format. - * The accumulator maintains full precision of the intermediate multiplication results, - * but provides only a 16 guard bits. - * There is no saturation on intermediate additions. - * If the accumulator overflows it wraps around and distorts the result. - * In order to avoid overflows completely the input signal must be scaled down by - * log2(blockSize)-8 bits, as a total of blockSize additions are performed internally. - * After division, internal variables should be Q18.46 - * Finally, the 18.46 accumulator is right shifted by 15 bits to yield a 1.31 format value. - * - */ - - -void arm_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult) -{ - q63_t sum = 0; /* Accumulator */ - q63_t meanOfSquares, squareOfMean; /* square of mean and mean of square */ - q31_t in; /* input value */ - uint32_t blkCnt; /* loop counter */ - q63_t sumOfSquares = 0; /* Accumulator */ - - if(blockSize == 1) - { - *pResult = 0; - return; - } - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sum. */ - in = *pSrc++ >> 8; - sum += in; - sumOfSquares += ((q63_t) (in) * (in)); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / (q63_t)(blockSize - 1); - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - /* C = (A[0] * A[0] + A[1] * A[1] + ... + A[blockSize-1] * A[blockSize-1]) */ - /* Compute Sum of squares of the input samples - * and then store the result in a temporary variable, sumOfSquares. */ - in = *pSrc++ >> 8; - sumOfSquares += ((q63_t) (in) * (in)); - - /* C = (A[0] + A[1] + A[2] + ... + A[blockSize-1]) */ - /* Compute sum of all input values and then store the result in a temporary variable, sum. */ - sum += in; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* Compute Mean of squares of the input samples - * and then store the result in a temporary variable, meanOfSquares. */ - meanOfSquares = sumOfSquares / (q63_t)(blockSize - 1); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - /* Compute square of mean */ - squareOfMean = sum * sum / (q63_t)(blockSize * (blockSize - 1u)); - - - /* Compute standard deviation and then store the result to the destination */ - *pResult = (meanOfSquares - squareOfMean) >> 15; - -} - -/** - * @} end of variance group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c deleted file mode 100644 index bdbdff5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c +++ /dev/null @@ -1,135 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_copy_f32.c -* -* Description: Copies the elements of a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup copy Vector Copy - * - * Copies sample by sample from source vector to destination vector. - * - *
    
- * 	pDst[n] = pSrc[n];   0 <= n < blockSize.    
- * 
- * - * There are separate functions for floating point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup copy - * @{ - */ - -/** - * @brief Copies the elements of a floating-point vector. - * @param[in] *pSrc points to input vector - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the input vector - * @return none. - * - */ - - -void arm_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the results in the destination buffer */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - *pDst++ = in1; - *pDst++ = in2; - *pDst++ = in3; - *pDst++ = in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the results in the destination buffer */ - *pDst++ = *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicCopy group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c deleted file mode 100644 index 2d152c0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c +++ /dev/null @@ -1,114 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_copy_q15.c -* -* Description: Copies the elements of a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup copy - * @{ - */ -/** - * @brief Copies the elements of a Q15 vector. - * @param[in] *pSrc points to input vector - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the input vector - * @return none. - * - */ - -void arm_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A */ - /* Read two inputs */ - *__SIMD32(pDst)++ = *__SIMD32(pSrc)++; - *__SIMD32(pDst)++ = *__SIMD32(pSrc)++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the value in the destination buffer */ - *pDst++ = *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicCopy group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c deleted file mode 100644 index 7dec928..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c +++ /dev/null @@ -1,123 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_copy_q31.c -* -* Description: Copies the elements of a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup copy - * @{ - */ - -/** - * @brief Copies the elements of a Q31 vector. - * @param[in] *pSrc points to input vector - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the input vector - * @return none. - * - */ - -void arm_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the values in the destination buffer */ - in1 = *pSrc++; - in2 = *pSrc++; - in3 = *pSrc++; - in4 = *pSrc++; - - *pDst++ = in1; - *pDst++ = in2; - *pDst++ = in3; - *pDst++ = in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the value in the destination buffer */ - *pDst++ = *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicCopy group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c deleted file mode 100644 index 69c42cb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_copy_q7.c -* -* Description: Copies the elements of a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup copy - * @{ - */ - -/** - * @brief Copies the elements of a Q7 vector. - * @param[in] *pSrc points to input vector - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the input vector - * @return none. - * - */ - -void arm_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the results in the destination buffer */ - /* 4 samples are copied and stored at a time using SIMD */ - *__SIMD32(pDst)++ = *__SIMD32(pSrc)++; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = A */ - /* Copy and then store the results in the destination buffer */ - *pDst++ = *pSrc++; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of BasicCopy group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c deleted file mode 100644 index a284f88..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fill_f32.c -* -* Description: Fills a constant value into a floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup Fill Vector Fill - * - * Fills the destination vector with a constant value. - * - *
    
- * 	pDst[n] = value;   0 <= n < blockSize.    
- * 
- * - * There are separate functions for floating point, Q31, Q15, and Q7 data types. - */ - -/** - * @addtogroup Fill - * @{ - */ - -/** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the output vector - * @return none. - * - */ - - -void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - float32_t in1 = value; - float32_t in2 = value; - float32_t in3 = value; - float32_t in4 = value; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = in1; - *pDst++ = in2; - *pDst++ = in3; - *pDst++ = in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = value; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of Fill group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c deleted file mode 100644 index 817b127..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c +++ /dev/null @@ -1,120 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fill_q15.c -* -* Description: Fills a constant value into a Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup Fill - * @{ - */ - -/** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the output vector - * @return none. - * - */ - -void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t packedValue; /* value packed to 32 bits */ - - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Packing two 16 bit values to 32 bit value in order to use SIMD */ - packedValue = __PKHBT(value, value, 16u); - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *__SIMD32(pDst)++ = packedValue; - *__SIMD32(pDst)++ = packedValue; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = value; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of Fill group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c deleted file mode 100644 index 0b773c9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fill_q31.c -* -* Description: Fills a constant value into a Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup Fill - * @{ - */ - -/** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the output vector - * @return none. - * - */ - -void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1 = value; - q31_t in2 = value; - q31_t in3 = value; - q31_t in4 = value; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = in1; - *pDst++ = in2; - *pDst++ = in3; - *pDst++ = in4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = value; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of Fill group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c deleted file mode 100644 index 0dde606..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c +++ /dev/null @@ -1,118 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_fill_q7.c -* -* Description: Fills a constant value into a Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup Fill - * @{ - */ - -/** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] *pDst points to output vector - * @param[in] blockSize length of the output vector - * @return none. - * - */ - -void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t packedValue; /* value packed to 32 bits */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* Packing four 8 bit values to 32 bit value in order to use SIMD */ - packedValue = __PACKq7(value, value, value, value); - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *__SIMD32(pDst)++ = packedValue; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = value */ - /* Fill the value in the destination buffer */ - *pDst++ = value; - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of Fill group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c deleted file mode 100644 index cdc53a5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c +++ /dev/null @@ -1,204 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_float_to_q15.c -* -* Description: Converts the elements of the floating-point vector to Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup float_to_x - * @{ - */ - -/** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * \par - * The equation used for the conversion process is: - *
    
- * 	pDst[n] = (q15_t)(pSrc[n] * 32768);   0 <= n < blockSize.    
- * 
- * \par Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - * \note - * In order to apply rounding, the library should be rebuilt with the ROUNDING macro - * defined in the preprocessor section of project options. - * - */ - - -void arm_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - float32_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifdef ARM_MATH_ROUNDING - - float32_t in; - -#endif /* #ifdef ARM_MATH_ROUNDING */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 32768.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - - in = *pIn++; - in = (in * 32768.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - - in = *pIn++; - in = (in * 32768.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - - in = *pIn++; - in = (in * 32768.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - -#else - - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 32768.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - -#else - - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 32768.0f); - in += in > 0 ? 0.5f : -0.5f; - *pDst++ = (q15_t) (__SSAT((q31_t) (in), 16)); - -#else - - /* C = A * 32768 */ - /* convert from float to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) __SSAT((q31_t) (*pIn++ * 32768.0f), 16); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of float_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c deleted file mode 100644 index a2bf3f5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c +++ /dev/null @@ -1,211 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_float_to_q31.c -* -* Description: Converts the elements of the floating-point vector to Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup float_to_x Convert 32-bit floating point value - */ - -/** - * @addtogroup float_to_x - * @{ - */ - -/** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - *\par Description: - * \par - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q31_t)(pSrc[n] * 2147483648);   0 <= n < blockSize.    
- * 
- * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] will be saturated. - * - * \note In order to apply rounding, the library should be rebuilt with the ROUNDING macro - * defined in the preprocessor section of project options. - */ - - -void arm_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - float32_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifdef ARM_MATH_ROUNDING - - float32_t in; - -#endif /* #ifdef ARM_MATH_ROUNDING */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - - /* C = A * 32768 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - -#else - - /* C = A * 2147483648 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - - /* C = A * 2147483648 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - -#else - - /* C = A * 2147483648 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - - /* C = A * 2147483648 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 2147483648.0f); - in += in > 0 ? 0.5f : -0.5f; - *pDst++ = clip_q63_to_q31((q63_t) (in)); - -#else - - /* C = A * 2147483648 */ - /* convert from float to Q31 and then store the results in the destination buffer */ - *pDst++ = clip_q63_to_q31((q63_t) (*pIn++ * 2147483648.0f)); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of float_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c deleted file mode 100644 index 0497e2b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c +++ /dev/null @@ -1,203 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_float_to_q7.c -* -* Description: Converts the elements of the floating-point vector to Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup float_to_x - * @{ - */ - -/** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - *\par Description: - * \par - * The equation used for the conversion process is: - *
    
- * 	pDst[n] = (q7_t)(pSrc[n] * 128);   0 <= n < blockSize.    
- * 
- * \par Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. - * \note - * In order to apply rounding, the library should be rebuilt with the ROUNDING macro - * defined in the preprocessor section of project options. - */ - - -void arm_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - float32_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifdef ARM_MATH_ROUNDING - - float32_t in; - -#endif /* #ifdef ARM_MATH_ROUNDING */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 128); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); - - in = *pIn++; - in = (in * 128); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); - - in = *pIn++; - in = (in * 128); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); - - in = *pIn++; - in = (in * 128); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); - -#else - - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); - *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); - *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); - *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - - while(blkCnt > 0u) - { - -#ifdef ARM_MATH_ROUNDING - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 128); - in += in > 0.0f ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q15_t) (in), 8)); - -#else - - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - *pDst++ = __SSAT((q31_t) (*pIn++ * 128.0f), 8); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - - -#else - - /* Run the below code for Cortex-M0 */ - - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - - while(blkCnt > 0u) - { -#ifdef ARM_MATH_ROUNDING - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - in = *pIn++; - in = (in * 128.0f); - in += in > 0 ? 0.5f : -0.5f; - *pDst++ = (q7_t) (__SSAT((q31_t) (in), 8)); - -#else - - /* C = A * 128 */ - /* convert from float to q7 and then store the results in the destination buffer */ - *pDst++ = (q7_t) __SSAT((q31_t) (*pIn++ * 128.0f), 8); - -#endif /* #ifdef ARM_MATH_ROUNDING */ - - /* Decrement the loop counter */ - blkCnt--; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of float_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c deleted file mode 100644 index 2e9624a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c +++ /dev/null @@ -1,134 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q15_to_float.c -* -* Description: Converts the elements of the Q15 vector to floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup q15_to_x Convert 16-bit Integer value - */ - -/** - * @addtogroup q15_to_x - * @{ - */ - - - - -/** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] *pSrc points to the Q15 input vector - * @param[out] *pDst points to the floating-point output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (float32_t) pSrc[n] / 32768;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - q15_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (float32_t) A / 32768 */ - /* convert from q15 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 32768.0f); - *pDst++ = ((float32_t) * pIn++ / 32768.0f); - *pDst++ = ((float32_t) * pIn++ / 32768.0f); - *pDst++ = ((float32_t) * pIn++ / 32768.0f); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (float32_t) A / 32768 */ - /* convert from q15 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 32768.0f); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of q15_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c deleted file mode 100644 index 5a34279..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c +++ /dev/null @@ -1,156 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q15_to_q31.c -* -* Description: Converts the elements of the Q15 vector to Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q15_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] *pSrc points to the Q15 input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q31_t) pSrc[n] << 16;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q15_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2; - q31_t out1, out2, out3, out4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q31_t)A << 16 */ - /* convert from q15 to q31 and then store the results in the destination buffer */ - in1 = *__SIMD32(pIn)++; - in2 = *__SIMD32(pIn)++; - -#ifndef ARM_MATH_BIG_ENDIAN - - /* extract lower 16 bits to 32 bit result */ - out1 = in1 << 16u; - /* extract upper 16 bits to 32 bit result */ - out2 = in1 & 0xFFFF0000; - /* extract lower 16 bits to 32 bit result */ - out3 = in2 << 16u; - /* extract upper 16 bits to 32 bit result */ - out4 = in2 & 0xFFFF0000; - -#else - - /* extract upper 16 bits to 32 bit result */ - out1 = in1 & 0xFFFF0000; - /* extract lower 16 bits to 32 bit result */ - out2 = in1 << 16u; - /* extract upper 16 bits to 32 bit result */ - out3 = in2 & 0xFFFF0000; - /* extract lower 16 bits to 32 bit result */ - out4 = in2 << 16u; - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - *pDst++ = out1; - *pDst++ = out2; - *pDst++ = out3; - *pDst++ = out4; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q31_t)A << 16 */ - /* convert from q15 to q31 and then store the results in the destination buffer */ - *pDst++ = (q31_t) * pIn++ << 16; - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q15_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c deleted file mode 100644 index 9b029a0..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q15_to_q7.c -* -* Description: Converts the elements of the Q15 vector to Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q15_to_x - * @{ - */ - - -/** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] *pSrc points to the Q15 input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q7_t) pSrc[n] >> 8;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - q15_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2; - q31_t out1, out2; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q7_t) A >> 8 */ - /* convert from q15 to q7 and then store the results in the destination buffer */ - in1 = *__SIMD32(pIn)++; - in2 = *__SIMD32(pIn)++; - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __PKHTB(in2, in1, 16); - out2 = __PKHBT(in2, in1, 16); - -#else - - out1 = __PKHTB(in1, in2, 16); - out2 = __PKHBT(in1, in2, 16); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - /* rotate packed value by 24 */ - out2 = ((uint32_t) out2 << 8) | ((uint32_t) out2 >> 24); - - /* anding with 0xff00ff00 to get two 8 bit values */ - out1 = out1 & 0xFF00FF00; - /* anding with 0x00ff00ff to get two 8 bit values */ - out2 = out2 & 0x00FF00FF; - - /* oring two values(contains two 8 bit values) to get four packed 8 bit values */ - out1 = out1 | out2; - - /* store 4 samples at a time to destiantion buffer */ - *__SIMD32(pDst)++ = out1; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q7_t) A >> 8 */ - /* convert from q15 to q7 and then store the results in the destination buffer */ - *pDst++ = (q7_t) (*pIn++ >> 8); - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q15_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c deleted file mode 100644 index 4ea5c26..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q31_to_float.c -* -* Description: Converts the elements of the Q31 vector to floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup q31_to_x Convert 32-bit Integer value - */ - -/** - * @addtogroup q31_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] *pSrc points to the Q31 input vector - * @param[out] *pDst points to the floating-point output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (float32_t) pSrc[n] / 2147483648;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - q31_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (float32_t) A / 2147483648 */ - /* convert from q31 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); - *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); - *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); - *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (float32_t) A / 2147483648 */ - /* convert from q31 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 2147483648.0f); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of q31_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c deleted file mode 100644 index 053c6ba..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c +++ /dev/null @@ -1,145 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q31_to_q15.c -* -* Description: Converts the elements of the Q31 vector to Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q31_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] *pSrc points to the Q31 input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q15_t) pSrc[n] >> 16;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q31_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - q31_t out1, out2; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q15_t) A >> 16 */ - /* convert from q31 to q15 and then store the results in the destination buffer */ - in1 = *pIn++; - in2 = *pIn++; - in3 = *pIn++; - in4 = *pIn++; - - /* pack two higher 16-bit values from two 32-bit values */ -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __PKHTB(in2, in1, 16); - out2 = __PKHTB(in4, in3, 16); - -#else - - out1 = __PKHTB(in1, in2, 16); - out2 = __PKHTB(in3, in4, 16); - -#endif // #ifdef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = out1; - *__SIMD32(pDst)++ = out2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q15_t) A >> 16 */ - /* convert from q31 to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) (*pIn++ >> 16); - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q31_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c deleted file mode 100644 index 26bfd32..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q31_to_q7.c -* -* Description: Converts the elements of the Q31 vector to Q7 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q31_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] *pSrc points to the Q31 input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q7_t) pSrc[n] >> 24;   0 <= n < blockSize.     
- * 
- * - */ - - -void arm_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize) -{ - q31_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t in1, in2, in3, in4; - q7_t out1, out2, out3, out4; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q7_t) A >> 24 */ - /* convert from q31 to q7 and then store the results in the destination buffer */ - in1 = *pIn++; - in2 = *pIn++; - in3 = *pIn++; - in4 = *pIn++; - - out1 = (q7_t) (in1 >> 24); - out2 = (q7_t) (in2 >> 24); - out3 = (q7_t) (in3 >> 24); - out4 = (q7_t) (in4 >> 24); - - *__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q7_t) A >> 24 */ - /* convert from q31 to q7 and then store the results in the destination buffer */ - *pDst++ = (q7_t) (*pIn++ >> 24); - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q31_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c deleted file mode 100644 index c9dff9c..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q7_to_float.c -* -* Description: Converts the elements of the Q7 vector to floating-point vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @defgroup q7_to_x Convert 8-bit Integer value - */ - -/** - * @addtogroup q7_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] *pSrc points to the Q7 input vector - * @param[out] *pDst points to the floating-point output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (float32_t) pSrc[n] / 128;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize) -{ - q7_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (float32_t) A / 128 */ - /* convert from q7 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 128.0f); - *pDst++ = ((float32_t) * pIn++ / 128.0f); - *pDst++ = ((float32_t) * pIn++ / 128.0f); - *pDst++ = ((float32_t) * pIn++ / 128.0f); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (float32_t) A / 128 */ - /* convert from q7 to float and then store the results in the destination buffer */ - *pDst++ = ((float32_t) * pIn++ / 128.0f); - - /* Decrement the loop counter */ - blkCnt--; - } -} - -/** - * @} end of q7_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c deleted file mode 100644 index 5b93546..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c +++ /dev/null @@ -1,157 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q7_to_q15.c -* -* Description: Converts the elements of the Q7 vector to Q15 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q7_to_x - * @{ - */ - - - - -/** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] *pSrc points to the Q7 input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q15_t) pSrc[n] << 8;   0 <= n < blockSize.    
- * 
- * - */ - - -void arm_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize) -{ - q7_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - q31_t in; - q31_t in1, in2; - q31_t out1, out2; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q15_t) A << 8 */ - /* convert from q7 to q15 and then store the results in the destination buffer */ - in = *__SIMD32(pIn)++; - - /* rotatate in by 8 and extend two q7_t values to q15_t values */ - in1 = __SXTB16(__ROR(in, 8)); - - /* extend remainig two q7_t values to q15_t values */ - in2 = __SXTB16(in); - - in1 = in1 << 8u; - in2 = in2 << 8u; - - in1 = in1 & 0xFF00FF00; - in2 = in2 & 0xFF00FF00; - -#ifndef ARM_MATH_BIG_ENDIAN - - out2 = __PKHTB(in1, in2, 16); - out1 = __PKHBT(in2, in1, 16); - -#else - - out1 = __PKHTB(in1, in2, 16); - out2 = __PKHBT(in2, in1, 16); - -#endif - - *__SIMD32(pDst)++ = out1; - *__SIMD32(pDst)++ = out2; - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q15_t) A << 8 */ - /* convert from q7 to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) * pIn++ << 8; - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q7_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c deleted file mode 100644 index 84e47a3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c +++ /dev/null @@ -1,142 +0,0 @@ -/* ---------------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_q7_to_q31.c -* -* Description: Converts the elements of the Q7 vector to Q31 vector. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* ---------------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup q7_to_x - * @{ - */ - -/** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] *pSrc points to the Q7 input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
    
- * 	pDst[n] = (q31_t) pSrc[n] << 24;   0 <= n < blockSize.   
- * 
- * - */ - - -void arm_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize) -{ - q7_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - - q31_t in; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while(blkCnt > 0u) - { - /* C = (q31_t) A << 24 */ - /* convert from q7 to q31 and then store the results in the destination buffer */ - in = *__SIMD32(pIn)++; - -#ifndef ARM_MATH_BIG_ENDIAN - - *pDst++ = (__ROR(in, 8)) & 0xFF000000; - *pDst++ = (__ROR(in, 16)) & 0xFF000000; - *pDst++ = (__ROR(in, 24)) & 0xFF000000; - *pDst++ = (in & 0xFF000000); - -#else - - *pDst++ = (in & 0xFF000000); - *pDst++ = (__ROR(in, 24)) & 0xFF000000; - *pDst++ = (__ROR(in, 16)) & 0xFF000000; - *pDst++ = (__ROR(in, 8)) & 0xFF000000; - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while(blkCnt > 0u) - { - /* C = (q31_t) A << 24 */ - /* convert from q7 to q31 and then store the results in the destination buffer */ - *pDst++ = (q31_t) * pIn++ << 24; - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q7_to_x group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c deleted file mode 100644 index dc62e63..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c +++ /dev/null @@ -1,242 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_bitreversal.c -* -* Description: This file has common tables like Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/* -* @brief In-place bit reversal function. -* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. -* @param[in] fftSize length of the FFT. -* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. -* @param[in] *pBitRevTab points to the bit reversal table. -* @return none. -*/ - -void arm_bitreversal_f32( -float32_t * pSrc, -uint16_t fftSize, -uint16_t bitRevFactor, -uint16_t * pBitRevTab) -{ - uint16_t fftLenBy2, fftLenBy2p1; - uint16_t i, j; - float32_t in; - - /* Initializations */ - j = 0u; - fftLenBy2 = fftSize >> 1u; - fftLenBy2p1 = (fftSize >> 1u) + 1u; - - /* Bit Reversal Implementation */ - for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) - { - if(i < j) - { - /* pSrc[i] <-> pSrc[j]; */ - in = pSrc[2u * i]; - pSrc[2u * i] = pSrc[2u * j]; - pSrc[2u * j] = in; - - /* pSrc[i+1u] <-> pSrc[j+1u] */ - in = pSrc[(2u * i) + 1u]; - pSrc[(2u * i) + 1u] = pSrc[(2u * j) + 1u]; - pSrc[(2u * j) + 1u] = in; - - /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ - in = pSrc[2u * (i + fftLenBy2p1)]; - pSrc[2u * (i + fftLenBy2p1)] = pSrc[2u * (j + fftLenBy2p1)]; - pSrc[2u * (j + fftLenBy2p1)] = in; - - /* pSrc[i+fftLenBy2p1+1u] <-> pSrc[j+fftLenBy2p1+1u] */ - in = pSrc[(2u * (i + fftLenBy2p1)) + 1u]; - pSrc[(2u * (i + fftLenBy2p1)) + 1u] = - pSrc[(2u * (j + fftLenBy2p1)) + 1u]; - pSrc[(2u * (j + fftLenBy2p1)) + 1u] = in; - - } - - /* pSrc[i+1u] <-> pSrc[j+1u] */ - in = pSrc[2u * (i + 1u)]; - pSrc[2u * (i + 1u)] = pSrc[2u * (j + fftLenBy2)]; - pSrc[2u * (j + fftLenBy2)] = in; - - /* pSrc[i+2u] <-> pSrc[j+2u] */ - in = pSrc[(2u * (i + 1u)) + 1u]; - pSrc[(2u * (i + 1u)) + 1u] = pSrc[(2u * (j + fftLenBy2)) + 1u]; - pSrc[(2u * (j + fftLenBy2)) + 1u] = in; - - /* Reading the index for the bit reversal */ - j = *pBitRevTab; - - /* Updating the bit reversal index depending on the fft length */ - pBitRevTab += bitRevFactor; - } -} - - - -/* -* @brief In-place bit reversal function. -* @param[in, out] *pSrc points to the in-place buffer of Q31 data type. -* @param[in] fftLen length of the FFT. -* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table -* @param[in] *pBitRevTab points to bit reversal table. -* @return none. -*/ - -void arm_bitreversal_q31( -q31_t * pSrc, -uint32_t fftLen, -uint16_t bitRevFactor, -uint16_t * pBitRevTable) -{ - uint32_t fftLenBy2, fftLenBy2p1, i, j; - q31_t in; - - /* Initializations */ - j = 0u; - fftLenBy2 = fftLen / 2u; - fftLenBy2p1 = (fftLen / 2u) + 1u; - - /* Bit Reversal Implementation */ - for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) - { - if(i < j) - { - /* pSrc[i] <-> pSrc[j]; */ - in = pSrc[2u * i]; - pSrc[2u * i] = pSrc[2u * j]; - pSrc[2u * j] = in; - - /* pSrc[i+1u] <-> pSrc[j+1u] */ - in = pSrc[(2u * i) + 1u]; - pSrc[(2u * i) + 1u] = pSrc[(2u * j) + 1u]; - pSrc[(2u * j) + 1u] = in; - - /* pSrc[i+fftLenBy2p1] <-> pSrc[j+fftLenBy2p1] */ - in = pSrc[2u * (i + fftLenBy2p1)]; - pSrc[2u * (i + fftLenBy2p1)] = pSrc[2u * (j + fftLenBy2p1)]; - pSrc[2u * (j + fftLenBy2p1)] = in; - - /* pSrc[i+fftLenBy2p1+1u] <-> pSrc[j+fftLenBy2p1+1u] */ - in = pSrc[(2u * (i + fftLenBy2p1)) + 1u]; - pSrc[(2u * (i + fftLenBy2p1)) + 1u] = - pSrc[(2u * (j + fftLenBy2p1)) + 1u]; - pSrc[(2u * (j + fftLenBy2p1)) + 1u] = in; - - } - - /* pSrc[i+1u] <-> pSrc[j+1u] */ - in = pSrc[2u * (i + 1u)]; - pSrc[2u * (i + 1u)] = pSrc[2u * (j + fftLenBy2)]; - pSrc[2u * (j + fftLenBy2)] = in; - - /* pSrc[i+2u] <-> pSrc[j+2u] */ - in = pSrc[(2u * (i + 1u)) + 1u]; - pSrc[(2u * (i + 1u)) + 1u] = pSrc[(2u * (j + fftLenBy2)) + 1u]; - pSrc[(2u * (j + fftLenBy2)) + 1u] = in; - - /* Reading the index for the bit reversal */ - j = *pBitRevTable; - - /* Updating the bit reversal index depending on the fft length */ - pBitRevTable += bitRevFactor; - } -} - - - -/* - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table - * @param[in] *pBitRevTab points to bit reversal table. - * @return none. -*/ - -void arm_bitreversal_q15( -q15_t * pSrc16, -uint32_t fftLen, -uint16_t bitRevFactor, -uint16_t * pBitRevTab) -{ - q31_t *pSrc = (q31_t *) pSrc16; - q31_t in; - uint32_t fftLenBy2, fftLenBy2p1; - uint32_t i, j; - - /* Initializations */ - j = 0u; - fftLenBy2 = fftLen / 2u; - fftLenBy2p1 = (fftLen / 2u) + 1u; - - /* Bit Reversal Implementation */ - for (i = 0u; i <= (fftLenBy2 - 2u); i += 2u) - { - if(i < j) - { - /* pSrc[i] <-> pSrc[j]; */ - /* pSrc[i+1u] <-> pSrc[j+1u] */ - in = pSrc[i]; - pSrc[i] = pSrc[j]; - pSrc[j] = in; - - /* pSrc[i + fftLenBy2p1] <-> pSrc[j + fftLenBy2p1]; */ - /* pSrc[i + fftLenBy2p1+1u] <-> pSrc[j + fftLenBy2p1+1u] */ - in = pSrc[i + fftLenBy2p1]; - pSrc[i + fftLenBy2p1] = pSrc[j + fftLenBy2p1]; - pSrc[j + fftLenBy2p1] = in; - } - - /* pSrc[i+1u] <-> pSrc[j+fftLenBy2]; */ - /* pSrc[i+2] <-> pSrc[j+fftLenBy2+1u] */ - in = pSrc[i + 1u]; - pSrc[i + 1u] = pSrc[j + fftLenBy2]; - pSrc[j + fftLenBy2] = in; - - /* Reading the index for the bit reversal */ - j = *pBitRevTab; - - /* Updating the bit reversal index depending on the fft length */ - pBitRevTab += bitRevFactor; - } -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S deleted file mode 100644 index 4ea77e5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal2.S +++ /dev/null @@ -1,211 +0,0 @@ -;/* ---------------------------------------------------------------------- -;* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -;* -;* $Date: 19. March 2015 -;* $Revision: V.1.4.5 -;* -;* Project: CMSIS DSP Library -;* Title: arm_bitreversal2.S -;* -;* Description: This is the arm_bitreversal_32 function done in -;* assembly for maximum speed. This function is called -;* after doing an fft to reorder the output. The function -;* is loop unrolled by 2. arm_bitreversal_16 as well. -;* -;* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -;* -;* Redistribution and use in source and binary forms, with or without -;* modification, are permitted provided that the following conditions -;* are met: -;* - Redistributions of source code must retain the above copyright -;* notice, this list of conditions and the following disclaimer. -;* - Redistributions in binary form must reproduce the above copyright -;* notice, this list of conditions and the following disclaimer in -;* the documentation and/or other materials provided with the -;* distribution. -;* - Neither the name of ARM LIMITED nor the names of its contributors -;* may be used to endorse or promote products derived from this -;* software without specific prior written permission. -;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -;* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -;* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -;* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -;* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -;* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -;* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -;* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -;* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -;* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -;* POSSIBILITY OF SUCH DAMAGE. -;* -------------------------------------------------------------------- */ -#if defined(__CC_ARM) // Keil - #define CODESECT AREA ||.text||, CODE, READONLY, ALIGN=2 - #define LABEL -#elif defined(__IASMARM__) // IAR - #define CODESECT SECTION `.text`:CODE - #define PROC - #define LABEL - #define ENDP - #define EXPORT PUBLIC -#elif defined(__CSMC__) /* Cosmic */ - #define CODESECT switch .text - #define THUMB - #define EXPORT xdef - #define PROC : - #define LABEL : - #define ENDP - #define arm_bitreversal_32 _arm_bitreversal_32 -#elif defined (__GNUC__) // GCC - #define THUMB .thumb - #define CODESECT .section .text - #define EXPORT .global - #define PROC : - #define LABEL : - #define ENDP - #define END - - .syntax unified -#endif - - CODESECT - THUMB - -;/* -;* @brief In-place bit reversal function. -;* @param[in, out] *pSrc points to the in-place buffer of unknown 32-bit data type. -;* @param[in] bitRevLen bit reversal table length -;* @param[in] *pBitRevTab points to bit reversal table. -;* @return none. -;*/ - EXPORT arm_bitreversal_32 - EXPORT arm_bitreversal_16 - -#if defined(ARM_MATH_CM0) || defined(ARM_MATH_CM0PLUS) - -arm_bitreversal_32 PROC - ADDS r3,r1,#1 - PUSH {r4-r6} - ADDS r1,r2,#0 - LSRS r3,r3,#1 -arm_bitreversal_32_0 LABEL - LDRH r2,[r1,#2] - LDRH r6,[r1,#0] - ADD r2,r0,r2 - ADD r6,r0,r6 - LDR r5,[r2,#0] - LDR r4,[r6,#0] - STR r5,[r6,#0] - STR r4,[r2,#0] - LDR r5,[r2,#4] - LDR r4,[r6,#4] - STR r5,[r6,#4] - STR r4,[r2,#4] - ADDS r1,r1,#4 - SUBS r3,r3,#1 - BNE arm_bitreversal_32_0 - POP {r4-r6} - BX lr - ENDP - -arm_bitreversal_16 PROC - ADDS r3,r1,#1 - PUSH {r4-r6} - ADDS r1,r2,#0 - LSRS r3,r3,#1 -arm_bitreversal_16_0 LABEL - LDRH r2,[r1,#2] - LDRH r6,[r1,#0] - LSRS r2,r2,#1 - LSRS r6,r6,#1 - ADD r2,r0,r2 - ADD r6,r0,r6 - LDR r5,[r2,#0] - LDR r4,[r6,#0] - STR r5,[r6,#0] - STR r4,[r2,#0] - ADDS r1,r1,#4 - SUBS r3,r3,#1 - BNE arm_bitreversal_16_0 - POP {r4-r6} - BX lr - ENDP - -#else - -arm_bitreversal_32 PROC - ADDS r3,r1,#1 - CMP r3,#1 - IT LS - BXLS lr - PUSH {r4-r9} - ADDS r1,r2,#2 - LSRS r3,r3,#2 -arm_bitreversal_32_0 LABEL ;/* loop unrolled by 2 */ - LDRH r8,[r1,#4] - LDRH r9,[r1,#2] - LDRH r2,[r1,#0] - LDRH r12,[r1,#-2] - ADD r8,r0,r8 - ADD r9,r0,r9 - ADD r2,r0,r2 - ADD r12,r0,r12 - LDR r7,[r9,#0] - LDR r6,[r8,#0] - LDR r5,[r2,#0] - LDR r4,[r12,#0] - STR r6,[r9,#0] - STR r7,[r8,#0] - STR r5,[r12,#0] - STR r4,[r2,#0] - LDR r7,[r9,#4] - LDR r6,[r8,#4] - LDR r5,[r2,#4] - LDR r4,[r12,#4] - STR r6,[r9,#4] - STR r7,[r8,#4] - STR r5,[r12,#4] - STR r4,[r2,#4] - ADDS r1,r1,#8 - SUBS r3,r3,#1 - BNE arm_bitreversal_32_0 - POP {r4-r9} - BX lr - ENDP - -arm_bitreversal_16 PROC - ADDS r3,r1,#1 - CMP r3,#1 - IT LS - BXLS lr - PUSH {r4-r9} - ADDS r1,r2,#2 - LSRS r3,r3,#2 -arm_bitreversal_16_0 LABEL ;/* loop unrolled by 2 */ - LDRH r8,[r1,#4] - LDRH r9,[r1,#2] - LDRH r2,[r1,#0] - LDRH r12,[r1,#-2] - ADD r8,r0,r8,LSR #1 - ADD r9,r0,r9,LSR #1 - ADD r2,r0,r2,LSR #1 - ADD r12,r0,r12,LSR #1 - LDR r7,[r9,#0] - LDR r6,[r8,#0] - LDR r5,[r2,#0] - LDR r4,[r12,#0] - STR r6,[r9,#0] - STR r7,[r8,#0] - STR r5,[r12,#0] - STR r4,[r2,#0] - ADDS r1,r1,#8 - SUBS r3,r3,#1 - BNE arm_bitreversal_16_0 - POP {r4-r9} - BX lr - ENDP - -#endif - - END diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c deleted file mode 100644 index c287bb9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c +++ /dev/null @@ -1,632 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_f32.c -* -* Description: Combined Radix Decimation in Frequency CFFT Floating point processing function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -extern void arm_radix8_butterfly_f32( - float32_t * pSrc, - uint16_t fftLen, - const float32_t * pCoef, - uint16_t twidCoefModifier); - -extern void arm_bitreversal_32( - uint32_t * pSrc, - const uint16_t bitRevLen, - const uint16_t * pBitRevTable); - -/** -* @ingroup groupTransforms -*/ - -/** -* @defgroup ComplexFFT Complex FFT Functions -* -* \par -* The Fast Fourier Transform (FFT) is an efficient algorithm for computing the -* Discrete Fourier Transform (DFT). The FFT can be orders of magnitude faster -* than the DFT, especially for long lengths. -* The algorithms described in this section -* operate on complex data. A separate set of functions is devoted to handling -* of real sequences. -* \par -* There are separate algorithms for handling floating-point, Q15, and Q31 data -* types. The algorithms available for each data type are described next. -* \par -* The FFT functions operate in-place. That is, the array holding the input data -* will also be used to hold the corresponding result. The input data is complex -* and contains 2*fftLen interleaved values as shown below. -*
 {real[0], imag[0], real[1], imag[1],..} 
-* The FFT result will be contained in the same array and the frequency domain -* values will have the same interleaving. -* -* \par Floating-point -* The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-8 -* stages are performed along with a single radix-2 or radix-4 stage, as needed. -* The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses -* a different twiddle factor table. -* \par -* The function uses the standard FFT definition and output values may grow by a -* factor of fftLen when computing the forward transform. The -* inverse transform includes a scale of 1/fftLen as part of the -* calculation and this matches the textbook definition of the inverse FFT. -* \par -* Pre-initialized data structures containing twiddle factors and bit reversal -* tables are provided and defined in arm_const_structs.h. Include -* this header in your function and then pass one of the constant structures as -* an argument to arm_cfft_f32. For example: -* \par -* arm_cfft_f32(arm_cfft_sR_f32_len64, pSrc, 1, 1) -* \par -* computes a 64-point inverse complex FFT including bit reversal. -* The data structures are treated as constant data and not modified during the -* calculation. The same data structure can be reused for multiple transforms -* including mixing forward and inverse transforms. -* \par -* Earlier releases of the library provided separate radix-2 and radix-4 -* algorithms that operated on floating-point data. These functions are still -* provided but are deprecated. The older functions are slower and less general -* than the new functions. -* \par -* An example of initialization of the constants for the arm_cfft_f32 function follows: -* \code -* const static arm_cfft_instance_f32 *S; -* ... -* switch (length) { -* case 16: -* S = &arm_cfft_sR_f32_len16; -* break; -* case 32: -* S = &arm_cfft_sR_f32_len32; -* break; -* case 64: -* S = &arm_cfft_sR_f32_len64; -* break; -* case 128: -* S = &arm_cfft_sR_f32_len128; -* break; -* case 256: -* S = &arm_cfft_sR_f32_len256; -* break; -* case 512: -* S = &arm_cfft_sR_f32_len512; -* break; -* case 1024: -* S = &arm_cfft_sR_f32_len1024; -* break; -* case 2048: -* S = &arm_cfft_sR_f32_len2048; -* break; -* case 4096: -* S = &arm_cfft_sR_f32_len4096; -* break; -* } -* \endcode -* \par Q15 and Q31 -* The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-4 -* stages are performed along with a single radix-2 stage, as needed. -* The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses -* a different twiddle factor table. -* \par -* The function uses the standard FFT definition and output values may grow by a -* factor of fftLen when computing the forward transform. The -* inverse transform includes a scale of 1/fftLen as part of the -* calculation and this matches the textbook definition of the inverse FFT. -* \par -* Pre-initialized data structures containing twiddle factors and bit reversal -* tables are provided and defined in arm_const_structs.h. Include -* this header in your function and then pass one of the constant structures as -* an argument to arm_cfft_q31. For example: -* \par -* arm_cfft_q31(arm_cfft_sR_q31_len64, pSrc, 1, 1) -* \par -* computes a 64-point inverse complex FFT including bit reversal. -* The data structures are treated as constant data and not modified during the -* calculation. The same data structure can be reused for multiple transforms -* including mixing forward and inverse transforms. -* \par -* Earlier releases of the library provided separate radix-2 and radix-4 -* algorithms that operated on floating-point data. These functions are still -* provided but are deprecated. The older functions are slower and less general -* than the new functions. -* \par -* An example of initialization of the constants for the arm_cfft_q31 function follows: -* \code -* const static arm_cfft_instance_q31 *S; -* ... -* switch (length) { -* case 16: -* S = &arm_cfft_sR_q31_len16; -* break; -* case 32: -* S = &arm_cfft_sR_q31_len32; -* break; -* case 64: -* S = &arm_cfft_sR_q31_len64; -* break; -* case 128: -* S = &arm_cfft_sR_q31_len128; -* break; -* case 256: -* S = &arm_cfft_sR_q31_len256; -* break; -* case 512: -* S = &arm_cfft_sR_q31_len512; -* break; -* case 1024: -* S = &arm_cfft_sR_q31_len1024; -* break; -* case 2048: -* S = &arm_cfft_sR_q31_len2048; -* break; -* case 4096: -* S = &arm_cfft_sR_q31_len4096; -* break; -* } -* \endcode -* -*/ - -void arm_cfft_radix8by2_f32( arm_cfft_instance_f32 * S, float32_t * p1) -{ - uint32_t L = S->fftLen; - float32_t * pCol1, * pCol2, * pMid1, * pMid2; - float32_t * p2 = p1 + L; - const float32_t * tw = (float32_t *) S->pTwiddle; - float32_t t1[4], t2[4], t3[4], t4[4], twR, twI; - float32_t m0, m1, m2, m3; - uint32_t l; - - pCol1 = p1; - pCol2 = p2; - - // Define new length - L >>= 1; - // Initialize mid pointers - pMid1 = p1 + L; - pMid2 = p2 + L; - - // do two dot Fourier transform - for ( l = L >> 2; l > 0; l-- ) - { - t1[0] = p1[0]; - t1[1] = p1[1]; - t1[2] = p1[2]; - t1[3] = p1[3]; - - t2[0] = p2[0]; - t2[1] = p2[1]; - t2[2] = p2[2]; - t2[3] = p2[3]; - - t3[0] = pMid1[0]; - t3[1] = pMid1[1]; - t3[2] = pMid1[2]; - t3[3] = pMid1[3]; - - t4[0] = pMid2[0]; - t4[1] = pMid2[1]; - t4[2] = pMid2[2]; - t4[3] = pMid2[3]; - - *p1++ = t1[0] + t2[0]; - *p1++ = t1[1] + t2[1]; - *p1++ = t1[2] + t2[2]; - *p1++ = t1[3] + t2[3]; // col 1 - - t2[0] = t1[0] - t2[0]; - t2[1] = t1[1] - t2[1]; - t2[2] = t1[2] - t2[2]; - t2[3] = t1[3] - t2[3]; // for col 2 - - *pMid1++ = t3[0] + t4[0]; - *pMid1++ = t3[1] + t4[1]; - *pMid1++ = t3[2] + t4[2]; - *pMid1++ = t3[3] + t4[3]; // col 1 - - t4[0] = t4[0] - t3[0]; - t4[1] = t4[1] - t3[1]; - t4[2] = t4[2] - t3[2]; - t4[3] = t4[3] - t3[3]; // for col 2 - - twR = *tw++; - twI = *tw++; - - // multiply by twiddle factors - m0 = t2[0] * twR; - m1 = t2[1] * twI; - m2 = t2[1] * twR; - m3 = t2[0] * twI; - - // R = R * Tr - I * Ti - *p2++ = m0 + m1; - // I = I * Tr + R * Ti - *p2++ = m2 - m3; - - // use vertical symmetry - // 0.9988 - 0.0491i <==> -0.0491 - 0.9988i - m0 = t4[0] * twI; - m1 = t4[1] * twR; - m2 = t4[1] * twI; - m3 = t4[0] * twR; - - *pMid2++ = m0 - m1; - *pMid2++ = m2 + m3; - - twR = *tw++; - twI = *tw++; - - m0 = t2[2] * twR; - m1 = t2[3] * twI; - m2 = t2[3] * twR; - m3 = t2[2] * twI; - - *p2++ = m0 + m1; - *p2++ = m2 - m3; - - m0 = t4[2] * twI; - m1 = t4[3] * twR; - m2 = t4[3] * twI; - m3 = t4[2] * twR; - - *pMid2++ = m0 - m1; - *pMid2++ = m2 + m3; - } - - // first col - arm_radix8_butterfly_f32( pCol1, L, (float32_t *) S->pTwiddle, 2u); - // second col - arm_radix8_butterfly_f32( pCol2, L, (float32_t *) S->pTwiddle, 2u); -} - -void arm_cfft_radix8by4_f32( arm_cfft_instance_f32 * S, float32_t * p1) -{ - uint32_t L = S->fftLen >> 1; - float32_t * pCol1, *pCol2, *pCol3, *pCol4, *pEnd1, *pEnd2, *pEnd3, *pEnd4; - const float32_t *tw2, *tw3, *tw4; - float32_t * p2 = p1 + L; - float32_t * p3 = p2 + L; - float32_t * p4 = p3 + L; - float32_t t2[4], t3[4], t4[4], twR, twI; - float32_t p1ap3_0, p1sp3_0, p1ap3_1, p1sp3_1; - float32_t m0, m1, m2, m3; - uint32_t l, twMod2, twMod3, twMod4; - - pCol1 = p1; // points to real values by default - pCol2 = p2; - pCol3 = p3; - pCol4 = p4; - pEnd1 = p2 - 1; // points to imaginary values by default - pEnd2 = p3 - 1; - pEnd3 = p4 - 1; - pEnd4 = pEnd3 + L; - - tw2 = tw3 = tw4 = (float32_t *) S->pTwiddle; - - L >>= 1; - - // do four dot Fourier transform - - twMod2 = 2; - twMod3 = 4; - twMod4 = 6; - - // TOP - p1ap3_0 = p1[0] + p3[0]; - p1sp3_0 = p1[0] - p3[0]; - p1ap3_1 = p1[1] + p3[1]; - p1sp3_1 = p1[1] - p3[1]; - - // col 2 - t2[0] = p1sp3_0 + p2[1] - p4[1]; - t2[1] = p1sp3_1 - p2[0] + p4[0]; - // col 3 - t3[0] = p1ap3_0 - p2[0] - p4[0]; - t3[1] = p1ap3_1 - p2[1] - p4[1]; - // col 4 - t4[0] = p1sp3_0 - p2[1] + p4[1]; - t4[1] = p1sp3_1 + p2[0] - p4[0]; - // col 1 - *p1++ = p1ap3_0 + p2[0] + p4[0]; - *p1++ = p1ap3_1 + p2[1] + p4[1]; - - // Twiddle factors are ones - *p2++ = t2[0]; - *p2++ = t2[1]; - *p3++ = t3[0]; - *p3++ = t3[1]; - *p4++ = t4[0]; - *p4++ = t4[1]; - - tw2 += twMod2; - tw3 += twMod3; - tw4 += twMod4; - - for (l = (L - 2) >> 1; l > 0; l-- ) - { - // TOP - p1ap3_0 = p1[0] + p3[0]; - p1sp3_0 = p1[0] - p3[0]; - p1ap3_1 = p1[1] + p3[1]; - p1sp3_1 = p1[1] - p3[1]; - // col 2 - t2[0] = p1sp3_0 + p2[1] - p4[1]; - t2[1] = p1sp3_1 - p2[0] + p4[0]; - // col 3 - t3[0] = p1ap3_0 - p2[0] - p4[0]; - t3[1] = p1ap3_1 - p2[1] - p4[1]; - // col 4 - t4[0] = p1sp3_0 - p2[1] + p4[1]; - t4[1] = p1sp3_1 + p2[0] - p4[0]; - // col 1 - top - *p1++ = p1ap3_0 + p2[0] + p4[0]; - *p1++ = p1ap3_1 + p2[1] + p4[1]; - - // BOTTOM - p1ap3_1 = pEnd1[-1] + pEnd3[-1]; - p1sp3_1 = pEnd1[-1] - pEnd3[-1]; - p1ap3_0 = pEnd1[0] + pEnd3[0]; - p1sp3_0 = pEnd1[0] - pEnd3[0]; - // col 2 - t2[2] = pEnd2[0] - pEnd4[0] + p1sp3_1; - t2[3] = pEnd1[0] - pEnd3[0] - pEnd2[-1] + pEnd4[-1]; - // col 3 - t3[2] = p1ap3_1 - pEnd2[-1] - pEnd4[-1]; - t3[3] = p1ap3_0 - pEnd2[0] - pEnd4[0]; - // col 4 - t4[2] = pEnd2[0] - pEnd4[0] - p1sp3_1; - t4[3] = pEnd4[-1] - pEnd2[-1] - p1sp3_0; - // col 1 - Bottom - *pEnd1-- = p1ap3_0 + pEnd2[0] + pEnd4[0]; - *pEnd1-- = p1ap3_1 + pEnd2[-1] + pEnd4[-1]; - - // COL 2 - // read twiddle factors - twR = *tw2++; - twI = *tw2++; - // multiply by twiddle factors - // let Z1 = a + i(b), Z2 = c + i(d) - // => Z1 * Z2 = (a*c - b*d) + i(b*c + a*d) - - // Top - m0 = t2[0] * twR; - m1 = t2[1] * twI; - m2 = t2[1] * twR; - m3 = t2[0] * twI; - - *p2++ = m0 + m1; - *p2++ = m2 - m3; - // use vertical symmetry col 2 - // 0.9997 - 0.0245i <==> 0.0245 - 0.9997i - // Bottom - m0 = t2[3] * twI; - m1 = t2[2] * twR; - m2 = t2[2] * twI; - m3 = t2[3] * twR; - - *pEnd2-- = m0 - m1; - *pEnd2-- = m2 + m3; - - // COL 3 - twR = tw3[0]; - twI = tw3[1]; - tw3 += twMod3; - // Top - m0 = t3[0] * twR; - m1 = t3[1] * twI; - m2 = t3[1] * twR; - m3 = t3[0] * twI; - - *p3++ = m0 + m1; - *p3++ = m2 - m3; - // use vertical symmetry col 3 - // 0.9988 - 0.0491i <==> -0.9988 - 0.0491i - // Bottom - m0 = -t3[3] * twR; - m1 = t3[2] * twI; - m2 = t3[2] * twR; - m3 = t3[3] * twI; - - *pEnd3-- = m0 - m1; - *pEnd3-- = m3 - m2; - - // COL 4 - twR = tw4[0]; - twI = tw4[1]; - tw4 += twMod4; - // Top - m0 = t4[0] * twR; - m1 = t4[1] * twI; - m2 = t4[1] * twR; - m3 = t4[0] * twI; - - *p4++ = m0 + m1; - *p4++ = m2 - m3; - // use vertical symmetry col 4 - // 0.9973 - 0.0736i <==> -0.0736 + 0.9973i - // Bottom - m0 = t4[3] * twI; - m1 = t4[2] * twR; - m2 = t4[2] * twI; - m3 = t4[3] * twR; - - *pEnd4-- = m0 - m1; - *pEnd4-- = m2 + m3; - } - - //MIDDLE - // Twiddle factors are - // 1.0000 0.7071-0.7071i -1.0000i -0.7071-0.7071i - p1ap3_0 = p1[0] + p3[0]; - p1sp3_0 = p1[0] - p3[0]; - p1ap3_1 = p1[1] + p3[1]; - p1sp3_1 = p1[1] - p3[1]; - - // col 2 - t2[0] = p1sp3_0 + p2[1] - p4[1]; - t2[1] = p1sp3_1 - p2[0] + p4[0]; - // col 3 - t3[0] = p1ap3_0 - p2[0] - p4[0]; - t3[1] = p1ap3_1 - p2[1] - p4[1]; - // col 4 - t4[0] = p1sp3_0 - p2[1] + p4[1]; - t4[1] = p1sp3_1 + p2[0] - p4[0]; - // col 1 - Top - *p1++ = p1ap3_0 + p2[0] + p4[0]; - *p1++ = p1ap3_1 + p2[1] + p4[1]; - - // COL 2 - twR = tw2[0]; - twI = tw2[1]; - - m0 = t2[0] * twR; - m1 = t2[1] * twI; - m2 = t2[1] * twR; - m3 = t2[0] * twI; - - *p2++ = m0 + m1; - *p2++ = m2 - m3; - // COL 3 - twR = tw3[0]; - twI = tw3[1]; - - m0 = t3[0] * twR; - m1 = t3[1] * twI; - m2 = t3[1] * twR; - m3 = t3[0] * twI; - - *p3++ = m0 + m1; - *p3++ = m2 - m3; - // COL 4 - twR = tw4[0]; - twI = tw4[1]; - - m0 = t4[0] * twR; - m1 = t4[1] * twI; - m2 = t4[1] * twR; - m3 = t4[0] * twI; - - *p4++ = m0 + m1; - *p4++ = m2 - m3; - - // first col - arm_radix8_butterfly_f32( pCol1, L, (float32_t *) S->pTwiddle, 4u); - // second col - arm_radix8_butterfly_f32( pCol2, L, (float32_t *) S->pTwiddle, 4u); - // third col - arm_radix8_butterfly_f32( pCol3, L, (float32_t *) S->pTwiddle, 4u); - // fourth col - arm_radix8_butterfly_f32( pCol4, L, (float32_t *) S->pTwiddle, 4u); -} - -/** -* @addtogroup ComplexFFT -* @{ -*/ - -/** -* @details -* @brief Processing function for the floating-point complex FFT. -* @param[in] *S points to an instance of the floating-point CFFT structure. -* @param[in, out] *p1 points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return none. -*/ - -void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - uint32_t L = S->fftLen, l; - float32_t invL, * pSrc; - - if(ifftFlag == 1u) - { - /* Conjugate input data */ - pSrc = p1 + 1; - for(l=0; lpTwiddle, 1); - break; - } - - if( bitReverseFlag ) - arm_bitreversal_32((uint32_t*)p1,S->bitRevLength,S->pBitRevTable); - - if(ifftFlag == 1u) - { - invL = 1.0f/(float32_t)L; - /* Conjugate and scale output data */ - pSrc = p1; - for(l=0; l2*fftLen. Processing occurs in-place. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return none. -*/ - -void arm_cfft_q15( - const arm_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - uint32_t L = S->fftLen; - - if(ifftFlag == 1u) - { - switch (L) - { - case 16: - case 64: - case 256: - case 1024: - case 4096: - arm_radix4_butterfly_inverse_q15 ( p1, L, (q15_t*)S->pTwiddle, 1 ); - break; - - case 32: - case 128: - case 512: - case 2048: - arm_cfft_radix4by2_inverse_q15 ( p1, L, S->pTwiddle ); - break; - } - } - else - { - switch (L) - { - case 16: - case 64: - case 256: - case 1024: - case 4096: - arm_radix4_butterfly_q15 ( p1, L, (q15_t*)S->pTwiddle, 1 ); - break; - - case 32: - case 128: - case 512: - case 2048: - arm_cfft_radix4by2_q15 ( p1, L, S->pTwiddle ); - break; - } - } - - if( bitReverseFlag ) - arm_bitreversal_16((uint16_t*)p1,S->bitRevLength,S->pBitRevTable); -} - -/** -* @} end of ComplexFFT group -*/ - -void arm_cfft_radix4by2_q15( - q15_t * pSrc, - uint32_t fftLen, - const q15_t * pCoef) -{ - uint32_t i; - uint32_t n2; - q15_t p0, p1, p2, p3; -#ifndef ARM_MATH_CM0_FAMILY - q31_t T, S, R; - q31_t coeff, out1, out2; - const q15_t *pC = pCoef; - q15_t *pSi = pSrc; - q15_t *pSl = pSrc + fftLen; -#else - uint32_t ia, l; - q15_t xt, yt, cosVal, sinVal; -#endif - - n2 = fftLen >> 1; - -#ifndef ARM_MATH_CM0_FAMILY - - for (i = n2; i > 0; i--) - { - coeff = _SIMD32_OFFSET(pC); - pC += 2; - - T = _SIMD32_OFFSET(pSi); - T = __SHADD16(T, 0); // this is just a SIMD arithmetic shift right by 1 - - S = _SIMD32_OFFSET(pSl); - S = __SHADD16(S, 0); // this is just a SIMD arithmetic shift right by 1 - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSi) = __SHADD16(T, S); - pSi += 2; - - #ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(coeff, R) >> 16; - out2 = __SMUSDX(coeff, R); - - #else - - out1 = __SMUSDX(R, coeff) >> 16u; - out2 = __SMUAD(coeff, R); - - #endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSl) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSl += 2; - } - -#else // #ifndef ARM_MATH_CM0_FAMILY - - ia = 0; - for (i = 0; i < n2; i++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia++; - - l = i + n2; - - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) + - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) - - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - } - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - // first col - arm_radix4_butterfly_q15( pSrc, n2, (q15_t*)pCoef, 2u); - // second col - arm_radix4_butterfly_q15( pSrc + fftLen, n2, (q15_t*)pCoef, 2u); - - for (i = 0; i < fftLen >> 1; i++) - { - p0 = pSrc[4*i+0]; - p1 = pSrc[4*i+1]; - p2 = pSrc[4*i+2]; - p3 = pSrc[4*i+3]; - - p0 <<= 1; - p1 <<= 1; - p2 <<= 1; - p3 <<= 1; - - pSrc[4*i+0] = p0; - pSrc[4*i+1] = p1; - pSrc[4*i+2] = p2; - pSrc[4*i+3] = p3; - } -} - -void arm_cfft_radix4by2_inverse_q15( - q15_t * pSrc, - uint32_t fftLen, - const q15_t * pCoef) -{ - uint32_t i; - uint32_t n2; - q15_t p0, p1, p2, p3; -#ifndef ARM_MATH_CM0_FAMILY - q31_t T, S, R; - q31_t coeff, out1, out2; - const q15_t *pC = pCoef; - q15_t *pSi = pSrc; - q15_t *pSl = pSrc + fftLen; -#else - uint32_t ia, l; - q15_t xt, yt, cosVal, sinVal; -#endif - - n2 = fftLen >> 1; - -#ifndef ARM_MATH_CM0_FAMILY - - for (i = n2; i > 0; i--) - { - coeff = _SIMD32_OFFSET(pC); - pC += 2; - - T = _SIMD32_OFFSET(pSi); - T = __SHADD16(T, 0); // this is just a SIMD arithmetic shift right by 1 - - S = _SIMD32_OFFSET(pSl); - S = __SHADD16(S, 0); // this is just a SIMD arithmetic shift right by 1 - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSi) = __SHADD16(T, S); - pSi += 2; - - #ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(coeff, R) >> 16; - out2 = __SMUADX(coeff, R); - #else - - out1 = __SMUADX(R, coeff) >> 16u; - out2 = __SMUSD(__QSUB(0, coeff), R); - - #endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSl) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSl += 2; - } - -#else // #ifndef ARM_MATH_CM0_FAMILY - - ia = 0; - for (i = 0; i < n2; i++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia++; - - l = i + n2; - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) - - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) + - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - } - -#endif // #ifndef ARM_MATH_CM0_FAMILY - - // first col - arm_radix4_butterfly_inverse_q15( pSrc, n2, (q15_t*)pCoef, 2u); - // second col - arm_radix4_butterfly_inverse_q15( pSrc + fftLen, n2, (q15_t*)pCoef, 2u); - - for (i = 0; i < fftLen >> 1; i++) - { - p0 = pSrc[4*i+0]; - p1 = pSrc[4*i+1]; - p2 = pSrc[4*i+2]; - p3 = pSrc[4*i+3]; - - p0 <<= 1; - p1 <<= 1; - p2 <<= 1; - p3 <<= 1; - - pSrc[4*i+0] = p0; - pSrc[4*i+1] = p1; - pSrc[4*i+2] = p2; - pSrc[4*i+3] = p3; - } -} - diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c deleted file mode 100644 index 401825b..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c +++ /dev/null @@ -1,264 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_q31.c -* -* Description: Combined Radix Decimation in Frequency CFFT fixed point processing function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -extern void arm_radix4_butterfly_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier); - -extern void arm_radix4_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier); - -extern void arm_bitreversal_32( - uint32_t * pSrc, - const uint16_t bitRevLen, - const uint16_t * pBitRevTable); - -void arm_cfft_radix4by2_q31( - q31_t * pSrc, - uint32_t fftLen, - const q31_t * pCoef); - -void arm_cfft_radix4by2_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - const q31_t * pCoef); - -/** -* @ingroup groupTransforms -*/ - -/** -* @addtogroup ComplexFFT -* @{ -*/ - -/** -* @details -* @brief Processing function for the fixed-point complex FFT in Q31 format. -* @param[in] *S points to an instance of the fixed-point CFFT structure. -* @param[in, out] *p1 points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return none. -*/ - -void arm_cfft_q31( - const arm_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - uint32_t L = S->fftLen; - - if(ifftFlag == 1u) - { - switch (L) - { - case 16: - case 64: - case 256: - case 1024: - case 4096: - arm_radix4_butterfly_inverse_q31 ( p1, L, (q31_t*)S->pTwiddle, 1 ); - break; - - case 32: - case 128: - case 512: - case 2048: - arm_cfft_radix4by2_inverse_q31 ( p1, L, S->pTwiddle ); - break; - } - } - else - { - switch (L) - { - case 16: - case 64: - case 256: - case 1024: - case 4096: - arm_radix4_butterfly_q31 ( p1, L, (q31_t*)S->pTwiddle, 1 ); - break; - - case 32: - case 128: - case 512: - case 2048: - arm_cfft_radix4by2_q31 ( p1, L, S->pTwiddle ); - break; - } - } - - if( bitReverseFlag ) - arm_bitreversal_32((uint32_t*)p1,S->bitRevLength,S->pBitRevTable); -} - -/** -* @} end of ComplexFFT group -*/ - -void arm_cfft_radix4by2_q31( - q31_t * pSrc, - uint32_t fftLen, - const q31_t * pCoef) -{ - uint32_t i, l; - uint32_t n2, ia; - q31_t xt, yt, cosVal, sinVal; - q31_t p0, p1; - - n2 = fftLen >> 1; - ia = 0; - for (i = 0; i < n2; i++) - { - cosVal = pCoef[2*ia]; - sinVal = pCoef[2*ia + 1]; - ia++; - - l = i + n2; - xt = (pSrc[2 * i] >> 2) - (pSrc[2 * l] >> 2); - pSrc[2 * i] = (pSrc[2 * i] >> 2) + (pSrc[2 * l] >> 2); - - yt = (pSrc[2 * i + 1] >> 2) - (pSrc[2 * l + 1] >> 2); - pSrc[2 * i + 1] = (pSrc[2 * l + 1] >> 2) + (pSrc[2 * i + 1] >> 2); - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multAcc_32x32_keep32_R(p0, yt, sinVal); - multSub_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0 << 1; - pSrc[2u * l + 1u] = p1 << 1; - - } - - // first col - arm_radix4_butterfly_q31( pSrc, n2, (q31_t*)pCoef, 2u); - // second col - arm_radix4_butterfly_q31( pSrc + fftLen, n2, (q31_t*)pCoef, 2u); - - for (i = 0; i < fftLen >> 1; i++) - { - p0 = pSrc[4*i+0]; - p1 = pSrc[4*i+1]; - xt = pSrc[4*i+2]; - yt = pSrc[4*i+3]; - - p0 <<= 1; - p1 <<= 1; - xt <<= 1; - yt <<= 1; - - pSrc[4*i+0] = p0; - pSrc[4*i+1] = p1; - pSrc[4*i+2] = xt; - pSrc[4*i+3] = yt; - } - -} - -void arm_cfft_radix4by2_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - const q31_t * pCoef) -{ - uint32_t i, l; - uint32_t n2, ia; - q31_t xt, yt, cosVal, sinVal; - q31_t p0, p1; - - n2 = fftLen >> 1; - ia = 0; - for (i = 0; i < n2; i++) - { - cosVal = pCoef[2*ia]; - sinVal = pCoef[2*ia + 1]; - ia++; - - l = i + n2; - xt = (pSrc[2 * i] >> 2) - (pSrc[2 * l] >> 2); - pSrc[2 * i] = (pSrc[2 * i] >> 2) + (pSrc[2 * l] >> 2); - - yt = (pSrc[2 * i + 1] >> 2) - (pSrc[2 * l + 1] >> 2); - pSrc[2 * i + 1] = (pSrc[2 * l + 1] >> 2) + (pSrc[2 * i + 1] >> 2); - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multSub_32x32_keep32_R(p0, yt, sinVal); - multAcc_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0 << 1; - pSrc[2u * l + 1u] = p1 << 1; - - } - - // first col - arm_radix4_butterfly_inverse_q31( pSrc, n2, (q31_t*)pCoef, 2u); - // second col - arm_radix4_butterfly_inverse_q31( pSrc + fftLen, n2, (q31_t*)pCoef, 2u); - - for (i = 0; i < fftLen >> 1; i++) - { - p0 = pSrc[4*i+0]; - p1 = pSrc[4*i+1]; - xt = pSrc[4*i+2]; - yt = pSrc[4*i+3]; - - p0 <<= 1; - p1 <<= 1; - xt <<= 1; - yt <<= 1; - - pSrc[4*i+0] = p0; - pSrc[4*i+1] = p1; - pSrc[4*i+2] = xt; - pSrc[4*i+3] = yt; - } -} - diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c deleted file mode 100644 index b0632ac..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c +++ /dev/null @@ -1,485 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix2_f32.c -* -* Description: Radix-2 Decimation in Frequency CFFT & CIFFT Floating point processing function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -void arm_radix2_butterfly_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier); - -void arm_radix2_butterfly_inverse_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier, - float32_t onebyfftLen); - -extern void arm_bitreversal_f32( - float32_t * pSrc, - uint16_t fftSize, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - -/** -* @ingroup groupTransforms -*/ - -/** -* @addtogroup ComplexFFT -* @{ -*/ - -/** -* @details -* @brief Radix-2 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed -* in the future. -* @param[in] *S points to an instance of the floating-point Radix-2 CFFT/CIFFT structure. -* @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @return none. -*/ - -void arm_cfft_radix2_f32( -const arm_cfft_radix2_instance_f32 * S, -float32_t * pSrc) -{ - - if(S->ifftFlag == 1u) - { - /* Complex IFFT radix-2 */ - arm_radix2_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier, S->onebyfftLen); - } - else - { - /* Complex FFT radix-2 */ - arm_radix2_butterfly_f32(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - - if(S->bitReverseFlag == 1u) - { - /* Bit Reversal */ - arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); - } - -} - - -/** -* @} end of ComplexFFT group -*/ - - - -/* ---------------------------------------------------------------------- -** Internal helper function used by the FFTs -** ------------------------------------------------------------------- */ - -/* -* @brief Core function for the floating-point CFFT butterfly process. -* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. -* @param[in] fftLen length of the FFT. -* @param[in] *pCoef points to the twiddle coefficient buffer. -* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -*/ - -void arm_radix2_butterfly_f32( -float32_t * pSrc, -uint32_t fftLen, -float32_t * pCoef, -uint16_t twidCoefModifier) -{ - - uint32_t i, j, k, l; - uint32_t n1, n2, ia; - float32_t xt, yt, cosVal, sinVal; - float32_t p0, p1, p2, p3; - float32_t a0, a1; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Initializations for the first stage */ - n2 = fftLen >> 1; - ia = 0; - i = 0; - - // loop for groups - for (k = n2; k > 0; k--) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - - /* Twiddle coefficients index modifier */ - ia += twidCoefModifier; - - /* index calculation for the input as, */ - /* pSrc[i + 0], pSrc[i + fftLen/1] */ - l = i + n2; - - /* Butterfly implementation */ - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 + p1; - pSrc[2 * l + 1] = p2 - p3; - - i++; - } // groups loop end - - twidCoefModifier <<= 1u; - - // loop for stage - for (k = n2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - j = 0; - do - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia += twidCoefModifier; - - // loop for butterfly - i = j; - do - { - l = i + n2; - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 + p1; - pSrc[2 * l + 1] = p2 - p3; - - i += n1; - } while( i < fftLen ); // butterfly loop end - j++; - } while( j < n2); // groups loop end - twidCoefModifier <<= 1u; - } // stages loop end - - // loop for butterfly - for (i = 0; i < fftLen; i += 2) - { - a0 = pSrc[2 * i] + pSrc[2 * i + 2]; - xt = pSrc[2 * i] - pSrc[2 * i + 2]; - - yt = pSrc[2 * i + 1] - pSrc[2 * i + 3]; - a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1]; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - pSrc[2 * i + 2] = xt; - pSrc[2 * i + 3] = yt; - } // groups loop end - -#else - - n2 = fftLen; - - // loop for stage - for (k = fftLen; k > 1; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - j = 0; - do - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia += twidCoefModifier; - - // loop for butterfly - i = j; - do - { - l = i + n2; - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 + p1; - pSrc[2 * l + 1] = p2 - p3; - - i += n1; - } while(i < fftLen); - j++; - } while(j < n2); - twidCoefModifier <<= 1u; - } - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -} - - -void arm_radix2_butterfly_inverse_f32( -float32_t * pSrc, -uint32_t fftLen, -float32_t * pCoef, -uint16_t twidCoefModifier, -float32_t onebyfftLen) -{ - - uint32_t i, j, k, l; - uint32_t n1, n2, ia; - float32_t xt, yt, cosVal, sinVal; - float32_t p0, p1, p2, p3; - float32_t a0, a1; - -#ifndef ARM_MATH_CM0_FAMILY - - n2 = fftLen >> 1; - ia = 0; - - // loop for groups - for (i = 0; i < n2; i++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia += twidCoefModifier; - - l = i + n2; - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 - p1; - pSrc[2 * l + 1] = p2 + p3; - } // groups loop end - - twidCoefModifier <<= 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - j = 0; - do - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia += twidCoefModifier; - - // loop for butterfly - i = j; - do - { - l = i + n2; - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 - p1; - pSrc[2 * l + 1] = p2 + p3; - - i += n1; - } while( i < fftLen ); // butterfly loop end - j++; - } while(j < n2); // groups loop end - - twidCoefModifier <<= 1u; - } // stages loop end - - // loop for butterfly - for (i = 0; i < fftLen; i += 2) - { - a0 = pSrc[2 * i] + pSrc[2 * i + 2]; - xt = pSrc[2 * i] - pSrc[2 * i + 2]; - - a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1]; - yt = pSrc[2 * i + 1] - pSrc[2 * i + 3]; - - p0 = a0 * onebyfftLen; - p2 = xt * onebyfftLen; - p1 = a1 * onebyfftLen; - p3 = yt * onebyfftLen; - - pSrc[2 * i] = p0; - pSrc[2 * i + 1] = p1; - pSrc[2 * i + 2] = p2; - pSrc[2 * i + 3] = p3; - } // butterfly loop end - -#else - - n2 = fftLen; - - // loop for stage - for (k = fftLen; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - j = 0; - do - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - i = j; - do - { - l = i + n2; - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - - p0 = xt * cosVal; - p1 = yt * sinVal; - p2 = yt * cosVal; - p3 = xt * sinVal; - - pSrc[2 * i] = a0; - pSrc[2 * i + 1] = a1; - - pSrc[2 * l] = p0 - p1; - pSrc[2 * l + 1] = p2 + p3; - - i += n1; - } while( i < fftLen ); // butterfly loop end - j++; - } while( j < n2 ); // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - - // loop for butterfly - for (i = 0; i < fftLen; i += n1) - { - l = i + n2; - - a0 = pSrc[2 * i] + pSrc[2 * l]; - xt = pSrc[2 * i] - pSrc[2 * l]; - - a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1]; - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - - p0 = a0 * onebyfftLen; - p2 = xt * onebyfftLen; - p1 = a1 * onebyfftLen; - p3 = yt * onebyfftLen; - - pSrc[2 * i] = p0; - pSrc[2u * l] = p2; - - pSrc[2 * i + 1] = p1; - pSrc[2u * l + 1u] = p3; - } // butterfly loop end - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c deleted file mode 100644 index 64fd956..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c +++ /dev/null @@ -1,205 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_init_f32.c -* -* Description: Radix-4 Decimation in Frequency Floating-point CFFT & CIFFT Initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** -* @brief Initialization function for the floating-point CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed -* in the future. -* @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ -arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialise the FFT length */ - S->fftLen = fftLen; - - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (float32_t *) twiddleCoef; - - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of structure parameters depending on the FFT length */ - switch (S->fftLen) - { - - case 4096u: - /* Initializations of structure parameters for 4096 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.000244140625; - break; - - case 2048u: - /* Initializations of structure parameters for 2048 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 2u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 2u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.00048828125; - break; - - case 1024u: - /* Initializations of structure parameters for 1024 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 4u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 4u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.0009765625f; - break; - - case 512u: - /* Initializations of structure parameters for 512 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 8u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 8u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.001953125; - break; - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - S->onebyfftLen = 0.00390625f; - break; - - case 128u: - /* Initializations of structure parameters for 128 point FFT */ - S->twidCoefModifier = 32u; - S->bitRevFactor = 32u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; - S->onebyfftLen = 0.0078125; - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - S->onebyfftLen = 0.015625f; - break; - - case 32u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 128u; - S->bitRevFactor = 128u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; - S->onebyfftLen = 0.03125; - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - S->onebyfftLen = 0.0625f; - break; - - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c deleted file mode 100644 index 1577c5e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c +++ /dev/null @@ -1,189 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix2_init_q15.c -* -* Description: Radix-2 Decimation in Frequency Q15 FFT & IFFT initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** -* @brief Initialization function for the Q15 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed -* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ - -arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialise the FFT length */ - S->fftLen = fftLen; - - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (q15_t *) twiddleCoef_4096_q15; - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of structure parameters depending on the FFT length */ - switch (S->fftLen) - { - case 4096u: - /* Initializations of structure parameters for 4096 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - - break; - - case 2048u: - /* Initializations of structure parameters for 2048 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 2u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 2u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; - - break; - - case 1024u: - /* Initializations of structure parameters for 1024 point FFT */ - S->twidCoefModifier = 4u; - S->bitRevFactor = 4u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - - break; - - case 512u: - /* Initializations of structure parameters for 512 point FFT */ - S->twidCoefModifier = 8u; - S->bitRevFactor = 8u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; - - break; - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - - break; - - case 128u: - /* Initializations of structure parameters for 128 point FFT */ - S->twidCoefModifier = 32u; - S->bitRevFactor = 32u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; - - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - - break; - - case 32u: - /* Initializations of structure parameters for 32 point FFT */ - S->twidCoefModifier = 128u; - S->bitRevFactor = 128u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; - - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - - break; - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c deleted file mode 100644 index 61ebaad..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c +++ /dev/null @@ -1,187 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix2_init_q31.c -* -* Description: Radix-2 Decimation in Frequency Fixed-point CFFT & CIFFT Initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - - -/** -* -* @brief Initialization function for the Q31 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed -* @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ - -arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialise the FFT length */ - S->fftLen = fftLen; - - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (q31_t *) twiddleCoef_4096_q31; - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of Instance structure depending on the FFT length */ - switch (S->fftLen) - { - /* Initializations of structure parameters for 4096 point FFT */ - case 4096u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - break; - - /* Initializations of structure parameters for 2048 point FFT */ - case 2048u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 2u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 2u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[1]; - break; - - /* Initializations of structure parameters for 1024 point FFT */ - case 1024u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 4u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 4u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - break; - - /* Initializations of structure parameters for 512 point FFT */ - case 512u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 8u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 8u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[7]; - break; - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - break; - - case 128u: - /* Initializations of structure parameters for 128 point FFT */ - S->twidCoefModifier = 32u; - S->bitRevFactor = 32u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[31]; - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - break; - - case 32u: - /* Initializations of structure parameters for 32 point FFT */ - S->twidCoefModifier = 128u; - S->bitRevFactor = 128u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[127]; - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - break; - - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c deleted file mode 100644 index ad05e1e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c +++ /dev/null @@ -1,742 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix2_q15.c -* -* Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -void arm_radix2_butterfly_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier); - -void arm_radix2_butterfly_inverse_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier); - -void arm_bitreversal_q15( - q15_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** - * @details - * @brief Processing function for the fixed-point CFFT/CIFFT. - * @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed - * @param[in] *S points to an instance of the fixed-point CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. - * @return none. - */ - -void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc) -{ - - if(S->ifftFlag == 1u) - { - arm_radix2_butterfly_inverse_q15(pSrc, S->fftLen, - S->pTwiddle, S->twidCoefModifier); - } - else - { - arm_radix2_butterfly_q15(pSrc, S->fftLen, - S->pTwiddle, S->twidCoefModifier); - } - - arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); -} - -/** - * @} end of ComplexFFT group - */ - -void arm_radix2_butterfly_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier) -{ -#ifndef ARM_MATH_CM0_FAMILY - - unsigned i, j, k, l; - unsigned n1, n2, ia; - q15_t in; - q31_t T, S, R; - q31_t coeff, out1, out2; - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (i = 0; i < n2; i++) - { - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - in = ((int16_t) (T & 0xFFFF)) >> 1; - T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - in = ((int16_t) (S & 0xFFFF)) >> 1; - S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(coeff, R) >> 16; - out2 = __SMUSDX(coeff, R); - -#else - - out1 = __SMUSDX(R, coeff) >> 16u; - out2 = __SMUAD(coeff, R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - i++; - l++; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - in = ((int16_t) (T & 0xFFFF)) >> 1; - T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - in = ((int16_t) (S & 0xFFFF)) >> 1; - S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(coeff, R) >> 16; - out2 = __SMUSDX(coeff, R); - -#else - - out1 = __SMUSDX(R, coeff) >> 16u; - out2 = __SMUAD(coeff, R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(coeff, R) >> 16; - out2 = __SMUSDX(coeff, R); - -#else - - out1 = __SMUSDX(R, coeff) >> 16u; - out2 = __SMUAD(coeff, R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - i += n1; - - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(coeff, R) >> 16; - out2 = __SMUSDX(coeff, R); - -#else - - out1 = __SMUSDX(R, coeff) >> 16u; - out2 = __SMUAD(coeff, R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = 0; i < fftLen; i += n1) - { - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S); - - _SIMD32_OFFSET(pSrc + (2u * l)) = R; - - i += n1; - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S); - - _SIMD32_OFFSET(pSrc + (2u * l)) = R; - - } // groups loop end - - -#else - - unsigned i, j, k, l; - unsigned n1, n2, ia; - q15_t xt, yt, cosVal, sinVal; - - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) + - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) - - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) + - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) - - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -} - - -void arm_radix2_butterfly_inverse_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pCoef, - uint16_t twidCoefModifier) -{ -#ifndef ARM_MATH_CM0_FAMILY - - unsigned i, j, k, l; - unsigned n1, n2, ia; - q15_t in; - q31_t T, S, R; - q31_t coeff, out1, out2; - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (i = 0; i < n2; i++) - { - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - in = ((int16_t) (T & 0xFFFF)) >> 1; - T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - in = ((int16_t) (S & 0xFFFF)) >> 1; - S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(coeff, R) >> 16; - out2 = __SMUADX(coeff, R); -#else - - out1 = __SMUADX(R, coeff) >> 16u; - out2 = __SMUSD(__QSUB(0, coeff), R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - i++; - l++; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - in = ((int16_t) (T & 0xFFFF)) >> 1; - T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - in = ((int16_t) (S & 0xFFFF)) >> 1; - S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(coeff, R) >> 16; - out2 = __SMUADX(coeff, R); -#else - - out1 = __SMUADX(R, coeff) >> 16u; - out2 = __SMUSD(__QSUB(0, coeff), R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(coeff, R) >> 16; - out2 = __SMUADX(coeff, R); - -#else - - out1 = __SMUADX(R, coeff) >> 16u; - out2 = __SMUSD(__QSUB(0, coeff), R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - i += n1; - - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S); - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(coeff, R) >> 16; - out2 = __SMUADX(coeff, R); -#else - - out1 = __SMUADX(R, coeff) >> 16u; - out2 = __SMUSD(__QSUB(0, coeff), R); - -#endif // #ifndef ARM_MATH_BIG_ENDIAN - - _SIMD32_OFFSET(pSrc + (2u * l)) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - coeff = _SIMD32_OFFSET(pCoef + (ia * 2u)); - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - - T = _SIMD32_OFFSET(pSrc + (2 * i)); - - S = _SIMD32_OFFSET(pSrc + (2 * l)); - - R = __QSUB16(T, S); - - _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S); - - _SIMD32_OFFSET(pSrc + (2u * l)) = R; - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - -#else - - - unsigned i, j, k, l; - unsigned n1, n2, ia; - q15_t xt, yt, cosVal, sinVal; - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) - - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) + - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u; - - pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) - - ((int16_t) (((q31_t) yt * sinVal) >> 16))); - - pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) + - ((int16_t) (((q31_t) xt * sinVal) >> 16))); - - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = 0; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - } // groups loop end - - -#endif // #ifndef ARM_MATH_CM0_FAMILY - -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c deleted file mode 100644 index e72408f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c +++ /dev/null @@ -1,351 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix2_q31.c -* -* Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -void arm_radix2_butterfly_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint16_t twidCoefModifier); - -void arm_radix2_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint16_t twidCoefModifier); - -void arm_bitreversal_q31( - q31_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - -/** -* @ingroup groupTransforms -*/ - -/** -* @addtogroup ComplexFFT -* @{ -*/ - -/** -* @details -* @brief Processing function for the fixed-point CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed -* @param[in] *S points to an instance of the fixed-point CFFT/CIFFT structure. -* @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @return none. -*/ - -void arm_cfft_radix2_q31( -const arm_cfft_radix2_instance_q31 * S, -q31_t * pSrc) -{ - - if(S->ifftFlag == 1u) - { - arm_radix2_butterfly_inverse_q31(pSrc, S->fftLen, - S->pTwiddle, S->twidCoefModifier); - } - else - { - arm_radix2_butterfly_q31(pSrc, S->fftLen, - S->pTwiddle, S->twidCoefModifier); - } - - arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); -} - -/** -* @} end of ComplexFFT group -*/ - -void arm_radix2_butterfly_q31( -q31_t * pSrc, -uint32_t fftLen, -q31_t * pCoef, -uint16_t twidCoefModifier) -{ - - unsigned i, j, k, l, m; - unsigned n1, n2, ia; - q31_t xt, yt, cosVal, sinVal; - q31_t p0, p1; - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (i = 0; i < n2; i++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - l = i + n2; - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multAcc_32x32_keep32_R(p0, yt, sinVal); - multSub_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0; - pSrc[2u * l + 1u] = p1; - - } // groups loop end - - twidCoefModifier <<= 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - i = j; - m = fftLen / n1; - do - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u; - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multAcc_32x32_keep32_R(p0, yt, sinVal); - multSub_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0; - pSrc[2u * l + 1u] = p1; - i += n1; - m--; - } while( m > 0); // butterfly loop end - - } // groups loop end - - twidCoefModifier <<= 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = 0; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - i += n1; - l = i + n2; - - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - } // butterfly loop end - -} - - -void arm_radix2_butterfly_inverse_q31( -q31_t * pSrc, -uint32_t fftLen, -q31_t * pCoef, -uint16_t twidCoefModifier) -{ - - unsigned i, j, k, l; - unsigned n1, n2, ia; - q31_t xt, yt, cosVal, sinVal; - q31_t p0, p1; - - //N = fftLen; - n2 = fftLen; - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (i = 0; i < n2; i++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - l = i + n2; - xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u); - pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u; - - yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u); - pSrc[2 * i + 1] = - ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u; - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multSub_32x32_keep32_R(p0, yt, sinVal); - multAcc_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0; - pSrc[2u * l + 1u] = p1; - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - - // loop for stage - for (k = fftLen / 2; k > 2; k = k >> 1) - { - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - // loop for groups - for (j = 0; j < n2; j++) - { - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = j; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u; - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u; - - mult_32x32_keep32_R(p0, xt, cosVal); - mult_32x32_keep32_R(p1, yt, cosVal); - multSub_32x32_keep32_R(p0, yt, sinVal); - multAcc_32x32_keep32_R(p1, xt, sinVal); - - pSrc[2u * l] = p0; - pSrc[2u * l + 1u] = p1; - } // butterfly loop end - - } // groups loop end - - twidCoefModifier = twidCoefModifier << 1u; - } // stages loop end - - n1 = n2; - n2 = n2 >> 1; - ia = 0; - - cosVal = pCoef[ia * 2]; - sinVal = pCoef[(ia * 2) + 1]; - ia = ia + twidCoefModifier; - - // loop for butterfly - for (i = 0; i < fftLen; i += n1) - { - l = i + n2; - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - i += n1; - l = i + n2; - - xt = pSrc[2 * i] - pSrc[2 * l]; - pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]); - - yt = pSrc[2 * i + 1] - pSrc[2 * l + 1]; - pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]); - - pSrc[2u * l] = xt; - - pSrc[2u * l + 1u] = yt; - - } // butterfly loop end - -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c deleted file mode 100644 index b0f0a94..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c +++ /dev/null @@ -1,1210 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_f32.c -* -* Description: Radix-4 Decimation in Frequency CFFT & CIFFT Floating point processing function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -extern void arm_bitreversal_f32( -float32_t * pSrc, -uint16_t fftSize, -uint16_t bitRevFactor, -uint16_t * pBitRevTab); - -/** -* @ingroup groupTransforms -*/ - -/* ---------------------------------------------------------------------- -** Internal helper function used by the FFTs -** ------------------------------------------------------------------- */ - -/* -* @brief Core function for the floating-point CFFT butterfly process. -* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. -* @param[in] fftLen length of the FFT. -* @param[in] *pCoef points to the twiddle coefficient buffer. -* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -*/ - -void arm_radix4_butterfly_f32( -float32_t * pSrc, -uint16_t fftLen, -float32_t * pCoef, -uint16_t twidCoefModifier) -{ - - float32_t co1, co2, co3, si1, si2, si3; - uint32_t ia1, ia2, ia3; - uint32_t i0, i1, i2, i3; - uint32_t n1, n2, j, k; - -#ifndef ARM_MATH_CM0_FAMILY_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; - float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, - Ybminusd; - float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; - float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; - float32_t *ptr1; - float32_t p0,p1,p2,p3,p4,p5; - float32_t a0,a1,a2,a3,a4,a5,a6,a7; - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - i0 = 0u; - ia1 = 0u; - - j = n2; - - /* Calculation of first stage */ - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - xaIn = pSrc[(2u * i0)]; - yaIn = pSrc[(2u * i0) + 1u]; - - xbIn = pSrc[(2u * i1)]; - ybIn = pSrc[(2u * i1) + 1u]; - - xcIn = pSrc[(2u * i2)]; - ycIn = pSrc[(2u * i2) + 1u]; - - xdIn = pSrc[(2u * i3)]; - ydIn = pSrc[(2u * i3) + 1u]; - - /* xa + xc */ - Xaplusc = xaIn + xcIn; - /* xb + xd */ - Xbplusd = xbIn + xdIn; - /* ya + yc */ - Yaplusc = yaIn + ycIn; - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - /* xb - xd */ - Xbminusd = xbIn - xdIn; - /* ya - yc */ - Yaminusc = yaIn - ycIn; - /* yb - yd */ - Ybminusd = ybIn - ydIn; - - /* xa' = xa + xb + xc + xd */ - pSrc[(2u * i0)] = Xaplusc + Xbplusd; - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; - - /* (xa - xc) + (yb - yd) */ - Xb12C_out = (Xaminusc + Ybminusd); - /* (ya - yc) + (xb - xd) */ - Yb12C_out = (Yaminusc - Xbminusd); - /* (xa + xc) - (xb + xd) */ - Xc12C_out = (Xaplusc - Xbplusd); - /* (ya + yc) - (yb + yd) */ - Yc12C_out = (Yaplusc - Ybplusd); - /* (xa - xc) - (yb - yd) */ - Xd12C_out = (Xaminusc - Ybminusd); - /* (ya - yc) + (xb - xd) */ - Yd12C_out = (Xbminusd + Yaminusc); - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* index calculation for the coefficients */ - ia3 = ia2 + ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - Xb12_out = Xb12C_out * co1; - Yb12_out = Yb12C_out * co1; - Xc12_out = Xc12C_out * co2; - Yc12_out = Yc12C_out * co2; - Xd12_out = Xd12C_out * co3; - Yd12_out = Yd12C_out * co3; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - //Xb12_out -= Yb12C_out * si1; - p0 = Yb12C_out * si1; - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - //Yb12_out += Xb12C_out * si1; - p1 = Xb12C_out * si1; - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - //Xc12_out -= Yc12C_out * si2; - p2 = Yc12C_out * si2; - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - //Yc12_out += Xc12C_out * si2; - p3 = Xc12C_out * si2; - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - //Xd12_out -= Yd12C_out * si3; - p4 = Yd12C_out * si3; - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - //Yd12_out += Xd12C_out * si3; - p5 = Xd12C_out * si3; - - Xb12_out += p0; - Yb12_out -= p1; - Xc12_out += p2; - Yc12_out -= p3; - Xd12_out += p4; - Yd12_out -= p5; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = Xc12_out; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = Yc12_out; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = Xb12_out; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = Yb12_out; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = Xd12_out; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = Yd12_out; - - /* Twiddle coefficients index modifier */ - ia1 += twidCoefModifier; - - /* Updating input index */ - i0++; - - } - while(--j); - - twidCoefModifier <<= 2u; - - /* Calculation of second stage to excluding last stage */ - for (k = fftLen >> 2u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* Calculation of first stage */ - j = 0; - do - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* Twiddle coefficients index modifier */ - ia1 += twidCoefModifier; - - i0 = j; - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - xaIn = pSrc[(2u * i0)]; - yaIn = pSrc[(2u * i0) + 1u]; - - xbIn = pSrc[(2u * i1)]; - ybIn = pSrc[(2u * i1) + 1u]; - - xcIn = pSrc[(2u * i2)]; - ycIn = pSrc[(2u * i2) + 1u]; - - xdIn = pSrc[(2u * i3)]; - ydIn = pSrc[(2u * i3) + 1u]; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - /* (xb - xd) */ - Xbminusd = xbIn - xdIn; - /* ya - yc */ - Yaminusc = yaIn - ycIn; - /* (yb - yd) */ - Ybminusd = ybIn - ydIn; - - /* xa + xc */ - Xaplusc = xaIn + xcIn; - /* xb + xd */ - Xbplusd = xbIn + xdIn; - /* ya + yc */ - Yaplusc = yaIn + ycIn; - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* (xa - xc) + (yb - yd) */ - Xb12C_out = (Xaminusc + Ybminusd); - /* (ya - yc) - (xb - xd) */ - Yb12C_out = (Yaminusc - Xbminusd); - /* xa + xc -(xb + xd) */ - Xc12C_out = (Xaplusc - Xbplusd); - /* (ya + yc) - (yb + yd) */ - Yc12C_out = (Yaplusc - Ybplusd); - /* (xa - xc) - (yb - yd) */ - Xd12C_out = (Xaminusc - Ybminusd); - /* (ya - yc) + (xb - xd) */ - Yd12C_out = (Xbminusd + Yaminusc); - - pSrc[(2u * i0)] = Xaplusc + Xbplusd; - pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; - - Xb12_out = Xb12C_out * co1; - Yb12_out = Yb12C_out * co1; - Xc12_out = Xc12C_out * co2; - Yc12_out = Yc12C_out * co2; - Xd12_out = Xd12C_out * co3; - Yd12_out = Yd12C_out * co3; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - //Xb12_out -= Yb12C_out * si1; - p0 = Yb12C_out * si1; - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - //Yb12_out += Xb12C_out * si1; - p1 = Xb12C_out * si1; - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - //Xc12_out -= Yc12C_out * si2; - p2 = Yc12C_out * si2; - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - //Yc12_out += Xc12C_out * si2; - p3 = Xc12C_out * si2; - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - //Xd12_out -= Yd12C_out * si3; - p4 = Yd12C_out * si3; - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - //Yd12_out += Xd12C_out * si3; - p5 = Xd12C_out * si3; - - Xb12_out += p0; - Yb12_out -= p1; - Xc12_out += p2; - Yc12_out -= p3; - Xd12_out += p4; - Yd12_out -= p5; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = Xc12_out; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = Yc12_out; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = Xb12_out; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = Yb12_out; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = Xd12_out; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = Yd12_out; - - i0 += n1; - } while(i0 < fftLen); - j++; - } while(j <= (n2 - 1u)); - twidCoefModifier <<= 2u; - } - - j = fftLen >> 2; - ptr1 = &pSrc[0]; - - /* Calculations of last stage */ - do - { - xaIn = ptr1[0]; - yaIn = ptr1[1]; - xbIn = ptr1[2]; - ybIn = ptr1[3]; - xcIn = ptr1[4]; - ycIn = ptr1[5]; - xdIn = ptr1[6]; - ydIn = ptr1[7]; - - /* xa + xc */ - Xaplusc = xaIn + xcIn; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - - /* ya + yc */ - Yaplusc = yaIn + ycIn; - - /* ya - yc */ - Yaminusc = yaIn - ycIn; - - /* xb + xd */ - Xbplusd = xbIn + xdIn; - - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* (xb-xd) */ - Xbminusd = xbIn - xdIn; - - /* (yb-yd) */ - Ybminusd = ybIn - ydIn; - - /* xa' = xa + xb + xc + xd */ - a0 = (Xaplusc + Xbplusd); - /* ya' = ya + yb + yc + yd */ - a1 = (Yaplusc + Ybplusd); - /* xc' = (xa-xb+xc-xd) */ - a2 = (Xaplusc - Xbplusd); - /* yc' = (ya-yb+yc-yd) */ - a3 = (Yaplusc - Ybplusd); - /* xb' = (xa+yb-xc-yd) */ - a4 = (Xaminusc + Ybminusd); - /* yb' = (ya-xb-yc+xd) */ - a5 = (Yaminusc - Xbminusd); - /* xd' = (xa-yb-xc+yd)) */ - a6 = (Xaminusc - Ybminusd); - /* yd' = (ya+xb-yc-xd) */ - a7 = (Xbminusd + Yaminusc); - - ptr1[0] = a0; - ptr1[1] = a1; - ptr1[2] = a2; - ptr1[3] = a3; - ptr1[4] = a4; - ptr1[5] = a5; - ptr1[6] = a6; - ptr1[7] = a7; - - /* increment pointer by 8 */ - ptr1 += 8u; - } while(--j); - -#else - - float32_t t1, t2, r1, r2, s1, s2; - - /* Run the below code for Cortex-M0 */ - - /* Initializations for the fft calculation */ - n2 = fftLen; - n1 = n2; - for (k = fftLen; k > 1u; k >>= 2u) - { - /* Initializations for the fft calculation */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* FFT Calculation */ - j = 0; - do - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - i0 = j; - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* xa + xc */ - r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)]; - - /* xa - xc */ - r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)]; - - /* ya + yc */ - s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; - - /* ya - yc */ - s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; - - /* xb + xd */ - t1 = pSrc[2u * i1] + pSrc[2u * i3]; - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = r1 + t1; - - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - - /* yb + yd */ - t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; - - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = s1 + t2; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; - - /* (xb - xd) */ - t2 = pSrc[2u * i1] - pSrc[2u * i3]; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (r1 * co2) + (s1 * si2); - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = (s1 * co2) - (r1 * si2); - - /* (xa - xc) + (yb - yd) */ - r1 = r2 + t1; - - /* (xa - xc) - (yb - yd) */ - r2 = r2 - t1; - - /* (ya - yc) - (xb - xd) */ - s1 = s2 - t2; - - /* (ya - yc) + (xb - xd) */ - s2 = s2 + t2; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (r1 * co1) + (s1 * si1); - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (s1 * co1) - (r1 * si1); - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = (r2 * co3) + (s2 * si3); - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (s2 * co3) - (r2 * si3); - - i0 += n1; - } while( i0 < fftLen); - j++; - } while(j <= (n2 - 1u)); - twidCoefModifier <<= 2u; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */ - -} - -/* -* @brief Core function for the floating-point CIFFT butterfly process. -* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. -* @param[in] fftLen length of the FFT. -* @param[in] *pCoef points to twiddle coefficient buffer. -* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @param[in] onebyfftLen value of 1/fftLen. -* @return none. -*/ - -void arm_radix4_butterfly_inverse_f32( -float32_t * pSrc, -uint16_t fftLen, -float32_t * pCoef, -uint16_t twidCoefModifier, -float32_t onebyfftLen) -{ - float32_t co1, co2, co3, si1, si2, si3; - uint32_t ia1, ia2, ia3; - uint32_t i0, i1, i2, i3; - uint32_t n1, n2, j, k; - -#ifndef ARM_MATH_CM0_FAMILY_FAMILY - - float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn; - float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc, - Ybminusd; - float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out; - float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out; - float32_t *ptr1; - float32_t p0,p1,p2,p3,p4,p5,p6,p7; - float32_t a0,a1,a2,a3,a4,a5,a6,a7; - - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - i0 = 0u; - ia1 = 0u; - - j = n2; - - /* Calculation of first stage */ - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Butterfly implementation */ - xaIn = pSrc[(2u * i0)]; - yaIn = pSrc[(2u * i0) + 1u]; - - xcIn = pSrc[(2u * i2)]; - ycIn = pSrc[(2u * i2) + 1u]; - - xbIn = pSrc[(2u * i1)]; - ybIn = pSrc[(2u * i1) + 1u]; - - xdIn = pSrc[(2u * i3)]; - ydIn = pSrc[(2u * i3) + 1u]; - - /* xa + xc */ - Xaplusc = xaIn + xcIn; - /* xb + xd */ - Xbplusd = xbIn + xdIn; - /* ya + yc */ - Yaplusc = yaIn + ycIn; - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - /* xb - xd */ - Xbminusd = xbIn - xdIn; - /* ya - yc */ - Yaminusc = yaIn - ycIn; - /* yb - yd */ - Ybminusd = ybIn - ydIn; - - /* xa' = xa + xb + xc + xd */ - pSrc[(2u * i0)] = Xaplusc + Xbplusd; - - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; - - /* (xa - xc) - (yb - yd) */ - Xb12C_out = (Xaminusc - Ybminusd); - /* (ya - yc) + (xb - xd) */ - Yb12C_out = (Yaminusc + Xbminusd); - /* (xa + xc) - (xb + xd) */ - Xc12C_out = (Xaplusc - Xbplusd); - /* (ya + yc) - (yb + yd) */ - Yc12C_out = (Yaplusc - Ybplusd); - /* (xa - xc) + (yb - yd) */ - Xd12C_out = (Xaminusc + Ybminusd); - /* (ya - yc) - (xb - xd) */ - Yd12C_out = (Yaminusc - Xbminusd); - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* index calculation for the coefficients */ - ia3 = ia2 + ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - Xb12_out = Xb12C_out * co1; - Yb12_out = Yb12C_out * co1; - Xc12_out = Xc12C_out * co2; - Yc12_out = Yc12C_out * co2; - Xd12_out = Xd12C_out * co3; - Yd12_out = Yd12C_out * co3; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - //Xb12_out -= Yb12C_out * si1; - p0 = Yb12C_out * si1; - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - //Yb12_out += Xb12C_out * si1; - p1 = Xb12C_out * si1; - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - //Xc12_out -= Yc12C_out * si2; - p2 = Yc12C_out * si2; - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - //Yc12_out += Xc12C_out * si2; - p3 = Xc12C_out * si2; - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - //Xd12_out -= Yd12C_out * si3; - p4 = Yd12C_out * si3; - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - //Yd12_out += Xd12C_out * si3; - p5 = Xd12C_out * si3; - - Xb12_out -= p0; - Yb12_out += p1; - Xc12_out -= p2; - Yc12_out += p3; - Xd12_out -= p4; - Yd12_out += p5; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = Xc12_out; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = Yc12_out; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = Xb12_out; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = Yb12_out; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = Xd12_out; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = Yd12_out; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - /* Updating input index */ - i0 = i0 + 1u; - - } while(--j); - - twidCoefModifier <<= 2u; - - /* Calculation of second stage to excluding last stage */ - for (k = fftLen >> 2u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* Calculation of first stage */ - j = 0; - do - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - i0 = j; - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - xaIn = pSrc[(2u * i0)]; - yaIn = pSrc[(2u * i0) + 1u]; - - xbIn = pSrc[(2u * i1)]; - ybIn = pSrc[(2u * i1) + 1u]; - - xcIn = pSrc[(2u * i2)]; - ycIn = pSrc[(2u * i2) + 1u]; - - xdIn = pSrc[(2u * i3)]; - ydIn = pSrc[(2u * i3) + 1u]; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - /* (xb - xd) */ - Xbminusd = xbIn - xdIn; - /* ya - yc */ - Yaminusc = yaIn - ycIn; - /* (yb - yd) */ - Ybminusd = ybIn - ydIn; - - /* xa + xc */ - Xaplusc = xaIn + xcIn; - /* xb + xd */ - Xbplusd = xbIn + xdIn; - /* ya + yc */ - Yaplusc = yaIn + ycIn; - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* (xa - xc) - (yb - yd) */ - Xb12C_out = (Xaminusc - Ybminusd); - /* (ya - yc) + (xb - xd) */ - Yb12C_out = (Yaminusc + Xbminusd); - /* xa + xc -(xb + xd) */ - Xc12C_out = (Xaplusc - Xbplusd); - /* (ya + yc) - (yb + yd) */ - Yc12C_out = (Yaplusc - Ybplusd); - /* (xa - xc) + (yb - yd) */ - Xd12C_out = (Xaminusc + Ybminusd); - /* (ya - yc) - (xb - xd) */ - Yd12C_out = (Yaminusc - Xbminusd); - - pSrc[(2u * i0)] = Xaplusc + Xbplusd; - pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd; - - Xb12_out = Xb12C_out * co1; - Yb12_out = Yb12C_out * co1; - Xc12_out = Xc12C_out * co2; - Yc12_out = Yc12C_out * co2; - Xd12_out = Xd12C_out * co3; - Yd12_out = Yd12C_out * co3; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - //Xb12_out -= Yb12C_out * si1; - p0 = Yb12C_out * si1; - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - //Yb12_out += Xb12C_out * si1; - p1 = Xb12C_out * si1; - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - //Xc12_out -= Yc12C_out * si2; - p2 = Yc12C_out * si2; - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - //Yc12_out += Xc12C_out * si2; - p3 = Xc12C_out * si2; - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - //Xd12_out -= Yd12C_out * si3; - p4 = Yd12C_out * si3; - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - //Yd12_out += Xd12C_out * si3; - p5 = Xd12C_out * si3; - - Xb12_out -= p0; - Yb12_out += p1; - Xc12_out -= p2; - Yc12_out += p3; - Xd12_out -= p4; - Yd12_out += p5; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = Xc12_out; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = Yc12_out; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = Xb12_out; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = Yb12_out; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = Xd12_out; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = Yd12_out; - - i0 += n1; - } while(i0 < fftLen); - j++; - } while(j <= (n2 - 1u)); - twidCoefModifier <<= 2u; - } - /* Initializations of last stage */ - - j = fftLen >> 2; - ptr1 = &pSrc[0]; - - /* Calculations of last stage */ - do - { - xaIn = ptr1[0]; - yaIn = ptr1[1]; - xbIn = ptr1[2]; - ybIn = ptr1[3]; - xcIn = ptr1[4]; - ycIn = ptr1[5]; - xdIn = ptr1[6]; - ydIn = ptr1[7]; - - /* Butterfly implementation */ - /* xa + xc */ - Xaplusc = xaIn + xcIn; - - /* xa - xc */ - Xaminusc = xaIn - xcIn; - - /* ya + yc */ - Yaplusc = yaIn + ycIn; - - /* ya - yc */ - Yaminusc = yaIn - ycIn; - - /* xb + xd */ - Xbplusd = xbIn + xdIn; - - /* yb + yd */ - Ybplusd = ybIn + ydIn; - - /* (xb-xd) */ - Xbminusd = xbIn - xdIn; - - /* (yb-yd) */ - Ybminusd = ybIn - ydIn; - - /* xa' = (xa+xb+xc+xd) * onebyfftLen */ - a0 = (Xaplusc + Xbplusd); - /* ya' = (ya+yb+yc+yd) * onebyfftLen */ - a1 = (Yaplusc + Ybplusd); - /* xc' = (xa-xb+xc-xd) * onebyfftLen */ - a2 = (Xaplusc - Xbplusd); - /* yc' = (ya-yb+yc-yd) * onebyfftLen */ - a3 = (Yaplusc - Ybplusd); - /* xb' = (xa-yb-xc+yd) * onebyfftLen */ - a4 = (Xaminusc - Ybminusd); - /* yb' = (ya+xb-yc-xd) * onebyfftLen */ - a5 = (Yaminusc + Xbminusd); - /* xd' = (xa-yb-xc+yd) * onebyfftLen */ - a6 = (Xaminusc + Ybminusd); - /* yd' = (ya-xb-yc+xd) * onebyfftLen */ - a7 = (Yaminusc - Xbminusd); - - p0 = a0 * onebyfftLen; - p1 = a1 * onebyfftLen; - p2 = a2 * onebyfftLen; - p3 = a3 * onebyfftLen; - p4 = a4 * onebyfftLen; - p5 = a5 * onebyfftLen; - p6 = a6 * onebyfftLen; - p7 = a7 * onebyfftLen; - - /* xa' = (xa+xb+xc+xd) * onebyfftLen */ - ptr1[0] = p0; - /* ya' = (ya+yb+yc+yd) * onebyfftLen */ - ptr1[1] = p1; - /* xc' = (xa-xb+xc-xd) * onebyfftLen */ - ptr1[2] = p2; - /* yc' = (ya-yb+yc-yd) * onebyfftLen */ - ptr1[3] = p3; - /* xb' = (xa-yb-xc+yd) * onebyfftLen */ - ptr1[4] = p4; - /* yb' = (ya+xb-yc-xd) * onebyfftLen */ - ptr1[5] = p5; - /* xd' = (xa-yb-xc+yd) * onebyfftLen */ - ptr1[6] = p6; - /* yd' = (ya-xb-yc+xd) * onebyfftLen */ - ptr1[7] = p7; - - /* increment source pointer by 8 for next calculations */ - ptr1 = ptr1 + 8u; - - } while(--j); - -#else - - float32_t t1, t2, r1, r2, s1, s2; - - /* Run the below code for Cortex-M0 */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* Calculation of first stage */ - for (k = fftLen; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* Calculation of first stage */ - j = 0; - do - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - i0 = j; - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* xa + xc */ - r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)]; - - /* xa - xc */ - r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)]; - - /* ya + yc */ - s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; - - /* ya - yc */ - s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; - - /* xb + xd */ - t1 = pSrc[2u * i1] + pSrc[2u * i3]; - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = r1 + t1; - - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - - /* yb + yd */ - t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; - - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = s1 + t2; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; - - /* (xb - xd) */ - t2 = pSrc[2u * i1] - pSrc[2u * i3]; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (r1 * co2) - (s1 * si2); - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = (s1 * co2) + (r1 * si2); - - /* (xa - xc) - (yb - yd) */ - r1 = r2 - t1; - - /* (xa - xc) + (yb - yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb - xd) */ - s1 = s2 + t2; - - /* (ya - yc) - (xb - xd) */ - s2 = s2 - t2; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (r1 * co1) - (s1 * si1); - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (s1 * co1) + (r1 * si1); - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = (r2 * co3) - (s2 * si3); - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (s2 * co3) + (r2 * si3); - - i0 += n1; - } while( i0 < fftLen); - j++; - } while(j <= (n2 - 1u)); - twidCoefModifier <<= 2u; - } - /* Initializations of last stage */ - n1 = n2; - n2 >>= 2u; - - /* Calculations of last stage */ - for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Butterfly implementation */ - /* xa + xc */ - r1 = pSrc[2u * i0] + pSrc[2u * i2]; - - /* xa - xc */ - r2 = pSrc[2u * i0] - pSrc[2u * i2]; - - /* ya + yc */ - s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; - - /* ya - yc */ - s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; - - /* xc + xd */ - t1 = pSrc[2u * i1] + pSrc[2u * i3]; - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = (r1 + t1) * onebyfftLen; - - /* (xa + xb) - (xc + xd) */ - r1 = r1 - t1; - - /* yb + yd */ - t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; - - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = (s1 + t2) * onebyfftLen; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb-yd) */ - t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; - - /* (xb-xd) */ - t2 = pSrc[2u * i1] - pSrc[2u * i3]; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = r1 * onebyfftLen; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = s1 * onebyfftLen; - - /* (xa - xc) - (yb-yd) */ - r1 = r2 - t1; - - /* (xa - xc) + (yb-yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb-xd) */ - s1 = s2 + t2; - - /* (ya - yc) - (xb-xd) */ - s2 = s2 - t2; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = r1 * onebyfftLen; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = s1 * onebyfftLen; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = r2 * onebyfftLen; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = s2 * onebyfftLen; - } - -#endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */ -} - -/** -* @addtogroup ComplexFFT -* @{ -*/ - -/** -* @details -* @brief Processing function for the floating-point Radix-4 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_f32 and will be removed -* in the future. -* @param[in] *S points to an instance of the floating-point Radix-4 CFFT/CIFFT structure. -* @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. -* @return none. -*/ - -void arm_cfft_radix4_f32( -const arm_cfft_radix4_instance_f32 * S, -float32_t * pSrc) -{ - - if(S->ifftFlag == 1u) - { - /* Complex IFFT radix-4 */ - arm_radix4_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier, S->onebyfftLen); - } - else - { - /* Complex FFT radix-4 */ - arm_radix4_butterfly_f32(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - - if(S->bitReverseFlag == 1u) - { - /* Bit Reversal */ - arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); - } - -} - -/** -* @} end of ComplexFFT group -*/ - diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c deleted file mode 100644 index 815c3d2..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c +++ /dev/null @@ -1,165 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_init_f32.c -* -* Description: Radix-4 Decimation in Frequency Floating-point CFFT & CIFFT Initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** -* @brief Initialization function for the floating-point CFFT/CIFFT. -* @deprecated Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed -* in the future. -* @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ - -arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialise the FFT length */ - S->fftLen = fftLen; - - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (float32_t *) twiddleCoef; - - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of structure parameters depending on the FFT length */ - switch (S->fftLen) - { - - case 4096u: - /* Initializations of structure parameters for 4096 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.000244140625; - break; - - case 1024u: - /* Initializations of structure parameters for 1024 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 4u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 4u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - /* Initialise the 1/fftLen Value */ - S->onebyfftLen = 0.0009765625f; - break; - - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - S->onebyfftLen = 0.00390625f; - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - S->onebyfftLen = 0.015625f; - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - S->onebyfftLen = 0.0625f; - break; - - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c deleted file mode 100644 index 791480e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c +++ /dev/null @@ -1,152 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_init_q15.c -* -* Description: Radix-4 Decimation in Frequency Q15 FFT & IFFT initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - - -/** - * @addtogroup ComplexFFT - * @{ - */ - - -/** -* @brief Initialization function for the Q15 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed -* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ - -arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - /* Initialise the FFT length */ - S->fftLen = fftLen; - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (q15_t *) twiddleCoef_4096_q15; - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of structure parameters depending on the FFT length */ - switch (S->fftLen) - { - case 4096u: - /* Initializations of structure parameters for 4096 point FFT */ - - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - - break; - - case 1024u: - /* Initializations of structure parameters for 1024 point FFT */ - S->twidCoefModifier = 4u; - S->bitRevFactor = 4u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - - break; - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - - break; - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c deleted file mode 100644 index 9674f6e..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c +++ /dev/null @@ -1,148 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_init_q31.c -* -* Description: Radix-4 Decimation in Frequency Q31 FFT & IFFT initialization function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** -* -* @brief Initialization function for the Q31 CFFT/CIFFT. -* @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed -* @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. -* @param[in] fftLen length of the FFT. -* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter ifftFlag controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlag for calculation of CIFFT otherwise CFFT is calculated -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* The parameter fftLen Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ - -arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - /* Initialise the FFT length */ - S->fftLen = fftLen; - /* Initialise the Twiddle coefficient pointer */ - S->pTwiddle = (q31_t *) twiddleCoef_4096_q31; - /* Initialise the Flag for selection of CFFT or CIFFT */ - S->ifftFlag = ifftFlag; - /* Initialise the Flag for calculation Bit reversal or not */ - S->bitReverseFlag = bitReverseFlag; - - /* Initializations of Instance structure depending on the FFT length */ - switch (S->fftLen) - { - /* Initializations of structure parameters for 4096 point FFT */ - case 4096u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 1u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 1u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) armBitRevTable; - break; - - /* Initializations of structure parameters for 1024 point FFT */ - case 1024u: - /* Initialise the twiddle coef modifier value */ - S->twidCoefModifier = 4u; - /* Initialise the bit reversal table modifier */ - S->bitRevFactor = 4u; - /* Initialise the bit reversal table pointer */ - S->pBitRevTable = (uint16_t *) & armBitRevTable[3]; - break; - - case 256u: - /* Initializations of structure parameters for 256 point FFT */ - S->twidCoefModifier = 16u; - S->bitRevFactor = 16u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[15]; - break; - - case 64u: - /* Initializations of structure parameters for 64 point FFT */ - S->twidCoefModifier = 64u; - S->bitRevFactor = 64u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[63]; - break; - - case 16u: - /* Initializations of structure parameters for 16 point FFT */ - S->twidCoefModifier = 256u; - S->bitRevFactor = 256u; - S->pBitRevTable = (uint16_t *) & armBitRevTable[255]; - break; - - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of ComplexFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c deleted file mode 100644 index 1d1484d..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c +++ /dev/null @@ -1,1924 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_q15.c -* -* Description: This file has function definition of Radix-4 FFT & IFFT function and -* In-place bit reversal using bit reversal table -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - - -void arm_radix4_butterfly_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier); - -void arm_radix4_butterfly_inverse_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier); - -void arm_bitreversal_q15( - q15_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - - -/** - * @details - * @brief Processing function for the Q15 CFFT/CIFFT. - * @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed - * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - * - * \par Input and output formats: - * \par - * Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. - * Hence the output format is different for different FFT sizes. - * The input and output formats for different FFT sizes and number of bits to upscale are mentioned in the tables below for CFFT and CIFFT: - * \par - * \image html CFFTQ15.gif "Input and Output Formats for Q15 CFFT" - * \image html CIFFTQ15.gif "Input and Output Formats for Q15 CIFFT" - */ - -void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc) -{ - if(S->ifftFlag == 1u) - { - /* Complex IFFT radix-4 */ - arm_radix4_butterfly_inverse_q15(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - else - { - /* Complex FFT radix-4 */ - arm_radix4_butterfly_q15(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - - if(S->bitReverseFlag == 1u) - { - /* Bit Reversal */ - arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); - } - -} - -/** - * @} end of ComplexFFT group - */ - -/* -* Radix-4 FFT algorithm used is : -* -* Input real and imaginary data: -* x(n) = xa + j * ya -* x(n+N/4 ) = xb + j * yb -* x(n+N/2 ) = xc + j * yc -* x(n+3N 4) = xd + j * yd -* -* -* Output real and imaginary data: -* x(4r) = xa'+ j * ya' -* x(4r+1) = xb'+ j * yb' -* x(4r+2) = xc'+ j * yc' -* x(4r+3) = xd'+ j * yd' -* -* -* Twiddle factors for radix-4 FFT: -* Wn = co1 + j * (- si1) -* W2n = co2 + j * (- si2) -* W3n = co3 + j * (- si3) - -* The real and imaginary output values for the radix-4 butterfly are -* xa' = xa + xb + xc + xd -* ya' = ya + yb + yc + yd -* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) -* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) -* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) -* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) -* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) -* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) -* -*/ - -/** - * @brief Core function for the Q15 CFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - -void arm_radix4_butterfly_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier) -{ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t R, S, T, U; - q31_t C1, C2, C3, out1, out2; - uint32_t n1, n2, ic, i0, j, k; - - q15_t *ptr1; - q15_t *pSi0; - q15_t *pSi1; - q15_t *pSi2; - q15_t *pSi3; - - q31_t xaya, xbyb, xcyc, xdyd; - - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - - /* Index for twiddle coefficient */ - ic = 0u; - - /* Index for input read and output write */ - j = n2; - - pSi0 = pSrc16; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - /* Input is in 1.15(q15) format */ - - /* start of first stage process */ - do - { - /* Butterfly implementation */ - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T = _SIMD32_OFFSET(pSi0); - T = __SHADD16(T, 0); // this is just a SIMD arithmetic shift right by 1 - T = __SHADD16(T, 0); // it turns out doing this twice is 2 cycles, the alternative takes 3 cycles - //in = ((int16_t) (T & 0xFFFF)) >> 2; // alternative code that takes 3 cycles - //T = ((T >> 2) & 0xFFFF0000) | (in & 0xFFFF); - - /* Read yc (real), xc(imag) input */ - S = _SIMD32_OFFSET(pSi2); - S = __SHADD16(S, 0); - S = __SHADD16(S, 0); - - /* R = packed((ya + yc), (xa + xc) ) */ - R = __QADD16(T, S); - - /* S = packed((ya - yc), (xa - xc) ) */ - S = __QSUB16(T, S); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - T = __SHADD16(T, 0); - T = __SHADD16(T, 0); - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - U = __SHADD16(U, 0); - U = __SHADD16(U, 0); - - /* T = packed((yb + yd), (xb + xd) ) */ - T = __QADD16(T, U); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - _SIMD32_OFFSET(pSi0) = __SHADD16(R, T); - pSi0 += 2; - - /* R = packed((ya + yc) - (yb + yd), (xa + xc)- (xb + xd)) */ - R = __QSUB16(R, T); - - /* co2 & si2 are read from SIMD Coefficient pointer */ - C2 = _SIMD32_OFFSET(pCoef16 + (4u * ic)); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - out1 = __SMUAD(C2, R) >> 16u; - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = __SMUSDX(C2, R); - -#else - - /* xc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out1 = __SMUSDX(R, C2) >> 16u; - /* yc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - out2 = __SMUAD(C2, R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Reading i0+fftLen/4 */ - /* T = packed(yb, xb) */ - T = _SIMD32_OFFSET(pSi1); - T = __SHADD16(T, 0); - T = __SHADD16(T, 0); - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* writing output(xc', yc') in little endian format */ - _SIMD32_OFFSET(pSi1) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi1 += 2; - - /* Butterfly calculations */ - /* U = packed(yd, xd) */ - U = _SIMD32_OFFSET(pSi3); - U = __SHADD16(U, 0); - U = __SHADD16(U, 0); - - /* T = packed(yb-yd, xb-xd) */ - T = __QSUB16(T, U); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __QASX(S, T); - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __QSAX(S, T); - -#else - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __QSAX(S, T); - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __QASX(S, T); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* co1 & si1 are read from SIMD Coefficient pointer */ - C1 = _SIMD32_OFFSET(pCoef16 + (2u * ic)); - /* Butterfly process for the i0+fftLen/2 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - out1 = __SMUAD(C1, S) >> 16u; - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - out2 = __SMUSDX(C1, S); - -#else - - /* xb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - out1 = __SMUSDX(S, C1) >> 16u; - /* yb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - out2 = __SMUAD(C1, S); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* writing output(xb', yb') in little endian format */ - _SIMD32_OFFSET(pSi2) = - ((out2) & 0xFFFF0000) | ((out1) & 0x0000FFFF); - pSi2 += 2; - - - /* co3 & si3 are read from SIMD Coefficient pointer */ - C3 = _SIMD32_OFFSET(pCoef16 + (6u * ic)); - /* Butterfly process for the i0+3fftLen/4 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - out1 = __SMUAD(C3, R) >> 16u; - /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - out2 = __SMUSDX(C3, R); - -#else - - /* xd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - out1 = __SMUSDX(R, C3) >> 16u; - /* yd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - out2 = __SMUAD(C3, R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* writing output(xd', yd') in little endian format */ - _SIMD32_OFFSET(pSi3) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi3 += 2; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - } while(--j); - /* data is in 4.11(q11) format */ - - /* end of first stage process */ - - - /* start of middle stage process */ - - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - - /* Calculation of Middle stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the middle stage */ - n1 = n2; - n2 >>= 2u; - ic = 0u; - - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - C1 = _SIMD32_OFFSET(pCoef16 + (2u * ic)); - C2 = _SIMD32_OFFSET(pCoef16 + (4u * ic)); - C3 = _SIMD32_OFFSET(pCoef16 + (6u * ic)); - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - pSi0 = pSrc16 + 2 * j; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - /* Butterfly implementation */ - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T = _SIMD32_OFFSET(pSi0); - - /* Read yc (real), xc(imag) input */ - S = _SIMD32_OFFSET(pSi2); - - /* R = packed( (ya + yc), (xa + xc)) */ - R = __QADD16(T, S); - - /* S = packed((ya - yc), (xa - xc)) */ - S = __QSUB16(T, S); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - - /* T = packed( (yb + yd), (xb + xd)) */ - T = __QADD16(T, U); - - /* writing the butterfly processed i0 sample */ - - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - out1 = __SHADD16(R, T); - out1 = __SHADD16(out1, 0); - _SIMD32_OFFSET(pSi0) = out1; - pSi0 += 2 * n1; - - /* R = packed( (ya + yc) - (yb + yd), (xa + xc) - (xb + xd)) */ - R = __SHSUB16(R, T); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ - out1 = __SMUAD(C2, R) >> 16u; - - /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = __SMUSDX(C2, R); - -#else - - /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out1 = __SMUSDX(R, C2) >> 16u; - - /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ - out2 = __SMUAD(C2, R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Reading i0+3fftLen/4 */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - _SIMD32_OFFSET(pSi1) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi1 += 2 * n1; - - /* Butterfly calculations */ - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - - /* T = packed(yb-yd, xb-xd) */ - T = __QSUB16(T, U); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __SHASX(S, T); - - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __SHSAX(S, T); - - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = __SMUAD(C1, S) >> 16u; - out2 = __SMUSDX(C1, S); - -#else - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __SHSAX(S, T); - - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __SHASX(S, T); - - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = __SMUSDX(S, C1) >> 16u; - out2 = __SMUAD(C1, S); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - _SIMD32_OFFSET(pSi2) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi2 += 2 * n1; - - /* Butterfly process for the i0+3fftLen/4 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUAD(C3, R) >> 16u; - out2 = __SMUSDX(C3, R); - -#else - - out1 = __SMUSDX(R, C3) >> 16u; - out2 = __SMUAD(C3, R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - _SIMD32_OFFSET(pSi3) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi3 += 2 * n1; - } - } - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - } - /* end of middle stage process */ - - - /* data is in 10.6(q6) format for the 1024 point */ - /* data is in 8.8(q8) format for the 256 point */ - /* data is in 6.10(q10) format for the 64 point */ - /* data is in 4.12(q12) format for the 16 point */ - - /* Initializations for the last stage */ - j = fftLen >> 2; - - ptr1 = &pSrc16[0]; - - /* start of last stage process */ - - /* Butterfly implementation */ - do - { - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD32(ptr1)++; - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD32(ptr1)++; - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD32(ptr1)++; - - /* Read xd (real), yd(imag) input */ - xdyd = *__SIMD32(ptr1)++; - - /* R = packed((ya + yc), (xa + xc)) */ - R = __QADD16(xaya, xcyc); - - /* T = packed((yb + yd), (xb + xd)) */ - T = __QADD16(xbyb, xdyd); - - /* pointer updation for writing */ - ptr1 = ptr1 - 8u; - - - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - *__SIMD32(ptr1)++ = __SHADD16(R, T); - - /* T = packed((yb + yd), (xb + xd)) */ - T = __QADD16(xbyb, xdyd); - - /* xc' = (xa-xb+xc-xd) */ - /* yc' = (ya-yb+yc-yd) */ - *__SIMD32(ptr1)++ = __SHSUB16(R, T); - - /* S = packed((ya - yc), (xa - xc)) */ - S = __QSUB16(xaya, xcyc); - - /* Read yd (real), xd(imag) input */ - /* T = packed( (yb - yd), (xb - xd)) */ - U = __QSUB16(xbyb, xdyd); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xb' = (xa+yb-xc-yd) */ - /* yb' = (ya-xb-yc+xd) */ - *__SIMD32(ptr1)++ = __SHSAX(S, U); - - - /* xd' = (xa-yb-xc+yd) */ - /* yd' = (ya+xb-yc-xd) */ - *__SIMD32(ptr1)++ = __SHASX(S, U); - -#else - - /* xb' = (xa+yb-xc-yd) */ - /* yb' = (ya-xb-yc+xd) */ - *__SIMD32(ptr1)++ = __SHASX(S, U); - - - /* xd' = (xa-yb-xc+yd) */ - /* yd' = (ya+xb-yc-xd) */ - *__SIMD32(ptr1)++ = __SHSAX(S, U); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - } while(--j); - - /* end of last stage process */ - - /* output is in 11.5(q5) format for the 1024 point */ - /* output is in 9.7(q7) format for the 256 point */ - /* output is in 7.9(q9) format for the 64 point */ - /* output is in 5.11(q11) format for the 16 point */ - - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t R0, R1, S0, S1, T0, T1, U0, U1; - q15_t Co1, Si1, Co2, Si2, Co3, Si3, out1, out2; - uint32_t n1, n2, ic, i0, i1, i2, i3, j, k; - - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - - /* Index for twiddle coefficient */ - ic = 0u; - - /* Index for input read and output write */ - i0 = 0u; - j = n2; - - /* Input is in 1.15(q15) format */ - - /* start of first stage process */ - do - { - /* Butterfly implementation */ - - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - - /* input is down scale by 4 to avoid overflow */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u] >> 2u; - T1 = pSrc16[(i0 * 2u) + 1u] >> 2u; - - /* input is down scale by 4 to avoid overflow */ - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u] >> 2u; - S1 = pSrc16[(i2 * 2u) + 1u] >> 2u; - - /* R0 = (ya + yc) */ - R0 = __SSAT(T0 + S0, 16u); - /* R1 = (xa + xc) */ - R1 = __SSAT(T1 + S1, 16u); - - /* S0 = (ya - yc) */ - S0 = __SSAT(T0 - S0, 16); - /* S1 = (xa - xc) */ - S1 = __SSAT(T1 - S1, 16); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* input is down scale by 4 to avoid overflow */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u] >> 2u; - T1 = pSrc16[(i1 * 2u) + 1u] >> 2u; - - /* input is down scale by 4 to avoid overflow */ - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u] >> 2u; - U1 = pSrc16[(i3 * 2u) + 1] >> 2u; - - /* T0 = (yb + yd) */ - T0 = __SSAT(T0 + U0, 16u); - /* T1 = (xb + xd) */ - T1 = __SSAT(T1 + U1, 16u); - - /* writing the butterfly processed i0 sample */ - /* ya' = ya + yb + yc + yd */ - /* xa' = xa + xb + xc + xd */ - pSrc16[i0 * 2u] = (R0 >> 1u) + (T0 >> 1u); - pSrc16[(i0 * 2u) + 1u] = (R1 >> 1u) + (T1 >> 1u); - - /* R0 = (ya + yc) - (yb + yd) */ - /* R1 = (xa + xc) - (xb + xd) */ - R0 = __SSAT(R0 - T0, 16u); - R1 = __SSAT(R1 - T1, 16u); - - /* co2 & si2 are read from Coefficient pointer */ - Co2 = pCoef16[2u * ic * 2u]; - Si2 = pCoef16[(2u * ic * 2u) + 1]; - - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - out1 = (q15_t) ((Co2 * R0 + Si2 * R1) >> 16u); - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = (q15_t) ((-Si2 * R0 + Co2 * R1) >> 16u); - - /* Reading i0+fftLen/4 */ - /* input is down scale by 4 to avoid overflow */ - /* T0 = yb, T1 = xb */ - T0 = pSrc16[i1 * 2u] >> 2; - T1 = pSrc16[(i1 * 2u) + 1] >> 2; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* writing output(xc', yc') in little endian format */ - pSrc16[i1 * 2u] = out1; - pSrc16[(i1 * 2u) + 1] = out2; - - /* Butterfly calculations */ - /* input is down scale by 4 to avoid overflow */ - /* U0 = yd, U1 = xd */ - U0 = pSrc16[i3 * 2u] >> 2; - U1 = pSrc16[(i3 * 2u) + 1] >> 2; - /* T0 = yb-yd */ - T0 = __SSAT(T0 - U0, 16); - /* T1 = xb-xd */ - T1 = __SSAT(T1 - U1, 16); - - /* R1 = (ya-yc) + (xb- xd), R0 = (xa-xc) - (yb-yd)) */ - R0 = (q15_t) __SSAT((q31_t) (S0 - T1), 16); - R1 = (q15_t) __SSAT((q31_t) (S1 + T0), 16); - - /* S1 = (ya-yc) - (xb- xd), S0 = (xa-xc) + (yb-yd)) */ - S0 = (q15_t) __SSAT(((q31_t) S0 + T1), 16u); - S1 = (q15_t) __SSAT(((q31_t) S1 - T0), 16u); - - /* co1 & si1 are read from Coefficient pointer */ - Co1 = pCoef16[ic * 2u]; - Si1 = pCoef16[(ic * 2u) + 1]; - /* Butterfly process for the i0+fftLen/2 sample */ - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - out1 = (q15_t) ((Si1 * S1 + Co1 * S0) >> 16); - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - out2 = (q15_t) ((-Si1 * S0 + Co1 * S1) >> 16); - - /* writing output(xb', yb') in little endian format */ - pSrc16[i2 * 2u] = out1; - pSrc16[(i2 * 2u) + 1] = out2; - - /* Co3 & si3 are read from Coefficient pointer */ - Co3 = pCoef16[3u * (ic * 2u)]; - Si3 = pCoef16[(3u * (ic * 2u)) + 1]; - /* Butterfly process for the i0+3fftLen/4 sample */ - /* xd' = (xa-yb-xc+yd)* Co3 + (ya+xb-yc-xd)* (si3) */ - out1 = (q15_t) ((Si3 * R1 + Co3 * R0) >> 16u); - /* yd' = (ya+xb-yc-xd)* Co3 - (xa-yb-xc+yd)* (si3) */ - out2 = (q15_t) ((-Si3 * R0 + Co3 * R1) >> 16u); - /* writing output(xd', yd') in little endian format */ - pSrc16[i3 * 2u] = out1; - pSrc16[(i3 * 2u) + 1] = out2; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - /* Updating input index */ - i0 = i0 + 1u; - - } while(--j); - /* data is in 4.11(q11) format */ - - /* end of first stage process */ - - - /* start of middle stage process */ - - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - - /* Calculation of Middle stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the middle stage */ - n1 = n2; - n2 >>= 2u; - ic = 0u; - - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - Co1 = pCoef16[ic * 2u]; - Si1 = pCoef16[(ic * 2u) + 1u]; - Co2 = pCoef16[2u * (ic * 2u)]; - Si2 = pCoef16[(2u * (ic * 2u)) + 1u]; - Co3 = pCoef16[3u * (ic * 2u)]; - Si3 = pCoef16[(3u * (ic * 2u)) + 1u]; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - /* Butterfly implementation */ - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u]; - T1 = pSrc16[(i0 * 2u) + 1u]; - - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u]; - S1 = pSrc16[(i2 * 2u) + 1u]; - - /* R0 = (ya + yc), R1 = (xa + xc) */ - R0 = __SSAT(T0 + S0, 16); - R1 = __SSAT(T1 + S1, 16); - - /* S0 = (ya - yc), S1 =(xa - xc) */ - S0 = __SSAT(T0 - S0, 16); - S1 = __SSAT(T1 - S1, 16); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - - /* T0 = (yb + yd), T1 = (xb + xd) */ - T0 = __SSAT(T0 + U0, 16); - T1 = __SSAT(T1 + U1, 16); - - /* writing the butterfly processed i0 sample */ - - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - out1 = ((R0 >> 1u) + (T0 >> 1u)) >> 1u; - out2 = ((R1 >> 1u) + (T1 >> 1u)) >> 1u; - - pSrc16[i0 * 2u] = out1; - pSrc16[(2u * i0) + 1u] = out2; - - /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ - R0 = (R0 >> 1u) - (T0 >> 1u); - R1 = (R1 >> 1u) - (T1 >> 1u); - - /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ - out1 = (q15_t) ((Co2 * R0 + Si2 * R1) >> 16u); - - /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = (q15_t) ((-Si2 * R0 + Co2 * R1) >> 16u); - - /* Reading i0+3fftLen/4 */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - pSrc16[i1 * 2u] = out1; - pSrc16[(i1 * 2u) + 1u] = out2; - - /* Butterfly calculations */ - - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - /* T0 = yb-yd, T1 = xb-xd */ - T0 = __SSAT(T0 - U0, 16); - T1 = __SSAT(T1 - U1, 16); - - /* R0 = (ya-yc) + (xb- xd), R1 = (xa-xc) - (yb-yd)) */ - R0 = (S0 >> 1u) - (T1 >> 1u); - R1 = (S1 >> 1u) + (T0 >> 1u); - - /* S0 = (ya-yc) - (xb- xd), S1 = (xa-xc) + (yb-yd)) */ - S0 = (S0 >> 1u) + (T1 >> 1u); - S1 = (S1 >> 1u) - (T0 >> 1u); - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = (q15_t) ((Co1 * S0 + Si1 * S1) >> 16u); - - out2 = (q15_t) ((-Si1 * S0 + Co1 * S1) >> 16u); - - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - pSrc16[i2 * 2u] = out1; - pSrc16[(i2 * 2u) + 1u] = out2; - - /* Butterfly process for the i0+3fftLen/4 sample */ - out1 = (q15_t) ((Si3 * R1 + Co3 * R0) >> 16u); - - out2 = (q15_t) ((-Si3 * R0 + Co3 * R1) >> 16u); - /* xd' = (xa-yb-xc+yd)* Co3 + (ya+xb-yc-xd)* (si3) */ - /* yd' = (ya+xb-yc-xd)* Co3 - (xa-yb-xc+yd)* (si3) */ - pSrc16[i3 * 2u] = out1; - pSrc16[(i3 * 2u) + 1u] = out2; - } - } - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - } - /* end of middle stage process */ - - - /* data is in 10.6(q6) format for the 1024 point */ - /* data is in 8.8(q8) format for the 256 point */ - /* data is in 6.10(q10) format for the 64 point */ - /* data is in 4.12(q12) format for the 16 point */ - - /* Initializations for the last stage */ - n1 = n2; - n2 >>= 2u; - - /* start of last stage process */ - - /* Butterfly implementation */ - for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u]; - T1 = pSrc16[(i0 * 2u) + 1u]; - - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u]; - S1 = pSrc16[(i2 * 2u) + 1u]; - - /* R0 = (ya + yc), R1 = (xa + xc) */ - R0 = __SSAT(T0 + S0, 16u); - R1 = __SSAT(T1 + S1, 16u); - - /* S0 = (ya - yc), S1 = (xa - xc) */ - S0 = __SSAT(T0 - S0, 16u); - S1 = __SSAT(T1 - S1, 16u); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - /* T0 = (yb + yd), T1 = (xb + xd)) */ - T0 = __SSAT(T0 + U0, 16u); - T1 = __SSAT(T1 + U1, 16u); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - pSrc16[i0 * 2u] = (R0 >> 1u) + (T0 >> 1u); - pSrc16[(i0 * 2u) + 1u] = (R1 >> 1u) + (T1 >> 1u); - - /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ - R0 = (R0 >> 1u) - (T0 >> 1u); - R1 = (R1 >> 1u) - (T1 >> 1u); - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd) */ - /* yc' = (ya-yb+yc-yd) */ - pSrc16[i1 * 2u] = R0; - pSrc16[(i1 * 2u) + 1u] = R1; - - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - /* T0 = (yb - yd), T1 = (xb - xd) */ - T0 = __SSAT(T0 - U0, 16u); - T1 = __SSAT(T1 - U1, 16u); - - /* writing the butterfly processed i0 + fftLen/2 sample */ - /* xb' = (xa+yb-xc-yd) */ - /* yb' = (ya-xb-yc+xd) */ - pSrc16[i2 * 2u] = (S0 >> 1u) + (T1 >> 1u); - pSrc16[(i2 * 2u) + 1u] = (S1 >> 1u) - (T0 >> 1u); - - /* writing the butterfly processed i0 + 3fftLen/4 sample */ - /* xd' = (xa-yb-xc+yd) */ - /* yd' = (ya+xb-yc-xd) */ - pSrc16[i3 * 2u] = (S0 >> 1u) - (T1 >> 1u); - pSrc16[(i3 * 2u) + 1u] = (S1 >> 1u) + (T0 >> 1u); - - } - - /* end of last stage process */ - - /* output is in 11.5(q5) format for the 1024 point */ - /* output is in 9.7(q7) format for the 256 point */ - /* output is in 7.9(q9) format for the 64 point */ - /* output is in 5.11(q11) format for the 16 point */ - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - - -/** - * @brief Core function for the Q15 CIFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - -/* -* Radix-4 IFFT algorithm used is : -* -* CIFFT uses same twiddle coefficients as CFFT function -* x[k] = x[n] + (j)k * x[n + fftLen/4] + (-1)k * x[n+fftLen/2] + (-j)k * x[n+3*fftLen/4] -* -* -* IFFT is implemented with following changes in equations from FFT -* -* Input real and imaginary data: -* x(n) = xa + j * ya -* x(n+N/4 ) = xb + j * yb -* x(n+N/2 ) = xc + j * yc -* x(n+3N 4) = xd + j * yd -* -* -* Output real and imaginary data: -* x(4r) = xa'+ j * ya' -* x(4r+1) = xb'+ j * yb' -* x(4r+2) = xc'+ j * yc' -* x(4r+3) = xd'+ j * yd' -* -* -* Twiddle factors for radix-4 IFFT: -* Wn = co1 + j * (si1) -* W2n = co2 + j * (si2) -* W3n = co3 + j * (si3) - -* The real and imaginary output values for the radix-4 butterfly are -* xa' = xa + xb + xc + xd -* ya' = ya + yb + yc + yd -* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) -* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) -* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) -* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) -* xd' = (xa+yb-xc-yd)* co3 - (ya-xb-yc+xd)* (si3) -* yd' = (ya-xb-yc+xd)* co3 + (xa+yb-xc-yd)* (si3) -* -*/ - -void arm_radix4_butterfly_inverse_q15( - q15_t * pSrc16, - uint32_t fftLen, - q15_t * pCoef16, - uint32_t twidCoefModifier) -{ - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - q31_t R, S, T, U; - q31_t C1, C2, C3, out1, out2; - uint32_t n1, n2, ic, i0, j, k; - - q15_t *ptr1; - q15_t *pSi0; - q15_t *pSi1; - q15_t *pSi2; - q15_t *pSi3; - - q31_t xaya, xbyb, xcyc, xdyd; - - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - - /* Index for twiddle coefficient */ - ic = 0u; - - /* Index for input read and output write */ - j = n2; - - pSi0 = pSrc16; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - /* Input is in 1.15(q15) format */ - - /* start of first stage process */ - do - { - /* Butterfly implementation */ - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T = _SIMD32_OFFSET(pSi0); - T = __SHADD16(T, 0); - T = __SHADD16(T, 0); - - /* Read yc (real), xc(imag) input */ - S = _SIMD32_OFFSET(pSi2); - S = __SHADD16(S, 0); - S = __SHADD16(S, 0); - - /* R = packed((ya + yc), (xa + xc) ) */ - R = __QADD16(T, S); - - /* S = packed((ya - yc), (xa - xc) ) */ - S = __QSUB16(T, S); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - T = __SHADD16(T, 0); - T = __SHADD16(T, 0); - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - U = __SHADD16(U, 0); - U = __SHADD16(U, 0); - - /* T = packed((yb + yd), (xb + xd) ) */ - T = __QADD16(T, U); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - _SIMD32_OFFSET(pSi0) = __SHADD16(R, T); - pSi0 += 2; - - /* R = packed((ya + yc) - (yb + yd), (xa + xc)- (xb + xd)) */ - R = __QSUB16(R, T); - - /* co2 & si2 are read from SIMD Coefficient pointer */ - C2 = _SIMD32_OFFSET(pCoef16 + (4u * ic)); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - out1 = __SMUSD(C2, R) >> 16u; - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = __SMUADX(C2, R); - -#else - - /* xc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out1 = __SMUADX(C2, R) >> 16u; - /* yc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - out2 = __SMUSD(__QSUB16(0, C2), R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Reading i0+fftLen/4 */ - /* T = packed(yb, xb) */ - T = _SIMD32_OFFSET(pSi1); - T = __SHADD16(T, 0); - T = __SHADD16(T, 0); - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* writing output(xc', yc') in little endian format */ - _SIMD32_OFFSET(pSi1) = - (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi1 += 2; - - /* Butterfly calculations */ - /* U = packed(yd, xd) */ - U = _SIMD32_OFFSET(pSi3); - U = __SHADD16(U, 0); - U = __SHADD16(U, 0); - - /* T = packed(yb-yd, xb-xd) */ - T = __QSUB16(T, U); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __QSAX(S, T); - /* S = packed((ya-yc) + (xb- xd), (xa-xc) - (yb-yd)) */ - S = __QASX(S, T); - -#else - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __QASX(S, T); - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __QSAX(S, T); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* co1 & si1 are read from SIMD Coefficient pointer */ - C1 = _SIMD32_OFFSET(pCoef16 + (2u * ic)); - /* Butterfly process for the i0+fftLen/2 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - out1 = __SMUSD(C1, S) >> 16u; - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - out2 = __SMUADX(C1, S); - -#else - - /* xb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - out1 = __SMUADX(C1, S) >> 16u; - /* yb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - out2 = __SMUSD(__QSUB16(0, C1), S); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* writing output(xb', yb') in little endian format */ - _SIMD32_OFFSET(pSi2) = - ((out2) & 0xFFFF0000) | ((out1) & 0x0000FFFF); - pSi2 += 2; - - - /* co3 & si3 are read from SIMD Coefficient pointer */ - C3 = _SIMD32_OFFSET(pCoef16 + (6u * ic)); - /* Butterfly process for the i0+3fftLen/4 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - out1 = __SMUSD(C3, R) >> 16u; - /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - out2 = __SMUADX(C3, R); - -#else - - /* xd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - out1 = __SMUADX(C3, R) >> 16u; - /* yd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - out2 = __SMUSD(__QSUB16(0, C3), R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* writing output(xd', yd') in little endian format */ - _SIMD32_OFFSET(pSi3) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi3 += 2; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - } while(--j); - /* data is in 4.11(q11) format */ - - /* end of first stage process */ - - - /* start of middle stage process */ - - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - - /* Calculation of Middle stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the middle stage */ - n1 = n2; - n2 >>= 2u; - ic = 0u; - - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - C1 = _SIMD32_OFFSET(pCoef16 + (2u * ic)); - C2 = _SIMD32_OFFSET(pCoef16 + (4u * ic)); - C3 = _SIMD32_OFFSET(pCoef16 + (6u * ic)); - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - pSi0 = pSrc16 + 2 * j; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - /* Butterfly implementation */ - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T = _SIMD32_OFFSET(pSi0); - - /* Read yc (real), xc(imag) input */ - S = _SIMD32_OFFSET(pSi2); - - /* R = packed( (ya + yc), (xa + xc)) */ - R = __QADD16(T, S); - - /* S = packed((ya - yc), (xa - xc)) */ - S = __QSUB16(T, S); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - - /* T = packed( (yb + yd), (xb + xd)) */ - T = __QADD16(T, U); - - /* writing the butterfly processed i0 sample */ - - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - out1 = __SHADD16(R, T); - out1 = __SHADD16(out1, 0); - _SIMD32_OFFSET(pSi0) = out1; - pSi0 += 2 * n1; - - /* R = packed( (ya + yc) - (yb + yd), (xa + xc) - (xb + xd)) */ - R = __SHSUB16(R, T); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ - out1 = __SMUSD(C2, R) >> 16u; - - /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out2 = __SMUADX(C2, R); - -#else - - /* (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - out1 = __SMUADX(R, C2) >> 16u; - - /* (ya-yb+yc-yd)* (si2) + (xa-xb+xc-xd)* co2 */ - out2 = __SMUSD(__QSUB16(0, C2), R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Reading i0+3fftLen/4 */ - /* Read yb (real), xb(imag) input */ - T = _SIMD32_OFFSET(pSi1); - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) */ - /* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) */ - _SIMD32_OFFSET(pSi1) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi1 += 2 * n1; - - /* Butterfly calculations */ - - /* Read yd (real), xd(imag) input */ - U = _SIMD32_OFFSET(pSi3); - - /* T = packed(yb-yd, xb-xd) */ - T = __QSUB16(T, U); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __SHSAX(S, T); - - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __SHASX(S, T); - - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = __SMUSD(C1, S) >> 16u; - out2 = __SMUADX(C1, S); - -#else - - /* R = packed((ya-yc) + (xb- xd) , (xa-xc) - (yb-yd)) */ - R = __SHASX(S, T); - - /* S = packed((ya-yc) - (xb- xd), (xa-xc) + (yb-yd)) */ - S = __SHSAX(S, T); - - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = __SMUADX(S, C1) >> 16u; - out2 = __SMUSD(__QSUB16(0, C1), S); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) */ - /* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) */ - _SIMD32_OFFSET(pSi2) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi2 += 2 * n1; - - /* Butterfly process for the i0+3fftLen/4 sample */ - -#ifndef ARM_MATH_BIG_ENDIAN - - out1 = __SMUSD(C3, R) >> 16u; - out2 = __SMUADX(C3, R); - -#else - - out1 = __SMUADX(C3, R) >> 16u; - out2 = __SMUSD(__QSUB16(0, C3), R); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) */ - /* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) */ - _SIMD32_OFFSET(pSi3) = - ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF); - pSi3 += 2 * n1; - } - } - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - } - /* end of middle stage process */ - - /* data is in 10.6(q6) format for the 1024 point */ - /* data is in 8.8(q8) format for the 256 point */ - /* data is in 6.10(q10) format for the 64 point */ - /* data is in 4.12(q12) format for the 16 point */ - - /* Initializations for the last stage */ - j = fftLen >> 2; - - ptr1 = &pSrc16[0]; - - /* start of last stage process */ - - /* Butterfly implementation */ - do - { - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD32(ptr1)++; - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD32(ptr1)++; - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD32(ptr1)++; - - /* Read xd (real), yd(imag) input */ - xdyd = *__SIMD32(ptr1)++; - - /* R = packed((ya + yc), (xa + xc)) */ - R = __QADD16(xaya, xcyc); - - /* T = packed((yb + yd), (xb + xd)) */ - T = __QADD16(xbyb, xdyd); - - /* pointer updation for writing */ - ptr1 = ptr1 - 8u; - - - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - *__SIMD32(ptr1)++ = __SHADD16(R, T); - - /* T = packed((yb + yd), (xb + xd)) */ - T = __QADD16(xbyb, xdyd); - - /* xc' = (xa-xb+xc-xd) */ - /* yc' = (ya-yb+yc-yd) */ - *__SIMD32(ptr1)++ = __SHSUB16(R, T); - - /* S = packed((ya - yc), (xa - xc)) */ - S = __QSUB16(xaya, xcyc); - - /* Read yd (real), xd(imag) input */ - /* T = packed( (yb - yd), (xb - xd)) */ - U = __QSUB16(xbyb, xdyd); - -#ifndef ARM_MATH_BIG_ENDIAN - - /* xb' = (xa+yb-xc-yd) */ - /* yb' = (ya-xb-yc+xd) */ - *__SIMD32(ptr1)++ = __SHASX(S, U); - - - /* xd' = (xa-yb-xc+yd) */ - /* yd' = (ya+xb-yc-xd) */ - *__SIMD32(ptr1)++ = __SHSAX(S, U); - -#else - - /* xb' = (xa+yb-xc-yd) */ - /* yb' = (ya-xb-yc+xd) */ - *__SIMD32(ptr1)++ = __SHSAX(S, U); - - - /* xd' = (xa-yb-xc+yd) */ - /* yd' = (ya+xb-yc-xd) */ - *__SIMD32(ptr1)++ = __SHASX(S, U); - - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - } while(--j); - - /* end of last stage process */ - - /* output is in 11.5(q5) format for the 1024 point */ - /* output is in 9.7(q7) format for the 256 point */ - /* output is in 7.9(q9) format for the 64 point */ - /* output is in 5.11(q11) format for the 16 point */ - - -#else - - /* Run the below code for Cortex-M0 */ - - q15_t R0, R1, S0, S1, T0, T1, U0, U1; - q15_t Co1, Si1, Co2, Si2, Co3, Si3, out1, out2; - uint32_t n1, n2, ic, i0, i1, i2, i3, j, k; - - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - - /* n2 = fftLen/4 */ - n2 >>= 2u; - - /* Index for twiddle coefficient */ - ic = 0u; - - /* Index for input read and output write */ - i0 = 0u; - - j = n2; - - /* Input is in 1.15(q15) format */ - - /* Start of first stage process */ - do - { - /* Butterfly implementation */ - - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - /* input is down scale by 4 to avoid overflow */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u] >> 2u; - T1 = pSrc16[(i0 * 2u) + 1u] >> 2u; - /* input is down scale by 4 to avoid overflow */ - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u] >> 2u; - S1 = pSrc16[(i2 * 2u) + 1u] >> 2u; - - /* R0 = (ya + yc), R1 = (xa + xc) */ - R0 = __SSAT(T0 + S0, 16u); - R1 = __SSAT(T1 + S1, 16u); - /* S0 = (ya - yc), S1 = (xa - xc) */ - S0 = __SSAT(T0 - S0, 16u); - S1 = __SSAT(T1 - S1, 16u); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* input is down scale by 4 to avoid overflow */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u] >> 2u; - T1 = pSrc16[(i1 * 2u) + 1u] >> 2u; - /* Read yd (real), xd(imag) input */ - /* input is down scale by 4 to avoid overflow */ - U0 = pSrc16[i3 * 2u] >> 2u; - U1 = pSrc16[(i3 * 2u) + 1u] >> 2u; - - /* T0 = (yb + yd), T1 = (xb + xd) */ - T0 = __SSAT(T0 + U0, 16u); - T1 = __SSAT(T1 + U1, 16u); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - pSrc16[i0 * 2u] = (R0 >> 1u) + (T0 >> 1u); - pSrc16[(i0 * 2u) + 1u] = (R1 >> 1u) + (T1 >> 1u); - - /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc)- (xb + xd) */ - R0 = __SSAT(R0 - T0, 16u); - R1 = __SSAT(R1 - T1, 16u); - /* co2 & si2 are read from Coefficient pointer */ - Co2 = pCoef16[2u * ic * 2u]; - Si2 = pCoef16[(2u * ic * 2u) + 1u]; - /* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) */ - out1 = (q15_t) ((Co2 * R0 - Si2 * R1) >> 16u); - /* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ - out2 = (q15_t) ((Si2 * R0 + Co2 * R1) >> 16u); - - /* Reading i0+fftLen/4 */ - /* input is down scale by 4 to avoid overflow */ - /* T0 = yb, T1 = xb */ - T0 = pSrc16[i1 * 2u] >> 2u; - T1 = pSrc16[(i1 * 2u) + 1u] >> 2u; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* writing output(xc', yc') in little endian format */ - pSrc16[i1 * 2u] = out1; - pSrc16[(i1 * 2u) + 1u] = out2; - - /* Butterfly calculations */ - /* input is down scale by 4 to avoid overflow */ - /* U0 = yd, U1 = xd) */ - U0 = pSrc16[i3 * 2u] >> 2u; - U1 = pSrc16[(i3 * 2u) + 1u] >> 2u; - - /* T0 = yb-yd, T1 = xb-xd) */ - T0 = __SSAT(T0 - U0, 16u); - T1 = __SSAT(T1 - U1, 16u); - /* R0 = (ya-yc) - (xb- xd) , R1 = (xa-xc) + (yb-yd) */ - R0 = (q15_t) __SSAT((q31_t) (S0 + T1), 16); - R1 = (q15_t) __SSAT((q31_t) (S1 - T0), 16); - /* S = (ya-yc) + (xb- xd), S1 = (xa-xc) - (yb-yd) */ - S0 = (q15_t) __SSAT((q31_t) (S0 - T1), 16); - S1 = (q15_t) __SSAT((q31_t) (S1 + T0), 16); - - /* co1 & si1 are read from Coefficient pointer */ - Co1 = pCoef16[ic * 2u]; - Si1 = pCoef16[(ic * 2u) + 1u]; - /* Butterfly process for the i0+fftLen/2 sample */ - /* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) */ - out1 = (q15_t) ((Co1 * S0 - Si1 * S1) >> 16u); - /* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) */ - out2 = (q15_t) ((Si1 * S0 + Co1 * S1) >> 16u); - /* writing output(xb', yb') in little endian format */ - pSrc16[i2 * 2u] = out1; - pSrc16[(i2 * 2u) + 1u] = out2; - - /* Co3 & si3 are read from Coefficient pointer */ - Co3 = pCoef16[3u * ic * 2u]; - Si3 = pCoef16[(3u * ic * 2u) + 1u]; - /* Butterfly process for the i0+3fftLen/4 sample */ - /* xd' = (xa+yb-xc-yd)* Co3 - (ya-xb-yc+xd)* (si3) */ - out1 = (q15_t) ((Co3 * R0 - Si3 * R1) >> 16u); - /* yd' = (ya-xb-yc+xd)* Co3 + (xa+yb-xc-yd)* (si3) */ - out2 = (q15_t) ((Si3 * R0 + Co3 * R1) >> 16u); - /* writing output(xd', yd') in little endian format */ - pSrc16[i3 * 2u] = out1; - pSrc16[(i3 * 2u) + 1u] = out2; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - /* Updating input index */ - i0 = i0 + 1u; - - } while(--j); - - /* End of first stage process */ - - /* data is in 4.11(q11) format */ - - - /* Start of Middle stage process */ - - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - - /* Calculation of Middle stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the middle stage */ - n1 = n2; - n2 >>= 2u; - ic = 0u; - - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - Co1 = pCoef16[ic * 2u]; - Si1 = pCoef16[(ic * 2u) + 1u]; - Co2 = pCoef16[2u * ic * 2u]; - Si2 = pCoef16[2u * ic * 2u + 1u]; - Co3 = pCoef16[3u * ic * 2u]; - Si3 = pCoef16[(3u * ic * 2u) + 1u]; - - /* Twiddle coefficients index modifier */ - ic = ic + twidCoefModifier; - - /* Butterfly implementation */ - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u]; - T1 = pSrc16[(i0 * 2u) + 1u]; - - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u]; - S1 = pSrc16[(i2 * 2u) + 1u]; - - - /* R0 = (ya + yc), R1 = (xa + xc) */ - R0 = __SSAT(T0 + S0, 16u); - R1 = __SSAT(T1 + S1, 16u); - /* S0 = (ya - yc), S1 = (xa - xc) */ - S0 = __SSAT(T0 - S0, 16u); - S1 = __SSAT(T1 - S1, 16u); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - /* T0 = (yb + yd), T1 = (xb + xd) */ - T0 = __SSAT(T0 + U0, 16u); - T1 = __SSAT(T1 + U1, 16u); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - pSrc16[i0 * 2u] = ((R0 >> 1u) + (T0 >> 1u)) >> 1u; - pSrc16[(i0 * 2u) + 1u] = ((R1 >> 1u) + (T1 >> 1u)) >> 1u; - - /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ - R0 = (R0 >> 1u) - (T0 >> 1u); - R1 = (R1 >> 1u) - (T1 >> 1u); - - /* (ya-yb+yc-yd)* (si2) - (xa-xb+xc-xd)* co2 */ - out1 = (q15_t) ((Co2 * R0 - Si2 * R1) >> 16); - /* (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ - out2 = (q15_t) ((Si2 * R0 + Co2 * R1) >> 16); - - /* Reading i0+3fftLen/4 */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) */ - /* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) */ - pSrc16[i1 * 2u] = out1; - pSrc16[(i1 * 2u) + 1u] = out2; - - /* Butterfly calculations */ - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - /* T0 = yb-yd, T1 = xb-xd) */ - T0 = __SSAT(T0 - U0, 16u); - T1 = __SSAT(T1 - U1, 16u); - - /* R0 = (ya-yc) - (xb- xd) , R1 = (xa-xc) + (yb-yd) */ - R0 = (S0 >> 1u) + (T1 >> 1u); - R1 = (S1 >> 1u) - (T0 >> 1u); - - /* S1 = (ya-yc) + (xb- xd), S1 = (xa-xc) - (yb-yd) */ - S0 = (S0 >> 1u) - (T1 >> 1u); - S1 = (S1 >> 1u) + (T0 >> 1u); - - /* Butterfly process for the i0+fftLen/2 sample */ - out1 = (q15_t) ((Co1 * S0 - Si1 * S1) >> 16u); - out2 = (q15_t) ((Si1 * S0 + Co1 * S1) >> 16u); - /* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) */ - /* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) */ - pSrc16[i2 * 2u] = out1; - pSrc16[(i2 * 2u) + 1u] = out2; - - /* Butterfly process for the i0+3fftLen/4 sample */ - out1 = (q15_t) ((Co3 * R0 - Si3 * R1) >> 16u); - - out2 = (q15_t) ((Si3 * R0 + Co3 * R1) >> 16u); - /* xd' = (xa+yb-xc-yd)* Co3 - (ya-xb-yc+xd)* (si3) */ - /* yd' = (ya-xb-yc+xd)* Co3 + (xa+yb-xc-yd)* (si3) */ - pSrc16[i3 * 2u] = out1; - pSrc16[(i3 * 2u) + 1u] = out2; - - - } - } - /* Twiddle coefficients index modifier */ - twidCoefModifier <<= 2u; - } - /* End of Middle stages process */ - - - /* data is in 10.6(q6) format for the 1024 point */ - /* data is in 8.8(q8) format for the 256 point */ - /* data is in 6.10(q10) format for the 64 point */ - /* data is in 4.12(q12) format for the 16 point */ - - /* start of last stage process */ - - - /* Initializations for the last stage */ - n1 = n2; - n2 >>= 2u; - - /* Butterfly implementation */ - for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc16[i0 + 0], pSrc16[i0 + fftLen/4], pSrc16[i0 + fftLen/2], pSrc16[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Reading i0, i0+fftLen/2 inputs */ - /* Read ya (real), xa(imag) input */ - T0 = pSrc16[i0 * 2u]; - T1 = pSrc16[(i0 * 2u) + 1u]; - /* Read yc (real), xc(imag) input */ - S0 = pSrc16[i2 * 2u]; - S1 = pSrc16[(i2 * 2u) + 1u]; - - /* R0 = (ya + yc), R1 = (xa + xc) */ - R0 = __SSAT(T0 + S0, 16u); - R1 = __SSAT(T1 + S1, 16u); - /* S0 = (ya - yc), S1 = (xa - xc) */ - S0 = __SSAT(T0 - S0, 16u); - S1 = __SSAT(T1 - S1, 16u); - - /* Reading i0+fftLen/4 , i0+3fftLen/4 inputs */ - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - - /* T0 = (yb + yd), T1 = (xb + xd) */ - T0 = __SSAT(T0 + U0, 16u); - T1 = __SSAT(T1 + U1, 16u); - - /* writing the butterfly processed i0 sample */ - /* xa' = xa + xb + xc + xd */ - /* ya' = ya + yb + yc + yd */ - pSrc16[i0 * 2u] = (R0 >> 1u) + (T0 >> 1u); - pSrc16[(i0 * 2u) + 1u] = (R1 >> 1u) + (T1 >> 1u); - - /* R0 = (ya + yc) - (yb + yd), R1 = (xa + xc) - (xb + xd) */ - R0 = (R0 >> 1u) - (T0 >> 1u); - R1 = (R1 >> 1u) - (T1 >> 1u); - - /* Read yb (real), xb(imag) input */ - T0 = pSrc16[i1 * 2u]; - T1 = pSrc16[(i1 * 2u) + 1u]; - - /* writing the butterfly processed i0 + fftLen/4 sample */ - /* xc' = (xa-xb+xc-xd) */ - /* yc' = (ya-yb+yc-yd) */ - pSrc16[i1 * 2u] = R0; - pSrc16[(i1 * 2u) + 1u] = R1; - - /* Read yd (real), xd(imag) input */ - U0 = pSrc16[i3 * 2u]; - U1 = pSrc16[(i3 * 2u) + 1u]; - /* T0 = (yb - yd), T1 = (xb - xd) */ - T0 = __SSAT(T0 - U0, 16u); - T1 = __SSAT(T1 - U1, 16u); - - /* writing the butterfly processed i0 + fftLen/2 sample */ - /* xb' = (xa-yb-xc+yd) */ - /* yb' = (ya+xb-yc-xd) */ - pSrc16[i2 * 2u] = (S0 >> 1u) - (T1 >> 1u); - pSrc16[(i2 * 2u) + 1u] = (S1 >> 1u) + (T0 >> 1u); - - - /* writing the butterfly processed i0 + 3fftLen/4 sample */ - /* xd' = (xa+yb-xc-yd) */ - /* yd' = (ya-xb-yc+xd) */ - pSrc16[i3 * 2u] = (S0 >> 1u) + (T1 >> 1u); - pSrc16[(i3 * 2u) + 1u] = (S1 >> 1u) - (T0 >> 1u); - } - /* end of last stage process */ - - /* output is in 11.5(q5) format for the 1024 point */ - /* output is in 9.7(q7) format for the 256 point */ - /* output is in 7.9(q9) format for the 64 point */ - /* output is in 5.11(q11) format for the 16 point */ - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c deleted file mode 100644 index 5c1b0ae..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c +++ /dev/null @@ -1,1404 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix4_q31.c -* -* Description: This file has function definition of Radix-4 FFT & IFFT function and -* In-place bit reversal using bit reversal table -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -void arm_radix4_butterfly_inverse_q31( -q31_t * pSrc, -uint32_t fftLen, -q31_t * pCoef, -uint32_t twidCoefModifier); - -void arm_radix4_butterfly_q31( -q31_t * pSrc, -uint32_t fftLen, -q31_t * pCoef, -uint32_t twidCoefModifier); - -void arm_bitreversal_q31( -q31_t * pSrc, -uint32_t fftLen, -uint16_t bitRevFactor, -uint16_t * pBitRevTab); - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup ComplexFFT - * @{ - */ - -/** - * @details - * @brief Processing function for the Q31 CFFT/CIFFT. - * @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed - * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer of size 2*fftLen. Processing occurs in-place. - * @return none. - * - * \par Input and output formats: - * \par - * Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. - * Hence the output format is different for different FFT sizes. - * The input and output formats for different FFT sizes and number of bits to upscale are mentioned in the tables below for CFFT and CIFFT: - * \par - * \image html CFFTQ31.gif "Input and Output Formats for Q31 CFFT" - * \image html CIFFTQ31.gif "Input and Output Formats for Q31 CIFFT" - * - */ - -void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc) -{ - if(S->ifftFlag == 1u) - { - /* Complex IFFT radix-4 */ - arm_radix4_butterfly_inverse_q31(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - else - { - /* Complex FFT radix-4 */ - arm_radix4_butterfly_q31(pSrc, S->fftLen, S->pTwiddle, - S->twidCoefModifier); - } - - - if(S->bitReverseFlag == 1u) - { - /* Bit Reversal */ - arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable); - } - -} - -/** - * @} end of ComplexFFT group - */ - -/* -* Radix-4 FFT algorithm used is : -* -* Input real and imaginary data: -* x(n) = xa + j * ya -* x(n+N/4 ) = xb + j * yb -* x(n+N/2 ) = xc + j * yc -* x(n+3N 4) = xd + j * yd -* -* -* Output real and imaginary data: -* x(4r) = xa'+ j * ya' -* x(4r+1) = xb'+ j * yb' -* x(4r+2) = xc'+ j * yc' -* x(4r+3) = xd'+ j * yd' -* -* -* Twiddle factors for radix-4 FFT: -* Wn = co1 + j * (- si1) -* W2n = co2 + j * (- si2) -* W3n = co3 + j * (- si3) -* -* Butterfly implementation: -* xa' = xa + xb + xc + xd -* ya' = ya + yb + yc + yd -* xb' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1) -* yb' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1) -* xc' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2) -* yc' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2) -* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3) -* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3) -* -*/ - -/** - * @brief Core function for the Q31 CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - -void arm_radix4_butterfly_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier) -{ -#if defined(ARM_MATH_CM7) - uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k; - q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; - - q31_t xa, xb, xc, xd; - q31_t ya, yb, yc, yd; - q31_t xa_out, xb_out, xc_out, xd_out; - q31_t ya_out, yb_out, yc_out, yd_out; - - q31_t *ptr1; - q63_t xaya, xbyb, xcyc, xdyd; - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - - /* start of first stage process */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - /* n2 = fftLen/4 */ - n2 >>= 2u; - i0 = 0u; - ia1 = 0u; - - j = n2; - - /* Calculation of first stage */ - do - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* input is in 1.31(q31) format and provide 4 guard bits for the input */ - - /* Butterfly implementation */ - /* xa + xc */ - r1 = (pSrc[(2u * i0)] >> 4u) + (pSrc[(2u * i2)] >> 4u); - /* xa - xc */ - r2 = (pSrc[2u * i0] >> 4u) - (pSrc[2u * i2] >> 4u); - - /* xb + xd */ - t1 = (pSrc[2u * i1] >> 4u) + (pSrc[2u * i3] >> 4u); - - /* ya + yc */ - s1 = (pSrc[(2u * i0) + 1u] >> 4u) + (pSrc[(2u * i2) + 1u] >> 4u); - /* ya - yc */ - s2 = (pSrc[(2u * i0) + 1u] >> 4u) - (pSrc[(2u * i2) + 1u] >> 4u); - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = (r1 + t1); - /* (xa + xc) - (xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = (pSrc[(2u * i1) + 1u] >> 4u) + (pSrc[(2u * i3) + 1u] >> 4u); - - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = (s1 + t2); - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* yb - yd */ - t1 = (pSrc[(2u * i1) + 1u] >> 4u) - (pSrc[(2u * i3) + 1u] >> 4u); - /* xb - xd */ - t2 = (pSrc[2u * i1] >> 4u) - (pSrc[2u * i3] >> 4u); - - /* index calculation for the coefficients */ - ia2 = 2u * ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) + - ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) - - ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u; - - /* (xa - xc) + (yb - yd) */ - r1 = r2 + t1; - /* (xa - xc) - (yb - yd) */ - r2 = r2 - t1; - - /* (ya - yc) - (xb - xd) */ - s1 = s2 - t2; - /* (ya - yc) + (xb - xd) */ - s2 = s2 + t2; - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) + - ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) - - ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u; - - /* index calculation for the coefficients */ - ia3 = 3u * ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) + - ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) - - ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - /* Updating input index */ - i0 = i0 + 1u; - - } while(--j); - - /* end of first stage process */ - - /* data is in 5.27(q27) format */ - - - /* start of Middle stages process */ - - - /* each stage in middle stages provides two down scaling of the input */ - - twidCoefModifier <<= 2u; - - - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* Calculation of first stage */ - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Butterfly implementation */ - /* xa + xc */ - r1 = pSrc[2u * i0] + pSrc[2u * i2]; - /* xa - xc */ - r2 = pSrc[2u * i0] - pSrc[2u * i2]; - - /* ya + yc */ - s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; - /* ya - yc */ - s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; - - /* xb + xd */ - t1 = pSrc[2u * i1] + pSrc[2u * i3]; - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = (r1 + t1) >> 2u; - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - - /* yb + yd */ - t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = (s1 + t2) >> 2u; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; - /* (xb - xd) */ - t2 = pSrc[2u * i1] - pSrc[2u * i3]; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) + - ((int32_t) (((q63_t) s1 * si2) >> 32))) >> 1u; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) - - ((int32_t) (((q63_t) r1 * si2) >> 32))) >> 1u; - - /* (xa - xc) + (yb - yd) */ - r1 = r2 + t1; - /* (xa - xc) - (yb - yd) */ - r2 = r2 - t1; - - /* (ya - yc) - (xb - xd) */ - s1 = s2 - t2; - /* (ya - yc) + (xb - xd) */ - s2 = s2 + t2; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) + - ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) - - ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) + - ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) - - ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u; - } - } - twidCoefModifier <<= 2u; - } -#else - uint32_t n1, n2, ia1, ia2, ia3, i0, j, k; - q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; - - q31_t xa, xb, xc, xd; - q31_t ya, yb, yc, yd; - q31_t xa_out, xb_out, xc_out, xd_out; - q31_t ya_out, yb_out, yc_out, yd_out; - - q31_t *ptr1; - q31_t *pSi0; - q31_t *pSi1; - q31_t *pSi2; - q31_t *pSi3; - q63_t xaya, xbyb, xcyc, xdyd; - /* Total process is divided into three stages */ - - /* process first stage, middle stages, & last stage */ - - - /* start of first stage process */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - /* n2 = fftLen/4 */ - n2 >>= 2u; - - ia1 = 0u; - - j = n2; - - pSi0 = pSrc; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - /* Calculation of first stage */ - do - { - /* input is in 1.31(q31) format and provide 4 guard bits for the input */ - - /* Butterfly implementation */ - /* xa + xc */ - r1 = (pSi0[0] >> 4u) + (pSi2[0] >> 4u); - /* xa - xc */ - r2 = (pSi0[0] >> 4u) - (pSi2[0] >> 4u); - - /* xb + xd */ - t1 = (pSi1[0] >> 4u) + (pSi3[0] >> 4u); - - /* ya + yc */ - s1 = (pSi0[1] >> 4u) + (pSi2[1] >> 4u); - /* ya - yc */ - s2 = (pSi0[1] >> 4u) - (pSi2[1] >> 4u); - - /* xa' = xa + xb + xc + xd */ - *pSi0++ = (r1 + t1); - /* (xa + xc) - (xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = (pSi1[1] >> 4u) + (pSi3[1] >> 4u); - - /* ya' = ya + yb + yc + yd */ - *pSi0++ = (s1 + t2); - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* yb - yd */ - t1 = (pSi1[1] >> 4u) - (pSi3[1] >> 4u); - /* xb - xd */ - t2 = (pSi1[0] >> 4u) - (pSi3[0] >> 4u); - - /* index calculation for the coefficients */ - ia2 = 2u * ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - *pSi1++ = (((int32_t) (((q63_t) r1 * co2) >> 32)) + - ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - *pSi1++ = (((int32_t) (((q63_t) s1 * co2) >> 32)) - - ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u; - - /* (xa - xc) + (yb - yd) */ - r1 = r2 + t1; - /* (xa - xc) - (yb - yd) */ - r2 = r2 - t1; - - /* (ya - yc) - (xb - xd) */ - s1 = s2 - t2; - /* (ya - yc) + (xb - xd) */ - s2 = s2 + t2; - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - *pSi2++ = (((int32_t) (((q63_t) r1 * co1) >> 32)) + - ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - *pSi2++ = (((int32_t) (((q63_t) s1 * co1) >> 32)) - - ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u; - - /* index calculation for the coefficients */ - ia3 = 3u * ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - *pSi3++ = (((int32_t) (((q63_t) r2 * co3) >> 32)) + - ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - *pSi3++ = (((int32_t) (((q63_t) s2 * co3) >> 32)) - - ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - } while(--j); - - /* end of first stage process */ - - /* data is in 5.27(q27) format */ - - - /* start of Middle stages process */ - - - /* each stage in middle stages provides two down scaling of the input */ - - twidCoefModifier <<= 2u; - - - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - /* Calculation of first stage */ - for (j = 0u; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - pSi0 = pSrc + 2 * j; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* Butterfly implementation */ - /* xa + xc */ - r1 = pSi0[0] + pSi2[0]; - - /* xa - xc */ - r2 = pSi0[0] - pSi2[0]; - - - /* ya + yc */ - s1 = pSi0[1] + pSi2[1]; - - /* ya - yc */ - s2 = pSi0[1] - pSi2[1]; - - - /* xb + xd */ - t1 = pSi1[0] + pSi3[0]; - - - /* xa' = xa + xb + xc + xd */ - pSi0[0] = (r1 + t1) >> 2u; - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - - /* yb + yd */ - t2 = pSi1[1] + pSi3[1]; - - /* ya' = ya + yb + yc + yd */ - pSi0[1] = (s1 + t2) >> 2u; - pSi0 += 2 * n1; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSi1[1] - pSi3[1]; - - /* (xb - xd) */ - t2 = pSi1[0] - pSi3[0]; - - - /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */ - pSi1[0] = (((int32_t) (((q63_t) r1 * co2) >> 32)) + - ((int32_t) (((q63_t) s1 * si2) >> 32))) >> 1u; - - /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */ - pSi1[1] = (((int32_t) (((q63_t) s1 * co2) >> 32)) - - ((int32_t) (((q63_t) r1 * si2) >> 32))) >> 1u; - pSi1 += 2 * n1; - - /* (xa - xc) + (yb - yd) */ - r1 = r2 + t1; - /* (xa - xc) - (yb - yd) */ - r2 = r2 - t1; - - /* (ya - yc) - (xb - xd) */ - s1 = s2 - t2; - /* (ya - yc) + (xb - xd) */ - s2 = s2 + t2; - - /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */ - pSi2[0] = (((int32_t) (((q63_t) r1 * co1) >> 32)) + - ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u; - - /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */ - pSi2[1] = (((int32_t) (((q63_t) s1 * co1) >> 32)) - - ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u; - pSi2 += 2 * n1; - - /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */ - pSi3[0] = (((int32_t) (((q63_t) r2 * co3) >> 32)) + - ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u; - - /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */ - pSi3[1] = (((int32_t) (((q63_t) s2 * co3) >> 32)) - - ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u; - pSi3 += 2 * n1; - } - } - twidCoefModifier <<= 2u; - } -#endif - - /* End of Middle stages process */ - - /* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */ - /* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */ - /* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */ - /* data is in 5.27(q27) format for the 16 point as there are no middle stages */ - - - /* start of Last stage process */ - /* Initializations for the last stage */ - j = fftLen >> 2; - ptr1 = &pSrc[0]; - - /* Calculations of last stage */ - do - { - -#ifndef ARM_MATH_BIG_ENDIAN - - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD64(ptr1)++; - xa = (q31_t) xaya; - ya = (q31_t) (xaya >> 32); - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD64(ptr1)++; - xb = (q31_t) xbyb; - yb = (q31_t) (xbyb >> 32); - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD64(ptr1)++; - xc = (q31_t) xcyc; - yc = (q31_t) (xcyc >> 32); - - /* Read xc (real), yc(imag) input */ - xdyd = *__SIMD64(ptr1)++; - xd = (q31_t) xdyd; - yd = (q31_t) (xdyd >> 32); - -#else - - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD64(ptr1)++; - ya = (q31_t) xaya; - xa = (q31_t) (xaya >> 32); - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD64(ptr1)++; - yb = (q31_t) xbyb; - xb = (q31_t) (xbyb >> 32); - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD64(ptr1)++; - yc = (q31_t) xcyc; - xc = (q31_t) (xcyc >> 32); - - /* Read xc (real), yc(imag) input */ - xdyd = *__SIMD64(ptr1)++; - yd = (q31_t) xdyd; - xd = (q31_t) (xdyd >> 32); - - -#endif - - /* xa' = xa + xb + xc + xd */ - xa_out = xa + xb + xc + xd; - - /* ya' = ya + yb + yc + yd */ - ya_out = ya + yb + yc + yd; - - /* pointer updation for writing */ - ptr1 = ptr1 - 8u; - - /* writing xa' and ya' */ - *ptr1++ = xa_out; - *ptr1++ = ya_out; - - xc_out = (xa - xb + xc - xd); - yc_out = (ya - yb + yc - yd); - - /* writing xc' and yc' */ - *ptr1++ = xc_out; - *ptr1++ = yc_out; - - xb_out = (xa + yb - xc - yd); - yb_out = (ya - xb - yc + xd); - - /* writing xb' and yb' */ - *ptr1++ = xb_out; - *ptr1++ = yb_out; - - xd_out = (xa - yb - xc + yd); - yd_out = (ya + xb - yc - xd); - - /* writing xd' and yd' */ - *ptr1++ = xd_out; - *ptr1++ = yd_out; - - - } while(--j); - - /* output is in 11.21(q21) format for the 1024 point */ - /* output is in 9.23(q23) format for the 256 point */ - /* output is in 7.25(q25) format for the 64 point */ - /* output is in 5.27(q27) format for the 16 point */ - - /* End of last stage process */ - -} - - -/** - * @brief Core function for the Q31 CIFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - -/* -* Radix-4 IFFT algorithm used is : -* -* CIFFT uses same twiddle coefficients as CFFT Function -* x[k] = x[n] + (j)k * x[n + fftLen/4] + (-1)k * x[n+fftLen/2] + (-j)k * x[n+3*fftLen/4] -* -* -* IFFT is implemented with following changes in equations from FFT -* -* Input real and imaginary data: -* x(n) = xa + j * ya -* x(n+N/4 ) = xb + j * yb -* x(n+N/2 ) = xc + j * yc -* x(n+3N 4) = xd + j * yd -* -* -* Output real and imaginary data: -* x(4r) = xa'+ j * ya' -* x(4r+1) = xb'+ j * yb' -* x(4r+2) = xc'+ j * yc' -* x(4r+3) = xd'+ j * yd' -* -* -* Twiddle factors for radix-4 IFFT: -* Wn = co1 + j * (si1) -* W2n = co2 + j * (si2) -* W3n = co3 + j * (si3) - -* The real and imaginary output values for the radix-4 butterfly are -* xa' = xa + xb + xc + xd -* ya' = ya + yb + yc + yd -* xb' = (xa-yb-xc+yd)* co1 - (ya+xb-yc-xd)* (si1) -* yb' = (ya+xb-yc-xd)* co1 + (xa-yb-xc+yd)* (si1) -* xc' = (xa-xb+xc-xd)* co2 - (ya-yb+yc-yd)* (si2) -* yc' = (ya-yb+yc-yd)* co2 + (xa-xb+xc-xd)* (si2) -* xd' = (xa+yb-xc-yd)* co3 - (ya-xb-yc+xd)* (si3) -* yd' = (ya-xb-yc+xd)* co3 + (xa+yb-xc-yd)* (si3) -* -*/ - -void arm_radix4_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier) -{ -#if defined(ARM_MATH_CM7) - uint32_t n1, n2, ia1, ia2, ia3, i0, i1, i2, i3, j, k; - q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; - q31_t xa, xb, xc, xd; - q31_t ya, yb, yc, yd; - q31_t xa_out, xb_out, xc_out, xd_out; - q31_t ya_out, yb_out, yc_out, yd_out; - - q31_t *ptr1; - q63_t xaya, xbyb, xcyc, xdyd; - - /* input is be 1.31(q31) format for all FFT sizes */ - /* Total process is divided into three stages */ - /* process first stage, middle stages, & last stage */ - - /* Start of first stage process */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - /* n2 = fftLen/4 */ - n2 >>= 2u; - i0 = 0u; - ia1 = 0u; - - j = n2; - - do - { - - /* input is in 1.31(q31) format and provide 4 guard bits for the input */ - - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Butterfly implementation */ - /* xa + xc */ - r1 = (pSrc[2u * i0] >> 4u) + (pSrc[2u * i2] >> 4u); - /* xa - xc */ - r2 = (pSrc[2u * i0] >> 4u) - (pSrc[2u * i2] >> 4u); - - /* xb + xd */ - t1 = (pSrc[2u * i1] >> 4u) + (pSrc[2u * i3] >> 4u); - - /* ya + yc */ - s1 = (pSrc[(2u * i0) + 1u] >> 4u) + (pSrc[(2u * i2) + 1u] >> 4u); - /* ya - yc */ - s2 = (pSrc[(2u * i0) + 1u] >> 4u) - (pSrc[(2u * i2) + 1u] >> 4u); - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = (r1 + t1); - /* (xa + xc) - (xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = (pSrc[(2u * i1) + 1u] >> 4u) + (pSrc[(2u * i3) + 1u] >> 4u); - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = (s1 + t2); - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* yb - yd */ - t1 = (pSrc[(2u * i1) + 1u] >> 4u) - (pSrc[(2u * i3) + 1u] >> 4u); - /* xb - xd */ - t2 = (pSrc[2u * i1] >> 4u) - (pSrc[2u * i3] >> 4u); - - /* index calculation for the coefficients */ - ia2 = 2u * ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32)) - - ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[2u * i1 + 1u] = (((int32_t) (((q63_t) s1 * co2) >> 32)) + - ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u; - - /* (xa - xc) - (yb - yd) */ - r1 = r2 - t1; - /* (xa - xc) + (yb - yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb - xd) */ - s1 = s2 + t2; - /* (ya - yc) - (xb - xd) */ - s2 = s2 - t2; - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) - - ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) + - ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u; - - /* index calculation for the coefficients */ - ia3 = 3u * ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[2u * i3] = (((int32_t) (((q63_t) r2 * co3) >> 32)) - - ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) + - ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - /* Updating input index */ - i0 = i0 + 1u; - - } while(--j); - - /* data is in 5.27(q27) format */ - /* each stage provides two down scaling of the input */ - - - /* Start of Middle stages process */ - - twidCoefModifier <<= 2u; - - /* Calculation of second stage to excluding last stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - for (j = 0; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* index calculation for the input as, */ - /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2u], pSrc[i0 + 3fftLen/4] */ - i1 = i0 + n2; - i2 = i1 + n2; - i3 = i2 + n2; - - /* Butterfly implementation */ - /* xa + xc */ - r1 = pSrc[2u * i0] + pSrc[2u * i2]; - /* xa - xc */ - r2 = pSrc[2u * i0] - pSrc[2u * i2]; - - /* ya + yc */ - s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u]; - /* ya - yc */ - s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u]; - - /* xb + xd */ - t1 = pSrc[2u * i1] + pSrc[2u * i3]; - - /* xa' = xa + xb + xc + xd */ - pSrc[2u * i0] = (r1 + t1) >> 2u; - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u]; - /* ya' = ya + yb + yc + yd */ - pSrc[(2u * i0) + 1u] = (s1 + t2) >> 2u; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u]; - /* (xb - xd) */ - t2 = pSrc[2u * i1] - pSrc[2u * i3]; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSrc[2u * i1] = (((int32_t) (((q63_t) r1 * co2) >> 32u)) - - ((int32_t) (((q63_t) s1 * si2) >> 32u))) >> 1u; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSrc[(2u * i1) + 1u] = - (((int32_t) (((q63_t) s1 * co2) >> 32u)) + - ((int32_t) (((q63_t) r1 * si2) >> 32u))) >> 1u; - - /* (xa - xc) - (yb - yd) */ - r1 = r2 - t1; - /* (xa - xc) + (yb - yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb - xd) */ - s1 = s2 + t2; - /* (ya - yc) - (xb - xd) */ - s2 = s2 - t2; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSrc[2u * i2] = (((int32_t) (((q63_t) r1 * co1) >> 32)) - - ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSrc[(2u * i2) + 1u] = (((int32_t) (((q63_t) s1 * co1) >> 32)) + - ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSrc[(2u * i3)] = (((int32_t) (((q63_t) r2 * co3) >> 32)) - - ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSrc[(2u * i3) + 1u] = (((int32_t) (((q63_t) s2 * co3) >> 32)) + - ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u; - } - } - twidCoefModifier <<= 2u; - } -#else - uint32_t n1, n2, ia1, ia2, ia3, i0, j, k; - q31_t t1, t2, r1, r2, s1, s2, co1, co2, co3, si1, si2, si3; - q31_t xa, xb, xc, xd; - q31_t ya, yb, yc, yd; - q31_t xa_out, xb_out, xc_out, xd_out; - q31_t ya_out, yb_out, yc_out, yd_out; - - q31_t *ptr1; - q31_t *pSi0; - q31_t *pSi1; - q31_t *pSi2; - q31_t *pSi3; - q63_t xaya, xbyb, xcyc, xdyd; - - /* input is be 1.31(q31) format for all FFT sizes */ - /* Total process is divided into three stages */ - /* process first stage, middle stages, & last stage */ - - /* Start of first stage process */ - - /* Initializations for the first stage */ - n2 = fftLen; - n1 = n2; - /* n2 = fftLen/4 */ - n2 >>= 2u; - - ia1 = 0u; - - j = n2; - - pSi0 = pSrc; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - do - { - /* Butterfly implementation */ - /* xa + xc */ - r1 = (pSi0[0] >> 4u) + (pSi2[0] >> 4u); - /* xa - xc */ - r2 = (pSi0[0] >> 4u) - (pSi2[0] >> 4u); - - /* xb + xd */ - t1 = (pSi1[0] >> 4u) + (pSi3[0] >> 4u); - - /* ya + yc */ - s1 = (pSi0[1] >> 4u) + (pSi2[1] >> 4u); - /* ya - yc */ - s2 = (pSi0[1] >> 4u) - (pSi2[1] >> 4u); - - /* xa' = xa + xb + xc + xd */ - *pSi0++ = (r1 + t1); - /* (xa + xc) - (xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = (pSi1[1] >> 4u) + (pSi3[1] >> 4u); - /* ya' = ya + yb + yc + yd */ - *pSi0++ = (s1 + t2); - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* yb - yd */ - t1 = (pSi1[1] >> 4u) - (pSi3[1] >> 4u); - /* xb - xd */ - t2 = (pSi1[0] >> 4u) - (pSi3[0] >> 4u); - - /* index calculation for the coefficients */ - ia2 = 2u * ia1; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - *pSi1++ = (((int32_t) (((q63_t) r1 * co2) >> 32)) - - ((int32_t) (((q63_t) s1 * si2) >> 32))) << 1u; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - *pSi1++ = (((int32_t) (((q63_t) s1 * co2) >> 32)) + - ((int32_t) (((q63_t) r1 * si2) >> 32))) << 1u; - - /* (xa - xc) - (yb - yd) */ - r1 = r2 - t1; - /* (xa - xc) + (yb - yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb - xd) */ - s1 = s2 + t2; - /* (ya - yc) - (xb - xd) */ - s2 = s2 - t2; - - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - *pSi2++ = (((int32_t) (((q63_t) r1 * co1) >> 32)) - - ((int32_t) (((q63_t) s1 * si1) >> 32))) << 1u; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - *pSi2++ = (((int32_t) (((q63_t) s1 * co1) >> 32)) + - ((int32_t) (((q63_t) r1 * si1) >> 32))) << 1u; - - /* index calculation for the coefficients */ - ia3 = 3u * ia1; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - *pSi3++ = (((int32_t) (((q63_t) r2 * co3) >> 32)) - - ((int32_t) (((q63_t) s2 * si3) >> 32))) << 1u; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - *pSi3++ = (((int32_t) (((q63_t) s2 * co3) >> 32)) + - ((int32_t) (((q63_t) r2 * si3) >> 32))) << 1u; - - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - } while(--j); - - /* data is in 5.27(q27) format */ - /* each stage provides two down scaling of the input */ - - - /* Start of Middle stages process */ - - twidCoefModifier <<= 2u; - - /* Calculation of second stage to excluding last stage */ - for (k = fftLen / 4u; k > 4u; k >>= 2u) - { - /* Initializations for the first stage */ - n1 = n2; - n2 >>= 2u; - ia1 = 0u; - - for (j = 0; j <= (n2 - 1u); j++) - { - /* index calculation for the coefficients */ - ia2 = ia1 + ia1; - ia3 = ia2 + ia1; - co1 = pCoef[ia1 * 2u]; - si1 = pCoef[(ia1 * 2u) + 1u]; - co2 = pCoef[ia2 * 2u]; - si2 = pCoef[(ia2 * 2u) + 1u]; - co3 = pCoef[ia3 * 2u]; - si3 = pCoef[(ia3 * 2u) + 1u]; - /* Twiddle coefficients index modifier */ - ia1 = ia1 + twidCoefModifier; - - pSi0 = pSrc + 2 * j; - pSi1 = pSi0 + 2 * n2; - pSi2 = pSi1 + 2 * n2; - pSi3 = pSi2 + 2 * n2; - - for (i0 = j; i0 < fftLen; i0 += n1) - { - /* Butterfly implementation */ - /* xa + xc */ - r1 = pSi0[0] + pSi2[0]; - - /* xa - xc */ - r2 = pSi0[0] - pSi2[0]; - - - /* ya + yc */ - s1 = pSi0[1] + pSi2[1]; - - /* ya - yc */ - s2 = pSi0[1] - pSi2[1]; - - - /* xb + xd */ - t1 = pSi1[0] + pSi3[0]; - - - /* xa' = xa + xb + xc + xd */ - pSi0[0] = (r1 + t1) >> 2u; - /* xa + xc -(xb + xd) */ - r1 = r1 - t1; - /* yb + yd */ - t2 = pSi1[1] + pSi3[1]; - - /* ya' = ya + yb + yc + yd */ - pSi0[1] = (s1 + t2) >> 2u; - pSi0 += 2 * n1; - - /* (ya + yc) - (yb + yd) */ - s1 = s1 - t2; - - /* (yb - yd) */ - t1 = pSi1[1] - pSi3[1]; - - /* (xb - xd) */ - t2 = pSi1[0] - pSi3[0]; - - - /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */ - pSi1[0] = (((int32_t) (((q63_t) r1 * co2) >> 32u)) - - ((int32_t) (((q63_t) s1 * si2) >> 32u))) >> 1u; - - /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */ - pSi1[1] = - - (((int32_t) (((q63_t) s1 * co2) >> 32u)) + - ((int32_t) (((q63_t) r1 * si2) >> 32u))) >> 1u; - pSi1 += 2 * n1; - - /* (xa - xc) - (yb - yd) */ - r1 = r2 - t1; - /* (xa - xc) + (yb - yd) */ - r2 = r2 + t1; - - /* (ya - yc) + (xb - xd) */ - s1 = s2 + t2; - /* (ya - yc) - (xb - xd) */ - s2 = s2 - t2; - - /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */ - pSi2[0] = (((int32_t) (((q63_t) r1 * co1) >> 32)) - - ((int32_t) (((q63_t) s1 * si1) >> 32))) >> 1u; - - /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */ - pSi2[1] = (((int32_t) (((q63_t) s1 * co1) >> 32)) + - ((int32_t) (((q63_t) r1 * si1) >> 32))) >> 1u; - pSi2 += 2 * n1; - - /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */ - pSi3[0] = (((int32_t) (((q63_t) r2 * co3) >> 32)) - - ((int32_t) (((q63_t) s2 * si3) >> 32))) >> 1u; - - /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */ - pSi3[1] = (((int32_t) (((q63_t) s2 * co3) >> 32)) + - ((int32_t) (((q63_t) r2 * si3) >> 32))) >> 1u; - pSi3 += 2 * n1; - } - } - twidCoefModifier <<= 2u; - } -#endif - - /* End of Middle stages process */ - - /* data is in 11.21(q21) format for the 1024 point as there are 3 middle stages */ - /* data is in 9.23(q23) format for the 256 point as there are 2 middle stages */ - /* data is in 7.25(q25) format for the 64 point as there are 1 middle stage */ - /* data is in 5.27(q27) format for the 16 point as there are no middle stages */ - - - /* Start of last stage process */ - - - /* Initializations for the last stage */ - j = fftLen >> 2; - ptr1 = &pSrc[0]; - - /* Calculations of last stage */ - do - { -#ifndef ARM_MATH_BIG_ENDIAN - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD64(ptr1)++; - xa = (q31_t) xaya; - ya = (q31_t) (xaya >> 32); - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD64(ptr1)++; - xb = (q31_t) xbyb; - yb = (q31_t) (xbyb >> 32); - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD64(ptr1)++; - xc = (q31_t) xcyc; - yc = (q31_t) (xcyc >> 32); - - /* Read xc (real), yc(imag) input */ - xdyd = *__SIMD64(ptr1)++; - xd = (q31_t) xdyd; - yd = (q31_t) (xdyd >> 32); - -#else - - /* Read xa (real), ya(imag) input */ - xaya = *__SIMD64(ptr1)++; - ya = (q31_t) xaya; - xa = (q31_t) (xaya >> 32); - - /* Read xb (real), yb(imag) input */ - xbyb = *__SIMD64(ptr1)++; - yb = (q31_t) xbyb; - xb = (q31_t) (xbyb >> 32); - - /* Read xc (real), yc(imag) input */ - xcyc = *__SIMD64(ptr1)++; - yc = (q31_t) xcyc; - xc = (q31_t) (xcyc >> 32); - - /* Read xc (real), yc(imag) input */ - xdyd = *__SIMD64(ptr1)++; - yd = (q31_t) xdyd; - xd = (q31_t) (xdyd >> 32); - - -#endif - - /* xa' = xa + xb + xc + xd */ - xa_out = xa + xb + xc + xd; - - /* ya' = ya + yb + yc + yd */ - ya_out = ya + yb + yc + yd; - - /* pointer updation for writing */ - ptr1 = ptr1 - 8u; - - /* writing xa' and ya' */ - *ptr1++ = xa_out; - *ptr1++ = ya_out; - - xc_out = (xa - xb + xc - xd); - yc_out = (ya - yb + yc - yd); - - /* writing xc' and yc' */ - *ptr1++ = xc_out; - *ptr1++ = yc_out; - - xb_out = (xa - yb - xc + yd); - yb_out = (ya + xb - yc - xd); - - /* writing xb' and yb' */ - *ptr1++ = xb_out; - *ptr1++ = yb_out; - - xd_out = (xa + yb - xc - yd); - yd_out = (ya - xb - yc + xd); - - /* writing xd' and yd' */ - *ptr1++ = xd_out; - *ptr1++ = yd_out; - - } while(--j); - - /* output is in 11.21(q21) format for the 1024 point */ - /* output is in 9.23(q23) format for the 256 point */ - /* output is in 7.25(q25) format for the 64 point */ - /* output is in 5.27(q27) format for the 16 point */ - - /* End of last stage process */ -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c deleted file mode 100644 index d811b92..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c +++ /dev/null @@ -1,384 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_radix8_f32.c -* -* Description: Radix-8 Decimation in Frequency CFFT & CIFFT Floating point processing function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** -* @ingroup groupTransforms -*/ - -/** -* @defgroup Radix8_CFFT_CIFFT Radix-8 Complex FFT Functions -* -* \par -* Complex Fast Fourier Transform(CFFT) and Complex Inverse Fast Fourier Transform(CIFFT) is an efficient algorithm to compute Discrete Fourier Transform(DFT) and Inverse Discrete Fourier Transform(IDFT). -* Computational complexity of CFFT reduces drastically when compared to DFT. -* \par -* This set of functions implements CFFT/CIFFT -* for floating-point data types. The functions operates on in-place buffer which uses same buffer for input and output. -* Complex input is stored in input buffer in an interleaved fashion. -* -* \par -* The functions operate on blocks of input and output data and each call to the function processes -* 2*fftLen samples through the transform. pSrc points to In-place arrays containing 2*fftLen values. -* \par -* The pSrc points to the array of in-place buffer of size 2*fftLen and inputs and outputs are stored in an interleaved fashion as shown below. -*
 {real[0], imag[0], real[1], imag[1],..} 
-* -* \par Lengths supported by the transform: -* \par -* Internally, the function utilize a Radix-8 decimation in frequency(DIF) algorithm -* and the size of the FFT supported are of the lengths [ 64, 512, 4096]. -* -* -* \par Algorithm: -* -* Complex Fast Fourier Transform: -* \par -* Input real and imaginary data: -*
    
-* x(n) = xa + j * ya    
-* x(n+N/4 ) = xb + j * yb    
-* x(n+N/2 ) = xc + j * yc    
-* x(n+3N 4) = xd + j * yd    
-* 
-* where N is length of FFT -* \par -* Output real and imaginary data: -*
    
-* X(4r) = xa'+ j * ya'    
-* X(4r+1) = xb'+ j * yb'    
-* X(4r+2) = xc'+ j * yc'    
-* X(4r+3) = xd'+ j * yd'    
-* 
-* \par -* Twiddle factors for Radix-8 FFT: -*
    
-* Wn = co1 + j * (- si1)    
-* W2n = co2 + j * (- si2)    
-* W3n = co3 + j * (- si3)    
-* 
-* -* \par -* \image html CFFT.gif "Radix-8 Decimation-in Frequency Complex Fast Fourier Transform" -* -* \par -* Output from Radix-8 CFFT Results in Digit reversal order. Interchange middle two branches of every butterfly results in Bit reversed output. -* \par -* Butterfly CFFT equations: -*
    
-* xa' = xa + xb + xc + xd    
-* ya' = ya + yb + yc + yd    
-* xc' = (xa+yb-xc-yd)* co1 + (ya-xb-yc+xd)* (si1)    
-* yc' = (ya-xb-yc+xd)* co1 - (xa+yb-xc-yd)* (si1)    
-* xb' = (xa-xb+xc-xd)* co2 + (ya-yb+yc-yd)* (si2)    
-* yb' = (ya-yb+yc-yd)* co2 - (xa-xb+xc-xd)* (si2)    
-* xd' = (xa-yb-xc+yd)* co3 + (ya+xb-yc-xd)* (si3)    
-* yd' = (ya+xb-yc-xd)* co3 - (xa-yb-xc+yd)* (si3)    
-* 
-* -* \par -* where fftLen length of CFFT/CIFFT; ifftFlag Flag for selection of CFFT or CIFFT(Set ifftFlag to calculate CIFFT otherwise calculates CFFT); -* bitReverseFlag Flag for selection of output order(Set bitReverseFlag to output in normal order otherwise output in bit reversed order); -* pTwiddlepoints to array of twiddle coefficients; pBitRevTable points to the array of bit reversal table. -* twidCoefModifier modifier for twiddle factor table which supports all FFT lengths with same table; -* pBitRevTable modifier for bit reversal table which supports all FFT lengths with same table. -* onebyfftLen value of 1/fftLen to calculate CIFFT; -* -* \par Fixed-Point Behavior -* Care must be taken when using the fixed-point versions of the CFFT/CIFFT function. -* Refer to the function specific documentation below for usage guidelines. -*/ - - -/* -* @brief Core function for the floating-point CFFT butterfly process. -* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. -* @param[in] fftLen length of the FFT. -* @param[in] *pCoef points to the twiddle coefficient buffer. -* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -*/ - -void arm_radix8_butterfly_f32( -float32_t * pSrc, -uint16_t fftLen, -const float32_t * pCoef, -uint16_t twidCoefModifier) -{ - uint32_t ia1, ia2, ia3, ia4, ia5, ia6, ia7; - uint32_t i1, i2, i3, i4, i5, i6, i7, i8; - uint32_t id; - uint32_t n1, n2, j; - - float32_t r1, r2, r3, r4, r5, r6, r7, r8; - float32_t t1, t2; - float32_t s1, s2, s3, s4, s5, s6, s7, s8; - float32_t p1, p2, p3, p4; - float32_t co2, co3, co4, co5, co6, co7, co8; - float32_t si2, si3, si4, si5, si6, si7, si8; - const float32_t C81 = 0.70710678118f; - - n2 = fftLen; - - do - { - n1 = n2; - n2 = n2 >> 3; - i1 = 0; - - do - { - i2 = i1 + n2; - i3 = i2 + n2; - i4 = i3 + n2; - i5 = i4 + n2; - i6 = i5 + n2; - i7 = i6 + n2; - i8 = i7 + n2; - r1 = pSrc[2 * i1] + pSrc[2 * i5]; - r5 = pSrc[2 * i1] - pSrc[2 * i5]; - r2 = pSrc[2 * i2] + pSrc[2 * i6]; - r6 = pSrc[2 * i2] - pSrc[2 * i6]; - r3 = pSrc[2 * i3] + pSrc[2 * i7]; - r7 = pSrc[2 * i3] - pSrc[2 * i7]; - r4 = pSrc[2 * i4] + pSrc[2 * i8]; - r8 = pSrc[2 * i4] - pSrc[2 * i8]; - t1 = r1 - r3; - r1 = r1 + r3; - r3 = r2 - r4; - r2 = r2 + r4; - pSrc[2 * i1] = r1 + r2; - pSrc[2 * i5] = r1 - r2; - r1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1]; - s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1]; - r2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1]; - s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1]; - s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1]; - s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1]; - r4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1]; - s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1]; - t2 = r1 - s3; - r1 = r1 + s3; - s3 = r2 - r4; - r2 = r2 + r4; - pSrc[2 * i1 + 1] = r1 + r2; - pSrc[2 * i5 + 1] = r1 - r2; - pSrc[2 * i3] = t1 + s3; - pSrc[2 * i7] = t1 - s3; - pSrc[2 * i3 + 1] = t2 - r3; - pSrc[2 * i7 + 1] = t2 + r3; - r1 = (r6 - r8) * C81; - r6 = (r6 + r8) * C81; - r2 = (s6 - s8) * C81; - s6 = (s6 + s8) * C81; - t1 = r5 - r1; - r5 = r5 + r1; - r8 = r7 - r6; - r7 = r7 + r6; - t2 = s5 - r2; - s5 = s5 + r2; - s8 = s7 - s6; - s7 = s7 + s6; - pSrc[2 * i2] = r5 + s7; - pSrc[2 * i8] = r5 - s7; - pSrc[2 * i6] = t1 + s8; - pSrc[2 * i4] = t1 - s8; - pSrc[2 * i2 + 1] = s5 - r7; - pSrc[2 * i8 + 1] = s5 + r7; - pSrc[2 * i6 + 1] = t2 - r8; - pSrc[2 * i4 + 1] = t2 + r8; - - i1 += n1; - } while(i1 < fftLen); - - if(n2 < 8) - break; - - ia1 = 0; - j = 1; - - do - { - /* index calculation for the coefficients */ - id = ia1 + twidCoefModifier; - ia1 = id; - ia2 = ia1 + id; - ia3 = ia2 + id; - ia4 = ia3 + id; - ia5 = ia4 + id; - ia6 = ia5 + id; - ia7 = ia6 + id; - - co2 = pCoef[2 * ia1]; - co3 = pCoef[2 * ia2]; - co4 = pCoef[2 * ia3]; - co5 = pCoef[2 * ia4]; - co6 = pCoef[2 * ia5]; - co7 = pCoef[2 * ia6]; - co8 = pCoef[2 * ia7]; - si2 = pCoef[2 * ia1 + 1]; - si3 = pCoef[2 * ia2 + 1]; - si4 = pCoef[2 * ia3 + 1]; - si5 = pCoef[2 * ia4 + 1]; - si6 = pCoef[2 * ia5 + 1]; - si7 = pCoef[2 * ia6 + 1]; - si8 = pCoef[2 * ia7 + 1]; - - i1 = j; - - do - { - /* index calculation for the input */ - i2 = i1 + n2; - i3 = i2 + n2; - i4 = i3 + n2; - i5 = i4 + n2; - i6 = i5 + n2; - i7 = i6 + n2; - i8 = i7 + n2; - r1 = pSrc[2 * i1] + pSrc[2 * i5]; - r5 = pSrc[2 * i1] - pSrc[2 * i5]; - r2 = pSrc[2 * i2] + pSrc[2 * i6]; - r6 = pSrc[2 * i2] - pSrc[2 * i6]; - r3 = pSrc[2 * i3] + pSrc[2 * i7]; - r7 = pSrc[2 * i3] - pSrc[2 * i7]; - r4 = pSrc[2 * i4] + pSrc[2 * i8]; - r8 = pSrc[2 * i4] - pSrc[2 * i8]; - t1 = r1 - r3; - r1 = r1 + r3; - r3 = r2 - r4; - r2 = r2 + r4; - pSrc[2 * i1] = r1 + r2; - r2 = r1 - r2; - s1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1]; - s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1]; - s2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1]; - s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1]; - s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1]; - s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1]; - s4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1]; - s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1]; - t2 = s1 - s3; - s1 = s1 + s3; - s3 = s2 - s4; - s2 = s2 + s4; - r1 = t1 + s3; - t1 = t1 - s3; - pSrc[2 * i1 + 1] = s1 + s2; - s2 = s1 - s2; - s1 = t2 - r3; - t2 = t2 + r3; - p1 = co5 * r2; - p2 = si5 * s2; - p3 = co5 * s2; - p4 = si5 * r2; - pSrc[2 * i5] = p1 + p2; - pSrc[2 * i5 + 1] = p3 - p4; - p1 = co3 * r1; - p2 = si3 * s1; - p3 = co3 * s1; - p4 = si3 * r1; - pSrc[2 * i3] = p1 + p2; - pSrc[2 * i3 + 1] = p3 - p4; - p1 = co7 * t1; - p2 = si7 * t2; - p3 = co7 * t2; - p4 = si7 * t1; - pSrc[2 * i7] = p1 + p2; - pSrc[2 * i7 + 1] = p3 - p4; - r1 = (r6 - r8) * C81; - r6 = (r6 + r8) * C81; - s1 = (s6 - s8) * C81; - s6 = (s6 + s8) * C81; - t1 = r5 - r1; - r5 = r5 + r1; - r8 = r7 - r6; - r7 = r7 + r6; - t2 = s5 - s1; - s5 = s5 + s1; - s8 = s7 - s6; - s7 = s7 + s6; - r1 = r5 + s7; - r5 = r5 - s7; - r6 = t1 + s8; - t1 = t1 - s8; - s1 = s5 - r7; - s5 = s5 + r7; - s6 = t2 - r8; - t2 = t2 + r8; - p1 = co2 * r1; - p2 = si2 * s1; - p3 = co2 * s1; - p4 = si2 * r1; - pSrc[2 * i2] = p1 + p2; - pSrc[2 * i2 + 1] = p3 - p4; - p1 = co8 * r5; - p2 = si8 * s5; - p3 = co8 * s5; - p4 = si8 * r5; - pSrc[2 * i8] = p1 + p2; - pSrc[2 * i8 + 1] = p3 - p4; - p1 = co6 * r6; - p2 = si6 * s6; - p3 = co6 * s6; - p4 = si6 * r6; - pSrc[2 * i6] = p1 + p2; - pSrc[2 * i6 + 1] = p3 - p4; - p1 = co4 * t1; - p2 = si4 * t2; - p3 = co4 * t2; - p4 = si4 * t1; - pSrc[2 * i4] = p1 + p2; - pSrc[2 * i4 + 1] = p3 - p4; - - i1 += n1; - } while(i1 < fftLen); - - j++; - } while(j < n2); - - twidCoefModifier <<= 3; - } while(n2 > 7); -} - -/** -* @} end of Radix8_CFFT_CIFFT group -*/ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c deleted file mode 100644 index 91149cc..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c +++ /dev/null @@ -1,461 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_f32.c -* -* Description: Processing function of DCT4 & IDCT4 F32. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @defgroup DCT4_IDCT4 DCT Type IV Functions - * Representation of signals by minimum number of values is important for storage and transmission. - * The possibility of large discontinuity between the beginning and end of a period of a signal - * in DFT can be avoided by extending the signal so that it is even-symmetric. - * Discrete Cosine Transform (DCT) is constructed such that its energy is heavily concentrated in the lower part of the - * spectrum and is very widely used in signal and image coding applications. - * The family of DCTs (DCT type- 1,2,3,4) is the outcome of different combinations of homogeneous boundary conditions. - * DCT has an excellent energy-packing capability, hence has many applications and in data compression in particular. - * - * DCT is essentially the Discrete Fourier Transform(DFT) of an even-extended real signal. - * Reordering of the input data makes the computation of DCT just a problem of - * computing the DFT of a real signal with a few additional operations. - * This approach provides regular, simple, and very efficient DCT algorithms for practical hardware and software implementations. - * - * DCT type-II can be implemented using Fast fourier transform (FFT) internally, as the transform is applied on real values, Real FFT can be used. - * DCT4 is implemented using DCT2 as their implementations are similar except with some added pre-processing and post-processing. - * DCT2 implementation can be described in the following steps: - * - Re-ordering input - * - Calculating Real FFT - * - Multiplication of weights and Real FFT output and getting real part from the product. - * - * This process is explained by the block diagram below: - * \image html DCT4.gif "Discrete Cosine Transform - type-IV" - * - * \par Algorithm: - * The N-point type-IV DCT is defined as a real, linear transformation by the formula: - * \image html DCT4Equation.gif - * where k = 0,1,2,.....N-1 - *\par - * Its inverse is defined as follows: - * \image html IDCT4Equation.gif - * where n = 0,1,2,.....N-1 - *\par - * The DCT4 matrices become involutory (i.e. they are self-inverse) by multiplying with an overall scale factor of sqrt(2/N). - * The symmetry of the transform matrix indicates that the fast algorithms for the forward - * and inverse transform computation are identical. - * Note that the implementation of Inverse DCT4 and DCT4 is same, hence same process function can be used for both. - * - * \par Lengths supported by the transform: - * As DCT4 internally uses Real FFT, it supports all the lengths supported by arm_rfft_f32(). - * The library provides separate functions for Q15, Q31, and floating-point data types. - * \par Instance Structure - * The instances for Real FFT and FFT, cosine values table and twiddle factor table are stored in an instance data structure. - * A separate instance structure must be defined for each transform. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Initializes Real FFT as its process function is used internally in DCT4, by calling arm_rfft_init_f32(). - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. - * To place an instance structure into a const data section, the instance structure must be manually initialized. - * Manually initialize the instance structure as follows: - *
    
- *arm_dct4_instance_f32 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};    
- *arm_dct4_instance_q31 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};   
- *arm_dct4_instance_q15 S = {N, Nby2, normalize, pTwiddle, pCosFactor, pRfft, pCfft};   
- * 
- * where \c N is the length of the DCT4; \c Nby2 is half of the length of the DCT4; - * \c normalize is normalizing factor used and is equal to sqrt(2/N); - * \c pTwiddle points to the twiddle factor table; - * \c pCosFactor points to the cosFactor table; - * \c pRfft points to the real FFT instance; - * \c pCfft points to the complex FFT instance; - * The CFFT and RFFT structures also needs to be initialized, refer to arm_cfft_radix4_f32() - * and arm_rfft_f32() respectively for details regarding static initialization. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the DCT4 transform functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - -void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer) -{ - uint32_t i; /* Loop counter */ - float32_t *weights = S->pTwiddle; /* Pointer to the Weights table */ - float32_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ - float32_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ - float32_t in; /* Temporary variable */ - - - /* DCT4 computation involves DCT2 (which is calculated using RFFT) - * along with some pre-processing and post-processing. - * Computational procedure is explained as follows: - * (a) Pre-processing involves multiplying input with cos factor, - * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) - * where, - * r(n) -- output of preprocessing - * u(n) -- input to preprocessing(actual Source buffer) - * (b) Calculation of DCT2 using FFT is divided into three steps: - * Step1: Re-ordering of even and odd elements of input. - * Step2: Calculating FFT of the re-ordered input. - * Step3: Taking the real part of the product of FFT output and weights. - * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * where, - * Y4 -- DCT4 output, Y2 -- DCT2 output - * (d) Multiplying the output with the normalizing factor sqrt(2/N). - */ - - /*-------- Pre-processing ------------*/ - /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ - arm_scale_f32(pInlineBuffer, 2.0f, pInlineBuffer, S->N); - arm_mult_f32(pInlineBuffer, cosFact, pInlineBuffer, S->N); - - /* ---------------------------------------------------------------- - * Step1: Re-ordering of even and odd elements as, - * pState[i] = pInlineBuffer[2*i] and - * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 - ---------------------------------------------------------------------*/ - - /* pS1 initialized to pState */ - pS1 = pState; - - /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ - pS2 = pState + (S->N - 1u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ - i = (uint32_t) S->Nby2 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = (uint32_t) S->N >> 2u; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. - * Compute 4 outputs at a time */ - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_f32(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_f32(pState, weights, pState, S->N); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ - i = ((uint32_t) S->N - 1u) >> 2u; - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ * (float32_t) 0.5; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - i = ((uint32_t) S->N - 1u) % 0x4u; - - while(i > 0u) - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - /* Decrement the loop counter */ - i--; - } - - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = (uint32_t) S->N >> 2u; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = in * S->normalize; - - in = *pbuff; - *pbuff++ = in * S->normalize; - - in = *pbuff; - *pbuff++ = in * S->normalize; - - in = *pbuff; - *pbuff++ = in * S->normalize; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initializing the loop counter to N/2 */ - i = (uint32_t) S->Nby2; - - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter */ - i = (uint32_t) S->N; - - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_f32(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_f32(pState, weights, pState, S->N); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ * (float32_t) 0.5; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - /* Initializing the loop counter */ - i = ((uint32_t) S->N - 1u); - - do - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter */ - i = (uint32_t) S->N; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = in * S->normalize; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c deleted file mode 100644 index 8422a30..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c +++ /dev/null @@ -1,16519 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_init_f32.c -* -* Description: Initialization function of DCT-4 & IDCT4 F32 -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/* -* @brief Weights Table -*/ - -/** -* \par -* Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
-* \par -* C command to generate the table -*
    
-* for(i = 0; i< N; i++)    
-* {    
-*    weights[2*i]= cos(i*c);    
-*    weights[(2*i)+1]= -sin(i * c);    
-* } 
-* \par -* Where N is the Number of weights to be calculated and c is pi/(2*N) -* \par -* In the tables below the real and imaginary values are placed alternatively, hence the -* array length is 2*N. -*/ - -static const float32_t Weights_128[256] = { - 1.000000000000000000f, 0.000000000000000000f, 0.999924701839144500f, - -0.012271538285719925f, - 0.999698818696204250f, -0.024541228522912288f, 0.999322384588349540f, - -0.036807222941358832f, - 0.998795456205172410f, -0.049067674327418015f, 0.998118112900149180f, - -0.061320736302208578f, - 0.997290456678690210f, -0.073564563599667426f, 0.996312612182778000f, - -0.085797312344439894f, - 0.995184726672196930f, -0.098017140329560604f, 0.993906970002356060f, - -0.110222207293883060f, - 0.992479534598709970f, -0.122410675199216200f, 0.990902635427780010f, - -0.134580708507126170f, - 0.989176509964781010f, -0.146730474455361750f, 0.987301418157858430f, - -0.158858143333861450f, - 0.985277642388941220f, -0.170961888760301220f, 0.983105487431216290f, - -0.183039887955140950f, - 0.980785280403230430f, -0.195090322016128250f, 0.978317370719627650f, - -0.207111376192218560f, - 0.975702130038528570f, -0.219101240156869800f, 0.972939952205560180f, - -0.231058108280671110f, - 0.970031253194543970f, -0.242980179903263870f, 0.966976471044852070f, - -0.254865659604514570f, - 0.963776065795439840f, -0.266712757474898370f, 0.960430519415565790f, - -0.278519689385053060f, - 0.956940335732208820f, -0.290284677254462330f, 0.953306040354193860f, - -0.302005949319228080f, - 0.949528180593036670f, -0.313681740398891520f, 0.945607325380521280f, - -0.325310292162262930f, - 0.941544065183020810f, -0.336889853392220050f, 0.937339011912574960f, - -0.348418680249434560f, - 0.932992798834738960f, -0.359895036534988110f, 0.928506080473215590f, - -0.371317193951837540f, - 0.923879532511286740f, -0.382683432365089780f, 0.919113851690057770f, - -0.393992040061048100f, - 0.914209755703530690f, -0.405241314004989860f, 0.909167983090522380f, - -0.416429560097637150f, - 0.903989293123443340f, -0.427555093430282080f, 0.898674465693953820f, - -0.438616238538527660f, - 0.893224301195515320f, -0.449611329654606540f, 0.887639620402853930f, - -0.460538710958240010f, - 0.881921264348355050f, -0.471396736825997640f, 0.876070094195406600f, - -0.482183772079122720f, - 0.870086991108711460f, -0.492898192229784040f, 0.863972856121586810f, - -0.503538383725717580f, - 0.857728610000272120f, -0.514102744193221660f, 0.851355193105265200f, - -0.524589682678468950f, - 0.844853565249707120f, -0.534997619887097150f, 0.838224705554838080f, - -0.545324988422046460f, - 0.831469612302545240f, -0.555570233019602180f, 0.824589302785025290f, - -0.565731810783613120f, - 0.817584813151583710f, -0.575808191417845340f, 0.810457198252594770f, - -0.585797857456438860f, - 0.803207531480644940f, -0.595699304492433360f, 0.795836904608883570f, - -0.605511041404325550f, - 0.788346427626606340f, -0.615231590580626820f, 0.780737228572094490f, - -0.624859488142386340f, - 0.773010453362736990f, -0.634393284163645490f, 0.765167265622458960f, - -0.643831542889791390f, - 0.757208846506484570f, -0.653172842953776760f, 0.749136394523459370f, - -0.662415777590171780f, - 0.740951125354959110f, -0.671558954847018330f, 0.732654271672412820f, - -0.680600997795453020f, - 0.724247082951467000f, -0.689540544737066830f, 0.715730825283818590f, - -0.698376249408972920f, - 0.707106781186547570f, -0.707106781186547460f, 0.698376249408972920f, - -0.715730825283818590f, - 0.689540544737066940f, -0.724247082951466890f, 0.680600997795453130f, - -0.732654271672412820f, - 0.671558954847018330f, -0.740951125354959110f, 0.662415777590171780f, - -0.749136394523459260f, - 0.653172842953776760f, -0.757208846506484460f, 0.643831542889791500f, - -0.765167265622458960f, - 0.634393284163645490f, -0.773010453362736990f, 0.624859488142386450f, - -0.780737228572094380f, - 0.615231590580626820f, -0.788346427626606230f, 0.605511041404325550f, - -0.795836904608883460f, - 0.595699304492433470f, -0.803207531480644830f, 0.585797857456438860f, - -0.810457198252594770f, - 0.575808191417845340f, -0.817584813151583710f, 0.565731810783613230f, - -0.824589302785025290f, - 0.555570233019602290f, -0.831469612302545240f, 0.545324988422046460f, - -0.838224705554837970f, - 0.534997619887097260f, -0.844853565249707010f, 0.524589682678468840f, - -0.851355193105265200f, - 0.514102744193221660f, -0.857728610000272120f, 0.503538383725717580f, - -0.863972856121586700f, - 0.492898192229784090f, -0.870086991108711350f, 0.482183772079122830f, - -0.876070094195406600f, - 0.471396736825997810f, -0.881921264348354940f, 0.460538710958240010f, - -0.887639620402853930f, - 0.449611329654606600f, -0.893224301195515320f, 0.438616238538527710f, - -0.898674465693953820f, - 0.427555093430282200f, -0.903989293123443340f, 0.416429560097637320f, - -0.909167983090522270f, - 0.405241314004989860f, -0.914209755703530690f, 0.393992040061048100f, - -0.919113851690057770f, - 0.382683432365089840f, -0.923879532511286740f, 0.371317193951837600f, - -0.928506080473215480f, - 0.359895036534988280f, -0.932992798834738850f, 0.348418680249434510f, - -0.937339011912574960f, - 0.336889853392220050f, -0.941544065183020810f, 0.325310292162262980f, - -0.945607325380521280f, - 0.313681740398891570f, -0.949528180593036670f, 0.302005949319228200f, - -0.953306040354193750f, - 0.290284677254462330f, -0.956940335732208940f, 0.278519689385053060f, - -0.960430519415565790f, - 0.266712757474898420f, -0.963776065795439840f, 0.254865659604514630f, - -0.966976471044852070f, - 0.242980179903263980f, -0.970031253194543970f, 0.231058108280671280f, - -0.972939952205560070f, - 0.219101240156869770f, -0.975702130038528570f, 0.207111376192218560f, - -0.978317370719627650f, - 0.195090322016128330f, -0.980785280403230430f, 0.183039887955141060f, - -0.983105487431216290f, - 0.170961888760301360f, -0.985277642388941220f, 0.158858143333861390f, - -0.987301418157858430f, - 0.146730474455361750f, -0.989176509964781010f, 0.134580708507126220f, - -0.990902635427780010f, - 0.122410675199216280f, -0.992479534598709970f, 0.110222207293883180f, - -0.993906970002356060f, - 0.098017140329560770f, -0.995184726672196820f, 0.085797312344439880f, - -0.996312612182778000f, - 0.073564563599667454f, -0.997290456678690210f, 0.061320736302208648f, - -0.998118112900149180f, - 0.049067674327418126f, -0.998795456205172410f, 0.036807222941358991f, - -0.999322384588349540f, - 0.024541228522912264f, -0.999698818696204250f, 0.012271538285719944f, - -0.999924701839144500f -}; - -static const float32_t Weights_512[1024] = { - 1.000000000000000000f, 0.000000000000000000f, 0.999995293809576190f, - -0.003067956762965976f, - 0.999981175282601110f, -0.006135884649154475f, 0.999957644551963900f, - -0.009203754782059819f, - 0.999924701839144500f, -0.012271538285719925f, 0.999882347454212560f, - -0.015339206284988100f, - 0.999830581795823400f, -0.018406729905804820f, 0.999769405351215280f, - -0.021474080275469508f, - 0.999698818696204250f, -0.024541228522912288f, 0.999618822495178640f, - -0.027608145778965740f, - 0.999529417501093140f, -0.030674803176636626f, 0.999430604555461730f, - -0.033741171851377580f, - 0.999322384588349540f, -0.036807222941358832f, 0.999204758618363890f, - -0.039872927587739811f, - 0.999077727752645360f, -0.042938256934940820f, 0.998941293186856870f, - -0.046003182130914623f, - 0.998795456205172410f, -0.049067674327418015f, 0.998640218180265270f, - -0.052131704680283324f, - 0.998475580573294770f, -0.055195244349689934f, 0.998301544933892890f, - -0.058258264500435752f, - 0.998118112900149180f, -0.061320736302208578f, 0.997925286198596000f, - -0.064382630929857465f, - 0.997723066644191640f, -0.067443919563664051f, 0.997511456140303450f, - -0.070504573389613856f, - 0.997290456678690210f, -0.073564563599667426f, 0.997060070339482960f, - -0.076623861392031492f, - 0.996820299291165670f, -0.079682437971430126f, 0.996571145790554840f, - -0.082740264549375692f, - 0.996312612182778000f, -0.085797312344439894f, 0.996044700901251970f, - -0.088853552582524600f, - 0.995767414467659820f, -0.091908956497132724f, 0.995480755491926940f, - -0.094963495329638992f, - 0.995184726672196930f, -0.098017140329560604f, 0.994879330794805620f, - -0.101069862754827820f, - 0.994564570734255420f, -0.104121633872054590f, 0.994240449453187900f, - -0.107172424956808840f, - 0.993906970002356060f, -0.110222207293883060f, 0.993564135520595300f, - -0.113270952177564350f, - 0.993211949234794500f, -0.116318630911904750f, 0.992850414459865100f, - -0.119365214810991350f, - 0.992479534598709970f, -0.122410675199216200f, 0.992099313142191800f, - -0.125454983411546230f, - 0.991709753669099530f, -0.128498110793793170f, 0.991310859846115440f, - -0.131540028702883120f, - 0.990902635427780010f, -0.134580708507126170f, 0.990485084256457090f, - -0.137620121586486040f, - 0.990058210262297120f, -0.140658239332849210f, 0.989622017463200890f, - -0.143695033150294470f, - 0.989176509964781010f, -0.146730474455361750f, 0.988721691960323780f, - -0.149764534677321510f, - 0.988257567730749460f, -0.152797185258443440f, 0.987784141644572180f, - -0.155828397654265230f, - 0.987301418157858430f, -0.158858143333861450f, 0.986809401814185530f, - -0.161886393780111830f, - 0.986308097244598670f, -0.164913120489969890f, 0.985797509167567480f, - -0.167938294974731170f, - 0.985277642388941220f, -0.170961888760301220f, 0.984748501801904210f, - -0.173983873387463820f, - 0.984210092386929030f, -0.177004220412148750f, 0.983662419211730250f, - -0.180022901405699510f, - 0.983105487431216290f, -0.183039887955140950f, 0.982539302287441240f, - -0.186055151663446630f, - 0.981963869109555240f, -0.189068664149806190f, 0.981379193313754560f, - -0.192080397049892440f, - 0.980785280403230430f, -0.195090322016128250f, 0.980182135968117430f, - -0.198098410717953560f, - 0.979569765685440520f, -0.201104634842091900f, 0.978948175319062200f, - -0.204108966092816870f, - 0.978317370719627650f, -0.207111376192218560f, 0.977677357824509930f, - -0.210111836880469610f, - 0.977028142657754390f, -0.213110319916091360f, 0.976369731330021140f, - -0.216106797076219520f, - 0.975702130038528570f, -0.219101240156869800f, 0.975025345066994120f, - -0.222093620973203510f, - 0.974339382785575860f, -0.225083911359792830f, 0.973644249650811980f, - -0.228072083170885730f, - 0.972939952205560180f, -0.231058108280671110f, 0.972226497078936270f, - -0.234041958583543430f, - 0.971503890986251780f, -0.237023605994367200f, 0.970772140728950350f, - -0.240003022448741500f, - 0.970031253194543970f, -0.242980179903263870f, 0.969281235356548530f, - -0.245955050335794590f, - 0.968522094274417380f, -0.248927605745720150f, 0.967753837093475510f, - -0.251897818154216970f, - 0.966976471044852070f, -0.254865659604514570f, 0.966190003445412500f, - -0.257831102162158990f, - 0.965394441697689400f, -0.260794117915275510f, 0.964589793289812760f, - -0.263754678974831350f, - 0.963776065795439840f, -0.266712757474898370f, 0.962953266873683880f, - -0.269668325572915090f, - 0.962121404269041580f, -0.272621355449948980f, 0.961280485811320640f, - -0.275571819310958140f, - 0.960430519415565790f, -0.278519689385053060f, 0.959571513081984520f, - -0.281464937925757940f, - 0.958703474895871600f, -0.284407537211271880f, 0.957826413027532910f, - -0.287347459544729510f, - 0.956940335732208820f, -0.290284677254462330f, 0.956045251349996410f, - -0.293219162694258630f, - 0.955141168305770780f, -0.296150888243623790f, 0.954228095109105670f, - -0.299079826308040480f, - 0.953306040354193860f, -0.302005949319228080f, 0.952375012719765880f, - -0.304929229735402370f, - 0.951435020969008340f, -0.307849640041534870f, 0.950486073949481700f, - -0.310767152749611470f, - 0.949528180593036670f, -0.313681740398891520f, 0.948561349915730270f, - -0.316593375556165850f, - 0.947585591017741090f, -0.319502030816015690f, 0.946600913083283530f, - -0.322407678801069850f, - 0.945607325380521280f, -0.325310292162262930f, 0.944604837261480260f, - -0.328209843579092500f, - 0.943593458161960390f, -0.331106305759876430f, 0.942573197601446870f, - -0.333999651442009380f, - 0.941544065183020810f, -0.336889853392220050f, 0.940506070593268300f, - -0.339776884406826850f, - 0.939459223602189920f, -0.342660717311994380f, 0.938403534063108060f, - -0.345541324963989090f, - 0.937339011912574960f, -0.348418680249434560f, 0.936265667170278260f, - -0.351292756085567090f, - 0.935183509938947610f, -0.354163525420490340f, 0.934092550404258980f, - -0.357030961233429980f, - 0.932992798834738960f, -0.359895036534988110f, 0.931884265581668150f, - -0.362755724367397230f, - 0.930766961078983710f, -0.365612997804773850f, 0.929640895843181330f, - -0.368466829953372320f, - 0.928506080473215590f, -0.371317193951837540f, 0.927362525650401110f, - -0.374164062971457930f, - 0.926210242138311380f, -0.377007410216418260f, 0.925049240782677580f, - -0.379847208924051160f, - 0.923879532511286740f, -0.382683432365089780f, 0.922701128333878630f, - -0.385516053843918850f, - 0.921514039342042010f, -0.388345046698826250f, 0.920318276709110590f, - -0.391170384302253870f, - 0.919113851690057770f, -0.393992040061048100f, 0.917900775621390500f, - -0.396809987416710310f, - 0.916679059921042700f, -0.399624199845646790f, 0.915448716088267830f, - -0.402434650859418430f, - 0.914209755703530690f, -0.405241314004989860f, 0.912962190428398210f, - -0.408044162864978690f, - 0.911706032005429880f, -0.410843171057903910f, 0.910441292258067250f, - -0.413638312238434500f, - 0.909167983090522380f, -0.416429560097637150f, 0.907886116487666260f, - -0.419216888363223910f, - 0.906595704514915330f, -0.422000270799799680f, 0.905296759318118820f, - -0.424779681209108810f, - 0.903989293123443340f, -0.427555093430282080f, 0.902673318237258830f, - -0.430326481340082610f, - 0.901348847046022030f, -0.433093818853151960f, 0.900015892016160280f, - -0.435857079922255470f, - 0.898674465693953820f, -0.438616238538527660f, 0.897324580705418320f, - -0.441371268731716670f, - 0.895966249756185220f, -0.444122144570429200f, 0.894599485631382700f, - -0.446868840162374160f, - 0.893224301195515320f, -0.449611329654606540f, 0.891840709392342720f, - -0.452349587233770890f, - 0.890448723244757880f, -0.455083587126343840f, 0.889048355854664570f, - -0.457813303598877170f, - 0.887639620402853930f, -0.460538710958240010f, 0.886222530148880640f, - -0.463259783551860150f, - 0.884797098430937790f, -0.465976495767966180f, 0.883363338665731580f, - -0.468688822035827900f, - 0.881921264348355050f, -0.471396736825997640f, 0.880470889052160750f, - -0.474100214650549970f, - 0.879012226428633530f, -0.476799230063322090f, 0.877545290207261350f, - -0.479493757660153010f, - 0.876070094195406600f, -0.482183772079122720f, 0.874586652278176110f, - -0.484869248000791060f, - 0.873094978418290090f, -0.487550160148436000f, 0.871595086655950980f, - -0.490226483288291160f, - 0.870086991108711460f, -0.492898192229784040f, 0.868570705971340900f, - -0.495565261825772540f, - 0.867046245515692650f, -0.498227666972781870f, 0.865513624090569090f, - -0.500885382611240710f, - 0.863972856121586810f, -0.503538383725717580f, 0.862423956111040610f, - -0.506186645345155230f, - 0.860866938637767310f, -0.508830142543106990f, 0.859301818357008470f, - -0.511468850437970300f, - 0.857728610000272120f, -0.514102744193221660f, 0.856147328375194470f, - -0.516731799017649870f, - 0.854557988365400530f, -0.519355990165589640f, 0.852960604930363630f, - -0.521975292937154390f, - 0.851355193105265200f, -0.524589682678468950f, 0.849741768000852550f, - -0.527199134781901280f, - 0.848120344803297230f, -0.529803624686294610f, 0.846490938774052130f, - -0.532403127877197900f, - 0.844853565249707120f, -0.534997619887097150f, 0.843208239641845440f, - -0.537587076295645390f, - 0.841554977436898440f, -0.540171472729892850f, 0.839893794195999520f, - -0.542750784864515890f, - 0.838224705554838080f, -0.545324988422046460f, 0.836547727223512010f, - -0.547894059173100190f, - 0.834862874986380010f, -0.550457972936604810f, 0.833170164701913190f, - -0.553016705580027470f, - 0.831469612302545240f, -0.555570233019602180f, 0.829761233794523050f, - -0.558118531220556100f, - 0.828045045257755800f, -0.560661576197336030f, 0.826321062845663530f, - -0.563199344013834090f, - 0.824589302785025290f, -0.565731810783613120f, 0.822849781375826430f, - -0.568258952670131490f, - 0.821102514991104650f, -0.570780745886967260f, 0.819347520076796900f, - -0.573297166698042200f, - 0.817584813151583710f, -0.575808191417845340f, 0.815814410806733780f, - -0.578313796411655590f, - 0.814036329705948410f, -0.580813958095764530f, 0.812250586585203880f, - -0.583308652937698290f, - 0.810457198252594770f, -0.585797857456438860f, 0.808656181588174980f, - -0.588281548222645220f, - 0.806847553543799330f, -0.590759701858874160f, 0.805031331142963660f, - -0.593232295039799800f, - 0.803207531480644940f, -0.595699304492433360f, 0.801376171723140240f, - -0.598160706996342270f, - 0.799537269107905010f, -0.600616479383868970f, 0.797690840943391160f, - -0.603066598540348160f, - 0.795836904608883570f, -0.605511041404325550f, 0.793975477554337170f, - -0.607949784967773630f, - 0.792106577300212390f, -0.610382806276309480f, 0.790230221437310030f, - -0.612810082429409710f, - 0.788346427626606340f, -0.615231590580626820f, 0.786455213599085770f, - -0.617647307937803870f, - 0.784556597155575240f, -0.620057211763289100f, 0.782650596166575730f, - -0.622461279374149970f, - 0.780737228572094490f, -0.624859488142386340f, 0.778816512381475980f, - -0.627251815495144080f, - 0.776888465673232440f, -0.629638238914926980f, 0.774953106594873930f, - -0.632018735939809060f, - 0.773010453362736990f, -0.634393284163645490f, 0.771060524261813820f, - -0.636761861236284200f, - 0.769103337645579700f, -0.639124444863775730f, 0.767138911935820400f, - -0.641481012808583160f, - 0.765167265622458960f, -0.643831542889791390f, 0.763188417263381270f, - -0.646176012983316280f, - 0.761202385484261780f, -0.648514401022112440f, 0.759209188978388070f, - -0.650846684996380880f, - 0.757208846506484570f, -0.653172842953776760f, 0.755201376896536550f, - -0.655492852999615350f, - 0.753186799043612520f, -0.657806693297078640f, 0.751165131909686480f, - -0.660114342067420480f, - 0.749136394523459370f, -0.662415777590171780f, 0.747100605980180130f, - -0.664710978203344790f, - 0.745057785441466060f, -0.666999922303637470f, 0.743007952135121720f, - -0.669282588346636010f, - 0.740951125354959110f, -0.671558954847018330f, 0.738887324460615110f, - -0.673829000378756040f, - 0.736816568877369900f, -0.676092703575315920f, 0.734738878095963500f, - -0.678350043129861470f, - 0.732654271672412820f, -0.680600997795453020f, 0.730562769227827590f, - -0.682845546385248080f, - 0.728464390448225200f, -0.685083667772700360f, 0.726359155084346010f, - -0.687315340891759050f, - 0.724247082951467000f, -0.689540544737066830f, 0.722128193929215350f, - -0.691759258364157750f, - 0.720002507961381650f, -0.693971460889654000f, 0.717870045055731710f, - -0.696177131491462990f, - 0.715730825283818590f, -0.698376249408972920f, 0.713584868780793640f, - -0.700568793943248340f, - 0.711432195745216430f, -0.702754744457225300f, 0.709272826438865690f, - -0.704934080375904880f, - 0.707106781186547570f, -0.707106781186547460f, 0.704934080375904990f, - -0.709272826438865580f, - 0.702754744457225300f, -0.711432195745216430f, 0.700568793943248450f, - -0.713584868780793520f, - 0.698376249408972920f, -0.715730825283818590f, 0.696177131491462990f, - -0.717870045055731710f, - 0.693971460889654000f, -0.720002507961381650f, 0.691759258364157750f, - -0.722128193929215350f, - 0.689540544737066940f, -0.724247082951466890f, 0.687315340891759160f, - -0.726359155084346010f, - 0.685083667772700360f, -0.728464390448225200f, 0.682845546385248080f, - -0.730562769227827590f, - 0.680600997795453130f, -0.732654271672412820f, 0.678350043129861580f, - -0.734738878095963390f, - 0.676092703575316030f, -0.736816568877369790f, 0.673829000378756150f, - -0.738887324460615110f, - 0.671558954847018330f, -0.740951125354959110f, 0.669282588346636010f, - -0.743007952135121720f, - 0.666999922303637470f, -0.745057785441465950f, 0.664710978203344900f, - -0.747100605980180130f, - 0.662415777590171780f, -0.749136394523459260f, 0.660114342067420480f, - -0.751165131909686370f, - 0.657806693297078640f, -0.753186799043612410f, 0.655492852999615460f, - -0.755201376896536550f, - 0.653172842953776760f, -0.757208846506484460f, 0.650846684996380990f, - -0.759209188978387960f, - 0.648514401022112550f, -0.761202385484261780f, 0.646176012983316390f, - -0.763188417263381270f, - 0.643831542889791500f, -0.765167265622458960f, 0.641481012808583160f, - -0.767138911935820400f, - 0.639124444863775730f, -0.769103337645579590f, 0.636761861236284200f, - -0.771060524261813710f, - 0.634393284163645490f, -0.773010453362736990f, 0.632018735939809060f, - -0.774953106594873820f, - 0.629638238914927100f, -0.776888465673232440f, 0.627251815495144190f, - -0.778816512381475870f, - 0.624859488142386450f, -0.780737228572094380f, 0.622461279374150080f, - -0.782650596166575730f, - 0.620057211763289210f, -0.784556597155575240f, 0.617647307937803980f, - -0.786455213599085770f, - 0.615231590580626820f, -0.788346427626606230f, 0.612810082429409710f, - -0.790230221437310030f, - 0.610382806276309480f, -0.792106577300212390f, 0.607949784967773740f, - -0.793975477554337170f, - 0.605511041404325550f, -0.795836904608883460f, 0.603066598540348280f, - -0.797690840943391040f, - 0.600616479383868970f, -0.799537269107905010f, 0.598160706996342380f, - -0.801376171723140130f, - 0.595699304492433470f, -0.803207531480644830f, 0.593232295039799800f, - -0.805031331142963660f, - 0.590759701858874280f, -0.806847553543799220f, 0.588281548222645330f, - -0.808656181588174980f, - 0.585797857456438860f, -0.810457198252594770f, 0.583308652937698290f, - -0.812250586585203880f, - 0.580813958095764530f, -0.814036329705948300f, 0.578313796411655590f, - -0.815814410806733780f, - 0.575808191417845340f, -0.817584813151583710f, 0.573297166698042320f, - -0.819347520076796900f, - 0.570780745886967370f, -0.821102514991104650f, 0.568258952670131490f, - -0.822849781375826320f, - 0.565731810783613230f, -0.824589302785025290f, 0.563199344013834090f, - -0.826321062845663420f, - 0.560661576197336030f, -0.828045045257755800f, 0.558118531220556100f, - -0.829761233794523050f, - 0.555570233019602290f, -0.831469612302545240f, 0.553016705580027580f, - -0.833170164701913190f, - 0.550457972936604810f, -0.834862874986380010f, 0.547894059173100190f, - -0.836547727223511890f, - 0.545324988422046460f, -0.838224705554837970f, 0.542750784864516000f, - -0.839893794195999410f, - 0.540171472729892970f, -0.841554977436898330f, 0.537587076295645510f, - -0.843208239641845440f, - 0.534997619887097260f, -0.844853565249707010f, 0.532403127877198010f, - -0.846490938774052020f, - 0.529803624686294830f, -0.848120344803297120f, 0.527199134781901390f, - -0.849741768000852440f, - 0.524589682678468840f, -0.851355193105265200f, 0.521975292937154390f, - -0.852960604930363630f, - 0.519355990165589530f, -0.854557988365400530f, 0.516731799017649980f, - -0.856147328375194470f, - 0.514102744193221660f, -0.857728610000272120f, 0.511468850437970520f, - -0.859301818357008360f, - 0.508830142543106990f, -0.860866938637767310f, 0.506186645345155450f, - -0.862423956111040500f, - 0.503538383725717580f, -0.863972856121586700f, 0.500885382611240940f, - -0.865513624090568980f, - 0.498227666972781870f, -0.867046245515692650f, 0.495565261825772490f, - -0.868570705971340900f, - 0.492898192229784090f, -0.870086991108711350f, 0.490226483288291100f, - -0.871595086655951090f, - 0.487550160148436050f, -0.873094978418290090f, 0.484869248000791120f, - -0.874586652278176110f, - 0.482183772079122830f, -0.876070094195406600f, 0.479493757660153010f, - -0.877545290207261240f, - 0.476799230063322250f, -0.879012226428633410f, 0.474100214650550020f, - -0.880470889052160750f, - 0.471396736825997810f, -0.881921264348354940f, 0.468688822035827960f, - -0.883363338665731580f, - 0.465976495767966130f, -0.884797098430937790f, 0.463259783551860260f, - -0.886222530148880640f, - 0.460538710958240010f, -0.887639620402853930f, 0.457813303598877290f, - -0.889048355854664570f, - 0.455083587126343840f, -0.890448723244757880f, 0.452349587233771000f, - -0.891840709392342720f, - 0.449611329654606600f, -0.893224301195515320f, 0.446868840162374330f, - -0.894599485631382580f, - 0.444122144570429260f, -0.895966249756185110f, 0.441371268731716620f, - -0.897324580705418320f, - 0.438616238538527710f, -0.898674465693953820f, 0.435857079922255470f, - -0.900015892016160280f, - 0.433093818853152010f, -0.901348847046022030f, 0.430326481340082610f, - -0.902673318237258830f, - 0.427555093430282200f, -0.903989293123443340f, 0.424779681209108810f, - -0.905296759318118820f, - 0.422000270799799790f, -0.906595704514915330f, 0.419216888363223960f, - -0.907886116487666150f, - 0.416429560097637320f, -0.909167983090522270f, 0.413638312238434560f, - -0.910441292258067140f, - 0.410843171057903910f, -0.911706032005429880f, 0.408044162864978740f, - -0.912962190428398100f, - 0.405241314004989860f, -0.914209755703530690f, 0.402434650859418540f, - -0.915448716088267830f, - 0.399624199845646790f, -0.916679059921042700f, 0.396809987416710420f, - -0.917900775621390390f, - 0.393992040061048100f, -0.919113851690057770f, 0.391170384302253980f, - -0.920318276709110480f, - 0.388345046698826300f, -0.921514039342041900f, 0.385516053843919020f, - -0.922701128333878520f, - 0.382683432365089840f, -0.923879532511286740f, 0.379847208924051110f, - -0.925049240782677580f, - 0.377007410216418310f, -0.926210242138311270f, 0.374164062971457990f, - -0.927362525650401110f, - 0.371317193951837600f, -0.928506080473215480f, 0.368466829953372320f, - -0.929640895843181330f, - 0.365612997804773960f, -0.930766961078983710f, 0.362755724367397230f, - -0.931884265581668150f, - 0.359895036534988280f, -0.932992798834738850f, 0.357030961233430030f, - -0.934092550404258870f, - 0.354163525420490510f, -0.935183509938947500f, 0.351292756085567150f, - -0.936265667170278260f, - 0.348418680249434510f, -0.937339011912574960f, 0.345541324963989150f, - -0.938403534063108060f, - 0.342660717311994380f, -0.939459223602189920f, 0.339776884406826960f, - -0.940506070593268300f, - 0.336889853392220050f, -0.941544065183020810f, 0.333999651442009490f, - -0.942573197601446870f, - 0.331106305759876430f, -0.943593458161960390f, 0.328209843579092660f, - -0.944604837261480260f, - 0.325310292162262980f, -0.945607325380521280f, 0.322407678801070020f, - -0.946600913083283530f, - 0.319502030816015750f, -0.947585591017741090f, 0.316593375556165850f, - -0.948561349915730270f, - 0.313681740398891570f, -0.949528180593036670f, 0.310767152749611470f, - -0.950486073949481700f, - 0.307849640041534980f, -0.951435020969008340f, 0.304929229735402430f, - -0.952375012719765880f, - 0.302005949319228200f, -0.953306040354193750f, 0.299079826308040480f, - -0.954228095109105670f, - 0.296150888243623960f, -0.955141168305770670f, 0.293219162694258680f, - -0.956045251349996410f, - 0.290284677254462330f, -0.956940335732208940f, 0.287347459544729570f, - -0.957826413027532910f, - 0.284407537211271820f, -0.958703474895871600f, 0.281464937925758050f, - -0.959571513081984520f, - 0.278519689385053060f, -0.960430519415565790f, 0.275571819310958250f, - -0.961280485811320640f, - 0.272621355449948980f, -0.962121404269041580f, 0.269668325572915200f, - -0.962953266873683880f, - 0.266712757474898420f, -0.963776065795439840f, 0.263754678974831510f, - -0.964589793289812650f, - 0.260794117915275570f, -0.965394441697689400f, 0.257831102162158930f, - -0.966190003445412620f, - 0.254865659604514630f, -0.966976471044852070f, 0.251897818154216910f, - -0.967753837093475510f, - 0.248927605745720260f, -0.968522094274417270f, 0.245955050335794590f, - -0.969281235356548530f, - 0.242980179903263980f, -0.970031253194543970f, 0.240003022448741500f, - -0.970772140728950350f, - 0.237023605994367340f, -0.971503890986251780f, 0.234041958583543460f, - -0.972226497078936270f, - 0.231058108280671280f, -0.972939952205560070f, 0.228072083170885790f, - -0.973644249650811870f, - 0.225083911359792780f, -0.974339382785575860f, 0.222093620973203590f, - -0.975025345066994120f, - 0.219101240156869770f, -0.975702130038528570f, 0.216106797076219600f, - -0.976369731330021140f, - 0.213110319916091360f, -0.977028142657754390f, 0.210111836880469720f, - -0.977677357824509930f, - 0.207111376192218560f, -0.978317370719627650f, 0.204108966092817010f, - -0.978948175319062200f, - 0.201104634842091960f, -0.979569765685440520f, 0.198098410717953730f, - -0.980182135968117320f, - 0.195090322016128330f, -0.980785280403230430f, 0.192080397049892380f, - -0.981379193313754560f, - 0.189068664149806280f, -0.981963869109555240f, 0.186055151663446630f, - -0.982539302287441240f, - 0.183039887955141060f, -0.983105487431216290f, 0.180022901405699510f, - -0.983662419211730250f, - 0.177004220412148860f, -0.984210092386929030f, 0.173983873387463850f, - -0.984748501801904210f, - 0.170961888760301360f, -0.985277642388941220f, 0.167938294974731230f, - -0.985797509167567370f, - 0.164913120489970090f, -0.986308097244598670f, 0.161886393780111910f, - -0.986809401814185420f, - 0.158858143333861390f, -0.987301418157858430f, 0.155828397654265320f, - -0.987784141644572180f, - 0.152797185258443410f, -0.988257567730749460f, 0.149764534677321620f, - -0.988721691960323780f, - 0.146730474455361750f, -0.989176509964781010f, 0.143695033150294580f, - -0.989622017463200780f, - 0.140658239332849240f, -0.990058210262297120f, 0.137620121586486180f, - -0.990485084256456980f, - 0.134580708507126220f, -0.990902635427780010f, 0.131540028702883280f, - -0.991310859846115440f, - 0.128498110793793220f, -0.991709753669099530f, 0.125454983411546210f, - -0.992099313142191800f, - 0.122410675199216280f, -0.992479534598709970f, 0.119365214810991350f, - -0.992850414459865100f, - 0.116318630911904880f, -0.993211949234794500f, 0.113270952177564360f, - -0.993564135520595300f, - 0.110222207293883180f, -0.993906970002356060f, 0.107172424956808870f, - -0.994240449453187900f, - 0.104121633872054730f, -0.994564570734255420f, 0.101069862754827880f, - -0.994879330794805620f, - 0.098017140329560770f, -0.995184726672196820f, 0.094963495329639061f, - -0.995480755491926940f, - 0.091908956497132696f, -0.995767414467659820f, 0.088853552582524684f, - -0.996044700901251970f, - 0.085797312344439880f, -0.996312612182778000f, 0.082740264549375803f, - -0.996571145790554840f, - 0.079682437971430126f, -0.996820299291165670f, 0.076623861392031617f, - -0.997060070339482960f, - 0.073564563599667454f, -0.997290456678690210f, 0.070504573389614009f, - -0.997511456140303450f, - 0.067443919563664106f, -0.997723066644191640f, 0.064382630929857410f, - -0.997925286198596000f, - 0.061320736302208648f, -0.998118112900149180f, 0.058258264500435732f, - -0.998301544933892890f, - 0.055195244349690031f, -0.998475580573294770f, 0.052131704680283317f, - -0.998640218180265270f, - 0.049067674327418126f, -0.998795456205172410f, 0.046003182130914644f, - -0.998941293186856870f, - 0.042938256934940959f, -0.999077727752645360f, 0.039872927587739845f, - -0.999204758618363890f, - 0.036807222941358991f, -0.999322384588349540f, 0.033741171851377642f, - -0.999430604555461730f, - 0.030674803176636581f, -0.999529417501093140f, 0.027608145778965820f, - -0.999618822495178640f, - 0.024541228522912264f, -0.999698818696204250f, 0.021474080275469605f, - -0.999769405351215280f, - 0.018406729905804820f, -0.999830581795823400f, 0.015339206284988220f, - -0.999882347454212560f, - 0.012271538285719944f, -0.999924701839144500f, 0.009203754782059960f, - -0.999957644551963900f, - 0.006135884649154515f, -0.999981175282601110f, 0.003067956762966138f, - -0.999995293809576190f -}; - -static const float32_t Weights_2048[4096] = { - 1.000000000000000000f, 0.000000000000000000f, 0.999999705862882230f, - -0.000766990318742704f, - 0.999998823451701880f, -0.001533980186284766f, 0.999997352766978210f, - -0.002300969151425805f, - 0.999995293809576190f, -0.003067956762965976f, 0.999992646580707190f, - -0.003834942569706228f, - 0.999989411081928400f, -0.004601926120448571f, 0.999985587315143200f, - -0.005368906963996343f, - 0.999981175282601110f, -0.006135884649154475f, 0.999976174986897610f, - -0.006902858724729756f, - 0.999970586430974140f, -0.007669828739531097f, 0.999964409618118280f, - -0.008436794242369799f, - 0.999957644551963900f, -0.009203754782059819f, 0.999950291236490480f, - -0.009970709907418031f, - 0.999942349676023910f, -0.010737659167264491f, 0.999933819875236000f, - -0.011504602110422714f, - 0.999924701839144500f, -0.012271538285719925f, 0.999914995573113470f, - -0.013038467241987334f, - 0.999904701082852900f, -0.013805388528060391f, 0.999893818374418490f, - -0.014572301692779064f, - 0.999882347454212560f, -0.015339206284988100f, 0.999870288328982950f, - -0.016106101853537287f, - 0.999857641005823860f, -0.016872987947281710f, 0.999844405492175240f, - -0.017639864115082053f, - 0.999830581795823400f, -0.018406729905804820f, 0.999816169924900410f, - -0.019173584868322623f, - 0.999801169887884260f, -0.019940428551514441f, 0.999785581693599210f, - -0.020707260504265895f, - 0.999769405351215280f, -0.021474080275469508f, 0.999752640870248840f, - -0.022240887414024961f, - 0.999735288260561680f, -0.023007681468839369f, 0.999717347532362190f, - -0.023774461988827555f, - 0.999698818696204250f, -0.024541228522912288f, 0.999679701762987930f, - -0.025307980620024571f, - 0.999659996743959220f, -0.026074717829103901f, 0.999639703650710200f, - -0.026841439699098531f, - 0.999618822495178640f, -0.027608145778965740f, 0.999597353289648380f, - -0.028374835617672099f, - 0.999575296046749220f, -0.029141508764193722f, 0.999552650779456990f, - -0.029908164767516555f, - 0.999529417501093140f, -0.030674803176636626f, 0.999505596225325310f, - -0.031441423540560301f, - 0.999481186966166950f, -0.032208025408304586f, 0.999456189737977340f, - -0.032974608328897335f, - 0.999430604555461730f, -0.033741171851377580f, 0.999404431433671300f, - -0.034507715524795750f, - 0.999377670388002850f, -0.035274238898213947f, 0.999350321434199440f, - -0.036040741520706229f, - 0.999322384588349540f, -0.036807222941358832f, 0.999293859866887790f, - -0.037573682709270494f, - 0.999264747286594420f, -0.038340120373552694f, 0.999235046864595850f, - -0.039106535483329888f, - 0.999204758618363890f, -0.039872927587739811f, 0.999173882565716380f, - -0.040639296235933736f, - 0.999142418724816910f, -0.041405640977076739f, 0.999110367114174890f, - -0.042171961360347947f, - 0.999077727752645360f, -0.042938256934940820f, 0.999044500659429290f, - -0.043704527250063421f, - 0.999010685854073380f, -0.044470771854938668f, 0.998976283356469820f, - -0.045236990298804590f, - 0.998941293186856870f, -0.046003182130914623f, 0.998905715365818290f, - -0.046769346900537863f, - 0.998869549914283560f, -0.047535484156959303f, 0.998832796853527990f, - -0.048301593449480144f, - 0.998795456205172410f, -0.049067674327418015f, 0.998757527991183340f, - -0.049833726340107277f, - 0.998719012233872940f, -0.050599749036899282f, 0.998679908955899090f, - -0.051365741967162593f, - 0.998640218180265270f, -0.052131704680283324f, 0.998599939930320370f, - -0.052897636725665324f, - 0.998559074229759310f, -0.053663537652730520f, 0.998517621102622210f, - -0.054429407010919133f, - 0.998475580573294770f, -0.055195244349689934f, 0.998432952666508440f, - -0.055961049218520569f, - 0.998389737407340160f, -0.056726821166907748f, 0.998345934821212370f, - -0.057492559744367566f, - 0.998301544933892890f, -0.058258264500435752f, 0.998256567771495180f, - -0.059023934984667931f, - 0.998211003360478190f, -0.059789570746639868f, 0.998164851727646240f, - -0.060555171335947788f, - 0.998118112900149180f, -0.061320736302208578f, 0.998070786905482340f, - -0.062086265195060088f, - 0.998022873771486240f, -0.062851757564161406f, 0.997974373526346990f, - -0.063617212959193106f, - 0.997925286198596000f, -0.064382630929857465f, 0.997875611817110150f, - -0.065148011025878833f, - 0.997825350411111640f, -0.065913352797003805f, 0.997774502010167820f, - -0.066678655793001557f, - 0.997723066644191640f, -0.067443919563664051f, 0.997671044343441000f, - -0.068209143658806329f, - 0.997618435138519550f, -0.068974327628266746f, 0.997565239060375750f, - -0.069739471021907307f, - 0.997511456140303450f, -0.070504573389613856f, 0.997457086409941910f, - -0.071269634281296401f, - 0.997402129901275300f, -0.072034653246889332f, 0.997346586646633230f, - -0.072799629836351673f, - 0.997290456678690210f, -0.073564563599667426f, 0.997233740030466280f, - -0.074329454086845756f, - 0.997176436735326190f, -0.075094300847921305f, 0.997118546826979980f, - -0.075859103432954447f, - 0.997060070339482960f, -0.076623861392031492f, 0.997001007307235290f, - -0.077388574275265049f, - 0.996941357764982160f, -0.078153241632794232f, 0.996881121747813850f, - -0.078917863014784942f, - 0.996820299291165670f, -0.079682437971430126f, 0.996758890430818000f, - -0.080446966052950014f, - 0.996696895202896060f, -0.081211446809592441f, 0.996634313643869900f, - -0.081975879791633066f, - 0.996571145790554840f, -0.082740264549375692f, 0.996507391680110820f, - -0.083504600633152432f, - 0.996443051350042630f, -0.084268887593324071f, 0.996378124838200210f, - -0.085033124980280275f, - 0.996312612182778000f, -0.085797312344439894f, 0.996246513422315520f, - -0.086561449236251170f, - 0.996179828595696980f, -0.087325535206192059f, 0.996112557742151130f, - -0.088089569804770507f, - 0.996044700901251970f, -0.088853552582524600f, 0.995976258112917790f, - -0.089617483090022959f, - 0.995907229417411720f, -0.090381360877864983f, 0.995837614855341610f, - -0.091145185496681005f, - 0.995767414467659820f, -0.091908956497132724f, 0.995696628295663520f, - -0.092672673429913310f, - 0.995625256380994310f, -0.093436335845747787f, 0.995553298765638470f, - -0.094199943295393204f, - 0.995480755491926940f, -0.094963495329638992f, 0.995407626602534900f, - -0.095726991499307162f, - 0.995333912140482280f, -0.096490431355252593f, 0.995259612149133390f, - -0.097253814448363271f, - 0.995184726672196930f, -0.098017140329560604f, 0.995109255753726110f, - -0.098780408549799623f, - 0.995033199438118630f, -0.099543618660069319f, 0.994956557770116380f, - -0.100306770211392860f, - 0.994879330794805620f, -0.101069862754827820f, 0.994801518557617110f, - -0.101832895841466530f, - 0.994723121104325700f, -0.102595869022436280f, 0.994644138481050710f, - -0.103358781848899610f, - 0.994564570734255420f, -0.104121633872054590f, 0.994484417910747600f, - -0.104884424643134970f, - 0.994403680057679100f, -0.105647153713410620f, 0.994322357222545810f, - -0.106409820634187680f, - 0.994240449453187900f, -0.107172424956808840f, 0.994157956797789730f, - -0.107934966232653650f, - 0.994074879304879370f, -0.108697444013138720f, 0.993991217023329380f, - -0.109459857849717980f, - 0.993906970002356060f, -0.110222207293883060f, 0.993822138291519660f, - -0.110984491897163390f, - 0.993736721940724600f, -0.111746711211126590f, 0.993650721000219120f, - -0.112508864787378690f, - 0.993564135520595300f, -0.113270952177564350f, 0.993476965552789190f, - -0.114032972933367200f, - 0.993389211148080650f, -0.114794926606510080f, 0.993300872358093280f, - -0.115556812748755260f, - 0.993211949234794500f, -0.116318630911904750f, 0.993122441830495580f, - -0.117080380647800590f, - 0.993032350197851410f, -0.117842061508324980f, 0.992941674389860470f, - -0.118603673045400720f, - 0.992850414459865100f, -0.119365214810991350f, 0.992758570461551140f, - -0.120126686357101500f, - 0.992666142448948020f, -0.120888087235777080f, 0.992573130476428810f, - -0.121649416999105530f, - 0.992479534598709970f, -0.122410675199216200f, 0.992385354870851670f, - -0.123171861388280480f, - 0.992290591348257370f, -0.123932975118512160f, 0.992195244086673920f, - -0.124694015942167640f, - 0.992099313142191800f, -0.125454983411546230f, 0.992002798571244520f, - -0.126215877078990350f, - 0.991905700430609330f, -0.126976696496885870f, 0.991808018777406430f, - -0.127737441217662310f, - 0.991709753669099530f, -0.128498110793793170f, 0.991610905163495370f, - -0.129258704777796140f, - 0.991511473318743900f, -0.130019222722233350f, 0.991411458193338540f, - -0.130779664179711710f, - 0.991310859846115440f, -0.131540028702883120f, 0.991209678336254060f, - -0.132300315844444650f, - 0.991107913723276890f, -0.133060525157139060f, 0.991005566067049370f, - -0.133820656193754720f, - 0.990902635427780010f, -0.134580708507126170f, 0.990799121866020370f, - -0.135340681650134210f, - 0.990695025442664630f, -0.136100575175706200f, 0.990590346218950150f, - -0.136860388636816380f, - 0.990485084256457090f, -0.137620121586486040f, 0.990379239617108160f, - -0.138379773577783890f, - 0.990272812363169110f, -0.139139344163826200f, 0.990165802557248400f, - -0.139898832897777210f, - 0.990058210262297120f, -0.140658239332849210f, 0.989950035541608990f, - -0.141417563022303020f, - 0.989841278458820530f, -0.142176803519448030f, 0.989731939077910570f, - -0.142935960377642670f, - 0.989622017463200890f, -0.143695033150294470f, 0.989511513679355190f, - -0.144454021390860470f, - 0.989400427791380380f, -0.145212924652847460f, 0.989288759864625170f, - -0.145971742489812210f, - 0.989176509964781010f, -0.146730474455361750f, 0.989063678157881540f, - -0.147489120103153570f, - 0.988950264510302990f, -0.148247678986896030f, 0.988836269088763540f, - -0.149006150660348450f, - 0.988721691960323780f, -0.149764534677321510f, 0.988606533192386450f, - -0.150522830591677400f, - 0.988490792852696590f, -0.151281037957330220f, 0.988374471009341280f, - -0.152039156328246050f, - 0.988257567730749460f, -0.152797185258443440f, 0.988140083085692570f, - -0.153555124301993450f, - 0.988022017143283530f, -0.154312973013020100f, 0.987903369972977790f, - -0.155070730945700510f, - 0.987784141644572180f, -0.155828397654265230f, 0.987664332228205710f, - -0.156585972692998430f, - 0.987543941794359230f, -0.157343455616238250f, 0.987422970413855410f, - -0.158100845978376980f, - 0.987301418157858430f, -0.158858143333861450f, 0.987179285097874340f, - -0.159615347237193060f, - 0.987056571305750970f, -0.160372457242928280f, 0.986933276853677710f, - -0.161129472905678810f, - 0.986809401814185530f, -0.161886393780111830f, 0.986684946260146690f, - -0.162643219420950310f, - 0.986559910264775410f, -0.163399949382973230f, 0.986434293901627180f, - -0.164156583221015810f, - 0.986308097244598670f, -0.164913120489969890f, 0.986181320367928270f, - -0.165669560744784120f, - 0.986053963346195440f, -0.166425903540464100f, 0.985926026254321130f, - -0.167182148432072940f, - 0.985797509167567480f, -0.167938294974731170f, 0.985668412161537550f, - -0.168694342723617330f, - 0.985538735312176060f, -0.169450291233967960f, 0.985408478695768420f, - -0.170206140061078070f, - 0.985277642388941220f, -0.170961888760301220f, 0.985146226468662230f, - -0.171717536887049970f, - 0.985014231012239840f, -0.172473083996795950f, 0.984881656097323700f, - -0.173228529645070320f, - 0.984748501801904210f, -0.173983873387463820f, 0.984614768204312600f, - -0.174739114779627200f, - 0.984480455383220930f, -0.175494253377271430f, 0.984345563417641900f, - -0.176249288736167880f, - 0.984210092386929030f, -0.177004220412148750f, 0.984074042370776450f, - -0.177759047961107170f, - 0.983937413449218920f, -0.178513770938997510f, 0.983800205702631600f, - -0.179268388901835750f, - 0.983662419211730250f, -0.180022901405699510f, 0.983524054057571260f, - -0.180777308006728590f, - 0.983385110321551180f, -0.181531608261124970f, 0.983245588085407070f, - -0.182285801725153300f, - 0.983105487431216290f, -0.183039887955140950f, 0.982964808441396440f, - -0.183793866507478450f, - 0.982823551198705240f, -0.184547736938619620f, 0.982681715786240860f, - -0.185301498805081900f, - 0.982539302287441240f, -0.186055151663446630f, 0.982396310786084690f, - -0.186808695070359270f, - 0.982252741366289370f, -0.187562128582529600f, 0.982108594112513610f, - -0.188315451756732120f, - 0.981963869109555240f, -0.189068664149806190f, 0.981818566442552500f, - -0.189821765318656410f, - 0.981672686196983110f, -0.190574754820252740f, 0.981526228458664770f, - -0.191327632211630900f, - 0.981379193313754560f, -0.192080397049892440f, 0.981231580848749730f, - -0.192833048892205230f, - 0.981083391150486710f, -0.193585587295803610f, 0.980934624306141640f, - -0.194338011817988600f, - 0.980785280403230430f, -0.195090322016128250f, 0.980635359529608120f, - -0.195842517447657850f, - 0.980484861773469380f, -0.196594597670080220f, 0.980333787223347960f, - -0.197346562240965920f, - 0.980182135968117430f, -0.198098410717953560f, 0.980029908096990090f, - -0.198850142658750090f, - 0.979877103699517640f, -0.199601757621130970f, 0.979723722865591170f, - -0.200353255162940450f, - 0.979569765685440520f, -0.201104634842091900f, 0.979415232249634780f, - -0.201855896216568050f, - 0.979260122649082020f, -0.202607038844421130f, 0.979104436975029250f, - -0.203358062283773320f, - 0.978948175319062200f, -0.204108966092816870f, 0.978791337773105670f, - -0.204859749829814420f, - 0.978633924429423210f, -0.205610413053099240f, 0.978475935380616830f, - -0.206360955321075510f, - 0.978317370719627650f, -0.207111376192218560f, 0.978158230539735050f, - -0.207861675225075070f, - 0.977998514934557140f, -0.208611851978263490f, 0.977838223998050430f, - -0.209361906010474160f, - 0.977677357824509930f, -0.210111836880469610f, 0.977515916508569280f, - -0.210861644147084860f, - 0.977353900145199960f, -0.211611327369227550f, 0.977191308829712280f, - -0.212360886105878420f, - 0.977028142657754390f, -0.213110319916091360f, 0.976864401725312640f, - -0.213859628358993750f, - 0.976700086128711840f, -0.214608810993786760f, 0.976535195964614470f, - -0.215357867379745550f, - 0.976369731330021140f, -0.216106797076219520f, 0.976203692322270560f, - -0.216855599642632620f, - 0.976037079039039020f, -0.217604274638483640f, 0.975869891578341030f, - -0.218352821623346320f, - 0.975702130038528570f, -0.219101240156869800f, 0.975533794518291360f, - -0.219849529798778700f, - 0.975364885116656980f, -0.220597690108873510f, 0.975195401932990370f, - -0.221345720647030810f, - 0.975025345066994120f, -0.222093620973203510f, 0.974854714618708430f, - -0.222841390647421120f, - 0.974683510688510670f, -0.223589029229789990f, 0.974511733377115720f, - -0.224336536280493600f, - 0.974339382785575860f, -0.225083911359792830f, 0.974166459015280320f, - -0.225831154028026170f, - 0.973992962167955830f, -0.226578263845610000f, 0.973818892345666100f, - -0.227325240373038860f, - 0.973644249650811980f, -0.228072083170885730f, 0.973469034186131070f, - -0.228818791799802220f, - 0.973293246054698250f, -0.229565365820518870f, 0.973116885359925130f, - -0.230311804793845440f, - 0.972939952205560180f, -0.231058108280671110f, 0.972762446695688570f, - -0.231804275841964780f, - 0.972584368934732210f, -0.232550307038775240f, 0.972405719027449770f, - -0.233296201432231590f, - 0.972226497078936270f, -0.234041958583543430f, 0.972046703194623500f, - -0.234787578054000970f, - 0.971866337480279400f, -0.235533059404975490f, 0.971685400042008540f, - -0.236278402197919570f, - 0.971503890986251780f, -0.237023605994367200f, 0.971321810419786160f, - -0.237768670355934190f, - 0.971139158449725090f, -0.238513594844318420f, 0.970955935183517970f, - -0.239258379021299980f, - 0.970772140728950350f, -0.240003022448741500f, 0.970587775194143630f, - -0.240747524688588430f, - 0.970402838687555500f, -0.241491885302869330f, 0.970217331317979160f, - -0.242236103853696010f, - 0.970031253194543970f, -0.242980179903263870f, 0.969844604426714830f, - -0.243724113013852160f, - 0.969657385124292450f, -0.244467902747824150f, 0.969469595397413060f, - -0.245211548667627540f, - 0.969281235356548530f, -0.245955050335794590f, 0.969092305112506210f, - -0.246698407314942410f, - 0.968902804776428870f, -0.247441619167773270f, 0.968712734459794780f, - -0.248184685457074780f, - 0.968522094274417380f, -0.248927605745720150f, 0.968330884332445190f, - -0.249670379596668570f, - 0.968139104746362440f, -0.250413006572965220f, 0.967946755628987800f, - -0.251155486237741920f, - 0.967753837093475510f, -0.251897818154216970f, 0.967560349253314360f, - -0.252640001885695520f, - 0.967366292222328510f, -0.253382036995570160f, 0.967171666114676640f, - -0.254123923047320620f, - 0.966976471044852070f, -0.254865659604514570f, 0.966780707127683270f, - -0.255607246230807380f, - 0.966584374478333120f, -0.256348682489942910f, 0.966387473212298900f, - -0.257089967945753120f, - 0.966190003445412500f, -0.257831102162158990f, 0.965991965293840570f, - -0.258572084703170340f, - 0.965793358874083680f, -0.259312915132886230f, 0.965594184302976830f, - -0.260053593015495190f, - 0.965394441697689400f, -0.260794117915275510f, 0.965194131175724720f, - -0.261534489396595520f, - 0.964993252854920320f, -0.262274707023913590f, 0.964791806853447900f, - -0.263014770361779000f, - 0.964589793289812760f, -0.263754678974831350f, 0.964387212282854290f, - -0.264494432427801630f, - 0.964184063951745830f, -0.265234030285511790f, 0.963980348415994110f, - -0.265973472112875590f, - 0.963776065795439840f, -0.266712757474898370f, 0.963571216210257320f, - -0.267451885936677620f, - 0.963365799780954050f, -0.268190857063403180f, 0.963159816628371360f, - -0.268929670420357260f, - 0.962953266873683880f, -0.269668325572915090f, 0.962746150638399410f, - -0.270406822086544820f, - 0.962538468044359160f, -0.271145159526808010f, 0.962330219213737400f, - -0.271883337459359720f, - 0.962121404269041580f, -0.272621355449948980f, 0.961912023333112210f, - -0.273359213064418680f, - 0.961702076529122540f, -0.274096909868706380f, 0.961491563980579000f, - -0.274834445428843940f, - 0.961280485811320640f, -0.275571819310958140f, 0.961068842145519350f, - -0.276309031081271080f, - 0.960856633107679660f, -0.277046080306099900f, 0.960643858822638590f, - -0.277782966551857690f, - 0.960430519415565790f, -0.278519689385053060f, 0.960216615011963430f, - -0.279256248372291180f, - 0.960002145737665960f, -0.279992643080273220f, 0.959787111718839900f, - -0.280728873075797190f, - 0.959571513081984520f, -0.281464937925757940f, 0.959355349953930790f, - -0.282200837197147560f, - 0.959138622461841890f, -0.282936570457055390f, 0.958921330733213170f, - -0.283672137272668430f, - 0.958703474895871600f, -0.284407537211271880f, 0.958485055077976100f, - -0.285142769840248670f, - 0.958266071408017670f, -0.285877834727080620f, 0.958046524014818600f, - -0.286612731439347790f, - 0.957826413027532910f, -0.287347459544729510f, 0.957605738575646350f, - -0.288082018611004130f, - 0.957384500788975860f, -0.288816408206049480f, 0.957162699797670210f, - -0.289550627897843030f, - 0.956940335732208820f, -0.290284677254462330f, 0.956717408723403050f, - -0.291018555844085090f, - 0.956493918902395100f, -0.291752263234989260f, 0.956269866400658030f, - -0.292485798995553880f, - 0.956045251349996410f, -0.293219162694258630f, 0.955820073882545420f, - -0.293952353899684660f, - 0.955594334130771110f, -0.294685372180514330f, 0.955368032227470350f, - -0.295418217105532010f, - 0.955141168305770780f, -0.296150888243623790f, 0.954913742499130520f, - -0.296883385163778270f, - 0.954685754941338340f, -0.297615707435086200f, 0.954457205766513490f, - -0.298347854626741400f, - 0.954228095109105670f, -0.299079826308040480f, 0.953998423103894490f, - -0.299811622048383350f, - 0.953768189885990330f, -0.300543241417273450f, 0.953537395590833280f, - -0.301274683984317950f, - 0.953306040354193860f, -0.302005949319228080f, 0.953074124312172200f, - -0.302737036991819140f, - 0.952841647601198720f, -0.303467946572011320f, 0.952608610358033350f, - -0.304198677629829110f, - 0.952375012719765880f, -0.304929229735402370f, 0.952140854823815830f, - -0.305659602458966120f, - 0.951906136807932350f, -0.306389795370860920f, 0.951670858810193860f, - -0.307119808041533100f, - 0.951435020969008340f, -0.307849640041534870f, 0.951198623423113230f, - -0.308579290941525090f, - 0.950961666311575080f, -0.309308760312268730f, 0.950724149773789610f, - -0.310038047724637890f, - 0.950486073949481700f, -0.310767152749611470f, 0.950247438978705230f, - -0.311496074958275910f, - 0.950008245001843000f, -0.312224813921824880f, 0.949768492159606680f, - -0.312953369211560200f, - 0.949528180593036670f, -0.313681740398891520f, 0.949287310443502120f, - -0.314409927055336660f, - 0.949045881852700560f, -0.315137928752522440f, 0.948803894962658490f, - -0.315865745062183960f, - 0.948561349915730270f, -0.316593375556165850f, 0.948318246854599090f, - -0.317320819806421740f, - 0.948074585922276230f, -0.318048077385014950f, 0.947830367262101010f, - -0.318775147864118480f, - 0.947585591017741090f, -0.319502030816015690f, 0.947340257333192050f, - -0.320228725813099860f, - 0.947094366352777220f, -0.320955232427875210f, 0.946847918221148000f, - -0.321681550232956580f, - 0.946600913083283530f, -0.322407678801069850f, 0.946353351084490590f, - -0.323133617705052330f, - 0.946105232370403450f, -0.323859366517852850f, 0.945856557086983910f, - -0.324584924812532150f, - 0.945607325380521280f, -0.325310292162262930f, 0.945357537397632290f, - -0.326035468140330240f, - 0.945107193285260610f, -0.326760452320131730f, 0.944856293190677210f, - -0.327485244275178000f, - 0.944604837261480260f, -0.328209843579092500f, 0.944352825645594750f, - -0.328934249805612200f, - 0.944100258491272660f, -0.329658462528587490f, 0.943847135947092690f, - -0.330382481321982780f, - 0.943593458161960390f, -0.331106305759876430f, 0.943339225285107720f, - -0.331829935416461110f, - 0.943084437466093490f, -0.332553369866044220f, 0.942829094854802710f, - -0.333276608683047930f, - 0.942573197601446870f, -0.333999651442009380f, 0.942316745856563780f, - -0.334722497717581220f, - 0.942059739771017310f, -0.335445147084531600f, 0.941802179495997650f, - -0.336167599117744520f, - 0.941544065183020810f, -0.336889853392220050f, 0.941285396983928660f, - -0.337611909483074620f, - 0.941026175050889260f, -0.338333766965541130f, 0.940766399536396070f, - -0.339055425414969640f, - 0.940506070593268300f, -0.339776884406826850f, 0.940245188374650880f, - -0.340498143516697160f, - 0.939983753034014050f, -0.341219202320282360f, 0.939721764725153340f, - -0.341940060393402190f, - 0.939459223602189920f, -0.342660717311994380f, 0.939196129819569900f, - -0.343381172652115040f, - 0.938932483532064600f, -0.344101425989938810f, 0.938668284894770170f, - -0.344821476901759290f, - 0.938403534063108060f, -0.345541324963989090f, 0.938138231192824360f, - -0.346260969753160010f, - 0.937872376439989890f, -0.346980410845923680f, 0.937605969960999990f, - -0.347699647819051380f, - 0.937339011912574960f, -0.348418680249434560f, 0.937071502451759190f, - -0.349137507714084970f, - 0.936803441735921560f, -0.349856129790134920f, 0.936534829922755500f, - -0.350574546054837510f, - 0.936265667170278260f, -0.351292756085567090f, 0.935995953636831410f, - -0.352010759459819080f, - 0.935725689481080370f, -0.352728555755210730f, 0.935454874862014620f, - -0.353446144549480810f, - 0.935183509938947610f, -0.354163525420490340f, 0.934911594871516090f, - -0.354880697946222790f, - 0.934639129819680780f, -0.355597661704783850f, 0.934366114943725790f, - -0.356314416274402410f, - 0.934092550404258980f, -0.357030961233429980f, 0.933818436362210960f, - -0.357747296160341900f, - 0.933543772978836170f, -0.358463420633736540f, 0.933268560415712050f, - -0.359179334232336500f, - 0.932992798834738960f, -0.359895036534988110f, 0.932716488398140250f, - -0.360610527120662270f, - 0.932439629268462360f, -0.361325805568454280f, 0.932162221608574430f, - -0.362040871457584180f, - 0.931884265581668150f, -0.362755724367397230f, 0.931605761351257830f, - -0.363470363877363760f, - 0.931326709081180430f, -0.364184789567079890f, 0.931047108935595280f, - -0.364899001016267320f, - 0.930766961078983710f, -0.365612997804773850f, 0.930486265676149780f, - -0.366326779512573590f, - 0.930205022892219070f, -0.367040345719767180f, 0.929923232892639670f, - -0.367753696006581980f, - 0.929640895843181330f, -0.368466829953372320f, 0.929358011909935500f, - -0.369179747140620020f, - 0.929074581259315860f, -0.369892447148934100f, 0.928790604058057020f, - -0.370604929559051670f, - 0.928506080473215590f, -0.371317193951837540f, 0.928221010672169440f, - -0.372029239908285010f, - 0.927935394822617890f, -0.372741067009515760f, 0.927649233092581180f, - -0.373452674836780300f, - 0.927362525650401110f, -0.374164062971457930f, 0.927075272664740100f, - -0.374875230995057540f, - 0.926787474304581750f, -0.375586178489217220f, 0.926499130739230510f, - -0.376296905035704790f, - 0.926210242138311380f, -0.377007410216418260f, 0.925920808671770070f, - -0.377717693613385640f, - 0.925630830509872720f, -0.378427754808765560f, 0.925340307823206310f, - -0.379137593384847320f, - 0.925049240782677580f, -0.379847208924051160f, 0.924757629559513910f, - -0.380556601008928520f, - 0.924465474325262600f, -0.381265769222162380f, 0.924172775251791200f, - -0.381974713146567220f, - 0.923879532511286740f, -0.382683432365089780f, 0.923585746276256670f, - -0.383391926460808660f, - 0.923291416719527640f, -0.384100195016935040f, 0.922996544014246250f, - -0.384808237616812880f, - 0.922701128333878630f, -0.385516053843918850f, 0.922405169852209880f, - -0.386223643281862980f, - 0.922108668743345180f, -0.386931005514388580f, 0.921811625181708120f, - -0.387638140125372730f, - 0.921514039342042010f, -0.388345046698826250f, 0.921215911399408730f, - -0.389051724818894380f, - 0.920917241529189520f, -0.389758174069856410f, 0.920618029907083970f, - -0.390464394036126590f, - 0.920318276709110590f, -0.391170384302253870f, 0.920017982111606570f, - -0.391876144452922350f, - 0.919717146291227360f, -0.392581674072951470f, 0.919415769424947070f, - -0.393286972747296400f, - 0.919113851690057770f, -0.393992040061048100f, 0.918811393264170050f, - -0.394696875599433560f, - 0.918508394325212250f, -0.395401478947816350f, 0.918204855051430900f, - -0.396105849691696270f, - 0.917900775621390500f, -0.396809987416710310f, 0.917596156213972950f, - -0.397513891708632330f, - 0.917290997008377910f, -0.398217562153373560f, 0.916985298184123000f, - -0.398920998336982910f, - 0.916679059921042700f, -0.399624199845646790f, 0.916372282399289140f, - -0.400327166265690090f, - 0.916064965799331720f, -0.401029897183575620f, 0.915757110301956720f, - -0.401732392185905010f, - 0.915448716088267830f, -0.402434650859418430f, 0.915139783339685260f, - -0.403136672790995300f, - 0.914830312237946200f, -0.403838457567654070f, 0.914520302965104450f, - -0.404540004776553000f, - 0.914209755703530690f, -0.405241314004989860f, 0.913898670635911680f, - -0.405942384840402510f, - 0.913587047945250810f, -0.406643216870369030f, 0.913274887814867760f, - -0.407343809682607970f, - 0.912962190428398210f, -0.408044162864978690f, 0.912648955969793900f, - -0.408744276005481360f, - 0.912335184623322750f, -0.409444148692257590f, 0.912020876573568340f, - -0.410143780513590240f, - 0.911706032005429880f, -0.410843171057903910f, 0.911390651104122430f, - -0.411542319913765220f, - 0.911074734055176360f, -0.412241226669882890f, 0.910758281044437570f, - -0.412939890915108080f, - 0.910441292258067250f, -0.413638312238434500f, 0.910123767882541680f, - -0.414336490228999100f, - 0.909805708104652220f, -0.415034424476081630f, 0.909487113111505430f, - -0.415732114569105360f, - 0.909167983090522380f, -0.416429560097637150f, 0.908848318229439120f, - -0.417126760651387870f, - 0.908528118716306120f, -0.417823715820212270f, 0.908207384739488700f, - -0.418520425194109700f, - 0.907886116487666260f, -0.419216888363223910f, 0.907564314149832630f, - -0.419913104917843620f, - 0.907241977915295820f, -0.420609074448402510f, 0.906919107973678140f, - -0.421304796545479640f, - 0.906595704514915330f, -0.422000270799799680f, 0.906271767729257660f, - -0.422695496802232950f, - 0.905947297807268460f, -0.423390474143796050f, 0.905622294939825270f, - -0.424085202415651560f, - 0.905296759318118820f, -0.424779681209108810f, 0.904970691133653250f, - -0.425473910115623800f, - 0.904644090578246240f, -0.426167888726799620f, 0.904316957844028320f, - -0.426861616634386430f, - 0.903989293123443340f, -0.427555093430282080f, 0.903661096609247980f, - -0.428248318706531960f, - 0.903332368494511820f, -0.428941292055329490f, 0.903003108972617150f, - -0.429634013069016380f, - 0.902673318237258830f, -0.430326481340082610f, 0.902342996482444200f, - -0.431018696461167030f, - 0.902012143902493180f, -0.431710658025057260f, 0.901680760692037730f, - -0.432402365624690140f, - 0.901348847046022030f, -0.433093818853151960f, 0.901016403159702330f, - -0.433785017303678520f, - 0.900683429228646970f, -0.434475960569655650f, 0.900349925448735600f, - -0.435166648244619260f, - 0.900015892016160280f, -0.435857079922255470f, 0.899681329127423930f, - -0.436547255196401200f, - 0.899346236979341570f, -0.437237173661044090f, 0.899010615769039070f, - -0.437926834910322860f, - 0.898674465693953820f, -0.438616238538527660f, 0.898337786951834310f, - -0.439305384140099950f, - 0.898000579740739880f, -0.439994271309633260f, 0.897662844259040860f, - -0.440682899641872900f, - 0.897324580705418320f, -0.441371268731716670f, 0.896985789278863970f, - -0.442059378174214700f, - 0.896646470178680150f, -0.442747227564570020f, 0.896306623604479550f, - -0.443434816498138480f, - 0.895966249756185220f, -0.444122144570429200f, 0.895625348834030110f, - -0.444809211377104880f, - 0.895283921038557580f, -0.445496016513981740f, 0.894941966570620750f, - -0.446182559577030070f, - 0.894599485631382700f, -0.446868840162374160f, 0.894256478422316040f, - -0.447554857866293010f, - 0.893912945145203250f, -0.448240612285219890f, 0.893568886002135910f, - -0.448926103015743260f, - 0.893224301195515320f, -0.449611329654606540f, 0.892879190928051680f, - -0.450296291798708610f, - 0.892533555402764580f, -0.450980989045103860f, 0.892187394822982480f, - -0.451665420991002490f, - 0.891840709392342720f, -0.452349587233770890f, 0.891493499314791380f, - -0.453033487370931580f, - 0.891145764794583180f, -0.453717121000163870f, 0.890797506036281490f, - -0.454400487719303580f, - 0.890448723244757880f, -0.455083587126343840f, 0.890099416625192320f, - -0.455766418819434640f, - 0.889749586383072780f, -0.456448982396883920f, 0.889399232724195520f, - -0.457131277457156980f, - 0.889048355854664570f, -0.457813303598877170f, 0.888696955980891600f, - -0.458495060420826270f, - 0.888345033309596350f, -0.459176547521944090f, 0.887992588047805560f, - -0.459857764501329540f, - 0.887639620402853930f, -0.460538710958240010f, 0.887286130582383150f, - -0.461219386492092380f, - 0.886932118794342190f, -0.461899790702462730f, 0.886577585246987040f, - -0.462579923189086810f, - 0.886222530148880640f, -0.463259783551860150f, 0.885866953708892790f, - -0.463939371390838520f, - 0.885510856136199950f, -0.464618686306237820f, 0.885154237640285110f, - -0.465297727898434600f, - 0.884797098430937790f, -0.465976495767966180f, 0.884439438718253810f, - -0.466654989515530920f, - 0.884081258712634990f, -0.467333208741988420f, 0.883722558624789660f, - -0.468011153048359830f, - 0.883363338665731580f, -0.468688822035827900f, 0.883003599046780830f, - -0.469366215305737520f, - 0.882643339979562790f, -0.470043332459595620f, 0.882282561676008710f, - -0.470720173099071600f, - 0.881921264348355050f, -0.471396736825997640f, 0.881559448209143780f, - -0.472073023242368660f, - 0.881197113471222090f, -0.472749031950342790f, 0.880834260347742040f, - -0.473424762552241530f, - 0.880470889052160750f, -0.474100214650549970f, 0.880106999798240360f, - -0.474775387847917120f, - 0.879742592800047410f, -0.475450281747155870f, 0.879377668271953290f, - -0.476124895951243580f, - 0.879012226428633530f, -0.476799230063322090f, 0.878646267485068130f, - -0.477473283686698060f, - 0.878279791656541580f, -0.478147056424843010f, 0.877912799158641840f, - -0.478820547881393890f, - 0.877545290207261350f, -0.479493757660153010f, 0.877177265018595940f, - -0.480166685365088390f, - 0.876808723809145650f, -0.480839330600333960f, 0.876439666795713610f, - -0.481511692970189860f, - 0.876070094195406600f, -0.482183772079122720f, 0.875700006225634600f, - -0.482855567531765670f, - 0.875329403104110890f, -0.483527078932918740f, 0.874958285048851650f, - -0.484198305887549030f, - 0.874586652278176110f, -0.484869248000791060f, 0.874214505010706300f, - -0.485539904877946960f, - 0.873841843465366860f, -0.486210276124486420f, 0.873468667861384880f, - -0.486880361346047340f, - 0.873094978418290090f, -0.487550160148436000f, 0.872720775355914300f, - -0.488219672137626790f, - 0.872346058894391540f, -0.488888896919763170f, 0.871970829254157810f, - -0.489557834101157440f, - 0.871595086655950980f, -0.490226483288291160f, 0.871218831320811020f, - -0.490894844087815090f, - 0.870842063470078980f, -0.491562916106549900f, 0.870464783325397670f, - -0.492230698951486020f, - 0.870086991108711460f, -0.492898192229784040f, 0.869708687042265670f, - -0.493565395548774770f, - 0.869329871348606840f, -0.494232308515959670f, 0.868950544250582380f, - -0.494898930739011260f, - 0.868570705971340900f, -0.495565261825772540f, 0.868190356734331310f, - -0.496231301384258250f, - 0.867809496763303320f, -0.496897049022654470f, 0.867428126282306920f, - -0.497562504349319150f, - 0.867046245515692650f, -0.498227666972781870f, 0.866663854688111130f, - -0.498892536501744590f, - 0.866280954024512990f, -0.499557112545081840f, 0.865897543750148820f, - -0.500221394711840680f, - 0.865513624090569090f, -0.500885382611240710f, 0.865129195271623800f, - -0.501549075852675390f, - 0.864744257519462380f, -0.502212474045710790f, 0.864358811060534030f, - -0.502875576800086990f, - 0.863972856121586810f, -0.503538383725717580f, 0.863586392929668100f, - -0.504200894432690340f, - 0.863199421712124160f, -0.504863108531267590f, 0.862811942696600330f, - -0.505525025631885390f, - 0.862423956111040610f, -0.506186645345155230f, 0.862035462183687210f, - -0.506847967281863210f, - 0.861646461143081300f, -0.507508991052970870f, 0.861256953218062170f, - -0.508169716269614600f, - 0.860866938637767310f, -0.508830142543106990f, 0.860476417631632070f, - -0.509490269484936360f, - 0.860085390429390140f, -0.510150096706766810f, 0.859693857261072610f, - -0.510809623820439040f, - 0.859301818357008470f, -0.511468850437970300f, 0.858909273947823900f, - -0.512127776171554690f, - 0.858516224264442740f, -0.512786400633562960f, 0.858122669538086140f, - -0.513444723436543460f, - 0.857728610000272120f, -0.514102744193221660f, 0.857334045882815590f, - -0.514760462516501200f, - 0.856938977417828760f, -0.515417878019462930f, 0.856543404837719960f, - -0.516074990315366630f, - 0.856147328375194470f, -0.516731799017649870f, 0.855750748263253920f, - -0.517388303739929060f, - 0.855353664735196030f, -0.518044504095999340f, 0.854956078024614930f, - -0.518700399699834950f, - 0.854557988365400530f, -0.519355990165589640f, 0.854159395991738850f, - -0.520011275107596040f, - 0.853760301138111410f, -0.520666254140367160f, 0.853360704039295430f, - -0.521320926878595660f, - 0.852960604930363630f, -0.521975292937154390f, 0.852560004046684080f, - -0.522629351931096610f, - 0.852158901623919830f, -0.523283103475656430f, 0.851757297898029120f, - -0.523936547186248600f, - 0.851355193105265200f, -0.524589682678468950f, 0.850952587482175730f, - -0.525242509568094710f, - 0.850549481265603480f, -0.525895027471084630f, 0.850145874692685210f, - -0.526547236003579440f, - 0.849741768000852550f, -0.527199134781901280f, 0.849337161427830780f, - -0.527850723422555230f, - 0.848932055211639610f, -0.528502001542228480f, 0.848526449590592650f, - -0.529152968757790610f, - 0.848120344803297230f, -0.529803624686294610f, 0.847713741088654380f, - -0.530453968944976320f, - 0.847306638685858320f, -0.531104001151255000f, 0.846899037834397240f, - -0.531753720922733320f, - 0.846490938774052130f, -0.532403127877197900f, 0.846082341744897050f, - -0.533052221632619450f, - 0.845673246987299070f, -0.533701001807152960f, 0.845263654741918220f, - -0.534349468019137520f, - 0.844853565249707120f, -0.534997619887097150f, 0.844442978751910660f, - -0.535645457029741090f, - 0.844031895490066410f, -0.536292979065963180f, 0.843620315706004150f, - -0.536940185614842910f, - 0.843208239641845440f, -0.537587076295645390f, 0.842795667540004120f, - -0.538233650727821700f, - 0.842382599643185850f, -0.538879908531008420f, 0.841969036194387680f, - -0.539525849325028890f, - 0.841554977436898440f, -0.540171472729892850f, 0.841140423614298080f, - -0.540816778365796670f, - 0.840725374970458070f, -0.541461765853123440f, 0.840309831749540770f, - -0.542106434812443920f, - 0.839893794195999520f, -0.542750784864515890f, 0.839477262554578550f, - -0.543394815630284800f, - 0.839060237070312740f, -0.544038526730883820f, 0.838642717988527300f, - -0.544681917787634530f, - 0.838224705554838080f, -0.545324988422046460f, 0.837806200015150940f, - -0.545967738255817570f, - 0.837387201615661940f, -0.546610166910834860f, 0.836967710602857020f, - -0.547252274009174090f, - 0.836547727223512010f, -0.547894059173100190f, 0.836127251724692270f, - -0.548535522025067390f, - 0.835706284353752600f, -0.549176662187719660f, 0.835284825358337370f, - -0.549817479283890910f, - 0.834862874986380010f, -0.550457972936604810f, 0.834440433486103190f, - -0.551098142769075430f, - 0.834017501106018130f, -0.551737988404707340f, 0.833594078094925140f, - -0.552377509467096070f, - 0.833170164701913190f, -0.553016705580027470f, 0.832745761176359460f, - -0.553655576367479310f, - 0.832320867767929680f, -0.554294121453620000f, 0.831895484726577590f, - -0.554932340462810370f, - 0.831469612302545240f, -0.555570233019602180f, 0.831043250746362320f, - -0.556207798748739930f, - 0.830616400308846310f, -0.556845037275160100f, 0.830189061241102370f, - -0.557481948223991550f, - 0.829761233794523050f, -0.558118531220556100f, 0.829332918220788250f, - -0.558754785890368310f, - 0.828904114771864870f, -0.559390711859136140f, 0.828474823700007130f, - -0.560026308752760380f, - 0.828045045257755800f, -0.560661576197336030f, 0.827614779697938400f, - -0.561296513819151470f, - 0.827184027273669130f, -0.561931121244689470f, 0.826752788238348520f, - -0.562565398100626560f, - 0.826321062845663530f, -0.563199344013834090f, 0.825888851349586780f, - -0.563832958611378170f, - 0.825456154004377550f, -0.564466241520519500f, 0.825022971064580220f, - -0.565099192368713980f, - 0.824589302785025290f, -0.565731810783613120f, 0.824155149420828570f, - -0.566364096393063840f, - 0.823720511227391430f, -0.566996048825108680f, 0.823285388460400110f, - -0.567627667707986230f, - 0.822849781375826430f, -0.568258952670131490f, 0.822413690229926390f, - -0.568889903340175860f, - 0.821977115279241550f, -0.569520519346947140f, 0.821540056780597610f, - -0.570150800319470300f, - 0.821102514991104650f, -0.570780745886967260f, 0.820664490168157460f, - -0.571410355678857230f, - 0.820225982569434690f, -0.572039629324757050f, 0.819786992452898990f, - -0.572668566454481160f, - 0.819347520076796900f, -0.573297166698042200f, 0.818907565699658950f, - -0.573925429685650750f, - 0.818467129580298660f, -0.574553355047715760f, 0.818026211977813440f, - -0.575180942414845080f, - 0.817584813151583710f, -0.575808191417845340f, 0.817142933361272970f, - -0.576435101687721830f, - 0.816700572866827850f, -0.577061672855679440f, 0.816257731928477390f, - -0.577687904553122800f, - 0.815814410806733780f, -0.578313796411655590f, 0.815370609762391290f, - -0.578939348063081780f, - 0.814926329056526620f, -0.579564559139405630f, 0.814481568950498610f, - -0.580189429272831680f, - 0.814036329705948410f, -0.580813958095764530f, 0.813590611584798510f, - -0.581438145240810170f, - 0.813144414849253590f, -0.582061990340775440f, 0.812697739761799490f, - -0.582685493028668460f, - 0.812250586585203880f, -0.583308652937698290f, 0.811802955582515470f, - -0.583931469701276180f, - 0.811354847017063730f, -0.584553942953015330f, 0.810906261152459670f, - -0.585176072326730410f, - 0.810457198252594770f, -0.585797857456438860f, 0.810007658581641140f, - -0.586419297976360500f, - 0.809557642404051260f, -0.587040393520917970f, 0.809107149984558240f, - -0.587661143724736660f, - 0.808656181588174980f, -0.588281548222645220f, 0.808204737480194720f, - -0.588901606649675720f, - 0.807752817926190360f, -0.589521318641063940f, 0.807300423192014450f, - -0.590140683832248820f, - 0.806847553543799330f, -0.590759701858874160f, 0.806394209247956240f, - -0.591378372356787580f, - 0.805940390571176280f, -0.591996694962040990f, 0.805486097780429230f, - -0.592614669310891130f, - 0.805031331142963660f, -0.593232295039799800f, 0.804576090926307110f, - -0.593849571785433630f, - 0.804120377398265810f, -0.594466499184664430f, 0.803664190826924090f, - -0.595083076874569960f, - 0.803207531480644940f, -0.595699304492433360f, 0.802750399628069160f, - -0.596315181675743710f, - 0.802292795538115720f, -0.596930708062196500f, 0.801834719479981310f, - -0.597545883289693160f, - 0.801376171723140240f, -0.598160706996342270f, 0.800917152537344300f, - -0.598775178820458720f, - 0.800457662192622820f, -0.599389298400564540f, 0.799997700959281910f, - -0.600003065375388940f, - 0.799537269107905010f, -0.600616479383868970f, 0.799076366909352350f, - -0.601229540065148500f, - 0.798614994634760820f, -0.601842247058580030f, 0.798153152555543750f, - -0.602454600003723750f, - 0.797690840943391160f, -0.603066598540348160f, 0.797228060070268810f, - -0.603678242308430370f, - 0.796764810208418830f, -0.604289530948155960f, 0.796301091630359110f, - -0.604900464099919820f, - 0.795836904608883570f, -0.605511041404325550f, 0.795372249417061310f, - -0.606121262502186120f, - 0.794907126328237010f, -0.606731127034524480f, 0.794441535616030590f, - -0.607340634642572930f, - 0.793975477554337170f, -0.607949784967773630f, 0.793508952417326660f, - -0.608558577651779450f, - 0.793041960479443640f, -0.609167012336453210f, 0.792574502015407690f, - -0.609775088663868430f, - 0.792106577300212390f, -0.610382806276309480f, 0.791638186609125880f, - -0.610990164816271660f, - 0.791169330217690200f, -0.611597163926461910f, 0.790700008401721610f, - -0.612203803249797950f, - 0.790230221437310030f, -0.612810082429409710f, 0.789759969600819070f, - -0.613416001108638590f, - 0.789289253168885650f, -0.614021558931038380f, 0.788818072418420280f, - -0.614626755540375050f, - 0.788346427626606340f, -0.615231590580626820f, 0.787874319070900220f, - -0.615836063695985090f, - 0.787401747029031430f, -0.616440174530853650f, 0.786928711779001810f, - -0.617043922729849760f, - 0.786455213599085770f, -0.617647307937803870f, 0.785981252767830150f, - -0.618250329799760250f, - 0.785506829564053930f, -0.618852987960976320f, 0.785031944266848080f, - -0.619455282066924020f, - 0.784556597155575240f, -0.620057211763289100f, 0.784080788509869950f, - -0.620658776695972140f, - 0.783604518609638200f, -0.621259976511087550f, 0.783127787735057310f, - -0.621860810854965360f, - 0.782650596166575730f, -0.622461279374149970f, 0.782172944184913010f, - -0.623061381715401260f, - 0.781694832071059390f, -0.623661117525694530f, 0.781216260106276090f, - -0.624260486452220650f, - 0.780737228572094490f, -0.624859488142386340f, 0.780257737750316590f, - -0.625458122243814360f, - 0.779777787923014550f, -0.626056388404343520f, 0.779297379372530300f, - -0.626654286272029350f, - 0.778816512381475980f, -0.627251815495144080f, 0.778335187232733210f, - -0.627848975722176460f, - 0.777853404209453150f, -0.628445766601832710f, 0.777371163595056310f, - -0.629042187783036000f, - 0.776888465673232440f, -0.629638238914926980f, 0.776405310727940390f, - -0.630233919646864370f, - 0.775921699043407690f, -0.630829229628424470f, 0.775437630904130540f, - -0.631424168509401860f, - 0.774953106594873930f, -0.632018735939809060f, 0.774468126400670860f, - -0.632612931569877410f, - 0.773982690606822900f, -0.633206755050057190f, 0.773496799498899050f, - -0.633800206031017280f, - 0.773010453362736990f, -0.634393284163645490f, 0.772523652484441330f, - -0.634985989099049460f, - 0.772036397150384520f, -0.635578320488556110f, 0.771548687647206300f, - -0.636170277983712170f, - 0.771060524261813820f, -0.636761861236284200f, 0.770571907281380810f, - -0.637353069898259130f, - 0.770082836993347900f, -0.637943903621844060f, 0.769593313685422940f, - -0.638534362059466790f, - 0.769103337645579700f, -0.639124444863775730f, 0.768612909162058380f, - -0.639714151687640450f, - 0.768122028523365420f, -0.640303482184151670f, 0.767630696018273380f, - -0.640892436006621380f, - 0.767138911935820400f, -0.641481012808583160f, 0.766646676565310380f, - -0.642069212243792540f, - 0.766153990196312920f, -0.642657033966226860f, 0.765660853118662500f, - -0.643244477630085850f, - 0.765167265622458960f, -0.643831542889791390f, 0.764673227998067140f, - -0.644418229399988380f, - 0.764178740536116670f, -0.645004536815543930f, 0.763683803527501870f, - -0.645590464791548690f, - 0.763188417263381270f, -0.646176012983316280f, 0.762692582035177980f, - -0.646761181046383920f, - 0.762196298134578900f, -0.647345968636512060f, 0.761699565853535380f, - -0.647930375409685340f, - 0.761202385484261780f, -0.648514401022112440f, 0.760704757319236920f, - -0.649098045130225950f, - 0.760206681651202420f, -0.649681307390683190f, 0.759708158773163440f, - -0.650264187460365850f, - 0.759209188978388070f, -0.650846684996380880f, 0.758709772560407390f, - -0.651428799656059820f, - 0.758209909813015280f, -0.652010531096959500f, 0.757709601030268080f, - -0.652591878976862440f, - 0.757208846506484570f, -0.653172842953776760f, 0.756707646536245670f, - -0.653753422685936060f, - 0.756206001414394540f, -0.654333617831800440f, 0.755703911436035880f, - -0.654913428050056030f, - 0.755201376896536550f, -0.655492852999615350f, 0.754698398091524500f, - -0.656071892339617600f, - 0.754194975316889170f, -0.656650545729428940f, 0.753691108868781210f, - -0.657228812828642540f, - 0.753186799043612520f, -0.657806693297078640f, 0.752682046138055340f, - -0.658384186794785050f, - 0.752176850449042810f, -0.658961292982037320f, 0.751671212273768430f, - -0.659538011519338660f, - 0.751165131909686480f, -0.660114342067420480f, 0.750658609654510700f, - -0.660690284287242300f, - 0.750151645806215070f, -0.661265837839992270f, 0.749644240663033480f, - -0.661841002387086870f, - 0.749136394523459370f, -0.662415777590171780f, 0.748628107686245440f, - -0.662990163111121470f, - 0.748119380450403600f, -0.663564158612039770f, 0.747610213115205150f, - -0.664137763755260010f, - 0.747100605980180130f, -0.664710978203344790f, 0.746590559345117310f, - -0.665283801619087180f, - 0.746080073510063780f, -0.665856233665509720f, 0.745569148775325430f, - -0.666428274005865240f, - 0.745057785441466060f, -0.666999922303637470f, 0.744545983809307370f, - -0.667571178222540310f, - 0.744033744179929290f, -0.668142041426518450f, 0.743521066854669120f, - -0.668712511579747980f, - 0.743007952135121720f, -0.669282588346636010f, 0.742494400323139180f, - -0.669852271391821020f, - 0.741980411720831070f, -0.670421560380173090f, 0.741465986630563290f, - -0.670990454976794220f, - 0.740951125354959110f, -0.671558954847018330f, 0.740435828196898020f, - -0.672127059656411730f, - 0.739920095459516200f, -0.672694769070772860f, 0.739403927446205760f, - -0.673262082756132970f, - 0.738887324460615110f, -0.673829000378756040f, 0.738370286806648620f, - -0.674395521605139050f, - 0.737852814788465980f, -0.674961646102011930f, 0.737334908710482910f, - -0.675527373536338520f, - 0.736816568877369900f, -0.676092703575315920f, 0.736297795594053170f, - -0.676657635886374950f, - 0.735778589165713590f, -0.677222170137180330f, 0.735258949897786840f, - -0.677786305995631500f, - 0.734738878095963500f, -0.678350043129861470f, 0.734218374066188280f, - -0.678913381208238410f, - 0.733697438114660370f, -0.679476319899364970f, 0.733176070547832740f, - -0.680038858872078930f, - 0.732654271672412820f, -0.680600997795453020f, 0.732132041795361290f, - -0.681162736338795430f, - 0.731609381223892630f, -0.681724074171649710f, 0.731086290265474340f, - -0.682285010963795570f, - 0.730562769227827590f, -0.682845546385248080f, 0.730038818418926260f, - -0.683405680106258680f, - 0.729514438146997010f, -0.683965411797315400f, 0.728989628720519420f, - -0.684524741129142300f, - 0.728464390448225200f, -0.685083667772700360f, 0.727938723639098620f, - -0.685642191399187470f, - 0.727412628602375770f, -0.686200311680038590f, 0.726886105647544970f, - -0.686758028286925890f, - 0.726359155084346010f, -0.687315340891759050f, 0.725831777222770370f, - -0.687872249166685550f, - 0.725303972373060770f, -0.688428752784090440f, 0.724775740845711280f, - -0.688984851416597040f, - 0.724247082951467000f, -0.689540544737066830f, 0.723717999001323500f, - -0.690095832418599950f, - 0.723188489306527460f, -0.690650714134534600f, 0.722658554178575610f, - -0.691205189558448450f, - 0.722128193929215350f, -0.691759258364157750f, 0.721597408870443770f, - -0.692312920225718220f, - 0.721066199314508110f, -0.692866174817424630f, 0.720534565573905270f, - -0.693419021813811760f, - 0.720002507961381650f, -0.693971460889654000f, 0.719470026789932990f, - -0.694523491719965520f, - 0.718937122372804490f, -0.695075113980000880f, 0.718403795023489830f, - -0.695626327345254870f, - 0.717870045055731710f, -0.696177131491462990f, 0.717335872783521730f, - -0.696727526094601200f, - 0.716801278521099540f, -0.697277510830886520f, 0.716266262582953120f, - -0.697827085376777290f, - 0.715730825283818590f, -0.698376249408972920f, 0.715194966938680120f, - -0.698925002604414150f, - 0.714658687862769090f, -0.699473344640283770f, 0.714121988371564820f, - -0.700021275194006250f, - 0.713584868780793640f, -0.700568793943248340f, 0.713047329406429340f, - -0.701115900565918660f, - 0.712509370564692320f, -0.701662594740168450f, 0.711970992572050100f, - -0.702208876144391870f, - 0.711432195745216430f, -0.702754744457225300f, 0.710892980401151680f, - -0.703300199357548730f, - 0.710353346857062420f, -0.703845240524484940f, 0.709813295430400840f, - -0.704389867637400410f, - 0.709272826438865690f, -0.704934080375904880f, 0.708731940200400650f, - -0.705477878419852100f, - 0.708190637033195400f, -0.706021261449339740f, 0.707648917255684350f, - -0.706564229144709510f, - 0.707106781186547570f, -0.707106781186547460f, 0.706564229144709620f, - -0.707648917255684350f, - 0.706021261449339740f, -0.708190637033195290f, 0.705477878419852210f, - -0.708731940200400650f, - 0.704934080375904990f, -0.709272826438865580f, 0.704389867637400410f, - -0.709813295430400840f, - 0.703845240524484940f, -0.710353346857062310f, 0.703300199357548730f, - -0.710892980401151680f, - 0.702754744457225300f, -0.711432195745216430f, 0.702208876144391870f, - -0.711970992572049990f, - 0.701662594740168570f, -0.712509370564692320f, 0.701115900565918660f, - -0.713047329406429230f, - 0.700568793943248450f, -0.713584868780793520f, 0.700021275194006360f, - -0.714121988371564710f, - 0.699473344640283770f, -0.714658687862768980f, 0.698925002604414150f, - -0.715194966938680010f, - 0.698376249408972920f, -0.715730825283818590f, 0.697827085376777290f, - -0.716266262582953120f, - 0.697277510830886630f, -0.716801278521099540f, 0.696727526094601200f, - -0.717335872783521730f, - 0.696177131491462990f, -0.717870045055731710f, 0.695626327345254870f, - -0.718403795023489720f, - 0.695075113980000880f, -0.718937122372804380f, 0.694523491719965520f, - -0.719470026789932990f, - 0.693971460889654000f, -0.720002507961381650f, 0.693419021813811880f, - -0.720534565573905270f, - 0.692866174817424740f, -0.721066199314508110f, 0.692312920225718220f, - -0.721597408870443660f, - 0.691759258364157750f, -0.722128193929215350f, 0.691205189558448450f, - -0.722658554178575610f, - 0.690650714134534720f, -0.723188489306527350f, 0.690095832418599950f, - -0.723717999001323390f, - 0.689540544737066940f, -0.724247082951466890f, 0.688984851416597150f, - -0.724775740845711280f, - 0.688428752784090550f, -0.725303972373060660f, 0.687872249166685550f, - -0.725831777222770370f, - 0.687315340891759160f, -0.726359155084346010f, 0.686758028286925890f, - -0.726886105647544970f, - 0.686200311680038700f, -0.727412628602375770f, 0.685642191399187470f, - -0.727938723639098620f, - 0.685083667772700360f, -0.728464390448225200f, 0.684524741129142300f, - -0.728989628720519310f, - 0.683965411797315510f, -0.729514438146996900f, 0.683405680106258790f, - -0.730038818418926150f, - 0.682845546385248080f, -0.730562769227827590f, 0.682285010963795570f, - -0.731086290265474230f, - 0.681724074171649820f, -0.731609381223892520f, 0.681162736338795430f, - -0.732132041795361290f, - 0.680600997795453130f, -0.732654271672412820f, 0.680038858872079040f, - -0.733176070547832740f, - 0.679476319899365080f, -0.733697438114660260f, 0.678913381208238410f, - -0.734218374066188170f, - 0.678350043129861580f, -0.734738878095963390f, 0.677786305995631500f, - -0.735258949897786730f, - 0.677222170137180450f, -0.735778589165713480f, 0.676657635886374950f, - -0.736297795594053060f, - 0.676092703575316030f, -0.736816568877369790f, 0.675527373536338630f, - -0.737334908710482790f, - 0.674961646102012040f, -0.737852814788465980f, 0.674395521605139050f, - -0.738370286806648510f, - 0.673829000378756150f, -0.738887324460615110f, 0.673262082756132970f, - -0.739403927446205760f, - 0.672694769070772970f, -0.739920095459516090f, 0.672127059656411840f, - -0.740435828196898020f, - 0.671558954847018330f, -0.740951125354959110f, 0.670990454976794220f, - -0.741465986630563290f, - 0.670421560380173090f, -0.741980411720830960f, 0.669852271391821130f, - -0.742494400323139180f, - 0.669282588346636010f, -0.743007952135121720f, 0.668712511579748090f, - -0.743521066854669120f, - 0.668142041426518560f, -0.744033744179929180f, 0.667571178222540310f, - -0.744545983809307250f, - 0.666999922303637470f, -0.745057785441465950f, 0.666428274005865350f, - -0.745569148775325430f, - 0.665856233665509720f, -0.746080073510063780f, 0.665283801619087180f, - -0.746590559345117310f, - 0.664710978203344900f, -0.747100605980180130f, 0.664137763755260010f, - -0.747610213115205150f, - 0.663564158612039880f, -0.748119380450403490f, 0.662990163111121470f, - -0.748628107686245330f, - 0.662415777590171780f, -0.749136394523459260f, 0.661841002387086870f, - -0.749644240663033480f, - 0.661265837839992270f, -0.750151645806214960f, 0.660690284287242300f, - -0.750658609654510590f, - 0.660114342067420480f, -0.751165131909686370f, 0.659538011519338770f, - -0.751671212273768430f, - 0.658961292982037320f, -0.752176850449042700f, 0.658384186794785050f, - -0.752682046138055230f, - 0.657806693297078640f, -0.753186799043612410f, 0.657228812828642650f, - -0.753691108868781210f, - 0.656650545729429050f, -0.754194975316889170f, 0.656071892339617710f, - -0.754698398091524390f, - 0.655492852999615460f, -0.755201376896536550f, 0.654913428050056150f, - -0.755703911436035880f, - 0.654333617831800550f, -0.756206001414394540f, 0.653753422685936170f, - -0.756707646536245670f, - 0.653172842953776760f, -0.757208846506484460f, 0.652591878976862550f, - -0.757709601030268080f, - 0.652010531096959500f, -0.758209909813015280f, 0.651428799656059820f, - -0.758709772560407390f, - 0.650846684996380990f, -0.759209188978387960f, 0.650264187460365960f, - -0.759708158773163440f, - 0.649681307390683190f, -0.760206681651202420f, 0.649098045130226060f, - -0.760704757319236920f, - 0.648514401022112550f, -0.761202385484261780f, 0.647930375409685460f, - -0.761699565853535270f, - 0.647345968636512060f, -0.762196298134578900f, 0.646761181046383920f, - -0.762692582035177870f, - 0.646176012983316390f, -0.763188417263381270f, 0.645590464791548800f, - -0.763683803527501870f, - 0.645004536815544040f, -0.764178740536116670f, 0.644418229399988380f, - -0.764673227998067140f, - 0.643831542889791500f, -0.765167265622458960f, 0.643244477630085850f, - -0.765660853118662390f, - 0.642657033966226860f, -0.766153990196312810f, 0.642069212243792540f, - -0.766646676565310380f, - 0.641481012808583160f, -0.767138911935820400f, 0.640892436006621380f, - -0.767630696018273270f, - 0.640303482184151670f, -0.768122028523365310f, 0.639714151687640450f, - -0.768612909162058270f, - 0.639124444863775730f, -0.769103337645579590f, 0.638534362059466790f, - -0.769593313685422940f, - 0.637943903621844170f, -0.770082836993347900f, 0.637353069898259130f, - -0.770571907281380700f, - 0.636761861236284200f, -0.771060524261813710f, 0.636170277983712170f, - -0.771548687647206300f, - 0.635578320488556230f, -0.772036397150384410f, 0.634985989099049460f, - -0.772523652484441330f, - 0.634393284163645490f, -0.773010453362736990f, 0.633800206031017280f, - -0.773496799498899050f, - 0.633206755050057190f, -0.773982690606822790f, 0.632612931569877520f, - -0.774468126400670860f, - 0.632018735939809060f, -0.774953106594873820f, 0.631424168509401860f, - -0.775437630904130430f, - 0.630829229628424470f, -0.775921699043407580f, 0.630233919646864480f, - -0.776405310727940390f, - 0.629638238914927100f, -0.776888465673232440f, 0.629042187783036000f, - -0.777371163595056200f, - 0.628445766601832710f, -0.777853404209453040f, 0.627848975722176570f, - -0.778335187232733090f, - 0.627251815495144190f, -0.778816512381475870f, 0.626654286272029460f, - -0.779297379372530300f, - 0.626056388404343520f, -0.779777787923014440f, 0.625458122243814360f, - -0.780257737750316590f, - 0.624859488142386450f, -0.780737228572094380f, 0.624260486452220650f, - -0.781216260106276090f, - 0.623661117525694640f, -0.781694832071059390f, 0.623061381715401370f, - -0.782172944184912900f, - 0.622461279374150080f, -0.782650596166575730f, 0.621860810854965360f, - -0.783127787735057310f, - 0.621259976511087660f, -0.783604518609638200f, 0.620658776695972140f, - -0.784080788509869950f, - 0.620057211763289210f, -0.784556597155575240f, 0.619455282066924020f, - -0.785031944266848080f, - 0.618852987960976320f, -0.785506829564053930f, 0.618250329799760250f, - -0.785981252767830150f, - 0.617647307937803980f, -0.786455213599085770f, 0.617043922729849760f, - -0.786928711779001700f, - 0.616440174530853650f, -0.787401747029031320f, 0.615836063695985090f, - -0.787874319070900110f, - 0.615231590580626820f, -0.788346427626606230f, 0.614626755540375050f, - -0.788818072418420170f, - 0.614021558931038490f, -0.789289253168885650f, 0.613416001108638590f, - -0.789759969600819070f, - 0.612810082429409710f, -0.790230221437310030f, 0.612203803249798060f, - -0.790700008401721610f, - 0.611597163926462020f, -0.791169330217690090f, 0.610990164816271770f, - -0.791638186609125770f, - 0.610382806276309480f, -0.792106577300212390f, 0.609775088663868430f, - -0.792574502015407580f, - 0.609167012336453210f, -0.793041960479443640f, 0.608558577651779450f, - -0.793508952417326660f, - 0.607949784967773740f, -0.793975477554337170f, 0.607340634642572930f, - -0.794441535616030590f, - 0.606731127034524480f, -0.794907126328237010f, 0.606121262502186230f, - -0.795372249417061190f, - 0.605511041404325550f, -0.795836904608883460f, 0.604900464099919930f, - -0.796301091630359110f, - 0.604289530948156070f, -0.796764810208418720f, 0.603678242308430370f, - -0.797228060070268700f, - 0.603066598540348280f, -0.797690840943391040f, 0.602454600003723860f, - -0.798153152555543750f, - 0.601842247058580030f, -0.798614994634760820f, 0.601229540065148620f, - -0.799076366909352350f, - 0.600616479383868970f, -0.799537269107905010f, 0.600003065375389060f, - -0.799997700959281910f, - 0.599389298400564540f, -0.800457662192622710f, 0.598775178820458720f, - -0.800917152537344300f, - 0.598160706996342380f, -0.801376171723140130f, 0.597545883289693270f, - -0.801834719479981310f, - 0.596930708062196500f, -0.802292795538115720f, 0.596315181675743820f, - -0.802750399628069160f, - 0.595699304492433470f, -0.803207531480644830f, 0.595083076874569960f, - -0.803664190826924090f, - 0.594466499184664540f, -0.804120377398265700f, 0.593849571785433630f, - -0.804576090926307000f, - 0.593232295039799800f, -0.805031331142963660f, 0.592614669310891130f, - -0.805486097780429120f, - 0.591996694962040990f, -0.805940390571176280f, 0.591378372356787580f, - -0.806394209247956240f, - 0.590759701858874280f, -0.806847553543799220f, 0.590140683832248940f, - -0.807300423192014450f, - 0.589521318641063940f, -0.807752817926190360f, 0.588901606649675840f, - -0.808204737480194720f, - 0.588281548222645330f, -0.808656181588174980f, 0.587661143724736770f, - -0.809107149984558130f, - 0.587040393520918080f, -0.809557642404051260f, 0.586419297976360500f, - -0.810007658581641140f, - 0.585797857456438860f, -0.810457198252594770f, 0.585176072326730410f, - -0.810906261152459670f, - 0.584553942953015330f, -0.811354847017063730f, 0.583931469701276300f, - -0.811802955582515360f, - 0.583308652937698290f, -0.812250586585203880f, 0.582685493028668460f, - -0.812697739761799490f, - 0.582061990340775550f, -0.813144414849253590f, 0.581438145240810280f, - -0.813590611584798510f, - 0.580813958095764530f, -0.814036329705948300f, 0.580189429272831680f, - -0.814481568950498610f, - 0.579564559139405740f, -0.814926329056526620f, 0.578939348063081890f, - -0.815370609762391290f, - 0.578313796411655590f, -0.815814410806733780f, 0.577687904553122800f, - -0.816257731928477390f, - 0.577061672855679550f, -0.816700572866827850f, 0.576435101687721830f, - -0.817142933361272970f, - 0.575808191417845340f, -0.817584813151583710f, 0.575180942414845190f, - -0.818026211977813440f, - 0.574553355047715760f, -0.818467129580298660f, 0.573925429685650750f, - -0.818907565699658950f, - 0.573297166698042320f, -0.819347520076796900f, 0.572668566454481160f, - -0.819786992452898990f, - 0.572039629324757050f, -0.820225982569434690f, 0.571410355678857340f, - -0.820664490168157460f, - 0.570780745886967370f, -0.821102514991104650f, 0.570150800319470300f, - -0.821540056780597610f, - 0.569520519346947250f, -0.821977115279241550f, 0.568889903340175970f, - -0.822413690229926390f, - 0.568258952670131490f, -0.822849781375826320f, 0.567627667707986230f, - -0.823285388460400110f, - 0.566996048825108680f, -0.823720511227391320f, 0.566364096393063950f, - -0.824155149420828570f, - 0.565731810783613230f, -0.824589302785025290f, 0.565099192368714090f, - -0.825022971064580220f, - 0.564466241520519500f, -0.825456154004377440f, 0.563832958611378170f, - -0.825888851349586780f, - 0.563199344013834090f, -0.826321062845663420f, 0.562565398100626560f, - -0.826752788238348520f, - 0.561931121244689470f, -0.827184027273669020f, 0.561296513819151470f, - -0.827614779697938400f, - 0.560661576197336030f, -0.828045045257755800f, 0.560026308752760380f, - -0.828474823700007130f, - 0.559390711859136140f, -0.828904114771864870f, 0.558754785890368310f, - -0.829332918220788250f, - 0.558118531220556100f, -0.829761233794523050f, 0.557481948223991660f, - -0.830189061241102370f, - 0.556845037275160100f, -0.830616400308846200f, 0.556207798748739930f, - -0.831043250746362320f, - 0.555570233019602290f, -0.831469612302545240f, 0.554932340462810370f, - -0.831895484726577590f, - 0.554294121453620110f, -0.832320867767929680f, 0.553655576367479310f, - -0.832745761176359460f, - 0.553016705580027580f, -0.833170164701913190f, 0.552377509467096070f, - -0.833594078094925140f, - 0.551737988404707450f, -0.834017501106018130f, 0.551098142769075430f, - -0.834440433486103190f, - 0.550457972936604810f, -0.834862874986380010f, 0.549817479283891020f, - -0.835284825358337370f, - 0.549176662187719770f, -0.835706284353752600f, 0.548535522025067390f, - -0.836127251724692160f, - 0.547894059173100190f, -0.836547727223511890f, 0.547252274009174090f, - -0.836967710602857020f, - 0.546610166910834860f, -0.837387201615661940f, 0.545967738255817680f, - -0.837806200015150940f, - 0.545324988422046460f, -0.838224705554837970f, 0.544681917787634530f, - -0.838642717988527300f, - 0.544038526730883930f, -0.839060237070312630f, 0.543394815630284800f, - -0.839477262554578550f, - 0.542750784864516000f, -0.839893794195999410f, 0.542106434812444030f, - -0.840309831749540770f, - 0.541461765853123560f, -0.840725374970458070f, 0.540816778365796670f, - -0.841140423614298080f, - 0.540171472729892970f, -0.841554977436898330f, 0.539525849325029010f, - -0.841969036194387680f, - 0.538879908531008420f, -0.842382599643185960f, 0.538233650727821700f, - -0.842795667540004120f, - 0.537587076295645510f, -0.843208239641845440f, 0.536940185614843020f, - -0.843620315706004040f, - 0.536292979065963180f, -0.844031895490066410f, 0.535645457029741090f, - -0.844442978751910660f, - 0.534997619887097260f, -0.844853565249707010f, 0.534349468019137520f, - -0.845263654741918220f, - 0.533701001807152960f, -0.845673246987299070f, 0.533052221632619670f, - -0.846082341744896940f, - 0.532403127877198010f, -0.846490938774052020f, 0.531753720922733320f, - -0.846899037834397350f, - 0.531104001151255000f, -0.847306638685858320f, 0.530453968944976320f, - -0.847713741088654270f, - 0.529803624686294830f, -0.848120344803297120f, 0.529152968757790720f, - -0.848526449590592650f, - 0.528502001542228480f, -0.848932055211639610f, 0.527850723422555460f, - -0.849337161427830670f, - 0.527199134781901390f, -0.849741768000852440f, 0.526547236003579330f, - -0.850145874692685210f, - 0.525895027471084740f, -0.850549481265603370f, 0.525242509568094710f, - -0.850952587482175730f, - 0.524589682678468840f, -0.851355193105265200f, 0.523936547186248600f, - -0.851757297898029120f, - 0.523283103475656430f, -0.852158901623919830f, 0.522629351931096720f, - -0.852560004046683970f, - 0.521975292937154390f, -0.852960604930363630f, 0.521320926878595550f, - -0.853360704039295430f, - 0.520666254140367270f, -0.853760301138111300f, 0.520011275107596040f, - -0.854159395991738730f, - 0.519355990165589530f, -0.854557988365400530f, 0.518700399699835170f, - -0.854956078024614820f, - 0.518044504095999340f, -0.855353664735196030f, 0.517388303739929060f, - -0.855750748263253920f, - 0.516731799017649980f, -0.856147328375194470f, 0.516074990315366630f, - -0.856543404837719960f, - 0.515417878019463150f, -0.856938977417828650f, 0.514760462516501200f, - -0.857334045882815590f, - 0.514102744193221660f, -0.857728610000272120f, 0.513444723436543570f, - -0.858122669538086020f, - 0.512786400633563070f, -0.858516224264442740f, 0.512127776171554690f, - -0.858909273947823900f, - 0.511468850437970520f, -0.859301818357008360f, 0.510809623820439040f, - -0.859693857261072610f, - 0.510150096706766700f, -0.860085390429390140f, 0.509490269484936360f, - -0.860476417631632070f, - 0.508830142543106990f, -0.860866938637767310f, 0.508169716269614710f, - -0.861256953218062060f, - 0.507508991052970870f, -0.861646461143081300f, 0.506847967281863320f, - -0.862035462183687210f, - 0.506186645345155450f, -0.862423956111040500f, 0.505525025631885510f, - -0.862811942696600330f, - 0.504863108531267480f, -0.863199421712124160f, 0.504200894432690560f, - -0.863586392929667990f, - 0.503538383725717580f, -0.863972856121586700f, 0.502875576800086880f, - -0.864358811060534030f, - 0.502212474045710900f, -0.864744257519462380f, 0.501549075852675390f, - -0.865129195271623690f, - 0.500885382611240940f, -0.865513624090568980f, 0.500221394711840680f, - -0.865897543750148820f, - 0.499557112545081890f, -0.866280954024512990f, 0.498892536501744750f, - -0.866663854688111020f, - 0.498227666972781870f, -0.867046245515692650f, 0.497562504349319090f, - -0.867428126282306920f, - 0.496897049022654640f, -0.867809496763303210f, 0.496231301384258310f, - -0.868190356734331310f, - 0.495565261825772490f, -0.868570705971340900f, 0.494898930739011310f, - -0.868950544250582380f, - 0.494232308515959730f, -0.869329871348606730f, 0.493565395548774880f, - -0.869708687042265560f, - 0.492898192229784090f, -0.870086991108711350f, 0.492230698951486080f, - -0.870464783325397670f, - 0.491562916106550060f, -0.870842063470078860f, 0.490894844087815140f, - -0.871218831320810900f, - 0.490226483288291100f, -0.871595086655951090f, 0.489557834101157550f, - -0.871970829254157700f, - 0.488888896919763230f, -0.872346058894391540f, 0.488219672137626740f, - -0.872720775355914300f, - 0.487550160148436050f, -0.873094978418290090f, 0.486880361346047400f, - -0.873468667861384880f, - 0.486210276124486530f, -0.873841843465366750f, 0.485539904877947020f, - -0.874214505010706300f, - 0.484869248000791120f, -0.874586652278176110f, 0.484198305887549140f, - -0.874958285048851540f, - 0.483527078932918740f, -0.875329403104110780f, 0.482855567531765670f, - -0.875700006225634600f, - 0.482183772079122830f, -0.876070094195406600f, 0.481511692970189920f, - -0.876439666795713610f, - 0.480839330600333900f, -0.876808723809145760f, 0.480166685365088440f, - -0.877177265018595940f, - 0.479493757660153010f, -0.877545290207261240f, 0.478820547881394050f, - -0.877912799158641730f, - 0.478147056424843120f, -0.878279791656541460f, 0.477473283686698060f, - -0.878646267485068130f, - 0.476799230063322250f, -0.879012226428633410f, 0.476124895951243630f, - -0.879377668271953180f, - 0.475450281747155870f, -0.879742592800047410f, 0.474775387847917230f, - -0.880106999798240360f, - 0.474100214650550020f, -0.880470889052160750f, 0.473424762552241530f, - -0.880834260347742040f, - 0.472749031950342900f, -0.881197113471221980f, 0.472073023242368660f, - -0.881559448209143780f, - 0.471396736825997810f, -0.881921264348354940f, 0.470720173099071710f, - -0.882282561676008600f, - 0.470043332459595620f, -0.882643339979562790f, 0.469366215305737630f, - -0.883003599046780720f, - 0.468688822035827960f, -0.883363338665731580f, 0.468011153048359830f, - -0.883722558624789660f, - 0.467333208741988530f, -0.884081258712634990f, 0.466654989515530970f, - -0.884439438718253700f, - 0.465976495767966130f, -0.884797098430937790f, 0.465297727898434650f, - -0.885154237640285110f, - 0.464618686306237820f, -0.885510856136199950f, 0.463939371390838460f, - -0.885866953708892790f, - 0.463259783551860260f, -0.886222530148880640f, 0.462579923189086810f, - -0.886577585246987040f, - 0.461899790702462840f, -0.886932118794342080f, 0.461219386492092430f, - -0.887286130582383150f, - 0.460538710958240010f, -0.887639620402853930f, 0.459857764501329650f, - -0.887992588047805560f, - 0.459176547521944150f, -0.888345033309596240f, 0.458495060420826220f, - -0.888696955980891710f, - 0.457813303598877290f, -0.889048355854664570f, 0.457131277457156980f, - -0.889399232724195520f, - 0.456448982396883860f, -0.889749586383072890f, 0.455766418819434750f, - -0.890099416625192210f, - 0.455083587126343840f, -0.890448723244757880f, 0.454400487719303750f, - -0.890797506036281490f, - 0.453717121000163930f, -0.891145764794583180f, 0.453033487370931580f, - -0.891493499314791380f, - 0.452349587233771000f, -0.891840709392342720f, 0.451665420991002540f, - -0.892187394822982480f, - 0.450980989045103810f, -0.892533555402764690f, 0.450296291798708730f, - -0.892879190928051680f, - 0.449611329654606600f, -0.893224301195515320f, 0.448926103015743260f, - -0.893568886002136020f, - 0.448240612285220000f, -0.893912945145203250f, 0.447554857866293010f, - -0.894256478422316040f, - 0.446868840162374330f, -0.894599485631382580f, 0.446182559577030120f, - -0.894941966570620750f, - 0.445496016513981740f, -0.895283921038557580f, 0.444809211377105000f, - -0.895625348834030000f, - 0.444122144570429260f, -0.895966249756185110f, 0.443434816498138430f, - -0.896306623604479660f, - 0.442747227564570130f, -0.896646470178680150f, 0.442059378174214760f, - -0.896985789278863970f, - 0.441371268731716620f, -0.897324580705418320f, 0.440682899641873020f, - -0.897662844259040750f, - 0.439994271309633260f, -0.898000579740739880f, 0.439305384140100060f, - -0.898337786951834190f, - 0.438616238538527710f, -0.898674465693953820f, 0.437926834910322860f, - -0.899010615769039070f, - 0.437237173661044200f, -0.899346236979341460f, 0.436547255196401250f, - -0.899681329127423930f, - 0.435857079922255470f, -0.900015892016160280f, 0.435166648244619370f, - -0.900349925448735600f, - 0.434475960569655710f, -0.900683429228646860f, 0.433785017303678520f, - -0.901016403159702330f, - 0.433093818853152010f, -0.901348847046022030f, 0.432402365624690140f, - -0.901680760692037730f, - 0.431710658025057370f, -0.902012143902493070f, 0.431018696461167080f, - -0.902342996482444200f, - 0.430326481340082610f, -0.902673318237258830f, 0.429634013069016500f, - -0.903003108972617040f, - 0.428941292055329550f, -0.903332368494511820f, 0.428248318706531910f, - -0.903661096609247980f, - 0.427555093430282200f, -0.903989293123443340f, 0.426861616634386490f, - -0.904316957844028320f, - 0.426167888726799620f, -0.904644090578246240f, 0.425473910115623910f, - -0.904970691133653250f, - 0.424779681209108810f, -0.905296759318118820f, 0.424085202415651670f, - -0.905622294939825160f, - 0.423390474143796100f, -0.905947297807268460f, 0.422695496802232950f, - -0.906271767729257660f, - 0.422000270799799790f, -0.906595704514915330f, 0.421304796545479700f, - -0.906919107973678030f, - 0.420609074448402510f, -0.907241977915295930f, 0.419913104917843730f, - -0.907564314149832520f, - 0.419216888363223960f, -0.907886116487666150f, 0.418520425194109700f, - -0.908207384739488700f, - 0.417823715820212380f, -0.908528118716306120f, 0.417126760651387870f, - -0.908848318229439120f, - 0.416429560097637320f, -0.909167983090522270f, 0.415732114569105420f, - -0.909487113111505430f, - 0.415034424476081630f, -0.909805708104652220f, 0.414336490228999210f, - -0.910123767882541570f, - 0.413638312238434560f, -0.910441292258067140f, 0.412939890915108020f, - -0.910758281044437570f, - 0.412241226669883000f, -0.911074734055176250f, 0.411542319913765280f, - -0.911390651104122320f, - 0.410843171057903910f, -0.911706032005429880f, 0.410143780513590350f, - -0.912020876573568230f, - 0.409444148692257590f, -0.912335184623322750f, 0.408744276005481520f, - -0.912648955969793900f, - 0.408044162864978740f, -0.912962190428398100f, 0.407343809682607970f, - -0.913274887814867760f, - 0.406643216870369140f, -0.913587047945250810f, 0.405942384840402570f, - -0.913898670635911680f, - 0.405241314004989860f, -0.914209755703530690f, 0.404540004776553110f, - -0.914520302965104450f, - 0.403838457567654130f, -0.914830312237946090f, 0.403136672790995240f, - -0.915139783339685260f, - 0.402434650859418540f, -0.915448716088267830f, 0.401732392185905010f, - -0.915757110301956720f, - 0.401029897183575790f, -0.916064965799331610f, 0.400327166265690150f, - -0.916372282399289140f, - 0.399624199845646790f, -0.916679059921042700f, 0.398920998336983020f, - -0.916985298184122890f, - 0.398217562153373620f, -0.917290997008377910f, 0.397513891708632330f, - -0.917596156213972950f, - 0.396809987416710420f, -0.917900775621390390f, 0.396105849691696320f, - -0.918204855051430900f, - 0.395401478947816300f, -0.918508394325212250f, 0.394696875599433670f, - -0.918811393264169940f, - 0.393992040061048100f, -0.919113851690057770f, 0.393286972747296570f, - -0.919415769424946960f, - 0.392581674072951530f, -0.919717146291227360f, 0.391876144452922350f, - -0.920017982111606570f, - 0.391170384302253980f, -0.920318276709110480f, 0.390464394036126650f, - -0.920618029907083860f, - 0.389758174069856410f, -0.920917241529189520f, 0.389051724818894500f, - -0.921215911399408730f, - 0.388345046698826300f, -0.921514039342041900f, 0.387638140125372680f, - -0.921811625181708120f, - 0.386931005514388690f, -0.922108668743345070f, 0.386223643281862980f, - -0.922405169852209880f, - 0.385516053843919020f, -0.922701128333878520f, 0.384808237616812930f, - -0.922996544014246250f, - 0.384100195016935040f, -0.923291416719527640f, 0.383391926460808770f, - -0.923585746276256560f, - 0.382683432365089840f, -0.923879532511286740f, 0.381974713146567220f, - -0.924172775251791200f, - 0.381265769222162490f, -0.924465474325262600f, 0.380556601008928570f, - -0.924757629559513910f, - 0.379847208924051110f, -0.925049240782677580f, 0.379137593384847430f, - -0.925340307823206200f, - 0.378427754808765620f, -0.925630830509872720f, 0.377717693613385810f, - -0.925920808671769960f, - 0.377007410216418310f, -0.926210242138311270f, 0.376296905035704790f, - -0.926499130739230510f, - 0.375586178489217330f, -0.926787474304581750f, 0.374875230995057600f, - -0.927075272664740100f, - 0.374164062971457990f, -0.927362525650401110f, 0.373452674836780410f, - -0.927649233092581180f, - 0.372741067009515810f, -0.927935394822617890f, 0.372029239908284960f, - -0.928221010672169440f, - 0.371317193951837600f, -0.928506080473215480f, 0.370604929559051670f, - -0.928790604058057020f, - 0.369892447148934270f, -0.929074581259315750f, 0.369179747140620070f, - -0.929358011909935500f, - 0.368466829953372320f, -0.929640895843181330f, 0.367753696006582090f, - -0.929923232892639560f, - 0.367040345719767240f, -0.930205022892219070f, 0.366326779512573590f, - -0.930486265676149780f, - 0.365612997804773960f, -0.930766961078983710f, 0.364899001016267380f, - -0.931047108935595170f, - 0.364184789567079840f, -0.931326709081180430f, 0.363470363877363870f, - -0.931605761351257830f, - 0.362755724367397230f, -0.931884265581668150f, 0.362040871457584350f, - -0.932162221608574320f, - 0.361325805568454340f, -0.932439629268462360f, 0.360610527120662270f, - -0.932716488398140250f, - 0.359895036534988280f, -0.932992798834738850f, 0.359179334232336560f, - -0.933268560415712050f, - 0.358463420633736540f, -0.933543772978836170f, 0.357747296160342010f, - -0.933818436362210960f, - 0.357030961233430030f, -0.934092550404258870f, 0.356314416274402360f, - -0.934366114943725900f, - 0.355597661704783960f, -0.934639129819680780f, 0.354880697946222790f, - -0.934911594871516090f, - 0.354163525420490510f, -0.935183509938947500f, 0.353446144549480870f, - -0.935454874862014620f, - 0.352728555755210730f, -0.935725689481080370f, 0.352010759459819240f, - -0.935995953636831300f, - 0.351292756085567150f, -0.936265667170278260f, 0.350574546054837570f, - -0.936534829922755500f, - 0.349856129790135030f, -0.936803441735921560f, 0.349137507714085030f, - -0.937071502451759190f, - 0.348418680249434510f, -0.937339011912574960f, 0.347699647819051490f, - -0.937605969960999990f, - 0.346980410845923680f, -0.937872376439989890f, 0.346260969753160170f, - -0.938138231192824360f, - 0.345541324963989150f, -0.938403534063108060f, 0.344821476901759290f, - -0.938668284894770170f, - 0.344101425989938980f, -0.938932483532064490f, 0.343381172652115100f, - -0.939196129819569900f, - 0.342660717311994380f, -0.939459223602189920f, 0.341940060393402300f, - -0.939721764725153340f, - 0.341219202320282410f, -0.939983753034013940f, 0.340498143516697100f, - -0.940245188374650880f, - 0.339776884406826960f, -0.940506070593268300f, 0.339055425414969640f, - -0.940766399536396070f, - 0.338333766965541290f, -0.941026175050889260f, 0.337611909483074680f, - -0.941285396983928660f, - 0.336889853392220050f, -0.941544065183020810f, 0.336167599117744690f, - -0.941802179495997650f, - 0.335445147084531660f, -0.942059739771017310f, 0.334722497717581220f, - -0.942316745856563780f, - 0.333999651442009490f, -0.942573197601446870f, 0.333276608683047980f, - -0.942829094854802710f, - 0.332553369866044220f, -0.943084437466093490f, 0.331829935416461220f, - -0.943339225285107720f, - 0.331106305759876430f, -0.943593458161960390f, 0.330382481321982950f, - -0.943847135947092690f, - 0.329658462528587550f, -0.944100258491272660f, 0.328934249805612200f, - -0.944352825645594750f, - 0.328209843579092660f, -0.944604837261480260f, 0.327485244275178060f, - -0.944856293190677210f, - 0.326760452320131790f, -0.945107193285260610f, 0.326035468140330350f, - -0.945357537397632290f, - 0.325310292162262980f, -0.945607325380521280f, 0.324584924812532150f, - -0.945856557086983910f, - 0.323859366517852960f, -0.946105232370403340f, 0.323133617705052330f, - -0.946353351084490590f, - 0.322407678801070020f, -0.946600913083283530f, 0.321681550232956640f, - -0.946847918221148000f, - 0.320955232427875210f, -0.947094366352777220f, 0.320228725813100020f, - -0.947340257333191940f, - 0.319502030816015750f, -0.947585591017741090f, 0.318775147864118480f, - -0.947830367262101010f, - 0.318048077385015060f, -0.948074585922276230f, 0.317320819806421790f, - -0.948318246854599090f, - 0.316593375556165850f, -0.948561349915730270f, 0.315865745062184070f, - -0.948803894962658380f, - 0.315137928752522440f, -0.949045881852700560f, 0.314409927055336820f, - -0.949287310443502010f, - 0.313681740398891570f, -0.949528180593036670f, 0.312953369211560200f, - -0.949768492159606680f, - 0.312224813921825050f, -0.950008245001843000f, 0.311496074958275970f, - -0.950247438978705230f, - 0.310767152749611470f, -0.950486073949481700f, 0.310038047724638000f, - -0.950724149773789610f, - 0.309308760312268780f, -0.950961666311575080f, 0.308579290941525030f, - -0.951198623423113230f, - 0.307849640041534980f, -0.951435020969008340f, 0.307119808041533100f, - -0.951670858810193860f, - 0.306389795370861080f, -0.951906136807932230f, 0.305659602458966230f, - -0.952140854823815830f, - 0.304929229735402430f, -0.952375012719765880f, 0.304198677629829270f, - -0.952608610358033240f, - 0.303467946572011370f, -0.952841647601198720f, 0.302737036991819140f, - -0.953074124312172200f, - 0.302005949319228200f, -0.953306040354193750f, 0.301274683984318000f, - -0.953537395590833280f, - 0.300543241417273400f, -0.953768189885990330f, 0.299811622048383460f, - -0.953998423103894490f, - 0.299079826308040480f, -0.954228095109105670f, 0.298347854626741570f, - -0.954457205766513490f, - 0.297615707435086310f, -0.954685754941338340f, 0.296883385163778270f, - -0.954913742499130520f, - 0.296150888243623960f, -0.955141168305770670f, 0.295418217105532070f, - -0.955368032227470240f, - 0.294685372180514330f, -0.955594334130771110f, 0.293952353899684770f, - -0.955820073882545420f, - 0.293219162694258680f, -0.956045251349996410f, 0.292485798995553830f, - -0.956269866400658140f, - 0.291752263234989370f, -0.956493918902394990f, 0.291018555844085090f, - -0.956717408723403050f, - 0.290284677254462330f, -0.956940335732208940f, 0.289550627897843140f, - -0.957162699797670100f, - 0.288816408206049480f, -0.957384500788975860f, 0.288082018611004300f, - -0.957605738575646240f, - 0.287347459544729570f, -0.957826413027532910f, 0.286612731439347790f, - -0.958046524014818600f, - 0.285877834727080730f, -0.958266071408017670f, 0.285142769840248720f, - -0.958485055077976100f, - 0.284407537211271820f, -0.958703474895871600f, 0.283672137272668550f, - -0.958921330733213060f, - 0.282936570457055390f, -0.959138622461841890f, 0.282200837197147500f, - -0.959355349953930790f, - 0.281464937925758050f, -0.959571513081984520f, 0.280728873075797190f, - -0.959787111718839900f, - 0.279992643080273380f, -0.960002145737665850f, 0.279256248372291240f, - -0.960216615011963430f, - 0.278519689385053060f, -0.960430519415565790f, 0.277782966551857800f, - -0.960643858822638470f, - 0.277046080306099950f, -0.960856633107679660f, 0.276309031081271030f, - -0.961068842145519350f, - 0.275571819310958250f, -0.961280485811320640f, 0.274834445428843940f, - -0.961491563980579000f, - 0.274096909868706330f, -0.961702076529122540f, 0.273359213064418790f, - -0.961912023333112100f, - 0.272621355449948980f, -0.962121404269041580f, 0.271883337459359890f, - -0.962330219213737400f, - 0.271145159526808070f, -0.962538468044359160f, 0.270406822086544820f, - -0.962746150638399410f, - 0.269668325572915200f, -0.962953266873683880f, 0.268929670420357310f, - -0.963159816628371360f, - 0.268190857063403180f, -0.963365799780954050f, 0.267451885936677740f, - -0.963571216210257210f, - 0.266712757474898420f, -0.963776065795439840f, 0.265973472112875530f, - -0.963980348415994110f, - 0.265234030285511900f, -0.964184063951745720f, 0.264494432427801630f, - -0.964387212282854290f, - 0.263754678974831510f, -0.964589793289812650f, 0.263014770361779060f, - -0.964791806853447900f, - 0.262274707023913590f, -0.964993252854920320f, 0.261534489396595630f, - -0.965194131175724720f, - 0.260794117915275570f, -0.965394441697689400f, 0.260053593015495130f, - -0.965594184302976830f, - 0.259312915132886350f, -0.965793358874083570f, 0.258572084703170390f, - -0.965991965293840570f, - 0.257831102162158930f, -0.966190003445412620f, 0.257089967945753230f, - -0.966387473212298790f, - 0.256348682489942910f, -0.966584374478333120f, 0.255607246230807550f, - -0.966780707127683270f, - 0.254865659604514630f, -0.966976471044852070f, 0.254123923047320620f, - -0.967171666114676640f, - 0.253382036995570270f, -0.967366292222328510f, 0.252640001885695580f, - -0.967560349253314360f, - 0.251897818154216910f, -0.967753837093475510f, 0.251155486237742030f, - -0.967946755628987800f, - 0.250413006572965280f, -0.968139104746362330f, 0.249670379596668520f, - -0.968330884332445300f, - 0.248927605745720260f, -0.968522094274417270f, 0.248184685457074780f, - -0.968712734459794780f, - 0.247441619167773440f, -0.968902804776428870f, 0.246698407314942500f, - -0.969092305112506100f, - 0.245955050335794590f, -0.969281235356548530f, 0.245211548667627680f, - -0.969469595397412950f, - 0.244467902747824210f, -0.969657385124292450f, 0.243724113013852130f, - -0.969844604426714830f, - 0.242980179903263980f, -0.970031253194543970f, 0.242236103853696070f, - -0.970217331317979160f, - 0.241491885302869300f, -0.970402838687555500f, 0.240747524688588540f, - -0.970587775194143630f, - 0.240003022448741500f, -0.970772140728950350f, 0.239258379021300120f, - -0.970955935183517970f, - 0.238513594844318500f, -0.971139158449725090f, 0.237768670355934210f, - -0.971321810419786160f, - 0.237023605994367340f, -0.971503890986251780f, 0.236278402197919620f, - -0.971685400042008540f, - 0.235533059404975460f, -0.971866337480279400f, 0.234787578054001080f, - -0.972046703194623500f, - 0.234041958583543460f, -0.972226497078936270f, 0.233296201432231560f, - -0.972405719027449770f, - 0.232550307038775330f, -0.972584368934732210f, 0.231804275841964780f, - -0.972762446695688570f, - 0.231058108280671280f, -0.972939952205560070f, 0.230311804793845530f, - -0.973116885359925130f, - 0.229565365820518870f, -0.973293246054698250f, 0.228818791799802360f, - -0.973469034186130950f, - 0.228072083170885790f, -0.973644249650811870f, 0.227325240373038830f, - -0.973818892345666100f, - 0.226578263845610110f, -0.973992962167955830f, 0.225831154028026200f, - -0.974166459015280320f, - 0.225083911359792780f, -0.974339382785575860f, 0.224336536280493690f, - -0.974511733377115720f, - 0.223589029229790020f, -0.974683510688510670f, 0.222841390647421280f, - -0.974854714618708430f, - 0.222093620973203590f, -0.975025345066994120f, 0.221345720647030810f, - -0.975195401932990370f, - 0.220597690108873650f, -0.975364885116656870f, 0.219849529798778750f, - -0.975533794518291360f, - 0.219101240156869770f, -0.975702130038528570f, 0.218352821623346430f, - -0.975869891578341030f, - 0.217604274638483670f, -0.976037079039039020f, 0.216855599642632570f, - -0.976203692322270560f, - 0.216106797076219600f, -0.976369731330021140f, 0.215357867379745550f, - -0.976535195964614470f, - 0.214608810993786920f, -0.976700086128711840f, 0.213859628358993830f, - -0.976864401725312640f, - 0.213110319916091360f, -0.977028142657754390f, 0.212360886105878580f, - -0.977191308829712280f, - 0.211611327369227610f, -0.977353900145199960f, 0.210861644147084830f, - -0.977515916508569280f, - 0.210111836880469720f, -0.977677357824509930f, 0.209361906010474190f, - -0.977838223998050430f, - 0.208611851978263460f, -0.977998514934557140f, 0.207861675225075150f, - -0.978158230539735050f, - 0.207111376192218560f, -0.978317370719627650f, 0.206360955321075680f, - -0.978475935380616830f, - 0.205610413053099320f, -0.978633924429423100f, 0.204859749829814420f, - -0.978791337773105670f, - 0.204108966092817010f, -0.978948175319062200f, 0.203358062283773370f, - -0.979104436975029250f, - 0.202607038844421110f, -0.979260122649082020f, 0.201855896216568160f, - -0.979415232249634780f, - 0.201104634842091960f, -0.979569765685440520f, 0.200353255162940420f, - -0.979723722865591170f, - 0.199601757621131050f, -0.979877103699517640f, 0.198850142658750120f, - -0.980029908096989980f, - 0.198098410717953730f, -0.980182135968117320f, 0.197346562240966000f, - -0.980333787223347960f, - 0.196594597670080220f, -0.980484861773469380f, 0.195842517447657990f, - -0.980635359529608120f, - 0.195090322016128330f, -0.980785280403230430f, 0.194338011817988600f, - -0.980934624306141640f, - 0.193585587295803750f, -0.981083391150486590f, 0.192833048892205290f, - -0.981231580848749730f, - 0.192080397049892380f, -0.981379193313754560f, 0.191327632211630990f, - -0.981526228458664660f, - 0.190574754820252800f, -0.981672686196983110f, 0.189821765318656580f, - -0.981818566442552500f, - 0.189068664149806280f, -0.981963869109555240f, 0.188315451756732120f, - -0.982108594112513610f, - 0.187562128582529740f, -0.982252741366289370f, 0.186808695070359330f, - -0.982396310786084690f, - 0.186055151663446630f, -0.982539302287441240f, 0.185301498805082040f, - -0.982681715786240860f, - 0.184547736938619640f, -0.982823551198705240f, 0.183793866507478390f, - -0.982964808441396440f, - 0.183039887955141060f, -0.983105487431216290f, 0.182285801725153320f, - -0.983245588085407070f, - 0.181531608261125130f, -0.983385110321551180f, 0.180777308006728670f, - -0.983524054057571260f, - 0.180022901405699510f, -0.983662419211730250f, 0.179268388901835880f, - -0.983800205702631490f, - 0.178513770938997590f, -0.983937413449218920f, 0.177759047961107140f, - -0.984074042370776450f, - 0.177004220412148860f, -0.984210092386929030f, 0.176249288736167940f, - -0.984345563417641900f, - 0.175494253377271400f, -0.984480455383220930f, 0.174739114779627310f, - -0.984614768204312600f, - 0.173983873387463850f, -0.984748501801904210f, 0.173228529645070490f, - -0.984881656097323700f, - 0.172473083996796030f, -0.985014231012239840f, 0.171717536887049970f, - -0.985146226468662230f, - 0.170961888760301360f, -0.985277642388941220f, 0.170206140061078120f, - -0.985408478695768420f, - 0.169450291233967930f, -0.985538735312176060f, 0.168694342723617440f, - -0.985668412161537550f, - 0.167938294974731230f, -0.985797509167567370f, 0.167182148432072880f, - -0.985926026254321130f, - 0.166425903540464220f, -0.986053963346195440f, 0.165669560744784140f, - -0.986181320367928270f, - 0.164913120489970090f, -0.986308097244598670f, 0.164156583221015890f, - -0.986434293901627070f, - 0.163399949382973230f, -0.986559910264775410f, 0.162643219420950450f, - -0.986684946260146690f, - 0.161886393780111910f, -0.986809401814185420f, 0.161129472905678780f, - -0.986933276853677710f, - 0.160372457242928400f, -0.987056571305750970f, 0.159615347237193090f, - -0.987179285097874340f, - 0.158858143333861390f, -0.987301418157858430f, 0.158100845978377090f, - -0.987422970413855410f, - 0.157343455616238280f, -0.987543941794359230f, 0.156585972692998590f, - -0.987664332228205710f, - 0.155828397654265320f, -0.987784141644572180f, 0.155070730945700510f, - -0.987903369972977790f, - 0.154312973013020240f, -0.988022017143283530f, 0.153555124301993500f, - -0.988140083085692570f, - 0.152797185258443410f, -0.988257567730749460f, 0.152039156328246160f, - -0.988374471009341280f, - 0.151281037957330250f, -0.988490792852696590f, 0.150522830591677370f, - -0.988606533192386450f, - 0.149764534677321620f, -0.988721691960323780f, 0.149006150660348470f, - -0.988836269088763540f, - 0.148247678986896200f, -0.988950264510302990f, 0.147489120103153680f, - -0.989063678157881540f, - 0.146730474455361750f, -0.989176509964781010f, 0.145971742489812370f, - -0.989288759864625170f, - 0.145212924652847520f, -0.989400427791380380f, 0.144454021390860440f, - -0.989511513679355190f, - 0.143695033150294580f, -0.989622017463200780f, 0.142935960377642700f, - -0.989731939077910570f, - 0.142176803519448000f, -0.989841278458820530f, 0.141417563022303130f, - -0.989950035541608990f, - 0.140658239332849240f, -0.990058210262297120f, 0.139898832897777380f, - -0.990165802557248400f, - 0.139139344163826280f, -0.990272812363169110f, 0.138379773577783890f, - -0.990379239617108160f, - 0.137620121586486180f, -0.990485084256456980f, 0.136860388636816430f, - -0.990590346218950150f, - 0.136100575175706200f, -0.990695025442664630f, 0.135340681650134330f, - -0.990799121866020370f, - 0.134580708507126220f, -0.990902635427780010f, 0.133820656193754690f, - -0.991005566067049370f, - 0.133060525157139180f, -0.991107913723276780f, 0.132300315844444680f, - -0.991209678336254060f, - 0.131540028702883280f, -0.991310859846115440f, 0.130779664179711790f, - -0.991411458193338540f, - 0.130019222722233350f, -0.991511473318743900f, 0.129258704777796270f, - -0.991610905163495370f, - 0.128498110793793220f, -0.991709753669099530f, 0.127737441217662280f, - -0.991808018777406430f, - 0.126976696496885980f, -0.991905700430609330f, 0.126215877078990400f, - -0.992002798571244520f, - 0.125454983411546210f, -0.992099313142191800f, 0.124694015942167770f, - -0.992195244086673920f, - 0.123932975118512200f, -0.992290591348257370f, 0.123171861388280650f, - -0.992385354870851670f, - 0.122410675199216280f, -0.992479534598709970f, 0.121649416999105540f, - -0.992573130476428810f, - 0.120888087235777220f, -0.992666142448948020f, 0.120126686357101580f, - -0.992758570461551140f, - 0.119365214810991350f, -0.992850414459865100f, 0.118603673045400840f, - -0.992941674389860470f, - 0.117842061508325020f, -0.993032350197851410f, 0.117080380647800550f, - -0.993122441830495580f, - 0.116318630911904880f, -0.993211949234794500f, 0.115556812748755290f, - -0.993300872358093280f, - 0.114794926606510250f, -0.993389211148080650f, 0.114032972933367300f, - -0.993476965552789190f, - 0.113270952177564360f, -0.993564135520595300f, 0.112508864787378830f, - -0.993650721000219120f, - 0.111746711211126660f, -0.993736721940724600f, 0.110984491897163380f, - -0.993822138291519660f, - 0.110222207293883180f, -0.993906970002356060f, 0.109459857849718030f, - -0.993991217023329380f, - 0.108697444013138670f, -0.994074879304879370f, 0.107934966232653760f, - -0.994157956797789730f, - 0.107172424956808870f, -0.994240449453187900f, 0.106409820634187840f, - -0.994322357222545810f, - 0.105647153713410700f, -0.994403680057679100f, 0.104884424643134970f, - -0.994484417910747600f, - 0.104121633872054730f, -0.994564570734255420f, 0.103358781848899700f, - -0.994644138481050710f, - 0.102595869022436280f, -0.994723121104325700f, 0.101832895841466670f, - -0.994801518557617110f, - 0.101069862754827880f, -0.994879330794805620f, 0.100306770211392820f, - -0.994956557770116380f, - 0.099543618660069444f, -0.995033199438118630f, 0.098780408549799664f, - -0.995109255753726110f, - 0.098017140329560770f, -0.995184726672196820f, 0.097253814448363354f, - -0.995259612149133390f, - 0.096490431355252607f, -0.995333912140482280f, 0.095726991499307315f, - -0.995407626602534900f, - 0.094963495329639061f, -0.995480755491926940f, 0.094199943295393190f, - -0.995553298765638470f, - 0.093436335845747912f, -0.995625256380994310f, 0.092672673429913366f, - -0.995696628295663520f, - 0.091908956497132696f, -0.995767414467659820f, 0.091145185496681130f, - -0.995837614855341610f, - 0.090381360877865011f, -0.995907229417411720f, 0.089617483090022917f, - -0.995976258112917790f, - 0.088853552582524684f, -0.996044700901251970f, 0.088089569804770507f, - -0.996112557742151130f, - 0.087325535206192226f, -0.996179828595696870f, 0.086561449236251239f, - -0.996246513422315520f, - 0.085797312344439880f, -0.996312612182778000f, 0.085033124980280414f, - -0.996378124838200210f, - 0.084268887593324127f, -0.996443051350042630f, 0.083504600633152404f, - -0.996507391680110820f, - 0.082740264549375803f, -0.996571145790554840f, 0.081975879791633108f, - -0.996634313643869900f, - 0.081211446809592386f, -0.996696895202896060f, 0.080446966052950097f, - -0.996758890430818000f, - 0.079682437971430126f, -0.996820299291165670f, 0.078917863014785095f, - -0.996881121747813850f, - 0.078153241632794315f, -0.996941357764982160f, 0.077388574275265049f, - -0.997001007307235290f, - 0.076623861392031617f, -0.997060070339482960f, 0.075859103432954503f, - -0.997118546826979980f, - 0.075094300847921291f, -0.997176436735326190f, 0.074329454086845867f, - -0.997233740030466160f, - 0.073564563599667454f, -0.997290456678690210f, 0.072799629836351618f, - -0.997346586646633230f, - 0.072034653246889416f, -0.997402129901275300f, 0.071269634281296415f, - -0.997457086409941910f, - 0.070504573389614009f, -0.997511456140303450f, 0.069739471021907376f, - -0.997565239060375750f, - 0.068974327628266732f, -0.997618435138519550f, 0.068209143658806454f, - -0.997671044343441000f, - 0.067443919563664106f, -0.997723066644191640f, 0.066678655793001543f, - -0.997774502010167820f, - 0.065913352797003930f, -0.997825350411111640f, 0.065148011025878860f, - -0.997875611817110150f, - 0.064382630929857410f, -0.997925286198596000f, 0.063617212959193190f, - -0.997974373526346990f, - 0.062851757564161420f, -0.998022873771486240f, 0.062086265195060247f, - -0.998070786905482340f, - 0.061320736302208648f, -0.998118112900149180f, 0.060555171335947781f, - -0.998164851727646240f, - 0.059789570746640007f, -0.998211003360478190f, 0.059023934984667986f, - -0.998256567771495180f, - 0.058258264500435732f, -0.998301544933892890f, 0.057492559744367684f, - -0.998345934821212370f, - 0.056726821166907783f, -0.998389737407340160f, 0.055961049218520520f, - -0.998432952666508440f, - 0.055195244349690031f, -0.998475580573294770f, 0.054429407010919147f, - -0.998517621102622210f, - 0.053663537652730679f, -0.998559074229759310f, 0.052897636725665401f, - -0.998599939930320370f, - 0.052131704680283317f, -0.998640218180265270f, 0.051365741967162731f, - -0.998679908955899090f, - 0.050599749036899337f, -0.998719012233872940f, 0.049833726340107257f, - -0.998757527991183340f, - 0.049067674327418126f, -0.998795456205172410f, 0.048301593449480172f, - -0.998832796853527990f, - 0.047535484156959261f, -0.998869549914283560f, 0.046769346900537960f, - -0.998905715365818290f, - 0.046003182130914644f, -0.998941293186856870f, 0.045236990298804750f, - -0.998976283356469820f, - 0.044470771854938744f, -0.999010685854073380f, 0.043704527250063421f, - -0.999044500659429290f, - 0.042938256934940959f, -0.999077727752645360f, 0.042171961360348002f, - -0.999110367114174890f, - 0.041405640977076712f, -0.999142418724816910f, 0.040639296235933854f, - -0.999173882565716380f, - 0.039872927587739845f, -0.999204758618363890f, 0.039106535483329839f, - -0.999235046864595850f, - 0.038340120373552791f, -0.999264747286594420f, 0.037573682709270514f, - -0.999293859866887790f, - 0.036807222941358991f, -0.999322384588349540f, 0.036040741520706299f, - -0.999350321434199440f, - 0.035274238898213947f, -0.999377670388002850f, 0.034507715524795889f, - -0.999404431433671300f, - 0.033741171851377642f, -0.999430604555461730f, 0.032974608328897315f, - -0.999456189737977340f, - 0.032208025408304704f, -0.999481186966166950f, 0.031441423540560343f, - -0.999505596225325310f, - 0.030674803176636581f, -0.999529417501093140f, 0.029908164767516655f, - -0.999552650779456990f, - 0.029141508764193740f, -0.999575296046749220f, 0.028374835617672258f, - -0.999597353289648380f, - 0.027608145778965820f, -0.999618822495178640f, 0.026841439699098527f, - -0.999639703650710200f, - 0.026074717829104040f, -0.999659996743959220f, 0.025307980620024630f, - -0.999679701762987930f, - 0.024541228522912264f, -0.999698818696204250f, 0.023774461988827676f, - -0.999717347532362190f, - 0.023007681468839410f, -0.999735288260561680f, 0.022240887414024919f, - -0.999752640870248840f, - 0.021474080275469605f, -0.999769405351215280f, 0.020707260504265912f, - -0.999785581693599210f, - 0.019940428551514598f, -0.999801169887884260f, 0.019173584868322699f, - -0.999816169924900410f, - 0.018406729905804820f, -0.999830581795823400f, 0.017639864115082195f, - -0.999844405492175240f, - 0.016872987947281773f, -0.999857641005823860f, 0.016106101853537263f, - -0.999870288328982950f, - 0.015339206284988220f, -0.999882347454212560f, 0.014572301692779104f, - -0.999893818374418490f, - 0.013805388528060349f, -0.999904701082852900f, 0.013038467241987433f, - -0.999914995573113470f, - 0.012271538285719944f, -0.999924701839144500f, 0.011504602110422875f, - -0.999933819875236000f, - 0.010737659167264572f, -0.999942349676023910f, 0.009970709907418029f, - -0.999950291236490480f, - 0.009203754782059960f, -0.999957644551963900f, 0.008436794242369860f, - -0.999964409618118280f, - 0.007669828739531077f, -0.999970586430974140f, 0.006902858724729877f, - -0.999976174986897610f, - 0.006135884649154515f, -0.999981175282601110f, 0.005368906963996303f, - -0.999985587315143200f, - 0.004601926120448672f, -0.999989411081928400f, 0.003834942569706248f, - -0.999992646580707190f, - 0.003067956762966138f, -0.999995293809576190f, 0.002300969151425887f, - -0.999997352766978210f, - 0.001533980186284766f, -0.999998823451701880f, 0.000766990318742846f, - -0.999999705862882230f -}; - -static const float32_t Weights_8192[16384] = { - 1.000000000000000000, -0.000000000000000000, 0.999999981616429330, - -0.000191747597310703, - 0.999999926465717890, -0.000383495187571396, 0.999999834547867670, - -0.000575242763732066, - 0.999999705862882230, -0.000766990318742704, 0.999999540410766110, - -0.000958737845553301, - 0.999999338191525530, -0.001150485337113849, 0.999999099205167830, - -0.001342232786374338, - 0.999998823451701880, -0.001533980186284766, 0.999998510931137790, - -0.001725727529795126, - 0.999998161643486980, -0.001917474809855419, 0.999997775588762350, - -0.002109222019415644, - 0.999997352766978210, -0.002300969151425805, 0.999996893178149880, - -0.002492716198835908, - 0.999996396822294350, -0.002684463154595962, 0.999995863699429940, - -0.002876210011655979, - 0.999995293809576190, -0.003067956762965976, 0.999994687152754080, - -0.003259703401475973, - 0.999994043728985820, -0.003451449920135994, 0.999993363538295150, - -0.003643196311896068, - 0.999992646580707190, -0.003834942569706228, 0.999991892856248010, - -0.004026688686516512, - 0.999991102364945590, -0.004218434655276963, 0.999990275106828920, - -0.004410180468937631, - 0.999989411081928400, -0.004601926120448571, 0.999988510290275690, - -0.004793671602759841, - 0.999987572731904080, -0.004985416908821511, 0.999986598406848000, - -0.005177162031583651, - 0.999985587315143200, -0.005368906963996343, 0.999984539456826970, - -0.005560651699009674, - 0.999983454831937730, -0.005752396229573736, 0.999982333440515350, - -0.005944140548638633, - 0.999981175282601110, -0.006135884649154475, 0.999979980358237650, - -0.006327628524071378, - 0.999978748667468830, -0.006519372166339468, 0.999977480210339940, - -0.006711115568908879, - 0.999976174986897610, -0.006902858724729756, 0.999974832997189810, - -0.007094601626752250, - 0.999973454241265940, -0.007286344267926521, 0.999972038719176730, - -0.007478086641202744, - 0.999970586430974140, -0.007669828739531097, 0.999969097376711580, - -0.007861570555861772, - 0.999967571556443780, -0.008053312083144972, 0.999966008970226920, - -0.008245053314330906, - 0.999964409618118280, -0.008436794242369799, 0.999962773500176930, - -0.008628534860211886, - 0.999961100616462820, -0.008820275160807412, 0.999959390967037450, - -0.009012015137106633, - 0.999957644551963900, -0.009203754782059819, 0.999955861371306100, - -0.009395494088617252, - 0.999954041425129780, -0.009587233049729225, 0.999952184713501780, - -0.009778971658346044, - 0.999950291236490480, -0.009970709907418031, 0.999948360994165400, - -0.010162447789895513, - 0.999946393986597460, -0.010354185298728842, 0.999944390213859060, - -0.010545922426868378, - 0.999942349676023910, -0.010737659167264491, 0.999940272373166960, - -0.010929395512867571, - 0.999938158305364590, -0.011121131456628021, 0.999936007472694620, - -0.011312866991496258, - 0.999933819875236000, -0.011504602110422714, 0.999931595513069200, - -0.011696336806357838, - 0.999929334386276070, -0.011888071072252092, 0.999927036494939640, - -0.012079804901055957, - 0.999924701839144500, -0.012271538285719925, 0.999922330418976490, - -0.012463271219194511, - 0.999919922234522750, -0.012655003694430242, 0.999917477285871770, - -0.012846735704377662, - 0.999914995573113470, -0.013038467241987334, 0.999912477096339240, - -0.013230198300209835, - 0.999909921855641540, -0.013421928871995765, 0.999907329851114300, - -0.013613658950295740, - 0.999904701082852900, -0.013805388528060391, 0.999902035550953920, - -0.013997117598240367, - 0.999899333255515390, -0.014188846153786345, 0.999896594196636680, - -0.014380574187649006, - 0.999893818374418490, -0.014572301692779064, 0.999891005788962950, - -0.014764028662127246, - 0.999888156440373320, -0.014955755088644296, 0.999885270328754520, - -0.015147480965280987, - 0.999882347454212560, -0.015339206284988100, 0.999879387816854930, - -0.015530931040716447, - 0.999876391416790410, -0.015722655225416857, 0.999873358254129260, - -0.015914378832040183, - 0.999870288328982950, -0.016106101853537287, 0.999867181641464380, - -0.016297824282859065, - 0.999864038191687680, -0.016489546112956437, 0.999860857979768540, - -0.016681267336780332, - 0.999857641005823860, -0.016872987947281710, 0.999854387269971890, - -0.017064707937411563, - 0.999851096772332190, -0.017256427300120877, 0.999847769513025900, - -0.017448146028360693, - 0.999844405492175240, -0.017639864115082053, 0.999841004709904000, - -0.017831581553236039, - 0.999837567166337090, -0.018023298335773746, 0.999834092861600960, - -0.018215014455646290, - 0.999830581795823400, -0.018406729905804820, 0.999827033969133420, - -0.018598444679200511, - 0.999823449381661570, -0.018790158768784555, 0.999819828033539420, - -0.018981872167508178, - 0.999816169924900410, -0.019173584868322623, 0.999812475055878780, - -0.019365296864179156, - 0.999808743426610520, -0.019557008148029083, 0.999804975037232870, - -0.019748718712823729, - 0.999801169887884260, -0.019940428551514441, 0.999797327978704690, - -0.020132137657052594, - 0.999793449309835270, -0.020323846022389593, 0.999789533881418780, - -0.020515553640476875, - 0.999785581693599210, -0.020707260504265895, 0.999781592746521670, - -0.020898966606708137, - 0.999777567040332940, -0.021090671940755121, 0.999773504575180990, - -0.021282376499358387, - 0.999769405351215280, -0.021474080275469508, 0.999765269368586450, - -0.021665783262040078, - 0.999761096627446610, -0.021857485452021735, 0.999756887127949080, - -0.022049186838366135, - 0.999752640870248840, -0.022240887414024961, 0.999748357854501780, - -0.022432587171949934, - 0.999744038080865430, -0.022624286105092803, 0.999739681549498660, - -0.022815984206405345, - 0.999735288260561680, -0.023007681468839369, 0.999730858214216030, - -0.023199377885346720, - 0.999726391410624470, -0.023391073448879258, 0.999721887849951310, - -0.023582768152388894, - 0.999717347532362190, -0.023774461988827555, 0.999712770458023870, - -0.023966154951147210, - 0.999708156627104880, -0.024157847032299864, 0.999703506039774650, - -0.024349538225237534, - 0.999698818696204250, -0.024541228522912288, 0.999694094596566000, - -0.024732917918276223, - 0.999689333741033640, -0.024924606404281468, 0.999684536129782140, - -0.025116293973880186, - 0.999679701762987930, -0.025307980620024571, 0.999674830640828740, - -0.025499666335666853, - 0.999669922763483760, -0.025691351113759295, 0.999664978131133310, - -0.025883034947254198, - 0.999659996743959220, -0.026074717829103901, 0.999654978602144690, - -0.026266399752260760, - 0.999649923705874240, -0.026458080709677187, 0.999644832055333610, - -0.026649760694305618, - 0.999639703650710200, -0.026841439699098531, 0.999634538492192300, - -0.027033117717008431, - 0.999629336579970110, -0.027224794740987875, 0.999624097914234570, - -0.027416470763989436, - 0.999618822495178640, -0.027608145778965740, 0.999613510322995950, - -0.027799819778869445, - 0.999608161397882110, -0.027991492756653243, 0.999602775720033530, - -0.028183164705269874, - 0.999597353289648380, -0.028374835617672099, 0.999591894106925950, - -0.028566505486812728, - 0.999586398172067070, -0.028758174305644615, 0.999580865485273700, - -0.028949842067120635, - 0.999575296046749220, -0.029141508764193722, 0.999569689856698580, - -0.029333174389816835, - 0.999564046915327740, -0.029524838936942976, 0.999558367222844300, - -0.029716502398525191, - 0.999552650779456990, -0.029908164767516555, 0.999546897585375960, - -0.030099826036870198, - 0.999541107640812940, -0.030291486199539284, 0.999535280945980540, - -0.030483145248477009, - 0.999529417501093140, -0.030674803176636626, 0.999523517306366350, - -0.030866459976971412, - 0.999517580362016990, -0.031058115642434700, 0.999511606668263440, - -0.031249770165979861, - 0.999505596225325310, -0.031441423540560301, 0.999499549033423640, - -0.031633075759129478, - 0.999493465092780590, -0.031824726814640887, 0.999487344403620080, - -0.032016376700048060, - 0.999481186966166950, -0.032208025408304586, 0.999474992780647780, - -0.032399672932364086, - 0.999468761847290050, -0.032591319265180226, 0.999462494166323160, - -0.032782964399706724, - 0.999456189737977340, -0.032974608328897335, 0.999449848562484530, - -0.033166251045705857, - 0.999443470640077770, -0.033357892543086139, 0.999437055970991530, - -0.033549532813992068, - 0.999430604555461730, -0.033741171851377580, 0.999424116393725640, - -0.033932809648196664, - 0.999417591486021720, -0.034124446197403326, 0.999411029832589780, - -0.034316081491951651, - 0.999404431433671300, -0.034507715524795750, 0.999397796289508640, - -0.034699348288889799, - 0.999391124400346050, -0.034890979777188004, 0.999384415766428560, - -0.035082609982644619, - 0.999377670388002850, -0.035274238898213947, 0.999370888265317170, - -0.035465866516850353, - 0.999364069398620550, -0.035657492831508222, 0.999357213788164000, - -0.035849117835142018, - 0.999350321434199440, -0.036040741520706229, 0.999343392336980220, - -0.036232363881155395, - 0.999336426496761240, -0.036423984909444110, 0.999329423913798420, - -0.036615604598527030, - 0.999322384588349540, -0.036807222941358832, 0.999315308520673070, - -0.036998839930894263, - 0.999308195711029470, -0.037190455560088119, 0.999301046159680070, - -0.037382069821895229, - 0.999293859866887790, -0.037573682709270494, 0.999286636832916740, - -0.037765294215168860, - 0.999279377058032710, -0.037956904332545310, 0.999272080542502610, - -0.038148513054354891, - 0.999264747286594420, -0.038340120373552694, 0.999257377290578060, - -0.038531726283093870, - 0.999249970554724420, -0.038723330775933623, 0.999242527079305830, - -0.038914933845027193, - 0.999235046864595850, -0.039106535483329888, 0.999227529910869610, - -0.039298135683797059, - 0.999219976218403530, -0.039489734439384118, 0.999212385787475290, - -0.039681331743046527, - 0.999204758618363890, -0.039872927587739811, 0.999197094711349880, - -0.040064521966419520, - 0.999189394066714920, -0.040256114872041282, 0.999181656684742350, - -0.040447706297560782, - 0.999173882565716380, -0.040639296235933736, 0.999166071709923000, - -0.040830884680115948, - 0.999158224117649430, -0.041022471623063238, 0.999150339789184110, - -0.041214057057731519, - 0.999142418724816910, -0.041405640977076739, 0.999134460924839150, - -0.041597223374054894, - 0.999126466389543390, -0.041788804241622061, 0.999118435119223490, - -0.041980383572734356, - 0.999110367114174890, -0.042171961360347947, 0.999102262374694130, - -0.042363537597419072, - 0.999094120901079070, -0.042555112276904020, 0.999085942693629270, - -0.042746685391759132, - 0.999077727752645360, -0.042938256934940820, 0.999069476078429330, - -0.043129826899405546, - 0.999061187671284600, -0.043321395278109825, 0.999052862531515930, - -0.043512962064010237, - 0.999044500659429290, -0.043704527250063421, 0.999036102055332330, - -0.043896090829226068, - 0.999027666719533690, -0.044087652794454944, 0.999019194652343460, - -0.044279213138706849, - 0.999010685854073380, -0.044470771854938668, 0.999002140325035980, - -0.044662328936107325, - 0.998993558065545680, -0.044853884375169815, 0.998984939075918010, - -0.045045438165083197, - 0.998976283356469820, -0.045236990298804590, 0.998967590907519300, - -0.045428540769291155, - 0.998958861729386080, -0.045620089569500144, 0.998950095822391250, - -0.045811636692388844, - 0.998941293186856870, -0.046003182130914623, 0.998932453823106690, - -0.046194725878034908, - 0.998923577731465780, -0.046386267926707157, 0.998914664912260440, - -0.046577808269888943, - 0.998905715365818290, -0.046769346900537863, 0.998896729092468410, - -0.046960883811611592, - 0.998887706092541290, -0.047152418996067869, 0.998878646366368690, - -0.047343952446864478, - 0.998869549914283560, -0.047535484156959303, 0.998860416736620520, - -0.047727014119310254, - 0.998851246833715180, -0.047918542326875327, 0.998842040205904840, - -0.048110068772612591, - 0.998832796853527990, -0.048301593449480144, 0.998823516776924490, - -0.048493116350436176, - 0.998814199976435390, -0.048684637468438943, 0.998804846452403420, - -0.048876156796446760, - 0.998795456205172410, -0.049067674327418015, 0.998786029235087640, - -0.049259190054311140, - 0.998776565542495610, -0.049450703970084664, 0.998767065127744380, - -0.049642216067697156, - 0.998757527991183340, -0.049833726340107277, 0.998747954133162860, - -0.050025234780273729, - 0.998738343554035230, -0.050216741381155311, 0.998728696254153720, - -0.050408246135710856, - 0.998719012233872940, -0.050599749036899282, 0.998709291493549030, - -0.050791250077679581, - 0.998699534033539280, -0.050982749251010803, 0.998689739854202620, - -0.051174246549852080, - 0.998679908955899090, -0.051365741967162593, 0.998670041338990070, - -0.051557235495901611, - 0.998660137003838490, -0.051748727129028456, 0.998650195950808280, - -0.051940216859502536, - 0.998640218180265270, -0.052131704680283324, 0.998630203692576050, - -0.052323190584330347, - 0.998620152488108870, -0.052514674564603223, 0.998610064567233340, - -0.052706156614061632, - 0.998599939930320370, -0.052897636725665324, 0.998589778577742230, - -0.053089114892374133, - 0.998579580509872500, -0.053280591107147945, 0.998569345727086110, - -0.053472065362946727, - 0.998559074229759310, -0.053663537652730520, 0.998548766018269920, - -0.053855007969459440, - 0.998538421092996730, -0.054046476306093660, 0.998528039454320230, - -0.054237942655593452, - 0.998517621102622210, -0.054429407010919133, 0.998507166038285490, - -0.054620869365031105, - 0.998496674261694640, -0.054812329710889854, 0.998486145773235360, - -0.055003788041455920, - 0.998475580573294770, -0.055195244349689934, 0.998464978662261250, - -0.055386698628552597, - 0.998454340040524800, -0.055578150871004678, 0.998443664708476340, - -0.055769601070007030, - 0.998432952666508440, -0.055961049218520569, 0.998422203915015020, - -0.056152495309506292, - 0.998411418454391300, -0.056343939335925290, 0.998400596285033640, - -0.056535381290738700, - 0.998389737407340160, -0.056726821166907748, 0.998378841821709990, - -0.056918258957393740, - 0.998367909528543820, -0.057109694655158062, 0.998356940528243420, - -0.057301128253162158, - 0.998345934821212370, -0.057492559744367566, 0.998334892407855000, - -0.057683989121735904, - 0.998323813288577560, -0.057875416378228857, 0.998312697463787260, - -0.058066841506808194, - 0.998301544933892890, -0.058258264500435752, 0.998290355699304350, - -0.058449685352073476, - 0.998279129760433200, -0.058641104054683341, 0.998267867117692110, - -0.058832520601227435, - 0.998256567771495180, -0.059023934984667931, 0.998245231722257880, - -0.059215347197967061, - 0.998233858970396850, -0.059406757234087150, 0.998222449516330550, - -0.059598165085990591, - 0.998211003360478190, -0.059789570746639868, 0.998199520503260660, - -0.059980974208997548, - 0.998188000945100300, -0.060172375466026259, 0.998176444686420530, - -0.060363774510688743, - 0.998164851727646240, -0.060555171335947788, 0.998153222069203760, - -0.060746565934766288, - 0.998141555711520520, -0.060937958300107203, 0.998129852655025630, - -0.061129348424933588, - 0.998118112900149180, -0.061320736302208578, 0.998106336447323050, - -0.061512121924895378, - 0.998094523296980010, -0.061703505285957298, 0.998082673449554590, - -0.061894886378357716, - 0.998070786905482340, -0.062086265195060088, 0.998058863665200250, - -0.062277641729027972, - 0.998046903729146840, -0.062469015973224996, 0.998034907097761770, - -0.062660387920614874, - 0.998022873771486240, -0.062851757564161406, 0.998010803750762450, - -0.063043124896828492, - 0.997998697036034390, -0.063234489911580066, 0.997986553627747020, - -0.063425852601380228, - 0.997974373526346990, -0.063617212959193106, 0.997962156732281950, - -0.063808570977982898, - 0.997949903246001190, -0.063999926650713940, 0.997937613067955250, - -0.064191279970350637, - 0.997925286198596000, -0.064382630929857465, 0.997912922638376610, - -0.064573979522198982, - 0.997900522387751620, -0.064765325740339885, 0.997888085447177110, - -0.064956669577244872, - 0.997875611817110150, -0.065148011025878833, 0.997863101498009500, - -0.065339350079206632, - 0.997850554490335110, -0.065530686730193327, 0.997837970794548280, - -0.065722020971803990, - 0.997825350411111640, -0.065913352797003805, 0.997812693340489280, - -0.066104682198758077, - 0.997799999583146470, -0.066296009170032130, 0.997787269139549960, - -0.066487333703791451, - 0.997774502010167820, -0.066678655793001557, 0.997761698195469560, - -0.066869975430628115, - 0.997748857695925690, -0.067061292609636822, 0.997735980512008620, - -0.067252607322993499, - 0.997723066644191640, -0.067443919563664051, 0.997710116092949570, - -0.067635229324614479, - 0.997697128858758500, -0.067826536598810869, 0.997684104942096030, - -0.068017841379219388, - 0.997671044343441000, -0.068209143658806329, 0.997657947063273710, - -0.068400443430538013, - 0.997644813102075420, -0.068591740687380942, 0.997631642460329320, - -0.068783035422301630, - 0.997618435138519550, -0.068974327628266746, 0.997605191137131640, - -0.069165617298242985, - 0.997591910456652630, -0.069356904425197208, 0.997578593097570800, - -0.069548189002096306, - 0.997565239060375750, -0.069739471021907307, 0.997551848345558430, - -0.069930750477597309, - 0.997538420953611340, -0.070122027362133521, 0.997524956885027960, - -0.070313301668483250, - 0.997511456140303450, -0.070504573389613856, 0.997497918719934210, - -0.070695842518492855, - 0.997484344624417930, -0.070887109048087801, 0.997470733854253670, - -0.071078372971366405, - 0.997457086409941910, -0.071269634281296401, 0.997443402291984360, - -0.071460892970845680, - 0.997429681500884180, -0.071652149032982212, 0.997415924037145960, - -0.071843402460674027, - 0.997402129901275300, -0.072034653246889332, 0.997388299093779460, - -0.072225901384596322, - 0.997374431615167150, -0.072417146866763413, 0.997360527465947940, - -0.072608389686358993, - 0.997346586646633230, -0.072799629836351673, 0.997332609157735470, - -0.072990867309710036, - 0.997318594999768600, -0.073182102099402888, 0.997304544173247990, - -0.073373334198399032, - 0.997290456678690210, -0.073564563599667426, 0.997276332516613180, - -0.073755790296177098, - 0.997262171687536170, -0.073947014280897200, 0.997247974191979860, - -0.074138235546796979, - 0.997233740030466280, -0.074329454086845756, 0.997219469203518670, - -0.074520669894013000, - 0.997205161711661850, -0.074711882961268211, 0.997190817555421940, - -0.074903093281581082, - 0.997176436735326190, -0.075094300847921305, 0.997162019251903290, - -0.075285505653258769, - 0.997147565105683480, -0.075476707690563388, 0.997133074297198110, - -0.075667906952805231, - 0.997118546826979980, -0.075859103432954447, 0.997103982695563330, - -0.076050297123981259, - 0.997089381903483400, -0.076241488018856066, 0.997074744451277310, - -0.076432676110549283, - 0.997060070339482960, -0.076623861392031492, 0.997045359568640040, - -0.076815043856273343, - 0.997030612139289450, -0.077006223496245640, 0.997015828051973310, - -0.077197400304919200, - 0.997001007307235290, -0.077388574275265049, 0.996986149905620180, - -0.077579745400254224, - 0.996971255847674320, -0.077770913672857947, 0.996956325133945280, - -0.077962079086047492, - 0.996941357764982160, -0.078153241632794232, 0.996926353741335090, - -0.078344401306069705, - 0.996911313063555740, -0.078535558098845479, 0.996896235732197210, - -0.078726712004093299, - 0.996881121747813850, -0.078917863014784942, 0.996865971110961310, - -0.079109011123892375, - 0.996850783822196610, -0.079300156324387597, 0.996835559882078170, - -0.079491298609242769, - 0.996820299291165670, -0.079682437971430126, 0.996805002050020430, - -0.079873574403921996, - 0.996789668159204560, -0.080064707899690890, 0.996774297619282050, - -0.080255838451709319, - 0.996758890430818000, -0.080446966052950014, 0.996743446594378860, - -0.080638090696385709, - 0.996727966110532490, -0.080829212374989329, 0.996712448979848010, - -0.081020331081733857, - 0.996696895202896060, -0.081211446809592441, 0.996681304780248300, - -0.081402559551538245, - 0.996665677712478160, -0.081593669300544652, 0.996650014000160070, - -0.081784776049585076, - 0.996634313643869900, -0.081975879791633066, 0.996618576644185070, - -0.082166980519662314, - 0.996602803001684130, -0.082358078226646536, 0.996586992716946950, - -0.082549172905559673, - 0.996571145790554840, -0.082740264549375692, 0.996555262223090540, - -0.082931353151068699, - 0.996539342015137940, -0.083122438703612911, 0.996523385167282450, - -0.083313521199982685, - 0.996507391680110820, -0.083504600633152432, 0.996491361554210920, - -0.083695676996096716, - 0.996475294790172160, -0.083886750281790226, 0.996459191388585410, - -0.084077820483207694, - 0.996443051350042630, -0.084268887593324071, 0.996426874675137240, - -0.084459951605114325, - 0.996410661364464100, -0.084651012511553617, 0.996394411418619290, - -0.084842070305617134, - 0.996378124838200210, -0.085033124980280275, 0.996361801623805720, - -0.085224176528518478, - 0.996345441776035900, -0.085415224943307333, 0.996329045295492380, - -0.085606270217622529, - 0.996312612182778000, -0.085797312344439894, 0.996296142438496850, - -0.085988351316735337, - 0.996279636063254650, -0.086179387127484894, 0.996263093057658140, - -0.086370419769664752, - 0.996246513422315520, -0.086561449236251170, 0.996229897157836500, - -0.086752475520220543, - 0.996213244264832040, -0.086943498614549378, 0.996196554743914220, - -0.087134518512214307, - 0.996179828595696980, -0.087325535206192059, 0.996163065820794950, - -0.087516548689459531, - 0.996146266419824620, -0.087707558954993659, 0.996129430393403740, - -0.087898565995771588, - 0.996112557742151130, -0.088089569804770507, 0.996095648466687300, - -0.088280570374967740, - 0.996078702567633980, -0.088471567699340767, 0.996061720045614000, - -0.088662561770867149, - 0.996044700901251970, -0.088853552582524600, 0.996027645135173610, - -0.089044540127290892, - 0.996010552748005870, -0.089235524398144014, 0.995993423740377360, - -0.089426505388061961, - 0.995976258112917790, -0.089617483090022959, 0.995959055866258320, - -0.089808457497005278, - 0.995941817001031350, -0.089999428601987341, 0.995924541517870800, - -0.090190396397947695, - 0.995907229417411720, -0.090381360877864983, 0.995889880700290720, - -0.090572322034717989, - 0.995872495367145730, -0.090763279861485621, 0.995855073418615790, - -0.090954234351146926, - 0.995837614855341610, -0.091145185496681005, 0.995820119677964910, - -0.091336133291067184, - 0.995802587887129160, -0.091527077727284828, 0.995785019483478750, - -0.091718018798313455, - 0.995767414467659820, -0.091908956497132724, 0.995749772840319510, - -0.092099890816722388, - 0.995732094602106430, -0.092290821750062355, 0.995714379753670610, - -0.092481749290132600, - 0.995696628295663520, -0.092672673429913310, 0.995678840228737540, - -0.092863594162384724, - 0.995661015553546910, -0.093054511480527249, 0.995643154270746900, - -0.093245425377321375, - 0.995625256380994310, -0.093436335845747787, 0.995607321884947050, - -0.093627242878787195, - 0.995589350783264600, -0.093818146469420549, 0.995571343076607770, - -0.094009046610628838, - 0.995553298765638470, -0.094199943295393204, 0.995535217851020390, - -0.094390836516694943, - 0.995517100333418110, -0.094581726267515445, 0.995498946213497770, - -0.094772612540836243, - 0.995480755491926940, -0.094963495329638992, 0.995462528169374420, - -0.095154374626905486, - 0.995444264246510340, -0.095345250425617617, 0.995425963724006160, - -0.095536122718757471, - 0.995407626602534900, -0.095726991499307162, 0.995389252882770690, - -0.095917856760249040, - 0.995370842565388990, -0.096108718494565509, 0.995352395651066810, - -0.096299576695239128, - 0.995333912140482280, -0.096490431355252593, 0.995315392034315070, - -0.096681282467588725, - 0.995296835333246090, -0.096872130025230471, 0.995278242037957670, - -0.097062974021160917, - 0.995259612149133390, -0.097253814448363271, 0.995240945667458130, - -0.097444651299820870, - 0.995222242593618360, -0.097635484568517200, 0.995203502928301510, - -0.097826314247435861, - 0.995184726672196930, -0.098017140329560604, 0.995165913825994620, - -0.098207962807875276, - 0.995147064390386470, -0.098398781675363881, 0.995128178366065490, - -0.098589596925010584, - 0.995109255753726110, -0.098780408549799623, 0.995090296554064000, - -0.098971216542715429, - 0.995071300767776170, -0.099162020896742503, 0.995052268395561050, - -0.099352821604865540, - 0.995033199438118630, -0.099543618660069319, 0.995014093896149700, - -0.099734412055338825, - 0.994994951770357020, -0.099925201783659073, 0.994975773061444140, - -0.100115987838015310, - 0.994956557770116380, -0.100306770211392860, 0.994937305897080070, - -0.100497548896777200, - 0.994918017443043200, -0.100688323887153960, 0.994898692408714870, - -0.100879095175508860, - 0.994879330794805620, -0.101069862754827820, 0.994859932602027320, - -0.101260626618096830, - 0.994840497831093180, -0.101451386758302080, 0.994821026482717860, - -0.101642143168429830, - 0.994801518557617110, -0.101832895841466530, 0.994781974056508260, - -0.102023644770398740, - 0.994762392980109930, -0.102214389948213210, 0.994742775329142010, - -0.102405131367896720, - 0.994723121104325700, -0.102595869022436280, 0.994703430306383860, - -0.102786602904819040, - 0.994683702936040250, -0.102977333008032220, 0.994663938994020390, - -0.103168059325063230, - 0.994644138481050710, -0.103358781848899610, 0.994624301397859400, - -0.103549500572529070, - 0.994604427745175660, -0.103740215488939370, 0.994584517523730340, - -0.103930926591118510, - 0.994564570734255420, -0.104121633872054590, 0.994544587377484300, - -0.104312337324735800, - 0.994524567454151740, -0.104503036942150570, 0.994504510964993700, - -0.104693732717287390, - 0.994484417910747600, -0.104884424643134970, 0.994464288292152390, - -0.105075112712682040, - 0.994444122109948040, -0.105265796918917600, 0.994423919364875950, - -0.105456477254830710, - 0.994403680057679100, -0.105647153713410620, 0.994383404189101430, - -0.105837826287646670, - 0.994363091759888570, -0.106028494970528410, 0.994342742770787270, - -0.106219159755045480, - 0.994322357222545810, -0.106409820634187680, 0.994301935115913580, - -0.106600477600944960, - 0.994281476451641550, -0.106791130648307390, 0.994260981230481790, - -0.106981779769265230, - 0.994240449453187900, -0.107172424956808840, 0.994219881120514960, - -0.107363066203928760, - 0.994199276233218910, -0.107553703503615620, 0.994178634792057590, - -0.107744336848860280, - 0.994157956797789730, -0.107934966232653650, 0.994137242251175720, - -0.108125591647986870, - 0.994116491152977070, -0.108316213087851170, 0.994095703503956930, - -0.108506830545237920, - 0.994074879304879370, -0.108697444013138720, 0.994054018556510210, - -0.108888053484545190, - 0.994033121259616400, -0.109078658952449240, 0.994012187414966220, - -0.109269260409842780, - 0.993991217023329380, -0.109459857849717980, 0.993970210085476920, - -0.109650451265067100, - 0.993949166602181130, -0.109841040648882600, 0.993928086574215830, - -0.110031625994157000, - 0.993906970002356060, -0.110222207293883060, 0.993885816887378090, - -0.110412784541053630, - 0.993864627230059750, -0.110603357728661730, 0.993843401031180180, - -0.110793926849700560, - 0.993822138291519660, -0.110984491897163390, 0.993800839011860120, - -0.111175052864043720, - 0.993779503192984580, -0.111365609743335160, 0.993758130835677430, - -0.111556162528031480, - 0.993736721940724600, -0.111746711211126590, 0.993715276508913230, - -0.111937255785614570, - 0.993693794541031790, -0.112127796244489640, 0.993672276037870010, - -0.112318332580746170, - 0.993650721000219120, -0.112508864787378690, 0.993629129428871720, - -0.112699392857381860, - 0.993607501324621610, -0.112889916783750520, 0.993585836688263950, - -0.113080436559479620, - 0.993564135520595300, -0.113270952177564350, 0.993542397822413600, - -0.113461463630999950, - 0.993520623594518090, -0.113651970912781870, 0.993498812837709360, - -0.113842474015905710, - 0.993476965552789190, -0.114032972933367200, 0.993455081740560960, - -0.114223467658162260, - 0.993433161401829360, -0.114413958183286920, 0.993411204537400060, - -0.114604444501737420, - 0.993389211148080650, -0.114794926606510080, 0.993367181234679600, - -0.114985404490601460, - 0.993345114798006910, -0.115175878147008190, 0.993323011838873950, - -0.115366347568727140, - 0.993300872358093280, -0.115556812748755260, 0.993278696356479030, - -0.115747273680089720, - 0.993256483834846440, -0.115937730355727780, 0.993234234794012290, - -0.116128182768666930, - 0.993211949234794500, -0.116318630911904750, 0.993189627158012620, - -0.116509074778439040, - 0.993167268564487230, -0.116699514361267690, 0.993144873455040430, - -0.116889949653388780, - 0.993122441830495580, -0.117080380647800590, 0.993099973691677570, - -0.117270807337501460, - 0.993077469039412300, -0.117461229715489990, 0.993054927874527320, - -0.117651647774764860, - 0.993032350197851410, -0.117842061508324980, 0.993009736010214580, - -0.118032470909169340, - 0.992987085312448390, -0.118222875970297170, 0.992964398105385610, - -0.118413276684707790, - 0.992941674389860470, -0.118603673045400720, 0.992918914166708300, - -0.118794065045375640, - 0.992896117436765980, -0.118984452677632340, 0.992873284200871730, - -0.119174835935170880, - 0.992850414459865100, -0.119365214810991350, 0.992827508214586760, - -0.119555589298094110, - 0.992804565465879140, -0.119745959389479600, 0.992781586214585570, - -0.119936325078148470, - 0.992758570461551140, -0.120126686357101500, 0.992735518207621850, - -0.120317043219339680, - 0.992712429453645460, -0.120507395657864130, 0.992689304200470750, - -0.120697743665676110, - 0.992666142448948020, -0.120888087235777080, 0.992642944199928820, - -0.121078426361168640, - 0.992619709454266140, -0.121268761034852600, 0.992596438212814290, - -0.121459091249830840, - 0.992573130476428810, -0.121649416999105530, 0.992549786245966680, - -0.121839738275678890, - 0.992526405522286100, -0.122030055072553360, 0.992502988306246950, - -0.122220367382731540, - 0.992479534598709970, -0.122410675199216200, 0.992456044400537700, - -0.122600978515010240, - 0.992432517712593660, -0.122791277323116770, 0.992408954535742850, - -0.122981571616539050, - 0.992385354870851670, -0.123171861388280480, 0.992361718718787870, - -0.123362146631344680, - 0.992338046080420420, -0.123552427338735370, 0.992314336956619640, - -0.123742703503456510, - 0.992290591348257370, -0.123932975118512160, 0.992266809256206580, - -0.124123242176906600, - 0.992242990681341700, -0.124313504671644230, 0.992219135624538450, - -0.124503762595729660, - 0.992195244086673920, -0.124694015942167640, 0.992171316068626520, - -0.124884264703963130, - 0.992147351571276090, -0.125074508874121170, 0.992123350595503720, - -0.125264748445647060, - 0.992099313142191800, -0.125454983411546230, 0.992075239212224070, - -0.125645213764824290, - 0.992051128806485720, -0.125835439498487000, 0.992026981925863360, - -0.126025660605540320, - 0.992002798571244520, -0.126215877078990350, 0.991978578743518580, - -0.126406088911843380, - 0.991954322443575950, -0.126596296097105850, 0.991930029672308480, - -0.126786498627784410, - 0.991905700430609330, -0.126976696496885870, 0.991881334719373010, - -0.127166889697417160, - 0.991856932539495470, -0.127357078222385400, 0.991832493891873780, - -0.127547262064797970, - 0.991808018777406430, -0.127737441217662310, 0.991783507196993490, - -0.127927615673986080, - 0.991758959151536110, -0.128117785426777130, 0.991734374641936810, - -0.128307950469043420, - 0.991709753669099530, -0.128498110793793170, 0.991685096233929420, - -0.128688266394034690, - 0.991660402337333210, -0.128878417262776550, 0.991635671980218740, - -0.129068563393027410, - 0.991610905163495370, -0.129258704777796140, 0.991586101888073500, - -0.129448841410091780, - 0.991561262154865290, -0.129638973282923560, 0.991536385964783880, - -0.129829100389300930, - 0.991511473318743900, -0.130019222722233350, 0.991486524217661480, - -0.130209340274730630, - 0.991461538662453790, -0.130399453039802690, 0.991436516654039420, - -0.130589561010459650, - 0.991411458193338540, -0.130779664179711710, 0.991386363281272280, - -0.130969762540569380, - 0.991361231918763460, -0.131159856086043270, 0.991336064106736140, - -0.131349944809144190, - 0.991310859846115440, -0.131540028702883120, 0.991285619137828200, - -0.131730107760271160, - 0.991260341982802440, -0.131920181974319790, 0.991235028381967420, - -0.132110251338040360, - 0.991209678336254060, -0.132300315844444650, 0.991184291846594180, - -0.132490375486544550, - 0.991158868913921350, -0.132680430257352070, 0.991133409539170170, - -0.132870480149879430, - 0.991107913723276890, -0.133060525157139060, 0.991082381467178640, - -0.133250565272143570, - 0.991056812771814340, -0.133440600487905680, 0.991031207638124130, - -0.133630630797438340, - 0.991005566067049370, -0.133820656193754720, 0.990979888059532740, - -0.134010676669868130, - 0.990954173616518500, -0.134200692218792020, 0.990928422738951990, - -0.134390702833540070, - 0.990902635427780010, -0.134580708507126170, 0.990876811683950700, - -0.134770709232564350, - 0.990850951508413620, -0.134960705002868750, 0.990825054902119470, - -0.135150695811053850, - 0.990799121866020370, -0.135340681650134210, 0.990773152401069780, - -0.135530662513124590, - 0.990747146508222710, -0.135720638393039910, 0.990721104188435180, - -0.135910609282895330, - 0.990695025442664630, -0.136100575175706200, 0.990668910271870100, - -0.136290536064487960, - 0.990642758677011570, -0.136480491942256280, 0.990616570659050620, - -0.136670442802027090, - 0.990590346218950150, -0.136860388636816380, 0.990564085357674370, - -0.137050329439640410, - 0.990537788076188750, -0.137240265203515590, 0.990511454375460290, - -0.137430195921458550, - 0.990485084256457090, -0.137620121586486040, 0.990458677720148620, - -0.137810042191615080, - 0.990432234767505970, -0.137999957729862790, 0.990405755399501260, - -0.138189868194246560, - 0.990379239617108160, -0.138379773577783890, 0.990352687421301450, - -0.138569673873492500, - 0.990326098813057330, -0.138759569074390350, 0.990299473793353590, - -0.138949459173495490, - 0.990272812363169110, -0.139139344163826200, 0.990246114523483990, - -0.139329224038400980, - 0.990219380275280000, -0.139519098790238490, 0.990192609619540030, - -0.139708968412357550, - 0.990165802557248400, -0.139898832897777210, 0.990138959089390650, - -0.140088692239516670, - 0.990112079216953770, -0.140278546430595420, 0.990085162940925970, - -0.140468395464033000, - 0.990058210262297120, -0.140658239332849210, 0.990031221182058000, - -0.140848078030064080, - 0.990004195701200910, -0.141037911548697710, 0.989977133820719610, - -0.141227739881770510, - 0.989950035541608990, -0.141417563022303020, 0.989922900864865450, - -0.141607380963316020, - 0.989895729791486660, -0.141797193697830390, 0.989868522322471580, - -0.141987001218867290, - 0.989841278458820530, -0.142176803519448030, 0.989813998201535260, - -0.142366600592594180, - 0.989786681551618640, -0.142556392431327340, 0.989759328510075200, - -0.142746179028669460, - 0.989731939077910570, -0.142935960377642670, 0.989704513256131850, - -0.143125736471269190, - 0.989677051045747210, -0.143315507302571500, 0.989649552447766530, - -0.143505272864572290, - 0.989622017463200890, -0.143695033150294470, 0.989594446093062460, - -0.143884788152760980, - 0.989566838338365120, -0.144074537864995160, 0.989539194200123930, - -0.144264282280020440, - 0.989511513679355190, -0.144454021390860470, 0.989483796777076760, - -0.144643755190539040, - 0.989456043494307710, -0.144833483672080210, 0.989428253832068230, - -0.145023206828508220, - 0.989400427791380380, -0.145212924652847460, 0.989372565373267010, - -0.145402637138122570, - 0.989344666578752640, -0.145592344277358340, 0.989316731408863000, - -0.145782046063579860, - 0.989288759864625170, -0.145971742489812210, 0.989260751947067640, - -0.146161433549080900, - 0.989232707657220050, -0.146351119234411460, 0.989204626996113780, - -0.146540799538829760, - 0.989176509964781010, -0.146730474455361750, 0.989148356564255590, - -0.146920143977033620, - 0.989120166795572690, -0.147109808096871820, 0.989091940659768800, - -0.147299466807902850, - 0.989063678157881540, -0.147489120103153570, 0.989035379290950310, - -0.147678767975650970, - 0.989007044060015270, -0.147868410418422220, 0.988978672466118480, - -0.148058047424494720, - 0.988950264510302990, -0.148247678986896030, 0.988921820193613190, - -0.148437305098653970, - 0.988893339517095130, -0.148626925752796540, 0.988864822481795640, - -0.148816540942351920, - 0.988836269088763540, -0.149006150660348450, 0.988807679339048450, - -0.149195754899814820, - 0.988779053233701520, -0.149385353653779720, 0.988750390773775360, - -0.149574946915272230, - 0.988721691960323780, -0.149764534677321510, 0.988692956794401940, - -0.149954116932956960, - 0.988664185277066230, -0.150143693675208190, 0.988635377409374790, - -0.150333264897105000, - 0.988606533192386450, -0.150522830591677400, 0.988577652627162020, - -0.150712390751955610, - 0.988548735714763200, -0.150901945370970040, 0.988519782456253270, - -0.151091494441751300, - 0.988490792852696590, -0.151281037957330220, 0.988461766905159300, - -0.151470575910737810, - 0.988432704614708340, -0.151660108295005310, 0.988403605982412390, - -0.151849635103164180, - 0.988374471009341280, -0.152039156328246050, 0.988345299696566150, - -0.152228671963282740, - 0.988316092045159690, -0.152418182001306330, 0.988286848056195820, - -0.152607686435349050, - 0.988257567730749460, -0.152797185258443440, 0.988228251069897420, - -0.152986678463622040, - 0.988198898074717610, -0.153176166043917840, 0.988169508746289060, - -0.153365647992363880, - 0.988140083085692570, -0.153555124301993450, 0.988110621094009820, - -0.153744594965840030, - 0.988081122772324070, -0.153934059976937350, 0.988051588121720110, - -0.154123519328319360, - 0.988022017143283530, -0.154312973013020100, 0.987992409838101880, - -0.154502421024073940, - 0.987962766207263420, -0.154691863354515430, 0.987933086251858380, - -0.154881299997379320, - 0.987903369972977790, -0.155070730945700510, 0.987873617371714200, - -0.155260156192514240, - 0.987843828449161740, -0.155449575730855850, 0.987814003206415550, - -0.155638989553760900, - 0.987784141644572180, -0.155828397654265230, 0.987754243764729530, - -0.156017800025404800, - 0.987724309567986960, -0.156207196660215900, 0.987694339055445130, - -0.156396587551734880, - 0.987664332228205710, -0.156585972692998430, 0.987634289087372160, - -0.156775352077043350, - 0.987604209634049160, -0.156964725696906780, 0.987574093869342360, - -0.157154093545625900, - 0.987543941794359230, -0.157343455616238250, 0.987513753410208420, - -0.157532811901781530, - 0.987483528717999710, -0.157722162395293630, 0.987453267718844560, - -0.157911507089812660, - 0.987422970413855410, -0.158100845978376980, 0.987392636804146240, - -0.158290179054025180, - 0.987362266890832400, -0.158479506309795960, 0.987331860675030430, - -0.158668827738728310, - 0.987301418157858430, -0.158858143333861450, 0.987270939340435420, - -0.159047453088234760, - 0.987240424223882250, -0.159236756994887850, 0.987209872809320820, - -0.159426055046860580, - 0.987179285097874340, -0.159615347237193060, 0.987148661090667570, - -0.159804633558925440, - 0.987118000788826280, -0.159993914005098270, 0.987087304193477900, - -0.160183188568752220, - 0.987056571305750970, -0.160372457242928280, 0.987025802126775600, - -0.160561720020667490, - 0.986994996657682980, -0.160750976895011220, 0.986964154899605650, - -0.160940227859001080, - 0.986933276853677710, -0.161129472905678810, 0.986902362521034470, - -0.161318712028086400, - 0.986871411902812470, -0.161507945219266120, 0.986840425000149680, - -0.161697172472260400, - 0.986809401814185530, -0.161886393780111830, 0.986778342346060430, - -0.162075609135863330, - 0.986747246596916590, -0.162264818532558000, 0.986716114567897100, - -0.162454021963239190, - 0.986684946260146690, -0.162643219420950310, 0.986653741674811350, - -0.162832410898735210, - 0.986622500813038480, -0.163021596389637840, 0.986591223675976400, - -0.163210775886702380, - 0.986559910264775410, -0.163399949382973230, 0.986528560580586690, - -0.163589116871495020, - 0.986497174624562880, -0.163778278345312670, 0.986465752397857940, - -0.163967433797471170, - 0.986434293901627180, -0.164156583221015810, 0.986402799137027220, - -0.164345726608992190, - 0.986371268105216030, -0.164534863954446000, 0.986339700807353000, - -0.164723995250423170, - 0.986308097244598670, -0.164913120489969890, 0.986276457418115090, - -0.165102239666132660, - 0.986244781329065460, -0.165291352771958000, 0.986213068978614490, - -0.165480459800492780, - 0.986181320367928270, -0.165669560744784120, 0.986149535498173860, - -0.165858655597879300, - 0.986117714370520090, -0.166047744352825790, 0.986085856986136820, - -0.166236827002671420, - 0.986053963346195440, -0.166425903540464100, 0.986022033451868560, - -0.166614973959252090, - 0.985990067304330140, -0.166804038252083730, 0.985958064904755460, - -0.166993096412007710, - 0.985926026254321130, -0.167182148432072940, 0.985893951354205210, - -0.167371194305328430, - 0.985861840205586980, -0.167560234024823560, 0.985829692809647050, - -0.167749267583607890, - 0.985797509167567480, -0.167938294974731170, 0.985765289280531310, - -0.168127316191243410, - 0.985733033149723490, -0.168316331226194830, 0.985700740776329850, - -0.168505340072635900, - 0.985668412161537550, -0.168694342723617330, 0.985636047306535420, - -0.168883339172189980, - 0.985603646212513400, -0.169072329411405010, 0.985571208880662740, - -0.169261313434313830, - 0.985538735312176060, -0.169450291233967960, 0.985506225508247290, - -0.169639262803419290, - 0.985473679470071810, -0.169828228135719850, 0.985441097198846210, - -0.170017187223921950, - 0.985408478695768420, -0.170206140061078070, 0.985375823962037710, - -0.170395086640240940, - 0.985343132998854790, -0.170584026954463590, 0.985310405807421570, - -0.170772960996799230, - 0.985277642388941220, -0.170961888760301220, 0.985244842744618540, - -0.171150810238023280, - 0.985212006875659350, -0.171339725423019310, 0.985179134783271130, - -0.171528634308343420, - 0.985146226468662230, -0.171717536887049970, 0.985113281933042710, - -0.171906433152193530, - 0.985080301177623800, -0.172095323096829010, 0.985047284203618200, - -0.172284206714011370, - 0.985014231012239840, -0.172473083996795950, 0.984981141604703960, - -0.172661954938238270, - 0.984948015982227030, -0.172850819531394080, 0.984914854146027200, - -0.173039677769319360, - 0.984881656097323700, -0.173228529645070320, 0.984848421837337010, - -0.173417375151703470, - 0.984815151367289140, -0.173606214282275410, 0.984781844688403350, - -0.173795047029843160, - 0.984748501801904210, -0.173983873387463820, 0.984715122709017620, - -0.174172693348194820, - 0.984681707410970940, -0.174361506905093750, 0.984648255908992630, - -0.174550314051218510, - 0.984614768204312600, -0.174739114779627200, 0.984581244298162180, - -0.174927909083378160, - 0.984547684191773960, -0.175116696955529920, 0.984514087886381840, - -0.175305478389141320, - 0.984480455383220930, -0.175494253377271430, 0.984446786683527920, - -0.175683021912979490, - 0.984413081788540700, -0.175871783989325040, 0.984379340699498510, - -0.176060539599367820, - 0.984345563417641900, -0.176249288736167880, 0.984311749944212780, - -0.176438031392785410, - 0.984277900280454370, -0.176626767562280880, 0.984244014427611110, - -0.176815497237715000, - 0.984210092386929030, -0.177004220412148750, 0.984176134159655320, - -0.177192937078643280, - 0.984142139747038570, -0.177381647230260040, 0.984108109150328540, - -0.177570350860060710, - 0.984074042370776450, -0.177759047961107170, 0.984039939409634970, - -0.177947738526461560, - 0.984005800268157870, -0.178136422549186300, 0.983971624947600270, - -0.178325100022344000, - 0.983937413449218920, -0.178513770938997510, 0.983903165774271500, - -0.178702435292209970, - 0.983868881924017220, -0.178891093075044720, 0.983834561899716630, - -0.179079744280565390, - 0.983800205702631600, -0.179268388901835750, 0.983765813334025240, - -0.179457026931919890, - 0.983731384795162090, -0.179645658363882160, 0.983696920087308140, - -0.179834283190787090, - 0.983662419211730250, -0.180022901405699510, 0.983627882169697210, - -0.180211513001684450, - 0.983593308962478650, -0.180400117971807240, 0.983558699591345900, - -0.180588716309133340, - 0.983524054057571260, -0.180777308006728590, 0.983489372362428730, - -0.180965893057658980, - 0.983454654507193270, -0.181154471454990810, 0.983419900493141540, - -0.181343043191790540, - 0.983385110321551180, -0.181531608261124970, 0.983350283993701500, - -0.181720166656061110, - 0.983315421510872810, -0.181908718369666160, 0.983280522874346970, - -0.182097263395007650, - 0.983245588085407070, -0.182285801725153300, 0.983210617145337640, - -0.182474333353171120, - 0.983175610055424420, -0.182662858272129270, 0.983140566816954500, - -0.182851376475096330, - 0.983105487431216290, -0.183039887955140950, 0.983070371899499640, - -0.183228392705332140, - 0.983035220223095640, -0.183416890718739100, 0.983000032403296590, - -0.183605381988431270, - 0.982964808441396440, -0.183793866507478450, 0.982929548338690170, - -0.183982344268950520, - 0.982894252096474070, -0.184170815265917720, 0.982858919716046110, - -0.184359279491450510, - 0.982823551198705240, -0.184547736938619620, 0.982788146545751970, - -0.184736187600495950, - 0.982752705758487830, -0.184924631470150790, 0.982717228838215990, - -0.185113068540655540, - 0.982681715786240860, -0.185301498805081900, 0.982646166603868050, - -0.185489922256501880, - 0.982610581292404750, -0.185678338887987630, 0.982574959853159240, - -0.185866748692611660, - 0.982539302287441240, -0.186055151663446630, 0.982503608596561830, - -0.186243547793565560, - 0.982467878781833170, -0.186431937076041610, 0.982432112844569110, - -0.186620319503948280, - 0.982396310786084690, -0.186808695070359270, 0.982360472607696210, - -0.186997063768348540, - 0.982324598310721280, -0.187185425590990330, 0.982288687896478830, - -0.187373780531359110, - 0.982252741366289370, -0.187562128582529600, 0.982216758721474510, - -0.187750469737576780, - 0.982180739963357090, -0.187938803989575910, 0.982144685093261580, - -0.188127131331602420, - 0.982108594112513610, -0.188315451756732120, 0.982072467022440000, - -0.188503765258040940, - 0.982036303824369020, -0.188692071828605230, 0.982000104519630490, - -0.188880371461501380, - 0.981963869109555240, -0.189068664149806190, 0.981927597595475540, - -0.189256949886596750, - 0.981891289978725100, -0.189445228664950230, 0.981854946260638630, - -0.189633500477944190, - 0.981818566442552500, -0.189821765318656410, 0.981782150525804310, - -0.190010023180164990, - 0.981745698511732990, -0.190198274055548150, 0.981709210401678800, - -0.190386517937884470, - 0.981672686196983110, -0.190574754820252740, 0.981636125898989080, - -0.190762984695732110, - 0.981599529509040720, -0.190951207557401800, 0.981562897028483650, - -0.191139423398341450, - 0.981526228458664770, -0.191327632211630900, 0.981489523800932130, - -0.191515833990350210, - 0.981452783056635520, -0.191704028727579800, 0.981416006227125550, - -0.191892216416400220, - 0.981379193313754560, -0.192080397049892440, 0.981342344317876040, - -0.192268570621137500, - 0.981305459240844670, -0.192456737123216840, 0.981268538084016710, - -0.192644896549212100, - 0.981231580848749730, -0.192833048892205230, 0.981194587536402320, - -0.193021194145278380, - 0.981157558148334830, -0.193209332301513960, 0.981120492685908730, - -0.193397463353994740, - 0.981083391150486710, -0.193585587295803610, 0.981046253543432780, - -0.193773704120023820, - 0.981009079866112630, -0.193961813819738840, 0.980971870119892840, - -0.194149916388032450, - 0.980934624306141640, -0.194338011817988600, 0.980897342426228390, - -0.194526100102691610, - 0.980860024481523870, -0.194714181235225960, 0.980822670473400100, - -0.194902255208676520, - 0.980785280403230430, -0.195090322016128250, 0.980747854272389750, - -0.195278381650666550, - 0.980710392082253970, -0.195466434105376980, 0.980672893834200530, - -0.195654479373345370, - 0.980635359529608120, -0.195842517447657850, 0.980597789169856850, - -0.196030548321400790, - 0.980560182756327840, -0.196218571987660880, 0.980522540290404090, - -0.196406588439524970, - 0.980484861773469380, -0.196594597670080220, 0.980447147206909060, - -0.196782599672414100, - 0.980409396592109910, -0.196970594439614340, 0.980371609930459800, - -0.197158581964768880, - 0.980333787223347960, -0.197346562240965920, 0.980295928472165290, - -0.197534535261294030, - 0.980258033678303550, -0.197722501018841920, 0.980220102843156080, - -0.197910459506698670, - 0.980182135968117430, -0.198098410717953560, 0.980144133054583590, - -0.198286354645696220, - 0.980106094103951770, -0.198474291283016390, 0.980068019117620650, - -0.198662220623004200, - 0.980029908096990090, -0.198850142658750090, 0.979991761043461200, - -0.199038057383344680, - 0.979953577958436740, -0.199225964789878830, 0.979915358843320480, - -0.199413864871443770, - 0.979877103699517640, -0.199601757621130970, 0.979838812528434740, - -0.199789643032032090, - 0.979800485331479790, -0.199977521097239150, 0.979762122110061750, - -0.200165391809844440, - 0.979723722865591170, -0.200353255162940450, 0.979685287599479930, - -0.200541111149619980, - 0.979646816313141210, -0.200728959762976140, 0.979608309007989450, - -0.200916800996102230, - 0.979569765685440520, -0.201104634842091900, 0.979531186346911500, - -0.201292461294039020, - 0.979492570993820810, -0.201480280345037730, 0.979453919627588210, - -0.201668091988182530, - 0.979415232249634780, -0.201855896216568050, 0.979376508861383170, - -0.202043693023289260, - 0.979337749464256780, -0.202231482401441450, 0.979298954059681040, - -0.202419264344120160, - 0.979260122649082020, -0.202607038844421130, 0.979221255233887700, - -0.202794805895440440, - 0.979182351815526930, -0.202982565490274440, 0.979143412395430230, - -0.203170317622019790, - 0.979104436975029250, -0.203358062283773320, 0.979065425555756930, - -0.203545799468632190, - 0.979026378139047580, -0.203733529169693920, 0.978987294726337050, - -0.203921251380056120, - 0.978948175319062200, -0.204108966092816870, 0.978909019918661310, - -0.204296673301074370, - 0.978869828526574120, -0.204484372997927240, 0.978830601144241470, - -0.204672065176474210, - 0.978791337773105670, -0.204859749829814420, 0.978752038414610340, - -0.205047426951047250, - 0.978712703070200420, -0.205235096533272350, 0.978673331741322210, - -0.205422758569589610, - 0.978633924429423210, -0.205610413053099240, 0.978594481135952270, - -0.205798059976901790, - 0.978555001862359550, -0.205985699334097910, 0.978515486610096910, - -0.206173331117788710, - 0.978475935380616830, -0.206360955321075510, 0.978436348175373730, - -0.206548571937059890, - 0.978396724995823090, -0.206736180958843690, 0.978357065843421640, - -0.206923782379529100, - 0.978317370719627650, -0.207111376192218560, 0.978277639625900530, - -0.207298962390014750, - 0.978237872563701090, -0.207486540966020650, 0.978198069534491400, - -0.207674111913339570, - 0.978158230539735050, -0.207861675225075070, 0.978118355580896660, - -0.208049230894330940, - 0.978078444659442380, -0.208236778914211330, 0.978038497776839600, - -0.208424319277820600, - 0.977998514934557140, -0.208611851978263490, 0.977958496134064830, - -0.208799377008644900, - 0.977918441376834370, -0.208986894362070070, 0.977878350664338150, - -0.209174404031644580, - 0.977838223998050430, -0.209361906010474160, 0.977798061379446360, - -0.209549400291664940, - 0.977757862810002760, -0.209736886868323290, 0.977717628291197460, - -0.209924365733555880, - 0.977677357824509930, -0.210111836880469610, 0.977637051411420770, - -0.210299300302171730, - 0.977596709053411890, -0.210486755991769720, 0.977556330751966460, - -0.210674203942371440, - 0.977515916508569280, -0.210861644147084860, 0.977475466324706170, - -0.211049076599018390, - 0.977434980201864260, -0.211236501291280710, 0.977394458141532250, - -0.211423918216980670, - 0.977353900145199960, -0.211611327369227550, 0.977313306214358750, - -0.211798728741130840, - 0.977272676350500860, -0.211986122325800330, 0.977232010555120320, - -0.212173508116346080, - 0.977191308829712280, -0.212360886105878420, 0.977150571175773200, - -0.212548256287508060, - 0.977109797594800880, -0.212735618654345930, 0.977068988088294450, - -0.212922973199503180, - 0.977028142657754390, -0.213110319916091360, 0.976987261304682390, - -0.213297658797222320, - 0.976946344030581670, -0.213484989836008050, 0.976905390836956490, - -0.213672313025560970, - 0.976864401725312640, -0.213859628358993750, 0.976823376697157240, - -0.214046935829419360, - 0.976782315753998650, -0.214234235429950990, 0.976741218897346550, - -0.214421527153702160, - 0.976700086128711840, -0.214608810993786760, 0.976658917449606980, - -0.214796086943318860, - 0.976617712861545640, -0.214983354995412820, 0.976576472366042610, - -0.215170615143183390, - 0.976535195964614470, -0.215357867379745550, 0.976493883658778650, - -0.215545111698214500, - 0.976452535450054060, -0.215732348091705880, 0.976411151339961040, - -0.215919576553335490, - 0.976369731330021140, -0.216106797076219520, 0.976328275421757260, - -0.216294009653474340, - 0.976286783616693630, -0.216481214278216730, 0.976245255916355800, - -0.216668410943563730, - 0.976203692322270560, -0.216855599642632620, 0.976162092835966110, - -0.217042780368540990, - 0.976120457458971910, -0.217229953114406790, 0.976078786192818850, - -0.217417117873348190, - 0.976037079039039020, -0.217604274638483640, 0.975995335999165990, - -0.217791423402931950, - 0.975953557074734300, -0.217978564159812200, 0.975911742267280170, - -0.218165696902243800, - 0.975869891578341030, -0.218352821623346320, 0.975828005009455660, - -0.218539938316239770, - 0.975786082562163930, -0.218727046974044440, 0.975744124238007270, - -0.218914147589880840, - 0.975702130038528570, -0.219101240156869800, 0.975660099965271590, - -0.219288324668132470, - 0.975618034019781750, -0.219475401116790310, 0.975575932203605720, - -0.219662469495965050, - 0.975533794518291360, -0.219849529798778700, 0.975491620965388110, - -0.220036582018353580, - 0.975449411546446380, -0.220223626147812380, 0.975407166263018270, - -0.220410662180277940, - 0.975364885116656980, -0.220597690108873510, 0.975322568108916930, - -0.220784709926722610, - 0.975280215241354220, -0.220971721626949110, 0.975237826515525820, - -0.221158725202677010, - 0.975195401932990370, -0.221345720647030810, 0.975152941495307620, - -0.221532707953135230, - 0.975110445204038890, -0.221719687114115220, 0.975067913060746470, - -0.221906658123096100, - 0.975025345066994120, -0.222093620973203510, 0.974982741224347140, - -0.222280575657563370, - 0.974940101534371830, -0.222467522169301880, 0.974897425998635820, - -0.222654460501545500, - 0.974854714618708430, -0.222841390647421120, 0.974811967396159830, - -0.223028312600055820, - 0.974769184332561770, -0.223215226352576980, 0.974726365429487320, - -0.223402131898112370, - 0.974683510688510670, -0.223589029229789990, 0.974640620111207560, - -0.223775918340738150, - 0.974597693699155050, -0.223962799224085460, 0.974554731453931230, - -0.224149671872960870, - 0.974511733377115720, -0.224336536280493600, 0.974468699470289580, - -0.224523392439813170, - 0.974425629735034990, -0.224710240344049430, 0.974382524172935470, - -0.224897079986332490, - 0.974339382785575860, -0.225083911359792830, 0.974296205574542440, - -0.225270734457561160, - 0.974252992541422500, -0.225457549272768540, 0.974209743687805220, - -0.225644355798546330, - 0.974166459015280320, -0.225831154028026170, 0.974123138525439640, - -0.226017943954340020, - 0.974079782219875680, -0.226204725570620190, 0.974036390100182610, - -0.226391498869999240, - 0.973992962167955830, -0.226578263845610000, 0.973949498424792170, - -0.226765020490585690, - 0.973905998872289570, -0.226951768798059810, 0.973862463512047300, - -0.227138508761166170, - 0.973818892345666100, -0.227325240373038860, 0.973775285374748110, - -0.227511963626812280, - 0.973731642600896400, -0.227698678515621170, 0.973687964025715670, - -0.227885385032600530, - 0.973644249650811980, -0.228072083170885730, 0.973600499477792370, - -0.228258772923612380, - 0.973556713508265560, -0.228445454283916470, 0.973512891743841370, - -0.228632127244934230, - 0.973469034186131070, -0.228818791799802220, 0.973425140836747030, - -0.229005447941657340, - 0.973381211697303290, -0.229192095663636770, 0.973337246769414910, - -0.229378734958878010, - 0.973293246054698250, -0.229565365820518870, 0.973249209554771230, - -0.229751988241697490, - 0.973205137271252800, -0.229938602215552210, 0.973161029205763530, - -0.230125207735221850, - 0.973116885359925130, -0.230311804793845440, 0.973072705735360530, - -0.230498393384562350, - 0.973028490333694210, -0.230684973500512200, 0.972984239156551740, - -0.230871545134835020, - 0.972939952205560180, -0.231058108280671110, 0.972895629482347760, - -0.231244662931161050, - 0.972851270988544180, -0.231431209079445750, 0.972806876725780370, - -0.231617746718666470, - 0.972762446695688570, -0.231804275841964780, 0.972717980899902250, - -0.231990796442482440, - 0.972673479340056430, -0.232177308513361710, 0.972628942017787270, - -0.232363812047745030, - 0.972584368934732210, -0.232550307038775240, 0.972539760092530180, - -0.232736793479595390, - 0.972495115492821190, -0.232923271363348980, 0.972450435137246830, - -0.233109740683179690, - 0.972405719027449770, -0.233296201432231590, 0.972360967165074140, - -0.233482653603649090, - 0.972316179551765300, -0.233669097190576820, 0.972271356189170040, - -0.233855532186159840, - 0.972226497078936270, -0.234041958583543430, 0.972181602222713440, - -0.234228376375873210, - 0.972136671622152230, -0.234414785556295160, 0.972091705278904430, - -0.234601186117955550, - 0.972046703194623500, -0.234787578054000970, 0.972001665370963890, - -0.234973961357578250, - 0.971956591809581720, -0.235160336021834730, 0.971911482512134000, - -0.235346702039917840, - 0.971866337480279400, -0.235533059404975490, 0.971821156715677700, - -0.235719408110155820, - 0.971775940219990140, -0.235905748148607370, 0.971730687994879160, - -0.236092079513478910, - 0.971685400042008540, -0.236278402197919570, 0.971640076363043390, - -0.236464716195078780, - 0.971594716959650160, -0.236651021498106380, 0.971549321833496630, - -0.236837318100152380, - 0.971503890986251780, -0.237023605994367200, 0.971458424419585960, - -0.237209885173901600, - 0.971412922135170940, -0.237396155631906610, 0.971367384134679490, - -0.237582417361533570, - 0.971321810419786160, -0.237768670355934190, 0.971276200992166490, - -0.237954914608260540, - 0.971230555853497380, -0.238141150111664840, 0.971184875005457030, - -0.238327376859299810, - 0.971139158449725090, -0.238513594844318420, 0.971093406187982460, - -0.238699804059873980, - 0.971047618221911100, -0.238886004499120040, 0.971001794553194690, - -0.239072196155210610, - 0.970955935183517970, -0.239258379021299980, 0.970910040114567050, - -0.239444553090542630, - 0.970864109348029470, -0.239630718356093560, 0.970818142885593870, - -0.239816874811108000, - 0.970772140728950350, -0.240003022448741500, 0.970726102879790110, - -0.240189161262149900, - 0.970680029339806130, -0.240375291244489450, 0.970633920110692160, - -0.240561412388916650, - 0.970587775194143630, -0.240747524688588430, 0.970541594591857070, - -0.240933628136661910, - 0.970495378305530560, -0.241119722726294590, 0.970449126336863090, - -0.241305808450644370, - 0.970402838687555500, -0.241491885302869330, 0.970356515359309450, - -0.241677953276128010, - 0.970310156353828110, -0.241864012363579180, 0.970263761672816140, - -0.242050062558382070, - 0.970217331317979160, -0.242236103853696010, 0.970170865291024480, - -0.242422136242680890, - 0.970124363593660280, -0.242608159718496810, 0.970077826227596420, - -0.242794174274304220, - 0.970031253194543970, -0.242980179903263870, 0.969984644496215240, - -0.243166176598536900, - 0.969938000134323960, -0.243352164353284740, 0.969891320110585100, - -0.243538143160669130, - 0.969844604426714830, -0.243724113013852160, 0.969797853084430890, - -0.243910073905996260, - 0.969751066085452140, -0.244096025830264210, 0.969704243431498860, - -0.244281968779819030, - 0.969657385124292450, -0.244467902747824150, 0.969610491165555870, - -0.244653827727443320, - 0.969563561557013180, -0.244839743711840670, 0.969516596300390000, - -0.245025650694180470, - 0.969469595397413060, -0.245211548667627540, 0.969422558849810320, - -0.245397437625346960, - 0.969375486659311280, -0.245583317560504060, 0.969328378827646660, - -0.245769188466264580, - 0.969281235356548530, -0.245955050335794590, 0.969234056247750050, - -0.246140903162260530, - 0.969186841502985950, -0.246326746938829030, 0.969139591123992280, - -0.246512581658667210, - 0.969092305112506210, -0.246698407314942410, 0.969044983470266240, - -0.246884223900822430, - 0.968997626199012420, -0.247070031409475250, 0.968950233300485800, - -0.247255829834069300, - 0.968902804776428870, -0.247441619167773270, 0.968855340628585580, - -0.247627399403756280, - 0.968807840858700970, -0.247813170535187670, 0.968760305468521430, - -0.247998932555237110, - 0.968712734459794780, -0.248184685457074780, 0.968665127834270060, - -0.248370429233870980, - 0.968617485593697540, -0.248556163878796560, 0.968569807739828930, - -0.248741889385022480, - 0.968522094274417380, -0.248927605745720150, 0.968474345199216820, - -0.249113312954061360, - 0.968426560515983190, -0.249299011003218190, 0.968378740226473300, - -0.249484699886362960, - 0.968330884332445190, -0.249670379596668550, 0.968282992835658660, - -0.249856050127307990, - 0.968235065737874320, -0.250041711471454650, 0.968187103040854420, - -0.250227363622282370, - 0.968139104746362440, -0.250413006572965220, 0.968091070856162970, - -0.250598640316677670, - 0.968043001372022260, -0.250784264846594500, 0.967994896295707670, - -0.250969880155890720, - 0.967946755628987800, -0.251155486237741920, 0.967898579373632660, - -0.251341083085323880, - 0.967850367531413620, -0.251526670691812610, 0.967802120104103270, - -0.251712249050384700, - 0.967753837093475510, -0.251897818154216970, 0.967705518501305480, - -0.252083377996486450, - 0.967657164329369880, -0.252268928570370810, 0.967608774579446500, - -0.252454469869047740, - 0.967560349253314360, -0.252640001885695520, 0.967511888352754150, - -0.252825524613492610, - 0.967463391879547550, -0.253011038045617860, 0.967414859835477480, - -0.253196542175250560, - 0.967366292222328510, -0.253382036995570160, 0.967317689041886310, - -0.253567522499756560, - 0.967269050295937790, -0.253752998680989990, 0.967220375986271420, - -0.253938465532451090, - 0.967171666114676640, -0.254123923047320620, 0.967122920682944360, - -0.254309371218780000, - 0.967074139692867040, -0.254494810040010730, 0.967025323146238010, - -0.254680239504194830, - 0.966976471044852070, -0.254865659604514570, 0.966927583390505660, - -0.255051070334152470, - 0.966878660184995910, -0.255236471686291710, 0.966829701430121810, - -0.255421863654115460, - 0.966780707127683270, -0.255607246230807380, 0.966731677279481840, - -0.255792619409551610, - 0.966682611887320080, -0.255977983183532430, 0.966633510953002100, - -0.256163337545934460, - 0.966584374478333120, -0.256348682489942910, 0.966535202465119700, - -0.256534018008743040, - 0.966485994915169840, -0.256719344095520660, 0.966436751830292650, - -0.256904660743461910, - 0.966387473212298900, -0.257089967945753120, 0.966338159063000130, - -0.257275265695581120, - 0.966288809384209690, -0.257460553986133100, 0.966239424177741890, - -0.257645832810596390, - 0.966190003445412500, -0.257831102162158990, 0.966140547189038750, - -0.258016362034009020, - 0.966091055410438830, -0.258201612419334870, 0.966041528111432400, - -0.258386853311325600, - 0.965991965293840570, -0.258572084703170340, 0.965942366959485540, - -0.258757306588058680, - 0.965892733110190860, -0.258942518959180520, 0.965843063747781510, - -0.259127721809726150, - 0.965793358874083680, -0.259312915132886230, 0.965743618490924830, - -0.259498098921851660, - 0.965693842600133690, -0.259683273169813770, 0.965644031203540590, - -0.259868437869964270, - 0.965594184302976830, -0.260053593015495190, 0.965544301900275180, - -0.260238738599598840, - 0.965494383997269500, -0.260423874615468010, 0.965444430595795430, - -0.260609001056295750, - 0.965394441697689400, -0.260794117915275510, 0.965344417304789370, - -0.260979225185601070, - 0.965294357418934660, -0.261164322860466480, 0.965244262041965780, - -0.261349410933066350, - 0.965194131175724720, -0.261534489396595520, 0.965143964822054450, - -0.261719558244249030, - 0.965093762982799590, -0.261904617469222610, 0.965043525659805890, - -0.262089667064712040, - 0.964993252854920320, -0.262274707023913590, 0.964942944569991410, - -0.262459737340023980, - 0.964892600806868890, -0.262644758006240040, 0.964842221567403620, - -0.262829769015759160, - 0.964791806853447900, -0.263014770361779000, 0.964741356666855340, - -0.263199762037497560, - 0.964690871009481030, -0.263384744036113280, 0.964640349883180930, - -0.263569716350824880, - 0.964589793289812760, -0.263754678974831350, 0.964539201231235150, - -0.263939631901332350, - 0.964488573709308410, -0.264124575123527550, 0.964437910725893910, - -0.264309508634617110, - 0.964387212282854290, -0.264494432427801630, 0.964336478382053720, - -0.264679346496281890, - 0.964285709025357480, -0.264864250833259260, 0.964234904214632200, - -0.265049145431935250, - 0.964184063951745830, -0.265234030285511790, 0.964133188238567640, - -0.265418905387191260, - 0.964082277076968140, -0.265603770730176330, 0.964031330468819280, - -0.265788626307669920, - 0.963980348415994110, -0.265973472112875590, 0.963929330920367140, - -0.266158308138996990, - 0.963878277983814200, -0.266343134379238180, 0.963827189608212340, - -0.266527950826803690, - 0.963776065795439840, -0.266712757474898370, 0.963724906547376530, - -0.266897554316727350, - 0.963673711865903230, -0.267082341345496300, 0.963622481752902220, - -0.267267118554410930, - 0.963571216210257320, -0.267451885936677620, 0.963519915239853140, - -0.267636643485503090, - 0.963468578843575950, -0.267821391194094150, 0.963417207023313350, - -0.268006129055658290, - 0.963365799780954050, -0.268190857063403180, 0.963314357118388200, - -0.268375575210536900, - 0.963262879037507070, -0.268560283490267890, 0.963211365540203480, - -0.268744981895804980, - 0.963159816628371360, -0.268929670420357260, 0.963108232303906190, - -0.269114349057134380, - 0.963056612568704340, -0.269299017799346120, 0.963004957424663850, - -0.269483676640202840, - 0.962953266873683880, -0.269668325572915090, 0.962901540917665000, - -0.269852964590693860, - 0.962849779558509030, -0.270037593686750570, 0.962797982798119010, - -0.270222212854296870, - 0.962746150638399410, -0.270406822086544820, 0.962694283081255930, - -0.270591421376706940, - 0.962642380128595710, -0.270776010717996010, 0.962590441782326890, - -0.270960590103625170, - 0.962538468044359160, -0.271145159526808010, 0.962486458916603450, - -0.271329718980758420, - 0.962434414400972100, -0.271514268458690700, 0.962382334499378380, - -0.271698807953819510, - 0.962330219213737400, -0.271883337459359720, 0.962278068545965090, - -0.272067856968526920, - 0.962225882497979020, -0.272252366474536710, 0.962173661071697880, - -0.272436865970605240, - 0.962121404269041580, -0.272621355449948980, 0.962069112091931580, - -0.272805834905784810, - 0.962016784542290560, -0.272990304331329920, 0.961964421622042320, - -0.273174763719801930, - 0.961912023333112210, -0.273359213064418680, 0.961859589677426570, - -0.273543652358398730, - 0.961807120656913540, -0.273728081594960540, 0.961754616273502010, - -0.273912500767323260, - 0.961702076529122540, -0.274096909868706380, 0.961649501425706820, - -0.274281308892329660, - 0.961596890965187860, -0.274465697831413220, 0.961544245149499990, - -0.274650076679177680, - 0.961491563980579000, -0.274834445428843940, 0.961438847460361680, - -0.275018804073633220, - 0.961386095590786250, -0.275203152606767310, 0.961333308373792270, - -0.275387491021468140, - 0.961280485811320640, -0.275571819310958140, 0.961227627905313460, - -0.275756137468460120, - 0.961174734657714080, -0.275940445487197150, 0.961121806070467380, - -0.276124743360392830, - 0.961068842145519350, -0.276309031081271080, 0.961015842884817230, - -0.276493308643055990, - 0.960962808290309780, -0.276677576038972420, 0.960909738363946770, - -0.276861833262245280, - 0.960856633107679660, -0.277046080306099900, 0.960803492523460760, - -0.277230317163762170, - 0.960750316613243950, -0.277414543828458090, 0.960697105378984450, - -0.277598760293414290, - 0.960643858822638590, -0.277782966551857690, 0.960590576946164120, - -0.277967162597015370, - 0.960537259751520050, -0.278151348422115090, 0.960483907240666790, - -0.278335524020384920, - 0.960430519415565790, -0.278519689385053060, 0.960377096278180130, - -0.278703844509348490, - 0.960323637830473920, -0.278887989386500280, 0.960270144074412800, - -0.279072124009737800, - 0.960216615011963430, -0.279256248372291180, 0.960163050645094000, - -0.279440362467390510, - 0.960109450975773940, -0.279624466288266590, 0.960055816005973890, - -0.279808559828150390, - 0.960002145737665960, -0.279992643080273220, 0.959948440172823210, - -0.280176716037866980, - 0.959894699313420530, -0.280360778694163810, 0.959840923161433770, - -0.280544831042396250, - 0.959787111718839900, -0.280728873075797190, 0.959733264987617680, - -0.280912904787600000, - 0.959679382969746750, -0.281096926171038260, 0.959625465667208190, - -0.281280937219346110, - 0.959571513081984520, -0.281464937925757940, 0.959517525216059260, - -0.281648928283508630, - 0.959463502071417510, -0.281832908285833350, 0.959409443650045550, - -0.282016877925967640, - 0.959355349953930790, -0.282200837197147560, 0.959301220985062210, - -0.282384786092609360, - 0.959247056745430090, -0.282568724605589740, 0.959192857237025740, - -0.282752652729325930, - 0.959138622461841890, -0.282936570457055390, 0.959084352421872730, - -0.283120477782015820, - 0.959030047119113660, -0.283304374697445740, 0.958975706555561080, - -0.283488261196583550, - 0.958921330733213170, -0.283672137272668430, 0.958866919654069010, - -0.283856002918939750, - 0.958812473320129310, -0.284039858128637190, 0.958757991733395710, - -0.284223702895001040, - 0.958703474895871600, -0.284407537211271880, 0.958648922809561150, - -0.284591361070690440, - 0.958594335476470220, -0.284775174466498300, 0.958539712898605730, - -0.284958977391937040, - 0.958485055077976100, -0.285142769840248670, 0.958430362016590930, - -0.285326551804675870, - 0.958375633716461170, -0.285510323278461260, 0.958320870179598880, - -0.285694084254848320, - 0.958266071408017670, -0.285877834727080620, 0.958211237403732260, - -0.286061574688402040, - 0.958156368168758820, -0.286245304132057120, 0.958101463705114730, - -0.286429023051290700, - 0.958046524014818600, -0.286612731439347790, 0.957991549099890370, - -0.286796429289474080, - 0.957936538962351420, -0.286980116594915570, 0.957881493604224370, - -0.287163793348918390, - 0.957826413027532910, -0.287347459544729510, 0.957771297234302320, - -0.287531115175595930, - 0.957716146226558870, -0.287714760234765170, 0.957660960006330610, - -0.287898394715485170, - 0.957605738575646350, -0.288082018611004130, 0.957550481936536470, - -0.288265631914570770, - 0.957495190091032570, -0.288449234619434220, 0.957439863041167680, - -0.288632826718843830, - 0.957384500788975860, -0.288816408206049480, 0.957329103336492790, - -0.288999979074301420, - 0.957273670685755200, -0.289183539316850200, 0.957218202838801210, - -0.289367088926947010, - 0.957162699797670210, -0.289550627897843030, 0.957107161564402790, - -0.289734156222790250, - 0.957051588141040970, -0.289917673895040750, 0.956995979529628230, - -0.290101180907847090, - 0.956940335732208820, -0.290284677254462330, 0.956884656750828900, - -0.290468162928139820, - 0.956828942587535370, -0.290651637922133220, 0.956773193244376930, - -0.290835102229696830, - 0.956717408723403050, -0.291018555844085090, 0.956661589026665090, - -0.291201998758552900, - 0.956605734156215080, -0.291385430966355660, 0.956549844114106820, - -0.291568852460749040, - 0.956493918902395100, -0.291752263234989260, 0.956437958523136180, - -0.291935663282332780, - 0.956381962978387730, -0.292119052596036380, 0.956325932270208230, - -0.292302431169357560, - 0.956269866400658030, -0.292485798995553880, 0.956213765371798470, - -0.292669156067883460, - 0.956157629185692140, -0.292852502379604810, 0.956101457844403040, - -0.293035837923976810, - 0.956045251349996410, -0.293219162694258630, 0.955989009704538930, - -0.293402476683710110, - 0.955932732910098280, -0.293585779885591200, 0.955876420968743590, - -0.293769072293162400, - 0.955820073882545420, -0.293952353899684660, 0.955763691653575440, - -0.294135624698419030, - 0.955707274283906560, -0.294318884682627400, 0.955650821775613330, - -0.294502133845571670, - 0.955594334130771110, -0.294685372180514330, 0.955537811351456880, - -0.294868599680718270, - 0.955481253439748770, -0.295051816339446720, 0.955424660397726330, - -0.295235022149963220, - 0.955368032227470350, -0.295418217105532010, 0.955311368931062720, - -0.295601401199417360, - 0.955254670510586990, -0.295784574424884260, 0.955197936968127710, - -0.295967736775197890, - 0.955141168305770780, -0.296150888243623790, 0.955084364525603410, - -0.296334028823428190, - 0.955027525629714160, -0.296517158507877470, 0.954970651620192790, - -0.296700277290238350, - 0.954913742499130520, -0.296883385163778270, 0.954856798268619580, - -0.297066482121764730, - 0.954799818930753720, -0.297249568157465840, 0.954742804487627940, - -0.297432643264150030, - 0.954685754941338340, -0.297615707435086200, 0.954628670293982680, - -0.297798760663543550, - 0.954571550547659630, -0.297981802942791810, 0.954514395704469500, - -0.298164834266100850, - 0.954457205766513490, -0.298347854626741400, 0.954399980735894490, - -0.298530864017984120, - 0.954342720614716480, -0.298713862433100330, 0.954285425405084650, - -0.298896849865361800, - 0.954228095109105670, -0.299079826308040480, 0.954170729728887280, - -0.299262791754408840, - 0.954113329266538800, -0.299445746197739890, 0.954055893724170660, - -0.299628689631306790, - 0.953998423103894490, -0.299811622048383350, 0.953940917407823500, - -0.299994543442243580, - 0.953883376638071770, -0.300177453806161950, 0.953825800796755050, - -0.300360353133413530, - 0.953768189885990330, -0.300543241417273450, 0.953710543907895670, - -0.300726118651017500, - 0.953652862864590500, -0.300908984827921890, 0.953595146758195680, - -0.301091839941263100, - 0.953537395590833280, -0.301274683984317950, 0.953479609364626610, - -0.301457516950363940, - 0.953421788081700310, -0.301640338832678770, 0.953363931744180330, - -0.301823149624540650, - 0.953306040354193860, -0.302005949319228080, 0.953248113913869320, - -0.302188737910019990, - 0.953190152425336670, -0.302371515390195970, 0.953132155890726750, - -0.302554281753035610, - 0.953074124312172200, -0.302737036991819140, 0.953016057691806530, - -0.302919781099827310, - 0.952957956031764700, -0.303102514070341060, 0.952899819334182880, - -0.303285235896641750, - 0.952841647601198720, -0.303467946572011320, 0.952783440834950920, - -0.303650646089731910, - 0.952725199037579570, -0.303833334443086360, 0.952666922211226170, - -0.304016011625357570, - 0.952608610358033350, -0.304198677629829110, 0.952550263480144930, - -0.304381332449784880, - 0.952491881579706320, -0.304563976078509100, 0.952433464658864030, - -0.304746608509286530, - 0.952375012719765880, -0.304929229735402370, 0.952316525764560940, - -0.305111839750142110, - 0.952258003795399600, -0.305294438546791670, 0.952199446814433580, - -0.305477026118637420, - 0.952140854823815830, -0.305659602458966120, 0.952082227825700620, - -0.305842167561065080, - 0.952023565822243570, -0.306024721418221790, 0.951964868815601380, - -0.306207264023724220, - 0.951906136807932350, -0.306389795370860920, 0.951847369801395620, - -0.306572315452920740, - 0.951788567798152130, -0.306754824263192780, 0.951729730800363830, - -0.306937321794966910, - 0.951670858810193860, -0.307119808041533100, 0.951611951829806850, - -0.307302282996181790, - 0.951553009861368590, -0.307484746652204100, 0.951494032907046370, - -0.307667199002891190, - 0.951435020969008340, -0.307849640041534870, 0.951375974049424420, - -0.308032069761427330, - 0.951316892150465550, -0.308214488155861050, 0.951257775274304000, - -0.308396895218129190, - 0.951198623423113230, -0.308579290941525090, 0.951139436599068190, - -0.308761675319342450, - 0.951080214804345010, -0.308944048344875710, 0.951020958041121080, - -0.309126410011419440, - 0.950961666311575080, -0.309308760312268730, 0.950902339617887060, - -0.309491099240719100, - 0.950842977962238160, -0.309673426790066380, 0.950783581346811070, - -0.309855742953607070, - 0.950724149773789610, -0.310038047724637890, 0.950664683245358910, - -0.310220341096455850, - 0.950605181763705340, -0.310402623062358720, 0.950545645331016600, - -0.310584893615644450, - 0.950486073949481700, -0.310767152749611470, 0.950426467621290900, - -0.310949400457558640, - 0.950366826348635780, -0.311131636732785270, 0.950307150133709260, - -0.311313861568590920, - 0.950247438978705230, -0.311496074958275910, 0.950187692885819280, - -0.311678276895140550, - 0.950127911857248100, -0.311860467372486020, 0.950068095895189590, - -0.312042646383613510, - 0.950008245001843000, -0.312224813921824880, 0.949948359179409010, - -0.312406969980422440, - 0.949888438430089300, -0.312589114552708710, 0.949828482756087110, - -0.312771247631986770, - 0.949768492159606680, -0.312953369211560200, 0.949708466642853800, - -0.313135479284732840, - 0.949648406208035480, -0.313317577844809010, 0.949588310857359950, - -0.313499664885093510, - 0.949528180593036670, -0.313681740398891520, 0.949468015417276550, - -0.313863804379508500, - 0.949407815332291570, -0.314045856820250710, 0.949347580340295210, - -0.314227897714424440, - 0.949287310443502120, -0.314409927055336660, 0.949227005644128210, - -0.314591944836294660, - 0.949166665944390700, -0.314773951050606070, 0.949106291346508260, - -0.314955945691579140, - 0.949045881852700560, -0.315137928752522440, 0.948985437465188710, - -0.315319900226744890, - 0.948924958186195160, -0.315501860107555990, 0.948864444017943340, - -0.315683808388265650, - 0.948803894962658490, -0.315865745062183960, 0.948743311022566480, - -0.316047670122621860, - 0.948682692199895090, -0.316229583562890330, 0.948622038496872990, - -0.316411485376300980, - 0.948561349915730270, -0.316593375556165850, 0.948500626458698260, - -0.316775254095797270, - 0.948439868128009620, -0.316957120988508150, 0.948379074925898120, - -0.317138976227611780, - 0.948318246854599090, -0.317320819806421740, 0.948257383916349060, - -0.317502651718252260, - 0.948196486113385580, -0.317684471956417970, 0.948135553447947980, - -0.317866280514233660, - 0.948074585922276230, -0.318048077385014950, 0.948013583538612200, - -0.318229862562077530, - 0.947952546299198670, -0.318411636038737790, 0.947891474206279840, - -0.318593397808312420, - 0.947830367262101010, -0.318775147864118480, 0.947769225468909180, - -0.318956886199473650, - 0.947708048828952100, -0.319138612807695900, 0.947646837344479300, - -0.319320327682103610, - 0.947585591017741090, -0.319502030816015690, 0.947524309850989570, - -0.319683722202751430, - 0.947462993846477700, -0.319865401835630500, 0.947401643006459900, - -0.320047069707973140, - 0.947340257333192050, -0.320228725813099860, 0.947278836828930880, - -0.320410370144331820, - 0.947217381495934820, -0.320592002694990330, 0.947155891336463270, - -0.320773623458397330, - 0.947094366352777220, -0.320955232427875210, 0.947032806547138620, - -0.321136829596746660, - 0.946971211921810880, -0.321318414958334850, 0.946909582479058760, - -0.321499988505963510, - 0.946847918221148000, -0.321681550232956580, 0.946786219150346000, - -0.321863100132638580, - 0.946724485268921170, -0.322044638198334510, 0.946662716579143360, - -0.322226164423369600, - 0.946600913083283530, -0.322407678801069850, 0.946539074783614100, - -0.322589181324761330, - 0.946477201682408680, -0.322770671987770710, 0.946415293781942110, - -0.322952150783425260, - 0.946353351084490590, -0.323133617705052330, 0.946291373592331620, - -0.323315072745979980, - 0.946229361307743820, -0.323496515899536710, 0.946167314233007370, - -0.323677947159051240, - 0.946105232370403450, -0.323859366517852850, 0.946043115722214560, - -0.324040773969271450, - 0.945980964290724760, -0.324222169506636960, 0.945918778078219110, - -0.324403553123280230, - 0.945856557086983910, -0.324584924812532150, 0.945794301319306970, - -0.324766284567724220, - 0.945732010777477150, -0.324947632382188430, 0.945669685463784710, - -0.325128968249257080, - 0.945607325380521280, -0.325310292162262930, 0.945544930529979680, - -0.325491604114539310, - 0.945482500914453740, -0.325672904099419850, 0.945420036536239070, - -0.325854192110238580, - 0.945357537397632290, -0.326035468140330240, 0.945295003500931210, - -0.326216732183029710, - 0.945232434848435000, -0.326397984231672490, 0.945169831442444150, - -0.326579224279594400, - 0.945107193285260610, -0.326760452320131730, 0.945044520379187070, - -0.326941668346621420, - 0.944981812726528150, -0.327122872352400510, 0.944919070329589220, - -0.327304064330806670, - 0.944856293190677210, -0.327485244275178000, 0.944793481312100280, - -0.327666412178853120, - 0.944730634696167800, -0.327847568035170840, 0.944667753345190490, - -0.328028711837470680, - 0.944604837261480260, -0.328209843579092500, 0.944541886447350490, - -0.328390963253376580, - 0.944478900905115550, -0.328572070853663740, 0.944415880637091250, - -0.328753166373294990, - 0.944352825645594750, -0.328934249805612200, 0.944289735932944410, - -0.329115321143957250, - 0.944226611501459810, -0.329296380381672750, 0.944163452353461770, - -0.329477427512101740, - 0.944100258491272660, -0.329658462528587490, 0.944037029917215830, - -0.329839485424473940, - 0.943973766633615980, -0.330020496193105420, 0.943910468642799150, - -0.330201494827826570, - 0.943847135947092690, -0.330382481321982780, 0.943783768548825060, - -0.330563455668919540, - 0.943720366450326200, -0.330744417861982890, 0.943656929653927220, - -0.330925367894519540, - 0.943593458161960390, -0.331106305759876430, 0.943529951976759480, - -0.331287231451400820, - 0.943466411100659320, -0.331468144962440870, 0.943402835535996240, - -0.331649046286344670, - 0.943339225285107720, -0.331829935416461110, 0.943275580350332540, - -0.332010812346139380, - 0.943211900734010620, -0.332191677068729150, 0.943148186438483420, - -0.332372529577580620, - 0.943084437466093490, -0.332553369866044220, 0.943020653819184650, - -0.332734197927471050, - 0.942956835500102120, -0.332915013755212650, 0.942892982511192250, - -0.333095817342620780, - 0.942829094854802710, -0.333276608683047930, 0.942765172533282510, - -0.333457387769846850, - 0.942701215548981900, -0.333638154596370860, 0.942637223904252530, - -0.333818909155973620, - 0.942573197601446870, -0.333999651442009380, 0.942509136642919240, - -0.334180381447832690, - 0.942445041031024890, -0.334361099166798740, 0.942380910768120470, - -0.334541804592262900, - 0.942316745856563780, -0.334722497717581220, 0.942252546298714020, - -0.334903178536110180, - 0.942188312096931770, -0.335083847041206580, 0.942124043253578570, - -0.335264503226227810, - 0.942059739771017310, -0.335445147084531600, 0.941995401651612550, - -0.335625778609476290, - 0.941931028897729620, -0.335806397794420450, 0.941866621511735280, - -0.335987004632723350, - 0.941802179495997650, -0.336167599117744520, 0.941737702852886160, - -0.336348181242844050, - 0.941673191584771360, -0.336528751001382410, 0.941608645694025250, - -0.336709308386720580, - 0.941544065183020810, -0.336889853392220050, 0.941479450054132580, - -0.337070386011242620, - 0.941414800309736340, -0.337250906237150590, 0.941350115952208970, - -0.337431414063306840, - 0.941285396983928660, -0.337611909483074620, 0.941220643407275180, - -0.337792392489817460, - 0.941155855224629190, -0.337972863076899720, 0.941091032438372780, - -0.338153321237685930, - 0.941026175050889260, -0.338333766965541130, 0.940961283064563280, - -0.338514200253830940, - 0.940896356481780830, -0.338694621095921190, 0.940831395304928870, - -0.338875029485178450, - 0.940766399536396070, -0.339055425414969640, 0.940701369178571940, - -0.339235808878661950, - 0.940636304233847590, -0.339416179869623360, 0.940571204704615190, - -0.339596538381222110, - 0.940506070593268300, -0.339776884406826850, 0.940440901902201750, - -0.339957217939806880, - 0.940375698633811540, -0.340137538973531720, 0.940310460790495070, - -0.340317847501371670, - 0.940245188374650880, -0.340498143516697160, 0.940179881388678920, - -0.340678427012879200, - 0.940114539834980280, -0.340858697983289440, 0.940049163715957370, - -0.341038956421299720, - 0.939983753034014050, -0.341219202320282360, 0.939918307791555050, - -0.341399435673610420, - 0.939852827990986680, -0.341579656474657160, 0.939787313634716570, - -0.341759864716796310, - 0.939721764725153340, -0.341940060393402190, 0.939656181264707180, - -0.342120243497849530, - 0.939590563255789270, -0.342300414023513520, 0.939524910700812230, - -0.342480571963769800, - 0.939459223602189920, -0.342660717311994380, 0.939393501962337510, - -0.342840850061563950, - 0.939327745783671400, -0.343020970205855540, 0.939261955068609210, - -0.343201077738246540, - 0.939196129819569900, -0.343381172652115040, 0.939130270038973650, - -0.343561254940839390, - 0.939064375729241950, -0.343741324597798490, 0.938998446892797540, - -0.343921381616371700, - 0.938932483532064600, -0.344101425989938810, 0.938866485649468060, - -0.344281457711880180, - 0.938800453247434770, -0.344461476775576540, 0.938734386328392460, - -0.344641483174408960, - 0.938668284894770170, -0.344821476901759290, 0.938602148948998400, - -0.345001457951009670, - 0.938535978493508560, -0.345181426315542550, 0.938469773530733800, - -0.345361381988741220, - 0.938403534063108060, -0.345541324963989090, 0.938337260093066950, - -0.345721255234670120, - 0.938270951623047190, -0.345901172794168990, 0.938204608655486490, - -0.346081077635870430, - 0.938138231192824360, -0.346260969753160010, 0.938071819237501270, - -0.346440849139423520, - 0.938005372791958840, -0.346620715788047320, 0.937938891858640320, - -0.346800569692418290, - 0.937872376439989890, -0.346980410845923680, 0.937805826538453120, - -0.347160239241951160, - 0.937739242156476970, -0.347340054873889140, 0.937672623296509470, - -0.347519857735126110, - 0.937605969960999990, -0.347699647819051380, 0.937539282152399230, - -0.347879425119054510, - 0.937472559873159250, -0.348059189628525610, 0.937405803125732960, - -0.348238941340855260, - 0.937339011912574960, -0.348418680249434560, 0.937272186236140950, - -0.348598406347654930, - 0.937205326098887960, -0.348778119628908420, 0.937138431503274140, - -0.348957820086587490, - 0.937071502451759190, -0.349137507714084970, 0.937004538946803690, - -0.349317182504794380, - 0.936937540990869900, -0.349496844452109550, 0.936870508586420960, - -0.349676493549424760, - 0.936803441735921560, -0.349856129790134920, 0.936736340441837620, - -0.350035753167635240, - 0.936669204706636170, -0.350215363675321580, 0.936602034532785570, - -0.350394961306590150, - 0.936534829922755500, -0.350574546054837510, 0.936467590879016990, - -0.350754117913461060, - 0.936400317404042060, -0.350933676875858360, 0.936333009500304180, - -0.351113222935427460, - 0.936265667170278260, -0.351292756085567090, 0.936198290416440090, - -0.351472276319676310, - 0.936130879241267030, -0.351651783631154570, 0.936063433647237540, - -0.351831278013402030, - 0.935995953636831410, -0.352010759459819080, 0.935928439212529660, - -0.352190227963806830, - 0.935860890376814640, -0.352369683518766630, 0.935793307132169900, - -0.352549126118100460, - 0.935725689481080370, -0.352728555755210730, 0.935658037426032040, - -0.352907972423500250, - 0.935590350969512370, -0.353087376116372480, 0.935522630114009930, - -0.353266766827231240, - 0.935454874862014620, -0.353446144549480810, 0.935387085216017770, - -0.353625509276525970, - 0.935319261178511610, -0.353804861001772050, 0.935251402751989920, - -0.353984199718624770, - 0.935183509938947610, -0.354163525420490340, 0.935115582741880890, - -0.354342838100775550, - 0.935047621163287430, -0.354522137752887430, 0.934979625205665800, - -0.354701424370233830, - 0.934911594871516090, -0.354880697946222790, 0.934843530163339540, - -0.355059958474262860, - 0.934775431083638700, -0.355239205947763310, 0.934707297634917440, - -0.355418440360133650, - 0.934639129819680780, -0.355597661704783850, 0.934570927640435030, - -0.355776869975124640, - 0.934502691099687870, -0.355956065164566850, 0.934434420199948050, - -0.356135247266522130, - 0.934366114943725790, -0.356314416274402410, 0.934297775333532530, - -0.356493572181620090, - 0.934229401371880820, -0.356672714981588260, 0.934160993061284530, - -0.356851844667720300, - 0.934092550404258980, -0.357030961233429980, 0.934024073403320390, - -0.357210064672131960, - 0.933955562060986730, -0.357389154977240940, 0.933887016379776890, - -0.357568232142172260, - 0.933818436362210960, -0.357747296160341900, 0.933749822010810580, - -0.357926347025166010, - 0.933681173328098410, -0.358105384730061590, 0.933612490316598540, - -0.358284409268445850, - 0.933543772978836170, -0.358463420633736540, 0.933475021317337950, - -0.358642418819351990, - 0.933406235334631520, -0.358821403818710860, 0.933337415033246190, - -0.359000375625232460, - 0.933268560415712050, -0.359179334232336500, 0.933199671484560730, - -0.359358279633443130, - 0.933130748242325230, -0.359537211821973070, 0.933061790691539380, - -0.359716130791347570, - 0.932992798834738960, -0.359895036534988110, 0.932923772674460140, - -0.360073929046317020, - 0.932854712213241120, -0.360252808318756890, 0.932785617453621100, - -0.360431674345730700, - 0.932716488398140250, -0.360610527120662270, 0.932647325049340450, - -0.360789366636975580, - 0.932578127409764420, -0.360968192888095230, 0.932508895481956590, - -0.361147005867446250, - 0.932439629268462360, -0.361325805568454280, 0.932370328771828460, - -0.361504591984545260, - 0.932300993994602760, -0.361683365109145840, 0.932231624939334540, - -0.361862124935682980, - 0.932162221608574430, -0.362040871457584180, 0.932092784004874050, - -0.362219604668277460, - 0.932023312130786490, -0.362398324561191310, 0.931953805988866010, - -0.362577031129754760, - 0.931884265581668150, -0.362755724367397230, 0.931814690911749730, - -0.362934404267548640, - 0.931745081981668720, -0.363113070823639470, 0.931675438793984620, - -0.363291724029100760, - 0.931605761351257830, -0.363470363877363760, 0.931536049656050300, - -0.363648990361860550, - 0.931466303710925090, -0.363827603476023500, 0.931396523518446600, - -0.364006203213285470, - 0.931326709081180430, -0.364184789567079890, 0.931256860401693420, - -0.364363362530840620, - 0.931186977482553750, -0.364541922098002120, 0.931117060326330790, - -0.364720468261999280, - 0.931047108935595280, -0.364899001016267320, 0.930977123312918930, - -0.365077520354242180, - 0.930907103460875130, -0.365256026269360320, 0.930837049382038150, - -0.365434518755058390, - 0.930766961078983710, -0.365612997804773850, 0.930696838554288860, - -0.365791463411944570, - 0.930626681810531760, -0.365969915570008740, 0.930556490850291800, - -0.366148354272405330, - 0.930486265676149780, -0.366326779512573590, 0.930416006290687550, - -0.366505191283953370, - 0.930345712696488470, -0.366683589579984930, 0.930275384896137150, - -0.366861974394109060, - 0.930205022892219070, -0.367040345719767180, 0.930134626687321390, - -0.367218703550400980, - 0.930064196284032360, -0.367397047879452710, 0.929993731684941480, - -0.367575378700365330, - 0.929923232892639670, -0.367753696006581980, 0.929852699909718750, - -0.367931999791546450, - 0.929782132738772190, -0.368110290048703050, 0.929711531382394370, - -0.368288566771496570, - 0.929640895843181330, -0.368466829953372320, 0.929570226123729860, - -0.368645079587776040, - 0.929499522226638560, -0.368823315668153910, 0.929428784154506800, - -0.369001538187952780, - 0.929358011909935500, -0.369179747140620020, 0.929287205495526790, - -0.369357942519603130, - 0.929216364913884040, -0.369536124318350650, 0.929145490167611720, - -0.369714292530311240, - 0.929074581259315860, -0.369892447148934100, 0.929003638191603360, - -0.370070588167669080, - 0.928932660967082820, -0.370248715579966360, 0.928861649588363700, - -0.370426829379276790, - 0.928790604058057020, -0.370604929559051670, 0.928719524378774810, - -0.370783016112742560, - 0.928648410553130520, -0.370961089033801980, 0.928577262583738850, - -0.371139148315682570, - 0.928506080473215590, -0.371317193951837540, 0.928434864224177980, - -0.371495225935720760, - 0.928363613839244370, -0.371673244260786520, 0.928292329321034670, - -0.371851248920489490, - 0.928221010672169440, -0.372029239908285010, 0.928149657895271150, - -0.372207217217628840, - 0.928078270992963140, -0.372385180841977360, 0.928006849967869970, - -0.372563130774787250, - 0.927935394822617890, -0.372741067009515760, 0.927863905559833780, - -0.372918989539620830, - 0.927792382182146320, -0.373096898358560640, 0.927720824692185200, - -0.373274793459793970, - 0.927649233092581180, -0.373452674836780300, 0.927577607385966730, - -0.373630542482979280, - 0.927505947574975180, -0.373808396391851210, 0.927434253662241300, - -0.373986236556857030, - 0.927362525650401110, -0.374164062971457930, 0.927290763542091720, - -0.374341875629115920, - 0.927218967339951790, -0.374519674523293210, 0.927147137046620880, - -0.374697459647452600, - 0.927075272664740100, -0.374875230995057540, 0.927003374196951670, - -0.375052988559571920, - 0.926931441645899130, -0.375230732334459920, 0.926859475014227160, - -0.375408462313186590, - 0.926787474304581750, -0.375586178489217220, 0.926715439519610330, - -0.375763880856017700, - 0.926643370661961230, -0.375941569407054420, 0.926571267734284330, - -0.376119244135794340, - 0.926499130739230510, -0.376296905035704790, 0.926426959679452210, - -0.376474552100253770, - 0.926354754557602860, -0.376652185322909560, 0.926282515376337210, - -0.376829804697141280, - 0.926210242138311380, -0.377007410216418260, 0.926137934846182560, - -0.377185001874210450, - 0.926065593502609310, -0.377362579663988340, 0.925993218110251480, - -0.377540143579222940, - 0.925920808671770070, -0.377717693613385640, 0.925848365189827270, - -0.377895229759948490, - 0.925775887667086740, -0.378072752012383990, 0.925703376106213230, - -0.378250260364165200, - 0.925630830509872720, -0.378427754808765560, 0.925558250880732740, - -0.378605235339659120, - 0.925485637221461490, -0.378782701950320540, 0.925412989534729060, - -0.378960154634224720, - 0.925340307823206310, -0.379137593384847320, 0.925267592089565660, - -0.379315018195664430, - 0.925194842336480530, -0.379492429060152630, 0.925122058566625880, - -0.379669825971788940, - 0.925049240782677580, -0.379847208924051160, 0.924976388987313160, - -0.380024577910417270, - 0.924903503183210910, -0.380201932924366050, 0.924830583373050800, - -0.380379273959376600, - 0.924757629559513910, -0.380556601008928520, 0.924684641745282420, - -0.380733914066502140, - 0.924611619933039970, -0.380911213125578070, 0.924538564125471420, - -0.381088498179637520, - 0.924465474325262600, -0.381265769222162380, 0.924392350535101050, - -0.381443026246634730, - 0.924319192757675160, -0.381620269246537360, 0.924246000995674890, - -0.381797498215353640, - 0.924172775251791200, -0.381974713146567220, 0.924099515528716280, - -0.382151914033662610, - 0.924026221829143850, -0.382329100870124510, 0.923952894155768640, - -0.382506273649438230, - 0.923879532511286740, -0.382683432365089780, 0.923806136898395410, - -0.382860577010565420, - 0.923732707319793290, -0.383037707579352020, 0.923659243778179980, - -0.383214824064937180, - 0.923585746276256670, -0.383391926460808660, 0.923512214816725630, - -0.383569014760454910, - 0.923438649402290370, -0.383746088957365010, 0.923365050035655720, - -0.383923149045028390, - 0.923291416719527640, -0.384100195016935040, 0.923217749456613500, - -0.384277226866575510, - 0.923144048249621930, -0.384454244587440820, 0.923070313101262420, - -0.384631248173022580, - 0.922996544014246250, -0.384808237616812880, 0.922922740991285680, - -0.384985212912304200, - 0.922848904035094120, -0.385162174052989860, 0.922775033148386380, - -0.385339121032363340, - 0.922701128333878630, -0.385516053843918850, 0.922627189594287910, - -0.385692972481151140, - 0.922553216932332830, -0.385869876937555310, 0.922479210350733210, - -0.386046767206627170, - 0.922405169852209880, -0.386223643281862980, 0.922331095439485440, - -0.386400505156759440, - 0.922256987115283030, -0.386577352824813920, 0.922182844882327600, - -0.386754186279524180, - 0.922108668743345180, -0.386931005514388580, 0.922034458701062820, - -0.387107810522905990, - 0.921960214758209220, -0.387284601298575840, 0.921885936917513970, - -0.387461377834897870, - 0.921811625181708120, -0.387638140125372730, 0.921737279553523910, - -0.387814888163501180, - 0.921662900035694730, -0.387991621942784860, 0.921588486630955490, - -0.388168341456725740, - 0.921514039342042010, -0.388345046698826250, 0.921439558171691430, - -0.388521737662589570, - 0.921365043122642340, -0.388698414341519190, 0.921290494197634540, - -0.388875076729119250, - 0.921215911399408730, -0.389051724818894380, 0.921141294730707270, - -0.389228358604349730, - 0.921066644194273640, -0.389404978078990940, 0.920991959792852310, - -0.389581583236324300, - 0.920917241529189520, -0.389758174069856410, 0.920842489406032190, - -0.389934750573094730, - 0.920767703426128790, -0.390111312739546910, 0.920692883592229120, - -0.390287860562721190, - 0.920618029907083970, -0.390464394036126590, 0.920543142373445480, - -0.390640913153272430, - 0.920468220994067110, -0.390817417907668500, 0.920393265771703550, - -0.390993908292825380, - 0.920318276709110590, -0.391170384302253870, 0.920243253809045370, - -0.391346845929465560, - 0.920168197074266340, -0.391523293167972410, 0.920093106507533180, - -0.391699726011286940, - 0.920017982111606570, -0.391876144452922350, 0.919942823889248640, - -0.392052548486392090, - 0.919867631843222950, -0.392228938105210310, 0.919792405976293860, - -0.392405313302891690, - 0.919717146291227360, -0.392581674072951470, 0.919641852790790470, - -0.392758020408905280, - 0.919566525477751530, -0.392934352304269490, 0.919491164354880100, - -0.393110669752560760, - 0.919415769424947070, -0.393286972747296400, 0.919340340690724340, - -0.393463261281994330, - 0.919264878154985370, -0.393639535350172880, 0.919189381820504470, - -0.393815794945351020, - 0.919113851690057770, -0.393992040061048100, 0.919038287766422050, - -0.394168270690784080, - 0.918962690052375630, -0.394344486828079600, 0.918887058550697970, - -0.394520688466455600, - 0.918811393264170050, -0.394696875599433560, 0.918735694195573550, - -0.394873048220535760, - 0.918659961347691900, -0.395049206323284770, 0.918584194723309540, - -0.395225349901203670, - 0.918508394325212250, -0.395401478947816350, 0.918432560156186910, - -0.395577593456646840, - 0.918356692219021720, -0.395753693421220080, 0.918280790516506130, - -0.395929778835061250, - 0.918204855051430900, -0.396105849691696270, 0.918128885826588030, - -0.396281905984651520, - 0.918052882844770380, -0.396457947707453910, 0.917976846108772730, - -0.396633974853630830, - 0.917900775621390500, -0.396809987416710310, 0.917824671385420570, - -0.396985985390220900, - 0.917748533403661250, -0.397161968767691610, 0.917672361678911860, - -0.397337937542652060, - 0.917596156213972950, -0.397513891708632330, 0.917519917011646260, - -0.397689831259163180, - 0.917443644074735220, -0.397865756187775750, 0.917367337406043930, - -0.398041666488001770, - 0.917290997008377910, -0.398217562153373560, 0.917214622884544250, - -0.398393443177423980, - 0.917138215037350710, -0.398569309553686300, 0.917061773469606820, - -0.398745161275694430, - 0.916985298184123000, -0.398920998336982910, 0.916908789183710990, - -0.399096820731086540, - 0.916832246471183890, -0.399272628451540990, 0.916755670049355990, - -0.399448421491882140, - 0.916679059921042700, -0.399624199845646790, 0.916602416089060790, - -0.399799963506371980, - 0.916525738556228210, -0.399975712467595330, 0.916449027325364150, - -0.400151446722855130, - 0.916372282399289140, -0.400327166265690090, 0.916295503780824800, - -0.400502871089639500, - 0.916218691472794220, -0.400678561188243240, 0.916141845478021350, - -0.400854236555041650, - 0.916064965799331720, -0.401029897183575620, 0.915988052439551950, - -0.401205543067386710, - 0.915911105401509880, -0.401381174200016790, 0.915834124688034710, - -0.401556790575008540, - 0.915757110301956720, -0.401732392185905010, 0.915680062246107650, - -0.401907979026249700, - 0.915602980523320230, -0.402083551089586990, 0.915525865136428530, - -0.402259108369461490, - 0.915448716088267830, -0.402434650859418430, 0.915371533381674760, - -0.402610178553003680, - 0.915294317019487050, -0.402785691443763530, 0.915217067004543860, - -0.402961189525244900, - 0.915139783339685260, -0.403136672790995300, 0.915062466027752760, - -0.403312141234562550, - 0.914985115071589310, -0.403487594849495310, 0.914907730474038730, - -0.403663033629342640, - 0.914830312237946200, -0.403838457567654070, 0.914752860366158220, - -0.404013866657979890, - 0.914675374861522390, -0.404189260893870690, 0.914597855726887790, - -0.404364640268877810, - 0.914520302965104450, -0.404540004776553000, 0.914442716579023870, - -0.404715354410448650, - 0.914365096571498560, -0.404890689164117580, 0.914287442945382440, - -0.405066009031113340, - 0.914209755703530690, -0.405241314004989860, 0.914132034848799460, - -0.405416604079301630, - 0.914054280384046570, -0.405591879247603870, 0.913976492312130630, - -0.405767139503452060, - 0.913898670635911680, -0.405942384840402510, 0.913820815358251100, - -0.406117615252011840, - 0.913742926482011390, -0.406292830731837360, 0.913665004010056350, - -0.406468031273437000, - 0.913587047945250810, -0.406643216870369030, 0.913509058290461140, - -0.406818387516192310, - 0.913431035048554720, -0.406993543204466510, 0.913352978222400250, - -0.407168683928751550, - 0.913274887814867760, -0.407343809682607970, 0.913196763828828200, - -0.407518920459596920, - 0.913118606267154240, -0.407694016253280110, 0.913040415132719160, - -0.407869097057219800, - 0.912962190428398210, -0.408044162864978690, 0.912883932157067200, - -0.408219213670120100, - 0.912805640321603500, -0.408394249466208000, 0.912727314924885900, - -0.408569270246806780, - 0.912648955969793900, -0.408744276005481360, 0.912570563459208730, - -0.408919266735797430, - 0.912492137396012650, -0.409094242431320980, 0.912413677783089020, - -0.409269203085618590, - 0.912335184623322750, -0.409444148692257590, 0.912256657919599760, - -0.409619079244805670, - 0.912178097674807180, -0.409793994736831150, 0.912099503891833470, - -0.409968895161902880, - 0.912020876573568340, -0.410143780513590240, 0.911942215722902570, - -0.410318650785463260, - 0.911863521342728520, -0.410493505971092410, 0.911784793435939430, - -0.410668346064048730, - 0.911706032005429880, -0.410843171057903910, 0.911627237054095650, - -0.411017980946230210, - 0.911548408584833990, -0.411192775722600160, 0.911469546600543020, - -0.411367555380587220, - 0.911390651104122430, -0.411542319913765220, 0.911311722098472780, - -0.411717069315708560, - 0.911232759586496190, -0.411891803579992170, 0.911153763571095900, - -0.412066522700191560, - 0.911074734055176360, -0.412241226669882890, 0.910995671041643140, - -0.412415915482642730, - 0.910916574533403360, -0.412590589132048210, 0.910837444533365010, - -0.412765247611677270, - 0.910758281044437570, -0.412939890915108080, 0.910679084069531570, - -0.413114519035919450, - 0.910599853611558930, -0.413289131967690960, 0.910520589673432750, - -0.413463729704002410, - 0.910441292258067250, -0.413638312238434500, 0.910361961368377990, - -0.413812879564568300, - 0.910282597007281760, -0.413987431675985400, 0.910203199177696540, - -0.414161968566268080, - 0.910123767882541680, -0.414336490228999100, 0.910044303124737500, - -0.414510996657761750, - 0.909964804907205660, -0.414685487846140010, 0.909885273232869160, - -0.414859963787718330, - 0.909805708104652220, -0.415034424476081630, 0.909726109525480160, - -0.415208869904815590, - 0.909646477498279540, -0.415383300067506230, 0.909566812025978330, - -0.415557714957740410, - 0.909487113111505430, -0.415732114569105360, 0.909407380757791260, - -0.415906498895188770, - 0.909327614967767260, -0.416080867929579210, 0.909247815744366310, - -0.416255221665865480, - 0.909167983090522380, -0.416429560097637150, 0.909088117009170580, - -0.416603883218484350, - 0.909008217503247450, -0.416778191021997650, 0.908928284575690640, - -0.416952483501768170, - 0.908848318229439120, -0.417126760651387870, 0.908768318467432890, - -0.417301022464448890, - 0.908688285292613360, -0.417475268934544290, 0.908608218707923190, - -0.417649500055267410, - 0.908528118716306120, -0.417823715820212270, 0.908447985320707250, - -0.417997916222973550, - 0.908367818524072890, -0.418172101257146320, 0.908287618329350450, - -0.418346270916326260, - 0.908207384739488700, -0.418520425194109700, 0.908127117757437600, - -0.418694564084093560, - 0.908046817386148340, -0.418868687579875050, 0.907966483628573350, - -0.419042795675052370, - 0.907886116487666260, -0.419216888363223910, 0.907805715966381930, - -0.419390965637988890, - 0.907725282067676440, -0.419565027492946880, 0.907644814794507200, - -0.419739073921698180, - 0.907564314149832630, -0.419913104917843620, 0.907483780136612570, - -0.420087120474984530, - 0.907403212757808110, -0.420261120586722880, 0.907322612016381420, - -0.420435105246661170, - 0.907241977915295820, -0.420609074448402510, 0.907161310457516250, - -0.420783028185550520, - 0.907080609646008450, -0.420956966451709440, 0.906999875483739610, - -0.421130889240483970, - 0.906919107973678140, -0.421304796545479640, 0.906838307118793430, - -0.421478688360302280, - 0.906757472922056550, -0.421652564678558330, 0.906676605386439460, - -0.421826425493854910, - 0.906595704514915330, -0.422000270799799680, 0.906514770310458800, - -0.422174100590000770, - 0.906433802776045460, -0.422347914858067050, 0.906352801914652400, - -0.422521713597607820, - 0.906271767729257660, -0.422695496802232950, 0.906190700222840650, - -0.422869264465553060, - 0.906109599398381980, -0.423043016581179040, 0.906028465258863600, - -0.423216753142722610, - 0.905947297807268460, -0.423390474143796050, 0.905866097046580940, - -0.423564179578011960, - 0.905784862979786550, -0.423737869438983840, 0.905703595609872010, - -0.423911543720325580, - 0.905622294939825270, -0.424085202415651560, 0.905540960972635590, - -0.424258845518576950, - 0.905459593711293250, -0.424432473022717420, 0.905378193158790090, - -0.424606084921689110, - 0.905296759318118820, -0.424779681209108810, 0.905215292192273590, - -0.424953261878593890, - 0.905133791784249690, -0.425126826923762360, 0.905052258097043590, - -0.425300376338232640, - 0.904970691133653250, -0.425473910115623800, 0.904889090897077470, - -0.425647428249555590, - 0.904807457390316540, -0.425820930733648240, 0.904725790616371930, - -0.425994417561522400, - 0.904644090578246240, -0.426167888726799620, 0.904562357278943300, - -0.426341344223101830, - 0.904480590721468250, -0.426514784044051520, 0.904398790908827350, - -0.426688208183271860, - 0.904316957844028320, -0.426861616634386430, 0.904235091530079750, - -0.427035009391019680, - 0.904153191969991780, -0.427208386446796320, 0.904071259166775440, - -0.427381747795341770, - 0.903989293123443340, -0.427555093430282080, 0.903907293843009050, - -0.427728423345243800, - 0.903825261328487510, -0.427901737533854080, 0.903743195582894620, - -0.428075035989740730, - 0.903661096609247980, -0.428248318706531960, 0.903578964410566070, - -0.428421585677856650, - 0.903496798989868450, -0.428594836897344400, 0.903414600350176290, - -0.428768072358625070, - 0.903332368494511820, -0.428941292055329490, 0.903250103425898400, - -0.429114495981088750, - 0.903167805147360720, -0.429287684129534610, 0.903085473661924600, - -0.429460856494299490, - 0.903003108972617150, -0.429634013069016380, 0.902920711082466740, - -0.429807153847318710, - 0.902838279994502830, -0.429980278822840620, 0.902755815711756120, - -0.430153387989216870, - 0.902673318237258830, -0.430326481340082610, 0.902590787574043870, - -0.430499558869073820, - 0.902508223725145940, -0.430672620569826800, 0.902425626693600380, - -0.430845666435978660, - 0.902342996482444200, -0.431018696461167030, 0.902260333094715540, - -0.431191710639029950, - 0.902177636533453620, -0.431364708963206330, 0.902094906801698900, - -0.431537691427335500, - 0.902012143902493180, -0.431710658025057260, 0.901929347838879460, - -0.431883608750012250, - 0.901846518613901750, -0.432056543595841500, 0.901763656230605730, - -0.432229462556186720, - 0.901680760692037730, -0.432402365624690140, 0.901597832001245660, - -0.432575252794994650, - 0.901514870161278740, -0.432748124060743700, 0.901431875175186970, - -0.432920979415581280, - 0.901348847046022030, -0.433093818853151960, 0.901265785776836580, - -0.433266642367100940, - 0.901182691370684520, -0.433439449951074090, 0.901099563830620950, - -0.433612241598717580, - 0.901016403159702330, -0.433785017303678520, 0.900933209360986200, - -0.433957777059604420, - 0.900849982437531450, -0.434130520860143310, 0.900766722392397860, - -0.434303248698943990, - 0.900683429228646970, -0.434475960569655650, 0.900600102949340900, - -0.434648656465928320, - 0.900516743557543520, -0.434821336381412290, 0.900433351056319830, - -0.434994000309758710, - 0.900349925448735600, -0.435166648244619260, 0.900266466737858480, - -0.435339280179646070, - 0.900182974926756810, -0.435511896108492000, 0.900099450018500450, - -0.435684496024810460, - 0.900015892016160280, -0.435857079922255470, 0.899932300922808510, - -0.436029647794481560, - 0.899848676741518580, -0.436202199635143950, 0.899765019475365140, - -0.436374735437898340, - 0.899681329127423930, -0.436547255196401200, 0.899597605700772180, - -0.436719758904309360, - 0.899513849198487980, -0.436892246555280360, 0.899430059623650860, - -0.437064718142972370, - 0.899346236979341570, -0.437237173661044090, 0.899262381268642000, - -0.437409613103154790, - 0.899178492494635330, -0.437582036462964400, 0.899094570660405770, - -0.437754443734133410, - 0.899010615769039070, -0.437926834910322860, 0.898926627823621870, - -0.438099209985194470, - 0.898842606827242370, -0.438271568952410430, 0.898758552782989440, - -0.438443911805633690, - 0.898674465693953820, -0.438616238538527660, 0.898590345563227030, - -0.438788549144756290, - 0.898506192393901950, -0.438960843617984320, 0.898422006189072530, - -0.439133121951876930, - 0.898337786951834310, -0.439305384140099950, 0.898253534685283570, - -0.439477630176319800, - 0.898169249392518080, -0.439649860054203480, 0.898084931076636780, - -0.439822073767418500, - 0.898000579740739880, -0.439994271309633260, 0.897916195387928660, - -0.440166452674516320, - 0.897831778021305650, -0.440338617855737250, 0.897747327643974690, - -0.440510766846965940, - 0.897662844259040860, -0.440682899641872900, 0.897578327869610230, - -0.440855016234129430, - 0.897493778478790310, -0.441027116617407230, 0.897409196089689720, - -0.441199200785378660, - 0.897324580705418320, -0.441371268731716670, 0.897239932329087160, - -0.441543320450094870, - 0.897155250963808550, -0.441715355934187310, 0.897070536612695870, - -0.441887375177668850, - 0.896985789278863970, -0.442059378174214700, 0.896901008965428790, - -0.442231364917500980, - 0.896816195675507300, -0.442403335401204080, 0.896731349412217880, - -0.442575289619001170, - 0.896646470178680150, -0.442747227564570020, 0.896561557978014960, - -0.442919149231588980, - 0.896476612813344120, -0.443091054613736880, 0.896391634687790820, - -0.443262943704693320, - 0.896306623604479550, -0.443434816498138480, 0.896221579566536030, - -0.443606672987752970, - 0.896136502577086770, -0.443778513167218220, 0.896051392639260150, - -0.443950337030216140, - 0.895966249756185220, -0.444122144570429200, 0.895881073930992370, - -0.444293935781540580, - 0.895795865166813530, -0.444465710657234000, 0.895710623466781320, - -0.444637469191193790, - 0.895625348834030110, -0.444809211377104880, 0.895540041271694950, - -0.444980937208652730, - 0.895454700782912450, -0.445152646679523640, 0.895369327370820310, - -0.445324339783404190, - 0.895283921038557580, -0.445496016513981740, 0.895198481789264200, - -0.445667676864944300, - 0.895113009626081760, -0.445839320829980290, 0.895027504552152630, - -0.446010948402778940, - 0.894941966570620750, -0.446182559577030070, 0.894856395684631050, - -0.446354154346423840, - 0.894770791897329550, -0.446525732704651350, 0.894685155211863980, - -0.446697294645404090, - 0.894599485631382700, -0.446868840162374160, 0.894513783159035620, - -0.447040369249254440, - 0.894428047797973800, -0.447211881899738320, 0.894342279551349480, - -0.447383378107519600, - 0.894256478422316040, -0.447554857866293010, 0.894170644414028270, - -0.447726321169753580, - 0.894084777529641990, -0.447897768011597310, 0.893998877772314240, - -0.448069198385520400, - 0.893912945145203250, -0.448240612285219890, 0.893826979651468620, - -0.448412009704393430, - 0.893740981294271040, -0.448583390636739240, 0.893654950076772540, - -0.448754755075955970, - 0.893568886002135910, -0.448926103015743260, 0.893482789073525850, - -0.449097434449801050, - 0.893396659294107720, -0.449268749371829920, 0.893310496667048200, - -0.449440047775531150, - 0.893224301195515320, -0.449611329654606540, 0.893138072882678320, - -0.449782595002758690, - 0.893051811731707450, -0.449953843813690520, 0.892965517745774370, - -0.450125076081105690, - 0.892879190928051680, -0.450296291798708610, 0.892792831281713610, - -0.450467490960204110, - 0.892706438809935390, -0.450638673559297600, 0.892620013515893150, - -0.450809839589695280, - 0.892533555402764580, -0.450980989045103860, 0.892447064473728680, - -0.451152121919230600, - 0.892360540731965360, -0.451323238205783520, 0.892273984180655840, - -0.451494337898471100, - 0.892187394822982480, -0.451665420991002490, 0.892100772662129060, - -0.451836487477087490, - 0.892014117701280470, -0.452007537350436420, 0.891927429943622510, - -0.452178570604760350, - 0.891840709392342720, -0.452349587233770890, 0.891753956050629460, - -0.452520587231180050, - 0.891667169921672280, -0.452691570590700920, 0.891580351008662290, - -0.452862537306046750, - 0.891493499314791380, -0.453033487370931580, 0.891406614843252900, - -0.453204420779070190, - 0.891319697597241390, -0.453375337524177750, 0.891232747579952520, - -0.453546237599970090, - 0.891145764794583180, -0.453717121000163870, 0.891058749244331590, - -0.453887987718476050, - 0.890971700932396860, -0.454058837748624430, 0.890884619861979530, - -0.454229671084327320, - 0.890797506036281490, -0.454400487719303580, 0.890710359458505630, - -0.454571287647272950, - 0.890623180131855930, -0.454742070861955450, 0.890535968059537830, - -0.454912837357071940, - 0.890448723244757880, -0.455083587126343840, 0.890361445690723840, - -0.455254320163493100, - 0.890274135400644600, -0.455425036462242360, 0.890186792377730240, - -0.455595736016314980, - 0.890099416625192320, -0.455766418819434640, 0.890012008146243260, - -0.455937084865326030, - 0.889924566944096720, -0.456107734147714110, 0.889837093021967900, - -0.456278366660324620, - 0.889749586383072780, -0.456448982396883920, 0.889662047030628900, - -0.456619581351118910, - 0.889574474967854580, -0.456790163516757160, 0.889486870197969900, - -0.456960728887526980, - 0.889399232724195520, -0.457131277457156980, 0.889311562549753850, - -0.457301809219376630, - 0.889223859677868210, -0.457472324167916060, 0.889136124111763240, - -0.457642822296505770, - 0.889048355854664570, -0.457813303598877170, 0.888960554909799310, - -0.457983768068762120, - 0.888872721280395630, -0.458154215699893060, 0.888784854969682850, - -0.458324646486003240, - 0.888696955980891600, -0.458495060420826270, 0.888609024317253860, - -0.458665457498096560, - 0.888521059982002260, -0.458835837711549120, 0.888433062978371320, - -0.459006201054919630, - 0.888345033309596350, -0.459176547521944090, 0.888256970978913870, - -0.459346877106359630, - 0.888168875989561730, -0.459517189801903480, 0.888080748344778900, - -0.459687485602313870, - 0.887992588047805560, -0.459857764501329540, 0.887904395101883240, - -0.460028026492689650, - 0.887816169510254440, -0.460198271570134320, 0.887727911276163020, - -0.460368499727404010, - 0.887639620402853930, -0.460538710958240010, 0.887551296893573370, - -0.460708905256384080, - 0.887462940751568840, -0.460879082615578690, 0.887374551980088850, - -0.461049243029566900, - 0.887286130582383150, -0.461219386492092380, 0.887197676561702900, - -0.461389512996899450, - 0.887109189921300170, -0.461559622537733080, 0.887020670664428360, - -0.461729715108338770, - 0.886932118794342190, -0.461899790702462730, 0.886843534314297410, - -0.462069849313851750, - 0.886754917227550840, -0.462239890936253340, 0.886666267537361000, - -0.462409915563415430, - 0.886577585246987040, -0.462579923189086810, 0.886488870359689600, - -0.462749913807016740, - 0.886400122878730600, -0.462919887410955080, 0.886311342807372780, - -0.463089843994652530, - 0.886222530148880640, -0.463259783551860150, 0.886133684906519340, - -0.463429706076329830, - 0.886044807083555600, -0.463599611561814010, 0.885955896683257030, - -0.463769500002065630, - 0.885866953708892790, -0.463939371390838520, 0.885777978163732940, - -0.464109225721886950, - 0.885688970051048960, -0.464279062988965760, 0.885599929374113360, - -0.464448883185830660, - 0.885510856136199950, -0.464618686306237820, 0.885421750340583680, - -0.464788472343943990, - 0.885332611990540590, -0.464958241292706690, 0.885243441089348270, - -0.465127993146283950, - 0.885154237640285110, -0.465297727898434600, 0.885065001646630930, - -0.465467445542917800, - 0.884975733111666660, -0.465637146073493660, 0.884886432038674560, - -0.465806829483922710, - 0.884797098430937790, -0.465976495767966180, 0.884707732291741040, - -0.466146144919385890, - 0.884618333624369920, -0.466315776931944430, 0.884528902432111460, - -0.466485391799404900, - 0.884439438718253810, -0.466654989515530920, 0.884349942486086120, - -0.466824570074086950, - 0.884260413738899190, -0.466994133468838000, 0.884170852479984500, - -0.467163679693549770, - 0.884081258712634990, -0.467333208741988420, 0.883991632440144890, - -0.467502720607920920, - 0.883901973665809470, -0.467672215285114770, 0.883812282392925090, - -0.467841692767338170, - 0.883722558624789660, -0.468011153048359830, 0.883632802364701870, - -0.468180596121949290, - 0.883543013615961880, -0.468350021981876530, 0.883453192381870920, - -0.468519430621912310, - 0.883363338665731580, -0.468688822035827900, 0.883273452470847430, - -0.468858196217395330, - 0.883183533800523390, -0.469027553160387130, 0.883093582658065370, - -0.469196892858576580, - 0.883003599046780830, -0.469366215305737520, 0.882913582969978020, - -0.469535520495644450, - 0.882823534430966620, -0.469704808422072460, 0.882733453433057650, - -0.469874079078797360, - 0.882643339979562790, -0.470043332459595620, 0.882553194073795510, - -0.470212568558244170, - 0.882463015719070150, -0.470381787368520650, 0.882372804918702290, - -0.470550988884203550, - 0.882282561676008710, -0.470720173099071600, 0.882192285994307430, - -0.470889340006904520, - 0.882101977876917580, -0.471058489601482500, 0.882011637327159590, - -0.471227621876586340, - 0.881921264348355050, -0.471396736825997640, 0.881830858943826620, - -0.471565834443498420, - 0.881740421116898320, -0.471734914722871430, 0.881649950870895260, - -0.471903977657900210, - 0.881559448209143780, -0.472073023242368660, 0.881468913134971440, - -0.472242051470061490, - 0.881378345651706920, -0.472411062334764040, 0.881287745762680100, - -0.472580055830262250, - 0.881197113471222090, -0.472749031950342790, 0.881106448780665130, - -0.472917990688792760, - 0.881015751694342870, -0.473086932039400050, 0.880925022215589880, - -0.473255855995953320, - 0.880834260347742040, -0.473424762552241530, 0.880743466094136340, - -0.473593651702054530, - 0.880652639458111010, -0.473762523439182850, 0.880561780443005700, - -0.473931377757417450, - 0.880470889052160750, -0.474100214650549970, 0.880379965288918150, - -0.474269034112372980, - 0.880289009156621010, -0.474437836136679230, 0.880198020658613190, - -0.474606620717262560, - 0.880106999798240360, -0.474775387847917120, 0.880015946578849070, - -0.474944137522437800, - 0.879924861003786860, -0.475112869734620300, 0.879833743076402940, - -0.475281584478260740, - 0.879742592800047410, -0.475450281747155870, 0.879651410178071580, - -0.475618961535103300, - 0.879560195213827890, -0.475787623835901120, 0.879468947910670210, - -0.475956268643348060, - 0.879377668271953290, -0.476124895951243580, 0.879286356301033250, - -0.476293505753387690, - 0.879195012001267480, -0.476462098043581190, 0.879103635376014330, - -0.476630672815625320, - 0.879012226428633530, -0.476799230063322090, 0.878920785162485840, - -0.476967769780474170, - 0.878829311580933360, -0.477136291960884810, 0.878737805687339390, - -0.477304796598357890, - 0.878646267485068130, -0.477473283686698060, 0.878554696977485450, - -0.477641753219710470, - 0.878463094167957870, -0.477810205191200990, 0.878371459059853480, - -0.477978639594976160, - 0.878279791656541580, -0.478147056424843010, 0.878188091961392250, - -0.478315455674609480, - 0.878096359977777130, -0.478483837338083970, 0.878004595709069080, - -0.478652201409075500, - 0.877912799158641840, -0.478820547881393890, 0.877820970329870500, - -0.478988876748849490, - 0.877729109226131570, -0.479157188005253310, 0.877637215850802230, - -0.479325481644417070, - 0.877545290207261350, -0.479493757660153010, 0.877453332298888560, - -0.479662016046274180, - 0.877361342129065140, -0.479830256796594190, 0.877269319701173170, - -0.479998479904927280, - 0.877177265018595940, -0.480166685365088390, 0.877085178084718420, - -0.480334873170893020, - 0.876993058902925890, -0.480503043316157510, 0.876900907476605650, - -0.480671195794698640, - 0.876808723809145650, -0.480839330600333960, 0.876716507903935400, - -0.481007447726881590, - 0.876624259764365310, -0.481175547168160300, 0.876531979393827100, - -0.481343628917989710, - 0.876439666795713610, -0.481511692970189860, 0.876347321973419020, - -0.481679739318581490, - 0.876254944930338510, -0.481847767956986030, 0.876162535669868460, - -0.482015778879225590, - 0.876070094195406600, -0.482183772079122720, 0.875977620510351770, - -0.482351747550500980, - 0.875885114618103810, -0.482519705287184350, 0.875792576522063880, - -0.482687645282997460, - 0.875700006225634600, -0.482855567531765670, 0.875607403732219350, - -0.483023472027314880, - 0.875514769045222850, -0.483191358763471860, 0.875422102168050940, - -0.483359227734063810, - 0.875329403104110890, -0.483527078932918740, 0.875236671856810870, - -0.483694912353865140, - 0.875143908429560360, -0.483862727990732270, 0.875051112825769970, - -0.484030525837350010, - 0.874958285048851650, -0.484198305887549030, 0.874865425102218320, - -0.484366068135160420, - 0.874772532989284150, -0.484533812574016180, 0.874679608713464510, - -0.484701539197948670, - 0.874586652278176110, -0.484869248000791060, 0.874493663686836560, - -0.485036938976377290, - 0.874400642942864790, -0.485204612118541820, 0.874307590049680950, - -0.485372267421119770, - 0.874214505010706300, -0.485539904877946960, 0.874121387829363330, - -0.485707524482859750, - 0.874028238509075740, -0.485875126229695250, 0.873935057053268240, - -0.486042710112291330, - 0.873841843465366860, -0.486210276124486420, 0.873748597748798870, - -0.486377824260119440, - 0.873655319906992630, -0.486545354513030270, 0.873562009943377850, - -0.486712866877059170, - 0.873468667861384880, -0.486880361346047340, 0.873375293664446000, - -0.487047837913836380, - 0.873281887355994210, -0.487215296574268760, 0.873188448939463790, - -0.487382737321187360, - 0.873094978418290090, -0.487550160148436000, 0.873001475795909920, - -0.487717565049858800, - 0.872907941075761080, -0.487884952019301040, 0.872814374261282390, - -0.488052321050608250, - 0.872720775355914300, -0.488219672137626790, 0.872627144363097960, - -0.488387005274203530, - 0.872533481286276170, -0.488554320454186180, 0.872439786128892280, - -0.488721617671423080, - 0.872346058894391540, -0.488888896919763170, 0.872252299586219860, - -0.489056158193056030, - 0.872158508207824480, -0.489223401485151980, 0.872064684762653860, - -0.489390626789901920, - 0.871970829254157810, -0.489557834101157440, 0.871876941685786890, - -0.489725023412770910, - 0.871783022060993120, -0.489892194718595190, 0.871689070383229740, - -0.490059348012483850, - 0.871595086655950980, -0.490226483288291160, 0.871501070882612530, - -0.490393600539871970, - 0.871407023066670950, -0.490560699761082020, 0.871312943211584030, - -0.490727780945777400, - 0.871218831320811020, -0.490894844087815090, 0.871124687397811900, - -0.491061889181052650, - 0.871030511446048260, -0.491228916219348280, 0.870936303468982760, - -0.491395925196560780, - 0.870842063470078980, -0.491562916106549900, 0.870747791452801790, - -0.491729888943175760, - 0.870653487420617430, -0.491896843700299290, 0.870559151376993250, - -0.492063780371782000, - 0.870464783325397670, -0.492230698951486020, 0.870370383269300270, - -0.492397599433274380, - 0.870275951212171940, -0.492564481811010590, 0.870181487157484560, - -0.492731346078558840, - 0.870086991108711460, -0.492898192229784040, 0.869992463069326870, - -0.493065020258551700, - 0.869897903042806340, -0.493231830158727900, 0.869803311032626650, - -0.493398621924179770, - 0.869708687042265670, -0.493565395548774770, 0.869614031075202300, - -0.493732151026381020, - 0.869519343134916860, -0.493898888350867480, 0.869424623224890890, - -0.494065607516103570, - 0.869329871348606840, -0.494232308515959670, 0.869235087509548370, - -0.494398991344306650, - 0.869140271711200560, -0.494565655995015950, 0.869045423957049530, - -0.494732302461959870, - 0.868950544250582380, -0.494898930739011260, 0.868855632595287860, - -0.495065540820043560, - 0.868760688994655310, -0.495232132698931180, 0.868665713452175690, - -0.495398706369549020, - 0.868570705971340900, -0.495565261825772540, 0.868475666555644120, - -0.495731799061477960, - 0.868380595208579800, -0.495898318070542190, 0.868285491933643350, - -0.496064818846842890, - 0.868190356734331310, -0.496231301384258250, 0.868095189614141670, - -0.496397765676667160, - 0.867999990576573510, -0.496564211717949290, 0.867904759625126920, - -0.496730639501984760, - 0.867809496763303320, -0.496897049022654470, 0.867714201994605140, - -0.497063440273840250, - 0.867618875322536230, -0.497229813249424220, 0.867523516750601460, - -0.497396167943289280, - 0.867428126282306920, -0.497562504349319150, 0.867332703921159800, - -0.497728822461397940, - 0.867237249670668400, -0.497895122273410870, 0.867141763534342470, - -0.498061403779243410, - 0.867046245515692650, -0.498227666972781870, 0.866950695618230900, - -0.498393911847913210, - 0.866855113845470430, -0.498560138398525140, 0.866759500200925400, - -0.498726346618505900, - 0.866663854688111130, -0.498892536501744590, 0.866568177310544470, - -0.499058708042130870, - 0.866472468071743050, -0.499224861233555080, 0.866376726975225830, - -0.499390996069908170, - 0.866280954024512990, -0.499557112545081840, 0.866185149223125840, - -0.499723210652968540, - 0.866089312574586770, -0.499889290387461330, 0.865993444082419520, - -0.500055351742453860, - 0.865897543750148820, -0.500221394711840680, 0.865801611581300760, - -0.500387419289516580, - 0.865705647579402380, -0.500553425469377420, 0.865609651747981990, - -0.500719413245319880, - 0.865513624090569090, -0.500885382611240710, 0.865417564610694410, - -0.501051333561038040, - 0.865321473311889800, -0.501217266088609950, 0.865225350197688200, - -0.501383180187855770, - 0.865129195271623800, -0.501549075852675390, 0.865033008537231860, - -0.501714953076969120, - 0.864936789998049020, -0.501880811854638290, 0.864840539657612870, - -0.502046652179584660, - 0.864744257519462380, -0.502212474045710790, 0.864647943587137480, - -0.502378277446919760, - 0.864551597864179340, -0.502544062377115690, 0.864455220354130360, - -0.502709828830202990, - 0.864358811060534030, -0.502875576800086990, 0.864262369986934950, - -0.503041306280673450, - 0.864165897136879300, -0.503207017265868920, 0.864069392513913790, - -0.503372709749581040, - 0.863972856121586810, -0.503538383725717580, 0.863876287963447510, - -0.503704039188187070, - 0.863779688043046720, -0.503869676130898950, 0.863683056363935830, - -0.504035294547763190, - 0.863586392929668100, -0.504200894432690340, 0.863489697743797140, - -0.504366475779592040, - 0.863392970809878420, -0.504532038582380270, 0.863296212131468230, - -0.504697582834967570, - 0.863199421712124160, -0.504863108531267590, 0.863102599555404910, - -0.505028615665194080, - 0.863005745664870320, -0.505194104230662240, 0.862908860044081400, - -0.505359574221587280, - 0.862811942696600330, -0.505525025631885390, 0.862714993625990690, - -0.505690458455473450, - 0.862618012835816740, -0.505855872686268860, 0.862521000329644520, - -0.506021268318189720, - 0.862423956111040610, -0.506186645345155230, 0.862326880183573060, - -0.506352003761084800, - 0.862229772550811240, -0.506517343559898530, 0.862132633216325380, - -0.506682664735517600, - 0.862035462183687210, -0.506847967281863210, 0.861938259456469290, - -0.507013251192858230, - 0.861841025038245330, -0.507178516462425180, 0.861743758932590700, - -0.507343763084487920, - 0.861646461143081300, -0.507508991052970870, 0.861549131673294720, - -0.507674200361798890, - 0.861451770526809320, -0.507839391004897720, 0.861354377707204910, - -0.508004562976194010, - 0.861256953218062170, -0.508169716269614600, 0.861159497062963350, - -0.508334850879087360, - 0.861062009245491480, -0.508499966798540930, 0.860964489769231010, - -0.508665064021904030, - 0.860866938637767310, -0.508830142543106990, 0.860769355854687170, - -0.508995202356080090, - 0.860671741423578380, -0.509160243454754640, 0.860574095348029980, - -0.509325265833062480, - 0.860476417631632070, -0.509490269484936360, 0.860378708277976130, - -0.509655254404309250, - 0.860280967290654510, -0.509820220585115450, 0.860183194673260990, - -0.509985168021289460, - 0.860085390429390140, -0.510150096706766810, 0.859987554562638200, - -0.510315006635483240, - 0.859889687076602290, -0.510479897801375700, 0.859791787974880650, - -0.510644770198381610, - 0.859693857261072610, -0.510809623820439040, 0.859595894938779080, - -0.510974458661486830, - 0.859497901011601730, -0.511139274715464390, 0.859399875483143450, - -0.511304071976312000, - 0.859301818357008470, -0.511468850437970300, 0.859203729636801920, - -0.511633610094381240, - 0.859105609326130450, -0.511798350939486890, 0.859007457428601520, - -0.511963072967230200, - 0.858909273947823900, -0.512127776171554690, 0.858811058887407610, - -0.512292460546404870, - 0.858712812250963520, -0.512457126085725690, 0.858614534042104190, - -0.512621772783462990, - 0.858516224264442740, -0.512786400633562960, 0.858417882921593930, - -0.512951009629972980, - 0.858319510017173440, -0.513115599766640560, 0.858221105554798250, - -0.513280171037514220, - 0.858122669538086140, -0.513444723436543460, 0.858024201970656540, - -0.513609256957677780, - 0.857925702856129790, -0.513773771594868030, 0.857827172198127430, - -0.513938267342065380, - 0.857728610000272120, -0.514102744193221660, 0.857630016266187620, - -0.514267202142289710, - 0.857531390999499150, -0.514431641183222820, 0.857432734203832700, - -0.514596061309975040, - 0.857334045882815590, -0.514760462516501200, 0.857235326040076460, - -0.514924844796756490, - 0.857136574679244980, -0.515089208144697160, 0.857037791803951680, - -0.515253552554280180, - 0.856938977417828760, -0.515417878019462930, 0.856840131524509220, - -0.515582184534203790, - 0.856741254127627470, -0.515746472092461380, 0.856642345230818840, - -0.515910740688195650, - 0.856543404837719960, -0.516074990315366630, 0.856444432951968590, - -0.516239220967935510, - 0.856345429577203610, -0.516403432639863990, 0.856246394717065210, - -0.516567625325114350, - 0.856147328375194470, -0.516731799017649870, 0.856048230555233940, - -0.516895953711434150, - 0.855949101260826910, -0.517060089400431910, 0.855849940495618240, - -0.517224206078608310, - 0.855750748263253920, -0.517388303739929060, 0.855651524567380690, - -0.517552382378360880, - 0.855552269411646860, -0.517716441987871150, 0.855452982799701830, - -0.517880482562427690, - 0.855353664735196030, -0.518044504095999340, 0.855254315221780970, - -0.518208506582555460, - 0.855154934263109620, -0.518372490016066110, 0.855055521862835950, - -0.518536454390502220, - 0.854956078024614930, -0.518700399699834950, 0.854856602752102850, - -0.518864325938036890, - 0.854757096048957220, -0.519028233099080860, 0.854657557918836460, - -0.519192121176940250, - 0.854557988365400530, -0.519355990165589640, 0.854458387392310170, - -0.519519840059003760, - 0.854358755003227440, -0.519683670851158410, 0.854259091201815530, - -0.519847482536030190, - 0.854159395991738850, -0.520011275107596040, 0.854059669376662780, - -0.520175048559833760, - 0.853959911360254180, -0.520338802886721960, 0.853860121946180770, - -0.520502538082239670, - 0.853760301138111410, -0.520666254140367160, 0.853660448939716380, - -0.520829951055084670, - 0.853560565354666840, -0.520993628820373920, 0.853460650386635320, - -0.521157287430216610, - 0.853360704039295430, -0.521320926878595660, 0.853260726316321880, - -0.521484547159494330, - 0.853160717221390420, -0.521648148266897090, 0.853060676758178320, - -0.521811730194788550, - 0.852960604930363630, -0.521975292937154390, 0.852860501741625750, - -0.522138836487980760, - 0.852760367195645300, -0.522302360841254590, 0.852660201296103760, - -0.522465865990963780, - 0.852560004046684080, -0.522629351931096610, 0.852459775451070100, - -0.522792818655642090, - 0.852359515512947090, -0.522956266158590140, 0.852259224236001090, - -0.523119694433931250, - 0.852158901623919830, -0.523283103475656430, 0.852058547680391690, - -0.523446493277757830, - 0.851958162409106380, -0.523609863834227920, 0.851857745813754840, - -0.523773215139060170, - 0.851757297898029120, -0.523936547186248600, 0.851656818665622370, - -0.524099859969787700, - 0.851556308120228980, -0.524263153483673360, 0.851455766265544310, - -0.524426427721901400, - 0.851355193105265200, -0.524589682678468950, 0.851254588643089120, - -0.524752918347373360, - 0.851153952882715340, -0.524916134722613000, 0.851053285827843790, - -0.525079331798186780, - 0.850952587482175730, -0.525242509568094710, 0.850851857849413530, - -0.525405668026336930, - 0.850751096933260790, -0.525568807166914680, 0.850650304737422090, - -0.525731926983829760, - 0.850549481265603480, -0.525895027471084630, 0.850448626521511760, - -0.526058108622682760, - 0.850347740508854980, -0.526221170432628060, 0.850246823231342710, - -0.526384212894925100, - 0.850145874692685210, -0.526547236003579440, 0.850044894896594180, - -0.526710239752597010, - 0.849943883846782210, -0.526873224135984590, 0.849842841546963320, - -0.527036189147750080, - 0.849741768000852550, -0.527199134781901280, 0.849640663212165910, - -0.527362061032447540, - 0.849539527184620890, -0.527524967893398200, 0.849438359921936060, - -0.527687855358763720, - 0.849337161427830780, -0.527850723422555230, 0.849235931706025960, - -0.528013572078784630, - 0.849134670760243630, -0.528176401321464370, 0.849033378594206800, - -0.528339211144607690, - 0.848932055211639610, -0.528502001542228480, 0.848830700616267530, - -0.528664772508341320, - 0.848729314811817130, -0.528827524036961870, 0.848627897802015860, - -0.528990256122106040, - 0.848526449590592650, -0.529152968757790610, 0.848424970181277600, - -0.529315661938033260, - 0.848323459577801640, -0.529478335656851980, 0.848221917783896990, - -0.529640989908265910, - 0.848120344803297230, -0.529803624686294610, 0.848018740639736810, - -0.529966239984958620, - 0.847917105296951410, -0.530128835798278960, 0.847815438778677930, - -0.530291412120277310, - 0.847713741088654380, -0.530453968944976320, 0.847612012230619660, - -0.530616506266399330, - 0.847510252208314330, -0.530779024078570140, 0.847408461025479730, - -0.530941522375513620, - 0.847306638685858320, -0.531104001151255000, 0.847204785193194090, - -0.531266460399820390, - 0.847102900551231500, -0.531428900115236800, 0.847000984763716880, - -0.531591320291531670, - 0.846899037834397240, -0.531753720922733320, 0.846797059767020910, - -0.531916102002870650, - 0.846695050565337450, -0.532078463525973540, 0.846593010233097190, - -0.532240805486072220, - 0.846490938774052130, -0.532403127877197900, 0.846388836191954930, - -0.532565430693382580, - 0.846286702490559710, -0.532727713928658810, 0.846184537673621560, - -0.532889977577059800, - 0.846082341744897050, -0.533052221632619450, 0.845980114708143270, - -0.533214446089372960, - 0.845877856567119000, -0.533376650941355330, 0.845775567325584010, - -0.533538836182603120, - 0.845673246987299070, -0.533701001807152960, 0.845570895556026270, - -0.533863147809042650, - 0.845468513035528830, -0.534025274182310380, 0.845366099429570970, - -0.534187380920995380, - 0.845263654741918220, -0.534349468019137520, 0.845161178976337140, - -0.534511535470777120, - 0.845058672136595470, -0.534673583269955510, 0.844956134226462210, - -0.534835611410714560, - 0.844853565249707120, -0.534997619887097150, 0.844750965210101510, - -0.535159608693146600, - 0.844648334111417820, -0.535321577822907120, 0.844545671957429240, - -0.535483527270423370, - 0.844442978751910660, -0.535645457029741090, 0.844340254498637590, - -0.535807367094906390, - 0.844237499201387020, -0.535969257459966710, 0.844134712863936930, - -0.536131128118969460, - 0.844031895490066410, -0.536292979065963180, 0.843929047083555870, - -0.536454810294997090, - 0.843826167648186740, -0.536616621800121040, 0.843723257187741660, - -0.536778413575385920, - 0.843620315706004150, -0.536940185614842910, 0.843517343206759200, - -0.537101937912544130, - 0.843414339693792760, -0.537263670462542530, 0.843311305170892140, - -0.537425383258891550, - 0.843208239641845440, -0.537587076295645390, 0.843105143110442160, - -0.537748749566859360, - 0.843002015580472940, -0.537910403066588880, 0.842898857055729310, - -0.538072036788890600, - 0.842795667540004120, -0.538233650727821700, 0.842692447037091670, - -0.538395244877439950, - 0.842589195550786710, -0.538556819231804100, 0.842485913084885630, - -0.538718373784973560, - 0.842382599643185850, -0.538879908531008420, 0.842279255229485990, - -0.539041423463969440, - 0.842175879847585570, -0.539202918577918240, 0.842072473501285560, - -0.539364393866917040, - 0.841969036194387680, -0.539525849325028890, 0.841865567930695340, - -0.539687284946317570, - 0.841762068714012490, -0.539848700724847590, 0.841658538548144760, - -0.540010096654684020, - 0.841554977436898440, -0.540171472729892850, 0.841451385384081260, - -0.540332828944540710, - 0.841347762393501950, -0.540494165292695230, 0.841244108468970580, - -0.540655481768424150, - 0.841140423614298080, -0.540816778365796670, 0.841036707833296650, - -0.540978055078882080, - 0.840932961129779780, -0.541139311901750800, 0.840829183507561640, - -0.541300548828474120, - 0.840725374970458070, -0.541461765853123440, 0.840621535522285690, - -0.541622962969771530, - 0.840517665166862550, -0.541784140172491550, 0.840413763908007480, - -0.541945297455357360, - 0.840309831749540770, -0.542106434812443920, 0.840205868695283580, - -0.542267552237826520, - 0.840101874749058400, -0.542428649725581250, 0.839997849914688840, - -0.542589727269785270, - 0.839893794195999520, -0.542750784864515890, 0.839789707596816370, - -0.542911822503851730, - 0.839685590120966110, -0.543072840181871740, 0.839581441772277120, - -0.543233837892655890, - 0.839477262554578550, -0.543394815630284800, 0.839373052471700690, - -0.543555773388839540, - 0.839268811527475230, -0.543716711162402280, 0.839164539725734680, - -0.543877628945055980, - 0.839060237070312740, -0.544038526730883820, 0.838955903565044460, - -0.544199404513970310, - 0.838851539213765760, -0.544360262288400400, 0.838747144020313920, - -0.544521100048259600, - 0.838642717988527300, -0.544681917787634530, 0.838538261122245280, - -0.544842715500612360, - 0.838433773425308340, -0.545003493181281160, 0.838329254901558300, - -0.545164250823729320, - 0.838224705554838080, -0.545324988422046460, 0.838120125388991500, - -0.545485705970322530, - 0.838015514407863820, -0.545646403462648590, 0.837910872615301170, - -0.545807080893116140, - 0.837806200015150940, -0.545967738255817570, 0.837701496611261700, - -0.546128375544845950, - 0.837596762407483040, -0.546288992754295210, 0.837491997407665890, - -0.546449589878259650, - 0.837387201615661940, -0.546610166910834860, 0.837282375035324320, - -0.546770723846116800, - 0.837177517670507300, -0.546931260678202190, 0.837072629525066000, - -0.547091777401188530, - 0.836967710602857020, -0.547252274009174090, 0.836862760907737920, - -0.547412750496257930, - 0.836757780443567190, -0.547573206856539760, 0.836652769214204950, - -0.547733643084120090, - 0.836547727223512010, -0.547894059173100190, 0.836442654475350380, - -0.548054455117581880, - 0.836337550973583530, -0.548214830911667780, 0.836232416722075600, - -0.548375186549461600, - 0.836127251724692270, -0.548535522025067390, 0.836022055985299880, - -0.548695837332590090, - 0.835916829507766360, -0.548856132466135290, 0.835811572295960700, - -0.549016407419809390, - 0.835706284353752600, -0.549176662187719660, 0.835600965685013410, - -0.549336896763974010, - 0.835495616293615350, -0.549497111142680960, 0.835390236183431890, - -0.549657305317949870, - 0.835284825358337370, -0.549817479283890910, 0.835179383822207690, - -0.549977633034614890, - 0.835073911578919410, -0.550137766564233630, 0.834968408632350450, - -0.550297879866859190, - 0.834862874986380010, -0.550457972936604810, 0.834757310644888230, - -0.550618045767584330, - 0.834651715611756440, -0.550778098353912120, 0.834546089890866870, - -0.550938130689703880, - 0.834440433486103190, -0.551098142769075430, 0.834334746401350080, - -0.551258134586143590, - 0.834229028640493420, -0.551418106135026060, 0.834123280207420100, - -0.551578057409841000, - 0.834017501106018130, -0.551737988404707340, 0.833911691340176840, - -0.551897899113745210, - 0.833805850913786340, -0.552057789531074980, 0.833699979830738290, - -0.552217659650817930, - 0.833594078094925140, -0.552377509467096070, 0.833488145710240770, - -0.552537338974032120, - 0.833382182680579730, -0.552697148165749770, 0.833276189009838240, - -0.552856937036373290, - 0.833170164701913190, -0.553016705580027470, 0.833064109760702890, - -0.553176453790838350, - 0.832958024190106670, -0.553336181662932300, 0.832851907994025090, - -0.553495889190436570, - 0.832745761176359460, -0.553655576367479310, 0.832639583741012770, - -0.553815243188189090, - 0.832533375691888680, -0.553974889646695500, 0.832427137032892280, - -0.554134515737128910, - 0.832320867767929680, -0.554294121453620000, 0.832214567900907980, - -0.554453706790300930, - 0.832108237435735590, -0.554613271741304040, 0.832001876376321950, - -0.554772816300762470, - 0.831895484726577590, -0.554932340462810370, 0.831789062490414400, - -0.555091844221582420, - 0.831682609671745120, -0.555251327571213980, 0.831576126274483740, - -0.555410790505841630, - 0.831469612302545240, -0.555570233019602180, 0.831363067759845920, - -0.555729655106633410, - 0.831256492650303210, -0.555889056761073810, 0.831149886977835540, - -0.556048437977062600, - 0.831043250746362320, -0.556207798748739930, 0.830936583959804410, - -0.556367139070246370, - 0.830829886622083570, -0.556526458935723610, 0.830723158737122880, - -0.556685758339313890, - 0.830616400308846310, -0.556845037275160100, 0.830509611341179070, - -0.557004295737405950, - 0.830402791838047550, -0.557163533720196220, 0.830295941803379070, - -0.557322751217676160, - 0.830189061241102370, -0.557481948223991550, 0.830082150155146970, - -0.557641124733289420, - 0.829975208549443950, -0.557800280739716990, 0.829868236427924840, - -0.557959416237422960, - 0.829761233794523050, -0.558118531220556100, 0.829654200653172640, - -0.558277625683266330, - 0.829547137007808910, -0.558436699619704100, 0.829440042862368170, - -0.558595753024020760, - 0.829332918220788250, -0.558754785890368310, 0.829225763087007570, - -0.558913798212899770, - 0.829118577464965980, -0.559072789985768480, 0.829011361358604430, - -0.559231761203128900, - 0.828904114771864870, -0.559390711859136140, 0.828796837708690610, - -0.559549641947945760, - 0.828689530173025820, -0.559708551463714680, 0.828582192168815790, - -0.559867440400600210, - 0.828474823700007130, -0.560026308752760380, 0.828367424770547480, - -0.560185156514354080, - 0.828259995384385660, -0.560343983679540860, 0.828152535545471410, - -0.560502790242481060, - 0.828045045257755800, -0.560661576197336030, 0.827937524525190870, - -0.560820341538267430, - 0.827829973351729920, -0.560979086259438150, 0.827722391741327220, - -0.561137810355011420, - 0.827614779697938400, -0.561296513819151470, 0.827507137225519830, - -0.561455196646023280, - 0.827399464328029470, -0.561613858829792420, 0.827291761009425810, - -0.561772500364625340, - 0.827184027273669130, -0.561931121244689470, 0.827076263124720270, - -0.562089721464152480, - 0.826968468566541600, -0.562248301017183150, 0.826860643603096190, - -0.562406859897951140, - 0.826752788238348520, -0.562565398100626560, 0.826644902476264320, - -0.562723915619380400, - 0.826536986320809960, -0.562882412448384440, 0.826429039775953500, - -0.563040888581811230, - 0.826321062845663530, -0.563199344013834090, 0.826213055533910220, - -0.563357778738627020, - 0.826105017844664610, -0.563516192750364800, 0.825996949781899080, - -0.563674586043223070, - 0.825888851349586780, -0.563832958611378170, 0.825780722551702430, - -0.563991310449006970, - 0.825672563392221390, -0.564149641550287680, 0.825564373875120490, - -0.564307951909398640, - 0.825456154004377550, -0.564466241520519500, 0.825347903783971380, - -0.564624510377830120, - 0.825239623217882250, -0.564782758475511400, 0.825131312310091070, - -0.564940985807745210, - 0.825022971064580220, -0.565099192368713980, 0.824914599485333190, - -0.565257378152600800, - 0.824806197576334330, -0.565415543153589660, 0.824697765341569470, - -0.565573687365865330, - 0.824589302785025290, -0.565731810783613120, 0.824480809910689500, - -0.565889913401019570, - 0.824372286722551250, -0.566047995212271450, 0.824263733224600560, - -0.566206056211556730, - 0.824155149420828570, -0.566364096393063840, 0.824046535315227760, - -0.566522115750982100, - 0.823937890911791370, -0.566680114279501600, 0.823829216214513990, - -0.566838091972813320, - 0.823720511227391430, -0.566996048825108680, 0.823611775954420260, - -0.567153984830580100, - 0.823503010399598500, -0.567311899983420800, 0.823394214566925080, - -0.567469794277824510, - 0.823285388460400110, -0.567627667707986230, 0.823176532084024860, - -0.567785520268101140, - 0.823067645441801670, -0.567943351952365560, 0.822958728537734000, - -0.568101162754976460, - 0.822849781375826430, -0.568258952670131490, 0.822740803960084420, - -0.568416721692029280, - 0.822631796294514990, -0.568574469814869140, 0.822522758383125940, - -0.568732197032851050, - 0.822413690229926390, -0.568889903340175860, 0.822304591838926350, - -0.569047588731045110, - 0.822195463214137170, -0.569205253199661200, 0.822086304359571090, - -0.569362896740227220, - 0.821977115279241550, -0.569520519346947140, 0.821867895977163250, - -0.569678121014025600, - 0.821758646457351750, -0.569835701735668000, 0.821649366723823940, - -0.569993261506080540, - 0.821540056780597610, -0.570150800319470300, 0.821430716631691870, - -0.570308318170044900, - 0.821321346281126740, -0.570465815052012990, 0.821211945732923550, - -0.570623290959583750, - 0.821102514991104650, -0.570780745886967260, 0.820993054059693580, - -0.570938179828374360, - 0.820883562942714580, -0.571095592778016690, 0.820774041644193650, - -0.571252984730106660, - 0.820664490168157460, -0.571410355678857230, 0.820554908518633890, - -0.571567705618482580, - 0.820445296699652050, -0.571725034543197120, 0.820335654715241840, - -0.571882342447216590, - 0.820225982569434690, -0.572039629324757050, 0.820116280266262820, - -0.572196895170035580, - 0.820006547809759680, -0.572354139977269920, 0.819896785203959810, - -0.572511363740678790, - 0.819786992452898990, -0.572668566454481160, 0.819677169560613870, - -0.572825748112897550, - 0.819567316531142230, -0.572982908710148560, 0.819457433368523280, - -0.573140048240455950, - 0.819347520076796900, -0.573297166698042200, 0.819237576660004520, - -0.573454264077130400, - 0.819127603122188240, -0.573611340371944610, 0.819017599467391500, - -0.573768395576709560, - 0.818907565699658950, -0.573925429685650750, 0.818797501823036010, - -0.574082442692994470, - 0.818687407841569680, -0.574239434592967890, 0.818577283759307610, - -0.574396405379798750, - 0.818467129580298660, -0.574553355047715760, 0.818356945308593150, - -0.574710283590948330, - 0.818246730948242070, -0.574867191003726740, 0.818136486503297730, - -0.575024077280281710, - 0.818026211977813440, -0.575180942414845080, 0.817915907375843850, - -0.575337786401649450, - 0.817805572701444270, -0.575494609234928120, 0.817695207958671680, - -0.575651410908915140, - 0.817584813151583710, -0.575808191417845340, 0.817474388284239240, - -0.575964950755954220, - 0.817363933360698460, -0.576121688917478280, 0.817253448385022340, - -0.576278405896654910, - 0.817142933361272970, -0.576435101687721830, 0.817032388293513880, - -0.576591776284917760, - 0.816921813185809480, -0.576748429682482410, 0.816811208042225290, - -0.576905061874655960, - 0.816700572866827850, -0.577061672855679440, 0.816589907663684890, - -0.577218262619794920, - 0.816479212436865390, -0.577374831161244880, 0.816368487190439200, - -0.577531378474272720, - 0.816257731928477390, -0.577687904553122800, 0.816146946655052270, - -0.577844409392039850, - 0.816036131374236810, -0.578000892985269910, 0.815925286090105510, - -0.578157355327059360, - 0.815814410806733780, -0.578313796411655590, 0.815703505528198260, - -0.578470216233306630, - 0.815592570258576790, -0.578626614786261430, 0.815481605001947770, - -0.578782992064769690, - 0.815370609762391290, -0.578939348063081780, 0.815259584543988280, - -0.579095682775449090, - 0.815148529350820830, -0.579251996196123550, 0.815037444186972220, - -0.579408288319357870, - 0.814926329056526620, -0.579564559139405630, 0.814815183963569440, - -0.579720808650521450, - 0.814704008912187080, -0.579877036846960350, 0.814592803906467270, - -0.580033243722978150, - 0.814481568950498610, -0.580189429272831680, 0.814370304048371070, - -0.580345593490778300, - 0.814259009204175270, -0.580501736371076490, 0.814147684422003360, - -0.580657857907985300, - 0.814036329705948410, -0.580813958095764530, 0.813924945060104600, - -0.580970036928674770, - 0.813813530488567190, -0.581126094400977620, 0.813702085995432700, - -0.581282130506935000, - 0.813590611584798510, -0.581438145240810170, 0.813479107260763220, - -0.581594138596866930, - 0.813367573027426570, -0.581750110569369650, 0.813256008888889380, - -0.581906061152583810, - 0.813144414849253590, -0.582061990340775440, 0.813032790912622040, - -0.582217898128211670, - 0.812921137083098770, -0.582373784509160110, 0.812809453364789270, - -0.582529649477889320, - 0.812697739761799490, -0.582685493028668460, 0.812585996278237130, - -0.582841315155767650, - 0.812474222918210480, -0.582997115853457700, 0.812362419685829230, - -0.583152895116010430, - 0.812250586585203880, -0.583308652937698290, 0.812138723620446480, - -0.583464389312794320, - 0.812026830795669730, -0.583620104235572760, 0.811914908114987790, - -0.583775797700308070, - 0.811802955582515470, -0.583931469701276180, 0.811690973202369050, - -0.584087120232753440, - 0.811578960978665890, -0.584242749289016980, 0.811466918915524250, - -0.584398356864344600, - 0.811354847017063730, -0.584553942953015330, 0.811242745287404810, - -0.584709507549308390, - 0.811130613730669190, -0.584865050647504490, 0.811018452350979470, - -0.585020572241884530, - 0.810906261152459670, -0.585176072326730410, 0.810794040139234730, - -0.585331550896324940, - 0.810681789315430780, -0.585487007944951340, 0.810569508685174630, - -0.585642443466894420, - 0.810457198252594770, -0.585797857456438860, 0.810344858021820550, - -0.585953249907870570, - 0.810232487996982330, -0.586108620815476430, 0.810120088182211600, - -0.586263970173543590, - 0.810007658581641140, -0.586419297976360500, 0.809895199199404450, - -0.586574604218216170, - 0.809782710039636530, -0.586729888893400390, 0.809670191106473090, - -0.586885151996203950, - 0.809557642404051260, -0.587040393520917970, 0.809445063936509170, - -0.587195613461834800, - 0.809332455707985950, -0.587350811813247660, 0.809219817722621750, - -0.587505988569450020, - 0.809107149984558240, -0.587661143724736660, 0.808994452497937670, - -0.587816277273402910, - 0.808881725266903610, -0.587971389209745010, 0.808768968295600850, - -0.588126479528059850, - 0.808656181588174980, -0.588281548222645220, 0.808543365148773010, - -0.588436595287799790, - 0.808430518981542720, -0.588591620717822890, 0.808317643090633250, - -0.588746624507014540, - 0.808204737480194720, -0.588901606649675720, 0.808091802154378370, - -0.589056567140108460, - 0.807978837117336310, -0.589211505972614960, 0.807865842373222120, - -0.589366423141498790, - 0.807752817926190360, -0.589521318641063940, 0.807639763780396480, - -0.589676192465615420, - 0.807526679939997160, -0.589831044609458790, 0.807413566409150190, - -0.589985875066900920, - 0.807300423192014450, -0.590140683832248820, 0.807187250292749960, - -0.590295470899810830, - 0.807074047715517610, -0.590450236263895810, 0.806960815464479730, - -0.590604979918813330, - 0.806847553543799330, -0.590759701858874160, 0.806734261957640860, - -0.590914402078389520, - 0.806620940710169650, -0.591069080571671400, 0.806507589805552260, - -0.591223737333032910, - 0.806394209247956240, -0.591378372356787580, 0.806280799041550480, - -0.591532985637249990, - 0.806167359190504420, -0.591687577168735430, 0.806053889698989060, - -0.591842146945560140, - 0.805940390571176280, -0.591996694962040990, 0.805826861811239300, - -0.592151221212495530, - 0.805713303423352230, -0.592305725691242290, 0.805599715411690060, - -0.592460208392600830, - 0.805486097780429230, -0.592614669310891130, 0.805372450533747060, - -0.592769108440434070, - 0.805258773675822210, -0.592923525775551300, 0.805145067210834230, - -0.593077921310565470, - 0.805031331142963660, -0.593232295039799800, 0.804917565476392260, - -0.593386646957578480, - 0.804803770215302920, -0.593540977058226390, 0.804689945363879500, - -0.593695285336069190, - 0.804576090926307110, -0.593849571785433630, 0.804462206906771840, - -0.594003836400646690, - 0.804348293309460780, -0.594158079176036800, 0.804234350138562260, - -0.594312300105932830, - 0.804120377398265810, -0.594466499184664430, 0.804006375092761520, - -0.594620676406562240, - 0.803892343226241260, -0.594774831765957580, 0.803778281802897570, - -0.594928965257182420, - 0.803664190826924090, -0.595083076874569960, 0.803550070302515680, - -0.595237166612453850, - 0.803435920233868120, -0.595391234465168730, 0.803321740625178580, - -0.595545280427049790, - 0.803207531480644940, -0.595699304492433360, 0.803093292804466400, - -0.595853306655656280, - 0.802979024600843250, -0.596007286911056530, 0.802864726873976700, - -0.596161245252972540, - 0.802750399628069160, -0.596315181675743710, 0.802636042867324150, - -0.596469096173710360, - 0.802521656595946430, -0.596622988741213220, 0.802407240818141300, - -0.596776859372594390, - 0.802292795538115720, -0.596930708062196500, 0.802178320760077450, - -0.597084534804362740, - 0.802063816488235440, -0.597238339593437420, 0.801949282726799770, - -0.597392122423765710, - 0.801834719479981310, -0.597545883289693160, 0.801720126751992330, - -0.597699622185566830, - 0.801605504547046150, -0.597853339105733910, 0.801490852869356950, - -0.598007034044542700, - 0.801376171723140240, -0.598160706996342270, 0.801261461112612540, - -0.598314357955482600, - 0.801146721041991360, -0.598467986916314310, 0.801031951515495330, - -0.598621593873188920, - 0.800917152537344300, -0.598775178820458720, 0.800802324111759110, - -0.598928741752476900, - 0.800687466242961610, -0.599082282663597310, 0.800572578935174860, - -0.599235801548174570, - 0.800457662192622820, -0.599389298400564540, 0.800342716019530660, - -0.599542773215123390, - 0.800227740420124790, -0.599696225986208310, 0.800112735398632370, - -0.599849656708177250, - 0.799997700959281910, -0.600003065375388940, 0.799882637106302810, - -0.600156451982203240, - 0.799767543843925680, -0.600309816522980430, 0.799652421176382240, - -0.600463158992081580, - 0.799537269107905010, -0.600616479383868970, 0.799422087642728040, - -0.600769777692705230, - 0.799306876785086160, -0.600923053912954090, 0.799191636539215210, - -0.601076308038980160, - 0.799076366909352350, -0.601229540065148500, 0.798961067899735760, - -0.601382749985825420, - 0.798845739514604580, -0.601535937795377730, 0.798730381758199210, - -0.601689103488172950, - 0.798614994634760820, -0.601842247058580030, 0.798499578148532120, - -0.601995368500968020, - 0.798384132303756380, -0.602148467809707210, 0.798268657104678430, - -0.602301544979168550, - 0.798153152555543750, -0.602454600003723750, 0.798037618660599410, - -0.602607632877745440, - 0.797922055424093000, -0.602760643595607220, 0.797806462850273570, - -0.602913632151683030, - 0.797690840943391160, -0.603066598540348160, 0.797575189707696700, - -0.603219542755978440, - 0.797459509147442460, -0.603372464792950260, 0.797343799266881700, - -0.603525364645641550, - 0.797228060070268700, -0.603678242308430370, 0.797112291561858920, - -0.603831097775695880, - 0.796996493745908750, -0.603983931041818020, 0.796880666626675780, - -0.604136742101177520, - 0.796764810208418830, -0.604289530948155960, 0.796648924495397260, - -0.604442297577135860, - 0.796533009491872000, -0.604595041982500360, 0.796417065202104980, - -0.604747764158633410, - 0.796301091630359110, -0.604900464099919820, 0.796185088780898440, - -0.605053141800745320, - 0.796069056657987990, -0.605205797255496500, 0.795952995265893910, - -0.605358430458560530, - 0.795836904608883570, -0.605511041404325550, 0.795720784691225090, - -0.605663630087180380, - 0.795604635517188070, -0.605816196501514970, 0.795488457091042990, - -0.605968740641719680, - 0.795372249417061310, -0.606121262502186120, 0.795256012499515610, - -0.606273762077306430, - 0.795139746342679590, -0.606426239361473550, 0.795023450950828050, - -0.606578694349081290, - 0.794907126328237010, -0.606731127034524480, 0.794790772479183170, - -0.606883537412198470, - 0.794674389407944550, -0.607035925476499650, 0.794557977118800380, - -0.607188291221825160, - 0.794441535616030590, -0.607340634642572930, 0.794325064903916520, - -0.607492955733141550, - 0.794208564986740640, -0.607645254487930830, 0.794092035868785960, - -0.607797530901341140, - 0.793975477554337170, -0.607949784967773630, 0.793858890047679730, - -0.608102016681630440, - 0.793742273353100210, -0.608254226037314490, 0.793625627474886300, - -0.608406413029229150, - 0.793508952417326660, -0.608558577651779450, 0.793392248184711100, - -0.608710719899370310, - 0.793275514781330630, -0.608862839766408200, 0.793158752211477140, - -0.609014937247299830, - 0.793041960479443640, -0.609167012336453210, 0.792925139589524260, - -0.609319065028276820, - 0.792808289546014120, -0.609471095317180240, 0.792691410353209450, - -0.609623103197573730, - 0.792574502015407690, -0.609775088663868430, 0.792457564536907080, - -0.609927051710476120, - 0.792340597922007170, -0.610078992331809620, 0.792223602175008310, - -0.610230910522282620, - 0.792106577300212390, -0.610382806276309480, 0.791989523301921850, - -0.610534679588305320, - 0.791872440184440470, -0.610686530452686280, 0.791755327952073150, - -0.610838358863869170, - 0.791638186609125880, -0.610990164816271660, 0.791521016159905220, - -0.611141948304312570, - 0.791403816608719500, -0.611293709322410890, 0.791286587959877830, - -0.611445447864987000, - 0.791169330217690200, -0.611597163926461910, 0.791052043386467950, - -0.611748857501257290, - 0.790934727470523290, -0.611900528583796070, 0.790817382474169770, - -0.612052177168501470, - 0.790700008401721610, -0.612203803249797950, 0.790582605257494460, - -0.612355406822110650, - 0.790465173045804880, -0.612506987879865570, 0.790347711770970520, - -0.612658546417489290, - 0.790230221437310030, -0.612810082429409710, 0.790112702049143300, - -0.612961595910055170, - 0.789995153610791090, -0.613113086853854910, 0.789877576126575280, - -0.613264555255239040, - 0.789759969600819070, -0.613416001108638590, 0.789642334037846340, - -0.613567424408485330, - 0.789524669441982190, -0.613718825149211720, 0.789406975817552930, - -0.613870203325251330, - 0.789289253168885650, -0.614021558931038380, 0.789171501500308900, - -0.614172891961007990, - 0.789053720816151880, -0.614324202409595950, 0.788935911120745240, - -0.614475490271239040, - 0.788818072418420280, -0.614626755540375050, 0.788700204713509660, - -0.614777998211442080, - 0.788582308010347120, -0.614929218278879590, 0.788464382313267540, - -0.615080415737127460, - 0.788346427626606340, -0.615231590580626820, 0.788228443954700490, - -0.615382742803819220, - 0.788110431301888070, -0.615533872401147320, 0.787992389672507950, - -0.615684979367054570, - 0.787874319070900220, -0.615836063695985090, 0.787756219501406060, - -0.615987125382383760, - 0.787638090968367450, -0.616138164420696910, 0.787519933476127810, - -0.616289180805370980, - 0.787401747029031430, -0.616440174530853650, 0.787283531631423620, - -0.616591145591593110, - 0.787165287287651010, -0.616742093982038720, 0.787047014002060790, - -0.616893019696640680, - 0.786928711779001810, -0.617043922729849760, 0.786810380622823490, - -0.617194803076117630, - 0.786692020537876790, -0.617345660729896830, 0.786573631528513230, - -0.617496495685640910, - 0.786455213599085770, -0.617647307937803870, 0.786336766753948260, - -0.617798097480841020, - 0.786218290997455660, -0.617948864309208150, 0.786099786333963930, - -0.618099608417362000, - 0.785981252767830150, -0.618250329799760250, 0.785862690303412600, - -0.618401028450860980, - 0.785744098945070360, -0.618551704365123740, 0.785625478697163700, - -0.618702357537008530, - 0.785506829564053930, -0.618852987960976320, 0.785388151550103550, - -0.619003595631488660, - 0.785269444659675850, -0.619154180543008410, 0.785150708897135560, - -0.619304742689998690, - 0.785031944266848080, -0.619455282066924020, 0.784913150773180020, - -0.619605798668249270, - 0.784794328420499230, -0.619756292488440660, 0.784675477213174320, - -0.619906763521964720, - 0.784556597155575240, -0.620057211763289100, 0.784437688252072830, - -0.620207637206882430, - 0.784318750507038920, -0.620358039847213720, 0.784199783924846570, - -0.620508419678753360, - 0.784080788509869950, -0.620658776695972140, 0.783961764266484120, - -0.620809110893341900, - 0.783842711199065230, -0.620959422265335180, 0.783723629311990470, - -0.621109710806425630, - 0.783604518609638200, -0.621259976511087550, 0.783485379096387820, - -0.621410219373796150, - 0.783366210776619720, -0.621560439389027160, 0.783247013654715380, - -0.621710636551257690, - 0.783127787735057310, -0.621860810854965360, 0.783008533022029110, - -0.622010962294628600, - 0.782889249520015480, -0.622161090864726820, 0.782769937233402050, - -0.622311196559740320, - 0.782650596166575730, -0.622461279374149970, 0.782531226323924240, - -0.622611339302437730, - 0.782411827709836530, -0.622761376339086350, 0.782292400328702400, - -0.622911390478579460, - 0.782172944184913010, -0.623061381715401260, 0.782053459282860300, - -0.623211350044037270, - 0.781933945626937630, -0.623361295458973230, 0.781814403221538830, - -0.623511217954696440, - 0.781694832071059390, -0.623661117525694530, 0.781575232179895550, - -0.623810994166456130, - 0.781455603552444590, -0.623960847871470660, 0.781335946193104870, - -0.624110678635228510, - 0.781216260106276090, -0.624260486452220650, 0.781096545296358520, - -0.624410271316939270, - 0.780976801767753750, -0.624560033223877210, 0.780857029524864580, - -0.624709772167528100, - 0.780737228572094490, -0.624859488142386340, 0.780617398913848400, - -0.625009181142947460, - 0.780497540554531910, -0.625158851163707620, 0.780377653498552040, - -0.625308498199164010, - 0.780257737750316590, -0.625458122243814360, 0.780137793314234610, - -0.625607723292157410, - 0.780017820194715990, -0.625757301338692900, 0.779897818396172000, - -0.625906856377921090, - 0.779777787923014550, -0.626056388404343520, 0.779657728779656890, - -0.626205897412462130, - 0.779537640970513260, -0.626355383396779990, 0.779417524499998900, - -0.626504846351800810, - 0.779297379372530300, -0.626654286272029350, 0.779177205592524680, - -0.626803703151971200, - 0.779057003164400630, -0.626953096986132660, 0.778936772092577500, - -0.627102467769020900, - 0.778816512381475980, -0.627251815495144080, 0.778696224035517530, - -0.627401140159011050, - 0.778575907059125050, -0.627550441755131530, 0.778455561456721900, - -0.627699720278016240, - 0.778335187232733210, -0.627848975722176460, 0.778214784391584540, - -0.627998208082124700, - 0.778094352937702790, -0.628147417352374000, 0.777973892875516100, - -0.628296603527438320, - 0.777853404209453150, -0.628445766601832710, 0.777732886943944050, - -0.628594906570072550, - 0.777612341083420030, -0.628744023426674680, 0.777491766632313010, - -0.628893117166156480, - 0.777371163595056310, -0.629042187783036000, 0.777250531976084070, - -0.629191235271832290, - 0.777129871779831620, -0.629340259627065630, 0.777009183010735290, - -0.629489260843256630, - 0.776888465673232440, -0.629638238914926980, 0.776767719771761510, - -0.629787193836599200, - 0.776646945310762060, -0.629936125602796440, 0.776526142294674430, - -0.630085034208043180, - 0.776405310727940390, -0.630233919646864370, 0.776284450615002510, - -0.630382781913785940, - 0.776163561960304340, -0.630531621003334600, 0.776042644768290770, - -0.630680436910037940, - 0.775921699043407690, -0.630829229628424470, 0.775800724790101650, - -0.630977999153023550, - 0.775679722012820650, -0.631126745478365340, 0.775558690716013580, - -0.631275468598980760, - 0.775437630904130540, -0.631424168509401860, 0.775316542581622530, - -0.631572845204161020, - 0.775195425752941420, -0.631721498677792260, 0.775074280422540450, - -0.631870128924829850, - 0.774953106594873930, -0.632018735939809060, 0.774831904274396850, - -0.632167319717265920, - 0.774710673465565550, -0.632315880251737570, 0.774589414172837550, - -0.632464417537761840, - 0.774468126400670860, -0.632612931569877410, 0.774346810153525130, - -0.632761422342624000, - 0.774225465435860680, -0.632909889850541750, 0.774104092252139050, - -0.633058334088172140, - 0.773982690606822900, -0.633206755050057190, 0.773861260504375540, - -0.633355152730739950, - 0.773739801949261840, -0.633503527124764320, 0.773618314945947460, - -0.633651878226674900, - 0.773496799498899050, -0.633800206031017280, 0.773375255612584470, - -0.633948510532337810, - 0.773253683291472590, -0.634096791725183740, 0.773132082540033070, - -0.634245049604103330, - 0.773010453362736990, -0.634393284163645490, 0.772888795764056220, - -0.634541495398360020, - 0.772767109748463850, -0.634689683302797740, 0.772645395320433860, - -0.634837847871509990, - 0.772523652484441330, -0.634985989099049460, 0.772401881244962450, - -0.635134106979969190, - 0.772280081606474320, -0.635282201508823420, 0.772158253573455240, - -0.635430272680167160, - 0.772036397150384520, -0.635578320488556110, 0.771914512341742350, - -0.635726344928547070, - 0.771792599152010150, -0.635874345994697720, 0.771670657585670330, - -0.636022323681566300, - 0.771548687647206300, -0.636170277983712170, 0.771426689341102590, - -0.636318208895695460, - 0.771304662671844830, -0.636466116412077180, 0.771182607643919330, - -0.636614000527419120, - 0.771060524261813820, -0.636761861236284200, 0.770938412530016940, - -0.636909698533235870, - 0.770816272453018540, -0.637057512412838590, 0.770694104035309140, - -0.637205302869657600, - 0.770571907281380810, -0.637353069898259130, 0.770449682195725960, - -0.637500813493210190, - 0.770327428782838890, -0.637648533649078810, 0.770205147047214210, - -0.637796230360433540, - 0.770082836993347900, -0.637943903621844060, 0.769960498625737230, - -0.638091553427880820, - 0.769838131948879840, -0.638239179773115280, 0.769715736967275130, - -0.638386782652119570, - 0.769593313685422940, -0.638534362059466790, 0.769470862107824670, - -0.638681917989730730, - 0.769348382238982280, -0.638829450437486290, 0.769225874083399260, - -0.638976959397309140, - 0.769103337645579700, -0.639124444863775730, 0.768980772930028870, - -0.639271906831463510, - 0.768858179941253270, -0.639419345294950700, 0.768735558683760310, - -0.639566760248816310, - 0.768612909162058380, -0.639714151687640450, 0.768490231380656860, - -0.639861519606003900, - 0.768367525344066270, -0.640008863998488440, 0.768244791056798330, - -0.640156184859676510, - 0.768122028523365420, -0.640303482184151670, 0.767999237748281270, - -0.640450755966498140, - 0.767876418736060610, -0.640598006201301030, 0.767753571491219030, - -0.640745232883146440, - 0.767630696018273380, -0.640892436006621380, 0.767507792321741270, - -0.641039615566313390, - 0.767384860406141730, -0.641186771556811250, 0.767261900275994500, - -0.641333903972704290, - 0.767138911935820400, -0.641481012808583160, 0.767015895390141480, - -0.641628098059038750, - 0.766892850643480670, -0.641775159718663500, 0.766769777700361920, - -0.641922197782050170, - 0.766646676565310380, -0.642069212243792540, 0.766523547242852210, - -0.642216203098485370, - 0.766400389737514230, -0.642363170340724320, 0.766277204053824710, - -0.642510113965105710, - 0.766153990196312920, -0.642657033966226860, 0.766030748169509000, - -0.642803930338685990, - 0.765907477977944340, -0.642950803077082080, 0.765784179626150970, - -0.643097652176015110, - 0.765660853118662500, -0.643244477630085850, 0.765537498460013070, - -0.643391279433895850, - 0.765414115654738270, -0.643538057582047740, 0.765290704707374370, - -0.643684812069144850, - 0.765167265622458960, -0.643831542889791390, 0.765043798404530520, - -0.643978250038592660, - 0.764920303058128410, -0.644124933510154540, 0.764796779587793460, - -0.644271593299083790, - 0.764673227998067140, -0.644418229399988380, 0.764549648293492150, - -0.644564841807476640, - 0.764426040478612070, -0.644711430516158310, 0.764302404557971720, - -0.644857995520643710, - 0.764178740536116670, -0.645004536815543930, 0.764055048417593970, - -0.645151054395471160, - 0.763931328206951090, -0.645297548255038380, 0.763807579908737160, - -0.645444018388859230, - 0.763683803527501870, -0.645590464791548690, 0.763559999067796150, - -0.645736887457722290, - 0.763436166534172010, -0.645883286381996320, 0.763312305931182380, - -0.646029661558988330, - 0.763188417263381270, -0.646176012983316280, 0.763064500535323710, - -0.646322340649599480, - 0.762940555751565720, -0.646468644552457780, 0.762816582916664430, - -0.646614924686512050, - 0.762692582035177980, -0.646761181046383920, 0.762568553111665380, - -0.646907413626696020, - 0.762444496150687210, -0.647053622422071540, 0.762320411156804270, - -0.647199807427135230, - 0.762196298134578900, -0.647345968636512060, 0.762072157088574560, - -0.647492106044828100, - 0.761947988023355390, -0.647638219646710310, 0.761823790943486960, - -0.647784309436786440, - 0.761699565853535380, -0.647930375409685340, 0.761575312758068000, - -0.648076417560036530, - 0.761451031661653620, -0.648222435882470420, 0.761326722568861360, - -0.648368430371618290, - 0.761202385484261780, -0.648514401022112440, 0.761078020412426560, - -0.648660347828585840, - 0.760953627357928150, -0.648806270785672550, 0.760829206325340010, - -0.648952169888007300, - 0.760704757319236920, -0.649098045130225950, 0.760580280344194450, - -0.649243896506964900, - 0.760455775404789260, -0.649389724012861660, 0.760331242505599030, - -0.649535527642554730, - 0.760206681651202420, -0.649681307390683190, 0.760082092846179340, - -0.649827063251887100, - 0.759957476095110330, -0.649972795220807530, 0.759832831402577400, - -0.650118503292086200, - 0.759708158773163440, -0.650264187460365850, 0.759583458211452010, - -0.650409847720290310, - 0.759458729722028210, -0.650555484066503880, 0.759333973309477940, - -0.650701096493652040, - 0.759209188978388070, -0.650846684996380880, 0.759084376733346610, - -0.650992249569337660, - 0.758959536578942440, -0.651137790207170330, 0.758834668519765660, - -0.651283306904527740, - 0.758709772560407390, -0.651428799656059820, 0.758584848705459610, - -0.651574268456416970, - 0.758459896959515430, -0.651719713300250910, 0.758334917327168960, - -0.651865134182213920, - 0.758209909813015280, -0.652010531096959500, 0.758084874421650730, - -0.652155904039141590, - 0.757959811157672300, -0.652301253003415460, 0.757834720025678310, - -0.652446577984436730, - 0.757709601030268080, -0.652591878976862440, 0.757584454176041810, - -0.652737155975350310, - 0.757459279467600720, -0.652882408974558850, 0.757334076909547130, - -0.653027637969147530, - 0.757208846506484570, -0.653172842953776760, 0.757083588263017140, - -0.653318023923107670, - 0.756958302183750490, -0.653463180871802330, 0.756832988273290820, - -0.653608313794523890, - 0.756707646536245670, -0.653753422685936060, 0.756582276977223470, - -0.653898507540703780, - 0.756456879600833740, -0.654043568353492640, 0.756331454411686920, - -0.654188605118969040, - 0.756206001414394540, -0.654333617831800440, 0.756080520613569120, - -0.654478606486655350, - 0.755955012013824420, -0.654623571078202680, 0.755829475619774760, - -0.654768511601112600, - 0.755703911436035880, -0.654913428050056030, 0.755578319467224540, - -0.655058320419704910, - 0.755452699717958250, -0.655203188704731820, 0.755327052192855670, - -0.655348032899810470, - 0.755201376896536550, -0.655492852999615350, 0.755075673833621620, - -0.655637648998821820, - 0.754949943008732640, -0.655782420892106030, 0.754824184426492350, - -0.655927168674145360, - 0.754698398091524500, -0.656071892339617600, 0.754572584008453840, - -0.656216591883201920, - 0.754446742181906440, -0.656361267299578000, 0.754320872616508820, - -0.656505918583426550, - 0.754194975316889170, -0.656650545729428940, 0.754069050287676120, - -0.656795148732268070, - 0.753943097533499640, -0.656939727586627110, 0.753817117058990790, - -0.657084282287190180, - 0.753691108868781210, -0.657228812828642540, 0.753565072967504300, - -0.657373319205670210, - 0.753439009359793580, -0.657517801412960120, 0.753312918050284330, - -0.657662259445200070, - 0.753186799043612520, -0.657806693297078640, 0.753060652344415100, - -0.657951102963285520, - 0.752934477957330150, -0.658095488438511180, 0.752808275886996950, - -0.658239849717446870, - 0.752682046138055340, -0.658384186794785050, 0.752555788715146390, - -0.658528499665218650, - 0.752429503622912390, -0.658672788323441890, 0.752303190865996400, - -0.658817052764149480, - 0.752176850449042810, -0.658961292982037320, 0.752050482376696360, - -0.659105508971802090, - 0.751924086653603550, -0.659249700728141490, 0.751797663284411550, - -0.659393868245753860, - 0.751671212273768430, -0.659538011519338660, 0.751544733626323680, - -0.659682130543596150, - 0.751418227346727470, -0.659826225313227320, 0.751291693439630870, - -0.659970295822934540, - 0.751165131909686480, -0.660114342067420480, 0.751038542761547360, - -0.660258364041389050, - 0.750911925999867890, -0.660402361739545030, 0.750785281629303690, - -0.660546335156593890, - 0.750658609654510700, -0.660690284287242300, 0.750531910080146410, - -0.660834209126197610, - 0.750405182910869330, -0.660978109668168060, 0.750278428151338720, - -0.661121985907862860, - 0.750151645806215070, -0.661265837839992270, 0.750024835880159780, - -0.661409665459266940, - 0.749897998377835330, -0.661553468760398890, 0.749771133303905100, - -0.661697247738101010, - 0.749644240663033480, -0.661841002387086870, 0.749517320459886170, - -0.661984732702070920, - 0.749390372699129560, -0.662128438677768720, 0.749263397385431130, - -0.662272120308896590, - 0.749136394523459370, -0.662415777590171780, 0.749009364117883880, - -0.662559410516312290, - 0.748882306173375150, -0.662703019082037440, 0.748755220694604760, - -0.662846603282066900, - 0.748628107686245440, -0.662990163111121470, 0.748500967152970430, - -0.663133698563923010, - 0.748373799099454560, -0.663277209635194100, 0.748246603530373420, - -0.663420696319658280, - 0.748119380450403600, -0.663564158612039770, 0.747992129864222700, - -0.663707596507064010, - 0.747864851776509410, -0.663851009999457340, 0.747737546191943330, - -0.663994399083946640, - 0.747610213115205150, -0.664137763755260010, 0.747482852550976570, - -0.664281104008126230, - 0.747355464503940190, -0.664424419837275180, 0.747228048978779920, - -0.664567711237437520, - 0.747100605980180130, -0.664710978203344790, 0.746973135512826850, - -0.664854220729729660, - 0.746845637581406540, -0.664997438811325340, 0.746718112190607130, - -0.665140632442866140, - 0.746590559345117310, -0.665283801619087180, 0.746462979049626770, - -0.665426946334724660, - 0.746335371308826320, -0.665570066584515450, 0.746207736127407760, - -0.665713162363197550, - 0.746080073510063780, -0.665856233665509720, 0.745952383461488290, - -0.665999280486191500, - 0.745824665986376090, -0.666142302819983540, 0.745696921089422760, - -0.666285300661627280, - 0.745569148775325430, -0.666428274005865240, 0.745441349048781680, - -0.666571222847440640, - 0.745313521914490520, -0.666714147181097670, 0.745185667377151640, - -0.666857047001581220, - 0.745057785441466060, -0.666999922303637470, 0.744929876112135350, - -0.667142773082013310, - 0.744801939393862630, -0.667285599331456370, 0.744673975291351710, - -0.667428401046715520, - 0.744545983809307370, -0.667571178222540310, 0.744417964952435620, - -0.667713930853681030, - 0.744289918725443260, -0.667856658934889320, 0.744161845133038180, - -0.667999362460917400, - 0.744033744179929290, -0.668142041426518450, 0.743905615870826490, - -0.668284695826446670, - 0.743777460210440890, -0.668427325655456820, 0.743649277203484060, - -0.668569930908304970, - 0.743521066854669120, -0.668712511579747980, 0.743392829168709970, - -0.668855067664543610, - 0.743264564150321600, -0.668997599157450270, 0.743136271804219820, - -0.669140106053227600, - 0.743007952135121720, -0.669282588346636010, 0.742879605147745200, - -0.669425046032436910, - 0.742751230846809050, -0.669567479105392490, 0.742622829237033490, - -0.669709887560265840, - 0.742494400323139180, -0.669852271391821020, 0.742365944109848460, - -0.669994630594823000, - 0.742237460601884000, -0.670136965164037650, 0.742108949803969910, - -0.670279275094231800, - 0.741980411720831070, -0.670421560380173090, 0.741851846357193480, - -0.670563821016630040, - 0.741723253717784140, -0.670706056998372160, 0.741594633807331150, - -0.670848268320169640, - 0.741465986630563290, -0.670990454976794220, 0.741337312192210660, - -0.671132616963017740, - 0.741208610497004260, -0.671274754273613490, 0.741079881549676080, - -0.671416866903355450, - 0.740951125354959110, -0.671558954847018330, 0.740822341917587330, - -0.671701018099378320, - 0.740693531242295760, -0.671843056655211930, 0.740564693333820250, - -0.671985070509296900, - 0.740435828196898020, -0.672127059656411730, 0.740306935836266940, - -0.672269024091335930, - 0.740178016256666240, -0.672410963808849790, 0.740049069462835550, - -0.672552878803734710, - 0.739920095459516200, -0.672694769070772860, 0.739791094251449950, - -0.672836634604747300, - 0.739662065843380010, -0.672978475400442090, 0.739533010240050250, - -0.673120291452642070, - 0.739403927446205760, -0.673262082756132970, 0.739274817466592520, - -0.673403849305701740, - 0.739145680305957510, -0.673545591096136100, 0.739016515969048720, - -0.673687308122224330, - 0.738887324460615110, -0.673829000378756040, 0.738758105785406900, - -0.673970667860521620, - 0.738628859948174840, -0.674112310562312360, 0.738499586953671130, - -0.674253928478920410, - 0.738370286806648620, -0.674395521605139050, 0.738240959511861310, - -0.674537089935762000, - 0.738111605074064260, -0.674678633465584540, 0.737982223498013570, - -0.674820152189402170, - 0.737852814788465980, -0.674961646102011930, 0.737723378950179700, - -0.675103115198211420, - 0.737593915987913570, -0.675244559472799270, 0.737464425906427580, - -0.675385978920574840, - 0.737334908710482910, -0.675527373536338520, 0.737205364404841190, - -0.675668743314891910, - 0.737075792994265730, -0.675810088251036940, 0.736946194483520280, - -0.675951408339577010, - 0.736816568877369900, -0.676092703575315920, 0.736686916180580460, - -0.676233973953058950, - 0.736557236397919150, -0.676375219467611590, 0.736427529534153690, - -0.676516440113781090, - 0.736297795594053170, -0.676657635886374950, 0.736168034582387330, - -0.676798806780201770, - 0.736038246503927350, -0.676939952790071130, 0.735908431363445190, - -0.677081073910793530, - 0.735778589165713590, -0.677222170137180330, 0.735648719915506510, - -0.677363241464043920, - 0.735518823617598900, -0.677504287886197430, 0.735388900276766730, - -0.677645309398454910, - 0.735258949897786840, -0.677786305995631500, 0.735128972485437180, - -0.677927277672543020, - 0.734998968044496710, -0.678068224424006600, 0.734868936579745170, - -0.678209146244839860, - 0.734738878095963500, -0.678350043129861470, 0.734608792597933550, - -0.678490915073891140, - 0.734478680090438370, -0.678631762071749360, 0.734348540578261600, - -0.678772584118257690, - 0.734218374066188280, -0.678913381208238410, 0.734088180559004040, - -0.679054153336514870, - 0.733957960061495940, -0.679194900497911200, 0.733827712578451700, - -0.679335622687252560, - 0.733697438114660370, -0.679476319899364970, 0.733567136674911360, - -0.679616992129075560, - 0.733436808263995710, -0.679757639371212030, 0.733306452886705260, - -0.679898261620603290, - 0.733176070547832740, -0.680038858872078930, 0.733045661252172080, - -0.680179431120469750, - 0.732915225004517780, -0.680319978360607200, 0.732784761809665790, - -0.680460500587323880, - 0.732654271672412820, -0.680600997795453020, 0.732523754597556700, - -0.680741469979829090, - 0.732393210589896040, -0.680881917135287230, 0.732262639654230770, - -0.681022339256663670, - 0.732132041795361290, -0.681162736338795430, 0.732001417018089630, - -0.681303108376520530, - 0.731870765327218290, -0.681443455364677870, 0.731740086727550980, - -0.681583777298107480, - 0.731609381223892630, -0.681724074171649710, 0.731478648821048520, - -0.681864345980146670, - 0.731347889523825570, -0.682004592718440830, 0.731217103337031270, - -0.682144814381375640, - 0.731086290265474340, -0.682285010963795570, 0.730955450313964360, - -0.682425182460546060, - 0.730824583487312160, -0.682565328866473250, 0.730693689790329000, - -0.682705450176424590, - 0.730562769227827590, -0.682845546385248080, 0.730431821804621520, - -0.682985617487792740, - 0.730300847525525490, -0.683125663478908680, 0.730169846395354870, - -0.683265684353446700, - 0.730038818418926260, -0.683405680106258680, 0.729907763601057140, - -0.683545650732197530, - 0.729776681946566090, -0.683685596226116580, 0.729645573460272480, - -0.683825516582870720, - 0.729514438146997010, -0.683965411797315400, 0.729383276011561050, - -0.684105281864307080, - 0.729252087058786970, -0.684245126778703080, 0.729120871293498230, - -0.684384946535361750, - 0.728989628720519420, -0.684524741129142300, 0.728858359344675800, - -0.684664510554904960, - 0.728727063170793830, -0.684804254807510620, 0.728595740203700770, - -0.684943973881821490, - 0.728464390448225200, -0.685083667772700360, 0.728333013909196360, - -0.685223336475011210, - 0.728201610591444610, -0.685362979983618730, 0.728070180499801210, - -0.685502598293388550, - 0.727938723639098620, -0.685642191399187470, 0.727807240014169960, - -0.685781759295883030, - 0.727675729629849610, -0.685921301978343560, 0.727544192490972800, - -0.686060819441438710, - 0.727412628602375770, -0.686200311680038590, 0.727281037968895870, - -0.686339778689014520, - 0.727149420595371020, -0.686479220463238950, 0.727017776486640680, - -0.686618636997584630, - 0.726886105647544970, -0.686758028286925890, 0.726754408082925020, - -0.686897394326137610, - 0.726622683797622850, -0.687036735110095660, 0.726490932796481910, - -0.687176050633676820, - 0.726359155084346010, -0.687315340891759050, 0.726227350666060370, - -0.687454605879221030, - 0.726095519546471000, -0.687593845590942170, 0.725963661730424930, - -0.687733060021803230, - 0.725831777222770370, -0.687872249166685550, 0.725699866028356120, - -0.688011413020471640, - 0.725567928152032300, -0.688150551578044830, 0.725435963598649810, - -0.688289664834289330, - 0.725303972373060770, -0.688428752784090440, 0.725171954480117950, - -0.688567815422334250, - 0.725039909924675370, -0.688706852743907750, 0.724907838711587820, - -0.688845864743699020, - 0.724775740845711280, -0.688984851416597040, 0.724643616331902550, - -0.689123812757491570, - 0.724511465175019630, -0.689262748761273470, 0.724379287379921190, - -0.689401659422834270, - 0.724247082951467000, -0.689540544737066830, 0.724114851894517850, - -0.689679404698864800, - 0.723982594213935520, -0.689818239303122470, 0.723850309914582880, - -0.689957048544735390, - 0.723717999001323500, -0.690095832418599950, 0.723585661479022150, - -0.690234590919613370, - 0.723453297352544380, -0.690373324042674040, 0.723320906626756970, - -0.690512031782681060, - 0.723188489306527460, -0.690650714134534600, 0.723056045396724410, - -0.690789371093135650, - 0.722923574902217700, -0.690928002653386160, 0.722791077827877550, - -0.691066608810189220, - 0.722658554178575610, -0.691205189558448450, 0.722526003959184540, - -0.691343744893068710, - 0.722393427174577550, -0.691482274808955850, 0.722260823829629310, - -0.691620779301016290, - 0.722128193929215350, -0.691759258364157750, 0.721995537478211880, - -0.691897711993288760, - 0.721862854481496340, -0.692036140183318720, 0.721730144943947160, - -0.692174542929158140, - 0.721597408870443770, -0.692312920225718220, 0.721464646265866370, - -0.692451272067911130, - 0.721331857135096290, -0.692589598450650380, 0.721199041483015720, - -0.692727899368849820, - 0.721066199314508110, -0.692866174817424630, 0.720933330634457530, - -0.693004424791290870, - 0.720800435447749190, -0.693142649285365400, 0.720667513759269520, - -0.693280848294566040, - 0.720534565573905270, -0.693419021813811760, 0.720401590896544760, - -0.693557169838022290, - 0.720268589732077190, -0.693695292362118240, 0.720135562085392420, - -0.693833389381021350, - 0.720002507961381650, -0.693971460889654000, 0.719869427364936860, - -0.694109506882939820, - 0.719736320300951030, -0.694247527355803310, 0.719603186774318120, - -0.694385522303169740, - 0.719470026789932990, -0.694523491719965520, 0.719336840352691740, - -0.694661435601117820, - 0.719203627467491220, -0.694799353941554900, 0.719070388139229190, - -0.694937246736205830, - 0.718937122372804490, -0.695075113980000880, 0.718803830173116890, - -0.695212955667870780, - 0.718670511545067230, -0.695350771794747690, 0.718537166493557370, - -0.695488562355564440, - 0.718403795023489830, -0.695626327345254870, 0.718270397139768260, - -0.695764066758753690, - 0.718136972847297490, -0.695901780590996830, 0.718003522150983180, - -0.696039468836920690, - 0.717870045055731710, -0.696177131491462990, 0.717736541566450950, - -0.696314768549562090, - 0.717603011688049080, -0.696452380006157830, 0.717469455425435830, - -0.696589965856190370, - 0.717335872783521730, -0.696727526094601200, 0.717202263767218070, - -0.696865060716332470, - 0.717068628381437480, -0.697002569716327460, 0.716934966631093130, - -0.697140053089530420, - 0.716801278521099540, -0.697277510830886520, 0.716667564056371890, - -0.697414942935341790, - 0.716533823241826680, -0.697552349397843160, 0.716400056082381000, - -0.697689730213338800, - 0.716266262582953120, -0.697827085376777290, 0.716132442748462330, - -0.697964414883108670, - 0.715998596583828690, -0.698101718727283770, 0.715864724093973500, - -0.698238996904254280, - 0.715730825283818590, -0.698376249408972920, 0.715596900158287470, - -0.698513476236393040, - 0.715462948722303760, -0.698650677381469460, 0.715328970980792620, - -0.698787852839157670, - 0.715194966938680120, -0.698925002604414150, 0.715060936600893090, - -0.699062126672196140, - 0.714926879972359490, -0.699199225037462120, 0.714792797058008240, - -0.699336297695171140, - 0.714658687862769090, -0.699473344640283770, 0.714524552391572860, - -0.699610365867761040, - 0.714390390649351390, -0.699747361372564990, 0.714256202641037510, - -0.699884331149658760, - 0.714121988371564820, -0.700021275194006250, 0.713987747845867830, - -0.700158193500572730, - 0.713853481068882470, -0.700295086064323780, 0.713719188045545240, - -0.700431952880226420, - 0.713584868780793640, -0.700568793943248340, 0.713450523279566260, - -0.700705609248358450, - 0.713316151546802610, -0.700842398790526120, 0.713181753587443180, - -0.700979162564722370, - 0.713047329406429340, -0.701115900565918660, 0.712912879008703480, - -0.701252612789087460, - 0.712778402399208980, -0.701389299229202230, 0.712643899582890210, - -0.701525959881237340, - 0.712509370564692320, -0.701662594740168450, 0.712374815349561710, - -0.701799203800971720, - 0.712240233942445510, -0.701935787058624360, 0.712105626348291890, - -0.702072344508104630, - 0.711970992572050100, -0.702208876144391870, 0.711836332618670080, - -0.702345381962465880, - 0.711701646493102970, -0.702481861957308000, 0.711566934200300700, - -0.702618316123900130, - 0.711432195745216430, -0.702754744457225300, 0.711297431132803970, - -0.702891146952267400, - 0.711162640368018350, -0.703027523604011220, 0.711027823455815280, - -0.703163874407442770, - 0.710892980401151680, -0.703300199357548730, 0.710758111208985350, - -0.703436498449316660, - 0.710623215884275020, -0.703572771677735580, 0.710488294431980470, - -0.703709019037794810, - 0.710353346857062420, -0.703845240524484940, 0.710218373164482220, - -0.703981436132797620, - 0.710083373359202800, -0.704117605857725310, 0.709948347446187400, - -0.704253749694261470, - 0.709813295430400840, -0.704389867637400410, 0.709678217316808580, - -0.704525959682137380, - 0.709543113110376770, -0.704662025823468820, 0.709407982816072980, - -0.704798066056391950, - 0.709272826438865690, -0.704934080375904880, 0.709137643983724030, - -0.705070068777006840, - 0.709002435455618250, -0.705206031254697830, 0.708867200859519820, - -0.705341967803978840, - 0.708731940200400650, -0.705477878419852100, 0.708596653483234080, - -0.705613763097320490, - 0.708461340712994160, -0.705749621831387790, 0.708326001894655890, - -0.705885454617058980, - 0.708190637033195400, -0.706021261449339740, 0.708055246133589500, - -0.706157042323237060, - 0.707919829200816310, -0.706292797233758480, 0.707784386239854620, - -0.706428526175912790, - 0.707648917255684350, -0.706564229144709510, 0.707513422253286280, - -0.706699906135159430, - 0.707377901237642100, -0.706835557142273750, 0.707242354213734710, - -0.706971182161065360, - 0.707106781186547570, -0.707106781186547460, 0.706971182161065360, - -0.707242354213734600, - 0.706835557142273860, -0.707377901237642100, 0.706699906135159430, - -0.707513422253286170, - 0.706564229144709620, -0.707648917255684350, 0.706428526175912790, - -0.707784386239854620, - 0.706292797233758480, -0.707919829200816310, 0.706157042323237060, - -0.708055246133589500, - 0.706021261449339740, -0.708190637033195290, 0.705885454617058980, - -0.708326001894655780, - 0.705749621831387790, -0.708461340712994050, 0.705613763097320490, - -0.708596653483234080, - 0.705477878419852210, -0.708731940200400650, 0.705341967803978950, - -0.708867200859519820, - 0.705206031254697830, -0.709002435455618250, 0.705070068777006840, - -0.709137643983723920, - 0.704934080375904990, -0.709272826438865580, 0.704798066056391950, - -0.709407982816072980, - 0.704662025823468930, -0.709543113110376770, 0.704525959682137380, - -0.709678217316808470, - 0.704389867637400410, -0.709813295430400840, 0.704253749694261580, - -0.709948347446187400, - 0.704117605857725430, -0.710083373359202690, 0.703981436132797730, - -0.710218373164482220, - 0.703845240524484940, -0.710353346857062310, 0.703709019037794810, - -0.710488294431980470, - 0.703572771677735580, -0.710623215884275020, 0.703436498449316770, - -0.710758111208985350, - 0.703300199357548730, -0.710892980401151680, 0.703163874407442770, - -0.711027823455815280, - 0.703027523604011220, -0.711162640368018350, 0.702891146952267400, - -0.711297431132803970, - 0.702754744457225300, -0.711432195745216430, 0.702618316123900130, - -0.711566934200300700, - 0.702481861957308000, -0.711701646493102970, 0.702345381962465880, - -0.711836332618670080, - 0.702208876144391870, -0.711970992572049990, 0.702072344508104740, - -0.712105626348291890, - 0.701935787058624360, -0.712240233942445510, 0.701799203800971720, - -0.712374815349561710, - 0.701662594740168570, -0.712509370564692320, 0.701525959881237450, - -0.712643899582890210, - 0.701389299229202230, -0.712778402399208870, 0.701252612789087460, - -0.712912879008703370, - 0.701115900565918660, -0.713047329406429230, 0.700979162564722480, - -0.713181753587443070, - 0.700842398790526230, -0.713316151546802610, 0.700705609248358450, - -0.713450523279566150, - 0.700568793943248450, -0.713584868780793520, 0.700431952880226420, - -0.713719188045545130, - 0.700295086064323780, -0.713853481068882470, 0.700158193500572730, - -0.713987747845867830, - 0.700021275194006360, -0.714121988371564710, 0.699884331149658760, - -0.714256202641037400, - 0.699747361372564990, -0.714390390649351390, 0.699610365867761040, - -0.714524552391572860, - 0.699473344640283770, -0.714658687862768980, 0.699336297695171250, - -0.714792797058008130, - 0.699199225037462120, -0.714926879972359370, 0.699062126672196140, - -0.715060936600892980, - 0.698925002604414150, -0.715194966938680010, 0.698787852839157790, - -0.715328970980792620, - 0.698650677381469580, -0.715462948722303650, 0.698513476236393040, - -0.715596900158287360, - 0.698376249408972920, -0.715730825283818590, 0.698238996904254390, - -0.715864724093973390, - 0.698101718727283880, -0.715998596583828690, 0.697964414883108790, - -0.716132442748462330, - 0.697827085376777290, -0.716266262582953120, 0.697689730213338800, - -0.716400056082380890, - 0.697552349397843270, -0.716533823241826570, 0.697414942935341790, - -0.716667564056371890, - 0.697277510830886630, -0.716801278521099540, 0.697140053089530530, - -0.716934966631093130, - 0.697002569716327460, -0.717068628381437480, 0.696865060716332470, - -0.717202263767218070, - 0.696727526094601200, -0.717335872783521730, 0.696589965856190370, - -0.717469455425435830, - 0.696452380006157830, -0.717603011688049080, 0.696314768549562200, - -0.717736541566450840, - 0.696177131491462990, -0.717870045055731710, 0.696039468836920690, - -0.718003522150983060, - 0.695901780590996830, -0.718136972847297490, 0.695764066758753800, - -0.718270397139768260, - 0.695626327345254870, -0.718403795023489720, 0.695488562355564440, - -0.718537166493557370, - 0.695350771794747800, -0.718670511545067230, 0.695212955667870890, - -0.718803830173116890, - 0.695075113980000880, -0.718937122372804380, 0.694937246736205940, - -0.719070388139229190, - 0.694799353941554900, -0.719203627467491220, 0.694661435601117930, - -0.719336840352691740, - 0.694523491719965520, -0.719470026789932990, 0.694385522303169860, - -0.719603186774318000, - 0.694247527355803310, -0.719736320300951030, 0.694109506882939820, - -0.719869427364936860, - 0.693971460889654000, -0.720002507961381650, 0.693833389381021350, - -0.720135562085392310, - 0.693695292362118350, -0.720268589732077080, 0.693557169838022400, - -0.720401590896544760, - 0.693419021813811880, -0.720534565573905270, 0.693280848294566150, - -0.720667513759269410, - 0.693142649285365510, -0.720800435447749190, 0.693004424791290870, - -0.720933330634457530, - 0.692866174817424740, -0.721066199314508110, 0.692727899368849820, - -0.721199041483015720, - 0.692589598450650380, -0.721331857135096180, 0.692451272067911240, - -0.721464646265866370, - 0.692312920225718220, -0.721597408870443660, 0.692174542929158140, - -0.721730144943947160, - 0.692036140183318830, -0.721862854481496340, 0.691897711993288760, - -0.721995537478211880, - 0.691759258364157750, -0.722128193929215350, 0.691620779301016400, - -0.722260823829629310, - 0.691482274808955850, -0.722393427174577550, 0.691343744893068820, - -0.722526003959184430, - 0.691205189558448450, -0.722658554178575610, 0.691066608810189220, - -0.722791077827877550, - 0.690928002653386280, -0.722923574902217700, 0.690789371093135760, - -0.723056045396724410, - 0.690650714134534720, -0.723188489306527350, 0.690512031782681170, - -0.723320906626756850, - 0.690373324042674040, -0.723453297352544380, 0.690234590919613370, - -0.723585661479022040, - 0.690095832418599950, -0.723717999001323390, 0.689957048544735390, - -0.723850309914582880, - 0.689818239303122470, -0.723982594213935520, 0.689679404698864800, - -0.724114851894517850, - 0.689540544737066940, -0.724247082951466890, 0.689401659422834380, - -0.724379287379921080, - 0.689262748761273470, -0.724511465175019520, 0.689123812757491680, - -0.724643616331902550, - 0.688984851416597150, -0.724775740845711280, 0.688845864743699130, - -0.724907838711587820, - 0.688706852743907750, -0.725039909924675370, 0.688567815422334360, - -0.725171954480117840, - 0.688428752784090550, -0.725303972373060660, 0.688289664834289440, - -0.725435963598649810, - 0.688150551578044830, -0.725567928152032300, 0.688011413020471640, - -0.725699866028356120, - 0.687872249166685550, -0.725831777222770370, 0.687733060021803230, - -0.725963661730424930, - 0.687593845590942170, -0.726095519546470890, 0.687454605879221030, - -0.726227350666060260, - 0.687315340891759160, -0.726359155084346010, 0.687176050633676930, - -0.726490932796481910, - 0.687036735110095660, -0.726622683797622850, 0.686897394326137610, - -0.726754408082924910, - 0.686758028286925890, -0.726886105647544970, 0.686618636997584740, - -0.727017776486640680, - 0.686479220463238950, -0.727149420595371020, 0.686339778689014630, - -0.727281037968895760, - 0.686200311680038700, -0.727412628602375770, 0.686060819441438710, - -0.727544192490972800, - 0.685921301978343670, -0.727675729629849610, 0.685781759295883030, - -0.727807240014169960, - 0.685642191399187470, -0.727938723639098620, 0.685502598293388670, - -0.728070180499801210, - 0.685362979983618730, -0.728201610591444500, 0.685223336475011210, - -0.728333013909196360, - 0.685083667772700360, -0.728464390448225200, 0.684943973881821490, - -0.728595740203700770, - 0.684804254807510620, -0.728727063170793720, 0.684664510554904960, - -0.728858359344675690, - 0.684524741129142300, -0.728989628720519310, 0.684384946535361750, - -0.729120871293498230, - 0.684245126778703080, -0.729252087058786970, 0.684105281864307080, - -0.729383276011561050, - 0.683965411797315510, -0.729514438146996900, 0.683825516582870830, - -0.729645573460272480, - 0.683685596226116690, -0.729776681946565970, 0.683545650732197530, - -0.729907763601057140, - 0.683405680106258790, -0.730038818418926150, 0.683265684353446700, - -0.730169846395354870, - 0.683125663478908800, -0.730300847525525380, 0.682985617487792850, - -0.730431821804621520, - 0.682845546385248080, -0.730562769227827590, 0.682705450176424590, - -0.730693689790328890, - 0.682565328866473250, -0.730824583487312050, 0.682425182460546060, - -0.730955450313964360, - 0.682285010963795570, -0.731086290265474230, 0.682144814381375640, - -0.731217103337031160, - 0.682004592718440830, -0.731347889523825460, 0.681864345980146780, - -0.731478648821048520, - 0.681724074171649820, -0.731609381223892520, 0.681583777298107480, - -0.731740086727550980, - 0.681443455364677990, -0.731870765327218290, 0.681303108376520530, - -0.732001417018089520, - 0.681162736338795430, -0.732132041795361290, 0.681022339256663670, - -0.732262639654230660, - 0.680881917135287340, -0.732393210589896040, 0.680741469979829090, - -0.732523754597556590, - 0.680600997795453130, -0.732654271672412820, 0.680460500587323880, - -0.732784761809665790, - 0.680319978360607200, -0.732915225004517780, 0.680179431120469750, - -0.733045661252171970, - 0.680038858872079040, -0.733176070547832740, 0.679898261620603290, - -0.733306452886705260, - 0.679757639371212030, -0.733436808263995710, 0.679616992129075560, - -0.733567136674911360, - 0.679476319899365080, -0.733697438114660260, 0.679335622687252670, - -0.733827712578451700, - 0.679194900497911200, -0.733957960061495940, 0.679054153336514870, - -0.734088180559004040, - 0.678913381208238410, -0.734218374066188170, 0.678772584118257690, - -0.734348540578261600, - 0.678631762071749470, -0.734478680090438370, 0.678490915073891250, - -0.734608792597933550, - 0.678350043129861580, -0.734738878095963390, 0.678209146244839860, - -0.734868936579745060, - 0.678068224424006600, -0.734998968044496600, 0.677927277672543130, - -0.735128972485437180, - 0.677786305995631500, -0.735258949897786730, 0.677645309398454910, - -0.735388900276766620, - 0.677504287886197430, -0.735518823617598900, 0.677363241464044030, - -0.735648719915506400, - 0.677222170137180450, -0.735778589165713480, 0.677081073910793530, - -0.735908431363445190, - 0.676939952790071240, -0.736038246503927350, 0.676798806780201770, - -0.736168034582387330, - 0.676657635886374950, -0.736297795594053060, 0.676516440113781090, - -0.736427529534153690, - 0.676375219467611700, -0.736557236397919150, 0.676233973953058950, - -0.736686916180580460, - 0.676092703575316030, -0.736816568877369790, 0.675951408339577010, - -0.736946194483520170, - 0.675810088251037060, -0.737075792994265620, 0.675668743314891910, - -0.737205364404841190, - 0.675527373536338630, -0.737334908710482790, 0.675385978920574950, - -0.737464425906427580, - 0.675244559472799270, -0.737593915987913460, 0.675103115198211530, - -0.737723378950179590, - 0.674961646102012040, -0.737852814788465980, 0.674820152189402280, - -0.737982223498013570, - 0.674678633465584540, -0.738111605074064260, 0.674537089935762110, - -0.738240959511861310, - 0.674395521605139050, -0.738370286806648510, 0.674253928478920520, - -0.738499586953671130, - 0.674112310562312360, -0.738628859948174840, 0.673970667860521620, - -0.738758105785406900, - 0.673829000378756150, -0.738887324460615110, 0.673687308122224330, - -0.739016515969048600, - 0.673545591096136100, -0.739145680305957400, 0.673403849305701850, - -0.739274817466592520, - 0.673262082756132970, -0.739403927446205760, 0.673120291452642070, - -0.739533010240050250, - 0.672978475400442090, -0.739662065843379900, 0.672836634604747410, - -0.739791094251449950, - 0.672694769070772970, -0.739920095459516090, 0.672552878803734820, - -0.740049069462835550, - 0.672410963808849900, -0.740178016256666240, 0.672269024091336040, - -0.740306935836266940, - 0.672127059656411840, -0.740435828196898020, 0.671985070509296900, - -0.740564693333820250, - 0.671843056655211930, -0.740693531242295640, 0.671701018099378320, - -0.740822341917587330, - 0.671558954847018330, -0.740951125354959110, 0.671416866903355450, - -0.741079881549676080, - 0.671274754273613490, -0.741208610497004260, 0.671132616963017850, - -0.741337312192210660, - 0.670990454976794220, -0.741465986630563290, 0.670848268320169750, - -0.741594633807331150, - 0.670706056998372160, -0.741723253717784140, 0.670563821016630040, - -0.741851846357193480, - 0.670421560380173090, -0.741980411720830960, 0.670279275094231910, - -0.742108949803969800, - 0.670136965164037760, -0.742237460601884000, 0.669994630594823000, - -0.742365944109848460, - 0.669852271391821130, -0.742494400323139180, 0.669709887560265840, - -0.742622829237033380, - 0.669567479105392490, -0.742751230846809050, 0.669425046032436910, - -0.742879605147745090, - 0.669282588346636010, -0.743007952135121720, 0.669140106053227710, - -0.743136271804219820, - 0.668997599157450270, -0.743264564150321490, 0.668855067664543610, - -0.743392829168709970, - 0.668712511579748090, -0.743521066854669120, 0.668569930908305080, - -0.743649277203484060, - 0.668427325655456820, -0.743777460210440780, 0.668284695826446670, - -0.743905615870826490, - 0.668142041426518560, -0.744033744179929180, 0.667999362460917510, - -0.744161845133038070, - 0.667856658934889440, -0.744289918725443140, 0.667713930853681140, - -0.744417964952435620, - 0.667571178222540310, -0.744545983809307250, 0.667428401046715640, - -0.744673975291351600, - 0.667285599331456480, -0.744801939393862630, 0.667142773082013310, - -0.744929876112135350, - 0.666999922303637470, -0.745057785441465950, 0.666857047001581220, - -0.745185667377151640, - 0.666714147181097670, -0.745313521914490410, 0.666571222847440750, - -0.745441349048781680, - 0.666428274005865350, -0.745569148775325430, 0.666285300661627390, - -0.745696921089422760, - 0.666142302819983540, -0.745824665986375980, 0.665999280486191500, - -0.745952383461488180, - 0.665856233665509720, -0.746080073510063780, 0.665713162363197660, - -0.746207736127407650, - 0.665570066584515560, -0.746335371308826320, 0.665426946334724660, - -0.746462979049626770, - 0.665283801619087180, -0.746590559345117310, 0.665140632442866140, - -0.746718112190607020, - 0.664997438811325340, -0.746845637581406540, 0.664854220729729660, - -0.746973135512826740, - 0.664710978203344900, -0.747100605980180130, 0.664567711237437520, - -0.747228048978779920, - 0.664424419837275180, -0.747355464503940190, 0.664281104008126230, - -0.747482852550976570, - 0.664137763755260010, -0.747610213115205150, 0.663994399083946640, - -0.747737546191943330, - 0.663851009999457340, -0.747864851776509410, 0.663707596507064120, - -0.747992129864222700, - 0.663564158612039880, -0.748119380450403490, 0.663420696319658280, - -0.748246603530373420, - 0.663277209635194100, -0.748373799099454560, 0.663133698563923010, - -0.748500967152970430, - 0.662990163111121470, -0.748628107686245330, 0.662846603282066900, - -0.748755220694604760, - 0.662703019082037440, -0.748882306173375030, 0.662559410516312400, - -0.749009364117883770, - 0.662415777590171780, -0.749136394523459260, 0.662272120308896590, - -0.749263397385431020, - 0.662128438677768720, -0.749390372699129560, 0.661984732702071030, - -0.749517320459886170, - 0.661841002387086870, -0.749644240663033480, 0.661697247738101120, - -0.749771133303904990, - 0.661553468760399000, -0.749897998377835220, 0.661409665459266940, - -0.750024835880159780, - 0.661265837839992270, -0.750151645806214960, 0.661121985907862970, - -0.750278428151338610, - 0.660978109668168060, -0.750405182910869220, 0.660834209126197610, - -0.750531910080146410, - 0.660690284287242300, -0.750658609654510590, 0.660546335156593890, - -0.750785281629303580, - 0.660402361739545030, -0.750911925999867890, 0.660258364041389050, - -0.751038542761547250, - 0.660114342067420480, -0.751165131909686370, 0.659970295822934540, - -0.751291693439630870, - 0.659826225313227430, -0.751418227346727360, 0.659682130543596150, - -0.751544733626323570, - 0.659538011519338770, -0.751671212273768430, 0.659393868245753970, - -0.751797663284411440, - 0.659249700728141490, -0.751924086653603550, 0.659105508971802200, - -0.752050482376696360, - 0.658961292982037320, -0.752176850449042700, 0.658817052764149480, - -0.752303190865996400, - 0.658672788323441890, -0.752429503622912390, 0.658528499665218760, - -0.752555788715146390, - 0.658384186794785050, -0.752682046138055230, 0.658239849717446980, - -0.752808275886996950, - 0.658095488438511290, -0.752934477957330150, 0.657951102963285630, - -0.753060652344415100, - 0.657806693297078640, -0.753186799043612410, 0.657662259445200070, - -0.753312918050284330, - 0.657517801412960120, -0.753439009359793580, 0.657373319205670210, - -0.753565072967504190, - 0.657228812828642650, -0.753691108868781210, 0.657084282287190180, - -0.753817117058990680, - 0.656939727586627110, -0.753943097533499640, 0.656795148732268070, - -0.754069050287676120, - 0.656650545729429050, -0.754194975316889170, 0.656505918583426550, - -0.754320872616508820, - 0.656361267299578000, -0.754446742181906330, 0.656216591883202030, - -0.754572584008453840, - 0.656071892339617710, -0.754698398091524390, 0.655927168674145360, - -0.754824184426492240, - 0.655782420892106030, -0.754949943008732640, 0.655637648998821820, - -0.755075673833621510, - 0.655492852999615460, -0.755201376896536550, 0.655348032899810580, - -0.755327052192855560, - 0.655203188704731930, -0.755452699717958140, 0.655058320419704910, - -0.755578319467224540, - 0.654913428050056150, -0.755703911436035880, 0.654768511601112600, - -0.755829475619774760, - 0.654623571078202680, -0.755955012013824310, 0.654478606486655350, - -0.756080520613569120, - 0.654333617831800550, -0.756206001414394540, 0.654188605118969040, - -0.756331454411686920, - 0.654043568353492640, -0.756456879600833630, 0.653898507540703890, - -0.756582276977223470, - 0.653753422685936170, -0.756707646536245670, 0.653608313794523890, - -0.756832988273290820, - 0.653463180871802330, -0.756958302183750490, 0.653318023923107670, - -0.757083588263017140, - 0.653172842953776760, -0.757208846506484460, 0.653027637969147650, - -0.757334076909547130, - 0.652882408974558960, -0.757459279467600720, 0.652737155975350420, - -0.757584454176041810, - 0.652591878976862550, -0.757709601030268080, 0.652446577984436840, - -0.757834720025678310, - 0.652301253003415460, -0.757959811157672300, 0.652155904039141700, - -0.758084874421650620, - 0.652010531096959500, -0.758209909813015280, 0.651865134182214030, - -0.758334917327168960, - 0.651719713300251020, -0.758459896959515320, 0.651574268456417080, - -0.758584848705459500, - 0.651428799656059820, -0.758709772560407390, 0.651283306904527850, - -0.758834668519765660, - 0.651137790207170330, -0.758959536578942440, 0.650992249569337660, - -0.759084376733346500, - 0.650846684996380990, -0.759209188978387960, 0.650701096493652040, - -0.759333973309477940, - 0.650555484066503990, -0.759458729722028210, 0.650409847720290420, - -0.759583458211452010, - 0.650264187460365960, -0.759708158773163440, 0.650118503292086200, - -0.759832831402577400, - 0.649972795220807530, -0.759957476095110330, 0.649827063251887100, - -0.760082092846179220, - 0.649681307390683190, -0.760206681651202420, 0.649535527642554730, - -0.760331242505599030, - 0.649389724012861770, -0.760455775404789260, 0.649243896506965010, - -0.760580280344194340, - 0.649098045130226060, -0.760704757319236920, 0.648952169888007410, - -0.760829206325340010, - 0.648806270785672550, -0.760953627357928040, 0.648660347828585840, - -0.761078020412426560, - 0.648514401022112550, -0.761202385484261780, 0.648368430371618400, - -0.761326722568861250, - 0.648222435882470420, -0.761451031661653510, 0.648076417560036530, - -0.761575312758068000, - 0.647930375409685460, -0.761699565853535270, 0.647784309436786550, - -0.761823790943486840, - 0.647638219646710420, -0.761947988023355390, 0.647492106044828100, - -0.762072157088574560, - 0.647345968636512060, -0.762196298134578900, 0.647199807427135230, - -0.762320411156804160, - 0.647053622422071650, -0.762444496150687100, 0.646907413626696020, - -0.762568553111665380, - 0.646761181046383920, -0.762692582035177870, 0.646614924686512050, - -0.762816582916664320, - 0.646468644552457890, -0.762940555751565720, 0.646322340649599590, - -0.763064500535323710, - 0.646176012983316390, -0.763188417263381270, 0.646029661558988330, - -0.763312305931182380, - 0.645883286381996440, -0.763436166534172010, 0.645736887457722290, - -0.763559999067796150, - 0.645590464791548800, -0.763683803527501870, 0.645444018388859230, - -0.763807579908737160, - 0.645297548255038380, -0.763931328206951090, 0.645151054395471270, - -0.764055048417593860, - 0.645004536815544040, -0.764178740536116670, 0.644857995520643710, - -0.764302404557971720, - 0.644711430516158420, -0.764426040478612070, 0.644564841807476750, - -0.764549648293492150, - 0.644418229399988380, -0.764673227998067140, 0.644271593299083900, - -0.764796779587793460, - 0.644124933510154540, -0.764920303058128410, 0.643978250038592660, - -0.765043798404530410, - 0.643831542889791500, -0.765167265622458960, 0.643684812069144960, - -0.765290704707374260, - 0.643538057582047850, -0.765414115654738160, 0.643391279433895960, - -0.765537498460013070, - 0.643244477630085850, -0.765660853118662390, 0.643097652176015110, - -0.765784179626150970, - 0.642950803077082080, -0.765907477977944230, 0.642803930338686100, - -0.766030748169509000, - 0.642657033966226860, -0.766153990196312810, 0.642510113965105710, - -0.766277204053824710, - 0.642363170340724320, -0.766400389737514120, 0.642216203098485370, - -0.766523547242852100, - 0.642069212243792540, -0.766646676565310380, 0.641922197782050170, - -0.766769777700361920, - 0.641775159718663500, -0.766892850643480670, 0.641628098059038860, - -0.767015895390141480, - 0.641481012808583160, -0.767138911935820400, 0.641333903972704290, - -0.767261900275994390, - 0.641186771556811250, -0.767384860406141620, 0.641039615566313390, - -0.767507792321741270, - 0.640892436006621380, -0.767630696018273270, 0.640745232883146440, - -0.767753571491219030, - 0.640598006201301030, -0.767876418736060610, 0.640450755966498140, - -0.767999237748281270, - 0.640303482184151670, -0.768122028523365310, 0.640156184859676620, - -0.768244791056798220, - 0.640008863998488440, -0.768367525344066270, 0.639861519606004010, - -0.768490231380656750, - 0.639714151687640450, -0.768612909162058270, 0.639566760248816420, - -0.768735558683760310, - 0.639419345294950700, -0.768858179941253270, 0.639271906831463510, - -0.768980772930028870, - 0.639124444863775730, -0.769103337645579590, 0.638976959397309140, - -0.769225874083399260, - 0.638829450437486400, -0.769348382238982280, 0.638681917989730840, - -0.769470862107824560, - 0.638534362059466790, -0.769593313685422940, 0.638386782652119680, - -0.769715736967275020, - 0.638239179773115390, -0.769838131948879840, 0.638091553427880930, - -0.769960498625737230, - 0.637943903621844170, -0.770082836993347900, 0.637796230360433540, - -0.770205147047214100, - 0.637648533649078810, -0.770327428782838770, 0.637500813493210310, - -0.770449682195725960, - 0.637353069898259130, -0.770571907281380700, 0.637205302869657600, - -0.770694104035309140, - 0.637057512412838590, -0.770816272453018430, 0.636909698533235870, - -0.770938412530016940, - 0.636761861236284200, -0.771060524261813710, 0.636614000527419230, - -0.771182607643919220, - 0.636466116412077180, -0.771304662671844720, 0.636318208895695570, - -0.771426689341102590, - 0.636170277983712170, -0.771548687647206300, 0.636022323681566300, - -0.771670657585670330, - 0.635874345994697720, -0.771792599152010150, 0.635726344928547180, - -0.771914512341742350, - 0.635578320488556230, -0.772036397150384410, 0.635430272680167160, - -0.772158253573455240, - 0.635282201508823530, -0.772280081606474320, 0.635134106979969300, - -0.772401881244962340, - 0.634985989099049460, -0.772523652484441330, 0.634837847871510100, - -0.772645395320433860, - 0.634689683302797850, -0.772767109748463740, 0.634541495398360130, - -0.772888795764056220, - 0.634393284163645490, -0.773010453362736990, 0.634245049604103330, - -0.773132082540033070, - 0.634096791725183740, -0.773253683291472590, 0.633948510532337810, - -0.773375255612584470, - 0.633800206031017280, -0.773496799498899050, 0.633651878226674900, - -0.773618314945947460, - 0.633503527124764320, -0.773739801949261840, 0.633355152730740060, - -0.773861260504375540, - 0.633206755050057190, -0.773982690606822790, 0.633058334088172250, - -0.774104092252138940, - 0.632909889850541860, -0.774225465435860570, 0.632761422342624000, - -0.774346810153525020, - 0.632612931569877520, -0.774468126400670860, 0.632464417537761840, - -0.774589414172837550, - 0.632315880251737680, -0.774710673465565550, 0.632167319717266030, - -0.774831904274396850, - 0.632018735939809060, -0.774953106594873820, 0.631870128924829850, - -0.775074280422540450, - 0.631721498677792370, -0.775195425752941310, 0.631572845204161130, - -0.775316542581622410, - 0.631424168509401860, -0.775437630904130430, 0.631275468598980870, - -0.775558690716013580, - 0.631126745478365340, -0.775679722012820540, 0.630977999153023660, - -0.775800724790101540, - 0.630829229628424470, -0.775921699043407580, 0.630680436910038060, - -0.776042644768290770, - 0.630531621003334600, -0.776163561960304340, 0.630382781913785940, - -0.776284450615002400, - 0.630233919646864480, -0.776405310727940390, 0.630085034208043290, - -0.776526142294674430, - 0.629936125602796550, -0.776646945310762060, 0.629787193836599200, - -0.776767719771761510, - 0.629638238914927100, -0.776888465673232440, 0.629489260843256740, - -0.777009183010735290, - 0.629340259627065750, -0.777129871779831620, 0.629191235271832410, - -0.777250531976084070, - 0.629042187783036000, -0.777371163595056200, 0.628893117166156480, - -0.777491766632312900, - 0.628744023426674790, -0.777612341083419920, 0.628594906570072660, - -0.777732886943944050, - 0.628445766601832710, -0.777853404209453040, 0.628296603527438440, - -0.777973892875515990, - 0.628147417352374120, -0.778094352937702790, 0.627998208082124810, - -0.778214784391584420, - 0.627848975722176570, -0.778335187232733090, 0.627699720278016240, - -0.778455561456721900, - 0.627550441755131530, -0.778575907059124940, 0.627401140159011160, - -0.778696224035517530, - 0.627251815495144190, -0.778816512381475870, 0.627102467769021010, - -0.778936772092577500, - 0.626953096986132770, -0.779057003164400630, 0.626803703151971310, - -0.779177205592524680, - 0.626654286272029460, -0.779297379372530300, 0.626504846351800930, - -0.779417524499998900, - 0.626355383396779990, -0.779537640970513150, 0.626205897412462130, - -0.779657728779656780, - 0.626056388404343520, -0.779777787923014440, 0.625906856377921210, - -0.779897818396171890, - 0.625757301338692900, -0.780017820194715990, 0.625607723292157410, - -0.780137793314234500, - 0.625458122243814360, -0.780257737750316590, 0.625308498199164010, - -0.780377653498552040, - 0.625158851163707730, -0.780497540554531910, 0.625009181142947460, - -0.780617398913848290, - 0.624859488142386450, -0.780737228572094380, 0.624709772167528100, - -0.780857029524864470, - 0.624560033223877320, -0.780976801767753750, 0.624410271316939380, - -0.781096545296358410, - 0.624260486452220650, -0.781216260106276090, 0.624110678635228510, - -0.781335946193104870, - 0.623960847871470770, -0.781455603552444480, 0.623810994166456130, - -0.781575232179895550, - 0.623661117525694640, -0.781694832071059390, 0.623511217954696550, - -0.781814403221538830, - 0.623361295458973340, -0.781933945626937630, 0.623211350044037270, - -0.782053459282860300, - 0.623061381715401370, -0.782172944184912900, 0.622911390478579460, - -0.782292400328702400, - 0.622761376339086460, -0.782411827709836420, 0.622611339302437730, - -0.782531226323924240, - 0.622461279374150080, -0.782650596166575730, 0.622311196559740320, - -0.782769937233402050, - 0.622161090864726930, -0.782889249520015480, 0.622010962294628600, - -0.783008533022029110, - 0.621860810854965360, -0.783127787735057310, 0.621710636551257690, - -0.783247013654715380, - 0.621560439389027270, -0.783366210776619720, 0.621410219373796150, - -0.783485379096387820, - 0.621259976511087660, -0.783604518609638200, 0.621109710806425740, - -0.783723629311990470, - 0.620959422265335180, -0.783842711199065230, 0.620809110893341900, - -0.783961764266484010, - 0.620658776695972140, -0.784080788509869950, 0.620508419678753360, - -0.784199783924846570, - 0.620358039847213830, -0.784318750507038920, 0.620207637206882430, - -0.784437688252072720, - 0.620057211763289210, -0.784556597155575240, 0.619906763521964830, - -0.784675477213174320, - 0.619756292488440660, -0.784794328420499230, 0.619605798668249390, - -0.784913150773180020, - 0.619455282066924020, -0.785031944266848080, 0.619304742689998690, - -0.785150708897135560, - 0.619154180543008410, -0.785269444659675850, 0.619003595631488770, - -0.785388151550103550, - 0.618852987960976320, -0.785506829564053930, 0.618702357537008640, - -0.785625478697163700, - 0.618551704365123860, -0.785744098945070360, 0.618401028450860980, - -0.785862690303412600, - 0.618250329799760250, -0.785981252767830150, 0.618099608417362110, - -0.786099786333963820, - 0.617948864309208260, -0.786218290997455550, 0.617798097480841140, - -0.786336766753948260, - 0.617647307937803980, -0.786455213599085770, 0.617496495685640910, - -0.786573631528513230, - 0.617345660729896940, -0.786692020537876680, 0.617194803076117630, - -0.786810380622823490, - 0.617043922729849760, -0.786928711779001700, 0.616893019696640790, - -0.787047014002060790, - 0.616742093982038830, -0.787165287287650890, 0.616591145591593230, - -0.787283531631423620, - 0.616440174530853650, -0.787401747029031320, 0.616289180805370980, - -0.787519933476127810, - 0.616138164420696910, -0.787638090968367450, 0.615987125382383870, - -0.787756219501405950, - 0.615836063695985090, -0.787874319070900110, 0.615684979367054570, - -0.787992389672507950, - 0.615533872401147430, -0.788110431301888070, 0.615382742803819330, - -0.788228443954700490, - 0.615231590580626820, -0.788346427626606230, 0.615080415737127460, - -0.788464382313267430, - 0.614929218278879590, -0.788582308010347120, 0.614777998211442190, - -0.788700204713509660, - 0.614626755540375050, -0.788818072418420170, 0.614475490271239160, - -0.788935911120745130, - 0.614324202409595950, -0.789053720816151880, 0.614172891961007990, - -0.789171501500308790, - 0.614021558931038490, -0.789289253168885650, 0.613870203325251440, - -0.789406975817552810, - 0.613718825149211830, -0.789524669441982190, 0.613567424408485330, - -0.789642334037846340, - 0.613416001108638590, -0.789759969600819070, 0.613264555255239150, - -0.789877576126575280, - 0.613113086853854910, -0.789995153610791090, 0.612961595910055170, - -0.790112702049143300, - 0.612810082429409710, -0.790230221437310030, 0.612658546417489290, - -0.790347711770970520, - 0.612506987879865570, -0.790465173045804880, 0.612355406822110760, - -0.790582605257494460, - 0.612203803249798060, -0.790700008401721610, 0.612052177168501580, - -0.790817382474169660, - 0.611900528583796070, -0.790934727470523290, 0.611748857501257400, - -0.791052043386467950, - 0.611597163926462020, -0.791169330217690090, 0.611445447864987110, - -0.791286587959877720, - 0.611293709322411010, -0.791403816608719500, 0.611141948304312570, - -0.791521016159905220, - 0.610990164816271770, -0.791638186609125770, 0.610838358863869280, - -0.791755327952073150, - 0.610686530452686280, -0.791872440184440470, 0.610534679588305320, - -0.791989523301921850, - 0.610382806276309480, -0.792106577300212390, 0.610230910522282620, - -0.792223602175008310, - 0.610078992331809620, -0.792340597922007060, 0.609927051710476230, - -0.792457564536906970, - 0.609775088663868430, -0.792574502015407580, 0.609623103197573730, - -0.792691410353209450, - 0.609471095317180240, -0.792808289546014120, 0.609319065028276820, - -0.792925139589524260, - 0.609167012336453210, -0.793041960479443640, 0.609014937247299940, - -0.793158752211477140, - 0.608862839766408200, -0.793275514781330630, 0.608710719899370420, - -0.793392248184711100, - 0.608558577651779450, -0.793508952417326660, 0.608406413029229260, - -0.793625627474886190, - 0.608254226037314490, -0.793742273353100100, 0.608102016681630550, - -0.793858890047679620, - 0.607949784967773740, -0.793975477554337170, 0.607797530901341140, - -0.794092035868785960, - 0.607645254487930830, -0.794208564986740640, 0.607492955733141660, - -0.794325064903916520, - 0.607340634642572930, -0.794441535616030590, 0.607188291221825160, - -0.794557977118800270, - 0.607035925476499760, -0.794674389407944550, 0.606883537412198580, - -0.794790772479183170, - 0.606731127034524480, -0.794907126328237010, 0.606578694349081400, - -0.795023450950828050, - 0.606426239361473550, -0.795139746342679590, 0.606273762077306430, - -0.795256012499515500, - 0.606121262502186230, -0.795372249417061190, 0.605968740641719790, - -0.795488457091042990, - 0.605816196501515080, -0.795604635517188070, 0.605663630087180490, - -0.795720784691225090, - 0.605511041404325550, -0.795836904608883460, 0.605358430458560530, - -0.795952995265893910, - 0.605205797255496500, -0.796069056657987990, 0.605053141800745430, - -0.796185088780898440, - 0.604900464099919930, -0.796301091630359110, 0.604747764158633410, - -0.796417065202104980, - 0.604595041982500360, -0.796533009491872000, 0.604442297577135970, - -0.796648924495397150, - 0.604289530948156070, -0.796764810208418720, 0.604136742101177630, - -0.796880666626675780, - 0.603983931041818020, -0.796996493745908750, 0.603831097775695880, - -0.797112291561858920, - 0.603678242308430370, -0.797228060070268700, 0.603525364645641550, - -0.797343799266881700, - 0.603372464792950370, -0.797459509147442460, 0.603219542755978440, - -0.797575189707696590, - 0.603066598540348280, -0.797690840943391040, 0.602913632151683140, - -0.797806462850273570, - 0.602760643595607220, -0.797922055424093000, 0.602607632877745550, - -0.798037618660599410, - 0.602454600003723860, -0.798153152555543750, 0.602301544979168550, - -0.798268657104678310, - 0.602148467809707320, -0.798384132303756380, 0.601995368500968130, - -0.798499578148532010, - 0.601842247058580030, -0.798614994634760820, 0.601689103488173060, - -0.798730381758199210, - 0.601535937795377730, -0.798845739514604580, 0.601382749985825420, - -0.798961067899735760, - 0.601229540065148620, -0.799076366909352350, 0.601076308038980160, - -0.799191636539215210, - 0.600923053912954090, -0.799306876785086160, 0.600769777692705230, - -0.799422087642728040, - 0.600616479383868970, -0.799537269107905010, 0.600463158992081690, - -0.799652421176382130, - 0.600309816522980430, -0.799767543843925680, 0.600156451982203350, - -0.799882637106302810, - 0.600003065375389060, -0.799997700959281910, 0.599849656708177360, - -0.800112735398632370, - 0.599696225986208310, -0.800227740420124790, 0.599542773215123390, - -0.800342716019530660, - 0.599389298400564540, -0.800457662192622710, 0.599235801548174570, - -0.800572578935174750, - 0.599082282663597310, -0.800687466242961500, 0.598928741752476900, - -0.800802324111759110, - 0.598775178820458720, -0.800917152537344300, 0.598621593873188920, - -0.801031951515495330, - 0.598467986916314310, -0.801146721041991250, 0.598314357955482600, - -0.801261461112612540, - 0.598160706996342380, -0.801376171723140130, 0.598007034044542700, - -0.801490852869356840, - 0.597853339105733910, -0.801605504547046040, 0.597699622185566830, - -0.801720126751992330, - 0.597545883289693270, -0.801834719479981310, 0.597392122423765710, - -0.801949282726799660, - 0.597238339593437530, -0.802063816488235440, 0.597084534804362740, - -0.802178320760077450, - 0.596930708062196500, -0.802292795538115720, 0.596776859372594500, - -0.802407240818141300, - 0.596622988741213330, -0.802521656595946320, 0.596469096173710360, - -0.802636042867324150, - 0.596315181675743820, -0.802750399628069160, 0.596161245252972540, - -0.802864726873976590, - 0.596007286911056530, -0.802979024600843140, 0.595853306655656390, - -0.803093292804466400, - 0.595699304492433470, -0.803207531480644830, 0.595545280427049790, - -0.803321740625178470, - 0.595391234465168730, -0.803435920233868120, 0.595237166612453850, - -0.803550070302515570, - 0.595083076874569960, -0.803664190826924090, 0.594928965257182420, - -0.803778281802897570, - 0.594774831765957580, -0.803892343226241260, 0.594620676406562240, - -0.804006375092761520, - 0.594466499184664540, -0.804120377398265700, 0.594312300105932830, - -0.804234350138562260, - 0.594158079176036800, -0.804348293309460780, 0.594003836400646690, - -0.804462206906771840, - 0.593849571785433630, -0.804576090926307000, 0.593695285336069300, - -0.804689945363879500, - 0.593540977058226390, -0.804803770215302810, 0.593386646957578480, - -0.804917565476392150, - 0.593232295039799800, -0.805031331142963660, 0.593077921310565580, - -0.805145067210834120, - 0.592923525775551410, -0.805258773675822210, 0.592769108440434070, - -0.805372450533747060, - 0.592614669310891130, -0.805486097780429120, 0.592460208392600940, - -0.805599715411689950, - 0.592305725691242400, -0.805713303423352120, 0.592151221212495640, - -0.805826861811239300, - 0.591996694962040990, -0.805940390571176280, 0.591842146945560250, - -0.806053889698988950, - 0.591687577168735550, -0.806167359190504310, 0.591532985637249990, - -0.806280799041550370, - 0.591378372356787580, -0.806394209247956240, 0.591223737333032910, - -0.806507589805552260, - 0.591069080571671510, -0.806620940710169650, 0.590914402078389520, - -0.806734261957640750, - 0.590759701858874280, -0.806847553543799220, 0.590604979918813440, - -0.806960815464479620, - 0.590450236263895920, -0.807074047715517610, 0.590295470899810940, - -0.807187250292749850, - 0.590140683832248940, -0.807300423192014450, 0.589985875066900920, - -0.807413566409150190, - 0.589831044609458900, -0.807526679939997160, 0.589676192465615420, - -0.807639763780396370, - 0.589521318641063940, -0.807752817926190360, 0.589366423141498790, - -0.807865842373222120, - 0.589211505972615070, -0.807978837117336310, 0.589056567140108460, - -0.808091802154378260, - 0.588901606649675840, -0.808204737480194720, 0.588746624507014650, - -0.808317643090633250, - 0.588591620717822890, -0.808430518981542720, 0.588436595287799900, - -0.808543365148773010, - 0.588281548222645330, -0.808656181588174980, 0.588126479528059850, - -0.808768968295600850, - 0.587971389209745120, -0.808881725266903610, 0.587816277273403020, - -0.808994452497937560, - 0.587661143724736770, -0.809107149984558130, 0.587505988569450020, - -0.809219817722621750, - 0.587350811813247660, -0.809332455707985840, 0.587195613461834910, - -0.809445063936509170, - 0.587040393520918080, -0.809557642404051260, 0.586885151996203950, - -0.809670191106473090, - 0.586729888893400500, -0.809782710039636420, 0.586574604218216280, - -0.809895199199404450, - 0.586419297976360500, -0.810007658581641140, 0.586263970173543700, - -0.810120088182211600, - 0.586108620815476430, -0.810232487996982330, 0.585953249907870680, - -0.810344858021820550, - 0.585797857456438860, -0.810457198252594770, 0.585642443466894420, - -0.810569508685174630, - 0.585487007944951450, -0.810681789315430670, 0.585331550896324940, - -0.810794040139234730, - 0.585176072326730410, -0.810906261152459670, 0.585020572241884530, - -0.811018452350979470, - 0.584865050647504490, -0.811130613730669190, 0.584709507549308500, - -0.811242745287404810, - 0.584553942953015330, -0.811354847017063730, 0.584398356864344710, - -0.811466918915524250, - 0.584242749289016980, -0.811578960978665890, 0.584087120232753550, - -0.811690973202369050, - 0.583931469701276300, -0.811802955582515360, 0.583775797700308070, - -0.811914908114987680, - 0.583620104235572760, -0.812026830795669730, 0.583464389312794430, - -0.812138723620446480, - 0.583308652937698290, -0.812250586585203880, 0.583152895116010540, - -0.812362419685829120, - 0.582997115853457700, -0.812474222918210480, 0.582841315155767650, - -0.812585996278237020, - 0.582685493028668460, -0.812697739761799490, 0.582529649477889320, - -0.812809453364789160, - 0.582373784509160220, -0.812921137083098770, 0.582217898128211790, - -0.813032790912621930, - 0.582061990340775550, -0.813144414849253590, 0.581906061152583920, - -0.813256008888889380, - 0.581750110569369760, -0.813367573027426570, 0.581594138596866930, - -0.813479107260763220, - 0.581438145240810280, -0.813590611584798510, 0.581282130506935110, - -0.813702085995432700, - 0.581126094400977620, -0.813813530488567190, 0.580970036928674880, - -0.813924945060104490, - 0.580813958095764530, -0.814036329705948300, 0.580657857907985410, - -0.814147684422003360, - 0.580501736371076600, -0.814259009204175270, 0.580345593490778300, - -0.814370304048371070, - 0.580189429272831680, -0.814481568950498610, 0.580033243722978150, - -0.814592803906467270, - 0.579877036846960350, -0.814704008912187080, 0.579720808650521560, - -0.814815183963569330, - 0.579564559139405740, -0.814926329056526620, 0.579408288319357980, - -0.815037444186972220, - 0.579251996196123550, -0.815148529350820830, 0.579095682775449210, - -0.815259584543988280, - 0.578939348063081890, -0.815370609762391290, 0.578782992064769690, - -0.815481605001947770, - 0.578626614786261430, -0.815592570258576680, 0.578470216233306740, - -0.815703505528198260, - 0.578313796411655590, -0.815814410806733780, 0.578157355327059360, - -0.815925286090105390, - 0.578000892985269910, -0.816036131374236700, 0.577844409392039850, - -0.816146946655052160, - 0.577687904553122800, -0.816257731928477390, 0.577531378474272830, - -0.816368487190439200, - 0.577374831161244880, -0.816479212436865390, 0.577218262619794920, - -0.816589907663684890, - 0.577061672855679550, -0.816700572866827850, 0.576905061874655960, - -0.816811208042225290, - 0.576748429682482520, -0.816921813185809480, 0.576591776284917870, - -0.817032388293513880, - 0.576435101687721830, -0.817142933361272970, 0.576278405896654910, - -0.817253448385022230, - 0.576121688917478390, -0.817363933360698460, 0.575964950755954330, - -0.817474388284239240, - 0.575808191417845340, -0.817584813151583710, 0.575651410908915250, - -0.817695207958671680, - 0.575494609234928230, -0.817805572701444270, 0.575337786401649560, - -0.817915907375843740, - 0.575180942414845190, -0.818026211977813440, 0.575024077280281820, - -0.818136486503297620, - 0.574867191003726740, -0.818246730948241960, 0.574710283590948450, - -0.818356945308593150, - 0.574553355047715760, -0.818467129580298660, 0.574396405379798750, - -0.818577283759307490, - 0.574239434592967890, -0.818687407841569570, 0.574082442692994470, - -0.818797501823036010, - 0.573925429685650750, -0.818907565699658950, 0.573768395576709560, - -0.819017599467391500, - 0.573611340371944610, -0.819127603122188240, 0.573454264077130400, - -0.819237576660004520, - 0.573297166698042320, -0.819347520076796900, 0.573140048240456060, - -0.819457433368523280, - 0.572982908710148680, -0.819567316531142230, 0.572825748112897550, - -0.819677169560613760, - 0.572668566454481160, -0.819786992452898990, 0.572511363740678790, - -0.819896785203959810, - 0.572354139977270030, -0.820006547809759680, 0.572196895170035580, - -0.820116280266262710, - 0.572039629324757050, -0.820225982569434690, 0.571882342447216590, - -0.820335654715241840, - 0.571725034543197120, -0.820445296699652050, 0.571567705618482580, - -0.820554908518633890, - 0.571410355678857340, -0.820664490168157460, 0.571252984730106660, - -0.820774041644193650, - 0.571095592778016690, -0.820883562942714580, 0.570938179828374360, - -0.820993054059693470, - 0.570780745886967370, -0.821102514991104650, 0.570623290959583860, - -0.821211945732923550, - 0.570465815052012990, -0.821321346281126740, 0.570308318170045010, - -0.821430716631691760, - 0.570150800319470300, -0.821540056780597610, 0.569993261506080650, - -0.821649366723823830, - 0.569835701735668110, -0.821758646457351640, 0.569678121014025710, - -0.821867895977163140, - 0.569520519346947250, -0.821977115279241550, 0.569362896740227330, - -0.822086304359571090, - 0.569205253199661200, -0.822195463214137170, 0.569047588731045220, - -0.822304591838926350, - 0.568889903340175970, -0.822413690229926390, 0.568732197032851160, - -0.822522758383125940, - 0.568574469814869250, -0.822631796294514990, 0.568416721692029390, - -0.822740803960084420, - 0.568258952670131490, -0.822849781375826320, 0.568101162754976570, - -0.822958728537734000, - 0.567943351952365670, -0.823067645441801670, 0.567785520268101250, - -0.823176532084024860, - 0.567627667707986230, -0.823285388460400110, 0.567469794277824620, - -0.823394214566925080, - 0.567311899983420800, -0.823503010399598390, 0.567153984830580100, - -0.823611775954420260, - 0.566996048825108680, -0.823720511227391320, 0.566838091972813320, - -0.823829216214513990, - 0.566680114279501710, -0.823937890911791370, 0.566522115750982100, - -0.824046535315227760, - 0.566364096393063950, -0.824155149420828570, 0.566206056211556840, - -0.824263733224600450, - 0.566047995212271560, -0.824372286722551250, 0.565889913401019570, - -0.824480809910689500, - 0.565731810783613230, -0.824589302785025290, 0.565573687365865440, - -0.824697765341569470, - 0.565415543153589770, -0.824806197576334330, 0.565257378152600910, - -0.824914599485333080, - 0.565099192368714090, -0.825022971064580220, 0.564940985807745320, - -0.825131312310090960, - 0.564782758475511400, -0.825239623217882130, 0.564624510377830120, - -0.825347903783971380, - 0.564466241520519500, -0.825456154004377440, 0.564307951909398750, - -0.825564373875120490, - 0.564149641550287680, -0.825672563392221390, 0.563991310449007080, - -0.825780722551702430, - 0.563832958611378170, -0.825888851349586780, 0.563674586043223180, - -0.825996949781898970, - 0.563516192750364910, -0.826105017844664610, 0.563357778738627020, - -0.826213055533910110, - 0.563199344013834090, -0.826321062845663420, 0.563040888581811230, - -0.826429039775953390, - 0.562882412448384550, -0.826536986320809960, 0.562723915619380400, - -0.826644902476264210, - 0.562565398100626560, -0.826752788238348520, 0.562406859897951140, - -0.826860643603096080, - 0.562248301017183150, -0.826968468566541490, 0.562089721464152480, - -0.827076263124720270, - 0.561931121244689470, -0.827184027273669020, 0.561772500364625450, - -0.827291761009425810, - 0.561613858829792420, -0.827399464328029350, 0.561455196646023280, - -0.827507137225519830, - 0.561296513819151470, -0.827614779697938400, 0.561137810355011530, - -0.827722391741327220, - 0.560979086259438260, -0.827829973351729810, 0.560820341538267540, - -0.827937524525190870, - 0.560661576197336030, -0.828045045257755800, 0.560502790242481060, - -0.828152535545471410, - 0.560343983679540860, -0.828259995384385550, 0.560185156514354080, - -0.828367424770547480, - 0.560026308752760380, -0.828474823700007130, 0.559867440400600320, - -0.828582192168815790, - 0.559708551463714790, -0.828689530173025710, 0.559549641947945870, - -0.828796837708690610, - 0.559390711859136140, -0.828904114771864870, 0.559231761203129010, - -0.829011361358604430, - 0.559072789985768480, -0.829118577464965980, 0.558913798212899770, - -0.829225763087007570, - 0.558754785890368310, -0.829332918220788250, 0.558595753024020760, - -0.829440042862368170, - 0.558436699619704100, -0.829547137007808800, 0.558277625683266330, - -0.829654200653172640, - 0.558118531220556100, -0.829761233794523050, 0.557959416237422960, - -0.829868236427924840, - 0.557800280739717100, -0.829975208549443840, 0.557641124733289420, - -0.830082150155146970, - 0.557481948223991660, -0.830189061241102370, 0.557322751217676160, - -0.830295941803379070, - 0.557163533720196340, -0.830402791838047550, 0.557004295737406060, - -0.830509611341179070, - 0.556845037275160100, -0.830616400308846200, 0.556685758339313890, - -0.830723158737122880, - 0.556526458935723720, -0.830829886622083570, 0.556367139070246490, - -0.830936583959804410, - 0.556207798748739930, -0.831043250746362320, 0.556048437977062720, - -0.831149886977835430, - 0.555889056761073920, -0.831256492650303210, 0.555729655106633520, - -0.831363067759845920, - 0.555570233019602290, -0.831469612302545240, 0.555410790505841740, - -0.831576126274483630, - 0.555251327571214090, -0.831682609671745120, 0.555091844221582420, - -0.831789062490414400, - 0.554932340462810370, -0.831895484726577590, 0.554772816300762580, - -0.832001876376321840, - 0.554613271741304040, -0.832108237435735480, 0.554453706790301040, - -0.832214567900907980, - 0.554294121453620110, -0.832320867767929680, 0.554134515737128910, - -0.832427137032892280, - 0.553974889646695610, -0.832533375691888680, 0.553815243188189090, - -0.832639583741012770, - 0.553655576367479310, -0.832745761176359460, 0.553495889190436570, - -0.832851907994024980, - 0.553336181662932410, -0.832958024190106670, 0.553176453790838460, - -0.833064109760702890, - 0.553016705580027580, -0.833170164701913190, 0.552856937036373290, - -0.833276189009838240, - 0.552697148165749770, -0.833382182680579730, 0.552537338974032120, - -0.833488145710240770, - 0.552377509467096070, -0.833594078094925140, 0.552217659650817930, - -0.833699979830738290, - 0.552057789531074980, -0.833805850913786340, 0.551897899113745320, - -0.833911691340176730, - 0.551737988404707450, -0.834017501106018130, 0.551578057409841000, - -0.834123280207419990, - 0.551418106135026060, -0.834229028640493420, 0.551258134586143700, - -0.834334746401350080, - 0.551098142769075430, -0.834440433486103190, 0.550938130689703880, - -0.834546089890866760, - 0.550778098353912230, -0.834651715611756330, 0.550618045767584330, - -0.834757310644888230, - 0.550457972936604810, -0.834862874986380010, 0.550297879866859190, - -0.834968408632350450, - 0.550137766564233630, -0.835073911578919300, 0.549977633034615000, - -0.835179383822207580, - 0.549817479283891020, -0.835284825358337370, 0.549657305317949980, - -0.835390236183431780, - 0.549497111142680960, -0.835495616293615350, 0.549336896763974010, - -0.835600965685013410, - 0.549176662187719770, -0.835706284353752600, 0.549016407419809390, - -0.835811572295960590, - 0.548856132466135290, -0.835916829507766360, 0.548695837332590090, - -0.836022055985299880, - 0.548535522025067390, -0.836127251724692160, 0.548375186549461600, - -0.836232416722075600, - 0.548214830911667780, -0.836337550973583530, 0.548054455117581880, - -0.836442654475350380, - 0.547894059173100190, -0.836547727223511890, 0.547733643084120200, - -0.836652769214204950, - 0.547573206856539870, -0.836757780443567190, 0.547412750496257930, - -0.836862760907737810, - 0.547252274009174090, -0.836967710602857020, 0.547091777401188530, - -0.837072629525066000, - 0.546931260678202190, -0.837177517670507190, 0.546770723846116800, - -0.837282375035324320, - 0.546610166910834860, -0.837387201615661940, 0.546449589878259760, - -0.837491997407665890, - 0.546288992754295210, -0.837596762407483040, 0.546128375544846060, - -0.837701496611261700, - 0.545967738255817680, -0.837806200015150940, 0.545807080893116140, - -0.837910872615301060, - 0.545646403462648590, -0.838015514407863700, 0.545485705970322530, - -0.838120125388991500, - 0.545324988422046460, -0.838224705554837970, 0.545164250823729320, - -0.838329254901558300, - 0.545003493181281160, -0.838433773425308340, 0.544842715500612470, - -0.838538261122245170, - 0.544681917787634530, -0.838642717988527300, 0.544521100048259710, - -0.838747144020313920, - 0.544360262288400400, -0.838851539213765760, 0.544199404513970420, - -0.838955903565044350, - 0.544038526730883930, -0.839060237070312630, 0.543877628945055980, - -0.839164539725734570, - 0.543716711162402390, -0.839268811527475230, 0.543555773388839650, - -0.839373052471700690, - 0.543394815630284800, -0.839477262554578550, 0.543233837892656000, - -0.839581441772277120, - 0.543072840181871850, -0.839685590120966110, 0.542911822503851730, - -0.839789707596816260, - 0.542750784864516000, -0.839893794195999410, 0.542589727269785270, - -0.839997849914688730, - 0.542428649725581360, -0.840101874749058400, 0.542267552237826520, - -0.840205868695283580, - 0.542106434812444030, -0.840309831749540770, 0.541945297455357470, - -0.840413763908007480, - 0.541784140172491660, -0.840517665166862440, 0.541622962969771640, - -0.840621535522285690, - 0.541461765853123560, -0.840725374970458070, 0.541300548828474120, - -0.840829183507561640, - 0.541139311901750910, -0.840932961129779670, 0.540978055078882190, - -0.841036707833296650, - 0.540816778365796670, -0.841140423614298080, 0.540655481768424260, - -0.841244108468970580, - 0.540494165292695230, -0.841347762393501950, 0.540332828944540820, - -0.841451385384081260, - 0.540171472729892970, -0.841554977436898330, 0.540010096654684020, - -0.841658538548144760, - 0.539848700724847700, -0.841762068714012490, 0.539687284946317570, - -0.841865567930695340, - 0.539525849325029010, -0.841969036194387680, 0.539364393866917150, - -0.842072473501285450, - 0.539202918577918240, -0.842175879847585570, 0.539041423463969550, - -0.842279255229485880, - 0.538879908531008420, -0.842382599643185960, 0.538718373784973670, - -0.842485913084885630, - 0.538556819231804210, -0.842589195550786600, 0.538395244877439950, - -0.842692447037091560, - 0.538233650727821700, -0.842795667540004120, 0.538072036788890600, - -0.842898857055729310, - 0.537910403066588990, -0.843002015580472830, 0.537748749566859470, - -0.843105143110442050, - 0.537587076295645510, -0.843208239641845440, 0.537425383258891660, - -0.843311305170892030, - 0.537263670462542530, -0.843414339693792760, 0.537101937912544240, - -0.843517343206759080, - 0.536940185614843020, -0.843620315706004040, 0.536778413575385920, - -0.843723257187741550, - 0.536616621800121150, -0.843826167648186740, 0.536454810294997090, - -0.843929047083555870, - 0.536292979065963180, -0.844031895490066410, 0.536131128118969350, - -0.844134712863936930, - 0.535969257459966710, -0.844237499201387020, 0.535807367094906620, - -0.844340254498637590, - 0.535645457029741090, -0.844442978751910660, 0.535483527270423370, - -0.844545671957429240, - 0.535321577822907010, -0.844648334111417820, 0.535159608693146720, - -0.844750965210101510, - 0.534997619887097260, -0.844853565249707010, 0.534835611410714670, - -0.844956134226462100, - 0.534673583269955510, -0.845058672136595470, 0.534511535470777010, - -0.845161178976337140, - 0.534349468019137520, -0.845263654741918220, 0.534187380920995600, - -0.845366099429570970, - 0.534025274182310380, -0.845468513035528830, 0.533863147809042650, - -0.845570895556026270, - 0.533701001807152960, -0.845673246987299070, 0.533538836182603120, - -0.845775567325583900, - 0.533376650941355560, -0.845877856567118890, 0.533214446089372960, - -0.845980114708143270, - 0.533052221632619670, -0.846082341744896940, 0.532889977577059690, - -0.846184537673621670, - 0.532727713928658810, -0.846286702490559710, 0.532565430693382580, - -0.846388836191954930, - 0.532403127877198010, -0.846490938774052020, 0.532240805486072330, - -0.846593010233097190, - 0.532078463525973540, -0.846695050565337450, 0.531916102002870760, - -0.846797059767020910, - 0.531753720922733320, -0.846899037834397350, 0.531591320291531780, - -0.847000984763716880, - 0.531428900115236910, -0.847102900551231500, 0.531266460399820390, - -0.847204785193193980, - 0.531104001151255000, -0.847306638685858320, 0.530941522375513510, - -0.847408461025479730, - 0.530779024078570250, -0.847510252208314330, 0.530616506266399450, - -0.847612012230619660, - 0.530453968944976320, -0.847713741088654270, 0.530291412120277420, - -0.847815438778677930, - 0.530128835798278850, -0.847917105296951410, 0.529966239984958620, - -0.848018740639736810, - 0.529803624686294830, -0.848120344803297120, 0.529640989908265910, - -0.848221917783896990, - 0.529478335656852090, -0.848323459577801530, 0.529315661938033140, - -0.848424970181277600, - 0.529152968757790720, -0.848526449590592650, 0.528990256122106040, - -0.848627897802015860, - 0.528827524036961980, -0.848729314811817010, 0.528664772508341540, - -0.848830700616267530, - 0.528502001542228480, -0.848932055211639610, 0.528339211144607690, - -0.849033378594206690, - 0.528176401321464370, -0.849134670760243630, 0.528013572078784740, - -0.849235931706025960, - 0.527850723422555460, -0.849337161427830670, 0.527687855358763720, - -0.849438359921935950, - 0.527524967893398200, -0.849539527184620890, 0.527362061032447430, - -0.849640663212165910, - 0.527199134781901390, -0.849741768000852440, 0.527036189147750190, - -0.849842841546963210, - 0.526873224135984700, -0.849943883846782210, 0.526710239752597010, - -0.850044894896594070, - 0.526547236003579330, -0.850145874692685210, 0.526384212894925210, - -0.850246823231342710, - 0.526221170432628170, -0.850347740508854980, 0.526058108622682760, - -0.850448626521511650, - 0.525895027471084740, -0.850549481265603370, 0.525731926983829640, - -0.850650304737422200, - 0.525568807166914680, -0.850751096933260790, 0.525405668026336810, - -0.850851857849413640, - 0.525242509568094710, -0.850952587482175730, 0.525079331798186890, - -0.851053285827843790, - 0.524916134722612890, -0.851153952882715340, 0.524752918347373360, - -0.851254588643089120, - 0.524589682678468840, -0.851355193105265200, 0.524426427721901510, - -0.851455766265544310, - 0.524263153483673470, -0.851556308120228870, 0.524099859969787810, - -0.851656818665622370, - 0.523936547186248600, -0.851757297898029120, 0.523773215139060170, - -0.851857745813754840, - 0.523609863834228030, -0.851958162409106380, 0.523446493277757940, - -0.852058547680391580, - 0.523283103475656430, -0.852158901623919830, 0.523119694433931250, - -0.852259224236001090, - 0.522956266158590140, -0.852359515512947090, 0.522792818655642200, - -0.852459775451070100, - 0.522629351931096720, -0.852560004046683970, 0.522465865990963900, - -0.852660201296103760, - 0.522302360841254700, -0.852760367195645300, 0.522138836487980650, - -0.852860501741625860, - 0.521975292937154390, -0.852960604930363630, 0.521811730194788550, - -0.853060676758178320, - 0.521648148266897090, -0.853160717221390420, 0.521484547159494550, - -0.853260726316321770, - 0.521320926878595550, -0.853360704039295430, 0.521157287430216610, - -0.853460650386635320, - 0.520993628820373810, -0.853560565354666840, 0.520829951055084780, - -0.853660448939716270, - 0.520666254140367270, -0.853760301138111300, 0.520502538082239790, - -0.853860121946180660, - 0.520338802886721960, -0.853959911360254060, 0.520175048559833760, - -0.854059669376662780, - 0.520011275107596040, -0.854159395991738730, 0.519847482536030300, - -0.854259091201815420, - 0.519683670851158520, -0.854358755003227440, 0.519519840059003870, - -0.854458387392310060, - 0.519355990165589530, -0.854557988365400530, 0.519192121176940360, - -0.854657557918836460, - 0.519028233099080970, -0.854757096048957110, 0.518864325938037000, - -0.854856602752102850, - 0.518700399699835170, -0.854956078024614820, 0.518536454390502110, - -0.855055521862835950, - 0.518372490016066220, -0.855154934263109620, 0.518208506582555460, - -0.855254315221781080, - 0.518044504095999340, -0.855353664735196030, 0.517880482562427800, - -0.855452982799701830, - 0.517716441987871150, -0.855552269411646970, 0.517552382378360990, - -0.855651524567380690, - 0.517388303739929060, -0.855750748263253920, 0.517224206078608310, - -0.855849940495618240, - 0.517060089400432130, -0.855949101260826790, 0.516895953711434260, - -0.856048230555233820, - 0.516731799017649980, -0.856147328375194470, 0.516567625325114350, - -0.856246394717065210, - 0.516403432639863990, -0.856345429577203610, 0.516239220967935620, - -0.856444432951968480, - 0.516074990315366630, -0.856543404837719960, 0.515910740688195650, - -0.856642345230818720, - 0.515746472092461380, -0.856741254127627470, 0.515582184534203790, - -0.856840131524509220, - 0.515417878019463150, -0.856938977417828650, 0.515253552554280290, - -0.857037791803951680, - 0.515089208144697270, -0.857136574679244870, 0.514924844796756490, - -0.857235326040076460, - 0.514760462516501200, -0.857334045882815590, 0.514596061309975040, - -0.857432734203832700, - 0.514431641183222930, -0.857531390999499040, 0.514267202142289830, - -0.857630016266187620, - 0.514102744193221660, -0.857728610000272120, 0.513938267342065490, - -0.857827172198127320, - 0.513773771594868030, -0.857925702856129790, 0.513609256957677900, - -0.858024201970656540, - 0.513444723436543570, -0.858122669538086020, 0.513280171037514330, - -0.858221105554798250, - 0.513115599766640560, -0.858319510017173440, 0.512951009629972860, - -0.858417882921594040, - 0.512786400633563070, -0.858516224264442740, 0.512621772783463100, - -0.858614534042104080, - 0.512457126085725800, -0.858712812250963520, 0.512292460546404980, - -0.858811058887407500, - 0.512127776171554690, -0.858909273947823900, 0.511963072967230200, - -0.859007457428601410, - 0.511798350939487000, -0.859105609326130340, 0.511633610094381350, - -0.859203729636801920, - 0.511468850437970520, -0.859301818357008360, 0.511304071976311890, - -0.859399875483143450, - 0.511139274715464390, -0.859497901011601620, 0.510974458661486720, - -0.859595894938779080, - 0.510809623820439040, -0.859693857261072610, 0.510644770198381730, - -0.859791787974880540, - 0.510479897801375700, -0.859889687076602290, 0.510315006635483350, - -0.859987554562638200, - 0.510150096706766700, -0.860085390429390140, 0.509985168021289570, - -0.860183194673260880, - 0.509820220585115560, -0.860280967290654510, 0.509655254404309250, - -0.860378708277976130, - 0.509490269484936360, -0.860476417631632070, 0.509325265833062480, - -0.860574095348029980, - 0.509160243454754750, -0.860671741423578380, 0.508995202356080310, - -0.860769355854687060, - 0.508830142543106990, -0.860866938637767310, 0.508665064021904260, - -0.860964489769230900, - 0.508499966798540810, -0.861062009245491480, 0.508334850879087470, - -0.861159497062963350, - 0.508169716269614710, -0.861256953218062060, 0.508004562976194010, - -0.861354377707204800, - 0.507839391004897940, -0.861451770526809210, 0.507674200361798890, - -0.861549131673294720, - 0.507508991052970870, -0.861646461143081300, 0.507343763084487920, - -0.861743758932590700, - 0.507178516462425290, -0.861841025038245330, 0.507013251192858340, - -0.861938259456469180, - 0.506847967281863320, -0.862035462183687210, 0.506682664735517600, - -0.862132633216325380, - 0.506517343559898530, -0.862229772550811240, 0.506352003761084800, - -0.862326880183573060, - 0.506186645345155450, -0.862423956111040500, 0.506021268318189830, - -0.862521000329644520, - 0.505855872686268860, -0.862618012835816740, 0.505690458455473340, - -0.862714993625990690, - 0.505525025631885510, -0.862811942696600330, 0.505359574221587390, - -0.862908860044081290, - 0.505194104230662240, -0.863005745664870210, 0.505028615665194300, - -0.863102599555404800, - 0.504863108531267480, -0.863199421712124160, 0.504697582834967680, - -0.863296212131468230, - 0.504532038582380380, -0.863392970809878310, 0.504366475779592150, - -0.863489697743797140, - 0.504200894432690560, -0.863586392929667990, 0.504035294547763080, - -0.863683056363935940, - 0.503869676130898950, -0.863779688043046610, 0.503704039188186960, - -0.863876287963447510, - 0.503538383725717580, -0.863972856121586700, 0.503372709749581150, - -0.864069392513913680, - 0.503207017265869030, -0.864165897136879300, 0.503041306280673450, - -0.864262369986934950, - 0.502875576800086880, -0.864358811060534030, 0.502709828830203100, - -0.864455220354130250, - 0.502544062377115800, -0.864551597864179230, 0.502378277446919870, - -0.864647943587137480, - 0.502212474045710900, -0.864744257519462380, 0.502046652179584660, - -0.864840539657612980, - 0.501880811854638400, -0.864936789998049020, 0.501714953076969230, - -0.865033008537231750, - 0.501549075852675390, -0.865129195271623690, 0.501383180187855880, - -0.865225350197688090, - 0.501217266088609950, -0.865321473311889800, 0.501051333561038040, - -0.865417564610694410, - 0.500885382611240940, -0.865513624090568980, 0.500719413245319880, - -0.865609651747981880, - 0.500553425469377640, -0.865705647579402270, 0.500387419289516580, - -0.865801611581300760, - 0.500221394711840680, -0.865897543750148820, 0.500055351742453860, - -0.865993444082419520, - 0.499889290387461380, -0.866089312574586770, 0.499723210652968710, - -0.866185149223125730, - 0.499557112545081890, -0.866280954024512990, 0.499390996069908220, - -0.866376726975225830, - 0.499224861233555030, -0.866472468071743050, 0.499058708042130930, - -0.866568177310544360, - 0.498892536501744750, -0.866663854688111020, 0.498726346618505960, - -0.866759500200925290, - 0.498560138398525200, -0.866855113845470320, 0.498393911847913150, - -0.866950695618231020, - 0.498227666972781870, -0.867046245515692650, 0.498061403779243520, - -0.867141763534342360, - 0.497895122273410930, -0.867237249670668400, 0.497728822461398100, - -0.867332703921159690, - 0.497562504349319090, -0.867428126282306920, 0.497396167943289340, - -0.867523516750601460, - 0.497229813249424340, -0.867618875322536230, 0.497063440273840310, - -0.867714201994605140, - 0.496897049022654640, -0.867809496763303210, 0.496730639501984710, - -0.867904759625126920, - 0.496564211717949340, -0.867999990576573400, 0.496397765676667160, - -0.868095189614141670, - 0.496231301384258310, -0.868190356734331310, 0.496064818846843060, - -0.868285491933643240, - 0.495898318070542240, -0.868380595208579800, 0.495731799061478020, - -0.868475666555644120, - 0.495565261825772490, -0.868570705971340900, 0.495398706369549080, - -0.868665713452175580, - 0.495232132698931350, -0.868760688994655190, 0.495065540820043610, - -0.868855632595287750, - 0.494898930739011310, -0.868950544250582380, 0.494732302461959820, - -0.869045423957049530, - 0.494565655995016010, -0.869140271711200560, 0.494398991344306760, - -0.869235087509548250, - 0.494232308515959730, -0.869329871348606730, 0.494065607516103730, - -0.869424623224890780, - 0.493898888350867430, -0.869519343134916970, 0.493732151026381070, - -0.869614031075202300, - 0.493565395548774880, -0.869708687042265560, 0.493398621924179830, - -0.869803311032626650, - 0.493231830158728070, -0.869897903042806340, 0.493065020258551650, - -0.869992463069326870, - 0.492898192229784090, -0.870086991108711350, 0.492731346078558840, - -0.870181487157484560, - 0.492564481811010650, -0.870275951212171830, 0.492397599433274550, - -0.870370383269300160, - 0.492230698951486080, -0.870464783325397670, 0.492063780371782060, - -0.870559151376993250, - 0.491896843700299240, -0.870653487420617540, 0.491729888943175820, - -0.870747791452801790, - 0.491562916106550060, -0.870842063470078860, 0.491395925196560830, - -0.870936303468982760, - 0.491228916219348330, -0.871030511446048260, 0.491061889181052590, - -0.871124687397811900, - 0.490894844087815140, -0.871218831320810900, 0.490727780945777570, - -0.871312943211583920, - 0.490560699761082080, -0.871407023066670950, 0.490393600539872130, - -0.871501070882612530, - 0.490226483288291100, -0.871595086655951090, 0.490059348012483910, - -0.871689070383229740, - 0.489892194718595300, -0.871783022060993010, 0.489725023412770970, - -0.871876941685786890, - 0.489557834101157550, -0.871970829254157700, 0.489390626789901920, - -0.872064684762653970, - 0.489223401485152030, -0.872158508207824480, 0.489056158193055980, - -0.872252299586219860, - 0.488888896919763230, -0.872346058894391540, 0.488721617671423250, - -0.872439786128892280, - 0.488554320454186230, -0.872533481286276060, 0.488387005274203590, - -0.872627144363097960, - 0.488219672137626740, -0.872720775355914300, 0.488052321050608310, - -0.872814374261282390, - 0.487884952019301210, -0.872907941075760970, 0.487717565049858860, - -0.873001475795909920, - 0.487550160148436050, -0.873094978418290090, 0.487382737321187310, - -0.873188448939463790, - 0.487215296574268820, -0.873281887355994210, 0.487047837913836550, - -0.873375293664446000, - 0.486880361346047400, -0.873468667861384880, 0.486712866877059340, - -0.873562009943377740, - 0.486545354513030270, -0.873655319906992630, 0.486377824260119500, - -0.873748597748798870, - 0.486210276124486530, -0.873841843465366750, 0.486042710112291390, - -0.873935057053268130, - 0.485875126229695420, -0.874028238509075630, 0.485707524482859750, - -0.874121387829363330, - 0.485539904877947020, -0.874214505010706300, 0.485372267421119770, - -0.874307590049680950, - 0.485204612118541880, -0.874400642942864790, 0.485036938976377450, - -0.874493663686836450, - 0.484869248000791120, -0.874586652278176110, 0.484701539197948730, - -0.874679608713464510, - 0.484533812574016120, -0.874772532989284150, 0.484366068135160480, - -0.874865425102218210, - 0.484198305887549140, -0.874958285048851540, 0.484030525837350010, - -0.875051112825769970, - 0.483862727990732320, -0.875143908429560250, 0.483694912353865080, - -0.875236671856810870, - 0.483527078932918740, -0.875329403104110780, 0.483359227734063980, - -0.875422102168050830, - 0.483191358763471910, -0.875514769045222740, 0.483023472027315050, - -0.875607403732219240, - 0.482855567531765670, -0.875700006225634600, 0.482687645282997510, - -0.875792576522063880, - 0.482519705287184520, -0.875885114618103700, 0.482351747550501030, - -0.875977620510351660, - 0.482183772079122830, -0.876070094195406600, 0.482015778879225530, - -0.876162535669868460, - 0.481847767956986080, -0.876254944930338400, 0.481679739318581490, - -0.876347321973419020, - 0.481511692970189920, -0.876439666795713610, 0.481343628917989870, - -0.876531979393827100, - 0.481175547168160360, -0.876624259764365310, 0.481007447726881640, - -0.876716507903935400, - 0.480839330600333900, -0.876808723809145760, 0.480671195794698690, - -0.876900907476605650, - 0.480503043316157670, -0.876993058902925780, 0.480334873170893070, - -0.877085178084718310, - 0.480166685365088440, -0.877177265018595940, 0.479998479904927220, - -0.877269319701173170, - 0.479830256796594250, -0.877361342129065140, 0.479662016046274340, - -0.877453332298888560, - 0.479493757660153060, -0.877545290207261240, 0.479325481644417130, - -0.877637215850802120, - 0.479157188005253310, -0.877729109226131570, 0.478988876748849550, - -0.877820970329870500, - 0.478820547881394050, -0.877912799158641730, 0.478652201409075550, - -0.878004595709069080, - 0.478483837338084080, -0.878096359977777130, 0.478315455674609480, - -0.878188091961392250, - 0.478147056424843120, -0.878279791656541460, 0.477978639594976110, - -0.878371459059853590, - 0.477810205191201040, -0.878463094167957870, 0.477641753219710590, - -0.878554696977485340, - 0.477473283686698060, -0.878646267485068130, 0.477304796598358010, - -0.878737805687339280, - 0.477136291960884750, -0.878829311580933360, 0.476967769780474230, - -0.878920785162485840, - 0.476799230063322250, -0.879012226428633410, 0.476630672815625380, - -0.879103635376014330, - 0.476462098043581310, -0.879195012001267370, 0.476293505753387750, - -0.879286356301033250, - 0.476124895951243630, -0.879377668271953180, 0.475956268643348220, - -0.879468947910670100, - 0.475787623835901120, -0.879560195213827890, 0.475618961535103410, - -0.879651410178071470, - 0.475450281747155870, -0.879742592800047410, 0.475281584478260800, - -0.879833743076402940, - 0.475112869734620470, -0.879924861003786860, 0.474944137522437860, - -0.880015946578848960, - 0.474775387847917230, -0.880106999798240360, 0.474606620717262560, - -0.880198020658613190, - 0.474437836136679340, -0.880289009156620890, 0.474269034112372920, - -0.880379965288918260, - 0.474100214650550020, -0.880470889052160750, 0.473931377757417560, - -0.880561780443005590, - 0.473762523439182850, -0.880652639458111010, 0.473593651702054640, - -0.880743466094136230, - 0.473424762552241530, -0.880834260347742040, 0.473255855995953380, - -0.880925022215589880, - 0.473086932039400220, -0.881015751694342760, 0.472917990688792760, - -0.881106448780665130, - 0.472749031950342900, -0.881197113471221980, 0.472580055830262250, - -0.881287745762680100, - 0.472411062334764100, -0.881378345651706810, 0.472242051470061650, - -0.881468913134971330, - 0.472073023242368660, -0.881559448209143780, 0.471903977657900320, - -0.881649950870895260, - 0.471734914722871430, -0.881740421116898320, 0.471565834443498480, - -0.881830858943826620, - 0.471396736825997810, -0.881921264348354940, 0.471227621876586400, - -0.882011637327159590, - 0.471058489601482610, -0.882101977876917580, 0.470889340006904520, - -0.882192285994307430, - 0.470720173099071710, -0.882282561676008600, 0.470550988884203490, - -0.882372804918702290, - 0.470381787368520710, -0.882463015719070040, 0.470212568558244280, - -0.882553194073795400, - 0.470043332459595620, -0.882643339979562790, 0.469874079078797470, - -0.882733453433057540, - 0.469704808422072460, -0.882823534430966730, 0.469535520495644510, - -0.882913582969978020, - 0.469366215305737630, -0.883003599046780720, 0.469196892858576630, - -0.883093582658065370, - 0.469027553160387240, -0.883183533800523280, 0.468858196217395330, - -0.883273452470847430, - 0.468688822035827960, -0.883363338665731580, 0.468519430621912420, - -0.883453192381870920, - 0.468350021981876530, -0.883543013615961880, 0.468180596121949400, - -0.883632802364701760, - 0.468011153048359830, -0.883722558624789660, 0.467841692767338220, - -0.883812282392925090, - 0.467672215285114710, -0.883901973665809470, 0.467502720607920920, - -0.883991632440144890, - 0.467333208741988530, -0.884081258712634990, 0.467163679693549770, - -0.884170852479984500, - 0.466994133468838110, -0.884260413738899080, 0.466824570074086950, - -0.884349942486086120, - 0.466654989515530970, -0.884439438718253700, 0.466485391799405010, - -0.884528902432111350, - 0.466315776931944480, -0.884618333624369920, 0.466146144919386000, - -0.884707732291740930, - 0.465976495767966130, -0.884797098430937790, 0.465806829483922770, - -0.884886432038674560, - 0.465637146073493770, -0.884975733111666660, 0.465467445542917800, - -0.885065001646630930, - 0.465297727898434650, -0.885154237640285110, 0.465127993146283950, - -0.885243441089348270, - 0.464958241292706740, -0.885332611990540590, 0.464788472343944160, - -0.885421750340583570, - 0.464618686306237820, -0.885510856136199950, 0.464448883185830770, - -0.885599929374113360, - 0.464279062988965760, -0.885688970051048960, 0.464109225721887010, - -0.885777978163732940, - 0.463939371390838460, -0.885866953708892790, 0.463769500002065680, - -0.885955896683257030, - 0.463599611561814120, -0.886044807083555490, 0.463429706076329880, - -0.886133684906519340, - 0.463259783551860260, -0.886222530148880640, 0.463089843994652470, - -0.886311342807372890, - 0.462919887410955130, -0.886400122878730490, 0.462749913807016850, - -0.886488870359689600, - 0.462579923189086810, -0.886577585246987040, 0.462409915563415540, - -0.886666267537360890, - 0.462239890936253280, -0.886754917227550950, 0.462069849313851810, - -0.886843534314297300, - 0.461899790702462840, -0.886932118794342080, 0.461729715108338770, - -0.887020670664428360, - 0.461559622537733190, -0.887109189921300060, 0.461389512996899450, - -0.887197676561702900, - 0.461219386492092430, -0.887286130582383150, 0.461049243029567010, - -0.887374551980088740, - 0.460879082615578690, -0.887462940751568840, 0.460708905256384190, - -0.887551296893573370, - 0.460538710958240010, -0.887639620402853930, 0.460368499727404070, - -0.887727911276163020, - 0.460198271570134270, -0.887816169510254550, 0.460028026492689700, - -0.887904395101883240, - 0.459857764501329650, -0.887992588047805560, 0.459687485602313870, - -0.888080748344778900, - 0.459517189801903590, -0.888168875989561620, 0.459346877106359570, - -0.888256970978913870, - 0.459176547521944150, -0.888345033309596240, 0.459006201054919680, - -0.888433062978371320, - 0.458835837711549120, -0.888521059982002260, 0.458665457498096670, - -0.888609024317253750, - 0.458495060420826220, -0.888696955980891710, 0.458324646486003300, - -0.888784854969682850, - 0.458154215699893230, -0.888872721280395520, 0.457983768068762180, - -0.888960554909799310, - 0.457813303598877290, -0.889048355854664570, 0.457642822296505770, - -0.889136124111763240, - 0.457472324167916110, -0.889223859677868210, 0.457301809219376800, - -0.889311562549753850, - 0.457131277457156980, -0.889399232724195520, 0.456960728887527030, - -0.889486870197969790, - 0.456790163516757220, -0.889574474967854580, 0.456619581351118960, - -0.889662047030628790, - 0.456448982396883860, -0.889749586383072890, 0.456278366660324670, - -0.889837093021967900, - 0.456107734147714220, -0.889924566944096720, 0.455937084865326030, - -0.890012008146243260, - 0.455766418819434750, -0.890099416625192210, 0.455595736016314920, - -0.890186792377730240, - 0.455425036462242420, -0.890274135400644480, 0.455254320163493210, - -0.890361445690723730, - 0.455083587126343840, -0.890448723244757880, 0.454912837357072050, - -0.890535968059537830, - 0.454742070861955450, -0.890623180131855930, 0.454571287647273000, - -0.890710359458505520, - 0.454400487719303750, -0.890797506036281490, 0.454229671084327320, - -0.890884619861979530, - 0.454058837748624540, -0.890971700932396750, 0.453887987718476050, - -0.891058749244331590, - 0.453717121000163930, -0.891145764794583180, 0.453546237599970260, - -0.891232747579952520, - 0.453375337524177750, -0.891319697597241390, 0.453204420779070300, - -0.891406614843252900, - 0.453033487370931580, -0.891493499314791380, 0.452862537306046810, - -0.891580351008662290, - 0.452691570590700860, -0.891667169921672390, 0.452520587231180100, - -0.891753956050629460, - 0.452349587233771000, -0.891840709392342720, 0.452178570604760410, - -0.891927429943622510, - 0.452007537350436530, -0.892014117701280360, 0.451836487477087430, - -0.892100772662129170, - 0.451665420991002540, -0.892187394822982480, 0.451494337898471210, - -0.892273984180655730, - 0.451323238205783520, -0.892360540731965360, 0.451152121919230710, - -0.892447064473728680, - 0.450980989045103810, -0.892533555402764690, 0.450809839589695340, - -0.892620013515893040, - 0.450638673559297760, -0.892706438809935280, 0.450467490960204110, - -0.892792831281713610, - 0.450296291798708730, -0.892879190928051680, 0.450125076081105750, - -0.892965517745774260, - 0.449953843813690580, -0.893051811731707450, 0.449782595002758860, - -0.893138072882678210, - 0.449611329654606600, -0.893224301195515320, 0.449440047775531260, - -0.893310496667048090, - 0.449268749371829920, -0.893396659294107610, 0.449097434449801100, - -0.893482789073525850, - 0.448926103015743260, -0.893568886002136020, 0.448754755075956020, - -0.893654950076772430, - 0.448583390636739300, -0.893740981294271040, 0.448412009704393430, - -0.893826979651468620, - 0.448240612285220000, -0.893912945145203250, 0.448069198385520340, - -0.893998877772314240, - 0.447897768011597310, -0.894084777529641990, 0.447726321169753750, - -0.894170644414028270, - 0.447554857866293010, -0.894256478422316040, 0.447383378107519710, - -0.894342279551349480, - 0.447211881899738260, -0.894428047797973800, 0.447040369249254500, - -0.894513783159035620, - 0.446868840162374330, -0.894599485631382580, 0.446697294645404090, - -0.894685155211863980, - 0.446525732704651400, -0.894770791897329550, 0.446354154346423840, - -0.894856395684630930, - 0.446182559577030120, -0.894941966570620750, 0.446010948402779110, - -0.895027504552152630, - 0.445839320829980350, -0.895113009626081760, 0.445667676864944350, - -0.895198481789264200, - 0.445496016513981740, -0.895283921038557580, 0.445324339783404240, - -0.895369327370820310, - 0.445152646679523590, -0.895454700782912450, 0.444980937208652780, - -0.895540041271694840, - 0.444809211377105000, -0.895625348834030000, 0.444637469191193790, - -0.895710623466781320, - 0.444465710657234110, -0.895795865166813420, 0.444293935781540580, - -0.895881073930992370, - 0.444122144570429260, -0.895966249756185110, 0.443950337030216250, - -0.896051392639260040, - 0.443778513167218220, -0.896136502577086770, 0.443606672987753080, - -0.896221579566535920, - 0.443434816498138430, -0.896306623604479660, 0.443262943704693380, - -0.896391634687790820, - 0.443091054613736990, -0.896476612813344010, 0.442919149231588980, - -0.896561557978014960, - 0.442747227564570130, -0.896646470178680150, 0.442575289619001170, - -0.896731349412217880, - 0.442403335401204130, -0.896816195675507190, 0.442231364917501090, - -0.896901008965428680, - 0.442059378174214760, -0.896985789278863970, 0.441887375177668960, - -0.897070536612695870, - 0.441715355934187310, -0.897155250963808550, 0.441543320450094920, - -0.897239932329087050, - 0.441371268731716620, -0.897324580705418320, 0.441199200785378660, - -0.897409196089689720, - 0.441027116617407340, -0.897493778478790190, 0.440855016234129430, - -0.897578327869610230, - 0.440682899641873020, -0.897662844259040750, 0.440510766846965880, - -0.897747327643974690, - 0.440338617855737300, -0.897831778021305650, 0.440166452674516480, - -0.897916195387928550, - 0.439994271309633260, -0.898000579740739880, 0.439822073767418610, - -0.898084931076636780, - 0.439649860054203420, -0.898169249392518080, 0.439477630176319860, - -0.898253534685283570, - 0.439305384140100060, -0.898337786951834190, 0.439133121951876930, - -0.898422006189072530, - 0.438960843617984430, -0.898506192393901840, 0.438788549144756290, - -0.898590345563227030, - 0.438616238538527710, -0.898674465693953820, 0.438443911805633860, - -0.898758552782989440, - 0.438271568952410480, -0.898842606827242260, 0.438099209985194580, - -0.898926627823621870, - 0.437926834910322860, -0.899010615769039070, 0.437754443734133470, - -0.899094570660405770, - 0.437582036462964340, -0.899178492494635330, 0.437409613103154850, - -0.899262381268642000, - 0.437237173661044200, -0.899346236979341460, 0.437064718142972370, - -0.899430059623650860, - 0.436892246555280470, -0.899513849198487870, 0.436719758904309310, - -0.899597605700772180, - 0.436547255196401250, -0.899681329127423930, 0.436374735437898510, - -0.899765019475365020, - 0.436202199635143950, -0.899848676741518580, 0.436029647794481670, - -0.899932300922808400, - 0.435857079922255470, -0.900015892016160280, 0.435684496024810520, - -0.900099450018500340, - 0.435511896108492170, -0.900182974926756700, 0.435339280179646070, - -0.900266466737858480, - 0.435166648244619370, -0.900349925448735600, 0.434994000309758710, - -0.900433351056319830, - 0.434821336381412350, -0.900516743557543520, 0.434648656465928430, - -0.900600102949340790, - 0.434475960569655710, -0.900683429228646860, 0.434303248698944100, - -0.900766722392397860, - 0.434130520860143310, -0.900849982437531450, 0.433957777059604480, - -0.900933209360986200, - 0.433785017303678520, -0.901016403159702330, 0.433612241598717640, - -0.901099563830620950, - 0.433439449951074200, -0.901182691370684410, 0.433266642367100940, - -0.901265785776836580, - 0.433093818853152010, -0.901348847046022030, 0.432920979415581220, - -0.901431875175186970, - 0.432748124060743760, -0.901514870161278630, 0.432575252794994810, - -0.901597832001245660, - 0.432402365624690140, -0.901680760692037730, 0.432229462556186770, - -0.901763656230605610, - 0.432056543595841450, -0.901846518613901860, 0.431883608750012300, - -0.901929347838879350, - 0.431710658025057370, -0.902012143902493070, 0.431537691427335500, - -0.902094906801698900, - 0.431364708963206440, -0.902177636533453510, 0.431191710639030000, - -0.902260333094715540, - 0.431018696461167080, -0.902342996482444200, 0.430845666435978820, - -0.902425626693600270, - 0.430672620569826860, -0.902508223725145830, 0.430499558869073930, - -0.902590787574043870, - 0.430326481340082610, -0.902673318237258830, 0.430153387989216930, - -0.902755815711756120, - 0.429980278822840570, -0.902838279994502830, 0.429807153847318770, - -0.902920711082466630, - 0.429634013069016500, -0.903003108972617040, 0.429460856494299490, - -0.903085473661924600, - 0.429287684129534720, -0.903167805147360610, 0.429114495981088690, - -0.903250103425898400, - 0.428941292055329550, -0.903332368494511820, 0.428768072358625240, - -0.903414600350176290, - 0.428594836897344400, -0.903496798989868450, 0.428421585677856760, - -0.903578964410565950, - 0.428248318706531910, -0.903661096609247980, 0.428075035989740780, - -0.903743195582894620, - 0.427901737533854240, -0.903825261328487390, 0.427728423345243860, - -0.903907293843009050, - 0.427555093430282200, -0.903989293123443340, 0.427381747795341770, - -0.904071259166775440, - 0.427208386446796370, -0.904153191969991670, 0.427035009391019790, - -0.904235091530079750, - 0.426861616634386490, -0.904316957844028320, 0.426688208183271970, - -0.904398790908827350, - 0.426514784044051520, -0.904480590721468250, 0.426341344223101880, - -0.904562357278943190, - 0.426167888726799620, -0.904644090578246240, 0.425994417561522450, - -0.904725790616371930, - 0.425820930733648300, -0.904807457390316540, 0.425647428249555590, - -0.904889090897077470, - 0.425473910115623910, -0.904970691133653250, 0.425300376338232590, - -0.905052258097043590, - 0.425126826923762410, -0.905133791784249580, 0.424953261878594060, - -0.905215292192273480, - 0.424779681209108810, -0.905296759318118820, 0.424606084921689220, - -0.905378193158789980, - 0.424432473022717420, -0.905459593711293250, 0.424258845518577010, - -0.905540960972635480, - 0.424085202415651670, -0.905622294939825160, 0.423911543720325580, - -0.905703595609872010, - 0.423737869438983950, -0.905784862979786440, 0.423564179578011960, - -0.905866097046580940, - 0.423390474143796100, -0.905947297807268460, 0.423216753142722780, - -0.906028465258863490, - 0.423043016581179100, -0.906109599398381980, 0.422869264465553170, - -0.906190700222840540, - 0.422695496802232950, -0.906271767729257660, 0.422521713597607870, - -0.906352801914652280, - 0.422347914858067000, -0.906433802776045460, 0.422174100590000820, - -0.906514770310458800, - 0.422000270799799790, -0.906595704514915330, 0.421826425493854910, - -0.906676605386439460, - 0.421652564678558380, -0.906757472922056550, 0.421478688360302220, - -0.906838307118793540, - 0.421304796545479700, -0.906919107973678030, 0.421130889240484140, - -0.906999875483739610, - 0.420956966451709440, -0.907080609646008450, 0.420783028185550630, - -0.907161310457516250, - 0.420609074448402510, -0.907241977915295930, 0.420435105246661220, - -0.907322612016381310, - 0.420261120586723050, -0.907403212757808000, 0.420087120474984590, - -0.907483780136612570, - 0.419913104917843730, -0.907564314149832520, 0.419739073921698180, - -0.907644814794507090, - 0.419565027492946940, -0.907725282067676330, 0.419390965637989050, - -0.907805715966381820, - 0.419216888363223960, -0.907886116487666150, 0.419042795675052480, - -0.907966483628573240, - 0.418868687579875110, -0.908046817386148340, 0.418694564084093610, - -0.908127117757437600, - 0.418520425194109700, -0.908207384739488700, 0.418346270916326310, - -0.908287618329350450, - 0.418172101257146430, -0.908367818524072780, 0.417997916222973550, - -0.908447985320707250, - 0.417823715820212380, -0.908528118716306120, 0.417649500055267410, - -0.908608218707923190, - 0.417475268934544340, -0.908688285292613360, 0.417301022464449060, - -0.908768318467432780, - 0.417126760651387870, -0.908848318229439120, 0.416952483501768280, - -0.908928284575690640, - 0.416778191021997590, -0.909008217503247450, 0.416603883218484410, - -0.909088117009170580, - 0.416429560097637320, -0.909167983090522270, 0.416255221665865480, - -0.909247815744366310, - 0.416080867929579320, -0.909327614967767260, 0.415906498895188770, - -0.909407380757791260, - 0.415732114569105420, -0.909487113111505430, 0.415557714957740580, - -0.909566812025978220, - 0.415383300067506290, -0.909646477498279540, 0.415208869904815650, - -0.909726109525480160, - 0.415034424476081630, -0.909805708104652220, 0.414859963787718390, - -0.909885273232869160, - 0.414685487846140010, -0.909964804907205660, 0.414510996657761810, - -0.910044303124737390, - 0.414336490228999210, -0.910123767882541570, 0.414161968566268080, - -0.910203199177696540, - 0.413987431675985510, -0.910282597007281760, 0.413812879564568300, - -0.910361961368377990, - 0.413638312238434560, -0.910441292258067140, 0.413463729704002580, - -0.910520589673432630, - 0.413289131967690960, -0.910599853611558930, 0.413114519035919560, - -0.910679084069531570, - 0.412939890915108020, -0.910758281044437570, 0.412765247611677320, - -0.910837444533365010, - 0.412590589132048380, -0.910916574533403240, 0.412415915482642730, - -0.910995671041643140, - 0.412241226669883000, -0.911074734055176250, 0.412066522700191560, - -0.911153763571095900, - 0.411891803579992220, -0.911232759586496190, 0.411717069315708670, - -0.911311722098472670, - 0.411542319913765280, -0.911390651104122320, 0.411367555380587340, - -0.911469546600543020, - 0.411192775722600160, -0.911548408584833990, 0.411017980946230270, - -0.911627237054095650, - 0.410843171057903910, -0.911706032005429880, 0.410668346064048780, - -0.911784793435939430, - 0.410493505971092520, -0.911863521342728520, 0.410318650785463260, - -0.911942215722902570, - 0.410143780513590350, -0.912020876573568230, 0.409968895161902820, - -0.912099503891833470, - 0.409793994736831200, -0.912178097674807060, 0.409619079244805840, - -0.912256657919599650, - 0.409444148692257590, -0.912335184623322750, 0.409269203085618700, - -0.912413677783089020, - 0.409094242431320920, -0.912492137396012650, 0.408919266735797480, - -0.912570563459208730, - 0.408744276005481520, -0.912648955969793900, 0.408569270246806780, - -0.912727314924885900, - 0.408394249466208110, -0.912805640321603500, 0.408219213670120100, - -0.912883932157067200, - 0.408044162864978740, -0.912962190428398100, 0.407869097057219960, - -0.913040415132719160, - 0.407694016253280170, -0.913118606267154130, 0.407518920459597030, - -0.913196763828828200, - 0.407343809682607970, -0.913274887814867760, 0.407168683928751610, - -0.913352978222400250, - 0.406993543204466460, -0.913431035048554720, 0.406818387516192370, - -0.913509058290461140, - 0.406643216870369140, -0.913587047945250810, 0.406468031273437000, - -0.913665004010056350, - 0.406292830731837470, -0.913742926482011390, 0.406117615252011790, - -0.913820815358251100, - 0.405942384840402570, -0.913898670635911680, 0.405767139503452220, - -0.913976492312130520, - 0.405591879247603870, -0.914054280384046460, 0.405416604079301750, - -0.914132034848799460, - 0.405241314004989860, -0.914209755703530690, 0.405066009031113390, - -0.914287442945382440, - 0.404890689164117750, -0.914365096571498450, 0.404715354410448650, - -0.914442716579023870, - 0.404540004776553110, -0.914520302965104450, 0.404364640268877810, - -0.914597855726887790, - 0.404189260893870750, -0.914675374861522390, 0.404013866657980060, - -0.914752860366158100, - 0.403838457567654130, -0.914830312237946090, 0.403663033629342750, - -0.914907730474038620, - 0.403487594849495310, -0.914985115071589310, 0.403312141234562660, - -0.915062466027752760, - 0.403136672790995240, -0.915139783339685260, 0.402961189525244960, - -0.915217067004543750, - 0.402785691443763640, -0.915294317019487050, 0.402610178553003680, - -0.915371533381674760, - 0.402434650859418540, -0.915448716088267830, 0.402259108369461440, - -0.915525865136428530, - 0.402083551089587040, -0.915602980523320230, 0.401907979026249860, - -0.915680062246107650, - 0.401732392185905010, -0.915757110301956720, 0.401556790575008650, - -0.915834124688034710, - 0.401381174200016790, -0.915911105401509880, 0.401205543067386760, - -0.915988052439551840, - 0.401029897183575790, -0.916064965799331610, 0.400854236555041650, - -0.916141845478021350, - 0.400678561188243350, -0.916218691472794110, 0.400502871089639500, - -0.916295503780824800, - 0.400327166265690150, -0.916372282399289140, 0.400151446722855300, - -0.916449027325364040, - 0.399975712467595390, -0.916525738556228100, 0.399799963506372090, - -0.916602416089060680, - 0.399624199845646790, -0.916679059921042700, 0.399448421491882260, - -0.916755670049355990, - 0.399272628451540930, -0.916832246471183890, 0.399096820731086600, - -0.916908789183710990, - 0.398920998336983020, -0.916985298184122890, 0.398745161275694480, - -0.917061773469606820, - 0.398569309553686360, -0.917138215037350710, 0.398393443177423920, - -0.917214622884544250, - 0.398217562153373620, -0.917290997008377910, 0.398041666488001930, - -0.917367337406043810, - 0.397865756187775750, -0.917443644074735220, 0.397689831259163240, - -0.917519917011646260, - 0.397513891708632330, -0.917596156213972950, 0.397337937542652120, - -0.917672361678911750, - 0.397161968767691720, -0.917748533403661250, 0.396985985390220900, - -0.917824671385420570, - 0.396809987416710420, -0.917900775621390390, 0.396633974853630830, - -0.917976846108772730, - 0.396457947707453960, -0.918052882844770380, 0.396281905984651680, - -0.918128885826587910, - 0.396105849691696320, -0.918204855051430900, 0.395929778835061360, - -0.918280790516506130, - 0.395753693421220080, -0.918356692219021720, 0.395577593456646950, - -0.918432560156186790, - 0.395401478947816300, -0.918508394325212250, 0.395225349901203730, - -0.918584194723309540, - 0.395049206323284880, -0.918659961347691900, 0.394873048220535760, - -0.918735694195573550, - 0.394696875599433670, -0.918811393264169940, 0.394520688466455550, - -0.918887058550697970, - 0.394344486828079650, -0.918962690052375630, 0.394168270690784250, - -0.919038287766421940, - 0.393992040061048100, -0.919113851690057770, 0.393815794945351130, - -0.919189381820504470, - 0.393639535350172880, -0.919264878154985250, 0.393463261281994380, - -0.919340340690724230, - 0.393286972747296570, -0.919415769424946960, 0.393110669752560760, - -0.919491164354880100, - 0.392934352304269600, -0.919566525477751530, 0.392758020408905280, - -0.919641852790790470, - 0.392581674072951530, -0.919717146291227360, 0.392405313302891860, - -0.919792405976293750, - 0.392228938105210370, -0.919867631843222950, 0.392052548486392200, - -0.919942823889248640, - 0.391876144452922350, -0.920017982111606570, 0.391699726011287050, - -0.920093106507533070, - 0.391523293167972350, -0.920168197074266450, 0.391346845929465610, - -0.920243253809045370, - 0.391170384302253980, -0.920318276709110480, 0.390993908292825380, - -0.920393265771703550, - 0.390817417907668610, -0.920468220994067110, 0.390640913153272370, - -0.920543142373445480, - 0.390464394036126650, -0.920618029907083860, 0.390287860562721360, - -0.920692883592229010, - 0.390111312739546910, -0.920767703426128790, 0.389934750573094790, - -0.920842489406032080, - 0.389758174069856410, -0.920917241529189520, 0.389581583236324360, - -0.920991959792852310, - 0.389404978078991100, -0.921066644194273530, 0.389228358604349730, - -0.921141294730707270, - 0.389051724818894500, -0.921215911399408730, 0.388875076729119250, - -0.921290494197634540, - 0.388698414341519250, -0.921365043122642340, 0.388521737662589740, - -0.921439558171691320, - 0.388345046698826300, -0.921514039342041900, 0.388168341456725850, - -0.921588486630955380, - 0.387991621942784910, -0.921662900035694730, 0.387814888163501290, - -0.921737279553523800, - 0.387638140125372680, -0.921811625181708120, 0.387461377834897920, - -0.921885936917513970, - 0.387284601298575890, -0.921960214758209110, 0.387107810522905990, - -0.922034458701062820, - 0.386931005514388690, -0.922108668743345070, 0.386754186279524130, - -0.922182844882327600, - 0.386577352824813980, -0.922256987115283030, 0.386400505156759610, - -0.922331095439485330, - 0.386223643281862980, -0.922405169852209880, 0.386046767206627280, - -0.922479210350733100, - 0.385869876937555310, -0.922553216932332830, 0.385692972481151200, - -0.922627189594287800, - 0.385516053843919020, -0.922701128333878520, 0.385339121032363340, - -0.922775033148386380, - 0.385162174052989970, -0.922848904035094120, 0.384985212912304200, - -0.922922740991285680, - 0.384808237616812930, -0.922996544014246250, 0.384631248173022740, - -0.923070313101262420, - 0.384454244587440870, -0.923144048249621820, 0.384277226866575620, - -0.923217749456613500, - 0.384100195016935040, -0.923291416719527640, 0.383923149045028500, - -0.923365050035655610, - 0.383746088957365010, -0.923438649402290370, 0.383569014760454960, - -0.923512214816725520, - 0.383391926460808770, -0.923585746276256560, 0.383214824064937180, - -0.923659243778179980, - 0.383037707579352130, -0.923732707319793180, 0.382860577010565360, - -0.923806136898395410, - 0.382683432365089840, -0.923879532511286740, 0.382506273649438400, - -0.923952894155768640, - 0.382329100870124510, -0.924026221829143850, 0.382151914033662720, - -0.924099515528716280, - 0.381974713146567220, -0.924172775251791200, 0.381797498215353690, - -0.924246000995674890, - 0.381620269246537520, -0.924319192757675160, 0.381443026246634730, - -0.924392350535101050, - 0.381265769222162490, -0.924465474325262600, 0.381088498179637520, - -0.924538564125471420, - 0.380911213125578130, -0.924611619933039970, 0.380733914066502090, - -0.924684641745282530, - 0.380556601008928570, -0.924757629559513910, 0.380379273959376710, - -0.924830583373050800, - 0.380201932924366050, -0.924903503183210910, 0.380024577910417380, - -0.924976388987313050, - 0.379847208924051110, -0.925049240782677580, 0.379669825971789000, - -0.925122058566625770, - 0.379492429060152740, -0.925194842336480420, 0.379315018195664430, - -0.925267592089565550, - 0.379137593384847430, -0.925340307823206200, 0.378960154634224720, - -0.925412989534729060, - 0.378782701950320600, -0.925485637221461490, 0.378605235339659290, - -0.925558250880732620, - 0.378427754808765620, -0.925630830509872720, 0.378250260364165310, - -0.925703376106213120, - 0.378072752012383990, -0.925775887667086740, 0.377895229759948550, - -0.925848365189827270, - 0.377717693613385810, -0.925920808671769960, 0.377540143579222940, - -0.925993218110251480, - 0.377362579663988450, -0.926065593502609310, 0.377185001874210450, - -0.926137934846182560, - 0.377007410216418310, -0.926210242138311270, 0.376829804697141220, - -0.926282515376337210, - 0.376652185322909620, -0.926354754557602860, 0.376474552100253880, - -0.926426959679452100, - 0.376296905035704790, -0.926499130739230510, 0.376119244135794390, - -0.926571267734284220, - 0.375941569407054420, -0.926643370661961230, 0.375763880856017750, - -0.926715439519610330, - 0.375586178489217330, -0.926787474304581750, 0.375408462313186590, - -0.926859475014227160, - 0.375230732334460030, -0.926931441645899130, 0.375052988559571860, - -0.927003374196951670, - 0.374875230995057600, -0.927075272664740100, 0.374697459647452770, - -0.927147137046620880, - 0.374519674523293210, -0.927218967339951790, 0.374341875629116030, - -0.927290763542091720, - 0.374164062971457990, -0.927362525650401110, 0.373986236556857090, - -0.927434253662241300, - 0.373808396391851370, -0.927505947574975180, 0.373630542482979280, - -0.927577607385966730, - 0.373452674836780410, -0.927649233092581180, 0.373274793459794030, - -0.927720824692185200, - 0.373096898358560690, -0.927792382182146320, 0.372918989539620770, - -0.927863905559833780, - 0.372741067009515810, -0.927935394822617890, 0.372563130774787370, - -0.928006849967869970, - 0.372385180841977360, -0.928078270992963140, 0.372207217217628950, - -0.928149657895271150, - 0.372029239908284960, -0.928221010672169440, 0.371851248920489540, - -0.928292329321034560, - 0.371673244260786630, -0.928363613839244370, 0.371495225935720760, - -0.928434864224177980, - 0.371317193951837600, -0.928506080473215480, 0.371139148315682510, - -0.928577262583738850, - 0.370961089033802040, -0.928648410553130520, 0.370783016112742720, - -0.928719524378774700, - 0.370604929559051670, -0.928790604058057020, 0.370426829379276900, - -0.928861649588363700, - 0.370248715579966360, -0.928932660967082820, 0.370070588167669130, - -0.929003638191603360, - 0.369892447148934270, -0.929074581259315750, 0.369714292530311240, - -0.929145490167611720, - 0.369536124318350760, -0.929216364913883930, 0.369357942519603190, - -0.929287205495526790, - 0.369179747140620070, -0.929358011909935500, 0.369001538187952780, - -0.929428784154506800, - 0.368823315668153960, -0.929499522226638560, 0.368645079587776150, - -0.929570226123729860, - 0.368466829953372320, -0.929640895843181330, 0.368288566771496680, - -0.929711531382394370, - 0.368110290048703050, -0.929782132738772190, 0.367931999791546500, - -0.929852699909718750, - 0.367753696006582090, -0.929923232892639560, 0.367575378700365330, - -0.929993731684941480, - 0.367397047879452820, -0.930064196284032360, 0.367218703550400930, - -0.930134626687321390, - 0.367040345719767240, -0.930205022892219070, 0.366861974394109220, - -0.930275384896137040, - 0.366683589579984930, -0.930345712696488470, 0.366505191283953480, - -0.930416006290687550, - 0.366326779512573590, -0.930486265676149780, 0.366148354272405390, - -0.930556490850291800, - 0.365969915570008910, -0.930626681810531650, 0.365791463411944570, - -0.930696838554288860, - 0.365612997804773960, -0.930766961078983710, 0.365434518755058390, - -0.930837049382038150, - 0.365256026269360380, -0.930907103460875020, 0.365077520354242180, - -0.930977123312918930, - 0.364899001016267380, -0.931047108935595170, 0.364720468261999390, - -0.931117060326330790, - 0.364541922098002180, -0.931186977482553750, 0.364363362530840730, - -0.931256860401693420, - 0.364184789567079840, -0.931326709081180430, 0.364006203213285530, - -0.931396523518446600, - 0.363827603476023610, -0.931466303710925090, 0.363648990361860550, - -0.931536049656050300, - 0.363470363877363870, -0.931605761351257830, 0.363291724029100700, - -0.931675438793984620, - 0.363113070823639530, -0.931745081981668720, 0.362934404267548750, - -0.931814690911749620, - 0.362755724367397230, -0.931884265581668150, 0.362577031129754870, - -0.931953805988865900, - 0.362398324561191310, -0.932023312130786490, 0.362219604668277570, - -0.932092784004874050, - 0.362040871457584350, -0.932162221608574320, 0.361862124935682980, - -0.932231624939334540, - 0.361683365109145950, -0.932300993994602640, 0.361504591984545260, - -0.932370328771828460, - 0.361325805568454340, -0.932439629268462360, 0.361147005867446190, - -0.932508895481956700, - 0.360968192888095290, -0.932578127409764420, 0.360789366636975690, - -0.932647325049340340, - 0.360610527120662270, -0.932716488398140250, 0.360431674345730810, - -0.932785617453620990, - 0.360252808318756830, -0.932854712213241230, 0.360073929046317080, - -0.932923772674460140, - 0.359895036534988280, -0.932992798834738850, 0.359716130791347570, - -0.933061790691539380, - 0.359537211821973180, -0.933130748242325110, 0.359358279633443080, - -0.933199671484560730, - 0.359179334232336560, -0.933268560415712050, 0.359000375625232630, - -0.933337415033246080, - 0.358821403818710920, -0.933406235334631520, 0.358642418819352100, - -0.933475021317337950, - 0.358463420633736540, -0.933543772978836170, 0.358284409268445900, - -0.933612490316598540, - 0.358105384730061760, -0.933681173328098300, 0.357926347025166070, - -0.933749822010810580, - 0.357747296160342010, -0.933818436362210960, 0.357568232142172260, - -0.933887016379776890, - 0.357389154977241000, -0.933955562060986730, 0.357210064672131900, - -0.934024073403320500, - 0.357030961233430030, -0.934092550404258870, 0.356851844667720410, - -0.934160993061284420, - 0.356672714981588260, -0.934229401371880820, 0.356493572181620200, - -0.934297775333532530, - 0.356314416274402360, -0.934366114943725900, 0.356135247266522180, - -0.934434420199948050, - 0.355956065164567010, -0.934502691099687870, 0.355776869975124640, - -0.934570927640435030, - 0.355597661704783960, -0.934639129819680780, 0.355418440360133590, - -0.934707297634917440, - 0.355239205947763370, -0.934775431083638700, 0.355059958474263030, - -0.934843530163339430, - 0.354880697946222790, -0.934911594871516090, 0.354701424370233940, - -0.934979625205665800, - 0.354522137752887430, -0.935047621163287430, 0.354342838100775600, - -0.935115582741880890, - 0.354163525420490510, -0.935183509938947500, 0.353984199718624830, - -0.935251402751989810, - 0.353804861001772160, -0.935319261178511500, 0.353625509276525970, - -0.935387085216017770, - 0.353446144549480870, -0.935454874862014620, 0.353266766827231180, - -0.935522630114009930, - 0.353087376116372530, -0.935590350969512370, 0.352907972423500360, - -0.935658037426032040, - 0.352728555755210730, -0.935725689481080370, 0.352549126118100580, - -0.935793307132169900, - 0.352369683518766630, -0.935860890376814640, 0.352190227963806890, - -0.935928439212529660, - 0.352010759459819240, -0.935995953636831300, 0.351831278013402030, - -0.936063433647237540, - 0.351651783631154680, -0.936130879241266920, 0.351472276319676260, - -0.936198290416440090, - 0.351292756085567150, -0.936265667170278260, 0.351113222935427630, - -0.936333009500304180, - 0.350933676875858360, -0.936400317404042060, 0.350754117913461170, - -0.936467590879016880, - 0.350574546054837570, -0.936534829922755500, 0.350394961306590200, - -0.936602034532785570, - 0.350215363675321740, -0.936669204706636060, 0.350035753167635300, - -0.936736340441837620, - 0.349856129790135030, -0.936803441735921560, 0.349676493549424760, - -0.936870508586420960, - 0.349496844452109600, -0.936937540990869900, 0.349317182504794320, - -0.937004538946803690, - 0.349137507714085030, -0.937071502451759190, 0.348957820086587600, - -0.937138431503274140, - 0.348778119628908420, -0.937205326098887960, 0.348598406347655040, - -0.937272186236140950, - 0.348418680249434510, -0.937339011912574960, 0.348238941340855310, - -0.937405803125732850, - 0.348059189628525780, -0.937472559873159140, 0.347879425119054510, - -0.937539282152399230, - 0.347699647819051490, -0.937605969960999990, 0.347519857735126110, - -0.937672623296509470, - 0.347340054873889190, -0.937739242156476970, 0.347160239241951330, - -0.937805826538453010, - 0.346980410845923680, -0.937872376439989890, 0.346800569692418400, - -0.937938891858640210, - 0.346620715788047320, -0.938005372791958840, 0.346440849139423580, - -0.938071819237501160, - 0.346260969753160170, -0.938138231192824360, 0.346081077635870480, - -0.938204608655486490, - 0.345901172794169100, -0.938270951623047080, 0.345721255234670120, - -0.938337260093066950, - 0.345541324963989150, -0.938403534063108060, 0.345361381988741170, - -0.938469773530733800, - 0.345181426315542610, -0.938535978493508560, 0.345001457951009780, - -0.938602148948998290, - 0.344821476901759290, -0.938668284894770170, 0.344641483174409070, - -0.938734386328392460, - 0.344461476775576480, -0.938800453247434770, 0.344281457711880230, - -0.938866485649468060, - 0.344101425989938980, -0.938932483532064490, 0.343921381616371700, - -0.938998446892797540, - 0.343741324597798600, -0.939064375729241950, 0.343561254940839330, - -0.939130270038973650, - 0.343381172652115100, -0.939196129819569900, 0.343201077738246710, - -0.939261955068609100, - 0.343020970205855540, -0.939327745783671400, 0.342840850061564060, - -0.939393501962337510, - 0.342660717311994380, -0.939459223602189920, 0.342480571963769850, - -0.939524910700812120, - 0.342300414023513690, -0.939590563255789160, 0.342120243497849590, - -0.939656181264707070, - 0.341940060393402300, -0.939721764725153340, 0.341759864716796310, - -0.939787313634716570, - 0.341579656474657210, -0.939852827990986680, 0.341399435673610360, - -0.939918307791555050, - 0.341219202320282410, -0.939983753034013940, 0.341038956421299830, - -0.940049163715957370, - 0.340858697983289440, -0.940114539834980280, 0.340678427012879310, - -0.940179881388678810, - 0.340498143516697100, -0.940245188374650880, 0.340317847501371730, - -0.940310460790495070, - 0.340137538973531880, -0.940375698633811540, 0.339957217939806880, - -0.940440901902201750, - 0.339776884406826960, -0.940506070593268300, 0.339596538381222060, - -0.940571204704615190, - 0.339416179869623410, -0.940636304233847590, 0.339235808878662120, - -0.940701369178571940, - 0.339055425414969640, -0.940766399536396070, 0.338875029485178560, - -0.940831395304928870, - 0.338694621095921190, -0.940896356481780830, 0.338514200253831000, - -0.940961283064563280, - 0.338333766965541290, -0.941026175050889260, 0.338153321237685990, - -0.941091032438372780, - 0.337972863076899830, -0.941155855224629190, 0.337792392489817460, - -0.941220643407275180, - 0.337611909483074680, -0.941285396983928660, 0.337431414063306790, - -0.941350115952208970, - 0.337250906237150650, -0.941414800309736230, 0.337070386011242730, - -0.941479450054132580, - 0.336889853392220050, -0.941544065183020810, 0.336709308386720700, - -0.941608645694025140, - 0.336528751001382350, -0.941673191584771360, 0.336348181242844100, - -0.941737702852886160, - 0.336167599117744690, -0.941802179495997650, 0.335987004632723350, - -0.941866621511735280, - 0.335806397794420560, -0.941931028897729510, 0.335625778609476230, - -0.941995401651612550, - 0.335445147084531660, -0.942059739771017310, 0.335264503226227970, - -0.942124043253578460, - 0.335083847041206580, -0.942188312096931770, 0.334903178536110290, - -0.942252546298714020, - 0.334722497717581220, -0.942316745856563780, 0.334541804592262960, - -0.942380910768120470, - 0.334361099166798900, -0.942445041031024890, 0.334180381447832740, - -0.942509136642919240, - 0.333999651442009490, -0.942573197601446870, 0.333818909155973620, - -0.942637223904252530, - 0.333638154596370920, -0.942701215548981900, 0.333457387769846790, - -0.942765172533282510, - 0.333276608683047980, -0.942829094854802710, 0.333095817342620890, - -0.942892982511192130, - 0.332915013755212650, -0.942956835500102120, 0.332734197927471160, - -0.943020653819184650, - 0.332553369866044220, -0.943084437466093490, 0.332372529577580680, - -0.943148186438483420, - 0.332191677068729320, -0.943211900734010620, 0.332010812346139380, - -0.943275580350332540, - 0.331829935416461220, -0.943339225285107720, 0.331649046286344620, - -0.943402835535996240, - 0.331468144962440920, -0.943466411100659320, 0.331287231451400990, - -0.943529951976759370, - 0.331106305759876430, -0.943593458161960390, 0.330925367894519650, - -0.943656929653927110, - 0.330744417861982890, -0.943720366450326200, 0.330563455668919590, - -0.943783768548825060, - 0.330382481321982950, -0.943847135947092690, 0.330201494827826620, - -0.943910468642799150, - 0.330020496193105530, -0.943973766633615980, 0.329839485424473940, - -0.944037029917215830, - 0.329658462528587550, -0.944100258491272660, 0.329477427512101680, - -0.944163452353461770, - 0.329296380381672800, -0.944226611501459810, 0.329115321143957360, - -0.944289735932944410, - 0.328934249805612200, -0.944352825645594750, 0.328753166373295100, - -0.944415880637091250, - 0.328572070853663690, -0.944478900905115550, 0.328390963253376630, - -0.944541886447350380, - 0.328209843579092660, -0.944604837261480260, 0.328028711837470730, - -0.944667753345190490, - 0.327847568035170960, -0.944730634696167800, 0.327666412178853060, - -0.944793481312100280, - 0.327485244275178060, -0.944856293190677210, 0.327304064330806830, - -0.944919070329589220, - 0.327122872352400510, -0.944981812726528150, 0.326941668346621530, - -0.945044520379187070, - 0.326760452320131790, -0.945107193285260610, 0.326579224279594460, - -0.945169831442444150, - 0.326397984231672660, -0.945232434848434890, 0.326216732183029770, - -0.945295003500931100, - 0.326035468140330350, -0.945357537397632290, 0.325854192110238580, - -0.945420036536239070, - 0.325672904099419900, -0.945482500914453740, 0.325491604114539260, - -0.945544930529979680, - 0.325310292162262980, -0.945607325380521280, 0.325128968249257190, - -0.945669685463784710, - 0.324947632382188430, -0.945732010777477150, 0.324766284567724330, - -0.945794301319306860, - 0.324584924812532150, -0.945856557086983910, 0.324403553123280290, - -0.945918778078219110, - 0.324222169506637130, -0.945980964290724760, 0.324040773969271450, - -0.946043115722214560, - 0.323859366517852960, -0.946105232370403340, 0.323677947159051180, - -0.946167314233007370, - 0.323496515899536760, -0.946229361307743820, 0.323315072745980150, - -0.946291373592331510, - 0.323133617705052330, -0.946353351084490590, 0.322952150783425370, - -0.946415293781942110, - 0.322770671987770710, -0.946477201682408680, 0.322589181324761390, - -0.946539074783614100, - 0.322407678801070020, -0.946600913083283530, 0.322226164423369650, - -0.946662716579143360, - 0.322044638198334620, -0.946724485268921170, 0.321863100132638580, - -0.946786219150346000, - 0.321681550232956640, -0.946847918221148000, 0.321499988505963450, - -0.946909582479058760, - 0.321318414958334910, -0.946971211921810880, 0.321136829596746780, - -0.947032806547138620, - 0.320955232427875210, -0.947094366352777220, 0.320773623458397440, - -0.947155891336463270, - 0.320592002694990330, -0.947217381495934820, 0.320410370144331880, - -0.947278836828930880, - 0.320228725813100020, -0.947340257333191940, 0.320047069707973140, - -0.947401643006459900, - 0.319865401835630610, -0.947462993846477700, 0.319683722202751370, - -0.947524309850989570, - 0.319502030816015750, -0.947585591017741090, 0.319320327682103720, - -0.947646837344479190, - 0.319138612807695900, -0.947708048828952100, 0.318956886199473770, - -0.947769225468909180, - 0.318775147864118480, -0.947830367262101010, 0.318593397808312470, - -0.947891474206279730, - 0.318411636038737960, -0.947952546299198560, 0.318229862562077580, - -0.948013583538612200, - 0.318048077385015060, -0.948074585922276230, 0.317866280514233660, - -0.948135553447947980, - 0.317684471956418020, -0.948196486113385580, 0.317502651718252260, - -0.948257383916349060, - 0.317320819806421790, -0.948318246854599090, 0.317138976227611890, - -0.948379074925898120, - 0.316957120988508150, -0.948439868128009620, 0.316775254095797380, - -0.948500626458698260, - 0.316593375556165850, -0.948561349915730270, 0.316411485376301090, - -0.948622038496872990, - 0.316229583562890490, -0.948682692199895090, 0.316047670122621860, - -0.948743311022566480, - 0.315865745062184070, -0.948803894962658380, 0.315683808388265600, - -0.948864444017943340, - 0.315501860107556040, -0.948924958186195160, 0.315319900226745050, - -0.948985437465188710, - 0.315137928752522440, -0.949045881852700560, 0.314955945691579250, - -0.949106291346508260, - 0.314773951050606070, -0.949166665944390700, 0.314591944836294710, - -0.949227005644128210, - 0.314409927055336820, -0.949287310443502010, 0.314227897714424500, - -0.949347580340295210, - 0.314045856820250820, -0.949407815332291460, 0.313863804379508500, - -0.949468015417276550, - 0.313681740398891570, -0.949528180593036670, 0.313499664885093450, - -0.949588310857359950, - 0.313317577844809070, -0.949648406208035480, 0.313135479284732950, - -0.949708466642853800, - 0.312953369211560200, -0.949768492159606680, 0.312771247631986880, - -0.949828482756087000, - 0.312589114552708660, -0.949888438430089300, 0.312406969980422500, - -0.949948359179409010, - 0.312224813921825050, -0.950008245001843000, 0.312042646383613510, - -0.950068095895189590, - 0.311860467372486130, -0.950127911857248100, 0.311678276895140550, - -0.950187692885819280, - 0.311496074958275970, -0.950247438978705230, 0.311313861568591090, - -0.950307150133709140, - 0.311131636732785270, -0.950366826348635780, 0.310949400457558760, - -0.950426467621290900, - 0.310767152749611470, -0.950486073949481700, 0.310584893615644560, - -0.950545645331016600, - 0.310402623062358880, -0.950605181763705230, 0.310220341096455910, - -0.950664683245358910, - 0.310038047724638000, -0.950724149773789610, 0.309855742953607130, - -0.950783581346811070, - 0.309673426790066490, -0.950842977962238160, 0.309491099240719050, - -0.950902339617887060, - 0.309308760312268780, -0.950961666311575080, 0.309126410011419550, - -0.951020958041121080, - 0.308944048344875710, -0.951080214804345010, 0.308761675319342570, - -0.951139436599068190, - 0.308579290941525030, -0.951198623423113230, 0.308396895218129240, - -0.951257775274304000, - 0.308214488155861220, -0.951316892150465550, 0.308032069761427330, - -0.951375974049424420, - 0.307849640041534980, -0.951435020969008340, 0.307667199002891190, - -0.951494032907046370, - 0.307484746652204160, -0.951553009861368590, 0.307302282996181950, - -0.951611951829806730, - 0.307119808041533100, -0.951670858810193860, 0.306937321794967020, - -0.951729730800363720, - 0.306754824263192780, -0.951788567798152130, 0.306572315452920800, - -0.951847369801395620, - 0.306389795370861080, -0.951906136807932230, 0.306207264023724280, - -0.951964868815601380, - 0.306024721418221900, -0.952023565822243570, 0.305842167561065080, - -0.952082227825700620, - 0.305659602458966230, -0.952140854823815830, 0.305477026118637360, - -0.952199446814433580, - 0.305294438546791720, -0.952258003795399600, 0.305111839750142220, - -0.952316525764560830, - 0.304929229735402430, -0.952375012719765880, 0.304746608509286640, - -0.952433464658864030, - 0.304563976078509050, -0.952491881579706320, 0.304381332449784940, - -0.952550263480144930, - 0.304198677629829270, -0.952608610358033240, 0.304016011625357570, - -0.952666922211226170, - 0.303833334443086470, -0.952725199037579570, 0.303650646089731910, - -0.952783440834950920, - 0.303467946572011370, -0.952841647601198720, 0.303285235896641910, - -0.952899819334182880, - 0.303102514070341060, -0.952957956031764700, 0.302919781099827420, - -0.953016057691806530, - 0.302737036991819140, -0.953074124312172200, 0.302554281753035670, - -0.953132155890726750, - 0.302371515390196130, -0.953190152425336560, 0.302188737910020040, - -0.953248113913869320, - 0.302005949319228200, -0.953306040354193750, 0.301823149624540650, - -0.953363931744180330, - 0.301640338832678880, -0.953421788081700310, 0.301457516950363940, - -0.953479609364626610, - 0.301274683984318000, -0.953537395590833280, 0.301091839941263210, - -0.953595146758195680, - 0.300908984827921890, -0.953652862864590500, 0.300726118651017620, - -0.953710543907895560, - 0.300543241417273400, -0.953768189885990330, 0.300360353133413580, - -0.953825800796755050, - 0.300177453806162120, -0.953883376638071770, 0.299994543442243580, - -0.953940917407823500, - 0.299811622048383460, -0.953998423103894490, 0.299628689631306790, - -0.954055893724170660, - 0.299445746197739950, -0.954113329266538800, 0.299262791754409010, - -0.954170729728887280, - 0.299079826308040480, -0.954228095109105670, 0.298896849865361910, - -0.954285425405084650, - 0.298713862433100390, -0.954342720614716480, 0.298530864017984230, - -0.954399980735894490, - 0.298347854626741570, -0.954457205766513490, 0.298164834266100910, - -0.954514395704469500, - 0.297981802942791920, -0.954571550547659630, 0.297798760663543550, - -0.954628670293982680, - 0.297615707435086310, -0.954685754941338340, 0.297432643264150030, - -0.954742804487627940, - 0.297249568157465890, -0.954799818930753720, 0.297066482121764840, - -0.954856798268619580, - 0.296883385163778270, -0.954913742499130520, 0.296700277290238460, - -0.954970651620192790, - 0.296517158507877410, -0.955027525629714160, 0.296334028823428240, - -0.955084364525603410, - 0.296150888243623960, -0.955141168305770670, 0.295967736775197890, - -0.955197936968127710, - 0.295784574424884370, -0.955254670510586990, 0.295601401199417360, - -0.955311368931062720, - 0.295418217105532070, -0.955368032227470240, 0.295235022149963390, - -0.955424660397726330, - 0.295051816339446720, -0.955481253439748770, 0.294868599680718380, - -0.955537811351456770, - 0.294685372180514330, -0.955594334130771110, 0.294502133845571720, - -0.955650821775613220, - 0.294318884682627570, -0.955707274283906560, 0.294135624698419080, - -0.955763691653575440, - 0.293952353899684770, -0.955820073882545420, 0.293769072293162400, - -0.955876420968743590, - 0.293585779885591310, -0.955932732910098170, 0.293402476683710060, - -0.955989009704538930, - 0.293219162694258680, -0.956045251349996410, 0.293035837923976920, - -0.956101457844403040, - 0.292852502379604810, -0.956157629185692140, 0.292669156067883570, - -0.956213765371798470, - 0.292485798995553830, -0.956269866400658140, 0.292302431169357610, - -0.956325932270208230, - 0.292119052596036540, -0.956381962978387620, 0.291935663282332780, - -0.956437958523136180, - 0.291752263234989370, -0.956493918902394990, 0.291568852460749040, - -0.956549844114106820, - 0.291385430966355720, -0.956605734156215080, 0.291201998758553020, - -0.956661589026664980, - 0.291018555844085090, -0.956717408723403050, 0.290835102229696940, - -0.956773193244376930, - 0.290651637922133220, -0.956828942587535370, 0.290468162928139870, - -0.956884656750828900, - 0.290284677254462330, -0.956940335732208940, 0.290101180907847140, - -0.956995979529628230, - 0.289917673895040860, -0.957051588141040970, 0.289734156222790250, - -0.957107161564402790, - 0.289550627897843140, -0.957162699797670100, 0.289367088926946960, - -0.957218202838801210, - 0.289183539316850310, -0.957273670685755200, 0.288999979074301530, - -0.957329103336492790, - 0.288816408206049480, -0.957384500788975860, 0.288632826718843940, - -0.957439863041167570, - 0.288449234619434170, -0.957495190091032570, 0.288265631914570830, - -0.957550481936536470, - 0.288082018611004300, -0.957605738575646240, 0.287898394715485170, - -0.957660960006330610, - 0.287714760234765280, -0.957716146226558870, 0.287531115175595930, - -0.957771297234302320, - 0.287347459544729570, -0.957826413027532910, 0.287163793348918560, - -0.957881493604224250, - 0.286980116594915570, -0.957936538962351420, 0.286796429289474190, - -0.957991549099890370, - 0.286612731439347790, -0.958046524014818600, 0.286429023051290750, - -0.958101463705114620, - 0.286245304132057120, -0.958156368168758820, 0.286061574688402100, - -0.958211237403732260, - 0.285877834727080730, -0.958266071408017670, 0.285694084254848320, - -0.958320870179598880, - 0.285510323278461380, -0.958375633716461170, 0.285326551804675810, - -0.958430362016591040, - 0.285142769840248720, -0.958485055077976100, 0.284958977391937150, - -0.958539712898605730, - 0.284775174466498300, -0.958594335476470220, 0.284591361070690550, - -0.958648922809561040, - 0.284407537211271820, -0.958703474895871600, 0.284223702895001100, - -0.958757991733395710, - 0.284039858128637360, -0.958812473320129200, 0.283856002918939750, - -0.958866919654069010, - 0.283672137272668550, -0.958921330733213060, 0.283488261196583550, - -0.958975706555561080, - 0.283304374697445790, -0.959030047119113550, 0.283120477782015990, - -0.959084352421872730, - 0.282936570457055390, -0.959138622461841890, 0.282752652729326040, - -0.959192857237025740, - 0.282568724605589740, -0.959247056745430090, 0.282384786092609420, - -0.959301220985062210, - 0.282200837197147500, -0.959355349953930790, 0.282016877925967690, - -0.959409443650045550, - 0.281832908285833460, -0.959463502071417510, 0.281648928283508680, - -0.959517525216059260, - 0.281464937925758050, -0.959571513081984520, 0.281280937219346110, - -0.959625465667208300, - 0.281096926171038320, -0.959679382969746750, 0.280912904787600120, - -0.959733264987617680, - 0.280728873075797190, -0.959787111718839900, 0.280544831042396360, - -0.959840923161433660, - 0.280360778694163810, -0.959894699313420530, 0.280176716037867040, - -0.959948440172823210, - 0.279992643080273380, -0.960002145737665850, 0.279808559828150390, - -0.960055816005973890, - 0.279624466288266700, -0.960109450975773940, 0.279440362467390510, - -0.960163050645094000, - 0.279256248372291240, -0.960216615011963430, 0.279072124009737970, - -0.960270144074412800, - 0.278887989386500280, -0.960323637830473920, 0.278703844509348600, - -0.960377096278180130, - 0.278519689385053060, -0.960430519415565790, 0.278335524020384970, - -0.960483907240666790, - 0.278151348422115090, -0.960537259751520050, 0.277967162597015430, - -0.960590576946164120, - 0.277782966551857800, -0.960643858822638470, 0.277598760293414290, - -0.960697105378984450, - 0.277414543828458200, -0.960750316613243950, 0.277230317163762120, - -0.960803492523460760, - 0.277046080306099950, -0.960856633107679660, 0.276861833262245390, - -0.960909738363946770, - 0.276677576038972420, -0.960962808290309780, 0.276493308643056100, - -0.961015842884817230, - 0.276309031081271030, -0.961068842145519350, 0.276124743360392890, - -0.961121806070467380, - 0.275940445487197320, -0.961174734657714080, 0.275756137468460120, - -0.961227627905313460, - 0.275571819310958250, -0.961280485811320640, 0.275387491021468140, - -0.961333308373792270, - 0.275203152606767370, -0.961386095590786250, 0.275018804073633380, - -0.961438847460361570, - 0.274834445428843940, -0.961491563980579000, 0.274650076679177790, - -0.961544245149499990, - 0.274465697831413220, -0.961596890965187860, 0.274281308892329710, - -0.961649501425706820, - 0.274096909868706330, -0.961702076529122540, 0.273912500767323320, - -0.961754616273502010, - 0.273728081594960650, -0.961807120656913540, 0.273543652358398730, - -0.961859589677426570, - 0.273359213064418790, -0.961912023333112100, 0.273174763719801870, - -0.961964421622042320, - 0.272990304331329980, -0.962016784542290560, 0.272805834905784920, - -0.962069112091931580, - 0.272621355449948980, -0.962121404269041580, 0.272436865970605350, - -0.962173661071697770, - 0.272252366474536660, -0.962225882497979020, 0.272067856968526980, - -0.962278068545965090, - 0.271883337459359890, -0.962330219213737400, 0.271698807953819510, - -0.962382334499378380, - 0.271514268458690810, -0.962434414400971990, 0.271329718980758420, - -0.962486458916603450, - 0.271145159526808070, -0.962538468044359160, 0.270960590103625330, - -0.962590441782326780, - 0.270776010717996010, -0.962642380128595710, 0.270591421376707050, - -0.962694283081255930, - 0.270406822086544820, -0.962746150638399410, 0.270222212854296930, - -0.962797982798119010, - 0.270037593686750510, -0.962849779558509030, 0.269852964590693910, - -0.962901540917665000, - 0.269668325572915200, -0.962953266873683880, 0.269483676640202840, - -0.963004957424663850, - 0.269299017799346230, -0.963056612568704340, 0.269114349057134330, - -0.963108232303906190, - 0.268929670420357310, -0.963159816628371360, 0.268744981895805090, - -0.963211365540203480, - 0.268560283490267890, -0.963262879037507070, 0.268375575210537010, - -0.963314357118388090, - 0.268190857063403180, -0.963365799780954050, 0.268006129055658350, - -0.963417207023313350, - 0.267821391194094320, -0.963468578843575950, 0.267636643485503090, - -0.963519915239853140, - 0.267451885936677740, -0.963571216210257210, 0.267267118554410930, - -0.963622481752902220, - 0.267082341345496350, -0.963673711865903230, 0.266897554316727510, - -0.963724906547376410, - 0.266712757474898420, -0.963776065795439840, 0.266527950826803810, - -0.963827189608212340, - 0.266343134379238180, -0.963878277983814200, 0.266158308138997050, - -0.963929330920367140, - 0.265973472112875530, -0.963980348415994110, 0.265788626307669970, - -0.964031330468819280, - 0.265603770730176440, -0.964082277076968140, 0.265418905387191260, - -0.964133188238567640, - 0.265234030285511900, -0.964184063951745720, 0.265049145431935200, - -0.964234904214632200, - 0.264864250833259320, -0.964285709025357370, 0.264679346496282050, - -0.964336478382053720, - 0.264494432427801630, -0.964387212282854290, 0.264309508634617220, - -0.964437910725893910, - 0.264124575123527490, -0.964488573709308410, 0.263939631901332410, - -0.964539201231235150, - 0.263754678974831510, -0.964589793289812650, 0.263569716350824880, - -0.964640349883180930, - 0.263384744036113390, -0.964690871009480920, 0.263199762037497560, - -0.964741356666855340, - 0.263014770361779060, -0.964791806853447900, 0.262829769015759330, - -0.964842221567403510, - 0.262644758006240100, -0.964892600806868890, 0.262459737340024090, - -0.964942944569991410, - 0.262274707023913590, -0.964993252854920320, 0.262089667064712100, - -0.965043525659805890, - 0.261904617469222560, -0.965093762982799590, 0.261719558244249080, - -0.965143964822054450, - 0.261534489396595630, -0.965194131175724720, 0.261349410933066350, - -0.965244262041965780, - 0.261164322860466590, -0.965294357418934660, 0.260979225185601020, - -0.965344417304789370, - 0.260794117915275570, -0.965394441697689400, 0.260609001056295920, - -0.965444430595795430, - 0.260423874615468010, -0.965494383997269500, 0.260238738599598950, - -0.965544301900275070, - 0.260053593015495130, -0.965594184302976830, 0.259868437869964330, - -0.965644031203540590, - 0.259683273169813930, -0.965693842600133690, 0.259498098921851660, - -0.965743618490924830, - 0.259312915132886350, -0.965793358874083570, 0.259127721809726150, - -0.965843063747781510, - 0.258942518959180580, -0.965892733110190860, 0.258757306588058840, - -0.965942366959485540, - 0.258572084703170390, -0.965991965293840570, 0.258386853311325710, - -0.966041528111432400, - 0.258201612419334870, -0.966091055410438830, 0.258016362034009070, - -0.966140547189038750, - 0.257831102162158930, -0.966190003445412620, 0.257645832810596440, - -0.966239424177741890, - 0.257460553986133210, -0.966288809384209580, 0.257275265695581120, - -0.966338159063000130, - 0.257089967945753230, -0.966387473212298790, 0.256904660743461850, - -0.966436751830292650, - 0.256719344095520720, -0.966485994915169840, 0.256534018008743200, - -0.966535202465119700, - 0.256348682489942910, -0.966584374478333120, 0.256163337545934570, - -0.966633510953002100, - 0.255977983183532380, -0.966682611887320190, 0.255792619409551670, - -0.966731677279481840, - 0.255607246230807550, -0.966780707127683270, 0.255421863654115460, - -0.966829701430121810, - 0.255236471686291820, -0.966878660184995910, 0.255051070334152530, - -0.966927583390505660, - 0.254865659604514630, -0.966976471044852070, 0.254680239504194990, - -0.967025323146237900, - 0.254494810040010790, -0.967074139692867040, 0.254309371218780110, - -0.967122920682944360, - 0.254123923047320620, -0.967171666114676640, 0.253938465532451140, - -0.967220375986271310, - 0.253752998680989940, -0.967269050295937790, 0.253567522499756610, - -0.967317689041886310, - 0.253382036995570270, -0.967366292222328510, 0.253196542175250560, - -0.967414859835477480, - 0.253011038045617980, -0.967463391879547440, 0.252825524613492610, - -0.967511888352754150, - 0.252640001885695580, -0.967560349253314360, 0.252454469869047900, - -0.967608774579446380, - 0.252268928570370810, -0.967657164329369880, 0.252083377996486560, - -0.967705518501305480, - 0.251897818154216910, -0.967753837093475510, 0.251712249050384750, - -0.967802120104103270, - 0.251526670691812780, -0.967850367531413620, 0.251341083085323880, - -0.967898579373632660, - 0.251155486237742030, -0.967946755628987800, 0.250969880155890720, - -0.967994896295707670, - 0.250784264846594550, -0.968043001372022260, 0.250598640316677830, - -0.968091070856162970, - 0.250413006572965280, -0.968139104746362330, 0.250227363622282540, - -0.968187103040854420, - 0.250041711471454650, -0.968235065737874320, 0.249856050127308050, - -0.968282992835658660, - 0.249670379596668520, -0.968330884332445300, 0.249484699886363010, - -0.968378740226473300, - 0.249299011003218300, -0.968426560515983190, 0.249113312954061360, - -0.968474345199216820, - 0.248927605745720260, -0.968522094274417270, 0.248741889385022420, - -0.968569807739828930, - 0.248556163878796620, -0.968617485593697540, 0.248370429233871150, - -0.968665127834269950, - 0.248184685457074780, -0.968712734459794780, 0.247998932555237220, - -0.968760305468521430, - 0.247813170535187620, -0.968807840858700970, 0.247627399403756330, - -0.968855340628585580, - 0.247441619167773440, -0.968902804776428870, 0.247255829834069320, - -0.968950233300485800, - 0.247070031409475370, -0.968997626199012310, 0.246884223900822430, - -0.969044983470266240, - 0.246698407314942500, -0.969092305112506100, 0.246512581658667380, - -0.969139591123992280, - 0.246326746938829060, -0.969186841502985950, 0.246140903162260640, - -0.969234056247750050, - 0.245955050335794590, -0.969281235356548530, 0.245769188466264670, - -0.969328378827646660, - 0.245583317560504000, -0.969375486659311280, 0.245397437625346990, - -0.969422558849810320, - 0.245211548667627680, -0.969469595397412950, 0.245025650694180470, - -0.969516596300390000, - 0.244839743711840750, -0.969563561557013180, 0.244653827727443320, - -0.969610491165555870, - 0.244467902747824210, -0.969657385124292450, 0.244281968779819170, - -0.969704243431498750, - 0.244096025830264210, -0.969751066085452140, 0.243910073905996370, - -0.969797853084430890, - 0.243724113013852130, -0.969844604426714830, 0.243538143160669180, - -0.969891320110585100, - 0.243352164353284880, -0.969938000134323960, 0.243166176598536930, - -0.969984644496215240, - 0.242980179903263980, -0.970031253194543970, 0.242794174274304190, - -0.970077826227596420, - 0.242608159718496890, -0.970124363593660280, 0.242422136242681050, - -0.970170865291024360, - 0.242236103853696040, -0.970217331317979160, 0.242050062558382180, - -0.970263761672816140, - 0.241864012363579210, -0.970310156353828110, 0.241677953276128090, - -0.970356515359309450, - 0.241491885302869300, -0.970402838687555500, 0.241305808450644390, - -0.970449126336863090, - 0.241119722726294730, -0.970495378305530450, 0.240933628136661910, - -0.970541594591857070, - 0.240747524688588540, -0.970587775194143630, 0.240561412388916620, - -0.970633920110692160, - 0.240375291244489500, -0.970680029339806130, 0.240189161262150040, - -0.970726102879790110, - 0.240003022448741500, -0.970772140728950350, 0.239816874811108110, - -0.970818142885593870, - 0.239630718356093560, -0.970864109348029470, 0.239444553090542720, - -0.970910040114567050, - 0.239258379021300120, -0.970955935183517970, 0.239072196155210660, - -0.971001794553194690, - 0.238886004499120170, -0.971047618221911100, 0.238699804059873950, - -0.971093406187982460, - 0.238513594844318500, -0.971139158449725090, 0.238327376859299970, - -0.971184875005457030, - 0.238141150111664870, -0.971230555853497380, 0.237954914608260650, - -0.971276200992166490, - 0.237768670355934210, -0.971321810419786160, 0.237582417361533650, - -0.971367384134679490, - 0.237396155631906550, -0.971412922135170940, 0.237209885173901620, - -0.971458424419585960, - 0.237023605994367340, -0.971503890986251780, 0.236837318100152380, - -0.971549321833496630, - 0.236651021498106460, -0.971594716959650160, 0.236464716195078750, - -0.971640076363043390, - 0.236278402197919620, -0.971685400042008540, 0.236092079513479050, - -0.971730687994879160, - 0.235905748148607370, -0.971775940219990140, 0.235719408110155930, - -0.971821156715677700, - 0.235533059404975460, -0.971866337480279400, 0.235346702039917920, - -0.971911482512134000, - 0.235160336021834860, -0.971956591809581600, 0.234973961357578310, - -0.972001665370963890, - 0.234787578054001080, -0.972046703194623380, 0.234601186117955550, - -0.972091705278904430, - 0.234414785556295250, -0.972136671622152120, 0.234228376375873380, - -0.972181602222713440, - 0.234041958583543460, -0.972226497078936270, 0.233855532186159950, - -0.972271356189170040, - 0.233669097190576820, -0.972316179551765300, 0.233482653603649170, - -0.972360967165074140, - 0.233296201432231560, -0.972405719027449770, 0.233109740683179740, - -0.972450435137246830, - 0.232923271363349120, -0.972495115492821190, 0.232736793479595420, - -0.972539760092530180, - 0.232550307038775330, -0.972584368934732210, 0.232363812047745010, - -0.972628942017787270, - 0.232177308513361770, -0.972673479340056430, 0.231990796442482580, - -0.972717980899902250, - 0.231804275841964780, -0.972762446695688570, 0.231617746718666580, - -0.972806876725780370, - 0.231431209079445730, -0.972851270988544180, 0.231244662931161110, - -0.972895629482347760, - 0.231058108280671280, -0.972939952205560070, 0.230871545134835070, - -0.972984239156551740, - 0.230684973500512310, -0.973028490333694100, 0.230498393384562320, - -0.973072705735360530, - 0.230311804793845530, -0.973116885359925130, 0.230125207735222020, - -0.973161029205763530, - 0.229938602215552260, -0.973205137271252800, 0.229751988241697600, - -0.973249209554771120, - 0.229565365820518870, -0.973293246054698250, 0.229378734958878120, - -0.973337246769414800, - 0.229192095663636740, -0.973381211697303290, 0.229005447941657390, - -0.973425140836747030, - 0.228818791799802360, -0.973469034186130950, 0.228632127244934230, - -0.973512891743841370, - 0.228445454283916550, -0.973556713508265560, 0.228258772923612350, - -0.973600499477792370, - 0.228072083170885790, -0.973644249650811870, 0.227885385032600700, - -0.973687964025715670, - 0.227698678515621170, -0.973731642600896400, 0.227511963626812390, - -0.973775285374748000, - 0.227325240373038830, -0.973818892345666100, 0.227138508761166260, - -0.973862463512047300, - 0.226951768798059980, -0.973905998872289460, 0.226765020490585720, - -0.973949498424792170, - 0.226578263845610110, -0.973992962167955830, 0.226391498869999210, - -0.974036390100182610, - 0.226204725570620270, -0.974079782219875680, 0.226017943954340190, - -0.974123138525439520, - 0.225831154028026200, -0.974166459015280320, 0.225644355798546440, - -0.974209743687805110, - 0.225457549272768540, -0.974252992541422500, 0.225270734457561240, - -0.974296205574542330, - 0.225083911359792780, -0.974339382785575860, 0.224897079986332540, - -0.974382524172935470, - 0.224710240344049570, -0.974425629735034990, 0.224523392439813170, - -0.974468699470289580, - 0.224336536280493690, -0.974511733377115720, 0.224149671872960840, - -0.974554731453931230, - 0.223962799224085520, -0.974597693699155050, 0.223775918340738290, - -0.974640620111207560, - 0.223589029229790020, -0.974683510688510670, 0.223402131898112480, - -0.974726365429487320, - 0.223215226352576960, -0.974769184332561770, 0.223028312600055870, - -0.974811967396159830, - 0.222841390647421280, -0.974854714618708430, 0.222654460501545550, - -0.974897425998635820, - 0.222467522169301990, -0.974940101534371720, 0.222280575657563370, - -0.974982741224347140, - 0.222093620973203590, -0.975025345066994120, 0.221906658123096260, - -0.975067913060746360, - 0.221719687114115240, -0.975110445204038890, 0.221532707953135340, - -0.975152941495307620, - 0.221345720647030810, -0.975195401932990370, 0.221158725202677100, - -0.975237826515525820, - 0.220971721626949060, -0.975280215241354220, 0.220784709926722670, - -0.975322568108916930, - 0.220597690108873650, -0.975364885116656870, 0.220410662180277940, - -0.975407166263018270, - 0.220223626147812460, -0.975449411546446380, 0.220036582018353550, - -0.975491620965388110, - 0.219849529798778750, -0.975533794518291360, 0.219662469495965180, - -0.975575932203605610, - 0.219475401116790340, -0.975618034019781750, 0.219288324668132580, - -0.975660099965271590, - 0.219101240156869770, -0.975702130038528570, 0.218914147589880900, - -0.975744124238007270, - 0.218727046974044600, -0.975786082562163930, 0.218539938316239830, - -0.975828005009455550, - 0.218352821623346430, -0.975869891578341030, 0.218165696902243770, - -0.975911742267280170, - 0.217978564159812290, -0.975953557074734300, 0.217791423402932120, - -0.975995335999165880, - 0.217604274638483670, -0.976037079039039020, 0.217417117873348300, - -0.976078786192818850, - 0.217229953114406790, -0.976120457458971910, 0.217042780368541080, - -0.976162092835966110, - 0.216855599642632570, -0.976203692322270560, 0.216668410943563790, - -0.976245255916355800, - 0.216481214278216900, -0.976286783616693630, 0.216294009653474370, - -0.976328275421757260, - 0.216106797076219600, -0.976369731330021140, 0.215919576553335460, - -0.976411151339961040, - 0.215732348091705940, -0.976452535450054060, 0.215545111698214660, - -0.976493883658778540, - 0.215357867379745550, -0.976535195964614470, 0.215170615143183500, - -0.976576472366042610, - 0.214983354995412820, -0.976617712861545640, 0.214796086943318920, - -0.976658917449606980, - 0.214608810993786920, -0.976700086128711840, 0.214421527153702190, - -0.976741218897346550, - 0.214234235429951100, -0.976782315753998650, 0.214046935829419330, - -0.976823376697157240, - 0.213859628358993830, -0.976864401725312640, 0.213672313025561140, - -0.976905390836956490, - 0.213484989836008080, -0.976946344030581560, 0.213297658797222430, - -0.976987261304682390, - 0.213110319916091360, -0.977028142657754390, 0.212922973199503260, - -0.977068988088294450, - 0.212735618654345870, -0.977109797594800880, 0.212548256287508120, - -0.977150571175773200, - 0.212360886105878580, -0.977191308829712280, 0.212173508116346080, - -0.977232010555120320, - 0.211986122325800410, -0.977272676350500860, 0.211798728741130820, - -0.977313306214358750, - 0.211611327369227610, -0.977353900145199960, 0.211423918216980810, - -0.977394458141532250, - 0.211236501291280710, -0.977434980201864260, 0.211049076599018500, - -0.977475466324706050, - 0.210861644147084830, -0.977515916508569280, 0.210674203942371490, - -0.977556330751966460, - 0.210486755991769890, -0.977596709053411780, 0.210299300302171750, - -0.977637051411420770, - 0.210111836880469720, -0.977677357824509930, 0.209924365733555860, - -0.977717628291197570, - 0.209736886868323370, -0.977757862810002760, 0.209549400291665110, - -0.977798061379446360, - 0.209361906010474190, -0.977838223998050430, 0.209174404031644700, - -0.977878350664338150, - 0.208986894362070070, -0.977918441376834370, 0.208799377008644980, - -0.977958496134064830, - 0.208611851978263460, -0.977998514934557140, 0.208424319277820650, - -0.978038497776839600, - 0.208236778914211470, -0.978078444659442380, 0.208049230894330940, - -0.978118355580896660, - 0.207861675225075150, -0.978158230539735050, 0.207674111913339540, - -0.978198069534491400, - 0.207486540966020700, -0.978237872563701090, 0.207298962390014880, - -0.978277639625900420, - 0.207111376192218560, -0.978317370719627650, 0.206923782379529210, - -0.978357065843421640, - 0.206736180958843660, -0.978396724995823090, 0.206548571937059940, - -0.978436348175373730, - 0.206360955321075680, -0.978475935380616830, 0.206173331117788770, - -0.978515486610096910, - 0.205985699334098050, -0.978555001862359550, 0.205798059976901760, - -0.978594481135952270, - 0.205610413053099320, -0.978633924429423100, 0.205422758569589780, - -0.978673331741322210, - 0.205235096533272380, -0.978712703070200420, 0.205047426951047380, - -0.978752038414610340, - 0.204859749829814420, -0.978791337773105670, 0.204672065176474290, - -0.978830601144241470, - 0.204484372997927180, -0.978869828526574120, 0.204296673301074430, - -0.978909019918661310, - 0.204108966092817010, -0.978948175319062200, 0.203921251380056150, - -0.978987294726337050, - 0.203733529169694010, -0.979026378139047580, 0.203545799468632190, - -0.979065425555756930, - 0.203358062283773370, -0.979104436975029250, 0.203170317622019920, - -0.979143412395430230, - 0.202982565490274460, -0.979182351815526930, 0.202794805895440550, - -0.979221255233887700, - 0.202607038844421110, -0.979260122649082020, 0.202419264344120220, - -0.979298954059681040, - 0.202231482401441620, -0.979337749464256780, 0.202043693023289280, - -0.979376508861383170, - 0.201855896216568160, -0.979415232249634780, 0.201668091988182500, - -0.979453919627588210, - 0.201480280345037820, -0.979492570993820700, 0.201292461294039190, - -0.979531186346911390, - 0.201104634842091960, -0.979569765685440520, 0.200916800996102370, - -0.979608309007989450, - 0.200728959762976140, -0.979646816313141210, 0.200541111149620090, - -0.979685287599479930, - 0.200353255162940420, -0.979723722865591170, 0.200165391809844500, - -0.979762122110061640, - 0.199977521097239290, -0.979800485331479680, 0.199789643032032120, - -0.979838812528434740, - 0.199601757621131050, -0.979877103699517640, 0.199413864871443750, - -0.979915358843320480, - 0.199225964789878890, -0.979953577958436740, 0.199038057383344820, - -0.979991761043461200, - 0.198850142658750120, -0.980029908096989980, 0.198662220623004320, - -0.980068019117620650, - 0.198474291283016360, -0.980106094103951770, 0.198286354645696270, - -0.980144133054583590, - 0.198098410717953730, -0.980182135968117320, 0.197910459506698720, - -0.980220102843155970, - 0.197722501018842030, -0.980258033678303550, 0.197534535261294000, - -0.980295928472165290, - 0.197346562240966000, -0.980333787223347960, 0.197158581964769040, - -0.980371609930459690, - 0.196970594439614370, -0.980409396592109910, 0.196782599672414240, - -0.980447147206909060, - 0.196594597670080220, -0.980484861773469380, 0.196406588439525050, - -0.980522540290404090, - 0.196218571987660850, -0.980560182756327950, 0.196030548321400880, - -0.980597789169856850, - 0.195842517447657990, -0.980635359529608120, 0.195654479373345370, - -0.980672893834200530, - 0.195466434105377090, -0.980710392082253970, 0.195278381650666520, - -0.980747854272389750, - 0.195090322016128330, -0.980785280403230430, 0.194902255208676660, - -0.980822670473399990, - 0.194714181235225990, -0.980860024481523870, 0.194526100102691720, - -0.980897342426228390, - 0.194338011817988600, -0.980934624306141640, 0.194149916388032530, - -0.980971870119892840, - 0.193961813819739010, -0.981009079866112630, 0.193773704120023840, - -0.981046253543432780, - 0.193585587295803750, -0.981083391150486590, 0.193397463353994740, - -0.981120492685908730, - 0.193209332301514080, -0.981157558148334830, 0.193021194145278320, - -0.981194587536402320, - 0.192833048892205290, -0.981231580848749730, 0.192644896549212240, - -0.981268538084016710, - 0.192456737123216840, -0.981305459240844670, 0.192268570621137590, - -0.981342344317875930, - 0.192080397049892380, -0.981379193313754560, 0.191892216416400310, - -0.981416006227125550, - 0.191704028727579940, -0.981452783056635520, 0.191515833990350240, - -0.981489523800932130, - 0.191327632211630990, -0.981526228458664660, 0.191139423398341420, - -0.981562897028483650, - 0.190951207557401860, -0.981599529509040720, 0.190762984695732250, - -0.981636125898989080, - 0.190574754820252800, -0.981672686196983110, 0.190386517937884580, - -0.981709210401678800, - 0.190198274055548120, -0.981745698511732990, 0.190010023180165050, - -0.981782150525804310, - 0.189821765318656580, -0.981818566442552500, 0.189633500477944220, - -0.981854946260638630, - 0.189445228664950340, -0.981891289978724990, 0.189256949886596720, - -0.981927597595475540, - 0.189068664149806280, -0.981963869109555240, 0.188880371461501330, - -0.982000104519630490, - 0.188692071828605260, -0.982036303824369020, 0.188503765258041080, - -0.982072467022439890, - 0.188315451756732120, -0.982108594112513610, 0.188127131331602530, - -0.982144685093261580, - 0.187938803989575850, -0.982180739963357200, 0.187750469737576840, - -0.982216758721474510, - 0.187562128582529740, -0.982252741366289370, 0.187373780531359110, - -0.982288687896478830, - 0.187185425590990440, -0.982324598310721160, 0.186997063768348510, - -0.982360472607696210, - 0.186808695070359330, -0.982396310786084690, 0.186620319503948420, - -0.982432112844569110, - 0.186431937076041640, -0.982467878781833170, 0.186243547793565670, - -0.982503608596561720, - 0.186055151663446630, -0.982539302287441240, 0.185866748692611720, - -0.982574959853159240, - 0.185678338887987790, -0.982610581292404750, 0.185489922256501900, - -0.982646166603868050, - 0.185301498805082040, -0.982681715786240860, 0.185113068540655510, - -0.982717228838215990, - 0.184924631470150870, -0.982752705758487830, 0.184736187600495930, - -0.982788146545751970, - 0.184547736938619640, -0.982823551198705240, 0.184359279491450640, - -0.982858919716046110, - 0.184170815265917720, -0.982894252096474070, 0.183982344268950600, - -0.982929548338690060, - 0.183793866507478390, -0.982964808441396440, 0.183605381988431350, - -0.983000032403296590, - 0.183416890718739230, -0.983035220223095640, 0.183228392705332140, - -0.983070371899499640, - 0.183039887955141060, -0.983105487431216290, 0.182851376475096310, - -0.983140566816954500, - 0.182662858272129360, -0.983175610055424420, 0.182474333353171260, - -0.983210617145337640, - 0.182285801725153320, -0.983245588085407070, 0.182097263395007760, - -0.983280522874346970, - 0.181908718369666160, -0.983315421510872810, 0.181720166656061170, - -0.983350283993701500, - 0.181531608261125130, -0.983385110321551180, 0.181343043191790590, - -0.983419900493141540, - 0.181154471454990920, -0.983454654507193270, 0.180965893057658980, - -0.983489372362428730, - 0.180777308006728670, -0.983524054057571260, 0.180588716309133280, - -0.983558699591345900, - 0.180400117971807270, -0.983593308962478650, 0.180211513001684590, - -0.983627882169697210, - 0.180022901405699510, -0.983662419211730250, 0.179834283190787180, - -0.983696920087308020, - 0.179645658363882100, -0.983731384795162090, 0.179457026931919950, - -0.983765813334025240, - 0.179268388901835880, -0.983800205702631490, 0.179079744280565390, - -0.983834561899716630, - 0.178891093075044830, -0.983868881924017220, 0.178702435292209940, - -0.983903165774271500, - 0.178513770938997590, -0.983937413449218920, 0.178325100022344140, - -0.983971624947600270, - 0.178136422549186320, -0.984005800268157870, 0.177947738526461670, - -0.984039939409634970, - 0.177759047961107140, -0.984074042370776450, 0.177570350860060790, - -0.984108109150328540, - 0.177381647230260200, -0.984142139747038570, 0.177192937078643310, - -0.984176134159655320, - 0.177004220412148860, -0.984210092386929030, 0.176815497237715000, - -0.984244014427611110, - 0.176626767562280960, -0.984277900280454370, 0.176438031392785350, - -0.984311749944212780, - 0.176249288736167940, -0.984345563417641900, 0.176060539599367960, - -0.984379340699498510, - 0.175871783989325040, -0.984413081788540700, 0.175683021912979580, - -0.984446786683527920, - 0.175494253377271400, -0.984480455383220930, 0.175305478389141370, - -0.984514087886381840, - 0.175116696955530060, -0.984547684191773960, 0.174927909083378160, - -0.984581244298162180, - 0.174739114779627310, -0.984614768204312600, 0.174550314051218490, - -0.984648255908992630, - 0.174361506905093830, -0.984681707410970940, 0.174172693348194960, - -0.984715122709017620, - 0.173983873387463850, -0.984748501801904210, 0.173795047029843270, - -0.984781844688403350, - 0.173606214282275410, -0.984815151367289140, 0.173417375151703520, - -0.984848421837337010, - 0.173228529645070490, -0.984881656097323700, 0.173039677769319390, - -0.984914854146027200, - 0.172850819531394200, -0.984948015982227030, 0.172661954938238270, - -0.984981141604703960, - 0.172473083996796030, -0.985014231012239840, 0.172284206714011350, - -0.985047284203618200, - 0.172095323096829040, -0.985080301177623800, 0.171906433152193700, - -0.985113281933042590, - 0.171717536887049970, -0.985146226468662230, 0.171528634308343500, - -0.985179134783271020, - 0.171339725423019260, -0.985212006875659460, 0.171150810238023340, - -0.985244842744618540, - 0.170961888760301360, -0.985277642388941220, 0.170772960996799230, - -0.985310405807421570, - 0.170584026954463700, -0.985343132998854790, 0.170395086640240920, - -0.985375823962037710, - 0.170206140061078120, -0.985408478695768420, 0.170017187223922090, - -0.985441097198846210, - 0.169828228135719880, -0.985473679470071810, 0.169639262803419400, - -0.985506225508247290, - 0.169450291233967930, -0.985538735312176060, 0.169261313434313890, - -0.985571208880662740, - 0.169072329411405180, -0.985603646212513400, 0.168883339172190010, - -0.985636047306535420, - 0.168694342723617440, -0.985668412161537550, 0.168505340072635900, - -0.985700740776329850, - 0.168316331226194910, -0.985733033149723490, 0.168127316191243350, - -0.985765289280531310, - 0.167938294974731230, -0.985797509167567370, 0.167749267583608030, - -0.985829692809647050, - 0.167560234024823590, -0.985861840205586980, 0.167371194305328540, - -0.985893951354205210, - 0.167182148432072880, -0.985926026254321130, 0.166993096412007770, - -0.985958064904755460, - 0.166804038252083870, -0.985990067304330030, 0.166614973959252090, - -0.986022033451868560, - 0.166425903540464220, -0.986053963346195440, 0.166236827002671390, - -0.986085856986136820, - 0.166047744352825850, -0.986117714370520090, 0.165858655597879430, - -0.986149535498173860, - 0.165669560744784140, -0.986181320367928270, 0.165480459800492890, - -0.986213068978614490, - 0.165291352771957970, -0.986244781329065460, 0.165102239666132720, - -0.986276457418114980, - 0.164913120489970090, -0.986308097244598670, 0.164723995250423190, - -0.986339700807353000, - 0.164534863954446110, -0.986371268105216030, 0.164345726608992190, - -0.986402799137027220, - 0.164156583221015890, -0.986434293901627070, 0.163967433797471110, - -0.986465752397857940, - 0.163778278345312690, -0.986497174624562880, 0.163589116871495160, - -0.986528560580586690, - 0.163399949382973230, -0.986559910264775410, 0.163210775886702460, - -0.986591223675976400, - 0.163021596389637810, -0.986622500813038480, 0.162832410898735260, - -0.986653741674811350, - 0.162643219420950450, -0.986684946260146690, 0.162454021963239190, - -0.986716114567897100, - 0.162264818532558110, -0.986747246596916480, 0.162075609135863330, - -0.986778342346060430, - 0.161886393780111910, -0.986809401814185420, 0.161697172472260540, - -0.986840425000149680, - 0.161507945219266150, -0.986871411902812470, 0.161318712028086540, - -0.986902362521034470, - 0.161129472905678780, -0.986933276853677710, 0.160940227859001140, - -0.986964154899605650, - 0.160750976895011390, -0.986994996657682870, 0.160561720020667510, - -0.987025802126775600, - 0.160372457242928400, -0.987056571305750970, 0.160183188568752240, - -0.987087304193477900, - 0.159993914005098350, -0.987118000788826280, 0.159804633558925380, - -0.987148661090667570, - 0.159615347237193090, -0.987179285097874340, 0.159426055046860750, - -0.987209872809320820, - 0.159236756994887850, -0.987240424223882250, 0.159047453088234840, - -0.987270939340435420, - 0.158858143333861390, -0.987301418157858430, 0.158668827738728370, - -0.987331860675030430, - 0.158479506309796100, -0.987362266890832400, 0.158290179054025180, - -0.987392636804146240, - 0.158100845978377090, -0.987422970413855410, 0.157911507089812640, - -0.987453267718844560, - 0.157722162395293690, -0.987483528717999710, 0.157532811901781670, - -0.987513753410208420, - 0.157343455616238280, -0.987543941794359230, 0.157154093545626010, - -0.987574093869342360, - 0.156964725696906750, -0.987604209634049160, 0.156775352077043430, - -0.987634289087372160, - 0.156585972692998590, -0.987664332228205710, 0.156396587551734940, - -0.987694339055445130, - 0.156207196660216040, -0.987724309567986960, 0.156017800025404830, - -0.987754243764729530, - 0.155828397654265320, -0.987784141644572180, 0.155638989553760850, - -0.987814003206415550, - 0.155449575730855880, -0.987843828449161740, 0.155260156192514380, - -0.987873617371714200, - 0.155070730945700510, -0.987903369972977790, 0.154881299997379400, - -0.987933086251858380, - 0.154691863354515400, -0.987962766207263420, 0.154502421024073990, - -0.987992409838101880, - 0.154312973013020240, -0.988022017143283530, 0.154123519328319360, - -0.988051588121720110, - 0.153934059976937460, -0.988081122772324070, 0.153744594965840000, - -0.988110621094009820, - 0.153555124301993500, -0.988140083085692570, 0.153365647992364020, - -0.988169508746289060, - 0.153176166043917870, -0.988198898074717610, 0.152986678463622160, - -0.988228251069897420, - 0.152797185258443410, -0.988257567730749460, 0.152607686435349140, - -0.988286848056195710, - 0.152418182001306500, -0.988316092045159690, 0.152228671963282770, - -0.988345299696566150, - 0.152039156328246160, -0.988374471009341280, 0.151849635103164180, - -0.988403605982412390, - 0.151660108295005400, -0.988432704614708340, 0.151470575910737760, - -0.988461766905159300, - 0.151281037957330250, -0.988490792852696590, 0.151091494441751430, - -0.988519782456253270, - 0.150901945370970040, -0.988548735714763200, 0.150712390751955720, - -0.988577652627162020, - 0.150522830591677370, -0.988606533192386450, 0.150333264897105050, - -0.988635377409374790, - 0.150143693675208330, -0.988664185277066230, 0.149954116932956990, - -0.988692956794401940, - 0.149764534677321620, -0.988721691960323780, 0.149574946915272210, - -0.988750390773775360, - 0.149385353653779810, -0.988779053233701520, 0.149195754899814960, - -0.988807679339048340, - 0.149006150660348470, -0.988836269088763540, 0.148816540942352030, - -0.988864822481795640, - 0.148626925752796540, -0.988893339517095130, 0.148437305098654050, - -0.988921820193613190, - 0.148247678986896200, -0.988950264510302990, 0.148058047424494740, - -0.988978672466118480, - 0.147868410418422360, -0.989007044060015270, 0.147678767975650970, - -0.989035379290950310, - 0.147489120103153680, -0.989063678157881540, 0.147299466807902820, - -0.989091940659768800, - 0.147109808096871850, -0.989120166795572690, 0.146920143977033760, - -0.989148356564255590, - 0.146730474455361750, -0.989176509964781010, 0.146540799538829870, - -0.989204626996113780, - 0.146351119234411440, -0.989232707657220050, 0.146161433549080950, - -0.989260751947067640, - 0.145971742489812370, -0.989288759864625170, 0.145782046063579860, - -0.989316731408863000, - 0.145592344277358450, -0.989344666578752640, 0.145402637138122540, - -0.989372565373267010, - 0.145212924652847520, -0.989400427791380380, 0.145023206828508360, - -0.989428253832068230, - 0.144833483672080240, -0.989456043494307710, 0.144643755190539150, - -0.989483796777076760, - 0.144454021390860440, -0.989511513679355190, 0.144264282280020530, - -0.989539194200123930, - 0.144074537864995330, -0.989566838338365120, 0.143884788152761010, - -0.989594446093062460, - 0.143695033150294580, -0.989622017463200780, 0.143505272864572290, - -0.989649552447766530, - 0.143315507302571590, -0.989677051045747210, 0.143125736471269140, - -0.989704513256131850, - 0.142935960377642700, -0.989731939077910570, 0.142746179028669620, - -0.989759328510075200, - 0.142556392431327340, -0.989786681551618640, 0.142366600592594260, - -0.989813998201535260, - 0.142176803519448000, -0.989841278458820530, 0.141987001218867340, - -0.989868522322471580, - 0.141797193697830530, -0.989895729791486660, 0.141607380963316020, - -0.989922900864865450, - 0.141417563022303130, -0.989950035541608990, 0.141227739881770480, - -0.989977133820719610, - 0.141037911548697770, -0.990004195701200910, 0.140848078030064220, - -0.990031221182058000, - 0.140658239332849240, -0.990058210262297120, 0.140468395464033110, - -0.990085162940925970, - 0.140278546430595420, -0.990112079216953770, 0.140088692239516780, - -0.990138959089390650, - 0.139898832897777380, -0.990165802557248400, 0.139708968412357580, - -0.990192609619540030, - 0.139519098790238600, -0.990219380275280000, 0.139329224038400980, - -0.990246114523483990, - 0.139139344163826280, -0.990272812363169110, 0.138949459173495440, - -0.990299473793353590, - 0.138759569074390380, -0.990326098813057330, 0.138569673873492640, - -0.990352687421301340, - 0.138379773577783890, -0.990379239617108160, 0.138189868194246640, - -0.990405755399501260, - 0.137999957729862760, -0.990432234767505970, 0.137810042191615130, - -0.990458677720148620, - 0.137620121586486180, -0.990485084256456980, 0.137430195921458550, - -0.990511454375460290, - 0.137240265203515700, -0.990537788076188750, 0.137050329439640380, - -0.990564085357674370, - 0.136860388636816430, -0.990590346218950150, 0.136670442802027230, - -0.990616570659050620, - 0.136480491942256310, -0.990642758677011570, 0.136290536064488070, - -0.990668910271869980, - 0.136100575175706200, -0.990695025442664630, 0.135910609282895440, - -0.990721104188435180, - 0.135720638393040080, -0.990747146508222710, 0.135530662513124620, - -0.990773152401069780, - 0.135340681650134330, -0.990799121866020370, 0.135150695811053850, - -0.990825054902119470, - 0.134960705002868830, -0.990850951508413620, 0.134770709232564290, - -0.990876811683950810, - 0.134580708507126220, -0.990902635427780010, 0.134390702833540240, - -0.990928422738951990, - 0.134200692218792020, -0.990954173616518500, 0.134010676669868210, - -0.990979888059532740, - 0.133820656193754690, -0.991005566067049370, 0.133630630797438390, - -0.991031207638124130, - 0.133440600487905820, -0.991056812771814340, 0.133250565272143570, - -0.991082381467178640, - 0.133060525157139180, -0.991107913723276780, 0.132870480149879400, - -0.991133409539170170, - 0.132680430257352130, -0.991158868913921350, 0.132490375486544710, - -0.991184291846594180, - 0.132300315844444680, -0.991209678336254060, 0.132110251338040470, - -0.991235028381967420, - 0.131920181974319760, -0.991260341982802440, 0.131730107760271280, - -0.991285619137828200, - 0.131540028702883280, -0.991310859846115440, 0.131349944809144220, - -0.991336064106736140, - 0.131159856086043410, -0.991361231918763460, 0.130969762540569380, - -0.991386363281272280, - 0.130779664179711790, -0.991411458193338540, 0.130589561010459600, - -0.991436516654039420, - 0.130399453039802740, -0.991461538662453790, 0.130209340274730770, - -0.991486524217661480, - 0.130019222722233350, -0.991511473318743900, 0.129829100389301010, - -0.991536385964783880, - 0.129638973282923540, -0.991561262154865290, 0.129448841410091830, - -0.991586101888073500, - 0.129258704777796270, -0.991610905163495370, 0.129068563393027410, - -0.991635671980218740, - 0.128878417262776660, -0.991660402337333210, 0.128688266394034690, - -0.991685096233929530, - 0.128498110793793220, -0.991709753669099530, 0.128307950469043590, - -0.991734374641936810, - 0.128117785426777150, -0.991758959151536110, 0.127927615673986190, - -0.991783507196993490, - 0.127737441217662280, -0.991808018777406430, 0.127547262064798050, - -0.991832493891873780, - 0.127357078222385570, -0.991856932539495360, 0.127166889697417180, - -0.991881334719373010, - 0.126976696496885980, -0.991905700430609330, 0.126786498627784430, - -0.991930029672308480, - 0.126596296097105960, -0.991954322443575950, 0.126406088911843320, - -0.991978578743518580, - 0.126215877078990400, -0.992002798571244520, 0.126025660605540460, - -0.992026981925863360, - 0.125835439498487020, -0.992051128806485720, 0.125645213764824380, - -0.992075239212224070, - 0.125454983411546210, -0.992099313142191800, 0.125264748445647110, - -0.992123350595503720, - 0.125074508874121300, -0.992147351571276090, 0.124884264703963150, - -0.992171316068626520, - 0.124694015942167770, -0.992195244086673920, 0.124503762595729650, - -0.992219135624538450, - 0.124313504671644300, -0.992242990681341700, 0.124123242176906760, - -0.992266809256206580, - 0.123932975118512200, -0.992290591348257370, 0.123742703503456630, - -0.992314336956619640, - 0.123552427338735370, -0.992338046080420420, 0.123362146631344750, - -0.992361718718787870, - 0.123171861388280650, -0.992385354870851670, 0.122981571616539080, - -0.992408954535742850, - 0.122791277323116900, -0.992432517712593550, 0.122600978515010240, - -0.992456044400537700, - 0.122410675199216280, -0.992479534598709970, 0.122220367382731500, - -0.992502988306246950, - 0.122030055072553410, -0.992526405522286100, 0.121839738275679020, - -0.992549786245966570, - 0.121649416999105540, -0.992573130476428810, 0.121459091249830950, - -0.992596438212814290, - 0.121268761034852550, -0.992619709454266140, 0.121078426361168710, - -0.992642944199928820, - 0.120888087235777220, -0.992666142448948020, 0.120697743665676120, - -0.992689304200470750, - 0.120507395657864240, -0.992712429453645460, 0.120317043219339670, - -0.992735518207621850, - 0.120126686357101580, -0.992758570461551140, 0.119936325078148620, - -0.992781586214585570, - 0.119745959389479630, -0.992804565465879140, 0.119555589298094230, - -0.992827508214586760, - 0.119365214810991350, -0.992850414459865100, 0.119174835935170960, - -0.992873284200871730, - 0.118984452677632520, -0.992896117436765980, 0.118794065045375670, - -0.992918914166708300, - 0.118603673045400840, -0.992941674389860470, 0.118413276684707770, - -0.992964398105385610, - 0.118222875970297250, -0.992987085312448390, 0.118032470909169300, - -0.993009736010214580, - 0.117842061508325020, -0.993032350197851410, 0.117651647774765000, - -0.993054927874527320, - 0.117461229715489990, -0.993077469039412300, 0.117270807337501560, - -0.993099973691677570, - 0.117080380647800550, -0.993122441830495580, 0.116889949653388850, - -0.993144873455040430, - 0.116699514361267840, -0.993167268564487230, 0.116509074778439050, - -0.993189627158012620, - 0.116318630911904880, -0.993211949234794500, 0.116128182768666920, - -0.993234234794012290, - 0.115937730355727850, -0.993256483834846440, 0.115747273680089870, - -0.993278696356479030, - 0.115556812748755290, -0.993300872358093280, 0.115366347568727250, - -0.993323011838873950, - 0.115175878147008180, -0.993345114798006910, 0.114985404490601530, - -0.993367181234679600, - 0.114794926606510250, -0.993389211148080650, 0.114604444501737460, - -0.993411204537400060, - 0.114413958183287050, -0.993433161401829360, 0.114223467658162260, - -0.993455081740560960, - 0.114032972933367300, -0.993476965552789190, 0.113842474015905660, - -0.993498812837709360, - 0.113651970912781920, -0.993520623594518090, 0.113461463631000080, - -0.993542397822413600, - 0.113270952177564360, -0.993564135520595300, 0.113080436559479720, - -0.993585836688263950, - 0.112889916783750470, -0.993607501324621610, 0.112699392857381910, - -0.993629129428871720, - 0.112508864787378830, -0.993650721000219120, 0.112318332580746190, - -0.993672276037870010, - 0.112127796244489750, -0.993693794541031680, 0.111937255785614560, - -0.993715276508913230, - 0.111746711211126660, -0.993736721940724600, 0.111556162528031630, - -0.993758130835677430, - 0.111365609743335190, -0.993779503192984580, 0.111175052864043830, - -0.993800839011860120, - 0.110984491897163380, -0.993822138291519660, 0.110793926849700630, - -0.993843401031180180, - 0.110603357728661910, -0.993864627230059750, 0.110412784541053660, - -0.993885816887378090, - 0.110222207293883180, -0.993906970002356060, 0.110031625994157000, - -0.993928086574215830, - 0.109841040648882680, -0.993949166602181130, 0.109650451265067080, - -0.993970210085476920, - 0.109459857849718030, -0.993991217023329380, 0.109269260409842920, - -0.994012187414966220, - 0.109078658952449240, -0.994033121259616400, 0.108888053484545310, - -0.994054018556510210, - 0.108697444013138670, -0.994074879304879370, 0.108506830545237980, - -0.994095703503956930, - 0.108316213087851300, -0.994116491152977070, 0.108125591647986880, - -0.994137242251175720, - 0.107934966232653760, -0.994157956797789730, 0.107744336848860260, - -0.994178634792057590, - 0.107553703503615710, -0.994199276233218910, 0.107363066203928920, - -0.994219881120514850, - 0.107172424956808870, -0.994240449453187900, 0.106981779769265340, - -0.994260981230481790, - 0.106791130648307380, -0.994281476451641550, 0.106600477600945030, - -0.994301935115913580, - 0.106409820634187840, -0.994322357222545810, 0.106219159755045520, - -0.994342742770787270, - 0.106028494970528530, -0.994363091759888570, 0.105837826287646670, - -0.994383404189101430, - 0.105647153713410700, -0.994403680057679100, 0.105456477254830660, - -0.994423919364875950, - 0.105265796918917650, -0.994444122109948040, 0.105075112712682180, - -0.994464288292152390, - 0.104884424643134970, -0.994484417910747600, 0.104693732717287500, - -0.994504510964993590, - 0.104503036942150550, -0.994524567454151740, 0.104312337324735870, - -0.994544587377484300, - 0.104121633872054730, -0.994564570734255420, 0.103930926591118540, - -0.994584517523730340, - 0.103740215488939480, -0.994604427745175660, 0.103549500572529040, - -0.994624301397859400, - 0.103358781848899700, -0.994644138481050710, 0.103168059325063390, - -0.994663938994020280, - 0.102977333008032250, -0.994683702936040250, 0.102786602904819150, - -0.994703430306383860, - 0.102595869022436280, -0.994723121104325700, 0.102405131367896790, - -0.994742775329142010, - 0.102214389948213370, -0.994762392980109930, 0.102023644770398800, - -0.994781974056508260, - 0.101832895841466670, -0.994801518557617110, 0.101642143168429830, - -0.994821026482717860, - 0.101451386758302160, -0.994840497831093180, 0.101260626618096800, - -0.994859932602027320, - 0.101069862754827880, -0.994879330794805620, 0.100879095175509010, - -0.994898692408714870, - 0.100688323887153970, -0.994918017443043200, 0.100497548896777310, - -0.994937305897080070, - 0.100306770211392820, -0.994956557770116380, 0.100115987838015370, - -0.994975773061444140, - 0.099925201783659226, -0.994994951770357020, 0.099734412055338839, - -0.995014093896149700, - 0.099543618660069444, -0.995033199438118630, 0.099352821604865513, - -0.995052268395561160, - 0.099162020896742573, -0.995071300767776170, 0.098971216542715582, - -0.995090296554063890, - 0.098780408549799664, -0.995109255753726110, 0.098589596925010708, - -0.995128178366065490, - 0.098398781675363881, -0.995147064390386470, 0.098207962807875346, - -0.995165913825994620, - 0.098017140329560770, -0.995184726672196820, 0.097826314247435903, - -0.995203502928301510, - 0.097635484568517339, -0.995222242593618240, 0.097444651299820870, - -0.995240945667458130, - 0.097253814448363354, -0.995259612149133390, 0.097062974021160875, - -0.995278242037957670, - 0.096872130025230527, -0.995296835333246090, 0.096681282467588864, - -0.995315392034315070, - 0.096490431355252607, -0.995333912140482280, 0.096299576695239225, - -0.995352395651066810, - 0.096108718494565468, -0.995370842565388990, 0.095917856760249096, - -0.995389252882770690, - 0.095726991499307315, -0.995407626602534900, 0.095536122718757485, - -0.995425963724006160, - 0.095345250425617742, -0.995444264246510340, 0.095154374626905472, - -0.995462528169374420, - 0.094963495329639061, -0.995480755491926940, 0.094772612540836410, - -0.995498946213497770, - 0.094581726267515473, -0.995517100333418110, 0.094390836516695067, - -0.995535217851020390, - 0.094199943295393190, -0.995553298765638470, 0.094009046610628907, - -0.995571343076607770, - 0.093818146469420494, -0.995589350783264600, 0.093627242878787237, - -0.995607321884947050, - 0.093436335845747912, -0.995625256380994310, 0.093245425377321389, - -0.995643154270746900, - 0.093054511480527333, -0.995661015553546910, 0.092863594162384697, - -0.995678840228737540, - 0.092672673429913366, -0.995696628295663520, 0.092481749290132753, - -0.995714379753670610, - 0.092290821750062355, -0.995732094602106430, 0.092099890816722485, - -0.995749772840319400, - 0.091908956497132696, -0.995767414467659820, 0.091718018798313525, - -0.995785019483478750, - 0.091527077727284981, -0.995802587887129160, 0.091336133291067212, - -0.995820119677964910, - 0.091145185496681130, -0.995837614855341610, 0.090954234351146898, - -0.995855073418615790, - 0.090763279861485704, -0.995872495367145730, 0.090572322034718156, - -0.995889880700290720, - 0.090381360877865011, -0.995907229417411720, 0.090190396397947820, - -0.995924541517870690, - 0.089999428601987341, -0.995941817001031350, 0.089808457497005362, - -0.995959055866258320, - 0.089617483090022917, -0.995976258112917790, 0.089426505388062016, - -0.995993423740377360, - 0.089235524398144139, -0.996010552748005870, 0.089044540127290905, - -0.996027645135173610, - 0.088853552582524684, -0.996044700901251970, 0.088662561770867121, - -0.996061720045614000, - 0.088471567699340822, -0.996078702567633980, 0.088280570374967879, - -0.996095648466687300, - 0.088089569804770507, -0.996112557742151130, 0.087898565995771685, - -0.996129430393403740, - 0.087707558954993645, -0.996146266419824620, 0.087516548689459586, - -0.996163065820794950, - 0.087325535206192226, -0.996179828595696870, 0.087134518512214321, - -0.996196554743914220, - 0.086943498614549489, -0.996213244264832040, 0.086752475520220515, - -0.996229897157836500, - 0.086561449236251239, -0.996246513422315520, 0.086370419769664919, - -0.996263093057658030, - 0.086179387127484922, -0.996279636063254650, 0.085988351316735448, - -0.996296142438496850, - 0.085797312344439880, -0.996312612182778000, 0.085606270217622613, - -0.996329045295492380, - 0.085415224943307277, -0.996345441776035900, 0.085224176528518519, - -0.996361801623805720, - 0.085033124980280414, -0.996378124838200210, 0.084842070305617148, - -0.996394411418619290, - 0.084651012511553700, -0.996410661364464100, 0.084459951605114297, - -0.996426874675137240, - 0.084268887593324127, -0.996443051350042630, 0.084077820483207846, - -0.996459191388585410, - 0.083886750281790226, -0.996475294790172160, 0.083695676996096827, - -0.996491361554210920, - 0.083504600633152404, -0.996507391680110820, 0.083313521199982740, - -0.996523385167282450, - 0.083122438703613077, -0.996539342015137940, 0.082931353151068726, - -0.996555262223090540, - 0.082740264549375803, -0.996571145790554840, 0.082549172905559659, - -0.996586992716946950, - 0.082358078226646619, -0.996602803001684130, 0.082166980519662466, - -0.996618576644185070, - 0.081975879791633108, -0.996634313643869900, 0.081784776049585201, - -0.996650014000160070, - 0.081593669300544638, -0.996665677712478160, 0.081402559551538328, - -0.996681304780248300, - 0.081211446809592386, -0.996696895202896060, 0.081020331081733912, - -0.996712448979848010, - 0.080829212374989468, -0.996727966110532490, 0.080638090696385709, - -0.996743446594378860, - 0.080446966052950097, -0.996758890430818000, 0.080255838451709291, - -0.996774297619282050, - 0.080064707899690932, -0.996789668159204560, 0.079873574403922148, - -0.996805002050020320, - 0.079682437971430126, -0.996820299291165670, 0.079491298609242866, - -0.996835559882078170, - 0.079300156324387569, -0.996850783822196610, 0.079109011123892431, - -0.996865971110961310, - 0.078917863014785095, -0.996881121747813850, 0.078726712004093313, - -0.996896235732197210, - 0.078535558098845590, -0.996911313063555740, 0.078344401306069678, - -0.996926353741335090, - 0.078153241632794315, -0.996941357764982160, 0.077962079086047645, - -0.996956325133945280, - 0.077770913672857989, -0.996971255847674320, 0.077579745400254363, - -0.996986149905620180, - 0.077388574275265049, -0.997001007307235290, 0.077197400304919297, - -0.997015828051973310, - 0.077006223496245585, -0.997030612139289450, 0.076815043856273399, - -0.997045359568640040, - 0.076623861392031617, -0.997060070339482960, 0.076432676110549283, - -0.997074744451277310, - 0.076241488018856149, -0.997089381903483400, 0.076050297123981231, - -0.997103982695563330, - 0.075859103432954503, -0.997118546826979980, 0.075667906952805383, - -0.997133074297198110, - 0.075476707690563416, -0.997147565105683480, 0.075285505653258880, - -0.997162019251903290, - 0.075094300847921291, -0.997176436735326190, 0.074903093281581137, - -0.997190817555421940, - 0.074711882961268378, -0.997205161711661850, 0.074520669894013014, - -0.997219469203518670, - 0.074329454086845867, -0.997233740030466160, 0.074138235546796952, - -0.997247974191979860, - 0.073947014280897269, -0.997262171687536170, 0.073755790296177265, - -0.997276332516613180, - 0.073564563599667454, -0.997290456678690210, 0.073373334198399157, - -0.997304544173247990, - 0.073182102099402888, -0.997318594999768600, 0.072990867309710133, - -0.997332609157735470, - 0.072799629836351618, -0.997346586646633230, 0.072608389686359048, - -0.997360527465947940, - 0.072417146866763538, -0.997374431615167030, 0.072225901384596336, - -0.997388299093779460, - 0.072034653246889416, -0.997402129901275300, 0.071843402460674000, - -0.997415924037145960, - 0.071652149032982254, -0.997429681500884180, 0.071460892970845832, - -0.997443402291984360, - 0.071269634281296415, -0.997457086409941910, 0.071078372971366502, - -0.997470733854253670, - 0.070887109048087787, -0.997484344624417930, 0.070695842518492924, - -0.997497918719934210, - 0.070504573389614009, -0.997511456140303450, 0.070313301668483263, - -0.997524956885027960, - 0.070122027362133646, -0.997538420953611230, 0.069930750477597295, - -0.997551848345558430, - 0.069739471021907376, -0.997565239060375750, 0.069548189002096472, - -0.997578593097570800, - 0.069356904425197236, -0.997591910456652630, 0.069165617298243109, - -0.997605191137131640, - 0.068974327628266732, -0.997618435138519550, 0.068783035422301728, - -0.997631642460329320, - 0.068591740687380900, -0.997644813102075420, 0.068400443430538069, - -0.997657947063273710, - 0.068209143658806454, -0.997671044343441000, 0.068017841379219388, - -0.997684104942096030, - 0.067826536598810966, -0.997697128858758500, 0.067635229324614451, - -0.997710116092949570, - 0.067443919563664106, -0.997723066644191640, 0.067252607322993652, - -0.997735980512008620, - 0.067061292609636836, -0.997748857695925690, 0.066869975430628226, - -0.997761698195469560, - 0.066678655793001543, -0.997774502010167820, 0.066487333703791507, - -0.997787269139549960, - 0.066296009170032283, -0.997799999583146470, 0.066104682198758091, - -0.997812693340489280, - 0.065913352797003930, -0.997825350411111640, 0.065722020971803977, - -0.997837970794548280, - 0.065530686730193397, -0.997850554490335110, 0.065339350079206798, - -0.997863101498009500, - 0.065148011025878860, -0.997875611817110150, 0.064956669577245010, - -0.997888085447177110, - 0.064765325740339871, -0.997900522387751620, 0.064573979522199065, - -0.997912922638376610, - 0.064382630929857410, -0.997925286198596000, 0.064191279970350679, - -0.997937613067955250, - 0.063999926650714078, -0.997949903246001190, 0.063808570977982898, - -0.997962156732281950, - 0.063617212959193190, -0.997974373526346990, 0.063425852601380200, - -0.997986553627747020, - 0.063234489911580136, -0.997998697036034390, 0.063043124896828631, - -0.998010803750762450, - 0.062851757564161420, -0.998022873771486240, 0.062660387920614985, - -0.998034907097761770, - 0.062469015973224969, -0.998046903729146840, 0.062277641729028041, - -0.998058863665200250, - 0.062086265195060247, -0.998070786905482340, 0.061894886378357744, - -0.998082673449554590, - 0.061703505285957416, -0.998094523296980010, 0.061512121924895365, - -0.998106336447323050, - 0.061320736302208648, -0.998118112900149180, 0.061129348424933755, - -0.998129852655025520, - 0.060937958300107238, -0.998141555711520520, 0.060746565934766412, - -0.998153222069203650, - 0.060555171335947781, -0.998164851727646240, 0.060363774510688827, - -0.998176444686420530, - 0.060172375466026218, -0.998188000945100300, 0.059980974208997596, - -0.998199520503260660, - 0.059789570746640007, -0.998211003360478190, 0.059598165085990598, - -0.998222449516330550, - 0.059406757234087247, -0.998233858970396850, 0.059215347197967026, - -0.998245231722257880, - 0.059023934984667986, -0.998256567771495180, 0.058832520601227581, - -0.998267867117692110, - 0.058641104054683348, -0.998279129760433200, 0.058449685352073573, - -0.998290355699304350, - 0.058258264500435732, -0.998301544933892890, 0.058066841506808263, - -0.998312697463787260, - 0.057875416378229017, -0.998323813288577560, 0.057683989121735932, - -0.998334892407855000, - 0.057492559744367684, -0.998345934821212370, 0.057301128253162144, - -0.998356940528243420, - 0.057109694655158132, -0.998367909528543820, 0.056918258957393907, - -0.998378841821709990, - 0.056726821166907783, -0.998389737407340160, 0.056535381290738825, - -0.998400596285033640, - 0.056343939335925283, -0.998411418454391300, 0.056152495309506383, - -0.998422203915015020, - 0.055961049218520520, -0.998432952666508440, 0.055769601070007072, - -0.998443664708476340, - 0.055578150871004817, -0.998454340040524800, 0.055386698628552604, - -0.998464978662261250, - 0.055195244349690031, -0.998475580573294770, 0.055003788041455885, - -0.998486145773235360, - 0.054812329710889909, -0.998496674261694640, 0.054620869365031251, - -0.998507166038285490, - 0.054429407010919147, -0.998517621102622210, 0.054237942655593556, - -0.998528039454320230, - 0.054046476306093640, -0.998538421092996730, 0.053855007969459509, - -0.998548766018269920, - 0.053663537652730679, -0.998559074229759310, 0.053472065362946755, - -0.998569345727086110, - 0.053280591107148056, -0.998579580509872500, 0.053089114892374119, - -0.998589778577742230, - 0.052897636725665401, -0.998599939930320370, 0.052706156614061798, - -0.998610064567233340, - 0.052514674564603257, -0.998620152488108870, 0.052323190584330471, - -0.998630203692576050, - 0.052131704680283317, -0.998640218180265270, 0.051940216859502626, - -0.998650195950808280, - 0.051748727129028414, -0.998660137003838490, 0.051557235495901653, - -0.998670041338990070, - 0.051365741967162731, -0.998679908955899090, 0.051174246549852087, - -0.998689739854202620, - 0.050982749251010900, -0.998699534033539280, 0.050791250077679546, - -0.998709291493549030, - 0.050599749036899337, -0.998719012233872940, 0.050408246135710995, - -0.998728696254153720, - 0.050216741381155325, -0.998738343554035230, 0.050025234780273840, - -0.998747954133162860, - 0.049833726340107257, -0.998757527991183340, 0.049642216067697226, - -0.998767065127744380, - 0.049450703970084824, -0.998776565542495610, 0.049259190054311168, - -0.998786029235087640, - 0.049067674327418126, -0.998795456205172410, 0.048876156796446746, - -0.998804846452403420, - 0.048684637468439020, -0.998814199976435390, 0.048493116350436342, - -0.998823516776924380, - 0.048301593449480172, -0.998832796853527990, 0.048110068772612716, - -0.998842040205904840, - 0.047918542326875327, -0.998851246833715180, 0.047727014119310344, - -0.998860416736620520, - 0.047535484156959261, -0.998869549914283560, 0.047343952446864526, - -0.998878646366368690, - 0.047152418996068000, -0.998887706092541290, 0.046960883811611599, - -0.998896729092468410, - 0.046769346900537960, -0.998905715365818290, 0.046577808269888908, - -0.998914664912260440, - 0.046386267926707213, -0.998923577731465780, 0.046194725878035046, - -0.998932453823106690, - 0.046003182130914644, -0.998941293186856870, 0.045811636692388955, - -0.998950095822391250, - 0.045620089569500123, -0.998958861729386080, 0.045428540769291224, - -0.998967590907519300, - 0.045236990298804750, -0.998976283356469820, 0.045045438165083225, - -0.998984939075918010, - 0.044853884375169933, -0.998993558065545680, 0.044662328936107311, - -0.999002140325035980, - 0.044470771854938744, -0.999010685854073380, 0.044279213138707016, - -0.999019194652343460, - 0.044087652794454979, -0.999027666719533690, 0.043896090829226200, - -0.999036102055332330, - 0.043704527250063421, -0.999044500659429290, 0.043512962064010327, - -0.999052862531515930, - 0.043321395278109784, -0.999061187671284600, 0.043129826899405595, - -0.999069476078429330, - 0.042938256934940959, -0.999077727752645360, 0.042746685391759139, - -0.999085942693629270, - 0.042555112276904117, -0.999094120901079070, 0.042363537597419038, - -0.999102262374694130, - 0.042171961360348002, -0.999110367114174890, 0.041980383572734502, - -0.999118435119223490, - 0.041788804241622082, -0.999126466389543390, 0.041597223374055005, - -0.999134460924839150, - 0.041405640977076712, -0.999142418724816910, 0.041214057057731589, - -0.999150339789184110, - 0.041022471623063397, -0.999158224117649430, 0.040830884680115968, - -0.999166071709923000, - 0.040639296235933854, -0.999173882565716380, 0.040447706297560768, - -0.999181656684742350, - 0.040256114872041358, -0.999189394066714920, 0.040064521966419686, - -0.999197094711349880, - 0.039872927587739845, -0.999204758618363890, 0.039681331743046659, - -0.999212385787475290, - 0.039489734439384118, -0.999219976218403530, 0.039298135683797149, - -0.999227529910869610, - 0.039106535483329839, -0.999235046864595850, 0.038914933845027241, - -0.999242527079305830, - 0.038723330775933762, -0.999249970554724420, 0.038531726283093877, - -0.999257377290578060, - 0.038340120373552791, -0.999264747286594420, 0.038148513054354856, - -0.999272080542502610, - 0.037956904332545366, -0.999279377058032710, 0.037765294215169005, - -0.999286636832916740, - 0.037573682709270514, -0.999293859866887790, 0.037382069821895340, - -0.999301046159680070, - 0.037190455560088091, -0.999308195711029470, 0.036998839930894332, - -0.999315308520673070, - 0.036807222941358991, -0.999322384588349540, 0.036615604598527057, - -0.999329423913798420, - 0.036423984909444228, -0.999336426496761240, 0.036232363881155374, - -0.999343392336980220, - 0.036040741520706299, -0.999350321434199440, 0.035849117835142184, - -0.999357213788164000, - 0.035657492831508264, -0.999364069398620550, 0.035465866516850478, - -0.999370888265317060, - 0.035274238898213947, -0.999377670388002850, 0.035082609982644702, - -0.999384415766428560, - 0.034890979777187955, -0.999391124400346050, 0.034699348288889847, - -0.999397796289508640, - 0.034507715524795889, -0.999404431433671300, 0.034316081491951658, - -0.999411029832589780, - 0.034124446197403423, -0.999417591486021720, 0.033932809648196623, - -0.999424116393725640, - 0.033741171851377642, -0.999430604555461730, 0.033549532813992221, - -0.999437055970991530, - 0.033357892543086159, -0.999443470640077770, 0.033166251045705968, - -0.999449848562484530, - 0.032974608328897315, -0.999456189737977340, 0.032782964399706793, - -0.999462494166323160, - 0.032591319265180385, -0.999468761847290050, 0.032399672932364114, - -0.999474992780647780, - 0.032208025408304704, -0.999481186966166950, 0.032016376700048046, - -0.999487344403620080, - 0.031824726814640963, -0.999493465092780590, 0.031633075759129645, - -0.999499549033423640, - 0.031441423540560343, -0.999505596225325310, 0.031249770165979990, - -0.999511606668263440, - 0.031058115642434700, -0.999517580362016990, 0.030866459976971503, - -0.999523517306366350, - 0.030674803176636581, -0.999529417501093140, 0.030483145248477058, - -0.999535280945980540, - 0.030291486199539423, -0.999541107640812940, 0.030099826036870208, - -0.999546897585375960, - 0.029908164767516655, -0.999552650779456990, 0.029716502398525156, - -0.999558367222844300, - 0.029524838936943035, -0.999564046915327740, 0.029333174389816984, - -0.999569689856698580, - 0.029141508764193740, -0.999575296046749220, 0.028949842067120746, - -0.999580865485273700, - 0.028758174305644590, -0.999586398172067070, 0.028566505486812797, - -0.999591894106925950, - 0.028374835617672258, -0.999597353289648380, 0.028183164705269902, - -0.999602775720033530, - 0.027991492756653365, -0.999608161397882110, 0.027799819778869434, - -0.999613510322995950, - 0.027608145778965820, -0.999618822495178640, 0.027416470763989606, - -0.999624097914234570, - 0.027224794740987910, -0.999629336579970110, 0.027033117717008563, - -0.999634538492192300, - 0.026841439699098527, -0.999639703650710200, 0.026649760694305708, - -0.999644832055333610, - 0.026458080709677145, -0.999649923705874240, 0.026266399752260809, - -0.999654978602144690, - 0.026074717829104040, -0.999659996743959220, 0.025883034947254208, - -0.999664978131133310, - 0.025691351113759395, -0.999669922763483760, 0.025499666335666818, - -0.999674830640828740, - 0.025307980620024630, -0.999679701762987930, 0.025116293973880335, - -0.999684536129782140, - 0.024924606404281485, -0.999689333741033640, 0.024732917918276334, - -0.999694094596566000, - 0.024541228522912264, -0.999698818696204250, 0.024349538225237600, - -0.999703506039774650, - 0.024157847032300020, -0.999708156627104880, 0.023966154951147241, - -0.999712770458023870, - 0.023774461988827676, -0.999717347532362190, 0.023582768152388880, - -0.999721887849951310, - 0.023391073448879338, -0.999726391410624470, 0.023199377885346890, - -0.999730858214216030, - 0.023007681468839410, -0.999735288260561680, 0.022815984206405477, - -0.999739681549498660, - 0.022624286105092803, -0.999744038080865430, 0.022432587171950024, - -0.999748357854501780, - 0.022240887414024919, -0.999752640870248840, 0.022049186838366180, - -0.999756887127949080, - 0.021857485452021874, -0.999761096627446610, 0.021665783262040089, - -0.999765269368586450, - 0.021474080275469605, -0.999769405351215280, 0.021282376499358355, - -0.999773504575180990, - 0.021090671940755180, -0.999777567040332940, 0.020898966606708289, - -0.999781592746521670, - 0.020707260504265912, -0.999785581693599210, 0.020515553640476986, - -0.999789533881418780, - 0.020323846022389572, -0.999793449309835270, 0.020132137657052664, - -0.999797327978704690, - 0.019940428551514598, -0.999801169887884260, 0.019748718712823757, - -0.999804975037232870, - 0.019557008148029204, -0.999808743426610520, 0.019365296864179146, - -0.999812475055878780, - 0.019173584868322699, -0.999816169924900410, 0.018981872167508348, - -0.999819828033539420, - 0.018790158768784596, -0.999823449381661570, 0.018598444679200642, - -0.999827033969133420, - 0.018406729905804820, -0.999830581795823400, 0.018215014455646376, - -0.999834092861600960, - 0.018023298335773701, -0.999837567166337090, 0.017831581553236088, - -0.999841004709904000, - 0.017639864115082195, -0.999844405492175240, 0.017448146028360704, - -0.999847769513025900, - 0.017256427300120978, -0.999851096772332190, 0.017064707937411529, - -0.999854387269971890, - 0.016872987947281773, -0.999857641005823860, 0.016681267336780482, - -0.999860857979768540, - 0.016489546112956454, -0.999864038191687680, 0.016297824282859176, - -0.999867181641464380, - 0.016106101853537263, -0.999870288328982950, 0.015914378832040249, - -0.999873358254129260, - 0.015722655225417017, -0.999876391416790410, 0.015530931040716478, - -0.999879387816854930, - 0.015339206284988220, -0.999882347454212560, 0.015147480965280975, - -0.999885270328754520, - 0.014955755088644378, -0.999888156440373320, 0.014764028662127416, - -0.999891005788962950, - 0.014572301692779104, -0.999893818374418490, 0.014380574187649138, - -0.999896594196636680, - 0.014188846153786343, -0.999899333255515390, 0.013997117598240459, - -0.999902035550953920, - 0.013805388528060349, -0.999904701082852900, 0.013613658950295789, - -0.999907329851114300, - 0.013421928871995907, -0.999909921855641540, 0.013230198300209845, - -0.999912477096339240, - 0.013038467241987433, -0.999914995573113470, 0.012846735704377631, - -0.999917477285871770, - 0.012655003694430301, -0.999919922234522750, 0.012463271219194662, - -0.999922330418976490, - 0.012271538285719944, -0.999924701839144500, 0.012079804901056066, - -0.999927036494939640, - 0.011888071072252072, -0.999929334386276070, 0.011696336806357907, - -0.999931595513069200, - 0.011504602110422875, -0.999933819875236000, 0.011312866991496287, - -0.999936007472694620, - 0.011121131456628141, -0.999938158305364590, 0.010929395512867561, - -0.999940272373166960, - 0.010737659167264572, -0.999942349676023910, 0.010545922426868548, - -0.999944390213859060, - 0.010354185298728884, -0.999946393986597460, 0.010162447789895645, - -0.999948360994165400, - 0.009970709907418029, -0.999950291236490480, 0.009778971658346134, - -0.999952184713501780, - 0.009587233049729183, -0.999954041425129780, 0.009395494088617302, - -0.999955861371306100, - 0.009203754782059960, -0.999957644551963900, 0.009012015137106642, - -0.999959390967037450, - 0.008820275160807512, -0.999961100616462820, 0.008628534860211857, - -0.999962773500176930, - 0.008436794242369860, -0.999964409618118280, 0.008245053314331058, - -0.999966008970226920, - 0.008053312083144991, -0.999967571556443780, 0.007861570555861883, - -0.999969097376711580, - 0.007669828739531077, -0.999970586430974140, 0.007478086641202815, - -0.999972038719176730, - 0.007286344267926684, -0.999973454241265940, 0.007094601626752279, - -0.999974832997189810, - 0.006902858724729877, -0.999976174986897610, 0.006711115568908869, - -0.999977480210339940, - 0.006519372166339549, -0.999978748667468830, 0.006327628524071549, - -0.999979980358237650, - 0.006135884649154515, -0.999981175282601110, 0.005944140548638765, - -0.999982333440515350, - 0.005752396229573737, -0.999983454831937730, 0.005560651699009764, - -0.999984539456826970, - 0.005368906963996303, -0.999985587315143200, 0.005177162031583702, - -0.999986598406848000, - 0.004985416908821652, -0.999987572731904080, 0.004793671602759852, - -0.999988510290275690, - 0.004601926120448672, -0.999989411081928400, 0.004410180468937601, - -0.999990275106828920, - 0.004218434655277024, -0.999991102364945590, 0.004026688686516664, - -0.999991892856248010, - 0.003834942569706248, -0.999992646580707190, 0.003643196311896179, - -0.999993363538295150, - 0.003451449920135975, -0.999994043728985820, 0.003259703401476044, - -0.999994687152754080, - 0.003067956762966138, -0.999995293809576190, 0.002876210011656010, - -0.999995863699429940, - 0.002684463154596083, -0.999996396822294350, 0.002492716198835898, - -0.999996893178149880, - 0.002300969151425887, -0.999997352766978210, 0.002109222019415816, - -0.999997775588762350, - 0.001917474809855460, -0.999998161643486980, 0.001725727529795258, - -0.999998510931137790, - 0.001533980186284766, -0.999998823451701880, 0.001342232786374430, - -0.999999099205167830, - 0.001150485337113809, -0.999999338191525530, 0.000958737845553352, - -0.999999540410766110, - 0.000766990318742846, -0.999999705862882230, 0.000575242763732077, - -0.999999834547867670, - 0.000383495187571497, -0.999999926465717890, 0.000191747597310674, - -0.999999981616429330, - -}; - -/** -* \par -* cosFactor tables are generated using the formula :
cos_factors[n] = 2 * cos((2n+1)*pi/(4*N))
-* \par -* C command to generate the table -* \par -*
 for(i = 0; i< N; i++)    
-* {    
-*    cos_factors[i]= 2 * cos((2*i+1)*c/2);    
-* } 
-* \par -* where N is the number of factors to generate and c is pi/(2*N) -*/ -static const float32_t cos_factors_128[128] = { - 0.999981175282601110f, 0.999830581795823400f, 0.999529417501093140f, - 0.999077727752645360f, - 0.998475580573294770f, 0.997723066644191640f, 0.996820299291165670f, - 0.995767414467659820f, - 0.994564570734255420f, 0.993211949234794500f, 0.991709753669099530f, - 0.990058210262297120f, - 0.988257567730749460f, 0.986308097244598670f, 0.984210092386929030f, - 0.981963869109555240f, - 0.979569765685440520f, 0.977028142657754390f, 0.974339382785575860f, - 0.971503890986251780f, - 0.968522094274417380f, 0.965394441697689400f, 0.962121404269041580f, - 0.958703474895871600f, - 0.955141168305770780f, 0.951435020969008340f, 0.947585591017741090f, - 0.943593458161960390f, - 0.939459223602189920f, 0.935183509938947610f, 0.930766961078983710f, - 0.926210242138311380f, - 0.921514039342042010f, 0.916679059921042700f, 0.911706032005429880f, - 0.906595704514915330f, - 0.901348847046022030f, 0.895966249756185220f, 0.890448723244757880f, - 0.884797098430937790f, - 0.879012226428633530f, 0.873094978418290090f, 0.867046245515692650f, - 0.860866938637767310f, - 0.854557988365400530f, 0.848120344803297230f, 0.841554977436898440f, - 0.834862874986380010f, - 0.828045045257755800f, 0.821102514991104650f, 0.814036329705948410f, - 0.806847553543799330f, - 0.799537269107905010f, 0.792106577300212390f, 0.784556597155575240f, - 0.776888465673232440f, - 0.769103337645579700f, 0.761202385484261780f, 0.753186799043612520f, - 0.745057785441466060f, - 0.736816568877369900f, 0.728464390448225200f, 0.720002507961381650f, - 0.711432195745216430f, - 0.702754744457225300f, 0.693971460889654000f, 0.685083667772700360f, - 0.676092703575316030f, - 0.666999922303637470f, 0.657806693297078640f, 0.648514401022112550f, - 0.639124444863775730f, - 0.629638238914927100f, 0.620057211763289210f, 0.610382806276309480f, - 0.600616479383868970f, - 0.590759701858874280f, 0.580813958095764530f, 0.570780745886967370f, - 0.560661576197336030f, - 0.550457972936604810f, 0.540171472729892970f, 0.529803624686294830f, - 0.519355990165589530f, - 0.508830142543106990f, 0.498227666972781870f, 0.487550160148436050f, - 0.476799230063322250f, - 0.465976495767966130f, 0.455083587126343840f, 0.444122144570429260f, - 0.433093818853152010f, - 0.422000270799799790f, 0.410843171057903910f, 0.399624199845646790f, - 0.388345046698826300f, - 0.377007410216418310f, 0.365612997804773960f, 0.354163525420490510f, - 0.342660717311994380f, - 0.331106305759876430f, 0.319502030816015750f, 0.307849640041534980f, - 0.296150888243623960f, - 0.284407537211271820f, 0.272621355449948980f, 0.260794117915275570f, - 0.248927605745720260f, - 0.237023605994367340f, 0.225083911359792780f, 0.213110319916091360f, - 0.201104634842091960f, - 0.189068664149806280f, 0.177004220412148860f, 0.164913120489970090f, - 0.152797185258443410f, - 0.140658239332849240f, 0.128498110793793220f, 0.116318630911904880f, - 0.104121633872054730f, - 0.091908956497132696f, 0.079682437971430126f, 0.067443919563664106f, - 0.055195244349690031f, - 0.042938256934940959f, 0.030674803176636581f, 0.018406729905804820f, - 0.006135884649154515f -}; - -static const float32_t cos_factors_512[512] = { - 0.999998823451701880f, 0.999989411081928400f, 0.999970586430974140f, - 0.999942349676023910f, - 0.999904701082852900f, 0.999857641005823860f, 0.999801169887884260f, - 0.999735288260561680f, - 0.999659996743959220f, 0.999575296046749220f, 0.999481186966166950f, - 0.999377670388002850f, - 0.999264747286594420f, 0.999142418724816910f, 0.999010685854073380f, - 0.998869549914283560f, - 0.998719012233872940f, 0.998559074229759310f, 0.998389737407340160f, - 0.998211003360478190f, - 0.998022873771486240f, 0.997825350411111640f, 0.997618435138519550f, - 0.997402129901275300f, - 0.997176436735326190f, 0.996941357764982160f, 0.996696895202896060f, - 0.996443051350042630f, - 0.996179828595696980f, 0.995907229417411720f, 0.995625256380994310f, - 0.995333912140482280f, - 0.995033199438118630f, 0.994723121104325700f, 0.994403680057679100f, - 0.994074879304879370f, - 0.993736721940724600f, 0.993389211148080650f, 0.993032350197851410f, - 0.992666142448948020f, - 0.992290591348257370f, 0.991905700430609330f, 0.991511473318743900f, - 0.991107913723276890f, - 0.990695025442664630f, 0.990272812363169110f, 0.989841278458820530f, - 0.989400427791380380f, - 0.988950264510302990f, 0.988490792852696590f, 0.988022017143283530f, - 0.987543941794359230f, - 0.987056571305750970f, 0.986559910264775410f, 0.986053963346195440f, - 0.985538735312176060f, - 0.985014231012239840f, 0.984480455383220930f, 0.983937413449218920f, - 0.983385110321551180f, - 0.982823551198705240f, 0.982252741366289370f, 0.981672686196983110f, - 0.981083391150486710f, - 0.980484861773469380f, 0.979877103699517640f, 0.979260122649082020f, - 0.978633924429423210f, - 0.977998514934557140f, 0.977353900145199960f, 0.976700086128711840f, - 0.976037079039039020f, - 0.975364885116656980f, 0.974683510688510670f, 0.973992962167955830f, - 0.973293246054698250f, - 0.972584368934732210f, 0.971866337480279400f, 0.971139158449725090f, - 0.970402838687555500f, - 0.969657385124292450f, 0.968902804776428870f, 0.968139104746362440f, - 0.967366292222328510f, - 0.966584374478333120f, 0.965793358874083680f, 0.964993252854920320f, - 0.964184063951745830f, - 0.963365799780954050f, 0.962538468044359160f, 0.961702076529122540f, - 0.960856633107679660f, - 0.960002145737665960f, 0.959138622461841890f, 0.958266071408017670f, - 0.957384500788975860f, - 0.956493918902395100f, 0.955594334130771110f, 0.954685754941338340f, - 0.953768189885990330f, - 0.952841647601198720f, 0.951906136807932350f, 0.950961666311575080f, - 0.950008245001843000f, - 0.949045881852700560f, 0.948074585922276230f, 0.947094366352777220f, - 0.946105232370403450f, - 0.945107193285260610f, 0.944100258491272660f, 0.943084437466093490f, - 0.942059739771017310f, - 0.941026175050889260f, 0.939983753034014050f, 0.938932483532064600f, - 0.937872376439989890f, - 0.936803441735921560f, 0.935725689481080370f, 0.934639129819680780f, - 0.933543772978836170f, - 0.932439629268462360f, 0.931326709081180430f, 0.930205022892219070f, - 0.929074581259315860f, - 0.927935394822617890f, 0.926787474304581750f, 0.925630830509872720f, - 0.924465474325262600f, - 0.923291416719527640f, 0.922108668743345180f, 0.920917241529189520f, - 0.919717146291227360f, - 0.918508394325212250f, 0.917290997008377910f, 0.916064965799331720f, - 0.914830312237946200f, - 0.913587047945250810f, 0.912335184623322750f, 0.911074734055176360f, - 0.909805708104652220f, - 0.908528118716306120f, 0.907241977915295820f, 0.905947297807268460f, - 0.904644090578246240f, - 0.903332368494511820f, 0.902012143902493180f, 0.900683429228646970f, - 0.899346236979341570f, - 0.898000579740739880f, 0.896646470178680150f, 0.895283921038557580f, - 0.893912945145203250f, - 0.892533555402764580f, 0.891145764794583180f, 0.889749586383072780f, - 0.888345033309596350f, - 0.886932118794342190f, 0.885510856136199950f, 0.884081258712634990f, - 0.882643339979562790f, - 0.881197113471222090f, 0.879742592800047410f, 0.878279791656541580f, - 0.876808723809145650f, - 0.875329403104110890f, 0.873841843465366860f, 0.872346058894391540f, - 0.870842063470078980f, - 0.869329871348606840f, 0.867809496763303320f, 0.866280954024512990f, - 0.864744257519462380f, - 0.863199421712124160f, 0.861646461143081300f, 0.860085390429390140f, - 0.858516224264442740f, - 0.856938977417828760f, 0.855353664735196030f, 0.853760301138111410f, - 0.852158901623919830f, - 0.850549481265603480f, 0.848932055211639610f, 0.847306638685858320f, - 0.845673246987299070f, - 0.844031895490066410f, 0.842382599643185850f, 0.840725374970458070f, - 0.839060237070312740f, - 0.837387201615661940f, 0.835706284353752600f, 0.834017501106018130f, - 0.832320867767929680f, - 0.830616400308846310f, 0.828904114771864870f, 0.827184027273669130f, - 0.825456154004377550f, - 0.823720511227391430f, 0.821977115279241550f, 0.820225982569434690f, - 0.818467129580298660f, - 0.816700572866827850f, 0.814926329056526620f, 0.813144414849253590f, - 0.811354847017063730f, - 0.809557642404051260f, 0.807752817926190360f, 0.805940390571176280f, - 0.804120377398265810f, - 0.802292795538115720f, 0.800457662192622820f, 0.798614994634760820f, - 0.796764810208418830f, - 0.794907126328237010f, 0.793041960479443640f, 0.791169330217690200f, - 0.789289253168885650f, - 0.787401747029031430f, 0.785506829564053930f, 0.783604518609638200f, - 0.781694832071059390f, - 0.779777787923014550f, 0.777853404209453150f, 0.775921699043407690f, - 0.773982690606822900f, - 0.772036397150384520f, 0.770082836993347900f, 0.768122028523365420f, - 0.766153990196312920f, - 0.764178740536116670f, 0.762196298134578900f, 0.760206681651202420f, - 0.758209909813015280f, - 0.756206001414394540f, 0.754194975316889170f, 0.752176850449042810f, - 0.750151645806215070f, - 0.748119380450403600f, 0.746080073510063780f, 0.744033744179929290f, - 0.741980411720831070f, - 0.739920095459516200f, 0.737852814788465980f, 0.735778589165713590f, - 0.733697438114660370f, - 0.731609381223892630f, 0.729514438146997010f, 0.727412628602375770f, - 0.725303972373060770f, - 0.723188489306527460f, 0.721066199314508110f, 0.718937122372804490f, - 0.716801278521099540f, - 0.714658687862769090f, 0.712509370564692320f, 0.710353346857062420f, - 0.708190637033195400f, - 0.706021261449339740f, 0.703845240524484940f, 0.701662594740168570f, - 0.699473344640283770f, - 0.697277510830886630f, 0.695075113980000880f, 0.692866174817424740f, - 0.690650714134534720f, - 0.688428752784090550f, 0.686200311680038700f, 0.683965411797315510f, - 0.681724074171649820f, - 0.679476319899365080f, 0.677222170137180450f, 0.674961646102012040f, - 0.672694769070772970f, - 0.670421560380173090f, 0.668142041426518560f, 0.665856233665509720f, - 0.663564158612039880f, - 0.661265837839992270f, 0.658961292982037320f, 0.656650545729429050f, - 0.654333617831800550f, - 0.652010531096959500f, 0.649681307390683190f, 0.647345968636512060f, - 0.645004536815544040f, - 0.642657033966226860f, 0.640303482184151670f, 0.637943903621844170f, - 0.635578320488556230f, - 0.633206755050057190f, 0.630829229628424470f, 0.628445766601832710f, - 0.626056388404343520f, - 0.623661117525694640f, 0.621259976511087660f, 0.618852987960976320f, - 0.616440174530853650f, - 0.614021558931038490f, 0.611597163926462020f, 0.609167012336453210f, - 0.606731127034524480f, - 0.604289530948156070f, 0.601842247058580030f, 0.599389298400564540f, - 0.596930708062196500f, - 0.594466499184664540f, 0.591996694962040990f, 0.589521318641063940f, - 0.587040393520918080f, - 0.584553942953015330f, 0.582061990340775550f, 0.579564559139405740f, - 0.577061672855679550f, - 0.574553355047715760f, 0.572039629324757050f, 0.569520519346947250f, - 0.566996048825108680f, - 0.564466241520519500f, 0.561931121244689470f, 0.559390711859136140f, - 0.556845037275160100f, - 0.554294121453620110f, 0.551737988404707450f, 0.549176662187719770f, - 0.546610166910834860f, - 0.544038526730883930f, 0.541461765853123560f, 0.538879908531008420f, - 0.536292979065963180f, - 0.533701001807152960f, 0.531104001151255000f, 0.528502001542228480f, - 0.525895027471084740f, - 0.523283103475656430f, 0.520666254140367270f, 0.518044504095999340f, - 0.515417878019463150f, - 0.512786400633563070f, 0.510150096706766700f, 0.507508991052970870f, - 0.504863108531267480f, - 0.502212474045710900f, 0.499557112545081890f, 0.496897049022654640f, - 0.494232308515959730f, - 0.491562916106550060f, 0.488888896919763230f, 0.486210276124486530f, - 0.483527078932918740f, - 0.480839330600333900f, 0.478147056424843120f, 0.475450281747155870f, - 0.472749031950342900f, - 0.470043332459595620f, 0.467333208741988530f, 0.464618686306237820f, - 0.461899790702462840f, - 0.459176547521944150f, 0.456448982396883860f, 0.453717121000163930f, - 0.450980989045103810f, - 0.448240612285220000f, 0.445496016513981740f, 0.442747227564570130f, - 0.439994271309633260f, - 0.437237173661044200f, 0.434475960569655710f, 0.431710658025057370f, - 0.428941292055329550f, - 0.426167888726799620f, 0.423390474143796100f, 0.420609074448402510f, - 0.417823715820212380f, - 0.415034424476081630f, 0.412241226669883000f, 0.409444148692257590f, - 0.406643216870369140f, - 0.403838457567654130f, 0.401029897183575790f, 0.398217562153373620f, - 0.395401478947816300f, - 0.392581674072951530f, 0.389758174069856410f, 0.386931005514388690f, - 0.384100195016935040f, - 0.381265769222162490f, 0.378427754808765620f, 0.375586178489217330f, - 0.372741067009515810f, - 0.369892447148934270f, 0.367040345719767240f, 0.364184789567079840f, - 0.361325805568454340f, - 0.358463420633736540f, 0.355597661704783960f, 0.352728555755210730f, - 0.349856129790135030f, - 0.346980410845923680f, 0.344101425989938980f, 0.341219202320282410f, - 0.338333766965541290f, - 0.335445147084531660f, 0.332553369866044220f, 0.329658462528587550f, - 0.326760452320131790f, - 0.323859366517852960f, 0.320955232427875210f, 0.318048077385015060f, - 0.315137928752522440f, - 0.312224813921825050f, 0.309308760312268780f, 0.306389795370861080f, - 0.303467946572011370f, - 0.300543241417273400f, 0.297615707435086310f, 0.294685372180514330f, - 0.291752263234989370f, - 0.288816408206049480f, 0.285877834727080730f, 0.282936570457055390f, - 0.279992643080273380f, - 0.277046080306099950f, 0.274096909868706330f, 0.271145159526808070f, - 0.268190857063403180f, - 0.265234030285511900f, 0.262274707023913590f, 0.259312915132886350f, - 0.256348682489942910f, - 0.253382036995570270f, 0.250413006572965280f, 0.247441619167773440f, - 0.244467902747824210f, - 0.241491885302869300f, 0.238513594844318500f, 0.235533059404975460f, - 0.232550307038775330f, - 0.229565365820518870f, 0.226578263845610110f, 0.223589029229790020f, - 0.220597690108873650f, - 0.217604274638483670f, 0.214608810993786920f, 0.211611327369227610f, - 0.208611851978263460f, - 0.205610413053099320f, 0.202607038844421110f, 0.199601757621131050f, - 0.196594597670080220f, - 0.193585587295803750f, 0.190574754820252800f, 0.187562128582529740f, - 0.184547736938619640f, - 0.181531608261125130f, 0.178513770938997590f, 0.175494253377271400f, - 0.172473083996796030f, - 0.169450291233967930f, 0.166425903540464220f, 0.163399949382973230f, - 0.160372457242928400f, - 0.157343455616238280f, 0.154312973013020240f, 0.151281037957330250f, - 0.148247678986896200f, - 0.145212924652847520f, 0.142176803519448000f, 0.139139344163826280f, - 0.136100575175706200f, - 0.133060525157139180f, 0.130019222722233350f, 0.126976696496885980f, - 0.123932975118512200f, - 0.120888087235777220f, 0.117842061508325020f, 0.114794926606510250f, - 0.111746711211126660f, - 0.108697444013138670f, 0.105647153713410700f, 0.102595869022436280f, - 0.099543618660069444f, - 0.096490431355252607f, 0.093436335845747912f, 0.090381360877865011f, - 0.087325535206192226f, - 0.084268887593324127f, 0.081211446809592386f, 0.078153241632794315f, - 0.075094300847921291f, - 0.072034653246889416f, 0.068974327628266732f, 0.065913352797003930f, - 0.062851757564161420f, - 0.059789570746640007f, 0.056726821166907783f, 0.053663537652730679f, - 0.050599749036899337f, - 0.047535484156959261f, 0.044470771854938744f, 0.041405640977076712f, - 0.038340120373552791f, - 0.035274238898213947f, 0.032208025408304704f, 0.029141508764193740f, - 0.026074717829104040f, - 0.023007681468839410f, 0.019940428551514598f, 0.016872987947281773f, - 0.013805388528060349f, - 0.010737659167264572f, 0.007669828739531077f, 0.004601926120448672f, - 0.001533980186284766f -}; - -static const float32_t cos_factors_2048[2048] = { - 0.999999926465717890f, 0.999999338191525530f, 0.999998161643486980f, - 0.999996396822294350f, - 0.999994043728985820f, 0.999991102364945590f, 0.999987572731904080f, - 0.999983454831937730f, - 0.999978748667468830f, 0.999973454241265940f, 0.999967571556443780f, - 0.999961100616462820f, - 0.999954041425129780f, 0.999946393986597460f, 0.999938158305364590f, - 0.999929334386276070f, - 0.999919922234522750f, 0.999909921855641540f, 0.999899333255515390f, - 0.999888156440373320f, - 0.999876391416790410f, 0.999864038191687680f, 0.999851096772332190f, - 0.999837567166337090f, - 0.999823449381661570f, 0.999808743426610520f, 0.999793449309835270f, - 0.999777567040332940f, - 0.999761096627446610f, 0.999744038080865430f, 0.999726391410624470f, - 0.999708156627104880f, - 0.999689333741033640f, 0.999669922763483760f, 0.999649923705874240f, - 0.999629336579970110f, - 0.999608161397882110f, 0.999586398172067070f, 0.999564046915327740f, - 0.999541107640812940f, - 0.999517580362016990f, 0.999493465092780590f, 0.999468761847290050f, - 0.999443470640077770f, - 0.999417591486021720f, 0.999391124400346050f, 0.999364069398620550f, - 0.999336426496761240f, - 0.999308195711029470f, 0.999279377058032710f, 0.999249970554724420f, - 0.999219976218403530f, - 0.999189394066714920f, 0.999158224117649430f, 0.999126466389543390f, - 0.999094120901079070f, - 0.999061187671284600f, 0.999027666719533690f, 0.998993558065545680f, - 0.998958861729386080f, - 0.998923577731465780f, 0.998887706092541290f, 0.998851246833715180f, - 0.998814199976435390f, - 0.998776565542495610f, 0.998738343554035230f, 0.998699534033539280f, - 0.998660137003838490f, - 0.998620152488108870f, 0.998579580509872500f, 0.998538421092996730f, - 0.998496674261694640f, - 0.998454340040524800f, 0.998411418454391300f, 0.998367909528543820f, - 0.998323813288577560f, - 0.998279129760433200f, 0.998233858970396850f, 0.998188000945100300f, - 0.998141555711520520f, - 0.998094523296980010f, 0.998046903729146840f, 0.997998697036034390f, - 0.997949903246001190f, - 0.997900522387751620f, 0.997850554490335110f, 0.997799999583146470f, - 0.997748857695925690f, - 0.997697128858758500f, 0.997644813102075420f, 0.997591910456652630f, - 0.997538420953611340f, - 0.997484344624417930f, 0.997429681500884180f, 0.997374431615167150f, - 0.997318594999768600f, - 0.997262171687536170f, 0.997205161711661850f, 0.997147565105683480f, - 0.997089381903483400f, - 0.997030612139289450f, 0.996971255847674320f, 0.996911313063555740f, - 0.996850783822196610f, - 0.996789668159204560f, 0.996727966110532490f, 0.996665677712478160f, - 0.996602803001684130f, - 0.996539342015137940f, 0.996475294790172160f, 0.996410661364464100f, - 0.996345441776035900f, - 0.996279636063254650f, 0.996213244264832040f, 0.996146266419824620f, - 0.996078702567633980f, - 0.996010552748005870f, 0.995941817001031350f, 0.995872495367145730f, - 0.995802587887129160f, - 0.995732094602106430f, 0.995661015553546910f, 0.995589350783264600f, - 0.995517100333418110f, - 0.995444264246510340f, 0.995370842565388990f, 0.995296835333246090f, - 0.995222242593618360f, - 0.995147064390386470f, 0.995071300767776170f, 0.994994951770357020f, - 0.994918017443043200f, - 0.994840497831093180f, 0.994762392980109930f, 0.994683702936040250f, - 0.994604427745175660f, - 0.994524567454151740f, 0.994444122109948040f, 0.994363091759888570f, - 0.994281476451641550f, - 0.994199276233218910f, 0.994116491152977070f, 0.994033121259616400f, - 0.993949166602181130f, - 0.993864627230059750f, 0.993779503192984580f, 0.993693794541031790f, - 0.993607501324621610f, - 0.993520623594518090f, 0.993433161401829360f, 0.993345114798006910f, - 0.993256483834846440f, - 0.993167268564487230f, 0.993077469039412300f, 0.992987085312448390f, - 0.992896117436765980f, - 0.992804565465879140f, 0.992712429453645460f, 0.992619709454266140f, - 0.992526405522286100f, - 0.992432517712593660f, 0.992338046080420420f, 0.992242990681341700f, - 0.992147351571276090f, - 0.992051128806485720f, 0.991954322443575950f, 0.991856932539495470f, - 0.991758959151536110f, - 0.991660402337333210f, 0.991561262154865290f, 0.991461538662453790f, - 0.991361231918763460f, - 0.991260341982802440f, 0.991158868913921350f, 0.991056812771814340f, - 0.990954173616518500f, - 0.990850951508413620f, 0.990747146508222710f, 0.990642758677011570f, - 0.990537788076188750f, - 0.990432234767505970f, 0.990326098813057330f, 0.990219380275280000f, - 0.990112079216953770f, - 0.990004195701200910f, 0.989895729791486660f, 0.989786681551618640f, - 0.989677051045747210f, - 0.989566838338365120f, 0.989456043494307710f, 0.989344666578752640f, - 0.989232707657220050f, - 0.989120166795572690f, 0.989007044060015270f, 0.988893339517095130f, - 0.988779053233701520f, - 0.988664185277066230f, 0.988548735714763200f, 0.988432704614708340f, - 0.988316092045159690f, - 0.988198898074717610f, 0.988081122772324070f, 0.987962766207263420f, - 0.987843828449161740f, - 0.987724309567986960f, 0.987604209634049160f, 0.987483528717999710f, - 0.987362266890832400f, - 0.987240424223882250f, 0.987118000788826280f, 0.986994996657682980f, - 0.986871411902812470f, - 0.986747246596916590f, 0.986622500813038480f, 0.986497174624562880f, - 0.986371268105216030f, - 0.986244781329065460f, 0.986117714370520090f, 0.985990067304330140f, - 0.985861840205586980f, - 0.985733033149723490f, 0.985603646212513400f, 0.985473679470071810f, - 0.985343132998854790f, - 0.985212006875659350f, 0.985080301177623800f, 0.984948015982227030f, - 0.984815151367289140f, - 0.984681707410970940f, 0.984547684191773960f, 0.984413081788540700f, - 0.984277900280454370f, - 0.984142139747038570f, 0.984005800268157870f, 0.983868881924017220f, - 0.983731384795162090f, - 0.983593308962478650f, 0.983454654507193270f, 0.983315421510872810f, - 0.983175610055424420f, - 0.983035220223095640f, 0.982894252096474070f, 0.982752705758487830f, - 0.982610581292404750f, - 0.982467878781833170f, 0.982324598310721280f, 0.982180739963357090f, - 0.982036303824369020f, - 0.981891289978725100f, 0.981745698511732990f, 0.981599529509040720f, - 0.981452783056635520f, - 0.981305459240844670f, 0.981157558148334830f, 0.981009079866112630f, - 0.980860024481523870f, - 0.980710392082253970f, 0.980560182756327840f, 0.980409396592109910f, - 0.980258033678303550f, - 0.980106094103951770f, 0.979953577958436740f, 0.979800485331479790f, - 0.979646816313141210f, - 0.979492570993820810f, 0.979337749464256780f, 0.979182351815526930f, - 0.979026378139047580f, - 0.978869828526574120f, 0.978712703070200420f, 0.978555001862359550f, - 0.978396724995823090f, - 0.978237872563701090f, 0.978078444659442380f, 0.977918441376834370f, - 0.977757862810002760f, - 0.977596709053411890f, 0.977434980201864260f, 0.977272676350500860f, - 0.977109797594800880f, - 0.976946344030581670f, 0.976782315753998650f, 0.976617712861545640f, - 0.976452535450054060f, - 0.976286783616693630f, 0.976120457458971910f, 0.975953557074734300f, - 0.975786082562163930f, - 0.975618034019781750f, 0.975449411546446380f, 0.975280215241354220f, - 0.975110445204038890f, - 0.974940101534371830f, 0.974769184332561770f, 0.974597693699155050f, - 0.974425629735034990f, - 0.974252992541422500f, 0.974079782219875680f, 0.973905998872289570f, - 0.973731642600896400f, - 0.973556713508265560f, 0.973381211697303290f, 0.973205137271252800f, - 0.973028490333694210f, - 0.972851270988544180f, 0.972673479340056430f, 0.972495115492821190f, - 0.972316179551765300f, - 0.972136671622152230f, 0.971956591809581720f, 0.971775940219990140f, - 0.971594716959650160f, - 0.971412922135170940f, 0.971230555853497380f, 0.971047618221911100f, - 0.970864109348029470f, - 0.970680029339806130f, 0.970495378305530560f, 0.970310156353828110f, - 0.970124363593660280f, - 0.969938000134323960f, 0.969751066085452140f, 0.969563561557013180f, - 0.969375486659311280f, - 0.969186841502985950f, 0.968997626199012420f, 0.968807840858700970f, - 0.968617485593697540f, - 0.968426560515983190f, 0.968235065737874320f, 0.968043001372022260f, - 0.967850367531413620f, - 0.967657164329369880f, 0.967463391879547550f, 0.967269050295937790f, - 0.967074139692867040f, - 0.966878660184995910f, 0.966682611887320080f, 0.966485994915169840f, - 0.966288809384209690f, - 0.966091055410438830f, 0.965892733110190860f, 0.965693842600133690f, - 0.965494383997269500f, - 0.965294357418934660f, 0.965093762982799590f, 0.964892600806868890f, - 0.964690871009481030f, - 0.964488573709308410f, 0.964285709025357480f, 0.964082277076968140f, - 0.963878277983814200f, - 0.963673711865903230f, 0.963468578843575950f, 0.963262879037507070f, - 0.963056612568704340f, - 0.962849779558509030f, 0.962642380128595710f, 0.962434414400972100f, - 0.962225882497979020f, - 0.962016784542290560f, 0.961807120656913540f, 0.961596890965187860f, - 0.961386095590786250f, - 0.961174734657714080f, 0.960962808290309780f, 0.960750316613243950f, - 0.960537259751520050f, - 0.960323637830473920f, 0.960109450975773940f, 0.959894699313420530f, - 0.959679382969746750f, - 0.959463502071417510f, 0.959247056745430090f, 0.959030047119113660f, - 0.958812473320129310f, - 0.958594335476470220f, 0.958375633716461170f, 0.958156368168758820f, - 0.957936538962351420f, - 0.957716146226558870f, 0.957495190091032570f, 0.957273670685755200f, - 0.957051588141040970f, - 0.956828942587535370f, 0.956605734156215080f, 0.956381962978387730f, - 0.956157629185692140f, - 0.955932732910098280f, 0.955707274283906560f, 0.955481253439748770f, - 0.955254670510586990f, - 0.955027525629714160f, 0.954799818930753720f, 0.954571550547659630f, - 0.954342720614716480f, - 0.954113329266538800f, 0.953883376638071770f, 0.953652862864590500f, - 0.953421788081700310f, - 0.953190152425336670f, 0.952957956031764700f, 0.952725199037579570f, - 0.952491881579706320f, - 0.952258003795399600f, 0.952023565822243570f, 0.951788567798152130f, - 0.951553009861368590f, - 0.951316892150465550f, 0.951080214804345010f, 0.950842977962238160f, - 0.950605181763705340f, - 0.950366826348635780f, 0.950127911857248100f, 0.949888438430089300f, - 0.949648406208035480f, - 0.949407815332291570f, 0.949166665944390700f, 0.948924958186195160f, - 0.948682692199895090f, - 0.948439868128009620f, 0.948196486113385580f, 0.947952546299198670f, - 0.947708048828952100f, - 0.947462993846477700f, 0.947217381495934820f, 0.946971211921810880f, - 0.946724485268921170f, - 0.946477201682408680f, 0.946229361307743820f, 0.945980964290724760f, - 0.945732010777477150f, - 0.945482500914453740f, 0.945232434848435000f, 0.944981812726528150f, - 0.944730634696167800f, - 0.944478900905115550f, 0.944226611501459810f, 0.943973766633615980f, - 0.943720366450326200f, - 0.943466411100659320f, 0.943211900734010620f, 0.942956835500102120f, - 0.942701215548981900f, - 0.942445041031024890f, 0.942188312096931770f, 0.941931028897729620f, - 0.941673191584771360f, - 0.941414800309736340f, 0.941155855224629190f, 0.940896356481780830f, - 0.940636304233847590f, - 0.940375698633811540f, 0.940114539834980280f, 0.939852827990986680f, - 0.939590563255789270f, - 0.939327745783671400f, 0.939064375729241950f, 0.938800453247434770f, - 0.938535978493508560f, - 0.938270951623047190f, 0.938005372791958840f, 0.937739242156476970f, - 0.937472559873159250f, - 0.937205326098887960f, 0.936937540990869900f, 0.936669204706636170f, - 0.936400317404042060f, - 0.936130879241267030f, 0.935860890376814640f, 0.935590350969512370f, - 0.935319261178511610f, - 0.935047621163287430f, 0.934775431083638700f, 0.934502691099687870f, - 0.934229401371880820f, - 0.933955562060986730f, 0.933681173328098410f, 0.933406235334631520f, - 0.933130748242325230f, - 0.932854712213241120f, 0.932578127409764420f, 0.932300993994602760f, - 0.932023312130786490f, - 0.931745081981668720f, 0.931466303710925090f, 0.931186977482553750f, - 0.930907103460875130f, - 0.930626681810531760f, 0.930345712696488470f, 0.930064196284032360f, - 0.929782132738772190f, - 0.929499522226638560f, 0.929216364913884040f, 0.928932660967082820f, - 0.928648410553130520f, - 0.928363613839244370f, 0.928078270992963140f, 0.927792382182146320f, - 0.927505947574975180f, - 0.927218967339951790f, 0.926931441645899130f, 0.926643370661961230f, - 0.926354754557602860f, - 0.926065593502609310f, 0.925775887667086740f, 0.925485637221461490f, - 0.925194842336480530f, - 0.924903503183210910f, 0.924611619933039970f, 0.924319192757675160f, - 0.924026221829143850f, - 0.923732707319793290f, 0.923438649402290370f, 0.923144048249621930f, - 0.922848904035094120f, - 0.922553216932332830f, 0.922256987115283030f, 0.921960214758209220f, - 0.921662900035694730f, - 0.921365043122642340f, 0.921066644194273640f, 0.920767703426128790f, - 0.920468220994067110f, - 0.920168197074266340f, 0.919867631843222950f, 0.919566525477751530f, - 0.919264878154985370f, - 0.918962690052375630f, 0.918659961347691900f, 0.918356692219021720f, - 0.918052882844770380f, - 0.917748533403661250f, 0.917443644074735220f, 0.917138215037350710f, - 0.916832246471183890f, - 0.916525738556228210f, 0.916218691472794220f, 0.915911105401509880f, - 0.915602980523320230f, - 0.915294317019487050f, 0.914985115071589310f, 0.914675374861522390f, - 0.914365096571498560f, - 0.914054280384046570f, 0.913742926482011390f, 0.913431035048554720f, - 0.913118606267154240f, - 0.912805640321603500f, 0.912492137396012650f, 0.912178097674807180f, - 0.911863521342728520f, - 0.911548408584833990f, 0.911232759586496190f, 0.910916574533403360f, - 0.910599853611558930f, - 0.910282597007281760f, 0.909964804907205660f, 0.909646477498279540f, - 0.909327614967767260f, - 0.909008217503247450f, 0.908688285292613360f, 0.908367818524072890f, - 0.908046817386148340f, - 0.907725282067676440f, 0.907403212757808110f, 0.907080609646008450f, - 0.906757472922056550f, - 0.906433802776045460f, 0.906109599398381980f, 0.905784862979786550f, - 0.905459593711293250f, - 0.905133791784249690f, 0.904807457390316540f, 0.904480590721468250f, - 0.904153191969991780f, - 0.903825261328487510f, 0.903496798989868450f, 0.903167805147360720f, - 0.902838279994502830f, - 0.902508223725145940f, 0.902177636533453620f, 0.901846518613901750f, - 0.901514870161278740f, - 0.901182691370684520f, 0.900849982437531450f, 0.900516743557543520f, - 0.900182974926756810f, - 0.899848676741518580f, 0.899513849198487980f, 0.899178492494635330f, - 0.898842606827242370f, - 0.898506192393901950f, 0.898169249392518080f, 0.897831778021305650f, - 0.897493778478790310f, - 0.897155250963808550f, 0.896816195675507300f, 0.896476612813344120f, - 0.896136502577086770f, - 0.895795865166813530f, 0.895454700782912450f, 0.895113009626081760f, - 0.894770791897329550f, - 0.894428047797973800f, 0.894084777529641990f, 0.893740981294271040f, - 0.893396659294107720f, - 0.893051811731707450f, 0.892706438809935390f, 0.892360540731965360f, - 0.892014117701280470f, - 0.891667169921672280f, 0.891319697597241390f, 0.890971700932396860f, - 0.890623180131855930f, - 0.890274135400644600f, 0.889924566944096720f, 0.889574474967854580f, - 0.889223859677868210f, - 0.888872721280395630f, 0.888521059982002260f, 0.888168875989561730f, - 0.887816169510254440f, - 0.887462940751568840f, 0.887109189921300170f, 0.886754917227550840f, - 0.886400122878730600f, - 0.886044807083555600f, 0.885688970051048960f, 0.885332611990540590f, - 0.884975733111666660f, - 0.884618333624369920f, 0.884260413738899190f, 0.883901973665809470f, - 0.883543013615961880f, - 0.883183533800523390f, 0.882823534430966620f, 0.882463015719070150f, - 0.882101977876917580f, - 0.881740421116898320f, 0.881378345651706920f, 0.881015751694342870f, - 0.880652639458111010f, - 0.880289009156621010f, 0.879924861003786860f, 0.879560195213827890f, - 0.879195012001267480f, - 0.878829311580933360f, 0.878463094167957870f, 0.878096359977777130f, - 0.877729109226131570f, - 0.877361342129065140f, 0.876993058902925890f, 0.876624259764365310f, - 0.876254944930338510f, - 0.875885114618103810f, 0.875514769045222850f, 0.875143908429560360f, - 0.874772532989284150f, - 0.874400642942864790f, 0.874028238509075740f, 0.873655319906992630f, - 0.873281887355994210f, - 0.872907941075761080f, 0.872533481286276170f, 0.872158508207824480f, - 0.871783022060993120f, - 0.871407023066670950f, 0.871030511446048260f, 0.870653487420617430f, - 0.870275951212171940f, - 0.869897903042806340f, 0.869519343134916860f, 0.869140271711200560f, - 0.868760688994655310f, - 0.868380595208579800f, 0.867999990576573510f, 0.867618875322536230f, - 0.867237249670668400f, - 0.866855113845470430f, 0.866472468071743050f, 0.866089312574586770f, - 0.865705647579402380f, - 0.865321473311889800f, 0.864936789998049020f, 0.864551597864179340f, - 0.864165897136879300f, - 0.863779688043046720f, 0.863392970809878420f, 0.863005745664870320f, - 0.862618012835816740f, - 0.862229772550811240f, 0.861841025038245330f, 0.861451770526809320f, - 0.861062009245491480f, - 0.860671741423578380f, 0.860280967290654510f, 0.859889687076602290f, - 0.859497901011601730f, - 0.859105609326130450f, 0.858712812250963520f, 0.858319510017173440f, - 0.857925702856129790f, - 0.857531390999499150f, 0.857136574679244980f, 0.856741254127627470f, - 0.856345429577203610f, - 0.855949101260826910f, 0.855552269411646860f, 0.855154934263109620f, - 0.854757096048957220f, - 0.854358755003227440f, 0.853959911360254180f, 0.853560565354666840f, - 0.853160717221390420f, - 0.852760367195645300f, 0.852359515512947090f, 0.851958162409106380f, - 0.851556308120228980f, - 0.851153952882715340f, 0.850751096933260790f, 0.850347740508854980f, - 0.849943883846782210f, - 0.849539527184620890f, 0.849134670760243630f, 0.848729314811817130f, - 0.848323459577801640f, - 0.847917105296951410f, 0.847510252208314330f, 0.847102900551231500f, - 0.846695050565337450f, - 0.846286702490559710f, 0.845877856567119000f, 0.845468513035528830f, - 0.845058672136595470f, - 0.844648334111417820f, 0.844237499201387020f, 0.843826167648186740f, - 0.843414339693792760f, - 0.843002015580472940f, 0.842589195550786710f, 0.842175879847585570f, - 0.841762068714012490f, - 0.841347762393501950f, 0.840932961129779780f, 0.840517665166862550f, - 0.840101874749058400f, - 0.839685590120966110f, 0.839268811527475230f, 0.838851539213765760f, - 0.838433773425308340f, - 0.838015514407863820f, 0.837596762407483040f, 0.837177517670507300f, - 0.836757780443567190f, - 0.836337550973583530f, 0.835916829507766360f, 0.835495616293615350f, - 0.835073911578919410f, - 0.834651715611756440f, 0.834229028640493420f, 0.833805850913786340f, - 0.833382182680579730f, - 0.832958024190106670f, 0.832533375691888680f, 0.832108237435735590f, - 0.831682609671745120f, - 0.831256492650303210f, 0.830829886622083570f, 0.830402791838047550f, - 0.829975208549443950f, - 0.829547137007808910f, 0.829118577464965980f, 0.828689530173025820f, - 0.828259995384385660f, - 0.827829973351729920f, 0.827399464328029470f, 0.826968468566541600f, - 0.826536986320809960f, - 0.826105017844664610f, 0.825672563392221390f, 0.825239623217882250f, - 0.824806197576334330f, - 0.824372286722551250f, 0.823937890911791370f, 0.823503010399598500f, - 0.823067645441801670f, - 0.822631796294514990f, 0.822195463214137170f, 0.821758646457351750f, - 0.821321346281126740f, - 0.820883562942714580f, 0.820445296699652050f, 0.820006547809759680f, - 0.819567316531142230f, - 0.819127603122188240f, 0.818687407841569680f, 0.818246730948242070f, - 0.817805572701444270f, - 0.817363933360698460f, 0.816921813185809480f, 0.816479212436865390f, - 0.816036131374236810f, - 0.815592570258576790f, 0.815148529350820830f, 0.814704008912187080f, - 0.814259009204175270f, - 0.813813530488567190f, 0.813367573027426570f, 0.812921137083098770f, - 0.812474222918210480f, - 0.812026830795669730f, 0.811578960978665890f, 0.811130613730669190f, - 0.810681789315430780f, - 0.810232487996982330f, 0.809782710039636530f, 0.809332455707985950f, - 0.808881725266903610f, - 0.808430518981542720f, 0.807978837117336310f, 0.807526679939997160f, - 0.807074047715517610f, - 0.806620940710169650f, 0.806167359190504420f, 0.805713303423352230f, - 0.805258773675822210f, - 0.804803770215302920f, 0.804348293309460780f, 0.803892343226241260f, - 0.803435920233868120f, - 0.802979024600843250f, 0.802521656595946430f, 0.802063816488235440f, - 0.801605504547046150f, - 0.801146721041991360f, 0.800687466242961610f, 0.800227740420124790f, - 0.799767543843925680f, - 0.799306876785086160f, 0.798845739514604580f, 0.798384132303756380f, - 0.797922055424093000f, - 0.797459509147442460f, 0.796996493745908750f, 0.796533009491872000f, - 0.796069056657987990f, - 0.795604635517188070f, 0.795139746342679590f, 0.794674389407944550f, - 0.794208564986740640f, - 0.793742273353100210f, 0.793275514781330630f, 0.792808289546014120f, - 0.792340597922007170f, - 0.791872440184440470f, 0.791403816608719500f, 0.790934727470523290f, - 0.790465173045804880f, - 0.789995153610791090f, 0.789524669441982190f, 0.789053720816151880f, - 0.788582308010347120f, - 0.788110431301888070f, 0.787638090968367450f, 0.787165287287651010f, - 0.786692020537876790f, - 0.786218290997455660f, 0.785744098945070360f, 0.785269444659675850f, - 0.784794328420499230f, - 0.784318750507038920f, 0.783842711199065230f, 0.783366210776619720f, - 0.782889249520015480f, - 0.782411827709836530f, 0.781933945626937630f, 0.781455603552444590f, - 0.780976801767753750f, - 0.780497540554531910f, 0.780017820194715990f, 0.779537640970513260f, - 0.779057003164400630f, - 0.778575907059125050f, 0.778094352937702790f, 0.777612341083420030f, - 0.777129871779831620f, - 0.776646945310762060f, 0.776163561960304340f, 0.775679722012820650f, - 0.775195425752941420f, - 0.774710673465565550f, 0.774225465435860680f, 0.773739801949261840f, - 0.773253683291472590f, - 0.772767109748463850f, 0.772280081606474320f, 0.771792599152010150f, - 0.771304662671844830f, - 0.770816272453018540f, 0.770327428782838890f, 0.769838131948879840f, - 0.769348382238982280f, - 0.768858179941253270f, 0.768367525344066270f, 0.767876418736060610f, - 0.767384860406141730f, - 0.766892850643480670f, 0.766400389737514230f, 0.765907477977944340f, - 0.765414115654738270f, - 0.764920303058128410f, 0.764426040478612070f, 0.763931328206951090f, - 0.763436166534172010f, - 0.762940555751565720f, 0.762444496150687210f, 0.761947988023355390f, - 0.761451031661653620f, - 0.760953627357928150f, 0.760455775404789260f, 0.759957476095110330f, - 0.759458729722028210f, - 0.758959536578942440f, 0.758459896959515430f, 0.757959811157672300f, - 0.757459279467600720f, - 0.756958302183750490f, 0.756456879600833740f, 0.755955012013824420f, - 0.755452699717958250f, - 0.754949943008732640f, 0.754446742181906440f, 0.753943097533499640f, - 0.753439009359793580f, - 0.752934477957330150f, 0.752429503622912390f, 0.751924086653603550f, - 0.751418227346727470f, - 0.750911925999867890f, 0.750405182910869330f, 0.749897998377835330f, - 0.749390372699129560f, - 0.748882306173375150f, 0.748373799099454560f, 0.747864851776509410f, - 0.747355464503940190f, - 0.746845637581406540f, 0.746335371308826320f, 0.745824665986376090f, - 0.745313521914490520f, - 0.744801939393862630f, 0.744289918725443260f, 0.743777460210440890f, - 0.743264564150321600f, - 0.742751230846809050f, 0.742237460601884000f, 0.741723253717784140f, - 0.741208610497004260f, - 0.740693531242295760f, 0.740178016256666240f, 0.739662065843380010f, - 0.739145680305957510f, - 0.738628859948174840f, 0.738111605074064260f, 0.737593915987913570f, - 0.737075792994265730f, - 0.736557236397919150f, 0.736038246503927350f, 0.735518823617598900f, - 0.734998968044496710f, - 0.734478680090438370f, 0.733957960061495940f, 0.733436808263995710f, - 0.732915225004517780f, - 0.732393210589896040f, 0.731870765327218290f, 0.731347889523825570f, - 0.730824583487312160f, - 0.730300847525525490f, 0.729776681946566090f, 0.729252087058786970f, - 0.728727063170793830f, - 0.728201610591444610f, 0.727675729629849610f, 0.727149420595371020f, - 0.726622683797622850f, - 0.726095519546471000f, 0.725567928152032300f, 0.725039909924675370f, - 0.724511465175019630f, - 0.723982594213935520f, 0.723453297352544380f, 0.722923574902217700f, - 0.722393427174577550f, - 0.721862854481496340f, 0.721331857135096290f, 0.720800435447749190f, - 0.720268589732077190f, - 0.719736320300951030f, 0.719203627467491220f, 0.718670511545067230f, - 0.718136972847297490f, - 0.717603011688049080f, 0.717068628381437480f, 0.716533823241826680f, - 0.715998596583828690f, - 0.715462948722303760f, 0.714926879972359490f, 0.714390390649351390f, - 0.713853481068882470f, - 0.713316151546802610f, 0.712778402399208980f, 0.712240233942445510f, - 0.711701646493102970f, - 0.711162640368018350f, 0.710623215884275020f, 0.710083373359202800f, - 0.709543113110376770f, - 0.709002435455618250f, 0.708461340712994160f, 0.707919829200816310f, - 0.707377901237642100f, - 0.706835557142273860f, 0.706292797233758480f, 0.705749621831387790f, - 0.705206031254697830f, - 0.704662025823468930f, 0.704117605857725430f, 0.703572771677735580f, - 0.703027523604011220f, - 0.702481861957308000f, 0.701935787058624360f, 0.701389299229202230f, - 0.700842398790526230f, - 0.700295086064323780f, 0.699747361372564990f, 0.699199225037462120f, - 0.698650677381469580f, - 0.698101718727283880f, 0.697552349397843270f, 0.697002569716327460f, - 0.696452380006157830f, - 0.695901780590996830f, 0.695350771794747800f, 0.694799353941554900f, - 0.694247527355803310f, - 0.693695292362118350f, 0.693142649285365510f, 0.692589598450650380f, - 0.692036140183318830f, - 0.691482274808955850f, 0.690928002653386280f, 0.690373324042674040f, - 0.689818239303122470f, - 0.689262748761273470f, 0.688706852743907750f, 0.688150551578044830f, - 0.687593845590942170f, - 0.687036735110095660f, 0.686479220463238950f, 0.685921301978343670f, - 0.685362979983618730f, - 0.684804254807510620f, 0.684245126778703080f, 0.683685596226116690f, - 0.683125663478908800f, - 0.682565328866473250f, 0.682004592718440830f, 0.681443455364677990f, - 0.680881917135287340f, - 0.680319978360607200f, 0.679757639371212030f, 0.679194900497911200f, - 0.678631762071749470f, - 0.678068224424006600f, 0.677504287886197430f, 0.676939952790071240f, - 0.676375219467611700f, - 0.675810088251037060f, 0.675244559472799270f, 0.674678633465584540f, - 0.674112310562312360f, - 0.673545591096136100f, 0.672978475400442090f, 0.672410963808849900f, - 0.671843056655211930f, - 0.671274754273613490f, 0.670706056998372160f, 0.670136965164037760f, - 0.669567479105392490f, - 0.668997599157450270f, 0.668427325655456820f, 0.667856658934889440f, - 0.667285599331456480f, - 0.666714147181097670f, 0.666142302819983540f, 0.665570066584515560f, - 0.664997438811325340f, - 0.664424419837275180f, 0.663851009999457340f, 0.663277209635194100f, - 0.662703019082037440f, - 0.662128438677768720f, 0.661553468760399000f, 0.660978109668168060f, - 0.660402361739545030f, - 0.659826225313227430f, 0.659249700728141490f, 0.658672788323441890f, - 0.658095488438511290f, - 0.657517801412960120f, 0.656939727586627110f, 0.656361267299578000f, - 0.655782420892106030f, - 0.655203188704731930f, 0.654623571078202680f, 0.654043568353492640f, - 0.653463180871802330f, - 0.652882408974558960f, 0.652301253003415460f, 0.651719713300251020f, - 0.651137790207170330f, - 0.650555484066503990f, 0.649972795220807530f, 0.649389724012861770f, - 0.648806270785672550f, - 0.648222435882470420f, 0.647638219646710420f, 0.647053622422071650f, - 0.646468644552457890f, - 0.645883286381996440f, 0.645297548255038380f, 0.644711430516158420f, - 0.644124933510154540f, - 0.643538057582047850f, 0.642950803077082080f, 0.642363170340724320f, - 0.641775159718663500f, - 0.641186771556811250f, 0.640598006201301030f, 0.640008863998488440f, - 0.639419345294950700f, - 0.638829450437486400f, 0.638239179773115390f, 0.637648533649078810f, - 0.637057512412838590f, - 0.636466116412077180f, 0.635874345994697720f, 0.635282201508823530f, - 0.634689683302797850f, - 0.634096791725183740f, 0.633503527124764320f, 0.632909889850541860f, - 0.632315880251737680f, - 0.631721498677792370f, 0.631126745478365340f, 0.630531621003334600f, - 0.629936125602796550f, - 0.629340259627065750f, 0.628744023426674790f, 0.628147417352374120f, - 0.627550441755131530f, - 0.626953096986132770f, 0.626355383396779990f, 0.625757301338692900f, - 0.625158851163707730f, - 0.624560033223877320f, 0.623960847871470770f, 0.623361295458973340f, - 0.622761376339086460f, - 0.622161090864726930f, 0.621560439389027270f, 0.620959422265335180f, - 0.620358039847213830f, - 0.619756292488440660f, 0.619154180543008410f, 0.618551704365123860f, - 0.617948864309208260f, - 0.617345660729896940f, 0.616742093982038830f, 0.616138164420696910f, - 0.615533872401147430f, - 0.614929218278879590f, 0.614324202409595950f, 0.613718825149211830f, - 0.613113086853854910f, - 0.612506987879865570f, 0.611900528583796070f, 0.611293709322411010f, - 0.610686530452686280f, - 0.610078992331809620f, 0.609471095317180240f, 0.608862839766408200f, - 0.608254226037314490f, - 0.607645254487930830f, 0.607035925476499760f, 0.606426239361473550f, - 0.605816196501515080f, - 0.605205797255496500f, 0.604595041982500360f, 0.603983931041818020f, - 0.603372464792950370f, - 0.602760643595607220f, 0.602148467809707320f, 0.601535937795377730f, - 0.600923053912954090f, - 0.600309816522980430f, 0.599696225986208310f, 0.599082282663597310f, - 0.598467986916314310f, - 0.597853339105733910f, 0.597238339593437530f, 0.596622988741213330f, - 0.596007286911056530f, - 0.595391234465168730f, 0.594774831765957580f, 0.594158079176036800f, - 0.593540977058226390f, - 0.592923525775551410f, 0.592305725691242400f, 0.591687577168735550f, - 0.591069080571671510f, - 0.590450236263895920f, 0.589831044609458900f, 0.589211505972615070f, - 0.588591620717822890f, - 0.587971389209745120f, 0.587350811813247660f, 0.586729888893400500f, - 0.586108620815476430f, - 0.585487007944951450f, 0.584865050647504490f, 0.584242749289016980f, - 0.583620104235572760f, - 0.582997115853457700f, 0.582373784509160220f, 0.581750110569369760f, - 0.581126094400977620f, - 0.580501736371076600f, 0.579877036846960350f, 0.579251996196123550f, - 0.578626614786261430f, - 0.578000892985269910f, 0.577374831161244880f, 0.576748429682482520f, - 0.576121688917478390f, - 0.575494609234928230f, 0.574867191003726740f, 0.574239434592967890f, - 0.573611340371944610f, - 0.572982908710148680f, 0.572354139977270030f, 0.571725034543197120f, - 0.571095592778016690f, - 0.570465815052012990f, 0.569835701735668110f, 0.569205253199661200f, - 0.568574469814869250f, - 0.567943351952365670f, 0.567311899983420800f, 0.566680114279501710f, - 0.566047995212271560f, - 0.565415543153589770f, 0.564782758475511400f, 0.564149641550287680f, - 0.563516192750364910f, - 0.562882412448384550f, 0.562248301017183150f, 0.561613858829792420f, - 0.560979086259438260f, - 0.560343983679540860f, 0.559708551463714790f, 0.559072789985768480f, - 0.558436699619704100f, - 0.557800280739717100f, 0.557163533720196340f, 0.556526458935723720f, - 0.555889056761073920f, - 0.555251327571214090f, 0.554613271741304040f, 0.553974889646695610f, - 0.553336181662932410f, - 0.552697148165749770f, 0.552057789531074980f, 0.551418106135026060f, - 0.550778098353912230f, - 0.550137766564233630f, 0.549497111142680960f, 0.548856132466135290f, - 0.548214830911667780f, - 0.547573206856539870f, 0.546931260678202190f, 0.546288992754295210f, - 0.545646403462648590f, - 0.545003493181281160f, 0.544360262288400400f, 0.543716711162402390f, - 0.543072840181871850f, - 0.542428649725581360f, 0.541784140172491660f, 0.541139311901750910f, - 0.540494165292695230f, - 0.539848700724847700f, 0.539202918577918240f, 0.538556819231804210f, - 0.537910403066588990f, - 0.537263670462542530f, 0.536616621800121150f, 0.535969257459966710f, - 0.535321577822907010f, - 0.534673583269955510f, 0.534025274182310380f, 0.533376650941355560f, - 0.532727713928658810f, - 0.532078463525973540f, 0.531428900115236910f, 0.530779024078570250f, - 0.530128835798278850f, - 0.529478335656852090f, 0.528827524036961980f, 0.528176401321464370f, - 0.527524967893398200f, - 0.526873224135984700f, 0.526221170432628170f, 0.525568807166914680f, - 0.524916134722612890f, - 0.524263153483673470f, 0.523609863834228030f, 0.522956266158590140f, - 0.522302360841254700f, - 0.521648148266897090f, 0.520993628820373810f, 0.520338802886721960f, - 0.519683670851158520f, - 0.519028233099080970f, 0.518372490016066220f, 0.517716441987871150f, - 0.517060089400432130f, - 0.516403432639863990f, 0.515746472092461380f, 0.515089208144697270f, - 0.514431641183222930f, - 0.513773771594868030f, 0.513115599766640560f, 0.512457126085725800f, - 0.511798350939487000f, - 0.511139274715464390f, 0.510479897801375700f, 0.509820220585115560f, - 0.509160243454754750f, - 0.508499966798540810f, 0.507839391004897940f, 0.507178516462425290f, - 0.506517343559898530f, - 0.505855872686268860f, 0.505194104230662240f, 0.504532038582380380f, - 0.503869676130898950f, - 0.503207017265869030f, 0.502544062377115800f, 0.501880811854638400f, - 0.501217266088609950f, - 0.500553425469377640f, 0.499889290387461380f, 0.499224861233555030f, - 0.498560138398525200f, - 0.497895122273410930f, 0.497229813249424340f, 0.496564211717949340f, - 0.495898318070542240f, - 0.495232132698931350f, 0.494565655995016010f, 0.493898888350867430f, - 0.493231830158728070f, - 0.492564481811010650f, 0.491896843700299240f, 0.491228916219348330f, - 0.490560699761082080f, - 0.489892194718595300f, 0.489223401485152030f, 0.488554320454186230f, - 0.487884952019301210f, - 0.487215296574268820f, 0.486545354513030270f, 0.485875126229695420f, - 0.485204612118541880f, - 0.484533812574016120f, 0.483862727990732320f, 0.483191358763471910f, - 0.482519705287184520f, - 0.481847767956986080f, 0.481175547168160360f, 0.480503043316157670f, - 0.479830256796594250f, - 0.479157188005253310f, 0.478483837338084080f, 0.477810205191201040f, - 0.477136291960884750f, - 0.476462098043581310f, 0.475787623835901120f, 0.475112869734620470f, - 0.474437836136679340f, - 0.473762523439182850f, 0.473086932039400220f, 0.472411062334764100f, - 0.471734914722871430f, - 0.471058489601482610f, 0.470381787368520710f, 0.469704808422072460f, - 0.469027553160387240f, - 0.468350021981876530f, 0.467672215285114710f, 0.466994133468838110f, - 0.466315776931944480f, - 0.465637146073493770f, 0.464958241292706740f, 0.464279062988965760f, - 0.463599611561814120f, - 0.462919887410955130f, 0.462239890936253280f, 0.461559622537733190f, - 0.460879082615578690f, - 0.460198271570134270f, 0.459517189801903590f, 0.458835837711549120f, - 0.458154215699893230f, - 0.457472324167916110f, 0.456790163516757220f, 0.456107734147714220f, - 0.455425036462242420f, - 0.454742070861955450f, 0.454058837748624540f, 0.453375337524177750f, - 0.452691570590700860f, - 0.452007537350436530f, 0.451323238205783520f, 0.450638673559297760f, - 0.449953843813690580f, - 0.449268749371829920f, 0.448583390636739300f, 0.447897768011597360f, - 0.447211881899738260f, - 0.446525732704651400f, 0.445839320829980350f, 0.445152646679523590f, - 0.444465710657234110f, - 0.443778513167218280f, 0.443091054613736990f, 0.442403335401204130f, - 0.441715355934187310f, - 0.441027116617407340f, 0.440338617855737300f, 0.439649860054203420f, - 0.438960843617984430f, - 0.438271568952410480f, 0.437582036462964340f, 0.436892246555280470f, - 0.436202199635143950f, - 0.435511896108492170f, 0.434821336381412350f, 0.434130520860143310f, - 0.433439449951074200f, - 0.432748124060743760f, 0.432056543595841450f, 0.431364708963206440f, - 0.430672620569826860f, - 0.429980278822840570f, 0.429287684129534720f, 0.428594836897344400f, - 0.427901737533854240f, - 0.427208386446796370f, 0.426514784044051520f, 0.425820930733648350f, - 0.425126826923762410f, - 0.424432473022717420f, 0.423737869438983950f, 0.423043016581179100f, - 0.422347914858067000f, - 0.421652564678558380f, 0.420956966451709440f, 0.420261120586723050f, - 0.419565027492946940f, - 0.418868687579875110f, 0.418172101257146430f, 0.417475268934544340f, - 0.416778191021997590f, - 0.416080867929579320f, 0.415383300067506290f, 0.414685487846140010f, - 0.413987431675985510f, - 0.413289131967690960f, 0.412590589132048380f, 0.411891803579992220f, - 0.411192775722600160f, - 0.410493505971092520f, 0.409793994736831200f, 0.409094242431320920f, - 0.408394249466208110f, - 0.407694016253280170f, 0.406993543204466460f, 0.406292830731837470f, - 0.405591879247603870f, - 0.404890689164117750f, 0.404189260893870750f, 0.403487594849495310f, - 0.402785691443763640f, - 0.402083551089587040f, 0.401381174200016790f, 0.400678561188243350f, - 0.399975712467595390f, - 0.399272628451540930f, 0.398569309553686360f, 0.397865756187775750f, - 0.397161968767691720f, - 0.396457947707453960f, 0.395753693421220080f, 0.395049206323284880f, - 0.394344486828079650f, - 0.393639535350172880f, 0.392934352304269600f, 0.392228938105210370f, - 0.391523293167972350f, - 0.390817417907668610f, 0.390111312739546910f, 0.389404978078991100f, - 0.388698414341519250f, - 0.387991621942784910f, 0.387284601298575890f, 0.386577352824813980f, - 0.385869876937555310f, - 0.385162174052989970f, 0.384454244587440870f, 0.383746088957365010f, - 0.383037707579352130f, - 0.382329100870124510f, 0.381620269246537520f, 0.380911213125578130f, - 0.380201932924366050f, - 0.379492429060152740f, 0.378782701950320600f, 0.378072752012383990f, - 0.377362579663988450f, - 0.376652185322909620f, 0.375941569407054420f, 0.375230732334460030f, - 0.374519674523293210f, - 0.373808396391851370f, 0.373096898358560690f, 0.372385180841977360f, - 0.371673244260786630f, - 0.370961089033802040f, 0.370248715579966360f, 0.369536124318350760f, - 0.368823315668153960f, - 0.368110290048703050f, 0.367397047879452820f, 0.366683589579984930f, - 0.365969915570008910f, - 0.365256026269360380f, 0.364541922098002180f, 0.363827603476023610f, - 0.363113070823639530f, - 0.362398324561191310f, 0.361683365109145950f, 0.360968192888095290f, - 0.360252808318756830f, - 0.359537211821973180f, 0.358821403818710860f, 0.358105384730061760f, - 0.357389154977241000f, - 0.356672714981588260f, 0.355956065164567010f, 0.355239205947763370f, - 0.354522137752887430f, - 0.353804861001772160f, 0.353087376116372530f, 0.352369683518766630f, - 0.351651783631154680f, - 0.350933676875858360f, 0.350215363675321740f, 0.349496844452109600f, - 0.348778119628908420f, - 0.348059189628525780f, 0.347340054873889190f, 0.346620715788047320f, - 0.345901172794169100f, - 0.345181426315542610f, 0.344461476775576480f, 0.343741324597798600f, - 0.343020970205855540f, - 0.342300414023513690f, 0.341579656474657210f, 0.340858697983289440f, - 0.340137538973531880f, - 0.339416179869623410f, 0.338694621095921190f, 0.337972863076899830f, - 0.337250906237150650f, - 0.336528751001382350f, 0.335806397794420560f, 0.335083847041206580f, - 0.334361099166798900f, - 0.333638154596370920f, 0.332915013755212650f, 0.332191677068729320f, - 0.331468144962440920f, - 0.330744417861982890f, 0.330020496193105530f, 0.329296380381672800f, - 0.328572070853663690f, - 0.327847568035170960f, 0.327122872352400510f, 0.326397984231672660f, - 0.325672904099419900f, - 0.324947632382188430f, 0.324222169506637130f, 0.323496515899536760f, - 0.322770671987770710f, - 0.322044638198334620f, 0.321318414958334910f, 0.320592002694990330f, - 0.319865401835630610f, - 0.319138612807695900f, 0.318411636038737960f, 0.317684471956418020f, - 0.316957120988508150f, - 0.316229583562890490f, 0.315501860107556040f, 0.314773951050606070f, - 0.314045856820250820f, - 0.313317577844809070f, 0.312589114552708660f, 0.311860467372486130f, - 0.311131636732785270f, - 0.310402623062358880f, 0.309673426790066490f, 0.308944048344875710f, - 0.308214488155861220f, - 0.307484746652204160f, 0.306754824263192780f, 0.306024721418221900f, - 0.305294438546791720f, - 0.304563976078509050f, 0.303833334443086470f, 0.303102514070341060f, - 0.302371515390196130f, - 0.301640338832678880f, 0.300908984827921890f, 0.300177453806162120f, - 0.299445746197739950f, - 0.298713862433100390f, 0.297981802942791920f, 0.297249568157465890f, - 0.296517158507877410f, - 0.295784574424884370f, 0.295051816339446720f, 0.294318884682627570f, - 0.293585779885591310f, - 0.292852502379604810f, 0.292119052596036540f, 0.291385430966355720f, - 0.290651637922133220f, - 0.289917673895040860f, 0.289183539316850310f, 0.288449234619434170f, - 0.287714760234765280f, - 0.286980116594915570f, 0.286245304132057120f, 0.285510323278461380f, - 0.284775174466498300f, - 0.284039858128637360f, 0.283304374697445790f, 0.282568724605589740f, - 0.281832908285833460f, - 0.281096926171038320f, 0.280360778694163810f, 0.279624466288266700f, - 0.278887989386500280f, - 0.278151348422115090f, 0.277414543828458200f, 0.276677576038972420f, - 0.275940445487197320f, - 0.275203152606767370f, 0.274465697831413220f, 0.273728081594960650f, - 0.272990304331329980f, - 0.272252366474536660f, 0.271514268458690810f, 0.270776010717996010f, - 0.270037593686750510f, - 0.269299017799346230f, 0.268560283490267890f, 0.267821391194094320f, - 0.267082341345496350f, - 0.266343134379238180f, 0.265603770730176440f, 0.264864250833259320f, - 0.264124575123527490f, - 0.263384744036113390f, 0.262644758006240100f, 0.261904617469222560f, - 0.261164322860466590f, - 0.260423874615468010f, 0.259683273169813930f, 0.258942518959180580f, - 0.258201612419334870f, - 0.257460553986133210f, 0.256719344095520720f, 0.255977983183532380f, - 0.255236471686291820f, - 0.254494810040010790f, 0.253752998680989940f, 0.253011038045617980f, - 0.252268928570370810f, - 0.251526670691812780f, 0.250784264846594550f, 0.250041711471454650f, - 0.249299011003218300f, - 0.248556163878796620f, 0.247813170535187620f, 0.247070031409475370f, - 0.246326746938829060f, - 0.245583317560504000f, 0.244839743711840750f, 0.244096025830264210f, - 0.243352164353284880f, - 0.242608159718496890f, 0.241864012363579210f, 0.241119722726294730f, - 0.240375291244489500f, - 0.239630718356093560f, 0.238886004499120170f, 0.238141150111664870f, - 0.237396155631906550f, - 0.236651021498106460f, 0.235905748148607370f, 0.235160336021834860f, - 0.234414785556295250f, - 0.233669097190576820f, 0.232923271363349120f, 0.232177308513361770f, - 0.231431209079445730f, - 0.230684973500512310f, 0.229938602215552260f, 0.229192095663636740f, - 0.228445454283916550f, - 0.227698678515621170f, 0.226951768798059980f, 0.226204725570620270f, - 0.225457549272768540f, - 0.224710240344049570f, 0.223962799224085520f, 0.223215226352576960f, - 0.222467522169301990f, - 0.221719687114115240f, 0.220971721626949060f, 0.220223626147812460f, - 0.219475401116790340f, - 0.218727046974044600f, 0.217978564159812290f, 0.217229953114406790f, - 0.216481214278216900f, - 0.215732348091705940f, 0.214983354995412820f, 0.214234235429951100f, - 0.213484989836008080f, - 0.212735618654345870f, 0.211986122325800410f, 0.211236501291280710f, - 0.210486755991769890f, - 0.209736886868323370f, 0.208986894362070070f, 0.208236778914211470f, - 0.207486540966020700f, - 0.206736180958843660f, 0.205985699334098050f, 0.205235096533272380f, - 0.204484372997927180f, - 0.203733529169694010f, 0.202982565490274460f, 0.202231482401441620f, - 0.201480280345037820f, - 0.200728959762976140f, 0.199977521097239290f, 0.199225964789878890f, - 0.198474291283016360f, - 0.197722501018842030f, 0.196970594439614370f, 0.196218571987660850f, - 0.195466434105377090f, - 0.194714181235225990f, 0.193961813819739010f, 0.193209332301514080f, - 0.192456737123216840f, - 0.191704028727579940f, 0.190951207557401860f, 0.190198274055548120f, - 0.189445228664950340f, - 0.188692071828605260f, 0.187938803989575850f, 0.187185425590990440f, - 0.186431937076041640f, - 0.185678338887987790f, 0.184924631470150870f, 0.184170815265917720f, - 0.183416890718739230f, - 0.182662858272129360f, 0.181908718369666160f, 0.181154471454990920f, - 0.180400117971807270f, - 0.179645658363882100f, 0.178891093075044830f, 0.178136422549186320f, - 0.177381647230260200f, - 0.176626767562280960f, 0.175871783989325040f, 0.175116696955530060f, - 0.174361506905093830f, - 0.173606214282275410f, 0.172850819531394200f, 0.172095323096829040f, - 0.171339725423019260f, - 0.170584026954463700f, 0.169828228135719880f, 0.169072329411405180f, - 0.168316331226194910f, - 0.167560234024823590f, 0.166804038252083870f, 0.166047744352825850f, - 0.165291352771957970f, - 0.164534863954446110f, 0.163778278345312690f, 0.163021596389637810f, - 0.162264818532558110f, - 0.161507945219266150f, 0.160750976895011390f, 0.159993914005098350f, - 0.159236756994887850f, - 0.158479506309796100f, 0.157722162395293690f, 0.156964725696906750f, - 0.156207196660216040f, - 0.155449575730855880f, 0.154691863354515400f, 0.153934059976937460f, - 0.153176166043917870f, - 0.152418182001306500f, 0.151660108295005400f, 0.150901945370970040f, - 0.150143693675208330f, - 0.149385353653779810f, 0.148626925752796540f, 0.147868410418422360f, - 0.147109808096871850f, - 0.146351119234411440f, 0.145592344277358450f, 0.144833483672080240f, - 0.144074537864995330f, - 0.143315507302571590f, 0.142556392431327340f, 0.141797193697830530f, - 0.141037911548697770f, - 0.140278546430595420f, 0.139519098790238600f, 0.138759569074390380f, - 0.137999957729862760f, - 0.137240265203515700f, 0.136480491942256310f, 0.135720638393040080f, - 0.134960705002868830f, - 0.134200692218792020f, 0.133440600487905820f, 0.132680430257352130f, - 0.131920181974319760f, - 0.131159856086043410f, 0.130399453039802740f, 0.129638973282923540f, - 0.128878417262776660f, - 0.128117785426777150f, 0.127357078222385570f, 0.126596296097105960f, - 0.125835439498487020f, - 0.125074508874121300f, 0.124313504671644300f, 0.123552427338735370f, - 0.122791277323116900f, - 0.122030055072553410f, 0.121268761034852550f, 0.120507395657864240f, - 0.119745959389479630f, - 0.118984452677632520f, 0.118222875970297250f, 0.117461229715489990f, - 0.116699514361267840f, - 0.115937730355727850f, 0.115175878147008180f, 0.114413958183287050f, - 0.113651970912781920f, - 0.112889916783750470f, 0.112127796244489750f, 0.111365609743335190f, - 0.110603357728661910f, - 0.109841040648882680f, 0.109078658952449240f, 0.108316213087851300f, - 0.107553703503615710f, - 0.106791130648307380f, 0.106028494970528530f, 0.105265796918917650f, - 0.104503036942150550f, - 0.103740215488939480f, 0.102977333008032250f, 0.102214389948213370f, - 0.101451386758302160f, - 0.100688323887153970f, 0.099925201783659226f, 0.099162020896742573f, - 0.098398781675363881f, - 0.097635484568517339f, 0.096872130025230527f, 0.096108718494565468f, - 0.095345250425617742f, - 0.094581726267515473f, 0.093818146469420494f, 0.093054511480527333f, - 0.092290821750062355f, - 0.091527077727284981f, 0.090763279861485704f, 0.089999428601987341f, - 0.089235524398144139f, - 0.088471567699340822f, 0.087707558954993645f, 0.086943498614549489f, - 0.086179387127484922f, - 0.085415224943307277f, 0.084651012511553700f, 0.083886750281790226f, - 0.083122438703613077f, - 0.082358078226646619f, 0.081593669300544638f, 0.080829212374989468f, - 0.080064707899690932f, - 0.079300156324387569f, 0.078535558098845590f, 0.077770913672857989f, - 0.077006223496245585f, - 0.076241488018856149f, 0.075476707690563416f, 0.074711882961268378f, - 0.073947014280897269f, - 0.073182102099402888f, 0.072417146866763538f, 0.071652149032982254f, - 0.070887109048087787f, - 0.070122027362133646f, 0.069356904425197236f, 0.068591740687380900f, - 0.067826536598810966f, - 0.067061292609636836f, 0.066296009170032283f, 0.065530686730193397f, - 0.064765325740339871f, - 0.063999926650714078f, 0.063234489911580136f, 0.062469015973224969f, - 0.061703505285957416f, - 0.060937958300107238f, 0.060172375466026218f, 0.059406757234087247f, - 0.058641104054683348f, - 0.057875416378229017f, 0.057109694655158132f, 0.056343939335925283f, - 0.055578150871004817f, - 0.054812329710889909f, 0.054046476306093640f, 0.053280591107148056f, - 0.052514674564603257f, - 0.051748727129028414f, 0.050982749251010900f, 0.050216741381155325f, - 0.049450703970084824f, - 0.048684637468439020f, 0.047918542326875327f, 0.047152418996068000f, - 0.046386267926707213f, - 0.045620089569500123f, 0.044853884375169933f, 0.044087652794454979f, - 0.043321395278109784f, - 0.042555112276904117f, 0.041788804241622082f, 0.041022471623063397f, - 0.040256114872041358f, - 0.039489734439384118f, 0.038723330775933762f, 0.037956904332545366f, - 0.037190455560088091f, - 0.036423984909444228f, 0.035657492831508264f, 0.034890979777187955f, - 0.034124446197403423f, - 0.033357892543086159f, 0.032591319265180385f, 0.031824726814640963f, - 0.031058115642434700f, - 0.030291486199539423f, 0.029524838936943035f, 0.028758174305644590f, - 0.027991492756653365f, - 0.027224794740987910f, 0.026458080709677145f, 0.025691351113759395f, - 0.024924606404281485f, - 0.024157847032300020f, 0.023391073448879338f, 0.022624286105092803f, - 0.021857485452021874f, - 0.021090671940755180f, 0.020323846022389572f, 0.019557008148029204f, - 0.018790158768784596f, - 0.018023298335773701f, 0.017256427300120978f, 0.016489546112956454f, - 0.015722655225417017f, - 0.014955755088644378f, 0.014188846153786343f, 0.013421928871995907f, - 0.012655003694430301f, - 0.011888071072252072f, 0.011121131456628141f, 0.010354185298728884f, - 0.009587233049729183f, - 0.008820275160807512f, 0.008053312083144991f, 0.007286344267926684f, - 0.006519372166339549f, - 0.005752396229573737f, 0.004985416908821652f, 0.004218434655277024f, - 0.003451449920135975f, - 0.002684463154596083f, 0.001917474809855460f, 0.001150485337113809f, - 0.000383495187571497f -}; - -static const float32_t cos_factors_8192[8192] = { - 1.999999990808214700, 1.999999917273932200, 1.999999770205369800, - 1.999999549602533100, - 1.999999255465430200, 1.999998887794072000, 1.999998446588471700, - 1.999997931848645600, - 1.999997343574612800, 1.999996681766395000, 1.999995946424016200, - 1.999995137547503600, - 1.999994255136887000, 1.999993299192198700, 1.999992269713474200, - 1.999991166700750800, - 1.999989990154069600, 1.999988740073473500, 1.999987416459008600, - 1.999986019310723500, - 1.999984548628669600, 1.999983004412901000, 1.999981386663474400, - 1.999979695380449400, - 1.999977930563888100, 1.999976092213855400, 1.999974180330418700, - 1.999972194913648900, - 1.999970135963618400, 1.999968003480403000, 1.999965797464081200, - 1.999963517914734100, - 1.999961164832445800, 1.999958738217302300, 1.999956238069392900, - 1.999953664388809800, - 1.999951017175647600, 1.999948296430003500, 1.999945502151977600, - 1.999942634341672600, - 1.999939692999193900, 1.999936678124649700, 1.999933589718150700, - 1.999930427779810900, - 1.999927192309745900, 1.999923883308075200, 1.999920500774920300, - 1.999917044710405500, - 1.999913515114657900, 1.999909911987807200, 1.999906235329986100, - 1.999902485141329400, - 1.999898661421975400, 1.999894764172064600, 1.999890793391740000, - 1.999886749081147800, - 1.999882631240436700, 1.999878439869758200, 1.999874174969266300, - 1.999869836539117700, - 1.999865424579472000, 1.999860939090491600, 1.999856380072341000, - 1.999851747525188200, - 1.999847041449203300, 1.999842261844559700, 1.999837408711432600, - 1.999832482050000900, - 1.999827481860445300, 1.999822408142949900, 1.999817260897701400, - 1.999812040124888700, - 1.999806745824704000, 1.999801377997341800, 1.999795936642999600, - 1.999790421761877400, - 1.999784833354177900, 1.999779171420106700, 1.999773435959872000, - 1.999767626973684400, - 1.999761744461757700, 1.999755788424308200, 1.999749758861554900, - 1.999743655773719400, - 1.999737479161026100, 1.999731229023702200, 1.999724905361977200, - 1.999718508176084000, - 1.999712037466257600, 1.999705493232735800, 1.999698875475759600, - 1.999692184195571900, - 1.999685419392419000, 1.999678581066549400, 1.999671669218214600, - 1.999664683847668800, - 1.999657624955168700, 1.999650492540973900, 1.999643286605346800, - 1.999636007148552400, - 1.999628654170857900, 1.999621227672533800, 1.999613727653853500, - 1.999606154115092500, - 1.999598507056529000, 1.999590786478444600, 1.999582992381123000, - 1.999575124764850800, - 1.999567183629917100, 1.999559168976613900, 1.999551080805236100, - 1.999542919116081000, - 1.999534683909448600, 1.999526375185641800, 1.999517992944965800, - 1.999509537187729200, - 1.999501007914242600, 1.999492405124819700, 1.999483728819776900, - 1.999474978999432800, - 1.999466155664109600, 1.999457258814131500, 1.999448288449825500, - 1.999439244571521700, - 1.999430127179552500, 1.999420936274252800, 1.999411671855960900, - 1.999402333925017300, - 1.999392922481765500, 1.999383437526551300, 1.999373879059723500, - 1.999364247081633500, - 1.999354541592635500, 1.999344762593086500, 1.999334910083345700, - 1.999324984063775700, - 1.999314984534741100, 1.999304911496609700, 1.999294764949752100, - 1.999284544894541100, - 1.999274251331352400, 1.999263884260564600, 1.999253443682558900, - 1.999242929597719200, - 1.999232342006432000, 1.999221680909086400, 1.999210946306074500, - 1.999200138197791100, - 1.999189256584633600, 1.999178301467001900, 1.999167272845298900, - 1.999156170719930100, - 1.999144995091303600, 1.999133745959830600, 1.999122423325924200, - 1.999111027190001000, - 1.999099557552479900, 1.999088014413782800, 1.999076397774334000, - 1.999064707634560700, - 1.999052943994892300, 1.999041106855761900, 1.999029196217604100, - 1.999017212080857400, - 1.999005154445962200, 1.998993023313361700, 1.998980818683502100, - 1.998968540556831800, - 1.998956188933802800, 1.998943763814868800, 1.998931265200486900, - 1.998918693091116200, - 1.998906047487219600, 1.998893328389261400, 1.998880535797709700, - 1.998867669713034500, - 1.998854730135709400, 1.998841717066209400, 1.998828630505013400, - 1.998815470452602400, - 1.998802236909460500, 1.998788929876074100, 1.998775549352932400, - 1.998762095340527400, - 1.998748567839354000, 1.998734966849909000, 1.998721292372693100, - 1.998707544408208700, - 1.998693722956961500, 1.998679828019459300, 1.998665859596213500, - 1.998651817687737300, - 1.998637702294547000, 1.998623513417161700, 1.998609251056103100, - 1.998594915211895600, - 1.998580505885066100, 1.998566023076144600, 1.998551466785663400, - 1.998536837014157900, - 1.998522133762165900, 1.998507357030227900, 1.998492506818887200, - 1.998477583128690100, - 1.998462585960185000, 1.998447515313923400, 1.998432371190459500, - 1.998417153590349900, - 1.998401862514154200, 1.998386497962434800, 1.998371059935756300, - 1.998355548434686400, - 1.998339963459795400, 1.998324305011656600, 1.998308573090845200, - 1.998292767697940100, - 1.998276888833522300, 1.998260936498175400, 1.998244910692486000, - 1.998228811417043700, - 1.998212638672439900, 1.998196392459269400, 1.998180072778129600, - 1.998163679629620500, - 1.998147213014344900, 1.998130672932908000, 1.998114059385918400, - 1.998097372373986300, - 1.998080611897725700, 1.998063777957752600, 1.998046870554686100, - 1.998029889689147700, - 1.998012835361761900, 1.997995707573155600, 1.997978506323958600, - 1.997961231614803200, - 1.997943883446324800, 1.997926461819161000, 1.997908966733952500, - 1.997891398191342400, - 1.997873756191977000, 1.997856040736504500, 1.997838251825576400, - 1.997820389459846700, - 1.997802453639972300, 1.997784444366612600, 1.997766361640429800, - 1.997748205462088500, - 1.997729975832256600, 1.997711672751604200, 1.997693296220804000, - 1.997674846240532000, - 1.997656322811466500, 1.997637725934288300, 1.997619055609681600, - 1.997600311838332500, - 1.997581494620930300, 1.997562603958166600, 1.997543639850736200, - 1.997524602299336500, - 1.997505491304667000, 1.997486306867430900, 1.997467048988333000, - 1.997447717668082000, - 1.997428312907388200, 1.997408834706965000, 1.997389283067528800, - 1.997369657989798400, - 1.997349959474495200, 1.997330187522343700, 1.997310342134070800, - 1.997290423310406100, - 1.997270431052081900, 1.997250365359833200, 1.997230226234397900, - 1.997210013676516700, - 1.997189727686932400, 1.997169368266390900, 1.997148935415640600, - 1.997128429135433400, - 1.997107849426522600, 1.997087196289665000, 1.997066469725620200, - 1.997045669735150000, - 1.997024796319019300, 1.997003849477995600, 1.996982829212848900, - 1.996961735524351900, - 1.996940568413280600, 1.996919327880412900, 1.996898013926530000, - 1.996876626552415400, - 1.996855165758855600, 1.996833631546639300, 1.996812023916558800, - 1.996790342869408000, - 1.996768588405984300, 1.996746760527087700, 1.996724859233520500, - 1.996702884526087900, - 1.996680836405598100, 1.996658714872861800, 1.996636519928692000, - 1.996614251573904900, - 1.996591909809319400, 1.996569494635756600, 1.996547006054041100, - 1.996524444064999400, - 1.996501808669461000, 1.996479099868258400, 1.996456317662226300, - 1.996433462052202600, - 1.996410533039027400, 1.996387530623543900, 1.996364454806597500, - 1.996341305589037100, - 1.996318082971713500, 1.996294786955480800, 1.996271417541195300, - 1.996247974729716200, - 1.996224458521905600, 1.996200868918628100, 1.996177205920750800, - 1.996153469529144100, - 1.996129659744680300, 1.996105776568235100, 1.996081820000686500, - 1.996057790042915500, - 1.996033686695805300, 1.996009509960242400, 1.995985259837115500, - 1.995960936327316300, - 1.995936539431739000, 1.995912069151280800, 1.995887525486841300, - 1.995862908439323100, - 1.995838218009630800, 1.995813454198672700, 1.995788617007359100, - 1.995763706436603200, - 1.995738722487320600, 1.995713665160430600, 1.995688534456853800, - 1.995663330377514400, - 1.995638052923339300, 1.995612702095257400, 1.995587277894201400, - 1.995561780321105600, - 1.995536209376907600, 1.995510565062547800, 1.995484847378968600, - 1.995459056327116000, - 1.995433191907938000, 1.995407254122385700, 1.995381242971412600, - 1.995355158455975200, - 1.995329000577032800, 1.995302769335546500, 1.995276464732481200, - 1.995250086768804100, - 1.995223635445484900, 1.995197110763496000, 1.995170512723813100, - 1.995143841327413400, - 1.995117096575278200, 1.995090278468390600, 1.995063387007736600, - 1.995036422194304700, - 1.995009384029086800, 1.994982272513076600, 1.994955087647271000, - 1.994927829432669800, - 1.994900497870274900, 1.994873092961091200, 1.994845614706126400, - 1.994818063106391000, - 1.994790438162897600, 1.994762739876662100, 1.994734968248702800, - 1.994707123280041100, - 1.994679204971700100, 1.994651213324707000, 1.994623148340090700, - 1.994595010018883000, - 1.994566798362118300, 1.994538513370834200, 1.994510155046070700, - 1.994481723388870100, - 1.994453218400277900, 1.994424640081342100, 1.994395988433113700, - 1.994367263456646100, - 1.994338465152995000, 1.994309593523219600, 1.994280648568381500, - 1.994251630289544600, - 1.994222538687776100, 1.994193373764145500, 1.994164135519725000, - 1.994134823955589800, - 1.994105439072817700, 1.994075980872488800, 1.994046449355686200, - 1.994016844523496000, - 1.993987166377006600, 1.993957414917308700, 1.993927590145496900, - 1.993897692062667200, - 1.993867720669919400, 1.993837675968354700, 1.993807557959078600, - 1.993777366643197900, - 1.993747102021822900, 1.993716764096066200, 1.993686352867043200, - 1.993655868335872300, - 1.993625310503674100, 1.993594679371572200, 1.993563974940692800, - 1.993533197212164800, - 1.993502346187119700, 1.993471421866692200, 1.993440424252018900, - 1.993409353344239600, - 1.993378209144496700, 1.993346991653935300, 1.993315700873703200, - 1.993284336804950900, - 1.993252899448831400, 1.993221388806500900, 1.993189804879117500, - 1.993158147667842800, - 1.993126417173840500, 1.993094613398277400, 1.993062736342323000, - 1.993030786007148800, - 1.992998762393930000, 1.992966665503844000, 1.992934495338070800, - 1.992902251897793000, - 1.992869935184196300, 1.992837545198469000, 1.992805081941801700, - 1.992772545415388200, - 1.992739935620424700, 1.992707252558110200, 1.992674496229646500, - 1.992641666636237700, - 1.992608763779091000, 1.992575787659416100, 1.992542738278425300, - 1.992509615637334100, - 1.992476419737359900, 1.992443150579723500, 1.992409808165648100, - 1.992376392496359300, - 1.992342903573086000, 1.992309341397059600, 1.992275705969513800, - 1.992241997291685400, - 1.992208215364813700, 1.992174360190140900, 1.992140431768911500, - 1.992106430102373400, - 1.992072355191776300, 1.992038207038373300, 1.992003985643419700, - 1.991969691008174100, - 1.991935323133897000, 1.991900882021852200, 1.991866367673306200, - 1.991831780089527500, - 1.991797119271788300, 1.991762385221362600, 1.991727577939527600, - 1.991692697427563300, - 1.991657743686751700, 1.991622716718378400, 1.991587616523731000, - 1.991552443104099800, - 1.991517196460778500, 1.991481876595062800, 1.991446483508251500, - 1.991411017201645500, - 1.991375477676549100, 1.991339864934268800, 1.991304178976114100, - 1.991268419803397200, - 1.991232587417432600, 1.991196681819537900, 1.991160703011033200, - 1.991124650993241400, - 1.991088525767488200, 1.991052327335101300, 1.991016055697411900, - 1.990979710855753900, - 1.990943292811463000, 1.990906801565878600, 1.990870237120342400, - 1.990833599476198800, - 1.990796888634794400, 1.990760104597479400, 1.990723247365606200, - 1.990686316940529800, - 1.990649313323608100, 1.990612236516201300, 1.990575086519673200, - 1.990537863335389400, - 1.990500566964718400, 1.990463197409031700, 1.990425754669703100, - 1.990388238748109100, - 1.990350649645629600, 1.990312987363646000, 1.990275251903543600, - 1.990237443266709400, - 1.990199561454533600, 1.990161606468409300, 1.990123578309731700, - 1.990085476979899000, - 1.990047302480312300, 1.990009054812374800, 1.989970733977493000, - 1.989932339977075900, - 1.989893872812535000, 1.989855332485284800, 1.989816718996742200, - 1.989778032348326700, - 1.989739272541461100, 1.989700439577570400, 1.989661533458082100, - 1.989622554184426800, - 1.989583501758037700, 1.989544376180350600, 1.989505177452804100, - 1.989465905576839600, - 1.989426560553900500, 1.989387142385433900, 1.989347651072888900, - 1.989308086617717500, - 1.989268449021374300, 1.989228738285316900, 1.989188954411005100, - 1.989149097399901500, - 1.989109167253472000, 1.989069163973184300, 1.989029087560509700, - 1.988988938016921000, - 1.988948715343894900, 1.988908419542910100, 1.988868050615448100, - 1.988827608562993200, - 1.988787093387032600, 1.988746505089055600, 1.988705843670554500, - 1.988665109133024500, - 1.988624301477963200, 1.988583420706871100, 1.988542466821251000, - 1.988501439822608900, - 1.988460339712453200, 1.988419166492295000, 1.988377920163648000, - 1.988336600728029000, - 1.988295208186956700, 1.988253742541953800, 1.988212203794544000, - 1.988170591946255100, - 1.988128906998616800, 1.988087148953161700, 1.988045317811425700, - 1.988003413574946000, - 1.987961436245263800, 1.987919385823922400, 1.987877262312467600, - 1.987835065712448600, - 1.987792796025416500, 1.987750453252925500, 1.987708037396532800, - 1.987665548457797400, - 1.987622986438281700, 1.987580351339550700, 1.987537643163171700, - 1.987494861910715100, - 1.987452007583754100, 1.987409080183863800, 1.987366079712622900, - 1.987323006171612500, - 1.987279859562415900, 1.987236639886619700, 1.987193347145813000, - 1.987149981341587400, - 1.987106542475537400, 1.987063030549260300, 1.987019445564355700, - 1.986975787522426100, - 1.986932056425076800, 1.986888252273915500, 1.986844375070552900, - 1.986800424816602200, - 1.986756401513679400, 1.986712305163403000, 1.986668135767394300, - 1.986623893327277500, - 1.986579577844678900, 1.986535189321228000, 1.986490727758556800, - 1.986446193158300400, - 1.986401585522095600, 1.986356904851583000, 1.986312151148405200, - 1.986267324414207500, - 1.986222424650638400, 1.986177451859348200, 1.986132406041990900, - 1.986087287200222700, - 1.986042095335702300, 1.985996830450091200, 1.985951492545054100, - 1.985906081622257300, - 1.985860597683371000, 1.985815040730067200, 1.985769410764020900, - 1.985723707786909900, - 1.985677931800414500, 1.985632082806217900, 1.985586160806005700, - 1.985540165801466200, - 1.985494097794290800, 1.985447956786173100, 1.985401742778809500, - 1.985355455773899500, - 1.985309095773144500, 1.985262662778249300, 1.985216156790921000, - 1.985169577812869500, - 1.985122925845807400, 1.985076200891450000, 1.985029402951515200, - 1.984982532027723700, - 1.984935588121798700, 1.984888571235466200, 1.984841481370454900, - 1.984794318528496200, - 1.984747082711324100, 1.984699773920675300, 1.984652392158289500, - 1.984604937425908300, - 1.984557409725276700, 1.984509809058142300, 1.984462135426255000, - 1.984414388831367900, - 1.984366569275236400, 1.984318676759618400, 1.984270711286275200, - 1.984222672856969800, - 1.984174561473469200, 1.984126377137541700, 1.984078119850959200, - 1.984029789615495900, - 1.983981386432928800, 1.983932910305037400, 1.983884361233604100, - 1.983835739220414000, - 1.983787044267254700, 1.983738276375916800, 1.983689435548192900, - 1.983640521785879200, - 1.983591535090773800, 1.983542475464678000, 1.983493342909395500, - 1.983444137426732600, - 1.983394859018498900, 1.983345507686505900, 1.983296083432567900, - 1.983246586258502700, - 1.983197016166129400, 1.983147373157271300, 1.983097657233753100, - 1.983047868397403100, - 1.982998006650051400, 1.982948071993531700, 1.982898064429679900, - 1.982847983960334600, - 1.982797830587336800, 1.982747604312531200, 1.982697305137763700, - 1.982646933064884200, - 1.982596488095744300, 1.982545970232199000, 1.982495379476105800, - 1.982444715829324600, - 1.982393979293718200, 1.982343169871152000, 1.982292287563494300, - 1.982241332372615600, - 1.982190304300389400, 1.982139203348692200, 1.982088029519402300, - 1.982036782814401900, - 1.981985463235574700, 1.981934070784807400, 1.981882605463990200, - 1.981831067275015000, - 1.981779456219776600, 1.981727772300172500, 1.981676015518103500, - 1.981624185875472000, - 1.981572283374183800, 1.981520308016147200, 1.981468259803273300, - 1.981416138737475800, - 1.981363944820670800, 1.981311678054777500, 1.981259338441717400, - 1.981206925983415300, - 1.981154440681797800, 1.981101882538794900, 1.981049251556338900, - 1.980996547736364900, - 1.980943771080810700, 1.980890921591616600, 1.980837999270726100, - 1.980785004120084700, - 1.980731936141640900, 1.980678795337345900, 1.980625581709153600, - 1.980572295259020600, - 1.980518935988905700, 1.980465503900771000, 1.980411998996581200, - 1.980358421278303200, - 1.980304770747907300, 1.980251047407365600, 1.980197251258653900, - 1.980143382303749500, - 1.980089440544633600, 1.980035425983289300, 1.979981338621702200, - 1.979927178461861500, - 1.979872945505758000, 1.979818639755386100, 1.979764261212742400, - 1.979709809879825800, - 1.979655285758638900, 1.979600688851186100, 1.979546019159474900, - 1.979491276685515300, - 1.979436461431320000, 1.979381573398904400, 1.979326612590286400, - 1.979271579007487100, - 1.979216472652529900, 1.979161293527440500, 1.979106041634248100, - 1.979050716974983800, - 1.978995319551682100, 1.978939849366379700, 1.978884306421115900, - 1.978828690717932900, - 1.978773002258875600, 1.978717241045991700, 1.978661407081331100, - 1.978605500366946700, - 1.978549520904894000, 1.978493468697231300, 1.978437343746019600, - 1.978381146053322000, - 1.978324875621205300, 1.978268532451738200, 1.978212116546992100, - 1.978155627909041300, - 1.978099066539962900, 1.978042432441836400, 1.977985725616743900, - 1.977928946066770600, - 1.977872093794004200, 1.977815168800534500, 1.977758171088455100, - 1.977701100659861300, - 1.977643957516851400, 1.977586741661526500, 1.977529453095990200, - 1.977472091822348700, - 1.977414657842711200, 1.977357151159189400, 1.977299571773897700, - 1.977241919688953000, - 1.977184194906475000, 1.977126397428586000, 1.977068527257411300, - 1.977010584395078300, - 1.976952568843717700, 1.976894480605462500, 1.976836319682448300, - 1.976778086076813600, - 1.976719779790699500, 1.976661400826249500, 1.976602949185610500, - 1.976544424870931400, - 1.976485827884363800, 1.976427158228062100, 1.976368415904183900, - 1.976309600914888400, - 1.976250713262338600, 1.976191752948699200, 1.976132719976138000, - 1.976073614346825800, - 1.976014436062935700, 1.975955185126643300, 1.975895861540127200, - 1.975836465305568400, - 1.975776996425151000, 1.975717454901061400, 1.975657840735488800, - 1.975598153930624900, - 1.975538394488664200, 1.975478562411804100, 1.975418657702244300, - 1.975358680362187400, - 1.975298630393838500, 1.975238507799405500, 1.975178312581099100, - 1.975118044741132300, - 1.975057704281721000, 1.974997291205083700, 1.974936805513442000, - 1.974876247209019100, - 1.974815616294042200, 1.974754912770740200, 1.974694136641345300, - 1.974633287908091500, - 1.974572366573216400, 1.974511372638960000, 1.974450306107564900, - 1.974389166981275900, - 1.974327955262341400, 1.974266670953011400, 1.974205314055540000, - 1.974143884572182400, - 1.974082382505197400, 1.974020807856846400, 1.973959160629393100, - 1.973897440825104200, - 1.973835648446248900, 1.973773783495099500, 1.973711845973930000, - 1.973649835885018100, - 1.973587753230643400, 1.973525598013088800, 1.973463370234639600, - 1.973401069897583200, - 1.973338697004211100, 1.973276251556815600, 1.973213733557693400, - 1.973151143009142800, - 1.973088479913465100, 1.973025744272964200, 1.972962936089946800, - 1.972900055366722000, - 1.972837102105601900, 1.972774076308901200, 1.972710977978936900, - 1.972647807118029300, - 1.972584563728500700, 1.972521247812676600, 1.972457859372884500, - 1.972394398411455800, - 1.972330864930723200, 1.972267258933022600, 1.972203580420693000, - 1.972139829396075200, - 1.972076005861513700, 1.972012109819354600, 1.971948141271947500, - 1.971884100221644300, - 1.971819986670799500, 1.971755800621770400, 1.971691542076916800, - 1.971627211038601500, - 1.971562807509189800, 1.971498331491049700, 1.971433782986551400, - 1.971369161998068400, - 1.971304468527976800, 1.971239702578655000, 1.971174864152484400, - 1.971109953251848600, - 1.971044969879134600, 1.970979914036731500, 1.970914785727030800, - 1.970849584952427900, - 1.970784311715319400, 1.970718966018105500, 1.970653547863188600, - 1.970588057252973900, - 1.970522494189869800, 1.970456858676286300, 1.970391150714636800, - 1.970325370307337100, - 1.970259517456806100, 1.970193592165464700, 1.970127594435737000, - 1.970061524270049400, - 1.969995381670831100, 1.969929166640514100, 1.969862879181532700, - 1.969796519296324300, - 1.969730086987328900, 1.969663582256988600, 1.969597005107748900, - 1.969530355542057800, - 1.969463633562365400, 1.969396839171125200, 1.969329972370792700, - 1.969263033163826800, - 1.969196021552688500, 1.969128937539841500, 1.969061781127752400, - 1.968994552318890300, - 1.968927251115727200, 1.968859877520737300, 1.968792431536398000, - 1.968724913165188900, - 1.968657322409592500, 1.968589659272094000, 1.968521923755181000, - 1.968454115861344000, - 1.968386235593076300, 1.968318282952873600, 1.968250257943234200, - 1.968182160566659000, - 1.968113990825652200, 1.968045748722719900, 1.967977434260371300, - 1.967909047441118100, - 1.967840588267474500, 1.967772056741957900, 1.967703452867087800, - 1.967634776645386600, - 1.967566028079379200, 1.967497207171593500, 1.967428313924559600, - 1.967359348340810700, - 1.967290310422882700, 1.967221200173313400, 1.967152017594644200, - 1.967082762689418500, - 1.967013435460182700, 1.966944035909485600, 1.966874564039879300, - 1.966805019853917500, - 1.966735403354157500, 1.966665714543159000, 1.966595953423483800, - 1.966526119997697100, - 1.966456214268366600, 1.966386236238062200, 1.966316185909357200, - 1.966246063284826700, - 1.966175868367049400, 1.966105601158605600, 1.966035261662079300, - 1.965964849880056600, - 1.965894365815126000, 1.965823809469879400, 1.965753180846910900, - 1.965682479948817100, - 1.965611706778197700, 1.965540861337654600, 1.965469943629792700, - 1.965398953657219600, - 1.965327891422544900, 1.965256756928382100, 1.965185550177345900, - 1.965114271172054800, - 1.965042919915129400, 1.964971496409193100, 1.964900000656872000, - 1.964828432660794500, - 1.964756792423592200, 1.964685079947899200, 1.964613295236352000, - 1.964541438291590000, - 1.964469509116255000, 1.964397507712991800, 1.964325434084447600, - 1.964253288233272400, - 1.964181070162119000, 1.964108779873642100, 1.964036417370500300, - 1.963963982655353400, - 1.963891475730865400, 1.963818896599701400, 1.963746245264530700, - 1.963673521728023900, - 1.963600725992855200, 1.963527858061700600, 1.963454917937239800, - 1.963381905622154400, - 1.963308821119128700, 1.963235664430850200, 1.963162435560008100, - 1.963089134509295300, - 1.963015761281406800, 1.962942315879040000, 1.962868798304895400, - 1.962795208561676200, - 1.962721546652088200, 1.962647812578839400, 1.962574006344640900, - 1.962500127952206300, - 1.962426177404252200, 1.962352154703497200, 1.962278059852663000, - 1.962203892854473800, - 1.962129653711656800, 1.962055342426941400, 1.961980959003059500, - 1.961906503442746300, - 1.961831975748739200, 1.961757375923778700, 1.961682703970607100, - 1.961607959891970200, - 1.961533143690616000, 1.961458255369295400, 1.961383294930761700, - 1.961308262377770900, - 1.961233157713082200, 1.961157980939456400, 1.961082732059657800, - 1.961007411076453000, - 1.960932017992611500, 1.960856552810905200, 1.960781015534108800, - 1.960705406164999300, - 1.960629724706357100, 1.960553971160964500, 1.960478145531606700, - 1.960402247821071900, - 1.960326278032150200, 1.960250236167635100, 1.960174122230322400, - 1.960097936223010400, - 1.960021678148500500, 1.959945348009596500, 1.959868945809104500, - 1.959792471549834000, - 1.959715925234596600, 1.959639306866206600, 1.959562616447480900, - 1.959485853981239600, - 1.959409019470304700, 1.959332112917501400, 1.959255134325657000, - 1.959178083697602300, - 1.959100961036169800, 1.959023766344195200, 1.958946499624516700, - 1.958869160879975500, - 1.958791750113414700, 1.958714267327680500, 1.958636712525621900, - 1.958559085710090500, - 1.958481386883940100, 1.958403616050027600, 1.958325773211212300, - 1.958247858370356400, - 1.958169871530324600, 1.958091812693984400, 1.958013681864205500, - 1.957935479043860600, - 1.957857204235825100, 1.957778857442976900, 1.957700438668196700, - 1.957621947914367500, - 1.957543385184375300, 1.957464750481108700, 1.957386043807458800, - 1.957307265166319500, - 1.957228414560587200, 1.957149491993160900, 1.957070497466942400, - 1.956991430984836400, - 1.956912292549749500, 1.956833082164591600, 1.956753799832275300, - 1.956674445555715000, - 1.956595019337829000, 1.956515521181537000, 1.956435951089762200, - 1.956356309065430100, - 1.956276595111468900, 1.956196809230809500, 1.956116951426385600, - 1.956037021701132900, - 1.955957020057990500, 1.955876946499899700, 1.955796801029804800, - 1.955716583650652000, - 1.955636294365391300, 1.955555933176974300, 1.955475500088355900, - 1.955394995102493100, - 1.955314418222346100, 1.955233769450877200, 1.955153048791052000, - 1.955072256245838000, - 1.954991391818206000, 1.954910455511129000, 1.954829447327582900, - 1.954748367270545900, - 1.954667215342999600, 1.954585991547927100, 1.954504695888315000, - 1.954423328367152600, - 1.954341888987431100, 1.954260377752145000, 1.954178794664291200, - 1.954097139726869600, - 1.954015412942881900, 1.953933614315333200, 1.953851743847231100, - 1.953769801541585400, - 1.953687787401409400, 1.953605701429718100, 1.953523543629529700, - 1.953441314003864900, - 1.953359012555747200, 1.953276639288202400, 1.953194194204259200, - 1.953111677306948800, - 1.953029088599305100, 1.952946428084364900, 1.952863695765167100, - 1.952780891644753500, - 1.952698015726169100, 1.952615068012460300, 1.952532048506677300, - 1.952448957211872200, - 1.952365794131100300, 1.952282559267419100, 1.952199252623889200, - 1.952115874203572900, - 1.952032424009536600, 1.951948902044847900, 1.951865308312577900, - 1.951781642815800100, - 1.951697905557590700, 1.951614096541028500, 1.951530215769194700, - 1.951446263245173500, - 1.951362238972051500, 1.951278142952918200, 1.951193975190865600, - 1.951109735688987900, - 1.951025424450382900, 1.950941041478150100, 1.950856586775392200, - 1.950772060345214300, - 1.950687462190724200, 1.950602792315032200, 1.950518050721251600, - 1.950433237412498000, - 1.950348352391889600, 1.950263395662547700, 1.950178367227595900, - 1.950093267090159800, - 1.950008095253369200, 1.949922851720355100, 1.949837536494251700, - 1.949752149578196000, - 1.949666690975327100, 1.949581160688787400, 1.949495558721721500, - 1.949409885077276500, - 1.949324139758602700, 1.949238322768852800, 1.949152434111181700, - 1.949066473788747300, - 1.948980441804710300, 1.948894338162233900, 1.948808162864483600, - 1.948721915914628100, - 1.948635597315838200, 1.948549207071288000, 1.948462745184153400, - 1.948376211657613500, - 1.948289606494849800, 1.948202929699046800, 1.948116181273391100, - 1.948029361221072400, - 1.947942469545282500, 1.947855506249216700, 1.947768471336071700, - 1.947681364809048100, - 1.947594186671348000, 1.947506936926177300, 1.947419615576743600, - 1.947332222626257500, - 1.947244758077932200, 1.947157221934983500, 1.947069614200629900, - 1.946981934878092300, - 1.946894183970594900, 1.946806361481363500, 1.946718467413627300, - 1.946630501770618000, - 1.946542464555569800, 1.946454355771719300, 1.946366175422306500, - 1.946277923510573200, - 1.946189600039764300, 1.946101205013127000, 1.946012738433911600, - 1.945924200305370700, - 1.945835590630759400, 1.945746909413335900, 1.945658156656360700, - 1.945569332363096700, - 1.945480436536810100, 1.945391469180769200, 1.945302430298244900, - 1.945213319892511200, - 1.945124137966844200, 1.945034884524523100, 1.944945559568829200, - 1.944856163103046800, - 1.944766695130463000, 1.944677155654366900, 1.944587544678050900, - 1.944497862204809900, - 1.944408108237940700, 1.944318282780743900, 1.944228385836521700, - 1.944138417408579400, - 1.944048377500225100, 1.943958266114769200, 1.943868083255524800, - 1.943777828925807600, - 1.943687503128936200, 1.943597105868231500, 1.943506637147017300, - 1.943416096968619400, - 1.943325485336367300, 1.943234802253592400, 1.943144047723628400, - 1.943053221749812400, - 1.942962324335484100, 1.942871355483985200, 1.942780315198660200, - 1.942689203482856900, - 1.942598020339924700, 1.942506765773216500, 1.942415439786087300, - 1.942324042381895000, - 1.942232573564000000, 1.942141033335765400, 1.942049421700556600, - 1.941957738661741900, - 1.941865984222692900, 1.941774158386782200, 1.941682261157386700, - 1.941590292537884700, - 1.941498252531658200, 1.941406141142090600, 1.941313958372568900, - 1.941221704226482500, - 1.941129378707223000, 1.941036981818185400, 1.940944513562766300, - 1.940851973944365900, - 1.940759362966386600, 1.940666680632233200, 1.940573926945313700, - 1.940481101909038200, - 1.940388205526819600, 1.940295237802073500, 1.940202198738217900, - 1.940109088338673600, - 1.940015906606864300, 1.939922653546215500, 1.939829329160156500, - 1.939735933452118000, - 1.939642466425534300, 1.939548928083841800, 1.939455318430479500, - 1.939361637468889100, - 1.939267885202515400, 1.939174061634805000, 1.939080166769207700, - 1.938986200609175600, - 1.938892163158163700, 1.938798054419629500, 1.938703874397032800, - 1.938609623093837000, - 1.938515300513506700, 1.938420906659510600, 1.938326441535318500, - 1.938231905144404400, - 1.938137297490243500, 1.938042618576314400, 1.937947868406098500, - 1.937853046983079300, - 1.937758154310742900, 1.937663190392578500, 1.937568155232077600, - 1.937473048832734500, - 1.937377871198045600, 1.937282622331510500, 1.937187302236631500, - 1.937091910916912900, - 1.936996448375861900, 1.936900914616988900, 1.936805309643805800, - 1.936709633459828200, - 1.936613886068573500, 1.936518067473562300, 1.936422177678317300, - 1.936326216686364400, - 1.936230184501231500, 1.936134081126449800, 1.936037906565552400, - 1.935941660822075600, - 1.935845343899558000, 1.935748955801540800, 1.935652496531568000, - 1.935555966093186300, - 1.935459364489944500, 1.935362691725394500, 1.935265947803090900, - 1.935169132726590500, - 1.935072246499453000, 1.934975289125240500, 1.934878260607517900, - 1.934781160949852600, - 1.934683990155814800, 1.934586748228977100, 1.934489435172914900, - 1.934392050991206300, - 1.934294595687431300, 1.934197069265173500, 1.934099471728018700, - 1.934001803079554700, - 1.933904063323373300, 1.933806252463067500, 1.933708370502233800, - 1.933610417444471000, - 1.933512393293380600, 1.933414298052566600, 1.933316131725635800, - 1.933217894316197300, - 1.933119585827862900, 1.933021206264247600, 1.932922755628968100, - 1.932824233925644300, - 1.932725641157898600, 1.932626977329356100, 1.932528242443643900, - 1.932429436504392800, - 1.932330559515235100, 1.932231611479806800, 1.932132592401745400, - 1.932033502284691700, - 1.931934341132289100, 1.931835108948183300, 1.931735805736022800, - 1.931636431499459000, - 1.931536986242145200, 1.931437469967737900, 1.931337882679895900, - 1.931238224382281000, - 1.931138495078557300, 1.931038694772391200, 1.930938823467452500, - 1.930838881167413100, - 1.930738867875947400, 1.930638783596732700, 1.930538628333448900, - 1.930438402089778200, - 1.930338104869405900, 1.930237736676019500, 1.930137297513309300, - 1.930036787384968200, - 1.929936206294691400, 1.929835554246177400, 1.929734831243126600, - 1.929634037289242400, - 1.929533172388230700, 1.929432236543799900, 1.929331229759661200, - 1.929230152039528500, - 1.929129003387117800, 1.929027783806148300, 1.928926493300341400, - 1.928825131873421500, - 1.928723699529115000, 1.928622196271151800, 1.928520622103263400, - 1.928418977029184600, - 1.928317261052652700, 1.928215474177407100, 1.928113616407190600, - 1.928011687745748300, - 1.927909688196827400, 1.927807617764178300, 1.927705476451554000, - 1.927603264262709900, - 1.927500981201404100, 1.927398627271397000, 1.927296202476451900, - 1.927193706820335100, - 1.927091140306814500, 1.926988502939661400, 1.926885794722649600, - 1.926783015659555300, - 1.926680165754157500, 1.926577245010237400, 1.926474253431579500, - 1.926371191021970100, - 1.926268057785198700, 1.926164853725057300, 1.926061578845340600, - 1.925958233149845000, - 1.925854816642371000, 1.925751329326720600, 1.925647771206698600, - 1.925544142286112800, - 1.925440442568773000, 1.925336672058492300, 1.925232830759086000, - 1.925128918674371900, - 1.925024935808170600, 1.924920882164305300, 1.924816757746601800, - 1.924712562558888100, - 1.924608296604995800, 1.924503959888757900, 1.924399552414010700, - 1.924295074184593000, - 1.924190525204346300, 1.924085905477114400, 1.923981215006744100, - 1.923876453797084300, - 1.923771621851986700, 1.923666719175306100, 1.923561745770898900, - 1.923456701642625200, - 1.923351586794346900, 1.923246401229928600, 1.923141144953238300, - 1.923035817968145300, - 1.922930420278522500, 1.922824951888245000, 1.922719412801190600, - 1.922613803021239600, - 1.922508122552275100, 1.922402371398182600, 1.922296549562850100, - 1.922190657050168800, - 1.922084693864031700, 1.921978660008334600, 1.921872555486976700, - 1.921766380303858500, - 1.921660134462884100, 1.921553817967959900, 1.921447430822994500, - 1.921340973031900000, - 1.921234444598590100, 1.921127845526981600, 1.921021175820994100, - 1.920914435484549100, - 1.920807624521571700, 1.920700742935988600, 1.920593790731729600, - 1.920486767912727300, - 1.920379674482916500, 1.920272510446234400, 1.920165275806621400, - 1.920057970568020100, - 1.919950594734376000, 1.919843148309637000, 1.919735631297753400, - 1.919628043702678300, - 1.919520385528367300, 1.919412656778779000, 1.919304857457874200, - 1.919196987569616200, - 1.919089047117971100, 1.918981036106907700, 1.918872954540397300, - 1.918764802422413500, - 1.918656579756932800, 1.918548286547934400, 1.918439922799399800, - 1.918331488515313300, - 1.918222983699661600, 1.918114408356434300, 1.918005762489623400, - 1.917897046103223200, - 1.917788259201231200, 1.917679401787647100, 1.917570473866473200, - 1.917461475441714500, - 1.917352406517378600, 1.917243267097475700, 1.917134057186018300, - 1.917024776787022100, - 1.916915425904504700, 1.916806004542486800, 1.916696512704991500, - 1.916586950396044400, - 1.916477317619674100, 1.916367614379911100, 1.916257840680788900, - 1.916147996526343700, - 1.916038081920614400, 1.915928096867641800, 1.915818041371470000, - 1.915707915436145200, - 1.915597719065716700, 1.915487452264236000, 1.915377115035757200, - 1.915266707384337200, - 1.915156229314035200, 1.915045680828913400, 1.914935061933036300, - 1.914824372630470800, - 1.914713612925287100, 1.914602782821557000, 1.914491882323355700, - 1.914380911434760500, - 1.914269870159851700, 1.914158758502712000, 1.914047576467426500, - 1.913936324058083100, - 1.913825001278772100, 1.913713608133586600, 1.913602144626622500, - 1.913490610761977600, - 1.913379006543752800, 1.913267331976051400, 1.913155587062979500, - 1.913043771808645700, - 1.912931886217160900, 1.912819930292639000, 1.912707904039196300, - 1.912595807460951500, - 1.912483640562026200, 1.912371403346544400, 1.912259095818632700, - 1.912146717982420500, - 1.912034269842039600, 1.911921751401624200, 1.911809162665311500, - 1.911696503637241100, - 1.911583774321554700, 1.911470974722397500, 1.911358104843916500, - 1.911245164690262000, - 1.911132154265586100, 1.911019073574044200, 1.910905922619793800, - 1.910792701406995000, - 1.910679409939810600, 1.910566048222406300, 1.910452616258949900, - 1.910339114053611900, - 1.910225541610565800, 1.910111898933986900, 1.909998186028053700, - 1.909884402896947100, - 1.909770549544850500, 1.909656625975950200, 1.909542632194434700, - 1.909428568204495100, - 1.909314434010325400, 1.909200229616121700, 1.909085955026083200, - 1.908971610244411600, - 1.908857195275310800, 1.908742710122987700, 1.908628154791651300, - 1.908513529285513500, - 1.908398833608789100, 1.908284067765694900, 1.908169231760450400, - 1.908054325597278200, - 1.907939349280402400, 1.907824302814050900, 1.907709186202453600, - 1.907593999449842800, - 1.907478742560453600, 1.907363415538523700, 1.907248018388293400, - 1.907132551114005600, - 1.907017013719905600, 1.906901406210241200, 1.906785728589263300, - 1.906669980861224900, - 1.906554163030381500, 1.906438275100991600, 1.906322317077316300, - 1.906206288963618700, - 1.906090190764164700, 1.905974022483223300, 1.905857784125065500, - 1.905741475693964800, - 1.905625097194197900, 1.905508648630043700, 1.905392130005783400, - 1.905275541325701400, - 1.905158882594083900, 1.905042153815220700, 1.904925354993402900, - 1.904808486132925300, - 1.904691547238084800, 1.904574538313180700, 1.904457459362515200, - 1.904340310390393100, - 1.904223091401121600, 1.904105802399010300, 1.903988443388371600, - 1.903871014373520700, - 1.903753515358774800, 1.903635946348454500, 1.903518307346881800, - 1.903400598358382600, - 1.903282819387284200, 1.903164970437917400, 1.903047051514615000, - 1.902929062621712600, - 1.902811003763547900, 1.902692874944462300, 1.902574676168798700, - 1.902456407440902700, - 1.902338068765123200, 1.902219660145810800, 1.902101181587319000, - 1.901982633094004200, - 1.901864014670225000, 1.901745326320342500, 1.901626568048721000, - 1.901507739859726200, - 1.901388841757727600, 1.901269873747096600, 1.901150835832207100, - 1.901031728017436300, - 1.900912550307162700, 1.900793302705768900, 1.900673985217638900, - 1.900554597847159400, - 1.900435140598720500, 1.900315613476714100, 1.900196016485534700, - 1.900076349629579600, - 1.899956612913248800, 1.899836806340944300, 1.899716929917071500, - 1.899596983646037600, - 1.899476967532252900, 1.899356881580129800, 1.899236725794083600, - 1.899116500178532200, - 1.898996204737895900, 1.898875839476597700, 1.898755404399062900, - 1.898634899509719500, - 1.898514324812998300, 1.898393680313332600, 1.898272966015157800, - 1.898152181922912600, - 1.898031328041037700, 1.897910404373976500, 1.897789410926175000, - 1.897668347702081900, - 1.897547214706148300, 1.897426011942827900, 1.897304739416577200, - 1.897183397131854600, - 1.897061985093121800, 1.896940503304842800, 1.896818951771484000, - 1.896697330497514800, - 1.896575639487406300, 1.896453878745633100, 1.896332048276672100, - 1.896210148085002400, - 1.896088178175106200, 1.895966138551467700, 1.895844029218574100, - 1.895721850180915000, - 1.895599601442982600, 1.895477283009271400, 1.895354894884279100, - 1.895232437072505300, - 1.895109909578452500, 1.894987312406625700, 1.894864645561532100, - 1.894741909047682500, - 1.894619102869589100, 1.894496227031767100, 1.894373281538734400, - 1.894250266395011600, - 1.894127181605121100, 1.894004027173588700, 1.893880803104942600, - 1.893757509403713100, - 1.893634146074433500, 1.893510713121639300, 1.893387210549869000, - 1.893263638363663400, - 1.893139996567565900, 1.893016285166122500, 1.892892504163881600, - 1.892768653565394300, - 1.892644733375214300, 1.892520743597897700, 1.892396684238003300, - 1.892272555300092300, - 1.892148356788728700, 1.892024088708479200, 1.891899751063912200, - 1.891775343859599400, - 1.891650867100115300, 1.891526320790036100, 1.891401704933941100, - 1.891277019536412400, - 1.891152264602033800, 1.891027440135392600, 1.890902546141078000, - 1.890777582623682300, - 1.890652549587799700, 1.890527447038027300, 1.890402274978965100, - 1.890277033415215200, - 1.890151722351382200, 1.890026341792073500, 1.889900891741899100, - 1.889775372205471300, - 1.889649783187405100, 1.889524124692318200, 1.889398396724830500, - 1.889272599289564900, - 1.889146732391146400, 1.889020796034202700, 1.888894790223364600, - 1.888768714963264400, - 1.888642570258537700, 1.888516356113822700, 1.888390072533759700, - 1.888263719522991900, - 1.888137297086165000, 1.888010805227927000, 1.887884243952928600, - 1.887757613265823400, - 1.887630913171267000, 1.887504143673917700, 1.887377304778437000, - 1.887250396489487800, - 1.887123418811736500, 1.886996371749851700, 1.886869255308504200, - 1.886742069492368000, - 1.886614814306119400, 1.886487489754437300, 1.886360095842002600, - 1.886232632573499700, - 1.886105099953614900, 1.885977497987037000, 1.885849826678457800, - 1.885722086032571200, - 1.885594276054074300, 1.885466396747665700, 1.885338448118047700, - 1.885210430169924200, - 1.885082342908002400, 1.884954186336991400, 1.884825960461603100, - 1.884697665286552400, - 1.884569300816556000, 1.884440867056333700, 1.884312364010607600, - 1.884183791684102400, - 1.884055150081545200, 1.883926439207665800, 1.883797659067196800, - 1.883668809664872600, - 1.883539891005431100, 1.883410903093611900, 1.883281845934157800, - 1.883152719531813800, - 1.883023523891327300, 1.882894259017448900, 1.882764924914930700, - 1.882635521588528400, - 1.882506049042999700, 1.882376507283104900, 1.882246896313606800, - 1.882117216139270700, - 1.881987466764865100, 1.881857648195159900, 1.881727760434928500, - 1.881597803488946500, - 1.881467777361992100, 1.881337682058845700, 1.881207517584290600, - 1.881077283943112900, - 1.880946981140100500, 1.880816609180044700, 1.880686168067738500, - 1.880555657807977800, - 1.880425078405561600, 1.880294429865290600, 1.880163712191968300, - 1.880032925390400900, - 1.879902069465397200, 1.879771144421768200, 1.879640150264327600, - 1.879509086997891900, - 1.879377954627279700, 1.879246753157312700, 1.879115482592814500, - 1.878984142938611600, - 1.878852734199532900, 1.878721256380410100, 1.878589709486077300, - 1.878458093521370800, - 1.878326408491130200, 1.878194654400196600, 1.878062831253414900, - 1.877930939055631100, - 1.877798977811695200, 1.877666947526458700, 1.877534848204775800, - 1.877402679851504000, - 1.877270442471502100, 1.877138136069632400, 1.877005760650759500, - 1.876873316219750200, - 1.876740802781474500, 1.876608220340804100, 1.876475568902614000, - 1.876342848471781200, - 1.876210059053185600, 1.876077200651709500, 1.875944273272237800, - 1.875811276919657500, - 1.875678211598858800, 1.875545077314734000, 1.875411874072178100, - 1.875278601876088700, - 1.875145260731365700, 1.875011850642911600, 1.874878371615631900, - 1.874744823654434000, - 1.874611206764227800, 1.874477520949926500, 1.874343766216444800, - 1.874209942568701100, - 1.874076050011615400, 1.873942088550110400, 1.873808058189111700, - 1.873673958933546900, - 1.873539790788347100, 1.873405553758444600, 1.873271247848775400, - 1.873136873064277000, - 1.873002429409890600, 1.872867916890558900, 1.872733335511227700, - 1.872598685276845000, - 1.872463966192361900, 1.872329178262731200, 1.872194321492908700, - 1.872059395887852900, - 1.871924401452524700, 1.871789338191887100, 1.871654206110906500, - 1.871519005214550700, - 1.871383735507791100, 1.871248396995601300, 1.871112989682956800, - 1.870977513574836500, - 1.870841968676221400, 1.870706354992095000, 1.870570672527443600, - 1.870434921287255700, - 1.870299101276522400, 1.870163212500237900, 1.870027254963397800, - 1.869891228671001200, - 1.869755133628049600, 1.869618969839546500, 1.869482737310498100, - 1.869346436045913800, - 1.869210066050804600, 1.869073627330184700, 1.868937119889070300, - 1.868800543732480600, - 1.868663898865437200, 1.868527185292963700, 1.868390403020087100, - 1.868253552051836200, - 1.868116632393243000, 1.867979644049341200, 1.867842587025167800, - 1.867705461325761800, - 1.867568266956164800, 1.867431003921421500, 1.867293672226578300, - 1.867156271876684500, - 1.867018802876792200, 1.866881265231955500, 1.866743658947231300, - 1.866605984027679000, - 1.866468240478360600, 1.866330428304340300, 1.866192547510685300, - 1.866054598102465000, - 1.865916580084751500, 1.865778493462619100, 1.865640338241145100, - 1.865502114425408900, - 1.865363822020492700, 1.865225461031480900, 1.865087031463460900, - 1.864948533321522300, - 1.864809966610757400, 1.864671331336260600, 1.864532627503129100, - 1.864393855116463200, - 1.864255014181364500, 1.864116104702938000, 1.863977126686291200, - 1.863838080136534000, - 1.863698965058778300, 1.863559781458139300, 1.863420529339734100, - 1.863281208708683000, - 1.863141819570107900, 1.863002361929134500, 1.862862835790889400, - 1.862723241160503300, - 1.862583578043108100, 1.862443846443839300, 1.862304046367834200, - 1.862164177820232700, - 1.862024240806177800, 1.861884235330814300, 1.861744161399289600, - 1.861604019016754200, - 1.861463808188360500, 1.861323528919263800, 1.861183181214621600, - 1.861042765079594200, - 1.860902280519344500, 1.860761727539037300, 1.860621106143840500, - 1.860480416338924600, - 1.860339658129461800, 1.860198831520627900, 1.860057936517600700, - 1.859916973125560000, - 1.859775941349689000, 1.859634841195173100, 1.859493672667199800, - 1.859352435770959900, - 1.859211130511645900, 1.859069756894453400, 1.858928314924580300, - 1.858786804607227100, - 1.858645225947596300, 1.858503578950893900, 1.858361863622327400, - 1.858220079967107600, - 1.858078227990447300, 1.857936307697561900, 1.857794319093669900, - 1.857652262183991000, - 1.857510136973749000, 1.857367943468169100, 1.857225681672479300, - 1.857083351591910300, - 1.856940953231694900, 1.856798486597069000, 1.856655951693270600, - 1.856513348525540300, - 1.856370677099121100, 1.856227937419258700, 1.856085129491201100, - 1.855942253320199200, - 1.855799308911506100, 1.855656296270377300, 1.855513215402071000, - 1.855370066311848000, - 1.855226849004971500, 1.855083563486706900, 1.854940209762322700, - 1.854796787837089500, - 1.854653297716280400, 1.854509739405171300, 1.854366112909040300, - 1.854222418233168400, - 1.854078655382838300, 1.853934824363336200, 1.853790925179950500, - 1.853646957837971500, - 1.853502922342692600, 1.853358818699409900, 1.853214646913421200, - 1.853070406990027500, - 1.852926098934532200, 1.852781722752241000, 1.852637278448462200, - 1.852492766028506400, - 1.852348185497687300, 1.852203536861320600, 1.852058820124724300, - 1.851914035293219700, - 1.851769182372129600, 1.851624261366780400, 1.851479272282500000, - 1.851334215124619300, - 1.851189089898471800, 1.851043896609393400, 1.850898635262721900, - 1.850753305863798800, - 1.850607908417967200, 1.850462442930572900, 1.850316909406964200, - 1.850171307852492200, - 1.850025638272510000, 1.849879900672373600, 1.849734095057441200, - 1.849588221433073700, - 1.849442279804634600, 1.849296270177489800, 1.849150192557007300, - 1.849004046948558200, - 1.848857833357515900, 1.848711551789256300, 1.848565202249157400, - 1.848418784742600400, - 1.848272299274968500, 1.848125745851647800, 1.847979124478026100, - 1.847832435159495000, - 1.847685677901447200, 1.847538852709279100, 1.847391959588388300, - 1.847244998544176300, - 1.847097969582046200, 1.846950872707404000, 1.846803707925657600, - 1.846656475242218300, - 1.846509174662499300, 1.846361806191916000, 1.846214369835887500, - 1.846066865599834000, - 1.845919293489179000, 1.845771653509348200, 1.845623945665770100, - 1.845476169963875500, - 1.845328326409097400, 1.845180415006871800, 1.845032435762637100, - 1.844884388681833800, - 1.844736273769905300, 1.844588091032297400, 1.844439840474458200, - 1.844291522101838800, - 1.844143135919891900, 1.843994681934073600, 1.843846160149842200, - 1.843697570572658200, - 1.843548913207985000, 1.843400188061288000, 1.843251395138035800, - 1.843102534443698900, - 1.842953605983750400, 1.842804609763666100, 1.842655545788924000, - 1.842506414065004900, - 1.842357214597392100, 1.842207947391570900, 1.842058612453029600, - 1.841909209787258900, - 1.841759739399751800, 1.841610201296003800, 1.841460595481513100, - 1.841310921961780500, - 1.841161180742308500, 1.841011371828603200, 1.840861495226172600, - 1.840711550940526700, - 1.840561538977179200, 1.840411459341645400, 1.840261312039443100, - 1.840111097076092800, - 1.839960814457117600, 1.839810464188043100, 1.839660046274397100, - 1.839509560721709800, - 1.839359007535514400, 1.839208386721346500, 1.839057698284743500, - 1.838906942231246100, - 1.838756118566397200, 1.838605227295741800, 1.838454268424828400, - 1.838303241959206700, - 1.838152147904429800, 1.838000986266052900, 1.837849757049633900, - 1.837698460260732900, - 1.837547095904912700, 1.837395663987738700, 1.837244164514778600, - 1.837092597491602100, - 1.836940962923782700, 1.836789260816895000, 1.836637491176516600, - 1.836485654008228200, - 1.836333749317611700, 1.836181777110252900, 1.836029737391738700, - 1.835877630167659800, - 1.835725455443608200, 1.835573213225179400, 1.835420903517970500, - 1.835268526327581900, - 1.835116081659615700, 1.834963569519677100, 1.834810989913373500, - 1.834658342846314800, - 1.834505628324113200, 1.834352846352383700, 1.834199996936744000, - 1.834047080082813300, - 1.833894095796214400, 1.833741044082571900, 1.833587924947513100, - 1.833434738396668000, - 1.833281484435668400, 1.833128163070149300, 1.832974774305747600, - 1.832821318148103500, - 1.832667794602858400, 1.832514203675657600, 1.832360545372147900, - 1.832206819697979000, - 1.832053026658802700, 1.831899166260273700, 1.831745238508049300, - 1.831591243407788300, - 1.831437180965153100, 1.831283051185808300, 1.831128854075420500, - 1.830974589639659000, - 1.830820257884196100, 1.830665858814705600, 1.830511392436864800, - 1.830356858756352800, - 1.830202257778851300, 1.830047589510044500, 1.829892853955619200, - 1.829738051121264600, - 1.829583181012672400, 1.829428243635536500, 1.829273238995553700, - 1.829118167098423100, - 1.828963027949846100, 1.828807821555527000, 1.828652547921171900, - 1.828497207052490100, - 1.828341798955192900, 1.828186323634994200, 1.828030781097610400, - 1.827875171348760400, - 1.827719494394165500, 1.827563750239549400, 1.827407938890638600, - 1.827252060353161500, - 1.827096114632849700, 1.826940101735436500, 1.826784021666658400, - 1.826627874432253700, - 1.826471660037963800, 1.826315378489531800, 1.826159029792704400, - 1.826002613953229500, - 1.825846130976858100, 1.825689580869344100, 1.825532963636443000, - 1.825376279283913200, - 1.825219527817515800, 1.825062709243013800, 1.824905823566173000, - 1.824748870792761900, - 1.824591850928550800, 1.824434763979313300, 1.824277609950824700, - 1.824120388848863300, - 1.823963100679209600, 1.823805745447646600, 1.823648323159960100, - 1.823490833821937600, - 1.823333277439369600, 1.823175654018049300, 1.823017963563772000, - 1.822860206082335300, - 1.822702381579539800, 1.822544490061187800, 1.822386531533084900, - 1.822228506001038800, - 1.822070413470859600, 1.821912253948359700, 1.821754027439354400, - 1.821595733949661100, - 1.821437373485099900, 1.821278946051493100, 1.821120451654665700, - 1.820961890300445400, - 1.820803261994661500, 1.820644566743146800, 1.820485804551735800, - 1.820326975426265600, - 1.820168079372576300, 1.820009116396509800, 1.819850086503910700, - 1.819690989700625900, - 1.819531825992505500, 1.819372595385401000, 1.819213297885166900, - 1.819053933497660300, - 1.818894502228740600, 1.818735004084269600, 1.818575439070111200, - 1.818415807192132600, - 1.818256108456203000, 1.818096342868193800, 1.817936510433979300, - 1.817776611159436000, - 1.817616645050443000, 1.817456612112881900, 1.817296512352636300, - 1.817136345775592900, - 1.816976112387640700, 1.816815812194670700, 1.816655445202576700, - 1.816495011417255300, - 1.816334510844604700, 1.816173943490526400, 1.816013309360923900, - 1.815852608461703300, - 1.815691840798773000, 1.815531006378043900, 1.815370105205429600, - 1.815209137286846200, - 1.815048102628211500, 1.814887001235446600, 1.814725833114474700, - 1.814564598271221300, - 1.814403296711615000, 1.814241928441585800, 1.814080493467067300, - 1.813918991793994900, - 1.813757423428306000, 1.813595788375941700, 1.813434086642844400, - 1.813272318234959700, - 1.813110483158235400, 1.812948581418621500, 1.812786613022070700, - 1.812624577974538000, - 1.812462476281981200, 1.812300307950360300, 1.812138072985637800, - 1.811975771393778300, - 1.811813403180749300, 1.811650968352521000, 1.811488466915065000, - 1.811325898874356800, - 1.811163264236372900, 1.811000563007093100, 1.810837795192499400, - 1.810674960798576600, - 1.810512059831311400, 1.810349092296693400, 1.810186058200714100, - 1.810022957549368000, - 1.809859790348652200, 1.809696556604565300, 1.809533256323109200, - 1.809369889510288100, - 1.809206456172108200, 1.809042956314578900, 1.808879389943711200, - 1.808715757065519200, - 1.808552057686019200, 1.808388291811230000, 1.808224459447172800, - 1.808060560599871200, - 1.807896595275351200, 1.807732563479641300, 1.807568465218772900, - 1.807404300498778800, - 1.807240069325695400, 1.807075771705560800, 1.806911407644415700, - 1.806746977148303300, - 1.806582480223269500, 1.806417916875362000, 1.806253287110631600, - 1.806088590935131000, - 1.805923828354915900, 1.805758999376044100, 1.805594104004575800, - 1.805429142246573600, - 1.805264114108102900, 1.805099019595231200, 1.804933858714028700, - 1.804768631470567500, - 1.804603337870923000, 1.804437977921172300, 1.804272551627395400, - 1.804107058995674500, - 1.803941500032094200, 1.803775874742741500, 1.803610183133706400, - 1.803444425211080400, - 1.803278600980958300, 1.803112710449436900, 1.802946753622615400, - 1.802780730506595700, - 1.802614641107481900, 1.802448485431380900, 1.802282263484401300, - 1.802115975272655000, - 1.801949620802255600, 1.801783200079319900, 1.801616713109966300, - 1.801450159900316300, - 1.801283540456493700, 1.801116854784624400, 1.800950102890836800, - 1.800783284781262200, - 1.800616400462033800, 1.800449449939287800, 1.800282433219162000, - 1.800115350307797600, - 1.799948201211337500, 1.799780985935927300, 1.799613704487715200, - 1.799446356872851400, - 1.799278943097489100, 1.799111463167783400, 1.798943917089892000, - 1.798776304869975200, - 1.798608626514195800, 1.798440882028718500, 1.798273071419711000, - 1.798105194693343500, - 1.797937251855787700, 1.797769242913218800, 1.797601167871813800, - 1.797433026737752700, - 1.797264819517217200, 1.797096546216391900, 1.796928206841463800, - 1.796759801398622100, - 1.796591329894058800, 1.796422792333968000, 1.796254188724546500, - 1.796085519071992900, - 1.795916783382509200, 1.795747981662299200, 1.795579113917569200, - 1.795410180154527900, - 1.795241180379386800, 1.795072114598359200, 1.794902982817661500, - 1.794733785043511900, - 1.794564521282131300, 1.794395191539743400, 1.794225795822573600, - 1.794056334136850300, - 1.793886806488804100, 1.793717212884667900, 1.793547553330677300, - 1.793377827833070100, - 1.793208036398086900, 1.793038179031970000, 1.792868255740965000, - 1.792698266531319400, - 1.792528211409282900, 1.792358090381108300, 1.792187903453050100, - 1.792017650631366100, - 1.791847331922315600, 1.791676947332161000, 1.791506496867166600, - 1.791335980533599300, - 1.791165398337728900, 1.790994750285827000, 1.790824036384167900, - 1.790653256639028100, - 1.790482411056686800, 1.790311499643425500, 1.790140522405528200, - 1.789969479349281100, - 1.789798370480973000, 1.789627195806895200, 1.789455955333341100, - 1.789284649066606800, - 1.789113277012990900, 1.788941839178794100, 1.788770335570319700, - 1.788598766193873600, - 1.788427131055763600, 1.788255430162300400, 1.788083663519796800, - 1.787911831134568300, - 1.787739933012932900, 1.787567969161210300, 1.787395939585723500, - 1.787223844292797500, - 1.787051683288759500, 1.786879456579939700, 1.786707164172670200, - 1.786534806073285700, - 1.786362382288123400, 1.786189892823522700, 1.786017337685825700, - 1.785844716881376700, - 1.785672030416522300, 1.785499278297612000, 1.785326460530997300, - 1.785153577123032000, - 1.784980628080072900, 1.784807613408478300, 1.784634533114609800, - 1.784461387204831400, - 1.784288175685508700, 1.784114898563010200, 1.783941555843707100, - 1.783768147533972200, - 1.783594673640181800, 1.783421134168713800, 1.783247529125948900, - 1.783073858518269700, - 1.782900122352062000, 1.782726320633713200, 1.782552453369613800, - 1.782378520566156200, - 1.782204522229735600, 1.782030458366749200, 1.781856328983596900, - 1.781682134086680900, - 1.781507873682406200, 1.781333547777179200, 1.781159156377410100, - 1.780984699489510200, - 1.780810177119894100, 1.780635589274978600, 1.780460935961182300, - 1.780286217184927000, - 1.780111432952636600, 1.779936583270737400, 1.779761668145658300, - 1.779586687583830200, - 1.779411641591686500, 1.779236530175663600, 1.779061353342199500, - 1.778886111097735000, - 1.778710803448713400, 1.778535430401580100, 1.778359991962783000, - 1.778184488138772900, - 1.778008918936002000, 1.777833284360925900, 1.777657584420002000, - 1.777481819119690200, - 1.777305988466453000, 1.777130092466755200, 1.776954131127064200, - 1.776778104453849100, - 1.776602012453582400, 1.776425855132738100, 1.776249632497793200, - 1.776073344555227000, - 1.775896991311520800, 1.775720572773158900, 1.775544088946627600, - 1.775367539838415700, - 1.775190925455014400, 1.775014245802917200, 1.774837500888620400, - 1.774660690718622000, - 1.774483815299423100, 1.774306874637527000, 1.774129868739439100, - 1.773952797611667100, - 1.773775661260722100, 1.773598459693116500, 1.773421192915365400, - 1.773243860933986400, - 1.773066463755499800, 1.772889001386427800, 1.772711473833295200, - 1.772533881102629000, - 1.772356223200959100, 1.772178500134817100, 1.772000711910737700, - 1.771822858535257600, - 1.771644940014915700, 1.771466956356254000, 1.771288907565816000, - 1.771110793650148500, - 1.770932614615799800, 1.770754370469321400, 1.770576061217266500, - 1.770397686866191300, - 1.770219247422653700, 1.770040742893215000, 1.769862173284438000, - 1.769683538602888000, - 1.769504838855133100, 1.769326074047743700, 1.769147244187292200, - 1.768968349280353800, - 1.768789389333506000, 1.768610364353328600, 1.768431274346403900, - 1.768252119319316400, - 1.768072899278653200, 1.767893614231003800, 1.767714264182959500, - 1.767534849141115100, - 1.767355369112067100, 1.767175824102414000, 1.766996214118757800, - 1.766816539167701800, - 1.766636799255852300, 1.766456994389817600, 1.766277124576209000, - 1.766097189821639300, - 1.765917190132724600, 1.765737125516083000, 1.765556995978334800, - 1.765376801526102700, - 1.765196542166012100, 1.765016217904690900, 1.764835828748768400, - 1.764655374704877700, - 1.764474855779653200, 1.764294271979732100, 1.764113623311754000, - 1.763932909782361100, - 1.763752131398197200, 1.763571288165909400, 1.763390380092146400, - 1.763209407183560200, - 1.763028369446804500, 1.762847266888535100, 1.762666099515411100, - 1.762484867334093400, - 1.762303570351245300, 1.762122208573532600, 1.761940782007623600, - 1.761759290660188400, - 1.761577734537900500, 1.761396113647435000, 1.761214427995469100, - 1.761032677588683800, - 1.760850862433760700, 1.760668982537384900, 1.760487037906243600, - 1.760305028547026500, - 1.760122954466425600, 1.759940815671135100, 1.759758612167851700, - 1.759576343963274600, - 1.759394011064105100, 1.759211613477047200, 1.759029151208807400, - 1.758846624266093800, - 1.758664032655617500, 1.758481376384092500, 1.758298655458233600, - 1.758115869884759700, - 1.757933019670390800, 1.757750104821850000, 1.757567125345862700, - 1.757384081249156100, - 1.757200972538460700, 1.757017799220508500, 1.756834561302034400, - 1.756651258789775800, - 1.756467891690471700, 1.756284460010864200, 1.756100963757697900, - 1.755917402937718900, - 1.755733777557676500, 1.755550087624322000, 1.755366333144409200, - 1.755182514124693900, - 1.754998630571935200, 1.754814682492893600, 1.754630669894332600, - 1.754446592783017500, - 1.754262451165716300, 1.754078245049199600, 1.753893974440240000, - 1.753709639345612600, - 1.753525239772095100, 1.753340775726466700, 1.753156247215510400, - 1.752971654246010300, - 1.752786996824753600, 1.752602274958529500, 1.752417488654129700, - 1.752232637918348200, - 1.752047722757981600, 1.751862743179828600, 1.751677699190690400, - 1.751492590797370600, - 1.751307418006674800, 1.751122180825411800, 1.750936879260391700, - 1.750751513318427700, - 1.750566083006335600, 1.750380588330932500, 1.750195029299038900, - 1.750009405917477100, - 1.749823718193071800, 1.749637966132650900, 1.749452149743043100, - 1.749266269031080700, - 1.749080324003598100, 1.748894314667431800, 1.748708241029421000, - 1.748522103096407300, - 1.748335900875233900, 1.748149634372747200, 1.747963303595795500, - 1.747776908551230000, - 1.747590449245904000, 1.747403925686672500, 1.747217337880393900, - 1.747030685833928200, - 1.746843969554138200, 1.746657189047889200, 1.746470344322048200, - 1.746283435383485100, - 1.746096462239072000, 1.745909424895683200, 1.745722323360195900, - 1.745535157639489100, - 1.745347927740444200, 1.745160633669945200, 1.744973275434878300, - 1.744785853042132300, - 1.744598366498598200, 1.744410815811169300, 1.744223200986741100, - 1.744035522032211900, - 1.743847778954482000, 1.743659971760454200, 1.743472100457033700, - 1.743284165051127700, - 1.743096165549646400, 1.742908101959502100, 1.742719974287608900, - 1.742531782540884100, - 1.742343526726246800, 1.742155206850618800, 1.741966822920923800, - 1.741778374944088000, - 1.741589862927040800, 1.741401286876712800, 1.741212646800037300, - 1.741023942703950200, - 1.740835174595389600, 1.740646342481295900, 1.740457446368612000, - 1.740268486264283200, - 1.740079462175256900, 1.739890374108482600, 1.739701222070913200, - 1.739512006069502800, - 1.739322726111208500, 1.739133382202989500, 1.738943974351807600, - 1.738754502564626700, - 1.738564966848413100, 1.738375367210135400, 1.738185703656765200, - 1.737995976195275000, - 1.737806184832640900, 1.737616329575841300, 1.737426410431856200, - 1.737236427407668800, - 1.737046380510263800, 1.736856269746629000, 1.736666095123754000, - 1.736475856648631400, - 1.736285554328254900, 1.736095188169622500, 1.735904758179732400, - 1.735714264365586700, - 1.735523706734189100, 1.735333085292545900, 1.735142400047666100, - 1.734951651006560100, - 1.734760838176241400, 1.734569961563725600, 1.734379021176030600, - 1.734188017020177100, - 1.733996949103187500, 1.733805817432086900, 1.733614622013902600, - 1.733423362855664100, - 1.733232039964403900, 1.733040653347156300, 1.732849203010957900, - 1.732657688962847600, - 1.732466111209867200, 1.732274469759060200, 1.732082764617472800, - 1.731890995792153600, - 1.731699163290153100, 1.731507267118524500, 1.731315307284323700, - 1.731123283794607800, - 1.730931196656437600, 1.730739045876875200, 1.730546831462985500, - 1.730354553421835600, - 1.730162211760495300, 1.729969806486036500, 1.729777337605533000, - 1.729584805126061400, - 1.729392209054700900, 1.729199549398532400, 1.729006826164639400, - 1.728814039360108100, - 1.728621188992026400, 1.728428275067485100, 1.728235297593577100, - 1.728042256577397200, - 1.727849152026043500, 1.727655983946615700, 1.727462752346216000, - 1.727269457231948900, - 1.727076098610921500, 1.726882676490243000, 1.726689190877025000, - 1.726495641778381200, - 1.726302029201427900, 1.726108353153283900, 1.725914613641069900, - 1.725720810671909300, - 1.725526944252927700, 1.725333014391252900, 1.725139021094015200, - 1.724944964368347000, - 1.724750844221383500, 1.724556660660261800, 1.724362413692121400, - 1.724168103324104300, - 1.723973729563354600, 1.723779292417019200, 1.723584791892246700, - 1.723390227996188600, - 1.723195600735998100, 1.723000910118831300, 1.722806156151846400, - 1.722611338842204000, - 1.722416458197066900, 1.722221514223600100, 1.722026506928971500, - 1.721831436320350800, - 1.721636302404910200, 1.721441105189824000, 1.721245844682269600, - 1.721050520889425600, - 1.720855133818473900, 1.720659683476597900, 1.720464169870984200, - 1.720268593008821100, - 1.720072952897299100, 1.719877249543611900, 1.719681482954954500, - 1.719485653138524800, - 1.719289760101522900, 1.719093803851151400, 1.718897784394614900, - 1.718701701739120400, - 1.718505555891877400, 1.718309346860097600, 1.718113074650995200, - 1.717916739271786500, - 1.717720340729689700, 1.717523879031926500, 1.717327354185719900, - 1.717130766198295700, - 1.716934115076881800, 1.716737400828708400, 1.716540623461008100, - 1.716343782981016200, - 1.716146879395969500, 1.715949912713108100, 1.715752882939673300, - 1.715555790082909900, - 1.715358634150064000, 1.715161415148384500, 1.714964133085122900, - 1.714766787967532600, - 1.714569379802868900, 1.714371908598390800, 1.714174374361358000, - 1.713976777099033700, - 1.713779116818682900, 1.713581393527573000, 1.713383607232973600, - 1.713185757942156800, - 1.712987845662396800, 1.712789870400970700, 1.712591832165157200, - 1.712393730962237500, - 1.712195566799495500, 1.711997339684216700, 1.711799049623689900, - 1.711600696625205300, - 1.711402280696055800, 1.711203801843536700, 1.711005260074945200, - 1.710806655397581600, - 1.710607987818747700, 1.710409257345748100, 1.710210463985889500, - 1.710011607746480600, - 1.709812688634833300, 1.709613706658261100, 1.709414661824080000, - 1.709215554139608400, - 1.709016383612166600, 1.708817150249077900, 1.708617854057667300, - 1.708418495045262300, - 1.708219073219193300, 1.708019588586791700, 1.707820041155392500, - 1.707620430932332400, - 1.707420757924950300, 1.707221022140587900, 1.707021223586588700, - 1.706821362270298600, - 1.706621438199066300, 1.706421451380242000, 1.706221401821179200, - 1.706021289529232800, - 1.705821114511760300, 1.705620876776121600, 1.705420576329679000, - 1.705220213179796900, - 1.705019787333842200, 1.704819298799183700, 1.704618747583193100, - 1.704418133693243800, - 1.704217457136711900, 1.704016717920976000, 1.703815916053416300, - 1.703615051541415900, - 1.703414124392360000, 1.703213134613636100, 1.703012082212634000, - 1.702810967196746000, - 1.702609789573366300, 1.702408549349891500, 1.702207246533721000, - 1.702005881132255800, - 1.701804453152900000, 1.701602962603059100, 1.701401409490141300, - 1.701199793821557300, - 1.700998115604720000, 1.700796374847044300, 1.700594571555948100, - 1.700392705738850400, - 1.700190777403173700, 1.699988786556342300, 1.699786733205783000, - 1.699584617358924400, - 1.699382439023197700, 1.699180198206036600, 1.698977894914877100, - 1.698775529157156700, - 1.698573100940316400, 1.698370610271798800, 1.698168057159048700, - 1.697965441609513300, - 1.697762763630642700, 1.697560023229888200, 1.697357220414704500, - 1.697154355192547900, - 1.696951427570877000, 1.696748437557152900, 1.696545385158839200, - 1.696342270383401200, - 1.696139093238307400, 1.695935853731027600, 1.695732551869034300, - 1.695529187659802400, - 1.695325761110809200, 1.695122272229534000, 1.694918721023458600, - 1.694715107500066800, - 1.694511431666845000, 1.694307693531282000, 1.694103893100868100, - 1.693900030383096900, - 1.693696105385463800, 1.693492118115466500, 1.693288068580604900, - 1.693083956788381500, - 1.692879782746300700, 1.692675546461869900, 1.692471247942597600, - 1.692266887195995600, - 1.692062464229577600, 1.691857979050859900, 1.691653431667360600, - 1.691448822086600400, - 1.691244150316102000, 1.691039416363390800, 1.690834620235994300, - 1.690629761941442100, - 1.690424841487266700, 1.690219858881001800, 1.690014814130184300, - 1.689809707242353200, - 1.689604538225049700, 1.689399307085817300, 1.689194013832201500, - 1.688988658471750600, - 1.688783241012014700, 1.688577761460546800, 1.688372219824901400, - 1.688166616112636100, - 1.687960950331309800, 1.687755222488484600, 1.687549432591724400, - 1.687343580648595700, - 1.687137666666667100, 1.686931690653509000, 1.686725652616694900, - 1.686519552563800400, - 1.686313390502403000, 1.686107166440082600, 1.685900880384421800, - 1.685694532343004600, - 1.685488122323418400, 1.685281650333251900, 1.685075116380096800, - 1.684868520471546600, - 1.684661862615197000, 1.684455142818646700, 1.684248361089495800, - 1.684041517435347400, - 1.683834611863806100, 1.683627644382479800, 1.683420614998977900, - 1.683213523720911800, - 1.683006370555896400, 1.682799155511547600, 1.682591878595484300, - 1.682384539815327400, - 1.682177139178700400, 1.681969676693228600, 1.681762152366539600, - 1.681554566206263900, - 1.681346918220033800, 1.681139208415483700, 1.680931436800250600, - 1.680723603381973500, - 1.680515708168294200, 1.680307751166856300, 1.680099732385305300, - 1.679891651831290100, - 1.679683509512460900, 1.679475305436470600, 1.679267039610974300, - 1.679058712043629300, - 1.678850322742095200, 1.678641871714033900, 1.678433358967109400, - 1.678224784508988400, - 1.678016148347339300, 1.677807450489833300, 1.677598690944143400, - 1.677389869717945000, - 1.677180986818916300, 1.676972042254736900, 1.676763036033089600, - 1.676553968161658600, - 1.676344838648130600, 1.676135647500194700, 1.675926394725542700, - 1.675717080331867900, - 1.675507704326866200, 1.675298266718235900, 1.675088767513677200, - 1.674879206720892900, - 1.674669584347587800, 1.674459900401469700, 1.674250154890247300, - 1.674040347821632800, - 1.673830479203340000, 1.673620549043085500, 1.673410557348587600, - 1.673200504127567000, - 1.672990389387746700, 1.672780213136852300, 1.672569975382611300, - 1.672359676132753500, - 1.672149315395010900, 1.671938893177118000, 1.671728409486811500, - 1.671517864331830000, - 1.671307257719914800, 1.671096589658809500, 1.670885860156259300, - 1.670675069220012500, - 1.670464216857819200, 1.670253303077431800, 1.670042327886605200, - 1.669831291293095900, - 1.669620193304663500, 1.669409033929069500, 1.669197813174077200, - 1.668986531047453000, - 1.668775187556965000, 1.668563782710383600, 1.668352316515481700, - 1.668140788980034400, - 1.667929200111818400, 1.667717549918614100, 1.667505838408202700, - 1.667294065588368100, - 1.667082231466896900, 1.666870336051577800, 1.666658379350201000, - 1.666446361370560000, - 1.666234282120450100, 1.666022141607668600, 1.665809939840015500, - 1.665597676825292700, - 1.665385352571304500, 1.665172967085857700, 1.664960520376761000, - 1.664748012451825200, - 1.664535443318863900, 1.664322812985692600, 1.664110121460129000, - 1.663897368749993400, - 1.663684554863107800, 1.663471679807296800, 1.663258743590387400, - 1.663045746220208600, - 1.662832687704591800, 1.662619568051370500, 1.662406387268380100, - 1.662193145363459100, - 1.661979842344447600, 1.661766478219188300, 1.661553052995526000, - 1.661339566681307600, - 1.661126019284382200, 1.660912410812601900, 1.660698741273819700, - 1.660485010675892400, - 1.660271219026677700, 1.660057366334036300, 1.659843452605831200, - 1.659629477849926800, - 1.659415442074190900, 1.659201345286492900, 1.658987187494704200, - 1.658772968706699000, - 1.658558688930353400, 1.658344348173546300, 1.658129946444157700, - 1.657915483750071100, - 1.657700960099171200, 1.657486375499345900, 1.657271729958484500, - 1.657057023484479000, - 1.656842256085223800, 1.656627427768615000, 1.656412538542551200, - 1.656197588414933600, - 1.655982577393664700, 1.655767505486650500, 1.655552372701798200, - 1.655337179047017700, - 1.655121924530220900, 1.654906609159322500, 1.654691232942238500, - 1.654475795886888300, - 1.654260298001192200, 1.654044739293073900, 1.653829119770458900, - 1.653613439441274500, - 1.653397698313451300, 1.653181896394921000, 1.652966033693617800, - 1.652750110217479100, - 1.652534125974443000, 1.652318080972451400, 1.652101975219447200, - 1.651885808723375900, - 1.651669581492185300, 1.651453293533826000, 1.651236944856249600, - 1.651020535467411200, - 1.650804065375267400, 1.650587534587776700, 1.650370943112901000, - 1.650154290958603300, - 1.649937578132849400, 1.649720804643607400, 1.649503970498847200, - 1.649287075706541200, - 1.649070120274664000, 1.648853104211192700, 1.648636027524106100, - 1.648418890221385400, - 1.648201692311014300, 1.647984433800978600, 1.647767114699266100, - 1.647549735013867000, - 1.647332294752774200, 1.647114793923981600, 1.646897232535486500, - 1.646679610595287900, - 1.646461928111387300, 1.646244185091788400, 1.646026381544496400, - 1.645808517477519700, - 1.645590592898868600, 1.645372607816555400, 1.645154562238594800, - 1.644936456173004000, - 1.644718289627801600, 1.644500062611009300, 1.644281775130650900, - 1.644063427194751600, - 1.643845018811340300, 1.643626549988446200, 1.643408020734102600, - 1.643189431056343700, - 1.642970780963206800, 1.642752070462730800, 1.642533299562957100, - 1.642314468271929300, - 1.642095576597693200, 1.641876624548297000, 1.641657612131790500, - 1.641438539356226500, - 1.641219406229659700, 1.641000212760146800, 1.640780958955747200, - 1.640561644824521700, - 1.640342270374534500, 1.640122835613851100, 1.639903340550539200, - 1.639683785192669600, - 1.639464169548314100, 1.639244493625547900, 1.639024757432447500, - 1.638804960977092100, - 1.638585104267562800, 1.638365187311943400, 1.638145210118319400, - 1.637925172694778800, - 1.637705075049411800, 1.637484917190310800, 1.637264699125570200, - 1.637044420863286600, - 1.636824082411559600, 1.636603683778490100, 1.636383224972181500, - 1.636162706000739300, - 1.635942126872271800, 1.635721487594888400, 1.635500788176702100, - 1.635280028625826900, - 1.635059208950379700, 1.634838329158479200, 1.634617389258246700, - 1.634396389257805700, - 1.634175329165281400, 1.633954208988801700, 1.633733028736496400, - 1.633511788416498000, - 1.633290488036940500, 1.633069127605960800, 1.632847707131697600, - 1.632626226622291700, - 1.632404686085886300, 1.632183085530627200, 1.631961424964661700, - 1.631739704396139900, - 1.631517923833213400, 1.631296083284036900, 1.631074182756766300, - 1.630852222259560700, - 1.630630201800580900, 1.630408121387990000, 1.630185981029953000, - 1.629963780734637400, - 1.629741520510213000, 1.629519200364851800, 1.629296820306727700, - 1.629074380344017100, - 1.628851880484898200, 1.628629320737551700, 1.628406701110161100, - 1.628184021610910700, - 1.627961282247988300, 1.627738483029583100, 1.627515623963887000, - 1.627292705059093700, - 1.627069726323399500, 1.626846687765002700, 1.626623589392103500, - 1.626400431212904800, - 1.626177213235611400, 1.625953935468430500, 1.625730597919571300, - 1.625507200597245500, - 1.625283743509666300, 1.625060226665050000, 1.624836650071614500, - 1.624613013737580000, - 1.624389317671169500, 1.624165561880607000, 1.623941746374119500, - 1.623717871159936300, - 1.623493936246288300, 1.623269941641409400, 1.623045887353534900, - 1.622821773390902700, - 1.622597599761753000, 1.622373366474327800, 1.622149073536871800, - 1.621924720957631300, - 1.621700308744855200, 1.621475836906794500, 1.621251305451702400, - 1.621026714387834300, - 1.620802063723447700, 1.620577353466802700, 1.620352583626160500, - 1.620127754209786100, - 1.619902865225945300, 1.619677916682906700, 1.619452908588941300, - 1.619227840952321800, - 1.619002713781323200, 1.618777527084222800, 1.618552280869300300, - 1.618326975144837000, - 1.618101609919117200, 1.617876185200426600, 1.617650700997053500, - 1.617425157317288200, - 1.617199554169423500, 1.616973891561754200, 1.616748169502577200, - 1.616522388000191500, - 1.616296547062898500, 1.616070646699001800, 1.615844686916807300, - 1.615618667724622700, - 1.615392589130757900, 1.615166451143525300, 1.614940253771239400, - 1.614713997022216900, - 1.614487680904776600, 1.614261305427239200, 1.614034870597928400, - 1.613808376425168900, - 1.613581822917288900, 1.613355210082617800, 1.613128537929487500, - 1.612901806466232200, - 1.612675015701188000, 1.612448165642693400, 1.612221256299089200, - 1.611994287678718100, - 1.611767259789925100, 1.611540172641057200, 1.611313026240463800, - 1.611085820596496600, - 1.610858555717509200, 1.610631231611857800, 1.610403848287899700, - 1.610176405753995800, - 1.609948904018508200, 1.609721343089801600, 1.609493722976242900, - 1.609266043686200700, - 1.609038305228046400, 1.608810507610153100, 1.608582650840896200, - 1.608354734928653800, - 1.608126759881805400, 1.607898725708732900, 1.607670632417820500, - 1.607442480017454700, - 1.607214268516024000, 1.606985997921919000, 1.606757668243532500, - 1.606529279489259600, - 1.606300831667497600, 1.606072324786645500, 1.605843758855105300, - 1.605615133881280700, - 1.605386449873577300, 1.605157706840403300, 1.604928904790168700, - 1.604700043731286200, - 1.604471123672170500, 1.604242144621237800, 1.604013106586907400, - 1.603784009577600100, - 1.603554853601739700, 1.603325638667751000, 1.603096364784061900, - 1.602867031959102100, - 1.602637640201303400, 1.602408189519099800, 1.602178679920927900, - 1.601949111415226000, - 1.601719484010434300, 1.601489797714996000, 1.601260052537355700, - 1.601030248485960900, - 1.600800385569260300, 1.600570463795705700, 1.600340483173750400, - 1.600110443711850300, - 1.599880345418463100, 1.599650188302049100, 1.599419972371070500, - 1.599189697633991400, - 1.598959364099278700, 1.598728971775401000, 1.598498520670828900, - 1.598268010794035900, - 1.598037442153496900, 1.597806814757689200, 1.597576128615092200, - 1.597345383734188000, - 1.597114580123460100, 1.596883717791394800, 1.596652796746479600, - 1.596421816997205500, - 1.596190778552064800, 1.595959681419551800, 1.595728525608163700, - 1.595497311126399300, - 1.595266037982759500, 1.595034706185747500, 1.594803315743869000, - 1.594571866665631700, - 1.594340358959544800, 1.594108792634120600, 1.593877167697873100, - 1.593645484159318200, - 1.593413742026974500, 1.593181941309362400, 1.592950082015004700, - 1.592718164152426000, - 1.592486187730153300, 1.592254152756715600, 1.592022059240644400, - 1.591789907190473100, - 1.591557696614737100, 1.591325427521974100, 1.591093099920724200, - 1.590860713819529400, - 1.590628269226933600, 1.590395766151483400, 1.590163204601727100, - 1.589930584586215500, - 1.589697906113501000, 1.589465169192139100, 1.589232373830686400, - 1.588999520037702300, - 1.588766607821748200, 1.588533637191387400, 1.588300608155185600, - 1.588067520721711000, - 1.587834374899533400, 1.587601170697224600, 1.587367908123358900, - 1.587134587186513000, - 1.586901207895265300, 1.586667770258196600, 1.586434274283889500, - 1.586200719980929200, - 1.585967107357902700, 1.585733436423399000, 1.585499707186010200, - 1.585265919654329300, - 1.585032073836952100, 1.584798169742476400, 1.584564207379502500, - 1.584330186756632200, - 1.584096107882470000, 1.583861970765622100, 1.583627775414697000, - 1.583393521838305700, - 1.583159210045060900, 1.582924840043577400, 1.582690411842472700, - 1.582455925450365600, - 1.582221380875877800, 1.581986778127632700, 1.581752117214255900, - 1.581517398144375800, - 1.581282620926621300, 1.581047785569625400, 1.580812892082021900, - 1.580577940472447200, - 1.580342930749539800, 1.580107862921940700, 1.579872736998292100, - 1.579637552987239100, - 1.579402310897428900, 1.579167010737510600, 1.578931652516135700, - 1.578696236241957200, - 1.578460761923630800, 1.578225229569814700, 1.577989639189168100, - 1.577753990790353500, - 1.577518284382034800, 1.577282519972878200, 1.577046697571552000, - 1.576810817186727000, - 1.576574878827075700, 1.576338882501273000, 1.576102828217995600, - 1.575866715985922500, - 1.575630545813735200, 1.575394317710116600, 1.575158031683752300, - 1.574921687743330300, - 1.574685285897539800, 1.574448826155072400, 1.574212308524622500, - 1.573975733014886000, - 1.573739099634561500, 1.573502408392348600, 1.573265659296950300, - 1.573028852357070800, - 1.572791987581417100, 1.572555064978698100, 1.572318084557624800, - 1.572081046326909900, - 1.571843950295269000, 1.571606796471419100, 1.571369584864080100, - 1.571132315481973200, - 1.570894988333822400, 1.570657603428353300, 1.570420160774294000, - 1.570182660380374600, - 1.569945102255327200, 1.569707486407886600, 1.569469812846788500, - 1.569232081580771900, - 1.568994292618577400, 1.568756445968948000, 1.568518541640628400, - 1.568280579642366000, - 1.568042559982909500, 1.567804482671010500, 1.567566347715422500, - 1.567328155124900800, - 1.567089904908203200, 1.566851597074089500, 1.566613231631321500, - 1.566374808588663300, - 1.566136327954881000, 1.565897789738742900, 1.565659193949019400, - 1.565420540594482800, - 1.565181829683907700, 1.564943061226071100, 1.564704235229751500, - 1.564465351703730400, - 1.564226410656790000, 1.563987412097716200, 1.563748356035296000, - 1.563509242478319000, - 1.563270071435576500, 1.563030842915862100, 1.562791556927971800, - 1.562552213480703300, - 1.562312812582856500, 1.562073354243233700, 1.561833838470639200, - 1.561594265273878800, - 1.561354634661761300, 1.561114946643096900, 1.560875201226698900, - 1.560635398421381400, - 1.560395538235961800, 1.560155620679258400, 1.559915645760092900, - 1.559675613487288200, - 1.559435523869669500, 1.559195376916064700, 1.558955172635302800, - 1.558714911036215700, - 1.558474592127637100, 1.558234215918402600, 1.557993782417350400, - 1.557753291633320500, - 1.557512743575155000, 1.557272138251698300, 1.557031475671796400, - 1.556790755844298400, - 1.556549978778054300, 1.556309144481917300, 1.556068252964741600, - 1.555827304235384500, - 1.555586298302704900, 1.555345235175563900, 1.555104114862824600, - 1.554862937373352500, - 1.554621702716015000, 1.554380410899681300, 1.554139061933223200, - 1.553897655825514600, - 1.553656192585431100, 1.553414672221850700, 1.553173094743653300, - 1.552931460159721100, - 1.552689768478938500, 1.552448019710191300, 1.552206213862368500, - 1.551964350944360100, - 1.551722430965059000, 1.551480453933359800, 1.551238419858159700, - 1.550996328748356800, - 1.550754180612852900, 1.550511975460550500, 1.550269713300355100, - 1.550027394141174000, - 1.549785017991916400, 1.549542584861493900, 1.549300094758820000, - 1.549057547692810600, - 1.548814943672383300, 1.548572282706457900, 1.548329564803956300, - 1.548086789973802700, - 1.547843958224923000, 1.547601069566245900, 1.547358124006701400, - 1.547115121555221700, - 1.546872062220741700, 1.546628946012197800, 1.546385772938528600, - 1.546142543008675300, - 1.545899256231580300, 1.545655912616188800, 1.545412512171447700, - 1.545169054906306200, - 1.544925540829715600, 1.544681969950629300, 1.544438342278002600, - 1.544194657820792800, - 1.543950916587959700, 1.543707118588464800, 1.543463263831272000, - 1.543219352325347200, - 1.542975384079658300, 1.542731359103175300, 1.542487277404870100, - 1.542243138993717000, - 1.541998943878692300, 1.541754692068774600, 1.541510383572944000, - 1.541266018400183200, - 1.541021596559476700, 1.540777118059811100, 1.540532582910175500, - 1.540287991119560600, - 1.540043342696959100, 1.539798637651366400, 1.539553875991779300, - 1.539309057727197300, - 1.539064182866621400, 1.538819251419055100, 1.538574263393503800, - 1.538329218798974800, - 1.538084117644477900, 1.537838959939025200, 1.537593745691629500, - 1.537348474911307300, - 1.537103147607076200, 1.536857763787956400, 1.536612323462969800, - 1.536366826641140800, - 1.536121273331495300, 1.535875663543061700, 1.535629997284870400, - 1.535384274565953600, - 1.535138495395346400, 1.534892659782085100, 1.534646767735208000, - 1.534400819263756400, - 1.534154814376772700, 1.533908753083302200, 1.533662635392391700, - 1.533416461313090100, - 1.533170230854448400, 1.532923944025520200, 1.532677600835360600, - 1.532431201293027000, - 1.532184745407578500, 1.531938233188077100, 1.531691664643585900, - 1.531445039783170500, - 1.531198358615898800, 1.530951621150840700, 1.530704827397067800, - 1.530457977363654000, - 1.530211071059675200, 1.529964108494209700, 1.529717089676337500, - 1.529470014615140800, - 1.529222883319703700, 1.528975695799112500, 1.528728452062455600, - 1.528481152118823700, - 1.528233795977309400, 1.527986383647006500, 1.527738915137012400, - 1.527491390456425600, - 1.527243809614346600, 1.526996172619878900, 1.526748479482126700, - 1.526500730210197200, - 1.526252924813199500, 1.526005063300244900, 1.525757145680446200, - 1.525509171962918800, - 1.525261142156779900, 1.525013056271149000, 1.524764914315147200, - 1.524516716297898300, - 1.524268462228527900, 1.524020152116163200, 1.523771785969934000, - 1.523523363798972000, - 1.523274885612411200, 1.523026351419387100, 1.522777761229038100, - 1.522529115050503600, - 1.522280412892925900, 1.522031654765448900, 1.521782840677218700, - 1.521533970637383800, - 1.521285044655094300, 1.521036062739502300, 1.520787024899762100, - 1.520537931145030400, - 1.520288781484465700, 1.520039575927228500, 1.519790314482481100, - 1.519540997159388300, - 1.519291623967116600, 1.519042194914835200, 1.518792710011714500, - 1.518543169266927600, - 1.518293572689648900, 1.518043920289055900, 1.517794212074327500, - 1.517544448054644500, - 1.517294628239190400, 1.517044752637150000, 1.516794821257710500, - 1.516544834110061600, - 1.516294791203394200, 1.516044692546901800, 1.515794538149779700, - 1.515544328021225500, - 1.515294062170438700, 1.515043740606620800, 1.514793363338975600, - 1.514542930376708600, - 1.514292441729027300, 1.514041897405141700, 1.513791297414263800, - 1.513540641765606800, - 1.513289930468387300, 1.513039163531823000, 1.512788340965133500, - 1.512537462777541200, - 1.512286528978270300, 1.512035539576546600, 1.511784494581598600, - 1.511533394002656100, - 1.511282237848951400, 1.511031026129719100, 1.510779758854195400, - 1.510528436031618900, - 1.510277057671229400, 1.510025623782270000, 1.509774134373984800, - 1.509522589455620600, - 1.509270989036425800, 1.509019333125651200, 1.508767621732549400, - 1.508515854866375100, - 1.508264032536385000, 1.508012154751837700, 1.507760221521994700, - 1.507508232856118200, - 1.507256188763473200, 1.507004089253327000, 1.506751934334948000, - 1.506499724017607900, - 1.506247458310579400, 1.505995137223137500, 1.505742760764559300, - 1.505490328944124200, - 1.505237841771113200, 1.504985299254809800, 1.504732701404498900, - 1.504480048229468000, - 1.504227339739006500, 1.503974575942405700, 1.503721756848958700, - 1.503468882467961600, - 1.503215952808711500, 1.502962967880507600, 1.502709927692651900, - 1.502456832254447600, - 1.502203681575200700, 1.501950475664218600, 1.501697214530810700, - 1.501443898184289200, - 1.501190526633967600, 1.500937099889161600, 1.500683617959188900, - 1.500430080853369500, - 1.500176488581024900, 1.499922841151479600, 1.499669138574058800, - 1.499415380858090800, - 1.499161568012905300, 1.498907700047834600, 1.498653776972212600, - 1.498399798795375000, - 1.498145765526660300, 1.497891677175408500, 1.497637533750961300, - 1.497383335262663300, - 1.497129081719860400, 1.496874773131900800, 1.496620409508134800, - 1.496365990857914600, - 1.496111517190594300, 1.495856988515530400, 1.495602404842080800, - 1.495347766179606400, - 1.495093072537469100, 1.494838323925033400, 1.494583520351665500, - 1.494328661826734200, - 1.494073748359609600, 1.493818779959664300, 1.493563756636272500, - 1.493308678398810800, - 1.493053545256657800, 1.492798357219194100, 1.492543114295801900, - 1.492287816495866200, - 1.492032463828773200, 1.491777056303911700, 1.491521593930672100, - 1.491266076718446900, - 1.491010504676631500, 1.490754877814621800, 1.490499196141816600, - 1.490243459667616600, - 1.489987668401424800, 1.489731822352645500, 1.489475921530685900, - 1.489219965944954300, - 1.488963955604861500, 1.488707890519820600, 1.488451770699245900, - 1.488195596152554800, - 1.487939366889165600, 1.487683082918499300, 1.487426744249978400, - 1.487170350893028500, - 1.486913902857075700, 1.486657400151549600, 1.486400842785880100, - 1.486144230769501000, - 1.485887564111846500, 1.485630842822354100, 1.485374066910462500, - 1.485117236385612200, - 1.484860351257246500, 1.484603411534810300, 1.484346417227750700, - 1.484089368345516300, - 1.483832264897558400, 1.483575106893329600, 1.483317894342285100, - 1.483060627253882000, - 1.482803305637578900, 1.482545929502837100, 1.482288498859119400, - 1.482031013715890700, - 1.481773474082618300, 1.481515879968770900, 1.481258231383819800, - 1.481000528337237800, - 1.480742770838499900, 1.480484958897083200, 1.480227092522466500, - 1.479969171724131200, - 1.479711196511560100, 1.479453166894238100, 1.479195082881652200, - 1.478936944483291600, - 1.478678751708647000, 1.478420504567211900, 1.478162203068481100, - 1.477903847221951400, - 1.477645437037121900, 1.477386972523493800, 1.477128453690569800, - 1.476869880547855300, - 1.476611253104856700, 1.476352571371083700, 1.476093835356046700, - 1.475835045069259000, - 1.475576200520235500, 1.475317301718493300, 1.475058348673551100, - 1.474799341394929900, - 1.474540279892153000, 1.474281164174744900, 1.474021994252233000, - 1.473762770134145800, - 1.473503491830014300, 1.473244159349371700, 1.472984772701752900, - 1.472725331896694400, - 1.472465836943735600, 1.472206287852416900, 1.471946684632281500, - 1.471687027292874400, - 1.471427315843742100, 1.471167550294433700, 1.470907730654499800, - 1.470647856933493300, - 1.470387929140969200, 1.470127947286484100, 1.469867911379596900, - 1.469607821429868500, - 1.469347677446861500, 1.469087479440140300, 1.468827227419272200, - 1.468566921393825700, - 1.468306561373371900, 1.468046147367482600, 1.467785679385733300, - 1.467525157437700200, - 1.467264581532962100, 1.467003951681099800, 1.466743267891695800, - 1.466482530174334500, - 1.466221738538602500, 1.465960892994088800, 1.465699993550383400, - 1.465439040217079400, - 1.465178033003770700, 1.464916971920054100, 1.464655856975527900, - 1.464394688179792900, - 1.464133465542451200, 1.463872189073107500, 1.463610858781367900, - 1.463349474676840700, - 1.463088036769136600, 1.462826545067867700, 1.462564999582648600, - 1.462303400323095000, - 1.462041747298825900, 1.461780040519460800, 1.461518279994622200, - 1.461256465733934400, - 1.460994597747023600, 1.460732676043517800, 1.460470700633046800, - 1.460208671525243400, - 1.459946588729741100, 1.459684452256176300, 1.459422262114186800, - 1.459160018313412400, - 1.458897720863495500, 1.458635369774079500, 1.458372965054810700, - 1.458110506715337000, - 1.457847994765308200, 1.457585429214375700, 1.457322810072193800, - 1.457060137348418000, - 1.456797411052706200, 1.456534631194717800, 1.456271797784114900, - 1.456008910830560500, - 1.455745970343720800, 1.455482976333263100, 1.455219928808857200, - 1.454956827780174100, - 1.454693673256887600, 1.454430465248673300, 1.454167203765208000, - 1.453903888816171900, - 1.453640520411245900, 1.453377098560113100, 1.453113623272459100, - 1.452850094557971000, - 1.452586512426338000, 1.452322876887251400, 1.452059187950404100, - 1.451795445625491300, - 1.451531649922210200, 1.451267800850259500, 1.451003898419340500, - 1.450739942639155800, - 1.450475933519410400, 1.450211871069811300, 1.449947755300067500, - 1.449683586219889400, - 1.449419363838989800, 1.449155088167083600, 1.448890759213887100, - 1.448626376989119400, - 1.448361941502500900, 1.448097452763754000, 1.447832910782603100, - 1.447568315568775100, - 1.447303667131997900, 1.447038965482002200, 1.446774210628520200, - 1.446509402581286400, - 1.446244541350036700, 1.445979626944509300, 1.445714659374444500, - 1.445449638649584500, - 1.445184564779673500, 1.444919437774456700, 1.444654257643682900, - 1.444389024397101600, - 1.444123738044464900, 1.443858398595526400, 1.443593006060042100, - 1.443327560447769600, - 1.443062061768468400, 1.442796510031900500, 1.442530905247829200, - 1.442265247426020200, - 1.441999536576240800, 1.441733772708260600, 1.441467955831850800, - 1.441202085956784900, - 1.440936163092837900, 1.440670187249787600, 1.440404158437412500, - 1.440138076665494100, - 1.439871941943815300, 1.439605754282161400, 1.439339513690319100, - 1.439073220178077400, - 1.438806873755226900, 1.438540474431560600, 1.438274022216873500, - 1.438007517120961900, - 1.437740959153624500, 1.437474348324662100, 1.437207684643876800, - 1.436940968121073600, - 1.436674198766058500, 1.436407376588640000, 1.436140501598628400, - 1.435873573805835900, - 1.435606593220076600, 1.435339559851166500, 1.435072473708924000, - 1.434805334803169100, - 1.434538143143723200, 1.434270898740410700, 1.434003601603057300, - 1.433736251741490700, - 1.433468849165540500, 1.433201393885038500, 1.432933885909818000, - 1.432666325249714700, - 1.432398711914566200, 1.432131045914211600, 1.431863327258492400, - 1.431595555957251700, - 1.431327732020334800, 1.431059855457588600, 1.430791926278862400, - 1.430523944494007400, - 1.430255910112876000, 1.429987823145323100, 1.429719683601205800, - 1.429451491490382900, - 1.429183246822714800, 1.428914949608064200, 1.428646599856295400, - 1.428378197577275100, - 1.428109742780871800, 1.427841235476955400, 1.427572675675398600, - 1.427304063386075200, - 1.427035398618861500, 1.426766681383635500, 1.426497911690277000, - 1.426229089548668200, - 1.425960214968693000, 1.425691287960236600, 1.425422308533187200, - 1.425153276697434000, - 1.424884192462868800, 1.424615055839385300, 1.424345866836878200, - 1.424076625465245500, - 1.423807331734385800, 1.423537985654200800, 1.423268587234593400, - 1.422999136485468600, - 1.422729633416733200, 1.422460078038296300, 1.422190470360068300, - 1.421920810391962500, - 1.421651098143893000, 1.421381333625776600, 1.421111516847531700, - 1.420841647819078600, - 1.420571726550339700, 1.420301753051239400, 1.420031727331703800, - 1.419761649401660500, - 1.419491519271040000, 1.419221336949774100, 1.418951102447796800, - 1.418680815775043500, - 1.418410476941452100, 1.418140085956961900, 1.417869642831514700, - 1.417599147575054000, - 1.417328600197524900, 1.417058000708874700, 1.416787349119052600, - 1.416516645438009600, - 1.416245889675698900, 1.415975081842075300, 1.415704221947095700, - 1.415433310000718600, - 1.415162346012905000, 1.414891329993617200, 1.414620261952819600, - 1.414349141900479000, - 1.414077969846563500, 1.413806745801043500, 1.413535469773890700, - 1.413264141775079300, - 1.412992761814585400, 1.412721329902386900, 1.412449846048463600, - 1.412178310262796900, - 1.411906722555370500, 1.411635082936170100, 1.411363391415182900, - 1.411091648002398500, - 1.410819852707807700, 1.410548005541404100, 1.410276106513182400, - 1.410004155633139500, - 1.409732152911274500, 1.409460098357588200, 1.409187991982083100, - 1.408915833794763800, - 1.408643623805636800, 1.408371362024710500, 1.408099048461995300, - 1.407826683127503000, - 1.407554266031248100, 1.407281797183246500, 1.407009276593515800, - 1.406736704272076400, - 1.406464080228949600, 1.406191404474159000, 1.405918677017730100, - 1.405645897869690400, - 1.405373067040069300, 1.405100184538898000, 1.404827250376209400, - 1.404554264562038400, - 1.404281227106422400, 1.404008138019399800, 1.403734997311011600, - 1.403461804991300100, - 1.403188561070310100, 1.402915265558087700, 1.402641918464681400, - 1.402368519800141200, - 1.402095069574519800, 1.401821567797870300, 1.401548014480249000, - 1.401274409631713600, - 1.401000753262323900, 1.400727045382141400, 1.400453286001229800, - 1.400179475129653700, - 1.399905612777481200, 1.399631698954780800, 1.399357733671623900, - 1.399083716938083600, - 1.398809648764234100, 1.398535529160152400, 1.398261358135917300, - 1.397987135701609200, - 1.397712861867310300, 1.397438536643105000, 1.397164160039079200, - 1.396889732065321300, - 1.396615252731921100, 1.396340722048970300, 1.396066140026562800, - 1.395791506674794100, - 1.395516822003761700, 1.395242086023564800, 1.394967298744304900, - 1.394692460176085300, - 1.394417570329010700, 1.394142629213188000, 1.393867636838725900, - 1.393592593215735600, - 1.393317498354329300, 1.393042352264621600, 1.392767154956728400, - 1.392491906440768600, - 1.392216606726861800, 1.391941255825130100, 1.391665853745697400, - 1.391390400498689700, - 1.391114896094234100, 1.390839340542460600, 1.390563733853500200, - 1.390288076037486500, - 1.390012367104554600, 1.389736607064841100, 1.389460795928485500, - 1.389184933705628300, - 1.388909020406412100, 1.388633056040981600, 1.388357040619483200, - 1.388080974152065200, - 1.387804856648877600, 1.387528688120072600, 1.387252468575804100, - 1.386976198026228100, - 1.386699876481501900, 1.386423503951785200, 1.386147080447239600, - 1.385870605978028100, - 1.385594080554316100, 1.385317504186270900, 1.385040876884061000, - 1.384764198657857200, - 1.384487469517832200, 1.384210689474160600, 1.383933858537019100, - 1.383656976716585600, - 1.383380044023040400, 1.383103060466565300, 1.382826026057344600, - 1.382548940805563800, - 1.382271804721410600, 1.381994617815074400, 1.381717380096746800, - 1.381440091576620700, - 1.381162752264891500, 1.380885362171756300, 1.380607921307413400, - 1.380330429682064000, - 1.380052887305910400, 1.379775294189157000, 1.379497650342010400, - 1.379219955774678700, - 1.378942210497371600, 1.378664414520301500, 1.378386567853681700, - 1.378108670507728300, - 1.377830722492658500, 1.377552723818691500, 1.377274674496048700, - 1.376996574534953300, - 1.376718423945630000, 1.376440222738305700, 1.376161970923209400, - 1.375883668510570900, - 1.375605315510623200, 1.375326911933600200, 1.375048457789738400, - 1.374769953089275400, - 1.374491397842451100, 1.374212792059507100, 1.373934135750687100, - 1.373655428926236400, - 1.373376671596402400, 1.373097863771434200, 1.372819005461582500, - 1.372540096677100200, - 1.372261137428242300, 1.371982127725264800, 1.371703067578426700, - 1.371423956997988000, - 1.371144795994210500, 1.370865584577358300, 1.370586322757697500, - 1.370307010545495500, - 1.370027647951022100, 1.369748234984548000, 1.369468771656347200, - 1.369189257976694200, - 1.368909693955866000, 1.368630079604142000, 1.368350414931802000, - 1.368070699949128800, - 1.367790934666406600, 1.367511119093921800, 1.367231253241962200, - 1.366951337120818000, - 1.366671370740780500, 1.366391354112143500, 1.366111287245202400, - 1.365831170150254300, - 1.365551002837598600, 1.365270785317536100, 1.364990517600369400, - 1.364710199696403300, - 1.364429831615944200, 1.364149413369300600, 1.363868944966782900, - 1.363588426418702600, - 1.363307857735373900, 1.363027238927112300, 1.362746570004235400, - 1.362465850977062900, - 1.362185081855915600, 1.361904262651116900, 1.361623393372991300, - 1.361342474031866000, - 1.361061504638069400, 1.360780485201932300, 1.360499415733786400, - 1.360218296243966200, - 1.359937126742807300, 1.359655907240648000, 1.359374637747827700, - 1.359093318274687800, - 1.358811948831571500, 1.358530529428824400, 1.358249060076792900, - 1.357967540785826300, - 1.357685971566275200, 1.357404352428492000, 1.357122683382830900, - 1.356840964439648200, - 1.356559195609301700, 1.356277376902151900, 1.355995508328559500, - 1.355713589898888800, - 1.355431621623504700, 1.355149603512774400, 1.354867535577067200, - 1.354585417826753800, - 1.354303250272206500, 1.354021032923800300, 1.353738765791911100, - 1.353456448886917200, - 1.353174082219199100, 1.352891665799137900, 1.352609199637117500, - 1.352326683743523300, - 1.352044118128742600, 1.351761502803164900, 1.351478837777180700, - 1.351196123061183100, - 1.350913358665566400, 1.350630544600727200, 1.350347680877063800, - 1.350064767504976400, - 1.349781804494866600, 1.349498791857138400, 1.349215729602197400, - 1.348932617740450600, - 1.348649456282307700, 1.348366245238179500, 1.348082984618478800, - 1.347799674433620500, - 1.347516314694020800, 1.347232905410098200, 1.346949446592273100, - 1.346665938250967100, - 1.346382380396604000, 1.346098773039609700, 1.345815116190411300, - 1.345531409859438200, - 1.345247654057121700, 1.344963848793894200, 1.344679994080190800, - 1.344396089926448000, - 1.344112136343103900, 1.343828133340598800, 1.343544080929374800, - 1.343259979119875600, - 1.342975827922546600, 1.342691627347835500, 1.342407377406191500, - 1.342123078108065700, - 1.341838729463910900, 1.341554331484181600, 1.341269884179334700, - 1.340985387559828100, - 1.340700841636122400, 1.340416246418678800, 1.340131601917961900, - 1.339846908144436600, - 1.339562165108570700, 1.339277372820833400, 1.338992531291695500, - 1.338707640531629800, - 1.338422700551110900, 1.338137711360615200, 1.337852672970621300, - 1.337567585391608900, - 1.337282448634059800, 1.336997262708457900, 1.336712027625288600, - 1.336426743395039000, - 1.336141410028198500, 1.335856027535258000, 1.335570595926709700, - 1.335285115213048500, - 1.334999585404770700, 1.334714006512374400, 1.334428378546359500, - 1.334142701517227600, - 1.333856975435482300, 1.333571200311629100, 1.333285376156174700, - 1.332999502979628700, - 1.332713580792501500, 1.332427609605305400, 1.332141589428554900, - 1.331855520272766200, - 1.331569402148457400, 1.331283235066148100, 1.330997019036359800, - 1.330710754069615700, - 1.330424440176441300, 1.330138077367363200, 1.329851665652910500, - 1.329565205043613800, - 1.329278695550004700, 1.328992137182618100, 1.328705529951989400, - 1.328418873868656900, - 1.328132168943159800, 1.327845415186039000, 1.327558612607838500, - 1.327271761219102500, - 1.326984861030378000, 1.326697912052213500, 1.326410914295159400, - 1.326123867769767500, - 1.325836772486591800, 1.325549628456188100, 1.325262435689113600, - 1.324975194195928000, - 1.324687903987191900, 1.324400565073468300, 1.324113177465321900, - 1.323825741173318700, - 1.323538256208027800, 1.323250722580018500, 1.322963140299862500, - 1.322675509378133900, - 1.322387829825407700, 1.322100101652261100, 1.321812324869273500, - 1.321524499487024800, - 1.321236625516098100, 1.320948702967077400, 1.320660731850549000, - 1.320372712177100700, - 1.320084643957322400, 1.319796527201805300, 1.319508361921142500, - 1.319220148125929100, - 1.318931885826762000, 1.318643575034239800, 1.318355215758962900, - 1.318066808011533200, - 1.317778351802554800, 1.317489847142633300, 1.317201294042376300, - 1.316912692512393300, - 1.316624042563294900, 1.316335344205694200, 1.316046597450205800, - 1.315757802307445900, - 1.315468958788033000, 1.315180066902586800, 1.314891126661728900, - 1.314602138076083300, - 1.314313101156274800, 1.314024015912930600, 1.313734882356679900, - 1.313445700498152800, - 1.313156470347981900, 1.312867191916801100, 1.312577865215246900, - 1.312288490253956900, - 1.311999067043570200, 1.311709595594728000, 1.311420075918073900, - 1.311130508024252400, - 1.310840891923910100, 1.310551227627695400, 1.310261515146258200, - 1.309971754490250700, - 1.309681945670326400, 1.309392088697140900, 1.309102183581351200, - 1.308812230333616500, - 1.308522228964597500, 1.308232179484956500, 1.307942081905358000, - 1.307651936236467800, - 1.307361742488954300, 1.307071500673486800, 1.306781210800736200, - 1.306490872881376200, - 1.306200486926081700, 1.305910052945529200, 1.305619570950396800, - 1.305329040951365100, - 1.305038462959116100, 1.304747836984333300, 1.304457163037702200, - 1.304166441129910300, - 1.303875671271646400, 1.303584853473601200, 1.303293987746467300, - 1.303003074100939100, - 1.302712112547712800, 1.302421103097485900, 1.302130045760958100, - 1.301838940548830600, - 1.301547787471806900, 1.301256586540591600, 1.300965337765891600, - 1.300674041158414800, - 1.300382696728871400, 1.300091304487973800, 1.299799864446435200, - 1.299508376614971500, - 1.299216841004299200, 1.298925257625137800, 1.298633626488207500, - 1.298341947604231300, - 1.298050220983932900, 1.297758446638038700, 1.297466624577275900, - 1.297174754812374400, - 1.296882837354065100, 1.296590872213081200, 1.296298859400157700, - 1.296006798926030200, - 1.295714690801437600, 1.295422535037119800, 1.295130331643818500, - 1.294838080632277000, - 1.294545782013240900, 1.294253435797456900, 1.293961041995673700, - 1.293668600618642000, - 1.293376111677113900, 1.293083575181843500, 1.292790991143586200, - 1.292498359573099700, - 1.292205680481143500, 1.291912953878477900, 1.291620179775866400, - 1.291327358184073200, - 1.291034489113864100, 1.290741572576007400, 1.290448608581273000, - 1.290155597140431700, - 1.289862538264257700, 1.289569431963524900, 1.289276278249010600, - 1.288983077131493000, - 1.288689828621752300, 1.288396532730570400, 1.288103189468731400, - 1.287809798847019800, - 1.287516360876223500, 1.287222875567130900, 1.286929342930532800, - 1.286635762977221800, - 1.286342135717991600, 1.286048461163638000, 1.285754739324958900, - 1.285460970212753500, - 1.285167153837822900, 1.284873290210969900, 1.284579379342998700, - 1.284285421244715900, - 1.283991415926929400, 1.283697363400448900, 1.283403263676086100, - 1.283109116764654000, - 1.282814922676967400, 1.282520681423843000, 1.282226393016099500, - 1.281932057464557000, - 1.281637674780037100, 1.281343244973363700, 1.281048768055361900, - 1.280754244036858900, - 1.280459672928683500, 1.280165054741666300, 1.279870389486639400, - 1.279575677174437100, - 1.279280917815894600, 1.278986111421849900, 1.278691258003142000, - 1.278396357570611900, - 1.278101410135101800, 1.277806415707456700, 1.277511374298522200, - 1.277216285919146500, - 1.276921150580179200, 1.276625968292471000, 1.276330739066875400, - 1.276035462914247000, - 1.275740139845442400, 1.275444769871319600, 1.275149353002738700, - 1.274853889250561200, - 1.274558378625650200, 1.274262821138871300, 1.273967216801090900, - 1.273671565623178100, - 1.273375867616002300, 1.273080122790436000, 1.272784331157352800, - 1.272488492727628100, - 1.272192607512139300, 1.271896675521764900, 1.271600696767385400, - 1.271304671259883200, - 1.271008599010142500, 1.270712480029048800, 1.270416314327489800, - 1.270120101916354600, - 1.269823842806533800, 1.269527537008920300, 1.269231184534408200, - 1.268934785393893700, - 1.268638339598274500, 1.268341847158450200, 1.268045308085321800, - 1.267748722389792100, - 1.267452090082765900, 1.267155411175149500, 1.266858685677851000, - 1.266561913601780100, - 1.266265094957848000, 1.265968229756968100, 1.265671318010055400, - 1.265374359728026500, - 1.265077354921799300, 1.264780303602294200, 1.264483205780432700, - 1.264186061467138500, - 1.263888870673336400, 1.263591633409954000, 1.263294349687918800, - 1.262997019518161700, - 1.262699642911614600, 1.262402219879211300, 1.262104750431887000, - 1.261807234580578900, - 1.261509672336225600, 1.261212063709767900, 1.260914408712147800, - 1.260616707354309500, - 1.260318959647198400, 1.260021165601761900, 1.259723325228949000, - 1.259425438539710300, - 1.259127505544998600, 1.258829526255768000, 1.258531500682973800, - 1.258233428837574300, - 1.257935310730528000, 1.257637146372796400, 1.257338935775342200, - 1.257040678949129500, - 1.256742375905124400, 1.256444026654294400, 1.256145631207609400, - 1.255847189576040100, - 1.255548701770560000, 1.255250167802143000, 1.254951587681765600, - 1.254652961420405600, - 1.254354289029042900, 1.254055570518658500, 1.253756805900235700, - 1.253457995184759300, - 1.253159138383215200, 1.252860235506592100, 1.252561286565879300, - 1.252262291572068900, - 1.251963250536153500, 1.251664163469128300, 1.251365030381989700, - 1.251065851285736200, - 1.250766626191367500, 1.250467355109885500, 1.250168038052293500, - 1.249868675029596200, - 1.249569266052800800, 1.249269811132915200, 1.248970310280950200, - 1.248670763507917100, - 1.248371170824829300, 1.248071532242702100, 1.247771847772552300, - 1.247472117425398700, - 1.247172341212261500, 1.246872519144162300, 1.246572651232124700, - 1.246272737487174300, - 1.245972777920338000, 1.245672772542644400, 1.245372721365123600, - 1.245072624398807900, - 1.244772481654731000, 1.244472293143928300, 1.244172058877436800, - 1.243871778866295400, - 1.243571453121544000, 1.243271081654225400, 1.242970664475383100, - 1.242670201596062700, - 1.242369693027311200, 1.242069138780177400, 1.241768538865712000, - 1.241467893294967200, - 1.241167202078996800, 1.240866465228856100, 1.240565682755603100, - 1.240264854670295900, - 1.239963980983995300, 1.239663061707763700, 1.239362096852665300, - 1.239061086429765300, - 1.238760030450130900, 1.238458928924831600, 1.238157781864937400, - 1.237856589281521000, - 1.237555351185656500, 1.237254067588419400, 1.236952738500886900, - 1.236651363934138300, - 1.236349943899254000, 1.236048478407316500, 1.235746967469409900, - 1.235445411096619500, - 1.235143809300033300, 1.234842162090739700, 1.234540469479829900, - 1.234238731478396000, - 1.233936948097532400, 1.233635119348334400, 1.233333245241899200, - 1.233031325789326400, - 1.232729361001716500, 1.232427350890172000, 1.232125295465796600, - 1.231823194739696300, - 1.231521048722978200, 1.231218857426751700, 1.230916620862127400, - 1.230614339040217800, - 1.230312011972136500, 1.230009639668999500, 1.229707222141924100, - 1.229404759402029400, - 1.229102251460436400, 1.228799698328266700, 1.228497100016644900, - 1.228194456536696500, - 1.227891767899548700, 1.227589034116330700, 1.227286255198173100, - 1.226983431156208200, - 1.226680562001569900, 1.226377647745394000, 1.226074688398817600, - 1.225771683972980200, - 1.225468634479021500, 1.225165539928084300, 1.224862400331312400, - 1.224559215699851500, - 1.224255986044848500, 1.223952711377453100, 1.223649391708814700, - 1.223346027050086400, - 1.223042617412421600, 1.222739162806975900, 1.222435663244906700, - 1.222132118737372400, - 1.221828529295533800, 1.221524894930552800, 1.221221215653593100, - 1.220917491475820500, - 1.220613722408401900, 1.220309908462505800, 1.220006049649302800, - 1.219702145979964600, - 1.219398197465665400, 1.219094204117580300, 1.218790165946886100, - 1.218486082964761500, - 1.218181955182386500, 1.217877782610943700, 1.217573565261616000, - 1.217269303145589000, - 1.216964996274049400, 1.216660644658185600, 1.216356248309187600, - 1.216051807238247800, - 1.215747321456559300, 1.215442790975316700, 1.215138215805717300, - 1.214833595958959300, - 1.214528931446242600, 1.214224222278769100, 1.213919468467741900, - 1.213614670024366000, - 1.213309826959847700, 1.213004939285395400, 1.212700007012219100, - 1.212395030151530300, - 1.212090008714541600, 1.211784942712468300, 1.211479832156526800, - 1.211174677057934800, - 1.210869477427912300, 1.210564233277680500, 1.210258944618462200, - 1.209953611461482200, - 1.209648233817966600, 1.209342811699143600, 1.209037345116242400, - 1.208731834080493800, - 1.208426278603131200, 1.208120678695388600, 1.207815034368502100, - 1.207509345633709600, - 1.207203612502250300, 1.206897834985365000, 1.206592013094296200, - 1.206286146840288300, - 1.205980236234587100, 1.205674281288440000, 1.205368282013096200, - 1.205062238419806200, - 1.204756150519822300, 1.204450018324398900, 1.204143841844791200, - 1.203837621092256800, - 1.203531356078054100, 1.203225046813444000, 1.202918693309688300, - 1.202612295578050900, - 1.202305853629797500, 1.201999367476194400, 1.201692837128510700, - 1.201386262598016500, - 1.201079643895983700, 1.200772981033685800, 1.200466274022397900, - 1.200159522873396800, - 1.199852727597960700, 1.199545888207369700, 1.199239004712905300, - 1.198932077125851100, - 1.198625105457491700, 1.198318089719113200, 1.198011029922004400, - 1.197703926077454200, - 1.197396778196754700, 1.197089586291198500, 1.196782350372080300, - 1.196475070450696100, - 1.196167746538343600, 1.195860378646322700, 1.195552966785933900, - 1.195245510968480300, - 1.194938011205265900, 1.194630467507596500, 1.194322879886780000, - 1.194015248354125100, - 1.193707572920943000, 1.193399853598545500, 1.193092090398246900, - 1.192784283331362700, - 1.192476432409210100, 1.192168537643107900, 1.191860599044376500, - 1.191552616624337800, - 1.191244590394315400, 1.190936520365635000, 1.190628406549622900, - 1.190320248957608100, - 1.190012047600920200, 1.189703802490891000, 1.189395513638853900, - 1.189087181056143900, - 1.188778804754097300, 1.188470384744052100, 1.188161921037348400, - 1.187853413645327100, - 1.187544862579331500, 1.187236267850706000, 1.186927629470796900, - 1.186618947450951600, - 1.186310221802519900, 1.186001452536852300, 1.185692639665301600, - 1.185383783199222000, - 1.185074883149969100, 1.184765939528900500, 1.184456952347374900, - 1.184147921616753200, - 1.183838847348397400, 1.183529729553671500, 1.183220568243940300, - 1.182911363430571200, - 1.182602115124932900, 1.182292823338395100, 1.181983488082330300, - 1.181674109368111300, - 1.181364687207113100, 1.181055221610712400, 1.180745712590287400, - 1.180436160157217800, - 1.180126564322885100, 1.179816925098671900, 1.179507242495962900, - 1.179197516526144600, - 1.178887747200604300, 1.178577934530731700, 1.178268078527917200, - 1.177958179203553800, - 1.177648236569035300, 1.177338250635757700, 1.177028221415118200, - 1.176718148918515700, - 1.176408033157350300, 1.176097874143024600, 1.175787671886942000, - 1.175477426400507700, - 1.175167137695128900, 1.174856805782213500, 1.174546430673171900, - 1.174236012379415600, - 1.173925550912357800, 1.173615046283413200, 1.173304498503998400, - 1.172993907585530900, - 1.172683273539430800, 1.172372596377118800, 1.172061876110017700, - 1.171751112749551900, - 1.171440306307147200, 1.171129456794231200, 1.170818564222232800, - 1.170507628602582800, - 1.170196649946713100, 1.169885628266057900, 1.169574563572052300, - 1.169263455876133200, - 1.168952305189739200, 1.168641111524310700, 1.168329874891289400, - 1.168018595302118000, - 1.167707272768241800, 1.167395907301107100, 1.167084498912162300, - 1.166773047612856400, - 1.166461553414641000, 1.166150016328968600, 1.165838436367293800, - 1.165526813541072100, - 1.165215147861761400, 1.164903439340820900, 1.164591687989710500, - 1.164279893819892800, - 1.163968056842831700, 1.163656177069992500, 1.163344254512841800, - 1.163032289182848800, - 1.162720281091483000, 1.162408230250216100, 1.162096136670521600, - 1.161784000363874000, - 1.161471821341749900, 1.161159599615627000, 1.160847335196984800, - 1.160535028097304600, - 1.160222678328068700, 1.159910285900761700, 1.159597850826869200, - 1.159285373117878500, - 1.158972852785278500, 1.158660289840559800, 1.158347684295214300, - 1.158035036160735900, - 1.157722345448619400, 1.157409612170361600, 1.157096836337461000, - 1.156784017961417500, - 1.156471157053732300, 1.156158253625908700, 1.155845307689450800, - 1.155532319255865300, - 1.155219288336659400, 1.154906214943342700, 1.154593099087426000, - 1.154279940780421400, - 1.153966740033842900, 1.153653496859206000, 1.153340211268028000, - 1.153026883271827300, - 1.152713512882124400, 1.152400100110440700, 1.152086644968299400, - 1.151773147467225300, - 1.151459607618745300, 1.151146025434387000, 1.150832400925680100, - 1.150518734104155400, - 1.150205024981345800, 1.149891273568785400, 1.149577479878009800, - 1.149263643920556800, - 1.148949765707964600, 1.148635845251773800, 1.148321882563526400, - 1.148007877654766200, - 1.147693830537038100, 1.147379741221888500, 1.147065609720865600, - 1.146751436045519300, - 1.146437220207400700, 1.146122962218062600, 1.145808662089060000, - 1.145494319831947800, - 1.145179935458284100, 1.144865508979627800, 1.144551040407539400, - 1.144236529753581000, - 1.143921977029316500, 1.143607382246310600, 1.143292745416130600, - 1.142978066550344400, - 1.142663345660522000, 1.142348582758234900, 1.142033777855056000, - 1.141718930962559500, - 1.141404042092321500, 1.141089111255919800, 1.140774138464933700, - 1.140459123730943200, - 1.140144067065530700, 1.139828968480280300, 1.139513827986776900, - 1.139198645596607400, - 1.138883421321360600, 1.138568155172625700, 1.138252847161994400, - 1.137937497301059600, - 1.137622105601416000, 1.137306672074659900, 1.136991196732388200, - 1.136675679586200500, - 1.136360120647697200, 1.136044519928480800, 1.135728877440154800, - 1.135413193194324800, - 1.135097467202597100, 1.134781699476580300, 1.134465890027884300, - 1.134150038868120500, - 1.133834146008902100, 1.133518211461843200, 1.133202235238559800, - 1.132886217350669500, - 1.132570157809791500, 1.132254056627546300, 1.131937913815556300, - 1.131621729385444900, - 1.131305503348837300, 1.130989235717360100, 1.130672926502642100, - 1.130356575716312500, - 1.130040183370002900, 1.129723749475346000, 1.129407274043976200, - 1.129090757087529500, - 1.128774198617643200, 1.128457598645956600, 1.128140957184109700, - 1.127824274243744500, - 1.127507549836505000, 1.127190783974035800, 1.126873976667983800, - 1.126557127929996800, - 1.126240237771724700, 1.125923306204818400, 1.125606333240930700, - 1.125289318891715900, - 1.124972263168829500, 1.124655166083928800, 1.124338027648672500, - 1.124020847874721100, - 1.123703626773736100, 1.123386364357381200, 1.123069060637320600, - 1.122751715625221400, - 1.122434329332750800, 1.122116901771578400, 1.121799432953375600, - 1.121481922889814300, - 1.121164371592568300, 1.120846779073313400, 1.120529145343726500, - 1.120211470415486200, - 1.119893754300272300, 1.119575997009766300, 1.119258198555651300, - 1.118940358949611900, - 1.118622478203333800, 1.118304556328505200, 1.117986593336814700, - 1.117668589239953200, - 1.117350544049612300, 1.117032457777486200, 1.116714330435269600, - 1.116396162034659600, - 1.116077952587353600, 1.115759702105052000, 1.115441410599455500, - 1.115123078082267000, - 1.114804704565190500, 1.114486290059931900, 1.114167834578198200, - 1.113849338131698300, - 1.113530800732142100, 1.113212222391241500, 1.112893603120710000, - 1.112574942932261600, - 1.112256241837613000, 1.111937499848481900, 1.111618716976587700, - 1.111299893233650600, - 1.110981028631393700, 1.110662123181539900, 1.110343176895814500, - 1.110024189785944900, - 1.109705161863658600, 1.109386093140686000, 1.109066983628758100, - 1.108747833339607200, - 1.108428642284968100, 1.108109410476576300, 1.107790137926169200, - 1.107470824645485600, - 1.107151470646265300, 1.106832075940250600, 1.106512640539184100, - 1.106193164454811100, - 1.105873647698877300, 1.105554090283131100, 1.105234492219321100, - 1.104914853519198400, - 1.104595174194514800, 1.104275454257024300, 1.103955693718482200, - 1.103635892590644900, - 1.103316050885270600, 1.102996168614119000, 1.102676245788951400, - 1.102356282421530300, - 1.102036278523620000, 1.101716234106985700, 1.101396149183395000, - 1.101076023764616400, - 1.100755857862419700, 1.100435651488577100, 1.100115404654861100, - 1.099795117373046200, - 1.099474789654909100, 1.099154421512226600, 1.098834012956778200, - 1.098513564000344300, - 1.098193074654706800, 1.097872544931649100, 1.097551974842956500, - 1.097231364400415000, - 1.096910713615813200, 1.096590022500939700, 1.096269291067585700, - 1.095948519327543800, - 1.095627707292607700, 1.095306854974572800, 1.094985962385235800, - 1.094665029536395100, - 1.094344056439850600, 1.094023043107403200, 1.093701989550856000, - 1.093380895782013000, - 1.093059761812680100, 1.092738587654664300, 1.092417373319774200, - 1.092096118819820200, - 1.091774824166613600, 1.091453489371968100, 1.091132114447697300, - 1.090810699405617900, - 1.090489244257547300, 1.090167749015304300, 1.089846213690709900, - 1.089524638295585400, - 1.089203022841754400, 1.088881367341041800, 1.088559671805274100, - 1.088237936246279100, - 1.087916160675885800, 1.087594345105925300, 1.087272489548229700, - 1.086950594014632700, - 1.086628658516969500, 1.086306683067076900, 1.085984667676792600, - 1.085662612357956500, - 1.085340517122409800, 1.085018381981994500, 1.084696206948555300, - 1.084373992033937000, - 1.084051737249986900, 1.083729442608553300, 1.083407108121486000, - 1.083084733800636200, - 1.082762319657857100, 1.082439865705002500, 1.082117371953928300, - 1.081794838416491700, - 1.081472265104551200, 1.081149652029967000, 1.080826999204601100, - 1.080504306640315500, - 1.080181574348975500, 1.079858802342446900, 1.079535990632596800, - 1.079213139231294500, - 1.078890248150409700, 1.078567317401815100, 1.078244346997383300, - 1.077921336948988600, - 1.077598287268508400, 1.077275197967819000, 1.076952069058800400, - 1.076628900553332700, - 1.076305692463297900, 1.075982444800579700, 1.075659157577062200, - 1.075335830804633000, - 1.075012464495178800, 1.074689058660589700, 1.074365613312755900, - 1.074042128463569500, - 1.073718604124924500, 1.073395040308715400, 1.073071437026839500, - 1.072747794291194300, - 1.072424112113678600, 1.072100390506194500, 1.071776629480643500, - 1.071452829048929800, - 1.071128989222958500, 1.070805110014635900, 1.070481191435870500, - 1.070157233498571600, - 1.069833236214650800, 1.069509199596019800, 1.069185123654592600, - 1.068861008402285200, - 1.068536853851013600, 1.068212660012696700, 1.067888426899253500, - 1.067564154522606000, - 1.067239842894676100, 1.066915492027387600, 1.066591101932666800, - 1.066266672622439700, - 1.065942204108635300, 1.065617696403183400, 1.065293149518014500, - 1.064968563465062100, - 1.064643938256259400, 1.064319273903543000, 1.063994570418849400, - 1.063669827814116300, - 1.063345046101285000, 1.063020225292295300, 1.062695365399091200, - 1.062370466433616400, - 1.062045528407815900, 1.061720551333637600, 1.061395535223029500, - 1.061070480087941800, - 1.060745385940325500, 1.060420252792134000, 1.060095080655320900, - 1.059769869541841800, - 1.059444619463654400, 1.059119330432716700, 1.058794002460989000, - 1.058468635560432500, - 1.058143229743009600, 1.057817785020685100, 1.057492301405424500, - 1.057166778909195000, - 1.056841217543965200, 1.056515617321704500, 1.056189978254385100, - 1.055864300353978900, - 1.055538583632461100, 1.055212828101807200, 1.054887033773993300, - 1.054561200660999200, - 1.054235328774803900, 1.053909418127389400, 1.053583468730738200, - 1.053257480596834700, - 1.052931453737664600, 1.052605388165214700, 1.052279283891473600, - 1.051953140928431100, - 1.051626959288079100, 1.051300738982409800, 1.050974480023417500, - 1.050648182423098000, - 1.050321846193448000, 1.049995471346466300, 1.049669057894152800, - 1.049342605848508200, - 1.049016115221536000, 1.048689586025239700, 1.048363018271625300, - 1.048036411972699500, - 1.047709767140470500, 1.047383083786948700, 1.047056361924144400, - 1.046729601564071200, - 1.046402802718742400, 1.046075965400174300, 1.045749089620383200, - 1.045422175391386800, - 1.045095222725206200, 1.044768231633861100, 1.044441202129375200, - 1.044114134223771900, - 1.043787027929076000, 1.043459883257315400, 1.043132700220517300, - 1.042805478830712200, - 1.042478219099930400, 1.042150921040204200, 1.041823584663568200, - 1.041496209982056600, - 1.041168797007707000, 1.040841345752557200, 1.040513856228645800, - 1.040186328448014800, - 1.039858762422705600, 1.039531158164762400, 1.039203515686230000, - 1.038875834999155100, - 1.038548116115585800, 1.038220359047570500, 1.037892563807160800, - 1.037564730406408200, - 1.037236858857366600, 1.036908949172090900, 1.036581001362636600, - 1.036253015441062700, - 1.035924991419427100, 1.035596929309791300, 1.035268829124216700, - 1.034940690874766300, - 1.034612514573505700, 1.034284300232500000, 1.033956047863817500, - 1.033627757479526700, - 1.033299429091697700, 1.032971062712402700, 1.032642658353714300, - 1.032314216027707700, - 1.031985735746457900, 1.031657217522042900, 1.031328661366541300, - 1.031000067292032300, - 1.030671435310598600, 1.030342765434322200, 1.030014057675287900, - 1.029685312045581100, - 1.029356528557288300, 1.029027707222499100, 1.028698848053302100, - 1.028369951061789600, - 1.028041016260053500, 1.027712043660187600, 1.027383033274288400, - 1.027053985114451100, - 1.026724899192775300, 1.026395775521359500, 1.026066614112305600, - 1.025737414977715200, - 1.025408178129692000, 1.025078903580341600, 1.024749591341769700, - 1.024420241426085200, - 1.024090853845396800, 1.023761428611814600, 1.023431965737451800, - 1.023102465234420700, - 1.022772927114837100, 1.022443351390816400, 1.022113738074476300, - 1.021784087177936000, - 1.021454398713315600, 1.021124672692737000, 1.020794909128323000, - 1.020465108032198300, - 1.020135269416488700, 1.019805393293321100, 1.019475479674824900, - 1.019145528573129000, - 1.018815540000365800, 1.018485513968667500, 1.018155450490168000, - 1.017825349577003300, - 1.017495211241309800, 1.017165035495226400, 1.016834822350892300, - 1.016504571820448000, - 1.016174283916036800, 1.015843958649801600, 1.015513596033888400, - 1.015183196080442900, - 1.014852758801613200, 1.014522284209548900, 1.014191772316400000, - 1.013861223134318900, - 1.013530636675459100, 1.013200012951974700, 1.012869351976022300, - 1.012538653759758900, - 1.012207918315344300, 1.011877145654937400, 1.011546335790700600, - 1.011215488734796800, - 1.010884604499389800, 1.010553683096645900, 1.010222724538731600, - 1.009891728837815700, - 1.009560696006067900, 1.009229626055658800, 1.008898518998761800, - 1.008567374847549900, - 1.008236193614199000, 1.007904975310885300, 1.007573719949786700, - 1.007242427543082900, - 1.006911098102953900, 1.006579731641582500, 1.006248328171152100, - 1.005916887703846500, - 1.005585410251852700, 1.005253895827357800, 1.004922344442551000, - 1.004590756109621900, - 1.004259130840762700, 1.003927468648166100, 1.003595769544025900, - 1.003264033540538500, - 1.002932260649900000, 1.002600450884309800, 1.002268604255967200, - 1.001936720777072400, - 1.001604800459829000, 1.001272843316440000, 1.000940849359111000, - 1.000608818600048100, - 1.000276751051459200, 0.999944646725553720, 0.999612505634541740, - 0.999280327790635690, - 0.998948113206048590, 0.998615861892994560, 0.998283573863690270, - 0.997951249130352380, - 0.997618887705200020, 0.997286489600452630, 0.996954054828332210, - 0.996621583401061110, - 0.996289075330862860, 0.995956530629963810, 0.995623949310589620, - 0.995291331384969390, - 0.994958676865332010, 0.994625985763907820, 0.994293258092929790, - 0.993960493864630480, - 0.993627693091245660, 0.993294855785010760, 0.992961981958163210, - 0.992629071622942340, - 0.992296124791587690, 0.991963141476341460, 0.991630121689446090, - 0.991297065443145440, - 0.990963972749685840, 0.990630843621313260, 0.990297678070276800, - 0.989964476108825210, - 0.989631237749210020, 0.989297963003683330, 0.988964651884498000, - 0.988631304403909890, - 0.988297920574174430, 0.987964500407549910, 0.987631043916294970, - 0.987297551112669370, - 0.986964022008935520, 0.986630456617355380, 0.986296854950194260, - 0.985963217019717120, - 0.985629542838190490, 0.985295832417883540, 0.984962085771065030, - 0.984628302910006580, - 0.984294483846980150, 0.983960628594258810, 0.983626737164118190, - 0.983292809568833910, - 0.982958845820684270, 0.982624845931947320, 0.982290809914904140, - 0.981956737781835790, - 0.981622629545024770, 0.981288485216756160, 0.980954304809314670, - 0.980620088334987930, - 0.980285835806063770, 0.979951547234831130, 0.979617222633581860, - 0.979282862014607240, - 0.978948465390201530, 0.978614032772659240, 0.978279564174275860, - 0.977945059607349900, - 0.977610519084179290, 0.977275942617064740, 0.976941330218307540, - 0.976606681900209830, - 0.976271997675076550, 0.975937277555212310, 0.975602521552924600, - 0.975267729680520560, - 0.974932901950310350, 0.974598038374604350, 0.974263138965714040, - 0.973928203735953460, - 0.973593232697636530, 0.973258225863079970, 0.972923183244600480, - 0.972588104854516410, - 0.972252990705148370, 0.971917840808816710, 0.971582655177844700, - 0.971247433824555920, - 0.970912176761274950, 0.970576884000329040, 0.970241555554045230, - 0.969906191434753320, - 0.969570791654783330, 0.969235356226466500, 0.968899885162136650, - 0.968564378474127350, - 0.968228836174775060, 0.967893258276415700, 0.967557644791388500, - 0.967221995732032490, - 0.966886311110688230, 0.966550590939698640, 0.966214835231406500, - 0.965879043998157160, - 0.965543217252296420, 0.965207355006171270, 0.964871457272131190, - 0.964535524062525410, - 0.964199555389706030, 0.963863551266025300, 0.963527511703836660, - 0.963191436715496120, - 0.962855326313359350, 0.962519180509785130, 0.962182999317132030, - 0.961846782747760140, - 0.961510530814032040, 0.961174243528309820, 0.960837920902958720, - 0.960501562950343390, - 0.960165169682831830, 0.959828741112791590, 0.959492277252591900, - 0.959155778114604400, - 0.958819243711200310, 0.958482674054753960, 0.958146069157639560, - 0.957809429032232760, - 0.957472753690911670, 0.957136043146054050, 0.956799297410040440, - 0.956462516495251940, - 0.956125700414070300, 0.955788849178880300, 0.955451962802066120, - 0.955115041296014880, - 0.954778084673113870, 0.954441092945751630, 0.954104066126319150, - 0.953767004227207060, - 0.953429907260809120, 0.953092775239518630, 0.952755608175731570, - 0.952418406081844360, - 0.952081168970254520, 0.951743896853362140, 0.951406589743566950, - 0.951069247653271500, - 0.950731870594878510, 0.950394458580791970, 0.950057011623418380, - 0.949719529735163940, - 0.949382012928437600, 0.949044461215648560, 0.948706874609207220, - 0.948369253121526420, - 0.948031596765018910, 0.947693905552099870, 0.947356179495185020, - 0.947018418606691230, - 0.946680622899037650, 0.946342792384643360, 0.946004927075930090, - 0.945667026985319680, - 0.945329092125236190, 0.944991122508104350, 0.944653118146349890, - 0.944315079052401090, - 0.943977005238685770, 0.943638896717634900, 0.943300753501679190, - 0.942962575603250920, - 0.942624363034784580, 0.942286115808714690, 0.941947833937478270, - 0.941609517433512730, - 0.941271166309256450, 0.940932780577150460, 0.940594360249635500, - 0.940255905339155150, - 0.939917415858152920, 0.939578891819073720, 0.939240333234364950, - 0.938901740116473540, - 0.938563112477849630, 0.938224450330942590, 0.937885753688204820, - 0.937547022562088990, - 0.937208256965048840, 0.936869456909540490, 0.936530622408019990, - 0.936191753472946030, - 0.935852850116777430, 0.935513912351974450, 0.935174940190999560, - 0.934835933646314900, - 0.934496892730385720, 0.934157817455677160, 0.933818707834655590, - 0.933479563879790030, - 0.933140385603548840, 0.932801173018403480, 0.932461926136825660, - 0.932122644971287830, - 0.931783329534265240, 0.931443979838232900, 0.931104595895668410, - 0.930765177719049210, - 0.930425725320855430, 0.930086238713567440, 0.929746717909666790, - 0.929407162921637610, - 0.929067573761963250, 0.928727950443130500, 0.928388292977625930, - 0.928048601377937210, - 0.927708875656554800, 0.927369115825968480, 0.927029321898671270, - 0.926689493887155820, - 0.926349631803916270, 0.926009735661449170, 0.925669805472250860, - 0.925329841248820340, - 0.924989843003656610, 0.924649810749260110, 0.924309744498133750, - 0.923969644262779830, - 0.923629510055703820, 0.923289341889410480, 0.922949139776407800, - 0.922608903729203570, - 0.922268633760306990, 0.921928329882229390, 0.921587992107482210, - 0.921247620448579440, - 0.920907214918035070, 0.920566775528364410, 0.920226302292085460, - 0.919885795221715540, - 0.919545254329774850, 0.919204679628783720, 0.918864071131263780, - 0.918523428849739030, - 0.918182752796733110, 0.917842042984772340, 0.917501299426383480, - 0.917160522134094160, - 0.916819711120434700, 0.916478866397934850, 0.916137987979127270, - 0.915797075876544350, - 0.915456130102721200, 0.915115150670193110, 0.914774137591496510, - 0.914433090879170130, - 0.914092010545752620, 0.913750896603785280, 0.913409749065809520, - 0.913068567944367970, - 0.912727353252005710, 0.912386105001267270, 0.912044823204700370, - 0.911703507874852440, - 0.911362159024272310, 0.911020776665511290, 0.910679360811120000, - 0.910337911473652390, - 0.909996428665661990, 0.909654912399703860, 0.909313362688335290, - 0.908971779544113350, - 0.908630162979597760, 0.908288513007348140, 0.907946829639926790, - 0.907605112889895870, - 0.907263362769819000, 0.906921579292262250, 0.906579762469791110, - 0.906237912314974080, - 0.905896028840379560, 0.905554112058577170, 0.905212161982139160, - 0.904870178623637170, - 0.904528161995645670, 0.904186112110739510, 0.903844028981494190, - 0.903501912620488070, - 0.903159763040298880, 0.902817580253507450, 0.902475364272694370, - 0.902133115110441470, - 0.901790832779333250, 0.901448517291953520, 0.901106168660889110, - 0.900763786898726380, - 0.900421372018054500, 0.900078924031462610, 0.899736442951541320, - 0.899393928790883420, - 0.899051381562081310, 0.898708801277730340, 0.898366187950425780, - 0.898023541592764210, - 0.897680862217344440, 0.897338149836764960, 0.896995404463627350, - 0.896652626110532870, - 0.896309814790084090, 0.895966970514885940, 0.895624093297543110, - 0.895281183150662960, - 0.894938240086852970, 0.894595264118721810, 0.894252255258880410, - 0.893909213519939460, - 0.893566138914512420, 0.893223031455212530, 0.892879891154655380, - 0.892536718025457090, - 0.892193512080234670, 0.891850273331607600, 0.891507001792195000, - 0.891163697474618880, - 0.890820360391500920, 0.890476990555464480, 0.890133587979135000, - 0.889790152675137610, - 0.889446684656100330, 0.889103183934650930, 0.888759650523418650, - 0.888416084435035060, - 0.888072485682131150, 0.887728854277341050, 0.887385190233298650, - 0.887041493562639060, - 0.886697764277999840, 0.886354002392018110, 0.886010207917333760, - 0.885666380866586560, - 0.885322521252418610, 0.884978629087472270, 0.884634704384391180, - 0.884290747155821230, - 0.883946757414407980, 0.883602735172799640, 0.883258680443644530, - 0.882914593239592320, - 0.882570473573294660, 0.882226321457403320, 0.881882136904572400, - 0.881537919927456340, - 0.881193670538710450, 0.880849388750992610, 0.880505074576960370, - 0.880160728029273920, - 0.879816349120593590, 0.879471937863580690, 0.879127494270899090, - 0.878783018355212220, - 0.878438510129186170, 0.878093969605486800, 0.877749396796782770, - 0.877404791715742370, - 0.877060154375035710, 0.876715484787334630, 0.876370782965310900, - 0.876026048921639160, - 0.875681282668993700, 0.875336484220050390, 0.874991653587487090, - 0.874646790783981660, - 0.874301895822214290, 0.873956968714865500, 0.873612009474616810, - 0.873267018114152300, - 0.872921994646155390, 0.872576939083312460, 0.872231851438309840, - 0.871886731723835020, - 0.871541579952577750, 0.871196396137227660, 0.870851180290476810, - 0.870505932425017060, - 0.870160652553543020, 0.869815340688749220, 0.869469996843331370, - 0.869124621029987670, - 0.868779213261415610, 0.868433773550315810, 0.868088301909388680, - 0.867742798351335720, - 0.867397262888861100, 0.867051695534668210, 0.866706096301463340, - 0.866360465201952980, - 0.866014802248844420, 0.865669107454847490, 0.865323380832671800, - 0.864977622395029290, - 0.864631832154632240, 0.864286010124194040, 0.863940156316430170, - 0.863594270744056040, - 0.863248353419789670, 0.862902404356348570, 0.862556423566453230, - 0.862210411062823810, - 0.861864366858181910, 0.861518290965251340, 0.861172183396755500, - 0.860826044165420630, - 0.860479873283972910, 0.860133670765139580, 0.859787436621650360, - 0.859441170866234390, - 0.859094873511623840, 0.858748544570550610, 0.858402184055747750, - 0.858055791979950740, - 0.857709368355894840, 0.857362913196317630, 0.857016426513956930, - 0.856669908321551650, - 0.856323358631843170, 0.855976777457572280, 0.855630164811482460, - 0.855283520706317080, - 0.854936845154821930, 0.854590138169742830, 0.854243399763827020, - 0.853896629949823630, - 0.853549828740481690, 0.853202996148552880, 0.852856132186788910, - 0.852509236867942440, - 0.852162310204768740, 0.851815352210022470, 0.851468362896461110, - 0.851121342276842110, - 0.850774290363923820, 0.850427207170467380, 0.850080092709233130, - 0.849732946992984290, - 0.849385770034483680, 0.849038561846496730, 0.848691322441788910, - 0.848344051833126780, - 0.847996750033279350, 0.847649417055015060, 0.847302052911105160, - 0.846954657614320980, - 0.846607231177434640, 0.846259773613221020, 0.845912284934454140, - 0.845564765153910990, - 0.845217214284368690, 0.844869632338605130, 0.844522019329400630, - 0.844174375269535320, - 0.843826700171791620, 0.843478994048952440, 0.843131256913801420, - 0.842783488779124570, - 0.842435689657707650, 0.842087859562339000, 0.841739998505806610, - 0.841392106500900900, - 0.841044183560412770, 0.840696229697133760, 0.840348244923857960, - 0.840000229253379030, - 0.839652182698493290, 0.839304105271996950, 0.838955996986687550, - 0.838607857855364740, - 0.838259687890827830, 0.837911487105878820, 0.837563255513319780, - 0.837214993125953600, - 0.836866699956585690, 0.836518376018021260, 0.836170021323067610, - 0.835821635884532730, - 0.835473219715225040, 0.835124772827955830, 0.834776295235535540, - 0.834427786950777460, - 0.834079247986494690, 0.833730678355502630, 0.833382078070616820, - 0.833033447144653880, - 0.832684785590432690, 0.832336093420771970, 0.831987370648492710, - 0.831638617286416190, - 0.831289833347364620, 0.830941018844162600, 0.830592173789634240, - 0.830243298196606360, - 0.829894392077905720, 0.829545455446360270, 0.829196488314800080, - 0.828847490696055010, - 0.828498462602957340, 0.828149404048339590, 0.827800315045035150, - 0.827451195605879990, - 0.827102045743709160, 0.826752865471360950, 0.826403654801672770, - 0.826054413747485010, - 0.825705142321637720, 0.825355840536972420, 0.825006508406332490, - 0.824657145942561230, - 0.824307753158504460, 0.823958330067008030, 0.823608876680918760, - 0.823259393013085820, - 0.822909879076357930, 0.822560334883586490, 0.822210760447622980, - 0.821861155781319800, - 0.821511520897531660, 0.821161855809112830, 0.820812160528920360, - 0.820462435069811090, - 0.820112679444643060, 0.819762893666276530, 0.819413077747571440, - 0.819063231701390170, - 0.818713355540594880, 0.818363449278050270, 0.818013512926620940, - 0.817663546499172720, - 0.817313550008573640, 0.816963523467691410, 0.816613466889396070, - 0.816263380286557980, - 0.815913263672048310, 0.815563117058740630, 0.815212940459508210, - 0.814862733887226740, - 0.814512497354771830, 0.814162230875020380, 0.813811934460851430, - 0.813461608125143560, - 0.813111251880778150, 0.812760865740636440, 0.812410449717600570, - 0.812060003824555230, - 0.811709528074384460, 0.811359022479975040, 0.811008487054213360, - 0.810657921809988410, - 0.810307326760189020, 0.809956701917705080, 0.809606047295428950, - 0.809255362906252440, - 0.808904648763069890, 0.808553904878775760, 0.808203131266265420, - 0.807852327938436750, - 0.807501494908186900, 0.807150632188415760, 0.806799739792023240, - 0.806448817731910130, - 0.806097866020979660, 0.805746884672134620, 0.805395873698280360, - 0.805044833112322000, - 0.804693762927166100, 0.804342663155721230, 0.803991533810895500, - 0.803640374905599810, - 0.803289186452744390, 0.802937968465242240, 0.802586720956006250, - 0.802235443937950320, - 0.801884137423990890, 0.801532801427043530, 0.801181435960026780, - 0.800830041035858750, - 0.800478616667459010, 0.800127162867749210, 0.799775679649650460, - 0.799424167026086540, - 0.799072625009981330, 0.798721053614259490, 0.798369452851848020, - 0.798017822735673680, - 0.797666163278665570, 0.797314474493752810, 0.796962756393865600, - 0.796611008991936490, - 0.796259232300897350, 0.795907426333682830, 0.795555591103226930, - 0.795203726622466520, - 0.794851832904338360, 0.794499909961779990, 0.794147957807731400, - 0.793795976455132220, - 0.793443965916924570, 0.793091926206050400, 0.792739857335452710, - 0.792387759318077150, - 0.792035632166868230, 0.791683475894773720, 0.791331290514740830, - 0.790979076039718180, - 0.790626832482656310, 0.790274559856505520, 0.789922258174218570, - 0.789569927448748320, - 0.789217567693048520, 0.788865178920075130, 0.788512761142783790, - 0.788160314374132590, - 0.787807838627079260, 0.787455333914584220, 0.787102800249607550, - 0.786750237645110430, - 0.786397646114056490, 0.786045025669408700, 0.785692376324132690, - 0.785339698091194080, - 0.784986990983559170, 0.784634255014197040, 0.784281490196075850, - 0.783928696542166680, - 0.783575874065440270, 0.783223022778868350, 0.782870142695425320, - 0.782517233828084580, - 0.782164296189822530, 0.781811329793615120, 0.781458334652439630, - 0.781105310779275470, - 0.780752258187101480, 0.780399176888899150, 0.780046066897649550, - 0.779692928226336290, - 0.779339760887942880, 0.778986564895453810, 0.778633340261856040, - 0.778280087000135730, - 0.777926805123281830, 0.777573494644283050, 0.777220155576129220, - 0.776866787931812410, - 0.776513391724324210, 0.776159966966658680, 0.775806513671809860, - 0.775453031852772920, - 0.775099521522545020, 0.774745982694123090, 0.774392415380506400, - 0.774038819594694230, - 0.773685195349686940, 0.773331542658487140, 0.772977861534096640, - 0.772624151989520280, - 0.772270414037761980, 0.771916647691828660, 0.771562852964726710, - 0.771209029869463940, - 0.770855178419050050, 0.770501298626494410, 0.770147390504808960, - 0.769793454067005500, - 0.769439489326096850, 0.769085496295098040, 0.768731474987023660, - 0.768377425414890850, - 0.768023347591716640, 0.767669241530518850, 0.767315107244318060, - 0.766960944746133740, - 0.766606754048988260, 0.766252535165903970, 0.765898288109903900, - 0.765544012894013530, - 0.765189709531257760, 0.764835378034664170, 0.764481018417259680, - 0.764126630692073870, - 0.763772214872136200, 0.763417770970477140, 0.763063299000129260, - 0.762708798974124800, - 0.762354270905498450, 0.761999714807284790, 0.761645130692519490, - 0.761290518574240350, - 0.760935878465484720, 0.760581210379292380, 0.760226514328703140, - 0.759871790326757670, - 0.759517038386499090, 0.759162258520969860, 0.758807450743214760, - 0.758452615066278920, - 0.758097751503208020, 0.757742860067050380, 0.757387940770853360, - 0.757032993627667290, - 0.756678018650541630, 0.756323015852528700, 0.755967985246680520, - 0.755612926846050080, - 0.755257840663692730, 0.754902726712663120, 0.754547585006018600, - 0.754192415556816380, - 0.753837218378114460, 0.753481993482973400, 0.753126740884452970, - 0.752771460595615500, - 0.752416152629523330, 0.752060816999239660, 0.751705453717829930, - 0.751350062798359140, - 0.750994644253894730, 0.750639198097504010, 0.750283724342255320, - 0.749928223001219310, - 0.749572694087465850, 0.749217137614067500, 0.748861553594096340, - 0.748505942040627040, - 0.748150302966733790, 0.747794636385492150, 0.747438942309979870, - 0.747083220753273820, - 0.746727471728453770, 0.746371695248599140, 0.746015891326790470, - 0.745660059976110400, - 0.745304201209641030, 0.744948315040467210, 0.744592401481673270, - 0.744236460546344850, - 0.743880492247569580, 0.743524496598434670, 0.743168473612029980, - 0.742812423301444810, - 0.742456345679769810, 0.742100240760097840, 0.741744108555520860, - 0.741387949079133860, - 0.741031762344030790, 0.740675548363308620, 0.740319307150063780, - 0.739963038717393880, - 0.739606743078398690, 0.739250420246177380, 0.738894070233831800, - 0.738537693054463370, - 0.738181288721174830, 0.737824857247070810, 0.737468398645255490, - 0.737111912928835710, - 0.736755400110918000, 0.736398860204609870, 0.736042293223021060, - 0.735685699179260850, - 0.735329078086440880, 0.734972429957672760, 0.734615754806068890, - 0.734259052644744230, - 0.733902323486812610, 0.733545567345390890, 0.733188784233595240, - 0.732831974164544150, - 0.732475137151356370, 0.732118273207151170, 0.731761382345050280, - 0.731404464578174760, - 0.731047519919648340, 0.730690548382594280, 0.730333549980137110, - 0.729976524725403530, - 0.729619472631519270, 0.729262393711613280, 0.728905287978813600, - 0.728548155446249730, - 0.728190996127053180, 0.727833810034354990, 0.727476597181288540, - 0.727119357580987220, - 0.726762091246585200, 0.726404798191218950, 0.726047478428024420, - 0.725690131970139980, - 0.725332758830703360, 0.724975359022855150, 0.724617932559735390, - 0.724260479454485130, - 0.723902999720247850, 0.723545493370166160, 0.723187960417385530, - 0.722830400875050790, - 0.722472814756308090, 0.722115202074305680, 0.721757562842191060, - 0.721399897073114470, - 0.721042204780225960, 0.720684485976676230, 0.720326740675618530, - 0.719968968890205230, - 0.719611170633591480, 0.719253345918932090, 0.718895494759382860, - 0.718537617168101610, - 0.718179713158245800, 0.717821782742975370, 0.717463825935449550, - 0.717105842748830160, - 0.716747833196278770, 0.716389797290958090, 0.716031735046032900, - 0.715673646474667140, - 0.715315531590027700, 0.714957390405280950, 0.714599222933594240, - 0.714241029188137260, - 0.713882809182079030, 0.713524562928591010, 0.713166290440844450, - 0.712807991732011590, - 0.712449666815266890, 0.712091315703784260, 0.711732938410739810, - 0.711374534949309800, - 0.711016105332671340, 0.710657649574003460, 0.710299167686484930, - 0.709940659683296890, - 0.709582125577619790, 0.709223565382636760, 0.708864979111530680, - 0.708506366777485130, - 0.708147728393686340, 0.707789063973319310, 0.707430373529572170, - 0.707071657075632460, - 0.706712914624688770, 0.706354146189931750, 0.705995351784551530, - 0.705636531421740880, - 0.705277685114692020, 0.704918812876598410, 0.704559914720655490, - 0.704200990660058150, - 0.703842040708003820, 0.703483064877689630, 0.703124063182313690, - 0.702765035635076310, - 0.702405982249177160, 0.702046903037818250, 0.701687798014201110, - 0.701328667191529980, - 0.700969510583008600, 0.700610328201841660, 0.700251120061236020, - 0.699891886174398130, - 0.699532626554536630, 0.699173341214860190, 0.698814030168578240, - 0.698454693428902320, - 0.698095331009043640, 0.697735942922215520, 0.697376529181631400, - 0.697017089800505250, - 0.696657624792053730, 0.696298134169492380, 0.695938617946039510, - 0.695579076134912990, - 0.695219508749331800, 0.694859915802517050, 0.694500297307689140, - 0.694140653278070950, - 0.693780983726884790, 0.693421288667355530, 0.693061568112707690, - 0.692701822076166820, - 0.692342050570960430, 0.691982253610315510, 0.691622431207461700, - 0.691262583375628180, - 0.690902710128045050, 0.690542811477944610, 0.690182887438558710, - 0.689822938023121220, - 0.689462963244866330, 0.689102963117028790, 0.688742937652845550, - 0.688382886865552930, - 0.688022810768389670, 0.687662709374594510, 0.687302582697406850, - 0.686942430750068330, - 0.686582253545819920, 0.686222051097905130, 0.685861823419566700, - 0.685501570524050140, - 0.685141292424600310, 0.684780989134463280, 0.684420660666887120, - 0.684060307035119440, - 0.683699928252410110, 0.683339524332008840, 0.682979095287166160, - 0.682618641131135020, - 0.682258161877167370, 0.681897657538517720, 0.681537128128440470, - 0.681176573660190910, - 0.680815994147026320, 0.680455389602203310, 0.680094760038981280, - 0.679734105470619080, - 0.679373425910376310, 0.679012721371515250, 0.678651991867297080, - 0.678291237410985510, - 0.677930458015843620, 0.677569653695137220, 0.677208824462131490, - 0.676847970330092700, - 0.676487091312289350, 0.676126187421989040, 0.675765258672461950, - 0.675404305076978020, - 0.675043326648808170, 0.674682323401225250, 0.674321295347501510, - 0.673960242500911690, - 0.673599164874730370, 0.673238062482232950, 0.672876935336696900, - 0.672515783451398950, - 0.672154606839618470, 0.671793405514634180, 0.671432179489727110, - 0.671070928778178090, - 0.670709653393269050, 0.670348353348283690, 0.669987028656505170, - 0.669625679331219300, - 0.669264305385711360, 0.668902906833267590, 0.668541483687176590, - 0.668180035960725840, - 0.667818563667205600, 0.667457066819905800, 0.667095545432117240, - 0.666733999517132860, - 0.666372429088244790, 0.666010834158747840, 0.665649214741936390, - 0.665287570851105680, - 0.664925902499553190, 0.664564209700575500, 0.664202492467472090, - 0.663840750813541210, - 0.663478984752084110, 0.663117194296401260, 0.662755379459794350, - 0.662393540255567070, - 0.662031676697022450, 0.661669788797465960, 0.661307876570202740, - 0.660945940028538900, - 0.660583979185782600, 0.660221994055241400, 0.659859984650225110, - 0.659497950984043510, - 0.659135893070007080, 0.658773810921428500, 0.658411704551619570, - 0.658049573973894850, - 0.657687419201568260, 0.657325240247955020, 0.656963037126372160, - 0.656600809850135910, - 0.656238558432565400, 0.655876282886978410, 0.655513983226695960, - 0.655151659465038060, - 0.654789311615326050, 0.654426939690883280, 0.654064543705032310, - 0.653702123671098150, - 0.653339679602405470, 0.652977211512280050, 0.652614719414049580, - 0.652252203321041060, - 0.651889663246583930, 0.651527099204007310, 0.651164511206641320, - 0.650801899267818060, - 0.650439263400868990, 0.650076603619127890, 0.649713919935928420, - 0.649351212364604910, - 0.648988480918494040, 0.648625725610931460, 0.648262946455255510, - 0.647900143464803730, - 0.647537316652916140, 0.647174466032932490, 0.646811591618193350, - 0.646448693422041360, - 0.646085771457818310, 0.645722825738868860, 0.645359856278536980, - 0.644996863090167570, - 0.644633846187107620, 0.644270805582703550, 0.643907741290304040, - 0.643544653323257610, - 0.643181541694913480, 0.642818406418622980, 0.642455247507736860, - 0.642092064975608220, - 0.641728858835589830, 0.641365629101035340, 0.641002375785300500, - 0.640639098901740200, - 0.640275798463712080, 0.639912474484572560, 0.639549126977681070, - 0.639185755956396480, - 0.638822361434078330, 0.638458943424088490, 0.638095501939787920, - 0.637732036994540290, - 0.637368548601708660, 0.637005036774657030, 0.636641501526751590, - 0.636277942871357530, - 0.635914360821842830, 0.635550755391574910, 0.635187126593922070, - 0.634823474442254840, - 0.634459798949942640, 0.634096100130357660, 0.633732377996871770, - 0.633368632562857470, - 0.633004863841689520, 0.632641071846741790, 0.632277256591390780, - 0.631913418089012020, - 0.631549556352983710, 0.631185671396683470, 0.630821763233490040, - 0.630457831876783950, - 0.630093877339945260, 0.629729899636356280, 0.629365898779399080, - 0.629001874782456500, - 0.628637827658913300, 0.628273757422153860, 0.627909664085564810, - 0.627545547662532230, - 0.627181408166443410, 0.626817245610687520, 0.626453060008652860, - 0.626088851373730380, - 0.625724619719310480, 0.625360365058784670, 0.624996087405546350, - 0.624631786772988030, - 0.624267463174504880, 0.623903116623491180, 0.623538747133343780, - 0.623174354717459190, - 0.622809939389234460, 0.622445501162069090, 0.622081040049361490, - 0.621716556064512820, - 0.621352049220923570, 0.620987519531995270, 0.620622967011131400, - 0.620258391671734690, - 0.619893793527210410, 0.619529172590963410, 0.619164528876399280, - 0.618799862396925750, - 0.618435173165949760, 0.618070461196880800, 0.617705726503127720, - 0.617340969098100430, - 0.616976188995210780, 0.616611386207870040, 0.616246560749491690, - 0.615881712633488340, - 0.615516841873275490, 0.615151948482267840, 0.614787032473881110, - 0.614422093861533010, - 0.614057132658640590, 0.613692148878623000, 0.613327142534899510, - 0.612962113640889710, - 0.612597062210015750, 0.612231988255698470, 0.611866891791361560, - 0.611501772830428060, - 0.611136631386322020, 0.610771467472469460, 0.610406281102295440, - 0.610041072289227990, - 0.609675841046694030, 0.609310587388121830, 0.608945311326941520, - 0.608580012876582370, - 0.608214692050476290, 0.607849348862054220, 0.607483983324749510, - 0.607118595451995420, - 0.606753185257225550, 0.606387752753876020, 0.606022297955381760, - 0.605656820875180360, - 0.605291321526709060, 0.604925799923405670, 0.604560256078710220, - 0.604194690006061960, - 0.603829101718902580, 0.603463491230673220, 0.603097858554815790, - 0.602732203704774650, - 0.602366526693992930, 0.602000827535916330, 0.601635106243990190, - 0.601269362831660550, - 0.600903597312375640, 0.600537809699582810, 0.600172000006731770, - 0.599806168247271620, - 0.599440314434653620, 0.599074438582328780, 0.598708540703749010, - 0.598342620812368000, - 0.597976678921638860, 0.597610715045016950, 0.597244729195957500, - 0.596878721387916090, - 0.596512691634350830, 0.596146639948718640, 0.595780566344478960, - 0.595414470835091030, - 0.595048353434014630, 0.594682214154711790, 0.594316053010643270, - 0.593949870015273000, - 0.593583665182063740, 0.593217438524479500, 0.592851190055986300, - 0.592484919790049140, - 0.592118627740135460, 0.591752313919712170, 0.591385978342248260, - 0.591019621021212420, - 0.590653241970074180, 0.590286841202305120, 0.589920418731375800, - 0.589553974570759530, - 0.589187508733928890, 0.588821021234357310, 0.588454512085520460, - 0.588087981300892900, - 0.587721428893951850, 0.587354854878173850, 0.586988259267036350, - 0.586621642074019120, - 0.586255003312600500, 0.585888342996261690, 0.585521661138483250, - 0.585154957752746730, - 0.584788232852535560, 0.584421486451332410, 0.584054718562622140, - 0.583687929199888990, - 0.583321118376619710, 0.582954286106300290, 0.582587432402417840, - 0.582220557278461340, - 0.581853660747918780, 0.581486742824280810, 0.581119803521037650, - 0.580752842851679940, - 0.580385860829700780, 0.580018857468592270, 0.579651832781848730, - 0.579284786782964360, - 0.578917719485433800, 0.578550630902754050, 0.578183521048421080, - 0.577816389935933090, - 0.577449237578788300, 0.577082063990485340, 0.576714869184524860, - 0.576347653174406840, - 0.575980415973633590, 0.575613157595706530, 0.575245878054129520, - 0.574878577362406000, - 0.574511255534040030, 0.574143912582537940, 0.573776548521405030, - 0.573409163364148930, - 0.573041757124277180, 0.572674329815297640, 0.572306881450720390, - 0.571939412044054740, - 0.571571921608812320, 0.571204410158504090, 0.570836877706642270, - 0.570469324266740570, - 0.570101749852312100, 0.569734154476872480, 0.569366538153936560, - 0.568998900897020210, - 0.568631242719641270, 0.568263563635316600, 0.567895863657565500, - 0.567528142799906490, - 0.567160401075860410, 0.566792638498947680, 0.566424855082689470, - 0.566057050840608870, - 0.565689225786228160, 0.565321379933072190, 0.564953513294665140, - 0.564585625884531870, - 0.564217717716199550, 0.563849788803194140, 0.563481839159044150, - 0.563113868797277870, - 0.562745877731423820, 0.562377865975012940, 0.562009833541575080, - 0.561641780444642640, - 0.561273706697747450, 0.560905612314422150, 0.560537497308201240, - 0.560169361692618440, - 0.559801205481210040, 0.559433028687510990, 0.559064831325059240, - 0.558696613407391630, - 0.558328374948046320, 0.557960115960563050, 0.557591836458480870, - 0.557223536455341280, - 0.556855215964685120, 0.556486875000054000, 0.556118513574991650, - 0.555750131703040880, - 0.555381729397746880, 0.555013306672654360, 0.554644863541308600, - 0.554276400017257090, - 0.553907916114046440, 0.553539411845225590, 0.553170887224342820, - 0.552802342264947400, - 0.552433776980590490, 0.552065191384822350, 0.551696585491195710, - 0.551327959313262280, - 0.550959312864576220, 0.550590646158691240, 0.550221959209161620, - 0.549853252029543830, - 0.549484524633393480, 0.549115777034268170, 0.548747009245725500, - 0.548378221281323520, - 0.548009413154622370, 0.547640584879181100, 0.547271736468561530, - 0.546902867936324590, - 0.546533979296032200, 0.546165070561248080, 0.545796141745535150, - 0.545427192862458780, - 0.545058223925583670, 0.544689234948475210, 0.544320225944701200, - 0.543951196927828010, - 0.543582147911424560, 0.543213078909059120, 0.542843989934301940, - 0.542474881000723050, - 0.542105752121893050, 0.541736603311384620, 0.541367434582769480, - 0.540998245949621760, - 0.540629037425515050, 0.540259809024023600, 0.539890560758723770, - 0.539521292643190930, - 0.539152004691002770, 0.538782696915736770, 0.538413369330970610, - 0.538044021950284450, - 0.537674654787257180, 0.537305267855470390, 0.536935861168504670, - 0.536566434739941920, - 0.536196988583365510, 0.535827522712358230, 0.535458037140505110, - 0.535088531881390050, - 0.534719006948599860, 0.534349462355720230, 0.533979898116337950, - 0.533610314244041710, - 0.533240710752419080, 0.532871087655060300, 0.532501444965554960, - 0.532131782697493170, - 0.531762100864467290, 0.531392399480068670, 0.531022678557890980, - 0.530652938111527360, - 0.530283178154571710, 0.529913398700619820, 0.529543599763266700, - 0.529173781356109600, - 0.528803943492745180, 0.528434086186771010, 0.528064209451786560, - 0.527694313301390160, - 0.527324397749182720, 0.526954462808764120, 0.526584508493736840, - 0.526214534817702310, - 0.525844541794263210, 0.525474529437023890, 0.525104497759587900, - 0.524734446775560910, - 0.524364376498548390, 0.523994286942156220, 0.523624178119992400, - 0.523254050045663940, - 0.522883902732780290, 0.522513736194950230, 0.522143550445783310, - 0.521773345498891090, - 0.521403121367884030, 0.521032878066375100, 0.520662615607976660, - 0.520292334006301820, - 0.519922033274965560, 0.519551713427582000, 0.519181374477767470, - 0.518811016439137520, - 0.518440639325310040, 0.518070243149902240, 0.517699827926532130, - 0.517329393668819580, - 0.516958940390383700, 0.516588468104845820, 0.516217976825826600, - 0.515847466566947580, - 0.515476937341832310, 0.515106389164103120, 0.514735822047384990, - 0.514365236005302040, - 0.513994631051479240, 0.513624007199543600, 0.513253364463121090, - 0.512882702855839920, - 0.512512022391327980, 0.512141323083213470, 0.511770604945127050, - 0.511399867990697920, - 0.511029112233557960, 0.510658337687338040, 0.510287544365671140, - 0.509916732282189920, - 0.509545901450527690, 0.509175051884319660, 0.508804183597200140, - 0.508433296602805670, - 0.508062390914772230, 0.507691466546736580, 0.507320523512337470, - 0.506949561825212450, - 0.506578581499001590, 0.506207582547344550, 0.505836564983881190, - 0.505465528822253710, - 0.505094474076103310, 0.504723400759073290, 0.504352308884806750, - 0.503981198466947000, - 0.503610069519139780, 0.503238922055029400, 0.502867756088262840, - 0.502496571632486070, - 0.502125368701347050, 0.501754147308493770, 0.501382907467574190, - 0.501011649192238950, - 0.500640372496137020, 0.500269077392920150, 0.499897763896239410, - 0.499526432019746450, - 0.499155081777094940, 0.498783713181937540, 0.498412326247929250, - 0.498040920988724490, - 0.497669497417978280, 0.497298055549347750, 0.496926595396488870, - 0.496555116973059980, - 0.496183620292718900, 0.495812105369124070, 0.495440572215935850, - 0.495069020846813650, - 0.494697451275419140, 0.494325863515413130, 0.493954257580458580, - 0.493582633484217940, - 0.493210991240354450, 0.492839330862533120, 0.492467652364417970, - 0.492095955759675460, - 0.491724241061971320, 0.491352508284972070, 0.490980757442346090, - 0.490608988547760690, - 0.490237201614885710, 0.489865396657390210, 0.489493573688943970, - 0.489121732723218740, - 0.488749873773885120, 0.488377996854616250, 0.488006101979084450, - 0.487634189160962910, - 0.487262258413926560, 0.486890309751649490, 0.486518343187807900, - 0.486146358736077200, - 0.485774356410135000, 0.485402336223658360, 0.485030298190324950, - 0.484658242323814380, - 0.484286168637805270, 0.483914077145978560, 0.483541967862014480, - 0.483169840799594130, - 0.482797695972400300, 0.482425533394114920, 0.482053353078422120, - 0.481681155039005550, - 0.481308939289549380, 0.480936705843739820, 0.480564454715261990, - 0.480192185917803270, - 0.479819899465050160, 0.479447595370691370, 0.479075273648415010, - 0.478702934311909910, - 0.478330577374866780, 0.477958202850975230, 0.477585810753927250, - 0.477213401097414220, - 0.476840973895128200, 0.476468529160763100, 0.476096066908011760, - 0.475723587150569390, - 0.475351089902130650, 0.474978575176390750, 0.474606042987046840, - 0.474233493347795020, - 0.473860926272333670, 0.473488341774360670, 0.473115739867574380, - 0.472743120565675250, - 0.472370483882362520, 0.471997829831337810, 0.471625158426301700, - 0.471252469680957190, - 0.470879763609006460, 0.470507040224152460, 0.470134299540099940, - 0.469761541570552780, - 0.469388766329217000, 0.469015973829798090, 0.468643164086002100, - 0.468270337111537040, - 0.467897492920109850, 0.467524631525429830, 0.467151752941205530, - 0.466778857181146260, - 0.466405944258963200, 0.466033014188366350, 0.465660066983068220, - 0.465287102656780530, - 0.464914121223215740, 0.464541122696088100, 0.464168107089110940, - 0.463795074415999760, - 0.463422024690469060, 0.463048957926235630, 0.462675874137015720, - 0.462302773336526080, - 0.461929655538485470, 0.461556520756611410, 0.461183369004623920, - 0.460810200296242310, - 0.460437014645186440, 0.460063812065178160, 0.459690592569938270, - 0.459317356173189750, - 0.458944102888655060, 0.458570832730057170, 0.458197545711121090, - 0.457824241845570630, - 0.457450921147131930, 0.457077583629530550, 0.456704229306492570, - 0.456330858191746010, - 0.455957470299017840, 0.455584065642037350, 0.455210644234532610, - 0.454837206090234200, - 0.454463751222871910, 0.454090279646176210, 0.453716791373879380, - 0.453343286419712720, - 0.452969764797409750, 0.452596226520703360, 0.452222671603327130, - 0.451849100059016350, - 0.451475511901505420, 0.451101907144530910, 0.450728285801828830, - 0.450354647887135640, - 0.449980993414189900, 0.449607322396728900, 0.449233634848492320, - 0.448859930783219170, - 0.448486210214649020, 0.448112473156523420, 0.447738719622582710, - 0.447364949626569590, - 0.446991163182225700, 0.446617360303294910, 0.446243541003520480, - 0.445869705296646270, - 0.445495853196417930, 0.445121984716580210, 0.444748099870879880, - 0.444374198673063330, - 0.444000281136877280, 0.443626347276070590, 0.443252397104390790, - 0.442878430635587910, - 0.442504447883411090, 0.442130448861610240, 0.441756433583937120, - 0.441382402064142250, - 0.441008354315978680, 0.440634290353198510, 0.440260210189554690, - 0.439886113838801880, - 0.439512001314693700, 0.439137872630986080, 0.438763727801433690, - 0.438389566839793740, - 0.438015389759822630, 0.437641196575277220, 0.437266987299916590, - 0.436892761947498260, - 0.436518520531782470, 0.436144263066528480, 0.435769989565496290, - 0.435395700042447710, - 0.435021394511143410, 0.434647072985346380, 0.434272735478819010, - 0.433898382005324050, - 0.433524012578626440, 0.433149627212489670, 0.432775225920679740, - 0.432400808716961900, - 0.432026375615101930, 0.431651926628867530, 0.431277461772025310, - 0.430902981058344070, - 0.430528484501591540, 0.430153972115537800, 0.429779443913952170, - 0.429404899910604490, - 0.429030340119266550, 0.428655764553708960, 0.428281173227704760, - 0.427906566155026040, - 0.427531943349445720, 0.427157304824738350, 0.426782650594677570, - 0.426407980673039090, - 0.426033295073598160, 0.425658593810130330, 0.425283876896413280, - 0.424909144346223290, - 0.424534396173339160, 0.424159632391538870, 0.423784853014600950, - 0.423410058056305830, - 0.423035247530432810, 0.422660421450763490, 0.422285579831078230, - 0.421910722685159720, - 0.421535850026790060, 0.421160961869751720, 0.420786058227829220, - 0.420411139114805770, - 0.420036204544466940, 0.419661254530597550, 0.419286289086983070, - 0.418911308227410740, - 0.418536311965666650, 0.418161300315539220, 0.417786273290816130, - 0.417411230905285650, - 0.417036173172737830, 0.416661100106961610, 0.416286011721748230, - 0.415910908030888200, - 0.415535789048172620, 0.415160654787394280, 0.414785505262345030, - 0.414410340486818910, - 0.414035160474608700, 0.413659965239509710, 0.413284754795316230, - 0.412909529155823300, - 0.412534288334827750, 0.412159032346125280, 0.411783761203513790, - 0.411408474920790520, - 0.411033173511753220, 0.410657856990201580, 0.410282525369933980, - 0.409907178664751180, - 0.409531816888453190, 0.409156440054840590, 0.408781048177715660, - 0.408405641270879690, - 0.408030219348136270, 0.407654782423288010, 0.407279330510138260, - 0.406903863622492260, - 0.406528381774153900, 0.406152884978929480, 0.405777373250624070, - 0.405401846603045010, - 0.405026305049998980, 0.404650748605293040, 0.404275177282736260, - 0.403899591096136380, - 0.403523990059303620, 0.403148374186047210, 0.402772743490177110, - 0.402397097985504990, - 0.402021437685841480, 0.401645762604999350, 0.401270072756790610, - 0.400894368155027990, - 0.400518648813525830, 0.400142914746097480, 0.399767165966558420, - 0.399391402488723400, - 0.399015624326407800, 0.398639831493428740, 0.398264024003602220, - 0.397888201870746420, - 0.397512365108678430, 0.397136513731217500, 0.396760647752182230, - 0.396384767185391620, - 0.396008872044666730, 0.395632962343827170, 0.395257038096694990, - 0.394881099317091370, - 0.394505146018838130, 0.394129178215758820, 0.393753195921675850, - 0.393377199150413860, - 0.393001187915796750, 0.392625162231649010, 0.392249122111796800, - 0.391873067570065240, - 0.391496998620281590, 0.391120915276272410, 0.390744817551864850, - 0.390368705460887750, - 0.389992579017168830, 0.389616438234538010, 0.389240283126824070, - 0.388864113707858060, - 0.388487929991470140, 0.388111731991491180, 0.387735519721753690, - 0.387359293196089140, - 0.386983052428331030, 0.386606797432312350, 0.386230528221866430, - 0.385854244810828530, - 0.385477947213032580, 0.385101635442314900, 0.384725309512510880, - 0.384348969437456610, - 0.383972615230989860, 0.383596246906947210, 0.383219864479167560, - 0.382843467961488940, - 0.382467057367749940, 0.382090632711791060, 0.381714194007451380, - 0.381337741268572390, - 0.380961274508994250, 0.380584793742559550, 0.380208298983109930, - 0.379831790244487540, - 0.379455267540536490, 0.379078730885099520, 0.378702180292021630, - 0.378325615775147170, - 0.377949037348320800, 0.377572445025389230, 0.377195838820197690, - 0.376819218746593910, - 0.376442584818424570, 0.376065937049537060, 0.375689275453780500, - 0.375312600045002780, - 0.374935910837054080, 0.374559207843783660, 0.374182491079041500, - 0.373805760556679190, - 0.373429016290547200, 0.373052258294498230, 0.372675486582383640, - 0.372298701168057190, - 0.371921902065371730, 0.371545089288180640, 0.371168262850339210, - 0.370791422765701320, - 0.370414569048123140, 0.370037701711460170, 0.369660820769568240, - 0.369283926236305070, - 0.368907018125527120, 0.368530096451093140, 0.368153161226860980, - 0.367776212466689010, - 0.367399250184437480, 0.367022274393965340, 0.366645285109133750, - 0.366268282343803150, - 0.365891266111834370, 0.365514236427090080, 0.365137193303431750, - 0.364760136754723020, - 0.364383066794826350, 0.364005983437606320, 0.363628886696926890, - 0.363251776586652310, - 0.362874653120648700, 0.362497516312780990, 0.362120366176916230, - 0.361743202726920790, - 0.361366025976661450, 0.360988835940006750, 0.360611632630824020, - 0.360234416062982840, - 0.359857186250351960, 0.359479943206800550, 0.359102686946199680, - 0.358725417482419150, - 0.358348134829330870, 0.357970839000806010, 0.357593530010716310, - 0.357216207872935120, - 0.356838872601334680, 0.356461524209789380, 0.356084162712172360, - 0.355706788122359060, - 0.355329400454223950, 0.354951999721642100, 0.354574585938490280, - 0.354197159118644080, - 0.353819719275981330, 0.353442266424378930, 0.353064800577714280, - 0.352687321749866610, - 0.352309829954713830, 0.351932325206136210, 0.351554807518012990, - 0.351177276904224070, - 0.350799733378650890, 0.350422176955173910, 0.350044607647675640, - 0.349667025470037810, - 0.349289430436142520, 0.348911822559873850, 0.348534201855114360, - 0.348156568335749040, - 0.347778922015661520, 0.347401262908737570, 0.347023591028862320, - 0.346645906389921150, - 0.346268209005801410, 0.345890498890388980, 0.345512776057572080, - 0.345135040521238170, - 0.344757292295274910, 0.344379531393571970, 0.344001757830017680, - 0.343623971618502560, - 0.343246172772916250, 0.342868361307148980, 0.342490537235092600, - 0.342112700570637750, - 0.341734851327677280, 0.341356989520103240, 0.340979115161808070, - 0.340601228266685980, - 0.340223328848629880, 0.339845416921535030, 0.339467492499295200, - 0.339089555595806560, - 0.338711606224964210, 0.338333644400663940, 0.337955670136803170, - 0.337577683447278010, - 0.337199684345986910, 0.336821672846827290, 0.336443648963697160, - 0.336065612710496290, - 0.335687564101123050, 0.335309503149478110, 0.334931429869461230, - 0.334553344274972690, - 0.334175246379914470, 0.333797136198187240, 0.333419013743693980, - 0.333040879030336690, - 0.332662732072017800, 0.332284572882641680, 0.331906401476111280, - 0.331528217866331690, - 0.331150022067206780, 0.330771814092642610, 0.330393593956544440, - 0.330015361672817750, - 0.329637117255370090, 0.329258860718107450, 0.328880592074938190, - 0.328502311339769700, - 0.328124018526509800, 0.327745713649068180, 0.327367396721353070, - 0.326989067757275040, - 0.326610726770743760, 0.326232373775669270, 0.325854008785963320, - 0.325475631815536570, - 0.325097242878301660, 0.324718841988170470, 0.324340429159055250, - 0.323962004404870050, - 0.323583567739527570, 0.323205119176942720, 0.322826658731029110, - 0.322448186415702550, - 0.322069702244877910, 0.321691206232470550, 0.321312698392397570, - 0.320934178738574720, - 0.320555647284919980, 0.320177104045350440, 0.319798549033783570, - 0.319419982264138650, - 0.319041403750333630, 0.318662813506288670, 0.318284211545923010, - 0.317905597883156250, - 0.317526972531909870, 0.317148335506103940, 0.316769686819660780, - 0.316391026486501690, - 0.316012354520548600, 0.315633670935725030, 0.315254975745953180, - 0.314876268965157470, - 0.314497550607261090, 0.314118820686189180, 0.313740079215866160, - 0.313361326210216840, - 0.312982561683167790, 0.312603785648644220, 0.312224998120573420, - 0.311846199112882030, - 0.311467388639496860, 0.311088566714346650, 0.310709733351358600, - 0.310330888564462340, - 0.309952032367586390, 0.309573164774659850, 0.309194285799613390, - 0.308815395456376430, - 0.308436493758880660, 0.308057580721056660, 0.307678656356835560, - 0.307299720680150270, - 0.306920773704932260, 0.306541815445115160, 0.306162845914631390, - 0.305783865127415400, - 0.305404873097400780, 0.305025869838521590, 0.304646855364713530, - 0.304267829689911010, - 0.303888792828050650, 0.303509744793068030, 0.303130685598899270, - 0.302751615259482190, - 0.302372533788753170, 0.301993441200650910, 0.301614337509113100, - 0.301235222728077840, - 0.300856096871485010, 0.300476959953273060, 0.300097811987382670, - 0.299718652987753580, - 0.299339482968325970, 0.298960301943041680, 0.298581109925841300, - 0.298201906930667390, - 0.297822692971461410, 0.297443468062166820, 0.297064232216726120, - 0.296684985449082390, - 0.296305727773180260, 0.295926459202963120, 0.295547179752376430, - 0.295167889435364820, - 0.294788588265873170, 0.294409276257848300, 0.294029953425235520, - 0.293650619781982260, - 0.293271275342035120, 0.292891920119341120, 0.292512554127848930, - 0.292133177381505850, - 0.291753789894261320, 0.291374391680063520, 0.290994982752862730, - 0.290615563126608250, - 0.290236132815249790, 0.289856691832738880, 0.289477240193025510, - 0.289097777910061970, - 0.288718304997799550, 0.288338821470189910, 0.287959327341186510, - 0.287579822624741350, - 0.287200307334808670, 0.286820781485341620, 0.286441245090293950, - 0.286061698163620930, - 0.285682140719276560, 0.285302572771216960, 0.284922994333397350, - 0.284543405419773240, - 0.284163806044301910, 0.283784196220939370, 0.283404575963643550, - 0.283024945286371230, - 0.282645304203081090, 0.282265652727731130, 0.281885990874279570, - 0.281506318656686290, - 0.281126636088910030, 0.280746943184911340, 0.280367239958650150, - 0.279987526424086530, - 0.279607802595182420, 0.279228068485898210, 0.278848324110196550, - 0.278468569482039130, - 0.278088804615388040, 0.277709029524206950, 0.277329244222458250, - 0.276949448724106480, - 0.276569643043115150, 0.276189827193448200, 0.275810001189071290, - 0.275430165043948570, - 0.275050318772046500, 0.274670462387330010, 0.274290595903766200, - 0.273910719335321300, - 0.273530832695961790, 0.273150935999655950, 0.272771029260370560, - 0.272391112492074590, - 0.272011185708736060, 0.271631248924323390, 0.271251302152806570, - 0.270871345408154380, - 0.270491378704337540, 0.270111402055325910, 0.269731415475089780, - 0.269351418977600950, - 0.268971412576829990, 0.268591396286749500, 0.268211370121331170, - 0.267831334094547010, - 0.267451288220370730, 0.267071232512774700, 0.266691166985733360, - 0.266311091653219700, - 0.265931006529208920, 0.265550911627675250, 0.265170806962593210, - 0.264790692547939020, - 0.264410568397687560, 0.264030434525815760, 0.263650290946299660, - 0.263270137673115630, - 0.262889974720241610, 0.262509802101654310, 0.262129619831332370, - 0.261749427923253670, - 0.261369226391396310, 0.260989015249740050, 0.260608794512263380, - 0.260228564192946710, - 0.259848324305769600, 0.259468074864711960, 0.259087815883755400, - 0.258707547376880010, - 0.258327269358068100, 0.257946981841300490, 0.257566684840560170, - 0.257186378369829110, - 0.256806062443089680, 0.256425737074325920, 0.256045402277520320, - 0.255665058066657680, - 0.255284704455721660, 0.254904341458696390, 0.254523969089567590, - 0.254143587362319620, - 0.253763196290938850, 0.253382795889410710, 0.253002386171721110, - 0.252621967151857420, - 0.252241538843805680, 0.251861101261554090, 0.251480654419089730, - 0.251100198330400150, - 0.250719733009474530, 0.250339258470300590, 0.249958774726868170, - 0.249578281793165680, - 0.249197779683183660, 0.248817268410911650, 0.248436747990339490, - 0.248056218435458720, - 0.247675679760259450, 0.247295131978733870, 0.246914575104873220, - 0.246534009152669040, - 0.246153434136114490, 0.245772850069201410, 0.245392256965923620, - 0.245011654840274010, - 0.244631043706245800, 0.244250423577833860, 0.243869794469031620, - 0.243489156393834590, - 0.243108509366237320, 0.242727853400234670, 0.242347188509823150, - 0.241966514708997830, - 0.241585832011755900, 0.241205140432093070, 0.240824439984007180, - 0.240443730681495050, - 0.240063012538553830, 0.239682285569182310, 0.239301549787377890, - 0.238920805207139960, - 0.238540051842467020, 0.238159289707357810, 0.237778518815812740, - 0.237397739181830820, - 0.237016950819413100, 0.236636153742559610, 0.236255347965270780, - 0.235874533501548580, - 0.235493710365393630, 0.235112878570808560, 0.234732038131795020, - 0.234351189062355030, - 0.233970331376492150, 0.233589465088208580, 0.233208590211508550, - 0.232827706760394850, - 0.232446814748872410, 0.232065914190945020, 0.231685005100616930, - 0.231304087491893930, - 0.230923161378780380, 0.230542226775282770, 0.230161283695406500, - 0.229780332153157300, - 0.229399372162542610, 0.229018403737568290, 0.228637426892242400, - 0.228256441640571880, - 0.227875447996564060, 0.227494445974227850, 0.227113435587570770, - 0.226732416850602300, - 0.226351389777330990, 0.225970354381765690, 0.225589310677916880, - 0.225208258679793520, - 0.224827198401406690, 0.224446129856766040, 0.224065053059883250, - 0.223683968024768950, - 0.223302874765434120, 0.222921773295891380, 0.222540663630151820, - 0.222159545782228660, - 0.221778419766134050, 0.221397285595880480, 0.221016143285482050, - 0.220634992848951380, - 0.220253834300303180, 0.219872667653551100, 0.219491492922709110, - 0.219110310121792800, - 0.218729119264816280, 0.218347920365795780, 0.217966713438746380, - 0.217585498497683580, - 0.217204275556624420, 0.216823044629584520, 0.216441805730581500, - 0.216060558873631570, - 0.215679304072752960, 0.215298041341962870, 0.214916770695278810, - 0.214535492146719880, - 0.214154205710303750, 0.213772911400050090, 0.213391609229977570, - 0.213010299214105140, - 0.212628981366453330, 0.212247655701041290, 0.211866322231890090, - 0.211484980973019880, - 0.211103631938451000, 0.210722275142205480, 0.210340910598303870, - 0.209959538320768660, - 0.209578158323621420, 0.209196770620883960, 0.208815375226579670, - 0.208433972154730530, - 0.208052561419360520, 0.207671143034492080, 0.207289717014149830, - 0.206908283372357230, - 0.206526842123138070, 0.206145393280517730, 0.205763936858520150, - 0.205382472871171230, - 0.205001001332495910, 0.204619522256519300, 0.204238035657268250, - 0.203856541548768030, - 0.203475039945045950, 0.203093530860128300, 0.202712014308041620, - 0.202330490302814110, - 0.201948958858472420, 0.201567419989045200, 0.201185873708560170, - 0.200804320031045230, - 0.200422758970529910, 0.200041190541042220, 0.199659614756612230, - 0.199278031631268500, - 0.198896441179041650, 0.198514843413961220, 0.198133238350057030, - 0.197751626001360480, - 0.197370006381901520, 0.196988379505712050, 0.196606745386822960, - 0.196225104039265410, - 0.195843455477072190, 0.195461799714274460, 0.195080136764905570, - 0.194698466642997730, - 0.194316789362583340, 0.193935104937696560, 0.193553413382369890, - 0.193171714710637930, - 0.192790008936534220, 0.192408296074092570, 0.192026576137348330, - 0.191644849140335360, - 0.191263115097089540, 0.190881374021645320, 0.190499625928039040, - 0.190117870830306100, - 0.189736108742482030, 0.189354339678604100, 0.188972563652707950, - 0.188590780678831250, - 0.188208990771010640, 0.187827193943283040, 0.187445390209686870, - 0.187063579584259070, - 0.186681762081038650, 0.186299937714063470, 0.185918106497371700, - 0.185536268445003070, - 0.185154423570995760, 0.184772571889390000, 0.184390713414225000, - 0.184008848159540110, - 0.183626976139376310, 0.183245097367773090, 0.182863211858771880, - 0.182481319626412670, - 0.182099420684737420, 0.181717515047787020, 0.181335602729602590, - 0.180953683744226880, - 0.180571758105701030, 0.180189825828068250, 0.179807886925370670, - 0.179425941411650660, - 0.179043989300952110, 0.178662030607317450, 0.178280065344791100, - 0.177898093527416370, - 0.177516115169236820, 0.177134130284297610, 0.176752138886642350, - 0.176370140990316640, - 0.175988136609365020, 0.175606125757832240, 0.175224108449764660, - 0.174842084699207030, - 0.174460054520206240, 0.174078017926807490, 0.173695974933058080, - 0.173313925553004180, - 0.172931869800692250, 0.172549807690170230, 0.172167739235484620, - 0.171785664450683800, - 0.171403583349815180, 0.171021495946926340, 0.170639402256066410, - 0.170257302291283000, - 0.169875196066625710, 0.169493083596143100, 0.169110964893883830, - 0.168728839973898290, - 0.168346708850235140, 0.167964571536945220, 0.167582428048078130, - 0.167200278397683750, - 0.166818122599813570, 0.166435960668517400, 0.166053792617847200, - 0.165671618461853270, - 0.165289438214587970, 0.164907251890102520, 0.164525059502448390, - 0.164142861065678550, - 0.163760656593844480, 0.163378446100999640, 0.162996229601196390, - 0.162614007108487250, - 0.162231778636926370, 0.161849544200566300, 0.161467303813461580, - 0.161085057489665670, - 0.160702805243232240, 0.160320547088216470, 0.159938283038672050, - 0.159556013108654580, - 0.159173737312218650, 0.158791455663418930, 0.158409168176311760, - 0.158026874864951870, - 0.157644575743395960, 0.157262270825699210, 0.156879960125918730, - 0.156497643658110590, - 0.156115321436331000, 0.155732993474637760, 0.155350659787087090, - 0.154968320387737170, - 0.154585975290645110, 0.154203624509868190, 0.153821268059465250, - 0.153438905953493550, - 0.153056538206012340, 0.152674164831079730, 0.152291785842754070, - 0.151909401255095250, - 0.151527011082161540, 0.151144615338013210, 0.150762214036709470, - 0.150379807192309620, - 0.149997394818874590, 0.149614976930463660, 0.149232553541138180, - 0.148850124664957870, - 0.148467690315984390, 0.148085250508278370, 0.147702805255900570, - 0.147320354572913260, - 0.146937898473377210, 0.146555436971355090, 0.146172970080908520, - 0.145790497816099230, - 0.145408020190990560, 0.145025537219644170, 0.144643048916123810, - 0.144260555294492000, - 0.143878056368811510, 0.143495552153146630, 0.143113042661560050, - 0.142730527908116440, - 0.142348007906879320, 0.141965482671912420, 0.141582952217280980, - 0.141200416557048680, - 0.140817875705281120, 0.140435329676042390, 0.140052778483398480, - 0.139670222141414250, - 0.139287660664154770, 0.138905094065686600, 0.138522522360074780, - 0.138139945561386200, - 0.137757363683686740, 0.137374776741042340, 0.136992184747520560, - 0.136609587717187310, - 0.136226985664110460, 0.135844378602356760, 0.135461766545993150, - 0.135079149509088060, - 0.134696527505708320, 0.134313900549922760, 0.133931268655799020, - 0.133548631837404950, - 0.133165990108809860, 0.132783343484081580, 0.132400691977289760, - 0.132018035602502530, - 0.131635374373789940, 0.131252708305220960, 0.130870037410864640, - 0.130487361704791580, - 0.130104681201070800, 0.129721995913773260, 0.129339305856968730, - 0.128956611044727220, - 0.128573911491120210, 0.128191207210217570, 0.127808498216091110, - 0.127425784522811530, - 0.127043066144449680, 0.126660343095077900, 0.126277615388766920, - 0.125894883039589430, - 0.125512146061616980, 0.125129404468921260, 0.124746658275575490, - 0.124363907495651240, - 0.123981152143222060, 0.123598392232359880, 0.123215627777138580, - 0.122832858791630880, - 0.122450085289909640, 0.122067307286049230, 0.121684524794122440, - 0.121301737828203960, - 0.120918946402367330, 0.120536150530686250, 0.120153350227235940, - 0.119770545506089950, - 0.119387736381323830, 0.119004922867011920, 0.118622104977228730, - 0.118239282726050290, - 0.117856456127550970, 0.117473625195807100, 0.117090789944893860, - 0.116707950388886520, - 0.116325106541861910, 0.115942258417895240, 0.115559406031063570, - 0.115176549395442460, - 0.114793688525109290, 0.114410823434140360, 0.114027954136612060, - 0.113645080646602280, - 0.113262202978187320, 0.112879321145445350, 0.112496435162453430, - 0.112113545043288730, - 0.111730650802029900, 0.111347752452754000, 0.110964850009539970, - 0.110581943486465610, - 0.110199032897608850, 0.109816118257049110, 0.109433199578864170, - 0.109050276877133770, - 0.108667350165936400, 0.108284419459350770, 0.107901484771457020, - 0.107518546116333660, - 0.107135603508061170, 0.106752656960718350, 0.106369706488385940, - 0.105986752105143480, - 0.105603793825070680, 0.105220831662248700, 0.104837865630757090, - 0.104454895744677270, - 0.104071922018089540, 0.103688944465074300, 0.103305963099713400, - 0.102922977936087120, - 0.102539988988277600, 0.102156996270365800, 0.101773999796432830, - 0.101390999580561250, - 0.101007995636832020, 0.100624987979327970, 0.100241976622130760, - 0.099858961579322170, - 0.099475942864985456, 0.099092920493202258, 0.098709894478056073, - 0.098326864833628791, - 0.097943831574004214, 0.097560794713264939, 0.097177754265493674, - 0.096794710244774623, - 0.096411662665190329, 0.096028611540825232, 0.095645556885762609, - 0.095262498714085819, - 0.094879437039879722, 0.094496371877227495, 0.094113303240214247, - 0.093730231142923864, - 0.093347155599440373, 0.092964076623849271, 0.092580994230234359, - 0.092197908432681386, - 0.091814819245274432, 0.091431726682099479, 0.091048630757241303, - 0.090665531484784803, - 0.090282428878816323, 0.089899322953420582, 0.089516213722684160, - 0.089133101200692441, - 0.088749985401530951, 0.088366866339286629, 0.087983744028044805, - 0.087600618481892656, - 0.087217489714916191, 0.086834357741201490, 0.086451222574836131, - 0.086068084229906014, - 0.085684942720498897, 0.085301798060701386, 0.084918650264600160, - 0.084535499346283349, - 0.084152345319837438, 0.083769188199350780, 0.083386027998910095, - 0.083002864732603973, - 0.082619698414519799, 0.082236529058745025, 0.081853356679368619, - 0.081470181290477811, - 0.081087002906161790, 0.080703821540508452, 0.080320637207605849, - 0.079937449921543474, - 0.079554259696409127, 0.079171066546292510, 0.078787870485282088, - 0.078404671527466441, - 0.078021469686935602, 0.077638264977777913, 0.077255057414083589, - 0.076871847009941652, - 0.076488633779441206, 0.076105417736672773, 0.075722198895725248, - 0.075338977270689375, - 0.074955752875654230, 0.074572525724710764, 0.074189295831948693, - 0.073806063211457842, - 0.073422827877329483, 0.073039589843653177, 0.072656349124520389, - 0.072273105734021334, - 0.071889859686246352, 0.071506610995287156, 0.071123359675233852, - 0.070740105740178361, - 0.070356849204211397, 0.069973590081423773, 0.069590328385907715, - 0.069207064131753759, - 0.068823797333054326, 0.068440528003900616, 0.068057256158383886, - 0.067673981810596848, - 0.067290704974630494, 0.066907425664577733, 0.066524143894529736, - 0.066140859678579578, - 0.065757573030819083, 0.065374283965340146, 0.064990992496236119, - 0.064607698637598646, - 0.064224402403521202, 0.063841103808096086, 0.063457802865415636, - 0.063074499589573618, - 0.062691193994662109, 0.062307886094775049, 0.061924575904005130, - 0.061541263436445129, - 0.061157948706189229, 0.060774631727329942, 0.060391312513961619, - 0.060007991080177375, - 0.059624667440070382, 0.059241341607735261, 0.058858013597264912, - 0.058474683422754095, - 0.058091351098295878, 0.057708016637985186, 0.057324680055915692, - 0.056941341366181127, - 0.056558000582876661, 0.056174657720095743, 0.055791312791933681, - 0.055407965812484541, - 0.055024616795842439, 0.054641265756102911, 0.054257912707359794, - 0.053874557663708772, - 0.053491200639244271, 0.053107841648060788, 0.052724480704254229, - 0.052341117821918783, - 0.051957753015150501, 0.051574386298044173, 0.051191017684694640, - 0.050807647189198162, - 0.050424274825649297, 0.050040900608144430, 0.049657524550778251, - 0.049274146667647289, - 0.048890766972846805, 0.048507385480472134, 0.048124002204620014, - 0.047740617159385448, - 0.047357230358865306, 0.046973841817155179, 0.046590451548350717, - 0.046207059566548990, - 0.045823665885845313, 0.045440270520336883, 0.045056873484119603, - 0.044673474791289434, - 0.044290074455943754, 0.043906672492178188, 0.043523268914090238, - 0.043139863735776100, - 0.042756456971332048, 0.042373048634855741, 0.041989638740443119, - 0.041606227302191955, - 0.041222814334198304, 0.040839399850560058, 0.040455983865373815, - 0.040072566392736257, - 0.039689147446745419, 0.039305727041497644, 0.038922305191091085, - 0.038538881909622631, - 0.038155457211189216, 0.037772031109889144, 0.037388603619819022, - 0.037005174755077273, - 0.036621744529761024, 0.036238312957967478, 0.035854880053795196, - 0.035471445831341021, - 0.035088010304703626, 0.034704573487980395, 0.034321135395268765, - 0.033937696040667535, - 0.033554255438273790, 0.033170813602186440, 0.032787370546502645, - 0.032403926285321405, - 0.032020480832740429, 0.031637034202857461, 0.031253586409771626, - 0.030870137467580314, - 0.030486687390382738, 0.030103236192276818, 0.029719783887360508, - 0.029336330489733147, - 0.028952876013492331, 0.028569420472737472, 0.028185963881566689, - 0.027802506254078142, - 0.027419047604371360, 0.027035587946544135, 0.026652127294696067, - 0.026268665662925468, - 0.025885203065330677, 0.025501739516011413, 0.025118275029065638, - 0.024734809618593138, - 0.024351343298691951, 0.023967876083461924, 0.023584407987001611, - 0.023200939023409587, - 0.022817469206785804, 0.022433998551228459, 0.022050527070837558, - 0.021667054779711814, - 0.021283581691949955, 0.020900107821652084, 0.020516633182916549, - 0.020133157789843505, - 0.019749681656531803, 0.019366204797080316, 0.018982727225589285, - 0.018599248956157190, - 0.018215770002884327, 0.017832290379869671, 0.017448810101212228, - 0.017065329181012358, - 0.016681847633368677, 0.016298365472381587, 0.015914882712149747, - 0.015531399366773606, - 0.015147915450352307, 0.014764430976985016, 0.014380945960772247, - 0.013997460415812761, - 0.013613974356207112, 0.013230487796054543, 0.012847000749454314, - 0.012463513230507034, - 0.012080025253311559, 0.011696536831968529, 0.011313047980577277, - 0.010929558713237145, - 0.010546069044048827, 0.010162578987111254, 0.009779088556525145, - 0.009395597766389905, - 0.009012106630804949, 0.008628615163871038, 0.008245123379687167, - 0.007861631292354124, - 0.007478138915970929, 0.007094646264638386, 0.006711153352455981, - 0.006327660193523208, - 0.005944166801940901, 0.005560673191808128, 0.005177179377225743, - 0.004793685372293270, - 0.004410191191110246, 0.004026696847777542, 0.003643202356394263, - 0.003259707731061291, - 0.002876212985878184, 0.002492718134944503, 0.002109223192361147, - 0.001725728172227238, - 0.001342233088643682, 0.000958737955710053, 0.000575242787525925, - 0.000191747598192208, - -}; - -/** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - * \par Normalizing factor: - * The normalizing factor is sqrt(2/N), which depends on the size of transform N. - * Floating-point normalizing factors are mentioned in the table below for different DCT sizes: - * \image html dct4NormalizingF32Table.gif - */ - -arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize) -{ - /* Initialize the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initializing the pointer array with the weight table base addresses of different lengths */ - float32_t *twiddlePtr[4] = - { (float32_t *) Weights_128, (float32_t *) Weights_512, - (float32_t *) Weights_2048, (float32_t *) Weights_8192 - }; - - /* Initializing the pointer array with the cos factor table base addresses of different lengths */ - float32_t *pCosFactor[4] = - { (float32_t *) cos_factors_128, (float32_t *) cos_factors_512, - (float32_t *) cos_factors_2048, (float32_t *) cos_factors_8192 - }; - - /* Initialize the DCT4 length */ - S->N = N; - - /* Initialize the half of DCT4 length */ - S->Nby2 = Nby2; - - /* Initialize the DCT4 Normalizing factor */ - S->normalize = normalize; - - /* Initialize Real FFT Instance */ - S->pRfft = S_RFFT; - - /* Initialize Complex FFT Instance */ - S->pCfft = S_CFFT; - - switch (N) - { - /* Initialize the table modifier values */ - case 8192u: - S->pTwiddle = twiddlePtr[3]; - S->pCosFactor = pCosFactor[3]; - break; - case 2048u: - S->pTwiddle = twiddlePtr[2]; - S->pCosFactor = pCosFactor[2]; - break; - case 512u: - S->pTwiddle = twiddlePtr[1]; - S->pCosFactor = pCosFactor[1]; - break; - case 128u: - S->pTwiddle = twiddlePtr[0]; - S->pCosFactor = pCosFactor[0]; - break; - default: - status = ARM_MATH_ARGUMENT_ERROR; - } - - /* Initialize the RFFT/RIFFT */ - arm_rfft_init_f32(S->pRfft, S->pCfft, S->N, 0u, 1u); - - /* return the status of DCT4 Init function */ - return (status); -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c deleted file mode 100644 index 2d558bb..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c +++ /dev/null @@ -1,4284 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_init_q15.c -* -* Description: Initialization function of DCT-4 & IDCT4 Q15 -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/* -* @brief Weights Table -*/ - -/** -* \par -* Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
-* \par -* C command to generate the table -*
    
-* for(i = 0; i< N; i++)    
-* {    
-*   weights[2*i]= cos(i*c);    
-*   weights[(2*i)+1]= -sin(i * c);    
-* } 
-* \par -* where N is the Number of weights to be calculated and c is pi/(2*N) -* \par -* Converted the output to q15 format by multiplying with 2^31 and saturated if required. -* \par -* In the tables below the real and imaginary values are placed alternatively, hence the -* array length is 2*N. -*/ - -static const q15_t ALIGN4 WeightsQ15_128[256] = { - 0x7fff, 0x0, 0x7ffd, 0xfe6e, 0x7ff6, 0xfcdc, 0x7fe9, 0xfb4a, - 0x7fd8, 0xf9b9, 0x7fc2, 0xf827, 0x7fa7, 0xf696, 0x7f87, 0xf505, - 0x7f62, 0xf375, 0x7f38, 0xf1e5, 0x7f09, 0xf055, 0x7ed5, 0xeec7, - 0x7e9d, 0xed38, 0x7e5f, 0xebab, 0x7e1d, 0xea1e, 0x7dd6, 0xe893, - 0x7d8a, 0xe708, 0x7d39, 0xe57e, 0x7ce3, 0xe3f5, 0x7c89, 0xe26d, - 0x7c29, 0xe0e7, 0x7bc5, 0xdf61, 0x7b5d, 0xdddd, 0x7aef, 0xdc5a, - 0x7a7d, 0xdad8, 0x7a05, 0xd958, 0x798a, 0xd7da, 0x7909, 0xd65d, - 0x7884, 0xd4e1, 0x77fa, 0xd368, 0x776c, 0xd1ef, 0x76d9, 0xd079, - 0x7641, 0xcf05, 0x75a5, 0xcd92, 0x7504, 0xcc22, 0x745f, 0xcab3, - 0x73b5, 0xc946, 0x7307, 0xc7dc, 0x7255, 0xc674, 0x719e, 0xc50e, - 0x70e2, 0xc3aa, 0x7023, 0xc248, 0x6f5f, 0xc0e9, 0x6e96, 0xbf8d, - 0x6dca, 0xbe32, 0x6cf9, 0xbcdb, 0x6c24, 0xbb86, 0x6b4a, 0xba33, - 0x6a6d, 0xb8e4, 0x698c, 0xb797, 0x68a6, 0xb64c, 0x67bd, 0xb505, - 0x66cf, 0xb3c1, 0x65dd, 0xb27f, 0x64e8, 0xb141, 0x63ef, 0xb005, - 0x62f2, 0xaecd, 0x61f1, 0xad97, 0x60ec, 0xac65, 0x5fe3, 0xab36, - 0x5ed7, 0xaa0b, 0x5dc7, 0xa8e3, 0x5cb4, 0xa7be, 0x5b9d, 0xa69c, - 0x5a82, 0xa57e, 0x5964, 0xa463, 0x5842, 0xa34c, 0x571d, 0xa239, - 0x55f5, 0xa129, 0x54ca, 0xa01d, 0x539b, 0x9f14, 0x5269, 0x9e0f, - 0x5133, 0x9d0e, 0x4ffb, 0x9c11, 0x4ebf, 0x9b18, 0x4d81, 0x9a23, - 0x4c3f, 0x9931, 0x4afb, 0x9843, 0x49b4, 0x975a, 0x4869, 0x9674, - 0x471c, 0x9593, 0x45cd, 0x94b6, 0x447a, 0x93dc, 0x4325, 0x9307, - 0x41ce, 0x9236, 0x4073, 0x916a, 0x3f17, 0x90a1, 0x3db8, 0x8fdd, - 0x3c56, 0x8f1e, 0x3af2, 0x8e62, 0x398c, 0x8dab, 0x3824, 0x8cf9, - 0x36ba, 0x8c4b, 0x354d, 0x8ba1, 0x33de, 0x8afc, 0x326e, 0x8a5b, - 0x30fb, 0x89bf, 0x2f87, 0x8927, 0x2e11, 0x8894, 0x2c98, 0x8806, - 0x2b1f, 0x877c, 0x29a3, 0x86f7, 0x2826, 0x8676, 0x26a8, 0x85fb, - 0x2528, 0x8583, 0x23a6, 0x8511, 0x2223, 0x84a3, 0x209f, 0x843b, - 0x1f19, 0x83d7, 0x1d93, 0x8377, 0x1c0b, 0x831d, 0x1a82, 0x82c7, - 0x18f8, 0x8276, 0x176d, 0x822a, 0x15e2, 0x81e3, 0x1455, 0x81a1, - 0x12c8, 0x8163, 0x1139, 0x812b, 0xfab, 0x80f7, 0xe1b, 0x80c8, - 0xc8b, 0x809e, 0xafb, 0x8079, 0x96a, 0x8059, 0x7d9, 0x803e, - 0x647, 0x8028, 0x4b6, 0x8017, 0x324, 0x800a, 0x192, 0x8003, -}; - -static const q15_t ALIGN4 WeightsQ15_512[1024] = { - 0x7fff, 0x0, 0x7fff, 0xff9c, 0x7fff, 0xff37, 0x7ffe, 0xfed3, - 0x7ffd, 0xfe6e, 0x7ffc, 0xfe0a, 0x7ffa, 0xfda5, 0x7ff8, 0xfd41, - 0x7ff6, 0xfcdc, 0x7ff3, 0xfc78, 0x7ff0, 0xfc13, 0x7fed, 0xfbaf, - 0x7fe9, 0xfb4a, 0x7fe5, 0xfae6, 0x7fe1, 0xfa81, 0x7fdd, 0xfa1d, - 0x7fd8, 0xf9b9, 0x7fd3, 0xf954, 0x7fce, 0xf8f0, 0x7fc8, 0xf88b, - 0x7fc2, 0xf827, 0x7fbc, 0xf7c3, 0x7fb5, 0xf75e, 0x7fae, 0xf6fa, - 0x7fa7, 0xf696, 0x7f9f, 0xf632, 0x7f97, 0xf5cd, 0x7f8f, 0xf569, - 0x7f87, 0xf505, 0x7f7e, 0xf4a1, 0x7f75, 0xf43d, 0x7f6b, 0xf3d9, - 0x7f62, 0xf375, 0x7f58, 0xf311, 0x7f4d, 0xf2ad, 0x7f43, 0xf249, - 0x7f38, 0xf1e5, 0x7f2d, 0xf181, 0x7f21, 0xf11d, 0x7f15, 0xf0b9, - 0x7f09, 0xf055, 0x7efd, 0xeff2, 0x7ef0, 0xef8e, 0x7ee3, 0xef2a, - 0x7ed5, 0xeec7, 0x7ec8, 0xee63, 0x7eba, 0xedff, 0x7eab, 0xed9c, - 0x7e9d, 0xed38, 0x7e8e, 0xecd5, 0x7e7f, 0xec72, 0x7e6f, 0xec0e, - 0x7e5f, 0xebab, 0x7e4f, 0xeb48, 0x7e3f, 0xeae5, 0x7e2e, 0xea81, - 0x7e1d, 0xea1e, 0x7e0c, 0xe9bb, 0x7dfa, 0xe958, 0x7de8, 0xe8f6, - 0x7dd6, 0xe893, 0x7dc3, 0xe830, 0x7db0, 0xe7cd, 0x7d9d, 0xe76a, - 0x7d8a, 0xe708, 0x7d76, 0xe6a5, 0x7d62, 0xe643, 0x7d4e, 0xe5e0, - 0x7d39, 0xe57e, 0x7d24, 0xe51c, 0x7d0f, 0xe4b9, 0x7cf9, 0xe457, - 0x7ce3, 0xe3f5, 0x7ccd, 0xe393, 0x7cb7, 0xe331, 0x7ca0, 0xe2cf, - 0x7c89, 0xe26d, 0x7c71, 0xe20b, 0x7c5a, 0xe1aa, 0x7c42, 0xe148, - 0x7c29, 0xe0e7, 0x7c11, 0xe085, 0x7bf8, 0xe024, 0x7bdf, 0xdfc2, - 0x7bc5, 0xdf61, 0x7bac, 0xdf00, 0x7b92, 0xde9f, 0x7b77, 0xde3e, - 0x7b5d, 0xdddd, 0x7b42, 0xdd7c, 0x7b26, 0xdd1b, 0x7b0b, 0xdcbb, - 0x7aef, 0xdc5a, 0x7ad3, 0xdbf9, 0x7ab6, 0xdb99, 0x7a9a, 0xdb39, - 0x7a7d, 0xdad8, 0x7a5f, 0xda78, 0x7a42, 0xda18, 0x7a24, 0xd9b8, - 0x7a05, 0xd958, 0x79e7, 0xd8f9, 0x79c8, 0xd899, 0x79a9, 0xd839, - 0x798a, 0xd7da, 0x796a, 0xd77a, 0x794a, 0xd71b, 0x792a, 0xd6bc, - 0x7909, 0xd65d, 0x78e8, 0xd5fe, 0x78c7, 0xd59f, 0x78a6, 0xd540, - 0x7884, 0xd4e1, 0x7862, 0xd483, 0x7840, 0xd424, 0x781d, 0xd3c6, - 0x77fa, 0xd368, 0x77d7, 0xd309, 0x77b4, 0xd2ab, 0x7790, 0xd24d, - 0x776c, 0xd1ef, 0x7747, 0xd192, 0x7723, 0xd134, 0x76fe, 0xd0d7, - 0x76d9, 0xd079, 0x76b3, 0xd01c, 0x768e, 0xcfbf, 0x7668, 0xcf62, - 0x7641, 0xcf05, 0x761b, 0xcea8, 0x75f4, 0xce4b, 0x75cc, 0xcdef, - 0x75a5, 0xcd92, 0x757d, 0xcd36, 0x7555, 0xccda, 0x752d, 0xcc7e, - 0x7504, 0xcc22, 0x74db, 0xcbc6, 0x74b2, 0xcb6a, 0x7489, 0xcb0e, - 0x745f, 0xcab3, 0x7435, 0xca58, 0x740b, 0xc9fc, 0x73e0, 0xc9a1, - 0x73b5, 0xc946, 0x738a, 0xc8ec, 0x735f, 0xc891, 0x7333, 0xc836, - 0x7307, 0xc7dc, 0x72db, 0xc782, 0x72af, 0xc728, 0x7282, 0xc6ce, - 0x7255, 0xc674, 0x7227, 0xc61a, 0x71fa, 0xc5c0, 0x71cc, 0xc567, - 0x719e, 0xc50e, 0x716f, 0xc4b4, 0x7141, 0xc45b, 0x7112, 0xc403, - 0x70e2, 0xc3aa, 0x70b3, 0xc351, 0x7083, 0xc2f9, 0x7053, 0xc2a0, - 0x7023, 0xc248, 0x6ff2, 0xc1f0, 0x6fc1, 0xc198, 0x6f90, 0xc141, - 0x6f5f, 0xc0e9, 0x6f2d, 0xc092, 0x6efb, 0xc03b, 0x6ec9, 0xbfe3, - 0x6e96, 0xbf8d, 0x6e63, 0xbf36, 0x6e30, 0xbedf, 0x6dfd, 0xbe89, - 0x6dca, 0xbe32, 0x6d96, 0xbddc, 0x6d62, 0xbd86, 0x6d2d, 0xbd30, - 0x6cf9, 0xbcdb, 0x6cc4, 0xbc85, 0x6c8f, 0xbc30, 0x6c59, 0xbbdb, - 0x6c24, 0xbb86, 0x6bee, 0xbb31, 0x6bb8, 0xbadc, 0x6b81, 0xba88, - 0x6b4a, 0xba33, 0x6b13, 0xb9df, 0x6adc, 0xb98b, 0x6aa5, 0xb937, - 0x6a6d, 0xb8e4, 0x6a35, 0xb890, 0x69fd, 0xb83d, 0x69c4, 0xb7ea, - 0x698c, 0xb797, 0x6953, 0xb744, 0x6919, 0xb6f1, 0x68e0, 0xb69f, - 0x68a6, 0xb64c, 0x686c, 0xb5fa, 0x6832, 0xb5a8, 0x67f7, 0xb557, - 0x67bd, 0xb505, 0x6782, 0xb4b4, 0x6746, 0xb462, 0x670b, 0xb411, - 0x66cf, 0xb3c1, 0x6693, 0xb370, 0x6657, 0xb31f, 0x661a, 0xb2cf, - 0x65dd, 0xb27f, 0x65a0, 0xb22f, 0x6563, 0xb1df, 0x6526, 0xb190, - 0x64e8, 0xb141, 0x64aa, 0xb0f1, 0x646c, 0xb0a2, 0x642d, 0xb054, - 0x63ef, 0xb005, 0x63b0, 0xafb7, 0x6371, 0xaf69, 0x6331, 0xaf1b, - 0x62f2, 0xaecd, 0x62b2, 0xae7f, 0x6271, 0xae32, 0x6231, 0xade4, - 0x61f1, 0xad97, 0x61b0, 0xad4b, 0x616f, 0xacfe, 0x612d, 0xacb2, - 0x60ec, 0xac65, 0x60aa, 0xac19, 0x6068, 0xabcd, 0x6026, 0xab82, - 0x5fe3, 0xab36, 0x5fa0, 0xaaeb, 0x5f5e, 0xaaa0, 0x5f1a, 0xaa55, - 0x5ed7, 0xaa0b, 0x5e93, 0xa9c0, 0x5e50, 0xa976, 0x5e0b, 0xa92c, - 0x5dc7, 0xa8e3, 0x5d83, 0xa899, 0x5d3e, 0xa850, 0x5cf9, 0xa807, - 0x5cb4, 0xa7be, 0x5c6e, 0xa775, 0x5c29, 0xa72c, 0x5be3, 0xa6e4, - 0x5b9d, 0xa69c, 0x5b56, 0xa654, 0x5b10, 0xa60d, 0x5ac9, 0xa5c5, - 0x5a82, 0xa57e, 0x5a3b, 0xa537, 0x59f3, 0xa4f0, 0x59ac, 0xa4aa, - 0x5964, 0xa463, 0x591c, 0xa41d, 0x58d4, 0xa3d7, 0x588b, 0xa392, - 0x5842, 0xa34c, 0x57f9, 0xa307, 0x57b0, 0xa2c2, 0x5767, 0xa27d, - 0x571d, 0xa239, 0x56d4, 0xa1f5, 0x568a, 0xa1b0, 0x5640, 0xa16d, - 0x55f5, 0xa129, 0x55ab, 0xa0e6, 0x5560, 0xa0a2, 0x5515, 0xa060, - 0x54ca, 0xa01d, 0x547e, 0x9fda, 0x5433, 0x9f98, 0x53e7, 0x9f56, - 0x539b, 0x9f14, 0x534e, 0x9ed3, 0x5302, 0x9e91, 0x52b5, 0x9e50, - 0x5269, 0x9e0f, 0x521c, 0x9dcf, 0x51ce, 0x9d8f, 0x5181, 0x9d4e, - 0x5133, 0x9d0e, 0x50e5, 0x9ccf, 0x5097, 0x9c8f, 0x5049, 0x9c50, - 0x4ffb, 0x9c11, 0x4fac, 0x9bd3, 0x4f5e, 0x9b94, 0x4f0f, 0x9b56, - 0x4ebf, 0x9b18, 0x4e70, 0x9ada, 0x4e21, 0x9a9d, 0x4dd1, 0x9a60, - 0x4d81, 0x9a23, 0x4d31, 0x99e6, 0x4ce1, 0x99a9, 0x4c90, 0x996d, - 0x4c3f, 0x9931, 0x4bef, 0x98f5, 0x4b9e, 0x98ba, 0x4b4c, 0x987e, - 0x4afb, 0x9843, 0x4aa9, 0x9809, 0x4a58, 0x97ce, 0x4a06, 0x9794, - 0x49b4, 0x975a, 0x4961, 0x9720, 0x490f, 0x96e7, 0x48bc, 0x96ad, - 0x4869, 0x9674, 0x4816, 0x963c, 0x47c3, 0x9603, 0x4770, 0x95cb, - 0x471c, 0x9593, 0x46c9, 0x955b, 0x4675, 0x9524, 0x4621, 0x94ed, - 0x45cd, 0x94b6, 0x4578, 0x947f, 0x4524, 0x9448, 0x44cf, 0x9412, - 0x447a, 0x93dc, 0x4425, 0x93a7, 0x43d0, 0x9371, 0x437b, 0x933c, - 0x4325, 0x9307, 0x42d0, 0x92d3, 0x427a, 0x929e, 0x4224, 0x926a, - 0x41ce, 0x9236, 0x4177, 0x9203, 0x4121, 0x91d0, 0x40ca, 0x919d, - 0x4073, 0x916a, 0x401d, 0x9137, 0x3fc5, 0x9105, 0x3f6e, 0x90d3, - 0x3f17, 0x90a1, 0x3ebf, 0x9070, 0x3e68, 0x903f, 0x3e10, 0x900e, - 0x3db8, 0x8fdd, 0x3d60, 0x8fad, 0x3d07, 0x8f7d, 0x3caf, 0x8f4d, - 0x3c56, 0x8f1e, 0x3bfd, 0x8eee, 0x3ba5, 0x8ebf, 0x3b4c, 0x8e91, - 0x3af2, 0x8e62, 0x3a99, 0x8e34, 0x3a40, 0x8e06, 0x39e6, 0x8dd9, - 0x398c, 0x8dab, 0x3932, 0x8d7e, 0x38d8, 0x8d51, 0x387e, 0x8d25, - 0x3824, 0x8cf9, 0x37ca, 0x8ccd, 0x376f, 0x8ca1, 0x3714, 0x8c76, - 0x36ba, 0x8c4b, 0x365f, 0x8c20, 0x3604, 0x8bf5, 0x35a8, 0x8bcb, - 0x354d, 0x8ba1, 0x34f2, 0x8b77, 0x3496, 0x8b4e, 0x343a, 0x8b25, - 0x33de, 0x8afc, 0x3382, 0x8ad3, 0x3326, 0x8aab, 0x32ca, 0x8a83, - 0x326e, 0x8a5b, 0x3211, 0x8a34, 0x31b5, 0x8a0c, 0x3158, 0x89e5, - 0x30fb, 0x89bf, 0x309e, 0x8998, 0x3041, 0x8972, 0x2fe4, 0x894d, - 0x2f87, 0x8927, 0x2f29, 0x8902, 0x2ecc, 0x88dd, 0x2e6e, 0x88b9, - 0x2e11, 0x8894, 0x2db3, 0x8870, 0x2d55, 0x884c, 0x2cf7, 0x8829, - 0x2c98, 0x8806, 0x2c3a, 0x87e3, 0x2bdc, 0x87c0, 0x2b7d, 0x879e, - 0x2b1f, 0x877c, 0x2ac0, 0x875a, 0x2a61, 0x8739, 0x2a02, 0x8718, - 0x29a3, 0x86f7, 0x2944, 0x86d6, 0x28e5, 0x86b6, 0x2886, 0x8696, - 0x2826, 0x8676, 0x27c7, 0x8657, 0x2767, 0x8638, 0x2707, 0x8619, - 0x26a8, 0x85fb, 0x2648, 0x85dc, 0x25e8, 0x85be, 0x2588, 0x85a1, - 0x2528, 0x8583, 0x24c7, 0x8566, 0x2467, 0x854a, 0x2407, 0x852d, - 0x23a6, 0x8511, 0x2345, 0x84f5, 0x22e5, 0x84da, 0x2284, 0x84be, - 0x2223, 0x84a3, 0x21c2, 0x8489, 0x2161, 0x846e, 0x2100, 0x8454, - 0x209f, 0x843b, 0x203e, 0x8421, 0x1fdc, 0x8408, 0x1f7b, 0x83ef, - 0x1f19, 0x83d7, 0x1eb8, 0x83be, 0x1e56, 0x83a6, 0x1df5, 0x838f, - 0x1d93, 0x8377, 0x1d31, 0x8360, 0x1ccf, 0x8349, 0x1c6d, 0x8333, - 0x1c0b, 0x831d, 0x1ba9, 0x8307, 0x1b47, 0x82f1, 0x1ae4, 0x82dc, - 0x1a82, 0x82c7, 0x1a20, 0x82b2, 0x19bd, 0x829e, 0x195b, 0x828a, - 0x18f8, 0x8276, 0x1896, 0x8263, 0x1833, 0x8250, 0x17d0, 0x823d, - 0x176d, 0x822a, 0x170a, 0x8218, 0x16a8, 0x8206, 0x1645, 0x81f4, - 0x15e2, 0x81e3, 0x157f, 0x81d2, 0x151b, 0x81c1, 0x14b8, 0x81b1, - 0x1455, 0x81a1, 0x13f2, 0x8191, 0x138e, 0x8181, 0x132b, 0x8172, - 0x12c8, 0x8163, 0x1264, 0x8155, 0x1201, 0x8146, 0x119d, 0x8138, - 0x1139, 0x812b, 0x10d6, 0x811d, 0x1072, 0x8110, 0x100e, 0x8103, - 0xfab, 0x80f7, 0xf47, 0x80eb, 0xee3, 0x80df, 0xe7f, 0x80d3, - 0xe1b, 0x80c8, 0xdb7, 0x80bd, 0xd53, 0x80b3, 0xcef, 0x80a8, - 0xc8b, 0x809e, 0xc27, 0x8095, 0xbc3, 0x808b, 0xb5f, 0x8082, - 0xafb, 0x8079, 0xa97, 0x8071, 0xa33, 0x8069, 0x9ce, 0x8061, - 0x96a, 0x8059, 0x906, 0x8052, 0x8a2, 0x804b, 0x83d, 0x8044, - 0x7d9, 0x803e, 0x775, 0x8038, 0x710, 0x8032, 0x6ac, 0x802d, - 0x647, 0x8028, 0x5e3, 0x8023, 0x57f, 0x801f, 0x51a, 0x801b, - 0x4b6, 0x8017, 0x451, 0x8013, 0x3ed, 0x8010, 0x388, 0x800d, - 0x324, 0x800a, 0x2bf, 0x8008, 0x25b, 0x8006, 0x1f6, 0x8004, - 0x192, 0x8003, 0x12d, 0x8002, 0xc9, 0x8001, 0x64, 0x8001, -}; - -static const q15_t ALIGN4 WeightsQ15_2048[4096] = { - 0x7fff, 0x0, 0x7fff, 0xffe7, 0x7fff, 0xffce, 0x7fff, 0xffb5, - 0x7fff, 0xff9c, 0x7fff, 0xff83, 0x7fff, 0xff6a, 0x7fff, 0xff51, - 0x7fff, 0xff37, 0x7fff, 0xff1e, 0x7fff, 0xff05, 0x7ffe, 0xfeec, - 0x7ffe, 0xfed3, 0x7ffe, 0xfeba, 0x7ffe, 0xfea1, 0x7ffd, 0xfe88, - 0x7ffd, 0xfe6e, 0x7ffd, 0xfe55, 0x7ffc, 0xfe3c, 0x7ffc, 0xfe23, - 0x7ffc, 0xfe0a, 0x7ffb, 0xfdf1, 0x7ffb, 0xfdd8, 0x7ffa, 0xfdbe, - 0x7ffa, 0xfda5, 0x7ff9, 0xfd8c, 0x7ff9, 0xfd73, 0x7ff8, 0xfd5a, - 0x7ff8, 0xfd41, 0x7ff7, 0xfd28, 0x7ff7, 0xfd0f, 0x7ff6, 0xfcf5, - 0x7ff6, 0xfcdc, 0x7ff5, 0xfcc3, 0x7ff4, 0xfcaa, 0x7ff4, 0xfc91, - 0x7ff3, 0xfc78, 0x7ff2, 0xfc5f, 0x7ff2, 0xfc46, 0x7ff1, 0xfc2c, - 0x7ff0, 0xfc13, 0x7fef, 0xfbfa, 0x7fee, 0xfbe1, 0x7fee, 0xfbc8, - 0x7fed, 0xfbaf, 0x7fec, 0xfb96, 0x7feb, 0xfb7d, 0x7fea, 0xfb64, - 0x7fe9, 0xfb4a, 0x7fe8, 0xfb31, 0x7fe7, 0xfb18, 0x7fe6, 0xfaff, - 0x7fe5, 0xfae6, 0x7fe4, 0xfacd, 0x7fe3, 0xfab4, 0x7fe2, 0xfa9b, - 0x7fe1, 0xfa81, 0x7fe0, 0xfa68, 0x7fdf, 0xfa4f, 0x7fde, 0xfa36, - 0x7fdd, 0xfa1d, 0x7fdc, 0xfa04, 0x7fda, 0xf9eb, 0x7fd9, 0xf9d2, - 0x7fd8, 0xf9b9, 0x7fd7, 0xf9a0, 0x7fd6, 0xf986, 0x7fd4, 0xf96d, - 0x7fd3, 0xf954, 0x7fd2, 0xf93b, 0x7fd0, 0xf922, 0x7fcf, 0xf909, - 0x7fce, 0xf8f0, 0x7fcc, 0xf8d7, 0x7fcb, 0xf8be, 0x7fc9, 0xf8a5, - 0x7fc8, 0xf88b, 0x7fc6, 0xf872, 0x7fc5, 0xf859, 0x7fc3, 0xf840, - 0x7fc2, 0xf827, 0x7fc0, 0xf80e, 0x7fbf, 0xf7f5, 0x7fbd, 0xf7dc, - 0x7fbc, 0xf7c3, 0x7fba, 0xf7aa, 0x7fb8, 0xf791, 0x7fb7, 0xf778, - 0x7fb5, 0xf75e, 0x7fb3, 0xf745, 0x7fb1, 0xf72c, 0x7fb0, 0xf713, - 0x7fae, 0xf6fa, 0x7fac, 0xf6e1, 0x7faa, 0xf6c8, 0x7fa9, 0xf6af, - 0x7fa7, 0xf696, 0x7fa5, 0xf67d, 0x7fa3, 0xf664, 0x7fa1, 0xf64b, - 0x7f9f, 0xf632, 0x7f9d, 0xf619, 0x7f9b, 0xf600, 0x7f99, 0xf5e7, - 0x7f97, 0xf5cd, 0x7f95, 0xf5b4, 0x7f93, 0xf59b, 0x7f91, 0xf582, - 0x7f8f, 0xf569, 0x7f8d, 0xf550, 0x7f8b, 0xf537, 0x7f89, 0xf51e, - 0x7f87, 0xf505, 0x7f85, 0xf4ec, 0x7f82, 0xf4d3, 0x7f80, 0xf4ba, - 0x7f7e, 0xf4a1, 0x7f7c, 0xf488, 0x7f79, 0xf46f, 0x7f77, 0xf456, - 0x7f75, 0xf43d, 0x7f72, 0xf424, 0x7f70, 0xf40b, 0x7f6e, 0xf3f2, - 0x7f6b, 0xf3d9, 0x7f69, 0xf3c0, 0x7f67, 0xf3a7, 0x7f64, 0xf38e, - 0x7f62, 0xf375, 0x7f5f, 0xf35c, 0x7f5d, 0xf343, 0x7f5a, 0xf32a, - 0x7f58, 0xf311, 0x7f55, 0xf2f8, 0x7f53, 0xf2df, 0x7f50, 0xf2c6, - 0x7f4d, 0xf2ad, 0x7f4b, 0xf294, 0x7f48, 0xf27b, 0x7f45, 0xf262, - 0x7f43, 0xf249, 0x7f40, 0xf230, 0x7f3d, 0xf217, 0x7f3b, 0xf1fe, - 0x7f38, 0xf1e5, 0x7f35, 0xf1cc, 0x7f32, 0xf1b3, 0x7f2f, 0xf19a, - 0x7f2d, 0xf181, 0x7f2a, 0xf168, 0x7f27, 0xf14f, 0x7f24, 0xf136, - 0x7f21, 0xf11d, 0x7f1e, 0xf104, 0x7f1b, 0xf0eb, 0x7f18, 0xf0d2, - 0x7f15, 0xf0b9, 0x7f12, 0xf0a0, 0x7f0f, 0xf087, 0x7f0c, 0xf06e, - 0x7f09, 0xf055, 0x7f06, 0xf03c, 0x7f03, 0xf023, 0x7f00, 0xf00b, - 0x7efd, 0xeff2, 0x7ef9, 0xefd9, 0x7ef6, 0xefc0, 0x7ef3, 0xefa7, - 0x7ef0, 0xef8e, 0x7eed, 0xef75, 0x7ee9, 0xef5c, 0x7ee6, 0xef43, - 0x7ee3, 0xef2a, 0x7edf, 0xef11, 0x7edc, 0xeef8, 0x7ed9, 0xeedf, - 0x7ed5, 0xeec7, 0x7ed2, 0xeeae, 0x7ecf, 0xee95, 0x7ecb, 0xee7c, - 0x7ec8, 0xee63, 0x7ec4, 0xee4a, 0x7ec1, 0xee31, 0x7ebd, 0xee18, - 0x7eba, 0xedff, 0x7eb6, 0xede7, 0x7eb3, 0xedce, 0x7eaf, 0xedb5, - 0x7eab, 0xed9c, 0x7ea8, 0xed83, 0x7ea4, 0xed6a, 0x7ea1, 0xed51, - 0x7e9d, 0xed38, 0x7e99, 0xed20, 0x7e95, 0xed07, 0x7e92, 0xecee, - 0x7e8e, 0xecd5, 0x7e8a, 0xecbc, 0x7e86, 0xeca3, 0x7e83, 0xec8a, - 0x7e7f, 0xec72, 0x7e7b, 0xec59, 0x7e77, 0xec40, 0x7e73, 0xec27, - 0x7e6f, 0xec0e, 0x7e6b, 0xebf5, 0x7e67, 0xebdd, 0x7e63, 0xebc4, - 0x7e5f, 0xebab, 0x7e5b, 0xeb92, 0x7e57, 0xeb79, 0x7e53, 0xeb61, - 0x7e4f, 0xeb48, 0x7e4b, 0xeb2f, 0x7e47, 0xeb16, 0x7e43, 0xeafd, - 0x7e3f, 0xeae5, 0x7e3b, 0xeacc, 0x7e37, 0xeab3, 0x7e32, 0xea9a, - 0x7e2e, 0xea81, 0x7e2a, 0xea69, 0x7e26, 0xea50, 0x7e21, 0xea37, - 0x7e1d, 0xea1e, 0x7e19, 0xea06, 0x7e14, 0xe9ed, 0x7e10, 0xe9d4, - 0x7e0c, 0xe9bb, 0x7e07, 0xe9a3, 0x7e03, 0xe98a, 0x7dff, 0xe971, - 0x7dfa, 0xe958, 0x7df6, 0xe940, 0x7df1, 0xe927, 0x7ded, 0xe90e, - 0x7de8, 0xe8f6, 0x7de4, 0xe8dd, 0x7ddf, 0xe8c4, 0x7dda, 0xe8ab, - 0x7dd6, 0xe893, 0x7dd1, 0xe87a, 0x7dcd, 0xe861, 0x7dc8, 0xe849, - 0x7dc3, 0xe830, 0x7dbf, 0xe817, 0x7dba, 0xe7fe, 0x7db5, 0xe7e6, - 0x7db0, 0xe7cd, 0x7dac, 0xe7b4, 0x7da7, 0xe79c, 0x7da2, 0xe783, - 0x7d9d, 0xe76a, 0x7d98, 0xe752, 0x7d94, 0xe739, 0x7d8f, 0xe720, - 0x7d8a, 0xe708, 0x7d85, 0xe6ef, 0x7d80, 0xe6d6, 0x7d7b, 0xe6be, - 0x7d76, 0xe6a5, 0x7d71, 0xe68d, 0x7d6c, 0xe674, 0x7d67, 0xe65b, - 0x7d62, 0xe643, 0x7d5d, 0xe62a, 0x7d58, 0xe611, 0x7d53, 0xe5f9, - 0x7d4e, 0xe5e0, 0x7d49, 0xe5c8, 0x7d43, 0xe5af, 0x7d3e, 0xe596, - 0x7d39, 0xe57e, 0x7d34, 0xe565, 0x7d2f, 0xe54d, 0x7d29, 0xe534, - 0x7d24, 0xe51c, 0x7d1f, 0xe503, 0x7d19, 0xe4ea, 0x7d14, 0xe4d2, - 0x7d0f, 0xe4b9, 0x7d09, 0xe4a1, 0x7d04, 0xe488, 0x7cff, 0xe470, - 0x7cf9, 0xe457, 0x7cf4, 0xe43f, 0x7cee, 0xe426, 0x7ce9, 0xe40e, - 0x7ce3, 0xe3f5, 0x7cde, 0xe3dc, 0x7cd8, 0xe3c4, 0x7cd3, 0xe3ab, - 0x7ccd, 0xe393, 0x7cc8, 0xe37a, 0x7cc2, 0xe362, 0x7cbc, 0xe349, - 0x7cb7, 0xe331, 0x7cb1, 0xe318, 0x7cab, 0xe300, 0x7ca6, 0xe2e8, - 0x7ca0, 0xe2cf, 0x7c9a, 0xe2b7, 0x7c94, 0xe29e, 0x7c8f, 0xe286, - 0x7c89, 0xe26d, 0x7c83, 0xe255, 0x7c7d, 0xe23c, 0x7c77, 0xe224, - 0x7c71, 0xe20b, 0x7c6c, 0xe1f3, 0x7c66, 0xe1db, 0x7c60, 0xe1c2, - 0x7c5a, 0xe1aa, 0x7c54, 0xe191, 0x7c4e, 0xe179, 0x7c48, 0xe160, - 0x7c42, 0xe148, 0x7c3c, 0xe130, 0x7c36, 0xe117, 0x7c30, 0xe0ff, - 0x7c29, 0xe0e7, 0x7c23, 0xe0ce, 0x7c1d, 0xe0b6, 0x7c17, 0xe09d, - 0x7c11, 0xe085, 0x7c0b, 0xe06d, 0x7c05, 0xe054, 0x7bfe, 0xe03c, - 0x7bf8, 0xe024, 0x7bf2, 0xe00b, 0x7beb, 0xdff3, 0x7be5, 0xdfdb, - 0x7bdf, 0xdfc2, 0x7bd9, 0xdfaa, 0x7bd2, 0xdf92, 0x7bcc, 0xdf79, - 0x7bc5, 0xdf61, 0x7bbf, 0xdf49, 0x7bb9, 0xdf30, 0x7bb2, 0xdf18, - 0x7bac, 0xdf00, 0x7ba5, 0xdee8, 0x7b9f, 0xdecf, 0x7b98, 0xdeb7, - 0x7b92, 0xde9f, 0x7b8b, 0xde87, 0x7b84, 0xde6e, 0x7b7e, 0xde56, - 0x7b77, 0xde3e, 0x7b71, 0xde26, 0x7b6a, 0xde0d, 0x7b63, 0xddf5, - 0x7b5d, 0xdddd, 0x7b56, 0xddc5, 0x7b4f, 0xddac, 0x7b48, 0xdd94, - 0x7b42, 0xdd7c, 0x7b3b, 0xdd64, 0x7b34, 0xdd4c, 0x7b2d, 0xdd33, - 0x7b26, 0xdd1b, 0x7b1f, 0xdd03, 0x7b19, 0xdceb, 0x7b12, 0xdcd3, - 0x7b0b, 0xdcbb, 0x7b04, 0xdca2, 0x7afd, 0xdc8a, 0x7af6, 0xdc72, - 0x7aef, 0xdc5a, 0x7ae8, 0xdc42, 0x7ae1, 0xdc2a, 0x7ada, 0xdc12, - 0x7ad3, 0xdbf9, 0x7acc, 0xdbe1, 0x7ac5, 0xdbc9, 0x7abd, 0xdbb1, - 0x7ab6, 0xdb99, 0x7aaf, 0xdb81, 0x7aa8, 0xdb69, 0x7aa1, 0xdb51, - 0x7a9a, 0xdb39, 0x7a92, 0xdb21, 0x7a8b, 0xdb09, 0x7a84, 0xdaf1, - 0x7a7d, 0xdad8, 0x7a75, 0xdac0, 0x7a6e, 0xdaa8, 0x7a67, 0xda90, - 0x7a5f, 0xda78, 0x7a58, 0xda60, 0x7a50, 0xda48, 0x7a49, 0xda30, - 0x7a42, 0xda18, 0x7a3a, 0xda00, 0x7a33, 0xd9e8, 0x7a2b, 0xd9d0, - 0x7a24, 0xd9b8, 0x7a1c, 0xd9a0, 0x7a15, 0xd988, 0x7a0d, 0xd970, - 0x7a05, 0xd958, 0x79fe, 0xd940, 0x79f6, 0xd928, 0x79ef, 0xd911, - 0x79e7, 0xd8f9, 0x79df, 0xd8e1, 0x79d8, 0xd8c9, 0x79d0, 0xd8b1, - 0x79c8, 0xd899, 0x79c0, 0xd881, 0x79b9, 0xd869, 0x79b1, 0xd851, - 0x79a9, 0xd839, 0x79a1, 0xd821, 0x7999, 0xd80a, 0x7992, 0xd7f2, - 0x798a, 0xd7da, 0x7982, 0xd7c2, 0x797a, 0xd7aa, 0x7972, 0xd792, - 0x796a, 0xd77a, 0x7962, 0xd763, 0x795a, 0xd74b, 0x7952, 0xd733, - 0x794a, 0xd71b, 0x7942, 0xd703, 0x793a, 0xd6eb, 0x7932, 0xd6d4, - 0x792a, 0xd6bc, 0x7922, 0xd6a4, 0x7919, 0xd68c, 0x7911, 0xd675, - 0x7909, 0xd65d, 0x7901, 0xd645, 0x78f9, 0xd62d, 0x78f1, 0xd615, - 0x78e8, 0xd5fe, 0x78e0, 0xd5e6, 0x78d8, 0xd5ce, 0x78cf, 0xd5b7, - 0x78c7, 0xd59f, 0x78bf, 0xd587, 0x78b6, 0xd56f, 0x78ae, 0xd558, - 0x78a6, 0xd540, 0x789d, 0xd528, 0x7895, 0xd511, 0x788c, 0xd4f9, - 0x7884, 0xd4e1, 0x787c, 0xd4ca, 0x7873, 0xd4b2, 0x786b, 0xd49a, - 0x7862, 0xd483, 0x7859, 0xd46b, 0x7851, 0xd453, 0x7848, 0xd43c, - 0x7840, 0xd424, 0x7837, 0xd40d, 0x782e, 0xd3f5, 0x7826, 0xd3dd, - 0x781d, 0xd3c6, 0x7814, 0xd3ae, 0x780c, 0xd397, 0x7803, 0xd37f, - 0x77fa, 0xd368, 0x77f1, 0xd350, 0x77e9, 0xd338, 0x77e0, 0xd321, - 0x77d7, 0xd309, 0x77ce, 0xd2f2, 0x77c5, 0xd2da, 0x77bc, 0xd2c3, - 0x77b4, 0xd2ab, 0x77ab, 0xd294, 0x77a2, 0xd27c, 0x7799, 0xd265, - 0x7790, 0xd24d, 0x7787, 0xd236, 0x777e, 0xd21e, 0x7775, 0xd207, - 0x776c, 0xd1ef, 0x7763, 0xd1d8, 0x775a, 0xd1c1, 0x7751, 0xd1a9, - 0x7747, 0xd192, 0x773e, 0xd17a, 0x7735, 0xd163, 0x772c, 0xd14b, - 0x7723, 0xd134, 0x771a, 0xd11d, 0x7710, 0xd105, 0x7707, 0xd0ee, - 0x76fe, 0xd0d7, 0x76f5, 0xd0bf, 0x76eb, 0xd0a8, 0x76e2, 0xd091, - 0x76d9, 0xd079, 0x76cf, 0xd062, 0x76c6, 0xd04b, 0x76bd, 0xd033, - 0x76b3, 0xd01c, 0x76aa, 0xd005, 0x76a0, 0xcfed, 0x7697, 0xcfd6, - 0x768e, 0xcfbf, 0x7684, 0xcfa7, 0x767b, 0xcf90, 0x7671, 0xcf79, - 0x7668, 0xcf62, 0x765e, 0xcf4a, 0x7654, 0xcf33, 0x764b, 0xcf1c, - 0x7641, 0xcf05, 0x7638, 0xceee, 0x762e, 0xced6, 0x7624, 0xcebf, - 0x761b, 0xcea8, 0x7611, 0xce91, 0x7607, 0xce7a, 0x75fd, 0xce62, - 0x75f4, 0xce4b, 0x75ea, 0xce34, 0x75e0, 0xce1d, 0x75d6, 0xce06, - 0x75cc, 0xcdef, 0x75c3, 0xcdd8, 0x75b9, 0xcdc0, 0x75af, 0xcda9, - 0x75a5, 0xcd92, 0x759b, 0xcd7b, 0x7591, 0xcd64, 0x7587, 0xcd4d, - 0x757d, 0xcd36, 0x7573, 0xcd1f, 0x7569, 0xcd08, 0x755f, 0xccf1, - 0x7555, 0xccda, 0x754b, 0xccc3, 0x7541, 0xccac, 0x7537, 0xcc95, - 0x752d, 0xcc7e, 0x7523, 0xcc67, 0x7519, 0xcc50, 0x750f, 0xcc39, - 0x7504, 0xcc22, 0x74fa, 0xcc0b, 0x74f0, 0xcbf4, 0x74e6, 0xcbdd, - 0x74db, 0xcbc6, 0x74d1, 0xcbaf, 0x74c7, 0xcb98, 0x74bd, 0xcb81, - 0x74b2, 0xcb6a, 0x74a8, 0xcb53, 0x749e, 0xcb3c, 0x7493, 0xcb25, - 0x7489, 0xcb0e, 0x747e, 0xcaf8, 0x7474, 0xcae1, 0x746a, 0xcaca, - 0x745f, 0xcab3, 0x7455, 0xca9c, 0x744a, 0xca85, 0x7440, 0xca6e, - 0x7435, 0xca58, 0x742b, 0xca41, 0x7420, 0xca2a, 0x7415, 0xca13, - 0x740b, 0xc9fc, 0x7400, 0xc9e6, 0x73f6, 0xc9cf, 0x73eb, 0xc9b8, - 0x73e0, 0xc9a1, 0x73d6, 0xc98b, 0x73cb, 0xc974, 0x73c0, 0xc95d, - 0x73b5, 0xc946, 0x73ab, 0xc930, 0x73a0, 0xc919, 0x7395, 0xc902, - 0x738a, 0xc8ec, 0x737f, 0xc8d5, 0x7375, 0xc8be, 0x736a, 0xc8a8, - 0x735f, 0xc891, 0x7354, 0xc87a, 0x7349, 0xc864, 0x733e, 0xc84d, - 0x7333, 0xc836, 0x7328, 0xc820, 0x731d, 0xc809, 0x7312, 0xc7f3, - 0x7307, 0xc7dc, 0x72fc, 0xc7c5, 0x72f1, 0xc7af, 0x72e6, 0xc798, - 0x72db, 0xc782, 0x72d0, 0xc76b, 0x72c5, 0xc755, 0x72ba, 0xc73e, - 0x72af, 0xc728, 0x72a3, 0xc711, 0x7298, 0xc6fa, 0x728d, 0xc6e4, - 0x7282, 0xc6ce, 0x7276, 0xc6b7, 0x726b, 0xc6a1, 0x7260, 0xc68a, - 0x7255, 0xc674, 0x7249, 0xc65d, 0x723e, 0xc647, 0x7233, 0xc630, - 0x7227, 0xc61a, 0x721c, 0xc603, 0x7211, 0xc5ed, 0x7205, 0xc5d7, - 0x71fa, 0xc5c0, 0x71ee, 0xc5aa, 0x71e3, 0xc594, 0x71d7, 0xc57d, - 0x71cc, 0xc567, 0x71c0, 0xc551, 0x71b5, 0xc53a, 0x71a9, 0xc524, - 0x719e, 0xc50e, 0x7192, 0xc4f7, 0x7186, 0xc4e1, 0x717b, 0xc4cb, - 0x716f, 0xc4b4, 0x7164, 0xc49e, 0x7158, 0xc488, 0x714c, 0xc472, - 0x7141, 0xc45b, 0x7135, 0xc445, 0x7129, 0xc42f, 0x711d, 0xc419, - 0x7112, 0xc403, 0x7106, 0xc3ec, 0x70fa, 0xc3d6, 0x70ee, 0xc3c0, - 0x70e2, 0xc3aa, 0x70d6, 0xc394, 0x70cb, 0xc37d, 0x70bf, 0xc367, - 0x70b3, 0xc351, 0x70a7, 0xc33b, 0x709b, 0xc325, 0x708f, 0xc30f, - 0x7083, 0xc2f9, 0x7077, 0xc2e3, 0x706b, 0xc2cd, 0x705f, 0xc2b7, - 0x7053, 0xc2a0, 0x7047, 0xc28a, 0x703b, 0xc274, 0x702f, 0xc25e, - 0x7023, 0xc248, 0x7016, 0xc232, 0x700a, 0xc21c, 0x6ffe, 0xc206, - 0x6ff2, 0xc1f0, 0x6fe6, 0xc1da, 0x6fda, 0xc1c4, 0x6fcd, 0xc1ae, - 0x6fc1, 0xc198, 0x6fb5, 0xc183, 0x6fa9, 0xc16d, 0x6f9c, 0xc157, - 0x6f90, 0xc141, 0x6f84, 0xc12b, 0x6f77, 0xc115, 0x6f6b, 0xc0ff, - 0x6f5f, 0xc0e9, 0x6f52, 0xc0d3, 0x6f46, 0xc0bd, 0x6f39, 0xc0a8, - 0x6f2d, 0xc092, 0x6f20, 0xc07c, 0x6f14, 0xc066, 0x6f07, 0xc050, - 0x6efb, 0xc03b, 0x6eee, 0xc025, 0x6ee2, 0xc00f, 0x6ed5, 0xbff9, - 0x6ec9, 0xbfe3, 0x6ebc, 0xbfce, 0x6eaf, 0xbfb8, 0x6ea3, 0xbfa2, - 0x6e96, 0xbf8d, 0x6e89, 0xbf77, 0x6e7d, 0xbf61, 0x6e70, 0xbf4b, - 0x6e63, 0xbf36, 0x6e57, 0xbf20, 0x6e4a, 0xbf0a, 0x6e3d, 0xbef5, - 0x6e30, 0xbedf, 0x6e24, 0xbeca, 0x6e17, 0xbeb4, 0x6e0a, 0xbe9e, - 0x6dfd, 0xbe89, 0x6df0, 0xbe73, 0x6de3, 0xbe5e, 0x6dd6, 0xbe48, - 0x6dca, 0xbe32, 0x6dbd, 0xbe1d, 0x6db0, 0xbe07, 0x6da3, 0xbdf2, - 0x6d96, 0xbddc, 0x6d89, 0xbdc7, 0x6d7c, 0xbdb1, 0x6d6f, 0xbd9c, - 0x6d62, 0xbd86, 0x6d55, 0xbd71, 0x6d48, 0xbd5b, 0x6d3a, 0xbd46, - 0x6d2d, 0xbd30, 0x6d20, 0xbd1b, 0x6d13, 0xbd06, 0x6d06, 0xbcf0, - 0x6cf9, 0xbcdb, 0x6cec, 0xbcc5, 0x6cde, 0xbcb0, 0x6cd1, 0xbc9b, - 0x6cc4, 0xbc85, 0x6cb7, 0xbc70, 0x6ca9, 0xbc5b, 0x6c9c, 0xbc45, - 0x6c8f, 0xbc30, 0x6c81, 0xbc1b, 0x6c74, 0xbc05, 0x6c67, 0xbbf0, - 0x6c59, 0xbbdb, 0x6c4c, 0xbbc5, 0x6c3f, 0xbbb0, 0x6c31, 0xbb9b, - 0x6c24, 0xbb86, 0x6c16, 0xbb70, 0x6c09, 0xbb5b, 0x6bfb, 0xbb46, - 0x6bee, 0xbb31, 0x6be0, 0xbb1c, 0x6bd3, 0xbb06, 0x6bc5, 0xbaf1, - 0x6bb8, 0xbadc, 0x6baa, 0xbac7, 0x6b9c, 0xbab2, 0x6b8f, 0xba9d, - 0x6b81, 0xba88, 0x6b73, 0xba73, 0x6b66, 0xba5d, 0x6b58, 0xba48, - 0x6b4a, 0xba33, 0x6b3d, 0xba1e, 0x6b2f, 0xba09, 0x6b21, 0xb9f4, - 0x6b13, 0xb9df, 0x6b06, 0xb9ca, 0x6af8, 0xb9b5, 0x6aea, 0xb9a0, - 0x6adc, 0xb98b, 0x6ace, 0xb976, 0x6ac1, 0xb961, 0x6ab3, 0xb94c, - 0x6aa5, 0xb937, 0x6a97, 0xb922, 0x6a89, 0xb90d, 0x6a7b, 0xb8f8, - 0x6a6d, 0xb8e4, 0x6a5f, 0xb8cf, 0x6a51, 0xb8ba, 0x6a43, 0xb8a5, - 0x6a35, 0xb890, 0x6a27, 0xb87b, 0x6a19, 0xb866, 0x6a0b, 0xb852, - 0x69fd, 0xb83d, 0x69ef, 0xb828, 0x69e1, 0xb813, 0x69d3, 0xb7fe, - 0x69c4, 0xb7ea, 0x69b6, 0xb7d5, 0x69a8, 0xb7c0, 0x699a, 0xb7ab, - 0x698c, 0xb797, 0x697d, 0xb782, 0x696f, 0xb76d, 0x6961, 0xb758, - 0x6953, 0xb744, 0x6944, 0xb72f, 0x6936, 0xb71a, 0x6928, 0xb706, - 0x6919, 0xb6f1, 0x690b, 0xb6dd, 0x68fd, 0xb6c8, 0x68ee, 0xb6b3, - 0x68e0, 0xb69f, 0x68d1, 0xb68a, 0x68c3, 0xb676, 0x68b5, 0xb661, - 0x68a6, 0xb64c, 0x6898, 0xb638, 0x6889, 0xb623, 0x687b, 0xb60f, - 0x686c, 0xb5fa, 0x685e, 0xb5e6, 0x684f, 0xb5d1, 0x6840, 0xb5bd, - 0x6832, 0xb5a8, 0x6823, 0xb594, 0x6815, 0xb57f, 0x6806, 0xb56b, - 0x67f7, 0xb557, 0x67e9, 0xb542, 0x67da, 0xb52e, 0x67cb, 0xb519, - 0x67bd, 0xb505, 0x67ae, 0xb4f1, 0x679f, 0xb4dc, 0x6790, 0xb4c8, - 0x6782, 0xb4b4, 0x6773, 0xb49f, 0x6764, 0xb48b, 0x6755, 0xb477, - 0x6746, 0xb462, 0x6737, 0xb44e, 0x6729, 0xb43a, 0x671a, 0xb426, - 0x670b, 0xb411, 0x66fc, 0xb3fd, 0x66ed, 0xb3e9, 0x66de, 0xb3d5, - 0x66cf, 0xb3c1, 0x66c0, 0xb3ac, 0x66b1, 0xb398, 0x66a2, 0xb384, - 0x6693, 0xb370, 0x6684, 0xb35c, 0x6675, 0xb348, 0x6666, 0xb334, - 0x6657, 0xb31f, 0x6648, 0xb30b, 0x6639, 0xb2f7, 0x6629, 0xb2e3, - 0x661a, 0xb2cf, 0x660b, 0xb2bb, 0x65fc, 0xb2a7, 0x65ed, 0xb293, - 0x65dd, 0xb27f, 0x65ce, 0xb26b, 0x65bf, 0xb257, 0x65b0, 0xb243, - 0x65a0, 0xb22f, 0x6591, 0xb21b, 0x6582, 0xb207, 0x6573, 0xb1f3, - 0x6563, 0xb1df, 0x6554, 0xb1cc, 0x6545, 0xb1b8, 0x6535, 0xb1a4, - 0x6526, 0xb190, 0x6516, 0xb17c, 0x6507, 0xb168, 0x64f7, 0xb154, - 0x64e8, 0xb141, 0x64d9, 0xb12d, 0x64c9, 0xb119, 0x64ba, 0xb105, - 0x64aa, 0xb0f1, 0x649b, 0xb0de, 0x648b, 0xb0ca, 0x647b, 0xb0b6, - 0x646c, 0xb0a2, 0x645c, 0xb08f, 0x644d, 0xb07b, 0x643d, 0xb067, - 0x642d, 0xb054, 0x641e, 0xb040, 0x640e, 0xb02c, 0x63fe, 0xb019, - 0x63ef, 0xb005, 0x63df, 0xaff1, 0x63cf, 0xafde, 0x63c0, 0xafca, - 0x63b0, 0xafb7, 0x63a0, 0xafa3, 0x6390, 0xaf90, 0x6380, 0xaf7c, - 0x6371, 0xaf69, 0x6361, 0xaf55, 0x6351, 0xaf41, 0x6341, 0xaf2e, - 0x6331, 0xaf1b, 0x6321, 0xaf07, 0x6311, 0xaef4, 0x6301, 0xaee0, - 0x62f2, 0xaecd, 0x62e2, 0xaeb9, 0x62d2, 0xaea6, 0x62c2, 0xae92, - 0x62b2, 0xae7f, 0x62a2, 0xae6c, 0x6292, 0xae58, 0x6282, 0xae45, - 0x6271, 0xae32, 0x6261, 0xae1e, 0x6251, 0xae0b, 0x6241, 0xadf8, - 0x6231, 0xade4, 0x6221, 0xadd1, 0x6211, 0xadbe, 0x6201, 0xadab, - 0x61f1, 0xad97, 0x61e0, 0xad84, 0x61d0, 0xad71, 0x61c0, 0xad5e, - 0x61b0, 0xad4b, 0x619f, 0xad37, 0x618f, 0xad24, 0x617f, 0xad11, - 0x616f, 0xacfe, 0x615e, 0xaceb, 0x614e, 0xacd8, 0x613e, 0xacc5, - 0x612d, 0xacb2, 0x611d, 0xac9e, 0x610d, 0xac8b, 0x60fc, 0xac78, - 0x60ec, 0xac65, 0x60db, 0xac52, 0x60cb, 0xac3f, 0x60ba, 0xac2c, - 0x60aa, 0xac19, 0x6099, 0xac06, 0x6089, 0xabf3, 0x6078, 0xabe0, - 0x6068, 0xabcd, 0x6057, 0xabbb, 0x6047, 0xaba8, 0x6036, 0xab95, - 0x6026, 0xab82, 0x6015, 0xab6f, 0x6004, 0xab5c, 0x5ff4, 0xab49, - 0x5fe3, 0xab36, 0x5fd3, 0xab24, 0x5fc2, 0xab11, 0x5fb1, 0xaafe, - 0x5fa0, 0xaaeb, 0x5f90, 0xaad8, 0x5f7f, 0xaac6, 0x5f6e, 0xaab3, - 0x5f5e, 0xaaa0, 0x5f4d, 0xaa8e, 0x5f3c, 0xaa7b, 0x5f2b, 0xaa68, - 0x5f1a, 0xaa55, 0x5f0a, 0xaa43, 0x5ef9, 0xaa30, 0x5ee8, 0xaa1d, - 0x5ed7, 0xaa0b, 0x5ec6, 0xa9f8, 0x5eb5, 0xa9e6, 0x5ea4, 0xa9d3, - 0x5e93, 0xa9c0, 0x5e82, 0xa9ae, 0x5e71, 0xa99b, 0x5e60, 0xa989, - 0x5e50, 0xa976, 0x5e3f, 0xa964, 0x5e2d, 0xa951, 0x5e1c, 0xa93f, - 0x5e0b, 0xa92c, 0x5dfa, 0xa91a, 0x5de9, 0xa907, 0x5dd8, 0xa8f5, - 0x5dc7, 0xa8e3, 0x5db6, 0xa8d0, 0x5da5, 0xa8be, 0x5d94, 0xa8ab, - 0x5d83, 0xa899, 0x5d71, 0xa887, 0x5d60, 0xa874, 0x5d4f, 0xa862, - 0x5d3e, 0xa850, 0x5d2d, 0xa83d, 0x5d1b, 0xa82b, 0x5d0a, 0xa819, - 0x5cf9, 0xa807, 0x5ce8, 0xa7f4, 0x5cd6, 0xa7e2, 0x5cc5, 0xa7d0, - 0x5cb4, 0xa7be, 0x5ca2, 0xa7ab, 0x5c91, 0xa799, 0x5c80, 0xa787, - 0x5c6e, 0xa775, 0x5c5d, 0xa763, 0x5c4b, 0xa751, 0x5c3a, 0xa73f, - 0x5c29, 0xa72c, 0x5c17, 0xa71a, 0x5c06, 0xa708, 0x5bf4, 0xa6f6, - 0x5be3, 0xa6e4, 0x5bd1, 0xa6d2, 0x5bc0, 0xa6c0, 0x5bae, 0xa6ae, - 0x5b9d, 0xa69c, 0x5b8b, 0xa68a, 0x5b79, 0xa678, 0x5b68, 0xa666, - 0x5b56, 0xa654, 0x5b45, 0xa642, 0x5b33, 0xa630, 0x5b21, 0xa61f, - 0x5b10, 0xa60d, 0x5afe, 0xa5fb, 0x5aec, 0xa5e9, 0x5adb, 0xa5d7, - 0x5ac9, 0xa5c5, 0x5ab7, 0xa5b3, 0x5aa5, 0xa5a2, 0x5a94, 0xa590, - 0x5a82, 0xa57e, 0x5a70, 0xa56c, 0x5a5e, 0xa55b, 0x5a4d, 0xa549, - 0x5a3b, 0xa537, 0x5a29, 0xa525, 0x5a17, 0xa514, 0x5a05, 0xa502, - 0x59f3, 0xa4f0, 0x59e1, 0xa4df, 0x59d0, 0xa4cd, 0x59be, 0xa4bb, - 0x59ac, 0xa4aa, 0x599a, 0xa498, 0x5988, 0xa487, 0x5976, 0xa475, - 0x5964, 0xa463, 0x5952, 0xa452, 0x5940, 0xa440, 0x592e, 0xa42f, - 0x591c, 0xa41d, 0x590a, 0xa40c, 0x58f8, 0xa3fa, 0x58e6, 0xa3e9, - 0x58d4, 0xa3d7, 0x58c1, 0xa3c6, 0x58af, 0xa3b5, 0x589d, 0xa3a3, - 0x588b, 0xa392, 0x5879, 0xa380, 0x5867, 0xa36f, 0x5855, 0xa35e, - 0x5842, 0xa34c, 0x5830, 0xa33b, 0x581e, 0xa32a, 0x580c, 0xa318, - 0x57f9, 0xa307, 0x57e7, 0xa2f6, 0x57d5, 0xa2e5, 0x57c3, 0xa2d3, - 0x57b0, 0xa2c2, 0x579e, 0xa2b1, 0x578c, 0xa2a0, 0x5779, 0xa28f, - 0x5767, 0xa27d, 0x5755, 0xa26c, 0x5742, 0xa25b, 0x5730, 0xa24a, - 0x571d, 0xa239, 0x570b, 0xa228, 0x56f9, 0xa217, 0x56e6, 0xa206, - 0x56d4, 0xa1f5, 0x56c1, 0xa1e4, 0x56af, 0xa1d3, 0x569c, 0xa1c1, - 0x568a, 0xa1b0, 0x5677, 0xa1a0, 0x5665, 0xa18f, 0x5652, 0xa17e, - 0x5640, 0xa16d, 0x562d, 0xa15c, 0x561a, 0xa14b, 0x5608, 0xa13a, - 0x55f5, 0xa129, 0x55e3, 0xa118, 0x55d0, 0xa107, 0x55bd, 0xa0f6, - 0x55ab, 0xa0e6, 0x5598, 0xa0d5, 0x5585, 0xa0c4, 0x5572, 0xa0b3, - 0x5560, 0xa0a2, 0x554d, 0xa092, 0x553a, 0xa081, 0x5528, 0xa070, - 0x5515, 0xa060, 0x5502, 0xa04f, 0x54ef, 0xa03e, 0x54dc, 0xa02d, - 0x54ca, 0xa01d, 0x54b7, 0xa00c, 0x54a4, 0x9ffc, 0x5491, 0x9feb, - 0x547e, 0x9fda, 0x546b, 0x9fca, 0x5458, 0x9fb9, 0x5445, 0x9fa9, - 0x5433, 0x9f98, 0x5420, 0x9f88, 0x540d, 0x9f77, 0x53fa, 0x9f67, - 0x53e7, 0x9f56, 0x53d4, 0x9f46, 0x53c1, 0x9f35, 0x53ae, 0x9f25, - 0x539b, 0x9f14, 0x5388, 0x9f04, 0x5375, 0x9ef3, 0x5362, 0x9ee3, - 0x534e, 0x9ed3, 0x533b, 0x9ec2, 0x5328, 0x9eb2, 0x5315, 0x9ea2, - 0x5302, 0x9e91, 0x52ef, 0x9e81, 0x52dc, 0x9e71, 0x52c9, 0x9e61, - 0x52b5, 0x9e50, 0x52a2, 0x9e40, 0x528f, 0x9e30, 0x527c, 0x9e20, - 0x5269, 0x9e0f, 0x5255, 0x9dff, 0x5242, 0x9def, 0x522f, 0x9ddf, - 0x521c, 0x9dcf, 0x5208, 0x9dbf, 0x51f5, 0x9daf, 0x51e2, 0x9d9f, - 0x51ce, 0x9d8f, 0x51bb, 0x9d7e, 0x51a8, 0x9d6e, 0x5194, 0x9d5e, - 0x5181, 0x9d4e, 0x516e, 0x9d3e, 0x515a, 0x9d2e, 0x5147, 0x9d1e, - 0x5133, 0x9d0e, 0x5120, 0x9cff, 0x510c, 0x9cef, 0x50f9, 0x9cdf, - 0x50e5, 0x9ccf, 0x50d2, 0x9cbf, 0x50bf, 0x9caf, 0x50ab, 0x9c9f, - 0x5097, 0x9c8f, 0x5084, 0x9c80, 0x5070, 0x9c70, 0x505d, 0x9c60, - 0x5049, 0x9c50, 0x5036, 0x9c40, 0x5022, 0x9c31, 0x500f, 0x9c21, - 0x4ffb, 0x9c11, 0x4fe7, 0x9c02, 0x4fd4, 0x9bf2, 0x4fc0, 0x9be2, - 0x4fac, 0x9bd3, 0x4f99, 0x9bc3, 0x4f85, 0x9bb3, 0x4f71, 0x9ba4, - 0x4f5e, 0x9b94, 0x4f4a, 0x9b85, 0x4f36, 0x9b75, 0x4f22, 0x9b65, - 0x4f0f, 0x9b56, 0x4efb, 0x9b46, 0x4ee7, 0x9b37, 0x4ed3, 0x9b27, - 0x4ebf, 0x9b18, 0x4eac, 0x9b09, 0x4e98, 0x9af9, 0x4e84, 0x9aea, - 0x4e70, 0x9ada, 0x4e5c, 0x9acb, 0x4e48, 0x9abb, 0x4e34, 0x9aac, - 0x4e21, 0x9a9d, 0x4e0d, 0x9a8d, 0x4df9, 0x9a7e, 0x4de5, 0x9a6f, - 0x4dd1, 0x9a60, 0x4dbd, 0x9a50, 0x4da9, 0x9a41, 0x4d95, 0x9a32, - 0x4d81, 0x9a23, 0x4d6d, 0x9a13, 0x4d59, 0x9a04, 0x4d45, 0x99f5, - 0x4d31, 0x99e6, 0x4d1d, 0x99d7, 0x4d09, 0x99c7, 0x4cf5, 0x99b8, - 0x4ce1, 0x99a9, 0x4ccc, 0x999a, 0x4cb8, 0x998b, 0x4ca4, 0x997c, - 0x4c90, 0x996d, 0x4c7c, 0x995e, 0x4c68, 0x994f, 0x4c54, 0x9940, - 0x4c3f, 0x9931, 0x4c2b, 0x9922, 0x4c17, 0x9913, 0x4c03, 0x9904, - 0x4bef, 0x98f5, 0x4bda, 0x98e6, 0x4bc6, 0x98d7, 0x4bb2, 0x98c9, - 0x4b9e, 0x98ba, 0x4b89, 0x98ab, 0x4b75, 0x989c, 0x4b61, 0x988d, - 0x4b4c, 0x987e, 0x4b38, 0x9870, 0x4b24, 0x9861, 0x4b0f, 0x9852, - 0x4afb, 0x9843, 0x4ae7, 0x9835, 0x4ad2, 0x9826, 0x4abe, 0x9817, - 0x4aa9, 0x9809, 0x4a95, 0x97fa, 0x4a81, 0x97eb, 0x4a6c, 0x97dd, - 0x4a58, 0x97ce, 0x4a43, 0x97c0, 0x4a2f, 0x97b1, 0x4a1a, 0x97a2, - 0x4a06, 0x9794, 0x49f1, 0x9785, 0x49dd, 0x9777, 0x49c8, 0x9768, - 0x49b4, 0x975a, 0x499f, 0x974b, 0x498a, 0x973d, 0x4976, 0x972f, - 0x4961, 0x9720, 0x494d, 0x9712, 0x4938, 0x9703, 0x4923, 0x96f5, - 0x490f, 0x96e7, 0x48fa, 0x96d8, 0x48e6, 0x96ca, 0x48d1, 0x96bc, - 0x48bc, 0x96ad, 0x48a8, 0x969f, 0x4893, 0x9691, 0x487e, 0x9683, - 0x4869, 0x9674, 0x4855, 0x9666, 0x4840, 0x9658, 0x482b, 0x964a, - 0x4816, 0x963c, 0x4802, 0x962d, 0x47ed, 0x961f, 0x47d8, 0x9611, - 0x47c3, 0x9603, 0x47ae, 0x95f5, 0x479a, 0x95e7, 0x4785, 0x95d9, - 0x4770, 0x95cb, 0x475b, 0x95bd, 0x4746, 0x95af, 0x4731, 0x95a1, - 0x471c, 0x9593, 0x4708, 0x9585, 0x46f3, 0x9577, 0x46de, 0x9569, - 0x46c9, 0x955b, 0x46b4, 0x954d, 0x469f, 0x953f, 0x468a, 0x9532, - 0x4675, 0x9524, 0x4660, 0x9516, 0x464b, 0x9508, 0x4636, 0x94fa, - 0x4621, 0x94ed, 0x460c, 0x94df, 0x45f7, 0x94d1, 0x45e2, 0x94c3, - 0x45cd, 0x94b6, 0x45b8, 0x94a8, 0x45a3, 0x949a, 0x458d, 0x948d, - 0x4578, 0x947f, 0x4563, 0x9471, 0x454e, 0x9464, 0x4539, 0x9456, - 0x4524, 0x9448, 0x450f, 0x943b, 0x44fa, 0x942d, 0x44e4, 0x9420, - 0x44cf, 0x9412, 0x44ba, 0x9405, 0x44a5, 0x93f7, 0x4490, 0x93ea, - 0x447a, 0x93dc, 0x4465, 0x93cf, 0x4450, 0x93c1, 0x443b, 0x93b4, - 0x4425, 0x93a7, 0x4410, 0x9399, 0x43fb, 0x938c, 0x43e5, 0x937f, - 0x43d0, 0x9371, 0x43bb, 0x9364, 0x43a5, 0x9357, 0x4390, 0x9349, - 0x437b, 0x933c, 0x4365, 0x932f, 0x4350, 0x9322, 0x433b, 0x9314, - 0x4325, 0x9307, 0x4310, 0x92fa, 0x42fa, 0x92ed, 0x42e5, 0x92e0, - 0x42d0, 0x92d3, 0x42ba, 0x92c6, 0x42a5, 0x92b8, 0x428f, 0x92ab, - 0x427a, 0x929e, 0x4264, 0x9291, 0x424f, 0x9284, 0x4239, 0x9277, - 0x4224, 0x926a, 0x420e, 0x925d, 0x41f9, 0x9250, 0x41e3, 0x9243, - 0x41ce, 0x9236, 0x41b8, 0x922a, 0x41a2, 0x921d, 0x418d, 0x9210, - 0x4177, 0x9203, 0x4162, 0x91f6, 0x414c, 0x91e9, 0x4136, 0x91dc, - 0x4121, 0x91d0, 0x410b, 0x91c3, 0x40f6, 0x91b6, 0x40e0, 0x91a9, - 0x40ca, 0x919d, 0x40b5, 0x9190, 0x409f, 0x9183, 0x4089, 0x9177, - 0x4073, 0x916a, 0x405e, 0x915d, 0x4048, 0x9151, 0x4032, 0x9144, - 0x401d, 0x9137, 0x4007, 0x912b, 0x3ff1, 0x911e, 0x3fdb, 0x9112, - 0x3fc5, 0x9105, 0x3fb0, 0x90f9, 0x3f9a, 0x90ec, 0x3f84, 0x90e0, - 0x3f6e, 0x90d3, 0x3f58, 0x90c7, 0x3f43, 0x90ba, 0x3f2d, 0x90ae, - 0x3f17, 0x90a1, 0x3f01, 0x9095, 0x3eeb, 0x9089, 0x3ed5, 0x907c, - 0x3ebf, 0x9070, 0x3ea9, 0x9064, 0x3e93, 0x9057, 0x3e7d, 0x904b, - 0x3e68, 0x903f, 0x3e52, 0x9033, 0x3e3c, 0x9026, 0x3e26, 0x901a, - 0x3e10, 0x900e, 0x3dfa, 0x9002, 0x3de4, 0x8ff6, 0x3dce, 0x8fea, - 0x3db8, 0x8fdd, 0x3da2, 0x8fd1, 0x3d8c, 0x8fc5, 0x3d76, 0x8fb9, - 0x3d60, 0x8fad, 0x3d49, 0x8fa1, 0x3d33, 0x8f95, 0x3d1d, 0x8f89, - 0x3d07, 0x8f7d, 0x3cf1, 0x8f71, 0x3cdb, 0x8f65, 0x3cc5, 0x8f59, - 0x3caf, 0x8f4d, 0x3c99, 0x8f41, 0x3c83, 0x8f35, 0x3c6c, 0x8f2a, - 0x3c56, 0x8f1e, 0x3c40, 0x8f12, 0x3c2a, 0x8f06, 0x3c14, 0x8efa, - 0x3bfd, 0x8eee, 0x3be7, 0x8ee3, 0x3bd1, 0x8ed7, 0x3bbb, 0x8ecb, - 0x3ba5, 0x8ebf, 0x3b8e, 0x8eb4, 0x3b78, 0x8ea8, 0x3b62, 0x8e9c, - 0x3b4c, 0x8e91, 0x3b35, 0x8e85, 0x3b1f, 0x8e7a, 0x3b09, 0x8e6e, - 0x3af2, 0x8e62, 0x3adc, 0x8e57, 0x3ac6, 0x8e4b, 0x3aaf, 0x8e40, - 0x3a99, 0x8e34, 0x3a83, 0x8e29, 0x3a6c, 0x8e1d, 0x3a56, 0x8e12, - 0x3a40, 0x8e06, 0x3a29, 0x8dfb, 0x3a13, 0x8def, 0x39fd, 0x8de4, - 0x39e6, 0x8dd9, 0x39d0, 0x8dcd, 0x39b9, 0x8dc2, 0x39a3, 0x8db7, - 0x398c, 0x8dab, 0x3976, 0x8da0, 0x395f, 0x8d95, 0x3949, 0x8d8a, - 0x3932, 0x8d7e, 0x391c, 0x8d73, 0x3906, 0x8d68, 0x38ef, 0x8d5d, - 0x38d8, 0x8d51, 0x38c2, 0x8d46, 0x38ab, 0x8d3b, 0x3895, 0x8d30, - 0x387e, 0x8d25, 0x3868, 0x8d1a, 0x3851, 0x8d0f, 0x383b, 0x8d04, - 0x3824, 0x8cf9, 0x380d, 0x8cee, 0x37f7, 0x8ce3, 0x37e0, 0x8cd8, - 0x37ca, 0x8ccd, 0x37b3, 0x8cc2, 0x379c, 0x8cb7, 0x3786, 0x8cac, - 0x376f, 0x8ca1, 0x3758, 0x8c96, 0x3742, 0x8c8b, 0x372b, 0x8c81, - 0x3714, 0x8c76, 0x36fe, 0x8c6b, 0x36e7, 0x8c60, 0x36d0, 0x8c55, - 0x36ba, 0x8c4b, 0x36a3, 0x8c40, 0x368c, 0x8c35, 0x3675, 0x8c2a, - 0x365f, 0x8c20, 0x3648, 0x8c15, 0x3631, 0x8c0a, 0x361a, 0x8c00, - 0x3604, 0x8bf5, 0x35ed, 0x8beb, 0x35d6, 0x8be0, 0x35bf, 0x8bd5, - 0x35a8, 0x8bcb, 0x3592, 0x8bc0, 0x357b, 0x8bb6, 0x3564, 0x8bab, - 0x354d, 0x8ba1, 0x3536, 0x8b96, 0x351f, 0x8b8c, 0x3508, 0x8b82, - 0x34f2, 0x8b77, 0x34db, 0x8b6d, 0x34c4, 0x8b62, 0x34ad, 0x8b58, - 0x3496, 0x8b4e, 0x347f, 0x8b43, 0x3468, 0x8b39, 0x3451, 0x8b2f, - 0x343a, 0x8b25, 0x3423, 0x8b1a, 0x340c, 0x8b10, 0x33f5, 0x8b06, - 0x33de, 0x8afc, 0x33c7, 0x8af1, 0x33b0, 0x8ae7, 0x3399, 0x8add, - 0x3382, 0x8ad3, 0x336b, 0x8ac9, 0x3354, 0x8abf, 0x333d, 0x8ab5, - 0x3326, 0x8aab, 0x330f, 0x8aa1, 0x32f8, 0x8a97, 0x32e1, 0x8a8d, - 0x32ca, 0x8a83, 0x32b3, 0x8a79, 0x329c, 0x8a6f, 0x3285, 0x8a65, - 0x326e, 0x8a5b, 0x3257, 0x8a51, 0x3240, 0x8a47, 0x3228, 0x8a3d, - 0x3211, 0x8a34, 0x31fa, 0x8a2a, 0x31e3, 0x8a20, 0x31cc, 0x8a16, - 0x31b5, 0x8a0c, 0x319e, 0x8a03, 0x3186, 0x89f9, 0x316f, 0x89ef, - 0x3158, 0x89e5, 0x3141, 0x89dc, 0x312a, 0x89d2, 0x3112, 0x89c8, - 0x30fb, 0x89bf, 0x30e4, 0x89b5, 0x30cd, 0x89ac, 0x30b6, 0x89a2, - 0x309e, 0x8998, 0x3087, 0x898f, 0x3070, 0x8985, 0x3059, 0x897c, - 0x3041, 0x8972, 0x302a, 0x8969, 0x3013, 0x8960, 0x2ffb, 0x8956, - 0x2fe4, 0x894d, 0x2fcd, 0x8943, 0x2fb5, 0x893a, 0x2f9e, 0x8931, - 0x2f87, 0x8927, 0x2f6f, 0x891e, 0x2f58, 0x8915, 0x2f41, 0x890b, - 0x2f29, 0x8902, 0x2f12, 0x88f9, 0x2efb, 0x88f0, 0x2ee3, 0x88e6, - 0x2ecc, 0x88dd, 0x2eb5, 0x88d4, 0x2e9d, 0x88cb, 0x2e86, 0x88c2, - 0x2e6e, 0x88b9, 0x2e57, 0x88af, 0x2e3f, 0x88a6, 0x2e28, 0x889d, - 0x2e11, 0x8894, 0x2df9, 0x888b, 0x2de2, 0x8882, 0x2dca, 0x8879, - 0x2db3, 0x8870, 0x2d9b, 0x8867, 0x2d84, 0x885e, 0x2d6c, 0x8855, - 0x2d55, 0x884c, 0x2d3d, 0x8844, 0x2d26, 0x883b, 0x2d0e, 0x8832, - 0x2cf7, 0x8829, 0x2cdf, 0x8820, 0x2cc8, 0x8817, 0x2cb0, 0x880f, - 0x2c98, 0x8806, 0x2c81, 0x87fd, 0x2c69, 0x87f4, 0x2c52, 0x87ec, - 0x2c3a, 0x87e3, 0x2c23, 0x87da, 0x2c0b, 0x87d2, 0x2bf3, 0x87c9, - 0x2bdc, 0x87c0, 0x2bc4, 0x87b8, 0x2bad, 0x87af, 0x2b95, 0x87a7, - 0x2b7d, 0x879e, 0x2b66, 0x8795, 0x2b4e, 0x878d, 0x2b36, 0x8784, - 0x2b1f, 0x877c, 0x2b07, 0x8774, 0x2aef, 0x876b, 0x2ad8, 0x8763, - 0x2ac0, 0x875a, 0x2aa8, 0x8752, 0x2a91, 0x874a, 0x2a79, 0x8741, - 0x2a61, 0x8739, 0x2a49, 0x8731, 0x2a32, 0x8728, 0x2a1a, 0x8720, - 0x2a02, 0x8718, 0x29eb, 0x870f, 0x29d3, 0x8707, 0x29bb, 0x86ff, - 0x29a3, 0x86f7, 0x298b, 0x86ef, 0x2974, 0x86e7, 0x295c, 0x86de, - 0x2944, 0x86d6, 0x292c, 0x86ce, 0x2915, 0x86c6, 0x28fd, 0x86be, - 0x28e5, 0x86b6, 0x28cd, 0x86ae, 0x28b5, 0x86a6, 0x289d, 0x869e, - 0x2886, 0x8696, 0x286e, 0x868e, 0x2856, 0x8686, 0x283e, 0x867e, - 0x2826, 0x8676, 0x280e, 0x866e, 0x27f6, 0x8667, 0x27df, 0x865f, - 0x27c7, 0x8657, 0x27af, 0x864f, 0x2797, 0x8647, 0x277f, 0x8640, - 0x2767, 0x8638, 0x274f, 0x8630, 0x2737, 0x8628, 0x271f, 0x8621, - 0x2707, 0x8619, 0x26ef, 0x8611, 0x26d8, 0x860a, 0x26c0, 0x8602, - 0x26a8, 0x85fb, 0x2690, 0x85f3, 0x2678, 0x85eb, 0x2660, 0x85e4, - 0x2648, 0x85dc, 0x2630, 0x85d5, 0x2618, 0x85cd, 0x2600, 0x85c6, - 0x25e8, 0x85be, 0x25d0, 0x85b7, 0x25b8, 0x85b0, 0x25a0, 0x85a8, - 0x2588, 0x85a1, 0x2570, 0x8599, 0x2558, 0x8592, 0x2540, 0x858b, - 0x2528, 0x8583, 0x250f, 0x857c, 0x24f7, 0x8575, 0x24df, 0x856e, - 0x24c7, 0x8566, 0x24af, 0x855f, 0x2497, 0x8558, 0x247f, 0x8551, - 0x2467, 0x854a, 0x244f, 0x8543, 0x2437, 0x853b, 0x241f, 0x8534, - 0x2407, 0x852d, 0x23ee, 0x8526, 0x23d6, 0x851f, 0x23be, 0x8518, - 0x23a6, 0x8511, 0x238e, 0x850a, 0x2376, 0x8503, 0x235e, 0x84fc, - 0x2345, 0x84f5, 0x232d, 0x84ee, 0x2315, 0x84e7, 0x22fd, 0x84e1, - 0x22e5, 0x84da, 0x22cd, 0x84d3, 0x22b4, 0x84cc, 0x229c, 0x84c5, - 0x2284, 0x84be, 0x226c, 0x84b8, 0x2254, 0x84b1, 0x223b, 0x84aa, - 0x2223, 0x84a3, 0x220b, 0x849d, 0x21f3, 0x8496, 0x21da, 0x848f, - 0x21c2, 0x8489, 0x21aa, 0x8482, 0x2192, 0x847c, 0x2179, 0x8475, - 0x2161, 0x846e, 0x2149, 0x8468, 0x2131, 0x8461, 0x2118, 0x845b, - 0x2100, 0x8454, 0x20e8, 0x844e, 0x20d0, 0x8447, 0x20b7, 0x8441, - 0x209f, 0x843b, 0x2087, 0x8434, 0x206e, 0x842e, 0x2056, 0x8427, - 0x203e, 0x8421, 0x2025, 0x841b, 0x200d, 0x8415, 0x1ff5, 0x840e, - 0x1fdc, 0x8408, 0x1fc4, 0x8402, 0x1fac, 0x83fb, 0x1f93, 0x83f5, - 0x1f7b, 0x83ef, 0x1f63, 0x83e9, 0x1f4a, 0x83e3, 0x1f32, 0x83dd, - 0x1f19, 0x83d7, 0x1f01, 0x83d0, 0x1ee9, 0x83ca, 0x1ed0, 0x83c4, - 0x1eb8, 0x83be, 0x1ea0, 0x83b8, 0x1e87, 0x83b2, 0x1e6f, 0x83ac, - 0x1e56, 0x83a6, 0x1e3e, 0x83a0, 0x1e25, 0x839a, 0x1e0d, 0x8394, - 0x1df5, 0x838f, 0x1ddc, 0x8389, 0x1dc4, 0x8383, 0x1dab, 0x837d, - 0x1d93, 0x8377, 0x1d7a, 0x8371, 0x1d62, 0x836c, 0x1d49, 0x8366, - 0x1d31, 0x8360, 0x1d18, 0x835a, 0x1d00, 0x8355, 0x1ce8, 0x834f, - 0x1ccf, 0x8349, 0x1cb7, 0x8344, 0x1c9e, 0x833e, 0x1c86, 0x8338, - 0x1c6d, 0x8333, 0x1c55, 0x832d, 0x1c3c, 0x8328, 0x1c24, 0x8322, - 0x1c0b, 0x831d, 0x1bf2, 0x8317, 0x1bda, 0x8312, 0x1bc1, 0x830c, - 0x1ba9, 0x8307, 0x1b90, 0x8301, 0x1b78, 0x82fc, 0x1b5f, 0x82f7, - 0x1b47, 0x82f1, 0x1b2e, 0x82ec, 0x1b16, 0x82e7, 0x1afd, 0x82e1, - 0x1ae4, 0x82dc, 0x1acc, 0x82d7, 0x1ab3, 0x82d1, 0x1a9b, 0x82cc, - 0x1a82, 0x82c7, 0x1a6a, 0x82c2, 0x1a51, 0x82bd, 0x1a38, 0x82b7, - 0x1a20, 0x82b2, 0x1a07, 0x82ad, 0x19ef, 0x82a8, 0x19d6, 0x82a3, - 0x19bd, 0x829e, 0x19a5, 0x8299, 0x198c, 0x8294, 0x1973, 0x828f, - 0x195b, 0x828a, 0x1942, 0x8285, 0x192a, 0x8280, 0x1911, 0x827b, - 0x18f8, 0x8276, 0x18e0, 0x8271, 0x18c7, 0x826c, 0x18ae, 0x8268, - 0x1896, 0x8263, 0x187d, 0x825e, 0x1864, 0x8259, 0x184c, 0x8254, - 0x1833, 0x8250, 0x181a, 0x824b, 0x1802, 0x8246, 0x17e9, 0x8241, - 0x17d0, 0x823d, 0x17b7, 0x8238, 0x179f, 0x8233, 0x1786, 0x822f, - 0x176d, 0x822a, 0x1755, 0x8226, 0x173c, 0x8221, 0x1723, 0x821c, - 0x170a, 0x8218, 0x16f2, 0x8213, 0x16d9, 0x820f, 0x16c0, 0x820a, - 0x16a8, 0x8206, 0x168f, 0x8201, 0x1676, 0x81fd, 0x165d, 0x81f9, - 0x1645, 0x81f4, 0x162c, 0x81f0, 0x1613, 0x81ec, 0x15fa, 0x81e7, - 0x15e2, 0x81e3, 0x15c9, 0x81df, 0x15b0, 0x81da, 0x1597, 0x81d6, - 0x157f, 0x81d2, 0x1566, 0x81ce, 0x154d, 0x81c9, 0x1534, 0x81c5, - 0x151b, 0x81c1, 0x1503, 0x81bd, 0x14ea, 0x81b9, 0x14d1, 0x81b5, - 0x14b8, 0x81b1, 0x149f, 0x81ad, 0x1487, 0x81a9, 0x146e, 0x81a5, - 0x1455, 0x81a1, 0x143c, 0x819d, 0x1423, 0x8199, 0x140b, 0x8195, - 0x13f2, 0x8191, 0x13d9, 0x818d, 0x13c0, 0x8189, 0x13a7, 0x8185, - 0x138e, 0x8181, 0x1376, 0x817d, 0x135d, 0x817a, 0x1344, 0x8176, - 0x132b, 0x8172, 0x1312, 0x816e, 0x12f9, 0x816b, 0x12e0, 0x8167, - 0x12c8, 0x8163, 0x12af, 0x815f, 0x1296, 0x815c, 0x127d, 0x8158, - 0x1264, 0x8155, 0x124b, 0x8151, 0x1232, 0x814d, 0x1219, 0x814a, - 0x1201, 0x8146, 0x11e8, 0x8143, 0x11cf, 0x813f, 0x11b6, 0x813c, - 0x119d, 0x8138, 0x1184, 0x8135, 0x116b, 0x8131, 0x1152, 0x812e, - 0x1139, 0x812b, 0x1121, 0x8127, 0x1108, 0x8124, 0x10ef, 0x8121, - 0x10d6, 0x811d, 0x10bd, 0x811a, 0x10a4, 0x8117, 0x108b, 0x8113, - 0x1072, 0x8110, 0x1059, 0x810d, 0x1040, 0x810a, 0x1027, 0x8107, - 0x100e, 0x8103, 0xff5, 0x8100, 0xfdd, 0x80fd, 0xfc4, 0x80fa, - 0xfab, 0x80f7, 0xf92, 0x80f4, 0xf79, 0x80f1, 0xf60, 0x80ee, - 0xf47, 0x80eb, 0xf2e, 0x80e8, 0xf15, 0x80e5, 0xefc, 0x80e2, - 0xee3, 0x80df, 0xeca, 0x80dc, 0xeb1, 0x80d9, 0xe98, 0x80d6, - 0xe7f, 0x80d3, 0xe66, 0x80d1, 0xe4d, 0x80ce, 0xe34, 0x80cb, - 0xe1b, 0x80c8, 0xe02, 0x80c5, 0xde9, 0x80c3, 0xdd0, 0x80c0, - 0xdb7, 0x80bd, 0xd9e, 0x80bb, 0xd85, 0x80b8, 0xd6c, 0x80b5, - 0xd53, 0x80b3, 0xd3a, 0x80b0, 0xd21, 0x80ad, 0xd08, 0x80ab, - 0xcef, 0x80a8, 0xcd6, 0x80a6, 0xcbd, 0x80a3, 0xca4, 0x80a1, - 0xc8b, 0x809e, 0xc72, 0x809c, 0xc59, 0x8099, 0xc40, 0x8097, - 0xc27, 0x8095, 0xc0e, 0x8092, 0xbf5, 0x8090, 0xbdc, 0x808e, - 0xbc3, 0x808b, 0xbaa, 0x8089, 0xb91, 0x8087, 0xb78, 0x8084, - 0xb5f, 0x8082, 0xb46, 0x8080, 0xb2d, 0x807e, 0xb14, 0x807b, - 0xafb, 0x8079, 0xae2, 0x8077, 0xac9, 0x8075, 0xab0, 0x8073, - 0xa97, 0x8071, 0xa7e, 0x806f, 0xa65, 0x806d, 0xa4c, 0x806b, - 0xa33, 0x8069, 0xa19, 0x8067, 0xa00, 0x8065, 0x9e7, 0x8063, - 0x9ce, 0x8061, 0x9b5, 0x805f, 0x99c, 0x805d, 0x983, 0x805b, - 0x96a, 0x8059, 0x951, 0x8057, 0x938, 0x8056, 0x91f, 0x8054, - 0x906, 0x8052, 0x8ed, 0x8050, 0x8d4, 0x804f, 0x8bb, 0x804d, - 0x8a2, 0x804b, 0x888, 0x8049, 0x86f, 0x8048, 0x856, 0x8046, - 0x83d, 0x8044, 0x824, 0x8043, 0x80b, 0x8041, 0x7f2, 0x8040, - 0x7d9, 0x803e, 0x7c0, 0x803d, 0x7a7, 0x803b, 0x78e, 0x803a, - 0x775, 0x8038, 0x75b, 0x8037, 0x742, 0x8035, 0x729, 0x8034, - 0x710, 0x8032, 0x6f7, 0x8031, 0x6de, 0x8030, 0x6c5, 0x802e, - 0x6ac, 0x802d, 0x693, 0x802c, 0x67a, 0x802a, 0x660, 0x8029, - 0x647, 0x8028, 0x62e, 0x8027, 0x615, 0x8026, 0x5fc, 0x8024, - 0x5e3, 0x8023, 0x5ca, 0x8022, 0x5b1, 0x8021, 0x598, 0x8020, - 0x57f, 0x801f, 0x565, 0x801e, 0x54c, 0x801d, 0x533, 0x801c, - 0x51a, 0x801b, 0x501, 0x801a, 0x4e8, 0x8019, 0x4cf, 0x8018, - 0x4b6, 0x8017, 0x49c, 0x8016, 0x483, 0x8015, 0x46a, 0x8014, - 0x451, 0x8013, 0x438, 0x8012, 0x41f, 0x8012, 0x406, 0x8011, - 0x3ed, 0x8010, 0x3d4, 0x800f, 0x3ba, 0x800e, 0x3a1, 0x800e, - 0x388, 0x800d, 0x36f, 0x800c, 0x356, 0x800c, 0x33d, 0x800b, - 0x324, 0x800a, 0x30b, 0x800a, 0x2f1, 0x8009, 0x2d8, 0x8009, - 0x2bf, 0x8008, 0x2a6, 0x8008, 0x28d, 0x8007, 0x274, 0x8007, - 0x25b, 0x8006, 0x242, 0x8006, 0x228, 0x8005, 0x20f, 0x8005, - 0x1f6, 0x8004, 0x1dd, 0x8004, 0x1c4, 0x8004, 0x1ab, 0x8003, - 0x192, 0x8003, 0x178, 0x8003, 0x15f, 0x8002, 0x146, 0x8002, - 0x12d, 0x8002, 0x114, 0x8002, 0xfb, 0x8001, 0xe2, 0x8001, - 0xc9, 0x8001, 0xaf, 0x8001, 0x96, 0x8001, 0x7d, 0x8001, - 0x64, 0x8001, 0x4b, 0x8001, 0x32, 0x8001, 0x19, 0x8001, -}; - -static const q15_t ALIGN4 WeightsQ15_8192[16384] = { - 0x7fff, 0x0, 0x7fff, 0xfffa, 0x7fff, 0xfff4, 0x7fff, 0xffee, - 0x7fff, 0xffe7, 0x7fff, 0xffe1, 0x7fff, 0xffdb, 0x7fff, 0xffd5, - 0x7fff, 0xffce, 0x7fff, 0xffc8, 0x7fff, 0xffc2, 0x7fff, 0xffbb, - 0x7fff, 0xffb5, 0x7fff, 0xffaf, 0x7fff, 0xffa9, 0x7fff, 0xffa2, - 0x7fff, 0xff9c, 0x7fff, 0xff96, 0x7fff, 0xff8f, 0x7fff, 0xff89, - 0x7fff, 0xff83, 0x7fff, 0xff7d, 0x7fff, 0xff76, 0x7fff, 0xff70, - 0x7fff, 0xff6a, 0x7fff, 0xff63, 0x7fff, 0xff5d, 0x7fff, 0xff57, - 0x7fff, 0xff51, 0x7fff, 0xff4a, 0x7fff, 0xff44, 0x7fff, 0xff3e, - 0x7fff, 0xff37, 0x7fff, 0xff31, 0x7fff, 0xff2b, 0x7fff, 0xff25, - 0x7fff, 0xff1e, 0x7fff, 0xff18, 0x7fff, 0xff12, 0x7fff, 0xff0b, - 0x7fff, 0xff05, 0x7ffe, 0xfeff, 0x7ffe, 0xfef9, 0x7ffe, 0xfef2, - 0x7ffe, 0xfeec, 0x7ffe, 0xfee6, 0x7ffe, 0xfedf, 0x7ffe, 0xfed9, - 0x7ffe, 0xfed3, 0x7ffe, 0xfecd, 0x7ffe, 0xfec6, 0x7ffe, 0xfec0, - 0x7ffe, 0xfeba, 0x7ffe, 0xfeb3, 0x7ffe, 0xfead, 0x7ffe, 0xfea7, - 0x7ffe, 0xfea1, 0x7ffe, 0xfe9a, 0x7ffd, 0xfe94, 0x7ffd, 0xfe8e, - 0x7ffd, 0xfe88, 0x7ffd, 0xfe81, 0x7ffd, 0xfe7b, 0x7ffd, 0xfe75, - 0x7ffd, 0xfe6e, 0x7ffd, 0xfe68, 0x7ffd, 0xfe62, 0x7ffd, 0xfe5c, - 0x7ffd, 0xfe55, 0x7ffd, 0xfe4f, 0x7ffd, 0xfe49, 0x7ffc, 0xfe42, - 0x7ffc, 0xfe3c, 0x7ffc, 0xfe36, 0x7ffc, 0xfe30, 0x7ffc, 0xfe29, - 0x7ffc, 0xfe23, 0x7ffc, 0xfe1d, 0x7ffc, 0xfe16, 0x7ffc, 0xfe10, - 0x7ffc, 0xfe0a, 0x7ffc, 0xfe04, 0x7ffb, 0xfdfd, 0x7ffb, 0xfdf7, - 0x7ffb, 0xfdf1, 0x7ffb, 0xfdea, 0x7ffb, 0xfde4, 0x7ffb, 0xfdde, - 0x7ffb, 0xfdd8, 0x7ffb, 0xfdd1, 0x7ffb, 0xfdcb, 0x7ffb, 0xfdc5, - 0x7ffa, 0xfdbe, 0x7ffa, 0xfdb8, 0x7ffa, 0xfdb2, 0x7ffa, 0xfdac, - 0x7ffa, 0xfda5, 0x7ffa, 0xfd9f, 0x7ffa, 0xfd99, 0x7ffa, 0xfd93, - 0x7ff9, 0xfd8c, 0x7ff9, 0xfd86, 0x7ff9, 0xfd80, 0x7ff9, 0xfd79, - 0x7ff9, 0xfd73, 0x7ff9, 0xfd6d, 0x7ff9, 0xfd67, 0x7ff9, 0xfd60, - 0x7ff8, 0xfd5a, 0x7ff8, 0xfd54, 0x7ff8, 0xfd4d, 0x7ff8, 0xfd47, - 0x7ff8, 0xfd41, 0x7ff8, 0xfd3b, 0x7ff8, 0xfd34, 0x7ff8, 0xfd2e, - 0x7ff7, 0xfd28, 0x7ff7, 0xfd21, 0x7ff7, 0xfd1b, 0x7ff7, 0xfd15, - 0x7ff7, 0xfd0f, 0x7ff7, 0xfd08, 0x7ff7, 0xfd02, 0x7ff6, 0xfcfc, - 0x7ff6, 0xfcf5, 0x7ff6, 0xfcef, 0x7ff6, 0xfce9, 0x7ff6, 0xfce3, - 0x7ff6, 0xfcdc, 0x7ff5, 0xfcd6, 0x7ff5, 0xfcd0, 0x7ff5, 0xfcc9, - 0x7ff5, 0xfcc3, 0x7ff5, 0xfcbd, 0x7ff5, 0xfcb7, 0x7ff5, 0xfcb0, - 0x7ff4, 0xfcaa, 0x7ff4, 0xfca4, 0x7ff4, 0xfc9e, 0x7ff4, 0xfc97, - 0x7ff4, 0xfc91, 0x7ff4, 0xfc8b, 0x7ff3, 0xfc84, 0x7ff3, 0xfc7e, - 0x7ff3, 0xfc78, 0x7ff3, 0xfc72, 0x7ff3, 0xfc6b, 0x7ff2, 0xfc65, - 0x7ff2, 0xfc5f, 0x7ff2, 0xfc58, 0x7ff2, 0xfc52, 0x7ff2, 0xfc4c, - 0x7ff2, 0xfc46, 0x7ff1, 0xfc3f, 0x7ff1, 0xfc39, 0x7ff1, 0xfc33, - 0x7ff1, 0xfc2c, 0x7ff1, 0xfc26, 0x7ff0, 0xfc20, 0x7ff0, 0xfc1a, - 0x7ff0, 0xfc13, 0x7ff0, 0xfc0d, 0x7ff0, 0xfc07, 0x7fef, 0xfc01, - 0x7fef, 0xfbfa, 0x7fef, 0xfbf4, 0x7fef, 0xfbee, 0x7fef, 0xfbe7, - 0x7fee, 0xfbe1, 0x7fee, 0xfbdb, 0x7fee, 0xfbd5, 0x7fee, 0xfbce, - 0x7fee, 0xfbc8, 0x7fed, 0xfbc2, 0x7fed, 0xfbbb, 0x7fed, 0xfbb5, - 0x7fed, 0xfbaf, 0x7fed, 0xfba9, 0x7fec, 0xfba2, 0x7fec, 0xfb9c, - 0x7fec, 0xfb96, 0x7fec, 0xfb8f, 0x7fec, 0xfb89, 0x7feb, 0xfb83, - 0x7feb, 0xfb7d, 0x7feb, 0xfb76, 0x7feb, 0xfb70, 0x7fea, 0xfb6a, - 0x7fea, 0xfb64, 0x7fea, 0xfb5d, 0x7fea, 0xfb57, 0x7fea, 0xfb51, - 0x7fe9, 0xfb4a, 0x7fe9, 0xfb44, 0x7fe9, 0xfb3e, 0x7fe9, 0xfb38, - 0x7fe8, 0xfb31, 0x7fe8, 0xfb2b, 0x7fe8, 0xfb25, 0x7fe8, 0xfb1e, - 0x7fe7, 0xfb18, 0x7fe7, 0xfb12, 0x7fe7, 0xfb0c, 0x7fe7, 0xfb05, - 0x7fe6, 0xfaff, 0x7fe6, 0xfaf9, 0x7fe6, 0xfaf3, 0x7fe6, 0xfaec, - 0x7fe5, 0xfae6, 0x7fe5, 0xfae0, 0x7fe5, 0xfad9, 0x7fe5, 0xfad3, - 0x7fe4, 0xfacd, 0x7fe4, 0xfac7, 0x7fe4, 0xfac0, 0x7fe4, 0xfaba, - 0x7fe3, 0xfab4, 0x7fe3, 0xfaad, 0x7fe3, 0xfaa7, 0x7fe3, 0xfaa1, - 0x7fe2, 0xfa9b, 0x7fe2, 0xfa94, 0x7fe2, 0xfa8e, 0x7fe2, 0xfa88, - 0x7fe1, 0xfa81, 0x7fe1, 0xfa7b, 0x7fe1, 0xfa75, 0x7fe0, 0xfa6f, - 0x7fe0, 0xfa68, 0x7fe0, 0xfa62, 0x7fe0, 0xfa5c, 0x7fdf, 0xfa56, - 0x7fdf, 0xfa4f, 0x7fdf, 0xfa49, 0x7fdf, 0xfa43, 0x7fde, 0xfa3c, - 0x7fde, 0xfa36, 0x7fde, 0xfa30, 0x7fdd, 0xfa2a, 0x7fdd, 0xfa23, - 0x7fdd, 0xfa1d, 0x7fdd, 0xfa17, 0x7fdc, 0xfa11, 0x7fdc, 0xfa0a, - 0x7fdc, 0xfa04, 0x7fdb, 0xf9fe, 0x7fdb, 0xf9f7, 0x7fdb, 0xf9f1, - 0x7fda, 0xf9eb, 0x7fda, 0xf9e5, 0x7fda, 0xf9de, 0x7fda, 0xf9d8, - 0x7fd9, 0xf9d2, 0x7fd9, 0xf9cb, 0x7fd9, 0xf9c5, 0x7fd8, 0xf9bf, - 0x7fd8, 0xf9b9, 0x7fd8, 0xf9b2, 0x7fd7, 0xf9ac, 0x7fd7, 0xf9a6, - 0x7fd7, 0xf9a0, 0x7fd6, 0xf999, 0x7fd6, 0xf993, 0x7fd6, 0xf98d, - 0x7fd6, 0xf986, 0x7fd5, 0xf980, 0x7fd5, 0xf97a, 0x7fd5, 0xf974, - 0x7fd4, 0xf96d, 0x7fd4, 0xf967, 0x7fd4, 0xf961, 0x7fd3, 0xf95b, - 0x7fd3, 0xf954, 0x7fd3, 0xf94e, 0x7fd2, 0xf948, 0x7fd2, 0xf941, - 0x7fd2, 0xf93b, 0x7fd1, 0xf935, 0x7fd1, 0xf92f, 0x7fd1, 0xf928, - 0x7fd0, 0xf922, 0x7fd0, 0xf91c, 0x7fd0, 0xf916, 0x7fcf, 0xf90f, - 0x7fcf, 0xf909, 0x7fcf, 0xf903, 0x7fce, 0xf8fc, 0x7fce, 0xf8f6, - 0x7fce, 0xf8f0, 0x7fcd, 0xf8ea, 0x7fcd, 0xf8e3, 0x7fcd, 0xf8dd, - 0x7fcc, 0xf8d7, 0x7fcc, 0xf8d0, 0x7fcb, 0xf8ca, 0x7fcb, 0xf8c4, - 0x7fcb, 0xf8be, 0x7fca, 0xf8b7, 0x7fca, 0xf8b1, 0x7fca, 0xf8ab, - 0x7fc9, 0xf8a5, 0x7fc9, 0xf89e, 0x7fc9, 0xf898, 0x7fc8, 0xf892, - 0x7fc8, 0xf88b, 0x7fc7, 0xf885, 0x7fc7, 0xf87f, 0x7fc7, 0xf879, - 0x7fc6, 0xf872, 0x7fc6, 0xf86c, 0x7fc6, 0xf866, 0x7fc5, 0xf860, - 0x7fc5, 0xf859, 0x7fc5, 0xf853, 0x7fc4, 0xf84d, 0x7fc4, 0xf846, - 0x7fc3, 0xf840, 0x7fc3, 0xf83a, 0x7fc3, 0xf834, 0x7fc2, 0xf82d, - 0x7fc2, 0xf827, 0x7fc1, 0xf821, 0x7fc1, 0xf81b, 0x7fc1, 0xf814, - 0x7fc0, 0xf80e, 0x7fc0, 0xf808, 0x7fc0, 0xf802, 0x7fbf, 0xf7fb, - 0x7fbf, 0xf7f5, 0x7fbe, 0xf7ef, 0x7fbe, 0xf7e8, 0x7fbe, 0xf7e2, - 0x7fbd, 0xf7dc, 0x7fbd, 0xf7d6, 0x7fbc, 0xf7cf, 0x7fbc, 0xf7c9, - 0x7fbc, 0xf7c3, 0x7fbb, 0xf7bd, 0x7fbb, 0xf7b6, 0x7fba, 0xf7b0, - 0x7fba, 0xf7aa, 0x7fb9, 0xf7a3, 0x7fb9, 0xf79d, 0x7fb9, 0xf797, - 0x7fb8, 0xf791, 0x7fb8, 0xf78a, 0x7fb7, 0xf784, 0x7fb7, 0xf77e, - 0x7fb7, 0xf778, 0x7fb6, 0xf771, 0x7fb6, 0xf76b, 0x7fb5, 0xf765, - 0x7fb5, 0xf75e, 0x7fb4, 0xf758, 0x7fb4, 0xf752, 0x7fb4, 0xf74c, - 0x7fb3, 0xf745, 0x7fb3, 0xf73f, 0x7fb2, 0xf739, 0x7fb2, 0xf733, - 0x7fb1, 0xf72c, 0x7fb1, 0xf726, 0x7fb1, 0xf720, 0x7fb0, 0xf71a, - 0x7fb0, 0xf713, 0x7faf, 0xf70d, 0x7faf, 0xf707, 0x7fae, 0xf700, - 0x7fae, 0xf6fa, 0x7fae, 0xf6f4, 0x7fad, 0xf6ee, 0x7fad, 0xf6e7, - 0x7fac, 0xf6e1, 0x7fac, 0xf6db, 0x7fab, 0xf6d5, 0x7fab, 0xf6ce, - 0x7faa, 0xf6c8, 0x7faa, 0xf6c2, 0x7fa9, 0xf6bc, 0x7fa9, 0xf6b5, - 0x7fa9, 0xf6af, 0x7fa8, 0xf6a9, 0x7fa8, 0xf6a2, 0x7fa7, 0xf69c, - 0x7fa7, 0xf696, 0x7fa6, 0xf690, 0x7fa6, 0xf689, 0x7fa5, 0xf683, - 0x7fa5, 0xf67d, 0x7fa4, 0xf677, 0x7fa4, 0xf670, 0x7fa3, 0xf66a, - 0x7fa3, 0xf664, 0x7fa3, 0xf65e, 0x7fa2, 0xf657, 0x7fa2, 0xf651, - 0x7fa1, 0xf64b, 0x7fa1, 0xf644, 0x7fa0, 0xf63e, 0x7fa0, 0xf638, - 0x7f9f, 0xf632, 0x7f9f, 0xf62b, 0x7f9e, 0xf625, 0x7f9e, 0xf61f, - 0x7f9d, 0xf619, 0x7f9d, 0xf612, 0x7f9c, 0xf60c, 0x7f9c, 0xf606, - 0x7f9b, 0xf600, 0x7f9b, 0xf5f9, 0x7f9a, 0xf5f3, 0x7f9a, 0xf5ed, - 0x7f99, 0xf5e7, 0x7f99, 0xf5e0, 0x7f98, 0xf5da, 0x7f98, 0xf5d4, - 0x7f97, 0xf5cd, 0x7f97, 0xf5c7, 0x7f96, 0xf5c1, 0x7f96, 0xf5bb, - 0x7f95, 0xf5b4, 0x7f95, 0xf5ae, 0x7f94, 0xf5a8, 0x7f94, 0xf5a2, - 0x7f93, 0xf59b, 0x7f93, 0xf595, 0x7f92, 0xf58f, 0x7f92, 0xf589, - 0x7f91, 0xf582, 0x7f91, 0xf57c, 0x7f90, 0xf576, 0x7f90, 0xf570, - 0x7f8f, 0xf569, 0x7f8f, 0xf563, 0x7f8e, 0xf55d, 0x7f8e, 0xf556, - 0x7f8d, 0xf550, 0x7f8d, 0xf54a, 0x7f8c, 0xf544, 0x7f8b, 0xf53d, - 0x7f8b, 0xf537, 0x7f8a, 0xf531, 0x7f8a, 0xf52b, 0x7f89, 0xf524, - 0x7f89, 0xf51e, 0x7f88, 0xf518, 0x7f88, 0xf512, 0x7f87, 0xf50b, - 0x7f87, 0xf505, 0x7f86, 0xf4ff, 0x7f86, 0xf4f9, 0x7f85, 0xf4f2, - 0x7f85, 0xf4ec, 0x7f84, 0xf4e6, 0x7f83, 0xf4e0, 0x7f83, 0xf4d9, - 0x7f82, 0xf4d3, 0x7f82, 0xf4cd, 0x7f81, 0xf4c6, 0x7f81, 0xf4c0, - 0x7f80, 0xf4ba, 0x7f80, 0xf4b4, 0x7f7f, 0xf4ad, 0x7f7e, 0xf4a7, - 0x7f7e, 0xf4a1, 0x7f7d, 0xf49b, 0x7f7d, 0xf494, 0x7f7c, 0xf48e, - 0x7f7c, 0xf488, 0x7f7b, 0xf482, 0x7f7b, 0xf47b, 0x7f7a, 0xf475, - 0x7f79, 0xf46f, 0x7f79, 0xf469, 0x7f78, 0xf462, 0x7f78, 0xf45c, - 0x7f77, 0xf456, 0x7f77, 0xf450, 0x7f76, 0xf449, 0x7f75, 0xf443, - 0x7f75, 0xf43d, 0x7f74, 0xf437, 0x7f74, 0xf430, 0x7f73, 0xf42a, - 0x7f72, 0xf424, 0x7f72, 0xf41e, 0x7f71, 0xf417, 0x7f71, 0xf411, - 0x7f70, 0xf40b, 0x7f70, 0xf405, 0x7f6f, 0xf3fe, 0x7f6e, 0xf3f8, - 0x7f6e, 0xf3f2, 0x7f6d, 0xf3ec, 0x7f6d, 0xf3e5, 0x7f6c, 0xf3df, - 0x7f6b, 0xf3d9, 0x7f6b, 0xf3d2, 0x7f6a, 0xf3cc, 0x7f6a, 0xf3c6, - 0x7f69, 0xf3c0, 0x7f68, 0xf3b9, 0x7f68, 0xf3b3, 0x7f67, 0xf3ad, - 0x7f67, 0xf3a7, 0x7f66, 0xf3a0, 0x7f65, 0xf39a, 0x7f65, 0xf394, - 0x7f64, 0xf38e, 0x7f64, 0xf387, 0x7f63, 0xf381, 0x7f62, 0xf37b, - 0x7f62, 0xf375, 0x7f61, 0xf36e, 0x7f60, 0xf368, 0x7f60, 0xf362, - 0x7f5f, 0xf35c, 0x7f5f, 0xf355, 0x7f5e, 0xf34f, 0x7f5d, 0xf349, - 0x7f5d, 0xf343, 0x7f5c, 0xf33c, 0x7f5b, 0xf336, 0x7f5b, 0xf330, - 0x7f5a, 0xf32a, 0x7f5a, 0xf323, 0x7f59, 0xf31d, 0x7f58, 0xf317, - 0x7f58, 0xf311, 0x7f57, 0xf30a, 0x7f56, 0xf304, 0x7f56, 0xf2fe, - 0x7f55, 0xf2f8, 0x7f55, 0xf2f1, 0x7f54, 0xf2eb, 0x7f53, 0xf2e5, - 0x7f53, 0xf2df, 0x7f52, 0xf2d8, 0x7f51, 0xf2d2, 0x7f51, 0xf2cc, - 0x7f50, 0xf2c6, 0x7f4f, 0xf2bf, 0x7f4f, 0xf2b9, 0x7f4e, 0xf2b3, - 0x7f4d, 0xf2ad, 0x7f4d, 0xf2a6, 0x7f4c, 0xf2a0, 0x7f4b, 0xf29a, - 0x7f4b, 0xf294, 0x7f4a, 0xf28d, 0x7f49, 0xf287, 0x7f49, 0xf281, - 0x7f48, 0xf27b, 0x7f47, 0xf274, 0x7f47, 0xf26e, 0x7f46, 0xf268, - 0x7f45, 0xf262, 0x7f45, 0xf25b, 0x7f44, 0xf255, 0x7f43, 0xf24f, - 0x7f43, 0xf249, 0x7f42, 0xf242, 0x7f41, 0xf23c, 0x7f41, 0xf236, - 0x7f40, 0xf230, 0x7f3f, 0xf229, 0x7f3f, 0xf223, 0x7f3e, 0xf21d, - 0x7f3d, 0xf217, 0x7f3d, 0xf210, 0x7f3c, 0xf20a, 0x7f3b, 0xf204, - 0x7f3b, 0xf1fe, 0x7f3a, 0xf1f7, 0x7f39, 0xf1f1, 0x7f39, 0xf1eb, - 0x7f38, 0xf1e5, 0x7f37, 0xf1de, 0x7f36, 0xf1d8, 0x7f36, 0xf1d2, - 0x7f35, 0xf1cc, 0x7f34, 0xf1c6, 0x7f34, 0xf1bf, 0x7f33, 0xf1b9, - 0x7f32, 0xf1b3, 0x7f32, 0xf1ad, 0x7f31, 0xf1a6, 0x7f30, 0xf1a0, - 0x7f2f, 0xf19a, 0x7f2f, 0xf194, 0x7f2e, 0xf18d, 0x7f2d, 0xf187, - 0x7f2d, 0xf181, 0x7f2c, 0xf17b, 0x7f2b, 0xf174, 0x7f2a, 0xf16e, - 0x7f2a, 0xf168, 0x7f29, 0xf162, 0x7f28, 0xf15b, 0x7f28, 0xf155, - 0x7f27, 0xf14f, 0x7f26, 0xf149, 0x7f25, 0xf142, 0x7f25, 0xf13c, - 0x7f24, 0xf136, 0x7f23, 0xf130, 0x7f23, 0xf129, 0x7f22, 0xf123, - 0x7f21, 0xf11d, 0x7f20, 0xf117, 0x7f20, 0xf110, 0x7f1f, 0xf10a, - 0x7f1e, 0xf104, 0x7f1d, 0xf0fe, 0x7f1d, 0xf0f8, 0x7f1c, 0xf0f1, - 0x7f1b, 0xf0eb, 0x7f1a, 0xf0e5, 0x7f1a, 0xf0df, 0x7f19, 0xf0d8, - 0x7f18, 0xf0d2, 0x7f17, 0xf0cc, 0x7f17, 0xf0c6, 0x7f16, 0xf0bf, - 0x7f15, 0xf0b9, 0x7f14, 0xf0b3, 0x7f14, 0xf0ad, 0x7f13, 0xf0a6, - 0x7f12, 0xf0a0, 0x7f11, 0xf09a, 0x7f11, 0xf094, 0x7f10, 0xf08d, - 0x7f0f, 0xf087, 0x7f0e, 0xf081, 0x7f0e, 0xf07b, 0x7f0d, 0xf075, - 0x7f0c, 0xf06e, 0x7f0b, 0xf068, 0x7f0b, 0xf062, 0x7f0a, 0xf05c, - 0x7f09, 0xf055, 0x7f08, 0xf04f, 0x7f08, 0xf049, 0x7f07, 0xf043, - 0x7f06, 0xf03c, 0x7f05, 0xf036, 0x7f04, 0xf030, 0x7f04, 0xf02a, - 0x7f03, 0xf023, 0x7f02, 0xf01d, 0x7f01, 0xf017, 0x7f01, 0xf011, - 0x7f00, 0xf00b, 0x7eff, 0xf004, 0x7efe, 0xeffe, 0x7efd, 0xeff8, - 0x7efd, 0xeff2, 0x7efc, 0xefeb, 0x7efb, 0xefe5, 0x7efa, 0xefdf, - 0x7ef9, 0xefd9, 0x7ef9, 0xefd2, 0x7ef8, 0xefcc, 0x7ef7, 0xefc6, - 0x7ef6, 0xefc0, 0x7ef5, 0xefb9, 0x7ef5, 0xefb3, 0x7ef4, 0xefad, - 0x7ef3, 0xefa7, 0x7ef2, 0xefa1, 0x7ef1, 0xef9a, 0x7ef1, 0xef94, - 0x7ef0, 0xef8e, 0x7eef, 0xef88, 0x7eee, 0xef81, 0x7eed, 0xef7b, - 0x7eed, 0xef75, 0x7eec, 0xef6f, 0x7eeb, 0xef68, 0x7eea, 0xef62, - 0x7ee9, 0xef5c, 0x7ee9, 0xef56, 0x7ee8, 0xef50, 0x7ee7, 0xef49, - 0x7ee6, 0xef43, 0x7ee5, 0xef3d, 0x7ee4, 0xef37, 0x7ee4, 0xef30, - 0x7ee3, 0xef2a, 0x7ee2, 0xef24, 0x7ee1, 0xef1e, 0x7ee0, 0xef18, - 0x7edf, 0xef11, 0x7edf, 0xef0b, 0x7ede, 0xef05, 0x7edd, 0xeeff, - 0x7edc, 0xeef8, 0x7edb, 0xeef2, 0x7eda, 0xeeec, 0x7eda, 0xeee6, - 0x7ed9, 0xeedf, 0x7ed8, 0xeed9, 0x7ed7, 0xeed3, 0x7ed6, 0xeecd, - 0x7ed5, 0xeec7, 0x7ed5, 0xeec0, 0x7ed4, 0xeeba, 0x7ed3, 0xeeb4, - 0x7ed2, 0xeeae, 0x7ed1, 0xeea7, 0x7ed0, 0xeea1, 0x7ecf, 0xee9b, - 0x7ecf, 0xee95, 0x7ece, 0xee8f, 0x7ecd, 0xee88, 0x7ecc, 0xee82, - 0x7ecb, 0xee7c, 0x7eca, 0xee76, 0x7ec9, 0xee6f, 0x7ec9, 0xee69, - 0x7ec8, 0xee63, 0x7ec7, 0xee5d, 0x7ec6, 0xee57, 0x7ec5, 0xee50, - 0x7ec4, 0xee4a, 0x7ec3, 0xee44, 0x7ec3, 0xee3e, 0x7ec2, 0xee37, - 0x7ec1, 0xee31, 0x7ec0, 0xee2b, 0x7ebf, 0xee25, 0x7ebe, 0xee1f, - 0x7ebd, 0xee18, 0x7ebc, 0xee12, 0x7ebb, 0xee0c, 0x7ebb, 0xee06, - 0x7eba, 0xedff, 0x7eb9, 0xedf9, 0x7eb8, 0xedf3, 0x7eb7, 0xeded, - 0x7eb6, 0xede7, 0x7eb5, 0xede0, 0x7eb4, 0xedda, 0x7eb4, 0xedd4, - 0x7eb3, 0xedce, 0x7eb2, 0xedc7, 0x7eb1, 0xedc1, 0x7eb0, 0xedbb, - 0x7eaf, 0xedb5, 0x7eae, 0xedaf, 0x7ead, 0xeda8, 0x7eac, 0xeda2, - 0x7eab, 0xed9c, 0x7eab, 0xed96, 0x7eaa, 0xed8f, 0x7ea9, 0xed89, - 0x7ea8, 0xed83, 0x7ea7, 0xed7d, 0x7ea6, 0xed77, 0x7ea5, 0xed70, - 0x7ea4, 0xed6a, 0x7ea3, 0xed64, 0x7ea2, 0xed5e, 0x7ea1, 0xed58, - 0x7ea1, 0xed51, 0x7ea0, 0xed4b, 0x7e9f, 0xed45, 0x7e9e, 0xed3f, - 0x7e9d, 0xed38, 0x7e9c, 0xed32, 0x7e9b, 0xed2c, 0x7e9a, 0xed26, - 0x7e99, 0xed20, 0x7e98, 0xed19, 0x7e97, 0xed13, 0x7e96, 0xed0d, - 0x7e95, 0xed07, 0x7e94, 0xed01, 0x7e94, 0xecfa, 0x7e93, 0xecf4, - 0x7e92, 0xecee, 0x7e91, 0xece8, 0x7e90, 0xece1, 0x7e8f, 0xecdb, - 0x7e8e, 0xecd5, 0x7e8d, 0xeccf, 0x7e8c, 0xecc9, 0x7e8b, 0xecc2, - 0x7e8a, 0xecbc, 0x7e89, 0xecb6, 0x7e88, 0xecb0, 0x7e87, 0xecaa, - 0x7e86, 0xeca3, 0x7e85, 0xec9d, 0x7e84, 0xec97, 0x7e84, 0xec91, - 0x7e83, 0xec8a, 0x7e82, 0xec84, 0x7e81, 0xec7e, 0x7e80, 0xec78, - 0x7e7f, 0xec72, 0x7e7e, 0xec6b, 0x7e7d, 0xec65, 0x7e7c, 0xec5f, - 0x7e7b, 0xec59, 0x7e7a, 0xec53, 0x7e79, 0xec4c, 0x7e78, 0xec46, - 0x7e77, 0xec40, 0x7e76, 0xec3a, 0x7e75, 0xec34, 0x7e74, 0xec2d, - 0x7e73, 0xec27, 0x7e72, 0xec21, 0x7e71, 0xec1b, 0x7e70, 0xec15, - 0x7e6f, 0xec0e, 0x7e6e, 0xec08, 0x7e6d, 0xec02, 0x7e6c, 0xebfc, - 0x7e6b, 0xebf5, 0x7e6a, 0xebef, 0x7e69, 0xebe9, 0x7e68, 0xebe3, - 0x7e67, 0xebdd, 0x7e66, 0xebd6, 0x7e65, 0xebd0, 0x7e64, 0xebca, - 0x7e63, 0xebc4, 0x7e62, 0xebbe, 0x7e61, 0xebb7, 0x7e60, 0xebb1, - 0x7e5f, 0xebab, 0x7e5e, 0xeba5, 0x7e5d, 0xeb9f, 0x7e5c, 0xeb98, - 0x7e5b, 0xeb92, 0x7e5a, 0xeb8c, 0x7e59, 0xeb86, 0x7e58, 0xeb80, - 0x7e57, 0xeb79, 0x7e56, 0xeb73, 0x7e55, 0xeb6d, 0x7e54, 0xeb67, - 0x7e53, 0xeb61, 0x7e52, 0xeb5a, 0x7e51, 0xeb54, 0x7e50, 0xeb4e, - 0x7e4f, 0xeb48, 0x7e4e, 0xeb42, 0x7e4d, 0xeb3b, 0x7e4c, 0xeb35, - 0x7e4b, 0xeb2f, 0x7e4a, 0xeb29, 0x7e49, 0xeb23, 0x7e48, 0xeb1c, - 0x7e47, 0xeb16, 0x7e46, 0xeb10, 0x7e45, 0xeb0a, 0x7e44, 0xeb04, - 0x7e43, 0xeafd, 0x7e42, 0xeaf7, 0x7e41, 0xeaf1, 0x7e40, 0xeaeb, - 0x7e3f, 0xeae5, 0x7e3e, 0xeade, 0x7e3d, 0xead8, 0x7e3c, 0xead2, - 0x7e3b, 0xeacc, 0x7e3a, 0xeac6, 0x7e39, 0xeabf, 0x7e38, 0xeab9, - 0x7e37, 0xeab3, 0x7e35, 0xeaad, 0x7e34, 0xeaa7, 0x7e33, 0xeaa0, - 0x7e32, 0xea9a, 0x7e31, 0xea94, 0x7e30, 0xea8e, 0x7e2f, 0xea88, - 0x7e2e, 0xea81, 0x7e2d, 0xea7b, 0x7e2c, 0xea75, 0x7e2b, 0xea6f, - 0x7e2a, 0xea69, 0x7e29, 0xea63, 0x7e28, 0xea5c, 0x7e27, 0xea56, - 0x7e26, 0xea50, 0x7e25, 0xea4a, 0x7e24, 0xea44, 0x7e22, 0xea3d, - 0x7e21, 0xea37, 0x7e20, 0xea31, 0x7e1f, 0xea2b, 0x7e1e, 0xea25, - 0x7e1d, 0xea1e, 0x7e1c, 0xea18, 0x7e1b, 0xea12, 0x7e1a, 0xea0c, - 0x7e19, 0xea06, 0x7e18, 0xe9ff, 0x7e17, 0xe9f9, 0x7e16, 0xe9f3, - 0x7e14, 0xe9ed, 0x7e13, 0xe9e7, 0x7e12, 0xe9e1, 0x7e11, 0xe9da, - 0x7e10, 0xe9d4, 0x7e0f, 0xe9ce, 0x7e0e, 0xe9c8, 0x7e0d, 0xe9c2, - 0x7e0c, 0xe9bb, 0x7e0b, 0xe9b5, 0x7e0a, 0xe9af, 0x7e08, 0xe9a9, - 0x7e07, 0xe9a3, 0x7e06, 0xe99c, 0x7e05, 0xe996, 0x7e04, 0xe990, - 0x7e03, 0xe98a, 0x7e02, 0xe984, 0x7e01, 0xe97e, 0x7e00, 0xe977, - 0x7dff, 0xe971, 0x7dfd, 0xe96b, 0x7dfc, 0xe965, 0x7dfb, 0xe95f, - 0x7dfa, 0xe958, 0x7df9, 0xe952, 0x7df8, 0xe94c, 0x7df7, 0xe946, - 0x7df6, 0xe940, 0x7df5, 0xe93a, 0x7df3, 0xe933, 0x7df2, 0xe92d, - 0x7df1, 0xe927, 0x7df0, 0xe921, 0x7def, 0xe91b, 0x7dee, 0xe914, - 0x7ded, 0xe90e, 0x7dec, 0xe908, 0x7dea, 0xe902, 0x7de9, 0xe8fc, - 0x7de8, 0xe8f6, 0x7de7, 0xe8ef, 0x7de6, 0xe8e9, 0x7de5, 0xe8e3, - 0x7de4, 0xe8dd, 0x7de2, 0xe8d7, 0x7de1, 0xe8d0, 0x7de0, 0xe8ca, - 0x7ddf, 0xe8c4, 0x7dde, 0xe8be, 0x7ddd, 0xe8b8, 0x7ddc, 0xe8b2, - 0x7dda, 0xe8ab, 0x7dd9, 0xe8a5, 0x7dd8, 0xe89f, 0x7dd7, 0xe899, - 0x7dd6, 0xe893, 0x7dd5, 0xe88c, 0x7dd4, 0xe886, 0x7dd2, 0xe880, - 0x7dd1, 0xe87a, 0x7dd0, 0xe874, 0x7dcf, 0xe86e, 0x7dce, 0xe867, - 0x7dcd, 0xe861, 0x7dcc, 0xe85b, 0x7dca, 0xe855, 0x7dc9, 0xe84f, - 0x7dc8, 0xe849, 0x7dc7, 0xe842, 0x7dc6, 0xe83c, 0x7dc5, 0xe836, - 0x7dc3, 0xe830, 0x7dc2, 0xe82a, 0x7dc1, 0xe823, 0x7dc0, 0xe81d, - 0x7dbf, 0xe817, 0x7dbd, 0xe811, 0x7dbc, 0xe80b, 0x7dbb, 0xe805, - 0x7dba, 0xe7fe, 0x7db9, 0xe7f8, 0x7db8, 0xe7f2, 0x7db6, 0xe7ec, - 0x7db5, 0xe7e6, 0x7db4, 0xe7e0, 0x7db3, 0xe7d9, 0x7db2, 0xe7d3, - 0x7db0, 0xe7cd, 0x7daf, 0xe7c7, 0x7dae, 0xe7c1, 0x7dad, 0xe7bb, - 0x7dac, 0xe7b4, 0x7dab, 0xe7ae, 0x7da9, 0xe7a8, 0x7da8, 0xe7a2, - 0x7da7, 0xe79c, 0x7da6, 0xe796, 0x7da5, 0xe78f, 0x7da3, 0xe789, - 0x7da2, 0xe783, 0x7da1, 0xe77d, 0x7da0, 0xe777, 0x7d9f, 0xe771, - 0x7d9d, 0xe76a, 0x7d9c, 0xe764, 0x7d9b, 0xe75e, 0x7d9a, 0xe758, - 0x7d98, 0xe752, 0x7d97, 0xe74c, 0x7d96, 0xe745, 0x7d95, 0xe73f, - 0x7d94, 0xe739, 0x7d92, 0xe733, 0x7d91, 0xe72d, 0x7d90, 0xe727, - 0x7d8f, 0xe720, 0x7d8e, 0xe71a, 0x7d8c, 0xe714, 0x7d8b, 0xe70e, - 0x7d8a, 0xe708, 0x7d89, 0xe702, 0x7d87, 0xe6fb, 0x7d86, 0xe6f5, - 0x7d85, 0xe6ef, 0x7d84, 0xe6e9, 0x7d82, 0xe6e3, 0x7d81, 0xe6dd, - 0x7d80, 0xe6d6, 0x7d7f, 0xe6d0, 0x7d7e, 0xe6ca, 0x7d7c, 0xe6c4, - 0x7d7b, 0xe6be, 0x7d7a, 0xe6b8, 0x7d79, 0xe6b2, 0x7d77, 0xe6ab, - 0x7d76, 0xe6a5, 0x7d75, 0xe69f, 0x7d74, 0xe699, 0x7d72, 0xe693, - 0x7d71, 0xe68d, 0x7d70, 0xe686, 0x7d6f, 0xe680, 0x7d6d, 0xe67a, - 0x7d6c, 0xe674, 0x7d6b, 0xe66e, 0x7d6a, 0xe668, 0x7d68, 0xe661, - 0x7d67, 0xe65b, 0x7d66, 0xe655, 0x7d65, 0xe64f, 0x7d63, 0xe649, - 0x7d62, 0xe643, 0x7d61, 0xe63d, 0x7d60, 0xe636, 0x7d5e, 0xe630, - 0x7d5d, 0xe62a, 0x7d5c, 0xe624, 0x7d5a, 0xe61e, 0x7d59, 0xe618, - 0x7d58, 0xe611, 0x7d57, 0xe60b, 0x7d55, 0xe605, 0x7d54, 0xe5ff, - 0x7d53, 0xe5f9, 0x7d52, 0xe5f3, 0x7d50, 0xe5ed, 0x7d4f, 0xe5e6, - 0x7d4e, 0xe5e0, 0x7d4c, 0xe5da, 0x7d4b, 0xe5d4, 0x7d4a, 0xe5ce, - 0x7d49, 0xe5c8, 0x7d47, 0xe5c2, 0x7d46, 0xe5bb, 0x7d45, 0xe5b5, - 0x7d43, 0xe5af, 0x7d42, 0xe5a9, 0x7d41, 0xe5a3, 0x7d3f, 0xe59d, - 0x7d3e, 0xe596, 0x7d3d, 0xe590, 0x7d3c, 0xe58a, 0x7d3a, 0xe584, - 0x7d39, 0xe57e, 0x7d38, 0xe578, 0x7d36, 0xe572, 0x7d35, 0xe56b, - 0x7d34, 0xe565, 0x7d32, 0xe55f, 0x7d31, 0xe559, 0x7d30, 0xe553, - 0x7d2f, 0xe54d, 0x7d2d, 0xe547, 0x7d2c, 0xe540, 0x7d2b, 0xe53a, - 0x7d29, 0xe534, 0x7d28, 0xe52e, 0x7d27, 0xe528, 0x7d25, 0xe522, - 0x7d24, 0xe51c, 0x7d23, 0xe515, 0x7d21, 0xe50f, 0x7d20, 0xe509, - 0x7d1f, 0xe503, 0x7d1d, 0xe4fd, 0x7d1c, 0xe4f7, 0x7d1b, 0xe4f1, - 0x7d19, 0xe4ea, 0x7d18, 0xe4e4, 0x7d17, 0xe4de, 0x7d15, 0xe4d8, - 0x7d14, 0xe4d2, 0x7d13, 0xe4cc, 0x7d11, 0xe4c6, 0x7d10, 0xe4bf, - 0x7d0f, 0xe4b9, 0x7d0d, 0xe4b3, 0x7d0c, 0xe4ad, 0x7d0b, 0xe4a7, - 0x7d09, 0xe4a1, 0x7d08, 0xe49b, 0x7d07, 0xe494, 0x7d05, 0xe48e, - 0x7d04, 0xe488, 0x7d03, 0xe482, 0x7d01, 0xe47c, 0x7d00, 0xe476, - 0x7cff, 0xe470, 0x7cfd, 0xe46a, 0x7cfc, 0xe463, 0x7cfb, 0xe45d, - 0x7cf9, 0xe457, 0x7cf8, 0xe451, 0x7cf6, 0xe44b, 0x7cf5, 0xe445, - 0x7cf4, 0xe43f, 0x7cf2, 0xe438, 0x7cf1, 0xe432, 0x7cf0, 0xe42c, - 0x7cee, 0xe426, 0x7ced, 0xe420, 0x7cec, 0xe41a, 0x7cea, 0xe414, - 0x7ce9, 0xe40e, 0x7ce7, 0xe407, 0x7ce6, 0xe401, 0x7ce5, 0xe3fb, - 0x7ce3, 0xe3f5, 0x7ce2, 0xe3ef, 0x7ce1, 0xe3e9, 0x7cdf, 0xe3e3, - 0x7cde, 0xe3dc, 0x7cdc, 0xe3d6, 0x7cdb, 0xe3d0, 0x7cda, 0xe3ca, - 0x7cd8, 0xe3c4, 0x7cd7, 0xe3be, 0x7cd5, 0xe3b8, 0x7cd4, 0xe3b2, - 0x7cd3, 0xe3ab, 0x7cd1, 0xe3a5, 0x7cd0, 0xe39f, 0x7ccf, 0xe399, - 0x7ccd, 0xe393, 0x7ccc, 0xe38d, 0x7cca, 0xe387, 0x7cc9, 0xe381, - 0x7cc8, 0xe37a, 0x7cc6, 0xe374, 0x7cc5, 0xe36e, 0x7cc3, 0xe368, - 0x7cc2, 0xe362, 0x7cc1, 0xe35c, 0x7cbf, 0xe356, 0x7cbe, 0xe350, - 0x7cbc, 0xe349, 0x7cbb, 0xe343, 0x7cb9, 0xe33d, 0x7cb8, 0xe337, - 0x7cb7, 0xe331, 0x7cb5, 0xe32b, 0x7cb4, 0xe325, 0x7cb2, 0xe31f, - 0x7cb1, 0xe318, 0x7cb0, 0xe312, 0x7cae, 0xe30c, 0x7cad, 0xe306, - 0x7cab, 0xe300, 0x7caa, 0xe2fa, 0x7ca8, 0xe2f4, 0x7ca7, 0xe2ee, - 0x7ca6, 0xe2e8, 0x7ca4, 0xe2e1, 0x7ca3, 0xe2db, 0x7ca1, 0xe2d5, - 0x7ca0, 0xe2cf, 0x7c9e, 0xe2c9, 0x7c9d, 0xe2c3, 0x7c9c, 0xe2bd, - 0x7c9a, 0xe2b7, 0x7c99, 0xe2b0, 0x7c97, 0xe2aa, 0x7c96, 0xe2a4, - 0x7c94, 0xe29e, 0x7c93, 0xe298, 0x7c91, 0xe292, 0x7c90, 0xe28c, - 0x7c8f, 0xe286, 0x7c8d, 0xe280, 0x7c8c, 0xe279, 0x7c8a, 0xe273, - 0x7c89, 0xe26d, 0x7c87, 0xe267, 0x7c86, 0xe261, 0x7c84, 0xe25b, - 0x7c83, 0xe255, 0x7c82, 0xe24f, 0x7c80, 0xe249, 0x7c7f, 0xe242, - 0x7c7d, 0xe23c, 0x7c7c, 0xe236, 0x7c7a, 0xe230, 0x7c79, 0xe22a, - 0x7c77, 0xe224, 0x7c76, 0xe21e, 0x7c74, 0xe218, 0x7c73, 0xe212, - 0x7c71, 0xe20b, 0x7c70, 0xe205, 0x7c6e, 0xe1ff, 0x7c6d, 0xe1f9, - 0x7c6c, 0xe1f3, 0x7c6a, 0xe1ed, 0x7c69, 0xe1e7, 0x7c67, 0xe1e1, - 0x7c66, 0xe1db, 0x7c64, 0xe1d4, 0x7c63, 0xe1ce, 0x7c61, 0xe1c8, - 0x7c60, 0xe1c2, 0x7c5e, 0xe1bc, 0x7c5d, 0xe1b6, 0x7c5b, 0xe1b0, - 0x7c5a, 0xe1aa, 0x7c58, 0xe1a4, 0x7c57, 0xe19e, 0x7c55, 0xe197, - 0x7c54, 0xe191, 0x7c52, 0xe18b, 0x7c51, 0xe185, 0x7c4f, 0xe17f, - 0x7c4e, 0xe179, 0x7c4c, 0xe173, 0x7c4b, 0xe16d, 0x7c49, 0xe167, - 0x7c48, 0xe160, 0x7c46, 0xe15a, 0x7c45, 0xe154, 0x7c43, 0xe14e, - 0x7c42, 0xe148, 0x7c40, 0xe142, 0x7c3f, 0xe13c, 0x7c3d, 0xe136, - 0x7c3c, 0xe130, 0x7c3a, 0xe12a, 0x7c39, 0xe123, 0x7c37, 0xe11d, - 0x7c36, 0xe117, 0x7c34, 0xe111, 0x7c33, 0xe10b, 0x7c31, 0xe105, - 0x7c30, 0xe0ff, 0x7c2e, 0xe0f9, 0x7c2d, 0xe0f3, 0x7c2b, 0xe0ed, - 0x7c29, 0xe0e7, 0x7c28, 0xe0e0, 0x7c26, 0xe0da, 0x7c25, 0xe0d4, - 0x7c23, 0xe0ce, 0x7c22, 0xe0c8, 0x7c20, 0xe0c2, 0x7c1f, 0xe0bc, - 0x7c1d, 0xe0b6, 0x7c1c, 0xe0b0, 0x7c1a, 0xe0aa, 0x7c19, 0xe0a3, - 0x7c17, 0xe09d, 0x7c16, 0xe097, 0x7c14, 0xe091, 0x7c12, 0xe08b, - 0x7c11, 0xe085, 0x7c0f, 0xe07f, 0x7c0e, 0xe079, 0x7c0c, 0xe073, - 0x7c0b, 0xe06d, 0x7c09, 0xe067, 0x7c08, 0xe061, 0x7c06, 0xe05a, - 0x7c05, 0xe054, 0x7c03, 0xe04e, 0x7c01, 0xe048, 0x7c00, 0xe042, - 0x7bfe, 0xe03c, 0x7bfd, 0xe036, 0x7bfb, 0xe030, 0x7bfa, 0xe02a, - 0x7bf8, 0xe024, 0x7bf6, 0xe01e, 0x7bf5, 0xe017, 0x7bf3, 0xe011, - 0x7bf2, 0xe00b, 0x7bf0, 0xe005, 0x7bef, 0xdfff, 0x7bed, 0xdff9, - 0x7beb, 0xdff3, 0x7bea, 0xdfed, 0x7be8, 0xdfe7, 0x7be7, 0xdfe1, - 0x7be5, 0xdfdb, 0x7be4, 0xdfd5, 0x7be2, 0xdfce, 0x7be0, 0xdfc8, - 0x7bdf, 0xdfc2, 0x7bdd, 0xdfbc, 0x7bdc, 0xdfb6, 0x7bda, 0xdfb0, - 0x7bd9, 0xdfaa, 0x7bd7, 0xdfa4, 0x7bd5, 0xdf9e, 0x7bd4, 0xdf98, - 0x7bd2, 0xdf92, 0x7bd1, 0xdf8c, 0x7bcf, 0xdf86, 0x7bcd, 0xdf7f, - 0x7bcc, 0xdf79, 0x7bca, 0xdf73, 0x7bc9, 0xdf6d, 0x7bc7, 0xdf67, - 0x7bc5, 0xdf61, 0x7bc4, 0xdf5b, 0x7bc2, 0xdf55, 0x7bc1, 0xdf4f, - 0x7bbf, 0xdf49, 0x7bbd, 0xdf43, 0x7bbc, 0xdf3d, 0x7bba, 0xdf37, - 0x7bb9, 0xdf30, 0x7bb7, 0xdf2a, 0x7bb5, 0xdf24, 0x7bb4, 0xdf1e, - 0x7bb2, 0xdf18, 0x7bb0, 0xdf12, 0x7baf, 0xdf0c, 0x7bad, 0xdf06, - 0x7bac, 0xdf00, 0x7baa, 0xdefa, 0x7ba8, 0xdef4, 0x7ba7, 0xdeee, - 0x7ba5, 0xdee8, 0x7ba3, 0xdee2, 0x7ba2, 0xdedb, 0x7ba0, 0xded5, - 0x7b9f, 0xdecf, 0x7b9d, 0xdec9, 0x7b9b, 0xdec3, 0x7b9a, 0xdebd, - 0x7b98, 0xdeb7, 0x7b96, 0xdeb1, 0x7b95, 0xdeab, 0x7b93, 0xdea5, - 0x7b92, 0xde9f, 0x7b90, 0xde99, 0x7b8e, 0xde93, 0x7b8d, 0xde8d, - 0x7b8b, 0xde87, 0x7b89, 0xde80, 0x7b88, 0xde7a, 0x7b86, 0xde74, - 0x7b84, 0xde6e, 0x7b83, 0xde68, 0x7b81, 0xde62, 0x7b7f, 0xde5c, - 0x7b7e, 0xde56, 0x7b7c, 0xde50, 0x7b7a, 0xde4a, 0x7b79, 0xde44, - 0x7b77, 0xde3e, 0x7b76, 0xde38, 0x7b74, 0xde32, 0x7b72, 0xde2c, - 0x7b71, 0xde26, 0x7b6f, 0xde1f, 0x7b6d, 0xde19, 0x7b6c, 0xde13, - 0x7b6a, 0xde0d, 0x7b68, 0xde07, 0x7b67, 0xde01, 0x7b65, 0xddfb, - 0x7b63, 0xddf5, 0x7b62, 0xddef, 0x7b60, 0xdde9, 0x7b5e, 0xdde3, - 0x7b5d, 0xdddd, 0x7b5b, 0xddd7, 0x7b59, 0xddd1, 0x7b57, 0xddcb, - 0x7b56, 0xddc5, 0x7b54, 0xddbf, 0x7b52, 0xddb9, 0x7b51, 0xddb2, - 0x7b4f, 0xddac, 0x7b4d, 0xdda6, 0x7b4c, 0xdda0, 0x7b4a, 0xdd9a, - 0x7b48, 0xdd94, 0x7b47, 0xdd8e, 0x7b45, 0xdd88, 0x7b43, 0xdd82, - 0x7b42, 0xdd7c, 0x7b40, 0xdd76, 0x7b3e, 0xdd70, 0x7b3c, 0xdd6a, - 0x7b3b, 0xdd64, 0x7b39, 0xdd5e, 0x7b37, 0xdd58, 0x7b36, 0xdd52, - 0x7b34, 0xdd4c, 0x7b32, 0xdd46, 0x7b31, 0xdd40, 0x7b2f, 0xdd39, - 0x7b2d, 0xdd33, 0x7b2b, 0xdd2d, 0x7b2a, 0xdd27, 0x7b28, 0xdd21, - 0x7b26, 0xdd1b, 0x7b25, 0xdd15, 0x7b23, 0xdd0f, 0x7b21, 0xdd09, - 0x7b1f, 0xdd03, 0x7b1e, 0xdcfd, 0x7b1c, 0xdcf7, 0x7b1a, 0xdcf1, - 0x7b19, 0xdceb, 0x7b17, 0xdce5, 0x7b15, 0xdcdf, 0x7b13, 0xdcd9, - 0x7b12, 0xdcd3, 0x7b10, 0xdccd, 0x7b0e, 0xdcc7, 0x7b0c, 0xdcc1, - 0x7b0b, 0xdcbb, 0x7b09, 0xdcb5, 0x7b07, 0xdcae, 0x7b06, 0xdca8, - 0x7b04, 0xdca2, 0x7b02, 0xdc9c, 0x7b00, 0xdc96, 0x7aff, 0xdc90, - 0x7afd, 0xdc8a, 0x7afb, 0xdc84, 0x7af9, 0xdc7e, 0x7af8, 0xdc78, - 0x7af6, 0xdc72, 0x7af4, 0xdc6c, 0x7af2, 0xdc66, 0x7af1, 0xdc60, - 0x7aef, 0xdc5a, 0x7aed, 0xdc54, 0x7aeb, 0xdc4e, 0x7aea, 0xdc48, - 0x7ae8, 0xdc42, 0x7ae6, 0xdc3c, 0x7ae4, 0xdc36, 0x7ae3, 0xdc30, - 0x7ae1, 0xdc2a, 0x7adf, 0xdc24, 0x7add, 0xdc1e, 0x7adc, 0xdc18, - 0x7ada, 0xdc12, 0x7ad8, 0xdc0c, 0x7ad6, 0xdc06, 0x7ad5, 0xdbff, - 0x7ad3, 0xdbf9, 0x7ad1, 0xdbf3, 0x7acf, 0xdbed, 0x7acd, 0xdbe7, - 0x7acc, 0xdbe1, 0x7aca, 0xdbdb, 0x7ac8, 0xdbd5, 0x7ac6, 0xdbcf, - 0x7ac5, 0xdbc9, 0x7ac3, 0xdbc3, 0x7ac1, 0xdbbd, 0x7abf, 0xdbb7, - 0x7abd, 0xdbb1, 0x7abc, 0xdbab, 0x7aba, 0xdba5, 0x7ab8, 0xdb9f, - 0x7ab6, 0xdb99, 0x7ab5, 0xdb93, 0x7ab3, 0xdb8d, 0x7ab1, 0xdb87, - 0x7aaf, 0xdb81, 0x7aad, 0xdb7b, 0x7aac, 0xdb75, 0x7aaa, 0xdb6f, - 0x7aa8, 0xdb69, 0x7aa6, 0xdb63, 0x7aa4, 0xdb5d, 0x7aa3, 0xdb57, - 0x7aa1, 0xdb51, 0x7a9f, 0xdb4b, 0x7a9d, 0xdb45, 0x7a9b, 0xdb3f, - 0x7a9a, 0xdb39, 0x7a98, 0xdb33, 0x7a96, 0xdb2d, 0x7a94, 0xdb27, - 0x7a92, 0xdb21, 0x7a91, 0xdb1b, 0x7a8f, 0xdb15, 0x7a8d, 0xdb0f, - 0x7a8b, 0xdb09, 0x7a89, 0xdb03, 0x7a87, 0xdafd, 0x7a86, 0xdaf7, - 0x7a84, 0xdaf1, 0x7a82, 0xdaea, 0x7a80, 0xdae4, 0x7a7e, 0xdade, - 0x7a7d, 0xdad8, 0x7a7b, 0xdad2, 0x7a79, 0xdacc, 0x7a77, 0xdac6, - 0x7a75, 0xdac0, 0x7a73, 0xdaba, 0x7a72, 0xdab4, 0x7a70, 0xdaae, - 0x7a6e, 0xdaa8, 0x7a6c, 0xdaa2, 0x7a6a, 0xda9c, 0x7a68, 0xda96, - 0x7a67, 0xda90, 0x7a65, 0xda8a, 0x7a63, 0xda84, 0x7a61, 0xda7e, - 0x7a5f, 0xda78, 0x7a5d, 0xda72, 0x7a5c, 0xda6c, 0x7a5a, 0xda66, - 0x7a58, 0xda60, 0x7a56, 0xda5a, 0x7a54, 0xda54, 0x7a52, 0xda4e, - 0x7a50, 0xda48, 0x7a4f, 0xda42, 0x7a4d, 0xda3c, 0x7a4b, 0xda36, - 0x7a49, 0xda30, 0x7a47, 0xda2a, 0x7a45, 0xda24, 0x7a43, 0xda1e, - 0x7a42, 0xda18, 0x7a40, 0xda12, 0x7a3e, 0xda0c, 0x7a3c, 0xda06, - 0x7a3a, 0xda00, 0x7a38, 0xd9fa, 0x7a36, 0xd9f4, 0x7a35, 0xd9ee, - 0x7a33, 0xd9e8, 0x7a31, 0xd9e2, 0x7a2f, 0xd9dc, 0x7a2d, 0xd9d6, - 0x7a2b, 0xd9d0, 0x7a29, 0xd9ca, 0x7a27, 0xd9c4, 0x7a26, 0xd9be, - 0x7a24, 0xd9b8, 0x7a22, 0xd9b2, 0x7a20, 0xd9ac, 0x7a1e, 0xd9a6, - 0x7a1c, 0xd9a0, 0x7a1a, 0xd99a, 0x7a18, 0xd994, 0x7a16, 0xd98e, - 0x7a15, 0xd988, 0x7a13, 0xd982, 0x7a11, 0xd97c, 0x7a0f, 0xd976, - 0x7a0d, 0xd970, 0x7a0b, 0xd96a, 0x7a09, 0xd964, 0x7a07, 0xd95e, - 0x7a05, 0xd958, 0x7a04, 0xd952, 0x7a02, 0xd94c, 0x7a00, 0xd946, - 0x79fe, 0xd940, 0x79fc, 0xd93a, 0x79fa, 0xd934, 0x79f8, 0xd92e, - 0x79f6, 0xd928, 0x79f4, 0xd922, 0x79f2, 0xd91c, 0x79f0, 0xd917, - 0x79ef, 0xd911, 0x79ed, 0xd90b, 0x79eb, 0xd905, 0x79e9, 0xd8ff, - 0x79e7, 0xd8f9, 0x79e5, 0xd8f3, 0x79e3, 0xd8ed, 0x79e1, 0xd8e7, - 0x79df, 0xd8e1, 0x79dd, 0xd8db, 0x79db, 0xd8d5, 0x79d9, 0xd8cf, - 0x79d8, 0xd8c9, 0x79d6, 0xd8c3, 0x79d4, 0xd8bd, 0x79d2, 0xd8b7, - 0x79d0, 0xd8b1, 0x79ce, 0xd8ab, 0x79cc, 0xd8a5, 0x79ca, 0xd89f, - 0x79c8, 0xd899, 0x79c6, 0xd893, 0x79c4, 0xd88d, 0x79c2, 0xd887, - 0x79c0, 0xd881, 0x79be, 0xd87b, 0x79bc, 0xd875, 0x79bb, 0xd86f, - 0x79b9, 0xd869, 0x79b7, 0xd863, 0x79b5, 0xd85d, 0x79b3, 0xd857, - 0x79b1, 0xd851, 0x79af, 0xd84b, 0x79ad, 0xd845, 0x79ab, 0xd83f, - 0x79a9, 0xd839, 0x79a7, 0xd833, 0x79a5, 0xd82d, 0x79a3, 0xd827, - 0x79a1, 0xd821, 0x799f, 0xd81b, 0x799d, 0xd815, 0x799b, 0xd80f, - 0x7999, 0xd80a, 0x7997, 0xd804, 0x7995, 0xd7fe, 0x7993, 0xd7f8, - 0x7992, 0xd7f2, 0x7990, 0xd7ec, 0x798e, 0xd7e6, 0x798c, 0xd7e0, - 0x798a, 0xd7da, 0x7988, 0xd7d4, 0x7986, 0xd7ce, 0x7984, 0xd7c8, - 0x7982, 0xd7c2, 0x7980, 0xd7bc, 0x797e, 0xd7b6, 0x797c, 0xd7b0, - 0x797a, 0xd7aa, 0x7978, 0xd7a4, 0x7976, 0xd79e, 0x7974, 0xd798, - 0x7972, 0xd792, 0x7970, 0xd78c, 0x796e, 0xd786, 0x796c, 0xd780, - 0x796a, 0xd77a, 0x7968, 0xd774, 0x7966, 0xd76e, 0x7964, 0xd768, - 0x7962, 0xd763, 0x7960, 0xd75d, 0x795e, 0xd757, 0x795c, 0xd751, - 0x795a, 0xd74b, 0x7958, 0xd745, 0x7956, 0xd73f, 0x7954, 0xd739, - 0x7952, 0xd733, 0x7950, 0xd72d, 0x794e, 0xd727, 0x794c, 0xd721, - 0x794a, 0xd71b, 0x7948, 0xd715, 0x7946, 0xd70f, 0x7944, 0xd709, - 0x7942, 0xd703, 0x7940, 0xd6fd, 0x793e, 0xd6f7, 0x793c, 0xd6f1, - 0x793a, 0xd6eb, 0x7938, 0xd6e5, 0x7936, 0xd6e0, 0x7934, 0xd6da, - 0x7932, 0xd6d4, 0x7930, 0xd6ce, 0x792e, 0xd6c8, 0x792c, 0xd6c2, - 0x792a, 0xd6bc, 0x7928, 0xd6b6, 0x7926, 0xd6b0, 0x7924, 0xd6aa, - 0x7922, 0xd6a4, 0x7920, 0xd69e, 0x791e, 0xd698, 0x791c, 0xd692, - 0x7919, 0xd68c, 0x7917, 0xd686, 0x7915, 0xd680, 0x7913, 0xd67a, - 0x7911, 0xd675, 0x790f, 0xd66f, 0x790d, 0xd669, 0x790b, 0xd663, - 0x7909, 0xd65d, 0x7907, 0xd657, 0x7905, 0xd651, 0x7903, 0xd64b, - 0x7901, 0xd645, 0x78ff, 0xd63f, 0x78fd, 0xd639, 0x78fb, 0xd633, - 0x78f9, 0xd62d, 0x78f7, 0xd627, 0x78f5, 0xd621, 0x78f3, 0xd61b, - 0x78f1, 0xd615, 0x78ee, 0xd610, 0x78ec, 0xd60a, 0x78ea, 0xd604, - 0x78e8, 0xd5fe, 0x78e6, 0xd5f8, 0x78e4, 0xd5f2, 0x78e2, 0xd5ec, - 0x78e0, 0xd5e6, 0x78de, 0xd5e0, 0x78dc, 0xd5da, 0x78da, 0xd5d4, - 0x78d8, 0xd5ce, 0x78d6, 0xd5c8, 0x78d4, 0xd5c2, 0x78d2, 0xd5bc, - 0x78cf, 0xd5b7, 0x78cd, 0xd5b1, 0x78cb, 0xd5ab, 0x78c9, 0xd5a5, - 0x78c7, 0xd59f, 0x78c5, 0xd599, 0x78c3, 0xd593, 0x78c1, 0xd58d, - 0x78bf, 0xd587, 0x78bd, 0xd581, 0x78bb, 0xd57b, 0x78b9, 0xd575, - 0x78b6, 0xd56f, 0x78b4, 0xd569, 0x78b2, 0xd564, 0x78b0, 0xd55e, - 0x78ae, 0xd558, 0x78ac, 0xd552, 0x78aa, 0xd54c, 0x78a8, 0xd546, - 0x78a6, 0xd540, 0x78a4, 0xd53a, 0x78a2, 0xd534, 0x789f, 0xd52e, - 0x789d, 0xd528, 0x789b, 0xd522, 0x7899, 0xd51c, 0x7897, 0xd517, - 0x7895, 0xd511, 0x7893, 0xd50b, 0x7891, 0xd505, 0x788f, 0xd4ff, - 0x788c, 0xd4f9, 0x788a, 0xd4f3, 0x7888, 0xd4ed, 0x7886, 0xd4e7, - 0x7884, 0xd4e1, 0x7882, 0xd4db, 0x7880, 0xd4d5, 0x787e, 0xd4d0, - 0x787c, 0xd4ca, 0x7879, 0xd4c4, 0x7877, 0xd4be, 0x7875, 0xd4b8, - 0x7873, 0xd4b2, 0x7871, 0xd4ac, 0x786f, 0xd4a6, 0x786d, 0xd4a0, - 0x786b, 0xd49a, 0x7868, 0xd494, 0x7866, 0xd48f, 0x7864, 0xd489, - 0x7862, 0xd483, 0x7860, 0xd47d, 0x785e, 0xd477, 0x785c, 0xd471, - 0x7859, 0xd46b, 0x7857, 0xd465, 0x7855, 0xd45f, 0x7853, 0xd459, - 0x7851, 0xd453, 0x784f, 0xd44e, 0x784d, 0xd448, 0x784a, 0xd442, - 0x7848, 0xd43c, 0x7846, 0xd436, 0x7844, 0xd430, 0x7842, 0xd42a, - 0x7840, 0xd424, 0x783e, 0xd41e, 0x783b, 0xd418, 0x7839, 0xd412, - 0x7837, 0xd40d, 0x7835, 0xd407, 0x7833, 0xd401, 0x7831, 0xd3fb, - 0x782e, 0xd3f5, 0x782c, 0xd3ef, 0x782a, 0xd3e9, 0x7828, 0xd3e3, - 0x7826, 0xd3dd, 0x7824, 0xd3d7, 0x7821, 0xd3d2, 0x781f, 0xd3cc, - 0x781d, 0xd3c6, 0x781b, 0xd3c0, 0x7819, 0xd3ba, 0x7817, 0xd3b4, - 0x7814, 0xd3ae, 0x7812, 0xd3a8, 0x7810, 0xd3a2, 0x780e, 0xd39d, - 0x780c, 0xd397, 0x780a, 0xd391, 0x7807, 0xd38b, 0x7805, 0xd385, - 0x7803, 0xd37f, 0x7801, 0xd379, 0x77ff, 0xd373, 0x77fc, 0xd36d, - 0x77fa, 0xd368, 0x77f8, 0xd362, 0x77f6, 0xd35c, 0x77f4, 0xd356, - 0x77f1, 0xd350, 0x77ef, 0xd34a, 0x77ed, 0xd344, 0x77eb, 0xd33e, - 0x77e9, 0xd338, 0x77e6, 0xd333, 0x77e4, 0xd32d, 0x77e2, 0xd327, - 0x77e0, 0xd321, 0x77de, 0xd31b, 0x77db, 0xd315, 0x77d9, 0xd30f, - 0x77d7, 0xd309, 0x77d5, 0xd303, 0x77d3, 0xd2fe, 0x77d0, 0xd2f8, - 0x77ce, 0xd2f2, 0x77cc, 0xd2ec, 0x77ca, 0xd2e6, 0x77c8, 0xd2e0, - 0x77c5, 0xd2da, 0x77c3, 0xd2d4, 0x77c1, 0xd2cf, 0x77bf, 0xd2c9, - 0x77bc, 0xd2c3, 0x77ba, 0xd2bd, 0x77b8, 0xd2b7, 0x77b6, 0xd2b1, - 0x77b4, 0xd2ab, 0x77b1, 0xd2a5, 0x77af, 0xd2a0, 0x77ad, 0xd29a, - 0x77ab, 0xd294, 0x77a8, 0xd28e, 0x77a6, 0xd288, 0x77a4, 0xd282, - 0x77a2, 0xd27c, 0x77a0, 0xd276, 0x779d, 0xd271, 0x779b, 0xd26b, - 0x7799, 0xd265, 0x7797, 0xd25f, 0x7794, 0xd259, 0x7792, 0xd253, - 0x7790, 0xd24d, 0x778e, 0xd247, 0x778b, 0xd242, 0x7789, 0xd23c, - 0x7787, 0xd236, 0x7785, 0xd230, 0x7782, 0xd22a, 0x7780, 0xd224, - 0x777e, 0xd21e, 0x777c, 0xd219, 0x7779, 0xd213, 0x7777, 0xd20d, - 0x7775, 0xd207, 0x7773, 0xd201, 0x7770, 0xd1fb, 0x776e, 0xd1f5, - 0x776c, 0xd1ef, 0x776a, 0xd1ea, 0x7767, 0xd1e4, 0x7765, 0xd1de, - 0x7763, 0xd1d8, 0x7760, 0xd1d2, 0x775e, 0xd1cc, 0x775c, 0xd1c6, - 0x775a, 0xd1c1, 0x7757, 0xd1bb, 0x7755, 0xd1b5, 0x7753, 0xd1af, - 0x7751, 0xd1a9, 0x774e, 0xd1a3, 0x774c, 0xd19d, 0x774a, 0xd198, - 0x7747, 0xd192, 0x7745, 0xd18c, 0x7743, 0xd186, 0x7741, 0xd180, - 0x773e, 0xd17a, 0x773c, 0xd174, 0x773a, 0xd16f, 0x7738, 0xd169, - 0x7735, 0xd163, 0x7733, 0xd15d, 0x7731, 0xd157, 0x772e, 0xd151, - 0x772c, 0xd14b, 0x772a, 0xd146, 0x7727, 0xd140, 0x7725, 0xd13a, - 0x7723, 0xd134, 0x7721, 0xd12e, 0x771e, 0xd128, 0x771c, 0xd123, - 0x771a, 0xd11d, 0x7717, 0xd117, 0x7715, 0xd111, 0x7713, 0xd10b, - 0x7710, 0xd105, 0x770e, 0xd0ff, 0x770c, 0xd0fa, 0x770a, 0xd0f4, - 0x7707, 0xd0ee, 0x7705, 0xd0e8, 0x7703, 0xd0e2, 0x7700, 0xd0dc, - 0x76fe, 0xd0d7, 0x76fc, 0xd0d1, 0x76f9, 0xd0cb, 0x76f7, 0xd0c5, - 0x76f5, 0xd0bf, 0x76f2, 0xd0b9, 0x76f0, 0xd0b4, 0x76ee, 0xd0ae, - 0x76eb, 0xd0a8, 0x76e9, 0xd0a2, 0x76e7, 0xd09c, 0x76e4, 0xd096, - 0x76e2, 0xd091, 0x76e0, 0xd08b, 0x76dd, 0xd085, 0x76db, 0xd07f, - 0x76d9, 0xd079, 0x76d6, 0xd073, 0x76d4, 0xd06e, 0x76d2, 0xd068, - 0x76cf, 0xd062, 0x76cd, 0xd05c, 0x76cb, 0xd056, 0x76c8, 0xd050, - 0x76c6, 0xd04b, 0x76c4, 0xd045, 0x76c1, 0xd03f, 0x76bf, 0xd039, - 0x76bd, 0xd033, 0x76ba, 0xd02d, 0x76b8, 0xd028, 0x76b6, 0xd022, - 0x76b3, 0xd01c, 0x76b1, 0xd016, 0x76af, 0xd010, 0x76ac, 0xd00a, - 0x76aa, 0xd005, 0x76a8, 0xcfff, 0x76a5, 0xcff9, 0x76a3, 0xcff3, - 0x76a0, 0xcfed, 0x769e, 0xcfe7, 0x769c, 0xcfe2, 0x7699, 0xcfdc, - 0x7697, 0xcfd6, 0x7695, 0xcfd0, 0x7692, 0xcfca, 0x7690, 0xcfc5, - 0x768e, 0xcfbf, 0x768b, 0xcfb9, 0x7689, 0xcfb3, 0x7686, 0xcfad, - 0x7684, 0xcfa7, 0x7682, 0xcfa2, 0x767f, 0xcf9c, 0x767d, 0xcf96, - 0x767b, 0xcf90, 0x7678, 0xcf8a, 0x7676, 0xcf85, 0x7673, 0xcf7f, - 0x7671, 0xcf79, 0x766f, 0xcf73, 0x766c, 0xcf6d, 0x766a, 0xcf67, - 0x7668, 0xcf62, 0x7665, 0xcf5c, 0x7663, 0xcf56, 0x7660, 0xcf50, - 0x765e, 0xcf4a, 0x765c, 0xcf45, 0x7659, 0xcf3f, 0x7657, 0xcf39, - 0x7654, 0xcf33, 0x7652, 0xcf2d, 0x7650, 0xcf28, 0x764d, 0xcf22, - 0x764b, 0xcf1c, 0x7648, 0xcf16, 0x7646, 0xcf10, 0x7644, 0xcf0b, - 0x7641, 0xcf05, 0x763f, 0xceff, 0x763c, 0xcef9, 0x763a, 0xcef3, - 0x7638, 0xceee, 0x7635, 0xcee8, 0x7633, 0xcee2, 0x7630, 0xcedc, - 0x762e, 0xced6, 0x762b, 0xced1, 0x7629, 0xcecb, 0x7627, 0xcec5, - 0x7624, 0xcebf, 0x7622, 0xceb9, 0x761f, 0xceb4, 0x761d, 0xceae, - 0x761b, 0xcea8, 0x7618, 0xcea2, 0x7616, 0xce9c, 0x7613, 0xce97, - 0x7611, 0xce91, 0x760e, 0xce8b, 0x760c, 0xce85, 0x760a, 0xce7f, - 0x7607, 0xce7a, 0x7605, 0xce74, 0x7602, 0xce6e, 0x7600, 0xce68, - 0x75fd, 0xce62, 0x75fb, 0xce5d, 0x75f9, 0xce57, 0x75f6, 0xce51, - 0x75f4, 0xce4b, 0x75f1, 0xce45, 0x75ef, 0xce40, 0x75ec, 0xce3a, - 0x75ea, 0xce34, 0x75e7, 0xce2e, 0x75e5, 0xce28, 0x75e3, 0xce23, - 0x75e0, 0xce1d, 0x75de, 0xce17, 0x75db, 0xce11, 0x75d9, 0xce0c, - 0x75d6, 0xce06, 0x75d4, 0xce00, 0x75d1, 0xcdfa, 0x75cf, 0xcdf4, - 0x75cc, 0xcdef, 0x75ca, 0xcde9, 0x75c8, 0xcde3, 0x75c5, 0xcddd, - 0x75c3, 0xcdd8, 0x75c0, 0xcdd2, 0x75be, 0xcdcc, 0x75bb, 0xcdc6, - 0x75b9, 0xcdc0, 0x75b6, 0xcdbb, 0x75b4, 0xcdb5, 0x75b1, 0xcdaf, - 0x75af, 0xcda9, 0x75ac, 0xcda3, 0x75aa, 0xcd9e, 0x75a7, 0xcd98, - 0x75a5, 0xcd92, 0x75a3, 0xcd8c, 0x75a0, 0xcd87, 0x759e, 0xcd81, - 0x759b, 0xcd7b, 0x7599, 0xcd75, 0x7596, 0xcd70, 0x7594, 0xcd6a, - 0x7591, 0xcd64, 0x758f, 0xcd5e, 0x758c, 0xcd58, 0x758a, 0xcd53, - 0x7587, 0xcd4d, 0x7585, 0xcd47, 0x7582, 0xcd41, 0x7580, 0xcd3c, - 0x757d, 0xcd36, 0x757b, 0xcd30, 0x7578, 0xcd2a, 0x7576, 0xcd25, - 0x7573, 0xcd1f, 0x7571, 0xcd19, 0x756e, 0xcd13, 0x756c, 0xcd0d, - 0x7569, 0xcd08, 0x7567, 0xcd02, 0x7564, 0xccfc, 0x7562, 0xccf6, - 0x755f, 0xccf1, 0x755d, 0xcceb, 0x755a, 0xcce5, 0x7558, 0xccdf, - 0x7555, 0xccda, 0x7553, 0xccd4, 0x7550, 0xccce, 0x754e, 0xccc8, - 0x754b, 0xccc3, 0x7549, 0xccbd, 0x7546, 0xccb7, 0x7544, 0xccb1, - 0x7541, 0xccac, 0x753f, 0xcca6, 0x753c, 0xcca0, 0x753a, 0xcc9a, - 0x7537, 0xcc95, 0x7535, 0xcc8f, 0x7532, 0xcc89, 0x752f, 0xcc83, - 0x752d, 0xcc7e, 0x752a, 0xcc78, 0x7528, 0xcc72, 0x7525, 0xcc6c, - 0x7523, 0xcc67, 0x7520, 0xcc61, 0x751e, 0xcc5b, 0x751b, 0xcc55, - 0x7519, 0xcc50, 0x7516, 0xcc4a, 0x7514, 0xcc44, 0x7511, 0xcc3e, - 0x750f, 0xcc39, 0x750c, 0xcc33, 0x7509, 0xcc2d, 0x7507, 0xcc27, - 0x7504, 0xcc22, 0x7502, 0xcc1c, 0x74ff, 0xcc16, 0x74fd, 0xcc10, - 0x74fa, 0xcc0b, 0x74f8, 0xcc05, 0x74f5, 0xcbff, 0x74f2, 0xcbf9, - 0x74f0, 0xcbf4, 0x74ed, 0xcbee, 0x74eb, 0xcbe8, 0x74e8, 0xcbe2, - 0x74e6, 0xcbdd, 0x74e3, 0xcbd7, 0x74e1, 0xcbd1, 0x74de, 0xcbcb, - 0x74db, 0xcbc6, 0x74d9, 0xcbc0, 0x74d6, 0xcbba, 0x74d4, 0xcbb5, - 0x74d1, 0xcbaf, 0x74cf, 0xcba9, 0x74cc, 0xcba3, 0x74c9, 0xcb9e, - 0x74c7, 0xcb98, 0x74c4, 0xcb92, 0x74c2, 0xcb8c, 0x74bf, 0xcb87, - 0x74bd, 0xcb81, 0x74ba, 0xcb7b, 0x74b7, 0xcb75, 0x74b5, 0xcb70, - 0x74b2, 0xcb6a, 0x74b0, 0xcb64, 0x74ad, 0xcb5f, 0x74ab, 0xcb59, - 0x74a8, 0xcb53, 0x74a5, 0xcb4d, 0x74a3, 0xcb48, 0x74a0, 0xcb42, - 0x749e, 0xcb3c, 0x749b, 0xcb36, 0x7498, 0xcb31, 0x7496, 0xcb2b, - 0x7493, 0xcb25, 0x7491, 0xcb20, 0x748e, 0xcb1a, 0x748b, 0xcb14, - 0x7489, 0xcb0e, 0x7486, 0xcb09, 0x7484, 0xcb03, 0x7481, 0xcafd, - 0x747e, 0xcaf8, 0x747c, 0xcaf2, 0x7479, 0xcaec, 0x7477, 0xcae6, - 0x7474, 0xcae1, 0x7471, 0xcadb, 0x746f, 0xcad5, 0x746c, 0xcad0, - 0x746a, 0xcaca, 0x7467, 0xcac4, 0x7464, 0xcabe, 0x7462, 0xcab9, - 0x745f, 0xcab3, 0x745c, 0xcaad, 0x745a, 0xcaa8, 0x7457, 0xcaa2, - 0x7455, 0xca9c, 0x7452, 0xca96, 0x744f, 0xca91, 0x744d, 0xca8b, - 0x744a, 0xca85, 0x7448, 0xca80, 0x7445, 0xca7a, 0x7442, 0xca74, - 0x7440, 0xca6e, 0x743d, 0xca69, 0x743a, 0xca63, 0x7438, 0xca5d, - 0x7435, 0xca58, 0x7432, 0xca52, 0x7430, 0xca4c, 0x742d, 0xca46, - 0x742b, 0xca41, 0x7428, 0xca3b, 0x7425, 0xca35, 0x7423, 0xca30, - 0x7420, 0xca2a, 0x741d, 0xca24, 0x741b, 0xca1f, 0x7418, 0xca19, - 0x7415, 0xca13, 0x7413, 0xca0d, 0x7410, 0xca08, 0x740d, 0xca02, - 0x740b, 0xc9fc, 0x7408, 0xc9f7, 0x7406, 0xc9f1, 0x7403, 0xc9eb, - 0x7400, 0xc9e6, 0x73fe, 0xc9e0, 0x73fb, 0xc9da, 0x73f8, 0xc9d5, - 0x73f6, 0xc9cf, 0x73f3, 0xc9c9, 0x73f0, 0xc9c3, 0x73ee, 0xc9be, - 0x73eb, 0xc9b8, 0x73e8, 0xc9b2, 0x73e6, 0xc9ad, 0x73e3, 0xc9a7, - 0x73e0, 0xc9a1, 0x73de, 0xc99c, 0x73db, 0xc996, 0x73d8, 0xc990, - 0x73d6, 0xc98b, 0x73d3, 0xc985, 0x73d0, 0xc97f, 0x73ce, 0xc97a, - 0x73cb, 0xc974, 0x73c8, 0xc96e, 0x73c6, 0xc968, 0x73c3, 0xc963, - 0x73c0, 0xc95d, 0x73bd, 0xc957, 0x73bb, 0xc952, 0x73b8, 0xc94c, - 0x73b5, 0xc946, 0x73b3, 0xc941, 0x73b0, 0xc93b, 0x73ad, 0xc935, - 0x73ab, 0xc930, 0x73a8, 0xc92a, 0x73a5, 0xc924, 0x73a3, 0xc91f, - 0x73a0, 0xc919, 0x739d, 0xc913, 0x739b, 0xc90e, 0x7398, 0xc908, - 0x7395, 0xc902, 0x7392, 0xc8fd, 0x7390, 0xc8f7, 0x738d, 0xc8f1, - 0x738a, 0xc8ec, 0x7388, 0xc8e6, 0x7385, 0xc8e0, 0x7382, 0xc8db, - 0x737f, 0xc8d5, 0x737d, 0xc8cf, 0x737a, 0xc8ca, 0x7377, 0xc8c4, - 0x7375, 0xc8be, 0x7372, 0xc8b9, 0x736f, 0xc8b3, 0x736c, 0xc8ad, - 0x736a, 0xc8a8, 0x7367, 0xc8a2, 0x7364, 0xc89c, 0x7362, 0xc897, - 0x735f, 0xc891, 0x735c, 0xc88b, 0x7359, 0xc886, 0x7357, 0xc880, - 0x7354, 0xc87a, 0x7351, 0xc875, 0x734f, 0xc86f, 0x734c, 0xc869, - 0x7349, 0xc864, 0x7346, 0xc85e, 0x7344, 0xc858, 0x7341, 0xc853, - 0x733e, 0xc84d, 0x733b, 0xc847, 0x7339, 0xc842, 0x7336, 0xc83c, - 0x7333, 0xc836, 0x7330, 0xc831, 0x732e, 0xc82b, 0x732b, 0xc825, - 0x7328, 0xc820, 0x7326, 0xc81a, 0x7323, 0xc814, 0x7320, 0xc80f, - 0x731d, 0xc809, 0x731b, 0xc803, 0x7318, 0xc7fe, 0x7315, 0xc7f8, - 0x7312, 0xc7f3, 0x7310, 0xc7ed, 0x730d, 0xc7e7, 0x730a, 0xc7e2, - 0x7307, 0xc7dc, 0x7305, 0xc7d6, 0x7302, 0xc7d1, 0x72ff, 0xc7cb, - 0x72fc, 0xc7c5, 0x72f9, 0xc7c0, 0x72f7, 0xc7ba, 0x72f4, 0xc7b4, - 0x72f1, 0xc7af, 0x72ee, 0xc7a9, 0x72ec, 0xc7a3, 0x72e9, 0xc79e, - 0x72e6, 0xc798, 0x72e3, 0xc793, 0x72e1, 0xc78d, 0x72de, 0xc787, - 0x72db, 0xc782, 0x72d8, 0xc77c, 0x72d5, 0xc776, 0x72d3, 0xc771, - 0x72d0, 0xc76b, 0x72cd, 0xc765, 0x72ca, 0xc760, 0x72c8, 0xc75a, - 0x72c5, 0xc755, 0x72c2, 0xc74f, 0x72bf, 0xc749, 0x72bc, 0xc744, - 0x72ba, 0xc73e, 0x72b7, 0xc738, 0x72b4, 0xc733, 0x72b1, 0xc72d, - 0x72af, 0xc728, 0x72ac, 0xc722, 0x72a9, 0xc71c, 0x72a6, 0xc717, - 0x72a3, 0xc711, 0x72a1, 0xc70b, 0x729e, 0xc706, 0x729b, 0xc700, - 0x7298, 0xc6fa, 0x7295, 0xc6f5, 0x7293, 0xc6ef, 0x7290, 0xc6ea, - 0x728d, 0xc6e4, 0x728a, 0xc6de, 0x7287, 0xc6d9, 0x7285, 0xc6d3, - 0x7282, 0xc6ce, 0x727f, 0xc6c8, 0x727c, 0xc6c2, 0x7279, 0xc6bd, - 0x7276, 0xc6b7, 0x7274, 0xc6b1, 0x7271, 0xc6ac, 0x726e, 0xc6a6, - 0x726b, 0xc6a1, 0x7268, 0xc69b, 0x7266, 0xc695, 0x7263, 0xc690, - 0x7260, 0xc68a, 0x725d, 0xc684, 0x725a, 0xc67f, 0x7257, 0xc679, - 0x7255, 0xc674, 0x7252, 0xc66e, 0x724f, 0xc668, 0x724c, 0xc663, - 0x7249, 0xc65d, 0x7247, 0xc658, 0x7244, 0xc652, 0x7241, 0xc64c, - 0x723e, 0xc647, 0x723b, 0xc641, 0x7238, 0xc63c, 0x7236, 0xc636, - 0x7233, 0xc630, 0x7230, 0xc62b, 0x722d, 0xc625, 0x722a, 0xc620, - 0x7227, 0xc61a, 0x7224, 0xc614, 0x7222, 0xc60f, 0x721f, 0xc609, - 0x721c, 0xc603, 0x7219, 0xc5fe, 0x7216, 0xc5f8, 0x7213, 0xc5f3, - 0x7211, 0xc5ed, 0x720e, 0xc5e7, 0x720b, 0xc5e2, 0x7208, 0xc5dc, - 0x7205, 0xc5d7, 0x7202, 0xc5d1, 0x71ff, 0xc5cc, 0x71fd, 0xc5c6, - 0x71fa, 0xc5c0, 0x71f7, 0xc5bb, 0x71f4, 0xc5b5, 0x71f1, 0xc5b0, - 0x71ee, 0xc5aa, 0x71eb, 0xc5a4, 0x71e9, 0xc59f, 0x71e6, 0xc599, - 0x71e3, 0xc594, 0x71e0, 0xc58e, 0x71dd, 0xc588, 0x71da, 0xc583, - 0x71d7, 0xc57d, 0x71d4, 0xc578, 0x71d2, 0xc572, 0x71cf, 0xc56c, - 0x71cc, 0xc567, 0x71c9, 0xc561, 0x71c6, 0xc55c, 0x71c3, 0xc556, - 0x71c0, 0xc551, 0x71bd, 0xc54b, 0x71bb, 0xc545, 0x71b8, 0xc540, - 0x71b5, 0xc53a, 0x71b2, 0xc535, 0x71af, 0xc52f, 0x71ac, 0xc529, - 0x71a9, 0xc524, 0x71a6, 0xc51e, 0x71a3, 0xc519, 0x71a1, 0xc513, - 0x719e, 0xc50e, 0x719b, 0xc508, 0x7198, 0xc502, 0x7195, 0xc4fd, - 0x7192, 0xc4f7, 0x718f, 0xc4f2, 0x718c, 0xc4ec, 0x7189, 0xc4e7, - 0x7186, 0xc4e1, 0x7184, 0xc4db, 0x7181, 0xc4d6, 0x717e, 0xc4d0, - 0x717b, 0xc4cb, 0x7178, 0xc4c5, 0x7175, 0xc4c0, 0x7172, 0xc4ba, - 0x716f, 0xc4b4, 0x716c, 0xc4af, 0x7169, 0xc4a9, 0x7167, 0xc4a4, - 0x7164, 0xc49e, 0x7161, 0xc499, 0x715e, 0xc493, 0x715b, 0xc48d, - 0x7158, 0xc488, 0x7155, 0xc482, 0x7152, 0xc47d, 0x714f, 0xc477, - 0x714c, 0xc472, 0x7149, 0xc46c, 0x7146, 0xc467, 0x7143, 0xc461, - 0x7141, 0xc45b, 0x713e, 0xc456, 0x713b, 0xc450, 0x7138, 0xc44b, - 0x7135, 0xc445, 0x7132, 0xc440, 0x712f, 0xc43a, 0x712c, 0xc434, - 0x7129, 0xc42f, 0x7126, 0xc429, 0x7123, 0xc424, 0x7120, 0xc41e, - 0x711d, 0xc419, 0x711a, 0xc413, 0x7117, 0xc40e, 0x7114, 0xc408, - 0x7112, 0xc403, 0x710f, 0xc3fd, 0x710c, 0xc3f7, 0x7109, 0xc3f2, - 0x7106, 0xc3ec, 0x7103, 0xc3e7, 0x7100, 0xc3e1, 0x70fd, 0xc3dc, - 0x70fa, 0xc3d6, 0x70f7, 0xc3d1, 0x70f4, 0xc3cb, 0x70f1, 0xc3c5, - 0x70ee, 0xc3c0, 0x70eb, 0xc3ba, 0x70e8, 0xc3b5, 0x70e5, 0xc3af, - 0x70e2, 0xc3aa, 0x70df, 0xc3a4, 0x70dc, 0xc39f, 0x70d9, 0xc399, - 0x70d6, 0xc394, 0x70d3, 0xc38e, 0x70d1, 0xc389, 0x70ce, 0xc383, - 0x70cb, 0xc37d, 0x70c8, 0xc378, 0x70c5, 0xc372, 0x70c2, 0xc36d, - 0x70bf, 0xc367, 0x70bc, 0xc362, 0x70b9, 0xc35c, 0x70b6, 0xc357, - 0x70b3, 0xc351, 0x70b0, 0xc34c, 0x70ad, 0xc346, 0x70aa, 0xc341, - 0x70a7, 0xc33b, 0x70a4, 0xc336, 0x70a1, 0xc330, 0x709e, 0xc32a, - 0x709b, 0xc325, 0x7098, 0xc31f, 0x7095, 0xc31a, 0x7092, 0xc314, - 0x708f, 0xc30f, 0x708c, 0xc309, 0x7089, 0xc304, 0x7086, 0xc2fe, - 0x7083, 0xc2f9, 0x7080, 0xc2f3, 0x707d, 0xc2ee, 0x707a, 0xc2e8, - 0x7077, 0xc2e3, 0x7074, 0xc2dd, 0x7071, 0xc2d8, 0x706e, 0xc2d2, - 0x706b, 0xc2cd, 0x7068, 0xc2c7, 0x7065, 0xc2c2, 0x7062, 0xc2bc, - 0x705f, 0xc2b7, 0x705c, 0xc2b1, 0x7059, 0xc2ab, 0x7056, 0xc2a6, - 0x7053, 0xc2a0, 0x7050, 0xc29b, 0x704d, 0xc295, 0x704a, 0xc290, - 0x7047, 0xc28a, 0x7044, 0xc285, 0x7041, 0xc27f, 0x703e, 0xc27a, - 0x703b, 0xc274, 0x7038, 0xc26f, 0x7035, 0xc269, 0x7032, 0xc264, - 0x702f, 0xc25e, 0x702c, 0xc259, 0x7029, 0xc253, 0x7026, 0xc24e, - 0x7023, 0xc248, 0x7020, 0xc243, 0x701d, 0xc23d, 0x7019, 0xc238, - 0x7016, 0xc232, 0x7013, 0xc22d, 0x7010, 0xc227, 0x700d, 0xc222, - 0x700a, 0xc21c, 0x7007, 0xc217, 0x7004, 0xc211, 0x7001, 0xc20c, - 0x6ffe, 0xc206, 0x6ffb, 0xc201, 0x6ff8, 0xc1fb, 0x6ff5, 0xc1f6, - 0x6ff2, 0xc1f0, 0x6fef, 0xc1eb, 0x6fec, 0xc1e5, 0x6fe9, 0xc1e0, - 0x6fe6, 0xc1da, 0x6fe3, 0xc1d5, 0x6fe0, 0xc1cf, 0x6fdd, 0xc1ca, - 0x6fda, 0xc1c4, 0x6fd6, 0xc1bf, 0x6fd3, 0xc1b9, 0x6fd0, 0xc1b4, - 0x6fcd, 0xc1ae, 0x6fca, 0xc1a9, 0x6fc7, 0xc1a3, 0x6fc4, 0xc19e, - 0x6fc1, 0xc198, 0x6fbe, 0xc193, 0x6fbb, 0xc18d, 0x6fb8, 0xc188, - 0x6fb5, 0xc183, 0x6fb2, 0xc17d, 0x6faf, 0xc178, 0x6fac, 0xc172, - 0x6fa9, 0xc16d, 0x6fa5, 0xc167, 0x6fa2, 0xc162, 0x6f9f, 0xc15c, - 0x6f9c, 0xc157, 0x6f99, 0xc151, 0x6f96, 0xc14c, 0x6f93, 0xc146, - 0x6f90, 0xc141, 0x6f8d, 0xc13b, 0x6f8a, 0xc136, 0x6f87, 0xc130, - 0x6f84, 0xc12b, 0x6f81, 0xc125, 0x6f7d, 0xc120, 0x6f7a, 0xc11a, - 0x6f77, 0xc115, 0x6f74, 0xc10f, 0x6f71, 0xc10a, 0x6f6e, 0xc105, - 0x6f6b, 0xc0ff, 0x6f68, 0xc0fa, 0x6f65, 0xc0f4, 0x6f62, 0xc0ef, - 0x6f5f, 0xc0e9, 0x6f5b, 0xc0e4, 0x6f58, 0xc0de, 0x6f55, 0xc0d9, - 0x6f52, 0xc0d3, 0x6f4f, 0xc0ce, 0x6f4c, 0xc0c8, 0x6f49, 0xc0c3, - 0x6f46, 0xc0bd, 0x6f43, 0xc0b8, 0x6f3f, 0xc0b3, 0x6f3c, 0xc0ad, - 0x6f39, 0xc0a8, 0x6f36, 0xc0a2, 0x6f33, 0xc09d, 0x6f30, 0xc097, - 0x6f2d, 0xc092, 0x6f2a, 0xc08c, 0x6f27, 0xc087, 0x6f23, 0xc081, - 0x6f20, 0xc07c, 0x6f1d, 0xc077, 0x6f1a, 0xc071, 0x6f17, 0xc06c, - 0x6f14, 0xc066, 0x6f11, 0xc061, 0x6f0e, 0xc05b, 0x6f0b, 0xc056, - 0x6f07, 0xc050, 0x6f04, 0xc04b, 0x6f01, 0xc045, 0x6efe, 0xc040, - 0x6efb, 0xc03b, 0x6ef8, 0xc035, 0x6ef5, 0xc030, 0x6ef1, 0xc02a, - 0x6eee, 0xc025, 0x6eeb, 0xc01f, 0x6ee8, 0xc01a, 0x6ee5, 0xc014, - 0x6ee2, 0xc00f, 0x6edf, 0xc00a, 0x6edc, 0xc004, 0x6ed8, 0xbfff, - 0x6ed5, 0xbff9, 0x6ed2, 0xbff4, 0x6ecf, 0xbfee, 0x6ecc, 0xbfe9, - 0x6ec9, 0xbfe3, 0x6ec6, 0xbfde, 0x6ec2, 0xbfd9, 0x6ebf, 0xbfd3, - 0x6ebc, 0xbfce, 0x6eb9, 0xbfc8, 0x6eb6, 0xbfc3, 0x6eb3, 0xbfbd, - 0x6eaf, 0xbfb8, 0x6eac, 0xbfb3, 0x6ea9, 0xbfad, 0x6ea6, 0xbfa8, - 0x6ea3, 0xbfa2, 0x6ea0, 0xbf9d, 0x6e9c, 0xbf97, 0x6e99, 0xbf92, - 0x6e96, 0xbf8d, 0x6e93, 0xbf87, 0x6e90, 0xbf82, 0x6e8d, 0xbf7c, - 0x6e89, 0xbf77, 0x6e86, 0xbf71, 0x6e83, 0xbf6c, 0x6e80, 0xbf67, - 0x6e7d, 0xbf61, 0x6e7a, 0xbf5c, 0x6e76, 0xbf56, 0x6e73, 0xbf51, - 0x6e70, 0xbf4b, 0x6e6d, 0xbf46, 0x6e6a, 0xbf41, 0x6e67, 0xbf3b, - 0x6e63, 0xbf36, 0x6e60, 0xbf30, 0x6e5d, 0xbf2b, 0x6e5a, 0xbf26, - 0x6e57, 0xbf20, 0x6e53, 0xbf1b, 0x6e50, 0xbf15, 0x6e4d, 0xbf10, - 0x6e4a, 0xbf0a, 0x6e47, 0xbf05, 0x6e44, 0xbf00, 0x6e40, 0xbefa, - 0x6e3d, 0xbef5, 0x6e3a, 0xbeef, 0x6e37, 0xbeea, 0x6e34, 0xbee5, - 0x6e30, 0xbedf, 0x6e2d, 0xbeda, 0x6e2a, 0xbed4, 0x6e27, 0xbecf, - 0x6e24, 0xbeca, 0x6e20, 0xbec4, 0x6e1d, 0xbebf, 0x6e1a, 0xbeb9, - 0x6e17, 0xbeb4, 0x6e14, 0xbeae, 0x6e10, 0xbea9, 0x6e0d, 0xbea4, - 0x6e0a, 0xbe9e, 0x6e07, 0xbe99, 0x6e04, 0xbe93, 0x6e00, 0xbe8e, - 0x6dfd, 0xbe89, 0x6dfa, 0xbe83, 0x6df7, 0xbe7e, 0x6df3, 0xbe78, - 0x6df0, 0xbe73, 0x6ded, 0xbe6e, 0x6dea, 0xbe68, 0x6de7, 0xbe63, - 0x6de3, 0xbe5e, 0x6de0, 0xbe58, 0x6ddd, 0xbe53, 0x6dda, 0xbe4d, - 0x6dd6, 0xbe48, 0x6dd3, 0xbe43, 0x6dd0, 0xbe3d, 0x6dcd, 0xbe38, - 0x6dca, 0xbe32, 0x6dc6, 0xbe2d, 0x6dc3, 0xbe28, 0x6dc0, 0xbe22, - 0x6dbd, 0xbe1d, 0x6db9, 0xbe17, 0x6db6, 0xbe12, 0x6db3, 0xbe0d, - 0x6db0, 0xbe07, 0x6dac, 0xbe02, 0x6da9, 0xbdfd, 0x6da6, 0xbdf7, - 0x6da3, 0xbdf2, 0x6d9f, 0xbdec, 0x6d9c, 0xbde7, 0x6d99, 0xbde2, - 0x6d96, 0xbddc, 0x6d92, 0xbdd7, 0x6d8f, 0xbdd1, 0x6d8c, 0xbdcc, - 0x6d89, 0xbdc7, 0x6d85, 0xbdc1, 0x6d82, 0xbdbc, 0x6d7f, 0xbdb7, - 0x6d7c, 0xbdb1, 0x6d78, 0xbdac, 0x6d75, 0xbda6, 0x6d72, 0xbda1, - 0x6d6f, 0xbd9c, 0x6d6b, 0xbd96, 0x6d68, 0xbd91, 0x6d65, 0xbd8c, - 0x6d62, 0xbd86, 0x6d5e, 0xbd81, 0x6d5b, 0xbd7c, 0x6d58, 0xbd76, - 0x6d55, 0xbd71, 0x6d51, 0xbd6b, 0x6d4e, 0xbd66, 0x6d4b, 0xbd61, - 0x6d48, 0xbd5b, 0x6d44, 0xbd56, 0x6d41, 0xbd51, 0x6d3e, 0xbd4b, - 0x6d3a, 0xbd46, 0x6d37, 0xbd40, 0x6d34, 0xbd3b, 0x6d31, 0xbd36, - 0x6d2d, 0xbd30, 0x6d2a, 0xbd2b, 0x6d27, 0xbd26, 0x6d23, 0xbd20, - 0x6d20, 0xbd1b, 0x6d1d, 0xbd16, 0x6d1a, 0xbd10, 0x6d16, 0xbd0b, - 0x6d13, 0xbd06, 0x6d10, 0xbd00, 0x6d0c, 0xbcfb, 0x6d09, 0xbcf5, - 0x6d06, 0xbcf0, 0x6d03, 0xbceb, 0x6cff, 0xbce5, 0x6cfc, 0xbce0, - 0x6cf9, 0xbcdb, 0x6cf5, 0xbcd5, 0x6cf2, 0xbcd0, 0x6cef, 0xbccb, - 0x6cec, 0xbcc5, 0x6ce8, 0xbcc0, 0x6ce5, 0xbcbb, 0x6ce2, 0xbcb5, - 0x6cde, 0xbcb0, 0x6cdb, 0xbcab, 0x6cd8, 0xbca5, 0x6cd4, 0xbca0, - 0x6cd1, 0xbc9b, 0x6cce, 0xbc95, 0x6cca, 0xbc90, 0x6cc7, 0xbc8b, - 0x6cc4, 0xbc85, 0x6cc1, 0xbc80, 0x6cbd, 0xbc7b, 0x6cba, 0xbc75, - 0x6cb7, 0xbc70, 0x6cb3, 0xbc6b, 0x6cb0, 0xbc65, 0x6cad, 0xbc60, - 0x6ca9, 0xbc5b, 0x6ca6, 0xbc55, 0x6ca3, 0xbc50, 0x6c9f, 0xbc4b, - 0x6c9c, 0xbc45, 0x6c99, 0xbc40, 0x6c95, 0xbc3b, 0x6c92, 0xbc35, - 0x6c8f, 0xbc30, 0x6c8b, 0xbc2b, 0x6c88, 0xbc25, 0x6c85, 0xbc20, - 0x6c81, 0xbc1b, 0x6c7e, 0xbc15, 0x6c7b, 0xbc10, 0x6c77, 0xbc0b, - 0x6c74, 0xbc05, 0x6c71, 0xbc00, 0x6c6d, 0xbbfb, 0x6c6a, 0xbbf5, - 0x6c67, 0xbbf0, 0x6c63, 0xbbeb, 0x6c60, 0xbbe5, 0x6c5d, 0xbbe0, - 0x6c59, 0xbbdb, 0x6c56, 0xbbd5, 0x6c53, 0xbbd0, 0x6c4f, 0xbbcb, - 0x6c4c, 0xbbc5, 0x6c49, 0xbbc0, 0x6c45, 0xbbbb, 0x6c42, 0xbbb5, - 0x6c3f, 0xbbb0, 0x6c3b, 0xbbab, 0x6c38, 0xbba6, 0x6c34, 0xbba0, - 0x6c31, 0xbb9b, 0x6c2e, 0xbb96, 0x6c2a, 0xbb90, 0x6c27, 0xbb8b, - 0x6c24, 0xbb86, 0x6c20, 0xbb80, 0x6c1d, 0xbb7b, 0x6c1a, 0xbb76, - 0x6c16, 0xbb70, 0x6c13, 0xbb6b, 0x6c0f, 0xbb66, 0x6c0c, 0xbb61, - 0x6c09, 0xbb5b, 0x6c05, 0xbb56, 0x6c02, 0xbb51, 0x6bff, 0xbb4b, - 0x6bfb, 0xbb46, 0x6bf8, 0xbb41, 0x6bf5, 0xbb3b, 0x6bf1, 0xbb36, - 0x6bee, 0xbb31, 0x6bea, 0xbb2c, 0x6be7, 0xbb26, 0x6be4, 0xbb21, - 0x6be0, 0xbb1c, 0x6bdd, 0xbb16, 0x6bd9, 0xbb11, 0x6bd6, 0xbb0c, - 0x6bd3, 0xbb06, 0x6bcf, 0xbb01, 0x6bcc, 0xbafc, 0x6bc9, 0xbaf7, - 0x6bc5, 0xbaf1, 0x6bc2, 0xbaec, 0x6bbe, 0xbae7, 0x6bbb, 0xbae1, - 0x6bb8, 0xbadc, 0x6bb4, 0xbad7, 0x6bb1, 0xbad2, 0x6bad, 0xbacc, - 0x6baa, 0xbac7, 0x6ba7, 0xbac2, 0x6ba3, 0xbabc, 0x6ba0, 0xbab7, - 0x6b9c, 0xbab2, 0x6b99, 0xbaad, 0x6b96, 0xbaa7, 0x6b92, 0xbaa2, - 0x6b8f, 0xba9d, 0x6b8b, 0xba97, 0x6b88, 0xba92, 0x6b85, 0xba8d, - 0x6b81, 0xba88, 0x6b7e, 0xba82, 0x6b7a, 0xba7d, 0x6b77, 0xba78, - 0x6b73, 0xba73, 0x6b70, 0xba6d, 0x6b6d, 0xba68, 0x6b69, 0xba63, - 0x6b66, 0xba5d, 0x6b62, 0xba58, 0x6b5f, 0xba53, 0x6b5c, 0xba4e, - 0x6b58, 0xba48, 0x6b55, 0xba43, 0x6b51, 0xba3e, 0x6b4e, 0xba39, - 0x6b4a, 0xba33, 0x6b47, 0xba2e, 0x6b44, 0xba29, 0x6b40, 0xba23, - 0x6b3d, 0xba1e, 0x6b39, 0xba19, 0x6b36, 0xba14, 0x6b32, 0xba0e, - 0x6b2f, 0xba09, 0x6b2c, 0xba04, 0x6b28, 0xb9ff, 0x6b25, 0xb9f9, - 0x6b21, 0xb9f4, 0x6b1e, 0xb9ef, 0x6b1a, 0xb9ea, 0x6b17, 0xb9e4, - 0x6b13, 0xb9df, 0x6b10, 0xb9da, 0x6b0d, 0xb9d5, 0x6b09, 0xb9cf, - 0x6b06, 0xb9ca, 0x6b02, 0xb9c5, 0x6aff, 0xb9c0, 0x6afb, 0xb9ba, - 0x6af8, 0xb9b5, 0x6af4, 0xb9b0, 0x6af1, 0xb9ab, 0x6aee, 0xb9a5, - 0x6aea, 0xb9a0, 0x6ae7, 0xb99b, 0x6ae3, 0xb996, 0x6ae0, 0xb990, - 0x6adc, 0xb98b, 0x6ad9, 0xb986, 0x6ad5, 0xb981, 0x6ad2, 0xb97b, - 0x6ace, 0xb976, 0x6acb, 0xb971, 0x6ac8, 0xb96c, 0x6ac4, 0xb966, - 0x6ac1, 0xb961, 0x6abd, 0xb95c, 0x6aba, 0xb957, 0x6ab6, 0xb951, - 0x6ab3, 0xb94c, 0x6aaf, 0xb947, 0x6aac, 0xb942, 0x6aa8, 0xb93c, - 0x6aa5, 0xb937, 0x6aa1, 0xb932, 0x6a9e, 0xb92d, 0x6a9a, 0xb928, - 0x6a97, 0xb922, 0x6a93, 0xb91d, 0x6a90, 0xb918, 0x6a8c, 0xb913, - 0x6a89, 0xb90d, 0x6a86, 0xb908, 0x6a82, 0xb903, 0x6a7f, 0xb8fe, - 0x6a7b, 0xb8f8, 0x6a78, 0xb8f3, 0x6a74, 0xb8ee, 0x6a71, 0xb8e9, - 0x6a6d, 0xb8e4, 0x6a6a, 0xb8de, 0x6a66, 0xb8d9, 0x6a63, 0xb8d4, - 0x6a5f, 0xb8cf, 0x6a5c, 0xb8c9, 0x6a58, 0xb8c4, 0x6a55, 0xb8bf, - 0x6a51, 0xb8ba, 0x6a4e, 0xb8b5, 0x6a4a, 0xb8af, 0x6a47, 0xb8aa, - 0x6a43, 0xb8a5, 0x6a40, 0xb8a0, 0x6a3c, 0xb89b, 0x6a39, 0xb895, - 0x6a35, 0xb890, 0x6a32, 0xb88b, 0x6a2e, 0xb886, 0x6a2b, 0xb880, - 0x6a27, 0xb87b, 0x6a24, 0xb876, 0x6a20, 0xb871, 0x6a1d, 0xb86c, - 0x6a19, 0xb866, 0x6a16, 0xb861, 0x6a12, 0xb85c, 0x6a0e, 0xb857, - 0x6a0b, 0xb852, 0x6a07, 0xb84c, 0x6a04, 0xb847, 0x6a00, 0xb842, - 0x69fd, 0xb83d, 0x69f9, 0xb838, 0x69f6, 0xb832, 0x69f2, 0xb82d, - 0x69ef, 0xb828, 0x69eb, 0xb823, 0x69e8, 0xb81e, 0x69e4, 0xb818, - 0x69e1, 0xb813, 0x69dd, 0xb80e, 0x69da, 0xb809, 0x69d6, 0xb804, - 0x69d3, 0xb7fe, 0x69cf, 0xb7f9, 0x69cb, 0xb7f4, 0x69c8, 0xb7ef, - 0x69c4, 0xb7ea, 0x69c1, 0xb7e4, 0x69bd, 0xb7df, 0x69ba, 0xb7da, - 0x69b6, 0xb7d5, 0x69b3, 0xb7d0, 0x69af, 0xb7ca, 0x69ac, 0xb7c5, - 0x69a8, 0xb7c0, 0x69a5, 0xb7bb, 0x69a1, 0xb7b6, 0x699d, 0xb7b1, - 0x699a, 0xb7ab, 0x6996, 0xb7a6, 0x6993, 0xb7a1, 0x698f, 0xb79c, - 0x698c, 0xb797, 0x6988, 0xb791, 0x6985, 0xb78c, 0x6981, 0xb787, - 0x697d, 0xb782, 0x697a, 0xb77d, 0x6976, 0xb778, 0x6973, 0xb772, - 0x696f, 0xb76d, 0x696c, 0xb768, 0x6968, 0xb763, 0x6964, 0xb75e, - 0x6961, 0xb758, 0x695d, 0xb753, 0x695a, 0xb74e, 0x6956, 0xb749, - 0x6953, 0xb744, 0x694f, 0xb73f, 0x694b, 0xb739, 0x6948, 0xb734, - 0x6944, 0xb72f, 0x6941, 0xb72a, 0x693d, 0xb725, 0x693a, 0xb720, - 0x6936, 0xb71a, 0x6932, 0xb715, 0x692f, 0xb710, 0x692b, 0xb70b, - 0x6928, 0xb706, 0x6924, 0xb701, 0x6921, 0xb6fb, 0x691d, 0xb6f6, - 0x6919, 0xb6f1, 0x6916, 0xb6ec, 0x6912, 0xb6e7, 0x690f, 0xb6e2, - 0x690b, 0xb6dd, 0x6907, 0xb6d7, 0x6904, 0xb6d2, 0x6900, 0xb6cd, - 0x68fd, 0xb6c8, 0x68f9, 0xb6c3, 0x68f5, 0xb6be, 0x68f2, 0xb6b8, - 0x68ee, 0xb6b3, 0x68eb, 0xb6ae, 0x68e7, 0xb6a9, 0x68e3, 0xb6a4, - 0x68e0, 0xb69f, 0x68dc, 0xb69a, 0x68d9, 0xb694, 0x68d5, 0xb68f, - 0x68d1, 0xb68a, 0x68ce, 0xb685, 0x68ca, 0xb680, 0x68c7, 0xb67b, - 0x68c3, 0xb676, 0x68bf, 0xb670, 0x68bc, 0xb66b, 0x68b8, 0xb666, - 0x68b5, 0xb661, 0x68b1, 0xb65c, 0x68ad, 0xb657, 0x68aa, 0xb652, - 0x68a6, 0xb64c, 0x68a3, 0xb647, 0x689f, 0xb642, 0x689b, 0xb63d, - 0x6898, 0xb638, 0x6894, 0xb633, 0x6890, 0xb62e, 0x688d, 0xb628, - 0x6889, 0xb623, 0x6886, 0xb61e, 0x6882, 0xb619, 0x687e, 0xb614, - 0x687b, 0xb60f, 0x6877, 0xb60a, 0x6873, 0xb605, 0x6870, 0xb5ff, - 0x686c, 0xb5fa, 0x6868, 0xb5f5, 0x6865, 0xb5f0, 0x6861, 0xb5eb, - 0x685e, 0xb5e6, 0x685a, 0xb5e1, 0x6856, 0xb5dc, 0x6853, 0xb5d6, - 0x684f, 0xb5d1, 0x684b, 0xb5cc, 0x6848, 0xb5c7, 0x6844, 0xb5c2, - 0x6840, 0xb5bd, 0x683d, 0xb5b8, 0x6839, 0xb5b3, 0x6835, 0xb5ae, - 0x6832, 0xb5a8, 0x682e, 0xb5a3, 0x682b, 0xb59e, 0x6827, 0xb599, - 0x6823, 0xb594, 0x6820, 0xb58f, 0x681c, 0xb58a, 0x6818, 0xb585, - 0x6815, 0xb57f, 0x6811, 0xb57a, 0x680d, 0xb575, 0x680a, 0xb570, - 0x6806, 0xb56b, 0x6802, 0xb566, 0x67ff, 0xb561, 0x67fb, 0xb55c, - 0x67f7, 0xb557, 0x67f4, 0xb552, 0x67f0, 0xb54c, 0x67ec, 0xb547, - 0x67e9, 0xb542, 0x67e5, 0xb53d, 0x67e1, 0xb538, 0x67de, 0xb533, - 0x67da, 0xb52e, 0x67d6, 0xb529, 0x67d3, 0xb524, 0x67cf, 0xb51f, - 0x67cb, 0xb519, 0x67c8, 0xb514, 0x67c4, 0xb50f, 0x67c0, 0xb50a, - 0x67bd, 0xb505, 0x67b9, 0xb500, 0x67b5, 0xb4fb, 0x67b2, 0xb4f6, - 0x67ae, 0xb4f1, 0x67aa, 0xb4ec, 0x67a6, 0xb4e7, 0x67a3, 0xb4e1, - 0x679f, 0xb4dc, 0x679b, 0xb4d7, 0x6798, 0xb4d2, 0x6794, 0xb4cd, - 0x6790, 0xb4c8, 0x678d, 0xb4c3, 0x6789, 0xb4be, 0x6785, 0xb4b9, - 0x6782, 0xb4b4, 0x677e, 0xb4af, 0x677a, 0xb4aa, 0x6776, 0xb4a4, - 0x6773, 0xb49f, 0x676f, 0xb49a, 0x676b, 0xb495, 0x6768, 0xb490, - 0x6764, 0xb48b, 0x6760, 0xb486, 0x675d, 0xb481, 0x6759, 0xb47c, - 0x6755, 0xb477, 0x6751, 0xb472, 0x674e, 0xb46d, 0x674a, 0xb468, - 0x6746, 0xb462, 0x6743, 0xb45d, 0x673f, 0xb458, 0x673b, 0xb453, - 0x6737, 0xb44e, 0x6734, 0xb449, 0x6730, 0xb444, 0x672c, 0xb43f, - 0x6729, 0xb43a, 0x6725, 0xb435, 0x6721, 0xb430, 0x671d, 0xb42b, - 0x671a, 0xb426, 0x6716, 0xb421, 0x6712, 0xb41c, 0x670e, 0xb417, - 0x670b, 0xb411, 0x6707, 0xb40c, 0x6703, 0xb407, 0x6700, 0xb402, - 0x66fc, 0xb3fd, 0x66f8, 0xb3f8, 0x66f4, 0xb3f3, 0x66f1, 0xb3ee, - 0x66ed, 0xb3e9, 0x66e9, 0xb3e4, 0x66e5, 0xb3df, 0x66e2, 0xb3da, - 0x66de, 0xb3d5, 0x66da, 0xb3d0, 0x66d6, 0xb3cb, 0x66d3, 0xb3c6, - 0x66cf, 0xb3c1, 0x66cb, 0xb3bc, 0x66c8, 0xb3b7, 0x66c4, 0xb3b1, - 0x66c0, 0xb3ac, 0x66bc, 0xb3a7, 0x66b9, 0xb3a2, 0x66b5, 0xb39d, - 0x66b1, 0xb398, 0x66ad, 0xb393, 0x66aa, 0xb38e, 0x66a6, 0xb389, - 0x66a2, 0xb384, 0x669e, 0xb37f, 0x669b, 0xb37a, 0x6697, 0xb375, - 0x6693, 0xb370, 0x668f, 0xb36b, 0x668b, 0xb366, 0x6688, 0xb361, - 0x6684, 0xb35c, 0x6680, 0xb357, 0x667c, 0xb352, 0x6679, 0xb34d, - 0x6675, 0xb348, 0x6671, 0xb343, 0x666d, 0xb33e, 0x666a, 0xb339, - 0x6666, 0xb334, 0x6662, 0xb32f, 0x665e, 0xb32a, 0x665b, 0xb325, - 0x6657, 0xb31f, 0x6653, 0xb31a, 0x664f, 0xb315, 0x664b, 0xb310, - 0x6648, 0xb30b, 0x6644, 0xb306, 0x6640, 0xb301, 0x663c, 0xb2fc, - 0x6639, 0xb2f7, 0x6635, 0xb2f2, 0x6631, 0xb2ed, 0x662d, 0xb2e8, - 0x6629, 0xb2e3, 0x6626, 0xb2de, 0x6622, 0xb2d9, 0x661e, 0xb2d4, - 0x661a, 0xb2cf, 0x6616, 0xb2ca, 0x6613, 0xb2c5, 0x660f, 0xb2c0, - 0x660b, 0xb2bb, 0x6607, 0xb2b6, 0x6603, 0xb2b1, 0x6600, 0xb2ac, - 0x65fc, 0xb2a7, 0x65f8, 0xb2a2, 0x65f4, 0xb29d, 0x65f0, 0xb298, - 0x65ed, 0xb293, 0x65e9, 0xb28e, 0x65e5, 0xb289, 0x65e1, 0xb284, - 0x65dd, 0xb27f, 0x65da, 0xb27a, 0x65d6, 0xb275, 0x65d2, 0xb270, - 0x65ce, 0xb26b, 0x65ca, 0xb266, 0x65c7, 0xb261, 0x65c3, 0xb25c, - 0x65bf, 0xb257, 0x65bb, 0xb252, 0x65b7, 0xb24d, 0x65b4, 0xb248, - 0x65b0, 0xb243, 0x65ac, 0xb23e, 0x65a8, 0xb239, 0x65a4, 0xb234, - 0x65a0, 0xb22f, 0x659d, 0xb22a, 0x6599, 0xb225, 0x6595, 0xb220, - 0x6591, 0xb21b, 0x658d, 0xb216, 0x658a, 0xb211, 0x6586, 0xb20c, - 0x6582, 0xb207, 0x657e, 0xb202, 0x657a, 0xb1fd, 0x6576, 0xb1f8, - 0x6573, 0xb1f3, 0x656f, 0xb1ee, 0x656b, 0xb1e9, 0x6567, 0xb1e4, - 0x6563, 0xb1df, 0x655f, 0xb1da, 0x655c, 0xb1d6, 0x6558, 0xb1d1, - 0x6554, 0xb1cc, 0x6550, 0xb1c7, 0x654c, 0xb1c2, 0x6548, 0xb1bd, - 0x6545, 0xb1b8, 0x6541, 0xb1b3, 0x653d, 0xb1ae, 0x6539, 0xb1a9, - 0x6535, 0xb1a4, 0x6531, 0xb19f, 0x652d, 0xb19a, 0x652a, 0xb195, - 0x6526, 0xb190, 0x6522, 0xb18b, 0x651e, 0xb186, 0x651a, 0xb181, - 0x6516, 0xb17c, 0x6513, 0xb177, 0x650f, 0xb172, 0x650b, 0xb16d, - 0x6507, 0xb168, 0x6503, 0xb163, 0x64ff, 0xb15e, 0x64fb, 0xb159, - 0x64f7, 0xb154, 0x64f4, 0xb14f, 0x64f0, 0xb14a, 0x64ec, 0xb146, - 0x64e8, 0xb141, 0x64e4, 0xb13c, 0x64e0, 0xb137, 0x64dc, 0xb132, - 0x64d9, 0xb12d, 0x64d5, 0xb128, 0x64d1, 0xb123, 0x64cd, 0xb11e, - 0x64c9, 0xb119, 0x64c5, 0xb114, 0x64c1, 0xb10f, 0x64bd, 0xb10a, - 0x64ba, 0xb105, 0x64b6, 0xb100, 0x64b2, 0xb0fb, 0x64ae, 0xb0f6, - 0x64aa, 0xb0f1, 0x64a6, 0xb0ec, 0x64a2, 0xb0e8, 0x649e, 0xb0e3, - 0x649b, 0xb0de, 0x6497, 0xb0d9, 0x6493, 0xb0d4, 0x648f, 0xb0cf, - 0x648b, 0xb0ca, 0x6487, 0xb0c5, 0x6483, 0xb0c0, 0x647f, 0xb0bb, - 0x647b, 0xb0b6, 0x6478, 0xb0b1, 0x6474, 0xb0ac, 0x6470, 0xb0a7, - 0x646c, 0xb0a2, 0x6468, 0xb09e, 0x6464, 0xb099, 0x6460, 0xb094, - 0x645c, 0xb08f, 0x6458, 0xb08a, 0x6454, 0xb085, 0x6451, 0xb080, - 0x644d, 0xb07b, 0x6449, 0xb076, 0x6445, 0xb071, 0x6441, 0xb06c, - 0x643d, 0xb067, 0x6439, 0xb062, 0x6435, 0xb05e, 0x6431, 0xb059, - 0x642d, 0xb054, 0x6429, 0xb04f, 0x6426, 0xb04a, 0x6422, 0xb045, - 0x641e, 0xb040, 0x641a, 0xb03b, 0x6416, 0xb036, 0x6412, 0xb031, - 0x640e, 0xb02c, 0x640a, 0xb027, 0x6406, 0xb023, 0x6402, 0xb01e, - 0x63fe, 0xb019, 0x63fa, 0xb014, 0x63f7, 0xb00f, 0x63f3, 0xb00a, - 0x63ef, 0xb005, 0x63eb, 0xb000, 0x63e7, 0xaffb, 0x63e3, 0xaff6, - 0x63df, 0xaff1, 0x63db, 0xafed, 0x63d7, 0xafe8, 0x63d3, 0xafe3, - 0x63cf, 0xafde, 0x63cb, 0xafd9, 0x63c7, 0xafd4, 0x63c3, 0xafcf, - 0x63c0, 0xafca, 0x63bc, 0xafc5, 0x63b8, 0xafc1, 0x63b4, 0xafbc, - 0x63b0, 0xafb7, 0x63ac, 0xafb2, 0x63a8, 0xafad, 0x63a4, 0xafa8, - 0x63a0, 0xafa3, 0x639c, 0xaf9e, 0x6398, 0xaf99, 0x6394, 0xaf94, - 0x6390, 0xaf90, 0x638c, 0xaf8b, 0x6388, 0xaf86, 0x6384, 0xaf81, - 0x6380, 0xaf7c, 0x637c, 0xaf77, 0x6378, 0xaf72, 0x6375, 0xaf6d, - 0x6371, 0xaf69, 0x636d, 0xaf64, 0x6369, 0xaf5f, 0x6365, 0xaf5a, - 0x6361, 0xaf55, 0x635d, 0xaf50, 0x6359, 0xaf4b, 0x6355, 0xaf46, - 0x6351, 0xaf41, 0x634d, 0xaf3d, 0x6349, 0xaf38, 0x6345, 0xaf33, - 0x6341, 0xaf2e, 0x633d, 0xaf29, 0x6339, 0xaf24, 0x6335, 0xaf1f, - 0x6331, 0xaf1b, 0x632d, 0xaf16, 0x6329, 0xaf11, 0x6325, 0xaf0c, - 0x6321, 0xaf07, 0x631d, 0xaf02, 0x6319, 0xaefd, 0x6315, 0xaef8, - 0x6311, 0xaef4, 0x630d, 0xaeef, 0x6309, 0xaeea, 0x6305, 0xaee5, - 0x6301, 0xaee0, 0x62fd, 0xaedb, 0x62f9, 0xaed6, 0x62f5, 0xaed2, - 0x62f2, 0xaecd, 0x62ee, 0xaec8, 0x62ea, 0xaec3, 0x62e6, 0xaebe, - 0x62e2, 0xaeb9, 0x62de, 0xaeb4, 0x62da, 0xaeb0, 0x62d6, 0xaeab, - 0x62d2, 0xaea6, 0x62ce, 0xaea1, 0x62ca, 0xae9c, 0x62c6, 0xae97, - 0x62c2, 0xae92, 0x62be, 0xae8e, 0x62ba, 0xae89, 0x62b6, 0xae84, - 0x62b2, 0xae7f, 0x62ae, 0xae7a, 0x62aa, 0xae75, 0x62a6, 0xae71, - 0x62a2, 0xae6c, 0x629e, 0xae67, 0x629a, 0xae62, 0x6296, 0xae5d, - 0x6292, 0xae58, 0x628e, 0xae54, 0x628a, 0xae4f, 0x6286, 0xae4a, - 0x6282, 0xae45, 0x627e, 0xae40, 0x627a, 0xae3b, 0x6275, 0xae37, - 0x6271, 0xae32, 0x626d, 0xae2d, 0x6269, 0xae28, 0x6265, 0xae23, - 0x6261, 0xae1e, 0x625d, 0xae1a, 0x6259, 0xae15, 0x6255, 0xae10, - 0x6251, 0xae0b, 0x624d, 0xae06, 0x6249, 0xae01, 0x6245, 0xadfd, - 0x6241, 0xadf8, 0x623d, 0xadf3, 0x6239, 0xadee, 0x6235, 0xade9, - 0x6231, 0xade4, 0x622d, 0xade0, 0x6229, 0xaddb, 0x6225, 0xadd6, - 0x6221, 0xadd1, 0x621d, 0xadcc, 0x6219, 0xadc8, 0x6215, 0xadc3, - 0x6211, 0xadbe, 0x620d, 0xadb9, 0x6209, 0xadb4, 0x6205, 0xadaf, - 0x6201, 0xadab, 0x61fd, 0xada6, 0x61f9, 0xada1, 0x61f5, 0xad9c, - 0x61f1, 0xad97, 0x61ec, 0xad93, 0x61e8, 0xad8e, 0x61e4, 0xad89, - 0x61e0, 0xad84, 0x61dc, 0xad7f, 0x61d8, 0xad7b, 0x61d4, 0xad76, - 0x61d0, 0xad71, 0x61cc, 0xad6c, 0x61c8, 0xad67, 0x61c4, 0xad63, - 0x61c0, 0xad5e, 0x61bc, 0xad59, 0x61b8, 0xad54, 0x61b4, 0xad4f, - 0x61b0, 0xad4b, 0x61ac, 0xad46, 0x61a8, 0xad41, 0x61a3, 0xad3c, - 0x619f, 0xad37, 0x619b, 0xad33, 0x6197, 0xad2e, 0x6193, 0xad29, - 0x618f, 0xad24, 0x618b, 0xad1f, 0x6187, 0xad1b, 0x6183, 0xad16, - 0x617f, 0xad11, 0x617b, 0xad0c, 0x6177, 0xad08, 0x6173, 0xad03, - 0x616f, 0xacfe, 0x616b, 0xacf9, 0x6166, 0xacf4, 0x6162, 0xacf0, - 0x615e, 0xaceb, 0x615a, 0xace6, 0x6156, 0xace1, 0x6152, 0xacdd, - 0x614e, 0xacd8, 0x614a, 0xacd3, 0x6146, 0xacce, 0x6142, 0xacc9, - 0x613e, 0xacc5, 0x613a, 0xacc0, 0x6135, 0xacbb, 0x6131, 0xacb6, - 0x612d, 0xacb2, 0x6129, 0xacad, 0x6125, 0xaca8, 0x6121, 0xaca3, - 0x611d, 0xac9e, 0x6119, 0xac9a, 0x6115, 0xac95, 0x6111, 0xac90, - 0x610d, 0xac8b, 0x6108, 0xac87, 0x6104, 0xac82, 0x6100, 0xac7d, - 0x60fc, 0xac78, 0x60f8, 0xac74, 0x60f4, 0xac6f, 0x60f0, 0xac6a, - 0x60ec, 0xac65, 0x60e8, 0xac61, 0x60e4, 0xac5c, 0x60df, 0xac57, - 0x60db, 0xac52, 0x60d7, 0xac4e, 0x60d3, 0xac49, 0x60cf, 0xac44, - 0x60cb, 0xac3f, 0x60c7, 0xac3b, 0x60c3, 0xac36, 0x60bf, 0xac31, - 0x60ba, 0xac2c, 0x60b6, 0xac28, 0x60b2, 0xac23, 0x60ae, 0xac1e, - 0x60aa, 0xac19, 0x60a6, 0xac15, 0x60a2, 0xac10, 0x609e, 0xac0b, - 0x6099, 0xac06, 0x6095, 0xac02, 0x6091, 0xabfd, 0x608d, 0xabf8, - 0x6089, 0xabf3, 0x6085, 0xabef, 0x6081, 0xabea, 0x607d, 0xabe5, - 0x6078, 0xabe0, 0x6074, 0xabdc, 0x6070, 0xabd7, 0x606c, 0xabd2, - 0x6068, 0xabcd, 0x6064, 0xabc9, 0x6060, 0xabc4, 0x605c, 0xabbf, - 0x6057, 0xabbb, 0x6053, 0xabb6, 0x604f, 0xabb1, 0x604b, 0xabac, - 0x6047, 0xaba8, 0x6043, 0xaba3, 0x603f, 0xab9e, 0x603a, 0xab99, - 0x6036, 0xab95, 0x6032, 0xab90, 0x602e, 0xab8b, 0x602a, 0xab87, - 0x6026, 0xab82, 0x6022, 0xab7d, 0x601d, 0xab78, 0x6019, 0xab74, - 0x6015, 0xab6f, 0x6011, 0xab6a, 0x600d, 0xab66, 0x6009, 0xab61, - 0x6004, 0xab5c, 0x6000, 0xab57, 0x5ffc, 0xab53, 0x5ff8, 0xab4e, - 0x5ff4, 0xab49, 0x5ff0, 0xab45, 0x5fec, 0xab40, 0x5fe7, 0xab3b, - 0x5fe3, 0xab36, 0x5fdf, 0xab32, 0x5fdb, 0xab2d, 0x5fd7, 0xab28, - 0x5fd3, 0xab24, 0x5fce, 0xab1f, 0x5fca, 0xab1a, 0x5fc6, 0xab16, - 0x5fc2, 0xab11, 0x5fbe, 0xab0c, 0x5fba, 0xab07, 0x5fb5, 0xab03, - 0x5fb1, 0xaafe, 0x5fad, 0xaaf9, 0x5fa9, 0xaaf5, 0x5fa5, 0xaaf0, - 0x5fa0, 0xaaeb, 0x5f9c, 0xaae7, 0x5f98, 0xaae2, 0x5f94, 0xaadd, - 0x5f90, 0xaad8, 0x5f8c, 0xaad4, 0x5f87, 0xaacf, 0x5f83, 0xaaca, - 0x5f7f, 0xaac6, 0x5f7b, 0xaac1, 0x5f77, 0xaabc, 0x5f72, 0xaab8, - 0x5f6e, 0xaab3, 0x5f6a, 0xaaae, 0x5f66, 0xaaaa, 0x5f62, 0xaaa5, - 0x5f5e, 0xaaa0, 0x5f59, 0xaa9c, 0x5f55, 0xaa97, 0x5f51, 0xaa92, - 0x5f4d, 0xaa8e, 0x5f49, 0xaa89, 0x5f44, 0xaa84, 0x5f40, 0xaa7f, - 0x5f3c, 0xaa7b, 0x5f38, 0xaa76, 0x5f34, 0xaa71, 0x5f2f, 0xaa6d, - 0x5f2b, 0xaa68, 0x5f27, 0xaa63, 0x5f23, 0xaa5f, 0x5f1f, 0xaa5a, - 0x5f1a, 0xaa55, 0x5f16, 0xaa51, 0x5f12, 0xaa4c, 0x5f0e, 0xaa47, - 0x5f0a, 0xaa43, 0x5f05, 0xaa3e, 0x5f01, 0xaa39, 0x5efd, 0xaa35, - 0x5ef9, 0xaa30, 0x5ef5, 0xaa2b, 0x5ef0, 0xaa27, 0x5eec, 0xaa22, - 0x5ee8, 0xaa1d, 0x5ee4, 0xaa19, 0x5edf, 0xaa14, 0x5edb, 0xaa10, - 0x5ed7, 0xaa0b, 0x5ed3, 0xaa06, 0x5ecf, 0xaa02, 0x5eca, 0xa9fd, - 0x5ec6, 0xa9f8, 0x5ec2, 0xa9f4, 0x5ebe, 0xa9ef, 0x5eb9, 0xa9ea, - 0x5eb5, 0xa9e6, 0x5eb1, 0xa9e1, 0x5ead, 0xa9dc, 0x5ea9, 0xa9d8, - 0x5ea4, 0xa9d3, 0x5ea0, 0xa9ce, 0x5e9c, 0xa9ca, 0x5e98, 0xa9c5, - 0x5e93, 0xa9c0, 0x5e8f, 0xa9bc, 0x5e8b, 0xa9b7, 0x5e87, 0xa9b3, - 0x5e82, 0xa9ae, 0x5e7e, 0xa9a9, 0x5e7a, 0xa9a5, 0x5e76, 0xa9a0, - 0x5e71, 0xa99b, 0x5e6d, 0xa997, 0x5e69, 0xa992, 0x5e65, 0xa98d, - 0x5e60, 0xa989, 0x5e5c, 0xa984, 0x5e58, 0xa980, 0x5e54, 0xa97b, - 0x5e50, 0xa976, 0x5e4b, 0xa972, 0x5e47, 0xa96d, 0x5e43, 0xa968, - 0x5e3f, 0xa964, 0x5e3a, 0xa95f, 0x5e36, 0xa95b, 0x5e32, 0xa956, - 0x5e2d, 0xa951, 0x5e29, 0xa94d, 0x5e25, 0xa948, 0x5e21, 0xa943, - 0x5e1c, 0xa93f, 0x5e18, 0xa93a, 0x5e14, 0xa936, 0x5e10, 0xa931, - 0x5e0b, 0xa92c, 0x5e07, 0xa928, 0x5e03, 0xa923, 0x5dff, 0xa91e, - 0x5dfa, 0xa91a, 0x5df6, 0xa915, 0x5df2, 0xa911, 0x5dee, 0xa90c, - 0x5de9, 0xa907, 0x5de5, 0xa903, 0x5de1, 0xa8fe, 0x5ddc, 0xa8fa, - 0x5dd8, 0xa8f5, 0x5dd4, 0xa8f0, 0x5dd0, 0xa8ec, 0x5dcb, 0xa8e7, - 0x5dc7, 0xa8e3, 0x5dc3, 0xa8de, 0x5dbf, 0xa8d9, 0x5dba, 0xa8d5, - 0x5db6, 0xa8d0, 0x5db2, 0xa8cc, 0x5dad, 0xa8c7, 0x5da9, 0xa8c2, - 0x5da5, 0xa8be, 0x5da1, 0xa8b9, 0x5d9c, 0xa8b5, 0x5d98, 0xa8b0, - 0x5d94, 0xa8ab, 0x5d8f, 0xa8a7, 0x5d8b, 0xa8a2, 0x5d87, 0xa89e, - 0x5d83, 0xa899, 0x5d7e, 0xa894, 0x5d7a, 0xa890, 0x5d76, 0xa88b, - 0x5d71, 0xa887, 0x5d6d, 0xa882, 0x5d69, 0xa87d, 0x5d65, 0xa879, - 0x5d60, 0xa874, 0x5d5c, 0xa870, 0x5d58, 0xa86b, 0x5d53, 0xa867, - 0x5d4f, 0xa862, 0x5d4b, 0xa85d, 0x5d46, 0xa859, 0x5d42, 0xa854, - 0x5d3e, 0xa850, 0x5d3a, 0xa84b, 0x5d35, 0xa847, 0x5d31, 0xa842, - 0x5d2d, 0xa83d, 0x5d28, 0xa839, 0x5d24, 0xa834, 0x5d20, 0xa830, - 0x5d1b, 0xa82b, 0x5d17, 0xa827, 0x5d13, 0xa822, 0x5d0e, 0xa81d, - 0x5d0a, 0xa819, 0x5d06, 0xa814, 0x5d01, 0xa810, 0x5cfd, 0xa80b, - 0x5cf9, 0xa807, 0x5cf5, 0xa802, 0x5cf0, 0xa7fd, 0x5cec, 0xa7f9, - 0x5ce8, 0xa7f4, 0x5ce3, 0xa7f0, 0x5cdf, 0xa7eb, 0x5cdb, 0xa7e7, - 0x5cd6, 0xa7e2, 0x5cd2, 0xa7de, 0x5cce, 0xa7d9, 0x5cc9, 0xa7d4, - 0x5cc5, 0xa7d0, 0x5cc1, 0xa7cb, 0x5cbc, 0xa7c7, 0x5cb8, 0xa7c2, - 0x5cb4, 0xa7be, 0x5caf, 0xa7b9, 0x5cab, 0xa7b5, 0x5ca7, 0xa7b0, - 0x5ca2, 0xa7ab, 0x5c9e, 0xa7a7, 0x5c9a, 0xa7a2, 0x5c95, 0xa79e, - 0x5c91, 0xa799, 0x5c8d, 0xa795, 0x5c88, 0xa790, 0x5c84, 0xa78c, - 0x5c80, 0xa787, 0x5c7b, 0xa783, 0x5c77, 0xa77e, 0x5c73, 0xa779, - 0x5c6e, 0xa775, 0x5c6a, 0xa770, 0x5c66, 0xa76c, 0x5c61, 0xa767, - 0x5c5d, 0xa763, 0x5c58, 0xa75e, 0x5c54, 0xa75a, 0x5c50, 0xa755, - 0x5c4b, 0xa751, 0x5c47, 0xa74c, 0x5c43, 0xa748, 0x5c3e, 0xa743, - 0x5c3a, 0xa73f, 0x5c36, 0xa73a, 0x5c31, 0xa735, 0x5c2d, 0xa731, - 0x5c29, 0xa72c, 0x5c24, 0xa728, 0x5c20, 0xa723, 0x5c1b, 0xa71f, - 0x5c17, 0xa71a, 0x5c13, 0xa716, 0x5c0e, 0xa711, 0x5c0a, 0xa70d, - 0x5c06, 0xa708, 0x5c01, 0xa704, 0x5bfd, 0xa6ff, 0x5bf9, 0xa6fb, - 0x5bf4, 0xa6f6, 0x5bf0, 0xa6f2, 0x5beb, 0xa6ed, 0x5be7, 0xa6e9, - 0x5be3, 0xa6e4, 0x5bde, 0xa6e0, 0x5bda, 0xa6db, 0x5bd6, 0xa6d7, - 0x5bd1, 0xa6d2, 0x5bcd, 0xa6ce, 0x5bc8, 0xa6c9, 0x5bc4, 0xa6c5, - 0x5bc0, 0xa6c0, 0x5bbb, 0xa6bc, 0x5bb7, 0xa6b7, 0x5bb2, 0xa6b3, - 0x5bae, 0xa6ae, 0x5baa, 0xa6aa, 0x5ba5, 0xa6a5, 0x5ba1, 0xa6a1, - 0x5b9d, 0xa69c, 0x5b98, 0xa698, 0x5b94, 0xa693, 0x5b8f, 0xa68f, - 0x5b8b, 0xa68a, 0x5b87, 0xa686, 0x5b82, 0xa681, 0x5b7e, 0xa67d, - 0x5b79, 0xa678, 0x5b75, 0xa674, 0x5b71, 0xa66f, 0x5b6c, 0xa66b, - 0x5b68, 0xa666, 0x5b63, 0xa662, 0x5b5f, 0xa65d, 0x5b5b, 0xa659, - 0x5b56, 0xa654, 0x5b52, 0xa650, 0x5b4d, 0xa64b, 0x5b49, 0xa647, - 0x5b45, 0xa642, 0x5b40, 0xa63e, 0x5b3c, 0xa639, 0x5b37, 0xa635, - 0x5b33, 0xa630, 0x5b2f, 0xa62c, 0x5b2a, 0xa627, 0x5b26, 0xa623, - 0x5b21, 0xa61f, 0x5b1d, 0xa61a, 0x5b19, 0xa616, 0x5b14, 0xa611, - 0x5b10, 0xa60d, 0x5b0b, 0xa608, 0x5b07, 0xa604, 0x5b02, 0xa5ff, - 0x5afe, 0xa5fb, 0x5afa, 0xa5f6, 0x5af5, 0xa5f2, 0x5af1, 0xa5ed, - 0x5aec, 0xa5e9, 0x5ae8, 0xa5e4, 0x5ae4, 0xa5e0, 0x5adf, 0xa5dc, - 0x5adb, 0xa5d7, 0x5ad6, 0xa5d3, 0x5ad2, 0xa5ce, 0x5acd, 0xa5ca, - 0x5ac9, 0xa5c5, 0x5ac5, 0xa5c1, 0x5ac0, 0xa5bc, 0x5abc, 0xa5b8, - 0x5ab7, 0xa5b3, 0x5ab3, 0xa5af, 0x5aae, 0xa5aa, 0x5aaa, 0xa5a6, - 0x5aa5, 0xa5a2, 0x5aa1, 0xa59d, 0x5a9d, 0xa599, 0x5a98, 0xa594, - 0x5a94, 0xa590, 0x5a8f, 0xa58b, 0x5a8b, 0xa587, 0x5a86, 0xa582, - 0x5a82, 0xa57e, 0x5a7e, 0xa57a, 0x5a79, 0xa575, 0x5a75, 0xa571, - 0x5a70, 0xa56c, 0x5a6c, 0xa568, 0x5a67, 0xa563, 0x5a63, 0xa55f, - 0x5a5e, 0xa55b, 0x5a5a, 0xa556, 0x5a56, 0xa552, 0x5a51, 0xa54d, - 0x5a4d, 0xa549, 0x5a48, 0xa544, 0x5a44, 0xa540, 0x5a3f, 0xa53b, - 0x5a3b, 0xa537, 0x5a36, 0xa533, 0x5a32, 0xa52e, 0x5a2d, 0xa52a, - 0x5a29, 0xa525, 0x5a24, 0xa521, 0x5a20, 0xa51c, 0x5a1c, 0xa518, - 0x5a17, 0xa514, 0x5a13, 0xa50f, 0x5a0e, 0xa50b, 0x5a0a, 0xa506, - 0x5a05, 0xa502, 0x5a01, 0xa4fe, 0x59fc, 0xa4f9, 0x59f8, 0xa4f5, - 0x59f3, 0xa4f0, 0x59ef, 0xa4ec, 0x59ea, 0xa4e7, 0x59e6, 0xa4e3, - 0x59e1, 0xa4df, 0x59dd, 0xa4da, 0x59d9, 0xa4d6, 0x59d4, 0xa4d1, - 0x59d0, 0xa4cd, 0x59cb, 0xa4c9, 0x59c7, 0xa4c4, 0x59c2, 0xa4c0, - 0x59be, 0xa4bb, 0x59b9, 0xa4b7, 0x59b5, 0xa4b3, 0x59b0, 0xa4ae, - 0x59ac, 0xa4aa, 0x59a7, 0xa4a5, 0x59a3, 0xa4a1, 0x599e, 0xa49d, - 0x599a, 0xa498, 0x5995, 0xa494, 0x5991, 0xa48f, 0x598c, 0xa48b, - 0x5988, 0xa487, 0x5983, 0xa482, 0x597f, 0xa47e, 0x597a, 0xa479, - 0x5976, 0xa475, 0x5971, 0xa471, 0x596d, 0xa46c, 0x5968, 0xa468, - 0x5964, 0xa463, 0x595f, 0xa45f, 0x595b, 0xa45b, 0x5956, 0xa456, - 0x5952, 0xa452, 0x594d, 0xa44e, 0x5949, 0xa449, 0x5944, 0xa445, - 0x5940, 0xa440, 0x593b, 0xa43c, 0x5937, 0xa438, 0x5932, 0xa433, - 0x592e, 0xa42f, 0x5929, 0xa42a, 0x5925, 0xa426, 0x5920, 0xa422, - 0x591c, 0xa41d, 0x5917, 0xa419, 0x5913, 0xa415, 0x590e, 0xa410, - 0x590a, 0xa40c, 0x5905, 0xa407, 0x5901, 0xa403, 0x58fc, 0xa3ff, - 0x58f8, 0xa3fa, 0x58f3, 0xa3f6, 0x58ef, 0xa3f2, 0x58ea, 0xa3ed, - 0x58e6, 0xa3e9, 0x58e1, 0xa3e5, 0x58dd, 0xa3e0, 0x58d8, 0xa3dc, - 0x58d4, 0xa3d7, 0x58cf, 0xa3d3, 0x58cb, 0xa3cf, 0x58c6, 0xa3ca, - 0x58c1, 0xa3c6, 0x58bd, 0xa3c2, 0x58b8, 0xa3bd, 0x58b4, 0xa3b9, - 0x58af, 0xa3b5, 0x58ab, 0xa3b0, 0x58a6, 0xa3ac, 0x58a2, 0xa3a8, - 0x589d, 0xa3a3, 0x5899, 0xa39f, 0x5894, 0xa39a, 0x5890, 0xa396, - 0x588b, 0xa392, 0x5887, 0xa38d, 0x5882, 0xa389, 0x587d, 0xa385, - 0x5879, 0xa380, 0x5874, 0xa37c, 0x5870, 0xa378, 0x586b, 0xa373, - 0x5867, 0xa36f, 0x5862, 0xa36b, 0x585e, 0xa366, 0x5859, 0xa362, - 0x5855, 0xa35e, 0x5850, 0xa359, 0x584b, 0xa355, 0x5847, 0xa351, - 0x5842, 0xa34c, 0x583e, 0xa348, 0x5839, 0xa344, 0x5835, 0xa33f, - 0x5830, 0xa33b, 0x582c, 0xa337, 0x5827, 0xa332, 0x5822, 0xa32e, - 0x581e, 0xa32a, 0x5819, 0xa325, 0x5815, 0xa321, 0x5810, 0xa31d, - 0x580c, 0xa318, 0x5807, 0xa314, 0x5803, 0xa310, 0x57fe, 0xa30b, - 0x57f9, 0xa307, 0x57f5, 0xa303, 0x57f0, 0xa2ff, 0x57ec, 0xa2fa, - 0x57e7, 0xa2f6, 0x57e3, 0xa2f2, 0x57de, 0xa2ed, 0x57d9, 0xa2e9, - 0x57d5, 0xa2e5, 0x57d0, 0xa2e0, 0x57cc, 0xa2dc, 0x57c7, 0xa2d8, - 0x57c3, 0xa2d3, 0x57be, 0xa2cf, 0x57b9, 0xa2cb, 0x57b5, 0xa2c6, - 0x57b0, 0xa2c2, 0x57ac, 0xa2be, 0x57a7, 0xa2ba, 0x57a3, 0xa2b5, - 0x579e, 0xa2b1, 0x5799, 0xa2ad, 0x5795, 0xa2a8, 0x5790, 0xa2a4, - 0x578c, 0xa2a0, 0x5787, 0xa29b, 0x5783, 0xa297, 0x577e, 0xa293, - 0x5779, 0xa28f, 0x5775, 0xa28a, 0x5770, 0xa286, 0x576c, 0xa282, - 0x5767, 0xa27d, 0x5762, 0xa279, 0x575e, 0xa275, 0x5759, 0xa271, - 0x5755, 0xa26c, 0x5750, 0xa268, 0x574b, 0xa264, 0x5747, 0xa25f, - 0x5742, 0xa25b, 0x573e, 0xa257, 0x5739, 0xa253, 0x5734, 0xa24e, - 0x5730, 0xa24a, 0x572b, 0xa246, 0x5727, 0xa241, 0x5722, 0xa23d, - 0x571d, 0xa239, 0x5719, 0xa235, 0x5714, 0xa230, 0x5710, 0xa22c, - 0x570b, 0xa228, 0x5706, 0xa224, 0x5702, 0xa21f, 0x56fd, 0xa21b, - 0x56f9, 0xa217, 0x56f4, 0xa212, 0x56ef, 0xa20e, 0x56eb, 0xa20a, - 0x56e6, 0xa206, 0x56e2, 0xa201, 0x56dd, 0xa1fd, 0x56d8, 0xa1f9, - 0x56d4, 0xa1f5, 0x56cf, 0xa1f0, 0x56ca, 0xa1ec, 0x56c6, 0xa1e8, - 0x56c1, 0xa1e4, 0x56bd, 0xa1df, 0x56b8, 0xa1db, 0x56b3, 0xa1d7, - 0x56af, 0xa1d3, 0x56aa, 0xa1ce, 0x56a5, 0xa1ca, 0x56a1, 0xa1c6, - 0x569c, 0xa1c1, 0x5698, 0xa1bd, 0x5693, 0xa1b9, 0x568e, 0xa1b5, - 0x568a, 0xa1b0, 0x5685, 0xa1ac, 0x5680, 0xa1a8, 0x567c, 0xa1a4, - 0x5677, 0xa1a0, 0x5673, 0xa19b, 0x566e, 0xa197, 0x5669, 0xa193, - 0x5665, 0xa18f, 0x5660, 0xa18a, 0x565b, 0xa186, 0x5657, 0xa182, - 0x5652, 0xa17e, 0x564d, 0xa179, 0x5649, 0xa175, 0x5644, 0xa171, - 0x5640, 0xa16d, 0x563b, 0xa168, 0x5636, 0xa164, 0x5632, 0xa160, - 0x562d, 0xa15c, 0x5628, 0xa157, 0x5624, 0xa153, 0x561f, 0xa14f, - 0x561a, 0xa14b, 0x5616, 0xa147, 0x5611, 0xa142, 0x560c, 0xa13e, - 0x5608, 0xa13a, 0x5603, 0xa136, 0x55fe, 0xa131, 0x55fa, 0xa12d, - 0x55f5, 0xa129, 0x55f0, 0xa125, 0x55ec, 0xa121, 0x55e7, 0xa11c, - 0x55e3, 0xa118, 0x55de, 0xa114, 0x55d9, 0xa110, 0x55d5, 0xa10b, - 0x55d0, 0xa107, 0x55cb, 0xa103, 0x55c7, 0xa0ff, 0x55c2, 0xa0fb, - 0x55bd, 0xa0f6, 0x55b9, 0xa0f2, 0x55b4, 0xa0ee, 0x55af, 0xa0ea, - 0x55ab, 0xa0e6, 0x55a6, 0xa0e1, 0x55a1, 0xa0dd, 0x559d, 0xa0d9, - 0x5598, 0xa0d5, 0x5593, 0xa0d1, 0x558f, 0xa0cc, 0x558a, 0xa0c8, - 0x5585, 0xa0c4, 0x5581, 0xa0c0, 0x557c, 0xa0bc, 0x5577, 0xa0b7, - 0x5572, 0xa0b3, 0x556e, 0xa0af, 0x5569, 0xa0ab, 0x5564, 0xa0a7, - 0x5560, 0xa0a2, 0x555b, 0xa09e, 0x5556, 0xa09a, 0x5552, 0xa096, - 0x554d, 0xa092, 0x5548, 0xa08e, 0x5544, 0xa089, 0x553f, 0xa085, - 0x553a, 0xa081, 0x5536, 0xa07d, 0x5531, 0xa079, 0x552c, 0xa074, - 0x5528, 0xa070, 0x5523, 0xa06c, 0x551e, 0xa068, 0x5519, 0xa064, - 0x5515, 0xa060, 0x5510, 0xa05b, 0x550b, 0xa057, 0x5507, 0xa053, - 0x5502, 0xa04f, 0x54fd, 0xa04b, 0x54f9, 0xa046, 0x54f4, 0xa042, - 0x54ef, 0xa03e, 0x54ea, 0xa03a, 0x54e6, 0xa036, 0x54e1, 0xa032, - 0x54dc, 0xa02d, 0x54d8, 0xa029, 0x54d3, 0xa025, 0x54ce, 0xa021, - 0x54ca, 0xa01d, 0x54c5, 0xa019, 0x54c0, 0xa014, 0x54bb, 0xa010, - 0x54b7, 0xa00c, 0x54b2, 0xa008, 0x54ad, 0xa004, 0x54a9, 0xa000, - 0x54a4, 0x9ffc, 0x549f, 0x9ff7, 0x549a, 0x9ff3, 0x5496, 0x9fef, - 0x5491, 0x9feb, 0x548c, 0x9fe7, 0x5488, 0x9fe3, 0x5483, 0x9fde, - 0x547e, 0x9fda, 0x5479, 0x9fd6, 0x5475, 0x9fd2, 0x5470, 0x9fce, - 0x546b, 0x9fca, 0x5467, 0x9fc6, 0x5462, 0x9fc1, 0x545d, 0x9fbd, - 0x5458, 0x9fb9, 0x5454, 0x9fb5, 0x544f, 0x9fb1, 0x544a, 0x9fad, - 0x5445, 0x9fa9, 0x5441, 0x9fa4, 0x543c, 0x9fa0, 0x5437, 0x9f9c, - 0x5433, 0x9f98, 0x542e, 0x9f94, 0x5429, 0x9f90, 0x5424, 0x9f8c, - 0x5420, 0x9f88, 0x541b, 0x9f83, 0x5416, 0x9f7f, 0x5411, 0x9f7b, - 0x540d, 0x9f77, 0x5408, 0x9f73, 0x5403, 0x9f6f, 0x53fe, 0x9f6b, - 0x53fa, 0x9f67, 0x53f5, 0x9f62, 0x53f0, 0x9f5e, 0x53eb, 0x9f5a, - 0x53e7, 0x9f56, 0x53e2, 0x9f52, 0x53dd, 0x9f4e, 0x53d8, 0x9f4a, - 0x53d4, 0x9f46, 0x53cf, 0x9f41, 0x53ca, 0x9f3d, 0x53c5, 0x9f39, - 0x53c1, 0x9f35, 0x53bc, 0x9f31, 0x53b7, 0x9f2d, 0x53b2, 0x9f29, - 0x53ae, 0x9f25, 0x53a9, 0x9f21, 0x53a4, 0x9f1c, 0x539f, 0x9f18, - 0x539b, 0x9f14, 0x5396, 0x9f10, 0x5391, 0x9f0c, 0x538c, 0x9f08, - 0x5388, 0x9f04, 0x5383, 0x9f00, 0x537e, 0x9efc, 0x5379, 0x9ef8, - 0x5375, 0x9ef3, 0x5370, 0x9eef, 0x536b, 0x9eeb, 0x5366, 0x9ee7, - 0x5362, 0x9ee3, 0x535d, 0x9edf, 0x5358, 0x9edb, 0x5353, 0x9ed7, - 0x534e, 0x9ed3, 0x534a, 0x9ecf, 0x5345, 0x9ecb, 0x5340, 0x9ec6, - 0x533b, 0x9ec2, 0x5337, 0x9ebe, 0x5332, 0x9eba, 0x532d, 0x9eb6, - 0x5328, 0x9eb2, 0x5323, 0x9eae, 0x531f, 0x9eaa, 0x531a, 0x9ea6, - 0x5315, 0x9ea2, 0x5310, 0x9e9e, 0x530c, 0x9e9a, 0x5307, 0x9e95, - 0x5302, 0x9e91, 0x52fd, 0x9e8d, 0x52f8, 0x9e89, 0x52f4, 0x9e85, - 0x52ef, 0x9e81, 0x52ea, 0x9e7d, 0x52e5, 0x9e79, 0x52e1, 0x9e75, - 0x52dc, 0x9e71, 0x52d7, 0x9e6d, 0x52d2, 0x9e69, 0x52cd, 0x9e65, - 0x52c9, 0x9e61, 0x52c4, 0x9e5d, 0x52bf, 0x9e58, 0x52ba, 0x9e54, - 0x52b5, 0x9e50, 0x52b1, 0x9e4c, 0x52ac, 0x9e48, 0x52a7, 0x9e44, - 0x52a2, 0x9e40, 0x529d, 0x9e3c, 0x5299, 0x9e38, 0x5294, 0x9e34, - 0x528f, 0x9e30, 0x528a, 0x9e2c, 0x5285, 0x9e28, 0x5281, 0x9e24, - 0x527c, 0x9e20, 0x5277, 0x9e1c, 0x5272, 0x9e18, 0x526d, 0x9e14, - 0x5269, 0x9e0f, 0x5264, 0x9e0b, 0x525f, 0x9e07, 0x525a, 0x9e03, - 0x5255, 0x9dff, 0x5251, 0x9dfb, 0x524c, 0x9df7, 0x5247, 0x9df3, - 0x5242, 0x9def, 0x523d, 0x9deb, 0x5238, 0x9de7, 0x5234, 0x9de3, - 0x522f, 0x9ddf, 0x522a, 0x9ddb, 0x5225, 0x9dd7, 0x5220, 0x9dd3, - 0x521c, 0x9dcf, 0x5217, 0x9dcb, 0x5212, 0x9dc7, 0x520d, 0x9dc3, - 0x5208, 0x9dbf, 0x5203, 0x9dbb, 0x51ff, 0x9db7, 0x51fa, 0x9db3, - 0x51f5, 0x9daf, 0x51f0, 0x9dab, 0x51eb, 0x9da7, 0x51e6, 0x9da3, - 0x51e2, 0x9d9f, 0x51dd, 0x9d9b, 0x51d8, 0x9d97, 0x51d3, 0x9d93, - 0x51ce, 0x9d8f, 0x51c9, 0x9d8b, 0x51c5, 0x9d86, 0x51c0, 0x9d82, - 0x51bb, 0x9d7e, 0x51b6, 0x9d7a, 0x51b1, 0x9d76, 0x51ac, 0x9d72, - 0x51a8, 0x9d6e, 0x51a3, 0x9d6a, 0x519e, 0x9d66, 0x5199, 0x9d62, - 0x5194, 0x9d5e, 0x518f, 0x9d5a, 0x518b, 0x9d56, 0x5186, 0x9d52, - 0x5181, 0x9d4e, 0x517c, 0x9d4a, 0x5177, 0x9d46, 0x5172, 0x9d42, - 0x516e, 0x9d3e, 0x5169, 0x9d3a, 0x5164, 0x9d36, 0x515f, 0x9d32, - 0x515a, 0x9d2e, 0x5155, 0x9d2a, 0x5150, 0x9d26, 0x514c, 0x9d22, - 0x5147, 0x9d1e, 0x5142, 0x9d1a, 0x513d, 0x9d16, 0x5138, 0x9d12, - 0x5133, 0x9d0e, 0x512e, 0x9d0b, 0x512a, 0x9d07, 0x5125, 0x9d03, - 0x5120, 0x9cff, 0x511b, 0x9cfb, 0x5116, 0x9cf7, 0x5111, 0x9cf3, - 0x510c, 0x9cef, 0x5108, 0x9ceb, 0x5103, 0x9ce7, 0x50fe, 0x9ce3, - 0x50f9, 0x9cdf, 0x50f4, 0x9cdb, 0x50ef, 0x9cd7, 0x50ea, 0x9cd3, - 0x50e5, 0x9ccf, 0x50e1, 0x9ccb, 0x50dc, 0x9cc7, 0x50d7, 0x9cc3, - 0x50d2, 0x9cbf, 0x50cd, 0x9cbb, 0x50c8, 0x9cb7, 0x50c3, 0x9cb3, - 0x50bf, 0x9caf, 0x50ba, 0x9cab, 0x50b5, 0x9ca7, 0x50b0, 0x9ca3, - 0x50ab, 0x9c9f, 0x50a6, 0x9c9b, 0x50a1, 0x9c97, 0x509c, 0x9c93, - 0x5097, 0x9c8f, 0x5093, 0x9c8b, 0x508e, 0x9c88, 0x5089, 0x9c84, - 0x5084, 0x9c80, 0x507f, 0x9c7c, 0x507a, 0x9c78, 0x5075, 0x9c74, - 0x5070, 0x9c70, 0x506c, 0x9c6c, 0x5067, 0x9c68, 0x5062, 0x9c64, - 0x505d, 0x9c60, 0x5058, 0x9c5c, 0x5053, 0x9c58, 0x504e, 0x9c54, - 0x5049, 0x9c50, 0x5044, 0x9c4c, 0x503f, 0x9c48, 0x503b, 0x9c44, - 0x5036, 0x9c40, 0x5031, 0x9c3d, 0x502c, 0x9c39, 0x5027, 0x9c35, - 0x5022, 0x9c31, 0x501d, 0x9c2d, 0x5018, 0x9c29, 0x5013, 0x9c25, - 0x500f, 0x9c21, 0x500a, 0x9c1d, 0x5005, 0x9c19, 0x5000, 0x9c15, - 0x4ffb, 0x9c11, 0x4ff6, 0x9c0d, 0x4ff1, 0x9c09, 0x4fec, 0x9c06, - 0x4fe7, 0x9c02, 0x4fe2, 0x9bfe, 0x4fdd, 0x9bfa, 0x4fd9, 0x9bf6, - 0x4fd4, 0x9bf2, 0x4fcf, 0x9bee, 0x4fca, 0x9bea, 0x4fc5, 0x9be6, - 0x4fc0, 0x9be2, 0x4fbb, 0x9bde, 0x4fb6, 0x9bda, 0x4fb1, 0x9bd7, - 0x4fac, 0x9bd3, 0x4fa7, 0x9bcf, 0x4fa2, 0x9bcb, 0x4f9e, 0x9bc7, - 0x4f99, 0x9bc3, 0x4f94, 0x9bbf, 0x4f8f, 0x9bbb, 0x4f8a, 0x9bb7, - 0x4f85, 0x9bb3, 0x4f80, 0x9baf, 0x4f7b, 0x9bac, 0x4f76, 0x9ba8, - 0x4f71, 0x9ba4, 0x4f6c, 0x9ba0, 0x4f67, 0x9b9c, 0x4f62, 0x9b98, - 0x4f5e, 0x9b94, 0x4f59, 0x9b90, 0x4f54, 0x9b8c, 0x4f4f, 0x9b88, - 0x4f4a, 0x9b85, 0x4f45, 0x9b81, 0x4f40, 0x9b7d, 0x4f3b, 0x9b79, - 0x4f36, 0x9b75, 0x4f31, 0x9b71, 0x4f2c, 0x9b6d, 0x4f27, 0x9b69, - 0x4f22, 0x9b65, 0x4f1d, 0x9b62, 0x4f18, 0x9b5e, 0x4f14, 0x9b5a, - 0x4f0f, 0x9b56, 0x4f0a, 0x9b52, 0x4f05, 0x9b4e, 0x4f00, 0x9b4a, - 0x4efb, 0x9b46, 0x4ef6, 0x9b43, 0x4ef1, 0x9b3f, 0x4eec, 0x9b3b, - 0x4ee7, 0x9b37, 0x4ee2, 0x9b33, 0x4edd, 0x9b2f, 0x4ed8, 0x9b2b, - 0x4ed3, 0x9b27, 0x4ece, 0x9b24, 0x4ec9, 0x9b20, 0x4ec4, 0x9b1c, - 0x4ebf, 0x9b18, 0x4eba, 0x9b14, 0x4eb6, 0x9b10, 0x4eb1, 0x9b0c, - 0x4eac, 0x9b09, 0x4ea7, 0x9b05, 0x4ea2, 0x9b01, 0x4e9d, 0x9afd, - 0x4e98, 0x9af9, 0x4e93, 0x9af5, 0x4e8e, 0x9af1, 0x4e89, 0x9aed, - 0x4e84, 0x9aea, 0x4e7f, 0x9ae6, 0x4e7a, 0x9ae2, 0x4e75, 0x9ade, - 0x4e70, 0x9ada, 0x4e6b, 0x9ad6, 0x4e66, 0x9ad3, 0x4e61, 0x9acf, - 0x4e5c, 0x9acb, 0x4e57, 0x9ac7, 0x4e52, 0x9ac3, 0x4e4d, 0x9abf, - 0x4e48, 0x9abb, 0x4e43, 0x9ab8, 0x4e3e, 0x9ab4, 0x4e39, 0x9ab0, - 0x4e34, 0x9aac, 0x4e2f, 0x9aa8, 0x4e2a, 0x9aa4, 0x4e26, 0x9aa1, - 0x4e21, 0x9a9d, 0x4e1c, 0x9a99, 0x4e17, 0x9a95, 0x4e12, 0x9a91, - 0x4e0d, 0x9a8d, 0x4e08, 0x9a8a, 0x4e03, 0x9a86, 0x4dfe, 0x9a82, - 0x4df9, 0x9a7e, 0x4df4, 0x9a7a, 0x4def, 0x9a76, 0x4dea, 0x9a73, - 0x4de5, 0x9a6f, 0x4de0, 0x9a6b, 0x4ddb, 0x9a67, 0x4dd6, 0x9a63, - 0x4dd1, 0x9a60, 0x4dcc, 0x9a5c, 0x4dc7, 0x9a58, 0x4dc2, 0x9a54, - 0x4dbd, 0x9a50, 0x4db8, 0x9a4c, 0x4db3, 0x9a49, 0x4dae, 0x9a45, - 0x4da9, 0x9a41, 0x4da4, 0x9a3d, 0x4d9f, 0x9a39, 0x4d9a, 0x9a36, - 0x4d95, 0x9a32, 0x4d90, 0x9a2e, 0x4d8b, 0x9a2a, 0x4d86, 0x9a26, - 0x4d81, 0x9a23, 0x4d7c, 0x9a1f, 0x4d77, 0x9a1b, 0x4d72, 0x9a17, - 0x4d6d, 0x9a13, 0x4d68, 0x9a10, 0x4d63, 0x9a0c, 0x4d5e, 0x9a08, - 0x4d59, 0x9a04, 0x4d54, 0x9a00, 0x4d4f, 0x99fd, 0x4d4a, 0x99f9, - 0x4d45, 0x99f5, 0x4d40, 0x99f1, 0x4d3b, 0x99ed, 0x4d36, 0x99ea, - 0x4d31, 0x99e6, 0x4d2c, 0x99e2, 0x4d27, 0x99de, 0x4d22, 0x99da, - 0x4d1d, 0x99d7, 0x4d18, 0x99d3, 0x4d13, 0x99cf, 0x4d0e, 0x99cb, - 0x4d09, 0x99c7, 0x4d04, 0x99c4, 0x4cff, 0x99c0, 0x4cfa, 0x99bc, - 0x4cf5, 0x99b8, 0x4cf0, 0x99b5, 0x4ceb, 0x99b1, 0x4ce6, 0x99ad, - 0x4ce1, 0x99a9, 0x4cdb, 0x99a5, 0x4cd6, 0x99a2, 0x4cd1, 0x999e, - 0x4ccc, 0x999a, 0x4cc7, 0x9996, 0x4cc2, 0x9993, 0x4cbd, 0x998f, - 0x4cb8, 0x998b, 0x4cb3, 0x9987, 0x4cae, 0x9984, 0x4ca9, 0x9980, - 0x4ca4, 0x997c, 0x4c9f, 0x9978, 0x4c9a, 0x9975, 0x4c95, 0x9971, - 0x4c90, 0x996d, 0x4c8b, 0x9969, 0x4c86, 0x9965, 0x4c81, 0x9962, - 0x4c7c, 0x995e, 0x4c77, 0x995a, 0x4c72, 0x9956, 0x4c6d, 0x9953, - 0x4c68, 0x994f, 0x4c63, 0x994b, 0x4c5e, 0x9947, 0x4c59, 0x9944, - 0x4c54, 0x9940, 0x4c4f, 0x993c, 0x4c49, 0x9938, 0x4c44, 0x9935, - 0x4c3f, 0x9931, 0x4c3a, 0x992d, 0x4c35, 0x992a, 0x4c30, 0x9926, - 0x4c2b, 0x9922, 0x4c26, 0x991e, 0x4c21, 0x991b, 0x4c1c, 0x9917, - 0x4c17, 0x9913, 0x4c12, 0x990f, 0x4c0d, 0x990c, 0x4c08, 0x9908, - 0x4c03, 0x9904, 0x4bfe, 0x9900, 0x4bf9, 0x98fd, 0x4bf4, 0x98f9, - 0x4bef, 0x98f5, 0x4be9, 0x98f2, 0x4be4, 0x98ee, 0x4bdf, 0x98ea, - 0x4bda, 0x98e6, 0x4bd5, 0x98e3, 0x4bd0, 0x98df, 0x4bcb, 0x98db, - 0x4bc6, 0x98d7, 0x4bc1, 0x98d4, 0x4bbc, 0x98d0, 0x4bb7, 0x98cc, - 0x4bb2, 0x98c9, 0x4bad, 0x98c5, 0x4ba8, 0x98c1, 0x4ba3, 0x98bd, - 0x4b9e, 0x98ba, 0x4b98, 0x98b6, 0x4b93, 0x98b2, 0x4b8e, 0x98af, - 0x4b89, 0x98ab, 0x4b84, 0x98a7, 0x4b7f, 0x98a3, 0x4b7a, 0x98a0, - 0x4b75, 0x989c, 0x4b70, 0x9898, 0x4b6b, 0x9895, 0x4b66, 0x9891, - 0x4b61, 0x988d, 0x4b5c, 0x988a, 0x4b56, 0x9886, 0x4b51, 0x9882, - 0x4b4c, 0x987e, 0x4b47, 0x987b, 0x4b42, 0x9877, 0x4b3d, 0x9873, - 0x4b38, 0x9870, 0x4b33, 0x986c, 0x4b2e, 0x9868, 0x4b29, 0x9865, - 0x4b24, 0x9861, 0x4b1f, 0x985d, 0x4b19, 0x985a, 0x4b14, 0x9856, - 0x4b0f, 0x9852, 0x4b0a, 0x984e, 0x4b05, 0x984b, 0x4b00, 0x9847, - 0x4afb, 0x9843, 0x4af6, 0x9840, 0x4af1, 0x983c, 0x4aec, 0x9838, - 0x4ae7, 0x9835, 0x4ae1, 0x9831, 0x4adc, 0x982d, 0x4ad7, 0x982a, - 0x4ad2, 0x9826, 0x4acd, 0x9822, 0x4ac8, 0x981f, 0x4ac3, 0x981b, - 0x4abe, 0x9817, 0x4ab9, 0x9814, 0x4ab4, 0x9810, 0x4aae, 0x980c, - 0x4aa9, 0x9809, 0x4aa4, 0x9805, 0x4a9f, 0x9801, 0x4a9a, 0x97fe, - 0x4a95, 0x97fa, 0x4a90, 0x97f6, 0x4a8b, 0x97f3, 0x4a86, 0x97ef, - 0x4a81, 0x97eb, 0x4a7b, 0x97e8, 0x4a76, 0x97e4, 0x4a71, 0x97e0, - 0x4a6c, 0x97dd, 0x4a67, 0x97d9, 0x4a62, 0x97d5, 0x4a5d, 0x97d2, - 0x4a58, 0x97ce, 0x4a52, 0x97cb, 0x4a4d, 0x97c7, 0x4a48, 0x97c3, - 0x4a43, 0x97c0, 0x4a3e, 0x97bc, 0x4a39, 0x97b8, 0x4a34, 0x97b5, - 0x4a2f, 0x97b1, 0x4a2a, 0x97ad, 0x4a24, 0x97aa, 0x4a1f, 0x97a6, - 0x4a1a, 0x97a2, 0x4a15, 0x979f, 0x4a10, 0x979b, 0x4a0b, 0x9798, - 0x4a06, 0x9794, 0x4a01, 0x9790, 0x49fb, 0x978d, 0x49f6, 0x9789, - 0x49f1, 0x9785, 0x49ec, 0x9782, 0x49e7, 0x977e, 0x49e2, 0x977a, - 0x49dd, 0x9777, 0x49d8, 0x9773, 0x49d2, 0x9770, 0x49cd, 0x976c, - 0x49c8, 0x9768, 0x49c3, 0x9765, 0x49be, 0x9761, 0x49b9, 0x975d, - 0x49b4, 0x975a, 0x49ae, 0x9756, 0x49a9, 0x9753, 0x49a4, 0x974f, - 0x499f, 0x974b, 0x499a, 0x9748, 0x4995, 0x9744, 0x4990, 0x9741, - 0x498a, 0x973d, 0x4985, 0x9739, 0x4980, 0x9736, 0x497b, 0x9732, - 0x4976, 0x972f, 0x4971, 0x972b, 0x496c, 0x9727, 0x4966, 0x9724, - 0x4961, 0x9720, 0x495c, 0x971d, 0x4957, 0x9719, 0x4952, 0x9715, - 0x494d, 0x9712, 0x4948, 0x970e, 0x4942, 0x970b, 0x493d, 0x9707, - 0x4938, 0x9703, 0x4933, 0x9700, 0x492e, 0x96fc, 0x4929, 0x96f9, - 0x4923, 0x96f5, 0x491e, 0x96f1, 0x4919, 0x96ee, 0x4914, 0x96ea, - 0x490f, 0x96e7, 0x490a, 0x96e3, 0x4905, 0x96df, 0x48ff, 0x96dc, - 0x48fa, 0x96d8, 0x48f5, 0x96d5, 0x48f0, 0x96d1, 0x48eb, 0x96ce, - 0x48e6, 0x96ca, 0x48e0, 0x96c6, 0x48db, 0x96c3, 0x48d6, 0x96bf, - 0x48d1, 0x96bc, 0x48cc, 0x96b8, 0x48c7, 0x96b5, 0x48c1, 0x96b1, - 0x48bc, 0x96ad, 0x48b7, 0x96aa, 0x48b2, 0x96a6, 0x48ad, 0x96a3, - 0x48a8, 0x969f, 0x48a2, 0x969c, 0x489d, 0x9698, 0x4898, 0x9694, - 0x4893, 0x9691, 0x488e, 0x968d, 0x4888, 0x968a, 0x4883, 0x9686, - 0x487e, 0x9683, 0x4879, 0x967f, 0x4874, 0x967b, 0x486f, 0x9678, - 0x4869, 0x9674, 0x4864, 0x9671, 0x485f, 0x966d, 0x485a, 0x966a, - 0x4855, 0x9666, 0x484f, 0x9663, 0x484a, 0x965f, 0x4845, 0x965b, - 0x4840, 0x9658, 0x483b, 0x9654, 0x4836, 0x9651, 0x4830, 0x964d, - 0x482b, 0x964a, 0x4826, 0x9646, 0x4821, 0x9643, 0x481c, 0x963f, - 0x4816, 0x963c, 0x4811, 0x9638, 0x480c, 0x9635, 0x4807, 0x9631, - 0x4802, 0x962d, 0x47fc, 0x962a, 0x47f7, 0x9626, 0x47f2, 0x9623, - 0x47ed, 0x961f, 0x47e8, 0x961c, 0x47e2, 0x9618, 0x47dd, 0x9615, - 0x47d8, 0x9611, 0x47d3, 0x960e, 0x47ce, 0x960a, 0x47c8, 0x9607, - 0x47c3, 0x9603, 0x47be, 0x9600, 0x47b9, 0x95fc, 0x47b4, 0x95f9, - 0x47ae, 0x95f5, 0x47a9, 0x95f2, 0x47a4, 0x95ee, 0x479f, 0x95ea, - 0x479a, 0x95e7, 0x4794, 0x95e3, 0x478f, 0x95e0, 0x478a, 0x95dc, - 0x4785, 0x95d9, 0x4780, 0x95d5, 0x477a, 0x95d2, 0x4775, 0x95ce, - 0x4770, 0x95cb, 0x476b, 0x95c7, 0x4765, 0x95c4, 0x4760, 0x95c0, - 0x475b, 0x95bd, 0x4756, 0x95b9, 0x4751, 0x95b6, 0x474b, 0x95b2, - 0x4746, 0x95af, 0x4741, 0x95ab, 0x473c, 0x95a8, 0x4737, 0x95a4, - 0x4731, 0x95a1, 0x472c, 0x959d, 0x4727, 0x959a, 0x4722, 0x9596, - 0x471c, 0x9593, 0x4717, 0x958f, 0x4712, 0x958c, 0x470d, 0x9588, - 0x4708, 0x9585, 0x4702, 0x9581, 0x46fd, 0x957e, 0x46f8, 0x957a, - 0x46f3, 0x9577, 0x46ed, 0x9574, 0x46e8, 0x9570, 0x46e3, 0x956d, - 0x46de, 0x9569, 0x46d8, 0x9566, 0x46d3, 0x9562, 0x46ce, 0x955f, - 0x46c9, 0x955b, 0x46c4, 0x9558, 0x46be, 0x9554, 0x46b9, 0x9551, - 0x46b4, 0x954d, 0x46af, 0x954a, 0x46a9, 0x9546, 0x46a4, 0x9543, - 0x469f, 0x953f, 0x469a, 0x953c, 0x4694, 0x9538, 0x468f, 0x9535, - 0x468a, 0x9532, 0x4685, 0x952e, 0x467f, 0x952b, 0x467a, 0x9527, - 0x4675, 0x9524, 0x4670, 0x9520, 0x466a, 0x951d, 0x4665, 0x9519, - 0x4660, 0x9516, 0x465b, 0x9512, 0x4655, 0x950f, 0x4650, 0x950c, - 0x464b, 0x9508, 0x4646, 0x9505, 0x4640, 0x9501, 0x463b, 0x94fe, - 0x4636, 0x94fa, 0x4631, 0x94f7, 0x462b, 0x94f3, 0x4626, 0x94f0, - 0x4621, 0x94ed, 0x461c, 0x94e9, 0x4616, 0x94e6, 0x4611, 0x94e2, - 0x460c, 0x94df, 0x4607, 0x94db, 0x4601, 0x94d8, 0x45fc, 0x94d4, - 0x45f7, 0x94d1, 0x45f2, 0x94ce, 0x45ec, 0x94ca, 0x45e7, 0x94c7, - 0x45e2, 0x94c3, 0x45dd, 0x94c0, 0x45d7, 0x94bc, 0x45d2, 0x94b9, - 0x45cd, 0x94b6, 0x45c7, 0x94b2, 0x45c2, 0x94af, 0x45bd, 0x94ab, - 0x45b8, 0x94a8, 0x45b2, 0x94a4, 0x45ad, 0x94a1, 0x45a8, 0x949e, - 0x45a3, 0x949a, 0x459d, 0x9497, 0x4598, 0x9493, 0x4593, 0x9490, - 0x458d, 0x948d, 0x4588, 0x9489, 0x4583, 0x9486, 0x457e, 0x9482, - 0x4578, 0x947f, 0x4573, 0x947b, 0x456e, 0x9478, 0x4569, 0x9475, - 0x4563, 0x9471, 0x455e, 0x946e, 0x4559, 0x946a, 0x4553, 0x9467, - 0x454e, 0x9464, 0x4549, 0x9460, 0x4544, 0x945d, 0x453e, 0x9459, - 0x4539, 0x9456, 0x4534, 0x9453, 0x452e, 0x944f, 0x4529, 0x944c, - 0x4524, 0x9448, 0x451f, 0x9445, 0x4519, 0x9442, 0x4514, 0x943e, - 0x450f, 0x943b, 0x4509, 0x9437, 0x4504, 0x9434, 0x44ff, 0x9431, - 0x44fa, 0x942d, 0x44f4, 0x942a, 0x44ef, 0x9427, 0x44ea, 0x9423, - 0x44e4, 0x9420, 0x44df, 0x941c, 0x44da, 0x9419, 0x44d4, 0x9416, - 0x44cf, 0x9412, 0x44ca, 0x940f, 0x44c5, 0x940b, 0x44bf, 0x9408, - 0x44ba, 0x9405, 0x44b5, 0x9401, 0x44af, 0x93fe, 0x44aa, 0x93fb, - 0x44a5, 0x93f7, 0x449f, 0x93f4, 0x449a, 0x93f1, 0x4495, 0x93ed, - 0x4490, 0x93ea, 0x448a, 0x93e6, 0x4485, 0x93e3, 0x4480, 0x93e0, - 0x447a, 0x93dc, 0x4475, 0x93d9, 0x4470, 0x93d6, 0x446a, 0x93d2, - 0x4465, 0x93cf, 0x4460, 0x93cc, 0x445a, 0x93c8, 0x4455, 0x93c5, - 0x4450, 0x93c1, 0x444b, 0x93be, 0x4445, 0x93bb, 0x4440, 0x93b7, - 0x443b, 0x93b4, 0x4435, 0x93b1, 0x4430, 0x93ad, 0x442b, 0x93aa, - 0x4425, 0x93a7, 0x4420, 0x93a3, 0x441b, 0x93a0, 0x4415, 0x939d, - 0x4410, 0x9399, 0x440b, 0x9396, 0x4405, 0x9393, 0x4400, 0x938f, - 0x43fb, 0x938c, 0x43f5, 0x9389, 0x43f0, 0x9385, 0x43eb, 0x9382, - 0x43e5, 0x937f, 0x43e0, 0x937b, 0x43db, 0x9378, 0x43d5, 0x9375, - 0x43d0, 0x9371, 0x43cb, 0x936e, 0x43c5, 0x936b, 0x43c0, 0x9367, - 0x43bb, 0x9364, 0x43b5, 0x9361, 0x43b0, 0x935d, 0x43ab, 0x935a, - 0x43a5, 0x9357, 0x43a0, 0x9353, 0x439b, 0x9350, 0x4395, 0x934d, - 0x4390, 0x9349, 0x438b, 0x9346, 0x4385, 0x9343, 0x4380, 0x933f, - 0x437b, 0x933c, 0x4375, 0x9339, 0x4370, 0x9336, 0x436b, 0x9332, - 0x4365, 0x932f, 0x4360, 0x932c, 0x435b, 0x9328, 0x4355, 0x9325, - 0x4350, 0x9322, 0x434b, 0x931e, 0x4345, 0x931b, 0x4340, 0x9318, - 0x433b, 0x9314, 0x4335, 0x9311, 0x4330, 0x930e, 0x432b, 0x930b, - 0x4325, 0x9307, 0x4320, 0x9304, 0x431b, 0x9301, 0x4315, 0x92fd, - 0x4310, 0x92fa, 0x430b, 0x92f7, 0x4305, 0x92f4, 0x4300, 0x92f0, - 0x42fa, 0x92ed, 0x42f5, 0x92ea, 0x42f0, 0x92e6, 0x42ea, 0x92e3, - 0x42e5, 0x92e0, 0x42e0, 0x92dd, 0x42da, 0x92d9, 0x42d5, 0x92d6, - 0x42d0, 0x92d3, 0x42ca, 0x92cf, 0x42c5, 0x92cc, 0x42c0, 0x92c9, - 0x42ba, 0x92c6, 0x42b5, 0x92c2, 0x42af, 0x92bf, 0x42aa, 0x92bc, - 0x42a5, 0x92b8, 0x429f, 0x92b5, 0x429a, 0x92b2, 0x4295, 0x92af, - 0x428f, 0x92ab, 0x428a, 0x92a8, 0x4284, 0x92a5, 0x427f, 0x92a2, - 0x427a, 0x929e, 0x4274, 0x929b, 0x426f, 0x9298, 0x426a, 0x9295, - 0x4264, 0x9291, 0x425f, 0x928e, 0x425a, 0x928b, 0x4254, 0x9288, - 0x424f, 0x9284, 0x4249, 0x9281, 0x4244, 0x927e, 0x423f, 0x927b, - 0x4239, 0x9277, 0x4234, 0x9274, 0x422f, 0x9271, 0x4229, 0x926e, - 0x4224, 0x926a, 0x421e, 0x9267, 0x4219, 0x9264, 0x4214, 0x9261, - 0x420e, 0x925d, 0x4209, 0x925a, 0x4203, 0x9257, 0x41fe, 0x9254, - 0x41f9, 0x9250, 0x41f3, 0x924d, 0x41ee, 0x924a, 0x41e9, 0x9247, - 0x41e3, 0x9243, 0x41de, 0x9240, 0x41d8, 0x923d, 0x41d3, 0x923a, - 0x41ce, 0x9236, 0x41c8, 0x9233, 0x41c3, 0x9230, 0x41bd, 0x922d, - 0x41b8, 0x922a, 0x41b3, 0x9226, 0x41ad, 0x9223, 0x41a8, 0x9220, - 0x41a2, 0x921d, 0x419d, 0x9219, 0x4198, 0x9216, 0x4192, 0x9213, - 0x418d, 0x9210, 0x4188, 0x920d, 0x4182, 0x9209, 0x417d, 0x9206, - 0x4177, 0x9203, 0x4172, 0x9200, 0x416d, 0x91fc, 0x4167, 0x91f9, - 0x4162, 0x91f6, 0x415c, 0x91f3, 0x4157, 0x91f0, 0x4152, 0x91ec, - 0x414c, 0x91e9, 0x4147, 0x91e6, 0x4141, 0x91e3, 0x413c, 0x91e0, - 0x4136, 0x91dc, 0x4131, 0x91d9, 0x412c, 0x91d6, 0x4126, 0x91d3, - 0x4121, 0x91d0, 0x411b, 0x91cc, 0x4116, 0x91c9, 0x4111, 0x91c6, - 0x410b, 0x91c3, 0x4106, 0x91c0, 0x4100, 0x91bc, 0x40fb, 0x91b9, - 0x40f6, 0x91b6, 0x40f0, 0x91b3, 0x40eb, 0x91b0, 0x40e5, 0x91ad, - 0x40e0, 0x91a9, 0x40da, 0x91a6, 0x40d5, 0x91a3, 0x40d0, 0x91a0, - 0x40ca, 0x919d, 0x40c5, 0x9199, 0x40bf, 0x9196, 0x40ba, 0x9193, - 0x40b5, 0x9190, 0x40af, 0x918d, 0x40aa, 0x918a, 0x40a4, 0x9186, - 0x409f, 0x9183, 0x4099, 0x9180, 0x4094, 0x917d, 0x408f, 0x917a, - 0x4089, 0x9177, 0x4084, 0x9173, 0x407e, 0x9170, 0x4079, 0x916d, - 0x4073, 0x916a, 0x406e, 0x9167, 0x4069, 0x9164, 0x4063, 0x9160, - 0x405e, 0x915d, 0x4058, 0x915a, 0x4053, 0x9157, 0x404d, 0x9154, - 0x4048, 0x9151, 0x4043, 0x914d, 0x403d, 0x914a, 0x4038, 0x9147, - 0x4032, 0x9144, 0x402d, 0x9141, 0x4027, 0x913e, 0x4022, 0x913a, - 0x401d, 0x9137, 0x4017, 0x9134, 0x4012, 0x9131, 0x400c, 0x912e, - 0x4007, 0x912b, 0x4001, 0x9128, 0x3ffc, 0x9124, 0x3ff6, 0x9121, - 0x3ff1, 0x911e, 0x3fec, 0x911b, 0x3fe6, 0x9118, 0x3fe1, 0x9115, - 0x3fdb, 0x9112, 0x3fd6, 0x910f, 0x3fd0, 0x910b, 0x3fcb, 0x9108, - 0x3fc5, 0x9105, 0x3fc0, 0x9102, 0x3fbb, 0x90ff, 0x3fb5, 0x90fc, - 0x3fb0, 0x90f9, 0x3faa, 0x90f5, 0x3fa5, 0x90f2, 0x3f9f, 0x90ef, - 0x3f9a, 0x90ec, 0x3f94, 0x90e9, 0x3f8f, 0x90e6, 0x3f89, 0x90e3, - 0x3f84, 0x90e0, 0x3f7f, 0x90dd, 0x3f79, 0x90d9, 0x3f74, 0x90d6, - 0x3f6e, 0x90d3, 0x3f69, 0x90d0, 0x3f63, 0x90cd, 0x3f5e, 0x90ca, - 0x3f58, 0x90c7, 0x3f53, 0x90c4, 0x3f4d, 0x90c1, 0x3f48, 0x90bd, - 0x3f43, 0x90ba, 0x3f3d, 0x90b7, 0x3f38, 0x90b4, 0x3f32, 0x90b1, - 0x3f2d, 0x90ae, 0x3f27, 0x90ab, 0x3f22, 0x90a8, 0x3f1c, 0x90a5, - 0x3f17, 0x90a1, 0x3f11, 0x909e, 0x3f0c, 0x909b, 0x3f06, 0x9098, - 0x3f01, 0x9095, 0x3efb, 0x9092, 0x3ef6, 0x908f, 0x3ef1, 0x908c, - 0x3eeb, 0x9089, 0x3ee6, 0x9086, 0x3ee0, 0x9083, 0x3edb, 0x907f, - 0x3ed5, 0x907c, 0x3ed0, 0x9079, 0x3eca, 0x9076, 0x3ec5, 0x9073, - 0x3ebf, 0x9070, 0x3eba, 0x906d, 0x3eb4, 0x906a, 0x3eaf, 0x9067, - 0x3ea9, 0x9064, 0x3ea4, 0x9061, 0x3e9e, 0x905e, 0x3e99, 0x905b, - 0x3e93, 0x9057, 0x3e8e, 0x9054, 0x3e88, 0x9051, 0x3e83, 0x904e, - 0x3e7d, 0x904b, 0x3e78, 0x9048, 0x3e73, 0x9045, 0x3e6d, 0x9042, - 0x3e68, 0x903f, 0x3e62, 0x903c, 0x3e5d, 0x9039, 0x3e57, 0x9036, - 0x3e52, 0x9033, 0x3e4c, 0x9030, 0x3e47, 0x902d, 0x3e41, 0x902a, - 0x3e3c, 0x9026, 0x3e36, 0x9023, 0x3e31, 0x9020, 0x3e2b, 0x901d, - 0x3e26, 0x901a, 0x3e20, 0x9017, 0x3e1b, 0x9014, 0x3e15, 0x9011, - 0x3e10, 0x900e, 0x3e0a, 0x900b, 0x3e05, 0x9008, 0x3dff, 0x9005, - 0x3dfa, 0x9002, 0x3df4, 0x8fff, 0x3def, 0x8ffc, 0x3de9, 0x8ff9, - 0x3de4, 0x8ff6, 0x3dde, 0x8ff3, 0x3dd9, 0x8ff0, 0x3dd3, 0x8fed, - 0x3dce, 0x8fea, 0x3dc8, 0x8fe7, 0x3dc3, 0x8fe3, 0x3dbd, 0x8fe0, - 0x3db8, 0x8fdd, 0x3db2, 0x8fda, 0x3dad, 0x8fd7, 0x3da7, 0x8fd4, - 0x3da2, 0x8fd1, 0x3d9c, 0x8fce, 0x3d97, 0x8fcb, 0x3d91, 0x8fc8, - 0x3d8c, 0x8fc5, 0x3d86, 0x8fc2, 0x3d81, 0x8fbf, 0x3d7b, 0x8fbc, - 0x3d76, 0x8fb9, 0x3d70, 0x8fb6, 0x3d6b, 0x8fb3, 0x3d65, 0x8fb0, - 0x3d60, 0x8fad, 0x3d5a, 0x8faa, 0x3d55, 0x8fa7, 0x3d4f, 0x8fa4, - 0x3d49, 0x8fa1, 0x3d44, 0x8f9e, 0x3d3e, 0x8f9b, 0x3d39, 0x8f98, - 0x3d33, 0x8f95, 0x3d2e, 0x8f92, 0x3d28, 0x8f8f, 0x3d23, 0x8f8c, - 0x3d1d, 0x8f89, 0x3d18, 0x8f86, 0x3d12, 0x8f83, 0x3d0d, 0x8f80, - 0x3d07, 0x8f7d, 0x3d02, 0x8f7a, 0x3cfc, 0x8f77, 0x3cf7, 0x8f74, - 0x3cf1, 0x8f71, 0x3cec, 0x8f6e, 0x3ce6, 0x8f6b, 0x3ce1, 0x8f68, - 0x3cdb, 0x8f65, 0x3cd6, 0x8f62, 0x3cd0, 0x8f5f, 0x3cca, 0x8f5c, - 0x3cc5, 0x8f59, 0x3cbf, 0x8f56, 0x3cba, 0x8f53, 0x3cb4, 0x8f50, - 0x3caf, 0x8f4d, 0x3ca9, 0x8f4a, 0x3ca4, 0x8f47, 0x3c9e, 0x8f44, - 0x3c99, 0x8f41, 0x3c93, 0x8f3e, 0x3c8e, 0x8f3b, 0x3c88, 0x8f38, - 0x3c83, 0x8f35, 0x3c7d, 0x8f32, 0x3c77, 0x8f2f, 0x3c72, 0x8f2d, - 0x3c6c, 0x8f2a, 0x3c67, 0x8f27, 0x3c61, 0x8f24, 0x3c5c, 0x8f21, - 0x3c56, 0x8f1e, 0x3c51, 0x8f1b, 0x3c4b, 0x8f18, 0x3c46, 0x8f15, - 0x3c40, 0x8f12, 0x3c3b, 0x8f0f, 0x3c35, 0x8f0c, 0x3c2f, 0x8f09, - 0x3c2a, 0x8f06, 0x3c24, 0x8f03, 0x3c1f, 0x8f00, 0x3c19, 0x8efd, - 0x3c14, 0x8efa, 0x3c0e, 0x8ef7, 0x3c09, 0x8ef4, 0x3c03, 0x8ef1, - 0x3bfd, 0x8eee, 0x3bf8, 0x8eec, 0x3bf2, 0x8ee9, 0x3bed, 0x8ee6, - 0x3be7, 0x8ee3, 0x3be2, 0x8ee0, 0x3bdc, 0x8edd, 0x3bd7, 0x8eda, - 0x3bd1, 0x8ed7, 0x3bcc, 0x8ed4, 0x3bc6, 0x8ed1, 0x3bc0, 0x8ece, - 0x3bbb, 0x8ecb, 0x3bb5, 0x8ec8, 0x3bb0, 0x8ec5, 0x3baa, 0x8ec2, - 0x3ba5, 0x8ebf, 0x3b9f, 0x8ebd, 0x3b99, 0x8eba, 0x3b94, 0x8eb7, - 0x3b8e, 0x8eb4, 0x3b89, 0x8eb1, 0x3b83, 0x8eae, 0x3b7e, 0x8eab, - 0x3b78, 0x8ea8, 0x3b73, 0x8ea5, 0x3b6d, 0x8ea2, 0x3b67, 0x8e9f, - 0x3b62, 0x8e9c, 0x3b5c, 0x8e99, 0x3b57, 0x8e97, 0x3b51, 0x8e94, - 0x3b4c, 0x8e91, 0x3b46, 0x8e8e, 0x3b40, 0x8e8b, 0x3b3b, 0x8e88, - 0x3b35, 0x8e85, 0x3b30, 0x8e82, 0x3b2a, 0x8e7f, 0x3b25, 0x8e7c, - 0x3b1f, 0x8e7a, 0x3b19, 0x8e77, 0x3b14, 0x8e74, 0x3b0e, 0x8e71, - 0x3b09, 0x8e6e, 0x3b03, 0x8e6b, 0x3afe, 0x8e68, 0x3af8, 0x8e65, - 0x3af2, 0x8e62, 0x3aed, 0x8e5f, 0x3ae7, 0x8e5d, 0x3ae2, 0x8e5a, - 0x3adc, 0x8e57, 0x3ad7, 0x8e54, 0x3ad1, 0x8e51, 0x3acb, 0x8e4e, - 0x3ac6, 0x8e4b, 0x3ac0, 0x8e48, 0x3abb, 0x8e45, 0x3ab5, 0x8e43, - 0x3aaf, 0x8e40, 0x3aaa, 0x8e3d, 0x3aa4, 0x8e3a, 0x3a9f, 0x8e37, - 0x3a99, 0x8e34, 0x3a94, 0x8e31, 0x3a8e, 0x8e2e, 0x3a88, 0x8e2c, - 0x3a83, 0x8e29, 0x3a7d, 0x8e26, 0x3a78, 0x8e23, 0x3a72, 0x8e20, - 0x3a6c, 0x8e1d, 0x3a67, 0x8e1a, 0x3a61, 0x8e17, 0x3a5c, 0x8e15, - 0x3a56, 0x8e12, 0x3a50, 0x8e0f, 0x3a4b, 0x8e0c, 0x3a45, 0x8e09, - 0x3a40, 0x8e06, 0x3a3a, 0x8e03, 0x3a34, 0x8e01, 0x3a2f, 0x8dfe, - 0x3a29, 0x8dfb, 0x3a24, 0x8df8, 0x3a1e, 0x8df5, 0x3a19, 0x8df2, - 0x3a13, 0x8def, 0x3a0d, 0x8ded, 0x3a08, 0x8dea, 0x3a02, 0x8de7, - 0x39fd, 0x8de4, 0x39f7, 0x8de1, 0x39f1, 0x8dde, 0x39ec, 0x8ddc, - 0x39e6, 0x8dd9, 0x39e0, 0x8dd6, 0x39db, 0x8dd3, 0x39d5, 0x8dd0, - 0x39d0, 0x8dcd, 0x39ca, 0x8dca, 0x39c4, 0x8dc8, 0x39bf, 0x8dc5, - 0x39b9, 0x8dc2, 0x39b4, 0x8dbf, 0x39ae, 0x8dbc, 0x39a8, 0x8db9, - 0x39a3, 0x8db7, 0x399d, 0x8db4, 0x3998, 0x8db1, 0x3992, 0x8dae, - 0x398c, 0x8dab, 0x3987, 0x8da9, 0x3981, 0x8da6, 0x397c, 0x8da3, - 0x3976, 0x8da0, 0x3970, 0x8d9d, 0x396b, 0x8d9a, 0x3965, 0x8d98, - 0x395f, 0x8d95, 0x395a, 0x8d92, 0x3954, 0x8d8f, 0x394f, 0x8d8c, - 0x3949, 0x8d8a, 0x3943, 0x8d87, 0x393e, 0x8d84, 0x3938, 0x8d81, - 0x3932, 0x8d7e, 0x392d, 0x8d7b, 0x3927, 0x8d79, 0x3922, 0x8d76, - 0x391c, 0x8d73, 0x3916, 0x8d70, 0x3911, 0x8d6d, 0x390b, 0x8d6b, - 0x3906, 0x8d68, 0x3900, 0x8d65, 0x38fa, 0x8d62, 0x38f5, 0x8d5f, - 0x38ef, 0x8d5d, 0x38e9, 0x8d5a, 0x38e4, 0x8d57, 0x38de, 0x8d54, - 0x38d8, 0x8d51, 0x38d3, 0x8d4f, 0x38cd, 0x8d4c, 0x38c8, 0x8d49, - 0x38c2, 0x8d46, 0x38bc, 0x8d44, 0x38b7, 0x8d41, 0x38b1, 0x8d3e, - 0x38ab, 0x8d3b, 0x38a6, 0x8d38, 0x38a0, 0x8d36, 0x389b, 0x8d33, - 0x3895, 0x8d30, 0x388f, 0x8d2d, 0x388a, 0x8d2b, 0x3884, 0x8d28, - 0x387e, 0x8d25, 0x3879, 0x8d22, 0x3873, 0x8d1f, 0x386d, 0x8d1d, - 0x3868, 0x8d1a, 0x3862, 0x8d17, 0x385d, 0x8d14, 0x3857, 0x8d12, - 0x3851, 0x8d0f, 0x384c, 0x8d0c, 0x3846, 0x8d09, 0x3840, 0x8d07, - 0x383b, 0x8d04, 0x3835, 0x8d01, 0x382f, 0x8cfe, 0x382a, 0x8cfb, - 0x3824, 0x8cf9, 0x381e, 0x8cf6, 0x3819, 0x8cf3, 0x3813, 0x8cf0, - 0x380d, 0x8cee, 0x3808, 0x8ceb, 0x3802, 0x8ce8, 0x37fd, 0x8ce5, - 0x37f7, 0x8ce3, 0x37f1, 0x8ce0, 0x37ec, 0x8cdd, 0x37e6, 0x8cda, - 0x37e0, 0x8cd8, 0x37db, 0x8cd5, 0x37d5, 0x8cd2, 0x37cf, 0x8cd0, - 0x37ca, 0x8ccd, 0x37c4, 0x8cca, 0x37be, 0x8cc7, 0x37b9, 0x8cc5, - 0x37b3, 0x8cc2, 0x37ad, 0x8cbf, 0x37a8, 0x8cbc, 0x37a2, 0x8cba, - 0x379c, 0x8cb7, 0x3797, 0x8cb4, 0x3791, 0x8cb1, 0x378b, 0x8caf, - 0x3786, 0x8cac, 0x3780, 0x8ca9, 0x377a, 0x8ca7, 0x3775, 0x8ca4, - 0x376f, 0x8ca1, 0x3769, 0x8c9e, 0x3764, 0x8c9c, 0x375e, 0x8c99, - 0x3758, 0x8c96, 0x3753, 0x8c94, 0x374d, 0x8c91, 0x3747, 0x8c8e, - 0x3742, 0x8c8b, 0x373c, 0x8c89, 0x3736, 0x8c86, 0x3731, 0x8c83, - 0x372b, 0x8c81, 0x3725, 0x8c7e, 0x3720, 0x8c7b, 0x371a, 0x8c78, - 0x3714, 0x8c76, 0x370f, 0x8c73, 0x3709, 0x8c70, 0x3703, 0x8c6e, - 0x36fe, 0x8c6b, 0x36f8, 0x8c68, 0x36f2, 0x8c65, 0x36ed, 0x8c63, - 0x36e7, 0x8c60, 0x36e1, 0x8c5d, 0x36dc, 0x8c5b, 0x36d6, 0x8c58, - 0x36d0, 0x8c55, 0x36cb, 0x8c53, 0x36c5, 0x8c50, 0x36bf, 0x8c4d, - 0x36ba, 0x8c4b, 0x36b4, 0x8c48, 0x36ae, 0x8c45, 0x36a9, 0x8c43, - 0x36a3, 0x8c40, 0x369d, 0x8c3d, 0x3698, 0x8c3a, 0x3692, 0x8c38, - 0x368c, 0x8c35, 0x3686, 0x8c32, 0x3681, 0x8c30, 0x367b, 0x8c2d, - 0x3675, 0x8c2a, 0x3670, 0x8c28, 0x366a, 0x8c25, 0x3664, 0x8c22, - 0x365f, 0x8c20, 0x3659, 0x8c1d, 0x3653, 0x8c1a, 0x364e, 0x8c18, - 0x3648, 0x8c15, 0x3642, 0x8c12, 0x363d, 0x8c10, 0x3637, 0x8c0d, - 0x3631, 0x8c0a, 0x362b, 0x8c08, 0x3626, 0x8c05, 0x3620, 0x8c02, - 0x361a, 0x8c00, 0x3615, 0x8bfd, 0x360f, 0x8bfa, 0x3609, 0x8bf8, - 0x3604, 0x8bf5, 0x35fe, 0x8bf3, 0x35f8, 0x8bf0, 0x35f3, 0x8bed, - 0x35ed, 0x8beb, 0x35e7, 0x8be8, 0x35e1, 0x8be5, 0x35dc, 0x8be3, - 0x35d6, 0x8be0, 0x35d0, 0x8bdd, 0x35cb, 0x8bdb, 0x35c5, 0x8bd8, - 0x35bf, 0x8bd5, 0x35ba, 0x8bd3, 0x35b4, 0x8bd0, 0x35ae, 0x8bce, - 0x35a8, 0x8bcb, 0x35a3, 0x8bc8, 0x359d, 0x8bc6, 0x3597, 0x8bc3, - 0x3592, 0x8bc0, 0x358c, 0x8bbe, 0x3586, 0x8bbb, 0x3580, 0x8bb8, - 0x357b, 0x8bb6, 0x3575, 0x8bb3, 0x356f, 0x8bb1, 0x356a, 0x8bae, - 0x3564, 0x8bab, 0x355e, 0x8ba9, 0x3558, 0x8ba6, 0x3553, 0x8ba4, - 0x354d, 0x8ba1, 0x3547, 0x8b9e, 0x3542, 0x8b9c, 0x353c, 0x8b99, - 0x3536, 0x8b96, 0x3530, 0x8b94, 0x352b, 0x8b91, 0x3525, 0x8b8f, - 0x351f, 0x8b8c, 0x351a, 0x8b89, 0x3514, 0x8b87, 0x350e, 0x8b84, - 0x3508, 0x8b82, 0x3503, 0x8b7f, 0x34fd, 0x8b7c, 0x34f7, 0x8b7a, - 0x34f2, 0x8b77, 0x34ec, 0x8b75, 0x34e6, 0x8b72, 0x34e0, 0x8b6f, - 0x34db, 0x8b6d, 0x34d5, 0x8b6a, 0x34cf, 0x8b68, 0x34ca, 0x8b65, - 0x34c4, 0x8b62, 0x34be, 0x8b60, 0x34b8, 0x8b5d, 0x34b3, 0x8b5b, - 0x34ad, 0x8b58, 0x34a7, 0x8b55, 0x34a1, 0x8b53, 0x349c, 0x8b50, - 0x3496, 0x8b4e, 0x3490, 0x8b4b, 0x348b, 0x8b49, 0x3485, 0x8b46, - 0x347f, 0x8b43, 0x3479, 0x8b41, 0x3474, 0x8b3e, 0x346e, 0x8b3c, - 0x3468, 0x8b39, 0x3462, 0x8b37, 0x345d, 0x8b34, 0x3457, 0x8b31, - 0x3451, 0x8b2f, 0x344b, 0x8b2c, 0x3446, 0x8b2a, 0x3440, 0x8b27, - 0x343a, 0x8b25, 0x3435, 0x8b22, 0x342f, 0x8b1f, 0x3429, 0x8b1d, - 0x3423, 0x8b1a, 0x341e, 0x8b18, 0x3418, 0x8b15, 0x3412, 0x8b13, - 0x340c, 0x8b10, 0x3407, 0x8b0e, 0x3401, 0x8b0b, 0x33fb, 0x8b08, - 0x33f5, 0x8b06, 0x33f0, 0x8b03, 0x33ea, 0x8b01, 0x33e4, 0x8afe, - 0x33de, 0x8afc, 0x33d9, 0x8af9, 0x33d3, 0x8af7, 0x33cd, 0x8af4, - 0x33c7, 0x8af1, 0x33c2, 0x8aef, 0x33bc, 0x8aec, 0x33b6, 0x8aea, - 0x33b0, 0x8ae7, 0x33ab, 0x8ae5, 0x33a5, 0x8ae2, 0x339f, 0x8ae0, - 0x3399, 0x8add, 0x3394, 0x8adb, 0x338e, 0x8ad8, 0x3388, 0x8ad6, - 0x3382, 0x8ad3, 0x337d, 0x8ad1, 0x3377, 0x8ace, 0x3371, 0x8acb, - 0x336b, 0x8ac9, 0x3366, 0x8ac6, 0x3360, 0x8ac4, 0x335a, 0x8ac1, - 0x3354, 0x8abf, 0x334f, 0x8abc, 0x3349, 0x8aba, 0x3343, 0x8ab7, - 0x333d, 0x8ab5, 0x3338, 0x8ab2, 0x3332, 0x8ab0, 0x332c, 0x8aad, - 0x3326, 0x8aab, 0x3321, 0x8aa8, 0x331b, 0x8aa6, 0x3315, 0x8aa3, - 0x330f, 0x8aa1, 0x330a, 0x8a9e, 0x3304, 0x8a9c, 0x32fe, 0x8a99, - 0x32f8, 0x8a97, 0x32f3, 0x8a94, 0x32ed, 0x8a92, 0x32e7, 0x8a8f, - 0x32e1, 0x8a8d, 0x32db, 0x8a8a, 0x32d6, 0x8a88, 0x32d0, 0x8a85, - 0x32ca, 0x8a83, 0x32c4, 0x8a80, 0x32bf, 0x8a7e, 0x32b9, 0x8a7b, - 0x32b3, 0x8a79, 0x32ad, 0x8a76, 0x32a8, 0x8a74, 0x32a2, 0x8a71, - 0x329c, 0x8a6f, 0x3296, 0x8a6c, 0x3290, 0x8a6a, 0x328b, 0x8a67, - 0x3285, 0x8a65, 0x327f, 0x8a62, 0x3279, 0x8a60, 0x3274, 0x8a5d, - 0x326e, 0x8a5b, 0x3268, 0x8a59, 0x3262, 0x8a56, 0x325d, 0x8a54, - 0x3257, 0x8a51, 0x3251, 0x8a4f, 0x324b, 0x8a4c, 0x3245, 0x8a4a, - 0x3240, 0x8a47, 0x323a, 0x8a45, 0x3234, 0x8a42, 0x322e, 0x8a40, - 0x3228, 0x8a3d, 0x3223, 0x8a3b, 0x321d, 0x8a38, 0x3217, 0x8a36, - 0x3211, 0x8a34, 0x320c, 0x8a31, 0x3206, 0x8a2f, 0x3200, 0x8a2c, - 0x31fa, 0x8a2a, 0x31f4, 0x8a27, 0x31ef, 0x8a25, 0x31e9, 0x8a22, - 0x31e3, 0x8a20, 0x31dd, 0x8a1d, 0x31d8, 0x8a1b, 0x31d2, 0x8a19, - 0x31cc, 0x8a16, 0x31c6, 0x8a14, 0x31c0, 0x8a11, 0x31bb, 0x8a0f, - 0x31b5, 0x8a0c, 0x31af, 0x8a0a, 0x31a9, 0x8a07, 0x31a3, 0x8a05, - 0x319e, 0x8a03, 0x3198, 0x8a00, 0x3192, 0x89fe, 0x318c, 0x89fb, - 0x3186, 0x89f9, 0x3181, 0x89f6, 0x317b, 0x89f4, 0x3175, 0x89f2, - 0x316f, 0x89ef, 0x3169, 0x89ed, 0x3164, 0x89ea, 0x315e, 0x89e8, - 0x3158, 0x89e5, 0x3152, 0x89e3, 0x314c, 0x89e1, 0x3147, 0x89de, - 0x3141, 0x89dc, 0x313b, 0x89d9, 0x3135, 0x89d7, 0x312f, 0x89d5, - 0x312a, 0x89d2, 0x3124, 0x89d0, 0x311e, 0x89cd, 0x3118, 0x89cb, - 0x3112, 0x89c8, 0x310d, 0x89c6, 0x3107, 0x89c4, 0x3101, 0x89c1, - 0x30fb, 0x89bf, 0x30f5, 0x89bc, 0x30f0, 0x89ba, 0x30ea, 0x89b8, - 0x30e4, 0x89b5, 0x30de, 0x89b3, 0x30d8, 0x89b0, 0x30d3, 0x89ae, - 0x30cd, 0x89ac, 0x30c7, 0x89a9, 0x30c1, 0x89a7, 0x30bb, 0x89a4, - 0x30b6, 0x89a2, 0x30b0, 0x89a0, 0x30aa, 0x899d, 0x30a4, 0x899b, - 0x309e, 0x8998, 0x3099, 0x8996, 0x3093, 0x8994, 0x308d, 0x8991, - 0x3087, 0x898f, 0x3081, 0x898d, 0x307b, 0x898a, 0x3076, 0x8988, - 0x3070, 0x8985, 0x306a, 0x8983, 0x3064, 0x8981, 0x305e, 0x897e, - 0x3059, 0x897c, 0x3053, 0x897a, 0x304d, 0x8977, 0x3047, 0x8975, - 0x3041, 0x8972, 0x303b, 0x8970, 0x3036, 0x896e, 0x3030, 0x896b, - 0x302a, 0x8969, 0x3024, 0x8967, 0x301e, 0x8964, 0x3019, 0x8962, - 0x3013, 0x8960, 0x300d, 0x895d, 0x3007, 0x895b, 0x3001, 0x8958, - 0x2ffb, 0x8956, 0x2ff6, 0x8954, 0x2ff0, 0x8951, 0x2fea, 0x894f, - 0x2fe4, 0x894d, 0x2fde, 0x894a, 0x2fd8, 0x8948, 0x2fd3, 0x8946, - 0x2fcd, 0x8943, 0x2fc7, 0x8941, 0x2fc1, 0x893f, 0x2fbb, 0x893c, - 0x2fb5, 0x893a, 0x2fb0, 0x8938, 0x2faa, 0x8935, 0x2fa4, 0x8933, - 0x2f9e, 0x8931, 0x2f98, 0x892e, 0x2f92, 0x892c, 0x2f8d, 0x892a, - 0x2f87, 0x8927, 0x2f81, 0x8925, 0x2f7b, 0x8923, 0x2f75, 0x8920, - 0x2f6f, 0x891e, 0x2f6a, 0x891c, 0x2f64, 0x8919, 0x2f5e, 0x8917, - 0x2f58, 0x8915, 0x2f52, 0x8912, 0x2f4c, 0x8910, 0x2f47, 0x890e, - 0x2f41, 0x890b, 0x2f3b, 0x8909, 0x2f35, 0x8907, 0x2f2f, 0x8904, - 0x2f29, 0x8902, 0x2f24, 0x8900, 0x2f1e, 0x88fd, 0x2f18, 0x88fb, - 0x2f12, 0x88f9, 0x2f0c, 0x88f6, 0x2f06, 0x88f4, 0x2f01, 0x88f2, - 0x2efb, 0x88f0, 0x2ef5, 0x88ed, 0x2eef, 0x88eb, 0x2ee9, 0x88e9, - 0x2ee3, 0x88e6, 0x2edd, 0x88e4, 0x2ed8, 0x88e2, 0x2ed2, 0x88df, - 0x2ecc, 0x88dd, 0x2ec6, 0x88db, 0x2ec0, 0x88d9, 0x2eba, 0x88d6, - 0x2eb5, 0x88d4, 0x2eaf, 0x88d2, 0x2ea9, 0x88cf, 0x2ea3, 0x88cd, - 0x2e9d, 0x88cb, 0x2e97, 0x88c8, 0x2e91, 0x88c6, 0x2e8c, 0x88c4, - 0x2e86, 0x88c2, 0x2e80, 0x88bf, 0x2e7a, 0x88bd, 0x2e74, 0x88bb, - 0x2e6e, 0x88b9, 0x2e68, 0x88b6, 0x2e63, 0x88b4, 0x2e5d, 0x88b2, - 0x2e57, 0x88af, 0x2e51, 0x88ad, 0x2e4b, 0x88ab, 0x2e45, 0x88a9, - 0x2e3f, 0x88a6, 0x2e3a, 0x88a4, 0x2e34, 0x88a2, 0x2e2e, 0x88a0, - 0x2e28, 0x889d, 0x2e22, 0x889b, 0x2e1c, 0x8899, 0x2e16, 0x8896, - 0x2e11, 0x8894, 0x2e0b, 0x8892, 0x2e05, 0x8890, 0x2dff, 0x888d, - 0x2df9, 0x888b, 0x2df3, 0x8889, 0x2ded, 0x8887, 0x2de7, 0x8884, - 0x2de2, 0x8882, 0x2ddc, 0x8880, 0x2dd6, 0x887e, 0x2dd0, 0x887b, - 0x2dca, 0x8879, 0x2dc4, 0x8877, 0x2dbe, 0x8875, 0x2db9, 0x8872, - 0x2db3, 0x8870, 0x2dad, 0x886e, 0x2da7, 0x886c, 0x2da1, 0x8869, - 0x2d9b, 0x8867, 0x2d95, 0x8865, 0x2d8f, 0x8863, 0x2d8a, 0x8860, - 0x2d84, 0x885e, 0x2d7e, 0x885c, 0x2d78, 0x885a, 0x2d72, 0x8858, - 0x2d6c, 0x8855, 0x2d66, 0x8853, 0x2d60, 0x8851, 0x2d5b, 0x884f, - 0x2d55, 0x884c, 0x2d4f, 0x884a, 0x2d49, 0x8848, 0x2d43, 0x8846, - 0x2d3d, 0x8844, 0x2d37, 0x8841, 0x2d31, 0x883f, 0x2d2c, 0x883d, - 0x2d26, 0x883b, 0x2d20, 0x8838, 0x2d1a, 0x8836, 0x2d14, 0x8834, - 0x2d0e, 0x8832, 0x2d08, 0x8830, 0x2d02, 0x882d, 0x2cfd, 0x882b, - 0x2cf7, 0x8829, 0x2cf1, 0x8827, 0x2ceb, 0x8825, 0x2ce5, 0x8822, - 0x2cdf, 0x8820, 0x2cd9, 0x881e, 0x2cd3, 0x881c, 0x2ccd, 0x881a, - 0x2cc8, 0x8817, 0x2cc2, 0x8815, 0x2cbc, 0x8813, 0x2cb6, 0x8811, - 0x2cb0, 0x880f, 0x2caa, 0x880c, 0x2ca4, 0x880a, 0x2c9e, 0x8808, - 0x2c98, 0x8806, 0x2c93, 0x8804, 0x2c8d, 0x8801, 0x2c87, 0x87ff, - 0x2c81, 0x87fd, 0x2c7b, 0x87fb, 0x2c75, 0x87f9, 0x2c6f, 0x87f6, - 0x2c69, 0x87f4, 0x2c63, 0x87f2, 0x2c5e, 0x87f0, 0x2c58, 0x87ee, - 0x2c52, 0x87ec, 0x2c4c, 0x87e9, 0x2c46, 0x87e7, 0x2c40, 0x87e5, - 0x2c3a, 0x87e3, 0x2c34, 0x87e1, 0x2c2e, 0x87df, 0x2c29, 0x87dc, - 0x2c23, 0x87da, 0x2c1d, 0x87d8, 0x2c17, 0x87d6, 0x2c11, 0x87d4, - 0x2c0b, 0x87d2, 0x2c05, 0x87cf, 0x2bff, 0x87cd, 0x2bf9, 0x87cb, - 0x2bf3, 0x87c9, 0x2bee, 0x87c7, 0x2be8, 0x87c5, 0x2be2, 0x87c2, - 0x2bdc, 0x87c0, 0x2bd6, 0x87be, 0x2bd0, 0x87bc, 0x2bca, 0x87ba, - 0x2bc4, 0x87b8, 0x2bbe, 0x87b6, 0x2bb8, 0x87b3, 0x2bb2, 0x87b1, - 0x2bad, 0x87af, 0x2ba7, 0x87ad, 0x2ba1, 0x87ab, 0x2b9b, 0x87a9, - 0x2b95, 0x87a7, 0x2b8f, 0x87a4, 0x2b89, 0x87a2, 0x2b83, 0x87a0, - 0x2b7d, 0x879e, 0x2b77, 0x879c, 0x2b71, 0x879a, 0x2b6c, 0x8798, - 0x2b66, 0x8795, 0x2b60, 0x8793, 0x2b5a, 0x8791, 0x2b54, 0x878f, - 0x2b4e, 0x878d, 0x2b48, 0x878b, 0x2b42, 0x8789, 0x2b3c, 0x8787, - 0x2b36, 0x8784, 0x2b30, 0x8782, 0x2b2b, 0x8780, 0x2b25, 0x877e, - 0x2b1f, 0x877c, 0x2b19, 0x877a, 0x2b13, 0x8778, 0x2b0d, 0x8776, - 0x2b07, 0x8774, 0x2b01, 0x8771, 0x2afb, 0x876f, 0x2af5, 0x876d, - 0x2aef, 0x876b, 0x2ae9, 0x8769, 0x2ae4, 0x8767, 0x2ade, 0x8765, - 0x2ad8, 0x8763, 0x2ad2, 0x8761, 0x2acc, 0x875e, 0x2ac6, 0x875c, - 0x2ac0, 0x875a, 0x2aba, 0x8758, 0x2ab4, 0x8756, 0x2aae, 0x8754, - 0x2aa8, 0x8752, 0x2aa2, 0x8750, 0x2a9c, 0x874e, 0x2a97, 0x874c, - 0x2a91, 0x874a, 0x2a8b, 0x8747, 0x2a85, 0x8745, 0x2a7f, 0x8743, - 0x2a79, 0x8741, 0x2a73, 0x873f, 0x2a6d, 0x873d, 0x2a67, 0x873b, - 0x2a61, 0x8739, 0x2a5b, 0x8737, 0x2a55, 0x8735, 0x2a4f, 0x8733, - 0x2a49, 0x8731, 0x2a44, 0x872e, 0x2a3e, 0x872c, 0x2a38, 0x872a, - 0x2a32, 0x8728, 0x2a2c, 0x8726, 0x2a26, 0x8724, 0x2a20, 0x8722, - 0x2a1a, 0x8720, 0x2a14, 0x871e, 0x2a0e, 0x871c, 0x2a08, 0x871a, - 0x2a02, 0x8718, 0x29fc, 0x8716, 0x29f6, 0x8714, 0x29f0, 0x8712, - 0x29eb, 0x870f, 0x29e5, 0x870d, 0x29df, 0x870b, 0x29d9, 0x8709, - 0x29d3, 0x8707, 0x29cd, 0x8705, 0x29c7, 0x8703, 0x29c1, 0x8701, - 0x29bb, 0x86ff, 0x29b5, 0x86fd, 0x29af, 0x86fb, 0x29a9, 0x86f9, - 0x29a3, 0x86f7, 0x299d, 0x86f5, 0x2997, 0x86f3, 0x2991, 0x86f1, - 0x298b, 0x86ef, 0x2986, 0x86ed, 0x2980, 0x86eb, 0x297a, 0x86e9, - 0x2974, 0x86e7, 0x296e, 0x86e4, 0x2968, 0x86e2, 0x2962, 0x86e0, - 0x295c, 0x86de, 0x2956, 0x86dc, 0x2950, 0x86da, 0x294a, 0x86d8, - 0x2944, 0x86d6, 0x293e, 0x86d4, 0x2938, 0x86d2, 0x2932, 0x86d0, - 0x292c, 0x86ce, 0x2926, 0x86cc, 0x2920, 0x86ca, 0x291b, 0x86c8, - 0x2915, 0x86c6, 0x290f, 0x86c4, 0x2909, 0x86c2, 0x2903, 0x86c0, - 0x28fd, 0x86be, 0x28f7, 0x86bc, 0x28f1, 0x86ba, 0x28eb, 0x86b8, - 0x28e5, 0x86b6, 0x28df, 0x86b4, 0x28d9, 0x86b2, 0x28d3, 0x86b0, - 0x28cd, 0x86ae, 0x28c7, 0x86ac, 0x28c1, 0x86aa, 0x28bb, 0x86a8, - 0x28b5, 0x86a6, 0x28af, 0x86a4, 0x28a9, 0x86a2, 0x28a3, 0x86a0, - 0x289d, 0x869e, 0x2898, 0x869c, 0x2892, 0x869a, 0x288c, 0x8698, - 0x2886, 0x8696, 0x2880, 0x8694, 0x287a, 0x8692, 0x2874, 0x8690, - 0x286e, 0x868e, 0x2868, 0x868c, 0x2862, 0x868a, 0x285c, 0x8688, - 0x2856, 0x8686, 0x2850, 0x8684, 0x284a, 0x8682, 0x2844, 0x8680, - 0x283e, 0x867e, 0x2838, 0x867c, 0x2832, 0x867a, 0x282c, 0x8678, - 0x2826, 0x8676, 0x2820, 0x8674, 0x281a, 0x8672, 0x2814, 0x8670, - 0x280e, 0x866e, 0x2808, 0x866d, 0x2802, 0x866b, 0x27fc, 0x8669, - 0x27f6, 0x8667, 0x27f1, 0x8665, 0x27eb, 0x8663, 0x27e5, 0x8661, - 0x27df, 0x865f, 0x27d9, 0x865d, 0x27d3, 0x865b, 0x27cd, 0x8659, - 0x27c7, 0x8657, 0x27c1, 0x8655, 0x27bb, 0x8653, 0x27b5, 0x8651, - 0x27af, 0x864f, 0x27a9, 0x864d, 0x27a3, 0x864b, 0x279d, 0x8649, - 0x2797, 0x8647, 0x2791, 0x8645, 0x278b, 0x8644, 0x2785, 0x8642, - 0x277f, 0x8640, 0x2779, 0x863e, 0x2773, 0x863c, 0x276d, 0x863a, - 0x2767, 0x8638, 0x2761, 0x8636, 0x275b, 0x8634, 0x2755, 0x8632, - 0x274f, 0x8630, 0x2749, 0x862e, 0x2743, 0x862c, 0x273d, 0x862a, - 0x2737, 0x8628, 0x2731, 0x8627, 0x272b, 0x8625, 0x2725, 0x8623, - 0x271f, 0x8621, 0x2719, 0x861f, 0x2713, 0x861d, 0x270d, 0x861b, - 0x2707, 0x8619, 0x2701, 0x8617, 0x26fb, 0x8615, 0x26f5, 0x8613, - 0x26ef, 0x8611, 0x26e9, 0x8610, 0x26e4, 0x860e, 0x26de, 0x860c, - 0x26d8, 0x860a, 0x26d2, 0x8608, 0x26cc, 0x8606, 0x26c6, 0x8604, - 0x26c0, 0x8602, 0x26ba, 0x8600, 0x26b4, 0x85fe, 0x26ae, 0x85fc, - 0x26a8, 0x85fb, 0x26a2, 0x85f9, 0x269c, 0x85f7, 0x2696, 0x85f5, - 0x2690, 0x85f3, 0x268a, 0x85f1, 0x2684, 0x85ef, 0x267e, 0x85ed, - 0x2678, 0x85eb, 0x2672, 0x85ea, 0x266c, 0x85e8, 0x2666, 0x85e6, - 0x2660, 0x85e4, 0x265a, 0x85e2, 0x2654, 0x85e0, 0x264e, 0x85de, - 0x2648, 0x85dc, 0x2642, 0x85da, 0x263c, 0x85d9, 0x2636, 0x85d7, - 0x2630, 0x85d5, 0x262a, 0x85d3, 0x2624, 0x85d1, 0x261e, 0x85cf, - 0x2618, 0x85cd, 0x2612, 0x85cb, 0x260c, 0x85ca, 0x2606, 0x85c8, - 0x2600, 0x85c6, 0x25fa, 0x85c4, 0x25f4, 0x85c2, 0x25ee, 0x85c0, - 0x25e8, 0x85be, 0x25e2, 0x85bd, 0x25dc, 0x85bb, 0x25d6, 0x85b9, - 0x25d0, 0x85b7, 0x25ca, 0x85b5, 0x25c4, 0x85b3, 0x25be, 0x85b1, - 0x25b8, 0x85b0, 0x25b2, 0x85ae, 0x25ac, 0x85ac, 0x25a6, 0x85aa, - 0x25a0, 0x85a8, 0x259a, 0x85a6, 0x2594, 0x85a4, 0x258e, 0x85a3, - 0x2588, 0x85a1, 0x2582, 0x859f, 0x257c, 0x859d, 0x2576, 0x859b, - 0x2570, 0x8599, 0x256a, 0x8598, 0x2564, 0x8596, 0x255e, 0x8594, - 0x2558, 0x8592, 0x2552, 0x8590, 0x254c, 0x858e, 0x2546, 0x858d, - 0x2540, 0x858b, 0x253a, 0x8589, 0x2534, 0x8587, 0x252e, 0x8585, - 0x2528, 0x8583, 0x2522, 0x8582, 0x251c, 0x8580, 0x2516, 0x857e, - 0x250f, 0x857c, 0x2509, 0x857a, 0x2503, 0x8579, 0x24fd, 0x8577, - 0x24f7, 0x8575, 0x24f1, 0x8573, 0x24eb, 0x8571, 0x24e5, 0x856f, - 0x24df, 0x856e, 0x24d9, 0x856c, 0x24d3, 0x856a, 0x24cd, 0x8568, - 0x24c7, 0x8566, 0x24c1, 0x8565, 0x24bb, 0x8563, 0x24b5, 0x8561, - 0x24af, 0x855f, 0x24a9, 0x855d, 0x24a3, 0x855c, 0x249d, 0x855a, - 0x2497, 0x8558, 0x2491, 0x8556, 0x248b, 0x8554, 0x2485, 0x8553, - 0x247f, 0x8551, 0x2479, 0x854f, 0x2473, 0x854d, 0x246d, 0x854b, - 0x2467, 0x854a, 0x2461, 0x8548, 0x245b, 0x8546, 0x2455, 0x8544, - 0x244f, 0x8543, 0x2449, 0x8541, 0x2443, 0x853f, 0x243d, 0x853d, - 0x2437, 0x853b, 0x2431, 0x853a, 0x242b, 0x8538, 0x2425, 0x8536, - 0x241f, 0x8534, 0x2419, 0x8533, 0x2413, 0x8531, 0x240d, 0x852f, - 0x2407, 0x852d, 0x2401, 0x852b, 0x23fa, 0x852a, 0x23f4, 0x8528, - 0x23ee, 0x8526, 0x23e8, 0x8524, 0x23e2, 0x8523, 0x23dc, 0x8521, - 0x23d6, 0x851f, 0x23d0, 0x851d, 0x23ca, 0x851c, 0x23c4, 0x851a, - 0x23be, 0x8518, 0x23b8, 0x8516, 0x23b2, 0x8515, 0x23ac, 0x8513, - 0x23a6, 0x8511, 0x23a0, 0x850f, 0x239a, 0x850e, 0x2394, 0x850c, - 0x238e, 0x850a, 0x2388, 0x8508, 0x2382, 0x8507, 0x237c, 0x8505, - 0x2376, 0x8503, 0x2370, 0x8501, 0x236a, 0x8500, 0x2364, 0x84fe, - 0x235e, 0x84fc, 0x2358, 0x84fa, 0x2352, 0x84f9, 0x234b, 0x84f7, - 0x2345, 0x84f5, 0x233f, 0x84f4, 0x2339, 0x84f2, 0x2333, 0x84f0, - 0x232d, 0x84ee, 0x2327, 0x84ed, 0x2321, 0x84eb, 0x231b, 0x84e9, - 0x2315, 0x84e7, 0x230f, 0x84e6, 0x2309, 0x84e4, 0x2303, 0x84e2, - 0x22fd, 0x84e1, 0x22f7, 0x84df, 0x22f1, 0x84dd, 0x22eb, 0x84db, - 0x22e5, 0x84da, 0x22df, 0x84d8, 0x22d9, 0x84d6, 0x22d3, 0x84d5, - 0x22cd, 0x84d3, 0x22c7, 0x84d1, 0x22c0, 0x84cf, 0x22ba, 0x84ce, - 0x22b4, 0x84cc, 0x22ae, 0x84ca, 0x22a8, 0x84c9, 0x22a2, 0x84c7, - 0x229c, 0x84c5, 0x2296, 0x84c4, 0x2290, 0x84c2, 0x228a, 0x84c0, - 0x2284, 0x84be, 0x227e, 0x84bd, 0x2278, 0x84bb, 0x2272, 0x84b9, - 0x226c, 0x84b8, 0x2266, 0x84b6, 0x2260, 0x84b4, 0x225a, 0x84b3, - 0x2254, 0x84b1, 0x224e, 0x84af, 0x2247, 0x84ae, 0x2241, 0x84ac, - 0x223b, 0x84aa, 0x2235, 0x84a9, 0x222f, 0x84a7, 0x2229, 0x84a5, - 0x2223, 0x84a3, 0x221d, 0x84a2, 0x2217, 0x84a0, 0x2211, 0x849e, - 0x220b, 0x849d, 0x2205, 0x849b, 0x21ff, 0x8499, 0x21f9, 0x8498, - 0x21f3, 0x8496, 0x21ed, 0x8494, 0x21e7, 0x8493, 0x21e1, 0x8491, - 0x21da, 0x848f, 0x21d4, 0x848e, 0x21ce, 0x848c, 0x21c8, 0x848a, - 0x21c2, 0x8489, 0x21bc, 0x8487, 0x21b6, 0x8486, 0x21b0, 0x8484, - 0x21aa, 0x8482, 0x21a4, 0x8481, 0x219e, 0x847f, 0x2198, 0x847d, - 0x2192, 0x847c, 0x218c, 0x847a, 0x2186, 0x8478, 0x2180, 0x8477, - 0x2179, 0x8475, 0x2173, 0x8473, 0x216d, 0x8472, 0x2167, 0x8470, - 0x2161, 0x846e, 0x215b, 0x846d, 0x2155, 0x846b, 0x214f, 0x846a, - 0x2149, 0x8468, 0x2143, 0x8466, 0x213d, 0x8465, 0x2137, 0x8463, - 0x2131, 0x8461, 0x212b, 0x8460, 0x2125, 0x845e, 0x211e, 0x845d, - 0x2118, 0x845b, 0x2112, 0x8459, 0x210c, 0x8458, 0x2106, 0x8456, - 0x2100, 0x8454, 0x20fa, 0x8453, 0x20f4, 0x8451, 0x20ee, 0x8450, - 0x20e8, 0x844e, 0x20e2, 0x844c, 0x20dc, 0x844b, 0x20d6, 0x8449, - 0x20d0, 0x8447, 0x20c9, 0x8446, 0x20c3, 0x8444, 0x20bd, 0x8443, - 0x20b7, 0x8441, 0x20b1, 0x843f, 0x20ab, 0x843e, 0x20a5, 0x843c, - 0x209f, 0x843b, 0x2099, 0x8439, 0x2093, 0x8437, 0x208d, 0x8436, - 0x2087, 0x8434, 0x2081, 0x8433, 0x207a, 0x8431, 0x2074, 0x842f, - 0x206e, 0x842e, 0x2068, 0x842c, 0x2062, 0x842b, 0x205c, 0x8429, - 0x2056, 0x8427, 0x2050, 0x8426, 0x204a, 0x8424, 0x2044, 0x8423, - 0x203e, 0x8421, 0x2038, 0x8420, 0x2032, 0x841e, 0x202b, 0x841c, - 0x2025, 0x841b, 0x201f, 0x8419, 0x2019, 0x8418, 0x2013, 0x8416, - 0x200d, 0x8415, 0x2007, 0x8413, 0x2001, 0x8411, 0x1ffb, 0x8410, - 0x1ff5, 0x840e, 0x1fef, 0x840d, 0x1fe9, 0x840b, 0x1fe2, 0x840a, - 0x1fdc, 0x8408, 0x1fd6, 0x8406, 0x1fd0, 0x8405, 0x1fca, 0x8403, - 0x1fc4, 0x8402, 0x1fbe, 0x8400, 0x1fb8, 0x83ff, 0x1fb2, 0x83fd, - 0x1fac, 0x83fb, 0x1fa6, 0x83fa, 0x1f9f, 0x83f8, 0x1f99, 0x83f7, - 0x1f93, 0x83f5, 0x1f8d, 0x83f4, 0x1f87, 0x83f2, 0x1f81, 0x83f1, - 0x1f7b, 0x83ef, 0x1f75, 0x83ee, 0x1f6f, 0x83ec, 0x1f69, 0x83ea, - 0x1f63, 0x83e9, 0x1f5d, 0x83e7, 0x1f56, 0x83e6, 0x1f50, 0x83e4, - 0x1f4a, 0x83e3, 0x1f44, 0x83e1, 0x1f3e, 0x83e0, 0x1f38, 0x83de, - 0x1f32, 0x83dd, 0x1f2c, 0x83db, 0x1f26, 0x83da, 0x1f20, 0x83d8, - 0x1f19, 0x83d7, 0x1f13, 0x83d5, 0x1f0d, 0x83d3, 0x1f07, 0x83d2, - 0x1f01, 0x83d0, 0x1efb, 0x83cf, 0x1ef5, 0x83cd, 0x1eef, 0x83cc, - 0x1ee9, 0x83ca, 0x1ee3, 0x83c9, 0x1edd, 0x83c7, 0x1ed6, 0x83c6, - 0x1ed0, 0x83c4, 0x1eca, 0x83c3, 0x1ec4, 0x83c1, 0x1ebe, 0x83c0, - 0x1eb8, 0x83be, 0x1eb2, 0x83bd, 0x1eac, 0x83bb, 0x1ea6, 0x83ba, - 0x1ea0, 0x83b8, 0x1e99, 0x83b7, 0x1e93, 0x83b5, 0x1e8d, 0x83b4, - 0x1e87, 0x83b2, 0x1e81, 0x83b1, 0x1e7b, 0x83af, 0x1e75, 0x83ae, - 0x1e6f, 0x83ac, 0x1e69, 0x83ab, 0x1e62, 0x83a9, 0x1e5c, 0x83a8, - 0x1e56, 0x83a6, 0x1e50, 0x83a5, 0x1e4a, 0x83a3, 0x1e44, 0x83a2, - 0x1e3e, 0x83a0, 0x1e38, 0x839f, 0x1e32, 0x839d, 0x1e2c, 0x839c, - 0x1e25, 0x839a, 0x1e1f, 0x8399, 0x1e19, 0x8397, 0x1e13, 0x8396, - 0x1e0d, 0x8394, 0x1e07, 0x8393, 0x1e01, 0x8392, 0x1dfb, 0x8390, - 0x1df5, 0x838f, 0x1dee, 0x838d, 0x1de8, 0x838c, 0x1de2, 0x838a, - 0x1ddc, 0x8389, 0x1dd6, 0x8387, 0x1dd0, 0x8386, 0x1dca, 0x8384, - 0x1dc4, 0x8383, 0x1dbe, 0x8381, 0x1db7, 0x8380, 0x1db1, 0x837e, - 0x1dab, 0x837d, 0x1da5, 0x837c, 0x1d9f, 0x837a, 0x1d99, 0x8379, - 0x1d93, 0x8377, 0x1d8d, 0x8376, 0x1d87, 0x8374, 0x1d80, 0x8373, - 0x1d7a, 0x8371, 0x1d74, 0x8370, 0x1d6e, 0x836f, 0x1d68, 0x836d, - 0x1d62, 0x836c, 0x1d5c, 0x836a, 0x1d56, 0x8369, 0x1d50, 0x8367, - 0x1d49, 0x8366, 0x1d43, 0x8364, 0x1d3d, 0x8363, 0x1d37, 0x8362, - 0x1d31, 0x8360, 0x1d2b, 0x835f, 0x1d25, 0x835d, 0x1d1f, 0x835c, - 0x1d18, 0x835a, 0x1d12, 0x8359, 0x1d0c, 0x8358, 0x1d06, 0x8356, - 0x1d00, 0x8355, 0x1cfa, 0x8353, 0x1cf4, 0x8352, 0x1cee, 0x8350, - 0x1ce8, 0x834f, 0x1ce1, 0x834e, 0x1cdb, 0x834c, 0x1cd5, 0x834b, - 0x1ccf, 0x8349, 0x1cc9, 0x8348, 0x1cc3, 0x8347, 0x1cbd, 0x8345, - 0x1cb7, 0x8344, 0x1cb0, 0x8342, 0x1caa, 0x8341, 0x1ca4, 0x833f, - 0x1c9e, 0x833e, 0x1c98, 0x833d, 0x1c92, 0x833b, 0x1c8c, 0x833a, - 0x1c86, 0x8338, 0x1c7f, 0x8337, 0x1c79, 0x8336, 0x1c73, 0x8334, - 0x1c6d, 0x8333, 0x1c67, 0x8331, 0x1c61, 0x8330, 0x1c5b, 0x832f, - 0x1c55, 0x832d, 0x1c4e, 0x832c, 0x1c48, 0x832b, 0x1c42, 0x8329, - 0x1c3c, 0x8328, 0x1c36, 0x8326, 0x1c30, 0x8325, 0x1c2a, 0x8324, - 0x1c24, 0x8322, 0x1c1d, 0x8321, 0x1c17, 0x831f, 0x1c11, 0x831e, - 0x1c0b, 0x831d, 0x1c05, 0x831b, 0x1bff, 0x831a, 0x1bf9, 0x8319, - 0x1bf2, 0x8317, 0x1bec, 0x8316, 0x1be6, 0x8314, 0x1be0, 0x8313, - 0x1bda, 0x8312, 0x1bd4, 0x8310, 0x1bce, 0x830f, 0x1bc8, 0x830e, - 0x1bc1, 0x830c, 0x1bbb, 0x830b, 0x1bb5, 0x830a, 0x1baf, 0x8308, - 0x1ba9, 0x8307, 0x1ba3, 0x8305, 0x1b9d, 0x8304, 0x1b96, 0x8303, - 0x1b90, 0x8301, 0x1b8a, 0x8300, 0x1b84, 0x82ff, 0x1b7e, 0x82fd, - 0x1b78, 0x82fc, 0x1b72, 0x82fb, 0x1b6c, 0x82f9, 0x1b65, 0x82f8, - 0x1b5f, 0x82f7, 0x1b59, 0x82f5, 0x1b53, 0x82f4, 0x1b4d, 0x82f3, - 0x1b47, 0x82f1, 0x1b41, 0x82f0, 0x1b3a, 0x82ef, 0x1b34, 0x82ed, - 0x1b2e, 0x82ec, 0x1b28, 0x82eb, 0x1b22, 0x82e9, 0x1b1c, 0x82e8, - 0x1b16, 0x82e7, 0x1b0f, 0x82e5, 0x1b09, 0x82e4, 0x1b03, 0x82e3, - 0x1afd, 0x82e1, 0x1af7, 0x82e0, 0x1af1, 0x82df, 0x1aeb, 0x82dd, - 0x1ae4, 0x82dc, 0x1ade, 0x82db, 0x1ad8, 0x82d9, 0x1ad2, 0x82d8, - 0x1acc, 0x82d7, 0x1ac6, 0x82d5, 0x1ac0, 0x82d4, 0x1ab9, 0x82d3, - 0x1ab3, 0x82d1, 0x1aad, 0x82d0, 0x1aa7, 0x82cf, 0x1aa1, 0x82ce, - 0x1a9b, 0x82cc, 0x1a95, 0x82cb, 0x1a8e, 0x82ca, 0x1a88, 0x82c8, - 0x1a82, 0x82c7, 0x1a7c, 0x82c6, 0x1a76, 0x82c4, 0x1a70, 0x82c3, - 0x1a6a, 0x82c2, 0x1a63, 0x82c1, 0x1a5d, 0x82bf, 0x1a57, 0x82be, - 0x1a51, 0x82bd, 0x1a4b, 0x82bb, 0x1a45, 0x82ba, 0x1a3e, 0x82b9, - 0x1a38, 0x82b7, 0x1a32, 0x82b6, 0x1a2c, 0x82b5, 0x1a26, 0x82b4, - 0x1a20, 0x82b2, 0x1a1a, 0x82b1, 0x1a13, 0x82b0, 0x1a0d, 0x82ae, - 0x1a07, 0x82ad, 0x1a01, 0x82ac, 0x19fb, 0x82ab, 0x19f5, 0x82a9, - 0x19ef, 0x82a8, 0x19e8, 0x82a7, 0x19e2, 0x82a6, 0x19dc, 0x82a4, - 0x19d6, 0x82a3, 0x19d0, 0x82a2, 0x19ca, 0x82a0, 0x19c3, 0x829f, - 0x19bd, 0x829e, 0x19b7, 0x829d, 0x19b1, 0x829b, 0x19ab, 0x829a, - 0x19a5, 0x8299, 0x199f, 0x8298, 0x1998, 0x8296, 0x1992, 0x8295, - 0x198c, 0x8294, 0x1986, 0x8293, 0x1980, 0x8291, 0x197a, 0x8290, - 0x1973, 0x828f, 0x196d, 0x828e, 0x1967, 0x828c, 0x1961, 0x828b, - 0x195b, 0x828a, 0x1955, 0x8289, 0x194e, 0x8287, 0x1948, 0x8286, - 0x1942, 0x8285, 0x193c, 0x8284, 0x1936, 0x8282, 0x1930, 0x8281, - 0x192a, 0x8280, 0x1923, 0x827f, 0x191d, 0x827e, 0x1917, 0x827c, - 0x1911, 0x827b, 0x190b, 0x827a, 0x1905, 0x8279, 0x18fe, 0x8277, - 0x18f8, 0x8276, 0x18f2, 0x8275, 0x18ec, 0x8274, 0x18e6, 0x8272, - 0x18e0, 0x8271, 0x18d9, 0x8270, 0x18d3, 0x826f, 0x18cd, 0x826e, - 0x18c7, 0x826c, 0x18c1, 0x826b, 0x18bb, 0x826a, 0x18b4, 0x8269, - 0x18ae, 0x8268, 0x18a8, 0x8266, 0x18a2, 0x8265, 0x189c, 0x8264, - 0x1896, 0x8263, 0x188f, 0x8261, 0x1889, 0x8260, 0x1883, 0x825f, - 0x187d, 0x825e, 0x1877, 0x825d, 0x1871, 0x825b, 0x186a, 0x825a, - 0x1864, 0x8259, 0x185e, 0x8258, 0x1858, 0x8257, 0x1852, 0x8255, - 0x184c, 0x8254, 0x1845, 0x8253, 0x183f, 0x8252, 0x1839, 0x8251, - 0x1833, 0x8250, 0x182d, 0x824e, 0x1827, 0x824d, 0x1820, 0x824c, - 0x181a, 0x824b, 0x1814, 0x824a, 0x180e, 0x8248, 0x1808, 0x8247, - 0x1802, 0x8246, 0x17fb, 0x8245, 0x17f5, 0x8244, 0x17ef, 0x8243, - 0x17e9, 0x8241, 0x17e3, 0x8240, 0x17dd, 0x823f, 0x17d6, 0x823e, - 0x17d0, 0x823d, 0x17ca, 0x823b, 0x17c4, 0x823a, 0x17be, 0x8239, - 0x17b7, 0x8238, 0x17b1, 0x8237, 0x17ab, 0x8236, 0x17a5, 0x8234, - 0x179f, 0x8233, 0x1799, 0x8232, 0x1792, 0x8231, 0x178c, 0x8230, - 0x1786, 0x822f, 0x1780, 0x822e, 0x177a, 0x822c, 0x1774, 0x822b, - 0x176d, 0x822a, 0x1767, 0x8229, 0x1761, 0x8228, 0x175b, 0x8227, - 0x1755, 0x8226, 0x174e, 0x8224, 0x1748, 0x8223, 0x1742, 0x8222, - 0x173c, 0x8221, 0x1736, 0x8220, 0x1730, 0x821f, 0x1729, 0x821e, - 0x1723, 0x821c, 0x171d, 0x821b, 0x1717, 0x821a, 0x1711, 0x8219, - 0x170a, 0x8218, 0x1704, 0x8217, 0x16fe, 0x8216, 0x16f8, 0x8214, - 0x16f2, 0x8213, 0x16ec, 0x8212, 0x16e5, 0x8211, 0x16df, 0x8210, - 0x16d9, 0x820f, 0x16d3, 0x820e, 0x16cd, 0x820d, 0x16c6, 0x820b, - 0x16c0, 0x820a, 0x16ba, 0x8209, 0x16b4, 0x8208, 0x16ae, 0x8207, - 0x16a8, 0x8206, 0x16a1, 0x8205, 0x169b, 0x8204, 0x1695, 0x8203, - 0x168f, 0x8201, 0x1689, 0x8200, 0x1682, 0x81ff, 0x167c, 0x81fe, - 0x1676, 0x81fd, 0x1670, 0x81fc, 0x166a, 0x81fb, 0x1664, 0x81fa, - 0x165d, 0x81f9, 0x1657, 0x81f8, 0x1651, 0x81f6, 0x164b, 0x81f5, - 0x1645, 0x81f4, 0x163e, 0x81f3, 0x1638, 0x81f2, 0x1632, 0x81f1, - 0x162c, 0x81f0, 0x1626, 0x81ef, 0x161f, 0x81ee, 0x1619, 0x81ed, - 0x1613, 0x81ec, 0x160d, 0x81ea, 0x1607, 0x81e9, 0x1601, 0x81e8, - 0x15fa, 0x81e7, 0x15f4, 0x81e6, 0x15ee, 0x81e5, 0x15e8, 0x81e4, - 0x15e2, 0x81e3, 0x15db, 0x81e2, 0x15d5, 0x81e1, 0x15cf, 0x81e0, - 0x15c9, 0x81df, 0x15c3, 0x81de, 0x15bc, 0x81dc, 0x15b6, 0x81db, - 0x15b0, 0x81da, 0x15aa, 0x81d9, 0x15a4, 0x81d8, 0x159d, 0x81d7, - 0x1597, 0x81d6, 0x1591, 0x81d5, 0x158b, 0x81d4, 0x1585, 0x81d3, - 0x157f, 0x81d2, 0x1578, 0x81d1, 0x1572, 0x81d0, 0x156c, 0x81cf, - 0x1566, 0x81ce, 0x1560, 0x81cd, 0x1559, 0x81cc, 0x1553, 0x81cb, - 0x154d, 0x81c9, 0x1547, 0x81c8, 0x1541, 0x81c7, 0x153a, 0x81c6, - 0x1534, 0x81c5, 0x152e, 0x81c4, 0x1528, 0x81c3, 0x1522, 0x81c2, - 0x151b, 0x81c1, 0x1515, 0x81c0, 0x150f, 0x81bf, 0x1509, 0x81be, - 0x1503, 0x81bd, 0x14fc, 0x81bc, 0x14f6, 0x81bb, 0x14f0, 0x81ba, - 0x14ea, 0x81b9, 0x14e4, 0x81b8, 0x14dd, 0x81b7, 0x14d7, 0x81b6, - 0x14d1, 0x81b5, 0x14cb, 0x81b4, 0x14c5, 0x81b3, 0x14be, 0x81b2, - 0x14b8, 0x81b1, 0x14b2, 0x81b0, 0x14ac, 0x81af, 0x14a6, 0x81ae, - 0x149f, 0x81ad, 0x1499, 0x81ac, 0x1493, 0x81ab, 0x148d, 0x81aa, - 0x1487, 0x81a9, 0x1480, 0x81a8, 0x147a, 0x81a7, 0x1474, 0x81a6, - 0x146e, 0x81a5, 0x1468, 0x81a4, 0x1461, 0x81a3, 0x145b, 0x81a2, - 0x1455, 0x81a1, 0x144f, 0x81a0, 0x1449, 0x819f, 0x1442, 0x819e, - 0x143c, 0x819d, 0x1436, 0x819c, 0x1430, 0x819b, 0x142a, 0x819a, - 0x1423, 0x8199, 0x141d, 0x8198, 0x1417, 0x8197, 0x1411, 0x8196, - 0x140b, 0x8195, 0x1404, 0x8194, 0x13fe, 0x8193, 0x13f8, 0x8192, - 0x13f2, 0x8191, 0x13eb, 0x8190, 0x13e5, 0x818f, 0x13df, 0x818e, - 0x13d9, 0x818d, 0x13d3, 0x818c, 0x13cc, 0x818b, 0x13c6, 0x818a, - 0x13c0, 0x8189, 0x13ba, 0x8188, 0x13b4, 0x8187, 0x13ad, 0x8186, - 0x13a7, 0x8185, 0x13a1, 0x8184, 0x139b, 0x8183, 0x1395, 0x8182, - 0x138e, 0x8181, 0x1388, 0x8180, 0x1382, 0x817f, 0x137c, 0x817e, - 0x1376, 0x817d, 0x136f, 0x817c, 0x1369, 0x817c, 0x1363, 0x817b, - 0x135d, 0x817a, 0x1356, 0x8179, 0x1350, 0x8178, 0x134a, 0x8177, - 0x1344, 0x8176, 0x133e, 0x8175, 0x1337, 0x8174, 0x1331, 0x8173, - 0x132b, 0x8172, 0x1325, 0x8171, 0x131f, 0x8170, 0x1318, 0x816f, - 0x1312, 0x816e, 0x130c, 0x816d, 0x1306, 0x816c, 0x12ff, 0x816c, - 0x12f9, 0x816b, 0x12f3, 0x816a, 0x12ed, 0x8169, 0x12e7, 0x8168, - 0x12e0, 0x8167, 0x12da, 0x8166, 0x12d4, 0x8165, 0x12ce, 0x8164, - 0x12c8, 0x8163, 0x12c1, 0x8162, 0x12bb, 0x8161, 0x12b5, 0x8160, - 0x12af, 0x815f, 0x12a8, 0x815f, 0x12a2, 0x815e, 0x129c, 0x815d, - 0x1296, 0x815c, 0x1290, 0x815b, 0x1289, 0x815a, 0x1283, 0x8159, - 0x127d, 0x8158, 0x1277, 0x8157, 0x1271, 0x8156, 0x126a, 0x8155, - 0x1264, 0x8155, 0x125e, 0x8154, 0x1258, 0x8153, 0x1251, 0x8152, - 0x124b, 0x8151, 0x1245, 0x8150, 0x123f, 0x814f, 0x1239, 0x814e, - 0x1232, 0x814d, 0x122c, 0x814c, 0x1226, 0x814c, 0x1220, 0x814b, - 0x1219, 0x814a, 0x1213, 0x8149, 0x120d, 0x8148, 0x1207, 0x8147, - 0x1201, 0x8146, 0x11fa, 0x8145, 0x11f4, 0x8145, 0x11ee, 0x8144, - 0x11e8, 0x8143, 0x11e1, 0x8142, 0x11db, 0x8141, 0x11d5, 0x8140, - 0x11cf, 0x813f, 0x11c9, 0x813e, 0x11c2, 0x813d, 0x11bc, 0x813d, - 0x11b6, 0x813c, 0x11b0, 0x813b, 0x11a9, 0x813a, 0x11a3, 0x8139, - 0x119d, 0x8138, 0x1197, 0x8137, 0x1191, 0x8137, 0x118a, 0x8136, - 0x1184, 0x8135, 0x117e, 0x8134, 0x1178, 0x8133, 0x1171, 0x8132, - 0x116b, 0x8131, 0x1165, 0x8131, 0x115f, 0x8130, 0x1159, 0x812f, - 0x1152, 0x812e, 0x114c, 0x812d, 0x1146, 0x812c, 0x1140, 0x812b, - 0x1139, 0x812b, 0x1133, 0x812a, 0x112d, 0x8129, 0x1127, 0x8128, - 0x1121, 0x8127, 0x111a, 0x8126, 0x1114, 0x8126, 0x110e, 0x8125, - 0x1108, 0x8124, 0x1101, 0x8123, 0x10fb, 0x8122, 0x10f5, 0x8121, - 0x10ef, 0x8121, 0x10e8, 0x8120, 0x10e2, 0x811f, 0x10dc, 0x811e, - 0x10d6, 0x811d, 0x10d0, 0x811c, 0x10c9, 0x811c, 0x10c3, 0x811b, - 0x10bd, 0x811a, 0x10b7, 0x8119, 0x10b0, 0x8118, 0x10aa, 0x8117, - 0x10a4, 0x8117, 0x109e, 0x8116, 0x1098, 0x8115, 0x1091, 0x8114, - 0x108b, 0x8113, 0x1085, 0x8113, 0x107f, 0x8112, 0x1078, 0x8111, - 0x1072, 0x8110, 0x106c, 0x810f, 0x1066, 0x810f, 0x105f, 0x810e, - 0x1059, 0x810d, 0x1053, 0x810c, 0x104d, 0x810b, 0x1047, 0x810b, - 0x1040, 0x810a, 0x103a, 0x8109, 0x1034, 0x8108, 0x102e, 0x8107, - 0x1027, 0x8107, 0x1021, 0x8106, 0x101b, 0x8105, 0x1015, 0x8104, - 0x100e, 0x8103, 0x1008, 0x8103, 0x1002, 0x8102, 0xffc, 0x8101, - 0xff5, 0x8100, 0xfef, 0x80ff, 0xfe9, 0x80ff, 0xfe3, 0x80fe, - 0xfdd, 0x80fd, 0xfd6, 0x80fc, 0xfd0, 0x80fc, 0xfca, 0x80fb, - 0xfc4, 0x80fa, 0xfbd, 0x80f9, 0xfb7, 0x80f8, 0xfb1, 0x80f8, - 0xfab, 0x80f7, 0xfa4, 0x80f6, 0xf9e, 0x80f5, 0xf98, 0x80f5, - 0xf92, 0x80f4, 0xf8b, 0x80f3, 0xf85, 0x80f2, 0xf7f, 0x80f2, - 0xf79, 0x80f1, 0xf73, 0x80f0, 0xf6c, 0x80ef, 0xf66, 0x80ef, - 0xf60, 0x80ee, 0xf5a, 0x80ed, 0xf53, 0x80ec, 0xf4d, 0x80ec, - 0xf47, 0x80eb, 0xf41, 0x80ea, 0xf3a, 0x80e9, 0xf34, 0x80e9, - 0xf2e, 0x80e8, 0xf28, 0x80e7, 0xf21, 0x80e6, 0xf1b, 0x80e6, - 0xf15, 0x80e5, 0xf0f, 0x80e4, 0xf08, 0x80e3, 0xf02, 0x80e3, - 0xefc, 0x80e2, 0xef6, 0x80e1, 0xef0, 0x80e0, 0xee9, 0x80e0, - 0xee3, 0x80df, 0xedd, 0x80de, 0xed7, 0x80dd, 0xed0, 0x80dd, - 0xeca, 0x80dc, 0xec4, 0x80db, 0xebe, 0x80db, 0xeb7, 0x80da, - 0xeb1, 0x80d9, 0xeab, 0x80d8, 0xea5, 0x80d8, 0xe9e, 0x80d7, - 0xe98, 0x80d6, 0xe92, 0x80d6, 0xe8c, 0x80d5, 0xe85, 0x80d4, - 0xe7f, 0x80d3, 0xe79, 0x80d3, 0xe73, 0x80d2, 0xe6c, 0x80d1, - 0xe66, 0x80d1, 0xe60, 0x80d0, 0xe5a, 0x80cf, 0xe53, 0x80ce, - 0xe4d, 0x80ce, 0xe47, 0x80cd, 0xe41, 0x80cc, 0xe3a, 0x80cc, - 0xe34, 0x80cb, 0xe2e, 0x80ca, 0xe28, 0x80ca, 0xe22, 0x80c9, - 0xe1b, 0x80c8, 0xe15, 0x80c7, 0xe0f, 0x80c7, 0xe09, 0x80c6, - 0xe02, 0x80c5, 0xdfc, 0x80c5, 0xdf6, 0x80c4, 0xdf0, 0x80c3, - 0xde9, 0x80c3, 0xde3, 0x80c2, 0xddd, 0x80c1, 0xdd7, 0x80c1, - 0xdd0, 0x80c0, 0xdca, 0x80bf, 0xdc4, 0x80bf, 0xdbe, 0x80be, - 0xdb7, 0x80bd, 0xdb1, 0x80bd, 0xdab, 0x80bc, 0xda5, 0x80bb, - 0xd9e, 0x80bb, 0xd98, 0x80ba, 0xd92, 0x80b9, 0xd8c, 0x80b9, - 0xd85, 0x80b8, 0xd7f, 0x80b7, 0xd79, 0x80b7, 0xd73, 0x80b6, - 0xd6c, 0x80b5, 0xd66, 0x80b5, 0xd60, 0x80b4, 0xd5a, 0x80b3, - 0xd53, 0x80b3, 0xd4d, 0x80b2, 0xd47, 0x80b1, 0xd41, 0x80b1, - 0xd3a, 0x80b0, 0xd34, 0x80af, 0xd2e, 0x80af, 0xd28, 0x80ae, - 0xd21, 0x80ad, 0xd1b, 0x80ad, 0xd15, 0x80ac, 0xd0f, 0x80ab, - 0xd08, 0x80ab, 0xd02, 0x80aa, 0xcfc, 0x80aa, 0xcf6, 0x80a9, - 0xcef, 0x80a8, 0xce9, 0x80a8, 0xce3, 0x80a7, 0xcdd, 0x80a6, - 0xcd6, 0x80a6, 0xcd0, 0x80a5, 0xcca, 0x80a5, 0xcc4, 0x80a4, - 0xcbd, 0x80a3, 0xcb7, 0x80a3, 0xcb1, 0x80a2, 0xcab, 0x80a1, - 0xca4, 0x80a1, 0xc9e, 0x80a0, 0xc98, 0x80a0, 0xc92, 0x809f, - 0xc8b, 0x809e, 0xc85, 0x809e, 0xc7f, 0x809d, 0xc79, 0x809c, - 0xc72, 0x809c, 0xc6c, 0x809b, 0xc66, 0x809b, 0xc60, 0x809a, - 0xc59, 0x8099, 0xc53, 0x8099, 0xc4d, 0x8098, 0xc47, 0x8098, - 0xc40, 0x8097, 0xc3a, 0x8096, 0xc34, 0x8096, 0xc2e, 0x8095, - 0xc27, 0x8095, 0xc21, 0x8094, 0xc1b, 0x8093, 0xc14, 0x8093, - 0xc0e, 0x8092, 0xc08, 0x8092, 0xc02, 0x8091, 0xbfb, 0x8090, - 0xbf5, 0x8090, 0xbef, 0x808f, 0xbe9, 0x808f, 0xbe2, 0x808e, - 0xbdc, 0x808e, 0xbd6, 0x808d, 0xbd0, 0x808c, 0xbc9, 0x808c, - 0xbc3, 0x808b, 0xbbd, 0x808b, 0xbb7, 0x808a, 0xbb0, 0x8089, - 0xbaa, 0x8089, 0xba4, 0x8088, 0xb9e, 0x8088, 0xb97, 0x8087, - 0xb91, 0x8087, 0xb8b, 0x8086, 0xb85, 0x8085, 0xb7e, 0x8085, - 0xb78, 0x8084, 0xb72, 0x8084, 0xb6c, 0x8083, 0xb65, 0x8083, - 0xb5f, 0x8082, 0xb59, 0x8082, 0xb53, 0x8081, 0xb4c, 0x8080, - 0xb46, 0x8080, 0xb40, 0x807f, 0xb3a, 0x807f, 0xb33, 0x807e, - 0xb2d, 0x807e, 0xb27, 0x807d, 0xb20, 0x807d, 0xb1a, 0x807c, - 0xb14, 0x807b, 0xb0e, 0x807b, 0xb07, 0x807a, 0xb01, 0x807a, - 0xafb, 0x8079, 0xaf5, 0x8079, 0xaee, 0x8078, 0xae8, 0x8078, - 0xae2, 0x8077, 0xadc, 0x8077, 0xad5, 0x8076, 0xacf, 0x8076, - 0xac9, 0x8075, 0xac3, 0x8075, 0xabc, 0x8074, 0xab6, 0x8073, - 0xab0, 0x8073, 0xaaa, 0x8072, 0xaa3, 0x8072, 0xa9d, 0x8071, - 0xa97, 0x8071, 0xa90, 0x8070, 0xa8a, 0x8070, 0xa84, 0x806f, - 0xa7e, 0x806f, 0xa77, 0x806e, 0xa71, 0x806e, 0xa6b, 0x806d, - 0xa65, 0x806d, 0xa5e, 0x806c, 0xa58, 0x806c, 0xa52, 0x806b, - 0xa4c, 0x806b, 0xa45, 0x806a, 0xa3f, 0x806a, 0xa39, 0x8069, - 0xa33, 0x8069, 0xa2c, 0x8068, 0xa26, 0x8068, 0xa20, 0x8067, - 0xa19, 0x8067, 0xa13, 0x8066, 0xa0d, 0x8066, 0xa07, 0x8065, - 0xa00, 0x8065, 0x9fa, 0x8064, 0x9f4, 0x8064, 0x9ee, 0x8063, - 0x9e7, 0x8063, 0x9e1, 0x8062, 0x9db, 0x8062, 0x9d5, 0x8061, - 0x9ce, 0x8061, 0x9c8, 0x8060, 0x9c2, 0x8060, 0x9bc, 0x805f, - 0x9b5, 0x805f, 0x9af, 0x805e, 0x9a9, 0x805e, 0x9a2, 0x805d, - 0x99c, 0x805d, 0x996, 0x805d, 0x990, 0x805c, 0x989, 0x805c, - 0x983, 0x805b, 0x97d, 0x805b, 0x977, 0x805a, 0x970, 0x805a, - 0x96a, 0x8059, 0x964, 0x8059, 0x95e, 0x8058, 0x957, 0x8058, - 0x951, 0x8057, 0x94b, 0x8057, 0x944, 0x8057, 0x93e, 0x8056, - 0x938, 0x8056, 0x932, 0x8055, 0x92b, 0x8055, 0x925, 0x8054, - 0x91f, 0x8054, 0x919, 0x8053, 0x912, 0x8053, 0x90c, 0x8052, - 0x906, 0x8052, 0x900, 0x8052, 0x8f9, 0x8051, 0x8f3, 0x8051, - 0x8ed, 0x8050, 0x8e6, 0x8050, 0x8e0, 0x804f, 0x8da, 0x804f, - 0x8d4, 0x804f, 0x8cd, 0x804e, 0x8c7, 0x804e, 0x8c1, 0x804d, - 0x8bb, 0x804d, 0x8b4, 0x804c, 0x8ae, 0x804c, 0x8a8, 0x804c, - 0x8a2, 0x804b, 0x89b, 0x804b, 0x895, 0x804a, 0x88f, 0x804a, - 0x888, 0x8049, 0x882, 0x8049, 0x87c, 0x8049, 0x876, 0x8048, - 0x86f, 0x8048, 0x869, 0x8047, 0x863, 0x8047, 0x85d, 0x8047, - 0x856, 0x8046, 0x850, 0x8046, 0x84a, 0x8045, 0x843, 0x8045, - 0x83d, 0x8044, 0x837, 0x8044, 0x831, 0x8044, 0x82a, 0x8043, - 0x824, 0x8043, 0x81e, 0x8042, 0x818, 0x8042, 0x811, 0x8042, - 0x80b, 0x8041, 0x805, 0x8041, 0x7fe, 0x8040, 0x7f8, 0x8040, - 0x7f2, 0x8040, 0x7ec, 0x803f, 0x7e5, 0x803f, 0x7df, 0x803f, - 0x7d9, 0x803e, 0x7d3, 0x803e, 0x7cc, 0x803d, 0x7c6, 0x803d, - 0x7c0, 0x803d, 0x7ba, 0x803c, 0x7b3, 0x803c, 0x7ad, 0x803b, - 0x7a7, 0x803b, 0x7a0, 0x803b, 0x79a, 0x803a, 0x794, 0x803a, - 0x78e, 0x803a, 0x787, 0x8039, 0x781, 0x8039, 0x77b, 0x8039, - 0x775, 0x8038, 0x76e, 0x8038, 0x768, 0x8037, 0x762, 0x8037, - 0x75b, 0x8037, 0x755, 0x8036, 0x74f, 0x8036, 0x749, 0x8036, - 0x742, 0x8035, 0x73c, 0x8035, 0x736, 0x8035, 0x730, 0x8034, - 0x729, 0x8034, 0x723, 0x8033, 0x71d, 0x8033, 0x716, 0x8033, - 0x710, 0x8032, 0x70a, 0x8032, 0x704, 0x8032, 0x6fd, 0x8031, - 0x6f7, 0x8031, 0x6f1, 0x8031, 0x6ea, 0x8030, 0x6e4, 0x8030, - 0x6de, 0x8030, 0x6d8, 0x802f, 0x6d1, 0x802f, 0x6cb, 0x802f, - 0x6c5, 0x802e, 0x6bf, 0x802e, 0x6b8, 0x802e, 0x6b2, 0x802d, - 0x6ac, 0x802d, 0x6a5, 0x802d, 0x69f, 0x802c, 0x699, 0x802c, - 0x693, 0x802c, 0x68c, 0x802b, 0x686, 0x802b, 0x680, 0x802b, - 0x67a, 0x802a, 0x673, 0x802a, 0x66d, 0x802a, 0x667, 0x802a, - 0x660, 0x8029, 0x65a, 0x8029, 0x654, 0x8029, 0x64e, 0x8028, - 0x647, 0x8028, 0x641, 0x8028, 0x63b, 0x8027, 0x635, 0x8027, - 0x62e, 0x8027, 0x628, 0x8026, 0x622, 0x8026, 0x61b, 0x8026, - 0x615, 0x8026, 0x60f, 0x8025, 0x609, 0x8025, 0x602, 0x8025, - 0x5fc, 0x8024, 0x5f6, 0x8024, 0x5ef, 0x8024, 0x5e9, 0x8023, - 0x5e3, 0x8023, 0x5dd, 0x8023, 0x5d6, 0x8023, 0x5d0, 0x8022, - 0x5ca, 0x8022, 0x5c4, 0x8022, 0x5bd, 0x8021, 0x5b7, 0x8021, - 0x5b1, 0x8021, 0x5aa, 0x8021, 0x5a4, 0x8020, 0x59e, 0x8020, - 0x598, 0x8020, 0x591, 0x8020, 0x58b, 0x801f, 0x585, 0x801f, - 0x57f, 0x801f, 0x578, 0x801e, 0x572, 0x801e, 0x56c, 0x801e, - 0x565, 0x801e, 0x55f, 0x801d, 0x559, 0x801d, 0x553, 0x801d, - 0x54c, 0x801d, 0x546, 0x801c, 0x540, 0x801c, 0x539, 0x801c, - 0x533, 0x801c, 0x52d, 0x801b, 0x527, 0x801b, 0x520, 0x801b, - 0x51a, 0x801b, 0x514, 0x801a, 0x50d, 0x801a, 0x507, 0x801a, - 0x501, 0x801a, 0x4fb, 0x8019, 0x4f4, 0x8019, 0x4ee, 0x8019, - 0x4e8, 0x8019, 0x4e2, 0x8018, 0x4db, 0x8018, 0x4d5, 0x8018, - 0x4cf, 0x8018, 0x4c8, 0x8017, 0x4c2, 0x8017, 0x4bc, 0x8017, - 0x4b6, 0x8017, 0x4af, 0x8016, 0x4a9, 0x8016, 0x4a3, 0x8016, - 0x49c, 0x8016, 0x496, 0x8016, 0x490, 0x8015, 0x48a, 0x8015, - 0x483, 0x8015, 0x47d, 0x8015, 0x477, 0x8014, 0x471, 0x8014, - 0x46a, 0x8014, 0x464, 0x8014, 0x45e, 0x8014, 0x457, 0x8013, - 0x451, 0x8013, 0x44b, 0x8013, 0x445, 0x8013, 0x43e, 0x8013, - 0x438, 0x8012, 0x432, 0x8012, 0x42b, 0x8012, 0x425, 0x8012, - 0x41f, 0x8012, 0x419, 0x8011, 0x412, 0x8011, 0x40c, 0x8011, - 0x406, 0x8011, 0x3ff, 0x8011, 0x3f9, 0x8010, 0x3f3, 0x8010, - 0x3ed, 0x8010, 0x3e6, 0x8010, 0x3e0, 0x8010, 0x3da, 0x800f, - 0x3d4, 0x800f, 0x3cd, 0x800f, 0x3c7, 0x800f, 0x3c1, 0x800f, - 0x3ba, 0x800e, 0x3b4, 0x800e, 0x3ae, 0x800e, 0x3a8, 0x800e, - 0x3a1, 0x800e, 0x39b, 0x800e, 0x395, 0x800d, 0x38e, 0x800d, - 0x388, 0x800d, 0x382, 0x800d, 0x37c, 0x800d, 0x375, 0x800c, - 0x36f, 0x800c, 0x369, 0x800c, 0x362, 0x800c, 0x35c, 0x800c, - 0x356, 0x800c, 0x350, 0x800b, 0x349, 0x800b, 0x343, 0x800b, - 0x33d, 0x800b, 0x337, 0x800b, 0x330, 0x800b, 0x32a, 0x800b, - 0x324, 0x800a, 0x31d, 0x800a, 0x317, 0x800a, 0x311, 0x800a, - 0x30b, 0x800a, 0x304, 0x800a, 0x2fe, 0x8009, 0x2f8, 0x8009, - 0x2f1, 0x8009, 0x2eb, 0x8009, 0x2e5, 0x8009, 0x2df, 0x8009, - 0x2d8, 0x8009, 0x2d2, 0x8008, 0x2cc, 0x8008, 0x2c5, 0x8008, - 0x2bf, 0x8008, 0x2b9, 0x8008, 0x2b3, 0x8008, 0x2ac, 0x8008, - 0x2a6, 0x8008, 0x2a0, 0x8007, 0x299, 0x8007, 0x293, 0x8007, - 0x28d, 0x8007, 0x287, 0x8007, 0x280, 0x8007, 0x27a, 0x8007, - 0x274, 0x8007, 0x26d, 0x8006, 0x267, 0x8006, 0x261, 0x8006, - 0x25b, 0x8006, 0x254, 0x8006, 0x24e, 0x8006, 0x248, 0x8006, - 0x242, 0x8006, 0x23b, 0x8005, 0x235, 0x8005, 0x22f, 0x8005, - 0x228, 0x8005, 0x222, 0x8005, 0x21c, 0x8005, 0x216, 0x8005, - 0x20f, 0x8005, 0x209, 0x8005, 0x203, 0x8005, 0x1fc, 0x8004, - 0x1f6, 0x8004, 0x1f0, 0x8004, 0x1ea, 0x8004, 0x1e3, 0x8004, - 0x1dd, 0x8004, 0x1d7, 0x8004, 0x1d0, 0x8004, 0x1ca, 0x8004, - 0x1c4, 0x8004, 0x1be, 0x8004, 0x1b7, 0x8003, 0x1b1, 0x8003, - 0x1ab, 0x8003, 0x1a4, 0x8003, 0x19e, 0x8003, 0x198, 0x8003, - 0x192, 0x8003, 0x18b, 0x8003, 0x185, 0x8003, 0x17f, 0x8003, - 0x178, 0x8003, 0x172, 0x8003, 0x16c, 0x8003, 0x166, 0x8002, - 0x15f, 0x8002, 0x159, 0x8002, 0x153, 0x8002, 0x14d, 0x8002, - 0x146, 0x8002, 0x140, 0x8002, 0x13a, 0x8002, 0x133, 0x8002, - 0x12d, 0x8002, 0x127, 0x8002, 0x121, 0x8002, 0x11a, 0x8002, - 0x114, 0x8002, 0x10e, 0x8002, 0x107, 0x8002, 0x101, 0x8002, - 0xfb, 0x8001, 0xf5, 0x8001, 0xee, 0x8001, 0xe8, 0x8001, - 0xe2, 0x8001, 0xdb, 0x8001, 0xd5, 0x8001, 0xcf, 0x8001, - 0xc9, 0x8001, 0xc2, 0x8001, 0xbc, 0x8001, 0xb6, 0x8001, - 0xaf, 0x8001, 0xa9, 0x8001, 0xa3, 0x8001, 0x9d, 0x8001, - 0x96, 0x8001, 0x90, 0x8001, 0x8a, 0x8001, 0x83, 0x8001, - 0x7d, 0x8001, 0x77, 0x8001, 0x71, 0x8001, 0x6a, 0x8001, - 0x64, 0x8001, 0x5e, 0x8001, 0x57, 0x8001, 0x51, 0x8001, - 0x4b, 0x8001, 0x45, 0x8001, 0x3e, 0x8001, 0x38, 0x8001, - 0x32, 0x8001, 0x2b, 0x8001, 0x25, 0x8001, 0x1f, 0x8001, - 0x19, 0x8001, 0x12, 0x8001, 0xc, 0x8001, 0x6, 0x8001, -}; - - -/** -* \par -* cosFactor tables are generated using the formula :
 cos_factors[n] = 2 * cos((2n+1)*pi/(4*N)) 
-* \par -* C command to generate the table -*
    
-* for(i = 0; i< N; i++)    
-* {    
-*   cos_factors[i]= 2 * cos((2*i+1)*c/2);    
-* } 
-* \par -* where N is the number of factors to generate and c is pi/(2*N) -* \par -* Then converted to q15 format by multiplying with 2^31 and saturated if required. - -*/ - -static const q15_t ALIGN4 cos_factorsQ15_128[128] = { - 0x7fff, 0x7ffa, 0x7ff0, 0x7fe1, 0x7fce, 0x7fb5, 0x7f97, 0x7f75, - 0x7f4d, 0x7f21, 0x7ef0, 0x7eba, 0x7e7f, 0x7e3f, 0x7dfa, 0x7db0, - 0x7d62, 0x7d0f, 0x7cb7, 0x7c5a, 0x7bf8, 0x7b92, 0x7b26, 0x7ab6, - 0x7a42, 0x79c8, 0x794a, 0x78c7, 0x7840, 0x77b4, 0x7723, 0x768e, - 0x75f4, 0x7555, 0x74b2, 0x740b, 0x735f, 0x72af, 0x71fa, 0x7141, - 0x7083, 0x6fc1, 0x6efb, 0x6e30, 0x6d62, 0x6c8f, 0x6bb8, 0x6adc, - 0x69fd, 0x6919, 0x6832, 0x6746, 0x6657, 0x6563, 0x646c, 0x6371, - 0x6271, 0x616f, 0x6068, 0x5f5e, 0x5e50, 0x5d3e, 0x5c29, 0x5b10, - 0x59f3, 0x58d4, 0x57b0, 0x568a, 0x5560, 0x5433, 0x5302, 0x51ce, - 0x5097, 0x4f5e, 0x4e21, 0x4ce1, 0x4b9e, 0x4a58, 0x490f, 0x47c3, - 0x4675, 0x4524, 0x43d0, 0x427a, 0x4121, 0x3fc5, 0x3e68, 0x3d07, - 0x3ba5, 0x3a40, 0x38d8, 0x376f, 0x3604, 0x3496, 0x3326, 0x31b5, - 0x3041, 0x2ecc, 0x2d55, 0x2bdc, 0x2a61, 0x28e5, 0x2767, 0x25e8, - 0x2467, 0x22e5, 0x2161, 0x1fdc, 0x1e56, 0x1ccf, 0x1b47, 0x19bd, - 0x1833, 0x16a8, 0x151b, 0x138e, 0x1201, 0x1072, 0xee3, 0xd53, - 0xbc3, 0xa33, 0x8a2, 0x710, 0x57f, 0x3ed, 0x25b, 0xc9 -}; - -static const q15_t ALIGN4 cos_factorsQ15_512[512] = { - 0x7fff, 0x7fff, 0x7fff, 0x7ffe, 0x7ffc, 0x7ffb, 0x7ff9, 0x7ff7, - 0x7ff4, 0x7ff2, 0x7fee, 0x7feb, 0x7fe7, 0x7fe3, 0x7fdf, 0x7fda, - 0x7fd6, 0x7fd0, 0x7fcb, 0x7fc5, 0x7fbf, 0x7fb8, 0x7fb1, 0x7faa, - 0x7fa3, 0x7f9b, 0x7f93, 0x7f8b, 0x7f82, 0x7f79, 0x7f70, 0x7f67, - 0x7f5d, 0x7f53, 0x7f48, 0x7f3d, 0x7f32, 0x7f27, 0x7f1b, 0x7f0f, - 0x7f03, 0x7ef6, 0x7ee9, 0x7edc, 0x7ecf, 0x7ec1, 0x7eb3, 0x7ea4, - 0x7e95, 0x7e86, 0x7e77, 0x7e67, 0x7e57, 0x7e47, 0x7e37, 0x7e26, - 0x7e14, 0x7e03, 0x7df1, 0x7ddf, 0x7dcd, 0x7dba, 0x7da7, 0x7d94, - 0x7d80, 0x7d6c, 0x7d58, 0x7d43, 0x7d2f, 0x7d19, 0x7d04, 0x7cee, - 0x7cd8, 0x7cc2, 0x7cab, 0x7c94, 0x7c7d, 0x7c66, 0x7c4e, 0x7c36, - 0x7c1d, 0x7c05, 0x7beb, 0x7bd2, 0x7bb9, 0x7b9f, 0x7b84, 0x7b6a, - 0x7b4f, 0x7b34, 0x7b19, 0x7afd, 0x7ae1, 0x7ac5, 0x7aa8, 0x7a8b, - 0x7a6e, 0x7a50, 0x7a33, 0x7a15, 0x79f6, 0x79d8, 0x79b9, 0x7999, - 0x797a, 0x795a, 0x793a, 0x7919, 0x78f9, 0x78d8, 0x78b6, 0x7895, - 0x7873, 0x7851, 0x782e, 0x780c, 0x77e9, 0x77c5, 0x77a2, 0x777e, - 0x775a, 0x7735, 0x7710, 0x76eb, 0x76c6, 0x76a0, 0x767b, 0x7654, - 0x762e, 0x7607, 0x75e0, 0x75b9, 0x7591, 0x7569, 0x7541, 0x7519, - 0x74f0, 0x74c7, 0x749e, 0x7474, 0x744a, 0x7420, 0x73f6, 0x73cb, - 0x73a0, 0x7375, 0x7349, 0x731d, 0x72f1, 0x72c5, 0x7298, 0x726b, - 0x723e, 0x7211, 0x71e3, 0x71b5, 0x7186, 0x7158, 0x7129, 0x70fa, - 0x70cb, 0x709b, 0x706b, 0x703b, 0x700a, 0x6fda, 0x6fa9, 0x6f77, - 0x6f46, 0x6f14, 0x6ee2, 0x6eaf, 0x6e7d, 0x6e4a, 0x6e17, 0x6de3, - 0x6db0, 0x6d7c, 0x6d48, 0x6d13, 0x6cde, 0x6ca9, 0x6c74, 0x6c3f, - 0x6c09, 0x6bd3, 0x6b9c, 0x6b66, 0x6b2f, 0x6af8, 0x6ac1, 0x6a89, - 0x6a51, 0x6a19, 0x69e1, 0x69a8, 0x696f, 0x6936, 0x68fd, 0x68c3, - 0x6889, 0x684f, 0x6815, 0x67da, 0x679f, 0x6764, 0x6729, 0x66ed, - 0x66b1, 0x6675, 0x6639, 0x65fc, 0x65bf, 0x6582, 0x6545, 0x6507, - 0x64c9, 0x648b, 0x644d, 0x640e, 0x63cf, 0x6390, 0x6351, 0x6311, - 0x62d2, 0x6292, 0x6251, 0x6211, 0x61d0, 0x618f, 0x614e, 0x610d, - 0x60cb, 0x6089, 0x6047, 0x6004, 0x5fc2, 0x5f7f, 0x5f3c, 0x5ef9, - 0x5eb5, 0x5e71, 0x5e2d, 0x5de9, 0x5da5, 0x5d60, 0x5d1b, 0x5cd6, - 0x5c91, 0x5c4b, 0x5c06, 0x5bc0, 0x5b79, 0x5b33, 0x5aec, 0x5aa5, - 0x5a5e, 0x5a17, 0x59d0, 0x5988, 0x5940, 0x58f8, 0x58af, 0x5867, - 0x581e, 0x57d5, 0x578c, 0x5742, 0x56f9, 0x56af, 0x5665, 0x561a, - 0x55d0, 0x5585, 0x553a, 0x54ef, 0x54a4, 0x5458, 0x540d, 0x53c1, - 0x5375, 0x5328, 0x52dc, 0x528f, 0x5242, 0x51f5, 0x51a8, 0x515a, - 0x510c, 0x50bf, 0x5070, 0x5022, 0x4fd4, 0x4f85, 0x4f36, 0x4ee7, - 0x4e98, 0x4e48, 0x4df9, 0x4da9, 0x4d59, 0x4d09, 0x4cb8, 0x4c68, - 0x4c17, 0x4bc6, 0x4b75, 0x4b24, 0x4ad2, 0x4a81, 0x4a2f, 0x49dd, - 0x498a, 0x4938, 0x48e6, 0x4893, 0x4840, 0x47ed, 0x479a, 0x4746, - 0x46f3, 0x469f, 0x464b, 0x45f7, 0x45a3, 0x454e, 0x44fa, 0x44a5, - 0x4450, 0x43fb, 0x43a5, 0x4350, 0x42fa, 0x42a5, 0x424f, 0x41f9, - 0x41a2, 0x414c, 0x40f6, 0x409f, 0x4048, 0x3ff1, 0x3f9a, 0x3f43, - 0x3eeb, 0x3e93, 0x3e3c, 0x3de4, 0x3d8c, 0x3d33, 0x3cdb, 0x3c83, - 0x3c2a, 0x3bd1, 0x3b78, 0x3b1f, 0x3ac6, 0x3a6c, 0x3a13, 0x39b9, - 0x395f, 0x3906, 0x38ab, 0x3851, 0x37f7, 0x379c, 0x3742, 0x36e7, - 0x368c, 0x3631, 0x35d6, 0x357b, 0x351f, 0x34c4, 0x3468, 0x340c, - 0x33b0, 0x3354, 0x32f8, 0x329c, 0x3240, 0x31e3, 0x3186, 0x312a, - 0x30cd, 0x3070, 0x3013, 0x2fb5, 0x2f58, 0x2efb, 0x2e9d, 0x2e3f, - 0x2de2, 0x2d84, 0x2d26, 0x2cc8, 0x2c69, 0x2c0b, 0x2bad, 0x2b4e, - 0x2aef, 0x2a91, 0x2a32, 0x29d3, 0x2974, 0x2915, 0x28b5, 0x2856, - 0x27f6, 0x2797, 0x2737, 0x26d8, 0x2678, 0x2618, 0x25b8, 0x2558, - 0x24f7, 0x2497, 0x2437, 0x23d6, 0x2376, 0x2315, 0x22b4, 0x2254, - 0x21f3, 0x2192, 0x2131, 0x20d0, 0x206e, 0x200d, 0x1fac, 0x1f4a, - 0x1ee9, 0x1e87, 0x1e25, 0x1dc4, 0x1d62, 0x1d00, 0x1c9e, 0x1c3c, - 0x1bda, 0x1b78, 0x1b16, 0x1ab3, 0x1a51, 0x19ef, 0x198c, 0x192a, - 0x18c7, 0x1864, 0x1802, 0x179f, 0x173c, 0x16d9, 0x1676, 0x1613, - 0x15b0, 0x154d, 0x14ea, 0x1487, 0x1423, 0x13c0, 0x135d, 0x12f9, - 0x1296, 0x1232, 0x11cf, 0x116b, 0x1108, 0x10a4, 0x1040, 0xfdd, - 0xf79, 0xf15, 0xeb1, 0xe4d, 0xde9, 0xd85, 0xd21, 0xcbd, - 0xc59, 0xbf5, 0xb91, 0xb2d, 0xac9, 0xa65, 0xa00, 0x99c, - 0x938, 0x8d4, 0x86f, 0x80b, 0x7a7, 0x742, 0x6de, 0x67a, - 0x615, 0x5b1, 0x54c, 0x4e8, 0x483, 0x41f, 0x3ba, 0x356, - 0x2f1, 0x28d, 0x228, 0x1c4, 0x15f, 0xfb, 0x96, 0x32, -}; - -static const q15_t ALIGN4 cos_factorsQ15_2048[2048] = { - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffd, 0x7ffd, - 0x7ffd, 0x7ffd, 0x7ffc, 0x7ffc, 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffa, - 0x7ffa, 0x7ff9, 0x7ff9, 0x7ff8, 0x7ff8, 0x7ff7, 0x7ff7, 0x7ff6, - 0x7ff5, 0x7ff5, 0x7ff4, 0x7ff3, 0x7ff3, 0x7ff2, 0x7ff1, 0x7ff0, - 0x7ff0, 0x7fef, 0x7fee, 0x7fed, 0x7fec, 0x7fec, 0x7feb, 0x7fea, - 0x7fe9, 0x7fe8, 0x7fe7, 0x7fe6, 0x7fe5, 0x7fe4, 0x7fe3, 0x7fe2, - 0x7fe1, 0x7fe0, 0x7fdf, 0x7fdd, 0x7fdc, 0x7fdb, 0x7fda, 0x7fd9, - 0x7fd7, 0x7fd6, 0x7fd5, 0x7fd4, 0x7fd2, 0x7fd1, 0x7fd0, 0x7fce, - 0x7fcd, 0x7fcb, 0x7fca, 0x7fc9, 0x7fc7, 0x7fc6, 0x7fc4, 0x7fc3, - 0x7fc1, 0x7fc0, 0x7fbe, 0x7fbc, 0x7fbb, 0x7fb9, 0x7fb7, 0x7fb6, - 0x7fb4, 0x7fb2, 0x7fb1, 0x7faf, 0x7fad, 0x7fab, 0x7fa9, 0x7fa8, - 0x7fa6, 0x7fa4, 0x7fa2, 0x7fa0, 0x7f9e, 0x7f9c, 0x7f9a, 0x7f98, - 0x7f96, 0x7f94, 0x7f92, 0x7f90, 0x7f8e, 0x7f8c, 0x7f8a, 0x7f88, - 0x7f86, 0x7f83, 0x7f81, 0x7f7f, 0x7f7d, 0x7f7b, 0x7f78, 0x7f76, - 0x7f74, 0x7f71, 0x7f6f, 0x7f6d, 0x7f6a, 0x7f68, 0x7f65, 0x7f63, - 0x7f60, 0x7f5e, 0x7f5b, 0x7f59, 0x7f56, 0x7f54, 0x7f51, 0x7f4f, - 0x7f4c, 0x7f49, 0x7f47, 0x7f44, 0x7f41, 0x7f3f, 0x7f3c, 0x7f39, - 0x7f36, 0x7f34, 0x7f31, 0x7f2e, 0x7f2b, 0x7f28, 0x7f25, 0x7f23, - 0x7f20, 0x7f1d, 0x7f1a, 0x7f17, 0x7f14, 0x7f11, 0x7f0e, 0x7f0b, - 0x7f08, 0x7f04, 0x7f01, 0x7efe, 0x7efb, 0x7ef8, 0x7ef5, 0x7ef1, - 0x7eee, 0x7eeb, 0x7ee8, 0x7ee4, 0x7ee1, 0x7ede, 0x7eda, 0x7ed7, - 0x7ed4, 0x7ed0, 0x7ecd, 0x7ec9, 0x7ec6, 0x7ec3, 0x7ebf, 0x7ebb, - 0x7eb8, 0x7eb4, 0x7eb1, 0x7ead, 0x7eaa, 0x7ea6, 0x7ea2, 0x7e9f, - 0x7e9b, 0x7e97, 0x7e94, 0x7e90, 0x7e8c, 0x7e88, 0x7e84, 0x7e81, - 0x7e7d, 0x7e79, 0x7e75, 0x7e71, 0x7e6d, 0x7e69, 0x7e65, 0x7e61, - 0x7e5d, 0x7e59, 0x7e55, 0x7e51, 0x7e4d, 0x7e49, 0x7e45, 0x7e41, - 0x7e3d, 0x7e39, 0x7e34, 0x7e30, 0x7e2c, 0x7e28, 0x7e24, 0x7e1f, - 0x7e1b, 0x7e17, 0x7e12, 0x7e0e, 0x7e0a, 0x7e05, 0x7e01, 0x7dfc, - 0x7df8, 0x7df3, 0x7def, 0x7dea, 0x7de6, 0x7de1, 0x7ddd, 0x7dd8, - 0x7dd4, 0x7dcf, 0x7dca, 0x7dc6, 0x7dc1, 0x7dbc, 0x7db8, 0x7db3, - 0x7dae, 0x7da9, 0x7da5, 0x7da0, 0x7d9b, 0x7d96, 0x7d91, 0x7d8c, - 0x7d87, 0x7d82, 0x7d7e, 0x7d79, 0x7d74, 0x7d6f, 0x7d6a, 0x7d65, - 0x7d60, 0x7d5a, 0x7d55, 0x7d50, 0x7d4b, 0x7d46, 0x7d41, 0x7d3c, - 0x7d36, 0x7d31, 0x7d2c, 0x7d27, 0x7d21, 0x7d1c, 0x7d17, 0x7d11, - 0x7d0c, 0x7d07, 0x7d01, 0x7cfc, 0x7cf6, 0x7cf1, 0x7cec, 0x7ce6, - 0x7ce1, 0x7cdb, 0x7cd5, 0x7cd0, 0x7cca, 0x7cc5, 0x7cbf, 0x7cb9, - 0x7cb4, 0x7cae, 0x7ca8, 0x7ca3, 0x7c9d, 0x7c97, 0x7c91, 0x7c8c, - 0x7c86, 0x7c80, 0x7c7a, 0x7c74, 0x7c6e, 0x7c69, 0x7c63, 0x7c5d, - 0x7c57, 0x7c51, 0x7c4b, 0x7c45, 0x7c3f, 0x7c39, 0x7c33, 0x7c2d, - 0x7c26, 0x7c20, 0x7c1a, 0x7c14, 0x7c0e, 0x7c08, 0x7c01, 0x7bfb, - 0x7bf5, 0x7bef, 0x7be8, 0x7be2, 0x7bdc, 0x7bd5, 0x7bcf, 0x7bc9, - 0x7bc2, 0x7bbc, 0x7bb5, 0x7baf, 0x7ba8, 0x7ba2, 0x7b9b, 0x7b95, - 0x7b8e, 0x7b88, 0x7b81, 0x7b7a, 0x7b74, 0x7b6d, 0x7b67, 0x7b60, - 0x7b59, 0x7b52, 0x7b4c, 0x7b45, 0x7b3e, 0x7b37, 0x7b31, 0x7b2a, - 0x7b23, 0x7b1c, 0x7b15, 0x7b0e, 0x7b07, 0x7b00, 0x7af9, 0x7af2, - 0x7aeb, 0x7ae4, 0x7add, 0x7ad6, 0x7acf, 0x7ac8, 0x7ac1, 0x7aba, - 0x7ab3, 0x7aac, 0x7aa4, 0x7a9d, 0x7a96, 0x7a8f, 0x7a87, 0x7a80, - 0x7a79, 0x7a72, 0x7a6a, 0x7a63, 0x7a5c, 0x7a54, 0x7a4d, 0x7a45, - 0x7a3e, 0x7a36, 0x7a2f, 0x7a27, 0x7a20, 0x7a18, 0x7a11, 0x7a09, - 0x7a02, 0x79fa, 0x79f2, 0x79eb, 0x79e3, 0x79db, 0x79d4, 0x79cc, - 0x79c4, 0x79bc, 0x79b5, 0x79ad, 0x79a5, 0x799d, 0x7995, 0x798e, - 0x7986, 0x797e, 0x7976, 0x796e, 0x7966, 0x795e, 0x7956, 0x794e, - 0x7946, 0x793e, 0x7936, 0x792e, 0x7926, 0x791e, 0x7915, 0x790d, - 0x7905, 0x78fd, 0x78f5, 0x78ec, 0x78e4, 0x78dc, 0x78d4, 0x78cb, - 0x78c3, 0x78bb, 0x78b2, 0x78aa, 0x78a2, 0x7899, 0x7891, 0x7888, - 0x7880, 0x7877, 0x786f, 0x7866, 0x785e, 0x7855, 0x784d, 0x7844, - 0x783b, 0x7833, 0x782a, 0x7821, 0x7819, 0x7810, 0x7807, 0x77ff, - 0x77f6, 0x77ed, 0x77e4, 0x77db, 0x77d3, 0x77ca, 0x77c1, 0x77b8, - 0x77af, 0x77a6, 0x779d, 0x7794, 0x778b, 0x7782, 0x7779, 0x7770, - 0x7767, 0x775e, 0x7755, 0x774c, 0x7743, 0x773a, 0x7731, 0x7727, - 0x771e, 0x7715, 0x770c, 0x7703, 0x76f9, 0x76f0, 0x76e7, 0x76dd, - 0x76d4, 0x76cb, 0x76c1, 0x76b8, 0x76af, 0x76a5, 0x769c, 0x7692, - 0x7689, 0x767f, 0x7676, 0x766c, 0x7663, 0x7659, 0x7650, 0x7646, - 0x763c, 0x7633, 0x7629, 0x761f, 0x7616, 0x760c, 0x7602, 0x75f9, - 0x75ef, 0x75e5, 0x75db, 0x75d1, 0x75c8, 0x75be, 0x75b4, 0x75aa, - 0x75a0, 0x7596, 0x758c, 0x7582, 0x7578, 0x756e, 0x7564, 0x755a, - 0x7550, 0x7546, 0x753c, 0x7532, 0x7528, 0x751e, 0x7514, 0x7509, - 0x74ff, 0x74f5, 0x74eb, 0x74e1, 0x74d6, 0x74cc, 0x74c2, 0x74b7, - 0x74ad, 0x74a3, 0x7498, 0x748e, 0x7484, 0x7479, 0x746f, 0x7464, - 0x745a, 0x744f, 0x7445, 0x743a, 0x7430, 0x7425, 0x741b, 0x7410, - 0x7406, 0x73fb, 0x73f0, 0x73e6, 0x73db, 0x73d0, 0x73c6, 0x73bb, - 0x73b0, 0x73a5, 0x739b, 0x7390, 0x7385, 0x737a, 0x736f, 0x7364, - 0x7359, 0x734f, 0x7344, 0x7339, 0x732e, 0x7323, 0x7318, 0x730d, - 0x7302, 0x72f7, 0x72ec, 0x72e1, 0x72d5, 0x72ca, 0x72bf, 0x72b4, - 0x72a9, 0x729e, 0x7293, 0x7287, 0x727c, 0x7271, 0x7266, 0x725a, - 0x724f, 0x7244, 0x7238, 0x722d, 0x7222, 0x7216, 0x720b, 0x71ff, - 0x71f4, 0x71e9, 0x71dd, 0x71d2, 0x71c6, 0x71bb, 0x71af, 0x71a3, - 0x7198, 0x718c, 0x7181, 0x7175, 0x7169, 0x715e, 0x7152, 0x7146, - 0x713b, 0x712f, 0x7123, 0x7117, 0x710c, 0x7100, 0x70f4, 0x70e8, - 0x70dc, 0x70d1, 0x70c5, 0x70b9, 0x70ad, 0x70a1, 0x7095, 0x7089, - 0x707d, 0x7071, 0x7065, 0x7059, 0x704d, 0x7041, 0x7035, 0x7029, - 0x701d, 0x7010, 0x7004, 0x6ff8, 0x6fec, 0x6fe0, 0x6fd3, 0x6fc7, - 0x6fbb, 0x6faf, 0x6fa2, 0x6f96, 0x6f8a, 0x6f7d, 0x6f71, 0x6f65, - 0x6f58, 0x6f4c, 0x6f3f, 0x6f33, 0x6f27, 0x6f1a, 0x6f0e, 0x6f01, - 0x6ef5, 0x6ee8, 0x6edc, 0x6ecf, 0x6ec2, 0x6eb6, 0x6ea9, 0x6e9c, - 0x6e90, 0x6e83, 0x6e76, 0x6e6a, 0x6e5d, 0x6e50, 0x6e44, 0x6e37, - 0x6e2a, 0x6e1d, 0x6e10, 0x6e04, 0x6df7, 0x6dea, 0x6ddd, 0x6dd0, - 0x6dc3, 0x6db6, 0x6da9, 0x6d9c, 0x6d8f, 0x6d82, 0x6d75, 0x6d68, - 0x6d5b, 0x6d4e, 0x6d41, 0x6d34, 0x6d27, 0x6d1a, 0x6d0c, 0x6cff, - 0x6cf2, 0x6ce5, 0x6cd8, 0x6cca, 0x6cbd, 0x6cb0, 0x6ca3, 0x6c95, - 0x6c88, 0x6c7b, 0x6c6d, 0x6c60, 0x6c53, 0x6c45, 0x6c38, 0x6c2a, - 0x6c1d, 0x6c0f, 0x6c02, 0x6bf5, 0x6be7, 0x6bd9, 0x6bcc, 0x6bbe, - 0x6bb1, 0x6ba3, 0x6b96, 0x6b88, 0x6b7a, 0x6b6d, 0x6b5f, 0x6b51, - 0x6b44, 0x6b36, 0x6b28, 0x6b1a, 0x6b0d, 0x6aff, 0x6af1, 0x6ae3, - 0x6ad5, 0x6ac8, 0x6aba, 0x6aac, 0x6a9e, 0x6a90, 0x6a82, 0x6a74, - 0x6a66, 0x6a58, 0x6a4a, 0x6a3c, 0x6a2e, 0x6a20, 0x6a12, 0x6a04, - 0x69f6, 0x69e8, 0x69da, 0x69cb, 0x69bd, 0x69af, 0x69a1, 0x6993, - 0x6985, 0x6976, 0x6968, 0x695a, 0x694b, 0x693d, 0x692f, 0x6921, - 0x6912, 0x6904, 0x68f5, 0x68e7, 0x68d9, 0x68ca, 0x68bc, 0x68ad, - 0x689f, 0x6890, 0x6882, 0x6873, 0x6865, 0x6856, 0x6848, 0x6839, - 0x682b, 0x681c, 0x680d, 0x67ff, 0x67f0, 0x67e1, 0x67d3, 0x67c4, - 0x67b5, 0x67a6, 0x6798, 0x6789, 0x677a, 0x676b, 0x675d, 0x674e, - 0x673f, 0x6730, 0x6721, 0x6712, 0x6703, 0x66f4, 0x66e5, 0x66d6, - 0x66c8, 0x66b9, 0x66aa, 0x669b, 0x668b, 0x667c, 0x666d, 0x665e, - 0x664f, 0x6640, 0x6631, 0x6622, 0x6613, 0x6603, 0x65f4, 0x65e5, - 0x65d6, 0x65c7, 0x65b7, 0x65a8, 0x6599, 0x658a, 0x657a, 0x656b, - 0x655c, 0x654c, 0x653d, 0x652d, 0x651e, 0x650f, 0x64ff, 0x64f0, - 0x64e0, 0x64d1, 0x64c1, 0x64b2, 0x64a2, 0x6493, 0x6483, 0x6474, - 0x6464, 0x6454, 0x6445, 0x6435, 0x6426, 0x6416, 0x6406, 0x63f7, - 0x63e7, 0x63d7, 0x63c7, 0x63b8, 0x63a8, 0x6398, 0x6388, 0x6378, - 0x6369, 0x6359, 0x6349, 0x6339, 0x6329, 0x6319, 0x6309, 0x62f9, - 0x62ea, 0x62da, 0x62ca, 0x62ba, 0x62aa, 0x629a, 0x628a, 0x627a, - 0x6269, 0x6259, 0x6249, 0x6239, 0x6229, 0x6219, 0x6209, 0x61f9, - 0x61e8, 0x61d8, 0x61c8, 0x61b8, 0x61a8, 0x6197, 0x6187, 0x6177, - 0x6166, 0x6156, 0x6146, 0x6135, 0x6125, 0x6115, 0x6104, 0x60f4, - 0x60e4, 0x60d3, 0x60c3, 0x60b2, 0x60a2, 0x6091, 0x6081, 0x6070, - 0x6060, 0x604f, 0x603f, 0x602e, 0x601d, 0x600d, 0x5ffc, 0x5fec, - 0x5fdb, 0x5fca, 0x5fba, 0x5fa9, 0x5f98, 0x5f87, 0x5f77, 0x5f66, - 0x5f55, 0x5f44, 0x5f34, 0x5f23, 0x5f12, 0x5f01, 0x5ef0, 0x5edf, - 0x5ecf, 0x5ebe, 0x5ead, 0x5e9c, 0x5e8b, 0x5e7a, 0x5e69, 0x5e58, - 0x5e47, 0x5e36, 0x5e25, 0x5e14, 0x5e03, 0x5df2, 0x5de1, 0x5dd0, - 0x5dbf, 0x5dad, 0x5d9c, 0x5d8b, 0x5d7a, 0x5d69, 0x5d58, 0x5d46, - 0x5d35, 0x5d24, 0x5d13, 0x5d01, 0x5cf0, 0x5cdf, 0x5cce, 0x5cbc, - 0x5cab, 0x5c9a, 0x5c88, 0x5c77, 0x5c66, 0x5c54, 0x5c43, 0x5c31, - 0x5c20, 0x5c0e, 0x5bfd, 0x5beb, 0x5bda, 0x5bc8, 0x5bb7, 0x5ba5, - 0x5b94, 0x5b82, 0x5b71, 0x5b5f, 0x5b4d, 0x5b3c, 0x5b2a, 0x5b19, - 0x5b07, 0x5af5, 0x5ae4, 0x5ad2, 0x5ac0, 0x5aae, 0x5a9d, 0x5a8b, - 0x5a79, 0x5a67, 0x5a56, 0x5a44, 0x5a32, 0x5a20, 0x5a0e, 0x59fc, - 0x59ea, 0x59d9, 0x59c7, 0x59b5, 0x59a3, 0x5991, 0x597f, 0x596d, - 0x595b, 0x5949, 0x5937, 0x5925, 0x5913, 0x5901, 0x58ef, 0x58dd, - 0x58cb, 0x58b8, 0x58a6, 0x5894, 0x5882, 0x5870, 0x585e, 0x584b, - 0x5839, 0x5827, 0x5815, 0x5803, 0x57f0, 0x57de, 0x57cc, 0x57b9, - 0x57a7, 0x5795, 0x5783, 0x5770, 0x575e, 0x574b, 0x5739, 0x5727, - 0x5714, 0x5702, 0x56ef, 0x56dd, 0x56ca, 0x56b8, 0x56a5, 0x5693, - 0x5680, 0x566e, 0x565b, 0x5649, 0x5636, 0x5624, 0x5611, 0x55fe, - 0x55ec, 0x55d9, 0x55c7, 0x55b4, 0x55a1, 0x558f, 0x557c, 0x5569, - 0x5556, 0x5544, 0x5531, 0x551e, 0x550b, 0x54f9, 0x54e6, 0x54d3, - 0x54c0, 0x54ad, 0x549a, 0x5488, 0x5475, 0x5462, 0x544f, 0x543c, - 0x5429, 0x5416, 0x5403, 0x53f0, 0x53dd, 0x53ca, 0x53b7, 0x53a4, - 0x5391, 0x537e, 0x536b, 0x5358, 0x5345, 0x5332, 0x531f, 0x530c, - 0x52f8, 0x52e5, 0x52d2, 0x52bf, 0x52ac, 0x5299, 0x5285, 0x5272, - 0x525f, 0x524c, 0x5238, 0x5225, 0x5212, 0x51ff, 0x51eb, 0x51d8, - 0x51c5, 0x51b1, 0x519e, 0x518b, 0x5177, 0x5164, 0x5150, 0x513d, - 0x512a, 0x5116, 0x5103, 0x50ef, 0x50dc, 0x50c8, 0x50b5, 0x50a1, - 0x508e, 0x507a, 0x5067, 0x5053, 0x503f, 0x502c, 0x5018, 0x5005, - 0x4ff1, 0x4fdd, 0x4fca, 0x4fb6, 0x4fa2, 0x4f8f, 0x4f7b, 0x4f67, - 0x4f54, 0x4f40, 0x4f2c, 0x4f18, 0x4f05, 0x4ef1, 0x4edd, 0x4ec9, - 0x4eb6, 0x4ea2, 0x4e8e, 0x4e7a, 0x4e66, 0x4e52, 0x4e3e, 0x4e2a, - 0x4e17, 0x4e03, 0x4def, 0x4ddb, 0x4dc7, 0x4db3, 0x4d9f, 0x4d8b, - 0x4d77, 0x4d63, 0x4d4f, 0x4d3b, 0x4d27, 0x4d13, 0x4cff, 0x4ceb, - 0x4cd6, 0x4cc2, 0x4cae, 0x4c9a, 0x4c86, 0x4c72, 0x4c5e, 0x4c49, - 0x4c35, 0x4c21, 0x4c0d, 0x4bf9, 0x4be4, 0x4bd0, 0x4bbc, 0x4ba8, - 0x4b93, 0x4b7f, 0x4b6b, 0x4b56, 0x4b42, 0x4b2e, 0x4b19, 0x4b05, - 0x4af1, 0x4adc, 0x4ac8, 0x4ab4, 0x4a9f, 0x4a8b, 0x4a76, 0x4a62, - 0x4a4d, 0x4a39, 0x4a24, 0x4a10, 0x49fb, 0x49e7, 0x49d2, 0x49be, - 0x49a9, 0x4995, 0x4980, 0x496c, 0x4957, 0x4942, 0x492e, 0x4919, - 0x4905, 0x48f0, 0x48db, 0x48c7, 0x48b2, 0x489d, 0x4888, 0x4874, - 0x485f, 0x484a, 0x4836, 0x4821, 0x480c, 0x47f7, 0x47e2, 0x47ce, - 0x47b9, 0x47a4, 0x478f, 0x477a, 0x4765, 0x4751, 0x473c, 0x4727, - 0x4712, 0x46fd, 0x46e8, 0x46d3, 0x46be, 0x46a9, 0x4694, 0x467f, - 0x466a, 0x4655, 0x4640, 0x462b, 0x4616, 0x4601, 0x45ec, 0x45d7, - 0x45c2, 0x45ad, 0x4598, 0x4583, 0x456e, 0x4559, 0x4544, 0x452e, - 0x4519, 0x4504, 0x44ef, 0x44da, 0x44c5, 0x44af, 0x449a, 0x4485, - 0x4470, 0x445a, 0x4445, 0x4430, 0x441b, 0x4405, 0x43f0, 0x43db, - 0x43c5, 0x43b0, 0x439b, 0x4385, 0x4370, 0x435b, 0x4345, 0x4330, - 0x431b, 0x4305, 0x42f0, 0x42da, 0x42c5, 0x42af, 0x429a, 0x4284, - 0x426f, 0x425a, 0x4244, 0x422f, 0x4219, 0x4203, 0x41ee, 0x41d8, - 0x41c3, 0x41ad, 0x4198, 0x4182, 0x416d, 0x4157, 0x4141, 0x412c, - 0x4116, 0x4100, 0x40eb, 0x40d5, 0x40bf, 0x40aa, 0x4094, 0x407e, - 0x4069, 0x4053, 0x403d, 0x4027, 0x4012, 0x3ffc, 0x3fe6, 0x3fd0, - 0x3fbb, 0x3fa5, 0x3f8f, 0x3f79, 0x3f63, 0x3f4d, 0x3f38, 0x3f22, - 0x3f0c, 0x3ef6, 0x3ee0, 0x3eca, 0x3eb4, 0x3e9e, 0x3e88, 0x3e73, - 0x3e5d, 0x3e47, 0x3e31, 0x3e1b, 0x3e05, 0x3def, 0x3dd9, 0x3dc3, - 0x3dad, 0x3d97, 0x3d81, 0x3d6b, 0x3d55, 0x3d3e, 0x3d28, 0x3d12, - 0x3cfc, 0x3ce6, 0x3cd0, 0x3cba, 0x3ca4, 0x3c8e, 0x3c77, 0x3c61, - 0x3c4b, 0x3c35, 0x3c1f, 0x3c09, 0x3bf2, 0x3bdc, 0x3bc6, 0x3bb0, - 0x3b99, 0x3b83, 0x3b6d, 0x3b57, 0x3b40, 0x3b2a, 0x3b14, 0x3afe, - 0x3ae7, 0x3ad1, 0x3abb, 0x3aa4, 0x3a8e, 0x3a78, 0x3a61, 0x3a4b, - 0x3a34, 0x3a1e, 0x3a08, 0x39f1, 0x39db, 0x39c4, 0x39ae, 0x3998, - 0x3981, 0x396b, 0x3954, 0x393e, 0x3927, 0x3911, 0x38fa, 0x38e4, - 0x38cd, 0x38b7, 0x38a0, 0x388a, 0x3873, 0x385d, 0x3846, 0x382f, - 0x3819, 0x3802, 0x37ec, 0x37d5, 0x37be, 0x37a8, 0x3791, 0x377a, - 0x3764, 0x374d, 0x3736, 0x3720, 0x3709, 0x36f2, 0x36dc, 0x36c5, - 0x36ae, 0x3698, 0x3681, 0x366a, 0x3653, 0x363d, 0x3626, 0x360f, - 0x35f8, 0x35e1, 0x35cb, 0x35b4, 0x359d, 0x3586, 0x356f, 0x3558, - 0x3542, 0x352b, 0x3514, 0x34fd, 0x34e6, 0x34cf, 0x34b8, 0x34a1, - 0x348b, 0x3474, 0x345d, 0x3446, 0x342f, 0x3418, 0x3401, 0x33ea, - 0x33d3, 0x33bc, 0x33a5, 0x338e, 0x3377, 0x3360, 0x3349, 0x3332, - 0x331b, 0x3304, 0x32ed, 0x32d6, 0x32bf, 0x32a8, 0x3290, 0x3279, - 0x3262, 0x324b, 0x3234, 0x321d, 0x3206, 0x31ef, 0x31d8, 0x31c0, - 0x31a9, 0x3192, 0x317b, 0x3164, 0x314c, 0x3135, 0x311e, 0x3107, - 0x30f0, 0x30d8, 0x30c1, 0x30aa, 0x3093, 0x307b, 0x3064, 0x304d, - 0x3036, 0x301e, 0x3007, 0x2ff0, 0x2fd8, 0x2fc1, 0x2faa, 0x2f92, - 0x2f7b, 0x2f64, 0x2f4c, 0x2f35, 0x2f1e, 0x2f06, 0x2eef, 0x2ed8, - 0x2ec0, 0x2ea9, 0x2e91, 0x2e7a, 0x2e63, 0x2e4b, 0x2e34, 0x2e1c, - 0x2e05, 0x2ded, 0x2dd6, 0x2dbe, 0x2da7, 0x2d8f, 0x2d78, 0x2d60, - 0x2d49, 0x2d31, 0x2d1a, 0x2d02, 0x2ceb, 0x2cd3, 0x2cbc, 0x2ca4, - 0x2c8d, 0x2c75, 0x2c5e, 0x2c46, 0x2c2e, 0x2c17, 0x2bff, 0x2be8, - 0x2bd0, 0x2bb8, 0x2ba1, 0x2b89, 0x2b71, 0x2b5a, 0x2b42, 0x2b2b, - 0x2b13, 0x2afb, 0x2ae4, 0x2acc, 0x2ab4, 0x2a9c, 0x2a85, 0x2a6d, - 0x2a55, 0x2a3e, 0x2a26, 0x2a0e, 0x29f6, 0x29df, 0x29c7, 0x29af, - 0x2997, 0x2980, 0x2968, 0x2950, 0x2938, 0x2920, 0x2909, 0x28f1, - 0x28d9, 0x28c1, 0x28a9, 0x2892, 0x287a, 0x2862, 0x284a, 0x2832, - 0x281a, 0x2802, 0x27eb, 0x27d3, 0x27bb, 0x27a3, 0x278b, 0x2773, - 0x275b, 0x2743, 0x272b, 0x2713, 0x26fb, 0x26e4, 0x26cc, 0x26b4, - 0x269c, 0x2684, 0x266c, 0x2654, 0x263c, 0x2624, 0x260c, 0x25f4, - 0x25dc, 0x25c4, 0x25ac, 0x2594, 0x257c, 0x2564, 0x254c, 0x2534, - 0x251c, 0x2503, 0x24eb, 0x24d3, 0x24bb, 0x24a3, 0x248b, 0x2473, - 0x245b, 0x2443, 0x242b, 0x2413, 0x23fa, 0x23e2, 0x23ca, 0x23b2, - 0x239a, 0x2382, 0x236a, 0x2352, 0x2339, 0x2321, 0x2309, 0x22f1, - 0x22d9, 0x22c0, 0x22a8, 0x2290, 0x2278, 0x2260, 0x2247, 0x222f, - 0x2217, 0x21ff, 0x21e7, 0x21ce, 0x21b6, 0x219e, 0x2186, 0x216d, - 0x2155, 0x213d, 0x2125, 0x210c, 0x20f4, 0x20dc, 0x20c3, 0x20ab, - 0x2093, 0x207a, 0x2062, 0x204a, 0x2032, 0x2019, 0x2001, 0x1fe9, - 0x1fd0, 0x1fb8, 0x1f9f, 0x1f87, 0x1f6f, 0x1f56, 0x1f3e, 0x1f26, - 0x1f0d, 0x1ef5, 0x1edd, 0x1ec4, 0x1eac, 0x1e93, 0x1e7b, 0x1e62, - 0x1e4a, 0x1e32, 0x1e19, 0x1e01, 0x1de8, 0x1dd0, 0x1db7, 0x1d9f, - 0x1d87, 0x1d6e, 0x1d56, 0x1d3d, 0x1d25, 0x1d0c, 0x1cf4, 0x1cdb, - 0x1cc3, 0x1caa, 0x1c92, 0x1c79, 0x1c61, 0x1c48, 0x1c30, 0x1c17, - 0x1bff, 0x1be6, 0x1bce, 0x1bb5, 0x1b9d, 0x1b84, 0x1b6c, 0x1b53, - 0x1b3a, 0x1b22, 0x1b09, 0x1af1, 0x1ad8, 0x1ac0, 0x1aa7, 0x1a8e, - 0x1a76, 0x1a5d, 0x1a45, 0x1a2c, 0x1a13, 0x19fb, 0x19e2, 0x19ca, - 0x19b1, 0x1998, 0x1980, 0x1967, 0x194e, 0x1936, 0x191d, 0x1905, - 0x18ec, 0x18d3, 0x18bb, 0x18a2, 0x1889, 0x1871, 0x1858, 0x183f, - 0x1827, 0x180e, 0x17f5, 0x17dd, 0x17c4, 0x17ab, 0x1792, 0x177a, - 0x1761, 0x1748, 0x1730, 0x1717, 0x16fe, 0x16e5, 0x16cd, 0x16b4, - 0x169b, 0x1682, 0x166a, 0x1651, 0x1638, 0x161f, 0x1607, 0x15ee, - 0x15d5, 0x15bc, 0x15a4, 0x158b, 0x1572, 0x1559, 0x1541, 0x1528, - 0x150f, 0x14f6, 0x14dd, 0x14c5, 0x14ac, 0x1493, 0x147a, 0x1461, - 0x1449, 0x1430, 0x1417, 0x13fe, 0x13e5, 0x13cc, 0x13b4, 0x139b, - 0x1382, 0x1369, 0x1350, 0x1337, 0x131f, 0x1306, 0x12ed, 0x12d4, - 0x12bb, 0x12a2, 0x1289, 0x1271, 0x1258, 0x123f, 0x1226, 0x120d, - 0x11f4, 0x11db, 0x11c2, 0x11a9, 0x1191, 0x1178, 0x115f, 0x1146, - 0x112d, 0x1114, 0x10fb, 0x10e2, 0x10c9, 0x10b0, 0x1098, 0x107f, - 0x1066, 0x104d, 0x1034, 0x101b, 0x1002, 0xfe9, 0xfd0, 0xfb7, - 0xf9e, 0xf85, 0xf6c, 0xf53, 0xf3a, 0xf21, 0xf08, 0xef0, - 0xed7, 0xebe, 0xea5, 0xe8c, 0xe73, 0xe5a, 0xe41, 0xe28, - 0xe0f, 0xdf6, 0xddd, 0xdc4, 0xdab, 0xd92, 0xd79, 0xd60, - 0xd47, 0xd2e, 0xd15, 0xcfc, 0xce3, 0xcca, 0xcb1, 0xc98, - 0xc7f, 0xc66, 0xc4d, 0xc34, 0xc1b, 0xc02, 0xbe9, 0xbd0, - 0xbb7, 0xb9e, 0xb85, 0xb6c, 0xb53, 0xb3a, 0xb20, 0xb07, - 0xaee, 0xad5, 0xabc, 0xaa3, 0xa8a, 0xa71, 0xa58, 0xa3f, - 0xa26, 0xa0d, 0x9f4, 0x9db, 0x9c2, 0x9a9, 0x990, 0x977, - 0x95e, 0x944, 0x92b, 0x912, 0x8f9, 0x8e0, 0x8c7, 0x8ae, - 0x895, 0x87c, 0x863, 0x84a, 0x831, 0x818, 0x7fe, 0x7e5, - 0x7cc, 0x7b3, 0x79a, 0x781, 0x768, 0x74f, 0x736, 0x71d, - 0x704, 0x6ea, 0x6d1, 0x6b8, 0x69f, 0x686, 0x66d, 0x654, - 0x63b, 0x622, 0x609, 0x5ef, 0x5d6, 0x5bd, 0x5a4, 0x58b, - 0x572, 0x559, 0x540, 0x527, 0x50d, 0x4f4, 0x4db, 0x4c2, - 0x4a9, 0x490, 0x477, 0x45e, 0x445, 0x42b, 0x412, 0x3f9, - 0x3e0, 0x3c7, 0x3ae, 0x395, 0x37c, 0x362, 0x349, 0x330, - 0x317, 0x2fe, 0x2e5, 0x2cc, 0x2b3, 0x299, 0x280, 0x267, - 0x24e, 0x235, 0x21c, 0x203, 0x1ea, 0x1d0, 0x1b7, 0x19e, - 0x185, 0x16c, 0x153, 0x13a, 0x121, 0x107, 0xee, 0xd5, - 0xbc, 0xa3, 0x8a, 0x71, 0x57, 0x3e, 0x25, 0xc, - -}; - -static const q15_t ALIGN4 cos_factorsQ15_8192[8192] = { - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, - 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, - 0x7ffe, 0x7ffe, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, - 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffd, 0x7ffc, - 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffc, - 0x7ffc, 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffb, - 0x7ffb, 0x7ffb, 0x7ffb, 0x7ffa, 0x7ffa, 0x7ffa, 0x7ffa, 0x7ffa, - 0x7ffa, 0x7ffa, 0x7ffa, 0x7ffa, 0x7ff9, 0x7ff9, 0x7ff9, 0x7ff9, - 0x7ff9, 0x7ff9, 0x7ff9, 0x7ff9, 0x7ff8, 0x7ff8, 0x7ff8, 0x7ff8, - 0x7ff8, 0x7ff8, 0x7ff8, 0x7ff7, 0x7ff7, 0x7ff7, 0x7ff7, 0x7ff7, - 0x7ff7, 0x7ff7, 0x7ff6, 0x7ff6, 0x7ff6, 0x7ff6, 0x7ff6, 0x7ff6, - 0x7ff6, 0x7ff5, 0x7ff5, 0x7ff5, 0x7ff5, 0x7ff5, 0x7ff5, 0x7ff4, - 0x7ff4, 0x7ff4, 0x7ff4, 0x7ff4, 0x7ff4, 0x7ff3, 0x7ff3, 0x7ff3, - 0x7ff3, 0x7ff3, 0x7ff3, 0x7ff2, 0x7ff2, 0x7ff2, 0x7ff2, 0x7ff2, - 0x7ff1, 0x7ff1, 0x7ff1, 0x7ff1, 0x7ff1, 0x7ff1, 0x7ff0, 0x7ff0, - 0x7ff0, 0x7ff0, 0x7ff0, 0x7fef, 0x7fef, 0x7fef, 0x7fef, 0x7fef, - 0x7fee, 0x7fee, 0x7fee, 0x7fee, 0x7fee, 0x7fed, 0x7fed, 0x7fed, - 0x7fed, 0x7fed, 0x7fec, 0x7fec, 0x7fec, 0x7fec, 0x7feb, 0x7feb, - 0x7feb, 0x7feb, 0x7feb, 0x7fea, 0x7fea, 0x7fea, 0x7fea, 0x7fe9, - 0x7fe9, 0x7fe9, 0x7fe9, 0x7fe8, 0x7fe8, 0x7fe8, 0x7fe8, 0x7fe8, - 0x7fe7, 0x7fe7, 0x7fe7, 0x7fe7, 0x7fe6, 0x7fe6, 0x7fe6, 0x7fe6, - 0x7fe5, 0x7fe5, 0x7fe5, 0x7fe5, 0x7fe4, 0x7fe4, 0x7fe4, 0x7fe4, - 0x7fe3, 0x7fe3, 0x7fe3, 0x7fe2, 0x7fe2, 0x7fe2, 0x7fe2, 0x7fe1, - 0x7fe1, 0x7fe1, 0x7fe1, 0x7fe0, 0x7fe0, 0x7fe0, 0x7fdf, 0x7fdf, - 0x7fdf, 0x7fdf, 0x7fde, 0x7fde, 0x7fde, 0x7fde, 0x7fdd, 0x7fdd, - 0x7fdd, 0x7fdc, 0x7fdc, 0x7fdc, 0x7fdb, 0x7fdb, 0x7fdb, 0x7fdb, - 0x7fda, 0x7fda, 0x7fda, 0x7fd9, 0x7fd9, 0x7fd9, 0x7fd8, 0x7fd8, - 0x7fd8, 0x7fd8, 0x7fd7, 0x7fd7, 0x7fd7, 0x7fd6, 0x7fd6, 0x7fd6, - 0x7fd5, 0x7fd5, 0x7fd5, 0x7fd4, 0x7fd4, 0x7fd4, 0x7fd3, 0x7fd3, - 0x7fd3, 0x7fd2, 0x7fd2, 0x7fd2, 0x7fd1, 0x7fd1, 0x7fd1, 0x7fd0, - 0x7fd0, 0x7fd0, 0x7fcf, 0x7fcf, 0x7fcf, 0x7fce, 0x7fce, 0x7fce, - 0x7fcd, 0x7fcd, 0x7fcd, 0x7fcc, 0x7fcc, 0x7fcc, 0x7fcb, 0x7fcb, - 0x7fcb, 0x7fca, 0x7fca, 0x7fc9, 0x7fc9, 0x7fc9, 0x7fc8, 0x7fc8, - 0x7fc8, 0x7fc7, 0x7fc7, 0x7fc7, 0x7fc6, 0x7fc6, 0x7fc5, 0x7fc5, - 0x7fc5, 0x7fc4, 0x7fc4, 0x7fc4, 0x7fc3, 0x7fc3, 0x7fc2, 0x7fc2, - 0x7fc2, 0x7fc1, 0x7fc1, 0x7fc0, 0x7fc0, 0x7fc0, 0x7fbf, 0x7fbf, - 0x7fbf, 0x7fbe, 0x7fbe, 0x7fbd, 0x7fbd, 0x7fbd, 0x7fbc, 0x7fbc, - 0x7fbb, 0x7fbb, 0x7fbb, 0x7fba, 0x7fba, 0x7fb9, 0x7fb9, 0x7fb8, - 0x7fb8, 0x7fb8, 0x7fb7, 0x7fb7, 0x7fb6, 0x7fb6, 0x7fb6, 0x7fb5, - 0x7fb5, 0x7fb4, 0x7fb4, 0x7fb3, 0x7fb3, 0x7fb3, 0x7fb2, 0x7fb2, - 0x7fb1, 0x7fb1, 0x7fb0, 0x7fb0, 0x7faf, 0x7faf, 0x7faf, 0x7fae, - 0x7fae, 0x7fad, 0x7fad, 0x7fac, 0x7fac, 0x7fac, 0x7fab, 0x7fab, - 0x7faa, 0x7faa, 0x7fa9, 0x7fa9, 0x7fa8, 0x7fa8, 0x7fa7, 0x7fa7, - 0x7fa6, 0x7fa6, 0x7fa6, 0x7fa5, 0x7fa5, 0x7fa4, 0x7fa4, 0x7fa3, - 0x7fa3, 0x7fa2, 0x7fa2, 0x7fa1, 0x7fa1, 0x7fa0, 0x7fa0, 0x7f9f, - 0x7f9f, 0x7f9e, 0x7f9e, 0x7f9d, 0x7f9d, 0x7f9c, 0x7f9c, 0x7f9c, - 0x7f9b, 0x7f9b, 0x7f9a, 0x7f9a, 0x7f99, 0x7f99, 0x7f98, 0x7f98, - 0x7f97, 0x7f97, 0x7f96, 0x7f96, 0x7f95, 0x7f95, 0x7f94, 0x7f94, - 0x7f93, 0x7f92, 0x7f92, 0x7f91, 0x7f91, 0x7f90, 0x7f90, 0x7f8f, - 0x7f8f, 0x7f8e, 0x7f8e, 0x7f8d, 0x7f8d, 0x7f8c, 0x7f8c, 0x7f8b, - 0x7f8b, 0x7f8a, 0x7f8a, 0x7f89, 0x7f89, 0x7f88, 0x7f87, 0x7f87, - 0x7f86, 0x7f86, 0x7f85, 0x7f85, 0x7f84, 0x7f84, 0x7f83, 0x7f83, - 0x7f82, 0x7f81, 0x7f81, 0x7f80, 0x7f80, 0x7f7f, 0x7f7f, 0x7f7e, - 0x7f7e, 0x7f7d, 0x7f7c, 0x7f7c, 0x7f7b, 0x7f7b, 0x7f7a, 0x7f7a, - 0x7f79, 0x7f79, 0x7f78, 0x7f77, 0x7f77, 0x7f76, 0x7f76, 0x7f75, - 0x7f75, 0x7f74, 0x7f73, 0x7f73, 0x7f72, 0x7f72, 0x7f71, 0x7f70, - 0x7f70, 0x7f6f, 0x7f6f, 0x7f6e, 0x7f6d, 0x7f6d, 0x7f6c, 0x7f6c, - 0x7f6b, 0x7f6b, 0x7f6a, 0x7f69, 0x7f69, 0x7f68, 0x7f68, 0x7f67, - 0x7f66, 0x7f66, 0x7f65, 0x7f64, 0x7f64, 0x7f63, 0x7f63, 0x7f62, - 0x7f61, 0x7f61, 0x7f60, 0x7f60, 0x7f5f, 0x7f5e, 0x7f5e, 0x7f5d, - 0x7f5c, 0x7f5c, 0x7f5b, 0x7f5b, 0x7f5a, 0x7f59, 0x7f59, 0x7f58, - 0x7f57, 0x7f57, 0x7f56, 0x7f55, 0x7f55, 0x7f54, 0x7f54, 0x7f53, - 0x7f52, 0x7f52, 0x7f51, 0x7f50, 0x7f50, 0x7f4f, 0x7f4e, 0x7f4e, - 0x7f4d, 0x7f4c, 0x7f4c, 0x7f4b, 0x7f4a, 0x7f4a, 0x7f49, 0x7f48, - 0x7f48, 0x7f47, 0x7f46, 0x7f46, 0x7f45, 0x7f44, 0x7f44, 0x7f43, - 0x7f42, 0x7f42, 0x7f41, 0x7f40, 0x7f40, 0x7f3f, 0x7f3e, 0x7f3e, - 0x7f3d, 0x7f3c, 0x7f3c, 0x7f3b, 0x7f3a, 0x7f3a, 0x7f39, 0x7f38, - 0x7f37, 0x7f37, 0x7f36, 0x7f35, 0x7f35, 0x7f34, 0x7f33, 0x7f33, - 0x7f32, 0x7f31, 0x7f31, 0x7f30, 0x7f2f, 0x7f2e, 0x7f2e, 0x7f2d, - 0x7f2c, 0x7f2c, 0x7f2b, 0x7f2a, 0x7f29, 0x7f29, 0x7f28, 0x7f27, - 0x7f27, 0x7f26, 0x7f25, 0x7f24, 0x7f24, 0x7f23, 0x7f22, 0x7f21, - 0x7f21, 0x7f20, 0x7f1f, 0x7f1f, 0x7f1e, 0x7f1d, 0x7f1c, 0x7f1c, - 0x7f1b, 0x7f1a, 0x7f19, 0x7f19, 0x7f18, 0x7f17, 0x7f16, 0x7f16, - 0x7f15, 0x7f14, 0x7f13, 0x7f13, 0x7f12, 0x7f11, 0x7f10, 0x7f10, - 0x7f0f, 0x7f0e, 0x7f0d, 0x7f0d, 0x7f0c, 0x7f0b, 0x7f0a, 0x7f09, - 0x7f09, 0x7f08, 0x7f07, 0x7f06, 0x7f06, 0x7f05, 0x7f04, 0x7f03, - 0x7f02, 0x7f02, 0x7f01, 0x7f00, 0x7eff, 0x7eff, 0x7efe, 0x7efd, - 0x7efc, 0x7efb, 0x7efb, 0x7efa, 0x7ef9, 0x7ef8, 0x7ef7, 0x7ef7, - 0x7ef6, 0x7ef5, 0x7ef4, 0x7ef3, 0x7ef3, 0x7ef2, 0x7ef1, 0x7ef0, - 0x7eef, 0x7eef, 0x7eee, 0x7eed, 0x7eec, 0x7eeb, 0x7eeb, 0x7eea, - 0x7ee9, 0x7ee8, 0x7ee7, 0x7ee6, 0x7ee6, 0x7ee5, 0x7ee4, 0x7ee3, - 0x7ee2, 0x7ee2, 0x7ee1, 0x7ee0, 0x7edf, 0x7ede, 0x7edd, 0x7edd, - 0x7edc, 0x7edb, 0x7eda, 0x7ed9, 0x7ed8, 0x7ed8, 0x7ed7, 0x7ed6, - 0x7ed5, 0x7ed4, 0x7ed3, 0x7ed2, 0x7ed2, 0x7ed1, 0x7ed0, 0x7ecf, - 0x7ece, 0x7ecd, 0x7ecc, 0x7ecc, 0x7ecb, 0x7eca, 0x7ec9, 0x7ec8, - 0x7ec7, 0x7ec6, 0x7ec6, 0x7ec5, 0x7ec4, 0x7ec3, 0x7ec2, 0x7ec1, - 0x7ec0, 0x7ebf, 0x7ebf, 0x7ebe, 0x7ebd, 0x7ebc, 0x7ebb, 0x7eba, - 0x7eb9, 0x7eb8, 0x7eb8, 0x7eb7, 0x7eb6, 0x7eb5, 0x7eb4, 0x7eb3, - 0x7eb2, 0x7eb1, 0x7eb0, 0x7eaf, 0x7eaf, 0x7eae, 0x7ead, 0x7eac, - 0x7eab, 0x7eaa, 0x7ea9, 0x7ea8, 0x7ea7, 0x7ea6, 0x7ea6, 0x7ea5, - 0x7ea4, 0x7ea3, 0x7ea2, 0x7ea1, 0x7ea0, 0x7e9f, 0x7e9e, 0x7e9d, - 0x7e9c, 0x7e9b, 0x7e9b, 0x7e9a, 0x7e99, 0x7e98, 0x7e97, 0x7e96, - 0x7e95, 0x7e94, 0x7e93, 0x7e92, 0x7e91, 0x7e90, 0x7e8f, 0x7e8e, - 0x7e8d, 0x7e8d, 0x7e8c, 0x7e8b, 0x7e8a, 0x7e89, 0x7e88, 0x7e87, - 0x7e86, 0x7e85, 0x7e84, 0x7e83, 0x7e82, 0x7e81, 0x7e80, 0x7e7f, - 0x7e7e, 0x7e7d, 0x7e7c, 0x7e7b, 0x7e7a, 0x7e79, 0x7e78, 0x7e77, - 0x7e77, 0x7e76, 0x7e75, 0x7e74, 0x7e73, 0x7e72, 0x7e71, 0x7e70, - 0x7e6f, 0x7e6e, 0x7e6d, 0x7e6c, 0x7e6b, 0x7e6a, 0x7e69, 0x7e68, - 0x7e67, 0x7e66, 0x7e65, 0x7e64, 0x7e63, 0x7e62, 0x7e61, 0x7e60, - 0x7e5f, 0x7e5e, 0x7e5d, 0x7e5c, 0x7e5b, 0x7e5a, 0x7e59, 0x7e58, - 0x7e57, 0x7e56, 0x7e55, 0x7e54, 0x7e53, 0x7e52, 0x7e51, 0x7e50, - 0x7e4f, 0x7e4e, 0x7e4d, 0x7e4c, 0x7e4b, 0x7e4a, 0x7e49, 0x7e48, - 0x7e47, 0x7e46, 0x7e45, 0x7e43, 0x7e42, 0x7e41, 0x7e40, 0x7e3f, - 0x7e3e, 0x7e3d, 0x7e3c, 0x7e3b, 0x7e3a, 0x7e39, 0x7e38, 0x7e37, - 0x7e36, 0x7e35, 0x7e34, 0x7e33, 0x7e32, 0x7e31, 0x7e30, 0x7e2f, - 0x7e2e, 0x7e2d, 0x7e2b, 0x7e2a, 0x7e29, 0x7e28, 0x7e27, 0x7e26, - 0x7e25, 0x7e24, 0x7e23, 0x7e22, 0x7e21, 0x7e20, 0x7e1f, 0x7e1e, - 0x7e1d, 0x7e1b, 0x7e1a, 0x7e19, 0x7e18, 0x7e17, 0x7e16, 0x7e15, - 0x7e14, 0x7e13, 0x7e12, 0x7e11, 0x7e10, 0x7e0e, 0x7e0d, 0x7e0c, - 0x7e0b, 0x7e0a, 0x7e09, 0x7e08, 0x7e07, 0x7e06, 0x7e05, 0x7e04, - 0x7e02, 0x7e01, 0x7e00, 0x7dff, 0x7dfe, 0x7dfd, 0x7dfc, 0x7dfb, - 0x7dfa, 0x7df8, 0x7df7, 0x7df6, 0x7df5, 0x7df4, 0x7df3, 0x7df2, - 0x7df1, 0x7def, 0x7dee, 0x7ded, 0x7dec, 0x7deb, 0x7dea, 0x7de9, - 0x7de8, 0x7de6, 0x7de5, 0x7de4, 0x7de3, 0x7de2, 0x7de1, 0x7de0, - 0x7dde, 0x7ddd, 0x7ddc, 0x7ddb, 0x7dda, 0x7dd9, 0x7dd8, 0x7dd6, - 0x7dd5, 0x7dd4, 0x7dd3, 0x7dd2, 0x7dd1, 0x7dd0, 0x7dce, 0x7dcd, - 0x7dcc, 0x7dcb, 0x7dca, 0x7dc9, 0x7dc7, 0x7dc6, 0x7dc5, 0x7dc4, - 0x7dc3, 0x7dc2, 0x7dc0, 0x7dbf, 0x7dbe, 0x7dbd, 0x7dbc, 0x7dbb, - 0x7db9, 0x7db8, 0x7db7, 0x7db6, 0x7db5, 0x7db3, 0x7db2, 0x7db1, - 0x7db0, 0x7daf, 0x7dae, 0x7dac, 0x7dab, 0x7daa, 0x7da9, 0x7da8, - 0x7da6, 0x7da5, 0x7da4, 0x7da3, 0x7da2, 0x7da0, 0x7d9f, 0x7d9e, - 0x7d9d, 0x7d9c, 0x7d9a, 0x7d99, 0x7d98, 0x7d97, 0x7d95, 0x7d94, - 0x7d93, 0x7d92, 0x7d91, 0x7d8f, 0x7d8e, 0x7d8d, 0x7d8c, 0x7d8a, - 0x7d89, 0x7d88, 0x7d87, 0x7d86, 0x7d84, 0x7d83, 0x7d82, 0x7d81, - 0x7d7f, 0x7d7e, 0x7d7d, 0x7d7c, 0x7d7a, 0x7d79, 0x7d78, 0x7d77, - 0x7d75, 0x7d74, 0x7d73, 0x7d72, 0x7d70, 0x7d6f, 0x7d6e, 0x7d6d, - 0x7d6b, 0x7d6a, 0x7d69, 0x7d68, 0x7d66, 0x7d65, 0x7d64, 0x7d63, - 0x7d61, 0x7d60, 0x7d5f, 0x7d5e, 0x7d5c, 0x7d5b, 0x7d5a, 0x7d59, - 0x7d57, 0x7d56, 0x7d55, 0x7d53, 0x7d52, 0x7d51, 0x7d50, 0x7d4e, - 0x7d4d, 0x7d4c, 0x7d4a, 0x7d49, 0x7d48, 0x7d47, 0x7d45, 0x7d44, - 0x7d43, 0x7d41, 0x7d40, 0x7d3f, 0x7d3e, 0x7d3c, 0x7d3b, 0x7d3a, - 0x7d38, 0x7d37, 0x7d36, 0x7d34, 0x7d33, 0x7d32, 0x7d31, 0x7d2f, - 0x7d2e, 0x7d2d, 0x7d2b, 0x7d2a, 0x7d29, 0x7d27, 0x7d26, 0x7d25, - 0x7d23, 0x7d22, 0x7d21, 0x7d1f, 0x7d1e, 0x7d1d, 0x7d1b, 0x7d1a, - 0x7d19, 0x7d17, 0x7d16, 0x7d15, 0x7d13, 0x7d12, 0x7d11, 0x7d0f, - 0x7d0e, 0x7d0d, 0x7d0b, 0x7d0a, 0x7d09, 0x7d07, 0x7d06, 0x7d05, - 0x7d03, 0x7d02, 0x7d01, 0x7cff, 0x7cfe, 0x7cfd, 0x7cfb, 0x7cfa, - 0x7cf9, 0x7cf7, 0x7cf6, 0x7cf4, 0x7cf3, 0x7cf2, 0x7cf0, 0x7cef, - 0x7cee, 0x7cec, 0x7ceb, 0x7ce9, 0x7ce8, 0x7ce7, 0x7ce5, 0x7ce4, - 0x7ce3, 0x7ce1, 0x7ce0, 0x7cde, 0x7cdd, 0x7cdc, 0x7cda, 0x7cd9, - 0x7cd8, 0x7cd6, 0x7cd5, 0x7cd3, 0x7cd2, 0x7cd1, 0x7ccf, 0x7cce, - 0x7ccc, 0x7ccb, 0x7cca, 0x7cc8, 0x7cc7, 0x7cc5, 0x7cc4, 0x7cc3, - 0x7cc1, 0x7cc0, 0x7cbe, 0x7cbd, 0x7cbc, 0x7cba, 0x7cb9, 0x7cb7, - 0x7cb6, 0x7cb5, 0x7cb3, 0x7cb2, 0x7cb0, 0x7caf, 0x7cad, 0x7cac, - 0x7cab, 0x7ca9, 0x7ca8, 0x7ca6, 0x7ca5, 0x7ca3, 0x7ca2, 0x7ca1, - 0x7c9f, 0x7c9e, 0x7c9c, 0x7c9b, 0x7c99, 0x7c98, 0x7c97, 0x7c95, - 0x7c94, 0x7c92, 0x7c91, 0x7c8f, 0x7c8e, 0x7c8c, 0x7c8b, 0x7c8a, - 0x7c88, 0x7c87, 0x7c85, 0x7c84, 0x7c82, 0x7c81, 0x7c7f, 0x7c7e, - 0x7c7c, 0x7c7b, 0x7c79, 0x7c78, 0x7c77, 0x7c75, 0x7c74, 0x7c72, - 0x7c71, 0x7c6f, 0x7c6e, 0x7c6c, 0x7c6b, 0x7c69, 0x7c68, 0x7c66, - 0x7c65, 0x7c63, 0x7c62, 0x7c60, 0x7c5f, 0x7c5d, 0x7c5c, 0x7c5a, - 0x7c59, 0x7c58, 0x7c56, 0x7c55, 0x7c53, 0x7c52, 0x7c50, 0x7c4f, - 0x7c4d, 0x7c4c, 0x7c4a, 0x7c49, 0x7c47, 0x7c46, 0x7c44, 0x7c43, - 0x7c41, 0x7c3f, 0x7c3e, 0x7c3c, 0x7c3b, 0x7c39, 0x7c38, 0x7c36, - 0x7c35, 0x7c33, 0x7c32, 0x7c30, 0x7c2f, 0x7c2d, 0x7c2c, 0x7c2a, - 0x7c29, 0x7c27, 0x7c26, 0x7c24, 0x7c23, 0x7c21, 0x7c20, 0x7c1e, - 0x7c1c, 0x7c1b, 0x7c19, 0x7c18, 0x7c16, 0x7c15, 0x7c13, 0x7c12, - 0x7c10, 0x7c0f, 0x7c0d, 0x7c0b, 0x7c0a, 0x7c08, 0x7c07, 0x7c05, - 0x7c04, 0x7c02, 0x7c01, 0x7bff, 0x7bfd, 0x7bfc, 0x7bfa, 0x7bf9, - 0x7bf7, 0x7bf6, 0x7bf4, 0x7bf3, 0x7bf1, 0x7bef, 0x7bee, 0x7bec, - 0x7beb, 0x7be9, 0x7be8, 0x7be6, 0x7be4, 0x7be3, 0x7be1, 0x7be0, - 0x7bde, 0x7bdc, 0x7bdb, 0x7bd9, 0x7bd8, 0x7bd6, 0x7bd5, 0x7bd3, - 0x7bd1, 0x7bd0, 0x7bce, 0x7bcd, 0x7bcb, 0x7bc9, 0x7bc8, 0x7bc6, - 0x7bc5, 0x7bc3, 0x7bc1, 0x7bc0, 0x7bbe, 0x7bbd, 0x7bbb, 0x7bb9, - 0x7bb8, 0x7bb6, 0x7bb5, 0x7bb3, 0x7bb1, 0x7bb0, 0x7bae, 0x7bac, - 0x7bab, 0x7ba9, 0x7ba8, 0x7ba6, 0x7ba4, 0x7ba3, 0x7ba1, 0x7b9f, - 0x7b9e, 0x7b9c, 0x7b9b, 0x7b99, 0x7b97, 0x7b96, 0x7b94, 0x7b92, - 0x7b91, 0x7b8f, 0x7b8d, 0x7b8c, 0x7b8a, 0x7b89, 0x7b87, 0x7b85, - 0x7b84, 0x7b82, 0x7b80, 0x7b7f, 0x7b7d, 0x7b7b, 0x7b7a, 0x7b78, - 0x7b76, 0x7b75, 0x7b73, 0x7b71, 0x7b70, 0x7b6e, 0x7b6c, 0x7b6b, - 0x7b69, 0x7b67, 0x7b66, 0x7b64, 0x7b62, 0x7b61, 0x7b5f, 0x7b5d, - 0x7b5c, 0x7b5a, 0x7b58, 0x7b57, 0x7b55, 0x7b53, 0x7b52, 0x7b50, - 0x7b4e, 0x7b4d, 0x7b4b, 0x7b49, 0x7b47, 0x7b46, 0x7b44, 0x7b42, - 0x7b41, 0x7b3f, 0x7b3d, 0x7b3c, 0x7b3a, 0x7b38, 0x7b37, 0x7b35, - 0x7b33, 0x7b31, 0x7b30, 0x7b2e, 0x7b2c, 0x7b2b, 0x7b29, 0x7b27, - 0x7b25, 0x7b24, 0x7b22, 0x7b20, 0x7b1f, 0x7b1d, 0x7b1b, 0x7b19, - 0x7b18, 0x7b16, 0x7b14, 0x7b13, 0x7b11, 0x7b0f, 0x7b0d, 0x7b0c, - 0x7b0a, 0x7b08, 0x7b06, 0x7b05, 0x7b03, 0x7b01, 0x7aff, 0x7afe, - 0x7afc, 0x7afa, 0x7af8, 0x7af7, 0x7af5, 0x7af3, 0x7af2, 0x7af0, - 0x7aee, 0x7aec, 0x7aeb, 0x7ae9, 0x7ae7, 0x7ae5, 0x7ae3, 0x7ae2, - 0x7ae0, 0x7ade, 0x7adc, 0x7adb, 0x7ad9, 0x7ad7, 0x7ad5, 0x7ad4, - 0x7ad2, 0x7ad0, 0x7ace, 0x7acd, 0x7acb, 0x7ac9, 0x7ac7, 0x7ac5, - 0x7ac4, 0x7ac2, 0x7ac0, 0x7abe, 0x7abd, 0x7abb, 0x7ab9, 0x7ab7, - 0x7ab5, 0x7ab4, 0x7ab2, 0x7ab0, 0x7aae, 0x7aac, 0x7aab, 0x7aa9, - 0x7aa7, 0x7aa5, 0x7aa3, 0x7aa2, 0x7aa0, 0x7a9e, 0x7a9c, 0x7a9a, - 0x7a99, 0x7a97, 0x7a95, 0x7a93, 0x7a91, 0x7a90, 0x7a8e, 0x7a8c, - 0x7a8a, 0x7a88, 0x7a87, 0x7a85, 0x7a83, 0x7a81, 0x7a7f, 0x7a7d, - 0x7a7c, 0x7a7a, 0x7a78, 0x7a76, 0x7a74, 0x7a72, 0x7a71, 0x7a6f, - 0x7a6d, 0x7a6b, 0x7a69, 0x7a67, 0x7a66, 0x7a64, 0x7a62, 0x7a60, - 0x7a5e, 0x7a5c, 0x7a5b, 0x7a59, 0x7a57, 0x7a55, 0x7a53, 0x7a51, - 0x7a4f, 0x7a4e, 0x7a4c, 0x7a4a, 0x7a48, 0x7a46, 0x7a44, 0x7a42, - 0x7a41, 0x7a3f, 0x7a3d, 0x7a3b, 0x7a39, 0x7a37, 0x7a35, 0x7a34, - 0x7a32, 0x7a30, 0x7a2e, 0x7a2c, 0x7a2a, 0x7a28, 0x7a26, 0x7a25, - 0x7a23, 0x7a21, 0x7a1f, 0x7a1d, 0x7a1b, 0x7a19, 0x7a17, 0x7a16, - 0x7a14, 0x7a12, 0x7a10, 0x7a0e, 0x7a0c, 0x7a0a, 0x7a08, 0x7a06, - 0x7a04, 0x7a03, 0x7a01, 0x79ff, 0x79fd, 0x79fb, 0x79f9, 0x79f7, - 0x79f5, 0x79f3, 0x79f1, 0x79f0, 0x79ee, 0x79ec, 0x79ea, 0x79e8, - 0x79e6, 0x79e4, 0x79e2, 0x79e0, 0x79de, 0x79dc, 0x79da, 0x79d9, - 0x79d7, 0x79d5, 0x79d3, 0x79d1, 0x79cf, 0x79cd, 0x79cb, 0x79c9, - 0x79c7, 0x79c5, 0x79c3, 0x79c1, 0x79bf, 0x79bd, 0x79bc, 0x79ba, - 0x79b8, 0x79b6, 0x79b4, 0x79b2, 0x79b0, 0x79ae, 0x79ac, 0x79aa, - 0x79a8, 0x79a6, 0x79a4, 0x79a2, 0x79a0, 0x799e, 0x799c, 0x799a, - 0x7998, 0x7996, 0x7994, 0x7992, 0x7991, 0x798f, 0x798d, 0x798b, - 0x7989, 0x7987, 0x7985, 0x7983, 0x7981, 0x797f, 0x797d, 0x797b, - 0x7979, 0x7977, 0x7975, 0x7973, 0x7971, 0x796f, 0x796d, 0x796b, - 0x7969, 0x7967, 0x7965, 0x7963, 0x7961, 0x795f, 0x795d, 0x795b, - 0x7959, 0x7957, 0x7955, 0x7953, 0x7951, 0x794f, 0x794d, 0x794b, - 0x7949, 0x7947, 0x7945, 0x7943, 0x7941, 0x793f, 0x793d, 0x793b, - 0x7939, 0x7937, 0x7935, 0x7933, 0x7931, 0x792f, 0x792d, 0x792b, - 0x7929, 0x7927, 0x7925, 0x7923, 0x7921, 0x791f, 0x791d, 0x791a, - 0x7918, 0x7916, 0x7914, 0x7912, 0x7910, 0x790e, 0x790c, 0x790a, - 0x7908, 0x7906, 0x7904, 0x7902, 0x7900, 0x78fe, 0x78fc, 0x78fa, - 0x78f8, 0x78f6, 0x78f4, 0x78f2, 0x78f0, 0x78ed, 0x78eb, 0x78e9, - 0x78e7, 0x78e5, 0x78e3, 0x78e1, 0x78df, 0x78dd, 0x78db, 0x78d9, - 0x78d7, 0x78d5, 0x78d3, 0x78d1, 0x78ce, 0x78cc, 0x78ca, 0x78c8, - 0x78c6, 0x78c4, 0x78c2, 0x78c0, 0x78be, 0x78bc, 0x78ba, 0x78b8, - 0x78b5, 0x78b3, 0x78b1, 0x78af, 0x78ad, 0x78ab, 0x78a9, 0x78a7, - 0x78a5, 0x78a3, 0x78a0, 0x789e, 0x789c, 0x789a, 0x7898, 0x7896, - 0x7894, 0x7892, 0x7890, 0x788e, 0x788b, 0x7889, 0x7887, 0x7885, - 0x7883, 0x7881, 0x787f, 0x787d, 0x787a, 0x7878, 0x7876, 0x7874, - 0x7872, 0x7870, 0x786e, 0x786c, 0x7869, 0x7867, 0x7865, 0x7863, - 0x7861, 0x785f, 0x785d, 0x785b, 0x7858, 0x7856, 0x7854, 0x7852, - 0x7850, 0x784e, 0x784c, 0x7849, 0x7847, 0x7845, 0x7843, 0x7841, - 0x783f, 0x783c, 0x783a, 0x7838, 0x7836, 0x7834, 0x7832, 0x7830, - 0x782d, 0x782b, 0x7829, 0x7827, 0x7825, 0x7823, 0x7820, 0x781e, - 0x781c, 0x781a, 0x7818, 0x7816, 0x7813, 0x7811, 0x780f, 0x780d, - 0x780b, 0x7808, 0x7806, 0x7804, 0x7802, 0x7800, 0x77fe, 0x77fb, - 0x77f9, 0x77f7, 0x77f5, 0x77f3, 0x77f0, 0x77ee, 0x77ec, 0x77ea, - 0x77e8, 0x77e5, 0x77e3, 0x77e1, 0x77df, 0x77dd, 0x77da, 0x77d8, - 0x77d6, 0x77d4, 0x77d2, 0x77cf, 0x77cd, 0x77cb, 0x77c9, 0x77c6, - 0x77c4, 0x77c2, 0x77c0, 0x77be, 0x77bb, 0x77b9, 0x77b7, 0x77b5, - 0x77b2, 0x77b0, 0x77ae, 0x77ac, 0x77aa, 0x77a7, 0x77a5, 0x77a3, - 0x77a1, 0x779e, 0x779c, 0x779a, 0x7798, 0x7795, 0x7793, 0x7791, - 0x778f, 0x778c, 0x778a, 0x7788, 0x7786, 0x7783, 0x7781, 0x777f, - 0x777d, 0x777a, 0x7778, 0x7776, 0x7774, 0x7771, 0x776f, 0x776d, - 0x776b, 0x7768, 0x7766, 0x7764, 0x7762, 0x775f, 0x775d, 0x775b, - 0x7759, 0x7756, 0x7754, 0x7752, 0x774f, 0x774d, 0x774b, 0x7749, - 0x7746, 0x7744, 0x7742, 0x773f, 0x773d, 0x773b, 0x7739, 0x7736, - 0x7734, 0x7732, 0x772f, 0x772d, 0x772b, 0x7729, 0x7726, 0x7724, - 0x7722, 0x771f, 0x771d, 0x771b, 0x7719, 0x7716, 0x7714, 0x7712, - 0x770f, 0x770d, 0x770b, 0x7708, 0x7706, 0x7704, 0x7701, 0x76ff, - 0x76fd, 0x76fa, 0x76f8, 0x76f6, 0x76f4, 0x76f1, 0x76ef, 0x76ed, - 0x76ea, 0x76e8, 0x76e6, 0x76e3, 0x76e1, 0x76df, 0x76dc, 0x76da, - 0x76d8, 0x76d5, 0x76d3, 0x76d1, 0x76ce, 0x76cc, 0x76ca, 0x76c7, - 0x76c5, 0x76c3, 0x76c0, 0x76be, 0x76bc, 0x76b9, 0x76b7, 0x76b4, - 0x76b2, 0x76b0, 0x76ad, 0x76ab, 0x76a9, 0x76a6, 0x76a4, 0x76a2, - 0x769f, 0x769d, 0x769b, 0x7698, 0x7696, 0x7693, 0x7691, 0x768f, - 0x768c, 0x768a, 0x7688, 0x7685, 0x7683, 0x7681, 0x767e, 0x767c, - 0x7679, 0x7677, 0x7675, 0x7672, 0x7670, 0x766d, 0x766b, 0x7669, - 0x7666, 0x7664, 0x7662, 0x765f, 0x765d, 0x765a, 0x7658, 0x7656, - 0x7653, 0x7651, 0x764e, 0x764c, 0x764a, 0x7647, 0x7645, 0x7642, - 0x7640, 0x763e, 0x763b, 0x7639, 0x7636, 0x7634, 0x7632, 0x762f, - 0x762d, 0x762a, 0x7628, 0x7625, 0x7623, 0x7621, 0x761e, 0x761c, - 0x7619, 0x7617, 0x7615, 0x7612, 0x7610, 0x760d, 0x760b, 0x7608, - 0x7606, 0x7604, 0x7601, 0x75ff, 0x75fc, 0x75fa, 0x75f7, 0x75f5, - 0x75f2, 0x75f0, 0x75ee, 0x75eb, 0x75e9, 0x75e6, 0x75e4, 0x75e1, - 0x75df, 0x75dc, 0x75da, 0x75d8, 0x75d5, 0x75d3, 0x75d0, 0x75ce, - 0x75cb, 0x75c9, 0x75c6, 0x75c4, 0x75c1, 0x75bf, 0x75bc, 0x75ba, - 0x75b8, 0x75b5, 0x75b3, 0x75b0, 0x75ae, 0x75ab, 0x75a9, 0x75a6, - 0x75a4, 0x75a1, 0x759f, 0x759c, 0x759a, 0x7597, 0x7595, 0x7592, - 0x7590, 0x758d, 0x758b, 0x7588, 0x7586, 0x7584, 0x7581, 0x757f, - 0x757c, 0x757a, 0x7577, 0x7575, 0x7572, 0x7570, 0x756d, 0x756b, - 0x7568, 0x7566, 0x7563, 0x7561, 0x755e, 0x755c, 0x7559, 0x7556, - 0x7554, 0x7551, 0x754f, 0x754c, 0x754a, 0x7547, 0x7545, 0x7542, - 0x7540, 0x753d, 0x753b, 0x7538, 0x7536, 0x7533, 0x7531, 0x752e, - 0x752c, 0x7529, 0x7527, 0x7524, 0x7522, 0x751f, 0x751c, 0x751a, - 0x7517, 0x7515, 0x7512, 0x7510, 0x750d, 0x750b, 0x7508, 0x7506, - 0x7503, 0x7501, 0x74fe, 0x74fb, 0x74f9, 0x74f6, 0x74f4, 0x74f1, - 0x74ef, 0x74ec, 0x74ea, 0x74e7, 0x74e4, 0x74e2, 0x74df, 0x74dd, - 0x74da, 0x74d8, 0x74d5, 0x74d2, 0x74d0, 0x74cd, 0x74cb, 0x74c8, - 0x74c6, 0x74c3, 0x74c0, 0x74be, 0x74bb, 0x74b9, 0x74b6, 0x74b4, - 0x74b1, 0x74ae, 0x74ac, 0x74a9, 0x74a7, 0x74a4, 0x74a1, 0x749f, - 0x749c, 0x749a, 0x7497, 0x7495, 0x7492, 0x748f, 0x748d, 0x748a, - 0x7488, 0x7485, 0x7482, 0x7480, 0x747d, 0x747b, 0x7478, 0x7475, - 0x7473, 0x7470, 0x746d, 0x746b, 0x7468, 0x7466, 0x7463, 0x7460, - 0x745e, 0x745b, 0x7459, 0x7456, 0x7453, 0x7451, 0x744e, 0x744b, - 0x7449, 0x7446, 0x7444, 0x7441, 0x743e, 0x743c, 0x7439, 0x7436, - 0x7434, 0x7431, 0x742f, 0x742c, 0x7429, 0x7427, 0x7424, 0x7421, - 0x741f, 0x741c, 0x7419, 0x7417, 0x7414, 0x7411, 0x740f, 0x740c, - 0x740a, 0x7407, 0x7404, 0x7402, 0x73ff, 0x73fc, 0x73fa, 0x73f7, - 0x73f4, 0x73f2, 0x73ef, 0x73ec, 0x73ea, 0x73e7, 0x73e4, 0x73e2, - 0x73df, 0x73dc, 0x73da, 0x73d7, 0x73d4, 0x73d2, 0x73cf, 0x73cc, - 0x73ca, 0x73c7, 0x73c4, 0x73c1, 0x73bf, 0x73bc, 0x73b9, 0x73b7, - 0x73b4, 0x73b1, 0x73af, 0x73ac, 0x73a9, 0x73a7, 0x73a4, 0x73a1, - 0x739f, 0x739c, 0x7399, 0x7396, 0x7394, 0x7391, 0x738e, 0x738c, - 0x7389, 0x7386, 0x7384, 0x7381, 0x737e, 0x737b, 0x7379, 0x7376, - 0x7373, 0x7371, 0x736e, 0x736b, 0x7368, 0x7366, 0x7363, 0x7360, - 0x735e, 0x735b, 0x7358, 0x7355, 0x7353, 0x7350, 0x734d, 0x734a, - 0x7348, 0x7345, 0x7342, 0x7340, 0x733d, 0x733a, 0x7337, 0x7335, - 0x7332, 0x732f, 0x732c, 0x732a, 0x7327, 0x7324, 0x7321, 0x731f, - 0x731c, 0x7319, 0x7316, 0x7314, 0x7311, 0x730e, 0x730b, 0x7309, - 0x7306, 0x7303, 0x7300, 0x72fe, 0x72fb, 0x72f8, 0x72f5, 0x72f3, - 0x72f0, 0x72ed, 0x72ea, 0x72e8, 0x72e5, 0x72e2, 0x72df, 0x72dc, - 0x72da, 0x72d7, 0x72d4, 0x72d1, 0x72cf, 0x72cc, 0x72c9, 0x72c6, - 0x72c3, 0x72c1, 0x72be, 0x72bb, 0x72b8, 0x72b5, 0x72b3, 0x72b0, - 0x72ad, 0x72aa, 0x72a8, 0x72a5, 0x72a2, 0x729f, 0x729c, 0x729a, - 0x7297, 0x7294, 0x7291, 0x728e, 0x728c, 0x7289, 0x7286, 0x7283, - 0x7280, 0x727e, 0x727b, 0x7278, 0x7275, 0x7272, 0x726f, 0x726d, - 0x726a, 0x7267, 0x7264, 0x7261, 0x725f, 0x725c, 0x7259, 0x7256, - 0x7253, 0x7250, 0x724e, 0x724b, 0x7248, 0x7245, 0x7242, 0x723f, - 0x723d, 0x723a, 0x7237, 0x7234, 0x7231, 0x722e, 0x722c, 0x7229, - 0x7226, 0x7223, 0x7220, 0x721d, 0x721b, 0x7218, 0x7215, 0x7212, - 0x720f, 0x720c, 0x7209, 0x7207, 0x7204, 0x7201, 0x71fe, 0x71fb, - 0x71f8, 0x71f5, 0x71f3, 0x71f0, 0x71ed, 0x71ea, 0x71e7, 0x71e4, - 0x71e1, 0x71df, 0x71dc, 0x71d9, 0x71d6, 0x71d3, 0x71d0, 0x71cd, - 0x71ca, 0x71c8, 0x71c5, 0x71c2, 0x71bf, 0x71bc, 0x71b9, 0x71b6, - 0x71b3, 0x71b0, 0x71ae, 0x71ab, 0x71a8, 0x71a5, 0x71a2, 0x719f, - 0x719c, 0x7199, 0x7196, 0x7194, 0x7191, 0x718e, 0x718b, 0x7188, - 0x7185, 0x7182, 0x717f, 0x717c, 0x7179, 0x7177, 0x7174, 0x7171, - 0x716e, 0x716b, 0x7168, 0x7165, 0x7162, 0x715f, 0x715c, 0x7159, - 0x7156, 0x7154, 0x7151, 0x714e, 0x714b, 0x7148, 0x7145, 0x7142, - 0x713f, 0x713c, 0x7139, 0x7136, 0x7133, 0x7130, 0x712d, 0x712b, - 0x7128, 0x7125, 0x7122, 0x711f, 0x711c, 0x7119, 0x7116, 0x7113, - 0x7110, 0x710d, 0x710a, 0x7107, 0x7104, 0x7101, 0x70fe, 0x70fb, - 0x70f8, 0x70f6, 0x70f3, 0x70f0, 0x70ed, 0x70ea, 0x70e7, 0x70e4, - 0x70e1, 0x70de, 0x70db, 0x70d8, 0x70d5, 0x70d2, 0x70cf, 0x70cc, - 0x70c9, 0x70c6, 0x70c3, 0x70c0, 0x70bd, 0x70ba, 0x70b7, 0x70b4, - 0x70b1, 0x70ae, 0x70ab, 0x70a8, 0x70a5, 0x70a2, 0x709f, 0x709c, - 0x7099, 0x7096, 0x7093, 0x7090, 0x708d, 0x708a, 0x7087, 0x7084, - 0x7081, 0x707e, 0x707b, 0x7078, 0x7075, 0x7072, 0x706f, 0x706c, - 0x7069, 0x7066, 0x7063, 0x7060, 0x705d, 0x705a, 0x7057, 0x7054, - 0x7051, 0x704e, 0x704b, 0x7048, 0x7045, 0x7042, 0x703f, 0x703c, - 0x7039, 0x7036, 0x7033, 0x7030, 0x702d, 0x702a, 0x7027, 0x7024, - 0x7021, 0x701e, 0x701b, 0x7018, 0x7015, 0x7012, 0x700f, 0x700c, - 0x7009, 0x7006, 0x7003, 0x7000, 0x6ffd, 0x6ffa, 0x6ff7, 0x6ff3, - 0x6ff0, 0x6fed, 0x6fea, 0x6fe7, 0x6fe4, 0x6fe1, 0x6fde, 0x6fdb, - 0x6fd8, 0x6fd5, 0x6fd2, 0x6fcf, 0x6fcc, 0x6fc9, 0x6fc6, 0x6fc3, - 0x6fc0, 0x6fbc, 0x6fb9, 0x6fb6, 0x6fb3, 0x6fb0, 0x6fad, 0x6faa, - 0x6fa7, 0x6fa4, 0x6fa1, 0x6f9e, 0x6f9b, 0x6f98, 0x6f95, 0x6f91, - 0x6f8e, 0x6f8b, 0x6f88, 0x6f85, 0x6f82, 0x6f7f, 0x6f7c, 0x6f79, - 0x6f76, 0x6f73, 0x6f70, 0x6f6c, 0x6f69, 0x6f66, 0x6f63, 0x6f60, - 0x6f5d, 0x6f5a, 0x6f57, 0x6f54, 0x6f51, 0x6f4d, 0x6f4a, 0x6f47, - 0x6f44, 0x6f41, 0x6f3e, 0x6f3b, 0x6f38, 0x6f35, 0x6f31, 0x6f2e, - 0x6f2b, 0x6f28, 0x6f25, 0x6f22, 0x6f1f, 0x6f1c, 0x6f19, 0x6f15, - 0x6f12, 0x6f0f, 0x6f0c, 0x6f09, 0x6f06, 0x6f03, 0x6f00, 0x6efc, - 0x6ef9, 0x6ef6, 0x6ef3, 0x6ef0, 0x6eed, 0x6eea, 0x6ee7, 0x6ee3, - 0x6ee0, 0x6edd, 0x6eda, 0x6ed7, 0x6ed4, 0x6ed1, 0x6ecd, 0x6eca, - 0x6ec7, 0x6ec4, 0x6ec1, 0x6ebe, 0x6eba, 0x6eb7, 0x6eb4, 0x6eb1, - 0x6eae, 0x6eab, 0x6ea8, 0x6ea4, 0x6ea1, 0x6e9e, 0x6e9b, 0x6e98, - 0x6e95, 0x6e91, 0x6e8e, 0x6e8b, 0x6e88, 0x6e85, 0x6e82, 0x6e7e, - 0x6e7b, 0x6e78, 0x6e75, 0x6e72, 0x6e6f, 0x6e6b, 0x6e68, 0x6e65, - 0x6e62, 0x6e5f, 0x6e5b, 0x6e58, 0x6e55, 0x6e52, 0x6e4f, 0x6e4c, - 0x6e48, 0x6e45, 0x6e42, 0x6e3f, 0x6e3c, 0x6e38, 0x6e35, 0x6e32, - 0x6e2f, 0x6e2c, 0x6e28, 0x6e25, 0x6e22, 0x6e1f, 0x6e1c, 0x6e18, - 0x6e15, 0x6e12, 0x6e0f, 0x6e0c, 0x6e08, 0x6e05, 0x6e02, 0x6dff, - 0x6dfb, 0x6df8, 0x6df5, 0x6df2, 0x6def, 0x6deb, 0x6de8, 0x6de5, - 0x6de2, 0x6ddf, 0x6ddb, 0x6dd8, 0x6dd5, 0x6dd2, 0x6dce, 0x6dcb, - 0x6dc8, 0x6dc5, 0x6dc1, 0x6dbe, 0x6dbb, 0x6db8, 0x6db5, 0x6db1, - 0x6dae, 0x6dab, 0x6da8, 0x6da4, 0x6da1, 0x6d9e, 0x6d9b, 0x6d97, - 0x6d94, 0x6d91, 0x6d8e, 0x6d8a, 0x6d87, 0x6d84, 0x6d81, 0x6d7d, - 0x6d7a, 0x6d77, 0x6d74, 0x6d70, 0x6d6d, 0x6d6a, 0x6d67, 0x6d63, - 0x6d60, 0x6d5d, 0x6d59, 0x6d56, 0x6d53, 0x6d50, 0x6d4c, 0x6d49, - 0x6d46, 0x6d43, 0x6d3f, 0x6d3c, 0x6d39, 0x6d36, 0x6d32, 0x6d2f, - 0x6d2c, 0x6d28, 0x6d25, 0x6d22, 0x6d1f, 0x6d1b, 0x6d18, 0x6d15, - 0x6d11, 0x6d0e, 0x6d0b, 0x6d08, 0x6d04, 0x6d01, 0x6cfe, 0x6cfa, - 0x6cf7, 0x6cf4, 0x6cf0, 0x6ced, 0x6cea, 0x6ce7, 0x6ce3, 0x6ce0, - 0x6cdd, 0x6cd9, 0x6cd6, 0x6cd3, 0x6ccf, 0x6ccc, 0x6cc9, 0x6cc5, - 0x6cc2, 0x6cbf, 0x6cbc, 0x6cb8, 0x6cb5, 0x6cb2, 0x6cae, 0x6cab, - 0x6ca8, 0x6ca4, 0x6ca1, 0x6c9e, 0x6c9a, 0x6c97, 0x6c94, 0x6c90, - 0x6c8d, 0x6c8a, 0x6c86, 0x6c83, 0x6c80, 0x6c7c, 0x6c79, 0x6c76, - 0x6c72, 0x6c6f, 0x6c6c, 0x6c68, 0x6c65, 0x6c62, 0x6c5e, 0x6c5b, - 0x6c58, 0x6c54, 0x6c51, 0x6c4e, 0x6c4a, 0x6c47, 0x6c44, 0x6c40, - 0x6c3d, 0x6c39, 0x6c36, 0x6c33, 0x6c2f, 0x6c2c, 0x6c29, 0x6c25, - 0x6c22, 0x6c1f, 0x6c1b, 0x6c18, 0x6c15, 0x6c11, 0x6c0e, 0x6c0a, - 0x6c07, 0x6c04, 0x6c00, 0x6bfd, 0x6bfa, 0x6bf6, 0x6bf3, 0x6bef, - 0x6bec, 0x6be9, 0x6be5, 0x6be2, 0x6bdf, 0x6bdb, 0x6bd8, 0x6bd4, - 0x6bd1, 0x6bce, 0x6bca, 0x6bc7, 0x6bc3, 0x6bc0, 0x6bbd, 0x6bb9, - 0x6bb6, 0x6bb2, 0x6baf, 0x6bac, 0x6ba8, 0x6ba5, 0x6ba1, 0x6b9e, - 0x6b9b, 0x6b97, 0x6b94, 0x6b90, 0x6b8d, 0x6b8a, 0x6b86, 0x6b83, - 0x6b7f, 0x6b7c, 0x6b79, 0x6b75, 0x6b72, 0x6b6e, 0x6b6b, 0x6b68, - 0x6b64, 0x6b61, 0x6b5d, 0x6b5a, 0x6b56, 0x6b53, 0x6b50, 0x6b4c, - 0x6b49, 0x6b45, 0x6b42, 0x6b3e, 0x6b3b, 0x6b38, 0x6b34, 0x6b31, - 0x6b2d, 0x6b2a, 0x6b26, 0x6b23, 0x6b20, 0x6b1c, 0x6b19, 0x6b15, - 0x6b12, 0x6b0e, 0x6b0b, 0x6b07, 0x6b04, 0x6b01, 0x6afd, 0x6afa, - 0x6af6, 0x6af3, 0x6aef, 0x6aec, 0x6ae8, 0x6ae5, 0x6ae1, 0x6ade, - 0x6adb, 0x6ad7, 0x6ad4, 0x6ad0, 0x6acd, 0x6ac9, 0x6ac6, 0x6ac2, - 0x6abf, 0x6abb, 0x6ab8, 0x6ab4, 0x6ab1, 0x6aae, 0x6aaa, 0x6aa7, - 0x6aa3, 0x6aa0, 0x6a9c, 0x6a99, 0x6a95, 0x6a92, 0x6a8e, 0x6a8b, - 0x6a87, 0x6a84, 0x6a80, 0x6a7d, 0x6a79, 0x6a76, 0x6a72, 0x6a6f, - 0x6a6b, 0x6a68, 0x6a64, 0x6a61, 0x6a5d, 0x6a5a, 0x6a56, 0x6a53, - 0x6a4f, 0x6a4c, 0x6a48, 0x6a45, 0x6a41, 0x6a3e, 0x6a3a, 0x6a37, - 0x6a33, 0x6a30, 0x6a2c, 0x6a29, 0x6a25, 0x6a22, 0x6a1e, 0x6a1b, - 0x6a17, 0x6a14, 0x6a10, 0x6a0d, 0x6a09, 0x6a06, 0x6a02, 0x69ff, - 0x69fb, 0x69f8, 0x69f4, 0x69f1, 0x69ed, 0x69e9, 0x69e6, 0x69e2, - 0x69df, 0x69db, 0x69d8, 0x69d4, 0x69d1, 0x69cd, 0x69ca, 0x69c6, - 0x69c3, 0x69bf, 0x69bc, 0x69b8, 0x69b4, 0x69b1, 0x69ad, 0x69aa, - 0x69a6, 0x69a3, 0x699f, 0x699c, 0x6998, 0x6995, 0x6991, 0x698d, - 0x698a, 0x6986, 0x6983, 0x697f, 0x697c, 0x6978, 0x6975, 0x6971, - 0x696d, 0x696a, 0x6966, 0x6963, 0x695f, 0x695c, 0x6958, 0x6954, - 0x6951, 0x694d, 0x694a, 0x6946, 0x6943, 0x693f, 0x693b, 0x6938, - 0x6934, 0x6931, 0x692d, 0x692a, 0x6926, 0x6922, 0x691f, 0x691b, - 0x6918, 0x6914, 0x6910, 0x690d, 0x6909, 0x6906, 0x6902, 0x68fe, - 0x68fb, 0x68f7, 0x68f4, 0x68f0, 0x68ec, 0x68e9, 0x68e5, 0x68e2, - 0x68de, 0x68da, 0x68d7, 0x68d3, 0x68d0, 0x68cc, 0x68c8, 0x68c5, - 0x68c1, 0x68be, 0x68ba, 0x68b6, 0x68b3, 0x68af, 0x68ac, 0x68a8, - 0x68a4, 0x68a1, 0x689d, 0x6899, 0x6896, 0x6892, 0x688f, 0x688b, - 0x6887, 0x6884, 0x6880, 0x687c, 0x6879, 0x6875, 0x6872, 0x686e, - 0x686a, 0x6867, 0x6863, 0x685f, 0x685c, 0x6858, 0x6854, 0x6851, - 0x684d, 0x684a, 0x6846, 0x6842, 0x683f, 0x683b, 0x6837, 0x6834, - 0x6830, 0x682c, 0x6829, 0x6825, 0x6821, 0x681e, 0x681a, 0x6816, - 0x6813, 0x680f, 0x680b, 0x6808, 0x6804, 0x6800, 0x67fd, 0x67f9, - 0x67f5, 0x67f2, 0x67ee, 0x67ea, 0x67e7, 0x67e3, 0x67df, 0x67dc, - 0x67d8, 0x67d4, 0x67d1, 0x67cd, 0x67c9, 0x67c6, 0x67c2, 0x67be, - 0x67bb, 0x67b7, 0x67b3, 0x67b0, 0x67ac, 0x67a8, 0x67a5, 0x67a1, - 0x679d, 0x679a, 0x6796, 0x6792, 0x678e, 0x678b, 0x6787, 0x6783, - 0x6780, 0x677c, 0x6778, 0x6775, 0x6771, 0x676d, 0x6769, 0x6766, - 0x6762, 0x675e, 0x675b, 0x6757, 0x6753, 0x6750, 0x674c, 0x6748, - 0x6744, 0x6741, 0x673d, 0x6739, 0x6736, 0x6732, 0x672e, 0x672a, - 0x6727, 0x6723, 0x671f, 0x671c, 0x6718, 0x6714, 0x6710, 0x670d, - 0x6709, 0x6705, 0x6701, 0x66fe, 0x66fa, 0x66f6, 0x66f3, 0x66ef, - 0x66eb, 0x66e7, 0x66e4, 0x66e0, 0x66dc, 0x66d8, 0x66d5, 0x66d1, - 0x66cd, 0x66c9, 0x66c6, 0x66c2, 0x66be, 0x66ba, 0x66b7, 0x66b3, - 0x66af, 0x66ab, 0x66a8, 0x66a4, 0x66a0, 0x669c, 0x6699, 0x6695, - 0x6691, 0x668d, 0x668a, 0x6686, 0x6682, 0x667e, 0x667b, 0x6677, - 0x6673, 0x666f, 0x666b, 0x6668, 0x6664, 0x6660, 0x665c, 0x6659, - 0x6655, 0x6651, 0x664d, 0x664a, 0x6646, 0x6642, 0x663e, 0x663a, - 0x6637, 0x6633, 0x662f, 0x662b, 0x6627, 0x6624, 0x6620, 0x661c, - 0x6618, 0x6615, 0x6611, 0x660d, 0x6609, 0x6605, 0x6602, 0x65fe, - 0x65fa, 0x65f6, 0x65f2, 0x65ef, 0x65eb, 0x65e7, 0x65e3, 0x65df, - 0x65dc, 0x65d8, 0x65d4, 0x65d0, 0x65cc, 0x65c9, 0x65c5, 0x65c1, - 0x65bd, 0x65b9, 0x65b5, 0x65b2, 0x65ae, 0x65aa, 0x65a6, 0x65a2, - 0x659f, 0x659b, 0x6597, 0x6593, 0x658f, 0x658b, 0x6588, 0x6584, - 0x6580, 0x657c, 0x6578, 0x6574, 0x6571, 0x656d, 0x6569, 0x6565, - 0x6561, 0x655d, 0x655a, 0x6556, 0x6552, 0x654e, 0x654a, 0x6546, - 0x6543, 0x653f, 0x653b, 0x6537, 0x6533, 0x652f, 0x652c, 0x6528, - 0x6524, 0x6520, 0x651c, 0x6518, 0x6514, 0x6511, 0x650d, 0x6509, - 0x6505, 0x6501, 0x64fd, 0x64f9, 0x64f6, 0x64f2, 0x64ee, 0x64ea, - 0x64e6, 0x64e2, 0x64de, 0x64db, 0x64d7, 0x64d3, 0x64cf, 0x64cb, - 0x64c7, 0x64c3, 0x64bf, 0x64bc, 0x64b8, 0x64b4, 0x64b0, 0x64ac, - 0x64a8, 0x64a4, 0x64a0, 0x649c, 0x6499, 0x6495, 0x6491, 0x648d, - 0x6489, 0x6485, 0x6481, 0x647d, 0x6479, 0x6476, 0x6472, 0x646e, - 0x646a, 0x6466, 0x6462, 0x645e, 0x645a, 0x6456, 0x6453, 0x644f, - 0x644b, 0x6447, 0x6443, 0x643f, 0x643b, 0x6437, 0x6433, 0x642f, - 0x642b, 0x6428, 0x6424, 0x6420, 0x641c, 0x6418, 0x6414, 0x6410, - 0x640c, 0x6408, 0x6404, 0x6400, 0x63fc, 0x63f9, 0x63f5, 0x63f1, - 0x63ed, 0x63e9, 0x63e5, 0x63e1, 0x63dd, 0x63d9, 0x63d5, 0x63d1, - 0x63cd, 0x63c9, 0x63c5, 0x63c1, 0x63be, 0x63ba, 0x63b6, 0x63b2, - 0x63ae, 0x63aa, 0x63a6, 0x63a2, 0x639e, 0x639a, 0x6396, 0x6392, - 0x638e, 0x638a, 0x6386, 0x6382, 0x637e, 0x637a, 0x6377, 0x6373, - 0x636f, 0x636b, 0x6367, 0x6363, 0x635f, 0x635b, 0x6357, 0x6353, - 0x634f, 0x634b, 0x6347, 0x6343, 0x633f, 0x633b, 0x6337, 0x6333, - 0x632f, 0x632b, 0x6327, 0x6323, 0x631f, 0x631b, 0x6317, 0x6313, - 0x630f, 0x630b, 0x6307, 0x6303, 0x62ff, 0x62fb, 0x62f7, 0x62f3, - 0x62f0, 0x62ec, 0x62e8, 0x62e4, 0x62e0, 0x62dc, 0x62d8, 0x62d4, - 0x62d0, 0x62cc, 0x62c8, 0x62c4, 0x62c0, 0x62bc, 0x62b8, 0x62b4, - 0x62b0, 0x62ac, 0x62a8, 0x62a4, 0x62a0, 0x629c, 0x6298, 0x6294, - 0x6290, 0x628c, 0x6288, 0x6284, 0x6280, 0x627c, 0x6278, 0x6273, - 0x626f, 0x626b, 0x6267, 0x6263, 0x625f, 0x625b, 0x6257, 0x6253, - 0x624f, 0x624b, 0x6247, 0x6243, 0x623f, 0x623b, 0x6237, 0x6233, - 0x622f, 0x622b, 0x6227, 0x6223, 0x621f, 0x621b, 0x6217, 0x6213, - 0x620f, 0x620b, 0x6207, 0x6203, 0x61ff, 0x61fb, 0x61f7, 0x61f3, - 0x61ee, 0x61ea, 0x61e6, 0x61e2, 0x61de, 0x61da, 0x61d6, 0x61d2, - 0x61ce, 0x61ca, 0x61c6, 0x61c2, 0x61be, 0x61ba, 0x61b6, 0x61b2, - 0x61ae, 0x61aa, 0x61a6, 0x61a1, 0x619d, 0x6199, 0x6195, 0x6191, - 0x618d, 0x6189, 0x6185, 0x6181, 0x617d, 0x6179, 0x6175, 0x6171, - 0x616d, 0x6168, 0x6164, 0x6160, 0x615c, 0x6158, 0x6154, 0x6150, - 0x614c, 0x6148, 0x6144, 0x6140, 0x613c, 0x6137, 0x6133, 0x612f, - 0x612b, 0x6127, 0x6123, 0x611f, 0x611b, 0x6117, 0x6113, 0x610f, - 0x610a, 0x6106, 0x6102, 0x60fe, 0x60fa, 0x60f6, 0x60f2, 0x60ee, - 0x60ea, 0x60e6, 0x60e1, 0x60dd, 0x60d9, 0x60d5, 0x60d1, 0x60cd, - 0x60c9, 0x60c5, 0x60c1, 0x60bc, 0x60b8, 0x60b4, 0x60b0, 0x60ac, - 0x60a8, 0x60a4, 0x60a0, 0x609c, 0x6097, 0x6093, 0x608f, 0x608b, - 0x6087, 0x6083, 0x607f, 0x607b, 0x6076, 0x6072, 0x606e, 0x606a, - 0x6066, 0x6062, 0x605e, 0x6059, 0x6055, 0x6051, 0x604d, 0x6049, - 0x6045, 0x6041, 0x603c, 0x6038, 0x6034, 0x6030, 0x602c, 0x6028, - 0x6024, 0x601f, 0x601b, 0x6017, 0x6013, 0x600f, 0x600b, 0x6007, - 0x6002, 0x5ffe, 0x5ffa, 0x5ff6, 0x5ff2, 0x5fee, 0x5fe9, 0x5fe5, - 0x5fe1, 0x5fdd, 0x5fd9, 0x5fd5, 0x5fd0, 0x5fcc, 0x5fc8, 0x5fc4, - 0x5fc0, 0x5fbc, 0x5fb7, 0x5fb3, 0x5faf, 0x5fab, 0x5fa7, 0x5fa3, - 0x5f9e, 0x5f9a, 0x5f96, 0x5f92, 0x5f8e, 0x5f8a, 0x5f85, 0x5f81, - 0x5f7d, 0x5f79, 0x5f75, 0x5f70, 0x5f6c, 0x5f68, 0x5f64, 0x5f60, - 0x5f5b, 0x5f57, 0x5f53, 0x5f4f, 0x5f4b, 0x5f46, 0x5f42, 0x5f3e, - 0x5f3a, 0x5f36, 0x5f31, 0x5f2d, 0x5f29, 0x5f25, 0x5f21, 0x5f1c, - 0x5f18, 0x5f14, 0x5f10, 0x5f0c, 0x5f07, 0x5f03, 0x5eff, 0x5efb, - 0x5ef7, 0x5ef2, 0x5eee, 0x5eea, 0x5ee6, 0x5ee2, 0x5edd, 0x5ed9, - 0x5ed5, 0x5ed1, 0x5ecc, 0x5ec8, 0x5ec4, 0x5ec0, 0x5ebc, 0x5eb7, - 0x5eb3, 0x5eaf, 0x5eab, 0x5ea6, 0x5ea2, 0x5e9e, 0x5e9a, 0x5e95, - 0x5e91, 0x5e8d, 0x5e89, 0x5e85, 0x5e80, 0x5e7c, 0x5e78, 0x5e74, - 0x5e6f, 0x5e6b, 0x5e67, 0x5e63, 0x5e5e, 0x5e5a, 0x5e56, 0x5e52, - 0x5e4d, 0x5e49, 0x5e45, 0x5e41, 0x5e3c, 0x5e38, 0x5e34, 0x5e30, - 0x5e2b, 0x5e27, 0x5e23, 0x5e1f, 0x5e1a, 0x5e16, 0x5e12, 0x5e0e, - 0x5e09, 0x5e05, 0x5e01, 0x5dfd, 0x5df8, 0x5df4, 0x5df0, 0x5deb, - 0x5de7, 0x5de3, 0x5ddf, 0x5dda, 0x5dd6, 0x5dd2, 0x5dce, 0x5dc9, - 0x5dc5, 0x5dc1, 0x5dbc, 0x5db8, 0x5db4, 0x5db0, 0x5dab, 0x5da7, - 0x5da3, 0x5d9e, 0x5d9a, 0x5d96, 0x5d92, 0x5d8d, 0x5d89, 0x5d85, - 0x5d80, 0x5d7c, 0x5d78, 0x5d74, 0x5d6f, 0x5d6b, 0x5d67, 0x5d62, - 0x5d5e, 0x5d5a, 0x5d55, 0x5d51, 0x5d4d, 0x5d49, 0x5d44, 0x5d40, - 0x5d3c, 0x5d37, 0x5d33, 0x5d2f, 0x5d2a, 0x5d26, 0x5d22, 0x5d1e, - 0x5d19, 0x5d15, 0x5d11, 0x5d0c, 0x5d08, 0x5d04, 0x5cff, 0x5cfb, - 0x5cf7, 0x5cf2, 0x5cee, 0x5cea, 0x5ce5, 0x5ce1, 0x5cdd, 0x5cd8, - 0x5cd4, 0x5cd0, 0x5ccb, 0x5cc7, 0x5cc3, 0x5cbe, 0x5cba, 0x5cb6, - 0x5cb1, 0x5cad, 0x5ca9, 0x5ca4, 0x5ca0, 0x5c9c, 0x5c97, 0x5c93, - 0x5c8f, 0x5c8a, 0x5c86, 0x5c82, 0x5c7d, 0x5c79, 0x5c75, 0x5c70, - 0x5c6c, 0x5c68, 0x5c63, 0x5c5f, 0x5c5b, 0x5c56, 0x5c52, 0x5c4e, - 0x5c49, 0x5c45, 0x5c41, 0x5c3c, 0x5c38, 0x5c33, 0x5c2f, 0x5c2b, - 0x5c26, 0x5c22, 0x5c1e, 0x5c19, 0x5c15, 0x5c11, 0x5c0c, 0x5c08, - 0x5c03, 0x5bff, 0x5bfb, 0x5bf6, 0x5bf2, 0x5bee, 0x5be9, 0x5be5, - 0x5be0, 0x5bdc, 0x5bd8, 0x5bd3, 0x5bcf, 0x5bcb, 0x5bc6, 0x5bc2, - 0x5bbd, 0x5bb9, 0x5bb5, 0x5bb0, 0x5bac, 0x5ba8, 0x5ba3, 0x5b9f, - 0x5b9a, 0x5b96, 0x5b92, 0x5b8d, 0x5b89, 0x5b84, 0x5b80, 0x5b7c, - 0x5b77, 0x5b73, 0x5b6e, 0x5b6a, 0x5b66, 0x5b61, 0x5b5d, 0x5b58, - 0x5b54, 0x5b50, 0x5b4b, 0x5b47, 0x5b42, 0x5b3e, 0x5b3a, 0x5b35, - 0x5b31, 0x5b2c, 0x5b28, 0x5b24, 0x5b1f, 0x5b1b, 0x5b16, 0x5b12, - 0x5b0e, 0x5b09, 0x5b05, 0x5b00, 0x5afc, 0x5af7, 0x5af3, 0x5aef, - 0x5aea, 0x5ae6, 0x5ae1, 0x5add, 0x5ad8, 0x5ad4, 0x5ad0, 0x5acb, - 0x5ac7, 0x5ac2, 0x5abe, 0x5ab9, 0x5ab5, 0x5ab1, 0x5aac, 0x5aa8, - 0x5aa3, 0x5a9f, 0x5a9a, 0x5a96, 0x5a92, 0x5a8d, 0x5a89, 0x5a84, - 0x5a80, 0x5a7b, 0x5a77, 0x5a72, 0x5a6e, 0x5a6a, 0x5a65, 0x5a61, - 0x5a5c, 0x5a58, 0x5a53, 0x5a4f, 0x5a4a, 0x5a46, 0x5a41, 0x5a3d, - 0x5a39, 0x5a34, 0x5a30, 0x5a2b, 0x5a27, 0x5a22, 0x5a1e, 0x5a19, - 0x5a15, 0x5a10, 0x5a0c, 0x5a07, 0x5a03, 0x59ff, 0x59fa, 0x59f6, - 0x59f1, 0x59ed, 0x59e8, 0x59e4, 0x59df, 0x59db, 0x59d6, 0x59d2, - 0x59cd, 0x59c9, 0x59c4, 0x59c0, 0x59bb, 0x59b7, 0x59b2, 0x59ae, - 0x59a9, 0x59a5, 0x59a1, 0x599c, 0x5998, 0x5993, 0x598f, 0x598a, - 0x5986, 0x5981, 0x597d, 0x5978, 0x5974, 0x596f, 0x596b, 0x5966, - 0x5962, 0x595d, 0x5959, 0x5954, 0x5950, 0x594b, 0x5947, 0x5942, - 0x593e, 0x5939, 0x5935, 0x5930, 0x592c, 0x5927, 0x5923, 0x591e, - 0x591a, 0x5915, 0x5911, 0x590c, 0x5908, 0x5903, 0x58fe, 0x58fa, - 0x58f5, 0x58f1, 0x58ec, 0x58e8, 0x58e3, 0x58df, 0x58da, 0x58d6, - 0x58d1, 0x58cd, 0x58c8, 0x58c4, 0x58bf, 0x58bb, 0x58b6, 0x58b2, - 0x58ad, 0x58a9, 0x58a4, 0x589f, 0x589b, 0x5896, 0x5892, 0x588d, - 0x5889, 0x5884, 0x5880, 0x587b, 0x5877, 0x5872, 0x586e, 0x5869, - 0x5864, 0x5860, 0x585b, 0x5857, 0x5852, 0x584e, 0x5849, 0x5845, - 0x5840, 0x583c, 0x5837, 0x5832, 0x582e, 0x5829, 0x5825, 0x5820, - 0x581c, 0x5817, 0x5813, 0x580e, 0x5809, 0x5805, 0x5800, 0x57fc, - 0x57f7, 0x57f3, 0x57ee, 0x57e9, 0x57e5, 0x57e0, 0x57dc, 0x57d7, - 0x57d3, 0x57ce, 0x57c9, 0x57c5, 0x57c0, 0x57bc, 0x57b7, 0x57b3, - 0x57ae, 0x57a9, 0x57a5, 0x57a0, 0x579c, 0x5797, 0x5793, 0x578e, - 0x5789, 0x5785, 0x5780, 0x577c, 0x5777, 0x5772, 0x576e, 0x5769, - 0x5765, 0x5760, 0x575c, 0x5757, 0x5752, 0x574e, 0x5749, 0x5745, - 0x5740, 0x573b, 0x5737, 0x5732, 0x572e, 0x5729, 0x5724, 0x5720, - 0x571b, 0x5717, 0x5712, 0x570d, 0x5709, 0x5704, 0x56ff, 0x56fb, - 0x56f6, 0x56f2, 0x56ed, 0x56e8, 0x56e4, 0x56df, 0x56db, 0x56d6, - 0x56d1, 0x56cd, 0x56c8, 0x56c4, 0x56bf, 0x56ba, 0x56b6, 0x56b1, - 0x56ac, 0x56a8, 0x56a3, 0x569f, 0x569a, 0x5695, 0x5691, 0x568c, - 0x5687, 0x5683, 0x567e, 0x5679, 0x5675, 0x5670, 0x566c, 0x5667, - 0x5662, 0x565e, 0x5659, 0x5654, 0x5650, 0x564b, 0x5646, 0x5642, - 0x563d, 0x5639, 0x5634, 0x562f, 0x562b, 0x5626, 0x5621, 0x561d, - 0x5618, 0x5613, 0x560f, 0x560a, 0x5605, 0x5601, 0x55fc, 0x55f7, - 0x55f3, 0x55ee, 0x55ea, 0x55e5, 0x55e0, 0x55dc, 0x55d7, 0x55d2, - 0x55ce, 0x55c9, 0x55c4, 0x55c0, 0x55bb, 0x55b6, 0x55b2, 0x55ad, - 0x55a8, 0x55a4, 0x559f, 0x559a, 0x5596, 0x5591, 0x558c, 0x5588, - 0x5583, 0x557e, 0x5579, 0x5575, 0x5570, 0x556b, 0x5567, 0x5562, - 0x555d, 0x5559, 0x5554, 0x554f, 0x554b, 0x5546, 0x5541, 0x553d, - 0x5538, 0x5533, 0x552f, 0x552a, 0x5525, 0x5520, 0x551c, 0x5517, - 0x5512, 0x550e, 0x5509, 0x5504, 0x5500, 0x54fb, 0x54f6, 0x54f2, - 0x54ed, 0x54e8, 0x54e3, 0x54df, 0x54da, 0x54d5, 0x54d1, 0x54cc, - 0x54c7, 0x54c2, 0x54be, 0x54b9, 0x54b4, 0x54b0, 0x54ab, 0x54a6, - 0x54a2, 0x549d, 0x5498, 0x5493, 0x548f, 0x548a, 0x5485, 0x5480, - 0x547c, 0x5477, 0x5472, 0x546e, 0x5469, 0x5464, 0x545f, 0x545b, - 0x5456, 0x5451, 0x544d, 0x5448, 0x5443, 0x543e, 0x543a, 0x5435, - 0x5430, 0x542b, 0x5427, 0x5422, 0x541d, 0x5418, 0x5414, 0x540f, - 0x540a, 0x5406, 0x5401, 0x53fc, 0x53f7, 0x53f3, 0x53ee, 0x53e9, - 0x53e4, 0x53e0, 0x53db, 0x53d6, 0x53d1, 0x53cd, 0x53c8, 0x53c3, - 0x53be, 0x53ba, 0x53b5, 0x53b0, 0x53ab, 0x53a7, 0x53a2, 0x539d, - 0x5398, 0x5394, 0x538f, 0x538a, 0x5385, 0x5380, 0x537c, 0x5377, - 0x5372, 0x536d, 0x5369, 0x5364, 0x535f, 0x535a, 0x5356, 0x5351, - 0x534c, 0x5347, 0x5343, 0x533e, 0x5339, 0x5334, 0x532f, 0x532b, - 0x5326, 0x5321, 0x531c, 0x5318, 0x5313, 0x530e, 0x5309, 0x5304, - 0x5300, 0x52fb, 0x52f6, 0x52f1, 0x52ec, 0x52e8, 0x52e3, 0x52de, - 0x52d9, 0x52d5, 0x52d0, 0x52cb, 0x52c6, 0x52c1, 0x52bd, 0x52b8, - 0x52b3, 0x52ae, 0x52a9, 0x52a5, 0x52a0, 0x529b, 0x5296, 0x5291, - 0x528d, 0x5288, 0x5283, 0x527e, 0x5279, 0x5275, 0x5270, 0x526b, - 0x5266, 0x5261, 0x525d, 0x5258, 0x5253, 0x524e, 0x5249, 0x5244, - 0x5240, 0x523b, 0x5236, 0x5231, 0x522c, 0x5228, 0x5223, 0x521e, - 0x5219, 0x5214, 0x520f, 0x520b, 0x5206, 0x5201, 0x51fc, 0x51f7, - 0x51f3, 0x51ee, 0x51e9, 0x51e4, 0x51df, 0x51da, 0x51d6, 0x51d1, - 0x51cc, 0x51c7, 0x51c2, 0x51bd, 0x51b9, 0x51b4, 0x51af, 0x51aa, - 0x51a5, 0x51a0, 0x519c, 0x5197, 0x5192, 0x518d, 0x5188, 0x5183, - 0x517e, 0x517a, 0x5175, 0x5170, 0x516b, 0x5166, 0x5161, 0x515d, - 0x5158, 0x5153, 0x514e, 0x5149, 0x5144, 0x513f, 0x513b, 0x5136, - 0x5131, 0x512c, 0x5127, 0x5122, 0x511d, 0x5119, 0x5114, 0x510f, - 0x510a, 0x5105, 0x5100, 0x50fb, 0x50f7, 0x50f2, 0x50ed, 0x50e8, - 0x50e3, 0x50de, 0x50d9, 0x50d4, 0x50d0, 0x50cb, 0x50c6, 0x50c1, - 0x50bc, 0x50b7, 0x50b2, 0x50ad, 0x50a9, 0x50a4, 0x509f, 0x509a, - 0x5095, 0x5090, 0x508b, 0x5086, 0x5082, 0x507d, 0x5078, 0x5073, - 0x506e, 0x5069, 0x5064, 0x505f, 0x505a, 0x5056, 0x5051, 0x504c, - 0x5047, 0x5042, 0x503d, 0x5038, 0x5033, 0x502e, 0x5029, 0x5025, - 0x5020, 0x501b, 0x5016, 0x5011, 0x500c, 0x5007, 0x5002, 0x4ffd, - 0x4ff8, 0x4ff4, 0x4fef, 0x4fea, 0x4fe5, 0x4fe0, 0x4fdb, 0x4fd6, - 0x4fd1, 0x4fcc, 0x4fc7, 0x4fc2, 0x4fbe, 0x4fb9, 0x4fb4, 0x4faf, - 0x4faa, 0x4fa5, 0x4fa0, 0x4f9b, 0x4f96, 0x4f91, 0x4f8c, 0x4f87, - 0x4f82, 0x4f7e, 0x4f79, 0x4f74, 0x4f6f, 0x4f6a, 0x4f65, 0x4f60, - 0x4f5b, 0x4f56, 0x4f51, 0x4f4c, 0x4f47, 0x4f42, 0x4f3d, 0x4f39, - 0x4f34, 0x4f2f, 0x4f2a, 0x4f25, 0x4f20, 0x4f1b, 0x4f16, 0x4f11, - 0x4f0c, 0x4f07, 0x4f02, 0x4efd, 0x4ef8, 0x4ef3, 0x4eee, 0x4ee9, - 0x4ee5, 0x4ee0, 0x4edb, 0x4ed6, 0x4ed1, 0x4ecc, 0x4ec7, 0x4ec2, - 0x4ebd, 0x4eb8, 0x4eb3, 0x4eae, 0x4ea9, 0x4ea4, 0x4e9f, 0x4e9a, - 0x4e95, 0x4e90, 0x4e8b, 0x4e86, 0x4e81, 0x4e7c, 0x4e78, 0x4e73, - 0x4e6e, 0x4e69, 0x4e64, 0x4e5f, 0x4e5a, 0x4e55, 0x4e50, 0x4e4b, - 0x4e46, 0x4e41, 0x4e3c, 0x4e37, 0x4e32, 0x4e2d, 0x4e28, 0x4e23, - 0x4e1e, 0x4e19, 0x4e14, 0x4e0f, 0x4e0a, 0x4e05, 0x4e00, 0x4dfb, - 0x4df6, 0x4df1, 0x4dec, 0x4de7, 0x4de2, 0x4ddd, 0x4dd8, 0x4dd3, - 0x4dce, 0x4dc9, 0x4dc4, 0x4dbf, 0x4dba, 0x4db5, 0x4db0, 0x4dab, - 0x4da6, 0x4da1, 0x4d9c, 0x4d97, 0x4d92, 0x4d8d, 0x4d88, 0x4d83, - 0x4d7e, 0x4d79, 0x4d74, 0x4d6f, 0x4d6a, 0x4d65, 0x4d60, 0x4d5b, - 0x4d56, 0x4d51, 0x4d4c, 0x4d47, 0x4d42, 0x4d3d, 0x4d38, 0x4d33, - 0x4d2e, 0x4d29, 0x4d24, 0x4d1f, 0x4d1a, 0x4d15, 0x4d10, 0x4d0b, - 0x4d06, 0x4d01, 0x4cfc, 0x4cf7, 0x4cf2, 0x4ced, 0x4ce8, 0x4ce3, - 0x4cde, 0x4cd9, 0x4cd4, 0x4ccf, 0x4cca, 0x4cc5, 0x4cc0, 0x4cbb, - 0x4cb6, 0x4cb1, 0x4cac, 0x4ca7, 0x4ca2, 0x4c9d, 0x4c98, 0x4c93, - 0x4c8e, 0x4c88, 0x4c83, 0x4c7e, 0x4c79, 0x4c74, 0x4c6f, 0x4c6a, - 0x4c65, 0x4c60, 0x4c5b, 0x4c56, 0x4c51, 0x4c4c, 0x4c47, 0x4c42, - 0x4c3d, 0x4c38, 0x4c33, 0x4c2e, 0x4c29, 0x4c24, 0x4c1f, 0x4c1a, - 0x4c14, 0x4c0f, 0x4c0a, 0x4c05, 0x4c00, 0x4bfb, 0x4bf6, 0x4bf1, - 0x4bec, 0x4be7, 0x4be2, 0x4bdd, 0x4bd8, 0x4bd3, 0x4bce, 0x4bc9, - 0x4bc4, 0x4bbe, 0x4bb9, 0x4bb4, 0x4baf, 0x4baa, 0x4ba5, 0x4ba0, - 0x4b9b, 0x4b96, 0x4b91, 0x4b8c, 0x4b87, 0x4b82, 0x4b7d, 0x4b77, - 0x4b72, 0x4b6d, 0x4b68, 0x4b63, 0x4b5e, 0x4b59, 0x4b54, 0x4b4f, - 0x4b4a, 0x4b45, 0x4b40, 0x4b3b, 0x4b35, 0x4b30, 0x4b2b, 0x4b26, - 0x4b21, 0x4b1c, 0x4b17, 0x4b12, 0x4b0d, 0x4b08, 0x4b03, 0x4afd, - 0x4af8, 0x4af3, 0x4aee, 0x4ae9, 0x4ae4, 0x4adf, 0x4ada, 0x4ad5, - 0x4ad0, 0x4acb, 0x4ac5, 0x4ac0, 0x4abb, 0x4ab6, 0x4ab1, 0x4aac, - 0x4aa7, 0x4aa2, 0x4a9d, 0x4a97, 0x4a92, 0x4a8d, 0x4a88, 0x4a83, - 0x4a7e, 0x4a79, 0x4a74, 0x4a6f, 0x4a6a, 0x4a64, 0x4a5f, 0x4a5a, - 0x4a55, 0x4a50, 0x4a4b, 0x4a46, 0x4a41, 0x4a3b, 0x4a36, 0x4a31, - 0x4a2c, 0x4a27, 0x4a22, 0x4a1d, 0x4a18, 0x4a12, 0x4a0d, 0x4a08, - 0x4a03, 0x49fe, 0x49f9, 0x49f4, 0x49ef, 0x49e9, 0x49e4, 0x49df, - 0x49da, 0x49d5, 0x49d0, 0x49cb, 0x49c6, 0x49c0, 0x49bb, 0x49b6, - 0x49b1, 0x49ac, 0x49a7, 0x49a2, 0x499c, 0x4997, 0x4992, 0x498d, - 0x4988, 0x4983, 0x497e, 0x4978, 0x4973, 0x496e, 0x4969, 0x4964, - 0x495f, 0x495a, 0x4954, 0x494f, 0x494a, 0x4945, 0x4940, 0x493b, - 0x4936, 0x4930, 0x492b, 0x4926, 0x4921, 0x491c, 0x4917, 0x4911, - 0x490c, 0x4907, 0x4902, 0x48fd, 0x48f8, 0x48f2, 0x48ed, 0x48e8, - 0x48e3, 0x48de, 0x48d9, 0x48d3, 0x48ce, 0x48c9, 0x48c4, 0x48bf, - 0x48ba, 0x48b4, 0x48af, 0x48aa, 0x48a5, 0x48a0, 0x489b, 0x4895, - 0x4890, 0x488b, 0x4886, 0x4881, 0x487c, 0x4876, 0x4871, 0x486c, - 0x4867, 0x4862, 0x485c, 0x4857, 0x4852, 0x484d, 0x4848, 0x4843, - 0x483d, 0x4838, 0x4833, 0x482e, 0x4829, 0x4823, 0x481e, 0x4819, - 0x4814, 0x480f, 0x4809, 0x4804, 0x47ff, 0x47fa, 0x47f5, 0x47ef, - 0x47ea, 0x47e5, 0x47e0, 0x47db, 0x47d5, 0x47d0, 0x47cb, 0x47c6, - 0x47c1, 0x47bb, 0x47b6, 0x47b1, 0x47ac, 0x47a7, 0x47a1, 0x479c, - 0x4797, 0x4792, 0x478d, 0x4787, 0x4782, 0x477d, 0x4778, 0x4773, - 0x476d, 0x4768, 0x4763, 0x475e, 0x4758, 0x4753, 0x474e, 0x4749, - 0x4744, 0x473e, 0x4739, 0x4734, 0x472f, 0x4729, 0x4724, 0x471f, - 0x471a, 0x4715, 0x470f, 0x470a, 0x4705, 0x4700, 0x46fa, 0x46f5, - 0x46f0, 0x46eb, 0x46e6, 0x46e0, 0x46db, 0x46d6, 0x46d1, 0x46cb, - 0x46c6, 0x46c1, 0x46bc, 0x46b6, 0x46b1, 0x46ac, 0x46a7, 0x46a1, - 0x469c, 0x4697, 0x4692, 0x468d, 0x4687, 0x4682, 0x467d, 0x4678, - 0x4672, 0x466d, 0x4668, 0x4663, 0x465d, 0x4658, 0x4653, 0x464e, - 0x4648, 0x4643, 0x463e, 0x4639, 0x4633, 0x462e, 0x4629, 0x4624, - 0x461e, 0x4619, 0x4614, 0x460e, 0x4609, 0x4604, 0x45ff, 0x45f9, - 0x45f4, 0x45ef, 0x45ea, 0x45e4, 0x45df, 0x45da, 0x45d5, 0x45cf, - 0x45ca, 0x45c5, 0x45c0, 0x45ba, 0x45b5, 0x45b0, 0x45aa, 0x45a5, - 0x45a0, 0x459b, 0x4595, 0x4590, 0x458b, 0x4586, 0x4580, 0x457b, - 0x4576, 0x4570, 0x456b, 0x4566, 0x4561, 0x455b, 0x4556, 0x4551, - 0x454b, 0x4546, 0x4541, 0x453c, 0x4536, 0x4531, 0x452c, 0x4526, - 0x4521, 0x451c, 0x4517, 0x4511, 0x450c, 0x4507, 0x4501, 0x44fc, - 0x44f7, 0x44f2, 0x44ec, 0x44e7, 0x44e2, 0x44dc, 0x44d7, 0x44d2, - 0x44cd, 0x44c7, 0x44c2, 0x44bd, 0x44b7, 0x44b2, 0x44ad, 0x44a7, - 0x44a2, 0x449d, 0x4497, 0x4492, 0x448d, 0x4488, 0x4482, 0x447d, - 0x4478, 0x4472, 0x446d, 0x4468, 0x4462, 0x445d, 0x4458, 0x4452, - 0x444d, 0x4448, 0x4443, 0x443d, 0x4438, 0x4433, 0x442d, 0x4428, - 0x4423, 0x441d, 0x4418, 0x4413, 0x440d, 0x4408, 0x4403, 0x43fd, - 0x43f8, 0x43f3, 0x43ed, 0x43e8, 0x43e3, 0x43dd, 0x43d8, 0x43d3, - 0x43cd, 0x43c8, 0x43c3, 0x43bd, 0x43b8, 0x43b3, 0x43ad, 0x43a8, - 0x43a3, 0x439d, 0x4398, 0x4393, 0x438d, 0x4388, 0x4383, 0x437d, - 0x4378, 0x4373, 0x436d, 0x4368, 0x4363, 0x435d, 0x4358, 0x4353, - 0x434d, 0x4348, 0x4343, 0x433d, 0x4338, 0x4333, 0x432d, 0x4328, - 0x4323, 0x431d, 0x4318, 0x4313, 0x430d, 0x4308, 0x4302, 0x42fd, - 0x42f8, 0x42f2, 0x42ed, 0x42e8, 0x42e2, 0x42dd, 0x42d8, 0x42d2, - 0x42cd, 0x42c8, 0x42c2, 0x42bd, 0x42b7, 0x42b2, 0x42ad, 0x42a7, - 0x42a2, 0x429d, 0x4297, 0x4292, 0x428d, 0x4287, 0x4282, 0x427c, - 0x4277, 0x4272, 0x426c, 0x4267, 0x4262, 0x425c, 0x4257, 0x4251, - 0x424c, 0x4247, 0x4241, 0x423c, 0x4237, 0x4231, 0x422c, 0x4226, - 0x4221, 0x421c, 0x4216, 0x4211, 0x420c, 0x4206, 0x4201, 0x41fb, - 0x41f6, 0x41f1, 0x41eb, 0x41e6, 0x41e0, 0x41db, 0x41d6, 0x41d0, - 0x41cb, 0x41c6, 0x41c0, 0x41bb, 0x41b5, 0x41b0, 0x41ab, 0x41a5, - 0x41a0, 0x419a, 0x4195, 0x4190, 0x418a, 0x4185, 0x417f, 0x417a, - 0x4175, 0x416f, 0x416a, 0x4164, 0x415f, 0x415a, 0x4154, 0x414f, - 0x4149, 0x4144, 0x413f, 0x4139, 0x4134, 0x412e, 0x4129, 0x4124, - 0x411e, 0x4119, 0x4113, 0x410e, 0x4108, 0x4103, 0x40fe, 0x40f8, - 0x40f3, 0x40ed, 0x40e8, 0x40e3, 0x40dd, 0x40d8, 0x40d2, 0x40cd, - 0x40c8, 0x40c2, 0x40bd, 0x40b7, 0x40b2, 0x40ac, 0x40a7, 0x40a2, - 0x409c, 0x4097, 0x4091, 0x408c, 0x4086, 0x4081, 0x407c, 0x4076, - 0x4071, 0x406b, 0x4066, 0x4060, 0x405b, 0x4056, 0x4050, 0x404b, - 0x4045, 0x4040, 0x403a, 0x4035, 0x4030, 0x402a, 0x4025, 0x401f, - 0x401a, 0x4014, 0x400f, 0x4009, 0x4004, 0x3fff, 0x3ff9, 0x3ff4, - 0x3fee, 0x3fe9, 0x3fe3, 0x3fde, 0x3fd8, 0x3fd3, 0x3fce, 0x3fc8, - 0x3fc3, 0x3fbd, 0x3fb8, 0x3fb2, 0x3fad, 0x3fa7, 0x3fa2, 0x3f9d, - 0x3f97, 0x3f92, 0x3f8c, 0x3f87, 0x3f81, 0x3f7c, 0x3f76, 0x3f71, - 0x3f6b, 0x3f66, 0x3f61, 0x3f5b, 0x3f56, 0x3f50, 0x3f4b, 0x3f45, - 0x3f40, 0x3f3a, 0x3f35, 0x3f2f, 0x3f2a, 0x3f24, 0x3f1f, 0x3f1a, - 0x3f14, 0x3f0f, 0x3f09, 0x3f04, 0x3efe, 0x3ef9, 0x3ef3, 0x3eee, - 0x3ee8, 0x3ee3, 0x3edd, 0x3ed8, 0x3ed2, 0x3ecd, 0x3ec7, 0x3ec2, - 0x3ebd, 0x3eb7, 0x3eb2, 0x3eac, 0x3ea7, 0x3ea1, 0x3e9c, 0x3e96, - 0x3e91, 0x3e8b, 0x3e86, 0x3e80, 0x3e7b, 0x3e75, 0x3e70, 0x3e6a, - 0x3e65, 0x3e5f, 0x3e5a, 0x3e54, 0x3e4f, 0x3e49, 0x3e44, 0x3e3e, - 0x3e39, 0x3e33, 0x3e2e, 0x3e28, 0x3e23, 0x3e1d, 0x3e18, 0x3e12, - 0x3e0d, 0x3e07, 0x3e02, 0x3dfc, 0x3df7, 0x3df1, 0x3dec, 0x3de6, - 0x3de1, 0x3ddb, 0x3dd6, 0x3dd0, 0x3dcb, 0x3dc5, 0x3dc0, 0x3dba, - 0x3db5, 0x3daf, 0x3daa, 0x3da4, 0x3d9f, 0x3d99, 0x3d94, 0x3d8e, - 0x3d89, 0x3d83, 0x3d7e, 0x3d78, 0x3d73, 0x3d6d, 0x3d68, 0x3d62, - 0x3d5d, 0x3d57, 0x3d52, 0x3d4c, 0x3d47, 0x3d41, 0x3d3c, 0x3d36, - 0x3d31, 0x3d2b, 0x3d26, 0x3d20, 0x3d1b, 0x3d15, 0x3d10, 0x3d0a, - 0x3d04, 0x3cff, 0x3cf9, 0x3cf4, 0x3cee, 0x3ce9, 0x3ce3, 0x3cde, - 0x3cd8, 0x3cd3, 0x3ccd, 0x3cc8, 0x3cc2, 0x3cbd, 0x3cb7, 0x3cb2, - 0x3cac, 0x3ca7, 0x3ca1, 0x3c9b, 0x3c96, 0x3c90, 0x3c8b, 0x3c85, - 0x3c80, 0x3c7a, 0x3c75, 0x3c6f, 0x3c6a, 0x3c64, 0x3c5f, 0x3c59, - 0x3c53, 0x3c4e, 0x3c48, 0x3c43, 0x3c3d, 0x3c38, 0x3c32, 0x3c2d, - 0x3c27, 0x3c22, 0x3c1c, 0x3c16, 0x3c11, 0x3c0b, 0x3c06, 0x3c00, - 0x3bfb, 0x3bf5, 0x3bf0, 0x3bea, 0x3be5, 0x3bdf, 0x3bd9, 0x3bd4, - 0x3bce, 0x3bc9, 0x3bc3, 0x3bbe, 0x3bb8, 0x3bb3, 0x3bad, 0x3ba7, - 0x3ba2, 0x3b9c, 0x3b97, 0x3b91, 0x3b8c, 0x3b86, 0x3b80, 0x3b7b, - 0x3b75, 0x3b70, 0x3b6a, 0x3b65, 0x3b5f, 0x3b5a, 0x3b54, 0x3b4e, - 0x3b49, 0x3b43, 0x3b3e, 0x3b38, 0x3b33, 0x3b2d, 0x3b27, 0x3b22, - 0x3b1c, 0x3b17, 0x3b11, 0x3b0c, 0x3b06, 0x3b00, 0x3afb, 0x3af5, - 0x3af0, 0x3aea, 0x3ae4, 0x3adf, 0x3ad9, 0x3ad4, 0x3ace, 0x3ac9, - 0x3ac3, 0x3abd, 0x3ab8, 0x3ab2, 0x3aad, 0x3aa7, 0x3aa2, 0x3a9c, - 0x3a96, 0x3a91, 0x3a8b, 0x3a86, 0x3a80, 0x3a7a, 0x3a75, 0x3a6f, - 0x3a6a, 0x3a64, 0x3a5e, 0x3a59, 0x3a53, 0x3a4e, 0x3a48, 0x3a42, - 0x3a3d, 0x3a37, 0x3a32, 0x3a2c, 0x3a26, 0x3a21, 0x3a1b, 0x3a16, - 0x3a10, 0x3a0b, 0x3a05, 0x39ff, 0x39fa, 0x39f4, 0x39ee, 0x39e9, - 0x39e3, 0x39de, 0x39d8, 0x39d2, 0x39cd, 0x39c7, 0x39c2, 0x39bc, - 0x39b6, 0x39b1, 0x39ab, 0x39a6, 0x39a0, 0x399a, 0x3995, 0x398f, - 0x398a, 0x3984, 0x397e, 0x3979, 0x3973, 0x396d, 0x3968, 0x3962, - 0x395d, 0x3957, 0x3951, 0x394c, 0x3946, 0x3941, 0x393b, 0x3935, - 0x3930, 0x392a, 0x3924, 0x391f, 0x3919, 0x3914, 0x390e, 0x3908, - 0x3903, 0x38fd, 0x38f7, 0x38f2, 0x38ec, 0x38e7, 0x38e1, 0x38db, - 0x38d6, 0x38d0, 0x38ca, 0x38c5, 0x38bf, 0x38ba, 0x38b4, 0x38ae, - 0x38a9, 0x38a3, 0x389d, 0x3898, 0x3892, 0x388c, 0x3887, 0x3881, - 0x387c, 0x3876, 0x3870, 0x386b, 0x3865, 0x385f, 0x385a, 0x3854, - 0x384e, 0x3849, 0x3843, 0x383d, 0x3838, 0x3832, 0x382d, 0x3827, - 0x3821, 0x381c, 0x3816, 0x3810, 0x380b, 0x3805, 0x37ff, 0x37fa, - 0x37f4, 0x37ee, 0x37e9, 0x37e3, 0x37dd, 0x37d8, 0x37d2, 0x37cc, - 0x37c7, 0x37c1, 0x37bc, 0x37b6, 0x37b0, 0x37ab, 0x37a5, 0x379f, - 0x379a, 0x3794, 0x378e, 0x3789, 0x3783, 0x377d, 0x3778, 0x3772, - 0x376c, 0x3767, 0x3761, 0x375b, 0x3756, 0x3750, 0x374a, 0x3745, - 0x373f, 0x3739, 0x3734, 0x372e, 0x3728, 0x3723, 0x371d, 0x3717, - 0x3712, 0x370c, 0x3706, 0x3701, 0x36fb, 0x36f5, 0x36f0, 0x36ea, - 0x36e4, 0x36df, 0x36d9, 0x36d3, 0x36ce, 0x36c8, 0x36c2, 0x36bc, - 0x36b7, 0x36b1, 0x36ab, 0x36a6, 0x36a0, 0x369a, 0x3695, 0x368f, - 0x3689, 0x3684, 0x367e, 0x3678, 0x3673, 0x366d, 0x3667, 0x3662, - 0x365c, 0x3656, 0x3650, 0x364b, 0x3645, 0x363f, 0x363a, 0x3634, - 0x362e, 0x3629, 0x3623, 0x361d, 0x3618, 0x3612, 0x360c, 0x3606, - 0x3601, 0x35fb, 0x35f5, 0x35f0, 0x35ea, 0x35e4, 0x35df, 0x35d9, - 0x35d3, 0x35cd, 0x35c8, 0x35c2, 0x35bc, 0x35b7, 0x35b1, 0x35ab, - 0x35a6, 0x35a0, 0x359a, 0x3594, 0x358f, 0x3589, 0x3583, 0x357e, - 0x3578, 0x3572, 0x356c, 0x3567, 0x3561, 0x355b, 0x3556, 0x3550, - 0x354a, 0x3544, 0x353f, 0x3539, 0x3533, 0x352e, 0x3528, 0x3522, - 0x351c, 0x3517, 0x3511, 0x350b, 0x3506, 0x3500, 0x34fa, 0x34f4, - 0x34ef, 0x34e9, 0x34e3, 0x34de, 0x34d8, 0x34d2, 0x34cc, 0x34c7, - 0x34c1, 0x34bb, 0x34b6, 0x34b0, 0x34aa, 0x34a4, 0x349f, 0x3499, - 0x3493, 0x348d, 0x3488, 0x3482, 0x347c, 0x3476, 0x3471, 0x346b, - 0x3465, 0x3460, 0x345a, 0x3454, 0x344e, 0x3449, 0x3443, 0x343d, - 0x3437, 0x3432, 0x342c, 0x3426, 0x3420, 0x341b, 0x3415, 0x340f, - 0x340a, 0x3404, 0x33fe, 0x33f8, 0x33f3, 0x33ed, 0x33e7, 0x33e1, - 0x33dc, 0x33d6, 0x33d0, 0x33ca, 0x33c5, 0x33bf, 0x33b9, 0x33b3, - 0x33ae, 0x33a8, 0x33a2, 0x339c, 0x3397, 0x3391, 0x338b, 0x3385, - 0x3380, 0x337a, 0x3374, 0x336e, 0x3369, 0x3363, 0x335d, 0x3357, - 0x3352, 0x334c, 0x3346, 0x3340, 0x333b, 0x3335, 0x332f, 0x3329, - 0x3324, 0x331e, 0x3318, 0x3312, 0x330c, 0x3307, 0x3301, 0x32fb, - 0x32f5, 0x32f0, 0x32ea, 0x32e4, 0x32de, 0x32d9, 0x32d3, 0x32cd, - 0x32c7, 0x32c2, 0x32bc, 0x32b6, 0x32b0, 0x32aa, 0x32a5, 0x329f, - 0x3299, 0x3293, 0x328e, 0x3288, 0x3282, 0x327c, 0x3276, 0x3271, - 0x326b, 0x3265, 0x325f, 0x325a, 0x3254, 0x324e, 0x3248, 0x3243, - 0x323d, 0x3237, 0x3231, 0x322b, 0x3226, 0x3220, 0x321a, 0x3214, - 0x320e, 0x3209, 0x3203, 0x31fd, 0x31f7, 0x31f2, 0x31ec, 0x31e6, - 0x31e0, 0x31da, 0x31d5, 0x31cf, 0x31c9, 0x31c3, 0x31bd, 0x31b8, - 0x31b2, 0x31ac, 0x31a6, 0x31a1, 0x319b, 0x3195, 0x318f, 0x3189, - 0x3184, 0x317e, 0x3178, 0x3172, 0x316c, 0x3167, 0x3161, 0x315b, - 0x3155, 0x314f, 0x314a, 0x3144, 0x313e, 0x3138, 0x3132, 0x312d, - 0x3127, 0x3121, 0x311b, 0x3115, 0x3110, 0x310a, 0x3104, 0x30fe, - 0x30f8, 0x30f3, 0x30ed, 0x30e7, 0x30e1, 0x30db, 0x30d6, 0x30d0, - 0x30ca, 0x30c4, 0x30be, 0x30b8, 0x30b3, 0x30ad, 0x30a7, 0x30a1, - 0x309b, 0x3096, 0x3090, 0x308a, 0x3084, 0x307e, 0x3079, 0x3073, - 0x306d, 0x3067, 0x3061, 0x305b, 0x3056, 0x3050, 0x304a, 0x3044, - 0x303e, 0x3039, 0x3033, 0x302d, 0x3027, 0x3021, 0x301b, 0x3016, - 0x3010, 0x300a, 0x3004, 0x2ffe, 0x2ff8, 0x2ff3, 0x2fed, 0x2fe7, - 0x2fe1, 0x2fdb, 0x2fd6, 0x2fd0, 0x2fca, 0x2fc4, 0x2fbe, 0x2fb8, - 0x2fb3, 0x2fad, 0x2fa7, 0x2fa1, 0x2f9b, 0x2f95, 0x2f90, 0x2f8a, - 0x2f84, 0x2f7e, 0x2f78, 0x2f72, 0x2f6d, 0x2f67, 0x2f61, 0x2f5b, - 0x2f55, 0x2f4f, 0x2f4a, 0x2f44, 0x2f3e, 0x2f38, 0x2f32, 0x2f2c, - 0x2f27, 0x2f21, 0x2f1b, 0x2f15, 0x2f0f, 0x2f09, 0x2f03, 0x2efe, - 0x2ef8, 0x2ef2, 0x2eec, 0x2ee6, 0x2ee0, 0x2edb, 0x2ed5, 0x2ecf, - 0x2ec9, 0x2ec3, 0x2ebd, 0x2eb7, 0x2eb2, 0x2eac, 0x2ea6, 0x2ea0, - 0x2e9a, 0x2e94, 0x2e8e, 0x2e89, 0x2e83, 0x2e7d, 0x2e77, 0x2e71, - 0x2e6b, 0x2e65, 0x2e60, 0x2e5a, 0x2e54, 0x2e4e, 0x2e48, 0x2e42, - 0x2e3c, 0x2e37, 0x2e31, 0x2e2b, 0x2e25, 0x2e1f, 0x2e19, 0x2e13, - 0x2e0e, 0x2e08, 0x2e02, 0x2dfc, 0x2df6, 0x2df0, 0x2dea, 0x2de5, - 0x2ddf, 0x2dd9, 0x2dd3, 0x2dcd, 0x2dc7, 0x2dc1, 0x2dbb, 0x2db6, - 0x2db0, 0x2daa, 0x2da4, 0x2d9e, 0x2d98, 0x2d92, 0x2d8d, 0x2d87, - 0x2d81, 0x2d7b, 0x2d75, 0x2d6f, 0x2d69, 0x2d63, 0x2d5e, 0x2d58, - 0x2d52, 0x2d4c, 0x2d46, 0x2d40, 0x2d3a, 0x2d34, 0x2d2f, 0x2d29, - 0x2d23, 0x2d1d, 0x2d17, 0x2d11, 0x2d0b, 0x2d05, 0x2cff, 0x2cfa, - 0x2cf4, 0x2cee, 0x2ce8, 0x2ce2, 0x2cdc, 0x2cd6, 0x2cd0, 0x2ccb, - 0x2cc5, 0x2cbf, 0x2cb9, 0x2cb3, 0x2cad, 0x2ca7, 0x2ca1, 0x2c9b, - 0x2c96, 0x2c90, 0x2c8a, 0x2c84, 0x2c7e, 0x2c78, 0x2c72, 0x2c6c, - 0x2c66, 0x2c61, 0x2c5b, 0x2c55, 0x2c4f, 0x2c49, 0x2c43, 0x2c3d, - 0x2c37, 0x2c31, 0x2c2b, 0x2c26, 0x2c20, 0x2c1a, 0x2c14, 0x2c0e, - 0x2c08, 0x2c02, 0x2bfc, 0x2bf6, 0x2bf0, 0x2beb, 0x2be5, 0x2bdf, - 0x2bd9, 0x2bd3, 0x2bcd, 0x2bc7, 0x2bc1, 0x2bbb, 0x2bb5, 0x2bb0, - 0x2baa, 0x2ba4, 0x2b9e, 0x2b98, 0x2b92, 0x2b8c, 0x2b86, 0x2b80, - 0x2b7a, 0x2b74, 0x2b6f, 0x2b69, 0x2b63, 0x2b5d, 0x2b57, 0x2b51, - 0x2b4b, 0x2b45, 0x2b3f, 0x2b39, 0x2b33, 0x2b2d, 0x2b28, 0x2b22, - 0x2b1c, 0x2b16, 0x2b10, 0x2b0a, 0x2b04, 0x2afe, 0x2af8, 0x2af2, - 0x2aec, 0x2ae6, 0x2ae1, 0x2adb, 0x2ad5, 0x2acf, 0x2ac9, 0x2ac3, - 0x2abd, 0x2ab7, 0x2ab1, 0x2aab, 0x2aa5, 0x2a9f, 0x2a99, 0x2a94, - 0x2a8e, 0x2a88, 0x2a82, 0x2a7c, 0x2a76, 0x2a70, 0x2a6a, 0x2a64, - 0x2a5e, 0x2a58, 0x2a52, 0x2a4c, 0x2a47, 0x2a41, 0x2a3b, 0x2a35, - 0x2a2f, 0x2a29, 0x2a23, 0x2a1d, 0x2a17, 0x2a11, 0x2a0b, 0x2a05, - 0x29ff, 0x29f9, 0x29f3, 0x29ee, 0x29e8, 0x29e2, 0x29dc, 0x29d6, - 0x29d0, 0x29ca, 0x29c4, 0x29be, 0x29b8, 0x29b2, 0x29ac, 0x29a6, - 0x29a0, 0x299a, 0x2994, 0x298e, 0x2989, 0x2983, 0x297d, 0x2977, - 0x2971, 0x296b, 0x2965, 0x295f, 0x2959, 0x2953, 0x294d, 0x2947, - 0x2941, 0x293b, 0x2935, 0x292f, 0x2929, 0x2923, 0x291d, 0x2918, - 0x2912, 0x290c, 0x2906, 0x2900, 0x28fa, 0x28f4, 0x28ee, 0x28e8, - 0x28e2, 0x28dc, 0x28d6, 0x28d0, 0x28ca, 0x28c4, 0x28be, 0x28b8, - 0x28b2, 0x28ac, 0x28a6, 0x28a0, 0x289a, 0x2895, 0x288f, 0x2889, - 0x2883, 0x287d, 0x2877, 0x2871, 0x286b, 0x2865, 0x285f, 0x2859, - 0x2853, 0x284d, 0x2847, 0x2841, 0x283b, 0x2835, 0x282f, 0x2829, - 0x2823, 0x281d, 0x2817, 0x2811, 0x280b, 0x2805, 0x27ff, 0x27f9, - 0x27f3, 0x27ee, 0x27e8, 0x27e2, 0x27dc, 0x27d6, 0x27d0, 0x27ca, - 0x27c4, 0x27be, 0x27b8, 0x27b2, 0x27ac, 0x27a6, 0x27a0, 0x279a, - 0x2794, 0x278e, 0x2788, 0x2782, 0x277c, 0x2776, 0x2770, 0x276a, - 0x2764, 0x275e, 0x2758, 0x2752, 0x274c, 0x2746, 0x2740, 0x273a, - 0x2734, 0x272e, 0x2728, 0x2722, 0x271c, 0x2716, 0x2710, 0x270a, - 0x2704, 0x26fe, 0x26f8, 0x26f2, 0x26ec, 0x26e7, 0x26e1, 0x26db, - 0x26d5, 0x26cf, 0x26c9, 0x26c3, 0x26bd, 0x26b7, 0x26b1, 0x26ab, - 0x26a5, 0x269f, 0x2699, 0x2693, 0x268d, 0x2687, 0x2681, 0x267b, - 0x2675, 0x266f, 0x2669, 0x2663, 0x265d, 0x2657, 0x2651, 0x264b, - 0x2645, 0x263f, 0x2639, 0x2633, 0x262d, 0x2627, 0x2621, 0x261b, - 0x2615, 0x260f, 0x2609, 0x2603, 0x25fd, 0x25f7, 0x25f1, 0x25eb, - 0x25e5, 0x25df, 0x25d9, 0x25d3, 0x25cd, 0x25c7, 0x25c1, 0x25bb, - 0x25b5, 0x25af, 0x25a9, 0x25a3, 0x259d, 0x2597, 0x2591, 0x258b, - 0x2585, 0x257f, 0x2579, 0x2573, 0x256d, 0x2567, 0x2561, 0x255b, - 0x2555, 0x254f, 0x2549, 0x2543, 0x253d, 0x2537, 0x2531, 0x252b, - 0x2525, 0x251f, 0x2519, 0x2513, 0x250c, 0x2506, 0x2500, 0x24fa, - 0x24f4, 0x24ee, 0x24e8, 0x24e2, 0x24dc, 0x24d6, 0x24d0, 0x24ca, - 0x24c4, 0x24be, 0x24b8, 0x24b2, 0x24ac, 0x24a6, 0x24a0, 0x249a, - 0x2494, 0x248e, 0x2488, 0x2482, 0x247c, 0x2476, 0x2470, 0x246a, - 0x2464, 0x245e, 0x2458, 0x2452, 0x244c, 0x2446, 0x2440, 0x243a, - 0x2434, 0x242e, 0x2428, 0x2422, 0x241c, 0x2416, 0x2410, 0x240a, - 0x2404, 0x23fd, 0x23f7, 0x23f1, 0x23eb, 0x23e5, 0x23df, 0x23d9, - 0x23d3, 0x23cd, 0x23c7, 0x23c1, 0x23bb, 0x23b5, 0x23af, 0x23a9, - 0x23a3, 0x239d, 0x2397, 0x2391, 0x238b, 0x2385, 0x237f, 0x2379, - 0x2373, 0x236d, 0x2367, 0x2361, 0x235b, 0x2355, 0x234e, 0x2348, - 0x2342, 0x233c, 0x2336, 0x2330, 0x232a, 0x2324, 0x231e, 0x2318, - 0x2312, 0x230c, 0x2306, 0x2300, 0x22fa, 0x22f4, 0x22ee, 0x22e8, - 0x22e2, 0x22dc, 0x22d6, 0x22d0, 0x22ca, 0x22c4, 0x22bd, 0x22b7, - 0x22b1, 0x22ab, 0x22a5, 0x229f, 0x2299, 0x2293, 0x228d, 0x2287, - 0x2281, 0x227b, 0x2275, 0x226f, 0x2269, 0x2263, 0x225d, 0x2257, - 0x2251, 0x224a, 0x2244, 0x223e, 0x2238, 0x2232, 0x222c, 0x2226, - 0x2220, 0x221a, 0x2214, 0x220e, 0x2208, 0x2202, 0x21fc, 0x21f6, - 0x21f0, 0x21ea, 0x21e4, 0x21dd, 0x21d7, 0x21d1, 0x21cb, 0x21c5, - 0x21bf, 0x21b9, 0x21b3, 0x21ad, 0x21a7, 0x21a1, 0x219b, 0x2195, - 0x218f, 0x2189, 0x2183, 0x217c, 0x2176, 0x2170, 0x216a, 0x2164, - 0x215e, 0x2158, 0x2152, 0x214c, 0x2146, 0x2140, 0x213a, 0x2134, - 0x212e, 0x2128, 0x2121, 0x211b, 0x2115, 0x210f, 0x2109, 0x2103, - 0x20fd, 0x20f7, 0x20f1, 0x20eb, 0x20e5, 0x20df, 0x20d9, 0x20d3, - 0x20cc, 0x20c6, 0x20c0, 0x20ba, 0x20b4, 0x20ae, 0x20a8, 0x20a2, - 0x209c, 0x2096, 0x2090, 0x208a, 0x2084, 0x207e, 0x2077, 0x2071, - 0x206b, 0x2065, 0x205f, 0x2059, 0x2053, 0x204d, 0x2047, 0x2041, - 0x203b, 0x2035, 0x202e, 0x2028, 0x2022, 0x201c, 0x2016, 0x2010, - 0x200a, 0x2004, 0x1ffe, 0x1ff8, 0x1ff2, 0x1fec, 0x1fe5, 0x1fdf, - 0x1fd9, 0x1fd3, 0x1fcd, 0x1fc7, 0x1fc1, 0x1fbb, 0x1fb5, 0x1faf, - 0x1fa9, 0x1fa3, 0x1f9c, 0x1f96, 0x1f90, 0x1f8a, 0x1f84, 0x1f7e, - 0x1f78, 0x1f72, 0x1f6c, 0x1f66, 0x1f60, 0x1f59, 0x1f53, 0x1f4d, - 0x1f47, 0x1f41, 0x1f3b, 0x1f35, 0x1f2f, 0x1f29, 0x1f23, 0x1f1d, - 0x1f16, 0x1f10, 0x1f0a, 0x1f04, 0x1efe, 0x1ef8, 0x1ef2, 0x1eec, - 0x1ee6, 0x1ee0, 0x1ed9, 0x1ed3, 0x1ecd, 0x1ec7, 0x1ec1, 0x1ebb, - 0x1eb5, 0x1eaf, 0x1ea9, 0x1ea3, 0x1e9c, 0x1e96, 0x1e90, 0x1e8a, - 0x1e84, 0x1e7e, 0x1e78, 0x1e72, 0x1e6c, 0x1e66, 0x1e5f, 0x1e59, - 0x1e53, 0x1e4d, 0x1e47, 0x1e41, 0x1e3b, 0x1e35, 0x1e2f, 0x1e29, - 0x1e22, 0x1e1c, 0x1e16, 0x1e10, 0x1e0a, 0x1e04, 0x1dfe, 0x1df8, - 0x1df2, 0x1deb, 0x1de5, 0x1ddf, 0x1dd9, 0x1dd3, 0x1dcd, 0x1dc7, - 0x1dc1, 0x1dbb, 0x1db4, 0x1dae, 0x1da8, 0x1da2, 0x1d9c, 0x1d96, - 0x1d90, 0x1d8a, 0x1d84, 0x1d7d, 0x1d77, 0x1d71, 0x1d6b, 0x1d65, - 0x1d5f, 0x1d59, 0x1d53, 0x1d4c, 0x1d46, 0x1d40, 0x1d3a, 0x1d34, - 0x1d2e, 0x1d28, 0x1d22, 0x1d1c, 0x1d15, 0x1d0f, 0x1d09, 0x1d03, - 0x1cfd, 0x1cf7, 0x1cf1, 0x1ceb, 0x1ce4, 0x1cde, 0x1cd8, 0x1cd2, - 0x1ccc, 0x1cc6, 0x1cc0, 0x1cba, 0x1cb3, 0x1cad, 0x1ca7, 0x1ca1, - 0x1c9b, 0x1c95, 0x1c8f, 0x1c89, 0x1c83, 0x1c7c, 0x1c76, 0x1c70, - 0x1c6a, 0x1c64, 0x1c5e, 0x1c58, 0x1c51, 0x1c4b, 0x1c45, 0x1c3f, - 0x1c39, 0x1c33, 0x1c2d, 0x1c27, 0x1c20, 0x1c1a, 0x1c14, 0x1c0e, - 0x1c08, 0x1c02, 0x1bfc, 0x1bf6, 0x1bef, 0x1be9, 0x1be3, 0x1bdd, - 0x1bd7, 0x1bd1, 0x1bcb, 0x1bc4, 0x1bbe, 0x1bb8, 0x1bb2, 0x1bac, - 0x1ba6, 0x1ba0, 0x1b9a, 0x1b93, 0x1b8d, 0x1b87, 0x1b81, 0x1b7b, - 0x1b75, 0x1b6f, 0x1b68, 0x1b62, 0x1b5c, 0x1b56, 0x1b50, 0x1b4a, - 0x1b44, 0x1b3d, 0x1b37, 0x1b31, 0x1b2b, 0x1b25, 0x1b1f, 0x1b19, - 0x1b13, 0x1b0c, 0x1b06, 0x1b00, 0x1afa, 0x1af4, 0x1aee, 0x1ae8, - 0x1ae1, 0x1adb, 0x1ad5, 0x1acf, 0x1ac9, 0x1ac3, 0x1abd, 0x1ab6, - 0x1ab0, 0x1aaa, 0x1aa4, 0x1a9e, 0x1a98, 0x1a91, 0x1a8b, 0x1a85, - 0x1a7f, 0x1a79, 0x1a73, 0x1a6d, 0x1a66, 0x1a60, 0x1a5a, 0x1a54, - 0x1a4e, 0x1a48, 0x1a42, 0x1a3b, 0x1a35, 0x1a2f, 0x1a29, 0x1a23, - 0x1a1d, 0x1a17, 0x1a10, 0x1a0a, 0x1a04, 0x19fe, 0x19f8, 0x19f2, - 0x19eb, 0x19e5, 0x19df, 0x19d9, 0x19d3, 0x19cd, 0x19c7, 0x19c0, - 0x19ba, 0x19b4, 0x19ae, 0x19a8, 0x19a2, 0x199b, 0x1995, 0x198f, - 0x1989, 0x1983, 0x197d, 0x1977, 0x1970, 0x196a, 0x1964, 0x195e, - 0x1958, 0x1952, 0x194b, 0x1945, 0x193f, 0x1939, 0x1933, 0x192d, - 0x1926, 0x1920, 0x191a, 0x1914, 0x190e, 0x1908, 0x1901, 0x18fb, - 0x18f5, 0x18ef, 0x18e9, 0x18e3, 0x18dc, 0x18d6, 0x18d0, 0x18ca, - 0x18c4, 0x18be, 0x18b8, 0x18b1, 0x18ab, 0x18a5, 0x189f, 0x1899, - 0x1893, 0x188c, 0x1886, 0x1880, 0x187a, 0x1874, 0x186e, 0x1867, - 0x1861, 0x185b, 0x1855, 0x184f, 0x1848, 0x1842, 0x183c, 0x1836, - 0x1830, 0x182a, 0x1823, 0x181d, 0x1817, 0x1811, 0x180b, 0x1805, - 0x17fe, 0x17f8, 0x17f2, 0x17ec, 0x17e6, 0x17e0, 0x17d9, 0x17d3, - 0x17cd, 0x17c7, 0x17c1, 0x17bb, 0x17b4, 0x17ae, 0x17a8, 0x17a2, - 0x179c, 0x1795, 0x178f, 0x1789, 0x1783, 0x177d, 0x1777, 0x1770, - 0x176a, 0x1764, 0x175e, 0x1758, 0x1752, 0x174b, 0x1745, 0x173f, - 0x1739, 0x1733, 0x172c, 0x1726, 0x1720, 0x171a, 0x1714, 0x170e, - 0x1707, 0x1701, 0x16fb, 0x16f5, 0x16ef, 0x16e8, 0x16e2, 0x16dc, - 0x16d6, 0x16d0, 0x16ca, 0x16c3, 0x16bd, 0x16b7, 0x16b1, 0x16ab, - 0x16a4, 0x169e, 0x1698, 0x1692, 0x168c, 0x1686, 0x167f, 0x1679, - 0x1673, 0x166d, 0x1667, 0x1660, 0x165a, 0x1654, 0x164e, 0x1648, - 0x1642, 0x163b, 0x1635, 0x162f, 0x1629, 0x1623, 0x161c, 0x1616, - 0x1610, 0x160a, 0x1604, 0x15fd, 0x15f7, 0x15f1, 0x15eb, 0x15e5, - 0x15de, 0x15d8, 0x15d2, 0x15cc, 0x15c6, 0x15c0, 0x15b9, 0x15b3, - 0x15ad, 0x15a7, 0x15a1, 0x159a, 0x1594, 0x158e, 0x1588, 0x1582, - 0x157b, 0x1575, 0x156f, 0x1569, 0x1563, 0x155c, 0x1556, 0x1550, - 0x154a, 0x1544, 0x153d, 0x1537, 0x1531, 0x152b, 0x1525, 0x151e, - 0x1518, 0x1512, 0x150c, 0x1506, 0x14ff, 0x14f9, 0x14f3, 0x14ed, - 0x14e7, 0x14e0, 0x14da, 0x14d4, 0x14ce, 0x14c8, 0x14c1, 0x14bb, - 0x14b5, 0x14af, 0x14a9, 0x14a2, 0x149c, 0x1496, 0x1490, 0x148a, - 0x1483, 0x147d, 0x1477, 0x1471, 0x146b, 0x1464, 0x145e, 0x1458, - 0x1452, 0x144c, 0x1445, 0x143f, 0x1439, 0x1433, 0x142d, 0x1426, - 0x1420, 0x141a, 0x1414, 0x140e, 0x1407, 0x1401, 0x13fb, 0x13f5, - 0x13ef, 0x13e8, 0x13e2, 0x13dc, 0x13d6, 0x13d0, 0x13c9, 0x13c3, - 0x13bd, 0x13b7, 0x13b1, 0x13aa, 0x13a4, 0x139e, 0x1398, 0x1391, - 0x138b, 0x1385, 0x137f, 0x1379, 0x1372, 0x136c, 0x1366, 0x1360, - 0x135a, 0x1353, 0x134d, 0x1347, 0x1341, 0x133b, 0x1334, 0x132e, - 0x1328, 0x1322, 0x131b, 0x1315, 0x130f, 0x1309, 0x1303, 0x12fc, - 0x12f6, 0x12f0, 0x12ea, 0x12e4, 0x12dd, 0x12d7, 0x12d1, 0x12cb, - 0x12c4, 0x12be, 0x12b8, 0x12b2, 0x12ac, 0x12a5, 0x129f, 0x1299, - 0x1293, 0x128d, 0x1286, 0x1280, 0x127a, 0x1274, 0x126d, 0x1267, - 0x1261, 0x125b, 0x1255, 0x124e, 0x1248, 0x1242, 0x123c, 0x1235, - 0x122f, 0x1229, 0x1223, 0x121d, 0x1216, 0x1210, 0x120a, 0x1204, - 0x11fd, 0x11f7, 0x11f1, 0x11eb, 0x11e5, 0x11de, 0x11d8, 0x11d2, - 0x11cc, 0x11c5, 0x11bf, 0x11b9, 0x11b3, 0x11ad, 0x11a6, 0x11a0, - 0x119a, 0x1194, 0x118d, 0x1187, 0x1181, 0x117b, 0x1175, 0x116e, - 0x1168, 0x1162, 0x115c, 0x1155, 0x114f, 0x1149, 0x1143, 0x113d, - 0x1136, 0x1130, 0x112a, 0x1124, 0x111d, 0x1117, 0x1111, 0x110b, - 0x1105, 0x10fe, 0x10f8, 0x10f2, 0x10ec, 0x10e5, 0x10df, 0x10d9, - 0x10d3, 0x10cc, 0x10c6, 0x10c0, 0x10ba, 0x10b4, 0x10ad, 0x10a7, - 0x10a1, 0x109b, 0x1094, 0x108e, 0x1088, 0x1082, 0x107b, 0x1075, - 0x106f, 0x1069, 0x1063, 0x105c, 0x1056, 0x1050, 0x104a, 0x1043, - 0x103d, 0x1037, 0x1031, 0x102a, 0x1024, 0x101e, 0x1018, 0x1012, - 0x100b, 0x1005, 0xfff, 0xff9, 0xff2, 0xfec, 0xfe6, 0xfe0, - 0xfd9, 0xfd3, 0xfcd, 0xfc7, 0xfc0, 0xfba, 0xfb4, 0xfae, - 0xfa8, 0xfa1, 0xf9b, 0xf95, 0xf8f, 0xf88, 0xf82, 0xf7c, - 0xf76, 0xf6f, 0xf69, 0xf63, 0xf5d, 0xf56, 0xf50, 0xf4a, - 0xf44, 0xf3e, 0xf37, 0xf31, 0xf2b, 0xf25, 0xf1e, 0xf18, - 0xf12, 0xf0c, 0xf05, 0xeff, 0xef9, 0xef3, 0xeec, 0xee6, - 0xee0, 0xeda, 0xed3, 0xecd, 0xec7, 0xec1, 0xeba, 0xeb4, - 0xeae, 0xea8, 0xea1, 0xe9b, 0xe95, 0xe8f, 0xe89, 0xe82, - 0xe7c, 0xe76, 0xe70, 0xe69, 0xe63, 0xe5d, 0xe57, 0xe50, - 0xe4a, 0xe44, 0xe3e, 0xe37, 0xe31, 0xe2b, 0xe25, 0xe1e, - 0xe18, 0xe12, 0xe0c, 0xe05, 0xdff, 0xdf9, 0xdf3, 0xdec, - 0xde6, 0xde0, 0xdda, 0xdd3, 0xdcd, 0xdc7, 0xdc1, 0xdba, - 0xdb4, 0xdae, 0xda8, 0xda1, 0xd9b, 0xd95, 0xd8f, 0xd88, - 0xd82, 0xd7c, 0xd76, 0xd6f, 0xd69, 0xd63, 0xd5d, 0xd56, - 0xd50, 0xd4a, 0xd44, 0xd3d, 0xd37, 0xd31, 0xd2b, 0xd24, - 0xd1e, 0xd18, 0xd12, 0xd0b, 0xd05, 0xcff, 0xcf9, 0xcf2, - 0xcec, 0xce6, 0xce0, 0xcd9, 0xcd3, 0xccd, 0xcc7, 0xcc0, - 0xcba, 0xcb4, 0xcae, 0xca7, 0xca1, 0xc9b, 0xc95, 0xc8e, - 0xc88, 0xc82, 0xc7c, 0xc75, 0xc6f, 0xc69, 0xc63, 0xc5c, - 0xc56, 0xc50, 0xc4a, 0xc43, 0xc3d, 0xc37, 0xc31, 0xc2a, - 0xc24, 0xc1e, 0xc18, 0xc11, 0xc0b, 0xc05, 0xbff, 0xbf8, - 0xbf2, 0xbec, 0xbe6, 0xbdf, 0xbd9, 0xbd3, 0xbcd, 0xbc6, - 0xbc0, 0xbba, 0xbb4, 0xbad, 0xba7, 0xba1, 0xb9b, 0xb94, - 0xb8e, 0xb88, 0xb81, 0xb7b, 0xb75, 0xb6f, 0xb68, 0xb62, - 0xb5c, 0xb56, 0xb4f, 0xb49, 0xb43, 0xb3d, 0xb36, 0xb30, - 0xb2a, 0xb24, 0xb1d, 0xb17, 0xb11, 0xb0b, 0xb04, 0xafe, - 0xaf8, 0xaf2, 0xaeb, 0xae5, 0xadf, 0xad8, 0xad2, 0xacc, - 0xac6, 0xabf, 0xab9, 0xab3, 0xaad, 0xaa6, 0xaa0, 0xa9a, - 0xa94, 0xa8d, 0xa87, 0xa81, 0xa7b, 0xa74, 0xa6e, 0xa68, - 0xa62, 0xa5b, 0xa55, 0xa4f, 0xa48, 0xa42, 0xa3c, 0xa36, - 0xa2f, 0xa29, 0xa23, 0xa1d, 0xa16, 0xa10, 0xa0a, 0xa04, - 0x9fd, 0x9f7, 0x9f1, 0x9eb, 0x9e4, 0x9de, 0x9d8, 0x9d1, - 0x9cb, 0x9c5, 0x9bf, 0x9b8, 0x9b2, 0x9ac, 0x9a6, 0x99f, - 0x999, 0x993, 0x98d, 0x986, 0x980, 0x97a, 0x973, 0x96d, - 0x967, 0x961, 0x95a, 0x954, 0x94e, 0x948, 0x941, 0x93b, - 0x935, 0x92f, 0x928, 0x922, 0x91c, 0x915, 0x90f, 0x909, - 0x903, 0x8fc, 0x8f6, 0x8f0, 0x8ea, 0x8e3, 0x8dd, 0x8d7, - 0x8d1, 0x8ca, 0x8c4, 0x8be, 0x8b7, 0x8b1, 0x8ab, 0x8a5, - 0x89e, 0x898, 0x892, 0x88c, 0x885, 0x87f, 0x879, 0x872, - 0x86c, 0x866, 0x860, 0x859, 0x853, 0x84d, 0x847, 0x840, - 0x83a, 0x834, 0x82e, 0x827, 0x821, 0x81b, 0x814, 0x80e, - 0x808, 0x802, 0x7fb, 0x7f5, 0x7ef, 0x7e9, 0x7e2, 0x7dc, - 0x7d6, 0x7cf, 0x7c9, 0x7c3, 0x7bd, 0x7b6, 0x7b0, 0x7aa, - 0x7a4, 0x79d, 0x797, 0x791, 0x78a, 0x784, 0x77e, 0x778, - 0x771, 0x76b, 0x765, 0x75f, 0x758, 0x752, 0x74c, 0x745, - 0x73f, 0x739, 0x733, 0x72c, 0x726, 0x720, 0x71a, 0x713, - 0x70d, 0x707, 0x700, 0x6fa, 0x6f4, 0x6ee, 0x6e7, 0x6e1, - 0x6db, 0x6d5, 0x6ce, 0x6c8, 0x6c2, 0x6bb, 0x6b5, 0x6af, - 0x6a9, 0x6a2, 0x69c, 0x696, 0x690, 0x689, 0x683, 0x67d, - 0x676, 0x670, 0x66a, 0x664, 0x65d, 0x657, 0x651, 0x64a, - 0x644, 0x63e, 0x638, 0x631, 0x62b, 0x625, 0x61f, 0x618, - 0x612, 0x60c, 0x605, 0x5ff, 0x5f9, 0x5f3, 0x5ec, 0x5e6, - 0x5e0, 0x5da, 0x5d3, 0x5cd, 0x5c7, 0x5c0, 0x5ba, 0x5b4, - 0x5ae, 0x5a7, 0x5a1, 0x59b, 0x594, 0x58e, 0x588, 0x582, - 0x57b, 0x575, 0x56f, 0x569, 0x562, 0x55c, 0x556, 0x54f, - 0x549, 0x543, 0x53d, 0x536, 0x530, 0x52a, 0x523, 0x51d, - 0x517, 0x511, 0x50a, 0x504, 0x4fe, 0x4f8, 0x4f1, 0x4eb, - 0x4e5, 0x4de, 0x4d8, 0x4d2, 0x4cc, 0x4c5, 0x4bf, 0x4b9, - 0x4b2, 0x4ac, 0x4a6, 0x4a0, 0x499, 0x493, 0x48d, 0x487, - 0x480, 0x47a, 0x474, 0x46d, 0x467, 0x461, 0x45b, 0x454, - 0x44e, 0x448, 0x441, 0x43b, 0x435, 0x42f, 0x428, 0x422, - 0x41c, 0x415, 0x40f, 0x409, 0x403, 0x3fc, 0x3f6, 0x3f0, - 0x3ea, 0x3e3, 0x3dd, 0x3d7, 0x3d0, 0x3ca, 0x3c4, 0x3be, - 0x3b7, 0x3b1, 0x3ab, 0x3a4, 0x39e, 0x398, 0x392, 0x38b, - 0x385, 0x37f, 0x378, 0x372, 0x36c, 0x366, 0x35f, 0x359, - 0x353, 0x34c, 0x346, 0x340, 0x33a, 0x333, 0x32d, 0x327, - 0x321, 0x31a, 0x314, 0x30e, 0x307, 0x301, 0x2fb, 0x2f5, - 0x2ee, 0x2e8, 0x2e2, 0x2db, 0x2d5, 0x2cf, 0x2c9, 0x2c2, - 0x2bc, 0x2b6, 0x2af, 0x2a9, 0x2a3, 0x29d, 0x296, 0x290, - 0x28a, 0x283, 0x27d, 0x277, 0x271, 0x26a, 0x264, 0x25e, - 0x258, 0x251, 0x24b, 0x245, 0x23e, 0x238, 0x232, 0x22c, - 0x225, 0x21f, 0x219, 0x212, 0x20c, 0x206, 0x200, 0x1f9, - 0x1f3, 0x1ed, 0x1e6, 0x1e0, 0x1da, 0x1d4, 0x1cd, 0x1c7, - 0x1c1, 0x1ba, 0x1b4, 0x1ae, 0x1a8, 0x1a1, 0x19b, 0x195, - 0x18e, 0x188, 0x182, 0x17c, 0x175, 0x16f, 0x169, 0x162, - 0x15c, 0x156, 0x150, 0x149, 0x143, 0x13d, 0x137, 0x130, - 0x12a, 0x124, 0x11d, 0x117, 0x111, 0x10b, 0x104, 0xfe, - 0xf8, 0xf1, 0xeb, 0xe5, 0xdf, 0xd8, 0xd2, 0xcc, - 0xc5, 0xbf, 0xb9, 0xb3, 0xac, 0xa6, 0xa0, 0x99, - 0x93, 0x8d, 0x87, 0x80, 0x7a, 0x74, 0x6d, 0x67, - 0x61, 0x5b, 0x54, 0x4e, 0x48, 0x41, 0x3b, 0x35, - 0x2f, 0x28, 0x22, 0x1c, 0x15, 0xf, 0x9, 0x3, -}; - -/** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - * \par Normalizing factor: - * The normalizing factor is sqrt(2/N), which depends on the size of transform N. - * Normalizing factors in 1.15 format are mentioned in the table below for different DCT sizes: - * \image html dct4NormalizingQ15Table.gif - */ - -arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initializing the pointer array with the weight table base addresses of different lengths */ - q15_t *twiddlePtr[4] = { (q15_t *) WeightsQ15_128, (q15_t *) WeightsQ15_512, - (q15_t *) WeightsQ15_2048, (q15_t *) WeightsQ15_8192 - }; - - /* Initializing the pointer array with the cos factor table base addresses of different lengths */ - q15_t *pCosFactor[4] = - { (q15_t *) cos_factorsQ15_128, (q15_t *) cos_factorsQ15_512, - (q15_t *) cos_factorsQ15_2048, (q15_t *) cos_factorsQ15_8192 - }; - - /* Initialize the DCT4 length */ - S->N = N; - - /* Initialize the half of DCT4 length */ - S->Nby2 = Nby2; - - /* Initialize the DCT4 Normalizing factor */ - S->normalize = normalize; - - /* Initialize Real FFT Instance */ - S->pRfft = S_RFFT; - - /* Initialize Complex FFT Instance */ - S->pCfft = S_CFFT; - - switch (N) - { - /* Initialize the table modifier values */ - case 8192u: - S->pTwiddle = twiddlePtr[3]; - S->pCosFactor = pCosFactor[3]; - break; - case 2048u: - S->pTwiddle = twiddlePtr[2]; - S->pCosFactor = pCosFactor[2]; - break; - case 512u: - S->pTwiddle = twiddlePtr[1]; - S->pCosFactor = pCosFactor[1]; - break; - case 128u: - S->pTwiddle = twiddlePtr[0]; - S->pCosFactor = pCosFactor[0]; - break; - default: - status = ARM_MATH_ARGUMENT_ERROR; - } - - /* Initialize the RFFT/RIFFT */ - arm_rfft_init_q15(S->pRfft, S->N, 0u, 1u); - - /* return the status of DCT4 Init function */ - return (status); -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c deleted file mode 100644 index 075c537..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c +++ /dev/null @@ -1,8364 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_init_q31.c -* -* Description: Initialization function of DCT-4 & IDCT4 Q31 -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/* -* @brief Weights Table -*/ - -/** -* \par -* Weights tables are generated using the formula :
weights[n] = e^(-j*n*pi/(2*N))
-* \par -* C command to generate the table -*
    
-* for(i = 0; i< N; i++)    
-* {    
-*   weights[2*i]= cos(i*c);    
-*   weights[(2*i)+1]= -sin(i * c);    
-* } 
-* \par -* where N is the Number of weights to be calculated and c is pi/(2*N) -* \par -* Convert the output to q31 format by multiplying with 2^31 and saturated if required. -* \par -* In the tables below the real and imaginary values are placed alternatively, hence the -* array length is 2*N. -*/ - -static const q31_t WeightsQ31_128[256] = { - 0x7fffffff, 0x0, 0x7ffd885a, 0xfe6de2e0, 0x7ff62182, 0xfcdbd541, 0x7fe9cbc0, - 0xfb49e6a3, - 0x7fd8878e, 0xf9b82684, 0x7fc25596, 0xf826a462, 0x7fa736b4, 0xf6956fb7, - 0x7f872bf3, 0xf50497fb, - 0x7f62368f, 0xf3742ca2, 0x7f3857f6, 0xf1e43d1c, 0x7f0991c4, 0xf054d8d5, - 0x7ed5e5c6, 0xeec60f31, - 0x7e9d55fc, 0xed37ef91, 0x7e5fe493, 0xebaa894f, 0x7e1d93ea, 0xea1debbb, - 0x7dd6668f, 0xe8922622, - 0x7d8a5f40, 0xe70747c4, 0x7d3980ec, 0xe57d5fda, 0x7ce3ceb2, 0xe3f47d96, - 0x7c894bde, 0xe26cb01b, - 0x7c29fbee, 0xe0e60685, 0x7bc5e290, 0xdf608fe4, 0x7b5d039e, 0xdddc5b3b, - 0x7aef6323, 0xdc597781, - 0x7a7d055b, 0xdad7f3a2, 0x7a05eead, 0xd957de7a, 0x798a23b1, 0xd7d946d8, - 0x7909a92d, 0xd65c3b7b, - 0x78848414, 0xd4e0cb15, 0x77fab989, 0xd3670446, 0x776c4edb, 0xd1eef59e, - 0x76d94989, 0xd078ad9e, - 0x7641af3d, 0xcf043ab3, 0x75a585cf, 0xcd91ab39, 0x7504d345, 0xcc210d79, - 0x745f9dd1, 0xcab26fa9, - 0x73b5ebd1, 0xc945dfec, 0x7307c3d0, 0xc7db6c50, 0x72552c85, 0xc67322ce, - 0x719e2cd2, 0xc50d1149, - 0x70e2cbc6, 0xc3a94590, 0x7023109a, 0xc247cd5a, 0x6f5f02b2, 0xc0e8b648, - 0x6e96a99d, 0xbf8c0de3, - 0x6dca0d14, 0xbe31e19b, 0x6cf934fc, 0xbcda3ecb, 0x6c242960, 0xbb8532b0, - 0x6b4af279, 0xba32ca71, - 0x6a6d98a4, 0xb8e31319, 0x698c246c, 0xb796199b, 0x68a69e81, 0xb64beacd, - 0x67bd0fbd, 0xb5049368, - 0x66cf8120, 0xb3c0200c, 0x65ddfbd3, 0xb27e9d3c, 0x64e88926, 0xb140175b, - 0x63ef3290, 0xb0049ab3, - 0x62f201ac, 0xaecc336c, 0x61f1003f, 0xad96ed92, 0x60ec3830, 0xac64d510, - 0x5fe3b38d, 0xab35f5b5, - 0x5ed77c8a, 0xaa0a5b2e, 0x5dc79d7c, 0xa8e21106, 0x5cb420e0, 0xa7bd22ac, - 0x5b9d1154, 0xa69b9b68, - 0x5a82799a, 0xa57d8666, 0x59646498, 0xa462eeac, 0x5842dd54, 0xa34bdf20, - 0x571deefa, 0xa2386284, - 0x55f5a4d2, 0xa1288376, 0x54ca0a4b, 0xa01c4c73, 0x539b2af0, 0x9f13c7d0, - 0x5269126e, 0x9e0effc1, - 0x5133cc94, 0x9d0dfe54, 0x4ffb654d, 0x9c10cd70, 0x4ebfe8a5, 0x9b1776da, - 0x4d8162c4, 0x9a22042d, - 0x4c3fdff4, 0x99307ee0, 0x4afb6c98, 0x9842f043, 0x49b41533, 0x9759617f, - 0x4869e665, 0x9673db94, - 0x471cece7, 0x9592675c, 0x45cd358f, 0x94b50d87, 0x447acd50, 0x93dbd6a0, - 0x4325c135, 0x9306cb04, - 0x41ce1e65, 0x9235f2ec, 0x4073f21d, 0x91695663, 0x3f1749b8, 0x90a0fd4e, - 0x3db832a6, 0x8fdcef66, - 0x3c56ba70, 0x8f1d343a, 0x3af2eeb7, 0x8e61d32e, 0x398cdd32, 0x8daad37b, - 0x382493b0, 0x8cf83c30, - 0x36ba2014, 0x8c4a142f, 0x354d9057, 0x8ba0622f, 0x33def287, 0x8afb2cbb, - 0x326e54c7, 0x8a5a7a31, - 0x30fbc54d, 0x89be50c3, 0x2f875262, 0x8926b677, 0x2e110a62, 0x8893b125, - 0x2c98fbba, 0x88054677, - 0x2b1f34eb, 0x877b7bec, 0x29a3c485, 0x86f656d3, 0x2826b928, 0x8675dc4f, - 0x26a82186, 0x85fa1153, - 0x25280c5e, 0x8582faa5, 0x23a6887f, 0x85109cdd, 0x2223a4c5, 0x84a2fc62, - 0x209f701c, 0x843a1d70, - 0x1f19f97b, 0x83d60412, 0x1d934fe5, 0x8376b422, 0x1c0b826a, 0x831c314e, - 0x1a82a026, 0x82c67f14, - 0x18f8b83c, 0x8275a0c0, 0x176dd9de, 0x82299971, 0x15e21445, 0x81e26c16, - 0x145576b1, 0x81a01b6d, - 0x12c8106f, 0x8162aa04, 0x1139f0cf, 0x812a1a3a, 0xfab272b, 0x80f66e3c, - 0xe1bc2e4, 0x80c7a80a, - 0xc8bd35e, 0x809dc971, 0xafb6805, 0x8078d40d, 0x96a9049, 0x8058c94c, - 0x7d95b9e, 0x803daa6a, - 0x647d97c, 0x80277872, 0x4b6195d, 0x80163440, 0x3242abf, 0x8009de7e, - 0x1921d20, 0x800277a6, -}; - -static const q31_t WeightsQ31_512[1024] = { - 0x7fffffff, 0x0, 0x7fffd886, 0xff9b781d, 0x7fff6216, 0xff36f078, 0x7ffe9cb2, - 0xfed2694f, - 0x7ffd885a, 0xfe6de2e0, 0x7ffc250f, 0xfe095d69, 0x7ffa72d1, 0xfda4d929, - 0x7ff871a2, 0xfd40565c, - 0x7ff62182, 0xfcdbd541, 0x7ff38274, 0xfc775616, 0x7ff09478, 0xfc12d91a, - 0x7fed5791, 0xfbae5e89, - 0x7fe9cbc0, 0xfb49e6a3, 0x7fe5f108, 0xfae571a4, 0x7fe1c76b, 0xfa80ffcb, - 0x7fdd4eec, 0xfa1c9157, - 0x7fd8878e, 0xf9b82684, 0x7fd37153, 0xf953bf91, 0x7fce0c3e, 0xf8ef5cbb, - 0x7fc85854, 0xf88afe42, - 0x7fc25596, 0xf826a462, 0x7fbc040a, 0xf7c24f59, 0x7fb563b3, 0xf75dff66, - 0x7fae7495, 0xf6f9b4c6, - 0x7fa736b4, 0xf6956fb7, 0x7f9faa15, 0xf6313077, 0x7f97cebd, 0xf5ccf743, - 0x7f8fa4b0, 0xf568c45b, - 0x7f872bf3, 0xf50497fb, 0x7f7e648c, 0xf4a07261, 0x7f754e80, 0xf43c53cb, - 0x7f6be9d4, 0xf3d83c77, - 0x7f62368f, 0xf3742ca2, 0x7f5834b7, 0xf310248a, 0x7f4de451, 0xf2ac246e, - 0x7f434563, 0xf2482c8a, - 0x7f3857f6, 0xf1e43d1c, 0x7f2d1c0e, 0xf1805662, 0x7f2191b4, 0xf11c789a, - 0x7f15b8ee, 0xf0b8a401, - 0x7f0991c4, 0xf054d8d5, 0x7efd1c3c, 0xeff11753, 0x7ef05860, 0xef8d5fb8, - 0x7ee34636, 0xef29b243, - 0x7ed5e5c6, 0xeec60f31, 0x7ec8371a, 0xee6276bf, 0x7eba3a39, 0xedfee92b, - 0x7eabef2c, 0xed9b66b2, - 0x7e9d55fc, 0xed37ef91, 0x7e8e6eb2, 0xecd48407, 0x7e7f3957, 0xec71244f, - 0x7e6fb5f4, 0xec0dd0a8, - 0x7e5fe493, 0xebaa894f, 0x7e4fc53e, 0xeb474e81, 0x7e3f57ff, 0xeae4207a, - 0x7e2e9cdf, 0xea80ff7a, - 0x7e1d93ea, 0xea1debbb, 0x7e0c3d29, 0xe9bae57d, 0x7dfa98a8, 0xe957ecfb, - 0x7de8a670, 0xe8f50273, - 0x7dd6668f, 0xe8922622, 0x7dc3d90d, 0xe82f5844, 0x7db0fdf8, 0xe7cc9917, - 0x7d9dd55a, 0xe769e8d8, - 0x7d8a5f40, 0xe70747c4, 0x7d769bb5, 0xe6a4b616, 0x7d628ac6, 0xe642340d, - 0x7d4e2c7f, 0xe5dfc1e5, - 0x7d3980ec, 0xe57d5fda, 0x7d24881b, 0xe51b0e2a, 0x7d0f4218, 0xe4b8cd11, - 0x7cf9aef0, 0xe4569ccb, - 0x7ce3ceb2, 0xe3f47d96, 0x7ccda169, 0xe3926fad, 0x7cb72724, 0xe330734d, - 0x7ca05ff1, 0xe2ce88b3, - 0x7c894bde, 0xe26cb01b, 0x7c71eaf9, 0xe20ae9c1, 0x7c5a3d50, 0xe1a935e2, - 0x7c4242f2, 0xe14794ba, - 0x7c29fbee, 0xe0e60685, 0x7c116853, 0xe0848b7f, 0x7bf88830, 0xe02323e5, - 0x7bdf5b94, 0xdfc1cff3, - 0x7bc5e290, 0xdf608fe4, 0x7bac1d31, 0xdeff63f4, 0x7b920b89, 0xde9e4c60, - 0x7b77ada8, 0xde3d4964, - 0x7b5d039e, 0xdddc5b3b, 0x7b420d7a, 0xdd7b8220, 0x7b26cb4f, 0xdd1abe51, - 0x7b0b3d2c, 0xdcba1008, - 0x7aef6323, 0xdc597781, 0x7ad33d45, 0xdbf8f4f8, 0x7ab6cba4, 0xdb9888a8, - 0x7a9a0e50, 0xdb3832cd, - 0x7a7d055b, 0xdad7f3a2, 0x7a5fb0d8, 0xda77cb63, 0x7a4210d8, 0xda17ba4a, - 0x7a24256f, 0xd9b7c094, - 0x7a05eead, 0xd957de7a, 0x79e76ca7, 0xd8f81439, 0x79c89f6e, 0xd898620c, - 0x79a98715, 0xd838c82d, - 0x798a23b1, 0xd7d946d8, 0x796a7554, 0xd779de47, 0x794a7c12, 0xd71a8eb5, - 0x792a37fe, 0xd6bb585e, - 0x7909a92d, 0xd65c3b7b, 0x78e8cfb2, 0xd5fd3848, 0x78c7aba2, 0xd59e4eff, - 0x78a63d11, 0xd53f7fda, - 0x78848414, 0xd4e0cb15, 0x786280bf, 0xd48230e9, 0x78403329, 0xd423b191, - 0x781d9b65, 0xd3c54d47, - 0x77fab989, 0xd3670446, 0x77d78daa, 0xd308d6c7, 0x77b417df, 0xd2aac504, - 0x7790583e, 0xd24ccf39, - 0x776c4edb, 0xd1eef59e, 0x7747fbce, 0xd191386e, 0x77235f2d, 0xd13397e2, - 0x76fe790e, 0xd0d61434, - 0x76d94989, 0xd078ad9e, 0x76b3d0b4, 0xd01b6459, 0x768e0ea6, 0xcfbe389f, - 0x76680376, 0xcf612aaa, - 0x7641af3d, 0xcf043ab3, 0x761b1211, 0xcea768f2, 0x75f42c0b, 0xce4ab5a2, - 0x75ccfd42, 0xcdee20fc, - 0x75a585cf, 0xcd91ab39, 0x757dc5ca, 0xcd355491, 0x7555bd4c, 0xccd91d3d, - 0x752d6c6c, 0xcc7d0578, - 0x7504d345, 0xcc210d79, 0x74dbf1ef, 0xcbc53579, 0x74b2c884, 0xcb697db0, - 0x7489571c, 0xcb0de658, - 0x745f9dd1, 0xcab26fa9, 0x74359cbd, 0xca5719db, 0x740b53fb, 0xc9fbe527, - 0x73e0c3a3, 0xc9a0d1c5, - 0x73b5ebd1, 0xc945dfec, 0x738acc9e, 0xc8eb0fd6, 0x735f6626, 0xc89061ba, - 0x7333b883, 0xc835d5d0, - 0x7307c3d0, 0xc7db6c50, 0x72db8828, 0xc7812572, 0x72af05a7, 0xc727016d, - 0x72823c67, 0xc6cd0079, - 0x72552c85, 0xc67322ce, 0x7227d61c, 0xc61968a2, 0x71fa3949, 0xc5bfd22e, - 0x71cc5626, 0xc5665fa9, - 0x719e2cd2, 0xc50d1149, 0x716fbd68, 0xc4b3e746, 0x71410805, 0xc45ae1d7, - 0x71120cc5, 0xc4020133, - 0x70e2cbc6, 0xc3a94590, 0x70b34525, 0xc350af26, 0x708378ff, 0xc2f83e2a, - 0x70536771, 0xc29ff2d4, - 0x7023109a, 0xc247cd5a, 0x6ff27497, 0xc1efcdf3, 0x6fc19385, 0xc197f4d4, - 0x6f906d84, 0xc1404233, - 0x6f5f02b2, 0xc0e8b648, 0x6f2d532c, 0xc0915148, 0x6efb5f12, 0xc03a1368, - 0x6ec92683, 0xbfe2fcdf, - 0x6e96a99d, 0xbf8c0de3, 0x6e63e87f, 0xbf3546a8, 0x6e30e34a, 0xbedea765, - 0x6dfd9a1c, 0xbe88304f, - 0x6dca0d14, 0xbe31e19b, 0x6d963c54, 0xbddbbb7f, 0x6d6227fa, 0xbd85be30, - 0x6d2dd027, 0xbd2fe9e2, - 0x6cf934fc, 0xbcda3ecb, 0x6cc45698, 0xbc84bd1f, 0x6c8f351c, 0xbc2f6513, - 0x6c59d0a9, 0xbbda36dd, - 0x6c242960, 0xbb8532b0, 0x6bee3f62, 0xbb3058c0, 0x6bb812d1, 0xbadba943, - 0x6b81a3cd, 0xba87246d, - 0x6b4af279, 0xba32ca71, 0x6b13fef5, 0xb9de9b83, 0x6adcc964, 0xb98a97d8, - 0x6aa551e9, 0xb936bfa4, - 0x6a6d98a4, 0xb8e31319, 0x6a359db9, 0xb88f926d, 0x69fd614a, 0xb83c3dd1, - 0x69c4e37a, 0xb7e9157a, - 0x698c246c, 0xb796199b, 0x69532442, 0xb7434a67, 0x6919e320, 0xb6f0a812, - 0x68e06129, 0xb69e32cd, - 0x68a69e81, 0xb64beacd, 0x686c9b4b, 0xb5f9d043, 0x683257ab, 0xb5a7e362, - 0x67f7d3c5, 0xb556245e, - 0x67bd0fbd, 0xb5049368, 0x67820bb7, 0xb4b330b3, 0x6746c7d8, 0xb461fc70, - 0x670b4444, 0xb410f6d3, - 0x66cf8120, 0xb3c0200c, 0x66937e91, 0xb36f784f, 0x66573cbb, 0xb31effcc, - 0x661abbc5, 0xb2ceb6b5, - 0x65ddfbd3, 0xb27e9d3c, 0x65a0fd0b, 0xb22eb392, 0x6563bf92, 0xb1def9e9, - 0x6526438f, 0xb18f7071, - 0x64e88926, 0xb140175b, 0x64aa907f, 0xb0f0eeda, 0x646c59bf, 0xb0a1f71d, - 0x642de50d, 0xb0533055, - 0x63ef3290, 0xb0049ab3, 0x63b0426d, 0xafb63667, 0x637114cc, 0xaf6803a2, - 0x6331a9d4, 0xaf1a0293, - 0x62f201ac, 0xaecc336c, 0x62b21c7b, 0xae7e965b, 0x6271fa69, 0xae312b92, - 0x62319b9d, 0xade3f33e, - 0x61f1003f, 0xad96ed92, 0x61b02876, 0xad4a1aba, 0x616f146c, 0xacfd7ae8, - 0x612dc447, 0xacb10e4b, - 0x60ec3830, 0xac64d510, 0x60aa7050, 0xac18cf69, 0x60686ccf, 0xabccfd83, - 0x60262dd6, 0xab815f8d, - 0x5fe3b38d, 0xab35f5b5, 0x5fa0fe1f, 0xaaeac02c, 0x5f5e0db3, 0xaa9fbf1e, - 0x5f1ae274, 0xaa54f2ba, - 0x5ed77c8a, 0xaa0a5b2e, 0x5e93dc1f, 0xa9bff8a8, 0x5e50015d, 0xa975cb57, - 0x5e0bec6e, 0xa92bd367, - 0x5dc79d7c, 0xa8e21106, 0x5d8314b1, 0xa8988463, 0x5d3e5237, 0xa84f2daa, - 0x5cf95638, 0xa8060d08, - 0x5cb420e0, 0xa7bd22ac, 0x5c6eb258, 0xa7746ec0, 0x5c290acc, 0xa72bf174, - 0x5be32a67, 0xa6e3aaf2, - 0x5b9d1154, 0xa69b9b68, 0x5b56bfbd, 0xa653c303, 0x5b1035cf, 0xa60c21ee, - 0x5ac973b5, 0xa5c4b855, - 0x5a82799a, 0xa57d8666, 0x5a3b47ab, 0xa5368c4b, 0x59f3de12, 0xa4efca31, - 0x59ac3cfd, 0xa4a94043, - 0x59646498, 0xa462eeac, 0x591c550e, 0xa41cd599, 0x58d40e8c, 0xa3d6f534, - 0x588b9140, 0xa3914da8, - 0x5842dd54, 0xa34bdf20, 0x57f9f2f8, 0xa306a9c8, 0x57b0d256, 0xa2c1adc9, - 0x57677b9d, 0xa27ceb4f, - 0x571deefa, 0xa2386284, 0x56d42c99, 0xa1f41392, 0x568a34a9, 0xa1affea3, - 0x56400758, 0xa16c23e1, - 0x55f5a4d2, 0xa1288376, 0x55ab0d46, 0xa0e51d8c, 0x556040e2, 0xa0a1f24d, - 0x55153fd4, 0xa05f01e1, - 0x54ca0a4b, 0xa01c4c73, 0x547ea073, 0x9fd9d22a, 0x5433027d, 0x9f979331, - 0x53e73097, 0x9f558fb0, - 0x539b2af0, 0x9f13c7d0, 0x534ef1b5, 0x9ed23bb9, 0x53028518, 0x9e90eb94, - 0x52b5e546, 0x9e4fd78a, - 0x5269126e, 0x9e0effc1, 0x521c0cc2, 0x9dce6463, 0x51ced46e, 0x9d8e0597, - 0x518169a5, 0x9d4de385, - 0x5133cc94, 0x9d0dfe54, 0x50e5fd6d, 0x9cce562c, 0x5097fc5e, 0x9c8eeb34, - 0x5049c999, 0x9c4fbd93, - 0x4ffb654d, 0x9c10cd70, 0x4faccfab, 0x9bd21af3, 0x4f5e08e3, 0x9b93a641, - 0x4f0f1126, 0x9b556f81, - 0x4ebfe8a5, 0x9b1776da, 0x4e708f8f, 0x9ad9bc71, 0x4e210617, 0x9a9c406e, - 0x4dd14c6e, 0x9a5f02f5, - 0x4d8162c4, 0x9a22042d, 0x4d31494b, 0x99e5443b, 0x4ce10034, 0x99a8c345, - 0x4c9087b1, 0x996c816f, - 0x4c3fdff4, 0x99307ee0, 0x4bef092d, 0x98f4bbbc, 0x4b9e0390, 0x98b93828, - 0x4b4ccf4d, 0x987df449, - 0x4afb6c98, 0x9842f043, 0x4aa9dba2, 0x98082c3b, 0x4a581c9e, 0x97cda855, - 0x4a062fbd, 0x979364b5, - 0x49b41533, 0x9759617f, 0x4961cd33, 0x971f9ed7, 0x490f57ee, 0x96e61ce0, - 0x48bcb599, 0x96acdbbe, - 0x4869e665, 0x9673db94, 0x4816ea86, 0x963b1c86, 0x47c3c22f, 0x96029eb6, - 0x47706d93, 0x95ca6247, - 0x471cece7, 0x9592675c, 0x46c9405c, 0x955aae17, 0x46756828, 0x9523369c, - 0x4621647d, 0x94ec010b, - 0x45cd358f, 0x94b50d87, 0x4578db93, 0x947e5c33, 0x452456bd, 0x9447ed2f, - 0x44cfa740, 0x9411c09e, - 0x447acd50, 0x93dbd6a0, 0x4425c923, 0x93a62f57, 0x43d09aed, 0x9370cae4, - 0x437b42e1, 0x933ba968, - 0x4325c135, 0x9306cb04, 0x42d0161e, 0x92d22fd9, 0x427a41d0, 0x929dd806, - 0x42244481, 0x9269c3ac, - 0x41ce1e65, 0x9235f2ec, 0x4177cfb1, 0x920265e4, 0x4121589b, 0x91cf1cb6, - 0x40cab958, 0x919c1781, - 0x4073f21d, 0x91695663, 0x401d0321, 0x9136d97d, 0x3fc5ec98, 0x9104a0ee, - 0x3f6eaeb8, 0x90d2acd4, - 0x3f1749b8, 0x90a0fd4e, 0x3ebfbdcd, 0x906f927c, 0x3e680b2c, 0x903e6c7b, - 0x3e10320d, 0x900d8b69, - 0x3db832a6, 0x8fdcef66, 0x3d600d2c, 0x8fac988f, 0x3d07c1d6, 0x8f7c8701, - 0x3caf50da, 0x8f4cbadb, - 0x3c56ba70, 0x8f1d343a, 0x3bfdfecd, 0x8eedf33b, 0x3ba51e29, 0x8ebef7fb, - 0x3b4c18ba, 0x8e904298, - 0x3af2eeb7, 0x8e61d32e, 0x3a99a057, 0x8e33a9da, 0x3a402dd2, 0x8e05c6b7, - 0x39e6975e, 0x8dd829e4, - 0x398cdd32, 0x8daad37b, 0x3932ff87, 0x8d7dc399, 0x38d8fe93, 0x8d50fa59, - 0x387eda8e, 0x8d2477d8, - 0x382493b0, 0x8cf83c30, 0x37ca2a30, 0x8ccc477d, 0x376f9e46, 0x8ca099da, - 0x3714f02a, 0x8c753362, - 0x36ba2014, 0x8c4a142f, 0x365f2e3b, 0x8c1f3c5d, 0x36041ad9, 0x8bf4ac05, - 0x35a8e625, 0x8bca6343, - 0x354d9057, 0x8ba0622f, 0x34f219a8, 0x8b76a8e4, 0x34968250, 0x8b4d377c, - 0x343aca87, 0x8b240e11, - 0x33def287, 0x8afb2cbb, 0x3382fa88, 0x8ad29394, 0x3326e2c3, 0x8aaa42b4, - 0x32caab6f, 0x8a823a36, - 0x326e54c7, 0x8a5a7a31, 0x3211df04, 0x8a3302be, 0x31b54a5e, 0x8a0bd3f5, - 0x3158970e, 0x89e4edef, - 0x30fbc54d, 0x89be50c3, 0x309ed556, 0x8997fc8a, 0x3041c761, 0x8971f15a, - 0x2fe49ba7, 0x894c2f4c, - 0x2f875262, 0x8926b677, 0x2f29ebcc, 0x890186f2, 0x2ecc681e, 0x88dca0d3, - 0x2e6ec792, 0x88b80432, - 0x2e110a62, 0x8893b125, 0x2db330c7, 0x886fa7c2, 0x2d553afc, 0x884be821, - 0x2cf72939, 0x88287256, - 0x2c98fbba, 0x88054677, 0x2c3ab2b9, 0x87e2649b, 0x2bdc4e6f, 0x87bfccd7, - 0x2b7dcf17, 0x879d7f41, - 0x2b1f34eb, 0x877b7bec, 0x2ac08026, 0x8759c2ef, 0x2a61b101, 0x8738545e, - 0x2a02c7b8, 0x8717304e, - 0x29a3c485, 0x86f656d3, 0x2944a7a2, 0x86d5c802, 0x28e5714b, 0x86b583ee, - 0x288621b9, 0x86958aac, - 0x2826b928, 0x8675dc4f, 0x27c737d3, 0x865678eb, 0x27679df4, 0x86376092, - 0x2707ebc7, 0x86189359, - 0x26a82186, 0x85fa1153, 0x26483f6c, 0x85dbda91, 0x25e845b6, 0x85bdef28, - 0x2588349d, 0x85a04f28, - 0x25280c5e, 0x8582faa5, 0x24c7cd33, 0x8565f1b0, 0x24677758, 0x8549345c, - 0x24070b08, 0x852cc2bb, - 0x23a6887f, 0x85109cdd, 0x2345eff8, 0x84f4c2d4, 0x22e541af, 0x84d934b1, - 0x22847de0, 0x84bdf286, - 0x2223a4c5, 0x84a2fc62, 0x21c2b69c, 0x84885258, 0x2161b3a0, 0x846df477, - 0x21009c0c, 0x8453e2cf, - 0x209f701c, 0x843a1d70, 0x203e300d, 0x8420a46c, 0x1fdcdc1b, 0x840777d0, - 0x1f7b7481, 0x83ee97ad, - 0x1f19f97b, 0x83d60412, 0x1eb86b46, 0x83bdbd0e, 0x1e56ca1e, 0x83a5c2b0, - 0x1df5163f, 0x838e1507, - 0x1d934fe5, 0x8376b422, 0x1d31774d, 0x835fa00f, 0x1ccf8cb3, 0x8348d8dc, - 0x1c6d9053, 0x83325e97, - 0x1c0b826a, 0x831c314e, 0x1ba96335, 0x83065110, 0x1b4732ef, 0x82f0bde8, - 0x1ae4f1d6, 0x82db77e5, - 0x1a82a026, 0x82c67f14, 0x1a203e1b, 0x82b1d381, 0x19bdcbf3, 0x829d753a, - 0x195b49ea, 0x8289644b, - 0x18f8b83c, 0x8275a0c0, 0x18961728, 0x82622aa6, 0x183366e9, 0x824f0208, - 0x17d0a7bc, 0x823c26f3, - 0x176dd9de, 0x82299971, 0x170afd8d, 0x82175990, 0x16a81305, 0x82056758, - 0x16451a83, 0x81f3c2d7, - 0x15e21445, 0x81e26c16, 0x157f0086, 0x81d16321, 0x151bdf86, 0x81c0a801, - 0x14b8b17f, 0x81b03ac2, - 0x145576b1, 0x81a01b6d, 0x13f22f58, 0x81904a0c, 0x138edbb1, 0x8180c6a9, - 0x132b7bf9, 0x8171914e, - 0x12c8106f, 0x8162aa04, 0x1264994e, 0x815410d4, 0x120116d5, 0x8145c5c7, - 0x119d8941, 0x8137c8e6, - 0x1139f0cf, 0x812a1a3a, 0x10d64dbd, 0x811cb9ca, 0x1072a048, 0x810fa7a0, - 0x100ee8ad, 0x8102e3c4, - 0xfab272b, 0x80f66e3c, 0xf475bff, 0x80ea4712, 0xee38766, 0x80de6e4c, - 0xe7fa99e, 0x80d2e3f2, - 0xe1bc2e4, 0x80c7a80a, 0xdb7d376, 0x80bcba9d, 0xd53db92, 0x80b21baf, - 0xcefdb76, 0x80a7cb49, - 0xc8bd35e, 0x809dc971, 0xc27c389, 0x8094162c, 0xbc3ac35, 0x808ab180, - 0xb5f8d9f, 0x80819b74, - 0xafb6805, 0x8078d40d, 0xa973ba5, 0x80705b50, 0xa3308bd, 0x80683143, - 0x9cecf89, 0x806055eb, - 0x96a9049, 0x8058c94c, 0x9064b3a, 0x80518b6b, 0x8a2009a, 0x804a9c4d, - 0x83db0a7, 0x8043fbf6, - 0x7d95b9e, 0x803daa6a, 0x77501be, 0x8037a7ac, 0x710a345, 0x8031f3c2, - 0x6ac406f, 0x802c8ead, - 0x647d97c, 0x80277872, 0x5e36ea9, 0x8022b114, 0x57f0035, 0x801e3895, - 0x51a8e5c, 0x801a0ef8, - 0x4b6195d, 0x80163440, 0x451a177, 0x8012a86f, 0x3ed26e6, 0x800f6b88, - 0x388a9ea, 0x800c7d8c, - 0x3242abf, 0x8009de7e, 0x2bfa9a4, 0x80078e5e, 0x25b26d7, 0x80058d2f, - 0x1f6a297, 0x8003daf1, - 0x1921d20, 0x800277a6, 0x12d96b1, 0x8001634e, 0xc90f88, 0x80009dea, - 0x6487e3, 0x8000277a, -}; - -static const q31_t WeightsQ31_2048[4096] = { - 0x7fffffff, 0x0, 0x7ffffd88, 0xffe6de05, 0x7ffff621, 0xffcdbc0b, 0x7fffe9cb, - 0xffb49a12, - 0x7fffd886, 0xff9b781d, 0x7fffc251, 0xff82562c, 0x7fffa72c, 0xff69343f, - 0x7fff8719, 0xff501258, - 0x7fff6216, 0xff36f078, 0x7fff3824, 0xff1dcea0, 0x7fff0943, 0xff04acd0, - 0x7ffed572, 0xfeeb8b0a, - 0x7ffe9cb2, 0xfed2694f, 0x7ffe5f03, 0xfeb947a0, 0x7ffe1c65, 0xfea025fd, - 0x7ffdd4d7, 0xfe870467, - 0x7ffd885a, 0xfe6de2e0, 0x7ffd36ee, 0xfe54c169, 0x7ffce093, 0xfe3ba002, - 0x7ffc8549, 0xfe227eac, - 0x7ffc250f, 0xfe095d69, 0x7ffbbfe6, 0xfdf03c3a, 0x7ffb55ce, 0xfdd71b1e, - 0x7ffae6c7, 0xfdbdfa18, - 0x7ffa72d1, 0xfda4d929, 0x7ff9f9ec, 0xfd8bb850, 0x7ff97c18, 0xfd729790, - 0x7ff8f954, 0xfd5976e9, - 0x7ff871a2, 0xfd40565c, 0x7ff7e500, 0xfd2735ea, 0x7ff75370, 0xfd0e1594, - 0x7ff6bcf0, 0xfcf4f55c, - 0x7ff62182, 0xfcdbd541, 0x7ff58125, 0xfcc2b545, 0x7ff4dbd9, 0xfca9956a, - 0x7ff4319d, 0xfc9075af, - 0x7ff38274, 0xfc775616, 0x7ff2ce5b, 0xfc5e36a0, 0x7ff21553, 0xfc45174e, - 0x7ff1575d, 0xfc2bf821, - 0x7ff09478, 0xfc12d91a, 0x7fefcca4, 0xfbf9ba39, 0x7feeffe1, 0xfbe09b80, - 0x7fee2e30, 0xfbc77cf0, - 0x7fed5791, 0xfbae5e89, 0x7fec7c02, 0xfb95404d, 0x7feb9b85, 0xfb7c223d, - 0x7feab61a, 0xfb630459, - 0x7fe9cbc0, 0xfb49e6a3, 0x7fe8dc78, 0xfb30c91b, 0x7fe7e841, 0xfb17abc2, - 0x7fe6ef1c, 0xfafe8e9b, - 0x7fe5f108, 0xfae571a4, 0x7fe4ee06, 0xfacc54e0, 0x7fe3e616, 0xfab3384f, - 0x7fe2d938, 0xfa9a1bf3, - 0x7fe1c76b, 0xfa80ffcb, 0x7fe0b0b1, 0xfa67e3da, 0x7fdf9508, 0xfa4ec821, - 0x7fde7471, 0xfa35ac9f, - 0x7fdd4eec, 0xfa1c9157, 0x7fdc247a, 0xfa037648, 0x7fdaf519, 0xf9ea5b75, - 0x7fd9c0ca, 0xf9d140de, - 0x7fd8878e, 0xf9b82684, 0x7fd74964, 0xf99f0c68, 0x7fd6064c, 0xf985f28a, - 0x7fd4be46, 0xf96cd8ed, - 0x7fd37153, 0xf953bf91, 0x7fd21f72, 0xf93aa676, 0x7fd0c8a3, 0xf9218d9e, - 0x7fcf6ce8, 0xf908750a, - 0x7fce0c3e, 0xf8ef5cbb, 0x7fcca6a7, 0xf8d644b2, 0x7fcb3c23, 0xf8bd2cef, - 0x7fc9ccb2, 0xf8a41574, - 0x7fc85854, 0xf88afe42, 0x7fc6df08, 0xf871e759, 0x7fc560cf, 0xf858d0bb, - 0x7fc3dda9, 0xf83fba68, - 0x7fc25596, 0xf826a462, 0x7fc0c896, 0xf80d8ea9, 0x7fbf36aa, 0xf7f4793e, - 0x7fbd9fd0, 0xf7db6423, - 0x7fbc040a, 0xf7c24f59, 0x7fba6357, 0xf7a93ae0, 0x7fb8bdb8, 0xf79026b9, - 0x7fb7132b, 0xf77712e5, - 0x7fb563b3, 0xf75dff66, 0x7fb3af4e, 0xf744ec3b, 0x7fb1f5fc, 0xf72bd967, - 0x7fb037bf, 0xf712c6ea, - 0x7fae7495, 0xf6f9b4c6, 0x7facac7f, 0xf6e0a2fa, 0x7faadf7c, 0xf6c79188, - 0x7fa90d8e, 0xf6ae8071, - 0x7fa736b4, 0xf6956fb7, 0x7fa55aee, 0xf67c5f59, 0x7fa37a3c, 0xf6634f59, - 0x7fa1949e, 0xf64a3fb8, - 0x7f9faa15, 0xf6313077, 0x7f9dbaa0, 0xf6182196, 0x7f9bc640, 0xf5ff1318, - 0x7f99ccf4, 0xf5e604fc, - 0x7f97cebd, 0xf5ccf743, 0x7f95cb9a, 0xf5b3e9f0, 0x7f93c38c, 0xf59add02, - 0x7f91b694, 0xf581d07b, - 0x7f8fa4b0, 0xf568c45b, 0x7f8d8de1, 0xf54fb8a4, 0x7f8b7227, 0xf536ad56, - 0x7f895182, 0xf51da273, - 0x7f872bf3, 0xf50497fb, 0x7f850179, 0xf4eb8def, 0x7f82d214, 0xf4d28451, - 0x7f809dc5, 0xf4b97b21, - 0x7f7e648c, 0xf4a07261, 0x7f7c2668, 0xf4876a10, 0x7f79e35a, 0xf46e6231, - 0x7f779b62, 0xf4555ac5, - 0x7f754e80, 0xf43c53cb, 0x7f72fcb4, 0xf4234d45, 0x7f70a5fe, 0xf40a4735, - 0x7f6e4a5e, 0xf3f1419a, - 0x7f6be9d4, 0xf3d83c77, 0x7f698461, 0xf3bf37cb, 0x7f671a05, 0xf3a63398, - 0x7f64aabf, 0xf38d2fe0, - 0x7f62368f, 0xf3742ca2, 0x7f5fbd77, 0xf35b29e0, 0x7f5d3f75, 0xf342279b, - 0x7f5abc8a, 0xf32925d3, - 0x7f5834b7, 0xf310248a, 0x7f55a7fa, 0xf2f723c1, 0x7f531655, 0xf2de2379, - 0x7f507fc7, 0xf2c523b2, - 0x7f4de451, 0xf2ac246e, 0x7f4b43f2, 0xf29325ad, 0x7f489eaa, 0xf27a2771, - 0x7f45f47b, 0xf26129ba, - 0x7f434563, 0xf2482c8a, 0x7f409164, 0xf22f2fe1, 0x7f3dd87c, 0xf21633c0, - 0x7f3b1aad, 0xf1fd3829, - 0x7f3857f6, 0xf1e43d1c, 0x7f359057, 0xf1cb429a, 0x7f32c3d1, 0xf1b248a5, - 0x7f2ff263, 0xf1994f3d, - 0x7f2d1c0e, 0xf1805662, 0x7f2a40d2, 0xf1675e17, 0x7f2760af, 0xf14e665c, - 0x7f247ba5, 0xf1356f32, - 0x7f2191b4, 0xf11c789a, 0x7f1ea2dc, 0xf1038295, 0x7f1baf1e, 0xf0ea8d24, - 0x7f18b679, 0xf0d19848, - 0x7f15b8ee, 0xf0b8a401, 0x7f12b67c, 0xf09fb051, 0x7f0faf25, 0xf086bd39, - 0x7f0ca2e7, 0xf06dcaba, - 0x7f0991c4, 0xf054d8d5, 0x7f067bba, 0xf03be78a, 0x7f0360cb, 0xf022f6da, - 0x7f0040f6, 0xf00a06c8, - 0x7efd1c3c, 0xeff11753, 0x7ef9f29d, 0xefd8287c, 0x7ef6c418, 0xefbf3a45, - 0x7ef390ae, 0xefa64cae, - 0x7ef05860, 0xef8d5fb8, 0x7eed1b2c, 0xef747365, 0x7ee9d914, 0xef5b87b5, - 0x7ee69217, 0xef429caa, - 0x7ee34636, 0xef29b243, 0x7edff570, 0xef10c883, 0x7edc9fc6, 0xeef7df6a, - 0x7ed94538, 0xeedef6f9, - 0x7ed5e5c6, 0xeec60f31, 0x7ed28171, 0xeead2813, 0x7ecf1837, 0xee9441a0, - 0x7ecbaa1a, 0xee7b5bd9, - 0x7ec8371a, 0xee6276bf, 0x7ec4bf36, 0xee499253, 0x7ec14270, 0xee30ae96, - 0x7ebdc0c6, 0xee17cb88, - 0x7eba3a39, 0xedfee92b, 0x7eb6aeca, 0xede60780, 0x7eb31e78, 0xedcd2687, - 0x7eaf8943, 0xedb44642, - 0x7eabef2c, 0xed9b66b2, 0x7ea85033, 0xed8287d7, 0x7ea4ac58, 0xed69a9b3, - 0x7ea1039b, 0xed50cc46, - 0x7e9d55fc, 0xed37ef91, 0x7e99a37c, 0xed1f1396, 0x7e95ec1a, 0xed063856, - 0x7e922fd6, 0xeced5dd0, - 0x7e8e6eb2, 0xecd48407, 0x7e8aa8ac, 0xecbbaafb, 0x7e86ddc6, 0xeca2d2ad, - 0x7e830dff, 0xec89fb1e, - 0x7e7f3957, 0xec71244f, 0x7e7b5fce, 0xec584e41, 0x7e778166, 0xec3f78f6, - 0x7e739e1d, 0xec26a46d, - 0x7e6fb5f4, 0xec0dd0a8, 0x7e6bc8eb, 0xebf4fda8, 0x7e67d703, 0xebdc2b6e, - 0x7e63e03b, 0xebc359fb, - 0x7e5fe493, 0xebaa894f, 0x7e5be40c, 0xeb91b96c, 0x7e57dea7, 0xeb78ea52, - 0x7e53d462, 0xeb601c04, - 0x7e4fc53e, 0xeb474e81, 0x7e4bb13c, 0xeb2e81ca, 0x7e47985b, 0xeb15b5e1, - 0x7e437a9c, 0xeafceac6, - 0x7e3f57ff, 0xeae4207a, 0x7e3b3083, 0xeacb56ff, 0x7e37042a, 0xeab28e56, - 0x7e32d2f4, 0xea99c67e, - 0x7e2e9cdf, 0xea80ff7a, 0x7e2a61ed, 0xea683949, 0x7e26221f, 0xea4f73ee, - 0x7e21dd73, 0xea36af69, - 0x7e1d93ea, 0xea1debbb, 0x7e194584, 0xea0528e5, 0x7e14f242, 0xe9ec66e8, - 0x7e109a24, 0xe9d3a5c5, - 0x7e0c3d29, 0xe9bae57d, 0x7e07db52, 0xe9a22610, 0x7e0374a0, 0xe9896781, - 0x7dff0911, 0xe970a9ce, - 0x7dfa98a8, 0xe957ecfb, 0x7df62362, 0xe93f3107, 0x7df1a942, 0xe92675f4, - 0x7ded2a47, 0xe90dbbc2, - 0x7de8a670, 0xe8f50273, 0x7de41dc0, 0xe8dc4a07, 0x7ddf9034, 0xe8c39280, - 0x7ddafdce, 0xe8aadbde, - 0x7dd6668f, 0xe8922622, 0x7dd1ca75, 0xe879714d, 0x7dcd2981, 0xe860bd61, - 0x7dc883b4, 0xe8480a5d, - 0x7dc3d90d, 0xe82f5844, 0x7dbf298d, 0xe816a716, 0x7dba7534, 0xe7fdf6d4, - 0x7db5bc02, 0xe7e5477f, - 0x7db0fdf8, 0xe7cc9917, 0x7dac3b15, 0xe7b3eb9f, 0x7da77359, 0xe79b3f16, - 0x7da2a6c6, 0xe782937e, - 0x7d9dd55a, 0xe769e8d8, 0x7d98ff17, 0xe7513f25, 0x7d9423fc, 0xe7389665, - 0x7d8f4409, 0xe71fee99, - 0x7d8a5f40, 0xe70747c4, 0x7d85759f, 0xe6eea1e4, 0x7d808728, 0xe6d5fcfc, - 0x7d7b93da, 0xe6bd590d, - 0x7d769bb5, 0xe6a4b616, 0x7d719eba, 0xe68c141a, 0x7d6c9ce9, 0xe6737319, - 0x7d679642, 0xe65ad315, - 0x7d628ac6, 0xe642340d, 0x7d5d7a74, 0xe6299604, 0x7d58654d, 0xe610f8f9, - 0x7d534b50, 0xe5f85cef, - 0x7d4e2c7f, 0xe5dfc1e5, 0x7d4908d9, 0xe5c727dd, 0x7d43e05e, 0xe5ae8ed8, - 0x7d3eb30f, 0xe595f6d7, - 0x7d3980ec, 0xe57d5fda, 0x7d3449f5, 0xe564c9e3, 0x7d2f0e2b, 0xe54c34f3, - 0x7d29cd8c, 0xe533a10a, - 0x7d24881b, 0xe51b0e2a, 0x7d1f3dd6, 0xe5027c53, 0x7d19eebf, 0xe4e9eb87, - 0x7d149ad5, 0xe4d15bc6, - 0x7d0f4218, 0xe4b8cd11, 0x7d09e489, 0xe4a03f69, 0x7d048228, 0xe487b2d0, - 0x7cff1af5, 0xe46f2745, - 0x7cf9aef0, 0xe4569ccb, 0x7cf43e1a, 0xe43e1362, 0x7ceec873, 0xe4258b0a, - 0x7ce94dfb, 0xe40d03c6, - 0x7ce3ceb2, 0xe3f47d96, 0x7cde4a98, 0xe3dbf87a, 0x7cd8c1ae, 0xe3c37474, - 0x7cd333f3, 0xe3aaf184, - 0x7ccda169, 0xe3926fad, 0x7cc80a0f, 0xe379eeed, 0x7cc26de5, 0xe3616f48, - 0x7cbcccec, 0xe348f0bd, - 0x7cb72724, 0xe330734d, 0x7cb17c8d, 0xe317f6fa, 0x7cabcd28, 0xe2ff7bc3, - 0x7ca618f3, 0xe2e701ac, - 0x7ca05ff1, 0xe2ce88b3, 0x7c9aa221, 0xe2b610da, 0x7c94df83, 0xe29d9a23, - 0x7c8f1817, 0xe285248d, - 0x7c894bde, 0xe26cb01b, 0x7c837ad8, 0xe2543ccc, 0x7c7da505, 0xe23bcaa2, - 0x7c77ca65, 0xe223599e, - 0x7c71eaf9, 0xe20ae9c1, 0x7c6c06c0, 0xe1f27b0b, 0x7c661dbc, 0xe1da0d7e, - 0x7c602fec, 0xe1c1a11b, - 0x7c5a3d50, 0xe1a935e2, 0x7c5445e9, 0xe190cbd4, 0x7c4e49b7, 0xe17862f3, - 0x7c4848ba, 0xe15ffb3f, - 0x7c4242f2, 0xe14794ba, 0x7c3c3860, 0xe12f2f63, 0x7c362904, 0xe116cb3d, - 0x7c3014de, 0xe0fe6848, - 0x7c29fbee, 0xe0e60685, 0x7c23de35, 0xe0cda5f5, 0x7c1dbbb3, 0xe0b54698, - 0x7c179467, 0xe09ce871, - 0x7c116853, 0xe0848b7f, 0x7c0b3777, 0xe06c2fc4, 0x7c0501d2, 0xe053d541, - 0x7bfec765, 0xe03b7bf6, - 0x7bf88830, 0xe02323e5, 0x7bf24434, 0xe00acd0e, 0x7bebfb70, 0xdff27773, - 0x7be5ade6, 0xdfda2314, - 0x7bdf5b94, 0xdfc1cff3, 0x7bd9047c, 0xdfa97e0f, 0x7bd2a89e, 0xdf912d6b, - 0x7bcc47fa, 0xdf78de07, - 0x7bc5e290, 0xdf608fe4, 0x7bbf7860, 0xdf484302, 0x7bb9096b, 0xdf2ff764, - 0x7bb295b0, 0xdf17ad0a, - 0x7bac1d31, 0xdeff63f4, 0x7ba59fee, 0xdee71c24, 0x7b9f1de6, 0xdeced59b, - 0x7b989719, 0xdeb69059, - 0x7b920b89, 0xde9e4c60, 0x7b8b7b36, 0xde8609b1, 0x7b84e61f, 0xde6dc84b, - 0x7b7e4c45, 0xde558831, - 0x7b77ada8, 0xde3d4964, 0x7b710a49, 0xde250be3, 0x7b6a6227, 0xde0ccfb1, - 0x7b63b543, 0xddf494ce, - 0x7b5d039e, 0xdddc5b3b, 0x7b564d36, 0xddc422f8, 0x7b4f920e, 0xddabec08, - 0x7b48d225, 0xdd93b66a, - 0x7b420d7a, 0xdd7b8220, 0x7b3b4410, 0xdd634f2b, 0x7b3475e5, 0xdd4b1d8c, - 0x7b2da2fa, 0xdd32ed43, - 0x7b26cb4f, 0xdd1abe51, 0x7b1feee5, 0xdd0290b8, 0x7b190dbc, 0xdcea6478, - 0x7b1227d3, 0xdcd23993, - 0x7b0b3d2c, 0xdcba1008, 0x7b044dc7, 0xdca1e7da, 0x7afd59a4, 0xdc89c109, - 0x7af660c2, 0xdc719b96, - 0x7aef6323, 0xdc597781, 0x7ae860c7, 0xdc4154cd, 0x7ae159ae, 0xdc293379, - 0x7ada4dd8, 0xdc111388, - 0x7ad33d45, 0xdbf8f4f8, 0x7acc27f7, 0xdbe0d7cd, 0x7ac50dec, 0xdbc8bc06, - 0x7abdef25, 0xdbb0a1a4, - 0x7ab6cba4, 0xdb9888a8, 0x7aafa367, 0xdb807114, 0x7aa8766f, 0xdb685ae9, - 0x7aa144bc, 0xdb504626, - 0x7a9a0e50, 0xdb3832cd, 0x7a92d329, 0xdb2020e0, 0x7a8b9348, 0xdb08105e, - 0x7a844eae, 0xdaf00149, - 0x7a7d055b, 0xdad7f3a2, 0x7a75b74f, 0xdabfe76a, 0x7a6e648a, 0xdaa7dca1, - 0x7a670d0d, 0xda8fd349, - 0x7a5fb0d8, 0xda77cb63, 0x7a584feb, 0xda5fc4ef, 0x7a50ea47, 0xda47bfee, - 0x7a497feb, 0xda2fbc61, - 0x7a4210d8, 0xda17ba4a, 0x7a3a9d0f, 0xd9ffb9a9, 0x7a332490, 0xd9e7ba7f, - 0x7a2ba75a, 0xd9cfbccd, - 0x7a24256f, 0xd9b7c094, 0x7a1c9ece, 0xd99fc5d4, 0x7a151378, 0xd987cc90, - 0x7a0d836d, 0xd96fd4c7, - 0x7a05eead, 0xd957de7a, 0x79fe5539, 0xd93fe9ab, 0x79f6b711, 0xd927f65b, - 0x79ef1436, 0xd910048a, - 0x79e76ca7, 0xd8f81439, 0x79dfc064, 0xd8e0256a, 0x79d80f6f, 0xd8c8381d, - 0x79d059c8, 0xd8b04c52, - 0x79c89f6e, 0xd898620c, 0x79c0e062, 0xd880794b, 0x79b91ca4, 0xd868920f, - 0x79b15435, 0xd850ac5a, - 0x79a98715, 0xd838c82d, 0x79a1b545, 0xd820e589, 0x7999dec4, 0xd809046e, - 0x79920392, 0xd7f124dd, - 0x798a23b1, 0xd7d946d8, 0x79823f20, 0xd7c16a5f, 0x797a55e0, 0xd7a98f73, - 0x797267f2, 0xd791b616, - 0x796a7554, 0xd779de47, 0x79627e08, 0xd7620808, 0x795a820e, 0xd74a335b, - 0x79528167, 0xd732603f, - 0x794a7c12, 0xd71a8eb5, 0x79427210, 0xd702bec0, 0x793a6361, 0xd6eaf05f, - 0x79325006, 0xd6d32393, - 0x792a37fe, 0xd6bb585e, 0x79221b4b, 0xd6a38ec0, 0x7919f9ec, 0xd68bc6ba, - 0x7911d3e2, 0xd674004e, - 0x7909a92d, 0xd65c3b7b, 0x790179cd, 0xd6447844, 0x78f945c3, 0xd62cb6a8, - 0x78f10d0f, 0xd614f6a9, - 0x78e8cfb2, 0xd5fd3848, 0x78e08dab, 0xd5e57b85, 0x78d846fb, 0xd5cdc062, - 0x78cffba3, 0xd5b606e0, - 0x78c7aba2, 0xd59e4eff, 0x78bf56f9, 0xd58698c0, 0x78b6fda8, 0xd56ee424, - 0x78ae9fb0, 0xd557312d, - 0x78a63d11, 0xd53f7fda, 0x789dd5cb, 0xd527d02e, 0x789569df, 0xd5102228, - 0x788cf94c, 0xd4f875ca, - 0x78848414, 0xd4e0cb15, 0x787c0a36, 0xd4c92209, 0x78738bb3, 0xd4b17aa8, - 0x786b088c, 0xd499d4f2, - 0x786280bf, 0xd48230e9, 0x7859f44f, 0xd46a8e8d, 0x7851633b, 0xd452eddf, - 0x7848cd83, 0xd43b4ee0, - 0x78403329, 0xd423b191, 0x7837942b, 0xd40c15f3, 0x782ef08b, 0xd3f47c06, - 0x78264849, 0xd3dce3cd, - 0x781d9b65, 0xd3c54d47, 0x7814e9df, 0xd3adb876, 0x780c33b8, 0xd396255a, - 0x780378f1, 0xd37e93f4, - 0x77fab989, 0xd3670446, 0x77f1f581, 0xd34f764f, 0x77e92cd9, 0xd337ea12, - 0x77e05f91, 0xd3205f8f, - 0x77d78daa, 0xd308d6c7, 0x77ceb725, 0xd2f14fba, 0x77c5dc01, 0xd2d9ca6a, - 0x77bcfc3f, 0xd2c246d8, - 0x77b417df, 0xd2aac504, 0x77ab2ee2, 0xd29344f0, 0x77a24148, 0xd27bc69c, - 0x77994f11, 0xd2644a0a, - 0x7790583e, 0xd24ccf39, 0x77875cce, 0xd235562b, 0x777e5cc3, 0xd21ddee2, - 0x7775581d, 0xd206695d, - 0x776c4edb, 0xd1eef59e, 0x776340ff, 0xd1d783a6, 0x775a2e89, 0xd1c01375, - 0x77511778, 0xd1a8a50d, - 0x7747fbce, 0xd191386e, 0x773edb8b, 0xd179cd99, 0x7735b6af, 0xd1626490, - 0x772c8d3a, 0xd14afd52, - 0x77235f2d, 0xd13397e2, 0x771a2c88, 0xd11c343f, 0x7710f54c, 0xd104d26b, - 0x7707b979, 0xd0ed7267, - 0x76fe790e, 0xd0d61434, 0x76f5340e, 0xd0beb7d2, 0x76ebea77, 0xd0a75d42, - 0x76e29c4b, 0xd0900486, - 0x76d94989, 0xd078ad9e, 0x76cff232, 0xd061588b, 0x76c69647, 0xd04a054e, - 0x76bd35c7, 0xd032b3e7, - 0x76b3d0b4, 0xd01b6459, 0x76aa670d, 0xd00416a3, 0x76a0f8d2, 0xcfeccac7, - 0x76978605, 0xcfd580c6, - 0x768e0ea6, 0xcfbe389f, 0x768492b4, 0xcfa6f255, 0x767b1231, 0xcf8fade9, - 0x76718d1c, 0xcf786b5a, - 0x76680376, 0xcf612aaa, 0x765e7540, 0xcf49ebda, 0x7654e279, 0xcf32aeeb, - 0x764b4b23, 0xcf1b73de, - 0x7641af3d, 0xcf043ab3, 0x76380ec8, 0xceed036b, 0x762e69c4, 0xced5ce08, - 0x7624c031, 0xcebe9a8a, - 0x761b1211, 0xcea768f2, 0x76115f63, 0xce903942, 0x7607a828, 0xce790b79, - 0x75fdec60, 0xce61df99, - 0x75f42c0b, 0xce4ab5a2, 0x75ea672a, 0xce338d97, 0x75e09dbd, 0xce1c6777, - 0x75d6cfc5, 0xce054343, - 0x75ccfd42, 0xcdee20fc, 0x75c32634, 0xcdd700a4, 0x75b94a9c, 0xcdbfe23a, - 0x75af6a7b, 0xcda8c5c1, - 0x75a585cf, 0xcd91ab39, 0x759b9c9b, 0xcd7a92a2, 0x7591aedd, 0xcd637bfe, - 0x7587bc98, 0xcd4c674d, - 0x757dc5ca, 0xcd355491, 0x7573ca75, 0xcd1e43ca, 0x7569ca99, 0xcd0734f9, - 0x755fc635, 0xccf0281f, - 0x7555bd4c, 0xccd91d3d, 0x754bafdc, 0xccc21455, 0x75419de7, 0xccab0d65, - 0x7537876c, 0xcc940871, - 0x752d6c6c, 0xcc7d0578, 0x75234ce8, 0xcc66047b, 0x751928e0, 0xcc4f057c, - 0x750f0054, 0xcc38087b, - 0x7504d345, 0xcc210d79, 0x74faa1b3, 0xcc0a1477, 0x74f06b9e, 0xcbf31d75, - 0x74e63108, 0xcbdc2876, - 0x74dbf1ef, 0xcbc53579, 0x74d1ae55, 0xcbae447f, 0x74c7663a, 0xcb97558a, - 0x74bd199f, 0xcb80689a, - 0x74b2c884, 0xcb697db0, 0x74a872e8, 0xcb5294ce, 0x749e18cd, 0xcb3badf3, - 0x7493ba34, 0xcb24c921, - 0x7489571c, 0xcb0de658, 0x747eef85, 0xcaf7059a, 0x74748371, 0xcae026e8, - 0x746a12df, 0xcac94a42, - 0x745f9dd1, 0xcab26fa9, 0x74552446, 0xca9b971e, 0x744aa63f, 0xca84c0a3, - 0x744023bc, 0xca6dec37, - 0x74359cbd, 0xca5719db, 0x742b1144, 0xca404992, 0x74208150, 0xca297b5a, - 0x7415ece2, 0xca12af37, - 0x740b53fb, 0xc9fbe527, 0x7400b69a, 0xc9e51d2d, 0x73f614c0, 0xc9ce5748, - 0x73eb6e6e, 0xc9b7937a, - 0x73e0c3a3, 0xc9a0d1c5, 0x73d61461, 0xc98a1227, 0x73cb60a8, 0xc97354a4, - 0x73c0a878, 0xc95c993a, - 0x73b5ebd1, 0xc945dfec, 0x73ab2ab4, 0xc92f28ba, 0x73a06522, 0xc91873a5, - 0x73959b1b, 0xc901c0ae, - 0x738acc9e, 0xc8eb0fd6, 0x737ff9ae, 0xc8d4611d, 0x73752249, 0xc8bdb485, - 0x736a4671, 0xc8a70a0e, - 0x735f6626, 0xc89061ba, 0x73548168, 0xc879bb89, 0x73499838, 0xc863177b, - 0x733eaa96, 0xc84c7593, - 0x7333b883, 0xc835d5d0, 0x7328c1ff, 0xc81f3834, 0x731dc70a, 0xc8089cbf, - 0x7312c7a5, 0xc7f20373, - 0x7307c3d0, 0xc7db6c50, 0x72fcbb8c, 0xc7c4d757, 0x72f1aed9, 0xc7ae4489, - 0x72e69db7, 0xc797b3e7, - 0x72db8828, 0xc7812572, 0x72d06e2b, 0xc76a992a, 0x72c54fc1, 0xc7540f11, - 0x72ba2cea, 0xc73d8727, - 0x72af05a7, 0xc727016d, 0x72a3d9f7, 0xc7107de4, 0x7298a9dd, 0xc6f9fc8d, - 0x728d7557, 0xc6e37d69, - 0x72823c67, 0xc6cd0079, 0x7276ff0d, 0xc6b685bd, 0x726bbd48, 0xc6a00d37, - 0x7260771b, 0xc68996e7, - 0x72552c85, 0xc67322ce, 0x7249dd86, 0xc65cb0ed, 0x723e8a20, 0xc6464144, - 0x72333251, 0xc62fd3d6, - 0x7227d61c, 0xc61968a2, 0x721c7580, 0xc602ffaa, 0x7211107e, 0xc5ec98ee, - 0x7205a716, 0xc5d6346f, - 0x71fa3949, 0xc5bfd22e, 0x71eec716, 0xc5a9722c, 0x71e35080, 0xc593146a, - 0x71d7d585, 0xc57cb8e9, - 0x71cc5626, 0xc5665fa9, 0x71c0d265, 0xc55008ab, 0x71b54a41, 0xc539b3f1, - 0x71a9bdba, 0xc523617a, - 0x719e2cd2, 0xc50d1149, 0x71929789, 0xc4f6c35d, 0x7186fdde, 0xc4e077b8, - 0x717b5fd3, 0xc4ca2e5b, - 0x716fbd68, 0xc4b3e746, 0x7164169d, 0xc49da27a, 0x71586b74, 0xc4875ff9, - 0x714cbbeb, 0xc4711fc2, - 0x71410805, 0xc45ae1d7, 0x71354fc0, 0xc444a639, 0x7129931f, 0xc42e6ce8, - 0x711dd220, 0xc41835e6, - 0x71120cc5, 0xc4020133, 0x7106430e, 0xc3ebced0, 0x70fa74fc, 0xc3d59ebe, - 0x70eea28e, 0xc3bf70fd, - 0x70e2cbc6, 0xc3a94590, 0x70d6f0a4, 0xc3931c76, 0x70cb1128, 0xc37cf5b0, - 0x70bf2d53, 0xc366d140, - 0x70b34525, 0xc350af26, 0x70a7589f, 0xc33a8f62, 0x709b67c0, 0xc32471f7, - 0x708f728b, 0xc30e56e4, - 0x708378ff, 0xc2f83e2a, 0x70777b1c, 0xc2e227cb, 0x706b78e3, 0xc2cc13c7, - 0x705f7255, 0xc2b6021f, - 0x70536771, 0xc29ff2d4, 0x70475839, 0xc289e5e7, 0x703b44ad, 0xc273db58, - 0x702f2ccd, 0xc25dd329, - 0x7023109a, 0xc247cd5a, 0x7016f014, 0xc231c9ec, 0x700acb3c, 0xc21bc8e1, - 0x6ffea212, 0xc205ca38, - 0x6ff27497, 0xc1efcdf3, 0x6fe642ca, 0xc1d9d412, 0x6fda0cae, 0xc1c3dc97, - 0x6fcdd241, 0xc1ade781, - 0x6fc19385, 0xc197f4d4, 0x6fb5507a, 0xc182048d, 0x6fa90921, 0xc16c16b0, - 0x6f9cbd79, 0xc1562b3d, - 0x6f906d84, 0xc1404233, 0x6f841942, 0xc12a5b95, 0x6f77c0b3, 0xc1147764, - 0x6f6b63d8, 0xc0fe959f, - 0x6f5f02b2, 0xc0e8b648, 0x6f529d40, 0xc0d2d960, 0x6f463383, 0xc0bcfee7, - 0x6f39c57d, 0xc0a726df, - 0x6f2d532c, 0xc0915148, 0x6f20dc92, 0xc07b7e23, 0x6f1461b0, 0xc065ad70, - 0x6f07e285, 0xc04fdf32, - 0x6efb5f12, 0xc03a1368, 0x6eeed758, 0xc0244a14, 0x6ee24b57, 0xc00e8336, - 0x6ed5bb10, 0xbff8bece, - 0x6ec92683, 0xbfe2fcdf, 0x6ebc8db0, 0xbfcd3d69, 0x6eaff099, 0xbfb7806c, - 0x6ea34f3d, 0xbfa1c5ea, - 0x6e96a99d, 0xbf8c0de3, 0x6e89ffb9, 0xbf765858, 0x6e7d5193, 0xbf60a54a, - 0x6e709f2a, 0xbf4af4ba, - 0x6e63e87f, 0xbf3546a8, 0x6e572d93, 0xbf1f9b16, 0x6e4a6e66, 0xbf09f205, - 0x6e3daaf8, 0xbef44b74, - 0x6e30e34a, 0xbedea765, 0x6e24175c, 0xbec905d9, 0x6e174730, 0xbeb366d1, - 0x6e0a72c5, 0xbe9dca4e, - 0x6dfd9a1c, 0xbe88304f, 0x6df0bd35, 0xbe7298d7, 0x6de3dc11, 0xbe5d03e6, - 0x6dd6f6b1, 0xbe47717c, - 0x6dca0d14, 0xbe31e19b, 0x6dbd1f3c, 0xbe1c5444, 0x6db02d29, 0xbe06c977, - 0x6da336dc, 0xbdf14135, - 0x6d963c54, 0xbddbbb7f, 0x6d893d93, 0xbdc63856, 0x6d7c3a98, 0xbdb0b7bb, - 0x6d6f3365, 0xbd9b39ad, - 0x6d6227fa, 0xbd85be30, 0x6d551858, 0xbd704542, 0x6d48047e, 0xbd5acee5, - 0x6d3aec6e, 0xbd455b1a, - 0x6d2dd027, 0xbd2fe9e2, 0x6d20afac, 0xbd1a7b3d, 0x6d138afb, 0xbd050f2c, - 0x6d066215, 0xbcefa5b0, - 0x6cf934fc, 0xbcda3ecb, 0x6cec03af, 0xbcc4da7b, 0x6cdece2f, 0xbcaf78c4, - 0x6cd1947c, 0xbc9a19a5, - 0x6cc45698, 0xbc84bd1f, 0x6cb71482, 0xbc6f6333, 0x6ca9ce3b, 0xbc5a0be2, - 0x6c9c83c3, 0xbc44b72c, - 0x6c8f351c, 0xbc2f6513, 0x6c81e245, 0xbc1a1598, 0x6c748b3f, 0xbc04c8ba, - 0x6c67300b, 0xbbef7e7c, - 0x6c59d0a9, 0xbbda36dd, 0x6c4c6d1a, 0xbbc4f1df, 0x6c3f055d, 0xbbafaf82, - 0x6c319975, 0xbb9a6fc7, - 0x6c242960, 0xbb8532b0, 0x6c16b521, 0xbb6ff83c, 0x6c093cb6, 0xbb5ac06d, - 0x6bfbc021, 0xbb458b43, - 0x6bee3f62, 0xbb3058c0, 0x6be0ba7b, 0xbb1b28e4, 0x6bd3316a, 0xbb05fbb0, - 0x6bc5a431, 0xbaf0d125, - 0x6bb812d1, 0xbadba943, 0x6baa7d49, 0xbac6840c, 0x6b9ce39b, 0xbab16180, - 0x6b8f45c7, 0xba9c41a0, - 0x6b81a3cd, 0xba87246d, 0x6b73fdae, 0xba7209e7, 0x6b66536b, 0xba5cf210, - 0x6b58a503, 0xba47dce8, - 0x6b4af279, 0xba32ca71, 0x6b3d3bcb, 0xba1dbaaa, 0x6b2f80fb, 0xba08ad95, - 0x6b21c208, 0xb9f3a332, - 0x6b13fef5, 0xb9de9b83, 0x6b0637c1, 0xb9c99688, 0x6af86c6c, 0xb9b49442, - 0x6aea9cf8, 0xb99f94b2, - 0x6adcc964, 0xb98a97d8, 0x6acef1b2, 0xb9759db6, 0x6ac115e2, 0xb960a64c, - 0x6ab335f4, 0xb94bb19b, - 0x6aa551e9, 0xb936bfa4, 0x6a9769c1, 0xb921d067, 0x6a897d7d, 0xb90ce3e6, - 0x6a7b8d1e, 0xb8f7fa21, - 0x6a6d98a4, 0xb8e31319, 0x6a5fa010, 0xb8ce2ecf, 0x6a51a361, 0xb8b94d44, - 0x6a43a29a, 0xb8a46e78, - 0x6a359db9, 0xb88f926d, 0x6a2794c1, 0xb87ab922, 0x6a1987b0, 0xb865e299, - 0x6a0b7689, 0xb8510ed4, - 0x69fd614a, 0xb83c3dd1, 0x69ef47f6, 0xb8276f93, 0x69e12a8c, 0xb812a41a, - 0x69d3090e, 0xb7fddb67, - 0x69c4e37a, 0xb7e9157a, 0x69b6b9d3, 0xb7d45255, 0x69a88c19, 0xb7bf91f8, - 0x699a5a4c, 0xb7aad465, - 0x698c246c, 0xb796199b, 0x697dea7b, 0xb781619c, 0x696fac78, 0xb76cac69, - 0x69616a65, 0xb757fa01, - 0x69532442, 0xb7434a67, 0x6944da10, 0xb72e9d9b, 0x69368bce, 0xb719f39e, - 0x6928397e, 0xb7054c6f, - 0x6919e320, 0xb6f0a812, 0x690b88b5, 0xb6dc0685, 0x68fd2a3d, 0xb6c767ca, - 0x68eec7b9, 0xb6b2cbe2, - 0x68e06129, 0xb69e32cd, 0x68d1f68f, 0xb6899c8d, 0x68c387e9, 0xb6750921, - 0x68b5153a, 0xb660788c, - 0x68a69e81, 0xb64beacd, 0x689823bf, 0xb6375fe5, 0x6889a4f6, 0xb622d7d6, - 0x687b2224, 0xb60e529f, - 0x686c9b4b, 0xb5f9d043, 0x685e106c, 0xb5e550c1, 0x684f8186, 0xb5d0d41a, - 0x6840ee9b, 0xb5bc5a50, - 0x683257ab, 0xb5a7e362, 0x6823bcb7, 0xb5936f53, 0x68151dbe, 0xb57efe22, - 0x68067ac3, 0xb56a8fd0, - 0x67f7d3c5, 0xb556245e, 0x67e928c5, 0xb541bbcd, 0x67da79c3, 0xb52d561e, - 0x67cbc6c0, 0xb518f351, - 0x67bd0fbd, 0xb5049368, 0x67ae54ba, 0xb4f03663, 0x679f95b7, 0xb4dbdc42, - 0x6790d2b6, 0xb4c78507, - 0x67820bb7, 0xb4b330b3, 0x677340ba, 0xb49edf45, 0x676471c0, 0xb48a90c0, - 0x67559eca, 0xb4764523, - 0x6746c7d8, 0xb461fc70, 0x6737ecea, 0xb44db6a8, 0x67290e02, 0xb43973ca, - 0x671a2b20, 0xb42533d8, - 0x670b4444, 0xb410f6d3, 0x66fc596f, 0xb3fcbcbb, 0x66ed6aa1, 0xb3e88592, - 0x66de77dc, 0xb3d45157, - 0x66cf8120, 0xb3c0200c, 0x66c0866d, 0xb3abf1b2, 0x66b187c3, 0xb397c649, - 0x66a28524, 0xb3839dd3, - 0x66937e91, 0xb36f784f, 0x66847408, 0xb35b55bf, 0x6675658c, 0xb3473623, - 0x6666531d, 0xb333197c, - 0x66573cbb, 0xb31effcc, 0x66482267, 0xb30ae912, 0x66390422, 0xb2f6d550, - 0x6629e1ec, 0xb2e2c486, - 0x661abbc5, 0xb2ceb6b5, 0x660b91af, 0xb2baabde, 0x65fc63a9, 0xb2a6a402, - 0x65ed31b5, 0xb2929f21, - 0x65ddfbd3, 0xb27e9d3c, 0x65cec204, 0xb26a9e54, 0x65bf8447, 0xb256a26a, - 0x65b0429f, 0xb242a97e, - 0x65a0fd0b, 0xb22eb392, 0x6591b38c, 0xb21ac0a6, 0x65826622, 0xb206d0ba, - 0x657314cf, 0xb1f2e3d0, - 0x6563bf92, 0xb1def9e9, 0x6554666d, 0xb1cb1304, 0x6545095f, 0xb1b72f23, - 0x6535a86b, 0xb1a34e47, - 0x6526438f, 0xb18f7071, 0x6516dacd, 0xb17b95a0, 0x65076e25, 0xb167bdd7, - 0x64f7fd98, 0xb153e915, - 0x64e88926, 0xb140175b, 0x64d910d1, 0xb12c48ab, 0x64c99498, 0xb1187d05, - 0x64ba147d, 0xb104b46a, - 0x64aa907f, 0xb0f0eeda, 0x649b08a0, 0xb0dd2c56, 0x648b7ce0, 0xb0c96ce0, - 0x647bed3f, 0xb0b5b077, - 0x646c59bf, 0xb0a1f71d, 0x645cc260, 0xb08e40d2, 0x644d2722, 0xb07a8d97, - 0x643d8806, 0xb066dd6d, - 0x642de50d, 0xb0533055, 0x641e3e38, 0xb03f864f, 0x640e9386, 0xb02bdf5c, - 0x63fee4f8, 0xb0183b7d, - 0x63ef3290, 0xb0049ab3, 0x63df7c4d, 0xaff0fcfe, 0x63cfc231, 0xafdd625f, - 0x63c0043b, 0xafc9cad7, - 0x63b0426d, 0xafb63667, 0x63a07cc7, 0xafa2a50f, 0x6390b34a, 0xaf8f16d1, - 0x6380e5f6, 0xaf7b8bac, - 0x637114cc, 0xaf6803a2, 0x63613fcd, 0xaf547eb3, 0x635166f9, 0xaf40fce1, - 0x63418a50, 0xaf2d7e2b, - 0x6331a9d4, 0xaf1a0293, 0x6321c585, 0xaf068a1a, 0x6311dd64, 0xaef314c0, - 0x6301f171, 0xaedfa285, - 0x62f201ac, 0xaecc336c, 0x62e20e17, 0xaeb8c774, 0x62d216b3, 0xaea55e9e, - 0x62c21b7e, 0xae91f8eb, - 0x62b21c7b, 0xae7e965b, 0x62a219aa, 0xae6b36f0, 0x6292130c, 0xae57daab, - 0x628208a1, 0xae44818b, - 0x6271fa69, 0xae312b92, 0x6261e866, 0xae1dd8c0, 0x6251d298, 0xae0a8916, - 0x6241b8ff, 0xadf73c96, - 0x62319b9d, 0xade3f33e, 0x62217a72, 0xadd0ad12, 0x6211557e, 0xadbd6a10, - 0x62012cc2, 0xadaa2a3b, - 0x61f1003f, 0xad96ed92, 0x61e0cff5, 0xad83b416, 0x61d09be5, 0xad707dc8, - 0x61c06410, 0xad5d4aaa, - 0x61b02876, 0xad4a1aba, 0x619fe918, 0xad36edfc, 0x618fa5f7, 0xad23c46e, - 0x617f5f12, 0xad109e12, - 0x616f146c, 0xacfd7ae8, 0x615ec603, 0xacea5af2, 0x614e73da, 0xacd73e30, - 0x613e1df0, 0xacc424a3, - 0x612dc447, 0xacb10e4b, 0x611d66de, 0xac9dfb29, 0x610d05b7, 0xac8aeb3e, - 0x60fca0d2, 0xac77de8b, - 0x60ec3830, 0xac64d510, 0x60dbcbd1, 0xac51cecf, 0x60cb5bb7, 0xac3ecbc7, - 0x60bae7e1, 0xac2bcbfa, - 0x60aa7050, 0xac18cf69, 0x6099f505, 0xac05d613, 0x60897601, 0xabf2dffb, - 0x6078f344, 0xabdfed1f, - 0x60686ccf, 0xabccfd83, 0x6057e2a2, 0xabba1125, 0x604754bf, 0xaba72807, - 0x6036c325, 0xab944229, - 0x60262dd6, 0xab815f8d, 0x601594d1, 0xab6e8032, 0x6004f819, 0xab5ba41a, - 0x5ff457ad, 0xab48cb46, - 0x5fe3b38d, 0xab35f5b5, 0x5fd30bbc, 0xab23236a, 0x5fc26038, 0xab105464, - 0x5fb1b104, 0xaafd88a4, - 0x5fa0fe1f, 0xaaeac02c, 0x5f90478a, 0xaad7fafb, 0x5f7f8d46, 0xaac53912, - 0x5f6ecf53, 0xaab27a73, - 0x5f5e0db3, 0xaa9fbf1e, 0x5f4d4865, 0xaa8d0713, 0x5f3c7f6b, 0xaa7a5253, - 0x5f2bb2c5, 0xaa67a0e0, - 0x5f1ae274, 0xaa54f2ba, 0x5f0a0e77, 0xaa4247e1, 0x5ef936d1, 0xaa2fa056, - 0x5ee85b82, 0xaa1cfc1a, - 0x5ed77c8a, 0xaa0a5b2e, 0x5ec699e9, 0xa9f7bd92, 0x5eb5b3a2, 0xa9e52347, - 0x5ea4c9b3, 0xa9d28c4e, - 0x5e93dc1f, 0xa9bff8a8, 0x5e82eae5, 0xa9ad6855, 0x5e71f606, 0xa99adb56, - 0x5e60fd84, 0xa98851ac, - 0x5e50015d, 0xa975cb57, 0x5e3f0194, 0xa9634858, 0x5e2dfe29, 0xa950c8b0, - 0x5e1cf71c, 0xa93e4c5f, - 0x5e0bec6e, 0xa92bd367, 0x5dfade20, 0xa9195dc7, 0x5de9cc33, 0xa906eb82, - 0x5dd8b6a7, 0xa8f47c97, - 0x5dc79d7c, 0xa8e21106, 0x5db680b4, 0xa8cfa8d2, 0x5da5604f, 0xa8bd43fa, - 0x5d943c4e, 0xa8aae280, - 0x5d8314b1, 0xa8988463, 0x5d71e979, 0xa88629a5, 0x5d60baa7, 0xa873d246, - 0x5d4f883b, 0xa8617e48, - 0x5d3e5237, 0xa84f2daa, 0x5d2d189a, 0xa83ce06e, 0x5d1bdb65, 0xa82a9693, - 0x5d0a9a9a, 0xa818501c, - 0x5cf95638, 0xa8060d08, 0x5ce80e41, 0xa7f3cd59, 0x5cd6c2b5, 0xa7e1910f, - 0x5cc57394, 0xa7cf582a, - 0x5cb420e0, 0xa7bd22ac, 0x5ca2ca99, 0xa7aaf094, 0x5c9170bf, 0xa798c1e5, - 0x5c801354, 0xa786969e, - 0x5c6eb258, 0xa7746ec0, 0x5c5d4dcc, 0xa7624a4d, 0x5c4be5b0, 0xa7502943, - 0x5c3a7a05, 0xa73e0ba5, - 0x5c290acc, 0xa72bf174, 0x5c179806, 0xa719daae, 0x5c0621b2, 0xa707c757, - 0x5bf4a7d2, 0xa6f5b76d, - 0x5be32a67, 0xa6e3aaf2, 0x5bd1a971, 0xa6d1a1e7, 0x5bc024f0, 0xa6bf9c4b, - 0x5bae9ce7, 0xa6ad9a21, - 0x5b9d1154, 0xa69b9b68, 0x5b8b8239, 0xa689a022, 0x5b79ef96, 0xa677a84e, - 0x5b68596d, 0xa665b3ee, - 0x5b56bfbd, 0xa653c303, 0x5b452288, 0xa641d58c, 0x5b3381ce, 0xa62feb8b, - 0x5b21dd90, 0xa61e0501, - 0x5b1035cf, 0xa60c21ee, 0x5afe8a8b, 0xa5fa4252, 0x5aecdbc5, 0xa5e8662f, - 0x5adb297d, 0xa5d68d85, - 0x5ac973b5, 0xa5c4b855, 0x5ab7ba6c, 0xa5b2e6a0, 0x5aa5fda5, 0xa5a11866, - 0x5a943d5e, 0xa58f4da8, - 0x5a82799a, 0xa57d8666, 0x5a70b258, 0xa56bc2a2, 0x5a5ee79a, 0xa55a025b, - 0x5a4d1960, 0xa5484594, - 0x5a3b47ab, 0xa5368c4b, 0x5a29727b, 0xa524d683, 0x5a1799d1, 0xa513243b, - 0x5a05bdae, 0xa5017575, - 0x59f3de12, 0xa4efca31, 0x59e1faff, 0xa4de2270, 0x59d01475, 0xa4cc7e32, - 0x59be2a74, 0xa4badd78, - 0x59ac3cfd, 0xa4a94043, 0x599a4c12, 0xa497a693, 0x598857b2, 0xa486106a, - 0x59765fde, 0xa4747dc7, - 0x59646498, 0xa462eeac, 0x595265df, 0xa4516319, 0x594063b5, 0xa43fdb10, - 0x592e5e19, 0xa42e568f, - 0x591c550e, 0xa41cd599, 0x590a4893, 0xa40b582e, 0x58f838a9, 0xa3f9de4e, - 0x58e62552, 0xa3e867fa, - 0x58d40e8c, 0xa3d6f534, 0x58c1f45b, 0xa3c585fb, 0x58afd6bd, 0xa3b41a50, - 0x589db5b3, 0xa3a2b234, - 0x588b9140, 0xa3914da8, 0x58796962, 0xa37fecac, 0x58673e1b, 0xa36e8f41, - 0x58550f6c, 0xa35d3567, - 0x5842dd54, 0xa34bdf20, 0x5830a7d6, 0xa33a8c6c, 0x581e6ef1, 0xa3293d4b, - 0x580c32a7, 0xa317f1bf, - 0x57f9f2f8, 0xa306a9c8, 0x57e7afe4, 0xa2f56566, 0x57d5696d, 0xa2e4249b, - 0x57c31f92, 0xa2d2e766, - 0x57b0d256, 0xa2c1adc9, 0x579e81b8, 0xa2b077c5, 0x578c2dba, 0xa29f4559, - 0x5779d65b, 0xa28e1687, - 0x57677b9d, 0xa27ceb4f, 0x57551d80, 0xa26bc3b2, 0x5742bc06, 0xa25a9fb1, - 0x5730572e, 0xa2497f4c, - 0x571deefa, 0xa2386284, 0x570b8369, 0xa2274959, 0x56f9147e, 0xa21633cd, - 0x56e6a239, 0xa20521e0, - 0x56d42c99, 0xa1f41392, 0x56c1b3a1, 0xa1e308e4, 0x56af3750, 0xa1d201d7, - 0x569cb7a8, 0xa1c0fe6c, - 0x568a34a9, 0xa1affea3, 0x5677ae54, 0xa19f027c, 0x566524aa, 0xa18e09fa, - 0x565297ab, 0xa17d151b, - 0x56400758, 0xa16c23e1, 0x562d73b2, 0xa15b364d, 0x561adcb9, 0xa14a4c5e, - 0x5608426e, 0xa1396617, - 0x55f5a4d2, 0xa1288376, 0x55e303e6, 0xa117a47e, 0x55d05faa, 0xa106c92f, - 0x55bdb81f, 0xa0f5f189, - 0x55ab0d46, 0xa0e51d8c, 0x55985f20, 0xa0d44d3b, 0x5585adad, 0xa0c38095, - 0x5572f8ed, 0xa0b2b79b, - 0x556040e2, 0xa0a1f24d, 0x554d858d, 0xa09130ad, 0x553ac6ee, 0xa08072ba, - 0x55280505, 0xa06fb876, - 0x55153fd4, 0xa05f01e1, 0x5502775c, 0xa04e4efc, 0x54efab9c, 0xa03d9fc8, - 0x54dcdc96, 0xa02cf444, - 0x54ca0a4b, 0xa01c4c73, 0x54b734ba, 0xa00ba853, 0x54a45be6, 0x9ffb07e7, - 0x54917fce, 0x9fea6b2f, - 0x547ea073, 0x9fd9d22a, 0x546bbdd7, 0x9fc93cdb, 0x5458d7f9, 0x9fb8ab41, - 0x5445eedb, 0x9fa81d5e, - 0x5433027d, 0x9f979331, 0x542012e1, 0x9f870cbc, 0x540d2005, 0x9f7689ff, - 0x53fa29ed, 0x9f660afb, - 0x53e73097, 0x9f558fb0, 0x53d43406, 0x9f45181f, 0x53c13439, 0x9f34a449, - 0x53ae3131, 0x9f24342f, - 0x539b2af0, 0x9f13c7d0, 0x53882175, 0x9f035f2e, 0x537514c2, 0x9ef2fa49, - 0x536204d7, 0x9ee29922, - 0x534ef1b5, 0x9ed23bb9, 0x533bdb5d, 0x9ec1e210, 0x5328c1d0, 0x9eb18c26, - 0x5315a50e, 0x9ea139fd, - 0x53028518, 0x9e90eb94, 0x52ef61ee, 0x9e80a0ee, 0x52dc3b92, 0x9e705a09, - 0x52c91204, 0x9e6016e8, - 0x52b5e546, 0x9e4fd78a, 0x52a2b556, 0x9e3f9bf0, 0x528f8238, 0x9e2f641b, - 0x527c4bea, 0x9e1f300b, - 0x5269126e, 0x9e0effc1, 0x5255d5c5, 0x9dfed33e, 0x524295f0, 0x9deeaa82, - 0x522f52ee, 0x9dde858e, - 0x521c0cc2, 0x9dce6463, 0x5208c36a, 0x9dbe4701, 0x51f576ea, 0x9dae2d68, - 0x51e22740, 0x9d9e179a, - 0x51ced46e, 0x9d8e0597, 0x51bb7e75, 0x9d7df75f, 0x51a82555, 0x9d6decf4, - 0x5194c910, 0x9d5de656, - 0x518169a5, 0x9d4de385, 0x516e0715, 0x9d3de482, 0x515aa162, 0x9d2de94d, - 0x5147388c, 0x9d1df1e9, - 0x5133cc94, 0x9d0dfe54, 0x51205d7b, 0x9cfe0e8f, 0x510ceb40, 0x9cee229c, - 0x50f975e6, 0x9cde3a7b, - 0x50e5fd6d, 0x9cce562c, 0x50d281d5, 0x9cbe75b0, 0x50bf031f, 0x9cae9907, - 0x50ab814d, 0x9c9ec033, - 0x5097fc5e, 0x9c8eeb34, 0x50847454, 0x9c7f1a0a, 0x5070e92f, 0x9c6f4cb6, - 0x505d5af1, 0x9c5f8339, - 0x5049c999, 0x9c4fbd93, 0x50363529, 0x9c3ffbc5, 0x50229da1, 0x9c303dcf, - 0x500f0302, 0x9c2083b3, - 0x4ffb654d, 0x9c10cd70, 0x4fe7c483, 0x9c011b08, 0x4fd420a4, 0x9bf16c7a, - 0x4fc079b1, 0x9be1c1c8, - 0x4faccfab, 0x9bd21af3, 0x4f992293, 0x9bc277fa, 0x4f857269, 0x9bb2d8de, - 0x4f71bf2e, 0x9ba33da0, - 0x4f5e08e3, 0x9b93a641, 0x4f4a4f89, 0x9b8412c1, 0x4f369320, 0x9b748320, - 0x4f22d3aa, 0x9b64f760, - 0x4f0f1126, 0x9b556f81, 0x4efb4b96, 0x9b45eb83, 0x4ee782fb, 0x9b366b68, - 0x4ed3b755, 0x9b26ef2f, - 0x4ebfe8a5, 0x9b1776da, 0x4eac16eb, 0x9b080268, 0x4e984229, 0x9af891db, - 0x4e846a60, 0x9ae92533, - 0x4e708f8f, 0x9ad9bc71, 0x4e5cb1b9, 0x9aca5795, 0x4e48d0dd, 0x9abaf6a1, - 0x4e34ecfc, 0x9aab9993, - 0x4e210617, 0x9a9c406e, 0x4e0d1c30, 0x9a8ceb31, 0x4df92f46, 0x9a7d99de, - 0x4de53f5a, 0x9a6e4c74, - 0x4dd14c6e, 0x9a5f02f5, 0x4dbd5682, 0x9a4fbd61, 0x4da95d96, 0x9a407bb9, - 0x4d9561ac, 0x9a313dfc, - 0x4d8162c4, 0x9a22042d, 0x4d6d60df, 0x9a12ce4b, 0x4d595bfe, 0x9a039c57, - 0x4d455422, 0x99f46e51, - 0x4d31494b, 0x99e5443b, 0x4d1d3b7a, 0x99d61e14, 0x4d092ab0, 0x99c6fbde, - 0x4cf516ee, 0x99b7dd99, - 0x4ce10034, 0x99a8c345, 0x4ccce684, 0x9999ace3, 0x4cb8c9dd, 0x998a9a74, - 0x4ca4aa41, 0x997b8bf8, - 0x4c9087b1, 0x996c816f, 0x4c7c622d, 0x995d7adc, 0x4c6839b7, 0x994e783d, - 0x4c540e4e, 0x993f7993, - 0x4c3fdff4, 0x99307ee0, 0x4c2baea9, 0x99218824, 0x4c177a6e, 0x9912955f, - 0x4c034345, 0x9903a691, - 0x4bef092d, 0x98f4bbbc, 0x4bdacc28, 0x98e5d4e0, 0x4bc68c36, 0x98d6f1fe, - 0x4bb24958, 0x98c81316, - 0x4b9e0390, 0x98b93828, 0x4b89badd, 0x98aa6136, 0x4b756f40, 0x989b8e40, - 0x4b6120bb, 0x988cbf46, - 0x4b4ccf4d, 0x987df449, 0x4b387af9, 0x986f2d4a, 0x4b2423be, 0x98606a49, - 0x4b0fc99d, 0x9851ab46, - 0x4afb6c98, 0x9842f043, 0x4ae70caf, 0x98343940, 0x4ad2a9e2, 0x9825863d, - 0x4abe4433, 0x9816d73b, - 0x4aa9dba2, 0x98082c3b, 0x4a957030, 0x97f9853d, 0x4a8101de, 0x97eae242, - 0x4a6c90ad, 0x97dc4349, - 0x4a581c9e, 0x97cda855, 0x4a43a5b0, 0x97bf1165, 0x4a2f2be6, 0x97b07e7a, - 0x4a1aaf3f, 0x97a1ef94, - 0x4a062fbd, 0x979364b5, 0x49f1ad61, 0x9784dddc, 0x49dd282a, 0x97765b0a, - 0x49c8a01b, 0x9767dc41, - 0x49b41533, 0x9759617f, 0x499f8774, 0x974aeac6, 0x498af6df, 0x973c7817, - 0x49766373, 0x972e0971, - 0x4961cd33, 0x971f9ed7, 0x494d341e, 0x97113847, 0x49389836, 0x9702d5c3, - 0x4923f97b, 0x96f4774b, - 0x490f57ee, 0x96e61ce0, 0x48fab391, 0x96d7c682, 0x48e60c62, 0x96c97432, - 0x48d16265, 0x96bb25f0, - 0x48bcb599, 0x96acdbbe, 0x48a805ff, 0x969e959b, 0x48935397, 0x96905388, - 0x487e9e64, 0x96821585, - 0x4869e665, 0x9673db94, 0x48552b9b, 0x9665a5b4, 0x48406e08, 0x965773e7, - 0x482badab, 0x9649462d, - 0x4816ea86, 0x963b1c86, 0x48022499, 0x962cf6f2, 0x47ed5be6, 0x961ed574, - 0x47d8906d, 0x9610b80a, - 0x47c3c22f, 0x96029eb6, 0x47aef12c, 0x95f48977, 0x479a1d67, 0x95e67850, - 0x478546de, 0x95d86b3f, - 0x47706d93, 0x95ca6247, 0x475b9188, 0x95bc5d66, 0x4746b2bc, 0x95ae5c9f, - 0x4731d131, 0x95a05ff0, - 0x471cece7, 0x9592675c, 0x470805df, 0x958472e2, 0x46f31c1a, 0x95768283, - 0x46de2f99, 0x9568963f, - 0x46c9405c, 0x955aae17, 0x46b44e65, 0x954cca0c, 0x469f59b4, 0x953eea1e, - 0x468a624a, 0x95310e4e, - 0x46756828, 0x9523369c, 0x46606b4e, 0x95156308, 0x464b6bbe, 0x95079394, - 0x46366978, 0x94f9c83f, - 0x4621647d, 0x94ec010b, 0x460c5cce, 0x94de3df8, 0x45f7526b, 0x94d07f05, - 0x45e24556, 0x94c2c435, - 0x45cd358f, 0x94b50d87, 0x45b82318, 0x94a75afd, 0x45a30df0, 0x9499ac95, - 0x458df619, 0x948c0252, - 0x4578db93, 0x947e5c33, 0x4563be60, 0x9470ba39, 0x454e9e80, 0x94631c65, - 0x45397bf4, 0x945582b7, - 0x452456bd, 0x9447ed2f, 0x450f2edb, 0x943a5bcf, 0x44fa0450, 0x942cce96, - 0x44e4d71c, 0x941f4585, - 0x44cfa740, 0x9411c09e, 0x44ba74bd, 0x94043fdf, 0x44a53f93, 0x93f6c34a, - 0x449007c4, 0x93e94adf, - 0x447acd50, 0x93dbd6a0, 0x44659039, 0x93ce668b, 0x4450507e, 0x93c0faa3, - 0x443b0e21, 0x93b392e6, - 0x4425c923, 0x93a62f57, 0x44108184, 0x9398cff5, 0x43fb3746, 0x938b74c1, - 0x43e5ea68, 0x937e1dbb, - 0x43d09aed, 0x9370cae4, 0x43bb48d4, 0x93637c3d, 0x43a5f41e, 0x935631c5, - 0x43909ccd, 0x9348eb7e, - 0x437b42e1, 0x933ba968, 0x4365e65b, 0x932e6b84, 0x4350873c, 0x932131d1, - 0x433b2585, 0x9313fc51, - 0x4325c135, 0x9306cb04, 0x43105a50, 0x92f99deb, 0x42faf0d4, 0x92ec7505, - 0x42e584c3, 0x92df5054, - 0x42d0161e, 0x92d22fd9, 0x42baa4e6, 0x92c51392, 0x42a5311b, 0x92b7fb82, - 0x428fbabe, 0x92aae7a8, - 0x427a41d0, 0x929dd806, 0x4264c653, 0x9290cc9b, 0x424f4845, 0x9283c568, - 0x4239c7aa, 0x9276c26d, - 0x42244481, 0x9269c3ac, 0x420ebecb, 0x925cc924, 0x41f93689, 0x924fd2d7, - 0x41e3abbc, 0x9242e0c4, - 0x41ce1e65, 0x9235f2ec, 0x41b88e84, 0x9229094f, 0x41a2fc1a, 0x921c23ef, - 0x418d6729, 0x920f42cb, - 0x4177cfb1, 0x920265e4, 0x416235b2, 0x91f58d3b, 0x414c992f, 0x91e8b8d0, - 0x4136fa27, 0x91dbe8a4, - 0x4121589b, 0x91cf1cb6, 0x410bb48c, 0x91c25508, 0x40f60dfb, 0x91b5919a, - 0x40e064ea, 0x91a8d26d, - 0x40cab958, 0x919c1781, 0x40b50b46, 0x918f60d6, 0x409f5ab6, 0x9182ae6d, - 0x4089a7a8, 0x91760047, - 0x4073f21d, 0x91695663, 0x405e3a16, 0x915cb0c3, 0x40487f94, 0x91500f67, - 0x4032c297, 0x91437250, - 0x401d0321, 0x9136d97d, 0x40074132, 0x912a44f0, 0x3ff17cca, 0x911db4a9, - 0x3fdbb5ec, 0x911128a8, - 0x3fc5ec98, 0x9104a0ee, 0x3fb020ce, 0x90f81d7b, 0x3f9a5290, 0x90eb9e50, - 0x3f8481dd, 0x90df236e, - 0x3f6eaeb8, 0x90d2acd4, 0x3f58d921, 0x90c63a83, 0x3f430119, 0x90b9cc7d, - 0x3f2d26a0, 0x90ad62c0, - 0x3f1749b8, 0x90a0fd4e, 0x3f016a61, 0x90949c28, 0x3eeb889c, 0x90883f4d, - 0x3ed5a46b, 0x907be6be, - 0x3ebfbdcd, 0x906f927c, 0x3ea9d4c3, 0x90634287, 0x3e93e950, 0x9056f6df, - 0x3e7dfb73, 0x904aaf86, - 0x3e680b2c, 0x903e6c7b, 0x3e52187f, 0x90322dbf, 0x3e3c2369, 0x9025f352, - 0x3e262bee, 0x9019bd36, - 0x3e10320d, 0x900d8b69, 0x3dfa35c8, 0x90015dee, 0x3de4371f, 0x8ff534c4, - 0x3dce3614, 0x8fe90fec, - 0x3db832a6, 0x8fdcef66, 0x3da22cd7, 0x8fd0d333, 0x3d8c24a8, 0x8fc4bb53, - 0x3d761a19, 0x8fb8a7c7, - 0x3d600d2c, 0x8fac988f, 0x3d49fde1, 0x8fa08dab, 0x3d33ec39, 0x8f94871d, - 0x3d1dd835, 0x8f8884e4, - 0x3d07c1d6, 0x8f7c8701, 0x3cf1a91c, 0x8f708d75, 0x3cdb8e09, 0x8f649840, - 0x3cc5709e, 0x8f58a761, - 0x3caf50da, 0x8f4cbadb, 0x3c992ec0, 0x8f40d2ad, 0x3c830a50, 0x8f34eed8, - 0x3c6ce38a, 0x8f290f5c, - 0x3c56ba70, 0x8f1d343a, 0x3c408f03, 0x8f115d72, 0x3c2a6142, 0x8f058b04, - 0x3c143130, 0x8ef9bcf2, - 0x3bfdfecd, 0x8eedf33b, 0x3be7ca1a, 0x8ee22de0, 0x3bd19318, 0x8ed66ce1, - 0x3bbb59c7, 0x8ecab040, - 0x3ba51e29, 0x8ebef7fb, 0x3b8ee03e, 0x8eb34415, 0x3b78a007, 0x8ea7948c, - 0x3b625d86, 0x8e9be963, - 0x3b4c18ba, 0x8e904298, 0x3b35d1a5, 0x8e84a02d, 0x3b1f8848, 0x8e790222, - 0x3b093ca3, 0x8e6d6877, - 0x3af2eeb7, 0x8e61d32e, 0x3adc9e86, 0x8e564246, 0x3ac64c0f, 0x8e4ab5bf, - 0x3aaff755, 0x8e3f2d9b, - 0x3a99a057, 0x8e33a9da, 0x3a834717, 0x8e282a7b, 0x3a6ceb96, 0x8e1caf80, - 0x3a568dd4, 0x8e1138ea, - 0x3a402dd2, 0x8e05c6b7, 0x3a29cb91, 0x8dfa58ea, 0x3a136712, 0x8deeef82, - 0x39fd0056, 0x8de38a80, - 0x39e6975e, 0x8dd829e4, 0x39d02c2a, 0x8dcccdaf, 0x39b9bebc, 0x8dc175e0, - 0x39a34f13, 0x8db6227a, - 0x398cdd32, 0x8daad37b, 0x39766919, 0x8d9f88e5, 0x395ff2c9, 0x8d9442b8, - 0x39497a43, 0x8d8900f3, - 0x3932ff87, 0x8d7dc399, 0x391c8297, 0x8d728aa9, 0x39060373, 0x8d675623, - 0x38ef821c, 0x8d5c2609, - 0x38d8fe93, 0x8d50fa59, 0x38c278d9, 0x8d45d316, 0x38abf0ef, 0x8d3ab03f, - 0x389566d6, 0x8d2f91d5, - 0x387eda8e, 0x8d2477d8, 0x38684c19, 0x8d196249, 0x3851bb77, 0x8d0e5127, - 0x383b28a9, 0x8d034474, - 0x382493b0, 0x8cf83c30, 0x380dfc8d, 0x8ced385b, 0x37f76341, 0x8ce238f6, - 0x37e0c7cc, 0x8cd73e01, - 0x37ca2a30, 0x8ccc477d, 0x37b38a6d, 0x8cc1556a, 0x379ce885, 0x8cb667c8, - 0x37864477, 0x8cab7e98, - 0x376f9e46, 0x8ca099da, 0x3758f5f2, 0x8c95b98f, 0x37424b7b, 0x8c8addb7, - 0x372b9ee3, 0x8c800652, - 0x3714f02a, 0x8c753362, 0x36fe3f52, 0x8c6a64e5, 0x36e78c5b, 0x8c5f9ade, - 0x36d0d746, 0x8c54d54c, - 0x36ba2014, 0x8c4a142f, 0x36a366c6, 0x8c3f5788, 0x368cab5c, 0x8c349f58, - 0x3675edd9, 0x8c29eb9f, - 0x365f2e3b, 0x8c1f3c5d, 0x36486c86, 0x8c149192, 0x3631a8b8, 0x8c09eb40, - 0x361ae2d3, 0x8bff4966, - 0x36041ad9, 0x8bf4ac05, 0x35ed50c9, 0x8bea131e, 0x35d684a6, 0x8bdf7eb0, - 0x35bfb66e, 0x8bd4eebc, - 0x35a8e625, 0x8bca6343, 0x359213c9, 0x8bbfdc44, 0x357b3f5d, 0x8bb559c1, - 0x356468e2, 0x8baadbba, - 0x354d9057, 0x8ba0622f, 0x3536b5be, 0x8b95ed21, 0x351fd918, 0x8b8b7c8f, - 0x3508fa66, 0x8b81107b, - 0x34f219a8, 0x8b76a8e4, 0x34db36df, 0x8b6c45cc, 0x34c4520d, 0x8b61e733, - 0x34ad6b32, 0x8b578d18, - 0x34968250, 0x8b4d377c, 0x347f9766, 0x8b42e661, 0x3468aa76, 0x8b3899c6, - 0x3451bb81, 0x8b2e51ab, - 0x343aca87, 0x8b240e11, 0x3423d78a, 0x8b19cef8, 0x340ce28b, 0x8b0f9462, - 0x33f5eb89, 0x8b055e4d, - 0x33def287, 0x8afb2cbb, 0x33c7f785, 0x8af0ffac, 0x33b0fa84, 0x8ae6d720, - 0x3399fb85, 0x8adcb318, - 0x3382fa88, 0x8ad29394, 0x336bf78f, 0x8ac87894, 0x3354f29b, 0x8abe6219, - 0x333debab, 0x8ab45024, - 0x3326e2c3, 0x8aaa42b4, 0x330fd7e1, 0x8aa039cb, 0x32f8cb07, 0x8a963567, - 0x32e1bc36, 0x8a8c358b, - 0x32caab6f, 0x8a823a36, 0x32b398b3, 0x8a784368, 0x329c8402, 0x8a6e5123, - 0x32856d5e, 0x8a646365, - 0x326e54c7, 0x8a5a7a31, 0x32573a3f, 0x8a509585, 0x32401dc6, 0x8a46b564, - 0x3228ff5c, 0x8a3cd9cc, - 0x3211df04, 0x8a3302be, 0x31fabcbd, 0x8a29303b, 0x31e39889, 0x8a1f6243, - 0x31cc7269, 0x8a1598d6, - 0x31b54a5e, 0x8a0bd3f5, 0x319e2067, 0x8a0213a0, 0x3186f487, 0x89f857d8, - 0x316fc6be, 0x89eea09d, - 0x3158970e, 0x89e4edef, 0x31416576, 0x89db3fcf, 0x312a31f8, 0x89d1963c, - 0x3112fc95, 0x89c7f138, - 0x30fbc54d, 0x89be50c3, 0x30e48c22, 0x89b4b4dd, 0x30cd5115, 0x89ab1d87, - 0x30b61426, 0x89a18ac0, - 0x309ed556, 0x8997fc8a, 0x308794a6, 0x898e72e4, 0x30705217, 0x8984edcf, - 0x30590dab, 0x897b6d4c, - 0x3041c761, 0x8971f15a, 0x302a7f3a, 0x896879fb, 0x30133539, 0x895f072e, - 0x2ffbe95d, 0x895598f3, - 0x2fe49ba7, 0x894c2f4c, 0x2fcd4c19, 0x8942ca39, 0x2fb5fab2, 0x893969b9, - 0x2f9ea775, 0x89300dce, - 0x2f875262, 0x8926b677, 0x2f6ffb7a, 0x891d63b5, 0x2f58a2be, 0x89141589, - 0x2f41482e, 0x890acbf2, - 0x2f29ebcc, 0x890186f2, 0x2f128d99, 0x88f84687, 0x2efb2d95, 0x88ef0ab4, - 0x2ee3cbc1, 0x88e5d378, - 0x2ecc681e, 0x88dca0d3, 0x2eb502ae, 0x88d372c6, 0x2e9d9b70, 0x88ca4951, - 0x2e863267, 0x88c12475, - 0x2e6ec792, 0x88b80432, 0x2e575af3, 0x88aee888, 0x2e3fec8b, 0x88a5d177, - 0x2e287c5a, 0x889cbf01, - 0x2e110a62, 0x8893b125, 0x2df996a3, 0x888aa7e3, 0x2de2211e, 0x8881a33d, - 0x2dcaa9d5, 0x8878a332, - 0x2db330c7, 0x886fa7c2, 0x2d9bb5f6, 0x8866b0ef, 0x2d843964, 0x885dbeb8, - 0x2d6cbb10, 0x8854d11e, - 0x2d553afc, 0x884be821, 0x2d3db928, 0x884303c1, 0x2d263596, 0x883a23ff, - 0x2d0eb046, 0x883148db, - 0x2cf72939, 0x88287256, 0x2cdfa071, 0x881fa06f, 0x2cc815ee, 0x8816d327, - 0x2cb089b1, 0x880e0a7f, - 0x2c98fbba, 0x88054677, 0x2c816c0c, 0x87fc870f, 0x2c69daa6, 0x87f3cc48, - 0x2c52478a, 0x87eb1621, - 0x2c3ab2b9, 0x87e2649b, 0x2c231c33, 0x87d9b7b7, 0x2c0b83fa, 0x87d10f75, - 0x2bf3ea0d, 0x87c86bd5, - 0x2bdc4e6f, 0x87bfccd7, 0x2bc4b120, 0x87b7327d, 0x2bad1221, 0x87ae9cc5, - 0x2b957173, 0x87a60bb1, - 0x2b7dcf17, 0x879d7f41, 0x2b662b0e, 0x8794f774, 0x2b4e8558, 0x878c744d, - 0x2b36ddf7, 0x8783f5ca, - 0x2b1f34eb, 0x877b7bec, 0x2b078a36, 0x877306b4, 0x2aefddd8, 0x876a9621, - 0x2ad82fd2, 0x87622a35, - 0x2ac08026, 0x8759c2ef, 0x2aa8ced3, 0x87516050, 0x2a911bdc, 0x87490258, - 0x2a796740, 0x8740a907, - 0x2a61b101, 0x8738545e, 0x2a49f920, 0x8730045d, 0x2a323f9e, 0x8727b905, - 0x2a1a847b, 0x871f7255, - 0x2a02c7b8, 0x8717304e, 0x29eb0957, 0x870ef2f1, 0x29d34958, 0x8706ba3d, - 0x29bb87bc, 0x86fe8633, - 0x29a3c485, 0x86f656d3, 0x298bffb2, 0x86ee2c1e, 0x29743946, 0x86e60614, - 0x295c7140, 0x86dde4b5, - 0x2944a7a2, 0x86d5c802, 0x292cdc6d, 0x86cdaffa, 0x29150fa1, 0x86c59c9f, - 0x28fd4140, 0x86bd8df0, - 0x28e5714b, 0x86b583ee, 0x28cd9fc1, 0x86ad7e99, 0x28b5cca5, 0x86a57df2, - 0x289df7f8, 0x869d81f8, - 0x288621b9, 0x86958aac, 0x286e49ea, 0x868d980e, 0x2856708d, 0x8685aa20, - 0x283e95a1, 0x867dc0e0, - 0x2826b928, 0x8675dc4f, 0x280edb23, 0x866dfc6e, 0x27f6fb92, 0x8666213c, - 0x27df1a77, 0x865e4abb, - 0x27c737d3, 0x865678eb, 0x27af53a6, 0x864eabcb, 0x27976df1, 0x8646e35c, - 0x277f86b5, 0x863f1f9e, - 0x27679df4, 0x86376092, 0x274fb3ae, 0x862fa638, 0x2737c7e3, 0x8627f091, - 0x271fda96, 0x86203f9c, - 0x2707ebc7, 0x86189359, 0x26effb76, 0x8610ebca, 0x26d809a5, 0x860948ef, - 0x26c01655, 0x8601aac7, - 0x26a82186, 0x85fa1153, 0x26902b39, 0x85f27c93, 0x26783370, 0x85eaec88, - 0x26603a2c, 0x85e36132, - 0x26483f6c, 0x85dbda91, 0x26304333, 0x85d458a6, 0x26184581, 0x85ccdb70, - 0x26004657, 0x85c562f1, - 0x25e845b6, 0x85bdef28, 0x25d0439f, 0x85b68015, 0x25b84012, 0x85af15b9, - 0x25a03b11, 0x85a7b015, - 0x2588349d, 0x85a04f28, 0x25702cb7, 0x8598f2f3, 0x2558235f, 0x85919b76, - 0x25401896, 0x858a48b1, - 0x25280c5e, 0x8582faa5, 0x250ffeb7, 0x857bb152, 0x24f7efa2, 0x85746cb8, - 0x24dfdf20, 0x856d2cd7, - 0x24c7cd33, 0x8565f1b0, 0x24afb9da, 0x855ebb44, 0x2497a517, 0x85578991, - 0x247f8eec, 0x85505c99, - 0x24677758, 0x8549345c, 0x244f5e5c, 0x854210db, 0x243743fa, 0x853af214, - 0x241f2833, 0x8533d809, - 0x24070b08, 0x852cc2bb, 0x23eeec78, 0x8525b228, 0x23d6cc87, 0x851ea652, - 0x23beab33, 0x85179f39, - 0x23a6887f, 0x85109cdd, 0x238e646a, 0x85099f3e, 0x23763ef7, 0x8502a65c, - 0x235e1826, 0x84fbb239, - 0x2345eff8, 0x84f4c2d4, 0x232dc66d, 0x84edd82d, 0x23159b88, 0x84e6f244, - 0x22fd6f48, 0x84e0111b, - 0x22e541af, 0x84d934b1, 0x22cd12bd, 0x84d25d06, 0x22b4e274, 0x84cb8a1b, - 0x229cb0d5, 0x84c4bbf0, - 0x22847de0, 0x84bdf286, 0x226c4996, 0x84b72ddb, 0x225413f8, 0x84b06df2, - 0x223bdd08, 0x84a9b2ca, - 0x2223a4c5, 0x84a2fc62, 0x220b6b32, 0x849c4abd, 0x21f3304f, 0x84959dd9, - 0x21daf41d, 0x848ef5b7, - 0x21c2b69c, 0x84885258, 0x21aa77cf, 0x8481b3bb, 0x219237b5, 0x847b19e1, - 0x2179f64f, 0x847484ca, - 0x2161b3a0, 0x846df477, 0x21496fa7, 0x846768e7, 0x21312a65, 0x8460e21a, - 0x2118e3dc, 0x845a6012, - 0x21009c0c, 0x8453e2cf, 0x20e852f6, 0x844d6a50, 0x20d0089c, 0x8446f695, - 0x20b7bcfe, 0x844087a0, - 0x209f701c, 0x843a1d70, 0x208721f9, 0x8433b806, 0x206ed295, 0x842d5762, - 0x205681f1, 0x8426fb84, - 0x203e300d, 0x8420a46c, 0x2025dcec, 0x841a521a, 0x200d888d, 0x84140490, - 0x1ff532f2, 0x840dbbcc, - 0x1fdcdc1b, 0x840777d0, 0x1fc4840a, 0x8401389b, 0x1fac2abf, 0x83fafe2e, - 0x1f93d03c, 0x83f4c889, - 0x1f7b7481, 0x83ee97ad, 0x1f63178f, 0x83e86b99, 0x1f4ab968, 0x83e2444d, - 0x1f325a0b, 0x83dc21cb, - 0x1f19f97b, 0x83d60412, 0x1f0197b8, 0x83cfeb22, 0x1ee934c3, 0x83c9d6fc, - 0x1ed0d09d, 0x83c3c7a0, - 0x1eb86b46, 0x83bdbd0e, 0x1ea004c1, 0x83b7b746, 0x1e879d0d, 0x83b1b649, - 0x1e6f342c, 0x83abba17, - 0x1e56ca1e, 0x83a5c2b0, 0x1e3e5ee5, 0x839fd014, 0x1e25f282, 0x8399e244, - 0x1e0d84f5, 0x8393f940, - 0x1df5163f, 0x838e1507, 0x1ddca662, 0x8388359b, 0x1dc4355e, 0x83825afb, - 0x1dabc334, 0x837c8528, - 0x1d934fe5, 0x8376b422, 0x1d7adb73, 0x8370e7e9, 0x1d6265dd, 0x836b207d, - 0x1d49ef26, 0x83655ddf, - 0x1d31774d, 0x835fa00f, 0x1d18fe54, 0x8359e70d, 0x1d00843d, 0x835432d8, - 0x1ce80906, 0x834e8373, - 0x1ccf8cb3, 0x8348d8dc, 0x1cb70f43, 0x83433314, 0x1c9e90b8, 0x833d921b, - 0x1c861113, 0x8337f5f1, - 0x1c6d9053, 0x83325e97, 0x1c550e7c, 0x832ccc0d, 0x1c3c8b8c, 0x83273e52, - 0x1c240786, 0x8321b568, - 0x1c0b826a, 0x831c314e, 0x1bf2fc3a, 0x8316b205, 0x1bda74f6, 0x8311378d, - 0x1bc1ec9e, 0x830bc1e6, - 0x1ba96335, 0x83065110, 0x1b90d8bb, 0x8300e50b, 0x1b784d30, 0x82fb7dd8, - 0x1b5fc097, 0x82f61b77, - 0x1b4732ef, 0x82f0bde8, 0x1b2ea43a, 0x82eb652b, 0x1b161479, 0x82e61141, - 0x1afd83ad, 0x82e0c22a, - 0x1ae4f1d6, 0x82db77e5, 0x1acc5ef6, 0x82d63274, 0x1ab3cb0d, 0x82d0f1d5, - 0x1a9b361d, 0x82cbb60b, - 0x1a82a026, 0x82c67f14, 0x1a6a0929, 0x82c14cf1, 0x1a517128, 0x82bc1fa2, - 0x1a38d823, 0x82b6f727, - 0x1a203e1b, 0x82b1d381, 0x1a07a311, 0x82acb4b0, 0x19ef0707, 0x82a79ab3, - 0x19d669fc, 0x82a2858c, - 0x19bdcbf3, 0x829d753a, 0x19a52ceb, 0x829869be, 0x198c8ce7, 0x82936317, - 0x1973ebe6, 0x828e6146, - 0x195b49ea, 0x8289644b, 0x1942a6f3, 0x82846c26, 0x192a0304, 0x827f78d8, - 0x19115e1c, 0x827a8a61, - 0x18f8b83c, 0x8275a0c0, 0x18e01167, 0x8270bbf7, 0x18c7699b, 0x826bdc04, - 0x18aec0db, 0x826700e9, - 0x18961728, 0x82622aa6, 0x187d6c82, 0x825d593a, 0x1864c0ea, 0x82588ca7, - 0x184c1461, 0x8253c4eb, - 0x183366e9, 0x824f0208, 0x181ab881, 0x824a43fe, 0x1802092c, 0x82458acc, - 0x17e958ea, 0x8240d673, - 0x17d0a7bc, 0x823c26f3, 0x17b7f5a3, 0x82377c4c, 0x179f429f, 0x8232d67f, - 0x17868eb3, 0x822e358b, - 0x176dd9de, 0x82299971, 0x17552422, 0x82250232, 0x173c6d80, 0x82206fcc, - 0x1723b5f9, 0x821be240, - 0x170afd8d, 0x82175990, 0x16f2443e, 0x8212d5b9, 0x16d98a0c, 0x820e56be, - 0x16c0cef9, 0x8209dc9e, - 0x16a81305, 0x82056758, 0x168f5632, 0x8200f6ef, 0x1676987f, 0x81fc8b60, - 0x165dd9f0, 0x81f824ae, - 0x16451a83, 0x81f3c2d7, 0x162c5a3b, 0x81ef65dc, 0x16139918, 0x81eb0dbe, - 0x15fad71b, 0x81e6ba7c, - 0x15e21445, 0x81e26c16, 0x15c95097, 0x81de228d, 0x15b08c12, 0x81d9dde1, - 0x1597c6b7, 0x81d59e13, - 0x157f0086, 0x81d16321, 0x15663982, 0x81cd2d0c, 0x154d71aa, 0x81c8fbd6, - 0x1534a901, 0x81c4cf7d, - 0x151bdf86, 0x81c0a801, 0x1503153a, 0x81bc8564, 0x14ea4a1f, 0x81b867a5, - 0x14d17e36, 0x81b44ec4, - 0x14b8b17f, 0x81b03ac2, 0x149fe3fc, 0x81ac2b9e, 0x148715ae, 0x81a82159, - 0x146e4694, 0x81a41bf4, - 0x145576b1, 0x81a01b6d, 0x143ca605, 0x819c1fc5, 0x1423d492, 0x819828fd, - 0x140b0258, 0x81943715, - 0x13f22f58, 0x81904a0c, 0x13d95b93, 0x818c61e3, 0x13c0870a, 0x81887e9a, - 0x13a7b1bf, 0x8184a032, - 0x138edbb1, 0x8180c6a9, 0x137604e2, 0x817cf201, 0x135d2d53, 0x8179223a, - 0x13445505, 0x81755754, - 0x132b7bf9, 0x8171914e, 0x1312a230, 0x816dd02a, 0x12f9c7aa, 0x816a13e6, - 0x12e0ec6a, 0x81665c84, - 0x12c8106f, 0x8162aa04, 0x12af33ba, 0x815efc65, 0x1296564d, 0x815b53a8, - 0x127d7829, 0x8157afcd, - 0x1264994e, 0x815410d4, 0x124bb9be, 0x815076bd, 0x1232d979, 0x814ce188, - 0x1219f880, 0x81495136, - 0x120116d5, 0x8145c5c7, 0x11e83478, 0x81423f3a, 0x11cf516a, 0x813ebd90, - 0x11b66dad, 0x813b40ca, - 0x119d8941, 0x8137c8e6, 0x1184a427, 0x813455e6, 0x116bbe60, 0x8130e7c9, - 0x1152d7ed, 0x812d7e8f, - 0x1139f0cf, 0x812a1a3a, 0x11210907, 0x8126bac8, 0x11082096, 0x8123603a, - 0x10ef377d, 0x81200a90, - 0x10d64dbd, 0x811cb9ca, 0x10bd6356, 0x81196de9, 0x10a4784b, 0x811626ec, - 0x108b8c9b, 0x8112e4d4, - 0x1072a048, 0x810fa7a0, 0x1059b352, 0x810c6f52, 0x1040c5bb, 0x81093be8, - 0x1027d784, 0x81060d63, - 0x100ee8ad, 0x8102e3c4, 0xff5f938, 0x80ffbf0a, 0xfdd0926, 0x80fc9f35, - 0xfc41876, 0x80f98446, - 0xfab272b, 0x80f66e3c, 0xf923546, 0x80f35d19, 0xf7942c7, 0x80f050db, - 0xf604faf, 0x80ed4984, - 0xf475bff, 0x80ea4712, 0xf2e67b8, 0x80e74987, 0xf1572dc, 0x80e450e2, - 0xefc7d6b, 0x80e15d24, - 0xee38766, 0x80de6e4c, 0xeca90ce, 0x80db845b, 0xeb199a4, 0x80d89f51, - 0xe98a1e9, 0x80d5bf2e, - 0xe7fa99e, 0x80d2e3f2, 0xe66b0c3, 0x80d00d9d, 0xe4db75b, 0x80cd3c2f, - 0xe34bd66, 0x80ca6fa9, - 0xe1bc2e4, 0x80c7a80a, 0xe02c7d7, 0x80c4e553, 0xde9cc40, 0x80c22784, - 0xdd0d01f, 0x80bf6e9c, - 0xdb7d376, 0x80bcba9d, 0xd9ed646, 0x80ba0b85, 0xd85d88f, 0x80b76156, - 0xd6cda53, 0x80b4bc0e, - 0xd53db92, 0x80b21baf, 0xd3adc4e, 0x80af8039, 0xd21dc87, 0x80ace9ab, - 0xd08dc3f, 0x80aa5806, - 0xcefdb76, 0x80a7cb49, 0xcd6da2d, 0x80a54376, 0xcbdd865, 0x80a2c08b, - 0xca4d620, 0x80a04289, - 0xc8bd35e, 0x809dc971, 0xc72d020, 0x809b5541, 0xc59cc68, 0x8098e5fb, - 0xc40c835, 0x80967b9f, - 0xc27c389, 0x8094162c, 0xc0ebe66, 0x8091b5a2, 0xbf5b8cb, 0x808f5a02, - 0xbdcb2bb, 0x808d034c, - 0xbc3ac35, 0x808ab180, 0xbaaa53b, 0x8088649e, 0xb919dcf, 0x80861ca6, - 0xb7895f0, 0x8083d998, - 0xb5f8d9f, 0x80819b74, 0xb4684df, 0x807f623b, 0xb2d7baf, 0x807d2dec, - 0xb147211, 0x807afe87, - 0xafb6805, 0x8078d40d, 0xae25d8d, 0x8076ae7e, 0xac952aa, 0x80748dd9, - 0xab0475c, 0x8072721f, - 0xa973ba5, 0x80705b50, 0xa7e2f85, 0x806e496c, 0xa6522fe, 0x806c3c74, - 0xa4c1610, 0x806a3466, - 0xa3308bd, 0x80683143, 0xa19fb04, 0x8066330c, 0xa00ece8, 0x806439c0, - 0x9e7de6a, 0x80624560, - 0x9cecf89, 0x806055eb, 0x9b5c048, 0x805e6b62, 0x99cb0a7, 0x805c85c4, - 0x983a0a7, 0x805aa512, - 0x96a9049, 0x8058c94c, 0x9517f8f, 0x8056f272, 0x9386e78, 0x80552084, - 0x91f5d06, 0x80535381, - 0x9064b3a, 0x80518b6b, 0x8ed3916, 0x804fc841, 0x8d42699, 0x804e0a04, - 0x8bb13c5, 0x804c50b2, - 0x8a2009a, 0x804a9c4d, 0x888ed1b, 0x8048ecd5, 0x86fd947, 0x80474248, - 0x856c520, 0x80459ca9, - 0x83db0a7, 0x8043fbf6, 0x8249bdd, 0x80426030, 0x80b86c2, 0x8040c956, - 0x7f27157, 0x803f376a, - 0x7d95b9e, 0x803daa6a, 0x7c04598, 0x803c2257, 0x7a72f45, 0x803a9f31, - 0x78e18a7, 0x803920f8, - 0x77501be, 0x8037a7ac, 0x75bea8c, 0x8036334e, 0x742d311, 0x8034c3dd, - 0x729bb4e, 0x80335959, - 0x710a345, 0x8031f3c2, 0x6f78af6, 0x80309318, 0x6de7262, 0x802f375d, - 0x6c5598a, 0x802de08e, - 0x6ac406f, 0x802c8ead, 0x6932713, 0x802b41ba, 0x67a0d76, 0x8029f9b4, - 0x660f398, 0x8028b69c, - 0x647d97c, 0x80277872, 0x62ebf22, 0x80263f36, 0x615a48b, 0x80250ae7, - 0x5fc89b8, 0x8023db86, - 0x5e36ea9, 0x8022b114, 0x5ca5361, 0x80218b8f, 0x5b137df, 0x80206af8, - 0x5981c26, 0x801f4f4f, - 0x57f0035, 0x801e3895, 0x565e40d, 0x801d26c8, 0x54cc7b1, 0x801c19ea, - 0x533ab20, 0x801b11fa, - 0x51a8e5c, 0x801a0ef8, 0x5017165, 0x801910e4, 0x4e8543e, 0x801817bf, - 0x4cf36e5, 0x80172388, - 0x4b6195d, 0x80163440, 0x49cfba7, 0x801549e6, 0x483ddc3, 0x8014647b, - 0x46abfb3, 0x801383fe, - 0x451a177, 0x8012a86f, 0x4388310, 0x8011d1d0, 0x41f6480, 0x8011001f, - 0x40645c7, 0x8010335c, - 0x3ed26e6, 0x800f6b88, 0x3d407df, 0x800ea8a3, 0x3bae8b2, 0x800deaad, - 0x3a1c960, 0x800d31a5, - 0x388a9ea, 0x800c7d8c, 0x36f8a51, 0x800bce63, 0x3566a96, 0x800b2427, - 0x33d4abb, 0x800a7edb, - 0x3242abf, 0x8009de7e, 0x30b0aa4, 0x80094310, 0x2f1ea6c, 0x8008ac90, - 0x2d8ca16, 0x80081b00, - 0x2bfa9a4, 0x80078e5e, 0x2a68917, 0x800706ac, 0x28d6870, 0x800683e8, - 0x27447b0, 0x80060614, - 0x25b26d7, 0x80058d2f, 0x24205e8, 0x80051939, 0x228e4e2, 0x8004aa32, - 0x20fc3c6, 0x8004401a, - 0x1f6a297, 0x8003daf1, 0x1dd8154, 0x80037ab7, 0x1c45ffe, 0x80031f6d, - 0x1ab3e97, 0x8002c912, - 0x1921d20, 0x800277a6, 0x178fb99, 0x80022b29, 0x15fda03, 0x8001e39b, - 0x146b860, 0x8001a0fd, - 0x12d96b1, 0x8001634e, 0x11474f6, 0x80012a8e, 0xfb5330, 0x8000f6bd, - 0xe23160, 0x8000c7dc, - 0xc90f88, 0x80009dea, 0xafeda8, 0x800078e7, 0x96cbc1, 0x800058d4, 0x7da9d4, - 0x80003daf, - 0x6487e3, 0x8000277a, 0x4b65ee, 0x80001635, 0x3243f5, 0x800009df, 0x1921fb, - 0x80000278, -}; - -static const q31_t WeightsQ31_8192[16384] = { - 0x7fffffff, 0x0, 0x7fffffd9, 0xfff9b781, 0x7fffff62, 0xfff36f02, 0x7ffffe9d, - 0xffed2684, - 0x7ffffd88, 0xffe6de05, 0x7ffffc25, 0xffe09586, 0x7ffffa73, 0xffda4d08, - 0x7ffff872, 0xffd40489, - 0x7ffff621, 0xffcdbc0b, 0x7ffff382, 0xffc7738c, 0x7ffff094, 0xffc12b0e, - 0x7fffed57, 0xffbae290, - 0x7fffe9cb, 0xffb49a12, 0x7fffe5f0, 0xffae5195, 0x7fffe1c6, 0xffa80917, - 0x7fffdd4d, 0xffa1c09a, - 0x7fffd886, 0xff9b781d, 0x7fffd36f, 0xff952fa0, 0x7fffce09, 0xff8ee724, - 0x7fffc854, 0xff889ea7, - 0x7fffc251, 0xff82562c, 0x7fffbbfe, 0xff7c0db0, 0x7fffb55c, 0xff75c535, - 0x7fffae6c, 0xff6f7cba, - 0x7fffa72c, 0xff69343f, 0x7fff9f9e, 0xff62ebc5, 0x7fff97c1, 0xff5ca34b, - 0x7fff8f94, 0xff565ad1, - 0x7fff8719, 0xff501258, 0x7fff7e4f, 0xff49c9df, 0x7fff7536, 0xff438167, - 0x7fff6bcd, 0xff3d38ef, - 0x7fff6216, 0xff36f078, 0x7fff5810, 0xff30a801, 0x7fff4dbb, 0xff2a5f8b, - 0x7fff4317, 0xff241715, - 0x7fff3824, 0xff1dcea0, 0x7fff2ce2, 0xff17862b, 0x7fff2151, 0xff113db7, - 0x7fff1572, 0xff0af543, - 0x7fff0943, 0xff04acd0, 0x7ffefcc5, 0xfefe645e, 0x7ffeeff8, 0xfef81bec, - 0x7ffee2dd, 0xfef1d37b, - 0x7ffed572, 0xfeeb8b0a, 0x7ffec7b9, 0xfee5429a, 0x7ffeb9b0, 0xfedefa2b, - 0x7ffeab59, 0xfed8b1bd, - 0x7ffe9cb2, 0xfed2694f, 0x7ffe8dbd, 0xfecc20e2, 0x7ffe7e79, 0xfec5d876, - 0x7ffe6ee5, 0xfebf900a, - 0x7ffe5f03, 0xfeb947a0, 0x7ffe4ed2, 0xfeb2ff36, 0x7ffe3e52, 0xfeacb6cc, - 0x7ffe2d83, 0xfea66e64, - 0x7ffe1c65, 0xfea025fd, 0x7ffe0af8, 0xfe99dd96, 0x7ffdf93c, 0xfe939530, - 0x7ffde731, 0xfe8d4ccb, - 0x7ffdd4d7, 0xfe870467, 0x7ffdc22e, 0xfe80bc04, 0x7ffdaf37, 0xfe7a73a2, - 0x7ffd9bf0, 0xfe742b41, - 0x7ffd885a, 0xfe6de2e0, 0x7ffd7476, 0xfe679a81, 0x7ffd6042, 0xfe615223, - 0x7ffd4bc0, 0xfe5b09c5, - 0x7ffd36ee, 0xfe54c169, 0x7ffd21ce, 0xfe4e790d, 0x7ffd0c5f, 0xfe4830b3, - 0x7ffcf6a0, 0xfe41e85a, - 0x7ffce093, 0xfe3ba002, 0x7ffcca37, 0xfe3557ab, 0x7ffcb38c, 0xfe2f0f55, - 0x7ffc9c92, 0xfe28c700, - 0x7ffc8549, 0xfe227eac, 0x7ffc6db1, 0xfe1c365a, 0x7ffc55ca, 0xfe15ee09, - 0x7ffc3d94, 0xfe0fa5b8, - 0x7ffc250f, 0xfe095d69, 0x7ffc0c3b, 0xfe03151c, 0x7ffbf319, 0xfdfccccf, - 0x7ffbd9a7, 0xfdf68484, - 0x7ffbbfe6, 0xfdf03c3a, 0x7ffba5d7, 0xfde9f3f1, 0x7ffb8b78, 0xfde3aba9, - 0x7ffb70cb, 0xfddd6363, - 0x7ffb55ce, 0xfdd71b1e, 0x7ffb3a83, 0xfdd0d2db, 0x7ffb1ee9, 0xfdca8a99, - 0x7ffb0300, 0xfdc44258, - 0x7ffae6c7, 0xfdbdfa18, 0x7ffaca40, 0xfdb7b1da, 0x7ffaad6a, 0xfdb1699e, - 0x7ffa9045, 0xfdab2162, - 0x7ffa72d1, 0xfda4d929, 0x7ffa550e, 0xfd9e90f0, 0x7ffa36fc, 0xfd9848b9, - 0x7ffa189c, 0xfd920084, - 0x7ff9f9ec, 0xfd8bb850, 0x7ff9daed, 0xfd85701e, 0x7ff9bba0, 0xfd7f27ed, - 0x7ff99c03, 0xfd78dfbd, - 0x7ff97c18, 0xfd729790, 0x7ff95bdd, 0xfd6c4f64, 0x7ff93b54, 0xfd660739, - 0x7ff91a7b, 0xfd5fbf10, - 0x7ff8f954, 0xfd5976e9, 0x7ff8d7de, 0xfd532ec3, 0x7ff8b619, 0xfd4ce69f, - 0x7ff89405, 0xfd469e7c, - 0x7ff871a2, 0xfd40565c, 0x7ff84ef0, 0xfd3a0e3d, 0x7ff82bef, 0xfd33c61f, - 0x7ff8089f, 0xfd2d7e04, - 0x7ff7e500, 0xfd2735ea, 0x7ff7c113, 0xfd20edd2, 0x7ff79cd6, 0xfd1aa5bc, - 0x7ff7784a, 0xfd145da7, - 0x7ff75370, 0xfd0e1594, 0x7ff72e46, 0xfd07cd83, 0x7ff708ce, 0xfd018574, - 0x7ff6e307, 0xfcfb3d67, - 0x7ff6bcf0, 0xfcf4f55c, 0x7ff6968b, 0xfceead52, 0x7ff66fd7, 0xfce8654b, - 0x7ff648d4, 0xfce21d45, - 0x7ff62182, 0xfcdbd541, 0x7ff5f9e1, 0xfcd58d3f, 0x7ff5d1f1, 0xfccf453f, - 0x7ff5a9b2, 0xfcc8fd41, - 0x7ff58125, 0xfcc2b545, 0x7ff55848, 0xfcbc6d4c, 0x7ff52f1d, 0xfcb62554, - 0x7ff505a2, 0xfcafdd5e, - 0x7ff4dbd9, 0xfca9956a, 0x7ff4b1c0, 0xfca34d78, 0x7ff48759, 0xfc9d0588, - 0x7ff45ca3, 0xfc96bd9b, - 0x7ff4319d, 0xfc9075af, 0x7ff40649, 0xfc8a2dc6, 0x7ff3daa6, 0xfc83e5de, - 0x7ff3aeb4, 0xfc7d9df9, - 0x7ff38274, 0xfc775616, 0x7ff355e4, 0xfc710e36, 0x7ff32905, 0xfc6ac657, - 0x7ff2fbd7, 0xfc647e7b, - 0x7ff2ce5b, 0xfc5e36a0, 0x7ff2a08f, 0xfc57eec9, 0x7ff27275, 0xfc51a6f3, - 0x7ff2440b, 0xfc4b5f20, - 0x7ff21553, 0xfc45174e, 0x7ff1e64c, 0xfc3ecf80, 0x7ff1b6f6, 0xfc3887b3, - 0x7ff18751, 0xfc323fe9, - 0x7ff1575d, 0xfc2bf821, 0x7ff1271a, 0xfc25b05c, 0x7ff0f688, 0xfc1f6899, - 0x7ff0c5a7, 0xfc1920d8, - 0x7ff09478, 0xfc12d91a, 0x7ff062f9, 0xfc0c915e, 0x7ff0312c, 0xfc0649a5, - 0x7fefff0f, 0xfc0001ee, - 0x7fefcca4, 0xfbf9ba39, 0x7fef99ea, 0xfbf37287, 0x7fef66e1, 0xfbed2ad8, - 0x7fef3388, 0xfbe6e32b, - 0x7feeffe1, 0xfbe09b80, 0x7feecbec, 0xfbda53d8, 0x7fee97a7, 0xfbd40c33, - 0x7fee6313, 0xfbcdc490, - 0x7fee2e30, 0xfbc77cf0, 0x7fedf8ff, 0xfbc13552, 0x7fedc37e, 0xfbbaedb7, - 0x7fed8daf, 0xfbb4a61f, - 0x7fed5791, 0xfbae5e89, 0x7fed2123, 0xfba816f6, 0x7fecea67, 0xfba1cf66, - 0x7fecb35c, 0xfb9b87d8, - 0x7fec7c02, 0xfb95404d, 0x7fec4459, 0xfb8ef8c5, 0x7fec0c62, 0xfb88b13f, - 0x7febd41b, 0xfb8269bd, - 0x7feb9b85, 0xfb7c223d, 0x7feb62a1, 0xfb75dac0, 0x7feb296d, 0xfb6f9345, - 0x7feaefeb, 0xfb694bce, - 0x7feab61a, 0xfb630459, 0x7fea7bfa, 0xfb5cbce7, 0x7fea418b, 0xfb567578, - 0x7fea06cd, 0xfb502e0c, - 0x7fe9cbc0, 0xfb49e6a3, 0x7fe99064, 0xfb439f3c, 0x7fe954ba, 0xfb3d57d9, - 0x7fe918c0, 0xfb371078, - 0x7fe8dc78, 0xfb30c91b, 0x7fe89fe0, 0xfb2a81c0, 0x7fe862fa, 0xfb243a69, - 0x7fe825c5, 0xfb1df314, - 0x7fe7e841, 0xfb17abc2, 0x7fe7aa6e, 0xfb116474, 0x7fe76c4c, 0xfb0b1d28, - 0x7fe72ddb, 0xfb04d5e0, - 0x7fe6ef1c, 0xfafe8e9b, 0x7fe6b00d, 0xfaf84758, 0x7fe670b0, 0xfaf20019, - 0x7fe63103, 0xfaebb8dd, - 0x7fe5f108, 0xfae571a4, 0x7fe5b0be, 0xfadf2a6e, 0x7fe57025, 0xfad8e33c, - 0x7fe52f3d, 0xfad29c0c, - 0x7fe4ee06, 0xfacc54e0, 0x7fe4ac81, 0xfac60db7, 0x7fe46aac, 0xfabfc691, - 0x7fe42889, 0xfab97f6e, - 0x7fe3e616, 0xfab3384f, 0x7fe3a355, 0xfaacf133, 0x7fe36045, 0xfaa6aa1a, - 0x7fe31ce6, 0xfaa06305, - 0x7fe2d938, 0xfa9a1bf3, 0x7fe2953b, 0xfa93d4e4, 0x7fe250ef, 0xfa8d8dd8, - 0x7fe20c55, 0xfa8746d0, - 0x7fe1c76b, 0xfa80ffcb, 0x7fe18233, 0xfa7ab8ca, 0x7fe13cac, 0xfa7471cc, - 0x7fe0f6d6, 0xfa6e2ad1, - 0x7fe0b0b1, 0xfa67e3da, 0x7fe06a3d, 0xfa619ce7, 0x7fe0237a, 0xfa5b55f7, - 0x7fdfdc69, 0xfa550f0a, - 0x7fdf9508, 0xfa4ec821, 0x7fdf4d59, 0xfa48813b, 0x7fdf055a, 0xfa423a59, - 0x7fdebd0d, 0xfa3bf37a, - 0x7fde7471, 0xfa35ac9f, 0x7fde2b86, 0xfa2f65c8, 0x7fdde24d, 0xfa291ef4, - 0x7fdd98c4, 0xfa22d823, - 0x7fdd4eec, 0xfa1c9157, 0x7fdd04c6, 0xfa164a8e, 0x7fdcba51, 0xfa1003c8, - 0x7fdc6f8d, 0xfa09bd06, - 0x7fdc247a, 0xfa037648, 0x7fdbd918, 0xf9fd2f8e, 0x7fdb8d67, 0xf9f6e8d7, - 0x7fdb4167, 0xf9f0a224, - 0x7fdaf519, 0xf9ea5b75, 0x7fdaa87c, 0xf9e414ca, 0x7fda5b8f, 0xf9ddce22, - 0x7fda0e54, 0xf9d7877e, - 0x7fd9c0ca, 0xf9d140de, 0x7fd972f2, 0xf9cafa42, 0x7fd924ca, 0xf9c4b3a9, - 0x7fd8d653, 0xf9be6d15, - 0x7fd8878e, 0xf9b82684, 0x7fd8387a, 0xf9b1dff7, 0x7fd7e917, 0xf9ab996e, - 0x7fd79965, 0xf9a552e9, - 0x7fd74964, 0xf99f0c68, 0x7fd6f914, 0xf998c5ea, 0x7fd6a875, 0xf9927f71, - 0x7fd65788, 0xf98c38fc, - 0x7fd6064c, 0xf985f28a, 0x7fd5b4c1, 0xf97fac1d, 0x7fd562e7, 0xf97965b4, - 0x7fd510be, 0xf9731f4e, - 0x7fd4be46, 0xf96cd8ed, 0x7fd46b80, 0xf9669290, 0x7fd4186a, 0xf9604c37, - 0x7fd3c506, 0xf95a05e2, - 0x7fd37153, 0xf953bf91, 0x7fd31d51, 0xf94d7944, 0x7fd2c900, 0xf94732fb, - 0x7fd27460, 0xf940ecb7, - 0x7fd21f72, 0xf93aa676, 0x7fd1ca35, 0xf934603a, 0x7fd174a8, 0xf92e1a02, - 0x7fd11ecd, 0xf927d3ce, - 0x7fd0c8a3, 0xf9218d9e, 0x7fd0722b, 0xf91b4773, 0x7fd01b63, 0xf915014c, - 0x7fcfc44d, 0xf90ebb29, - 0x7fcf6ce8, 0xf908750a, 0x7fcf1533, 0xf9022ef0, 0x7fcebd31, 0xf8fbe8da, - 0x7fce64df, 0xf8f5a2c9, - 0x7fce0c3e, 0xf8ef5cbb, 0x7fcdb34f, 0xf8e916b2, 0x7fcd5a11, 0xf8e2d0ae, - 0x7fcd0083, 0xf8dc8aae, - 0x7fcca6a7, 0xf8d644b2, 0x7fcc4c7d, 0xf8cffebb, 0x7fcbf203, 0xf8c9b8c8, - 0x7fcb973b, 0xf8c372d9, - 0x7fcb3c23, 0xf8bd2cef, 0x7fcae0bd, 0xf8b6e70a, 0x7fca8508, 0xf8b0a129, - 0x7fca2905, 0xf8aa5b4c, - 0x7fc9ccb2, 0xf8a41574, 0x7fc97011, 0xf89dcfa1, 0x7fc91320, 0xf89789d2, - 0x7fc8b5e1, 0xf8914407, - 0x7fc85854, 0xf88afe42, 0x7fc7fa77, 0xf884b880, 0x7fc79c4b, 0xf87e72c4, - 0x7fc73dd1, 0xf8782d0c, - 0x7fc6df08, 0xf871e759, 0x7fc67ff0, 0xf86ba1aa, 0x7fc62089, 0xf8655c00, - 0x7fc5c0d3, 0xf85f165b, - 0x7fc560cf, 0xf858d0bb, 0x7fc5007c, 0xf8528b1f, 0x7fc49fda, 0xf84c4588, - 0x7fc43ee9, 0xf845fff5, - 0x7fc3dda9, 0xf83fba68, 0x7fc37c1b, 0xf83974df, 0x7fc31a3d, 0xf8332f5b, - 0x7fc2b811, 0xf82ce9dc, - 0x7fc25596, 0xf826a462, 0x7fc1f2cc, 0xf8205eec, 0x7fc18fb4, 0xf81a197b, - 0x7fc12c4d, 0xf813d410, - 0x7fc0c896, 0xf80d8ea9, 0x7fc06491, 0xf8074947, 0x7fc0003e, 0xf80103ea, - 0x7fbf9b9b, 0xf7fabe92, - 0x7fbf36aa, 0xf7f4793e, 0x7fbed16a, 0xf7ee33f0, 0x7fbe6bdb, 0xf7e7eea7, - 0x7fbe05fd, 0xf7e1a963, - 0x7fbd9fd0, 0xf7db6423, 0x7fbd3955, 0xf7d51ee9, 0x7fbcd28b, 0xf7ced9b4, - 0x7fbc6b72, 0xf7c89484, - 0x7fbc040a, 0xf7c24f59, 0x7fbb9c53, 0xf7bc0a33, 0x7fbb344e, 0xf7b5c512, - 0x7fbacbfa, 0xf7af7ff6, - 0x7fba6357, 0xf7a93ae0, 0x7fb9fa65, 0xf7a2f5ce, 0x7fb99125, 0xf79cb0c2, - 0x7fb92796, 0xf7966bbb, - 0x7fb8bdb8, 0xf79026b9, 0x7fb8538b, 0xf789e1bc, 0x7fb7e90f, 0xf7839cc4, - 0x7fb77e45, 0xf77d57d2, - 0x7fb7132b, 0xf77712e5, 0x7fb6a7c3, 0xf770cdfd, 0x7fb63c0d, 0xf76a891b, - 0x7fb5d007, 0xf764443d, - 0x7fb563b3, 0xf75dff66, 0x7fb4f710, 0xf757ba93, 0x7fb48a1e, 0xf75175c6, - 0x7fb41cdd, 0xf74b30fe, - 0x7fb3af4e, 0xf744ec3b, 0x7fb34170, 0xf73ea77e, 0x7fb2d343, 0xf73862c6, - 0x7fb264c7, 0xf7321e14, - 0x7fb1f5fc, 0xf72bd967, 0x7fb186e3, 0xf72594c0, 0x7fb1177b, 0xf71f501e, - 0x7fb0a7c4, 0xf7190b81, - 0x7fb037bf, 0xf712c6ea, 0x7fafc76a, 0xf70c8259, 0x7faf56c7, 0xf7063dcd, - 0x7faee5d5, 0xf6fff946, - 0x7fae7495, 0xf6f9b4c6, 0x7fae0305, 0xf6f3704a, 0x7fad9127, 0xf6ed2bd4, - 0x7fad1efa, 0xf6e6e764, - 0x7facac7f, 0xf6e0a2fa, 0x7fac39b4, 0xf6da5e95, 0x7fabc69b, 0xf6d41a36, - 0x7fab5333, 0xf6cdd5dc, - 0x7faadf7c, 0xf6c79188, 0x7faa6b77, 0xf6c14d3a, 0x7fa9f723, 0xf6bb08f1, - 0x7fa98280, 0xf6b4c4ae, - 0x7fa90d8e, 0xf6ae8071, 0x7fa8984e, 0xf6a83c3a, 0x7fa822bf, 0xf6a1f808, - 0x7fa7ace1, 0xf69bb3dd, - 0x7fa736b4, 0xf6956fb7, 0x7fa6c039, 0xf68f2b96, 0x7fa6496e, 0xf688e77c, - 0x7fa5d256, 0xf682a367, - 0x7fa55aee, 0xf67c5f59, 0x7fa4e338, 0xf6761b50, 0x7fa46b32, 0xf66fd74d, - 0x7fa3f2df, 0xf6699350, - 0x7fa37a3c, 0xf6634f59, 0x7fa3014b, 0xf65d0b68, 0x7fa2880b, 0xf656c77c, - 0x7fa20e7c, 0xf6508397, - 0x7fa1949e, 0xf64a3fb8, 0x7fa11a72, 0xf643fbdf, 0x7fa09ff7, 0xf63db80b, - 0x7fa0252e, 0xf637743e, - 0x7f9faa15, 0xf6313077, 0x7f9f2eae, 0xf62aecb5, 0x7f9eb2f8, 0xf624a8fa, - 0x7f9e36f4, 0xf61e6545, - 0x7f9dbaa0, 0xf6182196, 0x7f9d3dfe, 0xf611dded, 0x7f9cc10d, 0xf60b9a4b, - 0x7f9c43ce, 0xf60556ae, - 0x7f9bc640, 0xf5ff1318, 0x7f9b4863, 0xf5f8cf87, 0x7f9aca37, 0xf5f28bfd, - 0x7f9a4bbd, 0xf5ec4879, - 0x7f99ccf4, 0xf5e604fc, 0x7f994ddc, 0xf5dfc184, 0x7f98ce76, 0xf5d97e13, - 0x7f984ec1, 0xf5d33aa8, - 0x7f97cebd, 0xf5ccf743, 0x7f974e6a, 0xf5c6b3e5, 0x7f96cdc9, 0xf5c0708d, - 0x7f964cd9, 0xf5ba2d3b, - 0x7f95cb9a, 0xf5b3e9f0, 0x7f954a0d, 0xf5ada6ab, 0x7f94c831, 0xf5a7636c, - 0x7f944606, 0xf5a12034, - 0x7f93c38c, 0xf59add02, 0x7f9340c4, 0xf59499d6, 0x7f92bdad, 0xf58e56b1, - 0x7f923a48, 0xf5881393, - 0x7f91b694, 0xf581d07b, 0x7f913291, 0xf57b8d69, 0x7f90ae3f, 0xf5754a5e, - 0x7f90299f, 0xf56f0759, - 0x7f8fa4b0, 0xf568c45b, 0x7f8f1f72, 0xf5628163, 0x7f8e99e6, 0xf55c3e72, - 0x7f8e140a, 0xf555fb88, - 0x7f8d8de1, 0xf54fb8a4, 0x7f8d0768, 0xf54975c6, 0x7f8c80a1, 0xf54332ef, - 0x7f8bf98b, 0xf53cf01f, - 0x7f8b7227, 0xf536ad56, 0x7f8aea74, 0xf5306a93, 0x7f8a6272, 0xf52a27d7, - 0x7f89da21, 0xf523e521, - 0x7f895182, 0xf51da273, 0x7f88c894, 0xf5175fca, 0x7f883f58, 0xf5111d29, - 0x7f87b5cd, 0xf50ada8f, - 0x7f872bf3, 0xf50497fb, 0x7f86a1ca, 0xf4fe556e, 0x7f861753, 0xf4f812e7, - 0x7f858c8d, 0xf4f1d068, - 0x7f850179, 0xf4eb8def, 0x7f847616, 0xf4e54b7d, 0x7f83ea64, 0xf4df0912, - 0x7f835e64, 0xf4d8c6ae, - 0x7f82d214, 0xf4d28451, 0x7f824577, 0xf4cc41fb, 0x7f81b88a, 0xf4c5ffab, - 0x7f812b4f, 0xf4bfbd63, - 0x7f809dc5, 0xf4b97b21, 0x7f800fed, 0xf4b338e7, 0x7f7f81c6, 0xf4acf6b3, - 0x7f7ef350, 0xf4a6b486, - 0x7f7e648c, 0xf4a07261, 0x7f7dd579, 0xf49a3042, 0x7f7d4617, 0xf493ee2b, - 0x7f7cb667, 0xf48dac1a, - 0x7f7c2668, 0xf4876a10, 0x7f7b961b, 0xf481280e, 0x7f7b057e, 0xf47ae613, - 0x7f7a7494, 0xf474a41f, - 0x7f79e35a, 0xf46e6231, 0x7f7951d2, 0xf468204b, 0x7f78bffb, 0xf461de6d, - 0x7f782dd6, 0xf45b9c95, - 0x7f779b62, 0xf4555ac5, 0x7f77089f, 0xf44f18fb, 0x7f76758e, 0xf448d739, - 0x7f75e22e, 0xf442957e, - 0x7f754e80, 0xf43c53cb, 0x7f74ba83, 0xf436121e, 0x7f742637, 0xf42fd079, - 0x7f73919d, 0xf4298edc, - 0x7f72fcb4, 0xf4234d45, 0x7f72677c, 0xf41d0bb6, 0x7f71d1f6, 0xf416ca2e, - 0x7f713c21, 0xf41088ae, - 0x7f70a5fe, 0xf40a4735, 0x7f700f8c, 0xf40405c3, 0x7f6f78cb, 0xf3fdc459, - 0x7f6ee1bc, 0xf3f782f6, - 0x7f6e4a5e, 0xf3f1419a, 0x7f6db2b1, 0xf3eb0046, 0x7f6d1ab6, 0xf3e4bef9, - 0x7f6c826d, 0xf3de7db4, - 0x7f6be9d4, 0xf3d83c77, 0x7f6b50ed, 0xf3d1fb40, 0x7f6ab7b8, 0xf3cbba12, - 0x7f6a1e34, 0xf3c578eb, - 0x7f698461, 0xf3bf37cb, 0x7f68ea40, 0xf3b8f6b3, 0x7f684fd0, 0xf3b2b5a3, - 0x7f67b512, 0xf3ac749a, - 0x7f671a05, 0xf3a63398, 0x7f667ea9, 0xf39ff29f, 0x7f65e2ff, 0xf399b1ad, - 0x7f654706, 0xf39370c2, - 0x7f64aabf, 0xf38d2fe0, 0x7f640e29, 0xf386ef05, 0x7f637144, 0xf380ae31, - 0x7f62d411, 0xf37a6d66, - 0x7f62368f, 0xf3742ca2, 0x7f6198bf, 0xf36debe6, 0x7f60faa0, 0xf367ab31, - 0x7f605c33, 0xf3616a85, - 0x7f5fbd77, 0xf35b29e0, 0x7f5f1e6c, 0xf354e943, 0x7f5e7f13, 0xf34ea8ae, - 0x7f5ddf6b, 0xf3486820, - 0x7f5d3f75, 0xf342279b, 0x7f5c9f30, 0xf33be71d, 0x7f5bfe9d, 0xf335a6a7, - 0x7f5b5dbb, 0xf32f6639, - 0x7f5abc8a, 0xf32925d3, 0x7f5a1b0b, 0xf322e575, 0x7f59793e, 0xf31ca51f, - 0x7f58d721, 0xf31664d1, - 0x7f5834b7, 0xf310248a, 0x7f5791fd, 0xf309e44c, 0x7f56eef5, 0xf303a416, - 0x7f564b9f, 0xf2fd63e8, - 0x7f55a7fa, 0xf2f723c1, 0x7f550407, 0xf2f0e3a3, 0x7f545fc5, 0xf2eaa38d, - 0x7f53bb34, 0xf2e4637f, - 0x7f531655, 0xf2de2379, 0x7f527127, 0xf2d7e37b, 0x7f51cbab, 0xf2d1a385, - 0x7f5125e0, 0xf2cb6398, - 0x7f507fc7, 0xf2c523b2, 0x7f4fd95f, 0xf2bee3d5, 0x7f4f32a9, 0xf2b8a400, - 0x7f4e8ba4, 0xf2b26433, - 0x7f4de451, 0xf2ac246e, 0x7f4d3caf, 0xf2a5e4b1, 0x7f4c94be, 0xf29fa4fd, - 0x7f4bec7f, 0xf2996551, - 0x7f4b43f2, 0xf29325ad, 0x7f4a9b16, 0xf28ce612, 0x7f49f1eb, 0xf286a67e, - 0x7f494872, 0xf28066f4, - 0x7f489eaa, 0xf27a2771, 0x7f47f494, 0xf273e7f7, 0x7f474a30, 0xf26da885, - 0x7f469f7d, 0xf267691b, - 0x7f45f47b, 0xf26129ba, 0x7f45492b, 0xf25aea61, 0x7f449d8c, 0xf254ab11, - 0x7f43f19f, 0xf24e6bc9, - 0x7f434563, 0xf2482c8a, 0x7f4298d9, 0xf241ed53, 0x7f41ec01, 0xf23bae24, - 0x7f413ed9, 0xf2356efe, - 0x7f409164, 0xf22f2fe1, 0x7f3fe3a0, 0xf228f0cc, 0x7f3f358d, 0xf222b1c0, - 0x7f3e872c, 0xf21c72bc, - 0x7f3dd87c, 0xf21633c0, 0x7f3d297e, 0xf20ff4ce, 0x7f3c7a31, 0xf209b5e4, - 0x7f3bca96, 0xf2037702, - 0x7f3b1aad, 0xf1fd3829, 0x7f3a6a75, 0xf1f6f959, 0x7f39b9ee, 0xf1f0ba91, - 0x7f390919, 0xf1ea7bd2, - 0x7f3857f6, 0xf1e43d1c, 0x7f37a684, 0xf1ddfe6f, 0x7f36f4c3, 0xf1d7bfca, - 0x7f3642b4, 0xf1d1812e, - 0x7f359057, 0xf1cb429a, 0x7f34ddab, 0xf1c50410, 0x7f342ab1, 0xf1bec58e, - 0x7f337768, 0xf1b88715, - 0x7f32c3d1, 0xf1b248a5, 0x7f320feb, 0xf1ac0a3e, 0x7f315bb7, 0xf1a5cbdf, - 0x7f30a734, 0xf19f8d89, - 0x7f2ff263, 0xf1994f3d, 0x7f2f3d44, 0xf19310f9, 0x7f2e87d6, 0xf18cd2be, - 0x7f2dd219, 0xf186948c, - 0x7f2d1c0e, 0xf1805662, 0x7f2c65b5, 0xf17a1842, 0x7f2baf0d, 0xf173da2b, - 0x7f2af817, 0xf16d9c1d, - 0x7f2a40d2, 0xf1675e17, 0x7f29893f, 0xf161201b, 0x7f28d15d, 0xf15ae228, - 0x7f28192d, 0xf154a43d, - 0x7f2760af, 0xf14e665c, 0x7f26a7e2, 0xf1482884, 0x7f25eec7, 0xf141eab5, - 0x7f25355d, 0xf13bacef, - 0x7f247ba5, 0xf1356f32, 0x7f23c19e, 0xf12f317e, 0x7f230749, 0xf128f3d4, - 0x7f224ca6, 0xf122b632, - 0x7f2191b4, 0xf11c789a, 0x7f20d674, 0xf1163b0b, 0x7f201ae5, 0xf10ffd85, - 0x7f1f5f08, 0xf109c009, - 0x7f1ea2dc, 0xf1038295, 0x7f1de662, 0xf0fd452b, 0x7f1d299a, 0xf0f707ca, - 0x7f1c6c83, 0xf0f0ca72, - 0x7f1baf1e, 0xf0ea8d24, 0x7f1af16a, 0xf0e44fdf, 0x7f1a3368, 0xf0de12a3, - 0x7f197518, 0xf0d7d571, - 0x7f18b679, 0xf0d19848, 0x7f17f78c, 0xf0cb5b28, 0x7f173850, 0xf0c51e12, - 0x7f1678c6, 0xf0bee105, - 0x7f15b8ee, 0xf0b8a401, 0x7f14f8c7, 0xf0b26707, 0x7f143852, 0xf0ac2a16, - 0x7f13778e, 0xf0a5ed2f, - 0x7f12b67c, 0xf09fb051, 0x7f11f51c, 0xf099737d, 0x7f11336d, 0xf09336b2, - 0x7f107170, 0xf08cf9f1, - 0x7f0faf25, 0xf086bd39, 0x7f0eec8b, 0xf080808b, 0x7f0e29a3, 0xf07a43e7, - 0x7f0d666c, 0xf074074c, - 0x7f0ca2e7, 0xf06dcaba, 0x7f0bdf14, 0xf0678e32, 0x7f0b1af2, 0xf06151b4, - 0x7f0a5682, 0xf05b1540, - 0x7f0991c4, 0xf054d8d5, 0x7f08ccb7, 0xf04e9c73, 0x7f08075c, 0xf048601c, - 0x7f0741b2, 0xf04223ce, - 0x7f067bba, 0xf03be78a, 0x7f05b574, 0xf035ab4f, 0x7f04eedf, 0xf02f6f1f, - 0x7f0427fc, 0xf02932f8, - 0x7f0360cb, 0xf022f6da, 0x7f02994b, 0xf01cbac7, 0x7f01d17d, 0xf0167ebd, - 0x7f010961, 0xf01042be, - 0x7f0040f6, 0xf00a06c8, 0x7eff783d, 0xf003cadc, 0x7efeaf36, 0xeffd8ef9, - 0x7efde5e0, 0xeff75321, - 0x7efd1c3c, 0xeff11753, 0x7efc524a, 0xefeadb8e, 0x7efb8809, 0xefe49fd3, - 0x7efabd7a, 0xefde6423, - 0x7ef9f29d, 0xefd8287c, 0x7ef92771, 0xefd1ecdf, 0x7ef85bf7, 0xefcbb14c, - 0x7ef7902f, 0xefc575c3, - 0x7ef6c418, 0xefbf3a45, 0x7ef5f7b3, 0xefb8fed0, 0x7ef52b00, 0xefb2c365, - 0x7ef45dfe, 0xefac8804, - 0x7ef390ae, 0xefa64cae, 0x7ef2c310, 0xefa01161, 0x7ef1f524, 0xef99d61f, - 0x7ef126e9, 0xef939ae6, - 0x7ef05860, 0xef8d5fb8, 0x7eef8988, 0xef872494, 0x7eeeba62, 0xef80e97a, - 0x7eedeaee, 0xef7aae6b, - 0x7eed1b2c, 0xef747365, 0x7eec4b1b, 0xef6e386a, 0x7eeb7abc, 0xef67fd79, - 0x7eeaaa0f, 0xef61c292, - 0x7ee9d914, 0xef5b87b5, 0x7ee907ca, 0xef554ce3, 0x7ee83632, 0xef4f121b, - 0x7ee7644c, 0xef48d75d, - 0x7ee69217, 0xef429caa, 0x7ee5bf94, 0xef3c6201, 0x7ee4ecc3, 0xef362762, - 0x7ee419a3, 0xef2feccd, - 0x7ee34636, 0xef29b243, 0x7ee2727a, 0xef2377c4, 0x7ee19e6f, 0xef1d3d4e, - 0x7ee0ca17, 0xef1702e4, - 0x7edff570, 0xef10c883, 0x7edf207b, 0xef0a8e2d, 0x7ede4b38, 0xef0453e2, - 0x7edd75a6, 0xeefe19a1, - 0x7edc9fc6, 0xeef7df6a, 0x7edbc998, 0xeef1a53e, 0x7edaf31c, 0xeeeb6b1c, - 0x7eda1c51, 0xeee53105, - 0x7ed94538, 0xeedef6f9, 0x7ed86dd1, 0xeed8bcf7, 0x7ed7961c, 0xeed28300, - 0x7ed6be18, 0xeecc4913, - 0x7ed5e5c6, 0xeec60f31, 0x7ed50d26, 0xeebfd55a, 0x7ed43438, 0xeeb99b8d, - 0x7ed35afb, 0xeeb361cb, - 0x7ed28171, 0xeead2813, 0x7ed1a798, 0xeea6ee66, 0x7ed0cd70, 0xeea0b4c4, - 0x7ecff2fb, 0xee9a7b2d, - 0x7ecf1837, 0xee9441a0, 0x7ece3d25, 0xee8e081e, 0x7ecd61c5, 0xee87cea7, - 0x7ecc8617, 0xee81953b, - 0x7ecbaa1a, 0xee7b5bd9, 0x7ecacdd0, 0xee752283, 0x7ec9f137, 0xee6ee937, - 0x7ec9144f, 0xee68aff6, - 0x7ec8371a, 0xee6276bf, 0x7ec75996, 0xee5c3d94, 0x7ec67bc5, 0xee560473, - 0x7ec59da5, 0xee4fcb5e, - 0x7ec4bf36, 0xee499253, 0x7ec3e07a, 0xee435953, 0x7ec3016f, 0xee3d205e, - 0x7ec22217, 0xee36e775, - 0x7ec14270, 0xee30ae96, 0x7ec0627a, 0xee2a75c2, 0x7ebf8237, 0xee243cf9, - 0x7ebea1a6, 0xee1e043b, - 0x7ebdc0c6, 0xee17cb88, 0x7ebcdf98, 0xee1192e0, 0x7ebbfe1c, 0xee0b5a43, - 0x7ebb1c52, 0xee0521b2, - 0x7eba3a39, 0xedfee92b, 0x7eb957d2, 0xedf8b0b0, 0x7eb8751e, 0xedf2783f, - 0x7eb7921b, 0xedec3fda, - 0x7eb6aeca, 0xede60780, 0x7eb5cb2a, 0xeddfcf31, 0x7eb4e73d, 0xedd996ed, - 0x7eb40301, 0xedd35eb5, - 0x7eb31e78, 0xedcd2687, 0x7eb239a0, 0xedc6ee65, 0x7eb1547a, 0xedc0b64e, - 0x7eb06f05, 0xedba7e43, - 0x7eaf8943, 0xedb44642, 0x7eaea333, 0xedae0e4d, 0x7eadbcd4, 0xeda7d664, - 0x7eacd627, 0xeda19e85, - 0x7eabef2c, 0xed9b66b2, 0x7eab07e3, 0xed952eea, 0x7eaa204c, 0xed8ef72e, - 0x7ea93867, 0xed88bf7d, - 0x7ea85033, 0xed8287d7, 0x7ea767b2, 0xed7c503d, 0x7ea67ee2, 0xed7618ae, - 0x7ea595c4, 0xed6fe12b, - 0x7ea4ac58, 0xed69a9b3, 0x7ea3c29e, 0xed637246, 0x7ea2d896, 0xed5d3ae5, - 0x7ea1ee3f, 0xed570390, - 0x7ea1039b, 0xed50cc46, 0x7ea018a8, 0xed4a9507, 0x7e9f2d68, 0xed445dd5, - 0x7e9e41d9, 0xed3e26ad, - 0x7e9d55fc, 0xed37ef91, 0x7e9c69d1, 0xed31b881, 0x7e9b7d58, 0xed2b817d, - 0x7e9a9091, 0xed254a84, - 0x7e99a37c, 0xed1f1396, 0x7e98b618, 0xed18dcb5, 0x7e97c867, 0xed12a5df, - 0x7e96da67, 0xed0c6f14, - 0x7e95ec1a, 0xed063856, 0x7e94fd7e, 0xed0001a3, 0x7e940e94, 0xecf9cafb, - 0x7e931f5c, 0xecf39460, - 0x7e922fd6, 0xeced5dd0, 0x7e914002, 0xece7274c, 0x7e904fe0, 0xece0f0d4, - 0x7e8f5f70, 0xecdaba67, - 0x7e8e6eb2, 0xecd48407, 0x7e8d7da6, 0xecce4db2, 0x7e8c8c4b, 0xecc81769, - 0x7e8b9aa3, 0xecc1e12c, - 0x7e8aa8ac, 0xecbbaafb, 0x7e89b668, 0xecb574d5, 0x7e88c3d5, 0xecaf3ebc, - 0x7e87d0f5, 0xeca908ae, - 0x7e86ddc6, 0xeca2d2ad, 0x7e85ea49, 0xec9c9cb7, 0x7e84f67e, 0xec9666cd, - 0x7e840265, 0xec9030f0, - 0x7e830dff, 0xec89fb1e, 0x7e82194a, 0xec83c558, 0x7e812447, 0xec7d8f9e, - 0x7e802ef6, 0xec7759f1, - 0x7e7f3957, 0xec71244f, 0x7e7e436a, 0xec6aeeba, 0x7e7d4d2f, 0xec64b930, - 0x7e7c56a5, 0xec5e83b3, - 0x7e7b5fce, 0xec584e41, 0x7e7a68a9, 0xec5218dc, 0x7e797136, 0xec4be383, - 0x7e787975, 0xec45ae36, - 0x7e778166, 0xec3f78f6, 0x7e768908, 0xec3943c1, 0x7e75905d, 0xec330e99, - 0x7e749764, 0xec2cd97d, - 0x7e739e1d, 0xec26a46d, 0x7e72a488, 0xec206f69, 0x7e71aaa4, 0xec1a3a72, - 0x7e70b073, 0xec140587, - 0x7e6fb5f4, 0xec0dd0a8, 0x7e6ebb27, 0xec079bd6, 0x7e6dc00c, 0xec01670f, - 0x7e6cc4a2, 0xebfb3256, - 0x7e6bc8eb, 0xebf4fda8, 0x7e6acce6, 0xebeec907, 0x7e69d093, 0xebe89472, - 0x7e68d3f2, 0xebe25fea, - 0x7e67d703, 0xebdc2b6e, 0x7e66d9c6, 0xebd5f6fe, 0x7e65dc3b, 0xebcfc29b, - 0x7e64de62, 0xebc98e45, - 0x7e63e03b, 0xebc359fb, 0x7e62e1c6, 0xebbd25bd, 0x7e61e303, 0xebb6f18c, - 0x7e60e3f2, 0xebb0bd67, - 0x7e5fe493, 0xebaa894f, 0x7e5ee4e6, 0xeba45543, 0x7e5de4ec, 0xeb9e2144, - 0x7e5ce4a3, 0xeb97ed52, - 0x7e5be40c, 0xeb91b96c, 0x7e5ae328, 0xeb8b8593, 0x7e59e1f5, 0xeb8551c6, - 0x7e58e075, 0xeb7f1e06, - 0x7e57dea7, 0xeb78ea52, 0x7e56dc8a, 0xeb72b6ac, 0x7e55da20, 0xeb6c8312, - 0x7e54d768, 0xeb664f84, - 0x7e53d462, 0xeb601c04, 0x7e52d10e, 0xeb59e890, 0x7e51cd6c, 0xeb53b529, - 0x7e50c97c, 0xeb4d81ce, - 0x7e4fc53e, 0xeb474e81, 0x7e4ec0b2, 0xeb411b40, 0x7e4dbbd9, 0xeb3ae80c, - 0x7e4cb6b1, 0xeb34b4e4, - 0x7e4bb13c, 0xeb2e81ca, 0x7e4aab78, 0xeb284ebc, 0x7e49a567, 0xeb221bbb, - 0x7e489f08, 0xeb1be8c8, - 0x7e47985b, 0xeb15b5e1, 0x7e469160, 0xeb0f8307, 0x7e458a17, 0xeb095039, - 0x7e448281, 0xeb031d79, - 0x7e437a9c, 0xeafceac6, 0x7e427269, 0xeaf6b81f, 0x7e4169e9, 0xeaf08586, - 0x7e40611b, 0xeaea52fa, - 0x7e3f57ff, 0xeae4207a, 0x7e3e4e95, 0xeaddee08, 0x7e3d44dd, 0xead7bba3, - 0x7e3c3ad7, 0xead1894b, - 0x7e3b3083, 0xeacb56ff, 0x7e3a25e2, 0xeac524c1, 0x7e391af3, 0xeabef290, - 0x7e380fb5, 0xeab8c06c, - 0x7e37042a, 0xeab28e56, 0x7e35f851, 0xeaac5c4c, 0x7e34ec2b, 0xeaa62a4f, - 0x7e33dfb6, 0xea9ff860, - 0x7e32d2f4, 0xea99c67e, 0x7e31c5e3, 0xea9394a9, 0x7e30b885, 0xea8d62e1, - 0x7e2faad9, 0xea873127, - 0x7e2e9cdf, 0xea80ff7a, 0x7e2d8e97, 0xea7acdda, 0x7e2c8002, 0xea749c47, - 0x7e2b711f, 0xea6e6ac2, - 0x7e2a61ed, 0xea683949, 0x7e29526e, 0xea6207df, 0x7e2842a2, 0xea5bd681, - 0x7e273287, 0xea55a531, - 0x7e26221f, 0xea4f73ee, 0x7e251168, 0xea4942b9, 0x7e240064, 0xea431191, - 0x7e22ef12, 0xea3ce077, - 0x7e21dd73, 0xea36af69, 0x7e20cb85, 0xea307e6a, 0x7e1fb94a, 0xea2a4d78, - 0x7e1ea6c1, 0xea241c93, - 0x7e1d93ea, 0xea1debbb, 0x7e1c80c5, 0xea17baf2, 0x7e1b6d53, 0xea118a35, - 0x7e1a5992, 0xea0b5987, - 0x7e194584, 0xea0528e5, 0x7e183128, 0xe9fef852, 0x7e171c7f, 0xe9f8c7cc, - 0x7e160787, 0xe9f29753, - 0x7e14f242, 0xe9ec66e8, 0x7e13dcaf, 0xe9e6368b, 0x7e12c6ce, 0xe9e0063c, - 0x7e11b0a0, 0xe9d9d5fa, - 0x7e109a24, 0xe9d3a5c5, 0x7e0f835a, 0xe9cd759f, 0x7e0e6c42, 0xe9c74586, - 0x7e0d54dc, 0xe9c1157a, - 0x7e0c3d29, 0xe9bae57d, 0x7e0b2528, 0xe9b4b58d, 0x7e0a0cd9, 0xe9ae85ab, - 0x7e08f43d, 0xe9a855d7, - 0x7e07db52, 0xe9a22610, 0x7e06c21a, 0xe99bf658, 0x7e05a894, 0xe995c6ad, - 0x7e048ec1, 0xe98f9710, - 0x7e0374a0, 0xe9896781, 0x7e025a31, 0xe98337ff, 0x7e013f74, 0xe97d088c, - 0x7e00246a, 0xe976d926, - 0x7dff0911, 0xe970a9ce, 0x7dfded6c, 0xe96a7a85, 0x7dfcd178, 0xe9644b49, - 0x7dfbb537, 0xe95e1c1b, - 0x7dfa98a8, 0xe957ecfb, 0x7df97bcb, 0xe951bde9, 0x7df85ea0, 0xe94b8ee5, - 0x7df74128, 0xe9455fef, - 0x7df62362, 0xe93f3107, 0x7df5054f, 0xe939022d, 0x7df3e6ee, 0xe932d361, - 0x7df2c83f, 0xe92ca4a4, - 0x7df1a942, 0xe92675f4, 0x7df089f8, 0xe9204752, 0x7def6a60, 0xe91a18bf, - 0x7dee4a7a, 0xe913ea39, - 0x7ded2a47, 0xe90dbbc2, 0x7dec09c6, 0xe9078d59, 0x7deae8f7, 0xe9015efe, - 0x7de9c7da, 0xe8fb30b1, - 0x7de8a670, 0xe8f50273, 0x7de784b9, 0xe8eed443, 0x7de662b3, 0xe8e8a621, - 0x7de54060, 0xe8e2780d, - 0x7de41dc0, 0xe8dc4a07, 0x7de2fad1, 0xe8d61c10, 0x7de1d795, 0xe8cfee27, - 0x7de0b40b, 0xe8c9c04c, - 0x7ddf9034, 0xe8c39280, 0x7dde6c0f, 0xe8bd64c2, 0x7ddd479d, 0xe8b73712, - 0x7ddc22dc, 0xe8b10971, - 0x7ddafdce, 0xe8aadbde, 0x7dd9d873, 0xe8a4ae59, 0x7dd8b2ca, 0xe89e80e3, - 0x7dd78cd3, 0xe898537b, - 0x7dd6668f, 0xe8922622, 0x7dd53ffc, 0xe88bf8d7, 0x7dd4191d, 0xe885cb9a, - 0x7dd2f1f0, 0xe87f9e6c, - 0x7dd1ca75, 0xe879714d, 0x7dd0a2ac, 0xe873443c, 0x7dcf7a96, 0xe86d173a, - 0x7dce5232, 0xe866ea46, - 0x7dcd2981, 0xe860bd61, 0x7dcc0082, 0xe85a908a, 0x7dcad736, 0xe85463c2, - 0x7dc9ad9c, 0xe84e3708, - 0x7dc883b4, 0xe8480a5d, 0x7dc7597f, 0xe841ddc1, 0x7dc62efc, 0xe83bb133, - 0x7dc5042b, 0xe83584b4, - 0x7dc3d90d, 0xe82f5844, 0x7dc2ada2, 0xe8292be3, 0x7dc181e8, 0xe822ff90, - 0x7dc055e2, 0xe81cd34b, - 0x7dbf298d, 0xe816a716, 0x7dbdfceb, 0xe8107aef, 0x7dbccffc, 0xe80a4ed7, - 0x7dbba2bf, 0xe80422ce, - 0x7dba7534, 0xe7fdf6d4, 0x7db9475c, 0xe7f7cae8, 0x7db81936, 0xe7f19f0c, - 0x7db6eac3, 0xe7eb733e, - 0x7db5bc02, 0xe7e5477f, 0x7db48cf4, 0xe7df1bcf, 0x7db35d98, 0xe7d8f02d, - 0x7db22def, 0xe7d2c49b, - 0x7db0fdf8, 0xe7cc9917, 0x7dafcdb3, 0xe7c66da3, 0x7dae9d21, 0xe7c0423d, - 0x7dad6c42, 0xe7ba16e7, - 0x7dac3b15, 0xe7b3eb9f, 0x7dab099a, 0xe7adc066, 0x7da9d7d2, 0xe7a7953d, - 0x7da8a5bc, 0xe7a16a22, - 0x7da77359, 0xe79b3f16, 0x7da640a9, 0xe795141a, 0x7da50dab, 0xe78ee92c, - 0x7da3da5f, 0xe788be4e, - 0x7da2a6c6, 0xe782937e, 0x7da172df, 0xe77c68be, 0x7da03eab, 0xe7763e0d, - 0x7d9f0a29, 0xe770136b, - 0x7d9dd55a, 0xe769e8d8, 0x7d9ca03e, 0xe763be55, 0x7d9b6ad3, 0xe75d93e0, - 0x7d9a351c, 0xe757697b, - 0x7d98ff17, 0xe7513f25, 0x7d97c8c4, 0xe74b14de, 0x7d969224, 0xe744eaa6, - 0x7d955b37, 0xe73ec07e, - 0x7d9423fc, 0xe7389665, 0x7d92ec73, 0xe7326c5b, 0x7d91b49e, 0xe72c4260, - 0x7d907c7a, 0xe7261875, - 0x7d8f4409, 0xe71fee99, 0x7d8e0b4b, 0xe719c4cd, 0x7d8cd240, 0xe7139b10, - 0x7d8b98e6, 0xe70d7162, - 0x7d8a5f40, 0xe70747c4, 0x7d89254c, 0xe7011e35, 0x7d87eb0a, 0xe6faf4b5, - 0x7d86b07c, 0xe6f4cb45, - 0x7d85759f, 0xe6eea1e4, 0x7d843a76, 0xe6e87893, 0x7d82fefe, 0xe6e24f51, - 0x7d81c33a, 0xe6dc261f, - 0x7d808728, 0xe6d5fcfc, 0x7d7f4ac8, 0xe6cfd3e9, 0x7d7e0e1c, 0xe6c9aae5, - 0x7d7cd121, 0xe6c381f1, - 0x7d7b93da, 0xe6bd590d, 0x7d7a5645, 0xe6b73038, 0x7d791862, 0xe6b10772, - 0x7d77da32, 0xe6aadebc, - 0x7d769bb5, 0xe6a4b616, 0x7d755cea, 0xe69e8d80, 0x7d741dd2, 0xe69864f9, - 0x7d72de6d, 0xe6923c82, - 0x7d719eba, 0xe68c141a, 0x7d705eba, 0xe685ebc2, 0x7d6f1e6c, 0xe67fc37a, - 0x7d6dddd2, 0xe6799b42, - 0x7d6c9ce9, 0xe6737319, 0x7d6b5bb4, 0xe66d4b01, 0x7d6a1a31, 0xe66722f7, - 0x7d68d860, 0xe660fafe, - 0x7d679642, 0xe65ad315, 0x7d6653d7, 0xe654ab3b, 0x7d65111f, 0xe64e8371, - 0x7d63ce19, 0xe6485bb7, - 0x7d628ac6, 0xe642340d, 0x7d614725, 0xe63c0c73, 0x7d600338, 0xe635e4e9, - 0x7d5ebefc, 0xe62fbd6e, - 0x7d5d7a74, 0xe6299604, 0x7d5c359e, 0xe6236ea9, 0x7d5af07b, 0xe61d475e, - 0x7d59ab0a, 0xe6172024, - 0x7d58654d, 0xe610f8f9, 0x7d571f41, 0xe60ad1de, 0x7d55d8e9, 0xe604aad4, - 0x7d549243, 0xe5fe83d9, - 0x7d534b50, 0xe5f85cef, 0x7d520410, 0xe5f23614, 0x7d50bc82, 0xe5ec0f4a, - 0x7d4f74a7, 0xe5e5e88f, - 0x7d4e2c7f, 0xe5dfc1e5, 0x7d4ce409, 0xe5d99b4b, 0x7d4b9b46, 0xe5d374c1, - 0x7d4a5236, 0xe5cd4e47, - 0x7d4908d9, 0xe5c727dd, 0x7d47bf2e, 0xe5c10184, 0x7d467536, 0xe5badb3a, - 0x7d452af1, 0xe5b4b501, - 0x7d43e05e, 0xe5ae8ed8, 0x7d42957e, 0xe5a868bf, 0x7d414a51, 0xe5a242b7, - 0x7d3ffed7, 0xe59c1cbf, - 0x7d3eb30f, 0xe595f6d7, 0x7d3d66fa, 0xe58fd0ff, 0x7d3c1a98, 0xe589ab38, - 0x7d3acde9, 0xe5838581, - 0x7d3980ec, 0xe57d5fda, 0x7d3833a2, 0xe5773a44, 0x7d36e60b, 0xe57114be, - 0x7d359827, 0xe56aef49, - 0x7d3449f5, 0xe564c9e3, 0x7d32fb76, 0xe55ea48f, 0x7d31acaa, 0xe5587f4a, - 0x7d305d91, 0xe5525a17, - 0x7d2f0e2b, 0xe54c34f3, 0x7d2dbe77, 0xe5460fe0, 0x7d2c6e76, 0xe53feade, - 0x7d2b1e28, 0xe539c5ec, - 0x7d29cd8c, 0xe533a10a, 0x7d287ca4, 0xe52d7c39, 0x7d272b6e, 0xe5275779, - 0x7d25d9eb, 0xe52132c9, - 0x7d24881b, 0xe51b0e2a, 0x7d2335fe, 0xe514e99b, 0x7d21e393, 0xe50ec51d, - 0x7d2090db, 0xe508a0b0, - 0x7d1f3dd6, 0xe5027c53, 0x7d1dea84, 0xe4fc5807, 0x7d1c96e5, 0xe4f633cc, - 0x7d1b42f9, 0xe4f00fa1, - 0x7d19eebf, 0xe4e9eb87, 0x7d189a38, 0xe4e3c77d, 0x7d174564, 0xe4dda385, - 0x7d15f043, 0xe4d77f9d, - 0x7d149ad5, 0xe4d15bc6, 0x7d134519, 0xe4cb37ff, 0x7d11ef11, 0xe4c5144a, - 0x7d1098bb, 0xe4bef0a5, - 0x7d0f4218, 0xe4b8cd11, 0x7d0deb28, 0xe4b2a98e, 0x7d0c93eb, 0xe4ac861b, - 0x7d0b3c60, 0xe4a662ba, - 0x7d09e489, 0xe4a03f69, 0x7d088c64, 0xe49a1c29, 0x7d0733f3, 0xe493f8fb, - 0x7d05db34, 0xe48dd5dd, - 0x7d048228, 0xe487b2d0, 0x7d0328cf, 0xe4818fd4, 0x7d01cf29, 0xe47b6ce9, - 0x7d007535, 0xe4754a0e, - 0x7cff1af5, 0xe46f2745, 0x7cfdc068, 0xe469048d, 0x7cfc658d, 0xe462e1e6, - 0x7cfb0a65, 0xe45cbf50, - 0x7cf9aef0, 0xe4569ccb, 0x7cf8532f, 0xe4507a57, 0x7cf6f720, 0xe44a57f4, - 0x7cf59ac4, 0xe44435a2, - 0x7cf43e1a, 0xe43e1362, 0x7cf2e124, 0xe437f132, 0x7cf183e1, 0xe431cf14, - 0x7cf02651, 0xe42bad07, - 0x7ceec873, 0xe4258b0a, 0x7ced6a49, 0xe41f6920, 0x7cec0bd1, 0xe4194746, - 0x7ceaad0c, 0xe413257d, - 0x7ce94dfb, 0xe40d03c6, 0x7ce7ee9c, 0xe406e220, 0x7ce68ef0, 0xe400c08b, - 0x7ce52ef7, 0xe3fa9f08, - 0x7ce3ceb2, 0xe3f47d96, 0x7ce26e1f, 0xe3ee5c35, 0x7ce10d3f, 0xe3e83ae5, - 0x7cdfac12, 0xe3e219a7, - 0x7cde4a98, 0xe3dbf87a, 0x7cdce8d1, 0xe3d5d75e, 0x7cdb86bd, 0xe3cfb654, - 0x7cda245c, 0xe3c9955b, - 0x7cd8c1ae, 0xe3c37474, 0x7cd75eb3, 0xe3bd539e, 0x7cd5fb6a, 0xe3b732d9, - 0x7cd497d5, 0xe3b11226, - 0x7cd333f3, 0xe3aaf184, 0x7cd1cfc4, 0xe3a4d0f4, 0x7cd06b48, 0xe39eb075, - 0x7ccf067f, 0xe3989008, - 0x7ccda169, 0xe3926fad, 0x7ccc3c06, 0xe38c4f63, 0x7ccad656, 0xe3862f2a, - 0x7cc97059, 0xe3800f03, - 0x7cc80a0f, 0xe379eeed, 0x7cc6a378, 0xe373ceea, 0x7cc53c94, 0xe36daef7, - 0x7cc3d563, 0xe3678f17, - 0x7cc26de5, 0xe3616f48, 0x7cc1061a, 0xe35b4f8b, 0x7cbf9e03, 0xe3552fdf, - 0x7cbe359e, 0xe34f1045, - 0x7cbcccec, 0xe348f0bd, 0x7cbb63ee, 0xe342d146, 0x7cb9faa2, 0xe33cb1e1, - 0x7cb8910a, 0xe336928e, - 0x7cb72724, 0xe330734d, 0x7cb5bcf2, 0xe32a541d, 0x7cb45272, 0xe3243500, - 0x7cb2e7a6, 0xe31e15f4, - 0x7cb17c8d, 0xe317f6fa, 0x7cb01127, 0xe311d811, 0x7caea574, 0xe30bb93b, - 0x7cad3974, 0xe3059a76, - 0x7cabcd28, 0xe2ff7bc3, 0x7caa608e, 0xe2f95d23, 0x7ca8f3a7, 0xe2f33e94, - 0x7ca78674, 0xe2ed2017, - 0x7ca618f3, 0xe2e701ac, 0x7ca4ab26, 0xe2e0e352, 0x7ca33d0c, 0xe2dac50b, - 0x7ca1cea5, 0xe2d4a6d6, - 0x7ca05ff1, 0xe2ce88b3, 0x7c9ef0f0, 0xe2c86aa2, 0x7c9d81a3, 0xe2c24ca2, - 0x7c9c1208, 0xe2bc2eb5, - 0x7c9aa221, 0xe2b610da, 0x7c9931ec, 0xe2aff311, 0x7c97c16b, 0xe2a9d55a, - 0x7c96509d, 0xe2a3b7b5, - 0x7c94df83, 0xe29d9a23, 0x7c936e1b, 0xe2977ca2, 0x7c91fc66, 0xe2915f34, - 0x7c908a65, 0xe28b41d7, - 0x7c8f1817, 0xe285248d, 0x7c8da57c, 0xe27f0755, 0x7c8c3294, 0xe278ea30, - 0x7c8abf5f, 0xe272cd1c, - 0x7c894bde, 0xe26cb01b, 0x7c87d810, 0xe266932c, 0x7c8663f4, 0xe260764f, - 0x7c84ef8c, 0xe25a5984, - 0x7c837ad8, 0xe2543ccc, 0x7c8205d6, 0xe24e2026, 0x7c809088, 0xe2480393, - 0x7c7f1aed, 0xe241e711, - 0x7c7da505, 0xe23bcaa2, 0x7c7c2ed0, 0xe235ae46, 0x7c7ab84e, 0xe22f91fc, - 0x7c794180, 0xe22975c4, - 0x7c77ca65, 0xe223599e, 0x7c7652fd, 0xe21d3d8b, 0x7c74db48, 0xe217218b, - 0x7c736347, 0xe211059d, - 0x7c71eaf9, 0xe20ae9c1, 0x7c70725e, 0xe204cdf8, 0x7c6ef976, 0xe1feb241, - 0x7c6d8041, 0xe1f8969d, - 0x7c6c06c0, 0xe1f27b0b, 0x7c6a8cf2, 0xe1ec5f8c, 0x7c6912d7, 0xe1e64420, - 0x7c679870, 0xe1e028c6, - 0x7c661dbc, 0xe1da0d7e, 0x7c64a2bb, 0xe1d3f24a, 0x7c63276d, 0xe1cdd727, - 0x7c61abd3, 0xe1c7bc18, - 0x7c602fec, 0xe1c1a11b, 0x7c5eb3b8, 0xe1bb8631, 0x7c5d3737, 0xe1b56b59, - 0x7c5bba6a, 0xe1af5094, - 0x7c5a3d50, 0xe1a935e2, 0x7c58bfe9, 0xe1a31b42, 0x7c574236, 0xe19d00b6, - 0x7c55c436, 0xe196e63c, - 0x7c5445e9, 0xe190cbd4, 0x7c52c74f, 0xe18ab180, 0x7c514869, 0xe184973e, - 0x7c4fc936, 0xe17e7d0f, - 0x7c4e49b7, 0xe17862f3, 0x7c4cc9ea, 0xe17248ea, 0x7c4b49d2, 0xe16c2ef4, - 0x7c49c96c, 0xe1661510, - 0x7c4848ba, 0xe15ffb3f, 0x7c46c7bb, 0xe159e182, 0x7c45466f, 0xe153c7d7, - 0x7c43c4d7, 0xe14dae3f, - 0x7c4242f2, 0xe14794ba, 0x7c40c0c1, 0xe1417b48, 0x7c3f3e42, 0xe13b61e9, - 0x7c3dbb78, 0xe135489d, - 0x7c3c3860, 0xe12f2f63, 0x7c3ab4fc, 0xe129163d, 0x7c39314b, 0xe122fd2a, - 0x7c37ad4e, 0xe11ce42a, - 0x7c362904, 0xe116cb3d, 0x7c34a46d, 0xe110b263, 0x7c331f8a, 0xe10a999c, - 0x7c319a5a, 0xe10480e9, - 0x7c3014de, 0xe0fe6848, 0x7c2e8f15, 0xe0f84fbb, 0x7c2d08ff, 0xe0f23740, - 0x7c2b829d, 0xe0ec1ed9, - 0x7c29fbee, 0xe0e60685, 0x7c2874f3, 0xe0dfee44, 0x7c26edab, 0xe0d9d616, - 0x7c256616, 0xe0d3bdfc, - 0x7c23de35, 0xe0cda5f5, 0x7c225607, 0xe0c78e01, 0x7c20cd8d, 0xe0c17620, - 0x7c1f44c6, 0xe0bb5e53, - 0x7c1dbbb3, 0xe0b54698, 0x7c1c3253, 0xe0af2ef2, 0x7c1aa8a6, 0xe0a9175e, - 0x7c191ead, 0xe0a2ffde, - 0x7c179467, 0xe09ce871, 0x7c1609d5, 0xe096d117, 0x7c147ef6, 0xe090b9d1, - 0x7c12f3cb, 0xe08aa29f, - 0x7c116853, 0xe0848b7f, 0x7c0fdc8f, 0xe07e7473, 0x7c0e507e, 0xe0785d7b, - 0x7c0cc421, 0xe0724696, - 0x7c0b3777, 0xe06c2fc4, 0x7c09aa80, 0xe0661906, 0x7c081d3d, 0xe060025c, - 0x7c068fae, 0xe059ebc5, - 0x7c0501d2, 0xe053d541, 0x7c0373a9, 0xe04dbed1, 0x7c01e534, 0xe047a875, - 0x7c005673, 0xe041922c, - 0x7bfec765, 0xe03b7bf6, 0x7bfd380a, 0xe03565d5, 0x7bfba863, 0xe02f4fc6, - 0x7bfa1870, 0xe02939cc, - 0x7bf88830, 0xe02323e5, 0x7bf6f7a4, 0xe01d0e12, 0x7bf566cb, 0xe016f852, - 0x7bf3d5a6, 0xe010e2a7, - 0x7bf24434, 0xe00acd0e, 0x7bf0b276, 0xe004b78a, 0x7bef206b, 0xdffea219, - 0x7bed8e14, 0xdff88cbc, - 0x7bebfb70, 0xdff27773, 0x7bea6880, 0xdfec623e, 0x7be8d544, 0xdfe64d1c, - 0x7be741bb, 0xdfe0380e, - 0x7be5ade6, 0xdfda2314, 0x7be419c4, 0xdfd40e2e, 0x7be28556, 0xdfcdf95c, - 0x7be0f09b, 0xdfc7e49d, - 0x7bdf5b94, 0xdfc1cff3, 0x7bddc641, 0xdfbbbb5c, 0x7bdc30a1, 0xdfb5a6d9, - 0x7bda9ab5, 0xdfaf926a, - 0x7bd9047c, 0xdfa97e0f, 0x7bd76df7, 0xdfa369c8, 0x7bd5d726, 0xdf9d5595, - 0x7bd44008, 0xdf974176, - 0x7bd2a89e, 0xdf912d6b, 0x7bd110e8, 0xdf8b1974, 0x7bcf78e5, 0xdf850591, - 0x7bcde095, 0xdf7ef1c2, - 0x7bcc47fa, 0xdf78de07, 0x7bcaaf12, 0xdf72ca60, 0x7bc915dd, 0xdf6cb6cd, - 0x7bc77c5d, 0xdf66a34e, - 0x7bc5e290, 0xdf608fe4, 0x7bc44876, 0xdf5a7c8d, 0x7bc2ae10, 0xdf54694b, - 0x7bc1135e, 0xdf4e561c, - 0x7bbf7860, 0xdf484302, 0x7bbddd15, 0xdf422ffd, 0x7bbc417e, 0xdf3c1d0b, - 0x7bbaa59a, 0xdf360a2d, - 0x7bb9096b, 0xdf2ff764, 0x7bb76cef, 0xdf29e4af, 0x7bb5d026, 0xdf23d20e, - 0x7bb43311, 0xdf1dbf82, - 0x7bb295b0, 0xdf17ad0a, 0x7bb0f803, 0xdf119aa6, 0x7baf5a09, 0xdf0b8856, - 0x7badbbc3, 0xdf05761b, - 0x7bac1d31, 0xdeff63f4, 0x7baa7e53, 0xdef951e2, 0x7ba8df28, 0xdef33fe3, - 0x7ba73fb1, 0xdeed2dfa, - 0x7ba59fee, 0xdee71c24, 0x7ba3ffde, 0xdee10a63, 0x7ba25f82, 0xdedaf8b7, - 0x7ba0beda, 0xded4e71f, - 0x7b9f1de6, 0xdeced59b, 0x7b9d7ca5, 0xdec8c42c, 0x7b9bdb18, 0xdec2b2d1, - 0x7b9a393f, 0xdebca18b, - 0x7b989719, 0xdeb69059, 0x7b96f4a8, 0xdeb07f3c, 0x7b9551ea, 0xdeaa6e34, - 0x7b93aee0, 0xdea45d40, - 0x7b920b89, 0xde9e4c60, 0x7b9067e7, 0xde983b95, 0x7b8ec3f8, 0xde922adf, - 0x7b8d1fbd, 0xde8c1a3e, - 0x7b8b7b36, 0xde8609b1, 0x7b89d662, 0xde7ff938, 0x7b883143, 0xde79e8d5, - 0x7b868bd7, 0xde73d886, - 0x7b84e61f, 0xde6dc84b, 0x7b83401b, 0xde67b826, 0x7b8199ca, 0xde61a815, - 0x7b7ff32e, 0xde5b9819, - 0x7b7e4c45, 0xde558831, 0x7b7ca510, 0xde4f785f, 0x7b7afd8f, 0xde4968a1, - 0x7b7955c2, 0xde4358f8, - 0x7b77ada8, 0xde3d4964, 0x7b760542, 0xde3739e4, 0x7b745c91, 0xde312a7a, - 0x7b72b393, 0xde2b1b24, - 0x7b710a49, 0xde250be3, 0x7b6f60b2, 0xde1efcb7, 0x7b6db6d0, 0xde18eda0, - 0x7b6c0ca2, 0xde12de9e, - 0x7b6a6227, 0xde0ccfb1, 0x7b68b760, 0xde06c0d9, 0x7b670c4d, 0xde00b216, - 0x7b6560ee, 0xddfaa367, - 0x7b63b543, 0xddf494ce, 0x7b62094c, 0xddee8649, 0x7b605d09, 0xdde877da, - 0x7b5eb079, 0xdde26980, - 0x7b5d039e, 0xdddc5b3b, 0x7b5b5676, 0xddd64d0a, 0x7b59a902, 0xddd03eef, - 0x7b57fb42, 0xddca30e9, - 0x7b564d36, 0xddc422f8, 0x7b549ede, 0xddbe151d, 0x7b52f03a, 0xddb80756, - 0x7b51414a, 0xddb1f9a4, - 0x7b4f920e, 0xddabec08, 0x7b4de286, 0xdda5de81, 0x7b4c32b1, 0xdd9fd10f, - 0x7b4a8291, 0xdd99c3b2, - 0x7b48d225, 0xdd93b66a, 0x7b47216c, 0xdd8da938, 0x7b457068, 0xdd879c1b, - 0x7b43bf17, 0xdd818f13, - 0x7b420d7a, 0xdd7b8220, 0x7b405b92, 0xdd757543, 0x7b3ea95d, 0xdd6f687b, - 0x7b3cf6dc, 0xdd695bc9, - 0x7b3b4410, 0xdd634f2b, 0x7b3990f7, 0xdd5d42a3, 0x7b37dd92, 0xdd573631, - 0x7b3629e1, 0xdd5129d4, - 0x7b3475e5, 0xdd4b1d8c, 0x7b32c19c, 0xdd451159, 0x7b310d07, 0xdd3f053c, - 0x7b2f5826, 0xdd38f935, - 0x7b2da2fa, 0xdd32ed43, 0x7b2bed81, 0xdd2ce166, 0x7b2a37bc, 0xdd26d59f, - 0x7b2881ac, 0xdd20c9ed, - 0x7b26cb4f, 0xdd1abe51, 0x7b2514a6, 0xdd14b2ca, 0x7b235db2, 0xdd0ea759, - 0x7b21a671, 0xdd089bfe, - 0x7b1feee5, 0xdd0290b8, 0x7b1e370d, 0xdcfc8588, 0x7b1c7ee8, 0xdcf67a6d, - 0x7b1ac678, 0xdcf06f68, - 0x7b190dbc, 0xdcea6478, 0x7b1754b3, 0xdce4599e, 0x7b159b5f, 0xdcde4eda, - 0x7b13e1bf, 0xdcd8442b, - 0x7b1227d3, 0xdcd23993, 0x7b106d9b, 0xdccc2f0f, 0x7b0eb318, 0xdcc624a2, - 0x7b0cf848, 0xdcc01a4a, - 0x7b0b3d2c, 0xdcba1008, 0x7b0981c5, 0xdcb405dc, 0x7b07c612, 0xdcadfbc5, - 0x7b060a12, 0xdca7f1c5, - 0x7b044dc7, 0xdca1e7da, 0x7b029130, 0xdc9bde05, 0x7b00d44d, 0xdc95d446, - 0x7aff171e, 0xdc8fca9c, - 0x7afd59a4, 0xdc89c109, 0x7afb9bdd, 0xdc83b78b, 0x7af9ddcb, 0xdc7dae23, - 0x7af81f6c, 0xdc77a4d2, - 0x7af660c2, 0xdc719b96, 0x7af4a1cc, 0xdc6b9270, 0x7af2e28b, 0xdc658960, - 0x7af122fd, 0xdc5f8066, - 0x7aef6323, 0xdc597781, 0x7aeda2fe, 0xdc536eb3, 0x7aebe28d, 0xdc4d65fb, - 0x7aea21d0, 0xdc475d59, - 0x7ae860c7, 0xdc4154cd, 0x7ae69f73, 0xdc3b4c57, 0x7ae4ddd2, 0xdc3543f7, - 0x7ae31be6, 0xdc2f3bad, - 0x7ae159ae, 0xdc293379, 0x7adf972a, 0xdc232b5c, 0x7addd45b, 0xdc1d2354, - 0x7adc113f, 0xdc171b63, - 0x7ada4dd8, 0xdc111388, 0x7ad88a25, 0xdc0b0bc2, 0x7ad6c626, 0xdc050414, - 0x7ad501dc, 0xdbfefc7b, - 0x7ad33d45, 0xdbf8f4f8, 0x7ad17863, 0xdbf2ed8c, 0x7acfb336, 0xdbece636, - 0x7acdedbc, 0xdbe6def6, - 0x7acc27f7, 0xdbe0d7cd, 0x7aca61e6, 0xdbdad0b9, 0x7ac89b89, 0xdbd4c9bc, - 0x7ac6d4e0, 0xdbcec2d6, - 0x7ac50dec, 0xdbc8bc06, 0x7ac346ac, 0xdbc2b54c, 0x7ac17f20, 0xdbbcaea8, - 0x7abfb749, 0xdbb6a81b, - 0x7abdef25, 0xdbb0a1a4, 0x7abc26b7, 0xdbaa9b43, 0x7aba5dfc, 0xdba494f9, - 0x7ab894f6, 0xdb9e8ec6, - 0x7ab6cba4, 0xdb9888a8, 0x7ab50206, 0xdb9282a2, 0x7ab3381d, 0xdb8c7cb1, - 0x7ab16de7, 0xdb8676d8, - 0x7aafa367, 0xdb807114, 0x7aadd89a, 0xdb7a6b68, 0x7aac0d82, 0xdb7465d1, - 0x7aaa421e, 0xdb6e6052, - 0x7aa8766f, 0xdb685ae9, 0x7aa6aa74, 0xdb625596, 0x7aa4de2d, 0xdb5c505a, - 0x7aa3119a, 0xdb564b35, - 0x7aa144bc, 0xdb504626, 0x7a9f7793, 0xdb4a412e, 0x7a9daa1d, 0xdb443c4c, - 0x7a9bdc5c, 0xdb3e3781, - 0x7a9a0e50, 0xdb3832cd, 0x7a983ff7, 0xdb322e30, 0x7a967153, 0xdb2c29a9, - 0x7a94a264, 0xdb262539, - 0x7a92d329, 0xdb2020e0, 0x7a9103a2, 0xdb1a1c9d, 0x7a8f33d0, 0xdb141871, - 0x7a8d63b2, 0xdb0e145c, - 0x7a8b9348, 0xdb08105e, 0x7a89c293, 0xdb020c77, 0x7a87f192, 0xdafc08a6, - 0x7a862046, 0xdaf604ec, - 0x7a844eae, 0xdaf00149, 0x7a827ccb, 0xdae9fdbd, 0x7a80aa9c, 0xdae3fa48, - 0x7a7ed821, 0xdaddf6ea, - 0x7a7d055b, 0xdad7f3a2, 0x7a7b3249, 0xdad1f072, 0x7a795eec, 0xdacbed58, - 0x7a778b43, 0xdac5ea56, - 0x7a75b74f, 0xdabfe76a, 0x7a73e30f, 0xdab9e495, 0x7a720e84, 0xdab3e1d8, - 0x7a7039ad, 0xdaaddf31, - 0x7a6e648a, 0xdaa7dca1, 0x7a6c8f1c, 0xdaa1da29, 0x7a6ab963, 0xda9bd7c7, - 0x7a68e35e, 0xda95d57d, - 0x7a670d0d, 0xda8fd349, 0x7a653671, 0xda89d12d, 0x7a635f8a, 0xda83cf28, - 0x7a618857, 0xda7dcd3a, - 0x7a5fb0d8, 0xda77cb63, 0x7a5dd90e, 0xda71c9a3, 0x7a5c00f9, 0xda6bc7fa, - 0x7a5a2898, 0xda65c669, - 0x7a584feb, 0xda5fc4ef, 0x7a5676f3, 0xda59c38c, 0x7a549db0, 0xda53c240, - 0x7a52c421, 0xda4dc10b, - 0x7a50ea47, 0xda47bfee, 0x7a4f1021, 0xda41bee8, 0x7a4d35b0, 0xda3bbdf9, - 0x7a4b5af3, 0xda35bd22, - 0x7a497feb, 0xda2fbc61, 0x7a47a498, 0xda29bbb9, 0x7a45c8f9, 0xda23bb27, - 0x7a43ed0e, 0xda1dbaad, - 0x7a4210d8, 0xda17ba4a, 0x7a403457, 0xda11b9ff, 0x7a3e578b, 0xda0bb9cb, - 0x7a3c7a73, 0xda05b9ae, - 0x7a3a9d0f, 0xd9ffb9a9, 0x7a38bf60, 0xd9f9b9bb, 0x7a36e166, 0xd9f3b9e5, - 0x7a350321, 0xd9edba26, - 0x7a332490, 0xd9e7ba7f, 0x7a3145b3, 0xd9e1baef, 0x7a2f668c, 0xd9dbbb77, - 0x7a2d8719, 0xd9d5bc16, - 0x7a2ba75a, 0xd9cfbccd, 0x7a29c750, 0xd9c9bd9b, 0x7a27e6fb, 0xd9c3be81, - 0x7a26065b, 0xd9bdbf7e, - 0x7a24256f, 0xd9b7c094, 0x7a224437, 0xd9b1c1c0, 0x7a2062b5, 0xd9abc305, - 0x7a1e80e7, 0xd9a5c461, - 0x7a1c9ece, 0xd99fc5d4, 0x7a1abc69, 0xd999c75f, 0x7a18d9b9, 0xd993c902, - 0x7a16f6be, 0xd98dcabd, - 0x7a151378, 0xd987cc90, 0x7a132fe6, 0xd981ce7a, 0x7a114c09, 0xd97bd07c, - 0x7a0f67e0, 0xd975d295, - 0x7a0d836d, 0xd96fd4c7, 0x7a0b9eae, 0xd969d710, 0x7a09b9a4, 0xd963d971, - 0x7a07d44e, 0xd95ddbea, - 0x7a05eead, 0xd957de7a, 0x7a0408c1, 0xd951e123, 0x7a02228a, 0xd94be3e3, - 0x7a003c07, 0xd945e6bb, - 0x79fe5539, 0xd93fe9ab, 0x79fc6e20, 0xd939ecb3, 0x79fa86bc, 0xd933efd3, - 0x79f89f0c, 0xd92df30b, - 0x79f6b711, 0xd927f65b, 0x79f4cecb, 0xd921f9c3, 0x79f2e63a, 0xd91bfd43, - 0x79f0fd5d, 0xd91600da, - 0x79ef1436, 0xd910048a, 0x79ed2ac3, 0xd90a0852, 0x79eb4105, 0xd9040c32, - 0x79e956fb, 0xd8fe1029, - 0x79e76ca7, 0xd8f81439, 0x79e58207, 0xd8f21861, 0x79e3971c, 0xd8ec1ca1, - 0x79e1abe6, 0xd8e620fa, - 0x79dfc064, 0xd8e0256a, 0x79ddd498, 0xd8da29f2, 0x79dbe880, 0xd8d42e93, - 0x79d9fc1d, 0xd8ce334c, - 0x79d80f6f, 0xd8c8381d, 0x79d62276, 0xd8c23d06, 0x79d43532, 0xd8bc4207, - 0x79d247a2, 0xd8b64720, - 0x79d059c8, 0xd8b04c52, 0x79ce6ba2, 0xd8aa519c, 0x79cc7d31, 0xd8a456ff, - 0x79ca8e75, 0xd89e5c79, - 0x79c89f6e, 0xd898620c, 0x79c6b01b, 0xd89267b7, 0x79c4c07e, 0xd88c6d7b, - 0x79c2d095, 0xd8867356, - 0x79c0e062, 0xd880794b, 0x79beefe3, 0xd87a7f57, 0x79bcff19, 0xd874857c, - 0x79bb0e04, 0xd86e8bb9, - 0x79b91ca4, 0xd868920f, 0x79b72af9, 0xd862987d, 0x79b53903, 0xd85c9f04, - 0x79b346c2, 0xd856a5a3, - 0x79b15435, 0xd850ac5a, 0x79af615e, 0xd84ab32a, 0x79ad6e3c, 0xd844ba13, - 0x79ab7ace, 0xd83ec114, - 0x79a98715, 0xd838c82d, 0x79a79312, 0xd832cf5f, 0x79a59ec3, 0xd82cd6aa, - 0x79a3aa29, 0xd826de0d, - 0x79a1b545, 0xd820e589, 0x799fc015, 0xd81aed1d, 0x799dca9a, 0xd814f4ca, - 0x799bd4d4, 0xd80efc8f, - 0x7999dec4, 0xd809046e, 0x7997e868, 0xd8030c64, 0x7995f1c1, 0xd7fd1474, - 0x7993facf, 0xd7f71c9c, - 0x79920392, 0xd7f124dd, 0x79900c0a, 0xd7eb2d37, 0x798e1438, 0xd7e535a9, - 0x798c1c1a, 0xd7df3e34, - 0x798a23b1, 0xd7d946d8, 0x79882afd, 0xd7d34f94, 0x798631ff, 0xd7cd586a, - 0x798438b5, 0xd7c76158, - 0x79823f20, 0xd7c16a5f, 0x79804541, 0xd7bb737f, 0x797e4b16, 0xd7b57cb7, - 0x797c50a1, 0xd7af8609, - 0x797a55e0, 0xd7a98f73, 0x79785ad5, 0xd7a398f6, 0x79765f7f, 0xd79da293, - 0x797463de, 0xd797ac48, - 0x797267f2, 0xd791b616, 0x79706bbb, 0xd78bbffc, 0x796e6f39, 0xd785c9fc, - 0x796c726c, 0xd77fd415, - 0x796a7554, 0xd779de47, 0x796877f1, 0xd773e892, 0x79667a44, 0xd76df2f6, - 0x79647c4c, 0xd767fd72, - 0x79627e08, 0xd7620808, 0x79607f7a, 0xd75c12b7, 0x795e80a1, 0xd7561d7f, - 0x795c817d, 0xd7502860, - 0x795a820e, 0xd74a335b, 0x79588255, 0xd7443e6e, 0x79568250, 0xd73e499a, - 0x79548201, 0xd73854e0, - 0x79528167, 0xd732603f, 0x79508082, 0xd72c6bb6, 0x794e7f52, 0xd7267748, - 0x794c7dd7, 0xd72082f2, - 0x794a7c12, 0xd71a8eb5, 0x79487a01, 0xd7149a92, 0x794677a6, 0xd70ea688, - 0x79447500, 0xd708b297, - 0x79427210, 0xd702bec0, 0x79406ed4, 0xd6fccb01, 0x793e6b4e, 0xd6f6d75d, - 0x793c677d, 0xd6f0e3d1, - 0x793a6361, 0xd6eaf05f, 0x79385efa, 0xd6e4fd06, 0x79365a49, 0xd6df09c6, - 0x7934554d, 0xd6d916a0, - 0x79325006, 0xd6d32393, 0x79304a74, 0xd6cd30a0, 0x792e4497, 0xd6c73dc6, - 0x792c3e70, 0xd6c14b05, - 0x792a37fe, 0xd6bb585e, 0x79283141, 0xd6b565d0, 0x79262a3a, 0xd6af735c, - 0x792422e8, 0xd6a98101, - 0x79221b4b, 0xd6a38ec0, 0x79201363, 0xd69d9c98, 0x791e0b31, 0xd697aa8a, - 0x791c02b4, 0xd691b895, - 0x7919f9ec, 0xd68bc6ba, 0x7917f0d9, 0xd685d4f9, 0x7915e77c, 0xd67fe351, - 0x7913ddd4, 0xd679f1c2, - 0x7911d3e2, 0xd674004e, 0x790fc9a4, 0xd66e0ef2, 0x790dbf1d, 0xd6681db1, - 0x790bb44a, 0xd6622c89, - 0x7909a92d, 0xd65c3b7b, 0x79079dc5, 0xd6564a87, 0x79059212, 0xd65059ac, - 0x79038615, 0xd64a68eb, - 0x790179cd, 0xd6447844, 0x78ff6d3b, 0xd63e87b6, 0x78fd605d, 0xd6389742, - 0x78fb5336, 0xd632a6e8, - 0x78f945c3, 0xd62cb6a8, 0x78f73806, 0xd626c681, 0x78f529fe, 0xd620d675, - 0x78f31bac, 0xd61ae682, - 0x78f10d0f, 0xd614f6a9, 0x78eefe28, 0xd60f06ea, 0x78eceef6, 0xd6091745, - 0x78eadf79, 0xd60327b9, - 0x78e8cfb2, 0xd5fd3848, 0x78e6bfa0, 0xd5f748f0, 0x78e4af44, 0xd5f159b3, - 0x78e29e9d, 0xd5eb6a8f, - 0x78e08dab, 0xd5e57b85, 0x78de7c6f, 0xd5df8c96, 0x78dc6ae8, 0xd5d99dc0, - 0x78da5917, 0xd5d3af04, - 0x78d846fb, 0xd5cdc062, 0x78d63495, 0xd5c7d1db, 0x78d421e4, 0xd5c1e36d, - 0x78d20ee9, 0xd5bbf519, - 0x78cffba3, 0xd5b606e0, 0x78cde812, 0xd5b018c0, 0x78cbd437, 0xd5aa2abb, - 0x78c9c012, 0xd5a43cd0, - 0x78c7aba2, 0xd59e4eff, 0x78c596e7, 0xd5986148, 0x78c381e2, 0xd59273ab, - 0x78c16c93, 0xd58c8628, - 0x78bf56f9, 0xd58698c0, 0x78bd4114, 0xd580ab72, 0x78bb2ae5, 0xd57abe3d, - 0x78b9146c, 0xd574d124, - 0x78b6fda8, 0xd56ee424, 0x78b4e69a, 0xd568f73f, 0x78b2cf41, 0xd5630a74, - 0x78b0b79e, 0xd55d1dc3, - 0x78ae9fb0, 0xd557312d, 0x78ac8778, 0xd55144b0, 0x78aa6ef5, 0xd54b584f, - 0x78a85628, 0xd5456c07, - 0x78a63d11, 0xd53f7fda, 0x78a423af, 0xd53993c7, 0x78a20a03, 0xd533a7cf, - 0x789ff00c, 0xd52dbbf1, - 0x789dd5cb, 0xd527d02e, 0x789bbb3f, 0xd521e484, 0x7899a06a, 0xd51bf8f6, - 0x78978549, 0xd5160d82, - 0x789569df, 0xd5102228, 0x78934e2a, 0xd50a36e9, 0x7891322a, 0xd5044bc4, - 0x788f15e0, 0xd4fe60ba, - 0x788cf94c, 0xd4f875ca, 0x788adc6e, 0xd4f28af5, 0x7888bf45, 0xd4eca03a, - 0x7886a1d1, 0xd4e6b59a, - 0x78848414, 0xd4e0cb15, 0x7882660c, 0xd4dae0aa, 0x788047ba, 0xd4d4f65a, - 0x787e291d, 0xd4cf0c24, - 0x787c0a36, 0xd4c92209, 0x7879eb05, 0xd4c33809, 0x7877cb89, 0xd4bd4e23, - 0x7875abc3, 0xd4b76458, - 0x78738bb3, 0xd4b17aa8, 0x78716b59, 0xd4ab9112, 0x786f4ab4, 0xd4a5a798, - 0x786d29c5, 0xd49fbe37, - 0x786b088c, 0xd499d4f2, 0x7868e708, 0xd493ebc8, 0x7866c53a, 0xd48e02b8, - 0x7864a322, 0xd48819c3, - 0x786280bf, 0xd48230e9, 0x78605e13, 0xd47c4829, 0x785e3b1c, 0xd4765f85, - 0x785c17db, 0xd47076fb, - 0x7859f44f, 0xd46a8e8d, 0x7857d079, 0xd464a639, 0x7855ac5a, 0xd45ebe00, - 0x785387ef, 0xd458d5e2, - 0x7851633b, 0xd452eddf, 0x784f3e3c, 0xd44d05f6, 0x784d18f4, 0xd4471e29, - 0x784af361, 0xd4413677, - 0x7848cd83, 0xd43b4ee0, 0x7846a75c, 0xd4356763, 0x784480ea, 0xd42f8002, - 0x78425a2f, 0xd42998bc, - 0x78403329, 0xd423b191, 0x783e0bd9, 0xd41dca81, 0x783be43e, 0xd417e38c, - 0x7839bc5a, 0xd411fcb2, - 0x7837942b, 0xd40c15f3, 0x78356bb2, 0xd4062f4f, 0x783342ef, 0xd40048c6, - 0x783119e2, 0xd3fa6259, - 0x782ef08b, 0xd3f47c06, 0x782cc6ea, 0xd3ee95cf, 0x782a9cfe, 0xd3e8afb3, - 0x782872c8, 0xd3e2c9b2, - 0x78264849, 0xd3dce3cd, 0x78241d7f, 0xd3d6fe03, 0x7821f26b, 0xd3d11853, - 0x781fc70d, 0xd3cb32c0, - 0x781d9b65, 0xd3c54d47, 0x781b6f72, 0xd3bf67ea, 0x78194336, 0xd3b982a8, - 0x781716b0, 0xd3b39d81, - 0x7814e9df, 0xd3adb876, 0x7812bcc4, 0xd3a7d385, 0x78108f60, 0xd3a1eeb1, - 0x780e61b1, 0xd39c09f7, - 0x780c33b8, 0xd396255a, 0x780a0575, 0xd39040d7, 0x7807d6e9, 0xd38a5c70, - 0x7805a812, 0xd3847824, - 0x780378f1, 0xd37e93f4, 0x78014986, 0xd378afdf, 0x77ff19d1, 0xd372cbe6, - 0x77fce9d2, 0xd36ce808, - 0x77fab989, 0xd3670446, 0x77f888f6, 0xd361209f, 0x77f65819, 0xd35b3d13, - 0x77f426f2, 0xd35559a4, - 0x77f1f581, 0xd34f764f, 0x77efc3c5, 0xd3499317, 0x77ed91c0, 0xd343affa, - 0x77eb5f71, 0xd33dccf8, - 0x77e92cd9, 0xd337ea12, 0x77e6f9f6, 0xd3320748, 0x77e4c6c9, 0xd32c2499, - 0x77e29352, 0xd3264206, - 0x77e05f91, 0xd3205f8f, 0x77de2b86, 0xd31a7d33, 0x77dbf732, 0xd3149af3, - 0x77d9c293, 0xd30eb8cf, - 0x77d78daa, 0xd308d6c7, 0x77d55878, 0xd302f4da, 0x77d322fc, 0xd2fd1309, - 0x77d0ed35, 0xd2f73154, - 0x77ceb725, 0xd2f14fba, 0x77cc80cb, 0xd2eb6e3c, 0x77ca4a27, 0xd2e58cdb, - 0x77c81339, 0xd2dfab95, - 0x77c5dc01, 0xd2d9ca6a, 0x77c3a47f, 0xd2d3e95c, 0x77c16cb4, 0xd2ce0869, - 0x77bf349f, 0xd2c82793, - 0x77bcfc3f, 0xd2c246d8, 0x77bac396, 0xd2bc6639, 0x77b88aa3, 0xd2b685b6, - 0x77b65166, 0xd2b0a54f, - 0x77b417df, 0xd2aac504, 0x77b1de0f, 0xd2a4e4d5, 0x77afa3f5, 0xd29f04c2, - 0x77ad6990, 0xd29924cb, - 0x77ab2ee2, 0xd29344f0, 0x77a8f3ea, 0xd28d6531, 0x77a6b8a9, 0xd287858e, - 0x77a47d1d, 0xd281a607, - 0x77a24148, 0xd27bc69c, 0x77a00529, 0xd275e74d, 0x779dc8c0, 0xd270081b, - 0x779b8c0e, 0xd26a2904, - 0x77994f11, 0xd2644a0a, 0x779711cb, 0xd25e6b2b, 0x7794d43b, 0xd2588c69, - 0x77929661, 0xd252adc3, - 0x7790583e, 0xd24ccf39, 0x778e19d0, 0xd246f0cb, 0x778bdb19, 0xd241127a, - 0x77899c19, 0xd23b3444, - 0x77875cce, 0xd235562b, 0x77851d3a, 0xd22f782f, 0x7782dd5c, 0xd2299a4e, - 0x77809d35, 0xd223bc8a, - 0x777e5cc3, 0xd21ddee2, 0x777c1c08, 0xd2180156, 0x7779db03, 0xd21223e7, - 0x777799b5, 0xd20c4694, - 0x7775581d, 0xd206695d, 0x7773163b, 0xd2008c43, 0x7770d40f, 0xd1faaf45, - 0x776e919a, 0xd1f4d263, - 0x776c4edb, 0xd1eef59e, 0x776a0bd3, 0xd1e918f5, 0x7767c880, 0xd1e33c69, - 0x776584e5, 0xd1dd5ff9, - 0x776340ff, 0xd1d783a6, 0x7760fcd0, 0xd1d1a76f, 0x775eb857, 0xd1cbcb54, - 0x775c7395, 0xd1c5ef56, - 0x775a2e89, 0xd1c01375, 0x7757e933, 0xd1ba37b0, 0x7755a394, 0xd1b45c08, - 0x77535dab, 0xd1ae807c, - 0x77511778, 0xd1a8a50d, 0x774ed0fc, 0xd1a2c9ba, 0x774c8a36, 0xd19cee84, - 0x774a4327, 0xd197136b, - 0x7747fbce, 0xd191386e, 0x7745b42c, 0xd18b5d8e, 0x77436c40, 0xd18582ca, - 0x7741240a, 0xd17fa823, - 0x773edb8b, 0xd179cd99, 0x773c92c2, 0xd173f32c, 0x773a49b0, 0xd16e18db, - 0x77380054, 0xd1683ea7, - 0x7735b6af, 0xd1626490, 0x77336cc0, 0xd15c8a95, 0x77312287, 0xd156b0b7, - 0x772ed805, 0xd150d6f6, - 0x772c8d3a, 0xd14afd52, 0x772a4225, 0xd14523cb, 0x7727f6c6, 0xd13f4a60, - 0x7725ab1f, 0xd1397113, - 0x77235f2d, 0xd13397e2, 0x772112f2, 0xd12dbece, 0x771ec66e, 0xd127e5d7, - 0x771c79a0, 0xd1220cfc, - 0x771a2c88, 0xd11c343f, 0x7717df27, 0xd1165b9f, 0x7715917d, 0xd110831b, - 0x77134389, 0xd10aaab5, - 0x7710f54c, 0xd104d26b, 0x770ea6c5, 0xd0fefa3f, 0x770c57f5, 0xd0f9222f, - 0x770a08dc, 0xd0f34a3d, - 0x7707b979, 0xd0ed7267, 0x770569cc, 0xd0e79aaf, 0x770319d6, 0xd0e1c313, - 0x7700c997, 0xd0dbeb95, - 0x76fe790e, 0xd0d61434, 0x76fc283c, 0xd0d03cf0, 0x76f9d721, 0xd0ca65c9, - 0x76f785bc, 0xd0c48ebf, - 0x76f5340e, 0xd0beb7d2, 0x76f2e216, 0xd0b8e102, 0x76f08fd5, 0xd0b30a50, - 0x76ee3d4b, 0xd0ad33ba, - 0x76ebea77, 0xd0a75d42, 0x76e9975a, 0xd0a186e7, 0x76e743f4, 0xd09bb0aa, - 0x76e4f044, 0xd095da89, - 0x76e29c4b, 0xd0900486, 0x76e04808, 0xd08a2ea0, 0x76ddf37c, 0xd08458d7, - 0x76db9ea7, 0xd07e832c, - 0x76d94989, 0xd078ad9e, 0x76d6f421, 0xd072d82d, 0x76d49e70, 0xd06d02da, - 0x76d24876, 0xd0672da3, - 0x76cff232, 0xd061588b, 0x76cd9ba5, 0xd05b838f, 0x76cb44cf, 0xd055aeb1, - 0x76c8edb0, 0xd04fd9f1, - 0x76c69647, 0xd04a054e, 0x76c43e95, 0xd04430c8, 0x76c1e699, 0xd03e5c60, - 0x76bf8e55, 0xd0388815, - 0x76bd35c7, 0xd032b3e7, 0x76badcf0, 0xd02cdfd8, 0x76b883d0, 0xd0270be5, - 0x76b62a66, 0xd0213810, - 0x76b3d0b4, 0xd01b6459, 0x76b176b8, 0xd01590bf, 0x76af1c72, 0xd00fbd43, - 0x76acc1e4, 0xd009e9e4, - 0x76aa670d, 0xd00416a3, 0x76a80bec, 0xcffe4380, 0x76a5b082, 0xcff8707a, - 0x76a354cf, 0xcff29d92, - 0x76a0f8d2, 0xcfeccac7, 0x769e9c8d, 0xcfe6f81a, 0x769c3ffe, 0xcfe1258b, - 0x7699e326, 0xcfdb531a, - 0x76978605, 0xcfd580c6, 0x7695289b, 0xcfcfae8f, 0x7692cae8, 0xcfc9dc77, - 0x76906ceb, 0xcfc40a7c, - 0x768e0ea6, 0xcfbe389f, 0x768bb017, 0xcfb866e0, 0x7689513f, 0xcfb2953f, - 0x7686f21e, 0xcfacc3bb, - 0x768492b4, 0xcfa6f255, 0x76823301, 0xcfa1210d, 0x767fd304, 0xcf9b4fe3, - 0x767d72bf, 0xcf957ed7, - 0x767b1231, 0xcf8fade9, 0x7678b159, 0xcf89dd18, 0x76765038, 0xcf840c65, - 0x7673eecf, 0xcf7e3bd1, - 0x76718d1c, 0xcf786b5a, 0x766f2b20, 0xcf729b01, 0x766cc8db, 0xcf6ccac6, - 0x766a664d, 0xcf66faa9, - 0x76680376, 0xcf612aaa, 0x7665a056, 0xcf5b5ac9, 0x76633ced, 0xcf558b06, - 0x7660d93b, 0xcf4fbb61, - 0x765e7540, 0xcf49ebda, 0x765c10fc, 0xcf441c71, 0x7659ac6f, 0xcf3e4d26, - 0x76574798, 0xcf387dfa, - 0x7654e279, 0xcf32aeeb, 0x76527d11, 0xcf2cdffa, 0x76501760, 0xcf271128, - 0x764db166, 0xcf214274, - 0x764b4b23, 0xcf1b73de, 0x7648e497, 0xcf15a566, 0x76467dc2, 0xcf0fd70c, - 0x764416a4, 0xcf0a08d0, - 0x7641af3d, 0xcf043ab3, 0x763f478d, 0xcefe6cb3, 0x763cdf94, 0xcef89ed2, - 0x763a7752, 0xcef2d110, - 0x76380ec8, 0xceed036b, 0x7635a5f4, 0xcee735e5, 0x76333cd8, 0xcee1687d, - 0x7630d372, 0xcedb9b33, - 0x762e69c4, 0xced5ce08, 0x762bffcd, 0xced000fb, 0x7629958c, 0xceca340c, - 0x76272b03, 0xcec4673c, - 0x7624c031, 0xcebe9a8a, 0x76225517, 0xceb8cdf7, 0x761fe9b3, 0xceb30181, - 0x761d7e06, 0xcead352b, - 0x761b1211, 0xcea768f2, 0x7618a5d3, 0xcea19cd8, 0x7616394c, 0xce9bd0dd, - 0x7613cc7c, 0xce960500, - 0x76115f63, 0xce903942, 0x760ef201, 0xce8a6da2, 0x760c8457, 0xce84a220, - 0x760a1664, 0xce7ed6bd, - 0x7607a828, 0xce790b79, 0x760539a3, 0xce734053, 0x7602cad5, 0xce6d754c, - 0x76005bbf, 0xce67aa63, - 0x75fdec60, 0xce61df99, 0x75fb7cb8, 0xce5c14ed, 0x75f90cc7, 0xce564a60, - 0x75f69c8d, 0xce507ff2, - 0x75f42c0b, 0xce4ab5a2, 0x75f1bb40, 0xce44eb71, 0x75ef4a2c, 0xce3f215f, - 0x75ecd8cf, 0xce39576c, - 0x75ea672a, 0xce338d97, 0x75e7f53c, 0xce2dc3e1, 0x75e58305, 0xce27fa49, - 0x75e31086, 0xce2230d0, - 0x75e09dbd, 0xce1c6777, 0x75de2aac, 0xce169e3b, 0x75dbb753, 0xce10d51f, - 0x75d943b0, 0xce0b0c21, - 0x75d6cfc5, 0xce054343, 0x75d45b92, 0xcdff7a83, 0x75d1e715, 0xcdf9b1e2, - 0x75cf7250, 0xcdf3e95f, - 0x75ccfd42, 0xcdee20fc, 0x75ca87ec, 0xcde858b8, 0x75c8124d, 0xcde29092, - 0x75c59c65, 0xcddcc88b, - 0x75c32634, 0xcdd700a4, 0x75c0afbb, 0xcdd138db, 0x75be38fa, 0xcdcb7131, - 0x75bbc1ef, 0xcdc5a9a6, - 0x75b94a9c, 0xcdbfe23a, 0x75b6d301, 0xcdba1aee, 0x75b45b1d, 0xcdb453c0, - 0x75b1e2f0, 0xcdae8cb1, - 0x75af6a7b, 0xcda8c5c1, 0x75acf1bd, 0xcda2fef0, 0x75aa78b6, 0xcd9d383f, - 0x75a7ff67, 0xcd9771ac, - 0x75a585cf, 0xcd91ab39, 0x75a30bef, 0xcd8be4e4, 0x75a091c6, 0xcd861eaf, - 0x759e1755, 0xcd805899, - 0x759b9c9b, 0xcd7a92a2, 0x75992198, 0xcd74ccca, 0x7596a64d, 0xcd6f0711, - 0x75942ab9, 0xcd694178, - 0x7591aedd, 0xcd637bfe, 0x758f32b9, 0xcd5db6a3, 0x758cb64c, 0xcd57f167, - 0x758a3996, 0xcd522c4a, - 0x7587bc98, 0xcd4c674d, 0x75853f51, 0xcd46a26f, 0x7582c1c2, 0xcd40ddb0, - 0x758043ea, 0xcd3b1911, - 0x757dc5ca, 0xcd355491, 0x757b4762, 0xcd2f9030, 0x7578c8b0, 0xcd29cbee, - 0x757649b7, 0xcd2407cc, - 0x7573ca75, 0xcd1e43ca, 0x75714aea, 0xcd187fe6, 0x756ecb18, 0xcd12bc22, - 0x756c4afc, 0xcd0cf87e, - 0x7569ca99, 0xcd0734f9, 0x756749ec, 0xcd017193, 0x7564c8f8, 0xccfbae4d, - 0x756247bb, 0xccf5eb26, - 0x755fc635, 0xccf0281f, 0x755d4467, 0xccea6538, 0x755ac251, 0xcce4a26f, - 0x75583ff3, 0xccdedfc7, - 0x7555bd4c, 0xccd91d3d, 0x75533a5c, 0xccd35ad4, 0x7550b725, 0xcccd988a, - 0x754e33a4, 0xccc7d65f, - 0x754bafdc, 0xccc21455, 0x75492bcb, 0xccbc5269, 0x7546a772, 0xccb6909e, - 0x754422d0, 0xccb0cef2, - 0x75419de7, 0xccab0d65, 0x753f18b4, 0xcca54bf9, 0x753c933a, 0xcc9f8aac, - 0x753a0d77, 0xcc99c97e, - 0x7537876c, 0xcc940871, 0x75350118, 0xcc8e4783, 0x75327a7d, 0xcc8886b5, - 0x752ff399, 0xcc82c607, - 0x752d6c6c, 0xcc7d0578, 0x752ae4f8, 0xcc774509, 0x75285d3b, 0xcc7184ba, - 0x7525d536, 0xcc6bc48b, - 0x75234ce8, 0xcc66047b, 0x7520c453, 0xcc60448c, 0x751e3b75, 0xcc5a84bc, - 0x751bb24f, 0xcc54c50c, - 0x751928e0, 0xcc4f057c, 0x75169f2a, 0xcc49460c, 0x7514152b, 0xcc4386bc, - 0x75118ae4, 0xcc3dc78b, - 0x750f0054, 0xcc38087b, 0x750c757d, 0xcc32498a, 0x7509ea5d, 0xcc2c8aba, - 0x75075ef5, 0xcc26cc09, - 0x7504d345, 0xcc210d79, 0x7502474d, 0xcc1b4f08, 0x74ffbb0d, 0xcc1590b8, - 0x74fd2e84, 0xcc0fd287, - 0x74faa1b3, 0xcc0a1477, 0x74f8149a, 0xcc045686, 0x74f58739, 0xcbfe98b6, - 0x74f2f990, 0xcbf8db05, - 0x74f06b9e, 0xcbf31d75, 0x74eddd65, 0xcbed6005, 0x74eb4ee3, 0xcbe7a2b5, - 0x74e8c01a, 0xcbe1e585, - 0x74e63108, 0xcbdc2876, 0x74e3a1ae, 0xcbd66b86, 0x74e1120c, 0xcbd0aeb7, - 0x74de8221, 0xcbcaf208, - 0x74dbf1ef, 0xcbc53579, 0x74d96175, 0xcbbf790a, 0x74d6d0b2, 0xcbb9bcbb, - 0x74d43fa8, 0xcbb4008d, - 0x74d1ae55, 0xcbae447f, 0x74cf1cbb, 0xcba88891, 0x74cc8ad8, 0xcba2ccc4, - 0x74c9f8ad, 0xcb9d1117, - 0x74c7663a, 0xcb97558a, 0x74c4d380, 0xcb919a1d, 0x74c2407d, 0xcb8bded1, - 0x74bfad32, 0xcb8623a5, - 0x74bd199f, 0xcb80689a, 0x74ba85c4, 0xcb7aadaf, 0x74b7f1a1, 0xcb74f2e4, - 0x74b55d36, 0xcb6f383a, - 0x74b2c884, 0xcb697db0, 0x74b03389, 0xcb63c347, 0x74ad9e46, 0xcb5e08fe, - 0x74ab08bb, 0xcb584ed6, - 0x74a872e8, 0xcb5294ce, 0x74a5dccd, 0xcb4cdae6, 0x74a3466b, 0xcb47211f, - 0x74a0afc0, 0xcb416779, - 0x749e18cd, 0xcb3badf3, 0x749b8193, 0xcb35f48d, 0x7498ea11, 0xcb303b49, - 0x74965246, 0xcb2a8224, - 0x7493ba34, 0xcb24c921, 0x749121da, 0xcb1f103e, 0x748e8938, 0xcb19577b, - 0x748bf04d, 0xcb139ed9, - 0x7489571c, 0xcb0de658, 0x7486bda2, 0xcb082df8, 0x748423e0, 0xcb0275b8, - 0x748189d7, 0xcafcbd99, - 0x747eef85, 0xcaf7059a, 0x747c54ec, 0xcaf14dbd, 0x7479ba0b, 0xcaeb9600, - 0x74771ee2, 0xcae5de64, - 0x74748371, 0xcae026e8, 0x7471e7b8, 0xcada6f8d, 0x746f4bb8, 0xcad4b853, - 0x746caf70, 0xcacf013a, - 0x746a12df, 0xcac94a42, 0x74677608, 0xcac3936b, 0x7464d8e8, 0xcabddcb4, - 0x74623b80, 0xcab8261e, - 0x745f9dd1, 0xcab26fa9, 0x745cffda, 0xcaacb955, 0x745a619b, 0xcaa70322, - 0x7457c314, 0xcaa14d10, - 0x74552446, 0xca9b971e, 0x74528530, 0xca95e14e, 0x744fe5d2, 0xca902b9f, - 0x744d462c, 0xca8a7610, - 0x744aa63f, 0xca84c0a3, 0x7448060a, 0xca7f0b56, 0x7445658d, 0xca79562b, - 0x7442c4c8, 0xca73a120, - 0x744023bc, 0xca6dec37, 0x743d8268, 0xca68376e, 0x743ae0cc, 0xca6282c7, - 0x74383ee9, 0xca5cce40, - 0x74359cbd, 0xca5719db, 0x7432fa4b, 0xca516597, 0x74305790, 0xca4bb174, - 0x742db48e, 0xca45fd72, - 0x742b1144, 0xca404992, 0x74286db3, 0xca3a95d2, 0x7425c9da, 0xca34e234, - 0x742325b9, 0xca2f2eb6, - 0x74208150, 0xca297b5a, 0x741ddca0, 0xca23c820, 0x741b37a9, 0xca1e1506, - 0x74189269, 0xca18620e, - 0x7415ece2, 0xca12af37, 0x74134714, 0xca0cfc81, 0x7410a0fe, 0xca0749ec, - 0x740dfaa0, 0xca019779, - 0x740b53fb, 0xc9fbe527, 0x7408ad0e, 0xc9f632f6, 0x740605d9, 0xc9f080e7, - 0x74035e5d, 0xc9eacef9, - 0x7400b69a, 0xc9e51d2d, 0x73fe0e8f, 0xc9df6b81, 0x73fb663c, 0xc9d9b9f7, - 0x73f8bda2, 0xc9d4088f, - 0x73f614c0, 0xc9ce5748, 0x73f36b97, 0xc9c8a622, 0x73f0c226, 0xc9c2f51e, - 0x73ee186e, 0xc9bd443c, - 0x73eb6e6e, 0xc9b7937a, 0x73e8c426, 0xc9b1e2db, 0x73e61997, 0xc9ac325d, - 0x73e36ec1, 0xc9a68200, - 0x73e0c3a3, 0xc9a0d1c5, 0x73de183e, 0xc99b21ab, 0x73db6c91, 0xc99571b3, - 0x73d8c09d, 0xc98fc1dc, - 0x73d61461, 0xc98a1227, 0x73d367de, 0xc9846294, 0x73d0bb13, 0xc97eb322, - 0x73ce0e01, 0xc97903d2, - 0x73cb60a8, 0xc97354a4, 0x73c8b307, 0xc96da597, 0x73c6051f, 0xc967f6ac, - 0x73c356ef, 0xc96247e2, - 0x73c0a878, 0xc95c993a, 0x73bdf9b9, 0xc956eab4, 0x73bb4ab3, 0xc9513c50, - 0x73b89b66, 0xc94b8e0d, - 0x73b5ebd1, 0xc945dfec, 0x73b33bf5, 0xc94031ed, 0x73b08bd1, 0xc93a8410, - 0x73addb67, 0xc934d654, - 0x73ab2ab4, 0xc92f28ba, 0x73a879bb, 0xc9297b42, 0x73a5c87a, 0xc923cdec, - 0x73a316f2, 0xc91e20b8, - 0x73a06522, 0xc91873a5, 0x739db30b, 0xc912c6b5, 0x739b00ad, 0xc90d19e6, - 0x73984e07, 0xc9076d39, - 0x73959b1b, 0xc901c0ae, 0x7392e7e6, 0xc8fc1445, 0x7390346b, 0xc8f667fe, - 0x738d80a8, 0xc8f0bbd9, - 0x738acc9e, 0xc8eb0fd6, 0x7388184d, 0xc8e563f5, 0x738563b5, 0xc8dfb836, - 0x7382aed5, 0xc8da0c99, - 0x737ff9ae, 0xc8d4611d, 0x737d4440, 0xc8ceb5c4, 0x737a8e8a, 0xc8c90a8d, - 0x7377d88d, 0xc8c35f78, - 0x73752249, 0xc8bdb485, 0x73726bbe, 0xc8b809b4, 0x736fb4ec, 0xc8b25f06, - 0x736cfdd2, 0xc8acb479, - 0x736a4671, 0xc8a70a0e, 0x73678ec9, 0xc8a15fc6, 0x7364d6da, 0xc89bb5a0, - 0x73621ea4, 0xc8960b9c, - 0x735f6626, 0xc89061ba, 0x735cad61, 0xc88ab7fa, 0x7359f456, 0xc8850e5d, - 0x73573b03, 0xc87f64e2, - 0x73548168, 0xc879bb89, 0x7351c787, 0xc8741252, 0x734f0d5f, 0xc86e693d, - 0x734c52ef, 0xc868c04b, - 0x73499838, 0xc863177b, 0x7346dd3a, 0xc85d6ece, 0x734421f6, 0xc857c642, - 0x7341666a, 0xc8521dd9, - 0x733eaa96, 0xc84c7593, 0x733bee7c, 0xc846cd6e, 0x7339321b, 0xc841256d, - 0x73367572, 0xc83b7d8d, - 0x7333b883, 0xc835d5d0, 0x7330fb4d, 0xc8302e35, 0x732e3dcf, 0xc82a86bd, - 0x732b800a, 0xc824df67, - 0x7328c1ff, 0xc81f3834, 0x732603ac, 0xc8199123, 0x73234512, 0xc813ea35, - 0x73208632, 0xc80e4369, - 0x731dc70a, 0xc8089cbf, 0x731b079b, 0xc802f638, 0x731847e5, 0xc7fd4fd4, - 0x731587e8, 0xc7f7a992, - 0x7312c7a5, 0xc7f20373, 0x7310071a, 0xc7ec5d76, 0x730d4648, 0xc7e6b79c, - 0x730a8530, 0xc7e111e5, - 0x7307c3d0, 0xc7db6c50, 0x73050229, 0xc7d5c6de, 0x7302403c, 0xc7d0218e, - 0x72ff7e07, 0xc7ca7c61, - 0x72fcbb8c, 0xc7c4d757, 0x72f9f8c9, 0xc7bf3270, 0x72f735c0, 0xc7b98dab, - 0x72f47270, 0xc7b3e909, - 0x72f1aed9, 0xc7ae4489, 0x72eeeafb, 0xc7a8a02c, 0x72ec26d6, 0xc7a2fbf3, - 0x72e9626a, 0xc79d57db, - 0x72e69db7, 0xc797b3e7, 0x72e3d8be, 0xc7921015, 0x72e1137d, 0xc78c6c67, - 0x72de4df6, 0xc786c8db, - 0x72db8828, 0xc7812572, 0x72d8c213, 0xc77b822b, 0x72d5fbb7, 0xc775df08, - 0x72d33514, 0xc7703c08, - 0x72d06e2b, 0xc76a992a, 0x72cda6fb, 0xc764f66f, 0x72cadf83, 0xc75f53d7, - 0x72c817c6, 0xc759b163, - 0x72c54fc1, 0xc7540f11, 0x72c28775, 0xc74e6ce2, 0x72bfbee3, 0xc748cad6, - 0x72bcf60a, 0xc74328ed, - 0x72ba2cea, 0xc73d8727, 0x72b76383, 0xc737e584, 0x72b499d6, 0xc7324404, - 0x72b1cfe1, 0xc72ca2a7, - 0x72af05a7, 0xc727016d, 0x72ac3b25, 0xc7216056, 0x72a9705c, 0xc71bbf62, - 0x72a6a54d, 0xc7161e92, - 0x72a3d9f7, 0xc7107de4, 0x72a10e5b, 0xc70add5a, 0x729e4277, 0xc7053cf2, - 0x729b764d, 0xc6ff9cae, - 0x7298a9dd, 0xc6f9fc8d, 0x7295dd25, 0xc6f45c8f, 0x72931027, 0xc6eebcb5, - 0x729042e3, 0xc6e91cfd, - 0x728d7557, 0xc6e37d69, 0x728aa785, 0xc6ddddf8, 0x7287d96c, 0xc6d83eab, - 0x72850b0d, 0xc6d29f80, - 0x72823c67, 0xc6cd0079, 0x727f6d7a, 0xc6c76195, 0x727c9e47, 0xc6c1c2d4, - 0x7279cecd, 0xc6bc2437, - 0x7276ff0d, 0xc6b685bd, 0x72742f05, 0xc6b0e767, 0x72715eb8, 0xc6ab4933, - 0x726e8e23, 0xc6a5ab23, - 0x726bbd48, 0xc6a00d37, 0x7268ec27, 0xc69a6f6e, 0x72661abf, 0xc694d1c8, - 0x72634910, 0xc68f3446, - 0x7260771b, 0xc68996e7, 0x725da4df, 0xc683f9ab, 0x725ad25d, 0xc67e5c93, - 0x7257ff94, 0xc678bf9f, - 0x72552c85, 0xc67322ce, 0x7252592f, 0xc66d8620, 0x724f8593, 0xc667e996, - 0x724cb1b0, 0xc6624d30, - 0x7249dd86, 0xc65cb0ed, 0x72470916, 0xc65714cd, 0x72443460, 0xc65178d1, - 0x72415f63, 0xc64bdcf9, - 0x723e8a20, 0xc6464144, 0x723bb496, 0xc640a5b3, 0x7238dec5, 0xc63b0a46, - 0x723608af, 0xc6356efc, - 0x72333251, 0xc62fd3d6, 0x72305bae, 0xc62a38d4, 0x722d84c4, 0xc6249df5, - 0x722aad93, 0xc61f033a, - 0x7227d61c, 0xc61968a2, 0x7224fe5f, 0xc613ce2f, 0x7222265b, 0xc60e33df, - 0x721f4e11, 0xc60899b2, - 0x721c7580, 0xc602ffaa, 0x72199ca9, 0xc5fd65c5, 0x7216c38c, 0xc5f7cc04, - 0x7213ea28, 0xc5f23267, - 0x7211107e, 0xc5ec98ee, 0x720e368d, 0xc5e6ff98, 0x720b5c57, 0xc5e16667, - 0x720881d9, 0xc5dbcd59, - 0x7205a716, 0xc5d6346f, 0x7202cc0c, 0xc5d09ba9, 0x71fff0bc, 0xc5cb0307, - 0x71fd1525, 0xc5c56a89, - 0x71fa3949, 0xc5bfd22e, 0x71f75d25, 0xc5ba39f8, 0x71f480bc, 0xc5b4a1e5, - 0x71f1a40c, 0xc5af09f7, - 0x71eec716, 0xc5a9722c, 0x71ebe9da, 0xc5a3da86, 0x71e90c57, 0xc59e4303, - 0x71e62e8f, 0xc598aba5, - 0x71e35080, 0xc593146a, 0x71e0722a, 0xc58d7d54, 0x71dd938f, 0xc587e661, - 0x71dab4ad, 0xc5824f93, - 0x71d7d585, 0xc57cb8e9, 0x71d4f617, 0xc5772263, 0x71d21662, 0xc5718c00, - 0x71cf3667, 0xc56bf5c2, - 0x71cc5626, 0xc5665fa9, 0x71c9759f, 0xc560c9b3, 0x71c694d2, 0xc55b33e2, - 0x71c3b3bf, 0xc5559e34, - 0x71c0d265, 0xc55008ab, 0x71bdf0c5, 0xc54a7346, 0x71bb0edf, 0xc544de05, - 0x71b82cb3, 0xc53f48e9, - 0x71b54a41, 0xc539b3f1, 0x71b26788, 0xc5341f1d, 0x71af848a, 0xc52e8a6d, - 0x71aca145, 0xc528f5e1, - 0x71a9bdba, 0xc523617a, 0x71a6d9e9, 0xc51dcd37, 0x71a3f5d2, 0xc5183919, - 0x71a11175, 0xc512a51f, - 0x719e2cd2, 0xc50d1149, 0x719b47e9, 0xc5077d97, 0x719862b9, 0xc501ea0a, - 0x71957d44, 0xc4fc56a2, - 0x71929789, 0xc4f6c35d, 0x718fb187, 0xc4f1303d, 0x718ccb3f, 0xc4eb9d42, - 0x7189e4b2, 0xc4e60a6b, - 0x7186fdde, 0xc4e077b8, 0x718416c4, 0xc4dae52a, 0x71812f65, 0xc4d552c1, - 0x717e47bf, 0xc4cfc07c, - 0x717b5fd3, 0xc4ca2e5b, 0x717877a1, 0xc4c49c5f, 0x71758f29, 0xc4bf0a87, - 0x7172a66c, 0xc4b978d4, - 0x716fbd68, 0xc4b3e746, 0x716cd41e, 0xc4ae55dc, 0x7169ea8f, 0xc4a8c497, - 0x716700b9, 0xc4a33376, - 0x7164169d, 0xc49da27a, 0x71612c3c, 0xc49811a3, 0x715e4194, 0xc49280f0, - 0x715b56a7, 0xc48cf062, - 0x71586b74, 0xc4875ff9, 0x71557ffa, 0xc481cfb4, 0x7152943b, 0xc47c3f94, - 0x714fa836, 0xc476af98, - 0x714cbbeb, 0xc4711fc2, 0x7149cf5a, 0xc46b9010, 0x7146e284, 0xc4660083, - 0x7143f567, 0xc460711b, - 0x71410805, 0xc45ae1d7, 0x713e1a5c, 0xc45552b8, 0x713b2c6e, 0xc44fc3be, - 0x71383e3a, 0xc44a34e9, - 0x71354fc0, 0xc444a639, 0x71326101, 0xc43f17ad, 0x712f71fb, 0xc4398947, - 0x712c82b0, 0xc433fb05, - 0x7129931f, 0xc42e6ce8, 0x7126a348, 0xc428def0, 0x7123b32b, 0xc423511d, - 0x7120c2c8, 0xc41dc36f, - 0x711dd220, 0xc41835e6, 0x711ae132, 0xc412a882, 0x7117effe, 0xc40d1b42, - 0x7114fe84, 0xc4078e28, - 0x71120cc5, 0xc4020133, 0x710f1ac0, 0xc3fc7462, 0x710c2875, 0xc3f6e7b7, - 0x710935e4, 0xc3f15b31, - 0x7106430e, 0xc3ebced0, 0x71034ff2, 0xc3e64294, 0x71005c90, 0xc3e0b67d, - 0x70fd68e9, 0xc3db2a8b, - 0x70fa74fc, 0xc3d59ebe, 0x70f780c9, 0xc3d01316, 0x70f48c50, 0xc3ca8793, - 0x70f19792, 0xc3c4fc36, - 0x70eea28e, 0xc3bf70fd, 0x70ebad45, 0xc3b9e5ea, 0x70e8b7b5, 0xc3b45afc, - 0x70e5c1e1, 0xc3aed034, - 0x70e2cbc6, 0xc3a94590, 0x70dfd566, 0xc3a3bb12, 0x70dcdec0, 0xc39e30b8, - 0x70d9e7d5, 0xc398a685, - 0x70d6f0a4, 0xc3931c76, 0x70d3f92d, 0xc38d928d, 0x70d10171, 0xc38808c9, - 0x70ce096f, 0xc3827f2a, - 0x70cb1128, 0xc37cf5b0, 0x70c8189b, 0xc3776c5c, 0x70c51fc8, 0xc371e32d, - 0x70c226b0, 0xc36c5a24, - 0x70bf2d53, 0xc366d140, 0x70bc33b0, 0xc3614881, 0x70b939c7, 0xc35bbfe8, - 0x70b63f99, 0xc3563774, - 0x70b34525, 0xc350af26, 0x70b04a6b, 0xc34b26fc, 0x70ad4f6d, 0xc3459ef9, - 0x70aa5428, 0xc340171b, - 0x70a7589f, 0xc33a8f62, 0x70a45ccf, 0xc33507cf, 0x70a160ba, 0xc32f8061, - 0x709e6460, 0xc329f919, - 0x709b67c0, 0xc32471f7, 0x70986adb, 0xc31eeaf9, 0x70956db1, 0xc3196422, - 0x70927041, 0xc313dd70, - 0x708f728b, 0xc30e56e4, 0x708c7490, 0xc308d07d, 0x70897650, 0xc3034a3c, - 0x708677ca, 0xc2fdc420, - 0x708378ff, 0xc2f83e2a, 0x708079ee, 0xc2f2b85a, 0x707d7a98, 0xc2ed32af, - 0x707a7afd, 0xc2e7ad2a, - 0x70777b1c, 0xc2e227cb, 0x70747af6, 0xc2dca291, 0x70717a8a, 0xc2d71d7e, - 0x706e79d9, 0xc2d1988f, - 0x706b78e3, 0xc2cc13c7, 0x706877a7, 0xc2c68f24, 0x70657626, 0xc2c10aa7, - 0x70627460, 0xc2bb8650, - 0x705f7255, 0xc2b6021f, 0x705c7004, 0xc2b07e14, 0x70596d6d, 0xc2aafa2e, - 0x70566a92, 0xc2a5766e, - 0x70536771, 0xc29ff2d4, 0x7050640b, 0xc29a6f60, 0x704d6060, 0xc294ec12, - 0x704a5c6f, 0xc28f68e9, - 0x70475839, 0xc289e5e7, 0x704453be, 0xc284630a, 0x70414efd, 0xc27ee054, - 0x703e49f8, 0xc2795dc3, - 0x703b44ad, 0xc273db58, 0x70383f1d, 0xc26e5913, 0x70353947, 0xc268d6f5, - 0x7032332d, 0xc26354fc, - 0x702f2ccd, 0xc25dd329, 0x702c2628, 0xc258517c, 0x70291f3e, 0xc252cff5, - 0x7026180e, 0xc24d4e95, - 0x7023109a, 0xc247cd5a, 0x702008e0, 0xc2424c46, 0x701d00e1, 0xc23ccb57, - 0x7019f89d, 0xc2374a8f, - 0x7016f014, 0xc231c9ec, 0x7013e746, 0xc22c4970, 0x7010de32, 0xc226c91a, - 0x700dd4da, 0xc22148ea, - 0x700acb3c, 0xc21bc8e1, 0x7007c159, 0xc21648fd, 0x7004b731, 0xc210c940, - 0x7001acc4, 0xc20b49a9, - 0x6ffea212, 0xc205ca38, 0x6ffb971b, 0xc2004aed, 0x6ff88bde, 0xc1facbc9, - 0x6ff5805d, 0xc1f54cca, - 0x6ff27497, 0xc1efcdf3, 0x6fef688b, 0xc1ea4f41, 0x6fec5c3b, 0xc1e4d0b6, - 0x6fe94fa5, 0xc1df5251, - 0x6fe642ca, 0xc1d9d412, 0x6fe335ab, 0xc1d455f9, 0x6fe02846, 0xc1ced807, - 0x6fdd1a9c, 0xc1c95a3c, - 0x6fda0cae, 0xc1c3dc97, 0x6fd6fe7a, 0xc1be5f18, 0x6fd3f001, 0xc1b8e1bf, - 0x6fd0e144, 0xc1b3648d, - 0x6fcdd241, 0xc1ade781, 0x6fcac2fa, 0xc1a86a9c, 0x6fc7b36d, 0xc1a2edde, - 0x6fc4a39c, 0xc19d7145, - 0x6fc19385, 0xc197f4d4, 0x6fbe832a, 0xc1927888, 0x6fbb728a, 0xc18cfc63, - 0x6fb861a4, 0xc1878065, - 0x6fb5507a, 0xc182048d, 0x6fb23f0b, 0xc17c88dc, 0x6faf2d57, 0xc1770d52, - 0x6fac1b5f, 0xc17191ee, - 0x6fa90921, 0xc16c16b0, 0x6fa5f69e, 0xc1669b99, 0x6fa2e3d7, 0xc16120a9, - 0x6f9fd0cb, 0xc15ba5df, - 0x6f9cbd79, 0xc1562b3d, 0x6f99a9e3, 0xc150b0c0, 0x6f969608, 0xc14b366b, - 0x6f9381e9, 0xc145bc3c, - 0x6f906d84, 0xc1404233, 0x6f8d58db, 0xc13ac852, 0x6f8a43ed, 0xc1354e97, - 0x6f872eba, 0xc12fd503, - 0x6f841942, 0xc12a5b95, 0x6f810386, 0xc124e24f, 0x6f7ded84, 0xc11f692f, - 0x6f7ad73e, 0xc119f036, - 0x6f77c0b3, 0xc1147764, 0x6f74a9e4, 0xc10efeb8, 0x6f7192cf, 0xc1098634, - 0x6f6e7b76, 0xc1040dd6, - 0x6f6b63d8, 0xc0fe959f, 0x6f684bf6, 0xc0f91d8f, 0x6f6533ce, 0xc0f3a5a6, - 0x6f621b62, 0xc0ee2de3, - 0x6f5f02b2, 0xc0e8b648, 0x6f5be9bc, 0xc0e33ed4, 0x6f58d082, 0xc0ddc786, - 0x6f55b703, 0xc0d8505f, - 0x6f529d40, 0xc0d2d960, 0x6f4f8338, 0xc0cd6287, 0x6f4c68eb, 0xc0c7ebd6, - 0x6f494e5a, 0xc0c2754b, - 0x6f463383, 0xc0bcfee7, 0x6f431869, 0xc0b788ab, 0x6f3ffd09, 0xc0b21295, - 0x6f3ce165, 0xc0ac9ca6, - 0x6f39c57d, 0xc0a726df, 0x6f36a94f, 0xc0a1b13e, 0x6f338cde, 0xc09c3bc5, - 0x6f307027, 0xc096c673, - 0x6f2d532c, 0xc0915148, 0x6f2a35ed, 0xc08bdc44, 0x6f271868, 0xc0866767, - 0x6f23faa0, 0xc080f2b1, - 0x6f20dc92, 0xc07b7e23, 0x6f1dbe41, 0xc07609bb, 0x6f1a9faa, 0xc070957b, - 0x6f1780cf, 0xc06b2162, - 0x6f1461b0, 0xc065ad70, 0x6f11424c, 0xc06039a6, 0x6f0e22a3, 0xc05ac603, - 0x6f0b02b6, 0xc0555287, - 0x6f07e285, 0xc04fdf32, 0x6f04c20f, 0xc04a6c05, 0x6f01a155, 0xc044f8fe, - 0x6efe8056, 0xc03f8620, - 0x6efb5f12, 0xc03a1368, 0x6ef83d8a, 0xc034a0d8, 0x6ef51bbe, 0xc02f2e6f, - 0x6ef1f9ad, 0xc029bc2e, - 0x6eeed758, 0xc0244a14, 0x6eebb4bf, 0xc01ed821, 0x6ee891e1, 0xc0196656, - 0x6ee56ebe, 0xc013f4b2, - 0x6ee24b57, 0xc00e8336, 0x6edf27ac, 0xc00911e1, 0x6edc03bc, 0xc003a0b3, - 0x6ed8df88, 0xbffe2fad, - 0x6ed5bb10, 0xbff8bece, 0x6ed29653, 0xbff34e17, 0x6ecf7152, 0xbfeddd88, - 0x6ecc4c0d, 0xbfe86d20, - 0x6ec92683, 0xbfe2fcdf, 0x6ec600b5, 0xbfdd8cc6, 0x6ec2daa2, 0xbfd81cd5, - 0x6ebfb44b, 0xbfd2ad0b, - 0x6ebc8db0, 0xbfcd3d69, 0x6eb966d1, 0xbfc7cdee, 0x6eb63fad, 0xbfc25e9b, - 0x6eb31845, 0xbfbcef70, - 0x6eaff099, 0xbfb7806c, 0x6eacc8a8, 0xbfb21190, 0x6ea9a073, 0xbfaca2dc, - 0x6ea677fa, 0xbfa7344f, - 0x6ea34f3d, 0xbfa1c5ea, 0x6ea0263b, 0xbf9c57ac, 0x6e9cfcf5, 0xbf96e997, - 0x6e99d36b, 0xbf917ba9, - 0x6e96a99d, 0xbf8c0de3, 0x6e937f8a, 0xbf86a044, 0x6e905534, 0xbf8132ce, - 0x6e8d2a99, 0xbf7bc57f, - 0x6e89ffb9, 0xbf765858, 0x6e86d496, 0xbf70eb59, 0x6e83a92f, 0xbf6b7e81, - 0x6e807d83, 0xbf6611d2, - 0x6e7d5193, 0xbf60a54a, 0x6e7a255f, 0xbf5b38ea, 0x6e76f8e7, 0xbf55ccb2, - 0x6e73cc2b, 0xbf5060a2, - 0x6e709f2a, 0xbf4af4ba, 0x6e6d71e6, 0xbf4588fa, 0x6e6a445d, 0xbf401d61, - 0x6e671690, 0xbf3ab1f1, - 0x6e63e87f, 0xbf3546a8, 0x6e60ba2a, 0xbf2fdb88, 0x6e5d8b91, 0xbf2a708f, - 0x6e5a5cb4, 0xbf2505bf, - 0x6e572d93, 0xbf1f9b16, 0x6e53fe2e, 0xbf1a3096, 0x6e50ce84, 0xbf14c63d, - 0x6e4d9e97, 0xbf0f5c0d, - 0x6e4a6e66, 0xbf09f205, 0x6e473df0, 0xbf048824, 0x6e440d37, 0xbeff1e6c, - 0x6e40dc39, 0xbef9b4dc, - 0x6e3daaf8, 0xbef44b74, 0x6e3a7972, 0xbeeee234, 0x6e3747a9, 0xbee9791c, - 0x6e34159b, 0xbee4102d, - 0x6e30e34a, 0xbedea765, 0x6e2db0b4, 0xbed93ec6, 0x6e2a7ddb, 0xbed3d64f, - 0x6e274abe, 0xbece6e00, - 0x6e24175c, 0xbec905d9, 0x6e20e3b7, 0xbec39ddb, 0x6e1dafce, 0xbebe3605, - 0x6e1a7ba1, 0xbeb8ce57, - 0x6e174730, 0xbeb366d1, 0x6e14127b, 0xbeadff74, 0x6e10dd82, 0xbea8983f, - 0x6e0da845, 0xbea33132, - 0x6e0a72c5, 0xbe9dca4e, 0x6e073d00, 0xbe986391, 0x6e0406f8, 0xbe92fcfe, - 0x6e00d0ac, 0xbe8d9692, - 0x6dfd9a1c, 0xbe88304f, 0x6dfa6348, 0xbe82ca35, 0x6df72c30, 0xbe7d6442, - 0x6df3f4d4, 0xbe77fe78, - 0x6df0bd35, 0xbe7298d7, 0x6ded8552, 0xbe6d335e, 0x6dea4d2b, 0xbe67ce0d, - 0x6de714c0, 0xbe6268e5, - 0x6de3dc11, 0xbe5d03e6, 0x6de0a31f, 0xbe579f0f, 0x6ddd69e9, 0xbe523a60, - 0x6dda306f, 0xbe4cd5da, - 0x6dd6f6b1, 0xbe47717c, 0x6dd3bcaf, 0xbe420d47, 0x6dd0826a, 0xbe3ca93b, - 0x6dcd47e1, 0xbe374557, - 0x6dca0d14, 0xbe31e19b, 0x6dc6d204, 0xbe2c7e09, 0x6dc396b0, 0xbe271a9f, - 0x6dc05b18, 0xbe21b75d, - 0x6dbd1f3c, 0xbe1c5444, 0x6db9e31d, 0xbe16f154, 0x6db6a6ba, 0xbe118e8c, - 0x6db36a14, 0xbe0c2bed, - 0x6db02d29, 0xbe06c977, 0x6daceffb, 0xbe01672a, 0x6da9b28a, 0xbdfc0505, - 0x6da674d5, 0xbdf6a309, - 0x6da336dc, 0xbdf14135, 0x6d9ff89f, 0xbdebdf8b, 0x6d9cba1f, 0xbde67e09, - 0x6d997b5b, 0xbde11cb0, - 0x6d963c54, 0xbddbbb7f, 0x6d92fd09, 0xbdd65a78, 0x6d8fbd7a, 0xbdd0f999, - 0x6d8c7da8, 0xbdcb98e3, - 0x6d893d93, 0xbdc63856, 0x6d85fd39, 0xbdc0d7f2, 0x6d82bc9d, 0xbdbb77b7, - 0x6d7f7bbc, 0xbdb617a4, - 0x6d7c3a98, 0xbdb0b7bb, 0x6d78f931, 0xbdab57fa, 0x6d75b786, 0xbda5f862, - 0x6d727597, 0xbda098f3, - 0x6d6f3365, 0xbd9b39ad, 0x6d6bf0f0, 0xbd95da91, 0x6d68ae37, 0xbd907b9d, - 0x6d656b3a, 0xbd8b1cd2, - 0x6d6227fa, 0xbd85be30, 0x6d5ee477, 0xbd805fb7, 0x6d5ba0b0, 0xbd7b0167, - 0x6d585ca6, 0xbd75a340, - 0x6d551858, 0xbd704542, 0x6d51d3c6, 0xbd6ae76d, 0x6d4e8ef2, 0xbd6589c1, - 0x6d4b49da, 0xbd602c3f, - 0x6d48047e, 0xbd5acee5, 0x6d44bedf, 0xbd5571b5, 0x6d4178fd, 0xbd5014ad, - 0x6d3e32d7, 0xbd4ab7cf, - 0x6d3aec6e, 0xbd455b1a, 0x6d37a5c1, 0xbd3ffe8e, 0x6d345ed1, 0xbd3aa22c, - 0x6d31179e, 0xbd3545f2, - 0x6d2dd027, 0xbd2fe9e2, 0x6d2a886e, 0xbd2a8dfb, 0x6d274070, 0xbd25323d, - 0x6d23f830, 0xbd1fd6a8, - 0x6d20afac, 0xbd1a7b3d, 0x6d1d66e4, 0xbd151ffb, 0x6d1a1dda, 0xbd0fc4e2, - 0x6d16d48c, 0xbd0a69f2, - 0x6d138afb, 0xbd050f2c, 0x6d104126, 0xbcffb48f, 0x6d0cf70f, 0xbcfa5a1b, - 0x6d09acb4, 0xbcf4ffd1, - 0x6d066215, 0xbcefa5b0, 0x6d031734, 0xbcea4bb9, 0x6cffcc0f, 0xbce4f1eb, - 0x6cfc80a7, 0xbcdf9846, - 0x6cf934fc, 0xbcda3ecb, 0x6cf5e90d, 0xbcd4e579, 0x6cf29cdc, 0xbccf8c50, - 0x6cef5067, 0xbcca3351, - 0x6cec03af, 0xbcc4da7b, 0x6ce8b6b4, 0xbcbf81cf, 0x6ce56975, 0xbcba294d, - 0x6ce21bf4, 0xbcb4d0f4, - 0x6cdece2f, 0xbcaf78c4, 0x6cdb8027, 0xbcaa20be, 0x6cd831dc, 0xbca4c8e1, - 0x6cd4e34e, 0xbc9f712e, - 0x6cd1947c, 0xbc9a19a5, 0x6cce4568, 0xbc94c245, 0x6ccaf610, 0xbc8f6b0f, - 0x6cc7a676, 0xbc8a1402, - 0x6cc45698, 0xbc84bd1f, 0x6cc10677, 0xbc7f6665, 0x6cbdb613, 0xbc7a0fd6, - 0x6cba656c, 0xbc74b96f, - 0x6cb71482, 0xbc6f6333, 0x6cb3c355, 0xbc6a0d20, 0x6cb071e4, 0xbc64b737, - 0x6cad2031, 0xbc5f6177, - 0x6ca9ce3b, 0xbc5a0be2, 0x6ca67c01, 0xbc54b676, 0x6ca32985, 0xbc4f6134, - 0x6c9fd6c6, 0xbc4a0c1b, - 0x6c9c83c3, 0xbc44b72c, 0x6c99307e, 0xbc3f6267, 0x6c95dcf6, 0xbc3a0dcc, - 0x6c92892a, 0xbc34b95b, - 0x6c8f351c, 0xbc2f6513, 0x6c8be0cb, 0xbc2a10f6, 0x6c888c36, 0xbc24bd02, - 0x6c85375f, 0xbc1f6938, - 0x6c81e245, 0xbc1a1598, 0x6c7e8ce8, 0xbc14c221, 0x6c7b3748, 0xbc0f6ed5, - 0x6c77e165, 0xbc0a1bb3, - 0x6c748b3f, 0xbc04c8ba, 0x6c7134d7, 0xbbff75ec, 0x6c6dde2b, 0xbbfa2347, - 0x6c6a873d, 0xbbf4d0cc, - 0x6c67300b, 0xbbef7e7c, 0x6c63d897, 0xbbea2c55, 0x6c6080e0, 0xbbe4da58, - 0x6c5d28e6, 0xbbdf8885, - 0x6c59d0a9, 0xbbda36dd, 0x6c56782a, 0xbbd4e55e, 0x6c531f67, 0xbbcf940a, - 0x6c4fc662, 0xbbca42df, - 0x6c4c6d1a, 0xbbc4f1df, 0x6c49138f, 0xbbbfa108, 0x6c45b9c1, 0xbbba505c, - 0x6c425fb1, 0xbbb4ffda, - 0x6c3f055d, 0xbbafaf82, 0x6c3baac7, 0xbbaa5f54, 0x6c384fef, 0xbba50f50, - 0x6c34f4d3, 0xbb9fbf77, - 0x6c319975, 0xbb9a6fc7, 0x6c2e3dd4, 0xbb952042, 0x6c2ae1f0, 0xbb8fd0e7, - 0x6c2785ca, 0xbb8a81b6, - 0x6c242960, 0xbb8532b0, 0x6c20ccb4, 0xbb7fe3d3, 0x6c1d6fc6, 0xbb7a9521, - 0x6c1a1295, 0xbb754699, - 0x6c16b521, 0xbb6ff83c, 0x6c13576a, 0xbb6aaa09, 0x6c0ff971, 0xbb655c00, - 0x6c0c9b35, 0xbb600e21, - 0x6c093cb6, 0xbb5ac06d, 0x6c05ddf5, 0xbb5572e3, 0x6c027ef1, 0xbb502583, - 0x6bff1faa, 0xbb4ad84e, - 0x6bfbc021, 0xbb458b43, 0x6bf86055, 0xbb403e63, 0x6bf50047, 0xbb3af1ad, - 0x6bf19ff6, 0xbb35a521, - 0x6bee3f62, 0xbb3058c0, 0x6beade8c, 0xbb2b0c8a, 0x6be77d74, 0xbb25c07d, - 0x6be41c18, 0xbb20749c, - 0x6be0ba7b, 0xbb1b28e4, 0x6bdd589a, 0xbb15dd57, 0x6bd9f677, 0xbb1091f5, - 0x6bd69412, 0xbb0b46bd, - 0x6bd3316a, 0xbb05fbb0, 0x6bcfce80, 0xbb00b0ce, 0x6bcc6b53, 0xbafb6615, - 0x6bc907e3, 0xbaf61b88, - 0x6bc5a431, 0xbaf0d125, 0x6bc2403d, 0xbaeb86ed, 0x6bbedc06, 0xbae63cdf, - 0x6bbb778d, 0xbae0f2fc, - 0x6bb812d1, 0xbadba943, 0x6bb4add3, 0xbad65fb5, 0x6bb14892, 0xbad11652, - 0x6bade30f, 0xbacbcd1a, - 0x6baa7d49, 0xbac6840c, 0x6ba71741, 0xbac13b29, 0x6ba3b0f7, 0xbabbf270, - 0x6ba04a6a, 0xbab6a9e3, - 0x6b9ce39b, 0xbab16180, 0x6b997c8a, 0xbaac1948, 0x6b961536, 0xbaa6d13a, - 0x6b92ada0, 0xbaa18958, - 0x6b8f45c7, 0xba9c41a0, 0x6b8bddac, 0xba96fa13, 0x6b88754f, 0xba91b2b1, - 0x6b850caf, 0xba8c6b79, - 0x6b81a3cd, 0xba87246d, 0x6b7e3aa9, 0xba81dd8b, 0x6b7ad142, 0xba7c96d4, - 0x6b776799, 0xba775048, - 0x6b73fdae, 0xba7209e7, 0x6b709381, 0xba6cc3b1, 0x6b6d2911, 0xba677da6, - 0x6b69be5f, 0xba6237c5, - 0x6b66536b, 0xba5cf210, 0x6b62e834, 0xba57ac86, 0x6b5f7cbc, 0xba526726, - 0x6b5c1101, 0xba4d21f2, - 0x6b58a503, 0xba47dce8, 0x6b5538c4, 0xba42980a, 0x6b51cc42, 0xba3d5356, - 0x6b4e5f7f, 0xba380ece, - 0x6b4af279, 0xba32ca71, 0x6b478530, 0xba2d863e, 0x6b4417a6, 0xba284237, - 0x6b40a9d9, 0xba22fe5b, - 0x6b3d3bcb, 0xba1dbaaa, 0x6b39cd7a, 0xba187724, 0x6b365ee7, 0xba1333c9, - 0x6b32f012, 0xba0df099, - 0x6b2f80fb, 0xba08ad95, 0x6b2c11a1, 0xba036abb, 0x6b28a206, 0xb9fe280d, - 0x6b253228, 0xb9f8e58a, - 0x6b21c208, 0xb9f3a332, 0x6b1e51a7, 0xb9ee6106, 0x6b1ae103, 0xb9e91f04, - 0x6b17701d, 0xb9e3dd2e, - 0x6b13fef5, 0xb9de9b83, 0x6b108d8b, 0xb9d95a03, 0x6b0d1bdf, 0xb9d418af, - 0x6b09a9f1, 0xb9ced786, - 0x6b0637c1, 0xb9c99688, 0x6b02c54f, 0xb9c455b6, 0x6aff529a, 0xb9bf150e, - 0x6afbdfa4, 0xb9b9d493, - 0x6af86c6c, 0xb9b49442, 0x6af4f8f2, 0xb9af541d, 0x6af18536, 0xb9aa1423, - 0x6aee1138, 0xb9a4d455, - 0x6aea9cf8, 0xb99f94b2, 0x6ae72876, 0xb99a553a, 0x6ae3b3b2, 0xb99515ee, - 0x6ae03eac, 0xb98fd6cd, - 0x6adcc964, 0xb98a97d8, 0x6ad953db, 0xb985590e, 0x6ad5de0f, 0xb9801a70, - 0x6ad26802, 0xb97adbfd, - 0x6acef1b2, 0xb9759db6, 0x6acb7b21, 0xb9705f9a, 0x6ac8044e, 0xb96b21aa, - 0x6ac48d39, 0xb965e3e5, - 0x6ac115e2, 0xb960a64c, 0x6abd9e49, 0xb95b68de, 0x6aba266e, 0xb9562b9c, - 0x6ab6ae52, 0xb950ee86, - 0x6ab335f4, 0xb94bb19b, 0x6aafbd54, 0xb94674dc, 0x6aac4472, 0xb9413848, - 0x6aa8cb4e, 0xb93bfbe0, - 0x6aa551e9, 0xb936bfa4, 0x6aa1d841, 0xb9318393, 0x6a9e5e58, 0xb92c47ae, - 0x6a9ae42e, 0xb9270bf5, - 0x6a9769c1, 0xb921d067, 0x6a93ef13, 0xb91c9505, 0x6a907423, 0xb91759cf, - 0x6a8cf8f1, 0xb9121ec5, - 0x6a897d7d, 0xb90ce3e6, 0x6a8601c8, 0xb907a933, 0x6a8285d1, 0xb9026eac, - 0x6a7f0999, 0xb8fd3451, - 0x6a7b8d1e, 0xb8f7fa21, 0x6a781062, 0xb8f2c01d, 0x6a749365, 0xb8ed8646, - 0x6a711625, 0xb8e84c99, - 0x6a6d98a4, 0xb8e31319, 0x6a6a1ae2, 0xb8ddd9c5, 0x6a669cdd, 0xb8d8a09d, - 0x6a631e97, 0xb8d367a0, - 0x6a5fa010, 0xb8ce2ecf, 0x6a5c2147, 0xb8c8f62b, 0x6a58a23c, 0xb8c3bdb2, - 0x6a5522ef, 0xb8be8565, - 0x6a51a361, 0xb8b94d44, 0x6a4e2392, 0xb8b4154f, 0x6a4aa381, 0xb8aedd86, - 0x6a47232e, 0xb8a9a5e9, - 0x6a43a29a, 0xb8a46e78, 0x6a4021c4, 0xb89f3733, 0x6a3ca0ad, 0xb89a001a, - 0x6a391f54, 0xb894c92d, - 0x6a359db9, 0xb88f926d, 0x6a321bdd, 0xb88a5bd8, 0x6a2e99c0, 0xb885256f, - 0x6a2b1761, 0xb87fef33, - 0x6a2794c1, 0xb87ab922, 0x6a2411df, 0xb875833e, 0x6a208ebb, 0xb8704d85, - 0x6a1d0b57, 0xb86b17f9, - 0x6a1987b0, 0xb865e299, 0x6a1603c8, 0xb860ad66, 0x6a127f9f, 0xb85b785e, - 0x6a0efb35, 0xb8564383, - 0x6a0b7689, 0xb8510ed4, 0x6a07f19b, 0xb84bda51, 0x6a046c6c, 0xb846a5fa, - 0x6a00e6fc, 0xb84171cf, - 0x69fd614a, 0xb83c3dd1, 0x69f9db57, 0xb83709ff, 0x69f65523, 0xb831d659, - 0x69f2cead, 0xb82ca2e0, - 0x69ef47f6, 0xb8276f93, 0x69ebc0fe, 0xb8223c72, 0x69e839c4, 0xb81d097e, - 0x69e4b249, 0xb817d6b6, - 0x69e12a8c, 0xb812a41a, 0x69dda28f, 0xb80d71aa, 0x69da1a50, 0xb8083f67, - 0x69d691cf, 0xb8030d51, - 0x69d3090e, 0xb7fddb67, 0x69cf800b, 0xb7f8a9a9, 0x69cbf6c7, 0xb7f37818, - 0x69c86d41, 0xb7ee46b3, - 0x69c4e37a, 0xb7e9157a, 0x69c15973, 0xb7e3e46e, 0x69bdcf29, 0xb7deb38f, - 0x69ba449f, 0xb7d982dc, - 0x69b6b9d3, 0xb7d45255, 0x69b32ec7, 0xb7cf21fb, 0x69afa378, 0xb7c9f1ce, - 0x69ac17e9, 0xb7c4c1cd, - 0x69a88c19, 0xb7bf91f8, 0x69a50007, 0xb7ba6251, 0x69a173b5, 0xb7b532d6, - 0x699de721, 0xb7b00387, - 0x699a5a4c, 0xb7aad465, 0x6996cd35, 0xb7a5a570, 0x69933fde, 0xb7a076a7, - 0x698fb246, 0xb79b480b, - 0x698c246c, 0xb796199b, 0x69889651, 0xb790eb58, 0x698507f6, 0xb78bbd42, - 0x69817959, 0xb7868f59, - 0x697dea7b, 0xb781619c, 0x697a5b5c, 0xb77c340c, 0x6976cbfc, 0xb77706a9, - 0x69733c5b, 0xb771d972, - 0x696fac78, 0xb76cac69, 0x696c1c55, 0xb7677f8c, 0x69688bf1, 0xb76252db, - 0x6964fb4c, 0xb75d2658, - 0x69616a65, 0xb757fa01, 0x695dd93e, 0xb752cdd8, 0x695a47d6, 0xb74da1db, - 0x6956b62d, 0xb748760b, - 0x69532442, 0xb7434a67, 0x694f9217, 0xb73e1ef1, 0x694bffab, 0xb738f3a7, - 0x69486cfe, 0xb733c88b, - 0x6944da10, 0xb72e9d9b, 0x694146e1, 0xb72972d8, 0x693db371, 0xb7244842, - 0x693a1fc0, 0xb71f1dd9, - 0x69368bce, 0xb719f39e, 0x6932f79b, 0xb714c98e, 0x692f6328, 0xb70f9fac, - 0x692bce73, 0xb70a75f7, - 0x6928397e, 0xb7054c6f, 0x6924a448, 0xb7002314, 0x69210ed1, 0xb6faf9e6, - 0x691d7919, 0xb6f5d0e5, - 0x6919e320, 0xb6f0a812, 0x69164ce7, 0xb6eb7f6b, 0x6912b66c, 0xb6e656f1, - 0x690f1fb1, 0xb6e12ea4, - 0x690b88b5, 0xb6dc0685, 0x6907f178, 0xb6d6de92, 0x690459fb, 0xb6d1b6cd, - 0x6900c23c, 0xb6cc8f35, - 0x68fd2a3d, 0xb6c767ca, 0x68f991fd, 0xb6c2408c, 0x68f5f97d, 0xb6bd197c, - 0x68f260bb, 0xb6b7f298, - 0x68eec7b9, 0xb6b2cbe2, 0x68eb2e76, 0xb6ada559, 0x68e794f3, 0xb6a87efd, - 0x68e3fb2e, 0xb6a358ce, - 0x68e06129, 0xb69e32cd, 0x68dcc6e4, 0xb6990cf9, 0x68d92c5d, 0xb693e752, - 0x68d59196, 0xb68ec1d9, - 0x68d1f68f, 0xb6899c8d, 0x68ce5b46, 0xb684776e, 0x68cabfbd, 0xb67f527c, - 0x68c723f3, 0xb67a2db8, - 0x68c387e9, 0xb6750921, 0x68bfeb9e, 0xb66fe4b8, 0x68bc4f13, 0xb66ac07c, - 0x68b8b247, 0xb6659c6d, - 0x68b5153a, 0xb660788c, 0x68b177ed, 0xb65b54d8, 0x68adda5f, 0xb6563151, - 0x68aa3c90, 0xb6510df8, - 0x68a69e81, 0xb64beacd, 0x68a30031, 0xb646c7ce, 0x689f61a1, 0xb641a4fe, - 0x689bc2d1, 0xb63c825b, - 0x689823bf, 0xb6375fe5, 0x6894846e, 0xb6323d9d, 0x6890e4dc, 0xb62d1b82, - 0x688d4509, 0xb627f995, - 0x6889a4f6, 0xb622d7d6, 0x688604a2, 0xb61db644, 0x6882640e, 0xb61894df, - 0x687ec339, 0xb61373a9, - 0x687b2224, 0xb60e529f, 0x687780ce, 0xb60931c4, 0x6873df38, 0xb6041116, - 0x68703d62, 0xb5fef095, - 0x686c9b4b, 0xb5f9d043, 0x6868f8f4, 0xb5f4b01e, 0x6865565c, 0xb5ef9026, - 0x6861b384, 0xb5ea705d, - 0x685e106c, 0xb5e550c1, 0x685a6d13, 0xb5e03153, 0x6856c979, 0xb5db1212, - 0x685325a0, 0xb5d5f2ff, - 0x684f8186, 0xb5d0d41a, 0x684bdd2c, 0xb5cbb563, 0x68483891, 0xb5c696da, - 0x684493b6, 0xb5c1787e, - 0x6840ee9b, 0xb5bc5a50, 0x683d493f, 0xb5b73c50, 0x6839a3a4, 0xb5b21e7e, - 0x6835fdc7, 0xb5ad00d9, - 0x683257ab, 0xb5a7e362, 0x682eb14e, 0xb5a2c61a, 0x682b0ab1, 0xb59da8ff, - 0x682763d4, 0xb5988c12, - 0x6823bcb7, 0xb5936f53, 0x68201559, 0xb58e52c2, 0x681c6dbb, 0xb589365e, - 0x6818c5dd, 0xb5841a29, - 0x68151dbe, 0xb57efe22, 0x68117560, 0xb579e248, 0x680dccc1, 0xb574c69d, - 0x680a23e2, 0xb56fab1f, - 0x68067ac3, 0xb56a8fd0, 0x6802d164, 0xb56574ae, 0x67ff27c4, 0xb56059bb, - 0x67fb7de5, 0xb55b3ef5, - 0x67f7d3c5, 0xb556245e, 0x67f42965, 0xb55109f5, 0x67f07ec5, 0xb54befba, - 0x67ecd3e5, 0xb546d5ac, - 0x67e928c5, 0xb541bbcd, 0x67e57d64, 0xb53ca21c, 0x67e1d1c4, 0xb5378899, - 0x67de25e3, 0xb5326f45, - 0x67da79c3, 0xb52d561e, 0x67d6cd62, 0xb5283d26, 0x67d320c1, 0xb523245b, - 0x67cf73e1, 0xb51e0bbf, - 0x67cbc6c0, 0xb518f351, 0x67c8195f, 0xb513db12, 0x67c46bbe, 0xb50ec300, - 0x67c0bddd, 0xb509ab1d, - 0x67bd0fbd, 0xb5049368, 0x67b9615c, 0xb4ff7be1, 0x67b5b2bb, 0xb4fa6489, - 0x67b203da, 0xb4f54d5f, - 0x67ae54ba, 0xb4f03663, 0x67aaa559, 0xb4eb1f95, 0x67a6f5b8, 0xb4e608f6, - 0x67a345d8, 0xb4e0f285, - 0x679f95b7, 0xb4dbdc42, 0x679be557, 0xb4d6c62e, 0x679834b6, 0xb4d1b048, - 0x679483d6, 0xb4cc9a90, - 0x6790d2b6, 0xb4c78507, 0x678d2156, 0xb4c26fad, 0x67896fb6, 0xb4bd5a80, - 0x6785bdd6, 0xb4b84582, - 0x67820bb7, 0xb4b330b3, 0x677e5957, 0xb4ae1c12, 0x677aa6b8, 0xb4a9079f, - 0x6776f3d9, 0xb4a3f35b, - 0x677340ba, 0xb49edf45, 0x676f8d5b, 0xb499cb5e, 0x676bd9bd, 0xb494b7a6, - 0x676825de, 0xb48fa41c, - 0x676471c0, 0xb48a90c0, 0x6760bd62, 0xb4857d93, 0x675d08c4, 0xb4806a95, - 0x675953e7, 0xb47b57c5, - 0x67559eca, 0xb4764523, 0x6751e96d, 0xb47132b1, 0x674e33d0, 0xb46c206d, - 0x674a7df4, 0xb4670e57, - 0x6746c7d8, 0xb461fc70, 0x6743117c, 0xb45ceab8, 0x673f5ae0, 0xb457d92f, - 0x673ba405, 0xb452c7d4, - 0x6737ecea, 0xb44db6a8, 0x67343590, 0xb448a5aa, 0x67307df5, 0xb44394db, - 0x672cc61c, 0xb43e843b, - 0x67290e02, 0xb43973ca, 0x672555a9, 0xb4346387, 0x67219d10, 0xb42f5373, - 0x671de438, 0xb42a438e, - 0x671a2b20, 0xb42533d8, 0x671671c8, 0xb4202451, 0x6712b831, 0xb41b14f8, - 0x670efe5a, 0xb41605ce, - 0x670b4444, 0xb410f6d3, 0x670789ee, 0xb40be807, 0x6703cf58, 0xb406d969, - 0x67001483, 0xb401cafb, - 0x66fc596f, 0xb3fcbcbb, 0x66f89e1b, 0xb3f7aeaa, 0x66f4e287, 0xb3f2a0c9, - 0x66f126b4, 0xb3ed9316, - 0x66ed6aa1, 0xb3e88592, 0x66e9ae4f, 0xb3e3783d, 0x66e5f1be, 0xb3de6b17, - 0x66e234ed, 0xb3d95e1f, - 0x66de77dc, 0xb3d45157, 0x66daba8c, 0xb3cf44be, 0x66d6fcfd, 0xb3ca3854, - 0x66d33f2e, 0xb3c52c19, - 0x66cf8120, 0xb3c0200c, 0x66cbc2d2, 0xb3bb142f, 0x66c80445, 0xb3b60881, - 0x66c44579, 0xb3b0fd02, - 0x66c0866d, 0xb3abf1b2, 0x66bcc721, 0xb3a6e691, 0x66b90797, 0xb3a1dba0, - 0x66b547cd, 0xb39cd0dd, - 0x66b187c3, 0xb397c649, 0x66adc77b, 0xb392bbe5, 0x66aa06f3, 0xb38db1b0, - 0x66a6462b, 0xb388a7aa, - 0x66a28524, 0xb3839dd3, 0x669ec3de, 0xb37e942b, 0x669b0259, 0xb3798ab2, - 0x66974095, 0xb3748169, - 0x66937e91, 0xb36f784f, 0x668fbc4e, 0xb36a6f64, 0x668bf9cb, 0xb36566a8, - 0x66883709, 0xb3605e1c, - 0x66847408, 0xb35b55bf, 0x6680b0c8, 0xb3564d91, 0x667ced49, 0xb3514592, - 0x6679298a, 0xb34c3dc3, - 0x6675658c, 0xb3473623, 0x6671a14f, 0xb3422eb2, 0x666ddcd3, 0xb33d2771, - 0x666a1818, 0xb338205f, - 0x6666531d, 0xb333197c, 0x66628de4, 0xb32e12c9, 0x665ec86b, 0xb3290c45, - 0x665b02b3, 0xb32405f1, - 0x66573cbb, 0xb31effcc, 0x66537685, 0xb319f9d6, 0x664fb010, 0xb314f410, - 0x664be95b, 0xb30fee79, - 0x66482267, 0xb30ae912, 0x66445b35, 0xb305e3da, 0x664093c3, 0xb300ded2, - 0x663ccc12, 0xb2fbd9f9, - 0x66390422, 0xb2f6d550, 0x66353bf3, 0xb2f1d0d6, 0x66317385, 0xb2eccc8c, - 0x662daad8, 0xb2e7c871, - 0x6629e1ec, 0xb2e2c486, 0x662618c1, 0xb2ddc0ca, 0x66224f56, 0xb2d8bd3e, - 0x661e85ad, 0xb2d3b9e2, - 0x661abbc5, 0xb2ceb6b5, 0x6616f19e, 0xb2c9b3b8, 0x66132738, 0xb2c4b0ea, - 0x660f5c93, 0xb2bfae4c, - 0x660b91af, 0xb2baabde, 0x6607c68c, 0xb2b5a99f, 0x6603fb2a, 0xb2b0a790, - 0x66002f89, 0xb2aba5b1, - 0x65fc63a9, 0xb2a6a402, 0x65f8978b, 0xb2a1a282, 0x65f4cb2d, 0xb29ca132, - 0x65f0fe91, 0xb297a011, - 0x65ed31b5, 0xb2929f21, 0x65e9649b, 0xb28d9e60, 0x65e59742, 0xb2889dcf, - 0x65e1c9aa, 0xb2839d6d, - 0x65ddfbd3, 0xb27e9d3c, 0x65da2dbd, 0xb2799d3a, 0x65d65f69, 0xb2749d68, - 0x65d290d6, 0xb26f9dc6, - 0x65cec204, 0xb26a9e54, 0x65caf2f3, 0xb2659f12, 0x65c723a3, 0xb2609fff, - 0x65c35415, 0xb25ba11d, - 0x65bf8447, 0xb256a26a, 0x65bbb43b, 0xb251a3e7, 0x65b7e3f1, 0xb24ca594, - 0x65b41367, 0xb247a771, - 0x65b0429f, 0xb242a97e, 0x65ac7198, 0xb23dabbb, 0x65a8a052, 0xb238ae28, - 0x65a4cece, 0xb233b0c5, - 0x65a0fd0b, 0xb22eb392, 0x659d2b09, 0xb229b68f, 0x659958c9, 0xb224b9bc, - 0x6595864a, 0xb21fbd19, - 0x6591b38c, 0xb21ac0a6, 0x658de08f, 0xb215c463, 0x658a0d54, 0xb210c850, - 0x658639db, 0xb20bcc6d, - 0x65826622, 0xb206d0ba, 0x657e922b, 0xb201d537, 0x657abdf6, 0xb1fcd9e5, - 0x6576e982, 0xb1f7dec2, - 0x657314cf, 0xb1f2e3d0, 0x656f3fde, 0xb1ede90e, 0x656b6aae, 0xb1e8ee7c, - 0x6567953f, 0xb1e3f41a, - 0x6563bf92, 0xb1def9e9, 0x655fe9a7, 0xb1d9ffe7, 0x655c137d, 0xb1d50616, - 0x65583d14, 0xb1d00c75, - 0x6554666d, 0xb1cb1304, 0x65508f87, 0xb1c619c3, 0x654cb863, 0xb1c120b3, - 0x6548e101, 0xb1bc27d3, - 0x6545095f, 0xb1b72f23, 0x65413180, 0xb1b236a4, 0x653d5962, 0xb1ad3e55, - 0x65398105, 0xb1a84636, - 0x6535a86b, 0xb1a34e47, 0x6531cf91, 0xb19e5689, 0x652df679, 0xb1995efb, - 0x652a1d23, 0xb194679e, - 0x6526438f, 0xb18f7071, 0x652269bc, 0xb18a7974, 0x651e8faa, 0xb18582a8, - 0x651ab55b, 0xb1808c0c, - 0x6516dacd, 0xb17b95a0, 0x65130000, 0xb1769f65, 0x650f24f5, 0xb171a95b, - 0x650b49ac, 0xb16cb380, - 0x65076e25, 0xb167bdd7, 0x6503925f, 0xb162c85d, 0x64ffb65b, 0xb15dd315, - 0x64fbda18, 0xb158ddfd, - 0x64f7fd98, 0xb153e915, 0x64f420d9, 0xb14ef45e, 0x64f043dc, 0xb149ffd7, - 0x64ec66a0, 0xb1450b81, - 0x64e88926, 0xb140175b, 0x64e4ab6e, 0xb13b2367, 0x64e0cd78, 0xb1362fa2, - 0x64dcef44, 0xb1313c0e, - 0x64d910d1, 0xb12c48ab, 0x64d53220, 0xb1275579, 0x64d15331, 0xb1226277, - 0x64cd7404, 0xb11d6fa6, - 0x64c99498, 0xb1187d05, 0x64c5b4ef, 0xb1138a95, 0x64c1d507, 0xb10e9856, - 0x64bdf4e1, 0xb109a648, - 0x64ba147d, 0xb104b46a, 0x64b633da, 0xb0ffc2bd, 0x64b252fa, 0xb0fad140, - 0x64ae71dc, 0xb0f5dff5, - 0x64aa907f, 0xb0f0eeda, 0x64a6aee4, 0xb0ebfdf0, 0x64a2cd0c, 0xb0e70d37, - 0x649eeaf5, 0xb0e21cae, - 0x649b08a0, 0xb0dd2c56, 0x6497260d, 0xb0d83c2f, 0x6493433c, 0xb0d34c39, - 0x648f602d, 0xb0ce5c74, - 0x648b7ce0, 0xb0c96ce0, 0x64879955, 0xb0c47d7c, 0x6483b58c, 0xb0bf8e4a, - 0x647fd185, 0xb0ba9f48, - 0x647bed3f, 0xb0b5b077, 0x647808bc, 0xb0b0c1d7, 0x647423fb, 0xb0abd368, - 0x64703efc, 0xb0a6e52a, - 0x646c59bf, 0xb0a1f71d, 0x64687444, 0xb09d0941, 0x64648e8c, 0xb0981b96, - 0x6460a895, 0xb0932e1b, - 0x645cc260, 0xb08e40d2, 0x6458dbed, 0xb08953ba, 0x6454f53d, 0xb08466d3, - 0x64510e4e, 0xb07f7a1c, - 0x644d2722, 0xb07a8d97, 0x64493fb8, 0xb075a143, 0x64455810, 0xb070b520, - 0x6441702a, 0xb06bc92e, - 0x643d8806, 0xb066dd6d, 0x64399fa5, 0xb061f1de, 0x6435b706, 0xb05d067f, - 0x6431ce28, 0xb0581b51, - 0x642de50d, 0xb0533055, 0x6429fbb5, 0xb04e458a, 0x6426121e, 0xb0495af0, - 0x6422284a, 0xb0447087, - 0x641e3e38, 0xb03f864f, 0x641a53e8, 0xb03a9c49, 0x6416695a, 0xb035b273, - 0x64127e8f, 0xb030c8cf, - 0x640e9386, 0xb02bdf5c, 0x640aa83f, 0xb026f61b, 0x6406bcba, 0xb0220d0a, - 0x6402d0f8, 0xb01d242b, - 0x63fee4f8, 0xb0183b7d, 0x63faf8bb, 0xb0135301, 0x63f70c3f, 0xb00e6ab5, - 0x63f31f86, 0xb009829c, - 0x63ef3290, 0xb0049ab3, 0x63eb455c, 0xafffb2fc, 0x63e757ea, 0xaffacb76, - 0x63e36a3a, 0xaff5e421, - 0x63df7c4d, 0xaff0fcfe, 0x63db8e22, 0xafec160c, 0x63d79fba, 0xafe72f4c, - 0x63d3b114, 0xafe248bd, - 0x63cfc231, 0xafdd625f, 0x63cbd310, 0xafd87c33, 0x63c7e3b1, 0xafd39638, - 0x63c3f415, 0xafceb06f, - 0x63c0043b, 0xafc9cad7, 0x63bc1424, 0xafc4e571, 0x63b823cf, 0xafc0003c, - 0x63b4333d, 0xafbb1b39, - 0x63b0426d, 0xafb63667, 0x63ac5160, 0xafb151c7, 0x63a86015, 0xafac6d58, - 0x63a46e8d, 0xafa7891b, - 0x63a07cc7, 0xafa2a50f, 0x639c8ac4, 0xaf9dc135, 0x63989884, 0xaf98dd8d, - 0x6394a606, 0xaf93fa16, - 0x6390b34a, 0xaf8f16d1, 0x638cc051, 0xaf8a33bd, 0x6388cd1b, 0xaf8550db, - 0x6384d9a7, 0xaf806e2b, - 0x6380e5f6, 0xaf7b8bac, 0x637cf208, 0xaf76a95f, 0x6378fddc, 0xaf71c743, - 0x63750973, 0xaf6ce55a, - 0x637114cc, 0xaf6803a2, 0x636d1fe9, 0xaf63221c, 0x63692ac7, 0xaf5e40c7, - 0x63653569, 0xaf595fa4, - 0x63613fcd, 0xaf547eb3, 0x635d49f4, 0xaf4f9df4, 0x635953dd, 0xaf4abd66, - 0x63555d8a, 0xaf45dd0b, - 0x635166f9, 0xaf40fce1, 0x634d702b, 0xaf3c1ce9, 0x6349791f, 0xaf373d22, - 0x634581d6, 0xaf325d8e, - 0x63418a50, 0xaf2d7e2b, 0x633d928d, 0xaf289efa, 0x63399a8d, 0xaf23bffb, - 0x6335a24f, 0xaf1ee12e, - 0x6331a9d4, 0xaf1a0293, 0x632db11c, 0xaf15242a, 0x6329b827, 0xaf1045f3, - 0x6325bef5, 0xaf0b67ed, - 0x6321c585, 0xaf068a1a, 0x631dcbd9, 0xaf01ac78, 0x6319d1ef, 0xaefccf09, - 0x6315d7c8, 0xaef7f1cb, - 0x6311dd64, 0xaef314c0, 0x630de2c3, 0xaeee37e6, 0x6309e7e4, 0xaee95b3f, - 0x6305ecc9, 0xaee47ec9, - 0x6301f171, 0xaedfa285, 0x62fdf5db, 0xaedac674, 0x62f9fa09, 0xaed5ea95, - 0x62f5fdf9, 0xaed10ee7, - 0x62f201ac, 0xaecc336c, 0x62ee0523, 0xaec75823, 0x62ea085c, 0xaec27d0c, - 0x62e60b58, 0xaebda227, - 0x62e20e17, 0xaeb8c774, 0x62de109a, 0xaeb3ecf3, 0x62da12df, 0xaeaf12a4, - 0x62d614e7, 0xaeaa3888, - 0x62d216b3, 0xaea55e9e, 0x62ce1841, 0xaea084e6, 0x62ca1992, 0xae9bab60, - 0x62c61aa7, 0xae96d20c, - 0x62c21b7e, 0xae91f8eb, 0x62be1c19, 0xae8d1ffb, 0x62ba1c77, 0xae88473e, - 0x62b61c98, 0xae836eb4, - 0x62b21c7b, 0xae7e965b, 0x62ae1c23, 0xae79be35, 0x62aa1b8d, 0xae74e641, - 0x62a61aba, 0xae700e80, - 0x62a219aa, 0xae6b36f0, 0x629e185e, 0xae665f93, 0x629a16d5, 0xae618869, - 0x6296150f, 0xae5cb171, - 0x6292130c, 0xae57daab, 0x628e10cc, 0xae530417, 0x628a0e50, 0xae4e2db6, - 0x62860b97, 0xae495787, - 0x628208a1, 0xae44818b, 0x627e056e, 0xae3fabc1, 0x627a01fe, 0xae3ad629, - 0x6275fe52, 0xae3600c4, - 0x6271fa69, 0xae312b92, 0x626df643, 0xae2c5691, 0x6269f1e1, 0xae2781c4, - 0x6265ed42, 0xae22ad29, - 0x6261e866, 0xae1dd8c0, 0x625de34e, 0xae19048a, 0x6259ddf8, 0xae143086, - 0x6255d866, 0xae0f5cb5, - 0x6251d298, 0xae0a8916, 0x624dcc8d, 0xae05b5aa, 0x6249c645, 0xae00e271, - 0x6245bfc0, 0xadfc0f6a, - 0x6241b8ff, 0xadf73c96, 0x623db202, 0xadf269f4, 0x6239aac7, 0xaded9785, - 0x6235a351, 0xade8c548, - 0x62319b9d, 0xade3f33e, 0x622d93ad, 0xaddf2167, 0x62298b81, 0xadda4fc3, - 0x62258317, 0xadd57e51, - 0x62217a72, 0xadd0ad12, 0x621d7190, 0xadcbdc05, 0x62196871, 0xadc70b2c, - 0x62155f16, 0xadc23a85, - 0x6211557e, 0xadbd6a10, 0x620d4baa, 0xadb899cf, 0x62094199, 0xadb3c9c0, - 0x6205374c, 0xadaef9e4, - 0x62012cc2, 0xadaa2a3b, 0x61fd21fc, 0xada55ac4, 0x61f916f9, 0xada08b80, - 0x61f50bba, 0xad9bbc70, - 0x61f1003f, 0xad96ed92, 0x61ecf487, 0xad921ee6, 0x61e8e893, 0xad8d506e, - 0x61e4dc62, 0xad888229, - 0x61e0cff5, 0xad83b416, 0x61dcc34c, 0xad7ee636, 0x61d8b666, 0xad7a1889, - 0x61d4a944, 0xad754b0f, - 0x61d09be5, 0xad707dc8, 0x61cc8e4b, 0xad6bb0b4, 0x61c88074, 0xad66e3d3, - 0x61c47260, 0xad621725, - 0x61c06410, 0xad5d4aaa, 0x61bc5584, 0xad587e61, 0x61b846bc, 0xad53b24c, - 0x61b437b7, 0xad4ee66a, - 0x61b02876, 0xad4a1aba, 0x61ac18f9, 0xad454f3e, 0x61a80940, 0xad4083f5, - 0x61a3f94a, 0xad3bb8df, - 0x619fe918, 0xad36edfc, 0x619bd8aa, 0xad32234b, 0x6197c800, 0xad2d58ce, - 0x6193b719, 0xad288e85, - 0x618fa5f7, 0xad23c46e, 0x618b9498, 0xad1efa8a, 0x618782fd, 0xad1a30d9, - 0x61837126, 0xad15675c, - 0x617f5f12, 0xad109e12, 0x617b4cc3, 0xad0bd4fb, 0x61773a37, 0xad070c17, - 0x61732770, 0xad024366, - 0x616f146c, 0xacfd7ae8, 0x616b012c, 0xacf8b29e, 0x6166edb0, 0xacf3ea87, - 0x6162d9f8, 0xacef22a3, - 0x615ec603, 0xacea5af2, 0x615ab1d3, 0xace59375, 0x61569d67, 0xace0cc2b, - 0x615288be, 0xacdc0514, - 0x614e73da, 0xacd73e30, 0x614a5eba, 0xacd27780, 0x6146495d, 0xaccdb103, - 0x614233c5, 0xacc8eab9, - 0x613e1df0, 0xacc424a3, 0x613a07e0, 0xacbf5ec0, 0x6135f193, 0xacba9910, - 0x6131db0b, 0xacb5d394, - 0x612dc447, 0xacb10e4b, 0x6129ad46, 0xacac4935, 0x6125960a, 0xaca78453, - 0x61217e92, 0xaca2bfa4, - 0x611d66de, 0xac9dfb29, 0x61194eee, 0xac9936e1, 0x611536c2, 0xac9472cd, - 0x61111e5b, 0xac8faeec, - 0x610d05b7, 0xac8aeb3e, 0x6108ecd8, 0xac8627c4, 0x6104d3bc, 0xac81647e, - 0x6100ba65, 0xac7ca16b, - 0x60fca0d2, 0xac77de8b, 0x60f88703, 0xac731bdf, 0x60f46cf9, 0xac6e5967, - 0x60f052b2, 0xac699722, - 0x60ec3830, 0xac64d510, 0x60e81d72, 0xac601333, 0x60e40278, 0xac5b5189, - 0x60dfe743, 0xac569012, - 0x60dbcbd1, 0xac51cecf, 0x60d7b024, 0xac4d0dc0, 0x60d3943b, 0xac484ce4, - 0x60cf7817, 0xac438c3c, - 0x60cb5bb7, 0xac3ecbc7, 0x60c73f1b, 0xac3a0b87, 0x60c32243, 0xac354b7a, - 0x60bf0530, 0xac308ba0, - 0x60bae7e1, 0xac2bcbfa, 0x60b6ca56, 0xac270c88, 0x60b2ac8f, 0xac224d4a, - 0x60ae8e8d, 0xac1d8e40, - 0x60aa7050, 0xac18cf69, 0x60a651d7, 0xac1410c6, 0x60a23322, 0xac0f5256, - 0x609e1431, 0xac0a941b, - 0x6099f505, 0xac05d613, 0x6095d59d, 0xac01183f, 0x6091b5fa, 0xabfc5a9f, - 0x608d961b, 0xabf79d33, - 0x60897601, 0xabf2dffb, 0x608555ab, 0xabee22f6, 0x60813519, 0xabe96625, - 0x607d144c, 0xabe4a988, - 0x6078f344, 0xabdfed1f, 0x6074d200, 0xabdb30ea, 0x6070b080, 0xabd674e9, - 0x606c8ec5, 0xabd1b91c, - 0x60686ccf, 0xabccfd83, 0x60644a9d, 0xabc8421d, 0x6060282f, 0xabc386ec, - 0x605c0587, 0xabbecbee, - 0x6057e2a2, 0xabba1125, 0x6053bf82, 0xabb5568f, 0x604f9c27, 0xabb09c2e, - 0x604b7891, 0xababe200, - 0x604754bf, 0xaba72807, 0x604330b1, 0xaba26e41, 0x603f0c69, 0xab9db4b0, - 0x603ae7e5, 0xab98fb52, - 0x6036c325, 0xab944229, 0x60329e2a, 0xab8f8934, 0x602e78f4, 0xab8ad073, - 0x602a5383, 0xab8617e6, - 0x60262dd6, 0xab815f8d, 0x602207ee, 0xab7ca768, 0x601de1ca, 0xab77ef77, - 0x6019bb6b, 0xab7337bb, - 0x601594d1, 0xab6e8032, 0x60116dfc, 0xab69c8de, 0x600d46ec, 0xab6511be, - 0x60091fa0, 0xab605ad2, - 0x6004f819, 0xab5ba41a, 0x6000d057, 0xab56ed97, 0x5ffca859, 0xab523748, - 0x5ff88021, 0xab4d812d, - 0x5ff457ad, 0xab48cb46, 0x5ff02efe, 0xab441593, 0x5fec0613, 0xab3f6015, - 0x5fe7dcee, 0xab3aaacb, - 0x5fe3b38d, 0xab35f5b5, 0x5fdf89f2, 0xab3140d4, 0x5fdb601b, 0xab2c8c27, - 0x5fd73609, 0xab27d7ae, - 0x5fd30bbc, 0xab23236a, 0x5fcee133, 0xab1e6f5a, 0x5fcab670, 0xab19bb7e, - 0x5fc68b72, 0xab1507d7, - 0x5fc26038, 0xab105464, 0x5fbe34c4, 0xab0ba125, 0x5fba0914, 0xab06ee1b, - 0x5fb5dd29, 0xab023b46, - 0x5fb1b104, 0xaafd88a4, 0x5fad84a3, 0xaaf8d637, 0x5fa95807, 0xaaf423ff, - 0x5fa52b31, 0xaaef71fb, - 0x5fa0fe1f, 0xaaeac02c, 0x5f9cd0d2, 0xaae60e91, 0x5f98a34a, 0xaae15d2a, - 0x5f947588, 0xaadcabf8, - 0x5f90478a, 0xaad7fafb, 0x5f8c1951, 0xaad34a32, 0x5f87eade, 0xaace999d, - 0x5f83bc2f, 0xaac9e93e, - 0x5f7f8d46, 0xaac53912, 0x5f7b5e22, 0xaac0891c, 0x5f772ec2, 0xaabbd959, - 0x5f72ff28, 0xaab729cc, - 0x5f6ecf53, 0xaab27a73, 0x5f6a9f44, 0xaaadcb4f, 0x5f666ef9, 0xaaa91c5f, - 0x5f623e73, 0xaaa46da4, - 0x5f5e0db3, 0xaa9fbf1e, 0x5f59dcb8, 0xaa9b10cc, 0x5f55ab82, 0xaa9662af, - 0x5f517a11, 0xaa91b4c7, - 0x5f4d4865, 0xaa8d0713, 0x5f49167f, 0xaa885994, 0x5f44e45e, 0xaa83ac4a, - 0x5f40b202, 0xaa7eff34, - 0x5f3c7f6b, 0xaa7a5253, 0x5f384c9a, 0xaa75a5a8, 0x5f34198e, 0xaa70f930, - 0x5f2fe647, 0xaa6c4cee, - 0x5f2bb2c5, 0xaa67a0e0, 0x5f277f09, 0xaa62f507, 0x5f234b12, 0xaa5e4963, - 0x5f1f16e0, 0xaa599df4, - 0x5f1ae274, 0xaa54f2ba, 0x5f16adcc, 0xaa5047b4, 0x5f1278eb, 0xaa4b9ce3, - 0x5f0e43ce, 0xaa46f248, - 0x5f0a0e77, 0xaa4247e1, 0x5f05d8e6, 0xaa3d9daf, 0x5f01a31a, 0xaa38f3b1, - 0x5efd6d13, 0xaa3449e9, - 0x5ef936d1, 0xaa2fa056, 0x5ef50055, 0xaa2af6f7, 0x5ef0c99f, 0xaa264dce, - 0x5eec92ae, 0xaa21a4d9, - 0x5ee85b82, 0xaa1cfc1a, 0x5ee4241c, 0xaa18538f, 0x5edfec7b, 0xaa13ab3a, - 0x5edbb49f, 0xaa0f0319, - 0x5ed77c8a, 0xaa0a5b2e, 0x5ed34439, 0xaa05b377, 0x5ecf0baf, 0xaa010bf6, - 0x5ecad2e9, 0xa9fc64a9, - 0x5ec699e9, 0xa9f7bd92, 0x5ec260af, 0xa9f316b0, 0x5ebe273b, 0xa9ee7002, - 0x5eb9ed8b, 0xa9e9c98a, - 0x5eb5b3a2, 0xa9e52347, 0x5eb1797e, 0xa9e07d39, 0x5ead3f1f, 0xa9dbd761, - 0x5ea90487, 0xa9d731bd, - 0x5ea4c9b3, 0xa9d28c4e, 0x5ea08ea6, 0xa9cde715, 0x5e9c535e, 0xa9c94211, - 0x5e9817dc, 0xa9c49d42, - 0x5e93dc1f, 0xa9bff8a8, 0x5e8fa028, 0xa9bb5444, 0x5e8b63f7, 0xa9b6b014, - 0x5e87278b, 0xa9b20c1a, - 0x5e82eae5, 0xa9ad6855, 0x5e7eae05, 0xa9a8c4c5, 0x5e7a70ea, 0xa9a4216b, - 0x5e763395, 0xa99f7e46, - 0x5e71f606, 0xa99adb56, 0x5e6db83d, 0xa996389b, 0x5e697a39, 0xa9919616, - 0x5e653bfc, 0xa98cf3c6, - 0x5e60fd84, 0xa98851ac, 0x5e5cbed1, 0xa983afc6, 0x5e587fe5, 0xa97f0e16, - 0x5e5440be, 0xa97a6c9c, - 0x5e50015d, 0xa975cb57, 0x5e4bc1c2, 0xa9712a47, 0x5e4781ed, 0xa96c896c, - 0x5e4341de, 0xa967e8c7, - 0x5e3f0194, 0xa9634858, 0x5e3ac110, 0xa95ea81d, 0x5e368053, 0xa95a0819, - 0x5e323f5b, 0xa9556849, - 0x5e2dfe29, 0xa950c8b0, 0x5e29bcbd, 0xa94c294b, 0x5e257b17, 0xa9478a1c, - 0x5e213936, 0xa942eb23, - 0x5e1cf71c, 0xa93e4c5f, 0x5e18b4c8, 0xa939add1, 0x5e147239, 0xa9350f78, - 0x5e102f71, 0xa9307155, - 0x5e0bec6e, 0xa92bd367, 0x5e07a932, 0xa92735af, 0x5e0365bb, 0xa922982c, - 0x5dff220b, 0xa91dfadf, - 0x5dfade20, 0xa9195dc7, 0x5df699fc, 0xa914c0e6, 0x5df2559e, 0xa9102439, - 0x5dee1105, 0xa90b87c3, - 0x5de9cc33, 0xa906eb82, 0x5de58727, 0xa9024f76, 0x5de141e1, 0xa8fdb3a1, - 0x5ddcfc61, 0xa8f91801, - 0x5dd8b6a7, 0xa8f47c97, 0x5dd470b3, 0xa8efe162, 0x5dd02a85, 0xa8eb4663, - 0x5dcbe41d, 0xa8e6ab9a, - 0x5dc79d7c, 0xa8e21106, 0x5dc356a1, 0xa8dd76a9, 0x5dbf0f8c, 0xa8d8dc81, - 0x5dbac83d, 0xa8d4428f, - 0x5db680b4, 0xa8cfa8d2, 0x5db238f1, 0xa8cb0f4b, 0x5dadf0f5, 0xa8c675fb, - 0x5da9a8bf, 0xa8c1dce0, - 0x5da5604f, 0xa8bd43fa, 0x5da117a5, 0xa8b8ab4b, 0x5d9ccec2, 0xa8b412d1, - 0x5d9885a5, 0xa8af7a8e, - 0x5d943c4e, 0xa8aae280, 0x5d8ff2bd, 0xa8a64aa8, 0x5d8ba8f3, 0xa8a1b306, - 0x5d875eef, 0xa89d1b99, - 0x5d8314b1, 0xa8988463, 0x5d7eca39, 0xa893ed63, 0x5d7a7f88, 0xa88f5698, - 0x5d76349d, 0xa88ac004, - 0x5d71e979, 0xa88629a5, 0x5d6d9e1b, 0xa881937c, 0x5d695283, 0xa87cfd8a, - 0x5d6506b2, 0xa87867cd, - 0x5d60baa7, 0xa873d246, 0x5d5c6e62, 0xa86f3cf6, 0x5d5821e4, 0xa86aa7db, - 0x5d53d52d, 0xa86612f6, - 0x5d4f883b, 0xa8617e48, 0x5d4b3b10, 0xa85ce9cf, 0x5d46edac, 0xa858558d, - 0x5d42a00e, 0xa853c180, - 0x5d3e5237, 0xa84f2daa, 0x5d3a0426, 0xa84a9a0a, 0x5d35b5db, 0xa84606a0, - 0x5d316757, 0xa841736c, - 0x5d2d189a, 0xa83ce06e, 0x5d28c9a3, 0xa8384da6, 0x5d247a72, 0xa833bb14, - 0x5d202b09, 0xa82f28b9, - 0x5d1bdb65, 0xa82a9693, 0x5d178b89, 0xa82604a4, 0x5d133b72, 0xa82172eb, - 0x5d0eeb23, 0xa81ce169, - 0x5d0a9a9a, 0xa818501c, 0x5d0649d7, 0xa813bf06, 0x5d01f8dc, 0xa80f2e26, - 0x5cfda7a7, 0xa80a9d7c, - 0x5cf95638, 0xa8060d08, 0x5cf50490, 0xa8017ccb, 0x5cf0b2af, 0xa7fcecc4, - 0x5cec6095, 0xa7f85cf3, - 0x5ce80e41, 0xa7f3cd59, 0x5ce3bbb4, 0xa7ef3df5, 0x5cdf68ed, 0xa7eaaec7, - 0x5cdb15ed, 0xa7e61fd0, - 0x5cd6c2b5, 0xa7e1910f, 0x5cd26f42, 0xa7dd0284, 0x5cce1b97, 0xa7d8742f, - 0x5cc9c7b2, 0xa7d3e611, - 0x5cc57394, 0xa7cf582a, 0x5cc11f3d, 0xa7caca79, 0x5cbccaac, 0xa7c63cfe, - 0x5cb875e3, 0xa7c1afb9, - 0x5cb420e0, 0xa7bd22ac, 0x5cafcba4, 0xa7b895d4, 0x5cab762f, 0xa7b40933, - 0x5ca72080, 0xa7af7cc8, - 0x5ca2ca99, 0xa7aaf094, 0x5c9e7478, 0xa7a66497, 0x5c9a1e1e, 0xa7a1d8d0, - 0x5c95c78b, 0xa79d4d3f, - 0x5c9170bf, 0xa798c1e5, 0x5c8d19ba, 0xa79436c1, 0x5c88c27c, 0xa78fabd4, - 0x5c846b05, 0xa78b211e, - 0x5c801354, 0xa786969e, 0x5c7bbb6b, 0xa7820c55, 0x5c776348, 0xa77d8242, - 0x5c730aed, 0xa778f866, - 0x5c6eb258, 0xa7746ec0, 0x5c6a598b, 0xa76fe551, 0x5c660084, 0xa76b5c19, - 0x5c61a745, 0xa766d317, - 0x5c5d4dcc, 0xa7624a4d, 0x5c58f41a, 0xa75dc1b8, 0x5c549a30, 0xa759395b, - 0x5c50400d, 0xa754b134, - 0x5c4be5b0, 0xa7502943, 0x5c478b1b, 0xa74ba18a, 0x5c43304d, 0xa7471a07, - 0x5c3ed545, 0xa74292bb, - 0x5c3a7a05, 0xa73e0ba5, 0x5c361e8c, 0xa73984c7, 0x5c31c2db, 0xa734fe1f, - 0x5c2d66f0, 0xa73077ae, - 0x5c290acc, 0xa72bf174, 0x5c24ae70, 0xa7276b70, 0x5c2051db, 0xa722e5a3, - 0x5c1bf50d, 0xa71e600d, - 0x5c179806, 0xa719daae, 0x5c133ac6, 0xa7155586, 0x5c0edd4e, 0xa710d095, - 0x5c0a7f9c, 0xa70c4bda, - 0x5c0621b2, 0xa707c757, 0x5c01c38f, 0xa703430a, 0x5bfd6534, 0xa6febef4, - 0x5bf906a0, 0xa6fa3b15, - 0x5bf4a7d2, 0xa6f5b76d, 0x5bf048cd, 0xa6f133fc, 0x5bebe98e, 0xa6ecb0c2, - 0x5be78a17, 0xa6e82dbe, - 0x5be32a67, 0xa6e3aaf2, 0x5bdeca7f, 0xa6df285d, 0x5bda6a5d, 0xa6daa5fe, - 0x5bd60a03, 0xa6d623d7, - 0x5bd1a971, 0xa6d1a1e7, 0x5bcd48a6, 0xa6cd202d, 0x5bc8e7a2, 0xa6c89eab, - 0x5bc48666, 0xa6c41d60, - 0x5bc024f0, 0xa6bf9c4b, 0x5bbbc343, 0xa6bb1b6e, 0x5bb7615d, 0xa6b69ac8, - 0x5bb2ff3e, 0xa6b21a59, - 0x5bae9ce7, 0xa6ad9a21, 0x5baa3a57, 0xa6a91a20, 0x5ba5d78e, 0xa6a49a56, - 0x5ba1748d, 0xa6a01ac4, - 0x5b9d1154, 0xa69b9b68, 0x5b98ade2, 0xa6971c44, 0x5b944a37, 0xa6929d57, - 0x5b8fe654, 0xa68e1ea1, - 0x5b8b8239, 0xa689a022, 0x5b871de5, 0xa68521da, 0x5b82b958, 0xa680a3ca, - 0x5b7e5493, 0xa67c25f0, - 0x5b79ef96, 0xa677a84e, 0x5b758a60, 0xa6732ae3, 0x5b7124f2, 0xa66eadb0, - 0x5b6cbf4c, 0xa66a30b3, - 0x5b68596d, 0xa665b3ee, 0x5b63f355, 0xa6613760, 0x5b5f8d06, 0xa65cbb0a, - 0x5b5b267e, 0xa6583eeb, - 0x5b56bfbd, 0xa653c303, 0x5b5258c4, 0xa64f4752, 0x5b4df193, 0xa64acbd9, - 0x5b498a2a, 0xa6465097, - 0x5b452288, 0xa641d58c, 0x5b40baae, 0xa63d5ab9, 0x5b3c529c, 0xa638e01d, - 0x5b37ea51, 0xa63465b9, - 0x5b3381ce, 0xa62feb8b, 0x5b2f1913, 0xa62b7196, 0x5b2ab020, 0xa626f7d7, - 0x5b2646f4, 0xa6227e50, - 0x5b21dd90, 0xa61e0501, 0x5b1d73f4, 0xa6198be9, 0x5b190a20, 0xa6151308, - 0x5b14a014, 0xa6109a5f, - 0x5b1035cf, 0xa60c21ee, 0x5b0bcb52, 0xa607a9b4, 0x5b07609d, 0xa60331b1, - 0x5b02f5b0, 0xa5feb9e6, - 0x5afe8a8b, 0xa5fa4252, 0x5afa1f2e, 0xa5f5caf6, 0x5af5b398, 0xa5f153d2, - 0x5af147ca, 0xa5ecdce5, - 0x5aecdbc5, 0xa5e8662f, 0x5ae86f87, 0xa5e3efb1, 0x5ae40311, 0xa5df796b, - 0x5adf9663, 0xa5db035c, - 0x5adb297d, 0xa5d68d85, 0x5ad6bc5f, 0xa5d217e6, 0x5ad24f09, 0xa5cda27e, - 0x5acde17b, 0xa5c92d4e, - 0x5ac973b5, 0xa5c4b855, 0x5ac505b7, 0xa5c04395, 0x5ac09781, 0xa5bbcf0b, - 0x5abc2912, 0xa5b75aba, - 0x5ab7ba6c, 0xa5b2e6a0, 0x5ab34b8e, 0xa5ae72be, 0x5aaedc78, 0xa5a9ff14, - 0x5aaa6d2b, 0xa5a58ba1, - 0x5aa5fda5, 0xa5a11866, 0x5aa18de7, 0xa59ca563, 0x5a9d1df1, 0xa5983297, - 0x5a98adc4, 0xa593c004, - 0x5a943d5e, 0xa58f4da8, 0x5a8fccc1, 0xa58adb84, 0x5a8b5bec, 0xa5866997, - 0x5a86eadf, 0xa581f7e3, - 0x5a82799a, 0xa57d8666, 0x5a7e081d, 0xa5791521, 0x5a799669, 0xa574a414, - 0x5a75247c, 0xa570333f, - 0x5a70b258, 0xa56bc2a2, 0x5a6c3ffc, 0xa567523c, 0x5a67cd69, 0xa562e20f, - 0x5a635a9d, 0xa55e7219, - 0x5a5ee79a, 0xa55a025b, 0x5a5a745f, 0xa55592d5, 0x5a5600ec, 0xa5512388, - 0x5a518d42, 0xa54cb472, - 0x5a4d1960, 0xa5484594, 0x5a48a546, 0xa543d6ee, 0x5a4430f5, 0xa53f687f, - 0x5a3fbc6b, 0xa53afa49, - 0x5a3b47ab, 0xa5368c4b, 0x5a36d2b2, 0xa5321e85, 0x5a325d82, 0xa52db0f7, - 0x5a2de81a, 0xa52943a1, - 0x5a29727b, 0xa524d683, 0x5a24fca4, 0xa520699d, 0x5a208695, 0xa51bfcef, - 0x5a1c104f, 0xa5179079, - 0x5a1799d1, 0xa513243b, 0x5a13231b, 0xa50eb836, 0x5a0eac2e, 0xa50a4c68, - 0x5a0a350a, 0xa505e0d2, - 0x5a05bdae, 0xa5017575, 0x5a01461a, 0xa4fd0a50, 0x59fcce4f, 0xa4f89f63, - 0x59f8564c, 0xa4f434ae, - 0x59f3de12, 0xa4efca31, 0x59ef65a1, 0xa4eb5fec, 0x59eaecf8, 0xa4e6f5e0, - 0x59e67417, 0xa4e28c0c, - 0x59e1faff, 0xa4de2270, 0x59dd81b0, 0xa4d9b90c, 0x59d90829, 0xa4d54fe0, - 0x59d48e6a, 0xa4d0e6ed, - 0x59d01475, 0xa4cc7e32, 0x59cb9a47, 0xa4c815af, 0x59c71fe3, 0xa4c3ad64, - 0x59c2a547, 0xa4bf4552, - 0x59be2a74, 0xa4badd78, 0x59b9af69, 0xa4b675d6, 0x59b53427, 0xa4b20e6d, - 0x59b0b8ae, 0xa4ada73c, - 0x59ac3cfd, 0xa4a94043, 0x59a7c115, 0xa4a4d982, 0x59a344f6, 0xa4a072fa, - 0x599ec8a0, 0xa49c0cab, - 0x599a4c12, 0xa497a693, 0x5995cf4d, 0xa49340b4, 0x59915250, 0xa48edb0e, - 0x598cd51d, 0xa48a75a0, - 0x598857b2, 0xa486106a, 0x5983da10, 0xa481ab6d, 0x597f5c36, 0xa47d46a8, - 0x597ade26, 0xa478e21b, - 0x59765fde, 0xa4747dc7, 0x5971e15f, 0xa47019ac, 0x596d62a9, 0xa46bb5c9, - 0x5968e3bc, 0xa467521e, - 0x59646498, 0xa462eeac, 0x595fe53c, 0xa45e8b73, 0x595b65aa, 0xa45a2872, - 0x5956e5e0, 0xa455c5a9, - 0x595265df, 0xa4516319, 0x594de5a7, 0xa44d00c2, 0x59496538, 0xa4489ea3, - 0x5944e492, 0xa4443cbd, - 0x594063b5, 0xa43fdb10, 0x593be2a0, 0xa43b799a, 0x59376155, 0xa437185e, - 0x5932dfd3, 0xa432b75a, - 0x592e5e19, 0xa42e568f, 0x5929dc29, 0xa429f5fd, 0x59255a02, 0xa42595a3, - 0x5920d7a3, 0xa4213581, - 0x591c550e, 0xa41cd599, 0x5917d242, 0xa41875e9, 0x59134f3e, 0xa4141672, - 0x590ecc04, 0xa40fb733, - 0x590a4893, 0xa40b582e, 0x5905c4eb, 0xa406f960, 0x5901410c, 0xa4029acc, - 0x58fcbcf6, 0xa3fe3c71, - 0x58f838a9, 0xa3f9de4e, 0x58f3b426, 0xa3f58064, 0x58ef2f6b, 0xa3f122b2, - 0x58eaaa7a, 0xa3ecc53a, - 0x58e62552, 0xa3e867fa, 0x58e19ff3, 0xa3e40af3, 0x58dd1a5d, 0xa3dfae25, - 0x58d89490, 0xa3db5190, - 0x58d40e8c, 0xa3d6f534, 0x58cf8852, 0xa3d29910, 0x58cb01e1, 0xa3ce3d25, - 0x58c67b39, 0xa3c9e174, - 0x58c1f45b, 0xa3c585fb, 0x58bd6d45, 0xa3c12abb, 0x58b8e5f9, 0xa3bccfb3, - 0x58b45e76, 0xa3b874e5, - 0x58afd6bd, 0xa3b41a50, 0x58ab4ecc, 0xa3afbff3, 0x58a6c6a5, 0xa3ab65d0, - 0x58a23e48, 0xa3a70be6, - 0x589db5b3, 0xa3a2b234, 0x58992ce9, 0xa39e58bb, 0x5894a3e7, 0xa399ff7c, - 0x58901aaf, 0xa395a675, - 0x588b9140, 0xa3914da8, 0x5887079a, 0xa38cf513, 0x58827dbe, 0xa3889cb8, - 0x587df3ab, 0xa3844495, - 0x58796962, 0xa37fecac, 0x5874dee2, 0xa37b94fb, 0x5870542c, 0xa3773d84, - 0x586bc93f, 0xa372e646, - 0x58673e1b, 0xa36e8f41, 0x5862b2c1, 0xa36a3875, 0x585e2730, 0xa365e1e2, - 0x58599b69, 0xa3618b88, - 0x58550f6c, 0xa35d3567, 0x58508338, 0xa358df80, 0x584bf6cd, 0xa35489d1, - 0x58476a2c, 0xa350345c, - 0x5842dd54, 0xa34bdf20, 0x583e5047, 0xa3478a1d, 0x5839c302, 0xa3433554, - 0x58353587, 0xa33ee0c3, - 0x5830a7d6, 0xa33a8c6c, 0x582c19ef, 0xa336384e, 0x58278bd1, 0xa331e469, - 0x5822fd7c, 0xa32d90be, - 0x581e6ef1, 0xa3293d4b, 0x5819e030, 0xa324ea13, 0x58155139, 0xa3209713, - 0x5810c20b, 0xa31c444c, - 0x580c32a7, 0xa317f1bf, 0x5807a30d, 0xa3139f6b, 0x5803133c, 0xa30f4d51, - 0x57fe8335, 0xa30afb70, - 0x57f9f2f8, 0xa306a9c8, 0x57f56284, 0xa3025859, 0x57f0d1da, 0xa2fe0724, - 0x57ec40fa, 0xa2f9b629, - 0x57e7afe4, 0xa2f56566, 0x57e31e97, 0xa2f114dd, 0x57de8d15, 0xa2ecc48e, - 0x57d9fb5c, 0xa2e87477, - 0x57d5696d, 0xa2e4249b, 0x57d0d747, 0xa2dfd4f7, 0x57cc44ec, 0xa2db858e, - 0x57c7b25a, 0xa2d7365d, - 0x57c31f92, 0xa2d2e766, 0x57be8c94, 0xa2ce98a9, 0x57b9f960, 0xa2ca4a25, - 0x57b565f6, 0xa2c5fbda, - 0x57b0d256, 0xa2c1adc9, 0x57ac3e80, 0xa2bd5ff2, 0x57a7aa73, 0xa2b91254, - 0x57a31631, 0xa2b4c4f0, - 0x579e81b8, 0xa2b077c5, 0x5799ed0a, 0xa2ac2ad3, 0x57955825, 0xa2a7de1c, - 0x5790c30a, 0xa2a3919e, - 0x578c2dba, 0xa29f4559, 0x57879833, 0xa29af94e, 0x57830276, 0xa296ad7d, - 0x577e6c84, 0xa29261e5, - 0x5779d65b, 0xa28e1687, 0x57753ffc, 0xa289cb63, 0x5770a968, 0xa2858078, - 0x576c129d, 0xa28135c7, - 0x57677b9d, 0xa27ceb4f, 0x5762e467, 0xa278a111, 0x575e4cfa, 0xa274570d, - 0x5759b558, 0xa2700d43, - 0x57551d80, 0xa26bc3b2, 0x57508572, 0xa2677a5b, 0x574bed2f, 0xa263313e, - 0x574754b5, 0xa25ee85b, - 0x5742bc06, 0xa25a9fb1, 0x573e2320, 0xa2565741, 0x57398a05, 0xa2520f0b, - 0x5734f0b5, 0xa24dc70f, - 0x5730572e, 0xa2497f4c, 0x572bbd71, 0xa24537c3, 0x5727237f, 0xa240f074, - 0x57228957, 0xa23ca95f, - 0x571deefa, 0xa2386284, 0x57195466, 0xa2341be3, 0x5714b99d, 0xa22fd57b, - 0x57101e9e, 0xa22b8f4d, - 0x570b8369, 0xa2274959, 0x5706e7ff, 0xa223039f, 0x57024c5f, 0xa21ebe1f, - 0x56fdb08a, 0xa21a78d9, - 0x56f9147e, 0xa21633cd, 0x56f4783d, 0xa211eefb, 0x56efdbc7, 0xa20daa62, - 0x56eb3f1a, 0xa2096604, - 0x56e6a239, 0xa20521e0, 0x56e20521, 0xa200ddf5, 0x56dd67d4, 0xa1fc9a45, - 0x56d8ca51, 0xa1f856ce, - 0x56d42c99, 0xa1f41392, 0x56cf8eab, 0xa1efd08f, 0x56caf088, 0xa1eb8dc7, - 0x56c6522f, 0xa1e74b38, - 0x56c1b3a1, 0xa1e308e4, 0x56bd14dd, 0xa1dec6ca, 0x56b875e4, 0xa1da84e9, - 0x56b3d6b5, 0xa1d64343, - 0x56af3750, 0xa1d201d7, 0x56aa97b7, 0xa1cdc0a5, 0x56a5f7e7, 0xa1c97fad, - 0x56a157e3, 0xa1c53ef0, - 0x569cb7a8, 0xa1c0fe6c, 0x56981739, 0xa1bcbe22, 0x56937694, 0xa1b87e13, - 0x568ed5b9, 0xa1b43e3e, - 0x568a34a9, 0xa1affea3, 0x56859364, 0xa1abbf42, 0x5680f1ea, 0xa1a7801b, - 0x567c503a, 0xa1a3412f, - 0x5677ae54, 0xa19f027c, 0x56730c3a, 0xa19ac404, 0x566e69ea, 0xa19685c7, - 0x5669c765, 0xa19247c3, - 0x566524aa, 0xa18e09fa, 0x566081ba, 0xa189cc6b, 0x565bde95, 0xa1858f16, - 0x56573b3b, 0xa18151fb, - 0x565297ab, 0xa17d151b, 0x564df3e6, 0xa178d875, 0x56494fec, 0xa1749c09, - 0x5644abbc, 0xa1705fd8, - 0x56400758, 0xa16c23e1, 0x563b62be, 0xa167e824, 0x5636bdef, 0xa163aca2, - 0x563218eb, 0xa15f715a, - 0x562d73b2, 0xa15b364d, 0x5628ce43, 0xa156fb79, 0x5624289f, 0xa152c0e1, - 0x561f82c7, 0xa14e8682, - 0x561adcb9, 0xa14a4c5e, 0x56163676, 0xa1461275, 0x56118ffe, 0xa141d8c5, - 0x560ce950, 0xa13d9f51, - 0x5608426e, 0xa1396617, 0x56039b57, 0xa1352d17, 0x55fef40a, 0xa130f451, - 0x55fa4c89, 0xa12cbbc7, - 0x55f5a4d2, 0xa1288376, 0x55f0fce7, 0xa1244b61, 0x55ec54c6, 0xa1201385, - 0x55e7ac71, 0xa11bdbe4, - 0x55e303e6, 0xa117a47e, 0x55de5b27, 0xa1136d52, 0x55d9b232, 0xa10f3661, - 0x55d50909, 0xa10affab, - 0x55d05faa, 0xa106c92f, 0x55cbb617, 0xa10292ed, 0x55c70c4f, 0xa0fe5ce6, - 0x55c26251, 0xa0fa271a, - 0x55bdb81f, 0xa0f5f189, 0x55b90db8, 0xa0f1bc32, 0x55b4631d, 0xa0ed8715, - 0x55afb84c, 0xa0e95234, - 0x55ab0d46, 0xa0e51d8c, 0x55a6620c, 0xa0e0e920, 0x55a1b69d, 0xa0dcb4ee, - 0x559d0af9, 0xa0d880f7, - 0x55985f20, 0xa0d44d3b, 0x5593b312, 0xa0d019b9, 0x558f06d0, 0xa0cbe672, - 0x558a5a58, 0xa0c7b366, - 0x5585adad, 0xa0c38095, 0x558100cc, 0xa0bf4dfe, 0x557c53b6, 0xa0bb1ba2, - 0x5577a66c, 0xa0b6e981, - 0x5572f8ed, 0xa0b2b79b, 0x556e4b39, 0xa0ae85ef, 0x55699d51, 0xa0aa547e, - 0x5564ef34, 0xa0a62348, - 0x556040e2, 0xa0a1f24d, 0x555b925c, 0xa09dc18d, 0x5556e3a1, 0xa0999107, - 0x555234b1, 0xa09560bc, - 0x554d858d, 0xa09130ad, 0x5548d634, 0xa08d00d8, 0x554426a7, 0xa088d13e, - 0x553f76e4, 0xa084a1de, - 0x553ac6ee, 0xa08072ba, 0x553616c2, 0xa07c43d1, 0x55316663, 0xa0781522, - 0x552cb5ce, 0xa073e6af, - 0x55280505, 0xa06fb876, 0x55235408, 0xa06b8a78, 0x551ea2d6, 0xa0675cb6, - 0x5519f16f, 0xa0632f2e, - 0x55153fd4, 0xa05f01e1, 0x55108e05, 0xa05ad4cf, 0x550bdc01, 0xa056a7f9, - 0x550729c9, 0xa0527b5d, - 0x5502775c, 0xa04e4efc, 0x54fdc4ba, 0xa04a22d7, 0x54f911e5, 0xa045f6ec, - 0x54f45edb, 0xa041cb3c, - 0x54efab9c, 0xa03d9fc8, 0x54eaf829, 0xa039748e, 0x54e64482, 0xa0354990, - 0x54e190a6, 0xa0311ecd, - 0x54dcdc96, 0xa02cf444, 0x54d82852, 0xa028c9f7, 0x54d373d9, 0xa0249fe5, - 0x54cebf2c, 0xa020760e, - 0x54ca0a4b, 0xa01c4c73, 0x54c55535, 0xa0182312, 0x54c09feb, 0xa013f9ed, - 0x54bbea6d, 0xa00fd102, - 0x54b734ba, 0xa00ba853, 0x54b27ed3, 0xa0077fdf, 0x54adc8b8, 0xa00357a7, - 0x54a91269, 0x9fff2fa9, - 0x54a45be6, 0x9ffb07e7, 0x549fa52e, 0x9ff6e060, 0x549aee42, 0x9ff2b914, - 0x54963722, 0x9fee9204, - 0x54917fce, 0x9fea6b2f, 0x548cc845, 0x9fe64495, 0x54881089, 0x9fe21e36, - 0x54835898, 0x9fddf812, - 0x547ea073, 0x9fd9d22a, 0x5479e81a, 0x9fd5ac7d, 0x54752f8d, 0x9fd1870c, - 0x547076cc, 0x9fcd61d6, - 0x546bbdd7, 0x9fc93cdb, 0x546704ae, 0x9fc5181b, 0x54624b50, 0x9fc0f397, - 0x545d91bf, 0x9fbccf4f, - 0x5458d7f9, 0x9fb8ab41, 0x54541e00, 0x9fb4876f, 0x544f63d2, 0x9fb063d9, - 0x544aa971, 0x9fac407e, - 0x5445eedb, 0x9fa81d5e, 0x54413412, 0x9fa3fa79, 0x543c7914, 0x9f9fd7d1, - 0x5437bde3, 0x9f9bb563, - 0x5433027d, 0x9f979331, 0x542e46e4, 0x9f93713b, 0x54298b17, 0x9f8f4f80, - 0x5424cf16, 0x9f8b2e00, - 0x542012e1, 0x9f870cbc, 0x541b5678, 0x9f82ebb4, 0x541699db, 0x9f7ecae7, - 0x5411dd0a, 0x9f7aaa55, - 0x540d2005, 0x9f7689ff, 0x540862cd, 0x9f7269e5, 0x5403a561, 0x9f6e4a06, - 0x53fee7c1, 0x9f6a2a63, - 0x53fa29ed, 0x9f660afb, 0x53f56be5, 0x9f61ebcf, 0x53f0adaa, 0x9f5dccde, - 0x53ebef3a, 0x9f59ae29, - 0x53e73097, 0x9f558fb0, 0x53e271c0, 0x9f517173, 0x53ddb2b6, 0x9f4d5371, - 0x53d8f378, 0x9f4935aa, - 0x53d43406, 0x9f45181f, 0x53cf7460, 0x9f40fad0, 0x53cab486, 0x9f3cddbd, - 0x53c5f479, 0x9f38c0e5, - 0x53c13439, 0x9f34a449, 0x53bc73c4, 0x9f3087e9, 0x53b7b31c, 0x9f2c6bc5, - 0x53b2f240, 0x9f284fdc, - 0x53ae3131, 0x9f24342f, 0x53a96fee, 0x9f2018bd, 0x53a4ae77, 0x9f1bfd88, - 0x539feccd, 0x9f17e28e, - 0x539b2af0, 0x9f13c7d0, 0x539668de, 0x9f0fad4e, 0x5391a699, 0x9f0b9307, - 0x538ce421, 0x9f0778fd, - 0x53882175, 0x9f035f2e, 0x53835e95, 0x9eff459b, 0x537e9b82, 0x9efb2c44, - 0x5379d83c, 0x9ef71328, - 0x537514c2, 0x9ef2fa49, 0x53705114, 0x9eeee1a5, 0x536b8d33, 0x9eeac93e, - 0x5366c91f, 0x9ee6b112, - 0x536204d7, 0x9ee29922, 0x535d405c, 0x9ede816e, 0x53587bad, 0x9eda69f6, - 0x5353b6cb, 0x9ed652ba, - 0x534ef1b5, 0x9ed23bb9, 0x534a2c6c, 0x9ece24f5, 0x534566f0, 0x9eca0e6d, - 0x5340a140, 0x9ec5f820, - 0x533bdb5d, 0x9ec1e210, 0x53371547, 0x9ebdcc3b, 0x53324efd, 0x9eb9b6a3, - 0x532d8880, 0x9eb5a146, - 0x5328c1d0, 0x9eb18c26, 0x5323faec, 0x9ead7742, 0x531f33d5, 0x9ea96299, - 0x531a6c8b, 0x9ea54e2d, - 0x5315a50e, 0x9ea139fd, 0x5310dd5d, 0x9e9d2608, 0x530c1579, 0x9e991250, - 0x53074d62, 0x9e94fed4, - 0x53028518, 0x9e90eb94, 0x52fdbc9a, 0x9e8cd890, 0x52f8f3e9, 0x9e88c5c9, - 0x52f42b05, 0x9e84b33d, - 0x52ef61ee, 0x9e80a0ee, 0x52ea98a4, 0x9e7c8eda, 0x52e5cf27, 0x9e787d03, - 0x52e10576, 0x9e746b68, - 0x52dc3b92, 0x9e705a09, 0x52d7717b, 0x9e6c48e7, 0x52d2a732, 0x9e683800, - 0x52cddcb5, 0x9e642756, - 0x52c91204, 0x9e6016e8, 0x52c44721, 0x9e5c06b6, 0x52bf7c0b, 0x9e57f6c0, - 0x52bab0c2, 0x9e53e707, - 0x52b5e546, 0x9e4fd78a, 0x52b11996, 0x9e4bc849, 0x52ac4db4, 0x9e47b944, - 0x52a7819f, 0x9e43aa7c, - 0x52a2b556, 0x9e3f9bf0, 0x529de8db, 0x9e3b8da0, 0x52991c2d, 0x9e377f8c, - 0x52944f4c, 0x9e3371b5, - 0x528f8238, 0x9e2f641b, 0x528ab4f1, 0x9e2b56bc, 0x5285e777, 0x9e27499a, - 0x528119ca, 0x9e233cb4, - 0x527c4bea, 0x9e1f300b, 0x52777dd7, 0x9e1b239e, 0x5272af92, 0x9e17176d, - 0x526de11a, 0x9e130b79, - 0x5269126e, 0x9e0effc1, 0x52644390, 0x9e0af446, 0x525f7480, 0x9e06e907, - 0x525aa53c, 0x9e02de04, - 0x5255d5c5, 0x9dfed33e, 0x5251061c, 0x9dfac8b4, 0x524c3640, 0x9df6be67, - 0x52476631, 0x9df2b456, - 0x524295f0, 0x9deeaa82, 0x523dc57b, 0x9deaa0ea, 0x5238f4d4, 0x9de6978f, - 0x523423fb, 0x9de28e70, - 0x522f52ee, 0x9dde858e, 0x522a81af, 0x9dda7ce9, 0x5225b03d, 0x9dd6747f, - 0x5220de99, 0x9dd26c53, - 0x521c0cc2, 0x9dce6463, 0x52173ab8, 0x9dca5caf, 0x5212687b, 0x9dc65539, - 0x520d960c, 0x9dc24dfe, - 0x5208c36a, 0x9dbe4701, 0x5203f096, 0x9dba4040, 0x51ff1d8f, 0x9db639bb, - 0x51fa4a56, 0x9db23373, - 0x51f576ea, 0x9dae2d68, 0x51f0a34b, 0x9daa279a, 0x51ebcf7a, 0x9da62208, - 0x51e6fb76, 0x9da21cb2, - 0x51e22740, 0x9d9e179a, 0x51dd52d7, 0x9d9a12be, 0x51d87e3c, 0x9d960e1f, - 0x51d3a96f, 0x9d9209bd, - 0x51ced46e, 0x9d8e0597, 0x51c9ff3c, 0x9d8a01ae, 0x51c529d7, 0x9d85fe02, - 0x51c0543f, 0x9d81fa92, - 0x51bb7e75, 0x9d7df75f, 0x51b6a879, 0x9d79f469, 0x51b1d24a, 0x9d75f1b0, - 0x51acfbe9, 0x9d71ef34, - 0x51a82555, 0x9d6decf4, 0x51a34e8f, 0x9d69eaf1, 0x519e7797, 0x9d65e92b, - 0x5199a06d, 0x9d61e7a2, - 0x5194c910, 0x9d5de656, 0x518ff180, 0x9d59e546, 0x518b19bf, 0x9d55e473, - 0x518641cb, 0x9d51e3dd, - 0x518169a5, 0x9d4de385, 0x517c914c, 0x9d49e368, 0x5177b8c2, 0x9d45e389, - 0x5172e005, 0x9d41e3e7, - 0x516e0715, 0x9d3de482, 0x51692df4, 0x9d39e559, 0x516454a0, 0x9d35e66e, - 0x515f7b1a, 0x9d31e7bf, - 0x515aa162, 0x9d2de94d, 0x5155c778, 0x9d29eb19, 0x5150ed5c, 0x9d25ed21, - 0x514c130d, 0x9d21ef66, - 0x5147388c, 0x9d1df1e9, 0x51425dd9, 0x9d19f4a8, 0x513d82f4, 0x9d15f7a4, - 0x5138a7dd, 0x9d11fadd, - 0x5133cc94, 0x9d0dfe54, 0x512ef119, 0x9d0a0207, 0x512a156b, 0x9d0605f7, - 0x5125398c, 0x9d020a25, - 0x51205d7b, 0x9cfe0e8f, 0x511b8137, 0x9cfa1337, 0x5116a4c1, 0x9cf6181c, - 0x5111c81a, 0x9cf21d3d, - 0x510ceb40, 0x9cee229c, 0x51080e35, 0x9cea2838, 0x510330f7, 0x9ce62e11, - 0x50fe5388, 0x9ce23427, - 0x50f975e6, 0x9cde3a7b, 0x50f49813, 0x9cda410b, 0x50efba0d, 0x9cd647d9, - 0x50eadbd6, 0x9cd24ee4, - 0x50e5fd6d, 0x9cce562c, 0x50e11ed2, 0x9cca5db1, 0x50dc4005, 0x9cc66573, - 0x50d76106, 0x9cc26d73, - 0x50d281d5, 0x9cbe75b0, 0x50cda272, 0x9cba7e2a, 0x50c8c2de, 0x9cb686e1, - 0x50c3e317, 0x9cb28fd5, - 0x50bf031f, 0x9cae9907, 0x50ba22f5, 0x9caaa276, 0x50b5429a, 0x9ca6ac23, - 0x50b0620c, 0x9ca2b60c, - 0x50ab814d, 0x9c9ec033, 0x50a6a05c, 0x9c9aca97, 0x50a1bf39, 0x9c96d539, - 0x509cdde4, 0x9c92e017, - 0x5097fc5e, 0x9c8eeb34, 0x50931aa6, 0x9c8af68d, 0x508e38bd, 0x9c870224, - 0x508956a1, 0x9c830df8, - 0x50847454, 0x9c7f1a0a, 0x507f91d5, 0x9c7b2659, 0x507aaf25, 0x9c7732e5, - 0x5075cc43, 0x9c733faf, - 0x5070e92f, 0x9c6f4cb6, 0x506c05ea, 0x9c6b59fa, 0x50672273, 0x9c67677c, - 0x50623ecb, 0x9c63753c, - 0x505d5af1, 0x9c5f8339, 0x505876e5, 0x9c5b9173, 0x505392a8, 0x9c579feb, - 0x504eae39, 0x9c53aea0, - 0x5049c999, 0x9c4fbd93, 0x5044e4c7, 0x9c4bccc3, 0x503fffc4, 0x9c47dc31, - 0x503b1a8f, 0x9c43ebdc, - 0x50363529, 0x9c3ffbc5, 0x50314f91, 0x9c3c0beb, 0x502c69c8, 0x9c381c4f, - 0x502783cd, 0x9c342cf0, - 0x50229da1, 0x9c303dcf, 0x501db743, 0x9c2c4eec, 0x5018d0b4, 0x9c286046, - 0x5013e9f4, 0x9c2471de, - 0x500f0302, 0x9c2083b3, 0x500a1bdf, 0x9c1c95c6, 0x5005348a, 0x9c18a816, - 0x50004d04, 0x9c14baa4, - 0x4ffb654d, 0x9c10cd70, 0x4ff67d64, 0x9c0ce07a, 0x4ff1954b, 0x9c08f3c1, - 0x4fecacff, 0x9c050745, - 0x4fe7c483, 0x9c011b08, 0x4fe2dbd5, 0x9bfd2f08, 0x4fddf2f6, 0x9bf94346, - 0x4fd909e5, 0x9bf557c1, - 0x4fd420a4, 0x9bf16c7a, 0x4fcf3731, 0x9bed8171, 0x4fca4d8d, 0x9be996a6, - 0x4fc563b7, 0x9be5ac18, - 0x4fc079b1, 0x9be1c1c8, 0x4fbb8f79, 0x9bddd7b6, 0x4fb6a510, 0x9bd9ede2, - 0x4fb1ba76, 0x9bd6044b, - 0x4faccfab, 0x9bd21af3, 0x4fa7e4af, 0x9bce31d8, 0x4fa2f981, 0x9bca48fa, - 0x4f9e0e22, 0x9bc6605b, - 0x4f992293, 0x9bc277fa, 0x4f9436d2, 0x9bbe8fd6, 0x4f8f4ae0, 0x9bbaa7f0, - 0x4f8a5ebd, 0x9bb6c048, - 0x4f857269, 0x9bb2d8de, 0x4f8085e4, 0x9baef1b2, 0x4f7b992d, 0x9bab0ac3, - 0x4f76ac46, 0x9ba72413, - 0x4f71bf2e, 0x9ba33da0, 0x4f6cd1e5, 0x9b9f576b, 0x4f67e46a, 0x9b9b7174, - 0x4f62f6bf, 0x9b978bbc, - 0x4f5e08e3, 0x9b93a641, 0x4f591ad6, 0x9b8fc104, 0x4f542c98, 0x9b8bdc05, - 0x4f4f3e29, 0x9b87f744, - 0x4f4a4f89, 0x9b8412c1, 0x4f4560b8, 0x9b802e7b, 0x4f4071b6, 0x9b7c4a74, - 0x4f3b8284, 0x9b7866ab, - 0x4f369320, 0x9b748320, 0x4f31a38c, 0x9b709fd3, 0x4f2cb3c7, 0x9b6cbcc4, - 0x4f27c3d1, 0x9b68d9f3, - 0x4f22d3aa, 0x9b64f760, 0x4f1de352, 0x9b61150b, 0x4f18f2c9, 0x9b5d32f4, - 0x4f140210, 0x9b59511c, - 0x4f0f1126, 0x9b556f81, 0x4f0a200b, 0x9b518e24, 0x4f052ec0, 0x9b4dad06, - 0x4f003d43, 0x9b49cc26, - 0x4efb4b96, 0x9b45eb83, 0x4ef659b8, 0x9b420b1f, 0x4ef167aa, 0x9b3e2af9, - 0x4eec756b, 0x9b3a4b11, - 0x4ee782fb, 0x9b366b68, 0x4ee2905a, 0x9b328bfc, 0x4edd9d89, 0x9b2eaccf, - 0x4ed8aa87, 0x9b2acde0, - 0x4ed3b755, 0x9b26ef2f, 0x4ecec3f2, 0x9b2310bc, 0x4ec9d05e, 0x9b1f3288, - 0x4ec4dc99, 0x9b1b5492, - 0x4ebfe8a5, 0x9b1776da, 0x4ebaf47f, 0x9b139960, 0x4eb60029, 0x9b0fbc24, - 0x4eb10ba2, 0x9b0bdf27, - 0x4eac16eb, 0x9b080268, 0x4ea72203, 0x9b0425e8, 0x4ea22ceb, 0x9b0049a5, - 0x4e9d37a3, 0x9afc6da1, - 0x4e984229, 0x9af891db, 0x4e934c80, 0x9af4b654, 0x4e8e56a5, 0x9af0db0b, - 0x4e89609b, 0x9aed0000, - 0x4e846a60, 0x9ae92533, 0x4e7f73f4, 0x9ae54aa5, 0x4e7a7d58, 0x9ae17056, - 0x4e75868c, 0x9add9644, - 0x4e708f8f, 0x9ad9bc71, 0x4e6b9862, 0x9ad5e2dd, 0x4e66a105, 0x9ad20987, - 0x4e61a977, 0x9ace306f, - 0x4e5cb1b9, 0x9aca5795, 0x4e57b9ca, 0x9ac67efb, 0x4e52c1ab, 0x9ac2a69e, - 0x4e4dc95c, 0x9abece80, - 0x4e48d0dd, 0x9abaf6a1, 0x4e43d82d, 0x9ab71eff, 0x4e3edf4d, 0x9ab3479d, - 0x4e39e63d, 0x9aaf7079, - 0x4e34ecfc, 0x9aab9993, 0x4e2ff38b, 0x9aa7c2ec, 0x4e2af9ea, 0x9aa3ec83, - 0x4e260019, 0x9aa01659, - 0x4e210617, 0x9a9c406e, 0x4e1c0be6, 0x9a986ac1, 0x4e171184, 0x9a949552, - 0x4e1216f2, 0x9a90c022, - 0x4e0d1c30, 0x9a8ceb31, 0x4e08213e, 0x9a89167e, 0x4e03261b, 0x9a85420a, - 0x4dfe2ac9, 0x9a816dd5, - 0x4df92f46, 0x9a7d99de, 0x4df43393, 0x9a79c625, 0x4def37b0, 0x9a75f2ac, - 0x4dea3b9d, 0x9a721f71, - 0x4de53f5a, 0x9a6e4c74, 0x4de042e7, 0x9a6a79b6, 0x4ddb4644, 0x9a66a737, - 0x4dd64971, 0x9a62d4f7, - 0x4dd14c6e, 0x9a5f02f5, 0x4dcc4f3b, 0x9a5b3132, 0x4dc751d8, 0x9a575fae, - 0x4dc25445, 0x9a538e68, - 0x4dbd5682, 0x9a4fbd61, 0x4db8588f, 0x9a4bec99, 0x4db35a6c, 0x9a481c0f, - 0x4dae5c19, 0x9a444bc5, - 0x4da95d96, 0x9a407bb9, 0x4da45ee3, 0x9a3cabeb, 0x4d9f6001, 0x9a38dc5d, - 0x4d9a60ee, 0x9a350d0d, - 0x4d9561ac, 0x9a313dfc, 0x4d90623a, 0x9a2d6f2a, 0x4d8b6298, 0x9a29a097, - 0x4d8662c6, 0x9a25d243, - 0x4d8162c4, 0x9a22042d, 0x4d7c6293, 0x9a1e3656, 0x4d776231, 0x9a1a68be, - 0x4d7261a0, 0x9a169b65, - 0x4d6d60df, 0x9a12ce4b, 0x4d685fef, 0x9a0f016f, 0x4d635ece, 0x9a0b34d3, - 0x4d5e5d7e, 0x9a076875, - 0x4d595bfe, 0x9a039c57, 0x4d545a4f, 0x99ffd077, 0x4d4f5870, 0x99fc04d6, - 0x4d4a5661, 0x99f83974, - 0x4d455422, 0x99f46e51, 0x4d4051b4, 0x99f0a36d, 0x4d3b4f16, 0x99ecd8c8, - 0x4d364c48, 0x99e90e62, - 0x4d31494b, 0x99e5443b, 0x4d2c461e, 0x99e17a53, 0x4d2742c2, 0x99ddb0aa, - 0x4d223f36, 0x99d9e73f, - 0x4d1d3b7a, 0x99d61e14, 0x4d18378f, 0x99d25528, 0x4d133374, 0x99ce8c7b, - 0x4d0e2f2a, 0x99cac40d, - 0x4d092ab0, 0x99c6fbde, 0x4d042607, 0x99c333ee, 0x4cff212e, 0x99bf6c3d, - 0x4cfa1c26, 0x99bba4cb, - 0x4cf516ee, 0x99b7dd99, 0x4cf01187, 0x99b416a5, 0x4ceb0bf0, 0x99b04ff0, - 0x4ce6062a, 0x99ac897b, - 0x4ce10034, 0x99a8c345, 0x4cdbfa0f, 0x99a4fd4d, 0x4cd6f3bb, 0x99a13795, - 0x4cd1ed37, 0x999d721c, - 0x4ccce684, 0x9999ace3, 0x4cc7dfa1, 0x9995e7e8, 0x4cc2d88f, 0x9992232d, - 0x4cbdd14e, 0x998e5eb1, - 0x4cb8c9dd, 0x998a9a74, 0x4cb3c23d, 0x9986d676, 0x4caeba6e, 0x998312b7, - 0x4ca9b26f, 0x997f4f38, - 0x4ca4aa41, 0x997b8bf8, 0x4c9fa1e4, 0x9977c8f7, 0x4c9a9958, 0x99740635, - 0x4c95909c, 0x997043b2, - 0x4c9087b1, 0x996c816f, 0x4c8b7e97, 0x9968bf6b, 0x4c86754e, 0x9964fda7, - 0x4c816bd5, 0x99613c22, - 0x4c7c622d, 0x995d7adc, 0x4c775856, 0x9959b9d5, 0x4c724e50, 0x9955f90d, - 0x4c6d441b, 0x99523885, - 0x4c6839b7, 0x994e783d, 0x4c632f23, 0x994ab833, 0x4c5e2460, 0x9946f869, - 0x4c59196f, 0x994338df, - 0x4c540e4e, 0x993f7993, 0x4c4f02fe, 0x993bba87, 0x4c49f77f, 0x9937fbbb, - 0x4c44ebd1, 0x99343d2e, - 0x4c3fdff4, 0x99307ee0, 0x4c3ad3e7, 0x992cc0d2, 0x4c35c7ac, 0x99290303, - 0x4c30bb42, 0x99254574, - 0x4c2baea9, 0x99218824, 0x4c26a1e1, 0x991dcb13, 0x4c2194e9, 0x991a0e42, - 0x4c1c87c3, 0x991651b1, - 0x4c177a6e, 0x9912955f, 0x4c126cea, 0x990ed94c, 0x4c0d5f37, 0x990b1d79, - 0x4c085156, 0x990761e5, - 0x4c034345, 0x9903a691, 0x4bfe3505, 0x98ffeb7d, 0x4bf92697, 0x98fc30a8, - 0x4bf417f9, 0x98f87612, - 0x4bef092d, 0x98f4bbbc, 0x4be9fa32, 0x98f101a6, 0x4be4eb08, 0x98ed47cf, - 0x4bdfdbaf, 0x98e98e38, - 0x4bdacc28, 0x98e5d4e0, 0x4bd5bc72, 0x98e21bc8, 0x4bd0ac8d, 0x98de62f0, - 0x4bcb9c79, 0x98daaa57, - 0x4bc68c36, 0x98d6f1fe, 0x4bc17bc5, 0x98d339e4, 0x4bbc6b25, 0x98cf820b, - 0x4bb75a56, 0x98cbca70, - 0x4bb24958, 0x98c81316, 0x4bad382c, 0x98c45bfb, 0x4ba826d1, 0x98c0a520, - 0x4ba31548, 0x98bcee84, - 0x4b9e0390, 0x98b93828, 0x4b98f1a9, 0x98b5820c, 0x4b93df93, 0x98b1cc30, - 0x4b8ecd4f, 0x98ae1693, - 0x4b89badd, 0x98aa6136, 0x4b84a83b, 0x98a6ac19, 0x4b7f956b, 0x98a2f73c, - 0x4b7a826d, 0x989f429e, - 0x4b756f40, 0x989b8e40, 0x4b705be4, 0x9897da22, 0x4b6b485a, 0x98942643, - 0x4b6634a2, 0x989072a5, - 0x4b6120bb, 0x988cbf46, 0x4b5c0ca5, 0x98890c27, 0x4b56f861, 0x98855948, - 0x4b51e3ee, 0x9881a6a9, - 0x4b4ccf4d, 0x987df449, 0x4b47ba7e, 0x987a422a, 0x4b42a580, 0x9876904a, - 0x4b3d9053, 0x9872deaa, - 0x4b387af9, 0x986f2d4a, 0x4b336570, 0x986b7c2a, 0x4b2e4fb8, 0x9867cb4a, - 0x4b2939d2, 0x98641aa9, - 0x4b2423be, 0x98606a49, 0x4b1f0d7b, 0x985cba28, 0x4b19f70a, 0x98590a48, - 0x4b14e06b, 0x98555aa7, - 0x4b0fc99d, 0x9851ab46, 0x4b0ab2a1, 0x984dfc26, 0x4b059b77, 0x984a4d45, - 0x4b00841f, 0x98469ea4, - 0x4afb6c98, 0x9842f043, 0x4af654e3, 0x983f4223, 0x4af13d00, 0x983b9442, - 0x4aec24ee, 0x9837e6a1, - 0x4ae70caf, 0x98343940, 0x4ae1f441, 0x98308c1f, 0x4adcdba5, 0x982cdf3f, - 0x4ad7c2da, 0x9829329e, - 0x4ad2a9e2, 0x9825863d, 0x4acd90bb, 0x9821da1d, 0x4ac87767, 0x981e2e3c, - 0x4ac35de4, 0x981a829c, - 0x4abe4433, 0x9816d73b, 0x4ab92a54, 0x98132c1b, 0x4ab41046, 0x980f813b, - 0x4aaef60b, 0x980bd69b, - 0x4aa9dba2, 0x98082c3b, 0x4aa4c10b, 0x9804821b, 0x4a9fa645, 0x9800d83c, - 0x4a9a8b52, 0x97fd2e9c, - 0x4a957030, 0x97f9853d, 0x4a9054e1, 0x97f5dc1e, 0x4a8b3963, 0x97f2333f, - 0x4a861db8, 0x97ee8aa0, - 0x4a8101de, 0x97eae242, 0x4a7be5d7, 0x97e73a23, 0x4a76c9a2, 0x97e39245, - 0x4a71ad3e, 0x97dfeaa7, - 0x4a6c90ad, 0x97dc4349, 0x4a6773ee, 0x97d89c2c, 0x4a625701, 0x97d4f54f, - 0x4a5d39e6, 0x97d14eb2, - 0x4a581c9e, 0x97cda855, 0x4a52ff27, 0x97ca0239, 0x4a4de182, 0x97c65c5c, - 0x4a48c3b0, 0x97c2b6c1, - 0x4a43a5b0, 0x97bf1165, 0x4a3e8782, 0x97bb6c4a, 0x4a396926, 0x97b7c76f, - 0x4a344a9d, 0x97b422d4, - 0x4a2f2be6, 0x97b07e7a, 0x4a2a0d01, 0x97acda60, 0x4a24edee, 0x97a93687, - 0x4a1fcead, 0x97a592ed, - 0x4a1aaf3f, 0x97a1ef94, 0x4a158fa3, 0x979e4c7c, 0x4a106fda, 0x979aa9a4, - 0x4a0b4fe2, 0x9797070c, - 0x4a062fbd, 0x979364b5, 0x4a010f6b, 0x978fc29e, 0x49fbeeea, 0x978c20c8, - 0x49f6ce3c, 0x97887f32, - 0x49f1ad61, 0x9784dddc, 0x49ec8c57, 0x97813cc7, 0x49e76b21, 0x977d9bf2, - 0x49e249bc, 0x9779fb5e, - 0x49dd282a, 0x97765b0a, 0x49d8066b, 0x9772baf7, 0x49d2e47e, 0x976f1b24, - 0x49cdc263, 0x976b7b92, - 0x49c8a01b, 0x9767dc41, 0x49c37da5, 0x97643d2f, 0x49be5b02, 0x97609e5f, - 0x49b93832, 0x975cffcf, - 0x49b41533, 0x9759617f, 0x49aef208, 0x9755c370, 0x49a9ceaf, 0x975225a1, - 0x49a4ab28, 0x974e8813, - 0x499f8774, 0x974aeac6, 0x499a6393, 0x97474db9, 0x49953f84, 0x9743b0ed, - 0x49901b48, 0x97401462, - 0x498af6df, 0x973c7817, 0x4985d248, 0x9738dc0d, 0x4980ad84, 0x97354043, - 0x497b8892, 0x9731a4ba, - 0x49766373, 0x972e0971, 0x49713e27, 0x972a6e6a, 0x496c18ae, 0x9726d3a3, - 0x4966f307, 0x9723391c, - 0x4961cd33, 0x971f9ed7, 0x495ca732, 0x971c04d2, 0x49578103, 0x97186b0d, - 0x49525aa7, 0x9714d18a, - 0x494d341e, 0x97113847, 0x49480d68, 0x970d9f45, 0x4942e684, 0x970a0683, - 0x493dbf74, 0x97066e03, - 0x49389836, 0x9702d5c3, 0x493370cb, 0x96ff3dc4, 0x492e4933, 0x96fba605, - 0x4929216e, 0x96f80e88, - 0x4923f97b, 0x96f4774b, 0x491ed15c, 0x96f0e04f, 0x4919a90f, 0x96ed4994, - 0x49148095, 0x96e9b319, - 0x490f57ee, 0x96e61ce0, 0x490a2f1b, 0x96e286e7, 0x4905061a, 0x96def12f, - 0x48ffdcec, 0x96db5bb8, - 0x48fab391, 0x96d7c682, 0x48f58a09, 0x96d4318d, 0x48f06054, 0x96d09cd8, - 0x48eb3672, 0x96cd0865, - 0x48e60c62, 0x96c97432, 0x48e0e227, 0x96c5e040, 0x48dbb7be, 0x96c24c8f, - 0x48d68d28, 0x96beb91f, - 0x48d16265, 0x96bb25f0, 0x48cc3775, 0x96b79302, 0x48c70c59, 0x96b40055, - 0x48c1e10f, 0x96b06de9, - 0x48bcb599, 0x96acdbbe, 0x48b789f5, 0x96a949d3, 0x48b25e25, 0x96a5b82a, - 0x48ad3228, 0x96a226c2, - 0x48a805ff, 0x969e959b, 0x48a2d9a8, 0x969b04b4, 0x489dad25, 0x9697740f, - 0x48988074, 0x9693e3ab, - 0x48935397, 0x96905388, 0x488e268e, 0x968cc3a5, 0x4888f957, 0x96893404, - 0x4883cbf4, 0x9685a4a4, - 0x487e9e64, 0x96821585, 0x487970a7, 0x967e86a7, 0x487442be, 0x967af80a, - 0x486f14a8, 0x967769af, - 0x4869e665, 0x9673db94, 0x4864b7f5, 0x96704dba, 0x485f8959, 0x966cc022, - 0x485a5a90, 0x966932cb, - 0x48552b9b, 0x9665a5b4, 0x484ffc79, 0x966218df, 0x484acd2a, 0x965e8c4b, - 0x48459daf, 0x965afff9, - 0x48406e08, 0x965773e7, 0x483b3e33, 0x9653e817, 0x48360e32, 0x96505c88, - 0x4830de05, 0x964cd139, - 0x482badab, 0x9649462d, 0x48267d24, 0x9645bb61, 0x48214c71, 0x964230d7, - 0x481c1b92, 0x963ea68d, - 0x4816ea86, 0x963b1c86, 0x4811b94d, 0x963792bf, 0x480c87e8, 0x96340939, - 0x48075657, 0x96307ff5, - 0x48022499, 0x962cf6f2, 0x47fcf2af, 0x96296e31, 0x47f7c099, 0x9625e5b0, - 0x47f28e56, 0x96225d71, - 0x47ed5be6, 0x961ed574, 0x47e8294a, 0x961b4db7, 0x47e2f682, 0x9617c63c, - 0x47ddc38e, 0x96143f02, - 0x47d8906d, 0x9610b80a, 0x47d35d20, 0x960d3153, 0x47ce29a7, 0x9609aadd, - 0x47c8f601, 0x960624a9, - 0x47c3c22f, 0x96029eb6, 0x47be8e31, 0x95ff1904, 0x47b95a06, 0x95fb9394, - 0x47b425af, 0x95f80e65, - 0x47aef12c, 0x95f48977, 0x47a9bc7d, 0x95f104cb, 0x47a487a2, 0x95ed8061, - 0x479f529a, 0x95e9fc38, - 0x479a1d67, 0x95e67850, 0x4794e807, 0x95e2f4a9, 0x478fb27b, 0x95df7145, - 0x478a7cc2, 0x95dbee21, - 0x478546de, 0x95d86b3f, 0x478010cd, 0x95d4e89f, 0x477ada91, 0x95d16640, - 0x4775a428, 0x95cde423, - 0x47706d93, 0x95ca6247, 0x476b36d3, 0x95c6e0ac, 0x4765ffe6, 0x95c35f53, - 0x4760c8cd, 0x95bfde3c, - 0x475b9188, 0x95bc5d66, 0x47565a17, 0x95b8dcd2, 0x4751227a, 0x95b55c7f, - 0x474beab1, 0x95b1dc6e, - 0x4746b2bc, 0x95ae5c9f, 0x47417a9b, 0x95aadd11, 0x473c424e, 0x95a75dc4, - 0x473709d5, 0x95a3deb9, - 0x4731d131, 0x95a05ff0, 0x472c9860, 0x959ce169, 0x47275f63, 0x95996323, - 0x4722263b, 0x9595e51e, - 0x471cece7, 0x9592675c, 0x4717b367, 0x958ee9db, 0x471279ba, 0x958b6c9b, - 0x470d3fe3, 0x9587ef9e, - 0x470805df, 0x958472e2, 0x4702cbaf, 0x9580f667, 0x46fd9154, 0x957d7a2f, - 0x46f856cd, 0x9579fe38, - 0x46f31c1a, 0x95768283, 0x46ede13b, 0x9573070f, 0x46e8a631, 0x956f8bdd, - 0x46e36afb, 0x956c10ed, - 0x46de2f99, 0x9568963f, 0x46d8f40b, 0x95651bd2, 0x46d3b852, 0x9561a1a8, - 0x46ce7c6d, 0x955e27bf, - 0x46c9405c, 0x955aae17, 0x46c40420, 0x955734b2, 0x46bec7b8, 0x9553bb8e, - 0x46b98b24, 0x955042ac, - 0x46b44e65, 0x954cca0c, 0x46af117a, 0x954951ae, 0x46a9d464, 0x9545d992, - 0x46a49722, 0x954261b7, - 0x469f59b4, 0x953eea1e, 0x469a1c1b, 0x953b72c7, 0x4694de56, 0x9537fbb2, - 0x468fa066, 0x953484df, - 0x468a624a, 0x95310e4e, 0x46852403, 0x952d97fe, 0x467fe590, 0x952a21f1, - 0x467aa6f2, 0x9526ac25, - 0x46756828, 0x9523369c, 0x46702933, 0x951fc154, 0x466aea12, 0x951c4c4e, - 0x4665aac6, 0x9518d78a, - 0x46606b4e, 0x95156308, 0x465b2bab, 0x9511eec8, 0x4655ebdd, 0x950e7aca, - 0x4650abe3, 0x950b070e, - 0x464b6bbe, 0x95079394, 0x46462b6d, 0x9504205c, 0x4640eaf2, 0x9500ad66, - 0x463baa4a, 0x94fd3ab1, - 0x46366978, 0x94f9c83f, 0x4631287a, 0x94f6560f, 0x462be751, 0x94f2e421, - 0x4626a5fd, 0x94ef7275, - 0x4621647d, 0x94ec010b, 0x461c22d2, 0x94e88fe3, 0x4616e0fc, 0x94e51efd, - 0x46119efa, 0x94e1ae59, - 0x460c5cce, 0x94de3df8, 0x46071a76, 0x94dacdd8, 0x4601d7f3, 0x94d75dfa, - 0x45fc9545, 0x94d3ee5f, - 0x45f7526b, 0x94d07f05, 0x45f20f67, 0x94cd0fee, 0x45eccc37, 0x94c9a119, - 0x45e788dc, 0x94c63286, - 0x45e24556, 0x94c2c435, 0x45dd01a5, 0x94bf5627, 0x45d7bdc9, 0x94bbe85a, - 0x45d279c2, 0x94b87ad0, - 0x45cd358f, 0x94b50d87, 0x45c7f132, 0x94b1a081, 0x45c2acaa, 0x94ae33be, - 0x45bd67f6, 0x94aac73c, - 0x45b82318, 0x94a75afd, 0x45b2de0e, 0x94a3eeff, 0x45ad98da, 0x94a08344, - 0x45a8537a, 0x949d17cc, - 0x45a30df0, 0x9499ac95, 0x459dc83b, 0x949641a1, 0x4598825a, 0x9492d6ef, - 0x45933c4f, 0x948f6c7f, - 0x458df619, 0x948c0252, 0x4588afb8, 0x94889867, 0x4583692c, 0x94852ebe, - 0x457e2275, 0x9481c557, - 0x4578db93, 0x947e5c33, 0x45739487, 0x947af351, 0x456e4d4f, 0x94778ab1, - 0x456905ed, 0x94742254, - 0x4563be60, 0x9470ba39, 0x455e76a8, 0x946d5260, 0x45592ec6, 0x9469eaca, - 0x4553e6b8, 0x94668376, - 0x454e9e80, 0x94631c65, 0x4549561d, 0x945fb596, 0x45440d90, 0x945c4f09, - 0x453ec4d7, 0x9458e8bf, - 0x45397bf4, 0x945582b7, 0x453432e6, 0x94521cf1, 0x452ee9ae, 0x944eb76e, - 0x4529a04b, 0x944b522d, - 0x452456bd, 0x9447ed2f, 0x451f0d04, 0x94448873, 0x4519c321, 0x944123fa, - 0x45147913, 0x943dbfc3, - 0x450f2edb, 0x943a5bcf, 0x4509e478, 0x9436f81d, 0x450499eb, 0x943394ad, - 0x44ff4f32, 0x94303180, - 0x44fa0450, 0x942cce96, 0x44f4b943, 0x94296bee, 0x44ef6e0b, 0x94260989, - 0x44ea22a9, 0x9422a766, - 0x44e4d71c, 0x941f4585, 0x44df8b64, 0x941be3e8, 0x44da3f83, 0x9418828c, - 0x44d4f376, 0x94152174, - 0x44cfa740, 0x9411c09e, 0x44ca5adf, 0x940e600a, 0x44c50e53, 0x940affb9, - 0x44bfc19d, 0x94079fab, - 0x44ba74bd, 0x94043fdf, 0x44b527b2, 0x9400e056, 0x44afda7d, 0x93fd810f, - 0x44aa8d1d, 0x93fa220b, - 0x44a53f93, 0x93f6c34a, 0x449ff1df, 0x93f364cb, 0x449aa400, 0x93f0068f, - 0x449555f7, 0x93eca896, - 0x449007c4, 0x93e94adf, 0x448ab967, 0x93e5ed6b, 0x44856adf, 0x93e2903a, - 0x44801c2d, 0x93df334c, - 0x447acd50, 0x93dbd6a0, 0x44757e4a, 0x93d87a36, 0x44702f19, 0x93d51e10, - 0x446adfbe, 0x93d1c22c, - 0x44659039, 0x93ce668b, 0x44604089, 0x93cb0b2d, 0x445af0b0, 0x93c7b011, - 0x4455a0ac, 0x93c45539, - 0x4450507e, 0x93c0faa3, 0x444b0026, 0x93bda04f, 0x4445afa4, 0x93ba463f, - 0x44405ef8, 0x93b6ec71, - 0x443b0e21, 0x93b392e6, 0x4435bd21, 0x93b0399e, 0x44306bf6, 0x93ace099, - 0x442b1aa2, 0x93a987d6, - 0x4425c923, 0x93a62f57, 0x4420777b, 0x93a2d71a, 0x441b25a8, 0x939f7f20, - 0x4415d3ab, 0x939c2769, - 0x44108184, 0x9398cff5, 0x440b2f34, 0x939578c3, 0x4405dcb9, 0x939221d5, - 0x44008a14, 0x938ecb29, - 0x43fb3746, 0x938b74c1, 0x43f5e44d, 0x93881e9b, 0x43f0912b, 0x9384c8b8, - 0x43eb3ddf, 0x93817318, - 0x43e5ea68, 0x937e1dbb, 0x43e096c8, 0x937ac8a1, 0x43db42fe, 0x937773ca, - 0x43d5ef0a, 0x93741f35, - 0x43d09aed, 0x9370cae4, 0x43cb46a5, 0x936d76d6, 0x43c5f234, 0x936a230a, - 0x43c09d99, 0x9366cf82, - 0x43bb48d4, 0x93637c3d, 0x43b5f3e5, 0x9360293a, 0x43b09ecc, 0x935cd67b, - 0x43ab498a, 0x935983ff, - 0x43a5f41e, 0x935631c5, 0x43a09e89, 0x9352dfcf, 0x439b48c9, 0x934f8e1c, - 0x4395f2e0, 0x934c3cab, - 0x43909ccd, 0x9348eb7e, 0x438b4691, 0x93459a94, 0x4385f02a, 0x934249ed, - 0x4380999b, 0x933ef989, - 0x437b42e1, 0x933ba968, 0x4375ebfe, 0x9338598a, 0x437094f1, 0x933509f0, - 0x436b3dbb, 0x9331ba98, - 0x4365e65b, 0x932e6b84, 0x43608ed2, 0x932b1cb2, 0x435b371f, 0x9327ce24, - 0x4355df42, 0x93247fd9, - 0x4350873c, 0x932131d1, 0x434b2f0c, 0x931de40c, 0x4345d6b3, 0x931a968b, - 0x43407e31, 0x9317494c, - 0x433b2585, 0x9313fc51, 0x4335ccaf, 0x9310af99, 0x433073b0, 0x930d6324, - 0x432b1a87, 0x930a16f3, - 0x4325c135, 0x9306cb04, 0x432067ba, 0x93037f59, 0x431b0e15, 0x930033f1, - 0x4315b447, 0x92fce8cc, - 0x43105a50, 0x92f99deb, 0x430b002f, 0x92f6534c, 0x4305a5e5, 0x92f308f1, - 0x43004b71, 0x92efbeda, - 0x42faf0d4, 0x92ec7505, 0x42f5960e, 0x92e92b74, 0x42f03b1e, 0x92e5e226, - 0x42eae005, 0x92e2991c, - 0x42e584c3, 0x92df5054, 0x42e02958, 0x92dc07d0, 0x42dacdc3, 0x92d8bf90, - 0x42d57205, 0x92d57792, - 0x42d0161e, 0x92d22fd9, 0x42caba0e, 0x92cee862, 0x42c55dd4, 0x92cba12f, - 0x42c00172, 0x92c85a3f, - 0x42baa4e6, 0x92c51392, 0x42b54831, 0x92c1cd29, 0x42afeb53, 0x92be8703, - 0x42aa8e4b, 0x92bb4121, - 0x42a5311b, 0x92b7fb82, 0x429fd3c1, 0x92b4b626, 0x429a763f, 0x92b1710e, - 0x42951893, 0x92ae2c3a, - 0x428fbabe, 0x92aae7a8, 0x428a5cc0, 0x92a7a35a, 0x4284fe99, 0x92a45f50, - 0x427fa049, 0x92a11b89, - 0x427a41d0, 0x929dd806, 0x4274e32e, 0x929a94c6, 0x426f8463, 0x929751c9, - 0x426a256f, 0x92940f10, - 0x4264c653, 0x9290cc9b, 0x425f670d, 0x928d8a69, 0x425a079e, 0x928a487a, - 0x4254a806, 0x928706cf, - 0x424f4845, 0x9283c568, 0x4249e85c, 0x92808444, 0x42448849, 0x927d4363, - 0x423f280e, 0x927a02c7, - 0x4239c7aa, 0x9276c26d, 0x4234671d, 0x92738258, 0x422f0667, 0x92704286, - 0x4229a588, 0x926d02f7, - 0x42244481, 0x9269c3ac, 0x421ee350, 0x926684a5, 0x421981f7, 0x926345e1, - 0x42142075, 0x92600761, - 0x420ebecb, 0x925cc924, 0x42095cf7, 0x92598b2b, 0x4203fafb, 0x92564d76, - 0x41fe98d6, 0x92531005, - 0x41f93689, 0x924fd2d7, 0x41f3d413, 0x924c95ec, 0x41ee7174, 0x92495946, - 0x41e90eac, 0x92461ce3, - 0x41e3abbc, 0x9242e0c4, 0x41de48a3, 0x923fa4e8, 0x41d8e561, 0x923c6950, - 0x41d381f7, 0x92392dfc, - 0x41ce1e65, 0x9235f2ec, 0x41c8baa9, 0x9232b81f, 0x41c356c5, 0x922f7d96, - 0x41bdf2b9, 0x922c4351, - 0x41b88e84, 0x9229094f, 0x41b32a26, 0x9225cf91, 0x41adc5a0, 0x92229617, - 0x41a860f1, 0x921f5ce1, - 0x41a2fc1a, 0x921c23ef, 0x419d971b, 0x9218eb40, 0x419831f3, 0x9215b2d5, - 0x4192cca2, 0x92127aae, - 0x418d6729, 0x920f42cb, 0x41880188, 0x920c0b2c, 0x41829bbe, 0x9208d3d0, - 0x417d35cb, 0x92059cb8, - 0x4177cfb1, 0x920265e4, 0x4172696e, 0x91ff2f54, 0x416d0302, 0x91fbf908, - 0x41679c6f, 0x91f8c300, - 0x416235b2, 0x91f58d3b, 0x415ccece, 0x91f257bb, 0x415767c1, 0x91ef227e, - 0x4152008c, 0x91ebed85, - 0x414c992f, 0x91e8b8d0, 0x414731a9, 0x91e5845f, 0x4141c9fb, 0x91e25032, - 0x413c6225, 0x91df1c49, - 0x4136fa27, 0x91dbe8a4, 0x41319200, 0x91d8b542, 0x412c29b1, 0x91d58225, - 0x4126c13a, 0x91d24f4c, - 0x4121589b, 0x91cf1cb6, 0x411befd3, 0x91cbea65, 0x411686e4, 0x91c8b857, - 0x41111dcc, 0x91c5868e, - 0x410bb48c, 0x91c25508, 0x41064b24, 0x91bf23c7, 0x4100e194, 0x91bbf2c9, - 0x40fb77dc, 0x91b8c210, - 0x40f60dfb, 0x91b5919a, 0x40f0a3f3, 0x91b26169, 0x40eb39c3, 0x91af317c, - 0x40e5cf6a, 0x91ac01d2, - 0x40e064ea, 0x91a8d26d, 0x40dafa41, 0x91a5a34c, 0x40d58f71, 0x91a2746f, - 0x40d02478, 0x919f45d6, - 0x40cab958, 0x919c1781, 0x40c54e0f, 0x9198e970, 0x40bfe29f, 0x9195bba3, - 0x40ba7706, 0x91928e1a, - 0x40b50b46, 0x918f60d6, 0x40af9f5e, 0x918c33d5, 0x40aa334e, 0x91890719, - 0x40a4c716, 0x9185daa1, - 0x409f5ab6, 0x9182ae6d, 0x4099ee2e, 0x917f827d, 0x4094817f, 0x917c56d1, - 0x408f14a7, 0x91792b6a, - 0x4089a7a8, 0x91760047, 0x40843a81, 0x9172d567, 0x407ecd32, 0x916faacc, - 0x40795fbc, 0x916c8076, - 0x4073f21d, 0x91695663, 0x406e8457, 0x91662c95, 0x40691669, 0x9163030b, - 0x4063a854, 0x915fd9c5, - 0x405e3a16, 0x915cb0c3, 0x4058cbb1, 0x91598806, 0x40535d24, 0x91565f8d, - 0x404dee70, 0x91533758, - 0x40487f94, 0x91500f67, 0x40431090, 0x914ce7bb, 0x403da165, 0x9149c053, - 0x40383212, 0x9146992f, - 0x4032c297, 0x91437250, 0x402d52f5, 0x91404bb5, 0x4027e32b, 0x913d255e, - 0x4022733a, 0x9139ff4b, - 0x401d0321, 0x9136d97d, 0x401792e0, 0x9133b3f3, 0x40122278, 0x91308eae, - 0x400cb1e9, 0x912d69ad, - 0x40074132, 0x912a44f0, 0x4001d053, 0x91272078, 0x3ffc5f4d, 0x9123fc44, - 0x3ff6ee1f, 0x9120d854, - 0x3ff17cca, 0x911db4a9, 0x3fec0b4e, 0x911a9142, 0x3fe699aa, 0x91176e1f, - 0x3fe127df, 0x91144b41, - 0x3fdbb5ec, 0x911128a8, 0x3fd643d2, 0x910e0653, 0x3fd0d191, 0x910ae442, - 0x3fcb5f28, 0x9107c276, - 0x3fc5ec98, 0x9104a0ee, 0x3fc079e0, 0x91017faa, 0x3fbb0702, 0x90fe5eab, - 0x3fb593fb, 0x90fb3df1, - 0x3fb020ce, 0x90f81d7b, 0x3faaad79, 0x90f4fd4a, 0x3fa539fd, 0x90f1dd5d, - 0x3f9fc65a, 0x90eebdb4, - 0x3f9a5290, 0x90eb9e50, 0x3f94de9e, 0x90e87f31, 0x3f8f6a85, 0x90e56056, - 0x3f89f645, 0x90e241bf, - 0x3f8481dd, 0x90df236e, 0x3f7f0d4f, 0x90dc0560, 0x3f799899, 0x90d8e798, - 0x3f7423bc, 0x90d5ca13, - 0x3f6eaeb8, 0x90d2acd4, 0x3f69398d, 0x90cf8fd9, 0x3f63c43b, 0x90cc7322, - 0x3f5e4ec2, 0x90c956b1, - 0x3f58d921, 0x90c63a83, 0x3f53635a, 0x90c31e9b, 0x3f4ded6b, 0x90c002f7, - 0x3f487755, 0x90bce797, - 0x3f430119, 0x90b9cc7d, 0x3f3d8ab5, 0x90b6b1a6, 0x3f38142a, 0x90b39715, - 0x3f329d79, 0x90b07cc8, - 0x3f2d26a0, 0x90ad62c0, 0x3f27afa1, 0x90aa48fd, 0x3f22387a, 0x90a72f7e, - 0x3f1cc12c, 0x90a41644, - 0x3f1749b8, 0x90a0fd4e, 0x3f11d21d, 0x909de49e, 0x3f0c5a5a, 0x909acc32, - 0x3f06e271, 0x9097b40a, - 0x3f016a61, 0x90949c28, 0x3efbf22a, 0x9091848a, 0x3ef679cc, 0x908e6d31, - 0x3ef10148, 0x908b561c, - 0x3eeb889c, 0x90883f4d, 0x3ee60fca, 0x908528c2, 0x3ee096d1, 0x9082127c, - 0x3edb1db1, 0x907efc7a, - 0x3ed5a46b, 0x907be6be, 0x3ed02afd, 0x9078d146, 0x3ecab169, 0x9075bc13, - 0x3ec537ae, 0x9072a725, - 0x3ebfbdcd, 0x906f927c, 0x3eba43c4, 0x906c7e17, 0x3eb4c995, 0x906969f8, - 0x3eaf4f40, 0x9066561d, - 0x3ea9d4c3, 0x90634287, 0x3ea45a21, 0x90602f35, 0x3e9edf57, 0x905d1c29, - 0x3e996467, 0x905a0962, - 0x3e93e950, 0x9056f6df, 0x3e8e6e12, 0x9053e4a1, 0x3e88f2ae, 0x9050d2a9, - 0x3e837724, 0x904dc0f5, - 0x3e7dfb73, 0x904aaf86, 0x3e787f9b, 0x90479e5c, 0x3e73039d, 0x90448d76, - 0x3e6d8778, 0x90417cd6, - 0x3e680b2c, 0x903e6c7b, 0x3e628ebb, 0x903b5c64, 0x3e5d1222, 0x90384c93, - 0x3e579564, 0x90353d06, - 0x3e52187f, 0x90322dbf, 0x3e4c9b73, 0x902f1ebc, 0x3e471e41, 0x902c0fff, - 0x3e41a0e8, 0x90290186, - 0x3e3c2369, 0x9025f352, 0x3e36a5c4, 0x9022e564, 0x3e3127f9, 0x901fd7ba, - 0x3e2baa07, 0x901cca55, - 0x3e262bee, 0x9019bd36, 0x3e20adaf, 0x9016b05b, 0x3e1b2f4a, 0x9013a3c5, - 0x3e15b0bf, 0x90109775, - 0x3e10320d, 0x900d8b69, 0x3e0ab336, 0x900a7fa3, 0x3e053437, 0x90077422, - 0x3dffb513, 0x900468e5, - 0x3dfa35c8, 0x90015dee, 0x3df4b657, 0x8ffe533c, 0x3def36c0, 0x8ffb48cf, - 0x3de9b703, 0x8ff83ea7, - 0x3de4371f, 0x8ff534c4, 0x3ddeb716, 0x8ff22b26, 0x3dd936e6, 0x8fef21ce, - 0x3dd3b690, 0x8fec18ba, - 0x3dce3614, 0x8fe90fec, 0x3dc8b571, 0x8fe60763, 0x3dc334a9, 0x8fe2ff1f, - 0x3dbdb3ba, 0x8fdff720, - 0x3db832a6, 0x8fdcef66, 0x3db2b16b, 0x8fd9e7f2, 0x3dad300b, 0x8fd6e0c2, - 0x3da7ae84, 0x8fd3d9d8, - 0x3da22cd7, 0x8fd0d333, 0x3d9cab04, 0x8fcdccd3, 0x3d97290b, 0x8fcac6b9, - 0x3d91a6ed, 0x8fc7c0e3, - 0x3d8c24a8, 0x8fc4bb53, 0x3d86a23d, 0x8fc1b608, 0x3d811fac, 0x8fbeb103, - 0x3d7b9cf6, 0x8fbbac42, - 0x3d761a19, 0x8fb8a7c7, 0x3d709717, 0x8fb5a391, 0x3d6b13ee, 0x8fb29fa0, - 0x3d6590a0, 0x8faf9bf5, - 0x3d600d2c, 0x8fac988f, 0x3d5a8992, 0x8fa9956e, 0x3d5505d2, 0x8fa69293, - 0x3d4f81ec, 0x8fa38ffc, - 0x3d49fde1, 0x8fa08dab, 0x3d4479b0, 0x8f9d8ba0, 0x3d3ef559, 0x8f9a89da, - 0x3d3970dc, 0x8f978859, - 0x3d33ec39, 0x8f94871d, 0x3d2e6771, 0x8f918627, 0x3d28e282, 0x8f8e8576, - 0x3d235d6f, 0x8f8b850a, - 0x3d1dd835, 0x8f8884e4, 0x3d1852d6, 0x8f858503, 0x3d12cd51, 0x8f828568, - 0x3d0d47a6, 0x8f7f8612, - 0x3d07c1d6, 0x8f7c8701, 0x3d023be0, 0x8f798836, 0x3cfcb5c4, 0x8f7689b0, - 0x3cf72f83, 0x8f738b70, - 0x3cf1a91c, 0x8f708d75, 0x3cec2290, 0x8f6d8fbf, 0x3ce69bde, 0x8f6a924f, - 0x3ce11507, 0x8f679525, - 0x3cdb8e09, 0x8f649840, 0x3cd606e7, 0x8f619ba0, 0x3cd07f9f, 0x8f5e9f46, - 0x3ccaf831, 0x8f5ba331, - 0x3cc5709e, 0x8f58a761, 0x3cbfe8e5, 0x8f55abd8, 0x3cba6107, 0x8f52b093, - 0x3cb4d904, 0x8f4fb595, - 0x3caf50da, 0x8f4cbadb, 0x3ca9c88c, 0x8f49c067, 0x3ca44018, 0x8f46c639, - 0x3c9eb77f, 0x8f43cc50, - 0x3c992ec0, 0x8f40d2ad, 0x3c93a5dc, 0x8f3dd950, 0x3c8e1cd3, 0x8f3ae038, - 0x3c8893a4, 0x8f37e765, - 0x3c830a50, 0x8f34eed8, 0x3c7d80d6, 0x8f31f691, 0x3c77f737, 0x8f2efe8f, - 0x3c726d73, 0x8f2c06d3, - 0x3c6ce38a, 0x8f290f5c, 0x3c67597b, 0x8f26182b, 0x3c61cf48, 0x8f232140, - 0x3c5c44ee, 0x8f202a9a, - 0x3c56ba70, 0x8f1d343a, 0x3c512fcc, 0x8f1a3e1f, 0x3c4ba504, 0x8f17484b, - 0x3c461a16, 0x8f1452bb, - 0x3c408f03, 0x8f115d72, 0x3c3b03ca, 0x8f0e686e, 0x3c35786d, 0x8f0b73b0, - 0x3c2fecea, 0x8f087f37, - 0x3c2a6142, 0x8f058b04, 0x3c24d575, 0x8f029717, 0x3c1f4983, 0x8effa370, - 0x3c19bd6c, 0x8efcb00e, - 0x3c143130, 0x8ef9bcf2, 0x3c0ea4cf, 0x8ef6ca1c, 0x3c091849, 0x8ef3d78b, - 0x3c038b9e, 0x8ef0e540, - 0x3bfdfecd, 0x8eedf33b, 0x3bf871d8, 0x8eeb017c, 0x3bf2e4be, 0x8ee81002, - 0x3bed577e, 0x8ee51ece, - 0x3be7ca1a, 0x8ee22de0, 0x3be23c91, 0x8edf3d38, 0x3bdcaee3, 0x8edc4cd5, - 0x3bd72110, 0x8ed95cb8, - 0x3bd19318, 0x8ed66ce1, 0x3bcc04fb, 0x8ed37d50, 0x3bc676b9, 0x8ed08e05, - 0x3bc0e853, 0x8ecd9eff, - 0x3bbb59c7, 0x8ecab040, 0x3bb5cb17, 0x8ec7c1c6, 0x3bb03c42, 0x8ec4d392, - 0x3baaad48, 0x8ec1e5a4, - 0x3ba51e29, 0x8ebef7fb, 0x3b9f8ee5, 0x8ebc0a99, 0x3b99ff7d, 0x8eb91d7c, - 0x3b946ff0, 0x8eb630a6, - 0x3b8ee03e, 0x8eb34415, 0x3b895068, 0x8eb057ca, 0x3b83c06c, 0x8ead6bc5, - 0x3b7e304c, 0x8eaa8006, - 0x3b78a007, 0x8ea7948c, 0x3b730f9e, 0x8ea4a959, 0x3b6d7f10, 0x8ea1be6c, - 0x3b67ee5d, 0x8e9ed3c4, - 0x3b625d86, 0x8e9be963, 0x3b5ccc8a, 0x8e98ff47, 0x3b573b69, 0x8e961571, - 0x3b51aa24, 0x8e932be2, - 0x3b4c18ba, 0x8e904298, 0x3b46872c, 0x8e8d5994, 0x3b40f579, 0x8e8a70d7, - 0x3b3b63a1, 0x8e87885f, - 0x3b35d1a5, 0x8e84a02d, 0x3b303f84, 0x8e81b841, 0x3b2aad3f, 0x8e7ed09b, - 0x3b251ad6, 0x8e7be93c, - 0x3b1f8848, 0x8e790222, 0x3b19f595, 0x8e761b4e, 0x3b1462be, 0x8e7334c1, - 0x3b0ecfc3, 0x8e704e79, - 0x3b093ca3, 0x8e6d6877, 0x3b03a95e, 0x8e6a82bc, 0x3afe15f6, 0x8e679d47, - 0x3af88269, 0x8e64b817, - 0x3af2eeb7, 0x8e61d32e, 0x3aed5ae1, 0x8e5eee8b, 0x3ae7c6e7, 0x8e5c0a2e, - 0x3ae232c9, 0x8e592617, - 0x3adc9e86, 0x8e564246, 0x3ad70a1f, 0x8e535ebb, 0x3ad17593, 0x8e507b76, - 0x3acbe0e3, 0x8e4d9878, - 0x3ac64c0f, 0x8e4ab5bf, 0x3ac0b717, 0x8e47d34d, 0x3abb21fb, 0x8e44f121, - 0x3ab58cba, 0x8e420f3b, - 0x3aaff755, 0x8e3f2d9b, 0x3aaa61cc, 0x8e3c4c41, 0x3aa4cc1e, 0x8e396b2e, - 0x3a9f364d, 0x8e368a61, - 0x3a99a057, 0x8e33a9da, 0x3a940a3e, 0x8e30c999, 0x3a8e7400, 0x8e2de99e, - 0x3a88dd9d, 0x8e2b09e9, - 0x3a834717, 0x8e282a7b, 0x3a7db06d, 0x8e254b53, 0x3a78199f, 0x8e226c71, - 0x3a7282ac, 0x8e1f8dd6, - 0x3a6ceb96, 0x8e1caf80, 0x3a67545b, 0x8e19d171, 0x3a61bcfd, 0x8e16f3a9, - 0x3a5c257a, 0x8e141626, - 0x3a568dd4, 0x8e1138ea, 0x3a50f609, 0x8e0e5bf4, 0x3a4b5e1b, 0x8e0b7f44, - 0x3a45c608, 0x8e08a2db, - 0x3a402dd2, 0x8e05c6b7, 0x3a3a9577, 0x8e02eadb, 0x3a34fcf9, 0x8e000f44, - 0x3a2f6457, 0x8dfd33f4, - 0x3a29cb91, 0x8dfa58ea, 0x3a2432a7, 0x8df77e27, 0x3a1e9999, 0x8df4a3a9, - 0x3a190068, 0x8df1c973, - 0x3a136712, 0x8deeef82, 0x3a0dcd99, 0x8dec15d8, 0x3a0833fc, 0x8de93c74, - 0x3a029a3b, 0x8de66357, - 0x39fd0056, 0x8de38a80, 0x39f7664e, 0x8de0b1ef, 0x39f1cc21, 0x8dddd9a5, - 0x39ec31d1, 0x8ddb01a1, - 0x39e6975e, 0x8dd829e4, 0x39e0fcc6, 0x8dd5526d, 0x39db620b, 0x8dd27b3c, - 0x39d5c72c, 0x8dcfa452, - 0x39d02c2a, 0x8dcccdaf, 0x39ca9104, 0x8dc9f751, 0x39c4f5ba, 0x8dc7213b, - 0x39bf5a4d, 0x8dc44b6a, - 0x39b9bebc, 0x8dc175e0, 0x39b42307, 0x8dbea09d, 0x39ae872f, 0x8dbbcba0, - 0x39a8eb33, 0x8db8f6ea, - 0x39a34f13, 0x8db6227a, 0x399db2d0, 0x8db34e50, 0x3998166a, 0x8db07a6d, - 0x399279e0, 0x8dada6d1, - 0x398cdd32, 0x8daad37b, 0x39874061, 0x8da8006c, 0x3981a36d, 0x8da52da3, - 0x397c0655, 0x8da25b21, - 0x39766919, 0x8d9f88e5, 0x3970cbba, 0x8d9cb6f0, 0x396b2e38, 0x8d99e541, - 0x39659092, 0x8d9713d9, - 0x395ff2c9, 0x8d9442b8, 0x395a54dd, 0x8d9171dd, 0x3954b6cd, 0x8d8ea148, - 0x394f1899, 0x8d8bd0fb, - 0x39497a43, 0x8d8900f3, 0x3943dbc9, 0x8d863133, 0x393e3d2c, 0x8d8361b9, - 0x39389e6b, 0x8d809286, - 0x3932ff87, 0x8d7dc399, 0x392d6080, 0x8d7af4f3, 0x3927c155, 0x8d782694, - 0x39222208, 0x8d75587b, - 0x391c8297, 0x8d728aa9, 0x3916e303, 0x8d6fbd1d, 0x3911434b, 0x8d6cefd9, - 0x390ba371, 0x8d6a22db, - 0x39060373, 0x8d675623, 0x39006352, 0x8d6489b3, 0x38fac30e, 0x8d61bd89, - 0x38f522a6, 0x8d5ef1a5, - 0x38ef821c, 0x8d5c2609, 0x38e9e16e, 0x8d595ab3, 0x38e4409e, 0x8d568fa4, - 0x38de9faa, 0x8d53c4db, - 0x38d8fe93, 0x8d50fa59, 0x38d35d59, 0x8d4e301f, 0x38cdbbfc, 0x8d4b662a, - 0x38c81a7c, 0x8d489c7d, - 0x38c278d9, 0x8d45d316, 0x38bcd713, 0x8d4309f6, 0x38b7352a, 0x8d40411d, - 0x38b1931e, 0x8d3d788b, - 0x38abf0ef, 0x8d3ab03f, 0x38a64e9d, 0x8d37e83a, 0x38a0ac29, 0x8d35207d, - 0x389b0991, 0x8d325905, - 0x389566d6, 0x8d2f91d5, 0x388fc3f8, 0x8d2ccaec, 0x388a20f8, 0x8d2a0449, - 0x38847dd5, 0x8d273ded, - 0x387eda8e, 0x8d2477d8, 0x38793725, 0x8d21b20a, 0x38739399, 0x8d1eec83, - 0x386defeb, 0x8d1c2742, - 0x38684c19, 0x8d196249, 0x3862a825, 0x8d169d96, 0x385d040d, 0x8d13d92a, - 0x38575fd4, 0x8d111505, - 0x3851bb77, 0x8d0e5127, 0x384c16f7, 0x8d0b8d90, 0x38467255, 0x8d08ca40, - 0x3840cd90, 0x8d060737, - 0x383b28a9, 0x8d034474, 0x3835839f, 0x8d0081f9, 0x382fde72, 0x8cfdbfc4, - 0x382a3922, 0x8cfafdd7, - 0x382493b0, 0x8cf83c30, 0x381eee1b, 0x8cf57ad0, 0x38194864, 0x8cf2b9b8, - 0x3813a28a, 0x8ceff8e6, - 0x380dfc8d, 0x8ced385b, 0x3808566e, 0x8cea7818, 0x3802b02c, 0x8ce7b81b, - 0x37fd09c8, 0x8ce4f865, - 0x37f76341, 0x8ce238f6, 0x37f1bc97, 0x8cdf79ce, 0x37ec15cb, 0x8cdcbaee, - 0x37e66edd, 0x8cd9fc54, - 0x37e0c7cc, 0x8cd73e01, 0x37db2099, 0x8cd47ff6, 0x37d57943, 0x8cd1c231, - 0x37cfd1cb, 0x8ccf04b3, - 0x37ca2a30, 0x8ccc477d, 0x37c48273, 0x8cc98a8e, 0x37beda93, 0x8cc6cde5, - 0x37b93292, 0x8cc41184, - 0x37b38a6d, 0x8cc1556a, 0x37ade227, 0x8cbe9996, 0x37a839be, 0x8cbbde0a, - 0x37a29132, 0x8cb922c6, - 0x379ce885, 0x8cb667c8, 0x37973fb5, 0x8cb3ad11, 0x379196c3, 0x8cb0f2a1, - 0x378bedae, 0x8cae3879, - 0x37864477, 0x8cab7e98, 0x37809b1e, 0x8ca8c4fd, 0x377af1a3, 0x8ca60baa, - 0x37754806, 0x8ca3529f, - 0x376f9e46, 0x8ca099da, 0x3769f464, 0x8c9de15c, 0x37644a60, 0x8c9b2926, - 0x375ea03a, 0x8c987137, - 0x3758f5f2, 0x8c95b98f, 0x37534b87, 0x8c93022e, 0x374da0fa, 0x8c904b14, - 0x3747f64c, 0x8c8d9442, - 0x37424b7b, 0x8c8addb7, 0x373ca088, 0x8c882773, 0x3736f573, 0x8c857176, - 0x37314a3c, 0x8c82bbc0, - 0x372b9ee3, 0x8c800652, 0x3725f367, 0x8c7d512b, 0x372047ca, 0x8c7a9c4b, - 0x371a9c0b, 0x8c77e7b3, - 0x3714f02a, 0x8c753362, 0x370f4427, 0x8c727f58, 0x37099802, 0x8c6fcb95, - 0x3703ebbb, 0x8c6d181a, - 0x36fe3f52, 0x8c6a64e5, 0x36f892c7, 0x8c67b1f9, 0x36f2e61a, 0x8c64ff53, - 0x36ed394b, 0x8c624cf5, - 0x36e78c5b, 0x8c5f9ade, 0x36e1df48, 0x8c5ce90e, 0x36dc3214, 0x8c5a3786, - 0x36d684be, 0x8c578645, - 0x36d0d746, 0x8c54d54c, 0x36cb29ac, 0x8c522499, 0x36c57bf0, 0x8c4f742f, - 0x36bfce13, 0x8c4cc40b, - 0x36ba2014, 0x8c4a142f, 0x36b471f3, 0x8c47649a, 0x36aec3b0, 0x8c44b54d, - 0x36a9154c, 0x8c420647, - 0x36a366c6, 0x8c3f5788, 0x369db81e, 0x8c3ca911, 0x36980954, 0x8c39fae1, - 0x36925a69, 0x8c374cf9, - 0x368cab5c, 0x8c349f58, 0x3686fc2e, 0x8c31f1ff, 0x36814cde, 0x8c2f44ed, - 0x367b9d6c, 0x8c2c9822, - 0x3675edd9, 0x8c29eb9f, 0x36703e24, 0x8c273f63, 0x366a8e4d, 0x8c24936f, - 0x3664de55, 0x8c21e7c2, - 0x365f2e3b, 0x8c1f3c5d, 0x36597e00, 0x8c1c913f, 0x3653cda3, 0x8c19e669, - 0x364e1d25, 0x8c173bda, - 0x36486c86, 0x8c149192, 0x3642bbc4, 0x8c11e792, 0x363d0ae2, 0x8c0f3dda, - 0x363759de, 0x8c0c9469, - 0x3631a8b8, 0x8c09eb40, 0x362bf771, 0x8c07425e, 0x36264609, 0x8c0499c4, - 0x3620947f, 0x8c01f171, - 0x361ae2d3, 0x8bff4966, 0x36153107, 0x8bfca1a3, 0x360f7f19, 0x8bf9fa27, - 0x3609cd0a, 0x8bf752f2, - 0x36041ad9, 0x8bf4ac05, 0x35fe6887, 0x8bf20560, 0x35f8b614, 0x8bef5f02, - 0x35f3037f, 0x8becb8ec, - 0x35ed50c9, 0x8bea131e, 0x35e79df2, 0x8be76d97, 0x35e1eafa, 0x8be4c857, - 0x35dc37e0, 0x8be22360, - 0x35d684a6, 0x8bdf7eb0, 0x35d0d14a, 0x8bdcda47, 0x35cb1dcc, 0x8bda3626, - 0x35c56a2e, 0x8bd7924d, - 0x35bfb66e, 0x8bd4eebc, 0x35ba028e, 0x8bd24b72, 0x35b44e8c, 0x8bcfa870, - 0x35ae9a69, 0x8bcd05b5, - 0x35a8e625, 0x8bca6343, 0x35a331c0, 0x8bc7c117, 0x359d7d39, 0x8bc51f34, - 0x3597c892, 0x8bc27d98, - 0x359213c9, 0x8bbfdc44, 0x358c5ee0, 0x8bbd3b38, 0x3586a9d5, 0x8bba9a73, - 0x3580f4aa, 0x8bb7f9f6, - 0x357b3f5d, 0x8bb559c1, 0x357589f0, 0x8bb2b9d4, 0x356fd461, 0x8bb01a2e, - 0x356a1eb2, 0x8bad7ad0, - 0x356468e2, 0x8baadbba, 0x355eb2f0, 0x8ba83cec, 0x3558fcde, 0x8ba59e65, - 0x355346ab, 0x8ba30026, - 0x354d9057, 0x8ba0622f, 0x3547d9e2, 0x8b9dc480, 0x3542234c, 0x8b9b2718, - 0x353c6c95, 0x8b9889f8, - 0x3536b5be, 0x8b95ed21, 0x3530fec6, 0x8b935090, 0x352b47ad, 0x8b90b448, - 0x35259073, 0x8b8e1848, - 0x351fd918, 0x8b8b7c8f, 0x351a219c, 0x8b88e11e, 0x35146a00, 0x8b8645f5, - 0x350eb243, 0x8b83ab14, - 0x3508fa66, 0x8b81107b, 0x35034267, 0x8b7e7629, 0x34fd8a48, 0x8b7bdc20, - 0x34f7d208, 0x8b79425e, - 0x34f219a8, 0x8b76a8e4, 0x34ec6127, 0x8b740fb3, 0x34e6a885, 0x8b7176c8, - 0x34e0efc2, 0x8b6ede26, - 0x34db36df, 0x8b6c45cc, 0x34d57ddc, 0x8b69adba, 0x34cfc4b7, 0x8b6715ef, - 0x34ca0b73, 0x8b647e6d, - 0x34c4520d, 0x8b61e733, 0x34be9887, 0x8b5f5040, 0x34b8dee1, 0x8b5cb995, - 0x34b3251a, 0x8b5a2333, - 0x34ad6b32, 0x8b578d18, 0x34a7b12a, 0x8b54f745, 0x34a1f702, 0x8b5261ba, - 0x349c3cb9, 0x8b4fcc77, - 0x34968250, 0x8b4d377c, 0x3490c7c6, 0x8b4aa2ca, 0x348b0d1c, 0x8b480e5f, - 0x34855251, 0x8b457a3c, - 0x347f9766, 0x8b42e661, 0x3479dc5b, 0x8b4052ce, 0x3474212f, 0x8b3dbf83, - 0x346e65e3, 0x8b3b2c80, - 0x3468aa76, 0x8b3899c6, 0x3462eee9, 0x8b360753, 0x345d333c, 0x8b337528, - 0x3457776f, 0x8b30e345, - 0x3451bb81, 0x8b2e51ab, 0x344bff73, 0x8b2bc058, 0x34464345, 0x8b292f4e, - 0x344086f6, 0x8b269e8b, - 0x343aca87, 0x8b240e11, 0x34350df8, 0x8b217ddf, 0x342f5149, 0x8b1eedf4, - 0x3429947a, 0x8b1c5e52, - 0x3423d78a, 0x8b19cef8, 0x341e1a7b, 0x8b173fe6, 0x34185d4b, 0x8b14b11d, - 0x34129ffb, 0x8b12229b, - 0x340ce28b, 0x8b0f9462, 0x340724fb, 0x8b0d0670, 0x3401674a, 0x8b0a78c7, - 0x33fba97a, 0x8b07eb66, - 0x33f5eb89, 0x8b055e4d, 0x33f02d79, 0x8b02d17c, 0x33ea6f48, 0x8b0044f3, - 0x33e4b0f8, 0x8afdb8b3, - 0x33def287, 0x8afb2cbb, 0x33d933f7, 0x8af8a10b, 0x33d37546, 0x8af615a3, - 0x33cdb676, 0x8af38a83, - 0x33c7f785, 0x8af0ffac, 0x33c23875, 0x8aee751c, 0x33bc7944, 0x8aebead5, - 0x33b6b9f4, 0x8ae960d6, - 0x33b0fa84, 0x8ae6d720, 0x33ab3af4, 0x8ae44db1, 0x33a57b44, 0x8ae1c48b, - 0x339fbb74, 0x8adf3bad, - 0x3399fb85, 0x8adcb318, 0x33943b75, 0x8ada2aca, 0x338e7b46, 0x8ad7a2c5, - 0x3388baf7, 0x8ad51b08, - 0x3382fa88, 0x8ad29394, 0x337d39f9, 0x8ad00c67, 0x3377794b, 0x8acd8583, - 0x3371b87d, 0x8acafee8, - 0x336bf78f, 0x8ac87894, 0x33663682, 0x8ac5f289, 0x33607554, 0x8ac36cc6, - 0x335ab407, 0x8ac0e74c, - 0x3354f29b, 0x8abe6219, 0x334f310e, 0x8abbdd30, 0x33496f62, 0x8ab9588e, - 0x3343ad97, 0x8ab6d435, - 0x333debab, 0x8ab45024, 0x333829a1, 0x8ab1cc5c, 0x33326776, 0x8aaf48db, - 0x332ca52c, 0x8aacc5a4, - 0x3326e2c3, 0x8aaa42b4, 0x33212039, 0x8aa7c00d, 0x331b5d91, 0x8aa53daf, - 0x33159ac8, 0x8aa2bb99, - 0x330fd7e1, 0x8aa039cb, 0x330a14da, 0x8a9db845, 0x330451b3, 0x8a9b3708, - 0x32fe8e6d, 0x8a98b614, - 0x32f8cb07, 0x8a963567, 0x32f30782, 0x8a93b504, 0x32ed43de, 0x8a9134e8, - 0x32e7801a, 0x8a8eb516, - 0x32e1bc36, 0x8a8c358b, 0x32dbf834, 0x8a89b649, 0x32d63412, 0x8a873750, - 0x32d06fd0, 0x8a84b89e, - 0x32caab6f, 0x8a823a36, 0x32c4e6ef, 0x8a7fbc16, 0x32bf2250, 0x8a7d3e3e, - 0x32b95d91, 0x8a7ac0af, - 0x32b398b3, 0x8a784368, 0x32add3b6, 0x8a75c66a, 0x32a80e99, 0x8a7349b4, - 0x32a2495d, 0x8a70cd47, - 0x329c8402, 0x8a6e5123, 0x3296be88, 0x8a6bd547, 0x3290f8ef, 0x8a6959b3, - 0x328b3336, 0x8a66de68, - 0x32856d5e, 0x8a646365, 0x327fa767, 0x8a61e8ab, 0x3279e151, 0x8a5f6e3a, - 0x32741b1c, 0x8a5cf411, - 0x326e54c7, 0x8a5a7a31, 0x32688e54, 0x8a580099, 0x3262c7c1, 0x8a55874a, - 0x325d0110, 0x8a530e43, - 0x32573a3f, 0x8a509585, 0x3251734f, 0x8a4e1d10, 0x324bac40, 0x8a4ba4e3, - 0x3245e512, 0x8a492cff, - 0x32401dc6, 0x8a46b564, 0x323a565a, 0x8a443e11, 0x32348ecf, 0x8a41c706, - 0x322ec725, 0x8a3f5045, - 0x3228ff5c, 0x8a3cd9cc, 0x32233775, 0x8a3a639b, 0x321d6f6e, 0x8a37edb3, - 0x3217a748, 0x8a357814, - 0x3211df04, 0x8a3302be, 0x320c16a1, 0x8a308db0, 0x32064e1e, 0x8a2e18eb, - 0x3200857d, 0x8a2ba46e, - 0x31fabcbd, 0x8a29303b, 0x31f4f3df, 0x8a26bc50, 0x31ef2ae1, 0x8a2448ad, - 0x31e961c5, 0x8a21d554, - 0x31e39889, 0x8a1f6243, 0x31ddcf30, 0x8a1cef7a, 0x31d805b7, 0x8a1a7cfb, - 0x31d23c1f, 0x8a180ac4, - 0x31cc7269, 0x8a1598d6, 0x31c6a894, 0x8a132731, 0x31c0dea1, 0x8a10b5d4, - 0x31bb148f, 0x8a0e44c0, - 0x31b54a5e, 0x8a0bd3f5, 0x31af800e, 0x8a096373, 0x31a9b5a0, 0x8a06f339, - 0x31a3eb13, 0x8a048348, - 0x319e2067, 0x8a0213a0, 0x3198559d, 0x89ffa441, 0x31928ab4, 0x89fd352b, - 0x318cbfad, 0x89fac65d, - 0x3186f487, 0x89f857d8, 0x31812943, 0x89f5e99c, 0x317b5de0, 0x89f37ba9, - 0x3175925e, 0x89f10dff, - 0x316fc6be, 0x89eea09d, 0x3169fb00, 0x89ec3384, 0x31642f23, 0x89e9c6b4, - 0x315e6328, 0x89e75a2d, - 0x3158970e, 0x89e4edef, 0x3152cad5, 0x89e281fa, 0x314cfe7f, 0x89e0164d, - 0x31473209, 0x89ddaae9, - 0x31416576, 0x89db3fcf, 0x313b98c4, 0x89d8d4fd, 0x3135cbf4, 0x89d66a74, - 0x312fff05, 0x89d40033, - 0x312a31f8, 0x89d1963c, 0x312464cd, 0x89cf2c8e, 0x311e9783, 0x89ccc328, - 0x3118ca1b, 0x89ca5a0c, - 0x3112fc95, 0x89c7f138, 0x310d2ef0, 0x89c588ae, 0x3107612e, 0x89c3206c, - 0x3101934d, 0x89c0b873, - 0x30fbc54d, 0x89be50c3, 0x30f5f730, 0x89bbe95c, 0x30f028f4, 0x89b9823e, - 0x30ea5a9a, 0x89b71b69, - 0x30e48c22, 0x89b4b4dd, 0x30debd8c, 0x89b24e9a, 0x30d8eed8, 0x89afe8a0, - 0x30d32006, 0x89ad82ef, - 0x30cd5115, 0x89ab1d87, 0x30c78206, 0x89a8b868, 0x30c1b2da, 0x89a65391, - 0x30bbe38f, 0x89a3ef04, - 0x30b61426, 0x89a18ac0, 0x30b0449f, 0x899f26c5, 0x30aa74fa, 0x899cc313, - 0x30a4a537, 0x899a5faa, - 0x309ed556, 0x8997fc8a, 0x30990557, 0x899599b3, 0x3093353a, 0x89933725, - 0x308d64ff, 0x8990d4e0, - 0x308794a6, 0x898e72e4, 0x3081c42f, 0x898c1131, 0x307bf39b, 0x8989afc8, - 0x307622e8, 0x89874ea7, - 0x30705217, 0x8984edcf, 0x306a8129, 0x89828d41, 0x3064b01d, 0x89802cfc, - 0x305edef3, 0x897dccff, - 0x30590dab, 0x897b6d4c, 0x30533c45, 0x89790de2, 0x304d6ac1, 0x8976aec1, - 0x30479920, 0x89744fe9, - 0x3041c761, 0x8971f15a, 0x303bf584, 0x896f9315, 0x30362389, 0x896d3518, - 0x30305171, 0x896ad765, - 0x302a7f3a, 0x896879fb, 0x3024ace6, 0x89661cda, 0x301eda75, 0x8963c002, - 0x301907e6, 0x89616373, - 0x30133539, 0x895f072e, 0x300d626e, 0x895cab31, 0x30078f86, 0x895a4f7e, - 0x3001bc80, 0x8957f414, - 0x2ffbe95d, 0x895598f3, 0x2ff6161c, 0x89533e1c, 0x2ff042bd, 0x8950e38e, - 0x2fea6f41, 0x894e8948, - 0x2fe49ba7, 0x894c2f4c, 0x2fdec7f0, 0x8949d59a, 0x2fd8f41b, 0x89477c30, - 0x2fd32028, 0x89452310, - 0x2fcd4c19, 0x8942ca39, 0x2fc777eb, 0x894071ab, 0x2fc1a3a0, 0x893e1967, - 0x2fbbcf38, 0x893bc16b, - 0x2fb5fab2, 0x893969b9, 0x2fb0260f, 0x89371250, 0x2faa514f, 0x8934bb31, - 0x2fa47c71, 0x8932645b, - 0x2f9ea775, 0x89300dce, 0x2f98d25d, 0x892db78a, 0x2f92fd26, 0x892b6190, - 0x2f8d27d3, 0x89290bdf, - 0x2f875262, 0x8926b677, 0x2f817cd4, 0x89246159, 0x2f7ba729, 0x89220c84, - 0x2f75d160, 0x891fb7f8, - 0x2f6ffb7a, 0x891d63b5, 0x2f6a2577, 0x891b0fbc, 0x2f644f56, 0x8918bc0c, - 0x2f5e7919, 0x891668a6, - 0x2f58a2be, 0x89141589, 0x2f52cc46, 0x8911c2b5, 0x2f4cf5b0, 0x890f702b, - 0x2f471efe, 0x890d1dea, - 0x2f41482e, 0x890acbf2, 0x2f3b7141, 0x89087a44, 0x2f359a37, 0x890628df, - 0x2f2fc310, 0x8903d7c4, - 0x2f29ebcc, 0x890186f2, 0x2f24146b, 0x88ff3669, 0x2f1e3ced, 0x88fce62a, - 0x2f186551, 0x88fa9634, - 0x2f128d99, 0x88f84687, 0x2f0cb5c3, 0x88f5f724, 0x2f06ddd1, 0x88f3a80b, - 0x2f0105c1, 0x88f1593b, - 0x2efb2d95, 0x88ef0ab4, 0x2ef5554b, 0x88ecbc77, 0x2eef7ce5, 0x88ea6e83, - 0x2ee9a461, 0x88e820d9, - 0x2ee3cbc1, 0x88e5d378, 0x2eddf304, 0x88e38660, 0x2ed81a29, 0x88e13992, - 0x2ed24132, 0x88deed0e, - 0x2ecc681e, 0x88dca0d3, 0x2ec68eed, 0x88da54e1, 0x2ec0b5a0, 0x88d8093a, - 0x2ebadc35, 0x88d5bddb, - 0x2eb502ae, 0x88d372c6, 0x2eaf290a, 0x88d127fb, 0x2ea94f49, 0x88cedd79, - 0x2ea3756b, 0x88cc9340, - 0x2e9d9b70, 0x88ca4951, 0x2e97c159, 0x88c7ffac, 0x2e91e725, 0x88c5b650, - 0x2e8c0cd4, 0x88c36d3e, - 0x2e863267, 0x88c12475, 0x2e8057dd, 0x88bedbf6, 0x2e7a7d36, 0x88bc93c0, - 0x2e74a272, 0x88ba4bd4, - 0x2e6ec792, 0x88b80432, 0x2e68ec95, 0x88b5bcd9, 0x2e63117c, 0x88b375ca, - 0x2e5d3646, 0x88b12f04, - 0x2e575af3, 0x88aee888, 0x2e517f84, 0x88aca255, 0x2e4ba3f8, 0x88aa5c6c, - 0x2e45c850, 0x88a816cd, - 0x2e3fec8b, 0x88a5d177, 0x2e3a10aa, 0x88a38c6b, 0x2e3434ac, 0x88a147a9, - 0x2e2e5891, 0x889f0330, - 0x2e287c5a, 0x889cbf01, 0x2e22a007, 0x889a7b1b, 0x2e1cc397, 0x88983780, - 0x2e16e70b, 0x8895f42d, - 0x2e110a62, 0x8893b125, 0x2e0b2d9d, 0x88916e66, 0x2e0550bb, 0x888f2bf1, - 0x2dff73bd, 0x888ce9c5, - 0x2df996a3, 0x888aa7e3, 0x2df3b96c, 0x8888664b, 0x2deddc19, 0x888624fd, - 0x2de7feaa, 0x8883e3f8, - 0x2de2211e, 0x8881a33d, 0x2ddc4376, 0x887f62cb, 0x2dd665b2, 0x887d22a4, - 0x2dd087d1, 0x887ae2c6, - 0x2dcaa9d5, 0x8878a332, 0x2dc4cbbc, 0x887663e7, 0x2dbeed86, 0x887424e7, - 0x2db90f35, 0x8871e630, - 0x2db330c7, 0x886fa7c2, 0x2dad523d, 0x886d699f, 0x2da77397, 0x886b2bc5, - 0x2da194d5, 0x8868ee35, - 0x2d9bb5f6, 0x8866b0ef, 0x2d95d6fc, 0x886473f2, 0x2d8ff7e5, 0x88623740, - 0x2d8a18b3, 0x885ffad7, - 0x2d843964, 0x885dbeb8, 0x2d7e59f9, 0x885b82e3, 0x2d787a72, 0x88594757, - 0x2d729acf, 0x88570c16, - 0x2d6cbb10, 0x8854d11e, 0x2d66db35, 0x88529670, 0x2d60fb3e, 0x88505c0b, - 0x2d5b1b2b, 0x884e21f1, - 0x2d553afc, 0x884be821, 0x2d4f5ab1, 0x8849ae9a, 0x2d497a4a, 0x8847755d, - 0x2d4399c7, 0x88453c6a, - 0x2d3db928, 0x884303c1, 0x2d37d86d, 0x8840cb61, 0x2d31f797, 0x883e934c, - 0x2d2c16a4, 0x883c5b81, - 0x2d263596, 0x883a23ff, 0x2d20546b, 0x8837ecc7, 0x2d1a7325, 0x8835b5d9, - 0x2d1491c4, 0x88337f35, - 0x2d0eb046, 0x883148db, 0x2d08ceac, 0x882f12cb, 0x2d02ecf7, 0x882cdd04, - 0x2cfd0b26, 0x882aa788, - 0x2cf72939, 0x88287256, 0x2cf14731, 0x88263d6d, 0x2ceb650d, 0x882408ce, - 0x2ce582cd, 0x8821d47a, - 0x2cdfa071, 0x881fa06f, 0x2cd9bdfa, 0x881d6cae, 0x2cd3db67, 0x881b3937, - 0x2ccdf8b8, 0x8819060a, - 0x2cc815ee, 0x8816d327, 0x2cc23308, 0x8814a08f, 0x2cbc5006, 0x88126e40, - 0x2cb66ce9, 0x88103c3b, - 0x2cb089b1, 0x880e0a7f, 0x2caaa65c, 0x880bd90e, 0x2ca4c2ed, 0x8809a7e7, - 0x2c9edf61, 0x8807770a, - 0x2c98fbba, 0x88054677, 0x2c9317f8, 0x8803162e, 0x2c8d341a, 0x8800e62f, - 0x2c875021, 0x87feb67a, - 0x2c816c0c, 0x87fc870f, 0x2c7b87dc, 0x87fa57ee, 0x2c75a390, 0x87f82917, - 0x2c6fbf29, 0x87f5fa8b, - 0x2c69daa6, 0x87f3cc48, 0x2c63f609, 0x87f19e4f, 0x2c5e114f, 0x87ef70a0, - 0x2c582c7b, 0x87ed433c, - 0x2c52478a, 0x87eb1621, 0x2c4c627f, 0x87e8e950, 0x2c467d58, 0x87e6bcca, - 0x2c409816, 0x87e4908e, - 0x2c3ab2b9, 0x87e2649b, 0x2c34cd40, 0x87e038f3, 0x2c2ee7ad, 0x87de0d95, - 0x2c2901fd, 0x87dbe281, - 0x2c231c33, 0x87d9b7b7, 0x2c1d364e, 0x87d78d38, 0x2c17504d, 0x87d56302, - 0x2c116a31, 0x87d33916, - 0x2c0b83fa, 0x87d10f75, 0x2c059da7, 0x87cee61e, 0x2bffb73a, 0x87ccbd11, - 0x2bf9d0b1, 0x87ca944e, - 0x2bf3ea0d, 0x87c86bd5, 0x2bee034e, 0x87c643a6, 0x2be81c74, 0x87c41bc2, - 0x2be2357f, 0x87c1f427, - 0x2bdc4e6f, 0x87bfccd7, 0x2bd66744, 0x87bda5d1, 0x2bd07ffe, 0x87bb7f16, - 0x2bca989d, 0x87b958a4, - 0x2bc4b120, 0x87b7327d, 0x2bbec989, 0x87b50c9f, 0x2bb8e1d7, 0x87b2e70c, - 0x2bb2fa0a, 0x87b0c1c4, - 0x2bad1221, 0x87ae9cc5, 0x2ba72a1e, 0x87ac7811, 0x2ba14200, 0x87aa53a6, - 0x2b9b59c7, 0x87a82f87, - 0x2b957173, 0x87a60bb1, 0x2b8f8905, 0x87a3e825, 0x2b89a07b, 0x87a1c4e4, - 0x2b83b7d7, 0x879fa1ed, - 0x2b7dcf17, 0x879d7f41, 0x2b77e63d, 0x879b5cde, 0x2b71fd48, 0x87993ac6, - 0x2b6c1438, 0x879718f8, - 0x2b662b0e, 0x8794f774, 0x2b6041c9, 0x8792d63b, 0x2b5a5868, 0x8790b54c, - 0x2b546eee, 0x878e94a7, - 0x2b4e8558, 0x878c744d, 0x2b489ba8, 0x878a543d, 0x2b42b1dd, 0x87883477, - 0x2b3cc7f7, 0x878614fb, - 0x2b36ddf7, 0x8783f5ca, 0x2b30f3dc, 0x8781d6e3, 0x2b2b09a6, 0x877fb846, - 0x2b251f56, 0x877d99f4, - 0x2b1f34eb, 0x877b7bec, 0x2b194a66, 0x87795e2f, 0x2b135fc6, 0x877740bb, - 0x2b0d750b, 0x87752392, - 0x2b078a36, 0x877306b4, 0x2b019f46, 0x8770ea20, 0x2afbb43c, 0x876ecdd6, - 0x2af5c917, 0x876cb1d6, - 0x2aefddd8, 0x876a9621, 0x2ae9f27e, 0x87687ab7, 0x2ae4070a, 0x87665f96, - 0x2ade1b7c, 0x876444c1, - 0x2ad82fd2, 0x87622a35, 0x2ad2440f, 0x87600ff4, 0x2acc5831, 0x875df5fd, - 0x2ac66c39, 0x875bdc51, - 0x2ac08026, 0x8759c2ef, 0x2aba93f9, 0x8757a9d8, 0x2ab4a7b1, 0x8755910b, - 0x2aaebb50, 0x87537888, - 0x2aa8ced3, 0x87516050, 0x2aa2e23d, 0x874f4862, 0x2a9cf58c, 0x874d30bf, - 0x2a9708c1, 0x874b1966, - 0x2a911bdc, 0x87490258, 0x2a8b2edc, 0x8746eb94, 0x2a8541c3, 0x8744d51b, - 0x2a7f548e, 0x8742beec, - 0x2a796740, 0x8740a907, 0x2a7379d8, 0x873e936d, 0x2a6d8c55, 0x873c7e1e, - 0x2a679eb8, 0x873a6919, - 0x2a61b101, 0x8738545e, 0x2a5bc330, 0x87363fee, 0x2a55d545, 0x87342bc9, - 0x2a4fe740, 0x873217ee, - 0x2a49f920, 0x8730045d, 0x2a440ae7, 0x872df117, 0x2a3e1c93, 0x872bde1c, - 0x2a382e25, 0x8729cb6b, - 0x2a323f9e, 0x8727b905, 0x2a2c50fc, 0x8725a6e9, 0x2a266240, 0x87239518, - 0x2a20736a, 0x87218391, - 0x2a1a847b, 0x871f7255, 0x2a149571, 0x871d6163, 0x2a0ea64d, 0x871b50bc, - 0x2a08b710, 0x87194060, - 0x2a02c7b8, 0x8717304e, 0x29fcd847, 0x87152087, 0x29f6e8bb, 0x8713110a, - 0x29f0f916, 0x871101d8, - 0x29eb0957, 0x870ef2f1, 0x29e5197e, 0x870ce454, 0x29df298b, 0x870ad602, - 0x29d9397f, 0x8708c7fa, - 0x29d34958, 0x8706ba3d, 0x29cd5918, 0x8704acca, 0x29c768be, 0x87029fa3, - 0x29c1784a, 0x870092c5, - 0x29bb87bc, 0x86fe8633, 0x29b59715, 0x86fc79eb, 0x29afa654, 0x86fa6dee, - 0x29a9b579, 0x86f8623b, - 0x29a3c485, 0x86f656d3, 0x299dd377, 0x86f44bb6, 0x2997e24f, 0x86f240e3, - 0x2991f10e, 0x86f0365c, - 0x298bffb2, 0x86ee2c1e, 0x29860e3e, 0x86ec222c, 0x29801caf, 0x86ea1884, - 0x297a2b07, 0x86e80f27, - 0x29743946, 0x86e60614, 0x296e476b, 0x86e3fd4c, 0x29685576, 0x86e1f4cf, - 0x29626368, 0x86dfec9d, - 0x295c7140, 0x86dde4b5, 0x29567eff, 0x86dbdd18, 0x29508ca4, 0x86d9d5c6, - 0x294a9a30, 0x86d7cebf, - 0x2944a7a2, 0x86d5c802, 0x293eb4fb, 0x86d3c190, 0x2938c23a, 0x86d1bb69, - 0x2932cf60, 0x86cfb58c, - 0x292cdc6d, 0x86cdaffa, 0x2926e960, 0x86cbaab3, 0x2920f63a, 0x86c9a5b7, - 0x291b02fa, 0x86c7a106, - 0x29150fa1, 0x86c59c9f, 0x290f1c2f, 0x86c39883, 0x290928a3, 0x86c194b2, - 0x290334ff, 0x86bf912c, - 0x28fd4140, 0x86bd8df0, 0x28f74d69, 0x86bb8b00, 0x28f15978, 0x86b9885a, - 0x28eb656e, 0x86b785ff, - 0x28e5714b, 0x86b583ee, 0x28df7d0e, 0x86b38229, 0x28d988b8, 0x86b180ae, - 0x28d3944a, 0x86af7f7e, - 0x28cd9fc1, 0x86ad7e99, 0x28c7ab20, 0x86ab7dff, 0x28c1b666, 0x86a97db0, - 0x28bbc192, 0x86a77dab, - 0x28b5cca5, 0x86a57df2, 0x28afd7a0, 0x86a37e83, 0x28a9e281, 0x86a17f5f, - 0x28a3ed49, 0x869f8086, - 0x289df7f8, 0x869d81f8, 0x2898028e, 0x869b83b4, 0x28920d0a, 0x869985bc, - 0x288c176e, 0x8697880f, - 0x288621b9, 0x86958aac, 0x28802beb, 0x86938d94, 0x287a3604, 0x869190c7, - 0x28744004, 0x868f9445, - 0x286e49ea, 0x868d980e, 0x286853b8, 0x868b9c22, 0x28625d6d, 0x8689a081, - 0x285c670a, 0x8687a52b, - 0x2856708d, 0x8685aa20, 0x285079f7, 0x8683af5f, 0x284a8349, 0x8681b4ea, - 0x28448c81, 0x867fbabf, - 0x283e95a1, 0x867dc0e0, 0x28389ea8, 0x867bc74b, 0x2832a796, 0x8679ce01, - 0x282cb06c, 0x8677d503, - 0x2826b928, 0x8675dc4f, 0x2820c1cc, 0x8673e3e6, 0x281aca57, 0x8671ebc8, - 0x2814d2c9, 0x866ff3f6, - 0x280edb23, 0x866dfc6e, 0x2808e364, 0x866c0531, 0x2802eb8c, 0x866a0e3f, - 0x27fcf39c, 0x86681798, - 0x27f6fb92, 0x8666213c, 0x27f10371, 0x86642b2c, 0x27eb0b36, 0x86623566, - 0x27e512e3, 0x86603feb, - 0x27df1a77, 0x865e4abb, 0x27d921f3, 0x865c55d7, 0x27d32956, 0x865a613d, - 0x27cd30a1, 0x86586cee, - 0x27c737d3, 0x865678eb, 0x27c13eec, 0x86548532, 0x27bb45ed, 0x865291c4, - 0x27b54cd6, 0x86509ea2, - 0x27af53a6, 0x864eabcb, 0x27a95a5d, 0x864cb93e, 0x27a360fc, 0x864ac6fd, - 0x279d6783, 0x8648d507, - 0x27976df1, 0x8646e35c, 0x27917447, 0x8644f1fc, 0x278b7a84, 0x864300e7, - 0x278580a9, 0x8641101d, - 0x277f86b5, 0x863f1f9e, 0x27798caa, 0x863d2f6b, 0x27739285, 0x863b3f82, - 0x276d9849, 0x86394fe5, - 0x27679df4, 0x86376092, 0x2761a387, 0x8635718b, 0x275ba901, 0x863382cf, - 0x2755ae64, 0x8631945e, - 0x274fb3ae, 0x862fa638, 0x2749b8e0, 0x862db85e, 0x2743bdf9, 0x862bcace, - 0x273dc2fa, 0x8629dd8a, - 0x2737c7e3, 0x8627f091, 0x2731ccb4, 0x862603e3, 0x272bd16d, 0x86241780, - 0x2725d60e, 0x86222b68, - 0x271fda96, 0x86203f9c, 0x2719df06, 0x861e541a, 0x2713e35f, 0x861c68e4, - 0x270de79f, 0x861a7df9, - 0x2707ebc7, 0x86189359, 0x2701efd7, 0x8616a905, 0x26fbf3ce, 0x8614befb, - 0x26f5f7ae, 0x8612d53d, - 0x26effb76, 0x8610ebca, 0x26e9ff26, 0x860f02a3, 0x26e402bd, 0x860d19c6, - 0x26de063d, 0x860b3135, - 0x26d809a5, 0x860948ef, 0x26d20cf5, 0x860760f4, 0x26cc102d, 0x86057944, - 0x26c6134d, 0x860391e0, - 0x26c01655, 0x8601aac7, 0x26ba1945, 0x85ffc3f9, 0x26b41c1d, 0x85fddd76, - 0x26ae1edd, 0x85fbf73f, - 0x26a82186, 0x85fa1153, 0x26a22416, 0x85f82bb2, 0x269c268f, 0x85f6465c, - 0x269628f0, 0x85f46152, - 0x26902b39, 0x85f27c93, 0x268a2d6b, 0x85f09820, 0x26842f84, 0x85eeb3f7, - 0x267e3186, 0x85ecd01a, - 0x26783370, 0x85eaec88, 0x26723543, 0x85e90942, 0x266c36fe, 0x85e72647, - 0x266638a1, 0x85e54397, - 0x26603a2c, 0x85e36132, 0x265a3b9f, 0x85e17f19, 0x26543cfb, 0x85df9d4b, - 0x264e3e40, 0x85ddbbc9, - 0x26483f6c, 0x85dbda91, 0x26424082, 0x85d9f9a5, 0x263c417f, 0x85d81905, - 0x26364265, 0x85d638b0, - 0x26304333, 0x85d458a6, 0x262a43ea, 0x85d278e7, 0x26244489, 0x85d09974, - 0x261e4511, 0x85ceba4d, - 0x26184581, 0x85ccdb70, 0x261245da, 0x85cafcdf, 0x260c461b, 0x85c91e9a, - 0x26064645, 0x85c740a0, - 0x26004657, 0x85c562f1, 0x25fa4652, 0x85c3858d, 0x25f44635, 0x85c1a875, - 0x25ee4601, 0x85bfcba9, - 0x25e845b6, 0x85bdef28, 0x25e24553, 0x85bc12f2, 0x25dc44d9, 0x85ba3707, - 0x25d64447, 0x85b85b68, - 0x25d0439f, 0x85b68015, 0x25ca42de, 0x85b4a50d, 0x25c44207, 0x85b2ca50, - 0x25be4118, 0x85b0efdf, - 0x25b84012, 0x85af15b9, 0x25b23ef5, 0x85ad3bdf, 0x25ac3dc0, 0x85ab6250, - 0x25a63c74, 0x85a9890d, - 0x25a03b11, 0x85a7b015, 0x259a3997, 0x85a5d768, 0x25943806, 0x85a3ff07, - 0x258e365d, 0x85a226f2, - 0x2588349d, 0x85a04f28, 0x258232c6, 0x859e77a9, 0x257c30d8, 0x859ca076, - 0x25762ed3, 0x859ac98f, - 0x25702cb7, 0x8598f2f3, 0x256a2a83, 0x85971ca2, 0x25642839, 0x8595469d, - 0x255e25d7, 0x859370e4, - 0x2558235f, 0x85919b76, 0x255220cf, 0x858fc653, 0x254c1e28, 0x858df17c, - 0x25461b6b, 0x858c1cf1, - 0x25401896, 0x858a48b1, 0x253a15aa, 0x858874bd, 0x253412a8, 0x8586a114, - 0x252e0f8e, 0x8584cdb7, - 0x25280c5e, 0x8582faa5, 0x25220916, 0x858127df, 0x251c05b8, 0x857f5564, - 0x25160243, 0x857d8335, - 0x250ffeb7, 0x857bb152, 0x2509fb14, 0x8579dfba, 0x2503f75a, 0x85780e6e, - 0x24fdf389, 0x85763d6d, - 0x24f7efa2, 0x85746cb8, 0x24f1eba4, 0x85729c4e, 0x24ebe78f, 0x8570cc30, - 0x24e5e363, 0x856efc5e, - 0x24dfdf20, 0x856d2cd7, 0x24d9dac7, 0x856b5d9c, 0x24d3d657, 0x85698ead, - 0x24cdd1d0, 0x8567c009, - 0x24c7cd33, 0x8565f1b0, 0x24c1c87f, 0x856423a4, 0x24bbc3b4, 0x856255e3, - 0x24b5bed2, 0x8560886d, - 0x24afb9da, 0x855ebb44, 0x24a9b4cb, 0x855cee66, 0x24a3afa6, 0x855b21d3, - 0x249daa6a, 0x8559558c, - 0x2497a517, 0x85578991, 0x24919fae, 0x8555bde2, 0x248b9a2f, 0x8553f27e, - 0x24859498, 0x85522766, - 0x247f8eec, 0x85505c99, 0x24798928, 0x854e9219, 0x2473834f, 0x854cc7e3, - 0x246d7d5e, 0x854afdfa, - 0x24677758, 0x8549345c, 0x2461713a, 0x85476b0a, 0x245b6b07, 0x8545a204, - 0x245564bd, 0x8543d949, - 0x244f5e5c, 0x854210db, 0x244957e5, 0x854048b7, 0x24435158, 0x853e80e0, - 0x243d4ab4, 0x853cb954, - 0x243743fa, 0x853af214, 0x24313d2a, 0x85392b20, 0x242b3644, 0x85376477, - 0x24252f47, 0x85359e1a, - 0x241f2833, 0x8533d809, 0x2419210a, 0x85321244, 0x241319ca, 0x85304cca, - 0x240d1274, 0x852e879d, - 0x24070b08, 0x852cc2bb, 0x24010385, 0x852afe24, 0x23fafbec, 0x852939da, - 0x23f4f43e, 0x852775db, - 0x23eeec78, 0x8525b228, 0x23e8e49d, 0x8523eec1, 0x23e2dcac, 0x85222ba5, - 0x23dcd4a4, 0x852068d6, - 0x23d6cc87, 0x851ea652, 0x23d0c453, 0x851ce41a, 0x23cabc09, 0x851b222e, - 0x23c4b3a9, 0x8519608d, - 0x23beab33, 0x85179f39, 0x23b8a2a7, 0x8515de30, 0x23b29a05, 0x85141d73, - 0x23ac914d, 0x85125d02, - 0x23a6887f, 0x85109cdd, 0x23a07f9a, 0x850edd03, 0x239a76a0, 0x850d1d75, - 0x23946d90, 0x850b5e34, - 0x238e646a, 0x85099f3e, 0x23885b2e, 0x8507e094, 0x238251dd, 0x85062235, - 0x237c4875, 0x85046423, - 0x23763ef7, 0x8502a65c, 0x23703564, 0x8500e8e2, 0x236a2bba, 0x84ff2bb3, - 0x236421fb, 0x84fd6ed0, - 0x235e1826, 0x84fbb239, 0x23580e3b, 0x84f9f5ee, 0x2352043b, 0x84f839ee, - 0x234bfa24, 0x84f67e3b, - 0x2345eff8, 0x84f4c2d4, 0x233fe5b6, 0x84f307b8, 0x2339db5e, 0x84f14ce8, - 0x2333d0f1, 0x84ef9265, - 0x232dc66d, 0x84edd82d, 0x2327bbd5, 0x84ec1e41, 0x2321b126, 0x84ea64a1, - 0x231ba662, 0x84e8ab4d, - 0x23159b88, 0x84e6f244, 0x230f9098, 0x84e53988, 0x23098593, 0x84e38118, - 0x23037a78, 0x84e1c8f3, - 0x22fd6f48, 0x84e0111b, 0x22f76402, 0x84de598f, 0x22f158a7, 0x84dca24e, - 0x22eb4d36, 0x84daeb5a, - 0x22e541af, 0x84d934b1, 0x22df3613, 0x84d77e54, 0x22d92a61, 0x84d5c844, - 0x22d31e9a, 0x84d4127f, - 0x22cd12bd, 0x84d25d06, 0x22c706cb, 0x84d0a7da, 0x22c0fac4, 0x84cef2f9, - 0x22baeea7, 0x84cd3e64, - 0x22b4e274, 0x84cb8a1b, 0x22aed62c, 0x84c9d61f, 0x22a8c9cf, 0x84c8226e, - 0x22a2bd5d, 0x84c66f09, - 0x229cb0d5, 0x84c4bbf0, 0x2296a437, 0x84c30924, 0x22909785, 0x84c156a3, - 0x228a8abd, 0x84bfa46e, - 0x22847de0, 0x84bdf286, 0x227e70ed, 0x84bc40e9, 0x227863e5, 0x84ba8f98, - 0x227256c8, 0x84b8de94, - 0x226c4996, 0x84b72ddb, 0x22663c4e, 0x84b57d6f, 0x22602ef1, 0x84b3cd4f, - 0x225a217f, 0x84b21d7a, - 0x225413f8, 0x84b06df2, 0x224e065c, 0x84aebeb6, 0x2247f8aa, 0x84ad0fc6, - 0x2241eae3, 0x84ab6122, - 0x223bdd08, 0x84a9b2ca, 0x2235cf17, 0x84a804be, 0x222fc111, 0x84a656fe, - 0x2229b2f6, 0x84a4a98a, - 0x2223a4c5, 0x84a2fc62, 0x221d9680, 0x84a14f87, 0x22178826, 0x849fa2f7, - 0x221179b7, 0x849df6b4, - 0x220b6b32, 0x849c4abd, 0x22055c99, 0x849a9f12, 0x21ff4dea, 0x8498f3b3, - 0x21f93f27, 0x849748a0, - 0x21f3304f, 0x84959dd9, 0x21ed2162, 0x8493f35e, 0x21e71260, 0x84924930, - 0x21e10349, 0x84909f4e, - 0x21daf41d, 0x848ef5b7, 0x21d4e4dc, 0x848d4c6d, 0x21ced586, 0x848ba36f, - 0x21c8c61c, 0x8489fabe, - 0x21c2b69c, 0x84885258, 0x21bca708, 0x8486aa3e, 0x21b6975f, 0x84850271, - 0x21b087a1, 0x84835af0, - 0x21aa77cf, 0x8481b3bb, 0x21a467e7, 0x84800cd2, 0x219e57eb, 0x847e6636, - 0x219847da, 0x847cbfe5, - 0x219237b5, 0x847b19e1, 0x218c277a, 0x84797429, 0x2186172b, 0x8477cebd, - 0x218006c8, 0x8476299e, - 0x2179f64f, 0x847484ca, 0x2173e5c2, 0x8472e043, 0x216dd521, 0x84713c08, - 0x2167c46b, 0x846f9819, - 0x2161b3a0, 0x846df477, 0x215ba2c0, 0x846c5120, 0x215591cc, 0x846aae16, - 0x214f80c4, 0x84690b58, - 0x21496fa7, 0x846768e7, 0x21435e75, 0x8465c6c1, 0x213d4d2f, 0x846424e8, - 0x21373bd4, 0x8462835b, - 0x21312a65, 0x8460e21a, 0x212b18e1, 0x845f4126, 0x21250749, 0x845da07e, - 0x211ef59d, 0x845c0022, - 0x2118e3dc, 0x845a6012, 0x2112d206, 0x8458c04f, 0x210cc01d, 0x845720d8, - 0x2106ae1e, 0x845581ad, - 0x21009c0c, 0x8453e2cf, 0x20fa89e5, 0x8452443d, 0x20f477aa, 0x8450a5f7, - 0x20ee655a, 0x844f07fd, - 0x20e852f6, 0x844d6a50, 0x20e2407e, 0x844bccef, 0x20dc2df2, 0x844a2fda, - 0x20d61b51, 0x84489311, - 0x20d0089c, 0x8446f695, 0x20c9f5d3, 0x84455a66, 0x20c3e2f5, 0x8443be82, - 0x20bdd003, 0x844222eb, - 0x20b7bcfe, 0x844087a0, 0x20b1a9e4, 0x843eeca2, 0x20ab96b5, 0x843d51f0, - 0x20a58373, 0x843bb78a, - 0x209f701c, 0x843a1d70, 0x20995cb2, 0x843883a3, 0x20934933, 0x8436ea23, - 0x208d35a0, 0x843550ee, - 0x208721f9, 0x8433b806, 0x20810e3e, 0x84321f6b, 0x207afa6f, 0x8430871b, - 0x2074e68c, 0x842eef18, - 0x206ed295, 0x842d5762, 0x2068be8a, 0x842bbff8, 0x2062aa6b, 0x842a28da, - 0x205c9638, 0x84289209, - 0x205681f1, 0x8426fb84, 0x20506d96, 0x8425654b, 0x204a5927, 0x8423cf5f, - 0x204444a4, 0x842239bf, - 0x203e300d, 0x8420a46c, 0x20381b63, 0x841f0f65, 0x203206a4, 0x841d7aaa, - 0x202bf1d2, 0x841be63c, - 0x2025dcec, 0x841a521a, 0x201fc7f2, 0x8418be45, 0x2019b2e4, 0x84172abc, - 0x20139dc2, 0x84159780, - 0x200d888d, 0x84140490, 0x20077344, 0x841271ec, 0x20015de7, 0x8410df95, - 0x1ffb4876, 0x840f4d8a, - 0x1ff532f2, 0x840dbbcc, 0x1fef1d59, 0x840c2a5a, 0x1fe907ae, 0x840a9935, - 0x1fe2f1ee, 0x8409085c, - 0x1fdcdc1b, 0x840777d0, 0x1fd6c634, 0x8405e790, 0x1fd0b03a, 0x8404579d, - 0x1fca9a2b, 0x8402c7f6, - 0x1fc4840a, 0x8401389b, 0x1fbe6dd4, 0x83ffa98d, 0x1fb8578b, 0x83fe1acc, - 0x1fb2412f, 0x83fc8c57, - 0x1fac2abf, 0x83fafe2e, 0x1fa6143b, 0x83f97052, 0x1f9ffda4, 0x83f7e2c3, - 0x1f99e6fa, 0x83f65580, - 0x1f93d03c, 0x83f4c889, 0x1f8db96a, 0x83f33bdf, 0x1f87a285, 0x83f1af82, - 0x1f818b8d, 0x83f02371, - 0x1f7b7481, 0x83ee97ad, 0x1f755d61, 0x83ed0c35, 0x1f6f462f, 0x83eb810a, - 0x1f692ee9, 0x83e9f62b, - 0x1f63178f, 0x83e86b99, 0x1f5d0022, 0x83e6e153, 0x1f56e8a2, 0x83e5575a, - 0x1f50d10e, 0x83e3cdad, - 0x1f4ab968, 0x83e2444d, 0x1f44a1ad, 0x83e0bb3a, 0x1f3e89e0, 0x83df3273, - 0x1f3871ff, 0x83dda9f9, - 0x1f325a0b, 0x83dc21cb, 0x1f2c4204, 0x83da99ea, 0x1f2629ea, 0x83d91255, - 0x1f2011bc, 0x83d78b0d, - 0x1f19f97b, 0x83d60412, 0x1f13e127, 0x83d47d63, 0x1f0dc8c0, 0x83d2f701, - 0x1f07b045, 0x83d170eb, - 0x1f0197b8, 0x83cfeb22, 0x1efb7f17, 0x83ce65a6, 0x1ef56664, 0x83cce076, - 0x1eef4d9d, 0x83cb5b93, - 0x1ee934c3, 0x83c9d6fc, 0x1ee31bd6, 0x83c852b2, 0x1edd02d6, 0x83c6ceb5, - 0x1ed6e9c3, 0x83c54b04, - 0x1ed0d09d, 0x83c3c7a0, 0x1ecab763, 0x83c24488, 0x1ec49e17, 0x83c0c1be, - 0x1ebe84b8, 0x83bf3f3f, - 0x1eb86b46, 0x83bdbd0e, 0x1eb251c1, 0x83bc3b29, 0x1eac3829, 0x83bab991, - 0x1ea61e7e, 0x83b93845, - 0x1ea004c1, 0x83b7b746, 0x1e99eaf0, 0x83b63694, 0x1e93d10c, 0x83b4b62e, - 0x1e8db716, 0x83b33616, - 0x1e879d0d, 0x83b1b649, 0x1e8182f1, 0x83b036ca, 0x1e7b68c2, 0x83aeb797, - 0x1e754e80, 0x83ad38b1, - 0x1e6f342c, 0x83abba17, 0x1e6919c4, 0x83aa3bca, 0x1e62ff4a, 0x83a8bdca, - 0x1e5ce4be, 0x83a74017, - 0x1e56ca1e, 0x83a5c2b0, 0x1e50af6c, 0x83a44596, 0x1e4a94a7, 0x83a2c8c9, - 0x1e4479cf, 0x83a14c48, - 0x1e3e5ee5, 0x839fd014, 0x1e3843e8, 0x839e542d, 0x1e3228d9, 0x839cd893, - 0x1e2c0db6, 0x839b5d45, - 0x1e25f282, 0x8399e244, 0x1e1fd73a, 0x83986790, 0x1e19bbe0, 0x8396ed29, - 0x1e13a074, 0x8395730e, - 0x1e0d84f5, 0x8393f940, 0x1e076963, 0x83927fbf, 0x1e014dbf, 0x8391068a, - 0x1dfb3208, 0x838f8da2, - 0x1df5163f, 0x838e1507, 0x1deefa63, 0x838c9cb9, 0x1de8de75, 0x838b24b8, - 0x1de2c275, 0x8389ad03, - 0x1ddca662, 0x8388359b, 0x1dd68a3c, 0x8386be80, 0x1dd06e04, 0x838547b2, - 0x1dca51ba, 0x8383d130, - 0x1dc4355e, 0x83825afb, 0x1dbe18ef, 0x8380e513, 0x1db7fc6d, 0x837f6f78, - 0x1db1dfda, 0x837dfa2a, - 0x1dabc334, 0x837c8528, 0x1da5a67c, 0x837b1074, 0x1d9f89b1, 0x83799c0c, - 0x1d996cd4, 0x837827f0, - 0x1d934fe5, 0x8376b422, 0x1d8d32e4, 0x837540a1, 0x1d8715d0, 0x8373cd6c, - 0x1d80f8ab, 0x83725a84, - 0x1d7adb73, 0x8370e7e9, 0x1d74be29, 0x836f759b, 0x1d6ea0cc, 0x836e039a, - 0x1d68835e, 0x836c91e5, - 0x1d6265dd, 0x836b207d, 0x1d5c484b, 0x8369af63, 0x1d562aa6, 0x83683e95, - 0x1d500cef, 0x8366ce14, - 0x1d49ef26, 0x83655ddf, 0x1d43d14b, 0x8363edf8, 0x1d3db35e, 0x83627e5d, - 0x1d37955e, 0x83610f10, - 0x1d31774d, 0x835fa00f, 0x1d2b592a, 0x835e315b, 0x1d253af5, 0x835cc2f4, - 0x1d1f1cae, 0x835b54da, - 0x1d18fe54, 0x8359e70d, 0x1d12dfe9, 0x8358798c, 0x1d0cc16c, 0x83570c59, - 0x1d06a2dd, 0x83559f72, - 0x1d00843d, 0x835432d8, 0x1cfa658a, 0x8352c68c, 0x1cf446c5, 0x83515a8c, - 0x1cee27ef, 0x834feed9, - 0x1ce80906, 0x834e8373, 0x1ce1ea0c, 0x834d185a, 0x1cdbcb00, 0x834bad8e, - 0x1cd5abe3, 0x834a430e, - 0x1ccf8cb3, 0x8348d8dc, 0x1cc96d72, 0x83476ef6, 0x1cc34e1f, 0x8346055e, - 0x1cbd2eba, 0x83449c12, - 0x1cb70f43, 0x83433314, 0x1cb0efbb, 0x8341ca62, 0x1caad021, 0x834061fd, - 0x1ca4b075, 0x833ef9e6, - 0x1c9e90b8, 0x833d921b, 0x1c9870e9, 0x833c2a9d, 0x1c925109, 0x833ac36c, - 0x1c8c3116, 0x83395c88, - 0x1c861113, 0x8337f5f1, 0x1c7ff0fd, 0x83368fa7, 0x1c79d0d6, 0x833529aa, - 0x1c73b09d, 0x8333c3fa, - 0x1c6d9053, 0x83325e97, 0x1c676ff8, 0x8330f981, 0x1c614f8b, 0x832f94b8, - 0x1c5b2f0c, 0x832e303c, - 0x1c550e7c, 0x832ccc0d, 0x1c4eedda, 0x832b682b, 0x1c48cd27, 0x832a0496, - 0x1c42ac62, 0x8328a14d, - 0x1c3c8b8c, 0x83273e52, 0x1c366aa5, 0x8325dba4, 0x1c3049ac, 0x83247943, - 0x1c2a28a2, 0x8323172f, - 0x1c240786, 0x8321b568, 0x1c1de659, 0x832053ee, 0x1c17c51b, 0x831ef2c1, - 0x1c11a3cb, 0x831d91e1, - 0x1c0b826a, 0x831c314e, 0x1c0560f8, 0x831ad109, 0x1bff3f75, 0x83197110, - 0x1bf91de0, 0x83181164, - 0x1bf2fc3a, 0x8316b205, 0x1becda83, 0x831552f4, 0x1be6b8ba, 0x8313f42f, - 0x1be096e0, 0x831295b7, - 0x1bda74f6, 0x8311378d, 0x1bd452f9, 0x830fd9af, 0x1bce30ec, 0x830e7c1f, - 0x1bc80ece, 0x830d1edc, - 0x1bc1ec9e, 0x830bc1e6, 0x1bbbca5e, 0x830a653c, 0x1bb5a80c, 0x830908e0, - 0x1baf85a9, 0x8307acd1, - 0x1ba96335, 0x83065110, 0x1ba340b0, 0x8304f59b, 0x1b9d1e1a, 0x83039a73, - 0x1b96fb73, 0x83023f98, - 0x1b90d8bb, 0x8300e50b, 0x1b8ab5f2, 0x82ff8acb, 0x1b849317, 0x82fe30d7, - 0x1b7e702c, 0x82fcd731, - 0x1b784d30, 0x82fb7dd8, 0x1b722a23, 0x82fa24cc, 0x1b6c0705, 0x82f8cc0d, - 0x1b65e3d7, 0x82f7739c, - 0x1b5fc097, 0x82f61b77, 0x1b599d46, 0x82f4c3a0, 0x1b5379e5, 0x82f36c15, - 0x1b4d5672, 0x82f214d8, - 0x1b4732ef, 0x82f0bde8, 0x1b410f5b, 0x82ef6745, 0x1b3aebb6, 0x82ee10ef, - 0x1b34c801, 0x82ecbae7, - 0x1b2ea43a, 0x82eb652b, 0x1b288063, 0x82ea0fbd, 0x1b225c7b, 0x82e8ba9c, - 0x1b1c3883, 0x82e765c8, - 0x1b161479, 0x82e61141, 0x1b0ff05f, 0x82e4bd07, 0x1b09cc34, 0x82e3691b, - 0x1b03a7f9, 0x82e2157c, - 0x1afd83ad, 0x82e0c22a, 0x1af75f50, 0x82df6f25, 0x1af13ae3, 0x82de1c6d, - 0x1aeb1665, 0x82dcca02, - 0x1ae4f1d6, 0x82db77e5, 0x1adecd37, 0x82da2615, 0x1ad8a887, 0x82d8d492, - 0x1ad283c7, 0x82d7835c, - 0x1acc5ef6, 0x82d63274, 0x1ac63a14, 0x82d4e1d8, 0x1ac01522, 0x82d3918a, - 0x1ab9f020, 0x82d24189, - 0x1ab3cb0d, 0x82d0f1d5, 0x1aada5e9, 0x82cfa26f, 0x1aa780b6, 0x82ce5356, - 0x1aa15b71, 0x82cd048a, - 0x1a9b361d, 0x82cbb60b, 0x1a9510b7, 0x82ca67d9, 0x1a8eeb42, 0x82c919f5, - 0x1a88c5bc, 0x82c7cc5e, - 0x1a82a026, 0x82c67f14, 0x1a7c7a7f, 0x82c53217, 0x1a7654c8, 0x82c3e568, - 0x1a702f01, 0x82c29906, - 0x1a6a0929, 0x82c14cf1, 0x1a63e341, 0x82c00129, 0x1a5dbd49, 0x82beb5af, - 0x1a579741, 0x82bd6a82, - 0x1a517128, 0x82bc1fa2, 0x1a4b4aff, 0x82bad50f, 0x1a4524c6, 0x82b98aca, - 0x1a3efe7c, 0x82b840d2, - 0x1a38d823, 0x82b6f727, 0x1a32b1b9, 0x82b5adca, 0x1a2c8b3f, 0x82b464ba, - 0x1a2664b5, 0x82b31bf7, - 0x1a203e1b, 0x82b1d381, 0x1a1a1771, 0x82b08b59, 0x1a13f0b6, 0x82af437e, - 0x1a0dc9ec, 0x82adfbf0, - 0x1a07a311, 0x82acb4b0, 0x1a017c27, 0x82ab6dbd, 0x19fb552c, 0x82aa2717, - 0x19f52e22, 0x82a8e0bf, - 0x19ef0707, 0x82a79ab3, 0x19e8dfdc, 0x82a654f6, 0x19e2b8a2, 0x82a50f85, - 0x19dc9157, 0x82a3ca62, - 0x19d669fc, 0x82a2858c, 0x19d04292, 0x82a14104, 0x19ca1b17, 0x829ffcc8, - 0x19c3f38d, 0x829eb8db, - 0x19bdcbf3, 0x829d753a, 0x19b7a449, 0x829c31e7, 0x19b17c8f, 0x829aeee1, - 0x19ab54c5, 0x8299ac29, - 0x19a52ceb, 0x829869be, 0x199f0502, 0x829727a0, 0x1998dd09, 0x8295e5cf, - 0x1992b4ff, 0x8294a44c, - 0x198c8ce7, 0x82936317, 0x198664be, 0x8292222e, 0x19803c86, 0x8290e194, - 0x197a143e, 0x828fa146, - 0x1973ebe6, 0x828e6146, 0x196dc37e, 0x828d2193, 0x19679b07, 0x828be22e, - 0x19617280, 0x828aa316, - 0x195b49ea, 0x8289644b, 0x19552144, 0x828825ce, 0x194ef88e, 0x8286e79e, - 0x1948cfc8, 0x8285a9bb, - 0x1942a6f3, 0x82846c26, 0x193c7e0f, 0x82832edf, 0x1936551b, 0x8281f1e4, - 0x19302c17, 0x8280b538, - 0x192a0304, 0x827f78d8, 0x1923d9e1, 0x827e3cc6, 0x191db0af, 0x827d0102, - 0x1917876d, 0x827bc58a, - 0x19115e1c, 0x827a8a61, 0x190b34bb, 0x82794f84, 0x19050b4b, 0x827814f6, - 0x18fee1cb, 0x8276dab4, - 0x18f8b83c, 0x8275a0c0, 0x18f28e9e, 0x8274671a, 0x18ec64f0, 0x82732dc0, - 0x18e63b33, 0x8271f4b5, - 0x18e01167, 0x8270bbf7, 0x18d9e78b, 0x826f8386, 0x18d3bda0, 0x826e4b62, - 0x18cd93a5, 0x826d138d, - 0x18c7699b, 0x826bdc04, 0x18c13f82, 0x826aa4c9, 0x18bb155a, 0x82696ddc, - 0x18b4eb22, 0x8268373c, - 0x18aec0db, 0x826700e9, 0x18a89685, 0x8265cae4, 0x18a26c20, 0x8264952d, - 0x189c41ab, 0x82635fc2, - 0x18961728, 0x82622aa6, 0x188fec95, 0x8260f5d7, 0x1889c1f3, 0x825fc155, - 0x18839742, 0x825e8d21, - 0x187d6c82, 0x825d593a, 0x187741b2, 0x825c25a1, 0x187116d4, 0x825af255, - 0x186aebe6, 0x8259bf57, - 0x1864c0ea, 0x82588ca7, 0x185e95de, 0x82575a44, 0x18586ac3, 0x8256282e, - 0x18523f9a, 0x8254f666, - 0x184c1461, 0x8253c4eb, 0x1845e919, 0x825293be, 0x183fbdc3, 0x825162df, - 0x1839925d, 0x8250324d, - 0x183366e9, 0x824f0208, 0x182d3b65, 0x824dd211, 0x18270fd3, 0x824ca268, - 0x1820e431, 0x824b730c, - 0x181ab881, 0x824a43fe, 0x18148cc2, 0x8249153d, 0x180e60f4, 0x8247e6ca, - 0x18083518, 0x8246b8a4, - 0x1802092c, 0x82458acc, 0x17fbdd32, 0x82445d41, 0x17f5b129, 0x82433004, - 0x17ef8511, 0x82420315, - 0x17e958ea, 0x8240d673, 0x17e32cb5, 0x823faa1e, 0x17dd0070, 0x823e7e18, - 0x17d6d41d, 0x823d525e, - 0x17d0a7bc, 0x823c26f3, 0x17ca7b4c, 0x823afbd5, 0x17c44ecd, 0x8239d104, - 0x17be223f, 0x8238a681, - 0x17b7f5a3, 0x82377c4c, 0x17b1c8f8, 0x82365264, 0x17ab9c3e, 0x823528ca, - 0x17a56f76, 0x8233ff7e, - 0x179f429f, 0x8232d67f, 0x179915ba, 0x8231adce, 0x1792e8c6, 0x8230856a, - 0x178cbbc4, 0x822f5d54, - 0x17868eb3, 0x822e358b, 0x17806194, 0x822d0e10, 0x177a3466, 0x822be6e3, - 0x17740729, 0x822ac004, - 0x176dd9de, 0x82299971, 0x1767ac85, 0x8228732d, 0x17617f1d, 0x82274d36, - 0x175b51a7, 0x8226278d, - 0x17552422, 0x82250232, 0x174ef68f, 0x8223dd24, 0x1748c8ee, 0x8222b863, - 0x17429b3e, 0x822193f1, - 0x173c6d80, 0x82206fcc, 0x17363fb4, 0x821f4bf5, 0x173011d9, 0x821e286b, - 0x1729e3f0, 0x821d052f, - 0x1723b5f9, 0x821be240, 0x171d87f3, 0x821abfa0, 0x171759df, 0x82199d4d, - 0x17112bbd, 0x82187b47, - 0x170afd8d, 0x82175990, 0x1704cf4f, 0x82163826, 0x16fea102, 0x82151709, - 0x16f872a7, 0x8213f63a, - 0x16f2443e, 0x8212d5b9, 0x16ec15c7, 0x8211b586, 0x16e5e741, 0x821095a0, - 0x16dfb8ae, 0x820f7608, - 0x16d98a0c, 0x820e56be, 0x16d35b5c, 0x820d37c1, 0x16cd2c9f, 0x820c1912, - 0x16c6fdd3, 0x820afab1, - 0x16c0cef9, 0x8209dc9e, 0x16baa011, 0x8208bed8, 0x16b4711b, 0x8207a160, - 0x16ae4217, 0x82068435, - 0x16a81305, 0x82056758, 0x16a1e3e5, 0x82044ac9, 0x169bb4b7, 0x82032e88, - 0x1695857b, 0x82021294, - 0x168f5632, 0x8200f6ef, 0x168926da, 0x81ffdb96, 0x1682f774, 0x81fec08c, - 0x167cc801, 0x81fda5cf, - 0x1676987f, 0x81fc8b60, 0x167068f0, 0x81fb713f, 0x166a3953, 0x81fa576c, - 0x166409a8, 0x81f93de6, - 0x165dd9f0, 0x81f824ae, 0x1657aa29, 0x81f70bc3, 0x16517a55, 0x81f5f327, - 0x164b4a73, 0x81f4dad8, - 0x16451a83, 0x81f3c2d7, 0x163eea86, 0x81f2ab24, 0x1638ba7a, 0x81f193be, - 0x16328a61, 0x81f07ca6, - 0x162c5a3b, 0x81ef65dc, 0x16262a06, 0x81ee4f60, 0x161ff9c4, 0x81ed3932, - 0x1619c975, 0x81ec2351, - 0x16139918, 0x81eb0dbe, 0x160d68ad, 0x81e9f879, 0x16073834, 0x81e8e381, - 0x160107ae, 0x81e7ced8, - 0x15fad71b, 0x81e6ba7c, 0x15f4a679, 0x81e5a66e, 0x15ee75cb, 0x81e492ad, - 0x15e8450e, 0x81e37f3b, - 0x15e21445, 0x81e26c16, 0x15dbe36d, 0x81e1593f, 0x15d5b288, 0x81e046b6, - 0x15cf8196, 0x81df347b, - 0x15c95097, 0x81de228d, 0x15c31f89, 0x81dd10ee, 0x15bcee6f, 0x81dbff9c, - 0x15b6bd47, 0x81daee98, - 0x15b08c12, 0x81d9dde1, 0x15aa5acf, 0x81d8cd79, 0x15a4297f, 0x81d7bd5e, - 0x159df821, 0x81d6ad92, - 0x1597c6b7, 0x81d59e13, 0x1591953e, 0x81d48ee1, 0x158b63b9, 0x81d37ffe, - 0x15853226, 0x81d27169, - 0x157f0086, 0x81d16321, 0x1578ced9, 0x81d05527, 0x15729d1f, 0x81cf477b, - 0x156c6b57, 0x81ce3a1d, - 0x15663982, 0x81cd2d0c, 0x156007a0, 0x81cc204a, 0x1559d5b1, 0x81cb13d5, - 0x1553a3b4, 0x81ca07af, - 0x154d71aa, 0x81c8fbd6, 0x15473f94, 0x81c7f04b, 0x15410d70, 0x81c6e50d, - 0x153adb3f, 0x81c5da1e, - 0x1534a901, 0x81c4cf7d, 0x152e76b5, 0x81c3c529, 0x1528445d, 0x81c2bb23, - 0x152211f8, 0x81c1b16b, - 0x151bdf86, 0x81c0a801, 0x1515ad06, 0x81bf9ee5, 0x150f7a7a, 0x81be9617, - 0x150947e1, 0x81bd8d97, - 0x1503153a, 0x81bc8564, 0x14fce287, 0x81bb7d7f, 0x14f6afc7, 0x81ba75e9, - 0x14f07cf9, 0x81b96ea0, - 0x14ea4a1f, 0x81b867a5, 0x14e41738, 0x81b760f8, 0x14dde445, 0x81b65a99, - 0x14d7b144, 0x81b55488, - 0x14d17e36, 0x81b44ec4, 0x14cb4b1c, 0x81b3494f, 0x14c517f4, 0x81b24427, - 0x14bee4c0, 0x81b13f4e, - 0x14b8b17f, 0x81b03ac2, 0x14b27e32, 0x81af3684, 0x14ac4ad7, 0x81ae3294, - 0x14a61770, 0x81ad2ef2, - 0x149fe3fc, 0x81ac2b9e, 0x1499b07c, 0x81ab2898, 0x14937cee, 0x81aa25e0, - 0x148d4954, 0x81a92376, - 0x148715ae, 0x81a82159, 0x1480e1fa, 0x81a71f8b, 0x147aae3a, 0x81a61e0b, - 0x14747a6d, 0x81a51cd8, - 0x146e4694, 0x81a41bf4, 0x146812ae, 0x81a31b5d, 0x1461debc, 0x81a21b14, - 0x145baabd, 0x81a11b1a, - 0x145576b1, 0x81a01b6d, 0x144f4299, 0x819f1c0e, 0x14490e74, 0x819e1cfd, - 0x1442da43, 0x819d1e3a, - 0x143ca605, 0x819c1fc5, 0x143671bb, 0x819b219e, 0x14303d65, 0x819a23c5, - 0x142a0902, 0x8199263a, - 0x1423d492, 0x819828fd, 0x141da016, 0x81972c0e, 0x14176b8e, 0x81962f6d, - 0x141136f9, 0x8195331a, - 0x140b0258, 0x81943715, 0x1404cdaa, 0x81933b5e, 0x13fe98f1, 0x81923ff4, - 0x13f8642a, 0x819144d9, - 0x13f22f58, 0x81904a0c, 0x13ebfa79, 0x818f4f8d, 0x13e5c58e, 0x818e555c, - 0x13df9097, 0x818d5b78, - 0x13d95b93, 0x818c61e3, 0x13d32683, 0x818b689c, 0x13ccf167, 0x818a6fa3, - 0x13c6bc3f, 0x818976f8, - 0x13c0870a, 0x81887e9a, 0x13ba51ca, 0x8187868b, 0x13b41c7d, 0x81868eca, - 0x13ade724, 0x81859757, - 0x13a7b1bf, 0x8184a032, 0x13a17c4d, 0x8183a95b, 0x139b46d0, 0x8182b2d1, - 0x13951146, 0x8181bc96, - 0x138edbb1, 0x8180c6a9, 0x1388a60f, 0x817fd10a, 0x13827062, 0x817edbb9, - 0x137c3aa8, 0x817de6b6, - 0x137604e2, 0x817cf201, 0x136fcf10, 0x817bfd9b, 0x13699933, 0x817b0982, - 0x13636349, 0x817a15b7, - 0x135d2d53, 0x8179223a, 0x1356f752, 0x81782f0b, 0x1350c144, 0x81773c2b, - 0x134a8b2b, 0x81764998, - 0x13445505, 0x81755754, 0x133e1ed4, 0x8174655d, 0x1337e897, 0x817373b5, - 0x1331b24e, 0x8172825a, - 0x132b7bf9, 0x8171914e, 0x13254599, 0x8170a090, 0x131f0f2c, 0x816fb020, - 0x1318d8b4, 0x816ebffe, - 0x1312a230, 0x816dd02a, 0x130c6ba0, 0x816ce0a4, 0x13063505, 0x816bf16c, - 0x12fffe5d, 0x816b0282, - 0x12f9c7aa, 0x816a13e6, 0x12f390ec, 0x81692599, 0x12ed5a21, 0x81683799, - 0x12e7234b, 0x816749e8, - 0x12e0ec6a, 0x81665c84, 0x12dab57c, 0x81656f6f, 0x12d47e83, 0x816482a8, - 0x12ce477f, 0x8163962f, - 0x12c8106f, 0x8162aa04, 0x12c1d953, 0x8161be27, 0x12bba22b, 0x8160d298, - 0x12b56af9, 0x815fe758, - 0x12af33ba, 0x815efc65, 0x12a8fc70, 0x815e11c1, 0x12a2c51b, 0x815d276a, - 0x129c8dba, 0x815c3d62, - 0x1296564d, 0x815b53a8, 0x12901ed5, 0x815a6a3c, 0x1289e752, 0x8159811e, - 0x1283afc3, 0x8158984e, - 0x127d7829, 0x8157afcd, 0x12774083, 0x8156c799, 0x127108d2, 0x8155dfb4, - 0x126ad116, 0x8154f81d, - 0x1264994e, 0x815410d4, 0x125e617b, 0x815329d9, 0x1258299c, 0x8152432c, - 0x1251f1b3, 0x81515ccd, - 0x124bb9be, 0x815076bd, 0x124581bd, 0x814f90fb, 0x123f49b2, 0x814eab86, - 0x1239119b, 0x814dc660, - 0x1232d979, 0x814ce188, 0x122ca14b, 0x814bfcff, 0x12266913, 0x814b18c3, - 0x122030cf, 0x814a34d6, - 0x1219f880, 0x81495136, 0x1213c026, 0x81486de5, 0x120d87c1, 0x81478ae2, - 0x12074f50, 0x8146a82e, - 0x120116d5, 0x8145c5c7, 0x11fade4e, 0x8144e3ae, 0x11f4a5bd, 0x814401e4, - 0x11ee6d20, 0x81432068, - 0x11e83478, 0x81423f3a, 0x11e1fbc5, 0x81415e5a, 0x11dbc307, 0x81407dc9, - 0x11d58a3e, 0x813f9d86, - 0x11cf516a, 0x813ebd90, 0x11c9188b, 0x813ddde9, 0x11c2dfa2, 0x813cfe91, - 0x11bca6ad, 0x813c1f86, - 0x11b66dad, 0x813b40ca, 0x11b034a2, 0x813a625b, 0x11a9fb8d, 0x8139843b, - 0x11a3c26c, 0x8138a66a, - 0x119d8941, 0x8137c8e6, 0x1197500a, 0x8136ebb1, 0x119116c9, 0x81360ec9, - 0x118add7d, 0x81353230, - 0x1184a427, 0x813455e6, 0x117e6ac5, 0x813379e9, 0x11783159, 0x81329e3b, - 0x1171f7e2, 0x8131c2db, - 0x116bbe60, 0x8130e7c9, 0x116584d3, 0x81300d05, 0x115f4b3c, 0x812f3290, - 0x1159119a, 0x812e5868, - 0x1152d7ed, 0x812d7e8f, 0x114c9e35, 0x812ca505, 0x11466473, 0x812bcbc8, - 0x11402aa6, 0x812af2da, - 0x1139f0cf, 0x812a1a3a, 0x1133b6ed, 0x812941e8, 0x112d7d00, 0x812869e4, - 0x11274309, 0x8127922f, - 0x11210907, 0x8126bac8, 0x111acefb, 0x8125e3af, 0x111494e4, 0x81250ce4, - 0x110e5ac2, 0x81243668, - 0x11082096, 0x8123603a, 0x1101e65f, 0x81228a5a, 0x10fbac1e, 0x8121b4c8, - 0x10f571d3, 0x8120df85, - 0x10ef377d, 0x81200a90, 0x10e8fd1c, 0x811f35e9, 0x10e2c2b2, 0x811e6191, - 0x10dc883c, 0x811d8d86, - 0x10d64dbd, 0x811cb9ca, 0x10d01333, 0x811be65d, 0x10c9d89e, 0x811b133d, - 0x10c39dff, 0x811a406c, - 0x10bd6356, 0x81196de9, 0x10b728a3, 0x81189bb4, 0x10b0ede5, 0x8117c9ce, - 0x10aab31d, 0x8116f836, - 0x10a4784b, 0x811626ec, 0x109e3d6e, 0x811555f1, 0x10980287, 0x81148544, - 0x1091c796, 0x8113b4e5, - 0x108b8c9b, 0x8112e4d4, 0x10855195, 0x81121512, 0x107f1686, 0x8111459e, - 0x1078db6c, 0x81107678, - 0x1072a048, 0x810fa7a0, 0x106c651a, 0x810ed917, 0x106629e1, 0x810e0adc, - 0x105fee9f, 0x810d3cf0, - 0x1059b352, 0x810c6f52, 0x105377fc, 0x810ba202, 0x104d3c9b, 0x810ad500, - 0x10470130, 0x810a084d, - 0x1040c5bb, 0x81093be8, 0x103a8a3d, 0x81086fd1, 0x10344eb4, 0x8107a409, - 0x102e1321, 0x8106d88f, - 0x1027d784, 0x81060d63, 0x10219bdd, 0x81054286, 0x101b602d, 0x810477f7, - 0x10152472, 0x8103adb6, - 0x100ee8ad, 0x8102e3c4, 0x1008acdf, 0x81021a20, 0x10027107, 0x810150ca, - 0xffc3524, 0x810087c3, - 0xff5f938, 0x80ffbf0a, 0xfefbd42, 0x80fef69f, 0xfe98143, 0x80fe2e83, - 0xfe34539, 0x80fd66b5, - 0xfdd0926, 0x80fc9f35, 0xfd6cd08, 0x80fbd804, 0xfd090e1, 0x80fb1121, - 0xfca54b1, 0x80fa4a8c, - 0xfc41876, 0x80f98446, 0xfbddc32, 0x80f8be4e, 0xfb79fe4, 0x80f7f8a4, - 0xfb1638d, 0x80f73349, - 0xfab272b, 0x80f66e3c, 0xfa4eac0, 0x80f5a97e, 0xf9eae4c, 0x80f4e50e, - 0xf9871ce, 0x80f420ec, - 0xf923546, 0x80f35d19, 0xf8bf8b4, 0x80f29994, 0xf85bc19, 0x80f1d65d, - 0xf7f7f75, 0x80f11375, - 0xf7942c7, 0x80f050db, 0xf73060f, 0x80ef8e90, 0xf6cc94e, 0x80eecc93, - 0xf668c83, 0x80ee0ae4, - 0xf604faf, 0x80ed4984, 0xf5a12d1, 0x80ec8872, 0xf53d5ea, 0x80ebc7ae, - 0xf4d98f9, 0x80eb0739, - 0xf475bff, 0x80ea4712, 0xf411efb, 0x80e9873a, 0xf3ae1ee, 0x80e8c7b0, - 0xf34a4d8, 0x80e80874, - 0xf2e67b8, 0x80e74987, 0xf282a8f, 0x80e68ae8, 0xf21ed5d, 0x80e5cc98, - 0xf1bb021, 0x80e50e96, - 0xf1572dc, 0x80e450e2, 0xf0f358e, 0x80e3937d, 0xf08f836, 0x80e2d666, - 0xf02bad5, 0x80e2199e, - 0xefc7d6b, 0x80e15d24, 0xef63ff7, 0x80e0a0f8, 0xef0027b, 0x80dfe51b, - 0xee9c4f5, 0x80df298c, - 0xee38766, 0x80de6e4c, 0xedd49ce, 0x80ddb35a, 0xed70c2c, 0x80dcf8b7, - 0xed0ce82, 0x80dc3e62, - 0xeca90ce, 0x80db845b, 0xec45311, 0x80dacaa3, 0xebe154b, 0x80da1139, - 0xeb7d77c, 0x80d9581e, - 0xeb199a4, 0x80d89f51, 0xeab5bc3, 0x80d7e6d3, 0xea51dd8, 0x80d72ea3, - 0xe9edfe5, 0x80d676c1, - 0xe98a1e9, 0x80d5bf2e, 0xe9263e3, 0x80d507e9, 0xe8c25d5, 0x80d450f3, - 0xe85e7be, 0x80d39a4b, - 0xe7fa99e, 0x80d2e3f2, 0xe796b74, 0x80d22de7, 0xe732d42, 0x80d1782a, - 0xe6cef07, 0x80d0c2bc, - 0xe66b0c3, 0x80d00d9d, 0xe607277, 0x80cf58cc, 0xe5a3421, 0x80cea449, - 0xe53f5c2, 0x80cdf015, - 0xe4db75b, 0x80cd3c2f, 0xe4778eb, 0x80cc8898, 0xe413a72, 0x80cbd54f, - 0xe3afbf0, 0x80cb2255, - 0xe34bd66, 0x80ca6fa9, 0xe2e7ed2, 0x80c9bd4c, 0xe284036, 0x80c90b3d, - 0xe220191, 0x80c8597c, - 0xe1bc2e4, 0x80c7a80a, 0xe15842e, 0x80c6f6e7, 0xe0f456f, 0x80c64612, - 0xe0906a7, 0x80c5958b, - 0xe02c7d7, 0x80c4e553, 0xdfc88fe, 0x80c4356a, 0xdf64a1c, 0x80c385cf, - 0xdf00b32, 0x80c2d682, - 0xde9cc40, 0x80c22784, 0xde38d44, 0x80c178d4, 0xddd4e40, 0x80c0ca73, - 0xdd70f34, 0x80c01c60, - 0xdd0d01f, 0x80bf6e9c, 0xdca9102, 0x80bec127, 0xdc451dc, 0x80be13ff, - 0xdbe12ad, 0x80bd6727, - 0xdb7d376, 0x80bcba9d, 0xdb19437, 0x80bc0e61, 0xdab54ef, 0x80bb6274, - 0xda5159f, 0x80bab6d5, - 0xd9ed646, 0x80ba0b85, 0xd9896e5, 0x80b96083, 0xd92577b, 0x80b8b5d0, - 0xd8c1809, 0x80b80b6c, - 0xd85d88f, 0x80b76156, 0xd7f990c, 0x80b6b78e, 0xd795982, 0x80b60e15, - 0xd7319ee, 0x80b564ea, - 0xd6cda53, 0x80b4bc0e, 0xd669aaf, 0x80b41381, 0xd605b03, 0x80b36b42, - 0xd5a1b4f, 0x80b2c351, - 0xd53db92, 0x80b21baf, 0xd4d9bcd, 0x80b1745c, 0xd475c00, 0x80b0cd57, - 0xd411c2b, 0x80b026a1, - 0xd3adc4e, 0x80af8039, 0xd349c68, 0x80aeda20, 0xd2e5c7b, 0x80ae3455, - 0xd281c85, 0x80ad8ed9, - 0xd21dc87, 0x80ace9ab, 0xd1b9c81, 0x80ac44cc, 0xd155c73, 0x80aba03b, - 0xd0f1c5d, 0x80aafbf9, - 0xd08dc3f, 0x80aa5806, 0xd029c18, 0x80a9b461, 0xcfc5bea, 0x80a9110b, - 0xcf61bb4, 0x80a86e03, - 0xcefdb76, 0x80a7cb49, 0xce99b2f, 0x80a728df, 0xce35ae1, 0x80a686c2, - 0xcdd1a8b, 0x80a5e4f5, - 0xcd6da2d, 0x80a54376, 0xcd099c7, 0x80a4a245, 0xcca5959, 0x80a40163, - 0xcc418e3, 0x80a360d0, - 0xcbdd865, 0x80a2c08b, 0xcb797e0, 0x80a22095, 0xcb15752, 0x80a180ed, - 0xcab16bd, 0x80a0e194, - 0xca4d620, 0x80a04289, 0xc9e957b, 0x809fa3cd, 0xc9854cf, 0x809f0560, - 0xc92141a, 0x809e6741, - 0xc8bd35e, 0x809dc971, 0xc85929a, 0x809d2bef, 0xc7f51cf, 0x809c8ebc, - 0xc7910fb, 0x809bf1d7, - 0xc72d020, 0x809b5541, 0xc6c8f3e, 0x809ab8fa, 0xc664e53, 0x809a1d01, - 0xc600d61, 0x80998157, - 0xc59cc68, 0x8098e5fb, 0xc538b66, 0x80984aee, 0xc4d4a5d, 0x8097b030, - 0xc47094d, 0x809715c0, - 0xc40c835, 0x80967b9f, 0xc3a8715, 0x8095e1cc, 0xc3445ee, 0x80954848, - 0xc2e04c0, 0x8094af13, - 0xc27c389, 0x8094162c, 0xc21824c, 0x80937d93, 0xc1b4107, 0x8092e54a, - 0xc14ffba, 0x80924d4f, - 0xc0ebe66, 0x8091b5a2, 0xc087d0a, 0x80911e44, 0xc023ba7, 0x80908735, - 0xbfbfa3d, 0x808ff074, - 0xbf5b8cb, 0x808f5a02, 0xbef7752, 0x808ec3df, 0xbe935d2, 0x808e2e0a, - 0xbe2f44a, 0x808d9884, - 0xbdcb2bb, 0x808d034c, 0xbd67124, 0x808c6e63, 0xbd02f87, 0x808bd9c9, - 0xbc9ede2, 0x808b457d, - 0xbc3ac35, 0x808ab180, 0xbbd6a82, 0x808a1dd2, 0xbb728c7, 0x80898a72, - 0xbb0e705, 0x8088f761, - 0xbaaa53b, 0x8088649e, 0xba4636b, 0x8087d22a, 0xb9e2193, 0x80874005, - 0xb97dfb5, 0x8086ae2e, - 0xb919dcf, 0x80861ca6, 0xb8b5be1, 0x80858b6c, 0xb8519ed, 0x8084fa82, - 0xb7ed7f2, 0x808469e5, - 0xb7895f0, 0x8083d998, 0xb7253e6, 0x80834999, 0xb6c11d5, 0x8082b9e9, - 0xb65cfbe, 0x80822a87, - 0xb5f8d9f, 0x80819b74, 0xb594b7a, 0x80810cb0, 0xb53094d, 0x80807e3a, - 0xb4cc719, 0x807ff013, - 0xb4684df, 0x807f623b, 0xb40429d, 0x807ed4b1, 0xb3a0055, 0x807e4776, - 0xb33be05, 0x807dba89, - 0xb2d7baf, 0x807d2dec, 0xb273952, 0x807ca19c, 0xb20f6ee, 0x807c159c, - 0xb1ab483, 0x807b89ea, - 0xb147211, 0x807afe87, 0xb0e2f98, 0x807a7373, 0xb07ed19, 0x8079e8ad, - 0xb01aa92, 0x80795e36, - 0xafb6805, 0x8078d40d, 0xaf52571, 0x80784a33, 0xaeee2d7, 0x8077c0a8, - 0xae8a036, 0x8077376c, - 0xae25d8d, 0x8076ae7e, 0xadc1adf, 0x807625df, 0xad5d829, 0x80759d8e, - 0xacf956d, 0x8075158c, - 0xac952aa, 0x80748dd9, 0xac30fe1, 0x80740675, 0xabccd11, 0x80737f5f, - 0xab68a3a, 0x8072f898, - 0xab0475c, 0x8072721f, 0xaaa0478, 0x8071ebf6, 0xaa3c18e, 0x8071661a, - 0xa9d7e9d, 0x8070e08e, - 0xa973ba5, 0x80705b50, 0xa90f8a7, 0x806fd661, 0xa8ab5a2, 0x806f51c1, - 0xa847297, 0x806ecd6f, - 0xa7e2f85, 0x806e496c, 0xa77ec6d, 0x806dc5b8, 0xa71a94f, 0x806d4253, - 0xa6b662a, 0x806cbf3c, - 0xa6522fe, 0x806c3c74, 0xa5edfcc, 0x806bb9fa, 0xa589c94, 0x806b37cf, - 0xa525955, 0x806ab5f3, - 0xa4c1610, 0x806a3466, 0xa45d2c5, 0x8069b327, 0xa3f8f73, 0x80693237, - 0xa394c1b, 0x8068b196, - 0xa3308bd, 0x80683143, 0xa2cc558, 0x8067b13f, 0xa2681ed, 0x8067318a, - 0xa203e7c, 0x8066b224, - 0xa19fb04, 0x8066330c, 0xa13b787, 0x8065b443, 0xa0d7403, 0x806535c9, - 0xa073079, 0x8064b79d, - 0xa00ece8, 0x806439c0, 0x9faa952, 0x8063bc32, 0x9f465b5, 0x80633ef3, - 0x9ee2213, 0x8062c202, - 0x9e7de6a, 0x80624560, 0x9e19abb, 0x8061c90c, 0x9db5706, 0x80614d08, - 0x9d5134b, 0x8060d152, - 0x9cecf89, 0x806055eb, 0x9c88bc2, 0x805fdad2, 0x9c247f5, 0x805f6009, - 0x9bc0421, 0x805ee58e, - 0x9b5c048, 0x805e6b62, 0x9af7c69, 0x805df184, 0x9a93884, 0x805d77f5, - 0x9a2f498, 0x805cfeb5, - 0x99cb0a7, 0x805c85c4, 0x9966cb0, 0x805c0d21, 0x99028b3, 0x805b94ce, - 0x989e4b0, 0x805b1cc8, - 0x983a0a7, 0x805aa512, 0x97d5c99, 0x805a2daa, 0x9771884, 0x8059b692, - 0x970d46a, 0x80593fc7, - 0x96a9049, 0x8058c94c, 0x9644c23, 0x8058531f, 0x95e07f8, 0x8057dd41, - 0x957c3c6, 0x805767b2, - 0x9517f8f, 0x8056f272, 0x94b3b52, 0x80567d80, 0x944f70f, 0x805608dd, - 0x93eb2c6, 0x80559489, - 0x9386e78, 0x80552084, 0x9322a24, 0x8054accd, 0x92be5ca, 0x80543965, - 0x925a16b, 0x8053c64c, - 0x91f5d06, 0x80535381, 0x919189c, 0x8052e106, 0x912d42c, 0x80526ed9, - 0x90c8fb6, 0x8051fcfb, - 0x9064b3a, 0x80518b6b, 0x90006ba, 0x80511a2b, 0x8f9c233, 0x8050a939, - 0x8f37da7, 0x80503896, - 0x8ed3916, 0x804fc841, 0x8e6f47f, 0x804f583c, 0x8e0afe2, 0x804ee885, - 0x8da6b40, 0x804e791d, - 0x8d42699, 0x804e0a04, 0x8cde1ec, 0x804d9b39, 0x8c79d3a, 0x804d2cbd, - 0x8c15882, 0x804cbe90, - 0x8bb13c5, 0x804c50b2, 0x8b4cf02, 0x804be323, 0x8ae8a3a, 0x804b75e2, - 0x8a8456d, 0x804b08f0, - 0x8a2009a, 0x804a9c4d, 0x89bbbc3, 0x804a2ff9, 0x89576e5, 0x8049c3f3, - 0x88f3203, 0x8049583d, - 0x888ed1b, 0x8048ecd5, 0x882a82e, 0x804881bb, 0x87c633c, 0x804816f1, - 0x8761e44, 0x8047ac75, - 0x86fd947, 0x80474248, 0x8699445, 0x8046d86a, 0x8634f3e, 0x80466edb, - 0x85d0a32, 0x8046059b, - 0x856c520, 0x80459ca9, 0x850800a, 0x80453406, 0x84a3aee, 0x8044cbb2, - 0x843f5cd, 0x804463ad, - 0x83db0a7, 0x8043fbf6, 0x8376b7c, 0x8043948e, 0x831264c, 0x80432d75, - 0x82ae117, 0x8042c6ab, - 0x8249bdd, 0x80426030, 0x81e569d, 0x8041fa03, 0x8181159, 0x80419425, - 0x811cc10, 0x80412e96, - 0x80b86c2, 0x8040c956, 0x805416e, 0x80406465, 0x7fefc16, 0x803fffc2, - 0x7f8b6b9, 0x803f9b6f, - 0x7f27157, 0x803f376a, 0x7ec2bf0, 0x803ed3b3, 0x7e5e685, 0x803e704c, - 0x7dfa114, 0x803e0d34, - 0x7d95b9e, 0x803daa6a, 0x7d31624, 0x803d47ef, 0x7ccd0a5, 0x803ce5c3, - 0x7c68b21, 0x803c83e5, - 0x7c04598, 0x803c2257, 0x7ba000b, 0x803bc117, 0x7b3ba78, 0x803b6026, - 0x7ad74e1, 0x803aff84, - 0x7a72f45, 0x803a9f31, 0x7a0e9a5, 0x803a3f2d, 0x79aa400, 0x8039df77, - 0x7945e56, 0x80398010, - 0x78e18a7, 0x803920f8, 0x787d2f4, 0x8038c22f, 0x7818d3c, 0x803863b5, - 0x77b4780, 0x80380589, - 0x77501be, 0x8037a7ac, 0x76ebbf9, 0x80374a1f, 0x768762e, 0x8036ece0, - 0x762305f, 0x80368fef, - 0x75bea8c, 0x8036334e, 0x755a4b4, 0x8035d6fb, 0x74f5ed7, 0x80357af8, - 0x74918f6, 0x80351f43, - 0x742d311, 0x8034c3dd, 0x73c8d27, 0x803468c5, 0x7364738, 0x80340dfd, - 0x7300145, 0x8033b383, - 0x729bb4e, 0x80335959, 0x7237552, 0x8032ff7d, 0x71d2f52, 0x8032a5ef, - 0x716e94e, 0x80324cb1, - 0x710a345, 0x8031f3c2, 0x70a5d37, 0x80319b21, 0x7041726, 0x803142cf, - 0x6fdd110, 0x8030eacd, - 0x6f78af6, 0x80309318, 0x6f144d7, 0x80303bb3, 0x6eafeb4, 0x802fe49d, - 0x6e4b88d, 0x802f8dd5, - 0x6de7262, 0x802f375d, 0x6d82c32, 0x802ee133, 0x6d1e5fe, 0x802e8b58, - 0x6cb9fc6, 0x802e35cb, - 0x6c5598a, 0x802de08e, 0x6bf1349, 0x802d8ba0, 0x6b8cd05, 0x802d3700, - 0x6b286bc, 0x802ce2af, - 0x6ac406f, 0x802c8ead, 0x6a5fa1e, 0x802c3afa, 0x69fb3c9, 0x802be796, - 0x6996d70, 0x802b9480, - 0x6932713, 0x802b41ba, 0x68ce0b2, 0x802aef42, 0x6869a4c, 0x802a9d19, - 0x68053e3, 0x802a4b3f, - 0x67a0d76, 0x8029f9b4, 0x673c704, 0x8029a878, 0x66d808f, 0x8029578b, - 0x6673a16, 0x802906ec, - 0x660f398, 0x8028b69c, 0x65aad17, 0x8028669b, 0x6546692, 0x802816e9, - 0x64e2009, 0x8027c786, - 0x647d97c, 0x80277872, 0x64192eb, 0x802729ad, 0x63b4c57, 0x8026db36, - 0x63505be, 0x80268d0e, - 0x62ebf22, 0x80263f36, 0x6287882, 0x8025f1ac, 0x62231de, 0x8025a471, - 0x61beb36, 0x80255784, - 0x615a48b, 0x80250ae7, 0x60f5ddc, 0x8024be99, 0x6091729, 0x80247299, - 0x602d072, 0x802426e8, - 0x5fc89b8, 0x8023db86, 0x5f642fa, 0x80239073, 0x5effc38, 0x802345af, - 0x5e9b572, 0x8022fb3a, - 0x5e36ea9, 0x8022b114, 0x5dd27dd, 0x8022673c, 0x5d6e10c, 0x80221db3, - 0x5d09a38, 0x8021d47a, - 0x5ca5361, 0x80218b8f, 0x5c40c86, 0x802142f3, 0x5bdc5a7, 0x8020faa6, - 0x5b77ec5, 0x8020b2a7, - 0x5b137df, 0x80206af8, 0x5aaf0f6, 0x80202397, 0x5a4aa09, 0x801fdc86, - 0x59e6319, 0x801f95c3, - 0x5981c26, 0x801f4f4f, 0x591d52f, 0x801f092a, 0x58b8e34, 0x801ec354, - 0x5854736, 0x801e7dcd, - 0x57f0035, 0x801e3895, 0x578b930, 0x801df3ab, 0x5727228, 0x801daf11, - 0x56c2b1c, 0x801d6ac5, - 0x565e40d, 0x801d26c8, 0x55f9cfb, 0x801ce31a, 0x55955e6, 0x801c9fbb, - 0x5530ecd, 0x801c5cab, - 0x54cc7b1, 0x801c19ea, 0x5468092, 0x801bd777, 0x540396f, 0x801b9554, - 0x539f249, 0x801b537f, - 0x533ab20, 0x801b11fa, 0x52d63f4, 0x801ad0c3, 0x5271cc4, 0x801a8fdb, - 0x520d592, 0x801a4f42, - 0x51a8e5c, 0x801a0ef8, 0x5144723, 0x8019cefd, 0x50dffe7, 0x80198f50, - 0x507b8a8, 0x80194ff3, - 0x5017165, 0x801910e4, 0x4fb2a20, 0x8018d225, 0x4f4e2d8, 0x801893b4, - 0x4ee9b8c, 0x80185592, - 0x4e8543e, 0x801817bf, 0x4e20cec, 0x8017da3b, 0x4dbc597, 0x80179d06, - 0x4d57e40, 0x80176020, - 0x4cf36e5, 0x80172388, 0x4c8ef88, 0x8016e740, 0x4c2a827, 0x8016ab46, - 0x4bc60c4, 0x80166f9c, - 0x4b6195d, 0x80163440, 0x4afd1f4, 0x8015f933, 0x4a98a88, 0x8015be75, - 0x4a34319, 0x80158406, - 0x49cfba7, 0x801549e6, 0x496b432, 0x80151015, 0x4906cbb, 0x8014d693, - 0x48a2540, 0x80149d5f, - 0x483ddc3, 0x8014647b, 0x47d9643, 0x80142be5, 0x4774ec1, 0x8013f39e, - 0x471073b, 0x8013bba7, - 0x46abfb3, 0x801383fe, 0x4647828, 0x80134ca4, 0x45e309a, 0x80131599, - 0x457e90a, 0x8012dedd, - 0x451a177, 0x8012a86f, 0x44b59e1, 0x80127251, 0x4451249, 0x80123c82, - 0x43ecaae, 0x80120701, - 0x4388310, 0x8011d1d0, 0x4323b70, 0x80119ced, 0x42bf3cd, 0x80116859, - 0x425ac28, 0x80113414, - 0x41f6480, 0x8011001f, 0x4191cd5, 0x8010cc78, 0x412d528, 0x8010991f, - 0x40c8d79, 0x80106616, - 0x40645c7, 0x8010335c, 0x3fffe12, 0x801000f1, 0x3f9b65b, 0x800fced4, - 0x3f36ea2, 0x800f9d07, - 0x3ed26e6, 0x800f6b88, 0x3e6df28, 0x800f3a59, 0x3e09767, 0x800f0978, - 0x3da4fa4, 0x800ed8e6, - 0x3d407df, 0x800ea8a3, 0x3cdc017, 0x800e78af, 0x3c7784d, 0x800e490a, - 0x3c13080, 0x800e19b4, - 0x3bae8b2, 0x800deaad, 0x3b4a0e0, 0x800dbbf5, 0x3ae590d, 0x800d8d8b, - 0x3a81137, 0x800d5f71, - 0x3a1c960, 0x800d31a5, 0x39b8185, 0x800d0429, 0x39539a9, 0x800cd6fb, - 0x38ef1ca, 0x800caa1c, - 0x388a9ea, 0x800c7d8c, 0x3826207, 0x800c514c, 0x37c1a22, 0x800c255a, - 0x375d23a, 0x800bf9b7, - 0x36f8a51, 0x800bce63, 0x3694265, 0x800ba35d, 0x362fa78, 0x800b78a7, - 0x35cb288, 0x800b4e40, - 0x3566a96, 0x800b2427, 0x35022a2, 0x800afa5e, 0x349daac, 0x800ad0e3, - 0x34392b4, 0x800aa7b8, - 0x33d4abb, 0x800a7edb, 0x33702bf, 0x800a564e, 0x330bac1, 0x800a2e0f, - 0x32a72c1, 0x800a061f, - 0x3242abf, 0x8009de7e, 0x31de2bb, 0x8009b72c, 0x3179ab5, 0x80099029, - 0x31152ae, 0x80096975, - 0x30b0aa4, 0x80094310, 0x304c299, 0x80091cf9, 0x2fe7a8c, 0x8008f732, - 0x2f8327d, 0x8008d1ba, - 0x2f1ea6c, 0x8008ac90, 0x2eba259, 0x800887b6, 0x2e55a44, 0x8008632a, - 0x2df122e, 0x80083eed, - 0x2d8ca16, 0x80081b00, 0x2d281fc, 0x8007f761, 0x2cc39e1, 0x8007d411, - 0x2c5f1c3, 0x8007b110, - 0x2bfa9a4, 0x80078e5e, 0x2b96184, 0x80076bfb, 0x2b31961, 0x800749e7, - 0x2acd13d, 0x80072822, - 0x2a68917, 0x800706ac, 0x2a040f0, 0x8006e585, 0x299f8c7, 0x8006c4ac, - 0x293b09c, 0x8006a423, - 0x28d6870, 0x800683e8, 0x2872043, 0x800663fd, 0x280d813, 0x80064460, - 0x27a8fe2, 0x80062513, - 0x27447b0, 0x80060614, 0x26dff7c, 0x8005e764, 0x267b747, 0x8005c904, - 0x2616f10, 0x8005aaf2, - 0x25b26d7, 0x80058d2f, 0x254de9e, 0x80056fbb, 0x24e9662, 0x80055296, - 0x2484e26, 0x800535c0, - 0x24205e8, 0x80051939, 0x23bbda8, 0x8004fd00, 0x2357567, 0x8004e117, - 0x22f2d25, 0x8004c57d, - 0x228e4e2, 0x8004aa32, 0x2229c9d, 0x80048f35, 0x21c5457, 0x80047488, - 0x2160c0f, 0x80045a29, - 0x20fc3c6, 0x8004401a, 0x2097b7c, 0x80042659, 0x2033331, 0x80040ce7, - 0x1fceae4, 0x8003f3c5, - 0x1f6a297, 0x8003daf1, 0x1f05a48, 0x8003c26c, 0x1ea11f7, 0x8003aa36, - 0x1e3c9a6, 0x8003924f, - 0x1dd8154, 0x80037ab7, 0x1d73900, 0x8003636e, 0x1d0f0ab, 0x80034c74, - 0x1caa855, 0x800335c9, - 0x1c45ffe, 0x80031f6d, 0x1be17a6, 0x80030960, 0x1b7cf4d, 0x8002f3a1, - 0x1b186f3, 0x8002de32, - 0x1ab3e97, 0x8002c912, 0x1a4f63b, 0x8002b440, 0x19eaddd, 0x80029fbe, - 0x198657f, 0x80028b8a, - 0x1921d20, 0x800277a6, 0x18bd4bf, 0x80026410, 0x1858c5e, 0x800250c9, - 0x17f43fc, 0x80023dd2, - 0x178fb99, 0x80022b29, 0x172b335, 0x800218cf, 0x16c6ad0, 0x800206c4, - 0x166226a, 0x8001f508, - 0x15fda03, 0x8001e39b, 0x159919c, 0x8001d27d, 0x1534934, 0x8001c1ae, - 0x14d00ca, 0x8001b12e, - 0x146b860, 0x8001a0fd, 0x1406ff6, 0x8001911b, 0x13a278a, 0x80018187, - 0x133df1e, 0x80017243, - 0x12d96b1, 0x8001634e, 0x1274e43, 0x800154a7, 0x12105d5, 0x80014650, - 0x11abd66, 0x80013847, - 0x11474f6, 0x80012a8e, 0x10e2c85, 0x80011d23, 0x107e414, 0x80011008, - 0x1019ba2, 0x8001033b, - 0xfb5330, 0x8000f6bd, 0xf50abd, 0x8000ea8e, 0xeec249, 0x8000deaf, 0xe879d5, - 0x8000d31e, - 0xe23160, 0x8000c7dc, 0xdbe8eb, 0x8000bce9, 0xd5a075, 0x8000b245, 0xcf57ff, - 0x8000a7f0, - 0xc90f88, 0x80009dea, 0xc2c711, 0x80009433, 0xbc7e99, 0x80008aca, 0xb63621, - 0x800081b1, - 0xafeda8, 0x800078e7, 0xa9a52f, 0x8000706c, 0xa35cb5, 0x8000683f, 0x9d143b, - 0x80006062, - 0x96cbc1, 0x800058d4, 0x908346, 0x80005194, 0x8a3acb, 0x80004aa4, 0x83f250, - 0x80004402, - 0x7da9d4, 0x80003daf, 0x776159, 0x800037ac, 0x7118dc, 0x800031f7, 0x6ad060, - 0x80002c91, - 0x6487e3, 0x8000277a, 0x5e3f66, 0x800022b3, 0x57f6e9, 0x80001e3a, 0x51ae6b, - 0x80001a10, - 0x4b65ee, 0x80001635, 0x451d70, 0x800012a9, 0x3ed4f2, 0x80000f6c, 0x388c74, - 0x80000c7e, - 0x3243f5, 0x800009df, 0x2bfb77, 0x8000078e, 0x25b2f8, 0x8000058d, 0x1f6a7a, - 0x800003db, - 0x1921fb, 0x80000278, 0x12d97c, 0x80000163, 0xc90fe, 0x8000009e, 0x6487f, - 0x80000027, - -}; - -/** -* \par -* cosFactor tables are generated using the formula :
cos_factors[n] = 2 * cos((2n+1)*pi/(4*N))
-* \par -* C command to generate the table -*
    
-* for(i = 0; i< N; i++)    
-* {    
-*   cos_factors[i]= 2 * cos((2*i+1)*c/2);    
-* } 
-* \par -* where N is the number of factors to generate and c is pi/(2*N) -* \par -* Then converted to q31 format by multiplying with 2^31 and saturated if required. -*/ - - -static const q31_t cos_factorsQ31_128[128] = { - 0x7fff6216, 0x7ffa72d1, 0x7ff09478, 0x7fe1c76b, 0x7fce0c3e, 0x7fb563b3, - 0x7f97cebd, 0x7f754e80, - 0x7f4de451, 0x7f2191b4, 0x7ef05860, 0x7eba3a39, 0x7e7f3957, 0x7e3f57ff, - 0x7dfa98a8, 0x7db0fdf8, - 0x7d628ac6, 0x7d0f4218, 0x7cb72724, 0x7c5a3d50, 0x7bf88830, 0x7b920b89, - 0x7b26cb4f, 0x7ab6cba4, - 0x7a4210d8, 0x79c89f6e, 0x794a7c12, 0x78c7aba2, 0x78403329, 0x77b417df, - 0x77235f2d, 0x768e0ea6, - 0x75f42c0b, 0x7555bd4c, 0x74b2c884, 0x740b53fb, 0x735f6626, 0x72af05a7, - 0x71fa3949, 0x71410805, - 0x708378ff, 0x6fc19385, 0x6efb5f12, 0x6e30e34a, 0x6d6227fa, 0x6c8f351c, - 0x6bb812d1, 0x6adcc964, - 0x69fd614a, 0x6919e320, 0x683257ab, 0x6746c7d8, 0x66573cbb, 0x6563bf92, - 0x646c59bf, 0x637114cc, - 0x6271fa69, 0x616f146c, 0x60686ccf, 0x5f5e0db3, 0x5e50015d, 0x5d3e5237, - 0x5c290acc, 0x5b1035cf, - 0x59f3de12, 0x58d40e8c, 0x57b0d256, 0x568a34a9, 0x556040e2, 0x5433027d, - 0x53028518, 0x51ced46e, - 0x5097fc5e, 0x4f5e08e3, 0x4e210617, 0x4ce10034, 0x4b9e0390, 0x4a581c9e, - 0x490f57ee, 0x47c3c22f, - 0x46756828, 0x452456bd, 0x43d09aed, 0x427a41d0, 0x4121589b, 0x3fc5ec98, - 0x3e680b2c, 0x3d07c1d6, - 0x3ba51e29, 0x3a402dd2, 0x38d8fe93, 0x376f9e46, 0x36041ad9, 0x34968250, - 0x3326e2c3, 0x31b54a5e, - 0x3041c761, 0x2ecc681e, 0x2d553afc, 0x2bdc4e6f, 0x2a61b101, 0x28e5714b, - 0x27679df4, 0x25e845b6, - 0x24677758, 0x22e541af, 0x2161b3a0, 0x1fdcdc1b, 0x1e56ca1e, 0x1ccf8cb3, - 0x1b4732ef, 0x19bdcbf3, - 0x183366e9, 0x16a81305, 0x151bdf86, 0x138edbb1, 0x120116d5, 0x1072a048, - 0xee38766, 0xd53db92, - 0xbc3ac35, 0xa3308bd, 0x8a2009a, 0x710a345, 0x57f0035, 0x3ed26e6, 0x25b26d7, - 0xc90f88, -}; - -static const q31_t cos_factorsQ31_512[512] = { - 0x7ffff621, 0x7fffa72c, 0x7fff0943, 0x7ffe1c65, 0x7ffce093, 0x7ffb55ce, - 0x7ff97c18, 0x7ff75370, - 0x7ff4dbd9, 0x7ff21553, 0x7feeffe1, 0x7feb9b85, 0x7fe7e841, 0x7fe3e616, - 0x7fdf9508, 0x7fdaf519, - 0x7fd6064c, 0x7fd0c8a3, 0x7fcb3c23, 0x7fc560cf, 0x7fbf36aa, 0x7fb8bdb8, - 0x7fb1f5fc, 0x7faadf7c, - 0x7fa37a3c, 0x7f9bc640, 0x7f93c38c, 0x7f8b7227, 0x7f82d214, 0x7f79e35a, - 0x7f70a5fe, 0x7f671a05, - 0x7f5d3f75, 0x7f531655, 0x7f489eaa, 0x7f3dd87c, 0x7f32c3d1, 0x7f2760af, - 0x7f1baf1e, 0x7f0faf25, - 0x7f0360cb, 0x7ef6c418, 0x7ee9d914, 0x7edc9fc6, 0x7ecf1837, 0x7ec14270, - 0x7eb31e78, 0x7ea4ac58, - 0x7e95ec1a, 0x7e86ddc6, 0x7e778166, 0x7e67d703, 0x7e57dea7, 0x7e47985b, - 0x7e37042a, 0x7e26221f, - 0x7e14f242, 0x7e0374a0, 0x7df1a942, 0x7ddf9034, 0x7dcd2981, 0x7dba7534, - 0x7da77359, 0x7d9423fc, - 0x7d808728, 0x7d6c9ce9, 0x7d58654d, 0x7d43e05e, 0x7d2f0e2b, 0x7d19eebf, - 0x7d048228, 0x7ceec873, - 0x7cd8c1ae, 0x7cc26de5, 0x7cabcd28, 0x7c94df83, 0x7c7da505, 0x7c661dbc, - 0x7c4e49b7, 0x7c362904, - 0x7c1dbbb3, 0x7c0501d2, 0x7bebfb70, 0x7bd2a89e, 0x7bb9096b, 0x7b9f1de6, - 0x7b84e61f, 0x7b6a6227, - 0x7b4f920e, 0x7b3475e5, 0x7b190dbc, 0x7afd59a4, 0x7ae159ae, 0x7ac50dec, - 0x7aa8766f, 0x7a8b9348, - 0x7a6e648a, 0x7a50ea47, 0x7a332490, 0x7a151378, 0x79f6b711, 0x79d80f6f, - 0x79b91ca4, 0x7999dec4, - 0x797a55e0, 0x795a820e, 0x793a6361, 0x7919f9ec, 0x78f945c3, 0x78d846fb, - 0x78b6fda8, 0x789569df, - 0x78738bb3, 0x7851633b, 0x782ef08b, 0x780c33b8, 0x77e92cd9, 0x77c5dc01, - 0x77a24148, 0x777e5cc3, - 0x775a2e89, 0x7735b6af, 0x7710f54c, 0x76ebea77, 0x76c69647, 0x76a0f8d2, - 0x767b1231, 0x7654e279, - 0x762e69c4, 0x7607a828, 0x75e09dbd, 0x75b94a9c, 0x7591aedd, 0x7569ca99, - 0x75419de7, 0x751928e0, - 0x74f06b9e, 0x74c7663a, 0x749e18cd, 0x74748371, 0x744aa63f, 0x74208150, - 0x73f614c0, 0x73cb60a8, - 0x73a06522, 0x73752249, 0x73499838, 0x731dc70a, 0x72f1aed9, 0x72c54fc1, - 0x7298a9dd, 0x726bbd48, - 0x723e8a20, 0x7211107e, 0x71e35080, 0x71b54a41, 0x7186fdde, 0x71586b74, - 0x7129931f, 0x70fa74fc, - 0x70cb1128, 0x709b67c0, 0x706b78e3, 0x703b44ad, 0x700acb3c, 0x6fda0cae, - 0x6fa90921, 0x6f77c0b3, - 0x6f463383, 0x6f1461b0, 0x6ee24b57, 0x6eaff099, 0x6e7d5193, 0x6e4a6e66, - 0x6e174730, 0x6de3dc11, - 0x6db02d29, 0x6d7c3a98, 0x6d48047e, 0x6d138afb, 0x6cdece2f, 0x6ca9ce3b, - 0x6c748b3f, 0x6c3f055d, - 0x6c093cb6, 0x6bd3316a, 0x6b9ce39b, 0x6b66536b, 0x6b2f80fb, 0x6af86c6c, - 0x6ac115e2, 0x6a897d7d, - 0x6a51a361, 0x6a1987b0, 0x69e12a8c, 0x69a88c19, 0x696fac78, 0x69368bce, - 0x68fd2a3d, 0x68c387e9, - 0x6889a4f6, 0x684f8186, 0x68151dbe, 0x67da79c3, 0x679f95b7, 0x676471c0, - 0x67290e02, 0x66ed6aa1, - 0x66b187c3, 0x6675658c, 0x66390422, 0x65fc63a9, 0x65bf8447, 0x65826622, - 0x6545095f, 0x65076e25, - 0x64c99498, 0x648b7ce0, 0x644d2722, 0x640e9386, 0x63cfc231, 0x6390b34a, - 0x635166f9, 0x6311dd64, - 0x62d216b3, 0x6292130c, 0x6251d298, 0x6211557e, 0x61d09be5, 0x618fa5f7, - 0x614e73da, 0x610d05b7, - 0x60cb5bb7, 0x60897601, 0x604754bf, 0x6004f819, 0x5fc26038, 0x5f7f8d46, - 0x5f3c7f6b, 0x5ef936d1, - 0x5eb5b3a2, 0x5e71f606, 0x5e2dfe29, 0x5de9cc33, 0x5da5604f, 0x5d60baa7, - 0x5d1bdb65, 0x5cd6c2b5, - 0x5c9170bf, 0x5c4be5b0, 0x5c0621b2, 0x5bc024f0, 0x5b79ef96, 0x5b3381ce, - 0x5aecdbc5, 0x5aa5fda5, - 0x5a5ee79a, 0x5a1799d1, 0x59d01475, 0x598857b2, 0x594063b5, 0x58f838a9, - 0x58afd6bd, 0x58673e1b, - 0x581e6ef1, 0x57d5696d, 0x578c2dba, 0x5742bc06, 0x56f9147e, 0x56af3750, - 0x566524aa, 0x561adcb9, - 0x55d05faa, 0x5585adad, 0x553ac6ee, 0x54efab9c, 0x54a45be6, 0x5458d7f9, - 0x540d2005, 0x53c13439, - 0x537514c2, 0x5328c1d0, 0x52dc3b92, 0x528f8238, 0x524295f0, 0x51f576ea, - 0x51a82555, 0x515aa162, - 0x510ceb40, 0x50bf031f, 0x5070e92f, 0x50229da1, 0x4fd420a4, 0x4f857269, - 0x4f369320, 0x4ee782fb, - 0x4e984229, 0x4e48d0dd, 0x4df92f46, 0x4da95d96, 0x4d595bfe, 0x4d092ab0, - 0x4cb8c9dd, 0x4c6839b7, - 0x4c177a6e, 0x4bc68c36, 0x4b756f40, 0x4b2423be, 0x4ad2a9e2, 0x4a8101de, - 0x4a2f2be6, 0x49dd282a, - 0x498af6df, 0x49389836, 0x48e60c62, 0x48935397, 0x48406e08, 0x47ed5be6, - 0x479a1d67, 0x4746b2bc, - 0x46f31c1a, 0x469f59b4, 0x464b6bbe, 0x45f7526b, 0x45a30df0, 0x454e9e80, - 0x44fa0450, 0x44a53f93, - 0x4450507e, 0x43fb3746, 0x43a5f41e, 0x4350873c, 0x42faf0d4, 0x42a5311b, - 0x424f4845, 0x41f93689, - 0x41a2fc1a, 0x414c992f, 0x40f60dfb, 0x409f5ab6, 0x40487f94, 0x3ff17cca, - 0x3f9a5290, 0x3f430119, - 0x3eeb889c, 0x3e93e950, 0x3e3c2369, 0x3de4371f, 0x3d8c24a8, 0x3d33ec39, - 0x3cdb8e09, 0x3c830a50, - 0x3c2a6142, 0x3bd19318, 0x3b78a007, 0x3b1f8848, 0x3ac64c0f, 0x3a6ceb96, - 0x3a136712, 0x39b9bebc, - 0x395ff2c9, 0x39060373, 0x38abf0ef, 0x3851bb77, 0x37f76341, 0x379ce885, - 0x37424b7b, 0x36e78c5b, - 0x368cab5c, 0x3631a8b8, 0x35d684a6, 0x357b3f5d, 0x351fd918, 0x34c4520d, - 0x3468aa76, 0x340ce28b, - 0x33b0fa84, 0x3354f29b, 0x32f8cb07, 0x329c8402, 0x32401dc6, 0x31e39889, - 0x3186f487, 0x312a31f8, - 0x30cd5115, 0x30705217, 0x30133539, 0x2fb5fab2, 0x2f58a2be, 0x2efb2d95, - 0x2e9d9b70, 0x2e3fec8b, - 0x2de2211e, 0x2d843964, 0x2d263596, 0x2cc815ee, 0x2c69daa6, 0x2c0b83fa, - 0x2bad1221, 0x2b4e8558, - 0x2aefddd8, 0x2a911bdc, 0x2a323f9e, 0x29d34958, 0x29743946, 0x29150fa1, - 0x28b5cca5, 0x2856708d, - 0x27f6fb92, 0x27976df1, 0x2737c7e3, 0x26d809a5, 0x26783370, 0x26184581, - 0x25b84012, 0x2558235f, - 0x24f7efa2, 0x2497a517, 0x243743fa, 0x23d6cc87, 0x23763ef7, 0x23159b88, - 0x22b4e274, 0x225413f8, - 0x21f3304f, 0x219237b5, 0x21312a65, 0x20d0089c, 0x206ed295, 0x200d888d, - 0x1fac2abf, 0x1f4ab968, - 0x1ee934c3, 0x1e879d0d, 0x1e25f282, 0x1dc4355e, 0x1d6265dd, 0x1d00843d, - 0x1c9e90b8, 0x1c3c8b8c, - 0x1bda74f6, 0x1b784d30, 0x1b161479, 0x1ab3cb0d, 0x1a517128, 0x19ef0707, - 0x198c8ce7, 0x192a0304, - 0x18c7699b, 0x1864c0ea, 0x1802092c, 0x179f429f, 0x173c6d80, 0x16d98a0c, - 0x1676987f, 0x16139918, - 0x15b08c12, 0x154d71aa, 0x14ea4a1f, 0x148715ae, 0x1423d492, 0x13c0870a, - 0x135d2d53, 0x12f9c7aa, - 0x1296564d, 0x1232d979, 0x11cf516a, 0x116bbe60, 0x11082096, 0x10a4784b, - 0x1040c5bb, 0xfdd0926, - 0xf7942c7, 0xf1572dc, 0xeb199a4, 0xe4db75b, 0xde9cc40, 0xd85d88f, 0xd21dc87, - 0xcbdd865, - 0xc59cc68, 0xbf5b8cb, 0xb919dcf, 0xb2d7baf, 0xac952aa, 0xa6522fe, 0xa00ece8, - 0x99cb0a7, - 0x9386e78, 0x8d42699, 0x86fd947, 0x80b86c2, 0x7a72f45, 0x742d311, 0x6de7262, - 0x67a0d76, - 0x615a48b, 0x5b137df, 0x54cc7b1, 0x4e8543e, 0x483ddc3, 0x41f6480, 0x3bae8b2, - 0x3566a96, - 0x2f1ea6c, 0x28d6870, 0x228e4e2, 0x1c45ffe, 0x15fda03, 0xfb5330, 0x96cbc1, - 0x3243f5, -}; - -static const q31_t cos_factorsQ31_2048[2048] = { - 0x7fffff62, 0x7ffffa73, 0x7ffff094, 0x7fffe1c6, 0x7fffce09, 0x7fffb55c, - 0x7fff97c1, 0x7fff7536, - 0x7fff4dbb, 0x7fff2151, 0x7ffeeff8, 0x7ffeb9b0, 0x7ffe7e79, 0x7ffe3e52, - 0x7ffdf93c, 0x7ffdaf37, - 0x7ffd6042, 0x7ffd0c5f, 0x7ffcb38c, 0x7ffc55ca, 0x7ffbf319, 0x7ffb8b78, - 0x7ffb1ee9, 0x7ffaad6a, - 0x7ffa36fc, 0x7ff9bba0, 0x7ff93b54, 0x7ff8b619, 0x7ff82bef, 0x7ff79cd6, - 0x7ff708ce, 0x7ff66fd7, - 0x7ff5d1f1, 0x7ff52f1d, 0x7ff48759, 0x7ff3daa6, 0x7ff32905, 0x7ff27275, - 0x7ff1b6f6, 0x7ff0f688, - 0x7ff0312c, 0x7fef66e1, 0x7fee97a7, 0x7fedc37e, 0x7fecea67, 0x7fec0c62, - 0x7feb296d, 0x7fea418b, - 0x7fe954ba, 0x7fe862fa, 0x7fe76c4c, 0x7fe670b0, 0x7fe57025, 0x7fe46aac, - 0x7fe36045, 0x7fe250ef, - 0x7fe13cac, 0x7fe0237a, 0x7fdf055a, 0x7fdde24d, 0x7fdcba51, 0x7fdb8d67, - 0x7fda5b8f, 0x7fd924ca, - 0x7fd7e917, 0x7fd6a875, 0x7fd562e7, 0x7fd4186a, 0x7fd2c900, 0x7fd174a8, - 0x7fd01b63, 0x7fcebd31, - 0x7fcd5a11, 0x7fcbf203, 0x7fca8508, 0x7fc91320, 0x7fc79c4b, 0x7fc62089, - 0x7fc49fda, 0x7fc31a3d, - 0x7fc18fb4, 0x7fc0003e, 0x7fbe6bdb, 0x7fbcd28b, 0x7fbb344e, 0x7fb99125, - 0x7fb7e90f, 0x7fb63c0d, - 0x7fb48a1e, 0x7fb2d343, 0x7fb1177b, 0x7faf56c7, 0x7fad9127, 0x7fabc69b, - 0x7fa9f723, 0x7fa822bf, - 0x7fa6496e, 0x7fa46b32, 0x7fa2880b, 0x7fa09ff7, 0x7f9eb2f8, 0x7f9cc10d, - 0x7f9aca37, 0x7f98ce76, - 0x7f96cdc9, 0x7f94c831, 0x7f92bdad, 0x7f90ae3f, 0x7f8e99e6, 0x7f8c80a1, - 0x7f8a6272, 0x7f883f58, - 0x7f861753, 0x7f83ea64, 0x7f81b88a, 0x7f7f81c6, 0x7f7d4617, 0x7f7b057e, - 0x7f78bffb, 0x7f76758e, - 0x7f742637, 0x7f71d1f6, 0x7f6f78cb, 0x7f6d1ab6, 0x7f6ab7b8, 0x7f684fd0, - 0x7f65e2ff, 0x7f637144, - 0x7f60faa0, 0x7f5e7f13, 0x7f5bfe9d, 0x7f59793e, 0x7f56eef5, 0x7f545fc5, - 0x7f51cbab, 0x7f4f32a9, - 0x7f4c94be, 0x7f49f1eb, 0x7f474a30, 0x7f449d8c, 0x7f41ec01, 0x7f3f358d, - 0x7f3c7a31, 0x7f39b9ee, - 0x7f36f4c3, 0x7f342ab1, 0x7f315bb7, 0x7f2e87d6, 0x7f2baf0d, 0x7f28d15d, - 0x7f25eec7, 0x7f230749, - 0x7f201ae5, 0x7f1d299a, 0x7f1a3368, 0x7f173850, 0x7f143852, 0x7f11336d, - 0x7f0e29a3, 0x7f0b1af2, - 0x7f08075c, 0x7f04eedf, 0x7f01d17d, 0x7efeaf36, 0x7efb8809, 0x7ef85bf7, - 0x7ef52b00, 0x7ef1f524, - 0x7eeeba62, 0x7eeb7abc, 0x7ee83632, 0x7ee4ecc3, 0x7ee19e6f, 0x7ede4b38, - 0x7edaf31c, 0x7ed7961c, - 0x7ed43438, 0x7ed0cd70, 0x7ecd61c5, 0x7ec9f137, 0x7ec67bc5, 0x7ec3016f, - 0x7ebf8237, 0x7ebbfe1c, - 0x7eb8751e, 0x7eb4e73d, 0x7eb1547a, 0x7eadbcd4, 0x7eaa204c, 0x7ea67ee2, - 0x7ea2d896, 0x7e9f2d68, - 0x7e9b7d58, 0x7e97c867, 0x7e940e94, 0x7e904fe0, 0x7e8c8c4b, 0x7e88c3d5, - 0x7e84f67e, 0x7e812447, - 0x7e7d4d2f, 0x7e797136, 0x7e75905d, 0x7e71aaa4, 0x7e6dc00c, 0x7e69d093, - 0x7e65dc3b, 0x7e61e303, - 0x7e5de4ec, 0x7e59e1f5, 0x7e55da20, 0x7e51cd6c, 0x7e4dbbd9, 0x7e49a567, - 0x7e458a17, 0x7e4169e9, - 0x7e3d44dd, 0x7e391af3, 0x7e34ec2b, 0x7e30b885, 0x7e2c8002, 0x7e2842a2, - 0x7e240064, 0x7e1fb94a, - 0x7e1b6d53, 0x7e171c7f, 0x7e12c6ce, 0x7e0e6c42, 0x7e0a0cd9, 0x7e05a894, - 0x7e013f74, 0x7dfcd178, - 0x7df85ea0, 0x7df3e6ee, 0x7def6a60, 0x7deae8f7, 0x7de662b3, 0x7de1d795, - 0x7ddd479d, 0x7dd8b2ca, - 0x7dd4191d, 0x7dcf7a96, 0x7dcad736, 0x7dc62efc, 0x7dc181e8, 0x7dbccffc, - 0x7db81936, 0x7db35d98, - 0x7dae9d21, 0x7da9d7d2, 0x7da50dab, 0x7da03eab, 0x7d9b6ad3, 0x7d969224, - 0x7d91b49e, 0x7d8cd240, - 0x7d87eb0a, 0x7d82fefe, 0x7d7e0e1c, 0x7d791862, 0x7d741dd2, 0x7d6f1e6c, - 0x7d6a1a31, 0x7d65111f, - 0x7d600338, 0x7d5af07b, 0x7d55d8e9, 0x7d50bc82, 0x7d4b9b46, 0x7d467536, - 0x7d414a51, 0x7d3c1a98, - 0x7d36e60b, 0x7d31acaa, 0x7d2c6e76, 0x7d272b6e, 0x7d21e393, 0x7d1c96e5, - 0x7d174564, 0x7d11ef11, - 0x7d0c93eb, 0x7d0733f3, 0x7d01cf29, 0x7cfc658d, 0x7cf6f720, 0x7cf183e1, - 0x7cec0bd1, 0x7ce68ef0, - 0x7ce10d3f, 0x7cdb86bd, 0x7cd5fb6a, 0x7cd06b48, 0x7ccad656, 0x7cc53c94, - 0x7cbf9e03, 0x7cb9faa2, - 0x7cb45272, 0x7caea574, 0x7ca8f3a7, 0x7ca33d0c, 0x7c9d81a3, 0x7c97c16b, - 0x7c91fc66, 0x7c8c3294, - 0x7c8663f4, 0x7c809088, 0x7c7ab84e, 0x7c74db48, 0x7c6ef976, 0x7c6912d7, - 0x7c63276d, 0x7c5d3737, - 0x7c574236, 0x7c514869, 0x7c4b49d2, 0x7c45466f, 0x7c3f3e42, 0x7c39314b, - 0x7c331f8a, 0x7c2d08ff, - 0x7c26edab, 0x7c20cd8d, 0x7c1aa8a6, 0x7c147ef6, 0x7c0e507e, 0x7c081d3d, - 0x7c01e534, 0x7bfba863, - 0x7bf566cb, 0x7bef206b, 0x7be8d544, 0x7be28556, 0x7bdc30a1, 0x7bd5d726, - 0x7bcf78e5, 0x7bc915dd, - 0x7bc2ae10, 0x7bbc417e, 0x7bb5d026, 0x7baf5a09, 0x7ba8df28, 0x7ba25f82, - 0x7b9bdb18, 0x7b9551ea, - 0x7b8ec3f8, 0x7b883143, 0x7b8199ca, 0x7b7afd8f, 0x7b745c91, 0x7b6db6d0, - 0x7b670c4d, 0x7b605d09, - 0x7b59a902, 0x7b52f03a, 0x7b4c32b1, 0x7b457068, 0x7b3ea95d, 0x7b37dd92, - 0x7b310d07, 0x7b2a37bc, - 0x7b235db2, 0x7b1c7ee8, 0x7b159b5f, 0x7b0eb318, 0x7b07c612, 0x7b00d44d, - 0x7af9ddcb, 0x7af2e28b, - 0x7aebe28d, 0x7ae4ddd2, 0x7addd45b, 0x7ad6c626, 0x7acfb336, 0x7ac89b89, - 0x7ac17f20, 0x7aba5dfc, - 0x7ab3381d, 0x7aac0d82, 0x7aa4de2d, 0x7a9daa1d, 0x7a967153, 0x7a8f33d0, - 0x7a87f192, 0x7a80aa9c, - 0x7a795eec, 0x7a720e84, 0x7a6ab963, 0x7a635f8a, 0x7a5c00f9, 0x7a549db0, - 0x7a4d35b0, 0x7a45c8f9, - 0x7a3e578b, 0x7a36e166, 0x7a2f668c, 0x7a27e6fb, 0x7a2062b5, 0x7a18d9b9, - 0x7a114c09, 0x7a09b9a4, - 0x7a02228a, 0x79fa86bc, 0x79f2e63a, 0x79eb4105, 0x79e3971c, 0x79dbe880, - 0x79d43532, 0x79cc7d31, - 0x79c4c07e, 0x79bcff19, 0x79b53903, 0x79ad6e3c, 0x79a59ec3, 0x799dca9a, - 0x7995f1c1, 0x798e1438, - 0x798631ff, 0x797e4b16, 0x79765f7f, 0x796e6f39, 0x79667a44, 0x795e80a1, - 0x79568250, 0x794e7f52, - 0x794677a6, 0x793e6b4e, 0x79365a49, 0x792e4497, 0x79262a3a, 0x791e0b31, - 0x7915e77c, 0x790dbf1d, - 0x79059212, 0x78fd605d, 0x78f529fe, 0x78eceef6, 0x78e4af44, 0x78dc6ae8, - 0x78d421e4, 0x78cbd437, - 0x78c381e2, 0x78bb2ae5, 0x78b2cf41, 0x78aa6ef5, 0x78a20a03, 0x7899a06a, - 0x7891322a, 0x7888bf45, - 0x788047ba, 0x7877cb89, 0x786f4ab4, 0x7866c53a, 0x785e3b1c, 0x7855ac5a, - 0x784d18f4, 0x784480ea, - 0x783be43e, 0x783342ef, 0x782a9cfe, 0x7821f26b, 0x78194336, 0x78108f60, - 0x7807d6e9, 0x77ff19d1, - 0x77f65819, 0x77ed91c0, 0x77e4c6c9, 0x77dbf732, 0x77d322fc, 0x77ca4a27, - 0x77c16cb4, 0x77b88aa3, - 0x77afa3f5, 0x77a6b8a9, 0x779dc8c0, 0x7794d43b, 0x778bdb19, 0x7782dd5c, - 0x7779db03, 0x7770d40f, - 0x7767c880, 0x775eb857, 0x7755a394, 0x774c8a36, 0x77436c40, 0x773a49b0, - 0x77312287, 0x7727f6c6, - 0x771ec66e, 0x7715917d, 0x770c57f5, 0x770319d6, 0x76f9d721, 0x76f08fd5, - 0x76e743f4, 0x76ddf37c, - 0x76d49e70, 0x76cb44cf, 0x76c1e699, 0x76b883d0, 0x76af1c72, 0x76a5b082, - 0x769c3ffe, 0x7692cae8, - 0x7689513f, 0x767fd304, 0x76765038, 0x766cc8db, 0x76633ced, 0x7659ac6f, - 0x76501760, 0x76467dc2, - 0x763cdf94, 0x76333cd8, 0x7629958c, 0x761fe9b3, 0x7616394c, 0x760c8457, - 0x7602cad5, 0x75f90cc7, - 0x75ef4a2c, 0x75e58305, 0x75dbb753, 0x75d1e715, 0x75c8124d, 0x75be38fa, - 0x75b45b1d, 0x75aa78b6, - 0x75a091c6, 0x7596a64d, 0x758cb64c, 0x7582c1c2, 0x7578c8b0, 0x756ecb18, - 0x7564c8f8, 0x755ac251, - 0x7550b725, 0x7546a772, 0x753c933a, 0x75327a7d, 0x75285d3b, 0x751e3b75, - 0x7514152b, 0x7509ea5d, - 0x74ffbb0d, 0x74f58739, 0x74eb4ee3, 0x74e1120c, 0x74d6d0b2, 0x74cc8ad8, - 0x74c2407d, 0x74b7f1a1, - 0x74ad9e46, 0x74a3466b, 0x7498ea11, 0x748e8938, 0x748423e0, 0x7479ba0b, - 0x746f4bb8, 0x7464d8e8, - 0x745a619b, 0x744fe5d2, 0x7445658d, 0x743ae0cc, 0x74305790, 0x7425c9da, - 0x741b37a9, 0x7410a0fe, - 0x740605d9, 0x73fb663c, 0x73f0c226, 0x73e61997, 0x73db6c91, 0x73d0bb13, - 0x73c6051f, 0x73bb4ab3, - 0x73b08bd1, 0x73a5c87a, 0x739b00ad, 0x7390346b, 0x738563b5, 0x737a8e8a, - 0x736fb4ec, 0x7364d6da, - 0x7359f456, 0x734f0d5f, 0x734421f6, 0x7339321b, 0x732e3dcf, 0x73234512, - 0x731847e5, 0x730d4648, - 0x7302403c, 0x72f735c0, 0x72ec26d6, 0x72e1137d, 0x72d5fbb7, 0x72cadf83, - 0x72bfbee3, 0x72b499d6, - 0x72a9705c, 0x729e4277, 0x72931027, 0x7287d96c, 0x727c9e47, 0x72715eb8, - 0x72661abf, 0x725ad25d, - 0x724f8593, 0x72443460, 0x7238dec5, 0x722d84c4, 0x7222265b, 0x7216c38c, - 0x720b5c57, 0x71fff0bc, - 0x71f480bc, 0x71e90c57, 0x71dd938f, 0x71d21662, 0x71c694d2, 0x71bb0edf, - 0x71af848a, 0x71a3f5d2, - 0x719862b9, 0x718ccb3f, 0x71812f65, 0x71758f29, 0x7169ea8f, 0x715e4194, - 0x7152943b, 0x7146e284, - 0x713b2c6e, 0x712f71fb, 0x7123b32b, 0x7117effe, 0x710c2875, 0x71005c90, - 0x70f48c50, 0x70e8b7b5, - 0x70dcdec0, 0x70d10171, 0x70c51fc8, 0x70b939c7, 0x70ad4f6d, 0x70a160ba, - 0x70956db1, 0x70897650, - 0x707d7a98, 0x70717a8a, 0x70657626, 0x70596d6d, 0x704d6060, 0x70414efd, - 0x70353947, 0x70291f3e, - 0x701d00e1, 0x7010de32, 0x7004b731, 0x6ff88bde, 0x6fec5c3b, 0x6fe02846, - 0x6fd3f001, 0x6fc7b36d, - 0x6fbb728a, 0x6faf2d57, 0x6fa2e3d7, 0x6f969608, 0x6f8a43ed, 0x6f7ded84, - 0x6f7192cf, 0x6f6533ce, - 0x6f58d082, 0x6f4c68eb, 0x6f3ffd09, 0x6f338cde, 0x6f271868, 0x6f1a9faa, - 0x6f0e22a3, 0x6f01a155, - 0x6ef51bbe, 0x6ee891e1, 0x6edc03bc, 0x6ecf7152, 0x6ec2daa2, 0x6eb63fad, - 0x6ea9a073, 0x6e9cfcf5, - 0x6e905534, 0x6e83a92f, 0x6e76f8e7, 0x6e6a445d, 0x6e5d8b91, 0x6e50ce84, - 0x6e440d37, 0x6e3747a9, - 0x6e2a7ddb, 0x6e1dafce, 0x6e10dd82, 0x6e0406f8, 0x6df72c30, 0x6dea4d2b, - 0x6ddd69e9, 0x6dd0826a, - 0x6dc396b0, 0x6db6a6ba, 0x6da9b28a, 0x6d9cba1f, 0x6d8fbd7a, 0x6d82bc9d, - 0x6d75b786, 0x6d68ae37, - 0x6d5ba0b0, 0x6d4e8ef2, 0x6d4178fd, 0x6d345ed1, 0x6d274070, 0x6d1a1dda, - 0x6d0cf70f, 0x6cffcc0f, - 0x6cf29cdc, 0x6ce56975, 0x6cd831dc, 0x6ccaf610, 0x6cbdb613, 0x6cb071e4, - 0x6ca32985, 0x6c95dcf6, - 0x6c888c36, 0x6c7b3748, 0x6c6dde2b, 0x6c6080e0, 0x6c531f67, 0x6c45b9c1, - 0x6c384fef, 0x6c2ae1f0, - 0x6c1d6fc6, 0x6c0ff971, 0x6c027ef1, 0x6bf50047, 0x6be77d74, 0x6bd9f677, - 0x6bcc6b53, 0x6bbedc06, - 0x6bb14892, 0x6ba3b0f7, 0x6b961536, 0x6b88754f, 0x6b7ad142, 0x6b6d2911, - 0x6b5f7cbc, 0x6b51cc42, - 0x6b4417a6, 0x6b365ee7, 0x6b28a206, 0x6b1ae103, 0x6b0d1bdf, 0x6aff529a, - 0x6af18536, 0x6ae3b3b2, - 0x6ad5de0f, 0x6ac8044e, 0x6aba266e, 0x6aac4472, 0x6a9e5e58, 0x6a907423, - 0x6a8285d1, 0x6a749365, - 0x6a669cdd, 0x6a58a23c, 0x6a4aa381, 0x6a3ca0ad, 0x6a2e99c0, 0x6a208ebb, - 0x6a127f9f, 0x6a046c6c, - 0x69f65523, 0x69e839c4, 0x69da1a50, 0x69cbf6c7, 0x69bdcf29, 0x69afa378, - 0x69a173b5, 0x69933fde, - 0x698507f6, 0x6976cbfc, 0x69688bf1, 0x695a47d6, 0x694bffab, 0x693db371, - 0x692f6328, 0x69210ed1, - 0x6912b66c, 0x690459fb, 0x68f5f97d, 0x68e794f3, 0x68d92c5d, 0x68cabfbd, - 0x68bc4f13, 0x68adda5f, - 0x689f61a1, 0x6890e4dc, 0x6882640e, 0x6873df38, 0x6865565c, 0x6856c979, - 0x68483891, 0x6839a3a4, - 0x682b0ab1, 0x681c6dbb, 0x680dccc1, 0x67ff27c4, 0x67f07ec5, 0x67e1d1c4, - 0x67d320c1, 0x67c46bbe, - 0x67b5b2bb, 0x67a6f5b8, 0x679834b6, 0x67896fb6, 0x677aa6b8, 0x676bd9bd, - 0x675d08c4, 0x674e33d0, - 0x673f5ae0, 0x67307df5, 0x67219d10, 0x6712b831, 0x6703cf58, 0x66f4e287, - 0x66e5f1be, 0x66d6fcfd, - 0x66c80445, 0x66b90797, 0x66aa06f3, 0x669b0259, 0x668bf9cb, 0x667ced49, - 0x666ddcd3, 0x665ec86b, - 0x664fb010, 0x664093c3, 0x66317385, 0x66224f56, 0x66132738, 0x6603fb2a, - 0x65f4cb2d, 0x65e59742, - 0x65d65f69, 0x65c723a3, 0x65b7e3f1, 0x65a8a052, 0x659958c9, 0x658a0d54, - 0x657abdf6, 0x656b6aae, - 0x655c137d, 0x654cb863, 0x653d5962, 0x652df679, 0x651e8faa, 0x650f24f5, - 0x64ffb65b, 0x64f043dc, - 0x64e0cd78, 0x64d15331, 0x64c1d507, 0x64b252fa, 0x64a2cd0c, 0x6493433c, - 0x6483b58c, 0x647423fb, - 0x64648e8c, 0x6454f53d, 0x64455810, 0x6435b706, 0x6426121e, 0x6416695a, - 0x6406bcba, 0x63f70c3f, - 0x63e757ea, 0x63d79fba, 0x63c7e3b1, 0x63b823cf, 0x63a86015, 0x63989884, - 0x6388cd1b, 0x6378fddc, - 0x63692ac7, 0x635953dd, 0x6349791f, 0x63399a8d, 0x6329b827, 0x6319d1ef, - 0x6309e7e4, 0x62f9fa09, - 0x62ea085c, 0x62da12df, 0x62ca1992, 0x62ba1c77, 0x62aa1b8d, 0x629a16d5, - 0x628a0e50, 0x627a01fe, - 0x6269f1e1, 0x6259ddf8, 0x6249c645, 0x6239aac7, 0x62298b81, 0x62196871, - 0x62094199, 0x61f916f9, - 0x61e8e893, 0x61d8b666, 0x61c88074, 0x61b846bc, 0x61a80940, 0x6197c800, - 0x618782fd, 0x61773a37, - 0x6166edb0, 0x61569d67, 0x6146495d, 0x6135f193, 0x6125960a, 0x611536c2, - 0x6104d3bc, 0x60f46cf9, - 0x60e40278, 0x60d3943b, 0x60c32243, 0x60b2ac8f, 0x60a23322, 0x6091b5fa, - 0x60813519, 0x6070b080, - 0x6060282f, 0x604f9c27, 0x603f0c69, 0x602e78f4, 0x601de1ca, 0x600d46ec, - 0x5ffca859, 0x5fec0613, - 0x5fdb601b, 0x5fcab670, 0x5fba0914, 0x5fa95807, 0x5f98a34a, 0x5f87eade, - 0x5f772ec2, 0x5f666ef9, - 0x5f55ab82, 0x5f44e45e, 0x5f34198e, 0x5f234b12, 0x5f1278eb, 0x5f01a31a, - 0x5ef0c99f, 0x5edfec7b, - 0x5ecf0baf, 0x5ebe273b, 0x5ead3f1f, 0x5e9c535e, 0x5e8b63f7, 0x5e7a70ea, - 0x5e697a39, 0x5e587fe5, - 0x5e4781ed, 0x5e368053, 0x5e257b17, 0x5e147239, 0x5e0365bb, 0x5df2559e, - 0x5de141e1, 0x5dd02a85, - 0x5dbf0f8c, 0x5dadf0f5, 0x5d9ccec2, 0x5d8ba8f3, 0x5d7a7f88, 0x5d695283, - 0x5d5821e4, 0x5d46edac, - 0x5d35b5db, 0x5d247a72, 0x5d133b72, 0x5d01f8dc, 0x5cf0b2af, 0x5cdf68ed, - 0x5cce1b97, 0x5cbccaac, - 0x5cab762f, 0x5c9a1e1e, 0x5c88c27c, 0x5c776348, 0x5c660084, 0x5c549a30, - 0x5c43304d, 0x5c31c2db, - 0x5c2051db, 0x5c0edd4e, 0x5bfd6534, 0x5bebe98e, 0x5bda6a5d, 0x5bc8e7a2, - 0x5bb7615d, 0x5ba5d78e, - 0x5b944a37, 0x5b82b958, 0x5b7124f2, 0x5b5f8d06, 0x5b4df193, 0x5b3c529c, - 0x5b2ab020, 0x5b190a20, - 0x5b07609d, 0x5af5b398, 0x5ae40311, 0x5ad24f09, 0x5ac09781, 0x5aaedc78, - 0x5a9d1df1, 0x5a8b5bec, - 0x5a799669, 0x5a67cd69, 0x5a5600ec, 0x5a4430f5, 0x5a325d82, 0x5a208695, - 0x5a0eac2e, 0x59fcce4f, - 0x59eaecf8, 0x59d90829, 0x59c71fe3, 0x59b53427, 0x59a344f6, 0x59915250, - 0x597f5c36, 0x596d62a9, - 0x595b65aa, 0x59496538, 0x59376155, 0x59255a02, 0x59134f3e, 0x5901410c, - 0x58ef2f6b, 0x58dd1a5d, - 0x58cb01e1, 0x58b8e5f9, 0x58a6c6a5, 0x5894a3e7, 0x58827dbe, 0x5870542c, - 0x585e2730, 0x584bf6cd, - 0x5839c302, 0x58278bd1, 0x58155139, 0x5803133c, 0x57f0d1da, 0x57de8d15, - 0x57cc44ec, 0x57b9f960, - 0x57a7aa73, 0x57955825, 0x57830276, 0x5770a968, 0x575e4cfa, 0x574bed2f, - 0x57398a05, 0x5727237f, - 0x5714b99d, 0x57024c5f, 0x56efdbc7, 0x56dd67d4, 0x56caf088, 0x56b875e4, - 0x56a5f7e7, 0x56937694, - 0x5680f1ea, 0x566e69ea, 0x565bde95, 0x56494fec, 0x5636bdef, 0x5624289f, - 0x56118ffe, 0x55fef40a, - 0x55ec54c6, 0x55d9b232, 0x55c70c4f, 0x55b4631d, 0x55a1b69d, 0x558f06d0, - 0x557c53b6, 0x55699d51, - 0x5556e3a1, 0x554426a7, 0x55316663, 0x551ea2d6, 0x550bdc01, 0x54f911e5, - 0x54e64482, 0x54d373d9, - 0x54c09feb, 0x54adc8b8, 0x549aee42, 0x54881089, 0x54752f8d, 0x54624b50, - 0x544f63d2, 0x543c7914, - 0x54298b17, 0x541699db, 0x5403a561, 0x53f0adaa, 0x53ddb2b6, 0x53cab486, - 0x53b7b31c, 0x53a4ae77, - 0x5391a699, 0x537e9b82, 0x536b8d33, 0x53587bad, 0x534566f0, 0x53324efd, - 0x531f33d5, 0x530c1579, - 0x52f8f3e9, 0x52e5cf27, 0x52d2a732, 0x52bf7c0b, 0x52ac4db4, 0x52991c2d, - 0x5285e777, 0x5272af92, - 0x525f7480, 0x524c3640, 0x5238f4d4, 0x5225b03d, 0x5212687b, 0x51ff1d8f, - 0x51ebcf7a, 0x51d87e3c, - 0x51c529d7, 0x51b1d24a, 0x519e7797, 0x518b19bf, 0x5177b8c2, 0x516454a0, - 0x5150ed5c, 0x513d82f4, - 0x512a156b, 0x5116a4c1, 0x510330f7, 0x50efba0d, 0x50dc4005, 0x50c8c2de, - 0x50b5429a, 0x50a1bf39, - 0x508e38bd, 0x507aaf25, 0x50672273, 0x505392a8, 0x503fffc4, 0x502c69c8, - 0x5018d0b4, 0x5005348a, - 0x4ff1954b, 0x4fddf2f6, 0x4fca4d8d, 0x4fb6a510, 0x4fa2f981, 0x4f8f4ae0, - 0x4f7b992d, 0x4f67e46a, - 0x4f542c98, 0x4f4071b6, 0x4f2cb3c7, 0x4f18f2c9, 0x4f052ec0, 0x4ef167aa, - 0x4edd9d89, 0x4ec9d05e, - 0x4eb60029, 0x4ea22ceb, 0x4e8e56a5, 0x4e7a7d58, 0x4e66a105, 0x4e52c1ab, - 0x4e3edf4d, 0x4e2af9ea, - 0x4e171184, 0x4e03261b, 0x4def37b0, 0x4ddb4644, 0x4dc751d8, 0x4db35a6c, - 0x4d9f6001, 0x4d8b6298, - 0x4d776231, 0x4d635ece, 0x4d4f5870, 0x4d3b4f16, 0x4d2742c2, 0x4d133374, - 0x4cff212e, 0x4ceb0bf0, - 0x4cd6f3bb, 0x4cc2d88f, 0x4caeba6e, 0x4c9a9958, 0x4c86754e, 0x4c724e50, - 0x4c5e2460, 0x4c49f77f, - 0x4c35c7ac, 0x4c2194e9, 0x4c0d5f37, 0x4bf92697, 0x4be4eb08, 0x4bd0ac8d, - 0x4bbc6b25, 0x4ba826d1, - 0x4b93df93, 0x4b7f956b, 0x4b6b485a, 0x4b56f861, 0x4b42a580, 0x4b2e4fb8, - 0x4b19f70a, 0x4b059b77, - 0x4af13d00, 0x4adcdba5, 0x4ac87767, 0x4ab41046, 0x4a9fa645, 0x4a8b3963, - 0x4a76c9a2, 0x4a625701, - 0x4a4de182, 0x4a396926, 0x4a24edee, 0x4a106fda, 0x49fbeeea, 0x49e76b21, - 0x49d2e47e, 0x49be5b02, - 0x49a9ceaf, 0x49953f84, 0x4980ad84, 0x496c18ae, 0x49578103, 0x4942e684, - 0x492e4933, 0x4919a90f, - 0x4905061a, 0x48f06054, 0x48dbb7be, 0x48c70c59, 0x48b25e25, 0x489dad25, - 0x4888f957, 0x487442be, - 0x485f8959, 0x484acd2a, 0x48360e32, 0x48214c71, 0x480c87e8, 0x47f7c099, - 0x47e2f682, 0x47ce29a7, - 0x47b95a06, 0x47a487a2, 0x478fb27b, 0x477ada91, 0x4765ffe6, 0x4751227a, - 0x473c424e, 0x47275f63, - 0x471279ba, 0x46fd9154, 0x46e8a631, 0x46d3b852, 0x46bec7b8, 0x46a9d464, - 0x4694de56, 0x467fe590, - 0x466aea12, 0x4655ebdd, 0x4640eaf2, 0x462be751, 0x4616e0fc, 0x4601d7f3, - 0x45eccc37, 0x45d7bdc9, - 0x45c2acaa, 0x45ad98da, 0x4598825a, 0x4583692c, 0x456e4d4f, 0x45592ec6, - 0x45440d90, 0x452ee9ae, - 0x4519c321, 0x450499eb, 0x44ef6e0b, 0x44da3f83, 0x44c50e53, 0x44afda7d, - 0x449aa400, 0x44856adf, - 0x44702f19, 0x445af0b0, 0x4445afa4, 0x44306bf6, 0x441b25a8, 0x4405dcb9, - 0x43f0912b, 0x43db42fe, - 0x43c5f234, 0x43b09ecc, 0x439b48c9, 0x4385f02a, 0x437094f1, 0x435b371f, - 0x4345d6b3, 0x433073b0, - 0x431b0e15, 0x4305a5e5, 0x42f03b1e, 0x42dacdc3, 0x42c55dd4, 0x42afeb53, - 0x429a763f, 0x4284fe99, - 0x426f8463, 0x425a079e, 0x42448849, 0x422f0667, 0x421981f7, 0x4203fafb, - 0x41ee7174, 0x41d8e561, - 0x41c356c5, 0x41adc5a0, 0x419831f3, 0x41829bbe, 0x416d0302, 0x415767c1, - 0x4141c9fb, 0x412c29b1, - 0x411686e4, 0x4100e194, 0x40eb39c3, 0x40d58f71, 0x40bfe29f, 0x40aa334e, - 0x4094817f, 0x407ecd32, - 0x40691669, 0x40535d24, 0x403da165, 0x4027e32b, 0x40122278, 0x3ffc5f4d, - 0x3fe699aa, 0x3fd0d191, - 0x3fbb0702, 0x3fa539fd, 0x3f8f6a85, 0x3f799899, 0x3f63c43b, 0x3f4ded6b, - 0x3f38142a, 0x3f22387a, - 0x3f0c5a5a, 0x3ef679cc, 0x3ee096d1, 0x3ecab169, 0x3eb4c995, 0x3e9edf57, - 0x3e88f2ae, 0x3e73039d, - 0x3e5d1222, 0x3e471e41, 0x3e3127f9, 0x3e1b2f4a, 0x3e053437, 0x3def36c0, - 0x3dd936e6, 0x3dc334a9, - 0x3dad300b, 0x3d97290b, 0x3d811fac, 0x3d6b13ee, 0x3d5505d2, 0x3d3ef559, - 0x3d28e282, 0x3d12cd51, - 0x3cfcb5c4, 0x3ce69bde, 0x3cd07f9f, 0x3cba6107, 0x3ca44018, 0x3c8e1cd3, - 0x3c77f737, 0x3c61cf48, - 0x3c4ba504, 0x3c35786d, 0x3c1f4983, 0x3c091849, 0x3bf2e4be, 0x3bdcaee3, - 0x3bc676b9, 0x3bb03c42, - 0x3b99ff7d, 0x3b83c06c, 0x3b6d7f10, 0x3b573b69, 0x3b40f579, 0x3b2aad3f, - 0x3b1462be, 0x3afe15f6, - 0x3ae7c6e7, 0x3ad17593, 0x3abb21fb, 0x3aa4cc1e, 0x3a8e7400, 0x3a78199f, - 0x3a61bcfd, 0x3a4b5e1b, - 0x3a34fcf9, 0x3a1e9999, 0x3a0833fc, 0x39f1cc21, 0x39db620b, 0x39c4f5ba, - 0x39ae872f, 0x3998166a, - 0x3981a36d, 0x396b2e38, 0x3954b6cd, 0x393e3d2c, 0x3927c155, 0x3911434b, - 0x38fac30e, 0x38e4409e, - 0x38cdbbfc, 0x38b7352a, 0x38a0ac29, 0x388a20f8, 0x38739399, 0x385d040d, - 0x38467255, 0x382fde72, - 0x38194864, 0x3802b02c, 0x37ec15cb, 0x37d57943, 0x37beda93, 0x37a839be, - 0x379196c3, 0x377af1a3, - 0x37644a60, 0x374da0fa, 0x3736f573, 0x372047ca, 0x37099802, 0x36f2e61a, - 0x36dc3214, 0x36c57bf0, - 0x36aec3b0, 0x36980954, 0x36814cde, 0x366a8e4d, 0x3653cda3, 0x363d0ae2, - 0x36264609, 0x360f7f19, - 0x35f8b614, 0x35e1eafa, 0x35cb1dcc, 0x35b44e8c, 0x359d7d39, 0x3586a9d5, - 0x356fd461, 0x3558fcde, - 0x3542234c, 0x352b47ad, 0x35146a00, 0x34fd8a48, 0x34e6a885, 0x34cfc4b7, - 0x34b8dee1, 0x34a1f702, - 0x348b0d1c, 0x3474212f, 0x345d333c, 0x34464345, 0x342f5149, 0x34185d4b, - 0x3401674a, 0x33ea6f48, - 0x33d37546, 0x33bc7944, 0x33a57b44, 0x338e7b46, 0x3377794b, 0x33607554, - 0x33496f62, 0x33326776, - 0x331b5d91, 0x330451b3, 0x32ed43de, 0x32d63412, 0x32bf2250, 0x32a80e99, - 0x3290f8ef, 0x3279e151, - 0x3262c7c1, 0x324bac40, 0x32348ecf, 0x321d6f6e, 0x32064e1e, 0x31ef2ae1, - 0x31d805b7, 0x31c0dea1, - 0x31a9b5a0, 0x31928ab4, 0x317b5de0, 0x31642f23, 0x314cfe7f, 0x3135cbf4, - 0x311e9783, 0x3107612e, - 0x30f028f4, 0x30d8eed8, 0x30c1b2da, 0x30aa74fa, 0x3093353a, 0x307bf39b, - 0x3064b01d, 0x304d6ac1, - 0x30362389, 0x301eda75, 0x30078f86, 0x2ff042bd, 0x2fd8f41b, 0x2fc1a3a0, - 0x2faa514f, 0x2f92fd26, - 0x2f7ba729, 0x2f644f56, 0x2f4cf5b0, 0x2f359a37, 0x2f1e3ced, 0x2f06ddd1, - 0x2eef7ce5, 0x2ed81a29, - 0x2ec0b5a0, 0x2ea94f49, 0x2e91e725, 0x2e7a7d36, 0x2e63117c, 0x2e4ba3f8, - 0x2e3434ac, 0x2e1cc397, - 0x2e0550bb, 0x2deddc19, 0x2dd665b2, 0x2dbeed86, 0x2da77397, 0x2d8ff7e5, - 0x2d787a72, 0x2d60fb3e, - 0x2d497a4a, 0x2d31f797, 0x2d1a7325, 0x2d02ecf7, 0x2ceb650d, 0x2cd3db67, - 0x2cbc5006, 0x2ca4c2ed, - 0x2c8d341a, 0x2c75a390, 0x2c5e114f, 0x2c467d58, 0x2c2ee7ad, 0x2c17504d, - 0x2bffb73a, 0x2be81c74, - 0x2bd07ffe, 0x2bb8e1d7, 0x2ba14200, 0x2b89a07b, 0x2b71fd48, 0x2b5a5868, - 0x2b42b1dd, 0x2b2b09a6, - 0x2b135fc6, 0x2afbb43c, 0x2ae4070a, 0x2acc5831, 0x2ab4a7b1, 0x2a9cf58c, - 0x2a8541c3, 0x2a6d8c55, - 0x2a55d545, 0x2a3e1c93, 0x2a266240, 0x2a0ea64d, 0x29f6e8bb, 0x29df298b, - 0x29c768be, 0x29afa654, - 0x2997e24f, 0x29801caf, 0x29685576, 0x29508ca4, 0x2938c23a, 0x2920f63a, - 0x290928a3, 0x28f15978, - 0x28d988b8, 0x28c1b666, 0x28a9e281, 0x28920d0a, 0x287a3604, 0x28625d6d, - 0x284a8349, 0x2832a796, - 0x281aca57, 0x2802eb8c, 0x27eb0b36, 0x27d32956, 0x27bb45ed, 0x27a360fc, - 0x278b7a84, 0x27739285, - 0x275ba901, 0x2743bdf9, 0x272bd16d, 0x2713e35f, 0x26fbf3ce, 0x26e402bd, - 0x26cc102d, 0x26b41c1d, - 0x269c268f, 0x26842f84, 0x266c36fe, 0x26543cfb, 0x263c417f, 0x26244489, - 0x260c461b, 0x25f44635, - 0x25dc44d9, 0x25c44207, 0x25ac3dc0, 0x25943806, 0x257c30d8, 0x25642839, - 0x254c1e28, 0x253412a8, - 0x251c05b8, 0x2503f75a, 0x24ebe78f, 0x24d3d657, 0x24bbc3b4, 0x24a3afa6, - 0x248b9a2f, 0x2473834f, - 0x245b6b07, 0x24435158, 0x242b3644, 0x241319ca, 0x23fafbec, 0x23e2dcac, - 0x23cabc09, 0x23b29a05, - 0x239a76a0, 0x238251dd, 0x236a2bba, 0x2352043b, 0x2339db5e, 0x2321b126, - 0x23098593, 0x22f158a7, - 0x22d92a61, 0x22c0fac4, 0x22a8c9cf, 0x22909785, 0x227863e5, 0x22602ef1, - 0x2247f8aa, 0x222fc111, - 0x22178826, 0x21ff4dea, 0x21e71260, 0x21ced586, 0x21b6975f, 0x219e57eb, - 0x2186172b, 0x216dd521, - 0x215591cc, 0x213d4d2f, 0x21250749, 0x210cc01d, 0x20f477aa, 0x20dc2df2, - 0x20c3e2f5, 0x20ab96b5, - 0x20934933, 0x207afa6f, 0x2062aa6b, 0x204a5927, 0x203206a4, 0x2019b2e4, - 0x20015de7, 0x1fe907ae, - 0x1fd0b03a, 0x1fb8578b, 0x1f9ffda4, 0x1f87a285, 0x1f6f462f, 0x1f56e8a2, - 0x1f3e89e0, 0x1f2629ea, - 0x1f0dc8c0, 0x1ef56664, 0x1edd02d6, 0x1ec49e17, 0x1eac3829, 0x1e93d10c, - 0x1e7b68c2, 0x1e62ff4a, - 0x1e4a94a7, 0x1e3228d9, 0x1e19bbe0, 0x1e014dbf, 0x1de8de75, 0x1dd06e04, - 0x1db7fc6d, 0x1d9f89b1, - 0x1d8715d0, 0x1d6ea0cc, 0x1d562aa6, 0x1d3db35e, 0x1d253af5, 0x1d0cc16c, - 0x1cf446c5, 0x1cdbcb00, - 0x1cc34e1f, 0x1caad021, 0x1c925109, 0x1c79d0d6, 0x1c614f8b, 0x1c48cd27, - 0x1c3049ac, 0x1c17c51b, - 0x1bff3f75, 0x1be6b8ba, 0x1bce30ec, 0x1bb5a80c, 0x1b9d1e1a, 0x1b849317, - 0x1b6c0705, 0x1b5379e5, - 0x1b3aebb6, 0x1b225c7b, 0x1b09cc34, 0x1af13ae3, 0x1ad8a887, 0x1ac01522, - 0x1aa780b6, 0x1a8eeb42, - 0x1a7654c8, 0x1a5dbd49, 0x1a4524c6, 0x1a2c8b3f, 0x1a13f0b6, 0x19fb552c, - 0x19e2b8a2, 0x19ca1b17, - 0x19b17c8f, 0x1998dd09, 0x19803c86, 0x19679b07, 0x194ef88e, 0x1936551b, - 0x191db0af, 0x19050b4b, - 0x18ec64f0, 0x18d3bda0, 0x18bb155a, 0x18a26c20, 0x1889c1f3, 0x187116d4, - 0x18586ac3, 0x183fbdc3, - 0x18270fd3, 0x180e60f4, 0x17f5b129, 0x17dd0070, 0x17c44ecd, 0x17ab9c3e, - 0x1792e8c6, 0x177a3466, - 0x17617f1d, 0x1748c8ee, 0x173011d9, 0x171759df, 0x16fea102, 0x16e5e741, - 0x16cd2c9f, 0x16b4711b, - 0x169bb4b7, 0x1682f774, 0x166a3953, 0x16517a55, 0x1638ba7a, 0x161ff9c4, - 0x16073834, 0x15ee75cb, - 0x15d5b288, 0x15bcee6f, 0x15a4297f, 0x158b63b9, 0x15729d1f, 0x1559d5b1, - 0x15410d70, 0x1528445d, - 0x150f7a7a, 0x14f6afc7, 0x14dde445, 0x14c517f4, 0x14ac4ad7, 0x14937cee, - 0x147aae3a, 0x1461debc, - 0x14490e74, 0x14303d65, 0x14176b8e, 0x13fe98f1, 0x13e5c58e, 0x13ccf167, - 0x13b41c7d, 0x139b46d0, - 0x13827062, 0x13699933, 0x1350c144, 0x1337e897, 0x131f0f2c, 0x13063505, - 0x12ed5a21, 0x12d47e83, - 0x12bba22b, 0x12a2c51b, 0x1289e752, 0x127108d2, 0x1258299c, 0x123f49b2, - 0x12266913, 0x120d87c1, - 0x11f4a5bd, 0x11dbc307, 0x11c2dfa2, 0x11a9fb8d, 0x119116c9, 0x11783159, - 0x115f4b3c, 0x11466473, - 0x112d7d00, 0x111494e4, 0x10fbac1e, 0x10e2c2b2, 0x10c9d89e, 0x10b0ede5, - 0x10980287, 0x107f1686, - 0x106629e1, 0x104d3c9b, 0x10344eb4, 0x101b602d, 0x10027107, 0xfe98143, - 0xfd090e1, 0xfb79fe4, - 0xf9eae4c, 0xf85bc19, 0xf6cc94e, 0xf53d5ea, 0xf3ae1ee, 0xf21ed5d, 0xf08f836, - 0xef0027b, - 0xed70c2c, 0xebe154b, 0xea51dd8, 0xe8c25d5, 0xe732d42, 0xe5a3421, 0xe413a72, - 0xe284036, - 0xe0f456f, 0xdf64a1c, 0xddd4e40, 0xdc451dc, 0xdab54ef, 0xd92577b, 0xd795982, - 0xd605b03, - 0xd475c00, 0xd2e5c7b, 0xd155c73, 0xcfc5bea, 0xce35ae1, 0xcca5959, 0xcb15752, - 0xc9854cf, - 0xc7f51cf, 0xc664e53, 0xc4d4a5d, 0xc3445ee, 0xc1b4107, 0xc023ba7, 0xbe935d2, - 0xbd02f87, - 0xbb728c7, 0xb9e2193, 0xb8519ed, 0xb6c11d5, 0xb53094d, 0xb3a0055, 0xb20f6ee, - 0xb07ed19, - 0xaeee2d7, 0xad5d829, 0xabccd11, 0xaa3c18e, 0xa8ab5a2, 0xa71a94f, 0xa589c94, - 0xa3f8f73, - 0xa2681ed, 0xa0d7403, 0x9f465b5, 0x9db5706, 0x9c247f5, 0x9a93884, 0x99028b3, - 0x9771884, - 0x95e07f8, 0x944f70f, 0x92be5ca, 0x912d42c, 0x8f9c233, 0x8e0afe2, 0x8c79d3a, - 0x8ae8a3a, - 0x89576e5, 0x87c633c, 0x8634f3e, 0x84a3aee, 0x831264c, 0x8181159, 0x7fefc16, - 0x7e5e685, - 0x7ccd0a5, 0x7b3ba78, 0x79aa400, 0x7818d3c, 0x768762e, 0x74f5ed7, 0x7364738, - 0x71d2f52, - 0x7041726, 0x6eafeb4, 0x6d1e5fe, 0x6b8cd05, 0x69fb3c9, 0x6869a4c, 0x66d808f, - 0x6546692, - 0x63b4c57, 0x62231de, 0x6091729, 0x5effc38, 0x5d6e10c, 0x5bdc5a7, 0x5a4aa09, - 0x58b8e34, - 0x5727228, 0x55955e6, 0x540396f, 0x5271cc4, 0x50dffe7, 0x4f4e2d8, 0x4dbc597, - 0x4c2a827, - 0x4a98a88, 0x4906cbb, 0x4774ec1, 0x45e309a, 0x4451249, 0x42bf3cd, 0x412d528, - 0x3f9b65b, - 0x3e09767, 0x3c7784d, 0x3ae590d, 0x39539a9, 0x37c1a22, 0x362fa78, 0x349daac, - 0x330bac1, - 0x3179ab5, 0x2fe7a8c, 0x2e55a44, 0x2cc39e1, 0x2b31961, 0x299f8c7, 0x280d813, - 0x267b747, - 0x24e9662, 0x2357567, 0x21c5457, 0x2033331, 0x1ea11f7, 0x1d0f0ab, 0x1b7cf4d, - 0x19eaddd, - 0x1858c5e, 0x16c6ad0, 0x1534934, 0x13a278a, 0x12105d5, 0x107e414, 0xeec249, - 0xd5a075, - 0xbc7e99, 0xa35cb5, 0x8a3acb, 0x7118dc, 0x57f6e9, 0x3ed4f2, 0x25b2f8, - 0xc90fe, - -}; - -static const q31_t cos_factorsQ31_8192[8192] = { - 0x7ffffff6, 0x7fffffa7, 0x7fffff09, 0x7ffffe1c, 0x7ffffce1, 0x7ffffb56, - 0x7ffff97c, 0x7ffff753, - 0x7ffff4dc, 0x7ffff215, 0x7fffef00, 0x7fffeb9b, 0x7fffe7e8, 0x7fffe3e5, - 0x7fffdf94, 0x7fffdaf3, - 0x7fffd604, 0x7fffd0c6, 0x7fffcb39, 0x7fffc55c, 0x7fffbf31, 0x7fffb8b7, - 0x7fffb1ee, 0x7fffaad6, - 0x7fffa36f, 0x7fff9bb9, 0x7fff93b4, 0x7fff8b61, 0x7fff82be, 0x7fff79cc, - 0x7fff708b, 0x7fff66fc, - 0x7fff5d1d, 0x7fff52ef, 0x7fff4873, 0x7fff3da8, 0x7fff328d, 0x7fff2724, - 0x7fff1b6b, 0x7fff0f64, - 0x7fff030e, 0x7ffef669, 0x7ffee975, 0x7ffedc31, 0x7ffece9f, 0x7ffec0be, - 0x7ffeb28e, 0x7ffea40f, - 0x7ffe9542, 0x7ffe8625, 0x7ffe76b9, 0x7ffe66fe, 0x7ffe56f5, 0x7ffe469c, - 0x7ffe35f4, 0x7ffe24fe, - 0x7ffe13b8, 0x7ffe0224, 0x7ffdf040, 0x7ffdde0e, 0x7ffdcb8d, 0x7ffdb8bc, - 0x7ffda59d, 0x7ffd922f, - 0x7ffd7e72, 0x7ffd6a66, 0x7ffd560b, 0x7ffd4161, 0x7ffd2c68, 0x7ffd1720, - 0x7ffd0189, 0x7ffceba4, - 0x7ffcd56f, 0x7ffcbeeb, 0x7ffca819, 0x7ffc90f7, 0x7ffc7987, 0x7ffc61c7, - 0x7ffc49b9, 0x7ffc315b, - 0x7ffc18af, 0x7ffbffb4, 0x7ffbe66a, 0x7ffbccd0, 0x7ffbb2e8, 0x7ffb98b1, - 0x7ffb7e2b, 0x7ffb6356, - 0x7ffb4833, 0x7ffb2cc0, 0x7ffb10fe, 0x7ffaf4ed, 0x7ffad88e, 0x7ffabbdf, - 0x7ffa9ee2, 0x7ffa8195, - 0x7ffa63fa, 0x7ffa460f, 0x7ffa27d6, 0x7ffa094e, 0x7ff9ea76, 0x7ff9cb50, - 0x7ff9abdb, 0x7ff98c17, - 0x7ff96c04, 0x7ff94ba2, 0x7ff92af1, 0x7ff909f2, 0x7ff8e8a3, 0x7ff8c705, - 0x7ff8a519, 0x7ff882dd, - 0x7ff86053, 0x7ff83d79, 0x7ff81a51, 0x7ff7f6da, 0x7ff7d313, 0x7ff7aefe, - 0x7ff78a9a, 0x7ff765e7, - 0x7ff740e5, 0x7ff71b94, 0x7ff6f5f4, 0x7ff6d005, 0x7ff6a9c8, 0x7ff6833b, - 0x7ff65c5f, 0x7ff63535, - 0x7ff60dbb, 0x7ff5e5f3, 0x7ff5bddc, 0x7ff59576, 0x7ff56cc0, 0x7ff543bc, - 0x7ff51a69, 0x7ff4f0c7, - 0x7ff4c6d6, 0x7ff49c96, 0x7ff47208, 0x7ff4472a, 0x7ff41bfd, 0x7ff3f082, - 0x7ff3c4b7, 0x7ff3989e, - 0x7ff36c36, 0x7ff33f7e, 0x7ff31278, 0x7ff2e523, 0x7ff2b77f, 0x7ff2898c, - 0x7ff25b4a, 0x7ff22cb9, - 0x7ff1fdd9, 0x7ff1ceab, 0x7ff19f2d, 0x7ff16f61, 0x7ff13f45, 0x7ff10edb, - 0x7ff0de22, 0x7ff0ad19, - 0x7ff07bc2, 0x7ff04a1c, 0x7ff01827, 0x7fefe5e4, 0x7fefb351, 0x7fef806f, - 0x7fef4d3e, 0x7fef19bf, - 0x7feee5f0, 0x7feeb1d3, 0x7fee7d67, 0x7fee48ac, 0x7fee13a1, 0x7fedde48, - 0x7feda8a0, 0x7fed72aa, - 0x7fed3c64, 0x7fed05cf, 0x7fecceec, 0x7fec97b9, 0x7fec6038, 0x7fec2867, - 0x7febf048, 0x7febb7da, - 0x7feb7f1d, 0x7feb4611, 0x7feb0cb6, 0x7fead30c, 0x7fea9914, 0x7fea5ecc, - 0x7fea2436, 0x7fe9e950, - 0x7fe9ae1c, 0x7fe97299, 0x7fe936c7, 0x7fe8faa6, 0x7fe8be36, 0x7fe88177, - 0x7fe84469, 0x7fe8070d, - 0x7fe7c961, 0x7fe78b67, 0x7fe74d1e, 0x7fe70e85, 0x7fe6cf9e, 0x7fe69068, - 0x7fe650e3, 0x7fe61110, - 0x7fe5d0ed, 0x7fe5907b, 0x7fe54fbb, 0x7fe50eac, 0x7fe4cd4d, 0x7fe48ba0, - 0x7fe449a4, 0x7fe40759, - 0x7fe3c4bf, 0x7fe381d7, 0x7fe33e9f, 0x7fe2fb19, 0x7fe2b743, 0x7fe2731f, - 0x7fe22eac, 0x7fe1e9ea, - 0x7fe1a4d9, 0x7fe15f79, 0x7fe119cb, 0x7fe0d3cd, 0x7fe08d81, 0x7fe046e5, - 0x7fdffffb, 0x7fdfb8c2, - 0x7fdf713a, 0x7fdf2963, 0x7fdee13e, 0x7fde98c9, 0x7fde5006, 0x7fde06f3, - 0x7fddbd92, 0x7fdd73e2, - 0x7fdd29e3, 0x7fdcdf95, 0x7fdc94f9, 0x7fdc4a0d, 0x7fdbfed3, 0x7fdbb349, - 0x7fdb6771, 0x7fdb1b4a, - 0x7fdaced4, 0x7fda820f, 0x7fda34fc, 0x7fd9e799, 0x7fd999e8, 0x7fd94be8, - 0x7fd8fd98, 0x7fd8aefa, - 0x7fd8600e, 0x7fd810d2, 0x7fd7c147, 0x7fd7716e, 0x7fd72146, 0x7fd6d0cf, - 0x7fd68009, 0x7fd62ef4, - 0x7fd5dd90, 0x7fd58bdd, 0x7fd539dc, 0x7fd4e78c, 0x7fd494ed, 0x7fd441ff, - 0x7fd3eec2, 0x7fd39b36, - 0x7fd3475c, 0x7fd2f332, 0x7fd29eba, 0x7fd249f3, 0x7fd1f4dd, 0x7fd19f78, - 0x7fd149c5, 0x7fd0f3c2, - 0x7fd09d71, 0x7fd046d1, 0x7fcfefe2, 0x7fcf98a4, 0x7fcf4117, 0x7fcee93c, - 0x7fce9112, 0x7fce3898, - 0x7fcddfd0, 0x7fcd86b9, 0x7fcd2d54, 0x7fccd39f, 0x7fcc799c, 0x7fcc1f4a, - 0x7fcbc4a9, 0x7fcb69b9, - 0x7fcb0e7a, 0x7fcab2ed, 0x7fca5710, 0x7fc9fae5, 0x7fc99e6b, 0x7fc941a2, - 0x7fc8e48b, 0x7fc88724, - 0x7fc8296f, 0x7fc7cb6b, 0x7fc76d18, 0x7fc70e76, 0x7fc6af86, 0x7fc65046, - 0x7fc5f0b8, 0x7fc590db, - 0x7fc530af, 0x7fc4d035, 0x7fc46f6b, 0x7fc40e53, 0x7fc3acec, 0x7fc34b36, - 0x7fc2e931, 0x7fc286de, - 0x7fc2243b, 0x7fc1c14a, 0x7fc15e0a, 0x7fc0fa7b, 0x7fc0969e, 0x7fc03271, - 0x7fbfcdf6, 0x7fbf692c, - 0x7fbf0414, 0x7fbe9eac, 0x7fbe38f6, 0x7fbdd2f0, 0x7fbd6c9c, 0x7fbd05fa, - 0x7fbc9f08, 0x7fbc37c8, - 0x7fbbd039, 0x7fbb685b, 0x7fbb002e, 0x7fba97b2, 0x7fba2ee8, 0x7fb9c5cf, - 0x7fb95c67, 0x7fb8f2b0, - 0x7fb888ab, 0x7fb81e57, 0x7fb7b3b4, 0x7fb748c2, 0x7fb6dd81, 0x7fb671f2, - 0x7fb60614, 0x7fb599e7, - 0x7fb52d6b, 0x7fb4c0a1, 0x7fb45387, 0x7fb3e61f, 0x7fb37869, 0x7fb30a63, - 0x7fb29c0f, 0x7fb22d6c, - 0x7fb1be7a, 0x7fb14f39, 0x7fb0dfaa, 0x7fb06fcb, 0x7fafff9e, 0x7faf8f23, - 0x7faf1e58, 0x7faead3f, - 0x7fae3bd7, 0x7fadca20, 0x7fad581b, 0x7face5c6, 0x7fac7323, 0x7fac0031, - 0x7fab8cf1, 0x7fab1962, - 0x7faaa584, 0x7faa3157, 0x7fa9bcdb, 0x7fa94811, 0x7fa8d2f8, 0x7fa85d90, - 0x7fa7e7d9, 0x7fa771d4, - 0x7fa6fb80, 0x7fa684dd, 0x7fa60dec, 0x7fa596ac, 0x7fa51f1d, 0x7fa4a73f, - 0x7fa42f12, 0x7fa3b697, - 0x7fa33dcd, 0x7fa2c4b5, 0x7fa24b4d, 0x7fa1d197, 0x7fa15792, 0x7fa0dd3f, - 0x7fa0629c, 0x7f9fe7ab, - 0x7f9f6c6b, 0x7f9ef0dd, 0x7f9e7500, 0x7f9df8d4, 0x7f9d7c59, 0x7f9cff90, - 0x7f9c8278, 0x7f9c0511, - 0x7f9b875b, 0x7f9b0957, 0x7f9a8b04, 0x7f9a0c62, 0x7f998d72, 0x7f990e33, - 0x7f988ea5, 0x7f980ec8, - 0x7f978e9d, 0x7f970e23, 0x7f968d5b, 0x7f960c43, 0x7f958add, 0x7f950929, - 0x7f948725, 0x7f9404d3, - 0x7f938232, 0x7f92ff43, 0x7f927c04, 0x7f91f878, 0x7f91749c, 0x7f90f072, - 0x7f906bf9, 0x7f8fe731, - 0x7f8f621b, 0x7f8edcb6, 0x7f8e5702, 0x7f8dd0ff, 0x7f8d4aae, 0x7f8cc40f, - 0x7f8c3d20, 0x7f8bb5e3, - 0x7f8b2e57, 0x7f8aa67d, 0x7f8a1e54, 0x7f8995dc, 0x7f890d15, 0x7f888400, - 0x7f87fa9c, 0x7f8770ea, - 0x7f86e6e9, 0x7f865c99, 0x7f85d1fa, 0x7f85470d, 0x7f84bbd1, 0x7f843047, - 0x7f83a46e, 0x7f831846, - 0x7f828bcf, 0x7f81ff0a, 0x7f8171f6, 0x7f80e494, 0x7f8056e3, 0x7f7fc8e3, - 0x7f7f3a95, 0x7f7eabf8, - 0x7f7e1d0c, 0x7f7d8dd2, 0x7f7cfe49, 0x7f7c6e71, 0x7f7bde4b, 0x7f7b4dd6, - 0x7f7abd13, 0x7f7a2c01, - 0x7f799aa0, 0x7f7908f0, 0x7f7876f2, 0x7f77e4a6, 0x7f77520a, 0x7f76bf21, - 0x7f762be8, 0x7f759861, - 0x7f75048b, 0x7f747067, 0x7f73dbf4, 0x7f734732, 0x7f72b222, 0x7f721cc3, - 0x7f718715, 0x7f70f119, - 0x7f705ace, 0x7f6fc435, 0x7f6f2d4d, 0x7f6e9617, 0x7f6dfe91, 0x7f6d66be, - 0x7f6cce9b, 0x7f6c362a, - 0x7f6b9d6b, 0x7f6b045d, 0x7f6a6b00, 0x7f69d154, 0x7f69375a, 0x7f689d12, - 0x7f68027b, 0x7f676795, - 0x7f66cc61, 0x7f6630de, 0x7f65950c, 0x7f64f8ec, 0x7f645c7d, 0x7f63bfc0, - 0x7f6322b4, 0x7f62855a, - 0x7f61e7b1, 0x7f6149b9, 0x7f60ab73, 0x7f600cdf, 0x7f5f6dfb, 0x7f5ecec9, - 0x7f5e2f49, 0x7f5d8f7a, - 0x7f5cef5c, 0x7f5c4ef0, 0x7f5bae36, 0x7f5b0d2c, 0x7f5a6bd5, 0x7f59ca2e, - 0x7f592839, 0x7f5885f6, - 0x7f57e364, 0x7f574083, 0x7f569d54, 0x7f55f9d6, 0x7f55560a, 0x7f54b1ef, - 0x7f540d86, 0x7f5368ce, - 0x7f52c3c8, 0x7f521e73, 0x7f5178cf, 0x7f50d2dd, 0x7f502c9d, 0x7f4f860e, - 0x7f4edf30, 0x7f4e3804, - 0x7f4d9089, 0x7f4ce8c0, 0x7f4c40a8, 0x7f4b9842, 0x7f4aef8d, 0x7f4a468a, - 0x7f499d38, 0x7f48f398, - 0x7f4849a9, 0x7f479f6c, 0x7f46f4e0, 0x7f464a06, 0x7f459edd, 0x7f44f365, - 0x7f44479f, 0x7f439b8b, - 0x7f42ef28, 0x7f424277, 0x7f419577, 0x7f40e828, 0x7f403a8b, 0x7f3f8ca0, - 0x7f3ede66, 0x7f3e2fde, - 0x7f3d8107, 0x7f3cd1e2, 0x7f3c226e, 0x7f3b72ab, 0x7f3ac29b, 0x7f3a123b, - 0x7f39618e, 0x7f38b091, - 0x7f37ff47, 0x7f374dad, 0x7f369bc6, 0x7f35e990, 0x7f35370b, 0x7f348438, - 0x7f33d116, 0x7f331da6, - 0x7f3269e8, 0x7f31b5db, 0x7f31017f, 0x7f304cd6, 0x7f2f97dd, 0x7f2ee296, - 0x7f2e2d01, 0x7f2d771e, - 0x7f2cc0eb, 0x7f2c0a6b, 0x7f2b539c, 0x7f2a9c7e, 0x7f29e512, 0x7f292d58, - 0x7f28754f, 0x7f27bcf8, - 0x7f270452, 0x7f264b5e, 0x7f25921c, 0x7f24d88b, 0x7f241eab, 0x7f23647e, - 0x7f22aa01, 0x7f21ef37, - 0x7f21341e, 0x7f2078b6, 0x7f1fbd00, 0x7f1f00fc, 0x7f1e44a9, 0x7f1d8808, - 0x7f1ccb18, 0x7f1c0dda, - 0x7f1b504e, 0x7f1a9273, 0x7f19d44a, 0x7f1915d2, 0x7f18570c, 0x7f1797f8, - 0x7f16d895, 0x7f1618e4, - 0x7f1558e4, 0x7f149896, 0x7f13d7fa, 0x7f13170f, 0x7f1255d6, 0x7f11944f, - 0x7f10d279, 0x7f101054, - 0x7f0f4de2, 0x7f0e8b21, 0x7f0dc811, 0x7f0d04b3, 0x7f0c4107, 0x7f0b7d0d, - 0x7f0ab8c4, 0x7f09f42d, - 0x7f092f47, 0x7f086a13, 0x7f07a491, 0x7f06dec0, 0x7f0618a1, 0x7f055233, - 0x7f048b78, 0x7f03c46d, - 0x7f02fd15, 0x7f02356e, 0x7f016d79, 0x7f00a535, 0x7effdca4, 0x7eff13c3, - 0x7efe4a95, 0x7efd8118, - 0x7efcb74d, 0x7efbed33, 0x7efb22cb, 0x7efa5815, 0x7ef98d11, 0x7ef8c1be, - 0x7ef7f61d, 0x7ef72a2d, - 0x7ef65def, 0x7ef59163, 0x7ef4c489, 0x7ef3f760, 0x7ef329e9, 0x7ef25c24, - 0x7ef18e10, 0x7ef0bfae, - 0x7eeff0fe, 0x7eef21ff, 0x7eee52b2, 0x7eed8317, 0x7eecb32d, 0x7eebe2f6, - 0x7eeb1270, 0x7eea419b, - 0x7ee97079, 0x7ee89f08, 0x7ee7cd49, 0x7ee6fb3b, 0x7ee628df, 0x7ee55635, - 0x7ee4833d, 0x7ee3aff6, - 0x7ee2dc61, 0x7ee2087e, 0x7ee1344d, 0x7ee05fcd, 0x7edf8aff, 0x7edeb5e3, - 0x7edde079, 0x7edd0ac0, - 0x7edc34b9, 0x7edb5e64, 0x7eda87c0, 0x7ed9b0ce, 0x7ed8d98e, 0x7ed80200, - 0x7ed72a24, 0x7ed651f9, - 0x7ed57980, 0x7ed4a0b9, 0x7ed3c7a3, 0x7ed2ee40, 0x7ed2148e, 0x7ed13a8e, - 0x7ed0603f, 0x7ecf85a3, - 0x7eceaab8, 0x7ecdcf7f, 0x7eccf3f8, 0x7ecc1822, 0x7ecb3bff, 0x7eca5f8d, - 0x7ec982cd, 0x7ec8a5bf, - 0x7ec7c862, 0x7ec6eab7, 0x7ec60cbe, 0x7ec52e77, 0x7ec44fe2, 0x7ec370fe, - 0x7ec291cd, 0x7ec1b24d, - 0x7ec0d27f, 0x7ebff263, 0x7ebf11f8, 0x7ebe313f, 0x7ebd5039, 0x7ebc6ee4, - 0x7ebb8d40, 0x7ebaab4f, - 0x7eb9c910, 0x7eb8e682, 0x7eb803a6, 0x7eb7207c, 0x7eb63d04, 0x7eb5593d, - 0x7eb47529, 0x7eb390c6, - 0x7eb2ac15, 0x7eb1c716, 0x7eb0e1c9, 0x7eaffc2e, 0x7eaf1645, 0x7eae300d, - 0x7ead4987, 0x7eac62b3, - 0x7eab7b91, 0x7eaa9421, 0x7ea9ac63, 0x7ea8c457, 0x7ea7dbfc, 0x7ea6f353, - 0x7ea60a5d, 0x7ea52118, - 0x7ea43785, 0x7ea34da4, 0x7ea26374, 0x7ea178f7, 0x7ea08e2b, 0x7e9fa312, - 0x7e9eb7aa, 0x7e9dcbf4, - 0x7e9cdff0, 0x7e9bf39e, 0x7e9b06fe, 0x7e9a1a10, 0x7e992cd4, 0x7e983f49, - 0x7e975171, 0x7e96634a, - 0x7e9574d6, 0x7e948613, 0x7e939702, 0x7e92a7a3, 0x7e91b7f6, 0x7e90c7fb, - 0x7e8fd7b2, 0x7e8ee71b, - 0x7e8df636, 0x7e8d0502, 0x7e8c1381, 0x7e8b21b1, 0x7e8a2f94, 0x7e893d28, - 0x7e884a6f, 0x7e875767, - 0x7e866411, 0x7e85706d, 0x7e847c7c, 0x7e83883c, 0x7e8293ae, 0x7e819ed2, - 0x7e80a9a8, 0x7e7fb430, - 0x7e7ebe6a, 0x7e7dc856, 0x7e7cd1f4, 0x7e7bdb44, 0x7e7ae446, 0x7e79ecf9, - 0x7e78f55f, 0x7e77fd77, - 0x7e770541, 0x7e760cbd, 0x7e7513ea, 0x7e741aca, 0x7e73215c, 0x7e7227a0, - 0x7e712d96, 0x7e70333d, - 0x7e6f3897, 0x7e6e3da3, 0x7e6d4261, 0x7e6c46d1, 0x7e6b4af2, 0x7e6a4ec6, - 0x7e69524c, 0x7e685584, - 0x7e67586e, 0x7e665b0a, 0x7e655d58, 0x7e645f58, 0x7e63610a, 0x7e62626e, - 0x7e616384, 0x7e60644c, - 0x7e5f64c7, 0x7e5e64f3, 0x7e5d64d1, 0x7e5c6461, 0x7e5b63a4, 0x7e5a6298, - 0x7e59613f, 0x7e585f97, - 0x7e575da2, 0x7e565b5f, 0x7e5558ce, 0x7e5455ef, 0x7e5352c1, 0x7e524f46, - 0x7e514b7e, 0x7e504767, - 0x7e4f4302, 0x7e4e3e4f, 0x7e4d394f, 0x7e4c3400, 0x7e4b2e64, 0x7e4a287a, - 0x7e492241, 0x7e481bbb, - 0x7e4714e7, 0x7e460dc5, 0x7e450656, 0x7e43fe98, 0x7e42f68c, 0x7e41ee33, - 0x7e40e58c, 0x7e3fdc97, - 0x7e3ed353, 0x7e3dc9c3, 0x7e3cbfe4, 0x7e3bb5b7, 0x7e3aab3c, 0x7e39a074, - 0x7e38955e, 0x7e3789fa, - 0x7e367e48, 0x7e357248, 0x7e3465fa, 0x7e33595e, 0x7e324c75, 0x7e313f3e, - 0x7e3031b9, 0x7e2f23e6, - 0x7e2e15c5, 0x7e2d0756, 0x7e2bf89a, 0x7e2ae990, 0x7e29da38, 0x7e28ca92, - 0x7e27ba9e, 0x7e26aa5d, - 0x7e2599cd, 0x7e2488f0, 0x7e2377c5, 0x7e22664c, 0x7e215486, 0x7e204271, - 0x7e1f300f, 0x7e1e1d5f, - 0x7e1d0a61, 0x7e1bf716, 0x7e1ae37c, 0x7e19cf95, 0x7e18bb60, 0x7e17a6dd, - 0x7e16920d, 0x7e157cee, - 0x7e146782, 0x7e1351c9, 0x7e123bc1, 0x7e11256c, 0x7e100ec8, 0x7e0ef7d7, - 0x7e0de099, 0x7e0cc90c, - 0x7e0bb132, 0x7e0a990a, 0x7e098095, 0x7e0867d1, 0x7e074ec0, 0x7e063561, - 0x7e051bb4, 0x7e0401ba, - 0x7e02e772, 0x7e01ccdc, 0x7e00b1f9, 0x7dff96c7, 0x7dfe7b48, 0x7dfd5f7b, - 0x7dfc4361, 0x7dfb26f9, - 0x7dfa0a43, 0x7df8ed3f, 0x7df7cfee, 0x7df6b24f, 0x7df59462, 0x7df47628, - 0x7df357a0, 0x7df238ca, - 0x7df119a7, 0x7deffa35, 0x7deeda77, 0x7dedba6a, 0x7dec9a10, 0x7deb7968, - 0x7dea5872, 0x7de9372f, - 0x7de8159e, 0x7de6f3c0, 0x7de5d193, 0x7de4af1a, 0x7de38c52, 0x7de2693d, - 0x7de145da, 0x7de02229, - 0x7ddefe2b, 0x7dddd9e0, 0x7ddcb546, 0x7ddb905f, 0x7dda6b2a, 0x7dd945a8, - 0x7dd81fd8, 0x7dd6f9ba, - 0x7dd5d34f, 0x7dd4ac96, 0x7dd38590, 0x7dd25e3c, 0x7dd1369a, 0x7dd00eab, - 0x7dcee66e, 0x7dcdbde3, - 0x7dcc950b, 0x7dcb6be6, 0x7dca4272, 0x7dc918b1, 0x7dc7eea3, 0x7dc6c447, - 0x7dc5999d, 0x7dc46ea6, - 0x7dc34361, 0x7dc217cf, 0x7dc0ebef, 0x7dbfbfc1, 0x7dbe9346, 0x7dbd667d, - 0x7dbc3967, 0x7dbb0c03, - 0x7db9de52, 0x7db8b053, 0x7db78207, 0x7db6536d, 0x7db52485, 0x7db3f550, - 0x7db2c5cd, 0x7db195fd, - 0x7db065df, 0x7daf3574, 0x7dae04bb, 0x7dacd3b5, 0x7daba261, 0x7daa70c0, - 0x7da93ed1, 0x7da80c95, - 0x7da6da0b, 0x7da5a733, 0x7da4740e, 0x7da3409c, 0x7da20cdc, 0x7da0d8cf, - 0x7d9fa474, 0x7d9e6fcb, - 0x7d9d3ad6, 0x7d9c0592, 0x7d9ad001, 0x7d999a23, 0x7d9863f7, 0x7d972d7e, - 0x7d95f6b7, 0x7d94bfa3, - 0x7d938841, 0x7d925092, 0x7d911896, 0x7d8fe04c, 0x7d8ea7b4, 0x7d8d6ecf, - 0x7d8c359d, 0x7d8afc1d, - 0x7d89c250, 0x7d888835, 0x7d874dcd, 0x7d861317, 0x7d84d814, 0x7d839cc4, - 0x7d826126, 0x7d81253a, - 0x7d7fe902, 0x7d7eac7c, 0x7d7d6fa8, 0x7d7c3287, 0x7d7af519, 0x7d79b75d, - 0x7d787954, 0x7d773afd, - 0x7d75fc59, 0x7d74bd68, 0x7d737e29, 0x7d723e9d, 0x7d70fec4, 0x7d6fbe9d, - 0x7d6e7e29, 0x7d6d3d67, - 0x7d6bfc58, 0x7d6abafc, 0x7d697952, 0x7d68375b, 0x7d66f517, 0x7d65b285, - 0x7d646fa6, 0x7d632c79, - 0x7d61e8ff, 0x7d60a538, 0x7d5f6124, 0x7d5e1cc2, 0x7d5cd813, 0x7d5b9316, - 0x7d5a4dcc, 0x7d590835, - 0x7d57c251, 0x7d567c1f, 0x7d5535a0, 0x7d53eed3, 0x7d52a7ba, 0x7d516053, - 0x7d50189e, 0x7d4ed09d, - 0x7d4d884e, 0x7d4c3fb1, 0x7d4af6c8, 0x7d49ad91, 0x7d48640d, 0x7d471a3c, - 0x7d45d01d, 0x7d4485b1, - 0x7d433af8, 0x7d41eff1, 0x7d40a49e, 0x7d3f58fd, 0x7d3e0d0e, 0x7d3cc0d3, - 0x7d3b744a, 0x7d3a2774, - 0x7d38da51, 0x7d378ce0, 0x7d363f23, 0x7d34f118, 0x7d33a2bf, 0x7d32541a, - 0x7d310527, 0x7d2fb5e7, - 0x7d2e665a, 0x7d2d1680, 0x7d2bc659, 0x7d2a75e4, 0x7d292522, 0x7d27d413, - 0x7d2682b6, 0x7d25310d, - 0x7d23df16, 0x7d228cd2, 0x7d213a41, 0x7d1fe762, 0x7d1e9437, 0x7d1d40be, - 0x7d1becf8, 0x7d1a98e5, - 0x7d194485, 0x7d17efd8, 0x7d169add, 0x7d154595, 0x7d13f001, 0x7d129a1f, - 0x7d1143ef, 0x7d0fed73, - 0x7d0e96aa, 0x7d0d3f93, 0x7d0be82f, 0x7d0a907e, 0x7d093880, 0x7d07e035, - 0x7d06879d, 0x7d052eb8, - 0x7d03d585, 0x7d027c05, 0x7d012239, 0x7cffc81f, 0x7cfe6db8, 0x7cfd1304, - 0x7cfbb803, 0x7cfa5cb4, - 0x7cf90119, 0x7cf7a531, 0x7cf648fb, 0x7cf4ec79, 0x7cf38fa9, 0x7cf2328c, - 0x7cf0d522, 0x7cef776b, - 0x7cee1967, 0x7cecbb16, 0x7ceb5c78, 0x7ce9fd8d, 0x7ce89e55, 0x7ce73ed0, - 0x7ce5defd, 0x7ce47ede, - 0x7ce31e72, 0x7ce1bdb8, 0x7ce05cb2, 0x7cdefb5e, 0x7cdd99be, 0x7cdc37d0, - 0x7cdad596, 0x7cd9730e, - 0x7cd8103a, 0x7cd6ad18, 0x7cd549aa, 0x7cd3e5ee, 0x7cd281e5, 0x7cd11d90, - 0x7ccfb8ed, 0x7cce53fe, - 0x7ccceec1, 0x7ccb8937, 0x7cca2361, 0x7cc8bd3d, 0x7cc756cd, 0x7cc5f010, - 0x7cc48905, 0x7cc321ae, - 0x7cc1ba09, 0x7cc05218, 0x7cbee9da, 0x7cbd814f, 0x7cbc1877, 0x7cbaaf51, - 0x7cb945df, 0x7cb7dc20, - 0x7cb67215, 0x7cb507bc, 0x7cb39d16, 0x7cb23223, 0x7cb0c6e4, 0x7caf5b57, - 0x7cadef7e, 0x7cac8358, - 0x7cab16e4, 0x7ca9aa24, 0x7ca83d17, 0x7ca6cfbd, 0x7ca56216, 0x7ca3f423, - 0x7ca285e2, 0x7ca11755, - 0x7c9fa87a, 0x7c9e3953, 0x7c9cc9df, 0x7c9b5a1e, 0x7c99ea10, 0x7c9879b6, - 0x7c97090e, 0x7c95981a, - 0x7c9426d8, 0x7c92b54a, 0x7c91436f, 0x7c8fd148, 0x7c8e5ed3, 0x7c8cec12, - 0x7c8b7903, 0x7c8a05a8, - 0x7c889200, 0x7c871e0c, 0x7c85a9ca, 0x7c84353c, 0x7c82c060, 0x7c814b39, - 0x7c7fd5c4, 0x7c7e6002, - 0x7c7ce9f4, 0x7c7b7399, 0x7c79fcf1, 0x7c7885fc, 0x7c770eba, 0x7c75972c, - 0x7c741f51, 0x7c72a729, - 0x7c712eb5, 0x7c6fb5f3, 0x7c6e3ce5, 0x7c6cc38a, 0x7c6b49e3, 0x7c69cfee, - 0x7c6855ad, 0x7c66db1f, - 0x7c656045, 0x7c63e51e, 0x7c6269aa, 0x7c60ede9, 0x7c5f71db, 0x7c5df581, - 0x7c5c78da, 0x7c5afbe6, - 0x7c597ea6, 0x7c580119, 0x7c56833f, 0x7c550519, 0x7c5386a6, 0x7c5207e6, - 0x7c5088d9, 0x7c4f0980, - 0x7c4d89da, 0x7c4c09e8, 0x7c4a89a8, 0x7c49091c, 0x7c478844, 0x7c46071f, - 0x7c4485ad, 0x7c4303ee, - 0x7c4181e3, 0x7c3fff8b, 0x7c3e7ce7, 0x7c3cf9f5, 0x7c3b76b8, 0x7c39f32d, - 0x7c386f56, 0x7c36eb33, - 0x7c3566c2, 0x7c33e205, 0x7c325cfc, 0x7c30d7a6, 0x7c2f5203, 0x7c2dcc14, - 0x7c2c45d8, 0x7c2abf4f, - 0x7c29387a, 0x7c27b158, 0x7c2629ea, 0x7c24a22f, 0x7c231a28, 0x7c2191d4, - 0x7c200933, 0x7c1e8046, - 0x7c1cf70c, 0x7c1b6d86, 0x7c19e3b3, 0x7c185994, 0x7c16cf28, 0x7c15446f, - 0x7c13b96a, 0x7c122e19, - 0x7c10a27b, 0x7c0f1690, 0x7c0d8a59, 0x7c0bfdd5, 0x7c0a7105, 0x7c08e3e8, - 0x7c07567f, 0x7c05c8c9, - 0x7c043ac7, 0x7c02ac78, 0x7c011ddd, 0x7bff8ef5, 0x7bfdffc1, 0x7bfc7041, - 0x7bfae073, 0x7bf9505a, - 0x7bf7bff4, 0x7bf62f41, 0x7bf49e42, 0x7bf30cf6, 0x7bf17b5e, 0x7befe97a, - 0x7bee5749, 0x7becc4cc, - 0x7beb3202, 0x7be99eec, 0x7be80b89, 0x7be677da, 0x7be4e3df, 0x7be34f97, - 0x7be1bb02, 0x7be02621, - 0x7bde90f4, 0x7bdcfb7b, 0x7bdb65b5, 0x7bd9cfa2, 0x7bd83944, 0x7bd6a298, - 0x7bd50ba1, 0x7bd3745d, - 0x7bd1dccc, 0x7bd044f0, 0x7bceacc7, 0x7bcd1451, 0x7bcb7b8f, 0x7bc9e281, - 0x7bc84927, 0x7bc6af80, - 0x7bc5158c, 0x7bc37b4d, 0x7bc1e0c1, 0x7bc045e9, 0x7bbeaac4, 0x7bbd0f53, - 0x7bbb7396, 0x7bb9d78c, - 0x7bb83b36, 0x7bb69e94, 0x7bb501a5, 0x7bb3646a, 0x7bb1c6e3, 0x7bb02910, - 0x7bae8af0, 0x7bacec84, - 0x7bab4dcc, 0x7ba9aec7, 0x7ba80f76, 0x7ba66fd9, 0x7ba4cfef, 0x7ba32fba, - 0x7ba18f38, 0x7b9fee69, - 0x7b9e4d4f, 0x7b9cabe8, 0x7b9b0a35, 0x7b996836, 0x7b97c5ea, 0x7b962352, - 0x7b94806e, 0x7b92dd3e, - 0x7b9139c2, 0x7b8f95f9, 0x7b8df1e4, 0x7b8c4d83, 0x7b8aa8d6, 0x7b8903dc, - 0x7b875e96, 0x7b85b904, - 0x7b841326, 0x7b826cfc, 0x7b80c686, 0x7b7f1fc3, 0x7b7d78b4, 0x7b7bd159, - 0x7b7a29b2, 0x7b7881be, - 0x7b76d97f, 0x7b7530f3, 0x7b73881b, 0x7b71def7, 0x7b703587, 0x7b6e8bcb, - 0x7b6ce1c2, 0x7b6b376e, - 0x7b698ccd, 0x7b67e1e0, 0x7b6636a7, 0x7b648b22, 0x7b62df51, 0x7b613334, - 0x7b5f86ca, 0x7b5dda15, - 0x7b5c2d13, 0x7b5a7fc6, 0x7b58d22c, 0x7b572446, 0x7b557614, 0x7b53c796, - 0x7b5218cc, 0x7b5069b6, - 0x7b4eba53, 0x7b4d0aa5, 0x7b4b5aab, 0x7b49aa64, 0x7b47f9d2, 0x7b4648f3, - 0x7b4497c9, 0x7b42e652, - 0x7b413490, 0x7b3f8281, 0x7b3dd026, 0x7b3c1d80, 0x7b3a6a8d, 0x7b38b74e, - 0x7b3703c3, 0x7b354fed, - 0x7b339bca, 0x7b31e75b, 0x7b3032a0, 0x7b2e7d9a, 0x7b2cc847, 0x7b2b12a8, - 0x7b295cbe, 0x7b27a687, - 0x7b25f004, 0x7b243936, 0x7b22821b, 0x7b20cab5, 0x7b1f1302, 0x7b1d5b04, - 0x7b1ba2b9, 0x7b19ea23, - 0x7b183141, 0x7b167813, 0x7b14be99, 0x7b1304d3, 0x7b114ac1, 0x7b0f9063, - 0x7b0dd5b9, 0x7b0c1ac4, - 0x7b0a5f82, 0x7b08a3f5, 0x7b06e81b, 0x7b052bf6, 0x7b036f85, 0x7b01b2c8, - 0x7afff5bf, 0x7afe386a, - 0x7afc7aca, 0x7afabcdd, 0x7af8fea5, 0x7af74021, 0x7af58151, 0x7af3c235, - 0x7af202cd, 0x7af0431a, - 0x7aee831a, 0x7aecc2cf, 0x7aeb0238, 0x7ae94155, 0x7ae78026, 0x7ae5beac, - 0x7ae3fce6, 0x7ae23ad4, - 0x7ae07876, 0x7adeb5cc, 0x7adcf2d6, 0x7adb2f95, 0x7ad96c08, 0x7ad7a82f, - 0x7ad5e40a, 0x7ad41f9a, - 0x7ad25ade, 0x7ad095d6, 0x7aced082, 0x7acd0ae3, 0x7acb44f8, 0x7ac97ec1, - 0x7ac7b83e, 0x7ac5f170, - 0x7ac42a55, 0x7ac262ef, 0x7ac09b3e, 0x7abed341, 0x7abd0af7, 0x7abb4263, - 0x7ab97982, 0x7ab7b056, - 0x7ab5e6de, 0x7ab41d1b, 0x7ab2530b, 0x7ab088b0, 0x7aaebe0a, 0x7aacf318, - 0x7aab27da, 0x7aa95c50, - 0x7aa7907b, 0x7aa5c45a, 0x7aa3f7ed, 0x7aa22b35, 0x7aa05e31, 0x7a9e90e1, - 0x7a9cc346, 0x7a9af55f, - 0x7a99272d, 0x7a9758af, 0x7a9589e5, 0x7a93bad0, 0x7a91eb6f, 0x7a901bc2, - 0x7a8e4bca, 0x7a8c7b87, - 0x7a8aaaf7, 0x7a88da1c, 0x7a8708f6, 0x7a853784, 0x7a8365c6, 0x7a8193bd, - 0x7a7fc168, 0x7a7deec8, - 0x7a7c1bdc, 0x7a7a48a4, 0x7a787521, 0x7a76a153, 0x7a74cd38, 0x7a72f8d3, - 0x7a712422, 0x7a6f4f25, - 0x7a6d79dd, 0x7a6ba449, 0x7a69ce6a, 0x7a67f83f, 0x7a6621c9, 0x7a644b07, - 0x7a6273fa, 0x7a609ca1, - 0x7a5ec4fc, 0x7a5ced0d, 0x7a5b14d1, 0x7a593c4b, 0x7a576379, 0x7a558a5b, - 0x7a53b0f2, 0x7a51d73d, - 0x7a4ffd3d, 0x7a4e22f2, 0x7a4c485b, 0x7a4a6d78, 0x7a48924b, 0x7a46b6d1, - 0x7a44db0d, 0x7a42fefd, - 0x7a4122a1, 0x7a3f45fa, 0x7a3d6908, 0x7a3b8bca, 0x7a39ae41, 0x7a37d06d, - 0x7a35f24d, 0x7a3413e2, - 0x7a32352b, 0x7a305629, 0x7a2e76dc, 0x7a2c9743, 0x7a2ab75f, 0x7a28d72f, - 0x7a26f6b4, 0x7a2515ee, - 0x7a2334dd, 0x7a215380, 0x7a1f71d7, 0x7a1d8fe4, 0x7a1bada5, 0x7a19cb1b, - 0x7a17e845, 0x7a160524, - 0x7a1421b8, 0x7a123e01, 0x7a1059fe, 0x7a0e75b0, 0x7a0c9117, 0x7a0aac32, - 0x7a08c702, 0x7a06e187, - 0x7a04fbc1, 0x7a0315af, 0x7a012f52, 0x79ff48aa, 0x79fd61b6, 0x79fb7a77, - 0x79f992ed, 0x79f7ab18, - 0x79f5c2f8, 0x79f3da8c, 0x79f1f1d5, 0x79f008d3, 0x79ee1f86, 0x79ec35ed, - 0x79ea4c09, 0x79e861da, - 0x79e67760, 0x79e48c9b, 0x79e2a18a, 0x79e0b62e, 0x79deca87, 0x79dcde95, - 0x79daf258, 0x79d905d0, - 0x79d718fc, 0x79d52bdd, 0x79d33e73, 0x79d150be, 0x79cf62be, 0x79cd7473, - 0x79cb85dc, 0x79c996fb, - 0x79c7a7ce, 0x79c5b856, 0x79c3c893, 0x79c1d885, 0x79bfe82c, 0x79bdf788, - 0x79bc0698, 0x79ba155e, - 0x79b823d8, 0x79b63207, 0x79b43fec, 0x79b24d85, 0x79b05ad3, 0x79ae67d6, - 0x79ac748e, 0x79aa80fb, - 0x79a88d1d, 0x79a698f4, 0x79a4a480, 0x79a2afc1, 0x79a0bab6, 0x799ec561, - 0x799ccfc1, 0x799ad9d5, - 0x7998e39f, 0x7996ed1e, 0x7994f651, 0x7992ff3a, 0x799107d8, 0x798f102a, - 0x798d1832, 0x798b1fef, - 0x79892761, 0x79872e87, 0x79853563, 0x79833bf4, 0x7981423a, 0x797f4835, - 0x797d4de5, 0x797b534a, - 0x79795864, 0x79775d33, 0x797561b8, 0x797365f1, 0x797169df, 0x796f6d83, - 0x796d70dc, 0x796b73e9, - 0x796976ac, 0x79677924, 0x79657b51, 0x79637d33, 0x79617eca, 0x795f8017, - 0x795d8118, 0x795b81cf, - 0x7959823b, 0x7957825c, 0x79558232, 0x795381bd, 0x795180fe, 0x794f7ff3, - 0x794d7e9e, 0x794b7cfe, - 0x79497b13, 0x794778dd, 0x7945765d, 0x79437391, 0x7941707b, 0x793f6d1a, - 0x793d696f, 0x793b6578, - 0x79396137, 0x79375cab, 0x793557d4, 0x793352b2, 0x79314d46, 0x792f478f, - 0x792d418d, 0x792b3b40, - 0x792934a9, 0x79272dc7, 0x7925269a, 0x79231f22, 0x79211760, 0x791f0f53, - 0x791d06fb, 0x791afe59, - 0x7918f56c, 0x7916ec34, 0x7914e2b2, 0x7912d8e4, 0x7910cecc, 0x790ec46a, - 0x790cb9bd, 0x790aaec5, - 0x7908a382, 0x790697f5, 0x79048c1d, 0x79027ffa, 0x7900738d, 0x78fe66d5, - 0x78fc59d3, 0x78fa4c86, - 0x78f83eee, 0x78f6310c, 0x78f422df, 0x78f21467, 0x78f005a5, 0x78edf698, - 0x78ebe741, 0x78e9d79f, - 0x78e7c7b2, 0x78e5b77b, 0x78e3a6f9, 0x78e1962d, 0x78df8516, 0x78dd73b5, - 0x78db6209, 0x78d95012, - 0x78d73dd1, 0x78d52b46, 0x78d31870, 0x78d1054f, 0x78cef1e4, 0x78ccde2e, - 0x78caca2e, 0x78c8b5e3, - 0x78c6a14e, 0x78c48c6e, 0x78c27744, 0x78c061cf, 0x78be4c10, 0x78bc3606, - 0x78ba1fb2, 0x78b80913, - 0x78b5f22a, 0x78b3daf7, 0x78b1c379, 0x78afabb0, 0x78ad939d, 0x78ab7b40, - 0x78a96298, 0x78a749a6, - 0x78a53069, 0x78a316e2, 0x78a0fd11, 0x789ee2f5, 0x789cc88f, 0x789aadde, - 0x789892e3, 0x7896779d, - 0x78945c0d, 0x78924033, 0x7890240e, 0x788e07a0, 0x788beae6, 0x7889cde2, - 0x7887b094, 0x788592fc, - 0x78837519, 0x788156ec, 0x787f3875, 0x787d19b3, 0x787afaa7, 0x7878db50, - 0x7876bbb0, 0x78749bc5, - 0x78727b8f, 0x78705b10, 0x786e3a46, 0x786c1932, 0x7869f7d3, 0x7867d62a, - 0x7865b437, 0x786391fa, - 0x78616f72, 0x785f4ca1, 0x785d2984, 0x785b061e, 0x7858e26e, 0x7856be73, - 0x78549a2e, 0x7852759e, - 0x785050c5, 0x784e2ba1, 0x784c0633, 0x7849e07b, 0x7847ba79, 0x7845942c, - 0x78436d96, 0x784146b5, - 0x783f1f8a, 0x783cf815, 0x783ad055, 0x7838a84c, 0x78367ff8, 0x7834575a, - 0x78322e72, 0x78300540, - 0x782ddbc4, 0x782bb1fd, 0x782987ed, 0x78275d92, 0x782532ed, 0x782307fe, - 0x7820dcc5, 0x781eb142, - 0x781c8575, 0x781a595d, 0x78182cfc, 0x78160051, 0x7813d35b, 0x7811a61b, - 0x780f7892, 0x780d4abe, - 0x780b1ca0, 0x7808ee38, 0x7806bf86, 0x7804908a, 0x78026145, 0x780031b5, - 0x77fe01db, 0x77fbd1b6, - 0x77f9a148, 0x77f77090, 0x77f53f8e, 0x77f30e42, 0x77f0dcac, 0x77eeaacc, - 0x77ec78a2, 0x77ea462e, - 0x77e81370, 0x77e5e068, 0x77e3ad17, 0x77e1797b, 0x77df4595, 0x77dd1165, - 0x77dadcec, 0x77d8a828, - 0x77d6731a, 0x77d43dc3, 0x77d20822, 0x77cfd236, 0x77cd9c01, 0x77cb6582, - 0x77c92eb9, 0x77c6f7a6, - 0x77c4c04a, 0x77c288a3, 0x77c050b2, 0x77be1878, 0x77bbdff4, 0x77b9a726, - 0x77b76e0e, 0x77b534ac, - 0x77b2fb00, 0x77b0c10b, 0x77ae86cc, 0x77ac4c43, 0x77aa1170, 0x77a7d653, - 0x77a59aec, 0x77a35f3c, - 0x77a12342, 0x779ee6fe, 0x779caa70, 0x779a6d99, 0x77983077, 0x7795f30c, - 0x7793b557, 0x77917759, - 0x778f3910, 0x778cfa7e, 0x778abba2, 0x77887c7d, 0x77863d0d, 0x7783fd54, - 0x7781bd52, 0x777f7d05, - 0x777d3c6f, 0x777afb8f, 0x7778ba65, 0x777678f2, 0x77743735, 0x7771f52e, - 0x776fb2de, 0x776d7044, - 0x776b2d60, 0x7768ea33, 0x7766a6bc, 0x776462fb, 0x77621ef1, 0x775fda9d, - 0x775d95ff, 0x775b5118, - 0x77590be7, 0x7756c66c, 0x775480a8, 0x77523a9b, 0x774ff443, 0x774dada2, - 0x774b66b8, 0x77491f84, - 0x7746d806, 0x7744903f, 0x7742482e, 0x773fffd4, 0x773db730, 0x773b6e42, - 0x7739250b, 0x7736db8b, - 0x773491c0, 0x773247ad, 0x772ffd50, 0x772db2a9, 0x772b67b9, 0x77291c7f, - 0x7726d0fc, 0x7724852f, - 0x77223919, 0x771fecb9, 0x771da010, 0x771b531d, 0x771905e1, 0x7716b85b, - 0x77146a8c, 0x77121c74, - 0x770fce12, 0x770d7f66, 0x770b3072, 0x7708e133, 0x770691ab, 0x770441da, - 0x7701f1c0, 0x76ffa15c, - 0x76fd50ae, 0x76faffb8, 0x76f8ae78, 0x76f65cee, 0x76f40b1b, 0x76f1b8ff, - 0x76ef6699, 0x76ed13ea, - 0x76eac0f2, 0x76e86db0, 0x76e61a25, 0x76e3c650, 0x76e17233, 0x76df1dcb, - 0x76dcc91b, 0x76da7421, - 0x76d81ede, 0x76d5c952, 0x76d3737c, 0x76d11d5d, 0x76cec6f5, 0x76cc7043, - 0x76ca1948, 0x76c7c204, - 0x76c56a77, 0x76c312a0, 0x76c0ba80, 0x76be6217, 0x76bc0965, 0x76b9b069, - 0x76b75724, 0x76b4fd96, - 0x76b2a3bf, 0x76b0499e, 0x76adef34, 0x76ab9481, 0x76a93985, 0x76a6de40, - 0x76a482b1, 0x76a226da, - 0x769fcab9, 0x769d6e4f, 0x769b119b, 0x7698b49f, 0x76965759, 0x7693f9ca, - 0x76919bf3, 0x768f3dd2, - 0x768cdf67, 0x768a80b4, 0x768821b8, 0x7685c272, 0x768362e4, 0x7681030c, - 0x767ea2eb, 0x767c4281, - 0x7679e1ce, 0x767780d2, 0x76751f8d, 0x7672bdfe, 0x76705c27, 0x766dfa07, - 0x766b979d, 0x766934eb, - 0x7666d1ef, 0x76646eab, 0x76620b1d, 0x765fa747, 0x765d4327, 0x765adebe, - 0x76587a0d, 0x76561512, - 0x7653afce, 0x76514a42, 0x764ee46c, 0x764c7e4d, 0x764a17e6, 0x7647b135, - 0x76454a3c, 0x7642e2f9, - 0x76407b6e, 0x763e139a, 0x763bab7c, 0x76394316, 0x7636da67, 0x7634716f, - 0x7632082e, 0x762f9ea4, - 0x762d34d1, 0x762acab6, 0x76286051, 0x7625f5a3, 0x76238aad, 0x76211f6e, - 0x761eb3e6, 0x761c4815, - 0x7619dbfb, 0x76176f98, 0x761502ed, 0x761295f9, 0x761028bb, 0x760dbb35, - 0x760b4d67, 0x7608df4f, - 0x760670ee, 0x76040245, 0x76019353, 0x75ff2418, 0x75fcb495, 0x75fa44c8, - 0x75f7d4b3, 0x75f56455, - 0x75f2f3ae, 0x75f082bf, 0x75ee1187, 0x75eba006, 0x75e92e3c, 0x75e6bc2a, - 0x75e449ce, 0x75e1d72b, - 0x75df643e, 0x75dcf109, 0x75da7d8b, 0x75d809c4, 0x75d595b4, 0x75d3215c, - 0x75d0acbc, 0x75ce37d2, - 0x75cbc2a0, 0x75c94d25, 0x75c6d762, 0x75c46156, 0x75c1eb01, 0x75bf7464, - 0x75bcfd7e, 0x75ba864f, - 0x75b80ed8, 0x75b59718, 0x75b31f0f, 0x75b0a6be, 0x75ae2e25, 0x75abb542, - 0x75a93c18, 0x75a6c2a4, - 0x75a448e8, 0x75a1cee4, 0x759f5496, 0x759cda01, 0x759a5f22, 0x7597e3fc, - 0x7595688c, 0x7592ecd4, - 0x759070d4, 0x758df48b, 0x758b77fa, 0x7588fb20, 0x75867dfd, 0x75840093, - 0x758182df, 0x757f04e3, - 0x757c869f, 0x757a0812, 0x7577893d, 0x75750a1f, 0x75728ab9, 0x75700b0a, - 0x756d8b13, 0x756b0ad3, - 0x75688a4b, 0x7566097b, 0x75638862, 0x75610701, 0x755e8557, 0x755c0365, - 0x7559812b, 0x7556fea8, - 0x75547bdd, 0x7551f8c9, 0x754f756e, 0x754cf1c9, 0x754a6ddd, 0x7547e9a8, - 0x7545652a, 0x7542e065, - 0x75405b57, 0x753dd600, 0x753b5061, 0x7538ca7b, 0x7536444b, 0x7533bdd4, - 0x75313714, 0x752eb00c, - 0x752c28bb, 0x7529a122, 0x75271941, 0x75249118, 0x752208a7, 0x751f7fed, - 0x751cf6eb, 0x751a6da0, - 0x7517e40e, 0x75155a33, 0x7512d010, 0x751045a5, 0x750dbaf2, 0x750b2ff6, - 0x7508a4b2, 0x75061926, - 0x75038d52, 0x75010136, 0x74fe74d1, 0x74fbe825, 0x74f95b30, 0x74f6cdf3, - 0x74f4406d, 0x74f1b2a0, - 0x74ef248b, 0x74ec962d, 0x74ea0787, 0x74e7789a, 0x74e4e964, 0x74e259e6, - 0x74dfca20, 0x74dd3a11, - 0x74daa9bb, 0x74d8191d, 0x74d58836, 0x74d2f708, 0x74d06591, 0x74cdd3d2, - 0x74cb41cc, 0x74c8af7d, - 0x74c61ce6, 0x74c38a07, 0x74c0f6e0, 0x74be6372, 0x74bbcfbb, 0x74b93bbc, - 0x74b6a775, 0x74b412e6, - 0x74b17e0f, 0x74aee8f0, 0x74ac5389, 0x74a9bddb, 0x74a727e4, 0x74a491a5, - 0x74a1fb1e, 0x749f6450, - 0x749ccd39, 0x749a35db, 0x74979e34, 0x74950646, 0x74926e10, 0x748fd592, - 0x748d3ccb, 0x748aa3be, - 0x74880a68, 0x748570ca, 0x7482d6e4, 0x74803cb7, 0x747da242, 0x747b0784, - 0x74786c7f, 0x7475d132, - 0x7473359e, 0x747099c1, 0x746dfd9d, 0x746b6131, 0x7468c47c, 0x74662781, - 0x74638a3d, 0x7460ecb2, - 0x745e4ede, 0x745bb0c3, 0x74591261, 0x745673b6, 0x7453d4c4, 0x7451358a, - 0x744e9608, 0x744bf63e, - 0x7449562d, 0x7446b5d4, 0x74441533, 0x7441744b, 0x743ed31b, 0x743c31a3, - 0x74398fe3, 0x7436eddc, - 0x74344b8d, 0x7431a8f6, 0x742f0618, 0x742c62f2, 0x7429bf84, 0x74271bcf, - 0x742477d2, 0x7421d38e, - 0x741f2f01, 0x741c8a2d, 0x7419e512, 0x74173faf, 0x74149a04, 0x7411f412, - 0x740f4dd8, 0x740ca756, - 0x740a008d, 0x7407597d, 0x7404b224, 0x74020a85, 0x73ff629d, 0x73fcba6e, - 0x73fa11f8, 0x73f7693a, - 0x73f4c034, 0x73f216e7, 0x73ef6d53, 0x73ecc377, 0x73ea1953, 0x73e76ee8, - 0x73e4c435, 0x73e2193b, - 0x73df6df9, 0x73dcc270, 0x73da16a0, 0x73d76a88, 0x73d4be28, 0x73d21182, - 0x73cf6493, 0x73ccb75d, - 0x73ca09e0, 0x73c75c1c, 0x73c4ae10, 0x73c1ffbc, 0x73bf5121, 0x73bca23f, - 0x73b9f315, 0x73b743a4, - 0x73b493ec, 0x73b1e3ec, 0x73af33a5, 0x73ac8316, 0x73a9d240, 0x73a72123, - 0x73a46fbf, 0x73a1be13, - 0x739f0c20, 0x739c59e5, 0x7399a763, 0x7396f49a, 0x73944189, 0x73918e32, - 0x738eda93, 0x738c26ac, - 0x7389727f, 0x7386be0a, 0x7384094e, 0x7381544a, 0x737e9f00, 0x737be96e, - 0x73793395, 0x73767d74, - 0x7373c70d, 0x7371105e, 0x736e5968, 0x736ba22b, 0x7368eaa6, 0x736632db, - 0x73637ac8, 0x7360c26e, - 0x735e09cd, 0x735b50e4, 0x735897b5, 0x7355de3e, 0x73532481, 0x73506a7c, - 0x734db030, 0x734af59d, - 0x73483ac2, 0x73457fa1, 0x7342c438, 0x73400889, 0x733d4c92, 0x733a9054, - 0x7337d3d0, 0x73351704, - 0x733259f1, 0x732f9c97, 0x732cdef6, 0x732a210d, 0x732762de, 0x7324a468, - 0x7321e5ab, 0x731f26a7, - 0x731c675b, 0x7319a7c9, 0x7316e7f0, 0x731427cf, 0x73116768, 0x730ea6ba, - 0x730be5c5, 0x73092489, - 0x73066306, 0x7303a13b, 0x7300df2a, 0x72fe1cd2, 0x72fb5a34, 0x72f8974e, - 0x72f5d421, 0x72f310ad, - 0x72f04cf3, 0x72ed88f1, 0x72eac4a9, 0x72e8001a, 0x72e53b44, 0x72e27627, - 0x72dfb0c3, 0x72dceb18, - 0x72da2526, 0x72d75eee, 0x72d4986f, 0x72d1d1a9, 0x72cf0a9c, 0x72cc4348, - 0x72c97bad, 0x72c6b3cc, - 0x72c3eba4, 0x72c12335, 0x72be5a7f, 0x72bb9183, 0x72b8c83f, 0x72b5feb5, - 0x72b334e4, 0x72b06acd, - 0x72ada06f, 0x72aad5c9, 0x72a80ade, 0x72a53fab, 0x72a27432, 0x729fa872, - 0x729cdc6b, 0x729a101e, - 0x7297438a, 0x729476af, 0x7291a98e, 0x728edc26, 0x728c0e77, 0x72894082, - 0x72867245, 0x7283a3c3, - 0x7280d4f9, 0x727e05e9, 0x727b3693, 0x727866f6, 0x72759712, 0x7272c6e7, - 0x726ff676, 0x726d25bf, - 0x726a54c1, 0x7267837c, 0x7264b1f0, 0x7261e01e, 0x725f0e06, 0x725c3ba7, - 0x72596901, 0x72569615, - 0x7253c2e3, 0x7250ef6a, 0x724e1baa, 0x724b47a4, 0x72487357, 0x72459ec4, - 0x7242c9ea, 0x723ff4ca, - 0x723d1f63, 0x723a49b6, 0x723773c3, 0x72349d89, 0x7231c708, 0x722ef041, - 0x722c1934, 0x722941e0, - 0x72266a46, 0x72239266, 0x7220ba3f, 0x721de1d1, 0x721b091d, 0x72183023, - 0x721556e3, 0x72127d5c, - 0x720fa38e, 0x720cc97b, 0x7209ef21, 0x72071480, 0x7204399a, 0x72015e6d, - 0x71fe82f9, 0x71fba740, - 0x71f8cb40, 0x71f5eefa, 0x71f3126d, 0x71f0359a, 0x71ed5881, 0x71ea7b22, - 0x71e79d7c, 0x71e4bf90, - 0x71e1e15e, 0x71df02e5, 0x71dc2427, 0x71d94522, 0x71d665d6, 0x71d38645, - 0x71d0a66d, 0x71cdc650, - 0x71cae5ec, 0x71c80542, 0x71c52451, 0x71c2431b, 0x71bf619e, 0x71bc7fdb, - 0x71b99dd2, 0x71b6bb83, - 0x71b3d8ed, 0x71b0f612, 0x71ae12f0, 0x71ab2f89, 0x71a84bdb, 0x71a567e7, - 0x71a283ad, 0x719f9f2c, - 0x719cba66, 0x7199d55a, 0x7196f008, 0x71940a6f, 0x71912490, 0x718e3e6c, - 0x718b5801, 0x71887151, - 0x71858a5a, 0x7182a31d, 0x717fbb9a, 0x717cd3d2, 0x7179ebc3, 0x7177036e, - 0x71741ad3, 0x717131f3, - 0x716e48cc, 0x716b5f5f, 0x716875ad, 0x71658bb4, 0x7162a175, 0x715fb6f1, - 0x715ccc26, 0x7159e116, - 0x7156f5c0, 0x71540a24, 0x71511e42, 0x714e321a, 0x714b45ac, 0x714858f8, - 0x71456bfe, 0x71427ebf, - 0x713f9139, 0x713ca36e, 0x7139b55d, 0x7136c706, 0x7133d869, 0x7130e987, - 0x712dfa5e, 0x712b0af0, - 0x71281b3c, 0x71252b42, 0x71223b02, 0x711f4a7d, 0x711c59b2, 0x711968a1, - 0x7116774a, 0x711385ad, - 0x711093cb, 0x710da1a3, 0x710aaf35, 0x7107bc82, 0x7104c989, 0x7101d64a, - 0x70fee2c5, 0x70fbeefb, - 0x70f8faeb, 0x70f60695, 0x70f311fa, 0x70f01d19, 0x70ed27f2, 0x70ea3286, - 0x70e73cd4, 0x70e446dc, - 0x70e1509f, 0x70de5a1c, 0x70db6353, 0x70d86c45, 0x70d574f1, 0x70d27d58, - 0x70cf8579, 0x70cc8d54, - 0x70c994ea, 0x70c69c3a, 0x70c3a345, 0x70c0aa0a, 0x70bdb08a, 0x70bab6c4, - 0x70b7bcb8, 0x70b4c267, - 0x70b1c7d1, 0x70aeccf5, 0x70abd1d3, 0x70a8d66c, 0x70a5dac0, 0x70a2dece, - 0x709fe296, 0x709ce619, - 0x7099e957, 0x7096ec4f, 0x7093ef01, 0x7090f16e, 0x708df396, 0x708af579, - 0x7087f715, 0x7084f86d, - 0x7081f97f, 0x707efa4c, 0x707bfad3, 0x7078fb15, 0x7075fb11, 0x7072fac9, - 0x706ffa3a, 0x706cf967, - 0x7069f84e, 0x7066f6f0, 0x7063f54c, 0x7060f363, 0x705df135, 0x705aeec1, - 0x7057ec08, 0x7054e90a, - 0x7051e5c7, 0x704ee23e, 0x704bde70, 0x7048da5d, 0x7045d604, 0x7042d166, - 0x703fcc83, 0x703cc75b, - 0x7039c1ed, 0x7036bc3b, 0x7033b643, 0x7030b005, 0x702da983, 0x702aa2bb, - 0x70279baf, 0x7024945d, - 0x70218cc6, 0x701e84e9, 0x701b7cc8, 0x70187461, 0x70156bb5, 0x701262c4, - 0x700f598e, 0x700c5013, - 0x70094653, 0x70063c4e, 0x70033203, 0x70002774, 0x6ffd1c9f, 0x6ffa1185, - 0x6ff70626, 0x6ff3fa82, - 0x6ff0ee99, 0x6fede26b, 0x6fead5f8, 0x6fe7c940, 0x6fe4bc43, 0x6fe1af01, - 0x6fdea17a, 0x6fdb93ae, - 0x6fd8859d, 0x6fd57746, 0x6fd268ab, 0x6fcf59cb, 0x6fcc4aa6, 0x6fc93b3c, - 0x6fc62b8d, 0x6fc31b99, - 0x6fc00b60, 0x6fbcfae2, 0x6fb9ea20, 0x6fb6d918, 0x6fb3c7cb, 0x6fb0b63a, - 0x6fada464, 0x6faa9248, - 0x6fa77fe8, 0x6fa46d43, 0x6fa15a59, 0x6f9e472b, 0x6f9b33b7, 0x6f981fff, - 0x6f950c01, 0x6f91f7bf, - 0x6f8ee338, 0x6f8bce6c, 0x6f88b95c, 0x6f85a407, 0x6f828e6c, 0x6f7f788d, - 0x6f7c626a, 0x6f794c01, - 0x6f763554, 0x6f731e62, 0x6f70072b, 0x6f6cefb0, 0x6f69d7f0, 0x6f66bfeb, - 0x6f63a7a1, 0x6f608f13, - 0x6f5d7640, 0x6f5a5d28, 0x6f5743cb, 0x6f542a2a, 0x6f511044, 0x6f4df61a, - 0x6f4adbab, 0x6f47c0f7, - 0x6f44a5ff, 0x6f418ac2, 0x6f3e6f40, 0x6f3b537a, 0x6f38376f, 0x6f351b1f, - 0x6f31fe8b, 0x6f2ee1b2, - 0x6f2bc495, 0x6f28a733, 0x6f25898d, 0x6f226ba2, 0x6f1f4d72, 0x6f1c2efe, - 0x6f191045, 0x6f15f148, - 0x6f12d206, 0x6f0fb280, 0x6f0c92b6, 0x6f0972a6, 0x6f065253, 0x6f0331ba, - 0x6f0010de, 0x6efcefbd, - 0x6ef9ce57, 0x6ef6acad, 0x6ef38abe, 0x6ef0688b, 0x6eed4614, 0x6eea2358, - 0x6ee70058, 0x6ee3dd13, - 0x6ee0b98a, 0x6edd95bd, 0x6eda71ab, 0x6ed74d55, 0x6ed428ba, 0x6ed103db, - 0x6ecddeb8, 0x6ecab950, - 0x6ec793a4, 0x6ec46db4, 0x6ec1477f, 0x6ebe2106, 0x6ebafa49, 0x6eb7d347, - 0x6eb4ac02, 0x6eb18477, - 0x6eae5ca9, 0x6eab3496, 0x6ea80c3f, 0x6ea4e3a4, 0x6ea1bac4, 0x6e9e91a1, - 0x6e9b6839, 0x6e983e8d, - 0x6e95149c, 0x6e91ea67, 0x6e8ebfef, 0x6e8b9532, 0x6e886a30, 0x6e853eeb, - 0x6e821361, 0x6e7ee794, - 0x6e7bbb82, 0x6e788f2c, 0x6e756291, 0x6e7235b3, 0x6e6f0890, 0x6e6bdb2a, - 0x6e68ad7f, 0x6e657f90, - 0x6e62515d, 0x6e5f22e6, 0x6e5bf42b, 0x6e58c52c, 0x6e5595e9, 0x6e526662, - 0x6e4f3696, 0x6e4c0687, - 0x6e48d633, 0x6e45a59c, 0x6e4274c1, 0x6e3f43a1, 0x6e3c123e, 0x6e38e096, - 0x6e35aeab, 0x6e327c7b, - 0x6e2f4a08, 0x6e2c1750, 0x6e28e455, 0x6e25b115, 0x6e227d92, 0x6e1f49cb, - 0x6e1c15c0, 0x6e18e171, - 0x6e15acde, 0x6e127807, 0x6e0f42ec, 0x6e0c0d8e, 0x6e08d7eb, 0x6e05a205, - 0x6e026bda, 0x6dff356c, - 0x6dfbfeba, 0x6df8c7c4, 0x6df5908b, 0x6df2590d, 0x6def214c, 0x6debe947, - 0x6de8b0fe, 0x6de57871, - 0x6de23fa0, 0x6ddf068c, 0x6ddbcd34, 0x6dd89398, 0x6dd559b9, 0x6dd21f95, - 0x6dcee52e, 0x6dcbaa83, - 0x6dc86f95, 0x6dc53462, 0x6dc1f8ec, 0x6dbebd33, 0x6dbb8135, 0x6db844f4, - 0x6db5086f, 0x6db1cba7, - 0x6dae8e9b, 0x6dab514b, 0x6da813b8, 0x6da4d5e1, 0x6da197c6, 0x6d9e5968, - 0x6d9b1ac6, 0x6d97dbe0, - 0x6d949cb7, 0x6d915d4a, 0x6d8e1d9a, 0x6d8adda6, 0x6d879d6e, 0x6d845cf3, - 0x6d811c35, 0x6d7ddb33, - 0x6d7a99ed, 0x6d775864, 0x6d741697, 0x6d70d487, 0x6d6d9233, 0x6d6a4f9c, - 0x6d670cc1, 0x6d63c9a3, - 0x6d608641, 0x6d5d429c, 0x6d59feb3, 0x6d56ba87, 0x6d537617, 0x6d503164, - 0x6d4cec6e, 0x6d49a734, - 0x6d4661b7, 0x6d431bf6, 0x6d3fd5f2, 0x6d3c8fab, 0x6d394920, 0x6d360252, - 0x6d32bb40, 0x6d2f73eb, - 0x6d2c2c53, 0x6d28e477, 0x6d259c58, 0x6d2253f6, 0x6d1f0b50, 0x6d1bc267, - 0x6d18793b, 0x6d152fcc, - 0x6d11e619, 0x6d0e9c23, 0x6d0b51e9, 0x6d08076d, 0x6d04bcad, 0x6d0171aa, - 0x6cfe2663, 0x6cfadada, - 0x6cf78f0d, 0x6cf442fd, 0x6cf0f6aa, 0x6cedaa13, 0x6cea5d3a, 0x6ce7101d, - 0x6ce3c2bd, 0x6ce0751a, - 0x6cdd2733, 0x6cd9d90a, 0x6cd68a9d, 0x6cd33bed, 0x6ccfecfa, 0x6ccc9dc4, - 0x6cc94e4b, 0x6cc5fe8f, - 0x6cc2ae90, 0x6cbf5e4d, 0x6cbc0dc8, 0x6cb8bcff, 0x6cb56bf4, 0x6cb21aa5, - 0x6caec913, 0x6cab773e, - 0x6ca82527, 0x6ca4d2cc, 0x6ca1802e, 0x6c9e2d4d, 0x6c9ada29, 0x6c9786c2, - 0x6c943318, 0x6c90df2c, - 0x6c8d8afc, 0x6c8a3689, 0x6c86e1d3, 0x6c838cdb, 0x6c80379f, 0x6c7ce220, - 0x6c798c5f, 0x6c76365b, - 0x6c72e013, 0x6c6f8989, 0x6c6c32bc, 0x6c68dbac, 0x6c658459, 0x6c622cc4, - 0x6c5ed4eb, 0x6c5b7cd0, - 0x6c582472, 0x6c54cbd1, 0x6c5172ed, 0x6c4e19c6, 0x6c4ac05d, 0x6c4766b0, - 0x6c440cc1, 0x6c40b28f, - 0x6c3d581b, 0x6c39fd63, 0x6c36a269, 0x6c33472c, 0x6c2febad, 0x6c2c8fea, - 0x6c2933e5, 0x6c25d79d, - 0x6c227b13, 0x6c1f1e45, 0x6c1bc136, 0x6c1863e3, 0x6c15064e, 0x6c11a876, - 0x6c0e4a5b, 0x6c0aebfe, - 0x6c078d5e, 0x6c042e7b, 0x6c00cf56, 0x6bfd6fee, 0x6bfa1044, 0x6bf6b056, - 0x6bf35027, 0x6befefb5, - 0x6bec8f00, 0x6be92e08, 0x6be5ccce, 0x6be26b52, 0x6bdf0993, 0x6bdba791, - 0x6bd8454d, 0x6bd4e2c6, - 0x6bd17ffd, 0x6bce1cf1, 0x6bcab9a3, 0x6bc75613, 0x6bc3f23f, 0x6bc08e2a, - 0x6bbd29d2, 0x6bb9c537, - 0x6bb6605a, 0x6bb2fb3b, 0x6baf95d9, 0x6bac3034, 0x6ba8ca4e, 0x6ba56425, - 0x6ba1fdb9, 0x6b9e970b, - 0x6b9b301b, 0x6b97c8e8, 0x6b946173, 0x6b90f9bc, 0x6b8d91c2, 0x6b8a2986, - 0x6b86c107, 0x6b835846, - 0x6b7fef43, 0x6b7c85fe, 0x6b791c76, 0x6b75b2ac, 0x6b7248a0, 0x6b6ede51, - 0x6b6b73c0, 0x6b6808ed, - 0x6b649dd8, 0x6b613280, 0x6b5dc6e6, 0x6b5a5b0a, 0x6b56eeec, 0x6b53828b, - 0x6b5015e9, 0x6b4ca904, - 0x6b493bdd, 0x6b45ce73, 0x6b4260c8, 0x6b3ef2da, 0x6b3b84ab, 0x6b381639, - 0x6b34a785, 0x6b31388e, - 0x6b2dc956, 0x6b2a59dc, 0x6b26ea1f, 0x6b237a21, 0x6b2009e0, 0x6b1c995d, - 0x6b192898, 0x6b15b791, - 0x6b124648, 0x6b0ed4bd, 0x6b0b62f0, 0x6b07f0e1, 0x6b047e90, 0x6b010bfd, - 0x6afd9928, 0x6afa2610, - 0x6af6b2b7, 0x6af33f1c, 0x6aefcb3f, 0x6aec5720, 0x6ae8e2bf, 0x6ae56e1c, - 0x6ae1f937, 0x6ade8410, - 0x6adb0ea8, 0x6ad798fd, 0x6ad42311, 0x6ad0ace2, 0x6acd3672, 0x6ac9bfc0, - 0x6ac648cb, 0x6ac2d195, - 0x6abf5a1e, 0x6abbe264, 0x6ab86a68, 0x6ab4f22b, 0x6ab179ac, 0x6aae00eb, - 0x6aaa87e8, 0x6aa70ea4, - 0x6aa3951d, 0x6aa01b55, 0x6a9ca14b, 0x6a992700, 0x6a95ac72, 0x6a9231a3, - 0x6a8eb692, 0x6a8b3b3f, - 0x6a87bfab, 0x6a8443d5, 0x6a80c7bd, 0x6a7d4b64, 0x6a79cec8, 0x6a7651ec, - 0x6a72d4cd, 0x6a6f576d, - 0x6a6bd9cb, 0x6a685be8, 0x6a64ddc2, 0x6a615f5c, 0x6a5de0b3, 0x6a5a61c9, - 0x6a56e29e, 0x6a536331, - 0x6a4fe382, 0x6a4c6391, 0x6a48e360, 0x6a4562ec, 0x6a41e237, 0x6a3e6140, - 0x6a3ae008, 0x6a375e8f, - 0x6a33dcd4, 0x6a305ad7, 0x6a2cd899, 0x6a295619, 0x6a25d358, 0x6a225055, - 0x6a1ecd11, 0x6a1b498c, - 0x6a17c5c5, 0x6a1441bc, 0x6a10bd72, 0x6a0d38e7, 0x6a09b41a, 0x6a062f0c, - 0x6a02a9bc, 0x69ff242b, - 0x69fb9e59, 0x69f81845, 0x69f491f0, 0x69f10b5a, 0x69ed8482, 0x69e9fd69, - 0x69e6760f, 0x69e2ee73, - 0x69df6696, 0x69dbde77, 0x69d85618, 0x69d4cd77, 0x69d14494, 0x69cdbb71, - 0x69ca320c, 0x69c6a866, - 0x69c31e7f, 0x69bf9456, 0x69bc09ec, 0x69b87f41, 0x69b4f455, 0x69b16928, - 0x69adddb9, 0x69aa5209, - 0x69a6c618, 0x69a339e6, 0x699fad73, 0x699c20be, 0x699893c9, 0x69950692, - 0x6991791a, 0x698deb61, - 0x698a5d67, 0x6986cf2c, 0x698340af, 0x697fb1f2, 0x697c22f3, 0x697893b4, - 0x69750433, 0x69717472, - 0x696de46f, 0x696a542b, 0x6966c3a6, 0x696332e1, 0x695fa1da, 0x695c1092, - 0x69587f09, 0x6954ed40, - 0x69515b35, 0x694dc8e9, 0x694a365c, 0x6946a38f, 0x69431080, 0x693f7d31, - 0x693be9a0, 0x693855cf, - 0x6934c1bd, 0x69312d6a, 0x692d98d6, 0x692a0401, 0x69266eeb, 0x6922d995, - 0x691f43fd, 0x691bae25, - 0x6918180c, 0x691481b2, 0x6910eb17, 0x690d543b, 0x6909bd1f, 0x690625c2, - 0x69028e24, 0x68fef645, - 0x68fb5e25, 0x68f7c5c5, 0x68f42d24, 0x68f09442, 0x68ecfb20, 0x68e961bd, - 0x68e5c819, 0x68e22e34, - 0x68de940f, 0x68daf9a9, 0x68d75f02, 0x68d3c41b, 0x68d028f2, 0x68cc8d8a, - 0x68c8f1e0, 0x68c555f6, - 0x68c1b9cc, 0x68be1d61, 0x68ba80b5, 0x68b6e3c8, 0x68b3469b, 0x68afa92e, - 0x68ac0b7f, 0x68a86d91, - 0x68a4cf61, 0x68a130f1, 0x689d9241, 0x6899f350, 0x6896541f, 0x6892b4ad, - 0x688f14fa, 0x688b7507, - 0x6887d4d4, 0x68843460, 0x688093ab, 0x687cf2b6, 0x68795181, 0x6875b00b, - 0x68720e55, 0x686e6c5e, - 0x686aca27, 0x686727b0, 0x686384f8, 0x685fe200, 0x685c3ec7, 0x68589b4e, - 0x6854f795, 0x6851539b, - 0x684daf61, 0x684a0ae6, 0x6846662c, 0x6842c131, 0x683f1bf5, 0x683b7679, - 0x6837d0bd, 0x68342ac1, - 0x68308485, 0x682cde08, 0x6829374b, 0x6825904d, 0x6821e910, 0x681e4192, - 0x681a99d4, 0x6816f1d6, - 0x68134997, 0x680fa118, 0x680bf85a, 0x68084f5a, 0x6804a61b, 0x6800fc9c, - 0x67fd52dc, 0x67f9a8dd, - 0x67f5fe9d, 0x67f2541d, 0x67eea95d, 0x67eafe5d, 0x67e7531c, 0x67e3a79c, - 0x67dffbdc, 0x67dc4fdb, - 0x67d8a39a, 0x67d4f71a, 0x67d14a59, 0x67cd9d58, 0x67c9f017, 0x67c64297, - 0x67c294d6, 0x67bee6d5, - 0x67bb3894, 0x67b78a13, 0x67b3db53, 0x67b02c52, 0x67ac7d11, 0x67a8cd91, - 0x67a51dd0, 0x67a16dcf, - 0x679dbd8f, 0x679a0d0f, 0x67965c4e, 0x6792ab4e, 0x678efa0e, 0x678b488e, - 0x678796ce, 0x6783e4cf, - 0x6780328f, 0x677c8010, 0x6778cd50, 0x67751a51, 0x67716713, 0x676db394, - 0x6769ffd5, 0x67664bd7, - 0x67629799, 0x675ee31b, 0x675b2e5e, 0x67577960, 0x6753c423, 0x67500ea7, - 0x674c58ea, 0x6748a2ee, - 0x6744ecb2, 0x67413636, 0x673d7f7b, 0x6739c880, 0x67361145, 0x673259ca, - 0x672ea210, 0x672aea17, - 0x672731dd, 0x67237964, 0x671fc0ac, 0x671c07b4, 0x67184e7c, 0x67149504, - 0x6710db4d, 0x670d2157, - 0x67096721, 0x6705acab, 0x6701f1f6, 0x66fe3701, 0x66fa7bcd, 0x66f6c059, - 0x66f304a6, 0x66ef48b3, - 0x66eb8c80, 0x66e7d00f, 0x66e4135d, 0x66e0566c, 0x66dc993c, 0x66d8dbcd, - 0x66d51e1d, 0x66d1602f, - 0x66cda201, 0x66c9e393, 0x66c624e7, 0x66c265fa, 0x66bea6cf, 0x66bae764, - 0x66b727ba, 0x66b367d0, - 0x66afa7a7, 0x66abe73f, 0x66a82697, 0x66a465b0, 0x66a0a489, 0x669ce324, - 0x6699217f, 0x66955f9b, - 0x66919d77, 0x668ddb14, 0x668a1872, 0x66865591, 0x66829270, 0x667ecf11, - 0x667b0b72, 0x66774793, - 0x66738376, 0x666fbf19, 0x666bfa7d, 0x666835a2, 0x66647088, 0x6660ab2f, - 0x665ce596, 0x66591fbf, - 0x665559a8, 0x66519352, 0x664dccbd, 0x664a05e9, 0x66463ed6, 0x66427784, - 0x663eaff2, 0x663ae822, - 0x66372012, 0x663357c4, 0x662f8f36, 0x662bc66a, 0x6627fd5e, 0x66243413, - 0x66206a8a, 0x661ca0c1, - 0x6618d6b9, 0x66150c73, 0x661141ed, 0x660d7729, 0x6609ac25, 0x6605e0e3, - 0x66021561, 0x65fe49a1, - 0x65fa7da2, 0x65f6b164, 0x65f2e4e7, 0x65ef182b, 0x65eb4b30, 0x65e77df6, - 0x65e3b07e, 0x65dfe2c6, - 0x65dc14d0, 0x65d8469b, 0x65d47827, 0x65d0a975, 0x65ccda83, 0x65c90b53, - 0x65c53be4, 0x65c16c36, - 0x65bd9c49, 0x65b9cc1e, 0x65b5fbb4, 0x65b22b0b, 0x65ae5a23, 0x65aa88fd, - 0x65a6b798, 0x65a2e5f4, - 0x659f1412, 0x659b41f1, 0x65976f91, 0x65939cf3, 0x658fca15, 0x658bf6fa, - 0x6588239f, 0x65845006, - 0x65807c2f, 0x657ca818, 0x6578d3c4, 0x6574ff30, 0x65712a5e, 0x656d554d, - 0x65697ffe, 0x6565aa71, - 0x6561d4a4, 0x655dfe99, 0x655a2850, 0x655651c8, 0x65527b02, 0x654ea3fd, - 0x654accba, 0x6546f538, - 0x65431d77, 0x653f4579, 0x653b6d3b, 0x653794c0, 0x6533bc06, 0x652fe30d, - 0x652c09d6, 0x65283061, - 0x652456ad, 0x65207cbb, 0x651ca28a, 0x6518c81b, 0x6514ed6e, 0x65111283, - 0x650d3759, 0x65095bf0, - 0x6505804a, 0x6501a465, 0x64fdc841, 0x64f9ebe0, 0x64f60f40, 0x64f23262, - 0x64ee5546, 0x64ea77eb, - 0x64e69a52, 0x64e2bc7b, 0x64dede66, 0x64db0012, 0x64d72180, 0x64d342b0, - 0x64cf63a2, 0x64cb8456, - 0x64c7a4cb, 0x64c3c502, 0x64bfe4fc, 0x64bc04b6, 0x64b82433, 0x64b44372, - 0x64b06273, 0x64ac8135, - 0x64a89fba, 0x64a4be00, 0x64a0dc08, 0x649cf9d2, 0x6499175e, 0x649534ac, - 0x649151bc, 0x648d6e8e, - 0x64898b22, 0x6485a778, 0x6481c390, 0x647ddf6a, 0x6479fb06, 0x64761664, - 0x64723184, 0x646e4c66, - 0x646a670a, 0x64668170, 0x64629b98, 0x645eb582, 0x645acf2e, 0x6456e89d, - 0x645301cd, 0x644f1ac0, - 0x644b3375, 0x64474bec, 0x64436425, 0x643f7c20, 0x643b93dd, 0x6437ab5d, - 0x6433c29f, 0x642fd9a3, - 0x642bf069, 0x642806f1, 0x64241d3c, 0x64203348, 0x641c4917, 0x64185ea9, - 0x641473fc, 0x64108912, - 0x640c9dea, 0x6408b284, 0x6404c6e1, 0x6400db00, 0x63fceee1, 0x63f90285, - 0x63f515eb, 0x63f12913, - 0x63ed3bfd, 0x63e94eaa, 0x63e5611a, 0x63e1734b, 0x63dd853f, 0x63d996f6, - 0x63d5a86f, 0x63d1b9aa, - 0x63cdcaa8, 0x63c9db68, 0x63c5ebeb, 0x63c1fc30, 0x63be0c37, 0x63ba1c01, - 0x63b62b8e, 0x63b23add, - 0x63ae49ee, 0x63aa58c2, 0x63a66759, 0x63a275b2, 0x639e83cd, 0x639a91ac, - 0x63969f4c, 0x6392acaf, - 0x638eb9d5, 0x638ac6be, 0x6386d369, 0x6382dfd6, 0x637eec07, 0x637af7fa, - 0x637703af, 0x63730f27, - 0x636f1a62, 0x636b2560, 0x63673020, 0x63633aa3, 0x635f44e8, 0x635b4ef0, - 0x635758bb, 0x63536249, - 0x634f6b99, 0x634b74ad, 0x63477d82, 0x6343861b, 0x633f8e76, 0x633b9695, - 0x63379e76, 0x6333a619, - 0x632fad80, 0x632bb4a9, 0x6327bb96, 0x6323c245, 0x631fc8b7, 0x631bceeb, - 0x6317d4e3, 0x6313da9e, - 0x630fe01b, 0x630be55b, 0x6307ea5e, 0x6303ef25, 0x62fff3ae, 0x62fbf7fa, - 0x62f7fc08, 0x62f3ffda, - 0x62f0036f, 0x62ec06c7, 0x62e809e2, 0x62e40cbf, 0x62e00f60, 0x62dc11c4, - 0x62d813eb, 0x62d415d4, - 0x62d01781, 0x62cc18f1, 0x62c81a24, 0x62c41b1a, 0x62c01bd3, 0x62bc1c4f, - 0x62b81c8f, 0x62b41c91, - 0x62b01c57, 0x62ac1bdf, 0x62a81b2b, 0x62a41a3a, 0x62a0190c, 0x629c17a1, - 0x629815fa, 0x62941415, - 0x629011f4, 0x628c0f96, 0x62880cfb, 0x62840a23, 0x6280070f, 0x627c03be, - 0x62780030, 0x6273fc65, - 0x626ff85e, 0x626bf41a, 0x6267ef99, 0x6263eadc, 0x625fe5e1, 0x625be0ab, - 0x6257db37, 0x6253d587, - 0x624fcf9a, 0x624bc970, 0x6247c30a, 0x6243bc68, 0x623fb588, 0x623bae6c, - 0x6237a714, 0x62339f7e, - 0x622f97ad, 0x622b8f9e, 0x62278754, 0x62237ecc, 0x621f7608, 0x621b6d08, - 0x621763cb, 0x62135a51, - 0x620f509b, 0x620b46a9, 0x62073c7a, 0x6203320e, 0x61ff2766, 0x61fb1c82, - 0x61f71161, 0x61f30604, - 0x61eefa6b, 0x61eaee95, 0x61e6e282, 0x61e2d633, 0x61dec9a8, 0x61dabce0, - 0x61d6afdd, 0x61d2a29c, - 0x61ce9520, 0x61ca8767, 0x61c67971, 0x61c26b40, 0x61be5cd2, 0x61ba4e28, - 0x61b63f41, 0x61b2301e, - 0x61ae20bf, 0x61aa1124, 0x61a6014d, 0x61a1f139, 0x619de0e9, 0x6199d05d, - 0x6195bf94, 0x6191ae90, - 0x618d9d4f, 0x61898bd2, 0x61857a19, 0x61816824, 0x617d55f2, 0x61794385, - 0x617530db, 0x61711df5, - 0x616d0ad3, 0x6168f775, 0x6164e3db, 0x6160d005, 0x615cbbf3, 0x6158a7a4, - 0x6154931a, 0x61507e54, - 0x614c6951, 0x61485413, 0x61443e98, 0x614028e2, 0x613c12f0, 0x6137fcc1, - 0x6133e657, 0x612fcfb0, - 0x612bb8ce, 0x6127a1b0, 0x61238a56, 0x611f72c0, 0x611b5aee, 0x611742e0, - 0x61132a96, 0x610f1210, - 0x610af94f, 0x6106e051, 0x6102c718, 0x60feada3, 0x60fa93f2, 0x60f67a05, - 0x60f25fdd, 0x60ee4579, - 0x60ea2ad8, 0x60e60ffd, 0x60e1f4e5, 0x60ddd991, 0x60d9be02, 0x60d5a237, - 0x60d18631, 0x60cd69ee, - 0x60c94d70, 0x60c530b6, 0x60c113c1, 0x60bcf690, 0x60b8d923, 0x60b4bb7a, - 0x60b09d96, 0x60ac7f76, - 0x60a8611b, 0x60a44284, 0x60a023b1, 0x609c04a3, 0x6097e559, 0x6093c5d3, - 0x608fa612, 0x608b8616, - 0x608765dd, 0x6083456a, 0x607f24ba, 0x607b03d0, 0x6076e2a9, 0x6072c148, - 0x606e9faa, 0x606a7dd2, - 0x60665bbd, 0x6062396e, 0x605e16e2, 0x6059f41c, 0x6055d11a, 0x6051addc, - 0x604d8a63, 0x604966af, - 0x604542bf, 0x60411e94, 0x603cfa2e, 0x6038d58c, 0x6034b0af, 0x60308b97, - 0x602c6643, 0x602840b4, - 0x60241ae9, 0x601ff4e3, 0x601bcea2, 0x6017a826, 0x6013816e, 0x600f5a7b, - 0x600b334d, 0x60070be4, - 0x6002e43f, 0x5ffebc5f, 0x5ffa9444, 0x5ff66bee, 0x5ff2435d, 0x5fee1a90, - 0x5fe9f188, 0x5fe5c845, - 0x5fe19ec7, 0x5fdd750e, 0x5fd94b19, 0x5fd520ea, 0x5fd0f67f, 0x5fcccbd9, - 0x5fc8a0f8, 0x5fc475dc, - 0x5fc04a85, 0x5fbc1ef3, 0x5fb7f326, 0x5fb3c71e, 0x5faf9adb, 0x5fab6e5d, - 0x5fa741a3, 0x5fa314af, - 0x5f9ee780, 0x5f9aba16, 0x5f968c70, 0x5f925e90, 0x5f8e3075, 0x5f8a021f, - 0x5f85d38e, 0x5f81a4c2, - 0x5f7d75bb, 0x5f794679, 0x5f7516fd, 0x5f70e745, 0x5f6cb753, 0x5f688726, - 0x5f6456be, 0x5f60261b, - 0x5f5bf53d, 0x5f57c424, 0x5f5392d1, 0x5f4f6143, 0x5f4b2f7a, 0x5f46fd76, - 0x5f42cb37, 0x5f3e98be, - 0x5f3a660a, 0x5f36331b, 0x5f31fff1, 0x5f2dcc8d, 0x5f2998ee, 0x5f256515, - 0x5f213100, 0x5f1cfcb1, - 0x5f18c827, 0x5f149363, 0x5f105e64, 0x5f0c292a, 0x5f07f3b6, 0x5f03be07, - 0x5eff881d, 0x5efb51f9, - 0x5ef71b9b, 0x5ef2e501, 0x5eeeae2d, 0x5eea771f, 0x5ee63fd6, 0x5ee20853, - 0x5eddd094, 0x5ed9989c, - 0x5ed56069, 0x5ed127fb, 0x5eccef53, 0x5ec8b671, 0x5ec47d54, 0x5ec043fc, - 0x5ebc0a6a, 0x5eb7d09e, - 0x5eb39697, 0x5eaf5c56, 0x5eab21da, 0x5ea6e724, 0x5ea2ac34, 0x5e9e7109, - 0x5e9a35a4, 0x5e95fa05, - 0x5e91be2b, 0x5e8d8217, 0x5e8945c8, 0x5e85093f, 0x5e80cc7c, 0x5e7c8f7f, - 0x5e785247, 0x5e7414d5, - 0x5e6fd729, 0x5e6b9943, 0x5e675b22, 0x5e631cc7, 0x5e5ede32, 0x5e5a9f62, - 0x5e566059, 0x5e522115, - 0x5e4de197, 0x5e49a1df, 0x5e4561ed, 0x5e4121c0, 0x5e3ce15a, 0x5e38a0b9, - 0x5e345fde, 0x5e301ec9, - 0x5e2bdd7a, 0x5e279bf1, 0x5e235a2e, 0x5e1f1830, 0x5e1ad5f9, 0x5e169388, - 0x5e1250dc, 0x5e0e0df7, - 0x5e09cad7, 0x5e05877e, 0x5e0143ea, 0x5dfd001d, 0x5df8bc15, 0x5df477d4, - 0x5df03359, 0x5debeea3, - 0x5de7a9b4, 0x5de3648b, 0x5ddf1f28, 0x5ddad98b, 0x5dd693b4, 0x5dd24da3, - 0x5dce0759, 0x5dc9c0d4, - 0x5dc57a16, 0x5dc1331d, 0x5dbcebeb, 0x5db8a480, 0x5db45cda, 0x5db014fa, - 0x5dabcce1, 0x5da7848e, - 0x5da33c01, 0x5d9ef33b, 0x5d9aaa3a, 0x5d966100, 0x5d92178d, 0x5d8dcddf, - 0x5d8983f8, 0x5d8539d7, - 0x5d80ef7c, 0x5d7ca4e8, 0x5d785a1a, 0x5d740f12, 0x5d6fc3d1, 0x5d6b7856, - 0x5d672ca2, 0x5d62e0b4, - 0x5d5e948c, 0x5d5a482a, 0x5d55fb90, 0x5d51aebb, 0x5d4d61ad, 0x5d491465, - 0x5d44c6e4, 0x5d40792a, - 0x5d3c2b35, 0x5d37dd08, 0x5d338ea0, 0x5d2f4000, 0x5d2af125, 0x5d26a212, - 0x5d2252c5, 0x5d1e033e, - 0x5d19b37e, 0x5d156385, 0x5d111352, 0x5d0cc2e5, 0x5d087240, 0x5d042161, - 0x5cffd048, 0x5cfb7ef7, - 0x5cf72d6b, 0x5cf2dba7, 0x5cee89a9, 0x5cea3772, 0x5ce5e501, 0x5ce19258, - 0x5cdd3f75, 0x5cd8ec58, - 0x5cd49903, 0x5cd04574, 0x5ccbf1ab, 0x5cc79daa, 0x5cc3496f, 0x5cbef4fc, - 0x5cbaa04f, 0x5cb64b68, - 0x5cb1f649, 0x5cada0f0, 0x5ca94b5e, 0x5ca4f594, 0x5ca09f8f, 0x5c9c4952, - 0x5c97f2dc, 0x5c939c2c, - 0x5c8f4544, 0x5c8aee22, 0x5c8696c7, 0x5c823f34, 0x5c7de767, 0x5c798f61, - 0x5c753722, 0x5c70deaa, - 0x5c6c85f9, 0x5c682d0f, 0x5c63d3eb, 0x5c5f7a8f, 0x5c5b20fa, 0x5c56c72c, - 0x5c526d25, 0x5c4e12e5, - 0x5c49b86d, 0x5c455dbb, 0x5c4102d0, 0x5c3ca7ad, 0x5c384c50, 0x5c33f0bb, - 0x5c2f94ec, 0x5c2b38e5, - 0x5c26dca5, 0x5c22802c, 0x5c1e237b, 0x5c19c690, 0x5c15696d, 0x5c110c11, - 0x5c0cae7c, 0x5c0850ae, - 0x5c03f2a8, 0x5bff9469, 0x5bfb35f1, 0x5bf6d740, 0x5bf27857, 0x5bee1935, - 0x5be9b9da, 0x5be55a46, - 0x5be0fa7a, 0x5bdc9a75, 0x5bd83a37, 0x5bd3d9c1, 0x5bcf7912, 0x5bcb182b, - 0x5bc6b70b, 0x5bc255b2, - 0x5bbdf421, 0x5bb99257, 0x5bb53054, 0x5bb0ce19, 0x5bac6ba6, 0x5ba808f9, - 0x5ba3a615, 0x5b9f42f7, - 0x5b9adfa2, 0x5b967c13, 0x5b92184d, 0x5b8db44d, 0x5b895016, 0x5b84eba6, - 0x5b8086fd, 0x5b7c221c, - 0x5b77bd02, 0x5b7357b0, 0x5b6ef226, 0x5b6a8c63, 0x5b662668, 0x5b61c035, - 0x5b5d59c9, 0x5b58f324, - 0x5b548c48, 0x5b502533, 0x5b4bbde6, 0x5b475660, 0x5b42eea2, 0x5b3e86ac, - 0x5b3a1e7e, 0x5b35b617, - 0x5b314d78, 0x5b2ce4a1, 0x5b287b91, 0x5b241249, 0x5b1fa8c9, 0x5b1b3f11, - 0x5b16d521, 0x5b126af8, - 0x5b0e0098, 0x5b0995ff, 0x5b052b2e, 0x5b00c025, 0x5afc54e3, 0x5af7e96a, - 0x5af37db8, 0x5aef11cf, - 0x5aeaa5ad, 0x5ae63953, 0x5ae1ccc1, 0x5add5ff7, 0x5ad8f2f5, 0x5ad485bb, - 0x5ad01849, 0x5acbaa9f, - 0x5ac73cbd, 0x5ac2cea3, 0x5abe6050, 0x5ab9f1c6, 0x5ab58304, 0x5ab1140a, - 0x5aaca4d8, 0x5aa8356f, - 0x5aa3c5cd, 0x5a9f55f3, 0x5a9ae5e2, 0x5a967598, 0x5a920517, 0x5a8d945d, - 0x5a89236c, 0x5a84b243, - 0x5a8040e3, 0x5a7bcf4a, 0x5a775d7a, 0x5a72eb71, 0x5a6e7931, 0x5a6a06ba, - 0x5a65940a, 0x5a612123, - 0x5a5cae04, 0x5a583aad, 0x5a53c71e, 0x5a4f5358, 0x5a4adf5a, 0x5a466b24, - 0x5a41f6b7, 0x5a3d8212, - 0x5a390d35, 0x5a349821, 0x5a3022d5, 0x5a2bad51, 0x5a273796, 0x5a22c1a3, - 0x5a1e4b79, 0x5a19d517, - 0x5a155e7d, 0x5a10e7ac, 0x5a0c70a3, 0x5a07f963, 0x5a0381eb, 0x59ff0a3c, - 0x59fa9255, 0x59f61a36, - 0x59f1a1e0, 0x59ed2953, 0x59e8b08e, 0x59e43792, 0x59dfbe5e, 0x59db44f3, - 0x59d6cb50, 0x59d25176, - 0x59cdd765, 0x59c95d1c, 0x59c4e29c, 0x59c067e4, 0x59bbecf5, 0x59b771cf, - 0x59b2f671, 0x59ae7add, - 0x59a9ff10, 0x59a5830d, 0x59a106d2, 0x599c8a60, 0x59980db6, 0x599390d5, - 0x598f13bd, 0x598a966e, - 0x598618e8, 0x59819b2a, 0x597d1d35, 0x59789f09, 0x597420a6, 0x596fa20b, - 0x596b233a, 0x5966a431, - 0x596224f1, 0x595da57a, 0x595925cc, 0x5954a5e6, 0x595025ca, 0x594ba576, - 0x594724ec, 0x5942a42a, - 0x593e2331, 0x5939a202, 0x5935209b, 0x59309efd, 0x592c1d28, 0x59279b1c, - 0x592318d9, 0x591e9660, - 0x591a13af, 0x591590c7, 0x59110da8, 0x590c8a53, 0x590806c6, 0x59038302, - 0x58feff08, 0x58fa7ad7, - 0x58f5f66e, 0x58f171cf, 0x58ececf9, 0x58e867ed, 0x58e3e2a9, 0x58df5d2e, - 0x58dad77d, 0x58d65195, - 0x58d1cb76, 0x58cd4520, 0x58c8be94, 0x58c437d1, 0x58bfb0d7, 0x58bb29a6, - 0x58b6a23e, 0x58b21aa0, - 0x58ad92cb, 0x58a90ac0, 0x58a4827d, 0x589ffa04, 0x589b7155, 0x5896e86f, - 0x58925f52, 0x588dd5fe, - 0x58894c74, 0x5884c2b3, 0x588038bb, 0x587bae8d, 0x58772429, 0x5872998e, - 0x586e0ebc, 0x586983b4, - 0x5864f875, 0x58606d00, 0x585be154, 0x58575571, 0x5852c958, 0x584e3d09, - 0x5849b083, 0x584523c7, - 0x584096d4, 0x583c09ab, 0x58377c4c, 0x5832eeb6, 0x582e60e9, 0x5829d2e6, - 0x582544ad, 0x5820b63e, - 0x581c2798, 0x581798bb, 0x581309a9, 0x580e7a60, 0x5809eae1, 0x58055b2b, - 0x5800cb3f, 0x57fc3b1d, - 0x57f7aac5, 0x57f31a36, 0x57ee8971, 0x57e9f876, 0x57e56744, 0x57e0d5dd, - 0x57dc443f, 0x57d7b26b, - 0x57d32061, 0x57ce8e20, 0x57c9fbaa, 0x57c568fd, 0x57c0d61a, 0x57bc4301, - 0x57b7afb2, 0x57b31c2d, - 0x57ae8872, 0x57a9f480, 0x57a56059, 0x57a0cbfb, 0x579c3768, 0x5797a29e, - 0x57930d9e, 0x578e7869, - 0x5789e2fd, 0x57854d5b, 0x5780b784, 0x577c2176, 0x57778b32, 0x5772f4b9, - 0x576e5e09, 0x5769c724, - 0x57653009, 0x576098b7, 0x575c0130, 0x57576973, 0x5752d180, 0x574e3957, - 0x5749a0f9, 0x57450864, - 0x57406f9a, 0x573bd69a, 0x57373d64, 0x5732a3f8, 0x572e0a56, 0x5729707f, - 0x5724d672, 0x57203c2f, - 0x571ba1b7, 0x57170708, 0x57126c24, 0x570dd10a, 0x570935bb, 0x57049a36, - 0x56fffe7b, 0x56fb628b, - 0x56f6c664, 0x56f22a09, 0x56ed8d77, 0x56e8f0b0, 0x56e453b4, 0x56dfb681, - 0x56db1919, 0x56d67b7c, - 0x56d1dda9, 0x56cd3fa1, 0x56c8a162, 0x56c402ef, 0x56bf6446, 0x56bac567, - 0x56b62653, 0x56b18709, - 0x56ace78a, 0x56a847d6, 0x56a3a7ec, 0x569f07cc, 0x569a6777, 0x5695c6ed, - 0x5691262d, 0x568c8538, - 0x5687e40e, 0x568342ae, 0x567ea118, 0x5679ff4e, 0x56755d4e, 0x5670bb19, - 0x566c18ae, 0x5667760e, - 0x5662d339, 0x565e302e, 0x56598cee, 0x5654e979, 0x565045cf, 0x564ba1f0, - 0x5646fddb, 0x56425991, - 0x563db512, 0x5639105d, 0x56346b74, 0x562fc655, 0x562b2101, 0x56267b78, - 0x5621d5ba, 0x561d2fc6, - 0x5618899e, 0x5613e340, 0x560f3cae, 0x560a95e6, 0x5605eee9, 0x560147b7, - 0x55fca050, 0x55f7f8b4, - 0x55f350e3, 0x55eea8dd, 0x55ea00a2, 0x55e55832, 0x55e0af8d, 0x55dc06b3, - 0x55d75da4, 0x55d2b460, - 0x55ce0ae7, 0x55c96139, 0x55c4b757, 0x55c00d3f, 0x55bb62f3, 0x55b6b871, - 0x55b20dbb, 0x55ad62d0, - 0x55a8b7b0, 0x55a40c5b, 0x559f60d1, 0x559ab513, 0x55960920, 0x55915cf8, - 0x558cb09b, 0x55880409, - 0x55835743, 0x557eaa48, 0x5579fd18, 0x55754fb3, 0x5570a21a, 0x556bf44c, - 0x55674649, 0x55629812, - 0x555de9a6, 0x55593b05, 0x55548c30, 0x554fdd26, 0x554b2de7, 0x55467e74, - 0x5541cecc, 0x553d1ef0, - 0x55386edf, 0x5533be99, 0x552f0e1f, 0x552a5d70, 0x5525ac8d, 0x5520fb75, - 0x551c4a29, 0x551798a8, - 0x5512e6f3, 0x550e3509, 0x550982eb, 0x5504d099, 0x55001e12, 0x54fb6b56, - 0x54f6b866, 0x54f20542, - 0x54ed51e9, 0x54e89e5c, 0x54e3ea9a, 0x54df36a5, 0x54da827a, 0x54d5ce1c, - 0x54d11989, 0x54cc64c2, - 0x54c7afc6, 0x54c2fa96, 0x54be4532, 0x54b98f9a, 0x54b4d9cd, 0x54b023cc, - 0x54ab6d97, 0x54a6b72e, - 0x54a20090, 0x549d49bf, 0x549892b9, 0x5493db7f, 0x548f2410, 0x548a6c6e, - 0x5485b497, 0x5480fc8c, - 0x547c444d, 0x54778bda, 0x5472d333, 0x546e1a58, 0x54696149, 0x5464a805, - 0x545fee8e, 0x545b34e3, - 0x54567b03, 0x5451c0f0, 0x544d06a8, 0x54484c2d, 0x5443917d, 0x543ed699, - 0x543a1b82, 0x54356037, - 0x5430a4b7, 0x542be904, 0x54272d1d, 0x54227102, 0x541db4b3, 0x5418f830, - 0x54143b79, 0x540f7e8e, - 0x540ac170, 0x5406041d, 0x54014697, 0x53fc88dd, 0x53f7caef, 0x53f30cce, - 0x53ee4e78, 0x53e98fef, - 0x53e4d132, 0x53e01242, 0x53db531d, 0x53d693c5, 0x53d1d439, 0x53cd147a, - 0x53c85486, 0x53c3945f, - 0x53bed405, 0x53ba1377, 0x53b552b5, 0x53b091bf, 0x53abd096, 0x53a70f39, - 0x53a24da9, 0x539d8be5, - 0x5398c9ed, 0x539407c2, 0x538f4564, 0x538a82d1, 0x5385c00c, 0x5380fd12, - 0x537c39e6, 0x53777685, - 0x5372b2f2, 0x536def2a, 0x53692b30, 0x53646701, 0x535fa2a0, 0x535ade0b, - 0x53561942, 0x53515447, - 0x534c8f17, 0x5347c9b5, 0x5343041f, 0x533e3e55, 0x53397859, 0x5334b229, - 0x532febc5, 0x532b252f, - 0x53265e65, 0x53219767, 0x531cd037, 0x531808d3, 0x5313413c, 0x530e7972, - 0x5309b174, 0x5304e943, - 0x530020df, 0x52fb5848, 0x52f68f7e, 0x52f1c680, 0x52ecfd4f, 0x52e833ec, - 0x52e36a55, 0x52dea08a, - 0x52d9d68d, 0x52d50c5d, 0x52d041f9, 0x52cb7763, 0x52c6ac99, 0x52c1e19d, - 0x52bd166d, 0x52b84b0a, - 0x52b37f74, 0x52aeb3ac, 0x52a9e7b0, 0x52a51b81, 0x52a04f1f, 0x529b828a, - 0x5296b5c3, 0x5291e8c8, - 0x528d1b9b, 0x52884e3a, 0x528380a7, 0x527eb2e0, 0x5279e4e7, 0x527516bb, - 0x5270485c, 0x526b79ca, - 0x5266ab06, 0x5261dc0e, 0x525d0ce4, 0x52583d87, 0x52536df7, 0x524e9e34, - 0x5249ce3f, 0x5244fe17, - 0x52402dbc, 0x523b5d2e, 0x52368c6e, 0x5231bb7b, 0x522cea55, 0x522818fc, - 0x52234771, 0x521e75b3, - 0x5219a3c3, 0x5214d1a0, 0x520fff4a, 0x520b2cc2, 0x52065a07, 0x52018719, - 0x51fcb3f9, 0x51f7e0a6, - 0x51f30d21, 0x51ee3969, 0x51e9657e, 0x51e49162, 0x51dfbd12, 0x51dae890, - 0x51d613dc, 0x51d13ef5, - 0x51cc69db, 0x51c79490, 0x51c2bf11, 0x51bde960, 0x51b9137d, 0x51b43d68, - 0x51af6720, 0x51aa90a5, - 0x51a5b9f9, 0x51a0e31a, 0x519c0c08, 0x519734c4, 0x51925d4e, 0x518d85a6, - 0x5188adcb, 0x5183d5be, - 0x517efd7f, 0x517a250d, 0x51754c69, 0x51707393, 0x516b9a8b, 0x5166c150, - 0x5161e7e4, 0x515d0e45, - 0x51583473, 0x51535a70, 0x514e803b, 0x5149a5d3, 0x5144cb39, 0x513ff06d, - 0x513b156f, 0x51363a3f, - 0x51315edd, 0x512c8348, 0x5127a782, 0x5122cb8a, 0x511def5f, 0x51191302, - 0x51143674, 0x510f59b3, - 0x510a7cc1, 0x51059f9c, 0x5100c246, 0x50fbe4bd, 0x50f70703, 0x50f22916, - 0x50ed4af8, 0x50e86ca8, - 0x50e38e25, 0x50deaf71, 0x50d9d08b, 0x50d4f173, 0x50d0122a, 0x50cb32ae, - 0x50c65301, 0x50c17322, - 0x50bc9311, 0x50b7b2ce, 0x50b2d259, 0x50adf1b3, 0x50a910db, 0x50a42fd1, - 0x509f4e95, 0x509a6d28, - 0x50958b88, 0x5090a9b8, 0x508bc7b5, 0x5086e581, 0x5082031b, 0x507d2083, - 0x50783dba, 0x50735abf, - 0x506e7793, 0x50699435, 0x5064b0a5, 0x505fcce4, 0x505ae8f1, 0x505604cd, - 0x50512077, 0x504c3bef, - 0x50475736, 0x5042724c, 0x503d8d30, 0x5038a7e2, 0x5033c263, 0x502edcb2, - 0x5029f6d1, 0x502510bd, - 0x50202a78, 0x501b4402, 0x50165d5a, 0x50117681, 0x500c8f77, 0x5007a83b, - 0x5002c0cd, 0x4ffdd92f, - 0x4ff8f15f, 0x4ff4095e, 0x4fef212b, 0x4fea38c7, 0x4fe55032, 0x4fe0676c, - 0x4fdb7e74, 0x4fd6954b, - 0x4fd1abf0, 0x4fccc265, 0x4fc7d8a8, 0x4fc2eeba, 0x4fbe049b, 0x4fb91a4b, - 0x4fb42fc9, 0x4faf4517, - 0x4faa5a33, 0x4fa56f1e, 0x4fa083d8, 0x4f9b9861, 0x4f96acb8, 0x4f91c0df, - 0x4f8cd4d4, 0x4f87e899, - 0x4f82fc2c, 0x4f7e0f8f, 0x4f7922c0, 0x4f7435c0, 0x4f6f488f, 0x4f6a5b2e, - 0x4f656d9b, 0x4f607fd7, - 0x4f5b91e3, 0x4f56a3bd, 0x4f51b566, 0x4f4cc6df, 0x4f47d827, 0x4f42e93d, - 0x4f3dfa23, 0x4f390ad8, - 0x4f341b5c, 0x4f2f2baf, 0x4f2a3bd2, 0x4f254bc3, 0x4f205b84, 0x4f1b6b14, - 0x4f167a73, 0x4f1189a1, - 0x4f0c989f, 0x4f07a76b, 0x4f02b608, 0x4efdc473, 0x4ef8d2ad, 0x4ef3e0b7, - 0x4eeeee90, 0x4ee9fc39, - 0x4ee509b1, 0x4ee016f8, 0x4edb240e, 0x4ed630f4, 0x4ed13da9, 0x4ecc4a2e, - 0x4ec75682, 0x4ec262a5, - 0x4ebd6e98, 0x4eb87a5a, 0x4eb385ec, 0x4eae914d, 0x4ea99c7d, 0x4ea4a77d, - 0x4e9fb24d, 0x4e9abcec, - 0x4e95c75b, 0x4e90d199, 0x4e8bdba6, 0x4e86e583, 0x4e81ef30, 0x4e7cf8ac, - 0x4e7801f8, 0x4e730b14, - 0x4e6e13ff, 0x4e691cba, 0x4e642544, 0x4e5f2d9e, 0x4e5a35c7, 0x4e553dc1, - 0x4e50458a, 0x4e4b4d22, - 0x4e46548b, 0x4e415bc3, 0x4e3c62cb, 0x4e3769a2, 0x4e32704a, 0x4e2d76c1, - 0x4e287d08, 0x4e23831e, - 0x4e1e8905, 0x4e198ebb, 0x4e149441, 0x4e0f9997, 0x4e0a9ebd, 0x4e05a3b2, - 0x4e00a878, 0x4dfbad0d, - 0x4df6b173, 0x4df1b5a8, 0x4decb9ad, 0x4de7bd82, 0x4de2c127, 0x4dddc49c, - 0x4dd8c7e1, 0x4dd3caf6, - 0x4dcecdda, 0x4dc9d08f, 0x4dc4d314, 0x4dbfd569, 0x4dbad78e, 0x4db5d983, - 0x4db0db48, 0x4dabdcdd, - 0x4da6de43, 0x4da1df78, 0x4d9ce07d, 0x4d97e153, 0x4d92e1f9, 0x4d8de26f, - 0x4d88e2b5, 0x4d83e2cb, - 0x4d7ee2b1, 0x4d79e268, 0x4d74e1ef, 0x4d6fe146, 0x4d6ae06d, 0x4d65df64, - 0x4d60de2c, 0x4d5bdcc4, - 0x4d56db2d, 0x4d51d965, 0x4d4cd76e, 0x4d47d547, 0x4d42d2f1, 0x4d3dd06b, - 0x4d38cdb5, 0x4d33cad0, - 0x4d2ec7bb, 0x4d29c476, 0x4d24c102, 0x4d1fbd5e, 0x4d1ab98b, 0x4d15b588, - 0x4d10b155, 0x4d0bacf3, - 0x4d06a862, 0x4d01a3a0, 0x4cfc9eb0, 0x4cf79990, 0x4cf29440, 0x4ced8ec1, - 0x4ce88913, 0x4ce38335, - 0x4cde7d28, 0x4cd976eb, 0x4cd4707f, 0x4ccf69e3, 0x4cca6318, 0x4cc55c1e, - 0x4cc054f4, 0x4cbb4d9b, - 0x4cb64613, 0x4cb13e5b, 0x4cac3674, 0x4ca72e5e, 0x4ca22619, 0x4c9d1da4, - 0x4c981500, 0x4c930c2d, - 0x4c8e032a, 0x4c88f9f8, 0x4c83f097, 0x4c7ee707, 0x4c79dd48, 0x4c74d359, - 0x4c6fc93b, 0x4c6abeef, - 0x4c65b473, 0x4c60a9c8, 0x4c5b9eed, 0x4c5693e4, 0x4c5188ac, 0x4c4c7d44, - 0x4c4771ae, 0x4c4265e8, - 0x4c3d59f3, 0x4c384dd0, 0x4c33417d, 0x4c2e34fb, 0x4c29284b, 0x4c241b6b, - 0x4c1f0e5c, 0x4c1a011f, - 0x4c14f3b2, 0x4c0fe617, 0x4c0ad84c, 0x4c05ca53, 0x4c00bc2b, 0x4bfbadd4, - 0x4bf69f4e, 0x4bf19099, - 0x4bec81b5, 0x4be772a3, 0x4be26362, 0x4bdd53f2, 0x4bd84453, 0x4bd33485, - 0x4bce2488, 0x4bc9145d, - 0x4bc40403, 0x4bbef37b, 0x4bb9e2c3, 0x4bb4d1dd, 0x4bafc0c8, 0x4baaaf85, - 0x4ba59e12, 0x4ba08c72, - 0x4b9b7aa2, 0x4b9668a4, 0x4b915677, 0x4b8c441c, 0x4b873192, 0x4b821ed9, - 0x4b7d0bf2, 0x4b77f8dc, - 0x4b72e598, 0x4b6dd225, 0x4b68be84, 0x4b63aab4, 0x4b5e96b6, 0x4b598289, - 0x4b546e2d, 0x4b4f59a4, - 0x4b4a44eb, 0x4b453005, 0x4b401aef, 0x4b3b05ac, 0x4b35f03a, 0x4b30da9a, - 0x4b2bc4cb, 0x4b26aece, - 0x4b2198a2, 0x4b1c8248, 0x4b176bc0, 0x4b12550a, 0x4b0d3e25, 0x4b082712, - 0x4b030fd1, 0x4afdf861, - 0x4af8e0c3, 0x4af3c8f7, 0x4aeeb0fd, 0x4ae998d4, 0x4ae4807d, 0x4adf67f8, - 0x4ada4f45, 0x4ad53664, - 0x4ad01d54, 0x4acb0417, 0x4ac5eaab, 0x4ac0d111, 0x4abbb749, 0x4ab69d53, - 0x4ab1832f, 0x4aac68dc, - 0x4aa74e5c, 0x4aa233ae, 0x4a9d18d1, 0x4a97fdc7, 0x4a92e28e, 0x4a8dc728, - 0x4a88ab93, 0x4a838fd1, - 0x4a7e73e0, 0x4a7957c2, 0x4a743b76, 0x4a6f1efc, 0x4a6a0253, 0x4a64e57d, - 0x4a5fc879, 0x4a5aab48, - 0x4a558de8, 0x4a50705a, 0x4a4b529f, 0x4a4634b6, 0x4a41169f, 0x4a3bf85a, - 0x4a36d9e7, 0x4a31bb47, - 0x4a2c9c79, 0x4a277d7d, 0x4a225e53, 0x4a1d3efc, 0x4a181f77, 0x4a12ffc4, - 0x4a0ddfe4, 0x4a08bfd5, - 0x4a039f9a, 0x49fe7f30, 0x49f95e99, 0x49f43dd4, 0x49ef1ce2, 0x49e9fbc2, - 0x49e4da74, 0x49dfb8f9, - 0x49da9750, 0x49d5757a, 0x49d05376, 0x49cb3145, 0x49c60ee6, 0x49c0ec59, - 0x49bbc9a0, 0x49b6a6b8, - 0x49b183a3, 0x49ac6061, 0x49a73cf1, 0x49a21954, 0x499cf589, 0x4997d191, - 0x4992ad6c, 0x498d8919, - 0x49886499, 0x49833fec, 0x497e1b11, 0x4978f609, 0x4973d0d3, 0x496eab70, - 0x496985e0, 0x49646023, - 0x495f3a38, 0x495a1420, 0x4954eddb, 0x494fc768, 0x494aa0c9, 0x494579fc, - 0x49405302, 0x493b2bdb, - 0x49360486, 0x4930dd05, 0x492bb556, 0x49268d7a, 0x49216571, 0x491c3d3b, - 0x491714d8, 0x4911ec47, - 0x490cc38a, 0x49079aa0, 0x49027188, 0x48fd4844, 0x48f81ed2, 0x48f2f534, - 0x48edcb68, 0x48e8a170, - 0x48e3774a, 0x48de4cf8, 0x48d92278, 0x48d3f7cc, 0x48ceccf3, 0x48c9a1ed, - 0x48c476b9, 0x48bf4b59, - 0x48ba1fcd, 0x48b4f413, 0x48afc82c, 0x48aa9c19, 0x48a56fd9, 0x48a0436c, - 0x489b16d2, 0x4895ea0b, - 0x4890bd18, 0x488b8ff8, 0x488662ab, 0x48813531, 0x487c078b, 0x4876d9b8, - 0x4871abb8, 0x486c7d8c, - 0x48674f33, 0x486220ad, 0x485cf1fa, 0x4857c31b, 0x48529410, 0x484d64d7, - 0x48483572, 0x484305e1, - 0x483dd623, 0x4838a638, 0x48337621, 0x482e45dd, 0x4829156d, 0x4823e4d0, - 0x481eb407, 0x48198311, - 0x481451ef, 0x480f20a0, 0x4809ef25, 0x4804bd7e, 0x47ff8baa, 0x47fa59a9, - 0x47f5277d, 0x47eff523, - 0x47eac29e, 0x47e58fec, 0x47e05d0e, 0x47db2a03, 0x47d5f6cc, 0x47d0c369, - 0x47cb8fd9, 0x47c65c1d, - 0x47c12835, 0x47bbf421, 0x47b6bfe0, 0x47b18b74, 0x47ac56da, 0x47a72215, - 0x47a1ed24, 0x479cb806, - 0x479782bc, 0x47924d46, 0x478d17a4, 0x4787e1d6, 0x4782abdb, 0x477d75b5, - 0x47783f62, 0x477308e3, - 0x476dd239, 0x47689b62, 0x4763645f, 0x475e2d30, 0x4758f5d5, 0x4753be4e, - 0x474e869b, 0x47494ebc, - 0x474416b1, 0x473ede7a, 0x4739a617, 0x47346d89, 0x472f34ce, 0x4729fbe7, - 0x4724c2d5, 0x471f8996, - 0x471a502c, 0x47151696, 0x470fdcd4, 0x470aa2e6, 0x470568cd, 0x47002e87, - 0x46faf416, 0x46f5b979, - 0x46f07eb0, 0x46eb43bc, 0x46e6089b, 0x46e0cd4f, 0x46db91d8, 0x46d65634, - 0x46d11a65, 0x46cbde6a, - 0x46c6a244, 0x46c165f1, 0x46bc2974, 0x46b6ecca, 0x46b1aff5, 0x46ac72f4, - 0x46a735c8, 0x46a1f870, - 0x469cbaed, 0x46977d3e, 0x46923f63, 0x468d015d, 0x4687c32c, 0x468284cf, - 0x467d4646, 0x46780792, - 0x4672c8b3, 0x466d89a8, 0x46684a71, 0x46630b0f, 0x465dcb82, 0x46588bc9, - 0x46534be5, 0x464e0bd6, - 0x4648cb9b, 0x46438b35, 0x463e4aa3, 0x463909e7, 0x4633c8fe, 0x462e87eb, - 0x462946ac, 0x46240542, - 0x461ec3ad, 0x461981ec, 0x46144001, 0x460efde9, 0x4609bba7, 0x4604793a, - 0x45ff36a1, 0x45f9f3dd, - 0x45f4b0ee, 0x45ef6dd4, 0x45ea2a8f, 0x45e4e71f, 0x45dfa383, 0x45da5fbc, - 0x45d51bcb, 0x45cfd7ae, - 0x45ca9366, 0x45c54ef3, 0x45c00a55, 0x45bac58c, 0x45b58098, 0x45b03b79, - 0x45aaf630, 0x45a5b0bb, - 0x45a06b1b, 0x459b2550, 0x4595df5a, 0x45909939, 0x458b52ee, 0x45860c77, - 0x4580c5d6, 0x457b7f0a, - 0x45763813, 0x4570f0f1, 0x456ba9a4, 0x4566622c, 0x45611a8a, 0x455bd2bc, - 0x45568ac4, 0x455142a2, - 0x454bfa54, 0x4546b1dc, 0x45416939, 0x453c206b, 0x4536d773, 0x45318e4f, - 0x452c4502, 0x4526fb89, - 0x4521b1e6, 0x451c6818, 0x45171e20, 0x4511d3fd, 0x450c89af, 0x45073f37, - 0x4501f494, 0x44fca9c6, - 0x44f75ecf, 0x44f213ac, 0x44ecc85f, 0x44e77ce7, 0x44e23145, 0x44dce579, - 0x44d79982, 0x44d24d60, - 0x44cd0114, 0x44c7b49e, 0x44c267fd, 0x44bd1b32, 0x44b7ce3c, 0x44b2811c, - 0x44ad33d2, 0x44a7e65d, - 0x44a298be, 0x449d4af5, 0x4497fd01, 0x4492aee3, 0x448d609b, 0x44881228, - 0x4482c38b, 0x447d74c4, - 0x447825d2, 0x4472d6b7, 0x446d8771, 0x44683801, 0x4462e866, 0x445d98a2, - 0x445848b3, 0x4452f89b, - 0x444da858, 0x444857ea, 0x44430753, 0x443db692, 0x443865a7, 0x44331491, - 0x442dc351, 0x442871e8, - 0x44232054, 0x441dce96, 0x44187caf, 0x44132a9d, 0x440dd861, 0x440885fc, - 0x4403336c, 0x43fde0b2, - 0x43f88dcf, 0x43f33ac1, 0x43ede78a, 0x43e89429, 0x43e3409d, 0x43ddece8, - 0x43d8990a, 0x43d34501, - 0x43cdf0ce, 0x43c89c72, 0x43c347eb, 0x43bdf33b, 0x43b89e62, 0x43b3495e, - 0x43adf431, 0x43a89ed9, - 0x43a34959, 0x439df3ae, 0x43989dda, 0x439347dc, 0x438df1b4, 0x43889b63, - 0x438344e8, 0x437dee43, - 0x43789775, 0x4373407d, 0x436de95b, 0x43689210, 0x43633a9c, 0x435de2fd, - 0x43588b36, 0x43533344, - 0x434ddb29, 0x434882e5, 0x43432a77, 0x433dd1e0, 0x4338791f, 0x43332035, - 0x432dc721, 0x43286de4, - 0x4323147d, 0x431dbaed, 0x43186133, 0x43130751, 0x430dad44, 0x4308530f, - 0x4302f8b0, 0x42fd9e28, - 0x42f84376, 0x42f2e89b, 0x42ed8d97, 0x42e83269, 0x42e2d713, 0x42dd7b93, - 0x42d81fe9, 0x42d2c417, - 0x42cd681b, 0x42c80bf6, 0x42c2afa8, 0x42bd5331, 0x42b7f690, 0x42b299c7, - 0x42ad3cd4, 0x42a7dfb8, - 0x42a28273, 0x429d2505, 0x4297c76e, 0x429269ae, 0x428d0bc4, 0x4287adb2, - 0x42824f76, 0x427cf112, - 0x42779285, 0x427233ce, 0x426cd4ef, 0x426775e6, 0x426216b5, 0x425cb75a, - 0x425757d7, 0x4251f82b, - 0x424c9856, 0x42473858, 0x4241d831, 0x423c77e1, 0x42371769, 0x4231b6c7, - 0x422c55fd, 0x4226f50a, - 0x422193ee, 0x421c32a9, 0x4216d13c, 0x42116fa5, 0x420c0de6, 0x4206abfe, - 0x420149ee, 0x41fbe7b5, - 0x41f68553, 0x41f122c8, 0x41ebc015, 0x41e65d39, 0x41e0fa35, 0x41db9707, - 0x41d633b1, 0x41d0d033, - 0x41cb6c8c, 0x41c608bc, 0x41c0a4c4, 0x41bb40a3, 0x41b5dc5a, 0x41b077e8, - 0x41ab134e, 0x41a5ae8b, - 0x41a049a0, 0x419ae48c, 0x41957f4f, 0x419019eb, 0x418ab45d, 0x41854ea8, - 0x417fe8ca, 0x417a82c3, - 0x41751c94, 0x416fb63d, 0x416a4fbd, 0x4164e916, 0x415f8245, 0x415a1b4d, - 0x4154b42c, 0x414f4ce2, - 0x4149e571, 0x41447dd7, 0x413f1615, 0x4139ae2b, 0x41344618, 0x412edddd, - 0x4129757b, 0x41240cef, - 0x411ea43c, 0x41193b61, 0x4113d25d, 0x410e6931, 0x4108ffdd, 0x41039661, - 0x40fe2cbd, 0x40f8c2f1, - 0x40f358fc, 0x40edeee0, 0x40e8849b, 0x40e31a2f, 0x40ddaf9b, 0x40d844de, - 0x40d2d9f9, 0x40cd6eed, - 0x40c803b8, 0x40c2985c, 0x40bd2cd8, 0x40b7c12b, 0x40b25557, 0x40ace95b, - 0x40a77d37, 0x40a210eb, - 0x409ca477, 0x409737dc, 0x4091cb18, 0x408c5e2d, 0x4086f11a, 0x408183df, - 0x407c167c, 0x4076a8f1, - 0x40713b3f, 0x406bcd65, 0x40665f63, 0x4060f13a, 0x405b82e9, 0x40561470, - 0x4050a5cf, 0x404b3707, - 0x4045c817, 0x404058ff, 0x403ae9c0, 0x40357a59, 0x40300acb, 0x402a9b15, - 0x40252b37, 0x401fbb32, - 0x401a4b05, 0x4014dab1, 0x400f6a35, 0x4009f992, 0x400488c7, 0x3fff17d5, - 0x3ff9a6bb, 0x3ff4357a, - 0x3feec411, 0x3fe95281, 0x3fe3e0c9, 0x3fde6eeb, 0x3fd8fce4, 0x3fd38ab6, - 0x3fce1861, 0x3fc8a5e5, - 0x3fc33341, 0x3fbdc076, 0x3fb84d83, 0x3fb2da6a, 0x3fad6729, 0x3fa7f3c0, - 0x3fa28031, 0x3f9d0c7a, - 0x3f97989c, 0x3f922496, 0x3f8cb06a, 0x3f873c16, 0x3f81c79b, 0x3f7c52f9, - 0x3f76de30, 0x3f71693f, - 0x3f6bf428, 0x3f667ee9, 0x3f610983, 0x3f5b93f6, 0x3f561e42, 0x3f50a867, - 0x3f4b3265, 0x3f45bc3c, - 0x3f4045ec, 0x3f3acf75, 0x3f3558d7, 0x3f2fe211, 0x3f2a6b25, 0x3f24f412, - 0x3f1f7cd8, 0x3f1a0577, - 0x3f148def, 0x3f0f1640, 0x3f099e6b, 0x3f04266e, 0x3efeae4a, 0x3ef93600, - 0x3ef3bd8f, 0x3eee44f7, - 0x3ee8cc38, 0x3ee35352, 0x3eddda46, 0x3ed86113, 0x3ed2e7b9, 0x3ecd6e38, - 0x3ec7f491, 0x3ec27ac2, - 0x3ebd00cd, 0x3eb786b2, 0x3eb20c6f, 0x3eac9206, 0x3ea71777, 0x3ea19cc1, - 0x3e9c21e4, 0x3e96a6e0, - 0x3e912bb6, 0x3e8bb065, 0x3e8634ee, 0x3e80b950, 0x3e7b3d8c, 0x3e75c1a1, - 0x3e70458f, 0x3e6ac957, - 0x3e654cf8, 0x3e5fd073, 0x3e5a53c8, 0x3e54d6f6, 0x3e4f59fe, 0x3e49dcdf, - 0x3e445f99, 0x3e3ee22e, - 0x3e39649c, 0x3e33e6e3, 0x3e2e6904, 0x3e28eaff, 0x3e236cd4, 0x3e1dee82, - 0x3e18700a, 0x3e12f16b, - 0x3e0d72a6, 0x3e07f3bb, 0x3e0274aa, 0x3dfcf572, 0x3df77615, 0x3df1f691, - 0x3dec76e6, 0x3de6f716, - 0x3de1771f, 0x3ddbf703, 0x3dd676c0, 0x3dd0f656, 0x3dcb75c7, 0x3dc5f512, - 0x3dc07436, 0x3dbaf335, - 0x3db5720d, 0x3daff0c0, 0x3daa6f4c, 0x3da4edb2, 0x3d9f6bf2, 0x3d99ea0d, - 0x3d946801, 0x3d8ee5cf, - 0x3d896377, 0x3d83e0f9, 0x3d7e5e56, 0x3d78db8c, 0x3d73589d, 0x3d6dd587, - 0x3d68524c, 0x3d62ceeb, - 0x3d5d4b64, 0x3d57c7b7, 0x3d5243e4, 0x3d4cbfeb, 0x3d473bcd, 0x3d41b789, - 0x3d3c331f, 0x3d36ae8f, - 0x3d3129da, 0x3d2ba4fe, 0x3d261ffd, 0x3d209ad7, 0x3d1b158a, 0x3d159018, - 0x3d100a80, 0x3d0a84c3, - 0x3d04fee0, 0x3cff78d7, 0x3cf9f2a9, 0x3cf46c55, 0x3ceee5db, 0x3ce95f3c, - 0x3ce3d877, 0x3cde518d, - 0x3cd8ca7d, 0x3cd34347, 0x3ccdbbed, 0x3cc8346c, 0x3cc2acc6, 0x3cbd24fb, - 0x3cb79d0a, 0x3cb214f4, - 0x3cac8cb8, 0x3ca70457, 0x3ca17bd0, 0x3c9bf324, 0x3c966a53, 0x3c90e15c, - 0x3c8b5840, 0x3c85cefe, - 0x3c804598, 0x3c7abc0c, 0x3c75325a, 0x3c6fa883, 0x3c6a1e87, 0x3c649466, - 0x3c5f0a20, 0x3c597fb4, - 0x3c53f523, 0x3c4e6a6d, 0x3c48df91, 0x3c435491, 0x3c3dc96b, 0x3c383e20, - 0x3c32b2b0, 0x3c2d271b, - 0x3c279b61, 0x3c220f81, 0x3c1c837d, 0x3c16f753, 0x3c116b04, 0x3c0bde91, - 0x3c0651f8, 0x3c00c53a, - 0x3bfb3857, 0x3bf5ab50, 0x3bf01e23, 0x3bea90d1, 0x3be5035a, 0x3bdf75bf, - 0x3bd9e7fe, 0x3bd45a19, - 0x3bcecc0e, 0x3bc93ddf, 0x3bc3af8b, 0x3bbe2112, 0x3bb89274, 0x3bb303b1, - 0x3bad74c9, 0x3ba7e5bd, - 0x3ba2568c, 0x3b9cc736, 0x3b9737bb, 0x3b91a81c, 0x3b8c1857, 0x3b86886e, - 0x3b80f861, 0x3b7b682e, - 0x3b75d7d7, 0x3b70475c, 0x3b6ab6bb, 0x3b6525f6, 0x3b5f950c, 0x3b5a03fe, - 0x3b5472cb, 0x3b4ee173, - 0x3b494ff7, 0x3b43be57, 0x3b3e2c91, 0x3b389aa8, 0x3b330899, 0x3b2d7666, - 0x3b27e40f, 0x3b225193, - 0x3b1cbef3, 0x3b172c2e, 0x3b119945, 0x3b0c0637, 0x3b067305, 0x3b00dfaf, - 0x3afb4c34, 0x3af5b894, - 0x3af024d1, 0x3aea90e9, 0x3ae4fcdc, 0x3adf68ac, 0x3ad9d457, 0x3ad43fdd, - 0x3aceab40, 0x3ac9167e, - 0x3ac38198, 0x3abdec8d, 0x3ab8575f, 0x3ab2c20c, 0x3aad2c95, 0x3aa796fa, - 0x3aa2013a, 0x3a9c6b57, - 0x3a96d54f, 0x3a913f23, 0x3a8ba8d3, 0x3a86125f, 0x3a807bc7, 0x3a7ae50a, - 0x3a754e2a, 0x3a6fb726, - 0x3a6a1ffd, 0x3a6488b1, 0x3a5ef140, 0x3a5959ab, 0x3a53c1f3, 0x3a4e2a16, - 0x3a489216, 0x3a42f9f2, - 0x3a3d61a9, 0x3a37c93d, 0x3a3230ad, 0x3a2c97f9, 0x3a26ff21, 0x3a216625, - 0x3a1bcd05, 0x3a1633c1, - 0x3a109a5a, 0x3a0b00cf, 0x3a056720, 0x39ffcd4d, 0x39fa3356, 0x39f4993c, - 0x39eefefe, 0x39e9649c, - 0x39e3ca17, 0x39de2f6d, 0x39d894a0, 0x39d2f9b0, 0x39cd5e9b, 0x39c7c363, - 0x39c22808, 0x39bc8c89, - 0x39b6f0e6, 0x39b1551f, 0x39abb935, 0x39a61d28, 0x39a080f6, 0x399ae4a2, - 0x39954829, 0x398fab8e, - 0x398a0ece, 0x398471ec, 0x397ed4e5, 0x397937bc, 0x39739a6e, 0x396dfcfe, - 0x39685f6a, 0x3962c1b2, - 0x395d23d7, 0x395785d9, 0x3951e7b8, 0x394c4973, 0x3946ab0a, 0x39410c7f, - 0x393b6dd0, 0x3935cefd, - 0x39303008, 0x392a90ef, 0x3924f1b3, 0x391f5254, 0x3919b2d1, 0x3914132b, - 0x390e7362, 0x3908d376, - 0x39033367, 0x38fd9334, 0x38f7f2de, 0x38f25266, 0x38ecb1ca, 0x38e7110a, - 0x38e17028, 0x38dbcf23, - 0x38d62dfb, 0x38d08caf, 0x38caeb41, 0x38c549af, 0x38bfa7fb, 0x38ba0623, - 0x38b46429, 0x38aec20b, - 0x38a91fcb, 0x38a37d67, 0x389ddae1, 0x38983838, 0x3892956c, 0x388cf27d, - 0x38874f6b, 0x3881ac36, - 0x387c08de, 0x38766564, 0x3870c1c6, 0x386b1e06, 0x38657a23, 0x385fd61d, - 0x385a31f5, 0x38548daa, - 0x384ee93b, 0x384944ab, 0x38439ff7, 0x383dfb21, 0x38385628, 0x3832b10d, - 0x382d0bce, 0x3827666d, - 0x3821c0ea, 0x381c1b44, 0x3816757b, 0x3810cf90, 0x380b2982, 0x38058351, - 0x37ffdcfe, 0x37fa3688, - 0x37f48ff0, 0x37eee936, 0x37e94259, 0x37e39b59, 0x37ddf437, 0x37d84cf2, - 0x37d2a58b, 0x37ccfe02, - 0x37c75656, 0x37c1ae87, 0x37bc0697, 0x37b65e84, 0x37b0b64e, 0x37ab0df6, - 0x37a5657c, 0x379fbce0, - 0x379a1421, 0x37946b40, 0x378ec23d, 0x37891917, 0x37836fcf, 0x377dc665, - 0x37781cd9, 0x3772732a, - 0x376cc959, 0x37671f66, 0x37617551, 0x375bcb1a, 0x375620c1, 0x37507645, - 0x374acba7, 0x374520e7, - 0x373f7606, 0x3739cb02, 0x37341fdc, 0x372e7493, 0x3728c929, 0x37231d9d, - 0x371d71ef, 0x3717c61f, - 0x37121a2d, 0x370c6e19, 0x3706c1e2, 0x3701158a, 0x36fb6910, 0x36f5bc75, - 0x36f00fb7, 0x36ea62d7, - 0x36e4b5d6, 0x36df08b2, 0x36d95b6d, 0x36d3ae06, 0x36ce007d, 0x36c852d2, - 0x36c2a506, 0x36bcf718, - 0x36b74908, 0x36b19ad6, 0x36abec82, 0x36a63e0d, 0x36a08f76, 0x369ae0bd, - 0x369531e3, 0x368f82e7, - 0x3689d3c9, 0x3684248a, 0x367e7529, 0x3678c5a7, 0x36731602, 0x366d663d, - 0x3667b655, 0x3662064c, - 0x365c5622, 0x3656a5d6, 0x3650f569, 0x364b44da, 0x36459429, 0x363fe357, - 0x363a3264, 0x3634814f, - 0x362ed019, 0x36291ec1, 0x36236d48, 0x361dbbad, 0x361809f1, 0x36125814, - 0x360ca615, 0x3606f3f5, - 0x360141b4, 0x35fb8f52, 0x35f5dcce, 0x35f02a28, 0x35ea7762, 0x35e4c47a, - 0x35df1171, 0x35d95e47, - 0x35d3aafc, 0x35cdf78f, 0x35c84401, 0x35c29052, 0x35bcdc82, 0x35b72891, - 0x35b1747e, 0x35abc04b, - 0x35a60bf6, 0x35a05781, 0x359aa2ea, 0x3594ee32, 0x358f3959, 0x3589845f, - 0x3583cf44, 0x357e1a08, - 0x357864ab, 0x3572af2d, 0x356cf98e, 0x356743ce, 0x35618ded, 0x355bd7eb, - 0x355621c9, 0x35506b85, - 0x354ab520, 0x3544fe9b, 0x353f47f5, 0x3539912e, 0x3533da46, 0x352e233d, - 0x35286c14, 0x3522b4c9, - 0x351cfd5e, 0x351745d2, 0x35118e26, 0x350bd658, 0x35061e6a, 0x3500665c, - 0x34faae2c, 0x34f4f5dc, - 0x34ef3d6b, 0x34e984da, 0x34e3cc28, 0x34de1355, 0x34d85a62, 0x34d2a14e, - 0x34cce819, 0x34c72ec4, - 0x34c1754e, 0x34bbbbb8, 0x34b60202, 0x34b0482a, 0x34aa8e33, 0x34a4d41a, - 0x349f19e2, 0x34995f88, - 0x3493a50f, 0x348dea75, 0x34882fba, 0x348274e0, 0x347cb9e4, 0x3476fec9, - 0x3471438d, 0x346b8830, - 0x3465ccb4, 0x34601117, 0x345a5559, 0x3454997c, 0x344edd7e, 0x34492160, - 0x34436521, 0x343da8c3, - 0x3437ec44, 0x34322fa5, 0x342c72e6, 0x3426b606, 0x3420f907, 0x341b3be7, - 0x34157ea7, 0x340fc147, - 0x340a03c7, 0x34044626, 0x33fe8866, 0x33f8ca86, 0x33f30c85, 0x33ed4e65, - 0x33e79024, 0x33e1d1c4, - 0x33dc1343, 0x33d654a2, 0x33d095e2, 0x33cad701, 0x33c51801, 0x33bf58e1, - 0x33b999a0, 0x33b3da40, - 0x33ae1ac0, 0x33a85b20, 0x33a29b60, 0x339cdb81, 0x33971b81, 0x33915b62, - 0x338b9b22, 0x3385dac4, - 0x33801a45, 0x337a59a6, 0x337498e8, 0x336ed80a, 0x3369170c, 0x336355ef, - 0x335d94b2, 0x3357d355, - 0x335211d8, 0x334c503c, 0x33468e80, 0x3340cca5, 0x333b0aaa, 0x3335488f, - 0x332f8655, 0x3329c3fb, - 0x33240182, 0x331e3ee9, 0x33187c31, 0x3312b959, 0x330cf661, 0x3307334a, - 0x33017014, 0x32fbacbe, - 0x32f5e948, 0x32f025b4, 0x32ea61ff, 0x32e49e2c, 0x32deda39, 0x32d91626, - 0x32d351f5, 0x32cd8da4, - 0x32c7c933, 0x32c204a3, 0x32bc3ff4, 0x32b67b26, 0x32b0b638, 0x32aaf12b, - 0x32a52bff, 0x329f66b4, - 0x3299a149, 0x3293dbbf, 0x328e1616, 0x3288504e, 0x32828a67, 0x327cc460, - 0x3276fe3a, 0x327137f6, - 0x326b7192, 0x3265ab0f, 0x325fe46c, 0x325a1dab, 0x325456cb, 0x324e8fcc, - 0x3248c8ad, 0x32430170, - 0x323d3a14, 0x32377298, 0x3231aafe, 0x322be345, 0x32261b6c, 0x32205375, - 0x321a8b5f, 0x3214c32a, - 0x320efad6, 0x32093263, 0x320369d2, 0x31fda121, 0x31f7d852, 0x31f20f64, - 0x31ec4657, 0x31e67d2b, - 0x31e0b3e0, 0x31daea77, 0x31d520ef, 0x31cf5748, 0x31c98d83, 0x31c3c39e, - 0x31bdf99b, 0x31b82f7a, - 0x31b2653a, 0x31ac9adb, 0x31a6d05d, 0x31a105c1, 0x319b3b06, 0x3195702d, - 0x318fa535, 0x3189da1e, - 0x31840ee9, 0x317e4395, 0x31787823, 0x3172ac92, 0x316ce0e3, 0x31671515, - 0x31614929, 0x315b7d1e, - 0x3155b0f5, 0x314fe4ae, 0x314a1848, 0x31444bc3, 0x313e7f21, 0x3138b260, - 0x3132e580, 0x312d1882, - 0x31274b66, 0x31217e2c, 0x311bb0d3, 0x3115e35c, 0x311015c6, 0x310a4813, - 0x31047a41, 0x30feac51, - 0x30f8de42, 0x30f31016, 0x30ed41cb, 0x30e77362, 0x30e1a4db, 0x30dbd636, - 0x30d60772, 0x30d03891, - 0x30ca6991, 0x30c49a74, 0x30becb38, 0x30b8fbde, 0x30b32c66, 0x30ad5cd0, - 0x30a78d1c, 0x30a1bd4a, - 0x309bed5a, 0x30961d4c, 0x30904d20, 0x308a7cd6, 0x3084ac6e, 0x307edbe9, - 0x30790b45, 0x30733a83, - 0x306d69a4, 0x306798a7, 0x3061c78b, 0x305bf652, 0x305624fb, 0x30505387, - 0x304a81f4, 0x3044b044, - 0x303ede76, 0x30390c8a, 0x30333a80, 0x302d6859, 0x30279614, 0x3021c3b1, - 0x301bf131, 0x30161e93, - 0x30104bd7, 0x300a78fe, 0x3004a607, 0x2ffed2f2, 0x2ff8ffc0, 0x2ff32c70, - 0x2fed5902, 0x2fe78577, - 0x2fe1b1cf, 0x2fdbde09, 0x2fd60a25, 0x2fd03624, 0x2fca6206, 0x2fc48dc9, - 0x2fbeb970, 0x2fb8e4f9, - 0x2fb31064, 0x2fad3bb3, 0x2fa766e3, 0x2fa191f7, 0x2f9bbced, 0x2f95e7c5, - 0x2f901280, 0x2f8a3d1e, - 0x2f84679f, 0x2f7e9202, 0x2f78bc48, 0x2f72e671, 0x2f6d107c, 0x2f673a6a, - 0x2f61643b, 0x2f5b8def, - 0x2f55b785, 0x2f4fe0ff, 0x2f4a0a5b, 0x2f44339a, 0x2f3e5cbb, 0x2f3885c0, - 0x2f32aea8, 0x2f2cd772, - 0x2f27001f, 0x2f2128af, 0x2f1b5122, 0x2f157979, 0x2f0fa1b2, 0x2f09c9ce, - 0x2f03f1cd, 0x2efe19ae, - 0x2ef84173, 0x2ef2691b, 0x2eec90a7, 0x2ee6b815, 0x2ee0df66, 0x2edb069a, - 0x2ed52db1, 0x2ecf54ac, - 0x2ec97b89, 0x2ec3a24a, 0x2ebdc8ee, 0x2eb7ef75, 0x2eb215df, 0x2eac3c2d, - 0x2ea6625d, 0x2ea08871, - 0x2e9aae68, 0x2e94d443, 0x2e8efa00, 0x2e891fa1, 0x2e834525, 0x2e7d6a8d, - 0x2e778fd8, 0x2e71b506, - 0x2e6bda17, 0x2e65ff0c, 0x2e6023e5, 0x2e5a48a0, 0x2e546d3f, 0x2e4e91c2, - 0x2e48b628, 0x2e42da71, - 0x2e3cfe9e, 0x2e3722ae, 0x2e3146a2, 0x2e2b6a79, 0x2e258e34, 0x2e1fb1d3, - 0x2e19d554, 0x2e13f8ba, - 0x2e0e1c03, 0x2e083f30, 0x2e026240, 0x2dfc8534, 0x2df6a80b, 0x2df0cac6, - 0x2deaed65, 0x2de50fe8, - 0x2ddf324e, 0x2dd95498, 0x2dd376c5, 0x2dcd98d7, 0x2dc7bacc, 0x2dc1dca4, - 0x2dbbfe61, 0x2db62001, - 0x2db04186, 0x2daa62ee, 0x2da4843a, 0x2d9ea569, 0x2d98c67d, 0x2d92e774, - 0x2d8d084f, 0x2d87290f, - 0x2d8149b2, 0x2d7b6a39, 0x2d758aa4, 0x2d6faaf3, 0x2d69cb26, 0x2d63eb3d, - 0x2d5e0b38, 0x2d582b17, - 0x2d524ada, 0x2d4c6a81, 0x2d468a0c, 0x2d40a97b, 0x2d3ac8ce, 0x2d34e805, - 0x2d2f0721, 0x2d292620, - 0x2d234504, 0x2d1d63cc, 0x2d178278, 0x2d11a108, 0x2d0bbf7d, 0x2d05ddd5, - 0x2cfffc12, 0x2cfa1a33, - 0x2cf43839, 0x2cee5622, 0x2ce873f0, 0x2ce291a2, 0x2cdcaf39, 0x2cd6ccb4, - 0x2cd0ea13, 0x2ccb0756, - 0x2cc5247e, 0x2cbf418b, 0x2cb95e7b, 0x2cb37b51, 0x2cad980a, 0x2ca7b4a8, - 0x2ca1d12a, 0x2c9bed91, - 0x2c9609dd, 0x2c90260d, 0x2c8a4221, 0x2c845e1a, 0x2c7e79f7, 0x2c7895b9, - 0x2c72b160, 0x2c6ccceb, - 0x2c66e85b, 0x2c6103af, 0x2c5b1ee8, 0x2c553a06, 0x2c4f5508, 0x2c496fef, - 0x2c438abb, 0x2c3da56b, - 0x2c37c000, 0x2c31da7a, 0x2c2bf4d8, 0x2c260f1c, 0x2c202944, 0x2c1a4351, - 0x2c145d42, 0x2c0e7719, - 0x2c0890d4, 0x2c02aa74, 0x2bfcc3f9, 0x2bf6dd63, 0x2bf0f6b1, 0x2beb0fe5, - 0x2be528fd, 0x2bdf41fb, - 0x2bd95add, 0x2bd373a4, 0x2bcd8c51, 0x2bc7a4e2, 0x2bc1bd58, 0x2bbbd5b3, - 0x2bb5edf4, 0x2bb00619, - 0x2baa1e23, 0x2ba43613, 0x2b9e4de7, 0x2b9865a1, 0x2b927d3f, 0x2b8c94c3, - 0x2b86ac2c, 0x2b80c37a, - 0x2b7adaae, 0x2b74f1c6, 0x2b6f08c4, 0x2b691fa6, 0x2b63366f, 0x2b5d4d1c, - 0x2b5763ae, 0x2b517a26, - 0x2b4b9083, 0x2b45a6c6, 0x2b3fbced, 0x2b39d2fa, 0x2b33e8ed, 0x2b2dfec5, - 0x2b281482, 0x2b222a24, - 0x2b1c3fac, 0x2b165519, 0x2b106a6c, 0x2b0a7fa4, 0x2b0494c2, 0x2afea9c5, - 0x2af8bead, 0x2af2d37b, - 0x2aece82f, 0x2ae6fcc8, 0x2ae11146, 0x2adb25aa, 0x2ad539f4, 0x2acf4e23, - 0x2ac96238, 0x2ac37633, - 0x2abd8a13, 0x2ab79dd8, 0x2ab1b184, 0x2aabc515, 0x2aa5d88b, 0x2a9febe8, - 0x2a99ff2a, 0x2a941252, - 0x2a8e255f, 0x2a883853, 0x2a824b2c, 0x2a7c5deb, 0x2a76708f, 0x2a70831a, - 0x2a6a958a, 0x2a64a7e0, - 0x2a5eba1c, 0x2a58cc3e, 0x2a52de46, 0x2a4cf033, 0x2a470207, 0x2a4113c0, - 0x2a3b2560, 0x2a3536e5, - 0x2a2f4850, 0x2a2959a1, 0x2a236ad9, 0x2a1d7bf6, 0x2a178cf9, 0x2a119de2, - 0x2a0baeb2, 0x2a05bf67, - 0x29ffd003, 0x29f9e084, 0x29f3f0ec, 0x29ee013a, 0x29e8116e, 0x29e22188, - 0x29dc3188, 0x29d6416f, - 0x29d0513b, 0x29ca60ee, 0x29c47087, 0x29be8007, 0x29b88f6c, 0x29b29eb8, - 0x29acadea, 0x29a6bd02, - 0x29a0cc01, 0x299adae6, 0x2994e9b1, 0x298ef863, 0x298906fb, 0x2983157a, - 0x297d23df, 0x2977322a, - 0x2971405b, 0x296b4e74, 0x29655c72, 0x295f6a57, 0x29597823, 0x295385d5, - 0x294d936d, 0x2947a0ec, - 0x2941ae52, 0x293bbb9e, 0x2935c8d1, 0x292fd5ea, 0x2929e2ea, 0x2923efd0, - 0x291dfc9d, 0x29180951, - 0x291215eb, 0x290c226c, 0x29062ed4, 0x29003b23, 0x28fa4758, 0x28f45374, - 0x28ee5f76, 0x28e86b5f, - 0x28e27730, 0x28dc82e6, 0x28d68e84, 0x28d09a09, 0x28caa574, 0x28c4b0c6, - 0x28bebbff, 0x28b8c71f, - 0x28b2d226, 0x28acdd13, 0x28a6e7e8, 0x28a0f2a3, 0x289afd46, 0x289507cf, - 0x288f123f, 0x28891c97, - 0x288326d5, 0x287d30fa, 0x28773b07, 0x287144fa, 0x286b4ed5, 0x28655896, - 0x285f623f, 0x28596bce, - 0x28537545, 0x284d7ea3, 0x284787e8, 0x28419114, 0x283b9a28, 0x2835a322, - 0x282fac04, 0x2829b4cd, - 0x2823bd7d, 0x281dc615, 0x2817ce93, 0x2811d6f9, 0x280bdf46, 0x2805e77b, - 0x27ffef97, 0x27f9f79a, - 0x27f3ff85, 0x27ee0756, 0x27e80f10, 0x27e216b0, 0x27dc1e38, 0x27d625a8, - 0x27d02cff, 0x27ca343d, - 0x27c43b63, 0x27be4270, 0x27b84965, 0x27b25041, 0x27ac5705, 0x27a65db0, - 0x27a06443, 0x279a6abd, - 0x2794711f, 0x278e7768, 0x27887d99, 0x278283b2, 0x277c89b3, 0x27768f9b, - 0x2770956a, 0x276a9b21, - 0x2764a0c0, 0x275ea647, 0x2758abb6, 0x2752b10c, 0x274cb64a, 0x2746bb6f, - 0x2740c07d, 0x273ac572, - 0x2734ca4f, 0x272ecf14, 0x2728d3c0, 0x2722d855, 0x271cdcd1, 0x2716e136, - 0x2710e582, 0x270ae9b6, - 0x2704edd2, 0x26fef1d5, 0x26f8f5c1, 0x26f2f995, 0x26ecfd51, 0x26e700f5, - 0x26e10480, 0x26db07f4, - 0x26d50b50, 0x26cf0e94, 0x26c911c0, 0x26c314d4, 0x26bd17d0, 0x26b71ab4, - 0x26b11d80, 0x26ab2034, - 0x26a522d1, 0x269f2556, 0x269927c3, 0x26932a18, 0x268d2c55, 0x26872e7b, - 0x26813088, 0x267b327e, - 0x2675345d, 0x266f3623, 0x266937d2, 0x26633969, 0x265d3ae9, 0x26573c50, - 0x26513da1, 0x264b3ed9, - 0x26453ffa, 0x263f4103, 0x263941f5, 0x263342cf, 0x262d4392, 0x2627443d, - 0x262144d0, 0x261b454c, - 0x261545b0, 0x260f45fd, 0x26094633, 0x26034651, 0x25fd4657, 0x25f74646, - 0x25f1461e, 0x25eb45de, - 0x25e54587, 0x25df4519, 0x25d94493, 0x25d343f6, 0x25cd4341, 0x25c74276, - 0x25c14192, 0x25bb4098, - 0x25b53f86, 0x25af3e5d, 0x25a93d1d, 0x25a33bc6, 0x259d3a57, 0x259738d1, - 0x25913734, 0x258b3580, - 0x258533b5, 0x257f31d2, 0x25792fd8, 0x25732dc8, 0x256d2ba0, 0x25672961, - 0x2561270b, 0x255b249e, - 0x2555221a, 0x254f1f7e, 0x25491ccc, 0x25431a03, 0x253d1723, 0x2537142c, - 0x2531111e, 0x252b0df9, - 0x25250abd, 0x251f076a, 0x25190400, 0x25130080, 0x250cfce8, 0x2506f93a, - 0x2500f574, 0x24faf198, - 0x24f4eda6, 0x24eee99c, 0x24e8e57c, 0x24e2e144, 0x24dcdcf6, 0x24d6d892, - 0x24d0d416, 0x24cacf84, - 0x24c4cadb, 0x24bec61c, 0x24b8c146, 0x24b2bc59, 0x24acb756, 0x24a6b23b, - 0x24a0ad0b, 0x249aa7c4, - 0x2494a266, 0x248e9cf1, 0x24889766, 0x248291c5, 0x247c8c0d, 0x2476863e, - 0x24708059, 0x246a7a5e, - 0x2464744c, 0x245e6e23, 0x245867e4, 0x2452618f, 0x244c5b24, 0x244654a1, - 0x24404e09, 0x243a475a, - 0x24344095, 0x242e39ba, 0x242832c8, 0x24222bc0, 0x241c24a1, 0x24161d6d, - 0x24101622, 0x240a0ec1, - 0x24040749, 0x23fdffbc, 0x23f7f818, 0x23f1f05e, 0x23ebe88e, 0x23e5e0a7, - 0x23dfd8ab, 0x23d9d098, - 0x23d3c86f, 0x23cdc031, 0x23c7b7dc, 0x23c1af71, 0x23bba6f0, 0x23b59e59, - 0x23af95ac, 0x23a98ce8, - 0x23a3840f, 0x239d7b20, 0x2397721b, 0x23916900, 0x238b5fcf, 0x23855688, - 0x237f4d2b, 0x237943b9, - 0x23733a30, 0x236d3092, 0x236726dd, 0x23611d13, 0x235b1333, 0x2355093e, - 0x234eff32, 0x2348f511, - 0x2342eada, 0x233ce08d, 0x2336d62a, 0x2330cbb2, 0x232ac124, 0x2324b680, - 0x231eabc7, 0x2318a0f8, - 0x23129613, 0x230c8b19, 0x23068009, 0x230074e3, 0x22fa69a8, 0x22f45e57, - 0x22ee52f1, 0x22e84775, - 0x22e23be4, 0x22dc303d, 0x22d62480, 0x22d018ae, 0x22ca0cc7, 0x22c400ca, - 0x22bdf4b8, 0x22b7e890, - 0x22b1dc53, 0x22abd001, 0x22a5c399, 0x229fb71b, 0x2299aa89, 0x22939de1, - 0x228d9123, 0x22878451, - 0x22817769, 0x227b6a6c, 0x22755d59, 0x226f5032, 0x226942f5, 0x226335a2, - 0x225d283b, 0x22571abe, - 0x22510d2d, 0x224aff86, 0x2244f1c9, 0x223ee3f8, 0x2238d612, 0x2232c816, - 0x222cba06, 0x2226abe0, - 0x22209da5, 0x221a8f56, 0x221480f1, 0x220e7277, 0x220863e8, 0x22025544, - 0x21fc468b, 0x21f637be, - 0x21f028db, 0x21ea19e3, 0x21e40ad7, 0x21ddfbb5, 0x21d7ec7f, 0x21d1dd34, - 0x21cbcdd3, 0x21c5be5e, - 0x21bfaed5, 0x21b99f36, 0x21b38f83, 0x21ad7fba, 0x21a76fdd, 0x21a15fec, - 0x219b4fe5, 0x21953fca, - 0x218f2f9a, 0x21891f55, 0x21830efc, 0x217cfe8e, 0x2176ee0b, 0x2170dd74, - 0x216accc8, 0x2164bc08, - 0x215eab33, 0x21589a49, 0x2152894b, 0x214c7838, 0x21466710, 0x214055d4, - 0x213a4484, 0x2134331f, - 0x212e21a6, 0x21281018, 0x2121fe76, 0x211becbf, 0x2115daf4, 0x210fc914, - 0x2109b720, 0x2103a518, - 0x20fd92fb, 0x20f780ca, 0x20f16e84, 0x20eb5c2b, 0x20e549bd, 0x20df373a, - 0x20d924a4, 0x20d311f9, - 0x20ccff3a, 0x20c6ec66, 0x20c0d97f, 0x20bac683, 0x20b4b373, 0x20aea04f, - 0x20a88d17, 0x20a279ca, - 0x209c666a, 0x209652f5, 0x20903f6c, 0x208a2bcf, 0x2084181e, 0x207e0459, - 0x2077f080, 0x2071dc93, - 0x206bc892, 0x2065b47d, 0x205fa054, 0x20598c17, 0x205377c6, 0x204d6361, - 0x20474ee8, 0x20413a5b, - 0x203b25bb, 0x20351106, 0x202efc3e, 0x2028e761, 0x2022d271, 0x201cbd6d, - 0x2016a856, 0x2010932a, - 0x200a7deb, 0x20046898, 0x1ffe5331, 0x1ff83db6, 0x1ff22828, 0x1fec1286, - 0x1fe5fcd0, 0x1fdfe707, - 0x1fd9d12a, 0x1fd3bb39, 0x1fcda535, 0x1fc78f1d, 0x1fc178f1, 0x1fbb62b2, - 0x1fb54c60, 0x1faf35f9, - 0x1fa91f80, 0x1fa308f2, 0x1f9cf252, 0x1f96db9d, 0x1f90c4d5, 0x1f8aadfa, - 0x1f84970b, 0x1f7e8009, - 0x1f7868f4, 0x1f7251ca, 0x1f6c3a8e, 0x1f66233e, 0x1f600bdb, 0x1f59f465, - 0x1f53dcdb, 0x1f4dc53d, - 0x1f47ad8d, 0x1f4195c9, 0x1f3b7df2, 0x1f356608, 0x1f2f4e0a, 0x1f2935f9, - 0x1f231dd5, 0x1f1d059e, - 0x1f16ed54, 0x1f10d4f6, 0x1f0abc85, 0x1f04a401, 0x1efe8b6a, 0x1ef872c0, - 0x1ef25a03, 0x1eec4132, - 0x1ee6284f, 0x1ee00f58, 0x1ed9f64f, 0x1ed3dd32, 0x1ecdc402, 0x1ec7aac0, - 0x1ec1916a, 0x1ebb7802, - 0x1eb55e86, 0x1eaf44f8, 0x1ea92b56, 0x1ea311a2, 0x1e9cf7db, 0x1e96de01, - 0x1e90c414, 0x1e8aaa14, - 0x1e849001, 0x1e7e75dc, 0x1e785ba3, 0x1e724158, 0x1e6c26fa, 0x1e660c8a, - 0x1e5ff206, 0x1e59d770, - 0x1e53bcc7, 0x1e4da20c, 0x1e47873d, 0x1e416c5d, 0x1e3b5169, 0x1e353663, - 0x1e2f1b4a, 0x1e29001e, - 0x1e22e4e0, 0x1e1cc990, 0x1e16ae2c, 0x1e1092b6, 0x1e0a772e, 0x1e045b93, - 0x1dfe3fe6, 0x1df82426, - 0x1df20853, 0x1debec6f, 0x1de5d077, 0x1ddfb46e, 0x1dd99851, 0x1dd37c23, - 0x1dcd5fe2, 0x1dc7438e, - 0x1dc12729, 0x1dbb0ab0, 0x1db4ee26, 0x1daed189, 0x1da8b4da, 0x1da29819, - 0x1d9c7b45, 0x1d965e5f, - 0x1d904167, 0x1d8a245c, 0x1d840740, 0x1d7dea11, 0x1d77ccd0, 0x1d71af7d, - 0x1d6b9217, 0x1d6574a0, - 0x1d5f5716, 0x1d59397a, 0x1d531bcc, 0x1d4cfe0d, 0x1d46e03a, 0x1d40c256, - 0x1d3aa460, 0x1d348658, - 0x1d2e683e, 0x1d284a12, 0x1d222bd3, 0x1d1c0d83, 0x1d15ef21, 0x1d0fd0ad, - 0x1d09b227, 0x1d03938f, - 0x1cfd74e5, 0x1cf7562a, 0x1cf1375c, 0x1ceb187d, 0x1ce4f98c, 0x1cdeda89, - 0x1cd8bb74, 0x1cd29c4d, - 0x1ccc7d15, 0x1cc65dca, 0x1cc03e6e, 0x1cba1f01, 0x1cb3ff81, 0x1caddff0, - 0x1ca7c04d, 0x1ca1a099, - 0x1c9b80d3, 0x1c9560fb, 0x1c8f4112, 0x1c892117, 0x1c83010a, 0x1c7ce0ec, - 0x1c76c0bc, 0x1c70a07b, - 0x1c6a8028, 0x1c645fc3, 0x1c5e3f4d, 0x1c581ec6, 0x1c51fe2d, 0x1c4bdd83, - 0x1c45bcc7, 0x1c3f9bf9, - 0x1c397b1b, 0x1c335a2b, 0x1c2d3929, 0x1c271816, 0x1c20f6f2, 0x1c1ad5bc, - 0x1c14b475, 0x1c0e931d, - 0x1c0871b4, 0x1c025039, 0x1bfc2ead, 0x1bf60d0f, 0x1befeb60, 0x1be9c9a1, - 0x1be3a7cf, 0x1bdd85ed, - 0x1bd763fa, 0x1bd141f5, 0x1bcb1fdf, 0x1bc4fdb8, 0x1bbedb80, 0x1bb8b937, - 0x1bb296dc, 0x1bac7471, - 0x1ba651f5, 0x1ba02f67, 0x1b9a0cc8, 0x1b93ea19, 0x1b8dc758, 0x1b87a487, - 0x1b8181a4, 0x1b7b5eb0, - 0x1b753bac, 0x1b6f1897, 0x1b68f570, 0x1b62d239, 0x1b5caef1, 0x1b568b98, - 0x1b50682e, 0x1b4a44b3, - 0x1b442127, 0x1b3dfd8b, 0x1b37d9de, 0x1b31b620, 0x1b2b9251, 0x1b256e71, - 0x1b1f4a81, 0x1b192680, - 0x1b13026e, 0x1b0cde4c, 0x1b06ba19, 0x1b0095d5, 0x1afa7180, 0x1af44d1b, - 0x1aee28a6, 0x1ae8041f, - 0x1ae1df88, 0x1adbbae1, 0x1ad59629, 0x1acf7160, 0x1ac94c87, 0x1ac3279d, - 0x1abd02a3, 0x1ab6dd98, - 0x1ab0b87d, 0x1aaa9352, 0x1aa46e16, 0x1a9e48c9, 0x1a98236c, 0x1a91fdff, - 0x1a8bd881, 0x1a85b2f3, - 0x1a7f8d54, 0x1a7967a6, 0x1a7341e6, 0x1a6d1c17, 0x1a66f637, 0x1a60d047, - 0x1a5aaa47, 0x1a548436, - 0x1a4e5e15, 0x1a4837e4, 0x1a4211a3, 0x1a3beb52, 0x1a35c4f0, 0x1a2f9e7e, - 0x1a2977fc, 0x1a23516a, - 0x1a1d2ac8, 0x1a170416, 0x1a10dd53, 0x1a0ab681, 0x1a048f9e, 0x19fe68ac, - 0x19f841a9, 0x19f21a96, - 0x19ebf374, 0x19e5cc41, 0x19dfa4fe, 0x19d97dac, 0x19d35649, 0x19cd2ed7, - 0x19c70754, 0x19c0dfc2, - 0x19bab820, 0x19b4906e, 0x19ae68ac, 0x19a840da, 0x19a218f9, 0x199bf107, - 0x1995c906, 0x198fa0f5, - 0x198978d4, 0x198350a4, 0x197d2864, 0x19770014, 0x1970d7b4, 0x196aaf45, - 0x196486c6, 0x195e5e37, - 0x19583599, 0x19520ceb, 0x194be42d, 0x1945bb60, 0x193f9283, 0x19396997, - 0x1933409b, 0x192d178f, - 0x1926ee74, 0x1920c54a, 0x191a9c10, 0x191472c6, 0x190e496d, 0x19082005, - 0x1901f68d, 0x18fbcd06, - 0x18f5a36f, 0x18ef79c9, 0x18e95014, 0x18e3264f, 0x18dcfc7b, 0x18d6d297, - 0x18d0a8a4, 0x18ca7ea2, - 0x18c45491, 0x18be2a70, 0x18b80040, 0x18b1d601, 0x18ababb2, 0x18a58154, - 0x189f56e8, 0x18992c6b, - 0x189301e0, 0x188cd746, 0x1886ac9c, 0x188081e4, 0x187a571c, 0x18742c45, - 0x186e015f, 0x1867d66a, - 0x1861ab66, 0x185b8053, 0x18555530, 0x184f29ff, 0x1848febf, 0x1842d370, - 0x183ca812, 0x18367ca5, - 0x18305129, 0x182a259e, 0x1823fa04, 0x181dce5b, 0x1817a2a4, 0x181176dd, - 0x180b4b08, 0x18051f24, - 0x17fef331, 0x17f8c72f, 0x17f29b1e, 0x17ec6eff, 0x17e642d1, 0x17e01694, - 0x17d9ea49, 0x17d3bdee, - 0x17cd9186, 0x17c7650e, 0x17c13888, 0x17bb0bf3, 0x17b4df4f, 0x17aeb29d, - 0x17a885dc, 0x17a2590d, - 0x179c2c2f, 0x1795ff42, 0x178fd247, 0x1789a53d, 0x17837825, 0x177d4afe, - 0x17771dc9, 0x1770f086, - 0x176ac333, 0x176495d3, 0x175e6864, 0x17583ae7, 0x17520d5b, 0x174bdfc1, - 0x1745b218, 0x173f8461, - 0x1739569c, 0x173328c8, 0x172cfae6, 0x1726ccf6, 0x17209ef8, 0x171a70eb, - 0x171442d0, 0x170e14a7, - 0x1707e670, 0x1701b82a, 0x16fb89d6, 0x16f55b74, 0x16ef2d04, 0x16e8fe86, - 0x16e2cff9, 0x16dca15f, - 0x16d672b6, 0x16d043ff, 0x16ca153a, 0x16c3e667, 0x16bdb787, 0x16b78898, - 0x16b1599b, 0x16ab2a90, - 0x16a4fb77, 0x169ecc50, 0x16989d1b, 0x16926dd8, 0x168c3e87, 0x16860f29, - 0x167fdfbc, 0x1679b042, - 0x167380ba, 0x166d5123, 0x1667217f, 0x1660f1ce, 0x165ac20e, 0x16549241, - 0x164e6266, 0x1648327d, - 0x16420286, 0x163bd282, 0x1635a270, 0x162f7250, 0x16294222, 0x162311e7, - 0x161ce19e, 0x1616b148, - 0x161080e4, 0x160a5072, 0x16041ff3, 0x15fdef66, 0x15f7becc, 0x15f18e24, - 0x15eb5d6e, 0x15e52cab, - 0x15defbdb, 0x15d8cafd, 0x15d29a11, 0x15cc6918, 0x15c63812, 0x15c006fe, - 0x15b9d5dd, 0x15b3a4ae, - 0x15ad7372, 0x15a74228, 0x15a110d2, 0x159adf6e, 0x1594adfc, 0x158e7c7d, - 0x15884af1, 0x15821958, - 0x157be7b1, 0x1575b5fe, 0x156f843c, 0x1569526e, 0x15632093, 0x155ceeaa, - 0x1556bcb4, 0x15508ab1, - 0x154a58a1, 0x15442683, 0x153df459, 0x1537c221, 0x15318fdd, 0x152b5d8b, - 0x15252b2c, 0x151ef8c0, - 0x1518c648, 0x151293c2, 0x150c612f, 0x15062e8f, 0x14fffbe2, 0x14f9c928, - 0x14f39662, 0x14ed638e, - 0x14e730ae, 0x14e0fdc0, 0x14dacac6, 0x14d497bf, 0x14ce64ab, 0x14c8318a, - 0x14c1fe5c, 0x14bbcb22, - 0x14b597da, 0x14af6486, 0x14a93125, 0x14a2fdb8, 0x149cca3e, 0x149696b7, - 0x14906323, 0x148a2f82, - 0x1483fbd5, 0x147dc81c, 0x14779455, 0x14716082, 0x146b2ca3, 0x1464f8b7, - 0x145ec4be, 0x145890b9, - 0x14525ca7, 0x144c2888, 0x1445f45d, 0x143fc026, 0x14398be2, 0x14335792, - 0x142d2335, 0x1426eecb, - 0x1420ba56, 0x141a85d3, 0x14145145, 0x140e1caa, 0x1407e803, 0x1401b34f, - 0x13fb7e8f, 0x13f549c3, - 0x13ef14ea, 0x13e8e005, 0x13e2ab14, 0x13dc7616, 0x13d6410d, 0x13d00bf7, - 0x13c9d6d4, 0x13c3a1a6, - 0x13bd6c6b, 0x13b73725, 0x13b101d2, 0x13aacc73, 0x13a49707, 0x139e6190, - 0x13982c0d, 0x1391f67d, - 0x138bc0e1, 0x13858b3a, 0x137f5586, 0x13791fc6, 0x1372e9fb, 0x136cb423, - 0x13667e3f, 0x13604850, - 0x135a1254, 0x1353dc4c, 0x134da639, 0x1347701a, 0x134139ee, 0x133b03b7, - 0x1334cd74, 0x132e9725, - 0x132860ca, 0x13222a64, 0x131bf3f2, 0x1315bd73, 0x130f86ea, 0x13095054, - 0x130319b3, 0x12fce305, - 0x12f6ac4d, 0x12f07588, 0x12ea3eb8, 0x12e407dc, 0x12ddd0f4, 0x12d79a01, - 0x12d16303, 0x12cb2bf8, - 0x12c4f4e2, 0x12bebdc1, 0x12b88693, 0x12b24f5b, 0x12ac1817, 0x12a5e0c7, - 0x129fa96c, 0x12997205, - 0x12933a93, 0x128d0315, 0x1286cb8c, 0x128093f7, 0x127a5c57, 0x127424ac, - 0x126decf5, 0x1267b533, - 0x12617d66, 0x125b458d, 0x12550da9, 0x124ed5ba, 0x12489dbf, 0x124265b9, - 0x123c2da8, 0x1235f58b, - 0x122fbd63, 0x12298530, 0x12234cf2, 0x121d14a9, 0x1216dc54, 0x1210a3f5, - 0x120a6b8a, 0x12043314, - 0x11fdfa93, 0x11f7c207, 0x11f18970, 0x11eb50cd, 0x11e51820, 0x11dedf68, - 0x11d8a6a4, 0x11d26dd6, - 0x11cc34fc, 0x11c5fc18, 0x11bfc329, 0x11b98a2e, 0x11b35129, 0x11ad1819, - 0x11a6defe, 0x11a0a5d8, - 0x119a6ca7, 0x1194336b, 0x118dfa25, 0x1187c0d3, 0x11818777, 0x117b4e10, - 0x1175149e, 0x116edb22, - 0x1168a19b, 0x11626809, 0x115c2e6c, 0x1155f4c4, 0x114fbb12, 0x11498156, - 0x1143478e, 0x113d0dbc, - 0x1136d3df, 0x113099f8, 0x112a6006, 0x11242609, 0x111dec02, 0x1117b1f0, - 0x111177d4, 0x110b3dad, - 0x1105037c, 0x10fec940, 0x10f88efa, 0x10f254a9, 0x10ec1a4e, 0x10e5dfe8, - 0x10dfa578, 0x10d96afe, - 0x10d33079, 0x10ccf5ea, 0x10c6bb50, 0x10c080ac, 0x10ba45fe, 0x10b40b45, - 0x10add082, 0x10a795b5, - 0x10a15ade, 0x109b1ffc, 0x1094e510, 0x108eaa1a, 0x10886f19, 0x1082340f, - 0x107bf8fa, 0x1075bddb, - 0x106f82b2, 0x1069477f, 0x10630c41, 0x105cd0fa, 0x105695a8, 0x10505a4d, - 0x104a1ee7, 0x1043e377, - 0x103da7fd, 0x10376c79, 0x103130ec, 0x102af554, 0x1024b9b2, 0x101e7e06, - 0x10184251, 0x10120691, - 0x100bcac7, 0x10058ef4, 0xfff5317, 0xff91730, 0xff2db3e, 0xfec9f44, - 0xfe6633f, 0xfe02730, - 0xfd9eb18, 0xfd3aef6, 0xfcd72ca, 0xfc73695, 0xfc0fa55, 0xfbabe0c, 0xfb481ba, - 0xfae455d, - 0xfa808f7, 0xfa1cc87, 0xf9b900e, 0xf95538b, 0xf8f16fe, 0xf88da68, 0xf829dc8, - 0xf7c611f, - 0xf76246c, 0xf6fe7af, 0xf69aae9, 0xf636e1a, 0xf5d3141, 0xf56f45e, 0xf50b773, - 0xf4a7a7d, - 0xf443d7e, 0xf3e0076, 0xf37c365, 0xf318649, 0xf2b4925, 0xf250bf7, 0xf1ecec0, - 0xf189180, - 0xf125436, 0xf0c16e3, 0xf05d987, 0xeff9c21, 0xef95eb2, 0xef3213a, 0xeece3b9, - 0xee6a62f, - 0xee0689b, 0xeda2afe, 0xed3ed58, 0xecdafa9, 0xec771f1, 0xec1342f, 0xebaf665, - 0xeb4b891, - 0xeae7ab4, 0xea83ccf, 0xea1fee0, 0xe9bc0e8, 0xe9582e7, 0xe8f44dd, 0xe8906cb, - 0xe82c8af, - 0xe7c8a8a, 0xe764c5c, 0xe700e26, 0xe69cfe6, 0xe63919e, 0xe5d534d, 0xe5714f3, - 0xe50d690, - 0xe4a9824, 0xe4459af, 0xe3e1b32, 0xe37dcac, 0xe319e1d, 0xe2b5f85, 0xe2520e5, - 0xe1ee23c, - 0xe18a38a, 0xe1264cf, 0xe0c260c, 0xe05e740, 0xdffa86b, 0xdf9698e, 0xdf32aa8, - 0xdecebba, - 0xde6acc3, 0xde06dc3, 0xdda2ebb, 0xdd3efab, 0xdcdb091, 0xdc77170, 0xdc13245, - 0xdbaf313, - 0xdb4b3d7, 0xdae7494, 0xda83548, 0xda1f5f3, 0xd9bb696, 0xd957731, 0xd8f37c3, - 0xd88f84d, - 0xd82b8cf, 0xd7c7948, 0xd7639b9, 0xd6ffa22, 0xd69ba82, 0xd637ada, 0xd5d3b2a, - 0xd56fb71, - 0xd50bbb1, 0xd4a7be8, 0xd443c17, 0xd3dfc3e, 0xd37bc5c, 0xd317c73, 0xd2b3c81, - 0xd24fc87, - 0xd1ebc85, 0xd187c7b, 0xd123c69, 0xd0bfc4f, 0xd05bc2d, 0xcff7c02, 0xcf93bd0, - 0xcf2fb96, - 0xcecbb53, 0xce67b09, 0xce03ab7, 0xcd9fa5d, 0xcd3b9fb, 0xccd7991, 0xcc7391f, - 0xcc0f8a5, - 0xcbab824, 0xcb4779a, 0xcae3709, 0xca7f670, 0xca1b5cf, 0xc9b7526, 0xc953475, - 0xc8ef3bd, - 0xc88b2fd, 0xc827235, 0xc7c3166, 0xc75f08f, 0xc6fafb0, 0xc696ec9, 0xc632ddb, - 0xc5cece5, - 0xc56abe8, 0xc506ae3, 0xc4a29d6, 0xc43e8c2, 0xc3da7a6, 0xc376683, 0xc312558, - 0xc2ae425, - 0xc24a2eb, 0xc1e61aa, 0xc182061, 0xc11df11, 0xc0b9db9, 0xc055c5a, 0xbff1af3, - 0xbf8d985, - 0xbf29810, 0xbec5693, 0xbe6150f, 0xbdfd383, 0xbd991f0, 0xbd35056, 0xbcd0eb5, - 0xbc6cd0c, - 0xbc08b5c, 0xbba49a5, 0xbb407e7, 0xbadc621, 0xba78454, 0xba14280, 0xb9b00a5, - 0xb94bec2, - 0xb8e7cd9, 0xb883ae8, 0xb81f8f0, 0xb7bb6f2, 0xb7574ec, 0xb6f32df, 0xb68f0cb, - 0xb62aeaf, - 0xb5c6c8d, 0xb562a64, 0xb4fe834, 0xb49a5fd, 0xb4363bf, 0xb3d217a, 0xb36df2e, - 0xb309cdb, - 0xb2a5a81, 0xb241820, 0xb1dd5b9, 0xb17934b, 0xb1150d5, 0xb0b0e59, 0xb04cbd6, - 0xafe894d, - 0xaf846bc, 0xaf20425, 0xaebc187, 0xae57ee2, 0xadf3c37, 0xad8f985, 0xad2b6cc, - 0xacc740c, - 0xac63146, 0xabfee79, 0xab9aba6, 0xab368cc, 0xaad25eb, 0xaa6e304, 0xaa0a016, - 0xa9a5d22, - 0xa941a27, 0xa8dd725, 0xa87941d, 0xa81510f, 0xa7b0dfa, 0xa74cadf, 0xa6e87bd, - 0xa684495, - 0xa620166, 0xa5bbe31, 0xa557af5, 0xa4f37b3, 0xa48f46b, 0xa42b11d, 0xa3c6dc8, - 0xa362a6d, - 0xa2fe70b, 0xa29a3a3, 0xa236035, 0xa1d1cc1, 0xa16d946, 0xa1095c6, 0xa0a523f, - 0xa040eb1, - 0x9fdcb1e, 0x9f78784, 0x9f143e5, 0x9eb003f, 0x9e4bc93, 0x9de78e1, 0x9d83529, - 0x9d1f16b, - 0x9cbada7, 0x9c569dc, 0x9bf260c, 0x9b8e236, 0x9b29e59, 0x9ac5a77, 0x9a6168f, - 0x99fd2a0, - 0x9998eac, 0x9934ab2, 0x98d06b2, 0x986c2ac, 0x9807ea1, 0x97a3a8f, 0x973f678, - 0x96db25a, - 0x9676e37, 0x9612a0e, 0x95ae5e0, 0x954a1ab, 0x94e5d71, 0x9481931, 0x941d4eb, - 0x93b90a0, - 0x9354c4f, 0x92f07f8, 0x928c39b, 0x9227f39, 0x91c3ad2, 0x915f664, 0x90fb1f1, - 0x9096d79, - 0x90328fb, 0x8fce477, 0x8f69fee, 0x8f05b5f, 0x8ea16cb, 0x8e3d231, 0x8dd8d92, - 0x8d748ed, - 0x8d10443, 0x8cabf93, 0x8c47ade, 0x8be3624, 0x8b7f164, 0x8b1ac9f, 0x8ab67d4, - 0x8a52304, - 0x89ede2f, 0x8989955, 0x8925475, 0x88c0f90, 0x885caa5, 0x87f85b5, 0x87940c1, - 0x872fbc6, - 0x86cb6c7, 0x86671c2, 0x8602cb9, 0x859e7aa, 0x853a296, 0x84d5d7d, 0x847185e, - 0x840d33b, - 0x83a8e12, 0x83448e5, 0x82e03b2, 0x827be7a, 0x821793e, 0x81b33fc, 0x814eeb5, - 0x80ea969, - 0x8086419, 0x8021ec3, 0x7fbd968, 0x7f59409, 0x7ef4ea4, 0x7e9093b, 0x7e2c3cd, - 0x7dc7e5a, - 0x7d638e2, 0x7cff365, 0x7c9ade4, 0x7c3685d, 0x7bd22d2, 0x7b6dd42, 0x7b097ad, - 0x7aa5214, - 0x7a40c76, 0x79dc6d3, 0x797812b, 0x7913b7f, 0x78af5ce, 0x784b019, 0x77e6a5e, - 0x77824a0, - 0x771dedc, 0x76b9914, 0x7655347, 0x75f0d76, 0x758c7a1, 0x75281c6, 0x74c3be7, - 0x745f604, - 0x73fb01c, 0x7396a30, 0x733243f, 0x72cde4a, 0x7269851, 0x7205253, 0x71a0c50, - 0x713c64a, - 0x70d803f, 0x7073a2f, 0x700f41b, 0x6faae03, 0x6f467e7, 0x6ee21c6, 0x6e7dba1, - 0x6e19578, - 0x6db4f4a, 0x6d50919, 0x6cec2e3, 0x6c87ca9, 0x6c2366a, 0x6bbf028, 0x6b5a9e1, - 0x6af6396, - 0x6a91d47, 0x6a2d6f4, 0x69c909d, 0x6964a42, 0x69003e3, 0x689bd80, 0x6837718, - 0x67d30ad, - 0x676ea3d, 0x670a3ca, 0x66a5d53, 0x66416d8, 0x65dd058, 0x65789d5, 0x651434e, - 0x64afcc3, - 0x644b634, 0x63e6fa2, 0x638290b, 0x631e271, 0x62b9bd3, 0x6255531, 0x61f0e8b, - 0x618c7e1, - 0x6128134, 0x60c3a83, 0x605f3ce, 0x5ffad15, 0x5f96659, 0x5f31f99, 0x5ecd8d6, - 0x5e6920e, - 0x5e04b43, 0x5da0475, 0x5d3bda3, 0x5cd76cd, 0x5c72ff4, 0x5c0e917, 0x5baa237, - 0x5b45b53, - 0x5ae146b, 0x5a7cd80, 0x5a18692, 0x59b3fa0, 0x594f8aa, 0x58eb1b2, 0x5886ab5, - 0x58223b6, - 0x57bdcb3, 0x57595ac, 0x56f4ea2, 0x5690795, 0x562c085, 0x55c7971, 0x556325a, - 0x54feb3f, - 0x549a422, 0x5435d01, 0x53d15dd, 0x536ceb5, 0x530878a, 0x52a405d, 0x523f92c, - 0x51db1f7, - 0x5176ac0, 0x5112385, 0x50adc48, 0x5049507, 0x4fe4dc3, 0x4f8067c, 0x4f1bf32, - 0x4eb77e5, - 0x4e53095, 0x4dee942, 0x4d8a1ec, 0x4d25a93, 0x4cc1337, 0x4c5cbd8, 0x4bf8476, - 0x4b93d11, - 0x4b2f5a9, 0x4acae3e, 0x4a666d1, 0x4a01f60, 0x499d7ed, 0x4939077, 0x48d48fe, - 0x4870182, - 0x480ba04, 0x47a7282, 0x4742afe, 0x46de377, 0x4679bee, 0x4615461, 0x45b0cd2, - 0x454c541, - 0x44e7dac, 0x4483615, 0x441ee7c, 0x43ba6df, 0x4355f40, 0x42f179f, 0x428cffb, - 0x4228854, - 0x41c40ab, 0x415f8ff, 0x40fb151, 0x40969a0, 0x40321ed, 0x3fcda37, 0x3f6927f, - 0x3f04ac4, - 0x3ea0307, 0x3e3bb48, 0x3dd7386, 0x3d72bc2, 0x3d0e3fb, 0x3ca9c32, 0x3c45467, - 0x3be0c99, - 0x3b7c4c9, 0x3b17cf7, 0x3ab3523, 0x3a4ed4c, 0x39ea573, 0x3985d97, 0x39215ba, - 0x38bcdda, - 0x38585f8, 0x37f3e14, 0x378f62e, 0x372ae46, 0x36c665b, 0x3661e6f, 0x35fd680, - 0x3598e8f, - 0x353469c, 0x34cfea8, 0x346b6b1, 0x3406eb8, 0x33a26bd, 0x333dec0, 0x32d96c1, - 0x3274ec0, - 0x32106bd, 0x31abeb9, 0x31476b2, 0x30e2ea9, 0x307e69f, 0x3019e93, 0x2fb5684, - 0x2f50e74, - 0x2eec663, 0x2e87e4f, 0x2e2363a, 0x2dbee22, 0x2d5a609, 0x2cf5def, 0x2c915d2, - 0x2c2cdb4, - 0x2bc8594, 0x2b63d73, 0x2aff54f, 0x2a9ad2a, 0x2a36504, 0x29d1cdc, 0x296d4b2, - 0x2908c87, - 0x28a445a, 0x283fc2b, 0x27db3fb, 0x2776bc9, 0x2712396, 0x26adb62, 0x264932b, - 0x25e4af4, - 0x25802bb, 0x251ba80, 0x24b7244, 0x2452a07, 0x23ee1c8, 0x2389988, 0x2325147, - 0x22c0904, - 0x225c0bf, 0x21f787a, 0x2193033, 0x212e7eb, 0x20c9fa1, 0x2065757, 0x2000f0b, - 0x1f9c6be, - 0x1f37e6f, 0x1ed3620, 0x1e6edcf, 0x1e0a57d, 0x1da5d2a, 0x1d414d6, 0x1cdcc80, - 0x1c7842a, - 0x1c13bd2, 0x1baf37a, 0x1b4ab20, 0x1ae62c5, 0x1a81a69, 0x1a1d20c, 0x19b89ae, - 0x1954150, - 0x18ef8f0, 0x188b08f, 0x182682d, 0x17c1fcb, 0x175d767, 0x16f8f03, 0x169469d, - 0x162fe37, - 0x15cb5d0, 0x1566d68, 0x15024ff, 0x149dc96, 0x143942b, 0x13d4bc0, 0x1370354, - 0x130bae7, - 0x12a727a, 0x1242a0c, 0x11de19d, 0x117992e, 0x11150be, 0x10b084d, 0x104bfdb, - 0xfe7769, - 0xf82ef6, 0xf1e683, 0xeb9e0f, 0xe5559b, 0xdf0d26, 0xd8c4b0, 0xd27c3a, - 0xcc33c3, - 0xc5eb4c, 0xbfa2d5, 0xb95a5d, 0xb311e4, 0xacc96b, 0xa680f2, 0xa03878, - 0x99effe, - 0x93a784, 0x8d5f09, 0x87168e, 0x80ce12, 0x7a8597, 0x743d1a, 0x6df49e, - 0x67ac21, - 0x6163a5, 0x5b1b27, 0x54d2aa, 0x4e8a2c, 0x4841af, 0x41f931, 0x3bb0b3, - 0x356835, - 0x2f1fb6, 0x28d738, 0x228eb9, 0x1c463b, 0x15fdbc, 0xfb53d, 0x96cbe, 0x3243f, - -}; - -/** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - * \par Normalizing factor: - * The normalizing factor is sqrt(2/N), which depends on the size of transform N. - * Normalizing factors in 1.31 format are mentioned in the table below for different DCT sizes: - * \image html dct4NormalizingQ31Table.gif - */ - -arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initializing the pointer array with the weight table base addresses of different lengths */ - q31_t *twiddlePtr[4] = { (q31_t *) WeightsQ31_128, (q31_t *) WeightsQ31_512, - (q31_t *) WeightsQ31_2048, (q31_t *) WeightsQ31_8192 - }; - - /* Initializing the pointer array with the cos factor table base addresses of different lengths */ - q31_t *pCosFactor[4] = - { (q31_t *) cos_factorsQ31_128, (q31_t *) cos_factorsQ31_512, - (q31_t *) cos_factorsQ31_2048, (q31_t *) cos_factorsQ31_8192 - }; - - /* Initialize the DCT4 length */ - S->N = N; - - /* Initialize the half of DCT4 length */ - S->Nby2 = Nby2; - - /* Initialize the DCT4 Normalizing factor */ - S->normalize = normalize; - - /* Initialize Real FFT Instance */ - S->pRfft = S_RFFT; - - /* Initialize Complex FFT Instance */ - S->pCfft = S_CFFT; - - switch (N) - { - /* Initialize the table modifier values */ - case 8192u: - S->pTwiddle = twiddlePtr[3]; - S->pCosFactor = pCosFactor[3]; - break; - case 2048u: - S->pTwiddle = twiddlePtr[2]; - S->pCosFactor = pCosFactor[2]; - break; - case 512u: - S->pTwiddle = twiddlePtr[1]; - S->pCosFactor = pCosFactor[1]; - break; - case 128u: - S->pTwiddle = twiddlePtr[0]; - S->pCosFactor = pCosFactor[0]; - break; - default: - status = ARM_MATH_ARGUMENT_ERROR; - } - - /* Initialize the RFFT/RIFFT Function */ - arm_rfft_init_q31(S->pRfft, S->N, 0, 1); - - /* return the status of DCT4 Init function */ - return (status); -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c deleted file mode 100644 index b6b3712..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c +++ /dev/null @@ -1,394 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_q15.c -* -* Description: Processing function of DCT4 & IDCT4 Q15. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q15 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - * - * \par Input an output formats: - * Internally inputs are downscaled in the RFFT process function to avoid overflows. - * Number of bits downscaled, depends on the size of the transform. - * The input and output formats for different DCT sizes and number of bits to upscale are mentioned in the table below: - * - * \image html dct4FormatsQ15Table.gif - */ - -void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer) -{ - uint32_t i; /* Loop counter */ - q15_t *weights = S->pTwiddle; /* Pointer to the Weights table */ - q15_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ - q15_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ - q15_t in; /* Temporary variable */ - - - /* DCT4 computation involves DCT2 (which is calculated using RFFT) - * along with some pre-processing and post-processing. - * Computational procedure is explained as follows: - * (a) Pre-processing involves multiplying input with cos factor, - * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) - * where, - * r(n) -- output of preprocessing - * u(n) -- input to preprocessing(actual Source buffer) - * (b) Calculation of DCT2 using FFT is divided into three steps: - * Step1: Re-ordering of even and odd elements of input. - * Step2: Calculating FFT of the re-ordered input. - * Step3: Taking the real part of the product of FFT output and weights. - * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * where, - * Y4 -- DCT4 output, Y2 -- DCT2 output - * (d) Multiplying the output with the normalizing factor sqrt(2/N). - */ - - /*-------- Pre-processing ------------*/ - /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ - arm_mult_q15(pInlineBuffer, cosFact, pInlineBuffer, S->N); - arm_shift_q15(pInlineBuffer, 1, pInlineBuffer, S->N); - - /* ---------------------------------------------------------------- - * Step1: Re-ordering of even and odd elements as - * pState[i] = pInlineBuffer[2*i] and - * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 - ---------------------------------------------------------------------*/ - - /* pS1 initialized to pState */ - pS1 = pState; - - /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ - pS2 = pState + (S->N - 1u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ - i = (uint32_t) S->Nby2 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = (uint32_t) S->N >> 2u; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. - * Compute 4 outputs at a time */ - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_q15(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_q15(pState, weights, pState, S->N); - - /* The output of complex multiplication is in 3.13 format. - * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */ - arm_shift_q15(pState, 2, pState, S->N * 2); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ - i = ((uint32_t) S->N - 1u) >> 2u; - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ >> 1u; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - i = ((uint32_t) S->N - 1u) % 0x4u; - - while(i > 0u) - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - /* Decrement the loop counter */ - i--; - } - - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = (uint32_t) S->N >> 2u; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); - - in = *pbuff; - *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); - - in = *pbuff; - *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); - - in = *pbuff; - *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initializing the loop counter to N/2 */ - i = (uint32_t) S->Nby2; - - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter */ - i = (uint32_t) S->N; - - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_q15(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_q15(pState, weights, pState, S->N); - - /* The output of complex multiplication is in 3.13 format. - * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.15 format by shifting left by 2 bits. */ - arm_shift_q15(pState, 2, pState, S->N * 2); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* Initializing the loop counter */ - i = ((uint32_t) S->N - 1u); - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ >> 1u; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - do - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter */ - i = (uint32_t) S->N; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = ((q15_t) (((q31_t) in * S->normalize) >> 15)); - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c deleted file mode 100644 index 6f2c2b3..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c +++ /dev/null @@ -1,395 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_dct4_q31.c -* -* Description: Processing function of DCT4 & IDCT4 Q31. -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/** - * @addtogroup DCT4_IDCT4 - * @{ - */ - -/** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q31 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - * \par Input an output formats: - * Input samples need to be downscaled by 1 bit to avoid saturations in the Q31 DCT process, - * as the conversion from DCT2 to DCT4 involves one subtraction. - * Internally inputs are downscaled in the RFFT process function to avoid overflows. - * Number of bits downscaled, depends on the size of the transform. - * The input and output formats for different DCT sizes and number of bits to upscale are mentioned in the table below: - * - * \image html dct4FormatsQ31Table.gif - */ - -void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer) -{ - uint16_t i; /* Loop counter */ - q31_t *weights = S->pTwiddle; /* Pointer to the Weights table */ - q31_t *cosFact = S->pCosFactor; /* Pointer to the cos factors table */ - q31_t *pS1, *pS2, *pbuff; /* Temporary pointers for input buffer and pState buffer */ - q31_t in; /* Temporary variable */ - - - /* DCT4 computation involves DCT2 (which is calculated using RFFT) - * along with some pre-processing and post-processing. - * Computational procedure is explained as follows: - * (a) Pre-processing involves multiplying input with cos factor, - * r(n) = 2 * u(n) * cos(pi*(2*n+1)/(4*n)) - * where, - * r(n) -- output of preprocessing - * u(n) -- input to preprocessing(actual Source buffer) - * (b) Calculation of DCT2 using FFT is divided into three steps: - * Step1: Re-ordering of even and odd elements of input. - * Step2: Calculating FFT of the re-ordered input. - * Step3: Taking the real part of the product of FFT output and weights. - * (c) Post-processing - DCT4 can be obtained from DCT2 output using the following equation: - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * where, - * Y4 -- DCT4 output, Y2 -- DCT2 output - * (d) Multiplying the output with the normalizing factor sqrt(2/N). - */ - - /*-------- Pre-processing ------------*/ - /* Multiplying input with cos factor i.e. r(n) = 2 * x(n) * cos(pi*(2*n+1)/(4*n)) */ - arm_mult_q31(pInlineBuffer, cosFact, pInlineBuffer, S->N); - arm_shift_q31(pInlineBuffer, 1, pInlineBuffer, S->N); - - /* ---------------------------------------------------------------- - * Step1: Re-ordering of even and odd elements as - * pState[i] = pInlineBuffer[2*i] and - * pState[N-i-1] = pInlineBuffer[2*i+1] where i = 0 to N/2 - ---------------------------------------------------------------------*/ - - /* pS1 initialized to pState */ - pS1 = pState; - - /* pS2 initialized to pState+N-1, so that it points to the end of the state buffer */ - pS2 = pState + (S->N - 1u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /* Initializing the loop counter to N/2 >> 2 for loop unrolling by 4 */ - i = S->Nby2 >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - *pS1++ = *pbuff++; - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = S->N >> 2u; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. - * Compute 4 outputs at a time */ - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_q31(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_q31(pState, weights, pState, S->N); - - /* The output of complex multiplication is in 3.29 format. - * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */ - arm_shift_q31(pState, 2, pState, S->N * 2); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* Initializing the loop counter to N >> 2 for loop unrolling by 4 */ - i = (S->N - 1u) >> 2u; - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ >> 1u; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - do - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - in = *pS1++ - in; - *pbuff++ = in; - pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - i = (S->N - 1u) % 0x4u; - - while(i > 0u) - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - /* Decrement the loop counter */ - i--; - } - - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter to N/4 instead of N for loop unrolling */ - i = S->N >> 2u; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - /* Processing with loop unrolling 4 times as N is always multiple of 4. Compute 4 outputs at a time */ - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); - - in = *pbuff; - *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); - - in = *pbuff; - *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); - - in = *pbuff; - *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initializing the loop counter to N/2 */ - i = S->Nby2; - - do - { - /* Re-ordering of even and odd elements */ - /* pState[i] = pInlineBuffer[2*i] */ - *pS1++ = *pbuff++; - /* pState[N-i-1] = pInlineBuffer[2*i+1] */ - *pS2-- = *pbuff++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - /* pbuff initialized to input buffer */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Initializing the loop counter */ - i = S->N; - - do - { - /* Writing the re-ordered output back to inplace input buffer */ - *pbuff++ = *pS1++; - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - - - /* --------------------------------------------------------- - * Step2: Calculate RFFT for N-point input - * ---------------------------------------------------------- */ - /* pInlineBuffer is real input of length N , pState is the complex output of length 2N */ - arm_rfft_q31(S->pRfft, pInlineBuffer, pState); - - /*---------------------------------------------------------------------- - * Step3: Multiply the FFT output with the weights. - *----------------------------------------------------------------------*/ - arm_cmplx_mult_cmplx_q31(pState, weights, pState, S->N); - - /* The output of complex multiplication is in 3.29 format. - * Hence changing the format of N (i.e. 2*N elements) complex numbers to 1.31 format by shifting left by 2 bits. */ - arm_shift_q31(pState, 2, pState, S->N * 2); - - /* ----------- Post-processing ---------- */ - /* DCT-IV can be obtained from DCT-II by the equation, - * Y4(k) = Y2(k) - Y4(k-1) and Y4(-1) = Y4(0) - * Hence, Y4(0) = Y2(0)/2 */ - /* Getting only real part from the output and Converting to DCT-IV */ - - /* pbuff initialized to input buffer. */ - pbuff = pInlineBuffer; - - /* pS1 initialized to pState */ - pS1 = pState; - - /* Calculating Y4(0) from Y2(0) using Y4(0) = Y2(0)/2 */ - in = *pS1++ >> 1u; - /* input buffer acts as inplace, so output values are stored in the input itself. */ - *pbuff++ = in; - - /* pState pointer is incremented twice as the real values are located alternatively in the array */ - pS1++; - - /* Initializing the loop counter */ - i = (S->N - 1u); - - while(i > 0u) - { - /* Calculating Y4(1) to Y4(N-1) from Y2 using equation Y4(k) = Y2(k) - Y4(k-1) */ - /* pState pointer (pS1) is incremented twice as the real values are located alternatively in the array */ - in = *pS1++ - in; - *pbuff++ = in; - /* points to the next real value */ - pS1++; - - /* Decrement the loop counter */ - i--; - } - - - /*------------ Normalizing the output by multiplying with the normalizing factor ----------*/ - - /* Initializing the loop counter */ - i = S->N; - - /* pbuff initialized to the pInlineBuffer(now contains the output values) */ - pbuff = pInlineBuffer; - - do - { - /* Multiplying pInlineBuffer with the normalizing factor sqrt(2/N) */ - in = *pbuff; - *pbuff++ = ((q31_t) (((q63_t) in * S->normalize) >> 31)); - - /* Decrement the loop counter */ - i--; - } while(i > 0u); - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - -} - -/** - * @} end of DCT4_IDCT4 group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c deleted file mode 100644 index f7db9fa..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c +++ /dev/null @@ -1,329 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_f32.c -* -* Description: RFFT & RIFFT Floating point process function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -extern void arm_radix4_butterfly_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier); - -extern void arm_radix4_butterfly_inverse_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier, - float32_t onebyfftLen); - -extern void arm_bitreversal_f32( - float32_t * pSrc, - uint16_t fftSize, - uint16_t bitRevFactor, - uint16_t * pBitRevTab); - -/** - * @ingroup groupTransforms - */ - -/*-------------------------------------------------------------------- - * Internal functions prototypes - *--------------------------------------------------------------------*/ - -void arm_split_rfft_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pATable, - float32_t * pBTable, - float32_t * pDst, - uint32_t modifier); -void arm_split_rifft_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pATable, - float32_t * pBTable, - float32_t * pDst, - uint32_t modifier); - -/** - * @addtogroup RealFFT - * @{ - */ - -/** - * @brief Processing function for the floating-point RFFT/RIFFT. - * @deprecated Do not use this function. It has been superceded by \ref arm_rfft_fast_f32 and will be removed - * in the future. - * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - -void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst) -{ - const arm_cfft_radix4_instance_f32 *S_CFFT = S->pCfft; - - - /* Calculation of Real IFFT of input */ - if(S->ifftFlagR == 1u) - { - /* Real IFFT core process */ - arm_split_rifft_f32(pSrc, S->fftLenBy2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - - - /* Complex radix-4 IFFT process */ - arm_radix4_butterfly_inverse_f32(pDst, S_CFFT->fftLen, - S_CFFT->pTwiddle, - S_CFFT->twidCoefModifier, - S_CFFT->onebyfftLen); - - /* Bit reversal process */ - if(S->bitReverseFlagR == 1u) - { - arm_bitreversal_f32(pDst, S_CFFT->fftLen, - S_CFFT->bitRevFactor, S_CFFT->pBitRevTable); - } - } - else - { - - /* Calculation of RFFT of input */ - - /* Complex radix-4 FFT process */ - arm_radix4_butterfly_f32(pSrc, S_CFFT->fftLen, - S_CFFT->pTwiddle, S_CFFT->twidCoefModifier); - - /* Bit reversal process */ - if(S->bitReverseFlagR == 1u) - { - arm_bitreversal_f32(pSrc, S_CFFT->fftLen, - S_CFFT->bitRevFactor, S_CFFT->pBitRevTable); - } - - - /* Real FFT core process */ - arm_split_rfft_f32(pSrc, S->fftLenBy2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - } - -} - -/** - * @} end of RealFFT group - */ - -/** - * @brief Core Real FFT process - * @param[in] *pSrc points to the input buffer. - * @param[in] fftLen length of FFT. - * @param[in] *pATable points to the twiddle Coef A buffer. - * @param[in] *pBTable points to the twiddle Coef B buffer. - * @param[out] *pDst points to the output buffer. - * @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - -void arm_split_rfft_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pATable, - float32_t * pBTable, - float32_t * pDst, - uint32_t modifier) -{ - uint32_t i; /* Loop Counter */ - float32_t outR, outI; /* Temporary variables for output */ - float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ - float32_t *pDst1 = &pDst[2], *pDst2 = &pDst[(4u * fftLen) - 1u]; /* temp pointers for output buffer */ - float32_t *pSrc1 = &pSrc[2], *pSrc2 = &pSrc[(2u * fftLen) - 1u]; /* temp pointers for input buffer */ - - /* Init coefficient pointers */ - pCoefA = &pATable[modifier * 2u]; - pCoefB = &pBTable[modifier * 2u]; - - i = fftLen - 1u; - - while(i > 0u) - { - /* - outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] - + pSrc[2 * n - 2 * i] * pBTable[2 * i] + - pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - */ - - /* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */ - - /* read pATable[2 * i] */ - CoefA1 = *pCoefA++; - /* pATable[2 * i + 1] */ - CoefA2 = *pCoefA; - - /* pSrc[2 * i] * pATable[2 * i] */ - outR = *pSrc1 * CoefA1; - /* pSrc[2 * i] * CoefA2 */ - outI = *pSrc1++ * CoefA2; - - /* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */ - outR -= (*pSrc1 + *pSrc2) * CoefA2; - /* pSrc[2 * i + 1] * CoefA1 */ - outI += *pSrc1++ * CoefA1; - - CoefB1 = *pCoefB; - - /* pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */ - outI -= *pSrc2-- * CoefB1; - /* pSrc[2 * fftLen - 2 * i] * CoefA2 */ - outI -= *pSrc2 * CoefA2; - - /* pSrc[2 * fftLen - 2 * i] * CoefB1 */ - outR += *pSrc2-- * CoefB1; - - /* write output */ - *pDst1++ = outR; - *pDst1++ = outI; - - /* write complex conjugate output */ - *pDst2-- = -outI; - *pDst2-- = outR; - - /* update coefficient pointer */ - pCoefB = pCoefB + (modifier * 2u); - pCoefA = pCoefA + ((modifier * 2u) - 1u); - - i--; - - } - - pDst[2u * fftLen] = pSrc[0] - pSrc[1]; - pDst[(2u * fftLen) + 1u] = 0.0f; - - pDst[0] = pSrc[0] + pSrc[1]; - pDst[1] = 0.0f; - -} - - -/** - * @brief Core Real IFFT process - * @param[in] *pSrc points to the input buffer. - * @param[in] fftLen length of FFT. - * @param[in] *pATable points to the twiddle Coef A buffer. - * @param[in] *pBTable points to the twiddle Coef B buffer. - * @param[out] *pDst points to the output buffer. - * @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - -void arm_split_rifft_f32( - float32_t * pSrc, - uint32_t fftLen, - float32_t * pATable, - float32_t * pBTable, - float32_t * pDst, - uint32_t modifier) -{ - float32_t outR, outI; /* Temporary variables for output */ - float32_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - float32_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ - float32_t *pSrc1 = &pSrc[0], *pSrc2 = &pSrc[(2u * fftLen) + 1u]; - - pCoefA = &pATable[0]; - pCoefB = &pBTable[0]; - - while(fftLen > 0u) - { - /* - outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - - outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] - - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); - - */ - - CoefA1 = *pCoefA++; - CoefA2 = *pCoefA; - - /* outR = (pSrc[2 * i] * CoefA1 */ - outR = *pSrc1 * CoefA1; - - /* - pSrc[2 * i] * CoefA2 */ - outI = -(*pSrc1++) * CoefA2; - - /* (pSrc[2 * i + 1] + pSrc[2 * fftLen - 2 * i + 1]) * CoefA2 */ - outR += (*pSrc1 + *pSrc2) * CoefA2; - - /* pSrc[2 * i + 1] * CoefA1 */ - outI += (*pSrc1++) * CoefA1; - - CoefB1 = *pCoefB; - - /* - pSrc[2 * fftLen - 2 * i + 1] * CoefB1 */ - outI -= *pSrc2-- * CoefB1; - - /* pSrc[2 * fftLen - 2 * i] * CoefB1 */ - outR += *pSrc2 * CoefB1; - - /* pSrc[2 * fftLen - 2 * i] * CoefA2 */ - outI += *pSrc2-- * CoefA2; - - /* write output */ - *pDst++ = outR; - *pDst++ = outI; - - /* update coefficient pointer */ - pCoefB = pCoefB + (modifier * 2u); - pCoefA = pCoefA + ((modifier * 2u) - 1u); - - /* Decrement loop count */ - fftLen--; - } - -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c deleted file mode 100644 index e9cea12..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c +++ /dev/null @@ -1,353 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_f32.c -* -* Description: RFFT & RIFFT Floating point process function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -void stage_rfft_f32( - arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut) -{ - uint32_t k; /* Loop Counter */ - float32_t twR, twI; /* RFFT Twiddle coefficients */ - float32_t * pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */ - float32_t *pA = p; /* increasing pointer */ - float32_t *pB = p; /* decreasing pointer */ - float32_t xAR, xAI, xBR, xBI; /* temporary variables */ - float32_t t1a, t1b; /* temporary variables */ - float32_t p0, p1, p2, p3; /* temporary variables */ - - - k = (S->Sint).fftLen - 1; - - /* Pack first and last sample of the frequency domain together */ - - xBR = pB[0]; - xBI = pB[1]; - xAR = pA[0]; - xAI = pA[1]; - - twR = *pCoeff++ ; - twI = *pCoeff++ ; - - // U1 = XA(1) + XB(1); % It is real - t1a = xBR + xAR ; - - // U2 = XB(1) - XA(1); % It is imaginary - t1b = xBI + xAI ; - - // real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI); - // imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI); - *pOut++ = 0.5f * ( t1a + t1b ); - *pOut++ = 0.5f * ( t1a - t1b ); - - // XA(1) = 1/2*( U1 - imag(U2) + i*( U1 +imag(U2) )); - pB = p + 2*k; - pA += 2; - - do - { - /* - function X = my_split_rfft(X, ifftFlag) - % X is a series of real numbers - L = length(X); - XC = X(1:2:end) +i*X(2:2:end); - XA = fft(XC); - XB = conj(XA([1 end:-1:2])); - TW = i*exp(-2*pi*i*[0:L/2-1]/L).'; - for l = 2:L/2 - XA(l) = 1/2 * (XA(l) + XB(l) + TW(l) * (XB(l) - XA(l))); - end - XA(1) = 1/2* (XA(1) + XB(1) + TW(1) * (XB(1) - XA(1))) + i*( 1/2*( XA(1) + XB(1) + i*( XA(1) - XB(1)))); - X = XA; - */ - - xBI = pB[1]; - xBR = pB[0]; - xAR = pA[0]; - xAI = pA[1]; - - twR = *pCoeff++; - twI = *pCoeff++; - - t1a = xBR - xAR ; - t1b = xBI + xAI ; - - // real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI); - // imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI); - p0 = twR * t1a; - p1 = twI * t1a; - p2 = twR * t1b; - p3 = twI * t1b; - - *pOut++ = 0.5f * (xAR + xBR + p0 + p3 ); //xAR - *pOut++ = 0.5f * (xAI - xBI + p1 - p2 ); //xAI - - pA += 2; - pB -= 2; - k--; - } while(k > 0u); -} - -/* Prepares data for inverse cfft */ -void merge_rfft_f32( -arm_rfft_fast_instance_f32 * S, -float32_t * p, float32_t * pOut) -{ - uint32_t k; /* Loop Counter */ - float32_t twR, twI; /* RFFT Twiddle coefficients */ - float32_t *pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */ - float32_t *pA = p; /* increasing pointer */ - float32_t *pB = p; /* decreasing pointer */ - float32_t xAR, xAI, xBR, xBI; /* temporary variables */ - float32_t t1a, t1b, r, s, t, u; /* temporary variables */ - - k = (S->Sint).fftLen - 1; - - xAR = pA[0]; - xAI = pA[1]; - - pCoeff += 2 ; - - *pOut++ = 0.5f * ( xAR + xAI ); - *pOut++ = 0.5f * ( xAR - xAI ); - - pB = p + 2*k ; - pA += 2 ; - - while(k > 0u) - { - /* G is half of the frequency complex spectrum */ - //for k = 2:N - // Xk(k) = 1/2 * (G(k) + conj(G(N-k+2)) + Tw(k)*( G(k) - conj(G(N-k+2)))); - xBI = pB[1] ; - xBR = pB[0] ; - xAR = pA[0]; - xAI = pA[1]; - - twR = *pCoeff++; - twI = *pCoeff++; - - t1a = xAR - xBR ; - t1b = xAI + xBI ; - - r = twR * t1a; - s = twI * t1b; - t = twI * t1a; - u = twR * t1b; - - // real(tw * (xA - xB)) = twR * (xAR - xBR) - twI * (xAI - xBI); - // imag(tw * (xA - xB)) = twI * (xAR - xBR) + twR * (xAI - xBI); - *pOut++ = 0.5f * (xAR + xBR - r - s ); //xAR - *pOut++ = 0.5f * (xAI - xBI + t - u ); //xAI - - pA += 2; - pB -= 2; - k--; - } - -} - -/** -* @ingroup groupTransforms -*/ - -/** - * @defgroup Fast Real FFT Functions - * - * \par - * The CMSIS DSP library includes specialized algorithms for computing the - * FFT of real data sequences. The FFT is defined over complex data but - * in many applications the input is real. Real FFT algorithms take advantage - * of the symmetry properties of the FFT and have a speed advantage over complex - * algorithms of the same length. - * \par - * The Fast RFFT algorith relays on the mixed radix CFFT that save processor usage. - * \par - * The real length N forward FFT of a sequence is computed using the steps shown below. - * \par - * \image html RFFT.gif "Real Fast Fourier Transform" - * \par - * The real sequence is initially treated as if it were complex to perform a CFFT. - * Later, a processing stage reshapes the data to obtain half of the frequency spectrum - * in complex format. Except the first complex number that contains the two real numbers - * X[0] and X[N/2] all the data is complex. In other words, the first complex sample - * contains two real values packed. - * \par - * The input for the inverse RFFT should keep the same format as the output of the - * forward RFFT. A first processing stage pre-process the data to later perform an - * inverse CFFT. - * \par - * \image html RIFFT.gif "Real Inverse Fast Fourier Transform" - * \par - * The algorithms for floating-point, Q15, and Q31 data are slightly different - * and we describe each algorithm in turn. - * \par Floating-point - * The main functions are arm_rfft_fast_f32() - * and arm_rfft_fast_init_f32(). The older functions - * arm_rfft_f32() and arm_rfft_init_f32() have been - * deprecated but are still documented. - * \par - * The FFT of a real N-point sequence has even symmetry in the frequency - * domain. The second half of the data equals the conjugate of the first half - * flipped in frequency: - *
- *X[0] - real data
- *X[1] - complex data
- *X[2] - complex data
- *... 
- *X[fftLen/2-1] - complex data
- *X[fftLen/2] - real data
- *X[fftLen/2+1] - conjugate of X[fftLen/2-1]
- *X[fftLen/2+2] - conjugate of X[fftLen/2-2]
- *... 
- *X[fftLen-1] - conjugate of X[1]
- * 
- * Looking at the data, we see that we can uniquely represent the FFT using only - *
- *N/2+1 samples:
- *X[0] - real data
- *X[1] - complex data
- *X[2] - complex data
- *... 
- *X[fftLen/2-1] - complex data
- *X[fftLen/2] - real data
- * 
- * Looking more closely we see that the first and last samples are real valued. - * They can be packed together and we can thus represent the FFT of an N-point - * real sequence by N/2 complex values: - *
- *X[0],X[N/2] - packed real data: X[0] + jX[N/2]
- *X[1] - complex data
- *X[2] - complex data
- *... 
- *X[fftLen/2-1] - complex data
- * 
- * The real FFT functions pack the frequency domain data in this fashion. The - * forward transform outputs the data in this form and the inverse transform - * expects input data in this form. The function always performs the needed - * bitreversal so that the input and output data is always in normal order. The - * functions support lengths of [32, 64, 128, ..., 4096] samples. - * \par - * The forward and inverse real FFT functions apply the standard FFT scaling; no - * scaling on the forward transform and 1/fftLen scaling on the inverse - * transform. - * \par Q15 and Q31 - * The real algorithms are defined in a similar manner and utilize N/2 complex - * transforms behind the scenes. - * \par - * The complex transforms used internally include scaling to prevent fixed-point - * overflows. The overall scaling equals 1/(fftLen/2). - * \par - * A separate instance structure must be defined for each transform used but - * twiddle factor and bit reversal tables can be reused. - * \par - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Sets the values of the internal structure fields. - * - Initializes twiddle factor table and bit reversal table pointers. - * - Initializes the internal complex FFT data structure. - * \par - * Use of the initialization function is optional. - * However, if the initialization function is used, then the instance structure - * cannot be placed into a const data section. To place an instance structure - * into a const data section, the instance structure should be manually - * initialized as follows: - *
- *arm_rfft_instance_q31 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};    
- *arm_rfft_instance_q15 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};    
- * 
- * where fftLenReal is the length of the real transform; - * fftLenBy2 length of the internal complex transform. - * ifftFlagR Selects forward (=0) or inverse (=1) transform. - * bitReverseFlagR Selects bit reversed output (=0) or normal order - * output (=1). - * twidCoefRModifier stride modifier for the twiddle factor table. - * The value is based on the FFT length; - * pTwiddleARealpoints to the A array of twiddle coefficients; - * pTwiddleBRealpoints to the B array of twiddle coefficients; - * pCfft points to the CFFT Instance structure. The CFFT structure - * must also be initialized. Refer to arm_cfft_radix4_f32() for details regarding - * static initialization of the complex FFT instance structure. - */ - -/** -* @addtogroup RealFFT -* @{ -*/ - -/** -* @brief Processing function for the floating-point real FFT. -* @param[in] *S points to an arm_rfft_fast_instance_f32 structure. -* @param[in] *p points to the input buffer. -* @param[in] *pOut points to the output buffer. -* @param[in] ifftFlag RFFT if flag is 0, RIFFT if flag is 1 -* @return none. -*/ - -void arm_rfft_fast_f32( -arm_rfft_fast_instance_f32 * S, -float32_t * p, float32_t * pOut, -uint8_t ifftFlag) -{ - arm_cfft_instance_f32 * Sint = &(S->Sint); - Sint->fftLen = S->fftLenRFFT / 2; - - /* Calculation of Real FFT */ - if(ifftFlag) - { - /* Real FFT compression */ - merge_rfft_f32(S, p, pOut); - - /* Complex radix-4 IFFT process */ - arm_cfft_f32( Sint, pOut, ifftFlag, 1); - } - else - { - /* Calculation of RFFT of input */ - arm_cfft_f32( Sint, p, ifftFlag, 1); - - /* Real FFT extraction */ - stage_rfft_f32(S, p, pOut); - } -} - -/** -* @} end of RealFFT group -*/ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c deleted file mode 100644 index c9fa0c1..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c +++ /dev/null @@ -1,143 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_cfft_init_f32.c -* -* Description: Split Radix Decimation in Frequency CFFT Floating point processing function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup RealFFT - * @{ - */ - -/** -* @brief Initialization function for the floating-point real FFT. -* @param[in,out] *S points to an arm_rfft_fast_instance_f32 structure. -* @param[in] fftLen length of the Real Sequence. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. -* -* \par Description: -* \par -* The parameter fftLen Specifies length of RFFT/CIFFT process. Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096. -* \par -* This Function also initializes Twiddle factor table pointer and Bit reversal table pointer. -*/ -arm_status arm_rfft_fast_init_f32( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen) -{ - arm_cfft_instance_f32 * Sint; - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - /* Initialise the FFT length */ - Sint = &(S->Sint); - Sint->fftLen = fftLen/2; - S->fftLenRFFT = fftLen; - - /* Initializations of structure parameters depending on the FFT length */ - switch (Sint->fftLen) - { - case 2048u: - /* Initializations of structure parameters for 2048 point FFT */ - /* Initialise the bit reversal table length */ - Sint->bitRevLength = ARMBITREVINDEXTABLE2048_TABLE_LENGTH; - /* Initialise the bit reversal table pointer */ - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable2048; - /* Initialise the Twiddle coefficient pointers */ - Sint->pTwiddle = (float32_t *) twiddleCoef_2048; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_4096; - break; - case 1024u: - Sint->bitRevLength = ARMBITREVINDEXTABLE1024_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable1024; - Sint->pTwiddle = (float32_t *) twiddleCoef_1024; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_2048; - break; - case 512u: - Sint->bitRevLength = ARMBITREVINDEXTABLE_512_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable512; - Sint->pTwiddle = (float32_t *) twiddleCoef_512; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_1024; - break; - case 256u: - Sint->bitRevLength = ARMBITREVINDEXTABLE_256_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable256; - Sint->pTwiddle = (float32_t *) twiddleCoef_256; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_512; - break; - case 128u: - Sint->bitRevLength = ARMBITREVINDEXTABLE_128_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable128; - Sint->pTwiddle = (float32_t *) twiddleCoef_128; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_256; - break; - case 64u: - Sint->bitRevLength = ARMBITREVINDEXTABLE__64_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable64; - Sint->pTwiddle = (float32_t *) twiddleCoef_64; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_128; - break; - case 32u: - Sint->bitRevLength = ARMBITREVINDEXTABLE__32_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable32; - Sint->pTwiddle = (float32_t *) twiddleCoef_32; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_64; - break; - case 16u: - Sint->bitRevLength = ARMBITREVINDEXTABLE__16_TABLE_LENGTH; - Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable16; - Sint->pTwiddle = (float32_t *) twiddleCoef_16; - S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_32; - break; - default: - /* Reporting argument error if fftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - return (status); -} - -/** - * @} end of RealFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c deleted file mode 100644 index fccefaf..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c +++ /dev/null @@ -1,8376 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_init_f32.c -* -* Description: RFFT & RIFFT Floating point initialisation function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" - -/** - * @ingroup groupTransforms - */ - -/** - * @addtogroup RealFFT - * @{ - */ - -/** -* \par -* Generation of realCoefA array: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-*  {    
-*    pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-*  } 
-*/ - - - -static const float32_t realCoefA[8192] = { - 0.500000000000000f, -0.500000000000000f, 0.499616503715515f, - -0.499999850988388f, - 0.499233007431030f, -0.499999403953552f, 0.498849511146545f, - -0.499998688697815f, - 0.498466014862061f, -0.499997645616531f, 0.498082518577576f, - -0.499996334314346f, - 0.497699022293091f, -0.499994695186615f, 0.497315555810928f, - -0.499992787837982f, - 0.496932059526443f, -0.499990582466125f, 0.496548563241959f, - -0.499988079071045f, - 0.496165096759796f, -0.499985307455063f, 0.495781600475311f, - -0.499982208013535f, - 0.495398133993149f, -0.499978810548782f, 0.495014637708664f, - -0.499975144863129f, - 0.494631171226501f, -0.499971181154251f, 0.494247704744339f, - -0.499966919422150f, - 0.493864238262177f, -0.499962359666824f, 0.493480771780014f, - -0.499957501888275f, - 0.493097305297852f, -0.499952346086502f, 0.492713838815689f, - -0.499946922063828f, - 0.492330402135849f, -0.499941170215607f, 0.491946935653687f, - -0.499935150146484f, - 0.491563498973846f, -0.499928832054138f, 0.491180062294006f, - -0.499922215938568f, - 0.490796625614166f, -0.499915301799774f, 0.490413218736649f, - -0.499908089637756f, - 0.490029782056808f, -0.499900579452515f, 0.489646375179291f, - -0.499892801046371f, - 0.489262968301773f, -0.499884694814682f, 0.488879561424255f, - -0.499876320362091f, - 0.488496154546738f, -0.499867647886276f, 0.488112777471542f, - -0.499858677387238f, - 0.487729400396347f, -0.499849408864975f, 0.487346023321152f, - -0.499839842319489f, - 0.486962646245956f, -0.499830007553101f, 0.486579269170761f, - -0.499819844961166f, - 0.486195921897888f, -0.499809414148331f, 0.485812574625015f, - -0.499798685312271f, - 0.485429257154465f, -0.499787658452988f, 0.485045909881592f, - -0.499776333570480f, - 0.484662592411041f, -0.499764710664749f, 0.484279274940491f, - -0.499752789735794f, - 0.483895987272263f, -0.499740600585938f, 0.483512699604034f, - -0.499728083610535f, - 0.483129411935806f, -0.499715298414230f, 0.482746154069901f, - -0.499702215194702f, - 0.482362866401672f, -0.499688833951950f, 0.481979638338089f, - -0.499675154685974f, - 0.481596380472183f, -0.499661177396774f, 0.481213152408600f, - -0.499646931886673f, - 0.480829954147339f, -0.499632388353348f, 0.480446726083755f, - -0.499617516994476f, - 0.480063527822495f, -0.499602377414703f, 0.479680359363556f, - -0.499586939811707f, - 0.479297190904617f, -0.499571204185486f, 0.478914022445679f, - -0.499555170536041f, - 0.478530883789063f, -0.499538868665695f, 0.478147745132446f, - -0.499522238969803f, - 0.477764606475830f, -0.499505341053009f, 0.477381497621536f, - -0.499488145112991f, - 0.476998418569565f, -0.499470651149750f, 0.476615339517593f, - -0.499452859163284f, - 0.476232260465622f, -0.499434769153595f, 0.475849211215973f, - -0.499416410923004f, - 0.475466161966324f, -0.499397724866867f, 0.475083142518997f, - -0.499378770589828f, - 0.474700123071671f, -0.499359518289566f, 0.474317133426666f, - -0.499339967966080f, - 0.473934143781662f, -0.499320119619370f, 0.473551183938980f, - -0.499299973249435f, - 0.473168224096298f, -0.499279528856277f, 0.472785294055939f, - -0.499258816242218f, - 0.472402364015579f, -0.499237775802612f, 0.472019463777542f, - -0.499216467142105f, - 0.471636593341827f, -0.499194860458374f, 0.471253722906113f, - -0.499172955751419f, - 0.470870882272720f, -0.499150782823563f, 0.470488041639328f, - -0.499128282070160f, - 0.470105201005936f, -0.499105513095856f, 0.469722419977188f, - -0.499082416296005f, - 0.469339638948441f, -0.499059051275253f, 0.468956857919693f, - -0.499035388231277f, - 0.468574106693268f, -0.499011427164078f, 0.468191385269165f, - -0.498987197875977f, - 0.467808693647385f, -0.498962640762329f, 0.467426002025604f, - -0.498937815427780f, - 0.467043310403824f, -0.498912662267685f, 0.466660678386688f, - -0.498887240886688f, - 0.466278046369553f, -0.498861521482468f, 0.465895414352417f, - -0.498835533857346f, - 0.465512841939926f, -0.498809218406677f, 0.465130269527435f, - -0.498782604932785f, - 0.464747726917267f, -0.498755723237991f, 0.464365184307098f, - -0.498728543519974f, - 0.463982671499252f, -0.498701065778732f, 0.463600188493729f, - -0.498673290014267f, - 0.463217705488205f, -0.498645216226578f, 0.462835282087326f, - -0.498616874217987f, - 0.462452858686447f, -0.498588204383850f, 0.462070435285568f, - -0.498559266328812f, - 0.461688071489334f, -0.498530030250549f, 0.461305707693100f, - -0.498500496149063f, - 0.460923373699188f, -0.498470664024353f, 0.460541069507599f, - -0.498440563678741f, - 0.460158795118332f, -0.498410135507584f, 0.459776520729065f, - -0.498379439115524f, - 0.459394276142120f, -0.498348444700241f, 0.459012061357498f, - -0.498317152261734f, - 0.458629876375198f, -0.498285561800003f, 0.458247691392899f, - -0.498253703117371f, - 0.457865566015244f, -0.498221516609192f, 0.457483440637589f, - -0.498189061880112f, - 0.457101345062256f, -0.498156309127808f, 0.456719279289246f, - -0.498123258352280f, - 0.456337243318558f, -0.498089909553528f, 0.455955207347870f, - -0.498056292533875f, - 0.455573230981827f, -0.498022347688675f, 0.455191254615784f, - -0.497988134622574f, - 0.454809308052063f, -0.497953623533249f, 0.454427421092987f, - -0.497918814420700f, - 0.454045534133911f, -0.497883707284927f, 0.453663676977158f, - -0.497848302125931f, - 0.453281819820404f, -0.497812628746033f, 0.452900022268295f, - -0.497776657342911f, - 0.452518254518509f, -0.497740387916565f, 0.452136516571045f, - -0.497703820466995f, - 0.451754778623581f, -0.497666954994202f, 0.451373100280762f, - -0.497629791498184f, - 0.450991421937943f, -0.497592359781265f, 0.450609803199768f, - -0.497554630041122f, - 0.450228184461594f, -0.497516602277756f, 0.449846625328064f, - -0.497478276491165f, - 0.449465066194534f, -0.497439652681351f, 0.449083566665649f, - -0.497400760650635f, - 0.448702067136765f, -0.497361570596695f, 0.448320597410202f, - -0.497322082519531f, - 0.447939187288284f, -0.497282296419144f, 0.447557777166367f, - -0.497242212295532f, - 0.447176426649094f, -0.497201830148697f, 0.446795076131821f, - -0.497161179780960f, - 0.446413785219193f, -0.497120231389999f, 0.446032524108887f, - -0.497078984975815f, - 0.445651292800903f, -0.497037440538406f, 0.445270061492920f, - -0.496995598077774f, - 0.444888889789581f, -0.496953487396240f, 0.444507747888565f, - -0.496911078691483f, - 0.444126635789871f, -0.496868371963501f, 0.443745553493500f, - -0.496825367212296f, - 0.443364530801773f, -0.496782064437866f, 0.442983508110046f, - -0.496738493442535f, - 0.442602545022964f, -0.496694594621658f, 0.442221581935883f, - -0.496650427579880f, - 0.441840678453445f, -0.496605962514877f, 0.441459804773331f, - -0.496561229228973f, - 0.441078960895538f, -0.496516168117523f, 0.440698176622391f, - -0.496470838785172f, - 0.440317392349243f, -0.496425211429596f, 0.439936667680740f, - -0.496379286050797f, - 0.439555943012238f, -0.496333062648773f, 0.439175277948380f, - -0.496286571025848f, - 0.438794672489166f, -0.496239781379700f, 0.438414067029953f, - -0.496192663908005f, - 0.438033521175385f, -0.496145308017731f, 0.437653005123138f, - -0.496097624301910f, - 0.437272518873215f, -0.496049642562866f, 0.436892062425613f, - -0.496001392602921f, - 0.436511665582657f, -0.495952844619751f, 0.436131268739700f, - -0.495903998613358f, - 0.435750931501389f, -0.495854884386063f, 0.435370653867722f, - -0.495805442333221f, - 0.434990376234055f, -0.495755732059479f, 0.434610158205032f, - -0.495705723762512f, - 0.434229999780655f, -0.495655417442322f, 0.433849841356277f, - -0.495604842901230f, - 0.433469742536545f, -0.495553970336914f, 0.433089673519135f, - -0.495502769947052f, - 0.432709634304047f, -0.495451331138611f, 0.432329654693604f, - -0.495399564504623f, - 0.431949704885483f, -0.495347499847412f, 0.431569814682007f, - -0.495295166969299f, - 0.431189924478531f, -0.495242536067963f, 0.430810123682022f, - -0.495189607143402f, - 0.430430322885513f, -0.495136409997940f, 0.430050581693649f, - -0.495082914829254f, - 0.429670870304108f, -0.495029091835022f, 0.429291218519211f, - -0.494975030422211f, - 0.428911596536636f, -0.494920641183853f, 0.428532034158707f, - -0.494865983724594f, - 0.428152471780777f, -0.494810998439789f, 0.427772998809814f, - -0.494755744934082f, - 0.427393525838852f, -0.494700223207474f, 0.427014142274857f, - -0.494644373655319f, - 0.426634758710861f, -0.494588255882263f, 0.426255434751511f, - -0.494531840085983f, - 0.425876170396805f, -0.494475126266479f, 0.425496935844421f, - -0.494418144226074f, - 0.425117731094360f, -0.494360834360123f, 0.424738585948944f, - -0.494303256273270f, - 0.424359470605850f, -0.494245409965515f, 0.423980414867401f, - -0.494187235832214f, - 0.423601418733597f, -0.494128793478012f, 0.423222452402115f, - -0.494070053100586f, - 0.422843515872955f, -0.494011014699936f, 0.422464638948441f, - -0.493951678276062f, - 0.422085791826248f, -0.493892073631287f, 0.421707004308701f, - -0.493832170963287f, - 0.421328276395798f, -0.493771970272064f, 0.420949578285217f, - -0.493711471557617f, - 0.420570939779282f, -0.493650704622269f, 0.420192331075668f, - -0.493589639663696f, - 0.419813781976700f, -0.493528276681900f, 0.419435262680054f, - -0.493466645479202f, - 0.419056802988052f, -0.493404686450958f, 0.418678402900696f, - -0.493342459201813f, - 0.418300032615662f, -0.493279963731766f, 0.417921721935272f, - -0.493217140436172f, - 0.417543441057205f, -0.493154048919678f, 0.417165219783783f, - -0.493090659379959f, - 0.416787058115005f, -0.493026971817017f, 0.416408926248550f, - -0.492963016033173f, - 0.416030853986740f, -0.492898762226105f, 0.415652841329575f, - -0.492834210395813f, - 0.415274858474731f, -0.492769360542297f, 0.414896935224533f, - -0.492704242467880f, - 0.414519041776657f, -0.492638826370239f, 0.414141237735748f, - -0.492573112249374f, - 0.413763463497162f, -0.492507129907608f, 0.413385748863220f, - -0.492440819740295f, - 0.413008064031601f, -0.492374241352081f, 0.412630438804626f, - -0.492307394742966f, - 0.412252873182297f, -0.492240220308304f, 0.411875367164612f, - -0.492172777652740f, - 0.411497890949249f, -0.492105036973953f, 0.411120474338531f, - -0.492037028074265f, - 0.410743117332459f, -0.491968721151352f, 0.410365819931030f, - -0.491900116205215f, - 0.409988552331924f, -0.491831213235855f, 0.409611344337463f, - -0.491762012243271f, - 0.409234195947647f, -0.491692543029785f, 0.408857107162476f, - -0.491622805595398f, - 0.408480048179626f, -0.491552740335464f, 0.408103078603745f, - -0.491482406854630f, - 0.407726138830185f, -0.491411775350571f, 0.407349258661270f, - -0.491340845823288f, - 0.406972438097000f, -0.491269648075104f, 0.406595647335052f, - -0.491198152303696f, - 0.406218945980072f, -0.491126358509064f, 0.405842274427414f, - -0.491054296493530f, - 0.405465662479401f, -0.490981936454773f, 0.405089110136032f, - -0.490909278392792f, - 0.404712617397308f, -0.490836352109909f, 0.404336184263229f, - -0.490763127803802f, - 0.403959810733795f, -0.490689605474472f, 0.403583467006683f, - -0.490615785121918f, - 0.403207212686539f, -0.490541696548462f, 0.402830988168716f, - -0.490467309951782f, - 0.402454853057861f, -0.490392625331879f, 0.402078747749329f, - -0.490317672491074f, - 0.401702702045441f, -0.490242421627045f, 0.401326715946198f, - -0.490166902542114f, - 0.400950789451599f, -0.490091055631638f, 0.400574922561646f, - -0.490014940500259f, - 0.400199115276337f, -0.489938557147980f, 0.399823367595673f, - -0.489861875772476f, - 0.399447679519653f, -0.489784896373749f, 0.399072051048279f, - -0.489707618951797f, - 0.398696482181549f, -0.489630073308945f, 0.398320972919464f, - -0.489552229642868f, - 0.397945523262024f, -0.489474087953568f, 0.397570133209229f, - -0.489395678043365f, - 0.397194802761078f, -0.489316970109940f, 0.396819531917572f, - -0.489237964153290f, - 0.396444320678711f, -0.489158689975739f, 0.396069169044495f, - -0.489079117774963f, - 0.395694077014923f, -0.488999247550964f, 0.395319044589996f, - -0.488919109106064f, - 0.394944071769714f, -0.488838672637939f, 0.394569188356400f, - -0.488757967948914f, - 0.394194334745407f, -0.488676935434341f, 0.393819570541382f, - -0.488595664501190f, - 0.393444836139679f, -0.488514065742493f, 0.393070191144943f, - -0.488432198762894f, - 0.392695605754852f, -0.488350033760071f, 0.392321079969406f, - -0.488267600536346f, - 0.391946613788605f, -0.488184869289398f, 0.391572207212448f, - -0.488101840019226f, - 0.391197860240936f, -0.488018542528152f, 0.390823602676392f, - -0.487934947013855f, - 0.390449374914169f, -0.487851053476334f, 0.390075236558914f, - -0.487766891717911f, - 0.389701157808304f, -0.487682431936264f, 0.389327138662338f, - -0.487597703933716f, - 0.388953179121017f, -0.487512677907944f, 0.388579308986664f, - -0.487427353858948f, - 0.388205498456955f, -0.487341761589050f, 0.387831717729568f, - -0.487255871295929f, - 0.387458056211472f, -0.487169682979584f, 0.387084424495697f, - -0.487083226442337f, - 0.386710882186890f, -0.486996471881866f, 0.386337369680405f, - -0.486909449100494f, - 0.385963946580887f, -0.486822128295898f, 0.385590612888336f, - -0.486734509468079f, - 0.385217308998108f, -0.486646622419357f, 0.384844094514847f, - -0.486558437347412f, - 0.384470939636230f, -0.486469984054565f, 0.384097874164581f, - -0.486381232738495f, - 0.383724838495255f, -0.486292183399200f, 0.383351892232895f, - -0.486202865839005f, - 0.382979035377502f, -0.486113250255585f, 0.382606208324432f, - -0.486023366451263f, - 0.382233470678329f, -0.485933154821396f, 0.381860792636871f, - -0.485842704772949f, - 0.381488204002380f, -0.485751956701279f, 0.381115674972534f, - -0.485660910606384f, - 0.380743205547333f, -0.485569566488266f, 0.380370795726776f, - -0.485477954149246f, - 0.379998475313187f, -0.485386073589325f, 0.379626244306564f, - -0.485293895006180f, - 0.379254043102264f, -0.485201418399811f, 0.378881961107254f, - -0.485108673572540f, - 0.378509908914566f, -0.485015630722046f, 0.378137946128845f, - -0.484922289848328f, - 0.377766042947769f, -0.484828680753708f, 0.377394229173660f, - -0.484734803438187f, - 0.377022475004196f, -0.484640628099442f, 0.376650810241699f, - -0.484546154737473f, - 0.376279205083847f, -0.484451413154602f, 0.375907659530640f, - -0.484356373548508f, - 0.375536203384399f, -0.484261035919189f, 0.375164806842804f, - -0.484165430068970f, - 0.374793499708176f, -0.484069555997849f, 0.374422252178192f, - -0.483973383903503f, - 0.374051094055176f, -0.483876913785934f, 0.373679995536804f, - -0.483780175447464f, - 0.373308986425400f, -0.483683139085770f, 0.372938036918640f, - -0.483585834503174f, - 0.372567176818848f, -0.483488231897354f, 0.372196376323700f, - -0.483390361070633f, - 0.371825665235519f, -0.483292192220688f, 0.371455013751984f, - -0.483193725347519f, - 0.371084451675415f, -0.483094990253448f, 0.370713949203491f, - -0.482995986938477f, - 0.370343536138535f, -0.482896685600281f, 0.369973212480545f, - -0.482797086238861f, - 0.369602948427200f, -0.482697218656540f, 0.369232743978500f, - -0.482597053050995f, - 0.368862658739090f, -0.482496619224548f, 0.368492603302002f, - -0.482395917177200f, - 0.368122667074203f, -0.482294887304306f, 0.367752790451050f, - -0.482193619012833f, - 0.367382973432541f, -0.482092022895813f, 0.367013275623322f, - -0.481990188360214f, - 0.366643607616425f, -0.481888025999069f, 0.366274058818817f, - -0.481785595417023f, - 0.365904569625854f, -0.481682896614075f, 0.365535169839859f, - -0.481579899787903f, - 0.365165829658508f, -0.481476634740829f, 0.364796578884125f, - -0.481373071670532f, - 0.364427417516708f, -0.481269240379334f, 0.364058345556259f, - -0.481165111064911f, - 0.363689333200455f, -0.481060713529587f, 0.363320380449295f, - -0.480956017971039f, - 0.362951546907425f, -0.480851024389267f, 0.362582772970200f, - -0.480745792388916f, - 0.362214088439941f, -0.480640232563019f, 0.361845493316650f, - -0.480534434318542f, - 0.361476957798004f, -0.480428308248520f, 0.361108511686325f, - -0.480321943759918f, - 0.360740154981613f, -0.480215251445770f, 0.360371887683868f, - -0.480108320713043f, - 0.360003679990768f, -0.480001062154770f, 0.359635561704636f, - -0.479893565177917f, - 0.359267532825470f, -0.479785770177841f, 0.358899593353271f, - -0.479677677154541f, - 0.358531713485718f, -0.479569315910339f, 0.358163923025131f, - -0.479460656642914f, - 0.357796221971512f, -0.479351729154587f, 0.357428610324860f, - -0.479242533445358f, - 0.357061088085175f, -0.479133039712906f, 0.356693625450134f, - -0.479023247957230f, - 0.356326282024384f, -0.478913217782974f, 0.355958998203278f, - -0.478802859783173f, - 0.355591803789139f, -0.478692263364792f, 0.355224698781967f, - -0.478581339120865f, - 0.354857653379440f, -0.478470176458359f, 0.354490727186203f, - -0.478358715772629f, - 0.354123860597610f, -0.478246957063675f, 0.353757113218308f, - -0.478134930133820f, - 0.353390425443649f, -0.478022634983063f, 0.353023827075958f, - -0.477910041809082f, - 0.352657318115234f, -0.477797180414200f, 0.352290898561478f, - -0.477684020996094f, - 0.351924568414688f, -0.477570593357086f, 0.351558297872543f, - -0.477456867694855f, - 0.351192146539688f, -0.477342873811722f, 0.350826084613800f, - -0.477228611707687f, - 0.350460082292557f, -0.477114051580429f, 0.350094199180603f, - -0.476999223232269f, - 0.349728375673294f, -0.476884096860886f, 0.349362671375275f, - -0.476768702268600f, - 0.348997026681900f, -0.476653009653091f, 0.348631471395493f, - -0.476537048816681f, - 0.348266035318375f, -0.476420819759369f, 0.347900658845901f, - -0.476304292678833f, - 0.347535371780396f, -0.476187497377396f, 0.347170203924179f, - -0.476070433855057f, - 0.346805095672607f, -0.475953072309494f, 0.346440106630325f, - -0.475835442543030f, - 0.346075177192688f, -0.475717514753342f, 0.345710366964340f, - -0.475599318742752f, - 0.345345616340637f, -0.475480824708939f, 0.344980984926224f, - -0.475362062454224f, - 0.344616413116455f, -0.475243031978607f, 0.344251960515976f, - -0.475123733282089f, - 0.343887597322464f, -0.475004136562347f, 0.343523323535919f, - -0.474884241819382f, - 0.343159139156342f, -0.474764078855515f, 0.342795044183731f, - -0.474643647670746f, - 0.342431038618088f, -0.474522948265076f, 0.342067122459412f, - -0.474401950836182f, - 0.341703325510025f, -0.474280685186386f, 0.341339588165283f, - -0.474159121513367f, - 0.340975970029831f, -0.474037289619446f, 0.340612411499023f, - -0.473915189504623f, - 0.340248972177505f, -0.473792791366577f, 0.339885622262955f, - -0.473670125007629f, - 0.339522391557693f, -0.473547190427780f, 0.339159220457077f, - -0.473423957824707f, - 0.338796168565750f, -0.473300457000732f, 0.338433176279068f, - -0.473176687955856f, - 0.338070303201675f, -0.473052620887756f, 0.337707549333572f, - -0.472928285598755f, - 0.337344855070114f, -0.472803652286530f, 0.336982280015945f, - -0.472678780555725f, - 0.336619764566422f, -0.472553610801697f, 0.336257368326187f, - -0.472428143024445f, - 0.335895091295242f, -0.472302407026291f, 0.335532873868942f, - -0.472176402807236f, - 0.335170775651932f, -0.472050130367279f, 0.334808766841888f, - -0.471923559904099f, - 0.334446847438812f, -0.471796721220016f, 0.334085017442703f, - -0.471669614315033f, - 0.333723306655884f, -0.471542209386826f, 0.333361685276031f, - -0.471414536237717f, - 0.333000183105469f, -0.471286594867706f, 0.332638740539551f, - -0.471158385276794f, - 0.332277417182922f, -0.471029877662659f, 0.331916213035584f, - -0.470901101827621f, - 0.331555068492889f, -0.470772027969360f, 0.331194043159485f, - -0.470642685890198f, - 0.330833107233047f, -0.470513075590134f, 0.330472290515900f, - -0.470383197069168f, - 0.330111563205719f, -0.470253020524979f, 0.329750925302505f, - -0.470122605562210f, - 0.329390406608582f, -0.469991862773895f, 0.329029977321625f, - -0.469860881567001f, - 0.328669637441635f, -0.469729602336884f, 0.328309416770935f, - -0.469598054885864f, - 0.327949285507202f, -0.469466239213943f, 0.327589273452759f, - -0.469334155321121f, - 0.327229350805283f, -0.469201773405075f, 0.326869517564774f, - -0.469069123268127f, - 0.326509803533554f, -0.468936175107956f, 0.326150178909302f, - -0.468802988529205f, - 0.325790673494339f, -0.468669503927231f, 0.325431257486343f, - -0.468535751104355f, - 0.325071930885315f, -0.468401730060577f, 0.324712723493576f, - -0.468267410993576f, - 0.324353635311127f, -0.468132823705673f, 0.323994606733322f, - -0.467997968196869f, - 0.323635727167130f, -0.467862844467163f, 0.323276937007904f, - -0.467727422714233f, - 0.322918236255646f, -0.467591762542725f, 0.322559654712677f, - -0.467455804347992f, - 0.322201162576675f, -0.467319577932358f, 0.321842789649963f, - -0.467183053493500f, - 0.321484506130219f, -0.467046260833740f, 0.321126341819763f, - -0.466909229755402f, - 0.320768296718597f, -0.466771900653839f, 0.320410341024399f, - -0.466634273529053f, - 0.320052474737167f, -0.466496407985687f, 0.319694727659225f, - -0.466358244419098f, - 0.319337099790573f, -0.466219812631607f, 0.318979561328888f, - -0.466081112623215f, - 0.318622142076492f, -0.465942144393921f, 0.318264812231064f, - -0.465802878141403f, - 0.317907601594925f, -0.465663343667984f, 0.317550510168076f, - -0.465523540973663f, - 0.317193508148193f, -0.465383470058441f, 0.316836595535278f, - -0.465243130922318f, - 0.316479831933975f, -0.465102523565292f, 0.316123157739639f, - -0.464961618185043f, - 0.315766572952271f, -0.464820444583893f, 0.315410137176514f, - -0.464679002761841f, - 0.315053790807724f, -0.464537292718887f, 0.314697533845901f, - -0.464395314455032f, - 0.314341396093369f, -0.464253038167953f, 0.313985377550125f, - -0.464110493659973f, - 0.313629478216171f, -0.463967710733414f, 0.313273668289185f, - -0.463824629783630f, - 0.312917977571487f, -0.463681250810623f, 0.312562376260757f, - -0.463537633419037f, - 0.312206923961639f, -0.463393747806549f, 0.311851561069489f, - -0.463249564170837f, - 0.311496287584305f, -0.463105112314224f, 0.311141163110733f, - -0.462960392236710f, - 0.310786128044128f, -0.462815403938293f, 0.310431212186813f, - -0.462670147418976f, - 0.310076385736465f, -0.462524622678757f, 0.309721708297729f, - -0.462378799915314f, - 0.309367120265961f, -0.462232738733292f, 0.309012651443481f, - -0.462086379528046f, - 0.308658272027969f, -0.461939752101898f, 0.308304041624069f, - -0.461792886257172f, - 0.307949900627136f, -0.461645722389221f, 0.307595878839493f, - -0.461498260498047f, - 0.307241976261139f, -0.461350560188293f, 0.306888192892075f, - -0.461202591657639f, - 0.306534498929977f, -0.461054325103760f, 0.306180924177170f, - -0.460905820131302f, - 0.305827468633652f, -0.460757017135620f, 0.305474132299423f, - -0.460607945919037f, - 0.305120915174484f, -0.460458606481552f, 0.304767817258835f, - -0.460309028625488f, - 0.304414808750153f, -0.460159152746201f, 0.304061919450760f, - -0.460008978843689f, - 0.303709149360657f, -0.459858566522598f, 0.303356528282166f, - -0.459707885980606f, - 0.303003966808319f, -0.459556937217712f, 0.302651554346085f, - -0.459405690431595f, - 0.302299261093140f, -0.459254205226898f, 0.301947087049484f, - -0.459102421998978f, - 0.301595002412796f, -0.458950400352478f, 0.301243066787720f, - -0.458798080682755f, - 0.300891220569611f, -0.458645492792130f, 0.300539493560791f, - -0.458492636680603f, - 0.300187885761261f, -0.458339542150497f, 0.299836426973343f, - -0.458186149597168f, - 0.299485057592392f, -0.458032488822937f, 0.299133807420731f, - -0.457878559827805f, - 0.298782676458359f, -0.457724362611771f, 0.298431664705276f, - -0.457569897174835f, - 0.298080772161484f, -0.457415163516998f, 0.297729998826981f, - -0.457260161638260f, - 0.297379344701767f, -0.457104891538620f, 0.297028809785843f, - -0.456949323415756f, - 0.296678394079208f, -0.456793516874313f, 0.296328097581863f, - -0.456637442111969f, - 0.295977920293808f, -0.456481099128723f, 0.295627862215042f, - -0.456324487924576f, - 0.295277923345566f, -0.456167578697205f, 0.294928103685379f, - -0.456010431051254f, - 0.294578403234482f, -0.455853015184402f, 0.294228851795197f, - -0.455695331096649f, - 0.293879389762878f, -0.455537378787994f, 0.293530046939850f, - -0.455379128456116f, - 0.293180853128433f, -0.455220639705658f, 0.292831748723984f, - -0.455061882734299f, - 0.292482793331146f, -0.454902857542038f, 0.292133957147598f, - -0.454743564128876f, - 0.291785210371017f, -0.454584002494812f, 0.291436612606049f, - -0.454424172639847f, - 0.291088134050369f, -0.454264044761658f, 0.290739774703979f, - -0.454103678464890f, - 0.290391564369202f, -0.453943043947220f, 0.290043443441391f, - -0.453782171010971f, - 0.289695471525192f, -0.453621000051498f, 0.289347589015961f, - -0.453459560871124f, - 0.288999855518341f, -0.453297853469849f, 0.288652241230011f, - -0.453135877847672f, - 0.288304775953293f, -0.452973634004593f, 0.287957400083542f, - -0.452811151742935f, - 0.287610173225403f, -0.452648371458054f, 0.287263035774231f, - -0.452485352754593f, - 0.286916047334671f, -0.452322036027908f, 0.286569178104401f, - -0.452158480882645f, - 0.286222457885742f, -0.451994657516479f, 0.285875827074051f, - -0.451830536127090f, - 0.285529345273972f, -0.451666176319122f, 0.285182982683182f, - -0.451501548290253f, - 0.284836769104004f, -0.451336652040482f, 0.284490644931793f, - -0.451171487569809f, - 0.284144669771194f, -0.451006084680557f, 0.283798813819885f, - -0.450840383768082f, - 0.283453077077866f, -0.450674414634705f, 0.283107489347458f, - -0.450508207082748f, - 0.282762020826340f, -0.450341701507568f, 0.282416671514511f, - -0.450174957513809f, - 0.282071471214294f, -0.450007945299149f, 0.281726360321045f, - -0.449840664863586f, - 0.281381398439407f, -0.449673116207123f, 0.281036585569382f, - -0.449505299329758f, - 0.280691891908646f, -0.449337244033813f, 0.280347317457199f, - -0.449168890714645f, - 0.280002862215042f, -0.449000298976898f, 0.279658555984497f, - -0.448831409215927f, - 0.279314368963242f, -0.448662281036377f, 0.278970301151276f, - -0.448492884635925f, - 0.278626382350922f, -0.448323249816895f, 0.278282582759857f, - -0.448153316974640f, - 0.277938932180405f, -0.447983115911484f, 0.277595400810242f, - -0.447812676429749f, - 0.277251988649368f, -0.447641968727112f, 0.276908725500107f, - -0.447470992803574f, - 0.276565581560135f, -0.447299748659134f, 0.276222556829453f, - -0.447128236293793f, - 0.275879681110382f, -0.446956485509872f, 0.275536954402924f, - -0.446784436702728f, - 0.275194346904755f, -0.446612149477005f, 0.274851858615875f, - -0.446439594030380f, - 0.274509519338608f, -0.446266770362854f, 0.274167299270630f, - -0.446093708276749f, - 0.273825198411942f, -0.445920348167419f, 0.273483246564865f, - -0.445746749639511f, - 0.273141443729401f, -0.445572882890701f, 0.272799760103226f, - -0.445398747920990f, - 0.272458195686340f, -0.445224374532700f, 0.272116780281067f, - -0.445049703121185f, - 0.271775513887405f, -0.444874793291092f, 0.271434366703033f, - -0.444699615240097f, - 0.271093338727951f, -0.444524168968201f, 0.270752459764481f, - -0.444348484277725f, - 0.270411729812622f, -0.444172531366348f, 0.270071119070053f, - -0.443996280431747f, - 0.269730657339096f, -0.443819820880890f, 0.269390314817429f, - -0.443643063306808f, - 0.269050091505051f, -0.443466067314148f, 0.268710047006607f, - -0.443288803100586f, - 0.268370121717453f, -0.443111270666122f, 0.268030315637589f, - -0.442933470010757f, - 0.267690658569336f, -0.442755430936813f, 0.267351150512695f, - -0.442577123641968f, - 0.267011761665344f, -0.442398548126221f, 0.266672492027283f, - -0.442219734191895f, - 0.266333401203156f, -0.442040622234344f, 0.265994429588318f, - -0.441861271858215f, - 0.265655577182770f, -0.441681683063507f, 0.265316903591156f, - -0.441501796245575f, - 0.264978319406509f, -0.441321671009064f, 0.264639914035797f, - -0.441141277551651f, - 0.264301627874374f, -0.440960645675659f, 0.263963490724564f, - -0.440779715776443f, - 0.263625472784042f, -0.440598547458649f, 0.263287603855133f, - -0.440417140722275f, - 0.262949883937836f, -0.440235435962677f, 0.262612313032150f, - -0.440053492784500f, - 0.262274861335754f, -0.439871311187744f, 0.261937558650970f, - -0.439688831567764f, - 0.261600375175476f, -0.439506113529205f, 0.261263370513916f, - -0.439323127269745f, - 0.260926485061646f, -0.439139902591705f, 0.260589718818665f, - -0.438956409692764f, - 0.260253131389618f, -0.438772648572922f, 0.259916663169861f, - -0.438588619232178f, - 0.259580343961716f, -0.438404351472855f, 0.259244143962860f, - -0.438219845294952f, - 0.258908122777939f, -0.438035041093826f, 0.258572220802307f, - -0.437849998474121f, - 0.258236467838287f, -0.437664687633514f, 0.257900834083557f, - -0.437479138374329f, - 0.257565379142761f, -0.437293320894241f, 0.257230043411255f, - -0.437107264995575f, - 0.256894856691360f, -0.436920911073685f, 0.256559818983078f, - -0.436734348535538f, - 0.256224930286407f, -0.436547487974167f, 0.255890160799026f, - -0.436360388994217f, - 0.255555540323257f, -0.436173021793365f, 0.255221068859100f, - -0.435985416173935f, - 0.254886746406555f, -0.435797542333603f, 0.254552572965622f, - -0.435609430074692f, - 0.254218548536301f, -0.435421019792557f, 0.253884643316269f, - -0.435232400894165f, - 0.253550916910172f, -0.435043483972549f, 0.253217309713364f, - -0.434854328632355f, - 0.252883851528168f, -0.434664934873581f, 0.252550542354584f, - -0.434475272893906f, - 0.252217382192612f, -0.434285342693329f, 0.251884341239929f, - -0.434095174074173f, - 0.251551479101181f, -0.433904737234116f, 0.251218736171722f, - -0.433714061975479f, - 0.250886172056198f, -0.433523118495941f, 0.250553727149963f, - -0.433331936597824f, - 0.250221431255341f, -0.433140486478806f, 0.249889299273491f, - -0.432948768138886f, - 0.249557301402092f, -0.432756811380386f, 0.249225467443466f, - -0.432564586400986f, - 0.248893767595291f, -0.432372123003006f, 0.248562216758728f, - -0.432179391384125f, - 0.248230814933777f, -0.431986421346664f, 0.247899547219276f, - -0.431793183088303f, - 0.247568443417549f, -0.431599706411362f, 0.247237488627434f, - -0.431405961513519f, - 0.246906682848930f, -0.431211978197098f, 0.246576011180878f, - -0.431017726659775f, - 0.246245503425598f, -0.430823236703873f, 0.245915144681931f, - -0.430628478527069f, - 0.245584934949875f, -0.430433481931686f, 0.245254859328270f, - -0.430238217115402f, - 0.244924947619438f, -0.430042684078217f, 0.244595184922218f, - -0.429846942424774f, - 0.244265571236610f, -0.429650902748108f, 0.243936106562614f, - -0.429454624652863f, - 0.243606805801392f, -0.429258108139038f, 0.243277639150620f, - -0.429061323404312f, - 0.242948621511459f, -0.428864300251007f, 0.242619767785072f, - -0.428667008876801f, - 0.242291063070297f, -0.428469479084015f, 0.241962507367134f, - -0.428271710872650f, - 0.241634100675583f, -0.428073674440384f, 0.241305842995644f, - -0.427875369787216f, - 0.240977749228477f, -0.427676826715469f, 0.240649804472923f, - -0.427478045225143f, - 0.240322008728981f, -0.427278995513916f, 0.239994361996651f, - -0.427079707384110f, - 0.239666879177094f, -0.426880151033401f, 0.239339530467987f, - -0.426680356264114f, - 0.239012360572815f, -0.426480293273926f, 0.238685324788094f, - -0.426279991865158f, - 0.238358452916145f, -0.426079452037811f, 0.238031730055809f, - -0.425878643989563f, - 0.237705156207085f, -0.425677597522736f, 0.237378746271133f, - -0.425476282835007f, - 0.237052485346794f, -0.425274729728699f, 0.236726388335228f, - -0.425072938203812f, - 0.236400425434113f, -0.424870878458023f, 0.236074641346931f, - -0.424668580293655f, - 0.235749006271362f, -0.424466013908386f, 0.235423520207405f, - -0.424263238906860f, - 0.235098183155060f, -0.424060165882111f, 0.234773010015488f, - -0.423856884241104f, - 0.234448000788689f, -0.423653304576874f, 0.234123140573502f, - -0.423449516296387f, - 0.233798429369926f, -0.423245459794998f, 0.233473882079124f, - -0.423041164875031f, - 0.233149498701096f, -0.422836631536484f, 0.232825264334679f, - -0.422631829977036f, - 0.232501193881035f, -0.422426789999008f, 0.232177272439003f, - -0.422221481800079f, - 0.231853514909744f, -0.422015935182571f, 0.231529906392097f, - -0.421810150146484f, - 0.231206461787224f, -0.421604126691818f, 0.230883181095123f, - -0.421397835016251f, - 0.230560049414635f, -0.421191304922104f, 0.230237081646919f, - -0.420984506607056f, - 0.229914262890816f, -0.420777499675751f, 0.229591608047485f, - -0.420570224523544f, - 0.229269117116928f, -0.420362681150436f, 0.228946775197983f, - -0.420154929161072f, - 0.228624612092972f, -0.419946908950806f, 0.228302597999573f, - -0.419738620519638f, - 0.227980732917786f, -0.419530123472214f, 0.227659046649933f, - -0.419321358203888f, - 0.227337509393692f, -0.419112354516983f, 0.227016136050224f, - -0.418903112411499f, - 0.226694911718369f, -0.418693602085114f, 0.226373866200447f, - -0.418483853340149f, - 0.226052969694138f, -0.418273866176605f, 0.225732237100601f, - -0.418063640594482f, - 0.225411668419838f, -0.417853146791458f, 0.225091263651848f, - -0.417642414569855f, - 0.224771007895470f, -0.417431443929672f, 0.224450930953026f, - -0.417220205068588f, - 0.224131003022194f, -0.417008757591248f, 0.223811239004135f, - -0.416797041893005f, - 0.223491653800011f, -0.416585087776184f, 0.223172217607498f, - -0.416372895240784f, - 0.222852945327759f, -0.416160434484482f, 0.222533836960793f, - -0.415947735309601f, - 0.222214877605438f, -0.415734797716141f, 0.221896097064018f, - -0.415521621704102f, - 0.221577480435371f, -0.415308207273483f, 0.221259027719498f, - -0.415094524621964f, - 0.220940738916397f, -0.414880603551865f, 0.220622614026070f, - -0.414666473865509f, - 0.220304638147354f, -0.414452046155930f, 0.219986841082573f, - -0.414237409830093f, - 0.219669207930565f, -0.414022535085678f, 0.219351738691330f, - -0.413807392120361f, - 0.219034433364868f, -0.413592010736465f, 0.218717306852341f, - -0.413376390933990f, - 0.218400329351425f, -0.413160532712936f, 0.218083515763283f, - -0.412944436073303f, - 0.217766880989075f, -0.412728071212769f, 0.217450410127640f, - -0.412511497735977f, - 0.217134088277817f, -0.412294656038284f, 0.216817945241928f, - -0.412077575922012f, - 0.216501981019974f, -0.411860257387161f, 0.216186165809631f, - -0.411642700433731f, - 0.215870529413223f, -0.411424905061722f, 0.215555042028427f, - -0.411206841468811f, - 0.215239733457565f, -0.410988569259644f, 0.214924603700638f, - -0.410770028829575f, - 0.214609622955322f, -0.410551249980927f, 0.214294821023941f, - -0.410332232713699f, - 0.213980183005333f, -0.410112977027893f, 0.213665723800659f, - -0.409893482923508f, - 0.213351413607597f, -0.409673750400543f, 0.213037282228470f, - -0.409453779459000f, - 0.212723329663277f, -0.409233570098877f, 0.212409526109695f, - -0.409013092517853f, - 0.212095901370049f, -0.408792406320572f, 0.211782455444336f, - -0.408571451902390f, - 0.211469158530235f, -0.408350288867950f, 0.211156040430069f, - -0.408128857612610f, - 0.210843101143837f, -0.407907217741013f, 0.210530325770378f, - -0.407685309648514f, - 0.210217714309692f, -0.407463163137436f, 0.209905281662941f, - -0.407240778207779f, - 0.209593027830124f, -0.407018154859543f, 0.209280923008919f, - -0.406795293092728f, - 0.208969011902809f, -0.406572192907333f, 0.208657249808311f, - -0.406348884105682f, - 0.208345666527748f, -0.406125307083130f, 0.208034262061119f, - -0.405901491641998f, - 0.207723021507263f, -0.405677437782288f, 0.207411959767342f, - -0.405453115701675f, - 0.207101076841354f, -0.405228585004807f, 0.206790357828140f, - -0.405003815889359f, - 0.206479802727699f, -0.404778808355331f, 0.206169426441193f, - -0.404553562402725f, - 0.205859228968620f, -0.404328078031540f, 0.205549195408821f, - -0.404102355241776f, - 0.205239340662956f, -0.403876423835754f, 0.204929664731026f, - -0.403650224208832f, - 0.204620152711868f, -0.403423786163330f, 0.204310819506645f, - -0.403197109699249f, - 0.204001650214195f, -0.402970194816589f, 0.203692659735680f, - -0.402743041515350f, - 0.203383848071098f, -0.402515679597855f, 0.203075215220451f, - -0.402288049459457f, - 0.202766746282578f, -0.402060180902481f, 0.202458456158638f, - -0.401832103729248f, - 0.202150344848633f, -0.401603758335114f, 0.201842412352562f, - -0.401375204324722f, - 0.201534643769264f, -0.401146411895752f, 0.201227053999901f, - -0.400917351245880f, - 0.200919643044472f, -0.400688081979752f, 0.200612410902977f, - -0.400458574295044f, - 0.200305357575417f, -0.400228828191757f, 0.199998468160629f, - -0.399998843669891f, - 0.199691757559776f, -0.399768620729446f, 0.199385225772858f, - -0.399538189172745f, - 0.199078872799873f, -0.399307489395142f, 0.198772698640823f, - -0.399076581001282f, - 0.198466703295708f, -0.398845434188843f, 0.198160871863365f, - -0.398614019155502f, - 0.197855234146118f, -0.398382395505905f, 0.197549775242805f, - -0.398150533437729f, - 0.197244480252266f, -0.397918462753296f, 0.196939364075661f, - -0.397686123847961f, - 0.196634441614151f, -0.397453576326370f, 0.196329683065414f, - -0.397220760583878f, - 0.196025103330612f, -0.396987736225128f, 0.195720717310905f, - -0.396754473447800f, - 0.195416495203972f, -0.396520972251892f, 0.195112451910973f, - -0.396287262439728f, - 0.194808602333069f, -0.396053284406662f, 0.194504916667938f, - -0.395819097757339f, - 0.194201424717903f, -0.395584672689438f, 0.193898096680641f, - -0.395350009202957f, - 0.193594962358475f, -0.395115107297897f, 0.193292006850243f, - -0.394879996776581f, - 0.192989215254784f, -0.394644618034363f, 0.192686617374420f, - -0.394409030675888f, - 0.192384198307991f, -0.394173204898834f, 0.192081972956657f, - -0.393937170505524f, - 0.191779911518097f, -0.393700867891312f, 0.191478043794632f, - -0.393464356660843f, - 0.191176339983940f, -0.393227607011795f, 0.190874829888344f, - -0.392990618944168f, - 0.190573498606682f, -0.392753422260284f, 0.190272361040115f, - -0.392515957355499f, - 0.189971387386322f, -0.392278283834457f, 0.189670607447624f, - -0.392040401697159f, - 0.189370006322861f, -0.391802251338959f, 0.189069598913193f, - -0.391563892364502f, - 0.188769355416298f, -0.391325294971466f, 0.188469305634499f, - -0.391086459159851f, - 0.188169434666634f, -0.390847414731979f, 0.187869757413864f, - -0.390608131885529f, - 0.187570258975029f, -0.390368610620499f, 0.187270939350128f, - -0.390128880739212f, - 0.186971798539162f, -0.389888882637024f, 0.186672851443291f, - -0.389648675918579f, - 0.186374098062515f, -0.389408260583878f, 0.186075508594513f, - -0.389167606830597f, - 0.185777112841606f, -0.388926714658737f, 0.185478910803795f, - -0.388685584068298f, - 0.185180887579918f, -0.388444244861603f, 0.184883043169975f, - -0.388202667236328f, - 0.184585392475128f, -0.387960851192474f, 0.184287920594215f, - -0.387718826532364f, - 0.183990627527237f, -0.387476563453674f, 0.183693528175354f, - -0.387234061956406f, - 0.183396622538567f, -0.386991351842880f, 0.183099895715714f, - -0.386748403310776f, - 0.182803362607956f, -0.386505216360092f, 0.182507008314133f, - -0.386261820793152f, - 0.182210832834244f, -0.386018186807632f, 0.181914865970612f, - -0.385774344205856f, - 0.181619063019753f, -0.385530263185501f, 0.181323468685150f, - -0.385285943746567f, - 0.181028053164482f, -0.385041415691376f, 0.180732816457748f, - -0.384796649217606f, - 0.180437773466110f, -0.384551674127579f, 0.180142924189568f, - -0.384306460618973f, - 0.179848253726959f, -0.384061008691788f, 0.179553776979446f, - -0.383815348148346f, - 0.179259493947029f, -0.383569449186325f, 0.178965389728546f, - -0.383323341608047f, - 0.178671479225159f, -0.383076995611191f, 0.178377762436867f, - -0.382830440998077f, - 0.178084224462509f, -0.382583618164063f, 0.177790880203247f, - -0.382336616516113f, - 0.177497729659081f, -0.382089376449585f, 0.177204772830009f, - -0.381841897964478f, - 0.176911994814873f, -0.381594210863113f, 0.176619410514832f, - -0.381346285343170f, - 0.176327019929886f, -0.381098151206970f, 0.176034808158875f, - -0.380849778652191f, - 0.175742805004120f, -0.380601197481155f, 0.175450980663300f, - -0.380352377891541f, - 0.175159350037575f, -0.380103349685669f, 0.174867913126946f, - -0.379854083061218f, - 0.174576655030251f, -0.379604607820511f, 0.174285605549812f, - -0.379354894161224f, - 0.173994734883308f, -0.379104942083359f, 0.173704057931900f, - -0.378854811191559f, - 0.173413574695587f, -0.378604412078857f, 0.173123285174370f, - -0.378353834152222f, - 0.172833189368248f, -0.378102988004684f, 0.172543287277222f, - -0.377851963043213f, - 0.172253578901291f, -0.377600699663162f, 0.171964049339294f, - -0.377349197864532f, - 0.171674728393555f, -0.377097487449646f, 0.171385586261749f, - -0.376845568418503f, - 0.171096652746201f, -0.376593410968781f, 0.170807912945747f, - -0.376341015100479f, - 0.170519351959229f, -0.376088410615921f, 0.170230999588966f, - -0.375835597515106f, - 0.169942826032639f, -0.375582575798035f, 0.169654861092567f, - -0.375329315662384f, - 0.169367074966431f, -0.375075817108154f, 0.169079497456551f, - -0.374822109937668f, - 0.168792113661766f, -0.374568194150925f, 0.168504923582077f, - -0.374314039945602f, - 0.168217927217484f, -0.374059677124023f, 0.167931124567986f, - -0.373805105686188f, - 0.167644515633583f, -0.373550295829773f, 0.167358100414276f, - -0.373295277357101f, - 0.167071878910065f, -0.373040050268173f, 0.166785866022110f, - -0.372784584760666f, - 0.166500031948090f, -0.372528880834579f, 0.166214406490326f, - -0.372272998094559f, - 0.165928974747658f, -0.372016876935959f, 0.165643751621246f, - -0.371760547161102f, - 0.165358707308769f, -0.371503978967667f, 0.165073871612549f, - -0.371247202157974f, - 0.164789214730263f, -0.370990216732025f, 0.164504766464233f, - -0.370732992887497f, - 0.164220526814461f, -0.370475560426712f, 0.163936465978622f, - -0.370217919349670f, - 0.163652613759041f, -0.369960039854050f, 0.163368955254555f, - -0.369701951742172f, - 0.163085505366325f, -0.369443655014038f, 0.162802234292030f, - -0.369185149669647f, - 0.162519171833992f, -0.368926405906677f, 0.162236317992210f, - -0.368667453527451f, - 0.161953642964363f, -0.368408292531967f, 0.161671176552773f, - -0.368148893117905f, - 0.161388918757439f, -0.367889285087585f, 0.161106839776039f, - -0.367629468441010f, - 0.160824984312058f, -0.367369443178177f, 0.160543307662010f, - -0.367109179496765f, - 0.160261839628220f, -0.366848707199097f, 0.159980565309525f, - -0.366588026285172f, - 0.159699499607086f, -0.366327136754990f, 0.159418627619743f, - -0.366066008806229f, - 0.159137964248657f, -0.365804702043533f, 0.158857494592667f, - -0.365543156862259f, - 0.158577233552933f, -0.365281373262405f, 0.158297166228294f, - -0.365019410848618f, - 0.158017292618752f, -0.364757210016251f, 0.157737627625465f, - -0.364494800567627f, - 0.157458171248436f, -0.364232182502747f, 0.157178908586502f, - -0.363969355821610f, - 0.156899839639664f, -0.363706320524216f, 0.156620979309082f, - -0.363443046808243f, - 0.156342327594757f, -0.363179564476013f, 0.156063869595528f, - -0.362915903329849f, - 0.155785620212555f, -0.362651973962784f, 0.155507579445839f, - -0.362387865781784f, - 0.155229732394218f, -0.362123548984528f, 0.154952079057693f, - -0.361858993768692f, - 0.154674649238586f, -0.361594229936600f, 0.154397398233414f, - -0.361329287290573f, - 0.154120370745659f, -0.361064106225967f, 0.153843536973000f, - -0.360798716545105f, - 0.153566911816597f, -0.360533088445663f, 0.153290495276451f, - -0.360267281532288f, - 0.153014272451401f, -0.360001266002655f, 0.152738258242607f, - -0.359735012054443f, - 0.152462437748909f, -0.359468549489975f, 0.152186840772629f, - -0.359201908111572f, - 0.151911437511444f, -0.358935028314590f, 0.151636242866516f, - -0.358667939901352f, - 0.151361241936684f, -0.358400642871857f, 0.151086464524269f, - -0.358133137226105f, - 0.150811880826950f, -0.357865422964096f, 0.150537505745888f, - -0.357597470283508f, - 0.150263324379921f, -0.357329338788986f, 0.149989366531372f, - -0.357060998678207f, - 0.149715602397919f, -0.356792420148849f, 0.149442046880722f, - -0.356523662805557f, - 0.149168699979782f, -0.356254696846008f, 0.148895561695099f, - -0.355985492467880f, - 0.148622632026672f, -0.355716109275818f, 0.148349896073341f, - -0.355446487665176f, - 0.148077383637428f, -0.355176687240601f, 0.147805064916611f, - -0.354906648397446f, - 0.147532954812050f, -0.354636400938034f, 0.147261068224907f, - -0.354365974664688f, - 0.146989375352860f, -0.354095309972763f, 0.146717891097069f, - -0.353824466466904f, - 0.146446615457535f, -0.353553384542465f, 0.146175548434258f, - -0.353282123804092f, - 0.145904675126076f, -0.353010624647141f, 0.145634025335312f, - -0.352738946676254f, - 0.145363584160805f, -0.352467030286789f, 0.145093351602554f, - -0.352194935083389f, - 0.144823327660561f, -0.351922631263733f, 0.144553512334824f, - -0.351650089025497f, - 0.144283905625343f, -0.351377367973328f, 0.144014507532120f, - -0.351104438304901f, - 0.143745318055153f, -0.350831300020218f, 0.143476337194443f, - -0.350557953119278f, - 0.143207564949989f, -0.350284397602081f, 0.142939001321793f, - -0.350010633468628f, - 0.142670661211014f, -0.349736660718918f, 0.142402514815331f, - -0.349462509155273f, - 0.142134591937065f, -0.349188119173050f, 0.141866862773895f, - -0.348913550376892f, - 0.141599357128143f, -0.348638743162155f, 0.141332060098648f, - -0.348363757133484f, - 0.141064971685410f, -0.348088562488556f, 0.140798106789589f, - -0.347813159227371f, - 0.140531435608864f, -0.347537547349930f, 0.140264987945557f, - -0.347261756658554f, - 0.139998748898506f, -0.346985727548599f, 0.139732718467712f, - -0.346709519624710f, - 0.139466896653175f, -0.346433073282242f, 0.139201298356056f, - -0.346156448125839f, - 0.138935908675194f, -0.345879614353180f, 0.138670727610588f, - -0.345602601766586f, - 0.138405755162239f, -0.345325350761414f, 0.138141006231308f, - -0.345047920942307f, - 0.137876465916634f, -0.344770282506943f, 0.137612134218216f, - -0.344492435455322f, - 0.137348011136055f, -0.344214379787445f, 0.137084111571312f, - -0.343936115503311f, - 0.136820420622826f, -0.343657672405243f, 0.136556953191757f, - -0.343379020690918f, - 0.136293679475784f, -0.343100160360336f, 0.136030644178391f, - -0.342821091413498f, - 0.135767802596092f, -0.342541843652725f, 0.135505184531212f, - -0.342262357473373f, - 0.135242775082588f, -0.341982692480087f, 0.134980589151382f, - -0.341702848672867f, - 0.134718611836433f, -0.341422766447067f, 0.134456858038902f, - -0.341142505407333f, - 0.134195312857628f, -0.340862035751343f, 0.133933976292610f, - -0.340581357479095f, - 0.133672863245010f, -0.340300500392914f, 0.133411958813667f, - -0.340019434690475f, - 0.133151277899742f, -0.339738160371780f, 0.132890805602074f, - -0.339456677436829f, - 0.132630556821823f, -0.339175015687943f, 0.132370531558990f, - -0.338893145322800f, - 0.132110700011253f, -0.338611096143723f, 0.131851106882095f, - -0.338328808546066f, - 0.131591722369194f, -0.338046342134476f, 0.131332546472549f, - -0.337763696908951f, - 0.131073594093323f, -0.337480813264847f, 0.130814850330353f, - -0.337197750806808f, - 0.130556344985962f, -0.336914509534836f, 0.130298033356667f, - -0.336631029844284f, - 0.130039945244789f, -0.336347371339798f, 0.129782080650330f, - -0.336063534021378f, - 0.129524439573288f, -0.335779488086700f, 0.129267007112503f, - -0.335495233535767f, - 0.129009798169136f, -0.335210770368576f, 0.128752797842026f, - -0.334926128387451f, - 0.128496021032333f, -0.334641307592392f, 0.128239467740059f, - -0.334356248378754f, - 0.127983123064041f, -0.334071010351181f, 0.127727001905441f, - -0.333785593509674f, - 0.127471104264259f, -0.333499968051910f, 0.127215430140495f, - -0.333214133977890f, - 0.126959964632988f, -0.332928121089935f, 0.126704722642899f, - -0.332641899585724f, - 0.126449704170227f, -0.332355499267578f, 0.126194894313812f, - -0.332068890333176f, - 0.125940307974815f, -0.331782072782516f, 0.125685945153236f, - -0.331495076417923f, - 0.125431805849075f, -0.331207901239395f, 0.125177875161171f, - -0.330920487642288f, - 0.124924175441265f, -0.330632925033569f, 0.124670691788197f, - -0.330345153808594f, - 0.124417431652546f, -0.330057173967361f, 0.124164395034313f, - -0.329769015312195f, - 0.123911574482918f, -0.329480648040771f, 0.123658977448940f, - -0.329192101955414f, - 0.123406603932381f, -0.328903347253799f, 0.123154446482658f, - -0.328614413738251f, - 0.122902512550354f, -0.328325271606445f, 0.122650802135468f, - -0.328035950660706f, - 0.122399315237999f, -0.327746421098709f, 0.122148044407368f, - -0.327456712722778f, - 0.121896997094154f, -0.327166795730591f, 0.121646173298359f, - -0.326876699924469f, - 0.121395580470562f, -0.326586425304413f, 0.121145196259022f, - -0.326295942068100f, - 0.120895043015480f, -0.326005280017853f, 0.120645113289356f, - -0.325714409351349f, - 0.120395407080650f, -0.325423330068588f, 0.120145916938782f, - -0.325132101774216f, - 0.119896657764912f, -0.324840664863586f, 0.119647622108459f, - -0.324549019336700f, - 0.119398809969425f, -0.324257194995880f, 0.119150213897228f, - -0.323965191841125f, - 0.118901848793030f, -0.323672980070114f, 0.118653707206249f, - -0.323380589485168f, - 0.118405789136887f, -0.323088020086288f, 0.118158094584942f, - -0.322795242071152f, - 0.117910631000996f, -0.322502255439758f, 0.117663383483887f, - -0.322209119796753f, - 0.117416366934776f, -0.321915775537491f, 0.117169573903084f, - -0.321622252464294f, - 0.116923004388809f, -0.321328520774841f, 0.116676658391953f, - -0.321034610271454f, - 0.116430543363094f, -0.320740520954132f, 0.116184651851654f, - -0.320446223020554f, - 0.115938983857632f, -0.320151746273041f, 0.115693546831608f, - -0.319857090711594f, - 0.115448333323002f, -0.319562226533890f, 0.115203343331814f, - -0.319267183542252f, - 0.114958584308624f, -0.318971961736679f, 0.114714048802853f, - -0.318676531314850f, - 0.114469736814499f, -0.318380922079086f, 0.114225655794144f, - -0.318085134029388f, - 0.113981798291206f, -0.317789167165756f, 0.113738171756268f, - -0.317492991685867f, - 0.113494776189327f, -0.317196637392044f, 0.113251596689224f, - -0.316900104284287f, - 0.113008655607700f, -0.316603392362595f, 0.112765938043594f, - -0.316306471824646f, - 0.112523443996906f, -0.316009372472763f, 0.112281180918217f, - -0.315712094306946f, - 0.112039148807526f, -0.315414607524872f, 0.111797347664833f, - -0.315116971731186f, - 0.111555770039558f, -0.314819127321243f, 0.111314415931702f, - -0.314521104097366f, - 0.111073300242424f, -0.314222872257233f, 0.110832408070564f, - -0.313924491405487f, - 0.110591746866703f, -0.313625901937485f, 0.110351309180260f, - -0.313327133655548f, - 0.110111102461815f, -0.313028186559677f, 0.109871134161949f, - -0.312729060649872f, - 0.109631389379501f, -0.312429755926132f, 0.109391868114471f, - -0.312130242586136f, - 0.109152585268021f, -0.311830550432205f, 0.108913525938988f, - -0.311530679464340f, - 0.108674705028534f, -0.311230629682541f, 0.108436107635498f, - -0.310930401086807f, - 0.108197741210461f, -0.310629993677139f, 0.107959605753422f, - -0.310329377651215f, - 0.107721701264381f, -0.310028612613678f, 0.107484027743340f, - -0.309727638959885f, - 0.107246585190296f, -0.309426486492157f, 0.107009373605251f, - -0.309125155210495f, - 0.106772392988205f, -0.308823645114899f, 0.106535643339157f, - -0.308521956205368f, - 0.106299124658108f, -0.308220088481903f, 0.106062836945057f, - -0.307918041944504f, - 0.105826787650585f, -0.307615786790848f, 0.105590961873531f, - -0.307313382625580f, - 0.105355374515057f, -0.307010769844055f, 0.105120018124580f, - -0.306708008050919f, - 0.104884892702103f, -0.306405037641525f, 0.104649998247623f, - -0.306101888418198f, - 0.104415334761143f, -0.305798590183258f, 0.104180909693241f, - -0.305495083332062f, - 0.103946708142757f, -0.305191397666931f, 0.103712752461433f, - -0.304887533187866f, - 0.103479020297527f, -0.304583519697189f, 0.103245526552200f, - -0.304279297590256f, - 0.103012263774872f, -0.303974896669388f, 0.102779231965542f, - -0.303670316934586f, - 0.102546438574791f, -0.303365558385849f, 0.102313876152039f, - -0.303060621023178f, - 0.102081544697285f, -0.302755534648895f, 0.101849451661110f, - -0.302450239658356f, - 0.101617597043514f, -0.302144765853882f, 0.101385973393917f, - -0.301839113235474f, - 0.101154580712318f, -0.301533311605453f, 0.100923426449299f, - -0.301227301359177f, - 0.100692503154278f, -0.300921112298965f, 0.100461818277836f, - -0.300614774227142f, - 0.100231364369392f, -0.300308227539063f, 0.100001148879528f, - -0.300001531839371f, - 0.099771171808243f, -0.299694657325745f, 0.099541425704956f, - -0.299387603998184f, - 0.099311910569668f, -0.299080342054367f, 0.099082641303539f, - -0.298772931098938f, - 0.098853603005409f, -0.298465341329575f, 0.098624803125858f, - -0.298157602548599f, - 0.098396234214306f, -0.297849655151367f, 0.098167903721333f, - -0.297541528940201f, - 0.097939811646938f, -0.297233253717422f, 0.097711957991123f, - -0.296924799680710f, - 0.097484335303307f, -0.296616137027740f, 0.097256951034069f, - -0.296307325363159f, - 0.097029805183411f, -0.295998334884644f, 0.096802897751331f, - -0.295689195394516f, - 0.096576221287251f, -0.295379847288132f, 0.096349790692329f, - -0.295070350170136f, - 0.096123591065407f, -0.294760644435883f, 0.095897629857063f, - -0.294450789690018f, - 0.095671907067299f, -0.294140785932541f, 0.095446422696114f, - -0.293830573558807f, - 0.095221176743507f, -0.293520182371140f, 0.094996169209480f, - -0.293209642171860f, - 0.094771400094032f, -0.292898923158646f, 0.094546869397163f, - -0.292588025331497f, - 0.094322577118874f, -0.292276978492737f, 0.094098523259163f, - -0.291965723037720f, - 0.093874707818031f, -0.291654318571091f, 0.093651130795479f, - -0.291342735290527f, - 0.093427792191505f, -0.291031002998352f, 0.093204692006111f, - -0.290719062089920f, - 0.092981837689877f, -0.290406972169876f, 0.092759214341640f, - -0.290094703435898f, - 0.092536836862564f, -0.289782285690308f, 0.092314697802067f, - -0.289469659328461f, - 0.092092797160149f, -0.289156883955002f, 0.091871134936810f, - -0.288843959569931f, - 0.091649711132050f, -0.288530826568604f, 0.091428533196449f, - -0.288217544555664f, - 0.091207593679428f, -0.287904083728790f, 0.090986892580986f, - -0.287590473890305f, - 0.090766437351704f, -0.287276685237885f, 0.090546220541000f, - -0.286962717771530f, - 0.090326242148876f, -0.286648571491241f, 0.090106502175331f, - -0.286334276199341f, - 0.089887008070946f, -0.286019802093506f, 0.089667752385139f, - -0.285705178976059f, - 0.089448742568493f, -0.285390377044678f, 0.089229971170425f, - -0.285075396299362f, - 0.089011445641518f, -0.284760266542435f, 0.088793158531189f, - -0.284444957971573f, - 0.088575109839439f, -0.284129470586777f, 0.088357307016850f, - -0.283813834190369f, - 0.088139742612839f, -0.283498018980026f, 0.087922424077988f, - -0.283182054758072f, - 0.087705351412296f, -0.282865911722183f, 0.087488517165184f, - -0.282549589872360f, - 0.087271921336651f, -0.282233119010925f, 0.087055571377277f, - -0.281916469335556f, - 0.086839467287064f, -0.281599670648575f, 0.086623609066010f, - -0.281282693147659f, - 0.086407989263535f, -0.280965566635132f, 0.086192607879639f, - -0.280648261308670f, - 0.085977479815483f, -0.280330777168274f, 0.085762590169907f, - -0.280013144016266f, - 0.085547938942909f, -0.279695361852646f, 0.085333541035652f, - -0.279377400875092f, - 0.085119381546974f, -0.279059261083603f, 0.084905467927456f, - -0.278740972280502f, - 0.084691800177097f, -0.278422504663467f, 0.084478378295898f, - -0.278103888034821f, - 0.084265194833279f, -0.277785122394562f, 0.084052257239819f, - -0.277466177940369f, - 0.083839565515518f, -0.277147054672241f, 0.083627119660378f, - -0.276827782392502f, - 0.083414919674397f, -0.276508361101151f, 0.083202958106995f, - -0.276188760995865f, - 0.082991249859333f, -0.275868982076645f, 0.082779780030251f, - -0.275549083948135f, - 0.082568563520908f, -0.275228977203369f, 0.082357585430145f, - -0.274908751249313f, - 0.082146860659122f, -0.274588316679001f, 0.081936374306679f, - -0.274267762899399f, - 0.081726133823395f, -0.273947030305862f, 0.081516146659851f, - -0.273626148700714f, - 0.081306397914886f, -0.273305088281631f, 0.081096902489662f, - -0.272983878850937f, - 0.080887645483017f, -0.272662490606308f, 0.080678641796112f, - -0.272340953350067f, - 0.080469883978367f, -0.272019267082214f, 0.080261372029781f, - -0.271697402000427f, - 0.080053105950356f, -0.271375387907028f, 0.079845085740089f, - -0.271053224802017f, - 0.079637311398983f, -0.270730882883072f, 0.079429790377617f, - -0.270408391952515f, - 0.079222507774830f, -0.270085722208023f, 0.079015478491783f, - -0.269762933254242f, - 0.078808702528477f, -0.269439965486526f, 0.078602164983749f, - -0.269116818904877f, - 0.078395880758762f, -0.268793523311615f, 0.078189842402935f, - -0.268470078706741f, - 0.077984049916267f, -0.268146485090256f, 0.077778510749340f, - -0.267822742462158f, - 0.077573217451572f, -0.267498821020126f, 0.077368170022964f, - -0.267174720764160f, - 0.077163375914097f, -0.266850501298904f, 0.076958827674389f, - -0.266526103019714f, - 0.076754532754421f, -0.266201555728912f, 0.076550483703613f, - -0.265876859426498f, - 0.076346680521965f, -0.265552014112473f, 0.076143130660057f, - -0.265226989984512f, - 0.075939826667309f, -0.264901816844940f, 0.075736775994301f, - -0.264576494693756f, - 0.075533971190453f, -0.264250993728638f, 0.075331419706345f, - -0.263925373554230f, - 0.075129114091396f, -0.263599574565887f, 0.074927061796188f, - -0.263273626565933f, - 0.074725262820721f, -0.262947499752045f, 0.074523709714413f, - -0.262621253728867f, - 0.074322402477264f, -0.262294828891754f, 0.074121348559856f, - -0.261968284845352f, - 0.073920547962189f, -0.261641561985016f, 0.073720000684261f, - -0.261314690113068f, - 0.073519699275494f, -0.260987639427185f, 0.073319651186466f, - -0.260660469532013f, - 0.073119848966599f, -0.260333120822906f, 0.072920300066471f, - -0.260005623102188f, - 0.072721004486084f, -0.259678006172180f, 0.072521962225437f, - -0.259350210428238f, - 0.072323165833950f, -0.259022265672684f, 0.072124622762203f, - -0.258694142103195f, - 0.071926333010197f, -0.258365899324417f, 0.071728296577930f, - -0.258037507534027f, - 0.071530513465405f, -0.257708936929703f, 0.071332976222038f, - -0.257380217313766f, - 0.071135692298412f, -0.257051378488541f, 0.070938661694527f, - -0.256722360849380f, - 0.070741884410381f, -0.256393194198608f, 0.070545360445976f, - -0.256063878536224f, - 0.070349089801311f, -0.255734413862228f, 0.070153072476387f, - -0.255404800176620f, - 0.069957308471203f, -0.255075037479401f, 0.069761790335178f, - -0.254745125770569f, - 0.069566532969475f, -0.254415065050125f, 0.069371521472931f, - -0.254084855318069f, - 0.069176770746708f, -0.253754496574402f, 0.068982265889645f, - -0.253423988819122f, - 0.068788021802902f, -0.253093332052231f, 0.068594031035900f, - -0.252762526273727f, - 0.068400286138058f, -0.252431541681290f, 0.068206802010536f, - -0.252100437879562f, - 0.068013571202755f, -0.251769185066223f, 0.067820593714714f, - -0.251437783241272f, - 0.067627869546413f, -0.251106232404709f, 0.067435398697853f, - -0.250774532556534f, - 0.067243188619614f, -0.250442683696747f, 0.067051224410534f, - -0.250110685825348f, - 0.066859520971775f, -0.249778553843498f, 0.066668070852757f, - -0.249446272850037f, - 0.066476874053478f, -0.249113827943802f, 0.066285938024521f, - -0.248781248927116f, - 0.066095255315304f, -0.248448520898819f, 0.065904818475246f, - -0.248115643858910f, - 0.065714649856091f, -0.247782632708550f, 0.065524727106094f, - -0.247449472546577f, - 0.065335065126419f, -0.247116148471832f, 0.065145656466484f, - -0.246782705187798f, - 0.064956501126289f, -0.246449097990990f, 0.064767606556416f, - -0.246115356683731f, - 0.064578965306282f, -0.245781451463699f, 0.064390584826469f, - -0.245447427034378f, - 0.064202457666397f, -0.245113238692284f, 0.064014583826065f, - -0.244778916239738f, - 0.063826970756054f, -0.244444444775581f, 0.063639611005783f, - -0.244109839200974f, - 0.063452512025833f, -0.243775084614754f, 0.063265666365623f, - -0.243440181016922f, - 0.063079081475735f, -0.243105143308640f, 0.062892749905586f, - -0.242769956588745f, - 0.062706671655178f, -0.242434620857239f, 0.062520854175091f, - -0.242099151015282f, - 0.062335297465324f, -0.241763532161713f, 0.062149997800589f, - -0.241427779197693f, - 0.061964951455593f, -0.241091892123222f, 0.061780165880919f, - -0.240755841135979f, - 0.061595637351274f, -0.240419670939446f, 0.061411365866661f, - -0.240083336830139f, - 0.061227355152369f, -0.239746883511543f, 0.061043601483107f, - -0.239410281181335f, - 0.060860104858875f, -0.239073529839516f, 0.060676865279675f, - -0.238736644387245f, - 0.060493886470795f, -0.238399609923363f, 0.060311164706945f, - -0.238062441349030f, - 0.060128703713417f, -0.237725138664246f, 0.059946499764919f, - -0.237387686967850f, - 0.059764556586742f, -0.237050101161003f, 0.059582870453596f, - -0.236712381243706f, - 0.059401445090771f, -0.236374512314796f, 0.059220276772976f, - -0.236036509275436f, - 0.059039369225502f, -0.235698372125626f, 0.058858718723059f, - -0.235360085964203f, - 0.058678328990936f, -0.235021665692329f, 0.058498200029135f, - -0.234683111310005f, - 0.058318331837654f, -0.234344407916069f, 0.058138720691204f, - -0.234005570411682f, - 0.057959370315075f, -0.233666598796844f, 0.057780280709267f, - -0.233327493071556f, - 0.057601451873779f, -0.232988253235817f, 0.057422880083323f, - -0.232648864388466f, - 0.057244572788477f, -0.232309341430664f, 0.057066522538662f, - -0.231969684362412f, - 0.056888736784458f, -0.231629893183708f, 0.056711208075285f, - -0.231289967894554f, - 0.056533940136433f, -0.230949893593788f, 0.056356932967901f, - -0.230609700083733f, - 0.056180190294981f, -0.230269357562065f, 0.056003704667091f, - -0.229928880929947f, - 0.055827483534813f, -0.229588270187378f, 0.055651523172855f, - -0.229247525334358f, - 0.055475823581219f, -0.228906646370888f, 0.055300384759903f, - -0.228565633296967f, - 0.055125206708908f, -0.228224486112595f, 0.054950293153524f, - -0.227883204817772f, - 0.054775636643171f, -0.227541789412498f, 0.054601248353720f, - -0.227200239896774f, - 0.054427117109299f, -0.226858556270599f, 0.054253250360489f, - -0.226516738533974f, - 0.054079644382000f, -0.226174786686897f, 0.053906302899122f, - -0.225832715630531f, - 0.053733222186565f, -0.225490495562553f, 0.053560405969620f, - -0.225148141384125f, - 0.053387850522995f, -0.224805667996407f, 0.053215555846691f, - -0.224463045597076f, - 0.053043525665998f, -0.224120303988457f, 0.052871759980917f, - -0.223777428269386f, - 0.052700258791447f, -0.223434418439865f, 0.052529018372297f, - -0.223091274499893f, - 0.052358038723469f, -0.222748011350632f, 0.052187327295542f, - -0.222404599189758f, - 0.052016876637936f, -0.222061067819595f, 0.051846686750650f, - -0.221717402338982f, - 0.051676765084267f, -0.221373617649078f, 0.051507104188204f, - -0.221029683947563f, - 0.051337707787752f, -0.220685631036758f, 0.051168579608202f, - -0.220341444015503f, - 0.050999708473682f, -0.219997137784958f, 0.050831105560064f, - -0.219652697443962f, - 0.050662767142057f, -0.219308122992516f, 0.050494693219662f, - -0.218963414430618f, - 0.050326880067587f, -0.218618586659431f, 0.050159335136414f, - -0.218273624777794f, - 0.049992054700851f, -0.217928543686867f, 0.049825038760900f, - -0.217583328485489f, - 0.049658283591270f, -0.217237979173660f, 0.049491796642542f, - -0.216892510652542f, - 0.049325577914715f, -0.216546908020973f, 0.049159619957209f, - -0.216201186180115f, - 0.048993926495314f, -0.215855330228806f, 0.048828501254320f, - -0.215509355068207f, - 0.048663340508938f, -0.215163245797157f, 0.048498444259167f, - -0.214817002415657f, - 0.048333816230297f, -0.214470639824867f, 0.048169452697039f, - -0.214124158024788f, - 0.048005353659391f, -0.213777542114258f, 0.047841522842646f, - -0.213430806994438f, - 0.047677956521511f, -0.213083937764168f, 0.047514654695988f, - -0.212736949324608f, - 0.047351621091366f, -0.212389841675758f, 0.047188851982355f, - -0.212042599916458f, - 0.047026351094246f, -0.211695238947868f, 0.046864114701748f, - -0.211347743868828f, - 0.046702146530151f, -0.211000129580498f, 0.046540446579456f, - -0.210652396082878f, - 0.046379011124372f, -0.210304543375969f, 0.046217843890190f, - -0.209956556558609f, - 0.046056941151619f, -0.209608450531960f, 0.045896306633949f, - -0.209260210394859f, - 0.045735940337181f, -0.208911851048470f, 0.045575842261314f, - -0.208563387393951f, - 0.045416008681059f, -0.208214774727821f, 0.045256443321705f, - -0.207866057753563f, - 0.045097146183252f, -0.207517206668854f, 0.044938117265701f, - -0.207168251276016f, - 0.044779352843761f, -0.206819161772728f, 0.044620860368013f, - -0.206469938158989f, - 0.044462632387877f, -0.206120610237122f, 0.044304672628641f, - -0.205771163105965f, - 0.044146984815598f, -0.205421581864357f, 0.043989561498165f, - -0.205071896314621f, - 0.043832406401634f, -0.204722076654434f, 0.043675523251295f, - -0.204372137784958f, - 0.043518904596567f, -0.204022079706192f, 0.043362557888031f, - -0.203671902418137f, - 0.043206475675106f, -0.203321605920792f, 0.043050665408373f, - -0.202971190214157f, - 0.042895123362541f, -0.202620655298233f, 0.042739849537611f, - -0.202270001173019f, - 0.042584843933582f, -0.201919227838516f, 0.042430106550455f, - -0.201568335294724f, - 0.042275641113520f, -0.201217323541641f, 0.042121443897486f, - -0.200866192579269f, - 0.041967518627644f, -0.200514942407608f, 0.041813857853413f, - -0.200163587927818f, - 0.041660469025373f, -0.199812099337578f, 0.041507352143526f, - -0.199460506439209f, - 0.041354499757290f, -0.199108779430389f, 0.041201923042536f, - -0.198756948113441f, - 0.041049610823393f, -0.198404997587204f, 0.040897574275732f, - -0.198052927851677f, - 0.040745802223682f, -0.197700738906860f, 0.040594302117825f, - -0.197348430752754f, - 0.040443073958158f, -0.196996018290520f, 0.040292114019394f, - -0.196643486618996f, - 0.040141426026821f, -0.196290835738182f, 0.039991009980440f, - -0.195938065648079f, - 0.039840862154961f, -0.195585191249847f, 0.039690986275673f, - -0.195232197642326f, - 0.039541378617287f, -0.194879084825516f, 0.039392042905092f, - -0.194525867700577f, - 0.039242979139090f, -0.194172516465187f, 0.039094187319279f, - -0.193819075822830f, - 0.038945667445660f, -0.193465501070023f, 0.038797415792942f, - -0.193111822009087f, - 0.038649436086416f, -0.192758023738861f, 0.038501728326082f, - -0.192404121160507f, - 0.038354292511940f, -0.192050099372864f, 0.038207128643990f, - -0.191695958375931f, - 0.038060232996941f, -0.191341713070869f, 0.037913613021374f, - -0.190987363457680f, - 0.037767261266708f, -0.190632879734039f, 0.037621185183525f, - -0.190278306603432f, - 0.037475381046534f, -0.189923599362373f, 0.037329845130444f, - -0.189568802714348f, - 0.037184584885836f, -0.189213871955872f, 0.037039596587420f, - -0.188858851790428f, - 0.036894880235195f, -0.188503712415695f, 0.036750435829163f, - -0.188148453831673f, - 0.036606263369322f, -0.187793090939522f, 0.036462362855673f, - -0.187437608838081f, - 0.036318738013506f, -0.187082037329674f, 0.036175385117531f, - -0.186726331710815f, - 0.036032304167747f, -0.186370536684990f, 0.035889495164156f, - -0.186014622449875f, - 0.035746958106756f, -0.185658603906631f, 0.035604696720839f, - -0.185302466154099f, - 0.035462711006403f, -0.184946224093437f, 0.035320993512869f, - -0.184589877724648f, - 0.035179551690817f, -0.184233412146568f, 0.035038381814957f, - -0.183876842260361f, - 0.034897487610579f, -0.183520168066025f, 0.034756865352392f, - -0.183163389563560f, - 0.034616518765688f, -0.182806491851807f, 0.034476444125175f, - -0.182449504733086f, - 0.034336645156145f, -0.182092398405075f, 0.034197118133307f, - -0.181735187768936f, - 0.034057866781950f, -0.181377857923508f, 0.033918887376785f, - -0.181020438671112f, - 0.033780183643103f, -0.180662900209427f, 0.033641755580902f, - -0.180305257439613f, - 0.033503599464893f, -0.179947525262833f, 0.033365719020367f, - -0.179589673876762f, - 0.033228114247322f, -0.179231703281403f, 0.033090781420469f, - -0.178873643279076f, - 0.032953724265099f, -0.178515478968620f, 0.032816942781210f, - -0.178157210350037f, - 0.032680433243513f, -0.177798837423325f, 0.032544203102589f, - -0.177440345287323f, - 0.032408244907856f, -0.177081763744354f, 0.032272562384605f, - -0.176723077893257f, - 0.032137155532837f, -0.176364272832870f, 0.032002024352551f, - -0.176005378365517f, - 0.031867165118456f, -0.175646379590034f, 0.031732585281134f, - -0.175287276506424f, - 0.031598277390003f, -0.174928069114685f, 0.031464248895645f, - -0.174568757414818f, - 0.031330492347479f, -0.174209341406822f, 0.031197015196085f, - -0.173849821090698f, - 0.031063811853528f, -0.173490211367607f, 0.030930884182453f, - -0.173130482435226f, - 0.030798232182860f, -0.172770664095879f, 0.030665857717395f, - -0.172410741448402f, - 0.030533758923411f, -0.172050714492798f, 0.030401935800910f, - -0.171690583229065f, - 0.030270388349891f, -0.171330362558365f, 0.030139118432999f, - -0.170970037579536f, - 0.030008124187589f, -0.170609608292580f, 0.029877405613661f, - -0.170249074697495f, - 0.029746964573860f, -0.169888436794281f, 0.029616801068187f, - -0.169527709484100f, - 0.029486913233995f, -0.169166877865791f, 0.029357301071286f, - -0.168805956840515f, - 0.029227968305349f, -0.168444931507111f, 0.029098909348249f, - -0.168083801865578f, - 0.028970129787922f, -0.167722567915916f, 0.028841627761722f, - -0.167361244559288f, - 0.028713401407003f, -0.166999831795692f, 0.028585452586412f, - -0.166638299822807f, - 0.028457781299949f, -0.166276678442955f, 0.028330387547612f, - -0.165914967656136f, - 0.028203271329403f, -0.165553152561188f, 0.028076432645321f, - -0.165191248059273f, - 0.027949871495366f, -0.164829224348068f, 0.027823587879539f, - -0.164467126131058f, - 0.027697581797838f, -0.164104923605919f, 0.027571853250265f, - -0.163742616772652f, - 0.027446404099464f, -0.163380220532417f, 0.027321230620146f, - -0.163017734885216f, - 0.027196336537600f, -0.162655144929886f, 0.027071721851826f, - -0.162292465567589f, - 0.026947384700179f, -0.161929681897163f, 0.026823325082660f, - -0.161566808819771f, - 0.026699542999268f, -0.161203846335411f, 0.026576040312648f, - -0.160840779542923f, - 0.026452817022800f, -0.160477623343468f, 0.026329871267080f, - -0.160114362835884f, - 0.026207204908133f, -0.159751012921333f, 0.026084816083312f, - -0.159387573599815f, - 0.025962706655264f, -0.159024044871330f, 0.025840876623988f, - -0.158660411834717f, - 0.025719324126840f, -0.158296689391136f, 0.025598052889109f, - -0.157932877540588f, - 0.025477059185505f, -0.157568961381912f, 0.025356344878674f, - -0.157204970717430f, - 0.025235909968615f, -0.156840875744820f, 0.025115754455328f, - -0.156476691365242f, - 0.024995878338814f, -0.156112402677536f, 0.024876279756427f, - -0.155748039484024f, - 0.024756962433457f, -0.155383571982384f, 0.024637924507260f, - -0.155019029974937f, - 0.024519165977836f, -0.154654383659363f, 0.024400688707829f, - -0.154289647936821f, - 0.024282488971949f, -0.153924822807312f, 0.024164570495486f, - -0.153559908270836f, - 0.024046931415796f, -0.153194904327393f, 0.023929571732879f, - -0.152829796075821f, - 0.023812493309379f, -0.152464613318443f, 0.023695694282651f, - -0.152099341154099f, - 0.023579176515341f, -0.151733979582787f, 0.023462938144803f, - -0.151368513703346f, - 0.023346979171038f, -0.151002973318100f, 0.023231301456690f, - -0.150637343525887f, - 0.023115905001760f, -0.150271624326706f, 0.023000787943602f, - -0.149905815720558f, - 0.022885952144861f, -0.149539917707443f, 0.022771397605538f, - -0.149173930287361f, - 0.022657122462988f, -0.148807853460312f, 0.022543128579855f, - -0.148441687226295f, - 0.022429415956140f, -0.148075446486473f, 0.022315984591842f, - -0.147709101438522f, - 0.022202832624316f, -0.147342681884766f, 0.022089963778853f, - -0.146976172924042f, - 0.021977374330163f, -0.146609574556351f, 0.021865066140890f, - -0.146242901682854f, - 0.021753041073680f, -0.145876124501228f, 0.021641295403242f, - -0.145509272813797f, - 0.021529832854867f, -0.145142331719399f, 0.021418649703264f, - -0.144775316119194f, - 0.021307749673724f, -0.144408211112022f, 0.021197130903602f, - -0.144041016697884f, - 0.021086793392897f, -0.143673732876778f, 0.020976737141609f, - -0.143306359648705f, - 0.020866964012384f, -0.142938911914825f, 0.020757472142577f, - -0.142571389675140f, - 0.020648263394833f, -0.142203763127327f, 0.020539334043860f, - -0.141836062073708f, - 0.020430689677596f, -0.141468286514282f, 0.020322324708104f, - -0.141100421547890f, - 0.020214242860675f, -0.140732467174530f, 0.020106444135308f, - -0.140364438295364f, - 0.019998926669359f, -0.139996320009232f, 0.019891692325473f, - -0.139628127217293f, - 0.019784741103649f, -0.139259845018387f, 0.019678071141243f, - -0.138891488313675f, - 0.019571684300900f, -0.138523042201996f, 0.019465578719974f, - -0.138154521584511f, - 0.019359756261110f, -0.137785911560059f, 0.019254218786955f, - -0.137417227029800f, - 0.019148962572217f, -0.137048453092575f, 0.019043987616897f, - -0.136679604649544f, - 0.018939297646284f, -0.136310681700706f, 0.018834890797734f, - -0.135941669344902f, - 0.018730765208602f, -0.135572582483292f, 0.018626924604177f, - -0.135203406214714f, - 0.018523367121816f, -0.134834155440331f, 0.018420090898871f, - -0.134464830160141f, - 0.018317099660635f, -0.134095430374146f, 0.018214391544461f, - -0.133725941181183f, - 0.018111966550350f, -0.133356377482414f, 0.018009826540947f, - -0.132986739277840f, - 0.017907967790961f, -0.132617011666298f, 0.017806394025683f, - -0.132247209548950f, - 0.017705103382468f, -0.131877332925797f, 0.017604095861316f, - -0.131507381796837f, - 0.017503373324871f, -0.131137356162071f, 0.017402933910489f, - -0.130767241120338f, - 0.017302779480815f, -0.130397051572800f, 0.017202908173203f, - -0.130026802420616f, - 0.017103319987655f, -0.129656463861465f, 0.017004016786814f, - -0.129286035895348f, - 0.016904998570681f, -0.128915548324585f, 0.016806263476610f, - -0.128544986248016f, - 0.016707813367248f, -0.128174334764481f, 0.016609646379948f, - -0.127803623676300f, - 0.016511764377356f, -0.127432823181152f, 0.016414167359471f, - -0.127061963081360f, - 0.016316853463650f, -0.126691013574600f, 0.016219824552536f, - -0.126320004463196f, - 0.016123080626130f, -0.125948905944824f, 0.016026621684432f, - -0.125577747821808f, - 0.015930447727442f, -0.125206500291824f, 0.015834558755159f, - -0.124835193157196f, - 0.015738952904940f, -0.124463804066181f, 0.015643632039428f, - -0.124092340469360f, - 0.015548598021269f, -0.123720809817314f, 0.015453847125173f, - -0.123349204659462f, - 0.015359382145107f, -0.122977524995804f, 0.015265202149749f, - -0.122605770826340f, - 0.015171307139099f, -0.122233949601650f, 0.015077698044479f, - -0.121862053871155f, - 0.014984373003244f, -0.121490091085434f, 0.014891333878040f, - -0.121118053793907f, - 0.014798580668867f, -0.120745941996574f, 0.014706112444401f, - -0.120373763144016f, - 0.014613929204643f, -0.120001509785652f, 0.014522032812238f, - -0.119629189372063f, - 0.014430420473218f, -0.119256794452667f, 0.014339094981551f, - -0.118884332478046f, - 0.014248054474592f, -0.118511803448200f, 0.014157299883664f, - -0.118139199912548f, - 0.014066831208766f, -0.117766529321671f, 0.013976648449898f, - -0.117393791675568f, - 0.013886751607060f, -0.117020979523659f, 0.013797140680254f, - -0.116648100316525f, - 0.013707815669477f, -0.116275154054165f, 0.013618776574731f, - -0.115902140736580f, - 0.013530024327338f, -0.115529052913189f, 0.013441557064652f, - -0.115155905485153f, - 0.013353376649320f, -0.114782683551311f, 0.013265483081341f, - -0.114409394562244f, - 0.013177875429392f, -0.114036038517952f, 0.013090553693473f, - -0.113662622869015f, - 0.013003518804908f, -0.113289132714272f, 0.012916770763695f, - -0.112915575504303f, - 0.012830308638513f, -0.112541958689690f, 0.012744133360684f, - -0.112168267369270f, - 0.012658244930208f, -0.111794516444206f, 0.012572642415762f, - -0.111420698463917f, - 0.012487327679992f, -0.111046813428402f, 0.012402298860252f, - -0.110672861337662f, - 0.012317557819188f, -0.110298842191696f, 0.012233102694154f, - -0.109924763441086f, - 0.012148935347795f, -0.109550617635250f, 0.012065053917468f, - -0.109176412224770f, - 0.011981460265815f, -0.108802139759064f, 0.011898153461516f, - -0.108427800238132f, - 0.011815134435892f, -0.108053401112556f, 0.011732402257621f, - -0.107678934931755f, - 0.011649956926703f, -0.107304409146309f, 0.011567799374461f, - -0.106929816305637f, - 0.011485928669572f, -0.106555156409740f, 0.011404345743358f, - -0.106180444359779f, - 0.011323049664497f, -0.105805665254593f, 0.011242041364312f, - -0.105430819094181f, - 0.011161320842803f, -0.105055920779705f, 0.011080888099968f, - -0.104680955410004f, - 0.011000742204487f, -0.104305922985077f, 0.010920885019004f, - -0.103930838406086f, - 0.010841314680874f, -0.103555686771870f, 0.010762032121420f, - -0.103180475533009f, - 0.010683037340641f, -0.102805204689503f, 0.010604331269860f, - -0.102429874241352f, - 0.010525912046432f, -0.102054484188557f, 0.010447781533003f, - -0.101679034531116f, - 0.010369938798249f, -0.101303517818451f, 0.010292383842170f, - -0.100927948951721f, - 0.010215117596090f, -0.100552320480347f, 0.010138138197362f, - -0.100176624953747f, - 0.010061448439956f, -0.099800877273083f, 0.009985045529902f, - -0.099425069987774f, - 0.009908932261169f, -0.099049203097820f, 0.009833106771111f, - -0.098673284053802f, - 0.009757569059730f, -0.098297297954559f, 0.009682320058346f, - -0.097921259701252f, - 0.009607359766960f, -0.097545161843300f, 0.009532688185573f, - -0.097169004380703f, - 0.009458304382861f, -0.096792794764042f, 0.009384209290147f, - -0.096416525542736f, - 0.009310402907431f, -0.096040196716785f, 0.009236886166036f, - -0.095663815736771f, - 0.009163657203317f, -0.095287375152111f, 0.009090716950595f, - -0.094910882413387f, - 0.009018065407872f, -0.094534330070019f, 0.008945702575147f, - -0.094157725572586f, - 0.008873629383743f, -0.093781061470509f, 0.008801844902337f, - -0.093404345214367f, - 0.008730349130929f, -0.093027576804161f, 0.008659142069519f, - -0.092650748789310f, - 0.008588224649429f, -0.092273868620396f, 0.008517595939338f, - -0.091896936297417f, - 0.008447255939245f, -0.091519944369793f, 0.008377205580473f, - -0.091142900288105f, - 0.008307444863021f, -0.090765804052353f, 0.008237972855568f, - -0.090388655662537f, - 0.008168790489435f, -0.090011447668076f, 0.008099896833301f, - -0.089634194970131f, - 0.008031292818487f, -0.089256882667542f, 0.007962978444993f, - -0.088879525661469f, - 0.007894953712821f, -0.088502109050751f, 0.007827218621969f, - -0.088124647736549f, - 0.007759772241116f, -0.087747126817703f, 0.007692615967244f, - -0.087369553744793f, - 0.007625748869032f, -0.086991935968399f, 0.007559171877801f, - -0.086614266037941f, - 0.007492884527892f, -0.086236543953419f, 0.007426886819303f, - -0.085858769714832f, - 0.007361178752035f, -0.085480943322182f, 0.007295760791749f, - -0.085103072226048f, - 0.007230632472783f, -0.084725148975849f, 0.007165793795139f, - -0.084347173571587f, - 0.007101245224476f, -0.083969146013260f, 0.007036986760795f, - -0.083591073751450f, - 0.006973018404096f, -0.083212949335575f, 0.006909339688718f, - -0.082834780216217f, - 0.006845951545984f, -0.082456558942795f, 0.006782853044569f, - -0.082078292965889f, - 0.006720044650137f, -0.081699974834919f, 0.006657526828349f, - -0.081321612000465f, - 0.006595299113542f, -0.080943197011948f, 0.006533361505717f, - -0.080564737319946f, - 0.006471714470536f, -0.080186225473881f, 0.006410357542336f, - -0.079807676374912f, - 0.006349290721118f, -0.079429075121880f, 0.006288514938205f, - -0.079050421714783f, - 0.006228029262275f, -0.078671731054783f, 0.006167833693326f, - -0.078292988240719f, - 0.006107929162681f, -0.077914200723171f, 0.006048315204680f, - -0.077535368502140f, - 0.005988991353661f, -0.077156484127045f, 0.005929958540946f, - -0.076777562499046f, - 0.005871216300875f, -0.076398596167564f, 0.005812764633447f, - -0.076019577682018f, - 0.005754603538662f, -0.075640521943569f, 0.005696733482182f, - -0.075261414051056f, - 0.005639153998345f, -0.074882268905640f, 0.005581865552813f, - -0.074503071606159f, - 0.005524867679924f, -0.074123837053776f, 0.005468160845339f, - -0.073744557797909f, - 0.005411745049059f, -0.073365233838558f, 0.005355620291084f, - -0.072985872626305f, - 0.005299786105752f, -0.072606459259987f, 0.005244242958724f, - -0.072227008640766f, - 0.005188991315663f, -0.071847513318062f, 0.005134030245245f, - -0.071467980742455f, - 0.005079360678792f, -0.071088403463364f, 0.005024982150644f, - -0.070708781480789f, - 0.004970894660801f, -0.070329122245312f, 0.004917098674923f, - -0.069949418306351f, - 0.004863593727350f, -0.069569669663906f, 0.004810380283743f, - -0.069189883768559f, - 0.004757457878441f, -0.068810060620308f, 0.004704826977104f, - -0.068430192768574f, - 0.004652487114072f, -0.068050287663937f, 0.004600439220667f, - -0.067670337855816f, - 0.004548682365566f, -0.067290350794792f, 0.004497217014432f, - -0.066910326480865f, - 0.004446043167263f, -0.066530264914036f, 0.004395160824060f, - -0.066150158643723f, - 0.004344569984823f, -0.065770015120506f, 0.004294271115214f, - -0.065389834344387f, - 0.004244263283908f, -0.065009608864784f, 0.004194547422230f, - -0.064629353582859f, - 0.004145123064518f, -0.064249053597450f, 0.004095990676433f, - -0.063868723809719f, - 0.004047149792314f, -0.063488349318504f, 0.003998600877821f, - -0.063107937574387f, - 0.003950343467295f, -0.062727488577366f, 0.003902378026396f, - -0.062347009778023f, - 0.003854704322293f, -0.061966486275196f, 0.003807322587818f, - -0.061585929244757f, - 0.003760232590139f, -0.061205338686705f, 0.003713434794918f, - -0.060824707150459f, - 0.003666928736493f, -0.060444042086601f, 0.003620714880526f, - -0.060063343495131f, - 0.003574792761356f, -0.059682607650757f, 0.003529162844643f, - -0.059301838278770f, - 0.003483824897557f, -0.058921031653881f, 0.003438779152930f, - -0.058540191501379f, - 0.003394025377929f, -0.058159314095974f, 0.003349563805386f, - -0.057778406888247f, - 0.003305394435301f, -0.057397462427616f, 0.003261517267674f, - -0.057016488164663f, - 0.003217932302505f, -0.056635476648808f, 0.003174639539793f, - -0.056254431605339f, - 0.003131638979539f, -0.055873356759548f, 0.003088930854574f, - -0.055492244660854f, - 0.003046514932066f, -0.055111102759838f, 0.003004391444847f, - -0.054729927331209f, - 0.002962560392916f, -0.054348722100258f, 0.002921021543443f, - -0.053967483341694f, - 0.002879775362089f, -0.053586211055517f, 0.002838821383193f, - -0.053204908967018f, - 0.002798160072416f, -0.052823577076197f, 0.002757790964097f, - -0.052442211657763f, - 0.002717714523897f, -0.052060816437006f, 0.002677930751815f, - -0.051679391413927f, - 0.002638439415023f, -0.051297932863235f, 0.002599240746349f, - -0.050916448235512f, - 0.002560334512964f, -0.050534930080175f, 0.002521721180528f, - -0.050153385847807f, - 0.002483400283381f, -0.049771808087826f, 0.002445372054353f, - -0.049390204250813f, - 0.002407636726275f, -0.049008570611477f, 0.002370193833485f, - -0.048626907169819f, - 0.002333043841645f, -0.048245213925838f, 0.002296186750755f, - -0.047863494604826f, - 0.002259622327983f, -0.047481749206781f, 0.002223350573331f, - -0.047099970281124f, - 0.002187371719629f, -0.046718169003725f, 0.002151685766876f, - -0.046336337924004f, - 0.002116292715073f, -0.045954477041960f, 0.002081192564219f, - -0.045572593808174f, - 0.002046385314316f, -0.045190680772066f, 0.002011870965362f, - -0.044808741658926f, - 0.001977649517357f, -0.044426776468754f, 0.001943721086718f, - -0.044044785201550f, - 0.001910085673444f, -0.043662767857313f, 0.001876743277535f, - -0.043280724436045f, - 0.001843693898991f, -0.042898654937744f, 0.001810937537812f, - -0.042516563087702f, - 0.001778474310413f, -0.042134445160627f, 0.001746304216795f, - -0.041752301156521f, - 0.001714427140541f, -0.041370131075382f, 0.001682843198068f, - -0.040987938642502f, - 0.001651552389376f, -0.040605723857880f, 0.001620554830879f, - -0.040223482996225f, - 0.001589850406162f, -0.039841219782829f, 0.001559439115226f, - -0.039458930492401f, - 0.001529321074486f, -0.039076622575521f, 0.001499496400356f, - -0.038694288581610f, - 0.001469964860007f, -0.038311932235956f, 0.001440726569854f, - -0.037929553538561f, - 0.001411781646311f, -0.037547148764133f, 0.001383129972965f, - -0.037164725363255f, - 0.001354771666229f, -0.036782283335924f, 0.001326706726104f, - -0.036399815231562f, - 0.001298935036175f, -0.036017324775457f, 0.001271456829272f, - -0.035634815692902f, - 0.001244271872565f, -0.035252287983894f, 0.001217380515300f, - -0.034869734197855f, - 0.001190782408230f, -0.034487165510654f, 0.001164477784187f, - -0.034104570746422f, - 0.001138466643170f, -0.033721961081028f, 0.001112748985179f, - -0.033339329063892f, - 0.001087324810214f, -0.032956674695015f, 0.001062194118276f, - -0.032574005424976f, - 0.001037356909364f, -0.032191313803196f, 0.001012813183479f, - -0.031808607280254f, - 0.000988563057035f, -0.031425878405571f, 0.000964606530033f, - -0.031043132767081f, - 0.000940943544265f, -0.030660368502140f, 0.000917574157938f, - -0.030277585610747f, - 0.000894498312846f, -0.029894785955548f, 0.000871716125403f, - -0.029511967673898f, - 0.000849227537401f, -0.029129132628441f, 0.000827032607049f, - -0.028746278956532f, - 0.000805131276138f, -0.028363410383463f, 0.000783523661084f, - -0.027980525046587f, - 0.000762209703680f, -0.027597622945905f, 0.000741189462133f, - -0.027214704081416f, - 0.000720462878235f, -0.026831768453121f, 0.000700030010194f, - -0.026448817923665f, - 0.000679890916217f, -0.026065852493048f, 0.000660045538098f, - -0.025682870298624f, - 0.000640493875835f, -0.025299875065684f, 0.000621235987637f, - -0.024916863068938f, - 0.000602271873504f, -0.024533838033676f, 0.000583601591643f, - -0.024150796234608f, - 0.000565225025639f, -0.023767741397023f, 0.000547142291907f, - -0.023384673520923f, - 0.000529353390448f, -0.023001590743661f, 0.000511858321261f, - -0.022618494927883f, - 0.000494657084346f, -0.022235386073589f, 0.000477749679703f, - -0.021852264180779f, - 0.000461136136437f, -0.021469129249454f, 0.000444816454547f, - -0.021085981279612f, - 0.000428790634032f, -0.020702820271254f, 0.000413058703998f, - -0.020319648087025f, - 0.000397620693548f, -0.019936462864280f, 0.000382476573577f, - -0.019553268328309f, - 0.000367626344087f, -0.019170060753822f, 0.000353070063284f, - -0.018786842003465f, - 0.000338807702065f, -0.018403612077236f, 0.000324839289533f, - -0.018020370975137f, - 0.000311164796585f, -0.017637118697166f, 0.000297784281429f, - -0.017253857105970f, - 0.000284697714960f, -0.016870586201549f, 0.000271905126283f, - -0.016487304121256f, - 0.000259406515397f, -0.016104012727737f, 0.000247201882303f, - -0.015720712020993f, - 0.000235291256104f, -0.015337402001023f, 0.000223674607696f, - -0.014954082667828f, - 0.000212351980736f, -0.014570754021406f, 0.000201323360670f, - -0.014187417924404f, - 0.000190588747500f, -0.013804072514176f, 0.000180148170330f, - -0.013420719653368f, - 0.000170001629158f, -0.013037359341979f, 0.000160149123985f, - -0.012653990648687f, - 0.000150590654812f, -0.012270614504814f, 0.000141326236189f, - -0.011887230910361f, - 0.000132355868118f, -0.011503840796649f, 0.000123679565149f, - -0.011120444163680f, - 0.000115297327284f, -0.010737040080130f, 0.000107209154521f, - -0.010353630408645f, - 0.000099415054137f, -0.009970214217901f, 0.000091915040684f, - -0.009586792439222f, - 0.000084709099610f, -0.009203365072608f, 0.000077797252743f, - -0.008819932118058f, - 0.000071179500083f, -0.008436493575573f, 0.000064855834353f, - -0.008053051307797f, - 0.000058826273744f, -0.007669602986425f, 0.000053090810979f, - -0.007286150939763f, - 0.000047649456974f, -0.006902694236487f, 0.000042502211727f, - -0.006519233807921f, - 0.000037649078877f, -0.006135769188404f, 0.000033090062061f, - -0.005752300843596f, - 0.000028825161280f, -0.005368829704821f, 0.000024854381991f, - -0.004985354840755f, - 0.000021177724193f, -0.004601877182722f, 0.000017795191525f, - -0.004218397196382f, - 0.000014706784896f, -0.003834914416075f, 0.000011912506125f, - -0.003451429307461f, - 0.000009412358850f, -0.003067942336202f, 0.000007206342616f, - -0.002684453502297f, - 0.000005294459243f, -0.002300963038579f, 0.000003676709639f, - -0.001917471294291f, - 0.000002353095169f, -0.001533978385851f, 0.000001323616516f, - -0.001150484546088f, - 0.000000588274133f, -0.000766990066040f, 0.000000147068562f, - -0.000383495149435f, - 0.000000000000000f, -0.000000000000023f, 0.000000147068562f, - 0.000383495149435f, - 0.000000588274133f, 0.000766990066040f, 0.000001323616516f, - 0.001150484546088f, - 0.000002353095169f, 0.001533978385851f, 0.000003676709639f, - 0.001917471294291f, - 0.000005294459243f, 0.002300963038579f, 0.000007206342616f, - 0.002684453502297f, - 0.000009412358850f, 0.003067942336202f, 0.000011912506125f, - 0.003451429307461f, - 0.000014706784896f, 0.003834914416075f, 0.000017795191525f, - 0.004218397196382f, - 0.000021177724193f, 0.004601877182722f, 0.000024854381991f, - 0.004985354840755f, - 0.000028825161280f, 0.005368829704821f, 0.000033090062061f, - 0.005752300843596f, - 0.000037649078877f, 0.006135769188404f, 0.000042502211727f, - 0.006519233807921f, - 0.000047649456974f, 0.006902694236487f, 0.000053090810979f, - 0.007286150939763f, - 0.000058826273744f, 0.007669602986425f, 0.000064855834353f, - 0.008053051307797f, - 0.000071179500083f, 0.008436493575573f, 0.000077797252743f, - 0.008819932118058f, - 0.000084709099610f, 0.009203365072608f, 0.000091915040684f, - 0.009586792439222f, - 0.000099415054137f, 0.009970214217901f, 0.000107209154521f, - 0.010353630408645f, - 0.000115297327284f, 0.010737040080130f, 0.000123679565149f, - 0.011120444163680f, - 0.000132355868118f, 0.011503840796649f, 0.000141326236189f, - 0.011887230910361f, - 0.000150590654812f, 0.012270614504814f, 0.000160149123985f, - 0.012653990648687f, - 0.000170001629158f, 0.013037359341979f, 0.000180148170330f, - 0.013420719653368f, - 0.000190588747500f, 0.013804072514176f, 0.000201323360670f, - 0.014187417924404f, - 0.000212351980736f, 0.014570754021406f, 0.000223674607696f, - 0.014954082667828f, - 0.000235291256104f, 0.015337402001023f, 0.000247201882303f, - 0.015720712020993f, - 0.000259406515397f, 0.016104012727737f, 0.000271905126283f, - 0.016487304121256f, - 0.000284697714960f, 0.016870586201549f, 0.000297784281429f, - 0.017253857105970f, - 0.000311164796585f, 0.017637118697166f, 0.000324839289533f, - 0.018020370975137f, - 0.000338807702065f, 0.018403612077236f, 0.000353070063284f, - 0.018786842003465f, - 0.000367626344087f, 0.019170060753822f, 0.000382476573577f, - 0.019553268328309f, - 0.000397620693548f, 0.019936462864280f, 0.000413058703998f, - 0.020319648087025f, - 0.000428790634032f, 0.020702820271254f, 0.000444816454547f, - 0.021085981279612f, - 0.000461136136437f, 0.021469129249454f, 0.000477749679703f, - 0.021852264180779f, - 0.000494657084346f, 0.022235386073589f, 0.000511858321261f, - 0.022618494927883f, - 0.000529353390448f, 0.023001590743661f, 0.000547142291907f, - 0.023384673520923f, - 0.000565225025639f, 0.023767741397023f, 0.000583601591643f, - 0.024150796234608f, - 0.000602271873504f, 0.024533838033676f, 0.000621235987637f, - 0.024916863068938f, - 0.000640493875835f, 0.025299875065684f, 0.000660045538098f, - 0.025682870298624f, - 0.000679890916217f, 0.026065852493048f, 0.000700030010194f, - 0.026448817923665f, - 0.000720462878235f, 0.026831768453121f, 0.000741189462133f, - 0.027214704081416f, - 0.000762209703680f, 0.027597622945905f, 0.000783523661084f, - 0.027980525046587f, - 0.000805131276138f, 0.028363410383463f, 0.000827032607049f, - 0.028746278956532f, - 0.000849227537401f, 0.029129132628441f, 0.000871716125403f, - 0.029511967673898f, - 0.000894498312846f, 0.029894785955548f, 0.000917574157938f, - 0.030277585610747f, - 0.000940943544265f, 0.030660368502140f, 0.000964606530033f, - 0.031043132767081f, - 0.000988563057035f, 0.031425878405571f, 0.001012813183479f, - 0.031808607280254f, - 0.001037356909364f, 0.032191313803196f, 0.001062194118276f, - 0.032574005424976f, - 0.001087324810214f, 0.032956674695015f, 0.001112748985179f, - 0.033339329063892f, - 0.001138466643170f, 0.033721961081028f, 0.001164477784187f, - 0.034104570746422f, - 0.001190782408230f, 0.034487165510654f, 0.001217380515300f, - 0.034869734197855f, - 0.001244271872565f, 0.035252287983894f, 0.001271456829272f, - 0.035634815692902f, - 0.001298935036175f, 0.036017324775457f, 0.001326706726104f, - 0.036399815231562f, - 0.001354771666229f, 0.036782283335924f, 0.001383129972965f, - 0.037164725363255f, - 0.001411781646311f, 0.037547148764133f, 0.001440726569854f, - 0.037929553538561f, - 0.001469964860007f, 0.038311932235956f, 0.001499496400356f, - 0.038694288581610f, - 0.001529321074486f, 0.039076622575521f, 0.001559439115226f, - 0.039458930492401f, - 0.001589850406162f, 0.039841219782829f, 0.001620554830879f, - 0.040223482996225f, - 0.001651552389376f, 0.040605723857880f, 0.001682843198068f, - 0.040987938642502f, - 0.001714427140541f, 0.041370131075382f, 0.001746304216795f, - 0.041752301156521f, - 0.001778474310413f, 0.042134445160627f, 0.001810937537812f, - 0.042516563087702f, - 0.001843693898991f, 0.042898654937744f, 0.001876743277535f, - 0.043280724436045f, - 0.001910085673444f, 0.043662767857313f, 0.001943721086718f, - 0.044044785201550f, - 0.001977649517357f, 0.044426776468754f, 0.002011870965362f, - 0.044808741658926f, - 0.002046385314316f, 0.045190680772066f, 0.002081192564219f, - 0.045572593808174f, - 0.002116292715073f, 0.045954477041960f, 0.002151685766876f, - 0.046336337924004f, - 0.002187371719629f, 0.046718169003725f, 0.002223350573331f, - 0.047099970281124f, - 0.002259622327983f, 0.047481749206781f, 0.002296186750755f, - 0.047863494604826f, - 0.002333043841645f, 0.048245213925838f, 0.002370193833485f, - 0.048626907169819f, - 0.002407636726275f, 0.049008570611477f, 0.002445372054353f, - 0.049390204250813f, - 0.002483400283381f, 0.049771808087826f, 0.002521721180528f, - 0.050153385847807f, - 0.002560334512964f, 0.050534930080175f, 0.002599240746349f, - 0.050916448235512f, - 0.002638439415023f, 0.051297932863235f, 0.002677930751815f, - 0.051679391413927f, - 0.002717714523897f, 0.052060816437006f, 0.002757790964097f, - 0.052442211657763f, - 0.002798160072416f, 0.052823577076197f, 0.002838821383193f, - 0.053204908967018f, - 0.002879775362089f, 0.053586211055517f, 0.002921021543443f, - 0.053967483341694f, - 0.002962560392916f, 0.054348722100258f, 0.003004391444847f, - 0.054729927331209f, - 0.003046514932066f, 0.055111102759838f, 0.003088930854574f, - 0.055492244660854f, - 0.003131638979539f, 0.055873356759548f, 0.003174639539793f, - 0.056254431605339f, - 0.003217932302505f, 0.056635476648808f, 0.003261517267674f, - 0.057016488164663f, - 0.003305394435301f, 0.057397462427616f, 0.003349563805386f, - 0.057778406888247f, - 0.003394025377929f, 0.058159314095974f, 0.003438779152930f, - 0.058540191501379f, - 0.003483824897557f, 0.058921031653881f, 0.003529162844643f, - 0.059301838278770f, - 0.003574792761356f, 0.059682607650757f, 0.003620714880526f, - 0.060063343495131f, - 0.003666928736493f, 0.060444042086601f, 0.003713434794918f, - 0.060824707150459f, - 0.003760232590139f, 0.061205338686705f, 0.003807322587818f, - 0.061585929244757f, - 0.003854704322293f, 0.061966486275196f, 0.003902378026396f, - 0.062347009778023f, - 0.003950343467295f, 0.062727488577366f, 0.003998600877821f, - 0.063107937574387f, - 0.004047149792314f, 0.063488349318504f, 0.004095990676433f, - 0.063868723809719f, - 0.004145123064518f, 0.064249053597450f, 0.004194547422230f, - 0.064629353582859f, - 0.004244263283908f, 0.065009608864784f, 0.004294271115214f, - 0.065389834344387f, - 0.004344569984823f, 0.065770015120506f, 0.004395160824060f, - 0.066150158643723f, - 0.004446043167263f, 0.066530264914036f, 0.004497217014432f, - 0.066910326480865f, - 0.004548682365566f, 0.067290350794792f, 0.004600439220667f, - 0.067670337855816f, - 0.004652487114072f, 0.068050287663937f, 0.004704826977104f, - 0.068430192768574f, - 0.004757457878441f, 0.068810060620308f, 0.004810380283743f, - 0.069189883768559f, - 0.004863593727350f, 0.069569669663906f, 0.004917098674923f, - 0.069949418306351f, - 0.004970894660801f, 0.070329122245312f, 0.005024982150644f, - 0.070708781480789f, - 0.005079360678792f, 0.071088403463364f, 0.005134030245245f, - 0.071467980742455f, - 0.005188991315663f, 0.071847513318062f, 0.005244242958724f, - 0.072227008640766f, - 0.005299786105752f, 0.072606459259987f, 0.005355620291084f, - 0.072985872626305f, - 0.005411745049059f, 0.073365233838558f, 0.005468160845339f, - 0.073744557797909f, - 0.005524867679924f, 0.074123837053776f, 0.005581865552813f, - 0.074503071606159f, - 0.005639153998345f, 0.074882268905640f, 0.005696733482182f, - 0.075261414051056f, - 0.005754603538662f, 0.075640521943569f, 0.005812764633447f, - 0.076019577682018f, - 0.005871216300875f, 0.076398596167564f, 0.005929958540946f, - 0.076777562499046f, - 0.005988991353661f, 0.077156484127045f, 0.006048315204680f, - 0.077535368502140f, - 0.006107929162681f, 0.077914200723171f, 0.006167833693326f, - 0.078292988240719f, - 0.006228029262275f, 0.078671731054783f, 0.006288514938205f, - 0.079050421714783f, - 0.006349290721118f, 0.079429075121880f, 0.006410357542336f, - 0.079807676374912f, - 0.006471714470536f, 0.080186225473881f, 0.006533361505717f, - 0.080564737319946f, - 0.006595299113542f, 0.080943197011948f, 0.006657526828349f, - 0.081321612000465f, - 0.006720044650137f, 0.081699974834919f, 0.006782853044569f, - 0.082078292965889f, - 0.006845951545984f, 0.082456558942795f, 0.006909339688718f, - 0.082834780216217f, - 0.006973018404096f, 0.083212949335575f, 0.007036986760795f, - 0.083591073751450f, - 0.007101245224476f, 0.083969146013260f, 0.007165793795139f, - 0.084347173571587f, - 0.007230632472783f, 0.084725148975849f, 0.007295760791749f, - 0.085103072226048f, - 0.007361178752035f, 0.085480943322182f, 0.007426886819303f, - 0.085858769714832f, - 0.007492884527892f, 0.086236543953419f, 0.007559171877801f, - 0.086614266037941f, - 0.007625748869032f, 0.086991935968399f, 0.007692615967244f, - 0.087369553744793f, - 0.007759772241116f, 0.087747126817703f, 0.007827218621969f, - 0.088124647736549f, - 0.007894953712821f, 0.088502109050751f, 0.007962978444993f, - 0.088879525661469f, - 0.008031292818487f, 0.089256882667542f, 0.008099896833301f, - 0.089634194970131f, - 0.008168790489435f, 0.090011447668076f, 0.008237972855568f, - 0.090388655662537f, - 0.008307444863021f, 0.090765804052353f, 0.008377205580473f, - 0.091142900288105f, - 0.008447255939245f, 0.091519944369793f, 0.008517595939338f, - 0.091896936297417f, - 0.008588224649429f, 0.092273868620396f, 0.008659142069519f, - 0.092650748789310f, - 0.008730349130929f, 0.093027576804161f, 0.008801844902337f, - 0.093404345214367f, - 0.008873629383743f, 0.093781061470509f, 0.008945702575147f, - 0.094157725572586f, - 0.009018065407872f, 0.094534330070019f, 0.009090716950595f, - 0.094910882413387f, - 0.009163657203317f, 0.095287375152111f, 0.009236886166036f, - 0.095663815736771f, - 0.009310402907431f, 0.096040196716785f, 0.009384209290147f, - 0.096416525542736f, - 0.009458304382861f, 0.096792794764042f, 0.009532688185573f, - 0.097169004380703f, - 0.009607359766960f, 0.097545161843300f, 0.009682320058346f, - 0.097921259701252f, - 0.009757569059730f, 0.098297297954559f, 0.009833106771111f, - 0.098673284053802f, - 0.009908932261169f, 0.099049203097820f, 0.009985045529902f, - 0.099425069987774f, - 0.010061448439956f, 0.099800877273083f, 0.010138138197362f, - 0.100176624953747f, - 0.010215117596090f, 0.100552320480347f, 0.010292383842170f, - 0.100927948951721f, - 0.010369938798249f, 0.101303517818451f, 0.010447781533003f, - 0.101679034531116f, - 0.010525912046432f, 0.102054484188557f, 0.010604331269860f, - 0.102429874241352f, - 0.010683037340641f, 0.102805204689503f, 0.010762032121420f, - 0.103180475533009f, - 0.010841314680874f, 0.103555686771870f, 0.010920885019004f, - 0.103930838406086f, - 0.011000742204487f, 0.104305922985077f, 0.011080888099968f, - 0.104680955410004f, - 0.011161320842803f, 0.105055920779705f, 0.011242041364312f, - 0.105430819094181f, - 0.011323049664497f, 0.105805665254593f, 0.011404345743358f, - 0.106180444359779f, - 0.011485928669572f, 0.106555156409740f, 0.011567799374461f, - 0.106929816305637f, - 0.011649956926703f, 0.107304409146309f, 0.011732402257621f, - 0.107678934931755f, - 0.011815134435892f, 0.108053401112556f, 0.011898153461516f, - 0.108427800238132f, - 0.011981460265815f, 0.108802139759064f, 0.012065053917468f, - 0.109176412224770f, - 0.012148935347795f, 0.109550617635250f, 0.012233102694154f, - 0.109924763441086f, - 0.012317557819188f, 0.110298842191696f, 0.012402298860252f, - 0.110672861337662f, - 0.012487327679992f, 0.111046813428402f, 0.012572642415762f, - 0.111420698463917f, - 0.012658244930208f, 0.111794516444206f, 0.012744133360684f, - 0.112168267369270f, - 0.012830308638513f, 0.112541958689690f, 0.012916770763695f, - 0.112915575504303f, - 0.013003518804908f, 0.113289132714272f, 0.013090553693473f, - 0.113662622869015f, - 0.013177875429392f, 0.114036038517952f, 0.013265483081341f, - 0.114409394562244f, - 0.013353376649320f, 0.114782683551311f, 0.013441557064652f, - 0.115155905485153f, - 0.013530024327338f, 0.115529052913189f, 0.013618776574731f, - 0.115902140736580f, - 0.013707815669477f, 0.116275154054165f, 0.013797140680254f, - 0.116648100316525f, - 0.013886751607060f, 0.117020979523659f, 0.013976648449898f, - 0.117393791675568f, - 0.014066831208766f, 0.117766529321671f, 0.014157299883664f, - 0.118139199912548f, - 0.014248054474592f, 0.118511803448200f, 0.014339094981551f, - 0.118884332478046f, - 0.014430420473218f, 0.119256794452667f, 0.014522032812238f, - 0.119629189372063f, - 0.014613929204643f, 0.120001509785652f, 0.014706112444401f, - 0.120373763144016f, - 0.014798580668867f, 0.120745941996574f, 0.014891333878040f, - 0.121118053793907f, - 0.014984373003244f, 0.121490091085434f, 0.015077698044479f, - 0.121862053871155f, - 0.015171307139099f, 0.122233949601650f, 0.015265202149749f, - 0.122605770826340f, - 0.015359382145107f, 0.122977524995804f, 0.015453847125173f, - 0.123349204659462f, - 0.015548598021269f, 0.123720809817314f, 0.015643632039428f, - 0.124092340469360f, - 0.015738952904940f, 0.124463804066181f, 0.015834558755159f, - 0.124835193157196f, - 0.015930447727442f, 0.125206500291824f, 0.016026621684432f, - 0.125577747821808f, - 0.016123080626130f, 0.125948905944824f, 0.016219824552536f, - 0.126320004463196f, - 0.016316853463650f, 0.126691013574600f, 0.016414167359471f, - 0.127061963081360f, - 0.016511764377356f, 0.127432823181152f, 0.016609646379948f, - 0.127803623676300f, - 0.016707813367248f, 0.128174334764481f, 0.016806263476610f, - 0.128544986248016f, - 0.016904998570681f, 0.128915548324585f, 0.017004016786814f, - 0.129286035895348f, - 0.017103319987655f, 0.129656463861465f, 0.017202908173203f, - 0.130026802420616f, - 0.017302779480815f, 0.130397051572800f, 0.017402933910489f, - 0.130767241120338f, - 0.017503373324871f, 0.131137356162071f, 0.017604095861316f, - 0.131507381796837f, - 0.017705103382468f, 0.131877332925797f, 0.017806394025683f, - 0.132247209548950f, - 0.017907967790961f, 0.132617011666298f, 0.018009826540947f, - 0.132986739277840f, - 0.018111966550350f, 0.133356377482414f, 0.018214391544461f, - 0.133725941181183f, - 0.018317099660635f, 0.134095430374146f, 0.018420090898871f, - 0.134464830160141f, - 0.018523367121816f, 0.134834155440331f, 0.018626924604177f, - 0.135203406214714f, - 0.018730765208602f, 0.135572582483292f, 0.018834890797734f, - 0.135941669344902f, - 0.018939297646284f, 0.136310681700706f, 0.019043987616897f, - 0.136679604649544f, - 0.019148962572217f, 0.137048453092575f, 0.019254218786955f, - 0.137417227029800f, - 0.019359756261110f, 0.137785911560059f, 0.019465578719974f, - 0.138154521584511f, - 0.019571684300900f, 0.138523042201996f, 0.019678071141243f, - 0.138891488313675f, - 0.019784741103649f, 0.139259845018387f, 0.019891692325473f, - 0.139628127217293f, - 0.019998926669359f, 0.139996320009232f, 0.020106444135308f, - 0.140364438295364f, - 0.020214242860675f, 0.140732467174530f, 0.020322324708104f, - 0.141100421547890f, - 0.020430689677596f, 0.141468286514282f, 0.020539334043860f, - 0.141836062073708f, - 0.020648263394833f, 0.142203763127327f, 0.020757472142577f, - 0.142571389675140f, - 0.020866964012384f, 0.142938911914825f, 0.020976737141609f, - 0.143306359648705f, - 0.021086793392897f, 0.143673732876778f, 0.021197130903602f, - 0.144041016697884f, - 0.021307749673724f, 0.144408211112022f, 0.021418649703264f, - 0.144775316119194f, - 0.021529832854867f, 0.145142331719399f, 0.021641295403242f, - 0.145509272813797f, - 0.021753041073680f, 0.145876124501228f, 0.021865066140890f, - 0.146242901682854f, - 0.021977374330163f, 0.146609574556351f, 0.022089963778853f, - 0.146976172924042f, - 0.022202832624316f, 0.147342681884766f, 0.022315984591842f, - 0.147709101438522f, - 0.022429415956140f, 0.148075446486473f, 0.022543128579855f, - 0.148441687226295f, - 0.022657122462988f, 0.148807853460312f, 0.022771397605538f, - 0.149173930287361f, - 0.022885952144861f, 0.149539917707443f, 0.023000787943602f, - 0.149905815720558f, - 0.023115905001760f, 0.150271624326706f, 0.023231301456690f, - 0.150637343525887f, - 0.023346979171038f, 0.151002973318100f, 0.023462938144803f, - 0.151368513703346f, - 0.023579176515341f, 0.151733979582787f, 0.023695694282651f, - 0.152099341154099f, - 0.023812493309379f, 0.152464613318443f, 0.023929571732879f, - 0.152829796075821f, - 0.024046931415796f, 0.153194904327393f, 0.024164570495486f, - 0.153559908270836f, - 0.024282488971949f, 0.153924822807312f, 0.024400688707829f, - 0.154289647936821f, - 0.024519165977836f, 0.154654383659363f, 0.024637924507260f, - 0.155019029974937f, - 0.024756962433457f, 0.155383571982384f, 0.024876279756427f, - 0.155748039484024f, - 0.024995878338814f, 0.156112402677536f, 0.025115754455328f, - 0.156476691365242f, - 0.025235909968615f, 0.156840875744820f, 0.025356344878674f, - 0.157204970717430f, - 0.025477059185505f, 0.157568961381912f, 0.025598052889109f, - 0.157932877540588f, - 0.025719324126840f, 0.158296689391136f, 0.025840876623988f, - 0.158660411834717f, - 0.025962706655264f, 0.159024044871330f, 0.026084816083312f, - 0.159387573599815f, - 0.026207204908133f, 0.159751012921333f, 0.026329871267080f, - 0.160114362835884f, - 0.026452817022800f, 0.160477623343468f, 0.026576040312648f, - 0.160840779542923f, - 0.026699542999268f, 0.161203846335411f, 0.026823325082660f, - 0.161566808819771f, - 0.026947384700179f, 0.161929681897163f, 0.027071721851826f, - 0.162292465567589f, - 0.027196336537600f, 0.162655144929886f, 0.027321230620146f, - 0.163017734885216f, - 0.027446404099464f, 0.163380220532417f, 0.027571853250265f, - 0.163742616772652f, - 0.027697581797838f, 0.164104923605919f, 0.027823587879539f, - 0.164467126131058f, - 0.027949871495366f, 0.164829224348068f, 0.028076432645321f, - 0.165191248059273f, - 0.028203271329403f, 0.165553152561188f, 0.028330387547612f, - 0.165914967656136f, - 0.028457781299949f, 0.166276678442955f, 0.028585452586412f, - 0.166638299822807f, - 0.028713401407003f, 0.166999831795692f, 0.028841627761722f, - 0.167361244559288f, - 0.028970129787922f, 0.167722567915916f, 0.029098909348249f, - 0.168083801865578f, - 0.029227968305349f, 0.168444931507111f, 0.029357301071286f, - 0.168805956840515f, - 0.029486913233995f, 0.169166877865791f, 0.029616801068187f, - 0.169527709484100f, - 0.029746964573860f, 0.169888436794281f, 0.029877405613661f, - 0.170249074697495f, - 0.030008124187589f, 0.170609608292580f, 0.030139118432999f, - 0.170970037579536f, - 0.030270388349891f, 0.171330362558365f, 0.030401935800910f, - 0.171690583229065f, - 0.030533758923411f, 0.172050714492798f, 0.030665857717395f, - 0.172410741448402f, - 0.030798232182860f, 0.172770664095879f, 0.030930884182453f, - 0.173130482435226f, - 0.031063811853528f, 0.173490211367607f, 0.031197015196085f, - 0.173849821090698f, - 0.031330492347479f, 0.174209341406822f, 0.031464248895645f, - 0.174568757414818f, - 0.031598277390003f, 0.174928069114685f, 0.031732585281134f, - 0.175287276506424f, - 0.031867165118456f, 0.175646379590034f, 0.032002024352551f, - 0.176005378365517f, - 0.032137155532837f, 0.176364272832870f, 0.032272562384605f, - 0.176723077893257f, - 0.032408244907856f, 0.177081763744354f, 0.032544203102589f, - 0.177440345287323f, - 0.032680433243513f, 0.177798837423325f, 0.032816942781210f, - 0.178157210350037f, - 0.032953724265099f, 0.178515478968620f, 0.033090781420469f, - 0.178873643279076f, - 0.033228114247322f, 0.179231703281403f, 0.033365719020367f, - 0.179589673876762f, - 0.033503599464893f, 0.179947525262833f, 0.033641755580902f, - 0.180305257439613f, - 0.033780183643103f, 0.180662900209427f, 0.033918887376785f, - 0.181020438671112f, - 0.034057866781950f, 0.181377857923508f, 0.034197118133307f, - 0.181735187768936f, - 0.034336645156145f, 0.182092398405075f, 0.034476444125175f, - 0.182449504733086f, - 0.034616518765688f, 0.182806491851807f, 0.034756865352392f, - 0.183163389563560f, - 0.034897487610579f, 0.183520168066025f, 0.035038381814957f, - 0.183876842260361f, - 0.035179551690817f, 0.184233412146568f, 0.035320993512869f, - 0.184589877724648f, - 0.035462711006403f, 0.184946224093437f, 0.035604696720839f, - 0.185302466154099f, - 0.035746958106756f, 0.185658603906631f, 0.035889495164156f, - 0.186014622449875f, - 0.036032304167747f, 0.186370536684990f, 0.036175385117531f, - 0.186726331710815f, - 0.036318738013506f, 0.187082037329674f, 0.036462362855673f, - 0.187437608838081f, - 0.036606263369322f, 0.187793090939522f, 0.036750435829163f, - 0.188148453831673f, - 0.036894880235195f, 0.188503712415695f, 0.037039596587420f, - 0.188858851790428f, - 0.037184584885836f, 0.189213871955872f, 0.037329845130444f, - 0.189568802714348f, - 0.037475381046534f, 0.189923599362373f, 0.037621185183525f, - 0.190278306603432f, - 0.037767261266708f, 0.190632879734039f, 0.037913613021374f, - 0.190987363457680f, - 0.038060232996941f, 0.191341713070869f, 0.038207128643990f, - 0.191695958375931f, - 0.038354292511940f, 0.192050099372864f, 0.038501728326082f, - 0.192404121160507f, - 0.038649436086416f, 0.192758023738861f, 0.038797415792942f, - 0.193111822009087f, - 0.038945667445660f, 0.193465501070023f, 0.039094187319279f, - 0.193819075822830f, - 0.039242979139090f, 0.194172516465187f, 0.039392042905092f, - 0.194525867700577f, - 0.039541378617287f, 0.194879084825516f, 0.039690986275673f, - 0.195232197642326f, - 0.039840862154961f, 0.195585191249847f, 0.039991009980440f, - 0.195938065648079f, - 0.040141426026821f, 0.196290835738182f, 0.040292114019394f, - 0.196643486618996f, - 0.040443073958158f, 0.196996018290520f, 0.040594302117825f, - 0.197348430752754f, - 0.040745802223682f, 0.197700738906860f, 0.040897574275732f, - 0.198052927851677f, - 0.041049610823393f, 0.198404997587204f, 0.041201923042536f, - 0.198756948113441f, - 0.041354499757290f, 0.199108779430389f, 0.041507352143526f, - 0.199460506439209f, - 0.041660469025373f, 0.199812099337578f, 0.041813857853413f, - 0.200163587927818f, - 0.041967518627644f, 0.200514942407608f, 0.042121443897486f, - 0.200866192579269f, - 0.042275641113520f, 0.201217323541641f, 0.042430106550455f, - 0.201568335294724f, - 0.042584843933582f, 0.201919227838516f, 0.042739849537611f, - 0.202270001173019f, - 0.042895123362541f, 0.202620655298233f, 0.043050665408373f, - 0.202971190214157f, - 0.043206475675106f, 0.203321605920792f, 0.043362557888031f, - 0.203671902418137f, - 0.043518904596567f, 0.204022079706192f, 0.043675523251295f, - 0.204372137784958f, - 0.043832406401634f, 0.204722076654434f, 0.043989561498165f, - 0.205071896314621f, - 0.044146984815598f, 0.205421581864357f, 0.044304672628641f, - 0.205771163105965f, - 0.044462632387877f, 0.206120610237122f, 0.044620860368013f, - 0.206469938158989f, - 0.044779352843761f, 0.206819161772728f, 0.044938117265701f, - 0.207168251276016f, - 0.045097146183252f, 0.207517206668854f, 0.045256443321705f, - 0.207866057753563f, - 0.045416008681059f, 0.208214774727821f, 0.045575842261314f, - 0.208563387393951f, - 0.045735940337181f, 0.208911851048470f, 0.045896306633949f, - 0.209260210394859f, - 0.046056941151619f, 0.209608450531960f, 0.046217843890190f, - 0.209956556558609f, - 0.046379011124372f, 0.210304543375969f, 0.046540446579456f, - 0.210652396082878f, - 0.046702146530151f, 0.211000129580498f, 0.046864114701748f, - 0.211347743868828f, - 0.047026351094246f, 0.211695238947868f, 0.047188851982355f, - 0.212042599916458f, - 0.047351621091366f, 0.212389841675758f, 0.047514654695988f, - 0.212736949324608f, - 0.047677956521511f, 0.213083937764168f, 0.047841522842646f, - 0.213430806994438f, - 0.048005353659391f, 0.213777542114258f, 0.048169452697039f, - 0.214124158024788f, - 0.048333816230297f, 0.214470639824867f, 0.048498444259167f, - 0.214817002415657f, - 0.048663340508938f, 0.215163245797157f, 0.048828501254320f, - 0.215509355068207f, - 0.048993926495314f, 0.215855330228806f, 0.049159619957209f, - 0.216201186180115f, - 0.049325577914715f, 0.216546908020973f, 0.049491796642542f, - 0.216892510652542f, - 0.049658283591270f, 0.217237979173660f, 0.049825038760900f, - 0.217583328485489f, - 0.049992054700851f, 0.217928543686867f, 0.050159335136414f, - 0.218273624777794f, - 0.050326880067587f, 0.218618586659431f, 0.050494693219662f, - 0.218963414430618f, - 0.050662767142057f, 0.219308122992516f, 0.050831105560064f, - 0.219652697443962f, - 0.050999708473682f, 0.219997137784958f, 0.051168579608202f, - 0.220341444015503f, - 0.051337707787752f, 0.220685631036758f, 0.051507104188204f, - 0.221029683947563f, - 0.051676765084267f, 0.221373617649078f, 0.051846686750650f, - 0.221717402338982f, - 0.052016876637936f, 0.222061067819595f, 0.052187327295542f, - 0.222404599189758f, - 0.052358038723469f, 0.222748011350632f, 0.052529018372297f, - 0.223091274499893f, - 0.052700258791447f, 0.223434418439865f, 0.052871759980917f, - 0.223777428269386f, - 0.053043525665998f, 0.224120303988457f, 0.053215555846691f, - 0.224463045597076f, - 0.053387850522995f, 0.224805667996407f, 0.053560405969620f, - 0.225148141384125f, - 0.053733222186565f, 0.225490495562553f, 0.053906302899122f, - 0.225832715630531f, - 0.054079644382000f, 0.226174786686897f, 0.054253250360489f, - 0.226516738533974f, - 0.054427117109299f, 0.226858556270599f, 0.054601248353720f, - 0.227200239896774f, - 0.054775636643171f, 0.227541789412498f, 0.054950293153524f, - 0.227883204817772f, - 0.055125206708908f, 0.228224486112595f, 0.055300384759903f, - 0.228565633296967f, - 0.055475823581219f, 0.228906646370888f, 0.055651523172855f, - 0.229247525334358f, - 0.055827483534813f, 0.229588270187378f, 0.056003704667091f, - 0.229928880929947f, - 0.056180190294981f, 0.230269357562065f, 0.056356932967901f, - 0.230609700083733f, - 0.056533940136433f, 0.230949893593788f, 0.056711208075285f, - 0.231289967894554f, - 0.056888736784458f, 0.231629893183708f, 0.057066522538662f, - 0.231969684362412f, - 0.057244572788477f, 0.232309341430664f, 0.057422880083323f, - 0.232648864388466f, - 0.057601451873779f, 0.232988253235817f, 0.057780280709267f, - 0.233327493071556f, - 0.057959370315075f, 0.233666598796844f, 0.058138720691204f, - 0.234005570411682f, - 0.058318331837654f, 0.234344407916069f, 0.058498200029135f, - 0.234683111310005f, - 0.058678328990936f, 0.235021665692329f, 0.058858718723059f, - 0.235360085964203f, - 0.059039369225502f, 0.235698372125626f, 0.059220276772976f, - 0.236036509275436f, - 0.059401445090771f, 0.236374512314796f, 0.059582870453596f, - 0.236712381243706f, - 0.059764556586742f, 0.237050101161003f, 0.059946499764919f, - 0.237387686967850f, - 0.060128703713417f, 0.237725138664246f, 0.060311164706945f, - 0.238062441349030f, - 0.060493886470795f, 0.238399609923363f, 0.060676865279675f, - 0.238736644387245f, - 0.060860104858875f, 0.239073529839516f, 0.061043601483107f, - 0.239410281181335f, - 0.061227355152369f, 0.239746883511543f, 0.061411365866661f, - 0.240083336830139f, - 0.061595637351274f, 0.240419670939446f, 0.061780165880919f, - 0.240755841135979f, - 0.061964951455593f, 0.241091892123222f, 0.062149997800589f, - 0.241427779197693f, - 0.062335297465324f, 0.241763532161713f, 0.062520854175091f, - 0.242099151015282f, - 0.062706671655178f, 0.242434620857239f, 0.062892749905586f, - 0.242769956588745f, - 0.063079081475735f, 0.243105143308640f, 0.063265666365623f, - 0.243440181016922f, - 0.063452512025833f, 0.243775084614754f, 0.063639611005783f, - 0.244109839200974f, - 0.063826970756054f, 0.244444444775581f, 0.064014583826065f, - 0.244778916239738f, - 0.064202457666397f, 0.245113238692284f, 0.064390584826469f, - 0.245447427034378f, - 0.064578965306282f, 0.245781451463699f, 0.064767606556416f, - 0.246115356683731f, - 0.064956501126289f, 0.246449097990990f, 0.065145656466484f, - 0.246782705187798f, - 0.065335065126419f, 0.247116148471832f, 0.065524727106094f, - 0.247449472546577f, - 0.065714649856091f, 0.247782632708550f, 0.065904818475246f, - 0.248115643858910f, - 0.066095255315304f, 0.248448520898819f, 0.066285938024521f, - 0.248781248927116f, - 0.066476874053478f, 0.249113827943802f, 0.066668070852757f, - 0.249446272850037f, - 0.066859520971775f, 0.249778553843498f, 0.067051224410534f, - 0.250110685825348f, - 0.067243188619614f, 0.250442683696747f, 0.067435398697853f, - 0.250774532556534f, - 0.067627869546413f, 0.251106232404709f, 0.067820593714714f, - 0.251437783241272f, - 0.068013571202755f, 0.251769185066223f, 0.068206802010536f, - 0.252100437879562f, - 0.068400286138058f, 0.252431541681290f, 0.068594031035900f, - 0.252762526273727f, - 0.068788021802902f, 0.253093332052231f, 0.068982265889645f, - 0.253423988819122f, - 0.069176770746708f, 0.253754496574402f, 0.069371521472931f, - 0.254084855318069f, - 0.069566532969475f, 0.254415065050125f, 0.069761790335178f, - 0.254745125770569f, - 0.069957308471203f, 0.255075037479401f, 0.070153072476387f, - 0.255404800176620f, - 0.070349089801311f, 0.255734413862228f, 0.070545360445976f, - 0.256063878536224f, - 0.070741884410381f, 0.256393194198608f, 0.070938661694527f, - 0.256722360849380f, - 0.071135692298412f, 0.257051378488541f, 0.071332976222038f, - 0.257380217313766f, - 0.071530513465405f, 0.257708936929703f, 0.071728296577930f, - 0.258037507534027f, - 0.071926333010197f, 0.258365899324417f, 0.072124622762203f, - 0.258694142103195f, - 0.072323165833950f, 0.259022265672684f, 0.072521962225437f, - 0.259350210428238f, - 0.072721004486084f, 0.259678006172180f, 0.072920300066471f, - 0.260005623102188f, - 0.073119848966599f, 0.260333120822906f, 0.073319651186466f, - 0.260660469532013f, - 0.073519699275494f, 0.260987639427185f, 0.073720000684261f, - 0.261314690113068f, - 0.073920547962189f, 0.261641561985016f, 0.074121348559856f, - 0.261968284845352f, - 0.074322402477264f, 0.262294828891754f, 0.074523709714413f, - 0.262621253728867f, - 0.074725262820721f, 0.262947499752045f, 0.074927061796188f, - 0.263273626565933f, - 0.075129114091396f, 0.263599574565887f, 0.075331419706345f, - 0.263925373554230f, - 0.075533971190453f, 0.264250993728638f, 0.075736775994301f, - 0.264576494693756f, - 0.075939826667309f, 0.264901816844940f, 0.076143130660057f, - 0.265226989984512f, - 0.076346680521965f, 0.265552014112473f, 0.076550483703613f, - 0.265876859426498f, - 0.076754532754421f, 0.266201555728912f, 0.076958827674389f, - 0.266526103019714f, - 0.077163375914097f, 0.266850501298904f, 0.077368170022964f, - 0.267174720764160f, - 0.077573217451572f, 0.267498821020126f, 0.077778510749340f, - 0.267822742462158f, - 0.077984049916267f, 0.268146485090256f, 0.078189842402935f, - 0.268470078706741f, - 0.078395880758762f, 0.268793523311615f, 0.078602164983749f, - 0.269116818904877f, - 0.078808702528477f, 0.269439965486526f, 0.079015478491783f, - 0.269762933254242f, - 0.079222507774830f, 0.270085722208023f, 0.079429790377617f, - 0.270408391952515f, - 0.079637311398983f, 0.270730882883072f, 0.079845085740089f, - 0.271053224802017f, - 0.080053105950356f, 0.271375387907028f, 0.080261372029781f, - 0.271697402000427f, - 0.080469883978367f, 0.272019267082214f, 0.080678641796112f, - 0.272340953350067f, - 0.080887645483017f, 0.272662490606308f, 0.081096902489662f, - 0.272983878850937f, - 0.081306397914886f, 0.273305088281631f, 0.081516146659851f, - 0.273626148700714f, - 0.081726133823395f, 0.273947030305862f, 0.081936374306679f, - 0.274267762899399f, - 0.082146860659122f, 0.274588316679001f, 0.082357585430145f, - 0.274908751249313f, - 0.082568563520908f, 0.275228977203369f, 0.082779780030251f, - 0.275549083948135f, - 0.082991249859333f, 0.275868982076645f, 0.083202958106995f, - 0.276188760995865f, - 0.083414919674397f, 0.276508361101151f, 0.083627119660378f, - 0.276827782392502f, - 0.083839565515518f, 0.277147054672241f, 0.084052257239819f, - 0.277466177940369f, - 0.084265194833279f, 0.277785122394562f, 0.084478378295898f, - 0.278103888034821f, - 0.084691800177097f, 0.278422504663467f, 0.084905467927456f, - 0.278740972280502f, - 0.085119381546974f, 0.279059261083603f, 0.085333541035652f, - 0.279377400875092f, - 0.085547938942909f, 0.279695361852646f, 0.085762590169907f, - 0.280013144016266f, - 0.085977479815483f, 0.280330777168274f, 0.086192607879639f, - 0.280648261308670f, - 0.086407989263535f, 0.280965566635132f, 0.086623609066010f, - 0.281282693147659f, - 0.086839467287064f, 0.281599670648575f, 0.087055571377277f, - 0.281916469335556f, - 0.087271921336651f, 0.282233119010925f, 0.087488517165184f, - 0.282549589872360f, - 0.087705351412296f, 0.282865911722183f, 0.087922424077988f, - 0.283182054758072f, - 0.088139742612839f, 0.283498018980026f, 0.088357307016850f, - 0.283813834190369f, - 0.088575109839439f, 0.284129470586777f, 0.088793158531189f, - 0.284444957971573f, - 0.089011445641518f, 0.284760266542435f, 0.089229971170425f, - 0.285075396299362f, - 0.089448742568493f, 0.285390377044678f, 0.089667752385139f, - 0.285705178976059f, - 0.089887008070946f, 0.286019802093506f, 0.090106502175331f, - 0.286334276199341f, - 0.090326242148876f, 0.286648571491241f, 0.090546220541000f, - 0.286962717771530f, - 0.090766437351704f, 0.287276685237885f, 0.090986892580986f, - 0.287590473890305f, - 0.091207593679428f, 0.287904083728790f, 0.091428533196449f, - 0.288217544555664f, - 0.091649711132050f, 0.288530826568604f, 0.091871134936810f, - 0.288843959569931f, - 0.092092797160149f, 0.289156883955002f, 0.092314697802067f, - 0.289469659328461f, - 0.092536836862564f, 0.289782285690308f, 0.092759214341640f, - 0.290094703435898f, - 0.092981837689877f, 0.290406972169876f, 0.093204692006111f, - 0.290719062089920f, - 0.093427792191505f, 0.291031002998352f, 0.093651130795479f, - 0.291342735290527f, - 0.093874707818031f, 0.291654318571091f, 0.094098523259163f, - 0.291965723037720f, - 0.094322577118874f, 0.292276978492737f, 0.094546869397163f, - 0.292588025331497f, - 0.094771400094032f, 0.292898923158646f, 0.094996169209480f, - 0.293209642171860f, - 0.095221176743507f, 0.293520182371140f, 0.095446422696114f, - 0.293830573558807f, - 0.095671907067299f, 0.294140785932541f, 0.095897629857063f, - 0.294450789690018f, - 0.096123591065407f, 0.294760644435883f, 0.096349790692329f, - 0.295070350170136f, - 0.096576221287251f, 0.295379847288132f, 0.096802897751331f, - 0.295689195394516f, - 0.097029805183411f, 0.295998334884644f, 0.097256951034069f, - 0.296307325363159f, - 0.097484335303307f, 0.296616137027740f, 0.097711957991123f, - 0.296924799680710f, - 0.097939811646938f, 0.297233253717422f, 0.098167903721333f, - 0.297541528940201f, - 0.098396234214306f, 0.297849655151367f, 0.098624803125858f, - 0.298157602548599f, - 0.098853603005409f, 0.298465341329575f, 0.099082641303539f, - 0.298772931098938f, - 0.099311910569668f, 0.299080342054367f, 0.099541425704956f, - 0.299387603998184f, - 0.099771171808243f, 0.299694657325745f, 0.100001148879528f, - 0.300001531839371f, - 0.100231364369392f, 0.300308227539063f, 0.100461818277836f, - 0.300614774227142f, - 0.100692503154278f, 0.300921112298965f, 0.100923426449299f, - 0.301227301359177f, - 0.101154580712318f, 0.301533311605453f, 0.101385973393917f, - 0.301839113235474f, - 0.101617597043514f, 0.302144765853882f, 0.101849451661110f, - 0.302450239658356f, - 0.102081544697285f, 0.302755534648895f, 0.102313876152039f, - 0.303060621023178f, - 0.102546438574791f, 0.303365558385849f, 0.102779231965542f, - 0.303670316934586f, - 0.103012263774872f, 0.303974896669388f, 0.103245526552200f, - 0.304279297590256f, - 0.103479020297527f, 0.304583519697189f, 0.103712752461433f, - 0.304887533187866f, - 0.103946708142757f, 0.305191397666931f, 0.104180909693241f, - 0.305495083332062f, - 0.104415334761143f, 0.305798590183258f, 0.104649998247623f, - 0.306101888418198f, - 0.104884892702103f, 0.306405037641525f, 0.105120018124580f, - 0.306708008050919f, - 0.105355374515057f, 0.307010769844055f, 0.105590961873531f, - 0.307313382625580f, - 0.105826787650585f, 0.307615786790848f, 0.106062836945057f, - 0.307918041944504f, - 0.106299124658108f, 0.308220088481903f, 0.106535643339157f, - 0.308521956205368f, - 0.106772392988205f, 0.308823645114899f, 0.107009373605251f, - 0.309125155210495f, - 0.107246585190296f, 0.309426486492157f, 0.107484027743340f, - 0.309727638959885f, - 0.107721701264381f, 0.310028612613678f, 0.107959605753422f, - 0.310329377651215f, - 0.108197741210461f, 0.310629993677139f, 0.108436107635498f, - 0.310930401086807f, - 0.108674705028534f, 0.311230629682541f, 0.108913525938988f, - 0.311530679464340f, - 0.109152585268021f, 0.311830550432205f, 0.109391868114471f, - 0.312130242586136f, - 0.109631389379501f, 0.312429755926132f, 0.109871134161949f, - 0.312729060649872f, - 0.110111102461815f, 0.313028186559677f, 0.110351309180260f, - 0.313327133655548f, - 0.110591746866703f, 0.313625901937485f, 0.110832408070564f, - 0.313924491405487f, - 0.111073300242424f, 0.314222872257233f, 0.111314415931702f, - 0.314521104097366f, - 0.111555770039558f, 0.314819127321243f, 0.111797347664833f, - 0.315116971731186f, - 0.112039148807526f, 0.315414607524872f, 0.112281180918217f, - 0.315712094306946f, - 0.112523443996906f, 0.316009372472763f, 0.112765938043594f, - 0.316306471824646f, - 0.113008655607700f, 0.316603392362595f, 0.113251596689224f, - 0.316900104284287f, - 0.113494776189327f, 0.317196637392044f, 0.113738171756268f, - 0.317492991685867f, - 0.113981798291206f, 0.317789167165756f, 0.114225655794144f, - 0.318085134029388f, - 0.114469736814499f, 0.318380922079086f, 0.114714048802853f, - 0.318676531314850f, - 0.114958584308624f, 0.318971961736679f, 0.115203343331814f, - 0.319267183542252f, - 0.115448333323002f, 0.319562226533890f, 0.115693546831608f, - 0.319857090711594f, - 0.115938983857632f, 0.320151746273041f, 0.116184651851654f, - 0.320446223020554f, - 0.116430543363094f, 0.320740520954132f, 0.116676658391953f, - 0.321034610271454f, - 0.116923004388809f, 0.321328520774841f, 0.117169573903084f, - 0.321622252464294f, - 0.117416366934776f, 0.321915775537491f, 0.117663383483887f, - 0.322209119796753f, - 0.117910631000996f, 0.322502255439758f, 0.118158094584942f, - 0.322795242071152f, - 0.118405789136887f, 0.323088020086288f, 0.118653707206249f, - 0.323380589485168f, - 0.118901848793030f, 0.323672980070114f, 0.119150213897228f, - 0.323965191841125f, - 0.119398809969425f, 0.324257194995880f, 0.119647622108459f, - 0.324549019336700f, - 0.119896657764912f, 0.324840664863586f, 0.120145916938782f, - 0.325132101774216f, - 0.120395407080650f, 0.325423330068588f, 0.120645113289356f, - 0.325714409351349f, - 0.120895043015480f, 0.326005280017853f, 0.121145196259022f, - 0.326295942068100f, - 0.121395580470562f, 0.326586425304413f, 0.121646173298359f, - 0.326876699924469f, - 0.121896997094154f, 0.327166795730591f, 0.122148044407368f, - 0.327456712722778f, - 0.122399315237999f, 0.327746421098709f, 0.122650802135468f, - 0.328035950660706f, - 0.122902512550354f, 0.328325271606445f, 0.123154446482658f, - 0.328614413738251f, - 0.123406603932381f, 0.328903347253799f, 0.123658977448940f, - 0.329192101955414f, - 0.123911574482918f, 0.329480648040771f, 0.124164395034313f, - 0.329769015312195f, - 0.124417431652546f, 0.330057173967361f, 0.124670691788197f, - 0.330345153808594f, - 0.124924175441265f, 0.330632925033569f, 0.125177875161171f, - 0.330920487642288f, - 0.125431805849075f, 0.331207901239395f, 0.125685945153236f, - 0.331495076417923f, - 0.125940307974815f, 0.331782072782516f, 0.126194894313812f, - 0.332068890333176f, - 0.126449704170227f, 0.332355499267578f, 0.126704722642899f, - 0.332641899585724f, - 0.126959964632988f, 0.332928121089935f, 0.127215430140495f, - 0.333214133977890f, - 0.127471104264259f, 0.333499968051910f, 0.127727001905441f, - 0.333785593509674f, - 0.127983123064041f, 0.334071010351181f, 0.128239467740059f, - 0.334356248378754f, - 0.128496021032333f, 0.334641307592392f, 0.128752797842026f, - 0.334926128387451f, - 0.129009798169136f, 0.335210770368576f, 0.129267007112503f, - 0.335495233535767f, - 0.129524439573288f, 0.335779488086700f, 0.129782080650330f, - 0.336063534021378f, - 0.130039945244789f, 0.336347371339798f, 0.130298033356667f, - 0.336631029844284f, - 0.130556344985962f, 0.336914509534836f, 0.130814850330353f, - 0.337197750806808f, - 0.131073594093323f, 0.337480813264847f, 0.131332546472549f, - 0.337763696908951f, - 0.131591722369194f, 0.338046342134476f, 0.131851106882095f, - 0.338328808546066f, - 0.132110700011253f, 0.338611096143723f, 0.132370531558990f, - 0.338893145322800f, - 0.132630556821823f, 0.339175015687943f, 0.132890805602074f, - 0.339456677436829f, - 0.133151277899742f, 0.339738160371780f, 0.133411958813667f, - 0.340019434690475f, - 0.133672863245010f, 0.340300500392914f, 0.133933976292610f, - 0.340581357479095f, - 0.134195312857628f, 0.340862035751343f, 0.134456858038902f, - 0.341142505407333f, - 0.134718611836433f, 0.341422766447067f, 0.134980589151382f, - 0.341702848672867f, - 0.135242775082588f, 0.341982692480087f, 0.135505184531212f, - 0.342262357473373f, - 0.135767802596092f, 0.342541843652725f, 0.136030644178391f, - 0.342821091413498f, - 0.136293679475784f, 0.343100160360336f, 0.136556953191757f, - 0.343379020690918f, - 0.136820420622826f, 0.343657672405243f, 0.137084111571312f, - 0.343936115503311f, - 0.137348011136055f, 0.344214379787445f, 0.137612134218216f, - 0.344492435455322f, - 0.137876465916634f, 0.344770282506943f, 0.138141006231308f, - 0.345047920942307f, - 0.138405755162239f, 0.345325350761414f, 0.138670727610588f, - 0.345602601766586f, - 0.138935908675194f, 0.345879614353180f, 0.139201298356056f, - 0.346156448125839f, - 0.139466896653175f, 0.346433073282242f, 0.139732718467712f, - 0.346709519624710f, - 0.139998748898506f, 0.346985727548599f, 0.140264987945557f, - 0.347261756658554f, - 0.140531435608864f, 0.347537547349930f, 0.140798106789589f, - 0.347813159227371f, - 0.141064971685410f, 0.348088562488556f, 0.141332060098648f, - 0.348363757133484f, - 0.141599357128143f, 0.348638743162155f, 0.141866862773895f, - 0.348913550376892f, - 0.142134591937065f, 0.349188119173050f, 0.142402514815331f, - 0.349462509155273f, - 0.142670661211014f, 0.349736660718918f, 0.142939001321793f, - 0.350010633468628f, - 0.143207564949989f, 0.350284397602081f, 0.143476337194443f, - 0.350557953119278f, - 0.143745318055153f, 0.350831300020218f, 0.144014507532120f, - 0.351104438304901f, - 0.144283905625343f, 0.351377367973328f, 0.144553512334824f, - 0.351650089025497f, - 0.144823327660561f, 0.351922631263733f, 0.145093351602554f, - 0.352194935083389f, - 0.145363584160805f, 0.352467030286789f, 0.145634025335312f, - 0.352738946676254f, - 0.145904675126076f, 0.353010624647141f, 0.146175548434258f, - 0.353282123804092f, - 0.146446615457535f, 0.353553384542465f, 0.146717891097069f, - 0.353824466466904f, - 0.146989375352860f, 0.354095309972763f, 0.147261068224907f, - 0.354365974664688f, - 0.147532954812050f, 0.354636400938034f, 0.147805064916611f, - 0.354906648397446f, - 0.148077383637428f, 0.355176687240601f, 0.148349896073341f, - 0.355446487665176f, - 0.148622632026672f, 0.355716109275818f, 0.148895561695099f, - 0.355985492467880f, - 0.149168699979782f, 0.356254696846008f, 0.149442046880722f, - 0.356523662805557f, - 0.149715602397919f, 0.356792420148849f, 0.149989366531372f, - 0.357060998678207f, - 0.150263324379921f, 0.357329338788986f, 0.150537505745888f, - 0.357597470283508f, - 0.150811880826950f, 0.357865422964096f, 0.151086464524269f, - 0.358133137226105f, - 0.151361241936684f, 0.358400642871857f, 0.151636242866516f, - 0.358667939901352f, - 0.151911437511444f, 0.358935028314590f, 0.152186840772629f, - 0.359201908111572f, - 0.152462437748909f, 0.359468549489975f, 0.152738258242607f, - 0.359735012054443f, - 0.153014272451401f, 0.360001266002655f, 0.153290495276451f, - 0.360267281532288f, - 0.153566911816597f, 0.360533088445663f, 0.153843536973000f, - 0.360798716545105f, - 0.154120370745659f, 0.361064106225967f, 0.154397398233414f, - 0.361329287290573f, - 0.154674649238586f, 0.361594229936600f, 0.154952079057693f, - 0.361858993768692f, - 0.155229732394218f, 0.362123548984528f, 0.155507579445839f, - 0.362387865781784f, - 0.155785620212555f, 0.362651973962784f, 0.156063869595528f, - 0.362915903329849f, - 0.156342327594757f, 0.363179564476013f, 0.156620979309082f, - 0.363443046808243f, - 0.156899839639664f, 0.363706320524216f, 0.157178908586502f, - 0.363969355821610f, - 0.157458171248436f, 0.364232182502747f, 0.157737627625465f, - 0.364494800567627f, - 0.158017292618752f, 0.364757210016251f, 0.158297166228294f, - 0.365019410848618f, - 0.158577233552933f, 0.365281373262405f, 0.158857494592667f, - 0.365543156862259f, - 0.159137964248657f, 0.365804702043533f, 0.159418627619743f, - 0.366066008806229f, - 0.159699499607086f, 0.366327136754990f, 0.159980565309525f, - 0.366588026285172f, - 0.160261839628220f, 0.366848707199097f, 0.160543307662010f, - 0.367109179496765f, - 0.160824984312058f, 0.367369443178177f, 0.161106839776039f, - 0.367629468441010f, - 0.161388918757439f, 0.367889285087585f, 0.161671176552773f, - 0.368148893117905f, - 0.161953642964363f, 0.368408292531967f, 0.162236317992210f, - 0.368667453527451f, - 0.162519171833992f, 0.368926405906677f, 0.162802234292030f, - 0.369185149669647f, - 0.163085505366325f, 0.369443655014038f, 0.163368955254555f, - 0.369701951742172f, - 0.163652613759041f, 0.369960039854050f, 0.163936465978622f, - 0.370217919349670f, - 0.164220526814461f, 0.370475560426712f, 0.164504766464233f, - 0.370732992887497f, - 0.164789214730263f, 0.370990216732025f, 0.165073871612549f, - 0.371247202157974f, - 0.165358707308769f, 0.371503978967667f, 0.165643751621246f, - 0.371760547161102f, - 0.165928974747658f, 0.372016876935959f, 0.166214406490326f, - 0.372272998094559f, - 0.166500031948090f, 0.372528880834579f, 0.166785866022110f, - 0.372784584760666f, - 0.167071878910065f, 0.373040050268173f, 0.167358100414276f, - 0.373295277357101f, - 0.167644515633583f, 0.373550295829773f, 0.167931124567986f, - 0.373805105686188f, - 0.168217927217484f, 0.374059677124023f, 0.168504923582077f, - 0.374314039945602f, - 0.168792113661766f, 0.374568194150925f, 0.169079497456551f, - 0.374822109937668f, - 0.169367074966431f, 0.375075817108154f, 0.169654861092567f, - 0.375329315662384f, - 0.169942826032639f, 0.375582575798035f, 0.170230999588966f, - 0.375835597515106f, - 0.170519351959229f, 0.376088410615921f, 0.170807912945747f, - 0.376341015100479f, - 0.171096652746201f, 0.376593410968781f, 0.171385586261749f, - 0.376845568418503f, - 0.171674728393555f, 0.377097487449646f, 0.171964049339294f, - 0.377349197864532f, - 0.172253578901291f, 0.377600699663162f, 0.172543287277222f, - 0.377851963043213f, - 0.172833189368248f, 0.378102988004684f, 0.173123285174370f, - 0.378353834152222f, - 0.173413574695587f, 0.378604412078857f, 0.173704057931900f, - 0.378854811191559f, - 0.173994734883308f, 0.379104942083359f, 0.174285605549812f, - 0.379354894161224f, - 0.174576655030251f, 0.379604607820511f, 0.174867913126946f, - 0.379854083061218f, - 0.175159350037575f, 0.380103349685669f, 0.175450980663300f, - 0.380352377891541f, - 0.175742805004120f, 0.380601197481155f, 0.176034808158875f, - 0.380849778652191f, - 0.176327019929886f, 0.381098151206970f, 0.176619410514832f, - 0.381346285343170f, - 0.176911994814873f, 0.381594210863113f, 0.177204772830009f, - 0.381841897964478f, - 0.177497729659081f, 0.382089376449585f, 0.177790880203247f, - 0.382336616516113f, - 0.178084224462509f, 0.382583618164063f, 0.178377762436867f, - 0.382830440998077f, - 0.178671479225159f, 0.383076995611191f, 0.178965389728546f, - 0.383323341608047f, - 0.179259493947029f, 0.383569449186325f, 0.179553776979446f, - 0.383815348148346f, - 0.179848253726959f, 0.384061008691788f, 0.180142924189568f, - 0.384306460618973f, - 0.180437773466110f, 0.384551674127579f, 0.180732816457748f, - 0.384796649217606f, - 0.181028053164482f, 0.385041415691376f, 0.181323468685150f, - 0.385285943746567f, - 0.181619063019753f, 0.385530263185501f, 0.181914865970612f, - 0.385774344205856f, - 0.182210832834244f, 0.386018186807632f, 0.182507008314133f, - 0.386261820793152f, - 0.182803362607956f, 0.386505216360092f, 0.183099895715714f, - 0.386748403310776f, - 0.183396622538567f, 0.386991351842880f, 0.183693528175354f, - 0.387234061956406f, - 0.183990627527237f, 0.387476563453674f, 0.184287920594215f, - 0.387718826532364f, - 0.184585392475128f, 0.387960851192474f, 0.184883043169975f, - 0.388202667236328f, - 0.185180887579918f, 0.388444244861603f, 0.185478910803795f, - 0.388685584068298f, - 0.185777112841606f, 0.388926714658737f, 0.186075508594513f, - 0.389167606830597f, - 0.186374098062515f, 0.389408260583878f, 0.186672851443291f, - 0.389648675918579f, - 0.186971798539162f, 0.389888882637024f, 0.187270939350128f, - 0.390128880739212f, - 0.187570258975029f, 0.390368610620499f, 0.187869757413864f, - 0.390608131885529f, - 0.188169434666634f, 0.390847414731979f, 0.188469305634499f, - 0.391086459159851f, - 0.188769355416298f, 0.391325294971466f, 0.189069598913193f, - 0.391563892364502f, - 0.189370006322861f, 0.391802251338959f, 0.189670607447624f, - 0.392040401697159f, - 0.189971387386322f, 0.392278283834457f, 0.190272361040115f, - 0.392515957355499f, - 0.190573498606682f, 0.392753422260284f, 0.190874829888344f, - 0.392990618944168f, - 0.191176339983940f, 0.393227607011795f, 0.191478043794632f, - 0.393464356660843f, - 0.191779911518097f, 0.393700867891312f, 0.192081972956657f, - 0.393937170505524f, - 0.192384198307991f, 0.394173204898834f, 0.192686617374420f, - 0.394409030675888f, - 0.192989215254784f, 0.394644618034363f, 0.193292006850243f, - 0.394879996776581f, - 0.193594962358475f, 0.395115107297897f, 0.193898096680641f, - 0.395350009202957f, - 0.194201424717903f, 0.395584672689438f, 0.194504916667938f, - 0.395819097757339f, - 0.194808602333069f, 0.396053284406662f, 0.195112451910973f, - 0.396287262439728f, - 0.195416495203972f, 0.396520972251892f, 0.195720717310905f, - 0.396754473447800f, - 0.196025103330612f, 0.396987736225128f, 0.196329683065414f, - 0.397220760583878f, - 0.196634441614151f, 0.397453576326370f, 0.196939364075661f, - 0.397686123847961f, - 0.197244480252266f, 0.397918462753296f, 0.197549775242805f, - 0.398150533437729f, - 0.197855234146118f, 0.398382395505905f, 0.198160871863365f, - 0.398614019155502f, - 0.198466703295708f, 0.398845434188843f, 0.198772698640823f, - 0.399076581001282f, - 0.199078872799873f, 0.399307489395142f, 0.199385225772858f, - 0.399538189172745f, - 0.199691757559776f, 0.399768620729446f, 0.199998468160629f, - 0.399998843669891f, - 0.200305357575417f, 0.400228828191757f, 0.200612410902977f, - 0.400458574295044f, - 0.200919643044472f, 0.400688081979752f, 0.201227053999901f, - 0.400917351245880f, - 0.201534643769264f, 0.401146411895752f, 0.201842412352562f, - 0.401375204324722f, - 0.202150344848633f, 0.401603758335114f, 0.202458456158638f, - 0.401832103729248f, - 0.202766746282578f, 0.402060180902481f, 0.203075215220451f, - 0.402288049459457f, - 0.203383848071098f, 0.402515679597855f, 0.203692659735680f, - 0.402743041515350f, - 0.204001650214195f, 0.402970194816589f, 0.204310819506645f, - 0.403197109699249f, - 0.204620152711868f, 0.403423786163330f, 0.204929664731026f, - 0.403650224208832f, - 0.205239340662956f, 0.403876423835754f, 0.205549195408821f, - 0.404102355241776f, - 0.205859228968620f, 0.404328078031540f, 0.206169426441193f, - 0.404553562402725f, - 0.206479802727699f, 0.404778808355331f, 0.206790357828140f, - 0.405003815889359f, - 0.207101076841354f, 0.405228585004807f, 0.207411959767342f, - 0.405453115701675f, - 0.207723021507263f, 0.405677437782288f, 0.208034262061119f, - 0.405901491641998f, - 0.208345666527748f, 0.406125307083130f, 0.208657249808311f, - 0.406348884105682f, - 0.208969011902809f, 0.406572192907333f, 0.209280923008919f, - 0.406795293092728f, - 0.209593027830124f, 0.407018154859543f, 0.209905281662941f, - 0.407240778207779f, - 0.210217714309692f, 0.407463163137436f, 0.210530325770378f, - 0.407685309648514f, - 0.210843101143837f, 0.407907217741013f, 0.211156040430069f, - 0.408128857612610f, - 0.211469158530235f, 0.408350288867950f, 0.211782455444336f, - 0.408571451902390f, - 0.212095901370049f, 0.408792406320572f, 0.212409526109695f, - 0.409013092517853f, - 0.212723329663277f, 0.409233570098877f, 0.213037282228470f, - 0.409453779459000f, - 0.213351413607597f, 0.409673750400543f, 0.213665723800659f, - 0.409893482923508f, - 0.213980183005333f, 0.410112977027893f, 0.214294821023941f, - 0.410332232713699f, - 0.214609622955322f, 0.410551249980927f, 0.214924603700638f, - 0.410770028829575f, - 0.215239733457565f, 0.410988569259644f, 0.215555042028427f, - 0.411206841468811f, - 0.215870529413223f, 0.411424905061722f, 0.216186165809631f, - 0.411642700433731f, - 0.216501981019974f, 0.411860257387161f, 0.216817945241928f, - 0.412077575922012f, - 0.217134088277817f, 0.412294656038284f, 0.217450410127640f, - 0.412511497735977f, - 0.217766880989075f, 0.412728071212769f, 0.218083515763283f, - 0.412944436073303f, - 0.218400329351425f, 0.413160532712936f, 0.218717306852341f, - 0.413376390933990f, - 0.219034433364868f, 0.413592010736465f, 0.219351738691330f, - 0.413807392120361f, - 0.219669207930565f, 0.414022535085678f, 0.219986841082573f, - 0.414237409830093f, - 0.220304638147354f, 0.414452046155930f, 0.220622614026070f, - 0.414666473865509f, - 0.220940738916397f, 0.414880603551865f, 0.221259027719498f, - 0.415094524621964f, - 0.221577480435371f, 0.415308207273483f, 0.221896097064018f, - 0.415521621704102f, - 0.222214877605438f, 0.415734797716141f, 0.222533836960793f, - 0.415947735309601f, - 0.222852945327759f, 0.416160434484482f, 0.223172217607498f, - 0.416372895240784f, - 0.223491653800011f, 0.416585087776184f, 0.223811239004135f, - 0.416797041893005f, - 0.224131003022194f, 0.417008757591248f, 0.224450930953026f, - 0.417220205068588f, - 0.224771007895470f, 0.417431443929672f, 0.225091263651848f, - 0.417642414569855f, - 0.225411668419838f, 0.417853146791458f, 0.225732237100601f, - 0.418063640594482f, - 0.226052969694138f, 0.418273866176605f, 0.226373866200447f, - 0.418483853340149f, - 0.226694911718369f, 0.418693602085114f, 0.227016136050224f, - 0.418903112411499f, - 0.227337509393692f, 0.419112354516983f, 0.227659046649933f, - 0.419321358203888f, - 0.227980732917786f, 0.419530123472214f, 0.228302597999573f, - 0.419738620519638f, - 0.228624612092972f, 0.419946908950806f, 0.228946775197983f, - 0.420154929161072f, - 0.229269117116928f, 0.420362681150436f, 0.229591608047485f, - 0.420570224523544f, - 0.229914262890816f, 0.420777499675751f, 0.230237081646919f, - 0.420984506607056f, - 0.230560049414635f, 0.421191304922104f, 0.230883181095123f, - 0.421397835016251f, - 0.231206461787224f, 0.421604126691818f, 0.231529906392097f, - 0.421810150146484f, - 0.231853514909744f, 0.422015935182571f, 0.232177272439003f, - 0.422221481800079f, - 0.232501193881035f, 0.422426789999008f, 0.232825264334679f, - 0.422631829977036f, - 0.233149498701096f, 0.422836631536484f, 0.233473882079124f, - 0.423041164875031f, - 0.233798429369926f, 0.423245459794998f, 0.234123140573502f, - 0.423449516296387f, - 0.234448000788689f, 0.423653304576874f, 0.234773010015488f, - 0.423856884241104f, - 0.235098183155060f, 0.424060165882111f, 0.235423520207405f, - 0.424263238906860f, - 0.235749006271362f, 0.424466013908386f, 0.236074641346931f, - 0.424668580293655f, - 0.236400425434113f, 0.424870878458023f, 0.236726388335228f, - 0.425072938203812f, - 0.237052485346794f, 0.425274729728699f, 0.237378746271133f, - 0.425476282835007f, - 0.237705156207085f, 0.425677597522736f, 0.238031730055809f, - 0.425878643989563f, - 0.238358452916145f, 0.426079452037811f, 0.238685324788094f, - 0.426279991865158f, - 0.239012360572815f, 0.426480293273926f, 0.239339530467987f, - 0.426680356264114f, - 0.239666879177094f, 0.426880151033401f, 0.239994361996651f, - 0.427079707384110f, - 0.240322008728981f, 0.427278995513916f, 0.240649804472923f, - 0.427478045225143f, - 0.240977749228477f, 0.427676826715469f, 0.241305842995644f, - 0.427875369787216f, - 0.241634100675583f, 0.428073674440384f, 0.241962507367134f, - 0.428271710872650f, - 0.242291063070297f, 0.428469479084015f, 0.242619767785072f, - 0.428667008876801f, - 0.242948621511459f, 0.428864300251007f, 0.243277639150620f, - 0.429061323404312f, - 0.243606805801392f, 0.429258108139038f, 0.243936106562614f, - 0.429454624652863f, - 0.244265571236610f, 0.429650902748108f, 0.244595184922218f, - 0.429846942424774f, - 0.244924947619438f, 0.430042684078217f, 0.245254859328270f, - 0.430238217115402f, - 0.245584934949875f, 0.430433481931686f, 0.245915144681931f, - 0.430628478527069f, - 0.246245503425598f, 0.430823236703873f, 0.246576011180878f, - 0.431017726659775f, - 0.246906682848930f, 0.431211978197098f, 0.247237488627434f, - 0.431405961513519f, - 0.247568443417549f, 0.431599706411362f, 0.247899547219276f, - 0.431793183088303f, - 0.248230814933777f, 0.431986421346664f, 0.248562216758728f, - 0.432179391384125f, - 0.248893767595291f, 0.432372123003006f, 0.249225467443466f, - 0.432564586400986f, - 0.249557301402092f, 0.432756811380386f, 0.249889299273491f, - 0.432948768138886f, - 0.250221431255341f, 0.433140486478806f, 0.250553727149963f, - 0.433331936597824f, - 0.250886172056198f, 0.433523118495941f, 0.251218736171722f, - 0.433714061975479f, - 0.251551479101181f, 0.433904737234116f, 0.251884341239929f, - 0.434095174074173f, - 0.252217382192612f, 0.434285342693329f, 0.252550542354584f, - 0.434475272893906f, - 0.252883851528168f, 0.434664934873581f, 0.253217309713364f, - 0.434854328632355f, - 0.253550916910172f, 0.435043483972549f, 0.253884643316269f, - 0.435232400894165f, - 0.254218548536301f, 0.435421019792557f, 0.254552572965622f, - 0.435609430074692f, - 0.254886746406555f, 0.435797542333603f, 0.255221068859100f, - 0.435985416173935f, - 0.255555540323257f, 0.436173021793365f, 0.255890160799026f, - 0.436360388994217f, - 0.256224930286407f, 0.436547487974167f, 0.256559818983078f, - 0.436734348535538f, - 0.256894856691360f, 0.436920911073685f, 0.257230043411255f, - 0.437107264995575f, - 0.257565379142761f, 0.437293320894241f, 0.257900834083557f, - 0.437479138374329f, - 0.258236467838287f, 0.437664687633514f, 0.258572220802307f, - 0.437849998474121f, - 0.258908122777939f, 0.438035041093826f, 0.259244143962860f, - 0.438219845294952f, - 0.259580343961716f, 0.438404351472855f, 0.259916663169861f, - 0.438588619232178f, - 0.260253131389618f, 0.438772648572922f, 0.260589718818665f, - 0.438956409692764f, - 0.260926485061646f, 0.439139902591705f, 0.261263370513916f, - 0.439323127269745f, - 0.261600375175476f, 0.439506113529205f, 0.261937558650970f, - 0.439688831567764f, - 0.262274861335754f, 0.439871311187744f, 0.262612313032150f, - 0.440053492784500f, - 0.262949883937836f, 0.440235435962677f, 0.263287603855133f, - 0.440417140722275f, - 0.263625472784042f, 0.440598547458649f, 0.263963490724564f, - 0.440779715776443f, - 0.264301627874374f, 0.440960645675659f, 0.264639914035797f, - 0.441141277551651f, - 0.264978319406509f, 0.441321671009064f, 0.265316903591156f, - 0.441501796245575f, - 0.265655577182770f, 0.441681683063507f, 0.265994429588318f, - 0.441861271858215f, - 0.266333401203156f, 0.442040622234344f, 0.266672492027283f, - 0.442219734191895f, - 0.267011761665344f, 0.442398548126221f, 0.267351150512695f, - 0.442577123641968f, - 0.267690658569336f, 0.442755430936813f, 0.268030315637589f, - 0.442933470010757f, - 0.268370121717453f, 0.443111270666122f, 0.268710047006607f, - 0.443288803100586f, - 0.269050091505051f, 0.443466067314148f, 0.269390314817429f, - 0.443643063306808f, - 0.269730657339096f, 0.443819820880890f, 0.270071119070053f, - 0.443996280431747f, - 0.270411729812622f, 0.444172531366348f, 0.270752459764481f, - 0.444348484277725f, - 0.271093338727951f, 0.444524168968201f, 0.271434366703033f, - 0.444699615240097f, - 0.271775513887405f, 0.444874793291092f, 0.272116780281067f, - 0.445049703121185f, - 0.272458195686340f, 0.445224374532700f, 0.272799760103226f, - 0.445398747920990f, - 0.273141443729401f, 0.445572882890701f, 0.273483246564865f, - 0.445746749639511f, - 0.273825198411942f, 0.445920348167419f, 0.274167299270630f, - 0.446093708276749f, - 0.274509519338608f, 0.446266770362854f, 0.274851858615875f, - 0.446439594030380f, - 0.275194346904755f, 0.446612149477005f, 0.275536954402924f, - 0.446784436702728f, - 0.275879681110382f, 0.446956485509872f, 0.276222556829453f, - 0.447128236293793f, - 0.276565581560135f, 0.447299748659134f, 0.276908725500107f, - 0.447470992803574f, - 0.277251988649368f, 0.447641968727112f, 0.277595400810242f, - 0.447812676429749f, - 0.277938932180405f, 0.447983115911484f, 0.278282582759857f, - 0.448153316974640f, - 0.278626382350922f, 0.448323249816895f, 0.278970301151276f, - 0.448492884635925f, - 0.279314368963242f, 0.448662281036377f, 0.279658555984497f, - 0.448831409215927f, - 0.280002862215042f, 0.449000298976898f, 0.280347317457199f, - 0.449168890714645f, - 0.280691891908646f, 0.449337244033813f, 0.281036585569382f, - 0.449505299329758f, - 0.281381398439407f, 0.449673116207123f, 0.281726360321045f, - 0.449840664863586f, - 0.282071471214294f, 0.450007945299149f, 0.282416671514511f, - 0.450174957513809f, - 0.282762020826340f, 0.450341701507568f, 0.283107489347458f, - 0.450508207082748f, - 0.283453077077866f, 0.450674414634705f, 0.283798813819885f, - 0.450840383768082f, - 0.284144669771194f, 0.451006084680557f, 0.284490644931793f, - 0.451171487569809f, - 0.284836769104004f, 0.451336652040482f, 0.285182982683182f, - 0.451501548290253f, - 0.285529345273972f, 0.451666176319122f, 0.285875827074051f, - 0.451830536127090f, - 0.286222457885742f, 0.451994657516479f, 0.286569178104401f, - 0.452158480882645f, - 0.286916047334671f, 0.452322036027908f, 0.287263035774231f, - 0.452485352754593f, - 0.287610173225403f, 0.452648371458054f, 0.287957400083542f, - 0.452811151742935f, - 0.288304775953293f, 0.452973634004593f, 0.288652241230011f, - 0.453135877847672f, - 0.288999855518341f, 0.453297853469849f, 0.289347589015961f, - 0.453459560871124f, - 0.289695471525192f, 0.453621000051498f, 0.290043443441391f, - 0.453782171010971f, - 0.290391564369202f, 0.453943043947220f, 0.290739774703979f, - 0.454103678464890f, - 0.291088134050369f, 0.454264044761658f, 0.291436612606049f, - 0.454424172639847f, - 0.291785210371017f, 0.454584002494812f, 0.292133957147598f, - 0.454743564128876f, - 0.292482793331146f, 0.454902857542038f, 0.292831748723984f, - 0.455061882734299f, - 0.293180853128433f, 0.455220639705658f, 0.293530046939850f, - 0.455379128456116f, - 0.293879389762878f, 0.455537378787994f, 0.294228851795197f, - 0.455695331096649f, - 0.294578403234482f, 0.455853015184402f, 0.294928103685379f, - 0.456010431051254f, - 0.295277923345566f, 0.456167578697205f, 0.295627862215042f, - 0.456324487924576f, - 0.295977920293808f, 0.456481099128723f, 0.296328097581863f, - 0.456637442111969f, - 0.296678394079208f, 0.456793516874313f, 0.297028809785843f, - 0.456949323415756f, - 0.297379344701767f, 0.457104891538620f, 0.297729998826981f, - 0.457260161638260f, - 0.298080772161484f, 0.457415163516998f, 0.298431664705276f, - 0.457569897174835f, - 0.298782676458359f, 0.457724362611771f, 0.299133807420731f, - 0.457878559827805f, - 0.299485057592392f, 0.458032488822937f, 0.299836426973343f, - 0.458186149597168f, - 0.300187885761261f, 0.458339542150497f, 0.300539493560791f, - 0.458492636680603f, - 0.300891220569611f, 0.458645492792130f, 0.301243066787720f, - 0.458798080682755f, - 0.301595002412796f, 0.458950400352478f, 0.301947087049484f, - 0.459102421998978f, - 0.302299261093140f, 0.459254205226898f, 0.302651554346085f, - 0.459405690431595f, - 0.303003966808319f, 0.459556937217712f, 0.303356528282166f, - 0.459707885980606f, - 0.303709149360657f, 0.459858566522598f, 0.304061919450760f, - 0.460008978843689f, - 0.304414808750153f, 0.460159152746201f, 0.304767817258835f, - 0.460309028625488f, - 0.305120915174484f, 0.460458606481552f, 0.305474132299423f, - 0.460607945919037f, - 0.305827468633652f, 0.460757017135620f, 0.306180924177170f, - 0.460905820131302f, - 0.306534498929977f, 0.461054325103760f, 0.306888192892075f, - 0.461202591657639f, - 0.307241976261139f, 0.461350560188293f, 0.307595878839493f, - 0.461498260498047f, - 0.307949900627136f, 0.461645722389221f, 0.308304041624069f, - 0.461792886257172f, - 0.308658272027969f, 0.461939752101898f, 0.309012651443481f, - 0.462086379528046f, - 0.309367120265961f, 0.462232738733292f, 0.309721708297729f, - 0.462378799915314f, - 0.310076385736465f, 0.462524622678757f, 0.310431212186813f, - 0.462670147418976f, - 0.310786128044128f, 0.462815403938293f, 0.311141163110733f, - 0.462960392236710f, - 0.311496287584305f, 0.463105112314224f, 0.311851561069489f, - 0.463249564170837f, - 0.312206923961639f, 0.463393747806549f, 0.312562376260757f, - 0.463537633419037f, - 0.312917977571487f, 0.463681250810623f, 0.313273668289185f, - 0.463824629783630f, - 0.313629478216171f, 0.463967710733414f, 0.313985377550125f, - 0.464110493659973f, - 0.314341396093369f, 0.464253038167953f, 0.314697533845901f, - 0.464395314455032f, - 0.315053790807724f, 0.464537292718887f, 0.315410137176514f, - 0.464679002761841f, - 0.315766572952271f, 0.464820444583893f, 0.316123157739639f, - 0.464961618185043f, - 0.316479831933975f, 0.465102523565292f, 0.316836595535278f, - 0.465243130922318f, - 0.317193508148193f, 0.465383470058441f, 0.317550510168076f, - 0.465523540973663f, - 0.317907601594925f, 0.465663343667984f, 0.318264812231064f, - 0.465802878141403f, - 0.318622142076492f, 0.465942144393921f, 0.318979561328888f, - 0.466081112623215f, - 0.319337099790573f, 0.466219812631607f, 0.319694727659225f, - 0.466358244419098f, - 0.320052474737167f, 0.466496407985687f, 0.320410341024399f, - 0.466634273529053f, - 0.320768296718597f, 0.466771900653839f, 0.321126341819763f, - 0.466909229755402f, - 0.321484506130219f, 0.467046260833740f, 0.321842789649963f, - 0.467183053493500f, - 0.322201162576675f, 0.467319577932358f, 0.322559654712677f, - 0.467455804347992f, - 0.322918236255646f, 0.467591762542725f, 0.323276937007904f, - 0.467727422714233f, - 0.323635727167130f, 0.467862844467163f, 0.323994606733322f, - 0.467997968196869f, - 0.324353635311127f, 0.468132823705673f, 0.324712723493576f, - 0.468267410993576f, - 0.325071930885315f, 0.468401730060577f, 0.325431257486343f, - 0.468535751104355f, - 0.325790673494339f, 0.468669503927231f, 0.326150178909302f, - 0.468802988529205f, - 0.326509803533554f, 0.468936175107956f, 0.326869517564774f, - 0.469069123268127f, - 0.327229350805283f, 0.469201773405075f, 0.327589273452759f, - 0.469334155321121f, - 0.327949285507202f, 0.469466239213943f, 0.328309416770935f, - 0.469598054885864f, - 0.328669637441635f, 0.469729602336884f, 0.329029977321625f, - 0.469860881567001f, - 0.329390406608582f, 0.469991862773895f, 0.329750925302505f, - 0.470122605562210f, - 0.330111563205719f, 0.470253020524979f, 0.330472290515900f, - 0.470383197069168f, - 0.330833107233047f, 0.470513075590134f, 0.331194043159485f, - 0.470642685890198f, - 0.331555068492889f, 0.470772027969360f, 0.331916213035584f, - 0.470901101827621f, - 0.332277417182922f, 0.471029877662659f, 0.332638740539551f, - 0.471158385276794f, - 0.333000183105469f, 0.471286594867706f, 0.333361685276031f, - 0.471414536237717f, - 0.333723306655884f, 0.471542209386826f, 0.334085017442703f, - 0.471669614315033f, - 0.334446847438812f, 0.471796721220016f, 0.334808766841888f, - 0.471923559904099f, - 0.335170775651932f, 0.472050130367279f, 0.335532873868942f, - 0.472176402807236f, - 0.335895091295242f, 0.472302407026291f, 0.336257368326187f, - 0.472428143024445f, - 0.336619764566422f, 0.472553610801697f, 0.336982280015945f, - 0.472678780555725f, - 0.337344855070114f, 0.472803652286530f, 0.337707549333572f, - 0.472928285598755f, - 0.338070303201675f, 0.473052620887756f, 0.338433176279068f, - 0.473176687955856f, - 0.338796168565750f, 0.473300457000732f, 0.339159220457077f, - 0.473423957824707f, - 0.339522391557693f, 0.473547190427780f, 0.339885622262955f, - 0.473670125007629f, - 0.340248972177505f, 0.473792791366577f, 0.340612411499023f, - 0.473915189504623f, - 0.340975970029831f, 0.474037289619446f, 0.341339588165283f, - 0.474159121513367f, - 0.341703325510025f, 0.474280685186386f, 0.342067122459412f, - 0.474401950836182f, - 0.342431038618088f, 0.474522948265076f, 0.342795044183731f, - 0.474643647670746f, - 0.343159139156342f, 0.474764078855515f, 0.343523323535919f, - 0.474884241819382f, - 0.343887597322464f, 0.475004136562347f, 0.344251960515976f, - 0.475123733282089f, - 0.344616413116455f, 0.475243031978607f, 0.344980984926224f, - 0.475362062454224f, - 0.345345616340637f, 0.475480824708939f, 0.345710366964340f, - 0.475599318742752f, - 0.346075177192688f, 0.475717514753342f, 0.346440106630325f, - 0.475835442543030f, - 0.346805095672607f, 0.475953072309494f, 0.347170203924179f, - 0.476070433855057f, - 0.347535371780396f, 0.476187497377396f, 0.347900658845901f, - 0.476304292678833f, - 0.348266035318375f, 0.476420819759369f, 0.348631471395493f, - 0.476537048816681f, - 0.348997026681900f, 0.476653009653091f, 0.349362671375275f, - 0.476768702268600f, - 0.349728375673294f, 0.476884096860886f, 0.350094199180603f, - 0.476999223232269f, - 0.350460082292557f, 0.477114051580429f, 0.350826084613800f, - 0.477228611707687f, - 0.351192146539688f, 0.477342873811722f, 0.351558297872543f, - 0.477456867694855f, - 0.351924568414688f, 0.477570593357086f, 0.352290898561478f, - 0.477684020996094f, - 0.352657318115234f, 0.477797180414200f, 0.353023827075958f, - 0.477910041809082f, - 0.353390425443649f, 0.478022634983063f, 0.353757113218308f, - 0.478134930133820f, - 0.354123860597610f, 0.478246957063675f, 0.354490727186203f, - 0.478358715772629f, - 0.354857653379440f, 0.478470176458359f, 0.355224698781967f, - 0.478581339120865f, - 0.355591803789139f, 0.478692263364792f, 0.355958998203278f, - 0.478802859783173f, - 0.356326282024384f, 0.478913217782974f, 0.356693625450134f, - 0.479023247957230f, - 0.357061088085175f, 0.479133039712906f, 0.357428610324860f, - 0.479242533445358f, - 0.357796221971512f, 0.479351729154587f, 0.358163923025131f, - 0.479460656642914f, - 0.358531713485718f, 0.479569315910339f, 0.358899593353271f, - 0.479677677154541f, - 0.359267532825470f, 0.479785770177841f, 0.359635561704636f, - 0.479893565177917f, - 0.360003679990768f, 0.480001062154770f, 0.360371887683868f, - 0.480108320713043f, - 0.360740154981613f, 0.480215251445770f, 0.361108511686325f, - 0.480321943759918f, - 0.361476957798004f, 0.480428308248520f, 0.361845493316650f, - 0.480534434318542f, - 0.362214088439941f, 0.480640232563019f, 0.362582772970200f, - 0.480745792388916f, - 0.362951546907425f, 0.480851024389267f, 0.363320380449295f, - 0.480956017971039f, - 0.363689333200455f, 0.481060713529587f, 0.364058345556259f, - 0.481165111064911f, - 0.364427417516708f, 0.481269240379334f, 0.364796578884125f, - 0.481373071670532f, - 0.365165829658508f, 0.481476634740829f, 0.365535169839859f, - 0.481579899787903f, - 0.365904569625854f, 0.481682896614075f, 0.366274058818817f, - 0.481785595417023f, - 0.366643607616425f, 0.481888025999069f, 0.367013275623322f, - 0.481990188360214f, - 0.367382973432541f, 0.482092022895813f, 0.367752790451050f, - 0.482193619012833f, - 0.368122667074203f, 0.482294887304306f, 0.368492603302002f, - 0.482395917177200f, - 0.368862658739090f, 0.482496619224548f, 0.369232743978500f, - 0.482597053050995f, - 0.369602948427200f, 0.482697218656540f, 0.369973212480545f, - 0.482797086238861f, - 0.370343536138535f, 0.482896685600281f, 0.370713949203491f, - 0.482995986938477f, - 0.371084451675415f, 0.483094990253448f, 0.371455013751984f, - 0.483193725347519f, - 0.371825665235519f, 0.483292192220688f, 0.372196376323700f, - 0.483390361070633f, - 0.372567176818848f, 0.483488231897354f, 0.372938036918640f, - 0.483585834503174f, - 0.373308986425400f, 0.483683139085770f, 0.373679995536804f, - 0.483780175447464f, - 0.374051094055176f, 0.483876913785934f, 0.374422252178192f, - 0.483973383903503f, - 0.374793499708176f, 0.484069555997849f, 0.375164806842804f, - 0.484165430068970f, - 0.375536203384399f, 0.484261035919189f, 0.375907659530640f, - 0.484356373548508f, - 0.376279205083847f, 0.484451413154602f, 0.376650810241699f, - 0.484546154737473f, - 0.377022475004196f, 0.484640628099442f, 0.377394229173660f, - 0.484734803438187f, - 0.377766042947769f, 0.484828680753708f, 0.378137946128845f, - 0.484922289848328f, - 0.378509908914566f, 0.485015630722046f, 0.378881961107254f, - 0.485108673572540f, - 0.379254043102264f, 0.485201418399811f, 0.379626244306564f, - 0.485293895006180f, - 0.379998475313187f, 0.485386073589325f, 0.380370795726776f, - 0.485477954149246f, - 0.380743205547333f, 0.485569566488266f, 0.381115674972534f, - 0.485660910606384f, - 0.381488204002380f, 0.485751956701279f, 0.381860792636871f, - 0.485842704772949f, - 0.382233470678329f, 0.485933154821396f, 0.382606208324432f, - 0.486023366451263f, - 0.382979035377502f, 0.486113250255585f, 0.383351892232895f, - 0.486202865839005f, - 0.383724838495255f, 0.486292183399200f, 0.384097874164581f, - 0.486381232738495f, - 0.384470939636230f, 0.486469984054565f, 0.384844094514847f, - 0.486558437347412f, - 0.385217308998108f, 0.486646622419357f, 0.385590612888336f, - 0.486734509468079f, - 0.385963946580887f, 0.486822128295898f, 0.386337369680405f, - 0.486909449100494f, - 0.386710882186890f, 0.486996471881866f, 0.387084424495697f, - 0.487083226442337f, - 0.387458056211472f, 0.487169682979584f, 0.387831717729568f, - 0.487255871295929f, - 0.388205498456955f, 0.487341761589050f, 0.388579308986664f, - 0.487427353858948f, - 0.388953179121017f, 0.487512677907944f, 0.389327138662338f, - 0.487597703933716f, - 0.389701157808304f, 0.487682431936264f, 0.390075236558914f, - 0.487766891717911f, - 0.390449374914169f, 0.487851053476334f, 0.390823602676392f, - 0.487934947013855f, - 0.391197860240936f, 0.488018542528152f, 0.391572207212448f, - 0.488101840019226f, - 0.391946613788605f, 0.488184869289398f, 0.392321079969406f, - 0.488267600536346f, - 0.392695605754852f, 0.488350033760071f, 0.393070191144943f, - 0.488432198762894f, - 0.393444836139679f, 0.488514065742493f, 0.393819570541382f, - 0.488595664501190f, - 0.394194334745407f, 0.488676935434341f, 0.394569188356400f, - 0.488757967948914f, - 0.394944071769714f, 0.488838672637939f, 0.395319044589996f, - 0.488919109106064f, - 0.395694077014923f, 0.488999247550964f, 0.396069169044495f, - 0.489079117774963f, - 0.396444320678711f, 0.489158689975739f, 0.396819531917572f, - 0.489237964153290f, - 0.397194802761078f, 0.489316970109940f, 0.397570133209229f, - 0.489395678043365f, - 0.397945523262024f, 0.489474087953568f, 0.398320972919464f, - 0.489552229642868f, - 0.398696482181549f, 0.489630073308945f, 0.399072051048279f, - 0.489707618951797f, - 0.399447679519653f, 0.489784896373749f, 0.399823367595673f, - 0.489861875772476f, - 0.400199115276337f, 0.489938557147980f, 0.400574922561646f, - 0.490014940500259f, - 0.400950789451599f, 0.490091055631638f, 0.401326715946198f, - 0.490166902542114f, - 0.401702702045441f, 0.490242421627045f, 0.402078747749329f, - 0.490317672491074f, - 0.402454853057861f, 0.490392625331879f, 0.402830988168716f, - 0.490467309951782f, - 0.403207212686539f, 0.490541696548462f, 0.403583467006683f, - 0.490615785121918f, - 0.403959810733795f, 0.490689605474472f, 0.404336184263229f, - 0.490763127803802f, - 0.404712617397308f, 0.490836352109909f, 0.405089110136032f, - 0.490909278392792f, - 0.405465662479401f, 0.490981936454773f, 0.405842274427414f, - 0.491054296493530f, - 0.406218945980072f, 0.491126358509064f, 0.406595647335052f, - 0.491198152303696f, - 0.406972438097000f, 0.491269648075104f, 0.407349258661270f, - 0.491340845823288f, - 0.407726138830185f, 0.491411775350571f, 0.408103078603745f, - 0.491482406854630f, - 0.408480048179626f, 0.491552740335464f, 0.408857107162476f, - 0.491622805595398f, - 0.409234195947647f, 0.491692543029785f, 0.409611344337463f, - 0.491762012243271f, - 0.409988552331924f, 0.491831213235855f, 0.410365819931030f, - 0.491900116205215f, - 0.410743117332459f, 0.491968721151352f, 0.411120474338531f, - 0.492037028074265f, - 0.411497890949249f, 0.492105036973953f, 0.411875367164612f, - 0.492172777652740f, - 0.412252873182297f, 0.492240220308304f, 0.412630438804626f, - 0.492307394742966f, - 0.413008064031601f, 0.492374241352081f, 0.413385748863220f, - 0.492440819740295f, - 0.413763463497162f, 0.492507129907608f, 0.414141237735748f, - 0.492573112249374f, - 0.414519041776657f, 0.492638826370239f, 0.414896935224533f, - 0.492704242467880f, - 0.415274858474731f, 0.492769360542297f, 0.415652841329575f, - 0.492834210395813f, - 0.416030853986740f, 0.492898762226105f, 0.416408926248550f, - 0.492963016033173f, - 0.416787058115005f, 0.493026971817017f, 0.417165219783783f, - 0.493090659379959f, - 0.417543441057205f, 0.493154048919678f, 0.417921721935272f, - 0.493217140436172f, - 0.418300032615662f, 0.493279963731766f, 0.418678402900696f, - 0.493342459201813f, - 0.419056802988052f, 0.493404686450958f, 0.419435262680054f, - 0.493466645479202f, - 0.419813781976700f, 0.493528276681900f, 0.420192331075668f, - 0.493589639663696f, - 0.420570939779282f, 0.493650704622269f, 0.420949578285217f, - 0.493711471557617f, - 0.421328276395798f, 0.493771970272064f, 0.421707004308701f, - 0.493832170963287f, - 0.422085791826248f, 0.493892073631287f, 0.422464638948441f, - 0.493951678276062f, - 0.422843515872955f, 0.494011014699936f, 0.423222452402115f, - 0.494070053100586f, - 0.423601418733597f, 0.494128793478012f, 0.423980414867401f, - 0.494187235832214f, - 0.424359470605850f, 0.494245409965515f, 0.424738585948944f, - 0.494303256273270f, - 0.425117731094360f, 0.494360834360123f, 0.425496935844421f, - 0.494418144226074f, - 0.425876170396805f, 0.494475126266479f, 0.426255434751511f, - 0.494531840085983f, - 0.426634758710861f, 0.494588255882263f, 0.427014142274857f, - 0.494644373655319f, - 0.427393525838852f, 0.494700223207474f, 0.427772998809814f, - 0.494755744934082f, - 0.428152471780777f, 0.494810998439789f, 0.428532034158707f, - 0.494865983724594f, - 0.428911596536636f, 0.494920641183853f, 0.429291218519211f, - 0.494975030422211f, - 0.429670870304108f, 0.495029091835022f, 0.430050581693649f, - 0.495082914829254f, - 0.430430322885513f, 0.495136409997940f, 0.430810123682022f, - 0.495189607143402f, - 0.431189924478531f, 0.495242536067963f, 0.431569814682007f, - 0.495295166969299f, - 0.431949704885483f, 0.495347499847412f, 0.432329654693604f, - 0.495399564504623f, - 0.432709634304047f, 0.495451331138611f, 0.433089673519135f, - 0.495502769947052f, - 0.433469742536545f, 0.495553970336914f, 0.433849841356277f, - 0.495604842901230f, - 0.434229999780655f, 0.495655417442322f, 0.434610158205032f, - 0.495705723762512f, - 0.434990376234055f, 0.495755732059479f, 0.435370653867722f, - 0.495805442333221f, - 0.435750931501389f, 0.495854884386063f, 0.436131268739700f, - 0.495903998613358f, - 0.436511665582657f, 0.495952844619751f, 0.436892062425613f, - 0.496001392602921f, - 0.437272518873215f, 0.496049642562866f, 0.437653005123138f, - 0.496097624301910f, - 0.438033521175385f, 0.496145308017731f, 0.438414067029953f, - 0.496192663908005f, - 0.438794672489166f, 0.496239781379700f, 0.439175277948380f, - 0.496286571025848f, - 0.439555943012238f, 0.496333062648773f, 0.439936667680740f, - 0.496379286050797f, - 0.440317392349243f, 0.496425211429596f, 0.440698176622391f, - 0.496470838785172f, - 0.441078960895538f, 0.496516168117523f, 0.441459804773331f, - 0.496561229228973f, - 0.441840678453445f, 0.496605962514877f, 0.442221581935883f, - 0.496650427579880f, - 0.442602545022964f, 0.496694594621658f, 0.442983508110046f, - 0.496738493442535f, - 0.443364530801773f, 0.496782064437866f, 0.443745553493500f, - 0.496825367212296f, - 0.444126635789871f, 0.496868371963501f, 0.444507747888565f, - 0.496911078691483f, - 0.444888889789581f, 0.496953487396240f, 0.445270061492920f, - 0.496995598077774f, - 0.445651292800903f, 0.497037440538406f, 0.446032524108887f, - 0.497078984975815f, - 0.446413785219193f, 0.497120231389999f, 0.446795076131821f, - 0.497161179780960f, - 0.447176426649094f, 0.497201830148697f, 0.447557777166367f, - 0.497242212295532f, - 0.447939187288284f, 0.497282296419144f, 0.448320597410202f, - 0.497322082519531f, - 0.448702067136765f, 0.497361570596695f, 0.449083566665649f, - 0.497400760650635f, - 0.449465066194534f, 0.497439652681351f, 0.449846625328064f, - 0.497478276491165f, - 0.450228184461594f, 0.497516602277756f, 0.450609803199768f, - 0.497554630041122f, - 0.450991421937943f, 0.497592359781265f, 0.451373100280762f, - 0.497629791498184f, - 0.451754778623581f, 0.497666954994202f, 0.452136516571045f, - 0.497703820466995f, - 0.452518254518509f, 0.497740387916565f, 0.452900022268295f, - 0.497776657342911f, - 0.453281819820404f, 0.497812628746033f, 0.453663676977158f, - 0.497848302125931f, - 0.454045534133911f, 0.497883707284927f, 0.454427421092987f, - 0.497918814420700f, - 0.454809308052063f, 0.497953623533249f, 0.455191254615784f, - 0.497988134622574f, - 0.455573230981827f, 0.498022347688675f, 0.455955207347870f, - 0.498056292533875f, - 0.456337243318558f, 0.498089909553528f, 0.456719279289246f, - 0.498123258352280f, - 0.457101345062256f, 0.498156309127808f, 0.457483440637589f, - 0.498189061880112f, - 0.457865566015244f, 0.498221516609192f, 0.458247691392899f, - 0.498253703117371f, - 0.458629876375198f, 0.498285561800003f, 0.459012061357498f, - 0.498317152261734f, - 0.459394276142120f, 0.498348444700241f, 0.459776520729065f, - 0.498379439115524f, - 0.460158795118332f, 0.498410135507584f, 0.460541069507599f, - 0.498440563678741f, - 0.460923373699188f, 0.498470664024353f, 0.461305707693100f, - 0.498500496149063f, - 0.461688071489334f, 0.498530030250549f, 0.462070435285568f, - 0.498559266328812f, - 0.462452858686447f, 0.498588204383850f, 0.462835282087326f, - 0.498616874217987f, - 0.463217705488205f, 0.498645216226578f, 0.463600188493729f, - 0.498673290014267f, - 0.463982671499252f, 0.498701065778732f, 0.464365184307098f, - 0.498728543519974f, - 0.464747726917267f, 0.498755723237991f, 0.465130269527435f, - 0.498782604932785f, - 0.465512841939926f, 0.498809218406677f, 0.465895414352417f, - 0.498835533857346f, - 0.466278046369553f, 0.498861521482468f, 0.466660678386688f, - 0.498887240886688f, - 0.467043310403824f, 0.498912662267685f, 0.467426002025604f, - 0.498937815427780f, - 0.467808693647385f, 0.498962640762329f, 0.468191385269165f, - 0.498987197875977f, - 0.468574106693268f, 0.499011427164078f, 0.468956857919693f, - 0.499035388231277f, - 0.469339638948441f, 0.499059051275253f, 0.469722419977188f, - 0.499082416296005f, - 0.470105201005936f, 0.499105513095856f, 0.470488041639328f, - 0.499128282070160f, - 0.470870882272720f, 0.499150782823563f, 0.471253722906113f, - 0.499172955751419f, - 0.471636593341827f, 0.499194860458374f, 0.472019463777542f, - 0.499216467142105f, - 0.472402364015579f, 0.499237775802612f, 0.472785294055939f, - 0.499258816242218f, - 0.473168224096298f, 0.499279528856277f, 0.473551183938980f, - 0.499299973249435f, - 0.473934143781662f, 0.499320119619370f, 0.474317133426666f, - 0.499339967966080f, - 0.474700123071671f, 0.499359518289566f, 0.475083142518997f, - 0.499378770589828f, - 0.475466161966324f, 0.499397724866867f, 0.475849211215973f, - 0.499416410923004f, - 0.476232260465622f, 0.499434769153595f, 0.476615339517593f, - 0.499452859163284f, - 0.476998418569565f, 0.499470651149750f, 0.477381497621536f, - 0.499488145112991f, - 0.477764606475830f, 0.499505341053009f, 0.478147745132446f, - 0.499522238969803f, - 0.478530883789063f, 0.499538868665695f, 0.478914022445679f, - 0.499555170536041f, - 0.479297190904617f, 0.499571204185486f, 0.479680359363556f, - 0.499586939811707f, - 0.480063527822495f, 0.499602377414703f, 0.480446726083755f, - 0.499617516994476f, - 0.480829954147339f, 0.499632388353348f, 0.481213152408600f, - 0.499646931886673f, - 0.481596380472183f, 0.499661177396774f, 0.481979638338089f, - 0.499675154685974f, - 0.482362866401672f, 0.499688833951950f, 0.482746154069901f, - 0.499702215194702f, - 0.483129411935806f, 0.499715298414230f, 0.483512699604034f, - 0.499728083610535f, - 0.483895987272263f, 0.499740600585938f, 0.484279274940491f, - 0.499752789735794f, - 0.484662592411041f, 0.499764710664749f, 0.485045909881592f, - 0.499776333570480f, - 0.485429257154465f, 0.499787658452988f, 0.485812574625015f, - 0.499798685312271f, - 0.486195921897888f, 0.499809414148331f, 0.486579269170761f, - 0.499819844961166f, - 0.486962646245956f, 0.499830007553101f, 0.487346023321152f, - 0.499839842319489f, - 0.487729400396347f, 0.499849408864975f, 0.488112777471542f, - 0.499858677387238f, - 0.488496154546738f, 0.499867647886276f, 0.488879561424255f, - 0.499876320362091f, - 0.489262968301773f, 0.499884694814682f, 0.489646375179291f, - 0.499892801046371f, - 0.490029782056808f, 0.499900579452515f, 0.490413218736649f, - 0.499908089637756f, - 0.490796625614166f, 0.499915301799774f, 0.491180062294006f, - 0.499922215938568f, - 0.491563498973846f, 0.499928832054138f, 0.491946935653687f, - 0.499935150146484f, - 0.492330402135849f, 0.499941170215607f, 0.492713838815689f, - 0.499946922063828f, - 0.493097305297852f, 0.499952346086502f, 0.493480771780014f, - 0.499957501888275f, - 0.493864238262177f, 0.499962359666824f, 0.494247704744339f, - 0.499966919422150f, - 0.494631171226501f, 0.499971181154251f, 0.495014637708664f, - 0.499975144863129f, - 0.495398133993149f, 0.499978810548782f, 0.495781600475311f, - 0.499982208013535f, - 0.496165096759796f, 0.499985307455063f, 0.496548563241959f, - 0.499988079071045f, - 0.496932059526443f, 0.499990582466125f, 0.497315555810928f, - 0.499992787837982f, - 0.497699022293091f, 0.499994695186615f, 0.498082518577576f, - 0.499996334314346f, - 0.498466014862061f, 0.499997645616531f, 0.498849511146545f, - 0.499998688697815f, - 0.499233007431030f, 0.499999403953552f, 0.499616503715515f, - 0.499999850988388f, -}; - - -/** -* \par -* Generation of realCoefB array: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-* {    
-*    pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-*  } 
-* -*/ -static const float32_t realCoefB[8192] = { - 0.500000000000000f, 0.500000000000000f, 0.500383496284485f, - 0.499999850988388f, - 0.500766992568970f, 0.499999403953552f, 0.501150488853455f, - 0.499998688697815f, - 0.501533985137939f, 0.499997645616531f, 0.501917481422424f, - 0.499996334314346f, - 0.502300977706909f, 0.499994695186615f, 0.502684473991394f, - 0.499992787837982f, - 0.503067970275879f, 0.499990582466125f, 0.503451406955719f, - 0.499988079071045f, - 0.503834903240204f, 0.499985307455063f, 0.504218399524689f, - 0.499982208013535f, - 0.504601895809174f, 0.499978810548782f, 0.504985332489014f, - 0.499975144863129f, - 0.505368828773499f, 0.499971181154251f, 0.505752325057983f, - 0.499966919422150f, - 0.506135761737823f, 0.499962359666824f, 0.506519258022308f, - 0.499957501888275f, - 0.506902694702148f, 0.499952346086502f, 0.507286131381989f, - 0.499946922063828f, - 0.507669627666473f, 0.499941170215607f, 0.508053064346313f, - 0.499935150146484f, - 0.508436501026154f, 0.499928832054138f, 0.508819937705994f, - 0.499922215938568f, - 0.509203374385834f, 0.499915301799774f, 0.509586811065674f, - 0.499908089637756f, - 0.509970188140869f, 0.499900579452515f, 0.510353624820709f, - 0.499892801046371f, - 0.510737061500549f, 0.499884694814682f, 0.511120438575745f, - 0.499876320362091f, - 0.511503815650940f, 0.499867647886276f, 0.511887252330780f, - 0.499858677387238f, - 0.512270629405975f, 0.499849408864975f, 0.512654006481171f, - 0.499839842319489f, - 0.513037383556366f, 0.499830007553101f, 0.513420701026917f, - 0.499819844961166f, - 0.513804078102112f, 0.499809414148331f, 0.514187395572662f, - 0.499798685312271f, - 0.514570772647858f, 0.499787658452988f, 0.514954090118408f, - 0.499776333570480f, - 0.515337407588959f, 0.499764710664749f, 0.515720725059509f, - 0.499752789735794f, - 0.516103982925415f, 0.499740600585938f, 0.516487300395966f, - 0.499728083610535f, - 0.516870558261871f, 0.499715298414230f, 0.517253875732422f, - 0.499702215194702f, - 0.517637133598328f, 0.499688833951950f, 0.518020391464233f, - 0.499675154685974f, - 0.518403589725494f, 0.499661177396774f, 0.518786847591400f, - 0.499646931886673f, - 0.519170045852661f, 0.499632388353348f, 0.519553244113922f, - 0.499617516994476f, - 0.519936442375183f, 0.499602377414703f, 0.520319640636444f, - 0.499586939811707f, - 0.520702838897705f, 0.499571204185486f, 0.521085977554321f, - 0.499555170536041f, - 0.521469116210938f, 0.499538868665695f, 0.521852254867554f, - 0.499522238969803f, - 0.522235393524170f, 0.499505341053009f, 0.522618472576141f, - 0.499488145112991f, - 0.523001611232758f, 0.499470651149750f, 0.523384690284729f, - 0.499452859163284f, - 0.523767769336700f, 0.499434769153595f, 0.524150788784027f, - 0.499416410923004f, - 0.524533808231354f, 0.499397724866867f, 0.524916887283325f, - 0.499378770589828f, - 0.525299847126007f, 0.499359518289566f, 0.525682866573334f, - 0.499339967966080f, - 0.526065826416016f, 0.499320119619370f, 0.526448845863342f, - 0.499299973249435f, - 0.526831746101379f, 0.499279528856277f, 0.527214705944061f, - 0.499258816242218f, - 0.527597606182098f, 0.499237775802612f, 0.527980506420136f, - 0.499216467142105f, - 0.528363406658173f, 0.499194860458374f, 0.528746306896210f, - 0.499172955751419f, - 0.529129147529602f, 0.499150782823563f, 0.529511988162994f, - 0.499128282070160f, - 0.529894769191742f, 0.499105513095856f, 0.530277609825134f, - 0.499082416296005f, - 0.530660390853882f, 0.499059051275253f, 0.531043112277985f, - 0.499035388231277f, - 0.531425893306732f, 0.499011427164078f, 0.531808614730835f, - 0.498987197875977f, - 0.532191336154938f, 0.498962640762329f, 0.532573997974396f, - 0.498937815427780f, - 0.532956659793854f, 0.498912662267685f, 0.533339321613312f, - 0.498887240886688f, - 0.533721983432770f, 0.498861521482468f, 0.534104585647583f, - 0.498835533857346f, - 0.534487187862396f, 0.498809218406677f, 0.534869730472565f, - 0.498782604932785f, - 0.535252273082733f, 0.498755723237991f, 0.535634815692902f, - 0.498728543519974f, - 0.536017298698425f, 0.498701065778732f, 0.536399841308594f, - 0.498673290014267f, - 0.536782264709473f, 0.498645216226578f, 0.537164747714996f, - 0.498616874217987f, - 0.537547171115875f, 0.498588204383850f, 0.537929534912109f, - 0.498559266328812f, - 0.538311958312988f, 0.498530030250549f, 0.538694262504578f, - 0.498500496149063f, - 0.539076626300812f, 0.498470664024353f, 0.539458930492401f, - 0.498440563678741f, - 0.539841234683990f, 0.498410135507584f, 0.540223479270935f, - 0.498379439115524f, - 0.540605723857880f, 0.498348444700241f, 0.540987968444824f, - 0.498317152261734f, - 0.541370153427124f, 0.498285561800003f, 0.541752278804779f, - 0.498253703117371f, - 0.542134463787079f, 0.498221516609192f, 0.542516589164734f, - 0.498189061880112f, - 0.542898654937744f, 0.498156309127808f, 0.543280720710754f, - 0.498123258352280f, - 0.543662786483765f, 0.498089909553528f, 0.544044792652130f, - 0.498056292533875f, - 0.544426798820496f, 0.498022347688675f, 0.544808745384216f, - 0.497988134622574f, - 0.545190691947937f, 0.497953623533249f, 0.545572578907013f, - 0.497918814420700f, - 0.545954465866089f, 0.497883707284927f, 0.546336352825165f, - 0.497848302125931f, - 0.546718180179596f, 0.497812628746033f, 0.547099947929382f, - 0.497776657342911f, - 0.547481775283813f, 0.497740387916565f, 0.547863483428955f, - 0.497703820466995f, - 0.548245191574097f, 0.497666954994202f, 0.548626899719238f, - 0.497629791498184f, - 0.549008548259735f, 0.497592359781265f, 0.549390196800232f, - 0.497554630041122f, - 0.549771785736084f, 0.497516602277756f, 0.550153374671936f, - 0.497478276491165f, - 0.550534904003143f, 0.497439652681351f, 0.550916433334351f, - 0.497400760650635f, - 0.551297962665558f, 0.497361570596695f, 0.551679372787476f, - 0.497322082519531f, - 0.552060842514038f, 0.497282296419144f, 0.552442193031311f, - 0.497242212295532f, - 0.552823603153229f, 0.497201830148697f, 0.553204894065857f, - 0.497161179780960f, - 0.553586184978485f, 0.497120231389999f, 0.553967475891113f, - 0.497078984975815f, - 0.554348707199097f, 0.497037440538406f, 0.554729938507080f, - 0.496995598077774f, - 0.555111110210419f, 0.496953487396240f, 0.555492222309113f, - 0.496911078691483f, - 0.555873334407806f, 0.496868371963501f, 0.556254446506500f, - 0.496825367212296f, - 0.556635499000549f, 0.496782064437866f, 0.557016491889954f, - 0.496738493442535f, - 0.557397484779358f, 0.496694594621658f, 0.557778418064117f, - 0.496650427579880f, - 0.558159291744232f, 0.496605962514877f, 0.558540165424347f, - 0.496561229228973f, - 0.558921039104462f, 0.496516168117523f, 0.559301853179932f, - 0.496470838785172f, - 0.559682607650757f, 0.496425211429596f, 0.560063362121582f, - 0.496379286050797f, - 0.560444056987762f, 0.496333062648773f, 0.560824692249298f, - 0.496286571025848f, - 0.561205327510834f, 0.496239781379700f, 0.561585903167725f, - 0.496192663908005f, - 0.561966478824615f, 0.496145308017731f, 0.562346994876862f, - 0.496097624301910f, - 0.562727510929108f, 0.496049642562866f, 0.563107967376709f, - 0.496001392602921f, - 0.563488364219666f, 0.495952844619751f, 0.563868701457977f, - 0.495903998613358f, - 0.564249038696289f, 0.495854884386063f, 0.564629375934601f, - 0.495805442333221f, - 0.565009593963623f, 0.495755732059479f, 0.565389811992645f, - 0.495705723762512f, - 0.565770030021667f, 0.495655417442322f, 0.566150128841400f, - 0.495604842901230f, - 0.566530287265778f, 0.495553970336914f, 0.566910326480865f, - 0.495502769947052f, - 0.567290365695953f, 0.495451331138611f, 0.567670345306396f, - 0.495399564504623f, - 0.568050265312195f, 0.495347499847412f, 0.568430185317993f, - 0.495295166969299f, - 0.568810045719147f, 0.495242536067963f, 0.569189906120300f, - 0.495189607143402f, - 0.569569647312164f, 0.495136409997940f, 0.569949388504028f, - 0.495082914829254f, - 0.570329129695892f, 0.495029091835022f, 0.570708811283112f, - 0.494975030422211f, - 0.571088373661041f, 0.494920641183853f, 0.571467995643616f, - 0.494865983724594f, - 0.571847498416901f, 0.494810998439789f, 0.572227001190186f, - 0.494755744934082f, - 0.572606444358826f, 0.494700223207474f, 0.572985887527466f, - 0.494644373655319f, - 0.573365211486816f, 0.494588255882263f, 0.573744535446167f, - 0.494531840085983f, - 0.574123859405518f, 0.494475126266479f, 0.574503064155579f, - 0.494418144226074f, - 0.574882268905640f, 0.494360834360123f, 0.575261414051056f, - 0.494303256273270f, - 0.575640499591827f, 0.494245409965515f, 0.576019585132599f, - 0.494187235832214f, - 0.576398611068726f, 0.494128793478012f, 0.576777577400208f, - 0.494070053100586f, - 0.577156484127045f, 0.494011014699936f, 0.577535390853882f, - 0.493951678276062f, - 0.577914178371429f, 0.493892073631287f, 0.578292965888977f, - 0.493832170963287f, - 0.578671753406525f, 0.493771970272064f, 0.579050421714783f, - 0.493711471557617f, - 0.579429090023041f, 0.493650704622269f, 0.579807698726654f, - 0.493589639663696f, - 0.580186247825623f, 0.493528276681900f, 0.580564737319946f, - 0.493466645479202f, - 0.580943167209625f, 0.493404686450958f, 0.581321597099304f, - 0.493342459201813f, - 0.581699967384338f, 0.493279963731766f, 0.582078278064728f, - 0.493217140436172f, - 0.582456588745117f, 0.493154048919678f, 0.582834780216217f, - 0.493090659379959f, - 0.583212971687317f, 0.493026971817017f, 0.583591103553772f, - 0.492963016033173f, - 0.583969175815582f, 0.492898762226105f, 0.584347188472748f, - 0.492834210395813f, - 0.584725141525269f, 0.492769360542297f, 0.585103094577789f, - 0.492704242467880f, - 0.585480928421021f, 0.492638826370239f, 0.585858762264252f, - 0.492573112249374f, - 0.586236536502838f, 0.492507129907608f, 0.586614251136780f, - 0.492440819740295f, - 0.586991965770721f, 0.492374241352081f, 0.587369561195374f, - 0.492307394742966f, - 0.587747097015381f, 0.492240220308304f, 0.588124632835388f, - 0.492172777652740f, - 0.588502109050751f, 0.492105036973953f, 0.588879525661469f, - 0.492037028074265f, - 0.589256882667542f, 0.491968721151352f, 0.589634180068970f, - 0.491900116205215f, - 0.590011477470398f, 0.491831213235855f, 0.590388655662537f, - 0.491762012243271f, - 0.590765833854675f, 0.491692543029785f, 0.591142892837524f, - 0.491622805595398f, - 0.591519951820374f, 0.491552740335464f, 0.591896951198578f, - 0.491482406854630f, - 0.592273890972137f, 0.491411775350571f, 0.592650771141052f, - 0.491340845823288f, - 0.593027591705322f, 0.491269648075104f, 0.593404352664948f, - 0.491198152303696f, - 0.593781054019928f, 0.491126358509064f, 0.594157755374908f, - 0.491054296493530f, - 0.594534337520599f, 0.490981936454773f, 0.594910860061646f, - 0.490909278392792f, - 0.595287382602692f, 0.490836352109909f, 0.595663845539093f, - 0.490763127803802f, - 0.596040189266205f, 0.490689605474472f, 0.596416532993317f, - 0.490615785121918f, - 0.596792817115784f, 0.490541696548462f, 0.597168982028961f, - 0.490467309951782f, - 0.597545146942139f, 0.490392625331879f, 0.597921252250671f, - 0.490317672491074f, - 0.598297297954559f, 0.490242421627045f, 0.598673284053802f, - 0.490166902542114f, - 0.599049210548401f, 0.490091055631638f, 0.599425077438354f, - 0.490014940500259f, - 0.599800884723663f, 0.489938557147980f, 0.600176632404327f, - 0.489861875772476f, - 0.600552320480347f, 0.489784896373749f, 0.600927948951721f, - 0.489707618951797f, - 0.601303517818451f, 0.489630073308945f, 0.601679027080536f, - 0.489552229642868f, - 0.602054476737976f, 0.489474087953568f, 0.602429866790771f, - 0.489395678043365f, - 0.602805197238922f, 0.489316970109940f, 0.603180468082428f, - 0.489237964153290f, - 0.603555679321289f, 0.489158689975739f, 0.603930830955505f, - 0.489079117774963f, - 0.604305922985077f, 0.488999247550964f, 0.604680955410004f, - 0.488919109106064f, - 0.605055928230286f, 0.488838672637939f, 0.605430841445923f, - 0.488757967948914f, - 0.605805635452271f, 0.488676935434341f, 0.606180429458618f, - 0.488595664501190f, - 0.606555163860321f, 0.488514065742493f, 0.606929838657379f, - 0.488432198762894f, - 0.607304394245148f, 0.488350033760071f, 0.607678949832916f, - 0.488267600536346f, - 0.608053386211395f, 0.488184869289398f, 0.608427822589874f, - 0.488101840019226f, - 0.608802139759064f, 0.488018542528152f, 0.609176397323608f, - 0.487934947013855f, - 0.609550595283508f, 0.487851053476334f, 0.609924793243408f, - 0.487766891717911f, - 0.610298871994019f, 0.487682431936264f, 0.610672831535339f, - 0.487597703933716f, - 0.611046791076660f, 0.487512677907944f, 0.611420691013336f, - 0.487427353858948f, - 0.611794531345367f, 0.487341761589050f, 0.612168252468109f, - 0.487255871295929f, - 0.612541973590851f, 0.487169682979584f, 0.612915575504303f, - 0.487083226442337f, - 0.613289117813110f, 0.486996471881866f, 0.613662600517273f, - 0.486909449100494f, - 0.614036023616791f, 0.486822128295898f, 0.614409387111664f, - 0.486734509468079f, - 0.614782691001892f, 0.486646622419357f, 0.615155875682831f, - 0.486558437347412f, - 0.615529060363770f, 0.486469984054565f, 0.615902125835419f, - 0.486381232738495f, - 0.616275131702423f, 0.486292183399200f, 0.616648077964783f, - 0.486202865839005f, - 0.617020964622498f, 0.486113250255585f, 0.617393791675568f, - 0.486023366451263f, - 0.617766559123993f, 0.485933154821396f, 0.618139207363129f, - 0.485842704772949f, - 0.618511795997620f, 0.485751956701279f, 0.618884325027466f, - 0.485660910606384f, - 0.619256794452667f, 0.485569566488266f, 0.619629204273224f, - 0.485477954149246f, - 0.620001494884491f, 0.485386073589325f, 0.620373785495758f, - 0.485293895006180f, - 0.620745956897736f, 0.485201418399811f, 0.621118068695068f, - 0.485108673572540f, - 0.621490061283112f, 0.485015630722046f, 0.621862053871155f, - 0.484922289848328f, - 0.622233927249908f, 0.484828680753708f, 0.622605800628662f, - 0.484734803438187f, - 0.622977554798126f, 0.484640628099442f, 0.623349189758301f, - 0.484546154737473f, - 0.623720824718475f, 0.484451413154602f, 0.624092340469360f, - 0.484356373548508f, - 0.624463796615601f, 0.484261035919189f, 0.624835193157196f, - 0.484165430068970f, - 0.625206530094147f, 0.484069555997849f, 0.625577747821808f, - 0.483973383903503f, - 0.625948905944824f, 0.483876913785934f, 0.626320004463196f, - 0.483780175447464f, - 0.626691043376923f, 0.483683139085770f, 0.627061963081360f, - 0.483585834503174f, - 0.627432823181152f, 0.483488231897354f, 0.627803623676300f, - 0.483390361070633f, - 0.628174364566803f, 0.483292192220688f, 0.628544986248016f, - 0.483193725347519f, - 0.628915548324585f, 0.483094990253448f, 0.629286050796509f, - 0.482995986938477f, - 0.629656434059143f, 0.482896685600281f, 0.630026817321777f, - 0.482797086238861f, - 0.630397081375122f, 0.482697218656540f, 0.630767226219177f, - 0.482597053050995f, - 0.631137371063232f, 0.482496619224548f, 0.631507396697998f, - 0.482395917177200f, - 0.631877362728119f, 0.482294887304306f, 0.632247209548950f, - 0.482193619012833f, - 0.632616996765137f, 0.482092022895813f, 0.632986724376678f, - 0.481990188360214f, - 0.633356392383575f, 0.481888025999069f, 0.633725941181183f, - 0.481785595417023f, - 0.634095430374146f, 0.481682896614075f, 0.634464859962463f, - 0.481579899787903f, - 0.634834170341492f, 0.481476634740829f, 0.635203421115875f, - 0.481373071670532f, - 0.635572552680969f, 0.481269240379334f, 0.635941684246063f, - 0.481165111064911f, - 0.636310696601868f, 0.481060713529587f, 0.636679589748383f, - 0.480956017971039f, - 0.637048482894897f, 0.480851024389267f, 0.637417197227478f, - 0.480745792388916f, - 0.637785911560059f, 0.480640232563019f, 0.638154506683350f, - 0.480534434318542f, - 0.638523042201996f, 0.480428308248520f, 0.638891458511353f, - 0.480321943759918f, - 0.639259815216064f, 0.480215251445770f, 0.639628112316132f, - 0.480108320713043f, - 0.639996349811554f, 0.480001062154770f, 0.640364408493042f, - 0.479893565177917f, - 0.640732467174530f, 0.479785770177841f, 0.641100406646729f, - 0.479677677154541f, - 0.641468286514282f, 0.479569315910339f, 0.641836047172546f, - 0.479460656642914f, - 0.642203748226166f, 0.479351729154587f, 0.642571389675140f, - 0.479242533445358f, - 0.642938911914825f, 0.479133039712906f, 0.643306374549866f, - 0.479023247957230f, - 0.643673717975616f, 0.478913217782974f, 0.644041001796722f, - 0.478802859783173f, - 0.644408226013184f, 0.478692263364792f, 0.644775331020355f, - 0.478581339120865f, - 0.645142316818237f, 0.478470176458359f, 0.645509302616119f, - 0.478358715772629f, - 0.645876109600067f, 0.478246957063675f, 0.646242916584015f, - 0.478134930133820f, - 0.646609604358673f, 0.478022634983063f, 0.646976172924042f, - 0.477910041809082f, - 0.647342681884766f, 0.477797180414200f, 0.647709131240845f, - 0.477684020996094f, - 0.648075461387634f, 0.477570593357086f, 0.648441672325134f, - 0.477456867694855f, - 0.648807883262634f, 0.477342873811722f, 0.649173915386200f, - 0.477228611707687f, - 0.649539887905121f, 0.477114051580429f, 0.649905800819397f, - 0.476999223232269f, - 0.650271594524384f, 0.476884096860886f, 0.650637328624725f, - 0.476768702268600f, - 0.651003003120422f, 0.476653009653091f, 0.651368498802185f, - 0.476537048816681f, - 0.651733994483948f, 0.476420819759369f, 0.652099311351776f, - 0.476304292678833f, - 0.652464628219604f, 0.476187497377396f, 0.652829825878143f, - 0.476070433855057f, - 0.653194904327393f, 0.475953072309494f, 0.653559923171997f, - 0.475835442543030f, - 0.653924822807312f, 0.475717514753342f, 0.654289662837982f, - 0.475599318742752f, - 0.654654383659363f, 0.475480824708939f, 0.655019044876099f, - 0.475362062454224f, - 0.655383586883545f, 0.475243031978607f, 0.655748009681702f, - 0.475123733282089f, - 0.656112432479858f, 0.475004136562347f, 0.656476676464081f, - 0.474884241819382f, - 0.656840860843658f, 0.474764078855515f, 0.657204985618591f, - 0.474643647670746f, - 0.657568991184235f, 0.474522948265076f, 0.657932877540588f, - 0.474401950836182f, - 0.658296704292297f, 0.474280685186386f, 0.658660411834717f, - 0.474159121513367f, - 0.659024059772491f, 0.474037289619446f, 0.659387588500977f, - 0.473915189504623f, - 0.659750998020172f, 0.473792791366577f, 0.660114347934723f, - 0.473670125007629f, - 0.660477638244629f, 0.473547190427780f, 0.660840749740601f, - 0.473423957824707f, - 0.661203861236572f, 0.473300457000732f, 0.661566793918610f, - 0.473176687955856f, - 0.661929666996002f, 0.473052620887756f, 0.662292480468750f, - 0.472928285598755f, - 0.662655174732208f, 0.472803652286530f, 0.663017749786377f, - 0.472678780555725f, - 0.663380205631256f, 0.472553610801697f, 0.663742601871490f, - 0.472428143024445f, - 0.664104938507080f, 0.472302407026291f, 0.664467096328735f, - 0.472176402807236f, - 0.664829254150391f, 0.472050130367279f, 0.665191233158112f, - 0.471923559904099f, - 0.665553152561188f, 0.471796721220016f, 0.665914952754974f, - 0.471669614315033f, - 0.666276693344116f, 0.471542209386826f, 0.666638314723969f, - 0.471414536237717f, - 0.666999816894531f, 0.471286594867706f, 0.667361259460449f, - 0.471158385276794f, - 0.667722582817078f, 0.471029877662659f, 0.668083786964417f, - 0.470901101827621f, - 0.668444931507111f, 0.470772027969360f, 0.668805956840515f, - 0.470642685890198f, - 0.669166862964630f, 0.470513075590134f, 0.669527709484100f, - 0.470383197069168f, - 0.669888436794281f, 0.470253020524979f, 0.670249044895172f, - 0.470122605562210f, - 0.670609593391418f, 0.469991862773895f, 0.670970022678375f, - 0.469860881567001f, - 0.671330332756042f, 0.469729602336884f, 0.671690583229065f, - 0.469598054885864f, - 0.672050714492798f, 0.469466239213943f, 0.672410726547241f, - 0.469334155321121f, - 0.672770678997040f, 0.469201773405075f, 0.673130512237549f, - 0.469069123268127f, - 0.673490226268768f, 0.468936175107956f, 0.673849821090698f, - 0.468802988529205f, - 0.674209356307983f, 0.468669503927231f, 0.674568772315979f, - 0.468535751104355f, - 0.674928069114685f, 0.468401730060577f, 0.675287246704102f, - 0.468267410993576f, - 0.675646364688873f, 0.468132823705673f, 0.676005363464355f, - 0.467997968196869f, - 0.676364302635193f, 0.467862844467163f, 0.676723062992096f, - 0.467727422714233f, - 0.677081763744354f, 0.467591762542725f, 0.677440345287323f, - 0.467455804347992f, - 0.677798807621002f, 0.467319577932358f, 0.678157210350037f, - 0.467183053493500f, - 0.678515493869781f, 0.467046260833740f, 0.678873658180237f, - 0.466909229755402f, - 0.679231703281403f, 0.466771900653839f, 0.679589688777924f, - 0.466634273529053f, - 0.679947495460510f, 0.466496407985687f, 0.680305242538452f, - 0.466358244419098f, - 0.680662930011749f, 0.466219812631607f, 0.681020438671112f, - 0.466081112623215f, - 0.681377887725830f, 0.465942144393921f, 0.681735157966614f, - 0.465802878141403f, - 0.682092368602753f, 0.465663343667984f, 0.682449519634247f, - 0.465523540973663f, - 0.682806491851807f, 0.465383470058441f, 0.683163404464722f, - 0.465243130922318f, - 0.683520197868347f, 0.465102523565292f, 0.683876872062683f, - 0.464961618185043f, - 0.684233427047729f, 0.464820444583893f, 0.684589862823486f, - 0.464679002761841f, - 0.684946238994598f, 0.464537292718887f, 0.685302436351776f, - 0.464395314455032f, - 0.685658574104309f, 0.464253038167953f, 0.686014592647552f, - 0.464110493659973f, - 0.686370551586151f, 0.463967710733414f, 0.686726331710815f, - 0.463824629783630f, - 0.687082052230835f, 0.463681250810623f, 0.687437593936920f, - 0.463537633419037f, - 0.687793076038361f, 0.463393747806549f, 0.688148438930511f, - 0.463249564170837f, - 0.688503682613373f, 0.463105112314224f, 0.688858866691589f, - 0.462960392236710f, - 0.689213871955872f, 0.462815403938293f, 0.689568817615509f, - 0.462670147418976f, - 0.689923584461212f, 0.462524622678757f, 0.690278291702271f, - 0.462378799915314f, - 0.690632879734039f, 0.462232738733292f, 0.690987348556519f, - 0.462086379528046f, - 0.691341698169708f, 0.461939752101898f, 0.691695988178253f, - 0.461792886257172f, - 0.692050099372864f, 0.461645722389221f, 0.692404091358185f, - 0.461498260498047f, - 0.692758023738861f, 0.461350560188293f, 0.693111836910248f, - 0.461202591657639f, - 0.693465530872345f, 0.461054325103760f, 0.693819046020508f, - 0.460905820131302f, - 0.694172501564026f, 0.460757017135620f, 0.694525837898254f, - 0.460607945919037f, - 0.694879114627838f, 0.460458606481552f, 0.695232212543488f, - 0.460309028625488f, - 0.695585191249847f, 0.460159152746201f, 0.695938050746918f, - 0.460008978843689f, - 0.696290850639343f, 0.459858566522598f, 0.696643471717834f, - 0.459707885980606f, - 0.696996033191681f, 0.459556937217712f, 0.697348415851593f, - 0.459405690431595f, - 0.697700738906860f, 0.459254205226898f, 0.698052942752838f, - 0.459102421998978f, - 0.698404967784882f, 0.458950400352478f, 0.698756933212280f, - 0.458798080682755f, - 0.699108779430389f, 0.458645492792130f, 0.699460506439209f, - 0.458492636680603f, - 0.699812114238739f, 0.458339542150497f, 0.700163602828979f, - 0.458186149597168f, - 0.700514972209930f, 0.458032488822937f, 0.700866222381592f, - 0.457878559827805f, - 0.701217353343964f, 0.457724362611771f, 0.701568365097046f, - 0.457569897174835f, - 0.701919257640839f, 0.457415163516998f, 0.702270030975342f, - 0.457260161638260f, - 0.702620685100555f, 0.457104891538620f, 0.702971220016479f, - 0.456949323415756f, - 0.703321635723114f, 0.456793516874313f, 0.703671932220459f, - 0.456637442111969f, - 0.704022109508514f, 0.456481099128723f, 0.704372167587280f, - 0.456324487924576f, - 0.704722046852112f, 0.456167578697205f, 0.705071866512299f, - 0.456010431051254f, - 0.705421566963196f, 0.455853015184402f, 0.705771148204803f, - 0.455695331096649f, - 0.706120610237122f, 0.455537378787994f, 0.706469953060150f, - 0.455379128456116f, - 0.706819176673889f, 0.455220639705658f, 0.707168221473694f, - 0.455061882734299f, - 0.707517206668854f, 0.454902857542038f, 0.707866072654724f, - 0.454743564128876f, - 0.708214759826660f, 0.454584002494812f, 0.708563387393951f, - 0.454424172639847f, - 0.708911836147308f, 0.454264044761658f, 0.709260225296021f, - 0.454103678464890f, - 0.709608435630798f, 0.453943043947220f, 0.709956526756287f, - 0.453782171010971f, - 0.710304558277130f, 0.453621000051498f, 0.710652410984039f, - 0.453459560871124f, - 0.711000144481659f, 0.453297853469849f, 0.711347758769989f, - 0.453135877847672f, - 0.711695253849030f, 0.452973634004593f, 0.712042629718781f, - 0.452811151742935f, - 0.712389826774597f, 0.452648371458054f, 0.712736964225769f, - 0.452485352754593f, - 0.713083922863007f, 0.452322036027908f, 0.713430821895599f, - 0.452158480882645f, - 0.713777542114258f, 0.451994657516479f, 0.714124143123627f, - 0.451830536127090f, - 0.714470624923706f, 0.451666176319122f, 0.714816987514496f, - 0.451501548290253f, - 0.715163230895996f, 0.451336652040482f, 0.715509355068207f, - 0.451171487569809f, - 0.715855300426483f, 0.451006084680557f, 0.716201186180115f, - 0.450840383768082f, - 0.716546893119812f, 0.450674414634705f, 0.716892480850220f, - 0.450508207082748f, - 0.717238008975983f, 0.450341701507568f, 0.717583298683167f, - 0.450174957513809f, - 0.717928528785706f, 0.450007945299149f, 0.718273639678955f, - 0.449840664863586f, - 0.718618571758270f, 0.449673116207123f, 0.718963444232941f, - 0.449505299329758f, - 0.719308137893677f, 0.449337244033813f, 0.719652712345123f, - 0.449168890714645f, - 0.719997107982636f, 0.449000298976898f, 0.720341444015503f, - 0.448831409215927f, - 0.720685660839081f, 0.448662281036377f, 0.721029698848724f, - 0.448492884635925f, - 0.721373617649078f, 0.448323249816895f, 0.721717417240143f, - 0.448153316974640f, - 0.722061097621918f, 0.447983115911484f, 0.722404599189758f, - 0.447812676429749f, - 0.722747981548309f, 0.447641968727112f, 0.723091304302216f, - 0.447470992803574f, - 0.723434448242188f, 0.447299748659134f, 0.723777413368225f, - 0.447128236293793f, - 0.724120318889618f, 0.446956485509872f, 0.724463045597076f, - 0.446784436702728f, - 0.724805653095245f, 0.446612149477005f, 0.725148141384125f, - 0.446439594030380f, - 0.725490510463715f, 0.446266770362854f, 0.725832700729370f, - 0.446093708276749f, - 0.726174771785736f, 0.445920348167419f, 0.726516723632813f, - 0.445746749639511f, - 0.726858556270599f, 0.445572882890701f, 0.727200269699097f, - 0.445398747920990f, - 0.727541804313660f, 0.445224374532700f, 0.727883219718933f, - 0.445049703121185f, - 0.728224515914917f, 0.444874793291092f, 0.728565633296967f, - 0.444699615240097f, - 0.728906631469727f, 0.444524168968201f, 0.729247510433197f, - 0.444348484277725f, - 0.729588270187378f, 0.444172531366348f, 0.729928910732269f, - 0.443996280431747f, - 0.730269372463226f, 0.443819820880890f, 0.730609714984894f, - 0.443643063306808f, - 0.730949878692627f, 0.443466067314148f, 0.731289982795715f, - 0.443288803100586f, - 0.731629908084869f, 0.443111270666122f, 0.731969714164734f, - 0.442933470010757f, - 0.732309341430664f, 0.442755430936813f, 0.732648849487305f, - 0.442577123641968f, - 0.732988238334656f, 0.442398548126221f, 0.733327507972717f, - 0.442219734191895f, - 0.733666598796844f, 0.442040622234344f, 0.734005570411682f, - 0.441861271858215f, - 0.734344422817230f, 0.441681683063507f, 0.734683096408844f, - 0.441501796245575f, - 0.735021650791168f, 0.441321671009064f, 0.735360085964203f, - 0.441141277551651f, - 0.735698342323303f, 0.440960645675659f, 0.736036539077759f, - 0.440779715776443f, - 0.736374497413635f, 0.440598547458649f, 0.736712396144867f, - 0.440417140722275f, - 0.737050116062164f, 0.440235435962677f, 0.737387716770172f, - 0.440053492784500f, - 0.737725138664246f, 0.439871311187744f, 0.738062441349030f, - 0.439688831567764f, - 0.738399624824524f, 0.439506113529205f, 0.738736629486084f, - 0.439323127269745f, - 0.739073514938354f, 0.439139902591705f, 0.739410281181335f, - 0.438956409692764f, - 0.739746868610382f, 0.438772648572922f, 0.740083336830139f, - 0.438588619232178f, - 0.740419685840607f, 0.438404351472855f, 0.740755856037140f, - 0.438219845294952f, - 0.741091907024384f, 0.438035041093826f, 0.741427779197693f, - 0.437849998474121f, - 0.741763532161713f, 0.437664687633514f, 0.742099165916443f, - 0.437479138374329f, - 0.742434620857239f, 0.437293320894241f, 0.742769956588745f, - 0.437107264995575f, - 0.743105113506317f, 0.436920911073685f, 0.743440151214600f, - 0.436734348535538f, - 0.743775069713593f, 0.436547487974167f, 0.744109809398651f, - 0.436360388994217f, - 0.744444429874420f, 0.436173021793365f, 0.744778931140900f, - 0.435985416173935f, - 0.745113253593445f, 0.435797542333603f, 0.745447397232056f, - 0.435609430074692f, - 0.745781481266022f, 0.435421019792557f, 0.746115326881409f, - 0.435232400894165f, - 0.746449112892151f, 0.435043483972549f, 0.746782720088959f, - 0.434854328632355f, - 0.747116148471832f, 0.434664934873581f, 0.747449457645416f, - 0.434475272893906f, - 0.747782647609711f, 0.434285342693329f, 0.748115658760071f, - 0.434095174074173f, - 0.748448550701141f, 0.433904737234116f, 0.748781263828278f, - 0.433714061975479f, - 0.749113857746124f, 0.433523118495941f, 0.749446272850037f, - 0.433331936597824f, - 0.749778568744659f, 0.433140486478806f, 0.750110685825348f, - 0.432948768138886f, - 0.750442683696747f, 0.432756811380386f, 0.750774562358856f, - 0.432564586400986f, - 0.751106262207031f, 0.432372123003006f, 0.751437783241272f, - 0.432179391384125f, - 0.751769185066223f, 0.431986421346664f, 0.752100467681885f, - 0.431793183088303f, - 0.752431571483612f, 0.431599706411362f, 0.752762496471405f, - 0.431405961513519f, - 0.753093302249908f, 0.431211978197098f, 0.753423988819122f, - 0.431017726659775f, - 0.753754496574402f, 0.430823236703873f, 0.754084885120392f, - 0.430628478527069f, - 0.754415094852448f, 0.430433481931686f, 0.754745125770569f, - 0.430238217115402f, - 0.755075037479401f, 0.430042684078217f, 0.755404829978943f, - 0.429846942424774f, - 0.755734443664551f, 0.429650902748108f, 0.756063878536224f, - 0.429454624652863f, - 0.756393194198608f, 0.429258108139038f, 0.756722390651703f, - 0.429061323404312f, - 0.757051348686218f, 0.428864300251007f, 0.757380247116089f, - 0.428667008876801f, - 0.757708966732025f, 0.428469479084015f, 0.758037507534027f, - 0.428271710872650f, - 0.758365929126740f, 0.428073674440384f, 0.758694171905518f, - 0.427875369787216f, - 0.759022235870361f, 0.427676826715469f, 0.759350180625916f, - 0.427478045225143f, - 0.759678006172180f, 0.427278995513916f, 0.760005652904511f, - 0.427079707384110f, - 0.760333120822906f, 0.426880151033401f, 0.760660469532013f, - 0.426680356264114f, - 0.760987639427185f, 0.426480293273926f, 0.761314690113068f, - 0.426279991865158f, - 0.761641561985016f, 0.426079452037811f, 0.761968255043030f, - 0.425878643989563f, - 0.762294828891754f, 0.425677597522736f, 0.762621283531189f, - 0.425476282835007f, - 0.762947499752045f, 0.425274729728699f, 0.763273596763611f, - 0.425072938203812f, - 0.763599574565887f, 0.424870878458023f, 0.763925373554230f, - 0.424668580293655f, - 0.764250993728638f, 0.424466013908386f, 0.764576494693756f, - 0.424263238906860f, - 0.764901816844940f, 0.424060165882111f, 0.765226960182190f, - 0.423856884241104f, - 0.765551984310150f, 0.423653304576874f, 0.765876889228821f, - 0.423449516296387f, - 0.766201555728912f, 0.423245459794998f, 0.766526103019714f, - 0.423041164875031f, - 0.766850471496582f, 0.422836631536484f, 0.767174720764160f, - 0.422631829977036f, - 0.767498791217804f, 0.422426789999008f, 0.767822742462158f, - 0.422221481800079f, - 0.768146514892578f, 0.422015935182571f, 0.768470108509064f, - 0.421810150146484f, - 0.768793523311615f, 0.421604126691818f, 0.769116818904877f, - 0.421397835016251f, - 0.769439935684204f, 0.421191304922104f, 0.769762933254242f, - 0.420984506607056f, - 0.770085752010345f, 0.420777499675751f, 0.770408391952515f, - 0.420570224523544f, - 0.770730912685394f, 0.420362681150436f, 0.771053194999695f, - 0.420154929161072f, - 0.771375417709351f, 0.419946908950806f, 0.771697402000427f, - 0.419738620519638f, - 0.772019267082214f, 0.419530123472214f, 0.772340953350067f, - 0.419321358203888f, - 0.772662520408630f, 0.419112354516983f, 0.772983849048615f, - 0.418903112411499f, - 0.773305058479309f, 0.418693602085114f, 0.773626148700714f, - 0.418483853340149f, - 0.773947000503540f, 0.418273866176605f, 0.774267733097076f, - 0.418063640594482f, - 0.774588346481323f, 0.417853146791458f, 0.774908721446991f, - 0.417642414569855f, - 0.775228977203369f, 0.417431443929672f, 0.775549054145813f, - 0.417220205068588f, - 0.775869011878967f, 0.417008757591248f, 0.776188731193542f, - 0.416797041893005f, - 0.776508331298828f, 0.416585087776184f, 0.776827812194824f, - 0.416372895240784f, - 0.777147054672241f, 0.416160434484482f, 0.777466177940369f, - 0.415947735309601f, - 0.777785122394562f, 0.415734797716141f, 0.778103888034821f, - 0.415521621704102f, - 0.778422534465790f, 0.415308207273483f, 0.778741002082825f, - 0.415094524621964f, - 0.779059290885925f, 0.414880603551865f, 0.779377400875092f, - 0.414666473865509f, - 0.779695332050323f, 0.414452046155930f, 0.780013144016266f, - 0.414237409830093f, - 0.780330777168274f, 0.414022535085678f, 0.780648231506348f, - 0.413807392120361f, - 0.780965566635132f, 0.413592010736465f, 0.781282722949982f, - 0.413376390933990f, - 0.781599700450897f, 0.413160532712936f, 0.781916499137878f, - 0.412944436073303f, - 0.782233119010925f, 0.412728071212769f, 0.782549619674683f, - 0.412511497735977f, - 0.782865881919861f, 0.412294656038284f, 0.783182024955750f, - 0.412077575922012f, - 0.783498048782349f, 0.411860257387161f, 0.783813834190369f, - 0.411642700433731f, - 0.784129500389099f, 0.411424905061722f, 0.784444928169250f, - 0.411206841468811f, - 0.784760236740112f, 0.410988569259644f, 0.785075426101685f, - 0.410770028829575f, - 0.785390377044678f, 0.410551249980927f, 0.785705149173737f, - 0.410332232713699f, - 0.786019802093506f, 0.410112977027893f, 0.786334276199341f, - 0.409893482923508f, - 0.786648571491241f, 0.409673750400543f, 0.786962687969208f, - 0.409453779459000f, - 0.787276685237885f, 0.409233570098877f, 0.787590444087982f, - 0.409013092517853f, - 0.787904083728790f, 0.408792406320572f, 0.788217544555664f, - 0.408571451902390f, - 0.788530826568604f, 0.408350288867950f, 0.788843929767609f, - 0.408128857612610f, - 0.789156913757324f, 0.407907217741013f, 0.789469659328461f, - 0.407685309648514f, - 0.789782285690308f, 0.407463163137436f, 0.790094733238220f, - 0.407240778207779f, - 0.790407001972198f, 0.407018154859543f, 0.790719091892242f, - 0.406795293092728f, - 0.791031002998352f, 0.406572192907333f, 0.791342735290527f, - 0.406348884105682f, - 0.791654348373413f, 0.406125307083130f, 0.791965723037720f, - 0.405901491641998f, - 0.792276978492737f, 0.405677437782288f, 0.792588055133820f, - 0.405453115701675f, - 0.792898952960968f, 0.405228585004807f, 0.793209671974182f, - 0.405003815889359f, - 0.793520212173462f, 0.404778808355331f, 0.793830573558807f, - 0.404553562402725f, - 0.794140756130219f, 0.404328078031540f, 0.794450819492340f, - 0.404102355241776f, - 0.794760644435883f, 0.403876423835754f, 0.795070350170136f, - 0.403650224208832f, - 0.795379877090454f, 0.403423786163330f, 0.795689165592194f, - 0.403197109699249f, - 0.795998334884644f, 0.402970194816589f, 0.796307325363159f, - 0.402743041515350f, - 0.796616137027740f, 0.402515679597855f, 0.796924769878387f, - 0.402288049459457f, - 0.797233223915100f, 0.402060180902481f, 0.797541558742523f, - 0.401832103729248f, - 0.797849655151367f, 0.401603758335114f, 0.798157572746277f, - 0.401375204324722f, - 0.798465371131897f, 0.401146411895752f, 0.798772931098938f, - 0.400917351245880f, - 0.799080371856689f, 0.400688081979752f, 0.799387574195862f, - 0.400458574295044f, - 0.799694657325745f, 0.400228828191757f, 0.800001561641693f, - 0.399998843669891f, - 0.800308227539063f, 0.399768620729446f, 0.800614774227142f, - 0.399538189172745f, - 0.800921142101288f, 0.399307489395142f, 0.801227271556854f, - 0.399076581001282f, - 0.801533281803131f, 0.398845434188843f, 0.801839113235474f, - 0.398614019155502f, - 0.802144765853882f, 0.398382395505905f, 0.802450239658356f, - 0.398150533437729f, - 0.802755534648895f, 0.397918462753296f, 0.803060650825500f, - 0.397686123847961f, - 0.803365588188171f, 0.397453576326370f, 0.803670346736908f, - 0.397220760583878f, - 0.803974866867065f, 0.396987736225128f, 0.804279267787933f, - 0.396754473447800f, - 0.804583489894867f, 0.396520972251892f, 0.804887533187866f, - 0.396287262439728f, - 0.805191397666931f, 0.396053284406662f, 0.805495083332062f, - 0.395819097757339f, - 0.805798590183258f, 0.395584672689438f, 0.806101918220520f, - 0.395350009202957f, - 0.806405067443848f, 0.395115107297897f, 0.806707978248596f, - 0.394879996776581f, - 0.807010769844055f, 0.394644618034363f, 0.807313382625580f, - 0.394409030675888f, - 0.807615816593170f, 0.394173204898834f, 0.807918012142181f, - 0.393937170505524f, - 0.808220088481903f, 0.393700867891312f, 0.808521986007690f, - 0.393464356660843f, - 0.808823645114899f, 0.393227607011795f, 0.809125185012817f, - 0.392990618944168f, - 0.809426486492157f, 0.392753422260284f, 0.809727668762207f, - 0.392515957355499f, - 0.810028612613678f, 0.392278283834457f, 0.810329377651215f, - 0.392040401697159f, - 0.810629963874817f, 0.391802251338959f, 0.810930430889130f, - 0.391563892364502f, - 0.811230659484863f, 0.391325294971466f, 0.811530709266663f, - 0.391086459159851f, - 0.811830580234528f, 0.390847414731979f, 0.812130272388458f, - 0.390608131885529f, - 0.812429726123810f, 0.390368610620499f, 0.812729060649872f, - 0.390128880739212f, - 0.813028216362000f, 0.389888882637024f, 0.813327133655548f, - 0.389648675918579f, - 0.813625931739807f, 0.389408260583878f, 0.813924491405487f, - 0.389167606830597f, - 0.814222872257233f, 0.388926714658737f, 0.814521074295044f, - 0.388685584068298f, - 0.814819097518921f, 0.388444244861603f, 0.815116941928864f, - 0.388202667236328f, - 0.815414607524872f, 0.387960851192474f, 0.815712094306946f, - 0.387718826532364f, - 0.816009342670441f, 0.387476563453674f, 0.816306471824646f, - 0.387234061956406f, - 0.816603362560272f, 0.386991351842880f, 0.816900074481964f, - 0.386748403310776f, - 0.817196667194366f, 0.386505216360092f, 0.817493021488190f, - 0.386261820793152f, - 0.817789137363434f, 0.386018186807632f, 0.818085134029388f, - 0.385774344205856f, - 0.818380951881409f, 0.385530263185501f, 0.818676531314850f, - 0.385285943746567f, - 0.818971931934357f, 0.385041415691376f, 0.819267153739929f, - 0.384796649217606f, - 0.819562196731567f, 0.384551674127579f, 0.819857060909271f, - 0.384306460618973f, - 0.820151746273041f, 0.384061008691788f, 0.820446193218231f, - 0.383815348148346f, - 0.820740520954132f, 0.383569449186325f, 0.821034610271454f, - 0.383323341608047f, - 0.821328520774841f, 0.383076995611191f, 0.821622252464294f, - 0.382830440998077f, - 0.821915745735168f, 0.382583618164063f, 0.822209119796753f, - 0.382336616516113f, - 0.822502255439758f, 0.382089376449585f, 0.822795212268829f, - 0.381841897964478f, - 0.823087990283966f, 0.381594210863113f, 0.823380589485168f, - 0.381346285343170f, - 0.823673009872437f, 0.381098151206970f, 0.823965191841125f, - 0.380849778652191f, - 0.824257194995880f, 0.380601197481155f, 0.824549019336700f, - 0.380352377891541f, - 0.824840664863586f, 0.380103349685669f, 0.825132071971893f, - 0.379854083061218f, - 0.825423359870911f, 0.379604607820511f, 0.825714409351349f, - 0.379354894161224f, - 0.826005280017853f, 0.379104942083359f, 0.826295912265778f, - 0.378854811191559f, - 0.826586425304413f, 0.378604412078857f, 0.826876699924469f, - 0.378353834152222f, - 0.827166795730591f, 0.378102988004684f, 0.827456712722778f, - 0.377851963043213f, - 0.827746450901031f, 0.377600699663162f, 0.828035950660706f, - 0.377349197864532f, - 0.828325271606445f, 0.377097487449646f, 0.828614413738251f, - 0.376845568418503f, - 0.828903317451477f, 0.376593410968781f, 0.829192101955414f, - 0.376341015100479f, - 0.829480648040771f, 0.376088410615921f, 0.829769015312195f, - 0.375835597515106f, - 0.830057144165039f, 0.375582575798035f, 0.830345153808594f, - 0.375329315662384f, - 0.830632925033569f, 0.375075817108154f, 0.830920517444611f, - 0.374822109937668f, - 0.831207871437073f, 0.374568194150925f, 0.831495106220245f, - 0.374314039945602f, - 0.831782102584839f, 0.374059677124023f, 0.832068860530853f, - 0.373805105686188f, - 0.832355499267578f, 0.373550295829773f, 0.832641899585724f, - 0.373295277357101f, - 0.832928121089935f, 0.373040050268173f, 0.833214163780212f, - 0.372784584760666f, - 0.833499968051910f, 0.372528880834579f, 0.833785593509674f, - 0.372272998094559f, - 0.834071040153503f, 0.372016876935959f, 0.834356248378754f, - 0.371760547161102f, - 0.834641277790070f, 0.371503978967667f, 0.834926128387451f, - 0.371247202157974f, - 0.835210800170898f, 0.370990216732025f, 0.835495233535767f, - 0.370732992887497f, - 0.835779488086700f, 0.370475560426712f, 0.836063504219055f, - 0.370217919349670f, - 0.836347401142120f, 0.369960039854050f, 0.836631059646606f, - 0.369701951742172f, - 0.836914479732513f, 0.369443655014038f, 0.837197780609131f, - 0.369185149669647f, - 0.837480843067169f, 0.368926405906677f, 0.837763667106628f, - 0.368667453527451f, - 0.838046371936798f, 0.368408292531967f, 0.838328838348389f, - 0.368148893117905f, - 0.838611066341400f, 0.367889285087585f, 0.838893175125122f, - 0.367629468441010f, - 0.839175045490265f, 0.367369443178177f, 0.839456677436829f, - 0.367109179496765f, - 0.839738130569458f, 0.366848707199097f, 0.840019404888153f, - 0.366588026285172f, - 0.840300500392914f, 0.366327136754990f, 0.840581357479095f, - 0.366066008806229f, - 0.840862035751343f, 0.365804702043533f, 0.841142535209656f, - 0.365543156862259f, - 0.841422796249390f, 0.365281373262405f, 0.841702818870544f, - 0.365019410848618f, - 0.841982722282410f, 0.364757210016251f, 0.842262387275696f, - 0.364494800567627f, - 0.842541813850403f, 0.364232182502747f, 0.842821121215820f, - 0.363969355821610f, - 0.843100130558014f, 0.363706320524216f, 0.843379020690918f, - 0.363443046808243f, - 0.843657672405243f, 0.363179564476013f, 0.843936145305634f, - 0.362915903329849f, - 0.844214379787445f, 0.362651973962784f, 0.844492435455322f, - 0.362387865781784f, - 0.844770252704620f, 0.362123548984528f, 0.845047891139984f, - 0.361858993768692f, - 0.845325350761414f, 0.361594229936600f, 0.845602571964264f, - 0.361329287290573f, - 0.845879614353180f, 0.361064106225967f, 0.846156477928162f, - 0.360798716545105f, - 0.846433103084564f, 0.360533088445663f, 0.846709489822388f, - 0.360267281532288f, - 0.846985757350922f, 0.360001266002655f, 0.847261726856232f, - 0.359735012054443f, - 0.847537577152252f, 0.359468549489975f, 0.847813189029694f, - 0.359201908111572f, - 0.848088562488556f, 0.358935028314590f, 0.848363757133484f, - 0.358667939901352f, - 0.848638772964478f, 0.358400642871857f, 0.848913550376892f, - 0.358133137226105f, - 0.849188148975372f, 0.357865422964096f, 0.849462509155273f, - 0.357597470283508f, - 0.849736690521240f, 0.357329338788986f, 0.850010633468628f, - 0.357060998678207f, - 0.850284397602081f, 0.356792420148849f, 0.850557923316956f, - 0.356523662805557f, - 0.850831270217896f, 0.356254696846008f, 0.851104438304901f, - 0.355985492467880f, - 0.851377367973328f, 0.355716109275818f, 0.851650118827820f, - 0.355446487665176f, - 0.851922631263733f, 0.355176687240601f, 0.852194905281067f, - 0.354906648397446f, - 0.852467060089111f, 0.354636400938034f, 0.852738916873932f, - 0.354365974664688f, - 0.853010654449463f, 0.354095309972763f, 0.853282094001770f, - 0.353824466466904f, - 0.853553414344788f, 0.353553384542465f, 0.853824436664581f, - 0.353282123804092f, - 0.854095339775085f, 0.353010624647141f, 0.854365944862366f, - 0.352738946676254f, - 0.854636430740356f, 0.352467030286789f, 0.854906618595123f, - 0.352194935083389f, - 0.855176687240601f, 0.351922631263733f, 0.855446517467499f, - 0.351650089025497f, - 0.855716109275818f, 0.351377367973328f, 0.855985522270203f, - 0.351104438304901f, - 0.856254696846008f, 0.350831300020218f, 0.856523692607880f, - 0.350557953119278f, - 0.856792449951172f, 0.350284397602081f, 0.857060968875885f, - 0.350010633468628f, - 0.857329368591309f, 0.349736660718918f, 0.857597470283508f, - 0.349462509155273f, - 0.857865393161774f, 0.349188119173050f, 0.858133137226105f, - 0.348913550376892f, - 0.858400642871857f, 0.348638743162155f, 0.858667910099030f, - 0.348363757133484f, - 0.858934998512268f, 0.348088562488556f, 0.859201908111572f, - 0.347813159227371f, - 0.859468579292297f, 0.347537547349930f, 0.859735012054443f, - 0.347261756658554f, - 0.860001266002655f, 0.346985727548599f, 0.860267281532288f, - 0.346709519624710f, - 0.860533118247986f, 0.346433073282242f, 0.860798716545105f, - 0.346156448125839f, - 0.861064076423645f, 0.345879614353180f, 0.861329257488251f, - 0.345602601766586f, - 0.861594259738922f, 0.345325350761414f, 0.861859023571014f, - 0.345047920942307f, - 0.862123548984528f, 0.344770282506943f, 0.862387895584106f, - 0.344492435455322f, - 0.862652003765106f, 0.344214379787445f, 0.862915873527527f, - 0.343936115503311f, - 0.863179564476013f, 0.343657672405243f, 0.863443076610565f, - 0.343379020690918f, - 0.863706290721893f, 0.343100160360336f, 0.863969385623932f, - 0.342821091413498f, - 0.864232182502747f, 0.342541843652725f, 0.864494800567627f, - 0.342262357473373f, - 0.864757239818573f, 0.341982692480087f, 0.865019381046295f, - 0.341702848672867f, - 0.865281403064728f, 0.341422766447067f, 0.865543127059937f, - 0.341142505407333f, - 0.865804672241211f, 0.340862035751343f, 0.866066038608551f, - 0.340581357479095f, - 0.866327106952667f, 0.340300500392914f, 0.866588056087494f, - 0.340019434690475f, - 0.866848707199097f, 0.339738160371780f, 0.867109179496765f, - 0.339456677436829f, - 0.867369413375854f, 0.339175015687943f, 0.867629468441010f, - 0.338893145322800f, - 0.867889285087585f, 0.338611096143723f, 0.868148922920227f, - 0.338328808546066f, - 0.868408262729645f, 0.338046342134476f, 0.868667483329773f, - 0.337763696908951f, - 0.868926405906677f, 0.337480813264847f, 0.869185149669647f, - 0.337197750806808f, - 0.869443655014038f, 0.336914509534836f, 0.869701981544495f, - 0.336631029844284f, - 0.869960069656372f, 0.336347371339798f, 0.870217919349670f, - 0.336063534021378f, - 0.870475590229034f, 0.335779488086700f, 0.870733022689819f, - 0.335495233535767f, - 0.870990216732025f, 0.335210770368576f, 0.871247172355652f, - 0.334926128387451f, - 0.871503949165344f, 0.334641307592392f, 0.871760547161102f, - 0.334356248378754f, - 0.872016847133636f, 0.334071010351181f, 0.872272968292236f, - 0.333785593509674f, - 0.872528910636902f, 0.333499968051910f, 0.872784554958344f, - 0.333214133977890f, - 0.873040020465851f, 0.332928121089935f, 0.873295307159424f, - 0.332641899585724f, - 0.873550295829773f, 0.332355499267578f, 0.873805105686188f, - 0.332068890333176f, - 0.874059677124023f, 0.331782072782516f, 0.874314069747925f, - 0.331495076417923f, - 0.874568223953247f, 0.331207901239395f, 0.874822139739990f, - 0.330920487642288f, - 0.875075817108154f, 0.330632925033569f, 0.875329315662384f, - 0.330345153808594f, - 0.875582575798035f, 0.330057173967361f, 0.875835597515106f, - 0.329769015312195f, - 0.876088440418243f, 0.329480648040771f, 0.876341044902802f, - 0.329192101955414f, - 0.876593410968781f, 0.328903347253799f, 0.876845538616180f, - 0.328614413738251f, - 0.877097487449646f, 0.328325271606445f, 0.877349197864532f, - 0.328035950660706f, - 0.877600669860840f, 0.327746421098709f, 0.877851963043213f, - 0.327456712722778f, - 0.878103017807007f, 0.327166795730591f, 0.878353834152222f, - 0.326876699924469f, - 0.878604412078857f, 0.326586425304413f, 0.878854811191559f, - 0.326295942068100f, - 0.879104971885681f, 0.326005280017853f, 0.879354894161224f, - 0.325714409351349f, - 0.879604578018188f, 0.325423330068588f, 0.879854083061218f, - 0.325132101774216f, - 0.880103349685669f, 0.324840664863586f, 0.880352377891541f, - 0.324549019336700f, - 0.880601167678833f, 0.324257194995880f, 0.880849778652191f, - 0.323965191841125f, - 0.881098151206970f, 0.323672980070114f, 0.881346285343170f, - 0.323380589485168f, - 0.881594181060791f, 0.323088020086288f, 0.881841897964478f, - 0.322795242071152f, - 0.882089376449585f, 0.322502255439758f, 0.882336616516113f, - 0.322209119796753f, - 0.882583618164063f, 0.321915775537491f, 0.882830440998077f, - 0.321622252464294f, - 0.883076965808868f, 0.321328520774841f, 0.883323311805725f, - 0.321034610271454f, - 0.883569478988647f, 0.320740520954132f, 0.883815348148346f, - 0.320446223020554f, - 0.884061038494110f, 0.320151746273041f, 0.884306430816650f, - 0.319857090711594f, - 0.884551644325256f, 0.319562226533890f, 0.884796679019928f, - 0.319267183542252f, - 0.885041415691376f, 0.318971961736679f, 0.885285973548889f, - 0.318676531314850f, - 0.885530233383179f, 0.318380922079086f, 0.885774314403534f, - 0.318085134029388f, - 0.886018216609955f, 0.317789167165756f, 0.886261820793152f, - 0.317492991685867f, - 0.886505246162415f, 0.317196637392044f, 0.886748373508453f, - 0.316900104284287f, - 0.886991322040558f, 0.316603392362595f, 0.887234091758728f, - 0.316306471824646f, - 0.887476563453674f, 0.316009372472763f, 0.887718796730042f, - 0.315712094306946f, - 0.887960851192474f, 0.315414607524872f, 0.888202667236328f, - 0.315116971731186f, - 0.888444244861603f, 0.314819127321243f, 0.888685584068298f, - 0.314521104097366f, - 0.888926684856415f, 0.314222872257233f, 0.889167606830597f, - 0.313924491405487f, - 0.889408230781555f, 0.313625901937485f, 0.889648675918579f, - 0.313327133655548f, - 0.889888882637024f, 0.313028186559677f, 0.890128850936890f, - 0.312729060649872f, - 0.890368640422821f, 0.312429755926132f, 0.890608131885529f, - 0.312130242586136f, - 0.890847444534302f, 0.311830550432205f, 0.891086459159851f, - 0.311530679464340f, - 0.891325294971466f, 0.311230629682541f, 0.891563892364502f, - 0.310930401086807f, - 0.891802251338959f, 0.310629993677139f, 0.892040371894836f, - 0.310329377651215f, - 0.892278313636780f, 0.310028612613678f, 0.892515957355499f, - 0.309727638959885f, - 0.892753422260284f, 0.309426486492157f, 0.892990648746490f, - 0.309125155210495f, - 0.893227577209473f, 0.308823645114899f, 0.893464326858521f, - 0.308521956205368f, - 0.893700897693634f, 0.308220088481903f, 0.893937170505524f, - 0.307918041944504f, - 0.894173204898834f, 0.307615786790848f, 0.894409060478210f, - 0.307313382625580f, - 0.894644618034363f, 0.307010769844055f, 0.894879996776581f, - 0.306708008050919f, - 0.895115137100220f, 0.306405037641525f, 0.895349979400635f, - 0.306101888418198f, - 0.895584642887115f, 0.305798590183258f, 0.895819067955017f, - 0.305495083332062f, - 0.896053314208984f, 0.305191397666931f, 0.896287262439728f, - 0.304887533187866f, - 0.896520972251892f, 0.304583519697189f, 0.896754503250122f, - 0.304279297590256f, - 0.896987736225128f, 0.303974896669388f, 0.897220790386200f, - 0.303670316934586f, - 0.897453546524048f, 0.303365558385849f, 0.897686123847961f, - 0.303060621023178f, - 0.897918462753296f, 0.302755534648895f, 0.898150563240051f, - 0.302450239658356f, - 0.898382425308228f, 0.302144765853882f, 0.898614048957825f, - 0.301839113235474f, - 0.898845434188843f, 0.301533311605453f, 0.899076581001282f, - 0.301227301359177f, - 0.899307489395142f, 0.300921112298965f, 0.899538159370422f, - 0.300614774227142f, - 0.899768650531769f, 0.300308227539063f, 0.899998843669891f, - 0.300001531839371f, - 0.900228857994080f, 0.299694657325745f, 0.900458574295044f, - 0.299387603998184f, - 0.900688111782074f, 0.299080342054367f, 0.900917351245880f, - 0.298772931098938f, - 0.901146411895752f, 0.298465341329575f, 0.901375174522400f, - 0.298157602548599f, - 0.901603758335114f, 0.297849655151367f, 0.901832103729248f, - 0.297541528940201f, - 0.902060210704803f, 0.297233253717422f, 0.902288019657135f, - 0.296924799680710f, - 0.902515649795532f, 0.296616137027740f, 0.902743041515350f, - 0.296307325363159f, - 0.902970194816589f, 0.295998334884644f, 0.903197109699249f, - 0.295689195394516f, - 0.903423786163330f, 0.295379847288132f, 0.903650224208832f, - 0.295070350170136f, - 0.903876423835754f, 0.294760644435883f, 0.904102385044098f, - 0.294450789690018f, - 0.904328107833862f, 0.294140785932541f, 0.904553592205048f, - 0.293830573558807f, - 0.904778838157654f, 0.293520182371140f, 0.905003845691681f, - 0.293209642171860f, - 0.905228614807129f, 0.292898923158646f, 0.905453145503998f, - 0.292588025331497f, - 0.905677437782288f, 0.292276978492737f, 0.905901491641998f, - 0.291965723037720f, - 0.906125307083130f, 0.291654318571091f, 0.906348884105682f, - 0.291342735290527f, - 0.906572222709656f, 0.291031002998352f, 0.906795322895050f, - 0.290719062089920f, - 0.907018184661865f, 0.290406972169876f, 0.907240808010101f, - 0.290094703435898f, - 0.907463192939758f, 0.289782285690308f, 0.907685279846191f, - 0.289469659328461f, - 0.907907187938690f, 0.289156883955002f, 0.908128857612610f, - 0.288843959569931f, - 0.908350288867950f, 0.288530826568604f, 0.908571481704712f, - 0.288217544555664f, - 0.908792436122894f, 0.287904083728790f, 0.909013092517853f, - 0.287590473890305f, - 0.909233570098877f, 0.287276685237885f, 0.909453809261322f, - 0.286962717771530f, - 0.909673750400543f, 0.286648571491241f, 0.909893512725830f, - 0.286334276199341f, - 0.910112977027893f, 0.286019802093506f, 0.910332262516022f, - 0.285705178976059f, - 0.910551249980927f, 0.285390377044678f, 0.910769999027252f, - 0.285075396299362f, - 0.910988569259644f, 0.284760266542435f, 0.911206841468811f, - 0.284444957971573f, - 0.911424875259399f, 0.284129470586777f, 0.911642670631409f, - 0.283813834190369f, - 0.911860227584839f, 0.283498018980026f, 0.912077546119690f, - 0.283182054758072f, - 0.912294626235962f, 0.282865911722183f, 0.912511467933655f, - 0.282549589872360f, - 0.912728071212769f, 0.282233119010925f, 0.912944436073303f, - 0.281916469335556f, - 0.913160502910614f, 0.281599670648575f, 0.913376390933990f, - 0.281282693147659f, - 0.913592040538788f, 0.280965566635132f, 0.913807392120361f, - 0.280648261308670f, - 0.914022505283356f, 0.280330777168274f, 0.914237439632416f, - 0.280013144016266f, - 0.914452075958252f, 0.279695361852646f, 0.914666473865509f, - 0.279377400875092f, - 0.914880633354187f, 0.279059261083603f, 0.915094554424286f, - 0.278740972280502f, - 0.915308177471161f, 0.278422504663467f, 0.915521621704102f, - 0.278103888034821f, - 0.915734827518463f, 0.277785122394562f, 0.915947735309601f, - 0.277466177940369f, - 0.916160404682159f, 0.277147054672241f, 0.916372895240784f, - 0.276827782392502f, - 0.916585087776184f, 0.276508361101151f, 0.916797041893005f, - 0.276188760995865f, - 0.917008757591248f, 0.275868982076645f, 0.917220234870911f, - 0.275549083948135f, - 0.917431414127350f, 0.275228977203369f, 0.917642414569855f, - 0.274908751249313f, - 0.917853116989136f, 0.274588316679001f, 0.918063640594482f, - 0.274267762899399f, - 0.918273866176605f, 0.273947030305862f, 0.918483853340149f, - 0.273626148700714f, - 0.918693602085114f, 0.273305088281631f, 0.918903112411499f, - 0.272983878850937f, - 0.919112324714661f, 0.272662490606308f, 0.919321358203888f, - 0.272340953350067f, - 0.919530093669891f, 0.272019267082214f, 0.919738650321960f, - 0.271697402000427f, - 0.919946908950806f, 0.271375387907028f, 0.920154929161072f, - 0.271053224802017f, - 0.920362710952759f, 0.270730882883072f, 0.920570194721222f, - 0.270408391952515f, - 0.920777499675751f, 0.270085722208023f, 0.920984506607056f, - 0.269762933254242f, - 0.921191275119781f, 0.269439965486526f, 0.921397805213928f, - 0.269116818904877f, - 0.921604096889496f, 0.268793523311615f, 0.921810150146484f, - 0.268470078706741f, - 0.922015964984894f, 0.268146485090256f, 0.922221481800079f, - 0.267822742462158f, - 0.922426760196686f, 0.267498821020126f, 0.922631800174713f, - 0.267174720764160f, - 0.922836601734161f, 0.266850501298904f, 0.923041164875031f, - 0.266526103019714f, - 0.923245489597321f, 0.266201555728912f, 0.923449516296387f, - 0.265876859426498f, - 0.923653304576874f, 0.265552014112473f, 0.923856854438782f, - 0.265226989984512f, - 0.924060165882111f, 0.264901816844940f, 0.924263238906860f, - 0.264576494693756f, - 0.924466013908386f, 0.264250993728638f, 0.924668610095978f, - 0.263925373554230f, - 0.924870908260345f, 0.263599574565887f, 0.925072908401489f, - 0.263273626565933f, - 0.925274729728699f, 0.262947499752045f, 0.925476312637329f, - 0.262621253728867f, - 0.925677597522736f, 0.262294828891754f, 0.925878643989563f, - 0.261968284845352f, - 0.926079452037811f, 0.261641561985016f, 0.926280021667480f, - 0.261314690113068f, - 0.926480293273926f, 0.260987639427185f, 0.926680326461792f, - 0.260660469532013f, - 0.926880121231079f, 0.260333120822906f, 0.927079677581787f, - 0.260005623102188f, - 0.927278995513916f, 0.259678006172180f, 0.927478015422821f, - 0.259350210428238f, - 0.927676856517792f, 0.259022265672684f, 0.927875399589539f, - 0.258694142103195f, - 0.928073644638062f, 0.258365899324417f, 0.928271710872650f, - 0.258037507534027f, - 0.928469479084015f, 0.257708936929703f, 0.928667008876801f, - 0.257380217313766f, - 0.928864300251007f, 0.257051378488541f, 0.929061353206635f, - 0.256722360849380f, - 0.929258108139038f, 0.256393194198608f, 0.929454624652863f, - 0.256063878536224f, - 0.929650902748108f, 0.255734413862228f, 0.929846942424774f, - 0.255404800176620f, - 0.930042684078217f, 0.255075037479401f, 0.930238187313080f, - 0.254745125770569f, - 0.930433452129364f, 0.254415065050125f, 0.930628478527069f, - 0.254084855318069f, - 0.930823206901550f, 0.253754496574402f, 0.931017756462097f, - 0.253423988819122f, - 0.931211948394775f, 0.253093332052231f, 0.931405961513519f, - 0.252762526273727f, - 0.931599736213684f, 0.252431541681290f, 0.931793212890625f, - 0.252100437879562f, - 0.931986451148987f, 0.251769185066223f, 0.932179391384125f, - 0.251437783241272f, - 0.932372152805328f, 0.251106232404709f, 0.932564616203308f, - 0.250774532556534f, - 0.932756841182709f, 0.250442683696747f, 0.932948768138886f, - 0.250110685825348f, - 0.933140456676483f, 0.249778553843498f, 0.933331906795502f, - 0.249446272850037f, - 0.933523118495941f, 0.249113827943802f, 0.933714091777802f, - 0.248781248927116f, - 0.933904767036438f, 0.248448520898819f, 0.934095203876495f, - 0.248115643858910f, - 0.934285342693329f, 0.247782632708550f, 0.934475243091583f, - 0.247449472546577f, - 0.934664964675903f, 0.247116148471832f, 0.934854328632355f, - 0.246782705187798f, - 0.935043513774872f, 0.246449097990990f, 0.935232400894165f, - 0.246115356683731f, - 0.935421049594879f, 0.245781451463699f, 0.935609400272369f, - 0.245447427034378f, - 0.935797572135925f, 0.245113238692284f, 0.935985386371613f, - 0.244778916239738f, - 0.936173021793365f, 0.244444444775581f, 0.936360359191895f, - 0.244109839200974f, - 0.936547517776489f, 0.243775084614754f, 0.936734318733215f, - 0.243440181016922f, - 0.936920940876007f, 0.243105143308640f, 0.937107264995575f, - 0.242769956588745f, - 0.937293350696564f, 0.242434620857239f, 0.937479138374329f, - 0.242099151015282f, - 0.937664687633514f, 0.241763532161713f, 0.937849998474121f, - 0.241427779197693f, - 0.938035070896149f, 0.241091892123222f, 0.938219845294952f, - 0.240755841135979f, - 0.938404381275177f, 0.240419670939446f, 0.938588619232178f, - 0.240083336830139f, - 0.938772618770599f, 0.239746883511543f, 0.938956379890442f, - 0.239410281181335f, - 0.939139902591705f, 0.239073529839516f, 0.939323127269745f, - 0.238736644387245f, - 0.939506113529205f, 0.238399609923363f, 0.939688861370087f, - 0.238062441349030f, - 0.939871311187744f, 0.237725138664246f, 0.940053522586823f, - 0.237387686967850f, - 0.940235435962677f, 0.237050101161003f, 0.940417110919952f, - 0.236712381243706f, - 0.940598547458649f, 0.236374512314796f, 0.940779745578766f, - 0.236036509275436f, - 0.940960645675659f, 0.235698372125626f, 0.941141307353973f, - 0.235360085964203f, - 0.941321671009064f, 0.235021665692329f, 0.941501796245575f, - 0.234683111310005f, - 0.941681683063507f, 0.234344407916069f, 0.941861271858215f, - 0.234005570411682f, - 0.942040622234344f, 0.233666598796844f, 0.942219734191895f, - 0.233327493071556f, - 0.942398548126221f, 0.232988253235817f, 0.942577123641968f, - 0.232648864388466f, - 0.942755401134491f, 0.232309341430664f, 0.942933499813080f, - 0.231969684362412f, - 0.943111240863800f, 0.231629893183708f, 0.943288803100586f, - 0.231289967894554f, - 0.943466067314148f, 0.230949893593788f, 0.943643093109131f, - 0.230609700083733f, - 0.943819820880890f, 0.230269357562065f, 0.943996310234070f, - 0.229928880929947f, - 0.944172501564026f, 0.229588270187378f, 0.944348454475403f, - 0.229247525334358f, - 0.944524168968201f, 0.228906646370888f, 0.944699645042419f, - 0.228565633296967f, - 0.944874763488770f, 0.228224486112595f, 0.945049703121185f, - 0.227883204817772f, - 0.945224344730377f, 0.227541789412498f, 0.945398747920990f, - 0.227200239896774f, - 0.945572853088379f, 0.226858556270599f, 0.945746779441834f, - 0.226516738533974f, - 0.945920348167419f, 0.226174786686897f, 0.946093678474426f, - 0.225832715630531f, - 0.946266770362854f, 0.225490495562553f, 0.946439623832703f, - 0.225148141384125f, - 0.946612179279327f, 0.224805667996407f, 0.946784436702728f, - 0.224463045597076f, - 0.946956455707550f, 0.224120303988457f, 0.947128236293793f, - 0.223777428269386f, - 0.947299718856812f, 0.223434418439865f, 0.947470963001251f, - 0.223091274499893f, - 0.947641968727112f, 0.222748011350632f, 0.947812676429749f, - 0.222404599189758f, - 0.947983145713806f, 0.222061067819595f, 0.948153316974640f, - 0.221717402338982f, - 0.948323249816895f, 0.221373617649078f, 0.948492884635925f, - 0.221029683947563f, - 0.948662281036377f, 0.220685631036758f, 0.948831439018250f, - 0.220341444015503f, - 0.949000298976898f, 0.219997137784958f, 0.949168920516968f, - 0.219652697443962f, - 0.949337244033813f, 0.219308122992516f, 0.949505329132080f, - 0.218963414430618f, - 0.949673116207123f, 0.218618586659431f, 0.949840664863586f, - 0.218273624777794f, - 0.950007975101471f, 0.217928543686867f, 0.950174987316132f, - 0.217583328485489f, - 0.950341701507568f, 0.217237979173660f, 0.950508177280426f, - 0.216892510652542f, - 0.950674414634705f, 0.216546908020973f, 0.950840353965759f, - 0.216201186180115f, - 0.951006054878235f, 0.215855330228806f, 0.951171517372131f, - 0.215509355068207f, - 0.951336681842804f, 0.215163245797157f, 0.951501548290253f, - 0.214817002415657f, - 0.951666176319122f, 0.214470639824867f, 0.951830565929413f, - 0.214124158024788f, - 0.951994657516479f, 0.213777542114258f, 0.952158451080322f, - 0.213430806994438f, - 0.952322065830231f, 0.213083937764168f, 0.952485322952271f, - 0.212736949324608f, - 0.952648401260376f, 0.212389841675758f, 0.952811121940613f, - 0.212042599916458f, - 0.952973663806915f, 0.211695238947868f, 0.953135907649994f, - 0.211347743868828f, - 0.953297853469849f, 0.211000129580498f, 0.953459560871124f, - 0.210652396082878f, - 0.953620970249176f, 0.210304543375969f, 0.953782141208649f, - 0.209956556558609f, - 0.953943073749542f, 0.209608450531960f, 0.954103708267212f, - 0.209260210394859f, - 0.954264044761658f, 0.208911851048470f, 0.954424142837524f, - 0.208563387393951f, - 0.954584002494812f, 0.208214774727821f, 0.954743564128876f, - 0.207866057753563f, - 0.954902827739716f, 0.207517206668854f, 0.955061912536621f, - 0.207168251276016f, - 0.955220639705658f, 0.206819161772728f, 0.955379128456116f, - 0.206469938158989f, - 0.955537378787994f, 0.206120610237122f, 0.955695331096649f, - 0.205771163105965f, - 0.955853044986725f, 0.205421581864357f, 0.956010460853577f, - 0.205071896314621f, - 0.956167578697205f, 0.204722076654434f, 0.956324458122253f, - 0.204372137784958f, - 0.956481099128723f, 0.204022079706192f, 0.956637442111969f, - 0.203671902418137f, - 0.956793546676636f, 0.203321605920792f, 0.956949353218079f, - 0.202971190214157f, - 0.957104861736298f, 0.202620655298233f, 0.957260131835938f, - 0.202270001173019f, - 0.957415163516998f, 0.201919227838516f, 0.957569897174835f, - 0.201568335294724f, - 0.957724332809448f, 0.201217323541641f, 0.957878530025482f, - 0.200866192579269f, - 0.958032488822937f, 0.200514942407608f, 0.958186149597168f, - 0.200163587927818f, - 0.958339512348175f, 0.199812099337578f, 0.958492636680603f, - 0.199460506439209f, - 0.958645522594452f, 0.199108779430389f, 0.958798050880432f, - 0.198756948113441f, - 0.958950400352478f, 0.198404997587204f, 0.959102451801300f, - 0.198052927851677f, - 0.959254205226898f, 0.197700738906860f, 0.959405720233917f, - 0.197348430752754f, - 0.959556937217712f, 0.196996018290520f, 0.959707856178284f, - 0.196643486618996f, - 0.959858596324921f, 0.196290835738182f, 0.960008978843689f, - 0.195938065648079f, - 0.960159122943878f, 0.195585191249847f, 0.960309028625488f, - 0.195232197642326f, - 0.960458636283875f, 0.194879084825516f, 0.960607945919037f, - 0.194525867700577f, - 0.960757017135620f, 0.194172516465187f, 0.960905790328979f, - 0.193819075822830f, - 0.961054325103760f, 0.193465501070023f, 0.961202561855316f, - 0.193111822009087f, - 0.961350560188293f, 0.192758023738861f, 0.961498260498047f, - 0.192404121160507f, - 0.961645722389221f, 0.192050099372864f, 0.961792886257172f, - 0.191695958375931f, - 0.961939752101898f, 0.191341713070869f, 0.962086379528046f, - 0.190987363457680f, - 0.962232708930969f, 0.190632879734039f, 0.962378799915314f, - 0.190278306603432f, - 0.962524592876434f, 0.189923599362373f, 0.962670147418976f, - 0.189568802714348f, - 0.962815403938293f, 0.189213871955872f, 0.962960422039032f, - 0.188858851790428f, - 0.963105142116547f, 0.188503712415695f, 0.963249564170837f, - 0.188148453831673f, - 0.963393747806549f, 0.187793090939522f, 0.963537633419037f, - 0.187437608838081f, - 0.963681280612946f, 0.187082037329674f, 0.963824629783630f, - 0.186726331710815f, - 0.963967680931091f, 0.186370536684990f, 0.964110493659973f, - 0.186014622449875f, - 0.964253067970276f, 0.185658603906631f, 0.964395284652710f, - 0.185302466154099f, - 0.964537262916565f, 0.184946224093437f, 0.964679002761841f, - 0.184589877724648f, - 0.964820444583893f, 0.184233412146568f, 0.964961588382721f, - 0.183876842260361f, - 0.965102493762970f, 0.183520168066025f, 0.965243160724640f, - 0.183163389563560f, - 0.965383470058441f, 0.182806491851807f, 0.965523540973663f, - 0.182449504733086f, - 0.965663373470306f, 0.182092398405075f, 0.965802907943726f, - 0.181735187768936f, - 0.965942144393921f, 0.181377857923508f, 0.966081082820892f, - 0.181020438671112f, - 0.966219842433929f, 0.180662900209427f, 0.966358244419098f, - 0.180305257439613f, - 0.966496407985687f, 0.179947525262833f, 0.966634273529053f, - 0.179589673876762f, - 0.966771900653839f, 0.179231703281403f, 0.966909229755402f, - 0.178873643279076f, - 0.967046260833740f, 0.178515478968620f, 0.967183053493500f, - 0.178157210350037f, - 0.967319548130035f, 0.177798837423325f, 0.967455804347992f, - 0.177440345287323f, - 0.967591762542725f, 0.177081763744354f, 0.967727422714233f, - 0.176723077893257f, - 0.967862844467163f, 0.176364272832870f, 0.967997968196869f, - 0.176005378365517f, - 0.968132853507996f, 0.175646379590034f, 0.968267440795898f, - 0.175287276506424f, - 0.968401730060577f, 0.174928069114685f, 0.968535780906677f, - 0.174568757414818f, - 0.968669533729553f, 0.174209341406822f, 0.968802988529205f, - 0.173849821090698f, - 0.968936204910278f, 0.173490211367607f, 0.969069123268127f, - 0.173130482435226f, - 0.969201743602753f, 0.172770664095879f, 0.969334125518799f, - 0.172410741448402f, - 0.969466269016266f, 0.172050714492798f, 0.969598054885864f, - 0.171690583229065f, - 0.969729602336884f, 0.171330362558365f, 0.969860911369324f, - 0.170970037579536f, - 0.969991862773895f, 0.170609608292580f, 0.970122575759888f, - 0.170249074697495f, - 0.970253050327301f, 0.169888436794281f, 0.970383226871490f, - 0.169527709484100f, - 0.970513105392456f, 0.169166877865791f, 0.970642685890198f, - 0.168805956840515f, - 0.970772027969360f, 0.168444931507111f, 0.970901072025299f, - 0.168083801865578f, - 0.971029877662659f, 0.167722567915916f, 0.971158385276794f, - 0.167361244559288f, - 0.971286594867706f, 0.166999831795692f, 0.971414566040039f, - 0.166638299822807f, - 0.971542239189148f, 0.166276678442955f, 0.971669614315033f, - 0.165914967656136f, - 0.971796751022339f, 0.165553152561188f, 0.971923589706421f, - 0.165191248059273f, - 0.972050130367279f, 0.164829224348068f, 0.972176432609558f, - 0.164467126131058f, - 0.972302436828613f, 0.164104923605919f, 0.972428143024445f, - 0.163742616772652f, - 0.972553610801697f, 0.163380220532417f, 0.972678780555725f, - 0.163017734885216f, - 0.972803652286530f, 0.162655144929886f, 0.972928285598755f, - 0.162292465567589f, - 0.973052620887756f, 0.161929681897163f, 0.973176658153534f, - 0.161566808819771f, - 0.973300457000732f, 0.161203846335411f, 0.973423957824707f, - 0.160840779542923f, - 0.973547160625458f, 0.160477623343468f, 0.973670125007629f, - 0.160114362835884f, - 0.973792791366577f, 0.159751012921333f, 0.973915159702301f, - 0.159387573599815f, - 0.974037289619446f, 0.159024044871330f, 0.974159121513367f, - 0.158660411834717f, - 0.974280655384064f, 0.158296689391136f, 0.974401950836182f, - 0.157932877540588f, - 0.974522948265076f, 0.157568961381912f, 0.974643647670746f, - 0.157204970717430f, - 0.974764108657837f, 0.156840875744820f, 0.974884271621704f, - 0.156476691365242f, - 0.975004136562347f, 0.156112402677536f, 0.975123703479767f, - 0.155748039484024f, - 0.975243031978607f, 0.155383571982384f, 0.975362062454224f, - 0.155019029974937f, - 0.975480854511261f, 0.154654383659363f, 0.975599288940430f, - 0.154289647936821f, - 0.975717484951019f, 0.153924822807312f, 0.975835442543030f, - 0.153559908270836f, - 0.975953042507172f, 0.153194904327393f, 0.976070404052734f, - 0.152829796075821f, - 0.976187527179718f, 0.152464613318443f, 0.976304292678833f, - 0.152099341154099f, - 0.976420819759369f, 0.151733979582787f, 0.976537048816681f, - 0.151368513703346f, - 0.976653039455414f, 0.151002973318100f, 0.976768672466278f, - 0.150637343525887f, - 0.976884067058563f, 0.150271624326706f, 0.976999223232269f, - 0.149905815720558f, - 0.977114021778107f, 0.149539917707443f, 0.977228581905365f, - 0.149173930287361f, - 0.977342903614044f, 0.148807853460312f, 0.977456867694855f, - 0.148441687226295f, - 0.977570593357086f, 0.148075446486473f, 0.977684020996094f, - 0.147709101438522f, - 0.977797150611877f, 0.147342681884766f, 0.977910041809082f, - 0.146976172924042f, - 0.978022634983063f, 0.146609574556351f, 0.978134930133820f, - 0.146242901682854f, - 0.978246986865997f, 0.145876124501228f, 0.978358685970306f, - 0.145509272813797f, - 0.978470146656036f, 0.145142331719399f, 0.978581368923187f, - 0.144775316119194f, - 0.978692233562469f, 0.144408211112022f, 0.978802859783173f, - 0.144041016697884f, - 0.978913187980652f, 0.143673732876778f, 0.979023277759552f, - 0.143306359648705f, - 0.979133009910584f, 0.142938911914825f, 0.979242503643036f, - 0.142571389675140f, - 0.979351758956909f, 0.142203763127327f, 0.979460656642914f, - 0.141836062073708f, - 0.979569315910339f, 0.141468286514282f, 0.979677677154541f, - 0.141100421547890f, - 0.979785740375519f, 0.140732467174530f, 0.979893565177917f, - 0.140364438295364f, - 0.980001091957092f, 0.139996320009232f, 0.980108320713043f, - 0.139628127217293f, - 0.980215251445770f, 0.139259845018387f, 0.980321943759918f, - 0.138891488313675f, - 0.980428338050842f, 0.138523042201996f, 0.980534434318542f, - 0.138154521584511f, - 0.980640232563019f, 0.137785911560059f, 0.980745792388916f, - 0.137417227029800f, - 0.980851054191589f, 0.137048453092575f, 0.980956017971039f, - 0.136679604649544f, - 0.981060683727264f, 0.136310681700706f, 0.981165111064911f, - 0.135941669344902f, - 0.981269240379334f, 0.135572582483292f, 0.981373071670532f, - 0.135203406214714f, - 0.981476604938507f, 0.134834155440331f, 0.981579899787903f, - 0.134464830160141f, - 0.981682896614075f, 0.134095430374146f, 0.981785595417023f, - 0.133725941181183f, - 0.981888055801392f, 0.133356377482414f, 0.981990158557892f, - 0.132986739277840f, - 0.982092022895813f, 0.132617011666298f, 0.982193589210510f, - 0.132247209548950f, - 0.982294917106628f, 0.131877332925797f, 0.982395887374878f, - 0.131507381796837f, - 0.982496619224548f, 0.131137356162071f, 0.982597053050995f, - 0.130767241120338f, - 0.982697248458862f, 0.130397051572800f, 0.982797086238861f, - 0.130026802420616f, - 0.982896685600281f, 0.129656463861465f, 0.982995986938477f, - 0.129286035895348f, - 0.983094990253448f, 0.128915548324585f, 0.983193755149841f, - 0.128544986248016f, - 0.983292162418365f, 0.128174334764481f, 0.983390331268311f, - 0.127803623676300f, - 0.983488261699677f, 0.127432823181152f, 0.983585834503174f, - 0.127061963081360f, - 0.983683168888092f, 0.126691013574600f, 0.983780145645142f, - 0.126320004463196f, - 0.983876943588257f, 0.125948905944824f, 0.983973383903503f, - 0.125577747821808f, - 0.984069526195526f, 0.125206500291824f, 0.984165430068970f, - 0.124835193157196f, - 0.984261035919189f, 0.124463804066181f, 0.984356343746185f, - 0.124092340469360f, - 0.984451413154602f, 0.123720809817314f, 0.984546124935150f, - 0.123349204659462f, - 0.984640598297119f, 0.122977524995804f, 0.984734773635864f, - 0.122605770826340f, - 0.984828710556030f, 0.122233949601650f, 0.984922289848328f, - 0.121862053871155f, - 0.985015630722046f, 0.121490091085434f, 0.985108673572540f, - 0.121118053793907f, - 0.985201418399811f, 0.120745941996574f, 0.985293865203857f, - 0.120373763144016f, - 0.985386073589325f, 0.120001509785652f, 0.985477983951569f, - 0.119629189372063f, - 0.985569596290588f, 0.119256794452667f, 0.985660910606384f, - 0.118884332478046f, - 0.985751926898956f, 0.118511803448200f, 0.985842704772949f, - 0.118139199912548f, - 0.985933184623718f, 0.117766529321671f, 0.986023366451263f, - 0.117393791675568f, - 0.986113250255585f, 0.117020979523659f, 0.986202836036682f, - 0.116648100316525f, - 0.986292183399200f, 0.116275154054165f, 0.986381232738495f, - 0.115902140736580f, - 0.986469984054565f, 0.115529052913189f, 0.986558437347412f, - 0.115155905485153f, - 0.986646652221680f, 0.114782683551311f, 0.986734509468079f, - 0.114409394562244f, - 0.986822128295898f, 0.114036038517952f, 0.986909449100494f, - 0.113662622869015f, - 0.986996471881866f, 0.113289132714272f, 0.987083256244659f, - 0.112915575504303f, - 0.987169682979584f, 0.112541958689690f, 0.987255871295929f, - 0.112168267369270f, - 0.987341761589050f, 0.111794516444206f, 0.987427353858948f, - 0.111420698463917f, - 0.987512648105621f, 0.111046813428402f, 0.987597703933716f, - 0.110672861337662f, - 0.987682461738586f, 0.110298842191696f, 0.987766921520233f, - 0.109924763441086f, - 0.987851083278656f, 0.109550617635250f, 0.987934947013855f, - 0.109176412224770f, - 0.988018512725830f, 0.108802139759064f, 0.988101840019226f, - 0.108427800238132f, - 0.988184869289398f, 0.108053401112556f, 0.988267600536346f, - 0.107678934931755f, - 0.988350033760071f, 0.107304409146309f, 0.988432228565216f, - 0.106929816305637f, - 0.988514065742493f, 0.106555156409740f, 0.988595664501190f, - 0.106180444359779f, - 0.988676965236664f, 0.105805665254593f, 0.988757967948914f, - 0.105430819094181f, - 0.988838672637939f, 0.105055920779705f, 0.988919138908386f, - 0.104680955410004f, - 0.988999247550964f, 0.104305922985077f, 0.989079117774963f, - 0.103930838406086f, - 0.989158689975739f, 0.103555686771870f, 0.989237964153290f, - 0.103180475533009f, - 0.989316940307617f, 0.102805204689503f, 0.989395678043365f, - 0.102429874241352f, - 0.989474058151245f, 0.102054484188557f, 0.989552199840546f, - 0.101679034531116f, - 0.989630043506622f, 0.101303517818451f, 0.989707589149475f, - 0.100927948951721f, - 0.989784896373749f, 0.100552320480347f, 0.989861845970154f, - 0.100176624953747f, - 0.989938557147980f, 0.099800877273083f, 0.990014970302582f, - 0.099425069987774f, - 0.990091085433960f, 0.099049203097820f, 0.990166902542114f, - 0.098673284053802f, - 0.990242421627045f, 0.098297297954559f, 0.990317702293396f, - 0.097921259701252f, - 0.990392625331879f, 0.097545161843300f, 0.990467309951782f, - 0.097169004380703f, - 0.990541696548462f, 0.096792794764042f, 0.990615785121918f, - 0.096416525542736f, - 0.990689575672150f, 0.096040196716785f, 0.990763127803802f, - 0.095663815736771f, - 0.990836322307587f, 0.095287375152111f, 0.990909278392792f, - 0.094910882413387f, - 0.990981936454773f, 0.094534330070019f, 0.991054296493530f, - 0.094157725572586f, - 0.991126358509064f, 0.093781061470509f, 0.991198182106018f, - 0.093404345214367f, - 0.991269648075104f, 0.093027576804161f, 0.991340875625610f, - 0.092650748789310f, - 0.991411805152893f, 0.092273868620396f, 0.991482377052307f, - 0.091896936297417f, - 0.991552770137787f, 0.091519944369793f, 0.991622805595398f, - 0.091142900288105f, - 0.991692543029785f, 0.090765804052353f, 0.991762042045593f, - 0.090388655662537f, - 0.991831183433533f, 0.090011447668076f, 0.991900086402893f, - 0.089634194970131f, - 0.991968691349030f, 0.089256882667542f, 0.992036998271942f, - 0.088879525661469f, - 0.992105066776276f, 0.088502109050751f, 0.992172777652740f, - 0.088124647736549f, - 0.992240250110626f, 0.087747126817703f, 0.992307364940643f, - 0.087369553744793f, - 0.992374241352081f, 0.086991935968399f, 0.992440819740295f, - 0.086614266037941f, - 0.992507100105286f, 0.086236543953419f, 0.992573142051697f, - 0.085858769714832f, - 0.992638826370239f, 0.085480943322182f, 0.992704212665558f, - 0.085103072226048f, - 0.992769360542297f, 0.084725148975849f, 0.992834210395813f, - 0.084347173571587f, - 0.992898762226105f, 0.083969146013260f, 0.992963016033173f, - 0.083591073751450f, - 0.993026971817017f, 0.083212949335575f, 0.993090689182281f, - 0.082834780216217f, - 0.993154048919678f, 0.082456558942795f, 0.993217170238495f, - 0.082078292965889f, - 0.993279933929443f, 0.081699974834919f, 0.993342459201813f, - 0.081321612000465f, - 0.993404686450958f, 0.080943197011948f, 0.993466615676880f, - 0.080564737319946f, - 0.993528306484222f, 0.080186225473881f, 0.993589639663696f, - 0.079807676374912f, - 0.993650734424591f, 0.079429075121880f, 0.993711471557617f, - 0.079050421714783f, - 0.993771970272064f, 0.078671731054783f, 0.993832170963287f, - 0.078292988240719f, - 0.993892073631287f, 0.077914200723171f, 0.993951678276062f, - 0.077535368502140f, - 0.994010984897614f, 0.077156484127045f, 0.994070053100586f, - 0.076777562499046f, - 0.994128763675690f, 0.076398596167564f, 0.994187235832214f, - 0.076019577682018f, - 0.994245409965515f, 0.075640521943569f, 0.994303286075592f, - 0.075261414051056f, - 0.994360864162445f, 0.074882268905640f, 0.994418144226074f, - 0.074503071606159f, - 0.994475126266479f, 0.074123837053776f, 0.994531810283661f, - 0.073744557797909f, - 0.994588255882263f, 0.073365233838558f, 0.994644403457642f, - 0.072985872626305f, - 0.994700193405151f, 0.072606459259987f, 0.994755744934082f, - 0.072227008640766f, - 0.994810998439789f, 0.071847513318062f, 0.994865953922272f, - 0.071467980742455f, - 0.994920611381531f, 0.071088403463364f, 0.994975030422211f, - 0.070708781480789f, - 0.995029091835022f, 0.070329122245312f, 0.995082914829254f, - 0.069949418306351f, - 0.995136380195618f, 0.069569669663906f, 0.995189607143402f, - 0.069189883768559f, - 0.995242536067963f, 0.068810060620308f, 0.995295166969299f, - 0.068430192768574f, - 0.995347499847412f, 0.068050287663937f, 0.995399534702301f, - 0.067670337855816f, - 0.995451331138611f, 0.067290350794792f, 0.995502769947052f, - 0.066910326480865f, - 0.995553970336914f, 0.066530264914036f, 0.995604813098907f, - 0.066150158643723f, - 0.995655417442322f, 0.065770015120506f, 0.995705723762512f, - 0.065389834344387f, - 0.995755732059479f, 0.065009608864784f, 0.995805442333221f, - 0.064629353582859f, - 0.995854854583740f, 0.064249053597450f, 0.995904028415680f, - 0.063868723809719f, - 0.995952844619751f, 0.063488349318504f, 0.996001422405243f, - 0.063107937574387f, - 0.996049642562866f, 0.062727488577366f, 0.996097624301910f, - 0.062347009778023f, - 0.996145308017731f, 0.061966486275196f, 0.996192693710327f, - 0.061585929244757f, - 0.996239781379700f, 0.061205338686705f, 0.996286571025848f, - 0.060824707150459f, - 0.996333062648773f, 0.060444042086601f, 0.996379256248474f, - 0.060063343495131f, - 0.996425211429596f, 0.059682607650757f, 0.996470808982849f, - 0.059301838278770f, - 0.996516168117523f, 0.058921031653881f, 0.996561229228973f, - 0.058540191501379f, - 0.996605992317200f, 0.058159314095974f, 0.996650457382202f, - 0.057778406888247f, - 0.996694624423981f, 0.057397462427616f, 0.996738493442535f, - 0.057016488164663f, - 0.996782064437866f, 0.056635476648808f, 0.996825337409973f, - 0.056254431605339f, - 0.996868371963501f, 0.055873356759548f, 0.996911048889160f, - 0.055492244660854f, - 0.996953487396240f, 0.055111102759838f, 0.996995627880096f, - 0.054729927331209f, - 0.997037410736084f, 0.054348722100258f, 0.997078955173492f, - 0.053967483341694f, - 0.997120201587677f, 0.053586211055517f, 0.997161149978638f, - 0.053204908967018f, - 0.997201859951019f, 0.052823577076197f, 0.997242212295532f, - 0.052442211657763f, - 0.997282266616821f, 0.052060816437006f, 0.997322082519531f, - 0.051679391413927f, - 0.997361540794373f, 0.051297932863235f, 0.997400760650635f, - 0.050916448235512f, - 0.997439682483673f, 0.050534930080175f, 0.997478306293488f, - 0.050153385847807f, - 0.997516572475433f, 0.049771808087826f, 0.997554600238800f, - 0.049390204250813f, - 0.997592389583588f, 0.049008570611477f, 0.997629821300507f, - 0.048626907169819f, - 0.997666954994202f, 0.048245213925838f, 0.997703790664673f, - 0.047863494604826f, - 0.997740387916565f, 0.047481749206781f, 0.997776627540588f, - 0.047099970281124f, - 0.997812628746033f, 0.046718169003725f, 0.997848331928253f, - 0.046336337924004f, - 0.997883677482605f, 0.045954477041960f, 0.997918784618378f, - 0.045572593808174f, - 0.997953593730927f, 0.045190680772066f, 0.997988104820251f, - 0.044808741658926f, - 0.998022377490997f, 0.044426776468754f, 0.998056292533875f, - 0.044044785201550f, - 0.998089909553528f, 0.043662767857313f, 0.998123228549957f, - 0.043280724436045f, - 0.998156309127808f, 0.042898654937744f, 0.998189091682434f, - 0.042516563087702f, - 0.998221516609192f, 0.042134445160627f, 0.998253703117371f, - 0.041752301156521f, - 0.998285591602325f, 0.041370131075382f, 0.998317182064056f, - 0.040987938642502f, - 0.998348474502563f, 0.040605723857880f, 0.998379468917847f, - 0.040223482996225f, - 0.998410165309906f, 0.039841219782829f, 0.998440563678741f, - 0.039458930492401f, - 0.998470664024353f, 0.039076622575521f, 0.998500525951386f, - 0.038694288581610f, - 0.998530030250549f, 0.038311932235956f, 0.998559296131134f, - 0.037929553538561f, - 0.998588204383850f, 0.037547148764133f, 0.998616874217987f, - 0.037164725363255f, - 0.998645246028900f, 0.036782283335924f, 0.998673319816589f, - 0.036399815231562f, - 0.998701035976410f, 0.036017324775457f, 0.998728513717651f, - 0.035634815692902f, - 0.998755753040314f, 0.035252287983894f, 0.998782634735107f, - 0.034869734197855f, - 0.998809218406677f, 0.034487165510654f, 0.998835504055023f, - 0.034104570746422f, - 0.998861551284790f, 0.033721961081028f, 0.998887240886688f, - 0.033339329063892f, - 0.998912692070007f, 0.032956674695015f, 0.998937785625458f, - 0.032574005424976f, - 0.998962640762329f, 0.032191313803196f, 0.998987197875977f, - 0.031808607280254f, - 0.999011456966400f, 0.031425878405571f, 0.999035418033600f, - 0.031043132767081f, - 0.999059081077576f, 0.030660368502140f, 0.999082446098328f, - 0.030277585610747f, - 0.999105513095856f, 0.029894785955548f, 0.999128282070160f, - 0.029511967673898f, - 0.999150753021240f, 0.029129132628441f, 0.999172985553741f, - 0.028746278956532f, - 0.999194860458374f, 0.028363410383463f, 0.999216496944427f, - 0.027980525046587f, - 0.999237775802612f, 0.027597622945905f, 0.999258816242218f, - 0.027214704081416f, - 0.999279558658600f, 0.026831768453121f, 0.999299943447113f, - 0.026448817923665f, - 0.999320089817047f, 0.026065852493048f, 0.999339938163757f, - 0.025682870298624f, - 0.999359488487244f, 0.025299875065684f, 0.999378740787506f, - 0.024916863068938f, - 0.999397754669189f, 0.024533838033676f, 0.999416410923004f, - 0.024150796234608f, - 0.999434769153595f, 0.023767741397023f, 0.999452829360962f, - 0.023384673520923f, - 0.999470651149750f, 0.023001590743661f, 0.999488115310669f, - 0.022618494927883f, - 0.999505341053009f, 0.022235386073589f, 0.999522268772125f, - 0.021852264180779f, - 0.999538838863373f, 0.021469129249454f, 0.999555170536041f, - 0.021085981279612f, - 0.999571204185486f, 0.020702820271254f, 0.999586939811707f, - 0.020319648087025f, - 0.999602377414703f, 0.019936462864280f, 0.999617516994476f, - 0.019553268328309f, - 0.999632358551025f, 0.019170060753822f, 0.999646902084351f, - 0.018786842003465f, - 0.999661207199097f, 0.018403612077236f, 0.999675154685974f, - 0.018020370975137f, - 0.999688863754272f, 0.017637118697166f, 0.999702215194702f, - 0.017253857105970f, - 0.999715328216553f, 0.016870586201549f, 0.999728083610535f, - 0.016487304121256f, - 0.999740600585938f, 0.016104012727737f, 0.999752819538116f, - 0.015720712020993f, - 0.999764680862427f, 0.015337402001023f, 0.999776303768158f, - 0.014954082667828f, - 0.999787628650665f, 0.014570754021406f, 0.999798655509949f, - 0.014187417924404f, - 0.999809384346008f, 0.013804072514176f, 0.999819874763489f, - 0.013420719653368f, - 0.999830007553101f, 0.013037359341979f, 0.999839842319489f, - 0.012653990648687f, - 0.999849438667297f, 0.012270614504814f, 0.999858677387238f, - 0.011887230910361f, - 0.999867618083954f, 0.011503840796649f, 0.999876320362091f, - 0.011120444163680f, - 0.999884724617004f, 0.010737040080130f, 0.999892771244049f, - 0.010353630408645f, - 0.999900579452515f, 0.009970214217901f, 0.999908089637756f, - 0.009586792439222f, - 0.999915301799774f, 0.009203365072608f, 0.999922215938568f, - 0.008819932118058f, - 0.999928832054138f, 0.008436493575573f, 0.999935150146484f, - 0.008053051307797f, - 0.999941170215607f, 0.007669602986425f, 0.999946892261505f, - 0.007286150939763f, - 0.999952375888824f, 0.006902694236487f, 0.999957501888275f, - 0.006519233807921f, - 0.999962329864502f, 0.006135769188404f, 0.999966919422150f, - 0.005752300843596f, - 0.999971151351929f, 0.005368829704821f, 0.999975144863129f, - 0.004985354840755f, - 0.999978840351105f, 0.004601877182722f, 0.999982178211212f, - 0.004218397196382f, - 0.999985277652740f, 0.003834914416075f, 0.999988079071045f, - 0.003451429307461f, - 0.999990582466125f, 0.003067942336202f, 0.999992787837982f, - 0.002684453502297f, - 0.999994695186615f, 0.002300963038579f, 0.999996304512024f, - 0.001917471294291f, - 0.999997675418854f, 0.001533978385851f, 0.999998688697815f, - 0.001150484546088f, - 0.999999403953552f, 0.000766990066040f, 0.999999880790710f, - 0.000383495149435f, - 1.000000000000000f, 0.000000000000023f, 0.999999880790710f, - -0.000383495149435f, - 0.999999403953552f, -0.000766990066040f, 0.999998688697815f, - -0.001150484546088f, - 0.999997675418854f, -0.001533978385851f, 0.999996304512024f, - -0.001917471294291f, - 0.999994695186615f, -0.002300963038579f, 0.999992787837982f, - -0.002684453502297f, - 0.999990582466125f, -0.003067942336202f, 0.999988079071045f, - -0.003451429307461f, - 0.999985277652740f, -0.003834914416075f, 0.999982178211212f, - -0.004218397196382f, - 0.999978840351105f, -0.004601877182722f, 0.999975144863129f, - -0.004985354840755f, - 0.999971151351929f, -0.005368829704821f, 0.999966919422150f, - -0.005752300843596f, - 0.999962329864502f, -0.006135769188404f, 0.999957501888275f, - -0.006519233807921f, - 0.999952375888824f, -0.006902694236487f, 0.999946892261505f, - -0.007286150939763f, - 0.999941170215607f, -0.007669602986425f, 0.999935150146484f, - -0.008053051307797f, - 0.999928832054138f, -0.008436493575573f, 0.999922215938568f, - -0.008819932118058f, - 0.999915301799774f, -0.009203365072608f, 0.999908089637756f, - -0.009586792439222f, - 0.999900579452515f, -0.009970214217901f, 0.999892771244049f, - -0.010353630408645f, - 0.999884724617004f, -0.010737040080130f, 0.999876320362091f, - -0.011120444163680f, - 0.999867618083954f, -0.011503840796649f, 0.999858677387238f, - -0.011887230910361f, - 0.999849438667297f, -0.012270614504814f, 0.999839842319489f, - -0.012653990648687f, - 0.999830007553101f, -0.013037359341979f, 0.999819874763489f, - -0.013420719653368f, - 0.999809384346008f, -0.013804072514176f, 0.999798655509949f, - -0.014187417924404f, - 0.999787628650665f, -0.014570754021406f, 0.999776303768158f, - -0.014954082667828f, - 0.999764680862427f, -0.015337402001023f, 0.999752819538116f, - -0.015720712020993f, - 0.999740600585938f, -0.016104012727737f, 0.999728083610535f, - -0.016487304121256f, - 0.999715328216553f, -0.016870586201549f, 0.999702215194702f, - -0.017253857105970f, - 0.999688863754272f, -0.017637118697166f, 0.999675154685974f, - -0.018020370975137f, - 0.999661207199097f, -0.018403612077236f, 0.999646902084351f, - -0.018786842003465f, - 0.999632358551025f, -0.019170060753822f, 0.999617516994476f, - -0.019553268328309f, - 0.999602377414703f, -0.019936462864280f, 0.999586939811707f, - -0.020319648087025f, - 0.999571204185486f, -0.020702820271254f, 0.999555170536041f, - -0.021085981279612f, - 0.999538838863373f, -0.021469129249454f, 0.999522268772125f, - -0.021852264180779f, - 0.999505341053009f, -0.022235386073589f, 0.999488115310669f, - -0.022618494927883f, - 0.999470651149750f, -0.023001590743661f, 0.999452829360962f, - -0.023384673520923f, - 0.999434769153595f, -0.023767741397023f, 0.999416410923004f, - -0.024150796234608f, - 0.999397754669189f, -0.024533838033676f, 0.999378740787506f, - -0.024916863068938f, - 0.999359488487244f, -0.025299875065684f, 0.999339938163757f, - -0.025682870298624f, - 0.999320089817047f, -0.026065852493048f, 0.999299943447113f, - -0.026448817923665f, - 0.999279558658600f, -0.026831768453121f, 0.999258816242218f, - -0.027214704081416f, - 0.999237775802612f, -0.027597622945905f, 0.999216496944427f, - -0.027980525046587f, - 0.999194860458374f, -0.028363410383463f, 0.999172985553741f, - -0.028746278956532f, - 0.999150753021240f, -0.029129132628441f, 0.999128282070160f, - -0.029511967673898f, - 0.999105513095856f, -0.029894785955548f, 0.999082446098328f, - -0.030277585610747f, - 0.999059081077576f, -0.030660368502140f, 0.999035418033600f, - -0.031043132767081f, - 0.999011456966400f, -0.031425878405571f, 0.998987197875977f, - -0.031808607280254f, - 0.998962640762329f, -0.032191313803196f, 0.998937785625458f, - -0.032574005424976f, - 0.998912692070007f, -0.032956674695015f, 0.998887240886688f, - -0.033339329063892f, - 0.998861551284790f, -0.033721961081028f, 0.998835504055023f, - -0.034104570746422f, - 0.998809218406677f, -0.034487165510654f, 0.998782634735107f, - -0.034869734197855f, - 0.998755753040314f, -0.035252287983894f, 0.998728513717651f, - -0.035634815692902f, - 0.998701035976410f, -0.036017324775457f, 0.998673319816589f, - -0.036399815231562f, - 0.998645246028900f, -0.036782283335924f, 0.998616874217987f, - -0.037164725363255f, - 0.998588204383850f, -0.037547148764133f, 0.998559296131134f, - -0.037929553538561f, - 0.998530030250549f, -0.038311932235956f, 0.998500525951386f, - -0.038694288581610f, - 0.998470664024353f, -0.039076622575521f, 0.998440563678741f, - -0.039458930492401f, - 0.998410165309906f, -0.039841219782829f, 0.998379468917847f, - -0.040223482996225f, - 0.998348474502563f, -0.040605723857880f, 0.998317182064056f, - -0.040987938642502f, - 0.998285591602325f, -0.041370131075382f, 0.998253703117371f, - -0.041752301156521f, - 0.998221516609192f, -0.042134445160627f, 0.998189091682434f, - -0.042516563087702f, - 0.998156309127808f, -0.042898654937744f, 0.998123228549957f, - -0.043280724436045f, - 0.998089909553528f, -0.043662767857313f, 0.998056292533875f, - -0.044044785201550f, - 0.998022377490997f, -0.044426776468754f, 0.997988104820251f, - -0.044808741658926f, - 0.997953593730927f, -0.045190680772066f, 0.997918784618378f, - -0.045572593808174f, - 0.997883677482605f, -0.045954477041960f, 0.997848331928253f, - -0.046336337924004f, - 0.997812628746033f, -0.046718169003725f, 0.997776627540588f, - -0.047099970281124f, - 0.997740387916565f, -0.047481749206781f, 0.997703790664673f, - -0.047863494604826f, - 0.997666954994202f, -0.048245213925838f, 0.997629821300507f, - -0.048626907169819f, - 0.997592389583588f, -0.049008570611477f, 0.997554600238800f, - -0.049390204250813f, - 0.997516572475433f, -0.049771808087826f, 0.997478306293488f, - -0.050153385847807f, - 0.997439682483673f, -0.050534930080175f, 0.997400760650635f, - -0.050916448235512f, - 0.997361540794373f, -0.051297932863235f, 0.997322082519531f, - -0.051679391413927f, - 0.997282266616821f, -0.052060816437006f, 0.997242212295532f, - -0.052442211657763f, - 0.997201859951019f, -0.052823577076197f, 0.997161149978638f, - -0.053204908967018f, - 0.997120201587677f, -0.053586211055517f, 0.997078955173492f, - -0.053967483341694f, - 0.997037410736084f, -0.054348722100258f, 0.996995627880096f, - -0.054729927331209f, - 0.996953487396240f, -0.055111102759838f, 0.996911048889160f, - -0.055492244660854f, - 0.996868371963501f, -0.055873356759548f, 0.996825337409973f, - -0.056254431605339f, - 0.996782064437866f, -0.056635476648808f, 0.996738493442535f, - -0.057016488164663f, - 0.996694624423981f, -0.057397462427616f, 0.996650457382202f, - -0.057778406888247f, - 0.996605992317200f, -0.058159314095974f, 0.996561229228973f, - -0.058540191501379f, - 0.996516168117523f, -0.058921031653881f, 0.996470808982849f, - -0.059301838278770f, - 0.996425211429596f, -0.059682607650757f, 0.996379256248474f, - -0.060063343495131f, - 0.996333062648773f, -0.060444042086601f, 0.996286571025848f, - -0.060824707150459f, - 0.996239781379700f, -0.061205338686705f, 0.996192693710327f, - -0.061585929244757f, - 0.996145308017731f, -0.061966486275196f, 0.996097624301910f, - -0.062347009778023f, - 0.996049642562866f, -0.062727488577366f, 0.996001422405243f, - -0.063107937574387f, - 0.995952844619751f, -0.063488349318504f, 0.995904028415680f, - -0.063868723809719f, - 0.995854854583740f, -0.064249053597450f, 0.995805442333221f, - -0.064629353582859f, - 0.995755732059479f, -0.065009608864784f, 0.995705723762512f, - -0.065389834344387f, - 0.995655417442322f, -0.065770015120506f, 0.995604813098907f, - -0.066150158643723f, - 0.995553970336914f, -0.066530264914036f, 0.995502769947052f, - -0.066910326480865f, - 0.995451331138611f, -0.067290350794792f, 0.995399534702301f, - -0.067670337855816f, - 0.995347499847412f, -0.068050287663937f, 0.995295166969299f, - -0.068430192768574f, - 0.995242536067963f, -0.068810060620308f, 0.995189607143402f, - -0.069189883768559f, - 0.995136380195618f, -0.069569669663906f, 0.995082914829254f, - -0.069949418306351f, - 0.995029091835022f, -0.070329122245312f, 0.994975030422211f, - -0.070708781480789f, - 0.994920611381531f, -0.071088403463364f, 0.994865953922272f, - -0.071467980742455f, - 0.994810998439789f, -0.071847513318062f, 0.994755744934082f, - -0.072227008640766f, - 0.994700193405151f, -0.072606459259987f, 0.994644403457642f, - -0.072985872626305f, - 0.994588255882263f, -0.073365233838558f, 0.994531810283661f, - -0.073744557797909f, - 0.994475126266479f, -0.074123837053776f, 0.994418144226074f, - -0.074503071606159f, - 0.994360864162445f, -0.074882268905640f, 0.994303286075592f, - -0.075261414051056f, - 0.994245409965515f, -0.075640521943569f, 0.994187235832214f, - -0.076019577682018f, - 0.994128763675690f, -0.076398596167564f, 0.994070053100586f, - -0.076777562499046f, - 0.994010984897614f, -0.077156484127045f, 0.993951678276062f, - -0.077535368502140f, - 0.993892073631287f, -0.077914200723171f, 0.993832170963287f, - -0.078292988240719f, - 0.993771970272064f, -0.078671731054783f, 0.993711471557617f, - -0.079050421714783f, - 0.993650734424591f, -0.079429075121880f, 0.993589639663696f, - -0.079807676374912f, - 0.993528306484222f, -0.080186225473881f, 0.993466615676880f, - -0.080564737319946f, - 0.993404686450958f, -0.080943197011948f, 0.993342459201813f, - -0.081321612000465f, - 0.993279933929443f, -0.081699974834919f, 0.993217170238495f, - -0.082078292965889f, - 0.993154048919678f, -0.082456558942795f, 0.993090689182281f, - -0.082834780216217f, - 0.993026971817017f, -0.083212949335575f, 0.992963016033173f, - -0.083591073751450f, - 0.992898762226105f, -0.083969146013260f, 0.992834210395813f, - -0.084347173571587f, - 0.992769360542297f, -0.084725148975849f, 0.992704212665558f, - -0.085103072226048f, - 0.992638826370239f, -0.085480943322182f, 0.992573142051697f, - -0.085858769714832f, - 0.992507100105286f, -0.086236543953419f, 0.992440819740295f, - -0.086614266037941f, - 0.992374241352081f, -0.086991935968399f, 0.992307364940643f, - -0.087369553744793f, - 0.992240250110626f, -0.087747126817703f, 0.992172777652740f, - -0.088124647736549f, - 0.992105066776276f, -0.088502109050751f, 0.992036998271942f, - -0.088879525661469f, - 0.991968691349030f, -0.089256882667542f, 0.991900086402893f, - -0.089634194970131f, - 0.991831183433533f, -0.090011447668076f, 0.991762042045593f, - -0.090388655662537f, - 0.991692543029785f, -0.090765804052353f, 0.991622805595398f, - -0.091142900288105f, - 0.991552770137787f, -0.091519944369793f, 0.991482377052307f, - -0.091896936297417f, - 0.991411805152893f, -0.092273868620396f, 0.991340875625610f, - -0.092650748789310f, - 0.991269648075104f, -0.093027576804161f, 0.991198182106018f, - -0.093404345214367f, - 0.991126358509064f, -0.093781061470509f, 0.991054296493530f, - -0.094157725572586f, - 0.990981936454773f, -0.094534330070019f, 0.990909278392792f, - -0.094910882413387f, - 0.990836322307587f, -0.095287375152111f, 0.990763127803802f, - -0.095663815736771f, - 0.990689575672150f, -0.096040196716785f, 0.990615785121918f, - -0.096416525542736f, - 0.990541696548462f, -0.096792794764042f, 0.990467309951782f, - -0.097169004380703f, - 0.990392625331879f, -0.097545161843300f, 0.990317702293396f, - -0.097921259701252f, - 0.990242421627045f, -0.098297297954559f, 0.990166902542114f, - -0.098673284053802f, - 0.990091085433960f, -0.099049203097820f, 0.990014970302582f, - -0.099425069987774f, - 0.989938557147980f, -0.099800877273083f, 0.989861845970154f, - -0.100176624953747f, - 0.989784896373749f, -0.100552320480347f, 0.989707589149475f, - -0.100927948951721f, - 0.989630043506622f, -0.101303517818451f, 0.989552199840546f, - -0.101679034531116f, - 0.989474058151245f, -0.102054484188557f, 0.989395678043365f, - -0.102429874241352f, - 0.989316940307617f, -0.102805204689503f, 0.989237964153290f, - -0.103180475533009f, - 0.989158689975739f, -0.103555686771870f, 0.989079117774963f, - -0.103930838406086f, - 0.988999247550964f, -0.104305922985077f, 0.988919138908386f, - -0.104680955410004f, - 0.988838672637939f, -0.105055920779705f, 0.988757967948914f, - -0.105430819094181f, - 0.988676965236664f, -0.105805665254593f, 0.988595664501190f, - -0.106180444359779f, - 0.988514065742493f, -0.106555156409740f, 0.988432228565216f, - -0.106929816305637f, - 0.988350033760071f, -0.107304409146309f, 0.988267600536346f, - -0.107678934931755f, - 0.988184869289398f, -0.108053401112556f, 0.988101840019226f, - -0.108427800238132f, - 0.988018512725830f, -0.108802139759064f, 0.987934947013855f, - -0.109176412224770f, - 0.987851083278656f, -0.109550617635250f, 0.987766921520233f, - -0.109924763441086f, - 0.987682461738586f, -0.110298842191696f, 0.987597703933716f, - -0.110672861337662f, - 0.987512648105621f, -0.111046813428402f, 0.987427353858948f, - -0.111420698463917f, - 0.987341761589050f, -0.111794516444206f, 0.987255871295929f, - -0.112168267369270f, - 0.987169682979584f, -0.112541958689690f, 0.987083256244659f, - -0.112915575504303f, - 0.986996471881866f, -0.113289132714272f, 0.986909449100494f, - -0.113662622869015f, - 0.986822128295898f, -0.114036038517952f, 0.986734509468079f, - -0.114409394562244f, - 0.986646652221680f, -0.114782683551311f, 0.986558437347412f, - -0.115155905485153f, - 0.986469984054565f, -0.115529052913189f, 0.986381232738495f, - -0.115902140736580f, - 0.986292183399200f, -0.116275154054165f, 0.986202836036682f, - -0.116648100316525f, - 0.986113250255585f, -0.117020979523659f, 0.986023366451263f, - -0.117393791675568f, - 0.985933184623718f, -0.117766529321671f, 0.985842704772949f, - -0.118139199912548f, - 0.985751926898956f, -0.118511803448200f, 0.985660910606384f, - -0.118884332478046f, - 0.985569596290588f, -0.119256794452667f, 0.985477983951569f, - -0.119629189372063f, - 0.985386073589325f, -0.120001509785652f, 0.985293865203857f, - -0.120373763144016f, - 0.985201418399811f, -0.120745941996574f, 0.985108673572540f, - -0.121118053793907f, - 0.985015630722046f, -0.121490091085434f, 0.984922289848328f, - -0.121862053871155f, - 0.984828710556030f, -0.122233949601650f, 0.984734773635864f, - -0.122605770826340f, - 0.984640598297119f, -0.122977524995804f, 0.984546124935150f, - -0.123349204659462f, - 0.984451413154602f, -0.123720809817314f, 0.984356343746185f, - -0.124092340469360f, - 0.984261035919189f, -0.124463804066181f, 0.984165430068970f, - -0.124835193157196f, - 0.984069526195526f, -0.125206500291824f, 0.983973383903503f, - -0.125577747821808f, - 0.983876943588257f, -0.125948905944824f, 0.983780145645142f, - -0.126320004463196f, - 0.983683168888092f, -0.126691013574600f, 0.983585834503174f, - -0.127061963081360f, - 0.983488261699677f, -0.127432823181152f, 0.983390331268311f, - -0.127803623676300f, - 0.983292162418365f, -0.128174334764481f, 0.983193755149841f, - -0.128544986248016f, - 0.983094990253448f, -0.128915548324585f, 0.982995986938477f, - -0.129286035895348f, - 0.982896685600281f, -0.129656463861465f, 0.982797086238861f, - -0.130026802420616f, - 0.982697248458862f, -0.130397051572800f, 0.982597053050995f, - -0.130767241120338f, - 0.982496619224548f, -0.131137356162071f, 0.982395887374878f, - -0.131507381796837f, - 0.982294917106628f, -0.131877332925797f, 0.982193589210510f, - -0.132247209548950f, - 0.982092022895813f, -0.132617011666298f, 0.981990158557892f, - -0.132986739277840f, - 0.981888055801392f, -0.133356377482414f, 0.981785595417023f, - -0.133725941181183f, - 0.981682896614075f, -0.134095430374146f, 0.981579899787903f, - -0.134464830160141f, - 0.981476604938507f, -0.134834155440331f, 0.981373071670532f, - -0.135203406214714f, - 0.981269240379334f, -0.135572582483292f, 0.981165111064911f, - -0.135941669344902f, - 0.981060683727264f, -0.136310681700706f, 0.980956017971039f, - -0.136679604649544f, - 0.980851054191589f, -0.137048453092575f, 0.980745792388916f, - -0.137417227029800f, - 0.980640232563019f, -0.137785911560059f, 0.980534434318542f, - -0.138154521584511f, - 0.980428338050842f, -0.138523042201996f, 0.980321943759918f, - -0.138891488313675f, - 0.980215251445770f, -0.139259845018387f, 0.980108320713043f, - -0.139628127217293f, - 0.980001091957092f, -0.139996320009232f, 0.979893565177917f, - -0.140364438295364f, - 0.979785740375519f, -0.140732467174530f, 0.979677677154541f, - -0.141100421547890f, - 0.979569315910339f, -0.141468286514282f, 0.979460656642914f, - -0.141836062073708f, - 0.979351758956909f, -0.142203763127327f, 0.979242503643036f, - -0.142571389675140f, - 0.979133009910584f, -0.142938911914825f, 0.979023277759552f, - -0.143306359648705f, - 0.978913187980652f, -0.143673732876778f, 0.978802859783173f, - -0.144041016697884f, - 0.978692233562469f, -0.144408211112022f, 0.978581368923187f, - -0.144775316119194f, - 0.978470146656036f, -0.145142331719399f, 0.978358685970306f, - -0.145509272813797f, - 0.978246986865997f, -0.145876124501228f, 0.978134930133820f, - -0.146242901682854f, - 0.978022634983063f, -0.146609574556351f, 0.977910041809082f, - -0.146976172924042f, - 0.977797150611877f, -0.147342681884766f, 0.977684020996094f, - -0.147709101438522f, - 0.977570593357086f, -0.148075446486473f, 0.977456867694855f, - -0.148441687226295f, - 0.977342903614044f, -0.148807853460312f, 0.977228581905365f, - -0.149173930287361f, - 0.977114021778107f, -0.149539917707443f, 0.976999223232269f, - -0.149905815720558f, - 0.976884067058563f, -0.150271624326706f, 0.976768672466278f, - -0.150637343525887f, - 0.976653039455414f, -0.151002973318100f, 0.976537048816681f, - -0.151368513703346f, - 0.976420819759369f, -0.151733979582787f, 0.976304292678833f, - -0.152099341154099f, - 0.976187527179718f, -0.152464613318443f, 0.976070404052734f, - -0.152829796075821f, - 0.975953042507172f, -0.153194904327393f, 0.975835442543030f, - -0.153559908270836f, - 0.975717484951019f, -0.153924822807312f, 0.975599288940430f, - -0.154289647936821f, - 0.975480854511261f, -0.154654383659363f, 0.975362062454224f, - -0.155019029974937f, - 0.975243031978607f, -0.155383571982384f, 0.975123703479767f, - -0.155748039484024f, - 0.975004136562347f, -0.156112402677536f, 0.974884271621704f, - -0.156476691365242f, - 0.974764108657837f, -0.156840875744820f, 0.974643647670746f, - -0.157204970717430f, - 0.974522948265076f, -0.157568961381912f, 0.974401950836182f, - -0.157932877540588f, - 0.974280655384064f, -0.158296689391136f, 0.974159121513367f, - -0.158660411834717f, - 0.974037289619446f, -0.159024044871330f, 0.973915159702301f, - -0.159387573599815f, - 0.973792791366577f, -0.159751012921333f, 0.973670125007629f, - -0.160114362835884f, - 0.973547160625458f, -0.160477623343468f, 0.973423957824707f, - -0.160840779542923f, - 0.973300457000732f, -0.161203846335411f, 0.973176658153534f, - -0.161566808819771f, - 0.973052620887756f, -0.161929681897163f, 0.972928285598755f, - -0.162292465567589f, - 0.972803652286530f, -0.162655144929886f, 0.972678780555725f, - -0.163017734885216f, - 0.972553610801697f, -0.163380220532417f, 0.972428143024445f, - -0.163742616772652f, - 0.972302436828613f, -0.164104923605919f, 0.972176432609558f, - -0.164467126131058f, - 0.972050130367279f, -0.164829224348068f, 0.971923589706421f, - -0.165191248059273f, - 0.971796751022339f, -0.165553152561188f, 0.971669614315033f, - -0.165914967656136f, - 0.971542239189148f, -0.166276678442955f, 0.971414566040039f, - -0.166638299822807f, - 0.971286594867706f, -0.166999831795692f, 0.971158385276794f, - -0.167361244559288f, - 0.971029877662659f, -0.167722567915916f, 0.970901072025299f, - -0.168083801865578f, - 0.970772027969360f, -0.168444931507111f, 0.970642685890198f, - -0.168805956840515f, - 0.970513105392456f, -0.169166877865791f, 0.970383226871490f, - -0.169527709484100f, - 0.970253050327301f, -0.169888436794281f, 0.970122575759888f, - -0.170249074697495f, - 0.969991862773895f, -0.170609608292580f, 0.969860911369324f, - -0.170970037579536f, - 0.969729602336884f, -0.171330362558365f, 0.969598054885864f, - -0.171690583229065f, - 0.969466269016266f, -0.172050714492798f, 0.969334125518799f, - -0.172410741448402f, - 0.969201743602753f, -0.172770664095879f, 0.969069123268127f, - -0.173130482435226f, - 0.968936204910278f, -0.173490211367607f, 0.968802988529205f, - -0.173849821090698f, - 0.968669533729553f, -0.174209341406822f, 0.968535780906677f, - -0.174568757414818f, - 0.968401730060577f, -0.174928069114685f, 0.968267440795898f, - -0.175287276506424f, - 0.968132853507996f, -0.175646379590034f, 0.967997968196869f, - -0.176005378365517f, - 0.967862844467163f, -0.176364272832870f, 0.967727422714233f, - -0.176723077893257f, - 0.967591762542725f, -0.177081763744354f, 0.967455804347992f, - -0.177440345287323f, - 0.967319548130035f, -0.177798837423325f, 0.967183053493500f, - -0.178157210350037f, - 0.967046260833740f, -0.178515478968620f, 0.966909229755402f, - -0.178873643279076f, - 0.966771900653839f, -0.179231703281403f, 0.966634273529053f, - -0.179589673876762f, - 0.966496407985687f, -0.179947525262833f, 0.966358244419098f, - -0.180305257439613f, - 0.966219842433929f, -0.180662900209427f, 0.966081082820892f, - -0.181020438671112f, - 0.965942144393921f, -0.181377857923508f, 0.965802907943726f, - -0.181735187768936f, - 0.965663373470306f, -0.182092398405075f, 0.965523540973663f, - -0.182449504733086f, - 0.965383470058441f, -0.182806491851807f, 0.965243160724640f, - -0.183163389563560f, - 0.965102493762970f, -0.183520168066025f, 0.964961588382721f, - -0.183876842260361f, - 0.964820444583893f, -0.184233412146568f, 0.964679002761841f, - -0.184589877724648f, - 0.964537262916565f, -0.184946224093437f, 0.964395284652710f, - -0.185302466154099f, - 0.964253067970276f, -0.185658603906631f, 0.964110493659973f, - -0.186014622449875f, - 0.963967680931091f, -0.186370536684990f, 0.963824629783630f, - -0.186726331710815f, - 0.963681280612946f, -0.187082037329674f, 0.963537633419037f, - -0.187437608838081f, - 0.963393747806549f, -0.187793090939522f, 0.963249564170837f, - -0.188148453831673f, - 0.963105142116547f, -0.188503712415695f, 0.962960422039032f, - -0.188858851790428f, - 0.962815403938293f, -0.189213871955872f, 0.962670147418976f, - -0.189568802714348f, - 0.962524592876434f, -0.189923599362373f, 0.962378799915314f, - -0.190278306603432f, - 0.962232708930969f, -0.190632879734039f, 0.962086379528046f, - -0.190987363457680f, - 0.961939752101898f, -0.191341713070869f, 0.961792886257172f, - -0.191695958375931f, - 0.961645722389221f, -0.192050099372864f, 0.961498260498047f, - -0.192404121160507f, - 0.961350560188293f, -0.192758023738861f, 0.961202561855316f, - -0.193111822009087f, - 0.961054325103760f, -0.193465501070023f, 0.960905790328979f, - -0.193819075822830f, - 0.960757017135620f, -0.194172516465187f, 0.960607945919037f, - -0.194525867700577f, - 0.960458636283875f, -0.194879084825516f, 0.960309028625488f, - -0.195232197642326f, - 0.960159122943878f, -0.195585191249847f, 0.960008978843689f, - -0.195938065648079f, - 0.959858596324921f, -0.196290835738182f, 0.959707856178284f, - -0.196643486618996f, - 0.959556937217712f, -0.196996018290520f, 0.959405720233917f, - -0.197348430752754f, - 0.959254205226898f, -0.197700738906860f, 0.959102451801300f, - -0.198052927851677f, - 0.958950400352478f, -0.198404997587204f, 0.958798050880432f, - -0.198756948113441f, - 0.958645522594452f, -0.199108779430389f, 0.958492636680603f, - -0.199460506439209f, - 0.958339512348175f, -0.199812099337578f, 0.958186149597168f, - -0.200163587927818f, - 0.958032488822937f, -0.200514942407608f, 0.957878530025482f, - -0.200866192579269f, - 0.957724332809448f, -0.201217323541641f, 0.957569897174835f, - -0.201568335294724f, - 0.957415163516998f, -0.201919227838516f, 0.957260131835938f, - -0.202270001173019f, - 0.957104861736298f, -0.202620655298233f, 0.956949353218079f, - -0.202971190214157f, - 0.956793546676636f, -0.203321605920792f, 0.956637442111969f, - -0.203671902418137f, - 0.956481099128723f, -0.204022079706192f, 0.956324458122253f, - -0.204372137784958f, - 0.956167578697205f, -0.204722076654434f, 0.956010460853577f, - -0.205071896314621f, - 0.955853044986725f, -0.205421581864357f, 0.955695331096649f, - -0.205771163105965f, - 0.955537378787994f, -0.206120610237122f, 0.955379128456116f, - -0.206469938158989f, - 0.955220639705658f, -0.206819161772728f, 0.955061912536621f, - -0.207168251276016f, - 0.954902827739716f, -0.207517206668854f, 0.954743564128876f, - -0.207866057753563f, - 0.954584002494812f, -0.208214774727821f, 0.954424142837524f, - -0.208563387393951f, - 0.954264044761658f, -0.208911851048470f, 0.954103708267212f, - -0.209260210394859f, - 0.953943073749542f, -0.209608450531960f, 0.953782141208649f, - -0.209956556558609f, - 0.953620970249176f, -0.210304543375969f, 0.953459560871124f, - -0.210652396082878f, - 0.953297853469849f, -0.211000129580498f, 0.953135907649994f, - -0.211347743868828f, - 0.952973663806915f, -0.211695238947868f, 0.952811121940613f, - -0.212042599916458f, - 0.952648401260376f, -0.212389841675758f, 0.952485322952271f, - -0.212736949324608f, - 0.952322065830231f, -0.213083937764168f, 0.952158451080322f, - -0.213430806994438f, - 0.951994657516479f, -0.213777542114258f, 0.951830565929413f, - -0.214124158024788f, - 0.951666176319122f, -0.214470639824867f, 0.951501548290253f, - -0.214817002415657f, - 0.951336681842804f, -0.215163245797157f, 0.951171517372131f, - -0.215509355068207f, - 0.951006054878235f, -0.215855330228806f, 0.950840353965759f, - -0.216201186180115f, - 0.950674414634705f, -0.216546908020973f, 0.950508177280426f, - -0.216892510652542f, - 0.950341701507568f, -0.217237979173660f, 0.950174987316132f, - -0.217583328485489f, - 0.950007975101471f, -0.217928543686867f, 0.949840664863586f, - -0.218273624777794f, - 0.949673116207123f, -0.218618586659431f, 0.949505329132080f, - -0.218963414430618f, - 0.949337244033813f, -0.219308122992516f, 0.949168920516968f, - -0.219652697443962f, - 0.949000298976898f, -0.219997137784958f, 0.948831439018250f, - -0.220341444015503f, - 0.948662281036377f, -0.220685631036758f, 0.948492884635925f, - -0.221029683947563f, - 0.948323249816895f, -0.221373617649078f, 0.948153316974640f, - -0.221717402338982f, - 0.947983145713806f, -0.222061067819595f, 0.947812676429749f, - -0.222404599189758f, - 0.947641968727112f, -0.222748011350632f, 0.947470963001251f, - -0.223091274499893f, - 0.947299718856812f, -0.223434418439865f, 0.947128236293793f, - -0.223777428269386f, - 0.946956455707550f, -0.224120303988457f, 0.946784436702728f, - -0.224463045597076f, - 0.946612179279327f, -0.224805667996407f, 0.946439623832703f, - -0.225148141384125f, - 0.946266770362854f, -0.225490495562553f, 0.946093678474426f, - -0.225832715630531f, - 0.945920348167419f, -0.226174786686897f, 0.945746779441834f, - -0.226516738533974f, - 0.945572853088379f, -0.226858556270599f, 0.945398747920990f, - -0.227200239896774f, - 0.945224344730377f, -0.227541789412498f, 0.945049703121185f, - -0.227883204817772f, - 0.944874763488770f, -0.228224486112595f, 0.944699645042419f, - -0.228565633296967f, - 0.944524168968201f, -0.228906646370888f, 0.944348454475403f, - -0.229247525334358f, - 0.944172501564026f, -0.229588270187378f, 0.943996310234070f, - -0.229928880929947f, - 0.943819820880890f, -0.230269357562065f, 0.943643093109131f, - -0.230609700083733f, - 0.943466067314148f, -0.230949893593788f, 0.943288803100586f, - -0.231289967894554f, - 0.943111240863800f, -0.231629893183708f, 0.942933499813080f, - -0.231969684362412f, - 0.942755401134491f, -0.232309341430664f, 0.942577123641968f, - -0.232648864388466f, - 0.942398548126221f, -0.232988253235817f, 0.942219734191895f, - -0.233327493071556f, - 0.942040622234344f, -0.233666598796844f, 0.941861271858215f, - -0.234005570411682f, - 0.941681683063507f, -0.234344407916069f, 0.941501796245575f, - -0.234683111310005f, - 0.941321671009064f, -0.235021665692329f, 0.941141307353973f, - -0.235360085964203f, - 0.940960645675659f, -0.235698372125626f, 0.940779745578766f, - -0.236036509275436f, - 0.940598547458649f, -0.236374512314796f, 0.940417110919952f, - -0.236712381243706f, - 0.940235435962677f, -0.237050101161003f, 0.940053522586823f, - -0.237387686967850f, - 0.939871311187744f, -0.237725138664246f, 0.939688861370087f, - -0.238062441349030f, - 0.939506113529205f, -0.238399609923363f, 0.939323127269745f, - -0.238736644387245f, - 0.939139902591705f, -0.239073529839516f, 0.938956379890442f, - -0.239410281181335f, - 0.938772618770599f, -0.239746883511543f, 0.938588619232178f, - -0.240083336830139f, - 0.938404381275177f, -0.240419670939446f, 0.938219845294952f, - -0.240755841135979f, - 0.938035070896149f, -0.241091892123222f, 0.937849998474121f, - -0.241427779197693f, - 0.937664687633514f, -0.241763532161713f, 0.937479138374329f, - -0.242099151015282f, - 0.937293350696564f, -0.242434620857239f, 0.937107264995575f, - -0.242769956588745f, - 0.936920940876007f, -0.243105143308640f, 0.936734318733215f, - -0.243440181016922f, - 0.936547517776489f, -0.243775084614754f, 0.936360359191895f, - -0.244109839200974f, - 0.936173021793365f, -0.244444444775581f, 0.935985386371613f, - -0.244778916239738f, - 0.935797572135925f, -0.245113238692284f, 0.935609400272369f, - -0.245447427034378f, - 0.935421049594879f, -0.245781451463699f, 0.935232400894165f, - -0.246115356683731f, - 0.935043513774872f, -0.246449097990990f, 0.934854328632355f, - -0.246782705187798f, - 0.934664964675903f, -0.247116148471832f, 0.934475243091583f, - -0.247449472546577f, - 0.934285342693329f, -0.247782632708550f, 0.934095203876495f, - -0.248115643858910f, - 0.933904767036438f, -0.248448520898819f, 0.933714091777802f, - -0.248781248927116f, - 0.933523118495941f, -0.249113827943802f, 0.933331906795502f, - -0.249446272850037f, - 0.933140456676483f, -0.249778553843498f, 0.932948768138886f, - -0.250110685825348f, - 0.932756841182709f, -0.250442683696747f, 0.932564616203308f, - -0.250774532556534f, - 0.932372152805328f, -0.251106232404709f, 0.932179391384125f, - -0.251437783241272f, - 0.931986451148987f, -0.251769185066223f, 0.931793212890625f, - -0.252100437879562f, - 0.931599736213684f, -0.252431541681290f, 0.931405961513519f, - -0.252762526273727f, - 0.931211948394775f, -0.253093332052231f, 0.931017756462097f, - -0.253423988819122f, - 0.930823206901550f, -0.253754496574402f, 0.930628478527069f, - -0.254084855318069f, - 0.930433452129364f, -0.254415065050125f, 0.930238187313080f, - -0.254745125770569f, - 0.930042684078217f, -0.255075037479401f, 0.929846942424774f, - -0.255404800176620f, - 0.929650902748108f, -0.255734413862228f, 0.929454624652863f, - -0.256063878536224f, - 0.929258108139038f, -0.256393194198608f, 0.929061353206635f, - -0.256722360849380f, - 0.928864300251007f, -0.257051378488541f, 0.928667008876801f, - -0.257380217313766f, - 0.928469479084015f, -0.257708936929703f, 0.928271710872650f, - -0.258037507534027f, - 0.928073644638062f, -0.258365899324417f, 0.927875399589539f, - -0.258694142103195f, - 0.927676856517792f, -0.259022265672684f, 0.927478015422821f, - -0.259350210428238f, - 0.927278995513916f, -0.259678006172180f, 0.927079677581787f, - -0.260005623102188f, - 0.926880121231079f, -0.260333120822906f, 0.926680326461792f, - -0.260660469532013f, - 0.926480293273926f, -0.260987639427185f, 0.926280021667480f, - -0.261314690113068f, - 0.926079452037811f, -0.261641561985016f, 0.925878643989563f, - -0.261968284845352f, - 0.925677597522736f, -0.262294828891754f, 0.925476312637329f, - -0.262621253728867f, - 0.925274729728699f, -0.262947499752045f, 0.925072908401489f, - -0.263273626565933f, - 0.924870908260345f, -0.263599574565887f, 0.924668610095978f, - -0.263925373554230f, - 0.924466013908386f, -0.264250993728638f, 0.924263238906860f, - -0.264576494693756f, - 0.924060165882111f, -0.264901816844940f, 0.923856854438782f, - -0.265226989984512f, - 0.923653304576874f, -0.265552014112473f, 0.923449516296387f, - -0.265876859426498f, - 0.923245489597321f, -0.266201555728912f, 0.923041164875031f, - -0.266526103019714f, - 0.922836601734161f, -0.266850501298904f, 0.922631800174713f, - -0.267174720764160f, - 0.922426760196686f, -0.267498821020126f, 0.922221481800079f, - -0.267822742462158f, - 0.922015964984894f, -0.268146485090256f, 0.921810150146484f, - -0.268470078706741f, - 0.921604096889496f, -0.268793523311615f, 0.921397805213928f, - -0.269116818904877f, - 0.921191275119781f, -0.269439965486526f, 0.920984506607056f, - -0.269762933254242f, - 0.920777499675751f, -0.270085722208023f, 0.920570194721222f, - -0.270408391952515f, - 0.920362710952759f, -0.270730882883072f, 0.920154929161072f, - -0.271053224802017f, - 0.919946908950806f, -0.271375387907028f, 0.919738650321960f, - -0.271697402000427f, - 0.919530093669891f, -0.272019267082214f, 0.919321358203888f, - -0.272340953350067f, - 0.919112324714661f, -0.272662490606308f, 0.918903112411499f, - -0.272983878850937f, - 0.918693602085114f, -0.273305088281631f, 0.918483853340149f, - -0.273626148700714f, - 0.918273866176605f, -0.273947030305862f, 0.918063640594482f, - -0.274267762899399f, - 0.917853116989136f, -0.274588316679001f, 0.917642414569855f, - -0.274908751249313f, - 0.917431414127350f, -0.275228977203369f, 0.917220234870911f, - -0.275549083948135f, - 0.917008757591248f, -0.275868982076645f, 0.916797041893005f, - -0.276188760995865f, - 0.916585087776184f, -0.276508361101151f, 0.916372895240784f, - -0.276827782392502f, - 0.916160404682159f, -0.277147054672241f, 0.915947735309601f, - -0.277466177940369f, - 0.915734827518463f, -0.277785122394562f, 0.915521621704102f, - -0.278103888034821f, - 0.915308177471161f, -0.278422504663467f, 0.915094554424286f, - -0.278740972280502f, - 0.914880633354187f, -0.279059261083603f, 0.914666473865509f, - -0.279377400875092f, - 0.914452075958252f, -0.279695361852646f, 0.914237439632416f, - -0.280013144016266f, - 0.914022505283356f, -0.280330777168274f, 0.913807392120361f, - -0.280648261308670f, - 0.913592040538788f, -0.280965566635132f, 0.913376390933990f, - -0.281282693147659f, - 0.913160502910614f, -0.281599670648575f, 0.912944436073303f, - -0.281916469335556f, - 0.912728071212769f, -0.282233119010925f, 0.912511467933655f, - -0.282549589872360f, - 0.912294626235962f, -0.282865911722183f, 0.912077546119690f, - -0.283182054758072f, - 0.911860227584839f, -0.283498018980026f, 0.911642670631409f, - -0.283813834190369f, - 0.911424875259399f, -0.284129470586777f, 0.911206841468811f, - -0.284444957971573f, - 0.910988569259644f, -0.284760266542435f, 0.910769999027252f, - -0.285075396299362f, - 0.910551249980927f, -0.285390377044678f, 0.910332262516022f, - -0.285705178976059f, - 0.910112977027893f, -0.286019802093506f, 0.909893512725830f, - -0.286334276199341f, - 0.909673750400543f, -0.286648571491241f, 0.909453809261322f, - -0.286962717771530f, - 0.909233570098877f, -0.287276685237885f, 0.909013092517853f, - -0.287590473890305f, - 0.908792436122894f, -0.287904083728790f, 0.908571481704712f, - -0.288217544555664f, - 0.908350288867950f, -0.288530826568604f, 0.908128857612610f, - -0.288843959569931f, - 0.907907187938690f, -0.289156883955002f, 0.907685279846191f, - -0.289469659328461f, - 0.907463192939758f, -0.289782285690308f, 0.907240808010101f, - -0.290094703435898f, - 0.907018184661865f, -0.290406972169876f, 0.906795322895050f, - -0.290719062089920f, - 0.906572222709656f, -0.291031002998352f, 0.906348884105682f, - -0.291342735290527f, - 0.906125307083130f, -0.291654318571091f, 0.905901491641998f, - -0.291965723037720f, - 0.905677437782288f, -0.292276978492737f, 0.905453145503998f, - -0.292588025331497f, - 0.905228614807129f, -0.292898923158646f, 0.905003845691681f, - -0.293209642171860f, - 0.904778838157654f, -0.293520182371140f, 0.904553592205048f, - -0.293830573558807f, - 0.904328107833862f, -0.294140785932541f, 0.904102385044098f, - -0.294450789690018f, - 0.903876423835754f, -0.294760644435883f, 0.903650224208832f, - -0.295070350170136f, - 0.903423786163330f, -0.295379847288132f, 0.903197109699249f, - -0.295689195394516f, - 0.902970194816589f, -0.295998334884644f, 0.902743041515350f, - -0.296307325363159f, - 0.902515649795532f, -0.296616137027740f, 0.902288019657135f, - -0.296924799680710f, - 0.902060210704803f, -0.297233253717422f, 0.901832103729248f, - -0.297541528940201f, - 0.901603758335114f, -0.297849655151367f, 0.901375174522400f, - -0.298157602548599f, - 0.901146411895752f, -0.298465341329575f, 0.900917351245880f, - -0.298772931098938f, - 0.900688111782074f, -0.299080342054367f, 0.900458574295044f, - -0.299387603998184f, - 0.900228857994080f, -0.299694657325745f, 0.899998843669891f, - -0.300001531839371f, - 0.899768650531769f, -0.300308227539063f, 0.899538159370422f, - -0.300614774227142f, - 0.899307489395142f, -0.300921112298965f, 0.899076581001282f, - -0.301227301359177f, - 0.898845434188843f, -0.301533311605453f, 0.898614048957825f, - -0.301839113235474f, - 0.898382425308228f, -0.302144765853882f, 0.898150563240051f, - -0.302450239658356f, - 0.897918462753296f, -0.302755534648895f, 0.897686123847961f, - -0.303060621023178f, - 0.897453546524048f, -0.303365558385849f, 0.897220790386200f, - -0.303670316934586f, - 0.896987736225128f, -0.303974896669388f, 0.896754503250122f, - -0.304279297590256f, - 0.896520972251892f, -0.304583519697189f, 0.896287262439728f, - -0.304887533187866f, - 0.896053314208984f, -0.305191397666931f, 0.895819067955017f, - -0.305495083332062f, - 0.895584642887115f, -0.305798590183258f, 0.895349979400635f, - -0.306101888418198f, - 0.895115137100220f, -0.306405037641525f, 0.894879996776581f, - -0.306708008050919f, - 0.894644618034363f, -0.307010769844055f, 0.894409060478210f, - -0.307313382625580f, - 0.894173204898834f, -0.307615786790848f, 0.893937170505524f, - -0.307918041944504f, - 0.893700897693634f, -0.308220088481903f, 0.893464326858521f, - -0.308521956205368f, - 0.893227577209473f, -0.308823645114899f, 0.892990648746490f, - -0.309125155210495f, - 0.892753422260284f, -0.309426486492157f, 0.892515957355499f, - -0.309727638959885f, - 0.892278313636780f, -0.310028612613678f, 0.892040371894836f, - -0.310329377651215f, - 0.891802251338959f, -0.310629993677139f, 0.891563892364502f, - -0.310930401086807f, - 0.891325294971466f, -0.311230629682541f, 0.891086459159851f, - -0.311530679464340f, - 0.890847444534302f, -0.311830550432205f, 0.890608131885529f, - -0.312130242586136f, - 0.890368640422821f, -0.312429755926132f, 0.890128850936890f, - -0.312729060649872f, - 0.889888882637024f, -0.313028186559677f, 0.889648675918579f, - -0.313327133655548f, - 0.889408230781555f, -0.313625901937485f, 0.889167606830597f, - -0.313924491405487f, - 0.888926684856415f, -0.314222872257233f, 0.888685584068298f, - -0.314521104097366f, - 0.888444244861603f, -0.314819127321243f, 0.888202667236328f, - -0.315116971731186f, - 0.887960851192474f, -0.315414607524872f, 0.887718796730042f, - -0.315712094306946f, - 0.887476563453674f, -0.316009372472763f, 0.887234091758728f, - -0.316306471824646f, - 0.886991322040558f, -0.316603392362595f, 0.886748373508453f, - -0.316900104284287f, - 0.886505246162415f, -0.317196637392044f, 0.886261820793152f, - -0.317492991685867f, - 0.886018216609955f, -0.317789167165756f, 0.885774314403534f, - -0.318085134029388f, - 0.885530233383179f, -0.318380922079086f, 0.885285973548889f, - -0.318676531314850f, - 0.885041415691376f, -0.318971961736679f, 0.884796679019928f, - -0.319267183542252f, - 0.884551644325256f, -0.319562226533890f, 0.884306430816650f, - -0.319857090711594f, - 0.884061038494110f, -0.320151746273041f, 0.883815348148346f, - -0.320446223020554f, - 0.883569478988647f, -0.320740520954132f, 0.883323311805725f, - -0.321034610271454f, - 0.883076965808868f, -0.321328520774841f, 0.882830440998077f, - -0.321622252464294f, - 0.882583618164063f, -0.321915775537491f, 0.882336616516113f, - -0.322209119796753f, - 0.882089376449585f, -0.322502255439758f, 0.881841897964478f, - -0.322795242071152f, - 0.881594181060791f, -0.323088020086288f, 0.881346285343170f, - -0.323380589485168f, - 0.881098151206970f, -0.323672980070114f, 0.880849778652191f, - -0.323965191841125f, - 0.880601167678833f, -0.324257194995880f, 0.880352377891541f, - -0.324549019336700f, - 0.880103349685669f, -0.324840664863586f, 0.879854083061218f, - -0.325132101774216f, - 0.879604578018188f, -0.325423330068588f, 0.879354894161224f, - -0.325714409351349f, - 0.879104971885681f, -0.326005280017853f, 0.878854811191559f, - -0.326295942068100f, - 0.878604412078857f, -0.326586425304413f, 0.878353834152222f, - -0.326876699924469f, - 0.878103017807007f, -0.327166795730591f, 0.877851963043213f, - -0.327456712722778f, - 0.877600669860840f, -0.327746421098709f, 0.877349197864532f, - -0.328035950660706f, - 0.877097487449646f, -0.328325271606445f, 0.876845538616180f, - -0.328614413738251f, - 0.876593410968781f, -0.328903347253799f, 0.876341044902802f, - -0.329192101955414f, - 0.876088440418243f, -0.329480648040771f, 0.875835597515106f, - -0.329769015312195f, - 0.875582575798035f, -0.330057173967361f, 0.875329315662384f, - -0.330345153808594f, - 0.875075817108154f, -0.330632925033569f, 0.874822139739990f, - -0.330920487642288f, - 0.874568223953247f, -0.331207901239395f, 0.874314069747925f, - -0.331495076417923f, - 0.874059677124023f, -0.331782072782516f, 0.873805105686188f, - -0.332068890333176f, - 0.873550295829773f, -0.332355499267578f, 0.873295307159424f, - -0.332641899585724f, - 0.873040020465851f, -0.332928121089935f, 0.872784554958344f, - -0.333214133977890f, - 0.872528910636902f, -0.333499968051910f, 0.872272968292236f, - -0.333785593509674f, - 0.872016847133636f, -0.334071010351181f, 0.871760547161102f, - -0.334356248378754f, - 0.871503949165344f, -0.334641307592392f, 0.871247172355652f, - -0.334926128387451f, - 0.870990216732025f, -0.335210770368576f, 0.870733022689819f, - -0.335495233535767f, - 0.870475590229034f, -0.335779488086700f, 0.870217919349670f, - -0.336063534021378f, - 0.869960069656372f, -0.336347371339798f, 0.869701981544495f, - -0.336631029844284f, - 0.869443655014038f, -0.336914509534836f, 0.869185149669647f, - -0.337197750806808f, - 0.868926405906677f, -0.337480813264847f, 0.868667483329773f, - -0.337763696908951f, - 0.868408262729645f, -0.338046342134476f, 0.868148922920227f, - -0.338328808546066f, - 0.867889285087585f, -0.338611096143723f, 0.867629468441010f, - -0.338893145322800f, - 0.867369413375854f, -0.339175015687943f, 0.867109179496765f, - -0.339456677436829f, - 0.866848707199097f, -0.339738160371780f, 0.866588056087494f, - -0.340019434690475f, - 0.866327106952667f, -0.340300500392914f, 0.866066038608551f, - -0.340581357479095f, - 0.865804672241211f, -0.340862035751343f, 0.865543127059937f, - -0.341142505407333f, - 0.865281403064728f, -0.341422766447067f, 0.865019381046295f, - -0.341702848672867f, - 0.864757239818573f, -0.341982692480087f, 0.864494800567627f, - -0.342262357473373f, - 0.864232182502747f, -0.342541843652725f, 0.863969385623932f, - -0.342821091413498f, - 0.863706290721893f, -0.343100160360336f, 0.863443076610565f, - -0.343379020690918f, - 0.863179564476013f, -0.343657672405243f, 0.862915873527527f, - -0.343936115503311f, - 0.862652003765106f, -0.344214379787445f, 0.862387895584106f, - -0.344492435455322f, - 0.862123548984528f, -0.344770282506943f, 0.861859023571014f, - -0.345047920942307f, - 0.861594259738922f, -0.345325350761414f, 0.861329257488251f, - -0.345602601766586f, - 0.861064076423645f, -0.345879614353180f, 0.860798716545105f, - -0.346156448125839f, - 0.860533118247986f, -0.346433073282242f, 0.860267281532288f, - -0.346709519624710f, - 0.860001266002655f, -0.346985727548599f, 0.859735012054443f, - -0.347261756658554f, - 0.859468579292297f, -0.347537547349930f, 0.859201908111572f, - -0.347813159227371f, - 0.858934998512268f, -0.348088562488556f, 0.858667910099030f, - -0.348363757133484f, - 0.858400642871857f, -0.348638743162155f, 0.858133137226105f, - -0.348913550376892f, - 0.857865393161774f, -0.349188119173050f, 0.857597470283508f, - -0.349462509155273f, - 0.857329368591309f, -0.349736660718918f, 0.857060968875885f, - -0.350010633468628f, - 0.856792449951172f, -0.350284397602081f, 0.856523692607880f, - -0.350557953119278f, - 0.856254696846008f, -0.350831300020218f, 0.855985522270203f, - -0.351104438304901f, - 0.855716109275818f, -0.351377367973328f, 0.855446517467499f, - -0.351650089025497f, - 0.855176687240601f, -0.351922631263733f, 0.854906618595123f, - -0.352194935083389f, - 0.854636430740356f, -0.352467030286789f, 0.854365944862366f, - -0.352738946676254f, - 0.854095339775085f, -0.353010624647141f, 0.853824436664581f, - -0.353282123804092f, - 0.853553414344788f, -0.353553384542465f, 0.853282094001770f, - -0.353824466466904f, - 0.853010654449463f, -0.354095309972763f, 0.852738916873932f, - -0.354365974664688f, - 0.852467060089111f, -0.354636400938034f, 0.852194905281067f, - -0.354906648397446f, - 0.851922631263733f, -0.355176687240601f, 0.851650118827820f, - -0.355446487665176f, - 0.851377367973328f, -0.355716109275818f, 0.851104438304901f, - -0.355985492467880f, - 0.850831270217896f, -0.356254696846008f, 0.850557923316956f, - -0.356523662805557f, - 0.850284397602081f, -0.356792420148849f, 0.850010633468628f, - -0.357060998678207f, - 0.849736690521240f, -0.357329338788986f, 0.849462509155273f, - -0.357597470283508f, - 0.849188148975372f, -0.357865422964096f, 0.848913550376892f, - -0.358133137226105f, - 0.848638772964478f, -0.358400642871857f, 0.848363757133484f, - -0.358667939901352f, - 0.848088562488556f, -0.358935028314590f, 0.847813189029694f, - -0.359201908111572f, - 0.847537577152252f, -0.359468549489975f, 0.847261726856232f, - -0.359735012054443f, - 0.846985757350922f, -0.360001266002655f, 0.846709489822388f, - -0.360267281532288f, - 0.846433103084564f, -0.360533088445663f, 0.846156477928162f, - -0.360798716545105f, - 0.845879614353180f, -0.361064106225967f, 0.845602571964264f, - -0.361329287290573f, - 0.845325350761414f, -0.361594229936600f, 0.845047891139984f, - -0.361858993768692f, - 0.844770252704620f, -0.362123548984528f, 0.844492435455322f, - -0.362387865781784f, - 0.844214379787445f, -0.362651973962784f, 0.843936145305634f, - -0.362915903329849f, - 0.843657672405243f, -0.363179564476013f, 0.843379020690918f, - -0.363443046808243f, - 0.843100130558014f, -0.363706320524216f, 0.842821121215820f, - -0.363969355821610f, - 0.842541813850403f, -0.364232182502747f, 0.842262387275696f, - -0.364494800567627f, - 0.841982722282410f, -0.364757210016251f, 0.841702818870544f, - -0.365019410848618f, - 0.841422796249390f, -0.365281373262405f, 0.841142535209656f, - -0.365543156862259f, - 0.840862035751343f, -0.365804702043533f, 0.840581357479095f, - -0.366066008806229f, - 0.840300500392914f, -0.366327136754990f, 0.840019404888153f, - -0.366588026285172f, - 0.839738130569458f, -0.366848707199097f, 0.839456677436829f, - -0.367109179496765f, - 0.839175045490265f, -0.367369443178177f, 0.838893175125122f, - -0.367629468441010f, - 0.838611066341400f, -0.367889285087585f, 0.838328838348389f, - -0.368148893117905f, - 0.838046371936798f, -0.368408292531967f, 0.837763667106628f, - -0.368667453527451f, - 0.837480843067169f, -0.368926405906677f, 0.837197780609131f, - -0.369185149669647f, - 0.836914479732513f, -0.369443655014038f, 0.836631059646606f, - -0.369701951742172f, - 0.836347401142120f, -0.369960039854050f, 0.836063504219055f, - -0.370217919349670f, - 0.835779488086700f, -0.370475560426712f, 0.835495233535767f, - -0.370732992887497f, - 0.835210800170898f, -0.370990216732025f, 0.834926128387451f, - -0.371247202157974f, - 0.834641277790070f, -0.371503978967667f, 0.834356248378754f, - -0.371760547161102f, - 0.834071040153503f, -0.372016876935959f, 0.833785593509674f, - -0.372272998094559f, - 0.833499968051910f, -0.372528880834579f, 0.833214163780212f, - -0.372784584760666f, - 0.832928121089935f, -0.373040050268173f, 0.832641899585724f, - -0.373295277357101f, - 0.832355499267578f, -0.373550295829773f, 0.832068860530853f, - -0.373805105686188f, - 0.831782102584839f, -0.374059677124023f, 0.831495106220245f, - -0.374314039945602f, - 0.831207871437073f, -0.374568194150925f, 0.830920517444611f, - -0.374822109937668f, - 0.830632925033569f, -0.375075817108154f, 0.830345153808594f, - -0.375329315662384f, - 0.830057144165039f, -0.375582575798035f, 0.829769015312195f, - -0.375835597515106f, - 0.829480648040771f, -0.376088410615921f, 0.829192101955414f, - -0.376341015100479f, - 0.828903317451477f, -0.376593410968781f, 0.828614413738251f, - -0.376845568418503f, - 0.828325271606445f, -0.377097487449646f, 0.828035950660706f, - -0.377349197864532f, - 0.827746450901031f, -0.377600699663162f, 0.827456712722778f, - -0.377851963043213f, - 0.827166795730591f, -0.378102988004684f, 0.826876699924469f, - -0.378353834152222f, - 0.826586425304413f, -0.378604412078857f, 0.826295912265778f, - -0.378854811191559f, - 0.826005280017853f, -0.379104942083359f, 0.825714409351349f, - -0.379354894161224f, - 0.825423359870911f, -0.379604607820511f, 0.825132071971893f, - -0.379854083061218f, - 0.824840664863586f, -0.380103349685669f, 0.824549019336700f, - -0.380352377891541f, - 0.824257194995880f, -0.380601197481155f, 0.823965191841125f, - -0.380849778652191f, - 0.823673009872437f, -0.381098151206970f, 0.823380589485168f, - -0.381346285343170f, - 0.823087990283966f, -0.381594210863113f, 0.822795212268829f, - -0.381841897964478f, - 0.822502255439758f, -0.382089376449585f, 0.822209119796753f, - -0.382336616516113f, - 0.821915745735168f, -0.382583618164063f, 0.821622252464294f, - -0.382830440998077f, - 0.821328520774841f, -0.383076995611191f, 0.821034610271454f, - -0.383323341608047f, - 0.820740520954132f, -0.383569449186325f, 0.820446193218231f, - -0.383815348148346f, - 0.820151746273041f, -0.384061008691788f, 0.819857060909271f, - -0.384306460618973f, - 0.819562196731567f, -0.384551674127579f, 0.819267153739929f, - -0.384796649217606f, - 0.818971931934357f, -0.385041415691376f, 0.818676531314850f, - -0.385285943746567f, - 0.818380951881409f, -0.385530263185501f, 0.818085134029388f, - -0.385774344205856f, - 0.817789137363434f, -0.386018186807632f, 0.817493021488190f, - -0.386261820793152f, - 0.817196667194366f, -0.386505216360092f, 0.816900074481964f, - -0.386748403310776f, - 0.816603362560272f, -0.386991351842880f, 0.816306471824646f, - -0.387234061956406f, - 0.816009342670441f, -0.387476563453674f, 0.815712094306946f, - -0.387718826532364f, - 0.815414607524872f, -0.387960851192474f, 0.815116941928864f, - -0.388202667236328f, - 0.814819097518921f, -0.388444244861603f, 0.814521074295044f, - -0.388685584068298f, - 0.814222872257233f, -0.388926714658737f, 0.813924491405487f, - -0.389167606830597f, - 0.813625931739807f, -0.389408260583878f, 0.813327133655548f, - -0.389648675918579f, - 0.813028216362000f, -0.389888882637024f, 0.812729060649872f, - -0.390128880739212f, - 0.812429726123810f, -0.390368610620499f, 0.812130272388458f, - -0.390608131885529f, - 0.811830580234528f, -0.390847414731979f, 0.811530709266663f, - -0.391086459159851f, - 0.811230659484863f, -0.391325294971466f, 0.810930430889130f, - -0.391563892364502f, - 0.810629963874817f, -0.391802251338959f, 0.810329377651215f, - -0.392040401697159f, - 0.810028612613678f, -0.392278283834457f, 0.809727668762207f, - -0.392515957355499f, - 0.809426486492157f, -0.392753422260284f, 0.809125185012817f, - -0.392990618944168f, - 0.808823645114899f, -0.393227607011795f, 0.808521986007690f, - -0.393464356660843f, - 0.808220088481903f, -0.393700867891312f, 0.807918012142181f, - -0.393937170505524f, - 0.807615816593170f, -0.394173204898834f, 0.807313382625580f, - -0.394409030675888f, - 0.807010769844055f, -0.394644618034363f, 0.806707978248596f, - -0.394879996776581f, - 0.806405067443848f, -0.395115107297897f, 0.806101918220520f, - -0.395350009202957f, - 0.805798590183258f, -0.395584672689438f, 0.805495083332062f, - -0.395819097757339f, - 0.805191397666931f, -0.396053284406662f, 0.804887533187866f, - -0.396287262439728f, - 0.804583489894867f, -0.396520972251892f, 0.804279267787933f, - -0.396754473447800f, - 0.803974866867065f, -0.396987736225128f, 0.803670346736908f, - -0.397220760583878f, - 0.803365588188171f, -0.397453576326370f, 0.803060650825500f, - -0.397686123847961f, - 0.802755534648895f, -0.397918462753296f, 0.802450239658356f, - -0.398150533437729f, - 0.802144765853882f, -0.398382395505905f, 0.801839113235474f, - -0.398614019155502f, - 0.801533281803131f, -0.398845434188843f, 0.801227271556854f, - -0.399076581001282f, - 0.800921142101288f, -0.399307489395142f, 0.800614774227142f, - -0.399538189172745f, - 0.800308227539063f, -0.399768620729446f, 0.800001561641693f, - -0.399998843669891f, - 0.799694657325745f, -0.400228828191757f, 0.799387574195862f, - -0.400458574295044f, - 0.799080371856689f, -0.400688081979752f, 0.798772931098938f, - -0.400917351245880f, - 0.798465371131897f, -0.401146411895752f, 0.798157572746277f, - -0.401375204324722f, - 0.797849655151367f, -0.401603758335114f, 0.797541558742523f, - -0.401832103729248f, - 0.797233223915100f, -0.402060180902481f, 0.796924769878387f, - -0.402288049459457f, - 0.796616137027740f, -0.402515679597855f, 0.796307325363159f, - -0.402743041515350f, - 0.795998334884644f, -0.402970194816589f, 0.795689165592194f, - -0.403197109699249f, - 0.795379877090454f, -0.403423786163330f, 0.795070350170136f, - -0.403650224208832f, - 0.794760644435883f, -0.403876423835754f, 0.794450819492340f, - -0.404102355241776f, - 0.794140756130219f, -0.404328078031540f, 0.793830573558807f, - -0.404553562402725f, - 0.793520212173462f, -0.404778808355331f, 0.793209671974182f, - -0.405003815889359f, - 0.792898952960968f, -0.405228585004807f, 0.792588055133820f, - -0.405453115701675f, - 0.792276978492737f, -0.405677437782288f, 0.791965723037720f, - -0.405901491641998f, - 0.791654348373413f, -0.406125307083130f, 0.791342735290527f, - -0.406348884105682f, - 0.791031002998352f, -0.406572192907333f, 0.790719091892242f, - -0.406795293092728f, - 0.790407001972198f, -0.407018154859543f, 0.790094733238220f, - -0.407240778207779f, - 0.789782285690308f, -0.407463163137436f, 0.789469659328461f, - -0.407685309648514f, - 0.789156913757324f, -0.407907217741013f, 0.788843929767609f, - -0.408128857612610f, - 0.788530826568604f, -0.408350288867950f, 0.788217544555664f, - -0.408571451902390f, - 0.787904083728790f, -0.408792406320572f, 0.787590444087982f, - -0.409013092517853f, - 0.787276685237885f, -0.409233570098877f, 0.786962687969208f, - -0.409453779459000f, - 0.786648571491241f, -0.409673750400543f, 0.786334276199341f, - -0.409893482923508f, - 0.786019802093506f, -0.410112977027893f, 0.785705149173737f, - -0.410332232713699f, - 0.785390377044678f, -0.410551249980927f, 0.785075426101685f, - -0.410770028829575f, - 0.784760236740112f, -0.410988569259644f, 0.784444928169250f, - -0.411206841468811f, - 0.784129500389099f, -0.411424905061722f, 0.783813834190369f, - -0.411642700433731f, - 0.783498048782349f, -0.411860257387161f, 0.783182024955750f, - -0.412077575922012f, - 0.782865881919861f, -0.412294656038284f, 0.782549619674683f, - -0.412511497735977f, - 0.782233119010925f, -0.412728071212769f, 0.781916499137878f, - -0.412944436073303f, - 0.781599700450897f, -0.413160532712936f, 0.781282722949982f, - -0.413376390933990f, - 0.780965566635132f, -0.413592010736465f, 0.780648231506348f, - -0.413807392120361f, - 0.780330777168274f, -0.414022535085678f, 0.780013144016266f, - -0.414237409830093f, - 0.779695332050323f, -0.414452046155930f, 0.779377400875092f, - -0.414666473865509f, - 0.779059290885925f, -0.414880603551865f, 0.778741002082825f, - -0.415094524621964f, - 0.778422534465790f, -0.415308207273483f, 0.778103888034821f, - -0.415521621704102f, - 0.777785122394562f, -0.415734797716141f, 0.777466177940369f, - -0.415947735309601f, - 0.777147054672241f, -0.416160434484482f, 0.776827812194824f, - -0.416372895240784f, - 0.776508331298828f, -0.416585087776184f, 0.776188731193542f, - -0.416797041893005f, - 0.775869011878967f, -0.417008757591248f, 0.775549054145813f, - -0.417220205068588f, - 0.775228977203369f, -0.417431443929672f, 0.774908721446991f, - -0.417642414569855f, - 0.774588346481323f, -0.417853146791458f, 0.774267733097076f, - -0.418063640594482f, - 0.773947000503540f, -0.418273866176605f, 0.773626148700714f, - -0.418483853340149f, - 0.773305058479309f, -0.418693602085114f, 0.772983849048615f, - -0.418903112411499f, - 0.772662520408630f, -0.419112354516983f, 0.772340953350067f, - -0.419321358203888f, - 0.772019267082214f, -0.419530123472214f, 0.771697402000427f, - -0.419738620519638f, - 0.771375417709351f, -0.419946908950806f, 0.771053194999695f, - -0.420154929161072f, - 0.770730912685394f, -0.420362681150436f, 0.770408391952515f, - -0.420570224523544f, - 0.770085752010345f, -0.420777499675751f, 0.769762933254242f, - -0.420984506607056f, - 0.769439935684204f, -0.421191304922104f, 0.769116818904877f, - -0.421397835016251f, - 0.768793523311615f, -0.421604126691818f, 0.768470108509064f, - -0.421810150146484f, - 0.768146514892578f, -0.422015935182571f, 0.767822742462158f, - -0.422221481800079f, - 0.767498791217804f, -0.422426789999008f, 0.767174720764160f, - -0.422631829977036f, - 0.766850471496582f, -0.422836631536484f, 0.766526103019714f, - -0.423041164875031f, - 0.766201555728912f, -0.423245459794998f, 0.765876889228821f, - -0.423449516296387f, - 0.765551984310150f, -0.423653304576874f, 0.765226960182190f, - -0.423856884241104f, - 0.764901816844940f, -0.424060165882111f, 0.764576494693756f, - -0.424263238906860f, - 0.764250993728638f, -0.424466013908386f, 0.763925373554230f, - -0.424668580293655f, - 0.763599574565887f, -0.424870878458023f, 0.763273596763611f, - -0.425072938203812f, - 0.762947499752045f, -0.425274729728699f, 0.762621283531189f, - -0.425476282835007f, - 0.762294828891754f, -0.425677597522736f, 0.761968255043030f, - -0.425878643989563f, - 0.761641561985016f, -0.426079452037811f, 0.761314690113068f, - -0.426279991865158f, - 0.760987639427185f, -0.426480293273926f, 0.760660469532013f, - -0.426680356264114f, - 0.760333120822906f, -0.426880151033401f, 0.760005652904511f, - -0.427079707384110f, - 0.759678006172180f, -0.427278995513916f, 0.759350180625916f, - -0.427478045225143f, - 0.759022235870361f, -0.427676826715469f, 0.758694171905518f, - -0.427875369787216f, - 0.758365929126740f, -0.428073674440384f, 0.758037507534027f, - -0.428271710872650f, - 0.757708966732025f, -0.428469479084015f, 0.757380247116089f, - -0.428667008876801f, - 0.757051348686218f, -0.428864300251007f, 0.756722390651703f, - -0.429061323404312f, - 0.756393194198608f, -0.429258108139038f, 0.756063878536224f, - -0.429454624652863f, - 0.755734443664551f, -0.429650902748108f, 0.755404829978943f, - -0.429846942424774f, - 0.755075037479401f, -0.430042684078217f, 0.754745125770569f, - -0.430238217115402f, - 0.754415094852448f, -0.430433481931686f, 0.754084885120392f, - -0.430628478527069f, - 0.753754496574402f, -0.430823236703873f, 0.753423988819122f, - -0.431017726659775f, - 0.753093302249908f, -0.431211978197098f, 0.752762496471405f, - -0.431405961513519f, - 0.752431571483612f, -0.431599706411362f, 0.752100467681885f, - -0.431793183088303f, - 0.751769185066223f, -0.431986421346664f, 0.751437783241272f, - -0.432179391384125f, - 0.751106262207031f, -0.432372123003006f, 0.750774562358856f, - -0.432564586400986f, - 0.750442683696747f, -0.432756811380386f, 0.750110685825348f, - -0.432948768138886f, - 0.749778568744659f, -0.433140486478806f, 0.749446272850037f, - -0.433331936597824f, - 0.749113857746124f, -0.433523118495941f, 0.748781263828278f, - -0.433714061975479f, - 0.748448550701141f, -0.433904737234116f, 0.748115658760071f, - -0.434095174074173f, - 0.747782647609711f, -0.434285342693329f, 0.747449457645416f, - -0.434475272893906f, - 0.747116148471832f, -0.434664934873581f, 0.746782720088959f, - -0.434854328632355f, - 0.746449112892151f, -0.435043483972549f, 0.746115326881409f, - -0.435232400894165f, - 0.745781481266022f, -0.435421019792557f, 0.745447397232056f, - -0.435609430074692f, - 0.745113253593445f, -0.435797542333603f, 0.744778931140900f, - -0.435985416173935f, - 0.744444429874420f, -0.436173021793365f, 0.744109809398651f, - -0.436360388994217f, - 0.743775069713593f, -0.436547487974167f, 0.743440151214600f, - -0.436734348535538f, - 0.743105113506317f, -0.436920911073685f, 0.742769956588745f, - -0.437107264995575f, - 0.742434620857239f, -0.437293320894241f, 0.742099165916443f, - -0.437479138374329f, - 0.741763532161713f, -0.437664687633514f, 0.741427779197693f, - -0.437849998474121f, - 0.741091907024384f, -0.438035041093826f, 0.740755856037140f, - -0.438219845294952f, - 0.740419685840607f, -0.438404351472855f, 0.740083336830139f, - -0.438588619232178f, - 0.739746868610382f, -0.438772648572922f, 0.739410281181335f, - -0.438956409692764f, - 0.739073514938354f, -0.439139902591705f, 0.738736629486084f, - -0.439323127269745f, - 0.738399624824524f, -0.439506113529205f, 0.738062441349030f, - -0.439688831567764f, - 0.737725138664246f, -0.439871311187744f, 0.737387716770172f, - -0.440053492784500f, - 0.737050116062164f, -0.440235435962677f, 0.736712396144867f, - -0.440417140722275f, - 0.736374497413635f, -0.440598547458649f, 0.736036539077759f, - -0.440779715776443f, - 0.735698342323303f, -0.440960645675659f, 0.735360085964203f, - -0.441141277551651f, - 0.735021650791168f, -0.441321671009064f, 0.734683096408844f, - -0.441501796245575f, - 0.734344422817230f, -0.441681683063507f, 0.734005570411682f, - -0.441861271858215f, - 0.733666598796844f, -0.442040622234344f, 0.733327507972717f, - -0.442219734191895f, - 0.732988238334656f, -0.442398548126221f, 0.732648849487305f, - -0.442577123641968f, - 0.732309341430664f, -0.442755430936813f, 0.731969714164734f, - -0.442933470010757f, - 0.731629908084869f, -0.443111270666122f, 0.731289982795715f, - -0.443288803100586f, - 0.730949878692627f, -0.443466067314148f, 0.730609714984894f, - -0.443643063306808f, - 0.730269372463226f, -0.443819820880890f, 0.729928910732269f, - -0.443996280431747f, - 0.729588270187378f, -0.444172531366348f, 0.729247510433197f, - -0.444348484277725f, - 0.728906631469727f, -0.444524168968201f, 0.728565633296967f, - -0.444699615240097f, - 0.728224515914917f, -0.444874793291092f, 0.727883219718933f, - -0.445049703121185f, - 0.727541804313660f, -0.445224374532700f, 0.727200269699097f, - -0.445398747920990f, - 0.726858556270599f, -0.445572882890701f, 0.726516723632813f, - -0.445746749639511f, - 0.726174771785736f, -0.445920348167419f, 0.725832700729370f, - -0.446093708276749f, - 0.725490510463715f, -0.446266770362854f, 0.725148141384125f, - -0.446439594030380f, - 0.724805653095245f, -0.446612149477005f, 0.724463045597076f, - -0.446784436702728f, - 0.724120318889618f, -0.446956485509872f, 0.723777413368225f, - -0.447128236293793f, - 0.723434448242188f, -0.447299748659134f, 0.723091304302216f, - -0.447470992803574f, - 0.722747981548309f, -0.447641968727112f, 0.722404599189758f, - -0.447812676429749f, - 0.722061097621918f, -0.447983115911484f, 0.721717417240143f, - -0.448153316974640f, - 0.721373617649078f, -0.448323249816895f, 0.721029698848724f, - -0.448492884635925f, - 0.720685660839081f, -0.448662281036377f, 0.720341444015503f, - -0.448831409215927f, - 0.719997107982636f, -0.449000298976898f, 0.719652712345123f, - -0.449168890714645f, - 0.719308137893677f, -0.449337244033813f, 0.718963444232941f, - -0.449505299329758f, - 0.718618571758270f, -0.449673116207123f, 0.718273639678955f, - -0.449840664863586f, - 0.717928528785706f, -0.450007945299149f, 0.717583298683167f, - -0.450174957513809f, - 0.717238008975983f, -0.450341701507568f, 0.716892480850220f, - -0.450508207082748f, - 0.716546893119812f, -0.450674414634705f, 0.716201186180115f, - -0.450840383768082f, - 0.715855300426483f, -0.451006084680557f, 0.715509355068207f, - -0.451171487569809f, - 0.715163230895996f, -0.451336652040482f, 0.714816987514496f, - -0.451501548290253f, - 0.714470624923706f, -0.451666176319122f, 0.714124143123627f, - -0.451830536127090f, - 0.713777542114258f, -0.451994657516479f, 0.713430821895599f, - -0.452158480882645f, - 0.713083922863007f, -0.452322036027908f, 0.712736964225769f, - -0.452485352754593f, - 0.712389826774597f, -0.452648371458054f, 0.712042629718781f, - -0.452811151742935f, - 0.711695253849030f, -0.452973634004593f, 0.711347758769989f, - -0.453135877847672f, - 0.711000144481659f, -0.453297853469849f, 0.710652410984039f, - -0.453459560871124f, - 0.710304558277130f, -0.453621000051498f, 0.709956526756287f, - -0.453782171010971f, - 0.709608435630798f, -0.453943043947220f, 0.709260225296021f, - -0.454103678464890f, - 0.708911836147308f, -0.454264044761658f, 0.708563387393951f, - -0.454424172639847f, - 0.708214759826660f, -0.454584002494812f, 0.707866072654724f, - -0.454743564128876f, - 0.707517206668854f, -0.454902857542038f, 0.707168221473694f, - -0.455061882734299f, - 0.706819176673889f, -0.455220639705658f, 0.706469953060150f, - -0.455379128456116f, - 0.706120610237122f, -0.455537378787994f, 0.705771148204803f, - -0.455695331096649f, - 0.705421566963196f, -0.455853015184402f, 0.705071866512299f, - -0.456010431051254f, - 0.704722046852112f, -0.456167578697205f, 0.704372167587280f, - -0.456324487924576f, - 0.704022109508514f, -0.456481099128723f, 0.703671932220459f, - -0.456637442111969f, - 0.703321635723114f, -0.456793516874313f, 0.702971220016479f, - -0.456949323415756f, - 0.702620685100555f, -0.457104891538620f, 0.702270030975342f, - -0.457260161638260f, - 0.701919257640839f, -0.457415163516998f, 0.701568365097046f, - -0.457569897174835f, - 0.701217353343964f, -0.457724362611771f, 0.700866222381592f, - -0.457878559827805f, - 0.700514972209930f, -0.458032488822937f, 0.700163602828979f, - -0.458186149597168f, - 0.699812114238739f, -0.458339542150497f, 0.699460506439209f, - -0.458492636680603f, - 0.699108779430389f, -0.458645492792130f, 0.698756933212280f, - -0.458798080682755f, - 0.698404967784882f, -0.458950400352478f, 0.698052942752838f, - -0.459102421998978f, - 0.697700738906860f, -0.459254205226898f, 0.697348415851593f, - -0.459405690431595f, - 0.696996033191681f, -0.459556937217712f, 0.696643471717834f, - -0.459707885980606f, - 0.696290850639343f, -0.459858566522598f, 0.695938050746918f, - -0.460008978843689f, - 0.695585191249847f, -0.460159152746201f, 0.695232212543488f, - -0.460309028625488f, - 0.694879114627838f, -0.460458606481552f, 0.694525837898254f, - -0.460607945919037f, - 0.694172501564026f, -0.460757017135620f, 0.693819046020508f, - -0.460905820131302f, - 0.693465530872345f, -0.461054325103760f, 0.693111836910248f, - -0.461202591657639f, - 0.692758023738861f, -0.461350560188293f, 0.692404091358185f, - -0.461498260498047f, - 0.692050099372864f, -0.461645722389221f, 0.691695988178253f, - -0.461792886257172f, - 0.691341698169708f, -0.461939752101898f, 0.690987348556519f, - -0.462086379528046f, - 0.690632879734039f, -0.462232738733292f, 0.690278291702271f, - -0.462378799915314f, - 0.689923584461212f, -0.462524622678757f, 0.689568817615509f, - -0.462670147418976f, - 0.689213871955872f, -0.462815403938293f, 0.688858866691589f, - -0.462960392236710f, - 0.688503682613373f, -0.463105112314224f, 0.688148438930511f, - -0.463249564170837f, - 0.687793076038361f, -0.463393747806549f, 0.687437593936920f, - -0.463537633419037f, - 0.687082052230835f, -0.463681250810623f, 0.686726331710815f, - -0.463824629783630f, - 0.686370551586151f, -0.463967710733414f, 0.686014592647552f, - -0.464110493659973f, - 0.685658574104309f, -0.464253038167953f, 0.685302436351776f, - -0.464395314455032f, - 0.684946238994598f, -0.464537292718887f, 0.684589862823486f, - -0.464679002761841f, - 0.684233427047729f, -0.464820444583893f, 0.683876872062683f, - -0.464961618185043f, - 0.683520197868347f, -0.465102523565292f, 0.683163404464722f, - -0.465243130922318f, - 0.682806491851807f, -0.465383470058441f, 0.682449519634247f, - -0.465523540973663f, - 0.682092368602753f, -0.465663343667984f, 0.681735157966614f, - -0.465802878141403f, - 0.681377887725830f, -0.465942144393921f, 0.681020438671112f, - -0.466081112623215f, - 0.680662930011749f, -0.466219812631607f, 0.680305242538452f, - -0.466358244419098f, - 0.679947495460510f, -0.466496407985687f, 0.679589688777924f, - -0.466634273529053f, - 0.679231703281403f, -0.466771900653839f, 0.678873658180237f, - -0.466909229755402f, - 0.678515493869781f, -0.467046260833740f, 0.678157210350037f, - -0.467183053493500f, - 0.677798807621002f, -0.467319577932358f, 0.677440345287323f, - -0.467455804347992f, - 0.677081763744354f, -0.467591762542725f, 0.676723062992096f, - -0.467727422714233f, - 0.676364302635193f, -0.467862844467163f, 0.676005363464355f, - -0.467997968196869f, - 0.675646364688873f, -0.468132823705673f, 0.675287246704102f, - -0.468267410993576f, - 0.674928069114685f, -0.468401730060577f, 0.674568772315979f, - -0.468535751104355f, - 0.674209356307983f, -0.468669503927231f, 0.673849821090698f, - -0.468802988529205f, - 0.673490226268768f, -0.468936175107956f, 0.673130512237549f, - -0.469069123268127f, - 0.672770678997040f, -0.469201773405075f, 0.672410726547241f, - -0.469334155321121f, - 0.672050714492798f, -0.469466239213943f, 0.671690583229065f, - -0.469598054885864f, - 0.671330332756042f, -0.469729602336884f, 0.670970022678375f, - -0.469860881567001f, - 0.670609593391418f, -0.469991862773895f, 0.670249044895172f, - -0.470122605562210f, - 0.669888436794281f, -0.470253020524979f, 0.669527709484100f, - -0.470383197069168f, - 0.669166862964630f, -0.470513075590134f, 0.668805956840515f, - -0.470642685890198f, - 0.668444931507111f, -0.470772027969360f, 0.668083786964417f, - -0.470901101827621f, - 0.667722582817078f, -0.471029877662659f, 0.667361259460449f, - -0.471158385276794f, - 0.666999816894531f, -0.471286594867706f, 0.666638314723969f, - -0.471414536237717f, - 0.666276693344116f, -0.471542209386826f, 0.665914952754974f, - -0.471669614315033f, - 0.665553152561188f, -0.471796721220016f, 0.665191233158112f, - -0.471923559904099f, - 0.664829254150391f, -0.472050130367279f, 0.664467096328735f, - -0.472176402807236f, - 0.664104938507080f, -0.472302407026291f, 0.663742601871490f, - -0.472428143024445f, - 0.663380205631256f, -0.472553610801697f, 0.663017749786377f, - -0.472678780555725f, - 0.662655174732208f, -0.472803652286530f, 0.662292480468750f, - -0.472928285598755f, - 0.661929666996002f, -0.473052620887756f, 0.661566793918610f, - -0.473176687955856f, - 0.661203861236572f, -0.473300457000732f, 0.660840749740601f, - -0.473423957824707f, - 0.660477638244629f, -0.473547190427780f, 0.660114347934723f, - -0.473670125007629f, - 0.659750998020172f, -0.473792791366577f, 0.659387588500977f, - -0.473915189504623f, - 0.659024059772491f, -0.474037289619446f, 0.658660411834717f, - -0.474159121513367f, - 0.658296704292297f, -0.474280685186386f, 0.657932877540588f, - -0.474401950836182f, - 0.657568991184235f, -0.474522948265076f, 0.657204985618591f, - -0.474643647670746f, - 0.656840860843658f, -0.474764078855515f, 0.656476676464081f, - -0.474884241819382f, - 0.656112432479858f, -0.475004136562347f, 0.655748009681702f, - -0.475123733282089f, - 0.655383586883545f, -0.475243031978607f, 0.655019044876099f, - -0.475362062454224f, - 0.654654383659363f, -0.475480824708939f, 0.654289662837982f, - -0.475599318742752f, - 0.653924822807312f, -0.475717514753342f, 0.653559923171997f, - -0.475835442543030f, - 0.653194904327393f, -0.475953072309494f, 0.652829825878143f, - -0.476070433855057f, - 0.652464628219604f, -0.476187497377396f, 0.652099311351776f, - -0.476304292678833f, - 0.651733994483948f, -0.476420819759369f, 0.651368498802185f, - -0.476537048816681f, - 0.651003003120422f, -0.476653009653091f, 0.650637328624725f, - -0.476768702268600f, - 0.650271594524384f, -0.476884096860886f, 0.649905800819397f, - -0.476999223232269f, - 0.649539887905121f, -0.477114051580429f, 0.649173915386200f, - -0.477228611707687f, - 0.648807883262634f, -0.477342873811722f, 0.648441672325134f, - -0.477456867694855f, - 0.648075461387634f, -0.477570593357086f, 0.647709131240845f, - -0.477684020996094f, - 0.647342681884766f, -0.477797180414200f, 0.646976172924042f, - -0.477910041809082f, - 0.646609604358673f, -0.478022634983063f, 0.646242916584015f, - -0.478134930133820f, - 0.645876109600067f, -0.478246957063675f, 0.645509302616119f, - -0.478358715772629f, - 0.645142316818237f, -0.478470176458359f, 0.644775331020355f, - -0.478581339120865f, - 0.644408226013184f, -0.478692263364792f, 0.644041001796722f, - -0.478802859783173f, - 0.643673717975616f, -0.478913217782974f, 0.643306374549866f, - -0.479023247957230f, - 0.642938911914825f, -0.479133039712906f, 0.642571389675140f, - -0.479242533445358f, - 0.642203748226166f, -0.479351729154587f, 0.641836047172546f, - -0.479460656642914f, - 0.641468286514282f, -0.479569315910339f, 0.641100406646729f, - -0.479677677154541f, - 0.640732467174530f, -0.479785770177841f, 0.640364408493042f, - -0.479893565177917f, - 0.639996349811554f, -0.480001062154770f, 0.639628112316132f, - -0.480108320713043f, - 0.639259815216064f, -0.480215251445770f, 0.638891458511353f, - -0.480321943759918f, - 0.638523042201996f, -0.480428308248520f, 0.638154506683350f, - -0.480534434318542f, - 0.637785911560059f, -0.480640232563019f, 0.637417197227478f, - -0.480745792388916f, - 0.637048482894897f, -0.480851024389267f, 0.636679589748383f, - -0.480956017971039f, - 0.636310696601868f, -0.481060713529587f, 0.635941684246063f, - -0.481165111064911f, - 0.635572552680969f, -0.481269240379334f, 0.635203421115875f, - -0.481373071670532f, - 0.634834170341492f, -0.481476634740829f, 0.634464859962463f, - -0.481579899787903f, - 0.634095430374146f, -0.481682896614075f, 0.633725941181183f, - -0.481785595417023f, - 0.633356392383575f, -0.481888025999069f, 0.632986724376678f, - -0.481990188360214f, - 0.632616996765137f, -0.482092022895813f, 0.632247209548950f, - -0.482193619012833f, - 0.631877362728119f, -0.482294887304306f, 0.631507396697998f, - -0.482395917177200f, - 0.631137371063232f, -0.482496619224548f, 0.630767226219177f, - -0.482597053050995f, - 0.630397081375122f, -0.482697218656540f, 0.630026817321777f, - -0.482797086238861f, - 0.629656434059143f, -0.482896685600281f, 0.629286050796509f, - -0.482995986938477f, - 0.628915548324585f, -0.483094990253448f, 0.628544986248016f, - -0.483193725347519f, - 0.628174364566803f, -0.483292192220688f, 0.627803623676300f, - -0.483390361070633f, - 0.627432823181152f, -0.483488231897354f, 0.627061963081360f, - -0.483585834503174f, - 0.626691043376923f, -0.483683139085770f, 0.626320004463196f, - -0.483780175447464f, - 0.625948905944824f, -0.483876913785934f, 0.625577747821808f, - -0.483973383903503f, - 0.625206530094147f, -0.484069555997849f, 0.624835193157196f, - -0.484165430068970f, - 0.624463796615601f, -0.484261035919189f, 0.624092340469360f, - -0.484356373548508f, - 0.623720824718475f, -0.484451413154602f, 0.623349189758301f, - -0.484546154737473f, - 0.622977554798126f, -0.484640628099442f, 0.622605800628662f, - -0.484734803438187f, - 0.622233927249908f, -0.484828680753708f, 0.621862053871155f, - -0.484922289848328f, - 0.621490061283112f, -0.485015630722046f, 0.621118068695068f, - -0.485108673572540f, - 0.620745956897736f, -0.485201418399811f, 0.620373785495758f, - -0.485293895006180f, - 0.620001494884491f, -0.485386073589325f, 0.619629204273224f, - -0.485477954149246f, - 0.619256794452667f, -0.485569566488266f, 0.618884325027466f, - -0.485660910606384f, - 0.618511795997620f, -0.485751956701279f, 0.618139207363129f, - -0.485842704772949f, - 0.617766559123993f, -0.485933154821396f, 0.617393791675568f, - -0.486023366451263f, - 0.617020964622498f, -0.486113250255585f, 0.616648077964783f, - -0.486202865839005f, - 0.616275131702423f, -0.486292183399200f, 0.615902125835419f, - -0.486381232738495f, - 0.615529060363770f, -0.486469984054565f, 0.615155875682831f, - -0.486558437347412f, - 0.614782691001892f, -0.486646622419357f, 0.614409387111664f, - -0.486734509468079f, - 0.614036023616791f, -0.486822128295898f, 0.613662600517273f, - -0.486909449100494f, - 0.613289117813110f, -0.486996471881866f, 0.612915575504303f, - -0.487083226442337f, - 0.612541973590851f, -0.487169682979584f, 0.612168252468109f, - -0.487255871295929f, - 0.611794531345367f, -0.487341761589050f, 0.611420691013336f, - -0.487427353858948f, - 0.611046791076660f, -0.487512677907944f, 0.610672831535339f, - -0.487597703933716f, - 0.610298871994019f, -0.487682431936264f, 0.609924793243408f, - -0.487766891717911f, - 0.609550595283508f, -0.487851053476334f, 0.609176397323608f, - -0.487934947013855f, - 0.608802139759064f, -0.488018542528152f, 0.608427822589874f, - -0.488101840019226f, - 0.608053386211395f, -0.488184869289398f, 0.607678949832916f, - -0.488267600536346f, - 0.607304394245148f, -0.488350033760071f, 0.606929838657379f, - -0.488432198762894f, - 0.606555163860321f, -0.488514065742493f, 0.606180429458618f, - -0.488595664501190f, - 0.605805635452271f, -0.488676935434341f, 0.605430841445923f, - -0.488757967948914f, - 0.605055928230286f, -0.488838672637939f, 0.604680955410004f, - -0.488919109106064f, - 0.604305922985077f, -0.488999247550964f, 0.603930830955505f, - -0.489079117774963f, - 0.603555679321289f, -0.489158689975739f, 0.603180468082428f, - -0.489237964153290f, - 0.602805197238922f, -0.489316970109940f, 0.602429866790771f, - -0.489395678043365f, - 0.602054476737976f, -0.489474087953568f, 0.601679027080536f, - -0.489552229642868f, - 0.601303517818451f, -0.489630073308945f, 0.600927948951721f, - -0.489707618951797f, - 0.600552320480347f, -0.489784896373749f, 0.600176632404327f, - -0.489861875772476f, - 0.599800884723663f, -0.489938557147980f, 0.599425077438354f, - -0.490014940500259f, - 0.599049210548401f, -0.490091055631638f, 0.598673284053802f, - -0.490166902542114f, - 0.598297297954559f, -0.490242421627045f, 0.597921252250671f, - -0.490317672491074f, - 0.597545146942139f, -0.490392625331879f, 0.597168982028961f, - -0.490467309951782f, - 0.596792817115784f, -0.490541696548462f, 0.596416532993317f, - -0.490615785121918f, - 0.596040189266205f, -0.490689605474472f, 0.595663845539093f, - -0.490763127803802f, - 0.595287382602692f, -0.490836352109909f, 0.594910860061646f, - -0.490909278392792f, - 0.594534337520599f, -0.490981936454773f, 0.594157755374908f, - -0.491054296493530f, - 0.593781054019928f, -0.491126358509064f, 0.593404352664948f, - -0.491198152303696f, - 0.593027591705322f, -0.491269648075104f, 0.592650771141052f, - -0.491340845823288f, - 0.592273890972137f, -0.491411775350571f, 0.591896951198578f, - -0.491482406854630f, - 0.591519951820374f, -0.491552740335464f, 0.591142892837524f, - -0.491622805595398f, - 0.590765833854675f, -0.491692543029785f, 0.590388655662537f, - -0.491762012243271f, - 0.590011477470398f, -0.491831213235855f, 0.589634180068970f, - -0.491900116205215f, - 0.589256882667542f, -0.491968721151352f, 0.588879525661469f, - -0.492037028074265f, - 0.588502109050751f, -0.492105036973953f, 0.588124632835388f, - -0.492172777652740f, - 0.587747097015381f, -0.492240220308304f, 0.587369561195374f, - -0.492307394742966f, - 0.586991965770721f, -0.492374241352081f, 0.586614251136780f, - -0.492440819740295f, - 0.586236536502838f, -0.492507129907608f, 0.585858762264252f, - -0.492573112249374f, - 0.585480928421021f, -0.492638826370239f, 0.585103094577789f, - -0.492704242467880f, - 0.584725141525269f, -0.492769360542297f, 0.584347188472748f, - -0.492834210395813f, - 0.583969175815582f, -0.492898762226105f, 0.583591103553772f, - -0.492963016033173f, - 0.583212971687317f, -0.493026971817017f, 0.582834780216217f, - -0.493090659379959f, - 0.582456588745117f, -0.493154048919678f, 0.582078278064728f, - -0.493217140436172f, - 0.581699967384338f, -0.493279963731766f, 0.581321597099304f, - -0.493342459201813f, - 0.580943167209625f, -0.493404686450958f, 0.580564737319946f, - -0.493466645479202f, - 0.580186247825623f, -0.493528276681900f, 0.579807698726654f, - -0.493589639663696f, - 0.579429090023041f, -0.493650704622269f, 0.579050421714783f, - -0.493711471557617f, - 0.578671753406525f, -0.493771970272064f, 0.578292965888977f, - -0.493832170963287f, - 0.577914178371429f, -0.493892073631287f, 0.577535390853882f, - -0.493951678276062f, - 0.577156484127045f, -0.494011014699936f, 0.576777577400208f, - -0.494070053100586f, - 0.576398611068726f, -0.494128793478012f, 0.576019585132599f, - -0.494187235832214f, - 0.575640499591827f, -0.494245409965515f, 0.575261414051056f, - -0.494303256273270f, - 0.574882268905640f, -0.494360834360123f, 0.574503064155579f, - -0.494418144226074f, - 0.574123859405518f, -0.494475126266479f, 0.573744535446167f, - -0.494531840085983f, - 0.573365211486816f, -0.494588255882263f, 0.572985887527466f, - -0.494644373655319f, - 0.572606444358826f, -0.494700223207474f, 0.572227001190186f, - -0.494755744934082f, - 0.571847498416901f, -0.494810998439789f, 0.571467995643616f, - -0.494865983724594f, - 0.571088373661041f, -0.494920641183853f, 0.570708811283112f, - -0.494975030422211f, - 0.570329129695892f, -0.495029091835022f, 0.569949388504028f, - -0.495082914829254f, - 0.569569647312164f, -0.495136409997940f, 0.569189906120300f, - -0.495189607143402f, - 0.568810045719147f, -0.495242536067963f, 0.568430185317993f, - -0.495295166969299f, - 0.568050265312195f, -0.495347499847412f, 0.567670345306396f, - -0.495399564504623f, - 0.567290365695953f, -0.495451331138611f, 0.566910326480865f, - -0.495502769947052f, - 0.566530287265778f, -0.495553970336914f, 0.566150128841400f, - -0.495604842901230f, - 0.565770030021667f, -0.495655417442322f, 0.565389811992645f, - -0.495705723762512f, - 0.565009593963623f, -0.495755732059479f, 0.564629375934601f, - -0.495805442333221f, - 0.564249038696289f, -0.495854884386063f, 0.563868701457977f, - -0.495903998613358f, - 0.563488364219666f, -0.495952844619751f, 0.563107967376709f, - -0.496001392602921f, - 0.562727510929108f, -0.496049642562866f, 0.562346994876862f, - -0.496097624301910f, - 0.561966478824615f, -0.496145308017731f, 0.561585903167725f, - -0.496192663908005f, - 0.561205327510834f, -0.496239781379700f, 0.560824692249298f, - -0.496286571025848f, - 0.560444056987762f, -0.496333062648773f, 0.560063362121582f, - -0.496379286050797f, - 0.559682607650757f, -0.496425211429596f, 0.559301853179932f, - -0.496470838785172f, - 0.558921039104462f, -0.496516168117523f, 0.558540165424347f, - -0.496561229228973f, - 0.558159291744232f, -0.496605962514877f, 0.557778418064117f, - -0.496650427579880f, - 0.557397484779358f, -0.496694594621658f, 0.557016491889954f, - -0.496738493442535f, - 0.556635499000549f, -0.496782064437866f, 0.556254446506500f, - -0.496825367212296f, - 0.555873334407806f, -0.496868371963501f, 0.555492222309113f, - -0.496911078691483f, - 0.555111110210419f, -0.496953487396240f, 0.554729938507080f, - -0.496995598077774f, - 0.554348707199097f, -0.497037440538406f, 0.553967475891113f, - -0.497078984975815f, - 0.553586184978485f, -0.497120231389999f, 0.553204894065857f, - -0.497161179780960f, - 0.552823603153229f, -0.497201830148697f, 0.552442193031311f, - -0.497242212295532f, - 0.552060842514038f, -0.497282296419144f, 0.551679372787476f, - -0.497322082519531f, - 0.551297962665558f, -0.497361570596695f, 0.550916433334351f, - -0.497400760650635f, - 0.550534904003143f, -0.497439652681351f, 0.550153374671936f, - -0.497478276491165f, - 0.549771785736084f, -0.497516602277756f, 0.549390196800232f, - -0.497554630041122f, - 0.549008548259735f, -0.497592359781265f, 0.548626899719238f, - -0.497629791498184f, - 0.548245191574097f, -0.497666954994202f, 0.547863483428955f, - -0.497703820466995f, - 0.547481775283813f, -0.497740387916565f, 0.547099947929382f, - -0.497776657342911f, - 0.546718180179596f, -0.497812628746033f, 0.546336352825165f, - -0.497848302125931f, - 0.545954465866089f, -0.497883707284927f, 0.545572578907013f, - -0.497918814420700f, - 0.545190691947937f, -0.497953623533249f, 0.544808745384216f, - -0.497988134622574f, - 0.544426798820496f, -0.498022347688675f, 0.544044792652130f, - -0.498056292533875f, - 0.543662786483765f, -0.498089909553528f, 0.543280720710754f, - -0.498123258352280f, - 0.542898654937744f, -0.498156309127808f, 0.542516589164734f, - -0.498189061880112f, - 0.542134463787079f, -0.498221516609192f, 0.541752278804779f, - -0.498253703117371f, - 0.541370153427124f, -0.498285561800003f, 0.540987968444824f, - -0.498317152261734f, - 0.540605723857880f, -0.498348444700241f, 0.540223479270935f, - -0.498379439115524f, - 0.539841234683990f, -0.498410135507584f, 0.539458930492401f, - -0.498440563678741f, - 0.539076626300812f, -0.498470664024353f, 0.538694262504578f, - -0.498500496149063f, - 0.538311958312988f, -0.498530030250549f, 0.537929534912109f, - -0.498559266328812f, - 0.537547171115875f, -0.498588204383850f, 0.537164747714996f, - -0.498616874217987f, - 0.536782264709473f, -0.498645216226578f, 0.536399841308594f, - -0.498673290014267f, - 0.536017298698425f, -0.498701065778732f, 0.535634815692902f, - -0.498728543519974f, - 0.535252273082733f, -0.498755723237991f, 0.534869730472565f, - -0.498782604932785f, - 0.534487187862396f, -0.498809218406677f, 0.534104585647583f, - -0.498835533857346f, - 0.533721983432770f, -0.498861521482468f, 0.533339321613312f, - -0.498887240886688f, - 0.532956659793854f, -0.498912662267685f, 0.532573997974396f, - -0.498937815427780f, - 0.532191336154938f, -0.498962640762329f, 0.531808614730835f, - -0.498987197875977f, - 0.531425893306732f, -0.499011427164078f, 0.531043112277985f, - -0.499035388231277f, - 0.530660390853882f, -0.499059051275253f, 0.530277609825134f, - -0.499082416296005f, - 0.529894769191742f, -0.499105513095856f, 0.529511988162994f, - -0.499128282070160f, - 0.529129147529602f, -0.499150782823563f, 0.528746306896210f, - -0.499172955751419f, - 0.528363406658173f, -0.499194860458374f, 0.527980506420136f, - -0.499216467142105f, - 0.527597606182098f, -0.499237775802612f, 0.527214705944061f, - -0.499258816242218f, - 0.526831746101379f, -0.499279528856277f, 0.526448845863342f, - -0.499299973249435f, - 0.526065826416016f, -0.499320119619370f, 0.525682866573334f, - -0.499339967966080f, - 0.525299847126007f, -0.499359518289566f, 0.524916887283325f, - -0.499378770589828f, - 0.524533808231354f, -0.499397724866867f, 0.524150788784027f, - -0.499416410923004f, - 0.523767769336700f, -0.499434769153595f, 0.523384690284729f, - -0.499452859163284f, - 0.523001611232758f, -0.499470651149750f, 0.522618472576141f, - -0.499488145112991f, - 0.522235393524170f, -0.499505341053009f, 0.521852254867554f, - -0.499522238969803f, - 0.521469116210938f, -0.499538868665695f, 0.521085977554321f, - -0.499555170536041f, - 0.520702838897705f, -0.499571204185486f, 0.520319640636444f, - -0.499586939811707f, - 0.519936442375183f, -0.499602377414703f, 0.519553244113922f, - -0.499617516994476f, - 0.519170045852661f, -0.499632388353348f, 0.518786847591400f, - -0.499646931886673f, - 0.518403589725494f, -0.499661177396774f, 0.518020391464233f, - -0.499675154685974f, - 0.517637133598328f, -0.499688833951950f, 0.517253875732422f, - -0.499702215194702f, - 0.516870558261871f, -0.499715298414230f, 0.516487300395966f, - -0.499728083610535f, - 0.516103982925415f, -0.499740600585938f, 0.515720725059509f, - -0.499752789735794f, - 0.515337407588959f, -0.499764710664749f, 0.514954090118408f, - -0.499776333570480f, - 0.514570772647858f, -0.499787658452988f, 0.514187395572662f, - -0.499798685312271f, - 0.513804078102112f, -0.499809414148331f, 0.513420701026917f, - -0.499819844961166f, - 0.513037383556366f, -0.499830007553101f, 0.512654006481171f, - -0.499839842319489f, - 0.512270629405975f, -0.499849408864975f, 0.511887252330780f, - -0.499858677387238f, - 0.511503815650940f, -0.499867647886276f, 0.511120438575745f, - -0.499876320362091f, - 0.510737061500549f, -0.499884694814682f, 0.510353624820709f, - -0.499892801046371f, - 0.509970188140869f, -0.499900579452515f, 0.509586811065674f, - -0.499908089637756f, - 0.509203374385834f, -0.499915301799774f, 0.508819937705994f, - -0.499922215938568f, - 0.508436501026154f, -0.499928832054138f, 0.508053064346313f, - -0.499935150146484f, - 0.507669627666473f, -0.499941170215607f, 0.507286131381989f, - -0.499946922063828f, - 0.506902694702148f, -0.499952346086502f, 0.506519258022308f, - -0.499957501888275f, - 0.506135761737823f, -0.499962359666824f, 0.505752325057983f, - -0.499966919422150f, - 0.505368828773499f, -0.499971181154251f, 0.504985332489014f, - -0.499975144863129f, - 0.504601895809174f, -0.499978810548782f, 0.504218399524689f, - -0.499982208013535f, - 0.503834903240204f, -0.499985307455063f, 0.503451406955719f, - -0.499988079071045f, - 0.503067970275879f, -0.499990582466125f, 0.502684473991394f, - -0.499992787837982f, - 0.502300977706909f, -0.499994695186615f, 0.501917481422424f, - -0.499996334314346f, - 0.501533985137939f, -0.499997645616531f, 0.501150488853455f, - -0.499998688697815f, - 0.500766992568970f, -0.499999403953552f, 0.500383496284485f, - -0.499999850988388f, -}; - - - -/** -* @brief Initialization function for the floating-point RFFT/RIFFT. -* @deprecated Do not use this function. It has been superceded by \ref arm_rfft_fast_init_f32 and will be removed -* in the future. -* @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. -* @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. -* @param[in] fftLenReal length of the FFT. -* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. -* -* \par Description: -* \par -* The parameter fftLenReal Specifies length of RFFT/RIFFT Process. Supported FFT Lengths are 128, 512, 2048. -* \par -* The parameter ifftFlagR controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* This function also initializes Twiddle factor table. -*/ - -arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag) -{ - - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialize the Real FFT length */ - S->fftLenReal = (uint16_t) fftLenReal; - - /* Initialize the Complex FFT length */ - S->fftLenBy2 = (uint16_t) fftLenReal / 2u; - - /* Initialize the Twiddle coefficientA pointer */ - S->pTwiddleAReal = (float32_t *) realCoefA; - - /* Initialize the Twiddle coefficientB pointer */ - S->pTwiddleBReal = (float32_t *) realCoefB; - - /* Initialize the Flag for selection of RFFT or RIFFT */ - S->ifftFlagR = (uint8_t) ifftFlagR; - - /* Initialize the Flag for calculation Bit reversal or not */ - S->bitReverseFlagR = (uint8_t) bitReverseFlag; - - /* Initializations of structure parameters depending on the FFT length */ - switch (S->fftLenReal) - { - /* Init table modifier value */ - case 8192u: - S->twidCoefRModifier = 1u; - break; - case 2048u: - S->twidCoefRModifier = 4u; - break; - case 512u: - S->twidCoefRModifier = 16u; - break; - case 128u: - S->twidCoefRModifier = 64u; - break; - default: - /* Reporting argument error if rfftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - /* Init Complex FFT Instance */ - S->pCfft = S_CFFT; - - if(S->ifftFlagR) - { - /* Initializes the CIFFT Module for fftLenreal/2 length */ - arm_cfft_radix4_init_f32(S->pCfft, S->fftLenBy2, 1u, 0u); - } - else - { - /* Initializes the CFFT Module for fftLenreal/2 length */ - arm_cfft_radix4_init_f32(S->pCfft, S->fftLenBy2, 0u, 0u); - } - - /* return the status of RFFT Init function */ - return (status); - -} - - /** - * @} end of RealFFT group - */ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c deleted file mode 100644 index 69334c9..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c +++ /dev/null @@ -1,2235 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_init_q15.c -* -* Description: RFFT & RIFFT Q15 initialisation function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - - -#include "arm_math.h" -#include "arm_common_tables.h" -#include "arm_const_structs.h" - -/** -* @ingroup groupTransforms -*/ - -/** -* @addtogroup RealFFT -* @{ -*/ - - - -/** -* \par -* Generation fixed-point realCoefAQ15 array in Q15 format: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-*  {    
-*    pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-*  } 
-* \par -* Convert to fixed point Q15 format -* round(pATable[i] * pow(2, 15)) -*/ -static const q15_t ALIGN4 realCoefAQ15[8192] = { - 0x4000, 0xc000, 0x3ff3, 0xc000, 0x3fe7, 0xc000, 0x3fda, 0xc000, - 0x3fce, 0xc000, 0x3fc1, 0xc000, 0x3fb5, 0xc000, 0x3fa8, 0xc000, - 0x3f9b, 0xc000, 0x3f8f, 0xc000, 0x3f82, 0xc000, 0x3f76, 0xc001, - 0x3f69, 0xc001, 0x3f5d, 0xc001, 0x3f50, 0xc001, 0x3f44, 0xc001, - 0x3f37, 0xc001, 0x3f2a, 0xc001, 0x3f1e, 0xc002, 0x3f11, 0xc002, - 0x3f05, 0xc002, 0x3ef8, 0xc002, 0x3eec, 0xc002, 0x3edf, 0xc003, - 0x3ed2, 0xc003, 0x3ec6, 0xc003, 0x3eb9, 0xc003, 0x3ead, 0xc004, - 0x3ea0, 0xc004, 0x3e94, 0xc004, 0x3e87, 0xc004, 0x3e7a, 0xc005, - 0x3e6e, 0xc005, 0x3e61, 0xc005, 0x3e55, 0xc006, 0x3e48, 0xc006, - 0x3e3c, 0xc006, 0x3e2f, 0xc007, 0x3e23, 0xc007, 0x3e16, 0xc007, - 0x3e09, 0xc008, 0x3dfd, 0xc008, 0x3df0, 0xc009, 0x3de4, 0xc009, - 0x3dd7, 0xc009, 0x3dcb, 0xc00a, 0x3dbe, 0xc00a, 0x3db2, 0xc00b, - 0x3da5, 0xc00b, 0x3d98, 0xc00c, 0x3d8c, 0xc00c, 0x3d7f, 0xc00d, - 0x3d73, 0xc00d, 0x3d66, 0xc00e, 0x3d5a, 0xc00e, 0x3d4d, 0xc00f, - 0x3d40, 0xc00f, 0x3d34, 0xc010, 0x3d27, 0xc010, 0x3d1b, 0xc011, - 0x3d0e, 0xc011, 0x3d02, 0xc012, 0x3cf5, 0xc013, 0x3ce9, 0xc013, - 0x3cdc, 0xc014, 0x3cd0, 0xc014, 0x3cc3, 0xc015, 0x3cb6, 0xc016, - 0x3caa, 0xc016, 0x3c9d, 0xc017, 0x3c91, 0xc018, 0x3c84, 0xc018, - 0x3c78, 0xc019, 0x3c6b, 0xc01a, 0x3c5f, 0xc01a, 0x3c52, 0xc01b, - 0x3c45, 0xc01c, 0x3c39, 0xc01d, 0x3c2c, 0xc01d, 0x3c20, 0xc01e, - 0x3c13, 0xc01f, 0x3c07, 0xc020, 0x3bfa, 0xc020, 0x3bee, 0xc021, - 0x3be1, 0xc022, 0x3bd5, 0xc023, 0x3bc8, 0xc024, 0x3bbc, 0xc024, - 0x3baf, 0xc025, 0x3ba2, 0xc026, 0x3b96, 0xc027, 0x3b89, 0xc028, - 0x3b7d, 0xc029, 0x3b70, 0xc02a, 0x3b64, 0xc02b, 0x3b57, 0xc02b, - 0x3b4b, 0xc02c, 0x3b3e, 0xc02d, 0x3b32, 0xc02e, 0x3b25, 0xc02f, - 0x3b19, 0xc030, 0x3b0c, 0xc031, 0x3b00, 0xc032, 0x3af3, 0xc033, - 0x3ae6, 0xc034, 0x3ada, 0xc035, 0x3acd, 0xc036, 0x3ac1, 0xc037, - 0x3ab4, 0xc038, 0x3aa8, 0xc039, 0x3a9b, 0xc03a, 0x3a8f, 0xc03b, - 0x3a82, 0xc03c, 0x3a76, 0xc03d, 0x3a69, 0xc03f, 0x3a5d, 0xc040, - 0x3a50, 0xc041, 0x3a44, 0xc042, 0x3a37, 0xc043, 0x3a2b, 0xc044, - 0x3a1e, 0xc045, 0x3a12, 0xc047, 0x3a05, 0xc048, 0x39f9, 0xc049, - 0x39ec, 0xc04a, 0x39e0, 0xc04b, 0x39d3, 0xc04c, 0x39c7, 0xc04e, - 0x39ba, 0xc04f, 0x39ae, 0xc050, 0x39a1, 0xc051, 0x3995, 0xc053, - 0x3988, 0xc054, 0x397c, 0xc055, 0x396f, 0xc056, 0x3963, 0xc058, - 0x3956, 0xc059, 0x394a, 0xc05a, 0x393d, 0xc05c, 0x3931, 0xc05d, - 0x3924, 0xc05e, 0x3918, 0xc060, 0x390b, 0xc061, 0x38ff, 0xc062, - 0x38f2, 0xc064, 0x38e6, 0xc065, 0x38d9, 0xc067, 0x38cd, 0xc068, - 0x38c0, 0xc069, 0x38b4, 0xc06b, 0x38a7, 0xc06c, 0x389b, 0xc06e, - 0x388e, 0xc06f, 0x3882, 0xc071, 0x3875, 0xc072, 0x3869, 0xc074, - 0x385c, 0xc075, 0x3850, 0xc077, 0x3843, 0xc078, 0x3837, 0xc07a, - 0x382a, 0xc07b, 0x381e, 0xc07d, 0x3811, 0xc07e, 0x3805, 0xc080, - 0x37f9, 0xc081, 0x37ec, 0xc083, 0x37e0, 0xc085, 0x37d3, 0xc086, - 0x37c7, 0xc088, 0x37ba, 0xc089, 0x37ae, 0xc08b, 0x37a1, 0xc08d, - 0x3795, 0xc08e, 0x3788, 0xc090, 0x377c, 0xc092, 0x376f, 0xc093, - 0x3763, 0xc095, 0x3757, 0xc097, 0x374a, 0xc098, 0x373e, 0xc09a, - 0x3731, 0xc09c, 0x3725, 0xc09e, 0x3718, 0xc09f, 0x370c, 0xc0a1, - 0x36ff, 0xc0a3, 0x36f3, 0xc0a5, 0x36e7, 0xc0a6, 0x36da, 0xc0a8, - 0x36ce, 0xc0aa, 0x36c1, 0xc0ac, 0x36b5, 0xc0ae, 0x36a8, 0xc0af, - 0x369c, 0xc0b1, 0x3690, 0xc0b3, 0x3683, 0xc0b5, 0x3677, 0xc0b7, - 0x366a, 0xc0b9, 0x365e, 0xc0bb, 0x3651, 0xc0bd, 0x3645, 0xc0be, - 0x3639, 0xc0c0, 0x362c, 0xc0c2, 0x3620, 0xc0c4, 0x3613, 0xc0c6, - 0x3607, 0xc0c8, 0x35fa, 0xc0ca, 0x35ee, 0xc0cc, 0x35e2, 0xc0ce, - 0x35d5, 0xc0d0, 0x35c9, 0xc0d2, 0x35bc, 0xc0d4, 0x35b0, 0xc0d6, - 0x35a4, 0xc0d8, 0x3597, 0xc0da, 0x358b, 0xc0dc, 0x357e, 0xc0de, - 0x3572, 0xc0e0, 0x3566, 0xc0e2, 0x3559, 0xc0e4, 0x354d, 0xc0e7, - 0x3540, 0xc0e9, 0x3534, 0xc0eb, 0x3528, 0xc0ed, 0x351b, 0xc0ef, - 0x350f, 0xc0f1, 0x3503, 0xc0f3, 0x34f6, 0xc0f6, 0x34ea, 0xc0f8, - 0x34dd, 0xc0fa, 0x34d1, 0xc0fc, 0x34c5, 0xc0fe, 0x34b8, 0xc100, - 0x34ac, 0xc103, 0x34a0, 0xc105, 0x3493, 0xc107, 0x3487, 0xc109, - 0x347b, 0xc10c, 0x346e, 0xc10e, 0x3462, 0xc110, 0x3455, 0xc113, - 0x3449, 0xc115, 0x343d, 0xc117, 0x3430, 0xc119, 0x3424, 0xc11c, - 0x3418, 0xc11e, 0x340b, 0xc120, 0x33ff, 0xc123, 0x33f3, 0xc125, - 0x33e6, 0xc128, 0x33da, 0xc12a, 0x33ce, 0xc12c, 0x33c1, 0xc12f, - 0x33b5, 0xc131, 0x33a9, 0xc134, 0x339c, 0xc136, 0x3390, 0xc138, - 0x3384, 0xc13b, 0x3377, 0xc13d, 0x336b, 0xc140, 0x335f, 0xc142, - 0x3352, 0xc145, 0x3346, 0xc147, 0x333a, 0xc14a, 0x332d, 0xc14c, - 0x3321, 0xc14f, 0x3315, 0xc151, 0x3308, 0xc154, 0x32fc, 0xc156, - 0x32f0, 0xc159, 0x32e4, 0xc15b, 0x32d7, 0xc15e, 0x32cb, 0xc161, - 0x32bf, 0xc163, 0x32b2, 0xc166, 0x32a6, 0xc168, 0x329a, 0xc16b, - 0x328e, 0xc16e, 0x3281, 0xc170, 0x3275, 0xc173, 0x3269, 0xc176, - 0x325c, 0xc178, 0x3250, 0xc17b, 0x3244, 0xc17e, 0x3238, 0xc180, - 0x322b, 0xc183, 0x321f, 0xc186, 0x3213, 0xc189, 0x3207, 0xc18b, - 0x31fa, 0xc18e, 0x31ee, 0xc191, 0x31e2, 0xc194, 0x31d5, 0xc196, - 0x31c9, 0xc199, 0x31bd, 0xc19c, 0x31b1, 0xc19f, 0x31a4, 0xc1a2, - 0x3198, 0xc1a4, 0x318c, 0xc1a7, 0x3180, 0xc1aa, 0x3174, 0xc1ad, - 0x3167, 0xc1b0, 0x315b, 0xc1b3, 0x314f, 0xc1b6, 0x3143, 0xc1b8, - 0x3136, 0xc1bb, 0x312a, 0xc1be, 0x311e, 0xc1c1, 0x3112, 0xc1c4, - 0x3105, 0xc1c7, 0x30f9, 0xc1ca, 0x30ed, 0xc1cd, 0x30e1, 0xc1d0, - 0x30d5, 0xc1d3, 0x30c8, 0xc1d6, 0x30bc, 0xc1d9, 0x30b0, 0xc1dc, - 0x30a4, 0xc1df, 0x3098, 0xc1e2, 0x308b, 0xc1e5, 0x307f, 0xc1e8, - 0x3073, 0xc1eb, 0x3067, 0xc1ee, 0x305b, 0xc1f1, 0x304e, 0xc1f4, - 0x3042, 0xc1f7, 0x3036, 0xc1fa, 0x302a, 0xc1fd, 0x301e, 0xc201, - 0x3012, 0xc204, 0x3005, 0xc207, 0x2ff9, 0xc20a, 0x2fed, 0xc20d, - 0x2fe1, 0xc210, 0x2fd5, 0xc213, 0x2fc9, 0xc217, 0x2fbc, 0xc21a, - 0x2fb0, 0xc21d, 0x2fa4, 0xc220, 0x2f98, 0xc223, 0x2f8c, 0xc227, - 0x2f80, 0xc22a, 0x2f74, 0xc22d, 0x2f67, 0xc230, 0x2f5b, 0xc234, - 0x2f4f, 0xc237, 0x2f43, 0xc23a, 0x2f37, 0xc23e, 0x2f2b, 0xc241, - 0x2f1f, 0xc244, 0x2f13, 0xc247, 0x2f06, 0xc24b, 0x2efa, 0xc24e, - 0x2eee, 0xc251, 0x2ee2, 0xc255, 0x2ed6, 0xc258, 0x2eca, 0xc25c, - 0x2ebe, 0xc25f, 0x2eb2, 0xc262, 0x2ea6, 0xc266, 0x2e99, 0xc269, - 0x2e8d, 0xc26d, 0x2e81, 0xc270, 0x2e75, 0xc273, 0x2e69, 0xc277, - 0x2e5d, 0xc27a, 0x2e51, 0xc27e, 0x2e45, 0xc281, 0x2e39, 0xc285, - 0x2e2d, 0xc288, 0x2e21, 0xc28c, 0x2e15, 0xc28f, 0x2e09, 0xc293, - 0x2dfc, 0xc296, 0x2df0, 0xc29a, 0x2de4, 0xc29d, 0x2dd8, 0xc2a1, - 0x2dcc, 0xc2a5, 0x2dc0, 0xc2a8, 0x2db4, 0xc2ac, 0x2da8, 0xc2af, - 0x2d9c, 0xc2b3, 0x2d90, 0xc2b7, 0x2d84, 0xc2ba, 0x2d78, 0xc2be, - 0x2d6c, 0xc2c1, 0x2d60, 0xc2c5, 0x2d54, 0xc2c9, 0x2d48, 0xc2cc, - 0x2d3c, 0xc2d0, 0x2d30, 0xc2d4, 0x2d24, 0xc2d8, 0x2d18, 0xc2db, - 0x2d0c, 0xc2df, 0x2d00, 0xc2e3, 0x2cf4, 0xc2e6, 0x2ce8, 0xc2ea, - 0x2cdc, 0xc2ee, 0x2cd0, 0xc2f2, 0x2cc4, 0xc2f5, 0x2cb8, 0xc2f9, - 0x2cac, 0xc2fd, 0x2ca0, 0xc301, 0x2c94, 0xc305, 0x2c88, 0xc308, - 0x2c7c, 0xc30c, 0x2c70, 0xc310, 0x2c64, 0xc314, 0x2c58, 0xc318, - 0x2c4c, 0xc31c, 0x2c40, 0xc320, 0x2c34, 0xc323, 0x2c28, 0xc327, - 0x2c1c, 0xc32b, 0x2c10, 0xc32f, 0x2c05, 0xc333, 0x2bf9, 0xc337, - 0x2bed, 0xc33b, 0x2be1, 0xc33f, 0x2bd5, 0xc343, 0x2bc9, 0xc347, - 0x2bbd, 0xc34b, 0x2bb1, 0xc34f, 0x2ba5, 0xc353, 0x2b99, 0xc357, - 0x2b8d, 0xc35b, 0x2b81, 0xc35f, 0x2b75, 0xc363, 0x2b6a, 0xc367, - 0x2b5e, 0xc36b, 0x2b52, 0xc36f, 0x2b46, 0xc373, 0x2b3a, 0xc377, - 0x2b2e, 0xc37b, 0x2b22, 0xc37f, 0x2b16, 0xc383, 0x2b0a, 0xc387, - 0x2aff, 0xc38c, 0x2af3, 0xc390, 0x2ae7, 0xc394, 0x2adb, 0xc398, - 0x2acf, 0xc39c, 0x2ac3, 0xc3a0, 0x2ab7, 0xc3a5, 0x2aac, 0xc3a9, - 0x2aa0, 0xc3ad, 0x2a94, 0xc3b1, 0x2a88, 0xc3b5, 0x2a7c, 0xc3ba, - 0x2a70, 0xc3be, 0x2a65, 0xc3c2, 0x2a59, 0xc3c6, 0x2a4d, 0xc3ca, - 0x2a41, 0xc3cf, 0x2a35, 0xc3d3, 0x2a29, 0xc3d7, 0x2a1e, 0xc3dc, - 0x2a12, 0xc3e0, 0x2a06, 0xc3e4, 0x29fa, 0xc3e9, 0x29ee, 0xc3ed, - 0x29e3, 0xc3f1, 0x29d7, 0xc3f6, 0x29cb, 0xc3fa, 0x29bf, 0xc3fe, - 0x29b4, 0xc403, 0x29a8, 0xc407, 0x299c, 0xc40b, 0x2990, 0xc410, - 0x2984, 0xc414, 0x2979, 0xc419, 0x296d, 0xc41d, 0x2961, 0xc422, - 0x2955, 0xc426, 0x294a, 0xc42a, 0x293e, 0xc42f, 0x2932, 0xc433, - 0x2926, 0xc438, 0x291b, 0xc43c, 0x290f, 0xc441, 0x2903, 0xc445, - 0x28f7, 0xc44a, 0x28ec, 0xc44e, 0x28e0, 0xc453, 0x28d4, 0xc457, - 0x28c9, 0xc45c, 0x28bd, 0xc461, 0x28b1, 0xc465, 0x28a5, 0xc46a, - 0x289a, 0xc46e, 0x288e, 0xc473, 0x2882, 0xc478, 0x2877, 0xc47c, - 0x286b, 0xc481, 0x285f, 0xc485, 0x2854, 0xc48a, 0x2848, 0xc48f, - 0x283c, 0xc493, 0x2831, 0xc498, 0x2825, 0xc49d, 0x2819, 0xc4a1, - 0x280e, 0xc4a6, 0x2802, 0xc4ab, 0x27f6, 0xc4b0, 0x27eb, 0xc4b4, - 0x27df, 0xc4b9, 0x27d3, 0xc4be, 0x27c8, 0xc4c2, 0x27bc, 0xc4c7, - 0x27b1, 0xc4cc, 0x27a5, 0xc4d1, 0x2799, 0xc4d6, 0x278e, 0xc4da, - 0x2782, 0xc4df, 0x2777, 0xc4e4, 0x276b, 0xc4e9, 0x275f, 0xc4ee, - 0x2754, 0xc4f2, 0x2748, 0xc4f7, 0x273d, 0xc4fc, 0x2731, 0xc501, - 0x2725, 0xc506, 0x271a, 0xc50b, 0x270e, 0xc510, 0x2703, 0xc515, - 0x26f7, 0xc51a, 0x26ec, 0xc51e, 0x26e0, 0xc523, 0x26d4, 0xc528, - 0x26c9, 0xc52d, 0x26bd, 0xc532, 0x26b2, 0xc537, 0x26a6, 0xc53c, - 0x269b, 0xc541, 0x268f, 0xc546, 0x2684, 0xc54b, 0x2678, 0xc550, - 0x266d, 0xc555, 0x2661, 0xc55a, 0x2656, 0xc55f, 0x264a, 0xc564, - 0x263f, 0xc569, 0x2633, 0xc56e, 0x2628, 0xc573, 0x261c, 0xc578, - 0x2611, 0xc57e, 0x2605, 0xc583, 0x25fa, 0xc588, 0x25ee, 0xc58d, - 0x25e3, 0xc592, 0x25d7, 0xc597, 0x25cc, 0xc59c, 0x25c0, 0xc5a1, - 0x25b5, 0xc5a7, 0x25a9, 0xc5ac, 0x259e, 0xc5b1, 0x2592, 0xc5b6, - 0x2587, 0xc5bb, 0x257c, 0xc5c1, 0x2570, 0xc5c6, 0x2565, 0xc5cb, - 0x2559, 0xc5d0, 0x254e, 0xc5d5, 0x2542, 0xc5db, 0x2537, 0xc5e0, - 0x252c, 0xc5e5, 0x2520, 0xc5ea, 0x2515, 0xc5f0, 0x2509, 0xc5f5, - 0x24fe, 0xc5fa, 0x24f3, 0xc600, 0x24e7, 0xc605, 0x24dc, 0xc60a, - 0x24d0, 0xc610, 0x24c5, 0xc615, 0x24ba, 0xc61a, 0x24ae, 0xc620, - 0x24a3, 0xc625, 0x2498, 0xc62a, 0x248c, 0xc630, 0x2481, 0xc635, - 0x2476, 0xc63b, 0x246a, 0xc640, 0x245f, 0xc645, 0x2454, 0xc64b, - 0x2448, 0xc650, 0x243d, 0xc656, 0x2432, 0xc65b, 0x2426, 0xc661, - 0x241b, 0xc666, 0x2410, 0xc66c, 0x2404, 0xc671, 0x23f9, 0xc677, - 0x23ee, 0xc67c, 0x23e2, 0xc682, 0x23d7, 0xc687, 0x23cc, 0xc68d, - 0x23c1, 0xc692, 0x23b5, 0xc698, 0x23aa, 0xc69d, 0x239f, 0xc6a3, - 0x2394, 0xc6a8, 0x2388, 0xc6ae, 0x237d, 0xc6b4, 0x2372, 0xc6b9, - 0x2367, 0xc6bf, 0x235b, 0xc6c5, 0x2350, 0xc6ca, 0x2345, 0xc6d0, - 0x233a, 0xc6d5, 0x232e, 0xc6db, 0x2323, 0xc6e1, 0x2318, 0xc6e6, - 0x230d, 0xc6ec, 0x2301, 0xc6f2, 0x22f6, 0xc6f7, 0x22eb, 0xc6fd, - 0x22e0, 0xc703, 0x22d5, 0xc709, 0x22ca, 0xc70e, 0x22be, 0xc714, - 0x22b3, 0xc71a, 0x22a8, 0xc720, 0x229d, 0xc725, 0x2292, 0xc72b, - 0x2287, 0xc731, 0x227b, 0xc737, 0x2270, 0xc73d, 0x2265, 0xc742, - 0x225a, 0xc748, 0x224f, 0xc74e, 0x2244, 0xc754, 0x2239, 0xc75a, - 0x222d, 0xc75f, 0x2222, 0xc765, 0x2217, 0xc76b, 0x220c, 0xc771, - 0x2201, 0xc777, 0x21f6, 0xc77d, 0x21eb, 0xc783, 0x21e0, 0xc789, - 0x21d5, 0xc78f, 0x21ca, 0xc795, 0x21be, 0xc79a, 0x21b3, 0xc7a0, - 0x21a8, 0xc7a6, 0x219d, 0xc7ac, 0x2192, 0xc7b2, 0x2187, 0xc7b8, - 0x217c, 0xc7be, 0x2171, 0xc7c4, 0x2166, 0xc7ca, 0x215b, 0xc7d0, - 0x2150, 0xc7d6, 0x2145, 0xc7dc, 0x213a, 0xc7e2, 0x212f, 0xc7e8, - 0x2124, 0xc7ee, 0x2119, 0xc7f5, 0x210e, 0xc7fb, 0x2103, 0xc801, - 0x20f8, 0xc807, 0x20ed, 0xc80d, 0x20e2, 0xc813, 0x20d7, 0xc819, - 0x20cc, 0xc81f, 0x20c1, 0xc825, 0x20b6, 0xc82b, 0x20ab, 0xc832, - 0x20a0, 0xc838, 0x2095, 0xc83e, 0x208a, 0xc844, 0x207f, 0xc84a, - 0x2074, 0xc850, 0x2069, 0xc857, 0x205e, 0xc85d, 0x2054, 0xc863, - 0x2049, 0xc869, 0x203e, 0xc870, 0x2033, 0xc876, 0x2028, 0xc87c, - 0x201d, 0xc882, 0x2012, 0xc889, 0x2007, 0xc88f, 0x1ffc, 0xc895, - 0x1ff1, 0xc89b, 0x1fe7, 0xc8a2, 0x1fdc, 0xc8a8, 0x1fd1, 0xc8ae, - 0x1fc6, 0xc8b5, 0x1fbb, 0xc8bb, 0x1fb0, 0xc8c1, 0x1fa5, 0xc8c8, - 0x1f9b, 0xc8ce, 0x1f90, 0xc8d4, 0x1f85, 0xc8db, 0x1f7a, 0xc8e1, - 0x1f6f, 0xc8e8, 0x1f65, 0xc8ee, 0x1f5a, 0xc8f4, 0x1f4f, 0xc8fb, - 0x1f44, 0xc901, 0x1f39, 0xc908, 0x1f2f, 0xc90e, 0x1f24, 0xc915, - 0x1f19, 0xc91b, 0x1f0e, 0xc921, 0x1f03, 0xc928, 0x1ef9, 0xc92e, - 0x1eee, 0xc935, 0x1ee3, 0xc93b, 0x1ed8, 0xc942, 0x1ece, 0xc948, - 0x1ec3, 0xc94f, 0x1eb8, 0xc955, 0x1ead, 0xc95c, 0x1ea3, 0xc963, - 0x1e98, 0xc969, 0x1e8d, 0xc970, 0x1e83, 0xc976, 0x1e78, 0xc97d, - 0x1e6d, 0xc983, 0x1e62, 0xc98a, 0x1e58, 0xc991, 0x1e4d, 0xc997, - 0x1e42, 0xc99e, 0x1e38, 0xc9a4, 0x1e2d, 0xc9ab, 0x1e22, 0xc9b2, - 0x1e18, 0xc9b8, 0x1e0d, 0xc9bf, 0x1e02, 0xc9c6, 0x1df8, 0xc9cc, - 0x1ded, 0xc9d3, 0x1de2, 0xc9da, 0x1dd8, 0xc9e0, 0x1dcd, 0xc9e7, - 0x1dc3, 0xc9ee, 0x1db8, 0xc9f5, 0x1dad, 0xc9fb, 0x1da3, 0xca02, - 0x1d98, 0xca09, 0x1d8e, 0xca10, 0x1d83, 0xca16, 0x1d78, 0xca1d, - 0x1d6e, 0xca24, 0x1d63, 0xca2b, 0x1d59, 0xca32, 0x1d4e, 0xca38, - 0x1d44, 0xca3f, 0x1d39, 0xca46, 0x1d2e, 0xca4d, 0x1d24, 0xca54, - 0x1d19, 0xca5b, 0x1d0f, 0xca61, 0x1d04, 0xca68, 0x1cfa, 0xca6f, - 0x1cef, 0xca76, 0x1ce5, 0xca7d, 0x1cda, 0xca84, 0x1cd0, 0xca8b, - 0x1cc5, 0xca92, 0x1cbb, 0xca99, 0x1cb0, 0xca9f, 0x1ca6, 0xcaa6, - 0x1c9b, 0xcaad, 0x1c91, 0xcab4, 0x1c86, 0xcabb, 0x1c7c, 0xcac2, - 0x1c72, 0xcac9, 0x1c67, 0xcad0, 0x1c5d, 0xcad7, 0x1c52, 0xcade, - 0x1c48, 0xcae5, 0x1c3d, 0xcaec, 0x1c33, 0xcaf3, 0x1c29, 0xcafa, - 0x1c1e, 0xcb01, 0x1c14, 0xcb08, 0x1c09, 0xcb0f, 0x1bff, 0xcb16, - 0x1bf5, 0xcb1e, 0x1bea, 0xcb25, 0x1be0, 0xcb2c, 0x1bd5, 0xcb33, - 0x1bcb, 0xcb3a, 0x1bc1, 0xcb41, 0x1bb6, 0xcb48, 0x1bac, 0xcb4f, - 0x1ba2, 0xcb56, 0x1b97, 0xcb5e, 0x1b8d, 0xcb65, 0x1b83, 0xcb6c, - 0x1b78, 0xcb73, 0x1b6e, 0xcb7a, 0x1b64, 0xcb81, 0x1b59, 0xcb89, - 0x1b4f, 0xcb90, 0x1b45, 0xcb97, 0x1b3b, 0xcb9e, 0x1b30, 0xcba5, - 0x1b26, 0xcbad, 0x1b1c, 0xcbb4, 0x1b11, 0xcbbb, 0x1b07, 0xcbc2, - 0x1afd, 0xcbca, 0x1af3, 0xcbd1, 0x1ae8, 0xcbd8, 0x1ade, 0xcbe0, - 0x1ad4, 0xcbe7, 0x1aca, 0xcbee, 0x1abf, 0xcbf5, 0x1ab5, 0xcbfd, - 0x1aab, 0xcc04, 0x1aa1, 0xcc0b, 0x1a97, 0xcc13, 0x1a8c, 0xcc1a, - 0x1a82, 0xcc21, 0x1a78, 0xcc29, 0x1a6e, 0xcc30, 0x1a64, 0xcc38, - 0x1a5a, 0xcc3f, 0x1a4f, 0xcc46, 0x1a45, 0xcc4e, 0x1a3b, 0xcc55, - 0x1a31, 0xcc5d, 0x1a27, 0xcc64, 0x1a1d, 0xcc6b, 0x1a13, 0xcc73, - 0x1a08, 0xcc7a, 0x19fe, 0xcc82, 0x19f4, 0xcc89, 0x19ea, 0xcc91, - 0x19e0, 0xcc98, 0x19d6, 0xcca0, 0x19cc, 0xcca7, 0x19c2, 0xccaf, - 0x19b8, 0xccb6, 0x19ae, 0xccbe, 0x19a4, 0xccc5, 0x199a, 0xcccd, - 0x198f, 0xccd4, 0x1985, 0xccdc, 0x197b, 0xcce3, 0x1971, 0xcceb, - 0x1967, 0xccf3, 0x195d, 0xccfa, 0x1953, 0xcd02, 0x1949, 0xcd09, - 0x193f, 0xcd11, 0x1935, 0xcd19, 0x192b, 0xcd20, 0x1921, 0xcd28, - 0x1917, 0xcd30, 0x190d, 0xcd37, 0x1903, 0xcd3f, 0x18f9, 0xcd46, - 0x18ef, 0xcd4e, 0x18e6, 0xcd56, 0x18dc, 0xcd5d, 0x18d2, 0xcd65, - 0x18c8, 0xcd6d, 0x18be, 0xcd75, 0x18b4, 0xcd7c, 0x18aa, 0xcd84, - 0x18a0, 0xcd8c, 0x1896, 0xcd93, 0x188c, 0xcd9b, 0x1882, 0xcda3, - 0x1878, 0xcdab, 0x186f, 0xcdb2, 0x1865, 0xcdba, 0x185b, 0xcdc2, - 0x1851, 0xcdca, 0x1847, 0xcdd2, 0x183d, 0xcdd9, 0x1833, 0xcde1, - 0x182a, 0xcde9, 0x1820, 0xcdf1, 0x1816, 0xcdf9, 0x180c, 0xce01, - 0x1802, 0xce08, 0x17f8, 0xce10, 0x17ef, 0xce18, 0x17e5, 0xce20, - 0x17db, 0xce28, 0x17d1, 0xce30, 0x17c8, 0xce38, 0x17be, 0xce40, - 0x17b4, 0xce47, 0x17aa, 0xce4f, 0x17a0, 0xce57, 0x1797, 0xce5f, - 0x178d, 0xce67, 0x1783, 0xce6f, 0x177a, 0xce77, 0x1770, 0xce7f, - 0x1766, 0xce87, 0x175c, 0xce8f, 0x1753, 0xce97, 0x1749, 0xce9f, - 0x173f, 0xcea7, 0x1736, 0xceaf, 0x172c, 0xceb7, 0x1722, 0xcebf, - 0x1719, 0xcec7, 0x170f, 0xcecf, 0x1705, 0xced7, 0x16fc, 0xcedf, - 0x16f2, 0xcee7, 0x16e8, 0xceef, 0x16df, 0xcef7, 0x16d5, 0xceff, - 0x16cb, 0xcf07, 0x16c2, 0xcf10, 0x16b8, 0xcf18, 0x16af, 0xcf20, - 0x16a5, 0xcf28, 0x169b, 0xcf30, 0x1692, 0xcf38, 0x1688, 0xcf40, - 0x167f, 0xcf48, 0x1675, 0xcf51, 0x166c, 0xcf59, 0x1662, 0xcf61, - 0x1659, 0xcf69, 0x164f, 0xcf71, 0x1645, 0xcf79, 0x163c, 0xcf82, - 0x1632, 0xcf8a, 0x1629, 0xcf92, 0x161f, 0xcf9a, 0x1616, 0xcfa3, - 0x160c, 0xcfab, 0x1603, 0xcfb3, 0x15f9, 0xcfbb, 0x15f0, 0xcfc4, - 0x15e6, 0xcfcc, 0x15dd, 0xcfd4, 0x15d4, 0xcfdc, 0x15ca, 0xcfe5, - 0x15c1, 0xcfed, 0x15b7, 0xcff5, 0x15ae, 0xcffe, 0x15a4, 0xd006, - 0x159b, 0xd00e, 0x1592, 0xd016, 0x1588, 0xd01f, 0x157f, 0xd027, - 0x1575, 0xd030, 0x156c, 0xd038, 0x1563, 0xd040, 0x1559, 0xd049, - 0x1550, 0xd051, 0x1547, 0xd059, 0x153d, 0xd062, 0x1534, 0xd06a, - 0x152a, 0xd073, 0x1521, 0xd07b, 0x1518, 0xd083, 0x150e, 0xd08c, - 0x1505, 0xd094, 0x14fc, 0xd09d, 0x14f3, 0xd0a5, 0x14e9, 0xd0ae, - 0x14e0, 0xd0b6, 0x14d7, 0xd0bf, 0x14cd, 0xd0c7, 0x14c4, 0xd0d0, - 0x14bb, 0xd0d8, 0x14b2, 0xd0e0, 0x14a8, 0xd0e9, 0x149f, 0xd0f2, - 0x1496, 0xd0fa, 0x148d, 0xd103, 0x1483, 0xd10b, 0x147a, 0xd114, - 0x1471, 0xd11c, 0x1468, 0xd125, 0x145f, 0xd12d, 0x1455, 0xd136, - 0x144c, 0xd13e, 0x1443, 0xd147, 0x143a, 0xd150, 0x1431, 0xd158, - 0x1428, 0xd161, 0x141e, 0xd169, 0x1415, 0xd172, 0x140c, 0xd17b, - 0x1403, 0xd183, 0x13fa, 0xd18c, 0x13f1, 0xd195, 0x13e8, 0xd19d, - 0x13df, 0xd1a6, 0x13d5, 0xd1af, 0x13cc, 0xd1b7, 0x13c3, 0xd1c0, - 0x13ba, 0xd1c9, 0x13b1, 0xd1d1, 0x13a8, 0xd1da, 0x139f, 0xd1e3, - 0x1396, 0xd1eb, 0x138d, 0xd1f4, 0x1384, 0xd1fd, 0x137b, 0xd206, - 0x1372, 0xd20e, 0x1369, 0xd217, 0x1360, 0xd220, 0x1357, 0xd229, - 0x134e, 0xd231, 0x1345, 0xd23a, 0x133c, 0xd243, 0x1333, 0xd24c, - 0x132a, 0xd255, 0x1321, 0xd25d, 0x1318, 0xd266, 0x130f, 0xd26f, - 0x1306, 0xd278, 0x12fd, 0xd281, 0x12f4, 0xd28a, 0x12eb, 0xd292, - 0x12e2, 0xd29b, 0x12d9, 0xd2a4, 0x12d1, 0xd2ad, 0x12c8, 0xd2b6, - 0x12bf, 0xd2bf, 0x12b6, 0xd2c8, 0x12ad, 0xd2d1, 0x12a4, 0xd2d9, - 0x129b, 0xd2e2, 0x1292, 0xd2eb, 0x128a, 0xd2f4, 0x1281, 0xd2fd, - 0x1278, 0xd306, 0x126f, 0xd30f, 0x1266, 0xd318, 0x125d, 0xd321, - 0x1255, 0xd32a, 0x124c, 0xd333, 0x1243, 0xd33c, 0x123a, 0xd345, - 0x1231, 0xd34e, 0x1229, 0xd357, 0x1220, 0xd360, 0x1217, 0xd369, - 0x120e, 0xd372, 0x1206, 0xd37b, 0x11fd, 0xd384, 0x11f4, 0xd38d, - 0x11eb, 0xd396, 0x11e3, 0xd39f, 0x11da, 0xd3a8, 0x11d1, 0xd3b1, - 0x11c9, 0xd3ba, 0x11c0, 0xd3c3, 0x11b7, 0xd3cc, 0x11af, 0xd3d5, - 0x11a6, 0xd3df, 0x119d, 0xd3e8, 0x1195, 0xd3f1, 0x118c, 0xd3fa, - 0x1183, 0xd403, 0x117b, 0xd40c, 0x1172, 0xd415, 0x1169, 0xd41e, - 0x1161, 0xd428, 0x1158, 0xd431, 0x1150, 0xd43a, 0x1147, 0xd443, - 0x113e, 0xd44c, 0x1136, 0xd455, 0x112d, 0xd45f, 0x1125, 0xd468, - 0x111c, 0xd471, 0x1114, 0xd47a, 0x110b, 0xd483, 0x1103, 0xd48d, - 0x10fa, 0xd496, 0x10f2, 0xd49f, 0x10e9, 0xd4a8, 0x10e0, 0xd4b2, - 0x10d8, 0xd4bb, 0x10d0, 0xd4c4, 0x10c7, 0xd4cd, 0x10bf, 0xd4d7, - 0x10b6, 0xd4e0, 0x10ae, 0xd4e9, 0x10a5, 0xd4f3, 0x109d, 0xd4fc, - 0x1094, 0xd505, 0x108c, 0xd50e, 0x1083, 0xd518, 0x107b, 0xd521, - 0x1073, 0xd52a, 0x106a, 0xd534, 0x1062, 0xd53d, 0x1059, 0xd547, - 0x1051, 0xd550, 0x1049, 0xd559, 0x1040, 0xd563, 0x1038, 0xd56c, - 0x1030, 0xd575, 0x1027, 0xd57f, 0x101f, 0xd588, 0x1016, 0xd592, - 0x100e, 0xd59b, 0x1006, 0xd5a4, 0xffe, 0xd5ae, 0xff5, 0xd5b7, - 0xfed, 0xd5c1, 0xfe5, 0xd5ca, 0xfdc, 0xd5d4, 0xfd4, 0xd5dd, - 0xfcc, 0xd5e6, 0xfc4, 0xd5f0, 0xfbb, 0xd5f9, 0xfb3, 0xd603, - 0xfab, 0xd60c, 0xfa3, 0xd616, 0xf9a, 0xd61f, 0xf92, 0xd629, - 0xf8a, 0xd632, 0xf82, 0xd63c, 0xf79, 0xd645, 0xf71, 0xd64f, - 0xf69, 0xd659, 0xf61, 0xd662, 0xf59, 0xd66c, 0xf51, 0xd675, - 0xf48, 0xd67f, 0xf40, 0xd688, 0xf38, 0xd692, 0xf30, 0xd69b, - 0xf28, 0xd6a5, 0xf20, 0xd6af, 0xf18, 0xd6b8, 0xf10, 0xd6c2, - 0xf07, 0xd6cb, 0xeff, 0xd6d5, 0xef7, 0xd6df, 0xeef, 0xd6e8, - 0xee7, 0xd6f2, 0xedf, 0xd6fc, 0xed7, 0xd705, 0xecf, 0xd70f, - 0xec7, 0xd719, 0xebf, 0xd722, 0xeb7, 0xd72c, 0xeaf, 0xd736, - 0xea7, 0xd73f, 0xe9f, 0xd749, 0xe97, 0xd753, 0xe8f, 0xd75c, - 0xe87, 0xd766, 0xe7f, 0xd770, 0xe77, 0xd77a, 0xe6f, 0xd783, - 0xe67, 0xd78d, 0xe5f, 0xd797, 0xe57, 0xd7a0, 0xe4f, 0xd7aa, - 0xe47, 0xd7b4, 0xe40, 0xd7be, 0xe38, 0xd7c8, 0xe30, 0xd7d1, - 0xe28, 0xd7db, 0xe20, 0xd7e5, 0xe18, 0xd7ef, 0xe10, 0xd7f8, - 0xe08, 0xd802, 0xe01, 0xd80c, 0xdf9, 0xd816, 0xdf1, 0xd820, - 0xde9, 0xd82a, 0xde1, 0xd833, 0xdd9, 0xd83d, 0xdd2, 0xd847, - 0xdca, 0xd851, 0xdc2, 0xd85b, 0xdba, 0xd865, 0xdb2, 0xd86f, - 0xdab, 0xd878, 0xda3, 0xd882, 0xd9b, 0xd88c, 0xd93, 0xd896, - 0xd8c, 0xd8a0, 0xd84, 0xd8aa, 0xd7c, 0xd8b4, 0xd75, 0xd8be, - 0xd6d, 0xd8c8, 0xd65, 0xd8d2, 0xd5d, 0xd8dc, 0xd56, 0xd8e6, - 0xd4e, 0xd8ef, 0xd46, 0xd8f9, 0xd3f, 0xd903, 0xd37, 0xd90d, - 0xd30, 0xd917, 0xd28, 0xd921, 0xd20, 0xd92b, 0xd19, 0xd935, - 0xd11, 0xd93f, 0xd09, 0xd949, 0xd02, 0xd953, 0xcfa, 0xd95d, - 0xcf3, 0xd967, 0xceb, 0xd971, 0xce3, 0xd97b, 0xcdc, 0xd985, - 0xcd4, 0xd98f, 0xccd, 0xd99a, 0xcc5, 0xd9a4, 0xcbe, 0xd9ae, - 0xcb6, 0xd9b8, 0xcaf, 0xd9c2, 0xca7, 0xd9cc, 0xca0, 0xd9d6, - 0xc98, 0xd9e0, 0xc91, 0xd9ea, 0xc89, 0xd9f4, 0xc82, 0xd9fe, - 0xc7a, 0xda08, 0xc73, 0xda13, 0xc6b, 0xda1d, 0xc64, 0xda27, - 0xc5d, 0xda31, 0xc55, 0xda3b, 0xc4e, 0xda45, 0xc46, 0xda4f, - 0xc3f, 0xda5a, 0xc38, 0xda64, 0xc30, 0xda6e, 0xc29, 0xda78, - 0xc21, 0xda82, 0xc1a, 0xda8c, 0xc13, 0xda97, 0xc0b, 0xdaa1, - 0xc04, 0xdaab, 0xbfd, 0xdab5, 0xbf5, 0xdabf, 0xbee, 0xdaca, - 0xbe7, 0xdad4, 0xbe0, 0xdade, 0xbd8, 0xdae8, 0xbd1, 0xdaf3, - 0xbca, 0xdafd, 0xbc2, 0xdb07, 0xbbb, 0xdb11, 0xbb4, 0xdb1c, - 0xbad, 0xdb26, 0xba5, 0xdb30, 0xb9e, 0xdb3b, 0xb97, 0xdb45, - 0xb90, 0xdb4f, 0xb89, 0xdb59, 0xb81, 0xdb64, 0xb7a, 0xdb6e, - 0xb73, 0xdb78, 0xb6c, 0xdb83, 0xb65, 0xdb8d, 0xb5e, 0xdb97, - 0xb56, 0xdba2, 0xb4f, 0xdbac, 0xb48, 0xdbb6, 0xb41, 0xdbc1, - 0xb3a, 0xdbcb, 0xb33, 0xdbd5, 0xb2c, 0xdbe0, 0xb25, 0xdbea, - 0xb1e, 0xdbf5, 0xb16, 0xdbff, 0xb0f, 0xdc09, 0xb08, 0xdc14, - 0xb01, 0xdc1e, 0xafa, 0xdc29, 0xaf3, 0xdc33, 0xaec, 0xdc3d, - 0xae5, 0xdc48, 0xade, 0xdc52, 0xad7, 0xdc5d, 0xad0, 0xdc67, - 0xac9, 0xdc72, 0xac2, 0xdc7c, 0xabb, 0xdc86, 0xab4, 0xdc91, - 0xaad, 0xdc9b, 0xaa6, 0xdca6, 0xa9f, 0xdcb0, 0xa99, 0xdcbb, - 0xa92, 0xdcc5, 0xa8b, 0xdcd0, 0xa84, 0xdcda, 0xa7d, 0xdce5, - 0xa76, 0xdcef, 0xa6f, 0xdcfa, 0xa68, 0xdd04, 0xa61, 0xdd0f, - 0xa5b, 0xdd19, 0xa54, 0xdd24, 0xa4d, 0xdd2e, 0xa46, 0xdd39, - 0xa3f, 0xdd44, 0xa38, 0xdd4e, 0xa32, 0xdd59, 0xa2b, 0xdd63, - 0xa24, 0xdd6e, 0xa1d, 0xdd78, 0xa16, 0xdd83, 0xa10, 0xdd8e, - 0xa09, 0xdd98, 0xa02, 0xdda3, 0x9fb, 0xddad, 0x9f5, 0xddb8, - 0x9ee, 0xddc3, 0x9e7, 0xddcd, 0x9e0, 0xddd8, 0x9da, 0xdde2, - 0x9d3, 0xdded, 0x9cc, 0xddf8, 0x9c6, 0xde02, 0x9bf, 0xde0d, - 0x9b8, 0xde18, 0x9b2, 0xde22, 0x9ab, 0xde2d, 0x9a4, 0xde38, - 0x99e, 0xde42, 0x997, 0xde4d, 0x991, 0xde58, 0x98a, 0xde62, - 0x983, 0xde6d, 0x97d, 0xde78, 0x976, 0xde83, 0x970, 0xde8d, - 0x969, 0xde98, 0x963, 0xdea3, 0x95c, 0xdead, 0x955, 0xdeb8, - 0x94f, 0xdec3, 0x948, 0xdece, 0x942, 0xded8, 0x93b, 0xdee3, - 0x935, 0xdeee, 0x92e, 0xdef9, 0x928, 0xdf03, 0x921, 0xdf0e, - 0x91b, 0xdf19, 0x915, 0xdf24, 0x90e, 0xdf2f, 0x908, 0xdf39, - 0x901, 0xdf44, 0x8fb, 0xdf4f, 0x8f4, 0xdf5a, 0x8ee, 0xdf65, - 0x8e8, 0xdf6f, 0x8e1, 0xdf7a, 0x8db, 0xdf85, 0x8d4, 0xdf90, - 0x8ce, 0xdf9b, 0x8c8, 0xdfa5, 0x8c1, 0xdfb0, 0x8bb, 0xdfbb, - 0x8b5, 0xdfc6, 0x8ae, 0xdfd1, 0x8a8, 0xdfdc, 0x8a2, 0xdfe7, - 0x89b, 0xdff1, 0x895, 0xdffc, 0x88f, 0xe007, 0x889, 0xe012, - 0x882, 0xe01d, 0x87c, 0xe028, 0x876, 0xe033, 0x870, 0xe03e, - 0x869, 0xe049, 0x863, 0xe054, 0x85d, 0xe05e, 0x857, 0xe069, - 0x850, 0xe074, 0x84a, 0xe07f, 0x844, 0xe08a, 0x83e, 0xe095, - 0x838, 0xe0a0, 0x832, 0xe0ab, 0x82b, 0xe0b6, 0x825, 0xe0c1, - 0x81f, 0xe0cc, 0x819, 0xe0d7, 0x813, 0xe0e2, 0x80d, 0xe0ed, - 0x807, 0xe0f8, 0x801, 0xe103, 0x7fb, 0xe10e, 0x7f5, 0xe119, - 0x7ee, 0xe124, 0x7e8, 0xe12f, 0x7e2, 0xe13a, 0x7dc, 0xe145, - 0x7d6, 0xe150, 0x7d0, 0xe15b, 0x7ca, 0xe166, 0x7c4, 0xe171, - 0x7be, 0xe17c, 0x7b8, 0xe187, 0x7b2, 0xe192, 0x7ac, 0xe19d, - 0x7a6, 0xe1a8, 0x7a0, 0xe1b3, 0x79a, 0xe1be, 0x795, 0xe1ca, - 0x78f, 0xe1d5, 0x789, 0xe1e0, 0x783, 0xe1eb, 0x77d, 0xe1f6, - 0x777, 0xe201, 0x771, 0xe20c, 0x76b, 0xe217, 0x765, 0xe222, - 0x75f, 0xe22d, 0x75a, 0xe239, 0x754, 0xe244, 0x74e, 0xe24f, - 0x748, 0xe25a, 0x742, 0xe265, 0x73d, 0xe270, 0x737, 0xe27b, - 0x731, 0xe287, 0x72b, 0xe292, 0x725, 0xe29d, 0x720, 0xe2a8, - 0x71a, 0xe2b3, 0x714, 0xe2be, 0x70e, 0xe2ca, 0x709, 0xe2d5, - 0x703, 0xe2e0, 0x6fd, 0xe2eb, 0x6f7, 0xe2f6, 0x6f2, 0xe301, - 0x6ec, 0xe30d, 0x6e6, 0xe318, 0x6e1, 0xe323, 0x6db, 0xe32e, - 0x6d5, 0xe33a, 0x6d0, 0xe345, 0x6ca, 0xe350, 0x6c5, 0xe35b, - 0x6bf, 0xe367, 0x6b9, 0xe372, 0x6b4, 0xe37d, 0x6ae, 0xe388, - 0x6a8, 0xe394, 0x6a3, 0xe39f, 0x69d, 0xe3aa, 0x698, 0xe3b5, - 0x692, 0xe3c1, 0x68d, 0xe3cc, 0x687, 0xe3d7, 0x682, 0xe3e2, - 0x67c, 0xe3ee, 0x677, 0xe3f9, 0x671, 0xe404, 0x66c, 0xe410, - 0x666, 0xe41b, 0x661, 0xe426, 0x65b, 0xe432, 0x656, 0xe43d, - 0x650, 0xe448, 0x64b, 0xe454, 0x645, 0xe45f, 0x640, 0xe46a, - 0x63b, 0xe476, 0x635, 0xe481, 0x630, 0xe48c, 0x62a, 0xe498, - 0x625, 0xe4a3, 0x620, 0xe4ae, 0x61a, 0xe4ba, 0x615, 0xe4c5, - 0x610, 0xe4d0, 0x60a, 0xe4dc, 0x605, 0xe4e7, 0x600, 0xe4f3, - 0x5fa, 0xe4fe, 0x5f5, 0xe509, 0x5f0, 0xe515, 0x5ea, 0xe520, - 0x5e5, 0xe52c, 0x5e0, 0xe537, 0x5db, 0xe542, 0x5d5, 0xe54e, - 0x5d0, 0xe559, 0x5cb, 0xe565, 0x5c6, 0xe570, 0x5c1, 0xe57c, - 0x5bb, 0xe587, 0x5b6, 0xe592, 0x5b1, 0xe59e, 0x5ac, 0xe5a9, - 0x5a7, 0xe5b5, 0x5a1, 0xe5c0, 0x59c, 0xe5cc, 0x597, 0xe5d7, - 0x592, 0xe5e3, 0x58d, 0xe5ee, 0x588, 0xe5fa, 0x583, 0xe605, - 0x57e, 0xe611, 0x578, 0xe61c, 0x573, 0xe628, 0x56e, 0xe633, - 0x569, 0xe63f, 0x564, 0xe64a, 0x55f, 0xe656, 0x55a, 0xe661, - 0x555, 0xe66d, 0x550, 0xe678, 0x54b, 0xe684, 0x546, 0xe68f, - 0x541, 0xe69b, 0x53c, 0xe6a6, 0x537, 0xe6b2, 0x532, 0xe6bd, - 0x52d, 0xe6c9, 0x528, 0xe6d4, 0x523, 0xe6e0, 0x51e, 0xe6ec, - 0x51a, 0xe6f7, 0x515, 0xe703, 0x510, 0xe70e, 0x50b, 0xe71a, - 0x506, 0xe725, 0x501, 0xe731, 0x4fc, 0xe73d, 0x4f7, 0xe748, - 0x4f2, 0xe754, 0x4ee, 0xe75f, 0x4e9, 0xe76b, 0x4e4, 0xe777, - 0x4df, 0xe782, 0x4da, 0xe78e, 0x4d6, 0xe799, 0x4d1, 0xe7a5, - 0x4cc, 0xe7b1, 0x4c7, 0xe7bc, 0x4c2, 0xe7c8, 0x4be, 0xe7d3, - 0x4b9, 0xe7df, 0x4b4, 0xe7eb, 0x4b0, 0xe7f6, 0x4ab, 0xe802, - 0x4a6, 0xe80e, 0x4a1, 0xe819, 0x49d, 0xe825, 0x498, 0xe831, - 0x493, 0xe83c, 0x48f, 0xe848, 0x48a, 0xe854, 0x485, 0xe85f, - 0x481, 0xe86b, 0x47c, 0xe877, 0x478, 0xe882, 0x473, 0xe88e, - 0x46e, 0xe89a, 0x46a, 0xe8a5, 0x465, 0xe8b1, 0x461, 0xe8bd, - 0x45c, 0xe8c9, 0x457, 0xe8d4, 0x453, 0xe8e0, 0x44e, 0xe8ec, - 0x44a, 0xe8f7, 0x445, 0xe903, 0x441, 0xe90f, 0x43c, 0xe91b, - 0x438, 0xe926, 0x433, 0xe932, 0x42f, 0xe93e, 0x42a, 0xe94a, - 0x426, 0xe955, 0x422, 0xe961, 0x41d, 0xe96d, 0x419, 0xe979, - 0x414, 0xe984, 0x410, 0xe990, 0x40b, 0xe99c, 0x407, 0xe9a8, - 0x403, 0xe9b4, 0x3fe, 0xe9bf, 0x3fa, 0xe9cb, 0x3f6, 0xe9d7, - 0x3f1, 0xe9e3, 0x3ed, 0xe9ee, 0x3e9, 0xe9fa, 0x3e4, 0xea06, - 0x3e0, 0xea12, 0x3dc, 0xea1e, 0x3d7, 0xea29, 0x3d3, 0xea35, - 0x3cf, 0xea41, 0x3ca, 0xea4d, 0x3c6, 0xea59, 0x3c2, 0xea65, - 0x3be, 0xea70, 0x3ba, 0xea7c, 0x3b5, 0xea88, 0x3b1, 0xea94, - 0x3ad, 0xeaa0, 0x3a9, 0xeaac, 0x3a5, 0xeab7, 0x3a0, 0xeac3, - 0x39c, 0xeacf, 0x398, 0xeadb, 0x394, 0xeae7, 0x390, 0xeaf3, - 0x38c, 0xeaff, 0x387, 0xeb0a, 0x383, 0xeb16, 0x37f, 0xeb22, - 0x37b, 0xeb2e, 0x377, 0xeb3a, 0x373, 0xeb46, 0x36f, 0xeb52, - 0x36b, 0xeb5e, 0x367, 0xeb6a, 0x363, 0xeb75, 0x35f, 0xeb81, - 0x35b, 0xeb8d, 0x357, 0xeb99, 0x353, 0xeba5, 0x34f, 0xebb1, - 0x34b, 0xebbd, 0x347, 0xebc9, 0x343, 0xebd5, 0x33f, 0xebe1, - 0x33b, 0xebed, 0x337, 0xebf9, 0x333, 0xec05, 0x32f, 0xec10, - 0x32b, 0xec1c, 0x327, 0xec28, 0x323, 0xec34, 0x320, 0xec40, - 0x31c, 0xec4c, 0x318, 0xec58, 0x314, 0xec64, 0x310, 0xec70, - 0x30c, 0xec7c, 0x308, 0xec88, 0x305, 0xec94, 0x301, 0xeca0, - 0x2fd, 0xecac, 0x2f9, 0xecb8, 0x2f5, 0xecc4, 0x2f2, 0xecd0, - 0x2ee, 0xecdc, 0x2ea, 0xece8, 0x2e6, 0xecf4, 0x2e3, 0xed00, - 0x2df, 0xed0c, 0x2db, 0xed18, 0x2d8, 0xed24, 0x2d4, 0xed30, - 0x2d0, 0xed3c, 0x2cc, 0xed48, 0x2c9, 0xed54, 0x2c5, 0xed60, - 0x2c1, 0xed6c, 0x2be, 0xed78, 0x2ba, 0xed84, 0x2b7, 0xed90, - 0x2b3, 0xed9c, 0x2af, 0xeda8, 0x2ac, 0xedb4, 0x2a8, 0xedc0, - 0x2a5, 0xedcc, 0x2a1, 0xedd8, 0x29d, 0xede4, 0x29a, 0xedf0, - 0x296, 0xedfc, 0x293, 0xee09, 0x28f, 0xee15, 0x28c, 0xee21, - 0x288, 0xee2d, 0x285, 0xee39, 0x281, 0xee45, 0x27e, 0xee51, - 0x27a, 0xee5d, 0x277, 0xee69, 0x273, 0xee75, 0x270, 0xee81, - 0x26d, 0xee8d, 0x269, 0xee99, 0x266, 0xeea6, 0x262, 0xeeb2, - 0x25f, 0xeebe, 0x25c, 0xeeca, 0x258, 0xeed6, 0x255, 0xeee2, - 0x251, 0xeeee, 0x24e, 0xeefa, 0x24b, 0xef06, 0x247, 0xef13, - 0x244, 0xef1f, 0x241, 0xef2b, 0x23e, 0xef37, 0x23a, 0xef43, - 0x237, 0xef4f, 0x234, 0xef5b, 0x230, 0xef67, 0x22d, 0xef74, - 0x22a, 0xef80, 0x227, 0xef8c, 0x223, 0xef98, 0x220, 0xefa4, - 0x21d, 0xefb0, 0x21a, 0xefbc, 0x217, 0xefc9, 0x213, 0xefd5, - 0x210, 0xefe1, 0x20d, 0xefed, 0x20a, 0xeff9, 0x207, 0xf005, - 0x204, 0xf012, 0x201, 0xf01e, 0x1fd, 0xf02a, 0x1fa, 0xf036, - 0x1f7, 0xf042, 0x1f4, 0xf04e, 0x1f1, 0xf05b, 0x1ee, 0xf067, - 0x1eb, 0xf073, 0x1e8, 0xf07f, 0x1e5, 0xf08b, 0x1e2, 0xf098, - 0x1df, 0xf0a4, 0x1dc, 0xf0b0, 0x1d9, 0xf0bc, 0x1d6, 0xf0c8, - 0x1d3, 0xf0d5, 0x1d0, 0xf0e1, 0x1cd, 0xf0ed, 0x1ca, 0xf0f9, - 0x1c7, 0xf105, 0x1c4, 0xf112, 0x1c1, 0xf11e, 0x1be, 0xf12a, - 0x1bb, 0xf136, 0x1b8, 0xf143, 0x1b6, 0xf14f, 0x1b3, 0xf15b, - 0x1b0, 0xf167, 0x1ad, 0xf174, 0x1aa, 0xf180, 0x1a7, 0xf18c, - 0x1a4, 0xf198, 0x1a2, 0xf1a4, 0x19f, 0xf1b1, 0x19c, 0xf1bd, - 0x199, 0xf1c9, 0x196, 0xf1d5, 0x194, 0xf1e2, 0x191, 0xf1ee, - 0x18e, 0xf1fa, 0x18b, 0xf207, 0x189, 0xf213, 0x186, 0xf21f, - 0x183, 0xf22b, 0x180, 0xf238, 0x17e, 0xf244, 0x17b, 0xf250, - 0x178, 0xf25c, 0x176, 0xf269, 0x173, 0xf275, 0x170, 0xf281, - 0x16e, 0xf28e, 0x16b, 0xf29a, 0x168, 0xf2a6, 0x166, 0xf2b2, - 0x163, 0xf2bf, 0x161, 0xf2cb, 0x15e, 0xf2d7, 0x15b, 0xf2e4, - 0x159, 0xf2f0, 0x156, 0xf2fc, 0x154, 0xf308, 0x151, 0xf315, - 0x14f, 0xf321, 0x14c, 0xf32d, 0x14a, 0xf33a, 0x147, 0xf346, - 0x145, 0xf352, 0x142, 0xf35f, 0x140, 0xf36b, 0x13d, 0xf377, - 0x13b, 0xf384, 0x138, 0xf390, 0x136, 0xf39c, 0x134, 0xf3a9, - 0x131, 0xf3b5, 0x12f, 0xf3c1, 0x12c, 0xf3ce, 0x12a, 0xf3da, - 0x128, 0xf3e6, 0x125, 0xf3f3, 0x123, 0xf3ff, 0x120, 0xf40b, - 0x11e, 0xf418, 0x11c, 0xf424, 0x119, 0xf430, 0x117, 0xf43d, - 0x115, 0xf449, 0x113, 0xf455, 0x110, 0xf462, 0x10e, 0xf46e, - 0x10c, 0xf47b, 0x109, 0xf487, 0x107, 0xf493, 0x105, 0xf4a0, - 0x103, 0xf4ac, 0x100, 0xf4b8, 0xfe, 0xf4c5, 0xfc, 0xf4d1, - 0xfa, 0xf4dd, 0xf8, 0xf4ea, 0xf6, 0xf4f6, 0xf3, 0xf503, - 0xf1, 0xf50f, 0xef, 0xf51b, 0xed, 0xf528, 0xeb, 0xf534, - 0xe9, 0xf540, 0xe7, 0xf54d, 0xe4, 0xf559, 0xe2, 0xf566, - 0xe0, 0xf572, 0xde, 0xf57e, 0xdc, 0xf58b, 0xda, 0xf597, - 0xd8, 0xf5a4, 0xd6, 0xf5b0, 0xd4, 0xf5bc, 0xd2, 0xf5c9, - 0xd0, 0xf5d5, 0xce, 0xf5e2, 0xcc, 0xf5ee, 0xca, 0xf5fa, - 0xc8, 0xf607, 0xc6, 0xf613, 0xc4, 0xf620, 0xc2, 0xf62c, - 0xc0, 0xf639, 0xbe, 0xf645, 0xbd, 0xf651, 0xbb, 0xf65e, - 0xb9, 0xf66a, 0xb7, 0xf677, 0xb5, 0xf683, 0xb3, 0xf690, - 0xb1, 0xf69c, 0xaf, 0xf6a8, 0xae, 0xf6b5, 0xac, 0xf6c1, - 0xaa, 0xf6ce, 0xa8, 0xf6da, 0xa6, 0xf6e7, 0xa5, 0xf6f3, - 0xa3, 0xf6ff, 0xa1, 0xf70c, 0x9f, 0xf718, 0x9e, 0xf725, - 0x9c, 0xf731, 0x9a, 0xf73e, 0x98, 0xf74a, 0x97, 0xf757, - 0x95, 0xf763, 0x93, 0xf76f, 0x92, 0xf77c, 0x90, 0xf788, - 0x8e, 0xf795, 0x8d, 0xf7a1, 0x8b, 0xf7ae, 0x89, 0xf7ba, - 0x88, 0xf7c7, 0x86, 0xf7d3, 0x85, 0xf7e0, 0x83, 0xf7ec, - 0x81, 0xf7f9, 0x80, 0xf805, 0x7e, 0xf811, 0x7d, 0xf81e, - 0x7b, 0xf82a, 0x7a, 0xf837, 0x78, 0xf843, 0x77, 0xf850, - 0x75, 0xf85c, 0x74, 0xf869, 0x72, 0xf875, 0x71, 0xf882, - 0x6f, 0xf88e, 0x6e, 0xf89b, 0x6c, 0xf8a7, 0x6b, 0xf8b4, - 0x69, 0xf8c0, 0x68, 0xf8cd, 0x67, 0xf8d9, 0x65, 0xf8e6, - 0x64, 0xf8f2, 0x62, 0xf8ff, 0x61, 0xf90b, 0x60, 0xf918, - 0x5e, 0xf924, 0x5d, 0xf931, 0x5c, 0xf93d, 0x5a, 0xf94a, - 0x59, 0xf956, 0x58, 0xf963, 0x56, 0xf96f, 0x55, 0xf97c, - 0x54, 0xf988, 0x53, 0xf995, 0x51, 0xf9a1, 0x50, 0xf9ae, - 0x4f, 0xf9ba, 0x4e, 0xf9c7, 0x4c, 0xf9d3, 0x4b, 0xf9e0, - 0x4a, 0xf9ec, 0x49, 0xf9f9, 0x48, 0xfa05, 0x47, 0xfa12, - 0x45, 0xfa1e, 0x44, 0xfa2b, 0x43, 0xfa37, 0x42, 0xfa44, - 0x41, 0xfa50, 0x40, 0xfa5d, 0x3f, 0xfa69, 0x3d, 0xfa76, - 0x3c, 0xfa82, 0x3b, 0xfa8f, 0x3a, 0xfa9b, 0x39, 0xfaa8, - 0x38, 0xfab4, 0x37, 0xfac1, 0x36, 0xfacd, 0x35, 0xfada, - 0x34, 0xfae6, 0x33, 0xfaf3, 0x32, 0xfb00, 0x31, 0xfb0c, - 0x30, 0xfb19, 0x2f, 0xfb25, 0x2e, 0xfb32, 0x2d, 0xfb3e, - 0x2c, 0xfb4b, 0x2b, 0xfb57, 0x2b, 0xfb64, 0x2a, 0xfb70, - 0x29, 0xfb7d, 0x28, 0xfb89, 0x27, 0xfb96, 0x26, 0xfba2, - 0x25, 0xfbaf, 0x24, 0xfbbc, 0x24, 0xfbc8, 0x23, 0xfbd5, - 0x22, 0xfbe1, 0x21, 0xfbee, 0x20, 0xfbfa, 0x20, 0xfc07, - 0x1f, 0xfc13, 0x1e, 0xfc20, 0x1d, 0xfc2c, 0x1d, 0xfc39, - 0x1c, 0xfc45, 0x1b, 0xfc52, 0x1a, 0xfc5f, 0x1a, 0xfc6b, - 0x19, 0xfc78, 0x18, 0xfc84, 0x18, 0xfc91, 0x17, 0xfc9d, - 0x16, 0xfcaa, 0x16, 0xfcb6, 0x15, 0xfcc3, 0x14, 0xfcd0, - 0x14, 0xfcdc, 0x13, 0xfce9, 0x13, 0xfcf5, 0x12, 0xfd02, - 0x11, 0xfd0e, 0x11, 0xfd1b, 0x10, 0xfd27, 0x10, 0xfd34, - 0xf, 0xfd40, 0xf, 0xfd4d, 0xe, 0xfd5a, 0xe, 0xfd66, - 0xd, 0xfd73, 0xd, 0xfd7f, 0xc, 0xfd8c, 0xc, 0xfd98, - 0xb, 0xfda5, 0xb, 0xfdb2, 0xa, 0xfdbe, 0xa, 0xfdcb, - 0x9, 0xfdd7, 0x9, 0xfde4, 0x9, 0xfdf0, 0x8, 0xfdfd, - 0x8, 0xfe09, 0x7, 0xfe16, 0x7, 0xfe23, 0x7, 0xfe2f, - 0x6, 0xfe3c, 0x6, 0xfe48, 0x6, 0xfe55, 0x5, 0xfe61, - 0x5, 0xfe6e, 0x5, 0xfe7a, 0x4, 0xfe87, 0x4, 0xfe94, - 0x4, 0xfea0, 0x4, 0xfead, 0x3, 0xfeb9, 0x3, 0xfec6, - 0x3, 0xfed2, 0x3, 0xfedf, 0x2, 0xfeec, 0x2, 0xfef8, - 0x2, 0xff05, 0x2, 0xff11, 0x2, 0xff1e, 0x1, 0xff2a, - 0x1, 0xff37, 0x1, 0xff44, 0x1, 0xff50, 0x1, 0xff5d, - 0x1, 0xff69, 0x1, 0xff76, 0x0, 0xff82, 0x0, 0xff8f, - 0x0, 0xff9b, 0x0, 0xffa8, 0x0, 0xffb5, 0x0, 0xffc1, - 0x0, 0xffce, 0x0, 0xffda, 0x0, 0xffe7, 0x0, 0xfff3, - 0x0, 0x0, 0x0, 0xd, 0x0, 0x19, 0x0, 0x26, - 0x0, 0x32, 0x0, 0x3f, 0x0, 0x4b, 0x0, 0x58, - 0x0, 0x65, 0x0, 0x71, 0x0, 0x7e, 0x1, 0x8a, - 0x1, 0x97, 0x1, 0xa3, 0x1, 0xb0, 0x1, 0xbc, - 0x1, 0xc9, 0x1, 0xd6, 0x2, 0xe2, 0x2, 0xef, - 0x2, 0xfb, 0x2, 0x108, 0x2, 0x114, 0x3, 0x121, - 0x3, 0x12e, 0x3, 0x13a, 0x3, 0x147, 0x4, 0x153, - 0x4, 0x160, 0x4, 0x16c, 0x4, 0x179, 0x5, 0x186, - 0x5, 0x192, 0x5, 0x19f, 0x6, 0x1ab, 0x6, 0x1b8, - 0x6, 0x1c4, 0x7, 0x1d1, 0x7, 0x1dd, 0x7, 0x1ea, - 0x8, 0x1f7, 0x8, 0x203, 0x9, 0x210, 0x9, 0x21c, - 0x9, 0x229, 0xa, 0x235, 0xa, 0x242, 0xb, 0x24e, - 0xb, 0x25b, 0xc, 0x268, 0xc, 0x274, 0xd, 0x281, - 0xd, 0x28d, 0xe, 0x29a, 0xe, 0x2a6, 0xf, 0x2b3, - 0xf, 0x2c0, 0x10, 0x2cc, 0x10, 0x2d9, 0x11, 0x2e5, - 0x11, 0x2f2, 0x12, 0x2fe, 0x13, 0x30b, 0x13, 0x317, - 0x14, 0x324, 0x14, 0x330, 0x15, 0x33d, 0x16, 0x34a, - 0x16, 0x356, 0x17, 0x363, 0x18, 0x36f, 0x18, 0x37c, - 0x19, 0x388, 0x1a, 0x395, 0x1a, 0x3a1, 0x1b, 0x3ae, - 0x1c, 0x3bb, 0x1d, 0x3c7, 0x1d, 0x3d4, 0x1e, 0x3e0, - 0x1f, 0x3ed, 0x20, 0x3f9, 0x20, 0x406, 0x21, 0x412, - 0x22, 0x41f, 0x23, 0x42b, 0x24, 0x438, 0x24, 0x444, - 0x25, 0x451, 0x26, 0x45e, 0x27, 0x46a, 0x28, 0x477, - 0x29, 0x483, 0x2a, 0x490, 0x2b, 0x49c, 0x2b, 0x4a9, - 0x2c, 0x4b5, 0x2d, 0x4c2, 0x2e, 0x4ce, 0x2f, 0x4db, - 0x30, 0x4e7, 0x31, 0x4f4, 0x32, 0x500, 0x33, 0x50d, - 0x34, 0x51a, 0x35, 0x526, 0x36, 0x533, 0x37, 0x53f, - 0x38, 0x54c, 0x39, 0x558, 0x3a, 0x565, 0x3b, 0x571, - 0x3c, 0x57e, 0x3d, 0x58a, 0x3f, 0x597, 0x40, 0x5a3, - 0x41, 0x5b0, 0x42, 0x5bc, 0x43, 0x5c9, 0x44, 0x5d5, - 0x45, 0x5e2, 0x47, 0x5ee, 0x48, 0x5fb, 0x49, 0x607, - 0x4a, 0x614, 0x4b, 0x620, 0x4c, 0x62d, 0x4e, 0x639, - 0x4f, 0x646, 0x50, 0x652, 0x51, 0x65f, 0x53, 0x66b, - 0x54, 0x678, 0x55, 0x684, 0x56, 0x691, 0x58, 0x69d, - 0x59, 0x6aa, 0x5a, 0x6b6, 0x5c, 0x6c3, 0x5d, 0x6cf, - 0x5e, 0x6dc, 0x60, 0x6e8, 0x61, 0x6f5, 0x62, 0x701, - 0x64, 0x70e, 0x65, 0x71a, 0x67, 0x727, 0x68, 0x733, - 0x69, 0x740, 0x6b, 0x74c, 0x6c, 0x759, 0x6e, 0x765, - 0x6f, 0x772, 0x71, 0x77e, 0x72, 0x78b, 0x74, 0x797, - 0x75, 0x7a4, 0x77, 0x7b0, 0x78, 0x7bd, 0x7a, 0x7c9, - 0x7b, 0x7d6, 0x7d, 0x7e2, 0x7e, 0x7ef, 0x80, 0x7fb, - 0x81, 0x807, 0x83, 0x814, 0x85, 0x820, 0x86, 0x82d, - 0x88, 0x839, 0x89, 0x846, 0x8b, 0x852, 0x8d, 0x85f, - 0x8e, 0x86b, 0x90, 0x878, 0x92, 0x884, 0x93, 0x891, - 0x95, 0x89d, 0x97, 0x8a9, 0x98, 0x8b6, 0x9a, 0x8c2, - 0x9c, 0x8cf, 0x9e, 0x8db, 0x9f, 0x8e8, 0xa1, 0x8f4, - 0xa3, 0x901, 0xa5, 0x90d, 0xa6, 0x919, 0xa8, 0x926, - 0xaa, 0x932, 0xac, 0x93f, 0xae, 0x94b, 0xaf, 0x958, - 0xb1, 0x964, 0xb3, 0x970, 0xb5, 0x97d, 0xb7, 0x989, - 0xb9, 0x996, 0xbb, 0x9a2, 0xbd, 0x9af, 0xbe, 0x9bb, - 0xc0, 0x9c7, 0xc2, 0x9d4, 0xc4, 0x9e0, 0xc6, 0x9ed, - 0xc8, 0x9f9, 0xca, 0xa06, 0xcc, 0xa12, 0xce, 0xa1e, - 0xd0, 0xa2b, 0xd2, 0xa37, 0xd4, 0xa44, 0xd6, 0xa50, - 0xd8, 0xa5c, 0xda, 0xa69, 0xdc, 0xa75, 0xde, 0xa82, - 0xe0, 0xa8e, 0xe2, 0xa9a, 0xe4, 0xaa7, 0xe7, 0xab3, - 0xe9, 0xac0, 0xeb, 0xacc, 0xed, 0xad8, 0xef, 0xae5, - 0xf1, 0xaf1, 0xf3, 0xafd, 0xf6, 0xb0a, 0xf8, 0xb16, - 0xfa, 0xb23, 0xfc, 0xb2f, 0xfe, 0xb3b, 0x100, 0xb48, - 0x103, 0xb54, 0x105, 0xb60, 0x107, 0xb6d, 0x109, 0xb79, - 0x10c, 0xb85, 0x10e, 0xb92, 0x110, 0xb9e, 0x113, 0xbab, - 0x115, 0xbb7, 0x117, 0xbc3, 0x119, 0xbd0, 0x11c, 0xbdc, - 0x11e, 0xbe8, 0x120, 0xbf5, 0x123, 0xc01, 0x125, 0xc0d, - 0x128, 0xc1a, 0x12a, 0xc26, 0x12c, 0xc32, 0x12f, 0xc3f, - 0x131, 0xc4b, 0x134, 0xc57, 0x136, 0xc64, 0x138, 0xc70, - 0x13b, 0xc7c, 0x13d, 0xc89, 0x140, 0xc95, 0x142, 0xca1, - 0x145, 0xcae, 0x147, 0xcba, 0x14a, 0xcc6, 0x14c, 0xcd3, - 0x14f, 0xcdf, 0x151, 0xceb, 0x154, 0xcf8, 0x156, 0xd04, - 0x159, 0xd10, 0x15b, 0xd1c, 0x15e, 0xd29, 0x161, 0xd35, - 0x163, 0xd41, 0x166, 0xd4e, 0x168, 0xd5a, 0x16b, 0xd66, - 0x16e, 0xd72, 0x170, 0xd7f, 0x173, 0xd8b, 0x176, 0xd97, - 0x178, 0xda4, 0x17b, 0xdb0, 0x17e, 0xdbc, 0x180, 0xdc8, - 0x183, 0xdd5, 0x186, 0xde1, 0x189, 0xded, 0x18b, 0xdf9, - 0x18e, 0xe06, 0x191, 0xe12, 0x194, 0xe1e, 0x196, 0xe2b, - 0x199, 0xe37, 0x19c, 0xe43, 0x19f, 0xe4f, 0x1a2, 0xe5c, - 0x1a4, 0xe68, 0x1a7, 0xe74, 0x1aa, 0xe80, 0x1ad, 0xe8c, - 0x1b0, 0xe99, 0x1b3, 0xea5, 0x1b6, 0xeb1, 0x1b8, 0xebd, - 0x1bb, 0xeca, 0x1be, 0xed6, 0x1c1, 0xee2, 0x1c4, 0xeee, - 0x1c7, 0xefb, 0x1ca, 0xf07, 0x1cd, 0xf13, 0x1d0, 0xf1f, - 0x1d3, 0xf2b, 0x1d6, 0xf38, 0x1d9, 0xf44, 0x1dc, 0xf50, - 0x1df, 0xf5c, 0x1e2, 0xf68, 0x1e5, 0xf75, 0x1e8, 0xf81, - 0x1eb, 0xf8d, 0x1ee, 0xf99, 0x1f1, 0xfa5, 0x1f4, 0xfb2, - 0x1f7, 0xfbe, 0x1fa, 0xfca, 0x1fd, 0xfd6, 0x201, 0xfe2, - 0x204, 0xfee, 0x207, 0xffb, 0x20a, 0x1007, 0x20d, 0x1013, - 0x210, 0x101f, 0x213, 0x102b, 0x217, 0x1037, 0x21a, 0x1044, - 0x21d, 0x1050, 0x220, 0x105c, 0x223, 0x1068, 0x227, 0x1074, - 0x22a, 0x1080, 0x22d, 0x108c, 0x230, 0x1099, 0x234, 0x10a5, - 0x237, 0x10b1, 0x23a, 0x10bd, 0x23e, 0x10c9, 0x241, 0x10d5, - 0x244, 0x10e1, 0x247, 0x10ed, 0x24b, 0x10fa, 0x24e, 0x1106, - 0x251, 0x1112, 0x255, 0x111e, 0x258, 0x112a, 0x25c, 0x1136, - 0x25f, 0x1142, 0x262, 0x114e, 0x266, 0x115a, 0x269, 0x1167, - 0x26d, 0x1173, 0x270, 0x117f, 0x273, 0x118b, 0x277, 0x1197, - 0x27a, 0x11a3, 0x27e, 0x11af, 0x281, 0x11bb, 0x285, 0x11c7, - 0x288, 0x11d3, 0x28c, 0x11df, 0x28f, 0x11eb, 0x293, 0x11f7, - 0x296, 0x1204, 0x29a, 0x1210, 0x29d, 0x121c, 0x2a1, 0x1228, - 0x2a5, 0x1234, 0x2a8, 0x1240, 0x2ac, 0x124c, 0x2af, 0x1258, - 0x2b3, 0x1264, 0x2b7, 0x1270, 0x2ba, 0x127c, 0x2be, 0x1288, - 0x2c1, 0x1294, 0x2c5, 0x12a0, 0x2c9, 0x12ac, 0x2cc, 0x12b8, - 0x2d0, 0x12c4, 0x2d4, 0x12d0, 0x2d8, 0x12dc, 0x2db, 0x12e8, - 0x2df, 0x12f4, 0x2e3, 0x1300, 0x2e6, 0x130c, 0x2ea, 0x1318, - 0x2ee, 0x1324, 0x2f2, 0x1330, 0x2f5, 0x133c, 0x2f9, 0x1348, - 0x2fd, 0x1354, 0x301, 0x1360, 0x305, 0x136c, 0x308, 0x1378, - 0x30c, 0x1384, 0x310, 0x1390, 0x314, 0x139c, 0x318, 0x13a8, - 0x31c, 0x13b4, 0x320, 0x13c0, 0x323, 0x13cc, 0x327, 0x13d8, - 0x32b, 0x13e4, 0x32f, 0x13f0, 0x333, 0x13fb, 0x337, 0x1407, - 0x33b, 0x1413, 0x33f, 0x141f, 0x343, 0x142b, 0x347, 0x1437, - 0x34b, 0x1443, 0x34f, 0x144f, 0x353, 0x145b, 0x357, 0x1467, - 0x35b, 0x1473, 0x35f, 0x147f, 0x363, 0x148b, 0x367, 0x1496, - 0x36b, 0x14a2, 0x36f, 0x14ae, 0x373, 0x14ba, 0x377, 0x14c6, - 0x37b, 0x14d2, 0x37f, 0x14de, 0x383, 0x14ea, 0x387, 0x14f6, - 0x38c, 0x1501, 0x390, 0x150d, 0x394, 0x1519, 0x398, 0x1525, - 0x39c, 0x1531, 0x3a0, 0x153d, 0x3a5, 0x1549, 0x3a9, 0x1554, - 0x3ad, 0x1560, 0x3b1, 0x156c, 0x3b5, 0x1578, 0x3ba, 0x1584, - 0x3be, 0x1590, 0x3c2, 0x159b, 0x3c6, 0x15a7, 0x3ca, 0x15b3, - 0x3cf, 0x15bf, 0x3d3, 0x15cb, 0x3d7, 0x15d7, 0x3dc, 0x15e2, - 0x3e0, 0x15ee, 0x3e4, 0x15fa, 0x3e9, 0x1606, 0x3ed, 0x1612, - 0x3f1, 0x161d, 0x3f6, 0x1629, 0x3fa, 0x1635, 0x3fe, 0x1641, - 0x403, 0x164c, 0x407, 0x1658, 0x40b, 0x1664, 0x410, 0x1670, - 0x414, 0x167c, 0x419, 0x1687, 0x41d, 0x1693, 0x422, 0x169f, - 0x426, 0x16ab, 0x42a, 0x16b6, 0x42f, 0x16c2, 0x433, 0x16ce, - 0x438, 0x16da, 0x43c, 0x16e5, 0x441, 0x16f1, 0x445, 0x16fd, - 0x44a, 0x1709, 0x44e, 0x1714, 0x453, 0x1720, 0x457, 0x172c, - 0x45c, 0x1737, 0x461, 0x1743, 0x465, 0x174f, 0x46a, 0x175b, - 0x46e, 0x1766, 0x473, 0x1772, 0x478, 0x177e, 0x47c, 0x1789, - 0x481, 0x1795, 0x485, 0x17a1, 0x48a, 0x17ac, 0x48f, 0x17b8, - 0x493, 0x17c4, 0x498, 0x17cf, 0x49d, 0x17db, 0x4a1, 0x17e7, - 0x4a6, 0x17f2, 0x4ab, 0x17fe, 0x4b0, 0x180a, 0x4b4, 0x1815, - 0x4b9, 0x1821, 0x4be, 0x182d, 0x4c2, 0x1838, 0x4c7, 0x1844, - 0x4cc, 0x184f, 0x4d1, 0x185b, 0x4d6, 0x1867, 0x4da, 0x1872, - 0x4df, 0x187e, 0x4e4, 0x1889, 0x4e9, 0x1895, 0x4ee, 0x18a1, - 0x4f2, 0x18ac, 0x4f7, 0x18b8, 0x4fc, 0x18c3, 0x501, 0x18cf, - 0x506, 0x18db, 0x50b, 0x18e6, 0x510, 0x18f2, 0x515, 0x18fd, - 0x51a, 0x1909, 0x51e, 0x1914, 0x523, 0x1920, 0x528, 0x192c, - 0x52d, 0x1937, 0x532, 0x1943, 0x537, 0x194e, 0x53c, 0x195a, - 0x541, 0x1965, 0x546, 0x1971, 0x54b, 0x197c, 0x550, 0x1988, - 0x555, 0x1993, 0x55a, 0x199f, 0x55f, 0x19aa, 0x564, 0x19b6, - 0x569, 0x19c1, 0x56e, 0x19cd, 0x573, 0x19d8, 0x578, 0x19e4, - 0x57e, 0x19ef, 0x583, 0x19fb, 0x588, 0x1a06, 0x58d, 0x1a12, - 0x592, 0x1a1d, 0x597, 0x1a29, 0x59c, 0x1a34, 0x5a1, 0x1a40, - 0x5a7, 0x1a4b, 0x5ac, 0x1a57, 0x5b1, 0x1a62, 0x5b6, 0x1a6e, - 0x5bb, 0x1a79, 0x5c1, 0x1a84, 0x5c6, 0x1a90, 0x5cb, 0x1a9b, - 0x5d0, 0x1aa7, 0x5d5, 0x1ab2, 0x5db, 0x1abe, 0x5e0, 0x1ac9, - 0x5e5, 0x1ad4, 0x5ea, 0x1ae0, 0x5f0, 0x1aeb, 0x5f5, 0x1af7, - 0x5fa, 0x1b02, 0x600, 0x1b0d, 0x605, 0x1b19, 0x60a, 0x1b24, - 0x610, 0x1b30, 0x615, 0x1b3b, 0x61a, 0x1b46, 0x620, 0x1b52, - 0x625, 0x1b5d, 0x62a, 0x1b68, 0x630, 0x1b74, 0x635, 0x1b7f, - 0x63b, 0x1b8a, 0x640, 0x1b96, 0x645, 0x1ba1, 0x64b, 0x1bac, - 0x650, 0x1bb8, 0x656, 0x1bc3, 0x65b, 0x1bce, 0x661, 0x1bda, - 0x666, 0x1be5, 0x66c, 0x1bf0, 0x671, 0x1bfc, 0x677, 0x1c07, - 0x67c, 0x1c12, 0x682, 0x1c1e, 0x687, 0x1c29, 0x68d, 0x1c34, - 0x692, 0x1c3f, 0x698, 0x1c4b, 0x69d, 0x1c56, 0x6a3, 0x1c61, - 0x6a8, 0x1c6c, 0x6ae, 0x1c78, 0x6b4, 0x1c83, 0x6b9, 0x1c8e, - 0x6bf, 0x1c99, 0x6c5, 0x1ca5, 0x6ca, 0x1cb0, 0x6d0, 0x1cbb, - 0x6d5, 0x1cc6, 0x6db, 0x1cd2, 0x6e1, 0x1cdd, 0x6e6, 0x1ce8, - 0x6ec, 0x1cf3, 0x6f2, 0x1cff, 0x6f7, 0x1d0a, 0x6fd, 0x1d15, - 0x703, 0x1d20, 0x709, 0x1d2b, 0x70e, 0x1d36, 0x714, 0x1d42, - 0x71a, 0x1d4d, 0x720, 0x1d58, 0x725, 0x1d63, 0x72b, 0x1d6e, - 0x731, 0x1d79, 0x737, 0x1d85, 0x73d, 0x1d90, 0x742, 0x1d9b, - 0x748, 0x1da6, 0x74e, 0x1db1, 0x754, 0x1dbc, 0x75a, 0x1dc7, - 0x75f, 0x1dd3, 0x765, 0x1dde, 0x76b, 0x1de9, 0x771, 0x1df4, - 0x777, 0x1dff, 0x77d, 0x1e0a, 0x783, 0x1e15, 0x789, 0x1e20, - 0x78f, 0x1e2b, 0x795, 0x1e36, 0x79a, 0x1e42, 0x7a0, 0x1e4d, - 0x7a6, 0x1e58, 0x7ac, 0x1e63, 0x7b2, 0x1e6e, 0x7b8, 0x1e79, - 0x7be, 0x1e84, 0x7c4, 0x1e8f, 0x7ca, 0x1e9a, 0x7d0, 0x1ea5, - 0x7d6, 0x1eb0, 0x7dc, 0x1ebb, 0x7e2, 0x1ec6, 0x7e8, 0x1ed1, - 0x7ee, 0x1edc, 0x7f5, 0x1ee7, 0x7fb, 0x1ef2, 0x801, 0x1efd, - 0x807, 0x1f08, 0x80d, 0x1f13, 0x813, 0x1f1e, 0x819, 0x1f29, - 0x81f, 0x1f34, 0x825, 0x1f3f, 0x82b, 0x1f4a, 0x832, 0x1f55, - 0x838, 0x1f60, 0x83e, 0x1f6b, 0x844, 0x1f76, 0x84a, 0x1f81, - 0x850, 0x1f8c, 0x857, 0x1f97, 0x85d, 0x1fa2, 0x863, 0x1fac, - 0x869, 0x1fb7, 0x870, 0x1fc2, 0x876, 0x1fcd, 0x87c, 0x1fd8, - 0x882, 0x1fe3, 0x889, 0x1fee, 0x88f, 0x1ff9, 0x895, 0x2004, - 0x89b, 0x200f, 0x8a2, 0x2019, 0x8a8, 0x2024, 0x8ae, 0x202f, - 0x8b5, 0x203a, 0x8bb, 0x2045, 0x8c1, 0x2050, 0x8c8, 0x205b, - 0x8ce, 0x2065, 0x8d4, 0x2070, 0x8db, 0x207b, 0x8e1, 0x2086, - 0x8e8, 0x2091, 0x8ee, 0x209b, 0x8f4, 0x20a6, 0x8fb, 0x20b1, - 0x901, 0x20bc, 0x908, 0x20c7, 0x90e, 0x20d1, 0x915, 0x20dc, - 0x91b, 0x20e7, 0x921, 0x20f2, 0x928, 0x20fd, 0x92e, 0x2107, - 0x935, 0x2112, 0x93b, 0x211d, 0x942, 0x2128, 0x948, 0x2132, - 0x94f, 0x213d, 0x955, 0x2148, 0x95c, 0x2153, 0x963, 0x215d, - 0x969, 0x2168, 0x970, 0x2173, 0x976, 0x217d, 0x97d, 0x2188, - 0x983, 0x2193, 0x98a, 0x219e, 0x991, 0x21a8, 0x997, 0x21b3, - 0x99e, 0x21be, 0x9a4, 0x21c8, 0x9ab, 0x21d3, 0x9b2, 0x21de, - 0x9b8, 0x21e8, 0x9bf, 0x21f3, 0x9c6, 0x21fe, 0x9cc, 0x2208, - 0x9d3, 0x2213, 0x9da, 0x221e, 0x9e0, 0x2228, 0x9e7, 0x2233, - 0x9ee, 0x223d, 0x9f5, 0x2248, 0x9fb, 0x2253, 0xa02, 0x225d, - 0xa09, 0x2268, 0xa10, 0x2272, 0xa16, 0x227d, 0xa1d, 0x2288, - 0xa24, 0x2292, 0xa2b, 0x229d, 0xa32, 0x22a7, 0xa38, 0x22b2, - 0xa3f, 0x22bc, 0xa46, 0x22c7, 0xa4d, 0x22d2, 0xa54, 0x22dc, - 0xa5b, 0x22e7, 0xa61, 0x22f1, 0xa68, 0x22fc, 0xa6f, 0x2306, - 0xa76, 0x2311, 0xa7d, 0x231b, 0xa84, 0x2326, 0xa8b, 0x2330, - 0xa92, 0x233b, 0xa99, 0x2345, 0xa9f, 0x2350, 0xaa6, 0x235a, - 0xaad, 0x2365, 0xab4, 0x236f, 0xabb, 0x237a, 0xac2, 0x2384, - 0xac9, 0x238e, 0xad0, 0x2399, 0xad7, 0x23a3, 0xade, 0x23ae, - 0xae5, 0x23b8, 0xaec, 0x23c3, 0xaf3, 0x23cd, 0xafa, 0x23d7, - 0xb01, 0x23e2, 0xb08, 0x23ec, 0xb0f, 0x23f7, 0xb16, 0x2401, - 0xb1e, 0x240b, 0xb25, 0x2416, 0xb2c, 0x2420, 0xb33, 0x242b, - 0xb3a, 0x2435, 0xb41, 0x243f, 0xb48, 0x244a, 0xb4f, 0x2454, - 0xb56, 0x245e, 0xb5e, 0x2469, 0xb65, 0x2473, 0xb6c, 0x247d, - 0xb73, 0x2488, 0xb7a, 0x2492, 0xb81, 0x249c, 0xb89, 0x24a7, - 0xb90, 0x24b1, 0xb97, 0x24bb, 0xb9e, 0x24c5, 0xba5, 0x24d0, - 0xbad, 0x24da, 0xbb4, 0x24e4, 0xbbb, 0x24ef, 0xbc2, 0x24f9, - 0xbca, 0x2503, 0xbd1, 0x250d, 0xbd8, 0x2518, 0xbe0, 0x2522, - 0xbe7, 0x252c, 0xbee, 0x2536, 0xbf5, 0x2541, 0xbfd, 0x254b, - 0xc04, 0x2555, 0xc0b, 0x255f, 0xc13, 0x2569, 0xc1a, 0x2574, - 0xc21, 0x257e, 0xc29, 0x2588, 0xc30, 0x2592, 0xc38, 0x259c, - 0xc3f, 0x25a6, 0xc46, 0x25b1, 0xc4e, 0x25bb, 0xc55, 0x25c5, - 0xc5d, 0x25cf, 0xc64, 0x25d9, 0xc6b, 0x25e3, 0xc73, 0x25ed, - 0xc7a, 0x25f8, 0xc82, 0x2602, 0xc89, 0x260c, 0xc91, 0x2616, - 0xc98, 0x2620, 0xca0, 0x262a, 0xca7, 0x2634, 0xcaf, 0x263e, - 0xcb6, 0x2648, 0xcbe, 0x2652, 0xcc5, 0x265c, 0xccd, 0x2666, - 0xcd4, 0x2671, 0xcdc, 0x267b, 0xce3, 0x2685, 0xceb, 0x268f, - 0xcf3, 0x2699, 0xcfa, 0x26a3, 0xd02, 0x26ad, 0xd09, 0x26b7, - 0xd11, 0x26c1, 0xd19, 0x26cb, 0xd20, 0x26d5, 0xd28, 0x26df, - 0xd30, 0x26e9, 0xd37, 0x26f3, 0xd3f, 0x26fd, 0xd46, 0x2707, - 0xd4e, 0x2711, 0xd56, 0x271a, 0xd5d, 0x2724, 0xd65, 0x272e, - 0xd6d, 0x2738, 0xd75, 0x2742, 0xd7c, 0x274c, 0xd84, 0x2756, - 0xd8c, 0x2760, 0xd93, 0x276a, 0xd9b, 0x2774, 0xda3, 0x277e, - 0xdab, 0x2788, 0xdb2, 0x2791, 0xdba, 0x279b, 0xdc2, 0x27a5, - 0xdca, 0x27af, 0xdd2, 0x27b9, 0xdd9, 0x27c3, 0xde1, 0x27cd, - 0xde9, 0x27d6, 0xdf1, 0x27e0, 0xdf9, 0x27ea, 0xe01, 0x27f4, - 0xe08, 0x27fe, 0xe10, 0x2808, 0xe18, 0x2811, 0xe20, 0x281b, - 0xe28, 0x2825, 0xe30, 0x282f, 0xe38, 0x2838, 0xe40, 0x2842, - 0xe47, 0x284c, 0xe4f, 0x2856, 0xe57, 0x2860, 0xe5f, 0x2869, - 0xe67, 0x2873, 0xe6f, 0x287d, 0xe77, 0x2886, 0xe7f, 0x2890, - 0xe87, 0x289a, 0xe8f, 0x28a4, 0xe97, 0x28ad, 0xe9f, 0x28b7, - 0xea7, 0x28c1, 0xeaf, 0x28ca, 0xeb7, 0x28d4, 0xebf, 0x28de, - 0xec7, 0x28e7, 0xecf, 0x28f1, 0xed7, 0x28fb, 0xedf, 0x2904, - 0xee7, 0x290e, 0xeef, 0x2918, 0xef7, 0x2921, 0xeff, 0x292b, - 0xf07, 0x2935, 0xf10, 0x293e, 0xf18, 0x2948, 0xf20, 0x2951, - 0xf28, 0x295b, 0xf30, 0x2965, 0xf38, 0x296e, 0xf40, 0x2978, - 0xf48, 0x2981, 0xf51, 0x298b, 0xf59, 0x2994, 0xf61, 0x299e, - 0xf69, 0x29a7, 0xf71, 0x29b1, 0xf79, 0x29bb, 0xf82, 0x29c4, - 0xf8a, 0x29ce, 0xf92, 0x29d7, 0xf9a, 0x29e1, 0xfa3, 0x29ea, - 0xfab, 0x29f4, 0xfb3, 0x29fd, 0xfbb, 0x2a07, 0xfc4, 0x2a10, - 0xfcc, 0x2a1a, 0xfd4, 0x2a23, 0xfdc, 0x2a2c, 0xfe5, 0x2a36, - 0xfed, 0x2a3f, 0xff5, 0x2a49, 0xffe, 0x2a52, 0x1006, 0x2a5c, - 0x100e, 0x2a65, 0x1016, 0x2a6e, 0x101f, 0x2a78, 0x1027, 0x2a81, - 0x1030, 0x2a8b, 0x1038, 0x2a94, 0x1040, 0x2a9d, 0x1049, 0x2aa7, - 0x1051, 0x2ab0, 0x1059, 0x2ab9, 0x1062, 0x2ac3, 0x106a, 0x2acc, - 0x1073, 0x2ad6, 0x107b, 0x2adf, 0x1083, 0x2ae8, 0x108c, 0x2af2, - 0x1094, 0x2afb, 0x109d, 0x2b04, 0x10a5, 0x2b0d, 0x10ae, 0x2b17, - 0x10b6, 0x2b20, 0x10bf, 0x2b29, 0x10c7, 0x2b33, 0x10d0, 0x2b3c, - 0x10d8, 0x2b45, 0x10e0, 0x2b4e, 0x10e9, 0x2b58, 0x10f2, 0x2b61, - 0x10fa, 0x2b6a, 0x1103, 0x2b73, 0x110b, 0x2b7d, 0x1114, 0x2b86, - 0x111c, 0x2b8f, 0x1125, 0x2b98, 0x112d, 0x2ba1, 0x1136, 0x2bab, - 0x113e, 0x2bb4, 0x1147, 0x2bbd, 0x1150, 0x2bc6, 0x1158, 0x2bcf, - 0x1161, 0x2bd8, 0x1169, 0x2be2, 0x1172, 0x2beb, 0x117b, 0x2bf4, - 0x1183, 0x2bfd, 0x118c, 0x2c06, 0x1195, 0x2c0f, 0x119d, 0x2c18, - 0x11a6, 0x2c21, 0x11af, 0x2c2b, 0x11b7, 0x2c34, 0x11c0, 0x2c3d, - 0x11c9, 0x2c46, 0x11d1, 0x2c4f, 0x11da, 0x2c58, 0x11e3, 0x2c61, - 0x11eb, 0x2c6a, 0x11f4, 0x2c73, 0x11fd, 0x2c7c, 0x1206, 0x2c85, - 0x120e, 0x2c8e, 0x1217, 0x2c97, 0x1220, 0x2ca0, 0x1229, 0x2ca9, - 0x1231, 0x2cb2, 0x123a, 0x2cbb, 0x1243, 0x2cc4, 0x124c, 0x2ccd, - 0x1255, 0x2cd6, 0x125d, 0x2cdf, 0x1266, 0x2ce8, 0x126f, 0x2cf1, - 0x1278, 0x2cfa, 0x1281, 0x2d03, 0x128a, 0x2d0c, 0x1292, 0x2d15, - 0x129b, 0x2d1e, 0x12a4, 0x2d27, 0x12ad, 0x2d2f, 0x12b6, 0x2d38, - 0x12bf, 0x2d41, 0x12c8, 0x2d4a, 0x12d1, 0x2d53, 0x12d9, 0x2d5c, - 0x12e2, 0x2d65, 0x12eb, 0x2d6e, 0x12f4, 0x2d76, 0x12fd, 0x2d7f, - 0x1306, 0x2d88, 0x130f, 0x2d91, 0x1318, 0x2d9a, 0x1321, 0x2da3, - 0x132a, 0x2dab, 0x1333, 0x2db4, 0x133c, 0x2dbd, 0x1345, 0x2dc6, - 0x134e, 0x2dcf, 0x1357, 0x2dd7, 0x1360, 0x2de0, 0x1369, 0x2de9, - 0x1372, 0x2df2, 0x137b, 0x2dfa, 0x1384, 0x2e03, 0x138d, 0x2e0c, - 0x1396, 0x2e15, 0x139f, 0x2e1d, 0x13a8, 0x2e26, 0x13b1, 0x2e2f, - 0x13ba, 0x2e37, 0x13c3, 0x2e40, 0x13cc, 0x2e49, 0x13d5, 0x2e51, - 0x13df, 0x2e5a, 0x13e8, 0x2e63, 0x13f1, 0x2e6b, 0x13fa, 0x2e74, - 0x1403, 0x2e7d, 0x140c, 0x2e85, 0x1415, 0x2e8e, 0x141e, 0x2e97, - 0x1428, 0x2e9f, 0x1431, 0x2ea8, 0x143a, 0x2eb0, 0x1443, 0x2eb9, - 0x144c, 0x2ec2, 0x1455, 0x2eca, 0x145f, 0x2ed3, 0x1468, 0x2edb, - 0x1471, 0x2ee4, 0x147a, 0x2eec, 0x1483, 0x2ef5, 0x148d, 0x2efd, - 0x1496, 0x2f06, 0x149f, 0x2f0e, 0x14a8, 0x2f17, 0x14b2, 0x2f20, - 0x14bb, 0x2f28, 0x14c4, 0x2f30, 0x14cd, 0x2f39, 0x14d7, 0x2f41, - 0x14e0, 0x2f4a, 0x14e9, 0x2f52, 0x14f3, 0x2f5b, 0x14fc, 0x2f63, - 0x1505, 0x2f6c, 0x150e, 0x2f74, 0x1518, 0x2f7d, 0x1521, 0x2f85, - 0x152a, 0x2f8d, 0x1534, 0x2f96, 0x153d, 0x2f9e, 0x1547, 0x2fa7, - 0x1550, 0x2faf, 0x1559, 0x2fb7, 0x1563, 0x2fc0, 0x156c, 0x2fc8, - 0x1575, 0x2fd0, 0x157f, 0x2fd9, 0x1588, 0x2fe1, 0x1592, 0x2fea, - 0x159b, 0x2ff2, 0x15a4, 0x2ffa, 0x15ae, 0x3002, 0x15b7, 0x300b, - 0x15c1, 0x3013, 0x15ca, 0x301b, 0x15d4, 0x3024, 0x15dd, 0x302c, - 0x15e6, 0x3034, 0x15f0, 0x303c, 0x15f9, 0x3045, 0x1603, 0x304d, - 0x160c, 0x3055, 0x1616, 0x305d, 0x161f, 0x3066, 0x1629, 0x306e, - 0x1632, 0x3076, 0x163c, 0x307e, 0x1645, 0x3087, 0x164f, 0x308f, - 0x1659, 0x3097, 0x1662, 0x309f, 0x166c, 0x30a7, 0x1675, 0x30af, - 0x167f, 0x30b8, 0x1688, 0x30c0, 0x1692, 0x30c8, 0x169b, 0x30d0, - 0x16a5, 0x30d8, 0x16af, 0x30e0, 0x16b8, 0x30e8, 0x16c2, 0x30f0, - 0x16cb, 0x30f9, 0x16d5, 0x3101, 0x16df, 0x3109, 0x16e8, 0x3111, - 0x16f2, 0x3119, 0x16fc, 0x3121, 0x1705, 0x3129, 0x170f, 0x3131, - 0x1719, 0x3139, 0x1722, 0x3141, 0x172c, 0x3149, 0x1736, 0x3151, - 0x173f, 0x3159, 0x1749, 0x3161, 0x1753, 0x3169, 0x175c, 0x3171, - 0x1766, 0x3179, 0x1770, 0x3181, 0x177a, 0x3189, 0x1783, 0x3191, - 0x178d, 0x3199, 0x1797, 0x31a1, 0x17a0, 0x31a9, 0x17aa, 0x31b1, - 0x17b4, 0x31b9, 0x17be, 0x31c0, 0x17c8, 0x31c8, 0x17d1, 0x31d0, - 0x17db, 0x31d8, 0x17e5, 0x31e0, 0x17ef, 0x31e8, 0x17f8, 0x31f0, - 0x1802, 0x31f8, 0x180c, 0x31ff, 0x1816, 0x3207, 0x1820, 0x320f, - 0x182a, 0x3217, 0x1833, 0x321f, 0x183d, 0x3227, 0x1847, 0x322e, - 0x1851, 0x3236, 0x185b, 0x323e, 0x1865, 0x3246, 0x186f, 0x324e, - 0x1878, 0x3255, 0x1882, 0x325d, 0x188c, 0x3265, 0x1896, 0x326d, - 0x18a0, 0x3274, 0x18aa, 0x327c, 0x18b4, 0x3284, 0x18be, 0x328b, - 0x18c8, 0x3293, 0x18d2, 0x329b, 0x18dc, 0x32a3, 0x18e6, 0x32aa, - 0x18ef, 0x32b2, 0x18f9, 0x32ba, 0x1903, 0x32c1, 0x190d, 0x32c9, - 0x1917, 0x32d0, 0x1921, 0x32d8, 0x192b, 0x32e0, 0x1935, 0x32e7, - 0x193f, 0x32ef, 0x1949, 0x32f7, 0x1953, 0x32fe, 0x195d, 0x3306, - 0x1967, 0x330d, 0x1971, 0x3315, 0x197b, 0x331d, 0x1985, 0x3324, - 0x198f, 0x332c, 0x199a, 0x3333, 0x19a4, 0x333b, 0x19ae, 0x3342, - 0x19b8, 0x334a, 0x19c2, 0x3351, 0x19cc, 0x3359, 0x19d6, 0x3360, - 0x19e0, 0x3368, 0x19ea, 0x336f, 0x19f4, 0x3377, 0x19fe, 0x337e, - 0x1a08, 0x3386, 0x1a13, 0x338d, 0x1a1d, 0x3395, 0x1a27, 0x339c, - 0x1a31, 0x33a3, 0x1a3b, 0x33ab, 0x1a45, 0x33b2, 0x1a4f, 0x33ba, - 0x1a5a, 0x33c1, 0x1a64, 0x33c8, 0x1a6e, 0x33d0, 0x1a78, 0x33d7, - 0x1a82, 0x33df, 0x1a8c, 0x33e6, 0x1a97, 0x33ed, 0x1aa1, 0x33f5, - 0x1aab, 0x33fc, 0x1ab5, 0x3403, 0x1abf, 0x340b, 0x1aca, 0x3412, - 0x1ad4, 0x3419, 0x1ade, 0x3420, 0x1ae8, 0x3428, 0x1af3, 0x342f, - 0x1afd, 0x3436, 0x1b07, 0x343e, 0x1b11, 0x3445, 0x1b1c, 0x344c, - 0x1b26, 0x3453, 0x1b30, 0x345b, 0x1b3b, 0x3462, 0x1b45, 0x3469, - 0x1b4f, 0x3470, 0x1b59, 0x3477, 0x1b64, 0x347f, 0x1b6e, 0x3486, - 0x1b78, 0x348d, 0x1b83, 0x3494, 0x1b8d, 0x349b, 0x1b97, 0x34a2, - 0x1ba2, 0x34aa, 0x1bac, 0x34b1, 0x1bb6, 0x34b8, 0x1bc1, 0x34bf, - 0x1bcb, 0x34c6, 0x1bd5, 0x34cd, 0x1be0, 0x34d4, 0x1bea, 0x34db, - 0x1bf5, 0x34e2, 0x1bff, 0x34ea, 0x1c09, 0x34f1, 0x1c14, 0x34f8, - 0x1c1e, 0x34ff, 0x1c29, 0x3506, 0x1c33, 0x350d, 0x1c3d, 0x3514, - 0x1c48, 0x351b, 0x1c52, 0x3522, 0x1c5d, 0x3529, 0x1c67, 0x3530, - 0x1c72, 0x3537, 0x1c7c, 0x353e, 0x1c86, 0x3545, 0x1c91, 0x354c, - 0x1c9b, 0x3553, 0x1ca6, 0x355a, 0x1cb0, 0x3561, 0x1cbb, 0x3567, - 0x1cc5, 0x356e, 0x1cd0, 0x3575, 0x1cda, 0x357c, 0x1ce5, 0x3583, - 0x1cef, 0x358a, 0x1cfa, 0x3591, 0x1d04, 0x3598, 0x1d0f, 0x359f, - 0x1d19, 0x35a5, 0x1d24, 0x35ac, 0x1d2e, 0x35b3, 0x1d39, 0x35ba, - 0x1d44, 0x35c1, 0x1d4e, 0x35c8, 0x1d59, 0x35ce, 0x1d63, 0x35d5, - 0x1d6e, 0x35dc, 0x1d78, 0x35e3, 0x1d83, 0x35ea, 0x1d8e, 0x35f0, - 0x1d98, 0x35f7, 0x1da3, 0x35fe, 0x1dad, 0x3605, 0x1db8, 0x360b, - 0x1dc3, 0x3612, 0x1dcd, 0x3619, 0x1dd8, 0x3620, 0x1de2, 0x3626, - 0x1ded, 0x362d, 0x1df8, 0x3634, 0x1e02, 0x363a, 0x1e0d, 0x3641, - 0x1e18, 0x3648, 0x1e22, 0x364e, 0x1e2d, 0x3655, 0x1e38, 0x365c, - 0x1e42, 0x3662, 0x1e4d, 0x3669, 0x1e58, 0x366f, 0x1e62, 0x3676, - 0x1e6d, 0x367d, 0x1e78, 0x3683, 0x1e83, 0x368a, 0x1e8d, 0x3690, - 0x1e98, 0x3697, 0x1ea3, 0x369d, 0x1ead, 0x36a4, 0x1eb8, 0x36ab, - 0x1ec3, 0x36b1, 0x1ece, 0x36b8, 0x1ed8, 0x36be, 0x1ee3, 0x36c5, - 0x1eee, 0x36cb, 0x1ef9, 0x36d2, 0x1f03, 0x36d8, 0x1f0e, 0x36df, - 0x1f19, 0x36e5, 0x1f24, 0x36eb, 0x1f2f, 0x36f2, 0x1f39, 0x36f8, - 0x1f44, 0x36ff, 0x1f4f, 0x3705, 0x1f5a, 0x370c, 0x1f65, 0x3712, - 0x1f6f, 0x3718, 0x1f7a, 0x371f, 0x1f85, 0x3725, 0x1f90, 0x372c, - 0x1f9b, 0x3732, 0x1fa5, 0x3738, 0x1fb0, 0x373f, 0x1fbb, 0x3745, - 0x1fc6, 0x374b, 0x1fd1, 0x3752, 0x1fdc, 0x3758, 0x1fe7, 0x375e, - 0x1ff1, 0x3765, 0x1ffc, 0x376b, 0x2007, 0x3771, 0x2012, 0x3777, - 0x201d, 0x377e, 0x2028, 0x3784, 0x2033, 0x378a, 0x203e, 0x3790, - 0x2049, 0x3797, 0x2054, 0x379d, 0x205e, 0x37a3, 0x2069, 0x37a9, - 0x2074, 0x37b0, 0x207f, 0x37b6, 0x208a, 0x37bc, 0x2095, 0x37c2, - 0x20a0, 0x37c8, 0x20ab, 0x37ce, 0x20b6, 0x37d5, 0x20c1, 0x37db, - 0x20cc, 0x37e1, 0x20d7, 0x37e7, 0x20e2, 0x37ed, 0x20ed, 0x37f3, - 0x20f8, 0x37f9, 0x2103, 0x37ff, 0x210e, 0x3805, 0x2119, 0x380b, - 0x2124, 0x3812, 0x212f, 0x3818, 0x213a, 0x381e, 0x2145, 0x3824, - 0x2150, 0x382a, 0x215b, 0x3830, 0x2166, 0x3836, 0x2171, 0x383c, - 0x217c, 0x3842, 0x2187, 0x3848, 0x2192, 0x384e, 0x219d, 0x3854, - 0x21a8, 0x385a, 0x21b3, 0x3860, 0x21be, 0x3866, 0x21ca, 0x386b, - 0x21d5, 0x3871, 0x21e0, 0x3877, 0x21eb, 0x387d, 0x21f6, 0x3883, - 0x2201, 0x3889, 0x220c, 0x388f, 0x2217, 0x3895, 0x2222, 0x389b, - 0x222d, 0x38a1, 0x2239, 0x38a6, 0x2244, 0x38ac, 0x224f, 0x38b2, - 0x225a, 0x38b8, 0x2265, 0x38be, 0x2270, 0x38c3, 0x227b, 0x38c9, - 0x2287, 0x38cf, 0x2292, 0x38d5, 0x229d, 0x38db, 0x22a8, 0x38e0, - 0x22b3, 0x38e6, 0x22be, 0x38ec, 0x22ca, 0x38f2, 0x22d5, 0x38f7, - 0x22e0, 0x38fd, 0x22eb, 0x3903, 0x22f6, 0x3909, 0x2301, 0x390e, - 0x230d, 0x3914, 0x2318, 0x391a, 0x2323, 0x391f, 0x232e, 0x3925, - 0x233a, 0x392b, 0x2345, 0x3930, 0x2350, 0x3936, 0x235b, 0x393b, - 0x2367, 0x3941, 0x2372, 0x3947, 0x237d, 0x394c, 0x2388, 0x3952, - 0x2394, 0x3958, 0x239f, 0x395d, 0x23aa, 0x3963, 0x23b5, 0x3968, - 0x23c1, 0x396e, 0x23cc, 0x3973, 0x23d7, 0x3979, 0x23e2, 0x397e, - 0x23ee, 0x3984, 0x23f9, 0x3989, 0x2404, 0x398f, 0x2410, 0x3994, - 0x241b, 0x399a, 0x2426, 0x399f, 0x2432, 0x39a5, 0x243d, 0x39aa, - 0x2448, 0x39b0, 0x2454, 0x39b5, 0x245f, 0x39bb, 0x246a, 0x39c0, - 0x2476, 0x39c5, 0x2481, 0x39cb, 0x248c, 0x39d0, 0x2498, 0x39d6, - 0x24a3, 0x39db, 0x24ae, 0x39e0, 0x24ba, 0x39e6, 0x24c5, 0x39eb, - 0x24d0, 0x39f0, 0x24dc, 0x39f6, 0x24e7, 0x39fb, 0x24f3, 0x3a00, - 0x24fe, 0x3a06, 0x2509, 0x3a0b, 0x2515, 0x3a10, 0x2520, 0x3a16, - 0x252c, 0x3a1b, 0x2537, 0x3a20, 0x2542, 0x3a25, 0x254e, 0x3a2b, - 0x2559, 0x3a30, 0x2565, 0x3a35, 0x2570, 0x3a3a, 0x257c, 0x3a3f, - 0x2587, 0x3a45, 0x2592, 0x3a4a, 0x259e, 0x3a4f, 0x25a9, 0x3a54, - 0x25b5, 0x3a59, 0x25c0, 0x3a5f, 0x25cc, 0x3a64, 0x25d7, 0x3a69, - 0x25e3, 0x3a6e, 0x25ee, 0x3a73, 0x25fa, 0x3a78, 0x2605, 0x3a7d, - 0x2611, 0x3a82, 0x261c, 0x3a88, 0x2628, 0x3a8d, 0x2633, 0x3a92, - 0x263f, 0x3a97, 0x264a, 0x3a9c, 0x2656, 0x3aa1, 0x2661, 0x3aa6, - 0x266d, 0x3aab, 0x2678, 0x3ab0, 0x2684, 0x3ab5, 0x268f, 0x3aba, - 0x269b, 0x3abf, 0x26a6, 0x3ac4, 0x26b2, 0x3ac9, 0x26bd, 0x3ace, - 0x26c9, 0x3ad3, 0x26d4, 0x3ad8, 0x26e0, 0x3add, 0x26ec, 0x3ae2, - 0x26f7, 0x3ae6, 0x2703, 0x3aeb, 0x270e, 0x3af0, 0x271a, 0x3af5, - 0x2725, 0x3afa, 0x2731, 0x3aff, 0x273d, 0x3b04, 0x2748, 0x3b09, - 0x2754, 0x3b0e, 0x275f, 0x3b12, 0x276b, 0x3b17, 0x2777, 0x3b1c, - 0x2782, 0x3b21, 0x278e, 0x3b26, 0x2799, 0x3b2a, 0x27a5, 0x3b2f, - 0x27b1, 0x3b34, 0x27bc, 0x3b39, 0x27c8, 0x3b3e, 0x27d3, 0x3b42, - 0x27df, 0x3b47, 0x27eb, 0x3b4c, 0x27f6, 0x3b50, 0x2802, 0x3b55, - 0x280e, 0x3b5a, 0x2819, 0x3b5f, 0x2825, 0x3b63, 0x2831, 0x3b68, - 0x283c, 0x3b6d, 0x2848, 0x3b71, 0x2854, 0x3b76, 0x285f, 0x3b7b, - 0x286b, 0x3b7f, 0x2877, 0x3b84, 0x2882, 0x3b88, 0x288e, 0x3b8d, - 0x289a, 0x3b92, 0x28a5, 0x3b96, 0x28b1, 0x3b9b, 0x28bd, 0x3b9f, - 0x28c9, 0x3ba4, 0x28d4, 0x3ba9, 0x28e0, 0x3bad, 0x28ec, 0x3bb2, - 0x28f7, 0x3bb6, 0x2903, 0x3bbb, 0x290f, 0x3bbf, 0x291b, 0x3bc4, - 0x2926, 0x3bc8, 0x2932, 0x3bcd, 0x293e, 0x3bd1, 0x294a, 0x3bd6, - 0x2955, 0x3bda, 0x2961, 0x3bde, 0x296d, 0x3be3, 0x2979, 0x3be7, - 0x2984, 0x3bec, 0x2990, 0x3bf0, 0x299c, 0x3bf5, 0x29a8, 0x3bf9, - 0x29b4, 0x3bfd, 0x29bf, 0x3c02, 0x29cb, 0x3c06, 0x29d7, 0x3c0a, - 0x29e3, 0x3c0f, 0x29ee, 0x3c13, 0x29fa, 0x3c17, 0x2a06, 0x3c1c, - 0x2a12, 0x3c20, 0x2a1e, 0x3c24, 0x2a29, 0x3c29, 0x2a35, 0x3c2d, - 0x2a41, 0x3c31, 0x2a4d, 0x3c36, 0x2a59, 0x3c3a, 0x2a65, 0x3c3e, - 0x2a70, 0x3c42, 0x2a7c, 0x3c46, 0x2a88, 0x3c4b, 0x2a94, 0x3c4f, - 0x2aa0, 0x3c53, 0x2aac, 0x3c57, 0x2ab7, 0x3c5b, 0x2ac3, 0x3c60, - 0x2acf, 0x3c64, 0x2adb, 0x3c68, 0x2ae7, 0x3c6c, 0x2af3, 0x3c70, - 0x2aff, 0x3c74, 0x2b0a, 0x3c79, 0x2b16, 0x3c7d, 0x2b22, 0x3c81, - 0x2b2e, 0x3c85, 0x2b3a, 0x3c89, 0x2b46, 0x3c8d, 0x2b52, 0x3c91, - 0x2b5e, 0x3c95, 0x2b6a, 0x3c99, 0x2b75, 0x3c9d, 0x2b81, 0x3ca1, - 0x2b8d, 0x3ca5, 0x2b99, 0x3ca9, 0x2ba5, 0x3cad, 0x2bb1, 0x3cb1, - 0x2bbd, 0x3cb5, 0x2bc9, 0x3cb9, 0x2bd5, 0x3cbd, 0x2be1, 0x3cc1, - 0x2bed, 0x3cc5, 0x2bf9, 0x3cc9, 0x2c05, 0x3ccd, 0x2c10, 0x3cd1, - 0x2c1c, 0x3cd5, 0x2c28, 0x3cd9, 0x2c34, 0x3cdd, 0x2c40, 0x3ce0, - 0x2c4c, 0x3ce4, 0x2c58, 0x3ce8, 0x2c64, 0x3cec, 0x2c70, 0x3cf0, - 0x2c7c, 0x3cf4, 0x2c88, 0x3cf8, 0x2c94, 0x3cfb, 0x2ca0, 0x3cff, - 0x2cac, 0x3d03, 0x2cb8, 0x3d07, 0x2cc4, 0x3d0b, 0x2cd0, 0x3d0e, - 0x2cdc, 0x3d12, 0x2ce8, 0x3d16, 0x2cf4, 0x3d1a, 0x2d00, 0x3d1d, - 0x2d0c, 0x3d21, 0x2d18, 0x3d25, 0x2d24, 0x3d28, 0x2d30, 0x3d2c, - 0x2d3c, 0x3d30, 0x2d48, 0x3d34, 0x2d54, 0x3d37, 0x2d60, 0x3d3b, - 0x2d6c, 0x3d3f, 0x2d78, 0x3d42, 0x2d84, 0x3d46, 0x2d90, 0x3d49, - 0x2d9c, 0x3d4d, 0x2da8, 0x3d51, 0x2db4, 0x3d54, 0x2dc0, 0x3d58, - 0x2dcc, 0x3d5b, 0x2dd8, 0x3d5f, 0x2de4, 0x3d63, 0x2df0, 0x3d66, - 0x2dfc, 0x3d6a, 0x2e09, 0x3d6d, 0x2e15, 0x3d71, 0x2e21, 0x3d74, - 0x2e2d, 0x3d78, 0x2e39, 0x3d7b, 0x2e45, 0x3d7f, 0x2e51, 0x3d82, - 0x2e5d, 0x3d86, 0x2e69, 0x3d89, 0x2e75, 0x3d8d, 0x2e81, 0x3d90, - 0x2e8d, 0x3d93, 0x2e99, 0x3d97, 0x2ea6, 0x3d9a, 0x2eb2, 0x3d9e, - 0x2ebe, 0x3da1, 0x2eca, 0x3da4, 0x2ed6, 0x3da8, 0x2ee2, 0x3dab, - 0x2eee, 0x3daf, 0x2efa, 0x3db2, 0x2f06, 0x3db5, 0x2f13, 0x3db9, - 0x2f1f, 0x3dbc, 0x2f2b, 0x3dbf, 0x2f37, 0x3dc2, 0x2f43, 0x3dc6, - 0x2f4f, 0x3dc9, 0x2f5b, 0x3dcc, 0x2f67, 0x3dd0, 0x2f74, 0x3dd3, - 0x2f80, 0x3dd6, 0x2f8c, 0x3dd9, 0x2f98, 0x3ddd, 0x2fa4, 0x3de0, - 0x2fb0, 0x3de3, 0x2fbc, 0x3de6, 0x2fc9, 0x3de9, 0x2fd5, 0x3ded, - 0x2fe1, 0x3df0, 0x2fed, 0x3df3, 0x2ff9, 0x3df6, 0x3005, 0x3df9, - 0x3012, 0x3dfc, 0x301e, 0x3dff, 0x302a, 0x3e03, 0x3036, 0x3e06, - 0x3042, 0x3e09, 0x304e, 0x3e0c, 0x305b, 0x3e0f, 0x3067, 0x3e12, - 0x3073, 0x3e15, 0x307f, 0x3e18, 0x308b, 0x3e1b, 0x3098, 0x3e1e, - 0x30a4, 0x3e21, 0x30b0, 0x3e24, 0x30bc, 0x3e27, 0x30c8, 0x3e2a, - 0x30d5, 0x3e2d, 0x30e1, 0x3e30, 0x30ed, 0x3e33, 0x30f9, 0x3e36, - 0x3105, 0x3e39, 0x3112, 0x3e3c, 0x311e, 0x3e3f, 0x312a, 0x3e42, - 0x3136, 0x3e45, 0x3143, 0x3e48, 0x314f, 0x3e4a, 0x315b, 0x3e4d, - 0x3167, 0x3e50, 0x3174, 0x3e53, 0x3180, 0x3e56, 0x318c, 0x3e59, - 0x3198, 0x3e5c, 0x31a4, 0x3e5e, 0x31b1, 0x3e61, 0x31bd, 0x3e64, - 0x31c9, 0x3e67, 0x31d5, 0x3e6a, 0x31e2, 0x3e6c, 0x31ee, 0x3e6f, - 0x31fa, 0x3e72, 0x3207, 0x3e75, 0x3213, 0x3e77, 0x321f, 0x3e7a, - 0x322b, 0x3e7d, 0x3238, 0x3e80, 0x3244, 0x3e82, 0x3250, 0x3e85, - 0x325c, 0x3e88, 0x3269, 0x3e8a, 0x3275, 0x3e8d, 0x3281, 0x3e90, - 0x328e, 0x3e92, 0x329a, 0x3e95, 0x32a6, 0x3e98, 0x32b2, 0x3e9a, - 0x32bf, 0x3e9d, 0x32cb, 0x3e9f, 0x32d7, 0x3ea2, 0x32e4, 0x3ea5, - 0x32f0, 0x3ea7, 0x32fc, 0x3eaa, 0x3308, 0x3eac, 0x3315, 0x3eaf, - 0x3321, 0x3eb1, 0x332d, 0x3eb4, 0x333a, 0x3eb6, 0x3346, 0x3eb9, - 0x3352, 0x3ebb, 0x335f, 0x3ebe, 0x336b, 0x3ec0, 0x3377, 0x3ec3, - 0x3384, 0x3ec5, 0x3390, 0x3ec8, 0x339c, 0x3eca, 0x33a9, 0x3ecc, - 0x33b5, 0x3ecf, 0x33c1, 0x3ed1, 0x33ce, 0x3ed4, 0x33da, 0x3ed6, - 0x33e6, 0x3ed8, 0x33f3, 0x3edb, 0x33ff, 0x3edd, 0x340b, 0x3ee0, - 0x3418, 0x3ee2, 0x3424, 0x3ee4, 0x3430, 0x3ee7, 0x343d, 0x3ee9, - 0x3449, 0x3eeb, 0x3455, 0x3eed, 0x3462, 0x3ef0, 0x346e, 0x3ef2, - 0x347b, 0x3ef4, 0x3487, 0x3ef7, 0x3493, 0x3ef9, 0x34a0, 0x3efb, - 0x34ac, 0x3efd, 0x34b8, 0x3f00, 0x34c5, 0x3f02, 0x34d1, 0x3f04, - 0x34dd, 0x3f06, 0x34ea, 0x3f08, 0x34f6, 0x3f0a, 0x3503, 0x3f0d, - 0x350f, 0x3f0f, 0x351b, 0x3f11, 0x3528, 0x3f13, 0x3534, 0x3f15, - 0x3540, 0x3f17, 0x354d, 0x3f19, 0x3559, 0x3f1c, 0x3566, 0x3f1e, - 0x3572, 0x3f20, 0x357e, 0x3f22, 0x358b, 0x3f24, 0x3597, 0x3f26, - 0x35a4, 0x3f28, 0x35b0, 0x3f2a, 0x35bc, 0x3f2c, 0x35c9, 0x3f2e, - 0x35d5, 0x3f30, 0x35e2, 0x3f32, 0x35ee, 0x3f34, 0x35fa, 0x3f36, - 0x3607, 0x3f38, 0x3613, 0x3f3a, 0x3620, 0x3f3c, 0x362c, 0x3f3e, - 0x3639, 0x3f40, 0x3645, 0x3f42, 0x3651, 0x3f43, 0x365e, 0x3f45, - 0x366a, 0x3f47, 0x3677, 0x3f49, 0x3683, 0x3f4b, 0x3690, 0x3f4d, - 0x369c, 0x3f4f, 0x36a8, 0x3f51, 0x36b5, 0x3f52, 0x36c1, 0x3f54, - 0x36ce, 0x3f56, 0x36da, 0x3f58, 0x36e7, 0x3f5a, 0x36f3, 0x3f5b, - 0x36ff, 0x3f5d, 0x370c, 0x3f5f, 0x3718, 0x3f61, 0x3725, 0x3f62, - 0x3731, 0x3f64, 0x373e, 0x3f66, 0x374a, 0x3f68, 0x3757, 0x3f69, - 0x3763, 0x3f6b, 0x376f, 0x3f6d, 0x377c, 0x3f6e, 0x3788, 0x3f70, - 0x3795, 0x3f72, 0x37a1, 0x3f73, 0x37ae, 0x3f75, 0x37ba, 0x3f77, - 0x37c7, 0x3f78, 0x37d3, 0x3f7a, 0x37e0, 0x3f7b, 0x37ec, 0x3f7d, - 0x37f9, 0x3f7f, 0x3805, 0x3f80, 0x3811, 0x3f82, 0x381e, 0x3f83, - 0x382a, 0x3f85, 0x3837, 0x3f86, 0x3843, 0x3f88, 0x3850, 0x3f89, - 0x385c, 0x3f8b, 0x3869, 0x3f8c, 0x3875, 0x3f8e, 0x3882, 0x3f8f, - 0x388e, 0x3f91, 0x389b, 0x3f92, 0x38a7, 0x3f94, 0x38b4, 0x3f95, - 0x38c0, 0x3f97, 0x38cd, 0x3f98, 0x38d9, 0x3f99, 0x38e6, 0x3f9b, - 0x38f2, 0x3f9c, 0x38ff, 0x3f9e, 0x390b, 0x3f9f, 0x3918, 0x3fa0, - 0x3924, 0x3fa2, 0x3931, 0x3fa3, 0x393d, 0x3fa4, 0x394a, 0x3fa6, - 0x3956, 0x3fa7, 0x3963, 0x3fa8, 0x396f, 0x3faa, 0x397c, 0x3fab, - 0x3988, 0x3fac, 0x3995, 0x3fad, 0x39a1, 0x3faf, 0x39ae, 0x3fb0, - 0x39ba, 0x3fb1, 0x39c7, 0x3fb2, 0x39d3, 0x3fb4, 0x39e0, 0x3fb5, - 0x39ec, 0x3fb6, 0x39f9, 0x3fb7, 0x3a05, 0x3fb8, 0x3a12, 0x3fb9, - 0x3a1e, 0x3fbb, 0x3a2b, 0x3fbc, 0x3a37, 0x3fbd, 0x3a44, 0x3fbe, - 0x3a50, 0x3fbf, 0x3a5d, 0x3fc0, 0x3a69, 0x3fc1, 0x3a76, 0x3fc3, - 0x3a82, 0x3fc4, 0x3a8f, 0x3fc5, 0x3a9b, 0x3fc6, 0x3aa8, 0x3fc7, - 0x3ab4, 0x3fc8, 0x3ac1, 0x3fc9, 0x3acd, 0x3fca, 0x3ada, 0x3fcb, - 0x3ae6, 0x3fcc, 0x3af3, 0x3fcd, 0x3b00, 0x3fce, 0x3b0c, 0x3fcf, - 0x3b19, 0x3fd0, 0x3b25, 0x3fd1, 0x3b32, 0x3fd2, 0x3b3e, 0x3fd3, - 0x3b4b, 0x3fd4, 0x3b57, 0x3fd5, 0x3b64, 0x3fd5, 0x3b70, 0x3fd6, - 0x3b7d, 0x3fd7, 0x3b89, 0x3fd8, 0x3b96, 0x3fd9, 0x3ba2, 0x3fda, - 0x3baf, 0x3fdb, 0x3bbc, 0x3fdc, 0x3bc8, 0x3fdc, 0x3bd5, 0x3fdd, - 0x3be1, 0x3fde, 0x3bee, 0x3fdf, 0x3bfa, 0x3fe0, 0x3c07, 0x3fe0, - 0x3c13, 0x3fe1, 0x3c20, 0x3fe2, 0x3c2c, 0x3fe3, 0x3c39, 0x3fe3, - 0x3c45, 0x3fe4, 0x3c52, 0x3fe5, 0x3c5f, 0x3fe6, 0x3c6b, 0x3fe6, - 0x3c78, 0x3fe7, 0x3c84, 0x3fe8, 0x3c91, 0x3fe8, 0x3c9d, 0x3fe9, - 0x3caa, 0x3fea, 0x3cb6, 0x3fea, 0x3cc3, 0x3feb, 0x3cd0, 0x3fec, - 0x3cdc, 0x3fec, 0x3ce9, 0x3fed, 0x3cf5, 0x3fed, 0x3d02, 0x3fee, - 0x3d0e, 0x3fef, 0x3d1b, 0x3fef, 0x3d27, 0x3ff0, 0x3d34, 0x3ff0, - 0x3d40, 0x3ff1, 0x3d4d, 0x3ff1, 0x3d5a, 0x3ff2, 0x3d66, 0x3ff2, - 0x3d73, 0x3ff3, 0x3d7f, 0x3ff3, 0x3d8c, 0x3ff4, 0x3d98, 0x3ff4, - 0x3da5, 0x3ff5, 0x3db2, 0x3ff5, 0x3dbe, 0x3ff6, 0x3dcb, 0x3ff6, - 0x3dd7, 0x3ff7, 0x3de4, 0x3ff7, 0x3df0, 0x3ff7, 0x3dfd, 0x3ff8, - 0x3e09, 0x3ff8, 0x3e16, 0x3ff9, 0x3e23, 0x3ff9, 0x3e2f, 0x3ff9, - 0x3e3c, 0x3ffa, 0x3e48, 0x3ffa, 0x3e55, 0x3ffa, 0x3e61, 0x3ffb, - 0x3e6e, 0x3ffb, 0x3e7a, 0x3ffb, 0x3e87, 0x3ffc, 0x3e94, 0x3ffc, - 0x3ea0, 0x3ffc, 0x3ead, 0x3ffc, 0x3eb9, 0x3ffd, 0x3ec6, 0x3ffd, - 0x3ed2, 0x3ffd, 0x3edf, 0x3ffd, 0x3eec, 0x3ffe, 0x3ef8, 0x3ffe, - 0x3f05, 0x3ffe, 0x3f11, 0x3ffe, 0x3f1e, 0x3ffe, 0x3f2a, 0x3fff, - 0x3f37, 0x3fff, 0x3f44, 0x3fff, 0x3f50, 0x3fff, 0x3f5d, 0x3fff, - 0x3f69, 0x3fff, 0x3f76, 0x3fff, 0x3f82, 0x4000, 0x3f8f, 0x4000, - 0x3f9b, 0x4000, 0x3fa8, 0x4000, 0x3fb5, 0x4000, 0x3fc1, 0x4000, - 0x3fce, 0x4000, 0x3fda, 0x4000, 0x3fe7, 0x4000, 0x3ff3, 0x4000, -}; - -/** -* \par -* Generation of real_CoefB array: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-*  {    
-*    pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-*  } 
-* \par -* Convert to fixed point Q15 format -* round(pBTable[i] * pow(2, 15)) -* -*/ -static const q15_t ALIGN4 realCoefBQ15[8192] = { - 0x4000, 0x4000, 0x400d, 0x4000, 0x4019, 0x4000, 0x4026, 0x4000, - 0x4032, 0x4000, 0x403f, 0x4000, 0x404b, 0x4000, 0x4058, 0x4000, - 0x4065, 0x4000, 0x4071, 0x4000, 0x407e, 0x4000, 0x408a, 0x3fff, - 0x4097, 0x3fff, 0x40a3, 0x3fff, 0x40b0, 0x3fff, 0x40bc, 0x3fff, - 0x40c9, 0x3fff, 0x40d6, 0x3fff, 0x40e2, 0x3ffe, 0x40ef, 0x3ffe, - 0x40fb, 0x3ffe, 0x4108, 0x3ffe, 0x4114, 0x3ffe, 0x4121, 0x3ffd, - 0x412e, 0x3ffd, 0x413a, 0x3ffd, 0x4147, 0x3ffd, 0x4153, 0x3ffc, - 0x4160, 0x3ffc, 0x416c, 0x3ffc, 0x4179, 0x3ffc, 0x4186, 0x3ffb, - 0x4192, 0x3ffb, 0x419f, 0x3ffb, 0x41ab, 0x3ffa, 0x41b8, 0x3ffa, - 0x41c4, 0x3ffa, 0x41d1, 0x3ff9, 0x41dd, 0x3ff9, 0x41ea, 0x3ff9, - 0x41f7, 0x3ff8, 0x4203, 0x3ff8, 0x4210, 0x3ff7, 0x421c, 0x3ff7, - 0x4229, 0x3ff7, 0x4235, 0x3ff6, 0x4242, 0x3ff6, 0x424e, 0x3ff5, - 0x425b, 0x3ff5, 0x4268, 0x3ff4, 0x4274, 0x3ff4, 0x4281, 0x3ff3, - 0x428d, 0x3ff3, 0x429a, 0x3ff2, 0x42a6, 0x3ff2, 0x42b3, 0x3ff1, - 0x42c0, 0x3ff1, 0x42cc, 0x3ff0, 0x42d9, 0x3ff0, 0x42e5, 0x3fef, - 0x42f2, 0x3fef, 0x42fe, 0x3fee, 0x430b, 0x3fed, 0x4317, 0x3fed, - 0x4324, 0x3fec, 0x4330, 0x3fec, 0x433d, 0x3feb, 0x434a, 0x3fea, - 0x4356, 0x3fea, 0x4363, 0x3fe9, 0x436f, 0x3fe8, 0x437c, 0x3fe8, - 0x4388, 0x3fe7, 0x4395, 0x3fe6, 0x43a1, 0x3fe6, 0x43ae, 0x3fe5, - 0x43bb, 0x3fe4, 0x43c7, 0x3fe3, 0x43d4, 0x3fe3, 0x43e0, 0x3fe2, - 0x43ed, 0x3fe1, 0x43f9, 0x3fe0, 0x4406, 0x3fe0, 0x4412, 0x3fdf, - 0x441f, 0x3fde, 0x442b, 0x3fdd, 0x4438, 0x3fdc, 0x4444, 0x3fdc, - 0x4451, 0x3fdb, 0x445e, 0x3fda, 0x446a, 0x3fd9, 0x4477, 0x3fd8, - 0x4483, 0x3fd7, 0x4490, 0x3fd6, 0x449c, 0x3fd5, 0x44a9, 0x3fd5, - 0x44b5, 0x3fd4, 0x44c2, 0x3fd3, 0x44ce, 0x3fd2, 0x44db, 0x3fd1, - 0x44e7, 0x3fd0, 0x44f4, 0x3fcf, 0x4500, 0x3fce, 0x450d, 0x3fcd, - 0x451a, 0x3fcc, 0x4526, 0x3fcb, 0x4533, 0x3fca, 0x453f, 0x3fc9, - 0x454c, 0x3fc8, 0x4558, 0x3fc7, 0x4565, 0x3fc6, 0x4571, 0x3fc5, - 0x457e, 0x3fc4, 0x458a, 0x3fc3, 0x4597, 0x3fc1, 0x45a3, 0x3fc0, - 0x45b0, 0x3fbf, 0x45bc, 0x3fbe, 0x45c9, 0x3fbd, 0x45d5, 0x3fbc, - 0x45e2, 0x3fbb, 0x45ee, 0x3fb9, 0x45fb, 0x3fb8, 0x4607, 0x3fb7, - 0x4614, 0x3fb6, 0x4620, 0x3fb5, 0x462d, 0x3fb4, 0x4639, 0x3fb2, - 0x4646, 0x3fb1, 0x4652, 0x3fb0, 0x465f, 0x3faf, 0x466b, 0x3fad, - 0x4678, 0x3fac, 0x4684, 0x3fab, 0x4691, 0x3faa, 0x469d, 0x3fa8, - 0x46aa, 0x3fa7, 0x46b6, 0x3fa6, 0x46c3, 0x3fa4, 0x46cf, 0x3fa3, - 0x46dc, 0x3fa2, 0x46e8, 0x3fa0, 0x46f5, 0x3f9f, 0x4701, 0x3f9e, - 0x470e, 0x3f9c, 0x471a, 0x3f9b, 0x4727, 0x3f99, 0x4733, 0x3f98, - 0x4740, 0x3f97, 0x474c, 0x3f95, 0x4759, 0x3f94, 0x4765, 0x3f92, - 0x4772, 0x3f91, 0x477e, 0x3f8f, 0x478b, 0x3f8e, 0x4797, 0x3f8c, - 0x47a4, 0x3f8b, 0x47b0, 0x3f89, 0x47bd, 0x3f88, 0x47c9, 0x3f86, - 0x47d6, 0x3f85, 0x47e2, 0x3f83, 0x47ef, 0x3f82, 0x47fb, 0x3f80, - 0x4807, 0x3f7f, 0x4814, 0x3f7d, 0x4820, 0x3f7b, 0x482d, 0x3f7a, - 0x4839, 0x3f78, 0x4846, 0x3f77, 0x4852, 0x3f75, 0x485f, 0x3f73, - 0x486b, 0x3f72, 0x4878, 0x3f70, 0x4884, 0x3f6e, 0x4891, 0x3f6d, - 0x489d, 0x3f6b, 0x48a9, 0x3f69, 0x48b6, 0x3f68, 0x48c2, 0x3f66, - 0x48cf, 0x3f64, 0x48db, 0x3f62, 0x48e8, 0x3f61, 0x48f4, 0x3f5f, - 0x4901, 0x3f5d, 0x490d, 0x3f5b, 0x4919, 0x3f5a, 0x4926, 0x3f58, - 0x4932, 0x3f56, 0x493f, 0x3f54, 0x494b, 0x3f52, 0x4958, 0x3f51, - 0x4964, 0x3f4f, 0x4970, 0x3f4d, 0x497d, 0x3f4b, 0x4989, 0x3f49, - 0x4996, 0x3f47, 0x49a2, 0x3f45, 0x49af, 0x3f43, 0x49bb, 0x3f42, - 0x49c7, 0x3f40, 0x49d4, 0x3f3e, 0x49e0, 0x3f3c, 0x49ed, 0x3f3a, - 0x49f9, 0x3f38, 0x4a06, 0x3f36, 0x4a12, 0x3f34, 0x4a1e, 0x3f32, - 0x4a2b, 0x3f30, 0x4a37, 0x3f2e, 0x4a44, 0x3f2c, 0x4a50, 0x3f2a, - 0x4a5c, 0x3f28, 0x4a69, 0x3f26, 0x4a75, 0x3f24, 0x4a82, 0x3f22, - 0x4a8e, 0x3f20, 0x4a9a, 0x3f1e, 0x4aa7, 0x3f1c, 0x4ab3, 0x3f19, - 0x4ac0, 0x3f17, 0x4acc, 0x3f15, 0x4ad8, 0x3f13, 0x4ae5, 0x3f11, - 0x4af1, 0x3f0f, 0x4afd, 0x3f0d, 0x4b0a, 0x3f0a, 0x4b16, 0x3f08, - 0x4b23, 0x3f06, 0x4b2f, 0x3f04, 0x4b3b, 0x3f02, 0x4b48, 0x3f00, - 0x4b54, 0x3efd, 0x4b60, 0x3efb, 0x4b6d, 0x3ef9, 0x4b79, 0x3ef7, - 0x4b85, 0x3ef4, 0x4b92, 0x3ef2, 0x4b9e, 0x3ef0, 0x4bab, 0x3eed, - 0x4bb7, 0x3eeb, 0x4bc3, 0x3ee9, 0x4bd0, 0x3ee7, 0x4bdc, 0x3ee4, - 0x4be8, 0x3ee2, 0x4bf5, 0x3ee0, 0x4c01, 0x3edd, 0x4c0d, 0x3edb, - 0x4c1a, 0x3ed8, 0x4c26, 0x3ed6, 0x4c32, 0x3ed4, 0x4c3f, 0x3ed1, - 0x4c4b, 0x3ecf, 0x4c57, 0x3ecc, 0x4c64, 0x3eca, 0x4c70, 0x3ec8, - 0x4c7c, 0x3ec5, 0x4c89, 0x3ec3, 0x4c95, 0x3ec0, 0x4ca1, 0x3ebe, - 0x4cae, 0x3ebb, 0x4cba, 0x3eb9, 0x4cc6, 0x3eb6, 0x4cd3, 0x3eb4, - 0x4cdf, 0x3eb1, 0x4ceb, 0x3eaf, 0x4cf8, 0x3eac, 0x4d04, 0x3eaa, - 0x4d10, 0x3ea7, 0x4d1c, 0x3ea5, 0x4d29, 0x3ea2, 0x4d35, 0x3e9f, - 0x4d41, 0x3e9d, 0x4d4e, 0x3e9a, 0x4d5a, 0x3e98, 0x4d66, 0x3e95, - 0x4d72, 0x3e92, 0x4d7f, 0x3e90, 0x4d8b, 0x3e8d, 0x4d97, 0x3e8a, - 0x4da4, 0x3e88, 0x4db0, 0x3e85, 0x4dbc, 0x3e82, 0x4dc8, 0x3e80, - 0x4dd5, 0x3e7d, 0x4de1, 0x3e7a, 0x4ded, 0x3e77, 0x4df9, 0x3e75, - 0x4e06, 0x3e72, 0x4e12, 0x3e6f, 0x4e1e, 0x3e6c, 0x4e2b, 0x3e6a, - 0x4e37, 0x3e67, 0x4e43, 0x3e64, 0x4e4f, 0x3e61, 0x4e5c, 0x3e5e, - 0x4e68, 0x3e5c, 0x4e74, 0x3e59, 0x4e80, 0x3e56, 0x4e8c, 0x3e53, - 0x4e99, 0x3e50, 0x4ea5, 0x3e4d, 0x4eb1, 0x3e4a, 0x4ebd, 0x3e48, - 0x4eca, 0x3e45, 0x4ed6, 0x3e42, 0x4ee2, 0x3e3f, 0x4eee, 0x3e3c, - 0x4efb, 0x3e39, 0x4f07, 0x3e36, 0x4f13, 0x3e33, 0x4f1f, 0x3e30, - 0x4f2b, 0x3e2d, 0x4f38, 0x3e2a, 0x4f44, 0x3e27, 0x4f50, 0x3e24, - 0x4f5c, 0x3e21, 0x4f68, 0x3e1e, 0x4f75, 0x3e1b, 0x4f81, 0x3e18, - 0x4f8d, 0x3e15, 0x4f99, 0x3e12, 0x4fa5, 0x3e0f, 0x4fb2, 0x3e0c, - 0x4fbe, 0x3e09, 0x4fca, 0x3e06, 0x4fd6, 0x3e03, 0x4fe2, 0x3dff, - 0x4fee, 0x3dfc, 0x4ffb, 0x3df9, 0x5007, 0x3df6, 0x5013, 0x3df3, - 0x501f, 0x3df0, 0x502b, 0x3ded, 0x5037, 0x3de9, 0x5044, 0x3de6, - 0x5050, 0x3de3, 0x505c, 0x3de0, 0x5068, 0x3ddd, 0x5074, 0x3dd9, - 0x5080, 0x3dd6, 0x508c, 0x3dd3, 0x5099, 0x3dd0, 0x50a5, 0x3dcc, - 0x50b1, 0x3dc9, 0x50bd, 0x3dc6, 0x50c9, 0x3dc2, 0x50d5, 0x3dbf, - 0x50e1, 0x3dbc, 0x50ed, 0x3db9, 0x50fa, 0x3db5, 0x5106, 0x3db2, - 0x5112, 0x3daf, 0x511e, 0x3dab, 0x512a, 0x3da8, 0x5136, 0x3da4, - 0x5142, 0x3da1, 0x514e, 0x3d9e, 0x515a, 0x3d9a, 0x5167, 0x3d97, - 0x5173, 0x3d93, 0x517f, 0x3d90, 0x518b, 0x3d8d, 0x5197, 0x3d89, - 0x51a3, 0x3d86, 0x51af, 0x3d82, 0x51bb, 0x3d7f, 0x51c7, 0x3d7b, - 0x51d3, 0x3d78, 0x51df, 0x3d74, 0x51eb, 0x3d71, 0x51f7, 0x3d6d, - 0x5204, 0x3d6a, 0x5210, 0x3d66, 0x521c, 0x3d63, 0x5228, 0x3d5f, - 0x5234, 0x3d5b, 0x5240, 0x3d58, 0x524c, 0x3d54, 0x5258, 0x3d51, - 0x5264, 0x3d4d, 0x5270, 0x3d49, 0x527c, 0x3d46, 0x5288, 0x3d42, - 0x5294, 0x3d3f, 0x52a0, 0x3d3b, 0x52ac, 0x3d37, 0x52b8, 0x3d34, - 0x52c4, 0x3d30, 0x52d0, 0x3d2c, 0x52dc, 0x3d28, 0x52e8, 0x3d25, - 0x52f4, 0x3d21, 0x5300, 0x3d1d, 0x530c, 0x3d1a, 0x5318, 0x3d16, - 0x5324, 0x3d12, 0x5330, 0x3d0e, 0x533c, 0x3d0b, 0x5348, 0x3d07, - 0x5354, 0x3d03, 0x5360, 0x3cff, 0x536c, 0x3cfb, 0x5378, 0x3cf8, - 0x5384, 0x3cf4, 0x5390, 0x3cf0, 0x539c, 0x3cec, 0x53a8, 0x3ce8, - 0x53b4, 0x3ce4, 0x53c0, 0x3ce0, 0x53cc, 0x3cdd, 0x53d8, 0x3cd9, - 0x53e4, 0x3cd5, 0x53f0, 0x3cd1, 0x53fb, 0x3ccd, 0x5407, 0x3cc9, - 0x5413, 0x3cc5, 0x541f, 0x3cc1, 0x542b, 0x3cbd, 0x5437, 0x3cb9, - 0x5443, 0x3cb5, 0x544f, 0x3cb1, 0x545b, 0x3cad, 0x5467, 0x3ca9, - 0x5473, 0x3ca5, 0x547f, 0x3ca1, 0x548b, 0x3c9d, 0x5496, 0x3c99, - 0x54a2, 0x3c95, 0x54ae, 0x3c91, 0x54ba, 0x3c8d, 0x54c6, 0x3c89, - 0x54d2, 0x3c85, 0x54de, 0x3c81, 0x54ea, 0x3c7d, 0x54f6, 0x3c79, - 0x5501, 0x3c74, 0x550d, 0x3c70, 0x5519, 0x3c6c, 0x5525, 0x3c68, - 0x5531, 0x3c64, 0x553d, 0x3c60, 0x5549, 0x3c5b, 0x5554, 0x3c57, - 0x5560, 0x3c53, 0x556c, 0x3c4f, 0x5578, 0x3c4b, 0x5584, 0x3c46, - 0x5590, 0x3c42, 0x559b, 0x3c3e, 0x55a7, 0x3c3a, 0x55b3, 0x3c36, - 0x55bf, 0x3c31, 0x55cb, 0x3c2d, 0x55d7, 0x3c29, 0x55e2, 0x3c24, - 0x55ee, 0x3c20, 0x55fa, 0x3c1c, 0x5606, 0x3c17, 0x5612, 0x3c13, - 0x561d, 0x3c0f, 0x5629, 0x3c0a, 0x5635, 0x3c06, 0x5641, 0x3c02, - 0x564c, 0x3bfd, 0x5658, 0x3bf9, 0x5664, 0x3bf5, 0x5670, 0x3bf0, - 0x567c, 0x3bec, 0x5687, 0x3be7, 0x5693, 0x3be3, 0x569f, 0x3bde, - 0x56ab, 0x3bda, 0x56b6, 0x3bd6, 0x56c2, 0x3bd1, 0x56ce, 0x3bcd, - 0x56da, 0x3bc8, 0x56e5, 0x3bc4, 0x56f1, 0x3bbf, 0x56fd, 0x3bbb, - 0x5709, 0x3bb6, 0x5714, 0x3bb2, 0x5720, 0x3bad, 0x572c, 0x3ba9, - 0x5737, 0x3ba4, 0x5743, 0x3b9f, 0x574f, 0x3b9b, 0x575b, 0x3b96, - 0x5766, 0x3b92, 0x5772, 0x3b8d, 0x577e, 0x3b88, 0x5789, 0x3b84, - 0x5795, 0x3b7f, 0x57a1, 0x3b7b, 0x57ac, 0x3b76, 0x57b8, 0x3b71, - 0x57c4, 0x3b6d, 0x57cf, 0x3b68, 0x57db, 0x3b63, 0x57e7, 0x3b5f, - 0x57f2, 0x3b5a, 0x57fe, 0x3b55, 0x580a, 0x3b50, 0x5815, 0x3b4c, - 0x5821, 0x3b47, 0x582d, 0x3b42, 0x5838, 0x3b3e, 0x5844, 0x3b39, - 0x584f, 0x3b34, 0x585b, 0x3b2f, 0x5867, 0x3b2a, 0x5872, 0x3b26, - 0x587e, 0x3b21, 0x5889, 0x3b1c, 0x5895, 0x3b17, 0x58a1, 0x3b12, - 0x58ac, 0x3b0e, 0x58b8, 0x3b09, 0x58c3, 0x3b04, 0x58cf, 0x3aff, - 0x58db, 0x3afa, 0x58e6, 0x3af5, 0x58f2, 0x3af0, 0x58fd, 0x3aeb, - 0x5909, 0x3ae6, 0x5914, 0x3ae2, 0x5920, 0x3add, 0x592c, 0x3ad8, - 0x5937, 0x3ad3, 0x5943, 0x3ace, 0x594e, 0x3ac9, 0x595a, 0x3ac4, - 0x5965, 0x3abf, 0x5971, 0x3aba, 0x597c, 0x3ab5, 0x5988, 0x3ab0, - 0x5993, 0x3aab, 0x599f, 0x3aa6, 0x59aa, 0x3aa1, 0x59b6, 0x3a9c, - 0x59c1, 0x3a97, 0x59cd, 0x3a92, 0x59d8, 0x3a8d, 0x59e4, 0x3a88, - 0x59ef, 0x3a82, 0x59fb, 0x3a7d, 0x5a06, 0x3a78, 0x5a12, 0x3a73, - 0x5a1d, 0x3a6e, 0x5a29, 0x3a69, 0x5a34, 0x3a64, 0x5a40, 0x3a5f, - 0x5a4b, 0x3a59, 0x5a57, 0x3a54, 0x5a62, 0x3a4f, 0x5a6e, 0x3a4a, - 0x5a79, 0x3a45, 0x5a84, 0x3a3f, 0x5a90, 0x3a3a, 0x5a9b, 0x3a35, - 0x5aa7, 0x3a30, 0x5ab2, 0x3a2b, 0x5abe, 0x3a25, 0x5ac9, 0x3a20, - 0x5ad4, 0x3a1b, 0x5ae0, 0x3a16, 0x5aeb, 0x3a10, 0x5af7, 0x3a0b, - 0x5b02, 0x3a06, 0x5b0d, 0x3a00, 0x5b19, 0x39fb, 0x5b24, 0x39f6, - 0x5b30, 0x39f0, 0x5b3b, 0x39eb, 0x5b46, 0x39e6, 0x5b52, 0x39e0, - 0x5b5d, 0x39db, 0x5b68, 0x39d6, 0x5b74, 0x39d0, 0x5b7f, 0x39cb, - 0x5b8a, 0x39c5, 0x5b96, 0x39c0, 0x5ba1, 0x39bb, 0x5bac, 0x39b5, - 0x5bb8, 0x39b0, 0x5bc3, 0x39aa, 0x5bce, 0x39a5, 0x5bda, 0x399f, - 0x5be5, 0x399a, 0x5bf0, 0x3994, 0x5bfc, 0x398f, 0x5c07, 0x3989, - 0x5c12, 0x3984, 0x5c1e, 0x397e, 0x5c29, 0x3979, 0x5c34, 0x3973, - 0x5c3f, 0x396e, 0x5c4b, 0x3968, 0x5c56, 0x3963, 0x5c61, 0x395d, - 0x5c6c, 0x3958, 0x5c78, 0x3952, 0x5c83, 0x394c, 0x5c8e, 0x3947, - 0x5c99, 0x3941, 0x5ca5, 0x393b, 0x5cb0, 0x3936, 0x5cbb, 0x3930, - 0x5cc6, 0x392b, 0x5cd2, 0x3925, 0x5cdd, 0x391f, 0x5ce8, 0x391a, - 0x5cf3, 0x3914, 0x5cff, 0x390e, 0x5d0a, 0x3909, 0x5d15, 0x3903, - 0x5d20, 0x38fd, 0x5d2b, 0x38f7, 0x5d36, 0x38f2, 0x5d42, 0x38ec, - 0x5d4d, 0x38e6, 0x5d58, 0x38e0, 0x5d63, 0x38db, 0x5d6e, 0x38d5, - 0x5d79, 0x38cf, 0x5d85, 0x38c9, 0x5d90, 0x38c3, 0x5d9b, 0x38be, - 0x5da6, 0x38b8, 0x5db1, 0x38b2, 0x5dbc, 0x38ac, 0x5dc7, 0x38a6, - 0x5dd3, 0x38a1, 0x5dde, 0x389b, 0x5de9, 0x3895, 0x5df4, 0x388f, - 0x5dff, 0x3889, 0x5e0a, 0x3883, 0x5e15, 0x387d, 0x5e20, 0x3877, - 0x5e2b, 0x3871, 0x5e36, 0x386b, 0x5e42, 0x3866, 0x5e4d, 0x3860, - 0x5e58, 0x385a, 0x5e63, 0x3854, 0x5e6e, 0x384e, 0x5e79, 0x3848, - 0x5e84, 0x3842, 0x5e8f, 0x383c, 0x5e9a, 0x3836, 0x5ea5, 0x3830, - 0x5eb0, 0x382a, 0x5ebb, 0x3824, 0x5ec6, 0x381e, 0x5ed1, 0x3818, - 0x5edc, 0x3812, 0x5ee7, 0x380b, 0x5ef2, 0x3805, 0x5efd, 0x37ff, - 0x5f08, 0x37f9, 0x5f13, 0x37f3, 0x5f1e, 0x37ed, 0x5f29, 0x37e7, - 0x5f34, 0x37e1, 0x5f3f, 0x37db, 0x5f4a, 0x37d5, 0x5f55, 0x37ce, - 0x5f60, 0x37c8, 0x5f6b, 0x37c2, 0x5f76, 0x37bc, 0x5f81, 0x37b6, - 0x5f8c, 0x37b0, 0x5f97, 0x37a9, 0x5fa2, 0x37a3, 0x5fac, 0x379d, - 0x5fb7, 0x3797, 0x5fc2, 0x3790, 0x5fcd, 0x378a, 0x5fd8, 0x3784, - 0x5fe3, 0x377e, 0x5fee, 0x3777, 0x5ff9, 0x3771, 0x6004, 0x376b, - 0x600f, 0x3765, 0x6019, 0x375e, 0x6024, 0x3758, 0x602f, 0x3752, - 0x603a, 0x374b, 0x6045, 0x3745, 0x6050, 0x373f, 0x605b, 0x3738, - 0x6065, 0x3732, 0x6070, 0x372c, 0x607b, 0x3725, 0x6086, 0x371f, - 0x6091, 0x3718, 0x609b, 0x3712, 0x60a6, 0x370c, 0x60b1, 0x3705, - 0x60bc, 0x36ff, 0x60c7, 0x36f8, 0x60d1, 0x36f2, 0x60dc, 0x36eb, - 0x60e7, 0x36e5, 0x60f2, 0x36df, 0x60fd, 0x36d8, 0x6107, 0x36d2, - 0x6112, 0x36cb, 0x611d, 0x36c5, 0x6128, 0x36be, 0x6132, 0x36b8, - 0x613d, 0x36b1, 0x6148, 0x36ab, 0x6153, 0x36a4, 0x615d, 0x369d, - 0x6168, 0x3697, 0x6173, 0x3690, 0x617d, 0x368a, 0x6188, 0x3683, - 0x6193, 0x367d, 0x619e, 0x3676, 0x61a8, 0x366f, 0x61b3, 0x3669, - 0x61be, 0x3662, 0x61c8, 0x365c, 0x61d3, 0x3655, 0x61de, 0x364e, - 0x61e8, 0x3648, 0x61f3, 0x3641, 0x61fe, 0x363a, 0x6208, 0x3634, - 0x6213, 0x362d, 0x621e, 0x3626, 0x6228, 0x3620, 0x6233, 0x3619, - 0x623d, 0x3612, 0x6248, 0x360b, 0x6253, 0x3605, 0x625d, 0x35fe, - 0x6268, 0x35f7, 0x6272, 0x35f0, 0x627d, 0x35ea, 0x6288, 0x35e3, - 0x6292, 0x35dc, 0x629d, 0x35d5, 0x62a7, 0x35ce, 0x62b2, 0x35c8, - 0x62bc, 0x35c1, 0x62c7, 0x35ba, 0x62d2, 0x35b3, 0x62dc, 0x35ac, - 0x62e7, 0x35a5, 0x62f1, 0x359f, 0x62fc, 0x3598, 0x6306, 0x3591, - 0x6311, 0x358a, 0x631b, 0x3583, 0x6326, 0x357c, 0x6330, 0x3575, - 0x633b, 0x356e, 0x6345, 0x3567, 0x6350, 0x3561, 0x635a, 0x355a, - 0x6365, 0x3553, 0x636f, 0x354c, 0x637a, 0x3545, 0x6384, 0x353e, - 0x638e, 0x3537, 0x6399, 0x3530, 0x63a3, 0x3529, 0x63ae, 0x3522, - 0x63b8, 0x351b, 0x63c3, 0x3514, 0x63cd, 0x350d, 0x63d7, 0x3506, - 0x63e2, 0x34ff, 0x63ec, 0x34f8, 0x63f7, 0x34f1, 0x6401, 0x34ea, - 0x640b, 0x34e2, 0x6416, 0x34db, 0x6420, 0x34d4, 0x642b, 0x34cd, - 0x6435, 0x34c6, 0x643f, 0x34bf, 0x644a, 0x34b8, 0x6454, 0x34b1, - 0x645e, 0x34aa, 0x6469, 0x34a2, 0x6473, 0x349b, 0x647d, 0x3494, - 0x6488, 0x348d, 0x6492, 0x3486, 0x649c, 0x347f, 0x64a7, 0x3477, - 0x64b1, 0x3470, 0x64bb, 0x3469, 0x64c5, 0x3462, 0x64d0, 0x345b, - 0x64da, 0x3453, 0x64e4, 0x344c, 0x64ef, 0x3445, 0x64f9, 0x343e, - 0x6503, 0x3436, 0x650d, 0x342f, 0x6518, 0x3428, 0x6522, 0x3420, - 0x652c, 0x3419, 0x6536, 0x3412, 0x6541, 0x340b, 0x654b, 0x3403, - 0x6555, 0x33fc, 0x655f, 0x33f5, 0x6569, 0x33ed, 0x6574, 0x33e6, - 0x657e, 0x33df, 0x6588, 0x33d7, 0x6592, 0x33d0, 0x659c, 0x33c8, - 0x65a6, 0x33c1, 0x65b1, 0x33ba, 0x65bb, 0x33b2, 0x65c5, 0x33ab, - 0x65cf, 0x33a3, 0x65d9, 0x339c, 0x65e3, 0x3395, 0x65ed, 0x338d, - 0x65f8, 0x3386, 0x6602, 0x337e, 0x660c, 0x3377, 0x6616, 0x336f, - 0x6620, 0x3368, 0x662a, 0x3360, 0x6634, 0x3359, 0x663e, 0x3351, - 0x6648, 0x334a, 0x6652, 0x3342, 0x665c, 0x333b, 0x6666, 0x3333, - 0x6671, 0x332c, 0x667b, 0x3324, 0x6685, 0x331d, 0x668f, 0x3315, - 0x6699, 0x330d, 0x66a3, 0x3306, 0x66ad, 0x32fe, 0x66b7, 0x32f7, - 0x66c1, 0x32ef, 0x66cb, 0x32e7, 0x66d5, 0x32e0, 0x66df, 0x32d8, - 0x66e9, 0x32d0, 0x66f3, 0x32c9, 0x66fd, 0x32c1, 0x6707, 0x32ba, - 0x6711, 0x32b2, 0x671a, 0x32aa, 0x6724, 0x32a3, 0x672e, 0x329b, - 0x6738, 0x3293, 0x6742, 0x328b, 0x674c, 0x3284, 0x6756, 0x327c, - 0x6760, 0x3274, 0x676a, 0x326d, 0x6774, 0x3265, 0x677e, 0x325d, - 0x6788, 0x3255, 0x6791, 0x324e, 0x679b, 0x3246, 0x67a5, 0x323e, - 0x67af, 0x3236, 0x67b9, 0x322e, 0x67c3, 0x3227, 0x67cd, 0x321f, - 0x67d6, 0x3217, 0x67e0, 0x320f, 0x67ea, 0x3207, 0x67f4, 0x31ff, - 0x67fe, 0x31f8, 0x6808, 0x31f0, 0x6811, 0x31e8, 0x681b, 0x31e0, - 0x6825, 0x31d8, 0x682f, 0x31d0, 0x6838, 0x31c8, 0x6842, 0x31c0, - 0x684c, 0x31b9, 0x6856, 0x31b1, 0x6860, 0x31a9, 0x6869, 0x31a1, - 0x6873, 0x3199, 0x687d, 0x3191, 0x6886, 0x3189, 0x6890, 0x3181, - 0x689a, 0x3179, 0x68a4, 0x3171, 0x68ad, 0x3169, 0x68b7, 0x3161, - 0x68c1, 0x3159, 0x68ca, 0x3151, 0x68d4, 0x3149, 0x68de, 0x3141, - 0x68e7, 0x3139, 0x68f1, 0x3131, 0x68fb, 0x3129, 0x6904, 0x3121, - 0x690e, 0x3119, 0x6918, 0x3111, 0x6921, 0x3109, 0x692b, 0x3101, - 0x6935, 0x30f9, 0x693e, 0x30f0, 0x6948, 0x30e8, 0x6951, 0x30e0, - 0x695b, 0x30d8, 0x6965, 0x30d0, 0x696e, 0x30c8, 0x6978, 0x30c0, - 0x6981, 0x30b8, 0x698b, 0x30af, 0x6994, 0x30a7, 0x699e, 0x309f, - 0x69a7, 0x3097, 0x69b1, 0x308f, 0x69bb, 0x3087, 0x69c4, 0x307e, - 0x69ce, 0x3076, 0x69d7, 0x306e, 0x69e1, 0x3066, 0x69ea, 0x305d, - 0x69f4, 0x3055, 0x69fd, 0x304d, 0x6a07, 0x3045, 0x6a10, 0x303c, - 0x6a1a, 0x3034, 0x6a23, 0x302c, 0x6a2c, 0x3024, 0x6a36, 0x301b, - 0x6a3f, 0x3013, 0x6a49, 0x300b, 0x6a52, 0x3002, 0x6a5c, 0x2ffa, - 0x6a65, 0x2ff2, 0x6a6e, 0x2fea, 0x6a78, 0x2fe1, 0x6a81, 0x2fd9, - 0x6a8b, 0x2fd0, 0x6a94, 0x2fc8, 0x6a9d, 0x2fc0, 0x6aa7, 0x2fb7, - 0x6ab0, 0x2faf, 0x6ab9, 0x2fa7, 0x6ac3, 0x2f9e, 0x6acc, 0x2f96, - 0x6ad6, 0x2f8d, 0x6adf, 0x2f85, 0x6ae8, 0x2f7d, 0x6af2, 0x2f74, - 0x6afb, 0x2f6c, 0x6b04, 0x2f63, 0x6b0d, 0x2f5b, 0x6b17, 0x2f52, - 0x6b20, 0x2f4a, 0x6b29, 0x2f41, 0x6b33, 0x2f39, 0x6b3c, 0x2f30, - 0x6b45, 0x2f28, 0x6b4e, 0x2f20, 0x6b58, 0x2f17, 0x6b61, 0x2f0e, - 0x6b6a, 0x2f06, 0x6b73, 0x2efd, 0x6b7d, 0x2ef5, 0x6b86, 0x2eec, - 0x6b8f, 0x2ee4, 0x6b98, 0x2edb, 0x6ba1, 0x2ed3, 0x6bab, 0x2eca, - 0x6bb4, 0x2ec2, 0x6bbd, 0x2eb9, 0x6bc6, 0x2eb0, 0x6bcf, 0x2ea8, - 0x6bd8, 0x2e9f, 0x6be2, 0x2e97, 0x6beb, 0x2e8e, 0x6bf4, 0x2e85, - 0x6bfd, 0x2e7d, 0x6c06, 0x2e74, 0x6c0f, 0x2e6b, 0x6c18, 0x2e63, - 0x6c21, 0x2e5a, 0x6c2b, 0x2e51, 0x6c34, 0x2e49, 0x6c3d, 0x2e40, - 0x6c46, 0x2e37, 0x6c4f, 0x2e2f, 0x6c58, 0x2e26, 0x6c61, 0x2e1d, - 0x6c6a, 0x2e15, 0x6c73, 0x2e0c, 0x6c7c, 0x2e03, 0x6c85, 0x2dfa, - 0x6c8e, 0x2df2, 0x6c97, 0x2de9, 0x6ca0, 0x2de0, 0x6ca9, 0x2dd7, - 0x6cb2, 0x2dcf, 0x6cbb, 0x2dc6, 0x6cc4, 0x2dbd, 0x6ccd, 0x2db4, - 0x6cd6, 0x2dab, 0x6cdf, 0x2da3, 0x6ce8, 0x2d9a, 0x6cf1, 0x2d91, - 0x6cfa, 0x2d88, 0x6d03, 0x2d7f, 0x6d0c, 0x2d76, 0x6d15, 0x2d6e, - 0x6d1e, 0x2d65, 0x6d27, 0x2d5c, 0x6d2f, 0x2d53, 0x6d38, 0x2d4a, - 0x6d41, 0x2d41, 0x6d4a, 0x2d38, 0x6d53, 0x2d2f, 0x6d5c, 0x2d27, - 0x6d65, 0x2d1e, 0x6d6e, 0x2d15, 0x6d76, 0x2d0c, 0x6d7f, 0x2d03, - 0x6d88, 0x2cfa, 0x6d91, 0x2cf1, 0x6d9a, 0x2ce8, 0x6da3, 0x2cdf, - 0x6dab, 0x2cd6, 0x6db4, 0x2ccd, 0x6dbd, 0x2cc4, 0x6dc6, 0x2cbb, - 0x6dcf, 0x2cb2, 0x6dd7, 0x2ca9, 0x6de0, 0x2ca0, 0x6de9, 0x2c97, - 0x6df2, 0x2c8e, 0x6dfa, 0x2c85, 0x6e03, 0x2c7c, 0x6e0c, 0x2c73, - 0x6e15, 0x2c6a, 0x6e1d, 0x2c61, 0x6e26, 0x2c58, 0x6e2f, 0x2c4f, - 0x6e37, 0x2c46, 0x6e40, 0x2c3d, 0x6e49, 0x2c34, 0x6e51, 0x2c2b, - 0x6e5a, 0x2c21, 0x6e63, 0x2c18, 0x6e6b, 0x2c0f, 0x6e74, 0x2c06, - 0x6e7d, 0x2bfd, 0x6e85, 0x2bf4, 0x6e8e, 0x2beb, 0x6e97, 0x2be2, - 0x6e9f, 0x2bd8, 0x6ea8, 0x2bcf, 0x6eb0, 0x2bc6, 0x6eb9, 0x2bbd, - 0x6ec2, 0x2bb4, 0x6eca, 0x2bab, 0x6ed3, 0x2ba1, 0x6edb, 0x2b98, - 0x6ee4, 0x2b8f, 0x6eec, 0x2b86, 0x6ef5, 0x2b7d, 0x6efd, 0x2b73, - 0x6f06, 0x2b6a, 0x6f0e, 0x2b61, 0x6f17, 0x2b58, 0x6f20, 0x2b4e, - 0x6f28, 0x2b45, 0x6f30, 0x2b3c, 0x6f39, 0x2b33, 0x6f41, 0x2b29, - 0x6f4a, 0x2b20, 0x6f52, 0x2b17, 0x6f5b, 0x2b0d, 0x6f63, 0x2b04, - 0x6f6c, 0x2afb, 0x6f74, 0x2af2, 0x6f7d, 0x2ae8, 0x6f85, 0x2adf, - 0x6f8d, 0x2ad6, 0x6f96, 0x2acc, 0x6f9e, 0x2ac3, 0x6fa7, 0x2ab9, - 0x6faf, 0x2ab0, 0x6fb7, 0x2aa7, 0x6fc0, 0x2a9d, 0x6fc8, 0x2a94, - 0x6fd0, 0x2a8b, 0x6fd9, 0x2a81, 0x6fe1, 0x2a78, 0x6fea, 0x2a6e, - 0x6ff2, 0x2a65, 0x6ffa, 0x2a5c, 0x7002, 0x2a52, 0x700b, 0x2a49, - 0x7013, 0x2a3f, 0x701b, 0x2a36, 0x7024, 0x2a2c, 0x702c, 0x2a23, - 0x7034, 0x2a1a, 0x703c, 0x2a10, 0x7045, 0x2a07, 0x704d, 0x29fd, - 0x7055, 0x29f4, 0x705d, 0x29ea, 0x7066, 0x29e1, 0x706e, 0x29d7, - 0x7076, 0x29ce, 0x707e, 0x29c4, 0x7087, 0x29bb, 0x708f, 0x29b1, - 0x7097, 0x29a7, 0x709f, 0x299e, 0x70a7, 0x2994, 0x70af, 0x298b, - 0x70b8, 0x2981, 0x70c0, 0x2978, 0x70c8, 0x296e, 0x70d0, 0x2965, - 0x70d8, 0x295b, 0x70e0, 0x2951, 0x70e8, 0x2948, 0x70f0, 0x293e, - 0x70f9, 0x2935, 0x7101, 0x292b, 0x7109, 0x2921, 0x7111, 0x2918, - 0x7119, 0x290e, 0x7121, 0x2904, 0x7129, 0x28fb, 0x7131, 0x28f1, - 0x7139, 0x28e7, 0x7141, 0x28de, 0x7149, 0x28d4, 0x7151, 0x28ca, - 0x7159, 0x28c1, 0x7161, 0x28b7, 0x7169, 0x28ad, 0x7171, 0x28a4, - 0x7179, 0x289a, 0x7181, 0x2890, 0x7189, 0x2886, 0x7191, 0x287d, - 0x7199, 0x2873, 0x71a1, 0x2869, 0x71a9, 0x2860, 0x71b1, 0x2856, - 0x71b9, 0x284c, 0x71c0, 0x2842, 0x71c8, 0x2838, 0x71d0, 0x282f, - 0x71d8, 0x2825, 0x71e0, 0x281b, 0x71e8, 0x2811, 0x71f0, 0x2808, - 0x71f8, 0x27fe, 0x71ff, 0x27f4, 0x7207, 0x27ea, 0x720f, 0x27e0, - 0x7217, 0x27d6, 0x721f, 0x27cd, 0x7227, 0x27c3, 0x722e, 0x27b9, - 0x7236, 0x27af, 0x723e, 0x27a5, 0x7246, 0x279b, 0x724e, 0x2791, - 0x7255, 0x2788, 0x725d, 0x277e, 0x7265, 0x2774, 0x726d, 0x276a, - 0x7274, 0x2760, 0x727c, 0x2756, 0x7284, 0x274c, 0x728b, 0x2742, - 0x7293, 0x2738, 0x729b, 0x272e, 0x72a3, 0x2724, 0x72aa, 0x271a, - 0x72b2, 0x2711, 0x72ba, 0x2707, 0x72c1, 0x26fd, 0x72c9, 0x26f3, - 0x72d0, 0x26e9, 0x72d8, 0x26df, 0x72e0, 0x26d5, 0x72e7, 0x26cb, - 0x72ef, 0x26c1, 0x72f7, 0x26b7, 0x72fe, 0x26ad, 0x7306, 0x26a3, - 0x730d, 0x2699, 0x7315, 0x268f, 0x731d, 0x2685, 0x7324, 0x267b, - 0x732c, 0x2671, 0x7333, 0x2666, 0x733b, 0x265c, 0x7342, 0x2652, - 0x734a, 0x2648, 0x7351, 0x263e, 0x7359, 0x2634, 0x7360, 0x262a, - 0x7368, 0x2620, 0x736f, 0x2616, 0x7377, 0x260c, 0x737e, 0x2602, - 0x7386, 0x25f8, 0x738d, 0x25ed, 0x7395, 0x25e3, 0x739c, 0x25d9, - 0x73a3, 0x25cf, 0x73ab, 0x25c5, 0x73b2, 0x25bb, 0x73ba, 0x25b1, - 0x73c1, 0x25a6, 0x73c8, 0x259c, 0x73d0, 0x2592, 0x73d7, 0x2588, - 0x73df, 0x257e, 0x73e6, 0x2574, 0x73ed, 0x2569, 0x73f5, 0x255f, - 0x73fc, 0x2555, 0x7403, 0x254b, 0x740b, 0x2541, 0x7412, 0x2536, - 0x7419, 0x252c, 0x7420, 0x2522, 0x7428, 0x2518, 0x742f, 0x250d, - 0x7436, 0x2503, 0x743e, 0x24f9, 0x7445, 0x24ef, 0x744c, 0x24e4, - 0x7453, 0x24da, 0x745b, 0x24d0, 0x7462, 0x24c5, 0x7469, 0x24bb, - 0x7470, 0x24b1, 0x7477, 0x24a7, 0x747f, 0x249c, 0x7486, 0x2492, - 0x748d, 0x2488, 0x7494, 0x247d, 0x749b, 0x2473, 0x74a2, 0x2469, - 0x74aa, 0x245e, 0x74b1, 0x2454, 0x74b8, 0x244a, 0x74bf, 0x243f, - 0x74c6, 0x2435, 0x74cd, 0x242b, 0x74d4, 0x2420, 0x74db, 0x2416, - 0x74e2, 0x240b, 0x74ea, 0x2401, 0x74f1, 0x23f7, 0x74f8, 0x23ec, - 0x74ff, 0x23e2, 0x7506, 0x23d7, 0x750d, 0x23cd, 0x7514, 0x23c3, - 0x751b, 0x23b8, 0x7522, 0x23ae, 0x7529, 0x23a3, 0x7530, 0x2399, - 0x7537, 0x238e, 0x753e, 0x2384, 0x7545, 0x237a, 0x754c, 0x236f, - 0x7553, 0x2365, 0x755a, 0x235a, 0x7561, 0x2350, 0x7567, 0x2345, - 0x756e, 0x233b, 0x7575, 0x2330, 0x757c, 0x2326, 0x7583, 0x231b, - 0x758a, 0x2311, 0x7591, 0x2306, 0x7598, 0x22fc, 0x759f, 0x22f1, - 0x75a5, 0x22e7, 0x75ac, 0x22dc, 0x75b3, 0x22d2, 0x75ba, 0x22c7, - 0x75c1, 0x22bc, 0x75c8, 0x22b2, 0x75ce, 0x22a7, 0x75d5, 0x229d, - 0x75dc, 0x2292, 0x75e3, 0x2288, 0x75ea, 0x227d, 0x75f0, 0x2272, - 0x75f7, 0x2268, 0x75fe, 0x225d, 0x7605, 0x2253, 0x760b, 0x2248, - 0x7612, 0x223d, 0x7619, 0x2233, 0x7620, 0x2228, 0x7626, 0x221e, - 0x762d, 0x2213, 0x7634, 0x2208, 0x763a, 0x21fe, 0x7641, 0x21f3, - 0x7648, 0x21e8, 0x764e, 0x21de, 0x7655, 0x21d3, 0x765c, 0x21c8, - 0x7662, 0x21be, 0x7669, 0x21b3, 0x766f, 0x21a8, 0x7676, 0x219e, - 0x767d, 0x2193, 0x7683, 0x2188, 0x768a, 0x217d, 0x7690, 0x2173, - 0x7697, 0x2168, 0x769d, 0x215d, 0x76a4, 0x2153, 0x76ab, 0x2148, - 0x76b1, 0x213d, 0x76b8, 0x2132, 0x76be, 0x2128, 0x76c5, 0x211d, - 0x76cb, 0x2112, 0x76d2, 0x2107, 0x76d8, 0x20fd, 0x76df, 0x20f2, - 0x76e5, 0x20e7, 0x76eb, 0x20dc, 0x76f2, 0x20d1, 0x76f8, 0x20c7, - 0x76ff, 0x20bc, 0x7705, 0x20b1, 0x770c, 0x20a6, 0x7712, 0x209b, - 0x7718, 0x2091, 0x771f, 0x2086, 0x7725, 0x207b, 0x772c, 0x2070, - 0x7732, 0x2065, 0x7738, 0x205b, 0x773f, 0x2050, 0x7745, 0x2045, - 0x774b, 0x203a, 0x7752, 0x202f, 0x7758, 0x2024, 0x775e, 0x2019, - 0x7765, 0x200f, 0x776b, 0x2004, 0x7771, 0x1ff9, 0x7777, 0x1fee, - 0x777e, 0x1fe3, 0x7784, 0x1fd8, 0x778a, 0x1fcd, 0x7790, 0x1fc2, - 0x7797, 0x1fb7, 0x779d, 0x1fac, 0x77a3, 0x1fa2, 0x77a9, 0x1f97, - 0x77b0, 0x1f8c, 0x77b6, 0x1f81, 0x77bc, 0x1f76, 0x77c2, 0x1f6b, - 0x77c8, 0x1f60, 0x77ce, 0x1f55, 0x77d5, 0x1f4a, 0x77db, 0x1f3f, - 0x77e1, 0x1f34, 0x77e7, 0x1f29, 0x77ed, 0x1f1e, 0x77f3, 0x1f13, - 0x77f9, 0x1f08, 0x77ff, 0x1efd, 0x7805, 0x1ef2, 0x780b, 0x1ee7, - 0x7812, 0x1edc, 0x7818, 0x1ed1, 0x781e, 0x1ec6, 0x7824, 0x1ebb, - 0x782a, 0x1eb0, 0x7830, 0x1ea5, 0x7836, 0x1e9a, 0x783c, 0x1e8f, - 0x7842, 0x1e84, 0x7848, 0x1e79, 0x784e, 0x1e6e, 0x7854, 0x1e63, - 0x785a, 0x1e58, 0x7860, 0x1e4d, 0x7866, 0x1e42, 0x786b, 0x1e36, - 0x7871, 0x1e2b, 0x7877, 0x1e20, 0x787d, 0x1e15, 0x7883, 0x1e0a, - 0x7889, 0x1dff, 0x788f, 0x1df4, 0x7895, 0x1de9, 0x789b, 0x1dde, - 0x78a1, 0x1dd3, 0x78a6, 0x1dc7, 0x78ac, 0x1dbc, 0x78b2, 0x1db1, - 0x78b8, 0x1da6, 0x78be, 0x1d9b, 0x78c3, 0x1d90, 0x78c9, 0x1d85, - 0x78cf, 0x1d79, 0x78d5, 0x1d6e, 0x78db, 0x1d63, 0x78e0, 0x1d58, - 0x78e6, 0x1d4d, 0x78ec, 0x1d42, 0x78f2, 0x1d36, 0x78f7, 0x1d2b, - 0x78fd, 0x1d20, 0x7903, 0x1d15, 0x7909, 0x1d0a, 0x790e, 0x1cff, - 0x7914, 0x1cf3, 0x791a, 0x1ce8, 0x791f, 0x1cdd, 0x7925, 0x1cd2, - 0x792b, 0x1cc6, 0x7930, 0x1cbb, 0x7936, 0x1cb0, 0x793b, 0x1ca5, - 0x7941, 0x1c99, 0x7947, 0x1c8e, 0x794c, 0x1c83, 0x7952, 0x1c78, - 0x7958, 0x1c6c, 0x795d, 0x1c61, 0x7963, 0x1c56, 0x7968, 0x1c4b, - 0x796e, 0x1c3f, 0x7973, 0x1c34, 0x7979, 0x1c29, 0x797e, 0x1c1e, - 0x7984, 0x1c12, 0x7989, 0x1c07, 0x798f, 0x1bfc, 0x7994, 0x1bf0, - 0x799a, 0x1be5, 0x799f, 0x1bda, 0x79a5, 0x1bce, 0x79aa, 0x1bc3, - 0x79b0, 0x1bb8, 0x79b5, 0x1bac, 0x79bb, 0x1ba1, 0x79c0, 0x1b96, - 0x79c5, 0x1b8a, 0x79cb, 0x1b7f, 0x79d0, 0x1b74, 0x79d6, 0x1b68, - 0x79db, 0x1b5d, 0x79e0, 0x1b52, 0x79e6, 0x1b46, 0x79eb, 0x1b3b, - 0x79f0, 0x1b30, 0x79f6, 0x1b24, 0x79fb, 0x1b19, 0x7a00, 0x1b0d, - 0x7a06, 0x1b02, 0x7a0b, 0x1af7, 0x7a10, 0x1aeb, 0x7a16, 0x1ae0, - 0x7a1b, 0x1ad4, 0x7a20, 0x1ac9, 0x7a25, 0x1abe, 0x7a2b, 0x1ab2, - 0x7a30, 0x1aa7, 0x7a35, 0x1a9b, 0x7a3a, 0x1a90, 0x7a3f, 0x1a84, - 0x7a45, 0x1a79, 0x7a4a, 0x1a6e, 0x7a4f, 0x1a62, 0x7a54, 0x1a57, - 0x7a59, 0x1a4b, 0x7a5f, 0x1a40, 0x7a64, 0x1a34, 0x7a69, 0x1a29, - 0x7a6e, 0x1a1d, 0x7a73, 0x1a12, 0x7a78, 0x1a06, 0x7a7d, 0x19fb, - 0x7a82, 0x19ef, 0x7a88, 0x19e4, 0x7a8d, 0x19d8, 0x7a92, 0x19cd, - 0x7a97, 0x19c1, 0x7a9c, 0x19b6, 0x7aa1, 0x19aa, 0x7aa6, 0x199f, - 0x7aab, 0x1993, 0x7ab0, 0x1988, 0x7ab5, 0x197c, 0x7aba, 0x1971, - 0x7abf, 0x1965, 0x7ac4, 0x195a, 0x7ac9, 0x194e, 0x7ace, 0x1943, - 0x7ad3, 0x1937, 0x7ad8, 0x192c, 0x7add, 0x1920, 0x7ae2, 0x1914, - 0x7ae6, 0x1909, 0x7aeb, 0x18fd, 0x7af0, 0x18f2, 0x7af5, 0x18e6, - 0x7afa, 0x18db, 0x7aff, 0x18cf, 0x7b04, 0x18c3, 0x7b09, 0x18b8, - 0x7b0e, 0x18ac, 0x7b12, 0x18a1, 0x7b17, 0x1895, 0x7b1c, 0x1889, - 0x7b21, 0x187e, 0x7b26, 0x1872, 0x7b2a, 0x1867, 0x7b2f, 0x185b, - 0x7b34, 0x184f, 0x7b39, 0x1844, 0x7b3e, 0x1838, 0x7b42, 0x182d, - 0x7b47, 0x1821, 0x7b4c, 0x1815, 0x7b50, 0x180a, 0x7b55, 0x17fe, - 0x7b5a, 0x17f2, 0x7b5f, 0x17e7, 0x7b63, 0x17db, 0x7b68, 0x17cf, - 0x7b6d, 0x17c4, 0x7b71, 0x17b8, 0x7b76, 0x17ac, 0x7b7b, 0x17a1, - 0x7b7f, 0x1795, 0x7b84, 0x1789, 0x7b88, 0x177e, 0x7b8d, 0x1772, - 0x7b92, 0x1766, 0x7b96, 0x175b, 0x7b9b, 0x174f, 0x7b9f, 0x1743, - 0x7ba4, 0x1737, 0x7ba9, 0x172c, 0x7bad, 0x1720, 0x7bb2, 0x1714, - 0x7bb6, 0x1709, 0x7bbb, 0x16fd, 0x7bbf, 0x16f1, 0x7bc4, 0x16e5, - 0x7bc8, 0x16da, 0x7bcd, 0x16ce, 0x7bd1, 0x16c2, 0x7bd6, 0x16b6, - 0x7bda, 0x16ab, 0x7bde, 0x169f, 0x7be3, 0x1693, 0x7be7, 0x1687, - 0x7bec, 0x167c, 0x7bf0, 0x1670, 0x7bf5, 0x1664, 0x7bf9, 0x1658, - 0x7bfd, 0x164c, 0x7c02, 0x1641, 0x7c06, 0x1635, 0x7c0a, 0x1629, - 0x7c0f, 0x161d, 0x7c13, 0x1612, 0x7c17, 0x1606, 0x7c1c, 0x15fa, - 0x7c20, 0x15ee, 0x7c24, 0x15e2, 0x7c29, 0x15d7, 0x7c2d, 0x15cb, - 0x7c31, 0x15bf, 0x7c36, 0x15b3, 0x7c3a, 0x15a7, 0x7c3e, 0x159b, - 0x7c42, 0x1590, 0x7c46, 0x1584, 0x7c4b, 0x1578, 0x7c4f, 0x156c, - 0x7c53, 0x1560, 0x7c57, 0x1554, 0x7c5b, 0x1549, 0x7c60, 0x153d, - 0x7c64, 0x1531, 0x7c68, 0x1525, 0x7c6c, 0x1519, 0x7c70, 0x150d, - 0x7c74, 0x1501, 0x7c79, 0x14f6, 0x7c7d, 0x14ea, 0x7c81, 0x14de, - 0x7c85, 0x14d2, 0x7c89, 0x14c6, 0x7c8d, 0x14ba, 0x7c91, 0x14ae, - 0x7c95, 0x14a2, 0x7c99, 0x1496, 0x7c9d, 0x148b, 0x7ca1, 0x147f, - 0x7ca5, 0x1473, 0x7ca9, 0x1467, 0x7cad, 0x145b, 0x7cb1, 0x144f, - 0x7cb5, 0x1443, 0x7cb9, 0x1437, 0x7cbd, 0x142b, 0x7cc1, 0x141f, - 0x7cc5, 0x1413, 0x7cc9, 0x1407, 0x7ccd, 0x13fb, 0x7cd1, 0x13f0, - 0x7cd5, 0x13e4, 0x7cd9, 0x13d8, 0x7cdd, 0x13cc, 0x7ce0, 0x13c0, - 0x7ce4, 0x13b4, 0x7ce8, 0x13a8, 0x7cec, 0x139c, 0x7cf0, 0x1390, - 0x7cf4, 0x1384, 0x7cf8, 0x1378, 0x7cfb, 0x136c, 0x7cff, 0x1360, - 0x7d03, 0x1354, 0x7d07, 0x1348, 0x7d0b, 0x133c, 0x7d0e, 0x1330, - 0x7d12, 0x1324, 0x7d16, 0x1318, 0x7d1a, 0x130c, 0x7d1d, 0x1300, - 0x7d21, 0x12f4, 0x7d25, 0x12e8, 0x7d28, 0x12dc, 0x7d2c, 0x12d0, - 0x7d30, 0x12c4, 0x7d34, 0x12b8, 0x7d37, 0x12ac, 0x7d3b, 0x12a0, - 0x7d3f, 0x1294, 0x7d42, 0x1288, 0x7d46, 0x127c, 0x7d49, 0x1270, - 0x7d4d, 0x1264, 0x7d51, 0x1258, 0x7d54, 0x124c, 0x7d58, 0x1240, - 0x7d5b, 0x1234, 0x7d5f, 0x1228, 0x7d63, 0x121c, 0x7d66, 0x1210, - 0x7d6a, 0x1204, 0x7d6d, 0x11f7, 0x7d71, 0x11eb, 0x7d74, 0x11df, - 0x7d78, 0x11d3, 0x7d7b, 0x11c7, 0x7d7f, 0x11bb, 0x7d82, 0x11af, - 0x7d86, 0x11a3, 0x7d89, 0x1197, 0x7d8d, 0x118b, 0x7d90, 0x117f, - 0x7d93, 0x1173, 0x7d97, 0x1167, 0x7d9a, 0x115a, 0x7d9e, 0x114e, - 0x7da1, 0x1142, 0x7da4, 0x1136, 0x7da8, 0x112a, 0x7dab, 0x111e, - 0x7daf, 0x1112, 0x7db2, 0x1106, 0x7db5, 0x10fa, 0x7db9, 0x10ed, - 0x7dbc, 0x10e1, 0x7dbf, 0x10d5, 0x7dc2, 0x10c9, 0x7dc6, 0x10bd, - 0x7dc9, 0x10b1, 0x7dcc, 0x10a5, 0x7dd0, 0x1099, 0x7dd3, 0x108c, - 0x7dd6, 0x1080, 0x7dd9, 0x1074, 0x7ddd, 0x1068, 0x7de0, 0x105c, - 0x7de3, 0x1050, 0x7de6, 0x1044, 0x7de9, 0x1037, 0x7ded, 0x102b, - 0x7df0, 0x101f, 0x7df3, 0x1013, 0x7df6, 0x1007, 0x7df9, 0xffb, - 0x7dfc, 0xfee, 0x7dff, 0xfe2, 0x7e03, 0xfd6, 0x7e06, 0xfca, - 0x7e09, 0xfbe, 0x7e0c, 0xfb2, 0x7e0f, 0xfa5, 0x7e12, 0xf99, - 0x7e15, 0xf8d, 0x7e18, 0xf81, 0x7e1b, 0xf75, 0x7e1e, 0xf68, - 0x7e21, 0xf5c, 0x7e24, 0xf50, 0x7e27, 0xf44, 0x7e2a, 0xf38, - 0x7e2d, 0xf2b, 0x7e30, 0xf1f, 0x7e33, 0xf13, 0x7e36, 0xf07, - 0x7e39, 0xefb, 0x7e3c, 0xeee, 0x7e3f, 0xee2, 0x7e42, 0xed6, - 0x7e45, 0xeca, 0x7e48, 0xebd, 0x7e4a, 0xeb1, 0x7e4d, 0xea5, - 0x7e50, 0xe99, 0x7e53, 0xe8c, 0x7e56, 0xe80, 0x7e59, 0xe74, - 0x7e5c, 0xe68, 0x7e5e, 0xe5c, 0x7e61, 0xe4f, 0x7e64, 0xe43, - 0x7e67, 0xe37, 0x7e6a, 0xe2b, 0x7e6c, 0xe1e, 0x7e6f, 0xe12, - 0x7e72, 0xe06, 0x7e75, 0xdf9, 0x7e77, 0xded, 0x7e7a, 0xde1, - 0x7e7d, 0xdd5, 0x7e80, 0xdc8, 0x7e82, 0xdbc, 0x7e85, 0xdb0, - 0x7e88, 0xda4, 0x7e8a, 0xd97, 0x7e8d, 0xd8b, 0x7e90, 0xd7f, - 0x7e92, 0xd72, 0x7e95, 0xd66, 0x7e98, 0xd5a, 0x7e9a, 0xd4e, - 0x7e9d, 0xd41, 0x7e9f, 0xd35, 0x7ea2, 0xd29, 0x7ea5, 0xd1c, - 0x7ea7, 0xd10, 0x7eaa, 0xd04, 0x7eac, 0xcf8, 0x7eaf, 0xceb, - 0x7eb1, 0xcdf, 0x7eb4, 0xcd3, 0x7eb6, 0xcc6, 0x7eb9, 0xcba, - 0x7ebb, 0xcae, 0x7ebe, 0xca1, 0x7ec0, 0xc95, 0x7ec3, 0xc89, - 0x7ec5, 0xc7c, 0x7ec8, 0xc70, 0x7eca, 0xc64, 0x7ecc, 0xc57, - 0x7ecf, 0xc4b, 0x7ed1, 0xc3f, 0x7ed4, 0xc32, 0x7ed6, 0xc26, - 0x7ed8, 0xc1a, 0x7edb, 0xc0d, 0x7edd, 0xc01, 0x7ee0, 0xbf5, - 0x7ee2, 0xbe8, 0x7ee4, 0xbdc, 0x7ee7, 0xbd0, 0x7ee9, 0xbc3, - 0x7eeb, 0xbb7, 0x7eed, 0xbab, 0x7ef0, 0xb9e, 0x7ef2, 0xb92, - 0x7ef4, 0xb85, 0x7ef7, 0xb79, 0x7ef9, 0xb6d, 0x7efb, 0xb60, - 0x7efd, 0xb54, 0x7f00, 0xb48, 0x7f02, 0xb3b, 0x7f04, 0xb2f, - 0x7f06, 0xb23, 0x7f08, 0xb16, 0x7f0a, 0xb0a, 0x7f0d, 0xafd, - 0x7f0f, 0xaf1, 0x7f11, 0xae5, 0x7f13, 0xad8, 0x7f15, 0xacc, - 0x7f17, 0xac0, 0x7f19, 0xab3, 0x7f1c, 0xaa7, 0x7f1e, 0xa9a, - 0x7f20, 0xa8e, 0x7f22, 0xa82, 0x7f24, 0xa75, 0x7f26, 0xa69, - 0x7f28, 0xa5c, 0x7f2a, 0xa50, 0x7f2c, 0xa44, 0x7f2e, 0xa37, - 0x7f30, 0xa2b, 0x7f32, 0xa1e, 0x7f34, 0xa12, 0x7f36, 0xa06, - 0x7f38, 0x9f9, 0x7f3a, 0x9ed, 0x7f3c, 0x9e0, 0x7f3e, 0x9d4, - 0x7f40, 0x9c7, 0x7f42, 0x9bb, 0x7f43, 0x9af, 0x7f45, 0x9a2, - 0x7f47, 0x996, 0x7f49, 0x989, 0x7f4b, 0x97d, 0x7f4d, 0x970, - 0x7f4f, 0x964, 0x7f51, 0x958, 0x7f52, 0x94b, 0x7f54, 0x93f, - 0x7f56, 0x932, 0x7f58, 0x926, 0x7f5a, 0x919, 0x7f5b, 0x90d, - 0x7f5d, 0x901, 0x7f5f, 0x8f4, 0x7f61, 0x8e8, 0x7f62, 0x8db, - 0x7f64, 0x8cf, 0x7f66, 0x8c2, 0x7f68, 0x8b6, 0x7f69, 0x8a9, - 0x7f6b, 0x89d, 0x7f6d, 0x891, 0x7f6e, 0x884, 0x7f70, 0x878, - 0x7f72, 0x86b, 0x7f73, 0x85f, 0x7f75, 0x852, 0x7f77, 0x846, - 0x7f78, 0x839, 0x7f7a, 0x82d, 0x7f7b, 0x820, 0x7f7d, 0x814, - 0x7f7f, 0x807, 0x7f80, 0x7fb, 0x7f82, 0x7ef, 0x7f83, 0x7e2, - 0x7f85, 0x7d6, 0x7f86, 0x7c9, 0x7f88, 0x7bd, 0x7f89, 0x7b0, - 0x7f8b, 0x7a4, 0x7f8c, 0x797, 0x7f8e, 0x78b, 0x7f8f, 0x77e, - 0x7f91, 0x772, 0x7f92, 0x765, 0x7f94, 0x759, 0x7f95, 0x74c, - 0x7f97, 0x740, 0x7f98, 0x733, 0x7f99, 0x727, 0x7f9b, 0x71a, - 0x7f9c, 0x70e, 0x7f9e, 0x701, 0x7f9f, 0x6f5, 0x7fa0, 0x6e8, - 0x7fa2, 0x6dc, 0x7fa3, 0x6cf, 0x7fa4, 0x6c3, 0x7fa6, 0x6b6, - 0x7fa7, 0x6aa, 0x7fa8, 0x69d, 0x7faa, 0x691, 0x7fab, 0x684, - 0x7fac, 0x678, 0x7fad, 0x66b, 0x7faf, 0x65f, 0x7fb0, 0x652, - 0x7fb1, 0x646, 0x7fb2, 0x639, 0x7fb4, 0x62d, 0x7fb5, 0x620, - 0x7fb6, 0x614, 0x7fb7, 0x607, 0x7fb8, 0x5fb, 0x7fb9, 0x5ee, - 0x7fbb, 0x5e2, 0x7fbc, 0x5d5, 0x7fbd, 0x5c9, 0x7fbe, 0x5bc, - 0x7fbf, 0x5b0, 0x7fc0, 0x5a3, 0x7fc1, 0x597, 0x7fc3, 0x58a, - 0x7fc4, 0x57e, 0x7fc5, 0x571, 0x7fc6, 0x565, 0x7fc7, 0x558, - 0x7fc8, 0x54c, 0x7fc9, 0x53f, 0x7fca, 0x533, 0x7fcb, 0x526, - 0x7fcc, 0x51a, 0x7fcd, 0x50d, 0x7fce, 0x500, 0x7fcf, 0x4f4, - 0x7fd0, 0x4e7, 0x7fd1, 0x4db, 0x7fd2, 0x4ce, 0x7fd3, 0x4c2, - 0x7fd4, 0x4b5, 0x7fd5, 0x4a9, 0x7fd5, 0x49c, 0x7fd6, 0x490, - 0x7fd7, 0x483, 0x7fd8, 0x477, 0x7fd9, 0x46a, 0x7fda, 0x45e, - 0x7fdb, 0x451, 0x7fdc, 0x444, 0x7fdc, 0x438, 0x7fdd, 0x42b, - 0x7fde, 0x41f, 0x7fdf, 0x412, 0x7fe0, 0x406, 0x7fe0, 0x3f9, - 0x7fe1, 0x3ed, 0x7fe2, 0x3e0, 0x7fe3, 0x3d4, 0x7fe3, 0x3c7, - 0x7fe4, 0x3bb, 0x7fe5, 0x3ae, 0x7fe6, 0x3a1, 0x7fe6, 0x395, - 0x7fe7, 0x388, 0x7fe8, 0x37c, 0x7fe8, 0x36f, 0x7fe9, 0x363, - 0x7fea, 0x356, 0x7fea, 0x34a, 0x7feb, 0x33d, 0x7fec, 0x330, - 0x7fec, 0x324, 0x7fed, 0x317, 0x7fed, 0x30b, 0x7fee, 0x2fe, - 0x7fef, 0x2f2, 0x7fef, 0x2e5, 0x7ff0, 0x2d9, 0x7ff0, 0x2cc, - 0x7ff1, 0x2c0, 0x7ff1, 0x2b3, 0x7ff2, 0x2a6, 0x7ff2, 0x29a, - 0x7ff3, 0x28d, 0x7ff3, 0x281, 0x7ff4, 0x274, 0x7ff4, 0x268, - 0x7ff5, 0x25b, 0x7ff5, 0x24e, 0x7ff6, 0x242, 0x7ff6, 0x235, - 0x7ff7, 0x229, 0x7ff7, 0x21c, 0x7ff7, 0x210, 0x7ff8, 0x203, - 0x7ff8, 0x1f7, 0x7ff9, 0x1ea, 0x7ff9, 0x1dd, 0x7ff9, 0x1d1, - 0x7ffa, 0x1c4, 0x7ffa, 0x1b8, 0x7ffa, 0x1ab, 0x7ffb, 0x19f, - 0x7ffb, 0x192, 0x7ffb, 0x186, 0x7ffc, 0x179, 0x7ffc, 0x16c, - 0x7ffc, 0x160, 0x7ffc, 0x153, 0x7ffd, 0x147, 0x7ffd, 0x13a, - 0x7ffd, 0x12e, 0x7ffd, 0x121, 0x7ffe, 0x114, 0x7ffe, 0x108, - 0x7ffe, 0xfb, 0x7ffe, 0xef, 0x7ffe, 0xe2, 0x7fff, 0xd6, - 0x7fff, 0xc9, 0x7fff, 0xbc, 0x7fff, 0xb0, 0x7fff, 0xa3, - 0x7fff, 0x97, 0x7fff, 0x8a, 0x7fff, 0x7e, 0x7fff, 0x71, - 0x7fff, 0x65, 0x7fff, 0x58, 0x7fff, 0x4b, 0x7fff, 0x3f, - 0x7fff, 0x32, 0x7fff, 0x26, 0x7fff, 0x19, 0x7fff, 0xd, - 0x7fff, 0x0, 0x7fff, 0xfff3, 0x7fff, 0xffe7, 0x7fff, 0xffda, - 0x7fff, 0xffce, 0x7fff, 0xffc1, 0x7fff, 0xffb5, 0x7fff, 0xffa8, - 0x7fff, 0xff9b, 0x7fff, 0xff8f, 0x7fff, 0xff82, 0x7fff, 0xff76, - 0x7fff, 0xff69, 0x7fff, 0xff5d, 0x7fff, 0xff50, 0x7fff, 0xff44, - 0x7fff, 0xff37, 0x7fff, 0xff2a, 0x7ffe, 0xff1e, 0x7ffe, 0xff11, - 0x7ffe, 0xff05, 0x7ffe, 0xfef8, 0x7ffe, 0xfeec, 0x7ffd, 0xfedf, - 0x7ffd, 0xfed2, 0x7ffd, 0xfec6, 0x7ffd, 0xfeb9, 0x7ffc, 0xfead, - 0x7ffc, 0xfea0, 0x7ffc, 0xfe94, 0x7ffc, 0xfe87, 0x7ffb, 0xfe7a, - 0x7ffb, 0xfe6e, 0x7ffb, 0xfe61, 0x7ffa, 0xfe55, 0x7ffa, 0xfe48, - 0x7ffa, 0xfe3c, 0x7ff9, 0xfe2f, 0x7ff9, 0xfe23, 0x7ff9, 0xfe16, - 0x7ff8, 0xfe09, 0x7ff8, 0xfdfd, 0x7ff7, 0xfdf0, 0x7ff7, 0xfde4, - 0x7ff7, 0xfdd7, 0x7ff6, 0xfdcb, 0x7ff6, 0xfdbe, 0x7ff5, 0xfdb2, - 0x7ff5, 0xfda5, 0x7ff4, 0xfd98, 0x7ff4, 0xfd8c, 0x7ff3, 0xfd7f, - 0x7ff3, 0xfd73, 0x7ff2, 0xfd66, 0x7ff2, 0xfd5a, 0x7ff1, 0xfd4d, - 0x7ff1, 0xfd40, 0x7ff0, 0xfd34, 0x7ff0, 0xfd27, 0x7fef, 0xfd1b, - 0x7fef, 0xfd0e, 0x7fee, 0xfd02, 0x7fed, 0xfcf5, 0x7fed, 0xfce9, - 0x7fec, 0xfcdc, 0x7fec, 0xfcd0, 0x7feb, 0xfcc3, 0x7fea, 0xfcb6, - 0x7fea, 0xfcaa, 0x7fe9, 0xfc9d, 0x7fe8, 0xfc91, 0x7fe8, 0xfc84, - 0x7fe7, 0xfc78, 0x7fe6, 0xfc6b, 0x7fe6, 0xfc5f, 0x7fe5, 0xfc52, - 0x7fe4, 0xfc45, 0x7fe3, 0xfc39, 0x7fe3, 0xfc2c, 0x7fe2, 0xfc20, - 0x7fe1, 0xfc13, 0x7fe0, 0xfc07, 0x7fe0, 0xfbfa, 0x7fdf, 0xfbee, - 0x7fde, 0xfbe1, 0x7fdd, 0xfbd5, 0x7fdc, 0xfbc8, 0x7fdc, 0xfbbc, - 0x7fdb, 0xfbaf, 0x7fda, 0xfba2, 0x7fd9, 0xfb96, 0x7fd8, 0xfb89, - 0x7fd7, 0xfb7d, 0x7fd6, 0xfb70, 0x7fd5, 0xfb64, 0x7fd5, 0xfb57, - 0x7fd4, 0xfb4b, 0x7fd3, 0xfb3e, 0x7fd2, 0xfb32, 0x7fd1, 0xfb25, - 0x7fd0, 0xfb19, 0x7fcf, 0xfb0c, 0x7fce, 0xfb00, 0x7fcd, 0xfaf3, - 0x7fcc, 0xfae6, 0x7fcb, 0xfada, 0x7fca, 0xfacd, 0x7fc9, 0xfac1, - 0x7fc8, 0xfab4, 0x7fc7, 0xfaa8, 0x7fc6, 0xfa9b, 0x7fc5, 0xfa8f, - 0x7fc4, 0xfa82, 0x7fc3, 0xfa76, 0x7fc1, 0xfa69, 0x7fc0, 0xfa5d, - 0x7fbf, 0xfa50, 0x7fbe, 0xfa44, 0x7fbd, 0xfa37, 0x7fbc, 0xfa2b, - 0x7fbb, 0xfa1e, 0x7fb9, 0xfa12, 0x7fb8, 0xfa05, 0x7fb7, 0xf9f9, - 0x7fb6, 0xf9ec, 0x7fb5, 0xf9e0, 0x7fb4, 0xf9d3, 0x7fb2, 0xf9c7, - 0x7fb1, 0xf9ba, 0x7fb0, 0xf9ae, 0x7faf, 0xf9a1, 0x7fad, 0xf995, - 0x7fac, 0xf988, 0x7fab, 0xf97c, 0x7faa, 0xf96f, 0x7fa8, 0xf963, - 0x7fa7, 0xf956, 0x7fa6, 0xf94a, 0x7fa4, 0xf93d, 0x7fa3, 0xf931, - 0x7fa2, 0xf924, 0x7fa0, 0xf918, 0x7f9f, 0xf90b, 0x7f9e, 0xf8ff, - 0x7f9c, 0xf8f2, 0x7f9b, 0xf8e6, 0x7f99, 0xf8d9, 0x7f98, 0xf8cd, - 0x7f97, 0xf8c0, 0x7f95, 0xf8b4, 0x7f94, 0xf8a7, 0x7f92, 0xf89b, - 0x7f91, 0xf88e, 0x7f8f, 0xf882, 0x7f8e, 0xf875, 0x7f8c, 0xf869, - 0x7f8b, 0xf85c, 0x7f89, 0xf850, 0x7f88, 0xf843, 0x7f86, 0xf837, - 0x7f85, 0xf82a, 0x7f83, 0xf81e, 0x7f82, 0xf811, 0x7f80, 0xf805, - 0x7f7f, 0xf7f9, 0x7f7d, 0xf7ec, 0x7f7b, 0xf7e0, 0x7f7a, 0xf7d3, - 0x7f78, 0xf7c7, 0x7f77, 0xf7ba, 0x7f75, 0xf7ae, 0x7f73, 0xf7a1, - 0x7f72, 0xf795, 0x7f70, 0xf788, 0x7f6e, 0xf77c, 0x7f6d, 0xf76f, - 0x7f6b, 0xf763, 0x7f69, 0xf757, 0x7f68, 0xf74a, 0x7f66, 0xf73e, - 0x7f64, 0xf731, 0x7f62, 0xf725, 0x7f61, 0xf718, 0x7f5f, 0xf70c, - 0x7f5d, 0xf6ff, 0x7f5b, 0xf6f3, 0x7f5a, 0xf6e7, 0x7f58, 0xf6da, - 0x7f56, 0xf6ce, 0x7f54, 0xf6c1, 0x7f52, 0xf6b5, 0x7f51, 0xf6a8, - 0x7f4f, 0xf69c, 0x7f4d, 0xf690, 0x7f4b, 0xf683, 0x7f49, 0xf677, - 0x7f47, 0xf66a, 0x7f45, 0xf65e, 0x7f43, 0xf651, 0x7f42, 0xf645, - 0x7f40, 0xf639, 0x7f3e, 0xf62c, 0x7f3c, 0xf620, 0x7f3a, 0xf613, - 0x7f38, 0xf607, 0x7f36, 0xf5fa, 0x7f34, 0xf5ee, 0x7f32, 0xf5e2, - 0x7f30, 0xf5d5, 0x7f2e, 0xf5c9, 0x7f2c, 0xf5bc, 0x7f2a, 0xf5b0, - 0x7f28, 0xf5a4, 0x7f26, 0xf597, 0x7f24, 0xf58b, 0x7f22, 0xf57e, - 0x7f20, 0xf572, 0x7f1e, 0xf566, 0x7f1c, 0xf559, 0x7f19, 0xf54d, - 0x7f17, 0xf540, 0x7f15, 0xf534, 0x7f13, 0xf528, 0x7f11, 0xf51b, - 0x7f0f, 0xf50f, 0x7f0d, 0xf503, 0x7f0a, 0xf4f6, 0x7f08, 0xf4ea, - 0x7f06, 0xf4dd, 0x7f04, 0xf4d1, 0x7f02, 0xf4c5, 0x7f00, 0xf4b8, - 0x7efd, 0xf4ac, 0x7efb, 0xf4a0, 0x7ef9, 0xf493, 0x7ef7, 0xf487, - 0x7ef4, 0xf47b, 0x7ef2, 0xf46e, 0x7ef0, 0xf462, 0x7eed, 0xf455, - 0x7eeb, 0xf449, 0x7ee9, 0xf43d, 0x7ee7, 0xf430, 0x7ee4, 0xf424, - 0x7ee2, 0xf418, 0x7ee0, 0xf40b, 0x7edd, 0xf3ff, 0x7edb, 0xf3f3, - 0x7ed8, 0xf3e6, 0x7ed6, 0xf3da, 0x7ed4, 0xf3ce, 0x7ed1, 0xf3c1, - 0x7ecf, 0xf3b5, 0x7ecc, 0xf3a9, 0x7eca, 0xf39c, 0x7ec8, 0xf390, - 0x7ec5, 0xf384, 0x7ec3, 0xf377, 0x7ec0, 0xf36b, 0x7ebe, 0xf35f, - 0x7ebb, 0xf352, 0x7eb9, 0xf346, 0x7eb6, 0xf33a, 0x7eb4, 0xf32d, - 0x7eb1, 0xf321, 0x7eaf, 0xf315, 0x7eac, 0xf308, 0x7eaa, 0xf2fc, - 0x7ea7, 0xf2f0, 0x7ea5, 0xf2e4, 0x7ea2, 0xf2d7, 0x7e9f, 0xf2cb, - 0x7e9d, 0xf2bf, 0x7e9a, 0xf2b2, 0x7e98, 0xf2a6, 0x7e95, 0xf29a, - 0x7e92, 0xf28e, 0x7e90, 0xf281, 0x7e8d, 0xf275, 0x7e8a, 0xf269, - 0x7e88, 0xf25c, 0x7e85, 0xf250, 0x7e82, 0xf244, 0x7e80, 0xf238, - 0x7e7d, 0xf22b, 0x7e7a, 0xf21f, 0x7e77, 0xf213, 0x7e75, 0xf207, - 0x7e72, 0xf1fa, 0x7e6f, 0xf1ee, 0x7e6c, 0xf1e2, 0x7e6a, 0xf1d5, - 0x7e67, 0xf1c9, 0x7e64, 0xf1bd, 0x7e61, 0xf1b1, 0x7e5e, 0xf1a4, - 0x7e5c, 0xf198, 0x7e59, 0xf18c, 0x7e56, 0xf180, 0x7e53, 0xf174, - 0x7e50, 0xf167, 0x7e4d, 0xf15b, 0x7e4a, 0xf14f, 0x7e48, 0xf143, - 0x7e45, 0xf136, 0x7e42, 0xf12a, 0x7e3f, 0xf11e, 0x7e3c, 0xf112, - 0x7e39, 0xf105, 0x7e36, 0xf0f9, 0x7e33, 0xf0ed, 0x7e30, 0xf0e1, - 0x7e2d, 0xf0d5, 0x7e2a, 0xf0c8, 0x7e27, 0xf0bc, 0x7e24, 0xf0b0, - 0x7e21, 0xf0a4, 0x7e1e, 0xf098, 0x7e1b, 0xf08b, 0x7e18, 0xf07f, - 0x7e15, 0xf073, 0x7e12, 0xf067, 0x7e0f, 0xf05b, 0x7e0c, 0xf04e, - 0x7e09, 0xf042, 0x7e06, 0xf036, 0x7e03, 0xf02a, 0x7dff, 0xf01e, - 0x7dfc, 0xf012, 0x7df9, 0xf005, 0x7df6, 0xeff9, 0x7df3, 0xefed, - 0x7df0, 0xefe1, 0x7ded, 0xefd5, 0x7de9, 0xefc9, 0x7de6, 0xefbc, - 0x7de3, 0xefb0, 0x7de0, 0xefa4, 0x7ddd, 0xef98, 0x7dd9, 0xef8c, - 0x7dd6, 0xef80, 0x7dd3, 0xef74, 0x7dd0, 0xef67, 0x7dcc, 0xef5b, - 0x7dc9, 0xef4f, 0x7dc6, 0xef43, 0x7dc2, 0xef37, 0x7dbf, 0xef2b, - 0x7dbc, 0xef1f, 0x7db9, 0xef13, 0x7db5, 0xef06, 0x7db2, 0xeefa, - 0x7daf, 0xeeee, 0x7dab, 0xeee2, 0x7da8, 0xeed6, 0x7da4, 0xeeca, - 0x7da1, 0xeebe, 0x7d9e, 0xeeb2, 0x7d9a, 0xeea6, 0x7d97, 0xee99, - 0x7d93, 0xee8d, 0x7d90, 0xee81, 0x7d8d, 0xee75, 0x7d89, 0xee69, - 0x7d86, 0xee5d, 0x7d82, 0xee51, 0x7d7f, 0xee45, 0x7d7b, 0xee39, - 0x7d78, 0xee2d, 0x7d74, 0xee21, 0x7d71, 0xee15, 0x7d6d, 0xee09, - 0x7d6a, 0xedfc, 0x7d66, 0xedf0, 0x7d63, 0xede4, 0x7d5f, 0xedd8, - 0x7d5b, 0xedcc, 0x7d58, 0xedc0, 0x7d54, 0xedb4, 0x7d51, 0xeda8, - 0x7d4d, 0xed9c, 0x7d49, 0xed90, 0x7d46, 0xed84, 0x7d42, 0xed78, - 0x7d3f, 0xed6c, 0x7d3b, 0xed60, 0x7d37, 0xed54, 0x7d34, 0xed48, - 0x7d30, 0xed3c, 0x7d2c, 0xed30, 0x7d28, 0xed24, 0x7d25, 0xed18, - 0x7d21, 0xed0c, 0x7d1d, 0xed00, 0x7d1a, 0xecf4, 0x7d16, 0xece8, - 0x7d12, 0xecdc, 0x7d0e, 0xecd0, 0x7d0b, 0xecc4, 0x7d07, 0xecb8, - 0x7d03, 0xecac, 0x7cff, 0xeca0, 0x7cfb, 0xec94, 0x7cf8, 0xec88, - 0x7cf4, 0xec7c, 0x7cf0, 0xec70, 0x7cec, 0xec64, 0x7ce8, 0xec58, - 0x7ce4, 0xec4c, 0x7ce0, 0xec40, 0x7cdd, 0xec34, 0x7cd9, 0xec28, - 0x7cd5, 0xec1c, 0x7cd1, 0xec10, 0x7ccd, 0xec05, 0x7cc9, 0xebf9, - 0x7cc5, 0xebed, 0x7cc1, 0xebe1, 0x7cbd, 0xebd5, 0x7cb9, 0xebc9, - 0x7cb5, 0xebbd, 0x7cb1, 0xebb1, 0x7cad, 0xeba5, 0x7ca9, 0xeb99, - 0x7ca5, 0xeb8d, 0x7ca1, 0xeb81, 0x7c9d, 0xeb75, 0x7c99, 0xeb6a, - 0x7c95, 0xeb5e, 0x7c91, 0xeb52, 0x7c8d, 0xeb46, 0x7c89, 0xeb3a, - 0x7c85, 0xeb2e, 0x7c81, 0xeb22, 0x7c7d, 0xeb16, 0x7c79, 0xeb0a, - 0x7c74, 0xeaff, 0x7c70, 0xeaf3, 0x7c6c, 0xeae7, 0x7c68, 0xeadb, - 0x7c64, 0xeacf, 0x7c60, 0xeac3, 0x7c5b, 0xeab7, 0x7c57, 0xeaac, - 0x7c53, 0xeaa0, 0x7c4f, 0xea94, 0x7c4b, 0xea88, 0x7c46, 0xea7c, - 0x7c42, 0xea70, 0x7c3e, 0xea65, 0x7c3a, 0xea59, 0x7c36, 0xea4d, - 0x7c31, 0xea41, 0x7c2d, 0xea35, 0x7c29, 0xea29, 0x7c24, 0xea1e, - 0x7c20, 0xea12, 0x7c1c, 0xea06, 0x7c17, 0xe9fa, 0x7c13, 0xe9ee, - 0x7c0f, 0xe9e3, 0x7c0a, 0xe9d7, 0x7c06, 0xe9cb, 0x7c02, 0xe9bf, - 0x7bfd, 0xe9b4, 0x7bf9, 0xe9a8, 0x7bf5, 0xe99c, 0x7bf0, 0xe990, - 0x7bec, 0xe984, 0x7be7, 0xe979, 0x7be3, 0xe96d, 0x7bde, 0xe961, - 0x7bda, 0xe955, 0x7bd6, 0xe94a, 0x7bd1, 0xe93e, 0x7bcd, 0xe932, - 0x7bc8, 0xe926, 0x7bc4, 0xe91b, 0x7bbf, 0xe90f, 0x7bbb, 0xe903, - 0x7bb6, 0xe8f7, 0x7bb2, 0xe8ec, 0x7bad, 0xe8e0, 0x7ba9, 0xe8d4, - 0x7ba4, 0xe8c9, 0x7b9f, 0xe8bd, 0x7b9b, 0xe8b1, 0x7b96, 0xe8a5, - 0x7b92, 0xe89a, 0x7b8d, 0xe88e, 0x7b88, 0xe882, 0x7b84, 0xe877, - 0x7b7f, 0xe86b, 0x7b7b, 0xe85f, 0x7b76, 0xe854, 0x7b71, 0xe848, - 0x7b6d, 0xe83c, 0x7b68, 0xe831, 0x7b63, 0xe825, 0x7b5f, 0xe819, - 0x7b5a, 0xe80e, 0x7b55, 0xe802, 0x7b50, 0xe7f6, 0x7b4c, 0xe7eb, - 0x7b47, 0xe7df, 0x7b42, 0xe7d3, 0x7b3e, 0xe7c8, 0x7b39, 0xe7bc, - 0x7b34, 0xe7b1, 0x7b2f, 0xe7a5, 0x7b2a, 0xe799, 0x7b26, 0xe78e, - 0x7b21, 0xe782, 0x7b1c, 0xe777, 0x7b17, 0xe76b, 0x7b12, 0xe75f, - 0x7b0e, 0xe754, 0x7b09, 0xe748, 0x7b04, 0xe73d, 0x7aff, 0xe731, - 0x7afa, 0xe725, 0x7af5, 0xe71a, 0x7af0, 0xe70e, 0x7aeb, 0xe703, - 0x7ae6, 0xe6f7, 0x7ae2, 0xe6ec, 0x7add, 0xe6e0, 0x7ad8, 0xe6d4, - 0x7ad3, 0xe6c9, 0x7ace, 0xe6bd, 0x7ac9, 0xe6b2, 0x7ac4, 0xe6a6, - 0x7abf, 0xe69b, 0x7aba, 0xe68f, 0x7ab5, 0xe684, 0x7ab0, 0xe678, - 0x7aab, 0xe66d, 0x7aa6, 0xe661, 0x7aa1, 0xe656, 0x7a9c, 0xe64a, - 0x7a97, 0xe63f, 0x7a92, 0xe633, 0x7a8d, 0xe628, 0x7a88, 0xe61c, - 0x7a82, 0xe611, 0x7a7d, 0xe605, 0x7a78, 0xe5fa, 0x7a73, 0xe5ee, - 0x7a6e, 0xe5e3, 0x7a69, 0xe5d7, 0x7a64, 0xe5cc, 0x7a5f, 0xe5c0, - 0x7a59, 0xe5b5, 0x7a54, 0xe5a9, 0x7a4f, 0xe59e, 0x7a4a, 0xe592, - 0x7a45, 0xe587, 0x7a3f, 0xe57c, 0x7a3a, 0xe570, 0x7a35, 0xe565, - 0x7a30, 0xe559, 0x7a2b, 0xe54e, 0x7a25, 0xe542, 0x7a20, 0xe537, - 0x7a1b, 0xe52c, 0x7a16, 0xe520, 0x7a10, 0xe515, 0x7a0b, 0xe509, - 0x7a06, 0xe4fe, 0x7a00, 0xe4f3, 0x79fb, 0xe4e7, 0x79f6, 0xe4dc, - 0x79f0, 0xe4d0, 0x79eb, 0xe4c5, 0x79e6, 0xe4ba, 0x79e0, 0xe4ae, - 0x79db, 0xe4a3, 0x79d6, 0xe498, 0x79d0, 0xe48c, 0x79cb, 0xe481, - 0x79c5, 0xe476, 0x79c0, 0xe46a, 0x79bb, 0xe45f, 0x79b5, 0xe454, - 0x79b0, 0xe448, 0x79aa, 0xe43d, 0x79a5, 0xe432, 0x799f, 0xe426, - 0x799a, 0xe41b, 0x7994, 0xe410, 0x798f, 0xe404, 0x7989, 0xe3f9, - 0x7984, 0xe3ee, 0x797e, 0xe3e2, 0x7979, 0xe3d7, 0x7973, 0xe3cc, - 0x796e, 0xe3c1, 0x7968, 0xe3b5, 0x7963, 0xe3aa, 0x795d, 0xe39f, - 0x7958, 0xe394, 0x7952, 0xe388, 0x794c, 0xe37d, 0x7947, 0xe372, - 0x7941, 0xe367, 0x793b, 0xe35b, 0x7936, 0xe350, 0x7930, 0xe345, - 0x792b, 0xe33a, 0x7925, 0xe32e, 0x791f, 0xe323, 0x791a, 0xe318, - 0x7914, 0xe30d, 0x790e, 0xe301, 0x7909, 0xe2f6, 0x7903, 0xe2eb, - 0x78fd, 0xe2e0, 0x78f7, 0xe2d5, 0x78f2, 0xe2ca, 0x78ec, 0xe2be, - 0x78e6, 0xe2b3, 0x78e0, 0xe2a8, 0x78db, 0xe29d, 0x78d5, 0xe292, - 0x78cf, 0xe287, 0x78c9, 0xe27b, 0x78c3, 0xe270, 0x78be, 0xe265, - 0x78b8, 0xe25a, 0x78b2, 0xe24f, 0x78ac, 0xe244, 0x78a6, 0xe239, - 0x78a1, 0xe22d, 0x789b, 0xe222, 0x7895, 0xe217, 0x788f, 0xe20c, - 0x7889, 0xe201, 0x7883, 0xe1f6, 0x787d, 0xe1eb, 0x7877, 0xe1e0, - 0x7871, 0xe1d5, 0x786b, 0xe1ca, 0x7866, 0xe1be, 0x7860, 0xe1b3, - 0x785a, 0xe1a8, 0x7854, 0xe19d, 0x784e, 0xe192, 0x7848, 0xe187, - 0x7842, 0xe17c, 0x783c, 0xe171, 0x7836, 0xe166, 0x7830, 0xe15b, - 0x782a, 0xe150, 0x7824, 0xe145, 0x781e, 0xe13a, 0x7818, 0xe12f, - 0x7812, 0xe124, 0x780b, 0xe119, 0x7805, 0xe10e, 0x77ff, 0xe103, - 0x77f9, 0xe0f8, 0x77f3, 0xe0ed, 0x77ed, 0xe0e2, 0x77e7, 0xe0d7, - 0x77e1, 0xe0cc, 0x77db, 0xe0c1, 0x77d5, 0xe0b6, 0x77ce, 0xe0ab, - 0x77c8, 0xe0a0, 0x77c2, 0xe095, 0x77bc, 0xe08a, 0x77b6, 0xe07f, - 0x77b0, 0xe074, 0x77a9, 0xe069, 0x77a3, 0xe05e, 0x779d, 0xe054, - 0x7797, 0xe049, 0x7790, 0xe03e, 0x778a, 0xe033, 0x7784, 0xe028, - 0x777e, 0xe01d, 0x7777, 0xe012, 0x7771, 0xe007, 0x776b, 0xdffc, - 0x7765, 0xdff1, 0x775e, 0xdfe7, 0x7758, 0xdfdc, 0x7752, 0xdfd1, - 0x774b, 0xdfc6, 0x7745, 0xdfbb, 0x773f, 0xdfb0, 0x7738, 0xdfa5, - 0x7732, 0xdf9b, 0x772c, 0xdf90, 0x7725, 0xdf85, 0x771f, 0xdf7a, - 0x7718, 0xdf6f, 0x7712, 0xdf65, 0x770c, 0xdf5a, 0x7705, 0xdf4f, - 0x76ff, 0xdf44, 0x76f8, 0xdf39, 0x76f2, 0xdf2f, 0x76eb, 0xdf24, - 0x76e5, 0xdf19, 0x76df, 0xdf0e, 0x76d8, 0xdf03, 0x76d2, 0xdef9, - 0x76cb, 0xdeee, 0x76c5, 0xdee3, 0x76be, 0xded8, 0x76b8, 0xdece, - 0x76b1, 0xdec3, 0x76ab, 0xdeb8, 0x76a4, 0xdead, 0x769d, 0xdea3, - 0x7697, 0xde98, 0x7690, 0xde8d, 0x768a, 0xde83, 0x7683, 0xde78, - 0x767d, 0xde6d, 0x7676, 0xde62, 0x766f, 0xde58, 0x7669, 0xde4d, - 0x7662, 0xde42, 0x765c, 0xde38, 0x7655, 0xde2d, 0x764e, 0xde22, - 0x7648, 0xde18, 0x7641, 0xde0d, 0x763a, 0xde02, 0x7634, 0xddf8, - 0x762d, 0xdded, 0x7626, 0xdde2, 0x7620, 0xddd8, 0x7619, 0xddcd, - 0x7612, 0xddc3, 0x760b, 0xddb8, 0x7605, 0xddad, 0x75fe, 0xdda3, - 0x75f7, 0xdd98, 0x75f0, 0xdd8e, 0x75ea, 0xdd83, 0x75e3, 0xdd78, - 0x75dc, 0xdd6e, 0x75d5, 0xdd63, 0x75ce, 0xdd59, 0x75c8, 0xdd4e, - 0x75c1, 0xdd44, 0x75ba, 0xdd39, 0x75b3, 0xdd2e, 0x75ac, 0xdd24, - 0x75a5, 0xdd19, 0x759f, 0xdd0f, 0x7598, 0xdd04, 0x7591, 0xdcfa, - 0x758a, 0xdcef, 0x7583, 0xdce5, 0x757c, 0xdcda, 0x7575, 0xdcd0, - 0x756e, 0xdcc5, 0x7567, 0xdcbb, 0x7561, 0xdcb0, 0x755a, 0xdca6, - 0x7553, 0xdc9b, 0x754c, 0xdc91, 0x7545, 0xdc86, 0x753e, 0xdc7c, - 0x7537, 0xdc72, 0x7530, 0xdc67, 0x7529, 0xdc5d, 0x7522, 0xdc52, - 0x751b, 0xdc48, 0x7514, 0xdc3d, 0x750d, 0xdc33, 0x7506, 0xdc29, - 0x74ff, 0xdc1e, 0x74f8, 0xdc14, 0x74f1, 0xdc09, 0x74ea, 0xdbff, - 0x74e2, 0xdbf5, 0x74db, 0xdbea, 0x74d4, 0xdbe0, 0x74cd, 0xdbd5, - 0x74c6, 0xdbcb, 0x74bf, 0xdbc1, 0x74b8, 0xdbb6, 0x74b1, 0xdbac, - 0x74aa, 0xdba2, 0x74a2, 0xdb97, 0x749b, 0xdb8d, 0x7494, 0xdb83, - 0x748d, 0xdb78, 0x7486, 0xdb6e, 0x747f, 0xdb64, 0x7477, 0xdb59, - 0x7470, 0xdb4f, 0x7469, 0xdb45, 0x7462, 0xdb3b, 0x745b, 0xdb30, - 0x7453, 0xdb26, 0x744c, 0xdb1c, 0x7445, 0xdb11, 0x743e, 0xdb07, - 0x7436, 0xdafd, 0x742f, 0xdaf3, 0x7428, 0xdae8, 0x7420, 0xdade, - 0x7419, 0xdad4, 0x7412, 0xdaca, 0x740b, 0xdabf, 0x7403, 0xdab5, - 0x73fc, 0xdaab, 0x73f5, 0xdaa1, 0x73ed, 0xda97, 0x73e6, 0xda8c, - 0x73df, 0xda82, 0x73d7, 0xda78, 0x73d0, 0xda6e, 0x73c8, 0xda64, - 0x73c1, 0xda5a, 0x73ba, 0xda4f, 0x73b2, 0xda45, 0x73ab, 0xda3b, - 0x73a3, 0xda31, 0x739c, 0xda27, 0x7395, 0xda1d, 0x738d, 0xda13, - 0x7386, 0xda08, 0x737e, 0xd9fe, 0x7377, 0xd9f4, 0x736f, 0xd9ea, - 0x7368, 0xd9e0, 0x7360, 0xd9d6, 0x7359, 0xd9cc, 0x7351, 0xd9c2, - 0x734a, 0xd9b8, 0x7342, 0xd9ae, 0x733b, 0xd9a4, 0x7333, 0xd99a, - 0x732c, 0xd98f, 0x7324, 0xd985, 0x731d, 0xd97b, 0x7315, 0xd971, - 0x730d, 0xd967, 0x7306, 0xd95d, 0x72fe, 0xd953, 0x72f7, 0xd949, - 0x72ef, 0xd93f, 0x72e7, 0xd935, 0x72e0, 0xd92b, 0x72d8, 0xd921, - 0x72d0, 0xd917, 0x72c9, 0xd90d, 0x72c1, 0xd903, 0x72ba, 0xd8f9, - 0x72b2, 0xd8ef, 0x72aa, 0xd8e6, 0x72a3, 0xd8dc, 0x729b, 0xd8d2, - 0x7293, 0xd8c8, 0x728b, 0xd8be, 0x7284, 0xd8b4, 0x727c, 0xd8aa, - 0x7274, 0xd8a0, 0x726d, 0xd896, 0x7265, 0xd88c, 0x725d, 0xd882, - 0x7255, 0xd878, 0x724e, 0xd86f, 0x7246, 0xd865, 0x723e, 0xd85b, - 0x7236, 0xd851, 0x722e, 0xd847, 0x7227, 0xd83d, 0x721f, 0xd833, - 0x7217, 0xd82a, 0x720f, 0xd820, 0x7207, 0xd816, 0x71ff, 0xd80c, - 0x71f8, 0xd802, 0x71f0, 0xd7f8, 0x71e8, 0xd7ef, 0x71e0, 0xd7e5, - 0x71d8, 0xd7db, 0x71d0, 0xd7d1, 0x71c8, 0xd7c8, 0x71c0, 0xd7be, - 0x71b9, 0xd7b4, 0x71b1, 0xd7aa, 0x71a9, 0xd7a0, 0x71a1, 0xd797, - 0x7199, 0xd78d, 0x7191, 0xd783, 0x7189, 0xd77a, 0x7181, 0xd770, - 0x7179, 0xd766, 0x7171, 0xd75c, 0x7169, 0xd753, 0x7161, 0xd749, - 0x7159, 0xd73f, 0x7151, 0xd736, 0x7149, 0xd72c, 0x7141, 0xd722, - 0x7139, 0xd719, 0x7131, 0xd70f, 0x7129, 0xd705, 0x7121, 0xd6fc, - 0x7119, 0xd6f2, 0x7111, 0xd6e8, 0x7109, 0xd6df, 0x7101, 0xd6d5, - 0x70f9, 0xd6cb, 0x70f0, 0xd6c2, 0x70e8, 0xd6b8, 0x70e0, 0xd6af, - 0x70d8, 0xd6a5, 0x70d0, 0xd69b, 0x70c8, 0xd692, 0x70c0, 0xd688, - 0x70b8, 0xd67f, 0x70af, 0xd675, 0x70a7, 0xd66c, 0x709f, 0xd662, - 0x7097, 0xd659, 0x708f, 0xd64f, 0x7087, 0xd645, 0x707e, 0xd63c, - 0x7076, 0xd632, 0x706e, 0xd629, 0x7066, 0xd61f, 0x705d, 0xd616, - 0x7055, 0xd60c, 0x704d, 0xd603, 0x7045, 0xd5f9, 0x703c, 0xd5f0, - 0x7034, 0xd5e6, 0x702c, 0xd5dd, 0x7024, 0xd5d4, 0x701b, 0xd5ca, - 0x7013, 0xd5c1, 0x700b, 0xd5b7, 0x7002, 0xd5ae, 0x6ffa, 0xd5a4, - 0x6ff2, 0xd59b, 0x6fea, 0xd592, 0x6fe1, 0xd588, 0x6fd9, 0xd57f, - 0x6fd0, 0xd575, 0x6fc8, 0xd56c, 0x6fc0, 0xd563, 0x6fb7, 0xd559, - 0x6faf, 0xd550, 0x6fa7, 0xd547, 0x6f9e, 0xd53d, 0x6f96, 0xd534, - 0x6f8d, 0xd52a, 0x6f85, 0xd521, 0x6f7d, 0xd518, 0x6f74, 0xd50e, - 0x6f6c, 0xd505, 0x6f63, 0xd4fc, 0x6f5b, 0xd4f3, 0x6f52, 0xd4e9, - 0x6f4a, 0xd4e0, 0x6f41, 0xd4d7, 0x6f39, 0xd4cd, 0x6f30, 0xd4c4, - 0x6f28, 0xd4bb, 0x6f20, 0xd4b2, 0x6f17, 0xd4a8, 0x6f0e, 0xd49f, - 0x6f06, 0xd496, 0x6efd, 0xd48d, 0x6ef5, 0xd483, 0x6eec, 0xd47a, - 0x6ee4, 0xd471, 0x6edb, 0xd468, 0x6ed3, 0xd45f, 0x6eca, 0xd455, - 0x6ec2, 0xd44c, 0x6eb9, 0xd443, 0x6eb0, 0xd43a, 0x6ea8, 0xd431, - 0x6e9f, 0xd428, 0x6e97, 0xd41e, 0x6e8e, 0xd415, 0x6e85, 0xd40c, - 0x6e7d, 0xd403, 0x6e74, 0xd3fa, 0x6e6b, 0xd3f1, 0x6e63, 0xd3e8, - 0x6e5a, 0xd3df, 0x6e51, 0xd3d5, 0x6e49, 0xd3cc, 0x6e40, 0xd3c3, - 0x6e37, 0xd3ba, 0x6e2f, 0xd3b1, 0x6e26, 0xd3a8, 0x6e1d, 0xd39f, - 0x6e15, 0xd396, 0x6e0c, 0xd38d, 0x6e03, 0xd384, 0x6dfa, 0xd37b, - 0x6df2, 0xd372, 0x6de9, 0xd369, 0x6de0, 0xd360, 0x6dd7, 0xd357, - 0x6dcf, 0xd34e, 0x6dc6, 0xd345, 0x6dbd, 0xd33c, 0x6db4, 0xd333, - 0x6dab, 0xd32a, 0x6da3, 0xd321, 0x6d9a, 0xd318, 0x6d91, 0xd30f, - 0x6d88, 0xd306, 0x6d7f, 0xd2fd, 0x6d76, 0xd2f4, 0x6d6e, 0xd2eb, - 0x6d65, 0xd2e2, 0x6d5c, 0xd2d9, 0x6d53, 0xd2d1, 0x6d4a, 0xd2c8, - 0x6d41, 0xd2bf, 0x6d38, 0xd2b6, 0x6d2f, 0xd2ad, 0x6d27, 0xd2a4, - 0x6d1e, 0xd29b, 0x6d15, 0xd292, 0x6d0c, 0xd28a, 0x6d03, 0xd281, - 0x6cfa, 0xd278, 0x6cf1, 0xd26f, 0x6ce8, 0xd266, 0x6cdf, 0xd25d, - 0x6cd6, 0xd255, 0x6ccd, 0xd24c, 0x6cc4, 0xd243, 0x6cbb, 0xd23a, - 0x6cb2, 0xd231, 0x6ca9, 0xd229, 0x6ca0, 0xd220, 0x6c97, 0xd217, - 0x6c8e, 0xd20e, 0x6c85, 0xd206, 0x6c7c, 0xd1fd, 0x6c73, 0xd1f4, - 0x6c6a, 0xd1eb, 0x6c61, 0xd1e3, 0x6c58, 0xd1da, 0x6c4f, 0xd1d1, - 0x6c46, 0xd1c9, 0x6c3d, 0xd1c0, 0x6c34, 0xd1b7, 0x6c2b, 0xd1af, - 0x6c21, 0xd1a6, 0x6c18, 0xd19d, 0x6c0f, 0xd195, 0x6c06, 0xd18c, - 0x6bfd, 0xd183, 0x6bf4, 0xd17b, 0x6beb, 0xd172, 0x6be2, 0xd169, - 0x6bd8, 0xd161, 0x6bcf, 0xd158, 0x6bc6, 0xd150, 0x6bbd, 0xd147, - 0x6bb4, 0xd13e, 0x6bab, 0xd136, 0x6ba1, 0xd12d, 0x6b98, 0xd125, - 0x6b8f, 0xd11c, 0x6b86, 0xd114, 0x6b7d, 0xd10b, 0x6b73, 0xd103, - 0x6b6a, 0xd0fa, 0x6b61, 0xd0f2, 0x6b58, 0xd0e9, 0x6b4e, 0xd0e0, - 0x6b45, 0xd0d8, 0x6b3c, 0xd0d0, 0x6b33, 0xd0c7, 0x6b29, 0xd0bf, - 0x6b20, 0xd0b6, 0x6b17, 0xd0ae, 0x6b0d, 0xd0a5, 0x6b04, 0xd09d, - 0x6afb, 0xd094, 0x6af2, 0xd08c, 0x6ae8, 0xd083, 0x6adf, 0xd07b, - 0x6ad6, 0xd073, 0x6acc, 0xd06a, 0x6ac3, 0xd062, 0x6ab9, 0xd059, - 0x6ab0, 0xd051, 0x6aa7, 0xd049, 0x6a9d, 0xd040, 0x6a94, 0xd038, - 0x6a8b, 0xd030, 0x6a81, 0xd027, 0x6a78, 0xd01f, 0x6a6e, 0xd016, - 0x6a65, 0xd00e, 0x6a5c, 0xd006, 0x6a52, 0xcffe, 0x6a49, 0xcff5, - 0x6a3f, 0xcfed, 0x6a36, 0xcfe5, 0x6a2c, 0xcfdc, 0x6a23, 0xcfd4, - 0x6a1a, 0xcfcc, 0x6a10, 0xcfc4, 0x6a07, 0xcfbb, 0x69fd, 0xcfb3, - 0x69f4, 0xcfab, 0x69ea, 0xcfa3, 0x69e1, 0xcf9a, 0x69d7, 0xcf92, - 0x69ce, 0xcf8a, 0x69c4, 0xcf82, 0x69bb, 0xcf79, 0x69b1, 0xcf71, - 0x69a7, 0xcf69, 0x699e, 0xcf61, 0x6994, 0xcf59, 0x698b, 0xcf51, - 0x6981, 0xcf48, 0x6978, 0xcf40, 0x696e, 0xcf38, 0x6965, 0xcf30, - 0x695b, 0xcf28, 0x6951, 0xcf20, 0x6948, 0xcf18, 0x693e, 0xcf10, - 0x6935, 0xcf07, 0x692b, 0xceff, 0x6921, 0xcef7, 0x6918, 0xceef, - 0x690e, 0xcee7, 0x6904, 0xcedf, 0x68fb, 0xced7, 0x68f1, 0xcecf, - 0x68e7, 0xcec7, 0x68de, 0xcebf, 0x68d4, 0xceb7, 0x68ca, 0xceaf, - 0x68c1, 0xcea7, 0x68b7, 0xce9f, 0x68ad, 0xce97, 0x68a4, 0xce8f, - 0x689a, 0xce87, 0x6890, 0xce7f, 0x6886, 0xce77, 0x687d, 0xce6f, - 0x6873, 0xce67, 0x6869, 0xce5f, 0x6860, 0xce57, 0x6856, 0xce4f, - 0x684c, 0xce47, 0x6842, 0xce40, 0x6838, 0xce38, 0x682f, 0xce30, - 0x6825, 0xce28, 0x681b, 0xce20, 0x6811, 0xce18, 0x6808, 0xce10, - 0x67fe, 0xce08, 0x67f4, 0xce01, 0x67ea, 0xcdf9, 0x67e0, 0xcdf1, - 0x67d6, 0xcde9, 0x67cd, 0xcde1, 0x67c3, 0xcdd9, 0x67b9, 0xcdd2, - 0x67af, 0xcdca, 0x67a5, 0xcdc2, 0x679b, 0xcdba, 0x6791, 0xcdb2, - 0x6788, 0xcdab, 0x677e, 0xcda3, 0x6774, 0xcd9b, 0x676a, 0xcd93, - 0x6760, 0xcd8c, 0x6756, 0xcd84, 0x674c, 0xcd7c, 0x6742, 0xcd75, - 0x6738, 0xcd6d, 0x672e, 0xcd65, 0x6724, 0xcd5d, 0x671a, 0xcd56, - 0x6711, 0xcd4e, 0x6707, 0xcd46, 0x66fd, 0xcd3f, 0x66f3, 0xcd37, - 0x66e9, 0xcd30, 0x66df, 0xcd28, 0x66d5, 0xcd20, 0x66cb, 0xcd19, - 0x66c1, 0xcd11, 0x66b7, 0xcd09, 0x66ad, 0xcd02, 0x66a3, 0xccfa, - 0x6699, 0xccf3, 0x668f, 0xcceb, 0x6685, 0xcce3, 0x667b, 0xccdc, - 0x6671, 0xccd4, 0x6666, 0xcccd, 0x665c, 0xccc5, 0x6652, 0xccbe, - 0x6648, 0xccb6, 0x663e, 0xccaf, 0x6634, 0xcca7, 0x662a, 0xcca0, - 0x6620, 0xcc98, 0x6616, 0xcc91, 0x660c, 0xcc89, 0x6602, 0xcc82, - 0x65f8, 0xcc7a, 0x65ed, 0xcc73, 0x65e3, 0xcc6b, 0x65d9, 0xcc64, - 0x65cf, 0xcc5d, 0x65c5, 0xcc55, 0x65bb, 0xcc4e, 0x65b1, 0xcc46, - 0x65a6, 0xcc3f, 0x659c, 0xcc38, 0x6592, 0xcc30, 0x6588, 0xcc29, - 0x657e, 0xcc21, 0x6574, 0xcc1a, 0x6569, 0xcc13, 0x655f, 0xcc0b, - 0x6555, 0xcc04, 0x654b, 0xcbfd, 0x6541, 0xcbf5, 0x6536, 0xcbee, - 0x652c, 0xcbe7, 0x6522, 0xcbe0, 0x6518, 0xcbd8, 0x650d, 0xcbd1, - 0x6503, 0xcbca, 0x64f9, 0xcbc2, 0x64ef, 0xcbbb, 0x64e4, 0xcbb4, - 0x64da, 0xcbad, 0x64d0, 0xcba5, 0x64c5, 0xcb9e, 0x64bb, 0xcb97, - 0x64b1, 0xcb90, 0x64a7, 0xcb89, 0x649c, 0xcb81, 0x6492, 0xcb7a, - 0x6488, 0xcb73, 0x647d, 0xcb6c, 0x6473, 0xcb65, 0x6469, 0xcb5e, - 0x645e, 0xcb56, 0x6454, 0xcb4f, 0x644a, 0xcb48, 0x643f, 0xcb41, - 0x6435, 0xcb3a, 0x642b, 0xcb33, 0x6420, 0xcb2c, 0x6416, 0xcb25, - 0x640b, 0xcb1e, 0x6401, 0xcb16, 0x63f7, 0xcb0f, 0x63ec, 0xcb08, - 0x63e2, 0xcb01, 0x63d7, 0xcafa, 0x63cd, 0xcaf3, 0x63c3, 0xcaec, - 0x63b8, 0xcae5, 0x63ae, 0xcade, 0x63a3, 0xcad7, 0x6399, 0xcad0, - 0x638e, 0xcac9, 0x6384, 0xcac2, 0x637a, 0xcabb, 0x636f, 0xcab4, - 0x6365, 0xcaad, 0x635a, 0xcaa6, 0x6350, 0xca9f, 0x6345, 0xca99, - 0x633b, 0xca92, 0x6330, 0xca8b, 0x6326, 0xca84, 0x631b, 0xca7d, - 0x6311, 0xca76, 0x6306, 0xca6f, 0x62fc, 0xca68, 0x62f1, 0xca61, - 0x62e7, 0xca5b, 0x62dc, 0xca54, 0x62d2, 0xca4d, 0x62c7, 0xca46, - 0x62bc, 0xca3f, 0x62b2, 0xca38, 0x62a7, 0xca32, 0x629d, 0xca2b, - 0x6292, 0xca24, 0x6288, 0xca1d, 0x627d, 0xca16, 0x6272, 0xca10, - 0x6268, 0xca09, 0x625d, 0xca02, 0x6253, 0xc9fb, 0x6248, 0xc9f5, - 0x623d, 0xc9ee, 0x6233, 0xc9e7, 0x6228, 0xc9e0, 0x621e, 0xc9da, - 0x6213, 0xc9d3, 0x6208, 0xc9cc, 0x61fe, 0xc9c6, 0x61f3, 0xc9bf, - 0x61e8, 0xc9b8, 0x61de, 0xc9b2, 0x61d3, 0xc9ab, 0x61c8, 0xc9a4, - 0x61be, 0xc99e, 0x61b3, 0xc997, 0x61a8, 0xc991, 0x619e, 0xc98a, - 0x6193, 0xc983, 0x6188, 0xc97d, 0x617d, 0xc976, 0x6173, 0xc970, - 0x6168, 0xc969, 0x615d, 0xc963, 0x6153, 0xc95c, 0x6148, 0xc955, - 0x613d, 0xc94f, 0x6132, 0xc948, 0x6128, 0xc942, 0x611d, 0xc93b, - 0x6112, 0xc935, 0x6107, 0xc92e, 0x60fd, 0xc928, 0x60f2, 0xc921, - 0x60e7, 0xc91b, 0x60dc, 0xc915, 0x60d1, 0xc90e, 0x60c7, 0xc908, - 0x60bc, 0xc901, 0x60b1, 0xc8fb, 0x60a6, 0xc8f4, 0x609b, 0xc8ee, - 0x6091, 0xc8e8, 0x6086, 0xc8e1, 0x607b, 0xc8db, 0x6070, 0xc8d4, - 0x6065, 0xc8ce, 0x605b, 0xc8c8, 0x6050, 0xc8c1, 0x6045, 0xc8bb, - 0x603a, 0xc8b5, 0x602f, 0xc8ae, 0x6024, 0xc8a8, 0x6019, 0xc8a2, - 0x600f, 0xc89b, 0x6004, 0xc895, 0x5ff9, 0xc88f, 0x5fee, 0xc889, - 0x5fe3, 0xc882, 0x5fd8, 0xc87c, 0x5fcd, 0xc876, 0x5fc2, 0xc870, - 0x5fb7, 0xc869, 0x5fac, 0xc863, 0x5fa2, 0xc85d, 0x5f97, 0xc857, - 0x5f8c, 0xc850, 0x5f81, 0xc84a, 0x5f76, 0xc844, 0x5f6b, 0xc83e, - 0x5f60, 0xc838, 0x5f55, 0xc832, 0x5f4a, 0xc82b, 0x5f3f, 0xc825, - 0x5f34, 0xc81f, 0x5f29, 0xc819, 0x5f1e, 0xc813, 0x5f13, 0xc80d, - 0x5f08, 0xc807, 0x5efd, 0xc801, 0x5ef2, 0xc7fb, 0x5ee7, 0xc7f5, - 0x5edc, 0xc7ee, 0x5ed1, 0xc7e8, 0x5ec6, 0xc7e2, 0x5ebb, 0xc7dc, - 0x5eb0, 0xc7d6, 0x5ea5, 0xc7d0, 0x5e9a, 0xc7ca, 0x5e8f, 0xc7c4, - 0x5e84, 0xc7be, 0x5e79, 0xc7b8, 0x5e6e, 0xc7b2, 0x5e63, 0xc7ac, - 0x5e58, 0xc7a6, 0x5e4d, 0xc7a0, 0x5e42, 0xc79a, 0x5e36, 0xc795, - 0x5e2b, 0xc78f, 0x5e20, 0xc789, 0x5e15, 0xc783, 0x5e0a, 0xc77d, - 0x5dff, 0xc777, 0x5df4, 0xc771, 0x5de9, 0xc76b, 0x5dde, 0xc765, - 0x5dd3, 0xc75f, 0x5dc7, 0xc75a, 0x5dbc, 0xc754, 0x5db1, 0xc74e, - 0x5da6, 0xc748, 0x5d9b, 0xc742, 0x5d90, 0xc73d, 0x5d85, 0xc737, - 0x5d79, 0xc731, 0x5d6e, 0xc72b, 0x5d63, 0xc725, 0x5d58, 0xc720, - 0x5d4d, 0xc71a, 0x5d42, 0xc714, 0x5d36, 0xc70e, 0x5d2b, 0xc709, - 0x5d20, 0xc703, 0x5d15, 0xc6fd, 0x5d0a, 0xc6f7, 0x5cff, 0xc6f2, - 0x5cf3, 0xc6ec, 0x5ce8, 0xc6e6, 0x5cdd, 0xc6e1, 0x5cd2, 0xc6db, - 0x5cc6, 0xc6d5, 0x5cbb, 0xc6d0, 0x5cb0, 0xc6ca, 0x5ca5, 0xc6c5, - 0x5c99, 0xc6bf, 0x5c8e, 0xc6b9, 0x5c83, 0xc6b4, 0x5c78, 0xc6ae, - 0x5c6c, 0xc6a8, 0x5c61, 0xc6a3, 0x5c56, 0xc69d, 0x5c4b, 0xc698, - 0x5c3f, 0xc692, 0x5c34, 0xc68d, 0x5c29, 0xc687, 0x5c1e, 0xc682, - 0x5c12, 0xc67c, 0x5c07, 0xc677, 0x5bfc, 0xc671, 0x5bf0, 0xc66c, - 0x5be5, 0xc666, 0x5bda, 0xc661, 0x5bce, 0xc65b, 0x5bc3, 0xc656, - 0x5bb8, 0xc650, 0x5bac, 0xc64b, 0x5ba1, 0xc645, 0x5b96, 0xc640, - 0x5b8a, 0xc63b, 0x5b7f, 0xc635, 0x5b74, 0xc630, 0x5b68, 0xc62a, - 0x5b5d, 0xc625, 0x5b52, 0xc620, 0x5b46, 0xc61a, 0x5b3b, 0xc615, - 0x5b30, 0xc610, 0x5b24, 0xc60a, 0x5b19, 0xc605, 0x5b0d, 0xc600, - 0x5b02, 0xc5fa, 0x5af7, 0xc5f5, 0x5aeb, 0xc5f0, 0x5ae0, 0xc5ea, - 0x5ad4, 0xc5e5, 0x5ac9, 0xc5e0, 0x5abe, 0xc5db, 0x5ab2, 0xc5d5, - 0x5aa7, 0xc5d0, 0x5a9b, 0xc5cb, 0x5a90, 0xc5c6, 0x5a84, 0xc5c1, - 0x5a79, 0xc5bb, 0x5a6e, 0xc5b6, 0x5a62, 0xc5b1, 0x5a57, 0xc5ac, - 0x5a4b, 0xc5a7, 0x5a40, 0xc5a1, 0x5a34, 0xc59c, 0x5a29, 0xc597, - 0x5a1d, 0xc592, 0x5a12, 0xc58d, 0x5a06, 0xc588, 0x59fb, 0xc583, - 0x59ef, 0xc57e, 0x59e4, 0xc578, 0x59d8, 0xc573, 0x59cd, 0xc56e, - 0x59c1, 0xc569, 0x59b6, 0xc564, 0x59aa, 0xc55f, 0x599f, 0xc55a, - 0x5993, 0xc555, 0x5988, 0xc550, 0x597c, 0xc54b, 0x5971, 0xc546, - 0x5965, 0xc541, 0x595a, 0xc53c, 0x594e, 0xc537, 0x5943, 0xc532, - 0x5937, 0xc52d, 0x592c, 0xc528, 0x5920, 0xc523, 0x5914, 0xc51e, - 0x5909, 0xc51a, 0x58fd, 0xc515, 0x58f2, 0xc510, 0x58e6, 0xc50b, - 0x58db, 0xc506, 0x58cf, 0xc501, 0x58c3, 0xc4fc, 0x58b8, 0xc4f7, - 0x58ac, 0xc4f2, 0x58a1, 0xc4ee, 0x5895, 0xc4e9, 0x5889, 0xc4e4, - 0x587e, 0xc4df, 0x5872, 0xc4da, 0x5867, 0xc4d6, 0x585b, 0xc4d1, - 0x584f, 0xc4cc, 0x5844, 0xc4c7, 0x5838, 0xc4c2, 0x582d, 0xc4be, - 0x5821, 0xc4b9, 0x5815, 0xc4b4, 0x580a, 0xc4b0, 0x57fe, 0xc4ab, - 0x57f2, 0xc4a6, 0x57e7, 0xc4a1, 0x57db, 0xc49d, 0x57cf, 0xc498, - 0x57c4, 0xc493, 0x57b8, 0xc48f, 0x57ac, 0xc48a, 0x57a1, 0xc485, - 0x5795, 0xc481, 0x5789, 0xc47c, 0x577e, 0xc478, 0x5772, 0xc473, - 0x5766, 0xc46e, 0x575b, 0xc46a, 0x574f, 0xc465, 0x5743, 0xc461, - 0x5737, 0xc45c, 0x572c, 0xc457, 0x5720, 0xc453, 0x5714, 0xc44e, - 0x5709, 0xc44a, 0x56fd, 0xc445, 0x56f1, 0xc441, 0x56e5, 0xc43c, - 0x56da, 0xc438, 0x56ce, 0xc433, 0x56c2, 0xc42f, 0x56b6, 0xc42a, - 0x56ab, 0xc426, 0x569f, 0xc422, 0x5693, 0xc41d, 0x5687, 0xc419, - 0x567c, 0xc414, 0x5670, 0xc410, 0x5664, 0xc40b, 0x5658, 0xc407, - 0x564c, 0xc403, 0x5641, 0xc3fe, 0x5635, 0xc3fa, 0x5629, 0xc3f6, - 0x561d, 0xc3f1, 0x5612, 0xc3ed, 0x5606, 0xc3e9, 0x55fa, 0xc3e4, - 0x55ee, 0xc3e0, 0x55e2, 0xc3dc, 0x55d7, 0xc3d7, 0x55cb, 0xc3d3, - 0x55bf, 0xc3cf, 0x55b3, 0xc3ca, 0x55a7, 0xc3c6, 0x559b, 0xc3c2, - 0x5590, 0xc3be, 0x5584, 0xc3ba, 0x5578, 0xc3b5, 0x556c, 0xc3b1, - 0x5560, 0xc3ad, 0x5554, 0xc3a9, 0x5549, 0xc3a5, 0x553d, 0xc3a0, - 0x5531, 0xc39c, 0x5525, 0xc398, 0x5519, 0xc394, 0x550d, 0xc390, - 0x5501, 0xc38c, 0x54f6, 0xc387, 0x54ea, 0xc383, 0x54de, 0xc37f, - 0x54d2, 0xc37b, 0x54c6, 0xc377, 0x54ba, 0xc373, 0x54ae, 0xc36f, - 0x54a2, 0xc36b, 0x5496, 0xc367, 0x548b, 0xc363, 0x547f, 0xc35f, - 0x5473, 0xc35b, 0x5467, 0xc357, 0x545b, 0xc353, 0x544f, 0xc34f, - 0x5443, 0xc34b, 0x5437, 0xc347, 0x542b, 0xc343, 0x541f, 0xc33f, - 0x5413, 0xc33b, 0x5407, 0xc337, 0x53fb, 0xc333, 0x53f0, 0xc32f, - 0x53e4, 0xc32b, 0x53d8, 0xc327, 0x53cc, 0xc323, 0x53c0, 0xc320, - 0x53b4, 0xc31c, 0x53a8, 0xc318, 0x539c, 0xc314, 0x5390, 0xc310, - 0x5384, 0xc30c, 0x5378, 0xc308, 0x536c, 0xc305, 0x5360, 0xc301, - 0x5354, 0xc2fd, 0x5348, 0xc2f9, 0x533c, 0xc2f5, 0x5330, 0xc2f2, - 0x5324, 0xc2ee, 0x5318, 0xc2ea, 0x530c, 0xc2e6, 0x5300, 0xc2e3, - 0x52f4, 0xc2df, 0x52e8, 0xc2db, 0x52dc, 0xc2d8, 0x52d0, 0xc2d4, - 0x52c4, 0xc2d0, 0x52b8, 0xc2cc, 0x52ac, 0xc2c9, 0x52a0, 0xc2c5, - 0x5294, 0xc2c1, 0x5288, 0xc2be, 0x527c, 0xc2ba, 0x5270, 0xc2b7, - 0x5264, 0xc2b3, 0x5258, 0xc2af, 0x524c, 0xc2ac, 0x5240, 0xc2a8, - 0x5234, 0xc2a5, 0x5228, 0xc2a1, 0x521c, 0xc29d, 0x5210, 0xc29a, - 0x5204, 0xc296, 0x51f7, 0xc293, 0x51eb, 0xc28f, 0x51df, 0xc28c, - 0x51d3, 0xc288, 0x51c7, 0xc285, 0x51bb, 0xc281, 0x51af, 0xc27e, - 0x51a3, 0xc27a, 0x5197, 0xc277, 0x518b, 0xc273, 0x517f, 0xc270, - 0x5173, 0xc26d, 0x5167, 0xc269, 0x515a, 0xc266, 0x514e, 0xc262, - 0x5142, 0xc25f, 0x5136, 0xc25c, 0x512a, 0xc258, 0x511e, 0xc255, - 0x5112, 0xc251, 0x5106, 0xc24e, 0x50fa, 0xc24b, 0x50ed, 0xc247, - 0x50e1, 0xc244, 0x50d5, 0xc241, 0x50c9, 0xc23e, 0x50bd, 0xc23a, - 0x50b1, 0xc237, 0x50a5, 0xc234, 0x5099, 0xc230, 0x508c, 0xc22d, - 0x5080, 0xc22a, 0x5074, 0xc227, 0x5068, 0xc223, 0x505c, 0xc220, - 0x5050, 0xc21d, 0x5044, 0xc21a, 0x5037, 0xc217, 0x502b, 0xc213, - 0x501f, 0xc210, 0x5013, 0xc20d, 0x5007, 0xc20a, 0x4ffb, 0xc207, - 0x4fee, 0xc204, 0x4fe2, 0xc201, 0x4fd6, 0xc1fd, 0x4fca, 0xc1fa, - 0x4fbe, 0xc1f7, 0x4fb2, 0xc1f4, 0x4fa5, 0xc1f1, 0x4f99, 0xc1ee, - 0x4f8d, 0xc1eb, 0x4f81, 0xc1e8, 0x4f75, 0xc1e5, 0x4f68, 0xc1e2, - 0x4f5c, 0xc1df, 0x4f50, 0xc1dc, 0x4f44, 0xc1d9, 0x4f38, 0xc1d6, - 0x4f2b, 0xc1d3, 0x4f1f, 0xc1d0, 0x4f13, 0xc1cd, 0x4f07, 0xc1ca, - 0x4efb, 0xc1c7, 0x4eee, 0xc1c4, 0x4ee2, 0xc1c1, 0x4ed6, 0xc1be, - 0x4eca, 0xc1bb, 0x4ebd, 0xc1b8, 0x4eb1, 0xc1b6, 0x4ea5, 0xc1b3, - 0x4e99, 0xc1b0, 0x4e8c, 0xc1ad, 0x4e80, 0xc1aa, 0x4e74, 0xc1a7, - 0x4e68, 0xc1a4, 0x4e5c, 0xc1a2, 0x4e4f, 0xc19f, 0x4e43, 0xc19c, - 0x4e37, 0xc199, 0x4e2b, 0xc196, 0x4e1e, 0xc194, 0x4e12, 0xc191, - 0x4e06, 0xc18e, 0x4df9, 0xc18b, 0x4ded, 0xc189, 0x4de1, 0xc186, - 0x4dd5, 0xc183, 0x4dc8, 0xc180, 0x4dbc, 0xc17e, 0x4db0, 0xc17b, - 0x4da4, 0xc178, 0x4d97, 0xc176, 0x4d8b, 0xc173, 0x4d7f, 0xc170, - 0x4d72, 0xc16e, 0x4d66, 0xc16b, 0x4d5a, 0xc168, 0x4d4e, 0xc166, - 0x4d41, 0xc163, 0x4d35, 0xc161, 0x4d29, 0xc15e, 0x4d1c, 0xc15b, - 0x4d10, 0xc159, 0x4d04, 0xc156, 0x4cf8, 0xc154, 0x4ceb, 0xc151, - 0x4cdf, 0xc14f, 0x4cd3, 0xc14c, 0x4cc6, 0xc14a, 0x4cba, 0xc147, - 0x4cae, 0xc145, 0x4ca1, 0xc142, 0x4c95, 0xc140, 0x4c89, 0xc13d, - 0x4c7c, 0xc13b, 0x4c70, 0xc138, 0x4c64, 0xc136, 0x4c57, 0xc134, - 0x4c4b, 0xc131, 0x4c3f, 0xc12f, 0x4c32, 0xc12c, 0x4c26, 0xc12a, - 0x4c1a, 0xc128, 0x4c0d, 0xc125, 0x4c01, 0xc123, 0x4bf5, 0xc120, - 0x4be8, 0xc11e, 0x4bdc, 0xc11c, 0x4bd0, 0xc119, 0x4bc3, 0xc117, - 0x4bb7, 0xc115, 0x4bab, 0xc113, 0x4b9e, 0xc110, 0x4b92, 0xc10e, - 0x4b85, 0xc10c, 0x4b79, 0xc109, 0x4b6d, 0xc107, 0x4b60, 0xc105, - 0x4b54, 0xc103, 0x4b48, 0xc100, 0x4b3b, 0xc0fe, 0x4b2f, 0xc0fc, - 0x4b23, 0xc0fa, 0x4b16, 0xc0f8, 0x4b0a, 0xc0f6, 0x4afd, 0xc0f3, - 0x4af1, 0xc0f1, 0x4ae5, 0xc0ef, 0x4ad8, 0xc0ed, 0x4acc, 0xc0eb, - 0x4ac0, 0xc0e9, 0x4ab3, 0xc0e7, 0x4aa7, 0xc0e4, 0x4a9a, 0xc0e2, - 0x4a8e, 0xc0e0, 0x4a82, 0xc0de, 0x4a75, 0xc0dc, 0x4a69, 0xc0da, - 0x4a5c, 0xc0d8, 0x4a50, 0xc0d6, 0x4a44, 0xc0d4, 0x4a37, 0xc0d2, - 0x4a2b, 0xc0d0, 0x4a1e, 0xc0ce, 0x4a12, 0xc0cc, 0x4a06, 0xc0ca, - 0x49f9, 0xc0c8, 0x49ed, 0xc0c6, 0x49e0, 0xc0c4, 0x49d4, 0xc0c2, - 0x49c7, 0xc0c0, 0x49bb, 0xc0be, 0x49af, 0xc0bd, 0x49a2, 0xc0bb, - 0x4996, 0xc0b9, 0x4989, 0xc0b7, 0x497d, 0xc0b5, 0x4970, 0xc0b3, - 0x4964, 0xc0b1, 0x4958, 0xc0af, 0x494b, 0xc0ae, 0x493f, 0xc0ac, - 0x4932, 0xc0aa, 0x4926, 0xc0a8, 0x4919, 0xc0a6, 0x490d, 0xc0a5, - 0x4901, 0xc0a3, 0x48f4, 0xc0a1, 0x48e8, 0xc09f, 0x48db, 0xc09e, - 0x48cf, 0xc09c, 0x48c2, 0xc09a, 0x48b6, 0xc098, 0x48a9, 0xc097, - 0x489d, 0xc095, 0x4891, 0xc093, 0x4884, 0xc092, 0x4878, 0xc090, - 0x486b, 0xc08e, 0x485f, 0xc08d, 0x4852, 0xc08b, 0x4846, 0xc089, - 0x4839, 0xc088, 0x482d, 0xc086, 0x4820, 0xc085, 0x4814, 0xc083, - 0x4807, 0xc081, 0x47fb, 0xc080, 0x47ef, 0xc07e, 0x47e2, 0xc07d, - 0x47d6, 0xc07b, 0x47c9, 0xc07a, 0x47bd, 0xc078, 0x47b0, 0xc077, - 0x47a4, 0xc075, 0x4797, 0xc074, 0x478b, 0xc072, 0x477e, 0xc071, - 0x4772, 0xc06f, 0x4765, 0xc06e, 0x4759, 0xc06c, 0x474c, 0xc06b, - 0x4740, 0xc069, 0x4733, 0xc068, 0x4727, 0xc067, 0x471a, 0xc065, - 0x470e, 0xc064, 0x4701, 0xc062, 0x46f5, 0xc061, 0x46e8, 0xc060, - 0x46dc, 0xc05e, 0x46cf, 0xc05d, 0x46c3, 0xc05c, 0x46b6, 0xc05a, - 0x46aa, 0xc059, 0x469d, 0xc058, 0x4691, 0xc056, 0x4684, 0xc055, - 0x4678, 0xc054, 0x466b, 0xc053, 0x465f, 0xc051, 0x4652, 0xc050, - 0x4646, 0xc04f, 0x4639, 0xc04e, 0x462d, 0xc04c, 0x4620, 0xc04b, - 0x4614, 0xc04a, 0x4607, 0xc049, 0x45fb, 0xc048, 0x45ee, 0xc047, - 0x45e2, 0xc045, 0x45d5, 0xc044, 0x45c9, 0xc043, 0x45bc, 0xc042, - 0x45b0, 0xc041, 0x45a3, 0xc040, 0x4597, 0xc03f, 0x458a, 0xc03d, - 0x457e, 0xc03c, 0x4571, 0xc03b, 0x4565, 0xc03a, 0x4558, 0xc039, - 0x454c, 0xc038, 0x453f, 0xc037, 0x4533, 0xc036, 0x4526, 0xc035, - 0x451a, 0xc034, 0x450d, 0xc033, 0x4500, 0xc032, 0x44f4, 0xc031, - 0x44e7, 0xc030, 0x44db, 0xc02f, 0x44ce, 0xc02e, 0x44c2, 0xc02d, - 0x44b5, 0xc02c, 0x44a9, 0xc02b, 0x449c, 0xc02b, 0x4490, 0xc02a, - 0x4483, 0xc029, 0x4477, 0xc028, 0x446a, 0xc027, 0x445e, 0xc026, - 0x4451, 0xc025, 0x4444, 0xc024, 0x4438, 0xc024, 0x442b, 0xc023, - 0x441f, 0xc022, 0x4412, 0xc021, 0x4406, 0xc020, 0x43f9, 0xc020, - 0x43ed, 0xc01f, 0x43e0, 0xc01e, 0x43d4, 0xc01d, 0x43c7, 0xc01d, - 0x43bb, 0xc01c, 0x43ae, 0xc01b, 0x43a1, 0xc01a, 0x4395, 0xc01a, - 0x4388, 0xc019, 0x437c, 0xc018, 0x436f, 0xc018, 0x4363, 0xc017, - 0x4356, 0xc016, 0x434a, 0xc016, 0x433d, 0xc015, 0x4330, 0xc014, - 0x4324, 0xc014, 0x4317, 0xc013, 0x430b, 0xc013, 0x42fe, 0xc012, - 0x42f2, 0xc011, 0x42e5, 0xc011, 0x42d9, 0xc010, 0x42cc, 0xc010, - 0x42c0, 0xc00f, 0x42b3, 0xc00f, 0x42a6, 0xc00e, 0x429a, 0xc00e, - 0x428d, 0xc00d, 0x4281, 0xc00d, 0x4274, 0xc00c, 0x4268, 0xc00c, - 0x425b, 0xc00b, 0x424e, 0xc00b, 0x4242, 0xc00a, 0x4235, 0xc00a, - 0x4229, 0xc009, 0x421c, 0xc009, 0x4210, 0xc009, 0x4203, 0xc008, - 0x41f7, 0xc008, 0x41ea, 0xc007, 0x41dd, 0xc007, 0x41d1, 0xc007, - 0x41c4, 0xc006, 0x41b8, 0xc006, 0x41ab, 0xc006, 0x419f, 0xc005, - 0x4192, 0xc005, 0x4186, 0xc005, 0x4179, 0xc004, 0x416c, 0xc004, - 0x4160, 0xc004, 0x4153, 0xc004, 0x4147, 0xc003, 0x413a, 0xc003, - 0x412e, 0xc003, 0x4121, 0xc003, 0x4114, 0xc002, 0x4108, 0xc002, - 0x40fb, 0xc002, 0x40ef, 0xc002, 0x40e2, 0xc002, 0x40d6, 0xc001, - 0x40c9, 0xc001, 0x40bc, 0xc001, 0x40b0, 0xc001, 0x40a3, 0xc001, - 0x4097, 0xc001, 0x408a, 0xc001, 0x407e, 0xc000, 0x4071, 0xc000, - 0x4065, 0xc000, 0x4058, 0xc000, 0x404b, 0xc000, 0x403f, 0xc000, - 0x4032, 0xc000, 0x4026, 0xc000, 0x4019, 0xc000, 0x400d, 0xc000, -}; - -/** -* @brief Initialization function for the Q15 RFFT/RIFFT. -* @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. -* @param[in] fftLenReal length of the FFT. -* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. -* -* \par Description: -* \par -* The parameter fftLenReal Specifies length of RFFT/RIFFT Process. Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192. -* \par -* The parameter ifftFlagR controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par -* This function also initializes Twiddle factor table. -*/ -arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialize the Real FFT length */ - S->fftLenReal = (uint16_t) fftLenReal; - - /* Initialize the Twiddle coefficientA pointer */ - S->pTwiddleAReal = (q15_t *) realCoefAQ15; - - /* Initialize the Twiddle coefficientB pointer */ - S->pTwiddleBReal = (q15_t *) realCoefBQ15; - - /* Initialize the Flag for selection of RFFT or RIFFT */ - S->ifftFlagR = (uint8_t) ifftFlagR; - - /* Initialize the Flag for calculation Bit reversal or not */ - S->bitReverseFlagR = (uint8_t) bitReverseFlag; - - /* Initialization of coef modifier depending on the FFT length */ - switch (S->fftLenReal) - { - case 8192u: - S->twidCoefRModifier = 1u; - S->pCfft = &arm_cfft_sR_q15_len4096; - break; - case 4096u: - S->twidCoefRModifier = 2u; - S->pCfft = &arm_cfft_sR_q15_len2048; - break; - case 2048u: - S->twidCoefRModifier = 4u; - S->pCfft = &arm_cfft_sR_q15_len1024; - break; - case 1024u: - S->twidCoefRModifier = 8u; - S->pCfft = &arm_cfft_sR_q15_len512; - break; - case 512u: - S->twidCoefRModifier = 16u; - S->pCfft = &arm_cfft_sR_q15_len256; - break; - case 256u: - S->twidCoefRModifier = 32u; - S->pCfft = &arm_cfft_sR_q15_len128; - break; - case 128u: - S->twidCoefRModifier = 64u; - S->pCfft = &arm_cfft_sR_q15_len64; - break; - case 64u: - S->twidCoefRModifier = 128u; - S->pCfft = &arm_cfft_sR_q15_len32; - break; - case 32u: - S->twidCoefRModifier = 256u; - S->pCfft = &arm_cfft_sR_q15_len16; - break; - default: - /* Reporting argument error if rfftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - /* return the status of RFFT Init function */ - return (status); -} - -/** -* @} end of RealFFT group -*/ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c deleted file mode 100644 index ab839d5..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c +++ /dev/null @@ -1,4285 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_init_q31.c -* -* Description: RFFT & RIFFT Q31 initialisation function -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" -#include "arm_common_tables.h" -#include "arm_const_structs.h" - -/** -* @ingroup groupTransforms -*/ - -/** -* @addtogroup RealFFT -* @{ -*/ - -/** -* \par -* Generation fixed-point realCoefAQ31 array in Q31 format: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-* {    
-*    pATable[2 * i] = 0.5 * (1.0 - sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pATable[2 * i + 1] = 0.5 * (-1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-* }
-* \par -* Convert to fixed point Q31 format -* round(pATable[i] * pow(2, 31)) -*/ - - -static const q31_t realCoefAQ31[8192] = { - 0x40000000, 0xc0000000, 0x3ff36f02, 0xc000013c, - 0x3fe6de05, 0xc00004ef, 0x3fda4d09, 0xc0000b1a, - 0x3fcdbc0f, 0xc00013bd, 0x3fc12b16, 0xc0001ed8, - 0x3fb49a1f, 0xc0002c6a, 0x3fa8092c, 0xc0003c74, - 0x3f9b783c, 0xc0004ef5, 0x3f8ee750, 0xc00063ee, - 0x3f825668, 0xc0007b5f, 0x3f75c585, 0xc0009547, - 0x3f6934a8, 0xc000b1a7, 0x3f5ca3d0, 0xc000d07e, - 0x3f5012fe, 0xc000f1ce, 0x3f438234, 0xc0011594, - 0x3f36f170, 0xc0013bd3, 0x3f2a60b4, 0xc0016489, - 0x3f1dd001, 0xc0018fb6, 0x3f113f56, 0xc001bd5c, - 0x3f04aeb5, 0xc001ed78, 0x3ef81e1d, 0xc002200d, - 0x3eeb8d8f, 0xc0025519, 0x3edefd0c, 0xc0028c9c, - 0x3ed26c94, 0xc002c697, 0x3ec5dc28, 0xc003030a, - 0x3eb94bc8, 0xc00341f4, 0x3eacbb74, 0xc0038356, - 0x3ea02b2e, 0xc003c72f, 0x3e939af5, 0xc0040d80, - 0x3e870aca, 0xc0045648, 0x3e7a7aae, 0xc004a188, - 0x3e6deaa1, 0xc004ef3f, 0x3e615aa3, 0xc0053f6e, - 0x3e54cab5, 0xc0059214, 0x3e483ad8, 0xc005e731, - 0x3e3bab0b, 0xc0063ec6, 0x3e2f1b50, 0xc00698d3, - 0x3e228ba7, 0xc006f556, 0x3e15fc11, 0xc0075452, - 0x3e096c8d, 0xc007b5c4, 0x3dfcdd1d, 0xc00819ae, - 0x3df04dc0, 0xc008800f, 0x3de3be78, 0xc008e8e8, - 0x3dd72f45, 0xc0095438, 0x3dcaa027, 0xc009c1ff, - 0x3dbe111e, 0xc00a323d, 0x3db1822c, 0xc00aa4f3, - 0x3da4f351, 0xc00b1a20, 0x3d98648d, 0xc00b91c4, - 0x3d8bd5e1, 0xc00c0be0, 0x3d7f474d, 0xc00c8872, - 0x3d72b8d2, 0xc00d077c, 0x3d662a70, 0xc00d88fd, - 0x3d599c28, 0xc00e0cf5, 0x3d4d0df9, 0xc00e9364, - 0x3d407fe6, 0xc00f1c4a, 0x3d33f1ed, 0xc00fa7a8, - 0x3d276410, 0xc010357c, 0x3d1ad650, 0xc010c5c7, - 0x3d0e48ab, 0xc011588a, 0x3d01bb24, 0xc011edc3, - 0x3cf52dbb, 0xc0128574, 0x3ce8a06f, 0xc0131f9b, - 0x3cdc1342, 0xc013bc39, 0x3ccf8634, 0xc0145b4e, - 0x3cc2f945, 0xc014fcda, 0x3cb66c77, 0xc015a0dd, - 0x3ca9dfc8, 0xc0164757, 0x3c9d533b, 0xc016f047, - 0x3c90c6cf, 0xc0179bae, 0x3c843a85, 0xc018498c, - 0x3c77ae5e, 0xc018f9e1, 0x3c6b2259, 0xc019acac, - 0x3c5e9678, 0xc01a61ee, 0x3c520aba, 0xc01b19a7, - 0x3c457f21, 0xc01bd3d6, 0x3c38f3ac, 0xc01c907c, - 0x3c2c685d, 0xc01d4f99, 0x3c1fdd34, 0xc01e112b, - 0x3c135231, 0xc01ed535, 0x3c06c754, 0xc01f9bb5, - 0x3bfa3c9f, 0xc02064ab, 0x3bedb212, 0xc0213018, - 0x3be127ac, 0xc021fdfb, 0x3bd49d70, 0xc022ce54, - 0x3bc8135c, 0xc023a124, 0x3bbb8973, 0xc024766a, - 0x3baeffb3, 0xc0254e27, 0x3ba2761e, 0xc0262859, - 0x3b95ecb4, 0xc0270502, 0x3b896375, 0xc027e421, - 0x3b7cda63, 0xc028c5b6, 0x3b70517d, 0xc029a9c1, - 0x3b63c8c4, 0xc02a9042, 0x3b574039, 0xc02b7939, - 0x3b4ab7db, 0xc02c64a6, 0x3b3e2fac, 0xc02d5289, - 0x3b31a7ac, 0xc02e42e2, 0x3b251fdc, 0xc02f35b1, - 0x3b18983b, 0xc0302af5, 0x3b0c10cb, 0xc03122b0, - 0x3aff898c, 0xc0321ce0, 0x3af3027e, 0xc0331986, - 0x3ae67ba2, 0xc03418a2, 0x3ad9f4f8, 0xc0351a33, - 0x3acd6e81, 0xc0361e3a, 0x3ac0e83d, 0xc03724b6, - 0x3ab4622d, 0xc0382da8, 0x3aa7dc52, 0xc0393910, - 0x3a9b56ab, 0xc03a46ed, 0x3a8ed139, 0xc03b573f, - 0x3a824bfd, 0xc03c6a07, 0x3a75c6f8, 0xc03d7f44, - 0x3a694229, 0xc03e96f6, 0x3a5cbd91, 0xc03fb11d, - 0x3a503930, 0xc040cdba, 0x3a43b508, 0xc041eccc, - 0x3a373119, 0xc0430e53, 0x3a2aad62, 0xc044324f, - 0x3a1e29e5, 0xc04558c0, 0x3a11a6a3, 0xc04681a6, - 0x3a05239a, 0xc047ad01, 0x39f8a0cd, 0xc048dad1, - 0x39ec1e3b, 0xc04a0b16, 0x39df9be6, 0xc04b3dcf, - 0x39d319cc, 0xc04c72fe, 0x39c697f0, 0xc04daaa1, - 0x39ba1651, 0xc04ee4b8, 0x39ad94f0, 0xc0502145, - 0x39a113cd, 0xc0516045, 0x399492ea, 0xc052a1bb, - 0x39881245, 0xc053e5a5, 0x397b91e1, 0xc0552c03, - 0x396f11bc, 0xc05674d6, 0x396291d9, 0xc057c01d, - 0x39561237, 0xc0590dd8, 0x394992d7, 0xc05a5e07, - 0x393d13b8, 0xc05bb0ab, 0x393094dd, 0xc05d05c3, - 0x39241645, 0xc05e5d4e, 0x391797f0, 0xc05fb74e, - 0x390b19e0, 0xc06113c2, 0x38fe9c15, 0xc06272aa, - 0x38f21e8e, 0xc063d405, 0x38e5a14d, 0xc06537d4, - 0x38d92452, 0xc0669e18, 0x38cca79e, 0xc06806ce, - 0x38c02b31, 0xc06971f9, 0x38b3af0c, 0xc06adf97, - 0x38a7332e, 0xc06c4fa8, 0x389ab799, 0xc06dc22e, - 0x388e3c4d, 0xc06f3726, 0x3881c14b, 0xc070ae92, - 0x38754692, 0xc0722871, 0x3868cc24, 0xc073a4c3, - 0x385c5201, 0xc0752389, 0x384fd829, 0xc076a4c2, - 0x38435e9d, 0xc078286e, 0x3836e55d, 0xc079ae8c, - 0x382a6c6a, 0xc07b371e, 0x381df3c5, 0xc07cc223, - 0x38117b6d, 0xc07e4f9b, 0x38050364, 0xc07fdf85, - 0x37f88ba9, 0xc08171e2, 0x37ec143e, 0xc08306b2, - 0x37df9d22, 0xc0849df4, 0x37d32657, 0xc08637a9, - 0x37c6afdc, 0xc087d3d0, 0x37ba39b3, 0xc089726a, - 0x37adc3db, 0xc08b1376, 0x37a14e55, 0xc08cb6f5, - 0x3794d922, 0xc08e5ce5, 0x37886442, 0xc0900548, - 0x377befb5, 0xc091b01d, 0x376f7b7d, 0xc0935d64, - 0x37630799, 0xc0950d1d, 0x3756940a, 0xc096bf48, - 0x374a20d0, 0xc09873e4, 0x373daded, 0xc09a2af3, - 0x37313b60, 0xc09be473, 0x3724c92a, 0xc09da065, - 0x3718574b, 0xc09f5ec8, 0x370be5c4, 0xc0a11f9d, - 0x36ff7496, 0xc0a2e2e3, 0x36f303c0, 0xc0a4a89b, - 0x36e69344, 0xc0a670c4, 0x36da2321, 0xc0a83b5e, - 0x36cdb359, 0xc0aa086a, 0x36c143ec, 0xc0abd7e6, - 0x36b4d4d9, 0xc0ada9d4, 0x36a86623, 0xc0af7e33, - 0x369bf7c9, 0xc0b15502, 0x368f89cb, 0xc0b32e42, - 0x36831c2b, 0xc0b509f3, 0x3676aee8, 0xc0b6e815, - 0x366a4203, 0xc0b8c8a7, 0x365dd57d, 0xc0baabaa, - 0x36516956, 0xc0bc911d, 0x3644fd8f, 0xc0be7901, - 0x36389228, 0xc0c06355, 0x362c2721, 0xc0c25019, - 0x361fbc7b, 0xc0c43f4d, 0x36135237, 0xc0c630f2, - 0x3606e854, 0xc0c82506, 0x35fa7ed4, 0xc0ca1b8a, - 0x35ee15b7, 0xc0cc147f, 0x35e1acfd, 0xc0ce0fe3, - 0x35d544a7, 0xc0d00db6, 0x35c8dcb6, 0xc0d20dfa, - 0x35bc7529, 0xc0d410ad, 0x35b00e02, 0xc0d615cf, - 0x35a3a740, 0xc0d81d61, 0x359740e5, 0xc0da2762, - 0x358adaf0, 0xc0dc33d2, 0x357e7563, 0xc0de42b2, - 0x3572103d, 0xc0e05401, 0x3565ab80, 0xc0e267be, - 0x3559472b, 0xc0e47deb, 0x354ce33f, 0xc0e69686, - 0x35407fbd, 0xc0e8b190, 0x35341ca5, 0xc0eacf09, - 0x3527b9f7, 0xc0eceef1, 0x351b57b5, 0xc0ef1147, - 0x350ef5de, 0xc0f1360b, 0x35029473, 0xc0f35d3e, - 0x34f63374, 0xc0f586df, 0x34e9d2e3, 0xc0f7b2ee, - 0x34dd72be, 0xc0f9e16b, 0x34d11308, 0xc0fc1257, - 0x34c4b3c0, 0xc0fe45b0, 0x34b854e7, 0xc1007b77, - 0x34abf67e, 0xc102b3ac, 0x349f9884, 0xc104ee4f, - 0x34933afa, 0xc1072b5f, 0x3486dde1, 0xc1096add, - 0x347a8139, 0xc10bacc8, 0x346e2504, 0xc10df120, - 0x3461c940, 0xc11037e6, 0x34556def, 0xc1128119, - 0x34491311, 0xc114ccb9, 0x343cb8a7, 0xc1171ac6, - 0x34305eb0, 0xc1196b3f, 0x3424052f, 0xc11bbe26, - 0x3417ac22, 0xc11e1379, 0x340b538b, 0xc1206b39, - 0x33fefb6a, 0xc122c566, 0x33f2a3bf, 0xc12521ff, - 0x33e64c8c, 0xc1278104, 0x33d9f5cf, 0xc129e276, - 0x33cd9f8b, 0xc12c4653, 0x33c149bf, 0xc12eac9d, - 0x33b4f46c, 0xc1311553, 0x33a89f92, 0xc1338075, - 0x339c4b32, 0xc135ee02, 0x338ff74d, 0xc1385dfb, - 0x3383a3e2, 0xc13ad060, 0x337750f2, 0xc13d4530, - 0x336afe7e, 0xc13fbc6c, 0x335eac86, 0xc1423613, - 0x33525b0b, 0xc144b225, 0x33460a0d, 0xc14730a3, - 0x3339b98d, 0xc149b18b, 0x332d698a, 0xc14c34df, - 0x33211a07, 0xc14eba9d, 0x3314cb02, 0xc15142c6, - 0x33087c7d, 0xc153cd5a, 0x32fc2e77, 0xc1565a58, - 0x32efe0f2, 0xc158e9c1, 0x32e393ef, 0xc15b7b94, - 0x32d7476c, 0xc15e0fd1, 0x32cafb6b, 0xc160a678, - 0x32beafed, 0xc1633f8a, 0x32b264f2, 0xc165db05, - 0x32a61a7a, 0xc16878eb, 0x3299d085, 0xc16b193a, - 0x328d8715, 0xc16dbbf3, 0x32813e2a, 0xc1706115, - 0x3274f5c3, 0xc17308a1, 0x3268ade3, 0xc175b296, - 0x325c6688, 0xc1785ef4, 0x32501fb5, 0xc17b0dbb, - 0x3243d968, 0xc17dbeec, 0x323793a3, 0xc1807285, - 0x322b4e66, 0xc1832888, 0x321f09b1, 0xc185e0f3, - 0x3212c585, 0xc1889bc6, 0x320681e3, 0xc18b5903, - 0x31fa3ecb, 0xc18e18a7, 0x31edfc3d, 0xc190dab4, - 0x31e1ba3a, 0xc1939f29, 0x31d578c2, 0xc1966606, - 0x31c937d6, 0xc1992f4c, 0x31bcf777, 0xc19bfaf9, - 0x31b0b7a4, 0xc19ec90d, 0x31a4785e, 0xc1a1998a, - 0x319839a6, 0xc1a46c6e, 0x318bfb7d, 0xc1a741b9, - 0x317fbde2, 0xc1aa196c, 0x317380d6, 0xc1acf386, - 0x31674459, 0xc1afd007, 0x315b086d, 0xc1b2aef0, - 0x314ecd11, 0xc1b5903f, 0x31429247, 0xc1b873f5, - 0x3136580d, 0xc1bb5a11, 0x312a1e66, 0xc1be4294, - 0x311de551, 0xc1c12d7e, 0x3111accf, 0xc1c41ace, - 0x310574e0, 0xc1c70a84, 0x30f93d86, 0xc1c9fca0, - 0x30ed06bf, 0xc1ccf122, 0x30e0d08d, 0xc1cfe80a, - 0x30d49af1, 0xc1d2e158, 0x30c865ea, 0xc1d5dd0c, - 0x30bc317a, 0xc1d8db25, 0x30affda0, 0xc1dbdba3, - 0x30a3ca5d, 0xc1dede87, 0x309797b2, 0xc1e1e3d0, - 0x308b659f, 0xc1e4eb7e, 0x307f3424, 0xc1e7f591, - 0x30730342, 0xc1eb0209, 0x3066d2fa, 0xc1ee10e5, - 0x305aa34c, 0xc1f12227, 0x304e7438, 0xc1f435cc, - 0x304245c0, 0xc1f74bd6, 0x303617e2, 0xc1fa6445, - 0x3029eaa1, 0xc1fd7f17, 0x301dbdfb, 0xc2009c4e, - 0x301191f3, 0xc203bbe8, 0x30056687, 0xc206dde6, - 0x2ff93bba, 0xc20a0248, 0x2fed118a, 0xc20d290d, - 0x2fe0e7f9, 0xc2105236, 0x2fd4bf08, 0xc2137dc2, - 0x2fc896b5, 0xc216abb1, 0x2fbc6f03, 0xc219dc03, - 0x2fb047f2, 0xc21d0eb8, 0x2fa42181, 0xc22043d0, - 0x2f97fbb2, 0xc2237b4b, 0x2f8bd685, 0xc226b528, - 0x2f7fb1fa, 0xc229f167, 0x2f738e12, 0xc22d3009, - 0x2f676ace, 0xc230710d, 0x2f5b482d, 0xc233b473, - 0x2f4f2630, 0xc236fa3b, 0x2f4304d8, 0xc23a4265, - 0x2f36e426, 0xc23d8cf1, 0x2f2ac419, 0xc240d9de, - 0x2f1ea4b2, 0xc244292c, 0x2f1285f2, 0xc2477adc, - 0x2f0667d9, 0xc24aceed, 0x2efa4a67, 0xc24e255e, - 0x2eee2d9d, 0xc2517e31, 0x2ee2117c, 0xc254d965, - 0x2ed5f604, 0xc25836f9, 0x2ec9db35, 0xc25b96ee, - 0x2ebdc110, 0xc25ef943, 0x2eb1a796, 0xc2625df8, - 0x2ea58ec6, 0xc265c50e, 0x2e9976a1, 0xc2692e83, - 0x2e8d5f29, 0xc26c9a58, 0x2e81485c, 0xc270088e, - 0x2e75323c, 0xc2737922, 0x2e691cc9, 0xc276ec16, - 0x2e5d0804, 0xc27a616a, 0x2e50f3ed, 0xc27dd91c, - 0x2e44e084, 0xc281532e, 0x2e38cdcb, 0xc284cf9f, - 0x2e2cbbc1, 0xc2884e6e, 0x2e20aa67, 0xc28bcf9c, - 0x2e1499bd, 0xc28f5329, 0x2e0889c4, 0xc292d914, - 0x2dfc7a7c, 0xc296615d, 0x2df06be6, 0xc299ec05, - 0x2de45e03, 0xc29d790a, 0x2dd850d2, 0xc2a1086d, - 0x2dcc4454, 0xc2a49a2e, 0x2dc0388a, 0xc2a82e4d, - 0x2db42d74, 0xc2abc4c9, 0x2da82313, 0xc2af5da2, - 0x2d9c1967, 0xc2b2f8d8, 0x2d901070, 0xc2b6966c, - 0x2d84082f, 0xc2ba365c, 0x2d7800a5, 0xc2bdd8a9, - 0x2d6bf9d1, 0xc2c17d52, 0x2d5ff3b5, 0xc2c52459, - 0x2d53ee51, 0xc2c8cdbb, 0x2d47e9a5, 0xc2cc7979, - 0x2d3be5b1, 0xc2d02794, 0x2d2fe277, 0xc2d3d80a, - 0x2d23dff7, 0xc2d78add, 0x2d17de31, 0xc2db400a, - 0x2d0bdd25, 0xc2def794, 0x2cffdcd4, 0xc2e2b178, - 0x2cf3dd3f, 0xc2e66db8, 0x2ce7de66, 0xc2ea2c53, - 0x2cdbe04a, 0xc2eded49, 0x2ccfe2ea, 0xc2f1b099, - 0x2cc3e648, 0xc2f57644, 0x2cb7ea63, 0xc2f93e4a, - 0x2cabef3d, 0xc2fd08a9, 0x2c9ff4d6, 0xc300d563, - 0x2c93fb2e, 0xc304a477, 0x2c880245, 0xc30875e5, - 0x2c7c0a1d, 0xc30c49ad, 0x2c7012b5, 0xc3101fce, - 0x2c641c0e, 0xc313f848, 0x2c582629, 0xc317d31c, - 0x2c4c3106, 0xc31bb049, 0x2c403ca5, 0xc31f8fcf, - 0x2c344908, 0xc32371ae, 0x2c28562d, 0xc32755e5, - 0x2c1c6417, 0xc32b3c75, 0x2c1072c4, 0xc32f255e, - 0x2c048237, 0xc333109e, 0x2bf8926f, 0xc336fe37, - 0x2beca36c, 0xc33aee27, 0x2be0b52f, 0xc33ee070, - 0x2bd4c7ba, 0xc342d510, 0x2bc8db0b, 0xc346cc07, - 0x2bbcef23, 0xc34ac556, 0x2bb10404, 0xc34ec0fc, - 0x2ba519ad, 0xc352bef9, 0x2b99301f, 0xc356bf4d, - 0x2b8d475b, 0xc35ac1f7, 0x2b815f60, 0xc35ec6f8, - 0x2b75782f, 0xc362ce50, 0x2b6991ca, 0xc366d7fd, - 0x2b5dac2f, 0xc36ae401, 0x2b51c760, 0xc36ef25b, - 0x2b45e35d, 0xc373030a, 0x2b3a0027, 0xc377160f, - 0x2b2e1dbe, 0xc37b2b6a, 0x2b223c22, 0xc37f4319, - 0x2b165b54, 0xc3835d1e, 0x2b0a7b54, 0xc3877978, - 0x2afe9c24, 0xc38b9827, 0x2af2bdc3, 0xc38fb92a, - 0x2ae6e031, 0xc393dc82, 0x2adb0370, 0xc398022f, - 0x2acf277f, 0xc39c2a2f, 0x2ac34c60, 0xc3a05484, - 0x2ab77212, 0xc3a4812c, 0x2aab9896, 0xc3a8b028, - 0x2a9fbfed, 0xc3ace178, 0x2a93e817, 0xc3b1151b, - 0x2a881114, 0xc3b54b11, 0x2a7c3ae5, 0xc3b9835a, - 0x2a70658a, 0xc3bdbdf6, 0x2a649105, 0xc3c1fae5, - 0x2a58bd54, 0xc3c63a26, 0x2a4cea79, 0xc3ca7bba, - 0x2a411874, 0xc3cebfa0, 0x2a354746, 0xc3d305d8, - 0x2a2976ef, 0xc3d74e62, 0x2a1da770, 0xc3db993e, - 0x2a11d8c8, 0xc3dfe66c, 0x2a060af9, 0xc3e435ea, - 0x29fa3e03, 0xc3e887bb, 0x29ee71e6, 0xc3ecdbdc, - 0x29e2a6a3, 0xc3f1324e, 0x29d6dc3b, 0xc3f58b10, - 0x29cb12ad, 0xc3f9e624, 0x29bf49fa, 0xc3fe4388, - 0x29b38223, 0xc402a33c, 0x29a7bb28, 0xc4070540, - 0x299bf509, 0xc40b6994, 0x29902fc7, 0xc40fd037, - 0x29846b63, 0xc414392b, 0x2978a7dd, 0xc418a46d, - 0x296ce535, 0xc41d11ff, 0x2961236c, 0xc42181e0, - 0x29556282, 0xc425f410, 0x2949a278, 0xc42a688f, - 0x293de34e, 0xc42edf5c, 0x29322505, 0xc4335877, - 0x2926679c, 0xc437d3e1, 0x291aab16, 0xc43c5199, - 0x290eef71, 0xc440d19e, 0x290334af, 0xc44553f2, - 0x28f77acf, 0xc449d892, 0x28ebc1d3, 0xc44e5f80, - 0x28e009ba, 0xc452e8bc, 0x28d45286, 0xc4577444, - 0x28c89c37, 0xc45c0219, 0x28bce6cd, 0xc460923b, - 0x28b13248, 0xc46524a9, 0x28a57ea9, 0xc469b963, - 0x2899cbf1, 0xc46e5069, 0x288e1a20, 0xc472e9bc, - 0x28826936, 0xc477855a, 0x2876b934, 0xc47c2344, - 0x286b0a1a, 0xc480c379, 0x285f5be9, 0xc48565f9, - 0x2853aea1, 0xc48a0ac4, 0x28480243, 0xc48eb1db, - 0x283c56cf, 0xc4935b3c, 0x2830ac45, 0xc49806e7, - 0x282502a7, 0xc49cb4dd, 0x281959f4, 0xc4a1651c, - 0x280db22d, 0xc4a617a6, 0x28020b52, 0xc4aacc7a, - 0x27f66564, 0xc4af8397, 0x27eac063, 0xc4b43cfd, - 0x27df1c50, 0xc4b8f8ad, 0x27d3792b, 0xc4bdb6a6, - 0x27c7d6f4, 0xc4c276e8, 0x27bc35ad, 0xc4c73972, - 0x27b09555, 0xc4cbfe45, 0x27a4f5ed, 0xc4d0c560, - 0x27995776, 0xc4d58ec3, 0x278db9ef, 0xc4da5a6f, - 0x27821d59, 0xc4df2862, 0x277681b6, 0xc4e3f89c, - 0x276ae704, 0xc4e8cb1e, 0x275f4d45, 0xc4ed9fe7, - 0x2753b479, 0xc4f276f7, 0x27481ca1, 0xc4f7504e, - 0x273c85bc, 0xc4fc2bec, 0x2730efcc, 0xc50109d0, - 0x27255ad1, 0xc505e9fb, 0x2719c6cb, 0xc50acc6b, - 0x270e33bb, 0xc50fb121, 0x2702a1a1, 0xc514981d, - 0x26f7107e, 0xc519815f, 0x26eb8052, 0xc51e6ce6, - 0x26dff11d, 0xc5235ab2, 0x26d462e1, 0xc5284ac3, - 0x26c8d59c, 0xc52d3d18, 0x26bd4951, 0xc53231b3, - 0x26b1bdff, 0xc5372891, 0x26a633a6, 0xc53c21b4, - 0x269aaa48, 0xc5411d1b, 0x268f21e5, 0xc5461ac6, - 0x26839a7c, 0xc54b1ab4, 0x26781410, 0xc5501ce5, - 0x266c8e9f, 0xc555215a, 0x26610a2a, 0xc55a2812, - 0x265586b3, 0xc55f310d, 0x264a0438, 0xc5643c4a, - 0x263e82bc, 0xc56949ca, 0x2633023e, 0xc56e598c, - 0x262782be, 0xc5736b90, 0x261c043d, 0xc5787fd6, - 0x261086bc, 0xc57d965d, 0x26050a3b, 0xc582af26, - 0x25f98ebb, 0xc587ca31, 0x25ee143b, 0xc58ce77c, - 0x25e29abc, 0xc5920708, 0x25d72240, 0xc59728d5, - 0x25cbaac5, 0xc59c4ce3, 0x25c0344d, 0xc5a17330, - 0x25b4bed8, 0xc5a69bbe, 0x25a94a67, 0xc5abc68c, - 0x259dd6f9, 0xc5b0f399, 0x25926490, 0xc5b622e6, - 0x2586f32c, 0xc5bb5472, 0x257b82cd, 0xc5c0883d, - 0x25701374, 0xc5c5be47, 0x2564a521, 0xc5caf690, - 0x255937d5, 0xc5d03118, 0x254dcb8f, 0xc5d56ddd, - 0x25426051, 0xc5daace1, 0x2536f61b, 0xc5dfee22, - 0x252b8cee, 0xc5e531a1, 0x252024c9, 0xc5ea775e, - 0x2514bdad, 0xc5efbf58, 0x2509579b, 0xc5f5098f, - 0x24fdf294, 0xc5fa5603, 0x24f28e96, 0xc5ffa4b3, - 0x24e72ba4, 0xc604f5a0, 0x24dbc9bd, 0xc60a48c9, - 0x24d068e2, 0xc60f9e2e, 0x24c50914, 0xc614f5cf, - 0x24b9aa52, 0xc61a4fac, 0x24ae4c9d, 0xc61fabc4, - 0x24a2eff6, 0xc6250a18, 0x2497945d, 0xc62a6aa6, - 0x248c39d3, 0xc62fcd6f, 0x2480e057, 0xc6353273, - 0x247587eb, 0xc63a99b1, 0x246a308f, 0xc6400329, - 0x245eda43, 0xc6456edb, 0x24538507, 0xc64adcc7, - 0x244830dd, 0xc6504ced, 0x243cddc4, 0xc655bf4c, - 0x24318bbe, 0xc65b33e4, 0x24263ac9, 0xc660aab5, - 0x241aeae8, 0xc66623be, 0x240f9c1a, 0xc66b9f01, - 0x24044e60, 0xc6711c7b, 0x23f901ba, 0xc6769c2e, - 0x23edb628, 0xc67c1e18, 0x23e26bac, 0xc681a23a, - 0x23d72245, 0xc6872894, 0x23cbd9f4, 0xc68cb124, - 0x23c092b9, 0xc6923bec, 0x23b54c95, 0xc697c8eb, - 0x23aa0788, 0xc69d5820, 0x239ec393, 0xc6a2e98b, - 0x239380b6, 0xc6a87d2d, 0x23883ef2, 0xc6ae1304, - 0x237cfe47, 0xc6b3ab12, 0x2371beb5, 0xc6b94554, - 0x2366803c, 0xc6bee1cd, 0x235b42df, 0xc6c4807a, - 0x2350069b, 0xc6ca215c, 0x2344cb73, 0xc6cfc472, - 0x23399167, 0xc6d569be, 0x232e5876, 0xc6db113d, - 0x232320a2, 0xc6e0baf0, 0x2317e9eb, 0xc6e666d7, - 0x230cb451, 0xc6ec14f2, 0x23017fd5, 0xc6f1c540, - 0x22f64c77, 0xc6f777c1, 0x22eb1a37, 0xc6fd2c75, - 0x22dfe917, 0xc702e35c, 0x22d4b916, 0xc7089c75, - 0x22c98a35, 0xc70e57c0, 0x22be5c74, 0xc714153e, - 0x22b32fd4, 0xc719d4ed, 0x22a80456, 0xc71f96ce, - 0x229cd9f8, 0xc7255ae0, 0x2291b0bd, 0xc72b2123, - 0x228688a4, 0xc730e997, 0x227b61af, 0xc736b43c, - 0x22703bdc, 0xc73c8111, 0x2265172e, 0xc7425016, - 0x2259f3a3, 0xc748214c, 0x224ed13d, 0xc74df4b1, - 0x2243affc, 0xc753ca46, 0x22388fe1, 0xc759a20a, - 0x222d70eb, 0xc75f7bfe, 0x2222531c, 0xc7655820, - 0x22173674, 0xc76b3671, 0x220c1af3, 0xc77116f0, - 0x22010099, 0xc776f99d, 0x21f5e768, 0xc77cde79, - 0x21eacf5f, 0xc782c582, 0x21dfb87f, 0xc788aeb9, - 0x21d4a2c8, 0xc78e9a1d, 0x21c98e3b, 0xc79487ae, - 0x21be7ad8, 0xc79a776c, 0x21b368a0, 0xc7a06957, - 0x21a85793, 0xc7a65d6e, 0x219d47b1, 0xc7ac53b1, - 0x219238fb, 0xc7b24c20, 0x21872b72, 0xc7b846ba, - 0x217c1f15, 0xc7be4381, 0x217113e5, 0xc7c44272, - 0x216609e3, 0xc7ca438f, 0x215b0110, 0xc7d046d6, - 0x214ff96a, 0xc7d64c47, 0x2144f2f3, 0xc7dc53e3, - 0x2139edac, 0xc7e25daa, 0x212ee995, 0xc7e8699a, - 0x2123e6ad, 0xc7ee77b3, 0x2118e4f6, 0xc7f487f6, - 0x210de470, 0xc7fa9a62, 0x2102e51c, 0xc800aef7, - 0x20f7e6f9, 0xc806c5b5, 0x20ecea09, 0xc80cde9b, - 0x20e1ee4b, 0xc812f9a9, 0x20d6f3c1, 0xc81916df, - 0x20cbfa6a, 0xc81f363d, 0x20c10247, 0xc82557c3, - 0x20b60b58, 0xc82b7b70, 0x20ab159e, 0xc831a143, - 0x20a0211a, 0xc837c93e, 0x20952dcb, 0xc83df35f, - 0x208a3bb2, 0xc8441fa6, 0x207f4acf, 0xc84a4e14, - 0x20745b24, 0xc8507ea7, 0x20696cb0, 0xc856b160, - 0x205e7f74, 0xc85ce63e, 0x2053936f, 0xc8631d42, - 0x2048a8a4, 0xc869566a, 0x203dbf11, 0xc86f91b7, - 0x2032d6b8, 0xc875cf28, 0x2027ef99, 0xc87c0ebd, - 0x201d09b4, 0xc8825077, 0x2012250a, 0xc8889454, - 0x2007419b, 0xc88eda54, 0x1ffc5f67, 0xc8952278, - 0x1ff17e70, 0xc89b6cbf, 0x1fe69eb4, 0xc8a1b928, - 0x1fdbc036, 0xc8a807b4, 0x1fd0e2f5, 0xc8ae5862, - 0x1fc606f1, 0xc8b4ab32, 0x1fbb2c2c, 0xc8bb0023, - 0x1fb052a5, 0xc8c15736, 0x1fa57a5d, 0xc8c7b06b, - 0x1f9aa354, 0xc8ce0bc0, 0x1f8fcd8b, 0xc8d46936, - 0x1f84f902, 0xc8dac8cd, 0x1f7a25ba, 0xc8e12a84, - 0x1f6f53b3, 0xc8e78e5b, 0x1f6482ed, 0xc8edf452, - 0x1f59b369, 0xc8f45c68, 0x1f4ee527, 0xc8fac69e, - 0x1f441828, 0xc90132f2, 0x1f394c6b, 0xc907a166, - 0x1f2e81f3, 0xc90e11f7, 0x1f23b8be, 0xc91484a8, - 0x1f18f0ce, 0xc91af976, 0x1f0e2a22, 0xc9217062, - 0x1f0364bc, 0xc927e96b, 0x1ef8a09b, 0xc92e6492, - 0x1eedddc0, 0xc934e1d6, 0x1ee31c2b, 0xc93b6137, - 0x1ed85bdd, 0xc941e2b4, 0x1ecd9cd7, 0xc948664d, - 0x1ec2df18, 0xc94eec03, 0x1eb822a1, 0xc95573d4, - 0x1ead6773, 0xc95bfdc1, 0x1ea2ad8d, 0xc96289c9, - 0x1e97f4f1, 0xc96917ec, 0x1e8d3d9e, 0xc96fa82a, - 0x1e828796, 0xc9763a83, 0x1e77d2d8, 0xc97ccef5, - 0x1e6d1f65, 0xc9836582, 0x1e626d3e, 0xc989fe29, - 0x1e57bc62, 0xc99098e9, 0x1e4d0cd2, 0xc99735c2, - 0x1e425e8f, 0xc99dd4b4, 0x1e37b199, 0xc9a475bf, - 0x1e2d05f1, 0xc9ab18e3, 0x1e225b96, 0xc9b1be1e, - 0x1e17b28a, 0xc9b86572, 0x1e0d0acc, 0xc9bf0edd, - 0x1e02645d, 0xc9c5ba60, 0x1df7bf3e, 0xc9cc67fa, - 0x1ded1b6e, 0xc9d317ab, 0x1de278ef, 0xc9d9c973, - 0x1dd7d7c1, 0xc9e07d51, 0x1dcd37e4, 0xc9e73346, - 0x1dc29958, 0xc9edeb50, 0x1db7fc1e, 0xc9f4a570, - 0x1dad6036, 0xc9fb61a5, 0x1da2c5a2, 0xca021fef, - 0x1d982c60, 0xca08e04f, 0x1d8d9472, 0xca0fa2c3, - 0x1d82fdd8, 0xca16674b, 0x1d786892, 0xca1d2de7, - 0x1d6dd4a2, 0xca23f698, 0x1d634206, 0xca2ac15b, - 0x1d58b0c0, 0xca318e32, 0x1d4e20d0, 0xca385d1d, - 0x1d439236, 0xca3f2e19, 0x1d3904f4, 0xca460129, - 0x1d2e7908, 0xca4cd64b, 0x1d23ee74, 0xca53ad7e, - 0x1d196538, 0xca5a86c4, 0x1d0edd55, 0xca61621b, - 0x1d0456ca, 0xca683f83, 0x1cf9d199, 0xca6f1efc, - 0x1cef4dc2, 0xca760086, 0x1ce4cb44, 0xca7ce420, - 0x1cda4a21, 0xca83c9ca, 0x1ccfca59, 0xca8ab184, - 0x1cc54bec, 0xca919b4e, 0x1cbacedb, 0xca988727, - 0x1cb05326, 0xca9f750f, 0x1ca5d8cd, 0xcaa66506, - 0x1c9b5fd2, 0xcaad570c, 0x1c90e834, 0xcab44b1f, - 0x1c8671f3, 0xcabb4141, 0x1c7bfd11, 0xcac23971, - 0x1c71898d, 0xcac933ae, 0x1c671768, 0xcad02ff8, - 0x1c5ca6a2, 0xcad72e4f, 0x1c52373c, 0xcade2eb3, - 0x1c47c936, 0xcae53123, 0x1c3d5c91, 0xcaec35a0, - 0x1c32f14d, 0xcaf33c28, 0x1c28876a, 0xcafa44bc, - 0x1c1e1ee9, 0xcb014f5b, 0x1c13b7c9, 0xcb085c05, - 0x1c09520d, 0xcb0f6aba, 0x1bfeedb3, 0xcb167b79, - 0x1bf48abd, 0xcb1d8e43, 0x1bea292b, 0xcb24a316, - 0x1bdfc8fc, 0xcb2bb9f4, 0x1bd56a32, 0xcb32d2da, - 0x1bcb0cce, 0xcb39edca, 0x1bc0b0ce, 0xcb410ac3, - 0x1bb65634, 0xcb4829c4, 0x1babfd01, 0xcb4f4acd, - 0x1ba1a534, 0xcb566ddf, 0x1b974ece, 0xcb5d92f8, - 0x1b8cf9cf, 0xcb64ba19, 0x1b82a638, 0xcb6be341, - 0x1b785409, 0xcb730e70, 0x1b6e0342, 0xcb7a3ba5, - 0x1b63b3e5, 0xcb816ae1, 0x1b5965f1, 0xcb889c23, - 0x1b4f1967, 0xcb8fcf6b, 0x1b44ce46, 0xcb9704b9, - 0x1b3a8491, 0xcb9e3c0b, 0x1b303c46, 0xcba57563, - 0x1b25f566, 0xcbacb0bf, 0x1b1baff2, 0xcbb3ee20, - 0x1b116beb, 0xcbbb2d85, 0x1b072950, 0xcbc26eee, - 0x1afce821, 0xcbc9b25a, 0x1af2a860, 0xcbd0f7ca, - 0x1ae86a0d, 0xcbd83f3d, 0x1ade2d28, 0xcbdf88b3, - 0x1ad3f1b1, 0xcbe6d42b, 0x1ac9b7a9, 0xcbee21a5, - 0x1abf7f11, 0xcbf57121, 0x1ab547e8, 0xcbfcc29f, - 0x1aab122f, 0xcc04161e, 0x1aa0dde7, 0xcc0b6b9e, - 0x1a96ab0f, 0xcc12c31f, 0x1a8c79a9, 0xcc1a1ca0, - 0x1a8249b4, 0xcc217822, 0x1a781b31, 0xcc28d5a3, - 0x1a6dee21, 0xcc303524, 0x1a63c284, 0xcc3796a5, - 0x1a599859, 0xcc3efa25, 0x1a4f6fa3, 0xcc465fa3, - 0x1a454860, 0xcc4dc720, 0x1a3b2292, 0xcc55309b, - 0x1a30fe38, 0xcc5c9c14, 0x1a26db54, 0xcc64098b, - 0x1a1cb9e5, 0xcc6b78ff, 0x1a1299ec, 0xcc72ea70, - 0x1a087b69, 0xcc7a5dde, 0x19fe5e5e, 0xcc81d349, - 0x19f442c9, 0xcc894aaf, 0x19ea28ac, 0xcc90c412, - 0x19e01006, 0xcc983f70, 0x19d5f8d9, 0xcc9fbcca, - 0x19cbe325, 0xcca73c1e, 0x19c1cee9, 0xccaebd6e, - 0x19b7bc27, 0xccb640b8, 0x19adaadf, 0xccbdc5fc, - 0x19a39b11, 0xccc54d3a, 0x19998cbe, 0xccccd671, - 0x198f7fe6, 0xccd461a2, 0x19857489, 0xccdbeecc, - 0x197b6aa8, 0xcce37def, 0x19716243, 0xcceb0f0a, - 0x19675b5a, 0xccf2a21d, 0x195d55ef, 0xccfa3729, - 0x19535201, 0xcd01ce2b, 0x19494f90, 0xcd096725, - 0x193f4e9e, 0xcd110216, 0x19354f2a, 0xcd189efe, - 0x192b5135, 0xcd203ddc, 0x192154bf, 0xcd27deb0, - 0x191759c9, 0xcd2f817b, 0x190d6053, 0xcd37263a, - 0x1903685d, 0xcd3eccef, 0x18f971e8, 0xcd467599, - 0x18ef7cf4, 0xcd4e2037, 0x18e58982, 0xcd55ccca, - 0x18db9792, 0xcd5d7b50, 0x18d1a724, 0xcd652bcb, - 0x18c7b838, 0xcd6cde39, 0x18bdcad0, 0xcd74929a, - 0x18b3deeb, 0xcd7c48ee, 0x18a9f48a, 0xcd840134, - 0x18a00bae, 0xcd8bbb6d, 0x18962456, 0xcd937798, - 0x188c3e83, 0xcd9b35b4, 0x18825a35, 0xcda2f5c2, - 0x1878776d, 0xcdaab7c0, 0x186e962b, 0xcdb27bb0, - 0x1864b670, 0xcdba4190, 0x185ad83c, 0xcdc20960, - 0x1850fb8e, 0xcdc9d320, 0x18472069, 0xcdd19ed0, - 0x183d46cc, 0xcdd96c6f, 0x18336eb7, 0xcde13bfd, - 0x1829982b, 0xcde90d79, 0x181fc328, 0xcdf0e0e4, - 0x1815efae, 0xcdf8b63d, 0x180c1dbf, 0xce008d84, - 0x18024d59, 0xce0866b8, 0x17f87e7f, 0xce1041d9, - 0x17eeb130, 0xce181ee8, 0x17e4e56c, 0xce1ffde2, - 0x17db1b34, 0xce27dec9, 0x17d15288, 0xce2fc19c, - 0x17c78b68, 0xce37a65b, 0x17bdc5d6, 0xce3f8d05, - 0x17b401d1, 0xce47759a, 0x17aa3f5a, 0xce4f6019, - 0x17a07e70, 0xce574c84, 0x1796bf16, 0xce5f3ad8, - 0x178d014a, 0xce672b16, 0x1783450d, 0xce6f1d3d, - 0x17798a60, 0xce77114e, 0x176fd143, 0xce7f0748, - 0x176619b6, 0xce86ff2a, 0x175c63ba, 0xce8ef8f4, - 0x1752af4f, 0xce96f4a7, 0x1748fc75, 0xce9ef241, - 0x173f4b2e, 0xcea6f1c2, 0x17359b78, 0xceaef32b, - 0x172bed55, 0xceb6f67a, 0x172240c5, 0xcebefbb0, - 0x171895c9, 0xcec702cb, 0x170eec60, 0xcecf0bcd, - 0x1705448b, 0xced716b4, 0x16fb9e4b, 0xcedf2380, - 0x16f1f99f, 0xcee73231, 0x16e85689, 0xceef42c7, - 0x16deb508, 0xcef75541, 0x16d5151d, 0xceff699f, - 0x16cb76c9, 0xcf077fe1, 0x16c1da0b, 0xcf0f9805, - 0x16b83ee4, 0xcf17b20d, 0x16aea555, 0xcf1fcdf8, - 0x16a50d5d, 0xcf27ebc5, 0x169b76fe, 0xcf300b74, - 0x1691e237, 0xcf382d05, 0x16884f09, 0xcf405077, - 0x167ebd74, 0xcf4875ca, 0x16752d79, 0xcf509cfe, - 0x166b9f18, 0xcf58c613, 0x16621251, 0xcf60f108, - 0x16588725, 0xcf691ddd, 0x164efd94, 0xcf714c91, - 0x1645759f, 0xcf797d24, 0x163bef46, 0xcf81af97, - 0x16326a88, 0xcf89e3e8, 0x1628e767, 0xcf921a17, - 0x161f65e4, 0xcf9a5225, 0x1615e5fd, 0xcfa28c10, - 0x160c67b4, 0xcfaac7d8, 0x1602eb0a, 0xcfb3057d, - 0x15f96ffd, 0xcfbb4500, 0x15eff690, 0xcfc3865e, - 0x15e67ec1, 0xcfcbc999, 0x15dd0892, 0xcfd40eaf, - 0x15d39403, 0xcfdc55a1, 0x15ca2115, 0xcfe49e6d, - 0x15c0afc6, 0xcfece915, 0x15b74019, 0xcff53597, - 0x15add20d, 0xcffd83f4, 0x15a465a3, 0xd005d42a, - 0x159afadb, 0xd00e2639, 0x159191b5, 0xd0167a22, - 0x15882a32, 0xd01ecfe4, 0x157ec452, 0xd027277e, - 0x15756016, 0xd02f80f1, 0x156bfd7d, 0xd037dc3b, - 0x15629c89, 0xd040395d, 0x15593d3a, 0xd0489856, - 0x154fdf8f, 0xd050f926, 0x15468389, 0xd0595bcd, - 0x153d292a, 0xd061c04a, 0x1533d070, 0xd06a269d, - 0x152a795d, 0xd0728ec6, 0x152123f0, 0xd07af8c4, - 0x1517d02b, 0xd0836497, 0x150e7e0d, 0xd08bd23f, - 0x15052d97, 0xd09441bb, 0x14fbdec9, 0xd09cb30b, - 0x14f291a4, 0xd0a5262f, 0x14e94627, 0xd0ad9b26, - 0x14dffc54, 0xd0b611f1, 0x14d6b42b, 0xd0be8a8d, - 0x14cd6dab, 0xd0c704fd, 0x14c428d6, 0xd0cf813e, - 0x14bae5ab, 0xd0d7ff51, 0x14b1a42c, 0xd0e07f36, - 0x14a86458, 0xd0e900ec, 0x149f2630, 0xd0f18472, - 0x1495e9b3, 0xd0fa09c9, 0x148caee4, 0xd10290f0, - 0x148375c1, 0xd10b19e7, 0x147a3e4b, 0xd113a4ad, - 0x14710883, 0xd11c3142, 0x1467d469, 0xd124bfa6, - 0x145ea1fd, 0xd12d4fd9, 0x14557140, 0xd135e1d9, - 0x144c4232, 0xd13e75a8, 0x144314d3, 0xd1470b44, - 0x1439e923, 0xd14fa2ad, 0x1430bf24, 0xd1583be2, - 0x142796d5, 0xd160d6e5, 0x141e7037, 0xd16973b3, - 0x14154b4a, 0xd172124d, 0x140c280e, 0xd17ab2b3, - 0x14030684, 0xd18354e4, 0x13f9e6ad, 0xd18bf8e0, - 0x13f0c887, 0xd1949ea6, 0x13e7ac15, 0xd19d4636, - 0x13de9156, 0xd1a5ef90, 0x13d5784a, 0xd1ae9ab4, - 0x13cc60f2, 0xd1b747a0, 0x13c34b4f, 0xd1bff656, - 0x13ba3760, 0xd1c8a6d4, 0x13b12526, 0xd1d1591a, - 0x13a814a2, 0xd1da0d28, 0x139f05d3, 0xd1e2c2fd, - 0x1395f8ba, 0xd1eb7a9a, 0x138ced57, 0xd1f433fd, - 0x1383e3ab, 0xd1fcef27, 0x137adbb6, 0xd205ac17, - 0x1371d579, 0xd20e6acc, 0x1368d0f3, 0xd2172b48, - 0x135fce26, 0xd21fed88, 0x1356cd11, 0xd228b18d, - 0x134dcdb4, 0xd2317756, 0x1344d011, 0xd23a3ee4, - 0x133bd427, 0xd2430835, 0x1332d9f7, 0xd24bd34a, - 0x1329e181, 0xd254a021, 0x1320eac6, 0xd25d6ebc, - 0x1317f5c6, 0xd2663f19, 0x130f0280, 0xd26f1138, - 0x130610f7, 0xd277e518, 0x12fd2129, 0xd280babb, - 0x12f43318, 0xd289921e, 0x12eb46c3, 0xd2926b41, - 0x12e25c2b, 0xd29b4626, 0x12d97350, 0xd2a422ca, - 0x12d08c33, 0xd2ad012e, 0x12c7a6d4, 0xd2b5e151, - 0x12bec333, 0xd2bec333, 0x12b5e151, 0xd2c7a6d4, - 0x12ad012e, 0xd2d08c33, 0x12a422ca, 0xd2d97350, - 0x129b4626, 0xd2e25c2b, 0x12926b41, 0xd2eb46c3, - 0x1289921e, 0xd2f43318, 0x1280babb, 0xd2fd2129, - 0x1277e518, 0xd30610f7, 0x126f1138, 0xd30f0280, - 0x12663f19, 0xd317f5c6, 0x125d6ebc, 0xd320eac6, - 0x1254a021, 0xd329e181, 0x124bd34a, 0xd332d9f7, - 0x12430835, 0xd33bd427, 0x123a3ee4, 0xd344d011, - 0x12317756, 0xd34dcdb4, 0x1228b18d, 0xd356cd11, - 0x121fed88, 0xd35fce26, 0x12172b48, 0xd368d0f3, - 0x120e6acc, 0xd371d579, 0x1205ac17, 0xd37adbb6, - 0x11fcef27, 0xd383e3ab, 0x11f433fd, 0xd38ced57, - 0x11eb7a9a, 0xd395f8ba, 0x11e2c2fd, 0xd39f05d3, - 0x11da0d28, 0xd3a814a2, 0x11d1591a, 0xd3b12526, - 0x11c8a6d4, 0xd3ba3760, 0x11bff656, 0xd3c34b4f, - 0x11b747a0, 0xd3cc60f2, 0x11ae9ab4, 0xd3d5784a, - 0x11a5ef90, 0xd3de9156, 0x119d4636, 0xd3e7ac15, - 0x11949ea6, 0xd3f0c887, 0x118bf8e0, 0xd3f9e6ad, - 0x118354e4, 0xd4030684, 0x117ab2b3, 0xd40c280e, - 0x1172124d, 0xd4154b4a, 0x116973b3, 0xd41e7037, - 0x1160d6e5, 0xd42796d5, 0x11583be2, 0xd430bf24, - 0x114fa2ad, 0xd439e923, 0x11470b44, 0xd44314d3, - 0x113e75a8, 0xd44c4232, 0x1135e1d9, 0xd4557140, - 0x112d4fd9, 0xd45ea1fd, 0x1124bfa6, 0xd467d469, - 0x111c3142, 0xd4710883, 0x1113a4ad, 0xd47a3e4b, - 0x110b19e7, 0xd48375c1, 0x110290f0, 0xd48caee4, - 0x10fa09c9, 0xd495e9b3, 0x10f18472, 0xd49f2630, - 0x10e900ec, 0xd4a86458, 0x10e07f36, 0xd4b1a42c, - 0x10d7ff51, 0xd4bae5ab, 0x10cf813e, 0xd4c428d6, - 0x10c704fd, 0xd4cd6dab, 0x10be8a8d, 0xd4d6b42b, - 0x10b611f1, 0xd4dffc54, 0x10ad9b26, 0xd4e94627, - 0x10a5262f, 0xd4f291a4, 0x109cb30b, 0xd4fbdec9, - 0x109441bb, 0xd5052d97, 0x108bd23f, 0xd50e7e0d, - 0x10836497, 0xd517d02b, 0x107af8c4, 0xd52123f0, - 0x10728ec6, 0xd52a795d, 0x106a269d, 0xd533d070, - 0x1061c04a, 0xd53d292a, 0x10595bcd, 0xd5468389, - 0x1050f926, 0xd54fdf8f, 0x10489856, 0xd5593d3a, - 0x1040395d, 0xd5629c89, 0x1037dc3b, 0xd56bfd7d, - 0x102f80f1, 0xd5756016, 0x1027277e, 0xd57ec452, - 0x101ecfe4, 0xd5882a32, 0x10167a22, 0xd59191b5, - 0x100e2639, 0xd59afadb, 0x1005d42a, 0xd5a465a3, - 0xffd83f4, 0xd5add20d, 0xff53597, 0xd5b74019, - 0xfece915, 0xd5c0afc6, 0xfe49e6d, 0xd5ca2115, - 0xfdc55a1, 0xd5d39403, 0xfd40eaf, 0xd5dd0892, - 0xfcbc999, 0xd5e67ec1, 0xfc3865e, 0xd5eff690, - 0xfbb4500, 0xd5f96ffd, 0xfb3057d, 0xd602eb0a, - 0xfaac7d8, 0xd60c67b4, 0xfa28c10, 0xd615e5fd, - 0xf9a5225, 0xd61f65e4, 0xf921a17, 0xd628e767, - 0xf89e3e8, 0xd6326a88, 0xf81af97, 0xd63bef46, - 0xf797d24, 0xd645759f, 0xf714c91, 0xd64efd94, - 0xf691ddd, 0xd6588725, 0xf60f108, 0xd6621251, - 0xf58c613, 0xd66b9f18, 0xf509cfe, 0xd6752d79, - 0xf4875ca, 0xd67ebd74, 0xf405077, 0xd6884f09, - 0xf382d05, 0xd691e237, 0xf300b74, 0xd69b76fe, - 0xf27ebc5, 0xd6a50d5d, 0xf1fcdf8, 0xd6aea555, - 0xf17b20d, 0xd6b83ee4, 0xf0f9805, 0xd6c1da0b, - 0xf077fe1, 0xd6cb76c9, 0xeff699f, 0xd6d5151d, - 0xef75541, 0xd6deb508, 0xeef42c7, 0xd6e85689, - 0xee73231, 0xd6f1f99f, 0xedf2380, 0xd6fb9e4b, - 0xed716b4, 0xd705448b, 0xecf0bcd, 0xd70eec60, - 0xec702cb, 0xd71895c9, 0xebefbb0, 0xd72240c5, - 0xeb6f67a, 0xd72bed55, 0xeaef32b, 0xd7359b78, - 0xea6f1c2, 0xd73f4b2e, 0xe9ef241, 0xd748fc75, - 0xe96f4a7, 0xd752af4f, 0xe8ef8f4, 0xd75c63ba, - 0xe86ff2a, 0xd76619b6, 0xe7f0748, 0xd76fd143, - 0xe77114e, 0xd7798a60, 0xe6f1d3d, 0xd783450d, - 0xe672b16, 0xd78d014a, 0xe5f3ad8, 0xd796bf16, - 0xe574c84, 0xd7a07e70, 0xe4f6019, 0xd7aa3f5a, - 0xe47759a, 0xd7b401d1, 0xe3f8d05, 0xd7bdc5d6, - 0xe37a65b, 0xd7c78b68, 0xe2fc19c, 0xd7d15288, - 0xe27dec9, 0xd7db1b34, 0xe1ffde2, 0xd7e4e56c, - 0xe181ee8, 0xd7eeb130, 0xe1041d9, 0xd7f87e7f, - 0xe0866b8, 0xd8024d59, 0xe008d84, 0xd80c1dbf, - 0xdf8b63d, 0xd815efae, 0xdf0e0e4, 0xd81fc328, - 0xde90d79, 0xd829982b, 0xde13bfd, 0xd8336eb7, - 0xdd96c6f, 0xd83d46cc, 0xdd19ed0, 0xd8472069, - 0xdc9d320, 0xd850fb8e, 0xdc20960, 0xd85ad83c, - 0xdba4190, 0xd864b670, 0xdb27bb0, 0xd86e962b, - 0xdaab7c0, 0xd878776d, 0xda2f5c2, 0xd8825a35, - 0xd9b35b4, 0xd88c3e83, 0xd937798, 0xd8962456, - 0xd8bbb6d, 0xd8a00bae, 0xd840134, 0xd8a9f48a, - 0xd7c48ee, 0xd8b3deeb, 0xd74929a, 0xd8bdcad0, - 0xd6cde39, 0xd8c7b838, 0xd652bcb, 0xd8d1a724, - 0xd5d7b50, 0xd8db9792, 0xd55ccca, 0xd8e58982, - 0xd4e2037, 0xd8ef7cf4, 0xd467599, 0xd8f971e8, - 0xd3eccef, 0xd903685d, 0xd37263a, 0xd90d6053, - 0xd2f817b, 0xd91759c9, 0xd27deb0, 0xd92154bf, - 0xd203ddc, 0xd92b5135, 0xd189efe, 0xd9354f2a, - 0xd110216, 0xd93f4e9e, 0xd096725, 0xd9494f90, - 0xd01ce2b, 0xd9535201, 0xcfa3729, 0xd95d55ef, - 0xcf2a21d, 0xd9675b5a, 0xceb0f0a, 0xd9716243, - 0xce37def, 0xd97b6aa8, 0xcdbeecc, 0xd9857489, - 0xcd461a2, 0xd98f7fe6, 0xcccd671, 0xd9998cbe, - 0xcc54d3a, 0xd9a39b11, 0xcbdc5fc, 0xd9adaadf, - 0xcb640b8, 0xd9b7bc27, 0xcaebd6e, 0xd9c1cee9, - 0xca73c1e, 0xd9cbe325, 0xc9fbcca, 0xd9d5f8d9, - 0xc983f70, 0xd9e01006, 0xc90c412, 0xd9ea28ac, - 0xc894aaf, 0xd9f442c9, 0xc81d349, 0xd9fe5e5e, - 0xc7a5dde, 0xda087b69, 0xc72ea70, 0xda1299ec, - 0xc6b78ff, 0xda1cb9e5, 0xc64098b, 0xda26db54, - 0xc5c9c14, 0xda30fe38, 0xc55309b, 0xda3b2292, - 0xc4dc720, 0xda454860, 0xc465fa3, 0xda4f6fa3, - 0xc3efa25, 0xda599859, 0xc3796a5, 0xda63c284, - 0xc303524, 0xda6dee21, 0xc28d5a3, 0xda781b31, - 0xc217822, 0xda8249b4, 0xc1a1ca0, 0xda8c79a9, - 0xc12c31f, 0xda96ab0f, 0xc0b6b9e, 0xdaa0dde7, - 0xc04161e, 0xdaab122f, 0xbfcc29f, 0xdab547e8, - 0xbf57121, 0xdabf7f11, 0xbee21a5, 0xdac9b7a9, - 0xbe6d42b, 0xdad3f1b1, 0xbdf88b3, 0xdade2d28, - 0xbd83f3d, 0xdae86a0d, 0xbd0f7ca, 0xdaf2a860, - 0xbc9b25a, 0xdafce821, 0xbc26eee, 0xdb072950, - 0xbbb2d85, 0xdb116beb, 0xbb3ee20, 0xdb1baff2, - 0xbacb0bf, 0xdb25f566, 0xba57563, 0xdb303c46, - 0xb9e3c0b, 0xdb3a8491, 0xb9704b9, 0xdb44ce46, - 0xb8fcf6b, 0xdb4f1967, 0xb889c23, 0xdb5965f1, - 0xb816ae1, 0xdb63b3e5, 0xb7a3ba5, 0xdb6e0342, - 0xb730e70, 0xdb785409, 0xb6be341, 0xdb82a638, - 0xb64ba19, 0xdb8cf9cf, 0xb5d92f8, 0xdb974ece, - 0xb566ddf, 0xdba1a534, 0xb4f4acd, 0xdbabfd01, - 0xb4829c4, 0xdbb65634, 0xb410ac3, 0xdbc0b0ce, - 0xb39edca, 0xdbcb0cce, 0xb32d2da, 0xdbd56a32, - 0xb2bb9f4, 0xdbdfc8fc, 0xb24a316, 0xdbea292b, - 0xb1d8e43, 0xdbf48abd, 0xb167b79, 0xdbfeedb3, - 0xb0f6aba, 0xdc09520d, 0xb085c05, 0xdc13b7c9, - 0xb014f5b, 0xdc1e1ee9, 0xafa44bc, 0xdc28876a, - 0xaf33c28, 0xdc32f14d, 0xaec35a0, 0xdc3d5c91, - 0xae53123, 0xdc47c936, 0xade2eb3, 0xdc52373c, - 0xad72e4f, 0xdc5ca6a2, 0xad02ff8, 0xdc671768, - 0xac933ae, 0xdc71898d, 0xac23971, 0xdc7bfd11, - 0xabb4141, 0xdc8671f3, 0xab44b1f, 0xdc90e834, - 0xaad570c, 0xdc9b5fd2, 0xaa66506, 0xdca5d8cd, - 0xa9f750f, 0xdcb05326, 0xa988727, 0xdcbacedb, - 0xa919b4e, 0xdcc54bec, 0xa8ab184, 0xdccfca59, - 0xa83c9ca, 0xdcda4a21, 0xa7ce420, 0xdce4cb44, - 0xa760086, 0xdcef4dc2, 0xa6f1efc, 0xdcf9d199, - 0xa683f83, 0xdd0456ca, 0xa61621b, 0xdd0edd55, - 0xa5a86c4, 0xdd196538, 0xa53ad7e, 0xdd23ee74, - 0xa4cd64b, 0xdd2e7908, 0xa460129, 0xdd3904f4, - 0xa3f2e19, 0xdd439236, 0xa385d1d, 0xdd4e20d0, - 0xa318e32, 0xdd58b0c0, 0xa2ac15b, 0xdd634206, - 0xa23f698, 0xdd6dd4a2, 0xa1d2de7, 0xdd786892, - 0xa16674b, 0xdd82fdd8, 0xa0fa2c3, 0xdd8d9472, - 0xa08e04f, 0xdd982c60, 0xa021fef, 0xdda2c5a2, - 0x9fb61a5, 0xddad6036, 0x9f4a570, 0xddb7fc1e, - 0x9edeb50, 0xddc29958, 0x9e73346, 0xddcd37e4, - 0x9e07d51, 0xddd7d7c1, 0x9d9c973, 0xdde278ef, - 0x9d317ab, 0xdded1b6e, 0x9cc67fa, 0xddf7bf3e, - 0x9c5ba60, 0xde02645d, 0x9bf0edd, 0xde0d0acc, - 0x9b86572, 0xde17b28a, 0x9b1be1e, 0xde225b96, - 0x9ab18e3, 0xde2d05f1, 0x9a475bf, 0xde37b199, - 0x99dd4b4, 0xde425e8f, 0x99735c2, 0xde4d0cd2, - 0x99098e9, 0xde57bc62, 0x989fe29, 0xde626d3e, - 0x9836582, 0xde6d1f65, 0x97ccef5, 0xde77d2d8, - 0x9763a83, 0xde828796, 0x96fa82a, 0xde8d3d9e, - 0x96917ec, 0xde97f4f1, 0x96289c9, 0xdea2ad8d, - 0x95bfdc1, 0xdead6773, 0x95573d4, 0xdeb822a1, - 0x94eec03, 0xdec2df18, 0x948664d, 0xdecd9cd7, - 0x941e2b4, 0xded85bdd, 0x93b6137, 0xdee31c2b, - 0x934e1d6, 0xdeedddc0, 0x92e6492, 0xdef8a09b, - 0x927e96b, 0xdf0364bc, 0x9217062, 0xdf0e2a22, - 0x91af976, 0xdf18f0ce, 0x91484a8, 0xdf23b8be, - 0x90e11f7, 0xdf2e81f3, 0x907a166, 0xdf394c6b, - 0x90132f2, 0xdf441828, 0x8fac69e, 0xdf4ee527, - 0x8f45c68, 0xdf59b369, 0x8edf452, 0xdf6482ed, - 0x8e78e5b, 0xdf6f53b3, 0x8e12a84, 0xdf7a25ba, - 0x8dac8cd, 0xdf84f902, 0x8d46936, 0xdf8fcd8b, - 0x8ce0bc0, 0xdf9aa354, 0x8c7b06b, 0xdfa57a5d, - 0x8c15736, 0xdfb052a5, 0x8bb0023, 0xdfbb2c2c, - 0x8b4ab32, 0xdfc606f1, 0x8ae5862, 0xdfd0e2f5, - 0x8a807b4, 0xdfdbc036, 0x8a1b928, 0xdfe69eb4, - 0x89b6cbf, 0xdff17e70, 0x8952278, 0xdffc5f67, - 0x88eda54, 0xe007419b, 0x8889454, 0xe012250a, - 0x8825077, 0xe01d09b4, 0x87c0ebd, 0xe027ef99, - 0x875cf28, 0xe032d6b8, 0x86f91b7, 0xe03dbf11, - 0x869566a, 0xe048a8a4, 0x8631d42, 0xe053936f, - 0x85ce63e, 0xe05e7f74, 0x856b160, 0xe0696cb0, - 0x8507ea7, 0xe0745b24, 0x84a4e14, 0xe07f4acf, - 0x8441fa6, 0xe08a3bb2, 0x83df35f, 0xe0952dcb, - 0x837c93e, 0xe0a0211a, 0x831a143, 0xe0ab159e, - 0x82b7b70, 0xe0b60b58, 0x82557c3, 0xe0c10247, - 0x81f363d, 0xe0cbfa6a, 0x81916df, 0xe0d6f3c1, - 0x812f9a9, 0xe0e1ee4b, 0x80cde9b, 0xe0ecea09, - 0x806c5b5, 0xe0f7e6f9, 0x800aef7, 0xe102e51c, - 0x7fa9a62, 0xe10de470, 0x7f487f6, 0xe118e4f6, - 0x7ee77b3, 0xe123e6ad, 0x7e8699a, 0xe12ee995, - 0x7e25daa, 0xe139edac, 0x7dc53e3, 0xe144f2f3, - 0x7d64c47, 0xe14ff96a, 0x7d046d6, 0xe15b0110, - 0x7ca438f, 0xe16609e3, 0x7c44272, 0xe17113e5, - 0x7be4381, 0xe17c1f15, 0x7b846ba, 0xe1872b72, - 0x7b24c20, 0xe19238fb, 0x7ac53b1, 0xe19d47b1, - 0x7a65d6e, 0xe1a85793, 0x7a06957, 0xe1b368a0, - 0x79a776c, 0xe1be7ad8, 0x79487ae, 0xe1c98e3b, - 0x78e9a1d, 0xe1d4a2c8, 0x788aeb9, 0xe1dfb87f, - 0x782c582, 0xe1eacf5f, 0x77cde79, 0xe1f5e768, - 0x776f99d, 0xe2010099, 0x77116f0, 0xe20c1af3, - 0x76b3671, 0xe2173674, 0x7655820, 0xe222531c, - 0x75f7bfe, 0xe22d70eb, 0x759a20a, 0xe2388fe1, - 0x753ca46, 0xe243affc, 0x74df4b1, 0xe24ed13d, - 0x748214c, 0xe259f3a3, 0x7425016, 0xe265172e, - 0x73c8111, 0xe2703bdc, 0x736b43c, 0xe27b61af, - 0x730e997, 0xe28688a4, 0x72b2123, 0xe291b0bd, - 0x7255ae0, 0xe29cd9f8, 0x71f96ce, 0xe2a80456, - 0x719d4ed, 0xe2b32fd4, 0x714153e, 0xe2be5c74, - 0x70e57c0, 0xe2c98a35, 0x7089c75, 0xe2d4b916, - 0x702e35c, 0xe2dfe917, 0x6fd2c75, 0xe2eb1a37, - 0x6f777c1, 0xe2f64c77, 0x6f1c540, 0xe3017fd5, - 0x6ec14f2, 0xe30cb451, 0x6e666d7, 0xe317e9eb, - 0x6e0baf0, 0xe32320a2, 0x6db113d, 0xe32e5876, - 0x6d569be, 0xe3399167, 0x6cfc472, 0xe344cb73, - 0x6ca215c, 0xe350069b, 0x6c4807a, 0xe35b42df, - 0x6bee1cd, 0xe366803c, 0x6b94554, 0xe371beb5, - 0x6b3ab12, 0xe37cfe47, 0x6ae1304, 0xe3883ef2, - 0x6a87d2d, 0xe39380b6, 0x6a2e98b, 0xe39ec393, - 0x69d5820, 0xe3aa0788, 0x697c8eb, 0xe3b54c95, - 0x6923bec, 0xe3c092b9, 0x68cb124, 0xe3cbd9f4, - 0x6872894, 0xe3d72245, 0x681a23a, 0xe3e26bac, - 0x67c1e18, 0xe3edb628, 0x6769c2e, 0xe3f901ba, - 0x6711c7b, 0xe4044e60, 0x66b9f01, 0xe40f9c1a, - 0x66623be, 0xe41aeae8, 0x660aab5, 0xe4263ac9, - 0x65b33e4, 0xe4318bbe, 0x655bf4c, 0xe43cddc4, - 0x6504ced, 0xe44830dd, 0x64adcc7, 0xe4538507, - 0x6456edb, 0xe45eda43, 0x6400329, 0xe46a308f, - 0x63a99b1, 0xe47587eb, 0x6353273, 0xe480e057, - 0x62fcd6f, 0xe48c39d3, 0x62a6aa6, 0xe497945d, - 0x6250a18, 0xe4a2eff6, 0x61fabc4, 0xe4ae4c9d, - 0x61a4fac, 0xe4b9aa52, 0x614f5cf, 0xe4c50914, - 0x60f9e2e, 0xe4d068e2, 0x60a48c9, 0xe4dbc9bd, - 0x604f5a0, 0xe4e72ba4, 0x5ffa4b3, 0xe4f28e96, - 0x5fa5603, 0xe4fdf294, 0x5f5098f, 0xe509579b, - 0x5efbf58, 0xe514bdad, 0x5ea775e, 0xe52024c9, - 0x5e531a1, 0xe52b8cee, 0x5dfee22, 0xe536f61b, - 0x5daace1, 0xe5426051, 0x5d56ddd, 0xe54dcb8f, - 0x5d03118, 0xe55937d5, 0x5caf690, 0xe564a521, - 0x5c5be47, 0xe5701374, 0x5c0883d, 0xe57b82cd, - 0x5bb5472, 0xe586f32c, 0x5b622e6, 0xe5926490, - 0x5b0f399, 0xe59dd6f9, 0x5abc68c, 0xe5a94a67, - 0x5a69bbe, 0xe5b4bed8, 0x5a17330, 0xe5c0344d, - 0x59c4ce3, 0xe5cbaac5, 0x59728d5, 0xe5d72240, - 0x5920708, 0xe5e29abc, 0x58ce77c, 0xe5ee143b, - 0x587ca31, 0xe5f98ebb, 0x582af26, 0xe6050a3b, - 0x57d965d, 0xe61086bc, 0x5787fd6, 0xe61c043d, - 0x5736b90, 0xe62782be, 0x56e598c, 0xe633023e, - 0x56949ca, 0xe63e82bc, 0x5643c4a, 0xe64a0438, - 0x55f310d, 0xe65586b3, 0x55a2812, 0xe6610a2a, - 0x555215a, 0xe66c8e9f, 0x5501ce5, 0xe6781410, - 0x54b1ab4, 0xe6839a7c, 0x5461ac6, 0xe68f21e5, - 0x5411d1b, 0xe69aaa48, 0x53c21b4, 0xe6a633a6, - 0x5372891, 0xe6b1bdff, 0x53231b3, 0xe6bd4951, - 0x52d3d18, 0xe6c8d59c, 0x5284ac3, 0xe6d462e1, - 0x5235ab2, 0xe6dff11d, 0x51e6ce6, 0xe6eb8052, - 0x519815f, 0xe6f7107e, 0x514981d, 0xe702a1a1, - 0x50fb121, 0xe70e33bb, 0x50acc6b, 0xe719c6cb, - 0x505e9fb, 0xe7255ad1, 0x50109d0, 0xe730efcc, - 0x4fc2bec, 0xe73c85bc, 0x4f7504e, 0xe7481ca1, - 0x4f276f7, 0xe753b479, 0x4ed9fe7, 0xe75f4d45, - 0x4e8cb1e, 0xe76ae704, 0x4e3f89c, 0xe77681b6, - 0x4df2862, 0xe7821d59, 0x4da5a6f, 0xe78db9ef, - 0x4d58ec3, 0xe7995776, 0x4d0c560, 0xe7a4f5ed, - 0x4cbfe45, 0xe7b09555, 0x4c73972, 0xe7bc35ad, - 0x4c276e8, 0xe7c7d6f4, 0x4bdb6a6, 0xe7d3792b, - 0x4b8f8ad, 0xe7df1c50, 0x4b43cfd, 0xe7eac063, - 0x4af8397, 0xe7f66564, 0x4aacc7a, 0xe8020b52, - 0x4a617a6, 0xe80db22d, 0x4a1651c, 0xe81959f4, - 0x49cb4dd, 0xe82502a7, 0x49806e7, 0xe830ac45, - 0x4935b3c, 0xe83c56cf, 0x48eb1db, 0xe8480243, - 0x48a0ac4, 0xe853aea1, 0x48565f9, 0xe85f5be9, - 0x480c379, 0xe86b0a1a, 0x47c2344, 0xe876b934, - 0x477855a, 0xe8826936, 0x472e9bc, 0xe88e1a20, - 0x46e5069, 0xe899cbf1, 0x469b963, 0xe8a57ea9, - 0x46524a9, 0xe8b13248, 0x460923b, 0xe8bce6cd, - 0x45c0219, 0xe8c89c37, 0x4577444, 0xe8d45286, - 0x452e8bc, 0xe8e009ba, 0x44e5f80, 0xe8ebc1d3, - 0x449d892, 0xe8f77acf, 0x44553f2, 0xe90334af, - 0x440d19e, 0xe90eef71, 0x43c5199, 0xe91aab16, - 0x437d3e1, 0xe926679c, 0x4335877, 0xe9322505, - 0x42edf5c, 0xe93de34e, 0x42a688f, 0xe949a278, - 0x425f410, 0xe9556282, 0x42181e0, 0xe961236c, - 0x41d11ff, 0xe96ce535, 0x418a46d, 0xe978a7dd, - 0x414392b, 0xe9846b63, 0x40fd037, 0xe9902fc7, - 0x40b6994, 0xe99bf509, 0x4070540, 0xe9a7bb28, - 0x402a33c, 0xe9b38223, 0x3fe4388, 0xe9bf49fa, - 0x3f9e624, 0xe9cb12ad, 0x3f58b10, 0xe9d6dc3b, - 0x3f1324e, 0xe9e2a6a3, 0x3ecdbdc, 0xe9ee71e6, - 0x3e887bb, 0xe9fa3e03, 0x3e435ea, 0xea060af9, - 0x3dfe66c, 0xea11d8c8, 0x3db993e, 0xea1da770, - 0x3d74e62, 0xea2976ef, 0x3d305d8, 0xea354746, - 0x3cebfa0, 0xea411874, 0x3ca7bba, 0xea4cea79, - 0x3c63a26, 0xea58bd54, 0x3c1fae5, 0xea649105, - 0x3bdbdf6, 0xea70658a, 0x3b9835a, 0xea7c3ae5, - 0x3b54b11, 0xea881114, 0x3b1151b, 0xea93e817, - 0x3ace178, 0xea9fbfed, 0x3a8b028, 0xeaab9896, - 0x3a4812c, 0xeab77212, 0x3a05484, 0xeac34c60, - 0x39c2a2f, 0xeacf277f, 0x398022f, 0xeadb0370, - 0x393dc82, 0xeae6e031, 0x38fb92a, 0xeaf2bdc3, - 0x38b9827, 0xeafe9c24, 0x3877978, 0xeb0a7b54, - 0x3835d1e, 0xeb165b54, 0x37f4319, 0xeb223c22, - 0x37b2b6a, 0xeb2e1dbe, 0x377160f, 0xeb3a0027, - 0x373030a, 0xeb45e35d, 0x36ef25b, 0xeb51c760, - 0x36ae401, 0xeb5dac2f, 0x366d7fd, 0xeb6991ca, - 0x362ce50, 0xeb75782f, 0x35ec6f8, 0xeb815f60, - 0x35ac1f7, 0xeb8d475b, 0x356bf4d, 0xeb99301f, - 0x352bef9, 0xeba519ad, 0x34ec0fc, 0xebb10404, - 0x34ac556, 0xebbcef23, 0x346cc07, 0xebc8db0b, - 0x342d510, 0xebd4c7ba, 0x33ee070, 0xebe0b52f, - 0x33aee27, 0xebeca36c, 0x336fe37, 0xebf8926f, - 0x333109e, 0xec048237, 0x32f255e, 0xec1072c4, - 0x32b3c75, 0xec1c6417, 0x32755e5, 0xec28562d, - 0x32371ae, 0xec344908, 0x31f8fcf, 0xec403ca5, - 0x31bb049, 0xec4c3106, 0x317d31c, 0xec582629, - 0x313f848, 0xec641c0e, 0x3101fce, 0xec7012b5, - 0x30c49ad, 0xec7c0a1d, 0x30875e5, 0xec880245, - 0x304a477, 0xec93fb2e, 0x300d563, 0xec9ff4d6, - 0x2fd08a9, 0xecabef3d, 0x2f93e4a, 0xecb7ea63, - 0x2f57644, 0xecc3e648, 0x2f1b099, 0xeccfe2ea, - 0x2eded49, 0xecdbe04a, 0x2ea2c53, 0xece7de66, - 0x2e66db8, 0xecf3dd3f, 0x2e2b178, 0xecffdcd4, - 0x2def794, 0xed0bdd25, 0x2db400a, 0xed17de31, - 0x2d78add, 0xed23dff7, 0x2d3d80a, 0xed2fe277, - 0x2d02794, 0xed3be5b1, 0x2cc7979, 0xed47e9a5, - 0x2c8cdbb, 0xed53ee51, 0x2c52459, 0xed5ff3b5, - 0x2c17d52, 0xed6bf9d1, 0x2bdd8a9, 0xed7800a5, - 0x2ba365c, 0xed84082f, 0x2b6966c, 0xed901070, - 0x2b2f8d8, 0xed9c1967, 0x2af5da2, 0xeda82313, - 0x2abc4c9, 0xedb42d74, 0x2a82e4d, 0xedc0388a, - 0x2a49a2e, 0xedcc4454, 0x2a1086d, 0xedd850d2, - 0x29d790a, 0xede45e03, 0x299ec05, 0xedf06be6, - 0x296615d, 0xedfc7a7c, 0x292d914, 0xee0889c4, - 0x28f5329, 0xee1499bd, 0x28bcf9c, 0xee20aa67, - 0x2884e6e, 0xee2cbbc1, 0x284cf9f, 0xee38cdcb, - 0x281532e, 0xee44e084, 0x27dd91c, 0xee50f3ed, - 0x27a616a, 0xee5d0804, 0x276ec16, 0xee691cc9, - 0x2737922, 0xee75323c, 0x270088e, 0xee81485c, - 0x26c9a58, 0xee8d5f29, 0x2692e83, 0xee9976a1, - 0x265c50e, 0xeea58ec6, 0x2625df8, 0xeeb1a796, - 0x25ef943, 0xeebdc110, 0x25b96ee, 0xeec9db35, - 0x25836f9, 0xeed5f604, 0x254d965, 0xeee2117c, - 0x2517e31, 0xeeee2d9d, 0x24e255e, 0xeefa4a67, - 0x24aceed, 0xef0667d9, 0x2477adc, 0xef1285f2, - 0x244292c, 0xef1ea4b2, 0x240d9de, 0xef2ac419, - 0x23d8cf1, 0xef36e426, 0x23a4265, 0xef4304d8, - 0x236fa3b, 0xef4f2630, 0x233b473, 0xef5b482d, - 0x230710d, 0xef676ace, 0x22d3009, 0xef738e12, - 0x229f167, 0xef7fb1fa, 0x226b528, 0xef8bd685, - 0x2237b4b, 0xef97fbb2, 0x22043d0, 0xefa42181, - 0x21d0eb8, 0xefb047f2, 0x219dc03, 0xefbc6f03, - 0x216abb1, 0xefc896b5, 0x2137dc2, 0xefd4bf08, - 0x2105236, 0xefe0e7f9, 0x20d290d, 0xefed118a, - 0x20a0248, 0xeff93bba, 0x206dde6, 0xf0056687, - 0x203bbe8, 0xf01191f3, 0x2009c4e, 0xf01dbdfb, - 0x1fd7f17, 0xf029eaa1, 0x1fa6445, 0xf03617e2, - 0x1f74bd6, 0xf04245c0, 0x1f435cc, 0xf04e7438, - 0x1f12227, 0xf05aa34c, 0x1ee10e5, 0xf066d2fa, - 0x1eb0209, 0xf0730342, 0x1e7f591, 0xf07f3424, - 0x1e4eb7e, 0xf08b659f, 0x1e1e3d0, 0xf09797b2, - 0x1dede87, 0xf0a3ca5d, 0x1dbdba3, 0xf0affda0, - 0x1d8db25, 0xf0bc317a, 0x1d5dd0c, 0xf0c865ea, - 0x1d2e158, 0xf0d49af1, 0x1cfe80a, 0xf0e0d08d, - 0x1ccf122, 0xf0ed06bf, 0x1c9fca0, 0xf0f93d86, - 0x1c70a84, 0xf10574e0, 0x1c41ace, 0xf111accf, - 0x1c12d7e, 0xf11de551, 0x1be4294, 0xf12a1e66, - 0x1bb5a11, 0xf136580d, 0x1b873f5, 0xf1429247, - 0x1b5903f, 0xf14ecd11, 0x1b2aef0, 0xf15b086d, - 0x1afd007, 0xf1674459, 0x1acf386, 0xf17380d6, - 0x1aa196c, 0xf17fbde2, 0x1a741b9, 0xf18bfb7d, - 0x1a46c6e, 0xf19839a6, 0x1a1998a, 0xf1a4785e, - 0x19ec90d, 0xf1b0b7a4, 0x19bfaf9, 0xf1bcf777, - 0x1992f4c, 0xf1c937d6, 0x1966606, 0xf1d578c2, - 0x1939f29, 0xf1e1ba3a, 0x190dab4, 0xf1edfc3d, - 0x18e18a7, 0xf1fa3ecb, 0x18b5903, 0xf20681e3, - 0x1889bc6, 0xf212c585, 0x185e0f3, 0xf21f09b1, - 0x1832888, 0xf22b4e66, 0x1807285, 0xf23793a3, - 0x17dbeec, 0xf243d968, 0x17b0dbb, 0xf2501fb5, - 0x1785ef4, 0xf25c6688, 0x175b296, 0xf268ade3, - 0x17308a1, 0xf274f5c3, 0x1706115, 0xf2813e2a, - 0x16dbbf3, 0xf28d8715, 0x16b193a, 0xf299d085, - 0x16878eb, 0xf2a61a7a, 0x165db05, 0xf2b264f2, - 0x1633f8a, 0xf2beafed, 0x160a678, 0xf2cafb6b, - 0x15e0fd1, 0xf2d7476c, 0x15b7b94, 0xf2e393ef, - 0x158e9c1, 0xf2efe0f2, 0x1565a58, 0xf2fc2e77, - 0x153cd5a, 0xf3087c7d, 0x15142c6, 0xf314cb02, - 0x14eba9d, 0xf3211a07, 0x14c34df, 0xf32d698a, - 0x149b18b, 0xf339b98d, 0x14730a3, 0xf3460a0d, - 0x144b225, 0xf3525b0b, 0x1423613, 0xf35eac86, - 0x13fbc6c, 0xf36afe7e, 0x13d4530, 0xf37750f2, - 0x13ad060, 0xf383a3e2, 0x1385dfb, 0xf38ff74d, - 0x135ee02, 0xf39c4b32, 0x1338075, 0xf3a89f92, - 0x1311553, 0xf3b4f46c, 0x12eac9d, 0xf3c149bf, - 0x12c4653, 0xf3cd9f8b, 0x129e276, 0xf3d9f5cf, - 0x1278104, 0xf3e64c8c, 0x12521ff, 0xf3f2a3bf, - 0x122c566, 0xf3fefb6a, 0x1206b39, 0xf40b538b, - 0x11e1379, 0xf417ac22, 0x11bbe26, 0xf424052f, - 0x1196b3f, 0xf4305eb0, 0x1171ac6, 0xf43cb8a7, - 0x114ccb9, 0xf4491311, 0x1128119, 0xf4556def, - 0x11037e6, 0xf461c940, 0x10df120, 0xf46e2504, - 0x10bacc8, 0xf47a8139, 0x1096add, 0xf486dde1, - 0x1072b5f, 0xf4933afa, 0x104ee4f, 0xf49f9884, - 0x102b3ac, 0xf4abf67e, 0x1007b77, 0xf4b854e7, - 0xfe45b0, 0xf4c4b3c0, 0xfc1257, 0xf4d11308, - 0xf9e16b, 0xf4dd72be, 0xf7b2ee, 0xf4e9d2e3, - 0xf586df, 0xf4f63374, 0xf35d3e, 0xf5029473, - 0xf1360b, 0xf50ef5de, 0xef1147, 0xf51b57b5, - 0xeceef1, 0xf527b9f7, 0xeacf09, 0xf5341ca5, - 0xe8b190, 0xf5407fbd, 0xe69686, 0xf54ce33f, - 0xe47deb, 0xf559472b, 0xe267be, 0xf565ab80, - 0xe05401, 0xf572103d, 0xde42b2, 0xf57e7563, - 0xdc33d2, 0xf58adaf0, 0xda2762, 0xf59740e5, - 0xd81d61, 0xf5a3a740, 0xd615cf, 0xf5b00e02, - 0xd410ad, 0xf5bc7529, 0xd20dfa, 0xf5c8dcb6, - 0xd00db6, 0xf5d544a7, 0xce0fe3, 0xf5e1acfd, - 0xcc147f, 0xf5ee15b7, 0xca1b8a, 0xf5fa7ed4, - 0xc82506, 0xf606e854, 0xc630f2, 0xf6135237, - 0xc43f4d, 0xf61fbc7b, 0xc25019, 0xf62c2721, - 0xc06355, 0xf6389228, 0xbe7901, 0xf644fd8f, - 0xbc911d, 0xf6516956, 0xbaabaa, 0xf65dd57d, - 0xb8c8a7, 0xf66a4203, 0xb6e815, 0xf676aee8, - 0xb509f3, 0xf6831c2b, 0xb32e42, 0xf68f89cb, - 0xb15502, 0xf69bf7c9, 0xaf7e33, 0xf6a86623, - 0xada9d4, 0xf6b4d4d9, 0xabd7e6, 0xf6c143ec, - 0xaa086a, 0xf6cdb359, 0xa83b5e, 0xf6da2321, - 0xa670c4, 0xf6e69344, 0xa4a89b, 0xf6f303c0, - 0xa2e2e3, 0xf6ff7496, 0xa11f9d, 0xf70be5c4, - 0x9f5ec8, 0xf718574b, 0x9da065, 0xf724c92a, - 0x9be473, 0xf7313b60, 0x9a2af3, 0xf73daded, - 0x9873e4, 0xf74a20d0, 0x96bf48, 0xf756940a, - 0x950d1d, 0xf7630799, 0x935d64, 0xf76f7b7d, - 0x91b01d, 0xf77befb5, 0x900548, 0xf7886442, - 0x8e5ce5, 0xf794d922, 0x8cb6f5, 0xf7a14e55, - 0x8b1376, 0xf7adc3db, 0x89726a, 0xf7ba39b3, - 0x87d3d0, 0xf7c6afdc, 0x8637a9, 0xf7d32657, - 0x849df4, 0xf7df9d22, 0x8306b2, 0xf7ec143e, - 0x8171e2, 0xf7f88ba9, 0x7fdf85, 0xf8050364, - 0x7e4f9b, 0xf8117b6d, 0x7cc223, 0xf81df3c5, - 0x7b371e, 0xf82a6c6a, 0x79ae8c, 0xf836e55d, - 0x78286e, 0xf8435e9d, 0x76a4c2, 0xf84fd829, - 0x752389, 0xf85c5201, 0x73a4c3, 0xf868cc24, - 0x722871, 0xf8754692, 0x70ae92, 0xf881c14b, - 0x6f3726, 0xf88e3c4d, 0x6dc22e, 0xf89ab799, - 0x6c4fa8, 0xf8a7332e, 0x6adf97, 0xf8b3af0c, - 0x6971f9, 0xf8c02b31, 0x6806ce, 0xf8cca79e, - 0x669e18, 0xf8d92452, 0x6537d4, 0xf8e5a14d, - 0x63d405, 0xf8f21e8e, 0x6272aa, 0xf8fe9c15, - 0x6113c2, 0xf90b19e0, 0x5fb74e, 0xf91797f0, - 0x5e5d4e, 0xf9241645, 0x5d05c3, 0xf93094dd, - 0x5bb0ab, 0xf93d13b8, 0x5a5e07, 0xf94992d7, - 0x590dd8, 0xf9561237, 0x57c01d, 0xf96291d9, - 0x5674d6, 0xf96f11bc, 0x552c03, 0xf97b91e1, - 0x53e5a5, 0xf9881245, 0x52a1bb, 0xf99492ea, - 0x516045, 0xf9a113cd, 0x502145, 0xf9ad94f0, - 0x4ee4b8, 0xf9ba1651, 0x4daaa1, 0xf9c697f0, - 0x4c72fe, 0xf9d319cc, 0x4b3dcf, 0xf9df9be6, - 0x4a0b16, 0xf9ec1e3b, 0x48dad1, 0xf9f8a0cd, - 0x47ad01, 0xfa05239a, 0x4681a6, 0xfa11a6a3, - 0x4558c0, 0xfa1e29e5, 0x44324f, 0xfa2aad62, - 0x430e53, 0xfa373119, 0x41eccc, 0xfa43b508, - 0x40cdba, 0xfa503930, 0x3fb11d, 0xfa5cbd91, - 0x3e96f6, 0xfa694229, 0x3d7f44, 0xfa75c6f8, - 0x3c6a07, 0xfa824bfd, 0x3b573f, 0xfa8ed139, - 0x3a46ed, 0xfa9b56ab, 0x393910, 0xfaa7dc52, - 0x382da8, 0xfab4622d, 0x3724b6, 0xfac0e83d, - 0x361e3a, 0xfacd6e81, 0x351a33, 0xfad9f4f8, - 0x3418a2, 0xfae67ba2, 0x331986, 0xfaf3027e, - 0x321ce0, 0xfaff898c, 0x3122b0, 0xfb0c10cb, - 0x302af5, 0xfb18983b, 0x2f35b1, 0xfb251fdc, - 0x2e42e2, 0xfb31a7ac, 0x2d5289, 0xfb3e2fac, - 0x2c64a6, 0xfb4ab7db, 0x2b7939, 0xfb574039, - 0x2a9042, 0xfb63c8c4, 0x29a9c1, 0xfb70517d, - 0x28c5b6, 0xfb7cda63, 0x27e421, 0xfb896375, - 0x270502, 0xfb95ecb4, 0x262859, 0xfba2761e, - 0x254e27, 0xfbaeffb3, 0x24766a, 0xfbbb8973, - 0x23a124, 0xfbc8135c, 0x22ce54, 0xfbd49d70, - 0x21fdfb, 0xfbe127ac, 0x213018, 0xfbedb212, - 0x2064ab, 0xfbfa3c9f, 0x1f9bb5, 0xfc06c754, - 0x1ed535, 0xfc135231, 0x1e112b, 0xfc1fdd34, - 0x1d4f99, 0xfc2c685d, 0x1c907c, 0xfc38f3ac, - 0x1bd3d6, 0xfc457f21, 0x1b19a7, 0xfc520aba, - 0x1a61ee, 0xfc5e9678, 0x19acac, 0xfc6b2259, - 0x18f9e1, 0xfc77ae5e, 0x18498c, 0xfc843a85, - 0x179bae, 0xfc90c6cf, 0x16f047, 0xfc9d533b, - 0x164757, 0xfca9dfc8, 0x15a0dd, 0xfcb66c77, - 0x14fcda, 0xfcc2f945, 0x145b4e, 0xfccf8634, - 0x13bc39, 0xfcdc1342, 0x131f9b, 0xfce8a06f, - 0x128574, 0xfcf52dbb, 0x11edc3, 0xfd01bb24, - 0x11588a, 0xfd0e48ab, 0x10c5c7, 0xfd1ad650, - 0x10357c, 0xfd276410, 0xfa7a8, 0xfd33f1ed, - 0xf1c4a, 0xfd407fe6, 0xe9364, 0xfd4d0df9, - 0xe0cf5, 0xfd599c28, 0xd88fd, 0xfd662a70, - 0xd077c, 0xfd72b8d2, 0xc8872, 0xfd7f474d, - 0xc0be0, 0xfd8bd5e1, 0xb91c4, 0xfd98648d, - 0xb1a20, 0xfda4f351, 0xaa4f3, 0xfdb1822c, - 0xa323d, 0xfdbe111e, 0x9c1ff, 0xfdcaa027, - 0x95438, 0xfdd72f45, 0x8e8e8, 0xfde3be78, - 0x8800f, 0xfdf04dc0, 0x819ae, 0xfdfcdd1d, - 0x7b5c4, 0xfe096c8d, 0x75452, 0xfe15fc11, - 0x6f556, 0xfe228ba7, 0x698d3, 0xfe2f1b50, - 0x63ec6, 0xfe3bab0b, 0x5e731, 0xfe483ad8, - 0x59214, 0xfe54cab5, 0x53f6e, 0xfe615aa3, - 0x4ef3f, 0xfe6deaa1, 0x4a188, 0xfe7a7aae, - 0x45648, 0xfe870aca, 0x40d80, 0xfe939af5, - 0x3c72f, 0xfea02b2e, 0x38356, 0xfeacbb74, - 0x341f4, 0xfeb94bc8, 0x3030a, 0xfec5dc28, - 0x2c697, 0xfed26c94, 0x28c9c, 0xfedefd0c, - 0x25519, 0xfeeb8d8f, 0x2200d, 0xfef81e1d, - 0x1ed78, 0xff04aeb5, 0x1bd5c, 0xff113f56, - 0x18fb6, 0xff1dd001, 0x16489, 0xff2a60b4, - 0x13bd3, 0xff36f170, 0x11594, 0xff438234, - 0xf1ce, 0xff5012fe, 0xd07e, 0xff5ca3d0, - 0xb1a7, 0xff6934a8, 0x9547, 0xff75c585, - 0x7b5f, 0xff825668, 0x63ee, 0xff8ee750, - 0x4ef5, 0xff9b783c, 0x3c74, 0xffa8092c, - 0x2c6a, 0xffb49a1f, 0x1ed8, 0xffc12b16, - 0x13bd, 0xffcdbc0f, 0xb1a, 0xffda4d09, - 0x4ef, 0xffe6de05, 0x13c, 0xfff36f02, - 0x0, 0x0, 0x13c, 0xc90fe, - 0x4ef, 0x1921fb, 0xb1a, 0x25b2f7, - 0x13bd, 0x3243f1, 0x1ed8, 0x3ed4ea, - 0x2c6a, 0x4b65e1, 0x3c74, 0x57f6d4, - 0x4ef5, 0x6487c4, 0x63ee, 0x7118b0, - 0x7b5f, 0x7da998, 0x9547, 0x8a3a7b, - 0xb1a7, 0x96cb58, 0xd07e, 0xa35c30, - 0xf1ce, 0xafed02, 0x11594, 0xbc7dcc, - 0x13bd3, 0xc90e90, 0x16489, 0xd59f4c, - 0x18fb6, 0xe22fff, 0x1bd5c, 0xeec0aa, - 0x1ed78, 0xfb514b, 0x2200d, 0x107e1e3, - 0x25519, 0x1147271, 0x28c9c, 0x12102f4, - 0x2c697, 0x12d936c, 0x3030a, 0x13a23d8, - 0x341f4, 0x146b438, 0x38356, 0x153448c, - 0x3c72f, 0x15fd4d2, 0x40d80, 0x16c650b, - 0x45648, 0x178f536, 0x4a188, 0x1858552, - 0x4ef3f, 0x192155f, 0x53f6e, 0x19ea55d, - 0x59214, 0x1ab354b, 0x5e731, 0x1b7c528, - 0x63ec6, 0x1c454f5, 0x698d3, 0x1d0e4b0, - 0x6f556, 0x1dd7459, 0x75452, 0x1ea03ef, - 0x7b5c4, 0x1f69373, 0x819ae, 0x20322e3, - 0x8800f, 0x20fb240, 0x8e8e8, 0x21c4188, - 0x95438, 0x228d0bb, 0x9c1ff, 0x2355fd9, - 0xa323d, 0x241eee2, 0xaa4f3, 0x24e7dd4, - 0xb1a20, 0x25b0caf, 0xb91c4, 0x2679b73, - 0xc0be0, 0x2742a1f, 0xc8872, 0x280b8b3, - 0xd077c, 0x28d472e, 0xd88fd, 0x299d590, - 0xe0cf5, 0x2a663d8, 0xe9364, 0x2b2f207, - 0xf1c4a, 0x2bf801a, 0xfa7a8, 0x2cc0e13, - 0x10357c, 0x2d89bf0, 0x10c5c7, 0x2e529b0, - 0x11588a, 0x2f1b755, 0x11edc3, 0x2fe44dc, - 0x128574, 0x30ad245, 0x131f9b, 0x3175f91, - 0x13bc39, 0x323ecbe, 0x145b4e, 0x33079cc, - 0x14fcda, 0x33d06bb, 0x15a0dd, 0x3499389, - 0x164757, 0x3562038, 0x16f047, 0x362acc5, - 0x179bae, 0x36f3931, 0x18498c, 0x37bc57b, - 0x18f9e1, 0x38851a2, 0x19acac, 0x394dda7, - 0x1a61ee, 0x3a16988, 0x1b19a7, 0x3adf546, - 0x1bd3d6, 0x3ba80df, 0x1c907c, 0x3c70c54, - 0x1d4f99, 0x3d397a3, 0x1e112b, 0x3e022cc, - 0x1ed535, 0x3ecadcf, 0x1f9bb5, 0x3f938ac, - 0x2064ab, 0x405c361, 0x213018, 0x4124dee, - 0x21fdfb, 0x41ed854, 0x22ce54, 0x42b6290, - 0x23a124, 0x437eca4, 0x24766a, 0x444768d, - 0x254e27, 0x451004d, 0x262859, 0x45d89e2, - 0x270502, 0x46a134c, 0x27e421, 0x4769c8b, - 0x28c5b6, 0x483259d, 0x29a9c1, 0x48fae83, - 0x2a9042, 0x49c373c, 0x2b7939, 0x4a8bfc7, - 0x2c64a6, 0x4b54825, 0x2d5289, 0x4c1d054, - 0x2e42e2, 0x4ce5854, 0x2f35b1, 0x4dae024, - 0x302af5, 0x4e767c5, 0x3122b0, 0x4f3ef35, - 0x321ce0, 0x5007674, 0x331986, 0x50cfd82, - 0x3418a2, 0x519845e, 0x351a33, 0x5260b08, - 0x361e3a, 0x532917f, 0x3724b6, 0x53f17c3, - 0x382da8, 0x54b9dd3, 0x393910, 0x55823ae, - 0x3a46ed, 0x564a955, 0x3b573f, 0x5712ec7, - 0x3c6a07, 0x57db403, 0x3d7f44, 0x58a3908, - 0x3e96f6, 0x596bdd7, 0x3fb11d, 0x5a3426f, - 0x40cdba, 0x5afc6d0, 0x41eccc, 0x5bc4af8, - 0x430e53, 0x5c8cee7, 0x44324f, 0x5d5529e, - 0x4558c0, 0x5e1d61b, 0x4681a6, 0x5ee595d, - 0x47ad01, 0x5fadc66, 0x48dad1, 0x6075f33, - 0x4a0b16, 0x613e1c5, 0x4b3dcf, 0x620641a, - 0x4c72fe, 0x62ce634, 0x4daaa1, 0x6396810, - 0x4ee4b8, 0x645e9af, 0x502145, 0x6526b10, - 0x516045, 0x65eec33, 0x52a1bb, 0x66b6d16, - 0x53e5a5, 0x677edbb, 0x552c03, 0x6846e1f, - 0x5674d6, 0x690ee44, 0x57c01d, 0x69d6e27, - 0x590dd8, 0x6a9edc9, 0x5a5e07, 0x6b66d29, - 0x5bb0ab, 0x6c2ec48, 0x5d05c3, 0x6cf6b23, - 0x5e5d4e, 0x6dbe9bb, 0x5fb74e, 0x6e86810, - 0x6113c2, 0x6f4e620, 0x6272aa, 0x70163eb, - 0x63d405, 0x70de172, 0x6537d4, 0x71a5eb3, - 0x669e18, 0x726dbae, 0x6806ce, 0x7335862, - 0x6971f9, 0x73fd4cf, 0x6adf97, 0x74c50f4, - 0x6c4fa8, 0x758ccd2, 0x6dc22e, 0x7654867, - 0x6f3726, 0x771c3b3, 0x70ae92, 0x77e3eb5, - 0x722871, 0x78ab96e, 0x73a4c3, 0x79733dc, - 0x752389, 0x7a3adff, 0x76a4c2, 0x7b027d7, - 0x78286e, 0x7bca163, 0x79ae8c, 0x7c91aa3, - 0x7b371e, 0x7d59396, 0x7cc223, 0x7e20c3b, - 0x7e4f9b, 0x7ee8493, 0x7fdf85, 0x7fafc9c, - 0x8171e2, 0x8077457, 0x8306b2, 0x813ebc2, - 0x849df4, 0x82062de, 0x8637a9, 0x82cd9a9, - 0x87d3d0, 0x8395024, 0x89726a, 0x845c64d, - 0x8b1376, 0x8523c25, 0x8cb6f5, 0x85eb1ab, - 0x8e5ce5, 0x86b26de, 0x900548, 0x8779bbe, - 0x91b01d, 0x884104b, 0x935d64, 0x8908483, - 0x950d1d, 0x89cf867, 0x96bf48, 0x8a96bf6, - 0x9873e4, 0x8b5df30, 0x9a2af3, 0x8c25213, - 0x9be473, 0x8cec4a0, 0x9da065, 0x8db36d6, - 0x9f5ec8, 0x8e7a8b5, 0xa11f9d, 0x8f41a3c, - 0xa2e2e3, 0x9008b6a, 0xa4a89b, 0x90cfc40, - 0xa670c4, 0x9196cbc, 0xa83b5e, 0x925dcdf, - 0xaa086a, 0x9324ca7, 0xabd7e6, 0x93ebc14, - 0xada9d4, 0x94b2b27, 0xaf7e33, 0x95799dd, - 0xb15502, 0x9640837, 0xb32e42, 0x9707635, - 0xb509f3, 0x97ce3d5, 0xb6e815, 0x9895118, - 0xb8c8a7, 0x995bdfd, 0xbaabaa, 0x9a22a83, - 0xbc911d, 0x9ae96aa, 0xbe7901, 0x9bb0271, - 0xc06355, 0x9c76dd8, 0xc25019, 0x9d3d8df, - 0xc43f4d, 0x9e04385, 0xc630f2, 0x9ecadc9, - 0xc82506, 0x9f917ac, 0xca1b8a, 0xa05812c, - 0xcc147f, 0xa11ea49, 0xce0fe3, 0xa1e5303, - 0xd00db6, 0xa2abb59, 0xd20dfa, 0xa37234a, - 0xd410ad, 0xa438ad7, 0xd615cf, 0xa4ff1fe, - 0xd81d61, 0xa5c58c0, 0xda2762, 0xa68bf1b, - 0xdc33d2, 0xa752510, 0xde42b2, 0xa818a9d, - 0xe05401, 0xa8defc3, 0xe267be, 0xa9a5480, - 0xe47deb, 0xaa6b8d5, 0xe69686, 0xab31cc1, - 0xe8b190, 0xabf8043, 0xeacf09, 0xacbe35b, - 0xeceef1, 0xad84609, 0xef1147, 0xae4a84b, - 0xf1360b, 0xaf10a22, 0xf35d3e, 0xafd6b8d, - 0xf586df, 0xb09cc8c, 0xf7b2ee, 0xb162d1d, - 0xf9e16b, 0xb228d42, 0xfc1257, 0xb2eecf8, - 0xfe45b0, 0xb3b4c40, 0x1007b77, 0xb47ab19, - 0x102b3ac, 0xb540982, 0x104ee4f, 0xb60677c, - 0x1072b5f, 0xb6cc506, 0x1096add, 0xb79221f, - 0x10bacc8, 0xb857ec7, 0x10df120, 0xb91dafc, - 0x11037e6, 0xb9e36c0, 0x1128119, 0xbaa9211, - 0x114ccb9, 0xbb6ecef, 0x1171ac6, 0xbc34759, - 0x1196b3f, 0xbcfa150, 0x11bbe26, 0xbdbfad1, - 0x11e1379, 0xbe853de, 0x1206b39, 0xbf4ac75, - 0x122c566, 0xc010496, 0x12521ff, 0xc0d5c41, - 0x1278104, 0xc19b374, 0x129e276, 0xc260a31, - 0x12c4653, 0xc326075, 0x12eac9d, 0xc3eb641, - 0x1311553, 0xc4b0b94, 0x1338075, 0xc57606e, - 0x135ee02, 0xc63b4ce, 0x1385dfb, 0xc7008b3, - 0x13ad060, 0xc7c5c1e, 0x13d4530, 0xc88af0e, - 0x13fbc6c, 0xc950182, 0x1423613, 0xca1537a, - 0x144b225, 0xcada4f5, 0x14730a3, 0xcb9f5f3, - 0x149b18b, 0xcc64673, 0x14c34df, 0xcd29676, - 0x14eba9d, 0xcdee5f9, 0x15142c6, 0xceb34fe, - 0x153cd5a, 0xcf78383, 0x1565a58, 0xd03d189, - 0x158e9c1, 0xd101f0e, 0x15b7b94, 0xd1c6c11, - 0x15e0fd1, 0xd28b894, 0x160a678, 0xd350495, - 0x1633f8a, 0xd415013, 0x165db05, 0xd4d9b0e, - 0x16878eb, 0xd59e586, 0x16b193a, 0xd662f7b, - 0x16dbbf3, 0xd7278eb, 0x1706115, 0xd7ec1d6, - 0x17308a1, 0xd8b0a3d, 0x175b296, 0xd97521d, - 0x1785ef4, 0xda39978, 0x17b0dbb, 0xdafe04b, - 0x17dbeec, 0xdbc2698, 0x1807285, 0xdc86c5d, - 0x1832888, 0xdd4b19a, 0x185e0f3, 0xde0f64f, - 0x1889bc6, 0xded3a7b, 0x18b5903, 0xdf97e1d, - 0x18e18a7, 0xe05c135, 0x190dab4, 0xe1203c3, - 0x1939f29, 0xe1e45c6, 0x1966606, 0xe2a873e, - 0x1992f4c, 0xe36c82a, 0x19bfaf9, 0xe430889, - 0x19ec90d, 0xe4f485c, 0x1a1998a, 0xe5b87a2, - 0x1a46c6e, 0xe67c65a, 0x1a741b9, 0xe740483, - 0x1aa196c, 0xe80421e, 0x1acf386, 0xe8c7f2a, - 0x1afd007, 0xe98bba7, 0x1b2aef0, 0xea4f793, - 0x1b5903f, 0xeb132ef, 0x1b873f5, 0xebd6db9, - 0x1bb5a11, 0xec9a7f3, 0x1be4294, 0xed5e19a, - 0x1c12d7e, 0xee21aaf, 0x1c41ace, 0xeee5331, - 0x1c70a84, 0xefa8b20, 0x1c9fca0, 0xf06c27a, - 0x1ccf122, 0xf12f941, 0x1cfe80a, 0xf1f2f73, - 0x1d2e158, 0xf2b650f, 0x1d5dd0c, 0xf379a16, - 0x1d8db25, 0xf43ce86, 0x1dbdba3, 0xf500260, - 0x1dede87, 0xf5c35a3, 0x1e1e3d0, 0xf68684e, - 0x1e4eb7e, 0xf749a61, 0x1e7f591, 0xf80cbdc, - 0x1eb0209, 0xf8cfcbe, 0x1ee10e5, 0xf992d06, - 0x1f12227, 0xfa55cb4, 0x1f435cc, 0xfb18bc8, - 0x1f74bd6, 0xfbdba40, 0x1fa6445, 0xfc9e81e, - 0x1fd7f17, 0xfd6155f, 0x2009c4e, 0xfe24205, - 0x203bbe8, 0xfee6e0d, 0x206dde6, 0xffa9979, - 0x20a0248, 0x1006c446, 0x20d290d, 0x1012ee76, - 0x2105236, 0x101f1807, 0x2137dc2, 0x102b40f8, - 0x216abb1, 0x1037694b, 0x219dc03, 0x104390fd, - 0x21d0eb8, 0x104fb80e, 0x22043d0, 0x105bde7f, - 0x2237b4b, 0x1068044e, 0x226b528, 0x1074297b, - 0x229f167, 0x10804e06, 0x22d3009, 0x108c71ee, - 0x230710d, 0x10989532, 0x233b473, 0x10a4b7d3, - 0x236fa3b, 0x10b0d9d0, 0x23a4265, 0x10bcfb28, - 0x23d8cf1, 0x10c91bda, 0x240d9de, 0x10d53be7, - 0x244292c, 0x10e15b4e, 0x2477adc, 0x10ed7a0e, - 0x24aceed, 0x10f99827, 0x24e255e, 0x1105b599, - 0x2517e31, 0x1111d263, 0x254d965, 0x111dee84, - 0x25836f9, 0x112a09fc, 0x25b96ee, 0x113624cb, - 0x25ef943, 0x11423ef0, 0x2625df8, 0x114e586a, - 0x265c50e, 0x115a713a, 0x2692e83, 0x1166895f, - 0x26c9a58, 0x1172a0d7, 0x270088e, 0x117eb7a4, - 0x2737922, 0x118acdc4, 0x276ec16, 0x1196e337, - 0x27a616a, 0x11a2f7fc, 0x27dd91c, 0x11af0c13, - 0x281532e, 0x11bb1f7c, 0x284cf9f, 0x11c73235, - 0x2884e6e, 0x11d3443f, 0x28bcf9c, 0x11df5599, - 0x28f5329, 0x11eb6643, 0x292d914, 0x11f7763c, - 0x296615d, 0x12038584, 0x299ec05, 0x120f941a, - 0x29d790a, 0x121ba1fd, 0x2a1086d, 0x1227af2e, - 0x2a49a2e, 0x1233bbac, 0x2a82e4d, 0x123fc776, - 0x2abc4c9, 0x124bd28c, 0x2af5da2, 0x1257dced, - 0x2b2f8d8, 0x1263e699, 0x2b6966c, 0x126fef90, - 0x2ba365c, 0x127bf7d1, 0x2bdd8a9, 0x1287ff5b, - 0x2c17d52, 0x1294062f, 0x2c52459, 0x12a00c4b, - 0x2c8cdbb, 0x12ac11af, 0x2cc7979, 0x12b8165b, - 0x2d02794, 0x12c41a4f, 0x2d3d80a, 0x12d01d89, - 0x2d78add, 0x12dc2009, 0x2db400a, 0x12e821cf, - 0x2def794, 0x12f422db, 0x2e2b178, 0x1300232c, - 0x2e66db8, 0x130c22c1, 0x2ea2c53, 0x1318219a, - 0x2eded49, 0x13241fb6, 0x2f1b099, 0x13301d16, - 0x2f57644, 0x133c19b8, 0x2f93e4a, 0x1348159d, - 0x2fd08a9, 0x135410c3, 0x300d563, 0x13600b2a, - 0x304a477, 0x136c04d2, 0x30875e5, 0x1377fdbb, - 0x30c49ad, 0x1383f5e3, 0x3101fce, 0x138fed4b, - 0x313f848, 0x139be3f2, 0x317d31c, 0x13a7d9d7, - 0x31bb049, 0x13b3cefa, 0x31f8fcf, 0x13bfc35b, - 0x32371ae, 0x13cbb6f8, 0x32755e5, 0x13d7a9d3, - 0x32b3c75, 0x13e39be9, 0x32f255e, 0x13ef8d3c, - 0x333109e, 0x13fb7dc9, 0x336fe37, 0x14076d91, - 0x33aee27, 0x14135c94, 0x33ee070, 0x141f4ad1, - 0x342d510, 0x142b3846, 0x346cc07, 0x143724f5, - 0x34ac556, 0x144310dd, 0x34ec0fc, 0x144efbfc, - 0x352bef9, 0x145ae653, 0x356bf4d, 0x1466cfe1, - 0x35ac1f7, 0x1472b8a5, 0x35ec6f8, 0x147ea0a0, - 0x362ce50, 0x148a87d1, 0x366d7fd, 0x14966e36, - 0x36ae401, 0x14a253d1, 0x36ef25b, 0x14ae38a0, - 0x373030a, 0x14ba1ca3, 0x377160f, 0x14c5ffd9, - 0x37b2b6a, 0x14d1e242, 0x37f4319, 0x14ddc3de, - 0x3835d1e, 0x14e9a4ac, 0x3877978, 0x14f584ac, - 0x38b9827, 0x150163dc, 0x38fb92a, 0x150d423d, - 0x393dc82, 0x15191fcf, 0x398022f, 0x1524fc90, - 0x39c2a2f, 0x1530d881, 0x3a05484, 0x153cb3a0, - 0x3a4812c, 0x15488dee, 0x3a8b028, 0x1554676a, - 0x3ace178, 0x15604013, 0x3b1151b, 0x156c17e9, - 0x3b54b11, 0x1577eeec, 0x3b9835a, 0x1583c51b, - 0x3bdbdf6, 0x158f9a76, 0x3c1fae5, 0x159b6efb, - 0x3c63a26, 0x15a742ac, 0x3ca7bba, 0x15b31587, - 0x3cebfa0, 0x15bee78c, 0x3d305d8, 0x15cab8ba, - 0x3d74e62, 0x15d68911, 0x3db993e, 0x15e25890, - 0x3dfe66c, 0x15ee2738, 0x3e435ea, 0x15f9f507, - 0x3e887bb, 0x1605c1fd, 0x3ecdbdc, 0x16118e1a, - 0x3f1324e, 0x161d595d, 0x3f58b10, 0x162923c5, - 0x3f9e624, 0x1634ed53, 0x3fe4388, 0x1640b606, - 0x402a33c, 0x164c7ddd, 0x4070540, 0x165844d8, - 0x40b6994, 0x16640af7, 0x40fd037, 0x166fd039, - 0x414392b, 0x167b949d, 0x418a46d, 0x16875823, - 0x41d11ff, 0x16931acb, 0x42181e0, 0x169edc94, - 0x425f410, 0x16aa9d7e, 0x42a688f, 0x16b65d88, - 0x42edf5c, 0x16c21cb2, 0x4335877, 0x16cddafb, - 0x437d3e1, 0x16d99864, 0x43c5199, 0x16e554ea, - 0x440d19e, 0x16f1108f, 0x44553f2, 0x16fccb51, - 0x449d892, 0x17088531, 0x44e5f80, 0x17143e2d, - 0x452e8bc, 0x171ff646, 0x4577444, 0x172bad7a, - 0x45c0219, 0x173763c9, 0x460923b, 0x17431933, - 0x46524a9, 0x174ecdb8, 0x469b963, 0x175a8157, - 0x46e5069, 0x1766340f, 0x472e9bc, 0x1771e5e0, - 0x477855a, 0x177d96ca, 0x47c2344, 0x178946cc, - 0x480c379, 0x1794f5e6, 0x48565f9, 0x17a0a417, - 0x48a0ac4, 0x17ac515f, 0x48eb1db, 0x17b7fdbd, - 0x4935b3c, 0x17c3a931, 0x49806e7, 0x17cf53bb, - 0x49cb4dd, 0x17dafd59, 0x4a1651c, 0x17e6a60c, - 0x4a617a6, 0x17f24dd3, 0x4aacc7a, 0x17fdf4ae, - 0x4af8397, 0x18099a9c, 0x4b43cfd, 0x18153f9d, - 0x4b8f8ad, 0x1820e3b0, 0x4bdb6a6, 0x182c86d5, - 0x4c276e8, 0x1838290c, 0x4c73972, 0x1843ca53, - 0x4cbfe45, 0x184f6aab, 0x4d0c560, 0x185b0a13, - 0x4d58ec3, 0x1866a88a, 0x4da5a6f, 0x18724611, - 0x4df2862, 0x187de2a7, 0x4e3f89c, 0x18897e4a, - 0x4e8cb1e, 0x189518fc, 0x4ed9fe7, 0x18a0b2bb, - 0x4f276f7, 0x18ac4b87, 0x4f7504e, 0x18b7e35f, - 0x4fc2bec, 0x18c37a44, 0x50109d0, 0x18cf1034, - 0x505e9fb, 0x18daa52f, 0x50acc6b, 0x18e63935, - 0x50fb121, 0x18f1cc45, 0x514981d, 0x18fd5e5f, - 0x519815f, 0x1908ef82, 0x51e6ce6, 0x19147fae, - 0x5235ab2, 0x19200ee3, 0x5284ac3, 0x192b9d1f, - 0x52d3d18, 0x19372a64, 0x53231b3, 0x1942b6af, - 0x5372891, 0x194e4201, 0x53c21b4, 0x1959cc5a, - 0x5411d1b, 0x196555b8, 0x5461ac6, 0x1970de1b, - 0x54b1ab4, 0x197c6584, 0x5501ce5, 0x1987ebf0, - 0x555215a, 0x19937161, 0x55a2812, 0x199ef5d6, - 0x55f310d, 0x19aa794d, 0x5643c4a, 0x19b5fbc8, - 0x56949ca, 0x19c17d44, 0x56e598c, 0x19ccfdc2, - 0x5736b90, 0x19d87d42, 0x5787fd6, 0x19e3fbc3, - 0x57d965d, 0x19ef7944, 0x582af26, 0x19faf5c5, - 0x587ca31, 0x1a067145, 0x58ce77c, 0x1a11ebc5, - 0x5920708, 0x1a1d6544, 0x59728d5, 0x1a28ddc0, - 0x59c4ce3, 0x1a34553b, 0x5a17330, 0x1a3fcbb3, - 0x5a69bbe, 0x1a4b4128, 0x5abc68c, 0x1a56b599, - 0x5b0f399, 0x1a622907, 0x5b622e6, 0x1a6d9b70, - 0x5bb5472, 0x1a790cd4, 0x5c0883d, 0x1a847d33, - 0x5c5be47, 0x1a8fec8c, 0x5caf690, 0x1a9b5adf, - 0x5d03118, 0x1aa6c82b, 0x5d56ddd, 0x1ab23471, - 0x5daace1, 0x1abd9faf, 0x5dfee22, 0x1ac909e5, - 0x5e531a1, 0x1ad47312, 0x5ea775e, 0x1adfdb37, - 0x5efbf58, 0x1aeb4253, 0x5f5098f, 0x1af6a865, - 0x5fa5603, 0x1b020d6c, 0x5ffa4b3, 0x1b0d716a, - 0x604f5a0, 0x1b18d45c, 0x60a48c9, 0x1b243643, - 0x60f9e2e, 0x1b2f971e, 0x614f5cf, 0x1b3af6ec, - 0x61a4fac, 0x1b4655ae, 0x61fabc4, 0x1b51b363, - 0x6250a18, 0x1b5d100a, 0x62a6aa6, 0x1b686ba3, - 0x62fcd6f, 0x1b73c62d, 0x6353273, 0x1b7f1fa9, - 0x63a99b1, 0x1b8a7815, 0x6400329, 0x1b95cf71, - 0x6456edb, 0x1ba125bd, 0x64adcc7, 0x1bac7af9, - 0x6504ced, 0x1bb7cf23, 0x655bf4c, 0x1bc3223c, - 0x65b33e4, 0x1bce7442, 0x660aab5, 0x1bd9c537, - 0x66623be, 0x1be51518, 0x66b9f01, 0x1bf063e6, - 0x6711c7b, 0x1bfbb1a0, 0x6769c2e, 0x1c06fe46, - 0x67c1e18, 0x1c1249d8, 0x681a23a, 0x1c1d9454, - 0x6872894, 0x1c28ddbb, 0x68cb124, 0x1c34260c, - 0x6923bec, 0x1c3f6d47, 0x697c8eb, 0x1c4ab36b, - 0x69d5820, 0x1c55f878, 0x6a2e98b, 0x1c613c6d, - 0x6a87d2d, 0x1c6c7f4a, 0x6ae1304, 0x1c77c10e, - 0x6b3ab12, 0x1c8301b9, 0x6b94554, 0x1c8e414b, - 0x6bee1cd, 0x1c997fc4, 0x6c4807a, 0x1ca4bd21, - 0x6ca215c, 0x1caff965, 0x6cfc472, 0x1cbb348d, - 0x6d569be, 0x1cc66e99, 0x6db113d, 0x1cd1a78a, - 0x6e0baf0, 0x1cdcdf5e, 0x6e666d7, 0x1ce81615, - 0x6ec14f2, 0x1cf34baf, 0x6f1c540, 0x1cfe802b, - 0x6f777c1, 0x1d09b389, 0x6fd2c75, 0x1d14e5c9, - 0x702e35c, 0x1d2016e9, 0x7089c75, 0x1d2b46ea, - 0x70e57c0, 0x1d3675cb, 0x714153e, 0x1d41a38c, - 0x719d4ed, 0x1d4cd02c, 0x71f96ce, 0x1d57fbaa, - 0x7255ae0, 0x1d632608, 0x72b2123, 0x1d6e4f43, - 0x730e997, 0x1d79775c, 0x736b43c, 0x1d849e51, - 0x73c8111, 0x1d8fc424, 0x7425016, 0x1d9ae8d2, - 0x748214c, 0x1da60c5d, 0x74df4b1, 0x1db12ec3, - 0x753ca46, 0x1dbc5004, 0x759a20a, 0x1dc7701f, - 0x75f7bfe, 0x1dd28f15, 0x7655820, 0x1dddace4, - 0x76b3671, 0x1de8c98c, 0x77116f0, 0x1df3e50d, - 0x776f99d, 0x1dfeff67, 0x77cde79, 0x1e0a1898, - 0x782c582, 0x1e1530a1, 0x788aeb9, 0x1e204781, - 0x78e9a1d, 0x1e2b5d38, 0x79487ae, 0x1e3671c5, - 0x79a776c, 0x1e418528, 0x7a06957, 0x1e4c9760, - 0x7a65d6e, 0x1e57a86d, 0x7ac53b1, 0x1e62b84f, - 0x7b24c20, 0x1e6dc705, 0x7b846ba, 0x1e78d48e, - 0x7be4381, 0x1e83e0eb, 0x7c44272, 0x1e8eec1b, - 0x7ca438f, 0x1e99f61d, 0x7d046d6, 0x1ea4fef0, - 0x7d64c47, 0x1eb00696, 0x7dc53e3, 0x1ebb0d0d, - 0x7e25daa, 0x1ec61254, 0x7e8699a, 0x1ed1166b, - 0x7ee77b3, 0x1edc1953, 0x7f487f6, 0x1ee71b0a, - 0x7fa9a62, 0x1ef21b90, 0x800aef7, 0x1efd1ae4, - 0x806c5b5, 0x1f081907, 0x80cde9b, 0x1f1315f7, - 0x812f9a9, 0x1f1e11b5, 0x81916df, 0x1f290c3f, - 0x81f363d, 0x1f340596, 0x82557c3, 0x1f3efdb9, - 0x82b7b70, 0x1f49f4a8, 0x831a143, 0x1f54ea62, - 0x837c93e, 0x1f5fdee6, 0x83df35f, 0x1f6ad235, - 0x8441fa6, 0x1f75c44e, 0x84a4e14, 0x1f80b531, - 0x8507ea7, 0x1f8ba4dc, 0x856b160, 0x1f969350, - 0x85ce63e, 0x1fa1808c, 0x8631d42, 0x1fac6c91, - 0x869566a, 0x1fb7575c, 0x86f91b7, 0x1fc240ef, - 0x875cf28, 0x1fcd2948, 0x87c0ebd, 0x1fd81067, - 0x8825077, 0x1fe2f64c, 0x8889454, 0x1feddaf6, - 0x88eda54, 0x1ff8be65, 0x8952278, 0x2003a099, - 0x89b6cbf, 0x200e8190, 0x8a1b928, 0x2019614c, - 0x8a807b4, 0x20243fca, 0x8ae5862, 0x202f1d0b, - 0x8b4ab32, 0x2039f90f, 0x8bb0023, 0x2044d3d4, - 0x8c15736, 0x204fad5b, 0x8c7b06b, 0x205a85a3, - 0x8ce0bc0, 0x20655cac, 0x8d46936, 0x20703275, - 0x8dac8cd, 0x207b06fe, 0x8e12a84, 0x2085da46, - 0x8e78e5b, 0x2090ac4d, 0x8edf452, 0x209b7d13, - 0x8f45c68, 0x20a64c97, 0x8fac69e, 0x20b11ad9, - 0x90132f2, 0x20bbe7d8, 0x907a166, 0x20c6b395, - 0x90e11f7, 0x20d17e0d, 0x91484a8, 0x20dc4742, - 0x91af976, 0x20e70f32, 0x9217062, 0x20f1d5de, - 0x927e96b, 0x20fc9b44, 0x92e6492, 0x21075f65, - 0x934e1d6, 0x21122240, 0x93b6137, 0x211ce3d5, - 0x941e2b4, 0x2127a423, 0x948664d, 0x21326329, - 0x94eec03, 0x213d20e8, 0x95573d4, 0x2147dd5f, - 0x95bfdc1, 0x2152988d, 0x96289c9, 0x215d5273, - 0x96917ec, 0x21680b0f, 0x96fa82a, 0x2172c262, - 0x9763a83, 0x217d786a, 0x97ccef5, 0x21882d28, - 0x9836582, 0x2192e09b, 0x989fe29, 0x219d92c2, - 0x99098e9, 0x21a8439e, 0x99735c2, 0x21b2f32e, - 0x99dd4b4, 0x21bda171, 0x9a475bf, 0x21c84e67, - 0x9ab18e3, 0x21d2fa0f, 0x9b1be1e, 0x21dda46a, - 0x9b86572, 0x21e84d76, 0x9bf0edd, 0x21f2f534, - 0x9c5ba60, 0x21fd9ba3, 0x9cc67fa, 0x220840c2, - 0x9d317ab, 0x2212e492, 0x9d9c973, 0x221d8711, - 0x9e07d51, 0x2228283f, 0x9e73346, 0x2232c81c, - 0x9edeb50, 0x223d66a8, 0x9f4a570, 0x224803e2, - 0x9fb61a5, 0x22529fca, 0xa021fef, 0x225d3a5e, - 0xa08e04f, 0x2267d3a0, 0xa0fa2c3, 0x22726b8e, - 0xa16674b, 0x227d0228, 0xa1d2de7, 0x2287976e, - 0xa23f698, 0x22922b5e, 0xa2ac15b, 0x229cbdfa, - 0xa318e32, 0x22a74f40, 0xa385d1d, 0x22b1df30, - 0xa3f2e19, 0x22bc6dca, 0xa460129, 0x22c6fb0c, - 0xa4cd64b, 0x22d186f8, 0xa53ad7e, 0x22dc118c, - 0xa5a86c4, 0x22e69ac8, 0xa61621b, 0x22f122ab, - 0xa683f83, 0x22fba936, 0xa6f1efc, 0x23062e67, - 0xa760086, 0x2310b23e, 0xa7ce420, 0x231b34bc, - 0xa83c9ca, 0x2325b5df, 0xa8ab184, 0x233035a7, - 0xa919b4e, 0x233ab414, 0xa988727, 0x23453125, - 0xa9f750f, 0x234facda, 0xaa66506, 0x235a2733, - 0xaad570c, 0x2364a02e, 0xab44b1f, 0x236f17cc, - 0xabb4141, 0x23798e0d, 0xac23971, 0x238402ef, - 0xac933ae, 0x238e7673, 0xad02ff8, 0x2398e898, - 0xad72e4f, 0x23a3595e, 0xade2eb3, 0x23adc8c4, - 0xae53123, 0x23b836ca, 0xaec35a0, 0x23c2a36f, - 0xaf33c28, 0x23cd0eb3, 0xafa44bc, 0x23d77896, - 0xb014f5b, 0x23e1e117, 0xb085c05, 0x23ec4837, - 0xb0f6aba, 0x23f6adf3, 0xb167b79, 0x2401124d, - 0xb1d8e43, 0x240b7543, 0xb24a316, 0x2415d6d5, - 0xb2bb9f4, 0x24203704, 0xb32d2da, 0x242a95ce, - 0xb39edca, 0x2434f332, 0xb410ac3, 0x243f4f32, - 0xb4829c4, 0x2449a9cc, 0xb4f4acd, 0x245402ff, - 0xb566ddf, 0x245e5acc, 0xb5d92f8, 0x2468b132, - 0xb64ba19, 0x24730631, 0xb6be341, 0x247d59c8, - 0xb730e70, 0x2487abf7, 0xb7a3ba5, 0x2491fcbe, - 0xb816ae1, 0x249c4c1b, 0xb889c23, 0x24a69a0f, - 0xb8fcf6b, 0x24b0e699, 0xb9704b9, 0x24bb31ba, - 0xb9e3c0b, 0x24c57b6f, 0xba57563, 0x24cfc3ba, - 0xbacb0bf, 0x24da0a9a, 0xbb3ee20, 0x24e4500e, - 0xbbb2d85, 0x24ee9415, 0xbc26eee, 0x24f8d6b0, - 0xbc9b25a, 0x250317df, 0xbd0f7ca, 0x250d57a0, - 0xbd83f3d, 0x251795f3, 0xbdf88b3, 0x2521d2d8, - 0xbe6d42b, 0x252c0e4f, 0xbee21a5, 0x25364857, - 0xbf57121, 0x254080ef, 0xbfcc29f, 0x254ab818, - 0xc04161e, 0x2554edd1, 0xc0b6b9e, 0x255f2219, - 0xc12c31f, 0x256954f1, 0xc1a1ca0, 0x25738657, - 0xc217822, 0x257db64c, 0xc28d5a3, 0x2587e4cf, - 0xc303524, 0x259211df, 0xc3796a5, 0x259c3d7c, - 0xc3efa25, 0x25a667a7, 0xc465fa3, 0x25b0905d, - 0xc4dc720, 0x25bab7a0, 0xc55309b, 0x25c4dd6e, - 0xc5c9c14, 0x25cf01c8, 0xc64098b, 0x25d924ac, - 0xc6b78ff, 0x25e3461b, 0xc72ea70, 0x25ed6614, - 0xc7a5dde, 0x25f78497, 0xc81d349, 0x2601a1a2, - 0xc894aaf, 0x260bbd37, 0xc90c412, 0x2615d754, - 0xc983f70, 0x261feffa, 0xc9fbcca, 0x262a0727, - 0xca73c1e, 0x26341cdb, 0xcaebd6e, 0x263e3117, - 0xcb640b8, 0x264843d9, 0xcbdc5fc, 0x26525521, - 0xcc54d3a, 0x265c64ef, 0xcccd671, 0x26667342, - 0xcd461a2, 0x2670801a, 0xcdbeecc, 0x267a8b77, - 0xce37def, 0x26849558, 0xceb0f0a, 0x268e9dbd, - 0xcf2a21d, 0x2698a4a6, 0xcfa3729, 0x26a2aa11, - 0xd01ce2b, 0x26acadff, 0xd096725, 0x26b6b070, - 0xd110216, 0x26c0b162, 0xd189efe, 0x26cab0d6, - 0xd203ddc, 0x26d4aecb, 0xd27deb0, 0x26deab41, - 0xd2f817b, 0x26e8a637, 0xd37263a, 0x26f29fad, - 0xd3eccef, 0x26fc97a3, 0xd467599, 0x27068e18, - 0xd4e2037, 0x2710830c, 0xd55ccca, 0x271a767e, - 0xd5d7b50, 0x2724686e, 0xd652bcb, 0x272e58dc, - 0xd6cde39, 0x273847c8, 0xd74929a, 0x27423530, - 0xd7c48ee, 0x274c2115, 0xd840134, 0x27560b76, - 0xd8bbb6d, 0x275ff452, 0xd937798, 0x2769dbaa, - 0xd9b35b4, 0x2773c17d, 0xda2f5c2, 0x277da5cb, - 0xdaab7c0, 0x27878893, 0xdb27bb0, 0x279169d5, - 0xdba4190, 0x279b4990, 0xdc20960, 0x27a527c4, - 0xdc9d320, 0x27af0472, 0xdd19ed0, 0x27b8df97, - 0xdd96c6f, 0x27c2b934, 0xde13bfd, 0x27cc9149, - 0xde90d79, 0x27d667d5, 0xdf0e0e4, 0x27e03cd8, - 0xdf8b63d, 0x27ea1052, 0xe008d84, 0x27f3e241, - 0xe0866b8, 0x27fdb2a7, 0xe1041d9, 0x28078181, - 0xe181ee8, 0x28114ed0, 0xe1ffde2, 0x281b1a94, - 0xe27dec9, 0x2824e4cc, 0xe2fc19c, 0x282ead78, - 0xe37a65b, 0x28387498, 0xe3f8d05, 0x28423a2a, - 0xe47759a, 0x284bfe2f, 0xe4f6019, 0x2855c0a6, - 0xe574c84, 0x285f8190, 0xe5f3ad8, 0x286940ea, - 0xe672b16, 0x2872feb6, 0xe6f1d3d, 0x287cbaf3, - 0xe77114e, 0x288675a0, 0xe7f0748, 0x28902ebd, - 0xe86ff2a, 0x2899e64a, 0xe8ef8f4, 0x28a39c46, - 0xe96f4a7, 0x28ad50b1, 0xe9ef241, 0x28b7038b, - 0xea6f1c2, 0x28c0b4d2, 0xeaef32b, 0x28ca6488, - 0xeb6f67a, 0x28d412ab, 0xebefbb0, 0x28ddbf3b, - 0xec702cb, 0x28e76a37, 0xecf0bcd, 0x28f113a0, - 0xed716b4, 0x28fabb75, 0xedf2380, 0x290461b5, - 0xee73231, 0x290e0661, 0xeef42c7, 0x2917a977, - 0xef75541, 0x29214af8, 0xeff699f, 0x292aeae3, - 0xf077fe1, 0x29348937, 0xf0f9805, 0x293e25f5, - 0xf17b20d, 0x2947c11c, 0xf1fcdf8, 0x29515aab, - 0xf27ebc5, 0x295af2a3, 0xf300b74, 0x29648902, - 0xf382d05, 0x296e1dc9, 0xf405077, 0x2977b0f7, - 0xf4875ca, 0x2981428c, 0xf509cfe, 0x298ad287, - 0xf58c613, 0x299460e8, 0xf60f108, 0x299dedaf, - 0xf691ddd, 0x29a778db, 0xf714c91, 0x29b1026c, - 0xf797d24, 0x29ba8a61, 0xf81af97, 0x29c410ba, - 0xf89e3e8, 0x29cd9578, 0xf921a17, 0x29d71899, - 0xf9a5225, 0x29e09a1c, 0xfa28c10, 0x29ea1a03, - 0xfaac7d8, 0x29f3984c, 0xfb3057d, 0x29fd14f6, - 0xfbb4500, 0x2a069003, 0xfc3865e, 0x2a100970, - 0xfcbc999, 0x2a19813f, 0xfd40eaf, 0x2a22f76e, - 0xfdc55a1, 0x2a2c6bfd, 0xfe49e6d, 0x2a35deeb, - 0xfece915, 0x2a3f503a, 0xff53597, 0x2a48bfe7, - 0xffd83f4, 0x2a522df3, 0x1005d42a, 0x2a5b9a5d, - 0x100e2639, 0x2a650525, 0x10167a22, 0x2a6e6e4b, - 0x101ecfe4, 0x2a77d5ce, 0x1027277e, 0x2a813bae, - 0x102f80f1, 0x2a8a9fea, 0x1037dc3b, 0x2a940283, - 0x1040395d, 0x2a9d6377, 0x10489856, 0x2aa6c2c6, - 0x1050f926, 0x2ab02071, 0x10595bcd, 0x2ab97c77, - 0x1061c04a, 0x2ac2d6d6, 0x106a269d, 0x2acc2f90, - 0x10728ec6, 0x2ad586a3, 0x107af8c4, 0x2adedc10, - 0x10836497, 0x2ae82fd5, 0x108bd23f, 0x2af181f3, - 0x109441bb, 0x2afad269, 0x109cb30b, 0x2b042137, - 0x10a5262f, 0x2b0d6e5c, 0x10ad9b26, 0x2b16b9d9, - 0x10b611f1, 0x2b2003ac, 0x10be8a8d, 0x2b294bd5, - 0x10c704fd, 0x2b329255, 0x10cf813e, 0x2b3bd72a, - 0x10d7ff51, 0x2b451a55, 0x10e07f36, 0x2b4e5bd4, - 0x10e900ec, 0x2b579ba8, 0x10f18472, 0x2b60d9d0, - 0x10fa09c9, 0x2b6a164d, 0x110290f0, 0x2b73511c, - 0x110b19e7, 0x2b7c8a3f, 0x1113a4ad, 0x2b85c1b5, - 0x111c3142, 0x2b8ef77d, 0x1124bfa6, 0x2b982b97, - 0x112d4fd9, 0x2ba15e03, 0x1135e1d9, 0x2baa8ec0, - 0x113e75a8, 0x2bb3bdce, 0x11470b44, 0x2bbceb2d, - 0x114fa2ad, 0x2bc616dd, 0x11583be2, 0x2bcf40dc, - 0x1160d6e5, 0x2bd8692b, 0x116973b3, 0x2be18fc9, - 0x1172124d, 0x2beab4b6, 0x117ab2b3, 0x2bf3d7f2, - 0x118354e4, 0x2bfcf97c, 0x118bf8e0, 0x2c061953, - 0x11949ea6, 0x2c0f3779, 0x119d4636, 0x2c1853eb, - 0x11a5ef90, 0x2c216eaa, 0x11ae9ab4, 0x2c2a87b6, - 0x11b747a0, 0x2c339f0e, 0x11bff656, 0x2c3cb4b1, - 0x11c8a6d4, 0x2c45c8a0, 0x11d1591a, 0x2c4edada, - 0x11da0d28, 0x2c57eb5e, 0x11e2c2fd, 0x2c60fa2d, - 0x11eb7a9a, 0x2c6a0746, 0x11f433fd, 0x2c7312a9, - 0x11fcef27, 0x2c7c1c55, 0x1205ac17, 0x2c85244a, - 0x120e6acc, 0x2c8e2a87, 0x12172b48, 0x2c972f0d, - 0x121fed88, 0x2ca031da, 0x1228b18d, 0x2ca932ef, - 0x12317756, 0x2cb2324c, 0x123a3ee4, 0x2cbb2fef, - 0x12430835, 0x2cc42bd9, 0x124bd34a, 0x2ccd2609, - 0x1254a021, 0x2cd61e7f, 0x125d6ebc, 0x2cdf153a, - 0x12663f19, 0x2ce80a3a, 0x126f1138, 0x2cf0fd80, - 0x1277e518, 0x2cf9ef09, 0x1280babb, 0x2d02ded7, - 0x1289921e, 0x2d0bcce8, 0x12926b41, 0x2d14b93d, - 0x129b4626, 0x2d1da3d5, 0x12a422ca, 0x2d268cb0, - 0x12ad012e, 0x2d2f73cd, 0x12b5e151, 0x2d38592c, - 0x12bec333, 0x2d413ccd, 0x12c7a6d4, 0x2d4a1eaf, - 0x12d08c33, 0x2d52fed2, 0x12d97350, 0x2d5bdd36, - 0x12e25c2b, 0x2d64b9da, 0x12eb46c3, 0x2d6d94bf, - 0x12f43318, 0x2d766de2, 0x12fd2129, 0x2d7f4545, - 0x130610f7, 0x2d881ae8, 0x130f0280, 0x2d90eec8, - 0x1317f5c6, 0x2d99c0e7, 0x1320eac6, 0x2da29144, - 0x1329e181, 0x2dab5fdf, 0x1332d9f7, 0x2db42cb6, - 0x133bd427, 0x2dbcf7cb, 0x1344d011, 0x2dc5c11c, - 0x134dcdb4, 0x2dce88aa, 0x1356cd11, 0x2dd74e73, - 0x135fce26, 0x2de01278, 0x1368d0f3, 0x2de8d4b8, - 0x1371d579, 0x2df19534, 0x137adbb6, 0x2dfa53e9, - 0x1383e3ab, 0x2e0310d9, 0x138ced57, 0x2e0bcc03, - 0x1395f8ba, 0x2e148566, 0x139f05d3, 0x2e1d3d03, - 0x13a814a2, 0x2e25f2d8, 0x13b12526, 0x2e2ea6e6, - 0x13ba3760, 0x2e37592c, 0x13c34b4f, 0x2e4009aa, - 0x13cc60f2, 0x2e48b860, 0x13d5784a, 0x2e51654c, - 0x13de9156, 0x2e5a1070, 0x13e7ac15, 0x2e62b9ca, - 0x13f0c887, 0x2e6b615a, 0x13f9e6ad, 0x2e740720, - 0x14030684, 0x2e7cab1c, 0x140c280e, 0x2e854d4d, - 0x14154b4a, 0x2e8dedb3, 0x141e7037, 0x2e968c4d, - 0x142796d5, 0x2e9f291b, 0x1430bf24, 0x2ea7c41e, - 0x1439e923, 0x2eb05d53, 0x144314d3, 0x2eb8f4bc, - 0x144c4232, 0x2ec18a58, 0x14557140, 0x2eca1e27, - 0x145ea1fd, 0x2ed2b027, 0x1467d469, 0x2edb405a, - 0x14710883, 0x2ee3cebe, 0x147a3e4b, 0x2eec5b53, - 0x148375c1, 0x2ef4e619, 0x148caee4, 0x2efd6f10, - 0x1495e9b3, 0x2f05f637, 0x149f2630, 0x2f0e7b8e, - 0x14a86458, 0x2f16ff14, 0x14b1a42c, 0x2f1f80ca, - 0x14bae5ab, 0x2f2800af, 0x14c428d6, 0x2f307ec2, - 0x14cd6dab, 0x2f38fb03, 0x14d6b42b, 0x2f417573, - 0x14dffc54, 0x2f49ee0f, 0x14e94627, 0x2f5264da, - 0x14f291a4, 0x2f5ad9d1, 0x14fbdec9, 0x2f634cf5, - 0x15052d97, 0x2f6bbe45, 0x150e7e0d, 0x2f742dc1, - 0x1517d02b, 0x2f7c9b69, 0x152123f0, 0x2f85073c, - 0x152a795d, 0x2f8d713a, 0x1533d070, 0x2f95d963, - 0x153d292a, 0x2f9e3fb6, 0x15468389, 0x2fa6a433, - 0x154fdf8f, 0x2faf06da, 0x15593d3a, 0x2fb767aa, - 0x15629c89, 0x2fbfc6a3, 0x156bfd7d, 0x2fc823c5, - 0x15756016, 0x2fd07f0f, 0x157ec452, 0x2fd8d882, - 0x15882a32, 0x2fe1301c, 0x159191b5, 0x2fe985de, - 0x159afadb, 0x2ff1d9c7, 0x15a465a3, 0x2ffa2bd6, - 0x15add20d, 0x30027c0c, 0x15b74019, 0x300aca69, - 0x15c0afc6, 0x301316eb, 0x15ca2115, 0x301b6193, - 0x15d39403, 0x3023aa5f, 0x15dd0892, 0x302bf151, - 0x15e67ec1, 0x30343667, 0x15eff690, 0x303c79a2, - 0x15f96ffd, 0x3044bb00, 0x1602eb0a, 0x304cfa83, - 0x160c67b4, 0x30553828, 0x1615e5fd, 0x305d73f0, - 0x161f65e4, 0x3065addb, 0x1628e767, 0x306de5e9, - 0x16326a88, 0x30761c18, 0x163bef46, 0x307e5069, - 0x1645759f, 0x308682dc, 0x164efd94, 0x308eb36f, - 0x16588725, 0x3096e223, 0x16621251, 0x309f0ef8, - 0x166b9f18, 0x30a739ed, 0x16752d79, 0x30af6302, - 0x167ebd74, 0x30b78a36, 0x16884f09, 0x30bfaf89, - 0x1691e237, 0x30c7d2fb, 0x169b76fe, 0x30cff48c, - 0x16a50d5d, 0x30d8143b, 0x16aea555, 0x30e03208, - 0x16b83ee4, 0x30e84df3, 0x16c1da0b, 0x30f067fb, - 0x16cb76c9, 0x30f8801f, 0x16d5151d, 0x31009661, - 0x16deb508, 0x3108aabf, 0x16e85689, 0x3110bd39, - 0x16f1f99f, 0x3118cdcf, 0x16fb9e4b, 0x3120dc80, - 0x1705448b, 0x3128e94c, 0x170eec60, 0x3130f433, - 0x171895c9, 0x3138fd35, 0x172240c5, 0x31410450, - 0x172bed55, 0x31490986, 0x17359b78, 0x31510cd5, - 0x173f4b2e, 0x31590e3e, 0x1748fc75, 0x31610dbf, - 0x1752af4f, 0x31690b59, 0x175c63ba, 0x3171070c, - 0x176619b6, 0x317900d6, 0x176fd143, 0x3180f8b8, - 0x17798a60, 0x3188eeb2, 0x1783450d, 0x3190e2c3, - 0x178d014a, 0x3198d4ea, 0x1796bf16, 0x31a0c528, - 0x17a07e70, 0x31a8b37c, 0x17aa3f5a, 0x31b09fe7, - 0x17b401d1, 0x31b88a66, 0x17bdc5d6, 0x31c072fb, - 0x17c78b68, 0x31c859a5, 0x17d15288, 0x31d03e64, - 0x17db1b34, 0x31d82137, 0x17e4e56c, 0x31e0021e, - 0x17eeb130, 0x31e7e118, 0x17f87e7f, 0x31efbe27, - 0x18024d59, 0x31f79948, 0x180c1dbf, 0x31ff727c, - 0x1815efae, 0x320749c3, 0x181fc328, 0x320f1f1c, - 0x1829982b, 0x3216f287, 0x18336eb7, 0x321ec403, - 0x183d46cc, 0x32269391, 0x18472069, 0x322e6130, - 0x1850fb8e, 0x32362ce0, 0x185ad83c, 0x323df6a0, - 0x1864b670, 0x3245be70, 0x186e962b, 0x324d8450, - 0x1878776d, 0x32554840, 0x18825a35, 0x325d0a3e, - 0x188c3e83, 0x3264ca4c, 0x18962456, 0x326c8868, - 0x18a00bae, 0x32744493, 0x18a9f48a, 0x327bfecc, - 0x18b3deeb, 0x3283b712, 0x18bdcad0, 0x328b6d66, - 0x18c7b838, 0x329321c7, 0x18d1a724, 0x329ad435, - 0x18db9792, 0x32a284b0, 0x18e58982, 0x32aa3336, - 0x18ef7cf4, 0x32b1dfc9, 0x18f971e8, 0x32b98a67, - 0x1903685d, 0x32c13311, 0x190d6053, 0x32c8d9c6, - 0x191759c9, 0x32d07e85, 0x192154bf, 0x32d82150, - 0x192b5135, 0x32dfc224, 0x19354f2a, 0x32e76102, - 0x193f4e9e, 0x32eefdea, 0x19494f90, 0x32f698db, - 0x19535201, 0x32fe31d5, 0x195d55ef, 0x3305c8d7, - 0x19675b5a, 0x330d5de3, 0x19716243, 0x3314f0f6, - 0x197b6aa8, 0x331c8211, 0x19857489, 0x33241134, - 0x198f7fe6, 0x332b9e5e, 0x19998cbe, 0x3333298f, - 0x19a39b11, 0x333ab2c6, 0x19adaadf, 0x33423a04, - 0x19b7bc27, 0x3349bf48, 0x19c1cee9, 0x33514292, - 0x19cbe325, 0x3358c3e2, 0x19d5f8d9, 0x33604336, - 0x19e01006, 0x3367c090, 0x19ea28ac, 0x336f3bee, - 0x19f442c9, 0x3376b551, 0x19fe5e5e, 0x337e2cb7, - 0x1a087b69, 0x3385a222, 0x1a1299ec, 0x338d1590, - 0x1a1cb9e5, 0x33948701, 0x1a26db54, 0x339bf675, - 0x1a30fe38, 0x33a363ec, 0x1a3b2292, 0x33aacf65, - 0x1a454860, 0x33b238e0, 0x1a4f6fa3, 0x33b9a05d, - 0x1a599859, 0x33c105db, 0x1a63c284, 0x33c8695b, - 0x1a6dee21, 0x33cfcadc, 0x1a781b31, 0x33d72a5d, - 0x1a8249b4, 0x33de87de, 0x1a8c79a9, 0x33e5e360, - 0x1a96ab0f, 0x33ed3ce1, 0x1aa0dde7, 0x33f49462, - 0x1aab122f, 0x33fbe9e2, 0x1ab547e8, 0x34033d61, - 0x1abf7f11, 0x340a8edf, 0x1ac9b7a9, 0x3411de5b, - 0x1ad3f1b1, 0x34192bd5, 0x1ade2d28, 0x3420774d, - 0x1ae86a0d, 0x3427c0c3, 0x1af2a860, 0x342f0836, - 0x1afce821, 0x34364da6, 0x1b072950, 0x343d9112, - 0x1b116beb, 0x3444d27b, 0x1b1baff2, 0x344c11e0, - 0x1b25f566, 0x34534f41, 0x1b303c46, 0x345a8a9d, - 0x1b3a8491, 0x3461c3f5, 0x1b44ce46, 0x3468fb47, - 0x1b4f1967, 0x34703095, 0x1b5965f1, 0x347763dd, - 0x1b63b3e5, 0x347e951f, 0x1b6e0342, 0x3485c45b, - 0x1b785409, 0x348cf190, 0x1b82a638, 0x34941cbf, - 0x1b8cf9cf, 0x349b45e7, 0x1b974ece, 0x34a26d08, - 0x1ba1a534, 0x34a99221, 0x1babfd01, 0x34b0b533, - 0x1bb65634, 0x34b7d63c, 0x1bc0b0ce, 0x34bef53d, - 0x1bcb0cce, 0x34c61236, 0x1bd56a32, 0x34cd2d26, - 0x1bdfc8fc, 0x34d4460c, 0x1bea292b, 0x34db5cea, - 0x1bf48abd, 0x34e271bd, 0x1bfeedb3, 0x34e98487, - 0x1c09520d, 0x34f09546, 0x1c13b7c9, 0x34f7a3fb, - 0x1c1e1ee9, 0x34feb0a5, 0x1c28876a, 0x3505bb44, - 0x1c32f14d, 0x350cc3d8, 0x1c3d5c91, 0x3513ca60, - 0x1c47c936, 0x351acedd, 0x1c52373c, 0x3521d14d, - 0x1c5ca6a2, 0x3528d1b1, 0x1c671768, 0x352fd008, - 0x1c71898d, 0x3536cc52, 0x1c7bfd11, 0x353dc68f, - 0x1c8671f3, 0x3544bebf, 0x1c90e834, 0x354bb4e1, - 0x1c9b5fd2, 0x3552a8f4, 0x1ca5d8cd, 0x35599afa, - 0x1cb05326, 0x35608af1, 0x1cbacedb, 0x356778d9, - 0x1cc54bec, 0x356e64b2, 0x1ccfca59, 0x35754e7c, - 0x1cda4a21, 0x357c3636, 0x1ce4cb44, 0x35831be0, - 0x1cef4dc2, 0x3589ff7a, 0x1cf9d199, 0x3590e104, - 0x1d0456ca, 0x3597c07d, 0x1d0edd55, 0x359e9de5, - 0x1d196538, 0x35a5793c, 0x1d23ee74, 0x35ac5282, - 0x1d2e7908, 0x35b329b5, 0x1d3904f4, 0x35b9fed7, - 0x1d439236, 0x35c0d1e7, 0x1d4e20d0, 0x35c7a2e3, - 0x1d58b0c0, 0x35ce71ce, 0x1d634206, 0x35d53ea5, - 0x1d6dd4a2, 0x35dc0968, 0x1d786892, 0x35e2d219, - 0x1d82fdd8, 0x35e998b5, 0x1d8d9472, 0x35f05d3d, - 0x1d982c60, 0x35f71fb1, 0x1da2c5a2, 0x35fde011, - 0x1dad6036, 0x36049e5b, 0x1db7fc1e, 0x360b5a90, - 0x1dc29958, 0x361214b0, 0x1dcd37e4, 0x3618ccba, - 0x1dd7d7c1, 0x361f82af, 0x1de278ef, 0x3626368d, - 0x1ded1b6e, 0x362ce855, 0x1df7bf3e, 0x36339806, - 0x1e02645d, 0x363a45a0, 0x1e0d0acc, 0x3640f123, - 0x1e17b28a, 0x36479a8e, 0x1e225b96, 0x364e41e2, - 0x1e2d05f1, 0x3654e71d, 0x1e37b199, 0x365b8a41, - 0x1e425e8f, 0x36622b4c, 0x1e4d0cd2, 0x3668ca3e, - 0x1e57bc62, 0x366f6717, 0x1e626d3e, 0x367601d7, - 0x1e6d1f65, 0x367c9a7e, 0x1e77d2d8, 0x3683310b, - 0x1e828796, 0x3689c57d, 0x1e8d3d9e, 0x369057d6, - 0x1e97f4f1, 0x3696e814, 0x1ea2ad8d, 0x369d7637, - 0x1ead6773, 0x36a4023f, 0x1eb822a1, 0x36aa8c2c, - 0x1ec2df18, 0x36b113fd, 0x1ecd9cd7, 0x36b799b3, - 0x1ed85bdd, 0x36be1d4c, 0x1ee31c2b, 0x36c49ec9, - 0x1eedddc0, 0x36cb1e2a, 0x1ef8a09b, 0x36d19b6e, - 0x1f0364bc, 0x36d81695, 0x1f0e2a22, 0x36de8f9e, - 0x1f18f0ce, 0x36e5068a, 0x1f23b8be, 0x36eb7b58, - 0x1f2e81f3, 0x36f1ee09, 0x1f394c6b, 0x36f85e9a, - 0x1f441828, 0x36fecd0e, 0x1f4ee527, 0x37053962, - 0x1f59b369, 0x370ba398, 0x1f6482ed, 0x37120bae, - 0x1f6f53b3, 0x371871a5, 0x1f7a25ba, 0x371ed57c, - 0x1f84f902, 0x37253733, 0x1f8fcd8b, 0x372b96ca, - 0x1f9aa354, 0x3731f440, 0x1fa57a5d, 0x37384f95, - 0x1fb052a5, 0x373ea8ca, 0x1fbb2c2c, 0x3744ffdd, - 0x1fc606f1, 0x374b54ce, 0x1fd0e2f5, 0x3751a79e, - 0x1fdbc036, 0x3757f84c, 0x1fe69eb4, 0x375e46d8, - 0x1ff17e70, 0x37649341, 0x1ffc5f67, 0x376add88, - 0x2007419b, 0x377125ac, 0x2012250a, 0x37776bac, - 0x201d09b4, 0x377daf89, 0x2027ef99, 0x3783f143, - 0x2032d6b8, 0x378a30d8, 0x203dbf11, 0x37906e49, - 0x2048a8a4, 0x3796a996, 0x2053936f, 0x379ce2be, - 0x205e7f74, 0x37a319c2, 0x20696cb0, 0x37a94ea0, - 0x20745b24, 0x37af8159, 0x207f4acf, 0x37b5b1ec, - 0x208a3bb2, 0x37bbe05a, 0x20952dcb, 0x37c20ca1, - 0x20a0211a, 0x37c836c2, 0x20ab159e, 0x37ce5ebd, - 0x20b60b58, 0x37d48490, 0x20c10247, 0x37daa83d, - 0x20cbfa6a, 0x37e0c9c3, 0x20d6f3c1, 0x37e6e921, - 0x20e1ee4b, 0x37ed0657, 0x20ecea09, 0x37f32165, - 0x20f7e6f9, 0x37f93a4b, 0x2102e51c, 0x37ff5109, - 0x210de470, 0x3805659e, 0x2118e4f6, 0x380b780a, - 0x2123e6ad, 0x3811884d, 0x212ee995, 0x38179666, - 0x2139edac, 0x381da256, 0x2144f2f3, 0x3823ac1d, - 0x214ff96a, 0x3829b3b9, 0x215b0110, 0x382fb92a, - 0x216609e3, 0x3835bc71, 0x217113e5, 0x383bbd8e, - 0x217c1f15, 0x3841bc7f, 0x21872b72, 0x3847b946, - 0x219238fb, 0x384db3e0, 0x219d47b1, 0x3853ac4f, - 0x21a85793, 0x3859a292, 0x21b368a0, 0x385f96a9, - 0x21be7ad8, 0x38658894, 0x21c98e3b, 0x386b7852, - 0x21d4a2c8, 0x387165e3, 0x21dfb87f, 0x38775147, - 0x21eacf5f, 0x387d3a7e, 0x21f5e768, 0x38832187, - 0x22010099, 0x38890663, 0x220c1af3, 0x388ee910, - 0x22173674, 0x3894c98f, 0x2222531c, 0x389aa7e0, - 0x222d70eb, 0x38a08402, 0x22388fe1, 0x38a65df6, - 0x2243affc, 0x38ac35ba, 0x224ed13d, 0x38b20b4f, - 0x2259f3a3, 0x38b7deb4, 0x2265172e, 0x38bdafea, - 0x22703bdc, 0x38c37eef, 0x227b61af, 0x38c94bc4, - 0x228688a4, 0x38cf1669, 0x2291b0bd, 0x38d4dedd, - 0x229cd9f8, 0x38daa520, 0x22a80456, 0x38e06932, - 0x22b32fd4, 0x38e62b13, 0x22be5c74, 0x38ebeac2, - 0x22c98a35, 0x38f1a840, 0x22d4b916, 0x38f7638b, - 0x22dfe917, 0x38fd1ca4, 0x22eb1a37, 0x3902d38b, - 0x22f64c77, 0x3908883f, 0x23017fd5, 0x390e3ac0, - 0x230cb451, 0x3913eb0e, 0x2317e9eb, 0x39199929, - 0x232320a2, 0x391f4510, 0x232e5876, 0x3924eec3, - 0x23399167, 0x392a9642, 0x2344cb73, 0x39303b8e, - 0x2350069b, 0x3935dea4, 0x235b42df, 0x393b7f86, - 0x2366803c, 0x39411e33, 0x2371beb5, 0x3946baac, - 0x237cfe47, 0x394c54ee, 0x23883ef2, 0x3951ecfc, - 0x239380b6, 0x395782d3, 0x239ec393, 0x395d1675, - 0x23aa0788, 0x3962a7e0, 0x23b54c95, 0x39683715, - 0x23c092b9, 0x396dc414, 0x23cbd9f4, 0x39734edc, - 0x23d72245, 0x3978d76c, 0x23e26bac, 0x397e5dc6, - 0x23edb628, 0x3983e1e8, 0x23f901ba, 0x398963d2, - 0x24044e60, 0x398ee385, 0x240f9c1a, 0x399460ff, - 0x241aeae8, 0x3999dc42, 0x24263ac9, 0x399f554b, - 0x24318bbe, 0x39a4cc1c, 0x243cddc4, 0x39aa40b4, - 0x244830dd, 0x39afb313, 0x24538507, 0x39b52339, - 0x245eda43, 0x39ba9125, 0x246a308f, 0x39bffcd7, - 0x247587eb, 0x39c5664f, 0x2480e057, 0x39cacd8d, - 0x248c39d3, 0x39d03291, 0x2497945d, 0x39d5955a, - 0x24a2eff6, 0x39daf5e8, 0x24ae4c9d, 0x39e0543c, - 0x24b9aa52, 0x39e5b054, 0x24c50914, 0x39eb0a31, - 0x24d068e2, 0x39f061d2, 0x24dbc9bd, 0x39f5b737, - 0x24e72ba4, 0x39fb0a60, 0x24f28e96, 0x3a005b4d, - 0x24fdf294, 0x3a05a9fd, 0x2509579b, 0x3a0af671, - 0x2514bdad, 0x3a1040a8, 0x252024c9, 0x3a1588a2, - 0x252b8cee, 0x3a1ace5f, 0x2536f61b, 0x3a2011de, - 0x25426051, 0x3a25531f, 0x254dcb8f, 0x3a2a9223, - 0x255937d5, 0x3a2fcee8, 0x2564a521, 0x3a350970, - 0x25701374, 0x3a3a41b9, 0x257b82cd, 0x3a3f77c3, - 0x2586f32c, 0x3a44ab8e, 0x25926490, 0x3a49dd1a, - 0x259dd6f9, 0x3a4f0c67, 0x25a94a67, 0x3a543974, - 0x25b4bed8, 0x3a596442, 0x25c0344d, 0x3a5e8cd0, - 0x25cbaac5, 0x3a63b31d, 0x25d72240, 0x3a68d72b, - 0x25e29abc, 0x3a6df8f8, 0x25ee143b, 0x3a731884, - 0x25f98ebb, 0x3a7835cf, 0x26050a3b, 0x3a7d50da, - 0x261086bc, 0x3a8269a3, 0x261c043d, 0x3a87802a, - 0x262782be, 0x3a8c9470, 0x2633023e, 0x3a91a674, - 0x263e82bc, 0x3a96b636, 0x264a0438, 0x3a9bc3b6, - 0x265586b3, 0x3aa0cef3, 0x26610a2a, 0x3aa5d7ee, - 0x266c8e9f, 0x3aaadea6, 0x26781410, 0x3aafe31b, - 0x26839a7c, 0x3ab4e54c, 0x268f21e5, 0x3ab9e53a, - 0x269aaa48, 0x3abee2e5, 0x26a633a6, 0x3ac3de4c, - 0x26b1bdff, 0x3ac8d76f, 0x26bd4951, 0x3acdce4d, - 0x26c8d59c, 0x3ad2c2e8, 0x26d462e1, 0x3ad7b53d, - 0x26dff11d, 0x3adca54e, 0x26eb8052, 0x3ae1931a, - 0x26f7107e, 0x3ae67ea1, 0x2702a1a1, 0x3aeb67e3, - 0x270e33bb, 0x3af04edf, 0x2719c6cb, 0x3af53395, - 0x27255ad1, 0x3afa1605, 0x2730efcc, 0x3afef630, - 0x273c85bc, 0x3b03d414, 0x27481ca1, 0x3b08afb2, - 0x2753b479, 0x3b0d8909, 0x275f4d45, 0x3b126019, - 0x276ae704, 0x3b1734e2, 0x277681b6, 0x3b1c0764, - 0x27821d59, 0x3b20d79e, 0x278db9ef, 0x3b25a591, - 0x27995776, 0x3b2a713d, 0x27a4f5ed, 0x3b2f3aa0, - 0x27b09555, 0x3b3401bb, 0x27bc35ad, 0x3b38c68e, - 0x27c7d6f4, 0x3b3d8918, 0x27d3792b, 0x3b42495a, - 0x27df1c50, 0x3b470753, 0x27eac063, 0x3b4bc303, - 0x27f66564, 0x3b507c69, 0x28020b52, 0x3b553386, - 0x280db22d, 0x3b59e85a, 0x281959f4, 0x3b5e9ae4, - 0x282502a7, 0x3b634b23, 0x2830ac45, 0x3b67f919, - 0x283c56cf, 0x3b6ca4c4, 0x28480243, 0x3b714e25, - 0x2853aea1, 0x3b75f53c, 0x285f5be9, 0x3b7a9a07, - 0x286b0a1a, 0x3b7f3c87, 0x2876b934, 0x3b83dcbc, - 0x28826936, 0x3b887aa6, 0x288e1a20, 0x3b8d1644, - 0x2899cbf1, 0x3b91af97, 0x28a57ea9, 0x3b96469d, - 0x28b13248, 0x3b9adb57, 0x28bce6cd, 0x3b9f6dc5, - 0x28c89c37, 0x3ba3fde7, 0x28d45286, 0x3ba88bbc, - 0x28e009ba, 0x3bad1744, 0x28ebc1d3, 0x3bb1a080, - 0x28f77acf, 0x3bb6276e, 0x290334af, 0x3bbaac0e, - 0x290eef71, 0x3bbf2e62, 0x291aab16, 0x3bc3ae67, - 0x2926679c, 0x3bc82c1f, 0x29322505, 0x3bcca789, - 0x293de34e, 0x3bd120a4, 0x2949a278, 0x3bd59771, - 0x29556282, 0x3bda0bf0, 0x2961236c, 0x3bde7e20, - 0x296ce535, 0x3be2ee01, 0x2978a7dd, 0x3be75b93, - 0x29846b63, 0x3bebc6d5, 0x29902fc7, 0x3bf02fc9, - 0x299bf509, 0x3bf4966c, 0x29a7bb28, 0x3bf8fac0, - 0x29b38223, 0x3bfd5cc4, 0x29bf49fa, 0x3c01bc78, - 0x29cb12ad, 0x3c0619dc, 0x29d6dc3b, 0x3c0a74f0, - 0x29e2a6a3, 0x3c0ecdb2, 0x29ee71e6, 0x3c132424, - 0x29fa3e03, 0x3c177845, 0x2a060af9, 0x3c1bca16, - 0x2a11d8c8, 0x3c201994, 0x2a1da770, 0x3c2466c2, - 0x2a2976ef, 0x3c28b19e, 0x2a354746, 0x3c2cfa28, - 0x2a411874, 0x3c314060, 0x2a4cea79, 0x3c358446, - 0x2a58bd54, 0x3c39c5da, 0x2a649105, 0x3c3e051b, - 0x2a70658a, 0x3c42420a, 0x2a7c3ae5, 0x3c467ca6, - 0x2a881114, 0x3c4ab4ef, 0x2a93e817, 0x3c4eeae5, - 0x2a9fbfed, 0x3c531e88, 0x2aab9896, 0x3c574fd8, - 0x2ab77212, 0x3c5b7ed4, 0x2ac34c60, 0x3c5fab7c, - 0x2acf277f, 0x3c63d5d1, 0x2adb0370, 0x3c67fdd1, - 0x2ae6e031, 0x3c6c237e, 0x2af2bdc3, 0x3c7046d6, - 0x2afe9c24, 0x3c7467d9, 0x2b0a7b54, 0x3c788688, - 0x2b165b54, 0x3c7ca2e2, 0x2b223c22, 0x3c80bce7, - 0x2b2e1dbe, 0x3c84d496, 0x2b3a0027, 0x3c88e9f1, - 0x2b45e35d, 0x3c8cfcf6, 0x2b51c760, 0x3c910da5, - 0x2b5dac2f, 0x3c951bff, 0x2b6991ca, 0x3c992803, - 0x2b75782f, 0x3c9d31b0, 0x2b815f60, 0x3ca13908, - 0x2b8d475b, 0x3ca53e09, 0x2b99301f, 0x3ca940b3, - 0x2ba519ad, 0x3cad4107, 0x2bb10404, 0x3cb13f04, - 0x2bbcef23, 0x3cb53aaa, 0x2bc8db0b, 0x3cb933f9, - 0x2bd4c7ba, 0x3cbd2af0, 0x2be0b52f, 0x3cc11f90, - 0x2beca36c, 0x3cc511d9, 0x2bf8926f, 0x3cc901c9, - 0x2c048237, 0x3cccef62, 0x2c1072c4, 0x3cd0daa2, - 0x2c1c6417, 0x3cd4c38b, 0x2c28562d, 0x3cd8aa1b, - 0x2c344908, 0x3cdc8e52, 0x2c403ca5, 0x3ce07031, - 0x2c4c3106, 0x3ce44fb7, 0x2c582629, 0x3ce82ce4, - 0x2c641c0e, 0x3cec07b8, 0x2c7012b5, 0x3cefe032, - 0x2c7c0a1d, 0x3cf3b653, 0x2c880245, 0x3cf78a1b, - 0x2c93fb2e, 0x3cfb5b89, 0x2c9ff4d6, 0x3cff2a9d, - 0x2cabef3d, 0x3d02f757, 0x2cb7ea63, 0x3d06c1b6, - 0x2cc3e648, 0x3d0a89bc, 0x2ccfe2ea, 0x3d0e4f67, - 0x2cdbe04a, 0x3d1212b7, 0x2ce7de66, 0x3d15d3ad, - 0x2cf3dd3f, 0x3d199248, 0x2cffdcd4, 0x3d1d4e88, - 0x2d0bdd25, 0x3d21086c, 0x2d17de31, 0x3d24bff6, - 0x2d23dff7, 0x3d287523, 0x2d2fe277, 0x3d2c27f6, - 0x2d3be5b1, 0x3d2fd86c, 0x2d47e9a5, 0x3d338687, - 0x2d53ee51, 0x3d373245, 0x2d5ff3b5, 0x3d3adba7, - 0x2d6bf9d1, 0x3d3e82ae, 0x2d7800a5, 0x3d422757, - 0x2d84082f, 0x3d45c9a4, 0x2d901070, 0x3d496994, - 0x2d9c1967, 0x3d4d0728, 0x2da82313, 0x3d50a25e, - 0x2db42d74, 0x3d543b37, 0x2dc0388a, 0x3d57d1b3, - 0x2dcc4454, 0x3d5b65d2, 0x2dd850d2, 0x3d5ef793, - 0x2de45e03, 0x3d6286f6, 0x2df06be6, 0x3d6613fb, - 0x2dfc7a7c, 0x3d699ea3, 0x2e0889c4, 0x3d6d26ec, - 0x2e1499bd, 0x3d70acd7, 0x2e20aa67, 0x3d743064, - 0x2e2cbbc1, 0x3d77b192, 0x2e38cdcb, 0x3d7b3061, - 0x2e44e084, 0x3d7eacd2, 0x2e50f3ed, 0x3d8226e4, - 0x2e5d0804, 0x3d859e96, 0x2e691cc9, 0x3d8913ea, - 0x2e75323c, 0x3d8c86de, 0x2e81485c, 0x3d8ff772, - 0x2e8d5f29, 0x3d9365a8, 0x2e9976a1, 0x3d96d17d, - 0x2ea58ec6, 0x3d9a3af2, 0x2eb1a796, 0x3d9da208, - 0x2ebdc110, 0x3da106bd, 0x2ec9db35, 0x3da46912, - 0x2ed5f604, 0x3da7c907, 0x2ee2117c, 0x3dab269b, - 0x2eee2d9d, 0x3dae81cf, 0x2efa4a67, 0x3db1daa2, - 0x2f0667d9, 0x3db53113, 0x2f1285f2, 0x3db88524, - 0x2f1ea4b2, 0x3dbbd6d4, 0x2f2ac419, 0x3dbf2622, - 0x2f36e426, 0x3dc2730f, 0x2f4304d8, 0x3dc5bd9b, - 0x2f4f2630, 0x3dc905c5, 0x2f5b482d, 0x3dcc4b8d, - 0x2f676ace, 0x3dcf8ef3, 0x2f738e12, 0x3dd2cff7, - 0x2f7fb1fa, 0x3dd60e99, 0x2f8bd685, 0x3dd94ad8, - 0x2f97fbb2, 0x3ddc84b5, 0x2fa42181, 0x3ddfbc30, - 0x2fb047f2, 0x3de2f148, 0x2fbc6f03, 0x3de623fd, - 0x2fc896b5, 0x3de9544f, 0x2fd4bf08, 0x3dec823e, - 0x2fe0e7f9, 0x3defadca, 0x2fed118a, 0x3df2d6f3, - 0x2ff93bba, 0x3df5fdb8, 0x30056687, 0x3df9221a, - 0x301191f3, 0x3dfc4418, 0x301dbdfb, 0x3dff63b2, - 0x3029eaa1, 0x3e0280e9, 0x303617e2, 0x3e059bbb, - 0x304245c0, 0x3e08b42a, 0x304e7438, 0x3e0bca34, - 0x305aa34c, 0x3e0eddd9, 0x3066d2fa, 0x3e11ef1b, - 0x30730342, 0x3e14fdf7, 0x307f3424, 0x3e180a6f, - 0x308b659f, 0x3e1b1482, 0x309797b2, 0x3e1e1c30, - 0x30a3ca5d, 0x3e212179, 0x30affda0, 0x3e24245d, - 0x30bc317a, 0x3e2724db, 0x30c865ea, 0x3e2a22f4, - 0x30d49af1, 0x3e2d1ea8, 0x30e0d08d, 0x3e3017f6, - 0x30ed06bf, 0x3e330ede, 0x30f93d86, 0x3e360360, - 0x310574e0, 0x3e38f57c, 0x3111accf, 0x3e3be532, - 0x311de551, 0x3e3ed282, 0x312a1e66, 0x3e41bd6c, - 0x3136580d, 0x3e44a5ef, 0x31429247, 0x3e478c0b, - 0x314ecd11, 0x3e4a6fc1, 0x315b086d, 0x3e4d5110, - 0x31674459, 0x3e502ff9, 0x317380d6, 0x3e530c7a, - 0x317fbde2, 0x3e55e694, 0x318bfb7d, 0x3e58be47, - 0x319839a6, 0x3e5b9392, 0x31a4785e, 0x3e5e6676, - 0x31b0b7a4, 0x3e6136f3, 0x31bcf777, 0x3e640507, - 0x31c937d6, 0x3e66d0b4, 0x31d578c2, 0x3e6999fa, - 0x31e1ba3a, 0x3e6c60d7, 0x31edfc3d, 0x3e6f254c, - 0x31fa3ecb, 0x3e71e759, 0x320681e3, 0x3e74a6fd, - 0x3212c585, 0x3e77643a, 0x321f09b1, 0x3e7a1f0d, - 0x322b4e66, 0x3e7cd778, 0x323793a3, 0x3e7f8d7b, - 0x3243d968, 0x3e824114, 0x32501fb5, 0x3e84f245, - 0x325c6688, 0x3e87a10c, 0x3268ade3, 0x3e8a4d6a, - 0x3274f5c3, 0x3e8cf75f, 0x32813e2a, 0x3e8f9eeb, - 0x328d8715, 0x3e92440d, 0x3299d085, 0x3e94e6c6, - 0x32a61a7a, 0x3e978715, 0x32b264f2, 0x3e9a24fb, - 0x32beafed, 0x3e9cc076, 0x32cafb6b, 0x3e9f5988, - 0x32d7476c, 0x3ea1f02f, 0x32e393ef, 0x3ea4846c, - 0x32efe0f2, 0x3ea7163f, 0x32fc2e77, 0x3ea9a5a8, - 0x33087c7d, 0x3eac32a6, 0x3314cb02, 0x3eaebd3a, - 0x33211a07, 0x3eb14563, 0x332d698a, 0x3eb3cb21, - 0x3339b98d, 0x3eb64e75, 0x33460a0d, 0x3eb8cf5d, - 0x33525b0b, 0x3ebb4ddb, 0x335eac86, 0x3ebdc9ed, - 0x336afe7e, 0x3ec04394, 0x337750f2, 0x3ec2bad0, - 0x3383a3e2, 0x3ec52fa0, 0x338ff74d, 0x3ec7a205, - 0x339c4b32, 0x3eca11fe, 0x33a89f92, 0x3ecc7f8b, - 0x33b4f46c, 0x3eceeaad, 0x33c149bf, 0x3ed15363, - 0x33cd9f8b, 0x3ed3b9ad, 0x33d9f5cf, 0x3ed61d8a, - 0x33e64c8c, 0x3ed87efc, 0x33f2a3bf, 0x3edade01, - 0x33fefb6a, 0x3edd3a9a, 0x340b538b, 0x3edf94c7, - 0x3417ac22, 0x3ee1ec87, 0x3424052f, 0x3ee441da, - 0x34305eb0, 0x3ee694c1, 0x343cb8a7, 0x3ee8e53a, - 0x34491311, 0x3eeb3347, 0x34556def, 0x3eed7ee7, - 0x3461c940, 0x3eefc81a, 0x346e2504, 0x3ef20ee0, - 0x347a8139, 0x3ef45338, 0x3486dde1, 0x3ef69523, - 0x34933afa, 0x3ef8d4a1, 0x349f9884, 0x3efb11b1, - 0x34abf67e, 0x3efd4c54, 0x34b854e7, 0x3eff8489, - 0x34c4b3c0, 0x3f01ba50, 0x34d11308, 0x3f03eda9, - 0x34dd72be, 0x3f061e95, 0x34e9d2e3, 0x3f084d12, - 0x34f63374, 0x3f0a7921, 0x35029473, 0x3f0ca2c2, - 0x350ef5de, 0x3f0ec9f5, 0x351b57b5, 0x3f10eeb9, - 0x3527b9f7, 0x3f13110f, 0x35341ca5, 0x3f1530f7, - 0x35407fbd, 0x3f174e70, 0x354ce33f, 0x3f19697a, - 0x3559472b, 0x3f1b8215, 0x3565ab80, 0x3f1d9842, - 0x3572103d, 0x3f1fabff, 0x357e7563, 0x3f21bd4e, - 0x358adaf0, 0x3f23cc2e, 0x359740e5, 0x3f25d89e, - 0x35a3a740, 0x3f27e29f, 0x35b00e02, 0x3f29ea31, - 0x35bc7529, 0x3f2bef53, 0x35c8dcb6, 0x3f2df206, - 0x35d544a7, 0x3f2ff24a, 0x35e1acfd, 0x3f31f01d, - 0x35ee15b7, 0x3f33eb81, 0x35fa7ed4, 0x3f35e476, - 0x3606e854, 0x3f37dafa, 0x36135237, 0x3f39cf0e, - 0x361fbc7b, 0x3f3bc0b3, 0x362c2721, 0x3f3dafe7, - 0x36389228, 0x3f3f9cab, 0x3644fd8f, 0x3f4186ff, - 0x36516956, 0x3f436ee3, 0x365dd57d, 0x3f455456, - 0x366a4203, 0x3f473759, 0x3676aee8, 0x3f4917eb, - 0x36831c2b, 0x3f4af60d, 0x368f89cb, 0x3f4cd1be, - 0x369bf7c9, 0x3f4eaafe, 0x36a86623, 0x3f5081cd, - 0x36b4d4d9, 0x3f52562c, 0x36c143ec, 0x3f54281a, - 0x36cdb359, 0x3f55f796, 0x36da2321, 0x3f57c4a2, - 0x36e69344, 0x3f598f3c, 0x36f303c0, 0x3f5b5765, - 0x36ff7496, 0x3f5d1d1d, 0x370be5c4, 0x3f5ee063, - 0x3718574b, 0x3f60a138, 0x3724c92a, 0x3f625f9b, - 0x37313b60, 0x3f641b8d, 0x373daded, 0x3f65d50d, - 0x374a20d0, 0x3f678c1c, 0x3756940a, 0x3f6940b8, - 0x37630799, 0x3f6af2e3, 0x376f7b7d, 0x3f6ca29c, - 0x377befb5, 0x3f6e4fe3, 0x37886442, 0x3f6ffab8, - 0x3794d922, 0x3f71a31b, 0x37a14e55, 0x3f73490b, - 0x37adc3db, 0x3f74ec8a, 0x37ba39b3, 0x3f768d96, - 0x37c6afdc, 0x3f782c30, 0x37d32657, 0x3f79c857, - 0x37df9d22, 0x3f7b620c, 0x37ec143e, 0x3f7cf94e, - 0x37f88ba9, 0x3f7e8e1e, 0x38050364, 0x3f80207b, - 0x38117b6d, 0x3f81b065, 0x381df3c5, 0x3f833ddd, - 0x382a6c6a, 0x3f84c8e2, 0x3836e55d, 0x3f865174, - 0x38435e9d, 0x3f87d792, 0x384fd829, 0x3f895b3e, - 0x385c5201, 0x3f8adc77, 0x3868cc24, 0x3f8c5b3d, - 0x38754692, 0x3f8dd78f, 0x3881c14b, 0x3f8f516e, - 0x388e3c4d, 0x3f90c8da, 0x389ab799, 0x3f923dd2, - 0x38a7332e, 0x3f93b058, 0x38b3af0c, 0x3f952069, - 0x38c02b31, 0x3f968e07, 0x38cca79e, 0x3f97f932, - 0x38d92452, 0x3f9961e8, 0x38e5a14d, 0x3f9ac82c, - 0x38f21e8e, 0x3f9c2bfb, 0x38fe9c15, 0x3f9d8d56, - 0x390b19e0, 0x3f9eec3e, 0x391797f0, 0x3fa048b2, - 0x39241645, 0x3fa1a2b2, 0x393094dd, 0x3fa2fa3d, - 0x393d13b8, 0x3fa44f55, 0x394992d7, 0x3fa5a1f9, - 0x39561237, 0x3fa6f228, 0x396291d9, 0x3fa83fe3, - 0x396f11bc, 0x3fa98b2a, 0x397b91e1, 0x3faad3fd, - 0x39881245, 0x3fac1a5b, 0x399492ea, 0x3fad5e45, - 0x39a113cd, 0x3fae9fbb, 0x39ad94f0, 0x3fafdebb, - 0x39ba1651, 0x3fb11b48, 0x39c697f0, 0x3fb2555f, - 0x39d319cc, 0x3fb38d02, 0x39df9be6, 0x3fb4c231, - 0x39ec1e3b, 0x3fb5f4ea, 0x39f8a0cd, 0x3fb7252f, - 0x3a05239a, 0x3fb852ff, 0x3a11a6a3, 0x3fb97e5a, - 0x3a1e29e5, 0x3fbaa740, 0x3a2aad62, 0x3fbbcdb1, - 0x3a373119, 0x3fbcf1ad, 0x3a43b508, 0x3fbe1334, - 0x3a503930, 0x3fbf3246, 0x3a5cbd91, 0x3fc04ee3, - 0x3a694229, 0x3fc1690a, 0x3a75c6f8, 0x3fc280bc, - 0x3a824bfd, 0x3fc395f9, 0x3a8ed139, 0x3fc4a8c1, - 0x3a9b56ab, 0x3fc5b913, 0x3aa7dc52, 0x3fc6c6f0, - 0x3ab4622d, 0x3fc7d258, 0x3ac0e83d, 0x3fc8db4a, - 0x3acd6e81, 0x3fc9e1c6, 0x3ad9f4f8, 0x3fcae5cd, - 0x3ae67ba2, 0x3fcbe75e, 0x3af3027e, 0x3fcce67a, - 0x3aff898c, 0x3fcde320, 0x3b0c10cb, 0x3fcedd50, - 0x3b18983b, 0x3fcfd50b, 0x3b251fdc, 0x3fd0ca4f, - 0x3b31a7ac, 0x3fd1bd1e, 0x3b3e2fac, 0x3fd2ad77, - 0x3b4ab7db, 0x3fd39b5a, 0x3b574039, 0x3fd486c7, - 0x3b63c8c4, 0x3fd56fbe, 0x3b70517d, 0x3fd6563f, - 0x3b7cda63, 0x3fd73a4a, 0x3b896375, 0x3fd81bdf, - 0x3b95ecb4, 0x3fd8fafe, 0x3ba2761e, 0x3fd9d7a7, - 0x3baeffb3, 0x3fdab1d9, 0x3bbb8973, 0x3fdb8996, - 0x3bc8135c, 0x3fdc5edc, 0x3bd49d70, 0x3fdd31ac, - 0x3be127ac, 0x3fde0205, 0x3bedb212, 0x3fdecfe8, - 0x3bfa3c9f, 0x3fdf9b55, 0x3c06c754, 0x3fe0644b, - 0x3c135231, 0x3fe12acb, 0x3c1fdd34, 0x3fe1eed5, - 0x3c2c685d, 0x3fe2b067, 0x3c38f3ac, 0x3fe36f84, - 0x3c457f21, 0x3fe42c2a, 0x3c520aba, 0x3fe4e659, - 0x3c5e9678, 0x3fe59e12, 0x3c6b2259, 0x3fe65354, - 0x3c77ae5e, 0x3fe7061f, 0x3c843a85, 0x3fe7b674, - 0x3c90c6cf, 0x3fe86452, 0x3c9d533b, 0x3fe90fb9, - 0x3ca9dfc8, 0x3fe9b8a9, 0x3cb66c77, 0x3fea5f23, - 0x3cc2f945, 0x3feb0326, 0x3ccf8634, 0x3feba4b2, - 0x3cdc1342, 0x3fec43c7, 0x3ce8a06f, 0x3fece065, - 0x3cf52dbb, 0x3fed7a8c, 0x3d01bb24, 0x3fee123d, - 0x3d0e48ab, 0x3feea776, 0x3d1ad650, 0x3fef3a39, - 0x3d276410, 0x3fefca84, 0x3d33f1ed, 0x3ff05858, - 0x3d407fe6, 0x3ff0e3b6, 0x3d4d0df9, 0x3ff16c9c, - 0x3d599c28, 0x3ff1f30b, 0x3d662a70, 0x3ff27703, - 0x3d72b8d2, 0x3ff2f884, 0x3d7f474d, 0x3ff3778e, - 0x3d8bd5e1, 0x3ff3f420, 0x3d98648d, 0x3ff46e3c, - 0x3da4f351, 0x3ff4e5e0, 0x3db1822c, 0x3ff55b0d, - 0x3dbe111e, 0x3ff5cdc3, 0x3dcaa027, 0x3ff63e01, - 0x3dd72f45, 0x3ff6abc8, 0x3de3be78, 0x3ff71718, - 0x3df04dc0, 0x3ff77ff1, 0x3dfcdd1d, 0x3ff7e652, - 0x3e096c8d, 0x3ff84a3c, 0x3e15fc11, 0x3ff8abae, - 0x3e228ba7, 0x3ff90aaa, 0x3e2f1b50, 0x3ff9672d, - 0x3e3bab0b, 0x3ff9c13a, 0x3e483ad8, 0x3ffa18cf, - 0x3e54cab5, 0x3ffa6dec, 0x3e615aa3, 0x3ffac092, - 0x3e6deaa1, 0x3ffb10c1, 0x3e7a7aae, 0x3ffb5e78, - 0x3e870aca, 0x3ffba9b8, 0x3e939af5, 0x3ffbf280, - 0x3ea02b2e, 0x3ffc38d1, 0x3eacbb74, 0x3ffc7caa, - 0x3eb94bc8, 0x3ffcbe0c, 0x3ec5dc28, 0x3ffcfcf6, - 0x3ed26c94, 0x3ffd3969, 0x3edefd0c, 0x3ffd7364, - 0x3eeb8d8f, 0x3ffdaae7, 0x3ef81e1d, 0x3ffddff3, - 0x3f04aeb5, 0x3ffe1288, 0x3f113f56, 0x3ffe42a4, - 0x3f1dd001, 0x3ffe704a, 0x3f2a60b4, 0x3ffe9b77, - 0x3f36f170, 0x3ffec42d, 0x3f438234, 0x3ffeea6c, - 0x3f5012fe, 0x3fff0e32, 0x3f5ca3d0, 0x3fff2f82, - 0x3f6934a8, 0x3fff4e59, 0x3f75c585, 0x3fff6ab9, - 0x3f825668, 0x3fff84a1, 0x3f8ee750, 0x3fff9c12, - 0x3f9b783c, 0x3fffb10b, 0x3fa8092c, 0x3fffc38c, - 0x3fb49a1f, 0x3fffd396, 0x3fc12b16, 0x3fffe128, - 0x3fcdbc0f, 0x3fffec43, 0x3fda4d09, 0x3ffff4e6, - 0x3fe6de05, 0x3ffffb11, 0x3ff36f02, 0x3ffffec4, -}; - - -/** -* \par -* Generation of realCoefBQ31 array: -* \par -* n = 4096 -*
for (i = 0; i < n; i++)    
-* {    
-*    pBTable[2 * i] = 0.5 * (1.0 + sin (2 * PI / (double) (2 * n) * (double) i));    
-*    pBTable[2 * i + 1] = 0.5 * (1.0 * cos (2 * PI / (double) (2 * n) * (double) i));    
-* } 
-* \par -* Convert to fixed point Q31 format -* round(pBTable[i] * pow(2, 31)) -* -*/ - -static const q31_t realCoefBQ31[8192] = { - 0x40000000, 0x40000000, 0x400c90fe, 0x3ffffec4, - 0x401921fb, 0x3ffffb11, 0x4025b2f7, 0x3ffff4e6, - 0x403243f1, 0x3fffec43, 0x403ed4ea, 0x3fffe128, - 0x404b65e1, 0x3fffd396, 0x4057f6d4, 0x3fffc38c, - 0x406487c4, 0x3fffb10b, 0x407118b0, 0x3fff9c12, - 0x407da998, 0x3fff84a1, 0x408a3a7b, 0x3fff6ab9, - 0x4096cb58, 0x3fff4e59, 0x40a35c30, 0x3fff2f82, - 0x40afed02, 0x3fff0e32, 0x40bc7dcc, 0x3ffeea6c, - 0x40c90e90, 0x3ffec42d, 0x40d59f4c, 0x3ffe9b77, - 0x40e22fff, 0x3ffe704a, 0x40eec0aa, 0x3ffe42a4, - 0x40fb514b, 0x3ffe1288, 0x4107e1e3, 0x3ffddff3, - 0x41147271, 0x3ffdaae7, 0x412102f4, 0x3ffd7364, - 0x412d936c, 0x3ffd3969, 0x413a23d8, 0x3ffcfcf6, - 0x4146b438, 0x3ffcbe0c, 0x4153448c, 0x3ffc7caa, - 0x415fd4d2, 0x3ffc38d1, 0x416c650b, 0x3ffbf280, - 0x4178f536, 0x3ffba9b8, 0x41858552, 0x3ffb5e78, - 0x4192155f, 0x3ffb10c1, 0x419ea55d, 0x3ffac092, - 0x41ab354b, 0x3ffa6dec, 0x41b7c528, 0x3ffa18cf, - 0x41c454f5, 0x3ff9c13a, 0x41d0e4b0, 0x3ff9672d, - 0x41dd7459, 0x3ff90aaa, 0x41ea03ef, 0x3ff8abae, - 0x41f69373, 0x3ff84a3c, 0x420322e3, 0x3ff7e652, - 0x420fb240, 0x3ff77ff1, 0x421c4188, 0x3ff71718, - 0x4228d0bb, 0x3ff6abc8, 0x42355fd9, 0x3ff63e01, - 0x4241eee2, 0x3ff5cdc3, 0x424e7dd4, 0x3ff55b0d, - 0x425b0caf, 0x3ff4e5e0, 0x42679b73, 0x3ff46e3c, - 0x42742a1f, 0x3ff3f420, 0x4280b8b3, 0x3ff3778e, - 0x428d472e, 0x3ff2f884, 0x4299d590, 0x3ff27703, - 0x42a663d8, 0x3ff1f30b, 0x42b2f207, 0x3ff16c9c, - 0x42bf801a, 0x3ff0e3b6, 0x42cc0e13, 0x3ff05858, - 0x42d89bf0, 0x3fefca84, 0x42e529b0, 0x3fef3a39, - 0x42f1b755, 0x3feea776, 0x42fe44dc, 0x3fee123d, - 0x430ad245, 0x3fed7a8c, 0x43175f91, 0x3fece065, - 0x4323ecbe, 0x3fec43c7, 0x433079cc, 0x3feba4b2, - 0x433d06bb, 0x3feb0326, 0x43499389, 0x3fea5f23, - 0x43562038, 0x3fe9b8a9, 0x4362acc5, 0x3fe90fb9, - 0x436f3931, 0x3fe86452, 0x437bc57b, 0x3fe7b674, - 0x438851a2, 0x3fe7061f, 0x4394dda7, 0x3fe65354, - 0x43a16988, 0x3fe59e12, 0x43adf546, 0x3fe4e659, - 0x43ba80df, 0x3fe42c2a, 0x43c70c54, 0x3fe36f84, - 0x43d397a3, 0x3fe2b067, 0x43e022cc, 0x3fe1eed5, - 0x43ecadcf, 0x3fe12acb, 0x43f938ac, 0x3fe0644b, - 0x4405c361, 0x3fdf9b55, 0x44124dee, 0x3fdecfe8, - 0x441ed854, 0x3fde0205, 0x442b6290, 0x3fdd31ac, - 0x4437eca4, 0x3fdc5edc, 0x4444768d, 0x3fdb8996, - 0x4451004d, 0x3fdab1d9, 0x445d89e2, 0x3fd9d7a7, - 0x446a134c, 0x3fd8fafe, 0x44769c8b, 0x3fd81bdf, - 0x4483259d, 0x3fd73a4a, 0x448fae83, 0x3fd6563f, - 0x449c373c, 0x3fd56fbe, 0x44a8bfc7, 0x3fd486c7, - 0x44b54825, 0x3fd39b5a, 0x44c1d054, 0x3fd2ad77, - 0x44ce5854, 0x3fd1bd1e, 0x44dae024, 0x3fd0ca4f, - 0x44e767c5, 0x3fcfd50b, 0x44f3ef35, 0x3fcedd50, - 0x45007674, 0x3fcde320, 0x450cfd82, 0x3fcce67a, - 0x4519845e, 0x3fcbe75e, 0x45260b08, 0x3fcae5cd, - 0x4532917f, 0x3fc9e1c6, 0x453f17c3, 0x3fc8db4a, - 0x454b9dd3, 0x3fc7d258, 0x455823ae, 0x3fc6c6f0, - 0x4564a955, 0x3fc5b913, 0x45712ec7, 0x3fc4a8c1, - 0x457db403, 0x3fc395f9, 0x458a3908, 0x3fc280bc, - 0x4596bdd7, 0x3fc1690a, 0x45a3426f, 0x3fc04ee3, - 0x45afc6d0, 0x3fbf3246, 0x45bc4af8, 0x3fbe1334, - 0x45c8cee7, 0x3fbcf1ad, 0x45d5529e, 0x3fbbcdb1, - 0x45e1d61b, 0x3fbaa740, 0x45ee595d, 0x3fb97e5a, - 0x45fadc66, 0x3fb852ff, 0x46075f33, 0x3fb7252f, - 0x4613e1c5, 0x3fb5f4ea, 0x4620641a, 0x3fb4c231, - 0x462ce634, 0x3fb38d02, 0x46396810, 0x3fb2555f, - 0x4645e9af, 0x3fb11b48, 0x46526b10, 0x3fafdebb, - 0x465eec33, 0x3fae9fbb, 0x466b6d16, 0x3fad5e45, - 0x4677edbb, 0x3fac1a5b, 0x46846e1f, 0x3faad3fd, - 0x4690ee44, 0x3fa98b2a, 0x469d6e27, 0x3fa83fe3, - 0x46a9edc9, 0x3fa6f228, 0x46b66d29, 0x3fa5a1f9, - 0x46c2ec48, 0x3fa44f55, 0x46cf6b23, 0x3fa2fa3d, - 0x46dbe9bb, 0x3fa1a2b2, 0x46e86810, 0x3fa048b2, - 0x46f4e620, 0x3f9eec3e, 0x470163eb, 0x3f9d8d56, - 0x470de172, 0x3f9c2bfb, 0x471a5eb3, 0x3f9ac82c, - 0x4726dbae, 0x3f9961e8, 0x47335862, 0x3f97f932, - 0x473fd4cf, 0x3f968e07, 0x474c50f4, 0x3f952069, - 0x4758ccd2, 0x3f93b058, 0x47654867, 0x3f923dd2, - 0x4771c3b3, 0x3f90c8da, 0x477e3eb5, 0x3f8f516e, - 0x478ab96e, 0x3f8dd78f, 0x479733dc, 0x3f8c5b3d, - 0x47a3adff, 0x3f8adc77, 0x47b027d7, 0x3f895b3e, - 0x47bca163, 0x3f87d792, 0x47c91aa3, 0x3f865174, - 0x47d59396, 0x3f84c8e2, 0x47e20c3b, 0x3f833ddd, - 0x47ee8493, 0x3f81b065, 0x47fafc9c, 0x3f80207b, - 0x48077457, 0x3f7e8e1e, 0x4813ebc2, 0x3f7cf94e, - 0x482062de, 0x3f7b620c, 0x482cd9a9, 0x3f79c857, - 0x48395024, 0x3f782c30, 0x4845c64d, 0x3f768d96, - 0x48523c25, 0x3f74ec8a, 0x485eb1ab, 0x3f73490b, - 0x486b26de, 0x3f71a31b, 0x48779bbe, 0x3f6ffab8, - 0x4884104b, 0x3f6e4fe3, 0x48908483, 0x3f6ca29c, - 0x489cf867, 0x3f6af2e3, 0x48a96bf6, 0x3f6940b8, - 0x48b5df30, 0x3f678c1c, 0x48c25213, 0x3f65d50d, - 0x48cec4a0, 0x3f641b8d, 0x48db36d6, 0x3f625f9b, - 0x48e7a8b5, 0x3f60a138, 0x48f41a3c, 0x3f5ee063, - 0x49008b6a, 0x3f5d1d1d, 0x490cfc40, 0x3f5b5765, - 0x49196cbc, 0x3f598f3c, 0x4925dcdf, 0x3f57c4a2, - 0x49324ca7, 0x3f55f796, 0x493ebc14, 0x3f54281a, - 0x494b2b27, 0x3f52562c, 0x495799dd, 0x3f5081cd, - 0x49640837, 0x3f4eaafe, 0x49707635, 0x3f4cd1be, - 0x497ce3d5, 0x3f4af60d, 0x49895118, 0x3f4917eb, - 0x4995bdfd, 0x3f473759, 0x49a22a83, 0x3f455456, - 0x49ae96aa, 0x3f436ee3, 0x49bb0271, 0x3f4186ff, - 0x49c76dd8, 0x3f3f9cab, 0x49d3d8df, 0x3f3dafe7, - 0x49e04385, 0x3f3bc0b3, 0x49ecadc9, 0x3f39cf0e, - 0x49f917ac, 0x3f37dafa, 0x4a05812c, 0x3f35e476, - 0x4a11ea49, 0x3f33eb81, 0x4a1e5303, 0x3f31f01d, - 0x4a2abb59, 0x3f2ff24a, 0x4a37234a, 0x3f2df206, - 0x4a438ad7, 0x3f2bef53, 0x4a4ff1fe, 0x3f29ea31, - 0x4a5c58c0, 0x3f27e29f, 0x4a68bf1b, 0x3f25d89e, - 0x4a752510, 0x3f23cc2e, 0x4a818a9d, 0x3f21bd4e, - 0x4a8defc3, 0x3f1fabff, 0x4a9a5480, 0x3f1d9842, - 0x4aa6b8d5, 0x3f1b8215, 0x4ab31cc1, 0x3f19697a, - 0x4abf8043, 0x3f174e70, 0x4acbe35b, 0x3f1530f7, - 0x4ad84609, 0x3f13110f, 0x4ae4a84b, 0x3f10eeb9, - 0x4af10a22, 0x3f0ec9f5, 0x4afd6b8d, 0x3f0ca2c2, - 0x4b09cc8c, 0x3f0a7921, 0x4b162d1d, 0x3f084d12, - 0x4b228d42, 0x3f061e95, 0x4b2eecf8, 0x3f03eda9, - 0x4b3b4c40, 0x3f01ba50, 0x4b47ab19, 0x3eff8489, - 0x4b540982, 0x3efd4c54, 0x4b60677c, 0x3efb11b1, - 0x4b6cc506, 0x3ef8d4a1, 0x4b79221f, 0x3ef69523, - 0x4b857ec7, 0x3ef45338, 0x4b91dafc, 0x3ef20ee0, - 0x4b9e36c0, 0x3eefc81a, 0x4baa9211, 0x3eed7ee7, - 0x4bb6ecef, 0x3eeb3347, 0x4bc34759, 0x3ee8e53a, - 0x4bcfa150, 0x3ee694c1, 0x4bdbfad1, 0x3ee441da, - 0x4be853de, 0x3ee1ec87, 0x4bf4ac75, 0x3edf94c7, - 0x4c010496, 0x3edd3a9a, 0x4c0d5c41, 0x3edade01, - 0x4c19b374, 0x3ed87efc, 0x4c260a31, 0x3ed61d8a, - 0x4c326075, 0x3ed3b9ad, 0x4c3eb641, 0x3ed15363, - 0x4c4b0b94, 0x3eceeaad, 0x4c57606e, 0x3ecc7f8b, - 0x4c63b4ce, 0x3eca11fe, 0x4c7008b3, 0x3ec7a205, - 0x4c7c5c1e, 0x3ec52fa0, 0x4c88af0e, 0x3ec2bad0, - 0x4c950182, 0x3ec04394, 0x4ca1537a, 0x3ebdc9ed, - 0x4cada4f5, 0x3ebb4ddb, 0x4cb9f5f3, 0x3eb8cf5d, - 0x4cc64673, 0x3eb64e75, 0x4cd29676, 0x3eb3cb21, - 0x4cdee5f9, 0x3eb14563, 0x4ceb34fe, 0x3eaebd3a, - 0x4cf78383, 0x3eac32a6, 0x4d03d189, 0x3ea9a5a8, - 0x4d101f0e, 0x3ea7163f, 0x4d1c6c11, 0x3ea4846c, - 0x4d28b894, 0x3ea1f02f, 0x4d350495, 0x3e9f5988, - 0x4d415013, 0x3e9cc076, 0x4d4d9b0e, 0x3e9a24fb, - 0x4d59e586, 0x3e978715, 0x4d662f7b, 0x3e94e6c6, - 0x4d7278eb, 0x3e92440d, 0x4d7ec1d6, 0x3e8f9eeb, - 0x4d8b0a3d, 0x3e8cf75f, 0x4d97521d, 0x3e8a4d6a, - 0x4da39978, 0x3e87a10c, 0x4dafe04b, 0x3e84f245, - 0x4dbc2698, 0x3e824114, 0x4dc86c5d, 0x3e7f8d7b, - 0x4dd4b19a, 0x3e7cd778, 0x4de0f64f, 0x3e7a1f0d, - 0x4ded3a7b, 0x3e77643a, 0x4df97e1d, 0x3e74a6fd, - 0x4e05c135, 0x3e71e759, 0x4e1203c3, 0x3e6f254c, - 0x4e1e45c6, 0x3e6c60d7, 0x4e2a873e, 0x3e6999fa, - 0x4e36c82a, 0x3e66d0b4, 0x4e430889, 0x3e640507, - 0x4e4f485c, 0x3e6136f3, 0x4e5b87a2, 0x3e5e6676, - 0x4e67c65a, 0x3e5b9392, 0x4e740483, 0x3e58be47, - 0x4e80421e, 0x3e55e694, 0x4e8c7f2a, 0x3e530c7a, - 0x4e98bba7, 0x3e502ff9, 0x4ea4f793, 0x3e4d5110, - 0x4eb132ef, 0x3e4a6fc1, 0x4ebd6db9, 0x3e478c0b, - 0x4ec9a7f3, 0x3e44a5ef, 0x4ed5e19a, 0x3e41bd6c, - 0x4ee21aaf, 0x3e3ed282, 0x4eee5331, 0x3e3be532, - 0x4efa8b20, 0x3e38f57c, 0x4f06c27a, 0x3e360360, - 0x4f12f941, 0x3e330ede, 0x4f1f2f73, 0x3e3017f6, - 0x4f2b650f, 0x3e2d1ea8, 0x4f379a16, 0x3e2a22f4, - 0x4f43ce86, 0x3e2724db, 0x4f500260, 0x3e24245d, - 0x4f5c35a3, 0x3e212179, 0x4f68684e, 0x3e1e1c30, - 0x4f749a61, 0x3e1b1482, 0x4f80cbdc, 0x3e180a6f, - 0x4f8cfcbe, 0x3e14fdf7, 0x4f992d06, 0x3e11ef1b, - 0x4fa55cb4, 0x3e0eddd9, 0x4fb18bc8, 0x3e0bca34, - 0x4fbdba40, 0x3e08b42a, 0x4fc9e81e, 0x3e059bbb, - 0x4fd6155f, 0x3e0280e9, 0x4fe24205, 0x3dff63b2, - 0x4fee6e0d, 0x3dfc4418, 0x4ffa9979, 0x3df9221a, - 0x5006c446, 0x3df5fdb8, 0x5012ee76, 0x3df2d6f3, - 0x501f1807, 0x3defadca, 0x502b40f8, 0x3dec823e, - 0x5037694b, 0x3de9544f, 0x504390fd, 0x3de623fd, - 0x504fb80e, 0x3de2f148, 0x505bde7f, 0x3ddfbc30, - 0x5068044e, 0x3ddc84b5, 0x5074297b, 0x3dd94ad8, - 0x50804e06, 0x3dd60e99, 0x508c71ee, 0x3dd2cff7, - 0x50989532, 0x3dcf8ef3, 0x50a4b7d3, 0x3dcc4b8d, - 0x50b0d9d0, 0x3dc905c5, 0x50bcfb28, 0x3dc5bd9b, - 0x50c91bda, 0x3dc2730f, 0x50d53be7, 0x3dbf2622, - 0x50e15b4e, 0x3dbbd6d4, 0x50ed7a0e, 0x3db88524, - 0x50f99827, 0x3db53113, 0x5105b599, 0x3db1daa2, - 0x5111d263, 0x3dae81cf, 0x511dee84, 0x3dab269b, - 0x512a09fc, 0x3da7c907, 0x513624cb, 0x3da46912, - 0x51423ef0, 0x3da106bd, 0x514e586a, 0x3d9da208, - 0x515a713a, 0x3d9a3af2, 0x5166895f, 0x3d96d17d, - 0x5172a0d7, 0x3d9365a8, 0x517eb7a4, 0x3d8ff772, - 0x518acdc4, 0x3d8c86de, 0x5196e337, 0x3d8913ea, - 0x51a2f7fc, 0x3d859e96, 0x51af0c13, 0x3d8226e4, - 0x51bb1f7c, 0x3d7eacd2, 0x51c73235, 0x3d7b3061, - 0x51d3443f, 0x3d77b192, 0x51df5599, 0x3d743064, - 0x51eb6643, 0x3d70acd7, 0x51f7763c, 0x3d6d26ec, - 0x52038584, 0x3d699ea3, 0x520f941a, 0x3d6613fb, - 0x521ba1fd, 0x3d6286f6, 0x5227af2e, 0x3d5ef793, - 0x5233bbac, 0x3d5b65d2, 0x523fc776, 0x3d57d1b3, - 0x524bd28c, 0x3d543b37, 0x5257dced, 0x3d50a25e, - 0x5263e699, 0x3d4d0728, 0x526fef90, 0x3d496994, - 0x527bf7d1, 0x3d45c9a4, 0x5287ff5b, 0x3d422757, - 0x5294062f, 0x3d3e82ae, 0x52a00c4b, 0x3d3adba7, - 0x52ac11af, 0x3d373245, 0x52b8165b, 0x3d338687, - 0x52c41a4f, 0x3d2fd86c, 0x52d01d89, 0x3d2c27f6, - 0x52dc2009, 0x3d287523, 0x52e821cf, 0x3d24bff6, - 0x52f422db, 0x3d21086c, 0x5300232c, 0x3d1d4e88, - 0x530c22c1, 0x3d199248, 0x5318219a, 0x3d15d3ad, - 0x53241fb6, 0x3d1212b7, 0x53301d16, 0x3d0e4f67, - 0x533c19b8, 0x3d0a89bc, 0x5348159d, 0x3d06c1b6, - 0x535410c3, 0x3d02f757, 0x53600b2a, 0x3cff2a9d, - 0x536c04d2, 0x3cfb5b89, 0x5377fdbb, 0x3cf78a1b, - 0x5383f5e3, 0x3cf3b653, 0x538fed4b, 0x3cefe032, - 0x539be3f2, 0x3cec07b8, 0x53a7d9d7, 0x3ce82ce4, - 0x53b3cefa, 0x3ce44fb7, 0x53bfc35b, 0x3ce07031, - 0x53cbb6f8, 0x3cdc8e52, 0x53d7a9d3, 0x3cd8aa1b, - 0x53e39be9, 0x3cd4c38b, 0x53ef8d3c, 0x3cd0daa2, - 0x53fb7dc9, 0x3cccef62, 0x54076d91, 0x3cc901c9, - 0x54135c94, 0x3cc511d9, 0x541f4ad1, 0x3cc11f90, - 0x542b3846, 0x3cbd2af0, 0x543724f5, 0x3cb933f9, - 0x544310dd, 0x3cb53aaa, 0x544efbfc, 0x3cb13f04, - 0x545ae653, 0x3cad4107, 0x5466cfe1, 0x3ca940b3, - 0x5472b8a5, 0x3ca53e09, 0x547ea0a0, 0x3ca13908, - 0x548a87d1, 0x3c9d31b0, 0x54966e36, 0x3c992803, - 0x54a253d1, 0x3c951bff, 0x54ae38a0, 0x3c910da5, - 0x54ba1ca3, 0x3c8cfcf6, 0x54c5ffd9, 0x3c88e9f1, - 0x54d1e242, 0x3c84d496, 0x54ddc3de, 0x3c80bce7, - 0x54e9a4ac, 0x3c7ca2e2, 0x54f584ac, 0x3c788688, - 0x550163dc, 0x3c7467d9, 0x550d423d, 0x3c7046d6, - 0x55191fcf, 0x3c6c237e, 0x5524fc90, 0x3c67fdd1, - 0x5530d881, 0x3c63d5d1, 0x553cb3a0, 0x3c5fab7c, - 0x55488dee, 0x3c5b7ed4, 0x5554676a, 0x3c574fd8, - 0x55604013, 0x3c531e88, 0x556c17e9, 0x3c4eeae5, - 0x5577eeec, 0x3c4ab4ef, 0x5583c51b, 0x3c467ca6, - 0x558f9a76, 0x3c42420a, 0x559b6efb, 0x3c3e051b, - 0x55a742ac, 0x3c39c5da, 0x55b31587, 0x3c358446, - 0x55bee78c, 0x3c314060, 0x55cab8ba, 0x3c2cfa28, - 0x55d68911, 0x3c28b19e, 0x55e25890, 0x3c2466c2, - 0x55ee2738, 0x3c201994, 0x55f9f507, 0x3c1bca16, - 0x5605c1fd, 0x3c177845, 0x56118e1a, 0x3c132424, - 0x561d595d, 0x3c0ecdb2, 0x562923c5, 0x3c0a74f0, - 0x5634ed53, 0x3c0619dc, 0x5640b606, 0x3c01bc78, - 0x564c7ddd, 0x3bfd5cc4, 0x565844d8, 0x3bf8fac0, - 0x56640af7, 0x3bf4966c, 0x566fd039, 0x3bf02fc9, - 0x567b949d, 0x3bebc6d5, 0x56875823, 0x3be75b93, - 0x56931acb, 0x3be2ee01, 0x569edc94, 0x3bde7e20, - 0x56aa9d7e, 0x3bda0bf0, 0x56b65d88, 0x3bd59771, - 0x56c21cb2, 0x3bd120a4, 0x56cddafb, 0x3bcca789, - 0x56d99864, 0x3bc82c1f, 0x56e554ea, 0x3bc3ae67, - 0x56f1108f, 0x3bbf2e62, 0x56fccb51, 0x3bbaac0e, - 0x57088531, 0x3bb6276e, 0x57143e2d, 0x3bb1a080, - 0x571ff646, 0x3bad1744, 0x572bad7a, 0x3ba88bbc, - 0x573763c9, 0x3ba3fde7, 0x57431933, 0x3b9f6dc5, - 0x574ecdb8, 0x3b9adb57, 0x575a8157, 0x3b96469d, - 0x5766340f, 0x3b91af97, 0x5771e5e0, 0x3b8d1644, - 0x577d96ca, 0x3b887aa6, 0x578946cc, 0x3b83dcbc, - 0x5794f5e6, 0x3b7f3c87, 0x57a0a417, 0x3b7a9a07, - 0x57ac515f, 0x3b75f53c, 0x57b7fdbd, 0x3b714e25, - 0x57c3a931, 0x3b6ca4c4, 0x57cf53bb, 0x3b67f919, - 0x57dafd59, 0x3b634b23, 0x57e6a60c, 0x3b5e9ae4, - 0x57f24dd3, 0x3b59e85a, 0x57fdf4ae, 0x3b553386, - 0x58099a9c, 0x3b507c69, 0x58153f9d, 0x3b4bc303, - 0x5820e3b0, 0x3b470753, 0x582c86d5, 0x3b42495a, - 0x5838290c, 0x3b3d8918, 0x5843ca53, 0x3b38c68e, - 0x584f6aab, 0x3b3401bb, 0x585b0a13, 0x3b2f3aa0, - 0x5866a88a, 0x3b2a713d, 0x58724611, 0x3b25a591, - 0x587de2a7, 0x3b20d79e, 0x58897e4a, 0x3b1c0764, - 0x589518fc, 0x3b1734e2, 0x58a0b2bb, 0x3b126019, - 0x58ac4b87, 0x3b0d8909, 0x58b7e35f, 0x3b08afb2, - 0x58c37a44, 0x3b03d414, 0x58cf1034, 0x3afef630, - 0x58daa52f, 0x3afa1605, 0x58e63935, 0x3af53395, - 0x58f1cc45, 0x3af04edf, 0x58fd5e5f, 0x3aeb67e3, - 0x5908ef82, 0x3ae67ea1, 0x59147fae, 0x3ae1931a, - 0x59200ee3, 0x3adca54e, 0x592b9d1f, 0x3ad7b53d, - 0x59372a64, 0x3ad2c2e8, 0x5942b6af, 0x3acdce4d, - 0x594e4201, 0x3ac8d76f, 0x5959cc5a, 0x3ac3de4c, - 0x596555b8, 0x3abee2e5, 0x5970de1b, 0x3ab9e53a, - 0x597c6584, 0x3ab4e54c, 0x5987ebf0, 0x3aafe31b, - 0x59937161, 0x3aaadea6, 0x599ef5d6, 0x3aa5d7ee, - 0x59aa794d, 0x3aa0cef3, 0x59b5fbc8, 0x3a9bc3b6, - 0x59c17d44, 0x3a96b636, 0x59ccfdc2, 0x3a91a674, - 0x59d87d42, 0x3a8c9470, 0x59e3fbc3, 0x3a87802a, - 0x59ef7944, 0x3a8269a3, 0x59faf5c5, 0x3a7d50da, - 0x5a067145, 0x3a7835cf, 0x5a11ebc5, 0x3a731884, - 0x5a1d6544, 0x3a6df8f8, 0x5a28ddc0, 0x3a68d72b, - 0x5a34553b, 0x3a63b31d, 0x5a3fcbb3, 0x3a5e8cd0, - 0x5a4b4128, 0x3a596442, 0x5a56b599, 0x3a543974, - 0x5a622907, 0x3a4f0c67, 0x5a6d9b70, 0x3a49dd1a, - 0x5a790cd4, 0x3a44ab8e, 0x5a847d33, 0x3a3f77c3, - 0x5a8fec8c, 0x3a3a41b9, 0x5a9b5adf, 0x3a350970, - 0x5aa6c82b, 0x3a2fcee8, 0x5ab23471, 0x3a2a9223, - 0x5abd9faf, 0x3a25531f, 0x5ac909e5, 0x3a2011de, - 0x5ad47312, 0x3a1ace5f, 0x5adfdb37, 0x3a1588a2, - 0x5aeb4253, 0x3a1040a8, 0x5af6a865, 0x3a0af671, - 0x5b020d6c, 0x3a05a9fd, 0x5b0d716a, 0x3a005b4d, - 0x5b18d45c, 0x39fb0a60, 0x5b243643, 0x39f5b737, - 0x5b2f971e, 0x39f061d2, 0x5b3af6ec, 0x39eb0a31, - 0x5b4655ae, 0x39e5b054, 0x5b51b363, 0x39e0543c, - 0x5b5d100a, 0x39daf5e8, 0x5b686ba3, 0x39d5955a, - 0x5b73c62d, 0x39d03291, 0x5b7f1fa9, 0x39cacd8d, - 0x5b8a7815, 0x39c5664f, 0x5b95cf71, 0x39bffcd7, - 0x5ba125bd, 0x39ba9125, 0x5bac7af9, 0x39b52339, - 0x5bb7cf23, 0x39afb313, 0x5bc3223c, 0x39aa40b4, - 0x5bce7442, 0x39a4cc1c, 0x5bd9c537, 0x399f554b, - 0x5be51518, 0x3999dc42, 0x5bf063e6, 0x399460ff, - 0x5bfbb1a0, 0x398ee385, 0x5c06fe46, 0x398963d2, - 0x5c1249d8, 0x3983e1e8, 0x5c1d9454, 0x397e5dc6, - 0x5c28ddbb, 0x3978d76c, 0x5c34260c, 0x39734edc, - 0x5c3f6d47, 0x396dc414, 0x5c4ab36b, 0x39683715, - 0x5c55f878, 0x3962a7e0, 0x5c613c6d, 0x395d1675, - 0x5c6c7f4a, 0x395782d3, 0x5c77c10e, 0x3951ecfc, - 0x5c8301b9, 0x394c54ee, 0x5c8e414b, 0x3946baac, - 0x5c997fc4, 0x39411e33, 0x5ca4bd21, 0x393b7f86, - 0x5caff965, 0x3935dea4, 0x5cbb348d, 0x39303b8e, - 0x5cc66e99, 0x392a9642, 0x5cd1a78a, 0x3924eec3, - 0x5cdcdf5e, 0x391f4510, 0x5ce81615, 0x39199929, - 0x5cf34baf, 0x3913eb0e, 0x5cfe802b, 0x390e3ac0, - 0x5d09b389, 0x3908883f, 0x5d14e5c9, 0x3902d38b, - 0x5d2016e9, 0x38fd1ca4, 0x5d2b46ea, 0x38f7638b, - 0x5d3675cb, 0x38f1a840, 0x5d41a38c, 0x38ebeac2, - 0x5d4cd02c, 0x38e62b13, 0x5d57fbaa, 0x38e06932, - 0x5d632608, 0x38daa520, 0x5d6e4f43, 0x38d4dedd, - 0x5d79775c, 0x38cf1669, 0x5d849e51, 0x38c94bc4, - 0x5d8fc424, 0x38c37eef, 0x5d9ae8d2, 0x38bdafea, - 0x5da60c5d, 0x38b7deb4, 0x5db12ec3, 0x38b20b4f, - 0x5dbc5004, 0x38ac35ba, 0x5dc7701f, 0x38a65df6, - 0x5dd28f15, 0x38a08402, 0x5dddace4, 0x389aa7e0, - 0x5de8c98c, 0x3894c98f, 0x5df3e50d, 0x388ee910, - 0x5dfeff67, 0x38890663, 0x5e0a1898, 0x38832187, - 0x5e1530a1, 0x387d3a7e, 0x5e204781, 0x38775147, - 0x5e2b5d38, 0x387165e3, 0x5e3671c5, 0x386b7852, - 0x5e418528, 0x38658894, 0x5e4c9760, 0x385f96a9, - 0x5e57a86d, 0x3859a292, 0x5e62b84f, 0x3853ac4f, - 0x5e6dc705, 0x384db3e0, 0x5e78d48e, 0x3847b946, - 0x5e83e0eb, 0x3841bc7f, 0x5e8eec1b, 0x383bbd8e, - 0x5e99f61d, 0x3835bc71, 0x5ea4fef0, 0x382fb92a, - 0x5eb00696, 0x3829b3b9, 0x5ebb0d0d, 0x3823ac1d, - 0x5ec61254, 0x381da256, 0x5ed1166b, 0x38179666, - 0x5edc1953, 0x3811884d, 0x5ee71b0a, 0x380b780a, - 0x5ef21b90, 0x3805659e, 0x5efd1ae4, 0x37ff5109, - 0x5f081907, 0x37f93a4b, 0x5f1315f7, 0x37f32165, - 0x5f1e11b5, 0x37ed0657, 0x5f290c3f, 0x37e6e921, - 0x5f340596, 0x37e0c9c3, 0x5f3efdb9, 0x37daa83d, - 0x5f49f4a8, 0x37d48490, 0x5f54ea62, 0x37ce5ebd, - 0x5f5fdee6, 0x37c836c2, 0x5f6ad235, 0x37c20ca1, - 0x5f75c44e, 0x37bbe05a, 0x5f80b531, 0x37b5b1ec, - 0x5f8ba4dc, 0x37af8159, 0x5f969350, 0x37a94ea0, - 0x5fa1808c, 0x37a319c2, 0x5fac6c91, 0x379ce2be, - 0x5fb7575c, 0x3796a996, 0x5fc240ef, 0x37906e49, - 0x5fcd2948, 0x378a30d8, 0x5fd81067, 0x3783f143, - 0x5fe2f64c, 0x377daf89, 0x5feddaf6, 0x37776bac, - 0x5ff8be65, 0x377125ac, 0x6003a099, 0x376add88, - 0x600e8190, 0x37649341, 0x6019614c, 0x375e46d8, - 0x60243fca, 0x3757f84c, 0x602f1d0b, 0x3751a79e, - 0x6039f90f, 0x374b54ce, 0x6044d3d4, 0x3744ffdd, - 0x604fad5b, 0x373ea8ca, 0x605a85a3, 0x37384f95, - 0x60655cac, 0x3731f440, 0x60703275, 0x372b96ca, - 0x607b06fe, 0x37253733, 0x6085da46, 0x371ed57c, - 0x6090ac4d, 0x371871a5, 0x609b7d13, 0x37120bae, - 0x60a64c97, 0x370ba398, 0x60b11ad9, 0x37053962, - 0x60bbe7d8, 0x36fecd0e, 0x60c6b395, 0x36f85e9a, - 0x60d17e0d, 0x36f1ee09, 0x60dc4742, 0x36eb7b58, - 0x60e70f32, 0x36e5068a, 0x60f1d5de, 0x36de8f9e, - 0x60fc9b44, 0x36d81695, 0x61075f65, 0x36d19b6e, - 0x61122240, 0x36cb1e2a, 0x611ce3d5, 0x36c49ec9, - 0x6127a423, 0x36be1d4c, 0x61326329, 0x36b799b3, - 0x613d20e8, 0x36b113fd, 0x6147dd5f, 0x36aa8c2c, - 0x6152988d, 0x36a4023f, 0x615d5273, 0x369d7637, - 0x61680b0f, 0x3696e814, 0x6172c262, 0x369057d6, - 0x617d786a, 0x3689c57d, 0x61882d28, 0x3683310b, - 0x6192e09b, 0x367c9a7e, 0x619d92c2, 0x367601d7, - 0x61a8439e, 0x366f6717, 0x61b2f32e, 0x3668ca3e, - 0x61bda171, 0x36622b4c, 0x61c84e67, 0x365b8a41, - 0x61d2fa0f, 0x3654e71d, 0x61dda46a, 0x364e41e2, - 0x61e84d76, 0x36479a8e, 0x61f2f534, 0x3640f123, - 0x61fd9ba3, 0x363a45a0, 0x620840c2, 0x36339806, - 0x6212e492, 0x362ce855, 0x621d8711, 0x3626368d, - 0x6228283f, 0x361f82af, 0x6232c81c, 0x3618ccba, - 0x623d66a8, 0x361214b0, 0x624803e2, 0x360b5a90, - 0x62529fca, 0x36049e5b, 0x625d3a5e, 0x35fde011, - 0x6267d3a0, 0x35f71fb1, 0x62726b8e, 0x35f05d3d, - 0x627d0228, 0x35e998b5, 0x6287976e, 0x35e2d219, - 0x62922b5e, 0x35dc0968, 0x629cbdfa, 0x35d53ea5, - 0x62a74f40, 0x35ce71ce, 0x62b1df30, 0x35c7a2e3, - 0x62bc6dca, 0x35c0d1e7, 0x62c6fb0c, 0x35b9fed7, - 0x62d186f8, 0x35b329b5, 0x62dc118c, 0x35ac5282, - 0x62e69ac8, 0x35a5793c, 0x62f122ab, 0x359e9de5, - 0x62fba936, 0x3597c07d, 0x63062e67, 0x3590e104, - 0x6310b23e, 0x3589ff7a, 0x631b34bc, 0x35831be0, - 0x6325b5df, 0x357c3636, 0x633035a7, 0x35754e7c, - 0x633ab414, 0x356e64b2, 0x63453125, 0x356778d9, - 0x634facda, 0x35608af1, 0x635a2733, 0x35599afa, - 0x6364a02e, 0x3552a8f4, 0x636f17cc, 0x354bb4e1, - 0x63798e0d, 0x3544bebf, 0x638402ef, 0x353dc68f, - 0x638e7673, 0x3536cc52, 0x6398e898, 0x352fd008, - 0x63a3595e, 0x3528d1b1, 0x63adc8c4, 0x3521d14d, - 0x63b836ca, 0x351acedd, 0x63c2a36f, 0x3513ca60, - 0x63cd0eb3, 0x350cc3d8, 0x63d77896, 0x3505bb44, - 0x63e1e117, 0x34feb0a5, 0x63ec4837, 0x34f7a3fb, - 0x63f6adf3, 0x34f09546, 0x6401124d, 0x34e98487, - 0x640b7543, 0x34e271bd, 0x6415d6d5, 0x34db5cea, - 0x64203704, 0x34d4460c, 0x642a95ce, 0x34cd2d26, - 0x6434f332, 0x34c61236, 0x643f4f32, 0x34bef53d, - 0x6449a9cc, 0x34b7d63c, 0x645402ff, 0x34b0b533, - 0x645e5acc, 0x34a99221, 0x6468b132, 0x34a26d08, - 0x64730631, 0x349b45e7, 0x647d59c8, 0x34941cbf, - 0x6487abf7, 0x348cf190, 0x6491fcbe, 0x3485c45b, - 0x649c4c1b, 0x347e951f, 0x64a69a0f, 0x347763dd, - 0x64b0e699, 0x34703095, 0x64bb31ba, 0x3468fb47, - 0x64c57b6f, 0x3461c3f5, 0x64cfc3ba, 0x345a8a9d, - 0x64da0a9a, 0x34534f41, 0x64e4500e, 0x344c11e0, - 0x64ee9415, 0x3444d27b, 0x64f8d6b0, 0x343d9112, - 0x650317df, 0x34364da6, 0x650d57a0, 0x342f0836, - 0x651795f3, 0x3427c0c3, 0x6521d2d8, 0x3420774d, - 0x652c0e4f, 0x34192bd5, 0x65364857, 0x3411de5b, - 0x654080ef, 0x340a8edf, 0x654ab818, 0x34033d61, - 0x6554edd1, 0x33fbe9e2, 0x655f2219, 0x33f49462, - 0x656954f1, 0x33ed3ce1, 0x65738657, 0x33e5e360, - 0x657db64c, 0x33de87de, 0x6587e4cf, 0x33d72a5d, - 0x659211df, 0x33cfcadc, 0x659c3d7c, 0x33c8695b, - 0x65a667a7, 0x33c105db, 0x65b0905d, 0x33b9a05d, - 0x65bab7a0, 0x33b238e0, 0x65c4dd6e, 0x33aacf65, - 0x65cf01c8, 0x33a363ec, 0x65d924ac, 0x339bf675, - 0x65e3461b, 0x33948701, 0x65ed6614, 0x338d1590, - 0x65f78497, 0x3385a222, 0x6601a1a2, 0x337e2cb7, - 0x660bbd37, 0x3376b551, 0x6615d754, 0x336f3bee, - 0x661feffa, 0x3367c090, 0x662a0727, 0x33604336, - 0x66341cdb, 0x3358c3e2, 0x663e3117, 0x33514292, - 0x664843d9, 0x3349bf48, 0x66525521, 0x33423a04, - 0x665c64ef, 0x333ab2c6, 0x66667342, 0x3333298f, - 0x6670801a, 0x332b9e5e, 0x667a8b77, 0x33241134, - 0x66849558, 0x331c8211, 0x668e9dbd, 0x3314f0f6, - 0x6698a4a6, 0x330d5de3, 0x66a2aa11, 0x3305c8d7, - 0x66acadff, 0x32fe31d5, 0x66b6b070, 0x32f698db, - 0x66c0b162, 0x32eefdea, 0x66cab0d6, 0x32e76102, - 0x66d4aecb, 0x32dfc224, 0x66deab41, 0x32d82150, - 0x66e8a637, 0x32d07e85, 0x66f29fad, 0x32c8d9c6, - 0x66fc97a3, 0x32c13311, 0x67068e18, 0x32b98a67, - 0x6710830c, 0x32b1dfc9, 0x671a767e, 0x32aa3336, - 0x6724686e, 0x32a284b0, 0x672e58dc, 0x329ad435, - 0x673847c8, 0x329321c7, 0x67423530, 0x328b6d66, - 0x674c2115, 0x3283b712, 0x67560b76, 0x327bfecc, - 0x675ff452, 0x32744493, 0x6769dbaa, 0x326c8868, - 0x6773c17d, 0x3264ca4c, 0x677da5cb, 0x325d0a3e, - 0x67878893, 0x32554840, 0x679169d5, 0x324d8450, - 0x679b4990, 0x3245be70, 0x67a527c4, 0x323df6a0, - 0x67af0472, 0x32362ce0, 0x67b8df97, 0x322e6130, - 0x67c2b934, 0x32269391, 0x67cc9149, 0x321ec403, - 0x67d667d5, 0x3216f287, 0x67e03cd8, 0x320f1f1c, - 0x67ea1052, 0x320749c3, 0x67f3e241, 0x31ff727c, - 0x67fdb2a7, 0x31f79948, 0x68078181, 0x31efbe27, - 0x68114ed0, 0x31e7e118, 0x681b1a94, 0x31e0021e, - 0x6824e4cc, 0x31d82137, 0x682ead78, 0x31d03e64, - 0x68387498, 0x31c859a5, 0x68423a2a, 0x31c072fb, - 0x684bfe2f, 0x31b88a66, 0x6855c0a6, 0x31b09fe7, - 0x685f8190, 0x31a8b37c, 0x686940ea, 0x31a0c528, - 0x6872feb6, 0x3198d4ea, 0x687cbaf3, 0x3190e2c3, - 0x688675a0, 0x3188eeb2, 0x68902ebd, 0x3180f8b8, - 0x6899e64a, 0x317900d6, 0x68a39c46, 0x3171070c, - 0x68ad50b1, 0x31690b59, 0x68b7038b, 0x31610dbf, - 0x68c0b4d2, 0x31590e3e, 0x68ca6488, 0x31510cd5, - 0x68d412ab, 0x31490986, 0x68ddbf3b, 0x31410450, - 0x68e76a37, 0x3138fd35, 0x68f113a0, 0x3130f433, - 0x68fabb75, 0x3128e94c, 0x690461b5, 0x3120dc80, - 0x690e0661, 0x3118cdcf, 0x6917a977, 0x3110bd39, - 0x69214af8, 0x3108aabf, 0x692aeae3, 0x31009661, - 0x69348937, 0x30f8801f, 0x693e25f5, 0x30f067fb, - 0x6947c11c, 0x30e84df3, 0x69515aab, 0x30e03208, - 0x695af2a3, 0x30d8143b, 0x69648902, 0x30cff48c, - 0x696e1dc9, 0x30c7d2fb, 0x6977b0f7, 0x30bfaf89, - 0x6981428c, 0x30b78a36, 0x698ad287, 0x30af6302, - 0x699460e8, 0x30a739ed, 0x699dedaf, 0x309f0ef8, - 0x69a778db, 0x3096e223, 0x69b1026c, 0x308eb36f, - 0x69ba8a61, 0x308682dc, 0x69c410ba, 0x307e5069, - 0x69cd9578, 0x30761c18, 0x69d71899, 0x306de5e9, - 0x69e09a1c, 0x3065addb, 0x69ea1a03, 0x305d73f0, - 0x69f3984c, 0x30553828, 0x69fd14f6, 0x304cfa83, - 0x6a069003, 0x3044bb00, 0x6a100970, 0x303c79a2, - 0x6a19813f, 0x30343667, 0x6a22f76e, 0x302bf151, - 0x6a2c6bfd, 0x3023aa5f, 0x6a35deeb, 0x301b6193, - 0x6a3f503a, 0x301316eb, 0x6a48bfe7, 0x300aca69, - 0x6a522df3, 0x30027c0c, 0x6a5b9a5d, 0x2ffa2bd6, - 0x6a650525, 0x2ff1d9c7, 0x6a6e6e4b, 0x2fe985de, - 0x6a77d5ce, 0x2fe1301c, 0x6a813bae, 0x2fd8d882, - 0x6a8a9fea, 0x2fd07f0f, 0x6a940283, 0x2fc823c5, - 0x6a9d6377, 0x2fbfc6a3, 0x6aa6c2c6, 0x2fb767aa, - 0x6ab02071, 0x2faf06da, 0x6ab97c77, 0x2fa6a433, - 0x6ac2d6d6, 0x2f9e3fb6, 0x6acc2f90, 0x2f95d963, - 0x6ad586a3, 0x2f8d713a, 0x6adedc10, 0x2f85073c, - 0x6ae82fd5, 0x2f7c9b69, 0x6af181f3, 0x2f742dc1, - 0x6afad269, 0x2f6bbe45, 0x6b042137, 0x2f634cf5, - 0x6b0d6e5c, 0x2f5ad9d1, 0x6b16b9d9, 0x2f5264da, - 0x6b2003ac, 0x2f49ee0f, 0x6b294bd5, 0x2f417573, - 0x6b329255, 0x2f38fb03, 0x6b3bd72a, 0x2f307ec2, - 0x6b451a55, 0x2f2800af, 0x6b4e5bd4, 0x2f1f80ca, - 0x6b579ba8, 0x2f16ff14, 0x6b60d9d0, 0x2f0e7b8e, - 0x6b6a164d, 0x2f05f637, 0x6b73511c, 0x2efd6f10, - 0x6b7c8a3f, 0x2ef4e619, 0x6b85c1b5, 0x2eec5b53, - 0x6b8ef77d, 0x2ee3cebe, 0x6b982b97, 0x2edb405a, - 0x6ba15e03, 0x2ed2b027, 0x6baa8ec0, 0x2eca1e27, - 0x6bb3bdce, 0x2ec18a58, 0x6bbceb2d, 0x2eb8f4bc, - 0x6bc616dd, 0x2eb05d53, 0x6bcf40dc, 0x2ea7c41e, - 0x6bd8692b, 0x2e9f291b, 0x6be18fc9, 0x2e968c4d, - 0x6beab4b6, 0x2e8dedb3, 0x6bf3d7f2, 0x2e854d4d, - 0x6bfcf97c, 0x2e7cab1c, 0x6c061953, 0x2e740720, - 0x6c0f3779, 0x2e6b615a, 0x6c1853eb, 0x2e62b9ca, - 0x6c216eaa, 0x2e5a1070, 0x6c2a87b6, 0x2e51654c, - 0x6c339f0e, 0x2e48b860, 0x6c3cb4b1, 0x2e4009aa, - 0x6c45c8a0, 0x2e37592c, 0x6c4edada, 0x2e2ea6e6, - 0x6c57eb5e, 0x2e25f2d8, 0x6c60fa2d, 0x2e1d3d03, - 0x6c6a0746, 0x2e148566, 0x6c7312a9, 0x2e0bcc03, - 0x6c7c1c55, 0x2e0310d9, 0x6c85244a, 0x2dfa53e9, - 0x6c8e2a87, 0x2df19534, 0x6c972f0d, 0x2de8d4b8, - 0x6ca031da, 0x2de01278, 0x6ca932ef, 0x2dd74e73, - 0x6cb2324c, 0x2dce88aa, 0x6cbb2fef, 0x2dc5c11c, - 0x6cc42bd9, 0x2dbcf7cb, 0x6ccd2609, 0x2db42cb6, - 0x6cd61e7f, 0x2dab5fdf, 0x6cdf153a, 0x2da29144, - 0x6ce80a3a, 0x2d99c0e7, 0x6cf0fd80, 0x2d90eec8, - 0x6cf9ef09, 0x2d881ae8, 0x6d02ded7, 0x2d7f4545, - 0x6d0bcce8, 0x2d766de2, 0x6d14b93d, 0x2d6d94bf, - 0x6d1da3d5, 0x2d64b9da, 0x6d268cb0, 0x2d5bdd36, - 0x6d2f73cd, 0x2d52fed2, 0x6d38592c, 0x2d4a1eaf, - 0x6d413ccd, 0x2d413ccd, 0x6d4a1eaf, 0x2d38592c, - 0x6d52fed2, 0x2d2f73cd, 0x6d5bdd36, 0x2d268cb0, - 0x6d64b9da, 0x2d1da3d5, 0x6d6d94bf, 0x2d14b93d, - 0x6d766de2, 0x2d0bcce8, 0x6d7f4545, 0x2d02ded7, - 0x6d881ae8, 0x2cf9ef09, 0x6d90eec8, 0x2cf0fd80, - 0x6d99c0e7, 0x2ce80a3a, 0x6da29144, 0x2cdf153a, - 0x6dab5fdf, 0x2cd61e7f, 0x6db42cb6, 0x2ccd2609, - 0x6dbcf7cb, 0x2cc42bd9, 0x6dc5c11c, 0x2cbb2fef, - 0x6dce88aa, 0x2cb2324c, 0x6dd74e73, 0x2ca932ef, - 0x6de01278, 0x2ca031da, 0x6de8d4b8, 0x2c972f0d, - 0x6df19534, 0x2c8e2a87, 0x6dfa53e9, 0x2c85244a, - 0x6e0310d9, 0x2c7c1c55, 0x6e0bcc03, 0x2c7312a9, - 0x6e148566, 0x2c6a0746, 0x6e1d3d03, 0x2c60fa2d, - 0x6e25f2d8, 0x2c57eb5e, 0x6e2ea6e6, 0x2c4edada, - 0x6e37592c, 0x2c45c8a0, 0x6e4009aa, 0x2c3cb4b1, - 0x6e48b860, 0x2c339f0e, 0x6e51654c, 0x2c2a87b6, - 0x6e5a1070, 0x2c216eaa, 0x6e62b9ca, 0x2c1853eb, - 0x6e6b615a, 0x2c0f3779, 0x6e740720, 0x2c061953, - 0x6e7cab1c, 0x2bfcf97c, 0x6e854d4d, 0x2bf3d7f2, - 0x6e8dedb3, 0x2beab4b6, 0x6e968c4d, 0x2be18fc9, - 0x6e9f291b, 0x2bd8692b, 0x6ea7c41e, 0x2bcf40dc, - 0x6eb05d53, 0x2bc616dd, 0x6eb8f4bc, 0x2bbceb2d, - 0x6ec18a58, 0x2bb3bdce, 0x6eca1e27, 0x2baa8ec0, - 0x6ed2b027, 0x2ba15e03, 0x6edb405a, 0x2b982b97, - 0x6ee3cebe, 0x2b8ef77d, 0x6eec5b53, 0x2b85c1b5, - 0x6ef4e619, 0x2b7c8a3f, 0x6efd6f10, 0x2b73511c, - 0x6f05f637, 0x2b6a164d, 0x6f0e7b8e, 0x2b60d9d0, - 0x6f16ff14, 0x2b579ba8, 0x6f1f80ca, 0x2b4e5bd4, - 0x6f2800af, 0x2b451a55, 0x6f307ec2, 0x2b3bd72a, - 0x6f38fb03, 0x2b329255, 0x6f417573, 0x2b294bd5, - 0x6f49ee0f, 0x2b2003ac, 0x6f5264da, 0x2b16b9d9, - 0x6f5ad9d1, 0x2b0d6e5c, 0x6f634cf5, 0x2b042137, - 0x6f6bbe45, 0x2afad269, 0x6f742dc1, 0x2af181f3, - 0x6f7c9b69, 0x2ae82fd5, 0x6f85073c, 0x2adedc10, - 0x6f8d713a, 0x2ad586a3, 0x6f95d963, 0x2acc2f90, - 0x6f9e3fb6, 0x2ac2d6d6, 0x6fa6a433, 0x2ab97c77, - 0x6faf06da, 0x2ab02071, 0x6fb767aa, 0x2aa6c2c6, - 0x6fbfc6a3, 0x2a9d6377, 0x6fc823c5, 0x2a940283, - 0x6fd07f0f, 0x2a8a9fea, 0x6fd8d882, 0x2a813bae, - 0x6fe1301c, 0x2a77d5ce, 0x6fe985de, 0x2a6e6e4b, - 0x6ff1d9c7, 0x2a650525, 0x6ffa2bd6, 0x2a5b9a5d, - 0x70027c0c, 0x2a522df3, 0x700aca69, 0x2a48bfe7, - 0x701316eb, 0x2a3f503a, 0x701b6193, 0x2a35deeb, - 0x7023aa5f, 0x2a2c6bfd, 0x702bf151, 0x2a22f76e, - 0x70343667, 0x2a19813f, 0x703c79a2, 0x2a100970, - 0x7044bb00, 0x2a069003, 0x704cfa83, 0x29fd14f6, - 0x70553828, 0x29f3984c, 0x705d73f0, 0x29ea1a03, - 0x7065addb, 0x29e09a1c, 0x706de5e9, 0x29d71899, - 0x70761c18, 0x29cd9578, 0x707e5069, 0x29c410ba, - 0x708682dc, 0x29ba8a61, 0x708eb36f, 0x29b1026c, - 0x7096e223, 0x29a778db, 0x709f0ef8, 0x299dedaf, - 0x70a739ed, 0x299460e8, 0x70af6302, 0x298ad287, - 0x70b78a36, 0x2981428c, 0x70bfaf89, 0x2977b0f7, - 0x70c7d2fb, 0x296e1dc9, 0x70cff48c, 0x29648902, - 0x70d8143b, 0x295af2a3, 0x70e03208, 0x29515aab, - 0x70e84df3, 0x2947c11c, 0x70f067fb, 0x293e25f5, - 0x70f8801f, 0x29348937, 0x71009661, 0x292aeae3, - 0x7108aabf, 0x29214af8, 0x7110bd39, 0x2917a977, - 0x7118cdcf, 0x290e0661, 0x7120dc80, 0x290461b5, - 0x7128e94c, 0x28fabb75, 0x7130f433, 0x28f113a0, - 0x7138fd35, 0x28e76a37, 0x71410450, 0x28ddbf3b, - 0x71490986, 0x28d412ab, 0x71510cd5, 0x28ca6488, - 0x71590e3e, 0x28c0b4d2, 0x71610dbf, 0x28b7038b, - 0x71690b59, 0x28ad50b1, 0x7171070c, 0x28a39c46, - 0x717900d6, 0x2899e64a, 0x7180f8b8, 0x28902ebd, - 0x7188eeb2, 0x288675a0, 0x7190e2c3, 0x287cbaf3, - 0x7198d4ea, 0x2872feb6, 0x71a0c528, 0x286940ea, - 0x71a8b37c, 0x285f8190, 0x71b09fe7, 0x2855c0a6, - 0x71b88a66, 0x284bfe2f, 0x71c072fb, 0x28423a2a, - 0x71c859a5, 0x28387498, 0x71d03e64, 0x282ead78, - 0x71d82137, 0x2824e4cc, 0x71e0021e, 0x281b1a94, - 0x71e7e118, 0x28114ed0, 0x71efbe27, 0x28078181, - 0x71f79948, 0x27fdb2a7, 0x71ff727c, 0x27f3e241, - 0x720749c3, 0x27ea1052, 0x720f1f1c, 0x27e03cd8, - 0x7216f287, 0x27d667d5, 0x721ec403, 0x27cc9149, - 0x72269391, 0x27c2b934, 0x722e6130, 0x27b8df97, - 0x72362ce0, 0x27af0472, 0x723df6a0, 0x27a527c4, - 0x7245be70, 0x279b4990, 0x724d8450, 0x279169d5, - 0x72554840, 0x27878893, 0x725d0a3e, 0x277da5cb, - 0x7264ca4c, 0x2773c17d, 0x726c8868, 0x2769dbaa, - 0x72744493, 0x275ff452, 0x727bfecc, 0x27560b76, - 0x7283b712, 0x274c2115, 0x728b6d66, 0x27423530, - 0x729321c7, 0x273847c8, 0x729ad435, 0x272e58dc, - 0x72a284b0, 0x2724686e, 0x72aa3336, 0x271a767e, - 0x72b1dfc9, 0x2710830c, 0x72b98a67, 0x27068e18, - 0x72c13311, 0x26fc97a3, 0x72c8d9c6, 0x26f29fad, - 0x72d07e85, 0x26e8a637, 0x72d82150, 0x26deab41, - 0x72dfc224, 0x26d4aecb, 0x72e76102, 0x26cab0d6, - 0x72eefdea, 0x26c0b162, 0x72f698db, 0x26b6b070, - 0x72fe31d5, 0x26acadff, 0x7305c8d7, 0x26a2aa11, - 0x730d5de3, 0x2698a4a6, 0x7314f0f6, 0x268e9dbd, - 0x731c8211, 0x26849558, 0x73241134, 0x267a8b77, - 0x732b9e5e, 0x2670801a, 0x7333298f, 0x26667342, - 0x733ab2c6, 0x265c64ef, 0x73423a04, 0x26525521, - 0x7349bf48, 0x264843d9, 0x73514292, 0x263e3117, - 0x7358c3e2, 0x26341cdb, 0x73604336, 0x262a0727, - 0x7367c090, 0x261feffa, 0x736f3bee, 0x2615d754, - 0x7376b551, 0x260bbd37, 0x737e2cb7, 0x2601a1a2, - 0x7385a222, 0x25f78497, 0x738d1590, 0x25ed6614, - 0x73948701, 0x25e3461b, 0x739bf675, 0x25d924ac, - 0x73a363ec, 0x25cf01c8, 0x73aacf65, 0x25c4dd6e, - 0x73b238e0, 0x25bab7a0, 0x73b9a05d, 0x25b0905d, - 0x73c105db, 0x25a667a7, 0x73c8695b, 0x259c3d7c, - 0x73cfcadc, 0x259211df, 0x73d72a5d, 0x2587e4cf, - 0x73de87de, 0x257db64c, 0x73e5e360, 0x25738657, - 0x73ed3ce1, 0x256954f1, 0x73f49462, 0x255f2219, - 0x73fbe9e2, 0x2554edd1, 0x74033d61, 0x254ab818, - 0x740a8edf, 0x254080ef, 0x7411de5b, 0x25364857, - 0x74192bd5, 0x252c0e4f, 0x7420774d, 0x2521d2d8, - 0x7427c0c3, 0x251795f3, 0x742f0836, 0x250d57a0, - 0x74364da6, 0x250317df, 0x743d9112, 0x24f8d6b0, - 0x7444d27b, 0x24ee9415, 0x744c11e0, 0x24e4500e, - 0x74534f41, 0x24da0a9a, 0x745a8a9d, 0x24cfc3ba, - 0x7461c3f5, 0x24c57b6f, 0x7468fb47, 0x24bb31ba, - 0x74703095, 0x24b0e699, 0x747763dd, 0x24a69a0f, - 0x747e951f, 0x249c4c1b, 0x7485c45b, 0x2491fcbe, - 0x748cf190, 0x2487abf7, 0x74941cbf, 0x247d59c8, - 0x749b45e7, 0x24730631, 0x74a26d08, 0x2468b132, - 0x74a99221, 0x245e5acc, 0x74b0b533, 0x245402ff, - 0x74b7d63c, 0x2449a9cc, 0x74bef53d, 0x243f4f32, - 0x74c61236, 0x2434f332, 0x74cd2d26, 0x242a95ce, - 0x74d4460c, 0x24203704, 0x74db5cea, 0x2415d6d5, - 0x74e271bd, 0x240b7543, 0x74e98487, 0x2401124d, - 0x74f09546, 0x23f6adf3, 0x74f7a3fb, 0x23ec4837, - 0x74feb0a5, 0x23e1e117, 0x7505bb44, 0x23d77896, - 0x750cc3d8, 0x23cd0eb3, 0x7513ca60, 0x23c2a36f, - 0x751acedd, 0x23b836ca, 0x7521d14d, 0x23adc8c4, - 0x7528d1b1, 0x23a3595e, 0x752fd008, 0x2398e898, - 0x7536cc52, 0x238e7673, 0x753dc68f, 0x238402ef, - 0x7544bebf, 0x23798e0d, 0x754bb4e1, 0x236f17cc, - 0x7552a8f4, 0x2364a02e, 0x75599afa, 0x235a2733, - 0x75608af1, 0x234facda, 0x756778d9, 0x23453125, - 0x756e64b2, 0x233ab414, 0x75754e7c, 0x233035a7, - 0x757c3636, 0x2325b5df, 0x75831be0, 0x231b34bc, - 0x7589ff7a, 0x2310b23e, 0x7590e104, 0x23062e67, - 0x7597c07d, 0x22fba936, 0x759e9de5, 0x22f122ab, - 0x75a5793c, 0x22e69ac8, 0x75ac5282, 0x22dc118c, - 0x75b329b5, 0x22d186f8, 0x75b9fed7, 0x22c6fb0c, - 0x75c0d1e7, 0x22bc6dca, 0x75c7a2e3, 0x22b1df30, - 0x75ce71ce, 0x22a74f40, 0x75d53ea5, 0x229cbdfa, - 0x75dc0968, 0x22922b5e, 0x75e2d219, 0x2287976e, - 0x75e998b5, 0x227d0228, 0x75f05d3d, 0x22726b8e, - 0x75f71fb1, 0x2267d3a0, 0x75fde011, 0x225d3a5e, - 0x76049e5b, 0x22529fca, 0x760b5a90, 0x224803e2, - 0x761214b0, 0x223d66a8, 0x7618ccba, 0x2232c81c, - 0x761f82af, 0x2228283f, 0x7626368d, 0x221d8711, - 0x762ce855, 0x2212e492, 0x76339806, 0x220840c2, - 0x763a45a0, 0x21fd9ba3, 0x7640f123, 0x21f2f534, - 0x76479a8e, 0x21e84d76, 0x764e41e2, 0x21dda46a, - 0x7654e71d, 0x21d2fa0f, 0x765b8a41, 0x21c84e67, - 0x76622b4c, 0x21bda171, 0x7668ca3e, 0x21b2f32e, - 0x766f6717, 0x21a8439e, 0x767601d7, 0x219d92c2, - 0x767c9a7e, 0x2192e09b, 0x7683310b, 0x21882d28, - 0x7689c57d, 0x217d786a, 0x769057d6, 0x2172c262, - 0x7696e814, 0x21680b0f, 0x769d7637, 0x215d5273, - 0x76a4023f, 0x2152988d, 0x76aa8c2c, 0x2147dd5f, - 0x76b113fd, 0x213d20e8, 0x76b799b3, 0x21326329, - 0x76be1d4c, 0x2127a423, 0x76c49ec9, 0x211ce3d5, - 0x76cb1e2a, 0x21122240, 0x76d19b6e, 0x21075f65, - 0x76d81695, 0x20fc9b44, 0x76de8f9e, 0x20f1d5de, - 0x76e5068a, 0x20e70f32, 0x76eb7b58, 0x20dc4742, - 0x76f1ee09, 0x20d17e0d, 0x76f85e9a, 0x20c6b395, - 0x76fecd0e, 0x20bbe7d8, 0x77053962, 0x20b11ad9, - 0x770ba398, 0x20a64c97, 0x77120bae, 0x209b7d13, - 0x771871a5, 0x2090ac4d, 0x771ed57c, 0x2085da46, - 0x77253733, 0x207b06fe, 0x772b96ca, 0x20703275, - 0x7731f440, 0x20655cac, 0x77384f95, 0x205a85a3, - 0x773ea8ca, 0x204fad5b, 0x7744ffdd, 0x2044d3d4, - 0x774b54ce, 0x2039f90f, 0x7751a79e, 0x202f1d0b, - 0x7757f84c, 0x20243fca, 0x775e46d8, 0x2019614c, - 0x77649341, 0x200e8190, 0x776add88, 0x2003a099, - 0x777125ac, 0x1ff8be65, 0x77776bac, 0x1feddaf6, - 0x777daf89, 0x1fe2f64c, 0x7783f143, 0x1fd81067, - 0x778a30d8, 0x1fcd2948, 0x77906e49, 0x1fc240ef, - 0x7796a996, 0x1fb7575c, 0x779ce2be, 0x1fac6c91, - 0x77a319c2, 0x1fa1808c, 0x77a94ea0, 0x1f969350, - 0x77af8159, 0x1f8ba4dc, 0x77b5b1ec, 0x1f80b531, - 0x77bbe05a, 0x1f75c44e, 0x77c20ca1, 0x1f6ad235, - 0x77c836c2, 0x1f5fdee6, 0x77ce5ebd, 0x1f54ea62, - 0x77d48490, 0x1f49f4a8, 0x77daa83d, 0x1f3efdb9, - 0x77e0c9c3, 0x1f340596, 0x77e6e921, 0x1f290c3f, - 0x77ed0657, 0x1f1e11b5, 0x77f32165, 0x1f1315f7, - 0x77f93a4b, 0x1f081907, 0x77ff5109, 0x1efd1ae4, - 0x7805659e, 0x1ef21b90, 0x780b780a, 0x1ee71b0a, - 0x7811884d, 0x1edc1953, 0x78179666, 0x1ed1166b, - 0x781da256, 0x1ec61254, 0x7823ac1d, 0x1ebb0d0d, - 0x7829b3b9, 0x1eb00696, 0x782fb92a, 0x1ea4fef0, - 0x7835bc71, 0x1e99f61d, 0x783bbd8e, 0x1e8eec1b, - 0x7841bc7f, 0x1e83e0eb, 0x7847b946, 0x1e78d48e, - 0x784db3e0, 0x1e6dc705, 0x7853ac4f, 0x1e62b84f, - 0x7859a292, 0x1e57a86d, 0x785f96a9, 0x1e4c9760, - 0x78658894, 0x1e418528, 0x786b7852, 0x1e3671c5, - 0x787165e3, 0x1e2b5d38, 0x78775147, 0x1e204781, - 0x787d3a7e, 0x1e1530a1, 0x78832187, 0x1e0a1898, - 0x78890663, 0x1dfeff67, 0x788ee910, 0x1df3e50d, - 0x7894c98f, 0x1de8c98c, 0x789aa7e0, 0x1dddace4, - 0x78a08402, 0x1dd28f15, 0x78a65df6, 0x1dc7701f, - 0x78ac35ba, 0x1dbc5004, 0x78b20b4f, 0x1db12ec3, - 0x78b7deb4, 0x1da60c5d, 0x78bdafea, 0x1d9ae8d2, - 0x78c37eef, 0x1d8fc424, 0x78c94bc4, 0x1d849e51, - 0x78cf1669, 0x1d79775c, 0x78d4dedd, 0x1d6e4f43, - 0x78daa520, 0x1d632608, 0x78e06932, 0x1d57fbaa, - 0x78e62b13, 0x1d4cd02c, 0x78ebeac2, 0x1d41a38c, - 0x78f1a840, 0x1d3675cb, 0x78f7638b, 0x1d2b46ea, - 0x78fd1ca4, 0x1d2016e9, 0x7902d38b, 0x1d14e5c9, - 0x7908883f, 0x1d09b389, 0x790e3ac0, 0x1cfe802b, - 0x7913eb0e, 0x1cf34baf, 0x79199929, 0x1ce81615, - 0x791f4510, 0x1cdcdf5e, 0x7924eec3, 0x1cd1a78a, - 0x792a9642, 0x1cc66e99, 0x79303b8e, 0x1cbb348d, - 0x7935dea4, 0x1caff965, 0x793b7f86, 0x1ca4bd21, - 0x79411e33, 0x1c997fc4, 0x7946baac, 0x1c8e414b, - 0x794c54ee, 0x1c8301b9, 0x7951ecfc, 0x1c77c10e, - 0x795782d3, 0x1c6c7f4a, 0x795d1675, 0x1c613c6d, - 0x7962a7e0, 0x1c55f878, 0x79683715, 0x1c4ab36b, - 0x796dc414, 0x1c3f6d47, 0x79734edc, 0x1c34260c, - 0x7978d76c, 0x1c28ddbb, 0x797e5dc6, 0x1c1d9454, - 0x7983e1e8, 0x1c1249d8, 0x798963d2, 0x1c06fe46, - 0x798ee385, 0x1bfbb1a0, 0x799460ff, 0x1bf063e6, - 0x7999dc42, 0x1be51518, 0x799f554b, 0x1bd9c537, - 0x79a4cc1c, 0x1bce7442, 0x79aa40b4, 0x1bc3223c, - 0x79afb313, 0x1bb7cf23, 0x79b52339, 0x1bac7af9, - 0x79ba9125, 0x1ba125bd, 0x79bffcd7, 0x1b95cf71, - 0x79c5664f, 0x1b8a7815, 0x79cacd8d, 0x1b7f1fa9, - 0x79d03291, 0x1b73c62d, 0x79d5955a, 0x1b686ba3, - 0x79daf5e8, 0x1b5d100a, 0x79e0543c, 0x1b51b363, - 0x79e5b054, 0x1b4655ae, 0x79eb0a31, 0x1b3af6ec, - 0x79f061d2, 0x1b2f971e, 0x79f5b737, 0x1b243643, - 0x79fb0a60, 0x1b18d45c, 0x7a005b4d, 0x1b0d716a, - 0x7a05a9fd, 0x1b020d6c, 0x7a0af671, 0x1af6a865, - 0x7a1040a8, 0x1aeb4253, 0x7a1588a2, 0x1adfdb37, - 0x7a1ace5f, 0x1ad47312, 0x7a2011de, 0x1ac909e5, - 0x7a25531f, 0x1abd9faf, 0x7a2a9223, 0x1ab23471, - 0x7a2fcee8, 0x1aa6c82b, 0x7a350970, 0x1a9b5adf, - 0x7a3a41b9, 0x1a8fec8c, 0x7a3f77c3, 0x1a847d33, - 0x7a44ab8e, 0x1a790cd4, 0x7a49dd1a, 0x1a6d9b70, - 0x7a4f0c67, 0x1a622907, 0x7a543974, 0x1a56b599, - 0x7a596442, 0x1a4b4128, 0x7a5e8cd0, 0x1a3fcbb3, - 0x7a63b31d, 0x1a34553b, 0x7a68d72b, 0x1a28ddc0, - 0x7a6df8f8, 0x1a1d6544, 0x7a731884, 0x1a11ebc5, - 0x7a7835cf, 0x1a067145, 0x7a7d50da, 0x19faf5c5, - 0x7a8269a3, 0x19ef7944, 0x7a87802a, 0x19e3fbc3, - 0x7a8c9470, 0x19d87d42, 0x7a91a674, 0x19ccfdc2, - 0x7a96b636, 0x19c17d44, 0x7a9bc3b6, 0x19b5fbc8, - 0x7aa0cef3, 0x19aa794d, 0x7aa5d7ee, 0x199ef5d6, - 0x7aaadea6, 0x19937161, 0x7aafe31b, 0x1987ebf0, - 0x7ab4e54c, 0x197c6584, 0x7ab9e53a, 0x1970de1b, - 0x7abee2e5, 0x196555b8, 0x7ac3de4c, 0x1959cc5a, - 0x7ac8d76f, 0x194e4201, 0x7acdce4d, 0x1942b6af, - 0x7ad2c2e8, 0x19372a64, 0x7ad7b53d, 0x192b9d1f, - 0x7adca54e, 0x19200ee3, 0x7ae1931a, 0x19147fae, - 0x7ae67ea1, 0x1908ef82, 0x7aeb67e3, 0x18fd5e5f, - 0x7af04edf, 0x18f1cc45, 0x7af53395, 0x18e63935, - 0x7afa1605, 0x18daa52f, 0x7afef630, 0x18cf1034, - 0x7b03d414, 0x18c37a44, 0x7b08afb2, 0x18b7e35f, - 0x7b0d8909, 0x18ac4b87, 0x7b126019, 0x18a0b2bb, - 0x7b1734e2, 0x189518fc, 0x7b1c0764, 0x18897e4a, - 0x7b20d79e, 0x187de2a7, 0x7b25a591, 0x18724611, - 0x7b2a713d, 0x1866a88a, 0x7b2f3aa0, 0x185b0a13, - 0x7b3401bb, 0x184f6aab, 0x7b38c68e, 0x1843ca53, - 0x7b3d8918, 0x1838290c, 0x7b42495a, 0x182c86d5, - 0x7b470753, 0x1820e3b0, 0x7b4bc303, 0x18153f9d, - 0x7b507c69, 0x18099a9c, 0x7b553386, 0x17fdf4ae, - 0x7b59e85a, 0x17f24dd3, 0x7b5e9ae4, 0x17e6a60c, - 0x7b634b23, 0x17dafd59, 0x7b67f919, 0x17cf53bb, - 0x7b6ca4c4, 0x17c3a931, 0x7b714e25, 0x17b7fdbd, - 0x7b75f53c, 0x17ac515f, 0x7b7a9a07, 0x17a0a417, - 0x7b7f3c87, 0x1794f5e6, 0x7b83dcbc, 0x178946cc, - 0x7b887aa6, 0x177d96ca, 0x7b8d1644, 0x1771e5e0, - 0x7b91af97, 0x1766340f, 0x7b96469d, 0x175a8157, - 0x7b9adb57, 0x174ecdb8, 0x7b9f6dc5, 0x17431933, - 0x7ba3fde7, 0x173763c9, 0x7ba88bbc, 0x172bad7a, - 0x7bad1744, 0x171ff646, 0x7bb1a080, 0x17143e2d, - 0x7bb6276e, 0x17088531, 0x7bbaac0e, 0x16fccb51, - 0x7bbf2e62, 0x16f1108f, 0x7bc3ae67, 0x16e554ea, - 0x7bc82c1f, 0x16d99864, 0x7bcca789, 0x16cddafb, - 0x7bd120a4, 0x16c21cb2, 0x7bd59771, 0x16b65d88, - 0x7bda0bf0, 0x16aa9d7e, 0x7bde7e20, 0x169edc94, - 0x7be2ee01, 0x16931acb, 0x7be75b93, 0x16875823, - 0x7bebc6d5, 0x167b949d, 0x7bf02fc9, 0x166fd039, - 0x7bf4966c, 0x16640af7, 0x7bf8fac0, 0x165844d8, - 0x7bfd5cc4, 0x164c7ddd, 0x7c01bc78, 0x1640b606, - 0x7c0619dc, 0x1634ed53, 0x7c0a74f0, 0x162923c5, - 0x7c0ecdb2, 0x161d595d, 0x7c132424, 0x16118e1a, - 0x7c177845, 0x1605c1fd, 0x7c1bca16, 0x15f9f507, - 0x7c201994, 0x15ee2738, 0x7c2466c2, 0x15e25890, - 0x7c28b19e, 0x15d68911, 0x7c2cfa28, 0x15cab8ba, - 0x7c314060, 0x15bee78c, 0x7c358446, 0x15b31587, - 0x7c39c5da, 0x15a742ac, 0x7c3e051b, 0x159b6efb, - 0x7c42420a, 0x158f9a76, 0x7c467ca6, 0x1583c51b, - 0x7c4ab4ef, 0x1577eeec, 0x7c4eeae5, 0x156c17e9, - 0x7c531e88, 0x15604013, 0x7c574fd8, 0x1554676a, - 0x7c5b7ed4, 0x15488dee, 0x7c5fab7c, 0x153cb3a0, - 0x7c63d5d1, 0x1530d881, 0x7c67fdd1, 0x1524fc90, - 0x7c6c237e, 0x15191fcf, 0x7c7046d6, 0x150d423d, - 0x7c7467d9, 0x150163dc, 0x7c788688, 0x14f584ac, - 0x7c7ca2e2, 0x14e9a4ac, 0x7c80bce7, 0x14ddc3de, - 0x7c84d496, 0x14d1e242, 0x7c88e9f1, 0x14c5ffd9, - 0x7c8cfcf6, 0x14ba1ca3, 0x7c910da5, 0x14ae38a0, - 0x7c951bff, 0x14a253d1, 0x7c992803, 0x14966e36, - 0x7c9d31b0, 0x148a87d1, 0x7ca13908, 0x147ea0a0, - 0x7ca53e09, 0x1472b8a5, 0x7ca940b3, 0x1466cfe1, - 0x7cad4107, 0x145ae653, 0x7cb13f04, 0x144efbfc, - 0x7cb53aaa, 0x144310dd, 0x7cb933f9, 0x143724f5, - 0x7cbd2af0, 0x142b3846, 0x7cc11f90, 0x141f4ad1, - 0x7cc511d9, 0x14135c94, 0x7cc901c9, 0x14076d91, - 0x7cccef62, 0x13fb7dc9, 0x7cd0daa2, 0x13ef8d3c, - 0x7cd4c38b, 0x13e39be9, 0x7cd8aa1b, 0x13d7a9d3, - 0x7cdc8e52, 0x13cbb6f8, 0x7ce07031, 0x13bfc35b, - 0x7ce44fb7, 0x13b3cefa, 0x7ce82ce4, 0x13a7d9d7, - 0x7cec07b8, 0x139be3f2, 0x7cefe032, 0x138fed4b, - 0x7cf3b653, 0x1383f5e3, 0x7cf78a1b, 0x1377fdbb, - 0x7cfb5b89, 0x136c04d2, 0x7cff2a9d, 0x13600b2a, - 0x7d02f757, 0x135410c3, 0x7d06c1b6, 0x1348159d, - 0x7d0a89bc, 0x133c19b8, 0x7d0e4f67, 0x13301d16, - 0x7d1212b7, 0x13241fb6, 0x7d15d3ad, 0x1318219a, - 0x7d199248, 0x130c22c1, 0x7d1d4e88, 0x1300232c, - 0x7d21086c, 0x12f422db, 0x7d24bff6, 0x12e821cf, - 0x7d287523, 0x12dc2009, 0x7d2c27f6, 0x12d01d89, - 0x7d2fd86c, 0x12c41a4f, 0x7d338687, 0x12b8165b, - 0x7d373245, 0x12ac11af, 0x7d3adba7, 0x12a00c4b, - 0x7d3e82ae, 0x1294062f, 0x7d422757, 0x1287ff5b, - 0x7d45c9a4, 0x127bf7d1, 0x7d496994, 0x126fef90, - 0x7d4d0728, 0x1263e699, 0x7d50a25e, 0x1257dced, - 0x7d543b37, 0x124bd28c, 0x7d57d1b3, 0x123fc776, - 0x7d5b65d2, 0x1233bbac, 0x7d5ef793, 0x1227af2e, - 0x7d6286f6, 0x121ba1fd, 0x7d6613fb, 0x120f941a, - 0x7d699ea3, 0x12038584, 0x7d6d26ec, 0x11f7763c, - 0x7d70acd7, 0x11eb6643, 0x7d743064, 0x11df5599, - 0x7d77b192, 0x11d3443f, 0x7d7b3061, 0x11c73235, - 0x7d7eacd2, 0x11bb1f7c, 0x7d8226e4, 0x11af0c13, - 0x7d859e96, 0x11a2f7fc, 0x7d8913ea, 0x1196e337, - 0x7d8c86de, 0x118acdc4, 0x7d8ff772, 0x117eb7a4, - 0x7d9365a8, 0x1172a0d7, 0x7d96d17d, 0x1166895f, - 0x7d9a3af2, 0x115a713a, 0x7d9da208, 0x114e586a, - 0x7da106bd, 0x11423ef0, 0x7da46912, 0x113624cb, - 0x7da7c907, 0x112a09fc, 0x7dab269b, 0x111dee84, - 0x7dae81cf, 0x1111d263, 0x7db1daa2, 0x1105b599, - 0x7db53113, 0x10f99827, 0x7db88524, 0x10ed7a0e, - 0x7dbbd6d4, 0x10e15b4e, 0x7dbf2622, 0x10d53be7, - 0x7dc2730f, 0x10c91bda, 0x7dc5bd9b, 0x10bcfb28, - 0x7dc905c5, 0x10b0d9d0, 0x7dcc4b8d, 0x10a4b7d3, - 0x7dcf8ef3, 0x10989532, 0x7dd2cff7, 0x108c71ee, - 0x7dd60e99, 0x10804e06, 0x7dd94ad8, 0x1074297b, - 0x7ddc84b5, 0x1068044e, 0x7ddfbc30, 0x105bde7f, - 0x7de2f148, 0x104fb80e, 0x7de623fd, 0x104390fd, - 0x7de9544f, 0x1037694b, 0x7dec823e, 0x102b40f8, - 0x7defadca, 0x101f1807, 0x7df2d6f3, 0x1012ee76, - 0x7df5fdb8, 0x1006c446, 0x7df9221a, 0xffa9979, - 0x7dfc4418, 0xfee6e0d, 0x7dff63b2, 0xfe24205, - 0x7e0280e9, 0xfd6155f, 0x7e059bbb, 0xfc9e81e, - 0x7e08b42a, 0xfbdba40, 0x7e0bca34, 0xfb18bc8, - 0x7e0eddd9, 0xfa55cb4, 0x7e11ef1b, 0xf992d06, - 0x7e14fdf7, 0xf8cfcbe, 0x7e180a6f, 0xf80cbdc, - 0x7e1b1482, 0xf749a61, 0x7e1e1c30, 0xf68684e, - 0x7e212179, 0xf5c35a3, 0x7e24245d, 0xf500260, - 0x7e2724db, 0xf43ce86, 0x7e2a22f4, 0xf379a16, - 0x7e2d1ea8, 0xf2b650f, 0x7e3017f6, 0xf1f2f73, - 0x7e330ede, 0xf12f941, 0x7e360360, 0xf06c27a, - 0x7e38f57c, 0xefa8b20, 0x7e3be532, 0xeee5331, - 0x7e3ed282, 0xee21aaf, 0x7e41bd6c, 0xed5e19a, - 0x7e44a5ef, 0xec9a7f3, 0x7e478c0b, 0xebd6db9, - 0x7e4a6fc1, 0xeb132ef, 0x7e4d5110, 0xea4f793, - 0x7e502ff9, 0xe98bba7, 0x7e530c7a, 0xe8c7f2a, - 0x7e55e694, 0xe80421e, 0x7e58be47, 0xe740483, - 0x7e5b9392, 0xe67c65a, 0x7e5e6676, 0xe5b87a2, - 0x7e6136f3, 0xe4f485c, 0x7e640507, 0xe430889, - 0x7e66d0b4, 0xe36c82a, 0x7e6999fa, 0xe2a873e, - 0x7e6c60d7, 0xe1e45c6, 0x7e6f254c, 0xe1203c3, - 0x7e71e759, 0xe05c135, 0x7e74a6fd, 0xdf97e1d, - 0x7e77643a, 0xded3a7b, 0x7e7a1f0d, 0xde0f64f, - 0x7e7cd778, 0xdd4b19a, 0x7e7f8d7b, 0xdc86c5d, - 0x7e824114, 0xdbc2698, 0x7e84f245, 0xdafe04b, - 0x7e87a10c, 0xda39978, 0x7e8a4d6a, 0xd97521d, - 0x7e8cf75f, 0xd8b0a3d, 0x7e8f9eeb, 0xd7ec1d6, - 0x7e92440d, 0xd7278eb, 0x7e94e6c6, 0xd662f7b, - 0x7e978715, 0xd59e586, 0x7e9a24fb, 0xd4d9b0e, - 0x7e9cc076, 0xd415013, 0x7e9f5988, 0xd350495, - 0x7ea1f02f, 0xd28b894, 0x7ea4846c, 0xd1c6c11, - 0x7ea7163f, 0xd101f0e, 0x7ea9a5a8, 0xd03d189, - 0x7eac32a6, 0xcf78383, 0x7eaebd3a, 0xceb34fe, - 0x7eb14563, 0xcdee5f9, 0x7eb3cb21, 0xcd29676, - 0x7eb64e75, 0xcc64673, 0x7eb8cf5d, 0xcb9f5f3, - 0x7ebb4ddb, 0xcada4f5, 0x7ebdc9ed, 0xca1537a, - 0x7ec04394, 0xc950182, 0x7ec2bad0, 0xc88af0e, - 0x7ec52fa0, 0xc7c5c1e, 0x7ec7a205, 0xc7008b3, - 0x7eca11fe, 0xc63b4ce, 0x7ecc7f8b, 0xc57606e, - 0x7eceeaad, 0xc4b0b94, 0x7ed15363, 0xc3eb641, - 0x7ed3b9ad, 0xc326075, 0x7ed61d8a, 0xc260a31, - 0x7ed87efc, 0xc19b374, 0x7edade01, 0xc0d5c41, - 0x7edd3a9a, 0xc010496, 0x7edf94c7, 0xbf4ac75, - 0x7ee1ec87, 0xbe853de, 0x7ee441da, 0xbdbfad1, - 0x7ee694c1, 0xbcfa150, 0x7ee8e53a, 0xbc34759, - 0x7eeb3347, 0xbb6ecef, 0x7eed7ee7, 0xbaa9211, - 0x7eefc81a, 0xb9e36c0, 0x7ef20ee0, 0xb91dafc, - 0x7ef45338, 0xb857ec7, 0x7ef69523, 0xb79221f, - 0x7ef8d4a1, 0xb6cc506, 0x7efb11b1, 0xb60677c, - 0x7efd4c54, 0xb540982, 0x7eff8489, 0xb47ab19, - 0x7f01ba50, 0xb3b4c40, 0x7f03eda9, 0xb2eecf8, - 0x7f061e95, 0xb228d42, 0x7f084d12, 0xb162d1d, - 0x7f0a7921, 0xb09cc8c, 0x7f0ca2c2, 0xafd6b8d, - 0x7f0ec9f5, 0xaf10a22, 0x7f10eeb9, 0xae4a84b, - 0x7f13110f, 0xad84609, 0x7f1530f7, 0xacbe35b, - 0x7f174e70, 0xabf8043, 0x7f19697a, 0xab31cc1, - 0x7f1b8215, 0xaa6b8d5, 0x7f1d9842, 0xa9a5480, - 0x7f1fabff, 0xa8defc3, 0x7f21bd4e, 0xa818a9d, - 0x7f23cc2e, 0xa752510, 0x7f25d89e, 0xa68bf1b, - 0x7f27e29f, 0xa5c58c0, 0x7f29ea31, 0xa4ff1fe, - 0x7f2bef53, 0xa438ad7, 0x7f2df206, 0xa37234a, - 0x7f2ff24a, 0xa2abb59, 0x7f31f01d, 0xa1e5303, - 0x7f33eb81, 0xa11ea49, 0x7f35e476, 0xa05812c, - 0x7f37dafa, 0x9f917ac, 0x7f39cf0e, 0x9ecadc9, - 0x7f3bc0b3, 0x9e04385, 0x7f3dafe7, 0x9d3d8df, - 0x7f3f9cab, 0x9c76dd8, 0x7f4186ff, 0x9bb0271, - 0x7f436ee3, 0x9ae96aa, 0x7f455456, 0x9a22a83, - 0x7f473759, 0x995bdfd, 0x7f4917eb, 0x9895118, - 0x7f4af60d, 0x97ce3d5, 0x7f4cd1be, 0x9707635, - 0x7f4eaafe, 0x9640837, 0x7f5081cd, 0x95799dd, - 0x7f52562c, 0x94b2b27, 0x7f54281a, 0x93ebc14, - 0x7f55f796, 0x9324ca7, 0x7f57c4a2, 0x925dcdf, - 0x7f598f3c, 0x9196cbc, 0x7f5b5765, 0x90cfc40, - 0x7f5d1d1d, 0x9008b6a, 0x7f5ee063, 0x8f41a3c, - 0x7f60a138, 0x8e7a8b5, 0x7f625f9b, 0x8db36d6, - 0x7f641b8d, 0x8cec4a0, 0x7f65d50d, 0x8c25213, - 0x7f678c1c, 0x8b5df30, 0x7f6940b8, 0x8a96bf6, - 0x7f6af2e3, 0x89cf867, 0x7f6ca29c, 0x8908483, - 0x7f6e4fe3, 0x884104b, 0x7f6ffab8, 0x8779bbe, - 0x7f71a31b, 0x86b26de, 0x7f73490b, 0x85eb1ab, - 0x7f74ec8a, 0x8523c25, 0x7f768d96, 0x845c64d, - 0x7f782c30, 0x8395024, 0x7f79c857, 0x82cd9a9, - 0x7f7b620c, 0x82062de, 0x7f7cf94e, 0x813ebc2, - 0x7f7e8e1e, 0x8077457, 0x7f80207b, 0x7fafc9c, - 0x7f81b065, 0x7ee8493, 0x7f833ddd, 0x7e20c3b, - 0x7f84c8e2, 0x7d59396, 0x7f865174, 0x7c91aa3, - 0x7f87d792, 0x7bca163, 0x7f895b3e, 0x7b027d7, - 0x7f8adc77, 0x7a3adff, 0x7f8c5b3d, 0x79733dc, - 0x7f8dd78f, 0x78ab96e, 0x7f8f516e, 0x77e3eb5, - 0x7f90c8da, 0x771c3b3, 0x7f923dd2, 0x7654867, - 0x7f93b058, 0x758ccd2, 0x7f952069, 0x74c50f4, - 0x7f968e07, 0x73fd4cf, 0x7f97f932, 0x7335862, - 0x7f9961e8, 0x726dbae, 0x7f9ac82c, 0x71a5eb3, - 0x7f9c2bfb, 0x70de172, 0x7f9d8d56, 0x70163eb, - 0x7f9eec3e, 0x6f4e620, 0x7fa048b2, 0x6e86810, - 0x7fa1a2b2, 0x6dbe9bb, 0x7fa2fa3d, 0x6cf6b23, - 0x7fa44f55, 0x6c2ec48, 0x7fa5a1f9, 0x6b66d29, - 0x7fa6f228, 0x6a9edc9, 0x7fa83fe3, 0x69d6e27, - 0x7fa98b2a, 0x690ee44, 0x7faad3fd, 0x6846e1f, - 0x7fac1a5b, 0x677edbb, 0x7fad5e45, 0x66b6d16, - 0x7fae9fbb, 0x65eec33, 0x7fafdebb, 0x6526b10, - 0x7fb11b48, 0x645e9af, 0x7fb2555f, 0x6396810, - 0x7fb38d02, 0x62ce634, 0x7fb4c231, 0x620641a, - 0x7fb5f4ea, 0x613e1c5, 0x7fb7252f, 0x6075f33, - 0x7fb852ff, 0x5fadc66, 0x7fb97e5a, 0x5ee595d, - 0x7fbaa740, 0x5e1d61b, 0x7fbbcdb1, 0x5d5529e, - 0x7fbcf1ad, 0x5c8cee7, 0x7fbe1334, 0x5bc4af8, - 0x7fbf3246, 0x5afc6d0, 0x7fc04ee3, 0x5a3426f, - 0x7fc1690a, 0x596bdd7, 0x7fc280bc, 0x58a3908, - 0x7fc395f9, 0x57db403, 0x7fc4a8c1, 0x5712ec7, - 0x7fc5b913, 0x564a955, 0x7fc6c6f0, 0x55823ae, - 0x7fc7d258, 0x54b9dd3, 0x7fc8db4a, 0x53f17c3, - 0x7fc9e1c6, 0x532917f, 0x7fcae5cd, 0x5260b08, - 0x7fcbe75e, 0x519845e, 0x7fcce67a, 0x50cfd82, - 0x7fcde320, 0x5007674, 0x7fcedd50, 0x4f3ef35, - 0x7fcfd50b, 0x4e767c5, 0x7fd0ca4f, 0x4dae024, - 0x7fd1bd1e, 0x4ce5854, 0x7fd2ad77, 0x4c1d054, - 0x7fd39b5a, 0x4b54825, 0x7fd486c7, 0x4a8bfc7, - 0x7fd56fbe, 0x49c373c, 0x7fd6563f, 0x48fae83, - 0x7fd73a4a, 0x483259d, 0x7fd81bdf, 0x4769c8b, - 0x7fd8fafe, 0x46a134c, 0x7fd9d7a7, 0x45d89e2, - 0x7fdab1d9, 0x451004d, 0x7fdb8996, 0x444768d, - 0x7fdc5edc, 0x437eca4, 0x7fdd31ac, 0x42b6290, - 0x7fde0205, 0x41ed854, 0x7fdecfe8, 0x4124dee, - 0x7fdf9b55, 0x405c361, 0x7fe0644b, 0x3f938ac, - 0x7fe12acb, 0x3ecadcf, 0x7fe1eed5, 0x3e022cc, - 0x7fe2b067, 0x3d397a3, 0x7fe36f84, 0x3c70c54, - 0x7fe42c2a, 0x3ba80df, 0x7fe4e659, 0x3adf546, - 0x7fe59e12, 0x3a16988, 0x7fe65354, 0x394dda7, - 0x7fe7061f, 0x38851a2, 0x7fe7b674, 0x37bc57b, - 0x7fe86452, 0x36f3931, 0x7fe90fb9, 0x362acc5, - 0x7fe9b8a9, 0x3562038, 0x7fea5f23, 0x3499389, - 0x7feb0326, 0x33d06bb, 0x7feba4b2, 0x33079cc, - 0x7fec43c7, 0x323ecbe, 0x7fece065, 0x3175f91, - 0x7fed7a8c, 0x30ad245, 0x7fee123d, 0x2fe44dc, - 0x7feea776, 0x2f1b755, 0x7fef3a39, 0x2e529b0, - 0x7fefca84, 0x2d89bf0, 0x7ff05858, 0x2cc0e13, - 0x7ff0e3b6, 0x2bf801a, 0x7ff16c9c, 0x2b2f207, - 0x7ff1f30b, 0x2a663d8, 0x7ff27703, 0x299d590, - 0x7ff2f884, 0x28d472e, 0x7ff3778e, 0x280b8b3, - 0x7ff3f420, 0x2742a1f, 0x7ff46e3c, 0x2679b73, - 0x7ff4e5e0, 0x25b0caf, 0x7ff55b0d, 0x24e7dd4, - 0x7ff5cdc3, 0x241eee2, 0x7ff63e01, 0x2355fd9, - 0x7ff6abc8, 0x228d0bb, 0x7ff71718, 0x21c4188, - 0x7ff77ff1, 0x20fb240, 0x7ff7e652, 0x20322e3, - 0x7ff84a3c, 0x1f69373, 0x7ff8abae, 0x1ea03ef, - 0x7ff90aaa, 0x1dd7459, 0x7ff9672d, 0x1d0e4b0, - 0x7ff9c13a, 0x1c454f5, 0x7ffa18cf, 0x1b7c528, - 0x7ffa6dec, 0x1ab354b, 0x7ffac092, 0x19ea55d, - 0x7ffb10c1, 0x192155f, 0x7ffb5e78, 0x1858552, - 0x7ffba9b8, 0x178f536, 0x7ffbf280, 0x16c650b, - 0x7ffc38d1, 0x15fd4d2, 0x7ffc7caa, 0x153448c, - 0x7ffcbe0c, 0x146b438, 0x7ffcfcf6, 0x13a23d8, - 0x7ffd3969, 0x12d936c, 0x7ffd7364, 0x12102f4, - 0x7ffdaae7, 0x1147271, 0x7ffddff3, 0x107e1e3, - 0x7ffe1288, 0xfb514b, 0x7ffe42a4, 0xeec0aa, - 0x7ffe704a, 0xe22fff, 0x7ffe9b77, 0xd59f4c, - 0x7ffec42d, 0xc90e90, 0x7ffeea6c, 0xbc7dcc, - 0x7fff0e32, 0xafed02, 0x7fff2f82, 0xa35c30, - 0x7fff4e59, 0x96cb58, 0x7fff6ab9, 0x8a3a7b, - 0x7fff84a1, 0x7da998, 0x7fff9c12, 0x7118b0, - 0x7fffb10b, 0x6487c4, 0x7fffc38c, 0x57f6d4, - 0x7fffd396, 0x4b65e1, 0x7fffe128, 0x3ed4ea, - 0x7fffec43, 0x3243f1, 0x7ffff4e6, 0x25b2f7, - 0x7ffffb11, 0x1921fb, 0x7ffffec4, 0xc90fe, - 0x7fffffff, 0x0, 0x7ffffec4, 0xfff36f02, - 0x7ffffb11, 0xffe6de05, 0x7ffff4e6, 0xffda4d09, - 0x7fffec43, 0xffcdbc0f, 0x7fffe128, 0xffc12b16, - 0x7fffd396, 0xffb49a1f, 0x7fffc38c, 0xffa8092c, - 0x7fffb10b, 0xff9b783c, 0x7fff9c12, 0xff8ee750, - 0x7fff84a1, 0xff825668, 0x7fff6ab9, 0xff75c585, - 0x7fff4e59, 0xff6934a8, 0x7fff2f82, 0xff5ca3d0, - 0x7fff0e32, 0xff5012fe, 0x7ffeea6c, 0xff438234, - 0x7ffec42d, 0xff36f170, 0x7ffe9b77, 0xff2a60b4, - 0x7ffe704a, 0xff1dd001, 0x7ffe42a4, 0xff113f56, - 0x7ffe1288, 0xff04aeb5, 0x7ffddff3, 0xfef81e1d, - 0x7ffdaae7, 0xfeeb8d8f, 0x7ffd7364, 0xfedefd0c, - 0x7ffd3969, 0xfed26c94, 0x7ffcfcf6, 0xfec5dc28, - 0x7ffcbe0c, 0xfeb94bc8, 0x7ffc7caa, 0xfeacbb74, - 0x7ffc38d1, 0xfea02b2e, 0x7ffbf280, 0xfe939af5, - 0x7ffba9b8, 0xfe870aca, 0x7ffb5e78, 0xfe7a7aae, - 0x7ffb10c1, 0xfe6deaa1, 0x7ffac092, 0xfe615aa3, - 0x7ffa6dec, 0xfe54cab5, 0x7ffa18cf, 0xfe483ad8, - 0x7ff9c13a, 0xfe3bab0b, 0x7ff9672d, 0xfe2f1b50, - 0x7ff90aaa, 0xfe228ba7, 0x7ff8abae, 0xfe15fc11, - 0x7ff84a3c, 0xfe096c8d, 0x7ff7e652, 0xfdfcdd1d, - 0x7ff77ff1, 0xfdf04dc0, 0x7ff71718, 0xfde3be78, - 0x7ff6abc8, 0xfdd72f45, 0x7ff63e01, 0xfdcaa027, - 0x7ff5cdc3, 0xfdbe111e, 0x7ff55b0d, 0xfdb1822c, - 0x7ff4e5e0, 0xfda4f351, 0x7ff46e3c, 0xfd98648d, - 0x7ff3f420, 0xfd8bd5e1, 0x7ff3778e, 0xfd7f474d, - 0x7ff2f884, 0xfd72b8d2, 0x7ff27703, 0xfd662a70, - 0x7ff1f30b, 0xfd599c28, 0x7ff16c9c, 0xfd4d0df9, - 0x7ff0e3b6, 0xfd407fe6, 0x7ff05858, 0xfd33f1ed, - 0x7fefca84, 0xfd276410, 0x7fef3a39, 0xfd1ad650, - 0x7feea776, 0xfd0e48ab, 0x7fee123d, 0xfd01bb24, - 0x7fed7a8c, 0xfcf52dbb, 0x7fece065, 0xfce8a06f, - 0x7fec43c7, 0xfcdc1342, 0x7feba4b2, 0xfccf8634, - 0x7feb0326, 0xfcc2f945, 0x7fea5f23, 0xfcb66c77, - 0x7fe9b8a9, 0xfca9dfc8, 0x7fe90fb9, 0xfc9d533b, - 0x7fe86452, 0xfc90c6cf, 0x7fe7b674, 0xfc843a85, - 0x7fe7061f, 0xfc77ae5e, 0x7fe65354, 0xfc6b2259, - 0x7fe59e12, 0xfc5e9678, 0x7fe4e659, 0xfc520aba, - 0x7fe42c2a, 0xfc457f21, 0x7fe36f84, 0xfc38f3ac, - 0x7fe2b067, 0xfc2c685d, 0x7fe1eed5, 0xfc1fdd34, - 0x7fe12acb, 0xfc135231, 0x7fe0644b, 0xfc06c754, - 0x7fdf9b55, 0xfbfa3c9f, 0x7fdecfe8, 0xfbedb212, - 0x7fde0205, 0xfbe127ac, 0x7fdd31ac, 0xfbd49d70, - 0x7fdc5edc, 0xfbc8135c, 0x7fdb8996, 0xfbbb8973, - 0x7fdab1d9, 0xfbaeffb3, 0x7fd9d7a7, 0xfba2761e, - 0x7fd8fafe, 0xfb95ecb4, 0x7fd81bdf, 0xfb896375, - 0x7fd73a4a, 0xfb7cda63, 0x7fd6563f, 0xfb70517d, - 0x7fd56fbe, 0xfb63c8c4, 0x7fd486c7, 0xfb574039, - 0x7fd39b5a, 0xfb4ab7db, 0x7fd2ad77, 0xfb3e2fac, - 0x7fd1bd1e, 0xfb31a7ac, 0x7fd0ca4f, 0xfb251fdc, - 0x7fcfd50b, 0xfb18983b, 0x7fcedd50, 0xfb0c10cb, - 0x7fcde320, 0xfaff898c, 0x7fcce67a, 0xfaf3027e, - 0x7fcbe75e, 0xfae67ba2, 0x7fcae5cd, 0xfad9f4f8, - 0x7fc9e1c6, 0xfacd6e81, 0x7fc8db4a, 0xfac0e83d, - 0x7fc7d258, 0xfab4622d, 0x7fc6c6f0, 0xfaa7dc52, - 0x7fc5b913, 0xfa9b56ab, 0x7fc4a8c1, 0xfa8ed139, - 0x7fc395f9, 0xfa824bfd, 0x7fc280bc, 0xfa75c6f8, - 0x7fc1690a, 0xfa694229, 0x7fc04ee3, 0xfa5cbd91, - 0x7fbf3246, 0xfa503930, 0x7fbe1334, 0xfa43b508, - 0x7fbcf1ad, 0xfa373119, 0x7fbbcdb1, 0xfa2aad62, - 0x7fbaa740, 0xfa1e29e5, 0x7fb97e5a, 0xfa11a6a3, - 0x7fb852ff, 0xfa05239a, 0x7fb7252f, 0xf9f8a0cd, - 0x7fb5f4ea, 0xf9ec1e3b, 0x7fb4c231, 0xf9df9be6, - 0x7fb38d02, 0xf9d319cc, 0x7fb2555f, 0xf9c697f0, - 0x7fb11b48, 0xf9ba1651, 0x7fafdebb, 0xf9ad94f0, - 0x7fae9fbb, 0xf9a113cd, 0x7fad5e45, 0xf99492ea, - 0x7fac1a5b, 0xf9881245, 0x7faad3fd, 0xf97b91e1, - 0x7fa98b2a, 0xf96f11bc, 0x7fa83fe3, 0xf96291d9, - 0x7fa6f228, 0xf9561237, 0x7fa5a1f9, 0xf94992d7, - 0x7fa44f55, 0xf93d13b8, 0x7fa2fa3d, 0xf93094dd, - 0x7fa1a2b2, 0xf9241645, 0x7fa048b2, 0xf91797f0, - 0x7f9eec3e, 0xf90b19e0, 0x7f9d8d56, 0xf8fe9c15, - 0x7f9c2bfb, 0xf8f21e8e, 0x7f9ac82c, 0xf8e5a14d, - 0x7f9961e8, 0xf8d92452, 0x7f97f932, 0xf8cca79e, - 0x7f968e07, 0xf8c02b31, 0x7f952069, 0xf8b3af0c, - 0x7f93b058, 0xf8a7332e, 0x7f923dd2, 0xf89ab799, - 0x7f90c8da, 0xf88e3c4d, 0x7f8f516e, 0xf881c14b, - 0x7f8dd78f, 0xf8754692, 0x7f8c5b3d, 0xf868cc24, - 0x7f8adc77, 0xf85c5201, 0x7f895b3e, 0xf84fd829, - 0x7f87d792, 0xf8435e9d, 0x7f865174, 0xf836e55d, - 0x7f84c8e2, 0xf82a6c6a, 0x7f833ddd, 0xf81df3c5, - 0x7f81b065, 0xf8117b6d, 0x7f80207b, 0xf8050364, - 0x7f7e8e1e, 0xf7f88ba9, 0x7f7cf94e, 0xf7ec143e, - 0x7f7b620c, 0xf7df9d22, 0x7f79c857, 0xf7d32657, - 0x7f782c30, 0xf7c6afdc, 0x7f768d96, 0xf7ba39b3, - 0x7f74ec8a, 0xf7adc3db, 0x7f73490b, 0xf7a14e55, - 0x7f71a31b, 0xf794d922, 0x7f6ffab8, 0xf7886442, - 0x7f6e4fe3, 0xf77befb5, 0x7f6ca29c, 0xf76f7b7d, - 0x7f6af2e3, 0xf7630799, 0x7f6940b8, 0xf756940a, - 0x7f678c1c, 0xf74a20d0, 0x7f65d50d, 0xf73daded, - 0x7f641b8d, 0xf7313b60, 0x7f625f9b, 0xf724c92a, - 0x7f60a138, 0xf718574b, 0x7f5ee063, 0xf70be5c4, - 0x7f5d1d1d, 0xf6ff7496, 0x7f5b5765, 0xf6f303c0, - 0x7f598f3c, 0xf6e69344, 0x7f57c4a2, 0xf6da2321, - 0x7f55f796, 0xf6cdb359, 0x7f54281a, 0xf6c143ec, - 0x7f52562c, 0xf6b4d4d9, 0x7f5081cd, 0xf6a86623, - 0x7f4eaafe, 0xf69bf7c9, 0x7f4cd1be, 0xf68f89cb, - 0x7f4af60d, 0xf6831c2b, 0x7f4917eb, 0xf676aee8, - 0x7f473759, 0xf66a4203, 0x7f455456, 0xf65dd57d, - 0x7f436ee3, 0xf6516956, 0x7f4186ff, 0xf644fd8f, - 0x7f3f9cab, 0xf6389228, 0x7f3dafe7, 0xf62c2721, - 0x7f3bc0b3, 0xf61fbc7b, 0x7f39cf0e, 0xf6135237, - 0x7f37dafa, 0xf606e854, 0x7f35e476, 0xf5fa7ed4, - 0x7f33eb81, 0xf5ee15b7, 0x7f31f01d, 0xf5e1acfd, - 0x7f2ff24a, 0xf5d544a7, 0x7f2df206, 0xf5c8dcb6, - 0x7f2bef53, 0xf5bc7529, 0x7f29ea31, 0xf5b00e02, - 0x7f27e29f, 0xf5a3a740, 0x7f25d89e, 0xf59740e5, - 0x7f23cc2e, 0xf58adaf0, 0x7f21bd4e, 0xf57e7563, - 0x7f1fabff, 0xf572103d, 0x7f1d9842, 0xf565ab80, - 0x7f1b8215, 0xf559472b, 0x7f19697a, 0xf54ce33f, - 0x7f174e70, 0xf5407fbd, 0x7f1530f7, 0xf5341ca5, - 0x7f13110f, 0xf527b9f7, 0x7f10eeb9, 0xf51b57b5, - 0x7f0ec9f5, 0xf50ef5de, 0x7f0ca2c2, 0xf5029473, - 0x7f0a7921, 0xf4f63374, 0x7f084d12, 0xf4e9d2e3, - 0x7f061e95, 0xf4dd72be, 0x7f03eda9, 0xf4d11308, - 0x7f01ba50, 0xf4c4b3c0, 0x7eff8489, 0xf4b854e7, - 0x7efd4c54, 0xf4abf67e, 0x7efb11b1, 0xf49f9884, - 0x7ef8d4a1, 0xf4933afa, 0x7ef69523, 0xf486dde1, - 0x7ef45338, 0xf47a8139, 0x7ef20ee0, 0xf46e2504, - 0x7eefc81a, 0xf461c940, 0x7eed7ee7, 0xf4556def, - 0x7eeb3347, 0xf4491311, 0x7ee8e53a, 0xf43cb8a7, - 0x7ee694c1, 0xf4305eb0, 0x7ee441da, 0xf424052f, - 0x7ee1ec87, 0xf417ac22, 0x7edf94c7, 0xf40b538b, - 0x7edd3a9a, 0xf3fefb6a, 0x7edade01, 0xf3f2a3bf, - 0x7ed87efc, 0xf3e64c8c, 0x7ed61d8a, 0xf3d9f5cf, - 0x7ed3b9ad, 0xf3cd9f8b, 0x7ed15363, 0xf3c149bf, - 0x7eceeaad, 0xf3b4f46c, 0x7ecc7f8b, 0xf3a89f92, - 0x7eca11fe, 0xf39c4b32, 0x7ec7a205, 0xf38ff74d, - 0x7ec52fa0, 0xf383a3e2, 0x7ec2bad0, 0xf37750f2, - 0x7ec04394, 0xf36afe7e, 0x7ebdc9ed, 0xf35eac86, - 0x7ebb4ddb, 0xf3525b0b, 0x7eb8cf5d, 0xf3460a0d, - 0x7eb64e75, 0xf339b98d, 0x7eb3cb21, 0xf32d698a, - 0x7eb14563, 0xf3211a07, 0x7eaebd3a, 0xf314cb02, - 0x7eac32a6, 0xf3087c7d, 0x7ea9a5a8, 0xf2fc2e77, - 0x7ea7163f, 0xf2efe0f2, 0x7ea4846c, 0xf2e393ef, - 0x7ea1f02f, 0xf2d7476c, 0x7e9f5988, 0xf2cafb6b, - 0x7e9cc076, 0xf2beafed, 0x7e9a24fb, 0xf2b264f2, - 0x7e978715, 0xf2a61a7a, 0x7e94e6c6, 0xf299d085, - 0x7e92440d, 0xf28d8715, 0x7e8f9eeb, 0xf2813e2a, - 0x7e8cf75f, 0xf274f5c3, 0x7e8a4d6a, 0xf268ade3, - 0x7e87a10c, 0xf25c6688, 0x7e84f245, 0xf2501fb5, - 0x7e824114, 0xf243d968, 0x7e7f8d7b, 0xf23793a3, - 0x7e7cd778, 0xf22b4e66, 0x7e7a1f0d, 0xf21f09b1, - 0x7e77643a, 0xf212c585, 0x7e74a6fd, 0xf20681e3, - 0x7e71e759, 0xf1fa3ecb, 0x7e6f254c, 0xf1edfc3d, - 0x7e6c60d7, 0xf1e1ba3a, 0x7e6999fa, 0xf1d578c2, - 0x7e66d0b4, 0xf1c937d6, 0x7e640507, 0xf1bcf777, - 0x7e6136f3, 0xf1b0b7a4, 0x7e5e6676, 0xf1a4785e, - 0x7e5b9392, 0xf19839a6, 0x7e58be47, 0xf18bfb7d, - 0x7e55e694, 0xf17fbde2, 0x7e530c7a, 0xf17380d6, - 0x7e502ff9, 0xf1674459, 0x7e4d5110, 0xf15b086d, - 0x7e4a6fc1, 0xf14ecd11, 0x7e478c0b, 0xf1429247, - 0x7e44a5ef, 0xf136580d, 0x7e41bd6c, 0xf12a1e66, - 0x7e3ed282, 0xf11de551, 0x7e3be532, 0xf111accf, - 0x7e38f57c, 0xf10574e0, 0x7e360360, 0xf0f93d86, - 0x7e330ede, 0xf0ed06bf, 0x7e3017f6, 0xf0e0d08d, - 0x7e2d1ea8, 0xf0d49af1, 0x7e2a22f4, 0xf0c865ea, - 0x7e2724db, 0xf0bc317a, 0x7e24245d, 0xf0affda0, - 0x7e212179, 0xf0a3ca5d, 0x7e1e1c30, 0xf09797b2, - 0x7e1b1482, 0xf08b659f, 0x7e180a6f, 0xf07f3424, - 0x7e14fdf7, 0xf0730342, 0x7e11ef1b, 0xf066d2fa, - 0x7e0eddd9, 0xf05aa34c, 0x7e0bca34, 0xf04e7438, - 0x7e08b42a, 0xf04245c0, 0x7e059bbb, 0xf03617e2, - 0x7e0280e9, 0xf029eaa1, 0x7dff63b2, 0xf01dbdfb, - 0x7dfc4418, 0xf01191f3, 0x7df9221a, 0xf0056687, - 0x7df5fdb8, 0xeff93bba, 0x7df2d6f3, 0xefed118a, - 0x7defadca, 0xefe0e7f9, 0x7dec823e, 0xefd4bf08, - 0x7de9544f, 0xefc896b5, 0x7de623fd, 0xefbc6f03, - 0x7de2f148, 0xefb047f2, 0x7ddfbc30, 0xefa42181, - 0x7ddc84b5, 0xef97fbb2, 0x7dd94ad8, 0xef8bd685, - 0x7dd60e99, 0xef7fb1fa, 0x7dd2cff7, 0xef738e12, - 0x7dcf8ef3, 0xef676ace, 0x7dcc4b8d, 0xef5b482d, - 0x7dc905c5, 0xef4f2630, 0x7dc5bd9b, 0xef4304d8, - 0x7dc2730f, 0xef36e426, 0x7dbf2622, 0xef2ac419, - 0x7dbbd6d4, 0xef1ea4b2, 0x7db88524, 0xef1285f2, - 0x7db53113, 0xef0667d9, 0x7db1daa2, 0xeefa4a67, - 0x7dae81cf, 0xeeee2d9d, 0x7dab269b, 0xeee2117c, - 0x7da7c907, 0xeed5f604, 0x7da46912, 0xeec9db35, - 0x7da106bd, 0xeebdc110, 0x7d9da208, 0xeeb1a796, - 0x7d9a3af2, 0xeea58ec6, 0x7d96d17d, 0xee9976a1, - 0x7d9365a8, 0xee8d5f29, 0x7d8ff772, 0xee81485c, - 0x7d8c86de, 0xee75323c, 0x7d8913ea, 0xee691cc9, - 0x7d859e96, 0xee5d0804, 0x7d8226e4, 0xee50f3ed, - 0x7d7eacd2, 0xee44e084, 0x7d7b3061, 0xee38cdcb, - 0x7d77b192, 0xee2cbbc1, 0x7d743064, 0xee20aa67, - 0x7d70acd7, 0xee1499bd, 0x7d6d26ec, 0xee0889c4, - 0x7d699ea3, 0xedfc7a7c, 0x7d6613fb, 0xedf06be6, - 0x7d6286f6, 0xede45e03, 0x7d5ef793, 0xedd850d2, - 0x7d5b65d2, 0xedcc4454, 0x7d57d1b3, 0xedc0388a, - 0x7d543b37, 0xedb42d74, 0x7d50a25e, 0xeda82313, - 0x7d4d0728, 0xed9c1967, 0x7d496994, 0xed901070, - 0x7d45c9a4, 0xed84082f, 0x7d422757, 0xed7800a5, - 0x7d3e82ae, 0xed6bf9d1, 0x7d3adba7, 0xed5ff3b5, - 0x7d373245, 0xed53ee51, 0x7d338687, 0xed47e9a5, - 0x7d2fd86c, 0xed3be5b1, 0x7d2c27f6, 0xed2fe277, - 0x7d287523, 0xed23dff7, 0x7d24bff6, 0xed17de31, - 0x7d21086c, 0xed0bdd25, 0x7d1d4e88, 0xecffdcd4, - 0x7d199248, 0xecf3dd3f, 0x7d15d3ad, 0xece7de66, - 0x7d1212b7, 0xecdbe04a, 0x7d0e4f67, 0xeccfe2ea, - 0x7d0a89bc, 0xecc3e648, 0x7d06c1b6, 0xecb7ea63, - 0x7d02f757, 0xecabef3d, 0x7cff2a9d, 0xec9ff4d6, - 0x7cfb5b89, 0xec93fb2e, 0x7cf78a1b, 0xec880245, - 0x7cf3b653, 0xec7c0a1d, 0x7cefe032, 0xec7012b5, - 0x7cec07b8, 0xec641c0e, 0x7ce82ce4, 0xec582629, - 0x7ce44fb7, 0xec4c3106, 0x7ce07031, 0xec403ca5, - 0x7cdc8e52, 0xec344908, 0x7cd8aa1b, 0xec28562d, - 0x7cd4c38b, 0xec1c6417, 0x7cd0daa2, 0xec1072c4, - 0x7cccef62, 0xec048237, 0x7cc901c9, 0xebf8926f, - 0x7cc511d9, 0xebeca36c, 0x7cc11f90, 0xebe0b52f, - 0x7cbd2af0, 0xebd4c7ba, 0x7cb933f9, 0xebc8db0b, - 0x7cb53aaa, 0xebbcef23, 0x7cb13f04, 0xebb10404, - 0x7cad4107, 0xeba519ad, 0x7ca940b3, 0xeb99301f, - 0x7ca53e09, 0xeb8d475b, 0x7ca13908, 0xeb815f60, - 0x7c9d31b0, 0xeb75782f, 0x7c992803, 0xeb6991ca, - 0x7c951bff, 0xeb5dac2f, 0x7c910da5, 0xeb51c760, - 0x7c8cfcf6, 0xeb45e35d, 0x7c88e9f1, 0xeb3a0027, - 0x7c84d496, 0xeb2e1dbe, 0x7c80bce7, 0xeb223c22, - 0x7c7ca2e2, 0xeb165b54, 0x7c788688, 0xeb0a7b54, - 0x7c7467d9, 0xeafe9c24, 0x7c7046d6, 0xeaf2bdc3, - 0x7c6c237e, 0xeae6e031, 0x7c67fdd1, 0xeadb0370, - 0x7c63d5d1, 0xeacf277f, 0x7c5fab7c, 0xeac34c60, - 0x7c5b7ed4, 0xeab77212, 0x7c574fd8, 0xeaab9896, - 0x7c531e88, 0xea9fbfed, 0x7c4eeae5, 0xea93e817, - 0x7c4ab4ef, 0xea881114, 0x7c467ca6, 0xea7c3ae5, - 0x7c42420a, 0xea70658a, 0x7c3e051b, 0xea649105, - 0x7c39c5da, 0xea58bd54, 0x7c358446, 0xea4cea79, - 0x7c314060, 0xea411874, 0x7c2cfa28, 0xea354746, - 0x7c28b19e, 0xea2976ef, 0x7c2466c2, 0xea1da770, - 0x7c201994, 0xea11d8c8, 0x7c1bca16, 0xea060af9, - 0x7c177845, 0xe9fa3e03, 0x7c132424, 0xe9ee71e6, - 0x7c0ecdb2, 0xe9e2a6a3, 0x7c0a74f0, 0xe9d6dc3b, - 0x7c0619dc, 0xe9cb12ad, 0x7c01bc78, 0xe9bf49fa, - 0x7bfd5cc4, 0xe9b38223, 0x7bf8fac0, 0xe9a7bb28, - 0x7bf4966c, 0xe99bf509, 0x7bf02fc9, 0xe9902fc7, - 0x7bebc6d5, 0xe9846b63, 0x7be75b93, 0xe978a7dd, - 0x7be2ee01, 0xe96ce535, 0x7bde7e20, 0xe961236c, - 0x7bda0bf0, 0xe9556282, 0x7bd59771, 0xe949a278, - 0x7bd120a4, 0xe93de34e, 0x7bcca789, 0xe9322505, - 0x7bc82c1f, 0xe926679c, 0x7bc3ae67, 0xe91aab16, - 0x7bbf2e62, 0xe90eef71, 0x7bbaac0e, 0xe90334af, - 0x7bb6276e, 0xe8f77acf, 0x7bb1a080, 0xe8ebc1d3, - 0x7bad1744, 0xe8e009ba, 0x7ba88bbc, 0xe8d45286, - 0x7ba3fde7, 0xe8c89c37, 0x7b9f6dc5, 0xe8bce6cd, - 0x7b9adb57, 0xe8b13248, 0x7b96469d, 0xe8a57ea9, - 0x7b91af97, 0xe899cbf1, 0x7b8d1644, 0xe88e1a20, - 0x7b887aa6, 0xe8826936, 0x7b83dcbc, 0xe876b934, - 0x7b7f3c87, 0xe86b0a1a, 0x7b7a9a07, 0xe85f5be9, - 0x7b75f53c, 0xe853aea1, 0x7b714e25, 0xe8480243, - 0x7b6ca4c4, 0xe83c56cf, 0x7b67f919, 0xe830ac45, - 0x7b634b23, 0xe82502a7, 0x7b5e9ae4, 0xe81959f4, - 0x7b59e85a, 0xe80db22d, 0x7b553386, 0xe8020b52, - 0x7b507c69, 0xe7f66564, 0x7b4bc303, 0xe7eac063, - 0x7b470753, 0xe7df1c50, 0x7b42495a, 0xe7d3792b, - 0x7b3d8918, 0xe7c7d6f4, 0x7b38c68e, 0xe7bc35ad, - 0x7b3401bb, 0xe7b09555, 0x7b2f3aa0, 0xe7a4f5ed, - 0x7b2a713d, 0xe7995776, 0x7b25a591, 0xe78db9ef, - 0x7b20d79e, 0xe7821d59, 0x7b1c0764, 0xe77681b6, - 0x7b1734e2, 0xe76ae704, 0x7b126019, 0xe75f4d45, - 0x7b0d8909, 0xe753b479, 0x7b08afb2, 0xe7481ca1, - 0x7b03d414, 0xe73c85bc, 0x7afef630, 0xe730efcc, - 0x7afa1605, 0xe7255ad1, 0x7af53395, 0xe719c6cb, - 0x7af04edf, 0xe70e33bb, 0x7aeb67e3, 0xe702a1a1, - 0x7ae67ea1, 0xe6f7107e, 0x7ae1931a, 0xe6eb8052, - 0x7adca54e, 0xe6dff11d, 0x7ad7b53d, 0xe6d462e1, - 0x7ad2c2e8, 0xe6c8d59c, 0x7acdce4d, 0xe6bd4951, - 0x7ac8d76f, 0xe6b1bdff, 0x7ac3de4c, 0xe6a633a6, - 0x7abee2e5, 0xe69aaa48, 0x7ab9e53a, 0xe68f21e5, - 0x7ab4e54c, 0xe6839a7c, 0x7aafe31b, 0xe6781410, - 0x7aaadea6, 0xe66c8e9f, 0x7aa5d7ee, 0xe6610a2a, - 0x7aa0cef3, 0xe65586b3, 0x7a9bc3b6, 0xe64a0438, - 0x7a96b636, 0xe63e82bc, 0x7a91a674, 0xe633023e, - 0x7a8c9470, 0xe62782be, 0x7a87802a, 0xe61c043d, - 0x7a8269a3, 0xe61086bc, 0x7a7d50da, 0xe6050a3b, - 0x7a7835cf, 0xe5f98ebb, 0x7a731884, 0xe5ee143b, - 0x7a6df8f8, 0xe5e29abc, 0x7a68d72b, 0xe5d72240, - 0x7a63b31d, 0xe5cbaac5, 0x7a5e8cd0, 0xe5c0344d, - 0x7a596442, 0xe5b4bed8, 0x7a543974, 0xe5a94a67, - 0x7a4f0c67, 0xe59dd6f9, 0x7a49dd1a, 0xe5926490, - 0x7a44ab8e, 0xe586f32c, 0x7a3f77c3, 0xe57b82cd, - 0x7a3a41b9, 0xe5701374, 0x7a350970, 0xe564a521, - 0x7a2fcee8, 0xe55937d5, 0x7a2a9223, 0xe54dcb8f, - 0x7a25531f, 0xe5426051, 0x7a2011de, 0xe536f61b, - 0x7a1ace5f, 0xe52b8cee, 0x7a1588a2, 0xe52024c9, - 0x7a1040a8, 0xe514bdad, 0x7a0af671, 0xe509579b, - 0x7a05a9fd, 0xe4fdf294, 0x7a005b4d, 0xe4f28e96, - 0x79fb0a60, 0xe4e72ba4, 0x79f5b737, 0xe4dbc9bd, - 0x79f061d2, 0xe4d068e2, 0x79eb0a31, 0xe4c50914, - 0x79e5b054, 0xe4b9aa52, 0x79e0543c, 0xe4ae4c9d, - 0x79daf5e8, 0xe4a2eff6, 0x79d5955a, 0xe497945d, - 0x79d03291, 0xe48c39d3, 0x79cacd8d, 0xe480e057, - 0x79c5664f, 0xe47587eb, 0x79bffcd7, 0xe46a308f, - 0x79ba9125, 0xe45eda43, 0x79b52339, 0xe4538507, - 0x79afb313, 0xe44830dd, 0x79aa40b4, 0xe43cddc4, - 0x79a4cc1c, 0xe4318bbe, 0x799f554b, 0xe4263ac9, - 0x7999dc42, 0xe41aeae8, 0x799460ff, 0xe40f9c1a, - 0x798ee385, 0xe4044e60, 0x798963d2, 0xe3f901ba, - 0x7983e1e8, 0xe3edb628, 0x797e5dc6, 0xe3e26bac, - 0x7978d76c, 0xe3d72245, 0x79734edc, 0xe3cbd9f4, - 0x796dc414, 0xe3c092b9, 0x79683715, 0xe3b54c95, - 0x7962a7e0, 0xe3aa0788, 0x795d1675, 0xe39ec393, - 0x795782d3, 0xe39380b6, 0x7951ecfc, 0xe3883ef2, - 0x794c54ee, 0xe37cfe47, 0x7946baac, 0xe371beb5, - 0x79411e33, 0xe366803c, 0x793b7f86, 0xe35b42df, - 0x7935dea4, 0xe350069b, 0x79303b8e, 0xe344cb73, - 0x792a9642, 0xe3399167, 0x7924eec3, 0xe32e5876, - 0x791f4510, 0xe32320a2, 0x79199929, 0xe317e9eb, - 0x7913eb0e, 0xe30cb451, 0x790e3ac0, 0xe3017fd5, - 0x7908883f, 0xe2f64c77, 0x7902d38b, 0xe2eb1a37, - 0x78fd1ca4, 0xe2dfe917, 0x78f7638b, 0xe2d4b916, - 0x78f1a840, 0xe2c98a35, 0x78ebeac2, 0xe2be5c74, - 0x78e62b13, 0xe2b32fd4, 0x78e06932, 0xe2a80456, - 0x78daa520, 0xe29cd9f8, 0x78d4dedd, 0xe291b0bd, - 0x78cf1669, 0xe28688a4, 0x78c94bc4, 0xe27b61af, - 0x78c37eef, 0xe2703bdc, 0x78bdafea, 0xe265172e, - 0x78b7deb4, 0xe259f3a3, 0x78b20b4f, 0xe24ed13d, - 0x78ac35ba, 0xe243affc, 0x78a65df6, 0xe2388fe1, - 0x78a08402, 0xe22d70eb, 0x789aa7e0, 0xe222531c, - 0x7894c98f, 0xe2173674, 0x788ee910, 0xe20c1af3, - 0x78890663, 0xe2010099, 0x78832187, 0xe1f5e768, - 0x787d3a7e, 0xe1eacf5f, 0x78775147, 0xe1dfb87f, - 0x787165e3, 0xe1d4a2c8, 0x786b7852, 0xe1c98e3b, - 0x78658894, 0xe1be7ad8, 0x785f96a9, 0xe1b368a0, - 0x7859a292, 0xe1a85793, 0x7853ac4f, 0xe19d47b1, - 0x784db3e0, 0xe19238fb, 0x7847b946, 0xe1872b72, - 0x7841bc7f, 0xe17c1f15, 0x783bbd8e, 0xe17113e5, - 0x7835bc71, 0xe16609e3, 0x782fb92a, 0xe15b0110, - 0x7829b3b9, 0xe14ff96a, 0x7823ac1d, 0xe144f2f3, - 0x781da256, 0xe139edac, 0x78179666, 0xe12ee995, - 0x7811884d, 0xe123e6ad, 0x780b780a, 0xe118e4f6, - 0x7805659e, 0xe10de470, 0x77ff5109, 0xe102e51c, - 0x77f93a4b, 0xe0f7e6f9, 0x77f32165, 0xe0ecea09, - 0x77ed0657, 0xe0e1ee4b, 0x77e6e921, 0xe0d6f3c1, - 0x77e0c9c3, 0xe0cbfa6a, 0x77daa83d, 0xe0c10247, - 0x77d48490, 0xe0b60b58, 0x77ce5ebd, 0xe0ab159e, - 0x77c836c2, 0xe0a0211a, 0x77c20ca1, 0xe0952dcb, - 0x77bbe05a, 0xe08a3bb2, 0x77b5b1ec, 0xe07f4acf, - 0x77af8159, 0xe0745b24, 0x77a94ea0, 0xe0696cb0, - 0x77a319c2, 0xe05e7f74, 0x779ce2be, 0xe053936f, - 0x7796a996, 0xe048a8a4, 0x77906e49, 0xe03dbf11, - 0x778a30d8, 0xe032d6b8, 0x7783f143, 0xe027ef99, - 0x777daf89, 0xe01d09b4, 0x77776bac, 0xe012250a, - 0x777125ac, 0xe007419b, 0x776add88, 0xdffc5f67, - 0x77649341, 0xdff17e70, 0x775e46d8, 0xdfe69eb4, - 0x7757f84c, 0xdfdbc036, 0x7751a79e, 0xdfd0e2f5, - 0x774b54ce, 0xdfc606f1, 0x7744ffdd, 0xdfbb2c2c, - 0x773ea8ca, 0xdfb052a5, 0x77384f95, 0xdfa57a5d, - 0x7731f440, 0xdf9aa354, 0x772b96ca, 0xdf8fcd8b, - 0x77253733, 0xdf84f902, 0x771ed57c, 0xdf7a25ba, - 0x771871a5, 0xdf6f53b3, 0x77120bae, 0xdf6482ed, - 0x770ba398, 0xdf59b369, 0x77053962, 0xdf4ee527, - 0x76fecd0e, 0xdf441828, 0x76f85e9a, 0xdf394c6b, - 0x76f1ee09, 0xdf2e81f3, 0x76eb7b58, 0xdf23b8be, - 0x76e5068a, 0xdf18f0ce, 0x76de8f9e, 0xdf0e2a22, - 0x76d81695, 0xdf0364bc, 0x76d19b6e, 0xdef8a09b, - 0x76cb1e2a, 0xdeedddc0, 0x76c49ec9, 0xdee31c2b, - 0x76be1d4c, 0xded85bdd, 0x76b799b3, 0xdecd9cd7, - 0x76b113fd, 0xdec2df18, 0x76aa8c2c, 0xdeb822a1, - 0x76a4023f, 0xdead6773, 0x769d7637, 0xdea2ad8d, - 0x7696e814, 0xde97f4f1, 0x769057d6, 0xde8d3d9e, - 0x7689c57d, 0xde828796, 0x7683310b, 0xde77d2d8, - 0x767c9a7e, 0xde6d1f65, 0x767601d7, 0xde626d3e, - 0x766f6717, 0xde57bc62, 0x7668ca3e, 0xde4d0cd2, - 0x76622b4c, 0xde425e8f, 0x765b8a41, 0xde37b199, - 0x7654e71d, 0xde2d05f1, 0x764e41e2, 0xde225b96, - 0x76479a8e, 0xde17b28a, 0x7640f123, 0xde0d0acc, - 0x763a45a0, 0xde02645d, 0x76339806, 0xddf7bf3e, - 0x762ce855, 0xdded1b6e, 0x7626368d, 0xdde278ef, - 0x761f82af, 0xddd7d7c1, 0x7618ccba, 0xddcd37e4, - 0x761214b0, 0xddc29958, 0x760b5a90, 0xddb7fc1e, - 0x76049e5b, 0xddad6036, 0x75fde011, 0xdda2c5a2, - 0x75f71fb1, 0xdd982c60, 0x75f05d3d, 0xdd8d9472, - 0x75e998b5, 0xdd82fdd8, 0x75e2d219, 0xdd786892, - 0x75dc0968, 0xdd6dd4a2, 0x75d53ea5, 0xdd634206, - 0x75ce71ce, 0xdd58b0c0, 0x75c7a2e3, 0xdd4e20d0, - 0x75c0d1e7, 0xdd439236, 0x75b9fed7, 0xdd3904f4, - 0x75b329b5, 0xdd2e7908, 0x75ac5282, 0xdd23ee74, - 0x75a5793c, 0xdd196538, 0x759e9de5, 0xdd0edd55, - 0x7597c07d, 0xdd0456ca, 0x7590e104, 0xdcf9d199, - 0x7589ff7a, 0xdcef4dc2, 0x75831be0, 0xdce4cb44, - 0x757c3636, 0xdcda4a21, 0x75754e7c, 0xdccfca59, - 0x756e64b2, 0xdcc54bec, 0x756778d9, 0xdcbacedb, - 0x75608af1, 0xdcb05326, 0x75599afa, 0xdca5d8cd, - 0x7552a8f4, 0xdc9b5fd2, 0x754bb4e1, 0xdc90e834, - 0x7544bebf, 0xdc8671f3, 0x753dc68f, 0xdc7bfd11, - 0x7536cc52, 0xdc71898d, 0x752fd008, 0xdc671768, - 0x7528d1b1, 0xdc5ca6a2, 0x7521d14d, 0xdc52373c, - 0x751acedd, 0xdc47c936, 0x7513ca60, 0xdc3d5c91, - 0x750cc3d8, 0xdc32f14d, 0x7505bb44, 0xdc28876a, - 0x74feb0a5, 0xdc1e1ee9, 0x74f7a3fb, 0xdc13b7c9, - 0x74f09546, 0xdc09520d, 0x74e98487, 0xdbfeedb3, - 0x74e271bd, 0xdbf48abd, 0x74db5cea, 0xdbea292b, - 0x74d4460c, 0xdbdfc8fc, 0x74cd2d26, 0xdbd56a32, - 0x74c61236, 0xdbcb0cce, 0x74bef53d, 0xdbc0b0ce, - 0x74b7d63c, 0xdbb65634, 0x74b0b533, 0xdbabfd01, - 0x74a99221, 0xdba1a534, 0x74a26d08, 0xdb974ece, - 0x749b45e7, 0xdb8cf9cf, 0x74941cbf, 0xdb82a638, - 0x748cf190, 0xdb785409, 0x7485c45b, 0xdb6e0342, - 0x747e951f, 0xdb63b3e5, 0x747763dd, 0xdb5965f1, - 0x74703095, 0xdb4f1967, 0x7468fb47, 0xdb44ce46, - 0x7461c3f5, 0xdb3a8491, 0x745a8a9d, 0xdb303c46, - 0x74534f41, 0xdb25f566, 0x744c11e0, 0xdb1baff2, - 0x7444d27b, 0xdb116beb, 0x743d9112, 0xdb072950, - 0x74364da6, 0xdafce821, 0x742f0836, 0xdaf2a860, - 0x7427c0c3, 0xdae86a0d, 0x7420774d, 0xdade2d28, - 0x74192bd5, 0xdad3f1b1, 0x7411de5b, 0xdac9b7a9, - 0x740a8edf, 0xdabf7f11, 0x74033d61, 0xdab547e8, - 0x73fbe9e2, 0xdaab122f, 0x73f49462, 0xdaa0dde7, - 0x73ed3ce1, 0xda96ab0f, 0x73e5e360, 0xda8c79a9, - 0x73de87de, 0xda8249b4, 0x73d72a5d, 0xda781b31, - 0x73cfcadc, 0xda6dee21, 0x73c8695b, 0xda63c284, - 0x73c105db, 0xda599859, 0x73b9a05d, 0xda4f6fa3, - 0x73b238e0, 0xda454860, 0x73aacf65, 0xda3b2292, - 0x73a363ec, 0xda30fe38, 0x739bf675, 0xda26db54, - 0x73948701, 0xda1cb9e5, 0x738d1590, 0xda1299ec, - 0x7385a222, 0xda087b69, 0x737e2cb7, 0xd9fe5e5e, - 0x7376b551, 0xd9f442c9, 0x736f3bee, 0xd9ea28ac, - 0x7367c090, 0xd9e01006, 0x73604336, 0xd9d5f8d9, - 0x7358c3e2, 0xd9cbe325, 0x73514292, 0xd9c1cee9, - 0x7349bf48, 0xd9b7bc27, 0x73423a04, 0xd9adaadf, - 0x733ab2c6, 0xd9a39b11, 0x7333298f, 0xd9998cbe, - 0x732b9e5e, 0xd98f7fe6, 0x73241134, 0xd9857489, - 0x731c8211, 0xd97b6aa8, 0x7314f0f6, 0xd9716243, - 0x730d5de3, 0xd9675b5a, 0x7305c8d7, 0xd95d55ef, - 0x72fe31d5, 0xd9535201, 0x72f698db, 0xd9494f90, - 0x72eefdea, 0xd93f4e9e, 0x72e76102, 0xd9354f2a, - 0x72dfc224, 0xd92b5135, 0x72d82150, 0xd92154bf, - 0x72d07e85, 0xd91759c9, 0x72c8d9c6, 0xd90d6053, - 0x72c13311, 0xd903685d, 0x72b98a67, 0xd8f971e8, - 0x72b1dfc9, 0xd8ef7cf4, 0x72aa3336, 0xd8e58982, - 0x72a284b0, 0xd8db9792, 0x729ad435, 0xd8d1a724, - 0x729321c7, 0xd8c7b838, 0x728b6d66, 0xd8bdcad0, - 0x7283b712, 0xd8b3deeb, 0x727bfecc, 0xd8a9f48a, - 0x72744493, 0xd8a00bae, 0x726c8868, 0xd8962456, - 0x7264ca4c, 0xd88c3e83, 0x725d0a3e, 0xd8825a35, - 0x72554840, 0xd878776d, 0x724d8450, 0xd86e962b, - 0x7245be70, 0xd864b670, 0x723df6a0, 0xd85ad83c, - 0x72362ce0, 0xd850fb8e, 0x722e6130, 0xd8472069, - 0x72269391, 0xd83d46cc, 0x721ec403, 0xd8336eb7, - 0x7216f287, 0xd829982b, 0x720f1f1c, 0xd81fc328, - 0x720749c3, 0xd815efae, 0x71ff727c, 0xd80c1dbf, - 0x71f79948, 0xd8024d59, 0x71efbe27, 0xd7f87e7f, - 0x71e7e118, 0xd7eeb130, 0x71e0021e, 0xd7e4e56c, - 0x71d82137, 0xd7db1b34, 0x71d03e64, 0xd7d15288, - 0x71c859a5, 0xd7c78b68, 0x71c072fb, 0xd7bdc5d6, - 0x71b88a66, 0xd7b401d1, 0x71b09fe7, 0xd7aa3f5a, - 0x71a8b37c, 0xd7a07e70, 0x71a0c528, 0xd796bf16, - 0x7198d4ea, 0xd78d014a, 0x7190e2c3, 0xd783450d, - 0x7188eeb2, 0xd7798a60, 0x7180f8b8, 0xd76fd143, - 0x717900d6, 0xd76619b6, 0x7171070c, 0xd75c63ba, - 0x71690b59, 0xd752af4f, 0x71610dbf, 0xd748fc75, - 0x71590e3e, 0xd73f4b2e, 0x71510cd5, 0xd7359b78, - 0x71490986, 0xd72bed55, 0x71410450, 0xd72240c5, - 0x7138fd35, 0xd71895c9, 0x7130f433, 0xd70eec60, - 0x7128e94c, 0xd705448b, 0x7120dc80, 0xd6fb9e4b, - 0x7118cdcf, 0xd6f1f99f, 0x7110bd39, 0xd6e85689, - 0x7108aabf, 0xd6deb508, 0x71009661, 0xd6d5151d, - 0x70f8801f, 0xd6cb76c9, 0x70f067fb, 0xd6c1da0b, - 0x70e84df3, 0xd6b83ee4, 0x70e03208, 0xd6aea555, - 0x70d8143b, 0xd6a50d5d, 0x70cff48c, 0xd69b76fe, - 0x70c7d2fb, 0xd691e237, 0x70bfaf89, 0xd6884f09, - 0x70b78a36, 0xd67ebd74, 0x70af6302, 0xd6752d79, - 0x70a739ed, 0xd66b9f18, 0x709f0ef8, 0xd6621251, - 0x7096e223, 0xd6588725, 0x708eb36f, 0xd64efd94, - 0x708682dc, 0xd645759f, 0x707e5069, 0xd63bef46, - 0x70761c18, 0xd6326a88, 0x706de5e9, 0xd628e767, - 0x7065addb, 0xd61f65e4, 0x705d73f0, 0xd615e5fd, - 0x70553828, 0xd60c67b4, 0x704cfa83, 0xd602eb0a, - 0x7044bb00, 0xd5f96ffd, 0x703c79a2, 0xd5eff690, - 0x70343667, 0xd5e67ec1, 0x702bf151, 0xd5dd0892, - 0x7023aa5f, 0xd5d39403, 0x701b6193, 0xd5ca2115, - 0x701316eb, 0xd5c0afc6, 0x700aca69, 0xd5b74019, - 0x70027c0c, 0xd5add20d, 0x6ffa2bd6, 0xd5a465a3, - 0x6ff1d9c7, 0xd59afadb, 0x6fe985de, 0xd59191b5, - 0x6fe1301c, 0xd5882a32, 0x6fd8d882, 0xd57ec452, - 0x6fd07f0f, 0xd5756016, 0x6fc823c5, 0xd56bfd7d, - 0x6fbfc6a3, 0xd5629c89, 0x6fb767aa, 0xd5593d3a, - 0x6faf06da, 0xd54fdf8f, 0x6fa6a433, 0xd5468389, - 0x6f9e3fb6, 0xd53d292a, 0x6f95d963, 0xd533d070, - 0x6f8d713a, 0xd52a795d, 0x6f85073c, 0xd52123f0, - 0x6f7c9b69, 0xd517d02b, 0x6f742dc1, 0xd50e7e0d, - 0x6f6bbe45, 0xd5052d97, 0x6f634cf5, 0xd4fbdec9, - 0x6f5ad9d1, 0xd4f291a4, 0x6f5264da, 0xd4e94627, - 0x6f49ee0f, 0xd4dffc54, 0x6f417573, 0xd4d6b42b, - 0x6f38fb03, 0xd4cd6dab, 0x6f307ec2, 0xd4c428d6, - 0x6f2800af, 0xd4bae5ab, 0x6f1f80ca, 0xd4b1a42c, - 0x6f16ff14, 0xd4a86458, 0x6f0e7b8e, 0xd49f2630, - 0x6f05f637, 0xd495e9b3, 0x6efd6f10, 0xd48caee4, - 0x6ef4e619, 0xd48375c1, 0x6eec5b53, 0xd47a3e4b, - 0x6ee3cebe, 0xd4710883, 0x6edb405a, 0xd467d469, - 0x6ed2b027, 0xd45ea1fd, 0x6eca1e27, 0xd4557140, - 0x6ec18a58, 0xd44c4232, 0x6eb8f4bc, 0xd44314d3, - 0x6eb05d53, 0xd439e923, 0x6ea7c41e, 0xd430bf24, - 0x6e9f291b, 0xd42796d5, 0x6e968c4d, 0xd41e7037, - 0x6e8dedb3, 0xd4154b4a, 0x6e854d4d, 0xd40c280e, - 0x6e7cab1c, 0xd4030684, 0x6e740720, 0xd3f9e6ad, - 0x6e6b615a, 0xd3f0c887, 0x6e62b9ca, 0xd3e7ac15, - 0x6e5a1070, 0xd3de9156, 0x6e51654c, 0xd3d5784a, - 0x6e48b860, 0xd3cc60f2, 0x6e4009aa, 0xd3c34b4f, - 0x6e37592c, 0xd3ba3760, 0x6e2ea6e6, 0xd3b12526, - 0x6e25f2d8, 0xd3a814a2, 0x6e1d3d03, 0xd39f05d3, - 0x6e148566, 0xd395f8ba, 0x6e0bcc03, 0xd38ced57, - 0x6e0310d9, 0xd383e3ab, 0x6dfa53e9, 0xd37adbb6, - 0x6df19534, 0xd371d579, 0x6de8d4b8, 0xd368d0f3, - 0x6de01278, 0xd35fce26, 0x6dd74e73, 0xd356cd11, - 0x6dce88aa, 0xd34dcdb4, 0x6dc5c11c, 0xd344d011, - 0x6dbcf7cb, 0xd33bd427, 0x6db42cb6, 0xd332d9f7, - 0x6dab5fdf, 0xd329e181, 0x6da29144, 0xd320eac6, - 0x6d99c0e7, 0xd317f5c6, 0x6d90eec8, 0xd30f0280, - 0x6d881ae8, 0xd30610f7, 0x6d7f4545, 0xd2fd2129, - 0x6d766de2, 0xd2f43318, 0x6d6d94bf, 0xd2eb46c3, - 0x6d64b9da, 0xd2e25c2b, 0x6d5bdd36, 0xd2d97350, - 0x6d52fed2, 0xd2d08c33, 0x6d4a1eaf, 0xd2c7a6d4, - 0x6d413ccd, 0xd2bec333, 0x6d38592c, 0xd2b5e151, - 0x6d2f73cd, 0xd2ad012e, 0x6d268cb0, 0xd2a422ca, - 0x6d1da3d5, 0xd29b4626, 0x6d14b93d, 0xd2926b41, - 0x6d0bcce8, 0xd289921e, 0x6d02ded7, 0xd280babb, - 0x6cf9ef09, 0xd277e518, 0x6cf0fd80, 0xd26f1138, - 0x6ce80a3a, 0xd2663f19, 0x6cdf153a, 0xd25d6ebc, - 0x6cd61e7f, 0xd254a021, 0x6ccd2609, 0xd24bd34a, - 0x6cc42bd9, 0xd2430835, 0x6cbb2fef, 0xd23a3ee4, - 0x6cb2324c, 0xd2317756, 0x6ca932ef, 0xd228b18d, - 0x6ca031da, 0xd21fed88, 0x6c972f0d, 0xd2172b48, - 0x6c8e2a87, 0xd20e6acc, 0x6c85244a, 0xd205ac17, - 0x6c7c1c55, 0xd1fcef27, 0x6c7312a9, 0xd1f433fd, - 0x6c6a0746, 0xd1eb7a9a, 0x6c60fa2d, 0xd1e2c2fd, - 0x6c57eb5e, 0xd1da0d28, 0x6c4edada, 0xd1d1591a, - 0x6c45c8a0, 0xd1c8a6d4, 0x6c3cb4b1, 0xd1bff656, - 0x6c339f0e, 0xd1b747a0, 0x6c2a87b6, 0xd1ae9ab4, - 0x6c216eaa, 0xd1a5ef90, 0x6c1853eb, 0xd19d4636, - 0x6c0f3779, 0xd1949ea6, 0x6c061953, 0xd18bf8e0, - 0x6bfcf97c, 0xd18354e4, 0x6bf3d7f2, 0xd17ab2b3, - 0x6beab4b6, 0xd172124d, 0x6be18fc9, 0xd16973b3, - 0x6bd8692b, 0xd160d6e5, 0x6bcf40dc, 0xd1583be2, - 0x6bc616dd, 0xd14fa2ad, 0x6bbceb2d, 0xd1470b44, - 0x6bb3bdce, 0xd13e75a8, 0x6baa8ec0, 0xd135e1d9, - 0x6ba15e03, 0xd12d4fd9, 0x6b982b97, 0xd124bfa6, - 0x6b8ef77d, 0xd11c3142, 0x6b85c1b5, 0xd113a4ad, - 0x6b7c8a3f, 0xd10b19e7, 0x6b73511c, 0xd10290f0, - 0x6b6a164d, 0xd0fa09c9, 0x6b60d9d0, 0xd0f18472, - 0x6b579ba8, 0xd0e900ec, 0x6b4e5bd4, 0xd0e07f36, - 0x6b451a55, 0xd0d7ff51, 0x6b3bd72a, 0xd0cf813e, - 0x6b329255, 0xd0c704fd, 0x6b294bd5, 0xd0be8a8d, - 0x6b2003ac, 0xd0b611f1, 0x6b16b9d9, 0xd0ad9b26, - 0x6b0d6e5c, 0xd0a5262f, 0x6b042137, 0xd09cb30b, - 0x6afad269, 0xd09441bb, 0x6af181f3, 0xd08bd23f, - 0x6ae82fd5, 0xd0836497, 0x6adedc10, 0xd07af8c4, - 0x6ad586a3, 0xd0728ec6, 0x6acc2f90, 0xd06a269d, - 0x6ac2d6d6, 0xd061c04a, 0x6ab97c77, 0xd0595bcd, - 0x6ab02071, 0xd050f926, 0x6aa6c2c6, 0xd0489856, - 0x6a9d6377, 0xd040395d, 0x6a940283, 0xd037dc3b, - 0x6a8a9fea, 0xd02f80f1, 0x6a813bae, 0xd027277e, - 0x6a77d5ce, 0xd01ecfe4, 0x6a6e6e4b, 0xd0167a22, - 0x6a650525, 0xd00e2639, 0x6a5b9a5d, 0xd005d42a, - 0x6a522df3, 0xcffd83f4, 0x6a48bfe7, 0xcff53597, - 0x6a3f503a, 0xcfece915, 0x6a35deeb, 0xcfe49e6d, - 0x6a2c6bfd, 0xcfdc55a1, 0x6a22f76e, 0xcfd40eaf, - 0x6a19813f, 0xcfcbc999, 0x6a100970, 0xcfc3865e, - 0x6a069003, 0xcfbb4500, 0x69fd14f6, 0xcfb3057d, - 0x69f3984c, 0xcfaac7d8, 0x69ea1a03, 0xcfa28c10, - 0x69e09a1c, 0xcf9a5225, 0x69d71899, 0xcf921a17, - 0x69cd9578, 0xcf89e3e8, 0x69c410ba, 0xcf81af97, - 0x69ba8a61, 0xcf797d24, 0x69b1026c, 0xcf714c91, - 0x69a778db, 0xcf691ddd, 0x699dedaf, 0xcf60f108, - 0x699460e8, 0xcf58c613, 0x698ad287, 0xcf509cfe, - 0x6981428c, 0xcf4875ca, 0x6977b0f7, 0xcf405077, - 0x696e1dc9, 0xcf382d05, 0x69648902, 0xcf300b74, - 0x695af2a3, 0xcf27ebc5, 0x69515aab, 0xcf1fcdf8, - 0x6947c11c, 0xcf17b20d, 0x693e25f5, 0xcf0f9805, - 0x69348937, 0xcf077fe1, 0x692aeae3, 0xceff699f, - 0x69214af8, 0xcef75541, 0x6917a977, 0xceef42c7, - 0x690e0661, 0xcee73231, 0x690461b5, 0xcedf2380, - 0x68fabb75, 0xced716b4, 0x68f113a0, 0xcecf0bcd, - 0x68e76a37, 0xcec702cb, 0x68ddbf3b, 0xcebefbb0, - 0x68d412ab, 0xceb6f67a, 0x68ca6488, 0xceaef32b, - 0x68c0b4d2, 0xcea6f1c2, 0x68b7038b, 0xce9ef241, - 0x68ad50b1, 0xce96f4a7, 0x68a39c46, 0xce8ef8f4, - 0x6899e64a, 0xce86ff2a, 0x68902ebd, 0xce7f0748, - 0x688675a0, 0xce77114e, 0x687cbaf3, 0xce6f1d3d, - 0x6872feb6, 0xce672b16, 0x686940ea, 0xce5f3ad8, - 0x685f8190, 0xce574c84, 0x6855c0a6, 0xce4f6019, - 0x684bfe2f, 0xce47759a, 0x68423a2a, 0xce3f8d05, - 0x68387498, 0xce37a65b, 0x682ead78, 0xce2fc19c, - 0x6824e4cc, 0xce27dec9, 0x681b1a94, 0xce1ffde2, - 0x68114ed0, 0xce181ee8, 0x68078181, 0xce1041d9, - 0x67fdb2a7, 0xce0866b8, 0x67f3e241, 0xce008d84, - 0x67ea1052, 0xcdf8b63d, 0x67e03cd8, 0xcdf0e0e4, - 0x67d667d5, 0xcde90d79, 0x67cc9149, 0xcde13bfd, - 0x67c2b934, 0xcdd96c6f, 0x67b8df97, 0xcdd19ed0, - 0x67af0472, 0xcdc9d320, 0x67a527c4, 0xcdc20960, - 0x679b4990, 0xcdba4190, 0x679169d5, 0xcdb27bb0, - 0x67878893, 0xcdaab7c0, 0x677da5cb, 0xcda2f5c2, - 0x6773c17d, 0xcd9b35b4, 0x6769dbaa, 0xcd937798, - 0x675ff452, 0xcd8bbb6d, 0x67560b76, 0xcd840134, - 0x674c2115, 0xcd7c48ee, 0x67423530, 0xcd74929a, - 0x673847c8, 0xcd6cde39, 0x672e58dc, 0xcd652bcb, - 0x6724686e, 0xcd5d7b50, 0x671a767e, 0xcd55ccca, - 0x6710830c, 0xcd4e2037, 0x67068e18, 0xcd467599, - 0x66fc97a3, 0xcd3eccef, 0x66f29fad, 0xcd37263a, - 0x66e8a637, 0xcd2f817b, 0x66deab41, 0xcd27deb0, - 0x66d4aecb, 0xcd203ddc, 0x66cab0d6, 0xcd189efe, - 0x66c0b162, 0xcd110216, 0x66b6b070, 0xcd096725, - 0x66acadff, 0xcd01ce2b, 0x66a2aa11, 0xccfa3729, - 0x6698a4a6, 0xccf2a21d, 0x668e9dbd, 0xcceb0f0a, - 0x66849558, 0xcce37def, 0x667a8b77, 0xccdbeecc, - 0x6670801a, 0xccd461a2, 0x66667342, 0xccccd671, - 0x665c64ef, 0xccc54d3a, 0x66525521, 0xccbdc5fc, - 0x664843d9, 0xccb640b8, 0x663e3117, 0xccaebd6e, - 0x66341cdb, 0xcca73c1e, 0x662a0727, 0xcc9fbcca, - 0x661feffa, 0xcc983f70, 0x6615d754, 0xcc90c412, - 0x660bbd37, 0xcc894aaf, 0x6601a1a2, 0xcc81d349, - 0x65f78497, 0xcc7a5dde, 0x65ed6614, 0xcc72ea70, - 0x65e3461b, 0xcc6b78ff, 0x65d924ac, 0xcc64098b, - 0x65cf01c8, 0xcc5c9c14, 0x65c4dd6e, 0xcc55309b, - 0x65bab7a0, 0xcc4dc720, 0x65b0905d, 0xcc465fa3, - 0x65a667a7, 0xcc3efa25, 0x659c3d7c, 0xcc3796a5, - 0x659211df, 0xcc303524, 0x6587e4cf, 0xcc28d5a3, - 0x657db64c, 0xcc217822, 0x65738657, 0xcc1a1ca0, - 0x656954f1, 0xcc12c31f, 0x655f2219, 0xcc0b6b9e, - 0x6554edd1, 0xcc04161e, 0x654ab818, 0xcbfcc29f, - 0x654080ef, 0xcbf57121, 0x65364857, 0xcbee21a5, - 0x652c0e4f, 0xcbe6d42b, 0x6521d2d8, 0xcbdf88b3, - 0x651795f3, 0xcbd83f3d, 0x650d57a0, 0xcbd0f7ca, - 0x650317df, 0xcbc9b25a, 0x64f8d6b0, 0xcbc26eee, - 0x64ee9415, 0xcbbb2d85, 0x64e4500e, 0xcbb3ee20, - 0x64da0a9a, 0xcbacb0bf, 0x64cfc3ba, 0xcba57563, - 0x64c57b6f, 0xcb9e3c0b, 0x64bb31ba, 0xcb9704b9, - 0x64b0e699, 0xcb8fcf6b, 0x64a69a0f, 0xcb889c23, - 0x649c4c1b, 0xcb816ae1, 0x6491fcbe, 0xcb7a3ba5, - 0x6487abf7, 0xcb730e70, 0x647d59c8, 0xcb6be341, - 0x64730631, 0xcb64ba19, 0x6468b132, 0xcb5d92f8, - 0x645e5acc, 0xcb566ddf, 0x645402ff, 0xcb4f4acd, - 0x6449a9cc, 0xcb4829c4, 0x643f4f32, 0xcb410ac3, - 0x6434f332, 0xcb39edca, 0x642a95ce, 0xcb32d2da, - 0x64203704, 0xcb2bb9f4, 0x6415d6d5, 0xcb24a316, - 0x640b7543, 0xcb1d8e43, 0x6401124d, 0xcb167b79, - 0x63f6adf3, 0xcb0f6aba, 0x63ec4837, 0xcb085c05, - 0x63e1e117, 0xcb014f5b, 0x63d77896, 0xcafa44bc, - 0x63cd0eb3, 0xcaf33c28, 0x63c2a36f, 0xcaec35a0, - 0x63b836ca, 0xcae53123, 0x63adc8c4, 0xcade2eb3, - 0x63a3595e, 0xcad72e4f, 0x6398e898, 0xcad02ff8, - 0x638e7673, 0xcac933ae, 0x638402ef, 0xcac23971, - 0x63798e0d, 0xcabb4141, 0x636f17cc, 0xcab44b1f, - 0x6364a02e, 0xcaad570c, 0x635a2733, 0xcaa66506, - 0x634facda, 0xca9f750f, 0x63453125, 0xca988727, - 0x633ab414, 0xca919b4e, 0x633035a7, 0xca8ab184, - 0x6325b5df, 0xca83c9ca, 0x631b34bc, 0xca7ce420, - 0x6310b23e, 0xca760086, 0x63062e67, 0xca6f1efc, - 0x62fba936, 0xca683f83, 0x62f122ab, 0xca61621b, - 0x62e69ac8, 0xca5a86c4, 0x62dc118c, 0xca53ad7e, - 0x62d186f8, 0xca4cd64b, 0x62c6fb0c, 0xca460129, - 0x62bc6dca, 0xca3f2e19, 0x62b1df30, 0xca385d1d, - 0x62a74f40, 0xca318e32, 0x629cbdfa, 0xca2ac15b, - 0x62922b5e, 0xca23f698, 0x6287976e, 0xca1d2de7, - 0x627d0228, 0xca16674b, 0x62726b8e, 0xca0fa2c3, - 0x6267d3a0, 0xca08e04f, 0x625d3a5e, 0xca021fef, - 0x62529fca, 0xc9fb61a5, 0x624803e2, 0xc9f4a570, - 0x623d66a8, 0xc9edeb50, 0x6232c81c, 0xc9e73346, - 0x6228283f, 0xc9e07d51, 0x621d8711, 0xc9d9c973, - 0x6212e492, 0xc9d317ab, 0x620840c2, 0xc9cc67fa, - 0x61fd9ba3, 0xc9c5ba60, 0x61f2f534, 0xc9bf0edd, - 0x61e84d76, 0xc9b86572, 0x61dda46a, 0xc9b1be1e, - 0x61d2fa0f, 0xc9ab18e3, 0x61c84e67, 0xc9a475bf, - 0x61bda171, 0xc99dd4b4, 0x61b2f32e, 0xc99735c2, - 0x61a8439e, 0xc99098e9, 0x619d92c2, 0xc989fe29, - 0x6192e09b, 0xc9836582, 0x61882d28, 0xc97ccef5, - 0x617d786a, 0xc9763a83, 0x6172c262, 0xc96fa82a, - 0x61680b0f, 0xc96917ec, 0x615d5273, 0xc96289c9, - 0x6152988d, 0xc95bfdc1, 0x6147dd5f, 0xc95573d4, - 0x613d20e8, 0xc94eec03, 0x61326329, 0xc948664d, - 0x6127a423, 0xc941e2b4, 0x611ce3d5, 0xc93b6137, - 0x61122240, 0xc934e1d6, 0x61075f65, 0xc92e6492, - 0x60fc9b44, 0xc927e96b, 0x60f1d5de, 0xc9217062, - 0x60e70f32, 0xc91af976, 0x60dc4742, 0xc91484a8, - 0x60d17e0d, 0xc90e11f7, 0x60c6b395, 0xc907a166, - 0x60bbe7d8, 0xc90132f2, 0x60b11ad9, 0xc8fac69e, - 0x60a64c97, 0xc8f45c68, 0x609b7d13, 0xc8edf452, - 0x6090ac4d, 0xc8e78e5b, 0x6085da46, 0xc8e12a84, - 0x607b06fe, 0xc8dac8cd, 0x60703275, 0xc8d46936, - 0x60655cac, 0xc8ce0bc0, 0x605a85a3, 0xc8c7b06b, - 0x604fad5b, 0xc8c15736, 0x6044d3d4, 0xc8bb0023, - 0x6039f90f, 0xc8b4ab32, 0x602f1d0b, 0xc8ae5862, - 0x60243fca, 0xc8a807b4, 0x6019614c, 0xc8a1b928, - 0x600e8190, 0xc89b6cbf, 0x6003a099, 0xc8952278, - 0x5ff8be65, 0xc88eda54, 0x5feddaf6, 0xc8889454, - 0x5fe2f64c, 0xc8825077, 0x5fd81067, 0xc87c0ebd, - 0x5fcd2948, 0xc875cf28, 0x5fc240ef, 0xc86f91b7, - 0x5fb7575c, 0xc869566a, 0x5fac6c91, 0xc8631d42, - 0x5fa1808c, 0xc85ce63e, 0x5f969350, 0xc856b160, - 0x5f8ba4dc, 0xc8507ea7, 0x5f80b531, 0xc84a4e14, - 0x5f75c44e, 0xc8441fa6, 0x5f6ad235, 0xc83df35f, - 0x5f5fdee6, 0xc837c93e, 0x5f54ea62, 0xc831a143, - 0x5f49f4a8, 0xc82b7b70, 0x5f3efdb9, 0xc82557c3, - 0x5f340596, 0xc81f363d, 0x5f290c3f, 0xc81916df, - 0x5f1e11b5, 0xc812f9a9, 0x5f1315f7, 0xc80cde9b, - 0x5f081907, 0xc806c5b5, 0x5efd1ae4, 0xc800aef7, - 0x5ef21b90, 0xc7fa9a62, 0x5ee71b0a, 0xc7f487f6, - 0x5edc1953, 0xc7ee77b3, 0x5ed1166b, 0xc7e8699a, - 0x5ec61254, 0xc7e25daa, 0x5ebb0d0d, 0xc7dc53e3, - 0x5eb00696, 0xc7d64c47, 0x5ea4fef0, 0xc7d046d6, - 0x5e99f61d, 0xc7ca438f, 0x5e8eec1b, 0xc7c44272, - 0x5e83e0eb, 0xc7be4381, 0x5e78d48e, 0xc7b846ba, - 0x5e6dc705, 0xc7b24c20, 0x5e62b84f, 0xc7ac53b1, - 0x5e57a86d, 0xc7a65d6e, 0x5e4c9760, 0xc7a06957, - 0x5e418528, 0xc79a776c, 0x5e3671c5, 0xc79487ae, - 0x5e2b5d38, 0xc78e9a1d, 0x5e204781, 0xc788aeb9, - 0x5e1530a1, 0xc782c582, 0x5e0a1898, 0xc77cde79, - 0x5dfeff67, 0xc776f99d, 0x5df3e50d, 0xc77116f0, - 0x5de8c98c, 0xc76b3671, 0x5dddace4, 0xc7655820, - 0x5dd28f15, 0xc75f7bfe, 0x5dc7701f, 0xc759a20a, - 0x5dbc5004, 0xc753ca46, 0x5db12ec3, 0xc74df4b1, - 0x5da60c5d, 0xc748214c, 0x5d9ae8d2, 0xc7425016, - 0x5d8fc424, 0xc73c8111, 0x5d849e51, 0xc736b43c, - 0x5d79775c, 0xc730e997, 0x5d6e4f43, 0xc72b2123, - 0x5d632608, 0xc7255ae0, 0x5d57fbaa, 0xc71f96ce, - 0x5d4cd02c, 0xc719d4ed, 0x5d41a38c, 0xc714153e, - 0x5d3675cb, 0xc70e57c0, 0x5d2b46ea, 0xc7089c75, - 0x5d2016e9, 0xc702e35c, 0x5d14e5c9, 0xc6fd2c75, - 0x5d09b389, 0xc6f777c1, 0x5cfe802b, 0xc6f1c540, - 0x5cf34baf, 0xc6ec14f2, 0x5ce81615, 0xc6e666d7, - 0x5cdcdf5e, 0xc6e0baf0, 0x5cd1a78a, 0xc6db113d, - 0x5cc66e99, 0xc6d569be, 0x5cbb348d, 0xc6cfc472, - 0x5caff965, 0xc6ca215c, 0x5ca4bd21, 0xc6c4807a, - 0x5c997fc4, 0xc6bee1cd, 0x5c8e414b, 0xc6b94554, - 0x5c8301b9, 0xc6b3ab12, 0x5c77c10e, 0xc6ae1304, - 0x5c6c7f4a, 0xc6a87d2d, 0x5c613c6d, 0xc6a2e98b, - 0x5c55f878, 0xc69d5820, 0x5c4ab36b, 0xc697c8eb, - 0x5c3f6d47, 0xc6923bec, 0x5c34260c, 0xc68cb124, - 0x5c28ddbb, 0xc6872894, 0x5c1d9454, 0xc681a23a, - 0x5c1249d8, 0xc67c1e18, 0x5c06fe46, 0xc6769c2e, - 0x5bfbb1a0, 0xc6711c7b, 0x5bf063e6, 0xc66b9f01, - 0x5be51518, 0xc66623be, 0x5bd9c537, 0xc660aab5, - 0x5bce7442, 0xc65b33e4, 0x5bc3223c, 0xc655bf4c, - 0x5bb7cf23, 0xc6504ced, 0x5bac7af9, 0xc64adcc7, - 0x5ba125bd, 0xc6456edb, 0x5b95cf71, 0xc6400329, - 0x5b8a7815, 0xc63a99b1, 0x5b7f1fa9, 0xc6353273, - 0x5b73c62d, 0xc62fcd6f, 0x5b686ba3, 0xc62a6aa6, - 0x5b5d100a, 0xc6250a18, 0x5b51b363, 0xc61fabc4, - 0x5b4655ae, 0xc61a4fac, 0x5b3af6ec, 0xc614f5cf, - 0x5b2f971e, 0xc60f9e2e, 0x5b243643, 0xc60a48c9, - 0x5b18d45c, 0xc604f5a0, 0x5b0d716a, 0xc5ffa4b3, - 0x5b020d6c, 0xc5fa5603, 0x5af6a865, 0xc5f5098f, - 0x5aeb4253, 0xc5efbf58, 0x5adfdb37, 0xc5ea775e, - 0x5ad47312, 0xc5e531a1, 0x5ac909e5, 0xc5dfee22, - 0x5abd9faf, 0xc5daace1, 0x5ab23471, 0xc5d56ddd, - 0x5aa6c82b, 0xc5d03118, 0x5a9b5adf, 0xc5caf690, - 0x5a8fec8c, 0xc5c5be47, 0x5a847d33, 0xc5c0883d, - 0x5a790cd4, 0xc5bb5472, 0x5a6d9b70, 0xc5b622e6, - 0x5a622907, 0xc5b0f399, 0x5a56b599, 0xc5abc68c, - 0x5a4b4128, 0xc5a69bbe, 0x5a3fcbb3, 0xc5a17330, - 0x5a34553b, 0xc59c4ce3, 0x5a28ddc0, 0xc59728d5, - 0x5a1d6544, 0xc5920708, 0x5a11ebc5, 0xc58ce77c, - 0x5a067145, 0xc587ca31, 0x59faf5c5, 0xc582af26, - 0x59ef7944, 0xc57d965d, 0x59e3fbc3, 0xc5787fd6, - 0x59d87d42, 0xc5736b90, 0x59ccfdc2, 0xc56e598c, - 0x59c17d44, 0xc56949ca, 0x59b5fbc8, 0xc5643c4a, - 0x59aa794d, 0xc55f310d, 0x599ef5d6, 0xc55a2812, - 0x59937161, 0xc555215a, 0x5987ebf0, 0xc5501ce5, - 0x597c6584, 0xc54b1ab4, 0x5970de1b, 0xc5461ac6, - 0x596555b8, 0xc5411d1b, 0x5959cc5a, 0xc53c21b4, - 0x594e4201, 0xc5372891, 0x5942b6af, 0xc53231b3, - 0x59372a64, 0xc52d3d18, 0x592b9d1f, 0xc5284ac3, - 0x59200ee3, 0xc5235ab2, 0x59147fae, 0xc51e6ce6, - 0x5908ef82, 0xc519815f, 0x58fd5e5f, 0xc514981d, - 0x58f1cc45, 0xc50fb121, 0x58e63935, 0xc50acc6b, - 0x58daa52f, 0xc505e9fb, 0x58cf1034, 0xc50109d0, - 0x58c37a44, 0xc4fc2bec, 0x58b7e35f, 0xc4f7504e, - 0x58ac4b87, 0xc4f276f7, 0x58a0b2bb, 0xc4ed9fe7, - 0x589518fc, 0xc4e8cb1e, 0x58897e4a, 0xc4e3f89c, - 0x587de2a7, 0xc4df2862, 0x58724611, 0xc4da5a6f, - 0x5866a88a, 0xc4d58ec3, 0x585b0a13, 0xc4d0c560, - 0x584f6aab, 0xc4cbfe45, 0x5843ca53, 0xc4c73972, - 0x5838290c, 0xc4c276e8, 0x582c86d5, 0xc4bdb6a6, - 0x5820e3b0, 0xc4b8f8ad, 0x58153f9d, 0xc4b43cfd, - 0x58099a9c, 0xc4af8397, 0x57fdf4ae, 0xc4aacc7a, - 0x57f24dd3, 0xc4a617a6, 0x57e6a60c, 0xc4a1651c, - 0x57dafd59, 0xc49cb4dd, 0x57cf53bb, 0xc49806e7, - 0x57c3a931, 0xc4935b3c, 0x57b7fdbd, 0xc48eb1db, - 0x57ac515f, 0xc48a0ac4, 0x57a0a417, 0xc48565f9, - 0x5794f5e6, 0xc480c379, 0x578946cc, 0xc47c2344, - 0x577d96ca, 0xc477855a, 0x5771e5e0, 0xc472e9bc, - 0x5766340f, 0xc46e5069, 0x575a8157, 0xc469b963, - 0x574ecdb8, 0xc46524a9, 0x57431933, 0xc460923b, - 0x573763c9, 0xc45c0219, 0x572bad7a, 0xc4577444, - 0x571ff646, 0xc452e8bc, 0x57143e2d, 0xc44e5f80, - 0x57088531, 0xc449d892, 0x56fccb51, 0xc44553f2, - 0x56f1108f, 0xc440d19e, 0x56e554ea, 0xc43c5199, - 0x56d99864, 0xc437d3e1, 0x56cddafb, 0xc4335877, - 0x56c21cb2, 0xc42edf5c, 0x56b65d88, 0xc42a688f, - 0x56aa9d7e, 0xc425f410, 0x569edc94, 0xc42181e0, - 0x56931acb, 0xc41d11ff, 0x56875823, 0xc418a46d, - 0x567b949d, 0xc414392b, 0x566fd039, 0xc40fd037, - 0x56640af7, 0xc40b6994, 0x565844d8, 0xc4070540, - 0x564c7ddd, 0xc402a33c, 0x5640b606, 0xc3fe4388, - 0x5634ed53, 0xc3f9e624, 0x562923c5, 0xc3f58b10, - 0x561d595d, 0xc3f1324e, 0x56118e1a, 0xc3ecdbdc, - 0x5605c1fd, 0xc3e887bb, 0x55f9f507, 0xc3e435ea, - 0x55ee2738, 0xc3dfe66c, 0x55e25890, 0xc3db993e, - 0x55d68911, 0xc3d74e62, 0x55cab8ba, 0xc3d305d8, - 0x55bee78c, 0xc3cebfa0, 0x55b31587, 0xc3ca7bba, - 0x55a742ac, 0xc3c63a26, 0x559b6efb, 0xc3c1fae5, - 0x558f9a76, 0xc3bdbdf6, 0x5583c51b, 0xc3b9835a, - 0x5577eeec, 0xc3b54b11, 0x556c17e9, 0xc3b1151b, - 0x55604013, 0xc3ace178, 0x5554676a, 0xc3a8b028, - 0x55488dee, 0xc3a4812c, 0x553cb3a0, 0xc3a05484, - 0x5530d881, 0xc39c2a2f, 0x5524fc90, 0xc398022f, - 0x55191fcf, 0xc393dc82, 0x550d423d, 0xc38fb92a, - 0x550163dc, 0xc38b9827, 0x54f584ac, 0xc3877978, - 0x54e9a4ac, 0xc3835d1e, 0x54ddc3de, 0xc37f4319, - 0x54d1e242, 0xc37b2b6a, 0x54c5ffd9, 0xc377160f, - 0x54ba1ca3, 0xc373030a, 0x54ae38a0, 0xc36ef25b, - 0x54a253d1, 0xc36ae401, 0x54966e36, 0xc366d7fd, - 0x548a87d1, 0xc362ce50, 0x547ea0a0, 0xc35ec6f8, - 0x5472b8a5, 0xc35ac1f7, 0x5466cfe1, 0xc356bf4d, - 0x545ae653, 0xc352bef9, 0x544efbfc, 0xc34ec0fc, - 0x544310dd, 0xc34ac556, 0x543724f5, 0xc346cc07, - 0x542b3846, 0xc342d510, 0x541f4ad1, 0xc33ee070, - 0x54135c94, 0xc33aee27, 0x54076d91, 0xc336fe37, - 0x53fb7dc9, 0xc333109e, 0x53ef8d3c, 0xc32f255e, - 0x53e39be9, 0xc32b3c75, 0x53d7a9d3, 0xc32755e5, - 0x53cbb6f8, 0xc32371ae, 0x53bfc35b, 0xc31f8fcf, - 0x53b3cefa, 0xc31bb049, 0x53a7d9d7, 0xc317d31c, - 0x539be3f2, 0xc313f848, 0x538fed4b, 0xc3101fce, - 0x5383f5e3, 0xc30c49ad, 0x5377fdbb, 0xc30875e5, - 0x536c04d2, 0xc304a477, 0x53600b2a, 0xc300d563, - 0x535410c3, 0xc2fd08a9, 0x5348159d, 0xc2f93e4a, - 0x533c19b8, 0xc2f57644, 0x53301d16, 0xc2f1b099, - 0x53241fb6, 0xc2eded49, 0x5318219a, 0xc2ea2c53, - 0x530c22c1, 0xc2e66db8, 0x5300232c, 0xc2e2b178, - 0x52f422db, 0xc2def794, 0x52e821cf, 0xc2db400a, - 0x52dc2009, 0xc2d78add, 0x52d01d89, 0xc2d3d80a, - 0x52c41a4f, 0xc2d02794, 0x52b8165b, 0xc2cc7979, - 0x52ac11af, 0xc2c8cdbb, 0x52a00c4b, 0xc2c52459, - 0x5294062f, 0xc2c17d52, 0x5287ff5b, 0xc2bdd8a9, - 0x527bf7d1, 0xc2ba365c, 0x526fef90, 0xc2b6966c, - 0x5263e699, 0xc2b2f8d8, 0x5257dced, 0xc2af5da2, - 0x524bd28c, 0xc2abc4c9, 0x523fc776, 0xc2a82e4d, - 0x5233bbac, 0xc2a49a2e, 0x5227af2e, 0xc2a1086d, - 0x521ba1fd, 0xc29d790a, 0x520f941a, 0xc299ec05, - 0x52038584, 0xc296615d, 0x51f7763c, 0xc292d914, - 0x51eb6643, 0xc28f5329, 0x51df5599, 0xc28bcf9c, - 0x51d3443f, 0xc2884e6e, 0x51c73235, 0xc284cf9f, - 0x51bb1f7c, 0xc281532e, 0x51af0c13, 0xc27dd91c, - 0x51a2f7fc, 0xc27a616a, 0x5196e337, 0xc276ec16, - 0x518acdc4, 0xc2737922, 0x517eb7a4, 0xc270088e, - 0x5172a0d7, 0xc26c9a58, 0x5166895f, 0xc2692e83, - 0x515a713a, 0xc265c50e, 0x514e586a, 0xc2625df8, - 0x51423ef0, 0xc25ef943, 0x513624cb, 0xc25b96ee, - 0x512a09fc, 0xc25836f9, 0x511dee84, 0xc254d965, - 0x5111d263, 0xc2517e31, 0x5105b599, 0xc24e255e, - 0x50f99827, 0xc24aceed, 0x50ed7a0e, 0xc2477adc, - 0x50e15b4e, 0xc244292c, 0x50d53be7, 0xc240d9de, - 0x50c91bda, 0xc23d8cf1, 0x50bcfb28, 0xc23a4265, - 0x50b0d9d0, 0xc236fa3b, 0x50a4b7d3, 0xc233b473, - 0x50989532, 0xc230710d, 0x508c71ee, 0xc22d3009, - 0x50804e06, 0xc229f167, 0x5074297b, 0xc226b528, - 0x5068044e, 0xc2237b4b, 0x505bde7f, 0xc22043d0, - 0x504fb80e, 0xc21d0eb8, 0x504390fd, 0xc219dc03, - 0x5037694b, 0xc216abb1, 0x502b40f8, 0xc2137dc2, - 0x501f1807, 0xc2105236, 0x5012ee76, 0xc20d290d, - 0x5006c446, 0xc20a0248, 0x4ffa9979, 0xc206dde6, - 0x4fee6e0d, 0xc203bbe8, 0x4fe24205, 0xc2009c4e, - 0x4fd6155f, 0xc1fd7f17, 0x4fc9e81e, 0xc1fa6445, - 0x4fbdba40, 0xc1f74bd6, 0x4fb18bc8, 0xc1f435cc, - 0x4fa55cb4, 0xc1f12227, 0x4f992d06, 0xc1ee10e5, - 0x4f8cfcbe, 0xc1eb0209, 0x4f80cbdc, 0xc1e7f591, - 0x4f749a61, 0xc1e4eb7e, 0x4f68684e, 0xc1e1e3d0, - 0x4f5c35a3, 0xc1dede87, 0x4f500260, 0xc1dbdba3, - 0x4f43ce86, 0xc1d8db25, 0x4f379a16, 0xc1d5dd0c, - 0x4f2b650f, 0xc1d2e158, 0x4f1f2f73, 0xc1cfe80a, - 0x4f12f941, 0xc1ccf122, 0x4f06c27a, 0xc1c9fca0, - 0x4efa8b20, 0xc1c70a84, 0x4eee5331, 0xc1c41ace, - 0x4ee21aaf, 0xc1c12d7e, 0x4ed5e19a, 0xc1be4294, - 0x4ec9a7f3, 0xc1bb5a11, 0x4ebd6db9, 0xc1b873f5, - 0x4eb132ef, 0xc1b5903f, 0x4ea4f793, 0xc1b2aef0, - 0x4e98bba7, 0xc1afd007, 0x4e8c7f2a, 0xc1acf386, - 0x4e80421e, 0xc1aa196c, 0x4e740483, 0xc1a741b9, - 0x4e67c65a, 0xc1a46c6e, 0x4e5b87a2, 0xc1a1998a, - 0x4e4f485c, 0xc19ec90d, 0x4e430889, 0xc19bfaf9, - 0x4e36c82a, 0xc1992f4c, 0x4e2a873e, 0xc1966606, - 0x4e1e45c6, 0xc1939f29, 0x4e1203c3, 0xc190dab4, - 0x4e05c135, 0xc18e18a7, 0x4df97e1d, 0xc18b5903, - 0x4ded3a7b, 0xc1889bc6, 0x4de0f64f, 0xc185e0f3, - 0x4dd4b19a, 0xc1832888, 0x4dc86c5d, 0xc1807285, - 0x4dbc2698, 0xc17dbeec, 0x4dafe04b, 0xc17b0dbb, - 0x4da39978, 0xc1785ef4, 0x4d97521d, 0xc175b296, - 0x4d8b0a3d, 0xc17308a1, 0x4d7ec1d6, 0xc1706115, - 0x4d7278eb, 0xc16dbbf3, 0x4d662f7b, 0xc16b193a, - 0x4d59e586, 0xc16878eb, 0x4d4d9b0e, 0xc165db05, - 0x4d415013, 0xc1633f8a, 0x4d350495, 0xc160a678, - 0x4d28b894, 0xc15e0fd1, 0x4d1c6c11, 0xc15b7b94, - 0x4d101f0e, 0xc158e9c1, 0x4d03d189, 0xc1565a58, - 0x4cf78383, 0xc153cd5a, 0x4ceb34fe, 0xc15142c6, - 0x4cdee5f9, 0xc14eba9d, 0x4cd29676, 0xc14c34df, - 0x4cc64673, 0xc149b18b, 0x4cb9f5f3, 0xc14730a3, - 0x4cada4f5, 0xc144b225, 0x4ca1537a, 0xc1423613, - 0x4c950182, 0xc13fbc6c, 0x4c88af0e, 0xc13d4530, - 0x4c7c5c1e, 0xc13ad060, 0x4c7008b3, 0xc1385dfb, - 0x4c63b4ce, 0xc135ee02, 0x4c57606e, 0xc1338075, - 0x4c4b0b94, 0xc1311553, 0x4c3eb641, 0xc12eac9d, - 0x4c326075, 0xc12c4653, 0x4c260a31, 0xc129e276, - 0x4c19b374, 0xc1278104, 0x4c0d5c41, 0xc12521ff, - 0x4c010496, 0xc122c566, 0x4bf4ac75, 0xc1206b39, - 0x4be853de, 0xc11e1379, 0x4bdbfad1, 0xc11bbe26, - 0x4bcfa150, 0xc1196b3f, 0x4bc34759, 0xc1171ac6, - 0x4bb6ecef, 0xc114ccb9, 0x4baa9211, 0xc1128119, - 0x4b9e36c0, 0xc11037e6, 0x4b91dafc, 0xc10df120, - 0x4b857ec7, 0xc10bacc8, 0x4b79221f, 0xc1096add, - 0x4b6cc506, 0xc1072b5f, 0x4b60677c, 0xc104ee4f, - 0x4b540982, 0xc102b3ac, 0x4b47ab19, 0xc1007b77, - 0x4b3b4c40, 0xc0fe45b0, 0x4b2eecf8, 0xc0fc1257, - 0x4b228d42, 0xc0f9e16b, 0x4b162d1d, 0xc0f7b2ee, - 0x4b09cc8c, 0xc0f586df, 0x4afd6b8d, 0xc0f35d3e, - 0x4af10a22, 0xc0f1360b, 0x4ae4a84b, 0xc0ef1147, - 0x4ad84609, 0xc0eceef1, 0x4acbe35b, 0xc0eacf09, - 0x4abf8043, 0xc0e8b190, 0x4ab31cc1, 0xc0e69686, - 0x4aa6b8d5, 0xc0e47deb, 0x4a9a5480, 0xc0e267be, - 0x4a8defc3, 0xc0e05401, 0x4a818a9d, 0xc0de42b2, - 0x4a752510, 0xc0dc33d2, 0x4a68bf1b, 0xc0da2762, - 0x4a5c58c0, 0xc0d81d61, 0x4a4ff1fe, 0xc0d615cf, - 0x4a438ad7, 0xc0d410ad, 0x4a37234a, 0xc0d20dfa, - 0x4a2abb59, 0xc0d00db6, 0x4a1e5303, 0xc0ce0fe3, - 0x4a11ea49, 0xc0cc147f, 0x4a05812c, 0xc0ca1b8a, - 0x49f917ac, 0xc0c82506, 0x49ecadc9, 0xc0c630f2, - 0x49e04385, 0xc0c43f4d, 0x49d3d8df, 0xc0c25019, - 0x49c76dd8, 0xc0c06355, 0x49bb0271, 0xc0be7901, - 0x49ae96aa, 0xc0bc911d, 0x49a22a83, 0xc0baabaa, - 0x4995bdfd, 0xc0b8c8a7, 0x49895118, 0xc0b6e815, - 0x497ce3d5, 0xc0b509f3, 0x49707635, 0xc0b32e42, - 0x49640837, 0xc0b15502, 0x495799dd, 0xc0af7e33, - 0x494b2b27, 0xc0ada9d4, 0x493ebc14, 0xc0abd7e6, - 0x49324ca7, 0xc0aa086a, 0x4925dcdf, 0xc0a83b5e, - 0x49196cbc, 0xc0a670c4, 0x490cfc40, 0xc0a4a89b, - 0x49008b6a, 0xc0a2e2e3, 0x48f41a3c, 0xc0a11f9d, - 0x48e7a8b5, 0xc09f5ec8, 0x48db36d6, 0xc09da065, - 0x48cec4a0, 0xc09be473, 0x48c25213, 0xc09a2af3, - 0x48b5df30, 0xc09873e4, 0x48a96bf6, 0xc096bf48, - 0x489cf867, 0xc0950d1d, 0x48908483, 0xc0935d64, - 0x4884104b, 0xc091b01d, 0x48779bbe, 0xc0900548, - 0x486b26de, 0xc08e5ce5, 0x485eb1ab, 0xc08cb6f5, - 0x48523c25, 0xc08b1376, 0x4845c64d, 0xc089726a, - 0x48395024, 0xc087d3d0, 0x482cd9a9, 0xc08637a9, - 0x482062de, 0xc0849df4, 0x4813ebc2, 0xc08306b2, - 0x48077457, 0xc08171e2, 0x47fafc9c, 0xc07fdf85, - 0x47ee8493, 0xc07e4f9b, 0x47e20c3b, 0xc07cc223, - 0x47d59396, 0xc07b371e, 0x47c91aa3, 0xc079ae8c, - 0x47bca163, 0xc078286e, 0x47b027d7, 0xc076a4c2, - 0x47a3adff, 0xc0752389, 0x479733dc, 0xc073a4c3, - 0x478ab96e, 0xc0722871, 0x477e3eb5, 0xc070ae92, - 0x4771c3b3, 0xc06f3726, 0x47654867, 0xc06dc22e, - 0x4758ccd2, 0xc06c4fa8, 0x474c50f4, 0xc06adf97, - 0x473fd4cf, 0xc06971f9, 0x47335862, 0xc06806ce, - 0x4726dbae, 0xc0669e18, 0x471a5eb3, 0xc06537d4, - 0x470de172, 0xc063d405, 0x470163eb, 0xc06272aa, - 0x46f4e620, 0xc06113c2, 0x46e86810, 0xc05fb74e, - 0x46dbe9bb, 0xc05e5d4e, 0x46cf6b23, 0xc05d05c3, - 0x46c2ec48, 0xc05bb0ab, 0x46b66d29, 0xc05a5e07, - 0x46a9edc9, 0xc0590dd8, 0x469d6e27, 0xc057c01d, - 0x4690ee44, 0xc05674d6, 0x46846e1f, 0xc0552c03, - 0x4677edbb, 0xc053e5a5, 0x466b6d16, 0xc052a1bb, - 0x465eec33, 0xc0516045, 0x46526b10, 0xc0502145, - 0x4645e9af, 0xc04ee4b8, 0x46396810, 0xc04daaa1, - 0x462ce634, 0xc04c72fe, 0x4620641a, 0xc04b3dcf, - 0x4613e1c5, 0xc04a0b16, 0x46075f33, 0xc048dad1, - 0x45fadc66, 0xc047ad01, 0x45ee595d, 0xc04681a6, - 0x45e1d61b, 0xc04558c0, 0x45d5529e, 0xc044324f, - 0x45c8cee7, 0xc0430e53, 0x45bc4af8, 0xc041eccc, - 0x45afc6d0, 0xc040cdba, 0x45a3426f, 0xc03fb11d, - 0x4596bdd7, 0xc03e96f6, 0x458a3908, 0xc03d7f44, - 0x457db403, 0xc03c6a07, 0x45712ec7, 0xc03b573f, - 0x4564a955, 0xc03a46ed, 0x455823ae, 0xc0393910, - 0x454b9dd3, 0xc0382da8, 0x453f17c3, 0xc03724b6, - 0x4532917f, 0xc0361e3a, 0x45260b08, 0xc0351a33, - 0x4519845e, 0xc03418a2, 0x450cfd82, 0xc0331986, - 0x45007674, 0xc0321ce0, 0x44f3ef35, 0xc03122b0, - 0x44e767c5, 0xc0302af5, 0x44dae024, 0xc02f35b1, - 0x44ce5854, 0xc02e42e2, 0x44c1d054, 0xc02d5289, - 0x44b54825, 0xc02c64a6, 0x44a8bfc7, 0xc02b7939, - 0x449c373c, 0xc02a9042, 0x448fae83, 0xc029a9c1, - 0x4483259d, 0xc028c5b6, 0x44769c8b, 0xc027e421, - 0x446a134c, 0xc0270502, 0x445d89e2, 0xc0262859, - 0x4451004d, 0xc0254e27, 0x4444768d, 0xc024766a, - 0x4437eca4, 0xc023a124, 0x442b6290, 0xc022ce54, - 0x441ed854, 0xc021fdfb, 0x44124dee, 0xc0213018, - 0x4405c361, 0xc02064ab, 0x43f938ac, 0xc01f9bb5, - 0x43ecadcf, 0xc01ed535, 0x43e022cc, 0xc01e112b, - 0x43d397a3, 0xc01d4f99, 0x43c70c54, 0xc01c907c, - 0x43ba80df, 0xc01bd3d6, 0x43adf546, 0xc01b19a7, - 0x43a16988, 0xc01a61ee, 0x4394dda7, 0xc019acac, - 0x438851a2, 0xc018f9e1, 0x437bc57b, 0xc018498c, - 0x436f3931, 0xc0179bae, 0x4362acc5, 0xc016f047, - 0x43562038, 0xc0164757, 0x43499389, 0xc015a0dd, - 0x433d06bb, 0xc014fcda, 0x433079cc, 0xc0145b4e, - 0x4323ecbe, 0xc013bc39, 0x43175f91, 0xc0131f9b, - 0x430ad245, 0xc0128574, 0x42fe44dc, 0xc011edc3, - 0x42f1b755, 0xc011588a, 0x42e529b0, 0xc010c5c7, - 0x42d89bf0, 0xc010357c, 0x42cc0e13, 0xc00fa7a8, - 0x42bf801a, 0xc00f1c4a, 0x42b2f207, 0xc00e9364, - 0x42a663d8, 0xc00e0cf5, 0x4299d590, 0xc00d88fd, - 0x428d472e, 0xc00d077c, 0x4280b8b3, 0xc00c8872, - 0x42742a1f, 0xc00c0be0, 0x42679b73, 0xc00b91c4, - 0x425b0caf, 0xc00b1a20, 0x424e7dd4, 0xc00aa4f3, - 0x4241eee2, 0xc00a323d, 0x42355fd9, 0xc009c1ff, - 0x4228d0bb, 0xc0095438, 0x421c4188, 0xc008e8e8, - 0x420fb240, 0xc008800f, 0x420322e3, 0xc00819ae, - 0x41f69373, 0xc007b5c4, 0x41ea03ef, 0xc0075452, - 0x41dd7459, 0xc006f556, 0x41d0e4b0, 0xc00698d3, - 0x41c454f5, 0xc0063ec6, 0x41b7c528, 0xc005e731, - 0x41ab354b, 0xc0059214, 0x419ea55d, 0xc0053f6e, - 0x4192155f, 0xc004ef3f, 0x41858552, 0xc004a188, - 0x4178f536, 0xc0045648, 0x416c650b, 0xc0040d80, - 0x415fd4d2, 0xc003c72f, 0x4153448c, 0xc0038356, - 0x4146b438, 0xc00341f4, 0x413a23d8, 0xc003030a, - 0x412d936c, 0xc002c697, 0x412102f4, 0xc0028c9c, - 0x41147271, 0xc0025519, 0x4107e1e3, 0xc002200d, - 0x40fb514b, 0xc001ed78, 0x40eec0aa, 0xc001bd5c, - 0x40e22fff, 0xc0018fb6, 0x40d59f4c, 0xc0016489, - 0x40c90e90, 0xc0013bd3, 0x40bc7dcc, 0xc0011594, - 0x40afed02, 0xc000f1ce, 0x40a35c30, 0xc000d07e, - 0x4096cb58, 0xc000b1a7, 0x408a3a7b, 0xc0009547, - 0x407da998, 0xc0007b5f, 0x407118b0, 0xc00063ee, - 0x406487c4, 0xc0004ef5, 0x4057f6d4, 0xc0003c74, - 0x404b65e1, 0xc0002c6a, 0x403ed4ea, 0xc0001ed8, - 0x403243f1, 0xc00013bd, 0x4025b2f7, 0xc0000b1a, - 0x401921fb, 0xc00004ef, 0x400c90fe, 0xc000013c, -}; - -/** -* @brief Initialization function for the Q31 RFFT/RIFFT. -* @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. -* @param[in] fftLenReal length of the FFT. -* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. -* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. -* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. -* -* \par Description: -* \par -* The parameter fftLenReal Specifies length of RFFT/RIFFT Process. Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192. -* \par -* The parameter ifftFlagR controls whether a forward or inverse transform is computed. -* Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated. -* \par -* The parameter bitReverseFlag controls whether output is in normal order or bit reversed order. -* Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order. -* \par 7 -* This function also initializes Twiddle factor table. -*/ - -arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag) -{ - /* Initialise the default arm status */ - arm_status status = ARM_MATH_SUCCESS; - - /* Initialize the Real FFT length */ - S->fftLenReal = (uint16_t) fftLenReal; - - /* Initialize the Twiddle coefficientA pointer */ - S->pTwiddleAReal = (q31_t *) realCoefAQ31; - - /* Initialize the Twiddle coefficientB pointer */ - S->pTwiddleBReal = (q31_t *) realCoefBQ31; - - /* Initialize the Flag for selection of RFFT or RIFFT */ - S->ifftFlagR = (uint8_t) ifftFlagR; - - /* Initialize the Flag for calculation Bit reversal or not */ - S->bitReverseFlagR = (uint8_t) bitReverseFlag; - - /* Initialization of coef modifier depending on the FFT length */ - switch (S->fftLenReal) - { - case 8192u: - S->twidCoefRModifier = 1u; - S->pCfft = &arm_cfft_sR_q31_len4096; - break; - case 4096u: - S->twidCoefRModifier = 2u; - S->pCfft = &arm_cfft_sR_q31_len2048; - break; - case 2048u: - S->twidCoefRModifier = 4u; - S->pCfft = &arm_cfft_sR_q31_len1024; - break; - case 1024u: - S->twidCoefRModifier = 8u; - S->pCfft = &arm_cfft_sR_q31_len512; - break; - case 512u: - S->twidCoefRModifier = 16u; - S->pCfft = &arm_cfft_sR_q31_len256; - break; - case 256u: - S->twidCoefRModifier = 32u; - S->pCfft = &arm_cfft_sR_q31_len128; - break; - case 128u: - S->twidCoefRModifier = 64u; - S->pCfft = &arm_cfft_sR_q31_len64; - break; - case 64u: - S->twidCoefRModifier = 128u; - S->pCfft = &arm_cfft_sR_q31_len32; - break; - case 32u: - S->twidCoefRModifier = 256u; - S->pCfft = &arm_cfft_sR_q31_len16; - break; - default: - /* Reporting argument error if rfftSize is not valid value */ - status = ARM_MATH_ARGUMENT_ERROR; - break; - } - - /* return the status of RFFT Init function */ - return (status); -} - -/** -* @} end of RealFFT group -*/ diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c deleted file mode 100644 index 8d2e918..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c +++ /dev/null @@ -1,439 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_q15.c -* -* Description: RFFT & RIFFT Q15 process function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/*-------------------------------------------------------------------- -* Internal functions prototypes ---------------------------------------------------------------------*/ - -void arm_split_rfft_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pATable, - q15_t * pBTable, - q15_t * pDst, - uint32_t modifier); - -void arm_split_rifft_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pATable, - q15_t * pBTable, - q15_t * pDst, - uint32_t modifier); - -/** -* @addtogroup RealFFT -* @{ -*/ - -/** -* @brief Processing function for the Q15 RFFT/RIFFT. -* @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. -* @param[in] *pSrc points to the input buffer. -* @param[out] *pDst points to the output buffer. -* @return none. -* -* \par Input an output formats: -* \par -* Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. -* Hence the output format is different for different RFFT sizes. -* The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT: -* \par -* \image html RFFTQ15.gif "Input and Output Formats for Q15 RFFT" -* \par -* \image html RIFFTQ15.gif "Input and Output Formats for Q15 RIFFT" -*/ - -void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst) -{ - const arm_cfft_instance_q15 *S_CFFT = S->pCfft; - uint32_t i; - uint32_t L2 = S->fftLenReal >> 1; - - /* Calculation of RIFFT of input */ - if(S->ifftFlagR == 1u) - { - /* Real IFFT core process */ - arm_split_rifft_q15(pSrc, L2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - - /* Complex IFFT process */ - arm_cfft_q15(S_CFFT, pDst, S->ifftFlagR, S->bitReverseFlagR); - - for(i=0;ifftLenReal;i++) - { - pDst[i] = pDst[i] << 1; - } - } - else - { - /* Calculation of RFFT of input */ - - /* Complex FFT process */ - arm_cfft_q15(S_CFFT, pSrc, S->ifftFlagR, S->bitReverseFlagR); - - /* Real FFT core process */ - arm_split_rfft_q15(pSrc, L2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - } -} - -/** -* @} end of RealFFT group -*/ - -/** -* @brief Core Real FFT process -* @param *pSrc points to the input buffer. -* @param fftLen length of FFT. -* @param *pATable points to the A twiddle Coef buffer. -* @param *pBTable points to the B twiddle Coef buffer. -* @param *pDst points to the output buffer. -* @param modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -* The function implements a Real FFT -*/ - -void arm_split_rfft_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pATable, - q15_t * pBTable, - q15_t * pDst, - uint32_t modifier) -{ - uint32_t i; /* Loop Counter */ - q31_t outR, outI; /* Temporary variables for output */ - q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - q15_t *pSrc1, *pSrc2; -#ifndef ARM_MATH_CM0_FAMILY - q15_t *pD1, *pD2; -#endif - - // pSrc[2u * fftLen] = pSrc[0]; - // pSrc[(2u * fftLen) + 1u] = pSrc[1]; - - pCoefA = &pATable[modifier * 2u]; - pCoefB = &pBTable[modifier * 2u]; - - pSrc1 = &pSrc[2]; - pSrc2 = &pSrc[(2u * fftLen) - 2u]; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - i = 1u; - pD1 = pDst + 2; - pD2 = pDst + (4u * fftLen) - 2; - - for(i = fftLen - 1; i > 0; i--) - { - /* - outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] - + pSrc[2 * n - 2 * i] * pBTable[2 * i] + - pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - */ - - /* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */ - - -#ifndef ARM_MATH_BIG_ENDIAN - - /* pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] */ - outR = __SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA)); - -#else - - /* -(pSrc[2 * i + 1] * pATable[2 * i + 1] - pSrc[2 * i] * pATable[2 * i]) */ - outR = -(__SMUSD(*__SIMD32(pSrc1), *__SIMD32(pCoefA))); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* pSrc[2 * n - 2 * i] * pBTable[2 * i] + - pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */ - outR = __SMLAD(*__SIMD32(pSrc2), *__SIMD32(pCoefB), outR) >> 16u; - - /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ - -#ifndef ARM_MATH_BIG_ENDIAN - - outI = __SMUSDX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB)); - -#else - - outI = __SMUSDX(*__SIMD32(pCoefB), *__SIMD32(pSrc2)--); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] */ - outI = __SMLADX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), outI); - - /* write output */ - *pD1++ = (q15_t) outR; - *pD1++ = outI >> 16u; - - /* write complex conjugate output */ - pD2[0] = (q15_t) outR; - pD2[1] = -(outI >> 16u); - pD2 -= 2; - - /* update coefficient pointer */ - pCoefB = pCoefB + (2u * modifier); - pCoefA = pCoefA + (2u * modifier); - } - - pDst[2u * fftLen] = (pSrc[0] - pSrc[1]) >> 1; - pDst[(2u * fftLen) + 1u] = 0; - - pDst[0] = (pSrc[0] + pSrc[1]) >> 1; - pDst[1] = 0; - -#else - - /* Run the below code for Cortex-M0 */ - i = 1u; - - while(i < fftLen) - { - /* - outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] - + pSrc[2 * n - 2 * i] * pBTable[2 * i] + - pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - */ - - outR = *pSrc1 * *pCoefA; - outR = outR - (*(pSrc1 + 1) * *(pCoefA + 1)); - outR = outR + (*pSrc2 * *pCoefB); - outR = (outR + (*(pSrc2 + 1) * *(pCoefB + 1))) >> 16; - - - /* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); - */ - - outI = *pSrc2 * *(pCoefB + 1); - outI = outI - (*(pSrc2 + 1) * *pCoefB); - outI = outI + (*(pSrc1 + 1) * *pCoefA); - outI = outI + (*pSrc1 * *(pCoefA + 1)); - - /* update input pointers */ - pSrc1 += 2u; - pSrc2 -= 2u; - - /* write output */ - pDst[2u * i] = (q15_t) outR; - pDst[(2u * i) + 1u] = outI >> 16u; - - /* write complex conjugate output */ - pDst[(4u * fftLen) - (2u * i)] = (q15_t) outR; - pDst[((4u * fftLen) - (2u * i)) + 1u] = -(outI >> 16u); - - /* update coefficient pointer */ - pCoefB = pCoefB + (2u * modifier); - pCoefA = pCoefA + (2u * modifier); - - i++; - } - - pDst[2u * fftLen] = (pSrc[0] - pSrc[1]) >> 1; - pDst[(2u * fftLen) + 1u] = 0; - - pDst[0] = (pSrc[0] + pSrc[1]) >> 1; - pDst[1] = 0; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ -} - - -/** -* @brief Core Real IFFT process -* @param[in] *pSrc points to the input buffer. -* @param[in] fftLen length of FFT. -* @param[in] *pATable points to the twiddle Coef A buffer. -* @param[in] *pBTable points to the twiddle Coef B buffer. -* @param[out] *pDst points to the output buffer. -* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -* The function implements a Real IFFT -*/ -void arm_split_rifft_q15( - q15_t * pSrc, - uint32_t fftLen, - q15_t * pATable, - q15_t * pBTable, - q15_t * pDst, - uint32_t modifier) -{ - uint32_t i; /* Loop Counter */ - q31_t outR, outI; /* Temporary variables for output */ - q15_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - q15_t *pSrc1, *pSrc2; - q15_t *pDst1 = &pDst[0]; - - pCoefA = &pATable[0]; - pCoefB = &pBTable[0]; - - pSrc1 = &pSrc[0]; - pSrc2 = &pSrc[2u * fftLen]; - -#ifndef ARM_MATH_CM0_FAMILY - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - i = fftLen; - - while(i > 0u) - { - /* - outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - - outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] - - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); - */ - - -#ifndef ARM_MATH_BIG_ENDIAN - - /* pIn[2 * n - 2 * i] * pBTable[2 * i] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]) */ - outR = __SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB)); - -#else - - /* -(-pIn[2 * n - 2 * i] * pBTable[2 * i] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1])) */ - outR = -(__SMUSD(*__SIMD32(pSrc2), *__SIMD32(pCoefB))); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i] */ - outR = __SMLAD(*__SIMD32(pSrc1), *__SIMD32(pCoefA), outR) >> 16u; - - /* - -pIn[2 * n - 2 * i] * pBTable[2 * i + 1] + - pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ - outI = __SMUADX(*__SIMD32(pSrc2)--, *__SIMD32(pCoefB)); - - /* pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] */ - -#ifndef ARM_MATH_BIG_ENDIAN - - outI = __SMLSDX(*__SIMD32(pCoefA), *__SIMD32(pSrc1)++, -outI); - -#else - - outI = __SMLSDX(*__SIMD32(pSrc1)++, *__SIMD32(pCoefA), -outI); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - /* write output */ - -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst1)++ = __PKHBT(outR, (outI >> 16u), 16); - -#else - - *__SIMD32(pDst1)++ = __PKHBT((outI >> 16u), outR, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* update coefficient pointer */ - pCoefB = pCoefB + (2u * modifier); - pCoefA = pCoefA + (2u * modifier); - - i--; - } -#else - /* Run the below code for Cortex-M0 */ - i = fftLen; - - while(i > 0u) - { - /* - outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - */ - - outR = *pSrc2 * *pCoefB; - outR = outR - (*(pSrc2 + 1) * *(pCoefB + 1)); - outR = outR + (*pSrc1 * *pCoefA); - outR = (outR + (*(pSrc1 + 1) * *(pCoefA + 1))) >> 16; - - /* - outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] - - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); - */ - - outI = *(pSrc1 + 1) * *pCoefA; - outI = outI - (*pSrc1 * *(pCoefA + 1)); - outI = outI - (*pSrc2 * *(pCoefB + 1)); - outI = outI - (*(pSrc2 + 1) * *(pCoefB)); - - /* update input pointers */ - pSrc1 += 2u; - pSrc2 -= 2u; - - /* write output */ - *pDst1++ = (q15_t) outR; - *pDst1++ = (q15_t) (outI >> 16); - - /* update coefficient pointer */ - pCoefB = pCoefB + (2u * modifier); - pCoefA = pCoefA + (2u * modifier); - - i--; - } -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ -} diff --git a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c b/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c deleted file mode 100644 index 2f1cd0a..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c +++ /dev/null @@ -1,296 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_rfft_q31.c -* -* Description: RFFT & RIFFT Q31 process function -* -* -* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#include "arm_math.h" - -/*-------------------------------------------------------------------- -* Internal functions prototypes ---------------------------------------------------------------------*/ - -void arm_split_rfft_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pATable, - q31_t * pBTable, - q31_t * pDst, - uint32_t modifier); - -void arm_split_rifft_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pATable, - q31_t * pBTable, - q31_t * pDst, - uint32_t modifier); - -/** -* @addtogroup RealFFT -* @{ -*/ - -/** -* @brief Processing function for the Q31 RFFT/RIFFT. -* @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. -* @param[in] *pSrc points to the input buffer. -* @param[out] *pDst points to the output buffer. -* @return none. -* -* \par Input an output formats: -* \par -* Internally input is downscaled by 2 for every stage to avoid saturations inside CFFT/CIFFT process. -* Hence the output format is different for different RFFT sizes. -* The input and output formats for different RFFT sizes and number of bits to upscale are mentioned in the tables below for RFFT and RIFFT: -* \par -* \image html RFFTQ31.gif "Input and Output Formats for Q31 RFFT" -* -* \par -* \image html RIFFTQ31.gif "Input and Output Formats for Q31 RIFFT" -*/ -void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst) -{ - const arm_cfft_instance_q31 *S_CFFT = S->pCfft; - uint32_t i; - uint32_t L2 = S->fftLenReal >> 1; - - /* Calculation of RIFFT of input */ - if(S->ifftFlagR == 1u) - { - /* Real IFFT core process */ - arm_split_rifft_q31(pSrc, L2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - - /* Complex IFFT process */ - arm_cfft_q31(S_CFFT, pDst, S->ifftFlagR, S->bitReverseFlagR); - - for(i=0;ifftLenReal;i++) - { - pDst[i] = pDst[i] << 1; - } - } - else - { - /* Calculation of RFFT of input */ - - /* Complex FFT process */ - arm_cfft_q31(S_CFFT, pSrc, S->ifftFlagR, S->bitReverseFlagR); - - /* Real FFT core process */ - arm_split_rfft_q31(pSrc, L2, S->pTwiddleAReal, - S->pTwiddleBReal, pDst, S->twidCoefRModifier); - } -} - -/** -* @} end of RealFFT group -*/ - -/** -* @brief Core Real FFT process -* @param[in] *pSrc points to the input buffer. -* @param[in] fftLen length of FFT. -* @param[in] *pATable points to the twiddle Coef A buffer. -* @param[in] *pBTable points to the twiddle Coef B buffer. -* @param[out] *pDst points to the output buffer. -* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -*/ -void arm_split_rfft_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pATable, - q31_t * pBTable, - q31_t * pDst, - uint32_t modifier) -{ - uint32_t i; /* Loop Counter */ - q31_t outR, outI; /* Temporary variables for output */ - q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ - q31_t *pOut1 = &pDst[2], *pOut2 = &pDst[(4u * fftLen) - 1u]; - q31_t *pIn1 = &pSrc[2], *pIn2 = &pSrc[(2u * fftLen) - 1u]; - - /* Init coefficient pointers */ - pCoefA = &pATable[modifier * 2u]; - pCoefB = &pBTable[modifier * 2u]; - - i = fftLen - 1u; - - while(i > 0u) - { - /* - outR = (pSrc[2 * i] * pATable[2 * i] - pSrc[2 * i + 1] * pATable[2 * i + 1] - + pSrc[2 * n - 2 * i] * pBTable[2 * i] + - pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - */ - - /* outI = (pIn[2 * i + 1] * pATable[2 * i] + pIn[2 * i] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); */ - - CoefA1 = *pCoefA++; - CoefA2 = *pCoefA; - - /* outR = (pSrc[2 * i] * pATable[2 * i] */ - mult_32x32_keep32_R(outR, *pIn1, CoefA1); - - /* outI = pIn[2 * i] * pATable[2 * i + 1] */ - mult_32x32_keep32_R(outI, *pIn1++, CoefA2); - - /* - pSrc[2 * i + 1] * pATable[2 * i + 1] */ - multSub_32x32_keep32_R(outR, *pIn1, CoefA2); - - /* (pIn[2 * i + 1] * pATable[2 * i] */ - multAcc_32x32_keep32_R(outI, *pIn1++, CoefA1); - - /* pSrc[2 * n - 2 * i] * pBTable[2 * i] */ - multSub_32x32_keep32_R(outR, *pIn2, CoefA2); - CoefB1 = *pCoefB; - - /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */ - multSub_32x32_keep32_R(outI, *pIn2--, CoefB1); - - /* pSrc[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */ - multAcc_32x32_keep32_R(outR, *pIn2, CoefB1); - - /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ - multSub_32x32_keep32_R(outI, *pIn2--, CoefA2); - - /* write output */ - *pOut1++ = outR; - *pOut1++ = outI; - - /* write complex conjugate output */ - *pOut2-- = -outI; - *pOut2-- = outR; - - /* update coefficient pointer */ - pCoefB = pCoefB + (modifier * 2u); - pCoefA = pCoefA + ((modifier * 2u) - 1u); - - i--; - } - pDst[2u * fftLen] = (pSrc[0] - pSrc[1]) >> 1; - pDst[(2u * fftLen) + 1u] = 0; - - pDst[0] = (pSrc[0] + pSrc[1]) >> 1; - pDst[1] = 0; -} - -/** -* @brief Core Real IFFT process -* @param[in] *pSrc points to the input buffer. -* @param[in] fftLen length of FFT. -* @param[in] *pATable points to the twiddle Coef A buffer. -* @param[in] *pBTable points to the twiddle Coef B buffer. -* @param[out] *pDst points to the output buffer. -* @param[in] modifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. -* @return none. -*/ -void arm_split_rifft_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pATable, - q31_t * pBTable, - q31_t * pDst, - uint32_t modifier) -{ - q31_t outR, outI; /* Temporary variables for output */ - q31_t *pCoefA, *pCoefB; /* Temporary pointers for twiddle factors */ - q31_t CoefA1, CoefA2, CoefB1; /* Temporary variables for twiddle coefficients */ - q31_t *pIn1 = &pSrc[0], *pIn2 = &pSrc[(2u * fftLen) + 1u]; - - pCoefA = &pATable[0]; - pCoefB = &pBTable[0]; - - while(fftLen > 0u) - { - /* - outR = (pIn[2 * i] * pATable[2 * i] + pIn[2 * i + 1] * pATable[2 * i + 1] + - pIn[2 * n - 2 * i] * pBTable[2 * i] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1]); - - outI = (pIn[2 * i + 1] * pATable[2 * i] - pIn[2 * i] * pATable[2 * i + 1] - - pIn[2 * n - 2 * i] * pBTable[2 * i + 1] - - pIn[2 * n - 2 * i + 1] * pBTable[2 * i]); - */ - CoefA1 = *pCoefA++; - CoefA2 = *pCoefA; - - /* outR = (pIn[2 * i] * pATable[2 * i] */ - mult_32x32_keep32_R(outR, *pIn1, CoefA1); - - /* - pIn[2 * i] * pATable[2 * i + 1] */ - mult_32x32_keep32_R(outI, *pIn1++, -CoefA2); - - /* pIn[2 * i + 1] * pATable[2 * i + 1] */ - multAcc_32x32_keep32_R(outR, *pIn1, CoefA2); - - /* pIn[2 * i + 1] * pATable[2 * i] */ - multAcc_32x32_keep32_R(outI, *pIn1++, CoefA1); - - /* pIn[2 * n - 2 * i] * pBTable[2 * i] */ - multAcc_32x32_keep32_R(outR, *pIn2, CoefA2); - CoefB1 = *pCoefB; - - /* pIn[2 * n - 2 * i] * pBTable[2 * i + 1] */ - multSub_32x32_keep32_R(outI, *pIn2--, CoefB1); - - /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i + 1] */ - multAcc_32x32_keep32_R(outR, *pIn2, CoefB1); - - /* pIn[2 * n - 2 * i + 1] * pBTable[2 * i] */ - multAcc_32x32_keep32_R(outI, *pIn2--, CoefA2); - - /* write output */ - *pDst++ = outR; - *pDst++ = outI; - - /* update coefficient pointer */ - pCoefB = pCoefB + (modifier * 2u); - pCoefA = pCoefA + ((modifier * 2u) - 1u); - - /* Decrement loop count */ - fftLen--; - } -} diff --git a/system/Drivers/CMSIS/DSP_Lib/license.txt b/system/Drivers/CMSIS/DSP_Lib/license.txt deleted file mode 100644 index bb4a58f..0000000 --- a/system/Drivers/CMSIS/DSP_Lib/license.txt +++ /dev/null @@ -1,28 +0,0 @@ -All files contained in the folders "CMSIS\DSP-Lib\Source" and "CMSIS\DSP-Lib\Examples" -are guided by the following license: - -Copyright (C) 2009-2015 ARM Limited. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xc.h b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xc.h index b1e392b..50f064d 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xc.h +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xc.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f401xc.h * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief CMSIS STM32F401xC Device Peripheral Access Layer Header File. * * This file contains: @@ -14,7 +14,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -659,12 +659,13 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x0803FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -694,7 +695,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -781,8 +784,10 @@ typedef struct #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -842,6 +847,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1389,6 +1395,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2343,6 +2353,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -3911,6 +3924,11 @@ typedef struct #define RCC_CR_PLLRDY_Pos (25U) #define RCC_CR_PLLRDY_Msk (0x1U << RCC_CR_PLLRDY_Pos) /*!< 0x02000000 */ #define RCC_CR_PLLRDY RCC_CR_PLLRDY_Msk +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLI2S_SUPPORT /*!< Support PLLI2S oscillator */ + #define RCC_CR_PLLI2SON_Pos (26U) #define RCC_CR_PLLI2SON_Msk (0x1U << RCC_CR_PLLI2SON_Pos) /*!< 0x04000000 */ #define RCC_CR_PLLI2SON RCC_CR_PLLI2SON_Msk @@ -3964,6 +3982,7 @@ typedef struct #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ + /******************** Bit definition for RCC_CFGR register ******************/ /*!< SW configuration */ #define RCC_CFGR_SW_Pos (0U) @@ -4274,9 +4293,6 @@ typedef struct #define RCC_AHB1ENR_CRCEN_Pos (12U) #define RCC_AHB1ENR_CRCEN_Msk (0x1U << RCC_AHB1ENR_CRCEN_Pos) /*!< 0x00001000 */ #define RCC_AHB1ENR_CRCEN RCC_AHB1ENR_CRCEN_Msk -#define RCC_AHB1ENR_BKPSRAMEN_Pos (18U) -#define RCC_AHB1ENR_BKPSRAMEN_Msk (0x1U << RCC_AHB1ENR_BKPSRAMEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1ENR_BKPSRAMEN RCC_AHB1ENR_BKPSRAMEN_Msk #define RCC_AHB1ENR_DMA1EN_Pos (21U) #define RCC_AHB1ENR_DMA1EN_Msk (0x1U << RCC_AHB1ENR_DMA1EN_Pos) /*!< 0x00200000 */ #define RCC_AHB1ENR_DMA1EN RCC_AHB1ENR_DMA1EN_Msk @@ -4284,12 +4300,15 @@ typedef struct #define RCC_AHB1ENR_DMA2EN_Msk (0x1U << RCC_AHB1ENR_DMA2EN_Pos) /*!< 0x00400000 */ #define RCC_AHB1ENR_DMA2EN RCC_AHB1ENR_DMA2EN_Msk /******************** Bit definition for RCC_AHB2ENR register ***************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_AHB2_SUPPORT /*!< AHB2 Bus is supported */ + #define RCC_AHB2ENR_OTGFSEN_Pos (7U) #define RCC_AHB2ENR_OTGFSEN_Msk (0x1U << RCC_AHB2ENR_OTGFSEN_Pos) /*!< 0x00000080 */ #define RCC_AHB2ENR_OTGFSEN RCC_AHB2ENR_OTGFSEN_Msk -/******************** Bit definition for RCC_AHB3ENR register ***************/ - /******************** Bit definition for RCC_APB1ENR register ***************/ #define RCC_APB1ENR_TIM2EN_Pos (0U) #define RCC_APB1ENR_TIM2EN_Msk (0x1U << RCC_APB1ENR_TIM2EN_Pos) /*!< 0x00000001 */ @@ -4391,12 +4410,6 @@ typedef struct #define RCC_AHB1LPENR_SRAM1LPEN_Pos (16U) #define RCC_AHB1LPENR_SRAM1LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM1LPEN_Pos) /*!< 0x00010000 */ #define RCC_AHB1LPENR_SRAM1LPEN RCC_AHB1LPENR_SRAM1LPEN_Msk -#define RCC_AHB1LPENR_SRAM2LPEN_Pos (17U) -#define RCC_AHB1LPENR_SRAM2LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM2LPEN_Pos) /*!< 0x00020000 */ -#define RCC_AHB1LPENR_SRAM2LPEN RCC_AHB1LPENR_SRAM2LPEN_Msk -#define RCC_AHB1LPENR_BKPSRAMLPEN_Pos (18U) -#define RCC_AHB1LPENR_BKPSRAMLPEN_Msk (0x1U << RCC_AHB1LPENR_BKPSRAMLPEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1LPENR_BKPSRAMLPEN RCC_AHB1LPENR_BKPSRAMLPEN_Msk #define RCC_AHB1LPENR_DMA1LPEN_Pos (21U) #define RCC_AHB1LPENR_DMA1LPEN_Msk (0x1U << RCC_AHB1LPENR_DMA1LPEN_Pos) /*!< 0x00200000 */ #define RCC_AHB1LPENR_DMA1LPEN RCC_AHB1LPENR_DMA1LPEN_Msk @@ -4449,9 +4462,6 @@ typedef struct #define RCC_APB1LPENR_PWRLPEN_Pos (28U) #define RCC_APB1LPENR_PWRLPEN_Msk (0x1U << RCC_APB1LPENR_PWRLPEN_Pos) /*!< 0x10000000 */ #define RCC_APB1LPENR_PWRLPEN RCC_APB1LPENR_PWRLPEN_Msk -#define RCC_APB1LPENR_DACLPEN_Pos (29U) -#define RCC_APB1LPENR_DACLPEN_Msk (0x1U << RCC_APB1LPENR_DACLPEN_Pos) /*!< 0x20000000 */ -#define RCC_APB1LPENR_DACLPEN RCC_APB1LPENR_DACLPEN_Msk /******************** Bit definition for RCC_APB2LPENR register *************/ #define RCC_APB2LPENR_TIM1LPEN_Pos (0U) @@ -4525,24 +4535,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4580,6 +4593,7 @@ typedef struct #define RCC_PLLI2SCFGR_PLLI2SR_2 (0x4U << RCC_PLLI2SCFGR_PLLI2SR_Pos) /*!< 0x40000000 */ /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4692,9 +4706,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -4747,6 +4761,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5084,9 +5101,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5125,6 +5142,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5249,6 +5269,9 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ @@ -5322,10 +5345,10 @@ typedef struct #define SDIO_CMD_ENCMDCOMPL SDIO_CMD_ENCMDCOMPL_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -659,12 +659,13 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x0807FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -694,7 +695,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -781,8 +784,10 @@ typedef struct #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -842,6 +847,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1389,6 +1395,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2343,6 +2353,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -3911,6 +3924,11 @@ typedef struct #define RCC_CR_PLLRDY_Pos (25U) #define RCC_CR_PLLRDY_Msk (0x1U << RCC_CR_PLLRDY_Pos) /*!< 0x02000000 */ #define RCC_CR_PLLRDY RCC_CR_PLLRDY_Msk +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLI2S_SUPPORT /*!< Support PLLI2S oscillator */ + #define RCC_CR_PLLI2SON_Pos (26U) #define RCC_CR_PLLI2SON_Msk (0x1U << RCC_CR_PLLI2SON_Pos) /*!< 0x04000000 */ #define RCC_CR_PLLI2SON RCC_CR_PLLI2SON_Msk @@ -3964,6 +3982,7 @@ typedef struct #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ + /******************** Bit definition for RCC_CFGR register ******************/ /*!< SW configuration */ #define RCC_CFGR_SW_Pos (0U) @@ -4274,9 +4293,6 @@ typedef struct #define RCC_AHB1ENR_CRCEN_Pos (12U) #define RCC_AHB1ENR_CRCEN_Msk (0x1U << RCC_AHB1ENR_CRCEN_Pos) /*!< 0x00001000 */ #define RCC_AHB1ENR_CRCEN RCC_AHB1ENR_CRCEN_Msk -#define RCC_AHB1ENR_BKPSRAMEN_Pos (18U) -#define RCC_AHB1ENR_BKPSRAMEN_Msk (0x1U << RCC_AHB1ENR_BKPSRAMEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1ENR_BKPSRAMEN RCC_AHB1ENR_BKPSRAMEN_Msk #define RCC_AHB1ENR_DMA1EN_Pos (21U) #define RCC_AHB1ENR_DMA1EN_Msk (0x1U << RCC_AHB1ENR_DMA1EN_Pos) /*!< 0x00200000 */ #define RCC_AHB1ENR_DMA1EN RCC_AHB1ENR_DMA1EN_Msk @@ -4284,12 +4300,15 @@ typedef struct #define RCC_AHB1ENR_DMA2EN_Msk (0x1U << RCC_AHB1ENR_DMA2EN_Pos) /*!< 0x00400000 */ #define RCC_AHB1ENR_DMA2EN RCC_AHB1ENR_DMA2EN_Msk /******************** Bit definition for RCC_AHB2ENR register ***************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_AHB2_SUPPORT /*!< AHB2 Bus is supported */ + #define RCC_AHB2ENR_OTGFSEN_Pos (7U) #define RCC_AHB2ENR_OTGFSEN_Msk (0x1U << RCC_AHB2ENR_OTGFSEN_Pos) /*!< 0x00000080 */ #define RCC_AHB2ENR_OTGFSEN RCC_AHB2ENR_OTGFSEN_Msk -/******************** Bit definition for RCC_AHB3ENR register ***************/ - /******************** Bit definition for RCC_APB1ENR register ***************/ #define RCC_APB1ENR_TIM2EN_Pos (0U) #define RCC_APB1ENR_TIM2EN_Msk (0x1U << RCC_APB1ENR_TIM2EN_Pos) /*!< 0x00000001 */ @@ -4391,12 +4410,6 @@ typedef struct #define RCC_AHB1LPENR_SRAM1LPEN_Pos (16U) #define RCC_AHB1LPENR_SRAM1LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM1LPEN_Pos) /*!< 0x00010000 */ #define RCC_AHB1LPENR_SRAM1LPEN RCC_AHB1LPENR_SRAM1LPEN_Msk -#define RCC_AHB1LPENR_SRAM2LPEN_Pos (17U) -#define RCC_AHB1LPENR_SRAM2LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM2LPEN_Pos) /*!< 0x00020000 */ -#define RCC_AHB1LPENR_SRAM2LPEN RCC_AHB1LPENR_SRAM2LPEN_Msk -#define RCC_AHB1LPENR_BKPSRAMLPEN_Pos (18U) -#define RCC_AHB1LPENR_BKPSRAMLPEN_Msk (0x1U << RCC_AHB1LPENR_BKPSRAMLPEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1LPENR_BKPSRAMLPEN RCC_AHB1LPENR_BKPSRAMLPEN_Msk #define RCC_AHB1LPENR_DMA1LPEN_Pos (21U) #define RCC_AHB1LPENR_DMA1LPEN_Msk (0x1U << RCC_AHB1LPENR_DMA1LPEN_Pos) /*!< 0x00200000 */ #define RCC_AHB1LPENR_DMA1LPEN RCC_AHB1LPENR_DMA1LPEN_Msk @@ -4449,9 +4462,6 @@ typedef struct #define RCC_APB1LPENR_PWRLPEN_Pos (28U) #define RCC_APB1LPENR_PWRLPEN_Msk (0x1U << RCC_APB1LPENR_PWRLPEN_Pos) /*!< 0x10000000 */ #define RCC_APB1LPENR_PWRLPEN RCC_APB1LPENR_PWRLPEN_Msk -#define RCC_APB1LPENR_DACLPEN_Pos (29U) -#define RCC_APB1LPENR_DACLPEN_Msk (0x1U << RCC_APB1LPENR_DACLPEN_Pos) /*!< 0x20000000 */ -#define RCC_APB1LPENR_DACLPEN RCC_APB1LPENR_DACLPEN_Msk /******************** Bit definition for RCC_APB2LPENR register *************/ #define RCC_APB2LPENR_TIM1LPEN_Pos (0U) @@ -4525,24 +4535,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4580,6 +4593,7 @@ typedef struct #define RCC_PLLI2SCFGR_PLLI2SR_2 (0x4U << RCC_PLLI2SCFGR_PLLI2SR_Pos) /*!< 0x40000000 */ /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4692,9 +4706,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -4747,6 +4761,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5084,9 +5101,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5125,6 +5142,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5249,6 +5269,9 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ @@ -5322,10 +5345,10 @@ typedef struct #define SDIO_CMD_ENCMDCOMPL SDIO_CMD_ENCMDCOMPL_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -169,6 +169,7 @@ typedef enum OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ FPU_IRQn = 81 /*!< FPU global interrupt */ } IRQn_Type; @@ -835,13 +836,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -885,7 +887,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) @@ -997,10 +1001,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) @@ -1068,6 +1074,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,6 +172,7 @@ typedef enum OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ DCMI_IRQn = 78, /*!< DCMI global interrupt */ + HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ FPU_IRQn = 81 /*!< FPU global interrupt */ } IRQn_Type; @@ -931,13 +932,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -981,7 +983,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) @@ -1099,10 +1103,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) @@ -1172,6 +1178,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -583,12 +583,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(32 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x0801FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -615,7 +616,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) #define EXTI_BASE (APB2PERIPH_BASE + 0x3C00U) @@ -682,8 +685,10 @@ typedef struct #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) #define EXTI ((EXTI_TypeDef *) EXTI_BASE) @@ -739,6 +744,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1286,6 +1292,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2421,6 +2431,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -4295,6 +4308,11 @@ typedef struct #define RCC_PLLCFGR_PLLQ_1 (0x2U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x02000000 */ #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLR_I2S_CLKSOURCE_SUPPORT /*!< Support PLLR clock as I2S clock source */ + #define RCC_PLLCFGR_PLLR_Pos (28U) #define RCC_PLLCFGR_PLLR_Msk (0x7U << RCC_PLLCFGR_PLLR_Pos) /*!< 0x70000000 */ #define RCC_PLLCFGR_PLLR RCC_PLLCFGR_PLLR_Msk @@ -4799,24 +4817,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4833,6 +4854,7 @@ typedef struct #define RCC_SSCGR_SSCGEN RCC_SSCGR_SSCGEN_Msk /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4890,6 +4912,10 @@ typedef struct /* Real-Time Clock (RTC) */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RTC_TAMPER2_SUPPORT /*!< TAMPER 2 feature support */ /******************** Bits definition for RTC_TR register *******************/ #define RTC_TR_PM_Pos (22U) #define RTC_TR_PM_Msk (0x1U << RTC_TR_PM_Pos) /*!< 0x00400000 */ @@ -4992,9 +5018,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -5047,6 +5073,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5384,9 +5413,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5425,6 +5454,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5549,15 +5581,15 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ /* Serial Peripheral Interface */ /* */ /******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) - */ -#define SPI_I2S_SUPPORT /*!< I2S support */ + /******************* Bit definition for SPI_CR1 register ********************/ #define SPI_CR1_CPHA_Pos (0U) #define SPI_CR1_CPHA_Msk (0x1U << SPI_CR1_CPHA_Pos) /*!< 0x00000001 */ @@ -6388,9 +6420,9 @@ typedef struct #define TIM_CCER_CC4NP TIM_CCER_CC4NP_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -583,12 +583,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(32 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x0801FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -615,7 +616,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) #define EXTI_BASE (APB2PERIPH_BASE + 0x3C00U) @@ -682,8 +685,10 @@ typedef struct #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) #define EXTI ((EXTI_TypeDef *) EXTI_BASE) @@ -739,6 +744,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1286,6 +1292,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2421,6 +2431,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -4295,6 +4308,11 @@ typedef struct #define RCC_PLLCFGR_PLLQ_1 (0x2U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x02000000 */ #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLR_I2S_CLKSOURCE_SUPPORT /*!< Support PLLR clock as I2S clock source */ + #define RCC_PLLCFGR_PLLR_Pos (28U) #define RCC_PLLCFGR_PLLR_Msk (0x7U << RCC_PLLCFGR_PLLR_Pos) /*!< 0x70000000 */ #define RCC_PLLCFGR_PLLR RCC_PLLCFGR_PLLR_Msk @@ -4803,24 +4821,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4837,6 +4858,7 @@ typedef struct #define RCC_SSCGR_SSCGEN RCC_SSCGR_SSCGEN_Msk /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4894,6 +4916,10 @@ typedef struct /* Real-Time Clock (RTC) */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RTC_TAMPER2_SUPPORT /*!< TAMPER 2 feature support */ /******************** Bits definition for RTC_TR register *******************/ #define RTC_TR_PM_Pos (22U) #define RTC_TR_PM_Msk (0x1U << RTC_TR_PM_Pos) /*!< 0x00400000 */ @@ -4996,9 +5022,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -5051,6 +5077,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5388,9 +5417,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5429,6 +5458,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5553,15 +5585,15 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ /* Serial Peripheral Interface */ /* */ /******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) - */ -#define SPI_I2S_SUPPORT /*!< I2S support */ + /******************* Bit definition for SPI_CR1 register ********************/ #define SPI_CR1_CPHA_Pos (0U) #define SPI_CR1_CPHA_Msk (0x1U << SPI_CR1_CPHA_Pos) /*!< 0x00000001 */ @@ -6392,9 +6424,9 @@ typedef struct #define TIM_CCER_CC4NP TIM_CCER_CC4NP_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -580,12 +580,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(32 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x0801FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -608,9 +609,10 @@ typedef struct /*!< APB2 peripherals */ #define TIM1_BASE (APB2PERIPH_BASE + 0x0000U) #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) #define EXTI_BASE (APB2PERIPH_BASE + 0x3C00U) @@ -674,9 +676,10 @@ typedef struct #define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) #define EXTI ((EXTI_TypeDef *) EXTI_BASE) @@ -731,6 +734,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1278,6 +1282,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2413,6 +2421,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -4281,6 +4292,11 @@ typedef struct #define RCC_PLLCFGR_PLLQ_1 (0x2U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x02000000 */ #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLR_I2S_CLKSOURCE_SUPPORT /*!< Support PLLR clock as I2S clock source */ + #define RCC_PLLCFGR_PLLR_Pos (28U) #define RCC_PLLCFGR_PLLR_Msk (0x7U << RCC_PLLCFGR_PLLR_Pos) /*!< 0x70000000 */ #define RCC_PLLCFGR_PLLR RCC_PLLCFGR_PLLR_Msk @@ -4755,24 +4771,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4789,6 +4808,7 @@ typedef struct #define RCC_SSCGR_SSCGEN RCC_SSCGR_SSCGEN_Msk /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4846,6 +4866,10 @@ typedef struct /* Real-Time Clock (RTC) */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RTC_TAMPER2_SUPPORT /*!< TAMPER 2 feature support */ /******************** Bits definition for RTC_TR register *******************/ #define RTC_TR_PM_Pos (22U) #define RTC_TR_PM_Msk (0x1U << RTC_TR_PM_Pos) /*!< 0x00400000 */ @@ -4948,9 +4972,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -5003,6 +5027,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5340,9 +5367,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5381,6 +5408,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5505,15 +5535,15 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ /* Serial Peripheral Interface */ /* */ /******************************************************************************/ -/* - * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) - */ -#define SPI_I2S_SUPPORT /*!< I2S support */ + /******************* Bit definition for SPI_CR1 register ********************/ #define SPI_CR1_CPHA_Pos (0U) #define SPI_CR1_CPHA_Msk (0x1U << SPI_CR1_CPHA_Pos) /*!< 0x00000001 */ @@ -6344,9 +6374,9 @@ typedef struct #define TIM_CCER_CC4NP TIM_CCER_CC4NP_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -660,12 +660,13 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x0807FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -695,7 +696,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -783,8 +786,10 @@ typedef struct #define TIM1 ((TIM_TypeDef *) TIM1_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -845,6 +850,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1392,6 +1398,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* CRC calculation unit */ @@ -2346,6 +2356,9 @@ typedef struct #define FLASH_SR_PGSERR_Pos (7U) #define FLASH_SR_PGSERR_Msk (0x1U << FLASH_SR_PGSERR_Pos) /*!< 0x00000080 */ #define FLASH_SR_PGSERR FLASH_SR_PGSERR_Msk +#define FLASH_SR_RDERR_Pos (8U) +#define FLASH_SR_RDERR_Msk (0x1U << FLASH_SR_RDERR_Pos) /*!< 0x00000100 */ +#define FLASH_SR_RDERR FLASH_SR_RDERR_Msk #define FLASH_SR_BSY_Pos (16U) #define FLASH_SR_BSY_Msk (0x1U << FLASH_SR_BSY_Pos) /*!< 0x00010000 */ #define FLASH_SR_BSY FLASH_SR_BSY_Msk @@ -3920,6 +3933,11 @@ typedef struct #define RCC_CR_PLLRDY_Pos (25U) #define RCC_CR_PLLRDY_Msk (0x1U << RCC_CR_PLLRDY_Pos) /*!< 0x02000000 */ #define RCC_CR_PLLRDY RCC_CR_PLLRDY_Msk +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_PLLI2S_SUPPORT /*!< Support PLLI2S oscillator */ + #define RCC_CR_PLLI2SON_Pos (26U) #define RCC_CR_PLLI2SON_Msk (0x1U << RCC_CR_PLLI2SON_Pos) /*!< 0x04000000 */ #define RCC_CR_PLLI2SON RCC_CR_PLLI2SON_Msk @@ -3973,6 +3991,7 @@ typedef struct #define RCC_PLLCFGR_PLLQ_2 (0x4U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x04000000 */ #define RCC_PLLCFGR_PLLQ_3 (0x8U << RCC_PLLCFGR_PLLQ_Pos) /*!< 0x08000000 */ + /******************** Bit definition for RCC_CFGR register ******************/ /*!< SW configuration */ #define RCC_CFGR_SW_Pos (0U) @@ -4286,9 +4305,6 @@ typedef struct #define RCC_AHB1ENR_CRCEN_Pos (12U) #define RCC_AHB1ENR_CRCEN_Msk (0x1U << RCC_AHB1ENR_CRCEN_Pos) /*!< 0x00001000 */ #define RCC_AHB1ENR_CRCEN RCC_AHB1ENR_CRCEN_Msk -#define RCC_AHB1ENR_BKPSRAMEN_Pos (18U) -#define RCC_AHB1ENR_BKPSRAMEN_Msk (0x1U << RCC_AHB1ENR_BKPSRAMEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1ENR_BKPSRAMEN RCC_AHB1ENR_BKPSRAMEN_Msk #define RCC_AHB1ENR_DMA1EN_Pos (21U) #define RCC_AHB1ENR_DMA1EN_Msk (0x1U << RCC_AHB1ENR_DMA1EN_Pos) /*!< 0x00200000 */ #define RCC_AHB1ENR_DMA1EN RCC_AHB1ENR_DMA1EN_Msk @@ -4296,12 +4312,15 @@ typedef struct #define RCC_AHB1ENR_DMA2EN_Msk (0x1U << RCC_AHB1ENR_DMA2EN_Pos) /*!< 0x00400000 */ #define RCC_AHB1ENR_DMA2EN RCC_AHB1ENR_DMA2EN_Msk /******************** Bit definition for RCC_AHB2ENR register ***************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define RCC_AHB2_SUPPORT /*!< AHB2 Bus is supported */ + #define RCC_AHB2ENR_OTGFSEN_Pos (7U) #define RCC_AHB2ENR_OTGFSEN_Msk (0x1U << RCC_AHB2ENR_OTGFSEN_Pos) /*!< 0x00000080 */ #define RCC_AHB2ENR_OTGFSEN RCC_AHB2ENR_OTGFSEN_Msk -/******************** Bit definition for RCC_AHB3ENR register ***************/ - /******************** Bit definition for RCC_APB1ENR register ***************/ #define RCC_APB1ENR_TIM2EN_Pos (0U) #define RCC_APB1ENR_TIM2EN_Msk (0x1U << RCC_APB1ENR_TIM2EN_Pos) /*!< 0x00000001 */ @@ -4406,12 +4425,6 @@ typedef struct #define RCC_AHB1LPENR_SRAM1LPEN_Pos (16U) #define RCC_AHB1LPENR_SRAM1LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM1LPEN_Pos) /*!< 0x00010000 */ #define RCC_AHB1LPENR_SRAM1LPEN RCC_AHB1LPENR_SRAM1LPEN_Msk -#define RCC_AHB1LPENR_SRAM2LPEN_Pos (17U) -#define RCC_AHB1LPENR_SRAM2LPEN_Msk (0x1U << RCC_AHB1LPENR_SRAM2LPEN_Pos) /*!< 0x00020000 */ -#define RCC_AHB1LPENR_SRAM2LPEN RCC_AHB1LPENR_SRAM2LPEN_Msk -#define RCC_AHB1LPENR_BKPSRAMLPEN_Pos (18U) -#define RCC_AHB1LPENR_BKPSRAMLPEN_Msk (0x1U << RCC_AHB1LPENR_BKPSRAMLPEN_Pos) /*!< 0x00040000 */ -#define RCC_AHB1LPENR_BKPSRAMLPEN RCC_AHB1LPENR_BKPSRAMLPEN_Msk #define RCC_AHB1LPENR_DMA1LPEN_Pos (21U) #define RCC_AHB1LPENR_DMA1LPEN_Msk (0x1U << RCC_AHB1LPENR_DMA1LPEN_Pos) /*!< 0x00200000 */ #define RCC_AHB1LPENR_DMA1LPEN RCC_AHB1LPENR_DMA1LPEN_Msk @@ -4464,9 +4477,6 @@ typedef struct #define RCC_APB1LPENR_PWRLPEN_Pos (28U) #define RCC_APB1LPENR_PWRLPEN_Msk (0x1U << RCC_APB1LPENR_PWRLPEN_Pos) /*!< 0x10000000 */ #define RCC_APB1LPENR_PWRLPEN RCC_APB1LPENR_PWRLPEN_Msk -#define RCC_APB1LPENR_DACLPEN_Pos (29U) -#define RCC_APB1LPENR_DACLPEN_Msk (0x1U << RCC_APB1LPENR_DACLPEN_Pos) /*!< 0x20000000 */ -#define RCC_APB1LPENR_DACLPEN RCC_APB1LPENR_DACLPEN_Msk /******************** Bit definition for RCC_APB2LPENR register *************/ #define RCC_APB2LPENR_TIM1LPEN_Pos (0U) @@ -4546,24 +4556,27 @@ typedef struct #define RCC_CSR_BORRSTF_Pos (25U) #define RCC_CSR_BORRSTF_Msk (0x1U << RCC_CSR_BORRSTF_Pos) /*!< 0x02000000 */ #define RCC_CSR_BORRSTF RCC_CSR_BORRSTF_Msk -#define RCC_CSR_PADRSTF_Pos (26U) -#define RCC_CSR_PADRSTF_Msk (0x1U << RCC_CSR_PADRSTF_Pos) /*!< 0x04000000 */ -#define RCC_CSR_PADRSTF RCC_CSR_PADRSTF_Msk +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1U << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk #define RCC_CSR_PORRSTF_Pos (27U) #define RCC_CSR_PORRSTF_Msk (0x1U << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ #define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk #define RCC_CSR_SFTRSTF_Pos (28U) #define RCC_CSR_SFTRSTF_Msk (0x1U << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ #define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk -#define RCC_CSR_WDGRSTF_Pos (29U) -#define RCC_CSR_WDGRSTF_Msk (0x1U << RCC_CSR_WDGRSTF_Pos) /*!< 0x20000000 */ -#define RCC_CSR_WDGRSTF RCC_CSR_WDGRSTF_Msk +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1U << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk #define RCC_CSR_WWDGRSTF_Pos (30U) #define RCC_CSR_WWDGRSTF_Msk (0x1U << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ #define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk #define RCC_CSR_LPWRRSTF_Pos (31U) #define RCC_CSR_LPWRRSTF_Msk (0x1U << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ -#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk +/* Legacy defines */ +#define RCC_CSR_PADRSTF RCC_CSR_PINRSTF +#define RCC_CSR_WDGRSTF RCC_CSR_IWDGRSTF /******************** Bit definition for RCC_SSCGR register *****************/ #define RCC_SSCGR_MODPER_Pos (0U) @@ -4611,6 +4624,7 @@ typedef struct #define RCC_PLLI2SCFGR_PLLI2SR_2 (0x4U << RCC_PLLI2SCFGR_PLLI2SR_Pos) /*!< 0x40000000 */ /******************** Bit definition for RCC_DCKCFGR register ***************/ + #define RCC_DCKCFGR_TIMPRE_Pos (24U) #define RCC_DCKCFGR_TIMPRE_Msk (0x1U << RCC_DCKCFGR_TIMPRE_Pos) /*!< 0x01000000 */ #define RCC_DCKCFGR_TIMPRE RCC_DCKCFGR_TIMPRE_Msk @@ -4723,9 +4737,9 @@ typedef struct #define RTC_CR_COSEL_Pos (19U) #define RTC_CR_COSEL_Msk (0x1U << RTC_CR_COSEL_Pos) /*!< 0x00080000 */ #define RTC_CR_COSEL RTC_CR_COSEL_Msk -#define RTC_CR_BCK_Pos (18U) -#define RTC_CR_BCK_Msk (0x1U << RTC_CR_BCK_Pos) /*!< 0x00040000 */ -#define RTC_CR_BCK RTC_CR_BCK_Msk +#define RTC_CR_BKP_Pos (18U) +#define RTC_CR_BKP_Msk (0x1U << RTC_CR_BKP_Pos) /*!< 0x00040000 */ +#define RTC_CR_BKP RTC_CR_BKP_Msk #define RTC_CR_SUB1H_Pos (17U) #define RTC_CR_SUB1H_Msk (0x1U << RTC_CR_SUB1H_Pos) /*!< 0x00020000 */ #define RTC_CR_SUB1H RTC_CR_SUB1H_Msk @@ -4778,6 +4792,9 @@ typedef struct #define RTC_CR_WUCKSEL_1 (0x2U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000002 */ #define RTC_CR_WUCKSEL_2 (0x4U << RTC_CR_WUCKSEL_Pos) /*!< 0x00000004 */ +/* Legacy defines */ +#define RTC_CR_BCK RTC_CR_BKP + /******************** Bits definition for RTC_ISR register ******************/ #define RTC_ISR_RECALPF_Pos (16U) #define RTC_ISR_RECALPF_Msk (0x1U << RTC_ISR_RECALPF_Pos) /*!< 0x00010000 */ @@ -5115,9 +5132,9 @@ typedef struct #define RTC_TAFCR_TSINSEL_Pos (17U) #define RTC_TAFCR_TSINSEL_Msk (0x1U << RTC_TAFCR_TSINSEL_Pos) /*!< 0x00020000 */ #define RTC_TAFCR_TSINSEL RTC_TAFCR_TSINSEL_Msk -#define RTC_TAFCR_TAMPINSEL_Pos (16U) -#define RTC_TAFCR_TAMPINSEL_Msk (0x1U << RTC_TAFCR_TAMPINSEL_Pos) /*!< 0x00010000 */ -#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMPINSEL_Msk +#define RTC_TAFCR_TAMP1INSEL_Pos (16U) +#define RTC_TAFCR_TAMP1INSEL_Msk (0x1U << RTC_TAFCR_TAMP1INSEL_Pos) /*!< 0x00010000 */ +#define RTC_TAFCR_TAMP1INSEL RTC_TAFCR_TAMP1INSEL_Msk #define RTC_TAFCR_TAMPPUDIS_Pos (15U) #define RTC_TAFCR_TAMPPUDIS_Msk (0x1U << RTC_TAFCR_TAMPPUDIS_Pos) /*!< 0x00008000 */ #define RTC_TAFCR_TAMPPUDIS RTC_TAFCR_TAMPPUDIS_Msk @@ -5156,6 +5173,9 @@ typedef struct #define RTC_TAFCR_TAMP1E_Msk (0x1U << RTC_TAFCR_TAMP1E_Pos) /*!< 0x00000001 */ #define RTC_TAFCR_TAMP1E RTC_TAFCR_TAMP1E_Msk +/* Legacy defines */ +#define RTC_TAFCR_TAMPINSEL RTC_TAFCR_TAMP1INSEL + /******************** Bits definition for RTC_ALRMASSR register *************/ #define RTC_ALRMASSR_MASKSS_Pos (24U) #define RTC_ALRMASSR_MASKSS_Msk (0xFU << RTC_ALRMASSR_MASKSS_Pos) /*!< 0x0F000000 */ @@ -5280,6 +5300,9 @@ typedef struct #define RTC_BKP19R_Msk (0xFFFFFFFFU << RTC_BKP19R_Pos) /*!< 0xFFFFFFFF */ #define RTC_BKP19R RTC_BKP19R_Msk +/******************** Number of backup registers ******************************/ +#define RTC_BKP_NUMBER 0x000000014U + /******************************************************************************/ /* */ @@ -5353,10 +5376,10 @@ typedef struct #define SDIO_CMD_ENCMDCOMPL SDIO_CMD_ENCMDCOMPL_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -815,12 +815,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(256 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -859,7 +860,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -968,8 +971,10 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1039,6 +1044,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1586,6 +1592,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -1800,21 +1810,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -861,12 +861,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(256 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -906,7 +907,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1020,8 +1023,10 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1094,6 +1099,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1641,6 +1647,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -1855,21 +1865,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -861,12 +861,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(256 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -906,7 +907,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1020,8 +1023,10 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1094,6 +1099,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1641,6 +1647,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -1855,21 +1865,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -861,12 +861,13 @@ typedef struct #define SRAM1_BB_BASE 0x22000000U /*!< SRAM1(256 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -906,7 +907,9 @@ typedef struct #define USART1_BASE (APB2PERIPH_BASE + 0x1000U) #define USART6_BASE (APB2PERIPH_BASE + 0x1400U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1020,8 +1023,10 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1094,6 +1099,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1641,6 +1647,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -1855,21 +1865,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -940,12 +940,13 @@ typedef struct #define SRAM2_BB_BASE 0x22800000U /*!< SRAM2(64 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x0817FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -994,7 +995,9 @@ typedef struct #define UART9_BASE (APB2PERIPH_BASE + 0x1800U) #define UART10_BASE (APB2PERIPH_BASE + 0x1C00U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1134,8 +1137,10 @@ typedef struct #define USART6 ((USART_TypeDef *) USART6_BASE) #define UART9 ((USART_TypeDef *) UART9_BASE) #define UART10 ((USART_TypeDef *) UART10_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1223,6 +1228,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1770,6 +1776,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -1984,21 +1994,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -906,13 +906,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -956,7 +957,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) @@ -1071,10 +1074,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) @@ -1145,6 +1150,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -1002,13 +1002,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x080FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1052,7 +1053,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800U) @@ -1173,10 +1176,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) @@ -1249,6 +1254,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -974,12 +974,13 @@ typedef struct #define SRAM2_BB_BASE 0x22800000U /*!< SRAM2(64 KB) base address in the bit-band region */ #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define FLASH_END 0x0817FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1028,7 +1029,9 @@ typedef struct #define UART9_BASE (APB2PERIPH_BASE + 0x1800U) #define UART10_BASE (APB2PERIPH_BASE + 0x1C00U) #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC1_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC1_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1169,8 +1172,10 @@ typedef struct #define USART6 ((USART_TypeDef *) USART6_BASE) #define UART9 ((USART_TypeDef *) UART9_BASE) #define UART10 ((USART_TypeDef *) UART10_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC1_COMMON ((ADC_Common_TypeDef *) ADC1_COMMON_BASE) +/* Legacy define */ +#define ADC ADC1_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1259,6 +1264,7 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ + /******************** Bit definition for ADC_SR register ********************/ #define ADC_SR_AWD_Pos (0U) #define ADC_SR_AWD_Msk (0x1U << ADC_SR_AWD_Pos) /*!< 0x00000001 */ @@ -1806,6 +1812,10 @@ typedef struct #define ADC_CDR_DATA2_Msk (0xFFFFU << ADC_CDR_DATA2_Pos) /*!< 0xFFFF0000 */ #define ADC_CDR_DATA2 ADC_CDR_DATA2_Msk /*!<2nd data of a pair of regular conversions */ +/* Legacy defines */ +#define ADC_CDR_RDATA_MST ADC_CDR_DATA1 +#define ADC_CDR_RDATA_SLV ADC_CDR_DATA2 + /******************************************************************************/ /* */ /* Controller Area Network */ @@ -2020,21 +2030,6 @@ typedef struct #define CAN_IER_SLKIE_Msk (0x1U << CAN_IER_SLKIE_Pos) /*!< 0x00020000 */ #define CAN_IER_SLKIE CAN_IER_SLKIE_Msk /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,6 +172,7 @@ typedef enum OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ DCMI_IRQn = 78, /*!< DCMI global interrupt */ + HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ FPU_IRQn = 81, /*!< FPU global interrupt */ UART7_IRQn = 82, /*!< UART7 global interrupt */ UART8_IRQn = 83, /*!< UART8 global interrupt */ @@ -1003,13 +1004,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1055,7 +1057,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1185,10 +1189,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1268,6 +1274,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,6 +172,7 @@ typedef enum OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ DCMI_IRQn = 78, /*!< DCMI global interrupt */ + HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ FPU_IRQn = 81, /*!< FPU global interrupt */ UART7_IRQn = 82, /*!< UART7 global interrupt */ UART8_IRQn = 83, /*!< UART8 global interrupt */ @@ -1053,13 +1054,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1105,7 +1107,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1238,10 +1242,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1324,6 +1330,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -1076,13 +1076,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1128,7 +1129,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1261,10 +1264,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1347,6 +1352,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -1124,13 +1124,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1176,7 +1177,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1312,10 +1315,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1401,6 +1406,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -945,12 +945,13 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x0807FFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -995,7 +996,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1114,10 +1117,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1192,6 +1197,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,6 +172,7 @@ typedef enum OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ DCMI_IRQn = 78, /*!< DCMI global interrupt */ + HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ FPU_IRQn = 81, /*!< FPU global interrupt */ UART7_IRQn = 82, /*!< UART7 global interrupt */ UART8_IRQn = 83, /*!< UART8 global interrupt */ @@ -1143,13 +1144,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1195,7 +1197,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1328,10 +1332,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1415,6 +1421,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -1214,13 +1214,14 @@ typedef struct #define PERIPH_BB_BASE 0x42000000U /*!< Peripheral base address in the bit-band region */ #define BKPSRAM_BB_BASE 0x42480000U /*!< Backup SRAM(4 KB) base address in the bit-band region */ #define FLASH_END 0x081FFFFFU /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800U /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FU /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ #define CCMDATARAM_END 0x1000FFFFU /*!< CCM data RAM end address */ /* Legacy defines */ #define SRAM_BASE SRAM1_BASE #define SRAM_BB_BASE SRAM1_BB_BASE - /*!< Peripheral memory map */ #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000U) @@ -1266,7 +1267,9 @@ typedef struct #define ADC1_BASE (APB2PERIPH_BASE + 0x2000U) #define ADC2_BASE (APB2PERIPH_BASE + 0x2100U) #define ADC3_BASE (APB2PERIPH_BASE + 0x2200U) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300U) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300U) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE #define SDIO_BASE (APB2PERIPH_BASE + 0x2C00U) #define SPI1_BASE (APB2PERIPH_BASE + 0x3000U) #define SPI4_BASE (APB2PERIPH_BASE + 0x3400U) @@ -1402,10 +1405,12 @@ typedef struct #define TIM8 ((TIM_TypeDef *) TIM8_BASE) #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) #define ADC2 ((ADC_TypeDef *) ADC2_BASE) #define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON #define SDIO ((SDIO_TypeDef *) SDIO_BASE) #define SPI1 ((SPI_TypeDef *) SPI1_BASE) #define SPI4 ((SPI_TypeDef *) SPI4_BASE) @@ -1492,6 +1497,11 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -124,11 +124,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS version number V2.6.0 + * @brief CMSIS version number V2.6.1 */ #define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ #define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ -#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x00U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x01U) /*!< [15:8] sub2 version */ #define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ #define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ |(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h index b7ea9f7..0630905 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file system_stm32f4xx.h * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Release_Notes.html b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Release_Notes.html index 285f87a..66c0b51 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Release_Notes.html +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Release_Notes.html @@ -86,7 +86,7 @@

Release Notes for STM32F4xx CMSIS

-

Copyright 2016 STMicroelectronics

+

Copyright 2017 STMicroelectronics

@@ -98,7 +98,10 @@

-

Update History

V2.6.0 / 04-November-2016

      Main +

Update History

V2.6.1 / 14-February-2017

      Main +Changes
+ +
  • General updates in header files to support LL drivers
    • Align Bit naming for RCC_CSR register (ex: RCC_CSR_PADRSTF --> RCC_CSR_PINRSTF)
    • Add new defines for RCC features support:
      • RCC PLLI2S and RCC PLLSAI support
      • RCC PLLR I2S clock source and RCC PLLR system clock support
      • RCC SAI1A PLL source and RCC SAI1B PLL source support
      • RCC AHB2 support
    • Add RCC_DCKCFGR_PLLI2SDIVQ_X and  RCC_DCKCFGR_PLLSAIDIVQ_X bits definition
    • Add new defines for RCC_PLLI2SCFGR_RST_VALUE, RCC_PLLSAICFGR_RST_VALUE and RCC_PLLCFGR_RST_VALUE
    • Add new defines for RTC features support:
      • RTC Tamper 2 support
      • RTC AF2 mapping support
    • Align Bit naming for RTC_CR and RTC_TAFCR registers (ex: RTC_CR_BCK --> RTC_CR_BKP)
    • Add new define to manage RTC backup register number: RTC_BKP_NUMBER
    • Rename IS_UART_INSTANCE() macro to IS_UART_HALFDUPLEX_INSTANCE()
    • Add new defines to check LIN instance: IS_UART_LIN_INSTANCE
    • Remove USART6 instance from STM32F410Tx header file
    • Rename IS_I2S_ALL_INSTANCE_EXT() macro to IS_I2S_EXT_ALL_INSTANCEE()
    • Add IS_I2S_APB1_INSTANCE() macro to check if I2S instance mapping: API1 or APB2
    • Remove SPI_I2S_SUPPORT define for SPI I2S features support: I2S feature is available on all STM32F4xx devices
    • Add SPI_I2S_FULLDUPLEX_SUPPORT define for STM32F413xx/423xx devices
    • Align SPI_I2SCFGR bit naming: SPI_I2SCFGR_ASTRTEN bit is missing for STM32F412xx devices
    • Add new I2S_APB1_APB2_FEATURE define for STM32F4xx devices where I2S IP's are splited between RCC APB1 and APB2 interfaces
    • Add new FLASH_SR_RDERR define in FLASH_SR register
    • Add FLASH_OTP_BASE and  FLASH_OTP_END defnes to manage FLASH OPT area
    • Add bit definitions for ETH_MACDBGR register
    • Add new defines ADC1_COMMON_BASE and ADC123_COMMON_BASE to replace ADC_BASE define
    • Add new defines ADC1_COMMON and ADC123_COMMON to replace ADC define
    • Add new ADC macros: IS_ADC_COMMON_INSTANCE() and IS_ADC_MULTIMODE_MASTER_INSTANCE()
    • Add new defines for ADC multi mode features support
    • Add new ADC aliases ADC_CDR_RDATA_MST and ADC_CDR_RDATA_SLV for compatibilities with all STM32 Families
    • Update TIM CNT and ARR register mask on 32-bits
    • Add new TIM_OR_TI1_RMP define in TIM_OR register
    • Add new TIM macros to check TIM feature instance support:
      • IS_TIM_COUNTER_MODE_SELECT_INSTANCE()
      • IS_TIM_CLOCK_DIVISION_INSTANCE()
      • IS_TIM_COMMUTATION_EVENT_INSTANCE()
      • IS_TIM_OCXREF_CLEAR_INSTANCE()
      • IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE()
      • IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE()
      • IS_TIM_REPETITION_COUNTER_INSTANCE()
      • IS_TIM_ENCODER_INTERFACE_INSTANCE()
      • IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE()
      • IS_TIM_BREAK_INSTANCE()
    • CAN_IER register clean up: remove duplicated bit definitions
    • USB_OTG register: fix the wrong defined values for USB_OTG_GAHBCFG bits

V2.6.0 / 04-November-2016

      Main Changes
  • Add support of STM32F413xx and STM32F423xx devices 
    • Add "stm32f413xx.h" and "stm32f423xx.h" files
    • diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xc.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xc.s index 285563f..9b17f83 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xc.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xc.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f401xc.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F401xc devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xe.s index 35782d9..45836f8 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xe.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f401xe.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F401xe devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f405xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f405xx.s index 224f36d..f3a1129 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f405xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f405xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f405xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F405xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s index 31ceafa..8eed975 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f407xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F407xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410cx.s index c866e6f..a956ead 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410cx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410cx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Cx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410rx.s index 30065af..65fa153 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410rx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410rx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Rx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410tx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410tx.s index a586121..c105d98 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410tx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f410tx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410tx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Tx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f411xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f411xe.s index c55a8db..3f9af79 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f411xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f411xe.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f411xe.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F411xExx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412cx.s index a4654fa..f8a63d4 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412cx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412cx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Cx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412rx.s index c5dfde4..1c66663 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412rx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412rx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Rx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412vx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412vx.s index 6e19d01..8eb428c 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412vx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412vx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412vx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Vx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412zx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412zx.s index 1a69e39..1f6933c 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412zx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f412zx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412zx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Zx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f413xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f413xx.s index 851436f..540ec89 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f413xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f413xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f413xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F413xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f415xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f415xx.s index 8831eb3..273fb27 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f415xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f415xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f415xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F415xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f417xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f417xx.s index 1162d59..b28a3a1 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f417xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f417xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f417xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F417xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f423xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f423xx.s index 9c3fc10..a012a3e 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f423xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f423xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f423xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F423xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f427xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f427xx.s index d62f1bb..48458bd 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f427xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f427xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f427xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F427x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f429xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f429xx.s index 82f8ee0..f63dc30 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f429xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f429xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f429xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F429x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f437xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f437xx.s index 70679ae..468c8ae 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f437xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f437xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f437xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F437x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f439xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f439xx.s index e27ac43..956b540 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f439xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f439xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f439xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F439x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f446xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f446xx.s index 1c59d16..9a47ee6 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f446xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f446xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f446xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F446x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f469xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f469xx.s index 534207a..ee40a6e 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f469xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f469xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f469xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F469x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f479xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f479xx.s index 6f06f8e..508a9f2 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f479xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f479xx.s @@ -1,8 +1,8 @@ -;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f479xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F479x devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xc.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xc.s index b5481c0..e865888 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xc.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xc.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f401xc.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F401xCxx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xe.s index bc0f5cd..75e6ffd 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xe.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f401xe.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F401xExx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f405xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f405xx.s index 21c9189..54fc98a 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f405xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f405xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f405xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F405xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s index d3f343a..5a46476 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f407xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F407xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410cx.s index c414020..62d7ce7 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410cx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f410cx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F410Cx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410rx.s index 156524e..55cfb19 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410rx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f410rx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F410Rx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410tx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410tx.s index 4c7558a..a364059 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410tx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f410tx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f410tx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F410Tx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f411xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f411xe.s index 938d872..76ce409 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f411xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f411xe.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f411xe.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F411xExx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412cx.s index d916d79..a021400 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412cx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f412Cx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F412Cx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412rx.s index eb8f0da..2ad9622 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412rx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f412rx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F412Rx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412vx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412vx.s index bbc4c24..64d84ce 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412vx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412vx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f412vx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F412Vx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412zx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412zx.s index 8fca268..20e1273 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412zx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f412zx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f412zx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F412Zx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f413xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f413xx.s index 8622d4a..8f23e57 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f413xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f413xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f413xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F413xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f415xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f415xx.s index 681500b..fb3792b 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f415xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f415xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f415xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F415xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f417xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f417xx.s index 7ff1df0..4c16092 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f417xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f417xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f417xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F417xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f423xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f423xx.s index 9230b6a..519060b 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f423xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f423xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f413xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F413xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f427xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f427xx.s index a807cfe..7ddee11 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f427xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f427xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f427xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F427xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s index d895922..c6acd8f 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f429xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F429xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f437xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f437xx.s index f7cebf5..b205791 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f437xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f437xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f437xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F437xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f439xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f439xx.s index f5773b5..25e6a30 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f439xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f439xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f439xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F439xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f446xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f446xx.s index 2fadf91..45b0365 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f446xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f446xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f446xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F446xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f469xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f469xx.s index 5dab54a..0af7d06 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f469xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f469xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f469xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F469xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f479xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f479xx.s index 7ab908b..569fe72 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f479xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f479xx.s @@ -2,8 +2,8 @@ ****************************************************************************** * @file startup_stm32f479xx.s * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief STM32F479xx Devices vector table for GCC based toolchains. * This module performs: * - Set the initial SP @@ -16,7 +16,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xc.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xc.s index 30af9ae..79737ba 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xc.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xc.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f401xc.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F401xCxx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xe.s index a5e0614..479889b 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xe.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f401xe.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F401xExx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f405xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f405xx.s index 546e83d..d146205 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f405xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f405xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f405xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F405xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s index 92f3924..327e759 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f407xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F407xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410cx.s index fa3394f..6fa0217 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410cx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410cx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Cx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410rx.s index f823c77..ad1e309 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410rx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410rx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Rx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410tx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410tx.s index 130f9ec..efff63e 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410tx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f410tx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f410tx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F410Tx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f411xe.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f411xe.s index c13b8e6..966e470 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f411xe.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f411xe.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f411xe.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F411xExx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412cx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412cx.s index b0ac20e..cb0f5d5 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412cx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412cx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412cx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Cx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412rx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412rx.s index eea3e43..9db47cb 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412rx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412rx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412rx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Rx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412vx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412vx.s index 00a4e1b..55b9d67 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412vx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412vx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412vx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Vx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412zx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412zx.s index e124b8b..fdebeae 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412zx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f412zx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f412zx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F412Zx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f413xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f413xx.s index 6f9b92b..3de82c5 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f413xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f413xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f413xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F413xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f415xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f415xx.s index f0472b0..338271a 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f415xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f415xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f415xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F415xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f417xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f417xx.s index 21e25e3..c76a105 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f417xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f417xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f417xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F417xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f423xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f423xx.s index 8e2079c..dd9caa7 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f423xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f423xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f423xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F423xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f427xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f427xx.s index e8e78b9..7bc00ef 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f427xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f427xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f427xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F427xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f429xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f429xx.s index ed480e7..8686c5f 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f429xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f429xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f429xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F429xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f437xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f437xx.s index e2054a4..edba349 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f437xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f437xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f437xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F437xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f439xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f439xx.s index 81c365c..4625f09 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f439xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f439xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f439xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F439xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f446xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f446xx.s index b9274d5..84d3bef 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f446xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f446xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f446xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F446xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f469xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f469xx.s index 36f7720..276e49f 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f469xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f469xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f469xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F469xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f479xx.s b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f479xx.s index 72f887f..7a4c6ea 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f479xx.s +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f479xx.s @@ -1,8 +1,8 @@ -;/******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f479xx.s ;* Author : MCD Application Team -;* Version : V2.6.0 -;* Date : 04-November-2016 +;* Version : V2.6.1 +;* Date : 14-February-2017 ;* Description : STM32F479xx devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP diff --git a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c index ab23b9a..acfd44c 100644 --- a/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c +++ b/system/Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file system_stm32f4xx.c * @author MCD Application Team - * @version V2.6.0 - * @date 04-November-2016 + * @version V2.6.1 + * @date 14-February-2017 * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. * * This file provides two functions and one global variable to be called from @@ -24,7 +24,7 @@ ****************************************************************************** * @attention * - *

      © COPYRIGHT 2016 STMicroelectronics

      + *

      © COPYRIGHT 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/CMSIS/Include/arm_common_tables.h b/system/Drivers/CMSIS/Include/arm_common_tables.h deleted file mode 100644 index d5d7241..0000000 --- a/system/Drivers/CMSIS/Include/arm_common_tables.h +++ /dev/null @@ -1,136 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. October 2015 -* $Revision: V.1.4.5 a -* -* Project: CMSIS DSP Library -* Title: arm_common_tables.h -* -* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_COMMON_TABLES_H -#define _ARM_COMMON_TABLES_H - -#include "arm_math.h" - -extern const uint16_t armBitRevTable[1024]; -extern const q15_t armRecipTableQ15[64]; -extern const q31_t armRecipTableQ31[64]; -/* extern const q31_t realCoefAQ31[1024]; */ -/* extern const q31_t realCoefBQ31[1024]; */ -extern const float32_t twiddleCoef_16[32]; -extern const float32_t twiddleCoef_32[64]; -extern const float32_t twiddleCoef_64[128]; -extern const float32_t twiddleCoef_128[256]; -extern const float32_t twiddleCoef_256[512]; -extern const float32_t twiddleCoef_512[1024]; -extern const float32_t twiddleCoef_1024[2048]; -extern const float32_t twiddleCoef_2048[4096]; -extern const float32_t twiddleCoef_4096[8192]; -#define twiddleCoef twiddleCoef_4096 -extern const q31_t twiddleCoef_16_q31[24]; -extern const q31_t twiddleCoef_32_q31[48]; -extern const q31_t twiddleCoef_64_q31[96]; -extern const q31_t twiddleCoef_128_q31[192]; -extern const q31_t twiddleCoef_256_q31[384]; -extern const q31_t twiddleCoef_512_q31[768]; -extern const q31_t twiddleCoef_1024_q31[1536]; -extern const q31_t twiddleCoef_2048_q31[3072]; -extern const q31_t twiddleCoef_4096_q31[6144]; -extern const q15_t twiddleCoef_16_q15[24]; -extern const q15_t twiddleCoef_32_q15[48]; -extern const q15_t twiddleCoef_64_q15[96]; -extern const q15_t twiddleCoef_128_q15[192]; -extern const q15_t twiddleCoef_256_q15[384]; -extern const q15_t twiddleCoef_512_q15[768]; -extern const q15_t twiddleCoef_1024_q15[1536]; -extern const q15_t twiddleCoef_2048_q15[3072]; -extern const q15_t twiddleCoef_4096_q15[6144]; -extern const float32_t twiddleCoef_rfft_32[32]; -extern const float32_t twiddleCoef_rfft_64[64]; -extern const float32_t twiddleCoef_rfft_128[128]; -extern const float32_t twiddleCoef_rfft_256[256]; -extern const float32_t twiddleCoef_rfft_512[512]; -extern const float32_t twiddleCoef_rfft_1024[1024]; -extern const float32_t twiddleCoef_rfft_2048[2048]; -extern const float32_t twiddleCoef_rfft_4096[4096]; - - -/* floating-point bit reversal tables */ -#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 ) -#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 ) -#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 ) -#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 ) -#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 ) -#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 ) -#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800) -#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808) -#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH]; - -/* fixed-point bit reversal tables */ -#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 ) -#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 ) -#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 ) -#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 ) -#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 ) -#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 ) -#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 ) -#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) -#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; -extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; - -/* Tables for Fast Math Sine and Cosine */ -extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; -extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; -extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - -#endif /* ARM_COMMON_TABLES_H */ diff --git a/system/Drivers/CMSIS/Include/arm_const_structs.h b/system/Drivers/CMSIS/Include/arm_const_structs.h deleted file mode 100644 index 54595f5..0000000 --- a/system/Drivers/CMSIS/Include/arm_const_structs.h +++ /dev/null @@ -1,79 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2014 ARM Limited. All rights reserved. -* -* $Date: 19. March 2015 -* $Revision: V.1.4.5 -* -* Project: CMSIS DSP Library -* Title: arm_const_structs.h -* -* Description: This file has constant structs that are initialized for -* user convenience. For example, some can be given as -* arguments to the arm_cfft_f32() function. -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_CONST_STRUCTS_H -#define _ARM_CONST_STRUCTS_H - -#include "arm_math.h" -#include "arm_common_tables.h" - - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; - - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; - - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; - -#endif diff --git a/system/Drivers/CMSIS/Include/arm_math.h b/system/Drivers/CMSIS/Include/arm_math.h deleted file mode 100644 index 580cbbd..0000000 --- a/system/Drivers/CMSIS/Include/arm_math.h +++ /dev/null @@ -1,7154 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010-2015 ARM Limited. All rights reserved. -* -* $Date: 20. October 2015 -* $Revision: V1.4.5 b -* -* Project: CMSIS DSP Library -* Title: arm_math.h -* -* Description: Public header file for CMSIS DSP Library -* -* Target Processor: Cortex-M7/Cortex-M4/Cortex-M3/Cortex-M0 -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* - Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* - Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* - Neither the name of ARM LIMITED nor the names of its contributors -* may be used to endorse or promote products derived from this -* software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. - * -------------------------------------------------------------------- */ - -/** - \mainpage CMSIS DSP Software Library - * - * Introduction - * ------------ - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M processor based devices. - * - * The library is divided into a number of functions each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filters - * - Matrix functions - * - Transforms - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - * The library has separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * Using the Library - * ------------ - * - * The library installer contains prebuilt versions of the libraries in the Lib folder. - * - arm_cortexM7lfdp_math.lib (Little endian and Double Precision Floating Point Unit on Cortex-M7) - * - arm_cortexM7bfdp_math.lib (Big endian and Double Precision Floating Point Unit on Cortex-M7) - * - arm_cortexM7lfsp_math.lib (Little endian and Single Precision Floating Point Unit on Cortex-M7) - * - arm_cortexM7bfsp_math.lib (Big endian and Single Precision Floating Point Unit on Cortex-M7) - * - arm_cortexM7l_math.lib (Little endian on Cortex-M7) - * - arm_cortexM7b_math.lib (Big endian on Cortex-M7) - * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) - * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) - * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) - * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) - * - arm_cortexM0l_math.lib (Little endian on Cortex-M0 / CortexM0+) - * - arm_cortexM0b_math.lib (Big endian on Cortex-M0 / CortexM0+) - * - * The library functions are declared in the public file arm_math.h which is placed in the Include folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file arm_math.h for Cortex-M7/M4/M3/M0/M0+ with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or ARM_MATH_CM3 or - * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. - * - * Examples - * -------- - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * Toolchain Support - * ------------ - * - * The library has been developed and tested with MDK-ARM version 5.14.0.0 - * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. - * - * Building the Library - * ------------ - * - * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the CMSIS\\DSP_Lib\\Source\\ARM folder. - * - arm_cortexM_math.uvprojx - * - * - * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above. - * - * Pre-processor Macros - * ------------ - * - * Each library project have differant pre-processor macros. - * - * - UNALIGNED_SUPPORT_DISABLE: - * - * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access - * - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * - ARM_MATH_MATRIX_CHECK: - * - * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices - * - * - ARM_MATH_ROUNDING: - * - * Define macro ARM_MATH_ROUNDING for rounding on support functions - * - * - ARM_MATH_CMx: - * - * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target - * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and - * ARM_MATH_CM7 for building the library on cortex-M7. - * - * - __FPU_PRESENT: - * - * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries - * - *
      - * CMSIS-DSP in ARM::CMSIS Pack - * ----------------------------- - * - * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: - * |File/Folder |Content | - * |------------------------------|------------------------------------------------------------------------| - * |\b CMSIS\\Documentation\\DSP | This documentation | - * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) | - * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions | - * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library | - * - *
      - * Revision History of CMSIS-DSP - * ------------ - * Please refer to \ref ChangeLog_pg. - * - * Copyright Notice - * ------------ - * - * Copyright (C) 2010-2015 ARM Limited. All rights reserved. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - *
      - *     typedef struct
      - *     {
      - *       uint16_t numRows;     // number of rows of the matrix.
      - *       uint16_t numCols;     // number of columns of the matrix.
      - *       float32_t *pData;     // points to the data of the matrix.
      - *     } arm_matrix_instance_f32;
      - * 
      - * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size numRows X numCols - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - *
      - *     pData[i*numCols + j]
      - * 
      - * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() - * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - *
      - * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
      - * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
      - * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
      - * 
      - * where nRows specifies the number of rows, nColumns - * specifies the number of columns, and pData points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - *
      - *     ARM_MATH_SIZE_MISMATCH
      - * 
      - * Otherwise the functions return - *
      - *     ARM_MATH_SUCCESS
      - * 
      - * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - *
      - *     ARM_MATH_MATRIX_CHECK
      - * 
      - * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return ARM_MATH_SUCCESS. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -/* ignore some GCC warnings */ -#if defined ( __GNUC__ ) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - -#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ - -#if defined(ARM_MATH_CM7) - #include "core_cm7.h" -#elif defined (ARM_MATH_CM4) - #include "core_cm4.h" -#elif defined (ARM_MATH_CM3) - #include "core_cm3.h" -#elif defined (ARM_MATH_CM0) - #include "core_cm0.h" - #define ARM_MATH_CM0_FAMILY -#elif defined (ARM_MATH_CM0PLUS) - #include "core_cm0plus.h" - #define ARM_MATH_CM0_FAMILY -#else - #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS or ARM_MATH_CM0" -#endif - -#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ -#include "string.h" -#include "math.h" -#ifdef __cplusplus -extern "C" -{ -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 (0x100) -#define DELTA_Q15 0x5 -#define INDEX_MASK 0x0000003F -#ifndef PI -#define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) -#define CONTROLLER_Q31_SHIFT (32 - 9) -#define TABLE_SIZE 256 -#define TABLE_SPACING_Q31 0x400000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macro for Unaligned Support - */ -#ifndef UNALIGNED_SUPPORT_DISABLE - #define ALIGN4 -#else - #if defined (__GNUC__) - #define ALIGN4 __attribute__((aligned(4))) - #else - #define ALIGN4 __align(4) - #endif -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief definition to read/write two 16 bit values. - */ -#if defined __CC_ARM - #define __SIMD32_TYPE int32_t __packed - #define CMSIS_UNUSED __attribute__((unused)) - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __SIMD32_TYPE int32_t - #define CMSIS_UNUSED __attribute__((unused)) - -#elif defined __GNUC__ - #define __SIMD32_TYPE int32_t - #define CMSIS_UNUSED __attribute__((unused)) - -#elif defined __ICCARM__ - #define __SIMD32_TYPE int32_t __packed - #define CMSIS_UNUSED - -#elif defined __CSMC__ - #define __SIMD32_TYPE int32_t - #define CMSIS_UNUSED - -#elif defined __TASKING__ - #define __SIMD32_TYPE __unaligned int32_t - #define CMSIS_UNUSED - -#else - #error Unknown compiler -#endif - -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) -#define __SIMD64(addr) (*(int64_t **) & (addr)) - -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) - /** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) -#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) - -#endif - - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) - -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - static __INLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - static __INLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - static __INLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - static __INLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - - static __INLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y))); - } - -/* - #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM ) - #define __CLZ __clz - #endif - */ -/* note: function can be removed when all toolchain support __CLZ for Cortex-M0 */ -#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ) - static __INLINE uint32_t __CLZ( - q31_t data); - - static __INLINE uint32_t __CLZ( - q31_t data) - { - uint32_t count = 0; - uint32_t mask = 0x80000000; - - while((data & mask) == 0) - { - count += 1u; - mask = mask >> 1u; - } - - return (count); - } -#endif - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. - */ - - static __INLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - q31_t * pRecipTable) - { - q31_t out; - uint32_t tempVal; - uint32_t index, i; - uint32_t signBits; - - if(in > 0) - { - signBits = ((uint32_t) (__CLZ( in) - 1)); - } - else - { - signBits = ((uint32_t) (__CLZ(-in) - 1)); - } - - /* Convert input sample to 1.31 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 24); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0u; i < 2u; i++) - { - tempVal = (uint32_t) (((q63_t) in * out) >> 31); - tempVal = 0x7FFFFFFFu - tempVal; - /* 1.31 with exp 1 */ - /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ - out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1u); - } - - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. - */ - static __INLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - q15_t * pRecipTable) - { - q15_t out = 0; - uint32_t tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if(in > 0) - { - signBits = ((uint32_t)(__CLZ( in) - 17)); - } - else - { - signBits = ((uint32_t)(__CLZ(-in) - 17)); - } - - /* Convert input sample to 1.15 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 8); - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0u; i < 2u; i++) - { - tempVal = (uint32_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFFu - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - } - - - /* - * @brief C custom defined intrinisic function for only M0 processors - */ -#if defined(ARM_MATH_CM0_FAMILY) - static __INLINE q31_t __SSAT( - q31_t x, - uint32_t y) - { - int32_t posMax, negMin; - uint32_t i; - - posMax = 1; - for (i = 0; i < (y - 1); i++) - { - posMax = posMax * 2; - } - - if(x > 0) - { - posMax = (posMax - 1); - - if(x > posMax) - { - x = posMax; - } - } - else - { - negMin = -posMax; - - if(x < negMin) - { - x = negMin; - } - } - return (x); - } -#endif /* end of ARM_MATH_CM0_FAMILY */ - - - /* - * @brief C custom defined intrinsic function for M3 and M0 processors - */ -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) - - /* - * @brief C custom defined QADD8 for M3 and M0 processors - */ - static __INLINE uint32_t __QADD8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QSUB8 for M3 and M0 processors - */ - static __INLINE uint32_t __QSUB8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - static __INLINE uint32_t __QADD16( - uint32_t x, - uint32_t y) - { -/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ - q31_t r = 0, s = 0; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHADD16 for M3 and M0 processors - */ - static __INLINE uint32_t __SHADD16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSUB16 for M3 and M0 processors - */ - static __INLINE uint32_t __QSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSUB16 for M3 and M0 processors - */ - static __INLINE uint32_t __SHSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QASX for M3 and M0 processors - */ - static __INLINE uint32_t __QASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHASX for M3 and M0 processors - */ - static __INLINE uint32_t __SHASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSAX for M3 and M0 processors - */ - static __INLINE uint32_t __QSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSAX for M3 and M0 processors - */ - static __INLINE uint32_t __SHSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SMUSDX for M3 and M0 processors - */ - static __INLINE uint32_t __SMUSDX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - /* - * @brief C custom defined SMUADX for M3 and M0 processors - */ - static __INLINE uint32_t __SMUADX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - - /* - * @brief C custom defined QADD for M3 and M0 processors - */ - static __INLINE int32_t __QADD( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); - } - - - /* - * @brief C custom defined QSUB for M3 and M0 processors - */ - static __INLINE int32_t __QSUB( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); - } - - - /* - * @brief C custom defined SMLAD for M3 and M0 processors - */ - static __INLINE uint32_t __SMLAD( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLADX for M3 and M0 processors - */ - static __INLINE uint32_t __SMLADX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLSDX for M3 and M0 processors - */ - static __INLINE uint32_t __SMLSDX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALD for M3 and M0 processors - */ - static __INLINE uint64_t __SMLALD( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALDX for M3 and M0 processors - */ - static __INLINE uint64_t __SMLALDX( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMUAD for M3 and M0 processors - */ - static __INLINE uint32_t __SMUAD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SMUSD for M3 and M0 processors - */ - static __INLINE uint32_t __SMUSD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SXTB16 for M3 and M0 processors - */ - static __INLINE uint32_t __SXTB16( - uint32_t x) - { - return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | - ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); - } - -#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] S points to an instance of the Q7 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] S points to an instance of the Q15 FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if - * numTaps is not a supported value. - */ - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] S points to an instance of the floating-point FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q15; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_casd_df1_inst_f32; - - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f64; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q31; - - - /** - * @brief Floating-point matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - - /** - * @brief Q31 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_cmplx_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_cmplx_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pScratch); - - - /** - * @brief Q31, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_cmplx_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - - /** - * @brief Q31 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - - /** - * @brief Q31 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - - /** - * @brief Q31 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix scaling. - * @param[in] pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] pDst points to the output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - - /** - * @brief Q31 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Q31 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ - void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - - /** - * @brief Q15 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ - void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ - void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#ifdef ARM_MATH_CM0_FAMILY - q15_t A1; - q15_t A2; -#else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ -#endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] S points to an instance of the q15 PID Control structure - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - -/* Deprecated */ - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_q15; - -void arm_cfft_q15( - const arm_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_q31; - -void arm_cfft_q31( - const arm_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_f32; - - void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q15; - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q31; - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct - { - arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f32 ; - -arm_status arm_rfft_fast_init_f32 ( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen); - -void arm_rfft_fast_f32( - arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - */ - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] S points to an instance of the Q31 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] S points to an instance of the Q15 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - - /** - * @brief Floating-point vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Dot product of floating-point vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - - /** - * @brief Dot product of Q7 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - - /** - * @brief Dot product of Q15 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Dot product of Q31 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q7 sequences - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_f32; - - - /** - * @brief Processing function for the floating-point FIR decimator. - * @param[in] S points to an instance of the floating-point FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR decimator. - * @param[in,out] S points to an instance of the floating-point FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q31( - arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_stereo_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f64; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_stereo_df2T_f32( - const arm_biquad_cascade_stereo_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f64( - const arm_biquad_cascade_df2T_instance_f64 * S, - float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_stereo_df2T_init_f32( - arm_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f64( - arm_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - float64_t * pCoeffs, - float64_t * pState); - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the Q15 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - */ - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_f32( - const arm_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q15( - const arm_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q31; - - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q31( - const arm_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Correlation of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Correlation of Q15 sequences - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - */ - void arm_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - - void arm_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - - void arm_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - */ - void arm_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] S points to an instance of the floating-point sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] S points to an instance of the Q31 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] S points to an instance of the Q15 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] S points to an instance of the Q7 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cos output. - */ - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - - /** - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cosine output. - */ - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * S points to an instance of the PID control data structure. in - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - *
      -   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
      -   *    A0 = Kp + Ki + Kd
      -   *    A1 = (-Kp ) - (2 * Kd )
      -   *    A2 = Kd  
      - * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - */ - static __INLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - static __INLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31u); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - - /** - * @brief Process function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - static __INLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - -#ifndef ARM_MATH_CM0_FAMILY - __SIMD32_TYPE *vstate; - - /* Implementation of PID controller */ - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - vstate = __SIMD32_CONST(S->state); - acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)*vstate, (uint64_t)acc); -#else - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; -#endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * dst); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents - * in the two-phase orthogonal stator axis Ialpha and Ibeta. - * When Ialpha is superposed with Ia as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta - * can be calculated using only Ia and Ib. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where Ia and Ib are the instantaneous stator phases and - * pIalpha and pIbeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - */ - static __INLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - } - - - /** - * @brief Clarke transform for Q31 version - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - static __INLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where pIa and pIb are the instantaneous stator phases and - * Ialpha and Ibeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate a - * @param[out] pIb points to output three-phase coordinate b - */ - static __INLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; - } - - - /** - * @brief Inverse Clarke transform for Q31 version - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate a - * @param[out] pIb points to output three-phase coordinate b - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the subtraction, hence there is no risk of overflow. - */ - static __INLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - } - - /** - * @} end of inv_clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where Ialpha and Ibeta are the stator vector components, - * pId and pIq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * The function implements the forward Park transform. - * - */ - static __INLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - } - - - /** - * @brief Park transform for Q31 version - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ - static __INLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where pIalpha and pIbeta are the stator vector components, - * Id and Iq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - */ - static __INLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - } - - - /** - * @brief Inverse Park transform for Q31 version - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - static __INLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - } - - /** - * @} end of Inverse park group - */ - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - *
      -   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
      -   *       where x0, x1 are nearest values of input x
      -   *             y0, y1 are nearest values to output y
      -   * 
      - * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * S points to an instance of the Linear Interpolate function data structure. - * x is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - static __INLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - - if(i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if((uint32_t)i >= S->nValues) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - - } - - /* returns output value */ - return (y); - } - - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - static __INLINE q31_t arm_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (q31_t)0xFFF00000) >> 20); - - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1u); - } - } - - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - static __INLINE q15_t arm_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (int32_t)0xFFF00000) >> 20); - - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (q15_t) (y >> 20); - } - } - - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - static __INLINE q7_t arm_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) - { - return (pYData[0]); - } - index = (x >> 20) & 0xfff; - - if(index >= (nValues - 1)) - { - return (pYData[nValues - 1]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (q7_t) (y >> 20); - } - } - - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - float32_t arm_sin_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q31_t arm_sin_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q15_t arm_sin_q15( - q15_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - float32_t arm_cos_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q31_t arm_cos_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q15_t arm_cos_q15( - q15_t x); - - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - *
      -   *      x1 = x0 - f(x0)/f'(x0)
      -   * 
      - * where x1 is the current estimate, - * x0 is the previous estimate, and - * f'(x0) is the derivative of f() evaluated at x0. - * For the square root function, the algorithm reduces to: - *
      -   *     x0 = in/2                         [initial guess]
      -   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
      -   * 
      - */ - - - /** - * @addtogroup SQRT - * @{ - */ - - /** - * @brief Floating-point square root function. - * @param[in] in input value. - * @param[out] pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - static __INLINE arm_status arm_sqrt_f32( - float32_t in, - float32_t * pOut) - { - if(in >= 0.0f) - { - -#if (__FPU_USED == 1) && defined ( __CC_ARM ) - *pOut = __sqrtf(in); -#elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) - *pOut = __builtin_sqrtf(in); -#elif (__FPU_USED == 1) && defined(__GNUC__) - *pOut = __builtin_sqrtf(in); -#elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000) - __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); -#else - *pOut = sqrtf(in); -#endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - } - - - /** - * @brief Q31 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. - * @param[out] pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - - - /** - * @brief Q15 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. - * @param[out] pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - - /** - * @} end of SQRT group - */ - - - /** - * @brief floating-point Circular write function. - */ - static __INLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - static __INLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (int32_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q15 Circular write function. - */ - static __INLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q15 Circular Read function. - */ - static __INLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q15_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - static __INLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q7 Circular Read function. - */ - static __INLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q7_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - - /** - * @brief Mean value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Mean value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Floating-point complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - - /** - * @brief Q31 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - - /** - * @brief Floating-point complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - */ - void arm_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[in] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function f(x, y) is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * Algorithm - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - *
      -   *   typedef struct
      -   *   {
      -   *     uint16_t numRows;
      -   *     uint16_t numCols;
      -   *     float32_t *pData;
      -   * } arm_bilinear_interp_instance_f32;
      -   * 
      - * - * \par - * where numRows specifies the number of rows in the table; - * numCols specifies the number of columns in the table; - * and pData points to an array of size numRows*numCols values. - * The data table pTable is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. - * - * \par - * Let (x, y) specify the desired interpolation point. Then define: - *
      -   *     XF = floor(x)
      -   *     YF = floor(y)
      -   * 
      - * \par - * The interpolated output point is computed as: - *
      -   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
      -   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
      -   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
      -   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
      -   * 
      - * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - - /** - * - * @brief Floating-point bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - static __INLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) - { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex - 1) * S->numCols; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex - 1) + (yIndex) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - } - - - /** - * - * @brief Q31 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - static __INLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; - x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; - y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return ((q31_t)(acc << 2)); - } - - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - static __INLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); - acc = ((q63_t) out * (0xFFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return ((q15_t)(acc >> 36)); - } - - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - static __INLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return ((q7_t)(acc >> 40)); - } - - /** - * @} end of BilinearInterpolate group - */ - - -/* SMMLAR */ -#define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMLSR */ -#define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -/* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - -/* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -/* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) - - -#if defined ( __CC_ARM ) - /* Enter low optimization region - place directly above function definition */ - #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("push") \ - _Pragma ("O1") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) - #define LOW_OPTIMIZATION_EXIT \ - _Pragma ("pop") - #else - #define LOW_OPTIMIZATION_EXIT - #endif - - /* Enter low optimization region - place directly above function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__GNUC__) - #define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") )) - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__ICCARM__) - /* Enter low optimization region - place directly above function definition */ - #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define LOW_OPTIMIZATION_EXIT - - /* Enter low optimization region - place directly above function definition */ - #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7) - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__CSMC__) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined(__TASKING__) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#endif - - -#ifdef __cplusplus -} -#endif - - -#if defined ( __GNUC__ ) -#pragma GCC diagnostic pop -#endif - -#endif /* _ARM_MATH_H */ - -/** - * - * End of file. - */ diff --git a/system/Drivers/CMSIS/Include/cmsis_armcc.h b/system/Drivers/CMSIS/Include/cmsis_armcc.h deleted file mode 100644 index f2bb66a..0000000 --- a/system/Drivers/CMSIS/Include/cmsis_armcc.h +++ /dev/null @@ -1,734 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc.h - * @brief CMSIS Cortex-M Core Function/Instruction Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifndef __CMSIS_ARMCC_H -#define __CMSIS_ARMCC_H - - -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ - - -#if (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0U); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() do {\ - __schedule_barrier();\ - __isb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() do {\ - __schedule_barrier();\ - __dsb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() do {\ - __schedule_barrier();\ - __dmb(0xF);\ - __schedule_barrier();\ - } while (0U) - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} -#endif - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} -#endif - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -#define __ROR __ror - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __breakpoint(value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#if (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) - #define __RBIT __rbit -#else -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - int32_t s = 4 /*sizeof(v)*/ * 8 - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return(result); -} -#endif - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - - -#if (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) -#else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) -#else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) -#else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) -#else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) -#else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) -#else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") -#endif - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -#ifndef __NO_EMBEDDED_ASM -__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) -{ - rrx r0, r0 - bx lr -} -#endif - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRBT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRHT(value, ptr) __strt(value, ptr) - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -#define __STRT(value, ptr) __strt(value, ptr) - -#endif /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (__CORTEX_M >= 0x04U) /* only for Cortex-M4 and above */ - -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ - ((int64_t)(ARG3) << 32U) ) >> 32U)) - -#endif /* (__CORTEX_M >= 0x04) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_H */ diff --git a/system/Drivers/CMSIS/Include/cmsis_armcc_V6.h b/system/Drivers/CMSIS/Include/cmsis_armcc_V6.h deleted file mode 100644 index d714e9b..0000000 --- a/system/Drivers/CMSIS/Include/cmsis_armcc_V6.h +++ /dev/null @@ -1,1800 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armcc_V6.h - * @brief CMSIS Cortex-M Core Function/Instruction Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifndef __CMSIS_ARMCC_V6_H -#define __CMSIS_ARMCC_V6_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get IPSR Register (non-secure) - \details Returns the content of the non-secure IPSR Register when in secure state. - \return IPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_IPSR_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get APSR Register (non-secure) - \details Returns the content of the non-secure APSR Register when in secure state. - \return APSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_APSR_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get xPSR Register (non-secure) - \details Returns the content of the non-secure xPSR Register when in secure state. - \return xPSR Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_xPSR_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : "sp"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : "sp"); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : "sp"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : "sp"); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t value) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (value) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t value) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (value) : "memory"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Base Priority with condition (non_secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_MAX_NS(uint32_t value) -{ - __ASM volatile ("MSR basepri_max_ns, %0" : : "r" (value) : "memory"); -} -#endif - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - - -#endif /* ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ - - -#if (__ARM_ARCH_8M__ == 1U) - -/** - \brief Get Process Stack Pointer Limit - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ -/** - \brief Get Process Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -} - - -#if (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - - return(result); -} - - -#if (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ -/** - \brief Get Main Stack Pointer Limit (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -} - - -#if (__ARM_FEATURE_CMSE == 3U) && (__ARM_ARCH_PROFILE == 'M') /* ToDo: ARMCC_V6: check predefined macro for mainline */ -/** - \brief Set Main Stack Pointer Limit (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -} -#endif - -#endif /* (__ARM_ARCH_8M__ == 1U) */ - - -#if ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=4 */ - -/** - \brief Get FPSCR - \details eturns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#define __get_FPSCR __builtin_arm_get_fpscr -#if 0 -__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - uint32_t result; - - __ASM volatile (""); /* Empty asm statement works as a scheduling barrier */ - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - __ASM volatile (""); - return(result); -#else - return(0); -#endif -} -#endif - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Get FPSCR (non-secure) - \details Returns the current value of the non-secure Floating Point Status/Control register when in secure state. - \return Floating Point Status/Control register value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FPSCR_NS(void) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - uint32_t result; - - __ASM volatile (""); /* Empty asm statement works as a scheduling barrier */ - __ASM volatile ("VMRS %0, fpscr_ns" : "=r" (result) ); - __ASM volatile (""); - return(result); -#else - return(0); -#endif -} -#endif - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#define __set_FPSCR __builtin_arm_set_fpscr -#if 0 -__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - __ASM volatile (""); /* Empty asm statement works as a scheduling barrier */ - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); - __ASM volatile (""); -#endif -} -#endif - -#if (__ARM_FEATURE_CMSE == 3U) -/** - \brief Set FPSCR (non-secure) - \details Assigns the given value to the non-secure Floating Point Status/Control register when in secure state. - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FPSCR_NS(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - __ASM volatile (""); /* Empty asm statement works as a scheduling barrier */ - __ASM volatile ("VMSR fpscr_ns, %0" : : "r" (fpscr) : "vfpcc"); - __ASM volatile (""); -#endif -} -#endif - -#endif /* ((__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF); - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF); - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF); - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __builtin_bswap32 - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16 __builtin_bswap16 /* ToDo: ARMCC_V6: check if __builtin_bswap16 could be used */ -#if 0 -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} -#endif - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ - /* ToDo: ARMCC_V6: check if __builtin_bswap16 could be used */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ - int32_t result; - - __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ - /* ToDo: ARMCC_V6: check if __builtin_arm_rbit is supported */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - int32_t s = 4 /*sizeof(v)*/ * 8 - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return(result); -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __builtin_clz - - -#if ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) /* ToDo: ARMCC_V6: check if this is ok for cortex >=3 */ - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -/*#define __SSAT __builtin_arm_ssat*/ -#define __SSAT(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat -#if 0 -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) -#endif - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#endif /* ((__ARM_ARCH_7M__ == 1U) || (__ARM_ARCH_7EM__ == 1U) || (__ARM_ARCH_8M__ == 1U)) */ - - -#if (__ARM_ARCH_8M__ == 1U) - -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* (__ARM_ARCH_8M__ == 1U) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (__ARM_FEATURE_DSP == 1U) /* ToDo: ARMCC_V6: This should be ARCH >= ARMv7-M + SIMD */ - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__((always_inline)) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1U) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCC_V6_H */ diff --git a/system/Drivers/CMSIS/Include/cmsis_gcc.h b/system/Drivers/CMSIS/Include/cmsis_gcc.h deleted file mode 100644 index d868f2e..0000000 --- a/system/Drivers/CMSIS/Include/cmsis_gcc.h +++ /dev/null @@ -1,1373 +0,0 @@ -/**************************************************************************//** - * @file cmsis_gcc.h - * @brief CMSIS Cortex-M Core Function/Instruction Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#ifndef __CMSIS_GCC_H -#define __CMSIS_GCC_H - -/* ignore some GCC warnings */ -#if defined ( __GNUC__ ) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i" : : : "memory"); -} - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i" : : : "memory"); -} - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - - \return xPSR Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); -} - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); -} - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (__CORTEX_M >= 0x03U) - -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f" : : : "memory"); -} - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f" : : : "memory"); -} - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); -} - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t value) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (value) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - -#endif /* (__CORTEX_M >= 0x03U) */ - - -#if (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - uint32_t result; - - /* Empty asm statement works as a scheduling barrier */ - __ASM volatile (""); - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - __ASM volatile (""); - return(result); -#else - return(0); -#endif -} - - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U) - /* Empty asm statement works as a scheduling barrier */ - __ASM volatile (""); - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); - __ASM volatile (""); -#endif -} - -#endif /* (__CORTEX_M == 0x04U) || (__CORTEX_M == 0x07U) */ - - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__attribute__((always_inline)) __STATIC_INLINE void __NOP(void) -{ - __ASM volatile ("nop"); -} - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -__attribute__((always_inline)) __STATIC_INLINE void __WFI(void) -{ - __ASM volatile ("wfi"); -} - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -__attribute__((always_inline)) __STATIC_INLINE void __WFE(void) -{ - __ASM volatile ("wfe"); -} - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -__attribute__((always_inline)) __STATIC_INLINE void __SEV(void) -{ - __ASM volatile ("sev"); -} - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -__attribute__((always_inline)) __STATIC_INLINE void __ISB(void) -{ - __ASM volatile ("isb 0xF":::"memory"); -} - - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__((always_inline)) __STATIC_INLINE void __DSB(void) -{ - __ASM volatile ("dsb 0xF":::"memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__((always_inline)) __STATIC_INLINE void __DMB(void) -{ - __ASM volatile ("dmb 0xF":::"memory"); -} - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) - return __builtin_bswap32(value); -#else - uint32_t result; - - __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) -{ -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - return (short)__builtin_bswap16(value); -#else - int32_t result; - - __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -#endif -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] value Value to rotate - \param [in] value Number of Bits to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); -#else - int32_t s = 4 /*sizeof(v)*/ * 8 - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ -#endif - return(result); -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __builtin_clz - - -#if (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); - return(result); -} - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); - return(result); -} - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void) -{ - __ASM volatile ("clrex" ::: "memory"); -} - - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr) -{ - uint32_t result; - -#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) ); -#else - /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not - accepted by assembler. So has to use following less efficient pattern. - */ - __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); -#endif - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) ); -} - -#endif /* (__CORTEX_M >= 0x03U) || (__CORTEX_SC >= 300U) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (__CORTEX_M >= 0x04U) /* only for Cortex-M4 and above */ - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - int32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) -{ - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; - -#ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); -#else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); -#endif - - return(llr.w64); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __QADD( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __QSUB( int32_t op1, int32_t op2) -{ - int32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__CORTEX_M >= 0x04) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#if defined ( __GNUC__ ) -#pragma GCC diagnostic pop -#endif - -#endif /* __CMSIS_GCC_H */ diff --git a/system/Drivers/CMSIS/Include/core_cm0.h b/system/Drivers/CMSIS/Include/core_cm0.h deleted file mode 100644 index fdee521..0000000 --- a/system/Drivers/CMSIS/Include/core_cm0.h +++ /dev/null @@ -1,798 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M0 - @{ - */ - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00U) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000U - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_cm0plus.h b/system/Drivers/CMSIS/Include/core_cm0plus.h deleted file mode 100644 index 7614450..0000000 --- a/system/Drivers/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,914 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex-M0+ - @{ - */ - -/* CMSIS CM0+ definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ - __CM0PLUS_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00U) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000U - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0U - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if (__VTOR_PRESENT == 1U) - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if (__VTOR_PRESENT == 1U) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the Cortex-M0+ header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0+ Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_cm3.h b/system/Drivers/CMSIS/Include/core_cm3.h deleted file mode 100644 index 34ed84c..0000000 --- a/system/Drivers/CMSIS/Include/core_cm3.h +++ /dev/null @@ -1,1763 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M3 - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03U) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M3 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#if (__CM3_REV < 0x0201U) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#else -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200U)) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1U]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in NVIC and returns the active bit. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5U /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_cm4.h b/system/Drivers/CMSIS/Include/core_cm4.h deleted file mode 100644 index 01cb73b..0000000 --- a/system/Drivers/CMSIS/Include/core_cm4.h +++ /dev/null @@ -1,1937 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M4 - @{ - */ - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x04U) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ -#include "core_cmSimd.h" /* Compiler specific SIMD Intrinsics */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000U - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M4 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if (__FPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#if (__FPU_PRESENT == 1U) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in NVIC and returns the active bit. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5U /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_cm7.h b/system/Drivers/CMSIS/Include/core_cm7.h deleted file mode 100644 index 20963c1..0000000 --- a/system/Drivers/CMSIS/Include/core_cm7.h +++ /dev/null @@ -1,2512 +0,0 @@ -/**************************************************************************//** - * @file core_cm7.h - * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CM7_H_GENERIC -#define __CORE_CM7_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup Cortex_M7 - @{ - */ - -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x07U) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. -*/ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1U - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #if (__FPU_PRESENT == 1U) - #define __FPU_USED 1U - #else - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0U - #endif - #else - #define __FPU_USED 0U - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ -#include "core_cmSimd.h" /* Compiler specific SIMD Intrinsics */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM7_H_DEPENDANT -#define __CORE_CM7_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM7_REV - #define __CM7_REV 0x0000U - #warning "__CM7_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0U - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0U - #warning "__ICACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0U - #warning "__DCACHE_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0U - #warning "__DTCM_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group Cortex_M7 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - -#define APSR_GE_Pos 16U /*!< APSR: GE Position */ -#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ -#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ -#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ - -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1U]; - __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93U]; - __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15U]; - __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 1 */ - uint32_t RESERVED5[1U]; - __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1U]; - __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6U]; - __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1U]; - __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ -#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ - -#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ -#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ - -#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ -#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ - -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/* SCB Cache Level ID Register Definitions */ -#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ -#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ - -#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ - -/* SCB Cache Type Register Definitions */ -#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ -#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ - -#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ -#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ - -#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ -#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ - -#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ -#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ - -#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ -#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ - -/* SCB Cache Size ID Register Definitions */ -#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ - -#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ - -#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ - -#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ - -#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ -#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ - -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ -#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ - -#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ -#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ - -/* SCB Cache Size Selection Register Definitions */ -#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ -#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ - -#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ -#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ - -/* SCB Software Triggered Interrupt Register Definitions */ -#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ -#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ - -/* SCB D-Cache Invalidate by Set-way Register Definitions */ -#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ -#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ - -#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ -#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ - -/* SCB D-Cache Clean by Set-way Register Definitions */ -#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ -#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ - -#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ -#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ - -/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ -#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ -#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ - -#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ -#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ - -/* Instruction Tightly-Coupled Memory Control Register Definitions */ -#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ -#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ - -#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ -#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ - -#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ -#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ - -#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ -#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ - -/* Data Tightly-Coupled Memory Control Register Definitions */ -#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ -#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ - -#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ -#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ - -#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ -#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ - -#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ -#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ - -/* AHBP Control Register Definitions */ -#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ -#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ - -#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ -#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ - -/* L1 Cache Control Register Definitions */ -#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ -#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ - -#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ -#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ - -#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ -#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ - -/* AHBS Control Register Definitions */ -#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ -#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ - -#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ -#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ - -#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ -#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ - -/* Auxiliary Bus Fault Status Register Definitions */ -#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ -#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ - -#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ -#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ - -#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ -#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ - -#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ -#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ - -#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ -#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ - -#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ -#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ - -#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ -#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ - -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ -#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if (__FPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) - @{ - */ - -/** - \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ -} FPU_Type; - -/* Floating-Point Context Control Register Definitions */ -#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register Definitions */ -#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register Definitions */ -#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 Definitions */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 Definitions */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ - -/* Media and FP Feature Register 2 Definitions */ - -/*@} end of group CMSIS_FPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#if (__FPU_PRESENT == 1U) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in NVIC and returns the active bit. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__STATIC_INLINE uint32_t SCB_GetFPUType(void) -{ - uint32_t mvfr0; - - mvfr0 = SCB->MVFR0; - if ((mvfr0 & 0x00000FF0UL) == 0x220UL) - { - return 2UL; /* Double + Single precision FPU */ - } - else if ((mvfr0 & 0x00000FF0UL) == 0x020UL) - { - return 1UL; /* Single precision FPU */ - } - else - { - return 0UL; /* No FPU */ - } -} - - -/*@} end of CMSIS_Core_FpuFunctions */ - - - -/* ########################## Cache functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ - */ - -/* Cache Size ID Register Macros */ -#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) -#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) - - -/** - \brief Enable I-Cache - \details Turns on I-Cache - */ -__STATIC_INLINE void SCB_EnableICache (void) -{ - #if (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable I-Cache - \details Turns off I-Cache - */ -__STATIC_INLINE void SCB_DisableICache (void) -{ - #if (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ - SCB->ICIALLU = 0UL; /* invalidate I-Cache */ - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate I-Cache - \details Invalidates I-Cache - */ -__STATIC_INLINE void SCB_InvalidateICache (void) -{ - #if (__ICACHE_PRESENT == 1U) - __DSB(); - __ISB(); - SCB->ICIALLU = 0UL; - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Enable D-Cache - \details Turns on D-Cache - */ -__STATIC_INLINE void SCB_EnableDCache (void) -{ - #if (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways--); - } while(sets--); - __DSB(); - - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Disable D-Cache - \details Turns off D-Cache - */ -__STATIC_INLINE void SCB_DisableDCache (void) -{ - #if (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways--); - } while(sets--); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Invalidate D-Cache - \details Invalidates D-Cache - */ -__STATIC_INLINE void SCB_InvalidateDCache (void) -{ - #if (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | - ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways--); - } while(sets--); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean D-Cache - \details Cleans D-Cache - */ -__STATIC_INLINE void SCB_CleanDCache (void) -{ - #if (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | - ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways--); - } while(sets--); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief Clean & Invalidate D-Cache - \details Cleans and Invalidates D-Cache - */ -__STATIC_INLINE void SCB_CleanInvalidateDCache (void) -{ - #if (__DCACHE_PRESENT == 1U) - uint32_t ccsidr; - uint32_t sets; - uint32_t ways; - - SCB->CSSELR = (0U << 1U) | 0U; /* Level 1 data cache */ - __DSB(); - - ccsidr = SCB->CCSIDR; - - /* clean & invalidate D-Cache */ - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - do { - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - do { - SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | - ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); - #if defined ( __CC_ARM ) - __schedule_barrier(); - #endif - } while (ways--); - } while(sets--); - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Invalidate by address - \details Invalidates D-Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if (__DCACHE_PRESENT == 1U) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t)addr; - int32_t linesize = 32U; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) { - SCB->DCIMVAC = op_addr; - op_addr += linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Clean by address - \details Cleans D-Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if (__DCACHE_PRESENT == 1) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t) addr; - int32_t linesize = 32U; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) { - SCB->DCCMVAC = op_addr; - op_addr += linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/** - \brief D-Cache Clean and Invalidate by address - \details Cleans and invalidates D_Cache for the given address - \param[in] addr address (aligned to 32-byte boundary) - \param[in] dsize size of memory block (in number of bytes) -*/ -__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) -{ - #if (__DCACHE_PRESENT == 1U) - int32_t op_size = dsize; - uint32_t op_addr = (uint32_t) addr; - int32_t linesize = 32U; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ - - __DSB(); - - while (op_size > 0) { - SCB->DCCIMVAC = op_addr; - op_addr += linesize; - op_size -= linesize; - } - - __DSB(); - __ISB(); - #endif -} - - -/*@} end of CMSIS_Core_CacheFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5U /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM7_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_cmFunc.h b/system/Drivers/CMSIS/Include/core_cmFunc.h deleted file mode 100644 index ca319a5..0000000 --- a/system/Drivers/CMSIS/Include/core_cmFunc.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ -*/ - -/*------------------ RealView Compiler -----------------*/ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #include "cmsis_armcc_V6.h" - -/*------------------ GNU Compiler ----------------------*/ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - -/*------------------ ICC Compiler ----------------------*/ -#elif defined ( __ICCARM__ ) - #include - -/*------------------ TI CCS Compiler -------------------*/ -#elif defined ( __TMS470__ ) - #include - -/*------------------ TASKING Compiler ------------------*/ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -/*------------------ COSMIC Compiler -------------------*/ -#elif defined ( __CSMC__ ) - #include - -#endif - -/*@} end of CMSIS_Core_RegAccFunctions */ - -#endif /* __CORE_CMFUNC_H */ diff --git a/system/Drivers/CMSIS/Include/core_cmInstr.h b/system/Drivers/CMSIS/Include/core_cmInstr.h deleted file mode 100644 index a0a5064..0000000 --- a/system/Drivers/CMSIS/Include/core_cmInstr.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/*------------------ RealView Compiler -----------------*/ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #include "cmsis_armcc_V6.h" - -/*------------------ GNU Compiler ----------------------*/ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - -/*------------------ ICC Compiler ----------------------*/ -#elif defined ( __ICCARM__ ) - #include - -/*------------------ TI CCS Compiler -------------------*/ -#elif defined ( __TMS470__ ) - #include - -/*------------------ TASKING Compiler ------------------*/ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -/*------------------ COSMIC Compiler -------------------*/ -#elif defined ( __CSMC__ ) - #include - -#endif - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#endif /* __CORE_CMINSTR_H */ diff --git a/system/Drivers/CMSIS/Include/core_cmSimd.h b/system/Drivers/CMSIS/Include/core_cmSimd.h deleted file mode 100644 index 4d76bf9..0000000 --- a/system/Drivers/CMSIS/Include/core_cmSimd.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************//** - * @file core_cmSimd.h - * @brief CMSIS Cortex-M SIMD Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_CMSIMD_H -#define __CORE_CMSIMD_H - -#ifdef __cplusplus - extern "C" { -#endif - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -/*------------------ RealView Compiler -----------------*/ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - -/*------------------ ARM Compiler V6 -------------------*/ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #include "cmsis_armcc_V6.h" - -/*------------------ GNU Compiler ----------------------*/ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - -/*------------------ ICC Compiler ----------------------*/ -#elif defined ( __ICCARM__ ) - #include - -/*------------------ TI CCS Compiler -------------------*/ -#elif defined ( __TMS470__ ) - #include - -/*------------------ TASKING Compiler ------------------*/ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -/*------------------ COSMIC Compiler -------------------*/ -#elif defined ( __CSMC__ ) - #include - -#endif - -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CMSIMD_H */ diff --git a/system/Drivers/CMSIS/Include/core_sc000.h b/system/Drivers/CMSIS/Include/core_sc000.h deleted file mode 100644 index ea16bf3..0000000 --- a/system/Drivers/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,926 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC000 - @{ - */ - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (000U) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000U - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31U]; - __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31U]; - __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31U]; - __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31U]; - uint32_t RESERVED4[64U]; - __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1U]; - __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. - Therefore they are not covered by the SC000 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of SC000 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else - { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Include/core_sc300.h b/system/Drivers/CMSIS/Include/core_sc300.h deleted file mode 100644 index 820cef4..0000000 --- a/system/Drivers/CMSIS/Include/core_sc300.h +++ /dev/null @@ -1,1745 +0,0 @@ -/**************************************************************************//** - * @file core_sc300.h - * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V4.30 - * @date 20. October 2015 - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #pragma clang system_header /* treat file as system include file */ -#endif - -#ifndef __CORE_SC300_H_GENERIC -#define __CORE_SC300_H_GENERIC - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/** - \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
      - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
      - Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
      - Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** - \ingroup SC3000 - @{ - */ - -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (300U) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ - #define __STATIC_INLINE static inline - -#else - #error Unknown compiler -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0U - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_PCS_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#endif - -#include "core_cmInstr.h" /* Core Instruction Access */ -#include "core_cmFunc.h" /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC300_H_DEPENDANT -#define __CORE_SC300_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC300_REV - #define __SC300_REV 0x0000U - #warning "__SC300_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/* following defines should be used for structure members */ -#define __IM volatile const /*! Defines 'read only' structure member permissions */ -#define __OM volatile /*! Defines 'write only' structure member permissions */ -#define __IOM volatile /*! Defines 'read / write' structure member permissions */ - -/*@} end of group SC300 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - ******************************************************************************/ -/** - \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** - \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31U /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30U /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29U /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28U /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - -#define APSR_Q_Pos 27U /*!< APSR: Q Position */ -#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ - - -/** - \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** - \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31U /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29U /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28U /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ -#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ - -#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ - -#define xPSR_T_Pos 24U /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** - \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** - \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** - \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129U]; - __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ -#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ - -#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Register Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Register Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** - \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - uint32_t RESERVED1[1U]; -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** - \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** - \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29U]; - __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ -#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ - -/* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ -#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ - -/* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ -#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ - -/* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ -#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ - -/* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ -#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ - -#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ -#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ - -#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ -#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) - @{ - */ - -/** - \brief Structure type to access the Data Watchpoint and Trace Register (DWT). - */ -typedef struct -{ - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ -} DWT_Type; - -/* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ -#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ - -#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ -#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ - -#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ -#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ - -#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ -#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ - -#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ -#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ - -#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ -#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ - -#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ -#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ - -#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ -#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ - -#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ -#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ - -#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ -#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ - -#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ -#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ - -#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ -#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ - -#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ -#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ - -#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ -#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ - -#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ -#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ - -#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ -#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ - -#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ -#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ - -#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ -#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ - -/* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ -#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ - -/* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ -#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ - -/* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ -#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ - -/* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ -#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ - -/* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ -#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ - -/* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ -#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ - -/* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ -#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ - -#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ -#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ - -#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ -#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ - -#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ -#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ - -#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ -#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ - -#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ -#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ - -#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ -#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ - -#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ -#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ - -#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ -#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ - -/*@}*/ /* end of group CMSIS_DWT */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) - @{ - */ - -/** - \brief Structure type to access the Trace Port Interface Register (TPI). - */ -typedef struct -{ - __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ -} TPI_Type; - -/* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ -#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ - -/* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ -#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ - -/* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ -#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ - -#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ -#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ - -#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ -#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ - -#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ -#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ - -/* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ -#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ - -#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ -#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ - -/* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ -#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ - -/* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ - -#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ -#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ - -#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ - -#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ -#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ - -#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ -#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ - -#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ -#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ - -#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ -#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ - -/* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ - -/* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ - -#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ -#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ - -#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ - -#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ -#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ - -#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ -#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ - -#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ -#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ - -#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ -#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ - -/* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ - -/* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ - -/* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ -#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ - -#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ -#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ - -#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ -#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ - -#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ -#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ - -#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ -#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ - -#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ -#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ - -/* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ -#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ - -/*@}*/ /* end of group CMSIS_TPI */ - - -#if (__MPU_PRESENT == 1U) -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** - \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register Definitions */ -#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register Definitions */ -#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register Definitions */ -#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register Definitions */ -#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register Definitions */ -#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers - @{ - */ - -/** - \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register Definitions */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register Definitions */ -#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register Definitions */ -#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_bitfield Core register bit field macros - \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). - @{ - */ - -/** - \brief Mask and shift a bit field value for use in a register bit range. - \param[in] field Name of the register bit field. - \param[in] value Value of the bit field. - \return Masked and shifted value. -*/ -#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) - -/** - \brief Mask and shift a register value to extract a bit filed value. - \param[in] field Name of the register bit field. - \param[in] value Value of register. - \return Masked and shifted bit field value. -*/ -#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) - -/*@} end of group CMSIS_core_bitfield */ - - -/** - \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions - ******************************************************************************/ -/** - \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/** - \brief Set Priority Grouping - \details Sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. - */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** - \brief Get Priority Grouping - \details Reads the priority grouping field from the NVIC Interrupt Controller. - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). - */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); -} - - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the NVIC interrupt controller. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** - \brief Get Active Interrupt - \details Reads the active register in NVIC and returns the active bit. - \param [in] IRQn Interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if ((int32_t)(IRQn) < 0) - { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } -} - - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param [in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if ((int32_t)(IRQn) < 0) - { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } -} - - -/** - \brief Encode Priority - \details Encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). - */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); -} - - -/** - \brief Decode Priority - \details Decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). - */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); -} - - -/** - \brief System Reset - \details Initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - - for(;;) /* wait until reset */ - { - __NOP(); - } -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0U) - -/** - \brief System Tick Configuration - \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** - \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5U /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** - \brief ITM Send Character - \details Transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - \returns Character to transmit. - */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) - { - __NOP(); - } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); -} - - -/** - \brief ITM Receive Character - \details Inputs a character via the external variable \ref ITM_RxBuffer. - \return Received character. - \return -1 No character pending. - */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) -{ - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** - \brief ITM Check Character - \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - \return 0 No character available. - \return 1 Character available. - */ -__STATIC_INLINE int32_t ITM_CheckChar (void) -{ - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC300_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4b_math.lib b/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4b_math.lib deleted file mode 100644 index 688290f..0000000 Binary files a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4b_math.lib and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4bf_math.lib b/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4bf_math.lib deleted file mode 100644 index bbf7813..0000000 Binary files a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4bf_math.lib and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4l_math.lib b/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4l_math.lib deleted file mode 100644 index 010715c..0000000 Binary files a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4l_math.lib and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4lf_math.lib b/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4lf_math.lib deleted file mode 100644 index 6336e06..0000000 Binary files a/system/Drivers/CMSIS/Lib/ARM/arm_cortexM4lf_math.lib and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4l_math.a b/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4l_math.a deleted file mode 100644 index b1d6da7..0000000 Binary files a/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4l_math.a and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a b/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a deleted file mode 100644 index 1ad5280..0000000 Binary files a/system/Drivers/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a and /dev/null differ diff --git a/system/Drivers/CMSIS/Lib/license.txt b/system/Drivers/CMSIS/Lib/license.txt deleted file mode 100644 index a4487ff..0000000 --- a/system/Drivers/CMSIS/Lib/license.txt +++ /dev/null @@ -1,28 +0,0 @@ -All pre-build libraries contained in the folders "ARM" and "GCC" -are guided by the following license: - -Copyright (C) 2009-2014 ARM Limited. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/system/Drivers/CMSIS/RTOS/Template/cmsis_os.h b/system/Drivers/CMSIS/RTOS/Template/cmsis_os.h deleted file mode 100644 index 068ebca..0000000 --- a/system/Drivers/CMSIS/RTOS/Template/cmsis_os.h +++ /dev/null @@ -1,707 +0,0 @@ -/* ---------------------------------------------------------------------- - * $Date: 5. February 2013 - * $Revision: V1.02 - * - * Project: CMSIS-RTOS API - * Title: cmsis_os.h template header file - * - * Version 0.02 - * Initial Proposal Phase - * Version 0.03 - * osKernelStart added, optional feature: main started as thread - * osSemaphores have standard behavior - * osTimerCreate does not start the timer, added osTimerStart - * osThreadPass is renamed to osThreadYield - * Version 1.01 - * Support for C++ interface - * - const attribute removed from the osXxxxDef_t typedef's - * - const attribute added to the osXxxxDef macros - * Added: osTimerDelete, osMutexDelete, osSemaphoreDelete - * Added: osKernelInitialize - * Version 1.02 - * Control functions for short timeouts in microsecond resolution: - * Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec - * Removed: osSignalGet - *---------------------------------------------------------------------------- - * - * Copyright (c) 2013 ARM LIMITED - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - Neither the name of ARM nor the names of its contributors may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *---------------------------------------------------------------------------*/ - - -#ifndef _CMSIS_OS_H -#define _CMSIS_OS_H - -/// \note MUST REMAIN UNCHANGED: \b osCMSIS identifies the CMSIS-RTOS API version. -#define osCMSIS 0x10002 ///< API version (main [31:16] .sub [15:0]) - -/// \note CAN BE CHANGED: \b osCMSIS_KERNEL identifies the underlying RTOS kernel and version number. -#define osCMSIS_KERNEL 0x10000 ///< RTOS identification and version (main [31:16] .sub [15:0]) - -/// \note MUST REMAIN UNCHANGED: \b osKernelSystemId shall be consistent in every CMSIS-RTOS. -#define osKernelSystemId "KERNEL V1.00" ///< RTOS identification string - -/// \note MUST REMAIN UNCHANGED: \b osFeature_xxx shall be consistent in every CMSIS-RTOS. -#define osFeature_MainThread 1 ///< main thread 1=main can be thread, 0=not available -#define osFeature_Pool 1 ///< Memory Pools: 1=available, 0=not available -#define osFeature_MailQ 1 ///< Mail Queues: 1=available, 0=not available -#define osFeature_MessageQ 1 ///< Message Queues: 1=available, 0=not available -#define osFeature_Signals 8 ///< maximum number of Signal Flags available per thread -#define osFeature_Semaphore 30 ///< maximum count for \ref osSemaphoreCreate function -#define osFeature_Wait 1 ///< osWait function: 1=available, 0=not available -#define osFeature_SysTick 1 ///< osKernelSysTick functions: 1=available, 0=not available - -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - - -// ==== Enumeration, structures, defines ==== - -/// Priority used for thread control. -/// \note MUST REMAIN UNCHANGED: \b osPriority shall be consistent in every CMSIS-RTOS. -typedef enum { - osPriorityIdle = -3, ///< priority: idle (lowest) - osPriorityLow = -2, ///< priority: low - osPriorityBelowNormal = -1, ///< priority: below normal - osPriorityNormal = 0, ///< priority: normal (default) - osPriorityAboveNormal = +1, ///< priority: above normal - osPriorityHigh = +2, ///< priority: high - osPriorityRealtime = +3, ///< priority: realtime (highest) - osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority -} osPriority; - -/// Timeout value. -/// \note MUST REMAIN UNCHANGED: \b osWaitForever shall be consistent in every CMSIS-RTOS. -#define osWaitForever 0xFFFFFFFF ///< wait forever timeout value - -/// Status code values returned by CMSIS-RTOS functions. -/// \note MUST REMAIN UNCHANGED: \b osStatus shall be consistent in every CMSIS-RTOS. -typedef enum { - osOK = 0, ///< function completed; no error or event occurred. - osEventSignal = 0x08, ///< function completed; signal event occurred. - osEventMessage = 0x10, ///< function completed; message event occurred. - osEventMail = 0x20, ///< function completed; mail event occurred. - osEventTimeout = 0x40, ///< function completed; timeout occurred. - osErrorParameter = 0x80, ///< parameter error: a mandatory parameter was missing or specified an incorrect object. - osErrorResource = 0x81, ///< resource not available: a specified resource was not available. - osErrorTimeoutResource = 0xC1, ///< resource not available within given time: a specified resource was not available within the timeout period. - osErrorISR = 0x82, ///< not allowed in ISR context: the function cannot be called from interrupt service routines. - osErrorISRRecursive = 0x83, ///< function called multiple times from ISR with same object. - osErrorPriority = 0x84, ///< system cannot determine priority or thread has illegal priority. - osErrorNoMemory = 0x85, ///< system is out of memory: it was impossible to allocate or reserve memory for the operation. - osErrorValue = 0x86, ///< value of a parameter is out of range. - osErrorOS = 0xFF, ///< unspecified RTOS error: run-time error but no other error message fits. - os_status_reserved = 0x7FFFFFFF ///< prevent from enum down-size compiler optimization. -} osStatus; - - -/// Timer type value for the timer definition. -/// \note MUST REMAIN UNCHANGED: \b os_timer_type shall be consistent in every CMSIS-RTOS. -typedef enum { - osTimerOnce = 0, ///< one-shot timer - osTimerPeriodic = 1 ///< repeating timer -} os_timer_type; - -/// Entry point of a thread. -/// \note MUST REMAIN UNCHANGED: \b os_pthread shall be consistent in every CMSIS-RTOS. -typedef void (*os_pthread) (void const *argument); - -/// Entry point of a timer call back function. -/// \note MUST REMAIN UNCHANGED: \b os_ptimer shall be consistent in every CMSIS-RTOS. -typedef void (*os_ptimer) (void const *argument); - -// >>> the following data type definitions may shall adapted towards a specific RTOS - -/// Thread ID identifies the thread (pointer to a thread control block). -/// \note CAN BE CHANGED: \b os_thread_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_thread_cb *osThreadId; - -/// Timer ID identifies the timer (pointer to a timer control block). -/// \note CAN BE CHANGED: \b os_timer_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_timer_cb *osTimerId; - -/// Mutex ID identifies the mutex (pointer to a mutex control block). -/// \note CAN BE CHANGED: \b os_mutex_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_mutex_cb *osMutexId; - -/// Semaphore ID identifies the semaphore (pointer to a semaphore control block). -/// \note CAN BE CHANGED: \b os_semaphore_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_semaphore_cb *osSemaphoreId; - -/// Pool ID identifies the memory pool (pointer to a memory pool control block). -/// \note CAN BE CHANGED: \b os_pool_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_pool_cb *osPoolId; - -/// Message ID identifies the message queue (pointer to a message queue control block). -/// \note CAN BE CHANGED: \b os_messageQ_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_messageQ_cb *osMessageQId; - -/// Mail ID identifies the mail queue (pointer to a mail queue control block). -/// \note CAN BE CHANGED: \b os_mailQ_cb is implementation specific in every CMSIS-RTOS. -typedef struct os_mailQ_cb *osMailQId; - - -/// Thread Definition structure contains startup information of a thread. -/// \note CAN BE CHANGED: \b os_thread_def is implementation specific in every CMSIS-RTOS. -typedef struct os_thread_def { - os_pthread pthread; ///< start address of thread function - osPriority tpriority; ///< initial thread priority - uint32_t instances; ///< maximum number of instances of that thread function - uint32_t stacksize; ///< stack size requirements in bytes; 0 is default stack size -} osThreadDef_t; - -/// Timer Definition structure contains timer parameters. -/// \note CAN BE CHANGED: \b os_timer_def is implementation specific in every CMSIS-RTOS. -typedef struct os_timer_def { - os_ptimer ptimer; ///< start address of a timer function -} osTimerDef_t; - -/// Mutex Definition structure contains setup information for a mutex. -/// \note CAN BE CHANGED: \b os_mutex_def is implementation specific in every CMSIS-RTOS. -typedef struct os_mutex_def { - uint32_t dummy; ///< dummy value. -} osMutexDef_t; - -/// Semaphore Definition structure contains setup information for a semaphore. -/// \note CAN BE CHANGED: \b os_semaphore_def is implementation specific in every CMSIS-RTOS. -typedef struct os_semaphore_def { - uint32_t dummy; ///< dummy value. -} osSemaphoreDef_t; - -/// Definition structure for memory block allocation. -/// \note CAN BE CHANGED: \b os_pool_def is implementation specific in every CMSIS-RTOS. -typedef struct os_pool_def { - uint32_t pool_sz; ///< number of items (elements) in the pool - uint32_t item_sz; ///< size of an item - void *pool; ///< pointer to memory for pool -} osPoolDef_t; - -/// Definition structure for message queue. -/// \note CAN BE CHANGED: \b os_messageQ_def is implementation specific in every CMSIS-RTOS. -typedef struct os_messageQ_def { - uint32_t queue_sz; ///< number of elements in the queue - uint32_t item_sz; ///< size of an item - void *pool; ///< memory array for messages -} osMessageQDef_t; - -/// Definition structure for mail queue. -/// \note CAN BE CHANGED: \b os_mailQ_def is implementation specific in every CMSIS-RTOS. -typedef struct os_mailQ_def { - uint32_t queue_sz; ///< number of elements in the queue - uint32_t item_sz; ///< size of an item - void *pool; ///< memory array for mail -} osMailQDef_t; - -/// Event structure contains detailed information about an event. -/// \note MUST REMAIN UNCHANGED: \b os_event shall be consistent in every CMSIS-RTOS. -/// However the struct may be extended at the end. -typedef struct { - osStatus status; ///< status code: event or error information - union { - uint32_t v; ///< message as 32-bit value - void *p; ///< message or mail as void pointer - int32_t signals; ///< signal flags - } value; ///< event value - union { - osMailQId mail_id; ///< mail id obtained by \ref osMailCreate - osMessageQId message_id; ///< message id obtained by \ref osMessageCreate - } def; ///< event definition -} osEvent; - - -// ==== Kernel Control Functions ==== - -/// Initialize the RTOS Kernel for creating objects. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osKernelInitialize shall be consistent in every CMSIS-RTOS. -osStatus osKernelInitialize (void); - -/// Start the RTOS Kernel. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS. -osStatus osKernelStart (void); - -/// Check if the RTOS kernel is already started. -/// \note MUST REMAIN UNCHANGED: \b osKernelRunning shall be consistent in every CMSIS-RTOS. -/// \return 0 RTOS is not started, 1 RTOS is started. -int32_t osKernelRunning(void); - -#if (defined (osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available - -/// Get the RTOS kernel system timer counter -/// \note MUST REMAIN UNCHANGED: \b osKernelSysTick shall be consistent in every CMSIS-RTOS. -/// \return RTOS kernel system timer as 32-bit value -uint32_t osKernelSysTick (void); - -/// The RTOS kernel system timer frequency in Hz -/// \note Reflects the system timer setting and is typically defined in a configuration file. -#define osKernelSysTickFrequency 100000000 - -/// Convert a microseconds value to a RTOS kernel system timer value. -/// \param microsec time value in microseconds. -/// \return time value normalized to the \ref osKernelSysTickFrequency -#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * (osKernelSysTickFrequency)) / 1000000) - -#endif // System Timer available - -// ==== Thread Management ==== - -/// Create a Thread Definition with function, priority, and stack requirements. -/// \param name name of the thread function. -/// \param priority initial priority of the thread function. -/// \param instances number of possible thread instances. -/// \param stacksz stack size (in bytes) requirements for the thread function. -/// \note CAN BE CHANGED: The parameters to \b osThreadDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osThreadDef(name, priority, instances, stacksz) \ -extern const osThreadDef_t os_thread_def_##name -#else // define the object -#define osThreadDef(name, priority, instances, stacksz) \ -const osThreadDef_t os_thread_def_##name = \ -{ (name), (priority), (instances), (stacksz) } -#endif - -/// Access a Thread definition. -/// \param name name of the thread definition object. -/// \note CAN BE CHANGED: The parameter to \b osThread shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osThread(name) \ -&os_thread_def_##name - -/// Create a thread and add it to Active Threads and set it to state READY. -/// \param[in] thread_def thread definition referenced with \ref osThread. -/// \param[in] argument pointer that is passed to the thread function as start argument. -/// \return thread ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS. -osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument); - -/// Return the thread ID of the current running thread. -/// \return thread ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osThreadGetId shall be consistent in every CMSIS-RTOS. -osThreadId osThreadGetId (void); - -/// Terminate execution of a thread and remove it from Active Threads. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osThreadTerminate shall be consistent in every CMSIS-RTOS. -osStatus osThreadTerminate (osThreadId thread_id); - -/// Pass control to next thread that is in state \b READY. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osThreadYield shall be consistent in every CMSIS-RTOS. -osStatus osThreadYield (void); - -/// Change priority of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] priority new priority value for the thread function. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osThreadSetPriority shall be consistent in every CMSIS-RTOS. -osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority); - -/// Get current priority of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \return current priority value of the thread function. -/// \note MUST REMAIN UNCHANGED: \b osThreadGetPriority shall be consistent in every CMSIS-RTOS. -osPriority osThreadGetPriority (osThreadId thread_id); - - -// ==== Generic Wait Functions ==== - -/// Wait for Timeout (Time Delay). -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value -/// \return status code that indicates the execution status of the function. -osStatus osDelay (uint32_t millisec); - -#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available - -/// Wait for Signal, Message, Mail, or Timeout. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return event that contains signal, message, or mail information or error code. -/// \note MUST REMAIN UNCHANGED: \b osWait shall be consistent in every CMSIS-RTOS. -osEvent osWait (uint32_t millisec); - -#endif // Generic Wait available - - -// ==== Timer Management Functions ==== -/// Define a Timer object. -/// \param name name of the timer object. -/// \param function name of the timer call back function. -/// \note CAN BE CHANGED: The parameter to \b osTimerDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osTimerDef(name, function) \ -extern const osTimerDef_t os_timer_def_##name -#else // define the object -#define osTimerDef(name, function) \ -const osTimerDef_t os_timer_def_##name = \ -{ (function) } -#endif - -/// Access a Timer definition. -/// \param name name of the timer object. -/// \note CAN BE CHANGED: The parameter to \b osTimer shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osTimer(name) \ -&os_timer_def_##name - -/// Create a timer. -/// \param[in] timer_def timer object referenced with \ref osTimer. -/// \param[in] type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior. -/// \param[in] argument argument to the timer call back function. -/// \return timer ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osTimerCreate shall be consistent in every CMSIS-RTOS. -osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument); - -/// Start or restart a timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue "time delay" value of the timer. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osTimerStart shall be consistent in every CMSIS-RTOS. -osStatus osTimerStart (osTimerId timer_id, uint32_t millisec); - -/// Stop the timer. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osTimerStop shall be consistent in every CMSIS-RTOS. -osStatus osTimerStop (osTimerId timer_id); - -/// Delete a timer that was created by \ref osTimerCreate. -/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osTimerDelete shall be consistent in every CMSIS-RTOS. -osStatus osTimerDelete (osTimerId timer_id); - - -// ==== Signal Management ==== - -/// Set the specified Signal Flags of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] signals specifies the signal flags of the thread that should be set. -/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters. -/// \note MUST REMAIN UNCHANGED: \b osSignalSet shall be consistent in every CMSIS-RTOS. -int32_t osSignalSet (osThreadId thread_id, int32_t signals); - -/// Clear the specified Signal Flags of an active thread. -/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. -/// \param[in] signals specifies the signal flags of the thread that shall be cleared. -/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters or call from ISR. -/// \note MUST REMAIN UNCHANGED: \b osSignalClear shall be consistent in every CMSIS-RTOS. -int32_t osSignalClear (osThreadId thread_id, int32_t signals); - -/// Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread. -/// \param[in] signals wait until all specified signal flags set or 0 for any single signal flag. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event flag information or error code. -/// \note MUST REMAIN UNCHANGED: \b osSignalWait shall be consistent in every CMSIS-RTOS. -osEvent osSignalWait (int32_t signals, uint32_t millisec); - - -// ==== Mutex Management ==== - -/// Define a Mutex. -/// \param name name of the mutex object. -/// \note CAN BE CHANGED: The parameter to \b osMutexDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osMutexDef(name) \ -extern const osMutexDef_t os_mutex_def_##name -#else // define the object -#define osMutexDef(name) \ -const osMutexDef_t os_mutex_def_##name = { 0 } -#endif - -/// Access a Mutex definition. -/// \param name name of the mutex object. -/// \note CAN BE CHANGED: The parameter to \b osMutex shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osMutex(name) \ -&os_mutex_def_##name - -/// Create and Initialize a Mutex object. -/// \param[in] mutex_def mutex definition referenced with \ref osMutex. -/// \return mutex ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osMutexCreate shall be consistent in every CMSIS-RTOS. -osMutexId osMutexCreate (const osMutexDef_t *mutex_def); - -/// Wait until a Mutex becomes available. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMutexWait shall be consistent in every CMSIS-RTOS. -osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec); - -/// Release a Mutex that was obtained by \ref osMutexWait. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMutexRelease shall be consistent in every CMSIS-RTOS. -osStatus osMutexRelease (osMutexId mutex_id); - -/// Delete a Mutex that was created by \ref osMutexCreate. -/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMutexDelete shall be consistent in every CMSIS-RTOS. -osStatus osMutexDelete (osMutexId mutex_id); - - -// ==== Semaphore Management Functions ==== - -#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0)) // Semaphore available - -/// Define a Semaphore object. -/// \param name name of the semaphore object. -/// \note CAN BE CHANGED: The parameter to \b osSemaphoreDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osSemaphoreDef(name) \ -extern const osSemaphoreDef_t os_semaphore_def_##name -#else // define the object -#define osSemaphoreDef(name) \ -const osSemaphoreDef_t os_semaphore_def_##name = { 0 } -#endif - -/// Access a Semaphore definition. -/// \param name name of the semaphore object. -/// \note CAN BE CHANGED: The parameter to \b osSemaphore shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osSemaphore(name) \ -&os_semaphore_def_##name - -/// Create and Initialize a Semaphore object used for managing resources. -/// \param[in] semaphore_def semaphore definition referenced with \ref osSemaphore. -/// \param[in] count number of available resources. -/// \return semaphore ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osSemaphoreCreate shall be consistent in every CMSIS-RTOS. -osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count); - -/// Wait until a Semaphore token becomes available. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return number of available tokens, or -1 in case of incorrect parameters. -/// \note MUST REMAIN UNCHANGED: \b osSemaphoreWait shall be consistent in every CMSIS-RTOS. -int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec); - -/// Release a Semaphore token. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osSemaphoreRelease shall be consistent in every CMSIS-RTOS. -osStatus osSemaphoreRelease (osSemaphoreId semaphore_id); - -/// Delete a Semaphore that was created by \ref osSemaphoreCreate. -/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osSemaphoreDelete shall be consistent in every CMSIS-RTOS. -osStatus osSemaphoreDelete (osSemaphoreId semaphore_id); - -#endif // Semaphore available - - -// ==== Memory Pool Management Functions ==== - -#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool Management available - -/// \brief Define a Memory Pool. -/// \param name name of the memory pool. -/// \param no maximum number of blocks (objects) in the memory pool. -/// \param type data type of a single block (object). -/// \note CAN BE CHANGED: The parameter to \b osPoolDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osPoolDef(name, no, type) \ -extern const osPoolDef_t os_pool_def_##name -#else // define the object -#define osPoolDef(name, no, type) \ -const osPoolDef_t os_pool_def_##name = \ -{ (no), sizeof(type), NULL } -#endif - -/// \brief Access a Memory Pool definition. -/// \param name name of the memory pool -/// \note CAN BE CHANGED: The parameter to \b osPool shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osPool(name) \ -&os_pool_def_##name - -/// Create and Initialize a memory pool. -/// \param[in] pool_def memory pool definition referenced with \ref osPool. -/// \return memory pool ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osPoolCreate shall be consistent in every CMSIS-RTOS. -osPoolId osPoolCreate (const osPoolDef_t *pool_def); - -/// Allocate a memory block from a memory pool. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \return address of the allocated memory block or NULL in case of no memory available. -/// \note MUST REMAIN UNCHANGED: \b osPoolAlloc shall be consistent in every CMSIS-RTOS. -void *osPoolAlloc (osPoolId pool_id); - -/// Allocate a memory block from a memory pool and set memory block to zero. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \return address of the allocated memory block or NULL in case of no memory available. -/// \note MUST REMAIN UNCHANGED: \b osPoolCAlloc shall be consistent in every CMSIS-RTOS. -void *osPoolCAlloc (osPoolId pool_id); - -/// Return an allocated memory block back to a specific memory pool. -/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. -/// \param[in] block address of the allocated memory block that is returned to the memory pool. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osPoolFree shall be consistent in every CMSIS-RTOS. -osStatus osPoolFree (osPoolId pool_id, void *block); - -#endif // Memory Pool Management available - - -// ==== Message Queue Management Functions ==== - -#if (defined (osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queues available - -/// \brief Create a Message Queue Definition. -/// \param name name of the queue. -/// \param queue_sz maximum number of messages in the queue. -/// \param type data type of a single message element (for debugger). -/// \note CAN BE CHANGED: The parameter to \b osMessageQDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osMessageQDef(name, queue_sz, type) \ -extern const osMessageQDef_t os_messageQ_def_##name -#else // define the object -#define osMessageQDef(name, queue_sz, type) \ -const osMessageQDef_t os_messageQ_def_##name = \ -{ (queue_sz), sizeof (type) } -#endif - -/// \brief Access a Message Queue Definition. -/// \param name name of the queue -/// \note CAN BE CHANGED: The parameter to \b osMessageQ shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osMessageQ(name) \ -&os_messageQ_def_##name - -/// Create and Initialize a Message Queue. -/// \param[in] queue_def queue definition referenced with \ref osMessageQ. -/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. -/// \return message queue ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osMessageCreate shall be consistent in every CMSIS-RTOS. -osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id); - -/// Put a Message to a Queue. -/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. -/// \param[in] info message information. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMessagePut shall be consistent in every CMSIS-RTOS. -osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec); - -/// Get a Message or Wait for a Message from a Queue. -/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out. -/// \return event information that includes status code. -/// \note MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS. -osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec); - -#endif // Message Queues available - - -// ==== Mail Queue Management Functions ==== - -#if (defined (osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queues available - -/// \brief Create a Mail Queue Definition. -/// \param name name of the queue -/// \param queue_sz maximum number of messages in queue -/// \param type data type of a single message element -/// \note CAN BE CHANGED: The parameter to \b osMailQDef shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#if defined (osObjectsExternal) // object is external -#define osMailQDef(name, queue_sz, type) \ -extern const osMailQDef_t os_mailQ_def_##name -#else // define the object -#define osMailQDef(name, queue_sz, type) \ -const osMailQDef_t os_mailQ_def_##name = \ -{ (queue_sz), sizeof (type) } -#endif - -/// \brief Access a Mail Queue Definition. -/// \param name name of the queue -/// \note CAN BE CHANGED: The parameter to \b osMailQ shall be consistent but the -/// macro body is implementation specific in every CMSIS-RTOS. -#define osMailQ(name) \ -&os_mailQ_def_##name - -/// Create and Initialize mail queue. -/// \param[in] queue_def reference to the mail queue definition obtain with \ref osMailQ -/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. -/// \return mail queue ID for reference by other functions or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osMailCreate shall be consistent in every CMSIS-RTOS. -osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id); - -/// Allocate a memory block from a mail. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return pointer to memory block that can be filled with mail or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osMailAlloc shall be consistent in every CMSIS-RTOS. -void *osMailAlloc (osMailQId queue_id, uint32_t millisec); - -/// Allocate a memory block from a mail and set memory block to zero. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return pointer to memory block that can be filled with mail or NULL in case of error. -/// \note MUST REMAIN UNCHANGED: \b osMailCAlloc shall be consistent in every CMSIS-RTOS. -void *osMailCAlloc (osMailQId queue_id, uint32_t millisec); - -/// Put a mail to a queue. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] mail memory block previously allocated with \ref osMailAlloc or \ref osMailCAlloc. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMailPut shall be consistent in every CMSIS-RTOS. -osStatus osMailPut (osMailQId queue_id, void *mail); - -/// Get a mail from a queue. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] millisec \ref CMSIS_RTOS_TimeOutValue or 0 in case of no time-out -/// \return event that contains mail information or error code. -/// \note MUST REMAIN UNCHANGED: \b osMailGet shall be consistent in every CMSIS-RTOS. -osEvent osMailGet (osMailQId queue_id, uint32_t millisec); - -/// Free a memory block from a mail. -/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. -/// \param[in] mail pointer to the memory block that was obtained with \ref osMailGet. -/// \return status code that indicates the execution status of the function. -/// \note MUST REMAIN UNCHANGED: \b osMailFree shall be consistent in every CMSIS-RTOS. -osStatus osMailFree (osMailQId queue_id, void *mail); - -#endif // Mail Queues available - - -#ifdef __cplusplus -} -#endif - -#endif // _CMSIS_OS_H diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 7800776..583fce2 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -2,14 +2,14 @@ ****************************************************************************** * @file stm32_hal_legacy.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file contains aliases definition for the STM32Cube HAL constants * macros and functions maintained for legacy purpose. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -138,6 +138,7 @@ #define COMP_EXTI_LINE_COMP5_EVENT COMP_EXTI_LINE_COMP5 #define COMP_EXTI_LINE_COMP6_EVENT COMP_EXTI_LINE_COMP6 #define COMP_EXTI_LINE_COMP7_EVENT COMP_EXTI_LINE_COMP7 +#define COMP_LPTIMCONNECTION_ENABLED COMP_LPTIMCONNECTION_IN1_ENABLED /*!< COMPX output is connected to LPTIM input 1 */ #define COMP_OUTPUT_COMP6TIM2OCREFCLR COMP_OUTPUT_COMP6_TIM2OCREFCLR #if defined(STM32F373xC) || defined(STM32F378xx) #define COMP_OUTPUT_TIM3IC1 COMP_OUTPUT_COMP1_TIM3IC1 @@ -150,6 +151,9 @@ #define COMP_NONINVERTINGINPUT_IO1 COMP_INPUT_PLUS_IO1 #define COMP_NONINVERTINGINPUT_IO2 COMP_INPUT_PLUS_IO2 #define COMP_NONINVERTINGINPUT_IO3 COMP_INPUT_PLUS_IO3 +#define COMP_NONINVERTINGINPUT_IO4 COMP_INPUT_PLUS_IO4 +#define COMP_NONINVERTINGINPUT_IO5 COMP_INPUT_PLUS_IO5 +#define COMP_NONINVERTINGINPUT_IO6 COMP_INPUT_PLUS_IO6 #define COMP_INVERTINGINPUT_1_4VREFINT COMP_INPUT_MINUS_1_4VREFINT #define COMP_INVERTINGINPUT_1_2VREFINT COMP_INPUT_MINUS_1_2VREFINT @@ -160,8 +164,16 @@ #define COMP_INVERTINGINPUT_DAC1 COMP_INPUT_MINUS_DAC1_CH1 #define COMP_INVERTINGINPUT_DAC2 COMP_INPUT_MINUS_DAC1_CH2 #define COMP_INVERTINGINPUT_IO1 COMP_INPUT_MINUS_IO1 +#if defined(STM32L0) +/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2), */ +/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding */ +/* to the second dedicated IO (only for COMP2). */ +#define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_DAC1_CH2 +#define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO2 +#else #define COMP_INVERTINGINPUT_IO2 COMP_INPUT_MINUS_IO2 #define COMP_INVERTINGINPUT_IO3 COMP_INPUT_MINUS_IO3 +#endif #define COMP_INVERTINGINPUT_IO4 COMP_INPUT_MINUS_IO4 #define COMP_INVERTINGINPUT_IO5 COMP_INPUT_MINUS_IO5 @@ -229,9 +241,9 @@ #define DAC1_CHANNEL_1 DAC_CHANNEL_1 #define DAC1_CHANNEL_2 DAC_CHANNEL_2 #define DAC2_CHANNEL_1 DAC_CHANNEL_1 -#define DAC_WAVE_NONE ((uint32_t)0x00000000U) -#define DAC_WAVE_NOISE ((uint32_t)DAC_CR_WAVE1_0) -#define DAC_WAVE_TRIANGLE ((uint32_t)DAC_CR_WAVE1_1) +#define DAC_WAVE_NONE 0x00000000U +#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 +#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 #define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE @@ -344,6 +356,7 @@ #define OB_RDP_LEVEL0 OB_RDP_LEVEL_0 #define OB_RDP_LEVEL1 OB_RDP_LEVEL_1 #define OB_RDP_LEVEL2 OB_RDP_LEVEL_2 + /** * @} */ @@ -369,7 +382,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -841,6 +854,8 @@ #define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 #define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 +#define __DIV_LPUART UART_DIV_LPUART + #define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE #define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK @@ -902,48 +917,45 @@ #define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK #define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK -#define ETH_MMCCR ((uint32_t)0x00000100U) -#define ETH_MMCRIR ((uint32_t)0x00000104U) -#define ETH_MMCTIR ((uint32_t)0x00000108U) -#define ETH_MMCRIMR ((uint32_t)0x0000010CU) -#define ETH_MMCTIMR ((uint32_t)0x00000110U) -#define ETH_MMCTGFSCCR ((uint32_t)0x0000014CU) -#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150U) -#define ETH_MMCTGFCR ((uint32_t)0x00000168U) -#define ETH_MMCRFCECR ((uint32_t)0x00000194U) -#define ETH_MMCRFAECR ((uint32_t)0x00000198U) -#define ETH_MMCRGUFCR ((uint32_t)0x000001C4U) +#define ETH_MMCCR 0x00000100U +#define ETH_MMCRIR 0x00000104U +#define ETH_MMCTIR 0x00000108U +#define ETH_MMCRIMR 0x0000010CU +#define ETH_MMCTIMR 0x00000110U +#define ETH_MMCTGFSCCR 0x0000014CU +#define ETH_MMCTGFMSCCR 0x00000150U +#define ETH_MMCTGFCR 0x00000168U +#define ETH_MMCRFCECR 0x00000194U +#define ETH_MMCRFAECR 0x00000198U +#define ETH_MMCRGUFCR 0x000001C4U -#define ETH_MAC_TXFIFO_FULL ((uint32_t)0x02000000) /* Tx FIFO full */ -#define ETH_MAC_TXFIFONOT_EMPTY ((uint32_t)0x01000000) /* Tx FIFO not empty */ -#define ETH_MAC_TXFIFO_WRITE_ACTIVE ((uint32_t)0x00400000) /* Tx FIFO write active */ -#define ETH_MAC_TXFIFO_IDLE ((uint32_t)0x00000000) /* Tx FIFO read status: Idle */ -#define ETH_MAC_TXFIFO_READ ((uint32_t)0x00100000) /* Tx FIFO read status: Read (transferring data to the MAC transmitter) */ -#define ETH_MAC_TXFIFO_WAITING ((uint32_t)0x00200000) /* Tx FIFO read status: Waiting for TxStatus from MAC transmitter */ -#define ETH_MAC_TXFIFO_WRITING ((uint32_t)0x00300000) /* Tx FIFO read status: Writing the received TxStatus or flushing the TxFIFO */ -#define ETH_MAC_TRANSMISSION_PAUSE ((uint32_t)0x00080000) /* MAC transmitter in pause */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE ((uint32_t)0x00000000) /* MAC transmit frame controller: Idle */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING ((uint32_t)0x00020000) /* MAC transmit frame controller: Waiting for Status of previous frame or IFG/backoff period to be over */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF ((uint32_t)0x00040000) /* MAC transmit frame controller: Generating and transmitting a Pause control frame (in full duplex mode) */ -#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING ((uint32_t)0x00060000) /* MAC transmit frame controller: Transferring input frame for transmission */ -#define ETH_MAC_MII_TRANSMIT_ACTIVE ((uint32_t)0x00010000) /* MAC MII transmit engine active */ -#define ETH_MAC_RXFIFO_EMPTY ((uint32_t)0x00000000) /* Rx FIFO fill level: empty */ -#define ETH_MAC_RXFIFO_BELOW_THRESHOLD ((uint32_t)0x00000100) /* Rx FIFO fill level: fill-level below flow-control de-activate threshold */ -#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD ((uint32_t)0x00000200) /* Rx FIFO fill level: fill-level above flow-control activate threshold */ -#define ETH_MAC_RXFIFO_FULL ((uint32_t)0x00000300) /* Rx FIFO fill level: full */ -#if defined(STM32F1) -#else -#define ETH_MAC_READCONTROLLER_IDLE ((uint32_t)0x00000000) /* Rx FIFO read controller IDLE state */ -#define ETH_MAC_READCONTROLLER_READING_DATA ((uint32_t)0x00000020) /* Rx FIFO read controller Reading frame data */ -#define ETH_MAC_READCONTROLLER_READING_STATUS ((uint32_t)0x00000040) /* Rx FIFO read controller Reading frame status (or time-stamp) */ -#endif -#define ETH_MAC_READCONTROLLER_FLUSHING ((uint32_t)0x00000060) /* Rx FIFO read controller Flushing the frame data and status */ -#define ETH_MAC_RXFIFO_WRITE_ACTIVE ((uint32_t)0x00000010) /* Rx FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_NOTACTIVE ((uint32_t)0x00000000) /* MAC small FIFO read / write controllers not active */ -#define ETH_MAC_SMALL_FIFO_READ_ACTIVE ((uint32_t)0x00000002) /* MAC small FIFO read controller active */ -#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE ((uint32_t)0x00000004) /* MAC small FIFO write controller active */ -#define ETH_MAC_SMALL_FIFO_RW_ACTIVE ((uint32_t)0x00000006) /* MAC small FIFO read / write controllers active */ -#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE ((uint32_t)0x00000001) /* MAC MII receive protocol engine active */ +#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ +#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ +#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ +#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ +#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to the MAC transmitter) */ +#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from MAC transmitter */ +#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus or flushing the TxFIFO */ +#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status of previous frame or IFG/backoff period to be over */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and transmitting a Pause control frame (in full duplex mode) */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input frame for transmission */ +#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ +#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ +#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control de-activate threshold */ +#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control activate threshold */ +#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ +#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ +#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ +#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status (or time-stamp) */ +#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and status */ +#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ +#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ +#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ +#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ /** * @} @@ -965,7 +977,7 @@ * @} */ -#if defined(STM32L4xx) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) ||\ +#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) ||\ defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) /** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose * @{ @@ -990,7 +1002,7 @@ /** * @} */ -#endif /* STM32L4xx || STM32F7*/ +#endif /* STM32L4 || STM32F7*/ /** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose * @{ @@ -1175,6 +1187,9 @@ * @{ */ #define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback +#define HAL_LTDC_Relaod HAL_LTDC_Reload +#define HAL_LTDC_StructInitFromVideoConfig HAL_LTDCEx_StructInitFromVideoConfig +#define HAL_LTDC_StructInitFromAdaptedCommandConfig HAL_LTDCEx_StructInitFromAdaptedCommandConfig /** * @} */ @@ -1610,7 +1625,11 @@ #define __HAL_I2C_RESET_CR2 I2C_RESET_CR2 #define __HAL_I2C_GENERATE_START I2C_GENERATE_START +#if defined(STM32F1) +#define __HAL_I2C_FREQ_RANGE I2C_FREQRANGE +#else #define __HAL_I2C_FREQ_RANGE I2C_FREQ_RANGE +#endif /* STM32F1 */ #define __HAL_I2C_RISE_TIME I2C_RISE_TIME #define __HAL_I2C_SPEED_STANDARD I2C_SPEED_STANDARD #define __HAL_I2C_SPEED_FAST I2C_SPEED_FAST @@ -2216,26 +2235,26 @@ #define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE #define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET #define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET -#define __USART4_CLK_DISABLE __HAL_RCC_USART4_CLK_DISABLE -#define __USART4_CLK_ENABLE __HAL_RCC_USART4_CLK_ENABLE -#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_USART4_CLK_SLEEP_ENABLE -#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_USART4_CLK_SLEEP_DISABLE -#define __USART4_FORCE_RESET __HAL_RCC_USART4_FORCE_RESET -#define __USART4_RELEASE_RESET __HAL_RCC_USART4_RELEASE_RESET -#define __USART5_CLK_DISABLE __HAL_RCC_USART5_CLK_DISABLE -#define __USART5_CLK_ENABLE __HAL_RCC_USART5_CLK_ENABLE -#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_USART5_CLK_SLEEP_ENABLE -#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_USART5_CLK_SLEEP_DISABLE -#define __USART5_FORCE_RESET __HAL_RCC_USART5_FORCE_RESET -#define __USART5_RELEASE_RESET __HAL_RCC_USART5_RELEASE_RESET -#define __USART7_CLK_DISABLE __HAL_RCC_USART7_CLK_DISABLE -#define __USART7_CLK_ENABLE __HAL_RCC_USART7_CLK_ENABLE -#define __USART7_FORCE_RESET __HAL_RCC_USART7_FORCE_RESET -#define __USART7_RELEASE_RESET __HAL_RCC_USART7_RELEASE_RESET -#define __USART8_CLK_DISABLE __HAL_RCC_USART8_CLK_DISABLE -#define __USART8_CLK_ENABLE __HAL_RCC_USART8_CLK_ENABLE -#define __USART8_FORCE_RESET __HAL_RCC_USART8_FORCE_RESET -#define __USART8_RELEASE_RESET __HAL_RCC_USART8_RELEASE_RESET +#define __USART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE +#define __USART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE +#define __USART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE +#define __USART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE +#define __USART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET +#define __USART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET +#define __USART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE +#define __USART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE +#define __USART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE +#define __USART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE +#define __USART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET +#define __USART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET +#define __USART7_CLK_DISABLE __HAL_RCC_UART7_CLK_DISABLE +#define __USART7_CLK_ENABLE __HAL_RCC_UART7_CLK_ENABLE +#define __USART7_FORCE_RESET __HAL_RCC_UART7_FORCE_RESET +#define __USART7_RELEASE_RESET __HAL_RCC_UART7_RELEASE_RESET +#define __USART8_CLK_DISABLE __HAL_RCC_UART8_CLK_DISABLE +#define __USART8_CLK_ENABLE __HAL_RCC_UART8_CLK_ENABLE +#define __USART8_FORCE_RESET __HAL_RCC_UART8_FORCE_RESET +#define __USART8_RELEASE_RESET __HAL_RCC_UART8_RELEASE_RESET #define __USB_CLK_DISABLE __HAL_RCC_USB_CLK_DISABLE #define __USB_CLK_ENABLE __HAL_RCC_USB_CLK_ENABLE #define __USB_FORCE_RESET __HAL_RCC_USB_FORCE_RESET @@ -2637,10 +2656,22 @@ #define RCC_IT_HSI14 RCC_IT_HSI14RDY -#if defined(STM32L0) -#define RCC_IT_LSECSS RCC_IT_CSSLSE -#define RCC_IT_CSS RCC_IT_CSSHSE -#endif +#define RCC_IT_CSSLSE RCC_IT_LSECSS +#define RCC_IT_CSSHSE RCC_IT_CSS + +#define RCC_PLLMUL_3 RCC_PLL_MUL3 +#define RCC_PLLMUL_4 RCC_PLL_MUL4 +#define RCC_PLLMUL_6 RCC_PLL_MUL6 +#define RCC_PLLMUL_8 RCC_PLL_MUL8 +#define RCC_PLLMUL_12 RCC_PLL_MUL12 +#define RCC_PLLMUL_16 RCC_PLL_MUL16 +#define RCC_PLLMUL_24 RCC_PLL_MUL24 +#define RCC_PLLMUL_32 RCC_PLL_MUL32 +#define RCC_PLLMUL_48 RCC_PLL_MUL48 + +#define RCC_PLLDIV_2 RCC_PLL_DIV2 +#define RCC_PLLDIV_3 RCC_PLL_DIV3 +#define RCC_PLLDIV_4 RCC_PLL_DIV4 #define IS_RCC_MCOSOURCE IS_RCC_MCO1SOURCE #define __HAL_RCC_MCO_CONFIG __HAL_RCC_MCO1_CONFIG @@ -2757,10 +2788,22 @@ #define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED #define DfsdmClockSelection Dfsdm1ClockSelection #define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 -#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK +#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 #define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK #define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG #define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE +#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 +#define RCC_LPTIM1CLKSOURCE_PCLK RCC_LPTIM1CLKSOURCE_PCLK1 +#define RCC_LPTIM2CLKSOURCE_PCLK RCC_LPTIM2CLKSOURCE_PCLK1 + +#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM1AUDIOCLKSOURCE_I2S1 +#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM1AUDIOCLKSOURCE_I2S2 +#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 RCC_DFSDM2AUDIOCLKSOURCE_I2S1 +#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 RCC_DFSDM2AUDIOCLKSOURCE_I2S2 +#define RCC_DFSDM1CLKSOURCE_APB2 RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_DFSDM2CLKSOURCE_APB2 RCC_DFSDM2CLKSOURCE_PCLK2 +#define RCC_FMPI2C1CLKSOURCE_APB RCC_FMPI2C1CLKSOURCE_PCLK1 /** * @} @@ -2891,6 +2934,14 @@ #define SDIO_IRQn SDMMC1_IRQn #define SDIO_IRQHandler SDMMC1_IRQHandler #endif + +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef +#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef +#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef +#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef +#endif + /** * @} */ @@ -3079,6 +3130,7 @@ * @{ */ #define __HAL_LTDC_LAYER LTDC_LAYER +#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32_assert_template.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32_assert_template.h new file mode 100644 index 0000000..c7aba84 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32_assert_template.h @@ -0,0 +1,75 @@ +/** + ****************************************************************************** + * @file stm32_assert.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief STM32 assert template file. + * This file should be copied to the application folder and renamed + * to stm32_assert.h. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ASSERT_H +#define __STM32_ASSERT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Includes ------------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ASSERT_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h index 937ca98..e52d9ed 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -2,14 +2,14 @@ ****************************************************************************** * @file stm32f4xx_hal.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file contains all the functions prototypes for the HAL * module driver. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -164,7 +164,7 @@ /** * @} */ - + /** @defgroup PVD_Lock_Enable PVD Lock * @{ */ @@ -220,6 +220,7 @@ void HAL_DBGMCU_EnableDBGStandbyMode(void); void HAL_DBGMCU_DisableDBGStandbyMode(void); void HAL_EnableCompensationCell(void); void HAL_DisableCompensationCell(void); +void HAL_GetUID(uint32_t *UID); #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ defined(STM32F469xx) || defined(STM32F479xx) void HAL_EnableMemorySwappingBank(void); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h index 366dbfc..56bbc4a 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_adc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file containing functions prototypes of ADC HAL library. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,34 +172,34 @@ typedef struct * @brief HAL ADC state machine: ADC states definition (bitfields) */ /* States of ADC global scope */ -#define HAL_ADC_STATE_RESET ((uint32_t)0x00000000U) /*!< ADC not yet initialized or disabled */ -#define HAL_ADC_STATE_READY ((uint32_t)0x00000001U) /*!< ADC peripheral ready for use */ -#define HAL_ADC_STATE_BUSY_INTERNAL ((uint32_t)0x00000002U) /*!< ADC is busy to internal process (initialization, calibration) */ -#define HAL_ADC_STATE_TIMEOUT ((uint32_t)0x00000004U) /*!< TimeOut occurrence */ +#define HAL_ADC_STATE_RESET 0x00000000U /*!< ADC not yet initialized or disabled */ +#define HAL_ADC_STATE_READY 0x00000001U /*!< ADC peripheral ready for use */ +#define HAL_ADC_STATE_BUSY_INTERNAL 0x00000002U /*!< ADC is busy to internal process (initialization, calibration) */ +#define HAL_ADC_STATE_TIMEOUT 0x00000004U /*!< TimeOut occurrence */ /* States of ADC errors */ -#define HAL_ADC_STATE_ERROR_INTERNAL ((uint32_t)0x00000010U) /*!< Internal error occurrence */ -#define HAL_ADC_STATE_ERROR_CONFIG ((uint32_t)0x00000020U) /*!< Configuration error occurrence */ -#define HAL_ADC_STATE_ERROR_DMA ((uint32_t)0x00000040U) /*!< DMA error occurrence */ +#define HAL_ADC_STATE_ERROR_INTERNAL 0x00000010U /*!< Internal error occurrence */ +#define HAL_ADC_STATE_ERROR_CONFIG 0x00000020U /*!< Configuration error occurrence */ +#define HAL_ADC_STATE_ERROR_DMA 0x00000040U /*!< DMA error occurrence */ /* States of ADC group regular */ -#define HAL_ADC_STATE_REG_BUSY ((uint32_t)0x00000100U) /*!< A conversion on group regular is ongoing or can occur (either by continuous mode, - external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ -#define HAL_ADC_STATE_REG_EOC ((uint32_t)0x00000200U) /*!< Conversion data available on group regular */ -#define HAL_ADC_STATE_REG_OVR ((uint32_t)0x00000400U) /*!< Overrun occurrence */ +#define HAL_ADC_STATE_REG_BUSY 0x00000100U /*!< A conversion on group regular is ongoing or can occur (either by continuous mode, + external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ +#define HAL_ADC_STATE_REG_EOC 0x00000200U /*!< Conversion data available on group regular */ +#define HAL_ADC_STATE_REG_OVR 0x00000400U /*!< Overrun occurrence */ /* States of ADC group injected */ -#define HAL_ADC_STATE_INJ_BUSY ((uint32_t)0x00001000U) /*!< A conversion on group injected is ongoing or can occur (either by auto-injection mode, - external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ -#define HAL_ADC_STATE_INJ_EOC ((uint32_t)0x00002000U) /*!< Conversion data available on group injected */ +#define HAL_ADC_STATE_INJ_BUSY 0x00001000U /*!< A conversion on group injected is ongoing or can occur (either by auto-injection mode, + external trigger, low power auto power-on (if feature available), multimode ADC master control (if feature available)) */ +#define HAL_ADC_STATE_INJ_EOC 0x00002000U /*!< Conversion data available on group injected */ /* States of ADC analog watchdogs */ -#define HAL_ADC_STATE_AWD1 ((uint32_t)0x00010000U) /*!< Out-of-window occurrence of analog watchdog 1 */ -#define HAL_ADC_STATE_AWD2 ((uint32_t)0x00020000U) /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 2 */ -#define HAL_ADC_STATE_AWD3 ((uint32_t)0x00040000U) /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 3 */ +#define HAL_ADC_STATE_AWD1 0x00010000U /*!< Out-of-window occurrence of analog watchdog 1 */ +#define HAL_ADC_STATE_AWD2 0x00020000U /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 2 */ +#define HAL_ADC_STATE_AWD3 0x00040000U /*!< Not available on STM32F4 device: Out-of-window occurrence of analog watchdog 3 */ /* States of ADC multi-mode */ -#define HAL_ADC_STATE_MULTIMODE_SLAVE ((uint32_t)0x00100000U) /*!< Not available on STM32F4 device: ADC in multimode slave state, controlled by another ADC master ( */ +#define HAL_ADC_STATE_MULTIMODE_SLAVE 0x00100000U /*!< Not available on STM32F4 device: ADC in multimode slave state, controlled by another ADC master ( */ /** @@ -233,11 +233,11 @@ typedef struct /** @defgroup ADC_Error_Code ADC Error Code * @{ */ -#define HAL_ADC_ERROR_NONE ((uint32_t)0x00U) /*!< No error */ -#define HAL_ADC_ERROR_INTERNAL ((uint32_t)0x01U) /*!< ADC IP internal error: if problem of clocking, - enable/disable, erroneous state */ -#define HAL_ADC_ERROR_OVR ((uint32_t)0x02U) /*!< Overrun error */ -#define HAL_ADC_ERROR_DMA ((uint32_t)0x04U) /*!< DMA transfer error */ +#define HAL_ADC_ERROR_NONE 0x00U /*!< No error */ +#define HAL_ADC_ERROR_INTERNAL 0x01U /*!< ADC IP internal error: if problem of clocking, + enable/disable, erroneous state */ +#define HAL_ADC_ERROR_OVR 0x02U /*!< Overrun error */ +#define HAL_ADC_ERROR_DMA 0x04U /*!< DMA transfer error */ /** * @} */ @@ -246,7 +246,7 @@ typedef struct /** @defgroup ADC_ClockPrescaler ADC Clock Prescaler * @{ */ -#define ADC_CLOCK_SYNC_PCLK_DIV2 ((uint32_t)0x00000000U) +#define ADC_CLOCK_SYNC_PCLK_DIV2 0x00000000U #define ADC_CLOCK_SYNC_PCLK_DIV4 ((uint32_t)ADC_CCR_ADCPRE_0) #define ADC_CLOCK_SYNC_PCLK_DIV6 ((uint32_t)ADC_CCR_ADCPRE_1) #define ADC_CLOCK_SYNC_PCLK_DIV8 ((uint32_t)ADC_CCR_ADCPRE) @@ -257,7 +257,7 @@ typedef struct /** @defgroup ADC_delay_between_2_sampling_phases ADC Delay Between 2 Sampling Phases * @{ */ -#define ADC_TWOSAMPLINGDELAY_5CYCLES ((uint32_t)0x00000000U) +#define ADC_TWOSAMPLINGDELAY_5CYCLES 0x00000000U #define ADC_TWOSAMPLINGDELAY_6CYCLES ((uint32_t)ADC_CCR_DELAY_0) #define ADC_TWOSAMPLINGDELAY_7CYCLES ((uint32_t)ADC_CCR_DELAY_1) #define ADC_TWOSAMPLINGDELAY_8CYCLES ((uint32_t)(ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0)) @@ -280,7 +280,7 @@ typedef struct /** @defgroup ADC_Resolution ADC Resolution * @{ */ -#define ADC_RESOLUTION_12B ((uint32_t)0x00000000U) +#define ADC_RESOLUTION_12B 0x00000000U #define ADC_RESOLUTION_10B ((uint32_t)ADC_CR1_RES_0) #define ADC_RESOLUTION_8B ((uint32_t)ADC_CR1_RES_1) #define ADC_RESOLUTION_6B ((uint32_t)ADC_CR1_RES) @@ -291,7 +291,7 @@ typedef struct /** @defgroup ADC_External_trigger_edge_Regular ADC External Trigger Edge Regular * @{ */ -#define ADC_EXTERNALTRIGCONVEDGE_NONE ((uint32_t)0x00000000U) +#define ADC_EXTERNALTRIGCONVEDGE_NONE 0x00000000U #define ADC_EXTERNALTRIGCONVEDGE_RISING ((uint32_t)ADC_CR2_EXTEN_0) #define ADC_EXTERNALTRIGCONVEDGE_FALLING ((uint32_t)ADC_CR2_EXTEN_1) #define ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING ((uint32_t)ADC_CR2_EXTEN) @@ -304,7 +304,7 @@ typedef struct */ /* Note: Parameter ADC_SOFTWARE_START is a software parameter used for */ /* compatibility with other STM32 devices. */ -#define ADC_EXTERNALTRIGCONV_T1_CC1 ((uint32_t)0x00000000U) +#define ADC_EXTERNALTRIGCONV_T1_CC1 0x00000000U #define ADC_EXTERNALTRIGCONV_T1_CC2 ((uint32_t)ADC_CR2_EXTSEL_0) #define ADC_EXTERNALTRIGCONV_T1_CC3 ((uint32_t)ADC_CR2_EXTSEL_1) #define ADC_EXTERNALTRIGCONV_T2_CC2 ((uint32_t)(ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0)) @@ -328,7 +328,7 @@ typedef struct /** @defgroup ADC_Data_align ADC Data Align * @{ */ -#define ADC_DATAALIGN_RIGHT ((uint32_t)0x00000000U) +#define ADC_DATAALIGN_RIGHT 0x00000000U #define ADC_DATAALIGN_LEFT ((uint32_t)ADC_CR2_ALIGN) /** * @} @@ -337,7 +337,7 @@ typedef struct /** @defgroup ADC_channels ADC Common Channels * @{ */ -#define ADC_CHANNEL_0 ((uint32_t)0x00000000U) +#define ADC_CHANNEL_0 0x00000000U #define ADC_CHANNEL_1 ((uint32_t)ADC_CR1_AWDCH_0) #define ADC_CHANNEL_2 ((uint32_t)ADC_CR1_AWDCH_1) #define ADC_CHANNEL_3 ((uint32_t)(ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0)) @@ -366,7 +366,7 @@ typedef struct /** @defgroup ADC_sampling_times ADC Sampling Times * @{ */ -#define ADC_SAMPLETIME_3CYCLES ((uint32_t)0x00000000U) +#define ADC_SAMPLETIME_3CYCLES 0x00000000U #define ADC_SAMPLETIME_15CYCLES ((uint32_t)ADC_SMPR1_SMP10_0) #define ADC_SAMPLETIME_28CYCLES ((uint32_t)ADC_SMPR1_SMP10_1) #define ADC_SAMPLETIME_56CYCLES ((uint32_t)(ADC_SMPR1_SMP10_1 | ADC_SMPR1_SMP10_0)) @@ -381,9 +381,9 @@ typedef struct /** @defgroup ADC_EOCSelection ADC EOC Selection * @{ */ -#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000U) -#define ADC_EOC_SINGLE_CONV ((uint32_t)0x00000001U) -#define ADC_EOC_SINGLE_SEQ_CONV ((uint32_t)0x00000002U) /*!< reserved for future use */ +#define ADC_EOC_SEQ_CONV 0x00000000U +#define ADC_EOC_SINGLE_CONV 0x00000001U +#define ADC_EOC_SINGLE_SEQ_CONV 0x00000002U /*!< reserved for future use */ /** * @} */ @@ -406,7 +406,7 @@ typedef struct #define ADC_ANALOGWATCHDOG_ALL_REG ((uint32_t)ADC_CR1_AWDEN) #define ADC_ANALOGWATCHDOG_ALL_INJEC ((uint32_t)ADC_CR1_JAWDEN) #define ADC_ANALOGWATCHDOG_ALL_REGINJEC ((uint32_t)(ADC_CR1_AWDEN | ADC_CR1_JAWDEN)) -#define ADC_ANALOGWATCHDOG_NONE ((uint32_t)0x00000000U) +#define ADC_ANALOGWATCHDOG_NONE 0x00000000U /** * @} */ @@ -438,9 +438,9 @@ typedef struct /** @defgroup ADC_channels_type ADC Channels Type * @{ */ -#define ADC_ALL_CHANNELS ((uint32_t)0x00000001U) -#define ADC_REGULAR_CHANNELS ((uint32_t)0x00000002U) /*!< reserved for future use */ -#define ADC_INJECTED_CHANNELS ((uint32_t)0x00000003U) /*!< reserved for future use */ +#define ADC_ALL_CHANNELS 0x00000001U +#define ADC_REGULAR_CHANNELS 0x00000002U /*!< reserved for future use */ +#define ADC_INJECTED_CHANNELS 0x00000003U /*!< reserved for future use */ /** * @} */ @@ -597,11 +597,11 @@ uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc); /* Delay for ADC stabilization time. */ /* Maximum delay is 1us (refer to device datasheet, parameter tSTAB). */ /* Unit: us */ -#define ADC_STAB_DELAY_US ((uint32_t) 3U) +#define ADC_STAB_DELAY_US 3U /* Delay for temperature sensor stabilization time. */ /* Maximum delay is 10us (refer to device datasheet, parameter tSTART). */ /* Unit: us */ -#define ADC_TEMPSENSOR_DELAY_US ((uint32_t) 10U) +#define ADC_TEMPSENSOR_DELAY_US 10U /** * @} */ @@ -729,16 +729,16 @@ uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc); #define IS_ADC_CHANNELS_TYPE(CHANNEL_TYPE) (((CHANNEL_TYPE) == ADC_ALL_CHANNELS) || \ ((CHANNEL_TYPE) == ADC_REGULAR_CHANNELS) || \ ((CHANNEL_TYPE) == ADC_INJECTED_CHANNELS)) -#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= ((uint32_t)0xFFFU)) +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFFU) -#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= ((uint32_t)1U)) && ((LENGTH) <= ((uint32_t)16U))) -#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= ((uint32_t)1U)) && ((RANK) <= ((uint32_t)16U))) -#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= ((uint32_t)1U)) && ((NUMBER) <= ((uint32_t)8U))) +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 1U) && ((LENGTH) <= 16U)) +#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 1U) && ((RANK) <= (16U))) +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 1U) && ((NUMBER) <= 8U)) #define IS_ADC_RANGE(RESOLUTION, ADC_VALUE) \ - ((((RESOLUTION) == ADC_RESOLUTION_12B) && ((ADC_VALUE) <= ((uint32_t)0x0FFFU))) || \ - (((RESOLUTION) == ADC_RESOLUTION_10B) && ((ADC_VALUE) <= ((uint32_t)0x03FFU))) || \ - (((RESOLUTION) == ADC_RESOLUTION_8B) && ((ADC_VALUE) <= ((uint32_t)0x00FFU))) || \ - (((RESOLUTION) == ADC_RESOLUTION_6B) && ((ADC_VALUE) <= ((uint32_t)0x003FU)))) + ((((RESOLUTION) == ADC_RESOLUTION_12B) && ((ADC_VALUE) <= 0x0FFFU)) || \ + (((RESOLUTION) == ADC_RESOLUTION_10B) && ((ADC_VALUE) <= 0x03FFU)) || \ + (((RESOLUTION) == ADC_RESOLUTION_8B) && ((ADC_VALUE) <= 0x00FFU)) || \ + (((RESOLUTION) == ADC_RESOLUTION_6B) && ((ADC_VALUE) <= 0x003FU))) /** * @brief Set ADC Regular channel sequence length. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h index c542ebc..067342f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_adc_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of ADC HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -152,7 +152,7 @@ typedef struct /** @defgroup ADCEx_Common_mode ADC Common Mode * @{ */ -#define ADC_MODE_INDEPENDENT ((uint32_t)0x00000000U) +#define ADC_MODE_INDEPENDENT 0x00000000U #define ADC_DUALMODE_REGSIMULT_INJECSIMULT ((uint32_t)ADC_CCR_MULTI_0) #define ADC_DUALMODE_REGSIMULT_ALTERTRIG ((uint32_t)ADC_CCR_MULTI_1) #define ADC_DUALMODE_INJECSIMULT ((uint32_t)(ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0)) @@ -172,7 +172,7 @@ typedef struct /** @defgroup ADCEx_Direct_memory_access_mode_for_multi_mode ADC Direct Memory Access Mode For Multi Mode * @{ */ -#define ADC_DMAACCESSMODE_DISABLED ((uint32_t)0x00000000U) /*!< DMA mode disabled */ +#define ADC_DMAACCESSMODE_DISABLED 0x00000000U /*!< DMA mode disabled */ #define ADC_DMAACCESSMODE_1 ((uint32_t)ADC_CCR_DMA_0) /*!< DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)*/ #define ADC_DMAACCESSMODE_2 ((uint32_t)ADC_CCR_DMA_1) /*!< DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2)*/ #define ADC_DMAACCESSMODE_3 ((uint32_t)ADC_CCR_DMA) /*!< DMA mode 3 enabled (2 / 3 bytes by pairs - 2&1 then 1&3 then 3&2) */ @@ -183,7 +183,7 @@ typedef struct /** @defgroup ADCEx_External_trigger_edge_Injected ADC External Trigger Edge Injected * @{ */ -#define ADC_EXTERNALTRIGINJECCONVEDGE_NONE ((uint32_t)0x00000000U) +#define ADC_EXTERNALTRIGINJECCONVEDGE_NONE 0x00000000U #define ADC_EXTERNALTRIGINJECCONVEDGE_RISING ((uint32_t)ADC_CR2_JEXTEN_0) #define ADC_EXTERNALTRIGINJECCONVEDGE_FALLING ((uint32_t)ADC_CR2_JEXTEN_1) #define ADC_EXTERNALTRIGINJECCONVEDGE_RISINGFALLING ((uint32_t)ADC_CR2_JEXTEN) @@ -194,7 +194,7 @@ typedef struct /** @defgroup ADCEx_External_trigger_Source_Injected ADC External Trigger Source Injected * @{ */ -#define ADC_EXTERNALTRIGINJECCONV_T1_CC4 ((uint32_t)0x00000000U) +#define ADC_EXTERNALTRIGINJECCONV_T1_CC4 0x00000000U #define ADC_EXTERNALTRIGINJECCONV_T1_TRGO ((uint32_t)ADC_CR2_JEXTSEL_0) #define ADC_EXTERNALTRIGINJECCONV_T2_CC1 ((uint32_t)ADC_CR2_JEXTSEL_1) #define ADC_EXTERNALTRIGINJECCONV_T2_TRGO ((uint32_t)(ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0)) @@ -218,10 +218,10 @@ typedef struct /** @defgroup ADCEx_injected_rank ADC Injected Rank * @{ */ -#define ADC_INJECTED_RANK_1 ((uint32_t)0x00000001U) -#define ADC_INJECTED_RANK_2 ((uint32_t)0x00000002U) -#define ADC_INJECTED_RANK_3 ((uint32_t)0x00000003U) -#define ADC_INJECTED_RANK_4 ((uint32_t)0x00000004U) +#define ADC_INJECTED_RANK_1 0x00000001U +#define ADC_INJECTED_RANK_2 0x00000002U +#define ADC_INJECTED_RANK_3 0x00000003U +#define ADC_INJECTED_RANK_4 0x00000004U /** * @} */ @@ -239,7 +239,7 @@ typedef struct #if defined(STM32F411xE) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT ((uint32_t)0x10000000U) /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ +#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ #define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) #endif /* STM32F411xE || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ /** @@ -372,8 +372,8 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_ ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_T8_CC4) || \ ((INJTRIG) == ADC_EXTERNALTRIGINJECCONV_EXT_IT15)|| \ ((INJTRIG) == ADC_INJECTED_SOFTWARE_START)) -#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= ((uint32_t)1U)) && ((LENGTH) <= ((uint32_t)4U))) -#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= ((uint32_t)1U)) && ((RANK) <= ((uint32_t)4U))) +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 1U) && ((LENGTH) <= 4U)) +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 1U) && ((RANK) <= 4U)) /** * @brief Set the selected injected Channel rank. @@ -384,6 +384,17 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_ */ #define ADC_JSQR(_CHANNELNB_, _RANKNB_, _JSQR_JL_) (((uint32_t)((uint16_t)(_CHANNELNB_))) << (5U * (uint8_t)(((_RANKNB_) + 3U) - (_JSQR_JL_)))) +/** + * @brief Defines if the selected ADC is within ADC common register ADC123 or ADC1 + * if available (ADC2, ADC3 availability depends on STM32 product) + * @param __HANDLE__: ADC handle + * @retval Common control register ADC123 or ADC1 + */ +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define ADC_COMMON_REGISTER(__HANDLE__) ADC123_COMMON +#else +#define ADC_COMMON_REGISTER(__HANDLE__) ADC1_COMMON +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx || STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h index 8d6b97e..4031cf1 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_can.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_can.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CAN HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -73,9 +73,13 @@ typedef enum HAL_CAN_STATE_READY = 0x01U, /*!< CAN initialized and ready for use */ HAL_CAN_STATE_BUSY = 0x02U, /*!< CAN process is ongoing */ HAL_CAN_STATE_BUSY_TX = 0x12U, /*!< CAN process is ongoing */ - HAL_CAN_STATE_BUSY_RX = 0x22U, /*!< CAN process is ongoing */ - HAL_CAN_STATE_BUSY_TX_RX = 0x32U, /*!< CAN process is ongoing */ - HAL_CAN_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_CAN_STATE_BUSY_RX0 = 0x22U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_BUSY_RX1 = 0x32U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_BUSY_TX_RX0 = 0x42U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_BUSY_TX_RX1 = 0x52U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_BUSY_RX0_RX1 = 0x62U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_BUSY_TX_RX0_RX1 = 0x72U, /*!< CAN process is ongoing */ + HAL_CAN_STATE_TIMEOUT = 0x03U, /*!< CAN in Timeout state */ HAL_CAN_STATE_ERROR = 0x04U /*!< CAN error state */ }HAL_CAN_StateTypeDef; @@ -128,21 +132,21 @@ typedef struct { uint32_t FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit configuration, first one for a 16-bit configuration). - This parameter must be a number between Min_Data = 0x0000U and Max_Data = 0xFFFFU */ + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ uint32_t FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit configuration, second one for a 16-bit configuration). - This parameter must be a number between Min_Data = 0x0000U and Max_Data = 0xFFFFU */ + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ uint32_t FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, according to the mode (MSBs for a 32-bit configuration, first one for a 16-bit configuration). - This parameter must be a number between Min_Data = 0x0000U and Max_Data = 0xFFFFU */ + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ uint32_t FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, according to the mode (LSBs for a 32-bit configuration, second one for a 16-bit configuration). - This parameter must be a number between Min_Data = 0x0000U and Max_Data = 0xFFFFU */ + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ uint32_t FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. This parameter can be a value of @ref CAN_filter_FIFO */ @@ -173,7 +177,7 @@ typedef struct This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */ uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFFU */ + This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */ uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. This parameter can be a value of @ref CAN_Identifier_Type */ @@ -198,7 +202,7 @@ typedef struct This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */ uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFFU */ + This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */ uint32_t IDE; /*!< Specifies the type of identifier for the message that will be received. This parameter can be a value of @ref CAN_Identifier_Type */ @@ -231,7 +235,9 @@ typedef struct CanTxMsgTypeDef* pTxMsg; /*!< Pointer to transmit structure */ - CanRxMsgTypeDef* pRxMsg; /*!< Pointer to reception structure */ + CanRxMsgTypeDef* pRxMsg; /*!< Pointer to reception structure for RX FIFO0 msg */ + + CanRxMsgTypeDef* pRx1Msg; /*!< Pointer to reception structure for RX FIFO1 msg */ __IO HAL_CAN_StateTypeDef State; /*!< CAN communication state */ @@ -253,16 +259,19 @@ typedef struct /** @defgroup CAN_Error_Code CAN Error Code * @{ */ -#define HAL_CAN_ERROR_NONE 0x00U /*!< No error */ -#define HAL_CAN_ERROR_EWG 0x01U /*!< EWG error */ -#define HAL_CAN_ERROR_EPV 0x02U /*!< EPV error */ -#define HAL_CAN_ERROR_BOF 0x04U /*!< BOF error */ -#define HAL_CAN_ERROR_STF 0x08U /*!< Stuff error */ -#define HAL_CAN_ERROR_FOR 0x10U /*!< Form error */ -#define HAL_CAN_ERROR_ACK 0x20U /*!< Acknowledgment error */ -#define HAL_CAN_ERROR_BR 0x40U /*!< Bit recessive */ -#define HAL_CAN_ERROR_BD 0x80U /*!< LEC dominant */ -#define HAL_CAN_ERROR_CRC 0x100U /*!< LEC transfer error */ +#define HAL_CAN_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_CAN_ERROR_EWG 0x00000001U /*!< EWG error */ +#define HAL_CAN_ERROR_EPV 0x00000002U /*!< EPV error */ +#define HAL_CAN_ERROR_BOF 0x00000004U /*!< BOF error */ +#define HAL_CAN_ERROR_STF 0x00000008U /*!< Stuff error */ +#define HAL_CAN_ERROR_FOR 0x00000010U /*!< Form error */ +#define HAL_CAN_ERROR_ACK 0x00000020U /*!< Acknowledgment error */ +#define HAL_CAN_ERROR_BR 0x00000040U /*!< Bit recessive */ +#define HAL_CAN_ERROR_BD 0x00000080U /*!< LEC dominant */ +#define HAL_CAN_ERROR_CRC 0x00000100U /*!< LEC transfer error */ +#define HAL_CAN_ERROR_FOV0 0x00000200U /*!< FIFO0 overrun error */ +#define HAL_CAN_ERROR_FOV1 0x00000400U /*!< FIFO1 overrun error */ +#define HAL_CAN_ERROR_TXFAIL 0x00000800U /*!< Transmit failure */ /** * @} */ @@ -270,8 +279,8 @@ typedef struct /** @defgroup CAN_InitStatus CAN InitStatus * @{ */ -#define CAN_INITSTATUS_FAILED ((uint8_t)0x00U) /*!< CAN initialization failed */ -#define CAN_INITSTATUS_SUCCESS ((uint8_t)0x01U) /*!< CAN initialization OK */ +#define CAN_INITSTATUS_FAILED ((uint8_t)0x00) /*!< CAN initialization failed */ +#define CAN_INITSTATUS_SUCCESS ((uint8_t)0x01) /*!< CAN initialization OK */ /** * @} */ @@ -279,7 +288,7 @@ typedef struct /** @defgroup CAN_operating_mode CAN Operating Mode * @{ */ -#define CAN_MODE_NORMAL ((uint32_t)0x00000000U) /*!< Normal mode */ +#define CAN_MODE_NORMAL 0x00000000U /*!< Normal mode */ #define CAN_MODE_LOOPBACK ((uint32_t)CAN_BTR_LBKM) /*!< Loopback mode */ #define CAN_MODE_SILENT ((uint32_t)CAN_BTR_SILM) /*!< Silent mode */ #define CAN_MODE_SILENT_LOOPBACK ((uint32_t)(CAN_BTR_LBKM | CAN_BTR_SILM)) /*!< Loopback combined with silent mode */ @@ -290,7 +299,7 @@ typedef struct /** @defgroup CAN_synchronisation_jump_width CAN Synchronisation Jump Width * @{ */ -#define CAN_SJW_1TQ ((uint32_t)0x00000000U) /*!< 1 time quantum */ +#define CAN_SJW_1TQ 0x00000000U /*!< 1 time quantum */ #define CAN_SJW_2TQ ((uint32_t)CAN_BTR_SJW_0) /*!< 2 time quantum */ #define CAN_SJW_3TQ ((uint32_t)CAN_BTR_SJW_1) /*!< 3 time quantum */ #define CAN_SJW_4TQ ((uint32_t)CAN_BTR_SJW) /*!< 4 time quantum */ @@ -301,7 +310,7 @@ typedef struct /** @defgroup CAN_time_quantum_in_bit_segment_1 CAN Time Quantum in bit segment 1 * @{ */ -#define CAN_BS1_1TQ ((uint32_t)0x00000000U) /*!< 1 time quantum */ +#define CAN_BS1_1TQ 0x00000000U /*!< 1 time quantum */ #define CAN_BS1_2TQ ((uint32_t)CAN_BTR_TS1_0) /*!< 2 time quantum */ #define CAN_BS1_3TQ ((uint32_t)CAN_BTR_TS1_1) /*!< 3 time quantum */ #define CAN_BS1_4TQ ((uint32_t)(CAN_BTR_TS1_1 | CAN_BTR_TS1_0)) /*!< 4 time quantum */ @@ -324,7 +333,7 @@ typedef struct /** @defgroup CAN_time_quantum_in_bit_segment_2 CAN Time Quantum in bit segment 2 * @{ */ -#define CAN_BS2_1TQ ((uint32_t)0x00000000U) /*!< 1 time quantum */ +#define CAN_BS2_1TQ 0x00000000U /*!< 1 time quantum */ #define CAN_BS2_2TQ ((uint32_t)CAN_BTR_TS2_0) /*!< 2 time quantum */ #define CAN_BS2_3TQ ((uint32_t)CAN_BTR_TS2_1) /*!< 3 time quantum */ #define CAN_BS2_4TQ ((uint32_t)(CAN_BTR_TS2_1 | CAN_BTR_TS2_0)) /*!< 4 time quantum */ @@ -339,8 +348,8 @@ typedef struct /** @defgroup CAN_filter_mode CAN Filter Mode * @{ */ -#define CAN_FILTERMODE_IDMASK ((uint8_t)0x00U) /*!< Identifier mask mode */ -#define CAN_FILTERMODE_IDLIST ((uint8_t)0x01U) /*!< Identifier list mode */ +#define CAN_FILTERMODE_IDMASK ((uint8_t)0x00) /*!< Identifier mask mode */ +#define CAN_FILTERMODE_IDLIST ((uint8_t)0x01) /*!< Identifier list mode */ /** * @} */ @@ -348,8 +357,8 @@ typedef struct /** @defgroup CAN_filter_scale CAN Filter Scale * @{ */ -#define CAN_FILTERSCALE_16BIT ((uint8_t)0x00U) /*!< Two 16-bit filters */ -#define CAN_FILTERSCALE_32BIT ((uint8_t)0x01U) /*!< One 32-bit filter */ +#define CAN_FILTERSCALE_16BIT ((uint8_t)0x00) /*!< Two 16-bit filters */ +#define CAN_FILTERSCALE_32BIT ((uint8_t)0x01) /*!< One 32-bit filter */ /** * @} */ @@ -357,8 +366,8 @@ typedef struct /** @defgroup CAN_filter_FIFO CAN Filter FIFO * @{ */ -#define CAN_FILTER_FIFO0 ((uint8_t)0x00U) /*!< Filter FIFO 0 assignment for filter x */ -#define CAN_FILTER_FIFO1 ((uint8_t)0x01U) /*!< Filter FIFO 1 assignment for filter x */ +#define CAN_FILTER_FIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ +#define CAN_FILTER_FIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ /** * @} */ @@ -366,8 +375,8 @@ typedef struct /** @defgroup CAN_Identifier_Type CAN Identifier Type * @{ */ -#define CAN_ID_STD ((uint32_t)0x00000000U) /*!< Standard Id */ -#define CAN_ID_EXT ((uint32_t)0x00000004U) /*!< Extended Id */ +#define CAN_ID_STD 0x00000000U /*!< Standard Id */ +#define CAN_ID_EXT 0x00000004U /*!< Extended Id */ /** * @} */ @@ -375,8 +384,8 @@ typedef struct /** @defgroup CAN_remote_transmission_request CAN Remote Transmission Request * @{ */ -#define CAN_RTR_DATA ((uint32_t)0x00000000U) /*!< Data frame */ -#define CAN_RTR_REMOTE ((uint32_t)0x00000002U) /*!< Remote frame */ +#define CAN_RTR_DATA 0x00000000U /*!< Data frame */ +#define CAN_RTR_REMOTE 0x00000002U /*!< Remote frame */ /** * @} */ @@ -384,8 +393,8 @@ typedef struct /** @defgroup CAN_receive_FIFO_number_constants CAN Receive FIFO Number Constants * @{ */ -#define CAN_FIFO0 ((uint8_t)0x00U) /*!< CAN FIFO 0 used to receive */ -#define CAN_FIFO1 ((uint8_t)0x01U) /*!< CAN FIFO 1 used to receive */ +#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO 0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO 1 used to receive */ /** * @} */ @@ -399,37 +408,37 @@ typedef struct CAN_GetFlagStatus() function. */ /* Transmit Flags */ -#define CAN_FLAG_RQCP0 ((uint32_t)0x00000500U) /*!< Request MailBox0 flag */ -#define CAN_FLAG_RQCP1 ((uint32_t)0x00000508U) /*!< Request MailBox1 flag */ -#define CAN_FLAG_RQCP2 ((uint32_t)0x00000510U) /*!< Request MailBox2 flag */ -#define CAN_FLAG_TXOK0 ((uint32_t)0x00000501U) /*!< Transmission OK MailBox0 flag */ -#define CAN_FLAG_TXOK1 ((uint32_t)0x00000509U) /*!< Transmission OK MailBox1 flag */ -#define CAN_FLAG_TXOK2 ((uint32_t)0x00000511U) /*!< Transmission OK MailBox2 flag */ -#define CAN_FLAG_TME0 ((uint32_t)0x0000051AU) /*!< Transmit mailbox 0 empty flag */ -#define CAN_FLAG_TME1 ((uint32_t)0x0000051BU) /*!< Transmit mailbox 0 empty flag */ -#define CAN_FLAG_TME2 ((uint32_t)0x0000051CU) /*!< Transmit mailbox 0 empty flag */ +#define CAN_FLAG_RQCP0 0x00000500U /*!< Request MailBox0 flag */ +#define CAN_FLAG_RQCP1 0x00000508U /*!< Request MailBox1 flag */ +#define CAN_FLAG_RQCP2 0x00000510U /*!< Request MailBox2 flag */ +#define CAN_FLAG_TXOK0 0x00000501U /*!< Transmission OK MailBox0 flag */ +#define CAN_FLAG_TXOK1 0x00000509U /*!< Transmission OK MailBox1 flag */ +#define CAN_FLAG_TXOK2 0x00000511U /*!< Transmission OK MailBox2 flag */ +#define CAN_FLAG_TME0 0x0000051AU /*!< Transmit mailbox 0 empty flag */ +#define CAN_FLAG_TME1 0x0000051BU /*!< Transmit mailbox 0 empty flag */ +#define CAN_FLAG_TME2 0x0000051CU /*!< Transmit mailbox 0 empty flag */ /* Receive Flags */ -#define CAN_FLAG_FF0 ((uint32_t)0x00000203U) /*!< FIFO 0 Full flag */ -#define CAN_FLAG_FOV0 ((uint32_t)0x00000204U) /*!< FIFO 0 Overrun flag */ +#define CAN_FLAG_FF0 0x00000203U /*!< FIFO 0 Full flag */ +#define CAN_FLAG_FOV0 0x00000204U /*!< FIFO 0 Overrun flag */ -#define CAN_FLAG_FF1 ((uint32_t)0x00000403U) /*!< FIFO 1 Full flag */ -#define CAN_FLAG_FOV1 ((uint32_t)0x00000404U) /*!< FIFO 1 Overrun flag */ +#define CAN_FLAG_FF1 0x00000403U /*!< FIFO 1 Full flag */ +#define CAN_FLAG_FOV1 0x00000404U /*!< FIFO 1 Overrun flag */ /* Operating Mode Flags */ -#define CAN_FLAG_INAK ((uint32_t)0x00000100U) /*!< Initialization acknowledge flag */ -#define CAN_FLAG_SLAK ((uint32_t)0x00000101U) /*!< Sleep acknowledge flag */ -#define CAN_FLAG_ERRI ((uint32_t)0x00000102U) /*!< Error flag */ -#define CAN_FLAG_WKU ((uint32_t)0x00000103U) /*!< Wake up flag */ -#define CAN_FLAG_SLAKI ((uint32_t)0x00000104U) /*!< Sleep acknowledge flag */ +#define CAN_FLAG_INAK 0x00000100U /*!< Initialization acknowledge flag */ +#define CAN_FLAG_SLAK 0x00000101U /*!< Sleep acknowledge flag */ +#define CAN_FLAG_ERRI 0x00000102U /*!< Error flag */ +#define CAN_FLAG_WKU 0x00000103U /*!< Wake up flag */ +#define CAN_FLAG_SLAKI 0x00000104U /*!< Sleep acknowledge flag */ /* @note When SLAK interrupt is disabled (SLKIE=0), no polling on SLAKI is possible. In this case the SLAK bit can be polled.*/ /* Error Flags */ -#define CAN_FLAG_EWG ((uint32_t)0x00000300U) /*!< Error warning flag */ -#define CAN_FLAG_EPV ((uint32_t)0x00000301U) /*!< Error passive flag */ -#define CAN_FLAG_BOF ((uint32_t)0x00000302U) /*!< Bus-Off flag */ +#define CAN_FLAG_EWG 0x00000300U /*!< Error warning flag */ +#define CAN_FLAG_EPV 0x00000301U /*!< Error passive flag */ +#define CAN_FLAG_BOF 0x00000302U /*!< Bus-Off flag */ /** * @} */ @@ -464,9 +473,9 @@ typedef struct /** @defgroup CAN_Mailboxes_Definition CAN Mailboxes Definition * @{ */ -#define CAN_TXMAILBOX_0 ((uint8_t)0x00U) -#define CAN_TXMAILBOX_1 ((uint8_t)0x01U) -#define CAN_TXMAILBOX_2 ((uint8_t)0x02U) +#define CAN_TXMAILBOX_0 ((uint8_t)0x00) +#define CAN_TXMAILBOX_1 ((uint8_t)0x01) +#define CAN_TXMAILBOX_2 ((uint8_t)0x02) /** * @} */ @@ -509,7 +518,7 @@ typedef struct * @retval The number of pending message. */ #define __HAL_CAN_MSG_PENDING(__HANDLE__, __FIFONUMBER__) (((__FIFONUMBER__) == CAN_FIFO0)? \ -((uint8_t)((__HANDLE__)->Instance->RF0R&(uint32_t)0x03U)) : ((uint8_t)((__HANDLE__)->Instance->RF1R & (uint32_t)0x03U))) +((uint8_t)((__HANDLE__)->Instance->RF0R&0x03U)) : ((uint8_t)((__HANDLE__)->Instance->RF1R & 0x03U))) /** @brief Check whether the specified CAN flag is set or not. * @param __HANDLE__: CAN Handle @@ -570,9 +579,9 @@ typedef struct * @retval The new state of __FLAG__ (TRUE or FALSE). */ #define __HAL_CAN_CLEAR_FLAG(__HANDLE__, __FLAG__) \ -((((__FLAG__) >> 8U) == 5U)? (((__HANDLE__)->Instance->TSR) = ((uint32_t)1U << ((__FLAG__) & CAN_FLAG_MASK))): \ - (((__FLAG__) >> 8U) == 2U)? (((__HANDLE__)->Instance->RF0R) = ((uint32_t)1U << ((__FLAG__) & CAN_FLAG_MASK))): \ - (((__FLAG__) >> 8U) == 4U)? (((__HANDLE__)->Instance->RF1R) = ((uint32_t)1U << ((__FLAG__) & CAN_FLAG_MASK))): \ +((((__FLAG__) >> 8U) == 5U)? (((__HANDLE__)->Instance->TSR) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 2U)? (((__HANDLE__)->Instance->RF0R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ + (((__FLAG__) >> 8U) == 4U)? (((__HANDLE__)->Instance->RF1R) = (1U << ((__FLAG__) & CAN_FLAG_MASK))): \ (((__HANDLE__)->Instance->MSR) = ((uint32_t)1U << ((__FLAG__) & CAN_FLAG_MASK)))) /** @brief Check if the specified CAN interrupt source is enabled or disabled. @@ -705,8 +714,8 @@ HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan); /** @defgroup CAN_Private_Constants CAN Private Constants * @{ */ -#define CAN_TXSTATUS_NOMAILBOX ((uint8_t)0x04U) /*!< CAN cell did not provide CAN_TxStatus_NoMailBox */ -#define CAN_FLAG_MASK ((uint32_t)0x000000FFU) +#define CAN_TXSTATUS_NOMAILBOX ((uint8_t)0x04) /*!< CAN cell did not provide CAN_TxStatus_NoMailBox */ +#define CAN_FLAG_MASK 0x000000FFU /** * @} */ @@ -733,10 +742,10 @@ HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan); ((FIFO) == CAN_FILTER_FIFO1)) #define IS_CAN_BANKNUMBER(BANKNUMBER) ((BANKNUMBER) <= 28U) -#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02U)) +#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) #define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FFU)) -#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFFU)) -#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08U)) +#define IS_CAN_EXTID(EXTID) ((EXTID) <= 0x1FFFFFFFU) +#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) #define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_ID_STD) || \ ((IDTYPE) == CAN_ID_EXT)) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cec.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cec.h index 51342e6..8aa8845 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cec.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cec.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_cec.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CEC HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -220,7 +220,7 @@ typedef struct /** @defgroup CEC_Error_Code CEC Error Code * @{ */ -#define HAL_CEC_ERROR_NONE ((uint32_t)0x00000000U)/*!< no error */ +#define HAL_CEC_ERROR_NONE 0x00000000U /*!< no error */ #define HAL_CEC_ERROR_RXOVR CEC_ISR_RXOVR /*!< CEC Rx-Overrun */ #define HAL_CEC_ERROR_BRE CEC_ISR_BRE /*!< CEC Rx Bit Rising Error */ #define HAL_CEC_ERROR_SBPE CEC_ISR_SBPE /*!< CEC Rx Short Bit period Error */ @@ -237,14 +237,14 @@ typedef struct /** @defgroup CEC_Signal_Free_Time CEC Signal Free Time setting parameter * @{ */ -#define CEC_DEFAULT_SFT ((uint32_t)0x00000000U) -#define CEC_0_5_BITPERIOD_SFT ((uint32_t)0x00000001U) -#define CEC_1_5_BITPERIOD_SFT ((uint32_t)0x00000002U) -#define CEC_2_5_BITPERIOD_SFT ((uint32_t)0x00000003U) -#define CEC_3_5_BITPERIOD_SFT ((uint32_t)0x00000004U) -#define CEC_4_5_BITPERIOD_SFT ((uint32_t)0x00000005U) -#define CEC_5_5_BITPERIOD_SFT ((uint32_t)0x00000006U) -#define CEC_6_5_BITPERIOD_SFT ((uint32_t)0x00000007U) +#define CEC_DEFAULT_SFT 0x00000000U +#define CEC_0_5_BITPERIOD_SFT 0x00000001U +#define CEC_1_5_BITPERIOD_SFT 0x00000002U +#define CEC_2_5_BITPERIOD_SFT 0x00000003U +#define CEC_3_5_BITPERIOD_SFT 0x00000004U +#define CEC_4_5_BITPERIOD_SFT 0x00000005U +#define CEC_5_5_BITPERIOD_SFT 0x00000006U +#define CEC_6_5_BITPERIOD_SFT 0x00000007U /** * @} */ @@ -252,7 +252,7 @@ typedef struct /** @defgroup CEC_Tolerance CEC Receiver Tolerance * @{ */ -#define CEC_STANDARD_TOLERANCE ((uint32_t)0x00000000U) +#define CEC_STANDARD_TOLERANCE 0x00000000U #define CEC_EXTENDED_TOLERANCE ((uint32_t)CEC_CFGR_RXTOL) /** * @} @@ -261,7 +261,7 @@ typedef struct /** @defgroup CEC_BRERxStop CEC Reception Stop on Error * @{ */ -#define CEC_NO_RX_STOP_ON_BRE ((uint32_t)0x00000000U) +#define CEC_NO_RX_STOP_ON_BRE 0x00000000U #define CEC_RX_STOP_ON_BRE ((uint32_t)CEC_CFGR_BRESTP) /** * @} @@ -270,7 +270,7 @@ typedef struct /** @defgroup CEC_BREErrorBitGen CEC Error Bit Generation if Bit Rise Error reported * @{ */ -#define CEC_BRE_ERRORBIT_NO_GENERATION ((uint32_t)0x00000000U) +#define CEC_BRE_ERRORBIT_NO_GENERATION 0x00000000U #define CEC_BRE_ERRORBIT_GENERATION ((uint32_t)CEC_CFGR_BREGEN) /** * @} @@ -279,7 +279,7 @@ typedef struct /** @defgroup CEC_LBPEErrorBitGen CEC Error Bit Generation if Long Bit Period Error reported * @{ */ -#define CEC_LBPE_ERRORBIT_NO_GENERATION ((uint32_t)0x00000000U) +#define CEC_LBPE_ERRORBIT_NO_GENERATION 0x00000000U #define CEC_LBPE_ERRORBIT_GENERATION ((uint32_t)CEC_CFGR_LBPEGEN) /** * @} @@ -288,7 +288,7 @@ typedef struct /** @defgroup CEC_BroadCastMsgErrorBitGen CEC Error Bit Generation on Broadcast message * @{ */ -#define CEC_BROADCASTERROR_ERRORBIT_GENERATION ((uint32_t)0x00000000U) +#define CEC_BROADCASTERROR_ERRORBIT_GENERATION 0x00000000U #define CEC_BROADCASTERROR_NO_ERRORBIT_GENERATION ((uint32_t)CEC_CFGR_BRDNOGEN) /** * @} @@ -297,7 +297,7 @@ typedef struct /** @defgroup CEC_SFT_Option CEC Signal Free Time start option * @{ */ -#define CEC_SFT_START_ON_TXSOM ((uint32_t)0x00000000U) +#define CEC_SFT_START_ON_TXSOM 0x00000000U #define CEC_SFT_START_ON_TX_RX_END ((uint32_t)CEC_CFGR_SFTOPT) /** * @} @@ -306,7 +306,7 @@ typedef struct /** @defgroup CEC_Listening_Mode CEC Listening mode option * @{ */ -#define CEC_REDUCED_LISTENING_MODE ((uint32_t)0x00000000U) +#define CEC_REDUCED_LISTENING_MODE 0x00000000U #define CEC_FULL_LISTENING_MODE ((uint32_t)CEC_CFGR_LSTN) /** * @} @@ -315,7 +315,7 @@ typedef struct /** @defgroup CEC_OAR_Position CEC Device Own Address position in CEC CFGR register * @{ */ -#define CEC_CFGR_OAR_LSB_POS ((uint32_t) 16U) +#define CEC_CFGR_OAR_LSB_POS 16U /** * @} */ @@ -323,7 +323,7 @@ typedef struct /** @defgroup CEC_Initiator_Position CEC Initiator logical address position in message header * @{ */ -#define CEC_INITIATOR_LSB_POS ((uint32_t) 4U) +#define CEC_INITIATOR_LSB_POS 4U /** * @} */ @@ -331,22 +331,22 @@ typedef struct /** @defgroup CEC_OWN_ADDRESS CEC Own Address * @{ */ -#define CEC_OWN_ADDRESS_NONE ((uint16_t) 0x0000U) /* Reset value */ -#define CEC_OWN_ADDRESS_0 ((uint16_t) 0x0001U) /* Logical Address 0 */ -#define CEC_OWN_ADDRESS_1 ((uint16_t) 0x0002U) /* Logical Address 1 */ -#define CEC_OWN_ADDRESS_2 ((uint16_t) 0x0004U) /* Logical Address 2 */ -#define CEC_OWN_ADDRESS_3 ((uint16_t) 0x0008U) /* Logical Address 3 */ -#define CEC_OWN_ADDRESS_4 ((uint16_t) 0x0010U) /* Logical Address 4 */ -#define CEC_OWN_ADDRESS_5 ((uint16_t) 0x0020U) /* Logical Address 5 */ -#define CEC_OWN_ADDRESS_6 ((uint16_t) 0x0040U) /* Logical Address 6 */ -#define CEC_OWN_ADDRESS_7 ((uint16_t) 0x0080U) /* Logical Address 7 */ -#define CEC_OWN_ADDRESS_8 ((uint16_t) 0x0100U) /* Logical Address 9 */ -#define CEC_OWN_ADDRESS_9 ((uint16_t) 0x0200U) /* Logical Address 10 */ -#define CEC_OWN_ADDRESS_10 ((uint16_t) 0x0400U) /* Logical Address 11 */ -#define CEC_OWN_ADDRESS_11 ((uint16_t) 0x0800U) /* Logical Address 12 */ -#define CEC_OWN_ADDRESS_12 ((uint16_t) 0x1000U) /* Logical Address 13 */ -#define CEC_OWN_ADDRESS_13 ((uint16_t) 0x2000U) /* Logical Address 14 */ -#define CEC_OWN_ADDRESS_14 ((uint16_t) 0x4000U) /* Logical Address 15 */ +#define CEC_OWN_ADDRESS_NONE ((uint16_t)0x0000) /* Reset value */ +#define CEC_OWN_ADDRESS_0 ((uint16_t)0x0001) /* Logical Address 0 */ +#define CEC_OWN_ADDRESS_1 ((uint16_t)0x0002) /* Logical Address 1 */ +#define CEC_OWN_ADDRESS_2 ((uint16_t)0x0004) /* Logical Address 2 */ +#define CEC_OWN_ADDRESS_3 ((uint16_t)0x0008) /* Logical Address 3 */ +#define CEC_OWN_ADDRESS_4 ((uint16_t)0x0010) /* Logical Address 4 */ +#define CEC_OWN_ADDRESS_5 ((uint16_t)0x0020) /* Logical Address 5 */ +#define CEC_OWN_ADDRESS_6 ((uint16_t)0x0040) /* Logical Address 6 */ +#define CEC_OWN_ADDRESS_7 ((uint16_t)0x0080) /* Logical Address 7 */ +#define CEC_OWN_ADDRESS_8 ((uint16_t)0x0100) /* Logical Address 9 */ +#define CEC_OWN_ADDRESS_9 ((uint16_t)0x0200) /* Logical Address 10 */ +#define CEC_OWN_ADDRESS_10 ((uint16_t)0x0400) /* Logical Address 11 */ +#define CEC_OWN_ADDRESS_11 ((uint16_t)0x0800) /* Logical Address 12 */ +#define CEC_OWN_ADDRESS_12 ((uint16_t)0x1000) /* Logical Address 13 */ +#define CEC_OWN_ADDRESS_13 ((uint16_t)0x2000) /* Logical Address 14 */ +#define CEC_OWN_ADDRESS_14 ((uint16_t)0x4000) /* Logical Address 15 */ /** * @} */ @@ -702,7 +702,7 @@ uint32_t HAL_CEC_GetError(CEC_HandleTypeDef *hcec); * @param __SIZE__: CEC message size. * @retval Test result (TRUE or FALSE). */ -#define IS_CEC_MSGSIZE(__SIZE__) ((__SIZE__) <= 0x10) +#define IS_CEC_MSGSIZE(__SIZE__) ((__SIZE__) <= 0x10U) /** @brief Check CEC device Own Address Register (OAR) setting. * OAR address is written in a 15-bit field within CEC_CFGR register. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_conf_template.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_conf_template.h index 226a38e..ee9af82 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_conf_template.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_conf_template.h @@ -2,15 +2,15 @@ ****************************************************************************** * @file stm32f4xx_hal_conf_template.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HAL configuration template file. * This file should be copied to the application folder and renamed * to stm32f4xx_hal_conf.h. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -97,6 +97,7 @@ #define HAL_SPDIFRX_MODULE_ENABLED #define HAL_DFSDM_MODULE_ENABLED #define HAL_LPTIM_MODULE_ENABLED +#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** @@ -105,11 +106,11 @@ * (when HSE is used as system clock source, directly or through the PLL). */ #if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000U) /*!< Value of the External oscillator in Hz */ + #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ #if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ #endif /* HSE_STARTUP_TIMEOUT */ /** @@ -118,26 +119,26 @@ * (when HSI is used as system clock source, directly or through the PLL). */ #if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ #endif /* HSI_VALUE */ /** * @brief Internal Low Speed oscillator (LSI) value. */ #if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ /** * @brief External Low Speed oscillator (LSE) value. */ #if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ #endif /* LSE_VALUE */ #if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ #endif /* LSE_STARTUP_TIMEOUT */ /** @@ -146,7 +147,7 @@ * frequency, this source is inserted directly through I2S_CKIN pad. */ #if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/ + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ #endif /* EXTERNAL_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, @@ -156,8 +157,8 @@ /** * @brief This is the HAL system configuration section */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ #define USE_RTOS 0U #define PREFETCH_ENABLE 1U #define INSTRUCTION_CACHE_ENABLE 1U @@ -185,56 +186,56 @@ /* Definition of the Ethernet driver buffers size and count */ #define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ #define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ /* Section 2: PHY configuration section */ /* DP83848 PHY Address*/ #define DP83848_PHY_ADDRESS 0x01U /* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +#define PHY_RESET_DELAY 0x000000FFU /* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) +#define PHY_CONFIG_DELAY 0x00000FFFU -#define PHY_READ_TO ((uint32_t)0x0000FFFFU) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU /* Section 3: Common PHY Registers */ -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ /* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)0x0010U) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x0011U) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x0012U) /*!< MII Interrupt Status and Misc. Control Register */ +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ -#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ -#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ /* ################## SPI peripheral configuration ########################## */ @@ -426,6 +427,10 @@ #include "stm32f4xx_hal_lptim.h" #endif /* HAL_LPTIM_MODULE_ENABLED */ +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + /* Exported macro ------------------------------------------------------------*/ #ifdef USE_FULL_ASSERT /** @@ -436,11 +441,11 @@ * If expr is true, it returns no value. * @retval None */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t* file, uint32_t line); #else - #define assert_param(expr) ((void)0) + #define assert_param(expr) ((void)0U) #endif /* USE_FULL_ASSERT */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h index 8786376..720948e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_cortex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CORTEX HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -58,7 +58,7 @@ * @{ */ -#if (__MPU_PRESENT == 1) +#if (__MPU_PRESENT == 1U) /** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition * @brief MPU Region initialization structure * @{ @@ -105,16 +105,16 @@ typedef struct /** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group * @{ */ -#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007U) /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006U) /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005U) /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004U) /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003U) /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ /** * @} */ @@ -122,8 +122,8 @@ typedef struct /** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source * @{ */ -#define SYSTICK_CLKSOURCE_HCLK_DIV8 ((uint32_t)0x00000000U) -#define SYSTICK_CLKSOURCE_HCLK ((uint32_t)0x00000004U) +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U /** * @} @@ -133,10 +133,11 @@ typedef struct /** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control * @{ */ -#define MPU_HFNMI_PRIVDEF_NONE ((uint32_t)0x00000000U) -#define MPU_HARDFAULT_NMI ((uint32_t)0x00000002U) -#define MPU_PRIVILEGED_DEFAULT ((uint32_t)0x00000004U) -#define MPU_HFNMI_PRIVDEF ((uint32_t)0x00000006U) +#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U +#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk +#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk +#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) + /** * @} */ @@ -144,8 +145,8 @@ typedef struct /** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable * @{ */ -#define MPU_REGION_ENABLE ((uint8_t)0x01U) -#define MPU_REGION_DISABLE ((uint8_t)0x00U) +#define MPU_REGION_ENABLE ((uint8_t)0x01) +#define MPU_REGION_DISABLE ((uint8_t)0x00) /** * @} */ @@ -153,8 +154,8 @@ typedef struct /** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access * @{ */ -#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00U) -#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01U) +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) /** * @} */ @@ -162,8 +163,8 @@ typedef struct /** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable * @{ */ -#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01U) -#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00U) +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) /** * @} */ @@ -171,8 +172,8 @@ typedef struct /** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable * @{ */ -#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01U) -#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00U) +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) /** * @} */ @@ -180,8 +181,8 @@ typedef struct /** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable * @{ */ -#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01U) -#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00U) +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) /** * @} */ @@ -189,9 +190,9 @@ typedef struct /** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels * @{ */ -#define MPU_TEX_LEVEL0 ((uint8_t)0x00U) -#define MPU_TEX_LEVEL1 ((uint8_t)0x01U) -#define MPU_TEX_LEVEL2 ((uint8_t)0x02U) +#define MPU_TEX_LEVEL0 ((uint8_t)0x00) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02) /** * @} */ @@ -199,34 +200,34 @@ typedef struct /** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size * @{ */ -#define MPU_REGION_SIZE_32B ((uint8_t)0x04U) -#define MPU_REGION_SIZE_64B ((uint8_t)0x05U) -#define MPU_REGION_SIZE_128B ((uint8_t)0x06U) -#define MPU_REGION_SIZE_256B ((uint8_t)0x07U) -#define MPU_REGION_SIZE_512B ((uint8_t)0x08U) -#define MPU_REGION_SIZE_1KB ((uint8_t)0x09U) -#define MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) -#define MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) -#define MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) -#define MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) -#define MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) -#define MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) -#define MPU_REGION_SIZE_128KB ((uint8_t)0x10U) -#define MPU_REGION_SIZE_256KB ((uint8_t)0x11U) -#define MPU_REGION_SIZE_512KB ((uint8_t)0x12U) -#define MPU_REGION_SIZE_1MB ((uint8_t)0x13U) -#define MPU_REGION_SIZE_2MB ((uint8_t)0x14U) -#define MPU_REGION_SIZE_4MB ((uint8_t)0x15U) -#define MPU_REGION_SIZE_8MB ((uint8_t)0x16U) -#define MPU_REGION_SIZE_16MB ((uint8_t)0x17U) -#define MPU_REGION_SIZE_32MB ((uint8_t)0x18U) -#define MPU_REGION_SIZE_64MB ((uint8_t)0x19U) -#define MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) -#define MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) -#define MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) -#define MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) -#define MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) -#define MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) +#define MPU_REGION_SIZE_32B ((uint8_t)0x04) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) /** * @} */ @@ -234,12 +235,12 @@ typedef struct /** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes * @{ */ -#define MPU_REGION_NO_ACCESS ((uint8_t)0x00U) -#define MPU_REGION_PRIV_RW ((uint8_t)0x01U) -#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02U) -#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03U) -#define MPU_REGION_PRIV_RO ((uint8_t)0x05U) -#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06U) +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) /** * @} */ @@ -247,14 +248,14 @@ typedef struct /** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number * @{ */ -#define MPU_REGION_NUMBER0 ((uint8_t)0x00U) -#define MPU_REGION_NUMBER1 ((uint8_t)0x01U) -#define MPU_REGION_NUMBER2 ((uint8_t)0x02U) -#define MPU_REGION_NUMBER3 ((uint8_t)0x03U) -#define MPU_REGION_NUMBER4 ((uint8_t)0x04U) -#define MPU_REGION_NUMBER5 ((uint8_t)0x05U) -#define MPU_REGION_NUMBER6 ((uint8_t)0x06U) -#define MPU_REGION_NUMBER7 ((uint8_t)0x07U) +#define MPU_REGION_NUMBER0 ((uint8_t)0x00) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07) /** * @} */ @@ -273,8 +274,8 @@ typedef struct */ /** @addtogroup CORTEX_Exported_Functions_Group1 - * @{ - */ + * @{ + */ /* Initialization and de-initialization functions *****************************/ void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); @@ -287,12 +288,9 @@ uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); */ /** @addtogroup CORTEX_Exported_Functions_Group2 - * @{ - */ + * @{ + */ /* Peripheral Control functions ***********************************************/ -#if (__MPU_PRESENT == 1) -void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); -#endif /* __MPU_PRESENT */ uint32_t HAL_NVIC_GetPriorityGrouping(void); void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); @@ -302,6 +300,12 @@ uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); void HAL_SYSTICK_IRQHandler(void); void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); +#endif /* __MPU_PRESENT */ /** * @} */ @@ -397,57 +401,14 @@ void HAL_SYSTICK_Callback(void); ((SIZE) == MPU_REGION_SIZE_2GB) || \ ((SIZE) == MPU_REGION_SIZE_4GB)) -#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FFU) +#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) #endif /* __MPU_PRESENT */ /** * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup CORTEX_Private_Functions CORTEX Private Functions - * @brief CORTEX private functions - * @{ */ -#if (__MPU_PRESENT == 1) -/** - * @brief Disables the MPU - * @retval None - */ -__STATIC_INLINE void HAL_MPU_Disable(void) -{ - /* Disable fault exceptions */ - SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; - - /* Disable the MPU */ - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; -} - -/** - * @brief Enables the MPU - * @param MPU_Control: Specifies the control mode of the MPU during hard fault, - * NMI, FAULTMASK and privileged access to the default memory - * This parameter can be one of the following values: - * @arg MPU_HFNMI_PRIVDEF_NONE - * @arg MPU_HARDFAULT_NMI - * @arg MPU_PRIVILEGED_DEFAULT - * @arg MPU_HFNMI_PRIVDEF - * @retval None - */ -__STATIC_INLINE void HAL_MPU_Enable(uint32_t MPU_Control) -{ - /* Enable the MPU */ - MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; - - /* Enable fault exceptions */ - SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; -} -#endif /* __MPU_PRESENT */ - -/** - * @} - */ +/* Private functions ---------------------------------------------------------*/ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h index 805de07..d8cca5b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_crc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_crc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CRC HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp.h index 0767f26..f857819 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_cryp.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CRYP HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -128,7 +128,7 @@ typedef enum HAL_CRYP_PHASE_READY = 0x01U, /*!< CRYP peripheral is ready for initialization. */ HAL_CRYP_PHASE_PROCESS = 0x02U, /*!< CRYP peripheral is in processing phase */ HAL_CRYP_PHASE_FINAL = 0x03U /*!< CRYP peripheral is in final phase - This is relevant only with CCM and GCM modes */ + This is relevant only with CCM and GCM modes */ }HAL_PhaseTypeDef; /** @@ -182,7 +182,7 @@ typedef struct /** @defgroup CRYP_Key_Size CRYP Key Size * @{ */ -#define CRYP_KEYSIZE_128B ((uint32_t)0x00000000U) +#define CRYP_KEYSIZE_128B 0x00000000U #define CRYP_KEYSIZE_192B CRYP_CR_KEYSIZE_0 #define CRYP_KEYSIZE_256B CRYP_CR_KEYSIZE_1 /** @@ -192,7 +192,7 @@ typedef struct /** @defgroup CRYP_Data_Type CRYP Data Type * @{ */ -#define CRYP_DATATYPE_32B ((uint32_t)0x00000000U) +#define CRYP_DATATYPE_32B 0x00000000U #define CRYP_DATATYPE_16B CRYP_CR_DATATYPE_0 #define CRYP_DATATYPE_8B CRYP_CR_DATATYPE_1 #define CRYP_DATATYPE_1B CRYP_CR_DATATYPE @@ -203,21 +203,21 @@ typedef struct /** @defgroup CRYP_Exported_Constants_Group3 CRYP CRYP_AlgoModeDirection * @{ */ -#define CRYP_CR_ALGOMODE_DIRECTION ((uint32_t)0x0008003CU) -#define CRYP_CR_ALGOMODE_TDES_ECB_ENCRYPT ((uint32_t)0x00000000U) -#define CRYP_CR_ALGOMODE_TDES_ECB_DECRYPT ((uint32_t)0x00000004U) -#define CRYP_CR_ALGOMODE_TDES_CBC_ENCRYPT ((uint32_t)0x00000008U) -#define CRYP_CR_ALGOMODE_TDES_CBC_DECRYPT ((uint32_t)0x0000000CU) -#define CRYP_CR_ALGOMODE_DES_ECB_ENCRYPT ((uint32_t)0x00000010U) -#define CRYP_CR_ALGOMODE_DES_ECB_DECRYPT ((uint32_t)0x00000014U) -#define CRYP_CR_ALGOMODE_DES_CBC_ENCRYPT ((uint32_t)0x00000018U) -#define CRYP_CR_ALGOMODE_DES_CBC_DECRYPT ((uint32_t)0x0000001CU) -#define CRYP_CR_ALGOMODE_AES_ECB_ENCRYPT ((uint32_t)0x00000020U) -#define CRYP_CR_ALGOMODE_AES_ECB_DECRYPT ((uint32_t)0x00000024U) -#define CRYP_CR_ALGOMODE_AES_CBC_ENCRYPT ((uint32_t)0x00000028U) -#define CRYP_CR_ALGOMODE_AES_CBC_DECRYPT ((uint32_t)0x0000002CU) -#define CRYP_CR_ALGOMODE_AES_CTR_ENCRYPT ((uint32_t)0x00000030U) -#define CRYP_CR_ALGOMODE_AES_CTR_DECRYPT ((uint32_t)0x00000034U) +#define CRYP_CR_ALGOMODE_DIRECTION 0x0008003CU +#define CRYP_CR_ALGOMODE_TDES_ECB_ENCRYPT 0x00000000U +#define CRYP_CR_ALGOMODE_TDES_ECB_DECRYPT 0x00000004U +#define CRYP_CR_ALGOMODE_TDES_CBC_ENCRYPT 0x00000008U +#define CRYP_CR_ALGOMODE_TDES_CBC_DECRYPT 0x0000000CU +#define CRYP_CR_ALGOMODE_DES_ECB_ENCRYPT 0x00000010U +#define CRYP_CR_ALGOMODE_DES_ECB_DECRYPT 0x00000014U +#define CRYP_CR_ALGOMODE_DES_CBC_ENCRYPT 0x00000018U +#define CRYP_CR_ALGOMODE_DES_CBC_DECRYPT 0x0000001CU +#define CRYP_CR_ALGOMODE_AES_ECB_ENCRYPT 0x00000020U +#define CRYP_CR_ALGOMODE_AES_ECB_DECRYPT 0x00000024U +#define CRYP_CR_ALGOMODE_AES_CBC_ENCRYPT 0x00000028U +#define CRYP_CR_ALGOMODE_AES_CBC_DECRYPT 0x0000002CU +#define CRYP_CR_ALGOMODE_AES_CTR_ENCRYPT 0x00000030U +#define CRYP_CR_ALGOMODE_AES_CTR_DECRYPT 0x00000034U /** * @} */ @@ -234,18 +234,18 @@ typedef struct /** @defgroup CRYP_Exported_Constants_Group5 CRYP CRYP_Flags * @{ */ -#define CRYP_FLAG_BUSY ((uint32_t)0x00000010U) /*!< The CRYP core is currently - processing a block of data - or a key preparation (for - AES decryption). */ -#define CRYP_FLAG_IFEM ((uint32_t)0x00000001U) /*!< Input FIFO is empty */ -#define CRYP_FLAG_IFNF ((uint32_t)0x00000002U) /*!< Input FIFO is not Full */ -#define CRYP_FLAG_OFNE ((uint32_t)0x00000004U) /*!< Output FIFO is not empty */ -#define CRYP_FLAG_OFFU ((uint32_t)0x00000008U) /*!< Output FIFO is Full */ -#define CRYP_FLAG_OUTRIS ((uint32_t)0x01000002U) /*!< Output FIFO service raw - interrupt status */ -#define CRYP_FLAG_INRIS ((uint32_t)0x01000001U) /*!< Input FIFO service raw - interrupt status */ +#define CRYP_FLAG_BUSY 0x00000010U /*!< The CRYP core is currently + processing a block of data + or a key preparation (for + AES decryption). */ +#define CRYP_FLAG_IFEM 0x00000001U /*!< Input FIFO is empty */ +#define CRYP_FLAG_IFNF 0x00000002U /*!< Input FIFO is not Full */ +#define CRYP_FLAG_OFNE 0x00000004U /*!< Output FIFO is not empty */ +#define CRYP_FLAG_OFFU 0x00000008U /*!< Output FIFO is Full */ +#define CRYP_FLAG_OUTRIS 0x01000002U /*!< Output FIFO service raw + interrupt status */ +#define CRYP_FLAG_INRIS 0x01000001U /*!< Input FIFO service raw + interrupt status */ /** * @} */ @@ -485,7 +485,7 @@ HAL_CRYP_STATETypeDef HAL_CRYP_GetState(CRYP_HandleTypeDef *hcryp); /** @defgroup CRYP_Private_Constants CRYP Private Constants * @{ */ -#define CRYP_FLAG_MASK ((uint32_t)0x0000001FU) +#define CRYP_FLAG_MASK 0x0000001FU /** * @} */ @@ -578,12 +578,12 @@ typedef struct */ typedef enum { - HAL_CRYP_STATE_RESET = 0x00, /*!< CRYP not yet initialized or disabled */ - HAL_CRYP_STATE_READY = 0x01, /*!< CRYP initialized and ready for use */ - HAL_CRYP_STATE_BUSY = 0x02, /*!< CRYP internal processing is ongoing */ - HAL_CRYP_STATE_TIMEOUT = 0x03, /*!< CRYP timeout state */ - HAL_CRYP_STATE_ERROR = 0x04, /*!< CRYP error state */ - HAL_CRYP_STATE_SUSPENDED = 0x05 /*!< CRYP suspended */ + HAL_CRYP_STATE_RESET = 0x00U, /*!< CRYP not yet initialized or disabled */ + HAL_CRYP_STATE_READY = 0x01U, /*!< CRYP initialized and ready for use */ + HAL_CRYP_STATE_BUSY = 0x02U, /*!< CRYP internal processing is ongoing */ + HAL_CRYP_STATE_TIMEOUT = 0x03U, /*!< CRYP timeout state */ + HAL_CRYP_STATE_ERROR = 0x04U, /*!< CRYP error state */ + HAL_CRYP_STATE_SUSPENDED = 0x05U /*!< CRYP suspended */ }HAL_CRYP_STATETypeDef; /** @@ -591,17 +591,17 @@ typedef enum */ typedef enum { - HAL_CRYP_PHASE_READY = 0x01, /*!< CRYP peripheral is ready for initialization. */ - HAL_CRYP_PHASE_PROCESS = 0x02, /*!< CRYP peripheral is in processing phase */ - HAL_CRYP_PHASE_START = 0x03, /*!< CRYP peripheral has been initialized but - GCM/GMAC/CMAC(/CCM) initialization phase has not started */ - HAL_CRYP_PHASE_INIT_OVER = 0x04, /*!< GCM/GMAC/CMAC(/CCM) init phase has been carried out */ - HAL_CRYP_PHASE_HEADER_OVER = 0x05, /*!< GCM/GMAC/CMAC(/CCM) header phase has been carried out */ - HAL_CRYP_PHASE_PAYLOAD_OVER = 0x06, /*!< GCM(/CCM) payload phase has been carried out */ - HAL_CRYP_PHASE_FINAL_OVER = 0x07, /*!< GCM/GMAC/CMAC(/CCM) final phase has been carried out */ - HAL_CRYP_PHASE_HEADER_SUSPENDED = 0x08, /*!< GCM/GMAC/CMAC(/CCM) header phase has been suspended */ - HAL_CRYP_PHASE_PAYLOAD_SUSPENDED = 0x09, /*!< GCM(/CCM) payload phase has been suspended */ - HAL_CRYP_PHASE_NOT_USED = 0x0a /*!< Phase is irrelevant to the current chaining mode */ + HAL_CRYP_PHASE_READY = 0x01U, /*!< CRYP peripheral is ready for initialization. */ + HAL_CRYP_PHASE_PROCESS = 0x02U, /*!< CRYP peripheral is in processing phase */ + HAL_CRYP_PHASE_START = 0x03U, /*!< CRYP peripheral has been initialized but + GCM/GMAC/CMAC(/CCM) initialization phase has not started */ + HAL_CRYP_PHASE_INIT_OVER = 0x04U, /*!< GCM/GMAC/CMAC(/CCM) init phase has been carried out */ + HAL_CRYP_PHASE_HEADER_OVER = 0x05U, /*!< GCM/GMAC/CMAC(/CCM) header phase has been carried out */ + HAL_CRYP_PHASE_PAYLOAD_OVER = 0x06U, /*!< GCM(/CCM) payload phase has been carried out */ + HAL_CRYP_PHASE_FINAL_OVER = 0x07U, /*!< GCM/GMAC/CMAC(/CCM) final phase has been carried out */ + HAL_CRYP_PHASE_HEADER_SUSPENDED = 0x08U, /*!< GCM/GMAC/CMAC(/CCM) header phase has been suspended */ + HAL_CRYP_PHASE_PAYLOAD_SUSPENDED = 0x09U, /*!< GCM(/CCM) payload phase has been suspended */ + HAL_CRYP_PHASE_NOT_USED = 0x0AU /*!< Phase is irrelevant to the current chaining mode */ }HAL_PhaseTypeDef; /** @@ -609,19 +609,19 @@ typedef enum */ typedef enum { - HAL_CRYP_SUSPEND_NONE = 0x00, /*!< CRYP peripheral suspension not requested */ - HAL_CRYP_SUSPEND = 0x01 /*!< CRYP peripheral suspension requested */ + HAL_CRYP_SUSPEND_NONE = 0x00U, /*!< CRYP peripheral suspension not requested */ + HAL_CRYP_SUSPEND = 0x01U /*!< CRYP peripheral suspension requested */ }HAL_SuspendTypeDef; /** * @brief HAL CRYP Error Codes definition */ -#define HAL_CRYP_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_CRYP_WRITE_ERROR ((uint32_t)0x00000001) /*!< Write error */ -#define HAL_CRYP_READ_ERROR ((uint32_t)0x00000002) /*!< Read error */ -#define HAL_CRYP_DMA_ERROR ((uint32_t)0x00000004) /*!< DMA error */ -#define HAL_CRYP_BUSY_ERROR ((uint32_t)0x00000008) /*!< Busy flag error */ +#define HAL_CRYP_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_CRYP_WRITE_ERROR 0x00000001U /*!< Write error */ +#define HAL_CRYP_READ_ERROR 0x00000002U /*!< Read error */ +#define HAL_CRYP_DMA_ERROR 0x00000004U /*!< DMA error */ +#define HAL_CRYP_BUSY_ERROR 0x00000008U /*!< Busy flag error */ /** * @brief CRYP handle Structure definition @@ -637,14 +637,14 @@ typedef struct uint8_t *pCrypOutBuffPtr; /*!< Pointer to CRYP processing (encryption, decryption,...) output buffer */ uint32_t CrypInCount; /*!< Input data size in bytes or, after suspension, the remaining - number of bytes to process */ + number of bytes to process */ uint32_t CrypOutCount; /*!< Output data size in bytes */ HAL_PhaseTypeDef Phase; /*!< CRYP peripheral processing phase for GCM, GMAC, CMAC - (or CCM when applicable) modes. - Indicates the last phase carried out to ease - phase transitions */ + (or CCM when applicable) modes. + Indicates the last phase carried out to ease + phase transitions */ DMA_HandleTypeDef *hdmain; /*!< CRYP peripheral Input DMA handle parameters */ @@ -672,7 +672,7 @@ typedef struct /** @defgroup CRYP_Key_Size Key size selection * @{ */ -#define CRYP_KEYSIZE_128B ((uint32_t)0x00000000) /*!< 128-bit long key */ +#define CRYP_KEYSIZE_128B 0x00000000U /*!< 128-bit long key */ #define CRYP_KEYSIZE_256B AES_CR_KEYSIZE /*!< 256-bit long key */ /** * @} @@ -681,7 +681,7 @@ typedef struct /** @defgroup CRYP_Data_Type AES Data Type selection * @{ */ -#define CRYP_DATATYPE_32B ((uint32_t)0x00000000) /*!< 32-bit data type (no swapping) */ +#define CRYP_DATATYPE_32B 0x00000000U /*!< 32-bit data type (no swapping) */ #define CRYP_DATATYPE_16B AES_CR_DATATYPE_0 /*!< 16-bit data type (half-word swapping) */ #define CRYP_DATATYPE_8B AES_CR_DATATYPE_1 /*!< 8-bit data type (byte swapping) */ #define CRYP_DATATYPE_1B AES_CR_DATATYPE /*!< 1-bit data type (bit swapping) */ @@ -692,8 +692,8 @@ typedef struct /** @defgroup CRYP_AES_State AES Enable state * @{ */ -#define CRYP_AES_DISABLE ((uint32_t)0x00000000) /*!< Disable AES */ -#define CRYP_AES_ENABLE AES_CR_EN /*!< Enable AES */ +#define CRYP_AES_DISABLE 0x00000000U /*!< Disable AES */ +#define CRYP_AES_ENABLE AES_CR_EN /*!< Enable AES */ /** * @} */ @@ -701,19 +701,19 @@ typedef struct /** @defgroup CRYP_AES_OperatingMode AES operating mode * @{ */ -#define CRYP_ALGOMODE_ENCRYPT ((uint32_t)0x00000000) /*!< Encryption mode */ +#define CRYP_ALGOMODE_ENCRYPT 0x00000000U /*!< Encryption mode */ #define CRYP_ALGOMODE_KEYDERIVATION AES_CR_MODE_0 /*!< Key derivation mode */ #define CRYP_ALGOMODE_DECRYPT AES_CR_MODE_1 /*!< Decryption */ #define CRYP_ALGOMODE_KEYDERIVATION_DECRYPT AES_CR_MODE /*!< Key derivation and decryption */ -#define CRYP_ALGOMODE_TAG_GENERATION ((uint32_t)0x00000000) /*!< GMAC or CMAC authentication tag generation */ +#define CRYP_ALGOMODE_TAG_GENERATION 0x00000000U /*!< GMAC or CMAC authentication tag generation */ /** * @} */ /** @defgroup CRYP_AES_ChainingMode AES chaining mode * @{ - */ -#define CRYP_CHAINMODE_AES_ECB ((uint32_t)0x00000000) /*!< Electronic codebook chaining algorithm */ + */ +#define CRYP_CHAINMODE_AES_ECB 0x00000000U /*!< Electronic codebook chaining algorithm */ #define CRYP_CHAINMODE_AES_CBC AES_CR_CHMOD_0 /*!< Cipher block chaining algorithm */ #define CRYP_CHAINMODE_AES_CTR AES_CR_CHMOD_1 /*!< Counter mode chaining algorithm */ #define CRYP_CHAINMODE_AES_GCM_GMAC (AES_CR_CHMOD_0 | AES_CR_CHMOD_1) /*!< Galois counter mode - Galois message authentication code */ @@ -728,8 +728,8 @@ typedef struct /** @defgroup CRYP_Key_Write AES decryption key write-up flag * @{ */ -#define CRYP_KEY_WRITE_ENABLE ((uint32_t)0x00000000) /*!< Enable decryption key writing */ -#define CRYP_KEY_WRITE_DISABLE ((uint32_t)0x00000001) /*!< Disable decryption key writing */ +#define CRYP_KEY_WRITE_ENABLE 0x00000000U /*!< Enable decryption key writing */ +#define CRYP_KEY_WRITE_DISABLE 0x00000001U /*!< Disable decryption key writing */ /** * @} */ @@ -737,7 +737,7 @@ typedef struct /** @defgroup CRYP_DMAIN DMA Input phase management enable state * @{ */ -#define CRYP_DMAIN_DISABLE ((uint32_t)0x00000000) /*!< Disable DMA Input phase management */ +#define CRYP_DMAIN_DISABLE 0x00000000U /*!< Disable DMA Input phase management */ #define CRYP_DMAIN_ENABLE AES_CR_DMAINEN /*!< Enable DMA Input phase management */ /** * @} @@ -746,7 +746,7 @@ typedef struct /** @defgroup CRYP_DMAOUT DMA Output phase management enable state * @{ */ -#define CRYP_DMAOUT_DISABLE ((uint32_t)0x00000000) /*!< Disable DMA Output phase management */ +#define CRYP_DMAOUT_DISABLE 0x00000000U /*!< Disable DMA Output phase management */ #define CRYP_DMAOUT_ENABLE AES_CR_DMAOUTEN /*!< Enable DMA Output phase management */ /** * @} @@ -756,13 +756,13 @@ typedef struct /** @defgroup CRYP_GCM_CMAC_Phase GCM/GMAC and CMAC processing phase selection * @{ */ -#define CRYP_GCM_INIT_PHASE ((uint32_t)0x00000000) /*!< GCM/GMAC (or CCM) init phase */ +#define CRYP_GCM_INIT_PHASE 0x00000000U /*!< GCM/GMAC (or CCM) init phase */ #define CRYP_GCMCMAC_HEADER_PHASE AES_CR_GCMPH_0 /*!< GCM/GMAC or (CCM/)CMAC header phase */ #define CRYP_GCM_PAYLOAD_PHASE AES_CR_GCMPH_1 /*!< GCM(/CCM) payload phase */ #define CRYP_GCMCMAC_FINAL_PHASE AES_CR_GCMPH /*!< GCM/GMAC or (CCM/)CMAC final phase */ /* Definitions duplication for code readibility's sake: supported or not supported chain modes are not specified for each phase */ -#define CRYP_INIT_PHASE ((uint32_t)0x00000000) /*!< Init phase */ +#define CRYP_INIT_PHASE 0x00000000U /*!< Init phase */ #define CRYP_HEADER_PHASE AES_CR_GCMPH_0 /*!< Header phase */ #define CRYP_PAYLOAD_PHASE AES_CR_GCMPH_1 /*!< Payload phase */ #define CRYP_FINAL_PHASE AES_CR_GCMPH /*!< Final phase */ @@ -795,8 +795,8 @@ typedef struct /** @defgroup AES_Interrupts_Enable AES Interrupts Enable bits * @{ */ -#define CRYP_IT_CCFIE AES_CR_CCFIE /*!< Computation Complete interrupt enable */ -#define CRYP_IT_ERRIE AES_CR_ERRIE /*!< Error interrupt enable */ +#define CRYP_IT_CCFIE AES_CR_CCFIE /*!< Computation Complete interrupt enable */ +#define CRYP_IT_ERRIE AES_CR_ERRIE /*!< Error interrupt enable */ /** * @} */ @@ -804,9 +804,9 @@ typedef struct /** @defgroup CRYP_Interrupts_Flags AES Interrupts flags * @{ */ -#define CRYP_IT_WRERR AES_SR_WRERR /*!< Write Error */ -#define CRYP_IT_RDERR AES_SR_RDERR /*!< Read Error */ -#define CRYP_IT_CCF AES_SR_CCF /*!< Computation completed */ +#define CRYP_IT_WRERR AES_SR_WRERR /*!< Write Error */ +#define CRYP_IT_RDERR AES_SR_RDERR /*!< Read Error */ +#define CRYP_IT_CCF AES_SR_CCF /*!< Computation completed */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp_ex.h index de8dfce..30ca63f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cryp_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_cryp_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of CRYP HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -67,10 +67,10 @@ /** @defgroup CRYPEx_Exported_Constants_Group1 CRYP AlgoModeDirection * @{ */ -#define CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT ((uint32_t)0x00080000U) -#define CRYP_CR_ALGOMODE_AES_GCM_DECRYPT ((uint32_t)0x00080004U) -#define CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT ((uint32_t)0x00080008U) -#define CRYP_CR_ALGOMODE_AES_CCM_DECRYPT ((uint32_t)0x0008000CU) +#define CRYP_CR_ALGOMODE_AES_GCM_ENCRYPT 0x00080000U +#define CRYP_CR_ALGOMODE_AES_GCM_DECRYPT 0x00080004U +#define CRYP_CR_ALGOMODE_AES_CCM_ENCRYPT 0x00080008U +#define CRYP_CR_ALGOMODE_AES_CCM_DECRYPT 0x0008000CU /** * @} @@ -80,7 +80,7 @@ * @brief The phases are relevant only to AES-GCM and AES-CCM * @{ */ -#define CRYP_PHASE_INIT ((uint32_t)0x00000000U) +#define CRYP_PHASE_INIT 0x00000000U #define CRYP_PHASE_HEADER CRYP_CR_GCM_CCMPH_0 #define CRYP_PHASE_PAYLOAD CRYP_CR_GCM_CCMPH_1 #define CRYP_PHASE_FINAL CRYP_CR_GCM_CCMPH diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac.h index ddaeed1..cb89ab6 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dac.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DAC HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -130,8 +130,8 @@ typedef struct * @{ */ -#define DAC_TRIGGER_NONE ((uint32_t)0x00000000U) /*!< Conversion is automatic once the DAC1_DHRxxxx register - has been loaded, and not by external trigger */ +#define DAC_TRIGGER_NONE 0x00000000U /*!< Conversion is automatic once the DAC1_DHRxxxx register + has been loaded, and not by external trigger */ #define DAC_TRIGGER_T2_TRGO ((uint32_t)(DAC_CR_TSEL1_2 | DAC_CR_TEN1)) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ #define DAC_TRIGGER_T4_TRGO ((uint32_t)(DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1)) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ #define DAC_TRIGGER_T5_TRGO ((uint32_t)(DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1)) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ @@ -148,7 +148,7 @@ typedef struct /** @defgroup DAC_output_buffer DAC Output Buffer * @{ */ -#define DAC_OUTPUTBUFFER_ENABLE ((uint32_t)0x00000000U) +#define DAC_OUTPUTBUFFER_ENABLE 0x00000000U #define DAC_OUTPUTBUFFER_DISABLE ((uint32_t)DAC_CR_BOFF1) /** * @} @@ -157,8 +157,8 @@ typedef struct /** @defgroup DAC_Channel_selection DAC Channel Selection * @{ */ -#define DAC_CHANNEL_1 ((uint32_t)0x00000000U) -#define DAC_CHANNEL_2 ((uint32_t)0x00000010U) +#define DAC_CHANNEL_1 0x00000000U +#define DAC_CHANNEL_2 0x00000010U /** * @} */ @@ -166,9 +166,9 @@ typedef struct /** @defgroup DAC_data_alignment DAC Data Alignment * @{ */ -#define DAC_ALIGN_12B_R ((uint32_t)0x00000000U) -#define DAC_ALIGN_12B_L ((uint32_t)0x00000004U) -#define DAC_ALIGN_8B_R ((uint32_t)0x00000008U) +#define DAC_ALIGN_12B_R 0x00000000U +#define DAC_ALIGN_12B_L 0x00000004U +#define DAC_ALIGN_8B_R 0x00000008U /** * @} */ @@ -367,7 +367,7 @@ void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac); * @param __ALIGNMENT__: specifies the DAC alignment * @retval None */ -#define DAC_DHR12R1_ALIGNMENT(__ALIGNMENT__) (((uint32_t)0x00000008U) + (__ALIGNMENT__)) +#define DAC_DHR12R1_ALIGNMENT(__ALIGNMENT__) (0x00000008U + (__ALIGNMENT__)) /** @brief Set DHR12R2 alignment * @param __ALIGNMENT__: specifies the DAC alignment @@ -379,7 +379,7 @@ void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac); * @param __ALIGNMENT__: specifies the DAC alignment * @retval None */ -#define DAC_DHR12RD_ALIGNMENT(__ALIGNMENT__) (((uint32_t)0x00000020U) + (__ALIGNMENT__)) +#define DAC_DHR12RD_ALIGNMENT(__ALIGNMENT__) (0x00000020U + (__ALIGNMENT__)) /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac_ex.h index 145759c..cbfcced 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dac_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dac.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DAC HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -68,7 +68,7 @@ /** @defgroup DACEx_lfsrunmask_triangleamplitude DAC LFS Run Mask Triangle Amplitude * @{ */ -#define DAC_LFSRUNMASK_BIT0 ((uint32_t)0x00000000U) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUNMASK_BIT0 0x00000000U /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ #define DAC_LFSRUNMASK_BITS1_0 ((uint32_t)DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ #define DAC_LFSRUNMASK_BITS2_0 ((uint32_t)DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ #define DAC_LFSRUNMASK_BITS3_0 ((uint32_t)DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0)/*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ @@ -80,7 +80,7 @@ #define DAC_LFSRUNMASK_BITS9_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ #define DAC_LFSRUNMASK_BITS10_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ #define DAC_LFSRUNMASK_BITS11_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ -#define DAC_TRIANGLEAMPLITUDE_1 ((uint32_t)0x00000000U) /*!< Select max triangle amplitude of 1 */ +#define DAC_TRIANGLEAMPLITUDE_1 0x00000000U /*!< Select max triangle amplitude of 1 */ #define DAC_TRIANGLEAMPLITUDE_3 ((uint32_t)DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 3 */ #define DAC_TRIANGLEAMPLITUDE_7 ((uint32_t)DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 7 */ #define DAC_TRIANGLEAMPLITUDE_15 ((uint32_t)DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 15 */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi.h index 636a825..18f19a9 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dcmi.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DCMI HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -117,11 +117,11 @@ typedef struct /** @defgroup DCMI_Error_Code DCMI Error Code * @{ */ -#define HAL_DCMI_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_DCMI_ERROR_OVR ((uint32_t)0x00000001U) /*!< Overrun error */ -#define HAL_DCMI_ERROR_SYNC ((uint32_t)0x00000002U) /*!< Synchronization error */ -#define HAL_DCMI_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< Timeout error */ -#define HAL_DCMI_ERROR_DMA ((uint32_t)0x00000040U) /*!< DMA error */ +#define HAL_DCMI_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DCMI_ERROR_OVR 0x00000001U /*!< Overrun error */ +#define HAL_DCMI_ERROR_SYNC 0x00000002U /*!< Synchronization error */ +#define HAL_DCMI_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DCMI_ERROR_DMA 0x00000040U /*!< DMA error */ /** * @} */ @@ -129,7 +129,7 @@ typedef struct /** @defgroup DCMI_Capture_Mode DCMI Capture Mode * @{ */ -#define DCMI_MODE_CONTINUOUS ((uint32_t)0x00000000U) /*!< The received data are transferred continuously +#define DCMI_MODE_CONTINUOUS 0x00000000U /*!< The received data are transferred continuously into the destination memory through the DMA */ #define DCMI_MODE_SNAPSHOT ((uint32_t)DCMI_CR_CM) /*!< Once activated, the interface waits for the start of frame and then transfers a single frame through the DMA */ @@ -140,10 +140,10 @@ typedef struct /** @defgroup DCMI_Synchronization_Mode DCMI Synchronization Mode * @{ */ -#define DCMI_SYNCHRO_HARDWARE ((uint32_t)0x00000000U) /*!< Hardware synchronization data capture (frame/line start/stop) - is synchronized with the HSYNC/VSYNC signals */ -#define DCMI_SYNCHRO_EMBEDDED ((uint32_t)DCMI_CR_ESS) /*!< Embedded synchronization data capture is synchronized with - synchronization codes embedded in the data flow */ +#define DCMI_SYNCHRO_HARDWARE 0x00000000U /*!< Hardware synchronization data capture (frame/line start/stop) + is synchronized with the HSYNC/VSYNC signals */ +#define DCMI_SYNCHRO_EMBEDDED ((uint32_t)DCMI_CR_ESS) /*!< Embedded synchronization data capture is synchronized with + synchronization codes embedded in the data flow */ /** * @} @@ -152,8 +152,8 @@ typedef struct /** @defgroup DCMI_PIXCK_Polarity DCMI PIXCK Polarity * @{ */ -#define DCMI_PCKPOLARITY_FALLING ((uint32_t)0x00000000U) /*!< Pixel clock active on Falling edge */ -#define DCMI_PCKPOLARITY_RISING ((uint32_t)DCMI_CR_PCKPOL) /*!< Pixel clock active on Rising edge */ +#define DCMI_PCKPOLARITY_FALLING 0x00000000U /*!< Pixel clock active on Falling edge */ +#define DCMI_PCKPOLARITY_RISING ((uint32_t)DCMI_CR_PCKPOL) /*!< Pixel clock active on Rising edge */ /** * @} @@ -162,8 +162,8 @@ typedef struct /** @defgroup DCMI_VSYNC_Polarity DCMI VSYNC Polarity * @{ */ -#define DCMI_VSPOLARITY_LOW ((uint32_t)0x00000000U) /*!< Vertical synchronization active Low */ -#define DCMI_VSPOLARITY_HIGH ((uint32_t)DCMI_CR_VSPOL) /*!< Vertical synchronization active High */ +#define DCMI_VSPOLARITY_LOW 0x00000000U /*!< Vertical synchronization active Low */ +#define DCMI_VSPOLARITY_HIGH ((uint32_t)DCMI_CR_VSPOL) /*!< Vertical synchronization active High */ /** * @} @@ -172,8 +172,8 @@ typedef struct /** @defgroup DCMI_HSYNC_Polarity DCMI HSYNC Polarity * @{ */ -#define DCMI_HSPOLARITY_LOW ((uint32_t)0x00000000U) /*!< Horizontal synchronization active Low */ -#define DCMI_HSPOLARITY_HIGH ((uint32_t)DCMI_CR_HSPOL) /*!< Horizontal synchronization active High */ +#define DCMI_HSPOLARITY_LOW 0x00000000U /*!< Horizontal synchronization active Low */ +#define DCMI_HSPOLARITY_HIGH ((uint32_t)DCMI_CR_HSPOL) /*!< Horizontal synchronization active High */ /** * @} @@ -182,8 +182,8 @@ typedef struct /** @defgroup DCMI_MODE_JPEG DCMI MODE JPEG * @{ */ -#define DCMI_JPEG_DISABLE ((uint32_t)0x00000000U) /*!< Mode JPEG Disabled */ -#define DCMI_JPEG_ENABLE ((uint32_t)DCMI_CR_JPEG) /*!< Mode JPEG Enabled */ +#define DCMI_JPEG_DISABLE 0x00000000U /*!< Mode JPEG Disabled */ +#define DCMI_JPEG_ENABLE ((uint32_t)DCMI_CR_JPEG) /*!< Mode JPEG Enabled */ /** * @} @@ -192,7 +192,7 @@ typedef struct /** @defgroup DCMI_Capture_Rate DCMI Capture Rate * @{ */ -#define DCMI_CR_ALL_FRAME ((uint32_t)0x00000000U) /*!< All frames are captured */ +#define DCMI_CR_ALL_FRAME 0x00000000U /*!< All frames are captured */ #define DCMI_CR_ALTERNATE_2_FRAME ((uint32_t)DCMI_CR_FCRC_0) /*!< Every alternate frame captured */ #define DCMI_CR_ALTERNATE_4_FRAME ((uint32_t)DCMI_CR_FCRC_1) /*!< One frame in 4 frames captured */ @@ -203,7 +203,7 @@ typedef struct /** @defgroup DCMI_Extended_Data_Mode DCMI Extended Data Mode * @{ */ -#define DCMI_EXTEND_DATA_8B ((uint32_t)0x00000000U) /*!< Interface captures 8-bit data on every pixel clock */ +#define DCMI_EXTEND_DATA_8B 0x00000000U /*!< Interface captures 8-bit data on every pixel clock */ #define DCMI_EXTEND_DATA_10B ((uint32_t)DCMI_CR_EDM_0) /*!< Interface captures 10-bit data on every pixel clock */ #define DCMI_EXTEND_DATA_12B ((uint32_t)DCMI_CR_EDM_1) /*!< Interface captures 12-bit data on every pixel clock */ #define DCMI_EXTEND_DATA_14B ((uint32_t)(DCMI_CR_EDM_0 | DCMI_CR_EDM_1)) /*!< Interface captures 14-bit data on every pixel clock */ @@ -215,7 +215,7 @@ typedef struct /** @defgroup DCMI_Window_Coordinate DCMI Window Coordinate * @{ */ -#define DCMI_WINDOW_COORDINATE ((uint32_t)0x3FFFU) /*!< Window coordinate */ +#define DCMI_WINDOW_COORDINATE 0x3FFFU /*!< Window coordinate */ /** * @} @@ -224,7 +224,7 @@ typedef struct /** @defgroup DCMI_Window_Height DCMI Window Height * @{ */ -#define DCMI_WINDOW_HEIGHT ((uint32_t)0x1FFFU) /*!< Window Height */ +#define DCMI_WINDOW_HEIGHT 0x1FFFU /*!< Window Height */ /** * @} @@ -407,8 +407,8 @@ typedef struct /* Initialization and de-initialization functions *****************************/ HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi); HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi); -void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi); -void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi); +void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi); +void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi); /** * @} */ @@ -436,9 +436,9 @@ void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi); * @{ */ /* Peripheral Control functions ***********************************************/ -HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize); -HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi); -HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi); +HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize); +HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi); +HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi); /** * @} */ @@ -463,8 +463,8 @@ uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi); /** @defgroup DCMI_Private_Constants DCMI Private Constants * @{ */ -#define DCMI_MIS_INDEX ((uint32_t)0x1000) /*!< DCMI MIS register index */ -#define DCMI_SR_INDEX ((uint32_t)0x2000) /*!< DCMI SR register index */ +#define DCMI_MIS_INDEX 0x1000U /*!< DCMI MIS register index */ +#define DCMI_SR_INDEX 0x2000U /*!< DCMI SR register index */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi_ex.h index 5fc8211..1b065db 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dcmi_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dcmi_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DCMI Extension HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -131,7 +131,7 @@ typedef struct /** @defgroup DCMIEx_Byte_Select_Mode DCMI Byte Select Mode * @{ */ -#define DCMI_BSM_ALL ((uint32_t)0x00000000U) /*!< Interface captures all received data */ +#define DCMI_BSM_ALL 0x00000000U /*!< Interface captures all received data */ #define DCMI_BSM_OTHER ((uint32_t)DCMI_CR_BSM_0) /*!< Interface captures every other byte from the received data */ #define DCMI_BSM_ALTERNATE_4 ((uint32_t)DCMI_CR_BSM_1) /*!< Interface captures one byte out of four */ #define DCMI_BSM_ALTERNATE_2 ((uint32_t)(DCMI_CR_BSM_0 | DCMI_CR_BSM_1)) /*!< Interface captures two bytes out of four */ @@ -143,7 +143,7 @@ typedef struct /** @defgroup DCMIEx_Byte_Select_Start DCMI Byte Select Start * @{ */ -#define DCMI_OEBS_ODD ((uint32_t)0x00000000U) /*!< Interface captures first data from the frame/line start, second one being dropped */ +#define DCMI_OEBS_ODD 0x00000000U /*!< Interface captures first data from the frame/line start, second one being dropped */ #define DCMI_OEBS_EVEN ((uint32_t)DCMI_CR_OEBS) /*!< Interface captures second data from the frame/line start, first one being dropped */ /** @@ -153,7 +153,7 @@ typedef struct /** @defgroup DCMIEx_Line_Select_Mode DCMI Line Select Mode * @{ */ -#define DCMI_LSM_ALL ((uint32_t)0x00000000U) /*!< Interface captures all received lines */ +#define DCMI_LSM_ALL 0x00000000U /*!< Interface captures all received lines */ #define DCMI_LSM_ALTERNATE_2 ((uint32_t)DCMI_CR_LSM) /*!< Interface captures one line out of two */ /** @@ -163,7 +163,7 @@ typedef struct /** @defgroup DCMIEx_Line_Select_Start DCMI Line Select Start * @{ */ -#define DCMI_OELS_ODD ((uint32_t)0x00000000U) /*!< Interface captures first line from the frame start, second one being dropped */ +#define DCMI_OELS_ODD 0x00000000U /*!< Interface captures first line from the frame start, second one being dropped */ #define DCMI_OELS_EVEN ((uint32_t)DCMI_CR_OELS) /*!< Interface captures second line from the frame start, first one being dropped */ /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h index f721ee7..d60a6cd 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h @@ -2,14 +2,14 @@ ****************************************************************************** * @file stm32f4xx_hal_def.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file contains HAL common defines, enumeration, macros and * structures definitions. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -102,7 +102,7 @@ typedef enum */ #define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) -#if (USE_RTOS == 1) +#if (USE_RTOS == 1U) /* Reserved for future use */ #error "USE_RTOS should be 0 in the current HAL release" #else @@ -116,12 +116,12 @@ typedef enum { \ (__HANDLE__)->Lock = HAL_LOCKED; \ } \ - }while (0) + }while (0U) #define __HAL_UNLOCK(__HANDLE__) \ do{ \ (__HANDLE__)->Lock = HAL_UNLOCKED; \ - }while (0) + }while (0U) #endif /* USE_RTOS */ #if defined ( __GNUC__ ) @@ -148,7 +148,7 @@ typedef enum #endif /* __ALIGN_END */ #ifndef __ALIGN_BEGIN #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) + #define __ALIGN_BEGIN __align(4) #elif defined (__ICCARM__) /* IAR Compiler */ #define __ALIGN_BEGIN #endif /* __CC_ARM */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dfsdm.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dfsdm.h index 51f2100..a3eb4f1 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dfsdm.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dfsdm.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dfsdm.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DFSDM HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -246,6 +246,40 @@ typedef struct /** * @} */ +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** + * @brief Synchronization parameters structure definition for STM32F413xx/STM32F423xx devices + */ +typedef struct +{ + uint32_t DFSDM1ClockIn; /*!< Source selection for DFSDM1_Ckin. + This parameter can be a value of @ref DFSDM_1_CLOCKIN_SELECTION*/ + uint32_t DFSDM2ClockIn; /*!< Source selection for DFSDM2_Ckin. + This parameter can be a value of @ref DFSDM_2_CLOCKIN_SELECTION*/ + uint32_t DFSDM1ClockOut; /*!< Source selection for DFSDM1_Ckout. + This parameter can be a value of @ref DFSDM_1_CLOCKOUT_SELECTION*/ + uint32_t DFSDM2ClockOut; /*!< Source selection for DFSDM2_Ckout. + This parameter can be a value of @ref DFSDM_2_CLOCKOUT_SELECTION*/ + uint32_t DFSDM1BitClkDistribution; /*!< Distribution of the DFSDM1 bitstream clock gated by TIM4 OC1 or TIM4 OC2. + This parameter can be a value of @ref DFSDM_1_BIT_STREAM_DISTRIBUTION + @note The DFSDM2 audio gated by TIM4 OC2 can be injected on CKIN0 or CKIN2 + @note The DFSDM2 audio gated by TIM4 OC1 can be injected on CKIN1 or CKIN3 */ + uint32_t DFSDM2BitClkDistribution; /*!< Distribution of the DFSDM2 bitstream clock gated by TIM3 OC1 or TIM3 OC2 or TIM3 OC3 or TIM3 OC4. + This parameter can be a value of @ref DFSDM_2_BIT_STREAM_DISTRIBUTION + @note The DFSDM2 audio gated by TIM3 OC4 can be injected on CKIN0 or CKIN4 + @note The DFSDM2 audio gated by TIM3 OC3 can be injected on CKIN1 or CKIN5 + @note The DFSDM2 audio gated by TIM3 OC2 can be injected on CKIN2 or CKIN6 + @note The DFSDM2 audio gated by TIM3 OC1 can be injected on CKIN3 or CKIN7 */ + uint32_t DFSDM1DataDistribution; /*!< Source selection for DatIn0 and DatIn2 of DFSDM1. + This parameter can be a value of @ref DFSDM_1_DATA_DISTRIBUTION */ + uint32_t DFSDM2DataDistribution; /*!< Source selection for DatIn0, DatIn2, DatIn4 and DatIn6 of DFSDM2. + This parameter can be a value of @ref DFSDM_2_DATA_DISTRIBUTION */ +}DFSDM_MultiChannelConfigTypeDef; +#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ +/** + * @} + */ + /* End of exported types -----------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ @@ -256,7 +290,7 @@ typedef struct /** @defgroup DFSDM_Channel_OuputClock DFSDM channel output clock selection * @{ */ -#define DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM ((uint32_t)0x00000000U) /*!< Source for ouput clock is system clock */ +#define DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM 0x00000000U /*!< Source for ouput clock is system clock */ #define DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO DFSDM_CHCFGR1_CKOUTSRC /*!< Source for ouput clock is audio clock */ /** * @} @@ -265,8 +299,8 @@ typedef struct /** @defgroup DFSDM_Channel_InputMultiplexer DFSDM channel input multiplexer * @{ */ -#define DFSDM_CHANNEL_EXTERNAL_INPUTS ((uint32_t)0x00000000U) /*!< Data are taken from external inputs */ -#define DFSDM_CHANNEL_INTERNAL_REGISTER DFSDM_CHCFGR1_DATMPX_1 /*!< Data are taken from internal register */ +#define DFSDM_CHANNEL_EXTERNAL_INPUTS 0x00000000U /*!< Data are taken from external inputs */ +#define DFSDM_CHANNEL_INTERNAL_REGISTER DFSDM_CHCFGR1_DATMPX_1 /*!< Data are taken from internal register */ /** * @} */ @@ -274,9 +308,9 @@ typedef struct /** @defgroup DFSDM_Channel_DataPacking DFSDM channel input data packing * @{ */ -#define DFSDM_CHANNEL_STANDARD_MODE ((uint32_t)0x00000000U) /*!< Standard data packing mode */ -#define DFSDM_CHANNEL_INTERLEAVED_MODE DFSDM_CHCFGR1_DATPACK_0 /*!< Interleaved data packing mode */ -#define DFSDM_CHANNEL_DUAL_MODE DFSDM_CHCFGR1_DATPACK_1 /*!< Dual data packing mode */ +#define DFSDM_CHANNEL_STANDARD_MODE 0x00000000U /*!< Standard data packing mode */ +#define DFSDM_CHANNEL_INTERLEAVED_MODE DFSDM_CHCFGR1_DATPACK_0 /*!< Interleaved data packing mode */ +#define DFSDM_CHANNEL_DUAL_MODE DFSDM_CHCFGR1_DATPACK_1 /*!< Dual data packing mode */ /** * @} */ @@ -284,7 +318,7 @@ typedef struct /** @defgroup DFSDM_Channel_InputPins DFSDM channel input pins * @{ */ -#define DFSDM_CHANNEL_SAME_CHANNEL_PINS ((uint32_t)0x00000000U) /*!< Input from pins on same channel */ +#define DFSDM_CHANNEL_SAME_CHANNEL_PINS 0x00000000U /*!< Input from pins on same channel */ #define DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS DFSDM_CHCFGR1_CHINSEL /*!< Input from pins on following channel */ /** * @} @@ -293,10 +327,10 @@ typedef struct /** @defgroup DFSDM_Channel_SerialInterfaceType DFSDM channel serial interface type * @{ */ -#define DFSDM_CHANNEL_SPI_RISING ((uint32_t)0x00000000U) /*!< SPI with rising edge */ -#define DFSDM_CHANNEL_SPI_FALLING DFSDM_CHCFGR1_SITP_0 /*!< SPI with falling edge */ -#define DFSDM_CHANNEL_MANCHESTER_RISING DFSDM_CHCFGR1_SITP_1 /*!< Manchester with rising edge */ -#define DFSDM_CHANNEL_MANCHESTER_FALLING DFSDM_CHCFGR1_SITP /*!< Manchester with falling edge */ +#define DFSDM_CHANNEL_SPI_RISING 0x00000000U /*!< SPI with rising edge */ +#define DFSDM_CHANNEL_SPI_FALLING DFSDM_CHCFGR1_SITP_0 /*!< SPI with falling edge */ +#define DFSDM_CHANNEL_MANCHESTER_RISING DFSDM_CHCFGR1_SITP_1 /*!< Manchester with rising edge */ +#define DFSDM_CHANNEL_MANCHESTER_FALLING DFSDM_CHCFGR1_SITP /*!< Manchester with falling edge */ /** * @} */ @@ -304,7 +338,7 @@ typedef struct /** @defgroup DFSDM_Channel_SpiClock DFSDM channel SPI clock selection * @{ */ -#define DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL ((uint32_t)0x00000000U) /*!< External SPI clock */ +#define DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL 0x00000000U /*!< External SPI clock */ #define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL DFSDM_CHCFGR1_SPICKSEL_0 /*!< Internal SPI clock */ #define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING DFSDM_CHCFGR1_SPICKSEL_1 /*!< Internal SPI clock divided by 2, falling edge */ #define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING DFSDM_CHCFGR1_SPICKSEL /*!< Internal SPI clock divided by 2, rising edge */ @@ -315,10 +349,10 @@ typedef struct /** @defgroup DFSDM_Channel_AwdFilterOrder DFSDM channel analog watchdog filter order * @{ */ -#define DFSDM_CHANNEL_FASTSINC_ORDER ((uint32_t)0x00000000U) /*!< FastSinc filter type */ -#define DFSDM_CHANNEL_SINC1_ORDER DFSDM_CHAWSCDR_AWFORD_0 /*!< Sinc 1 filter type */ -#define DFSDM_CHANNEL_SINC2_ORDER DFSDM_CHAWSCDR_AWFORD_1 /*!< Sinc 2 filter type */ -#define DFSDM_CHANNEL_SINC3_ORDER DFSDM_CHAWSCDR_AWFORD /*!< Sinc 3 filter type */ +#define DFSDM_CHANNEL_FASTSINC_ORDER 0x00000000U /*!< FastSinc filter type */ +#define DFSDM_CHANNEL_SINC1_ORDER DFSDM_CHAWSCDR_AWFORD_0 /*!< Sinc 1 filter type */ +#define DFSDM_CHANNEL_SINC2_ORDER DFSDM_CHAWSCDR_AWFORD_1 /*!< Sinc 2 filter type */ +#define DFSDM_CHANNEL_SINC3_ORDER DFSDM_CHAWSCDR_AWFORD /*!< Sinc 3 filter type */ /** * @} */ @@ -326,9 +360,9 @@ typedef struct /** @defgroup DFSDM_Filter_Trigger DFSDM filter conversion trigger * @{ */ -#define DFSDM_FILTER_SW_TRIGGER ((uint32_t)0x00000000U) /*!< Software trigger */ -#define DFSDM_FILTER_SYNC_TRIGGER ((uint32_t)0x00000001U) /*!< Synchronous with DFSDM_FLT0 */ -#define DFSDM_FILTER_EXT_TRIGGER ((uint32_t)0x00000002U) /*!< External trigger (only for injected conversion) */ +#define DFSDM_FILTER_SW_TRIGGER 0x00000000U /*!< Software trigger */ +#define DFSDM_FILTER_SYNC_TRIGGER 0x00000001U /*!< Synchronous with DFSDM_FLT0 */ +#define DFSDM_FILTER_EXT_TRIGGER 0x00000002U /*!< External trigger (only for injected conversion) */ /** * @} */ @@ -338,7 +372,7 @@ typedef struct */ #if defined(STM32F413xx) || defined(STM32F423xx) /* Trigger for stm32f413xx and STM32f423xx devices */ -#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO (0x00000000U) /*!< For All DFSDM1/2 filters */ +#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO 0x00000000U /*!< For All DFSDM1/2 filters */ #define DFSDM_FILTER_EXT_TRIG_TIM3_TRGO DFSDM_FLTCR1_JEXTSEL_0 /*!< For All DFSDM1/2 filters */ #define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO DFSDM_FLTCR1_JEXTSEL_1 /*!< For All DFSDM1/2 filters */ #define DFSDM_FILTER_EXT_TRIG_TIM10_OC1 (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For DFSDM1 filter 0 and 1 and DFSDM2 filter 0, 1 and 2 */ @@ -351,7 +385,7 @@ typedef struct #define DFSDM_FILTER_EXT_TRIG_EXTI15 DFSDM_FLTCR1_JEXTSEL /*!< For All DFSDM1/2 filters */ #else /* Trigger for stm32f412xx devices */ -#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO ((uint32_t)0x00000000U) /*!< For DFSDM1 filter 0 and 1*/ +#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO 0x00000000U /*!< For DFSDM1 filter 0 and 1*/ #define DFSDM_FILTER_EXT_TRIG_TIM3_TRGO DFSDM_FLTCR1_JEXTSEL_0 /*!< For DFSDM1 filter 0 and 1*/ #define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO DFSDM_FLTCR1_JEXTSEL_1 /*!< For DFSDM1 filter 0 and 1*/ #define DFSDM_FILTER_EXT_TRIG_TIM10_OC1 (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For DFSDM1 filter 0 and 1*/ @@ -367,9 +401,9 @@ typedef struct /** @defgroup DFSDM_Filter_ExtTriggerEdge DFSDM filter external trigger edge * @{ */ -#define DFSDM_FILTER_EXT_TRIG_RISING_EDGE DFSDM_FLTCR1_JEXTEN_0 /*!< External rising edge */ -#define DFSDM_FILTER_EXT_TRIG_FALLING_EDGE DFSDM_FLTCR1_JEXTEN_1 /*!< External falling edge */ -#define DFSDM_FILTER_EXT_TRIG_BOTH_EDGES DFSDM_FLTCR1_JEXTEN /*!< External rising and falling edges */ +#define DFSDM_FILTER_EXT_TRIG_RISING_EDGE DFSDM_FLTCR1_JEXTEN_0 /*!< External rising edge */ +#define DFSDM_FILTER_EXT_TRIG_FALLING_EDGE DFSDM_FLTCR1_JEXTEN_1 /*!< External falling edge */ +#define DFSDM_FILTER_EXT_TRIG_BOTH_EDGES DFSDM_FLTCR1_JEXTEN /*!< External rising and falling edges */ /** * @} */ @@ -377,12 +411,12 @@ typedef struct /** @defgroup DFSDM_Filter_SincOrder DFSDM filter sinc order * @{ */ -#define DFSDM_FILTER_FASTSINC_ORDER ((uint32_t)0x00000000U) /*!< FastSinc filter type */ -#define DFSDM_FILTER_SINC1_ORDER DFSDM_FLTFCR_FORD_0 /*!< Sinc 1 filter type */ -#define DFSDM_FILTER_SINC2_ORDER DFSDM_FLTFCR_FORD_1 /*!< Sinc 2 filter type */ -#define DFSDM_FILTER_SINC3_ORDER (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_1) /*!< Sinc 3 filter type */ -#define DFSDM_FILTER_SINC4_ORDER DFSDM_FLTFCR_FORD_2 /*!< Sinc 4 filter type */ -#define DFSDM_FILTER_SINC5_ORDER (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_2) /*!< Sinc 5 filter type */ +#define DFSDM_FILTER_FASTSINC_ORDER 0x00000000U /*!< FastSinc filter type */ +#define DFSDM_FILTER_SINC1_ORDER DFSDM_FLTFCR_FORD_0 /*!< Sinc 1 filter type */ +#define DFSDM_FILTER_SINC2_ORDER DFSDM_FLTFCR_FORD_1 /*!< Sinc 2 filter type */ +#define DFSDM_FILTER_SINC3_ORDER (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_1) /*!< Sinc 3 filter type */ +#define DFSDM_FILTER_SINC4_ORDER DFSDM_FLTFCR_FORD_2 /*!< Sinc 4 filter type */ +#define DFSDM_FILTER_SINC5_ORDER (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_2) /*!< Sinc 5 filter type */ /** * @} */ @@ -390,8 +424,8 @@ typedef struct /** @defgroup DFSDM_Filter_AwdDataSource DFSDM filter analog watchdog data source * @{ */ -#define DFSDM_FILTER_AWD_FILTER_DATA ((uint32_t)0x00000000U) /*!< From digital filter */ -#define DFSDM_FILTER_AWD_CHANNEL_DATA DFSDM_FLTCR1_AWFSEL /*!< From analog watchdog channel */ +#define DFSDM_FILTER_AWD_FILTER_DATA 0x00000000U /*!< From digital filter */ +#define DFSDM_FILTER_AWD_CHANNEL_DATA DFSDM_FLTCR1_AWFSEL /*!< From analog watchdog channel */ /** * @} */ @@ -399,10 +433,10 @@ typedef struct /** @defgroup DFSDM_Filter_ErrorCode DFSDM filter error code * @{ */ -#define DFSDM_FILTER_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define DFSDM_FILTER_ERROR_REGULAR_OVERRUN ((uint32_t)0x00000001U) /*!< Overrun occurs during regular conversion */ -#define DFSDM_FILTER_ERROR_INJECTED_OVERRUN ((uint32_t)0x00000002U) /*!< Overrun occurs during injected conversion */ -#define DFSDM_FILTER_ERROR_DMA ((uint32_t)0x00000003U) /*!< DMA error occurs */ +#define DFSDM_FILTER_ERROR_NONE 0x00000000U /*!< No error */ +#define DFSDM_FILTER_ERROR_REGULAR_OVERRUN 0x00000001U /*!< Overrun occurs during regular conversion */ +#define DFSDM_FILTER_ERROR_INJECTED_OVERRUN 0x00000002U /*!< Overrun occurs during injected conversion */ +#define DFSDM_FILTER_ERROR_DMA 0x00000003U /*!< DMA error occurs */ /** * @} */ @@ -410,11 +444,11 @@ typedef struct /** @defgroup DFSDM_BreakSignals DFSDM break signals * @{ */ -#define DFSDM_NO_BREAK_SIGNAL ((uint32_t)0x00000000U) /*!< No break signal */ -#define DFSDM_BREAK_SIGNAL_0 ((uint32_t)0x00000001U) /*!< Break signal 0 */ -#define DFSDM_BREAK_SIGNAL_1 ((uint32_t)0x00000002U) /*!< Break signal 1 */ -#define DFSDM_BREAK_SIGNAL_2 ((uint32_t)0x00000004U) /*!< Break signal 2 */ -#define DFSDM_BREAK_SIGNAL_3 ((uint32_t)0x00000008U) /*!< Break signal 3 */ +#define DFSDM_NO_BREAK_SIGNAL 0x00000000U /*!< No break signal */ +#define DFSDM_BREAK_SIGNAL_0 0x00000001U /*!< Break signal 0 */ +#define DFSDM_BREAK_SIGNAL_1 0x00000002U /*!< Break signal 1 */ +#define DFSDM_BREAK_SIGNAL_2 0x00000004U /*!< Break signal 2 */ +#define DFSDM_BREAK_SIGNAL_3 0x00000008U /*!< Break signal 3 */ /** * @} */ @@ -427,17 +461,17 @@ typedef struct - in 16-bit LSB the channel mask is set - in 16-bit MSB the channel number is set e.g. for channel 3 definition: - - the channel mask is 0x00000008U (bit 3 is set) + - the channel mask is 0x00000008 (bit 3 is set) - the channel number 3 is 0x00030000 - --> Consequently, channel 3 definition is 0x00000008U | 0x00030000 = 0x00030008 */ -#define DFSDM_CHANNEL_0 ((uint32_t)0x00000001U) -#define DFSDM_CHANNEL_1 ((uint32_t)0x00010002U) -#define DFSDM_CHANNEL_2 ((uint32_t)0x00020004U) -#define DFSDM_CHANNEL_3 ((uint32_t)0x00030008U) -#define DFSDM_CHANNEL_4 ((uint32_t)0x00040010U) /* only for stmm32f413xx and stm32f423xx devices */ -#define DFSDM_CHANNEL_5 ((uint32_t)0x00050020U) /* only for stmm32f413xx and stm32f423xx devices */ -#define DFSDM_CHANNEL_6 ((uint32_t)0x00060040U) /* only for stmm32f413xx and stm32f423xx devices */ -#define DFSDM_CHANNEL_7 ((uint32_t)0x00070080U) /* only for stmm32f413xx and stm32f423xx devices */ + --> Consequently, channel 3 definition is 0x00000008 | 0x00030000 = 0x00030008 */ +#define DFSDM_CHANNEL_0 0x00000001U +#define DFSDM_CHANNEL_1 0x00010002U +#define DFSDM_CHANNEL_2 0x00020004U +#define DFSDM_CHANNEL_3 0x00030008U +#define DFSDM_CHANNEL_4 0x00040010U /* only for stmm32f413xx and stm32f423xx devices */ +#define DFSDM_CHANNEL_5 0x00050020U /* only for stmm32f413xx and stm32f423xx devices */ +#define DFSDM_CHANNEL_6 0x00060040U /* only for stmm32f413xx and stm32f423xx devices */ +#define DFSDM_CHANNEL_7 0x00070080U /* only for stmm32f413xx and stm32f423xx devices */ /** * @} */ @@ -445,8 +479,8 @@ typedef struct /** @defgroup DFSDM_ContinuousMode DFSDM Continuous Mode * @{ */ -#define DFSDM_CONTINUOUS_CONV_OFF ((uint32_t)0x00000000U) /*!< Conversion are not continuous */ -#define DFSDM_CONTINUOUS_CONV_ON ((uint32_t)0x00000001U) /*!< Conversion are continuous */ +#define DFSDM_CONTINUOUS_CONV_OFF 0x00000000U /*!< Conversion are not continuous */ +#define DFSDM_CONTINUOUS_CONV_ON 0x00000001U /*!< Conversion are continuous */ /** * @} */ @@ -454,13 +488,101 @@ typedef struct /** @defgroup DFSDM_AwdThreshold DFSDM analog watchdog threshold * @{ */ -#define DFSDM_AWD_HIGH_THRESHOLD ((uint32_t)0x00000000U) /*!< Analog watchdog high threshold */ -#define DFSDM_AWD_LOW_THRESHOLD ((uint32_t)0x00000001U) /*!< Analog watchdog low threshold */ +#define DFSDM_AWD_HIGH_THRESHOLD 0x00000000U /*!< Analog watchdog high threshold */ +#define DFSDM_AWD_LOW_THRESHOLD 0x00000001U /*!< Analog watchdog low threshold */ +/** + * @} + */ + +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** @defgroup DFSDM_1_CLOCKOUT_SELECTION DFSDM1 ClockOut Selection + * @{ + */ +#define DFSDM1_CKOUT_DFSDM2_CKOUT 0x00000080U +#define DFSDM1_CKOUT_DFSDM1 0x00000000U +/** + * @} + */ + +/** @defgroup DFSDM_2_CLOCKOUT_SELECTION DFSDM2 ClockOut Selection + * @{ + */ +#define DFSDM2_CKOUT_DFSDM2_CKOUT 0x00040000U +#define DFSDM2_CKOUT_DFSDM2 0x00000000U +/** + * @} + */ + +/** @defgroup DFSDM_1_CLOCKIN_SELECTION DFSDM1 ClockIn Selection + * @{ + */ +#define DFSDM1_CKIN_DFSDM2_CKOUT 0x00000040U +#define DFSDM1_CKIN_PAD 0x00000000U +/** + * @} + */ + +/** @defgroup DFSDM_2_CLOCKIN_SELECTION DFSDM2 ClockIn Selection + * @{ + */ +#define DFSDM2_CKIN_DFSDM2_CKOUT 0x00020000U +#define DFSDM2_CKIN_PAD 0x00000000U /** * @} */ - #if defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup DFSDM_1_BIT_STREAM_DISTRIBUTION DFSDM1 Bit Stream Distribution + * @{ + */ +#define DFSDM1_T4_OC2_BITSTREAM_CKIN0 0x00000000U /* TIM4_OC2 to CLKIN0 */ +#define DFSDM1_T4_OC2_BITSTREAM_CKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL /* TIM4_OC2 to CLKIN2 */ +#define DFSDM1_T4_OC1_BITSTREAM_CKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL /* TIM4_OC1 to CLKIN3 */ +#define DFSDM1_T4_OC1_BITSTREAM_CKIN1 0x00000000U /* TIM4_OC1 to CLKIN1 */ +/** + * @} + */ + +/** @defgroup DFSDM_2_BIT_STREAM_DISTRIBUTION DFSDM12 Bit Stream Distribution + * @{ + */ +#define DFSDM2_T3_OC4_BITSTREAM_CKIN0 0x00000000U /* TIM3_OC4 to CKIN0 */ +#define DFSDM2_T3_OC4_BITSTREAM_CKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL /* TIM3_OC4 to CKIN4 */ +#define DFSDM2_T3_OC3_BITSTREAM_CKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL /* TIM3_OC3 to CKIN5 */ +#define DFSDM2_T3_OC3_BITSTREAM_CKIN1 0x00000000U /* TIM3_OC3 to CKIN1 */ +#define DFSDM2_T3_OC2_BITSTREAM_CKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL /* TIM3_OC2to CKIN6 */ +#define DFSDM2_T3_OC2_BITSTREAM_CKIN2 0x00000000U /* TIM3_OC2 to CKIN2 */ +#define DFSDM2_T3_OC1_BITSTREAM_CKIN3 0x00000000U /* TIM3_OC1 to CKIN3 */ +#define DFSDM2_T3_OC1_BITSTREAM_CKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL /* TIM3_OC1 to CKIN7 */ +/** + * @} + */ + +/** @defgroup DFSDM_1_DATA_DISTRIBUTION DFSDM1 Data Distribution + * @{ + */ +#define DFSDM1_DATIN0_TO_DATIN0_PAD 0x00000000U +#define DFSDM1_DATIN0_TO_DATIN1_PAD SYSCFG_MCHDLYCR_DFSDM1D0SEL +#define DFSDM1_DATIN2_TO_DATIN2_PAD 0x00000000U +#define DFSDM1_DATIN2_TO_DATIN3_PAD SYSCFG_MCHDLYCR_DFSDM1D2SEL +/** + * @} + */ + +/** @defgroup DFSDM_2_DATA_DISTRIBUTION DFSDM2 Data Distribution + * @{ + */ +#define DFSDM2_DATIN0_TO_DATIN0_PAD 0x00000000U +#define DFSDM2_DATIN0_TO_DATIN1_PAD SYSCFG_MCHDLYCR_DFSDM2D0SEL +#define DFSDM2_DATIN2_TO_DATIN2_PAD 0x00000000U +#define DFSDM2_DATIN2_TO_DATIN3_PAD SYSCFG_MCHDLYCR_DFSDM2D2SEL +#define DFSDM2_DATIN4_TO_DATIN4_PAD 0x00000000U +#define DFSDM2_DATIN4_TO_DATIN5_PAD SYSCFG_MCHDLYCR_DFSDM2D4SEL +#define DFSDM2_DATIN6_TO_DATIN6_PAD 0x00000000U +#define DFSDM2_DATIN6_TO_DATIN7_PAD SYSCFG_MCHDLYCR_DFSDM2D6SEL +/** + * @} + */ + /** @defgroup HAL_MCHDLY_CLOCK HAL MCHDLY Clock enable * @{ */ @@ -468,9 +590,9 @@ typedef struct #define HAL_MCHDLY_CLOCK_DFSDM1 SYSCFG_MCHDLYCR_MCHDLY1EN /** * @} - */ - -/** @defgroup HAL_DFSDM_CLOCKIN_SOURCE HAL DFSDM Clock In Source Selection + */ + +/** @defgroup DFSDM_CLOCKIN_SOURCE DFSDM Clock In Source Selection * @{ */ #define HAL_DFSDM2_CKIN_PAD 0x00040000U @@ -481,7 +603,7 @@ typedef struct * @} */ -/** @defgroup HAL_DFSDM_CLOCKOUT_SOURCE HAL DFSDM Clock Source Selection +/** @defgroup DFSDM_CLOCKOUT_SOURCE DFSDM Clock Source Selection * @{ */ #define HAL_DFSDM2_CKOUT_DFSDM2 0x10000000U @@ -491,8 +613,8 @@ typedef struct /** * @} */ - -/** @defgroup HAL_DFSDM_DATAIN0_SOURCE HAL DFSDM Source Selection For DATAIN0 + +/** @defgroup DFSDM_DATAIN0_SOURCE DFSDM Source Selection For DATAIN0 * @{ */ #define HAL_DATAIN0_DFSDM2_PAD 0x10000000U @@ -501,9 +623,9 @@ typedef struct #define HAL_DATAIN0_DFSDM1_DATAIN1 SYSCFG_MCHDLYCR_DFSDM1D0SEL /** * @} - */ - -/** @defgroup HAL_DFSDM_DATAIN2_SOURCE HAL DFSDM Source Selection For DATAIN2 + */ + +/** @defgroup DFSDM_DATAIN2_SOURCE DFSDM Source Selection For DATAIN2 * @{ */ #define HAL_DATAIN2_DFSDM2_PAD 0x10000000U @@ -514,7 +636,7 @@ typedef struct * @} */ -/** @defgroup HAL_DFSDM_DATAIN4_SOURCE HAL DFSDM Source Selection For DATAIN4 +/** @defgroup DFSDM_DATAIN4_SOURCE DFSDM Source Selection For DATAIN4 * @{ */ #define HAL_DATAIN4_DFSDM2_PAD 0x00000000U @@ -523,7 +645,7 @@ typedef struct * @} */ -/** @defgroup HAL_DFSDM_DATAIN6_SOURCE HAL DFSDM Source Selection For DATAIN6 +/** @defgroup DFSDM_DATAIN6_SOURCE DFSDM Source Selection For DATAIN6 * @{ */ #define HAL_DATAIN6_DFSDM2_PAD 0x00000000U @@ -532,7 +654,7 @@ typedef struct * @} */ -/** @defgroup HAL_DFSDM1_CLKIN_SOURCE HAL DFSDM1 Source Selection For CLKIN +/** @defgroup DFSDM1_CLKIN_SOURCE DFSDM1 Source Selection For CLKIN * @{ */ #define HAL_DFSDM1_CLKIN0_TIM4OC2 0x01000000U @@ -543,7 +665,7 @@ typedef struct * @} */ -/** @defgroup HAL_DFSDM2_CLKIN_SOURCE HAL DFSDM2 Source Selection For CLKIN +/** @defgroup DFSDM2_CLKIN_SOURCE DFSDM2 Source Selection For CLKIN * @{ */ #define HAL_DFSDM2_CLKIN0_TIM3OC4 0x04000000U @@ -556,8 +678,9 @@ typedef struct #define HAL_DFSDM2_CLKIN7_TIM3OC1 SYSCFG_MCHDLYCR_DFSDM2CK37SEL /** * @} - */ -#endif /* STM32F413xx || STM32F423xx */ + */ + +#endif /* SYSCFG_MCHDLYCR_BSCKSEL*/ /** * @} */ @@ -707,7 +830,7 @@ void HAL_DFSDM_FilterErrorCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter); * @} */ -/** @defgroup DFSDM_Exported_Functions_Group4_Filter Filter state functions +/** @addtogroup DFSDM_Exported_Functions_Group4_Filter Filter state functions * @{ */ /* Filter state functions *****************************************************/ @@ -716,10 +839,11 @@ uint32_t HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDe /** * @} */ -/** @defgroup DFSDM_Exported_Functions_Group5_Filter MultiChannel operation functions +/** @addtogroup DFSDM_Exported_Functions_Group5_Filter MultiChannel operation functions * @{ */ #if defined(SYSCFG_MCHDLYCR_BSCKSEL) +void HAL_DFSDM_ConfigMultiChannelDelay(DFSDM_MultiChannelConfigTypeDef* mchdlystruct); void HAL_DFSDM_BitstreamClock_Start(void); void HAL_DFSDM_BitstreamClock_Stop(void); void HAL_DFSDM_DisableDelayClock(uint32_t MCHDLY); @@ -788,38 +912,6 @@ void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source); ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI15)) #define IS_DFSDM_DELAY_CLOCK(CLOCK) (((CLOCK) == HAL_MCHDLY_CLOCK_DFSDM2) || \ ((CLOCK) == HAL_MCHDLY_CLOCK_DFSDM1)) -#define IS_DFSDM_CLOCKIN_SELECTION(SELECTION) (((SELECTION) == HAL_DFSDM2_CKIN_PAD) || \ - ((SELECTION) == HAL_DFSDM2_CKIN_DM) || \ - ((SELECTION) == HAL_DFSDM1_CKIN_PAD) || \ - ((SELECTION) == HAL_DFSDM1_CKIN_DM)) -#define IS_DFSDM_CLOCKOUT_SELECTION(SELECTION) (((SELECTION) == HAL_DFSDM2_CKOUT_DFSDM2) || \ - ((SELECTION) == HAL_DFSDM2_CKOUT_M27) || \ - ((SELECTION) == HAL_DFSDM1_CKOUT_DFSDM1) || \ - ((SELECTION) == HAL_DFSDM1_CKOUT_M27)) -#define IS_DFSDM_DATAIN0_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN0_DFSDM2_PAD) || \ - ((SELECTION) == HAL_DATAIN0_DFSDM2_DATAIN1) || \ - ((SELECTION) == HAL_DATAIN0_DFSDM1_PAD) || \ - ((SELECTION) == HAL_DATAIN0_DFSDM1_DATAIN1)) -#define IS_DFSDM_DATAIN2_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN2_DFSDM2_PAD) || \ - ((SELECTION) == HAL_DATAIN2_DFSDM2_DATAIN3) || \ - ((SELECTION) == HAL_DATAIN2_DFSDM1_PAD) || \ - ((SELECTION) == HAL_DATAIN2_DFSDM1_DATAIN3)) -#define IS_DFSDM_DATAIN4_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN4_DFSDM2_PAD) || \ - ((SELECTION) == HAL_DATAIN4_DFSDM2_DATAIN5)) -#define IS_DFSDM_DATAIN6_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN6_DFSDM2_PAD) || \ - ((SELECTION) == HAL_DATAIN6_DFSDM2_DATAIN7)) -#define IS_DFSDM_BITSTREM_CLK_DISTRIBUTION(DISTRIBUTION) (((DISTRIBUTION) == HAL_DFSDM1_CLKIN0_TIM4OC2) || \ - ((DISTRIBUTION) == HAL_DFSDM1_CLKIN2_TIM4OC2) || \ - ((DISTRIBUTION) == HAL_DFSDM1_CLKIN1_TIM4OC1) || \ - ((DISTRIBUTION) == HAL_DFSDM1_CLKIN3_TIM4OC1) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN0_TIM3OC4) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN4_TIM3OC4) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN1_TIM3OC3)|| \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN5_TIM3OC3) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN2_TIM3OC2) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN6_TIM3OC2) || \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN3_TIM3OC1)|| \ - ((DISTRIBUTION) == HAL_DFSDM2_CLKIN7_TIM3OC1)) #else #define IS_DFSDM_FILTER_EXT_TRIG(TRIG) (((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO) || \ ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM3_TRGO) || \ @@ -854,7 +946,7 @@ void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source); ((CHANNEL) == DFSDM_CHANNEL_5) || \ ((CHANNEL) == DFSDM_CHANNEL_6) || \ ((CHANNEL) == DFSDM_CHANNEL_7)) -#define IS_DFSDM_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) != 0) && ((CHANNEL) <= 0x000F00FFU)) +#define IS_DFSDM_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) != 0U) && ((CHANNEL) <= 0x000F00FFU)) #else #define IS_DFSDM_REGULAR_CHANNEL(CHANNEL) (((CHANNEL) == DFSDM_CHANNEL_0) || \ ((CHANNEL) == DFSDM_CHANNEL_1) || \ @@ -870,8 +962,82 @@ void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source); ((INSTANCE) == DFSDM1_Channel2) || \ ((INSTANCE) == DFSDM1_Channel3)) #define IS_DFSDM1_FILTER_INSTANCE(INSTANCE) (((INSTANCE) == DFSDM1_Filter0) || \ - ((INSTANCE) == DFSDM1_Filter1)) + ((INSTANCE) == DFSDM1_Filter1)) #endif /* DFSDM2_Channel0 */ + +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +#define IS_DFSDM_CLOCKIN_SELECTION(SELECTION) (((SELECTION) == HAL_DFSDM2_CKIN_PAD) || \ + ((SELECTION) == HAL_DFSDM2_CKIN_DM) || \ + ((SELECTION) == HAL_DFSDM1_CKIN_PAD) || \ + ((SELECTION) == HAL_DFSDM1_CKIN_DM)) +#define IS_DFSDM_CLOCKOUT_SELECTION(SELECTION) (((SELECTION) == HAL_DFSDM2_CKOUT_DFSDM2) || \ + ((SELECTION) == HAL_DFSDM2_CKOUT_M27) || \ + ((SELECTION) == HAL_DFSDM1_CKOUT_DFSDM1) || \ + ((SELECTION) == HAL_DFSDM1_CKOUT_M27)) +#define IS_DFSDM_DATAIN0_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN0_DFSDM2_PAD) || \ + ((SELECTION) == HAL_DATAIN0_DFSDM2_DATAIN1) || \ + ((SELECTION) == HAL_DATAIN0_DFSDM1_PAD) || \ + ((SELECTION) == HAL_DATAIN0_DFSDM1_DATAIN1)) +#define IS_DFSDM_DATAIN2_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN2_DFSDM2_PAD) || \ + ((SELECTION) == HAL_DATAIN2_DFSDM2_DATAIN3) || \ + ((SELECTION) == HAL_DATAIN2_DFSDM1_PAD) || \ + ((SELECTION) == HAL_DATAIN2_DFSDM1_DATAIN3)) +#define IS_DFSDM_DATAIN4_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN4_DFSDM2_PAD) || \ + ((SELECTION) == HAL_DATAIN4_DFSDM2_DATAIN5)) +#define IS_DFSDM_DATAIN6_SRC_SELECTION(SELECTION) (((SELECTION) == HAL_DATAIN6_DFSDM2_PAD) || \ + ((SELECTION) == HAL_DATAIN6_DFSDM2_DATAIN7)) +#define IS_DFSDM_BITSTREM_CLK_DISTRIBUTION(DISTRIBUTION) (((DISTRIBUTION) == HAL_DFSDM1_CLKIN0_TIM4OC2) || \ + ((DISTRIBUTION) == HAL_DFSDM1_CLKIN2_TIM4OC2) || \ + ((DISTRIBUTION) == HAL_DFSDM1_CLKIN1_TIM4OC1) || \ + ((DISTRIBUTION) == HAL_DFSDM1_CLKIN3_TIM4OC1) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN0_TIM3OC4) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN4_TIM3OC4) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN1_TIM3OC3)|| \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN5_TIM3OC3) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN2_TIM3OC2) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN6_TIM3OC2) || \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN3_TIM3OC1)|| \ + ((DISTRIBUTION) == HAL_DFSDM2_CLKIN7_TIM3OC1)) +#define IS_DFSDM_DFSDM1_CLKOUT(CLKOUT) (((CLKOUT) == DFSDM1_CKOUT_DFSDM2_CKOUT) || \ + ((CLKOUT) == DFSDM1_CKOUT_DFSDM1)) +#define IS_DFSDM_DFSDM2_CLKOUT(CLKOUT) (((CLKOUT) == DFSDM2_CKOUT_DFSDM2_CKOUT) || \ + ((CLKOUT) == DFSDM2_CKOUT_DFSDM2)) +#define IS_DFSDM_DFSDM1_CLKIN(CLKIN) (((CLKIN) == DFSDM1_CKIN_DFSDM2_CKOUT) || \ + ((CLKIN) == DFSDM1_CKIN_PAD)) +#define IS_DFSDM_DFSDM2_CLKIN(CLKIN) (((CLKIN) == DFSDM2_CKIN_DFSDM2_CKOUT) || \ + ((CLKIN) == DFSDM2_CKIN_PAD)) +#define IS_DFSDM_DFSDM1_BIT_CLK(CLK) (((CLK) == DFSDM1_T4_OC2_BITSTREAM_CKIN0) || \ + ((CLK) == DFSDM1_T4_OC2_BITSTREAM_CKIN2) || \ + ((CLK) == DFSDM1_T4_OC1_BITSTREAM_CKIN3) || \ + ((CLK) == DFSDM1_T4_OC1_BITSTREAM_CKIN1) || \ + ((CLK) <= 0x30U)) + +#define IS_DFSDM_DFSDM2_BIT_CLK(CLK) (((CLK) == DFSDM2_T3_OC4_BITSTREAM_CKIN0) || \ + ((CLK) == DFSDM2_T3_OC4_BITSTREAM_CKIN4) || \ + ((CLK) == DFSDM2_T3_OC3_BITSTREAM_CKIN5) || \ + ((CLK) == DFSDM2_T3_OC3_BITSTREAM_CKIN1) || \ + ((CLK) == DFSDM2_T3_OC2_BITSTREAM_CKIN6) || \ + ((CLK) == DFSDM2_T3_OC2_BITSTREAM_CKIN2) || \ + ((CLK) == DFSDM2_T3_OC1_BITSTREAM_CKIN3) || \ + ((CLK) == DFSDM2_T3_OC1_BITSTREAM_CKIN7)|| \ + ((CLK) <= 0x1E000U)) + +#define IS_DFSDM_DFSDM1_DATA_DISTRIBUTION(DISTRIBUTION)(((DISTRIBUTION) == DFSDM1_DATIN0_TO_DATIN0_PAD )|| \ + ((DISTRIBUTION) == DFSDM1_DATIN0_TO_DATIN1_PAD) || \ + ((DISTRIBUTION) == DFSDM1_DATIN2_TO_DATIN2_PAD) || \ + ((DISTRIBUTION) == DFSDM1_DATIN2_TO_DATIN3_PAD)|| \ + ((DISTRIBUTION) <= 0xCU)) + +#define IS_DFSDM_DFSDM2_DATA_DISTRIBUTION(DISTRIBUTION)(((DISTRIBUTION) == DFSDM2_DATIN0_TO_DATIN0_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN0_TO_DATIN1_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN2_TO_DATIN2_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN2_TO_DATIN3_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN4_TO_DATIN4_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN4_TO_DATIN5_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN6_TO_DATIN6_PAD)|| \ + ((DISTRIBUTION) == DFSDM2_DATIN6_TO_DATIN7_PAD)|| \ + ((DISTRIBUTION) <= 0x1D00U)) +#endif /* (SYSCFG_MCHDLYCR_BSCKSEL) */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h index 5b42cbb..c24cf6c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dma.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DMA HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -133,8 +133,8 @@ typedef enum */ typedef enum { - HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ - HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ + HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ + HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ }HAL_DMA_LevelCompleteTypeDef; /** @@ -142,13 +142,13 @@ typedef enum */ typedef enum { - HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ - HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ - HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ - HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ - HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ - HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ - HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ + HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ + HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ + HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ + HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ + HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ + HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ + HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ }HAL_DMA_CallbackIDTypeDef; /** @@ -156,33 +156,33 @@ typedef enum */ typedef struct __DMA_HandleTypeDef { - DMA_Stream_TypeDef *Instance; /*!< Register base address */ + DMA_Stream_TypeDef *Instance; /*!< Register base address */ - DMA_InitTypeDef Init; /*!< DMA communication parameters */ + DMA_InitTypeDef Init; /*!< DMA communication parameters */ - HAL_LockTypeDef Lock; /*!< DMA locking object */ + HAL_LockTypeDef Lock; /*!< DMA locking object */ - __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ + __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ - void *Parent; /*!< Parent object state */ + void *Parent; /*!< Parent object state */ - void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ + void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ - void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ + void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ - void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ + void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ - void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ + void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ - void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ + void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ - __IO uint32_t ErrorCode; /*!< DMA Error code */ + __IO uint32_t ErrorCode; /*!< DMA Error code */ - uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ + uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ - uint32_t StreamIndex; /*!< DMA Stream Index */ + uint32_t StreamIndex; /*!< DMA Stream Index */ }DMA_HandleTypeDef; @@ -201,14 +201,14 @@ typedef struct __DMA_HandleTypeDef * @brief DMA Error Code * @{ */ -#define HAL_DMA_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_DMA_ERROR_TE ((uint32_t)0x00000001U) /*!< Transfer error */ -#define HAL_DMA_ERROR_FE ((uint32_t)0x00000002U) /*!< FIFO error */ -#define HAL_DMA_ERROR_DME ((uint32_t)0x00000004U) /*!< Direct Mode error */ -#define HAL_DMA_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< Timeout error */ -#define HAL_DMA_ERROR_PARAM ((uint32_t)0x00000040U) /*!< Parameter error */ -#define HAL_DMA_ERROR_NO_XFER ((uint32_t)0x00000080U) /*!< Abort requested with no Xfer ongoing */ -#define HAL_DMA_ERROR_NOT_SUPPORTED ((uint32_t)0x00000100U) /*!< Not supported mode */ +#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ +#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ +#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ +#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ +#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ /** * @} */ @@ -217,23 +217,23 @@ typedef struct __DMA_HandleTypeDef * @brief DMA channel selection * @{ */ -#define DMA_CHANNEL_0 ((uint32_t)0x00000000U) /*!< DMA Channel 0 */ -#define DMA_CHANNEL_1 ((uint32_t)0x02000000U) /*!< DMA Channel 1 */ -#define DMA_CHANNEL_2 ((uint32_t)0x04000000U) /*!< DMA Channel 2 */ -#define DMA_CHANNEL_3 ((uint32_t)0x06000000U) /*!< DMA Channel 3 */ -#define DMA_CHANNEL_4 ((uint32_t)0x08000000U) /*!< DMA Channel 4 */ -#define DMA_CHANNEL_5 ((uint32_t)0x0A000000U) /*!< DMA Channel 5 */ -#define DMA_CHANNEL_6 ((uint32_t)0x0C000000U) /*!< DMA Channel 6 */ -#define DMA_CHANNEL_7 ((uint32_t)0x0E000000U) /*!< DMA Channel 7 */ +#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ +#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ +#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ +#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ +#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ +#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ +#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ +#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ #if defined (DMA_SxCR_CHSEL_3) -#define DMA_CHANNEL_8 ((uint32_t)0x10000000U) /*!< DMA Channel 8 */ -#define DMA_CHANNEL_9 ((uint32_t)0x12000000U) /*!< DMA Channel 9 */ -#define DMA_CHANNEL_10 ((uint32_t)0x14000000U) /*!< DMA Channel 10 */ -#define DMA_CHANNEL_11 ((uint32_t)0x16000000U) /*!< DMA Channel 11 */ -#define DMA_CHANNEL_12 ((uint32_t)0x18000000U) /*!< DMA Channel 12 */ -#define DMA_CHANNEL_13 ((uint32_t)0x1A000000U) /*!< DMA Channel 13 */ -#define DMA_CHANNEL_14 ((uint32_t)0x1C000000U) /*!< DMA Channel 14 */ -#define DMA_CHANNEL_15 ((uint32_t)0x1E000000U) /*!< DMA Channel 15 */ +#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ +#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ +#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ +#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ +#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ +#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ +#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ +#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ #endif /* DMA_SxCR_CHSEL_3 */ /** * @} @@ -243,9 +243,9 @@ typedef struct __DMA_HandleTypeDef * @brief DMA data transfer direction * @{ */ -#define DMA_PERIPH_TO_MEMORY ((uint32_t)0x00000000U) /*!< Peripheral to memory direction */ -#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ -#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ +#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ +#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ /** * @} */ @@ -254,8 +254,8 @@ typedef struct __DMA_HandleTypeDef * @brief DMA peripheral incremented mode * @{ */ -#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ -#define DMA_PINC_DISABLE ((uint32_t)0x00000000U) /*!< Peripheral increment mode disable */ +#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ +#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ /** * @} */ @@ -264,8 +264,8 @@ typedef struct __DMA_HandleTypeDef * @brief DMA memory incremented mode * @{ */ -#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ -#define DMA_MINC_DISABLE ((uint32_t)0x00000000U) /*!< Memory increment mode disable */ +#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ +#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ /** * @} */ @@ -274,9 +274,9 @@ typedef struct __DMA_HandleTypeDef * @brief DMA peripheral data size * @{ */ -#define DMA_PDATAALIGN_BYTE ((uint32_t)0x00000000U) /*!< Peripheral data alignment: Byte */ -#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ -#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ +#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ +#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ +#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ /** * @} */ @@ -285,9 +285,9 @@ typedef struct __DMA_HandleTypeDef * @brief DMA memory data size * @{ */ -#define DMA_MDATAALIGN_BYTE ((uint32_t)0x00000000U) /*!< Memory data alignment: Byte */ -#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ -#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ +#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ +#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ +#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ /** * @} */ @@ -296,9 +296,9 @@ typedef struct __DMA_HandleTypeDef * @brief DMA mode * @{ */ -#define DMA_NORMAL ((uint32_t)0x00000000U) /*!< Normal mode */ -#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ -#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ +#define DMA_NORMAL 0x00000000U /*!< Normal mode */ +#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ +#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ /** * @} */ @@ -307,10 +307,10 @@ typedef struct __DMA_HandleTypeDef * @brief DMA priority levels * @{ */ -#define DMA_PRIORITY_LOW ((uint32_t)0x00000000U) /*!< Priority level: Low */ -#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ -#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ -#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ +#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ +#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ +#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ +#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ /** * @} */ @@ -319,8 +319,8 @@ typedef struct __DMA_HandleTypeDef * @brief DMA FIFO direct mode * @{ */ -#define DMA_FIFOMODE_DISABLE ((uint32_t)0x00000000U) /*!< FIFO mode disable */ -#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ +#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ +#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ /** * @} */ @@ -329,7 +329,7 @@ typedef struct __DMA_HandleTypeDef * @brief DMA FIFO level * @{ */ -#define DMA_FIFO_THRESHOLD_1QUARTERFULL ((uint32_t)0x00000000U) /*!< FIFO threshold 1 quart full configuration */ +#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ #define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ #define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ #define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ @@ -341,10 +341,10 @@ typedef struct __DMA_HandleTypeDef * @brief DMA memory burst * @{ */ -#define DMA_MBURST_SINGLE ((uint32_t)0x00000000U) -#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) -#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) -#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) +#define DMA_MBURST_SINGLE 0x00000000U +#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) +#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) +#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) /** * @} */ @@ -353,10 +353,10 @@ typedef struct __DMA_HandleTypeDef * @brief DMA peripheral burst * @{ */ -#define DMA_PBURST_SINGLE ((uint32_t)0x00000000U) -#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) -#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) -#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) +#define DMA_PBURST_SINGLE 0x00000000U +#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) +#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) +#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) /** * @} */ @@ -365,11 +365,11 @@ typedef struct __DMA_HandleTypeDef * @brief DMA interrupts definition * @{ */ -#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) -#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) -#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) -#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) -#define DMA_IT_FE ((uint32_t)0x00000080U) +#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) +#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) +#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) +#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) +#define DMA_IT_FE 0x00000080U /** * @} */ @@ -378,26 +378,26 @@ typedef struct __DMA_HandleTypeDef * @brief DMA flag definitions * @{ */ -#define DMA_FLAG_FEIF0_4 ((uint32_t)0x00800001U) -#define DMA_FLAG_DMEIF0_4 ((uint32_t)0x00800004U) -#define DMA_FLAG_TEIF0_4 ((uint32_t)0x00000008U) -#define DMA_FLAG_HTIF0_4 ((uint32_t)0x00000010U) -#define DMA_FLAG_TCIF0_4 ((uint32_t)0x00000020U) -#define DMA_FLAG_FEIF1_5 ((uint32_t)0x00000040U) -#define DMA_FLAG_DMEIF1_5 ((uint32_t)0x00000100U) -#define DMA_FLAG_TEIF1_5 ((uint32_t)0x00000200U) -#define DMA_FLAG_HTIF1_5 ((uint32_t)0x00000400U) -#define DMA_FLAG_TCIF1_5 ((uint32_t)0x00000800U) -#define DMA_FLAG_FEIF2_6 ((uint32_t)0x00010000U) -#define DMA_FLAG_DMEIF2_6 ((uint32_t)0x00040000U) -#define DMA_FLAG_TEIF2_6 ((uint32_t)0x00080000U) -#define DMA_FLAG_HTIF2_6 ((uint32_t)0x00100000U) -#define DMA_FLAG_TCIF2_6 ((uint32_t)0x00200000U) -#define DMA_FLAG_FEIF3_7 ((uint32_t)0x00400000U) -#define DMA_FLAG_DMEIF3_7 ((uint32_t)0x01000000U) -#define DMA_FLAG_TEIF3_7 ((uint32_t)0x02000000U) -#define DMA_FLAG_HTIF3_7 ((uint32_t)0x04000000U) -#define DMA_FLAG_TCIF3_7 ((uint32_t)0x08000000U) +#define DMA_FLAG_FEIF0_4 0x00800001U +#define DMA_FLAG_DMEIF0_4 0x00800004U +#define DMA_FLAG_TEIF0_4 0x00000008U +#define DMA_FLAG_HTIF0_4 0x00000010U +#define DMA_FLAG_TCIF0_4 0x00000020U +#define DMA_FLAG_FEIF1_5 0x00000040U +#define DMA_FLAG_DMEIF1_5 0x00000100U +#define DMA_FLAG_TEIF1_5 0x00000200U +#define DMA_FLAG_HTIF1_5 0x00000400U +#define DMA_FLAG_TCIF1_5 0x00000800U +#define DMA_FLAG_FEIF2_6 0x00010000U +#define DMA_FLAG_DMEIF2_6 0x00040000U +#define DMA_FLAG_TEIF2_6 0x00080000U +#define DMA_FLAG_HTIF2_6 0x00100000U +#define DMA_FLAG_TCIF2_6 0x00200000U +#define DMA_FLAG_FEIF3_7 0x00400000U +#define DMA_FLAG_DMEIF3_7 0x01000000U +#define DMA_FLAG_TEIF3_7 0x02000000U +#define DMA_FLAG_HTIF3_7 0x04000000U +#define DMA_FLAG_TCIF3_7 0x08000000U /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h index 32c4099..d2cd97d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma2d.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dma2d.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DMA2D HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -68,14 +68,14 @@ */ typedef struct { - uint32_t Blue; /*!< Configures the blue value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + uint32_t Blue; /*!< Configures the blue value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ - uint32_t Green; /*!< Configures the green value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + uint32_t Green; /*!< Configures the green value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ - uint32_t Red; /*!< Configures the red value. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + uint32_t Red; /*!< Configures the red value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ } DMA2D_ColorTypeDef; /** @@ -83,13 +83,13 @@ typedef struct */ typedef struct { - uint32_t *pCLUT; /*!< Configures the DMA2D CLUT memory address.*/ + uint32_t *pCLUT; /*!< Configures the DMA2D CLUT memory address.*/ - uint32_t CLUTColorMode; /*!< Configures the DMA2D CLUT color mode. - This parameter can be one value of @ref DMA2D_CLUT_CM. */ + uint32_t CLUTColorMode; /*!< Configures the DMA2D CLUT color mode. + This parameter can be one value of @ref DMA2D_CLUT_CM. */ - uint32_t Size; /*!< Configures the DMA2D CLUT size. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF.*/ + uint32_t Size; /*!< Configures the DMA2D CLUT size. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF.*/ } DMA2D_CLUTCfgTypeDef; /** @@ -113,23 +113,23 @@ typedef struct */ typedef struct { - uint32_t InputOffset; /*!< Configures the DMA2D foreground or background offset. - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. */ - - uint32_t InputColorMode; /*!< Configures the DMA2D foreground or background color mode. - This parameter can be one value of @ref DMA2D_Input_Color_Mode. */ - - uint32_t AlphaMode; /*!< Configures the DMA2D foreground or background alpha mode. - This parameter can be one value of @ref DMA2D_Alpha_Mode. */ - - uint32_t InputAlpha; /*!< Specifies the DMA2D foreground or background alpha value and color value in case of A8 or A4 color mode. - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF except for the color modes detailed below. - @note In case of A8 or A4 color mode (ARGB), this parameter must be a number between - Min_Data = 0x00000000 and Max_Data = 0xFFFFFFFF where - - InputAlpha[24:31] is the alpha value ALPHA[0:7] - - InputAlpha[16:23] is the red value RED[0:7] - - InputAlpha[8:15] is the green value GREEN[0:7] - - InputAlpha[0:7] is the blue value BLUE[0:7]. */ + uint32_t InputOffset; /*!< Configures the DMA2D foreground or background offset. + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. */ + + uint32_t InputColorMode; /*!< Configures the DMA2D foreground or background color mode. + This parameter can be one value of @ref DMA2D_Input_Color_Mode. */ + + uint32_t AlphaMode; /*!< Configures the DMA2D foreground or background alpha mode. + This parameter can be one value of @ref DMA2D_Alpha_Mode. */ + + uint32_t InputAlpha; /*!< Specifies the DMA2D foreground or background alpha value and color value in case of A8 or A4 color mode. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF except for the color modes detailed below. + @note In case of A8 or A4 color mode (ARGB), this parameter must be a number between + Min_Data = 0x00000000 and Max_Data = 0xFFFFFFFF where + - InputAlpha[24:31] is the alpha value ALPHA[0:7] + - InputAlpha[16:23] is the red value RED[0:7] + - InputAlpha[8:15] is the green value GREEN[0:7] + - InputAlpha[0:7] is the blue value BLUE[0:7]. */ } DMA2D_LayerCfgTypeDef; @@ -179,11 +179,11 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_Error_Code DMA2D Error Code * @{ */ -#define HAL_DMA2D_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_DMA2D_ERROR_TE ((uint32_t)0x00000001U) /*!< Transfer error */ -#define HAL_DMA2D_ERROR_CE ((uint32_t)0x00000002U) /*!< Configuration error */ -#define HAL_DMA2D_ERROR_CAE ((uint32_t)0x00000004U) /*!< CLUT access error */ -#define HAL_DMA2D_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< Timeout error */ +#define HAL_DMA2D_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA2D_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA2D_ERROR_CE 0x00000002U /*!< Configuration error */ +#define HAL_DMA2D_ERROR_CAE 0x00000004U /*!< CLUT access error */ +#define HAL_DMA2D_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ /** * @} */ @@ -191,7 +191,7 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_Mode DMA2D Mode * @{ */ -#define DMA2D_M2M ((uint32_t)0x00000000U) /*!< DMA2D memory to memory transfer mode */ +#define DMA2D_M2M 0x00000000U /*!< DMA2D memory to memory transfer mode */ #define DMA2D_M2M_PFC DMA2D_CR_MODE_0 /*!< DMA2D memory to memory with pixel format conversion transfer mode */ #define DMA2D_M2M_BLEND DMA2D_CR_MODE_1 /*!< DMA2D memory to memory with blending transfer mode */ #define DMA2D_R2M DMA2D_CR_MODE /*!< DMA2D register to memory transfer mode */ @@ -202,7 +202,7 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_Output_Color_Mode DMA2D Output Color Mode * @{ */ -#define DMA2D_OUTPUT_ARGB8888 ((uint32_t)0x00000000U) /*!< ARGB8888 DMA2D color mode */ +#define DMA2D_OUTPUT_ARGB8888 0x00000000U /*!< ARGB8888 DMA2D color mode */ #define DMA2D_OUTPUT_RGB888 DMA2D_OPFCCR_CM_0 /*!< RGB888 DMA2D color mode */ #define DMA2D_OUTPUT_RGB565 DMA2D_OPFCCR_CM_1 /*!< RGB565 DMA2D color mode */ #define DMA2D_OUTPUT_ARGB1555 (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /*!< ARGB1555 DMA2D color mode */ @@ -214,17 +214,17 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_Input_Color_Mode DMA2D Input Color Mode * @{ */ -#define DMA2D_INPUT_ARGB8888 ((uint32_t)0x00000000U) /*!< ARGB8888 color mode */ -#define DMA2D_INPUT_RGB888 ((uint32_t)0x00000001U) /*!< RGB888 color mode */ -#define DMA2D_INPUT_RGB565 ((uint32_t)0x00000002U) /*!< RGB565 color mode */ -#define DMA2D_INPUT_ARGB1555 ((uint32_t)0x00000003U) /*!< ARGB1555 color mode */ -#define DMA2D_INPUT_ARGB4444 ((uint32_t)0x00000004U) /*!< ARGB4444 color mode */ -#define DMA2D_INPUT_L8 ((uint32_t)0x00000005U) /*!< L8 color mode */ -#define DMA2D_INPUT_AL44 ((uint32_t)0x00000006U) /*!< AL44 color mode */ -#define DMA2D_INPUT_AL88 ((uint32_t)0x00000007U) /*!< AL88 color mode */ -#define DMA2D_INPUT_L4 ((uint32_t)0x00000008U) /*!< L4 color mode */ -#define DMA2D_INPUT_A8 ((uint32_t)0x00000009U) /*!< A8 color mode */ -#define DMA2D_INPUT_A4 ((uint32_t)0x0000000AU) /*!< A4 color mode */ +#define DMA2D_INPUT_ARGB8888 0x00000000U /*!< ARGB8888 color mode */ +#define DMA2D_INPUT_RGB888 0x00000001U /*!< RGB888 color mode */ +#define DMA2D_INPUT_RGB565 0x00000002U /*!< RGB565 color mode */ +#define DMA2D_INPUT_ARGB1555 0x00000003U /*!< ARGB1555 color mode */ +#define DMA2D_INPUT_ARGB4444 0x00000004U /*!< ARGB4444 color mode */ +#define DMA2D_INPUT_L8 0x00000005U /*!< L8 color mode */ +#define DMA2D_INPUT_AL44 0x00000006U /*!< AL44 color mode */ +#define DMA2D_INPUT_AL88 0x00000007U /*!< AL88 color mode */ +#define DMA2D_INPUT_L4 0x00000008U /*!< L4 color mode */ +#define DMA2D_INPUT_A8 0x00000009U /*!< A8 color mode */ +#define DMA2D_INPUT_A4 0x0000000AU /*!< A4 color mode */ /** * @} */ @@ -232,10 +232,10 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_Alpha_Mode DMA2D Alpha Mode * @{ */ -#define DMA2D_NO_MODIF_ALPHA ((uint32_t)0x00000000U) /*!< No modification of the alpha channel value */ -#define DMA2D_REPLACE_ALPHA ((uint32_t)0x00000001U) /*!< Replace original alpha channel value by programmed alpha value */ -#define DMA2D_COMBINE_ALPHA ((uint32_t)0x00000002U) /*!< Replace original alpha channel value by programmed alpha value - with original alpha channel value */ +#define DMA2D_NO_MODIF_ALPHA 0x00000000U /*!< No modification of the alpha channel value */ +#define DMA2D_REPLACE_ALPHA 0x00000001U /*!< Replace original alpha channel value by programmed alpha value */ +#define DMA2D_COMBINE_ALPHA 0x00000002U /*!< Replace original alpha channel value by programmed alpha value + with original alpha channel value */ /** * @} */ @@ -243,8 +243,8 @@ typedef struct __DMA2D_HandleTypeDef /** @defgroup DMA2D_CLUT_CM DMA2D CLUT Color Mode * @{ */ -#define DMA2D_CCM_ARGB8888 ((uint32_t)0x00000000U) /*!< ARGB8888 DMA2D CLUT color mode */ -#define DMA2D_CCM_RGB888 ((uint32_t)0x00000001U) /*!< RGB888 DMA2D CLUT color mode */ +#define DMA2D_CCM_ARGB8888 0x00000000U /*!< ARGB8888 DMA2D CLUT color mode */ +#define DMA2D_CCM_RGB888 0x00000001U /*!< RGB888 DMA2D CLUT color mode */ /** * @} */ @@ -302,7 +302,7 @@ typedef struct __DMA2D_HandleTypeDef * @param __HANDLE__: DMA2D handle * @retval None. */ -#define __HAL_DMA2D_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA2D_CR_START) +#define __HAL_DMA2D_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA2D_CR_START) /* Interrupt & Flag management */ /** @@ -471,7 +471,7 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_Maximum_Line_WaterMark DMA2D Maximum Line Watermark * @{ */ -#define DMA2D_LINE_WATERMARK_MAX DMA2D_LWR_LW /*!< DMA2D maximum line watermark */ +#define DMA2D_LINE_WATERMARK_MAX DMA2D_LWR_LW /*!< DMA2D maximum line watermark */ /** * @} */ @@ -479,7 +479,7 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_Color_Value DMA2D Color Value * @{ */ -#define DMA2D_COLOR_VALUE ((uint32_t)0x000000FFU) /*!< Color value mask */ +#define DMA2D_COLOR_VALUE 0x000000FFU /*!< Color value mask */ /** * @} */ @@ -487,7 +487,7 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_Max_Layer DMA2D Maximum Number of Layers * @{ */ -#define DMA2D_MAX_LAYER 2U /*!< DMA2D maximum number of layers */ +#define DMA2D_MAX_LAYER 2U /*!< DMA2D maximum number of layers */ /** * @} */ @@ -495,7 +495,7 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_Offset DMA2D Offset * @{ */ -#define DMA2D_OFFSET DMA2D_FGOR_LO /*!< Line Offset */ +#define DMA2D_OFFSET DMA2D_FGOR_LO /*!< Line Offset */ /** * @} */ @@ -503,8 +503,8 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_Size DMA2D Size * @{ */ -#define DMA2D_PIXEL (DMA2D_NLR_PL >> 16U) /*!< DMA2D number of pixels per line */ -#define DMA2D_LINE DMA2D_NLR_NL /*!< DMA2D number of lines */ +#define DMA2D_PIXEL (DMA2D_NLR_PL >> 16U) /*!< DMA2D number of pixels per line */ +#define DMA2D_LINE DMA2D_NLR_NL /*!< DMA2D number of lines */ /** * @} */ @@ -512,7 +512,7 @@ uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); /** @defgroup DMA2D_CLUT_Size DMA2D CLUT Size * @{ */ -#define DMA2D_CLUT_SIZE (DMA2D_FGPFCCR_CS >> 8U) /*!< DMA2D CLUT size */ +#define DMA2D_CLUT_SIZE (DMA2D_FGPFCCR_CS >> 8U) /*!< DMA2D CLUT size */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h index ef6ab99..714800b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dma_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DMA HAL extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h index e7bc95d..7c0ecdb 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dsi.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_dsi.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of DSI HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -62,15 +62,15 @@ */ typedef struct { - uint32_t AutomaticClockLaneControl; /*!< Automatic clock lane control - This parameter can be any value of @ref DSI_Automatic_Clk_Lane_Control */ - - uint32_t TXEscapeCkdiv; /*!< TX Escape clock division - The values 0 and 1 stop the TX_ESC clock generation */ - - uint32_t NumberOfLanes; /*!< Number of lanes - This parameter can be any value of @ref DSI_Number_Of_Lanes */ - + uint32_t AutomaticClockLaneControl; /*!< Automatic clock lane control + This parameter can be any value of @ref DSI_Automatic_Clk_Lane_Control */ + + uint32_t TXEscapeCkdiv; /*!< TX Escape clock division + The values 0 and 1 stop the TX_ESC clock generation */ + + uint32_t NumberOfLanes; /*!< Number of lanes + This parameter can be any value of @ref DSI_Number_Of_Lanes */ + }DSI_InitTypeDef; /** @@ -78,15 +78,15 @@ typedef struct */ typedef struct { - uint32_t PLLNDIV; /*!< PLL Loop Division Factor - This parameter must be a value between 10 and 125 */ - - uint32_t PLLIDF; /*!< PLL Input Division Factor - This parameter can be any value of @ref DSI_PLL_IDF */ - - uint32_t PLLODF; /*!< PLL Output Division Factor - This parameter can be any value of @ref DSI_PLL_ODF */ - + uint32_t PLLNDIV; /*!< PLL Loop Division Factor + This parameter must be a value between 10 and 125 */ + + uint32_t PLLIDF; /*!< PLL Input Division Factor + This parameter can be any value of @ref DSI_PLL_IDF */ + + uint32_t PLLODF; /*!< PLL Output Division Factor + This parameter can be any value of @ref DSI_PLL_ODF */ + }DSI_PLLInitTypeDef; /** @@ -172,38 +172,38 @@ typedef struct */ typedef struct { - uint32_t VirtualChannelID; /*!< Virtual channel ID */ - - uint32_t ColorCoding; /*!< Color coding for LTDC interface - This parameter can be any value of @ref DSI_Color_Coding */ - - uint32_t CommandSize; /*!< Maximum allowed size for an LTDC write memory command, measured in - pixels. This parameter can be any value between 0x00 and 0xFFFFU */ - - uint32_t TearingEffectSource; /*!< Tearing effect source - This parameter can be any value of @ref DSI_TearingEffectSource */ - - uint32_t TearingEffectPolarity; /*!< Tearing effect pin polarity - This parameter can be any value of @ref DSI_TearingEffectPolarity */ - - uint32_t HSPolarity; /*!< HSYNC pin polarity - This parameter can be any value of @ref DSI_HSYNC_Polarity */ - - uint32_t VSPolarity; /*!< VSYNC pin polarity - This parameter can be any value of @ref DSI_VSYNC_Active_Polarity */ - - uint32_t DEPolarity; /*!< Data Enable pin polarity - This parameter can be any value of @ref DSI_DATA_ENABLE_Polarity */ - - uint32_t VSyncPol; /*!< VSync edge on which the LTDC is halted - This parameter can be any value of @ref DSI_Vsync_Polarity */ - - uint32_t AutomaticRefresh; /*!< Automatic refresh mode - This parameter can be any value of @ref DSI_AutomaticRefresh */ - - uint32_t TEAcknowledgeRequest; /*!< Tearing Effect Acknowledge Request Enable - This parameter can be any value of @ref DSI_TE_AcknowledgeRequest */ - + uint32_t VirtualChannelID; /*!< Virtual channel ID */ + + uint32_t ColorCoding; /*!< Color coding for LTDC interface + This parameter can be any value of @ref DSI_Color_Coding */ + + uint32_t CommandSize; /*!< Maximum allowed size for an LTDC write memory command, measured in + pixels. This parameter can be any value between 0x00 and 0xFFFFU */ + + uint32_t TearingEffectSource; /*!< Tearing effect source + This parameter can be any value of @ref DSI_TearingEffectSource */ + + uint32_t TearingEffectPolarity; /*!< Tearing effect pin polarity + This parameter can be any value of @ref DSI_TearingEffectPolarity */ + + uint32_t HSPolarity; /*!< HSYNC pin polarity + This parameter can be any value of @ref DSI_HSYNC_Polarity */ + + uint32_t VSPolarity; /*!< VSYNC pin polarity + This parameter can be any value of @ref DSI_VSYNC_Active_Polarity */ + + uint32_t DEPolarity; /*!< Data Enable pin polarity + This parameter can be any value of @ref DSI_DATA_ENABLE_Polarity */ + + uint32_t VSyncPol; /*!< VSync edge on which the LTDC is halted + This parameter can be any value of @ref DSI_Vsync_Polarity */ + + uint32_t AutomaticRefresh; /*!< Automatic refresh mode + This parameter can be any value of @ref DSI_AutomaticRefresh */ + + uint32_t TEAcknowledgeRequest; /*!< Tearing Effect Acknowledge Request Enable + This parameter can be any value of @ref DSI_TE_AcknowledgeRequest */ + }DSI_CmdCfgTypeDef; /** @@ -211,45 +211,45 @@ typedef struct */ typedef struct { - uint32_t LPGenShortWriteNoP; /*!< Generic Short Write Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteNoP */ - - uint32_t LPGenShortWriteOneP; /*!< Generic Short Write One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteOneP */ - - uint32_t LPGenShortWriteTwoP; /*!< Generic Short Write Two parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortWriteTwoP */ - - uint32_t LPGenShortReadNoP; /*!< Generic Short Read Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadNoP */ - - uint32_t LPGenShortReadOneP; /*!< Generic Short Read One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadOneP */ - - uint32_t LPGenShortReadTwoP; /*!< Generic Short Read Two parameters Transmission - This parameter can be any value of @ref DSI_LP_LPGenShortReadTwoP */ - - uint32_t LPGenLongWrite; /*!< Generic Long Write Transmission - This parameter can be any value of @ref DSI_LP_LPGenLongWrite */ - - uint32_t LPDcsShortWriteNoP; /*!< DCS Short Write Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortWriteNoP */ - - uint32_t LPDcsShortWriteOneP; /*!< DCS Short Write One parameter Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortWriteOneP */ - - uint32_t LPDcsShortReadNoP; /*!< DCS Short Read Zero parameters Transmission - This parameter can be any value of @ref DSI_LP_LPDcsShortReadNoP */ - - uint32_t LPDcsLongWrite; /*!< DCS Long Write Transmission - This parameter can be any value of @ref DSI_LP_LPDcsLongWrite */ - - uint32_t LPMaxReadPacket; /*!< Maximum Read Packet Size Transmission - This parameter can be any value of @ref DSI_LP_LPMaxReadPacket */ - - uint32_t AcknowledgeRequest; /*!< Acknowledge Request Enable - This parameter can be any value of @ref DSI_AcknowledgeRequest */ - + uint32_t LPGenShortWriteNoP; /*!< Generic Short Write Zero parameters Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortWriteNoP */ + + uint32_t LPGenShortWriteOneP; /*!< Generic Short Write One parameter Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortWriteOneP */ + + uint32_t LPGenShortWriteTwoP; /*!< Generic Short Write Two parameters Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortWriteTwoP */ + + uint32_t LPGenShortReadNoP; /*!< Generic Short Read Zero parameters Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortReadNoP */ + + uint32_t LPGenShortReadOneP; /*!< Generic Short Read One parameter Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortReadOneP */ + + uint32_t LPGenShortReadTwoP; /*!< Generic Short Read Two parameters Transmission + This parameter can be any value of @ref DSI_LP_LPGenShortReadTwoP */ + + uint32_t LPGenLongWrite; /*!< Generic Long Write Transmission + This parameter can be any value of @ref DSI_LP_LPGenLongWrite */ + + uint32_t LPDcsShortWriteNoP; /*!< DCS Short Write Zero parameters Transmission + This parameter can be any value of @ref DSI_LP_LPDcsShortWriteNoP */ + + uint32_t LPDcsShortWriteOneP; /*!< DCS Short Write One parameter Transmission + This parameter can be any value of @ref DSI_LP_LPDcsShortWriteOneP */ + + uint32_t LPDcsShortReadNoP; /*!< DCS Short Read Zero parameters Transmission + This parameter can be any value of @ref DSI_LP_LPDcsShortReadNoP */ + + uint32_t LPDcsLongWrite; /*!< DCS Long Write Transmission + This parameter can be any value of @ref DSI_LP_LPDcsLongWrite */ + + uint32_t LPMaxReadPacket; /*!< Maximum Read Packet Size Transmission + This parameter can be any value of @ref DSI_LP_LPMaxReadPacket */ + + uint32_t AcknowledgeRequest; /*!< Acknowledge Request Enable + This parameter can be any value of @ref DSI_AcknowledgeRequest */ + }DSI_LPCmdTypeDef; /** @@ -257,23 +257,23 @@ typedef struct */ typedef struct { - uint32_t ClockLaneHS2LPTime; /*!< The maximum time that the D-PHY clock lane takes to go from high-speed - to low-power transmission */ - - uint32_t ClockLaneLP2HSTime; /*!< The maximum time that the D-PHY clock lane takes to go from low-power - to high-speed transmission */ - - uint32_t DataLaneHS2LPTime; /*!< The maximum time that the D-PHY data lanes takes to go from high-speed - to low-power transmission */ - - uint32_t DataLaneLP2HSTime; /*!< The maximum time that the D-PHY data lanes takes to go from low-power - to high-speed transmission */ - - uint32_t DataLaneMaxReadTime; /*!< The maximum time required to perform a read command */ - - uint32_t StopWaitTime; /*!< The minimum wait period to request a High-Speed transmission after the - Stop state */ - + uint32_t ClockLaneHS2LPTime; /*!< The maximum time that the D-PHY clock lane takes to go from high-speed + to low-power transmission */ + + uint32_t ClockLaneLP2HSTime; /*!< The maximum time that the D-PHY clock lane takes to go from low-power + to high-speed transmission */ + + uint32_t DataLaneHS2LPTime; /*!< The maximum time that the D-PHY data lanes takes to go from high-speed + to low-power transmission */ + + uint32_t DataLaneLP2HSTime; /*!< The maximum time that the D-PHY data lanes takes to go from low-power + to high-speed transmission */ + + uint32_t DataLaneMaxReadTime; /*!< The maximum time required to perform a read command */ + + uint32_t StopWaitTime; /*!< The minimum wait period to request a High-Speed transmission after the + Stop state */ + }DSI_PHY_TimerTypeDef; /** @@ -282,24 +282,24 @@ typedef struct typedef struct { uint32_t TimeoutCkdiv; /*!< Time-out clock division */ - + uint32_t HighSpeedTransmissionTimeout; /*!< High-speed transmission time-out */ - + uint32_t LowPowerReceptionTimeout; /*!< Low-power reception time-out */ - + uint32_t HighSpeedReadTimeout; /*!< High-speed read time-out */ - + uint32_t LowPowerReadTimeout; /*!< Low-power read time-out */ - + uint32_t HighSpeedWriteTimeout; /*!< High-speed write time-out */ - + uint32_t HighSpeedWritePrespMode; /*!< High-speed write presp mode This parameter can be any value of @ref DSI_HS_PrespMode */ - + uint32_t LowPowerWriteTimeout; /*!< Low-speed write time-out */ - + uint32_t BTATimeout; /*!< BTA time-out */ - + }DSI_HOST_TimeoutTypeDef; /** @@ -382,9 +382,9 @@ typedef struct /** @defgroup DSI_Video_Mode_Type DSI Video Mode Type * @{ */ -#define DSI_VID_MODE_NB_PULSES 0U -#define DSI_VID_MODE_NB_EVENTS 1U -#define DSI_VID_MODE_BURST 2U +#define DSI_VID_MODE_NB_PULSES 0U +#define DSI_VID_MODE_NB_EVENTS 1U +#define DSI_VID_MODE_BURST 2U /** * @} */ @@ -392,8 +392,8 @@ typedef struct /** @defgroup DSI_Color_Mode DSI Color Mode * @{ */ -#define DSI_COLOR_MODE_FULL ((uint32_t)0x00000000U) -#define DSI_COLOR_MODE_EIGHT DSI_WCR_COLM +#define DSI_COLOR_MODE_FULL 0x00000000U +#define DSI_COLOR_MODE_EIGHT DSI_WCR_COLM /** * @} */ @@ -401,8 +401,8 @@ typedef struct /** @defgroup DSI_ShutDown DSI ShutDown * @{ */ -#define DSI_DISPLAY_ON ((uint32_t)0x00000000U) -#define DSI_DISPLAY_OFF DSI_WCR_SHTDN +#define DSI_DISPLAY_ON 0x00000000U +#define DSI_DISPLAY_OFF DSI_WCR_SHTDN /** * @} */ @@ -410,8 +410,8 @@ typedef struct /** @defgroup DSI_LP_Command DSI LP Command * @{ */ -#define DSI_LP_COMMAND_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_COMMAND_ENABLE DSI_VMCR_LPCE +#define DSI_LP_COMMAND_DISABLE 0x00000000U +#define DSI_LP_COMMAND_ENABLE DSI_VMCR_LPCE /** * @} */ @@ -419,8 +419,8 @@ typedef struct /** @defgroup DSI_LP_HFP DSI LP HFP * @{ */ -#define DSI_LP_HFP_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_HFP_ENABLE DSI_VMCR_LPHFPE +#define DSI_LP_HFP_DISABLE 0x00000000U +#define DSI_LP_HFP_ENABLE DSI_VMCR_LPHFPE /** * @} */ @@ -428,8 +428,8 @@ typedef struct /** @defgroup DSI_LP_HBP DSI LP HBP * @{ */ -#define DSI_LP_HBP_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_HBP_ENABLE DSI_VMCR_LPHBPE +#define DSI_LP_HBP_DISABLE 0x00000000U +#define DSI_LP_HBP_ENABLE DSI_VMCR_LPHBPE /** * @} */ @@ -437,8 +437,8 @@ typedef struct /** @defgroup DSI_LP_VACT DSI LP VACT * @{ */ -#define DSI_LP_VACT_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_VACT_ENABLE DSI_VMCR_LPVAE +#define DSI_LP_VACT_DISABLE 0x00000000U +#define DSI_LP_VACT_ENABLE DSI_VMCR_LPVAE /** * @} */ @@ -446,8 +446,8 @@ typedef struct /** @defgroup DSI_LP_VFP DSI LP VFP * @{ */ -#define DSI_LP_VFP_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_VFP_ENABLE DSI_VMCR_LPVFPE +#define DSI_LP_VFP_DISABLE 0x00000000U +#define DSI_LP_VFP_ENABLE DSI_VMCR_LPVFPE /** * @} */ @@ -455,8 +455,8 @@ typedef struct /** @defgroup DSI_LP_VBP DSI LP VBP * @{ */ -#define DSI_LP_VBP_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_VBP_ENABLE DSI_VMCR_LPVBPE +#define DSI_LP_VBP_DISABLE 0x00000000U +#define DSI_LP_VBP_ENABLE DSI_VMCR_LPVBPE /** * @} */ @@ -464,8 +464,8 @@ typedef struct /** @defgroup DSI_LP_VSYNC DSI LP VSYNC * @{ */ -#define DSI_LP_VSYNC_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_VSYNC_ENABLE DSI_VMCR_LPVSAE +#define DSI_LP_VSYNC_DISABLE 0x00000000U +#define DSI_LP_VSYNC_ENABLE DSI_VMCR_LPVSAE /** * @} */ @@ -473,8 +473,8 @@ typedef struct /** @defgroup DSI_FBTA_acknowledge DSI FBTA Acknowledge * @{ */ -#define DSI_FBTAA_DISABLE ((uint32_t)0x00000000U) -#define DSI_FBTAA_ENABLE DSI_VMCR_FBTAAE +#define DSI_FBTAA_DISABLE 0x00000000U +#define DSI_FBTAA_ENABLE DSI_VMCR_FBTAAE /** * @} */ @@ -482,8 +482,8 @@ typedef struct /** @defgroup DSI_TearingEffectSource DSI Tearing Effect Source * @{ */ -#define DSI_TE_DSILINK ((uint32_t)0x00000000U) -#define DSI_TE_EXTERNAL DSI_WCFGR_TESRC +#define DSI_TE_DSILINK 0x00000000U +#define DSI_TE_EXTERNAL DSI_WCFGR_TESRC /** * @} */ @@ -491,8 +491,8 @@ typedef struct /** @defgroup DSI_TearingEffectPolarity DSI Tearing Effect Polarity * @{ */ -#define DSI_TE_RISING_EDGE ((uint32_t)0x00000000U) -#define DSI_TE_FALLING_EDGE DSI_WCFGR_TEPOL +#define DSI_TE_RISING_EDGE 0x00000000U +#define DSI_TE_FALLING_EDGE DSI_WCFGR_TEPOL /** * @} */ @@ -500,8 +500,8 @@ typedef struct /** @defgroup DSI_Vsync_Polarity DSI Vsync Polarity * @{ */ -#define DSI_VSYNC_FALLING ((uint32_t)0x00000000U) -#define DSI_VSYNC_RISING DSI_WCFGR_VSPOL +#define DSI_VSYNC_FALLING 0x00000000U +#define DSI_VSYNC_RISING DSI_WCFGR_VSPOL /** * @} */ @@ -509,8 +509,8 @@ typedef struct /** @defgroup DSI_AutomaticRefresh DSI Automatic Refresh * @{ */ -#define DSI_AR_DISABLE ((uint32_t)0x00000000U) -#define DSI_AR_ENABLE DSI_WCFGR_AR +#define DSI_AR_DISABLE 0x00000000U +#define DSI_AR_ENABLE DSI_WCFGR_AR /** * @} */ @@ -518,8 +518,8 @@ typedef struct /** @defgroup DSI_TE_AcknowledgeRequest DSI TE Acknowledge Request * @{ */ -#define DSI_TE_ACKNOWLEDGE_DISABLE ((uint32_t)0x00000000U) -#define DSI_TE_ACKNOWLEDGE_ENABLE DSI_CMCR_TEARE +#define DSI_TE_ACKNOWLEDGE_DISABLE 0x00000000U +#define DSI_TE_ACKNOWLEDGE_ENABLE DSI_CMCR_TEARE /** * @} */ @@ -527,8 +527,8 @@ typedef struct /** @defgroup DSI_AcknowledgeRequest DSI Acknowledge Request * @{ */ -#define DSI_ACKNOWLEDGE_DISABLE ((uint32_t)0x00000000U) -#define DSI_ACKNOWLEDGE_ENABLE DSI_CMCR_ARE +#define DSI_ACKNOWLEDGE_DISABLE 0x00000000U +#define DSI_ACKNOWLEDGE_ENABLE DSI_CMCR_ARE /** * @} */ @@ -536,8 +536,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortWriteNoP DSI LP LPGen Short Write NoP * @{ */ -#define DSI_LP_GSW0P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSW0P_ENABLE DSI_CMCR_GSW0TX +#define DSI_LP_GSW0P_DISABLE 0x00000000U +#define DSI_LP_GSW0P_ENABLE DSI_CMCR_GSW0TX /** * @} */ @@ -545,8 +545,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortWriteOneP DSI LP LPGen Short Write OneP * @{ */ -#define DSI_LP_GSW1P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSW1P_ENABLE DSI_CMCR_GSW1TX +#define DSI_LP_GSW1P_DISABLE 0x00000000U +#define DSI_LP_GSW1P_ENABLE DSI_CMCR_GSW1TX /** * @} */ @@ -554,8 +554,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortWriteTwoP DSI LP LPGen Short Write TwoP * @{ */ -#define DSI_LP_GSW2P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSW2P_ENABLE DSI_CMCR_GSW2TX +#define DSI_LP_GSW2P_DISABLE 0x00000000U +#define DSI_LP_GSW2P_ENABLE DSI_CMCR_GSW2TX /** * @} */ @@ -563,8 +563,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortReadNoP DSI LP LPGen Short Read NoP * @{ */ -#define DSI_LP_GSR0P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSR0P_ENABLE DSI_CMCR_GSR0TX +#define DSI_LP_GSR0P_DISABLE 0x00000000U +#define DSI_LP_GSR0P_ENABLE DSI_CMCR_GSR0TX /** * @} */ @@ -572,8 +572,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortReadOneP DSI LP LPGen Short Read OneP * @{ */ -#define DSI_LP_GSR1P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSR1P_ENABLE DSI_CMCR_GSR1TX +#define DSI_LP_GSR1P_DISABLE 0x00000000U +#define DSI_LP_GSR1P_ENABLE DSI_CMCR_GSR1TX /** * @} */ @@ -581,8 +581,8 @@ typedef struct /** @defgroup DSI_LP_LPGenShortReadTwoP DSI LP LPGen Short Read TwoP * @{ */ -#define DSI_LP_GSR2P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GSR2P_ENABLE DSI_CMCR_GSR2TX +#define DSI_LP_GSR2P_DISABLE 0x00000000U +#define DSI_LP_GSR2P_ENABLE DSI_CMCR_GSR2TX /** * @} */ @@ -590,8 +590,8 @@ typedef struct /** @defgroup DSI_LP_LPGenLongWrite DSI LP LPGen LongWrite * @{ */ -#define DSI_LP_GLW_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_GLW_ENABLE DSI_CMCR_GLWTX +#define DSI_LP_GLW_DISABLE 0x00000000U +#define DSI_LP_GLW_ENABLE DSI_CMCR_GLWTX /** * @} */ @@ -599,8 +599,8 @@ typedef struct /** @defgroup DSI_LP_LPDcsShortWriteNoP DSI LP LPDcs Short Write NoP * @{ */ -#define DSI_LP_DSW0P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_DSW0P_ENABLE DSI_CMCR_DSW0TX +#define DSI_LP_DSW0P_DISABLE 0x00000000U +#define DSI_LP_DSW0P_ENABLE DSI_CMCR_DSW0TX /** * @} */ @@ -608,8 +608,8 @@ typedef struct /** @defgroup DSI_LP_LPDcsShortWriteOneP DSI LP LPDcs Short Write OneP * @{ */ -#define DSI_LP_DSW1P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_DSW1P_ENABLE DSI_CMCR_DSW1TX +#define DSI_LP_DSW1P_DISABLE 0x00000000U +#define DSI_LP_DSW1P_ENABLE DSI_CMCR_DSW1TX /** * @} */ @@ -617,8 +617,8 @@ typedef struct /** @defgroup DSI_LP_LPDcsShortReadNoP DSI LP LPDcs Short Read NoP * @{ */ -#define DSI_LP_DSR0P_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_DSR0P_ENABLE DSI_CMCR_DSR0TX +#define DSI_LP_DSR0P_DISABLE 0x00000000U +#define DSI_LP_DSR0P_ENABLE DSI_CMCR_DSR0TX /** * @} */ @@ -626,8 +626,8 @@ typedef struct /** @defgroup DSI_LP_LPDcsLongWrite DSI LP LPDcs Long Write * @{ */ -#define DSI_LP_DLW_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_DLW_ENABLE DSI_CMCR_DLWTX +#define DSI_LP_DLW_DISABLE 0x00000000U +#define DSI_LP_DLW_ENABLE DSI_CMCR_DLWTX /** * @} */ @@ -635,8 +635,8 @@ typedef struct /** @defgroup DSI_LP_LPMaxReadPacket DSI LP LPMax Read Packet * @{ */ -#define DSI_LP_MRDP_DISABLE ((uint32_t)0x00000000U) -#define DSI_LP_MRDP_ENABLE DSI_CMCR_MRDPS +#define DSI_LP_MRDP_DISABLE 0x00000000U +#define DSI_LP_MRDP_ENABLE DSI_CMCR_MRDPS /** * @} */ @@ -644,8 +644,8 @@ typedef struct /** @defgroup DSI_HS_PrespMode DSI HS Presp Mode * @{ */ -#define DSI_HS_PM_DISABLE ((uint32_t)0x00000000U) -#define DSI_HS_PM_ENABLE DSI_TCCR3_PM +#define DSI_HS_PM_DISABLE 0x00000000U +#define DSI_HS_PM_ENABLE DSI_TCCR3_PM /** * @} */ @@ -654,7 +654,7 @@ typedef struct /** @defgroup DSI_Automatic_Clk_Lane_Control DSI Automatic Clk Lane Control * @{ */ -#define DSI_AUTO_CLK_LANE_CTRL_DISABLE ((uint32_t)0x00000000U) +#define DSI_AUTO_CLK_LANE_CTRL_DISABLE 0x00000000U #define DSI_AUTO_CLK_LANE_CTRL_ENABLE DSI_CLCR_ACR /** * @} @@ -663,8 +663,8 @@ typedef struct /** @defgroup DSI_Number_Of_Lanes DSI Number Of Lanes * @{ */ -#define DSI_ONE_DATA_LANE 0U -#define DSI_TWO_DATA_LANES 1U +#define DSI_ONE_DATA_LANE 0U +#define DSI_TWO_DATA_LANES 1U /** * @} */ @@ -672,14 +672,14 @@ typedef struct /** @defgroup DSI_FlowControl DSI Flow Control * @{ */ -#define DSI_FLOW_CONTROL_CRC_RX DSI_PCR_CRCRXE -#define DSI_FLOW_CONTROL_ECC_RX DSI_PCR_ECCRXE -#define DSI_FLOW_CONTROL_BTA DSI_PCR_BTAE -#define DSI_FLOW_CONTROL_EOTP_RX DSI_PCR_ETRXE -#define DSI_FLOW_CONTROL_EOTP_TX DSI_PCR_ETTXE -#define DSI_FLOW_CONTROL_ALL (DSI_FLOW_CONTROL_CRC_RX | DSI_FLOW_CONTROL_ECC_RX | \ - DSI_FLOW_CONTROL_BTA | DSI_FLOW_CONTROL_EOTP_RX | \ - DSI_FLOW_CONTROL_EOTP_TX) +#define DSI_FLOW_CONTROL_CRC_RX DSI_PCR_CRCRXE +#define DSI_FLOW_CONTROL_ECC_RX DSI_PCR_ECCRXE +#define DSI_FLOW_CONTROL_BTA DSI_PCR_BTAE +#define DSI_FLOW_CONTROL_EOTP_RX DSI_PCR_ETRXE +#define DSI_FLOW_CONTROL_EOTP_TX DSI_PCR_ETTXE +#define DSI_FLOW_CONTROL_ALL (DSI_FLOW_CONTROL_CRC_RX | DSI_FLOW_CONTROL_ECC_RX | \ + DSI_FLOW_CONTROL_BTA | DSI_FLOW_CONTROL_EOTP_RX | \ + DSI_FLOW_CONTROL_EOTP_TX) /** * @} */ @@ -687,9 +687,9 @@ typedef struct /** @defgroup DSI_Color_Coding DSI Color Coding * @{ */ -#define DSI_RGB565 ((uint32_t)0x00000000U) /*!< The values 0x00000001U and 0x00000002U can also be used for the RGB565 color mode configuration */ -#define DSI_RGB666 ((uint32_t)0x00000003U) /*!< The value 0x00000004U can also be used for the RGB666 color mode configuration */ -#define DSI_RGB888 ((uint32_t)0x00000005U) +#define DSI_RGB565 0x00000000U /*!< The values 0x00000001 and 0x00000002 can also be used for the RGB565 color mode configuration */ +#define DSI_RGB666 0x00000003U /*!< The value 0x00000004 can also be used for the RGB666 color mode configuration */ +#define DSI_RGB888 0x00000005U /** * @} */ @@ -698,7 +698,7 @@ typedef struct * @{ */ #define DSI_LOOSELY_PACKED_ENABLE DSI_LCOLCR_LPE -#define DSI_LOOSELY_PACKED_DISABLE ((uint32_t)0x00000000U) +#define DSI_LOOSELY_PACKED_DISABLE 0x00000000U /** * @} */ @@ -706,7 +706,7 @@ typedef struct /** @defgroup DSI_HSYNC_Polarity DSI HSYNC Polarity * @{ */ -#define DSI_HSYNC_ACTIVE_HIGH ((uint32_t)0x00000000U) +#define DSI_HSYNC_ACTIVE_HIGH 0x00000000U #define DSI_HSYNC_ACTIVE_LOW DSI_LPCR_HSP /** * @} @@ -715,7 +715,7 @@ typedef struct /** @defgroup DSI_VSYNC_Active_Polarity DSI VSYNC Active Polarity * @{ */ -#define DSI_VSYNC_ACTIVE_HIGH ((uint32_t)0x00000000U) +#define DSI_VSYNC_ACTIVE_HIGH 0x00000000U #define DSI_VSYNC_ACTIVE_LOW DSI_LPCR_VSP /** * @} @@ -724,7 +724,7 @@ typedef struct /** @defgroup DSI_DATA_ENABLE_Polarity DSI DATA ENABLE Polarity * @{ */ -#define DSI_DATA_ENABLE_ACTIVE_HIGH ((uint32_t)0x00000000U) +#define DSI_DATA_ENABLE_ACTIVE_HIGH 0x00000000U #define DSI_DATA_ENABLE_ACTIVE_LOW DSI_LPCR_DEP /** * @} @@ -733,13 +733,13 @@ typedef struct /** @defgroup DSI_PLL_IDF DSI PLL IDF * @{ */ -#define DSI_PLL_IN_DIV1 ((uint32_t)0x00000001U) -#define DSI_PLL_IN_DIV2 ((uint32_t)0x00000002U) -#define DSI_PLL_IN_DIV3 ((uint32_t)0x00000003U) -#define DSI_PLL_IN_DIV4 ((uint32_t)0x00000004U) -#define DSI_PLL_IN_DIV5 ((uint32_t)0x00000005U) -#define DSI_PLL_IN_DIV6 ((uint32_t)0x00000006U) -#define DSI_PLL_IN_DIV7 ((uint32_t)0x00000007U) +#define DSI_PLL_IN_DIV1 0x00000001U +#define DSI_PLL_IN_DIV2 0x00000002U +#define DSI_PLL_IN_DIV3 0x00000003U +#define DSI_PLL_IN_DIV4 0x00000004U +#define DSI_PLL_IN_DIV5 0x00000005U +#define DSI_PLL_IN_DIV6 0x00000006U +#define DSI_PLL_IN_DIV7 0x00000007U /** * @} */ @@ -747,10 +747,10 @@ typedef struct /** @defgroup DSI_PLL_ODF DSI PLL ODF * @{ */ -#define DSI_PLL_OUT_DIV1 ((uint32_t)0x00000000U) -#define DSI_PLL_OUT_DIV2 ((uint32_t)0x00000001U) -#define DSI_PLL_OUT_DIV4 ((uint32_t)0x00000002U) -#define DSI_PLL_OUT_DIV8 ((uint32_t)0x00000003U) +#define DSI_PLL_OUT_DIV1 0x00000000U +#define DSI_PLL_OUT_DIV2 0x00000001U +#define DSI_PLL_OUT_DIV4 0x00000002U +#define DSI_PLL_OUT_DIV8 0x00000003U /** * @} */ @@ -758,14 +758,14 @@ typedef struct /** @defgroup DSI_Flags DSI Flags * @{ */ -#define DSI_FLAG_TE DSI_WISR_TEIF -#define DSI_FLAG_ER DSI_WISR_ERIF -#define DSI_FLAG_BUSY DSI_WISR_BUSY -#define DSI_FLAG_PLLLS DSI_WISR_PLLLS -#define DSI_FLAG_PLLL DSI_WISR_PLLLIF -#define DSI_FLAG_PLLU DSI_WISR_PLLUIF -#define DSI_FLAG_RRS DSI_WISR_RRS -#define DSI_FLAG_RR DSI_WISR_RRIF +#define DSI_FLAG_TE DSI_WISR_TEIF +#define DSI_FLAG_ER DSI_WISR_ERIF +#define DSI_FLAG_BUSY DSI_WISR_BUSY +#define DSI_FLAG_PLLLS DSI_WISR_PLLLS +#define DSI_FLAG_PLLL DSI_WISR_PLLLIF +#define DSI_FLAG_PLLU DSI_WISR_PLLUIF +#define DSI_FLAG_RRS DSI_WISR_RRS +#define DSI_FLAG_RR DSI_WISR_RRIF /** * @} */ @@ -773,11 +773,11 @@ typedef struct /** @defgroup DSI_Interrupts DSI Interrupts * @{ */ -#define DSI_IT_TE DSI_WIER_TEIE -#define DSI_IT_ER DSI_WIER_ERIE -#define DSI_IT_PLLL DSI_WIER_PLLLIE -#define DSI_IT_PLLU DSI_WIER_PLLUIE -#define DSI_IT_RR DSI_WIER_RRIE +#define DSI_IT_TE DSI_WIER_TEIE +#define DSI_IT_ER DSI_WIER_ERIE +#define DSI_IT_PLLL DSI_WIER_PLLLIE +#define DSI_IT_PLLU DSI_WIER_PLLUIE +#define DSI_IT_RR DSI_WIER_RRIE /** * @} */ @@ -785,11 +785,11 @@ typedef struct /** @defgroup DSI_SHORT_WRITE_PKT_Data_Type DSI SHORT WRITE PKT Data Type * @{ */ -#define DSI_DCS_SHORT_PKT_WRITE_P0 ((uint32_t)0x00000005U) /*!< DCS short write, no parameters */ -#define DSI_DCS_SHORT_PKT_WRITE_P1 ((uint32_t)0x00000015U) /*!< DCS short write, one parameter */ -#define DSI_GEN_SHORT_PKT_WRITE_P0 ((uint32_t)0x00000003U) /*!< Generic short write, no parameters */ -#define DSI_GEN_SHORT_PKT_WRITE_P1 ((uint32_t)0x00000013U) /*!< Generic short write, one parameter */ -#define DSI_GEN_SHORT_PKT_WRITE_P2 ((uint32_t)0x00000023U) /*!< Generic short write, two parameters */ +#define DSI_DCS_SHORT_PKT_WRITE_P0 0x00000005U /*!< DCS short write, no parameters */ +#define DSI_DCS_SHORT_PKT_WRITE_P1 0x00000015U /*!< DCS short write, one parameter */ +#define DSI_GEN_SHORT_PKT_WRITE_P0 0x00000003U /*!< Generic short write, no parameters */ +#define DSI_GEN_SHORT_PKT_WRITE_P1 0x00000013U /*!< Generic short write, one parameter */ +#define DSI_GEN_SHORT_PKT_WRITE_P2 0x00000023U /*!< Generic short write, two parameters */ /** * @} */ @@ -797,8 +797,8 @@ typedef struct /** @defgroup DSI_LONG_WRITE_PKT_Data_Type DSI LONG WRITE PKT Data Type * @{ */ -#define DSI_DCS_LONG_PKT_WRITE ((uint32_t)0x00000039U) /*!< DCS long write */ -#define DSI_GEN_LONG_PKT_WRITE ((uint32_t)0x00000029U) /*!< Generic long write */ +#define DSI_DCS_LONG_PKT_WRITE 0x00000039U /*!< DCS long write */ +#define DSI_GEN_LONG_PKT_WRITE 0x00000029U /*!< Generic long write */ /** * @} */ @@ -806,10 +806,10 @@ typedef struct /** @defgroup DSI_SHORT_READ_PKT_Data_Type DSI SHORT READ PKT Data Type * @{ */ -#define DSI_DCS_SHORT_PKT_READ ((uint32_t)0x00000006U) /*!< DCS short read */ -#define DSI_GEN_SHORT_PKT_READ_P0 ((uint32_t)0x00000004U) /*!< Generic short read, no parameters */ -#define DSI_GEN_SHORT_PKT_READ_P1 ((uint32_t)0x00000014U) /*!< Generic short read, one parameter */ -#define DSI_GEN_SHORT_PKT_READ_P2 ((uint32_t)0x00000024U) /*!< Generic short read, two parameters */ +#define DSI_DCS_SHORT_PKT_READ 0x00000006U /*!< DCS short read */ +#define DSI_GEN_SHORT_PKT_READ_P0 0x00000004U /*!< Generic short read, no parameters */ +#define DSI_GEN_SHORT_PKT_READ_P1 0x00000014U /*!< Generic short read, one parameter */ +#define DSI_GEN_SHORT_PKT_READ_P2 0x00000024U /*!< Generic short read, two parameters */ /** * @} */ @@ -817,17 +817,17 @@ typedef struct /** @defgroup DSI_Error_Data_Type DSI Error Data Type * @{ */ -#define HAL_DSI_ERROR_NONE 0 -#define HAL_DSI_ERROR_ACK ((uint32_t)0x00000001U) /*!< acknowledge errors */ -#define HAL_DSI_ERROR_PHY ((uint32_t)0x00000002U) /*!< PHY related errors */ -#define HAL_DSI_ERROR_TX ((uint32_t)0x00000004U) /*!< transmission error */ -#define HAL_DSI_ERROR_RX ((uint32_t)0x00000008U) /*!< reception error */ -#define HAL_DSI_ERROR_ECC ((uint32_t)0x00000010U) /*!< ECC errors */ -#define HAL_DSI_ERROR_CRC ((uint32_t)0x00000020U) /*!< CRC error */ -#define HAL_DSI_ERROR_PSE ((uint32_t)0x00000040U) /*!< Packet Size error */ -#define HAL_DSI_ERROR_EOT ((uint32_t)0x00000080U) /*!< End Of Transmission error */ -#define HAL_DSI_ERROR_OVF ((uint32_t)0x00000100U) /*!< FIFO overflow error */ -#define HAL_DSI_ERROR_GEN ((uint32_t)0x00000200U) /*!< Generic FIFO related errors */ +#define HAL_DSI_ERROR_NONE 0U +#define HAL_DSI_ERROR_ACK 0x00000001U /*!< acknowledge errors */ +#define HAL_DSI_ERROR_PHY 0x00000002U /*!< PHY related errors */ +#define HAL_DSI_ERROR_TX 0x00000004U /*!< transmission error */ +#define HAL_DSI_ERROR_RX 0x00000008U /*!< reception error */ +#define HAL_DSI_ERROR_ECC 0x00000010U /*!< ECC errors */ +#define HAL_DSI_ERROR_CRC 0x00000020U /*!< CRC error */ +#define HAL_DSI_ERROR_PSE 0x00000040U /*!< Packet Size error */ +#define HAL_DSI_ERROR_EOT 0x00000080U /*!< End Of Transmission error */ +#define HAL_DSI_ERROR_OVF 0x00000100U /*!< FIFO overflow error */ +#define HAL_DSI_ERROR_GEN 0x00000200U /*!< Generic FIFO related errors */ /** * @} */ @@ -835,8 +835,8 @@ typedef struct /** @defgroup DSI_Lane_Group DSI Lane Group * @{ */ -#define DSI_CLOCK_LANE ((uint32_t)0x00000000U) -#define DSI_DATA_LANES ((uint32_t)0x00000001U) +#define DSI_CLOCK_LANE 0x00000000U +#define DSI_DATA_LANES 0x00000001U /** * @} */ @@ -844,9 +844,9 @@ typedef struct /** @defgroup DSI_Communication_Delay DSI Communication Delay * @{ */ -#define DSI_SLEW_RATE_HSTX ((uint32_t)0x00000000U) -#define DSI_SLEW_RATE_LPTX ((uint32_t)0x00000001U) -#define DSI_HS_DELAY ((uint32_t)0x00000002U) +#define DSI_SLEW_RATE_HSTX 0x00000000U +#define DSI_SLEW_RATE_LPTX 0x00000001U +#define DSI_HS_DELAY 0x00000002U /** * @} */ @@ -854,8 +854,8 @@ typedef struct /** @defgroup DSI_CustomLane DSI CustomLane * @{ */ -#define DSI_SWAP_LANE_PINS ((uint32_t)0x00000000U) -#define DSI_INVERT_HS_SIGNAL ((uint32_t)0x00000001U) +#define DSI_SWAP_LANE_PINS 0x00000000U +#define DSI_INVERT_HS_SIGNAL 0x00000001U /** * @} */ @@ -863,9 +863,9 @@ typedef struct /** @defgroup DSI_Lane_Select DSI Lane Select * @{ */ -#define DSI_CLOCK_LANE ((uint32_t)0x00000000U) -#define DSI_DATA_LANE0 ((uint32_t)0x00000001U) -#define DSI_DATA_LANE1 ((uint32_t)0x00000002U) +#define DSI_CLOCK_LANE 0x00000000U +#define DSI_DATA_LANE0 0x00000001U +#define DSI_DATA_LANE1 0x00000002U /** * @} */ @@ -873,15 +873,15 @@ typedef struct /** @defgroup DSI_PHY_Timing DSI PHY Timing * @{ */ -#define DSI_TCLK_POST ((uint32_t)0x00000000U) -#define DSI_TLPX_CLK ((uint32_t)0x00000001U) -#define DSI_THS_EXIT ((uint32_t)0x00000002U) -#define DSI_TLPX_DATA ((uint32_t)0x00000003U) -#define DSI_THS_ZERO ((uint32_t)0x00000004U) -#define DSI_THS_TRAIL ((uint32_t)0x00000005U) -#define DSI_THS_PREPARE ((uint32_t)0x00000006U) -#define DSI_TCLK_ZERO ((uint32_t)0x00000007U) -#define DSI_TCLK_PREPARE ((uint32_t)0x00000008U) +#define DSI_TCLK_POST 0x00000000U +#define DSI_TLPX_CLK 0x00000001U +#define DSI_THS_EXIT 0x00000002U +#define DSI_TLPX_DATA 0x00000003U +#define DSI_THS_ZERO 0x00000004U +#define DSI_THS_TRAIL 0x00000005U +#define DSI_THS_PREPARE 0x00000006U +#define DSI_TCLK_ZERO 0x00000007U +#define DSI_TCLK_PREPARE 0x00000008U /** * @} */ @@ -1014,7 +1014,7 @@ typedef struct * @arg DSI_IT_RR : Regulator Ready Interrupt * @retval The state of INTERRUPT (SET or RESET). */ -#define __HAL_DSI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->WISR & (__INTERRUPT__)) +#define __HAL_DSI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->WIER & (__INTERRUPT__)) /* Exported functions --------------------------------------------------------*/ /** @defgroup DSI_Exported_Functions DSI Exported Functions diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h index 52ae250..8925fe9 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_eth.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of ETH HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -267,7 +267,7 @@ ((BUFFER) == ETH_DMARXDESC_BUFFER2)) #define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \ ((FLAG) == ETH_PMT_FLAG_MPR)) -#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xC7FE1800U) == 0x00U) && ((FLAG) != 0x00U)) +#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & 0xC7FE1800U) == 0x00U) && ((FLAG) != 0x00U)) #define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \ ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DATATRANSFERERROR) || \ ((FLAG) == ETH_DMA_FLAG_READWRITEERROR) || ((FLAG) == ETH_DMA_FLAG_ACCESSERROR) || \ @@ -279,14 +279,14 @@ ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \ ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \ ((FLAG) == ETH_DMA_FLAG_T)) -#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF1U) == 0x00U) && ((IT) != 0x00U)) +#define IS_ETH_MAC_IT(IT) ((((IT) & 0xFFFFFDF1U) == 0x00U) && ((IT) != 0x00U)) #define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \ ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \ ((IT) == ETH_MAC_IT_PMT)) #define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \ ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \ ((FLAG) == ETH_MAC_FLAG_PMT)) -#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xC7FE1800U) == 0x00U) && ((IT) != 0x00U)) +#define IS_ETH_DMA_IT(IT) ((((IT) & 0xC7FE1800U) == 0x00U) && ((IT) != 0x00U)) #define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \ ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \ ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \ @@ -298,7 +298,7 @@ ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T)) #define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_OVERFLOW_RXFIFOCOUNTER) || \ ((OVERFLOW) == ETH_DMA_OVERFLOW_MISSEDFRAMECOUNTER)) -#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFFU) == 0x00U) || (((IT) & (uint32_t)0xEFFDFF9FU) == 0x00U)) && \ +#define IS_ETH_MMC_IT(IT) (((((IT) & 0xFFDF3FFFU) == 0x00U) || (((IT) & 0xEFFDFF9FU) == 0x00U)) && \ ((IT) != 0x00U)) #define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \ ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \ @@ -314,45 +314,45 @@ * @{ */ /* Delay to wait when writing to some Ethernet registers */ -#define ETH_REG_WRITE_DELAY ((uint32_t)0x00000001U) +#define ETH_REG_WRITE_DELAY 0x00000001U /* ETHERNET Errors */ -#define ETH_SUCCESS ((uint32_t)0U) -#define ETH_ERROR ((uint32_t)1U) +#define ETH_SUCCESS 0U +#define ETH_ERROR 1U /* ETHERNET DMA Tx descriptors Collision Count Shift */ -#define ETH_DMATXDESC_COLLISION_COUNTSHIFT ((uint32_t)3U) +#define ETH_DMATXDESC_COLLISION_COUNTSHIFT 3U /* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ -#define ETH_DMATXDESC_BUFFER2_SIZESHIFT ((uint32_t)16U) +#define ETH_DMATXDESC_BUFFER2_SIZESHIFT 16U /* ETHERNET DMA Rx descriptors Frame Length Shift */ -#define ETH_DMARXDESC_FRAME_LENGTHSHIFT ((uint32_t)16U) +#define ETH_DMARXDESC_FRAME_LENGTHSHIFT 16U /* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ -#define ETH_DMARXDESC_BUFFER2_SIZESHIFT ((uint32_t)16U) +#define ETH_DMARXDESC_BUFFER2_SIZESHIFT 16U /* ETHERNET DMA Rx descriptors Frame length Shift */ -#define ETH_DMARXDESC_FRAMELENGTHSHIFT ((uint32_t)16U) +#define ETH_DMARXDESC_FRAMELENGTHSHIFT 16U /* ETHERNET MAC address offsets */ -#define ETH_MAC_ADDR_HBASE (uint32_t)(ETH_MAC_BASE + (uint32_t)0x40U) /* ETHERNET MAC address high offset */ -#define ETH_MAC_ADDR_LBASE (uint32_t)(ETH_MAC_BASE + (uint32_t)0x44U) /* ETHERNET MAC address low offset */ +#define ETH_MAC_ADDR_HBASE (uint32_t)(ETH_MAC_BASE + 0x40U) /* ETHERNET MAC address high offset */ +#define ETH_MAC_ADDR_LBASE (uint32_t)(ETH_MAC_BASE + 0x44U) /* ETHERNET MAC address low offset */ /* ETHERNET MACMIIAR register Mask */ -#define ETH_MACMIIAR_CR_MASK ((uint32_t)0xFFFFFFE3U) +#define ETH_MACMIIAR_CR_MASK 0xFFFFFFE3U /* ETHERNET MACCR register Mask */ -#define ETH_MACCR_CLEAR_MASK ((uint32_t)0xFF20810FU) +#define ETH_MACCR_CLEAR_MASK 0xFF20810FU /* ETHERNET MACFCR register Mask */ -#define ETH_MACFCR_CLEAR_MASK ((uint32_t)0x0000FF41U) +#define ETH_MACFCR_CLEAR_MASK 0x0000FF41U /* ETHERNET DMAOMR register Mask */ -#define ETH_DMAOMR_CLEAR_MASK ((uint32_t)0xF8DE3F23U) +#define ETH_DMAOMR_CLEAR_MASK 0xF8DE3F23U /* ETHERNET Remote Wake-up frame register length */ -#define ETH_WAKEUP_REGISTER_LENGTH 8 +#define ETH_WAKEUP_REGISTER_LENGTH 8U /* ETHERNET Missed frames counter Shift */ #define ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT 17U @@ -658,14 +658,14 @@ typedef struct /** @defgroup ETH_Buffers_setting ETH Buffers setting * @{ */ -#define ETH_MAX_PACKET_SIZE ((uint32_t)1524U) /*!< ETH_HEADER + ETH_EXTRA + ETH_VLAN_TAG + ETH_MAX_ETH_PAYLOAD + ETH_CRC */ -#define ETH_HEADER ((uint32_t)14U) /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ -#define ETH_CRC ((uint32_t)4U) /*!< Ethernet CRC */ -#define ETH_EXTRA ((uint32_t)2U) /*!< Extra bytes in some cases */ -#define ETH_VLAN_TAG ((uint32_t)4U) /*!< optional 802.1q VLAN Tag */ -#define ETH_MIN_ETH_PAYLOAD ((uint32_t)46U) /*!< Minimum Ethernet payload size */ -#define ETH_MAX_ETH_PAYLOAD ((uint32_t)1500U) /*!< Maximum Ethernet payload size */ -#define ETH_JUMBO_FRAME_PAYLOAD ((uint32_t)9000U) /*!< Jumbo frame payload size */ +#define ETH_MAX_PACKET_SIZE 1524U /*!< ETH_HEADER + ETH_EXTRA + ETH_VLAN_TAG + ETH_MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14U /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4U /*!< Ethernet CRC */ +#define ETH_EXTRA 2U /*!< Extra bytes in some cases */ +#define ETH_VLAN_TAG 4U /*!< optional 802.1q VLAN Tag */ +#define ETH_MIN_ETH_PAYLOAD 46U /*!< Minimum Ethernet payload size */ +#define ETH_MAX_ETH_PAYLOAD 1500U /*!< Maximum Ethernet payload size */ +#define ETH_JUMBO_FRAME_PAYLOAD 9000U /*!< Jumbo frame payload size */ /* Ethernet driver receive buffers are organized in a chained linked-list, when an ethernet packet is received, the Rx-DMA will transfer the packet from RxFIFO @@ -690,7 +690,7 @@ typedef struct /* 5 Ethernet driver receive buffers are used (in a chained linked list)*/ #ifndef ETH_RXBUFNB - #define ETH_RXBUFNB ((uint32_t)5U) /* 5 Rx buffers of size ETH_RX_BUF_SIZE */ + #define ETH_RXBUFNB 5U /* 5 Rx buffers of size ETH_RX_BUF_SIZE */ #endif @@ -717,7 +717,7 @@ typedef struct /* 5 ethernet driver transmit buffers are used (in a chained linked list)*/ #ifndef ETH_TXBUFNB - #define ETH_TXBUFNB ((uint32_t)5U) /* 5 Tx buffers of size ETH_TX_BUF_SIZE */ + #define ETH_TXBUFNB 5U /* 5 Tx buffers of size ETH_TX_BUF_SIZE */ #endif /** @@ -744,51 +744,51 @@ typedef struct /** * @brief Bit definition of TDES0 register: DMA Tx descriptor status register */ -#define ETH_DMATXDESC_OWN ((uint32_t)0x80000000U) /*!< OWN bit: descriptor is owned by DMA engine */ -#define ETH_DMATXDESC_IC ((uint32_t)0x40000000U) /*!< Interrupt on Completion */ -#define ETH_DMATXDESC_LS ((uint32_t)0x20000000U) /*!< Last Segment */ -#define ETH_DMATXDESC_FS ((uint32_t)0x10000000U) /*!< First Segment */ -#define ETH_DMATXDESC_DC ((uint32_t)0x08000000U) /*!< Disable CRC */ -#define ETH_DMATXDESC_DP ((uint32_t)0x04000000U) /*!< Disable Padding */ -#define ETH_DMATXDESC_TTSE ((uint32_t)0x02000000U) /*!< Transmit Time Stamp Enable */ -#define ETH_DMATXDESC_CIC ((uint32_t)0x00C00000U) /*!< Checksum Insertion Control: 4 cases */ -#define ETH_DMATXDESC_CIC_BYPASS ((uint32_t)0x00000000U) /*!< Do Nothing: Checksum Engine is bypassed */ -#define ETH_DMATXDESC_CIC_IPV4HEADER ((uint32_t)0x00400000U) /*!< IPV4 header Checksum Insertion */ -#define ETH_DMATXDESC_CIC_TCPUDPICMP_SEGMENT ((uint32_t)0x00800000U) /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ -#define ETH_DMATXDESC_CIC_TCPUDPICMP_FULL ((uint32_t)0x00C00000U) /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ -#define ETH_DMATXDESC_TER ((uint32_t)0x00200000U) /*!< Transmit End of Ring */ -#define ETH_DMATXDESC_TCH ((uint32_t)0x00100000U) /*!< Second Address Chained */ -#define ETH_DMATXDESC_TTSS ((uint32_t)0x00020000U) /*!< Tx Time Stamp Status */ -#define ETH_DMATXDESC_IHE ((uint32_t)0x00010000U) /*!< IP Header Error */ -#define ETH_DMATXDESC_ES ((uint32_t)0x00008000U) /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ -#define ETH_DMATXDESC_JT ((uint32_t)0x00004000U) /*!< Jabber Timeout */ -#define ETH_DMATXDESC_FF ((uint32_t)0x00002000U) /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ -#define ETH_DMATXDESC_PCE ((uint32_t)0x00001000U) /*!< Payload Checksum Error */ -#define ETH_DMATXDESC_LCA ((uint32_t)0x00000800U) /*!< Loss of Carrier: carrier lost during transmission */ -#define ETH_DMATXDESC_NC ((uint32_t)0x00000400U) /*!< No Carrier: no carrier signal from the transceiver */ -#define ETH_DMATXDESC_LCO ((uint32_t)0x00000200U) /*!< Late Collision: transmission aborted due to collision */ -#define ETH_DMATXDESC_EC ((uint32_t)0x00000100U) /*!< Excessive Collision: transmission aborted after 16 collisions */ -#define ETH_DMATXDESC_VF ((uint32_t)0x00000080U) /*!< VLAN Frame */ -#define ETH_DMATXDESC_CC ((uint32_t)0x00000078U) /*!< Collision Count */ -#define ETH_DMATXDESC_ED ((uint32_t)0x00000004U) /*!< Excessive Deferral */ -#define ETH_DMATXDESC_UF ((uint32_t)0x00000002U) /*!< Underflow Error: late data arrival from the memory */ -#define ETH_DMATXDESC_DB ((uint32_t)0x00000001U) /*!< Deferred Bit */ +#define ETH_DMATXDESC_OWN 0x80000000U /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATXDESC_IC 0x40000000U /*!< Interrupt on Completion */ +#define ETH_DMATXDESC_LS 0x20000000U /*!< Last Segment */ +#define ETH_DMATXDESC_FS 0x10000000U /*!< First Segment */ +#define ETH_DMATXDESC_DC 0x08000000U /*!< Disable CRC */ +#define ETH_DMATXDESC_DP 0x04000000U /*!< Disable Padding */ +#define ETH_DMATXDESC_TTSE 0x02000000U /*!< Transmit Time Stamp Enable */ +#define ETH_DMATXDESC_CIC 0x00C00000U /*!< Checksum Insertion Control: 4 cases */ +#define ETH_DMATXDESC_CIC_BYPASS 0x00000000U /*!< Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATXDESC_CIC_IPV4HEADER 0x00400000U /*!< IPV4 header Checksum Insertion */ +#define ETH_DMATXDESC_CIC_TCPUDPICMP_SEGMENT 0x00800000U /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATXDESC_CIC_TCPUDPICMP_FULL 0x00C00000U /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATXDESC_TER 0x00200000U /*!< Transmit End of Ring */ +#define ETH_DMATXDESC_TCH 0x00100000U /*!< Second Address Chained */ +#define ETH_DMATXDESC_TTSS 0x00020000U /*!< Tx Time Stamp Status */ +#define ETH_DMATXDESC_IHE 0x00010000U /*!< IP Header Error */ +#define ETH_DMATXDESC_ES 0x00008000U /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATXDESC_JT 0x00004000U /*!< Jabber Timeout */ +#define ETH_DMATXDESC_FF 0x00002000U /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATXDESC_PCE 0x00001000U /*!< Payload Checksum Error */ +#define ETH_DMATXDESC_LCA 0x00000800U /*!< Loss of Carrier: carrier lost during transmission */ +#define ETH_DMATXDESC_NC 0x00000400U /*!< No Carrier: no carrier signal from the transceiver */ +#define ETH_DMATXDESC_LCO 0x00000200U /*!< Late Collision: transmission aborted due to collision */ +#define ETH_DMATXDESC_EC 0x00000100U /*!< Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATXDESC_VF 0x00000080U /*!< VLAN Frame */ +#define ETH_DMATXDESC_CC 0x00000078U /*!< Collision Count */ +#define ETH_DMATXDESC_ED 0x00000004U /*!< Excessive Deferral */ +#define ETH_DMATXDESC_UF 0x00000002U /*!< Underflow Error: late data arrival from the memory */ +#define ETH_DMATXDESC_DB 0x00000001U /*!< Deferred Bit */ /** * @brief Bit definition of TDES1 register */ -#define ETH_DMATXDESC_TBS2 ((uint32_t)0x1FFF0000U) /*!< Transmit Buffer2 Size */ -#define ETH_DMATXDESC_TBS1 ((uint32_t)0x00001FFFU) /*!< Transmit Buffer1 Size */ +#define ETH_DMATXDESC_TBS2 0x1FFF0000U /*!< Transmit Buffer2 Size */ +#define ETH_DMATXDESC_TBS1 0x00001FFFU /*!< Transmit Buffer1 Size */ /** * @brief Bit definition of TDES2 register */ -#define ETH_DMATXDESC_B1AP ((uint32_t)0xFFFFFFFFU) /*!< Buffer1 Address Pointer */ +#define ETH_DMATXDESC_B1AP 0xFFFFFFFFU /*!< Buffer1 Address Pointer */ /** * @brief Bit definition of TDES3 register */ -#define ETH_DMATXDESC_B2AP ((uint32_t)0xFFFFFFFFU) /*!< Buffer2 Address Pointer */ +#define ETH_DMATXDESC_B2AP 0xFFFFFFFFU /*!< Buffer2 Address Pointer */ /*--------------------------------------------------------------------------------------------- TDES6 | Transmit Time Stamp Low [31:0] | @@ -797,10 +797,10 @@ typedef struct ----------------------------------------------------------------------------------------------*/ /* Bit definition of TDES6 register */ - #define ETH_DMAPTPTXDESC_TTSL ((uint32_t)0xFFFFFFFFU) /* Transmit Time Stamp Low */ + #define ETH_DMAPTPTXDESC_TTSL 0xFFFFFFFFU /* Transmit Time Stamp Low */ /* Bit definition of TDES7 register */ - #define ETH_DMAPTPTXDESC_TTSH ((uint32_t)0xFFFFFFFFU) /* Transmit Time Stamp High */ + #define ETH_DMAPTPTXDESC_TTSH 0xFFFFFFFFU /* Transmit Time Stamp High */ /** * @} @@ -825,44 +825,44 @@ typedef struct /** * @brief Bit definition of RDES0 register: DMA Rx descriptor status register */ -#define ETH_DMARXDESC_OWN ((uint32_t)0x80000000U) /*!< OWN bit: descriptor is owned by DMA engine */ -#define ETH_DMARXDESC_AFM ((uint32_t)0x40000000U) /*!< DA Filter Fail for the rx frame */ -#define ETH_DMARXDESC_FL ((uint32_t)0x3FFF0000U) /*!< Receive descriptor frame length */ -#define ETH_DMARXDESC_ES ((uint32_t)0x00008000U) /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ -#define ETH_DMARXDESC_DE ((uint32_t)0x00004000U) /*!< Descriptor error: no more descriptors for receive frame */ -#define ETH_DMARXDESC_SAF ((uint32_t)0x00002000U) /*!< SA Filter Fail for the received frame */ -#define ETH_DMARXDESC_LE ((uint32_t)0x00001000U) /*!< Frame size not matching with length field */ -#define ETH_DMARXDESC_OE ((uint32_t)0x00000800U) /*!< Overflow Error: Frame was damaged due to buffer overflow */ -#define ETH_DMARXDESC_VLAN ((uint32_t)0x00000400U) /*!< VLAN Tag: received frame is a VLAN frame */ -#define ETH_DMARXDESC_FS ((uint32_t)0x00000200U) /*!< First descriptor of the frame */ -#define ETH_DMARXDESC_LS ((uint32_t)0x00000100U) /*!< Last descriptor of the frame */ -#define ETH_DMARXDESC_IPV4HCE ((uint32_t)0x00000080U) /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ -#define ETH_DMARXDESC_LC ((uint32_t)0x00000040U) /*!< Late collision occurred during reception */ -#define ETH_DMARXDESC_FT ((uint32_t)0x00000020U) /*!< Frame type - Ethernet, otherwise 802.3 */ -#define ETH_DMARXDESC_RWT ((uint32_t)0x00000010U) /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ -#define ETH_DMARXDESC_RE ((uint32_t)0x00000008U) /*!< Receive error: error reported by MII interface */ -#define ETH_DMARXDESC_DBE ((uint32_t)0x00000004U) /*!< Dribble bit error: frame contains non int multiple of 8 bits */ -#define ETH_DMARXDESC_CE ((uint32_t)0x00000002U) /*!< CRC error */ -#define ETH_DMARXDESC_MAMPCE ((uint32_t)0x00000001U) /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ +#define ETH_DMARXDESC_OWN 0x80000000U /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARXDESC_AFM 0x40000000U /*!< DA Filter Fail for the rx frame */ +#define ETH_DMARXDESC_FL 0x3FFF0000U /*!< Receive descriptor frame length */ +#define ETH_DMARXDESC_ES 0x00008000U /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARXDESC_DE 0x00004000U /*!< Descriptor error: no more descriptors for receive frame */ +#define ETH_DMARXDESC_SAF 0x00002000U /*!< SA Filter Fail for the received frame */ +#define ETH_DMARXDESC_LE 0x00001000U /*!< Frame size not matching with length field */ +#define ETH_DMARXDESC_OE 0x00000800U /*!< Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARXDESC_VLAN 0x00000400U /*!< VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARXDESC_FS 0x00000200U /*!< First descriptor of the frame */ +#define ETH_DMARXDESC_LS 0x00000100U /*!< Last descriptor of the frame */ +#define ETH_DMARXDESC_IPV4HCE 0x00000080U /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARXDESC_LC 0x00000040U /*!< Late collision occurred during reception */ +#define ETH_DMARXDESC_FT 0x00000020U /*!< Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARXDESC_RWT 0x00000010U /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARXDESC_RE 0x00000008U /*!< Receive error: error reported by MII interface */ +#define ETH_DMARXDESC_DBE 0x00000004U /*!< Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARXDESC_CE 0x00000002U /*!< CRC error */ +#define ETH_DMARXDESC_MAMPCE 0x00000001U /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ /** * @brief Bit definition of RDES1 register */ -#define ETH_DMARXDESC_DIC ((uint32_t)0x80000000U) /*!< Disable Interrupt on Completion */ -#define ETH_DMARXDESC_RBS2 ((uint32_t)0x1FFF0000U) /*!< Receive Buffer2 Size */ -#define ETH_DMARXDESC_RER ((uint32_t)0x00008000U) /*!< Receive End of Ring */ -#define ETH_DMARXDESC_RCH ((uint32_t)0x00004000U) /*!< Second Address Chained */ -#define ETH_DMARXDESC_RBS1 ((uint32_t)0x00001FFFU) /*!< Receive Buffer1 Size */ +#define ETH_DMARXDESC_DIC 0x80000000U /*!< Disable Interrupt on Completion */ +#define ETH_DMARXDESC_RBS2 0x1FFF0000U /*!< Receive Buffer2 Size */ +#define ETH_DMARXDESC_RER 0x00008000U /*!< Receive End of Ring */ +#define ETH_DMARXDESC_RCH 0x00004000U /*!< Second Address Chained */ +#define ETH_DMARXDESC_RBS1 0x00001FFFU /*!< Receive Buffer1 Size */ /** * @brief Bit definition of RDES2 register */ -#define ETH_DMARXDESC_B1AP ((uint32_t)0xFFFFFFFFU) /*!< Buffer1 Address Pointer */ +#define ETH_DMARXDESC_B1AP 0xFFFFFFFFU /*!< Buffer1 Address Pointer */ /** * @brief Bit definition of RDES3 register */ -#define ETH_DMARXDESC_B2AP ((uint32_t)0xFFFFFFFFU) /*!< Buffer2 Address Pointer */ +#define ETH_DMARXDESC_B2AP 0xFFFFFFFFU /*!< Buffer2 Address Pointer */ /*--------------------------------------------------------------------------------------------------------------------- RDES4 | Reserved[31:15] | Extended Status [14:0] | @@ -875,39 +875,39 @@ typedef struct --------------------------------------------------------------------------------------------------------------------*/ /* Bit definition of RDES4 register */ -#define ETH_DMAPTPRXDESC_PTPV ((uint32_t)0x00002000U) /* PTP Version */ -#define ETH_DMAPTPRXDESC_PTPFT ((uint32_t)0x00001000U) /* PTP Frame Type */ -#define ETH_DMAPTPRXDESC_PTPMT ((uint32_t)0x00000F00U) /* PTP Message Type */ - #define ETH_DMAPTPRXDESC_PTPMT_SYNC ((uint32_t)0x00000100U) /* SYNC message (all clock types) */ - #define ETH_DMAPTPRXDESC_PTPMT_FOLLOWUP ((uint32_t)0x00000200U) /* FollowUp message (all clock types) */ - #define ETH_DMAPTPRXDESC_PTPMT_DELAYREQ ((uint32_t)0x00000300U) /* DelayReq message (all clock types) */ - #define ETH_DMAPTPRXDESC_PTPMT_DELAYRESP ((uint32_t)0x00000400U) /* DelayResp message (all clock types) */ - #define ETH_DMAPTPRXDESC_PTPMT_PDELAYREQ_ANNOUNCE ((uint32_t)0x00000500U) /* PdelayReq message (peer-to-peer transparent clock) or Announce message (Ordinary or Boundary clock) */ - #define ETH_DMAPTPRXDESC_PTPMT_PDELAYRESP_MANAG ((uint32_t)0x00000600U) /* PdelayResp message (peer-to-peer transparent clock) or Management message (Ordinary or Boundary clock) */ - #define ETH_DMAPTPRXDESC_PTPMT_PDELAYRESPFOLLOWUP_SIGNAL ((uint32_t)0x00000700U) /* PdelayRespFollowUp message (peer-to-peer transparent clock) or Signaling message (Ordinary or Boundary clock) */ -#define ETH_DMAPTPRXDESC_IPV6PR ((uint32_t)0x00000080U) /* IPv6 Packet Received */ -#define ETH_DMAPTPRXDESC_IPV4PR ((uint32_t)0x00000040U) /* IPv4 Packet Received */ -#define ETH_DMAPTPRXDESC_IPCB ((uint32_t)0x00000020U) /* IP Checksum Bypassed */ -#define ETH_DMAPTPRXDESC_IPPE ((uint32_t)0x00000010U) /* IP Payload Error */ -#define ETH_DMAPTPRXDESC_IPHE ((uint32_t)0x00000008U) /* IP Header Error */ -#define ETH_DMAPTPRXDESC_IPPT ((uint32_t)0x00000007U) /* IP Payload Type */ - #define ETH_DMAPTPRXDESC_IPPT_UDP ((uint32_t)0x00000001U) /* UDP payload encapsulated in the IP datagram */ - #define ETH_DMAPTPRXDESC_IPPT_TCP ((uint32_t)0x00000002U) /* TCP payload encapsulated in the IP datagram */ - #define ETH_DMAPTPRXDESC_IPPT_ICMP ((uint32_t)0x00000003U) /* ICMP payload encapsulated in the IP datagram */ +#define ETH_DMAPTPRXDESC_PTPV 0x00002000U /* PTP Version */ +#define ETH_DMAPTPRXDESC_PTPFT 0x00001000U /* PTP Frame Type */ +#define ETH_DMAPTPRXDESC_PTPMT 0x00000F00U /* PTP Message Type */ + #define ETH_DMAPTPRXDESC_PTPMT_SYNC 0x00000100U /* SYNC message (all clock types) */ + #define ETH_DMAPTPRXDESC_PTPMT_FOLLOWUP 0x00000200U /* FollowUp message (all clock types) */ + #define ETH_DMAPTPRXDESC_PTPMT_DELAYREQ 0x00000300U /* DelayReq message (all clock types) */ + #define ETH_DMAPTPRXDESC_PTPMT_DELAYRESP 0x00000400U /* DelayResp message (all clock types) */ + #define ETH_DMAPTPRXDESC_PTPMT_PDELAYREQ_ANNOUNCE 0x00000500U /* PdelayReq message (peer-to-peer transparent clock) or Announce message (Ordinary or Boundary clock) */ + #define ETH_DMAPTPRXDESC_PTPMT_PDELAYRESP_MANAG 0x00000600U /* PdelayResp message (peer-to-peer transparent clock) or Management message (Ordinary or Boundary clock) */ + #define ETH_DMAPTPRXDESC_PTPMT_PDELAYRESPFOLLOWUP_SIGNAL 0x00000700U /* PdelayRespFollowUp message (peer-to-peer transparent clock) or Signaling message (Ordinary or Boundary clock) */ +#define ETH_DMAPTPRXDESC_IPV6PR 0x00000080U /* IPv6 Packet Received */ +#define ETH_DMAPTPRXDESC_IPV4PR 0x00000040U /* IPv4 Packet Received */ +#define ETH_DMAPTPRXDESC_IPCB 0x00000020U /* IP Checksum Bypassed */ +#define ETH_DMAPTPRXDESC_IPPE 0x00000010U /* IP Payload Error */ +#define ETH_DMAPTPRXDESC_IPHE 0x00000008U /* IP Header Error */ +#define ETH_DMAPTPRXDESC_IPPT 0x00000007U /* IP Payload Type */ + #define ETH_DMAPTPRXDESC_IPPT_UDP 0x00000001U /* UDP payload encapsulated in the IP datagram */ + #define ETH_DMAPTPRXDESC_IPPT_TCP 0x00000002U /* TCP payload encapsulated in the IP datagram */ + #define ETH_DMAPTPRXDESC_IPPT_ICMP 0x00000003U /* ICMP payload encapsulated in the IP datagram */ /* Bit definition of RDES6 register */ -#define ETH_DMAPTPRXDESC_RTSL ((uint32_t)0xFFFFFFFFU) /* Receive Time Stamp Low */ +#define ETH_DMAPTPRXDESC_RTSL 0xFFFFFFFFU /* Receive Time Stamp Low */ /* Bit definition of RDES7 register */ -#define ETH_DMAPTPRXDESC_RTSH ((uint32_t)0xFFFFFFFFU) /* Receive Time Stamp High */ +#define ETH_DMAPTPRXDESC_RTSH 0xFFFFFFFFU /* Receive Time Stamp High */ /** * @} */ /** @defgroup ETH_AutoNegotiation ETH AutoNegotiation * @{ */ -#define ETH_AUTONEGOTIATION_ENABLE ((uint32_t)0x00000001U) -#define ETH_AUTONEGOTIATION_DISABLE ((uint32_t)0x00000000U) +#define ETH_AUTONEGOTIATION_ENABLE 0x00000001U +#define ETH_AUTONEGOTIATION_DISABLE 0x00000000U /** * @} @@ -915,8 +915,8 @@ typedef struct /** @defgroup ETH_Speed ETH Speed * @{ */ -#define ETH_SPEED_10M ((uint32_t)0x00000000U) -#define ETH_SPEED_100M ((uint32_t)0x00004000U) +#define ETH_SPEED_10M 0x00000000U +#define ETH_SPEED_100M 0x00004000U /** * @} @@ -924,16 +924,16 @@ typedef struct /** @defgroup ETH_Duplex_Mode ETH Duplex Mode * @{ */ -#define ETH_MODE_FULLDUPLEX ((uint32_t)0x00000800U) -#define ETH_MODE_HALFDUPLEX ((uint32_t)0x00000000U) +#define ETH_MODE_FULLDUPLEX 0x00000800U +#define ETH_MODE_HALFDUPLEX 0x00000000U /** * @} */ /** @defgroup ETH_Rx_Mode ETH Rx Mode * @{ */ -#define ETH_RXPOLLING_MODE ((uint32_t)0x00000000U) -#define ETH_RXINTERRUPT_MODE ((uint32_t)0x00000001U) +#define ETH_RXPOLLING_MODE 0x00000000U +#define ETH_RXINTERRUPT_MODE 0x00000001U /** * @} */ @@ -941,8 +941,8 @@ typedef struct /** @defgroup ETH_Checksum_Mode ETH Checksum Mode * @{ */ -#define ETH_CHECKSUM_BY_HARDWARE ((uint32_t)0x00000000U) -#define ETH_CHECKSUM_BY_SOFTWARE ((uint32_t)0x00000001U) +#define ETH_CHECKSUM_BY_HARDWARE 0x00000000U +#define ETH_CHECKSUM_BY_SOFTWARE 0x00000001U /** * @} */ @@ -950,7 +950,7 @@ typedef struct /** @defgroup ETH_Media_Interface ETH Media Interface * @{ */ -#define ETH_MEDIA_INTERFACE_MII ((uint32_t)0x00000000U) +#define ETH_MEDIA_INTERFACE_MII 0x00000000U #define ETH_MEDIA_INTERFACE_RMII ((uint32_t)SYSCFG_PMC_MII_RMII_SEL) /** * @} @@ -959,8 +959,8 @@ typedef struct /** @defgroup ETH_Watchdog ETH Watchdog * @{ */ -#define ETH_WATCHDOG_ENABLE ((uint32_t)0x00000000U) -#define ETH_WATCHDOG_DISABLE ((uint32_t)0x00800000U) +#define ETH_WATCHDOG_ENABLE 0x00000000U +#define ETH_WATCHDOG_DISABLE 0x00800000U /** * @} */ @@ -968,8 +968,8 @@ typedef struct /** @defgroup ETH_Jabber ETH Jabber * @{ */ -#define ETH_JABBER_ENABLE ((uint32_t)0x00000000U) -#define ETH_JABBER_DISABLE ((uint32_t)0x00400000U) +#define ETH_JABBER_ENABLE 0x00000000U +#define ETH_JABBER_DISABLE 0x00400000U /** * @} */ @@ -977,14 +977,14 @@ typedef struct /** @defgroup ETH_Inter_Frame_Gap ETH Inter Frame Gap * @{ */ -#define ETH_INTERFRAMEGAP_96BIT ((uint32_t)0x00000000U) /*!< minimum IFG between frames during transmission is 96Bit */ -#define ETH_INTERFRAMEGAP_88BIT ((uint32_t)0x00020000U) /*!< minimum IFG between frames during transmission is 88Bit */ -#define ETH_INTERFRAMEGAP_80BIT ((uint32_t)0x00040000U) /*!< minimum IFG between frames during transmission is 80Bit */ -#define ETH_INTERFRAMEGAP_72BIT ((uint32_t)0x00060000U) /*!< minimum IFG between frames during transmission is 72Bit */ -#define ETH_INTERFRAMEGAP_64BIT ((uint32_t)0x00080000U) /*!< minimum IFG between frames during transmission is 64Bit */ -#define ETH_INTERFRAMEGAP_56BIT ((uint32_t)0x000A0000U) /*!< minimum IFG between frames during transmission is 56Bit */ -#define ETH_INTERFRAMEGAP_48BIT ((uint32_t)0x000C0000U) /*!< minimum IFG between frames during transmission is 48Bit */ -#define ETH_INTERFRAMEGAP_40BIT ((uint32_t)0x000E0000U) /*!< minimum IFG between frames during transmission is 40Bit */ +#define ETH_INTERFRAMEGAP_96BIT 0x00000000U /*!< minimum IFG between frames during transmission is 96Bit */ +#define ETH_INTERFRAMEGAP_88BIT 0x00020000U /*!< minimum IFG between frames during transmission is 88Bit */ +#define ETH_INTERFRAMEGAP_80BIT 0x00040000U /*!< minimum IFG between frames during transmission is 80Bit */ +#define ETH_INTERFRAMEGAP_72BIT 0x00060000U /*!< minimum IFG between frames during transmission is 72Bit */ +#define ETH_INTERFRAMEGAP_64BIT 0x00080000U /*!< minimum IFG between frames during transmission is 64Bit */ +#define ETH_INTERFRAMEGAP_56BIT 0x000A0000U /*!< minimum IFG between frames during transmission is 56Bit */ +#define ETH_INTERFRAMEGAP_48BIT 0x000C0000U /*!< minimum IFG between frames during transmission is 48Bit */ +#define ETH_INTERFRAMEGAP_40BIT 0x000E0000U /*!< minimum IFG between frames during transmission is 40Bit */ /** * @} */ @@ -992,8 +992,8 @@ typedef struct /** @defgroup ETH_Carrier_Sense ETH Carrier Sense * @{ */ -#define ETH_CARRIERSENCE_ENABLE ((uint32_t)0x00000000U) -#define ETH_CARRIERSENCE_DISABLE ((uint32_t)0x00010000U) +#define ETH_CARRIERSENCE_ENABLE 0x00000000U +#define ETH_CARRIERSENCE_DISABLE 0x00010000U /** * @} */ @@ -1001,8 +1001,8 @@ typedef struct /** @defgroup ETH_Receive_Own ETH Receive Own * @{ */ -#define ETH_RECEIVEOWN_ENABLE ((uint32_t)0x00000000U) -#define ETH_RECEIVEOWN_DISABLE ((uint32_t)0x00002000U) +#define ETH_RECEIVEOWN_ENABLE 0x00000000U +#define ETH_RECEIVEOWN_DISABLE 0x00002000U /** * @} */ @@ -1010,8 +1010,8 @@ typedef struct /** @defgroup ETH_Loop_Back_Mode ETH Loop Back Mode * @{ */ -#define ETH_LOOPBACKMODE_ENABLE ((uint32_t)0x00001000U) -#define ETH_LOOPBACKMODE_DISABLE ((uint32_t)0x00000000U) +#define ETH_LOOPBACKMODE_ENABLE 0x00001000U +#define ETH_LOOPBACKMODE_DISABLE 0x00000000U /** * @} */ @@ -1019,8 +1019,8 @@ typedef struct /** @defgroup ETH_Checksum_Offload ETH Checksum Offload * @{ */ -#define ETH_CHECKSUMOFFLAOD_ENABLE ((uint32_t)0x00000400U) -#define ETH_CHECKSUMOFFLAOD_DISABLE ((uint32_t)0x00000000U) +#define ETH_CHECKSUMOFFLAOD_ENABLE 0x00000400U +#define ETH_CHECKSUMOFFLAOD_DISABLE 0x00000000U /** * @} */ @@ -1028,8 +1028,8 @@ typedef struct /** @defgroup ETH_Retry_Transmission ETH Retry Transmission * @{ */ -#define ETH_RETRYTRANSMISSION_ENABLE ((uint32_t)0x00000000U) -#define ETH_RETRYTRANSMISSION_DISABLE ((uint32_t)0x00000200U) +#define ETH_RETRYTRANSMISSION_ENABLE 0x00000000U +#define ETH_RETRYTRANSMISSION_DISABLE 0x00000200U /** * @} */ @@ -1037,8 +1037,8 @@ typedef struct /** @defgroup ETH_Automatic_Pad_CRC_Strip ETH Automatic Pad CRC Strip * @{ */ -#define ETH_AUTOMATICPADCRCSTRIP_ENABLE ((uint32_t)0x00000080U) -#define ETH_AUTOMATICPADCRCSTRIP_DISABLE ((uint32_t)0x00000000U) +#define ETH_AUTOMATICPADCRCSTRIP_ENABLE 0x00000080U +#define ETH_AUTOMATICPADCRCSTRIP_DISABLE 0x00000000U /** * @} */ @@ -1046,10 +1046,10 @@ typedef struct /** @defgroup ETH_Back_Off_Limit ETH Back Off Limit * @{ */ -#define ETH_BACKOFFLIMIT_10 ((uint32_t)0x00000000U) -#define ETH_BACKOFFLIMIT_8 ((uint32_t)0x00000020U) -#define ETH_BACKOFFLIMIT_4 ((uint32_t)0x00000040U) -#define ETH_BACKOFFLIMIT_1 ((uint32_t)0x00000060U) +#define ETH_BACKOFFLIMIT_10 0x00000000U +#define ETH_BACKOFFLIMIT_8 0x00000020U +#define ETH_BACKOFFLIMIT_4 0x00000040U +#define ETH_BACKOFFLIMIT_1 0x00000060U /** * @} */ @@ -1057,8 +1057,8 @@ typedef struct /** @defgroup ETH_Deferral_Check ETH Deferral Check * @{ */ -#define ETH_DEFFERRALCHECK_ENABLE ((uint32_t)0x00000010U) -#define ETH_DEFFERRALCHECK_DISABLE ((uint32_t)0x00000000U) +#define ETH_DEFFERRALCHECK_ENABLE 0x00000010U +#define ETH_DEFFERRALCHECK_DISABLE 0x00000000U /** * @} */ @@ -1066,8 +1066,8 @@ typedef struct /** @defgroup ETH_Receive_All ETH Receive All * @{ */ -#define ETH_RECEIVEALL_ENABLE ((uint32_t)0x80000000U) -#define ETH_RECEIVEAll_DISABLE ((uint32_t)0x00000000U) +#define ETH_RECEIVEALL_ENABLE 0x80000000U +#define ETH_RECEIVEAll_DISABLE 0x00000000U /** * @} */ @@ -1075,9 +1075,9 @@ typedef struct /** @defgroup ETH_Source_Addr_Filter ETH Source Addr Filter * @{ */ -#define ETH_SOURCEADDRFILTER_NORMAL_ENABLE ((uint32_t)0x00000200U) -#define ETH_SOURCEADDRFILTER_INVERSE_ENABLE ((uint32_t)0x00000300U) -#define ETH_SOURCEADDRFILTER_DISABLE ((uint32_t)0x00000000U) +#define ETH_SOURCEADDRFILTER_NORMAL_ENABLE 0x00000200U +#define ETH_SOURCEADDRFILTER_INVERSE_ENABLE 0x00000300U +#define ETH_SOURCEADDRFILTER_DISABLE 0x00000000U /** * @} */ @@ -1085,9 +1085,9 @@ typedef struct /** @defgroup ETH_Pass_Control_Frames ETH Pass Control Frames * @{ */ -#define ETH_PASSCONTROLFRAMES_BLOCKALL ((uint32_t)0x00000040U) /*!< MAC filters all control frames from reaching the application */ -#define ETH_PASSCONTROLFRAMES_FORWARDALL ((uint32_t)0x00000080U) /*!< MAC forwards all control frames to application even if they fail the Address Filter */ -#define ETH_PASSCONTROLFRAMES_FORWARDPASSEDADDRFILTER ((uint32_t)0x000000C0U) /*!< MAC forwards control frames that pass the Address Filter. */ +#define ETH_PASSCONTROLFRAMES_BLOCKALL 0x00000040U /*!< MAC filters all control frames from reaching the application */ +#define ETH_PASSCONTROLFRAMES_FORWARDALL 0x00000080U /*!< MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PASSCONTROLFRAMES_FORWARDPASSEDADDRFILTER 0x000000C0U /*!< MAC forwards control frames that pass the Address Filter. */ /** * @} */ @@ -1095,8 +1095,8 @@ typedef struct /** @defgroup ETH_Broadcast_Frames_Reception ETH Broadcast Frames Reception * @{ */ -#define ETH_BROADCASTFRAMESRECEPTION_ENABLE ((uint32_t)0x00000000U) -#define ETH_BROADCASTFRAMESRECEPTION_DISABLE ((uint32_t)0x00000020U) +#define ETH_BROADCASTFRAMESRECEPTION_ENABLE 0x00000000U +#define ETH_BROADCASTFRAMESRECEPTION_DISABLE 0x00000020U /** * @} */ @@ -1104,8 +1104,8 @@ typedef struct /** @defgroup ETH_Destination_Addr_Filter ETH Destination Addr Filter * @{ */ -#define ETH_DESTINATIONADDRFILTER_NORMAL ((uint32_t)0x00000000U) -#define ETH_DESTINATIONADDRFILTER_INVERSE ((uint32_t)0x00000008U) +#define ETH_DESTINATIONADDRFILTER_NORMAL 0x00000000U +#define ETH_DESTINATIONADDRFILTER_INVERSE 0x00000008U /** * @} */ @@ -1113,8 +1113,8 @@ typedef struct /** @defgroup ETH_Promiscuous_Mode ETH Promiscuous Mode * @{ */ -#define ETH_PROMISCUOUS_MODE_ENABLE ((uint32_t)0x00000001U) -#define ETH_PROMISCUOUS_MODE_DISABLE ((uint32_t)0x00000000U) +#define ETH_PROMISCUOUS_MODE_ENABLE 0x00000001U +#define ETH_PROMISCUOUS_MODE_DISABLE 0x00000000U /** * @} */ @@ -1122,10 +1122,10 @@ typedef struct /** @defgroup ETH_Multicast_Frames_Filter ETH Multicast Frames Filter * @{ */ -#define ETH_MULTICASTFRAMESFILTER_PERFECTHASHTABLE ((uint32_t)0x00000404U) -#define ETH_MULTICASTFRAMESFILTER_HASHTABLE ((uint32_t)0x00000004U) -#define ETH_MULTICASTFRAMESFILTER_PERFECT ((uint32_t)0x00000000U) -#define ETH_MULTICASTFRAMESFILTER_NONE ((uint32_t)0x00000010U) +#define ETH_MULTICASTFRAMESFILTER_PERFECTHASHTABLE 0x00000404U +#define ETH_MULTICASTFRAMESFILTER_HASHTABLE 0x00000004U +#define ETH_MULTICASTFRAMESFILTER_PERFECT 0x00000000U +#define ETH_MULTICASTFRAMESFILTER_NONE 0x00000010U /** * @} */ @@ -1133,9 +1133,9 @@ typedef struct /** @defgroup ETH_Unicast_Frames_Filter ETH Unicast Frames Filter * @{ */ -#define ETH_UNICASTFRAMESFILTER_PERFECTHASHTABLE ((uint32_t)0x00000402U) -#define ETH_UNICASTFRAMESFILTER_HASHTABLE ((uint32_t)0x00000002U) -#define ETH_UNICASTFRAMESFILTER_PERFECT ((uint32_t)0x00000000U) +#define ETH_UNICASTFRAMESFILTER_PERFECTHASHTABLE 0x00000402U +#define ETH_UNICASTFRAMESFILTER_HASHTABLE 0x00000002U +#define ETH_UNICASTFRAMESFILTER_PERFECT 0x00000000U /** * @} */ @@ -1143,8 +1143,8 @@ typedef struct /** @defgroup ETH_Zero_Quanta_Pause ETH Zero Quanta Pause * @{ */ -#define ETH_ZEROQUANTAPAUSE_ENABLE ((uint32_t)0x00000000U) -#define ETH_ZEROQUANTAPAUSE_DISABLE ((uint32_t)0x00000080U) +#define ETH_ZEROQUANTAPAUSE_ENABLE 0x00000000U +#define ETH_ZEROQUANTAPAUSE_DISABLE 0x00000080U /** * @} */ @@ -1152,10 +1152,10 @@ typedef struct /** @defgroup ETH_Pause_Low_Threshold ETH Pause Low Threshold * @{ */ -#define ETH_PAUSELOWTHRESHOLD_MINUS4 ((uint32_t)0x00000000U) /*!< Pause time minus 4 slot times */ -#define ETH_PAUSELOWTHRESHOLD_MINUS28 ((uint32_t)0x00000010U) /*!< Pause time minus 28 slot times */ -#define ETH_PAUSELOWTHRESHOLD_MINUS144 ((uint32_t)0x00000020U) /*!< Pause time minus 144 slot times */ -#define ETH_PAUSELOWTHRESHOLD_MINUS256 ((uint32_t)0x00000030U) /*!< Pause time minus 256 slot times */ +#define ETH_PAUSELOWTHRESHOLD_MINUS4 0x00000000U /*!< Pause time minus 4 slot times */ +#define ETH_PAUSELOWTHRESHOLD_MINUS28 0x00000010U /*!< Pause time minus 28 slot times */ +#define ETH_PAUSELOWTHRESHOLD_MINUS144 0x00000020U /*!< Pause time minus 144 slot times */ +#define ETH_PAUSELOWTHRESHOLD_MINUS256 0x00000030U /*!< Pause time minus 256 slot times */ /** * @} */ @@ -1163,8 +1163,8 @@ typedef struct /** @defgroup ETH_Unicast_Pause_Frame_Detect ETH Unicast Pause Frame Detect * @{ */ -#define ETH_UNICASTPAUSEFRAMEDETECT_ENABLE ((uint32_t)0x00000008U) -#define ETH_UNICASTPAUSEFRAMEDETECT_DISABLE ((uint32_t)0x00000000U) +#define ETH_UNICASTPAUSEFRAMEDETECT_ENABLE 0x00000008U +#define ETH_UNICASTPAUSEFRAMEDETECT_DISABLE 0x00000000U /** * @} */ @@ -1172,8 +1172,8 @@ typedef struct /** @defgroup ETH_Receive_Flow_Control ETH Receive Flow Control * @{ */ -#define ETH_RECEIVEFLOWCONTROL_ENABLE ((uint32_t)0x00000004U) -#define ETH_RECEIVEFLOWCONTROL_DISABLE ((uint32_t)0x00000000U) +#define ETH_RECEIVEFLOWCONTROL_ENABLE 0x00000004U +#define ETH_RECEIVEFLOWCONTROL_DISABLE 0x00000000U /** * @} */ @@ -1181,8 +1181,8 @@ typedef struct /** @defgroup ETH_Transmit_Flow_Control ETH Transmit Flow Control * @{ */ -#define ETH_TRANSMITFLOWCONTROL_ENABLE ((uint32_t)0x00000002U) -#define ETH_TRANSMITFLOWCONTROL_DISABLE ((uint32_t)0x00000000U) +#define ETH_TRANSMITFLOWCONTROL_ENABLE 0x00000002U +#define ETH_TRANSMITFLOWCONTROL_DISABLE 0x00000000U /** * @} */ @@ -1190,8 +1190,8 @@ typedef struct /** @defgroup ETH_VLAN_Tag_Comparison ETH VLAN Tag Comparison * @{ */ -#define ETH_VLANTAGCOMPARISON_12BIT ((uint32_t)0x00010000U) -#define ETH_VLANTAGCOMPARISON_16BIT ((uint32_t)0x00000000U) +#define ETH_VLANTAGCOMPARISON_12BIT 0x00010000U +#define ETH_VLANTAGCOMPARISON_16BIT 0x00000000U /** * @} */ @@ -1199,10 +1199,10 @@ typedef struct /** @defgroup ETH_MAC_addresses ETH MAC addresses * @{ */ -#define ETH_MAC_ADDRESS0 ((uint32_t)0x00000000U) -#define ETH_MAC_ADDRESS1 ((uint32_t)0x00000008U) -#define ETH_MAC_ADDRESS2 ((uint32_t)0x00000010U) -#define ETH_MAC_ADDRESS3 ((uint32_t)0x00000018U) +#define ETH_MAC_ADDRESS0 0x00000000U +#define ETH_MAC_ADDRESS1 0x00000008U +#define ETH_MAC_ADDRESS2 0x00000010U +#define ETH_MAC_ADDRESS3 0x00000018U /** * @} */ @@ -1210,8 +1210,8 @@ typedef struct /** @defgroup ETH_MAC_addresses_filter_SA_DA ETH MAC addresses filter SA DA * @{ */ -#define ETH_MAC_ADDRESSFILTER_SA ((uint32_t)0x00000000U) -#define ETH_MAC_ADDRESSFILTER_DA ((uint32_t)0x00000008U) +#define ETH_MAC_ADDRESSFILTER_SA 0x00000000U +#define ETH_MAC_ADDRESSFILTER_DA 0x00000008U /** * @} */ @@ -1219,12 +1219,12 @@ typedef struct /** @defgroup ETH_MAC_addresses_filter_Mask_bytes ETH MAC addresses filter Mask bytes * @{ */ -#define ETH_MAC_ADDRESSMASK_BYTE6 ((uint32_t)0x20000000U) /*!< Mask MAC Address high reg bits [15:8] */ -#define ETH_MAC_ADDRESSMASK_BYTE5 ((uint32_t)0x10000000U) /*!< Mask MAC Address high reg bits [7:0] */ -#define ETH_MAC_ADDRESSMASK_BYTE4 ((uint32_t)0x08000000U) /*!< Mask MAC Address low reg bits [31:24] */ -#define ETH_MAC_ADDRESSMASK_BYTE3 ((uint32_t)0x04000000U) /*!< Mask MAC Address low reg bits [23:16] */ -#define ETH_MAC_ADDRESSMASK_BYTE2 ((uint32_t)0x02000000U) /*!< Mask MAC Address low reg bits [15:8] */ -#define ETH_MAC_ADDRESSMASK_BYTE1 ((uint32_t)0x01000000U) /*!< Mask MAC Address low reg bits [70] */ +#define ETH_MAC_ADDRESSMASK_BYTE6 0x20000000U /*!< Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_ADDRESSMASK_BYTE5 0x10000000U /*!< Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_ADDRESSMASK_BYTE4 0x08000000U /*!< Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_ADDRESSMASK_BYTE3 0x04000000U /*!< Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_ADDRESSMASK_BYTE2 0x02000000U /*!< Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_ADDRESSMASK_BYTE1 0x01000000U /*!< Mask MAC Address low reg bits [70] */ /** * @} */ @@ -1232,8 +1232,8 @@ typedef struct /** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame ETH Drop TCP IP Checksum Error Frame * @{ */ -#define ETH_DROPTCPIPCHECKSUMERRORFRAME_ENABLE ((uint32_t)0x00000000U) -#define ETH_DROPTCPIPCHECKSUMERRORFRAME_DISABLE ((uint32_t)0x04000000U) +#define ETH_DROPTCPIPCHECKSUMERRORFRAME_ENABLE 0x00000000U +#define ETH_DROPTCPIPCHECKSUMERRORFRAME_DISABLE 0x04000000U /** * @} */ @@ -1241,8 +1241,8 @@ typedef struct /** @defgroup ETH_Receive_Store_Forward ETH Receive Store Forward * @{ */ -#define ETH_RECEIVESTOREFORWARD_ENABLE ((uint32_t)0x02000000U) -#define ETH_RECEIVESTOREFORWARD_DISABLE ((uint32_t)0x00000000U) +#define ETH_RECEIVESTOREFORWARD_ENABLE 0x02000000U +#define ETH_RECEIVESTOREFORWARD_DISABLE 0x00000000U /** * @} */ @@ -1250,8 +1250,8 @@ typedef struct /** @defgroup ETH_Flush_Received_Frame ETH Flush Received Frame * @{ */ -#define ETH_FLUSHRECEIVEDFRAME_ENABLE ((uint32_t)0x00000000U) -#define ETH_FLUSHRECEIVEDFRAME_DISABLE ((uint32_t)0x01000000U) +#define ETH_FLUSHRECEIVEDFRAME_ENABLE 0x00000000U +#define ETH_FLUSHRECEIVEDFRAME_DISABLE 0x01000000U /** * @} */ @@ -1259,8 +1259,8 @@ typedef struct /** @defgroup ETH_Transmit_Store_Forward ETH Transmit Store Forward * @{ */ -#define ETH_TRANSMITSTOREFORWARD_ENABLE ((uint32_t)0x00200000U) -#define ETH_TRANSMITSTOREFORWARD_DISABLE ((uint32_t)0x00000000U) +#define ETH_TRANSMITSTOREFORWARD_ENABLE 0x00200000U +#define ETH_TRANSMITSTOREFORWARD_DISABLE 0x00000000U /** * @} */ @@ -1268,14 +1268,14 @@ typedef struct /** @defgroup ETH_Transmit_Threshold_Control ETH Transmit Threshold Control * @{ */ -#define ETH_TRANSMITTHRESHOLDCONTROL_64BYTES ((uint32_t)0x00000000U) /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_128BYTES ((uint32_t)0x00004000U) /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_192BYTES ((uint32_t)0x00008000U) /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_256BYTES ((uint32_t)0x0000C000U) /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_40BYTES ((uint32_t)0x00010000U) /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_32BYTES ((uint32_t)0x00014000U) /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_24BYTES ((uint32_t)0x00018000U) /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ -#define ETH_TRANSMITTHRESHOLDCONTROL_16BYTES ((uint32_t)0x0001C000U) /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_64BYTES 0x00000000U /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_128BYTES 0x00004000U /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_192BYTES 0x00008000U /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_256BYTES 0x0000C000U /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_40BYTES 0x00010000U /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_32BYTES 0x00014000U /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_24BYTES 0x00018000U /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TRANSMITTHRESHOLDCONTROL_16BYTES 0x0001C000U /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ /** * @} */ @@ -1283,8 +1283,8 @@ typedef struct /** @defgroup ETH_Forward_Error_Frames ETH Forward Error Frames * @{ */ -#define ETH_FORWARDERRORFRAMES_ENABLE ((uint32_t)0x00000080U) -#define ETH_FORWARDERRORFRAMES_DISABLE ((uint32_t)0x00000000U) +#define ETH_FORWARDERRORFRAMES_ENABLE 0x00000080U +#define ETH_FORWARDERRORFRAMES_DISABLE 0x00000000U /** * @} */ @@ -1292,8 +1292,8 @@ typedef struct /** @defgroup ETH_Forward_Undersized_Good_Frames ETH Forward Undersized Good Frames * @{ */ -#define ETH_FORWARDUNDERSIZEDGOODFRAMES_ENABLE ((uint32_t)0x00000040U) -#define ETH_FORWARDUNDERSIZEDGOODFRAMES_DISABLE ((uint32_t)0x00000000U) +#define ETH_FORWARDUNDERSIZEDGOODFRAMES_ENABLE 0x00000040U +#define ETH_FORWARDUNDERSIZEDGOODFRAMES_DISABLE 0x00000000U /** * @} */ @@ -1301,10 +1301,10 @@ typedef struct /** @defgroup ETH_Receive_Threshold_Control ETH Receive Threshold Control * @{ */ -#define ETH_RECEIVEDTHRESHOLDCONTROL_64BYTES ((uint32_t)0x00000000U) /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ -#define ETH_RECEIVEDTHRESHOLDCONTROL_32BYTES ((uint32_t)0x00000008U) /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ -#define ETH_RECEIVEDTHRESHOLDCONTROL_96BYTES ((uint32_t)0x00000010U) /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ -#define ETH_RECEIVEDTHRESHOLDCONTROL_128BYTES ((uint32_t)0x00000018U) /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ +#define ETH_RECEIVEDTHRESHOLDCONTROL_64BYTES 0x00000000U /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_RECEIVEDTHRESHOLDCONTROL_32BYTES 0x00000008U /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_RECEIVEDTHRESHOLDCONTROL_96BYTES 0x00000010U /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_RECEIVEDTHRESHOLDCONTROL_128BYTES 0x00000018U /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ /** * @} */ @@ -1312,8 +1312,8 @@ typedef struct /** @defgroup ETH_Second_Frame_Operate ETH Second Frame Operate * @{ */ -#define ETH_SECONDFRAMEOPERARTE_ENABLE ((uint32_t)0x00000004U) -#define ETH_SECONDFRAMEOPERARTE_DISABLE ((uint32_t)0x00000000U) +#define ETH_SECONDFRAMEOPERARTE_ENABLE 0x00000004U +#define ETH_SECONDFRAMEOPERARTE_DISABLE 0x00000000U /** * @} */ @@ -1321,8 +1321,8 @@ typedef struct /** @defgroup ETH_Address_Aligned_Beats ETH Address Aligned Beats * @{ */ -#define ETH_ADDRESSALIGNEDBEATS_ENABLE ((uint32_t)0x02000000U) -#define ETH_ADDRESSALIGNEDBEATS_DISABLE ((uint32_t)0x00000000U) +#define ETH_ADDRESSALIGNEDBEATS_ENABLE 0x02000000U +#define ETH_ADDRESSALIGNEDBEATS_DISABLE 0x00000000U /** * @} */ @@ -1330,8 +1330,8 @@ typedef struct /** @defgroup ETH_Fixed_Burst ETH Fixed Burst * @{ */ -#define ETH_FIXEDBURST_ENABLE ((uint32_t)0x00010000U) -#define ETH_FIXEDBURST_DISABLE ((uint32_t)0x00000000U) +#define ETH_FIXEDBURST_ENABLE 0x00010000U +#define ETH_FIXEDBURST_DISABLE 0x00000000U /** * @} */ @@ -1339,18 +1339,18 @@ typedef struct /** @defgroup ETH_Rx_DMA_Burst_Length ETH Rx DMA Burst Length * @{ */ -#define ETH_RXDMABURSTLENGTH_1BEAT ((uint32_t)0x00020000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ -#define ETH_RXDMABURSTLENGTH_2BEAT ((uint32_t)0x00040000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ -#define ETH_RXDMABURSTLENGTH_4BEAT ((uint32_t)0x00080000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ -#define ETH_RXDMABURSTLENGTH_8BEAT ((uint32_t)0x00100000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ -#define ETH_RXDMABURSTLENGTH_16BEAT ((uint32_t)0x00200000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ -#define ETH_RXDMABURSTLENGTH_32BEAT ((uint32_t)0x00400000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_4BEAT ((uint32_t)0x01020000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_8BEAT ((uint32_t)0x01040000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_16BEAT ((uint32_t)0x01080000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_32BEAT ((uint32_t)0x01100000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_64BEAT ((uint32_t)0x01200000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ -#define ETH_RXDMABURSTLENGTH_4XPBL_128BEAT ((uint32_t)0x01400000U) /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define ETH_RXDMABURSTLENGTH_1BEAT 0x00020000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RXDMABURSTLENGTH_2BEAT 0x00040000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RXDMABURSTLENGTH_4BEAT 0x00080000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RXDMABURSTLENGTH_8BEAT 0x00100000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RXDMABURSTLENGTH_16BEAT 0x00200000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RXDMABURSTLENGTH_32BEAT 0x00400000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_4BEAT 0x01020000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_8BEAT 0x01040000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_16BEAT 0x01080000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_32BEAT 0x01100000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_64BEAT 0x01200000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RXDMABURSTLENGTH_4XPBL_128BEAT 0x01400000U /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ /** * @} */ @@ -1358,18 +1358,18 @@ typedef struct /** @defgroup ETH_Tx_DMA_Burst_Length ETH Tx DMA Burst Length * @{ */ -#define ETH_TXDMABURSTLENGTH_1BEAT ((uint32_t)0x00000100U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ -#define ETH_TXDMABURSTLENGTH_2BEAT ((uint32_t)0x00000200U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ -#define ETH_TXDMABURSTLENGTH_4BEAT ((uint32_t)0x00000400U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ -#define ETH_TXDMABURSTLENGTH_8BEAT ((uint32_t)0x00000800U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ -#define ETH_TXDMABURSTLENGTH_16BEAT ((uint32_t)0x00001000U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ -#define ETH_TXDMABURSTLENGTH_32BEAT ((uint32_t)0x00002000U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_4BEAT ((uint32_t)0x01000100U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_8BEAT ((uint32_t)0x01000200U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_16BEAT ((uint32_t)0x01000400U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_32BEAT ((uint32_t)0x01000800U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_64BEAT ((uint32_t)0x01001000U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ -#define ETH_TXDMABURSTLENGTH_4XPBL_128BEAT ((uint32_t)0x01002000U) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define ETH_TXDMABURSTLENGTH_1BEAT 0x00000100U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TXDMABURSTLENGTH_2BEAT 0x00000200U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TXDMABURSTLENGTH_4BEAT 0x00000400U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TXDMABURSTLENGTH_8BEAT 0x00000800U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TXDMABURSTLENGTH_16BEAT 0x00001000U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TXDMABURSTLENGTH_32BEAT 0x00002000U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_4BEAT 0x01000100U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_8BEAT 0x01000200U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_16BEAT 0x01000400U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_32BEAT 0x01000800U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_64BEAT 0x01001000U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TXDMABURSTLENGTH_4XPBL_128BEAT 0x01002000U /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ /** * @} */ @@ -1377,8 +1377,8 @@ typedef struct /** @defgroup ETH_DMA_Enhanced_descriptor_format ETH DMA Enhanced descriptor format * @{ */ -#define ETH_DMAENHANCEDDESCRIPTOR_ENABLE ((uint32_t)0x00000080U) -#define ETH_DMAENHANCEDDESCRIPTOR_DISABLE ((uint32_t)0x00000000U) +#define ETH_DMAENHANCEDDESCRIPTOR_ENABLE 0x00000080U +#define ETH_DMAENHANCEDDESCRIPTOR_DISABLE 0x00000000U /** * @} */ @@ -1386,11 +1386,11 @@ typedef struct /** @defgroup ETH_DMA_Arbitration ETH DMA Arbitration * @{ */ -#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_1_1 ((uint32_t)0x00000000U) -#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_2_1 ((uint32_t)0x00004000U) -#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_3_1 ((uint32_t)0x00008000U) -#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_4_1 ((uint32_t)0x0000C000U) -#define ETH_DMAARBITRATION_RXPRIORTX ((uint32_t)0x00000002U) +#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_1_1 0x00000000U +#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_2_1 0x00004000U +#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_3_1 0x00008000U +#define ETH_DMAARBITRATION_ROUNDROBIN_RXTX_4_1 0x0000C000U +#define ETH_DMAARBITRATION_RXPRIORTX 0x00000002U /** * @} */ @@ -1398,8 +1398,8 @@ typedef struct /** @defgroup ETH_DMA_Tx_descriptor_segment ETH DMA Tx descriptor segment * @{ */ -#define ETH_DMATXDESC_LASTSEGMENTS ((uint32_t)0x40000000U) /*!< Last Segment */ -#define ETH_DMATXDESC_FIRSTSEGMENT ((uint32_t)0x20000000U) /*!< First Segment */ +#define ETH_DMATXDESC_LASTSEGMENTS 0x40000000U /*!< Last Segment */ +#define ETH_DMATXDESC_FIRSTSEGMENT 0x20000000U /*!< First Segment */ /** * @} */ @@ -1407,10 +1407,10 @@ typedef struct /** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control ETH DMA Tx descriptor Checksum Insertion Control * @{ */ -#define ETH_DMATXDESC_CHECKSUMBYPASS ((uint32_t)0x00000000U) /*!< Checksum engine bypass */ -#define ETH_DMATXDESC_CHECKSUMIPV4HEADER ((uint32_t)0x00400000U) /*!< IPv4 header checksum insertion */ -#define ETH_DMATXDESC_CHECKSUMTCPUDPICMPSEGMENT ((uint32_t)0x00800000U) /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ -#define ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL ((uint32_t)0x00C00000U) /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ +#define ETH_DMATXDESC_CHECKSUMBYPASS 0x00000000U /*!< Checksum engine bypass */ +#define ETH_DMATXDESC_CHECKSUMIPV4HEADER 0x00400000U /*!< IPv4 header checksum insertion */ +#define ETH_DMATXDESC_CHECKSUMTCPUDPICMPSEGMENT 0x00800000U /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL 0x00C00000U /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ /** * @} */ @@ -1418,8 +1418,8 @@ typedef struct /** @defgroup ETH_DMA_Rx_descriptor_buffers ETH DMA Rx descriptor buffers * @{ */ -#define ETH_DMARXDESC_BUFFER1 ((uint32_t)0x00000000U) /*!< DMA Rx Desc Buffer1 */ -#define ETH_DMARXDESC_BUFFER2 ((uint32_t)0x00000001U) /*!< DMA Rx Desc Buffer2 */ +#define ETH_DMARXDESC_BUFFER1 0x00000000U /*!< DMA Rx Desc Buffer1 */ +#define ETH_DMARXDESC_BUFFER2 0x00000001U /*!< DMA Rx Desc Buffer2 */ /** * @} */ @@ -1427,9 +1427,9 @@ typedef struct /** @defgroup ETH_PMT_Flags ETH PMT Flags * @{ */ -#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000U) /*!< Wake-Up Frame Filter Register Pointer Reset */ -#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040U) /*!< Wake-Up Frame Received */ -#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020U) /*!< Magic Packet Received */ +#define ETH_PMT_FLAG_WUFFRPR 0x80000000U /*!< Wake-Up Frame Filter Register Pointer Reset */ +#define ETH_PMT_FLAG_WUFR 0x00000040U /*!< Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR 0x00000020U /*!< Magic Packet Received */ /** * @} */ @@ -1437,9 +1437,9 @@ typedef struct /** @defgroup ETH_MMC_Tx_Interrupts ETH MMC Tx Interrupts * @{ */ -#define ETH_MMC_IT_TGF ((uint32_t)0x00200000U) /*!< When Tx good frame counter reaches half the maximum value */ -#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000U) /*!< When Tx good multi col counter reaches half the maximum value */ -#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000U) /*!< When Tx good single col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGF 0x00200000U /*!< When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC 0x00008000U /*!< When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC 0x00004000U /*!< When Tx good single col counter reaches half the maximum value */ /** * @} */ @@ -1447,9 +1447,9 @@ typedef struct /** @defgroup ETH_MMC_Rx_Interrupts ETH MMC Rx Interrupts * @{ */ -#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000U) /*!< When Rx good unicast frames counter reaches half the maximum value */ -#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040U) /*!< When Rx alignment error counter reaches half the maximum value */ -#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020U) /*!< When Rx crc error counter reaches half the maximum value */ +#define ETH_MMC_IT_RGUF 0x10020000U /*!< When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE 0x10000040U /*!< When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE 0x10000020U /*!< When Rx crc error counter reaches half the maximum value */ /** * @} */ @@ -1457,11 +1457,11 @@ typedef struct /** @defgroup ETH_MAC_Flags ETH MAC Flags * @{ */ -#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200U) /*!< Time stamp trigger flag (on MAC) */ -#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040U) /*!< MMC transmit flag */ -#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020U) /*!< MMC receive flag */ -#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010U) /*!< MMC flag (on MAC) */ -#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008U) /*!< PMT flag (on MAC) */ +#define ETH_MAC_FLAG_TST 0x00000200U /*!< Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT 0x00000040U /*!< MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR 0x00000020U /*!< MMC receive flag */ +#define ETH_MAC_FLAG_MMC 0x00000010U /*!< MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT 0x00000008U /*!< PMT flag (on MAC) */ /** * @} */ @@ -1469,27 +1469,27 @@ typedef struct /** @defgroup ETH_DMA_Flags ETH DMA Flags * @{ */ -#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000U) /*!< Time-stamp trigger interrupt (on DMA) */ -#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000U) /*!< PMT interrupt (on DMA) */ -#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000U) /*!< MMC interrupt (on DMA) */ -#define ETH_DMA_FLAG_DATATRANSFERERROR ((uint32_t)0x00800000U) /*!< Error bits 0-Rx DMA, 1-Tx DMA */ -#define ETH_DMA_FLAG_READWRITEERROR ((uint32_t)0x01000000U) /*!< Error bits 0-write transfer, 1-read transfer */ -#define ETH_DMA_FLAG_ACCESSERROR ((uint32_t)0x02000000U) /*!< Error bits 0-data buffer, 1-desc. access */ -#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000U) /*!< Normal interrupt summary flag */ -#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000U) /*!< Abnormal interrupt summary flag */ -#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000U) /*!< Early receive flag */ -#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000U) /*!< Fatal bus error flag */ -#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400U) /*!< Early transmit flag */ -#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200U) /*!< Receive watchdog timeout flag */ -#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100U) /*!< Receive process stopped flag */ -#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080U) /*!< Receive buffer unavailable flag */ -#define ETH_DMA_FLAG_R ((uint32_t)0x00000040U) /*!< Receive flag */ -#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020U) /*!< Underflow flag */ -#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010U) /*!< Overflow flag */ -#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008U) /*!< Transmit jabber timeout flag */ -#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004U) /*!< Transmit buffer unavailable flag */ -#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002U) /*!< Transmit process stopped flag */ -#define ETH_DMA_FLAG_T ((uint32_t)0x00000001U) /*!< Transmit flag */ +#define ETH_DMA_FLAG_TST 0x20000000U /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT 0x10000000U /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC 0x08000000U /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DATATRANSFERERROR 0x00800000U /*!< Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_READWRITEERROR 0x01000000U /*!< Error bits 0-write transfer, 1-read transfer */ +#define ETH_DMA_FLAG_ACCESSERROR 0x02000000U /*!< Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS 0x00010000U /*!< Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS 0x00008000U /*!< Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER 0x00004000U /*!< Early receive flag */ +#define ETH_DMA_FLAG_FBE 0x00002000U /*!< Fatal bus error flag */ +#define ETH_DMA_FLAG_ET 0x00000400U /*!< Early transmit flag */ +#define ETH_DMA_FLAG_RWT 0x00000200U /*!< Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS 0x00000100U /*!< Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU 0x00000080U /*!< Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R 0x00000040U /*!< Receive flag */ +#define ETH_DMA_FLAG_TU 0x00000020U /*!< Underflow flag */ +#define ETH_DMA_FLAG_RO 0x00000010U /*!< Overflow flag */ +#define ETH_DMA_FLAG_TJT 0x00000008U /*!< Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU 0x00000004U /*!< Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS 0x00000002U /*!< Transmit process stopped flag */ +#define ETH_DMA_FLAG_T 0x00000001U /*!< Transmit flag */ /** * @} */ @@ -1497,11 +1497,11 @@ typedef struct /** @defgroup ETH_MAC_Interrupts ETH MAC Interrupts * @{ */ -#define ETH_MAC_IT_TST ((uint32_t)0x00000200U) /*!< Time stamp trigger interrupt (on MAC) */ -#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040U) /*!< MMC transmit interrupt */ -#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020U) /*!< MMC receive interrupt */ -#define ETH_MAC_IT_MMC ((uint32_t)0x00000010U) /*!< MMC interrupt (on MAC) */ -#define ETH_MAC_IT_PMT ((uint32_t)0x00000008U) /*!< PMT interrupt (on MAC) */ +#define ETH_MAC_IT_TST 0x00000200U /*!< Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT 0x00000040U /*!< MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR 0x00000020U /*!< MMC receive interrupt */ +#define ETH_MAC_IT_MMC 0x00000010U /*!< MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT 0x00000008U /*!< PMT interrupt (on MAC) */ /** * @} */ @@ -1509,24 +1509,24 @@ typedef struct /** @defgroup ETH_DMA_Interrupts ETH DMA Interrupts * @{ */ -#define ETH_DMA_IT_TST ((uint32_t)0x20000000U) /*!< Time-stamp trigger interrupt (on DMA) */ -#define ETH_DMA_IT_PMT ((uint32_t)0x10000000U) /*!< PMT interrupt (on DMA) */ -#define ETH_DMA_IT_MMC ((uint32_t)0x08000000U) /*!< MMC interrupt (on DMA) */ -#define ETH_DMA_IT_NIS ((uint32_t)0x00010000U) /*!< Normal interrupt summary */ -#define ETH_DMA_IT_AIS ((uint32_t)0x00008000U) /*!< Abnormal interrupt summary */ -#define ETH_DMA_IT_ER ((uint32_t)0x00004000U) /*!< Early receive interrupt */ -#define ETH_DMA_IT_FBE ((uint32_t)0x00002000U) /*!< Fatal bus error interrupt */ -#define ETH_DMA_IT_ET ((uint32_t)0x00000400U) /*!< Early transmit interrupt */ -#define ETH_DMA_IT_RWT ((uint32_t)0x00000200U) /*!< Receive watchdog timeout interrupt */ -#define ETH_DMA_IT_RPS ((uint32_t)0x00000100U) /*!< Receive process stopped interrupt */ -#define ETH_DMA_IT_RBU ((uint32_t)0x00000080U) /*!< Receive buffer unavailable interrupt */ -#define ETH_DMA_IT_R ((uint32_t)0x00000040U) /*!< Receive interrupt */ -#define ETH_DMA_IT_TU ((uint32_t)0x00000020U) /*!< Underflow interrupt */ -#define ETH_DMA_IT_RO ((uint32_t)0x00000010U) /*!< Overflow interrupt */ -#define ETH_DMA_IT_TJT ((uint32_t)0x00000008U) /*!< Transmit jabber timeout interrupt */ -#define ETH_DMA_IT_TBU ((uint32_t)0x00000004U) /*!< Transmit buffer unavailable interrupt */ -#define ETH_DMA_IT_TPS ((uint32_t)0x00000002U) /*!< Transmit process stopped interrupt */ -#define ETH_DMA_IT_T ((uint32_t)0x00000001U) /*!< Transmit interrupt */ +#define ETH_DMA_IT_TST 0x20000000U /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT 0x10000000U /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC 0x08000000U /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS 0x00010000U /*!< Normal interrupt summary */ +#define ETH_DMA_IT_AIS 0x00008000U /*!< Abnormal interrupt summary */ +#define ETH_DMA_IT_ER 0x00004000U /*!< Early receive interrupt */ +#define ETH_DMA_IT_FBE 0x00002000U /*!< Fatal bus error interrupt */ +#define ETH_DMA_IT_ET 0x00000400U /*!< Early transmit interrupt */ +#define ETH_DMA_IT_RWT 0x00000200U /*!< Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS 0x00000100U /*!< Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU 0x00000080U /*!< Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R 0x00000040U /*!< Receive interrupt */ +#define ETH_DMA_IT_TU 0x00000020U /*!< Underflow interrupt */ +#define ETH_DMA_IT_RO 0x00000010U /*!< Overflow interrupt */ +#define ETH_DMA_IT_TJT 0x00000008U /*!< Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU 0x00000004U /*!< Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS 0x00000002U /*!< Transmit process stopped interrupt */ +#define ETH_DMA_IT_T 0x00000001U /*!< Transmit interrupt */ /** * @} */ @@ -1534,12 +1534,12 @@ typedef struct /** @defgroup ETH_DMA_transmit_process_state ETH DMA transmit process state * @{ */ -#define ETH_DMA_TRANSMITPROCESS_STOPPED ((uint32_t)0x00000000U) /*!< Stopped - Reset or Stop Tx Command issued */ -#define ETH_DMA_TRANSMITPROCESS_FETCHING ((uint32_t)0x00100000U) /*!< Running - fetching the Tx descriptor */ -#define ETH_DMA_TRANSMITPROCESS_WAITING ((uint32_t)0x00200000U) /*!< Running - waiting for status */ -#define ETH_DMA_TRANSMITPROCESS_READING ((uint32_t)0x00300000U) /*!< Running - reading the data from host memory */ -#define ETH_DMA_TRANSMITPROCESS_SUSPENDED ((uint32_t)0x00600000U) /*!< Suspended - Tx Descriptor unavailable */ -#define ETH_DMA_TRANSMITPROCESS_CLOSING ((uint32_t)0x00700000U) /*!< Running - closing Rx descriptor */ +#define ETH_DMA_TRANSMITPROCESS_STOPPED 0x00000000U /*!< Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TRANSMITPROCESS_FETCHING 0x00100000U /*!< Running - fetching the Tx descriptor */ +#define ETH_DMA_TRANSMITPROCESS_WAITING 0x00200000U /*!< Running - waiting for status */ +#define ETH_DMA_TRANSMITPROCESS_READING 0x00300000U /*!< Running - reading the data from host memory */ +#define ETH_DMA_TRANSMITPROCESS_SUSPENDED 0x00600000U /*!< Suspended - Tx Descriptor unavailable */ +#define ETH_DMA_TRANSMITPROCESS_CLOSING 0x00700000U /*!< Running - closing Rx descriptor */ /** * @} @@ -1549,12 +1549,12 @@ typedef struct /** @defgroup ETH_DMA_receive_process_state ETH DMA receive process state * @{ */ -#define ETH_DMA_RECEIVEPROCESS_STOPPED ((uint32_t)0x00000000U) /*!< Stopped - Reset or Stop Rx Command issued */ -#define ETH_DMA_RECEIVEPROCESS_FETCHING ((uint32_t)0x00020000U) /*!< Running - fetching the Rx descriptor */ -#define ETH_DMA_RECEIVEPROCESS_WAITING ((uint32_t)0x00060000U) /*!< Running - waiting for packet */ -#define ETH_DMA_RECEIVEPROCESS_SUSPENDED ((uint32_t)0x00080000U) /*!< Suspended - Rx Descriptor unavailable */ -#define ETH_DMA_RECEIVEPROCESS_CLOSING ((uint32_t)0x000A0000U) /*!< Running - closing descriptor */ -#define ETH_DMA_RECEIVEPROCESS_QUEUING ((uint32_t)0x000E0000U) /*!< Running - queuing the receive frame into host memory */ +#define ETH_DMA_RECEIVEPROCESS_STOPPED 0x00000000U /*!< Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_RECEIVEPROCESS_FETCHING 0x00020000U /*!< Running - fetching the Rx descriptor */ +#define ETH_DMA_RECEIVEPROCESS_WAITING 0x00060000U /*!< Running - waiting for packet */ +#define ETH_DMA_RECEIVEPROCESS_SUSPENDED 0x00080000U /*!< Suspended - Rx Descriptor unavailable */ +#define ETH_DMA_RECEIVEPROCESS_CLOSING 0x000A0000U /*!< Running - closing descriptor */ +#define ETH_DMA_RECEIVEPROCESS_QUEUING 0x000E0000U /*!< Running - queuing the receive frame into host memory */ /** * @} @@ -1563,8 +1563,8 @@ typedef struct /** @defgroup ETH_DMA_overflow ETH DMA overflow * @{ */ -#define ETH_DMA_OVERFLOW_RXFIFOCOUNTER ((uint32_t)0x10000000U) /*!< Overflow bit for FIFO overflow counter */ -#define ETH_DMA_OVERFLOW_MISSEDFRAMECOUNTER ((uint32_t)0x00010000U) /*!< Overflow bit for missed frame counter */ +#define ETH_DMA_OVERFLOW_RXFIFOCOUNTER 0x10000000U /*!< Overflow bit for FIFO overflow counter */ +#define ETH_DMA_OVERFLOW_MISSEDFRAMECOUNTER 0x00010000U /*!< Overflow bit for missed frame counter */ /** * @} */ @@ -1572,7 +1572,7 @@ typedef struct /** @defgroup ETH_EXTI_LINE_WAKEUP ETH EXTI LINE WAKEUP * @{ */ -#define ETH_EXTI_LINE_WAKEUP ((uint32_t)0x00080000U) /*!< External interrupt line 19 Connected to the ETH EXTI Line */ +#define ETH_EXTI_LINE_WAKEUP 0x00080000U /*!< External interrupt line 19 Connected to the ETH EXTI Line */ /** * @} @@ -2073,7 +2073,7 @@ typedef struct */ #define __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER() do{EXTI->RTSR |= ETH_EXTI_LINE_WAKEUP;\ EXTI->FTSR |= ETH_EXTI_LINE_WAKEUP;\ - }while(0) + }while(0U) /** * @brief Disables rising/falling edge trigger to the ETH External interrupt line. @@ -2081,7 +2081,7 @@ typedef struct */ #define __HAL_ETH_WAKEUP_EXTI_DISABLE_FALLINGRISING_TRIGGER() do{EXTI->RTSR &= ~(ETH_EXTI_LINE_WAKEUP);\ EXTI->FTSR &= ~(ETH_EXTI_LINE_WAKEUP);\ - }while(0) + }while(0U) /** * @brief Generate a Software interrupt on selected EXTI line. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h index 0215029..55d1f1c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_flash.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FLASH HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -105,13 +105,13 @@ typedef struct * @brief FLASH Error Code * @{ */ -#define HAL_FLASH_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_FLASH_ERROR_RD ((uint32_t)0x00000001U) /*!< Read Protection error */ -#define HAL_FLASH_ERROR_PGS ((uint32_t)0x00000002U) /*!< Programming Sequence error */ -#define HAL_FLASH_ERROR_PGP ((uint32_t)0x00000004U) /*!< Programming Parallelism error */ -#define HAL_FLASH_ERROR_PGA ((uint32_t)0x00000008U) /*!< Programming Alignment error */ -#define HAL_FLASH_ERROR_WRP ((uint32_t)0x00000010U) /*!< Write protection error */ -#define HAL_FLASH_ERROR_OPERATION ((uint32_t)0x00000020U) /*!< Operation Error */ +#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ +#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ +#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ +#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ +#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ +#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ /** * @} */ @@ -119,10 +119,10 @@ typedef struct /** @defgroup FLASH_Type_Program FLASH Type Program * @{ */ -#define FLASH_TYPEPROGRAM_BYTE ((uint32_t)0x00U) /*!< Program byte (8-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_HALFWORD ((uint32_t)0x01U) /*!< Program a half-word (16-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_WORD ((uint32_t)0x02U) /*!< Program a word (32-bit) at a specified address */ -#define FLASH_TYPEPROGRAM_DOUBLEWORD ((uint32_t)0x03U) /*!< Program a double word (64-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ /** * @} */ @@ -137,7 +137,9 @@ typedef struct #define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ #define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ #define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ -#define FLASH_FLAG_RDERR ((uint32_t)0x00000100U) /*!< Read Protection error flag (PCROP) */ +#if defined(FLASH_SR_RDERR) +#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ +#endif /* FLASH_SR_RDERR */ #define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ /** * @} @@ -148,7 +150,7 @@ typedef struct * @{ */ #define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR ((uint32_t)0x02000000U) /*!< Error Interrupt source */ +#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ /** * @} */ @@ -156,11 +158,11 @@ typedef struct /** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism * @{ */ -#define FLASH_PSIZE_BYTE ((uint32_t)0x00000000U) -#define FLASH_PSIZE_HALF_WORD ((uint32_t)0x00000100U) -#define FLASH_PSIZE_WORD ((uint32_t)0x00000200U) -#define FLASH_PSIZE_DOUBLE_WORD ((uint32_t)0x00000300U) -#define CR_PSIZE_MASK ((uint32_t)0xFFFFFCFFU) +#define FLASH_PSIZE_BYTE 0x00000000U +#define FLASH_PSIZE_HALF_WORD 0x00000100U +#define FLASH_PSIZE_WORD 0x00000200U +#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U +#define CR_PSIZE_MASK 0xFFFFFCFFU /** * @} */ @@ -168,11 +170,11 @@ typedef struct /** @defgroup FLASH_Keys FLASH Keys * @{ */ -#define RDP_KEY ((uint16_t)0x00A5U) -#define FLASH_KEY1 ((uint32_t)0x45670123U) -#define FLASH_KEY2 ((uint32_t)0xCDEF89ABU) -#define FLASH_OPT_KEY1 ((uint32_t)0x08192A3BU) -#define FLASH_OPT_KEY2 ((uint32_t)0x4C5D6E7FU) +#define RDP_KEY ((uint16_t)0x00A5) +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +#define FLASH_OPT_KEY1 0x08192A3BU +#define FLASH_OPT_KEY2 0x4C5D6E7FU /** * @} */ @@ -243,7 +245,7 @@ typedef struct */ #define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ FLASH->ACR &= ~FLASH_ACR_ICRST; \ - }while(0) + }while(0U) /** * @brief Resets the FLASH data Cache. @@ -252,7 +254,7 @@ typedef struct */ #define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ FLASH->ACR &= ~FLASH_ACR_DCRST; \ - }while(0) + }while(0U) /** * @brief Enable the specified FLASH interrupt. * @param __INTERRUPT__ : FLASH interrupt @@ -275,22 +277,23 @@ typedef struct /** * @brief Get the specified FLASH flag status. - * @param __FLAG__: specifies the FLASH flag to check. - * This parameter can be one of the following values: + * @param __FLAG__: specifies the FLASH flags to check. + * This parameter can be any combination of the following values: * @arg FLASH_FLAG_EOP : FLASH End of Operation flag * @arg FLASH_FLAG_OPERR : FLASH operation Error flag * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) * @arg FLASH_FLAG_BSY : FLASH Busy flag + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices * @retval The new state of __FLAG__ (SET or RESET). */ #define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) /** - * @brief Clear the specified FLASH flag. + * @brief Clear the specified FLASH flags. * @param __FLAG__: specifies the FLASH flags to clear. * This parameter can be any combination of the following values: * @arg FLASH_FLAG_EOP : FLASH End of Operation flag @@ -299,7 +302,8 @@ typedef struct * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices * @retval none */ #define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) @@ -374,23 +378,23 @@ HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); /** * @brief ACR register byte 0 (Bits[7:0]) base address */ -#define ACR_BYTE0_ADDRESS ((uint32_t)0x40023C00U) +#define ACR_BYTE0_ADDRESS 0x40023C00U /** * @brief OPTCR register byte 0 (Bits[7:0]) base address */ -#define OPTCR_BYTE0_ADDRESS ((uint32_t)0x40023C14U) +#define OPTCR_BYTE0_ADDRESS 0x40023C14U /** * @brief OPTCR register byte 1 (Bits[15:8]) base address */ -#define OPTCR_BYTE1_ADDRESS ((uint32_t)0x40023C15U) +#define OPTCR_BYTE1_ADDRESS 0x40023C15U /** * @brief OPTCR register byte 2 (Bits[23:16]) base address */ -#define OPTCR_BYTE2_ADDRESS ((uint32_t)0x40023C16U) +#define OPTCR_BYTE2_ADDRESS 0x40023C16U /** * @brief OPTCR register byte 3 (Bits[31:24]) base address */ -#define OPTCR_BYTE3_ADDRESS ((uint32_t)0x40023C17U) +#define OPTCR_BYTE3_ADDRESS 0x40023C17U /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h index 8cc27d2..bfd1632 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_flash_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FLASH HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -161,8 +161,8 @@ typedef struct /** @defgroup FLASHEx_Type_Erase FLASH Type Erase * @{ */ -#define FLASH_TYPEERASE_SECTORS ((uint32_t)0x00U) /*!< Sectors erase only */ -#define FLASH_TYPEERASE_MASSERASE ((uint32_t)0x01U) /*!< Flash Mass erase activation */ +#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ +#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ /** * @} */ @@ -170,10 +170,10 @@ typedef struct /** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range * @{ */ -#define FLASH_VOLTAGE_RANGE_1 ((uint32_t)0x00U) /*!< Device operating range: 1.8V to 2.1V */ -#define FLASH_VOLTAGE_RANGE_2 ((uint32_t)0x01U) /*!< Device operating range: 2.1V to 2.7V */ -#define FLASH_VOLTAGE_RANGE_3 ((uint32_t)0x02U) /*!< Device operating range: 2.7V to 3.6V */ -#define FLASH_VOLTAGE_RANGE_4 ((uint32_t)0x03U) /*!< Device operating range: 2.7V to 3.6V + External Vpp */ +#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ +#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ +#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ +#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ /** * @} */ @@ -181,8 +181,8 @@ typedef struct /** @defgroup FLASHEx_WRP_State FLASH WRP State * @{ */ -#define OB_WRPSTATE_DISABLE ((uint32_t)0x00U) /*!< Disable the write protection of the desired bank 1 sectors */ -#define OB_WRPSTATE_ENABLE ((uint32_t)0x01U) /*!< Enable the write protection of the desired bank 1 sectors */ +#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ +#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ /** * @} */ @@ -190,10 +190,10 @@ typedef struct /** @defgroup FLASHEx_Option_Type FLASH Option Type * @{ */ -#define OPTIONBYTE_WRP ((uint32_t)0x01U) /*!< WRP option byte configuration */ -#define OPTIONBYTE_RDP ((uint32_t)0x02U) /*!< RDP option byte configuration */ -#define OPTIONBYTE_USER ((uint32_t)0x04U) /*!< USER option byte configuration */ -#define OPTIONBYTE_BOR ((uint32_t)0x08U) /*!< BOR option byte configuration */ +#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ +#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ +#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ +#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ /** * @} */ @@ -201,9 +201,9 @@ typedef struct /** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection * @{ */ -#define OB_RDP_LEVEL_0 ((uint8_t)0xAAU) -#define OB_RDP_LEVEL_1 ((uint8_t)0x55U) -#define OB_RDP_LEVEL_2 ((uint8_t)0xCCU) /*!< Warning: When enabling read protection level 2 +#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) +#define OB_RDP_LEVEL_1 ((uint8_t)0x55) +#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 it s no more possible to go back to level 1 or 0 */ /** * @} @@ -212,8 +212,8 @@ typedef struct /** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog * @{ */ -#define OB_IWDG_SW ((uint8_t)0x20U) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00U) /*!< Hardware IWDG selected */ +#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ /** * @} */ @@ -221,8 +221,8 @@ typedef struct /** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP * @{ */ -#define OB_STOP_NO_RST ((uint8_t)0x40U) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00U) /*!< Reset generated when entering in STOP */ +#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ /** * @} */ @@ -231,8 +231,8 @@ typedef struct /** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY * @{ */ -#define OB_STDBY_NO_RST ((uint8_t)0x80U) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00U) /*!< Reset generated when entering in STANDBY */ +#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ /** * @} */ @@ -240,10 +240,10 @@ typedef struct /** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level * @{ */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00U) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04U) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08U) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0CU) /*!< Supply voltage ranges from 1.62 to 2.10 V */ +#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ +#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ +#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ +#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ /** * @} */ @@ -256,8 +256,8 @@ typedef struct /** @defgroup FLASHEx_PCROP_State FLASH PCROP State * @{ */ -#define OB_PCROP_STATE_DISABLE ((uint32_t)0x00U) /*!< Disable PCROP */ -#define OB_PCROP_STATE_ENABLE ((uint32_t)0x01U) /*!< Enable PCROP */ +#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ +#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ /** * @} */ @@ -270,15 +270,15 @@ typedef struct */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ defined(STM32F469xx) || defined(STM32F479xx) -#define OPTIONBYTE_PCROP ((uint32_t)0x01U) /*!< PCROP option byte configuration */ -#define OPTIONBYTE_BOOTCONFIG ((uint32_t)0x02U) /*!< BOOTConfig option byte configuration */ +#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ +#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ #if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ defined(STM32F423xx) -#define OPTIONBYTE_PCROP ((uint32_t)0x01U) /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) +#define IS_FLASH_ADDRESS(ADDRESS) ((((ADDRESS) >= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ + (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) + #define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ #if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F413xx || STM32F423xx */ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ #if defined(STM32F401xC) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F401xC */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ #if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ #if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & (uint32_t)0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F413xx || STM32F423xx */ #if defined(STM32F401xC) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F401xC */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ #if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_OB_PCROP(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) #endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h index e785783..c284123 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_flash_ramfunc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FLASH RAMFUNC driver. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c.h index b0f2d93..8e2913f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_fmpi2c.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FMPI2C HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -183,14 +183,14 @@ typedef enum * @brief FMPI2C Error Code definition * @{ */ -#define HAL_FMPI2C_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_FMPI2C_ERROR_BERR ((uint32_t)0x00000001U) /*!< BERR error */ -#define HAL_FMPI2C_ERROR_ARLO ((uint32_t)0x00000002U) /*!< ARLO error */ -#define HAL_FMPI2C_ERROR_AF ((uint32_t)0x00000004U) /*!< ACKF error */ -#define HAL_FMPI2C_ERROR_OVR ((uint32_t)0x00000008U) /*!< OVR error */ -#define HAL_FMPI2C_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ -#define HAL_FMPI2C_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< Timeout error */ -#define HAL_FMPI2C_ERROR_SIZE ((uint32_t)0x00000040U) /*!< Size Management error */ +#define HAL_FMPI2C_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_FMPI2C_ERROR_BERR 0x00000001U /*!< BERR error */ +#define HAL_FMPI2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ +#define HAL_FMPI2C_ERROR_AF 0x00000004U /*!< ACKF error */ +#define HAL_FMPI2C_ERROR_OVR 0x00000008U /*!< OVR error */ +#define HAL_FMPI2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#define HAL_FMPI2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_FMPI2C_ERROR_SIZE 0x00000040U /*!< Size Management error */ /** * @} */ @@ -249,6 +249,7 @@ typedef struct __FMPI2C_HandleTypeDef * @{ */ #define FMPI2C_FIRST_FRAME ((uint32_t)FMPI2C_SOFTEND_MODE) +#define FMPI2C_FIRST_AND_NEXT_FRAME ((uint32_t)(FMPI2C_RELOAD_MODE | FMPI2C_SOFTEND_MODE)) #define FMPI2C_NEXT_FRAME ((uint32_t)(FMPI2C_RELOAD_MODE | FMPI2C_SOFTEND_MODE)) #define FMPI2C_FIRST_AND_LAST_FRAME ((uint32_t)FMPI2C_AUTOEND_MODE) #define FMPI2C_LAST_FRAME ((uint32_t)FMPI2C_AUTOEND_MODE) @@ -259,8 +260,8 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_ADDRESSING_MODE FMPI2C Addressing Mode * @{ */ -#define FMPI2C_ADDRESSINGMODE_7BIT ((uint32_t)0x00000001U) -#define FMPI2C_ADDRESSINGMODE_10BIT ((uint32_t)0x00000002U) +#define FMPI2C_ADDRESSINGMODE_7BIT 0x00000001U +#define FMPI2C_ADDRESSINGMODE_10BIT 0x00000002U /** * @} */ @@ -268,7 +269,7 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_DUAL_ADDRESSING_MODE FMPI2C Dual Addressing Mode * @{ */ -#define FMPI2C_DUALADDRESS_DISABLE ((uint32_t)0x00000000U) +#define FMPI2C_DUALADDRESS_DISABLE 0x00000000U #define FMPI2C_DUALADDRESS_ENABLE FMPI2C_OAR2_OA2EN /** * @} @@ -278,14 +279,14 @@ typedef struct __FMPI2C_HandleTypeDef * @{ */ -#define FMPI2C_OA2_NOMASK ((uint8_t)0x00U) -#define FMPI2C_OA2_MASK01 ((uint8_t)0x01U) -#define FMPI2C_OA2_MASK02 ((uint8_t)0x02U) -#define FMPI2C_OA2_MASK03 ((uint8_t)0x03U) -#define FMPI2C_OA2_MASK04 ((uint8_t)0x04U) -#define FMPI2C_OA2_MASK05 ((uint8_t)0x05U) -#define FMPI2C_OA2_MASK06 ((uint8_t)0x06U) -#define FMPI2C_OA2_MASK07 ((uint8_t)0x07U) +#define FMPI2C_OA2_NOMASK ((uint8_t)0x00) +#define FMPI2C_OA2_MASK01 ((uint8_t)0x01) +#define FMPI2C_OA2_MASK02 ((uint8_t)0x02) +#define FMPI2C_OA2_MASK03 ((uint8_t)0x03) +#define FMPI2C_OA2_MASK04 ((uint8_t)0x04) +#define FMPI2C_OA2_MASK05 ((uint8_t)0x05) +#define FMPI2C_OA2_MASK06 ((uint8_t)0x06) +#define FMPI2C_OA2_MASK07 ((uint8_t)0x07) /** * @} @@ -294,7 +295,7 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_GENERAL_CALL_ADDRESSING_MODE FMPI2C General Call Addressing Mode * @{ */ -#define FMPI2C_GENERALCALL_DISABLE ((uint32_t)0x00000000U) +#define FMPI2C_GENERALCALL_DISABLE 0x00000000U #define FMPI2C_GENERALCALL_ENABLE FMPI2C_CR1_GCEN /** * @} @@ -303,7 +304,7 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_NOSTRETCH_MODE FMPI2C No-Stretch Mode * @{ */ -#define FMPI2C_NOSTRETCH_DISABLE ((uint32_t)0x00000000U) +#define FMPI2C_NOSTRETCH_DISABLE 0x00000000U #define FMPI2C_NOSTRETCH_ENABLE FMPI2C_CR1_NOSTRETCH /** * @} @@ -312,8 +313,8 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_MEMORY_ADDRESS_SIZE FMPI2C Memory Address Size * @{ */ -#define FMPI2C_MEMADD_SIZE_8BIT ((uint32_t)0x00000001U) -#define FMPI2C_MEMADD_SIZE_16BIT ((uint32_t)0x00000002U) +#define FMPI2C_MEMADD_SIZE_8BIT 0x00000001U +#define FMPI2C_MEMADD_SIZE_16BIT 0x00000002U /** * @} @@ -322,8 +323,8 @@ typedef struct __FMPI2C_HandleTypeDef /** @defgroup FMPI2C_XferDirection FMPI2C Transfer Direction * @{ */ -#define FMPI2C_DIRECTION_RECEIVE ((uint32_t)0x00000000U) -#define FMPI2C_DIRECTION_TRANSMIT ((uint32_t)0x00000001U) +#define FMPI2C_DIRECTION_RECEIVE 0x00000000U +#define FMPI2C_DIRECTION_TRANSMIT 0x00000001U /** * @} @@ -334,7 +335,7 @@ typedef struct __FMPI2C_HandleTypeDef */ #define FMPI2C_RELOAD_MODE FMPI2C_CR2_RELOAD #define FMPI2C_AUTOEND_MODE FMPI2C_CR2_AUTOEND -#define FMPI2C_SOFTEND_MODE ((uint32_t)0x00000000U) +#define FMPI2C_SOFTEND_MODE 0x00000000U /** * @} @@ -344,7 +345,7 @@ typedef struct __FMPI2C_HandleTypeDef * @{ */ -#define FMPI2C_NO_STARTSTOP ((uint32_t)0x00000000U) +#define FMPI2C_NO_STARTSTOP 0x00000000U #define FMPI2C_GENERATE_STOP FMPI2C_CR2_STOP #define FMPI2C_GENERATE_START_READ (uint32_t)(FMPI2C_CR2_START | FMPI2C_CR2_RD_WRN) #define FMPI2C_GENERATE_START_WRITE FMPI2C_CR2_START @@ -667,9 +668,10 @@ uint32_t HAL_FMPI2C_GetError(FMPI2C_HandleTypeDef *hfmpi2c); ((REQUEST) == FMPI2C_NO_STARTSTOP)) #define IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == FMPI2C_FIRST_FRAME) || \ - ((REQUEST) == FMPI2C_NEXT_FRAME) || \ - ((REQUEST) == FMPI2C_FIRST_AND_LAST_FRAME) || \ - ((REQUEST) == FMPI2C_LAST_FRAME)) + ((REQUEST) == FMPI2C_FIRST_AND_NEXT_FRAME) || \ + ((REQUEST) == FMPI2C_NEXT_FRAME) || \ + ((REQUEST) == FMPI2C_FIRST_AND_LAST_FRAME) || \ + ((REQUEST) == FMPI2C_LAST_FRAME)) #define FMPI2C_RESET_CR2(__HANDLE__) ((__HANDLE__)->Instance->CR2 &= (uint32_t)~((uint32_t)(FMPI2C_CR2_SADD | FMPI2C_CR2_HEAD10R | FMPI2C_CR2_NBYTES | FMPI2C_CR2_RELOAD | FMPI2C_CR2_RD_WRN))) @@ -679,11 +681,11 @@ uint32_t HAL_FMPI2C_GetError(FMPI2C_HandleTypeDef *hfmpi2c); #define FMPI2C_GET_OWN_ADDRESS1(__HANDLE__) ((__HANDLE__)->Instance->OAR1 & FMPI2C_OAR1_OA1) #define FMPI2C_GET_OWN_ADDRESS2(__HANDLE__) ((__HANDLE__)->Instance->OAR2 & FMPI2C_OAR2_OA2) -#define IS_FMPI2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= (uint32_t)0x000003FFU) -#define IS_FMPI2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FFU) +#define IS_FMPI2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x000003FFU) +#define IS_FMPI2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FF) -#define FMPI2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U))) -#define FMPI2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU)))) +#define FMPI2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8U))) +#define FMPI2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) #define FMPI2C_GENERATE_START(__ADDMODE__,__ADDRESS__) (((__ADDMODE__) == FMPI2C_ADDRESSINGMODE_7BIT) ? (uint32_t)((((uint32_t)(__ADDRESS__) & (FMPI2C_CR2_SADD)) | (FMPI2C_CR2_START) | (FMPI2C_CR2_AUTOEND)) & (~FMPI2C_CR2_RD_WRN)) : \ (uint32_t)((((uint32_t)(__ADDRESS__) & (FMPI2C_CR2_SADD)) | (FMPI2C_CR2_ADD10) | (FMPI2C_CR2_START)) & (~FMPI2C_CR2_RD_WRN))) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c_ex.h index 18f080a..0e213db 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_fmpi2c_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_fmpi2c_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FMPI2C HAL Extended module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -67,7 +67,7 @@ /** @defgroup FMPI2CEx_Analog_Filter FMPI2C Extended Analog Filter * @{ */ -#define FMPI2C_ANALOGFILTER_ENABLE ((uint32_t)0x00000000U) +#define FMPI2C_ANALOGFILTER_ENABLE 0x00000000U #define FMPI2C_ANALOGFILTER_DISABLE FMPI2C_CR1_ANFOFF /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h index 67081d6..a961f3e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_gpio.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of GPIO HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -101,25 +101,25 @@ typedef enum /** @defgroup GPIO_pins_define GPIO pins define * @{ */ -#define GPIO_PIN_0 ((uint16_t)0x0001U) /* Pin 0 selected */ -#define GPIO_PIN_1 ((uint16_t)0x0002U) /* Pin 1 selected */ -#define GPIO_PIN_2 ((uint16_t)0x0004U) /* Pin 2 selected */ -#define GPIO_PIN_3 ((uint16_t)0x0008U) /* Pin 3 selected */ -#define GPIO_PIN_4 ((uint16_t)0x0010U) /* Pin 4 selected */ -#define GPIO_PIN_5 ((uint16_t)0x0020U) /* Pin 5 selected */ -#define GPIO_PIN_6 ((uint16_t)0x0040U) /* Pin 6 selected */ -#define GPIO_PIN_7 ((uint16_t)0x0080U) /* Pin 7 selected */ -#define GPIO_PIN_8 ((uint16_t)0x0100U) /* Pin 8 selected */ -#define GPIO_PIN_9 ((uint16_t)0x0200U) /* Pin 9 selected */ -#define GPIO_PIN_10 ((uint16_t)0x0400U) /* Pin 10 selected */ -#define GPIO_PIN_11 ((uint16_t)0x0800U) /* Pin 11 selected */ -#define GPIO_PIN_12 ((uint16_t)0x1000U) /* Pin 12 selected */ -#define GPIO_PIN_13 ((uint16_t)0x2000U) /* Pin 13 selected */ -#define GPIO_PIN_14 ((uint16_t)0x4000U) /* Pin 14 selected */ -#define GPIO_PIN_15 ((uint16_t)0x8000U) /* Pin 15 selected */ -#define GPIO_PIN_All ((uint16_t)0xFFFFU) /* All pins selected */ - -#define GPIO_PIN_MASK ((uint32_t)0x0000FFFFU) /* PIN mask for assert test */ +#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ + +#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ /** * @} */ @@ -134,21 +134,21 @@ typedef enum * - Z : IO Direction mode (Input, Output, Alternate or Analog) * @{ */ -#define GPIO_MODE_INPUT ((uint32_t)0x00000000U) /*!< Input Floating Mode */ -#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001U) /*!< Output Push Pull Mode */ -#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011U) /*!< Output Open Drain Mode */ -#define GPIO_MODE_AF_PP ((uint32_t)0x00000002U) /*!< Alternate Function Push Pull Mode */ -#define GPIO_MODE_AF_OD ((uint32_t)0x00000012U) /*!< Alternate Function Open Drain Mode */ +#define GPIO_MODE_INPUT 0x00000000U /*!< Input Floating Mode */ +#define GPIO_MODE_OUTPUT_PP 0x00000001U /*!< Output Push Pull Mode */ +#define GPIO_MODE_OUTPUT_OD 0x00000011U /*!< Output Open Drain Mode */ +#define GPIO_MODE_AF_PP 0x00000002U /*!< Alternate Function Push Pull Mode */ +#define GPIO_MODE_AF_OD 0x00000012U /*!< Alternate Function Open Drain Mode */ -#define GPIO_MODE_ANALOG ((uint32_t)0x00000003U) /*!< Analog Mode */ +#define GPIO_MODE_ANALOG 0x00000003U /*!< Analog Mode */ -#define GPIO_MODE_IT_RISING ((uint32_t)0x10110000U) /*!< External Interrupt Mode with Rising edge trigger detection */ -#define GPIO_MODE_IT_FALLING ((uint32_t)0x10210000U) /*!< External Interrupt Mode with Falling edge trigger detection */ -#define GPIO_MODE_IT_RISING_FALLING ((uint32_t)0x10310000U) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define GPIO_MODE_IT_RISING 0x10110000U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define GPIO_MODE_IT_FALLING 0x10210000U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define GPIO_MODE_IT_RISING_FALLING 0x10310000U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define GPIO_MODE_EVT_RISING ((uint32_t)0x10120000U) /*!< External Event Mode with Rising edge trigger detection */ -#define GPIO_MODE_EVT_FALLING ((uint32_t)0x10220000U) /*!< External Event Mode with Falling edge trigger detection */ -#define GPIO_MODE_EVT_RISING_FALLING ((uint32_t)0x10320000U) /*!< External Event Mode with Rising/Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING 0x10120000U /*!< External Event Mode with Rising edge trigger detection */ +#define GPIO_MODE_EVT_FALLING 0x10220000U /*!< External Event Mode with Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING_FALLING 0x10320000U /*!< External Event Mode with Rising/Falling edge trigger detection */ /** * @} */ @@ -157,10 +157,10 @@ typedef enum * @brief GPIO Output Maximum frequency * @{ */ -#define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< IO works at 2 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ -#define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ /** * @} */ @@ -169,9 +169,9 @@ typedef enum * @brief GPIO Pull-Up or Pull-Down Activation * @{ */ -#define GPIO_NOPULL ((uint32_t)0x00000000U) /*!< No Pull-up or Pull-down activation */ -#define GPIO_PULLUP ((uint32_t)0x00000001U) /*!< Pull-up activation */ -#define GPIO_PULLDOWN ((uint32_t)0x00000002U) /*!< Pull-down activation */ +#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ +#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ +#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ /** * @} */ @@ -280,7 +280,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(PIN) (((PIN) & GPIO_PIN_MASK ) != (uint32_t)0x00U) +#define IS_GPIO_PIN(PIN) ((((PIN) & GPIO_PIN_MASK ) != 0x00U) && (((PIN) & ~GPIO_PIN_MASK) == 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h index e788b71..96ab674 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_gpio_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of GPIO HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -69,117 +69,117 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05U) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05U) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06U) /* SAI1 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08U) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08U) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09U) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 13 selection */ -#define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ /** * @brief AF 14 selection */ -#define GPIO_AF14_LTDC ((uint8_t)0x0EU) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F429xx || STM32F439xx */ /*----------------------------------------------------------------------------*/ @@ -188,113 +188,113 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05U) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05U) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ /** @brief GPIO_Legacy */ -#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06U) /* SAI1 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08U) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08U) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 13 selection */ -#define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F427xx || STM32F437xx */ /*----------------------------------------------------------------------------*/ @@ -303,104 +303,104 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FSMC ((uint8_t)0x0CU) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 13 selection */ -#define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F407xx || STM32F417xx */ /*----------------------------------------------------------------------------*/ @@ -409,94 +409,94 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FSMC ((uint8_t)0x0CU) /* FSMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F405xx || STM32F415xx */ /*----------------------------------------------------------------------------*/ @@ -506,87 +506,87 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F401xC || STM32F401xE */ /*----------------------------------------------------------------------------*/ @@ -595,106 +595,107 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04U) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06U) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06U) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06U) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08U) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08U) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08U) /* CAN1 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ /** * @brief AF 9 selection - */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09U) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09U) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09U) /* QSPI Alternate Function mapping */ + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0AU) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0AU) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FMC ((uint8_t)0x0AU) /* FMC Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ /*----------------------------------------------------------------------------*/ @@ -704,131 +705,131 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01U) /* LPTIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_DFSDM2 ((uint8_t)0x03U) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04U) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06U) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06U) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_DFSDM1 ((uint8_t)0x06U) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF6_DFSDM2 ((uint8_t)0x06U) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SAI1 ((uint8_t)0x07U) /* SAI1 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ -#define GPIO_AF7_DFSDM2 ((uint8_t)0x07U) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_USART3 ((uint8_t)0x08U) /* USART3 Alternate Function mapping */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08U) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08U) /* UART8 Alternate Function mapping */ -#define GPIO_AF8_DFSDM1 ((uint8_t)0x08U) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF8_CAN1 ((uint8_t)0x08U) /* CAN1 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09U) /* I2C3 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09U) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09U) /* QSPI Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_SAI1 ((uint8_t)0x0AU) /* SAI1 Alternate Function mapping */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_DFSDM1 ((uint8_t)0x0AU) /* DFSDM1 Alternate Function mapping */ -#define GPIO_AF10_DFSDM2 ((uint8_t)0x0AU) /* DFSDM2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0AU) /* QSPI Alternate Function mapping */ -#define GPIO_AF10_FSMC ((uint8_t)0x0AU) /* FSMC Alternate Function mapping */ +#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_UART4 ((uint8_t)0x0BU) /* UART4 Alternate Function mapping */ -#define GPIO_AF11_UART5 ((uint8_t)0x0BU) /* UART5 Alternate Function mapping */ -#define GPIO_AF11_UART9 ((uint8_t)0x0BU) /* UART9 Alternate Function mapping */ -#define GPIO_AF11_UART10 ((uint8_t)0x0BU) /* UART10 Alternate Function mapping */ -#define GPIO_AF11_CAN3 ((uint8_t)0x0BU) /* CAN3 Alternate Function mapping */ +#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ +#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ +#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ +#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ +#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ -#define GPIO_AF12_FSMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ /** * @brief AF 14 selection */ -#define GPIO_AF14_RNG ((uint8_t)0x0EU) /* RNG Alternate Function mapping */ +#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F413xx || STM32F423xx */ /*---------------------------------------- STM32F411xx------------------------*/ @@ -836,91 +837,91 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06U) /* SPI4/I2S4 Alternate Function mapping */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06U) /* SPI5/I2S5 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_I2C3 ((uint8_t)0x09U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F411xE */ /*---------------------------------------- STM32F410xx------------------------*/ @@ -928,73 +929,73 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_LPTIM1 ((uint8_t)0x01U) /* LPTIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04U) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ #if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ #endif /* STM32F410Cx || STM32F410Rx */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI1 ((uint8_t)0x06U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ #if defined(STM32F410Cx) || defined(STM32F410Rx) -#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ #endif /* STM32F410Cx || STM32F410Rx */ -#define GPIO_AF6_SPI5 ((uint8_t)0x06U) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_I2C2 ((uint8_t)0x09U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09U) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ /*---------------------------------------- STM32F446xx -----------------------*/ @@ -1002,118 +1003,118 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ -#define GPIO_AF3_CEC ((uint8_t)0x03U) /* CEC Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ -#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04U) /* FMPI2C1 Alternate Function mapping */ -#define GPIO_AF4_CEC ((uint8_t)0x04U) /* CEC Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_SPI4 ((uint8_t)0x06U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06U) /* SAI1 Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_UART5 ((uint8_t)0x07U) /* UART5 Alternate Function mapping */ -#define GPIO_AF7_SPI2 ((uint8_t)0x07U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF7_SPI3 ((uint8_t)0x07U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF7_SPDIFRX ((uint8_t)0x07U) /* SPDIFRX Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ +#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_SPDIFRX ((uint8_t)0x08U) /* SPDIFRX Alternate Function mapping */ -#define GPIO_AF8_SAI2 ((uint8_t)0x08U) /* SAI2 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ +#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09U) /* QSPI Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_SAI2 ((uint8_t)0x0AU) /* SAI2 Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0AU) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 13 selection */ -#define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F446xx */ /*----------------------------------------------------------------------------*/ @@ -1123,120 +1124,120 @@ /** * @brief AF 0 selection */ -#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ /** * @brief AF 1 selection */ -#define GPIO_AF1_TIM1 ((uint8_t)0x01U) /* TIM1 Alternate Function mapping */ -#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ /** * @brief AF 2 selection */ -#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ -#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ -#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ /** * @brief AF 3 selection */ -#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ -#define GPIO_AF3_TIM9 ((uint8_t)0x03U) /* TIM9 Alternate Function mapping */ -#define GPIO_AF3_TIM10 ((uint8_t)0x03U) /* TIM10 Alternate Function mapping */ -#define GPIO_AF3_TIM11 ((uint8_t)0x03U) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ /** * @brief AF 4 selection */ -#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ -#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ -#define GPIO_AF4_I2C3 ((uint8_t)0x04U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ /** * @brief AF 5 selection */ -#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ -#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ -#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ -#define GPIO_AF5_SPI5 ((uint8_t)0x05U) /* SPI5 Alternate Function mapping */ -#define GPIO_AF5_SPI6 ((uint8_t)0x05U) /* SPI6 Alternate Function mapping */ -#define GPIO_AF5_I2S3ext ((uint8_t)0x05U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 6 selection */ -#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ -#define GPIO_AF6_I2S2ext ((uint8_t)0x06U) /* I2S2ext_SD Alternate Function mapping */ -#define GPIO_AF6_SAI1 ((uint8_t)0x06U) /* SAI1 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ /** * @brief AF 7 selection */ -#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ -#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ -#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ -#define GPIO_AF7_I2S3ext ((uint8_t)0x07U) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ /** * @brief AF 8 selection */ -#define GPIO_AF8_UART4 ((uint8_t)0x08U) /* UART4 Alternate Function mapping */ -#define GPIO_AF8_UART5 ((uint8_t)0x08U) /* UART5 Alternate Function mapping */ -#define GPIO_AF8_USART6 ((uint8_t)0x08U) /* USART6 Alternate Function mapping */ -#define GPIO_AF8_UART7 ((uint8_t)0x08U) /* UART7 Alternate Function mapping */ -#define GPIO_AF8_UART8 ((uint8_t)0x08U) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ /** * @brief AF 9 selection */ -#define GPIO_AF9_CAN1 ((uint8_t)0x09U) /* CAN1 Alternate Function mapping */ -#define GPIO_AF9_CAN2 ((uint8_t)0x09U) /* CAN2 Alternate Function mapping */ -#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ -#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ -#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ -#define GPIO_AF9_LTDC ((uint8_t)0x09U) /* LCD-TFT Alternate Function mapping */ -#define GPIO_AF9_QSPI ((uint8_t)0x09U) /* QSPI Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ /** * @brief AF 10 selection */ -#define GPIO_AF10_OTG_FS ((uint8_t)0x0AU) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF10_OTG_HS ((uint8_t)0x0AU) /* OTG_HS Alternate Function mapping */ -#define GPIO_AF10_QSPI ((uint8_t)0x0AU) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ /** * @brief AF 11 selection */ -#define GPIO_AF11_ETH ((uint8_t)0x0BU) /* ETHERNET Alternate Function mapping */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ /** * @brief AF 12 selection */ -#define GPIO_AF12_FMC ((uint8_t)0x0CU) /* FMC Alternate Function mapping */ -#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0CU) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF12_SDIO ((uint8_t)0x0CU) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ /** * @brief AF 13 selection */ -#define GPIO_AF13_DCMI ((uint8_t)0x0DU) /* DCMI Alternate Function mapping */ -#define GPIO_AF13_DSI ((uint8_t)0x0DU) /* DSI Alternate Function mapping */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ /** * @brief AF 14 selection */ -#define GPIO_AF14_LTDC ((uint8_t)0x0EU) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ /** * @brief AF 15 selection */ -#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ #endif /* STM32F469xx || STM32F479xx */ /*----------------------------------------------------------------------------*/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash.h index 7941448..5c9f899 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_hash.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of HASH HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -157,7 +157,7 @@ typedef struct /** @defgroup HASH_Exported_Constants_Group1 HASH Algorithm Selection * @{ */ -#define HASH_ALGOSELECTION_SHA1 ((uint32_t)0x00000000U) /*!< HASH function is SHA1 */ +#define HASH_ALGOSELECTION_SHA1 0x00000000U /*!< HASH function is SHA1 */ #define HASH_ALGOSELECTION_SHA224 HASH_CR_ALGO_1 /*!< HASH function is SHA224 */ #define HASH_ALGOSELECTION_SHA256 HASH_CR_ALGO /*!< HASH function is SHA256 */ #define HASH_ALGOSELECTION_MD5 HASH_CR_ALGO_0 /*!< HASH function is MD5 */ @@ -168,8 +168,8 @@ typedef struct /** @defgroup HASH_Exported_Constants_Group2 HASH Algorithm Mode * @{ */ -#define HASH_ALGOMODE_HASH ((uint32_t)0x00000000U) /*!< Algorithm is HASH */ -#define HASH_ALGOMODE_HMAC HASH_CR_MODE /*!< Algorithm is HMAC */ +#define HASH_ALGOMODE_HASH 0x00000000U /*!< Algorithm is HASH */ +#define HASH_ALGOMODE_HMAC HASH_CR_MODE /*!< Algorithm is HMAC */ /** * @} */ @@ -177,10 +177,10 @@ typedef struct /** @defgroup HASH_Data_Type HASH Data Type * @{ */ -#define HASH_DATATYPE_32B ((uint32_t)0x00000000U) /*!< 32-bit data. No swapping */ -#define HASH_DATATYPE_16B HASH_CR_DATATYPE_0 /*!< 16-bit data. Each half word is swapped */ -#define HASH_DATATYPE_8B HASH_CR_DATATYPE_1 /*!< 8-bit data. All bytes are swapped */ -#define HASH_DATATYPE_1B HASH_CR_DATATYPE /*!< 1-bit data. In the word all bits are swapped */ +#define HASH_DATATYPE_32B 0x00000000U /*!< 32-bit data. No swapping */ +#define HASH_DATATYPE_16B HASH_CR_DATATYPE_0 /*!< 16-bit data. Each half word is swapped */ +#define HASH_DATATYPE_8B HASH_CR_DATATYPE_1 /*!< 8-bit data. All bytes are swapped */ +#define HASH_DATATYPE_1B HASH_CR_DATATYPE /*!< 1-bit data. In the word all bits are swapped */ /** * @} */ @@ -189,8 +189,8 @@ typedef struct * @brief HASH HMAC Long key used only for HMAC mode * @{ */ -#define HASH_HMAC_KEYTYPE_SHORTKEY ((uint32_t)0x00000000U) /*!< HMAC Key is <= 64 bytes */ -#define HASH_HMAC_KEYTYPE_LONGKEY HASH_CR_LKEY /*!< HMAC Key is > 64 bytes */ +#define HASH_HMAC_KEYTYPE_SHORTKEY 0x00000000U /*!< HMAC Key is <= 64 bytes */ +#define HASH_HMAC_KEYTYPE_LONGKEY HASH_CR_LKEY /*!< HMAC Key is > 64 bytes */ /** * @} */ @@ -198,11 +198,11 @@ typedef struct /** @defgroup HASH_Exported_Constants_Group5 HASH Flags definition * @{ */ -#define HASH_FLAG_DINIS HASH_SR_DINIS /*!< 16 locations are free in the DIN : A new block can be entered into the input buffer */ -#define HASH_FLAG_DCIS HASH_SR_DCIS /*!< Digest calculation complete */ -#define HASH_FLAG_DMAS HASH_SR_DMAS /*!< DMA interface is enabled (DMAE=1) or a transfer is ongoing */ -#define HASH_FLAG_BUSY HASH_SR_BUSY /*!< The hash core is Busy : processing a block of data */ -#define HASH_FLAG_DINNE HASH_CR_DINNE /*!< DIN not empty : The input buffer contains at least one word of data */ +#define HASH_FLAG_DINIS HASH_SR_DINIS /*!< 16 locations are free in the DIN : A new block can be entered into the input buffer */ +#define HASH_FLAG_DCIS HASH_SR_DCIS /*!< Digest calculation complete */ +#define HASH_FLAG_DMAS HASH_SR_DMAS /*!< DMA interface is enabled (DMAE=1) or a transfer is ongoing */ +#define HASH_FLAG_BUSY HASH_SR_BUSY /*!< The hash core is Busy : processing a block of data */ +#define HASH_FLAG_DINNE HASH_CR_DINNE /*!< DIN not empty : The input buffer contains at least one word of data */ /** * @} */ @@ -210,8 +210,8 @@ typedef struct /** @defgroup HASH_Exported_Constants_Group6 HASH Interrupts definition * @{ */ -#define HASH_IT_DINI HASH_IMR_DINIE /*!< A new block can be entered into the input buffer (DIN) */ -#define HASH_IT_DCI HASH_IMR_DCIE /*!< Digest calculation complete */ +#define HASH_IT_DINI HASH_IMR_DINIE /*!< A new block can be entered into the input buffer (DIN) */ +#define HASH_IT_DCI HASH_IMR_DCIE /*!< Digest calculation complete */ /** * @} */ @@ -417,7 +417,7 @@ void HAL_HASH_ErrorCallback(HASH_HandleTypeDef *hhash); #define IS_HASH_HMAC_KEYTYPE(__KEYTYPE__) (((__KEYTYPE__) == HASH_HMAC_KEYTYPE_SHORTKEY) || \ ((__KEYTYPE__) == HASH_HMAC_KEYTYPE_LONGKEY)) -#define IS_HASH_SHA1_BUFFER_SIZE(__SIZE__) ((((__SIZE__)%4) != 0U)? 0U: 1U) +#define IS_HASH_SHA1_BUFFER_SIZE(__SIZE__) ((((__SIZE__)%4U) != 0U)? 0U: 1U) /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash_ex.h index 98ca352..19b042c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hash_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_hash_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of HASH HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hcd.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hcd.h index 9cb3bed..4ee7f9d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hcd.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_hcd.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_hcd.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of HCD HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -91,7 +91,7 @@ typedef struct { HCD_TypeDef *Instance; /*!< Register base address */ HCD_InitTypeDef Init; /*!< HCD required parameters */ - HCD_HCTypeDef hc[15]; /*!< Host channels parameters */ + HCD_HCTypeDef hc[15U]; /*!< Host channels parameters */ HAL_LockTypeDef Lock; /*!< HCD peripheral status */ __IO HCD_StateTypeDef State; /*!< HCD communication state */ void *pData; /*!< Pointer Stack Handler */ @@ -185,7 +185,7 @@ void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd); * @{ */ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, - uint8_t pipe, + uint8_t ch_num, uint8_t direction, uint8_t ep_type, uint8_t token, diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h index 0cd22ce..d975f0b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_i2c.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of I2C HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -215,13 +215,13 @@ typedef struct * @brief I2C Error Code * @{ */ -#define HAL_I2C_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_I2C_ERROR_BERR ((uint32_t)0x00000001U) /*!< BERR error */ -#define HAL_I2C_ERROR_ARLO ((uint32_t)0x00000002U) /*!< ARLO error */ -#define HAL_I2C_ERROR_AF ((uint32_t)0x00000004U) /*!< AF error */ -#define HAL_I2C_ERROR_OVR ((uint32_t)0x00000008U) /*!< OVR error */ -#define HAL_I2C_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< Timeout Error */ +#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */ +#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */ +#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */ +#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */ +#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */ /** * @} */ @@ -229,7 +229,7 @@ typedef struct /** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode * @{ */ -#define I2C_DUTYCYCLE_2 ((uint32_t)0x00000000U) +#define I2C_DUTYCYCLE_2 0x00000000U #define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /** * @} @@ -238,8 +238,8 @@ typedef struct /** @defgroup I2C_addressing_mode I2C addressing mode * @{ */ -#define I2C_ADDRESSINGMODE_7BIT ((uint32_t)0x00004000U) -#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | ((uint32_t)0x00004000U)) +#define I2C_ADDRESSINGMODE_7BIT 0x00004000U +#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U) /** * @} */ @@ -247,7 +247,7 @@ typedef struct /** @defgroup I2C_dual_addressing_mode I2C dual addressing mode * @{ */ -#define I2C_DUALADDRESS_DISABLE ((uint32_t)0x00000000U) +#define I2C_DUALADDRESS_DISABLE 0x00000000U #define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL /** * @} @@ -256,7 +256,7 @@ typedef struct /** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode * @{ */ -#define I2C_GENERALCALL_DISABLE ((uint32_t)0x00000000U) +#define I2C_GENERALCALL_DISABLE 0x00000000U #define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC /** * @} @@ -265,7 +265,7 @@ typedef struct /** @defgroup I2C_nostretch_mode I2C nostretch mode * @{ */ -#define I2C_NOSTRETCH_DISABLE ((uint32_t)0x00000000U) +#define I2C_NOSTRETCH_DISABLE 0x00000000U #define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH /** * @} @@ -274,8 +274,8 @@ typedef struct /** @defgroup I2C_Memory_Address_Size I2C Memory Address Size * @{ */ -#define I2C_MEMADD_SIZE_8BIT ((uint32_t)0x00000001U) -#define I2C_MEMADD_SIZE_16BIT ((uint32_t)0x00000010U) +#define I2C_MEMADD_SIZE_8BIT 0x00000001U +#define I2C_MEMADD_SIZE_16BIT 0x00000010U /** * @} */ @@ -283,8 +283,8 @@ typedef struct /** @defgroup I2C_XferDirection_definition I2C XferDirection definition * @{ */ -#define I2C_DIRECTION_RECEIVE ((uint32_t)0x00000000U) -#define I2C_DIRECTION_TRANSMIT ((uint32_t)0x00000001U) +#define I2C_DIRECTION_RECEIVE 0x00000000U +#define I2C_DIRECTION_TRANSMIT 0x00000001U /** * @} */ @@ -292,10 +292,10 @@ typedef struct /** @defgroup I2C_XferOptions_definition I2C XferOptions definition * @{ */ -#define I2C_FIRST_FRAME ((uint32_t)0x00000001U) -#define I2C_NEXT_FRAME ((uint32_t)0x00000002U) -#define I2C_FIRST_AND_LAST_FRAME ((uint32_t)0x00000004U) -#define I2C_LAST_FRAME ((uint32_t)0x00000008U) +#define I2C_FIRST_FRAME 0x00000001U +#define I2C_NEXT_FRAME 0x00000002U +#define I2C_FIRST_AND_LAST_FRAME 0x00000004U +#define I2C_LAST_FRAME 0x00000008U /** * @} */ @@ -313,27 +313,27 @@ typedef struct /** @defgroup I2C_Flag_definition I2C Flag definition * @{ */ -#define I2C_FLAG_SMBALERT ((uint32_t)0x00018000U) -#define I2C_FLAG_TIMEOUT ((uint32_t)0x00014000U) -#define I2C_FLAG_PECERR ((uint32_t)0x00011000U) -#define I2C_FLAG_OVR ((uint32_t)0x00010800U) -#define I2C_FLAG_AF ((uint32_t)0x00010400U) -#define I2C_FLAG_ARLO ((uint32_t)0x00010200U) -#define I2C_FLAG_BERR ((uint32_t)0x00010100U) -#define I2C_FLAG_TXE ((uint32_t)0x00010080U) -#define I2C_FLAG_RXNE ((uint32_t)0x00010040U) -#define I2C_FLAG_STOPF ((uint32_t)0x00010010U) -#define I2C_FLAG_ADD10 ((uint32_t)0x00010008U) -#define I2C_FLAG_BTF ((uint32_t)0x00010004U) -#define I2C_FLAG_ADDR ((uint32_t)0x00010002U) -#define I2C_FLAG_SB ((uint32_t)0x00010001U) -#define I2C_FLAG_DUALF ((uint32_t)0x00100080U) -#define I2C_FLAG_SMBHOST ((uint32_t)0x00100040U) -#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00100020U) -#define I2C_FLAG_GENCALL ((uint32_t)0x00100010U) -#define I2C_FLAG_TRA ((uint32_t)0x00100004U) -#define I2C_FLAG_BUSY ((uint32_t)0x00100002U) -#define I2C_FLAG_MSL ((uint32_t)0x00100001U) +#define I2C_FLAG_SMBALERT 0x00018000U +#define I2C_FLAG_TIMEOUT 0x00014000U +#define I2C_FLAG_PECERR 0x00011000U +#define I2C_FLAG_OVR 0x00010800U +#define I2C_FLAG_AF 0x00010400U +#define I2C_FLAG_ARLO 0x00010200U +#define I2C_FLAG_BERR 0x00010100U +#define I2C_FLAG_TXE 0x00010080U +#define I2C_FLAG_RXNE 0x00010040U +#define I2C_FLAG_STOPF 0x00010010U +#define I2C_FLAG_ADD10 0x00010008U +#define I2C_FLAG_BTF 0x00010004U +#define I2C_FLAG_ADDR 0x00010002U +#define I2C_FLAG_SB 0x00010001U +#define I2C_FLAG_DUALF 0x00100080U +#define I2C_FLAG_SMBHOST 0x00100040U +#define I2C_FLAG_SMBDEFAULT 0x00100020U +#define I2C_FLAG_GENCALL 0x00100010U +#define I2C_FLAG_TRA 0x00100004U +#define I2C_FLAG_BUSY 0x00100002U +#define I2C_FLAG_MSL 0x00100001U /** * @} */ @@ -566,7 +566,7 @@ uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); /** @defgroup I2C_Private_Constants I2C Private Constants * @{ */ -#define I2C_FLAG_MASK ((uint32_t)0x0000FFFFU) +#define I2C_FLAG_MASK 0x0000FFFFU /** * @} */ @@ -587,12 +587,12 @@ uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); #define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (~I2C_OAR1_ADD0))) #define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) -#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU)))) -#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300U))) >> 7U) | (uint16_t)(0x00F0U)))) -#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300U))) >> 7U) | (uint16_t)(0x00F1U)))) +#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) +#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0))) +#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1)))) -#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U))) -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU)))) +#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) +#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) /** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters * @{ @@ -609,9 +609,9 @@ uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); ((STRETCH) == I2C_NOSTRETCH_ENABLE)) #define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ ((SIZE) == I2C_MEMADD_SIZE_16BIT)) -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0) && ((SPEED) <= 400000U)) -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & (uint32_t)(0xFFFFFC00U)) == 0U) -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & (uint32_t)(0xFFFFFF01U)) == 0U) +#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U)) +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U) +#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U) #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \ ((REQUEST) == I2C_NEXT_FRAME) || \ ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h index c0e6cd1..ec82362 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_i2c_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of I2C HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -66,7 +66,7 @@ /** @defgroup I2CEx_Analog_Filter I2C Analog Filter * @{ */ -#define I2C_ANALOGFILTER_ENABLE ((uint32_t)0x00000000U) +#define I2C_ANALOGFILTER_ENABLE 0x00000000U #define I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h index d1beb86..726ae5b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_i2s.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of I2S HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -33,7 +33,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** - */ + */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM32F4xx_HAL_I2S_H @@ -44,99 +44,107 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" +#include "stm32f4xx_hal_def.h" /** @addtogroup STM32F4xx_HAL_Driver * @{ */ -/** @addtogroup I2S +/** @addtogroup I2S I2S * @{ - */ + */ /* Exported types ------------------------------------------------------------*/ /** @defgroup I2S_Exported_Types I2S Exported Types * @{ */ - -/** - * @brief I2S Init structure definition + +/** + * @brief I2S Init structure definition */ typedef struct { - uint32_t Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_Mode */ + uint32_t Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ - uint32_t Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_Standard */ + uint32_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ - uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_Data_Format */ + uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_Data_Format */ - uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_MCLK_Output */ + uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ - uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_Audio_Frequency */ + uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ - uint32_t CPOL; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_Clock_Polarity */ + uint32_t CPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ - uint32_t ClockSource; /*!< Specifies the I2S Clock Source. - This parameter can be a value of @ref I2S_Clock_Source */ + uint32_t ClockSource; /*!< Specifies the I2S Clock Source. + This parameter can be a value of @ref I2S_Clock_Source */ uint32_t FullDuplexMode; /*!< Specifies the I2S FullDuplex mode. This parameter can be a value of @ref I2S_FullDuplex_Mode */ }I2S_InitTypeDef; -/** +/** * @brief HAL State structures definition - */ + */ typedef enum { HAL_I2S_STATE_RESET = 0x00U, /*!< I2S not yet initialized or disabled */ HAL_I2S_STATE_READY = 0x01U, /*!< I2S initialized and ready for use */ HAL_I2S_STATE_BUSY = 0x02U, /*!< I2S internal process is ongoing */ - HAL_I2S_STATE_BUSY_TX = 0x12U, /*!< Data Transmission process is ongoing */ - HAL_I2S_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ - HAL_I2S_STATE_BUSY_TX_RX = 0x32U, /*!< Data Transmission and Reception process is ongoing */ - HAL_I2S_STATE_TIMEOUT = 0x03U, /*!< I2S timeout state */ - HAL_I2S_STATE_ERROR = 0x04U /*!< I2S error state */ + HAL_I2S_STATE_BUSY_TX = 0x03U, /*!< Data Transmission process is ongoing */ + HAL_I2S_STATE_BUSY_RX = 0x04U, /*!< Data Reception process is ongoing */ + HAL_I2S_STATE_BUSY_TX_RX = 0x05U, /*!< Data Transmission and Reception process is ongoing */ + HAL_I2S_STATE_TIMEOUT = 0x06U, /*!< I2S timeout state */ + HAL_I2S_STATE_ERROR = 0x07U /*!< I2S error state */ }HAL_I2S_StateTypeDef; -/** - * @brief I2S handle Structure definition +/** + * @brief I2S handle Structure definition */ -typedef struct +typedef struct __I2S_HandleTypeDef { - SPI_TypeDef *Instance; /* I2S registers base address */ - - I2S_InitTypeDef Init; /* I2S communication parameters */ - - uint16_t *pTxBuffPtr; /* Pointer to I2S Tx transfer buffer */ - - __IO uint16_t TxXferSize; /* I2S Tx transfer size */ - - __IO uint16_t TxXferCount; /* I2S Tx transfer Counter */ - - uint16_t *pRxBuffPtr; /* Pointer to I2S Rx transfer buffer */ - - __IO uint16_t RxXferSize; /* I2S Rx transfer size */ - - __IO uint16_t RxXferCount; /* I2S Rx transfer counter */ - - DMA_HandleTypeDef *hdmatx; /* I2S Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /* I2S Rx DMA handle parameters */ - - __IO HAL_LockTypeDef Lock; /* I2S locking object */ - - __IO HAL_I2S_StateTypeDef State; /* I2S communication state */ - - __IO uint32_t ErrorCode; /* I2S Error code */ - + SPI_TypeDef *Instance; /*!< I2S registers base address */ + + I2S_InitTypeDef Init; /*!< I2S communication parameters */ + + uint16_t *pTxBuffPtr; /*!< Pointer to I2S Tx transfer buffer */ + + __IO uint16_t TxXferSize; /*!< I2S Tx transfer size */ + + __IO uint16_t TxXferCount; /*!< I2S Tx transfer Counter */ + + uint16_t *pRxBuffPtr; /*!< Pointer to I2S Rx transfer buffer */ + + __IO uint16_t RxXferSize; /*!< I2S Rx transfer size */ + + __IO uint16_t RxXferCount; /*!< I2S Rx transfer counter + (This field is initialized at the + same value as transfer size at the + beginning of the transfer and + decremented when a sample is received + NbSamplesReceived = RxBufferSize-RxBufferCount) */ + + void (*IrqHandlerISR) (struct __I2S_HandleTypeDef *hi2s); /*!< I2S function pointer on IrqHandler */ + + DMA_HandleTypeDef *hdmatx; /*!< I2S Tx DMA handle parameters */ + + DMA_HandleTypeDef *hdmarx; /*!< I2S Rx DMA handle parameters */ + + __IO HAL_LockTypeDef Lock; /*!< I2S locking object */ + + __IO HAL_I2S_StateTypeDef State; /*!< I2S communication state */ + + __IO uint32_t ErrorCode; /*!< I2S Error code + This parameter can be a value of @ref I2S_ErrorCode */ + }I2S_HandleTypeDef; /** * @} @@ -146,52 +154,50 @@ typedef struct /** @defgroup I2S_Exported_Constants I2S Exported Constants * @{ */ - -/** @defgroup I2S_Error_Code I2S Error Code - * @brief I2S Error Code +/** + * @defgroup I2S_ErrorCode I2S Error Code * @{ - */ -#define HAL_I2S_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_I2S_ERROR_UDR ((uint32_t)0x00000001U) /*!< I2S Underrun error */ -#define HAL_I2S_ERROR_OVR ((uint32_t)0x00000002U) /*!< I2S Overrun error */ -#define HAL_I2SEX_ERROR_UDR ((uint32_t)0x00000004U) /*!< I2S extended Underrun error */ -#define HAL_I2SEX_ERROR_OVR ((uint32_t)0x00000008U) /*!< I2S extended Overrun error */ -#define HAL_I2S_ERROR_FRE ((uint32_t)0x00000010U) /*!< I2S Frame format error */ -#define HAL_I2S_ERROR_DMA ((uint32_t)0x00000020U) /*!< DMA transfer error */ + */ +#define HAL_I2S_ERROR_NONE (0x00000000U) /*!< No error */ +#define HAL_I2S_ERROR_TIMEOUT (0x00000001U) /*!< Timeout error */ +#define HAL_I2S_ERROR_OVR (0x00000002U) /*!< OVR error */ +#define HAL_I2S_ERROR_UDR (0x00000004U) /*!< UDR error */ +#define HAL_I2S_ERROR_DMA (0x00000008U) /*!< DMA transfer error */ +#define HAL_I2S_ERROR_PRESCALER (0x00000010U) /*!< Prescaler Calculation error */ /** * @} */ -/** @defgroup I2S_Mode I2S Mode +/** @defgroup I2S_Mode I2S Mode * @{ */ -#define I2S_MODE_SLAVE_TX ((uint32_t)0x00000000U) -#define I2S_MODE_SLAVE_RX ((uint32_t)0x00000100U) -#define I2S_MODE_MASTER_TX ((uint32_t)0x00000200U) -#define I2S_MODE_MASTER_RX ((uint32_t)0x00000300U) +#define I2S_MODE_SLAVE_TX (0x00000000U) +#define I2S_MODE_SLAVE_RX (0x00000100U) +#define I2S_MODE_MASTER_TX (0x00000200U) +#define I2S_MODE_MASTER_RX (0x00000300U) /** * @} */ - + /** @defgroup I2S_Standard I2S Standard * @{ */ -#define I2S_STANDARD_PHILIPS ((uint32_t)0x00000000U) -#define I2S_STANDARD_MSB ((uint32_t)0x00000010U) -#define I2S_STANDARD_LSB ((uint32_t)0x00000020U) -#define I2S_STANDARD_PCM_SHORT ((uint32_t)0x00000030U) -#define I2S_STANDARD_PCM_LONG ((uint32_t)0x000000B0U) +#define I2S_STANDARD_PHILIPS (0x00000000U) +#define I2S_STANDARD_MSB (0x00000010U) +#define I2S_STANDARD_LSB (0x00000020U) +#define I2S_STANDARD_PCM_SHORT (0x00000030U) +#define I2S_STANDARD_PCM_LONG (0x000000B0U) /** * @} */ - + /** @defgroup I2S_Data_Format I2S Data Format * @{ */ -#define I2S_DATAFORMAT_16B ((uint32_t)0x00000000U) -#define I2S_DATAFORMAT_16B_EXTENDED ((uint32_t)0x00000001U) -#define I2S_DATAFORMAT_24B ((uint32_t)0x00000003U) -#define I2S_DATAFORMAT_32B ((uint32_t)0x00000005U) +#define I2S_DATAFORMAT_16B (0x00000000U) +#define I2S_DATAFORMAT_16B_EXTENDED (0x00000001U) +#define I2S_DATAFORMAT_24B (0x00000003U) +#define I2S_DATAFORMAT_32B (0x00000005U) /** * @} */ @@ -199,25 +205,25 @@ typedef struct /** @defgroup I2S_MCLK_Output I2S Mclk Output * @{ */ -#define I2S_MCLKOUTPUT_ENABLE ((uint32_t)SPI_I2SPR_MCKOE) -#define I2S_MCLKOUTPUT_DISABLE ((uint32_t)0x00000000U) +#define I2S_MCLKOUTPUT_ENABLE SPI_I2SPR_MCKOE +#define I2S_MCLKOUTPUT_DISABLE (0x00000000U) /** * @} */ -/** @defgroup I2S_Audio_Frequency I2S Audio Frequency +/** @defgroup I2S_Audio_Frequency I2S Audio Frequency * @{ */ -#define I2S_AUDIOFREQ_192K ((uint32_t)192000U) -#define I2S_AUDIOFREQ_96K ((uint32_t)96000U) -#define I2S_AUDIOFREQ_48K ((uint32_t)48000U) -#define I2S_AUDIOFREQ_44K ((uint32_t)44100U) -#define I2S_AUDIOFREQ_32K ((uint32_t)32000U) -#define I2S_AUDIOFREQ_22K ((uint32_t)22050U) -#define I2S_AUDIOFREQ_16K ((uint32_t)16000U) -#define I2S_AUDIOFREQ_11K ((uint32_t)11025U) -#define I2S_AUDIOFREQ_8K ((uint32_t)8000U) -#define I2S_AUDIOFREQ_DEFAULT ((uint32_t)2U) +#define I2S_AUDIOFREQ_192K (192000U) +#define I2S_AUDIOFREQ_96K (96000U) +#define I2S_AUDIOFREQ_48K (48000U) +#define I2S_AUDIOFREQ_44K (44100U) +#define I2S_AUDIOFREQ_32K (32000U) +#define I2S_AUDIOFREQ_22K (22050U) +#define I2S_AUDIOFREQ_16K (16000U) +#define I2S_AUDIOFREQ_11K (11025U) +#define I2S_AUDIOFREQ_8K (8000U) +#define I2S_AUDIOFREQ_DEFAULT (2U) /** * @} */ @@ -225,8 +231,8 @@ typedef struct /** @defgroup I2S_FullDuplex_Mode I2S FullDuplex Mode * @{ */ -#define I2S_FULLDUPLEXMODE_DISABLE ((uint32_t)0x00000000U) -#define I2S_FULLDUPLEXMODE_ENABLE ((uint32_t)0x00000001U) +#define I2S_FULLDUPLEXMODE_DISABLE (0x00000000U) +#define I2S_FULLDUPLEXMODE_ENABLE (0x00000001U) /** * @} */ @@ -234,8 +240,8 @@ typedef struct /** @defgroup I2S_Clock_Polarity I2S Clock Polarity * @{ */ -#define I2S_CPOL_LOW ((uint32_t)0x00000000U) -#define I2S_CPOL_HIGH ((uint32_t)SPI_I2SCFGR_CKPOL) +#define I2S_CPOL_LOW (0x00000000U) +#define I2S_CPOL_HIGH (SPI_I2SCFGR_CKPOL) /** * @} */ @@ -262,13 +268,41 @@ typedef struct #define I2S_FLAG_CHSIDE SPI_SR_CHSIDE #define I2S_FLAG_BSY SPI_SR_BSY +/** + * @} + */ +/** @defgroup I2S_Clock_Source I2S Clock Source Definition + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +#define I2S_CLOCK_PLL (0x00000000U) +#define I2S_CLOCK_EXTERNAL (0x00000001U) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define I2S_CLOCK_PLL (0x00000000U) +#define I2S_CLOCK_EXTERNAL (0x00000001U) +#define I2S_CLOCK_PLLR (0x00000002U) +#define I2S_CLOCK_PLLSRC (0x00000003U) +#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define I2S_CLOCK_PLLSRC (0x00000000U) +#define I2S_CLOCK_EXTERNAL (0x00000001U) +#define I2S_CLOCK_PLLR (0x00000002U) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ /** * @} */ /** * @} - */ + */ /* Exported macro ------------------------------------------------------------*/ /** @defgroup I2S_Exported_Macros I2S Exported Macros @@ -282,11 +316,11 @@ typedef struct #define __HAL_I2S_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2S_STATE_RESET) /** @brief Enable or disable the specified SPI peripheral (in I2S mode). - * @param __HANDLE__: specifies the I2S Handle. + * @param __HANDLE__: specifies the I2S Handle. * @retval None */ #define __HAL_I2S_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->I2SCFGR |= SPI_I2SCFGR_I2SE) -#define __HAL_I2S_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->I2SCFGR &= ~SPI_I2SCFGR_I2SE) +#define __HAL_I2S_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->I2SCFGR &=(uint16_t)(~SPI_I2SCFGR_I2SE)) /** @brief Enable or disable the specified I2S interrupts. * @param __HANDLE__: specifies the I2S Handle. @@ -296,10 +330,10 @@ typedef struct * @arg I2S_IT_RXNE: RX buffer not empty interrupt enable * @arg I2S_IT_ERR: Error interrupt enable * @retval None - */ + */ #define __HAL_I2S_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 |= (__INTERRUPT__)) -#define __HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 &= ~(__INTERRUPT__)) - +#define __HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 &=(uint16_t)(~(__INTERRUPT__))) + /** @brief Checks if the specified I2S interrupt source is enabled or disabled. * @param __HANDLE__: specifies the I2S Handle. * This parameter can be I2S where x: 1, 2, or 3 to select the I2S peripheral. @@ -338,7 +372,7 @@ typedef struct tmpreg = (__HANDLE__)->Instance->SR; \ UNUSED(tmpreg); \ } while(0) - + /** @brief Clears the I2S UDR pending flag. * @param __HANDLE__: specifies the I2S Handle. * @retval None @@ -352,16 +386,16 @@ typedef struct /** * @} */ - + /* Include I2S Extension module */ #include "stm32f4xx_hal_i2s_ex.h" /* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2S_Exported_Functions +/** @defgroup I2S_Exported_Functions I2S Exported Functions * @{ */ -/** @addtogroup I2S_Exported_Functions_Group1 +/** @defgroup I2S_Exported_Functions_Group1 I2S Initialization and de-initialization functions * @{ */ /* Initialization/de-initialization functions **********************************/ @@ -373,7 +407,7 @@ void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s); * @} */ -/** @addtogroup I2S_Exported_Functions_Group2 +/** @defgroup I2S_Exported_Functions_Group2 I2S IO operation functions * @{ */ /* I/O operation functions *****************************************************/ @@ -394,10 +428,6 @@ HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s); HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s); HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s); -/* Peripheral Control and State functions **************************************/ -HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s); -uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s); - /* Callbacks used in non blocking modes (Interrupt and DMA) *******************/ void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s); void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s); @@ -406,7 +436,17 @@ void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s); void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s); /** * @} - */ + */ + +/** @defgroup I2S_Exported_Functions_Group3 I2S Peripheral Control and State functions + * @{ + */ +/* Peripheral Control and State functions ************************************/ +HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s); +uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s); +/** + * @} + */ /** * @} @@ -431,7 +471,7 @@ void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s); ((MODE) == I2S_MODE_SLAVE_RX) || \ ((MODE) == I2S_MODE_MASTER_TX) || \ ((MODE) == I2S_MODE_MASTER_RX)) - + #define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_STANDARD_PHILIPS) || \ ((STANDARD) == I2S_STANDARD_MSB) || \ ((STANDARD) == I2S_STANDARD_LSB) || \ @@ -445,7 +485,7 @@ void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s); #define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOUTPUT_ENABLE) || \ ((OUTPUT) == I2S_MCLKOUTPUT_DISABLE)) - + #define IS_I2S_AUDIO_FREQ(FREQ) ((((FREQ) >= I2S_AUDIOFREQ_8K) && \ ((FREQ) <= I2S_AUDIOFREQ_192K)) || \ ((FREQ) == I2S_AUDIOFREQ_DEFAULT)) @@ -455,34 +495,43 @@ void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s); #define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_LOW) || \ ((CPOL) == I2S_CPOL_HIGH)) - + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ + ((CLOCK) == I2S_CLOCK_PLL)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ + +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined (STM32F413xx) ||\ + defined(STM32F423xx) +#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ + ((CLOCK) == I2S_CLOCK_PLL) ||\ + ((CLOCK) == I2S_CLOCK_PLLSRC) ||\ + ((CLOCK) == I2S_CLOCK_PLLR)) +#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ + ((CLOCK) == I2S_CLOCK_PLLSRC) ||\ + ((CLOCK) == I2S_CLOCK_PLLR)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + /** * @} */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup I2S_Private_Functions I2S Private Functions - * @{ - */ -void I2S_DMATxCplt(DMA_HandleTypeDef *hdma); -void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -void I2S_DMARxCplt(DMA_HandleTypeDef *hdma); -void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -void I2S_DMAError(DMA_HandleTypeDef *hdma); -HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t Status, uint32_t Timeout); -HAL_StatusTypeDef I2S_Transmit_IT(I2S_HandleTypeDef *hi2s); -HAL_StatusTypeDef I2S_Receive_IT(I2S_HandleTypeDef *hi2s); /** * @} */ /** * @} - */ - -/** - * @} - */ + */ #ifdef __cplusplus } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h index 4382bd9..ef9a3d4 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_i2s_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of I2S HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -33,7 +33,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** - */ + */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM32F4xx_HAL_I2S_EX_H @@ -44,91 +44,119 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hal_def.h" +#include "stm32f4xx_hal_def.h" /** @addtogroup STM32F4xx_HAL_Driver * @{ */ - -/** @addtogroup I2SEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2SEx_Exported_Types I2S Exported Types +#if defined(SPI_I2S_FULLDUPLEX_SUPPORT) +/** @addtogroup I2SEx I2SEx * @{ - */ -/** - * @} */ +/* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ -/** @defgroup I2SEx_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_Clock_Source I2S Clock Source +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup I2SEx_Exported_Macros I2S Extended Exported Macros * @{ */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -#define I2S_CLOCK_PLL ((uint32_t)0x00000000U) -#define I2S_CLOCK_EXTERNAL ((uint32_t)0x00000001U) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ - defined(STM32F413xx) || defined(STM32F423xx) -#define I2S_CLOCK_PLL ((uint32_t)0x00000000U) -#define I2S_CLOCK_EXTERNAL ((uint32_t)0x00000001U) -#define I2S_CLOCK_PLLR ((uint32_t)0x00000002U) -#define I2S_CLOCK_PLLSRC ((uint32_t)0x00000003U) -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define I2S_CLOCK_PLLSRC ((uint32_t)0x00000000U) -#define I2S_CLOCK_EXTERNAL ((uint32_t)0x00000001U) -#define I2S_CLOCK_PLLR ((uint32_t)0x00000002U) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -/** - * @} - */ +#define I2SxEXT(__INSTANCE__) ((__INSTANCE__) == (SPI2)? (SPI_TypeDef *)(I2S2ext_BASE): (SPI_TypeDef *)(I2S3ext_BASE)) +/** @brief Enable or disable the specified I2SExt peripheral. + * @param __HANDLE__: specifies the I2S Handle. + * @retval None + */ +#define __HAL_I2SEXT_ENABLE(__HANDLE__) (I2SxEXT((__HANDLE__)->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE) +#define __HAL_I2SEXT_DISABLE(__HANDLE__) (I2SxEXT((__HANDLE__)->Instance)->I2SCFGR &= ~SPI_I2SCFGR_I2SE) + +/** @brief Enable or disable the specified I2SExt interrupts. + * @param __HANDLE__: specifies the I2S Handle. + * @param __INTERRUPT__: specifies the interrupt source to enable or disable. + * This parameter can be one of the following values: + * @arg I2S_IT_TXE: Tx buffer empty interrupt enable + * @arg I2S_IT_RXNE: RX buffer not empty interrupt enable + * @arg I2S_IT_ERR: Error interrupt enable + * @retval None + */ +#define __HAL_I2SEXT_ENABLE_IT(__HANDLE__, __INTERRUPT__) (I2SxEXT((__HANDLE__)->Instance)->CR2 |= (__INTERRUPT__)) +#define __HAL_I2SEXT_DISABLE_IT(__HANDLE__, __INTERRUPT__) (I2SxEXT((__HANDLE__)->Instance)->CR2 &= ~(__INTERRUPT__)) + +/** @brief Checks if the specified I2SExt interrupt source is enabled or disabled. + * @param __HANDLE__: specifies the I2S Handle. + * This parameter can be I2S where x: 1, 2, or 3 to select the I2S peripheral. + * @param __INTERRUPT__: specifies the I2S interrupt source to check. + * This parameter can be one of the following values: + * @arg I2S_IT_TXE: Tx buffer empty interrupt enable + * @arg I2S_IT_RXNE: RX buffer not empty interrupt enable + * @arg I2S_IT_ERR: Error interrupt enable + * @retval The new state of __IT__ (TRUE or FALSE). + */ +#define __HAL_I2SEXT_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((I2SxEXT((__HANDLE__)->Instance)->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Checks whether the specified I2SExt flag is set or not. + * @param __HANDLE__: specifies the I2S Handle. + * @param __FLAG__: specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2S_FLAG_RXNE: Receive buffer not empty flag + * @arg I2S_FLAG_TXE: Transmit buffer empty flag + * @arg I2S_FLAG_UDR: Underrun flag + * @arg I2S_FLAG_OVR: Overrun flag + * @arg I2S_FLAG_FRE: Frame error flag + * @arg I2S_FLAG_CHSIDE: Channel Side flag + * @arg I2S_FLAG_BSY: Busy flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_I2SEXT_GET_FLAG(__HANDLE__, __FLAG__) (((I2SxEXT((__HANDLE__)->Instance)->SR) & (__FLAG__)) == (__FLAG__)) + +/** @brief Clears the I2SExt OVR pending flag. + * @param __HANDLE__: specifies the I2S Handle. + * @retval None + */ +#define __HAL_I2SEXT_CLEAR_OVRFLAG(__HANDLE__) do{ \ + __IO uint32_t tmpreg_ovr = 0x00U; \ + tmpreg_ovr = I2SxEXT((__HANDLE__)->Instance)->DR;\ + tmpreg_ovr = I2SxEXT((__HANDLE__)->Instance)->SR;\ + UNUSED(tmpreg_ovr); \ + }while(0U) +/** @brief Clears the I2SExt UDR pending flag. + * @param __HANDLE__: specifies the I2S Handle. + * @retval None + */ +#define __HAL_I2SEXT_CLEAR_UDRFLAG(__HANDLE__) do{ \ + __IO uint32_t tmpreg_udr = 0x00U; \ + tmpreg_udr = I2SxEXT((__HANDLE__)->Instance)->SR;\ + UNUSED(tmpreg_udr); \ + }while(0U) /** * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2SEx_Exported_Macros I2S Exported Macros - * @{ */ -/** - * @} - */ - /* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2SEx_Exported_Functions +/** @addtogroup I2SEx_Exported_Functions I2S Extended Exported Functions * @{ */ -/** @addtogroup I2SEx_Exported_Functions_Group1 +/** @addtogroup I2SEx_Exported_Functions_Group1 I2S Extended IO operation functions * @{ */ -/* Extended features functions **************************************************/ +/* Extended features functions *************************************************/ /* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size, uint32_t Timeout); /* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size); +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size); +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size); +/* I2S IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ +void HAL_I2SEx_FullDuplex_IRQHandler(I2S_HandleTypeDef *hi2s); +void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s); /** * @} - */ + */ /** * @} @@ -136,70 +164,19 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_ /* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @defgroup I2SEx_Private_Constants I2S Private Constants - * @{ - */ -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ -/** @defgroup I2SEx_Private_Macros I2S Private Macros - * @{ - */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ - defined(STM32F479xx) -#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ - ((CLOCK) == I2S_CLOCK_PLL)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ - -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined (STM32F413xx) ||\ - defined(STM32F423xx) -#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ - ((CLOCK) == I2S_CLOCK_PLL) ||\ - ((CLOCK) == I2S_CLOCK_PLLSRC) ||\ - ((CLOCK) == I2S_CLOCK_PLLR)) -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\ - ((CLOCK) == I2S_CLOCK_PLLSRC) ||\ - ((CLOCK) == I2S_CLOCK_PLLR)) -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Cx) || defined(STM32F410Rx) || \ - defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || \ - defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || \ - defined(STM32F413xx) || defined(STM32F423xx) -#define I2SxEXT(__INSTANCE__) ((__INSTANCE__) == (SPI2)? (SPI_TypeDef *)(I2S2ext_BASE): (SPI_TypeDef *)(I2S3ext_BASE)) -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F410Cx || STM32F410Rx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || - STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ /** * @} */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup I2SEx_Private_Functions I2S Private Functions - * @{ - */ -HAL_StatusTypeDef I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s); -uint32_t I2S_GetInputClock(I2S_HandleTypeDef *hi2s); -/** - * @} - */ /** * @} - */ + */ +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_irda.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_irda.h index 1295702..5da1611 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_irda.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_irda.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_irda.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of IRDA HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -196,12 +196,12 @@ typedef struct * @brief IRDA Error Code * @{ */ -#define HAL_IRDA_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_IRDA_ERROR_PE ((uint32_t)0x00000001U) /*!< Parity error */ -#define HAL_IRDA_ERROR_NE ((uint32_t)0x00000002U) /*!< Noise error */ -#define HAL_IRDA_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ -#define HAL_IRDA_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ -#define HAL_IRDA_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_IRDA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_IRDA_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_IRDA_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_IRDA_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_IRDA_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_IRDA_ERROR_DMA 0x00000010U /*!< DMA transfer error */ /** * @} */ @@ -209,7 +209,7 @@ typedef struct /** @defgroup IRDA_Word_Length IRDA Word Length * @{ */ -#define IRDA_WORDLENGTH_8B ((uint32_t)0x00000000U) +#define IRDA_WORDLENGTH_8B 0x00000000U #define IRDA_WORDLENGTH_9B ((uint32_t)USART_CR1_M) /** * @} @@ -218,7 +218,7 @@ typedef struct /** @defgroup IRDA_Parity IRDA Parity * @{ */ -#define IRDA_PARITY_NONE ((uint32_t)0x00000000U) +#define IRDA_PARITY_NONE 0x00000000U #define IRDA_PARITY_EVEN ((uint32_t)USART_CR1_PCE) #define IRDA_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) /** @@ -239,7 +239,7 @@ typedef struct * @{ */ #define IRDA_POWERMODE_LOWPOWER ((uint32_t)USART_CR3_IRLP) -#define IRDA_POWERMODE_NORMAL ((uint32_t)0x00000000U) +#define IRDA_POWERMODE_NORMAL 0x00000000U /** * @} */ @@ -249,14 +249,14 @@ typedef struct * - 0xXXXX : Flag mask in the SR register * @{ */ -#define IRDA_FLAG_TXE ((uint32_t)0x00000080U) -#define IRDA_FLAG_TC ((uint32_t)0x00000040U) -#define IRDA_FLAG_RXNE ((uint32_t)0x00000020U) -#define IRDA_FLAG_IDLE ((uint32_t)0x00000010U) -#define IRDA_FLAG_ORE ((uint32_t)0x00000008U) -#define IRDA_FLAG_NE ((uint32_t)0x00000004U) -#define IRDA_FLAG_FE ((uint32_t)0x00000002U) -#define IRDA_FLAG_PE ((uint32_t)0x00000001U) +#define IRDA_FLAG_TXE 0x00000080U +#define IRDA_FLAG_TC 0x00000040U +#define IRDA_FLAG_RXNE 0x00000020U +#define IRDA_FLAG_IDLE 0x00000010U +#define IRDA_FLAG_ORE 0x00000008U +#define IRDA_FLAG_NE 0x00000004U +#define IRDA_FLAG_FE 0x00000002U +#define IRDA_FLAG_PE 0x00000001U /** * @} */ @@ -302,7 +302,7 @@ typedef struct #define __HAL_IRDA_RESET_HANDLE_STATE(__HANDLE__) do{ \ (__HANDLE__)->gState = HAL_IRDA_STATE_RESET; \ (__HANDLE__)->RxState = HAL_IRDA_STATE_RESET; \ - } while(0) + } while(0U) /** @brief Flushs the IRDA DR register * @param __HANDLE__: specifies the USART Handle. @@ -362,7 +362,7 @@ typedef struct __IO uint32_t tmpreg = 0x00U; \ tmpreg = (__HANDLE__)->Instance->SR; \ UNUSED(tmpreg); \ - } while(0) + } while(0U) /** @brief Clear the IRDA FE pending flag. * @param __HANDLE__: specifies the USART Handle. @@ -560,7 +560,7 @@ uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda); #define IS_IRDA_PARITY(PARITY) (((PARITY) == IRDA_PARITY_NONE) || \ ((PARITY) == IRDA_PARITY_EVEN) || \ ((PARITY) == IRDA_PARITY_ODD)) -#define IS_IRDA_MODE(MODE) ((((MODE) & (uint32_t)0x0000FFF3U) == 0x00U) && ((MODE) != (uint32_t)0x00000000U)) +#define IS_IRDA_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00000000U)) #define IS_IRDA_POWERMODE(MODE) (((MODE) == IRDA_POWERMODE_LOWPOWER) || \ ((MODE) == IRDA_POWERMODE_NORMAL)) #define IS_IRDA_BAUDRATE(BAUDRATE) ((BAUDRATE) < 115201U) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h index 9b910ba..44173b0 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_iwdg.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of IWDG HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -110,10 +110,6 @@ typedef struct * @} */ -/** - * @} - */ - /* Exported macros -----------------------------------------------------------*/ /** @defgroup IWDG_Exported_Macros IWDG Exported Macros * @{ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_lptim.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_lptim.h index d0cdcde..0d5d2fa 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_lptim.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_lptim.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_lptim.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of LPTIM HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -182,7 +182,7 @@ typedef struct /** @defgroup LPTIM_Clock_Source LPTIM Clock Source * @{ */ -#define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC ((uint32_t)0x00U) +#define LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC 0x00U #define LPTIM_CLOCKSOURCE_ULPTIM LPTIM_CFGR_CKSEL /** * @} @@ -191,7 +191,7 @@ typedef struct /** @defgroup LPTIM_Clock_Prescaler LPTIM Clock Prescaler * @{ */ -#define LPTIM_PRESCALER_DIV1 ((uint32_t)0x00000000U) +#define LPTIM_PRESCALER_DIV1 0x00000000U #define LPTIM_PRESCALER_DIV2 LPTIM_CFGR_PRESC_0 #define LPTIM_PRESCALER_DIV4 LPTIM_CFGR_PRESC_1 #define LPTIM_PRESCALER_DIV8 ((uint32_t)(LPTIM_CFGR_PRESC_0 | LPTIM_CFGR_PRESC_1)) @@ -207,7 +207,7 @@ typedef struct * @{ */ -#define LPTIM_OUTPUTPOLARITY_HIGH ((uint32_t)0x00000000U) +#define LPTIM_OUTPUTPOLARITY_HIGH 0x00000000U #define LPTIM_OUTPUTPOLARITY_LOW (LPTIM_CFGR_WAVPOL) /** * @} @@ -216,7 +216,7 @@ typedef struct /** @defgroup LPTIM_Clock_Sample_Time LPTIM Clock Sample Time * @{ */ -#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION ((uint32_t)0x00000000U) +#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION 0x00000000U #define LPTIM_CLOCKSAMPLETIME_2TRANSITIONS LPTIM_CFGR_CKFLT_0 #define LPTIM_CLOCKSAMPLETIME_4TRANSITIONS LPTIM_CFGR_CKFLT_1 #define LPTIM_CLOCKSAMPLETIME_8TRANSITIONS LPTIM_CFGR_CKFLT @@ -228,7 +228,7 @@ typedef struct * @{ */ -#define LPTIM_CLOCKPOLARITY_RISING ((uint32_t)0x00000000U) +#define LPTIM_CLOCKPOLARITY_RISING 0x00000000U #define LPTIM_CLOCKPOLARITY_FALLING LPTIM_CFGR_CKPOL_0 #define LPTIM_CLOCKPOLARITY_RISING_FALLING LPTIM_CFGR_CKPOL_1 /** @@ -238,8 +238,8 @@ typedef struct /** @defgroup LPTIM_Trigger_Source LPTIM Trigger Source * @{ */ -#define LPTIM_TRIGSOURCE_SOFTWARE ((uint32_t)0x0000FFFFU) -#define LPTIM_TRIGSOURCE_0 ((uint32_t)0x00000000U) +#define LPTIM_TRIGSOURCE_SOFTWARE 0x0000FFFFU +#define LPTIM_TRIGSOURCE_0 0x00000000U #define LPTIM_TRIGSOURCE_1 ((uint32_t)LPTIM_CFGR_TRIGSEL_0) #define LPTIM_TRIGSOURCE_2 LPTIM_CFGR_TRIGSEL_1 #define LPTIM_TRIGSOURCE_3 ((uint32_t)LPTIM_CFGR_TRIGSEL_0 | LPTIM_CFGR_TRIGSEL_1) @@ -262,7 +262,7 @@ typedef struct /** @defgroup LPTIM_Trigger_Sample_Time LPTIM Trigger Sample Time * @{ */ -#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION ((uint32_t)0x00000000U) +#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION 0x00000000U #define LPTIM_TRIGSAMPLETIME_2TRANSITIONS LPTIM_CFGR_TRGFLT_0 #define LPTIM_TRIGSAMPLETIME_4TRANSITIONS LPTIM_CFGR_TRGFLT_1 #define LPTIM_TRIGSAMPLETIME_8TRANSITIONS LPTIM_CFGR_TRGFLT @@ -274,7 +274,7 @@ typedef struct * @{ */ -#define LPTIM_UPDATE_IMMEDIATE ((uint32_t)0x00000000U) +#define LPTIM_UPDATE_IMMEDIATE 0x00000000U #define LPTIM_UPDATE_ENDOFPERIOD LPTIM_CFGR_PRELOAD /** * @} @@ -284,7 +284,7 @@ typedef struct * @{ */ -#define LPTIM_COUNTERSOURCE_INTERNAL ((uint32_t)0x00000000U) +#define LPTIM_COUNTERSOURCE_INTERNAL 0x00000000U #define LPTIM_COUNTERSOURCE_EXTERNAL LPTIM_CFGR_COUNTMODE /** * @} @@ -323,7 +323,7 @@ typedef struct /** @defgroup LPTIM_Option Register Definition * @{ */ -#define LPTIM_OP_PAD_AF ((uint32_t)0x00000000U) +#define LPTIM_OP_PAD_AF 0x00000000U #define LPTIM_OP_PAD_PA4 LPTIM_OR_LPT_IN1_RMP_0 #define LPTIM_OP_PAD_PB9 LPTIM_OR_LPT_IN1_RMP_1 #define LPTIM_OP_TIM_DAC LPTIM_OR_LPT_IN1_RMP @@ -526,7 +526,7 @@ typedef struct */ #define __HAL_LPTIM_WAKEUPTIMER_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_LPTIM_WAKEUPTIMER_EXTI_ENABLE_RISING_EDGE();\ __HAL_LPTIM_WAKEUPTIMER_EXTI_ENABLE_FALLING_EDGE();\ - }while(0) + }while(0U) /** * @brief Disable rising & falling edge trigger on the LPTIM Wake-up Timer associated Exti line. @@ -535,7 +535,7 @@ typedef struct */ #define __HAL_LPTIM_WAKEUPTIMER_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_LPTIM_WAKEUPTIMER_EXTI_DISABLE_RISING_EDGE();\ __HAL_LPTIM_WAKEUPTIMER_EXTI_DISABLE_FALLING_EDGE();\ - }while(0) + }while(0U) /** * @brief Check whether the LPTIM Wake-up Timer associated Exti line interrupt flag is set or not. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h index d1dc7fa..2e3e77c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_ltdc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of LTDC HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -60,7 +60,7 @@ /** @defgroup LTDC_Exported_Types LTDC Exported Types * @{ */ -#define MAX_LAYER 2 +#define MAX_LAYER 2U /** * @brief LTDC color structure definition @@ -158,7 +158,7 @@ typedef struct uint32_t FBStartAdress; /*!< Configures the color frame buffer address */ uint32_t ImageWidth; /*!< Configures the color frame buffer line length. - This parameter must be a number between Min_Data = 0x0000U and Max_Data = 0x1FFF. */ + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x1FFF. */ uint32_t ImageHeight; /*!< Specifies the number of line in frame buffer. This parameter must be a number between Min_Data = 0x000 and Max_Data = 0x7FF. */ @@ -208,10 +208,19 @@ typedef struct /** @defgroup LTDC_Error_Code LTDC Error Code * @{ */ -#define HAL_LTDC_ERROR_NONE ((uint32_t)0x00000000U) /*!< LTDC No error */ -#define HAL_LTDC_ERROR_TE ((uint32_t)0x00000001U) /*!< LTDC Transfer error */ -#define HAL_LTDC_ERROR_FU ((uint32_t)0x00000002U) /*!< LTDC FIFO Underrun */ -#define HAL_LTDC_ERROR_TIMEOUT ((uint32_t)0x00000020U) /*!< LTDC Timeout error */ +#define HAL_LTDC_ERROR_NONE 0x00000000U /*!< LTDC No error */ +#define HAL_LTDC_ERROR_TE 0x00000001U /*!< LTDC Transfer error */ +#define HAL_LTDC_ERROR_FU 0x00000002U /*!< LTDC FIFO Underrun */ +#define HAL_LTDC_ERROR_TIMEOUT 0x00000020U /*!< LTDC Timeout error */ +/** + * @} + */ + +/** @defgroup LTDC_Layer LTDC Layer + * @{ + */ +#define LTDC_LAYER_1 0x00000000U /*!< LTDC Layer 1 */ +#define LTDC_LAYER_2 0x00000001U /*!< LTDC Layer 2 */ /** * @} */ @@ -219,8 +228,8 @@ typedef struct /** @defgroup LTDC_HS_POLARITY LTDC HS POLARITY * @{ */ -#define LTDC_HSPOLARITY_AL ((uint32_t)0x00000000U) /*!< Horizontal Synchronization is active low. */ -#define LTDC_HSPOLARITY_AH LTDC_GCR_HSPOL /*!< Horizontal Synchronization is active high. */ +#define LTDC_HSPOLARITY_AL 0x00000000U /*!< Horizontal Synchronization is active low. */ +#define LTDC_HSPOLARITY_AH LTDC_GCR_HSPOL /*!< Horizontal Synchronization is active high. */ /** * @} */ @@ -228,8 +237,8 @@ typedef struct /** @defgroup LTDC_VS_POLARITY LTDC VS POLARITY * @{ */ -#define LTDC_VSPOLARITY_AL ((uint32_t)0x00000000U) /*!< Vertical Synchronization is active low. */ -#define LTDC_VSPOLARITY_AH LTDC_GCR_VSPOL /*!< Vertical Synchronization is active high. */ +#define LTDC_VSPOLARITY_AL 0x00000000U /*!< Vertical Synchronization is active low. */ +#define LTDC_VSPOLARITY_AH LTDC_GCR_VSPOL /*!< Vertical Synchronization is active high. */ /** * @} */ @@ -237,8 +246,8 @@ typedef struct /** @defgroup LTDC_DE_POLARITY LTDC DE POLARITY * @{ */ -#define LTDC_DEPOLARITY_AL ((uint32_t)0x00000000U) /*!< Data Enable, is active low. */ -#define LTDC_DEPOLARITY_AH LTDC_GCR_DEPOL /*!< Data Enable, is active high. */ +#define LTDC_DEPOLARITY_AL 0x00000000U /*!< Data Enable, is active low. */ +#define LTDC_DEPOLARITY_AH LTDC_GCR_DEPOL /*!< Data Enable, is active high. */ /** * @} */ @@ -246,8 +255,8 @@ typedef struct /** @defgroup LTDC_PC_POLARITY LTDC PC POLARITY * @{ */ -#define LTDC_PCPOLARITY_IPC ((uint32_t)0x00000000U) /*!< input pixel clock. */ -#define LTDC_PCPOLARITY_IIPC LTDC_GCR_PCPOL /*!< inverted input pixel clock. */ +#define LTDC_PCPOLARITY_IPC 0x00000000U /*!< input pixel clock. */ +#define LTDC_PCPOLARITY_IIPC LTDC_GCR_PCPOL /*!< inverted input pixel clock. */ /** * @} */ @@ -255,8 +264,8 @@ typedef struct /** @defgroup LTDC_SYNC LTDC SYNC * @{ */ -#define LTDC_HORIZONTALSYNC (LTDC_SSCR_HSW >> 16U) /*!< Horizontal synchronization width. */ -#define LTDC_VERTICALSYNC LTDC_SSCR_VSH /*!< Vertical synchronization height. */ +#define LTDC_HORIZONTALSYNC (LTDC_SSCR_HSW >> 16U) /*!< Horizontal synchronization width. */ +#define LTDC_VERTICALSYNC LTDC_SSCR_VSH /*!< Vertical synchronization height. */ /** * @} */ @@ -264,7 +273,7 @@ typedef struct /** @defgroup LTDC_BACK_COLOR LTDC BACK COLOR * @{ */ -#define LTDC_COLOR ((uint32_t)0x000000FFU) /*!< Color mask */ +#define LTDC_COLOR 0x000000FFU /*!< Color mask */ /** * @} */ @@ -272,8 +281,8 @@ typedef struct /** @defgroup LTDC_BlendingFactor1 LTDC Blending Factor1 * @{ */ -#define LTDC_BLENDING_FACTOR1_CA ((uint32_t)0x00000400U) /*!< Blending factor : Cte Alpha */ -#define LTDC_BLENDING_FACTOR1_PAxCA ((uint32_t)0x00000600U) /*!< Blending factor : Cte Alpha x Pixel Alpha*/ +#define LTDC_BLENDING_FACTOR1_CA 0x00000400U /*!< Blending factor : Cte Alpha */ +#define LTDC_BLENDING_FACTOR1_PAxCA 0x00000600U /*!< Blending factor : Cte Alpha x Pixel Alpha*/ /** * @} */ @@ -281,8 +290,8 @@ typedef struct /** @defgroup LTDC_BlendingFactor2 LTDC Blending Factor2 * @{ */ -#define LTDC_BLENDING_FACTOR2_CA ((uint32_t)0x00000005U) /*!< Blending factor : Cte Alpha */ -#define LTDC_BLENDING_FACTOR2_PAxCA ((uint32_t)0x00000007U) /*!< Blending factor : Cte Alpha x Pixel Alpha*/ +#define LTDC_BLENDING_FACTOR2_CA 0x00000005U /*!< Blending factor : Cte Alpha */ +#define LTDC_BLENDING_FACTOR2_PAxCA 0x00000007U /*!< Blending factor : Cte Alpha x Pixel Alpha*/ /** * @} */ @@ -290,14 +299,14 @@ typedef struct /** @defgroup LTDC_Pixelformat LTDC Pixel format * @{ */ -#define LTDC_PIXEL_FORMAT_ARGB8888 ((uint32_t)0x00000000U) /*!< ARGB8888 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_RGB888 ((uint32_t)0x00000001U) /*!< RGB888 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_RGB565 ((uint32_t)0x00000002U) /*!< RGB565 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_ARGB1555 ((uint32_t)0x00000003U) /*!< ARGB1555 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_ARGB4444 ((uint32_t)0x00000004U) /*!< ARGB4444 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_L8 ((uint32_t)0x00000005U) /*!< L8 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_AL44 ((uint32_t)0x00000006U) /*!< AL44 LTDC pixel format */ -#define LTDC_PIXEL_FORMAT_AL88 ((uint32_t)0x00000007U) /*!< AL88 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_ARGB8888 0x00000000U /*!< ARGB8888 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_RGB888 0x00000001U /*!< RGB888 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_RGB565 0x00000002U /*!< RGB565 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_ARGB1555 0x00000003U /*!< ARGB1555 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_ARGB4444 0x00000004U /*!< ARGB4444 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_L8 0x00000005U /*!< L8 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_AL44 0x00000006U /*!< AL44 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_AL88 0x00000007U /*!< AL88 LTDC pixel format */ /** * @} */ @@ -305,7 +314,7 @@ typedef struct /** @defgroup LTDC_Alpha LTDC Alpha * @{ */ -#define LTDC_ALPHA LTDC_LxCACR_CONSTA /*!< LTDC Cte Alpha mask */ +#define LTDC_ALPHA LTDC_LxCACR_CONSTA /*!< LTDC Constant Alpha mask */ /** * @} */ @@ -313,11 +322,11 @@ typedef struct /** @defgroup LTDC_LAYER_Config LTDC LAYER Config * @{ */ -#define LTDC_STOPPOSITION (LTDC_LxWHPCR_WHSPPOS >> 16U) /*!< LTDC Layer stop position */ -#define LTDC_STARTPOSITION LTDC_LxWHPCR_WHSTPOS /*!< LTDC Layer start position */ +#define LTDC_STOPPOSITION (LTDC_LxWHPCR_WHSPPOS >> 16U) /*!< LTDC Layer stop position */ +#define LTDC_STARTPOSITION LTDC_LxWHPCR_WHSTPOS /*!< LTDC Layer start position */ -#define LTDC_COLOR_FRAME_BUFFER LTDC_LxCFBLR_CFBLL /*!< LTDC Layer Line length */ -#define LTDC_LINE_NUMBER LTDC_LxCFBLNR_CFBLNBR /*!< LTDC Layer Line number */ +#define LTDC_COLOR_FRAME_BUFFER LTDC_LxCFBLR_CFBLL /*!< LTDC Layer Line length */ +#define LTDC_LINE_NUMBER LTDC_LxCFBLNR_CFBLNBR /*!< LTDC Layer Line number */ /** * @} */ @@ -325,21 +334,21 @@ typedef struct /** @defgroup LTDC_Interrupts LTDC Interrupts * @{ */ -#define LTDC_IT_LI LTDC_IER_LIE -#define LTDC_IT_FU LTDC_IER_FUIE -#define LTDC_IT_TE LTDC_IER_TERRIE -#define LTDC_IT_RR LTDC_IER_RRIE +#define LTDC_IT_LI LTDC_IER_LIE /*!< LTDC Line Interrupt */ +#define LTDC_IT_FU LTDC_IER_FUIE /*!< LTDC FIFO Underrun Interrupt */ +#define LTDC_IT_TE LTDC_IER_TERRIE /*!< LTDC Transfer Error Interrupt */ +#define LTDC_IT_RR LTDC_IER_RRIE /*!< LTDC Register Reload Interrupt */ /** * @} */ -/** @defgroup LTDC_Flag LTDC Flag +/** @defgroup LTDC_Flags LTDC Flags * @{ */ -#define LTDC_FLAG_LI LTDC_ISR_LIF -#define LTDC_FLAG_FU LTDC_ISR_FUIF -#define LTDC_FLAG_TE LTDC_ISR_TERRIF -#define LTDC_FLAG_RR LTDC_ISR_RRIF +#define LTDC_FLAG_LI LTDC_ISR_LIF /*!< LTDC Line Interrupt Flag */ +#define LTDC_FLAG_FU LTDC_ISR_FUIF /*!< LTDC FIFO Underrun interrupt Flag */ +#define LTDC_FLAG_TE LTDC_ISR_TERRIF /*!< LTDC Transfer Error interrupt Flag */ +#define LTDC_FLAG_RR LTDC_ISR_RRIF /*!< LTDC Register Reload interrupt Flag */ /** * @} */ @@ -347,8 +356,8 @@ typedef struct /** @defgroup LTDC_Reload_Type LTDC Reload Type * @{ */ -#define LTDC_RELOAD_IMMEDIATE LTDC_SRCR_IMR /*!< Immediate Reload */ -#define LTDC_RELOAD_VERTICAL_BLANKING LTDC_SRCR_VBR /*!< Vertical Blanking Reload */ +#define LTDC_RELOAD_IMMEDIATE LTDC_SRCR_IMR /*!< Immediate Reload */ +#define LTDC_RELOAD_VERTICAL_BLANKING LTDC_SRCR_VBR /*!< Vertical Blanking Reload */ /** * @} */ @@ -362,56 +371,63 @@ typedef struct * @{ */ -/** @brief Reset LTDC handle state - * @param __HANDLE__: specifies the LTDC handle. +/** @brief Reset LTDC handle state. + * @param __HANDLE__ LTDC handle * @retval None */ #define __HAL_LTDC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_LTDC_STATE_RESET) /** * @brief Enable the LTDC. - * @param __HANDLE__: LTDC handle + * @param __HANDLE__ LTDC handle * @retval None. */ #define __HAL_LTDC_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR |= LTDC_GCR_LTDCEN) /** * @brief Disable the LTDC. - * @param __HANDLE__: LTDC handle + * @param __HANDLE__ LTDC handle * @retval None. */ #define __HAL_LTDC_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR &= ~(LTDC_GCR_LTDCEN)) /** * @brief Enable the LTDC Layer. - * @param __HANDLE__: LTDC handle - * @param __LAYER__: Specify the layer to be enabled - * This parameter can be 0 or 1 + * @param __HANDLE__ LTDC handle + * @param __LAYER__ Specify the layer to be enabled. + * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval None. */ #define __HAL_LTDC_LAYER_ENABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR |= (uint32_t)LTDC_LxCR_LEN) /** * @brief Disable the LTDC Layer. - * @param __HANDLE__: LTDC handle - * @param __LAYER__: Specify the layer to be disabled - * This parameter can be 0 or 1 + * @param __HANDLE__ LTDC handle + * @param __LAYER__ Specify the layer to be disabled. + * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval None. */ #define __HAL_LTDC_LAYER_DISABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR &= ~(uint32_t)LTDC_LxCR_LEN) /** - * @brief Reload Layer Configuration. - * @param __HANDLE__: LTDC handle + * @brief Reload immediately all LTDC Layers. + * @param __HANDLE__ LTDC handle * @retval None. */ -#define __HAL_LTDC_RELOAD_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_IMR) +#define __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_IMR) + +/** + * @brief Reload during vertical blanking period all LTDC Layers. + * @param __HANDLE__ LTDC handle + * @retval None. + */ +#define __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_VBR) /* Interrupt & Flag management */ /** * @brief Get the LTDC pending flags. - * @param __HANDLE__: LTDC handle - * @param __FLAG__: Get the specified flag. + * @param __HANDLE__ LTDC handle + * @param __FLAG__ Get the specified flag. * This parameter can be any combination of the following values: * @arg LTDC_FLAG_LI: Line Interrupt flag * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag @@ -423,8 +439,8 @@ typedef struct /** * @brief Clears the LTDC pending flags. - * @param __HANDLE__: LTDC handle - * @param __FLAG__: specifies the flag to clear. + * @param __HANDLE__ LTDC handle + * @param __FLAG__ Specify the flag to clear. * This parameter can be any combination of the following values: * @arg LTDC_FLAG_LI: Line Interrupt flag * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag @@ -436,8 +452,8 @@ typedef struct /** * @brief Enables the specified LTDC interrupts. - * @param __HANDLE__: LTDC handle - * @param __INTERRUPT__: specifies the LTDC interrupt sources to be enabled. + * @param __HANDLE__ LTDC handle + * @param __INTERRUPT__ Specify the LTDC interrupt sources to be enabled. * This parameter can be any combination of the following values: * @arg LTDC_IT_LI: Line Interrupt flag * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag @@ -449,8 +465,8 @@ typedef struct /** * @brief Disables the specified LTDC interrupts. - * @param __HANDLE__: LTDC handle - * @param __INTERRUPT__: specifies the LTDC interrupt sources to be disabled. + * @param __HANDLE__ LTDC handle + * @param __INTERRUPT__ Specify the LTDC interrupt sources to be disabled. * This parameter can be any combination of the following values: * @arg LTDC_IT_LI: Line Interrupt flag * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag @@ -461,9 +477,9 @@ typedef struct #define __HAL_LTDC_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER &= ~(__INTERRUPT__)) /** - * @brief Checks whether the specified LTDC interrupt has occurred or not. - * @param __HANDLE__: LTDC handle - * @param __INTERRUPT__: specifies the LTDC interrupt source to check. + * @brief Check whether the specified LTDC interrupt has occurred or not. + * @param __HANDLE__ LTDC handle + * @param __INTERRUPT__ Specify the LTDC interrupt source to check. * This parameter can be one of the following values: * @arg LTDC_IT_LI: Line Interrupt flag * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag @@ -471,7 +487,7 @@ typedef struct * @arg LTDC_IT_RR: Register Reload Interrupt Flag * @retval The state of INTERRUPT (SET or RESET). */ -#define __HAL_LTDC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->ISR & (__INTERRUPT__)) +#define __HAL_LTDC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER & (__INTERRUPT__)) /** * @} */ @@ -527,7 +543,7 @@ HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t Layer HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line); HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc); HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc); -HAL_StatusTypeDef HAL_LTDC_Relaod(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType); +HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType); HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx); HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx); @@ -558,76 +574,49 @@ uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc); /** * @} */ -/* Private types -------------------------------------------------------------*/ -/** @defgroup LTDC_Private_Types LTDC Private Types - * @{ - */ - -/** - * @} - */ +/* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ -/** @defgroup LTDC_Private_Variables LTDC Private Variables - * @{ - */ - -/** - * @} - */ - /* Private constants ---------------------------------------------------------*/ -/** @defgroup LTDC_Private_Constants LTDC Private Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ /** @defgroup LTDC_Private_Macros LTDC Private Macros * @{ */ -#define LTDC_LAYER(__HANDLE__, __LAYER__) ((LTDC_Layer_TypeDef *)((uint32_t)(((uint32_t)((__HANDLE__)->Instance)) + 0x84U + (0x80U * (__LAYER__))))) -#define IS_LTDC_LAYER(LAYER) ((LAYER) <= MAX_LAYER) -#define IS_LTDC_HSPOL(HSPOL) (((HSPOL) == LTDC_HSPOLARITY_AL) || \ - ((HSPOL) == LTDC_HSPOLARITY_AH)) -#define IS_LTDC_VSPOL(VSPOL) (((VSPOL) == LTDC_VSPOLARITY_AL) || \ - ((VSPOL) == LTDC_VSPOLARITY_AH)) -#define IS_LTDC_DEPOL(DEPOL) (((DEPOL) == LTDC_DEPOLARITY_AL) || \ - ((DEPOL) == LTDC_DEPOLARITY_AH)) -#define IS_LTDC_PCPOL(PCPOL) (((PCPOL) == LTDC_PCPOLARITY_IPC) || \ - ((PCPOL) == LTDC_PCPOLARITY_IIPC)) -#define IS_LTDC_HSYNC(HSYNC) ((HSYNC) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_VSYNC(VSYNC) ((VSYNC) <= LTDC_VERTICALSYNC) -#define IS_LTDC_AHBP(AHBP) ((AHBP) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_AVBP(AVBP) ((AVBP) <= LTDC_VERTICALSYNC) -#define IS_LTDC_AAW(AAW) ((AAW) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_AAH(AAH) ((AAH) <= LTDC_VERTICALSYNC) -#define IS_LTDC_TOTALW(TOTALW) ((TOTALW) <= LTDC_HORIZONTALSYNC) -#define IS_LTDC_TOTALH(TOTALH) ((TOTALH) <= LTDC_VERTICALSYNC) -#define IS_LTDC_BLUEVALUE(BBLUE) ((BBLUE) <= LTDC_COLOR) -#define IS_LTDC_GREENVALUE(BGREEN) ((BGREEN) <= LTDC_COLOR) -#define IS_LTDC_REDVALUE(BRED) ((BRED) <= LTDC_COLOR) -#define IS_LTDC_BLENDING_FACTOR1(BlendingFactor1) (((BlendingFactor1) == LTDC_BLENDING_FACTOR1_CA) || \ - ((BlendingFactor1) == LTDC_BLENDING_FACTOR1_PAxCA)) -#define IS_LTDC_BLENDING_FACTOR2(BlendingFactor2) (((BlendingFactor2) == LTDC_BLENDING_FACTOR2_CA) || \ - ((BlendingFactor2) == LTDC_BLENDING_FACTOR2_PAxCA)) -#define IS_LTDC_PIXEL_FORMAT(Pixelformat) (((Pixelformat) == LTDC_PIXEL_FORMAT_ARGB8888) || ((Pixelformat) == LTDC_PIXEL_FORMAT_RGB888) || \ - ((Pixelformat) == LTDC_PIXEL_FORMAT_RGB565) || ((Pixelformat) == LTDC_PIXEL_FORMAT_ARGB1555) || \ - ((Pixelformat) == LTDC_PIXEL_FORMAT_ARGB4444) || ((Pixelformat) == LTDC_PIXEL_FORMAT_L8) || \ - ((Pixelformat) == LTDC_PIXEL_FORMAT_AL44) || ((Pixelformat) == LTDC_PIXEL_FORMAT_AL88)) -#define IS_LTDC_ALPHA(ALPHA) ((ALPHA) <= LTDC_ALPHA) -#define IS_LTDC_HCONFIGST(HCONFIGST) ((HCONFIGST) <= LTDC_STARTPOSITION) -#define IS_LTDC_HCONFIGSP(HCONFIGSP) ((HCONFIGSP) <= LTDC_STOPPOSITION) -#define IS_LTDC_VCONFIGST(VCONFIGST) ((VCONFIGST) <= LTDC_STARTPOSITION) -#define IS_LTDC_VCONFIGSP(VCONFIGSP) ((VCONFIGSP) <= LTDC_STOPPOSITION) -#define IS_LTDC_CFBP(CFBP) ((CFBP) <= LTDC_COLOR_FRAME_BUFFER) -#define IS_LTDC_CFBLL(CFBLL) ((CFBLL) <= LTDC_COLOR_FRAME_BUFFER) -#define IS_LTDC_CFBLNBR(CFBLNBR) ((CFBLNBR) <= LTDC_LINE_NUMBER) -#define IS_LTDC_LIPOS(LIPOS) ((LIPOS) <= 0x7FFU) -#define IS_LTDC_RELAOD(RELOADTYPE) (((RELOADTYPE) == LTDC_RELOAD_IMMEDIATE) || ((RELOADTYPE) == LTDC_SRCR_VBR)) +#define LTDC_LAYER(__HANDLE__, __LAYER__) ((LTDC_Layer_TypeDef *)((uint32_t)(((uint32_t)((__HANDLE__)->Instance)) + 0x84U + (0x80U*(__LAYER__))))) +#define IS_LTDC_LAYER(__LAYER__) ((__LAYER__) < MAX_LAYER) +#define IS_LTDC_HSPOL(__HSPOL__) (((__HSPOL__) == LTDC_HSPOLARITY_AL) || ((__HSPOL__) == LTDC_HSPOLARITY_AH)) +#define IS_LTDC_VSPOL(__VSPOL__) (((__VSPOL__) == LTDC_VSPOLARITY_AL) || ((__VSPOL__) == LTDC_VSPOLARITY_AH)) +#define IS_LTDC_DEPOL(__DEPOL__) (((__DEPOL__) == LTDC_DEPOLARITY_AL) || ((__DEPOL__) == LTDC_DEPOLARITY_AH)) +#define IS_LTDC_PCPOL(__PCPOL__) (((__PCPOL__) == LTDC_PCPOLARITY_IPC) || ((__PCPOL__) == LTDC_PCPOLARITY_IIPC)) +#define IS_LTDC_HSYNC(__HSYNC__) ((__HSYNC__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_VSYNC(__VSYNC__) ((__VSYNC__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_AHBP(__AHBP__) ((__AHBP__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_AVBP(__AVBP__) ((__AVBP__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_AAW(__AAW__) ((__AAW__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_AAH(__AAH__) ((__AAH__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_TOTALW(__TOTALW__) ((__TOTALW__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_TOTALH(__TOTALH__) ((__TOTALH__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_BLUEVALUE(__BBLUE__) ((__BBLUE__) <= LTDC_COLOR) +#define IS_LTDC_GREENVALUE(__BGREEN__) ((__BGREEN__) <= LTDC_COLOR) +#define IS_LTDC_REDVALUE(__BRED__) ((__BRED__) <= LTDC_COLOR) +#define IS_LTDC_BLENDING_FACTOR1(__BLENDING_FACTOR1__) (((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_CA) || \ + ((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_PAxCA)) +#define IS_LTDC_BLENDING_FACTOR2(__BLENDING_FACTOR1__) (((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR2_CA) || \ + ((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR2_PAxCA)) +#define IS_LTDC_PIXEL_FORMAT(__PIXEL_FORMAT__) (((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB8888) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB888) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB565) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB1555) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB4444) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_L8) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL44) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL88)) +#define IS_LTDC_ALPHA(__ALPHA__) ((__ALPHA__) <= LTDC_ALPHA) +#define IS_LTDC_HCONFIGST(__HCONFIGST__) ((__HCONFIGST__) <= LTDC_STARTPOSITION) +#define IS_LTDC_HCONFIGSP(__HCONFIGSP__) ((__HCONFIGSP__) <= LTDC_STOPPOSITION) +#define IS_LTDC_VCONFIGST(__VCONFIGST__) ((__VCONFIGST__) <= LTDC_STARTPOSITION) +#define IS_LTDC_VCONFIGSP(__VCONFIGSP__) ((__VCONFIGSP__) <= LTDC_STOPPOSITION) +#define IS_LTDC_CFBP(__CFBP__) ((__CFBP__) <= LTDC_COLOR_FRAME_BUFFER) +#define IS_LTDC_CFBLL(__CFBLL__) ((__CFBLL__) <= LTDC_COLOR_FRAME_BUFFER) +#define IS_LTDC_CFBLNBR(__CFBLNBR__) ((__CFBLNBR__) <= LTDC_LINE_NUMBER) +#define IS_LTDC_LIPOS(__LIPOS__) ((__LIPOS__) <= 0x7FFU) +#define IS_LTDC_RELOAD(__RELOADTYPE__) (((__RELOADTYPE__) == LTDC_RELOAD_IMMEDIATE) || ((__RELOADTYPE__) == LTDC_SRCR_VBR)) /** * @} */ @@ -647,7 +636,7 @@ uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc); /** * @} - */ + */ #endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h index 7708a87..3e03837 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_ltdc_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_ltdc_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of LTDC HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -58,79 +58,30 @@ /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ - -/** @defgroup LTDCEx_Exported_Constants LTDCEx Exported Constants - * @{ - */ - -/** - * @} - */ - /* Exported macro ------------------------------------------------------------*/ -/** @defgroup LTDCEx_Exported_Macros LTDC Exported Macros +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LTDCEx_Exported_Functions * @{ */ -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup LTDCEx_Exported_Functions LTDC Extended Exported Functions +/** @addtogroup LTDCEx_Exported_Functions_Group1 * @{ */ -HAL_StatusTypeDef HAL_LTDC_StructInitFromVideoConfig(LTDC_HandleTypeDef* hltdc, DSI_VidCfgTypeDef *VidCfg); -HAL_StatusTypeDef HAL_LTDC_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef* hltdc, DSI_CmdCfgTypeDef *CmdCfg); +HAL_StatusTypeDef HAL_LTDCEx_StructInitFromVideoConfig(LTDC_HandleTypeDef* hltdc, DSI_VidCfgTypeDef *VidCfg); +HAL_StatusTypeDef HAL_LTDCEx_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef* hltdc, DSI_CmdCfgTypeDef *CmdCfg); /** * @} */ - - /* Private types -------------------------------------------------------------*/ -/** @defgroup LTDCEx_Private_Types LTDCEx Private Types - * @{ - */ - /** * @} */ +/* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ -/** @defgroup LTDCEx_Private_Variables LTDCEx Private Variables - * @{ - */ - -/** - * @} - */ - /* Private constants ---------------------------------------------------------*/ -/** @defgroup LTDCEx_Private_Constants LTDCEx Private Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ -/** @defgroup LTDCEx_Private_Macros LTDCEx Private Macros - * @{ - */ - - /** - * @} - */ - /* Private functions ---------------------------------------------------------*/ -/** @defgroup LTDCEx_Private_Functions LTDCEx Private Functions - * @{ - */ - -/** - * @} - */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_mmc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_mmc.h new file mode 100644 index 0000000..e4fa41f --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_mmc.h @@ -0,0 +1,726 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_mmc.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of MMC HAL module. + ****************************************************************************** + * @attention + * + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_MMC_H +#define __STM32F4xx_HAL_MMC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_sdmmc.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup MMC MMC + * @brief MMC HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup MMC_Exported_Types MMC Exported Types + * @{ + */ + +/** @defgroup MMC_Exported_Types_Group1 MMC State enumeration structure + * @{ + */ +typedef enum +{ + HAL_MMC_STATE_RESET = 0x00000000U, /*!< MMC not yet initialized or disabled */ + HAL_MMC_STATE_READY = 0x00000001U, /*!< MMC initialized and ready for use */ + HAL_MMC_STATE_TIMEOUT = 0x00000002U, /*!< MMC Timeout state */ + HAL_MMC_STATE_BUSY = 0x00000003U, /*!< MMC process ongoing */ + HAL_MMC_STATE_PROGRAMMING = 0x00000004U, /*!< MMC Programming State */ + HAL_MMC_STATE_RECEIVING = 0x00000005U, /*!< MMC Receinving State */ + HAL_MMC_STATE_TRANSFER = 0x00000006U, /*!< MMC Transfert State */ + HAL_MMC_STATE_ERROR = 0x0000000FU /*!< MMC is in error state */ +}HAL_MMC_StateTypeDef; +/** + * @} + */ + +/** @defgroup MMC_Exported_Types_Group2 MMC Card State enumeration structure + * @{ + */ +typedef enum +{ + HAL_MMC_CARD_READY = 0x00000001U, /*!< Card state is ready */ + HAL_MMC_CARD_IDENTIFICATION = 0x00000002U, /*!< Card is in identification state */ + HAL_MMC_CARD_STANDBY = 0x00000003U, /*!< Card is in standby state */ + HAL_MMC_CARD_TRANSFER = 0x00000004U, /*!< Card is in transfer state */ + HAL_MMC_CARD_SENDING = 0x00000005U, /*!< Card is sending an operation */ + HAL_MMC_CARD_RECEIVING = 0x00000006U, /*!< Card is receiving operation information */ + HAL_MMC_CARD_PROGRAMMING = 0x00000007U, /*!< Card is in programming state */ + HAL_MMC_CARD_DISCONNECTED = 0x00000008U, /*!< Card is disconnected */ + HAL_MMC_CARD_ERROR = 0x000000FFU /*!< Card response Error */ +}HAL_MMC_CardStateTypeDef; +/** + * @} + */ + +/** @defgroup MMC_Exported_Types_Group3 MMC Handle Structure definition + * @{ + */ +#define MMC_InitTypeDef SDIO_InitTypeDef +#define MMC_TypeDef SDIO_TypeDef + +/** + * @brief MMC Card Information Structure definition + */ +typedef struct +{ + uint32_t CardType; /*!< Specifies the card Type */ + + uint32_t Class; /*!< Specifies the class of the card class */ + + uint32_t RelCardAdd; /*!< Specifies the Relative Card Address */ + + uint32_t BlockNbr; /*!< Specifies the Card Capacity in blocks */ + + uint32_t BlockSize; /*!< Specifies one block size in bytes */ + + uint32_t LogBlockNbr; /*!< Specifies the Card logical Capacity in blocks */ + + uint32_t LogBlockSize; /*!< Specifies logical block size in bytes */ + +}HAL_MMC_CardInfoTypeDef; + +/** + * @brief MMC handle Structure definition + */ +typedef struct +{ + MMC_TypeDef *Instance; /*!< MMC registers base address */ + + MMC_InitTypeDef Init; /*!< MMC required parameters */ + + HAL_LockTypeDef Lock; /*!< MMC locking object */ + + uint32_t *pTxBuffPtr; /*!< Pointer to MMC Tx transfer Buffer */ + + uint32_t TxXferSize; /*!< MMC Tx Transfer size */ + + uint32_t *pRxBuffPtr; /*!< Pointer to MMC Rx transfer Buffer */ + + uint32_t RxXferSize; /*!< MMC Rx Transfer size */ + + __IO uint32_t Context; /*!< MMC transfer context */ + + __IO HAL_MMC_StateTypeDef State; /*!< MMC card State */ + + __IO uint32_t ErrorCode; /*!< MMC Card Error codes */ + + DMA_HandleTypeDef *hdmarx; /*!< MMC Rx DMA handle parameters */ + + DMA_HandleTypeDef *hdmatx; /*!< MMC Tx DMA handle parameters */ + + HAL_MMC_CardInfoTypeDef MmcCard; /*!< MMC Card information */ + + uint32_t CSD[4U]; /*!< MMC card specific data table */ + + uint32_t CID[4U]; /*!< MMC card identification number table */ + +}MMC_HandleTypeDef; + +/** + * @} + */ + +/** @defgroup MMC_Exported_Types_Group4 Card Specific Data: CSD Register + * @{ + */ +typedef struct +{ + __IO uint8_t CSDStruct; /*!< CSD structure */ + __IO uint8_t SysSpecVersion; /*!< System specification version */ + __IO uint8_t Reserved1; /*!< Reserved */ + __IO uint8_t TAAC; /*!< Data read access time 1 */ + __IO uint8_t NSAC; /*!< Data read access time 2 in CLK cycles */ + __IO uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */ + __IO uint16_t CardComdClasses; /*!< Card command classes */ + __IO uint8_t RdBlockLen; /*!< Max. read data block length */ + __IO uint8_t PartBlockRead; /*!< Partial blocks for read allowed */ + __IO uint8_t WrBlockMisalign; /*!< Write block misalignment */ + __IO uint8_t RdBlockMisalign; /*!< Read block misalignment */ + __IO uint8_t DSRImpl; /*!< DSR implemented */ + __IO uint8_t Reserved2; /*!< Reserved */ + __IO uint32_t DeviceSize; /*!< Device Size */ + __IO uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */ + __IO uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */ + __IO uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */ + __IO uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */ + __IO uint8_t DeviceSizeMul; /*!< Device size multiplier */ + __IO uint8_t EraseGrSize; /*!< Erase group size */ + __IO uint8_t EraseGrMul; /*!< Erase group size multiplier */ + __IO uint8_t WrProtectGrSize; /*!< Write protect group size */ + __IO uint8_t WrProtectGrEnable; /*!< Write protect group enable */ + __IO uint8_t ManDeflECC; /*!< Manufacturer default ECC */ + __IO uint8_t WrSpeedFact; /*!< Write speed factor */ + __IO uint8_t MaxWrBlockLen; /*!< Max. write data block length */ + __IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */ + __IO uint8_t Reserved3; /*!< Reserved */ + __IO uint8_t ContentProtectAppli; /*!< Content protection application */ + __IO uint8_t FileFormatGrouop; /*!< File format group */ + __IO uint8_t CopyFlag; /*!< Copy flag (OTP) */ + __IO uint8_t PermWrProtect; /*!< Permanent write protection */ + __IO uint8_t TempWrProtect; /*!< Temporary write protection */ + __IO uint8_t FileFormat; /*!< File format */ + __IO uint8_t ECC; /*!< ECC code */ + __IO uint8_t CSD_CRC; /*!< CSD CRC */ + __IO uint8_t Reserved4; /*!< Always 1 */ + +}HAL_MMC_CardCSDTypeDef; +/** + * @} + */ + +/** @defgroup MMC_Exported_Types_Group5 Card Identification Data: CID Register + * @{ + */ +typedef struct +{ + __IO uint8_t ManufacturerID; /*!< Manufacturer ID */ + __IO uint16_t OEM_AppliID; /*!< OEM/Application ID */ + __IO uint32_t ProdName1; /*!< Product Name part1 */ + __IO uint8_t ProdName2; /*!< Product Name part2 */ + __IO uint8_t ProdRev; /*!< Product Revision */ + __IO uint32_t ProdSN; /*!< Product Serial Number */ + __IO uint8_t Reserved1; /*!< Reserved1 */ + __IO uint16_t ManufactDate; /*!< Manufacturing Date */ + __IO uint8_t CID_CRC; /*!< CID CRC */ + __IO uint8_t Reserved2; /*!< Always 1 */ + +}HAL_MMC_CardCIDTypeDef; +/** + * @} + */ + +/** @defgroup MMC_Exported_Types_Group6 MMC Card Status returned by ACMD13 + * @{ + */ +typedef struct +{ + __IO uint8_t DataBusWidth; /*!< Shows the currently defined data bus width */ + __IO uint8_t SecuredMode; /*!< Card is in secured mode of operation */ + __IO uint16_t CardType; /*!< Carries information about card type */ + __IO uint32_t ProtectedAreaSize; /*!< Carries information about the capacity of protected area */ + __IO uint8_t SpeedClass; /*!< Carries information about the speed class of the card */ + __IO uint8_t PerformanceMove; /*!< Carries information about the card's performance move */ + __IO uint8_t AllocationUnitSize; /*!< Carries information about the card's allocation unit size */ + __IO uint16_t EraseSize; /*!< Determines the number of AUs to be erased in one operation */ + __IO uint8_t EraseTimeout; /*!< Determines the timeout for any number of AU erase */ + __IO uint8_t EraseOffset; /*!< Carries information about the erase offset */ + +}HAL_MMC_CardStatusTypeDef; +/** + * @} + */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup MMC_Exported_Constants Exported Constants + * @{ + */ + +#define BLOCKSIZE 512U /*!< Block size is 512 bytes */ + +#define CAPACITY 0x400000U /*!< Log Block Nuumber for 2 G bytes Cards */ + +/** @defgroup MMC_Exported_Constansts_Group1 MMC Error status enumeration Structure definition + * @{ + */ +#define HAL_MMC_ERROR_NONE SDMMC_ERROR_NONE /*!< No error */ +#define HAL_MMC_ERROR_CMD_CRC_FAIL SDMMC_ERROR_CMD_CRC_FAIL /*!< Command response received (but CRC check failed) */ +#define HAL_MMC_ERROR_DATA_CRC_FAIL SDMMC_ERROR_DATA_CRC_FAIL /*!< Data block sent/received (CRC check failed) */ +#define HAL_MMC_ERROR_CMD_RSP_TIMEOUT SDMMC_ERROR_CMD_RSP_TIMEOUT /*!< Command response timeout */ +#define HAL_MMC_ERROR_DATA_TIMEOUT SDMMC_ERROR_DATA_TIMEOUT /*!< Data timeout */ +#define HAL_MMC_ERROR_TX_UNDERRUN SDMMC_ERROR_TX_UNDERRUN /*!< Transmit FIFO underrun */ +#define HAL_MMC_ERROR_RX_OVERRUN SDMMC_ERROR_RX_OVERRUN /*!< Receive FIFO overrun */ +#define HAL_MMC_ERROR_ADDR_MISALIGNED SDMMC_ERROR_ADDR_MISALIGNED /*!< Misaligned address */ +#define HAL_MMC_ERROR_BLOCK_LEN_ERR SDMMC_ERROR_BLOCK_LEN_ERR /*!< Transferred block length is not allowed for the card or the + number of transferred bytes does not match the block length */ +#define HAL_MMC_ERROR_ERASE_SEQ_ERR SDMMC_ERROR_ERASE_SEQ_ERR /*!< An error in the sequence of erase command occurs */ +#define HAL_MMC_ERROR_BAD_ERASE_PARAM SDMMC_ERROR_BAD_ERASE_PARAM /*!< An invalid selection for erase groups */ +#define HAL_MMC_ERROR_WRITE_PROT_VIOLATION SDMMC_ERROR_WRITE_PROT_VIOLATION /*!< Attempt to program a write protect block */ +#define HAL_MMC_ERROR_LOCK_UNLOCK_FAILED SDMMC_ERROR_LOCK_UNLOCK_FAILED /*!< Sequence or password error has been detected in unlock + command or if there was an attempt to access a locked card */ +#define HAL_MMC_ERROR_COM_CRC_FAILED SDMMC_ERROR_COM_CRC_FAILED /*!< CRC check of the previous command failed */ +#define HAL_MMC_ERROR_ILLEGAL_CMD SDMMC_ERROR_ILLEGAL_CMD /*!< Command is not legal for the card state */ +#define HAL_MMC_ERROR_CARD_ECC_FAILED SDMMC_ERROR_CARD_ECC_FAILED /*!< Card internal ECC was applied but failed to correct the data */ +#define HAL_MMC_ERROR_CC_ERR SDMMC_ERROR_CC_ERR /*!< Internal card controller error */ +#define HAL_MMC_ERROR_GENERAL_UNKNOWN_ERR SDMMC_ERROR_GENERAL_UNKNOWN_ERR /*!< General or unknown error */ +#define HAL_MMC_ERROR_STREAM_READ_UNDERRUN SDMMC_ERROR_STREAM_READ_UNDERRUN /*!< The card could not sustain data reading in stream rmode */ +#define HAL_MMC_ERROR_STREAM_WRITE_OVERRUN SDMMC_ERROR_STREAM_WRITE_OVERRUN /*!< The card could not sustain data programming in stream mode */ +#define HAL_MMC_ERROR_CID_CSD_OVERWRITE SDMMC_ERROR_CID_CSD_OVERWRITE /*!< CID/CSD overwrite error */ +#define HAL_MMC_ERROR_WP_ERASE_SKIP SDMMC_ERROR_WP_ERASE_SKIP /*!< Only partial address space was erased */ +#define HAL_MMC_ERROR_CARD_ECC_DISABLED SDMMC_ERROR_CARD_ECC_DISABLED /*!< Command has been executed without using internal ECC */ +#define HAL_MMC_ERROR_ERASE_RESET SDMMC_ERROR_ERASE_RESET /*!< Erase sequence was cleared before executing because an out + of erase sequence command was received */ +#define HAL_MMC_ERROR_AKE_SEQ_ERR SDMMC_ERROR_AKE_SEQ_ERR /*!< Error in sequence of authentication */ +#define HAL_MMC_ERROR_INVALID_VOLTRANGE SDMMC_ERROR_INVALID_VOLTRANGE /*!< Error in case of invalid voltage range */ +#define HAL_MMC_ERROR_ADDR_OUT_OF_RANGE SDMMC_ERROR_ADDR_OUT_OF_RANGE /*!< Error when addressed block is out of range */ +#define HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE SDMMC_ERROR_REQUEST_NOT_APPLICABLE /*!< Error when command request is not applicable */ +#define HAL_MMC_ERROR_PARAM SDMMC_ERROR_INVALID_PARAMETER /*!< the used parameter is not valid */ +#define HAL_MMC_ERROR_UNSUPPORTED_FEATURE SDMMC_ERROR_UNSUPPORTED_FEATURE /*!< Error when feature is not insupported */ +#define HAL_MMC_ERROR_BUSY SDMMC_ERROR_BUSY /*!< Error when transfer process is busy */ +#define HAL_MMC_ERROR_DMA SDMMC_ERROR_DMA /*!< Error while DMA transfer */ +#define HAL_MMC_ERROR_TIMEOUT SDMMC_ERROR_TIMEOUT /*!< Timeout error */ + +/** + * @} + */ + +/** @defgroup MMC_Exported_Constansts_Group2 MMC context enumeration structure + * @{ + */ +#define MMC_CONTEXT_NONE 0x00000000U /*!< None */ +#define MMC_CONTEXT_READ_SINGLE_BLOCK 0x00000001U /*!< Read single block operation */ +#define MMC_CONTEXT_READ_MULTIPLE_BLOCK 0x00000002U /*!< Read multiple blocks operation */ +#define MMC_CONTEXT_WRITE_SINGLE_BLOCK 0x00000010U /*!< Write single block operation */ +#define MMC_CONTEXT_WRITE_MULTIPLE_BLOCK 0x00000020U /*!< Write multiple blocks operation */ +#define MMC_CONTEXT_IT 0x00000008U /*!< Process in Interrupt mode */ +#define MMC_CONTEXT_DMA 0x00000080U /*!< Process in DMA mode */ + +/** + * @} + */ + +/** @defgroup MMC_Exported_Constansts_Group3 MMC Voltage mode + * @{ + */ +/** + * @brief + */ +#define MMC_HIGH_VOLTAGE_RANGE 0x80FF8000U /*!< VALUE OF ARGUMENT */ +#define MMC_DUAL_VOLTAGE_RANGE 0x80FF8080U /*!< VALUE OF ARGUMENT */ +#define eMMC_HIGH_VOLTAGE_RANGE 0xC0FF8000U /*!< for eMMC > 2Gb sector mode */ +#define eMMC_DUAL_VOLTAGE_RANGE 0xC0FF8080U /*!< for eMMC > 2Gb sector mode */ +#define MMC_INVALID_VOLTAGE_RANGE 0x0001FF01U +/** + * @} + */ + +/** @defgroup MMC_Exported_Constansts_Group4 MMC Memory Cards + * @{ + */ +#define MMC_HIGH_VOLTAGE_CARD 0x00000000U +#define MMC_DUAL_VOLTAGE_CARD 0x00000001U +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup MMC_Exported_macros MMC Exported Macros + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ + +/** + * @brief Enable the MMC device. + * @retval None + */ +#define __HAL_MMC_ENABLE(__HANDLE__) __SDIO_ENABLE((__HANDLE__)->Instance) + +/** + * @brief Disable the MMC device. + * @retval None + */ +#define __HAL_MMC_DISABLE(__HANDLE__) __SDIO_DISABLE((__HANDLE__)->Instance) + +/** + * @brief Enable the SDMMC DMA transfer. + * @retval None + */ +#define __HAL_MMC_DMA_ENABLE(__HANDLE__) __SDIO_DMA_ENABLE((__HANDLE__)->Instance) + +/** + * @brief Disable the SDMMC DMA transfer. + * @retval None + */ +#define __HAL_MMC_DMA_DISABLE(__HANDLE__) __SDIO_DMA_DISABLE((__HANDLE__)->Instance) + +/** + * @brief Enable the MMC device interrupt. + * @param __HANDLE__: MMC Handle + * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be enabled. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @retval None + */ +#define __HAL_MMC_ENABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_ENABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) + +/** + * @brief Disable the MMC device interrupt. + * @param __HANDLE__: MMC Handle + * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be disabled. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @retval None + */ +#define __HAL_MMC_DISABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_DISABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) + +/** + * @brief Check whether the specified MMC flag is set or not. + * @param __HANDLE__: MMC Handle + * @param __FLAG__: specifies the flag to check. + * This parameter can be one of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_CMDACT: Command transfer in progress + * @arg SDIO_FLAG_TXACT: Data transmit in progress + * @arg SDIO_FLAG_RXACT: Data receive in progress + * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty + * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full + * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full + * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full + * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty + * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty + * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO + * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @retval The new state of MMC FLAG (SET or RESET). + */ +#define __HAL_MMC_GET_FLAG(__HANDLE__, __FLAG__) __SDIO_GET_FLAG((__HANDLE__)->Instance, (__FLAG__)) + +/** + * @brief Clear the MMC's pending flags. + * @param __HANDLE__: MMC Handle + * @param __FLAG__: specifies the flag to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) + * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) + * @arg SDIO_FLAG_CTIMEOUT: Command response timeout + * @arg SDIO_FLAG_DTIMEOUT: Data timeout + * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error + * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error + * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) + * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) + * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) + * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) + * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received + * @retval None + */ +#define __HAL_MMC_CLEAR_FLAG(__HANDLE__, __FLAG__) __SDIO_CLEAR_FLAG((__HANDLE__)->Instance, (__FLAG__)) + +/** + * @brief Check whether the specified MMC interrupt has occurred or not. + * @param __HANDLE__: MMC Handle + * @param __INTERRUPT__: specifies the SDMMC interrupt source to check. + * This parameter can be one of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt + * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt + * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt + * @arg SDIO_IT_TXACT: Data transmit in progress interrupt + * @arg SDIO_IT_RXACT: Data receive in progress interrupt + * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt + * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt + * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt + * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt + * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt + * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt + * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt + * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @retval The new state of MMC IT (SET or RESET). + */ +#define __HAL_MMC_GET_IT(__HANDLE__, __INTERRUPT__) __SDIO_GET_IT((__HANDLE__)->Instance, (__INTERRUPT__)) + +/** + * @brief Clear the MMC's interrupt pending bits. + * @param __HANDLE__: MMC Handle + * @param __INTERRUPT__: specifies the interrupt pending bit to clear. + * This parameter can be one or a combination of the following values: + * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt + * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt + * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt + * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt + * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt + * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt + * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt + * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDMMC_DCOUNT, is zero) interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt + * @retval None + */ +#define __HAL_MMC_CLEAR_IT(__HANDLE__, __INTERRUPT__) __SDIO_CLEAR_IT((__HANDLE__)->Instance, (__INTERRUPT__)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup MMC_Exported_Functions MMC Exported Functions + * @{ + */ + +/** @defgroup MMC_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_MMC_Init(MMC_HandleTypeDef *hmmc); +HAL_StatusTypeDef HAL_MMC_InitCard(MMC_HandleTypeDef *hmmc); +HAL_StatusTypeDef HAL_MMC_DeInit (MMC_HandleTypeDef *hmmc); +void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc); +void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc); +/** + * @} + */ + +/** @defgroup MMC_Exported_Functions_Group2 Input and Output operation functions + * @{ + */ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); +HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); +HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd); +/* Non-Blocking mode: IT */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); + +void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc); + +/* Callback in non blocking modes (DMA) */ +void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc); +void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc); +void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc); +void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc); +/** + * @} + */ + +/** @defgroup MMC_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ +HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode); +/** + * @} + */ + +/** @defgroup MMC_Exported_Functions_Group4 MMC card related functions + * @{ + */ +HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc); +HAL_StatusTypeDef HAL_MMC_GetCardCID(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID); +HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD); +HAL_StatusTypeDef HAL_MMC_GetCardInfo(MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo); +/** + * @} + */ + +/** @defgroup MMC_Exported_Functions_Group5 Peripheral State and Errors functions + * @{ + */ +HAL_MMC_StateTypeDef HAL_MMC_GetState(MMC_HandleTypeDef *hmmc); +uint32_t HAL_MMC_GetError(MMC_HandleTypeDef *hmmc); +/** + * @} + */ + +/** @defgroup MMC_Exported_Functions_Group6 Perioheral Abort management + * @{ + */ +HAL_StatusTypeDef HAL_MMC_Abort(MMC_HandleTypeDef *hmmc); +HAL_StatusTypeDef HAL_MMC_Abort_IT(MMC_HandleTypeDef *hmmc); +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/** @defgroup MMC_Private_Types MMC Private Types + * @{ + */ + +/** + * @} + */ + +/* Private defines -----------------------------------------------------------*/ +/** @defgroup MMC_Private_Defines MMC Private Defines + * @{ + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup MMC_Private_Variables MMC Private Variables + * @{ + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup MMC_Private_Constants MMC Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup MMC_Private_Macros MMC Private Macros + * @{ + */ + +/** + * @} + */ + +/* Private functions prototypes ----------------------------------------------*/ +/** @defgroup MMC_Private_Functions_Prototypes MMC Private Functions Prototypes + * @{ + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup MMC_Private_Functions MMC Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_MMC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h index 527d41f..4b2ff05 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nand.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_nand.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of NAND HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -64,7 +64,7 @@ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) /* Exported typedef ----------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ @@ -104,11 +104,11 @@ typedef struct */ typedef struct { - uint16_t Page; /*!< NAND memory Page address */ + uint16_t Page; /*!< NAND memory Page address */ - uint16_t Zone; /*!< NAND memory Zone address */ + uint16_t Plane; /*!< NAND memory Plane address */ - uint16_t Block; /*!< NAND memory Block address */ + uint16_t Block; /*!< NAND memory Block address */ }NAND_AddressTypeDef; @@ -117,31 +117,43 @@ typedef struct */ typedef struct { - uint32_t PageSize; /*!< NAND memory page (without spare area) size measured in K. bytes */ + uint32_t PageSize; /*!< NAND memory page (without spare area) size measured in bytes + for 8 bits adressing or words for 16 bits addressing */ - uint32_t SpareAreaSize; /*!< NAND memory spare area size measured in K. bytes */ + uint32_t SpareAreaSize; /*!< NAND memory spare area size measured in bytes + for 8 bits adressing or words for 16 bits addressing */ + + uint32_t BlockSize; /*!< NAND memory block size measured in number of pages */ - uint32_t BlockSize; /*!< NAND memory block size number of pages */ + uint32_t BlockNbr; /*!< NAND memory number of total blocks */ + + uint32_t PlaneNbr; /*!< NAND memory number of planes */ - uint32_t BlockNbr; /*!< NAND memory number of blocks */ + uint32_t PlaneSize; /*!< NAND memory plane size measured in number of blocks */ - uint32_t ZoneSize; /*!< NAND memory zone size measured in number of blocks */ -}NAND_InfoTypeDef; + FunctionalState ExtraCommandEnable; /*!< NAND extra command needed for Page reading mode. This + parameter is mandatory for some NAND parts after the read + command (NAND_CMD_AREA_TRUE1) and before DATA reading sequence. + Example: Toshiba THTH58BYG3S0HBAI6. + This parameter could be ENABLE or DISABLE + Please check the Read Mode sequnece in the NAND device datasheet */ +}NAND_DeviceConfigTypeDef; /** * @brief NAND handle Structure definition */ typedef struct { - FMC_NAND_TypeDef *Instance; /*!< Register base address */ + FMC_NAND_TypeDef *Instance; /*!< Register base address */ - FMC_NAND_InitTypeDef Init; /*!< NAND device control configuration parameters */ + FMC_NAND_InitTypeDef Init; /*!< NAND device control configuration parameters */ + + HAL_LockTypeDef Lock; /*!< NAND locking object */ - HAL_LockTypeDef Lock; /*!< NAND locking object */ + __IO HAL_NAND_StateTypeDef State; /*!< NAND device access state */ - __IO HAL_NAND_StateTypeDef State; /*!< NAND device access state */ + NAND_DeviceConfigTypeDef Config; /*!< NAND phusical characteristic information structure */ - NAND_InfoTypeDef Info; /*!< NAND characteristic information structure */ }NAND_HandleTypeDef; /** * @} @@ -172,13 +184,19 @@ typedef struct * @{ */ +/* Initialization/de-initialization functions ********************************/ /* Initialization/de-initialization functions ********************************/ HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, FMC_NAND_PCC_TimingTypeDef *AttSpace_Timing); HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand); + +HAL_StatusTypeDef HAL_NAND_ConfigDevice(NAND_HandleTypeDef *hnand, NAND_DeviceConfigTypeDef *pDeviceConfig); + +HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID); + +void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand); +void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand); void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand); -void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand); +void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand); /** * @} @@ -189,13 +207,20 @@ void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand); */ /* IO operation functions ****************************************************/ -HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID); HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead); -HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite); -HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead); -HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite); + +HAL_StatusTypeDef HAL_NAND_Read_Page_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead); +HAL_StatusTypeDef HAL_NAND_Write_Page_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite); +HAL_StatusTypeDef HAL_NAND_Read_SpareArea_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead); +HAL_StatusTypeDef HAL_NAND_Write_SpareArea_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite); + +HAL_StatusTypeDef HAL_NAND_Read_Page_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumPageToRead); +HAL_StatusTypeDef HAL_NAND_Write_Page_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumPageToWrite); +HAL_StatusTypeDef HAL_NAND_Read_SpareArea_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumSpareAreaToRead); +HAL_StatusTypeDef HAL_NAND_Write_SpareArea_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumSpareAreaTowrite); + HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress); + uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); uint32_t HAL_NAND_Address_Inc(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress); @@ -221,7 +246,6 @@ HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, */ /* NAND State functions *******************************************************/ HAL_NAND_StateTypeDef HAL_NAND_GetState(NAND_HandleTypeDef *hnand); -uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); /** * @} */ @@ -236,34 +260,34 @@ uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); /** @defgroup NAND_Private_Constants NAND Private Constants * @{ */ -#define NAND_DEVICE1 ((uint32_t)0x70000000U) -#define NAND_DEVICE2 ((uint32_t)0x80000000U) -#define NAND_WRITE_TIMEOUT ((uint32_t)0x01000000U) +#define NAND_DEVICE1 0x70000000U +#define NAND_DEVICE2 0x80000000U +#define NAND_WRITE_TIMEOUT 0x01000000U #define CMD_AREA ((uint32_t)(1U<<16U)) /* A16 = CLE high */ #define ADDR_AREA ((uint32_t)(1U<<17U)) /* A17 = ALE high */ -#define NAND_CMD_AREA_A ((uint8_t)0x00U) -#define NAND_CMD_AREA_B ((uint8_t)0x01U) -#define NAND_CMD_AREA_C ((uint8_t)0x50U) -#define NAND_CMD_AREA_TRUE1 ((uint8_t)0x30U) +#define NAND_CMD_AREA_A ((uint8_t)0x00) +#define NAND_CMD_AREA_B ((uint8_t)0x01) +#define NAND_CMD_AREA_C ((uint8_t)0x50) +#define NAND_CMD_AREA_TRUE1 ((uint8_t)0x30) -#define NAND_CMD_WRITE0 ((uint8_t)0x80U) -#define NAND_CMD_WRITE_TRUE1 ((uint8_t)0x10U) -#define NAND_CMD_ERASE0 ((uint8_t)0x60U) -#define NAND_CMD_ERASE1 ((uint8_t)0xD0U) -#define NAND_CMD_READID ((uint8_t)0x90U) -#define NAND_CMD_STATUS ((uint8_t)0x70U) -#define NAND_CMD_LOCK_STATUS ((uint8_t)0x7AU) -#define NAND_CMD_RESET ((uint8_t)0xFFU) +#define NAND_CMD_WRITE0 ((uint8_t)0x80) +#define NAND_CMD_WRITE_TRUE1 ((uint8_t)0x10) +#define NAND_CMD_ERASE0 ((uint8_t)0x60) +#define NAND_CMD_ERASE1 ((uint8_t)0xD0) +#define NAND_CMD_READID ((uint8_t)0x90) +#define NAND_CMD_STATUS ((uint8_t)0x70) +#define NAND_CMD_LOCK_STATUS ((uint8_t)0x7A) +#define NAND_CMD_RESET ((uint8_t)0xFF) /* NAND memory status */ -#define NAND_VALID_ADDRESS ((uint32_t)0x00000100U) -#define NAND_INVALID_ADDRESS ((uint32_t)0x00000200U) -#define NAND_TIMEOUT_ERROR ((uint32_t)0x00000400U) -#define NAND_BUSY ((uint32_t)0x00000000U) -#define NAND_ERROR ((uint32_t)0x00000001U) -#define NAND_READY ((uint32_t)0x00000040U) +#define NAND_VALID_ADDRESS 0x00000100U +#define NAND_INVALID_ADDRESS 0x00000200U +#define NAND_TIMEOUT_ERROR 0x00000400U +#define NAND_BUSY 0x00000000U +#define NAND_ERROR 0x00000001U +#define NAND_READY 0x00000040U /** * @} */ @@ -280,17 +304,33 @@ uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); * @retval NAND Raw address value */ #define ARRAY_ADDRESS(__ADDRESS__ , __HANDLE__) ((__ADDRESS__)->Page + \ - (((__ADDRESS__)->Block + (((__ADDRESS__)->Zone) * ((__HANDLE__)->Info.ZoneSize)))* ((__HANDLE__)->Info.BlockSize))) + (((__ADDRESS__)->Block + (((__ADDRESS__)->Plane) * ((__HANDLE__)->Config.PlaneSize)))* ((__HANDLE__)->Config.BlockSize))) + +/** + * @brief NAND memory Column address computation. + * @param __HANDLE__: NAND handle. + * @retval NAND Raw address value + */ +#define COLUMN_ADDRESS( __HANDLE__) ((__HANDLE__)->Config.PageSize) /** * @brief NAND memory address cycling. * @param __ADDRESS__: NAND memory address. * @retval NAND address cycling value. */ -#define ADDR_1ST_CYCLE(__ADDRESS__) (uint8_t)(__ADDRESS__) /* 1st addressing cycle */ -#define ADDR_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8U) /* 2nd addressing cycle */ -#define ADDR_3RD_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 16U) /* 3rd addressing cycle */ -#define ADDR_4TH_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 24U) /* 4th addressing cycle */ +#define ADDR_1ST_CYCLE(__ADDRESS__) (uint8_t)(__ADDRESS__) /* 1st addressing cycle */ +#define ADDR_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8) /* 2nd addressing cycle */ +#define ADDR_3RD_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 16) /* 3rd addressing cycle */ +#define ADDR_4TH_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 24) /* 4th addressing cycle */ + +/** + * @brief NAND memory Columns cycling. + * @param __ADDRESS__: NAND memory address. + * @retval NAND Column address cycling value. + */ +#define COLUMN_1ST_CYCLE(__ADDRESS__) (uint8_t)(__ADDRESS__) /* 1st Column addressing cycle */ +#define COLUMN_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8) /* 2nd Column addressing cycle */ + /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h index 1c30554..be85472 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_nor.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_nor.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of NOR HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -232,29 +232,29 @@ HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Addres * @{ */ /* NOR device IDs addresses */ -#define MC_ADDRESS ((uint16_t)0x0000U) -#define DEVICE_CODE1_ADDR ((uint16_t)0x0001U) -#define DEVICE_CODE2_ADDR ((uint16_t)0x000EU) -#define DEVICE_CODE3_ADDR ((uint16_t)0x000FU) +#define MC_ADDRESS ((uint16_t)0x0000) +#define DEVICE_CODE1_ADDR ((uint16_t)0x0001) +#define DEVICE_CODE2_ADDR ((uint16_t)0x000E) +#define DEVICE_CODE3_ADDR ((uint16_t)0x000F) /* NOR CFI IDs addresses */ -#define CFI1_ADDRESS ((uint16_t)0x0061U) -#define CFI2_ADDRESS ((uint16_t)0x0062U) -#define CFI3_ADDRESS ((uint16_t)0x0063U) -#define CFI4_ADDRESS ((uint16_t)0x0064U) +#define CFI1_ADDRESS ((uint16_t)0x0061) +#define CFI2_ADDRESS ((uint16_t)0x0062) +#define CFI3_ADDRESS ((uint16_t)0x0063) +#define CFI4_ADDRESS ((uint16_t)0x0064) /* NOR operation wait timeout */ -#define NOR_TMEOUT ((uint16_t)0xFFFFU) +#define NOR_TMEOUT ((uint16_t)0xFFFF) /* NOR memory data width */ -#define NOR_MEMORY_8B ((uint8_t)0x00U) -#define NOR_MEMORY_16B ((uint8_t)0x01U) +#define NOR_MEMORY_8B ((uint8_t)0x00) +#define NOR_MEMORY_16B ((uint8_t)0x01) /* NOR memory device read/write start address */ -#define NOR_MEMORY_ADRESS1 ((uint32_t)0x60000000U) -#define NOR_MEMORY_ADRESS2 ((uint32_t)0x64000000U) -#define NOR_MEMORY_ADRESS3 ((uint32_t)0x68000000U) -#define NOR_MEMORY_ADRESS4 ((uint32_t)0x6C000000U) +#define NOR_MEMORY_ADRESS1 0x60000000U +#define NOR_MEMORY_ADRESS2 0x64000000U +#define NOR_MEMORY_ADRESS3 0x68000000U +#define NOR_MEMORY_ADRESS4 0x6C000000U /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h index bde3a76..b6a2090 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pccard.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_pccard.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of PCCARD HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -172,37 +172,37 @@ HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard); /** @defgroup PCCARD_Private_Constants PCCARD Private Constants * @{ */ -#define PCCARD_DEVICE_ADDRESS ((uint32_t)0x90000000U) -#define PCCARD_ATTRIBUTE_SPACE_ADDRESS ((uint32_t)0x98000000U) /* Attribute space size to @0x9BFF FFFF */ +#define PCCARD_DEVICE_ADDRESS 0x90000000U +#define PCCARD_ATTRIBUTE_SPACE_ADDRESS 0x98000000U /* Attribute space size to @0x9BFF FFFF */ #define PCCARD_COMMON_SPACE_ADDRESS PCCARD_DEVICE_ADDRESS /* Common space size to @0x93FF FFFF */ -#define PCCARD_IO_SPACE_ADDRESS ((uint32_t)0x9C000000U) /* IO space size to @0x9FFF FFFF */ -#define PCCARD_IO_SPACE_PRIMARY_ADDR ((uint32_t)0x9C0001F0U) /* IO space size to @0x9FFF FFFF */ +#define PCCARD_IO_SPACE_ADDRESS 0x9C000000U /* IO space size to @0x9FFF FFFF */ +#define PCCARD_IO_SPACE_PRIMARY_ADDR 0x9C0001F0U /* IO space size to @0x9FFF FFFF */ /* Flash-ATA registers description */ -#define ATA_DATA ((uint8_t)0x00U) /* Data register */ -#define ATA_SECTOR_COUNT ((uint8_t)0x02U) /* Sector Count register */ -#define ATA_SECTOR_NUMBER ((uint8_t)0x03U) /* Sector Number register */ -#define ATA_CYLINDER_LOW ((uint8_t)0x04U) /* Cylinder low register */ -#define ATA_CYLINDER_HIGH ((uint8_t)0x05U) /* Cylinder high register */ -#define ATA_CARD_HEAD ((uint8_t)0x06U) /* Card/Head register */ -#define ATA_STATUS_CMD ((uint8_t)0x07U) /* Status(read)/Command(write) register */ -#define ATA_STATUS_CMD_ALTERNATE ((uint8_t)0x0EU) /* Alternate Status(read)/Command(write) register */ -#define ATA_COMMON_DATA_AREA ((uint16_t)0x0400U) /* Start of data area (for Common access only!) */ -#define ATA_CARD_CONFIGURATION ((uint16_t)0x0202U) /* Card Configuration and Status Register */ +#define ATA_DATA ((uint8_t)0x00) /* Data register */ +#define ATA_SECTOR_COUNT ((uint8_t)0x02) /* Sector Count register */ +#define ATA_SECTOR_NUMBER ((uint8_t)0x03) /* Sector Number register */ +#define ATA_CYLINDER_LOW ((uint8_t)0x04) /* Cylinder low register */ +#define ATA_CYLINDER_HIGH ((uint8_t)0x05) /* Cylinder high register */ +#define ATA_CARD_HEAD ((uint8_t)0x06) /* Card/Head register */ +#define ATA_STATUS_CMD ((uint8_t)0x07) /* Status(read)/Command(write) register */ +#define ATA_STATUS_CMD_ALTERNATE ((uint8_t)0x0E) /* Alternate Status(read)/Command(write) register */ +#define ATA_COMMON_DATA_AREA ((uint16_t)0x0400) /* Start of data area (for Common access only!) */ +#define ATA_CARD_CONFIGURATION ((uint16_t)0x0202) /* Card Configuration and Status Register */ /* Flash-ATA commands */ -#define ATA_READ_SECTOR_CMD ((uint8_t)0x20U) -#define ATA_WRITE_SECTOR_CMD ((uint8_t)0x30U) +#define ATA_READ_SECTOR_CMD ((uint8_t)0x20) +#define ATA_WRITE_SECTOR_CMD ((uint8_t)0x30) #define ATA_ERASE_SECTOR_CMD ((uint8_t)0xC0) #define ATA_IDENTIFY_CMD ((uint8_t)0xEC) /* PC Card/Compact Flash status */ -#define PCCARD_TIMEOUT_ERROR ((uint8_t)0x60U) -#define PCCARD_BUSY ((uint8_t)0x80U) -#define PCCARD_PROGR ((uint8_t)0x01U) -#define PCCARD_READY ((uint8_t)0x40U) +#define PCCARD_TIMEOUT_ERROR ((uint8_t)0x60) +#define PCCARD_BUSY ((uint8_t)0x80) +#define PCCARD_PROGR ((uint8_t)0x01) +#define PCCARD_READY ((uint8_t)0x40) -#define PCCARD_SECTOR_SIZE ((uint32_t)255U) /* In half words */ +#define PCCARD_SECTOR_SIZE 255U /* In half words */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h index 36d02de..f6de734 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_pcd.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of PCD HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -82,7 +82,7 @@ typedef enum LPM_L0 = 0x00U, /* on */ LPM_L1 = 0x01U, /* LPM L1 sleep */ LPM_L2 = 0x02U, /* suspend */ - LPM_L3 = 0x03U /* off */ + LPM_L3 = 0x03U /* off */ }PCD_LPM_StateTypeDef; #endif /* USB_OTG_GLPMCFG_LPMEN */ @@ -97,11 +97,11 @@ typedef struct { PCD_TypeDef *Instance; /*!< Register base address */ PCD_InitTypeDef Init; /*!< PCD required parameters */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + PCD_EPTypeDef IN_ep[16U]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16U]; /*!< OUT endpoint parameters */ HAL_LockTypeDef Lock; /*!< PCD peripheral status */ __IO PCD_StateTypeDef State; /*!< PCD communication state */ - uint32_t Setup[12]; /*!< Setup packet buffer */ + uint32_t Setup[12U]; /*!< Setup packet buffer */ #ifdef USB_OTG_GLPMCFG_LPMEN PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ uint32_t BESL; @@ -182,16 +182,16 @@ typedef struct #define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE))&0x10U) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE ((uint32_t)0x08U) -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE ((uint32_t)0x0CU) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE ((uint32_t)0x10U) +#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U +#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU +#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE ((uint32_t)0x08U) -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE ((uint32_t)0x0CU) -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE ((uint32_t)0x10U) +#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE 0x08U +#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE 0x0CU +#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U -#define USB_OTG_HS_WAKEUP_EXTI_LINE ((uint32_t)0x00100000U) /*!< External interrupt line 20 Connected to the USB HS EXTI Line */ -#define USB_OTG_FS_WAKEUP_EXTI_LINE ((uint32_t)0x00040000U) /*!< External interrupt line 18 Connected to the USB FS EXTI Line */ +#define USB_OTG_HS_WAKEUP_EXTI_LINE 0x00100000U /*!< External interrupt line 20 Connected to the USB HS EXTI Line */ +#define USB_OTG_FS_WAKEUP_EXTI_LINE 0x00040000U /*!< External interrupt line 18 Connected to the USB FS EXTI Line */ #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) @@ -200,17 +200,17 @@ typedef struct #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() do{EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\ - }while(0) + }while(0U) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE() do{EXTI->FTSR |= (USB_OTG_HS_WAKEUP_EXTI_LINE);\ EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ - }while(0) + }while(0U) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE() do{EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\ EXTI->FTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\ - }while(0) + }while(0U) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT() (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE) @@ -221,17 +221,17 @@ typedef struct #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() do{EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\ - }while(0) + }while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE() do{EXTI->FTSR |= (USB_OTG_FS_WAKEUP_EXTI_LINE);\ EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ - }while(0) + }while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE() do{EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\ EXTI->FTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\ - }while(0) + }while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT() (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE) /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h index af2b328..e714480 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_pcd_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of PCD HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h index 6955389..b32a012 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_pwr.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of PWR HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -84,7 +84,7 @@ typedef struct /** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins * @{ */ -#define PWR_WAKEUP_PIN1 ((uint32_t)0x00000100U) +#define PWR_WAKEUP_PIN1 0x00000100U /** * @} */ @@ -108,13 +108,13 @@ typedef struct /** @defgroup PWR_PVD_Mode PWR PVD Mode * @{ */ -#define PWR_PVD_MODE_NORMAL ((uint32_t)0x00000000U) /*!< basic mode is used */ -#define PWR_PVD_MODE_IT_RISING ((uint32_t)0x00010001U) /*!< External Interrupt Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_IT_FALLING ((uint32_t)0x00010002U) /*!< External Interrupt Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_IT_RISING_FALLING ((uint32_t)0x00010003U) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING ((uint32_t)0x00020001U) /*!< Event Mode with Rising edge trigger detection */ -#define PWR_PVD_MODE_EVENT_FALLING ((uint32_t)0x00020002U) /*!< Event Mode with Falling edge trigger detection */ -#define PWR_PVD_MODE_EVENT_RISING_FALLING ((uint32_t)0x00020003U) /*!< Event Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ +#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ /** * @} */ @@ -123,7 +123,7 @@ typedef struct /** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode * @{ */ -#define PWR_MAINREGULATOR_ON ((uint32_t)0x00000000U) +#define PWR_MAINREGULATOR_ON 0x00000000U #define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS /** * @} @@ -132,8 +132,8 @@ typedef struct /** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry * @{ */ -#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01U) -#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02U) +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) /** * @} */ @@ -141,8 +141,8 @@ typedef struct /** @defgroup PWR_STOP_mode_entry PWR STOP mode entry * @{ */ -#define PWR_STOPENTRY_WFI ((uint8_t)0x01U) -#define PWR_STOPENTRY_WFE ((uint8_t)0x02U) +#define PWR_STOPENTRY_WFI ((uint8_t)0x01) +#define PWR_STOPENTRY_WFE ((uint8_t)0x02) /** * @} */ @@ -255,7 +255,7 @@ typedef struct */ #define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ - }while(0) + }while(0U) /** * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. @@ -264,7 +264,7 @@ typedef struct */ #define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ - }while(0) + }while(0U) /** * @brief checks whether the specified PVD Exti interrupt flag is set or not. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h index dc30095..d57bf4b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_pwr_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of PWR HAL Extension module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -87,7 +87,7 @@ */ #if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) #define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ -#define PWR_REGULATOR_VOLTAGE_SCALE2 ((uint32_t)0x00000000U) /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ #else #define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to 180 MHz by activating the over-drive mode. */ @@ -103,10 +103,10 @@ /** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins * @{ */ -#define PWR_WAKEUP_PIN2 ((uint32_t)0x00000080U) +#define PWR_WAKEUP_PIN2 0x00000080U #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -#define PWR_WAKEUP_PIN3 ((uint32_t)0x00000040U) +#define PWR_WAKEUP_PIN3 0x00000040U #endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ /** @@ -140,7 +140,7 @@ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ UNUSED(tmpreg); \ - } while(0) + } while(0U) #else /** @brief macros configure the main internal regulator output voltage. * @param __REGULATOR__: specifies the regulator output voltage to achieve @@ -158,7 +158,7 @@ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_qspi.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_qspi.h index 2bd75ba..30d1f04 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_qspi.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_qspi.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_qspi.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of QSPI HAL module. ****************************************************************************** * @attention * - *

      © COPYRIGHT(c) 2016 STMicroelectronics

      + *

      © COPYRIGHT(c) 2017 STMicroelectronics

      * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -121,11 +121,11 @@ typedef struct QUADSPI_TypeDef *Instance; /* QSPI registers base address */ QSPI_InitTypeDef Init; /* QSPI communication parameters */ uint8_t *pTxBuffPtr; /* Pointer to QSPI Tx transfer Buffer */ - __IO uint16_t TxXferSize; /* QSPI Tx Transfer size */ - __IO uint16_t TxXferCount; /* QSPI Tx Transfer Counter */ + __IO uint32_t TxXferSize; /* QSPI Tx Transfer size */ + __IO uint32_t TxXferCount; /* QSPI Tx Transfer Counter */ uint8_t *pRxBuffPtr; /* Pointer to QSPI Rx transfer Buffer */ - __IO uint16_t RxXferSize; /* QSPI Rx Transfer size */ - __IO uint16_t RxXferCount; /* QSPI Rx Transfer Counter */ + __IO uint32_t RxXferSize; /* QSPI Rx Transfer size */ + __IO uint32_t RxXferCount; /* QSPI Rx Transfer Counter */ DMA_HandleTypeDef *hdma; /* QSPI Rx/Tx DMA Handle parameters */ __IO HAL_LockTypeDef Lock; /* Locking object */ __IO HAL_QSPI_StateTypeDef State; /* QSPI communication state */ @@ -210,11 +210,11 @@ typedef struct /** @defgroup QSPI_ErrorCode QSPI Error Code * @{ */ -#define HAL_QSPI_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_QSPI_ERROR_TIMEOUT ((uint32_t)0x00000001U) /*!< Timeout error */ -#define HAL_QSPI_ERROR_TRANSFER ((uint32_t)0x00000002U) /*!< Transfer error */ -#define HAL_QSPI_ERROR_DMA ((uint32_t)0x00000004U) /*!< DMA transfer error */ -#define HAL_QSPI_ERROR_INVALID_PARAM ((uint32_t)0x00000008U) /*!< Invalid parameters error */ +#define HAL_QSPI_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_QSPI_ERROR_TIMEOUT 0x00000001U /*!< Timeout error */ +#define HAL_QSPI_ERROR_TRANSFER 0x00000002U /*!< Transfer error */ +#define HAL_QSPI_ERROR_DMA 0x00000004U /*!< DMA transfer error */ +#define HAL_QSPI_ERROR_INVALID_PARAM 0x00000008U /*!< Invalid parameters error */ /** * @} */ @@ -222,7 +222,7 @@ typedef struct /** @defgroup QSPI_SampleShifting QSPI Sample Shifting * @{ */ -#define QSPI_SAMPLE_SHIFTING_NONE ((uint32_t)0x00000000U) /*!
      © COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -123,11 +123,11 @@ typedef struct /** @defgroup RCC_Oscillator_Type Oscillator Type * @{ */ -#define RCC_OSCILLATORTYPE_NONE ((uint32_t)0x00000000U) -#define RCC_OSCILLATORTYPE_HSE ((uint32_t)0x00000001U) -#define RCC_OSCILLATORTYPE_HSI ((uint32_t)0x00000002U) -#define RCC_OSCILLATORTYPE_LSE ((uint32_t)0x00000004U) -#define RCC_OSCILLATORTYPE_LSI ((uint32_t)0x00000008U) +#define RCC_OSCILLATORTYPE_NONE 0x00000000U +#define RCC_OSCILLATORTYPE_HSE 0x00000001U +#define RCC_OSCILLATORTYPE_HSI 0x00000002U +#define RCC_OSCILLATORTYPE_LSE 0x00000004U +#define RCC_OSCILLATORTYPE_LSI 0x00000008U /** * @} */ @@ -135,7 +135,7 @@ typedef struct /** @defgroup RCC_HSE_Config HSE Config * @{ */ -#define RCC_HSE_OFF ((uint32_t)0x00000000U) +#define RCC_HSE_OFF 0x00000000U #define RCC_HSE_ON RCC_CR_HSEON #define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) /** @@ -145,7 +145,7 @@ typedef struct /** @defgroup RCC_LSE_Config LSE Config * @{ */ -#define RCC_LSE_OFF ((uint32_t)0x00000000U) +#define RCC_LSE_OFF 0x00000000U #define RCC_LSE_ON RCC_BDCR_LSEON #define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) /** @@ -155,10 +155,10 @@ typedef struct /** @defgroup RCC_HSI_Config HSI Config * @{ */ -#define RCC_HSI_OFF ((uint8_t)0x00U) -#define RCC_HSI_ON ((uint8_t)0x01U) +#define RCC_HSI_OFF ((uint8_t)0x00) +#define RCC_HSI_ON ((uint8_t)0x01) -#define RCC_HSICALIBRATION_DEFAULT ((uint32_t)0x10U) /* Default HSI calibration trimming value */ +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ /** * @} */ @@ -166,8 +166,8 @@ typedef struct /** @defgroup RCC_LSI_Config LSI Config * @{ */ -#define RCC_LSI_OFF ((uint8_t)0x00U) -#define RCC_LSI_ON ((uint8_t)0x01U) +#define RCC_LSI_OFF ((uint8_t)0x00) +#define RCC_LSI_ON ((uint8_t)0x01) /** * @} */ @@ -175,9 +175,9 @@ typedef struct /** @defgroup RCC_PLL_Config PLL Config * @{ */ -#define RCC_PLL_NONE ((uint8_t)0x00U) -#define RCC_PLL_OFF ((uint8_t)0x01U) -#define RCC_PLL_ON ((uint8_t)0x02U) +#define RCC_PLL_NONE ((uint8_t)0x00) +#define RCC_PLL_OFF ((uint8_t)0x01) +#define RCC_PLL_ON ((uint8_t)0x02) /** * @} */ @@ -185,10 +185,10 @@ typedef struct /** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider * @{ */ -#define RCC_PLLP_DIV2 ((uint32_t)0x00000002U) -#define RCC_PLLP_DIV4 ((uint32_t)0x00000004U) -#define RCC_PLLP_DIV6 ((uint32_t)0x00000006U) -#define RCC_PLLP_DIV8 ((uint32_t)0x00000008U) +#define RCC_PLLP_DIV2 0x00000002U +#define RCC_PLLP_DIV4 0x00000004U +#define RCC_PLLP_DIV6 0x00000006U +#define RCC_PLLP_DIV8 0x00000008U /** * @} */ @@ -205,10 +205,10 @@ typedef struct /** @defgroup RCC_System_Clock_Type System Clock Type * @{ */ -#define RCC_CLOCKTYPE_SYSCLK ((uint32_t)0x00000001U) -#define RCC_CLOCKTYPE_HCLK ((uint32_t)0x00000002U) -#define RCC_CLOCKTYPE_PCLK1 ((uint32_t)0x00000004U) -#define RCC_CLOCKTYPE_PCLK2 ((uint32_t)0x00000008U) +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U +#define RCC_CLOCKTYPE_HCLK 0x00000002U +#define RCC_CLOCKTYPE_PCLK1 0x00000004U +#define RCC_CLOCKTYPE_PCLK2 0x00000008U /** * @} */ @@ -270,38 +270,38 @@ typedef struct /** @defgroup RCC_RTC_Clock_Source RTC Clock Source * @{ */ -#define RCC_RTCCLKSOURCE_LSE ((uint32_t)0x00000100U) -#define RCC_RTCCLKSOURCE_LSI ((uint32_t)0x00000200U) -#define RCC_RTCCLKSOURCE_HSE_DIV2 ((uint32_t)0x00020300U) -#define RCC_RTCCLKSOURCE_HSE_DIV3 ((uint32_t)0x00030300U) -#define RCC_RTCCLKSOURCE_HSE_DIV4 ((uint32_t)0x00040300U) -#define RCC_RTCCLKSOURCE_HSE_DIV5 ((uint32_t)0x00050300U) -#define RCC_RTCCLKSOURCE_HSE_DIV6 ((uint32_t)0x00060300U) -#define RCC_RTCCLKSOURCE_HSE_DIV7 ((uint32_t)0x00070300U) -#define RCC_RTCCLKSOURCE_HSE_DIV8 ((uint32_t)0x00080300U) -#define RCC_RTCCLKSOURCE_HSE_DIV9 ((uint32_t)0x00090300U) -#define RCC_RTCCLKSOURCE_HSE_DIV10 ((uint32_t)0x000A0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV11 ((uint32_t)0x000B0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV12 ((uint32_t)0x000C0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV13 ((uint32_t)0x000D0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV14 ((uint32_t)0x000E0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV15 ((uint32_t)0x000F0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV16 ((uint32_t)0x00100300U) -#define RCC_RTCCLKSOURCE_HSE_DIV17 ((uint32_t)0x00110300U) -#define RCC_RTCCLKSOURCE_HSE_DIV18 ((uint32_t)0x00120300U) -#define RCC_RTCCLKSOURCE_HSE_DIV19 ((uint32_t)0x00130300U) -#define RCC_RTCCLKSOURCE_HSE_DIV20 ((uint32_t)0x00140300U) -#define RCC_RTCCLKSOURCE_HSE_DIV21 ((uint32_t)0x00150300U) -#define RCC_RTCCLKSOURCE_HSE_DIV22 ((uint32_t)0x00160300U) -#define RCC_RTCCLKSOURCE_HSE_DIV23 ((uint32_t)0x00170300U) -#define RCC_RTCCLKSOURCE_HSE_DIV24 ((uint32_t)0x00180300U) -#define RCC_RTCCLKSOURCE_HSE_DIV25 ((uint32_t)0x00190300U) -#define RCC_RTCCLKSOURCE_HSE_DIV26 ((uint32_t)0x001A0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV27 ((uint32_t)0x001B0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV28 ((uint32_t)0x001C0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV29 ((uint32_t)0x001D0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV30 ((uint32_t)0x001E0300U) -#define RCC_RTCCLKSOURCE_HSE_DIV31 ((uint32_t)0x001F0300U) +#define RCC_RTCCLKSOURCE_LSE 0x00000100U +#define RCC_RTCCLKSOURCE_LSI 0x00000200U +#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U +#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U +#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U +#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U +#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U +#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U +#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U +#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U +#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U +#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U +#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U +#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U +#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U +#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U +#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U +#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U +#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U +#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U +#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U +#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U /** * @} */ @@ -309,8 +309,8 @@ typedef struct /** @defgroup RCC_MCO_Index MCO Index * @{ */ -#define RCC_MCO1 ((uint32_t)0x00000000U) -#define RCC_MCO2 ((uint32_t)0x00000001U) +#define RCC_MCO1 0x00000000U +#define RCC_MCO2 0x00000001U /** * @} */ @@ -318,7 +318,7 @@ typedef struct /** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source * @{ */ -#define RCC_MCO1SOURCE_HSI ((uint32_t)0x00000000U) +#define RCC_MCO1SOURCE_HSI 0x00000000U #define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 #define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 #define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 @@ -329,7 +329,7 @@ typedef struct /** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler * @{ */ -#define RCC_MCODIV_1 ((uint32_t)0x00000000U) +#define RCC_MCODIV_1 0x00000000U #define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 #define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) #define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) @@ -341,13 +341,13 @@ typedef struct /** @defgroup RCC_Interrupt Interrupts * @{ */ -#define RCC_IT_LSIRDY ((uint8_t)0x01U) -#define RCC_IT_LSERDY ((uint8_t)0x02U) -#define RCC_IT_HSIRDY ((uint8_t)0x04U) -#define RCC_IT_HSERDY ((uint8_t)0x08U) -#define RCC_IT_PLLRDY ((uint8_t)0x10U) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20U) -#define RCC_IT_CSS ((uint8_t)0x80U) +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) +#define RCC_IT_CSS ((uint8_t)0x80) /** * @} */ @@ -362,23 +362,23 @@ typedef struct * @{ */ /* Flags in the CR register */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21U) -#define RCC_FLAG_HSERDY ((uint8_t)0x31U) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39U) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3BU) +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) /* Flags in the BDCR register */ -#define RCC_FLAG_LSERDY ((uint8_t)0x41U) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) /* Flags in the CSR register */ -#define RCC_FLAG_LSIRDY ((uint8_t)0x61U) -#define RCC_FLAG_BORRST ((uint8_t)0x79U) -#define RCC_FLAG_PINRST ((uint8_t)0x7AU) -#define RCC_FLAG_PORRST ((uint8_t)0x7BU) -#define RCC_FLAG_SFTRST ((uint8_t)0x7CU) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7DU) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7EU) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7FU) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_BORRST ((uint8_t)0x79) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) /** * @} */ @@ -405,42 +405,42 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DMA1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DMA2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) #define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) @@ -489,49 +489,49 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_WWDG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_PWR_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) #define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) @@ -583,56 +583,56 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART6_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM9_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM11_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) #define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) @@ -924,7 +924,7 @@ typedef struct CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ } \ - } while(0) + } while(0U) /** * @} */ @@ -967,7 +967,7 @@ typedef struct CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ } \ - } while(0) + } while(0U) /** * @} */ @@ -1008,7 +1008,7 @@ typedef struct #define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ - } while (0) + } while(0U) /** @brief Macros to force or release the Backup domain reset. * @note This function resets the RTC peripheral (including the backup registers) @@ -1225,7 +1225,7 @@ typedef struct * @retval The new state of __FLAG__ (TRUE or FALSE). */ #define RCC_FLAG_MASK ((uint8_t)0x1FU) -#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & ((uint32_t)1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) /** * @} @@ -1319,7 +1319,7 @@ void HAL_RCC_CSSCallback(void); #define RCC_CSR_LSION_BB (PERIPH_BB_BASE + (RCC_CSR_OFFSET * 32U) + (RCC_LSION_BIT_NUMBER * 4U)) /* CR register byte 3 (Bits[23:16]) base address */ -#define RCC_CR_BYTE2_ADDRESS ((uint32_t)0x40023802U) +#define RCC_CR_BYTE2_ADDRESS 0x40023802U /* CIR register byte 2 (Bits[15:8]) base address */ #define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + 0x0CU + 0x01U)) @@ -1330,12 +1330,12 @@ void HAL_RCC_CSSCallback(void); /* BDCR register base address */ #define RCC_BDCR_BYTE0_ADDRESS (PERIPH_BASE + RCC_BDCR_OFFSET) -#define RCC_DBP_TIMEOUT_VALUE ((uint32_t)2U) +#define RCC_DBP_TIMEOUT_VALUE 2U #define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT #define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT -#define HSI_TIMEOUT_VALUE ((uint32_t)2U) /* 2 ms */ -#define LSI_TIMEOUT_VALUE ((uint32_t)2U) /* 2 ms */ +#define HSI_TIMEOUT_VALUE 2U /* 2 ms */ +#define LSI_TIMEOUT_VALUE 2U /* 2 ms */ /** * @} @@ -1412,7 +1412,7 @@ void HAL_RCC_CSSCallback(void); #define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2U) || ((VALUE) == 4U) || ((VALUE) == 6U) || ((VALUE) == 8U)) -#define IS_RCC_PLLQ_VALUE(VALUE) ((4U <= (VALUE)) && ((VALUE) <= 15U)) +#define IS_RCC_PLLQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) #define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_DIV1) || ((HCLK) == RCC_SYSCLK_DIV2) || \ ((HCLK) == RCC_SYSCLK_DIV4) || ((HCLK) == RCC_SYSCLK_DIV8) || \ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h index 9638396..f7e3fb2 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_rcc_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of RCC HAL Extension module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -81,7 +81,7 @@ typedef struct This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. - This parameter must be a number between Min_Data = 4 and Max_Data = 15 */ + This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ defined(STM32F413xx) || defined(STM32F423xx) @@ -451,88 +451,88 @@ typedef struct /* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_I2S_APB1 ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_I2S_APB2 ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000004U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000008U) -#define RCC_PERIPHCLK_FMPI2C1 ((uint32_t)0x00000010U) -#define RCC_PERIPHCLK_CLK48 ((uint32_t)0x00000020U) -#define RCC_PERIPHCLK_SDIO ((uint32_t)0x00000040U) -#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000080U) -#define RCC_PERIPHCLK_DFSDM1 ((uint32_t)0x00000100U) -#define RCC_PERIPHCLK_DFSDM1_AUDIO ((uint32_t)0x00000200U) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_TIM 0x00000004U +#define RCC_PERIPHCLK_RTC 0x00000008U +#define RCC_PERIPHCLK_FMPI2C1 0x00000010U +#define RCC_PERIPHCLK_CLK48 0x00000020U +#define RCC_PERIPHCLK_SDIO 0x00000040U +#define RCC_PERIPHCLK_PLLI2S 0x00000080U +#define RCC_PERIPHCLK_DFSDM1 0x00000100U +#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U #endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ #if defined(STM32F413xx) || defined(STM32F423xx) -#define RCC_PERIPHCLK_DFSDM2 ((uint32_t)0x00000400U) -#define RCC_PERIPHCLK_DFSDM2_AUDIO ((uint32_t)0x00000800U) -#define RCC_PERIPHCLK_LPTIM1 ((uint32_t)0x00001000U) -#define RCC_PERIPHCLK_SAIA ((uint32_t)0x00002000U) -#define RCC_PERIPHCLK_SAIB ((uint32_t)0x00004000U) +#define RCC_PERIPHCLK_DFSDM2 0x00000400U +#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U +#define RCC_PERIPHCLK_LPTIM1 0x00001000U +#define RCC_PERIPHCLK_SAIA 0x00002000U +#define RCC_PERIPHCLK_SAIB 0x00004000U #endif /* STM32F413xx || STM32F423xx */ /*----------------------------------------------------------------------------*/ /*------------------- Peripheral Clock source for STM32F410xx ----------------*/ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define RCC_PERIPHCLK_I2S ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000004U) -#define RCC_PERIPHCLK_FMPI2C1 ((uint32_t)0x00000008U) -#define RCC_PERIPHCLK_LPTIM1 ((uint32_t)0x00000010U) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_TIM 0x00000002U +#define RCC_PERIPHCLK_RTC 0x00000004U +#define RCC_PERIPHCLK_FMPI2C1 0x00000008U +#define RCC_PERIPHCLK_LPTIM1 0x00000010U #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ /*----------------------------------------------------------------------------*/ /*------------------- Peripheral Clock source for STM32F446xx ----------------*/ #if defined(STM32F446xx) -#define RCC_PERIPHCLK_I2S_APB1 ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_I2S_APB2 ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_SAI1 ((uint32_t)0x00000004U) -#define RCC_PERIPHCLK_SAI2 ((uint32_t)0x00000008U) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000010U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000020U) -#define RCC_PERIPHCLK_CEC ((uint32_t)0x00000040U) -#define RCC_PERIPHCLK_FMPI2C1 ((uint32_t)0x00000080U) -#define RCC_PERIPHCLK_CLK48 ((uint32_t)0x00000100U) -#define RCC_PERIPHCLK_SDIO ((uint32_t)0x00000200U) -#define RCC_PERIPHCLK_SPDIFRX ((uint32_t)0x00000400U) -#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000800U) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_SAI1 0x00000004U +#define RCC_PERIPHCLK_SAI2 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_CEC 0x00000040U +#define RCC_PERIPHCLK_FMPI2C1 0x00000080U +#define RCC_PERIPHCLK_CLK48 0x00000100U +#define RCC_PERIPHCLK_SDIO 0x00000200U +#define RCC_PERIPHCLK_SPDIFRX 0x00000400U +#define RCC_PERIPHCLK_PLLI2S 0x00000800U #endif /* STM32F446xx */ /*-----------------------------------------------------------------------------*/ /*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ #if defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PERIPHCLK_I2S ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_SAI_PLLI2S ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_SAI_PLLSAI ((uint32_t)0x00000004U) -#define RCC_PERIPHCLK_LTDC ((uint32_t)0x00000008U) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000010U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000020U) -#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000040U) -#define RCC_PERIPHCLK_CLK48 ((uint32_t)0x00000080U) -#define RCC_PERIPHCLK_SDIO ((uint32_t)0x00000100U) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#define RCC_PERIPHCLK_CLK48 0x00000080U +#define RCC_PERIPHCLK_SDIO 0x00000100U #endif /* STM32F469xx || STM32F479xx */ /*----------------------------------------------------------------------------*/ /*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) -#define RCC_PERIPHCLK_I2S ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_SAI_PLLI2S ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_SAI_PLLSAI ((uint32_t)0x00000004U) -#define RCC_PERIPHCLK_LTDC ((uint32_t)0x00000008U) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000010U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000020U) -#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000040U) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ /*----------------------------------------------------------------------------*/ /*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_I2S ((uint32_t)0x00000001U) -#define RCC_PERIPHCLK_RTC ((uint32_t)0x00000002U) -#define RCC_PERIPHCLK_PLLI2S ((uint32_t)0x00000004U) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_RTC 0x00000002U +#define RCC_PERIPHCLK_PLLI2S 0x00000004U #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ #if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define RCC_PERIPHCLK_TIM ((uint32_t)0x00000008U) +#define RCC_PERIPHCLK_TIM 0x00000008U #endif /* STM32F401xC || STM32F401xE || STM32F411xE */ /*----------------------------------------------------------------------------*/ /** @@ -540,30 +540,28 @@ typedef struct */ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) /** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source * @{ */ -#define RCC_I2SCLKSOURCE_PLLI2S ((uint32_t)0x00000000U) -#define RCC_I2SCLKSOURCE_EXT ((uint32_t)0x00000001U) +#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SCLKSOURCE_EXT 0x00000001U /** * @} */ #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */ /** @defgroup RCCEx_PLLSAI_DIVR RCC PLLSAI DIVR * @{ */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIDIVR_2 ((uint32_t)0x00000000U) -#define RCC_PLLSAIDIVR_4 ((uint32_t)0x00010000U) -#define RCC_PLLSAIDIVR_8 ((uint32_t)0x00020000U) -#define RCC_PLLSAIDIVR_16 ((uint32_t)0x00030000U) +#define RCC_PLLSAIDIVR_2 0x00000000U +#define RCC_PLLSAIDIVR_4 0x00010000U +#define RCC_PLLSAIDIVR_8 0x00020000U +#define RCC_PLLSAIDIVR_16 0x00030000U #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ /** * @} @@ -574,10 +572,10 @@ typedef struct */ #if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) -#define RCC_PLLI2SP_DIV2 ((uint32_t)0x00000002U) -#define RCC_PLLI2SP_DIV4 ((uint32_t)0x00000004U) -#define RCC_PLLI2SP_DIV6 ((uint32_t)0x00000006U) -#define RCC_PLLI2SP_DIV8 ((uint32_t)0x00000008U) +#define RCC_PLLI2SP_DIV2 0x00000002U +#define RCC_PLLI2SP_DIV4 0x00000004U +#define RCC_PLLI2SP_DIV6 0x00000006U +#define RCC_PLLI2SP_DIV8 0x00000008U #endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ /** * @} @@ -587,10 +585,10 @@ typedef struct * @{ */ #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#define RCC_PLLSAIP_DIV2 ((uint32_t)0x00000002U) -#define RCC_PLLSAIP_DIV4 ((uint32_t)0x00000004U) -#define RCC_PLLSAIP_DIV6 ((uint32_t)0x00000006U) -#define RCC_PLLSAIP_DIV8 ((uint32_t)0x00000008U) +#define RCC_PLLSAIP_DIV2 0x00000002U +#define RCC_PLLSAIP_DIV4 0x00000004U +#define RCC_PLLSAIP_DIV6 0x00000006U +#define RCC_PLLSAIP_DIV8 0x00000008U #endif /* STM32F446xx || STM32F469xx || STM32F479xx */ /** * @} @@ -600,9 +598,9 @@ typedef struct /** @defgroup RCCEx_SAI_BlockA_Clock_Source RCC SAI BlockA Clock Source * @{ */ -#define RCC_SAIACLKSOURCE_PLLSAI ((uint32_t)0x00000000U) -#define RCC_SAIACLKSOURCE_PLLI2S ((uint32_t)0x00100000U) -#define RCC_SAIACLKSOURCE_EXT ((uint32_t)0x00200000U) +#define RCC_SAIACLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIACLKSOURCE_PLLI2S 0x00100000U +#define RCC_SAIACLKSOURCE_EXT 0x00200000U /** * @} */ @@ -610,9 +608,9 @@ typedef struct /** @defgroup RCCEx_SAI_BlockB_Clock_Source RCC SAI BlockB Clock Source * @{ */ -#define RCC_SAIBCLKSOURCE_PLLSAI ((uint32_t)0x00000000U) -#define RCC_SAIBCLKSOURCE_PLLI2S ((uint32_t)0x00400000U) -#define RCC_SAIBCLKSOURCE_EXT ((uint32_t)0x00800000U) +#define RCC_SAIBCLKSOURCE_PLLSAI 0x00000000U +#define RCC_SAIBCLKSOURCE_PLLI2S 0x00400000U +#define RCC_SAIBCLKSOURCE_EXT 0x00800000U /** * @} */ @@ -622,7 +620,7 @@ typedef struct /** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source * @{ */ -#define RCC_CLK48CLKSOURCE_PLLQ ((uint32_t)0x00000000U) +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U #define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR_CK48MSEL) /** * @} @@ -631,7 +629,7 @@ typedef struct /** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source * @{ */ -#define RCC_SDIOCLKSOURCE_CLK48 ((uint32_t)0x00000000U) +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U #define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_SDIOSEL) /** * @} @@ -640,7 +638,7 @@ typedef struct /** @defgroup RCCEx_DSI_Clock_Source RCC DSI Clock Source * @{ */ -#define RCC_DSICLKSOURCE_DSIPHY ((uint32_t)0x00000000U) +#define RCC_DSICLKSOURCE_DSIPHY 0x00000000U #define RCC_DSICLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_DSISEL) /** * @} @@ -651,7 +649,7 @@ typedef struct /** @defgroup RCCEx_SAI1_Clock_Source RCC SAI1 Clock Source * @{ */ -#define RCC_SAI1CLKSOURCE_PLLSAI ((uint32_t)0x00000000U) +#define RCC_SAI1CLKSOURCE_PLLSAI 0x00000000U #define RCC_SAI1CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI1SRC_0) #define RCC_SAI1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1SRC_1) #define RCC_SAI1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1SRC) @@ -662,7 +660,7 @@ typedef struct /** @defgroup RCCEx_SAI2_Clock_Source RCC SAI2 Clock Source * @{ */ -#define RCC_SAI2CLKSOURCE_PLLSAI ((uint32_t)0x00000000U) +#define RCC_SAI2CLKSOURCE_PLLSAI 0x00000000U #define RCC_SAI2CLKSOURCE_PLLI2S ((uint32_t)RCC_DCKCFGR_SAI2SRC_0) #define RCC_SAI2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI2SRC_1) #define RCC_SAI2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI2SRC) @@ -673,7 +671,7 @@ typedef struct /** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source * @{ */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S ((uint32_t)0x00000000U) +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U #define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) #define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) #define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) @@ -684,7 +682,7 @@ typedef struct /** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source * @{ */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S ((uint32_t)0x00000000U) +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U #define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) #define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) #define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) @@ -695,9 +693,9 @@ typedef struct /** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source * @{ */ -#define RCC_FMPI2C1CLKSOURCE_APB ((uint32_t)0x00000000U) -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) /** * @} */ @@ -705,7 +703,7 @@ typedef struct /** @defgroup RCCEx_CEC_Clock_Source RCC CEC Clock Source * @{ */ -#define RCC_CECCLKSOURCE_HSI ((uint32_t)0x00000000U) +#define RCC_CECCLKSOURCE_HSI 0x00000000U #define RCC_CECCLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_CECSEL) /** * @} @@ -714,7 +712,7 @@ typedef struct /** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source * @{ */ -#define RCC_CLK48CLKSOURCE_PLLQ ((uint32_t)0x00000000U) +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U #define RCC_CLK48CLKSOURCE_PLLSAIP ((uint32_t)RCC_DCKCFGR2_CK48MSEL) /** * @} @@ -723,7 +721,7 @@ typedef struct /** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source * @{ */ -#define RCC_SDIOCLKSOURCE_CLK48 ((uint32_t)0x00000000U) +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U #define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) /** * @} @@ -732,8 +730,8 @@ typedef struct /** @defgroup RCCEx_SPDIFRX_Clock_Source RCC SPDIFRX Clock Source * @{ */ -#define RCC_SPDIFRXCLKSOURCE_PLLR ((uint32_t)0x00000000U) -#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) +#define RCC_SPDIFRXCLKSOURCE_PLLR 0x00000000U +#define RCC_SPDIFRXCLKSOURCE_PLLI2SP ((uint32_t)RCC_DCKCFGR2_SPDIFRXSEL) /** * @} */ @@ -744,7 +742,7 @@ typedef struct /** @defgroup RCCEx_SAI1_BlockA_Clock_Source RCC SAI BlockA Clock Source * @{ */ -#define RCC_SAIACLKSOURCE_PLLI2SR ((uint32_t)0x00000000U) +#define RCC_SAIACLKSOURCE_PLLI2SR 0x00000000U #define RCC_SAIACLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0) #define RCC_SAIACLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1ASRC_1) #define RCC_SAIACLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1ASRC_0 | RCC_DCKCFGR_SAI1ASRC_1) @@ -755,7 +753,7 @@ typedef struct /** @defgroup RCCEx_SAI1_BlockB_Clock_Source RCC SAI BlockB Clock Source * @{ */ -#define RCC_SAIBCLKSOURCE_PLLI2SR ((uint32_t)0x00000000U) +#define RCC_SAIBCLKSOURCE_PLLI2SR 0x00000000U #define RCC_SAIBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0) #define RCC_SAIBCLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_SAI1BSRC_1) #define RCC_SAIBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_SAI1BSRC_0 | RCC_DCKCFGR_SAI1BSRC_1) @@ -766,7 +764,7 @@ typedef struct /** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source * @{ */ -#define RCC_LPTIM1CLKSOURCE_PCLK ((uint32_t)0x00000000U) +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U #define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) #define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) #define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) @@ -778,8 +776,8 @@ typedef struct /** @defgroup RCCEx_DFSDM2_Audio_Clock_Source RCC DFSDM2 Audio Clock Source * @{ */ -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1 ((uint32_t)0x00000000U) -#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM2AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM2ASEL) /** * @} */ @@ -787,8 +785,8 @@ typedef struct /** @defgroup RCCEx_DFSDM2_Kernel_Clock_Source RCC DFSDM2 Kernel Clock Source * @{ */ -#define RCC_DFSDM2CLKSOURCE_APB2 ((uint32_t)0x00000000U) -#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +#define RCC_DFSDM2CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM2CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) /** * @} */ @@ -799,8 +797,8 @@ typedef struct /** @defgroup RCCEx_PLL_I2S_Clock_Source PLL I2S Clock Source * @{ */ -#define RCC_PLLI2SCLKSOURCE_PLLSRC ((uint32_t)0x00000000U) -#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) +#define RCC_PLLI2SCLKSOURCE_PLLSRC 0x00000000U +#define RCC_PLLI2SCLKSOURCE_EXT ((uint32_t)RCC_PLLI2SCFGR_PLLI2SSRC) /** * @} */ @@ -808,8 +806,8 @@ typedef struct /** @defgroup RCCEx_DFSDM1_Audio_Clock_Source RCC DFSDM1 Audio Clock Source * @{ */ -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1 ((uint32_t)0x00000000U) -#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S1 0x00000000U +#define RCC_DFSDM1AUDIOCLKSOURCE_I2S2 ((uint32_t)RCC_DCKCFGR_CKDFSDM1ASEL) /** * @} */ @@ -817,8 +815,8 @@ typedef struct /** @defgroup RCCEx_DFSDM1_Kernel_Clock_Source RCC DFSDM1 Kernel Clock Source * @{ */ -#define RCC_DFSDM1CLKSOURCE_APB2 ((uint32_t)0x00000000U) -#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) +#define RCC_DFSDM1CLKSOURCE_PCLK2 0x00000000U +#define RCC_DFSDM1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR_CKDFSDM1SEL) /** * @} */ @@ -826,10 +824,10 @@ typedef struct /** @defgroup RCCEx_I2SAPB1_Clock_Source RCC I2S APB1 Clock Source * @{ */ -#define RCC_I2SAPB1CLKSOURCE_PLLI2S ((uint32_t)0x00000000U) -#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) -#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) -#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) +#define RCC_I2SAPB1CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB1CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S1SRC_0) +#define RCC_I2SAPB1CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S1SRC_1) +#define RCC_I2SAPB1CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S1SRC) /** * @} */ @@ -837,10 +835,10 @@ typedef struct /** @defgroup RCCEx_I2SAPB2_Clock_Source RCC I2S APB2 Clock Source * @{ */ -#define RCC_I2SAPB2CLKSOURCE_PLLI2S ((uint32_t)0x00000000U) -#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) -#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) -#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) +#define RCC_I2SAPB2CLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SAPB2CLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2S2SRC_0) +#define RCC_I2SAPB2CLKSOURCE_PLLR ((uint32_t)RCC_DCKCFGR_I2S2SRC_1) +#define RCC_I2SAPB2CLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2S2SRC) /** * @} */ @@ -848,9 +846,9 @@ typedef struct /** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source * @{ */ -#define RCC_FMPI2C1CLKSOURCE_APB ((uint32_t)0x00000000U) -#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) -#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U +#define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) +#define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) /** * @} */ @@ -858,8 +856,8 @@ typedef struct /** @defgroup RCCEx_CLK48_Clock_Source RCC CLK48 Clock Source * @{ */ -#define RCC_CLK48CLKSOURCE_PLLQ ((uint32_t)0x00000000U) -#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) +#define RCC_CLK48CLKSOURCE_PLLQ 0x00000000U +#define RCC_CLK48CLKSOURCE_PLLI2SQ ((uint32_t)RCC_DCKCFGR2_CK48MSEL) /** * @} */ @@ -867,7 +865,7 @@ typedef struct /** @defgroup RCCEx_SDIO_Clock_Source RCC SDIO Clock Source * @{ */ -#define RCC_SDIOCLKSOURCE_CLK48 ((uint32_t)0x00000000U) +#define RCC_SDIOCLKSOURCE_CLK48 0x00000000U #define RCC_SDIOCLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_SDIOSEL) /** * @} @@ -879,7 +877,7 @@ typedef struct /** @defgroup RCCEx_I2S_APB_Clock_Source RCC I2S APB Clock Source * @{ */ -#define RCC_I2SAPBCLKSOURCE_PLLR ((uint32_t)0x00000000U) +#define RCC_I2SAPBCLKSOURCE_PLLR 0x00000000U #define RCC_I2SAPBCLKSOURCE_EXT ((uint32_t)RCC_DCKCFGR_I2SSRC_0) #define RCC_I2SAPBCLKSOURCE_PLLSRC ((uint32_t)RCC_DCKCFGR_I2SSRC_1) /** @@ -889,7 +887,7 @@ typedef struct /** @defgroup RCCEx_FMPI2C1_Clock_Source RCC FMPI2C1 Clock Source * @{ */ -#define RCC_FMPI2C1CLKSOURCE_APB ((uint32_t)0x00000000U) +#define RCC_FMPI2C1CLKSOURCE_PCLK1 0x00000000U #define RCC_FMPI2C1CLKSOURCE_SYSCLK ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_0) #define RCC_FMPI2C1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_FMPI2C1SEL_1) /** @@ -899,7 +897,7 @@ typedef struct /** @defgroup RCCEx_LPTIM1_Clock_Source RCC LPTIM1 Clock Source * @{ */ -#define RCC_LPTIM1CLKSOURCE_PCLK ((uint32_t)0x00000000U) +#define RCC_LPTIM1CLKSOURCE_PCLK1 0x00000000U #define RCC_LPTIM1CLKSOURCE_HSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0) #define RCC_LPTIM1CLKSOURCE_LSI ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_1) #define RCC_LPTIM1CLKSOURCE_LSE ((uint32_t)RCC_DCKCFGR2_LPTIM1SEL_0 | RCC_DCKCFGR2_LPTIM1SEL_1) @@ -916,8 +914,8 @@ typedef struct /** @defgroup RCCEx_TIM_PRescaler_Selection RCC TIM PRescaler Selection * @{ */ -#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00U) -#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01U) +#define RCC_TIMPRES_DESACTIVATED ((uint8_t)0x00) +#define RCC_TIMPRES_ACTIVATED ((uint8_t)0x01) /** * @} */ @@ -932,8 +930,8 @@ typedef struct /** @defgroup RCCEx_LSE_Dual_Mode_Selection RCC LSE Dual Mode Selection * @{ */ -#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00U) -#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01U) +#define RCC_LSE_LOWPOWER_MODE ((uint8_t)0x00) +#define RCC_LSE_HIGHDRIVE_MODE ((uint8_t)0x01) /** * @} */ @@ -948,7 +946,7 @@ typedef struct /** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source * @{ */ -#define RCC_MCO2SOURCE_SYSCLK ((uint32_t)0x00000000U) +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U #define RCC_MCO2SOURCE_PLLI2SCLK RCC_CFGR_MCO2_0 #define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 #define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 @@ -963,7 +961,7 @@ typedef struct /** @defgroup RCC_MCO2_Clock_Source MCO2 Clock Source * @{ */ -#define RCC_MCO2SOURCE_SYSCLK ((uint32_t)0x00000000U) +#define RCC_MCO2SOURCE_SYSCLK 0x00000000U #define RCC_MCO2SOURCE_I2SCLK RCC_CFGR_MCO2_0 #define RCC_MCO2SOURCE_HSE RCC_CFGR_MCO2_1 #define RCC_MCO2SOURCE_PLLCLK RCC_CFGR_MCO2 @@ -995,119 +993,119 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOJ_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOJEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOK_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOKEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DMA2D_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) #define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) @@ -1133,7 +1131,7 @@ typedef struct __HAL_RCC_ETHMAC_CLK_ENABLE(); \ __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0) + } while(0U) /** * @brief Disable ETHERNET clock. */ @@ -1141,7 +1139,7 @@ typedef struct __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0) + } while(0U) /** * @} */ @@ -1211,7 +1209,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) #if defined(STM32F437xx)|| defined(STM32F439xx) || defined(STM32F479xx) @@ -1221,14 +1219,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_HASH_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) #define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) @@ -1236,7 +1234,7 @@ typedef struct #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) @@ -1246,7 +1244,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) /** * @} @@ -1292,7 +1290,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) #if defined(STM32F469xx) || defined(STM32F479xx) #define __HAL_RCC_QSPI_CLK_ENABLE() do { \ @@ -1301,7 +1299,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) #endif /* STM32F469xx || STM32F479xx */ /** @@ -1339,133 +1337,133 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM12_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM13_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM14_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM14_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART8_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) #define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) #define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) @@ -1549,63 +1547,63 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI6_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SAI1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) #define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) #define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) @@ -1623,7 +1621,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_LTDC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_LTDCEN)) #endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ @@ -1635,7 +1633,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DSI_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DSIEN)) #endif /* STM32F469xx || STM32F479xx */ @@ -2041,70 +2039,70 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) #define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) @@ -2125,33 +2123,33 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACTXEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACRXEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETHMACPTP_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_ETHMACPTPEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ETH_CLK_ENABLE() do { \ __HAL_RCC_ETHMAC_CLK_ENABLE(); \ __HAL_RCC_ETHMACTX_CLK_ENABLE(); \ __HAL_RCC_ETHMACRX_CLK_ENABLE(); \ - } while(0) + } while(0U) /** * @brief Disable ETHERNET clock. @@ -2161,10 +2159,10 @@ typedef struct #define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACRXEN)) #define __HAL_RCC_ETHMACPTP_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_ETHMACPTPEN)) #define __HAL_RCC_ETH_CLK_DISABLE() do { \ - __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ - __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ - __HAL_RCC_ETHMAC_CLK_DISABLE(); \ - } while(0) + __HAL_RCC_ETHMACTX_CLK_DISABLE(); \ + __HAL_RCC_ETHMACRX_CLK_DISABLE(); \ + __HAL_RCC_ETHMAC_CLK_DISABLE(); \ + } while(0U) #endif /* STM32F407xx || STM32F417xx */ /** * @} @@ -2233,7 +2231,7 @@ typedef struct */ #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) @@ -2243,7 +2241,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) #if defined(STM32F407xx)|| defined(STM32F417xx) @@ -2253,7 +2251,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) #endif /* STM32F407xx || STM32F417xx */ @@ -2264,14 +2262,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_CRYPEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_HASH_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRYP_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_CRYPEN)) #define __HAL_RCC_HASH_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_HASHEN)) #endif /* STM32F415xx || STM32F417xx */ @@ -2322,7 +2320,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) /** * @} @@ -2354,112 +2352,112 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM12_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM13_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM14_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) #define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) #define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) @@ -2537,42 +2535,42 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) #define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) @@ -2909,40 +2907,32 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) #define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) #define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) /** * @} @@ -2958,13 +2948,11 @@ typedef struct #define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) #define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) #define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) #define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) #define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) #define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) #define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) #define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) /** * @} @@ -2979,7 +2967,7 @@ typedef struct */ #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) /** @@ -2993,8 +2981,8 @@ typedef struct * using it. * @{ */ -#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() (RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) -#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() (RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHB2ENR & (RCC_AHB2ENR_OTGFSEN)) == RESET) /** * @} */ @@ -3012,35 +3000,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) #define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) #define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) @@ -3085,21 +3073,21 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) #define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) @@ -3114,7 +3102,11 @@ typedef struct * is disabled and the application software has to enable this clock before * using it. * @{ - */ + */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) + #define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) #define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) #define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) @@ -3212,14 +3204,12 @@ typedef struct #define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) #define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) #define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_BKPSRAMLPEN)) #define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) #define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) #define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) #define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) #define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) -#define __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_BKPSRAMLPEN)) /** * @} */ @@ -3298,14 +3288,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RNG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_RNGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) #define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_RNGEN)) /** @@ -3319,8 +3309,11 @@ typedef struct * using it. * @{ */ -#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) -#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) +#define __HAL_RCC_RNG_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) != RESET) + +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) +#define __HAL_RCC_RNG_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_RNGEN)) == RESET) /** * @} */ @@ -3335,35 +3328,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) #define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) @@ -3406,14 +3399,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) #define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) /** @@ -3559,44 +3552,36 @@ typedef struct * using it. * @{ */ -#define __HAL_RCC_BKPSRAM_CLK_ENABLE() do { \ - __IO uint32_t tmpreg = 0x00U; \ - SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - /* Delay after an RCC peripheral clock enabling */ \ - tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ - UNUSED(tmpreg); \ - } while(0) #define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) -#define __HAL_RCC_BKPSRAM_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_BKPSRAMEN)) #define __HAL_RCC_CCMDATARAMEN_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CCMDATARAMEN)) #define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_CRCEN)) /** @@ -3612,13 +3597,11 @@ typedef struct */ #define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) != RESET) #define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) != RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) != RESET) #define __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) != RESET) #define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) != RESET) #define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIODEN)) == RESET) #define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_GPIOEEN)) == RESET) -#define __HAL_RCC_BKPSRAM_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_BKPSRAMEN)) == RESET) #define __HAL_RCC_CCMDATARAMEN_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CCMDATARAMEN)) == RESET) #define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHB1ENR & (RCC_AHB1ENR_CRCEN)) == RESET) /** @@ -3634,7 +3617,7 @@ typedef struct */ #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) /** @@ -3667,35 +3650,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) #define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) #define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) @@ -3737,28 +3720,28 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) #define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) #define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) @@ -3951,63 +3934,63 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_BKPSRAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CCMDATARAMEN_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CCMDATARAMEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_OTGHSULPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) #define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOFEN)) @@ -4064,11 +4047,11 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DCMI_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_DCMIEN)) #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) @@ -4078,7 +4061,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) /** * @} @@ -4116,14 +4099,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_QSPI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FMCEN)) #define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) @@ -4160,133 +4143,133 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM12_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM13_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM14_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPDIFRX_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPDIFRXEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_USART3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CEC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_DAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) #define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) #define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) @@ -4373,56 +4356,56 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_ADC3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SAI1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SAI2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) #define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) #define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) @@ -4755,35 +4738,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOEEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOFEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CRC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIODEN)) #define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOEEN)) @@ -4830,7 +4813,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_AES_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_AESEN)) #endif /* STM32F423xx */ @@ -4841,12 +4824,12 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_RNG_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_RNGEN)) #define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do {(RCC->AHB2ENR |= (RCC_AHB2ENR_OTGFSEN));\ __HAL_RCC_SYSCFG_CLK_ENABLE();\ - }while(0) + }while(0U) #define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHB2ENR &= ~(RCC_AHB2ENR_OTGFSEN)) /** @@ -4888,14 +4871,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_QSPI_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_FSMCEN)) #define __HAL_RCC_QSPI_CLK_DISABLE() (RCC->AHB3ENR &= ~(RCC_AHB3ENR_QSPIEN)) @@ -4936,35 +4919,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM12_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM13_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM14_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_LPTIM1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -4972,7 +4955,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_LPTIM1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_RTCAPB_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -4980,7 +4963,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_RTCAPBEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_USART3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -4988,7 +4971,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ #if defined(STM32F413xx) || defined(STM32F423xx) @@ -4998,14 +4981,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ @@ -5014,21 +4997,21 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_CAN2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_CAN3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5036,7 +5019,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_TIM2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5044,35 +5027,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_I2C3_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_DAC_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5080,21 +5063,21 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART7_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART8_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) @@ -5216,7 +5199,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_UART9_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5224,14 +5207,14 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_UART10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_SDIO_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5239,35 +5222,35 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI4_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_TIM10_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #define __HAL_RCC_SPI5_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_SAI1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5275,7 +5258,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5283,7 +5266,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #if defined(STM32F413xx) || defined(STM32F423xx) #define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ __IO uint32_t tmpreg = 0x00U; \ @@ -5291,7 +5274,7 @@ typedef struct /* Delay after an RCC peripheral clock enabling */ \ tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ UNUSED(tmpreg); \ - } while(0) + } while(0U) #endif /* STM32F413xx || STM32F423xx */ #define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) @@ -5774,7 +5757,7 @@ typedef struct #define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ ((__PLLN__) << POSITION_VAL(RCC_PLLCFGR_PLLN)) | \ - ((((__PLLP__) >> 1) -1) << POSITION_VAL(RCC_PLLCFGR_PLLP)) | \ + ((((__PLLP__) >> 1U) -1U) << POSITION_VAL(RCC_PLLCFGR_PLLP)) | \ ((__PLLQ__) << POSITION_VAL(RCC_PLLCFGR_PLLQ)) | \ ((__PLLR__) << POSITION_VAL(RCC_PLLCFGR_PLLR)))) #else @@ -5810,7 +5793,7 @@ typedef struct #define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ ((__PLLN__) << POSITION_VAL(RCC_PLLCFGR_PLLN)) | \ - ((((__PLLP__) >> 1) -1) << POSITION_VAL(RCC_PLLCFGR_PLLP)) | \ + ((((__PLLP__) >> 1U) -1U) << POSITION_VAL(RCC_PLLCFGR_PLLP)) | \ ((__PLLQ__) << POSITION_VAL(RCC_PLLCFGR_PLLQ)))) #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ /*----------------------------------------------------------------------------*/ @@ -5862,7 +5845,7 @@ typedef struct #define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ ((__PLLI2SN__) << POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SN)) |\ - ((((__PLLI2SP__) >> 1) -1) << POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) |\ + ((((__PLLI2SP__) >> 1U) -1U) << POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SP)) |\ ((__PLLI2SQ__) << POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SQ)) |\ ((__PLLI2SR__) << POSITION_VAL(RCC_PLLI2SCFGR_PLLI2SR)))) #elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ @@ -5960,9 +5943,9 @@ typedef struct * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz * on the I2S clock frequency. */ -#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6) |\ - ((__PLLI2SQ__) << 24) |\ - ((__PLLI2SR__) << 28)) +#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ + ((__PLLI2SQ__) << 24U) |\ + ((__PLLI2SR__) << 28U)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ /*----------------------------------------------------------------------------*/ @@ -6004,7 +5987,7 @@ typedef struct #define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ ((__PLLSAIN__) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN)) | \ - ((((__PLLSAIP__) >> 1) -1) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) | \ + ((((__PLLSAIP__) >> 1U) -1U) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) | \ ((__PLLSAIQ__) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)))) #endif /* STM32F446xx */ @@ -6027,7 +6010,7 @@ typedef struct */ #define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ (RCC->PLLSAICFGR = (((__PLLSAIN__) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIN)) |\ - ((((__PLLSAIP__) >> 1) -1) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) |\ + ((((__PLLSAIP__) >> 1U) -1U) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIP)) |\ ((__PLLSAIQ__) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIQ)) |\ ((__PLLSAIR__) << POSITION_VAL(RCC_PLLSAICFGR_PLLSAIR)))) #endif /* STM32F469xx || STM32F479xx */ @@ -6064,14 +6047,14 @@ typedef struct * This parameter must be a number between 1 and 32. * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1)) +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) /** @brief Macro to configure the SAI clock Divider coming from PLL. * @param __PLLDivR__: specifies the PLL division factor for SAI1 clock. * This parameter must be a number between 1 and 32. * SAI1 clock frequency = f(PLLR) / __PLLDivR__ */ -#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1)<<8)) +#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) #endif /* STM32F413xx || STM32F423xx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ @@ -6082,7 +6065,7 @@ typedef struct * This parameter must be a number between 1 and 32. * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ */ -#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1)) +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) /** @brief Macro to configure the SAI clock Divider coming from PLLSAI. * @note This function must be called before enabling the PLLSAI. @@ -6090,7 +6073,7 @@ typedef struct * This parameter must be a number between Min_Data = 1 and Max_Data = 32. * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ */ -#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1)<<8)) +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) @@ -6120,6 +6103,15 @@ typedef struct * used as I2S clock source. */ #define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_CFGR_I2SSRC_BB = (__SOURCE__)) + + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg @ref RCC_I2SCLKSOURCE_EXT External clock mapped on the I2S_CKIN pin + * used as I2S clock source + */ +#define __HAL_RCC_GET_I2S_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_I2SSRC))) #endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) @@ -6207,8 +6199,8 @@ typedef struct * @param __SOURCE__: specifies the I2S APB1 clock source. * This parameter can be one of the following values: * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. */ #define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) @@ -6216,8 +6208,8 @@ typedef struct /** @brief Macro to Get I2S APB1 clock source selection. * @retval The clock source can be one of the following values: * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB1 clock. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB1 clock. * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. */ #define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) @@ -6227,8 +6219,8 @@ typedef struct * @param __SOURCE__: specifies the SAI Block A clock source. * This parameter can be one of the following values: * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. */ #define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) @@ -6236,8 +6228,8 @@ typedef struct /** @brief Macro to Get I2S APB2 clock source selection. * @retval The clock source can be one of the following values: * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR used as I2S clock. - * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 clock. - * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as SAI1 clock. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as I2S APB2 clock. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR used as I2S APB2 clock. * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. */ #define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) @@ -6260,7 +6252,7 @@ typedef struct /** @brief Macro to configure the FMPI2C1 clock. * @param __SOURCE__: specifies the FMPI2C1 clock source. * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6268,7 +6260,7 @@ typedef struct /** @brief Macro to Get the FMPI2C1 clock. * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6374,7 +6366,7 @@ typedef struct /** @brief Macro to configure the DFSDM1 clock. * @param __DFSDM1_CLKSOURCE__: specifies the DFSDM1 clock source. * This parameter can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_APB2: APB2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. * @retval None */ @@ -6382,7 +6374,7 @@ typedef struct /** @brief Macro to get the DFSDM1 clock source. * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1CLKSOURCE_APB2: APB2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernal clock. */ #define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) @@ -6392,8 +6384,8 @@ typedef struct STM32F413xx/STM32F423xx Devices. * @param __SOURCE__: specifies the DFSDM1 Audio clock source. * This parameter can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1: CK_I2S_APB1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2: CK_I2S_APB2 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock */ #define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) @@ -6401,8 +6393,8 @@ typedef struct * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ STM32F413xx/STM32F423xx Devices. * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1: CK_I2S_APB1 selected as audio clock - * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2: CK_I2S_APB2 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock */ #define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) @@ -6410,7 +6402,7 @@ typedef struct /** @brief Macro to configure the DFSDM2 clock. * @param __DFSDM2_CLKSOURCE__: specifies the DFSDM1 clock source. * This parameter can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_APB2: APB2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. * @retval None */ @@ -6418,7 +6410,7 @@ typedef struct /** @brief Macro to get the DFSDM2 clock source. * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2CLKSOURCE_APB2: APB2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernal clock. */ #define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) @@ -6427,16 +6419,16 @@ typedef struct * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. * @param __SOURCE__: specifies the DFSDM2 Audio clock source. * This parameter can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1: CK_I2S_APB1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2: CK_I2S_APB2 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock */ #define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) /** @brief Macro to Get DFSDM2 Audio clock source selection. * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. * @retval The clock source can be one of the following values: - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1: CK_I2S_APB1 selected as audio clock - * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2: CK_I2S_APB2 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock */ #define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) @@ -6489,7 +6481,7 @@ typedef struct /** @brief Macro to configure the LPTIM1 clock. * @param __SOURCE__: specifies the LPTIM1 clock source. * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK: APB selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock @@ -6498,7 +6490,7 @@ typedef struct /** @brief Macro to Get the LPTIM1 clock. * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK: APB selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock @@ -6557,7 +6549,7 @@ typedef struct /** @brief Macro to configure the FMPI2C1 clock. * @param __SOURCE__: specifies the FMPI2C1 clock source. * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6565,7 +6557,7 @@ typedef struct /** @brief Macro to Get the FMPI2C1 clock. * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6624,7 +6616,7 @@ typedef struct /** @brief Macro to configure the FMPI2C1 clock. * @param __SOURCE__: specifies the FMPI2C1 clock source. * This parameter can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6632,7 +6624,7 @@ typedef struct /** @brief Macro to Get the FMPI2C1 clock. * @retval The clock source can be one of the following values: - * @arg RCC_FMPI2C1CLKSOURCE_APB: APB selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock */ @@ -6641,7 +6633,7 @@ typedef struct /** @brief Macro to configure the LPTIM1 clock. * @param __SOURCE__: specifies the LPTIM1 clock source. * This parameter can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK: APB selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock @@ -6650,7 +6642,7 @@ typedef struct /** @brief Macro to Get the LPTIM1 clock. * @retval The clock source can be one of the following values: - * @arg RCC_LPTIM1CLKSOURCE_PCLK: APB selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock @@ -6737,9 +6729,7 @@ typedef struct HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); -#if defined(STM32F446xx) uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); -#endif /* STM32F446xx */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ @@ -6769,10 +6759,10 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) /* Alias word address of PLLSAION bit */ -#define RCC_PLLSAION_BIT_NUMBER 0x1C -#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32) + (RCC_PLLSAION_BIT_NUMBER * 4)) +#define RCC_PLLSAION_BIT_NUMBER 0x1CU +#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) -#define PLLSAI_TIMEOUT_VALUE ((uint32_t)2) /* Timeout value fixed to 2 ms */ +#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ @@ -6781,8 +6771,8 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) /* Alias word address of PLLI2SON bit */ -#define RCC_PLLI2SON_BIT_NUMBER 0x1A -#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32) + (RCC_PLLI2SON_BIT_NUMBER * 4)) +#define RCC_PLLI2SON_BIT_NUMBER 0x1AU +#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ @@ -6794,9 +6784,9 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) /* Alias word address of TIMPRE bit */ -#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8C) -#define RCC_TIMPRE_BIT_NUMBER 0x18 -#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32) + (RCC_TIMPRE_BIT_NUMBER * 4)) +#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) +#define RCC_TIMPRE_BIT_NUMBER 0x18U +#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ @@ -6808,35 +6798,35 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ defined(STM32F469xx) || defined(STM32F479xx) /* Alias word address of I2SSRC bit */ -#define RCC_I2SSRC_BIT_NUMBER 0x17 -#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32) + (RCC_I2SSRC_BIT_NUMBER * 4)) +#define RCC_I2SSRC_BIT_NUMBER 0x17U +#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) -#define PLLI2S_TIMEOUT_VALUE ((uint32_t)2) /* Timeout value fixed to 2 ms */ +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ defined(STM32F413xx) || defined(STM32F423xx) /* --- PLLI2SCFGR Register ---*/ -#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) +#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) /* Alias word address of PLLI2SSRC bit */ -#define RCC_PLLI2SSRC_BIT_NUMBER 0x16 -#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32) + (RCC_PLLI2SSRC_BIT_NUMBER * 4)) +#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U +#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) -#define PLLI2S_TIMEOUT_VALUE ((uint32_t)2) /* Timeout value fixed to 2 ms */ +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) /* Alias word address of MCO1EN bit */ -#define RCC_MCO1EN_BIT_NUMBER 0x8 -#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32) + (RCC_MCO1EN_BIT_NUMBER * 4)) +#define RCC_MCO1EN_BIT_NUMBER 0x8U +#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) /* Alias word address of MCO2EN bit */ -#define RCC_MCO2EN_BIT_NUMBER 0x9 -#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32) + (RCC_MCO2EN_BIT_NUMBER * 4)) +#define RCC_MCO2EN_BIT_NUMBER 0x9U +#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ -#define PLL_TIMEOUT_VALUE ((uint32_t)2) /* 2 ms */ +#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ /** * @} */ @@ -6864,35 +6854,35 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); #endif /* STM32F411xE */ #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ #if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) #endif /* STM32F401xC || STM32F401xE || STM32F411xE */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) #endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ #if defined(STM32F446xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) #endif /* STM32F446xx */ #if defined(STM32F469xx) || defined(STM32F479xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) #endif /* STM32F469xx || STM32F479xx */ #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ #if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_PERIPHCLOCK(SELECTION) ((1 <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) #endif /* STM32F413xx || STM32F423xx */ #define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) @@ -6931,11 +6921,11 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); #define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_APB) ||\ +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK) ||\ +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) @@ -6980,7 +6970,7 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_APB) ||\ +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) @@ -7037,7 +7027,7 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) -#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_APB) ||\ +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) @@ -7047,20 +7037,20 @@ void HAL_RCCEx_SelectLSEMode(uint8_t Mode); #define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) -#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_APB2) || \ +#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) -#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1) || \ - ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2)) +#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) #if defined(STM32F413xx) || defined(STM32F423xx) -#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_APB2) || \ +#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) -#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1) || \ - ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2)) +#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) -#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK) ||\ +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h index 1584f19..2638c33 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rng.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_rng.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of RNG HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h index cdc0885..28f02d7 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_rtc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of RTC HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -201,8 +201,8 @@ typedef struct /** @defgroup RTC_Hour_Formats RTC Hour Formats * @{ */ -#define RTC_HOURFORMAT_24 ((uint32_t)0x00000000U) -#define RTC_HOURFORMAT_12 ((uint32_t)0x00000040U) +#define RTC_HOURFORMAT_24 0x00000000U +#define RTC_HOURFORMAT_12 0x00000040U /** * @} */ @@ -210,10 +210,10 @@ typedef struct /** @defgroup RTC_Output_selection_Definitions RTC Output Selection Definitions * @{ */ -#define RTC_OUTPUT_DISABLE ((uint32_t)0x00000000U) -#define RTC_OUTPUT_ALARMA ((uint32_t)0x00200000U) -#define RTC_OUTPUT_ALARMB ((uint32_t)0x00400000U) -#define RTC_OUTPUT_WAKEUP ((uint32_t)0x00600000U) +#define RTC_OUTPUT_DISABLE 0x00000000U +#define RTC_OUTPUT_ALARMA 0x00200000U +#define RTC_OUTPUT_ALARMB 0x00400000U +#define RTC_OUTPUT_WAKEUP 0x00600000U /** * @} */ @@ -221,8 +221,8 @@ typedef struct /** @defgroup RTC_Output_Polarity_Definitions RTC Output Polarity Definitions * @{ */ -#define RTC_OUTPUT_POLARITY_HIGH ((uint32_t)0x00000000U) -#define RTC_OUTPUT_POLARITY_LOW ((uint32_t)0x00100000U) +#define RTC_OUTPUT_POLARITY_HIGH 0x00000000U +#define RTC_OUTPUT_POLARITY_LOW 0x00100000U /** * @} */ @@ -230,8 +230,8 @@ typedef struct /** @defgroup RTC_Output_Type_ALARM_OUT RTC Output Type ALARM OUT * @{ */ -#define RTC_OUTPUT_TYPE_OPENDRAIN ((uint32_t)0x00000000U) -#define RTC_OUTPUT_TYPE_PUSHPULL ((uint32_t)0x00040000U) +#define RTC_OUTPUT_TYPE_OPENDRAIN 0x00000000U +#define RTC_OUTPUT_TYPE_PUSHPULL 0x00040000U /** * @} */ @@ -239,8 +239,8 @@ typedef struct /** @defgroup RTC_AM_PM_Definitions RTC AM PM Definitions * @{ */ -#define RTC_HOURFORMAT12_AM ((uint8_t)0x00U) -#define RTC_HOURFORMAT12_PM ((uint8_t)0x40U) +#define RTC_HOURFORMAT12_AM ((uint8_t)0x00) +#define RTC_HOURFORMAT12_PM ((uint8_t)0x40) /** * @} */ @@ -248,9 +248,9 @@ typedef struct /** @defgroup RTC_DayLightSaving_Definitions RTC DayLight Saving Definitions * @{ */ -#define RTC_DAYLIGHTSAVING_SUB1H ((uint32_t)0x00020000U) -#define RTC_DAYLIGHTSAVING_ADD1H ((uint32_t)0x00010000U) -#define RTC_DAYLIGHTSAVING_NONE ((uint32_t)0x00000000U) +#define RTC_DAYLIGHTSAVING_SUB1H 0x00020000U +#define RTC_DAYLIGHTSAVING_ADD1H 0x00010000U +#define RTC_DAYLIGHTSAVING_NONE 0x00000000U /** * @} */ @@ -258,8 +258,8 @@ typedef struct /** @defgroup RTC_StoreOperation_Definitions RTC Store Operation Definitions * @{ */ -#define RTC_STOREOPERATION_RESET ((uint32_t)0x00000000U) -#define RTC_STOREOPERATION_SET ((uint32_t)0x00040000U) +#define RTC_STOREOPERATION_RESET 0x00000000U +#define RTC_STOREOPERATION_SET 0x00040000U /** * @} */ @@ -267,8 +267,8 @@ typedef struct /** @defgroup RTC_Input_parameter_format_definitions RTC Input Parameter Format Definitions * @{ */ -#define RTC_FORMAT_BIN ((uint32_t)0x00000000U) -#define RTC_FORMAT_BCD ((uint32_t)0x00000001U) +#define RTC_FORMAT_BIN 0x00000000U +#define RTC_FORMAT_BCD 0x00000001U /** * @} */ @@ -277,18 +277,18 @@ typedef struct * @{ */ /* Coded in BCD format */ -#define RTC_MONTH_JANUARY ((uint8_t)0x01U) -#define RTC_MONTH_FEBRUARY ((uint8_t)0x02U) -#define RTC_MONTH_MARCH ((uint8_t)0x03U) -#define RTC_MONTH_APRIL ((uint8_t)0x04U) -#define RTC_MONTH_MAY ((uint8_t)0x05U) -#define RTC_MONTH_JUNE ((uint8_t)0x06U) -#define RTC_MONTH_JULY ((uint8_t)0x07U) -#define RTC_MONTH_AUGUST ((uint8_t)0x08U) -#define RTC_MONTH_SEPTEMBER ((uint8_t)0x09U) -#define RTC_MONTH_OCTOBER ((uint8_t)0x10U) -#define RTC_MONTH_NOVEMBER ((uint8_t)0x11U) -#define RTC_MONTH_DECEMBER ((uint8_t)0x12U) +#define RTC_MONTH_JANUARY ((uint8_t)0x01) +#define RTC_MONTH_FEBRUARY ((uint8_t)0x02) +#define RTC_MONTH_MARCH ((uint8_t)0x03) +#define RTC_MONTH_APRIL ((uint8_t)0x04) +#define RTC_MONTH_MAY ((uint8_t)0x05) +#define RTC_MONTH_JUNE ((uint8_t)0x06) +#define RTC_MONTH_JULY ((uint8_t)0x07) +#define RTC_MONTH_AUGUST ((uint8_t)0x08) +#define RTC_MONTH_SEPTEMBER ((uint8_t)0x09) +#define RTC_MONTH_OCTOBER ((uint8_t)0x10) +#define RTC_MONTH_NOVEMBER ((uint8_t)0x11) +#define RTC_MONTH_DECEMBER ((uint8_t)0x12) /** * @} */ @@ -296,13 +296,13 @@ typedef struct /** @defgroup RTC_WeekDay_Definitions RTC WeekDay Definitions * @{ */ -#define RTC_WEEKDAY_MONDAY ((uint8_t)0x01U) -#define RTC_WEEKDAY_TUESDAY ((uint8_t)0x02U) -#define RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03U) -#define RTC_WEEKDAY_THURSDAY ((uint8_t)0x04U) -#define RTC_WEEKDAY_FRIDAY ((uint8_t)0x05U) -#define RTC_WEEKDAY_SATURDAY ((uint8_t)0x06U) -#define RTC_WEEKDAY_SUNDAY ((uint8_t)0x07U) +#define RTC_WEEKDAY_MONDAY ((uint8_t)0x01) +#define RTC_WEEKDAY_TUESDAY ((uint8_t)0x02) +#define RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03) +#define RTC_WEEKDAY_THURSDAY ((uint8_t)0x04) +#define RTC_WEEKDAY_FRIDAY ((uint8_t)0x05) +#define RTC_WEEKDAY_SATURDAY ((uint8_t)0x06) +#define RTC_WEEKDAY_SUNDAY ((uint8_t)0x07) /** * @} */ @@ -310,8 +310,8 @@ typedef struct /** @defgroup RTC_AlarmDateWeekDay_Definitions RTC Alarm Date WeekDay Definitions * @{ */ -#define RTC_ALARMDATEWEEKDAYSEL_DATE ((uint32_t)0x00000000U) -#define RTC_ALARMDATEWEEKDAYSEL_WEEKDAY ((uint32_t)0x40000000U) +#define RTC_ALARMDATEWEEKDAYSEL_DATE 0x00000000U +#define RTC_ALARMDATEWEEKDAYSEL_WEEKDAY 0x40000000U /** * @} */ @@ -319,12 +319,12 @@ typedef struct /** @defgroup RTC_AlarmMask_Definitions RTC Alarm Mask Definitions * @{ */ -#define RTC_ALARMMASK_NONE ((uint32_t)0x00000000U) +#define RTC_ALARMMASK_NONE 0x00000000U #define RTC_ALARMMASK_DATEWEEKDAY RTC_ALRMAR_MSK4 #define RTC_ALARMMASK_HOURS RTC_ALRMAR_MSK3 #define RTC_ALARMMASK_MINUTES RTC_ALRMAR_MSK2 #define RTC_ALARMMASK_SECONDS RTC_ALRMAR_MSK1 -#define RTC_ALARMMASK_ALL ((uint32_t)0x80808080U) +#define RTC_ALARMMASK_ALL 0x80808080U /** * @} */ @@ -341,38 +341,38 @@ typedef struct /** @defgroup RTC_Alarm_Sub_Seconds_Masks_Definitions RTC Alarm Sub Seconds Masks Definitions * @{ */ -#define RTC_ALARMSUBSECONDMASK_ALL ((uint32_t)0x00000000U) /*!< All Alarm SS fields are masked. +#define RTC_ALARMSUBSECONDMASK_ALL 0x00000000U /*!< All Alarm SS fields are masked. There is no comparison on sub seconds for Alarm */ -#define RTC_ALARMSUBSECONDMASK_SS14_1 ((uint32_t)0x01000000U) /*!< SS[14:1] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_1 0x01000000U /*!< SS[14:1] are don't care in Alarm comparison. Only SS[0] is compared. */ -#define RTC_ALARMSUBSECONDMASK_SS14_2 ((uint32_t)0x02000000U) /*!< SS[14:2] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_2 0x02000000U /*!< SS[14:2] are don't care in Alarm comparison. Only SS[1:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_3 ((uint32_t)0x03000000U) /*!< SS[14:3] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_3 0x03000000U /*!< SS[14:3] are don't care in Alarm comparison. Only SS[2:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_4 ((uint32_t)0x04000000U) /*!< SS[14:4] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_4 0x04000000U /*!< SS[14:4] are don't care in Alarm comparison. Only SS[3:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_5 ((uint32_t)0x05000000U) /*!< SS[14:5] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_5 0x05000000U /*!< SS[14:5] are don't care in Alarm comparison. Only SS[4:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_6 ((uint32_t)0x06000000U) /*!< SS[14:6] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_6 0x06000000U /*!< SS[14:6] are don't care in Alarm comparison. Only SS[5:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_7 ((uint32_t)0x07000000U) /*!< SS[14:7] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_7 0x07000000U /*!< SS[14:7] are don't care in Alarm comparison. Only SS[6:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_8 ((uint32_t)0x08000000U) /*!< SS[14:8] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_8 0x08000000U /*!< SS[14:8] are don't care in Alarm comparison. Only SS[7:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_9 ((uint32_t)0x09000000U) /*!< SS[14:9] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_9 0x09000000U /*!< SS[14:9] are don't care in Alarm comparison. Only SS[8:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_10 ((uint32_t)0x0A000000U) /*!< SS[14:10] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_10 0x0A000000U /*!< SS[14:10] are don't care in Alarm comparison. Only SS[9:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_11 ((uint32_t)0x0B000000U) /*!< SS[14:11] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_11 0x0B000000U /*!< SS[14:11] are don't care in Alarm comparison. Only SS[10:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_12 ((uint32_t)0x0C000000U) /*!< SS[14:12] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_12 0x0C000000U /*!< SS[14:12] are don't care in Alarm comparison.Only SS[11:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14_13 ((uint32_t)0x0D000000U) /*!< SS[14:13] are don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14_13 0x0D000000U /*!< SS[14:13] are don't care in Alarm comparison. Only SS[12:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_SS14 ((uint32_t)0x0E000000U) /*!< SS[14] is don't care in Alarm +#define RTC_ALARMSUBSECONDMASK_SS14 0x0E000000U /*!< SS[14] is don't care in Alarm comparison.Only SS[13:0] are compared */ -#define RTC_ALARMSUBSECONDMASK_NONE ((uint32_t)0x0F000000U) /*!< SS[14:0] are compared and must match +#define RTC_ALARMSUBSECONDMASK_NONE 0x0F000000U /*!< SS[14:0] are compared and must match to activate alarm. */ /** * @} @@ -381,13 +381,13 @@ typedef struct /** @defgroup RTC_Interrupts_Definitions RTC Interrupts Definitions * @{ */ -#define RTC_IT_TS ((uint32_t)0x00008000U) -#define RTC_IT_WUT ((uint32_t)0x00004000U) -#define RTC_IT_ALRB ((uint32_t)0x00002000U) -#define RTC_IT_ALRA ((uint32_t)0x00001000U) -#define RTC_IT_TAMP ((uint32_t)0x00000004U) /* Used only to Enable the Tamper Interrupt */ -#define RTC_IT_TAMP1 ((uint32_t)0x00020000U) -#define RTC_IT_TAMP2 ((uint32_t)0x00040000U) +#define RTC_IT_TS 0x00008000U +#define RTC_IT_WUT 0x00004000U +#define RTC_IT_ALRB 0x00002000U +#define RTC_IT_ALRA 0x00001000U +#define RTC_IT_TAMP 0x00000004U /* Used only to Enable the Tamper Interrupt */ +#define RTC_IT_TAMP1 0x00020000U +#define RTC_IT_TAMP2 0x00040000U /** * @} */ @@ -395,21 +395,21 @@ typedef struct /** @defgroup RTC_Flags_Definitions RTC Flags Definitions * @{ */ -#define RTC_FLAG_RECALPF ((uint32_t)0x00010000U) -#define RTC_FLAG_TAMP2F ((uint32_t)0x00004000U) -#define RTC_FLAG_TAMP1F ((uint32_t)0x00002000U) -#define RTC_FLAG_TSOVF ((uint32_t)0x00001000U) -#define RTC_FLAG_TSF ((uint32_t)0x00000800U) -#define RTC_FLAG_WUTF ((uint32_t)0x00000400U) -#define RTC_FLAG_ALRBF ((uint32_t)0x00000200U) -#define RTC_FLAG_ALRAF ((uint32_t)0x00000100U) -#define RTC_FLAG_INITF ((uint32_t)0x00000040U) -#define RTC_FLAG_RSF ((uint32_t)0x00000020U) -#define RTC_FLAG_INITS ((uint32_t)0x00000010U) -#define RTC_FLAG_SHPF ((uint32_t)0x00000008U) -#define RTC_FLAG_WUTWF ((uint32_t)0x00000004U) -#define RTC_FLAG_ALRBWF ((uint32_t)0x00000002U) -#define RTC_FLAG_ALRAWF ((uint32_t)0x00000001U) +#define RTC_FLAG_RECALPF 0x00010000U +#define RTC_FLAG_TAMP2F 0x00004000U +#define RTC_FLAG_TAMP1F 0x00002000U +#define RTC_FLAG_TSOVF 0x00001000U +#define RTC_FLAG_TSF 0x00000800U +#define RTC_FLAG_WUTF 0x00000400U +#define RTC_FLAG_ALRBF 0x00000200U +#define RTC_FLAG_ALRAF 0x00000100U +#define RTC_FLAG_INITF 0x00000040U +#define RTC_FLAG_RSF 0x00000020U +#define RTC_FLAG_INITS 0x00000010U +#define RTC_FLAG_SHPF 0x00000008U +#define RTC_FLAG_WUTWF 0x00000004U +#define RTC_FLAG_ALRBWF 0x00000002U +#define RTC_FLAG_ALRAWF 0x00000001U /** * @} */ @@ -438,7 +438,7 @@ typedef struct do{ \ (__HANDLE__)->Instance->WPR = 0xCAU; \ (__HANDLE__)->Instance->WPR = 0x53U; \ - } while(0) + } while(0U) /** * @brief Enable the write protection for RTC registers. @@ -448,7 +448,7 @@ typedef struct #define __HAL_RTC_WRITEPROTECTION_ENABLE(__HANDLE__) \ do{ \ (__HANDLE__)->Instance->WPR = 0xFFU; \ - } while(0) + } while(0U) /** * @brief Enable the RTC ALARMA peripheral. @@ -601,7 +601,7 @@ typedef struct */ #define __HAL_RTC_ALARM_EXTI_ENABLE_RISING_FALLING_EDGE() do { __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE(); \ __HAL_RTC_ALARM_EXTI_ENABLE_FALLING_EDGE();\ - } while(0) + } while(0U) /** * @brief Disable rising & falling edge trigger on the RTC Alarm associated Exti line. @@ -609,7 +609,7 @@ typedef struct */ #define __HAL_RTC_ALARM_EXTI_DISABLE_RISING_FALLING_EDGE() do { __HAL_RTC_ALARM_EXTI_DISABLE_RISING_EDGE();\ __HAL_RTC_ALARM_EXTI_DISABLE_FALLING_EDGE();\ - } while(0) + } while(0U) /** * @brief Check whether the RTC Alarm associated Exti line interrupt flag is set or not. @@ -708,10 +708,10 @@ HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); * @{ */ /* Masks Definition */ -#define RTC_TR_RESERVED_MASK ((uint32_t)0x007F7F7FU) -#define RTC_DR_RESERVED_MASK ((uint32_t)0x00FFFF3FU) -#define RTC_INIT_MASK ((uint32_t)0xFFFFFFFFU) -#define RTC_RSF_MASK ((uint32_t)0xFFFFFF5FU) +#define RTC_TR_RESERVED_MASK 0x007F7F7FU +#define RTC_DR_RESERVED_MASK 0x00FFFF3FU +#define RTC_INIT_MASK 0xFFFFFFFFU +#define RTC_RSF_MASK 0xFFFFFF5FU #define RTC_FLAGS_MASK ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_WUTF | \ RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_INITF | \ RTC_FLAG_RSF | RTC_FLAG_INITS | RTC_FLAG_WUTWF | \ @@ -743,12 +743,12 @@ HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); ((POL) == RTC_OUTPUT_POLARITY_LOW)) #define IS_RTC_OUTPUT_TYPE(TYPE) (((TYPE) == RTC_OUTPUT_TYPE_OPENDRAIN) || \ ((TYPE) == RTC_OUTPUT_TYPE_PUSHPULL)) -#define IS_RTC_HOUR12(HOUR) (((HOUR) > (uint32_t)0U) && ((HOUR) <= (uint32_t)12U)) -#define IS_RTC_HOUR24(HOUR) ((HOUR) <= (uint32_t)23U) -#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= (uint32_t)0x7FU) -#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= (uint32_t)0x7FFFU) -#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= (uint32_t)59U) -#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= (uint32_t)59U) +#define IS_RTC_HOUR12(HOUR) (((HOUR) > 0U) && ((HOUR) <= 12U)) +#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23U) +#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FU) +#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFFU) +#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59U) +#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59U) #define IS_RTC_HOURFORMAT12(PM) (((PM) == RTC_HOURFORMAT12_AM) || ((PM) == RTC_HOURFORMAT12_PM)) #define IS_RTC_DAYLIGHT_SAVING(SAVE) (((SAVE) == RTC_DAYLIGHTSAVING_SUB1H) || \ @@ -757,9 +757,9 @@ HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); #define IS_RTC_STORE_OPERATION(OPERATION) (((OPERATION) == RTC_STOREOPERATION_RESET) || \ ((OPERATION) == RTC_STOREOPERATION_SET)) #define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_FORMAT_BIN) || ((FORMAT) == RTC_FORMAT_BCD)) -#define IS_RTC_YEAR(YEAR) ((YEAR) <= (uint32_t)99U) -#define IS_RTC_MONTH(MONTH) (((MONTH) >= (uint32_t)1U) && ((MONTH) <= (uint32_t)12U)) -#define IS_RTC_DATE(DATE) (((DATE) >= (uint32_t)1U) && ((DATE) <= (uint32_t)31U)) +#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99U) +#define IS_RTC_MONTH(MONTH) (((MONTH) >= 1U) && ((MONTH) <= 12U)) +#define IS_RTC_DATE(DATE) (((DATE) >= 1U) && ((DATE) <= 31U)) #define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_WEEKDAY_MONDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_TUESDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_WEDNESDAY) || \ @@ -767,7 +767,7 @@ HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); ((WEEKDAY) == RTC_WEEKDAY_FRIDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_SATURDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_SUNDAY)) -#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) >(uint32_t) 0U) && ((DATE) <= (uint32_t)31U)) +#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) > 0U) && ((DATE) <= 31U)) #define IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_WEEKDAY_MONDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_TUESDAY) || \ ((WEEKDAY) == RTC_WEEKDAY_WEDNESDAY) || \ @@ -779,7 +779,7 @@ HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); ((SEL) == RTC_ALARMDATEWEEKDAYSEL_WEEKDAY)) #define IS_RTC_ALARM_MASK(MASK) (((MASK) & 0x7F7F7F7FU) == (uint32_t)RESET) #define IS_RTC_ALARM(ALARM) (((ALARM) == RTC_ALARM_A) || ((ALARM) == RTC_ALARM_B)) -#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= (uint32_t)0x00007FFFU) +#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= 0x00007FFFU) #define IS_RTC_ALARM_SUB_SECOND_MASK(MASK) (((MASK) == RTC_ALARMSUBSECONDMASK_ALL) || \ ((MASK) == RTC_ALARMSUBSECONDMASK_SS14_1) || \ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h index 3a5ff6b..3345683 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_rtc_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of RTC HAL Extension module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -100,26 +100,26 @@ typedef struct /** @defgroup RTCEx_Backup_Registers_Definitions RTC Backup Registers Definitions * @{ */ -#define RTC_BKP_DR0 ((uint32_t)0x00000000U) -#define RTC_BKP_DR1 ((uint32_t)0x00000001U) -#define RTC_BKP_DR2 ((uint32_t)0x00000002U) -#define RTC_BKP_DR3 ((uint32_t)0x00000003U) -#define RTC_BKP_DR4 ((uint32_t)0x00000004U) -#define RTC_BKP_DR5 ((uint32_t)0x00000005U) -#define RTC_BKP_DR6 ((uint32_t)0x00000006U) -#define RTC_BKP_DR7 ((uint32_t)0x00000007U) -#define RTC_BKP_DR8 ((uint32_t)0x00000008U) -#define RTC_BKP_DR9 ((uint32_t)0x00000009U) -#define RTC_BKP_DR10 ((uint32_t)0x0000000AU) -#define RTC_BKP_DR11 ((uint32_t)0x0000000BU) -#define RTC_BKP_DR12 ((uint32_t)0x0000000CU) -#define RTC_BKP_DR13 ((uint32_t)0x0000000DU) -#define RTC_BKP_DR14 ((uint32_t)0x0000000EU) -#define RTC_BKP_DR15 ((uint32_t)0x0000000FU) -#define RTC_BKP_DR16 ((uint32_t)0x00000010U) -#define RTC_BKP_DR17 ((uint32_t)0x00000011U) -#define RTC_BKP_DR18 ((uint32_t)0x00000012U) -#define RTC_BKP_DR19 ((uint32_t)0x00000013U) +#define RTC_BKP_DR0 0x00000000U +#define RTC_BKP_DR1 0x00000001U +#define RTC_BKP_DR2 0x00000002U +#define RTC_BKP_DR3 0x00000003U +#define RTC_BKP_DR4 0x00000004U +#define RTC_BKP_DR5 0x00000005U +#define RTC_BKP_DR6 0x00000006U +#define RTC_BKP_DR7 0x00000007U +#define RTC_BKP_DR8 0x00000008U +#define RTC_BKP_DR9 0x00000009U +#define RTC_BKP_DR10 0x0000000AU +#define RTC_BKP_DR11 0x0000000BU +#define RTC_BKP_DR12 0x0000000CU +#define RTC_BKP_DR13 0x0000000DU +#define RTC_BKP_DR14 0x0000000EU +#define RTC_BKP_DR15 0x0000000FU +#define RTC_BKP_DR16 0x00000010U +#define RTC_BKP_DR17 0x00000011U +#define RTC_BKP_DR18 0x00000012U +#define RTC_BKP_DR19 0x00000013U /** * @} */ @@ -127,8 +127,8 @@ typedef struct /** @defgroup RTCEx_Time_Stamp_Edges_definitions RTC TimeStamp Edges Definitions * @{ */ -#define RTC_TIMESTAMPEDGE_RISING ((uint32_t)0x00000000U) -#define RTC_TIMESTAMPEDGE_FALLING ((uint32_t)0x00000008U) +#define RTC_TIMESTAMPEDGE_RISING 0x00000000U +#define RTC_TIMESTAMPEDGE_FALLING 0x00000008U /** * @} */ @@ -149,10 +149,10 @@ typedef struct * @{ */ -#define RTC_TAMPERPIN_DEFAULT ((uint32_t)0x00000000U) +#define RTC_TAMPERPIN_DEFAULT 0x00000000U #if !defined(STM32F412Zx) && !defined(STM32F412Vx) && !defined(STM32F412Rx) && !defined(STM32F412Cx) && !defined(STM32F413xx) && !defined(STM32F423xx) -#define RTC_TAMPERPIN_POS1 ((uint32_t)0x00010000U) +#define RTC_TAMPERPIN_POS1 0x00010000U #endif /** * @} @@ -161,10 +161,10 @@ typedef struct /** @defgroup RTCEx_TimeStamp_Pin_Selection RTC TimeStamp Pins Selection * @{ */ -#define RTC_TIMESTAMPPIN_DEFAULT ((uint32_t)0x00000000U) +#define RTC_TIMESTAMPPIN_DEFAULT 0x00000000U #if !defined(STM32F412Zx) && !defined(STM32F412Vx) && !defined(STM32F412Rx) && !defined(STM32F412Cx) && !defined(STM32F413xx) && !defined(STM32F423xx) -#define RTC_TIMESTAMPPIN_POS1 ((uint32_t)0x00020000U) +#define RTC_TIMESTAMPPIN_POS1 0x00020000U #endif /** * @} @@ -173,8 +173,8 @@ typedef struct /** @defgroup RTCEx_Tamper_Trigger_Definitions RTC Tamper Triggers Definitions * @{ */ -#define RTC_TAMPERTRIGGER_RISINGEDGE ((uint32_t)0x00000000U) -#define RTC_TAMPERTRIGGER_FALLINGEDGE ((uint32_t)0x00000002U) +#define RTC_TAMPERTRIGGER_RISINGEDGE 0x00000000U +#define RTC_TAMPERTRIGGER_FALLINGEDGE 0x00000002U #define RTC_TAMPERTRIGGER_LOWLEVEL RTC_TAMPERTRIGGER_RISINGEDGE #define RTC_TAMPERTRIGGER_HIGHLEVEL RTC_TAMPERTRIGGER_FALLINGEDGE /** @@ -184,13 +184,13 @@ typedef struct /** @defgroup RTCEx_Tamper_Filter_Definitions RTC Tamper Filter Definitions * @{ */ -#define RTC_TAMPERFILTER_DISABLE ((uint32_t)0x00000000U) /*!< Tamper filter is disabled */ +#define RTC_TAMPERFILTER_DISABLE 0x00000000U /*!< Tamper filter is disabled */ -#define RTC_TAMPERFILTER_2SAMPLE ((uint32_t)0x00000800U) /*!< Tamper is activated after 2 +#define RTC_TAMPERFILTER_2SAMPLE 0x00000800U /*!< Tamper is activated after 2 consecutive samples at the active level */ -#define RTC_TAMPERFILTER_4SAMPLE ((uint32_t)0x00001000U) /*!< Tamper is activated after 4 +#define RTC_TAMPERFILTER_4SAMPLE 0x00001000U /*!< Tamper is activated after 4 consecutive samples at the active level */ -#define RTC_TAMPERFILTER_8SAMPLE ((uint32_t)0x00001800U) /*!< Tamper is activated after 8 +#define RTC_TAMPERFILTER_8SAMPLE 0x00001800U /*!< Tamper is activated after 8 consecutive samples at the active level. */ /** * @} @@ -199,21 +199,21 @@ typedef struct /** @defgroup RTCEx_Tamper_Sampling_Frequencies_Definitions RTC Tamper Sampling Frequencies Definitions * @{ */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV32768 ((uint32_t)0x00000000U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV32768 0x00000000U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 32768 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV16384 ((uint32_t)0x00000100U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV16384 0x00000100U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 16384 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV8192 ((uint32_t)0x00000200U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV8192 0x00000200U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 8192 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV4096 ((uint32_t)0x00000300U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV4096 0x00000300U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 4096 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV2048 ((uint32_t)0x00000400U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV2048 0x00000400U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 2048 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV1024 ((uint32_t)0x00000500U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV1024 0x00000500U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 1024 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV512 ((uint32_t)0x00000600U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV512 0x00000600U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 512 */ -#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV256 ((uint32_t)0x00000700U) /*!< Each of the tamper inputs are sampled +#define RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV256 0x00000700U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 256 */ /** * @} @@ -222,13 +222,13 @@ typedef struct /** @defgroup RTCEx_Tamper_Pin_Precharge_Duration_Definitions RTC Tamper Pin Precharge Duration Definitions * @{ */ -#define RTC_TAMPERPRECHARGEDURATION_1RTCCLK ((uint32_t)0x00000000U) /*!< Tamper pins are pre-charged before +#define RTC_TAMPERPRECHARGEDURATION_1RTCCLK 0x00000000U /*!< Tamper pins are pre-charged before sampling during 1 RTCCLK cycle */ -#define RTC_TAMPERPRECHARGEDURATION_2RTCCLK ((uint32_t)0x00002000U) /*!< Tamper pins are pre-charged before +#define RTC_TAMPERPRECHARGEDURATION_2RTCCLK 0x00002000U /*!< Tamper pins are pre-charged before sampling during 2 RTCCLK cycles */ -#define RTC_TAMPERPRECHARGEDURATION_4RTCCLK ((uint32_t)0x00004000U) /*!< Tamper pins are pre-charged before +#define RTC_TAMPERPRECHARGEDURATION_4RTCCLK 0x00004000U /*!< Tamper pins are pre-charged before sampling during 4 RTCCLK cycles */ -#define RTC_TAMPERPRECHARGEDURATION_8RTCCLK ((uint32_t)0x00006000U) /*!< Tamper pins are pre-charged before +#define RTC_TAMPERPRECHARGEDURATION_8RTCCLK 0x00006000U /*!< Tamper pins are pre-charged before sampling during 8 RTCCLK cycles */ /** * @} @@ -238,7 +238,7 @@ typedef struct * @{ */ #define RTC_TIMESTAMPONTAMPERDETECTION_ENABLE ((uint32_t)RTC_TAFCR_TAMPTS) /*!< TimeStamp on Tamper Detection event saved */ -#define RTC_TIMESTAMPONTAMPERDETECTION_DISABLE ((uint32_t)0x00000000U) /*!< TimeStamp on Tamper Detection event is not saved */ +#define RTC_TIMESTAMPONTAMPERDETECTION_DISABLE 0x00000000U /*!< TimeStamp on Tamper Detection event is not saved */ /** * @} */ @@ -246,7 +246,7 @@ typedef struct /** @defgroup RTCEx_Tamper_Pull_UP_Definitions RTC Tamper Pull Up Definitions * @{ */ -#define RTC_TAMPER_PULLUP_ENABLE ((uint32_t)0x00000000U) /*!< TimeStamp on Tamper Detection event saved */ +#define RTC_TAMPER_PULLUP_ENABLE 0x00000000U /*!< TimeStamp on Tamper Detection event saved */ #define RTC_TAMPER_PULLUP_DISABLE ((uint32_t)RTC_TAFCR_TAMPPUDIS) /*!< TimeStamp on Tamper Detection event is not saved */ /** * @} @@ -255,12 +255,12 @@ typedef struct /** @defgroup RTCEx_Wakeup_Timer_Definitions RTC Wake-up Timer Definitions * @{ */ -#define RTC_WAKEUPCLOCK_RTCCLK_DIV16 ((uint32_t)0x00000000U) -#define RTC_WAKEUPCLOCK_RTCCLK_DIV8 ((uint32_t)0x00000001U) -#define RTC_WAKEUPCLOCK_RTCCLK_DIV4 ((uint32_t)0x00000002U) -#define RTC_WAKEUPCLOCK_RTCCLK_DIV2 ((uint32_t)0x00000003U) -#define RTC_WAKEUPCLOCK_CK_SPRE_16BITS ((uint32_t)0x00000004U) -#define RTC_WAKEUPCLOCK_CK_SPRE_17BITS ((uint32_t)0x00000006U) +#define RTC_WAKEUPCLOCK_RTCCLK_DIV16 0x00000000U +#define RTC_WAKEUPCLOCK_RTCCLK_DIV8 0x00000001U +#define RTC_WAKEUPCLOCK_RTCCLK_DIV4 0x00000002U +#define RTC_WAKEUPCLOCK_RTCCLK_DIV2 0x00000003U +#define RTC_WAKEUPCLOCK_CK_SPRE_16BITS 0x00000004U +#define RTC_WAKEUPCLOCK_CK_SPRE_17BITS 0x00000006U /** * @} */ @@ -268,8 +268,8 @@ typedef struct /** @defgroup RTCEx_Digital_Calibration_Definitions RTC Digital Calib Definitions * @{ */ -#define RTC_CALIBSIGN_POSITIVE ((uint32_t)0x00000000U) -#define RTC_CALIBSIGN_NEGATIVE ((uint32_t)0x00000080U) +#define RTC_CALIBSIGN_POSITIVE 0x00000000U +#define RTC_CALIBSIGN_NEGATIVE 0x00000080U /** * @} */ @@ -277,11 +277,11 @@ typedef struct /** @defgroup RTCEx_Smooth_calib_period_Definitions RTC Smooth Calib Period Definitions * @{ */ -#define RTC_SMOOTHCALIB_PERIOD_32SEC ((uint32_t)0x00000000U) /*!< If RTCCLK = 32768 Hz, Smooth calibration +#define RTC_SMOOTHCALIB_PERIOD_32SEC 0x00000000U /*!< If RTCCLK = 32768 Hz, Smooth calibration period is 32s, else 2exp20 RTCCLK seconds */ -#define RTC_SMOOTHCALIB_PERIOD_16SEC ((uint32_t)0x00002000U) /*!< If RTCCLK = 32768 Hz, Smooth calibration +#define RTC_SMOOTHCALIB_PERIOD_16SEC 0x00002000U /*!< If RTCCLK = 32768 Hz, Smooth calibration period is 16s, else 2exp19 RTCCLK seconds */ -#define RTC_SMOOTHCALIB_PERIOD_8SEC ((uint32_t)0x00004000U) /*!< If RTCCLK = 32768 Hz, Smooth calibration +#define RTC_SMOOTHCALIB_PERIOD_8SEC 0x00004000U /*!< If RTCCLK = 32768 Hz, Smooth calibration period is 8s, else 2exp18 RTCCLK seconds */ /** * @} @@ -290,10 +290,10 @@ typedef struct /** @defgroup RTCEx_Smooth_calib_Plus_pulses_Definitions RTC Smooth Calib Plus Pulses Definitions * @{ */ -#define RTC_SMOOTHCALIB_PLUSPULSES_SET ((uint32_t)0x00008000U) /*!< The number of RTCCLK pulses added +#define RTC_SMOOTHCALIB_PLUSPULSES_SET 0x00008000U /*!< The number of RTCCLK pulses added during a X -second window = Y - CALM[8:0] with Y = 512, 256, 128 when X = 32, 16, 8 */ -#define RTC_SMOOTHCALIB_PLUSPULSES_RESET ((uint32_t)0x00000000U) /*!< The number of RTCCLK pulses subbstited +#define RTC_SMOOTHCALIB_PLUSPULSES_RESET 0x00000000U /*!< The number of RTCCLK pulses subbstited during a 32-second window = CALM[8:0] */ /** * @} @@ -302,8 +302,8 @@ typedef struct /** @defgroup RTCEx_Add_1_Second_Parameter_Definitions RTC Add 1 Second Parameter Definitions * @{ */ -#define RTC_SHIFTADD1S_RESET ((uint32_t)0x00000000U) -#define RTC_SHIFTADD1S_SET ((uint32_t)0x80000000U) +#define RTC_SHIFTADD1S_RESET 0x00000000U +#define RTC_SHIFTADD1S_SET 0x80000000U /** * @} */ @@ -312,8 +312,8 @@ typedef struct /** @defgroup RTCEx_Calib_Output_selection_Definitions RTC Calib Output Selection Definitions * @{ */ -#define RTC_CALIBOUTPUT_512HZ ((uint32_t)0x00000000U) -#define RTC_CALIBOUTPUT_1HZ ((uint32_t)0x00080000U) +#define RTC_CALIBOUTPUT_512HZ 0x00000000U +#define RTC_CALIBOUTPUT_1HZ 0x00080000U /** * @} */ @@ -461,7 +461,7 @@ typedef struct */ #define __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_RISING_FALLING_EDGE() do { __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_RISING_EDGE();\ __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_FALLING_EDGE();\ - } while(0) + } while(0U) /** * @brief Disable rising & falling edge trigger on the RTC Wake-up Timer associated Exti line. @@ -470,7 +470,7 @@ typedef struct */ #define __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_RISING_FALLING_EDGE() do { __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_RISING_EDGE();\ __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_FALLING_EDGE();\ - } while(0) + } while(0U) /** * @brief Check whether the RTC Wake-up Timer associated Exti line interrupt flag is set or not. @@ -718,7 +718,7 @@ typedef struct */ #define __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_FALLING_EDGE() do { __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_RISING_EDGE();\ __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_FALLING_EDGE(); \ - } while(0) + } while(0U) /** * @brief Disable rising & falling edge trigger on the RTC Tamper and Timestamp associated Exti line. @@ -727,7 +727,7 @@ typedef struct */ #define __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_RISING_FALLING_EDGE() do { __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_RISING_EDGE();\ __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_FALLING_EDGE();\ - } while(0) + } while(0U) /** * @brief Check whether the RTC Tamper and Timestamp associated Exti line interrupt flag is set or not. diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai.h index c1fcd19..2cba07e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_sai.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SAI HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -258,15 +258,15 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Error_Code SAI Error Code * @{ */ -#define HAL_SAI_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_SAI_ERROR_OVR ((uint32_t)0x00000001U) /*!< Overrun Error */ -#define HAL_SAI_ERROR_UDR ((uint32_t)0x00000002U) /*!< Underrun error */ -#define HAL_SAI_ERROR_AFSDET ((uint32_t)0x00000004U) /*!< Anticipated Frame synchronisation detection */ -#define HAL_SAI_ERROR_LFSDET ((uint32_t)0x00000008U) /*!< Late Frame synchronisation detection */ -#define HAL_SAI_ERROR_CNREADY ((uint32_t)0x00000010U) /*!< codec not ready */ -#define HAL_SAI_ERROR_WCKCFG ((uint32_t)0x00000020U) /*!< Wrong clock configuration */ -#define HAL_SAI_ERROR_TIMEOUT ((uint32_t)0x00000040U) /*!< Timeout error */ -#define HAL_SAI_ERROR_DMA ((uint32_t)0x00000080U) /*!< DMA error */ +#define HAL_SAI_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_SAI_ERROR_OVR 0x00000001U /*!< Overrun Error */ +#define HAL_SAI_ERROR_UDR 0x00000002U /*!< Underrun error */ +#define HAL_SAI_ERROR_AFSDET 0x00000004U /*!< Anticipated Frame synchronisation detection */ +#define HAL_SAI_ERROR_LFSDET 0x00000008U /*!< Late Frame synchronisation detection */ +#define HAL_SAI_ERROR_CNREADY 0x00000010U /*!< codec not ready */ +#define HAL_SAI_ERROR_WCKCFG 0x00000020U /*!< Wrong clock configuration */ +#define HAL_SAI_ERROR_TIMEOUT 0x00000040U /*!< Timeout error */ +#define HAL_SAI_ERROR_DMA 0x00000080U /*!< DMA error */ /** * @} */ @@ -307,16 +307,16 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Audio_Frequency SAI Audio Frequency * @{ */ -#define SAI_AUDIO_FREQUENCY_192K ((uint32_t)192000U) -#define SAI_AUDIO_FREQUENCY_96K ((uint32_t)96000U) -#define SAI_AUDIO_FREQUENCY_48K ((uint32_t)48000U) -#define SAI_AUDIO_FREQUENCY_44K ((uint32_t)44100U) -#define SAI_AUDIO_FREQUENCY_32K ((uint32_t)32000U) -#define SAI_AUDIO_FREQUENCY_22K ((uint32_t)22050U) -#define SAI_AUDIO_FREQUENCY_16K ((uint32_t)16000U) -#define SAI_AUDIO_FREQUENCY_11K ((uint32_t)11025U) -#define SAI_AUDIO_FREQUENCY_8K ((uint32_t)8000U) -#define SAI_AUDIO_FREQUENCY_MCKDIV ((uint32_t)0U) +#define SAI_AUDIO_FREQUENCY_192K 192000U +#define SAI_AUDIO_FREQUENCY_96K 96000U +#define SAI_AUDIO_FREQUENCY_48K 48000U +#define SAI_AUDIO_FREQUENCY_44K 44100U +#define SAI_AUDIO_FREQUENCY_32K 32000U +#define SAI_AUDIO_FREQUENCY_22K 22050U +#define SAI_AUDIO_FREQUENCY_16K 16000U +#define SAI_AUDIO_FREQUENCY_11K 11025U +#define SAI_AUDIO_FREQUENCY_8K 8000U +#define SAI_AUDIO_FREQUENCY_MCKDIV 0U /** * @} */ @@ -324,7 +324,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Mode SAI Block Mode * @{ */ -#define SAI_MODEMASTER_TX ((uint32_t)0x00000000U) +#define SAI_MODEMASTER_TX 0x00000000U #define SAI_MODEMASTER_RX ((uint32_t)SAI_xCR1_MODE_0) #define SAI_MODESLAVE_TX ((uint32_t)SAI_xCR1_MODE_1) #define SAI_MODESLAVE_RX ((uint32_t)(SAI_xCR1_MODE_1 | SAI_xCR1_MODE_0)) @@ -335,7 +335,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Protocol SAI Block Protocol * @{ */ -#define SAI_FREE_PROTOCOL ((uint32_t)0x00000000U) +#define SAI_FREE_PROTOCOL 0x00000000U #define SAI_SPDIF_PROTOCOL ((uint32_t)SAI_xCR1_PRTCFG_0) #define SAI_AC97_PROTOCOL ((uint32_t)SAI_xCR1_PRTCFG_1) /** @@ -358,7 +358,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_MSB_LSB_transmission SAI Block MSB LSB transmission * @{ */ -#define SAI_FIRSTBIT_MSB ((uint32_t)0x00000000U) +#define SAI_FIRSTBIT_MSB 0x00000000U #define SAI_FIRSTBIT_LSB ((uint32_t)SAI_xCR1_LSBFIRST) /** * @} @@ -387,7 +387,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Output_Drive SAI Block Output Drive * @{ */ -#define SAI_OUTPUTDRIVE_DISABLE ((uint32_t)0x00000000U) +#define SAI_OUTPUTDRIVE_DISABLE 0x00000000U #define SAI_OUTPUTDRIVE_ENABLE ((uint32_t)SAI_xCR1_OUTDRIV) /** * @} @@ -396,7 +396,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_NoDivider SAI Block NoDivider * @{ */ -#define SAI_MASTERDIVIDER_ENABLE ((uint32_t)0x00000000U) +#define SAI_MASTERDIVIDER_ENABLE 0x00000000U #define SAI_MASTERDIVIDER_DISABLE ((uint32_t)SAI_xCR1_NODIV) /** * @} @@ -405,7 +405,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_FS_Definition SAI Block FS Definition * @{ */ -#define SAI_FS_STARTFRAME ((uint32_t)0x00000000U) +#define SAI_FS_STARTFRAME 0x00000000U #define SAI_FS_CHANNEL_IDENTIFICATION ((uint32_t)SAI_xFRCR_FSDEF) /** * @} @@ -414,7 +414,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_FS_Polarity SAI Block FS Polarity * @{ */ -#define SAI_FS_ACTIVE_LOW ((uint32_t)0x00000000U) +#define SAI_FS_ACTIVE_LOW 0x00000000U #define SAI_FS_ACTIVE_HIGH ((uint32_t)SAI_xFRCR_FSPOL) /** * @} @@ -423,7 +423,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_FS_Offset SAI Block FS Offset * @{ */ -#define SAI_FS_FIRSTBIT ((uint32_t)0x00000000U) +#define SAI_FS_FIRSTBIT 0x00000000U #define SAI_FS_BEFOREFIRSTBIT ((uint32_t)SAI_xFRCR_FSOFF) /** * @} @@ -432,7 +432,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Slot_Size SAI Block Slot Size * @{ */ -#define SAI_SLOTSIZE_DATASIZE ((uint32_t)0x00000000U) +#define SAI_SLOTSIZE_DATASIZE 0x00000000U #define SAI_SLOTSIZE_16B ((uint32_t)SAI_xSLOTR_SLOTSZ_0) #define SAI_SLOTSIZE_32B ((uint32_t)SAI_xSLOTR_SLOTSZ_1) /** @@ -442,24 +442,24 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Slot_Active SAI Block Slot Active * @{ */ -#define SAI_SLOT_NOTACTIVE ((uint32_t)0x00000000U) -#define SAI_SLOTACTIVE_0 ((uint32_t)0x00000001U) -#define SAI_SLOTACTIVE_1 ((uint32_t)0x00000002U) -#define SAI_SLOTACTIVE_2 ((uint32_t)0x00000004U) -#define SAI_SLOTACTIVE_3 ((uint32_t)0x00000008U) -#define SAI_SLOTACTIVE_4 ((uint32_t)0x00000010U) -#define SAI_SLOTACTIVE_5 ((uint32_t)0x00000020U) -#define SAI_SLOTACTIVE_6 ((uint32_t)0x00000040U) -#define SAI_SLOTACTIVE_7 ((uint32_t)0x00000080U) -#define SAI_SLOTACTIVE_8 ((uint32_t)0x00000100U) -#define SAI_SLOTACTIVE_9 ((uint32_t)0x00000200U) -#define SAI_SLOTACTIVE_10 ((uint32_t)0x00000400U) -#define SAI_SLOTACTIVE_11 ((uint32_t)0x00000800U) -#define SAI_SLOTACTIVE_12 ((uint32_t)0x00001000U) -#define SAI_SLOTACTIVE_13 ((uint32_t)0x00002000U) -#define SAI_SLOTACTIVE_14 ((uint32_t)0x00004000U) -#define SAI_SLOTACTIVE_15 ((uint32_t)0x00008000U) -#define SAI_SLOTACTIVE_ALL ((uint32_t)0x0000FFFFU) +#define SAI_SLOT_NOTACTIVE 0x00000000U +#define SAI_SLOTACTIVE_0 0x00000001U +#define SAI_SLOTACTIVE_1 0x00000002U +#define SAI_SLOTACTIVE_2 0x00000004U +#define SAI_SLOTACTIVE_3 0x00000008U +#define SAI_SLOTACTIVE_4 0x00000010U +#define SAI_SLOTACTIVE_5 0x00000020U +#define SAI_SLOTACTIVE_6 0x00000040U +#define SAI_SLOTACTIVE_7 0x00000080U +#define SAI_SLOTACTIVE_8 0x00000100U +#define SAI_SLOTACTIVE_9 0x00000200U +#define SAI_SLOTACTIVE_10 0x00000400U +#define SAI_SLOTACTIVE_11 0x00000800U +#define SAI_SLOTACTIVE_12 0x00001000U +#define SAI_SLOTACTIVE_13 0x00002000U +#define SAI_SLOTACTIVE_14 0x00004000U +#define SAI_SLOTACTIVE_15 0x00008000U +#define SAI_SLOTACTIVE_ALL 0x0000FFFFU /** * @} */ @@ -467,7 +467,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Mono_Stereo_Mode SAI Mono Stereo Mode * @{ */ -#define SAI_STEREOMODE ((uint32_t)0x00000000U) +#define SAI_STEREOMODE 0x00000000U #define SAI_MONOMODE ((uint32_t)SAI_xCR1_MONO) /** * @} @@ -476,7 +476,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_TRIState_Management SAI TRIState Management * @{ */ -#define SAI_OUTPUT_NOTRELEASED ((uint32_t)0x00000000U) +#define SAI_OUTPUT_NOTRELEASED 0x00000000U #define SAI_OUTPUT_RELEASED ((uint32_t)SAI_xCR2_TRIS) /** * @} @@ -485,7 +485,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Fifo_Threshold SAI Block Fifo Threshold * @{ */ -#define SAI_FIFOTHRESHOLD_EMPTY ((uint32_t)0x00000000U) +#define SAI_FIFOTHRESHOLD_EMPTY 0x00000000U #define SAI_FIFOTHRESHOLD_1QF ((uint32_t)(SAI_xCR2_FTH_0)) #define SAI_FIFOTHRESHOLD_HF ((uint32_t)(SAI_xCR2_FTH_1)) #define SAI_FIFOTHRESHOLD_3QF ((uint32_t)(SAI_xCR2_FTH_1 | SAI_xCR2_FTH_0)) @@ -497,7 +497,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Companding_Mode SAI Block Companding Mode * @{ */ -#define SAI_NOCOMPANDING ((uint32_t)0x00000000U) +#define SAI_NOCOMPANDING 0x00000000U #define SAI_ULAW_1CPL_COMPANDING ((uint32_t)(SAI_xCR2_COMP_1)) #define SAI_ALAW_1CPL_COMPANDING ((uint32_t)(SAI_xCR2_COMP_1 | SAI_xCR2_COMP_0)) #define SAI_ULAW_2CPL_COMPANDING ((uint32_t)(SAI_xCR2_COMP_1 | SAI_xCR2_CPL)) @@ -509,7 +509,7 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Mute_Value SAI Block Mute Value * @{ */ -#define SAI_ZERO_VALUE ((uint32_t)0x00000000U) +#define SAI_ZERO_VALUE 0x00000000U #define SAI_LAST_SENT_VALUE ((uint32_t)SAI_xCR2_MUTEVAL) /** * @} @@ -546,12 +546,12 @@ typedef struct __SAI_HandleTypeDef /** @defgroup SAI_Block_Fifo_Status_Level SAI Block Fifo Status Level * @{ */ -#define SAI_FIFOSTATUS_EMPTY ((uint32_t)0x00000000U) -#define SAI_FIFOSTATUS_LESS1QUARTERFULL ((uint32_t)0x00010000U) -#define SAI_FIFOSTATUS_1QUARTERFULL ((uint32_t)0x00020000U) -#define SAI_FIFOSTATUS_HALFFULL ((uint32_t)0x00030000U) -#define SAI_FIFOSTATUS_3QUARTERFULL ((uint32_t)0x00040000U) -#define SAI_FIFOSTATUS_FULL ((uint32_t)0x00050000U) +#define SAI_FIFOSTATUS_EMPTY 0x00000000U +#define SAI_FIFOSTATUS_LESS1QUARTERFULL 0x00010000U +#define SAI_FIFOSTATUS_1QUARTERFULL 0x00020000U +#define SAI_FIFOSTATUS_HALFFULL 0x00030000U +#define SAI_FIFOSTATUS_3QUARTERFULL 0x00040000U +#define SAI_FIFOSTATUS_FULL 0x00050000U /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai_ex.h index 1cdaca6..11b3ba5 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sai_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_sai_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SAI Extension HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -64,15 +64,15 @@ * @{ */ #if defined(STM32F413xx) || defined(STM32F423xx) -#define SAI_CLKSOURCE_PLLI2S ((uint32_t)0x00000000U) -#define SAI_CLKSOURCE_EXT ((uint32_t)0x00100000U) -#define SAI_CLKSOURCE_PLLR ((uint32_t)0x00200000U) -#define SAI_CLKSOURCE_HS ((uint32_t)0x00300000U) +#define SAI_CLKSOURCE_PLLI2S 0x00000000U +#define SAI_CLKSOURCE_EXT 0x00100000U +#define SAI_CLKSOURCE_PLLR 0x00200000U +#define SAI_CLKSOURCE_HS 0x00300000U #else -#define SAI_CLKSOURCE_PLLSAI ((uint32_t)0x00000000U) -#define SAI_CLKSOURCE_PLLI2S ((uint32_t)0x00100000U) -#define SAI_CLKSOURCE_EXT ((uint32_t)0x00200000U) -#define SAI_CLKSOURCE_NA ((uint32_t)0x00400000U) /*!< No applicable for STM32F446xx */ +#define SAI_CLKSOURCE_PLLSAI 0x00000000U +#define SAI_CLKSOURCE_PLLI2S 0x00100000U +#define SAI_CLKSOURCE_EXT 0x00200000U +#define SAI_CLKSOURCE_NA 0x00400000U /*!< No applicable for STM32F446xx */ #endif diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h index d83bb63..6b96ccd 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_sd.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SD HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -42,11 +42,13 @@ #ifdef __cplusplus extern "C" { #endif + #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_ll_sdmmc.h" @@ -57,55 +59,123 @@ /** @defgroup SD SD * @brief SD HAL module driver * @{ - */ + */ /* Exported types ------------------------------------------------------------*/ /** @defgroup SD_Exported_Types SD Exported Types * @{ */ -/** @defgroup SD_Exported_Types_Group1 SD Handle Structure definition +/** @defgroup SD_Exported_Types_Group1 SD State enumeration structure + * @{ + */ +typedef enum +{ + HAL_SD_STATE_RESET = 0x00000000U, /*!< SD not yet initialized or disabled */ + HAL_SD_STATE_READY = 0x00000001U, /*!< SD initialized and ready for use */ + HAL_SD_STATE_TIMEOUT = 0x00000002U, /*!< SD Timeout state */ + HAL_SD_STATE_BUSY = 0x00000003U, /*!< SD process ongoing */ + HAL_SD_STATE_PROGRAMMING = 0x00000004U, /*!< SD Programming State */ + HAL_SD_STATE_RECEIVING = 0x00000005U, /*!< SD Receinving State */ + HAL_SD_STATE_TRANSFER = 0x00000006U, /*!< SD Transfert State */ + HAL_SD_STATE_ERROR = 0x0000000FU /*!< SD is in error state */ +}HAL_SD_StateTypeDef; +/** + * @} + */ + +/** @defgroup SD_Exported_Types_Group2 SD Card State enumeration structure + * @{ + */ +typedef enum +{ + HAL_SD_CARD_READY = 0x00000001U, /*!< Card state is ready */ + HAL_SD_CARD_IDENTIFICATION = 0x00000002U, /*!< Card is in identification state */ + HAL_SD_CARD_STANDBY = 0x00000003U, /*!< Card is in standby state */ + HAL_SD_CARD_TRANSFER = 0x00000004U, /*!< Card is in transfer state */ + HAL_SD_CARD_SENDING = 0x00000005U, /*!< Card is sending an operation */ + HAL_SD_CARD_RECEIVING = 0x00000006U, /*!< Card is receiving operation information */ + HAL_SD_CARD_PROGRAMMING = 0x00000007U, /*!< Card is in programming state */ + HAL_SD_CARD_DISCONNECTED = 0x00000008U, /*!< Card is disconnected */ + HAL_SD_CARD_ERROR = 0x000000FFU /*!< Card response Error */ +}HAL_SD_CardStateTypeDef; +/** + * @} + */ + +/** @defgroup SD_Exported_Types_Group3 SD Handle Structure definition * @{ */ #define SD_InitTypeDef SDIO_InitTypeDef #define SD_TypeDef SDIO_TypeDef +/** + * @brief SD Card Information Structure definition + */ typedef struct { - SD_TypeDef *Instance; /*!< SDIO register base address */ + uint32_t CardType; /*!< Specifies the card Type */ - SD_InitTypeDef Init; /*!< SD required parameters */ + uint32_t CardVersion; /*!< Specifies the card version */ + + uint32_t Class; /*!< Specifies the class of the card class */ + + uint32_t RelCardAdd; /*!< Specifies the Relative Card Address */ - HAL_LockTypeDef Lock; /*!< SD locking object */ + uint32_t BlockNbr; /*!< Specifies the Card Capacity in blocks */ + + uint32_t BlockSize; /*!< Specifies one block size in bytes */ - uint32_t CardType; /*!< SD card type */ + uint32_t LogBlockNbr; /*!< Specifies the Card logical Capacity in blocks */ + + uint32_t LogBlockSize; /*!< Specifies logical block size in bytes */ + +}HAL_SD_CardInfoTypeDef; + +/** + * @brief SD handle Structure definition + */ +typedef struct +{ + SD_TypeDef *Instance; /*!< SD registers base address */ - uint32_t RCA; /*!< SD relative card address */ + SD_InitTypeDef Init; /*!< SD required parameters */ - uint32_t CSD[4]; /*!< SD card specific data table */ + HAL_LockTypeDef Lock; /*!< SD locking object */ - uint32_t CID[4]; /*!< SD card identification number table */ + uint32_t *pTxBuffPtr; /*!< Pointer to SD Tx transfer Buffer */ + + uint32_t TxXferSize; /*!< SD Tx Transfer size */ + + uint32_t *pRxBuffPtr; /*!< Pointer to SD Rx transfer Buffer */ + + uint32_t RxXferSize; /*!< SD Rx Transfer size */ - __IO uint32_t SdTransferCplt; /*!< SD transfer complete flag in non blocking mode */ + __IO uint32_t Context; /*!< SD transfer context */ + + __IO HAL_SD_StateTypeDef State; /*!< SD card State */ - __IO uint32_t SdTransferErr; /*!< SD transfer error flag in non blocking mode */ + __IO uint32_t ErrorCode; /*!< SD Card Error codes */ + + DMA_HandleTypeDef *hdmarx; /*!< SD Rx DMA handle parameters */ - __IO uint32_t DmaTransferCplt; /*!< SD DMA transfer complete flag */ + DMA_HandleTypeDef *hdmatx; /*!< SD Tx DMA handle parameters */ - __IO uint32_t SdOperation; /*!< SD transfer operation (read/write) */ + HAL_SD_CardInfoTypeDef SdCard; /*!< SD Card information */ - DMA_HandleTypeDef *hdmarx; /*!< SD Rx DMA handle parameters */ + uint32_t CSD[4]; /*!< SD card specific data table */ - DMA_HandleTypeDef *hdmatx; /*!< SD Tx DMA handle parameters */ + uint32_t CID[4]; /*!< SD card identification number table */ }SD_HandleTypeDef; + /** * @} */ -/** @defgroup SD_Exported_Types_Group2 Card Specific Data: CSD Register +/** @defgroup SD_Exported_Types_Group4 Card Specific Data: CSD Register * @{ - */ + */ typedef struct { __IO uint8_t CSDStruct; /*!< CSD structure */ @@ -145,15 +215,15 @@ typedef struct __IO uint8_t ECC; /*!< ECC code */ __IO uint8_t CSD_CRC; /*!< CSD CRC */ __IO uint8_t Reserved4; /*!< Always 1 */ - -}HAL_SD_CSDTypedef; + +}HAL_SD_CardCSDTypeDef; /** * @} */ -/** @defgroup SD_Exported_Types_Group3 Card Identification Data: CID Register +/** @defgroup SD_Exported_Types_Group5 Card Identification Data: CID Register * @{ - */ + */ typedef struct { __IO uint8_t ManufacturerID; /*!< Manufacturer ID */ @@ -167,304 +237,160 @@ typedef struct __IO uint8_t CID_CRC; /*!< CID CRC */ __IO uint8_t Reserved2; /*!< Always 1 */ -}HAL_SD_CIDTypedef; +}HAL_SD_CardCIDTypeDef; /** * @} */ -/** @defgroup SD_Exported_Types_Group4 SD Card Status returned by ACMD13 +/** @defgroup SD_Exported_Types_Group6 SD Card Status returned by ACMD13 * @{ - */ -typedef struct -{ - __IO uint8_t DAT_BUS_WIDTH; /*!< Shows the currently defined data bus width */ - __IO uint8_t SECURED_MODE; /*!< Card is in secured mode of operation */ - __IO uint16_t SD_CARD_TYPE; /*!< Carries information about card type */ - __IO uint32_t SIZE_OF_PROTECTED_AREA; /*!< Carries information about the capacity of protected area */ - __IO uint8_t SPEED_CLASS; /*!< Carries information about the speed class of the card */ - __IO uint8_t PERFORMANCE_MOVE; /*!< Carries information about the card's performance move */ - __IO uint8_t AU_SIZE; /*!< Carries information about the card's allocation unit size */ - __IO uint16_t ERASE_SIZE; /*!< Determines the number of AUs to be erased in one operation */ - __IO uint8_t ERASE_TIMEOUT; /*!< Determines the timeout for any number of AU erase */ - __IO uint8_t ERASE_OFFSET; /*!< Carries information about the erase offset */ - -}HAL_SD_CardStatusTypedef; -/** - * @} */ - -/** @defgroup SD_Exported_Types_Group5 SD Card information structure - * @{ - */ typedef struct { - HAL_SD_CSDTypedef SD_csd; /*!< SD card specific data register */ - HAL_SD_CIDTypedef SD_cid; /*!< SD card identification number register */ - uint64_t CardCapacity; /*!< Card capacity */ - uint32_t CardBlockSize; /*!< Card block size */ - uint16_t RCA; /*!< SD relative card address */ - uint8_t CardType; /*!< SD card type */ - -}HAL_SD_CardInfoTypedef; + __IO uint8_t DataBusWidth; /*!< Shows the currently defined data bus width */ + __IO uint8_t SecuredMode; /*!< Card is in secured mode of operation */ + __IO uint16_t CardType; /*!< Carries information about card type */ + __IO uint32_t ProtectedAreaSize; /*!< Carries information about the capacity of protected area */ + __IO uint8_t SpeedClass; /*!< Carries information about the speed class of the card */ + __IO uint8_t PerformanceMove; /*!< Carries information about the card's performance move */ + __IO uint8_t AllocationUnitSize; /*!< Carries information about the card's allocation unit size */ + __IO uint16_t EraseSize; /*!< Determines the number of AUs to be erased in one operation */ + __IO uint8_t EraseTimeout; /*!< Determines the timeout for any number of AU erase */ + __IO uint8_t EraseOffset; /*!< Carries information about the erase offset */ + +}HAL_SD_CardStatusTypeDef; /** * @} */ -/** @defgroup SD_Exported_Types_Group6 SD Error status enumeration Structure definition - * @{ - */ -typedef enum -{ -/** - * @brief SD specific error defines - */ - SD_CMD_CRC_FAIL = (1U), /*!< Command response received (but CRC check failed) */ - SD_DATA_CRC_FAIL = (2U), /*!< Data block sent/received (CRC check failed) */ - SD_CMD_RSP_TIMEOUT = (3U), /*!< Command response timeout */ - SD_DATA_TIMEOUT = (4U), /*!< Data timeout */ - SD_TX_UNDERRUN = (5U), /*!< Transmit FIFO underrun */ - SD_RX_OVERRUN = (6U), /*!< Receive FIFO overrun */ - SD_START_BIT_ERR = (7U), /*!< Start bit not detected on all data signals in wide bus mode */ - SD_CMD_OUT_OF_RANGE = (8U), /*!< Command's argument was out of range. */ - SD_ADDR_MISALIGNED = (9U), /*!< Misaligned address */ - SD_BLOCK_LEN_ERR = (10U), /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */ - SD_ERASE_SEQ_ERR = (11U), /*!< An error in the sequence of erase command occurs. */ - SD_BAD_ERASE_PARAM = (12U), /*!< An invalid selection for erase groups */ - SD_WRITE_PROT_VIOLATION = (13U), /*!< Attempt to program a write protect block */ - SD_LOCK_UNLOCK_FAILED = (14U), /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */ - SD_COM_CRC_FAILED = (15U), /*!< CRC check of the previous command failed */ - SD_ILLEGAL_CMD = (16U), /*!< Command is not legal for the card state */ - SD_CARD_ECC_FAILED = (17U), /*!< Card internal ECC was applied but failed to correct the data */ - SD_CC_ERROR = (18U), /*!< Internal card controller error */ - SD_GENERAL_UNKNOWN_ERROR = (19U), /*!< General or unknown error */ - SD_STREAM_READ_UNDERRUN = (20U), /*!< The card could not sustain data transfer in stream read operation. */ - SD_STREAM_WRITE_OVERRUN = (21U), /*!< The card could not sustain data programming in stream mode */ - SD_CID_CSD_OVERWRITE = (22U), /*!< CID/CSD overwrite error */ - SD_WP_ERASE_SKIP = (23U), /*!< Only partial address space was erased */ - SD_CARD_ECC_DISABLED = (24U), /*!< Command has been executed without using internal ECC */ - SD_ERASE_RESET = (25U), /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */ - SD_AKE_SEQ_ERROR = (26U), /*!< Error in sequence of authentication. */ - SD_INVALID_VOLTRANGE = (27U), - SD_ADDR_OUT_OF_RANGE = (28U), - SD_SWITCH_ERROR = (29U), - SD_SDIO_DISABLED = (30U), - SD_SDIO_FUNCTION_BUSY = (31U), - SD_SDIO_FUNCTION_FAILED = (32U), - SD_SDIO_UNKNOWN_FUNCTION = (33U), - -/** - * @brief Standard error defines - */ - SD_INTERNAL_ERROR = (34U), - SD_NOT_CONFIGURED = (35U), - SD_REQUEST_PENDING = (36U), - SD_REQUEST_NOT_APPLICABLE = (37U), - SD_INVALID_PARAMETER = (38U), - SD_UNSUPPORTED_FEATURE = (39U), - SD_UNSUPPORTED_HW = (40U), - SD_ERROR = (41U), - SD_OK = (0U) - -}HAL_SD_ErrorTypedef; /** * @} */ -/** @defgroup SD_Exported_Types_Group7 SD Transfer state enumeration structure +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SD_Exported_Constants Exported Constants * @{ - */ -typedef enum -{ - SD_TRANSFER_OK = 0U, /*!< Transfer success */ - SD_TRANSFER_BUSY = 1U, /*!< Transfer is occurring */ - SD_TRANSFER_ERROR = 2U /*!< Transfer failed */ - -}HAL_SD_TransferStateTypedef; -/** - * @} */ -/** @defgroup SD_Exported_Types_Group8 SD Card State enumeration structure +#define BLOCKSIZE 512U /*!< Block size is 512 bytes */ + +/** @defgroup SD_Exported_Constansts_Group1 SD Error status enumeration Structure definition * @{ */ -typedef enum -{ - SD_CARD_READY = ((uint32_t)0x00000001U), /*!< Card state is ready */ - SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002U), /*!< Card is in identification state */ - SD_CARD_STANDBY = ((uint32_t)0x00000003U), /*!< Card is in standby state */ - SD_CARD_TRANSFER = ((uint32_t)0x00000004U), /*!< Card is in transfer state */ - SD_CARD_SENDING = ((uint32_t)0x00000005U), /*!< Card is sending an operation */ - SD_CARD_RECEIVING = ((uint32_t)0x00000006U), /*!< Card is receiving operation information */ - SD_CARD_PROGRAMMING = ((uint32_t)0x00000007U), /*!< Card is in programming state */ - SD_CARD_DISCONNECTED = ((uint32_t)0x00000008U), /*!< Card is disconnected */ - SD_CARD_ERROR = ((uint32_t)0x000000FFU) /*!< Card is in error state */ - -}HAL_SD_CardStateTypedef; +#define HAL_SD_ERROR_NONE SDMMC_ERROR_NONE /*!< No error */ +#define HAL_SD_ERROR_CMD_CRC_FAIL SDMMC_ERROR_CMD_CRC_FAIL /*!< Command response received (but CRC check failed) */ +#define HAL_SD_ERROR_DATA_CRC_FAIL SDMMC_ERROR_DATA_CRC_FAIL /*!< Data block sent/received (CRC check failed) */ +#define HAL_SD_ERROR_CMD_RSP_TIMEOUT SDMMC_ERROR_CMD_RSP_TIMEOUT /*!< Command response timeout */ +#define HAL_SD_ERROR_DATA_TIMEOUT SDMMC_ERROR_DATA_TIMEOUT /*!< Data timeout */ +#define HAL_SD_ERROR_TX_UNDERRUN SDMMC_ERROR_TX_UNDERRUN /*!< Transmit FIFO underrun */ +#define HAL_SD_ERROR_RX_OVERRUN SDMMC_ERROR_RX_OVERRUN /*!< Receive FIFO overrun */ +#define HAL_SD_ERROR_ADDR_MISALIGNED SDMMC_ERROR_ADDR_MISALIGNED /*!< Misaligned address */ +#define HAL_SD_ERROR_BLOCK_LEN_ERR SDMMC_ERROR_BLOCK_LEN_ERR /*!< Transferred block length is not allowed for the card or the + number of transferred bytes does not match the block length */ +#define HAL_SD_ERROR_ERASE_SEQ_ERR SDMMC_ERROR_ERASE_SEQ_ERR /*!< An error in the sequence of erase command occurs */ +#define HAL_SD_ERROR_BAD_ERASE_PARAM SDMMC_ERROR_BAD_ERASE_PARAM /*!< An invalid selection for erase groups */ +#define HAL_SD_ERROR_WRITE_PROT_VIOLATION SDMMC_ERROR_WRITE_PROT_VIOLATION /*!< Attempt to program a write protect block */ +#define HAL_SD_ERROR_LOCK_UNLOCK_FAILED SDMMC_ERROR_LOCK_UNLOCK_FAILED /*!< Sequence or password error has been detected in unlock + command or if there was an attempt to access a locked card */ +#define HAL_SD_ERROR_COM_CRC_FAILED SDMMC_ERROR_COM_CRC_FAILED /*!< CRC check of the previous command failed */ +#define HAL_SD_ERROR_ILLEGAL_CMD SDMMC_ERROR_ILLEGAL_CMD /*!< Command is not legal for the card state */ +#define HAL_SD_ERROR_CARD_ECC_FAILED SDMMC_ERROR_CARD_ECC_FAILED /*!< Card internal ECC was applied but failed to correct the data */ +#define HAL_SD_ERROR_CC_ERR SDMMC_ERROR_CC_ERR /*!< Internal card controller error */ +#define HAL_SD_ERROR_GENERAL_UNKNOWN_ERR SDMMC_ERROR_GENERAL_UNKNOWN_ERR /*!< General or unknown error */ +#define HAL_SD_ERROR_STREAM_READ_UNDERRUN SDMMC_ERROR_STREAM_READ_UNDERRUN /*!< The card could not sustain data reading in stream rmode */ +#define HAL_SD_ERROR_STREAM_WRITE_OVERRUN SDMMC_ERROR_STREAM_WRITE_OVERRUN /*!< The card could not sustain data programming in stream mode */ +#define HAL_SD_ERROR_CID_CSD_OVERWRITE SDMMC_ERROR_CID_CSD_OVERWRITE /*!< CID/CSD overwrite error */ +#define HAL_SD_ERROR_WP_ERASE_SKIP SDMMC_ERROR_WP_ERASE_SKIP /*!< Only partial address space was erased */ +#define HAL_SD_ERROR_CARD_ECC_DISABLED SDMMC_ERROR_CARD_ECC_DISABLED /*!< Command has been executed without using internal ECC */ +#define HAL_SD_ERROR_ERASE_RESET SDMMC_ERROR_ERASE_RESET /*!< Erase sequence was cleared before executing because an out + of erase sequence command was received */ +#define HAL_SD_ERROR_AKE_SEQ_ERR SDMMC_ERROR_AKE_SEQ_ERR /*!< Error in sequence of authentication */ +#define HAL_SD_ERROR_INVALID_VOLTRANGE SDMMC_ERROR_INVALID_VOLTRANGE /*!< Error in case of invalid voltage range */ +#define HAL_SD_ERROR_ADDR_OUT_OF_RANGE SDMMC_ERROR_ADDR_OUT_OF_RANGE /*!< Error when addressed block is out of range */ +#define HAL_SD_ERROR_REQUEST_NOT_APPLICABLE SDMMC_ERROR_REQUEST_NOT_APPLICABLE /*!< Error when command request is not applicable */ +#define HAL_SD_ERROR_PARAM SDMMC_ERROR_INVALID_PARAMETER /*!< the used parameter is not valid */ +#define HAL_SD_ERROR_UNSUPPORTED_FEATURE SDMMC_ERROR_UNSUPPORTED_FEATURE /*!< Error when feature is not insupported */ +#define HAL_SD_ERROR_BUSY SDMMC_ERROR_BUSY /*!< Error when transfer process is busy */ +#define HAL_SD_ERROR_DMA SDMMC_ERROR_DMA /*!< Error while DMA transfer */ +#define HAL_SD_ERROR_TIMEOUT SDMMC_ERROR_TIMEOUT /*!< Timeout error */ + /** * @} */ - -/** @defgroup SD_Exported_Types_Group9 SD Operation enumeration structure + +/** @defgroup SD_Exported_Constansts_Group2 SD context enumeration * @{ - */ -typedef enum -{ - SD_READ_SINGLE_BLOCK = 0U, /*!< Read single block operation */ - SD_READ_MULTIPLE_BLOCK = 1U, /*!< Read multiple blocks operation */ - SD_WRITE_SINGLE_BLOCK = 2U, /*!< Write single block operation */ - SD_WRITE_MULTIPLE_BLOCK = 3U /*!< Write multiple blocks operation */ + */ +#define SD_CONTEXT_NONE 0x00000000U /*!< None */ +#define SD_CONTEXT_READ_SINGLE_BLOCK 0x00000001U /*!< Read single block operation */ +#define SD_CONTEXT_READ_MULTIPLE_BLOCK 0x00000002U /*!< Read multiple blocks operation */ +#define SD_CONTEXT_WRITE_SINGLE_BLOCK 0x00000010U /*!< Write single block operation */ +#define SD_CONTEXT_WRITE_MULTIPLE_BLOCK 0x00000020U /*!< Write multiple blocks operation */ +#define SD_CONTEXT_IT 0x00000008U /*!< Process in Interrupt mode */ +#define SD_CONTEXT_DMA 0x00000080U /*!< Process in DMA mode */ -}HAL_SD_OperationTypedef; /** * @} */ +/** @defgroup SD_Exported_Constansts_Group3 SD Supported Memory Cards + * @{ + */ +#define CARD_SDSC 0x00000000U +#define CARD_SDHC_SDXC 0x00000001U +#define CARD_SECURED 0x00000003U + /** * @} */ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SD_Exported_Constants SD Exported Constants +/** @defgroup SD_Exported_Constansts_Group4 SD Supported Version * @{ */ - -/** - * @brief SD Commands Index - */ -#define SD_CMD_GO_IDLE_STATE ((uint8_t)0U) /*!< Resets the SD memory card. */ -#define SD_CMD_SEND_OP_COND ((uint8_t)1U) /*!< Sends host capacity support information and activates the card's initialization process. */ -#define SD_CMD_ALL_SEND_CID ((uint8_t)2U) /*!< Asks any card connected to the host to send the CID numbers on the CMD line. */ -#define SD_CMD_SET_REL_ADDR ((uint8_t)3U) /*!< Asks the card to publish a new relative address (RCA). */ -#define SD_CMD_SET_DSR ((uint8_t)4U) /*!< Programs the DSR of all cards. */ -#define SD_CMD_SDIO_SEN_OP_COND ((uint8_t)5U) /*!< Sends host capacity support information (HCS) and asks the accessed card to send its - operating condition register (OCR) content in the response on the CMD line. */ -#define SD_CMD_HS_SWITCH ((uint8_t)6U) /*!< Checks switchable function (mode 0) and switch card function (mode 1). */ -#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7U) /*!< Selects the card by its own relative address and gets deselected by any other address */ -#define SD_CMD_HS_SEND_EXT_CSD ((uint8_t)8U) /*!< Sends SD Memory Card interface condition, which includes host supply voltage information - and asks the card whether card supports voltage. */ -#define SD_CMD_SEND_CSD ((uint8_t)9U) /*!< Addressed card sends its card specific data (CSD) on the CMD line. */ -#define SD_CMD_SEND_CID ((uint8_t)10U) /*!< Addressed card sends its card identification (CID) on the CMD line. */ -#define SD_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11U) /*!< SD card doesn't support it. */ -#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12U) /*!< Forces the card to stop transmission. */ -#define SD_CMD_SEND_STATUS ((uint8_t)13U) /*!< Addressed card sends its status register. */ -#define SD_CMD_HS_BUSTEST_READ ((uint8_t)14U) -#define SD_CMD_GO_INACTIVE_STATE ((uint8_t)15U) /*!< Sends an addressed card into the inactive state. */ -#define SD_CMD_SET_BLOCKLEN ((uint8_t)16U) /*!< Sets the block length (in bytes for SDSC) for all following block commands - (read, write, lock). Default block length is fixed to 512 Bytes. Not effective - for SDHS and SDXC. */ -#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17U) /*!< Reads single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of - fixed 512 bytes in case of SDHC and SDXC. */ -#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18U) /*!< Continuously transfers data blocks from card to host until interrupted by - STOP_TRANSMISSION command. */ -#define SD_CMD_HS_BUSTEST_WRITE ((uint8_t)19U) /*!< 64 bytes tuning pattern is sent for SDR50 and SDR104. */ -#define SD_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20U) /*!< Speed class control command. */ -#define SD_CMD_SET_BLOCK_COUNT ((uint8_t)23U) /*!< Specify block count for CMD18 and CMD25. */ -#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24U) /*!< Writes single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of - fixed 512 bytes in case of SDHC and SDXC. */ -#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25U) /*!< Continuously writes blocks of data until a STOP_TRANSMISSION follows. */ -#define SD_CMD_PROG_CID ((uint8_t)26U) /*!< Reserved for manufacturers. */ -#define SD_CMD_PROG_CSD ((uint8_t)27U) /*!< Programming of the programmable bits of the CSD. */ -#define SD_CMD_SET_WRITE_PROT ((uint8_t)28U) /*!< Sets the write protection bit of the addressed group. */ -#define SD_CMD_CLR_WRITE_PROT ((uint8_t)29U) /*!< Clears the write protection bit of the addressed group. */ -#define SD_CMD_SEND_WRITE_PROT ((uint8_t)30U) /*!< Asks the card to send the status of the write protection bits. */ -#define SD_CMD_SD_ERASE_GRP_START ((uint8_t)32U) /*!< Sets the address of the first write block to be erased. (For SD card only). */ -#define SD_CMD_SD_ERASE_GRP_END ((uint8_t)33U) /*!< Sets the address of the last write block of the continuous range to be erased. */ -#define SD_CMD_ERASE_GRP_START ((uint8_t)35U) /*!< Sets the address of the first write block to be erased. Reserved for each command - system set by switch function command (CMD6). */ -#define SD_CMD_ERASE_GRP_END ((uint8_t)36U) /*!< Sets the address of the last write block of the continuous range to be erased. - Reserved for each command system set by switch function command (CMD6). */ -#define SD_CMD_ERASE ((uint8_t)38U) /*!< Reserved for SD security applications. */ -#define SD_CMD_FAST_IO ((uint8_t)39U) /*!< SD card doesn't support it (Reserved). */ -#define SD_CMD_GO_IRQ_STATE ((uint8_t)40U) /*!< SD card doesn't support it (Reserved). */ -#define SD_CMD_LOCK_UNLOCK ((uint8_t)42U) /*!< Sets/resets the password or lock/unlock the card. The size of the data block is set by - the SET_BLOCK_LEN command. */ -#define SD_CMD_APP_CMD ((uint8_t)55U) /*!< Indicates to the card that the next command is an application specific command rather - than a standard command. */ -#define SD_CMD_GEN_CMD ((uint8_t)56U) /*!< Used either to transfer a data block to the card or to get a data block from the card - for general purpose/application specific commands. */ -#define SD_CMD_NO_CMD ((uint8_t)64U) - -/** - * @brief Following commands are SD Card Specific commands. - * SDIO_APP_CMD should be sent before sending these commands. - */ -#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6U) /*!< (ACMD6) Defines the data bus width to be used for data transfer. The allowed data bus - widths are given in SCR register. */ -#define SD_CMD_SD_APP_STATUS ((uint8_t)13U) /*!< (ACMD13) Sends the SD status. */ -#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22U) /*!< (ACMD22) Sends the number of the written (without errors) write blocks. Responds with - 32bit+CRC data block. */ -#define SD_CMD_SD_APP_OP_COND ((uint8_t)41U) /*!< (ACMD41) Sends host capacity support information (HCS) and asks the accessed card to - send its operating condition register (OCR) content in the response on the CMD line. */ -#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42U) /*!< (ACMD42) Connects/Disconnects the 50 KOhm pull-up resistor on CD/DAT3 (pin 1) of the card. */ -#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51U) /*!< Reads the SD Configuration Register (SCR). */ -#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52U) /*!< For SD I/O card only, reserved for security specification. */ -#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53U) /*!< For SD I/O card only, reserved for security specification. */ - -/** - * @brief Following commands are SD Card Specific security commands. - * SD_CMD_APP_CMD should be sent before sending these commands. - */ -#define SD_CMD_SD_APP_GET_MKB ((uint8_t)43U) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_MID ((uint8_t)44U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45U) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47U) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_ERASE ((uint8_t)38U) /*!< For SD card only */ -#define SD_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49U) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48U) /*!< For SD card only */ - -/** - * @brief Supported SD Memory Cards +#define CARD_V1_X 0x00000000U +#define CARD_V2_X 0x00000001U +/** + * @} */ -#define STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000U) -#define STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001U) -#define HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002U) -#define MULTIMEDIA_CARD ((uint32_t)0x00000003U) -#define SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004U) -#define HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005U) -#define SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006U) -#define HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007U) + /** * @} */ /* Exported macro ------------------------------------------------------------*/ /** @defgroup SD_Exported_macros SD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ /** * @brief Enable the SD device. * @retval None */ -#define __HAL_SD_SDIO_ENABLE() __SDIO_ENABLE() +#define __HAL_SD_ENABLE(__HANDLE__) __SDIO_ENABLE((__HANDLE__)->Instance) /** * @brief Disable the SD device. * @retval None */ -#define __HAL_SD_SDIO_DISABLE() __SDIO_DISABLE() +#define __HAL_SD_DISABLE(__HANDLE__) __SDIO_DISABLE((__HANDLE__)->Instance) /** - * @brief Enable the SDIO DMA transfer. + * @brief Enable the SDMMC DMA transfer. * @retval None */ -#define __HAL_SD_SDIO_DMA_ENABLE() __SDIO_DMA_ENABLE() +#define __HAL_SD_DMA_ENABLE(__HANDLE__) __SDIO_DMA_ENABLE((__HANDLE__)->Instance) /** - * @brief Disable the SDIO DMA transfer. + * @brief Disable the SDMMC DMA transfer. * @retval None */ -#define __HAL_SD_SDIO_DMA_DISABLE() __SDIO_DMA_DISABLE() +#define __HAL_SD_DMA_DISABLE(__HANDLE__) __SDIO_DMA_DISABLE((__HANDLE__)->Instance) /** * @brief Enable the SD device interrupt. * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt sources to be enabled. + * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be enabled. * This parameter can be one or a combination of the following values: * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt @@ -475,8 +401,6 @@ typedef enum * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -490,15 +414,14 @@ typedef enum * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt * @retval None */ -#define __HAL_SD_SDIO_ENABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_ENABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) +#define __HAL_SD_ENABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_ENABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) /** * @brief Disable the SD device interrupt. * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt sources to be disabled. + * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be disabled. * This parameter can be one or a combination of the following values: * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt @@ -509,8 +432,6 @@ typedef enum * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -523,11 +444,10 @@ typedef enum * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt * @retval None */ -#define __HAL_SD_SDIO_DISABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_DISABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) +#define __HAL_SD_DISABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_DISABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) /** * @brief Check whether the specified SD flag is set or not. @@ -543,7 +463,6 @@ typedef enum * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode. * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) * @arg SDIO_FLAG_CMDACT: Command transfer in progress * @arg SDIO_FLAG_TXACT: Data transmit in progress @@ -557,10 +476,9 @@ typedef enum * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval The new state of SD FLAG (SET or RESET). */ -#define __HAL_SD_SDIO_GET_FLAG(__HANDLE__, __FLAG__) __SDIO_GET_FLAG((__HANDLE__)->Instance, (__FLAG__)) +#define __HAL_SD_GET_FLAG(__HANDLE__, __FLAG__) __SDIO_GET_FLAG((__HANDLE__)->Instance, (__FLAG__)) /** * @brief Clear the SD's pending flags. @@ -576,18 +494,16 @@ typedef enum * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval None */ -#define __HAL_SD_SDIO_CLEAR_FLAG(__HANDLE__, __FLAG__) __SDIO_CLEAR_FLAG((__HANDLE__)->Instance, (__FLAG__)) +#define __HAL_SD_CLEAR_FLAG(__HANDLE__, __FLAG__) __SDIO_CLEAR_FLAG((__HANDLE__)->Instance, (__FLAG__)) /** * @brief Check whether the specified SD interrupt has occurred or not. * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt source to check. + * @param __INTERRUPT__: specifies the SDMMC interrupt source to check. * This parameter can be one of the following values: * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt @@ -598,8 +514,6 @@ typedef enum * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -613,10 +527,9 @@ typedef enum * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt * @retval The new state of SD IT (SET or RESET). */ -#define __HAL_SD_SDIO_GET_IT (__HANDLE__, __INTERRUPT__) __SDIO_GET_IT ((__HANDLE__)->Instance, __INTERRUPT__) +#define __HAL_SD_GET_IT(__HANDLE__, __INTERRUPT__) __SDIO_GET_IT((__HANDLE__)->Instance, (__INTERRUPT__)) /** * @brief Clear the SD's interrupt pending bits. @@ -631,14 +544,12 @@ typedef enum * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIO_DCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt + * @arg SDIO_IT_DATAEND: Data end (data counter, SDMMC_DCOUNT, is zero) interrupt * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval None */ -#define __HAL_SD_SDIO_CLEAR_IT(__HANDLE__, __INTERRUPT__) __SDIO_CLEAR_IT((__HANDLE__)->Instance, (__INTERRUPT__)) +#define __HAL_SD_CLEAR_IT(__HANDLE__, __INTERRUPT__) __SDIO_CLEAR_IT((__HANDLE__)->Instance, (__INTERRUPT__)) + /** * @} */ @@ -647,68 +558,79 @@ typedef enum /** @defgroup SD_Exported_Functions SD Exported Functions * @{ */ - + /** @defgroup SD_Exported_Functions_Group1 Initialization and de-initialization functions * @{ */ -HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo); -HAL_StatusTypeDef HAL_SD_DeInit (SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_DeInit (SD_HandleTypeDef *hsd); void HAL_SD_MspInit(SD_HandleTypeDef *hsd); void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd); /** * @} */ - -/** @defgroup SD_Exported_Functions_Group2 I/O operation functions + +/** @defgroup SD_Exported_Functions_Group2 Input and Output operation functions * @{ */ /* Blocking mode: Polling */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr); +HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); +HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); +HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd); +/* Non-Blocking mode: IT */ +HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); +HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); -/* Non-Blocking mode: Interrupt */ void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd); /* Callback in non blocking modes (DMA) */ -void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd); -void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd); - -/* Non-Blocking mode: DMA */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); -HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); +void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd); +void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd); +void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd); +void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd); /** * @} */ - + /** @defgroup SD_Exported_Functions_Group3 Peripheral Control functions * @{ */ -HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo); -HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode); -HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd); -HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode); /** * @} */ - -/* Peripheral State functions ************************************************/ -/** @defgroup SD_Exported_Functions_Group4 Peripheral State functions + +/** @defgroup SD_Exported_Functions_Group4 SD card related functions * @{ */ -HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus); -HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus); -HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus); +HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID); +HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD); +HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus); +HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo); /** * @} */ - + +/** @defgroup SD_Exported_Functions_Group5 Peripheral State and Errors functions + * @{ + */ +HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd); +uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd); +/** + * @} + */ + +/** @defgroup SD_Exported_Functions_Group6 Perioheral Abort management + * @{ + */ +HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd); +HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd); /** * @} */ @@ -776,20 +698,28 @@ HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd); * @} */ + /** * @} */ /** * @} - */ + */ + +/** + * @} + */ + #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + #ifdef __cplusplus } #endif -#endif /* __STM32F4xx_HAL_SD_H */ + +#endif /* __STM32F4xx_HAL_SD_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h index 538d400..1bab56c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_sdram.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SDRAM HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_smartcard.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_smartcard.h index 825abba..ff7fbff 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_smartcard.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_smartcard.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_smartcard.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SMARTCARD HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -216,12 +216,12 @@ typedef struct * @brief SMARTCARD Error Code * @{ */ -#define HAL_SMARTCARD_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_SMARTCARD_ERROR_PE ((uint32_t)0x00000001U) /*!< Parity error */ -#define HAL_SMARTCARD_ERROR_NE ((uint32_t)0x00000002U) /*!< Noise error */ -#define HAL_SMARTCARD_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ -#define HAL_SMARTCARD_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ -#define HAL_SMARTCARD_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_SMARTCARD_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_SMARTCARD_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_SMARTCARD_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_SMARTCARD_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_SMARTCARD_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_SMARTCARD_ERROR_DMA 0x00000010U /*!< DMA transfer error */ /** * @} */ @@ -265,7 +265,7 @@ typedef struct /** @defgroup SMARTCARD_Clock_Polarity SMARTCARD Clock Polarity * @{ */ -#define SMARTCARD_POLARITY_LOW ((uint32_t)0x00000000U) +#define SMARTCARD_POLARITY_LOW 0x00000000U #define SMARTCARD_POLARITY_HIGH ((uint32_t)USART_CR2_CPOL) /** * @} @@ -274,7 +274,7 @@ typedef struct /** @defgroup SMARTCARD_Clock_Phase SMARTCARD Clock Phase * @{ */ -#define SMARTCARD_PHASE_1EDGE ((uint32_t)0x00000000U) +#define SMARTCARD_PHASE_1EDGE 0x00000000U #define SMARTCARD_PHASE_2EDGE ((uint32_t)USART_CR2_CPHA) /** * @} @@ -283,7 +283,7 @@ typedef struct /** @defgroup SMARTCARD_Last_Bit SMARTCARD Last Bit * @{ */ -#define SMARTCARD_LASTBIT_DISABLE ((uint32_t)0x00000000U) +#define SMARTCARD_LASTBIT_DISABLE 0x00000000U #define SMARTCARD_LASTBIT_ENABLE ((uint32_t)USART_CR2_LBCL) /** * @} @@ -293,7 +293,7 @@ typedef struct * @{ */ #define SMARTCARD_NACK_ENABLE ((uint32_t)USART_CR3_NACK) -#define SMARTCARD_NACK_DISABLE ((uint32_t)0x00000000U) +#define SMARTCARD_NACK_DISABLE 0x00000000U /** * @} */ @@ -310,37 +310,37 @@ typedef struct /** @defgroup SMARTCARD_Prescaler SMARTCARD Prescaler * @{ */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV2 ((uint32_t)0x00000001U) /*!< SYSCLK divided by 2 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV4 ((uint32_t)0x00000002U) /*!< SYSCLK divided by 4 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV6 ((uint32_t)0x00000003U) /*!< SYSCLK divided by 6 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV8 ((uint32_t)0x00000004U) /*!< SYSCLK divided by 8 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV10 ((uint32_t)0x00000005U) /*!< SYSCLK divided by 10 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV12 ((uint32_t)0x00000006U) /*!< SYSCLK divided by 12 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV14 ((uint32_t)0x00000007U) /*!< SYSCLK divided by 14 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV16 ((uint32_t)0x00000008U) /*!< SYSCLK divided by 16 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV18 ((uint32_t)0x00000009U) /*!< SYSCLK divided by 18 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV20 ((uint32_t)0x0000000AU) /*!< SYSCLK divided by 20 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV22 ((uint32_t)0x0000000BU) /*!< SYSCLK divided by 22 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV24 ((uint32_t)0x0000000CU) /*!< SYSCLK divided by 24 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV26 ((uint32_t)0x0000000DU) /*!< SYSCLK divided by 26 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV28 ((uint32_t)0x0000000EU) /*!< SYSCLK divided by 28 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV30 ((uint32_t)0x0000000FU) /*!< SYSCLK divided by 30 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV32 ((uint32_t)0x00000010U) /*!< SYSCLK divided by 32 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV34 ((uint32_t)0x00000011U) /*!< SYSCLK divided by 34 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV36 ((uint32_t)0x00000012U) /*!< SYSCLK divided by 36 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV38 ((uint32_t)0x00000013U) /*!< SYSCLK divided by 38 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV40 ((uint32_t)0x00000014U) /*!< SYSCLK divided by 40 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV42 ((uint32_t)0x00000015U) /*!< SYSCLK divided by 42 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV44 ((uint32_t)0x00000016U) /*!< SYSCLK divided by 44 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV46 ((uint32_t)0x00000017U) /*!< SYSCLK divided by 46 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV48 ((uint32_t)0x00000018U) /*!< SYSCLK divided by 48 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV50 ((uint32_t)0x00000019U) /*!< SYSCLK divided by 50 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV52 ((uint32_t)0x0000001AU) /*!< SYSCLK divided by 52 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV54 ((uint32_t)0x0000001BU) /*!< SYSCLK divided by 54 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV56 ((uint32_t)0x0000001CU) /*!< SYSCLK divided by 56 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV58 ((uint32_t)0x0000001DU) /*!< SYSCLK divided by 58 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV60 ((uint32_t)0x0000001EU) /*!< SYSCLK divided by 60 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV62 ((uint32_t)0x0000001FU) /*!< SYSCLK divided by 62 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV2 0x00000001U /*!< SYSCLK divided by 2 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV4 0x00000002U /*!< SYSCLK divided by 4 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV6 0x00000003U /*!< SYSCLK divided by 6 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV8 0x00000004U /*!< SYSCLK divided by 8 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV10 0x00000005U /*!< SYSCLK divided by 10 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV12 0x00000006U /*!< SYSCLK divided by 12 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV14 0x00000007U /*!< SYSCLK divided by 14 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV16 0x00000008U /*!< SYSCLK divided by 16 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV18 0x00000009U /*!< SYSCLK divided by 18 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV20 0x0000000AU /*!< SYSCLK divided by 20 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV22 0x0000000BU /*!< SYSCLK divided by 22 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV24 0x0000000CU /*!< SYSCLK divided by 24 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV26 0x0000000DU /*!< SYSCLK divided by 26 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV28 0x0000000EU /*!< SYSCLK divided by 28 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV30 0x0000000FU /*!< SYSCLK divided by 30 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV32 0x00000010U /*!< SYSCLK divided by 32 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV34 0x00000011U /*!< SYSCLK divided by 34 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV36 0x00000012U /*!< SYSCLK divided by 36 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV38 0x00000013U /*!< SYSCLK divided by 38 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV40 0x00000014U /*!< SYSCLK divided by 40 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV42 0x00000015U /*!< SYSCLK divided by 42 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV44 0x00000016U /*!< SYSCLK divided by 44 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV46 0x00000017U /*!< SYSCLK divided by 46 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV48 0x00000018U /*!< SYSCLK divided by 48 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV50 0x00000019U /*!< SYSCLK divided by 50 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV52 0x0000001AU /*!< SYSCLK divided by 52 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV54 0x0000001BU /*!< SYSCLK divided by 54 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV56 0x0000001CU /*!< SYSCLK divided by 56 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV58 0x0000001DU /*!< SYSCLK divided by 58 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV60 0x0000001EU /*!< SYSCLK divided by 60 */ +#define SMARTCARD_PRESCALER_SYSCLK_DIV62 0x0000001FU /*!< SYSCLK divided by 62 */ /** * @} */ @@ -350,14 +350,14 @@ typedef struct * - 0xXXXX : Flag mask in the SR register * @{ */ -#define SMARTCARD_FLAG_TXE ((uint32_t)0x00000080U) -#define SMARTCARD_FLAG_TC ((uint32_t)0x00000040U) -#define SMARTCARD_FLAG_RXNE ((uint32_t)0x00000020U) -#define SMARTCARD_FLAG_IDLE ((uint32_t)0x00000010U) -#define SMARTCARD_FLAG_ORE ((uint32_t)0x00000008U) -#define SMARTCARD_FLAG_NE ((uint32_t)0x00000004U) -#define SMARTCARD_FLAG_FE ((uint32_t)0x00000002U) -#define SMARTCARD_FLAG_PE ((uint32_t)0x00000001U) +#define SMARTCARD_FLAG_TXE 0x00000080U +#define SMARTCARD_FLAG_TC 0x00000040U +#define SMARTCARD_FLAG_RXNE 0x00000020U +#define SMARTCARD_FLAG_IDLE 0x00000010U +#define SMARTCARD_FLAG_ORE 0x00000008U +#define SMARTCARD_FLAG_NE 0x00000004U +#define SMARTCARD_FLAG_FE 0x00000002U +#define SMARTCARD_FLAG_PE 0x00000001U /** * @} */ @@ -396,7 +396,7 @@ typedef struct #define __HAL_SMARTCARD_RESET_HANDLE_STATE(__HANDLE__) do{ \ (__HANDLE__)->gState = HAL_SMARTCARD_STATE_RESET; \ (__HANDLE__)->RxState = HAL_SMARTCARD_STATE_RESET; \ - } while(0) + } while(0U) /** @brief Flushs the Smartcard DR register * @param __HANDLE__: specifies the SMARTCARD Handle. @@ -448,7 +448,7 @@ typedef struct tmpreg = (__HANDLE__)->Instance->SR; \ tmpreg = (__HANDLE__)->Instance->DR; \ UNUSED(tmpreg); \ - } while(0) + } while(0U) /** @brief Clear the SMARTCARD FE pending flag. * @param __HANDLE__: specifies the USART Handle. @@ -650,7 +650,7 @@ uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsc); ((STOPBITS) == SMARTCARD_STOPBITS_1_5)) #define IS_SMARTCARD_PARITY(PARITY) (((PARITY) == SMARTCARD_PARITY_EVEN) || \ ((PARITY) == SMARTCARD_PARITY_ODD)) -#define IS_SMARTCARD_MODE(MODE) ((((MODE) & (uint32_t)0x0000FFF3U) == 0x00U) && ((MODE) != (uint32_t)0x000000U)) +#define IS_SMARTCARD_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x000000U)) #define IS_SMARTCARD_POLARITY(CPOL) (((CPOL) == SMARTCARD_POLARITY_LOW) || ((CPOL) == SMARTCARD_POLARITY_HIGH)) #define IS_SMARTCARD_PHASE(CPHA) (((CPHA) == SMARTCARD_PHASE_1EDGE) || ((CPHA) == SMARTCARD_PHASE_2EDGE)) #define IS_SMARTCARD_LASTBIT(LASTBIT) (((LASTBIT) == SMARTCARD_LASTBIT_DISABLE) || \ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spdifrx.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spdifrx.h index e986fd3..c6475d9 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spdifrx.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spdifrx.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_spdifrx.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SPDIFRX HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -186,12 +186,12 @@ typedef struct /** @defgroup SPDIFRX_ErrorCode SPDIFRX Error Code * @{ */ -#define HAL_SPDIFRX_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_SPDIFRX_ERROR_TIMEOUT ((uint32_t)0x00000001U) /*!< Timeout error */ -#define HAL_SPDIFRX_ERROR_OVR ((uint32_t)0x00000002U) /*!< OVR error */ -#define HAL_SPDIFRX_ERROR_PE ((uint32_t)0x00000004U) /*!< Parity error */ -#define HAL_SPDIFRX_ERROR_DMA ((uint32_t)0x00000008U) /*!< DMA transfer error */ -#define HAL_SPDIFRX_ERROR_UNKNOWN ((uint32_t)0x00000010U) /*!< Unknown Error error */ +#define HAL_SPDIFRX_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_SPDIFRX_ERROR_TIMEOUT 0x00000001U /*!< Timeout error */ +#define HAL_SPDIFRX_ERROR_OVR 0x00000002U /*!< OVR error */ +#define HAL_SPDIFRX_ERROR_PE 0x00000004U /*!< Parity error */ +#define HAL_SPDIFRX_ERROR_DMA 0x00000008U /*!< DMA transfer error */ +#define HAL_SPDIFRX_ERROR_UNKNOWN 0x00000010U /*!< Unknown Error error */ /** * @} */ @@ -199,10 +199,10 @@ typedef struct /** @defgroup SPDIFRX_Input_Selection SPDIFRX Input Selection * @{ */ -#define SPDIFRX_INPUT_IN0 ((uint32_t)0x00000000U) -#define SPDIFRX_INPUT_IN1 ((uint32_t)0x00010000U) -#define SPDIFRX_INPUT_IN2 ((uint32_t)0x00020000U) -#define SPDIFRX_INPUT_IN3 ((uint32_t)0x00030000U) +#define SPDIFRX_INPUT_IN0 0x00000000U +#define SPDIFRX_INPUT_IN1 0x00010000U +#define SPDIFRX_INPUT_IN2 0x00020000U +#define SPDIFRX_INPUT_IN3 0x00030000U /** * @} */ @@ -210,10 +210,10 @@ typedef struct /** @defgroup SPDIFRX_Max_Retries SPDIFRX Maximum Retries * @{ */ -#define SPDIFRX_MAXRETRIES_NONE ((uint32_t)0x00000000U) -#define SPDIFRX_MAXRETRIES_3 ((uint32_t)0x00001000U) -#define SPDIFRX_MAXRETRIES_15 ((uint32_t)0x00002000U) -#define SPDIFRX_MAXRETRIES_63 ((uint32_t)0x00003000U) +#define SPDIFRX_MAXRETRIES_NONE 0x00000000U +#define SPDIFRX_MAXRETRIES_3 0x00001000U +#define SPDIFRX_MAXRETRIES_15 0x00002000U +#define SPDIFRX_MAXRETRIES_63 0x00003000U /** * @} */ @@ -221,7 +221,7 @@ typedef struct /** @defgroup SPDIFRX_Wait_For_Activity SPDIFRX Wait For Activity * @{ */ -#define SPDIFRX_WAITFORACTIVITY_OFF ((uint32_t)0x00000000U) +#define SPDIFRX_WAITFORACTIVITY_OFF 0x00000000U #define SPDIFRX_WAITFORACTIVITY_ON ((uint32_t)SPDIFRX_CR_WFA) /** * @} @@ -230,7 +230,7 @@ typedef struct /** @defgroup SPDIFRX_PT_Mask SPDIFRX Preamble Type Mask * @{ */ -#define SPDIFRX_PREAMBLETYPEMASK_OFF ((uint32_t)0x00000000U) +#define SPDIFRX_PREAMBLETYPEMASK_OFF 0x00000000U #define SPDIFRX_PREAMBLETYPEMASK_ON ((uint32_t)SPDIFRX_CR_PTMSK) /** * @} @@ -239,7 +239,7 @@ typedef struct /** @defgroup SPDIFRX_ChannelStatus_Mask SPDIFRX Channel Status Mask * @{ */ -#define SPDIFRX_CHANNELSTATUS_OFF ((uint32_t)0x00000000U) /* The channel status and user bits are copied into the SPDIF_DR */ +#define SPDIFRX_CHANNELSTATUS_OFF 0x00000000U /* The channel status and user bits are copied into the SPDIF_DR */ #define SPDIFRX_CHANNELSTATUS_ON ((uint32_t)SPDIFRX_CR_CUMSK) /* The channel status and user bits are not copied into the SPDIF_DR, zeros are written instead*/ /** * @} @@ -248,7 +248,7 @@ typedef struct /** @defgroup SPDIFRX_V_Mask SPDIFRX Validity Mask * @{ */ -#define SPDIFRX_VALIDITYMASK_OFF ((uint32_t)0x00000000U) +#define SPDIFRX_VALIDITYMASK_OFF 0x00000000U #define SPDIFRX_VALIDITYMASK_ON ((uint32_t)SPDIFRX_CR_VMSK) /** * @} @@ -257,7 +257,7 @@ typedef struct /** @defgroup SPDIFRX_PE_Mask SPDIFRX Parity Error Mask * @{ */ -#define SPDIFRX_PARITYERRORMASK_OFF ((uint32_t)0x00000000U) +#define SPDIFRX_PARITYERRORMASK_OFF 0x00000000U #define SPDIFRX_PARITYERRORMASK_ON ((uint32_t)SPDIFRX_CR_PMSK) /** * @} @@ -266,7 +266,7 @@ typedef struct /** @defgroup SPDIFRX_Channel_Selection SPDIFRX Channel Selection * @{ */ -#define SPDIFRX_CHANNEL_A ((uint32_t)0x00000000U) +#define SPDIFRX_CHANNEL_A 0x00000000U #define SPDIFRX_CHANNEL_B ((uint32_t)SPDIFRX_CR_CHSEL) /** * @} @@ -275,9 +275,9 @@ typedef struct /** @defgroup SPDIFRX_Data_Format SPDIFRX Data Format * @{ */ -#define SPDIFRX_DATAFORMAT_LSB ((uint32_t)0x00000000U) -#define SPDIFRX_DATAFORMAT_MSB ((uint32_t)0x00000010U) -#define SPDIFRX_DATAFORMAT_32BITS ((uint32_t)0x00000020U) +#define SPDIFRX_DATAFORMAT_LSB 0x00000000U +#define SPDIFRX_DATAFORMAT_MSB 0x00000010U +#define SPDIFRX_DATAFORMAT_32BITS 0x00000020U /** * @} */ @@ -285,7 +285,7 @@ typedef struct /** @defgroup SPDIFRX_Stereo_Mode SPDIFRX Stereo Mode * @{ */ -#define SPDIFRX_STEREOMODE_DISABLE ((uint32_t)0x00000000U) +#define SPDIFRX_STEREOMODE_DISABLE 0x00000000U #define SPDIFRX_STEREOMODE_ENABLE ((uint32_t)SPDIFRX_CR_RXSTEO) /** * @} @@ -295,8 +295,8 @@ typedef struct * @{ */ -#define SPDIFRX_STATE_IDLE ((uint32_t)0xFFFFFFFCU) -#define SPDIFRX_STATE_SYNC ((uint32_t)0x00000001U) +#define SPDIFRX_STATE_IDLE 0xFFFFFFFCU +#define SPDIFRX_STATE_SYNC 0x00000001U #define SPDIFRX_STATE_RCV ((uint32_t)SPDIFRX_CR_SPDIFEN) /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h index 178f2b2..c1d9b85 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_spi.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SPI HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -165,13 +165,13 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Error_Code SPI Error Code * @{ */ -#define HAL_SPI_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_SPI_ERROR_MODF ((uint32_t)0x00000001U) /*!< MODF error */ -#define HAL_SPI_ERROR_CRC ((uint32_t)0x00000002U) /*!< CRC error */ -#define HAL_SPI_ERROR_OVR ((uint32_t)0x00000004U) /*!< OVR error */ -#define HAL_SPI_ERROR_FRE ((uint32_t)0x00000008U) /*!< FRE error */ -#define HAL_SPI_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ -#define HAL_SPI_ERROR_FLAG ((uint32_t)0x00000020U) /*!< Flag: RXNE,TXE, BSY */ +#define HAL_SPI_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_SPI_ERROR_MODF 0x00000001U /*!< MODF error */ +#define HAL_SPI_ERROR_CRC 0x00000002U /*!< CRC error */ +#define HAL_SPI_ERROR_OVR 0x00000004U /*!< OVR error */ +#define HAL_SPI_ERROR_FRE 0x00000008U /*!< FRE error */ +#define HAL_SPI_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#define HAL_SPI_ERROR_FLAG 0x00000020U /*!< Flag: RXNE,TXE, BSY */ /** * @} */ @@ -179,7 +179,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Mode SPI Mode * @{ */ -#define SPI_MODE_SLAVE ((uint32_t)0x00000000U) +#define SPI_MODE_SLAVE 0x00000000U #define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /** * @} @@ -188,7 +188,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Direction SPI Direction Mode * @{ */ -#define SPI_DIRECTION_2LINES ((uint32_t)0x00000000U) +#define SPI_DIRECTION_2LINES 0x00000000U #define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY #define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE /** @@ -198,7 +198,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Data_Size SPI Data Size * @{ */ -#define SPI_DATASIZE_8BIT ((uint32_t)0x00000000U) +#define SPI_DATASIZE_8BIT 0x00000000U #define SPI_DATASIZE_16BIT SPI_CR1_DFF /** * @} @@ -207,7 +207,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Clock_Polarity SPI Clock Polarity * @{ */ -#define SPI_POLARITY_LOW ((uint32_t)0x00000000U) +#define SPI_POLARITY_LOW 0x00000000U #define SPI_POLARITY_HIGH SPI_CR1_CPOL /** * @} @@ -216,7 +216,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_Clock_Phase SPI Clock Phase * @{ */ -#define SPI_PHASE_1EDGE ((uint32_t)0x00000000U) +#define SPI_PHASE_1EDGE 0x00000000U #define SPI_PHASE_2EDGE SPI_CR1_CPHA /** * @} @@ -226,8 +226,8 @@ typedef struct __SPI_HandleTypeDef * @{ */ #define SPI_NSS_SOFT SPI_CR1_SSM -#define SPI_NSS_HARD_INPUT ((uint32_t)0x00000000U) -#define SPI_NSS_HARD_OUTPUT ((uint32_t)0x00040000U) +#define SPI_NSS_HARD_INPUT 0x00000000U +#define SPI_NSS_HARD_OUTPUT 0x00040000U /** * @} */ @@ -235,14 +235,14 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler * @{ */ -#define SPI_BAUDRATEPRESCALER_2 ((uint32_t)0x00000000U) -#define SPI_BAUDRATEPRESCALER_4 ((uint32_t)0x00000008U) -#define SPI_BAUDRATEPRESCALER_8 ((uint32_t)0x00000010U) -#define SPI_BAUDRATEPRESCALER_16 ((uint32_t)0x00000018U) -#define SPI_BAUDRATEPRESCALER_32 ((uint32_t)0x00000020U) -#define SPI_BAUDRATEPRESCALER_64 ((uint32_t)0x00000028U) -#define SPI_BAUDRATEPRESCALER_128 ((uint32_t)0x00000030U) -#define SPI_BAUDRATEPRESCALER_256 ((uint32_t)0x00000038U) +#define SPI_BAUDRATEPRESCALER_2 0x00000000U +#define SPI_BAUDRATEPRESCALER_4 0x00000008U +#define SPI_BAUDRATEPRESCALER_8 0x00000010U +#define SPI_BAUDRATEPRESCALER_16 0x00000018U +#define SPI_BAUDRATEPRESCALER_32 0x00000020U +#define SPI_BAUDRATEPRESCALER_64 0x00000028U +#define SPI_BAUDRATEPRESCALER_128 0x00000030U +#define SPI_BAUDRATEPRESCALER_256 0x00000038U /** * @} */ @@ -250,7 +250,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission * @{ */ -#define SPI_FIRSTBIT_MSB ((uint32_t)0x00000000U) +#define SPI_FIRSTBIT_MSB 0x00000000U #define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST /** * @} @@ -259,7 +259,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_TI_mode SPI TI Mode * @{ */ -#define SPI_TIMODE_DISABLE ((uint32_t)0x00000000U) +#define SPI_TIMODE_DISABLE 0x00000000U #define SPI_TIMODE_ENABLE SPI_CR2_FRF /** * @} @@ -268,7 +268,7 @@ typedef struct __SPI_HandleTypeDef /** @defgroup SPI_CRC_Calculation SPI CRC Calculation * @{ */ -#define SPI_CRCCALCULATION_DISABLE ((uint32_t)0x00000000U) +#define SPI_CRCCALCULATION_DISABLE 0x00000000U #define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN /** * @} @@ -373,7 +373,7 @@ typedef struct __SPI_HandleTypeDef tmpreg_modf = (__HANDLE__)->Instance->SR; \ (__HANDLE__)->Instance->CR1 &= (~SPI_CR1_SPE); \ UNUSED(tmpreg_modf); \ - } while(0) + } while(0U) /** @brief Clear the SPI OVR pending flag. * @param __HANDLE__: specifies the SPI Handle. @@ -386,7 +386,7 @@ typedef struct __SPI_HandleTypeDef tmpreg_ovr = (__HANDLE__)->Instance->DR; \ tmpreg_ovr = (__HANDLE__)->Instance->SR; \ UNUSED(tmpreg_ovr); \ - } while(0) + } while(0U) /** @brief Clear the SPI FRE pending flag. * @param __HANDLE__: specifies the SPI Handle. @@ -398,7 +398,7 @@ typedef struct __SPI_HandleTypeDef __IO uint32_t tmpreg_fre = 0x00U; \ tmpreg_fre = (__HANDLE__)->Instance->SR; \ UNUSED(tmpreg_fre); \ - }while(0) + }while(0U) /** @brief Enable the SPI peripheral. * @param __HANDLE__: specifies the SPI Handle. @@ -450,6 +450,9 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t * HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); +/* Transfer Abort functions */ +HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi); void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); @@ -459,6 +462,7 @@ void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); /** * @} */ @@ -506,7 +510,7 @@ uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi); * @retval None */ #define SPI_RESET_CRC(__HANDLE__) do{(__HANDLE__)->Instance->CR1 &= (uint16_t)(~SPI_CR1_CRCEN);\ - (__HANDLE__)->Instance->CR1 |= SPI_CR1_CRCEN;}while(0) + (__HANDLE__)->Instance->CR1 |= SPI_CR1_CRCEN;}while(0U) #define IS_SPI_MODE(MODE) (((MODE) == SPI_MODE_SLAVE) || \ ((MODE) == SPI_MODE_MASTER)) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h index 822258c..ae6b7a3 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sram.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_sram.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SRAM HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h index f631506..2be1ff3 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_tim.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of TIM HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -308,7 +308,7 @@ typedef struct /** @defgroup TIM_Input_Channel_Polarity TIM Input Channel Polarity * @{ */ -#define TIM_INPUTCHANNELPOLARITY_RISING ((uint32_t)0x00000000U) /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ #define TIM_INPUTCHANNELPOLARITY_FALLING (TIM_CCER_CC1P) /*!< Polarity for TIx source */ #define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ /** @@ -319,7 +319,7 @@ typedef struct * @{ */ #define TIM_ETRPOLARITY_INVERTED (TIM_SMCR_ETP) /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED ((uint32_t)0x00000000U) /*!< Polarity for ETR source */ +#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ /** * @} */ @@ -327,7 +327,7 @@ typedef struct /** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler * @{ */ -#define TIM_ETRPRESCALER_DIV1 ((uint32_t)0x00000000U) /*!< No prescaler is used */ +#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ #define TIM_ETRPRESCALER_DIV2 (TIM_SMCR_ETPS_0) /*!< ETR input source is divided by 2 */ #define TIM_ETRPRESCALER_DIV4 (TIM_SMCR_ETPS_1) /*!< ETR input source is divided by 4 */ #define TIM_ETRPRESCALER_DIV8 (TIM_SMCR_ETPS) /*!< ETR input source is divided by 8 */ @@ -338,7 +338,7 @@ typedef struct /** @defgroup TIM_Counter_Mode TIM Counter Mode * @{ */ -#define TIM_COUNTERMODE_UP ((uint32_t)0x00000000U) +#define TIM_COUNTERMODE_UP 0x00000000U #define TIM_COUNTERMODE_DOWN TIM_CR1_DIR #define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 #define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 @@ -350,7 +350,7 @@ typedef struct /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ -#define TIM_CLOCKDIVISION_DIV1 ((uint32_t)0x00000000U) +#define TIM_CLOCKDIVISION_DIV1 0x00000000U #define TIM_CLOCKDIVISION_DIV2 (TIM_CR1_CKD_0) #define TIM_CLOCKDIVISION_DIV4 (TIM_CR1_CKD_1) /** @@ -360,7 +360,7 @@ typedef struct /** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM modes * @{ */ -#define TIM_OCMODE_TIMING ((uint32_t)0x00000000U) +#define TIM_OCMODE_TIMING 0x00000000U #define TIM_OCMODE_ACTIVE (TIM_CCMR1_OC1M_0) #define TIM_OCMODE_INACTIVE (TIM_CCMR1_OC1M_1) #define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1) @@ -376,7 +376,7 @@ typedef struct /** @defgroup TIM_Output_Fast_State TIM Output Fast State * @{ */ -#define TIM_OCFAST_DISABLE ((uint32_t)0x00000000U) +#define TIM_OCFAST_DISABLE 0x00000000U #define TIM_OCFAST_ENABLE (TIM_CCMR1_OC1FE) /** * @} @@ -385,7 +385,7 @@ typedef struct /** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity * @{ */ -#define TIM_OCPOLARITY_HIGH ((uint32_t)0x00000000U) +#define TIM_OCPOLARITY_HIGH 0x00000000U #define TIM_OCPOLARITY_LOW (TIM_CCER_CC1P) /** * @} @@ -394,7 +394,7 @@ typedef struct /** @defgroup TIM_Output_Compare_N_Polarity TIM Output CompareN Polarity * @{ */ -#define TIM_OCNPOLARITY_HIGH ((uint32_t)0x00000000U) +#define TIM_OCNPOLARITY_HIGH 0x00000000U #define TIM_OCNPOLARITY_LOW (TIM_CCER_CC1NP) /** * @} @@ -404,7 +404,7 @@ typedef struct * @{ */ #define TIM_OCIDLESTATE_SET (TIM_CR2_OIS1) -#define TIM_OCIDLESTATE_RESET ((uint32_t)0x00000000U) +#define TIM_OCIDLESTATE_RESET 0x00000000U /** * @} */ @@ -413,7 +413,7 @@ typedef struct * @{ */ #define TIM_OCNIDLESTATE_SET (TIM_CR2_OIS1N) -#define TIM_OCNIDLESTATE_RESET ((uint32_t)0x00000000U) +#define TIM_OCNIDLESTATE_RESET 0x00000000U /** * @} */ @@ -421,11 +421,11 @@ typedef struct /** @defgroup TIM_Channel TIM Channel * @{ */ -#define TIM_CHANNEL_1 ((uint32_t)0x00000000U) -#define TIM_CHANNEL_2 ((uint32_t)0x00000004U) -#define TIM_CHANNEL_3 ((uint32_t)0x00000008U) -#define TIM_CHANNEL_4 ((uint32_t)0x0000000CU) -#define TIM_CHANNEL_ALL ((uint32_t)0x00000018U) +#define TIM_CHANNEL_1 0x00000000U +#define TIM_CHANNEL_2 0x00000004U +#define TIM_CHANNEL_3 0x00000008U +#define TIM_CHANNEL_4 0x0000000CU +#define TIM_CHANNEL_ALL 0x00000018U /** * @} @@ -457,7 +457,7 @@ typedef struct /** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler * @{ */ -#define TIM_ICPSC_DIV1 ((uint32_t)0x00000000U) /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ #define TIM_ICPSC_DIV2 (TIM_CCMR1_IC1PSC_0) /*!< Capture performed once every 2 events */ #define TIM_ICPSC_DIV4 (TIM_CCMR1_IC1PSC_1) /*!< Capture performed once every 4 events */ #define TIM_ICPSC_DIV8 (TIM_CCMR1_IC1PSC) /*!< Capture performed once every 8 events */ @@ -469,7 +469,7 @@ typedef struct * @{ */ #define TIM_OPMODE_SINGLE (TIM_CR1_OPM) -#define TIM_OPMODE_REPETITIVE ((uint32_t)0x00000000U) +#define TIM_OPMODE_REPETITIVE 0x00000000U /** * @} */ @@ -504,7 +504,7 @@ typedef struct * @{ */ #define TIM_COMMUTATION_TRGI (TIM_CR2_CCUS) -#define TIM_COMMUTATION_SOFTWARE ((uint32_t)0x00000000U) +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /** * @} */ @@ -563,7 +563,7 @@ typedef struct */ #define TIM_CLOCKSOURCE_ETRMODE2 (TIM_SMCR_ETPS_1) #define TIM_CLOCKSOURCE_INTERNAL (TIM_SMCR_ETPS_0) -#define TIM_CLOCKSOURCE_ITR0 ((uint32_t)0x00000000U) +#define TIM_CLOCKSOURCE_ITR0 0x00000000U #define TIM_CLOCKSOURCE_ITR1 (TIM_SMCR_TS_0) #define TIM_CLOCKSOURCE_ITR2 (TIM_SMCR_TS_1) #define TIM_CLOCKSOURCE_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) @@ -601,8 +601,8 @@ typedef struct /** @defgroup TIM_ClearInput_Source TIM Clear Input Source * @{ */ -#define TIM_CLEARINPUTSOURCE_ETR ((uint32_t)0x00000001U) -#define TIM_CLEARINPUTSOURCE_NONE ((uint32_t)0x00000000U) +#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U +#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /** * @} */ @@ -631,7 +631,7 @@ typedef struct * @{ */ #define TIM_OSSR_ENABLE (TIM_BDTR_OSSR) -#define TIM_OSSR_DISABLE ((uint32_t)0x00000000U) +#define TIM_OSSR_DISABLE 0x00000000U /** * @} */ @@ -640,7 +640,7 @@ typedef struct * @{ */ #define TIM_OSSI_ENABLE (TIM_BDTR_OSSI) -#define TIM_OSSI_DISABLE ((uint32_t)0x00000000U) +#define TIM_OSSI_DISABLE 0x00000000U /** * @} */ @@ -648,7 +648,7 @@ typedef struct /** @defgroup TIM_Lock_level TIM Lock level * @{ */ -#define TIM_LOCKLEVEL_OFF ((uint32_t)0x00000000U) +#define TIM_LOCKLEVEL_OFF 0x00000000U #define TIM_LOCKLEVEL_1 (TIM_BDTR_LOCK_0) #define TIM_LOCKLEVEL_2 (TIM_BDTR_LOCK_1) #define TIM_LOCKLEVEL_3 (TIM_BDTR_LOCK) @@ -659,7 +659,7 @@ typedef struct * @{ */ #define TIM_BREAK_ENABLE (TIM_BDTR_BKE) -#define TIM_BREAK_DISABLE ((uint32_t)0x00000000U) +#define TIM_BREAK_DISABLE 0x00000000U /** * @} */ @@ -667,7 +667,7 @@ typedef struct /** @defgroup TIM_Break_Polarity TIM Break Polarity * @{ */ -#define TIM_BREAKPOLARITY_LOW ((uint32_t)0x00000000U) +#define TIM_BREAKPOLARITY_LOW 0x00000000U #define TIM_BREAKPOLARITY_HIGH (TIM_BDTR_BKP) /** * @} @@ -677,7 +677,7 @@ typedef struct * @{ */ #define TIM_AUTOMATICOUTPUT_ENABLE (TIM_BDTR_AOE) -#define TIM_AUTOMATICOUTPUT_DISABLE ((uint32_t)0x00000000U) +#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /** * @} */ @@ -685,7 +685,7 @@ typedef struct /** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection * @{ */ -#define TIM_TRGO_RESET ((uint32_t)0x00000000U) +#define TIM_TRGO_RESET 0x00000000U #define TIM_TRGO_ENABLE (TIM_CR2_MMS_0) #define TIM_TRGO_UPDATE (TIM_CR2_MMS_1) #define TIM_TRGO_OC1 ((TIM_CR2_MMS_1 | TIM_CR2_MMS_0)) @@ -700,11 +700,11 @@ typedef struct /** @defgroup TIM_Slave_Mode TIM Slave Mode * @{ */ -#define TIM_SLAVEMODE_DISABLE ((uint32_t)0x00000000U) -#define TIM_SLAVEMODE_RESET ((uint32_t)0x00000004U) -#define TIM_SLAVEMODE_GATED ((uint32_t)0x00000005U) -#define TIM_SLAVEMODE_TRIGGER ((uint32_t)0x00000006U) -#define TIM_SLAVEMODE_EXTERNAL1 ((uint32_t)0x00000007U) +#define TIM_SLAVEMODE_DISABLE 0x00000000U +#define TIM_SLAVEMODE_RESET 0x00000004U +#define TIM_SLAVEMODE_GATED 0x00000005U +#define TIM_SLAVEMODE_TRIGGER 0x00000006U +#define TIM_SLAVEMODE_EXTERNAL1 0x00000007U /** * @} */ @@ -712,8 +712,8 @@ typedef struct /** @defgroup TIM_Master_Slave_Mode TIM Master Slave Mode * @{ */ -#define TIM_MASTERSLAVEMODE_ENABLE ((uint32_t)0x00000080U) -#define TIM_MASTERSLAVEMODE_DISABLE ((uint32_t)0x00000000U) +#define TIM_MASTERSLAVEMODE_ENABLE 0x00000080U +#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /** * @} */ @@ -721,15 +721,15 @@ typedef struct /** @defgroup TIM_Trigger_Selection TIM Trigger Selection * @{ */ -#define TIM_TS_ITR0 ((uint32_t)0x00000000U) -#define TIM_TS_ITR1 ((uint32_t)0x00000010U) -#define TIM_TS_ITR2 ((uint32_t)0x00000020U) -#define TIM_TS_ITR3 ((uint32_t)0x00000030U) -#define TIM_TS_TI1F_ED ((uint32_t)0x00000040U) -#define TIM_TS_TI1FP1 ((uint32_t)0x00000050U) -#define TIM_TS_TI2FP2 ((uint32_t)0x00000060U) -#define TIM_TS_ETRF ((uint32_t)0x00000070U) -#define TIM_TS_NONE ((uint32_t)0x0000FFFFU) +#define TIM_TS_ITR0 0x00000000U +#define TIM_TS_ITR1 0x00000010U +#define TIM_TS_ITR2 0x00000020U +#define TIM_TS_ITR3 0x00000030U +#define TIM_TS_TI1F_ED 0x00000040U +#define TIM_TS_TI1FP1 0x00000050U +#define TIM_TS_TI2FP2 0x00000060U +#define TIM_TS_ETRF 0x00000070U +#define TIM_TS_NONE 0x0000FFFFU /** * @} */ @@ -761,7 +761,7 @@ typedef struct /** @defgroup TIM_TI1_Selection TIM TI1 Selection * @{ */ -#define TIM_TI1SELECTION_CH1 ((uint32_t)0x00000000U) +#define TIM_TI1SELECTION_CH1 0x00000000U #define TIM_TI1SELECTION_XORCOMBINATION (TIM_CR2_TI1S) /** * @} @@ -770,26 +770,26 @@ typedef struct /** @defgroup TIM_DMA_Base_address TIM DMA Base address * @{ */ -#define TIM_DMABASE_CR1 (0x00000000U) -#define TIM_DMABASE_CR2 (0x00000001U) -#define TIM_DMABASE_SMCR (0x00000002U) -#define TIM_DMABASE_DIER (0x00000003U) -#define TIM_DMABASE_SR (0x00000004U) -#define TIM_DMABASE_EGR (0x00000005U) -#define TIM_DMABASE_CCMR1 (0x00000006U) -#define TIM_DMABASE_CCMR2 (0x00000007U) -#define TIM_DMABASE_CCER (0x00000008U) -#define TIM_DMABASE_CNT (0x00000009U) -#define TIM_DMABASE_PSC (0x0000000AU) -#define TIM_DMABASE_ARR (0x0000000BU) -#define TIM_DMABASE_RCR (0x0000000CU) -#define TIM_DMABASE_CCR1 (0x0000000DU) -#define TIM_DMABASE_CCR2 (0x0000000EU) -#define TIM_DMABASE_CCR3 (0x0000000FU) -#define TIM_DMABASE_CCR4 (0x00000010U) -#define TIM_DMABASE_BDTR (0x00000011U) -#define TIM_DMABASE_DCR (0x00000012U) -#define TIM_DMABASE_OR (0x00000013U) +#define TIM_DMABASE_CR1 0x00000000U +#define TIM_DMABASE_CR2 0x00000001U +#define TIM_DMABASE_SMCR 0x00000002U +#define TIM_DMABASE_DIER 0x00000003U +#define TIM_DMABASE_SR 0x00000004U +#define TIM_DMABASE_EGR 0x00000005U +#define TIM_DMABASE_CCMR1 0x00000006U +#define TIM_DMABASE_CCMR2 0x00000007U +#define TIM_DMABASE_CCER 0x00000008U +#define TIM_DMABASE_CNT 0x00000009U +#define TIM_DMABASE_PSC 0x0000000AU +#define TIM_DMABASE_ARR 0x0000000BU +#define TIM_DMABASE_RCR 0x0000000CU +#define TIM_DMABASE_CCR1 0x0000000DU +#define TIM_DMABASE_CCR2 0x0000000EU +#define TIM_DMABASE_CCR3 0x0000000FU +#define TIM_DMABASE_CCR4 0x00000010U +#define TIM_DMABASE_BDTR 0x00000011U +#define TIM_DMABASE_DCR 0x00000012U +#define TIM_DMABASE_OR 0x00000013U /** * @} */ @@ -797,24 +797,24 @@ typedef struct /** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length * @{ */ -#define TIM_DMABURSTLENGTH_1TRANSFER (0x00000000U) -#define TIM_DMABURSTLENGTH_2TRANSFERS (0x00000100U) -#define TIM_DMABURSTLENGTH_3TRANSFERS (0x00000200U) -#define TIM_DMABURSTLENGTH_4TRANSFERS (0x00000300U) -#define TIM_DMABURSTLENGTH_5TRANSFERS (0x00000400U) -#define TIM_DMABURSTLENGTH_6TRANSFERS (0x00000500U) -#define TIM_DMABURSTLENGTH_7TRANSFERS (0x00000600U) -#define TIM_DMABURSTLENGTH_8TRANSFERS (0x00000700U) -#define TIM_DMABURSTLENGTH_9TRANSFERS (0x00000800U) -#define TIM_DMABURSTLENGTH_10TRANSFERS (0x00000900U) -#define TIM_DMABURSTLENGTH_11TRANSFERS (0x00000A00U) -#define TIM_DMABURSTLENGTH_12TRANSFERS (0x00000B00U) -#define TIM_DMABURSTLENGTH_13TRANSFERS (0x00000C00U) -#define TIM_DMABURSTLENGTH_14TRANSFERS (0x00000D00U) -#define TIM_DMABURSTLENGTH_15TRANSFERS (0x00000E00U) -#define TIM_DMABURSTLENGTH_16TRANSFERS (0x00000F00U) -#define TIM_DMABURSTLENGTH_17TRANSFERS (0x00001000U) -#define TIM_DMABURSTLENGTH_18TRANSFERS (0x00001100U) +#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U +#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U +#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U +#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U +#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U +#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U +#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U +#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U +#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U +#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U +#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U +#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U +#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U +#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U +#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U +#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U +#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U +#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /** * @} */ @@ -822,13 +822,13 @@ typedef struct /** @defgroup DMA_Handle_index DMA Handle index * @{ */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000U) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001U) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002U) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003U) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004U) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005U) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006U) /*!< Index of the DMA handle used for Trigger DMA requests */ +#define TIM_DMA_ID_UPDATE ((uint16_t)0x0000) /*!< Index of the DMA handle used for Update DMA requests */ +#define TIM_DMA_ID_CC1 ((uint16_t)0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ +#define TIM_DMA_ID_CC2 ((uint16_t)0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ +#define TIM_DMA_ID_CC3 ((uint16_t)0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ +#define TIM_DMA_ID_CC4 ((uint16_t)0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ +#define TIM_DMA_ID_COMMUTATION ((uint16_t)0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ +#define TIM_DMA_ID_TRIGGER ((uint16_t)0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ /** * @} */ @@ -836,10 +836,10 @@ typedef struct /** @defgroup Channel_CC_State Channel CC State * @{ */ -#define TIM_CCx_ENABLE ((uint32_t)0x00000001U) -#define TIM_CCx_DISABLE ((uint32_t)0x00000000U) -#define TIM_CCxN_ENABLE ((uint32_t)0x00000004U) -#define TIM_CCxN_DISABLE ((uint32_t)0x00000000U) +#define TIM_CCx_ENABLE 0x00000001U +#define TIM_CCx_DISABLE 0x00000000U +#define TIM_CCxN_ENABLE 0x00000004U +#define TIM_CCxN_DISABLE 0x00000000U /** * @} */ @@ -887,7 +887,7 @@ typedef struct (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ } \ } \ - } while(0) + } while(0U) /* The Main Output of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ @@ -905,19 +905,175 @@ typedef struct (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ } \ } \ - } while(0) + } while(0U) +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__: TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled unconditionally + */ +#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) + +/** @brief Enable the specified TIM interrupt. + * @param __HANDLE__: specifies the TIM Handle. + * @param __INTERRUPT__: specifies the TIM interrupt source to enable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ #define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + + +/** @brief Disable the specified TIM interrupt. + * @param __HANDLE__: specifies the TIM Handle. + * @param __INTERRUPT__: specifies the TIM interrupt source to disable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ #define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +/** @brief Enable the specified DMA request. + * @param __HANDLE__: specifies the TIM Handle. + * @param __DMA__: specifies the TIM DMA request to enable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + +/** @brief Disable the specified DMA request. + * @param __HANDLE__: specifies the TIM Handle. + * @param __DMA__: specifies the TIM DMA request to disable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ #define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) + +/** @brief Check whether the specified TIM interrupt flag is set or not. + * @param __HANDLE__: specifies the TIM Handle. + * @param __FLAG__: specifies the TIM interrupt flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_CC5: Compare 5 interrupt flag + * @arg TIM_FLAG_CC6: Compare 6 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_BREAK2: Break 2 interrupt flag + * @arg TIM_FLAG_SYSTEM_BREAK: System Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ #define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) + +/** @brief Clear the specified TIM interrupt flag. + * @param __HANDLE__: specifies the TIM Handle. + * @param __FLAG__: specifies the TIM interrupt flag to clear. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_CC5: Compare 5 interrupt flag + * @arg TIM_FLAG_CC6: Compare 6 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_BREAK2: Break 2 interrupt flag + * @arg TIM_FLAG_SYSTEM_BREAK: System Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ #define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) +/** + * @brief Check whether the specified TIM interrupt source is enabled or not. + * @param __HANDLE__: TIM handle + * @param __INTERRUPT__: specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval The state of TIM_IT (SET or RESET). + */ #define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Clear the TIM interrupt pending bits. + * @param __HANDLE__: TIM handle + * @param __INTERRUPT__: specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Indicates whether or not the TIM Counter is used as downcounter. + * @param __HANDLE__: TIM handle. + * @retval False (Counter used as upcounter) or True (Counter used as downcounter) + * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder +mode. + */ #define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) + +/** + * @brief Set the TIM Prescaler on runtime. + * @param __HANDLE__: TIM handle. + * @param __PRESC__: specifies the Prescaler new value. + * @retval None + */ #define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ @@ -961,15 +1117,17 @@ typedef struct (*(__IO uint32_t *)(&((__HANDLE__)->Instance->CCR1) + ((__CHANNEL__) >> 2U)) = (__COMPARE__)) /** - * @brief Gets the TIM Capture Compare Register value on runtime + * @brief Gets the TIM Capture Compare Register value on runtime. * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channel associated with the capture compare register + * @param __CHANNEL__: TIM Channel associated with the capture compare register * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: get capture/compare 1 register value * @arg TIM_CHANNEL_2: get capture/compare 2 register value * @arg TIM_CHANNEL_3: get capture/compare 3 register value * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval None + * @arg TIM_CHANNEL_5: get capture/compare 5 register value + * @arg TIM_CHANNEL_6: get capture/compare 6 register value + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ (*(__IO uint32_t *)(&((__HANDLE__)->Instance->CCR1) + ((__CHANNEL__) >> 2U))) @@ -985,7 +1143,7 @@ typedef struct /** * @brief Gets the TIM Counter Register value on runtime. * @param __HANDLE__: TIM handle. - * @retval None + * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ #define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) @@ -1000,23 +1158,22 @@ typedef struct do{ \ (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + } while(0U) /** - * @brief Gets the TIM Autoreload Register value on runtime + * @brief Gets the TIM Autoreload Register value on runtime. * @param __HANDLE__: TIM handle. - * @retval None + * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ #define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** - * @brief Sets the TIM Clock Division value on runtime without calling - * another time any Init function. + * @brief Sets the TIM Clock Division value on runtime without calling another time any Init function. * @param __HANDLE__: TIM handle. * @param __CKD__: specifies the clock division value. * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1 - * @arg TIM_CLOCKDIVISION_DIV2 - * @arg TIM_CLOCKDIVISION_DIV4 + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ @@ -1024,11 +1181,14 @@ typedef struct (__HANDLE__)->Instance->CR1 &= (uint16_t)(~TIM_CR1_CKD); \ (__HANDLE__)->Instance->CR1 |= (__CKD__); \ (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + } while(0U) /** - * @brief Gets the TIM Clock Division value on runtime + * @brief Gets the TIM Clock Division value on runtime. * @param __HANDLE__: TIM handle. - * @retval None + * @retval The clock division can be one of the following values: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ #define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) @@ -1054,18 +1214,22 @@ typedef struct do{ \ TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + } while(0U) /** - * @brief Gets the TIM Input Capture prescaler on runtime + * @brief Get the TIM Input Capture prescaler on runtime. * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channels to be configured. + * @param __CHANNEL__: TIM Channels to be configured. * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: get input capture 1 prescaler value * @arg TIM_CHANNEL_2: get input capture 2 prescaler value * @arg TIM_CHANNEL_3: get input capture 3 prescaler value * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval None + * @retval The input capture prescaler can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events */ #define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ @@ -1118,7 +1282,7 @@ typedef struct do{ \ TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + }while(0U) /** * @} */ @@ -1557,7 +1721,7 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); ((LENGTH) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ ((LENGTH) == TIM_DMABURSTLENGTH_18TRANSFERS)) -#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0x0F) +#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0x0FU) /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h index cef2aaf..92bf0f2 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_tim_ex.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of TIM HAL Extension module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -122,28 +122,28 @@ typedef struct /** @defgroup TIMEx_Remap TIM Remap * @{ */ -#define TIM_TIM2_TIM8_TRGO (0x00000000U) -#define TIM_TIM2_ETH_PTP (0x00000400U) -#define TIM_TIM2_USBFS_SOF (0x00000800U) -#define TIM_TIM2_USBHS_SOF (0x00000C00U) -#define TIM_TIM5_GPIO (0x00000000U) -#define TIM_TIM5_LSI (0x00000040U) -#define TIM_TIM5_LSE (0x00000080U) -#define TIM_TIM5_RTC (0x000000C0U) -#define TIM_TIM11_GPIO (0x00000000U) -#define TIM_TIM11_HSE (0x00000002U) +#define TIM_TIM2_TIM8_TRGO 0x00000000U +#define TIM_TIM2_ETH_PTP 0x00000400U +#define TIM_TIM2_USBFS_SOF 0x00000800U +#define TIM_TIM2_USBHS_SOF 0x00000C00U +#define TIM_TIM5_GPIO 0x00000000U +#define TIM_TIM5_LSI 0x00000040U +#define TIM_TIM5_LSE 0x00000080U +#define TIM_TIM5_RTC 0x000000C0U +#define TIM_TIM11_GPIO 0x00000000U +#define TIM_TIM11_HSE 0x00000002U #if defined(STM32F413xx) || defined(STM32F423xx) -#define TIM_TIM9_TIM3_TRGO (0x10000000U) -#define TIM_TIM9_LPTIM (0x10000010U) -#define TIM_TIM5_TIM3_TRGO (0x10000000U) -#define TIM_TIM5_LPTIM (0x10000008U) -#define TIM_TIM1_TIM3_TRGO (0x10000000U) -#define TIM_TIM1_LPTIM (0x10000004U) +#define TIM_TIM9_TIM3_TRGO 0x10000000U +#define TIM_TIM9_LPTIM 0x10000010U +#define TIM_TIM5_TIM3_TRGO 0x10000000U +#define TIM_TIM5_LPTIM 0x10000008U +#define TIM_TIM1_TIM3_TRGO 0x10000000U +#define TIM_TIM1_LPTIM 0x10000004U #endif /* STM32F413xx | STM32F423xx */ #if defined (STM32F446xx) -#define TIM_TIM11_SPDIFRX (0x00000001U) +#define TIM_TIM11_SPDIFRX 0x00000001U #endif /* STM32F446xx */ /** * @} @@ -153,9 +153,9 @@ typedef struct /** @defgroup TIMEx_SystemBreakInput TIM System Break Input * @{ */ -#define TIM_SYSTEMBREAKINPUT_HARDFAULT ((uint32_t)0x00000001U) /* Core Lockup lock output(Hardfault) is connected to Break Input of TIM1 and TIM8 */ -#define TIM_SYSTEMBREAKINPUT_PVD ((uint32_t)0x00000004U) /* PVD Interrupt is connected to Break Input of TIM1 and TIM8 */ -#define TIM_SYSTEMBREAKINPUT_HARDFAULT_PVD ((uint32_t)0x00000005U) /* Core Lockup lock output(Hardfault) and PVD Interrupt are connected to Break Input of TIM1 and TIM8 */ +#define TIM_SYSTEMBREAKINPUT_HARDFAULT 0x00000001U /* Core Lockup lock output(Hardfault) is connected to Break Input of TIM1 and TIM8 */ +#define TIM_SYSTEMBREAKINPUT_PVD 0x00000004U /* PVD Interrupt is connected to Break Input of TIM1 and TIM8 */ +#define TIM_SYSTEMBREAKINPUT_HARDFAULT_PVD 0x00000005U /* Core Lockup lock output(Hardfault) and PVD Interrupt are connected to Break Input of TIM1 and TIM8 */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h index 6fd0666..6679a45 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_uart.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of UART HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -204,12 +204,12 @@ typedef struct * @brief UART Error Code * @{ */ -#define HAL_UART_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_UART_ERROR_PE ((uint32_t)0x00000001U) /*!< Parity error */ -#define HAL_UART_ERROR_NE ((uint32_t)0x00000002U) /*!< Noise error */ -#define HAL_UART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ -#define HAL_UART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ -#define HAL_UART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ /** * @} */ @@ -217,7 +217,7 @@ typedef struct /** @defgroup UART_Word_Length UART Word Length * @{ */ -#define UART_WORDLENGTH_8B ((uint32_t)0x00000000U) +#define UART_WORDLENGTH_8B 0x00000000U #define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) /** * @} @@ -226,7 +226,7 @@ typedef struct /** @defgroup UART_Stop_Bits UART Number of Stop Bits * @{ */ -#define UART_STOPBITS_1 ((uint32_t)0x00000000U) +#define UART_STOPBITS_1 0x00000000U #define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) /** * @} @@ -235,7 +235,7 @@ typedef struct /** @defgroup UART_Parity UART Parity * @{ */ -#define UART_PARITY_NONE ((uint32_t)0x00000000U) +#define UART_PARITY_NONE 0x00000000U #define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) #define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) /** @@ -245,7 +245,7 @@ typedef struct /** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control * @{ */ -#define UART_HWCONTROL_NONE ((uint32_t)0x00000000U) +#define UART_HWCONTROL_NONE 0x00000000U #define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE) #define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE) #define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) @@ -266,7 +266,7 @@ typedef struct /** @defgroup UART_State UART State * @{ */ -#define UART_STATE_DISABLE ((uint32_t)0x00000000U) +#define UART_STATE_DISABLE 0x00000000U #define UART_STATE_ENABLE ((uint32_t)USART_CR1_UE) /** * @} @@ -275,7 +275,7 @@ typedef struct /** @defgroup UART_Over_Sampling UART Over Sampling * @{ */ -#define UART_OVERSAMPLING_16 ((uint32_t)0x00000000U) +#define UART_OVERSAMPLING_16 0x00000000U #define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8) /** * @} @@ -284,8 +284,8 @@ typedef struct /** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length * @{ */ -#define UART_LINBREAKDETECTLENGTH_10B ((uint32_t)0x00000000U) -#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)0x00000020U) +#define UART_LINBREAKDETECTLENGTH_10B 0x00000000U +#define UART_LINBREAKDETECTLENGTH_11B 0x00000020U /** * @} */ @@ -293,8 +293,8 @@ typedef struct /** @defgroup UART_WakeUp_functions UART Wakeup Functions * @{ */ -#define UART_WAKEUPMETHOD_IDLELINE ((uint32_t)0x00000000U) -#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)0x00000800U) +#define UART_WAKEUPMETHOD_IDLELINE 0x00000000U +#define UART_WAKEUPMETHOD_ADDRESSMARK 0x00000800U /** * @} */ @@ -361,7 +361,7 @@ typedef struct #define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ - } while(0) + } while(0U) /** @brief Flushes the UART DR register * @param __HANDLE__: specifies the UART Handle. @@ -425,7 +425,7 @@ typedef struct tmpreg = (__HANDLE__)->Instance->SR; \ tmpreg = (__HANDLE__)->Instance->DR; \ UNUSED(tmpreg); \ - } while(0) + } while(0U) /** @brief Clear the UART FE pending flag. * @param __HANDLE__: specifies the UART Handle. @@ -475,7 +475,7 @@ typedef struct * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) * @retval None */ -#define UART_IT_MASK ((uint32_t)0x0000FFFFU) +#define UART_IT_MASK 0x0000FFFFU #define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == 1U)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \ (((__INTERRUPT__) >> 28U) == 2U)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \ ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK))) @@ -534,7 +534,7 @@ typedef struct do{ \ SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE; \ - } while(0) + } while(0U) /** @brief Disable CTS flow control * This macro allows to disable CTS hardware flow control for a given UART instance, @@ -553,7 +553,7 @@ typedef struct do{ \ CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE); \ - } while(0) + } while(0U) /** @brief Enable RTS flow control * This macro allows to enable RTS hardware flow control for a given UART instance, @@ -572,7 +572,7 @@ typedef struct do{ \ SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \ (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE; \ - } while(0) + } while(0U) /** @brief Disable RTS flow control * This macro allows to disable RTS hardware flow control for a given UART instance, @@ -591,7 +591,7 @@ typedef struct do{ \ CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\ (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE); \ - } while(0) + } while(0U) /** @brief macros to enables the UART's one bit sample method * @param __HANDLE__: specifies the UART Handle. @@ -733,7 +733,7 @@ uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart); ((CONTROL) == UART_HWCONTROL_RTS) || \ ((CONTROL) == UART_HWCONTROL_CTS) || \ ((CONTROL) == UART_HWCONTROL_RTS_CTS)) -#define IS_UART_MODE(MODE) ((((MODE) & (uint32_t)0x0000FFF3U) == 0x00U) && ((MODE) != (uint32_t)0x00U)) +#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U)) #define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || \ ((STATE) == UART_STATE_ENABLE)) #define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || \ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_usart.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_usart.h index 50ed225..a6e1451 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_usart.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_usart.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_usart.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of USART HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -156,12 +156,12 @@ typedef struct * @brief USART Error Code * @{ */ -#define HAL_USART_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ -#define HAL_USART_ERROR_PE ((uint32_t)0x00000001U) /*!< Parity error */ -#define HAL_USART_ERROR_NE ((uint32_t)0x00000002U) /*!< Noise error */ -#define HAL_USART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ -#define HAL_USART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ -#define HAL_USART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_USART_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_USART_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_USART_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_USART_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_USART_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_USART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ /** * @} */ @@ -169,7 +169,7 @@ typedef struct /** @defgroup USART_Word_Length USART Word Length * @{ */ -#define USART_WORDLENGTH_8B ((uint32_t)0x00000000U) +#define USART_WORDLENGTH_8B 0x00000000U #define USART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) /** * @} @@ -178,7 +178,7 @@ typedef struct /** @defgroup USART_Stop_Bits USART Number of Stop Bits * @{ */ -#define USART_STOPBITS_1 ((uint32_t)0x00000000U) +#define USART_STOPBITS_1 0x00000000U #define USART_STOPBITS_0_5 ((uint32_t)USART_CR2_STOP_0) #define USART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) #define USART_STOPBITS_1_5 ((uint32_t)(USART_CR2_STOP_0 | USART_CR2_STOP_1)) @@ -189,7 +189,7 @@ typedef struct /** @defgroup USART_Parity USART Parity * @{ */ -#define USART_PARITY_NONE ((uint32_t)0x00000000U) +#define USART_PARITY_NONE 0x00000000U #define USART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) #define USART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) /** @@ -209,7 +209,7 @@ typedef struct /** @defgroup USART_Clock USART Clock * @{ */ -#define USART_CLOCK_DISABLE ((uint32_t)0x00000000U) +#define USART_CLOCK_DISABLE 0x00000000U #define USART_CLOCK_ENABLE ((uint32_t)USART_CR2_CLKEN) /** * @} @@ -218,7 +218,7 @@ typedef struct /** @defgroup USART_Clock_Polarity USART Clock Polarity * @{ */ -#define USART_POLARITY_LOW ((uint32_t)0x00000000U) +#define USART_POLARITY_LOW 0x00000000U #define USART_POLARITY_HIGH ((uint32_t)USART_CR2_CPOL) /** * @} @@ -227,7 +227,7 @@ typedef struct /** @defgroup USART_Clock_Phase USART Clock Phase * @{ */ -#define USART_PHASE_1EDGE ((uint32_t)0x00000000U) +#define USART_PHASE_1EDGE 0x00000000U #define USART_PHASE_2EDGE ((uint32_t)USART_CR2_CPHA) /** * @} @@ -236,7 +236,7 @@ typedef struct /** @defgroup USART_Last_Bit USART Last Bit * @{ */ -#define USART_LASTBIT_DISABLE ((uint32_t)0x00000000U) +#define USART_LASTBIT_DISABLE 0x00000000U #define USART_LASTBIT_ENABLE ((uint32_t)USART_CR2_LBCL) /** * @} @@ -246,7 +246,7 @@ typedef struct * @{ */ #define USART_NACK_ENABLE ((uint32_t)USART_CR3_NACK) -#define USART_NACK_DISABLE ((uint32_t)0x00000000U) +#define USART_NACK_DISABLE 0x00000000U /** * @} */ @@ -256,14 +256,14 @@ typedef struct * - 0xXXXX : Flag mask in the SR register * @{ */ -#define USART_FLAG_TXE ((uint32_t)0x00000080U) -#define USART_FLAG_TC ((uint32_t)0x00000040U) -#define USART_FLAG_RXNE ((uint32_t)0x00000020U) -#define USART_FLAG_IDLE ((uint32_t)0x00000010U) -#define USART_FLAG_ORE ((uint32_t)0x00000008U) -#define USART_FLAG_NE ((uint32_t)0x00000004U) -#define USART_FLAG_FE ((uint32_t)0x00000002U) -#define USART_FLAG_PE ((uint32_t)0x00000001U) +#define USART_FLAG_TXE 0x00000080U +#define USART_FLAG_TC 0x00000040U +#define USART_FLAG_RXNE 0x00000020U +#define USART_FLAG_IDLE 0x00000010U +#define USART_FLAG_ORE 0x00000008U +#define USART_FLAG_NE 0x00000004U +#define USART_FLAG_FE 0x00000002U +#define USART_FLAG_PE 0x00000001U /** * @} */ @@ -357,7 +357,7 @@ typedef struct tmpreg = (__HANDLE__)->Instance->SR; \ tmpreg = (__HANDLE__)->Instance->DR; \ UNUSED(tmpreg); \ - } while(0) + } while(0U) /** @brief Clear the USART FE pending flag. * @param __HANDLE__: specifies the USART Handle. @@ -555,7 +555,7 @@ uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart); #define IS_USART_PARITY(PARITY) (((PARITY) == USART_PARITY_NONE) || \ ((PARITY) == USART_PARITY_EVEN) || \ ((PARITY) == USART_PARITY_ODD)) -#define IS_USART_MODE(MODE) ((((MODE) & (uint32_t)0xFFF3) == 0x00U) && ((MODE) != (uint32_t)0x00U)) +#define IS_USART_MODE(MODE) ((((MODE) & 0xFFF3U) == 0x00U) && ((MODE) != 0x00U)) #define IS_USART_BAUDRATE(BAUDRATE) ((BAUDRATE) < 10500001U) #define USART_DIV(_PCLK_, _BAUD_) (((_PCLK_)*25U)/(2U*(_BAUD_))) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_wwdg.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_wwdg.h index 38b07ae..e888cec 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_wwdg.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_wwdg.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_wwdg.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of WWDG HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -118,7 +118,7 @@ typedef struct /** @defgroup WWDG_Prescaler WWDG Prescaler * @{ */ -#define WWDG_PRESCALER_1 ((uint32_t)0x00000000U) /*!< WWDG counter clock = (PCLK1/4096)/1 */ +#define WWDG_PRESCALER_1 0x00000000U /*!< WWDG counter clock = (PCLK1/4096)/1 */ #define WWDG_PRESCALER_2 WWDG_CFR_WDGTB0 /*!< WWDG counter clock = (PCLK1/4096)/2 */ #define WWDG_PRESCALER_4 WWDG_CFR_WDGTB1 /*!< WWDG counter clock = (PCLK1/4096)/4 */ #define WWDG_PRESCALER_8 WWDG_CFR_WDGTB /*!< WWDG counter clock = (PCLK1/4096)/8 */ @@ -129,7 +129,7 @@ typedef struct /** @defgroup WWDG_EWI_Mode WWDG Early Wakeup Interrupt Mode * @{ */ -#define WWDG_EWI_DISABLE 0x00000000u /*!< EWI Disable */ +#define WWDG_EWI_DISABLE 0x00000000U /*!< EWI Disable */ #define WWDG_EWI_ENABLE WWDG_CFR_EWI /*!< EWI Enable */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h new file mode 100644 index 0000000..3dd5cf6 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h @@ -0,0 +1,4692 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_adc.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of ADC LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_ADC_H +#define __STM32F4xx_LL_ADC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (ADC1) || defined (ADC2) || defined (ADC3) + +/** @defgroup ADC_LL ADC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup ADC_LL_Private_Constants ADC Private Constants + * @{ + */ + +/* Internal mask for ADC group regular sequencer: */ +/* To select into literal LL_ADC_REG_RANK_x the relevant bits for: */ +/* - sequencer register offset */ +/* - sequencer rank bits position into the selected register */ + +/* Internal register offset for ADC group regular sequencer configuration */ +/* (offset placed into a spare area of literal definition) */ +#define ADC_SQR1_REGOFFSET 0x00000000U +#define ADC_SQR2_REGOFFSET 0x00000100U +#define ADC_SQR3_REGOFFSET 0x00000200U +#define ADC_SQR4_REGOFFSET 0x00000300U + +#define ADC_REG_SQRX_REGOFFSET_MASK (ADC_SQR1_REGOFFSET | ADC_SQR2_REGOFFSET | ADC_SQR3_REGOFFSET | ADC_SQR4_REGOFFSET) +#define ADC_REG_RANK_ID_SQRX_MASK (ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0) + +/* Definition of ADC group regular sequencer bits information to be inserted */ +/* into ADC group regular sequencer ranks literals definition. */ +#define ADC_REG_RANK_1_SQRX_BITOFFSET_POS ( 0U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ1) */ +#define ADC_REG_RANK_2_SQRX_BITOFFSET_POS ( 5U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ2) */ +#define ADC_REG_RANK_3_SQRX_BITOFFSET_POS (10U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ3) */ +#define ADC_REG_RANK_4_SQRX_BITOFFSET_POS (15U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ4) */ +#define ADC_REG_RANK_5_SQRX_BITOFFSET_POS (20U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ5) */ +#define ADC_REG_RANK_6_SQRX_BITOFFSET_POS (25U) /* Value equivalent to POSITION_VAL(ADC_SQR3_SQ6) */ +#define ADC_REG_RANK_7_SQRX_BITOFFSET_POS ( 0U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ7) */ +#define ADC_REG_RANK_8_SQRX_BITOFFSET_POS ( 5U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ8) */ +#define ADC_REG_RANK_9_SQRX_BITOFFSET_POS (10U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ9) */ +#define ADC_REG_RANK_10_SQRX_BITOFFSET_POS (15U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ10) */ +#define ADC_REG_RANK_11_SQRX_BITOFFSET_POS (20U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ11) */ +#define ADC_REG_RANK_12_SQRX_BITOFFSET_POS (25U) /* Value equivalent to POSITION_VAL(ADC_SQR2_SQ12) */ +#define ADC_REG_RANK_13_SQRX_BITOFFSET_POS ( 0U) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ13) */ +#define ADC_REG_RANK_14_SQRX_BITOFFSET_POS ( 5U) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ14) */ +#define ADC_REG_RANK_15_SQRX_BITOFFSET_POS (10U) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ15) */ +#define ADC_REG_RANK_16_SQRX_BITOFFSET_POS (15U) /* Value equivalent to POSITION_VAL(ADC_SQR1_SQ16) */ + +/* Internal mask for ADC group injected sequencer: */ +/* To select into literal LL_ADC_INJ_RANK_x the relevant bits for: */ +/* - data register offset */ +/* - offset register offset */ +/* - sequencer rank bits position into the selected register */ + +/* Internal register offset for ADC group injected data register */ +/* (offset placed into a spare area of literal definition) */ +#define ADC_JDR1_REGOFFSET 0x00000000U +#define ADC_JDR2_REGOFFSET 0x00000100U +#define ADC_JDR3_REGOFFSET 0x00000200U +#define ADC_JDR4_REGOFFSET 0x00000300U + +/* Internal register offset for ADC group injected offset configuration */ +/* (offset placed into a spare area of literal definition) */ +#define ADC_JOFR1_REGOFFSET 0x00000000U +#define ADC_JOFR2_REGOFFSET 0x00001000U +#define ADC_JOFR3_REGOFFSET 0x00002000U +#define ADC_JOFR4_REGOFFSET 0x00003000U + +#define ADC_INJ_JDRX_REGOFFSET_MASK (ADC_JDR1_REGOFFSET | ADC_JDR2_REGOFFSET | ADC_JDR3_REGOFFSET | ADC_JDR4_REGOFFSET) +#define ADC_INJ_JOFRX_REGOFFSET_MASK (ADC_JOFR1_REGOFFSET | ADC_JOFR2_REGOFFSET | ADC_JOFR3_REGOFFSET | ADC_JOFR4_REGOFFSET) +#define ADC_INJ_RANK_ID_JSQR_MASK (ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0) + +/* Internal mask for ADC group regular trigger: */ +/* To select into literal LL_ADC_REG_TRIG_x the relevant bits for: */ +/* - regular trigger source */ +/* - regular trigger edge */ +#define ADC_REG_TRIG_EXT_EDGE_DEFAULT (ADC_CR2_EXTEN_0) /* Trigger edge set to rising edge (default setting for compatibility with some ADC on other STM32 families having this setting set by HW default value) */ + +/* Mask containing trigger source masks for each of possible */ +/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ +/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ +#define ADC_REG_TRIG_SOURCE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTSEL) >> (4U * 0U)) | \ + ((ADC_CR2_EXTSEL) >> (4U * 1U)) | \ + ((ADC_CR2_EXTSEL) >> (4U * 2U)) | \ + ((ADC_CR2_EXTSEL) >> (4U * 3U))) + +/* Mask containing trigger edge masks for each of possible */ +/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ +/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ +#define ADC_REG_TRIG_EDGE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTEN) >> (4U * 0U)) | \ + ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4U * 1U)) | \ + ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4U * 2U)) | \ + ((ADC_REG_TRIG_EXT_EDGE_DEFAULT) >> (4U * 3U))) + +/* Definition of ADC group regular trigger bits information. */ +#define ADC_REG_TRIG_EXTSEL_BITOFFSET_POS (24U) /* Value equivalent to POSITION_VAL(ADC_CR2_EXTSEL) */ +#define ADC_REG_TRIG_EXTEN_BITOFFSET_POS (28U) /* Value equivalent to POSITION_VAL(ADC_CR2_EXTEN) */ + + + +/* Internal mask for ADC group injected trigger: */ +/* To select into literal LL_ADC_INJ_TRIG_x the relevant bits for: */ +/* - injected trigger source */ +/* - injected trigger edge */ +#define ADC_INJ_TRIG_EXT_EDGE_DEFAULT (ADC_CR2_JEXTEN_0) /* Trigger edge set to rising edge (default setting for compatibility with some ADC on other STM32 families having this setting set by HW default value) */ + +/* Mask containing trigger source masks for each of possible */ +/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ +/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ +#define ADC_INJ_TRIG_SOURCE_MASK (((LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_JEXTSEL) >> (4U * 0U)) | \ + ((ADC_CR2_JEXTSEL) >> (4U * 1U)) | \ + ((ADC_CR2_JEXTSEL) >> (4U * 2U)) | \ + ((ADC_CR2_JEXTSEL) >> (4U * 3U))) + +/* Mask containing trigger edge masks for each of possible */ +/* trigger edge selection duplicated with shifts [0; 4; 8; 12] */ +/* corresponding to {SW start; ext trigger; ext trigger; ext trigger}. */ +#define ADC_INJ_TRIG_EDGE_MASK (((LL_ADC_INJ_TRIG_SOFTWARE & ADC_CR2_JEXTEN) >> (4U * 0U)) | \ + ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4U * 1U)) | \ + ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4U * 2U)) | \ + ((ADC_INJ_TRIG_EXT_EDGE_DEFAULT) >> (4U * 3U))) + +/* Definition of ADC group injected trigger bits information. */ +#define ADC_INJ_TRIG_EXTSEL_BITOFFSET_POS (16U) /* Value equivalent to POSITION_VAL(ADC_CR2_JEXTSEL) */ +#define ADC_INJ_TRIG_EXTEN_BITOFFSET_POS (20U) /* Value equivalent to POSITION_VAL(ADC_CR2_JEXTEN) */ + +/* Internal mask for ADC channel: */ +/* To select into literal LL_ADC_CHANNEL_x the relevant bits for: */ +/* - channel identifier defined by number */ +/* - channel differentiation between external channels (connected to */ +/* GPIO pins) and internal channels (connected to internal paths) */ +/* - channel sampling time defined by SMPRx register offset */ +/* and SMPx bits positions into SMPRx register */ +#define ADC_CHANNEL_ID_NUMBER_MASK (ADC_CR1_AWDCH) +#define ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS ( 0U)/* Value equivalent to POSITION_VAL(ADC_CHANNEL_ID_NUMBER_MASK) */ +#define ADC_CHANNEL_ID_MASK (ADC_CHANNEL_ID_NUMBER_MASK | ADC_CHANNEL_ID_INTERNAL_CH_MASK) +/* Equivalent mask of ADC_CHANNEL_NUMBER_MASK aligned on register LSB (bit 0) */ +#define ADC_CHANNEL_ID_NUMBER_MASK_POSBIT0 0x0000001FU /* Equivalent to shift: (ADC_CHANNEL_NUMBER_MASK >> POSITION_VAL(ADC_CHANNEL_NUMBER_MASK)) */ + +/* Channel differentiation between external and internal channels */ +#define ADC_CHANNEL_ID_INTERNAL_CH 0x80000000U /* Marker of internal channel */ +#define ADC_CHANNEL_ID_INTERNAL_CH_2 0x40000000U /* Marker of internal channel for other ADC instances, in case of different ADC internal channels mapped on same channel number on different ADC instances */ +#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ +#define ADC_CHANNEL_ID_INTERNAL_CH_MASK (ADC_CHANNEL_ID_INTERNAL_CH | ADC_CHANNEL_ID_INTERNAL_CH_2 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) + +/* Internal register offset for ADC channel sampling time configuration */ +/* (offset placed into a spare area of literal definition) */ +#define ADC_SMPR1_REGOFFSET 0x00000000U +#define ADC_SMPR2_REGOFFSET 0x02000000U +#define ADC_CHANNEL_SMPRX_REGOFFSET_MASK (ADC_SMPR1_REGOFFSET | ADC_SMPR2_REGOFFSET) + +#define ADC_CHANNEL_SMPx_BITOFFSET_MASK 0x01F00000U +#define ADC_CHANNEL_SMPx_BITOFFSET_POS (20U) /* Value equivalent to POSITION_VAL(ADC_CHANNEL_SMPx_BITOFFSET_MASK) */ + +/* Definition of channels ID number information to be inserted into */ +/* channels literals definition. */ +#define ADC_CHANNEL_0_NUMBER 0x00000000U +#define ADC_CHANNEL_1_NUMBER ( ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_2_NUMBER ( ADC_CR1_AWDCH_1 ) +#define ADC_CHANNEL_3_NUMBER ( ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_4_NUMBER ( ADC_CR1_AWDCH_2 ) +#define ADC_CHANNEL_5_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_6_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 ) +#define ADC_CHANNEL_7_NUMBER ( ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_8_NUMBER ( ADC_CR1_AWDCH_3 ) +#define ADC_CHANNEL_9_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_10_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1 ) +#define ADC_CHANNEL_11_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_12_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 ) +#define ADC_CHANNEL_13_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_14_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 ) +#define ADC_CHANNEL_15_NUMBER ( ADC_CR1_AWDCH_3 | ADC_CR1_AWDCH_2 | ADC_CR1_AWDCH_1 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_16_NUMBER (ADC_CR1_AWDCH_4 ) +#define ADC_CHANNEL_17_NUMBER (ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_0) +#define ADC_CHANNEL_18_NUMBER (ADC_CR1_AWDCH_4 | ADC_CR1_AWDCH_1 ) + +/* Definition of channels sampling time information to be inserted into */ +/* channels literals definition. */ +#define ADC_CHANNEL_0_SMP (ADC_SMPR2_REGOFFSET | (( 0U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP0) */ +#define ADC_CHANNEL_1_SMP (ADC_SMPR2_REGOFFSET | (( 3U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP1) */ +#define ADC_CHANNEL_2_SMP (ADC_SMPR2_REGOFFSET | (( 6U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP2) */ +#define ADC_CHANNEL_3_SMP (ADC_SMPR2_REGOFFSET | (( 9U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP3) */ +#define ADC_CHANNEL_4_SMP (ADC_SMPR2_REGOFFSET | ((12U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP4) */ +#define ADC_CHANNEL_5_SMP (ADC_SMPR2_REGOFFSET | ((15U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP5) */ +#define ADC_CHANNEL_6_SMP (ADC_SMPR2_REGOFFSET | ((18U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP6) */ +#define ADC_CHANNEL_7_SMP (ADC_SMPR2_REGOFFSET | ((21U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP7) */ +#define ADC_CHANNEL_8_SMP (ADC_SMPR2_REGOFFSET | ((24U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP8) */ +#define ADC_CHANNEL_9_SMP (ADC_SMPR2_REGOFFSET | ((27U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR2_SMP9) */ +#define ADC_CHANNEL_10_SMP (ADC_SMPR1_REGOFFSET | (( 0U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP10) */ +#define ADC_CHANNEL_11_SMP (ADC_SMPR1_REGOFFSET | (( 3U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP11) */ +#define ADC_CHANNEL_12_SMP (ADC_SMPR1_REGOFFSET | (( 6U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP12) */ +#define ADC_CHANNEL_13_SMP (ADC_SMPR1_REGOFFSET | (( 9U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP13) */ +#define ADC_CHANNEL_14_SMP (ADC_SMPR1_REGOFFSET | ((12U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP14) */ +#define ADC_CHANNEL_15_SMP (ADC_SMPR1_REGOFFSET | ((15U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP15) */ +#define ADC_CHANNEL_16_SMP (ADC_SMPR1_REGOFFSET | ((18U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP16) */ +#define ADC_CHANNEL_17_SMP (ADC_SMPR1_REGOFFSET | ((21U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP17) */ +#define ADC_CHANNEL_18_SMP (ADC_SMPR1_REGOFFSET | ((24U) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) /* Value shifted is equivalent to POSITION_VAL(ADC_SMPR1_SMP18) */ + +/* Internal mask for ADC analog watchdog: */ +/* To select into literals LL_ADC_AWD_CHANNELx_xxx the relevant bits for: */ +/* (concatenation of multiple bits used in different analog watchdogs, */ +/* (feature of several watchdogs not available on all STM32 families)). */ +/* - analog watchdog 1: monitored channel defined by number, */ +/* selection of ADC group (ADC groups regular and-or injected). */ + +/* Internal register offset for ADC analog watchdog channel configuration */ +#define ADC_AWD_CR1_REGOFFSET 0x00000000U + +#define ADC_AWD_CRX_REGOFFSET_MASK (ADC_AWD_CR1_REGOFFSET) + +#define ADC_AWD_CR1_CHANNEL_MASK (ADC_CR1_AWDCH | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) +#define ADC_AWD_CR_ALL_CHANNEL_MASK (ADC_AWD_CR1_CHANNEL_MASK) + +/* Internal register offset for ADC analog watchdog threshold configuration */ +#define ADC_AWD_TR1_HIGH_REGOFFSET 0x00000000U +#define ADC_AWD_TR1_LOW_REGOFFSET 0x00000001U +#define ADC_AWD_TRX_REGOFFSET_MASK (ADC_AWD_TR1_HIGH_REGOFFSET | ADC_AWD_TR1_LOW_REGOFFSET) + +/* ADC registers bits positions */ +#define ADC_CR1_RES_BITOFFSET_POS (24U) /* Value equivalent to POSITION_VAL(ADC_CR1_RES) */ +#define ADC_TR_HT_BITOFFSET_POS (16U) /* Value equivalent to POSITION_VAL(ADC_TR_HT) */ +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup ADC_LL_Private_Macros ADC Private Macros + * @{ + */ + +/** + * @brief Driver macro reserved for internal use: isolate bits with the + * selected mask and shift them to the register LSB + * (shift mask on register position bit 0). + * @param __BITS__ Bits in register 32 bits + * @param __MASK__ Mask in register 32 bits + * @retval Bits in register 32 bits + */ +#define __ADC_MASK_SHIFT(__BITS__, __MASK__) \ + (((__BITS__) & (__MASK__)) >> POSITION_VAL((__MASK__))) + +/** + * @brief Driver macro reserved for internal use: set a pointer to + * a register from a register basis from which an offset + * is applied. + * @param __REG__ Register basis from which the offset is applied. + * @param __REG_OFFFSET__ Offset to be applied (unit: number of registers). + * @retval Pointer to register address + */ +#define __ADC_PTR_REG_OFFSET(__REG__, __REG_OFFFSET__) \ + ((uint32_t *)((uint32_t) ((uint32_t)(&(__REG__)) + ((__REG_OFFFSET__) << 2U)))) + +/** + * @} + */ + + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup ADC_LL_ES_INIT ADC Exported Init structure + * @{ + */ + +/** + * @brief Structure definition of some features of ADC common parameters + * and multimode + * (all ADC instances belonging to the same ADC common instance). + * @note The setting of these parameters by function @ref LL_ADC_CommonInit() + * is conditioned to ADC instances state (all ADC instances + * sharing the same ADC common instance): + * All ADC instances sharing the same ADC common instance must be + * disabled. + */ +typedef struct +{ + uint32_t CommonClock; /*!< Set parameter common to several ADC: Clock source and prescaler. + This parameter can be a value of @ref ADC_LL_EC_COMMON_CLOCK_SOURCE + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetCommonClock(). */ + +#if defined(ADC_MULTIMODE_SUPPORT) + uint32_t Multimode; /*!< Set ADC multimode configuration to operate in independent mode or multimode (for devices with several ADC instances). + This parameter can be a value of @ref ADC_LL_EC_MULTI_MODE + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultimode(). */ + + uint32_t MultiDMATransfer; /*!< Set ADC multimode conversion data transfer: no transfer or transfer by DMA. + This parameter can be a value of @ref ADC_LL_EC_MULTI_DMA_TRANSFER + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultiDMATransfer(). */ + + uint32_t MultiTwoSamplingDelay; /*!< Set ADC multimode delay between 2 sampling phases. + This parameter can be a value of @ref ADC_LL_EC_MULTI_TWOSMP_DELAY + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetMultiTwoSamplingDelay(). */ +#endif /* ADC_MULTIMODE_SUPPORT */ + +} LL_ADC_CommonInitTypeDef; + +/** + * @brief Structure definition of some features of ADC instance. + * @note These parameters have an impact on ADC scope: ADC instance. + * Affects both group regular and group injected (availability + * of ADC group injected depends on STM32 families). + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Instance . + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + */ +typedef struct +{ + uint32_t Resolution; /*!< Set ADC resolution. + This parameter can be a value of @ref ADC_LL_EC_RESOLUTION + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetResolution(). */ + + uint32_t DataAlignment; /*!< Set ADC conversion data alignment. + This parameter can be a value of @ref ADC_LL_EC_DATA_ALIGN + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetDataAlignment(). */ + + uint32_t SequencersScanMode; /*!< Set ADC scan selection. + This parameter can be a value of @ref ADC_LL_EC_SCAN_SELECTION + + This feature can be modified afterwards using unitary function @ref LL_ADC_SetSequencersScanMode(). */ + +} LL_ADC_InitTypeDef; + +/** + * @brief Structure definition of some features of ADC group regular. + * @note These parameters have an impact on ADC scope: ADC group regular. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Group_Regular + * (functions with prefix "REG"). + * @note The setting of these parameters by function @ref LL_ADC_REG_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + */ +typedef struct +{ + uint32_t TriggerSource; /*!< Set ADC group regular conversion trigger source: internal (SW start) or from external IP (timer event, external interrupt line). + This parameter can be a value of @ref ADC_LL_EC_REG_TRIGGER_SOURCE + @note On this STM32 serie, setting of external trigger edge is performed + using function @ref LL_ADC_REG_StartConversionExtTrig(). + + This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetTriggerSource(). */ + + uint32_t SequencerLength; /*!< Set ADC group regular sequencer length. + This parameter can be a value of @ref ADC_LL_EC_REG_SEQ_SCAN_LENGTH + @note This parameter is discarded if scan mode is disabled (refer to parameter 'ADC_SequencersScanMode'). + + This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetSequencerLength(). */ + + uint32_t SequencerDiscont; /*!< Set ADC group regular sequencer discontinuous mode: sequence subdivided and scan conversions interrupted every selected number of ranks. + This parameter can be a value of @ref ADC_LL_EC_REG_SEQ_DISCONT_MODE + @note This parameter has an effect only if group regular sequencer is enabled + (scan length of 2 ranks or more). + + This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetSequencerDiscont(). */ + + uint32_t ContinuousMode; /*!< Set ADC continuous conversion mode on ADC group regular, whether ADC conversions are performed in single mode (one conversion per trigger) or in continuous mode (after the first trigger, following conversions launched successively automatically). + This parameter can be a value of @ref ADC_LL_EC_REG_CONTINUOUS_MODE + Note: It is not possible to enable both ADC group regular continuous mode and discontinuous mode. + + This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetContinuousMode(). */ + + uint32_t DMATransfer; /*!< Set ADC group regular conversion data transfer: no transfer or transfer by DMA, and DMA requests mode. + This parameter can be a value of @ref ADC_LL_EC_REG_DMA_TRANSFER + + This feature can be modified afterwards using unitary function @ref LL_ADC_REG_SetDMATransfer(). */ + +} LL_ADC_REG_InitTypeDef; + +/** + * @brief Structure definition of some features of ADC group injected. + * @note These parameters have an impact on ADC scope: ADC group injected. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Group_Regular + * (functions with prefix "INJ"). + * @note The setting of these parameters by function @ref LL_ADC_INJ_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + */ +typedef struct +{ + uint32_t TriggerSource; /*!< Set ADC group injected conversion trigger source: internal (SW start) or from external IP (timer event, external interrupt line). + This parameter can be a value of @ref ADC_LL_EC_INJ_TRIGGER_SOURCE + @note On this STM32 serie, setting of external trigger edge is performed + using function @ref LL_ADC_INJ_StartConversionExtTrig(). + + This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetTriggerSource(). */ + + uint32_t SequencerLength; /*!< Set ADC group injected sequencer length. + This parameter can be a value of @ref ADC_LL_EC_INJ_SEQ_SCAN_LENGTH + @note This parameter is discarded if scan mode is disabled (refer to parameter 'ADC_SequencersScanMode'). + + This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetSequencerLength(). */ + + uint32_t SequencerDiscont; /*!< Set ADC group injected sequencer discontinuous mode: sequence subdivided and scan conversions interrupted every selected number of ranks. + This parameter can be a value of @ref ADC_LL_EC_INJ_SEQ_DISCONT_MODE + @note This parameter has an effect only if group injected sequencer is enabled + (scan length of 2 ranks or more). + + This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetSequencerDiscont(). */ + + uint32_t TrigAuto; /*!< Set ADC group injected conversion trigger: independent or from ADC group regular. + This parameter can be a value of @ref ADC_LL_EC_INJ_TRIG_AUTO + Note: This parameter must be set to set to independent trigger if injected trigger source is set to an external trigger. + + This feature can be modified afterwards using unitary function @ref LL_ADC_INJ_SetTrigAuto(). */ + +} LL_ADC_INJ_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup ADC_LL_Exported_Constants ADC Exported Constants + * @{ + */ + +/** @defgroup ADC_LL_EC_FLAG ADC flags + * @brief Flags defines which can be used with LL_ADC_ReadReg function + * @{ + */ +#define LL_ADC_FLAG_STRT ADC_SR_STRT /*!< ADC flag ADC group regular conversion start */ +#define LL_ADC_FLAG_EOCS ADC_SR_EOC /*!< ADC flag ADC group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ +#define LL_ADC_FLAG_OVR ADC_SR_OVR /*!< ADC flag ADC group regular overrun */ +#define LL_ADC_FLAG_JSTRT ADC_SR_JSTRT /*!< ADC flag ADC group injected conversion start */ +#define LL_ADC_FLAG_JEOS ADC_SR_JEOC /*!< ADC flag ADC group injected end of sequence conversions (Note: on this STM32 serie, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ +#define LL_ADC_FLAG_AWD1 ADC_SR_AWD /*!< ADC flag ADC analog watchdog 1 */ +#if defined(ADC_MULTIMODE_SUPPORT) +#define LL_ADC_FLAG_EOCS_MST ADC_CSR_EOC1 /*!< ADC flag ADC multimode master group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ +#define LL_ADC_FLAG_EOCS_SLV1 ADC_CSR_EOC2 /*!< ADC flag ADC multimode slave 1 group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ +#define LL_ADC_FLAG_EOCS_SLV2 ADC_CSR_EOC3 /*!< ADC flag ADC multimode slave 2 group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ +#define LL_ADC_FLAG_OVR_MST ADC_CSR_OVR1 /*!< ADC flag ADC multimode master group regular overrun */ +#define LL_ADC_FLAG_OVR_SLV1 ADC_CSR_OVR2 /*!< ADC flag ADC multimode slave 1 group regular overrun */ +#define LL_ADC_FLAG_OVR_SLV2 ADC_CSR_OVR3 /*!< ADC flag ADC multimode slave 2 group regular overrun */ +#define LL_ADC_FLAG_JEOS_MST ADC_CSR_JEOC1 /*!< ADC flag ADC multimode master group injected end of sequence conversions (Note: on this STM32 serie, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ +#define LL_ADC_FLAG_JEOS_SLV1 ADC_CSR_JEOC2 /*!< ADC flag ADC multimode slave 1 group injected end of sequence conversions (Note: on this STM32 serie, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ +#define LL_ADC_FLAG_JEOS_SLV2 ADC_CSR_JEOC3 /*!< ADC flag ADC multimode slave 2 group injected end of sequence conversions (Note: on this STM32 serie, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ +#define LL_ADC_FLAG_AWD1_MST ADC_CSR_AWD1 /*!< ADC flag ADC multimode master analog watchdog 1 of the ADC master */ +#define LL_ADC_FLAG_AWD1_SLV1 ADC_CSR_AWD2 /*!< ADC flag ADC multimode slave 1 analog watchdog 1 */ +#define LL_ADC_FLAG_AWD1_SLV2 ADC_CSR_AWD3 /*!< ADC flag ADC multimode slave 2 analog watchdog 1 */ +#endif +/** + * @} + */ + +/** @defgroup ADC_LL_EC_IT ADC interruptions for configuration (interruption enable or disable) + * @brief IT defines which can be used with LL_ADC_ReadReg and LL_ADC_WriteReg functions + * @{ + */ +#define LL_ADC_IT_EOCS ADC_CR1_EOCIE /*!< ADC interruption ADC group regular end of unitary conversion or sequence conversions (to configure flag of end of conversion, use function @ref LL_ADC_REG_SetFlagEndOfConversion() ) */ +#define LL_ADC_IT_OVR ADC_CR1_OVRIE /*!< ADC interruption ADC group regular overrun */ +#define LL_ADC_IT_JEOS ADC_CR1_JEOCIE /*!< ADC interruption ADC group injected end of sequence conversions (Note: on this STM32 serie, there is no flag ADC group injected end of unitary conversion. Flag noted as "JEOC" is corresponding to flag "JEOS" in other STM32 families) */ +#define LL_ADC_IT_AWD1 ADC_CR1_AWDIE /*!< ADC interruption ADC analog watchdog 1 */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REGISTERS ADC registers compliant with specific purpose + * @{ + */ +/* List of ADC registers intended to be used (most commonly) with */ +/* DMA transfer. */ +/* Refer to function @ref LL_ADC_DMA_GetRegAddr(). */ +#define LL_ADC_DMA_REG_REGULAR_DATA 0x00000000U /* ADC group regular conversion data register (corresponding to register DR) to be used with ADC configured in independent mode. Without DMA transfer, register accessed by LL function @ref LL_ADC_REG_ReadConversionData32() and other functions @ref LL_ADC_REG_ReadConversionDatax() */ +#if defined(ADC_MULTIMODE_SUPPORT) +#define LL_ADC_DMA_REG_REGULAR_DATA_MULTI 0x00000001U /* ADC group regular conversion data register (corresponding to register CDR) to be used with ADC configured in multimode (available on STM32 devices with several ADC instances). Without DMA transfer, register accessed by LL function @ref LL_ADC_REG_ReadMultiConversionData32() */ +#endif +/** + * @} + */ + +/** @defgroup ADC_LL_EC_COMMON_CLOCK_SOURCE ADC common - Clock source + * @{ + */ +#define LL_ADC_CLOCK_SYNC_PCLK_DIV2 0x00000000U /*!< ADC synchronous clock derived from AHB clock with prescaler division by 2 */ +#define LL_ADC_CLOCK_SYNC_PCLK_DIV4 ( ADC_CCR_ADCPRE_0) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 4 */ +#define LL_ADC_CLOCK_SYNC_PCLK_DIV6 (ADC_CCR_ADCPRE_1 ) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 6 */ +#define LL_ADC_CLOCK_SYNC_PCLK_DIV8 (ADC_CCR_ADCPRE_1 | ADC_CCR_ADCPRE_0) /*!< ADC synchronous clock derived from AHB clock with prescaler division by 8 */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_COMMON_PATH_INTERNAL ADC common - Measurement path to internal channels + * @{ + */ +/* Note: Other measurement paths to internal channels may be available */ +/* (connections to other peripherals). */ +/* If they are not listed below, they do not require any specific */ +/* path enable. In this case, Access to measurement path is done */ +/* only by selecting the corresponding ADC internal channel. */ +#define LL_ADC_PATH_INTERNAL_NONE 0x00000000U /*!< ADC measurement pathes all disabled */ +#define LL_ADC_PATH_INTERNAL_VREFINT (ADC_CCR_TSVREFE) /*!< ADC measurement path to internal channel VrefInt */ +#define LL_ADC_PATH_INTERNAL_TEMPSENSOR (ADC_CCR_TSVREFE) /*!< ADC measurement path to internal channel temperature sensor */ +#define LL_ADC_PATH_INTERNAL_VBAT (ADC_CCR_VBATE) /*!< ADC measurement path to internal channel Vbat */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_RESOLUTION ADC instance - Resolution + * @{ + */ +#define LL_ADC_RESOLUTION_12B 0x00000000U /*!< ADC resolution 12 bits */ +#define LL_ADC_RESOLUTION_10B ( ADC_CR1_RES_0) /*!< ADC resolution 10 bits */ +#define LL_ADC_RESOLUTION_8B (ADC_CR1_RES_1 ) /*!< ADC resolution 8 bits */ +#define LL_ADC_RESOLUTION_6B (ADC_CR1_RES_1 | ADC_CR1_RES_0) /*!< ADC resolution 6 bits */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_DATA_ALIGN ADC instance - Data alignment + * @{ + */ +#define LL_ADC_DATA_ALIGN_RIGHT 0x00000000U /*!< ADC conversion data alignment: right aligned (alignment on data register LSB bit 0)*/ +#define LL_ADC_DATA_ALIGN_LEFT (ADC_CR2_ALIGN) /*!< ADC conversion data alignment: left aligned (aligment on data register MSB bit 15)*/ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_SCAN_SELECTION ADC instance - Scan selection + * @{ + */ +#define LL_ADC_SEQ_SCAN_DISABLE 0x00000000U /*!< ADC conversion is performed in unitary conversion mode (one channel converted, that defined in rank 1). Configuration of both groups regular and injected sequencers (sequence length, ...) is discarded: equivalent to length of 1 rank.*/ +#define LL_ADC_SEQ_SCAN_ENABLE (ADC_CR1_SCAN) /*!< ADC conversions are performed in sequence conversions mode, according to configuration of both groups regular and injected sequencers (sequence length, ...). */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_GROUPS ADC instance - Groups + * @{ + */ +#define LL_ADC_GROUP_REGULAR 0x00000001U /*!< ADC group regular (available on all STM32 devices) */ +#define LL_ADC_GROUP_INJECTED 0x00000002U /*!< ADC group injected (not available on all STM32 devices)*/ +#define LL_ADC_GROUP_REGULAR_INJECTED 0x00000003U /*!< ADC both groups regular and injected */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_CHANNEL ADC instance - Channel number + * @{ + */ +#define LL_ADC_CHANNEL_0 (ADC_CHANNEL_0_NUMBER | ADC_CHANNEL_0_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN0 */ +#define LL_ADC_CHANNEL_1 (ADC_CHANNEL_1_NUMBER | ADC_CHANNEL_1_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN1 */ +#define LL_ADC_CHANNEL_2 (ADC_CHANNEL_2_NUMBER | ADC_CHANNEL_2_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN2 */ +#define LL_ADC_CHANNEL_3 (ADC_CHANNEL_3_NUMBER | ADC_CHANNEL_3_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN3 */ +#define LL_ADC_CHANNEL_4 (ADC_CHANNEL_4_NUMBER | ADC_CHANNEL_4_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN4 */ +#define LL_ADC_CHANNEL_5 (ADC_CHANNEL_5_NUMBER | ADC_CHANNEL_5_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN5 */ +#define LL_ADC_CHANNEL_6 (ADC_CHANNEL_6_NUMBER | ADC_CHANNEL_6_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN6 */ +#define LL_ADC_CHANNEL_7 (ADC_CHANNEL_7_NUMBER | ADC_CHANNEL_7_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN7 */ +#define LL_ADC_CHANNEL_8 (ADC_CHANNEL_8_NUMBER | ADC_CHANNEL_8_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN8 */ +#define LL_ADC_CHANNEL_9 (ADC_CHANNEL_9_NUMBER | ADC_CHANNEL_9_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN9 */ +#define LL_ADC_CHANNEL_10 (ADC_CHANNEL_10_NUMBER | ADC_CHANNEL_10_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN10 */ +#define LL_ADC_CHANNEL_11 (ADC_CHANNEL_11_NUMBER | ADC_CHANNEL_11_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN11 */ +#define LL_ADC_CHANNEL_12 (ADC_CHANNEL_12_NUMBER | ADC_CHANNEL_12_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN12 */ +#define LL_ADC_CHANNEL_13 (ADC_CHANNEL_13_NUMBER | ADC_CHANNEL_13_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN13 */ +#define LL_ADC_CHANNEL_14 (ADC_CHANNEL_14_NUMBER | ADC_CHANNEL_14_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN14 */ +#define LL_ADC_CHANNEL_15 (ADC_CHANNEL_15_NUMBER | ADC_CHANNEL_15_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN15 */ +#define LL_ADC_CHANNEL_16 (ADC_CHANNEL_16_NUMBER | ADC_CHANNEL_16_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN16 */ +#define LL_ADC_CHANNEL_17 (ADC_CHANNEL_17_NUMBER | ADC_CHANNEL_17_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN17 */ +#define LL_ADC_CHANNEL_18 (ADC_CHANNEL_18_NUMBER | ADC_CHANNEL_18_SMP) /*!< ADC external channel (channel connected to GPIO pin) ADCx_IN18 */ +#define LL_ADC_CHANNEL_VREFINT (LL_ADC_CHANNEL_17 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to VrefInt: Internal voltage reference. On STM32F4, ADC channel available only on ADC instance: ADC1. */ +#define LL_ADC_CHANNEL_VBAT (LL_ADC_CHANNEL_18 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda. On STM32F4, ADC channel available only on ADC instance: ADC1. */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define LL_ADC_CHANNEL_TEMPSENSOR (LL_ADC_CHANNEL_16 | ADC_CHANNEL_ID_INTERNAL_CH) /*!< ADC internal channel connected to Temperature sensor. On STM32F4, ADC channel available only on ADC instance: ADC1. */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F411xE) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define LL_ADC_CHANNEL_TEMPSENSOR (LL_ADC_CHANNEL_18 | ADC_CHANNEL_ID_INTERNAL_CH | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) /*!< ADC internal channel connected to Temperature sensor. On STM32F4, ADC channel available only on ADC instance: ADC1. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F411xE || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_TRIGGER_SOURCE ADC group regular - Trigger source + * @{ + */ +#define LL_ADC_REG_TRIG_SOFTWARE 0x00000000U /*!< ADC group regular conversion trigger internal: SW start. */ +#define LL_ADC_REG_TRIG_EXT_TIM1_CH1 (ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM1_CH2 (ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM1_CH3 (ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM1 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM2_CH2 (ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM2_CH3 (ADC_CR2_EXTSEL_2 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM2_CH4 (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM2_TRGO (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM2 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM3_CH1 (ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM3 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM3_TRGO (ADC_CR2_EXTSEL_3 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM3 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM4_CH4 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM4 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM5_CH1 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM5_CH2 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM5_CH3 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM5 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM8_CH1 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM8 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_TIM8_TRGO (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: TIM8 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_REG_TRIG_EXT_EXTI_LINE11 (ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0 | ADC_REG_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group regular conversion trigger from external IP: external interrupt line 11. Trigger edge set to rising edge (default setting). */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_TRIGGER_EDGE ADC group regular - Trigger edge + * @{ + */ +#define LL_ADC_REG_TRIG_EXT_RISING ( ADC_CR2_EXTEN_0) /*!< ADC group regular conversion trigger polarity set to rising edge */ +#define LL_ADC_REG_TRIG_EXT_FALLING (ADC_CR2_EXTEN_1 ) /*!< ADC group regular conversion trigger polarity set to falling edge */ +#define LL_ADC_REG_TRIG_EXT_RISINGFALLING (ADC_CR2_EXTEN_1 | ADC_CR2_EXTEN_0) /*!< ADC group regular conversion trigger polarity set to both rising and falling edges */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_CONTINUOUS_MODE ADC group regular - Continuous mode +* @{ +*/ +#define LL_ADC_REG_CONV_SINGLE 0x00000000U /*!< ADC conversions are performed in single mode: one conversion per trigger */ +#define LL_ADC_REG_CONV_CONTINUOUS (ADC_CR2_CONT) /*!< ADC conversions are performed in continuous mode: after the first trigger, following conversions launched successively automatically */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_DMA_TRANSFER ADC group regular - DMA transfer of ADC conversion data + * @{ + */ +#define LL_ADC_REG_DMA_TRANSFER_NONE 0x00000000U /*!< ADC conversions are not transferred by DMA */ +#define LL_ADC_REG_DMA_TRANSFER_LIMITED ( ADC_CR2_DMA) /*!< ADC conversion data are transferred by DMA, in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. */ +#define LL_ADC_REG_DMA_TRANSFER_UNLIMITED (ADC_CR2_DDS | ADC_CR2_DMA) /*!< ADC conversion data are transferred by DMA, in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions). This ADC mode is intended to be used with DMA mode circular. */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_FLAG_EOC_SELECTION ADC group regular - Flag EOC selection (unitary or sequence conversions) + * @{ + */ +#define LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV 0x00000000U /*!< ADC flag EOC (end of unitary conversion) selected */ +#define LL_ADC_REG_FLAG_EOC_UNITARY_CONV (ADC_CR2_EOCS) /*!< ADC flag EOS (end of sequence conversions) selected */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_SEQ_SCAN_LENGTH ADC group regular - Sequencer scan length + * @{ + */ +#define LL_ADC_REG_SEQ_SCAN_DISABLE 0x00000000U /*!< ADC group regular sequencer disable (equivalent to sequencer of 1 rank: ADC conversion on only 1 channel) */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS ( ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 2 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS ( ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 3 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS ( ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 4 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS ( ADC_SQR1_L_2 ) /*!< ADC group regular sequencer enable with 5 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 6 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 7 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS ( ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 8 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS (ADC_SQR1_L_3 ) /*!< ADC group regular sequencer enable with 9 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 10 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 11 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 12 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 ) /*!< ADC group regular sequencer enable with 13 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 14 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_1 ) /*!< ADC group regular sequencer enable with 15 ranks in the sequence */ +#define LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS (ADC_SQR1_L_3 | ADC_SQR1_L_2 | ADC_SQR1_L_1 | ADC_SQR1_L_0) /*!< ADC group regular sequencer enable with 16 ranks in the sequence */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_SEQ_DISCONT_MODE ADC group regular - Sequencer discontinuous mode + * @{ + */ +#define LL_ADC_REG_SEQ_DISCONT_DISABLE 0x00000000U /*!< ADC group regular sequencer discontinuous mode disable */ +#define LL_ADC_REG_SEQ_DISCONT_1RANK ( ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every rank */ +#define LL_ADC_REG_SEQ_DISCONT_2RANKS ( ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enabled with sequence interruption every 2 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_3RANKS ( ADC_CR1_DISCNUM_1 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 3 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_4RANKS ( ADC_CR1_DISCNUM_1 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 4 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_5RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 5 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_6RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 6 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_7RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_1 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 7 ranks */ +#define LL_ADC_REG_SEQ_DISCONT_8RANKS (ADC_CR1_DISCNUM_2 | ADC_CR1_DISCNUM_1 | ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN) /*!< ADC group regular sequencer discontinuous mode enable with sequence interruption every 8 ranks */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_REG_SEQ_RANKS ADC group regular - Sequencer ranks + * @{ + */ +#define LL_ADC_REG_RANK_1 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_1_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 1 */ +#define LL_ADC_REG_RANK_2 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_2_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 2 */ +#define LL_ADC_REG_RANK_3 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_3_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 3 */ +#define LL_ADC_REG_RANK_4 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_4_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 4 */ +#define LL_ADC_REG_RANK_5 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_5_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 5 */ +#define LL_ADC_REG_RANK_6 (ADC_SQR3_REGOFFSET | ADC_REG_RANK_6_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 6 */ +#define LL_ADC_REG_RANK_7 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_7_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 7 */ +#define LL_ADC_REG_RANK_8 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_8_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 8 */ +#define LL_ADC_REG_RANK_9 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_9_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 9 */ +#define LL_ADC_REG_RANK_10 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_10_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 10 */ +#define LL_ADC_REG_RANK_11 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_11_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 11 */ +#define LL_ADC_REG_RANK_12 (ADC_SQR2_REGOFFSET | ADC_REG_RANK_12_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 12 */ +#define LL_ADC_REG_RANK_13 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_13_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 13 */ +#define LL_ADC_REG_RANK_14 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_14_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 14 */ +#define LL_ADC_REG_RANK_15 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_15_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 15 */ +#define LL_ADC_REG_RANK_16 (ADC_SQR1_REGOFFSET | ADC_REG_RANK_16_SQRX_BITOFFSET_POS) /*!< ADC group regular sequencer rank 16 */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_INJ_TRIGGER_SOURCE ADC group injected - Trigger source + * @{ + */ +#define LL_ADC_INJ_TRIG_SOFTWARE 0x00000000U /*!< ADC group injected conversion trigger internal: SW start. */ +#define LL_ADC_INJ_TRIG_EXT_TIM1_CH4 (ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM1 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM1_TRGO (ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM1 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM2_CH1 (ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM2 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM2_TRGO (ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM2 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM3_CH2 (ADC_CR2_JEXTSEL_2 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM3 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM3_CH4 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM3 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM4_CH1 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 1 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM4_CH2 (ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM4_CH3 (ADC_CR2_JEXTSEL_3 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM4_TRGO (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM4 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM5_CH4 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM5 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM5_TRGO (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM5 TRGO. Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM8_CH2 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 2 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM8_CH3 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 3 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_TIM8_CH4 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: TIM8 channel 4 event (capture compare: input capture or output capture). Trigger edge set to rising edge (default setting). */ +#define LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 (ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_2 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_0 | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) /*!< ADC group injected conversion trigger from external IP: external interrupt line 15. Trigger edge set to rising edge (default setting). */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_INJ_TRIGGER_EDGE ADC group injected - Trigger edge + * @{ + */ +#define LL_ADC_INJ_TRIG_EXT_RISING ( ADC_CR2_JEXTEN_0) /*!< ADC group injected conversion trigger polarity set to rising edge */ +#define LL_ADC_INJ_TRIG_EXT_FALLING (ADC_CR2_JEXTEN_1 ) /*!< ADC group injected conversion trigger polarity set to falling edge */ +#define LL_ADC_INJ_TRIG_EXT_RISINGFALLING (ADC_CR2_JEXTEN_1 | ADC_CR2_JEXTEN_0) /*!< ADC group injected conversion trigger polarity set to both rising and falling edges */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_INJ_TRIG_AUTO ADC group injected - Automatic trigger mode +* @{ +*/ +#define LL_ADC_INJ_TRIG_INDEPENDENT 0x00000000U /*!< ADC group injected conversion trigger independent. Setting mandatory if ADC group injected injected trigger source is set to an external trigger. */ +#define LL_ADC_INJ_TRIG_FROM_GRP_REGULAR (ADC_CR1_JAUTO) /*!< ADC group injected conversion trigger from ADC group regular. Setting compliant only with group injected trigger source set to SW start, without any further action on ADC group injected conversion start or stop: in this case, ADC group injected is controlled only from ADC group regular. */ +/** + * @} + */ + + +/** @defgroup ADC_LL_EC_INJ_SEQ_SCAN_LENGTH ADC group injected - Sequencer scan length + * @{ + */ +#define LL_ADC_INJ_SEQ_SCAN_DISABLE 0x00000000U /*!< ADC group injected sequencer disable (equivalent to sequencer of 1 rank: ADC conversion on only 1 channel) */ +#define LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS ( ADC_JSQR_JL_0) /*!< ADC group injected sequencer enable with 2 ranks in the sequence */ +#define LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS (ADC_JSQR_JL_1 ) /*!< ADC group injected sequencer enable with 3 ranks in the sequence */ +#define LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS (ADC_JSQR_JL_1 | ADC_JSQR_JL_0) /*!< ADC group injected sequencer enable with 4 ranks in the sequence */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_INJ_SEQ_DISCONT_MODE ADC group injected - Sequencer discontinuous mode + * @{ + */ +#define LL_ADC_INJ_SEQ_DISCONT_DISABLE 0x00000000U /*!< ADC group injected sequencer discontinuous mode disable */ +#define LL_ADC_INJ_SEQ_DISCONT_1RANK (ADC_CR1_JDISCEN) /*!< ADC group injected sequencer discontinuous mode enable with sequence interruption every rank */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_INJ_SEQ_RANKS ADC group injected - Sequencer ranks + * @{ + */ +#define LL_ADC_INJ_RANK_1 (ADC_JDR1_REGOFFSET | ADC_JOFR1_REGOFFSET | 0x00000001U) /*!< ADC group injected sequencer rank 1 */ +#define LL_ADC_INJ_RANK_2 (ADC_JDR2_REGOFFSET | ADC_JOFR2_REGOFFSET | 0x00000002U) /*!< ADC group injected sequencer rank 2 */ +#define LL_ADC_INJ_RANK_3 (ADC_JDR3_REGOFFSET | ADC_JOFR3_REGOFFSET | 0x00000003U) /*!< ADC group injected sequencer rank 3 */ +#define LL_ADC_INJ_RANK_4 (ADC_JDR4_REGOFFSET | ADC_JOFR4_REGOFFSET | 0x00000004U) /*!< ADC group injected sequencer rank 4 */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_CHANNEL_SAMPLINGTIME Channel - Sampling time + * @{ + */ +#define LL_ADC_SAMPLINGTIME_3CYCLES 0x00000000U /*!< Sampling time 3 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_15CYCLES (ADC_SMPR1_SMP10_0) /*!< Sampling time 15 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_28CYCLES (ADC_SMPR1_SMP10_1) /*!< Sampling time 28 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_56CYCLES (ADC_SMPR1_SMP10_1 | ADC_SMPR1_SMP10_0) /*!< Sampling time 56 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_84CYCLES (ADC_SMPR1_SMP10_2) /*!< Sampling time 84 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_112CYCLES (ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_0) /*!< Sampling time 112 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_144CYCLES (ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_1) /*!< Sampling time 144 ADC clock cycles */ +#define LL_ADC_SAMPLINGTIME_480CYCLES (ADC_SMPR1_SMP10) /*!< Sampling time 480 ADC clock cycles */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_AWD_NUMBER Analog watchdog - Analog watchdog number + * @{ + */ +#define LL_ADC_AWD1 (ADC_AWD_CR1_CHANNEL_MASK | ADC_AWD_CR1_REGOFFSET) /*!< ADC analog watchdog number 1 */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_AWD_CHANNELS Analog watchdog - Monitored channels + * @{ + */ +#define LL_ADC_AWD_DISABLE 0x00000000U /*!< ADC analog watchdog monitoring disabled */ +#define LL_ADC_AWD_ALL_CHANNELS_REG ( ADC_CR1_AWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by group regular only */ +#define LL_ADC_AWD_ALL_CHANNELS_INJ ( ADC_CR1_JAWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by group injected only */ +#define LL_ADC_AWD_ALL_CHANNELS_REG_INJ ( ADC_CR1_JAWDEN | ADC_CR1_AWDEN ) /*!< ADC analog watchdog monitoring of all channels, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_0_REG ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_0_INJ ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_0_REG_INJ ((LL_ADC_CHANNEL_0 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN0, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_1_REG ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_1_INJ ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_1_REG_INJ ((LL_ADC_CHANNEL_1 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN1, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_2_REG ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_2_INJ ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_2_REG_INJ ((LL_ADC_CHANNEL_2 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN2, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_3_REG ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_3_INJ ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_3_REG_INJ ((LL_ADC_CHANNEL_3 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN3, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_4_REG ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_4_INJ ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_4_REG_INJ ((LL_ADC_CHANNEL_4 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN4, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_5_REG ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_5_INJ ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_5_REG_INJ ((LL_ADC_CHANNEL_5 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN5, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_6_REG ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_6_INJ ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_6_REG_INJ ((LL_ADC_CHANNEL_6 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN6, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_7_REG ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_7_INJ ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_7_REG_INJ ((LL_ADC_CHANNEL_7 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN7, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_8_REG ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_8_INJ ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_8_REG_INJ ((LL_ADC_CHANNEL_8 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN8, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_9_REG ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_9_INJ ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_9_REG_INJ ((LL_ADC_CHANNEL_9 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN9, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_10_REG ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_10_INJ ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_10_REG_INJ ((LL_ADC_CHANNEL_10 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN10, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_11_REG ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_11_INJ ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_11_REG_INJ ((LL_ADC_CHANNEL_11 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN11, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_12_REG ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_12_INJ ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_12_REG_INJ ((LL_ADC_CHANNEL_12 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN12, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_13_REG ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_13_INJ ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_13_REG_INJ ((LL_ADC_CHANNEL_13 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN13, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_14_REG ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_14_INJ ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_14_REG_INJ ((LL_ADC_CHANNEL_14 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN14, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_15_REG ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_15_INJ ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_15_REG_INJ ((LL_ADC_CHANNEL_15 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN15, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_16_REG ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_16_INJ ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_16_REG_INJ ((LL_ADC_CHANNEL_16 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN16, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_17_REG ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_17_INJ ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_17_REG_INJ ((LL_ADC_CHANNEL_17 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN17, converted by either group regular or injected */ +#define LL_ADC_AWD_CHANNEL_18_REG ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by group regular only */ +#define LL_ADC_AWD_CHANNEL_18_INJ ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by group injected only */ +#define LL_ADC_AWD_CHANNEL_18_REG_INJ ((LL_ADC_CHANNEL_18 & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC external channel (channel connected to GPIO pin) ADCx_IN18, converted by either group regular or injected */ +#define LL_ADC_AWD_CH_VREFINT_REG ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by group regular only */ +#define LL_ADC_AWD_CH_VREFINT_INJ ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by group injected only */ +#define LL_ADC_AWD_CH_VREFINT_REG_INJ ((LL_ADC_CHANNEL_VREFINT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to VrefInt: Internal voltage reference, converted by either group regular or injected */ +#define LL_ADC_AWD_CH_VBAT_REG ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda, converted by group regular only */ +#define LL_ADC_AWD_CH_VBAT_INJ ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda, converted by group injected only */ +#define LL_ADC_AWD_CH_VBAT_REG_INJ ((LL_ADC_CHANNEL_VBAT & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Vbat/3: Vbat voltage through a divider ladder of factor 1/3 to have Vbat always below Vdda */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define LL_ADC_AWD_CH_TEMPSENSOR_REG ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group regular only */ +#define LL_ADC_AWD_CH_TEMPSENSOR_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group injected only */ +#define LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by either group regular or injected */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx */ +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F411xE) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define LL_ADC_AWD_CH_TEMPSENSOR_REG ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group regular only. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ +#define LL_ADC_AWD_CH_TEMPSENSOR_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by group injected only. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ +#define LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ ((LL_ADC_CHANNEL_TEMPSENSOR & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) /*!< ADC analog watchdog monitoring of ADC internal channel connected to Temperature sensor, converted by either group regular or injected. This internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. */ +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F411xE || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_AWD_THRESHOLDS Analog watchdog - Thresholds + * @{ + */ +#define LL_ADC_AWD_THRESHOLD_HIGH (ADC_AWD_TR1_HIGH_REGOFFSET) /*!< ADC analog watchdog threshold high */ +#define LL_ADC_AWD_THRESHOLD_LOW (ADC_AWD_TR1_LOW_REGOFFSET) /*!< ADC analog watchdog threshold low */ +/** + * @} + */ + +#if defined(ADC_MULTIMODE_SUPPORT) +/** @defgroup ADC_LL_EC_MULTI_MODE Multimode - Mode + * @{ + */ +#define LL_ADC_MULTI_INDEPENDENT 0x00000000U /*!< ADC dual mode disabled (ADC independent mode) */ +#define LL_ADC_MULTI_DUAL_REG_SIMULT ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 ) /*!< ADC dual mode enabled: group regular simultaneous */ +#define LL_ADC_MULTI_DUAL_REG_INTERL ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular interleaved */ +#define LL_ADC_MULTI_DUAL_INJ_SIMULT ( ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: group injected simultaneous */ +#define LL_ADC_MULTI_DUAL_INJ_ALTERN (ADC_CCR_MULTI_3 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: group injected alternate trigger. Works only with external triggers (not internal SW start) */ +#define LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM ( ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected simultaneous */ +#define LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT ( ADC_CCR_MULTI_1 ) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected alternate trigger */ +#define LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM ( ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC dual mode enabled: Combined group regular interleaved + group injected simultaneous */ +#if defined(ADC3) +#define LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: Combined group regular simultaneous + group injected simultaneous */ +#define LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_1 ) /*!< ADC triple mode enabled: Combined group regular simultaneous + group injected alternate trigger */ +#define LL_ADC_MULTI_TRIPLE_INJ_SIMULT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: group injected simultaneous */ +#define LL_ADC_MULTI_TRIPLE_REG_SIMULT (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 ) /*!< ADC triple mode enabled: group regular simultaneous */ +#define LL_ADC_MULTI_TRIPLE_REG_INTERL (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_2 | ADC_CCR_MULTI_1 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: Combined group regular interleaved */ +#define LL_ADC_MULTI_TRIPLE_INJ_ALTERN (ADC_CCR_MULTI_4 | ADC_CCR_MULTI_0) /*!< ADC triple mode enabled: group injected alternate trigger. Works only with external triggers (not internal SW start) */ +#endif +/** + * @} + */ + +/** @defgroup ADC_LL_EC_MULTI_DMA_TRANSFER Multimode - DMA transfer + * @{ + */ +#define LL_ADC_MULTI_REG_DMA_EACH_ADC 0x00000000U /*!< ADC multimode group regular conversions are transferred by DMA: each ADC uses its own DMA channel, with its individual DMA transfer settings */ +#define LL_ADC_MULTI_REG_DMA_LIMIT_1 ( ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 1: 2 or 3 (dual or triple mode) half-words one by one, ADC1 then ADC2 then ADC3. */ +#define LL_ADC_MULTI_REG_DMA_LIMIT_2 ( ADC_CCR_DMA_1 ) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 2: 2 or 3 (dual or triple mode) half-words one by one, ADC2&1 then ADC1&3 then ADC3&2. */ +#define LL_ADC_MULTI_REG_DMA_LIMIT_3 ( ADC_CCR_DMA_0 | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in limited mode (one shot mode): DMA transfer requests are stopped when number of DMA data transfers (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 3: 2 or 3 (dual or triple mode) bytes one by one, ADC2&1 then ADC1&3 then ADC3&2. */ +#define LL_ADC_MULTI_REG_DMA_UNLMT_1 (ADC_CCR_DDS | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 1: 2 or 3 (dual or triple mode) half-words one by one, ADC1 then ADC2 then ADC3. */ +#define LL_ADC_MULTI_REG_DMA_UNLMT_2 (ADC_CCR_DDS | ADC_CCR_DMA_1 ) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 2: 2 or 3 (dual or triple mode) half-words by pairs, ADC2&1 then ADC1&3 then ADC3&2. */ +#define LL_ADC_MULTI_REG_DMA_UNLMT_3 (ADC_CCR_DDS | ADC_CCR_DMA_0 | ADC_CCR_DMA_0) /*!< ADC multimode group regular conversions are transferred by DMA, one DMA channel for all ADC instances (DMA of ADC master), in unlimited mode: DMA transfer requests are unlimited, whatever number of DMA data transferred (number of ADC conversions) is reached. This ADC mode is intended to be used with DMA mode non-circular. Setting of DMA mode 3: 2 or 3 (dual or triple mode) bytes one by one, ADC2&1 then ADC1&3 then ADC3&2. */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_MULTI_TWOSMP_DELAY Multimode - Delay between two sampling phases + * @{ + */ +#define LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES 0x00000000U /*!< ADC multimode delay between two sampling phases: 5 ADC clock cycles*/ +#define LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES ( ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 6 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES ( ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 7 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES ( ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 8 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES ( ADC_CCR_DELAY_2 ) /*!< ADC multimode delay between two sampling phases: 9 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 10 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 11 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES ( ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 12 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES (ADC_CCR_DELAY_3 ) /*!< ADC multimode delay between two sampling phases: 13 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 14 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 15 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 16 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 ) /*!< ADC multimode delay between two sampling phases: 17 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 18 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 ) /*!< ADC multimode delay between two sampling phases: 19 ADC clock cycles */ +#define LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES (ADC_CCR_DELAY_3 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_0) /*!< ADC multimode delay between two sampling phases: 20 ADC clock cycles */ +/** + * @} + */ + +/** @defgroup ADC_LL_EC_MULTI_MASTER_SLAVE Multimode - ADC master or slave + * @{ + */ +#define LL_ADC_MULTI_MASTER ( ADC_CDR_RDATA_MST) /*!< In multimode, selection among several ADC instances: ADC master */ +#define LL_ADC_MULTI_SLAVE (ADC_CDR_RDATA_SLV ) /*!< In multimode, selection among several ADC instances: ADC slave */ +#define LL_ADC_MULTI_MASTER_SLAVE (ADC_CDR_RDATA_SLV | ADC_CDR_RDATA_MST) /*!< In multimode, selection among several ADC instances: both ADC master and ADC slave */ +/** + * @} + */ + +#endif /* ADC_MULTIMODE_SUPPORT */ + + +/** @defgroup ADC_LL_EC_HW_DELAYS Definitions of ADC hardware constraints delays + * @note Only ADC IP HW delays are defined in ADC LL driver driver, + * not timeout values. + * For details on delays values, refer to descriptions in source code + * above each literal definition. + * @{ + */ + +/* Note: Only ADC IP HW delays are defined in ADC LL driver driver, */ +/* not timeout values. */ +/* Timeout values for ADC operations are dependent to device clock */ +/* configuration (system clock versus ADC clock), */ +/* and therefore must be defined in user application. */ +/* Indications for estimation of ADC timeout delays, for this */ +/* STM32 serie: */ +/* - ADC enable time: maximum delay is 2us */ +/* (refer to device datasheet, parameter "tSTAB") */ +/* - ADC conversion time: duration depending on ADC clock and ADC */ +/* configuration. */ +/* (refer to device reference manual, section "Timing") */ + +/* Delay for internal voltage reference stabilization time. */ +/* Delay set to maximum value (refer to device datasheet, */ +/* parameter "tSTART"). */ +/* Unit: us */ +#define LL_ADC_DELAY_VREFINT_STAB_US ( 10U) /*!< Delay for internal voltage reference stabilization time */ + +/* Delay for temperature sensor stabilization time. */ +/* Literal set to maximum value (refer to device datasheet, */ +/* parameter "tSTART"). */ +/* Unit: us */ +#define LL_ADC_DELAY_TEMPSENSOR_STAB_US ( 10U) /*!< Delay for internal voltage reference stabilization time */ + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup ADC_LL_Exported_Macros ADC Exported Macros + * @{ + */ + +/** @defgroup ADC_LL_EM_WRITE_READ Common write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in ADC register + * @param __INSTANCE__ ADC Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_ADC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in ADC register + * @param __INSTANCE__ ADC Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_ADC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup ADC_LL_EM_HELPER_MACRO ADC helper macro + * @{ + */ + +/** + * @brief Helper macro to get ADC channel number in decimal format + * from literals LL_ADC_CHANNEL_x. + * @note Example: + * __LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_4) + * will return decimal number "4". + * @note The input can be a value from functions where a channel + * number is returned, either defined with number + * or with bitfield (only one bit must be set). + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval Value between Min_Data=0 and Max_Data=18 + */ +#define __LL_ADC_CHANNEL_TO_DECIMAL_NB(__CHANNEL__) \ + (((__CHANNEL__) & ADC_CHANNEL_ID_NUMBER_MASK) >> ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) + +/** + * @brief Helper macro to get ADC channel in literal format LL_ADC_CHANNEL_x + * from number in decimal format. + * @note Example: + * __LL_ADC_DECIMAL_NB_TO_CHANNEL(4) + * will return a data equivalent to "LL_ADC_CHANNEL_4". + * @param __DECIMAL_NB__: Value between Min_Data=0 and Max_Data=18 + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n + * (1) For ADC channel read back from ADC register, + * comparison with internal channel parameter to be done + * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). + */ +#define __LL_ADC_DECIMAL_NB_TO_CHANNEL(__DECIMAL_NB__) \ + (((__DECIMAL_NB__) <= 9U) \ + ? ( \ + ((__DECIMAL_NB__) << ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) | \ + (ADC_SMPR2_REGOFFSET | (((uint32_t) (3U * (__DECIMAL_NB__))) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) \ + ) \ + : \ + ( \ + ((__DECIMAL_NB__) << ADC_CHANNEL_ID_NUMBER_BITOFFSET_POS) | \ + (ADC_SMPR1_REGOFFSET | (((uint32_t) (3U * ((__DECIMAL_NB__) - 10U))) << ADC_CHANNEL_SMPx_BITOFFSET_POS)) \ + ) \ + ) + +/** + * @brief Helper macro to determine whether the selected channel + * corresponds to literal definitions of driver. + * @note The different literal definitions of ADC channels are: + * - ADC internal channel: + * LL_ADC_CHANNEL_VREFINT, LL_ADC_CHANNEL_TEMPSENSOR, ... + * - ADC external channel (channel connected to a GPIO pin): + * LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ... + * @note The channel parameter must be a value defined from literal + * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, + * LL_ADC_CHANNEL_TEMPSENSOR, ...), + * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...), + * must not be a value from functions where a channel number is + * returned from ADC registers, + * because internal and external channels share the same channel + * number in ADC registers. The differentiation is made only with + * parameters definitions of driver. + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval Value "0" if the channel corresponds to a parameter definition of a ADC external channel (channel connected to a GPIO pin). + * Value "1" if the channel corresponds to a parameter definition of a ADC internal channel. + */ +#define __LL_ADC_IS_CHANNEL_INTERNAL(__CHANNEL__) \ + (((__CHANNEL__) & ADC_CHANNEL_ID_INTERNAL_CH_MASK) != 0U) + +/** + * @brief Helper macro to convert a channel defined from parameter + * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, + * LL_ADC_CHANNEL_TEMPSENSOR, ...), + * to its equivalent parameter definition of a ADC external channel + * (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...). + * @note The channel parameter can be, additionally to a value + * defined from parameter definition of a ADC internal channel + * (LL_ADC_CHANNEL_VREFINT, LL_ADC_CHANNEL_TEMPSENSOR, ...), + * a value defined from parameter definition of + * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...) + * or a value from functions where a channel number is returned + * from ADC registers. + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + */ +#define __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(__CHANNEL__) \ + ((__CHANNEL__) & ~ADC_CHANNEL_ID_INTERNAL_CH_MASK) + +/** + * @brief Helper macro to determine whether the internal channel + * selected is available on the ADC instance selected. + * @note The channel parameter must be a value defined from parameter + * definition of a ADC internal channel (LL_ADC_CHANNEL_VREFINT, + * LL_ADC_CHANNEL_TEMPSENSOR, ...), + * must not be a value defined from parameter definition of + * ADC external channel (LL_ADC_CHANNEL_1, LL_ADC_CHANNEL_2, ...) + * or a value from functions where a channel number is + * returned from ADC registers, + * because internal and external channels share the same channel + * number in ADC registers. The differentiation is made only with + * parameters definitions of driver. + * @param __ADC_INSTANCE__ ADC instance + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1. + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval Value "0" if the internal channel selected is not available on the ADC instance selected. + * Value "1" if the internal channel selected is available on the ADC instance selected. + */ +#define __LL_ADC_IS_CHANNEL_INTERNAL_AVAILABLE(__ADC_INSTANCE__, __CHANNEL__) \ + ( \ + ((__CHANNEL__) == LL_ADC_CHANNEL_VREFINT) || \ + ((__CHANNEL__) == LL_ADC_CHANNEL_TEMPSENSOR) || \ + ((__CHANNEL__) == LL_ADC_CHANNEL_VBAT) \ + ) +/** + * @brief Helper macro to define ADC analog watchdog parameter: + * define a single channel to monitor with analog watchdog + * from sequencer channel and groups definition. + * @note To be used with function @ref LL_ADC_SetAnalogWDMonitChannels(). + * Example: + * LL_ADC_SetAnalogWDMonitChannels( + * ADC1, LL_ADC_AWD1, + * __LL_ADC_ANALOGWD_CHANNEL_GROUP(LL_ADC_CHANNEL4, LL_ADC_GROUP_REGULAR)) + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n + * (1) For ADC channel read back from ADC register, + * comparison with internal channel parameter to be done + * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). + * @param __GROUP__ This parameter can be one of the following values: + * @arg @ref LL_ADC_GROUP_REGULAR + * @arg @ref LL_ADC_GROUP_INJECTED + * @arg @ref LL_ADC_GROUP_REGULAR_INJECTED + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_AWD_DISABLE + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG + * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG + * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG + * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG + * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG + * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG + * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG + * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG + * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG + * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG + * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG + * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG + * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG + * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG + * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG + * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG + * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG + * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG + * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG + * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ + * @arg @ref LL_ADC_AWD_CH_VREFINT_REG (1) + * @arg @ref LL_ADC_AWD_CH_VREFINT_INJ (1) + * @arg @ref LL_ADC_AWD_CH_VREFINT_REG_INJ (1) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG (1)(2) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_INJ (1)(2) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ (1)(2) + * @arg @ref LL_ADC_AWD_CH_VBAT_REG (1) + * @arg @ref LL_ADC_AWD_CH_VBAT_INJ (1) + * @arg @ref LL_ADC_AWD_CH_VBAT_REG_INJ (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + */ +#define __LL_ADC_ANALOGWD_CHANNEL_GROUP(__CHANNEL__, __GROUP__) \ + (((__GROUP__) == LL_ADC_GROUP_REGULAR) \ + ? (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) \ + : \ + ((__GROUP__) == LL_ADC_GROUP_INJECTED) \ + ? (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL) \ + : \ + (((__CHANNEL__) & ADC_CHANNEL_ID_MASK) | ADC_CR1_JAWDEN | ADC_CR1_AWDEN | ADC_CR1_AWDSGL) \ + ) + +/** + * @brief Helper macro to set the value of ADC analog watchdog threshold high + * or low in function of ADC resolution, when ADC resolution is + * different of 12 bits. + * @note To be used with function @ref LL_ADC_SetAnalogWDThresholds(). + * Example, with a ADC resolution of 8 bits, to set the value of + * analog watchdog threshold high (on 8 bits): + * LL_ADC_SetAnalogWDThresholds + * (< ADCx param >, + * __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(LL_ADC_RESOLUTION_8B, ) + * ); + * @param __ADC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @param __AWD_THRESHOLD__ Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +#define __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(__ADC_RESOLUTION__, __AWD_THRESHOLD__) \ + ((__AWD_THRESHOLD__) << ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1U ))) + +/** + * @brief Helper macro to get the value of ADC analog watchdog threshold high + * or low in function of ADC resolution, when ADC resolution is + * different of 12 bits. + * @note To be used with function @ref LL_ADC_GetAnalogWDThresholds(). + * Example, with a ADC resolution of 8 bits, to get the value of + * analog watchdog threshold high (on 8 bits): + * < threshold_value_6_bits > = __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION + * (LL_ADC_RESOLUTION_8B, + * LL_ADC_GetAnalogWDThresholds(, LL_ADC_AWD_THRESHOLD_HIGH) + * ); + * @param __ADC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @param __AWD_THRESHOLD_12_BITS__ Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +#define __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION(__ADC_RESOLUTION__, __AWD_THRESHOLD_12_BITS__) \ + ((__AWD_THRESHOLD_12_BITS__) >> ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1U ))) + +#if defined(ADC_MULTIMODE_SUPPORT) +/** + * @brief Helper macro to get the ADC multimode conversion data of ADC master + * or ADC slave from raw value with both ADC conversion data concatenated. + * @note This macro is intended to be used when multimode transfer by DMA + * is enabled: refer to function @ref LL_ADC_SetMultiDMATransfer(). + * In this case the transferred data need to processed with this macro + * to separate the conversion data of ADC master and ADC slave. + * @param __ADC_MULTI_MASTER_SLAVE__ This parameter can be one of the following values: + * @arg @ref LL_ADC_MULTI_MASTER + * @arg @ref LL_ADC_MULTI_SLAVE + * @param __ADC_MULTI_CONV_DATA__ Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +#define __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(__ADC_MULTI_MASTER_SLAVE__, __ADC_MULTI_CONV_DATA__) \ + (((__ADC_MULTI_CONV_DATA__) >> POSITION_VAL((__ADC_MULTI_MASTER_SLAVE__))) & ADC_CDR_RDATA_MST) +#endif + +/** + * @brief Helper macro to select the ADC common instance + * to which is belonging the selected ADC instance. + * @note ADC common register instance can be used for: + * - Set parameters common to several ADC instances + * - Multimode (for devices with several ADC instances) + * Refer to functions having argument "ADCxy_COMMON" as parameter. + * @param __ADCx__ ADC instance + * @retval ADC common register instance + */ +#if defined(ADC1) && defined(ADC2) && defined(ADC3) +#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ + (ADC123_COMMON) +#elif defined(ADC1) && defined(ADC2) +#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ + (ADC12_COMMON) +#else +#define __LL_ADC_COMMON_INSTANCE(__ADCx__) \ + (ADC1_COMMON) +#endif + +/** + * @brief Helper macro to check if all ADC instances sharing the same + * ADC common instance are disabled. + * @note This check is required by functions with setting conditioned to + * ADC state: + * All ADC instances of the ADC common group must be disabled. + * Refer to functions having argument "ADCxy_COMMON" as parameter. + * @note On devices with only 1 ADC common instance, parameter of this macro + * is useless and can be ignored (parameter kept for compatibility + * with devices featuring several ADC common instances). + * @param __ADCXY_COMMON__ ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Value "0" if all ADC instances sharing the same ADC common instance + * are disabled. + * Value "1" if at least one ADC instance sharing the same ADC common instance + * is enabled. + */ +#if defined(ADC1) && defined(ADC2) && defined(ADC3) +#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ + (LL_ADC_IsEnabled(ADC1) | \ + LL_ADC_IsEnabled(ADC2) | \ + LL_ADC_IsEnabled(ADC3) ) +#elif defined(ADC1) && defined(ADC2) +#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ + (LL_ADC_IsEnabled(ADC1) | \ + LL_ADC_IsEnabled(ADC2) ) +#else +#define __LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(__ADCXY_COMMON__) \ + (LL_ADC_IsEnabled(ADC1)) +#endif + +/** + * @brief Helper macro to define the ADC conversion data full-scale digital + * value corresponding to the selected ADC resolution. + * @note ADC conversion data full-scale corresponds to voltage range + * determined by analog voltage references Vref+ and Vref- + * (refer to reference manual). + * @param __ADC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @retval ADC conversion data equivalent voltage value (unit: mVolt) + */ +#define __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__) \ + (0xFFFU >> ((__ADC_RESOLUTION__) >> (ADC_CR1_RES_BITOFFSET_POS - 1U))) + +/** + * @brief Helper macro to convert the ADC conversion data from + * a resolution to another resolution. + * @param __DATA__ ADC conversion data to be converted + * @param __ADC_RESOLUTION_CURRENT__ Resolution of to the data to be converted + * This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @param __ADC_RESOLUTION_TARGET__ Resolution of the data after conversion + * This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @retval ADC conversion data to the requested resolution + */ +#define __LL_ADC_CONVERT_DATA_RESOLUTION(__DATA__, __ADC_RESOLUTION_CURRENT__, __ADC_RESOLUTION_TARGET__) \ + (((__DATA__) \ + << ((__ADC_RESOLUTION_CURRENT__) >> (ADC_CR1_RES_BITOFFSET_POS - 1U))) \ + >> ((__ADC_RESOLUTION_TARGET__) >> (ADC_CR1_RES_BITOFFSET_POS - 1U)) \ + ) + +/** + * @brief Helper macro to calculate the voltage (unit: mVolt) + * corresponding to a ADC conversion data (unit: digital value). + * @note Analog reference voltage (Vref+) must be either known from + * user board environment or can be calculated using ADC measurement + * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). + * @param __VREFANALOG_VOLTAGE__ Analog reference voltage (unit: mV) + * @param __ADC_DATA__ ADC conversion data (resolution 12 bits) + * (unit: digital value). + * @param __ADC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @retval ADC conversion data equivalent voltage value (unit: mVolt) + */ +#define __LL_ADC_CALC_DATA_TO_VOLTAGE(__VREFANALOG_VOLTAGE__,\ + __ADC_DATA__,\ + __ADC_RESOLUTION__) \ + ((__ADC_DATA__) * (__VREFANALOG_VOLTAGE__) \ + / __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__) \ + ) + + +/** + * @brief Helper macro to calculate the temperature (unit: degree Celsius) + * from ADC conversion data of internal temperature sensor. + * @note Computation is using temperature sensor typical values + * (refer to device datasheet). + * @note Calculation formula: + * Temperature = (TS_TYP_CALx_VOLT(uV) - TS_ADC_DATA * Conversion_uV) + * / Avg_Slope + CALx_TEMP + * with TS_ADC_DATA = temperature sensor raw data measured by ADC + * (unit: digital value) + * Avg_Slope = temperature sensor slope + * (unit: uV/Degree Celsius) + * TS_TYP_CALx_VOLT = temperature sensor digital value at + * temperature CALx_TEMP (unit: mV) + * Caution: Calculation relevancy under reserve the temperature sensor + * of the current device has characteristics in line with + * datasheet typical values. + * If temperature sensor calibration values are available on + * on this device (presence of macro __LL_ADC_CALC_TEMPERATURE()), + * temperature calculation will be more accurate using + * helper macro @ref __LL_ADC_CALC_TEMPERATURE(). + * @note As calculation input, the analog reference voltage (Vref+) must be + * defined as it impacts the ADC LSB equivalent voltage. + * @note Analog reference voltage (Vref+) must be either known from + * user board environment or can be calculated using ADC measurement + * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). + * @note ADC measurement data must correspond to a resolution of 12bits + * (full scale digital value 4095). If not the case, the data must be + * preliminarily rescaled to an equivalent resolution of 12 bits. + * @param __TEMPSENSOR_TYP_AVGSLOPE__ Device datasheet data: Temperature sensor slope typical value (unit: uV/DegCelsius). + * On STM32F4, refer to device datasheet parameter "Avg_Slope". + * @param __TEMPSENSOR_TYP_CALX_V__ Device datasheet data: Temperature sensor voltage typical value (at temperature and Vref+ defined in parameters below) (unit: mV). + * On STM32F4, refer to device datasheet parameter "V25". + * @param __TEMPSENSOR_CALX_TEMP__ Device datasheet data: Temperature at which temperature sensor voltage (see parameter above) is corresponding (unit: mV) + * @param __VREFANALOG_VOLTAGE__ Analog voltage reference (Vref+) voltage (unit: mV) + * @param __TEMPSENSOR_ADC_DATA__ ADC conversion data of internal temperature sensor (unit: digital value). + * @param __ADC_RESOLUTION__ ADC resolution at which internal temperature sensor voltage has been measured. + * This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @retval Temperature (unit: degree Celsius) + */ +#define __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(__TEMPSENSOR_TYP_AVGSLOPE__,\ + __TEMPSENSOR_TYP_CALX_V__,\ + __TEMPSENSOR_CALX_TEMP__,\ + __VREFANALOG_VOLTAGE__,\ + __TEMPSENSOR_ADC_DATA__,\ + __ADC_RESOLUTION__) \ + ((( ( \ + (int32_t)(((__TEMPSENSOR_TYP_CALX_V__)) \ + * 1000) \ + - \ + (int32_t)((((__TEMPSENSOR_ADC_DATA__) * (__VREFANALOG_VOLTAGE__)) \ + / __LL_ADC_DIGITAL_SCALE(__ADC_RESOLUTION__)) \ + * 1000) \ + ) \ + ) / (__TEMPSENSOR_TYP_AVGSLOPE__) \ + ) + (__TEMPSENSOR_CALX_TEMP__) \ + ) + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup ADC_LL_Exported_Functions ADC Exported Functions + * @{ + */ + +/** @defgroup ADC_LL_EF_DMA_Management ADC DMA management + * @{ + */ +/* Note: LL ADC functions to set DMA transfer are located into sections of */ +/* configuration of ADC instance, groups and multimode (if available): */ +/* @ref LL_ADC_REG_SetDMATransfer(), ... */ + +/** + * @brief Function to help to configure DMA transfer from ADC: retrieve the + * ADC register address from ADC instance and a list of ADC registers + * intended to be used (most commonly) with DMA transfer. + * @note These ADC registers are data registers: + * when ADC conversion data is available in ADC data registers, + * ADC generates a DMA transfer request. + * @note This macro is intended to be used with LL DMA driver, refer to + * function "LL_DMA_ConfigAddresses()". + * Example: + * LL_DMA_ConfigAddresses(DMA1, + * LL_DMA_CHANNEL_1, + * LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA), + * (uint32_t)&< array or variable >, + * LL_DMA_DIRECTION_PERIPH_TO_MEMORY); + * @note For devices with several ADC: in multimode, some devices + * use a different data register outside of ADC instance scope + * (common data register). This macro manages this register difference, + * only ADC instance has to be set as parameter. + * @rmtoll DR RDATA LL_ADC_DMA_GetRegAddr\n + * CDR RDATA_MST LL_ADC_DMA_GetRegAddr\n + * CDR RDATA_SLV LL_ADC_DMA_GetRegAddr + * @param ADCx ADC instance + * @param Register This parameter can be one of the following values: + * @arg @ref LL_ADC_DMA_REG_REGULAR_DATA + * @arg @ref LL_ADC_DMA_REG_REGULAR_DATA_MULTI (1) + * + * (1) Available on devices with several ADC instances. + * @retval ADC register address + */ +#if defined(ADC_MULTIMODE_SUPPORT) +__STATIC_INLINE uint32_t LL_ADC_DMA_GetRegAddr(ADC_TypeDef *ADCx, uint32_t Register) +{ + register uint32_t data_reg_addr = 0U; + + if (Register == LL_ADC_DMA_REG_REGULAR_DATA) + { + /* Retrieve address of register DR */ + data_reg_addr = (uint32_t)&(ADCx->DR); + } + else /* (Register == LL_ADC_DMA_REG_REGULAR_DATA_MULTI) */ + { + /* Retrieve address of register CDR */ + data_reg_addr = (uint32_t)&((__LL_ADC_COMMON_INSTANCE(ADCx))->CDR); + } + + return data_reg_addr; +} +#else +__STATIC_INLINE uint32_t LL_ADC_DMA_GetRegAddr(ADC_TypeDef *ADCx, uint32_t Register) +{ + /* Retrieve address of register DR */ + return (uint32_t)&(ADCx->DR); +} +#endif + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_Common Configuration of ADC hierarchical scope: common to several ADC instances + * @{ + */ + +/** + * @brief Set parameter common to several ADC: Clock source and prescaler. + * @rmtoll CCR ADCPRE LL_ADC_SetCommonClock + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param CommonClock This parameter can be one of the following values: + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV2 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV4 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV6 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV8 + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetCommonClock(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t CommonClock) +{ + MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_ADCPRE, CommonClock); +} + +/** + * @brief Get parameter common to several ADC: Clock source and prescaler. + * @rmtoll CCR ADCPRE LL_ADC_GetCommonClock + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV2 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV4 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV6 + * @arg @ref LL_ADC_CLOCK_SYNC_PCLK_DIV8 + */ +__STATIC_INLINE uint32_t LL_ADC_GetCommonClock(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_ADCPRE)); +} + +/** + * @brief Set parameter common to several ADC: measurement path to internal + * channels (VrefInt, temperature sensor, ...). + * @note One or several values can be selected. + * Example: (LL_ADC_PATH_INTERNAL_VREFINT | + * LL_ADC_PATH_INTERNAL_TEMPSENSOR) + * @note Stabilization time of measurement path to internal channel: + * After enabling internal paths, before starting ADC conversion, + * a delay is required for internal voltage reference and + * temperature sensor stabilization time. + * Refer to device datasheet. + * Refer to literal @ref LL_ADC_DELAY_VREFINT_STAB_US. + * Refer to literal @ref LL_ADC_DELAY_TEMPSENSOR_STAB_US. + * @note ADC internal channel sampling time constraint: + * For ADC conversion of internal channels, + * a sampling time minimum value is required. + * Refer to device datasheet. + * @rmtoll CCR TSVREFE LL_ADC_SetCommonPathInternalCh\n + * CCR VBATE LL_ADC_SetCommonPathInternalCh + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param PathInternal This parameter can be a combination of the following values: + * @arg @ref LL_ADC_PATH_INTERNAL_NONE + * @arg @ref LL_ADC_PATH_INTERNAL_VREFINT + * @arg @ref LL_ADC_PATH_INTERNAL_TEMPSENSOR + * @arg @ref LL_ADC_PATH_INTERNAL_VBAT + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetCommonPathInternalCh(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t PathInternal) +{ + MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_TSVREFE | ADC_CCR_VBATE, PathInternal); +} + +/** + * @brief Get parameter common to several ADC: measurement path to internal + * channels (VrefInt, temperature sensor, ...). + * @note One or several values can be selected. + * Example: (LL_ADC_PATH_INTERNAL_VREFINT | + * LL_ADC_PATH_INTERNAL_TEMPSENSOR) + * @rmtoll CCR TSVREFE LL_ADC_GetCommonPathInternalCh\n + * CCR VBATE LL_ADC_GetCommonPathInternalCh + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Returned value can be a combination of the following values: + * @arg @ref LL_ADC_PATH_INTERNAL_NONE + * @arg @ref LL_ADC_PATH_INTERNAL_VREFINT + * @arg @ref LL_ADC_PATH_INTERNAL_TEMPSENSOR + * @arg @ref LL_ADC_PATH_INTERNAL_VBAT + */ +__STATIC_INLINE uint32_t LL_ADC_GetCommonPathInternalCh(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_TSVREFE | ADC_CCR_VBATE)); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_Instance Configuration of ADC hierarchical scope: ADC instance + * @{ + */ + +/** + * @brief Set ADC resolution. + * Refer to reference manual for alignments formats + * dependencies to ADC resolutions. + * @rmtoll CR1 RES LL_ADC_SetResolution + * @param ADCx ADC instance + * @param Resolution This parameter can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetResolution(ADC_TypeDef *ADCx, uint32_t Resolution) +{ + MODIFY_REG(ADCx->CR1, ADC_CR1_RES, Resolution); +} + +/** + * @brief Get ADC resolution. + * Refer to reference manual for alignments formats + * dependencies to ADC resolutions. + * @rmtoll CR1 RES LL_ADC_GetResolution + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_RESOLUTION_12B + * @arg @ref LL_ADC_RESOLUTION_10B + * @arg @ref LL_ADC_RESOLUTION_8B + * @arg @ref LL_ADC_RESOLUTION_6B + */ +__STATIC_INLINE uint32_t LL_ADC_GetResolution(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_RES)); +} + +/** + * @brief Set ADC conversion data alignment. + * @note Refer to reference manual for alignments formats + * dependencies to ADC resolutions. + * @rmtoll CR2 ALIGN LL_ADC_SetDataAlignment + * @param ADCx ADC instance + * @param DataAlignment This parameter can be one of the following values: + * @arg @ref LL_ADC_DATA_ALIGN_RIGHT + * @arg @ref LL_ADC_DATA_ALIGN_LEFT + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetDataAlignment(ADC_TypeDef *ADCx, uint32_t DataAlignment) +{ + MODIFY_REG(ADCx->CR2, ADC_CR2_ALIGN, DataAlignment); +} + +/** + * @brief Get ADC conversion data alignment. + * @note Refer to reference manual for alignments formats + * dependencies to ADC resolutions. + * @rmtoll CR2 ALIGN LL_ADC_SetDataAlignment + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_DATA_ALIGN_RIGHT + * @arg @ref LL_ADC_DATA_ALIGN_LEFT + */ +__STATIC_INLINE uint32_t LL_ADC_GetDataAlignment(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_ALIGN)); +} + +/** + * @brief Set ADC sequencers scan mode, for all ADC groups + * (group regular, group injected). + * @note According to sequencers scan mode : + * - If disabled: ADC conversion is performed in unitary conversion + * mode (one channel converted, that defined in rank 1). + * Configuration of sequencers of all ADC groups + * (sequencer scan length, ...) is discarded: equivalent to + * scan length of 1 rank. + * - If enabled: ADC conversions are performed in sequence conversions + * mode, according to configuration of sequencers of + * each ADC group (sequencer scan length, ...). + * Refer to function @ref LL_ADC_REG_SetSequencerLength() + * and to function @ref LL_ADC_INJ_SetSequencerLength(). + * @rmtoll CR1 SCAN LL_ADC_SetSequencersScanMode + * @param ADCx ADC instance + * @param ScanMode This parameter can be one of the following values: + * @arg @ref LL_ADC_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_SEQ_SCAN_ENABLE + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetSequencersScanMode(ADC_TypeDef *ADCx, uint32_t ScanMode) +{ + MODIFY_REG(ADCx->CR1, ADC_CR1_SCAN, ScanMode); +} + +/** + * @brief Get ADC sequencers scan mode, for all ADC groups + * (group regular, group injected). + * @note According to sequencers scan mode : + * - If disabled: ADC conversion is performed in unitary conversion + * mode (one channel converted, that defined in rank 1). + * Configuration of sequencers of all ADC groups + * (sequencer scan length, ...) is discarded: equivalent to + * scan length of 1 rank. + * - If enabled: ADC conversions are performed in sequence conversions + * mode, according to configuration of sequencers of + * each ADC group (sequencer scan length, ...). + * Refer to function @ref LL_ADC_REG_SetSequencerLength() + * and to function @ref LL_ADC_INJ_SetSequencerLength(). + * @rmtoll CR1 SCAN LL_ADC_GetSequencersScanMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_SEQ_SCAN_ENABLE + */ +__STATIC_INLINE uint32_t LL_ADC_GetSequencersScanMode(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_SCAN)); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_Group_Regular Configuration of ADC hierarchical scope: group regular + * @{ + */ + +/** + * @brief Set ADC group regular conversion trigger source: + * internal (SW start) or from external IP (timer event, + * external interrupt line). + * @note On this STM32 serie, setting of external trigger edge is performed + * using function @ref LL_ADC_REG_StartConversionExtTrig(). + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR2 EXTSEL LL_ADC_REG_SetTriggerSource\n + * CR2 EXTEN LL_ADC_REG_SetTriggerSource + * @param ADCx ADC instance + * @param TriggerSource This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_TRIG_SOFTWARE + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH4 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM4_CH4 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_EXTI_LINE11 + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetTriggerSource(ADC_TypeDef *ADCx, uint32_t TriggerSource) +{ +/* Note: On this STM32 serie, ADC group regular external trigger edge */ +/* is used to perform a ADC conversion start. */ +/* This function does not set external trigger edge. */ +/* This feature is set using function */ +/* @ref LL_ADC_REG_StartConversionExtTrig(). */ + MODIFY_REG(ADCx->CR2, ADC_CR2_EXTSEL, (TriggerSource & ADC_CR2_EXTSEL)); +} + +/** + * @brief Get ADC group regular conversion trigger source: + * internal (SW start) or from external IP (timer event, + * external interrupt line). + * @note To determine whether group regular trigger source is + * internal (SW start) or external, without detail + * of which peripheral is selected as external trigger, + * (equivalent to + * "if(LL_ADC_REG_GetTriggerSource(ADC1) == LL_ADC_REG_TRIG_SOFTWARE)") + * use function @ref LL_ADC_REG_IsTriggerSourceSWStart. + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR2 EXTSEL LL_ADC_REG_GetTriggerSource\n + * CR2 EXTEN LL_ADC_REG_GetTriggerSource + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_TRIG_SOFTWARE + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM1_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_CH4 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM3_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM4_CH4 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH2 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM5_CH3 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_CH1 + * @arg @ref LL_ADC_REG_TRIG_EXT_TIM8_TRGO + * @arg @ref LL_ADC_REG_TRIG_EXT_EXTI_LINE11 + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetTriggerSource(ADC_TypeDef *ADCx) +{ + register uint32_t TriggerSource = READ_BIT(ADCx->CR2, ADC_CR2_EXTSEL | ADC_CR2_EXTEN); + + /* Value for shift of {0; 4; 8; 12} depending on value of bitfield */ + /* corresponding to ADC_CR2_EXTEN {0; 1; 2; 3}. */ + register uint32_t ShiftExten = ((TriggerSource & ADC_CR2_EXTEN) >> (ADC_REG_TRIG_EXTEN_BITOFFSET_POS - 2U)); + + /* Set bitfield corresponding to ADC_CR2_EXTEN and ADC_CR2_EXTSEL */ + /* to match with triggers literals definition. */ + return ((TriggerSource + & (ADC_REG_TRIG_SOURCE_MASK << ShiftExten) & ADC_CR2_EXTSEL) + | ((ADC_REG_TRIG_EDGE_MASK << ShiftExten) & ADC_CR2_EXTEN) + ); +} + +/** + * @brief Get ADC group regular conversion trigger source internal (SW start) + or external. + * @note In case of group regular trigger source set to external trigger, + * to determine which peripheral is selected as external trigger, + * use function @ref LL_ADC_REG_GetTriggerSource(). + * @rmtoll CR2 EXTEN LL_ADC_REG_IsTriggerSourceSWStart + * @param ADCx ADC instance + * @retval Value "0" if trigger source external trigger + * Value "1" if trigger source SW start. + */ +__STATIC_INLINE uint32_t LL_ADC_REG_IsTriggerSourceSWStart(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR2, ADC_CR2_EXTEN) == (LL_ADC_REG_TRIG_SOFTWARE & ADC_CR2_EXTEN)); +} + +/** + * @brief Get ADC group regular conversion trigger polarity. + * @note Applicable only for trigger source set to external trigger. + * @note On this STM32 serie, setting of external trigger edge is performed + * using function @ref LL_ADC_REG_StartConversionExtTrig(). + * @rmtoll CR2 EXTEN LL_ADC_REG_GetTriggerEdge + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_TRIG_EXT_RISING + * @arg @ref LL_ADC_REG_TRIG_EXT_FALLING + * @arg @ref LL_ADC_REG_TRIG_EXT_RISINGFALLING + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetTriggerEdge(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_EXTEN)); +} + + +/** + * @brief Set ADC group regular sequencer length and scan direction. + * @note Description of ADC group regular sequencer features: + * - For devices with sequencer fully configurable + * (function "LL_ADC_REG_SetSequencerRanks()" available): + * sequencer length and each rank affectation to a channel + * are configurable. + * This function performs configuration of: + * - Sequence length: Number of ranks in the scan sequence. + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from rank 1 to rank n). + * Sequencer ranks are selected using + * function "LL_ADC_REG_SetSequencerRanks()". + * - For devices with sequencer not fully configurable + * (function "LL_ADC_REG_SetSequencerChannels()" available): + * sequencer length and each rank affectation to a channel + * are defined by channel number. + * This function performs configuration of: + * - Sequence length: Number of ranks in the scan sequence is + * defined by number of channels set in the sequence, + * rank of each channel is fixed by channel HW number. + * (channel 0 fixed on rank 0, channel 1 fixed on rank1, ...). + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from lowest channel number to + * highest channel number). + * Sequencer ranks are selected using + * function "LL_ADC_REG_SetSequencerChannels()". + * @note On this STM32 serie, group regular sequencer configuration + * is conditioned to ADC instance sequencer mode. + * If ADC instance sequencer mode is disabled, sequencers of + * all groups (group regular, group injected) can be configured + * but their execution is disabled (limited to rank 1). + * Refer to function @ref LL_ADC_SetSequencersScanMode(). + * @note Sequencer disabled is equivalent to sequencer of 1 rank: + * ADC conversion on only 1 channel. + * @rmtoll SQR1 L LL_ADC_REG_SetSequencerLength + * @param ADCx ADC instance + * @param SequencerNbRanks This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetSequencerLength(ADC_TypeDef *ADCx, uint32_t SequencerNbRanks) +{ + MODIFY_REG(ADCx->SQR1, ADC_SQR1_L, SequencerNbRanks); +} + +/** + * @brief Get ADC group regular sequencer length and scan direction. + * @note Description of ADC group regular sequencer features: + * - For devices with sequencer fully configurable + * (function "LL_ADC_REG_SetSequencerRanks()" available): + * sequencer length and each rank affectation to a channel + * are configurable. + * This function retrieves: + * - Sequence length: Number of ranks in the scan sequence. + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from rank 1 to rank n). + * Sequencer ranks are selected using + * function "LL_ADC_REG_SetSequencerRanks()". + * - For devices with sequencer not fully configurable + * (function "LL_ADC_REG_SetSequencerChannels()" available): + * sequencer length and each rank affectation to a channel + * are defined by channel number. + * This function retrieves: + * - Sequence length: Number of ranks in the scan sequence is + * defined by number of channels set in the sequence, + * rank of each channel is fixed by channel HW number. + * (channel 0 fixed on rank 0, channel 1 fixed on rank1, ...). + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from lowest channel number to + * highest channel number). + * Sequencer ranks are selected using + * function "LL_ADC_REG_SetSequencerChannels()". + * @note On this STM32 serie, group regular sequencer configuration + * is conditioned to ADC instance sequencer mode. + * If ADC instance sequencer mode is disabled, sequencers of + * all groups (group regular, group injected) can be configured + * but their execution is disabled (limited to rank 1). + * Refer to function @ref LL_ADC_SetSequencersScanMode(). + * @note Sequencer disabled is equivalent to sequencer of 1 rank: + * ADC conversion on only 1 channel. + * @rmtoll SQR1 L LL_ADC_REG_SetSequencerLength + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS + * @arg @ref LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerLength(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->SQR1, ADC_SQR1_L)); +} + +/** + * @brief Set ADC group regular sequencer discontinuous mode: + * sequence subdivided and scan conversions interrupted every selected + * number of ranks. + * @note It is not possible to enable both ADC group regular + * continuous mode and sequencer discontinuous mode. + * @note It is not possible to enable both ADC auto-injected mode + * and ADC group regular sequencer discontinuous mode. + * @rmtoll CR1 DISCEN LL_ADC_REG_SetSequencerDiscont\n + * CR1 DISCNUM LL_ADC_REG_SetSequencerDiscont + * @param ADCx ADC instance + * @param SeqDiscont This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_SEQ_DISCONT_DISABLE + * @arg @ref LL_ADC_REG_SEQ_DISCONT_1RANK + * @arg @ref LL_ADC_REG_SEQ_DISCONT_2RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_3RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_4RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_5RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_6RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_7RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_8RANKS + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetSequencerDiscont(ADC_TypeDef *ADCx, uint32_t SeqDiscont) +{ + MODIFY_REG(ADCx->CR1, ADC_CR1_DISCEN | ADC_CR1_DISCNUM, SeqDiscont); +} + +/** + * @brief Get ADC group regular sequencer discontinuous mode: + * sequence subdivided and scan conversions interrupted every selected + * number of ranks. + * @rmtoll CR1 DISCEN LL_ADC_REG_GetSequencerDiscont\n + * CR1 DISCNUM LL_ADC_REG_GetSequencerDiscont + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_SEQ_DISCONT_DISABLE + * @arg @ref LL_ADC_REG_SEQ_DISCONT_1RANK + * @arg @ref LL_ADC_REG_SEQ_DISCONT_2RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_3RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_4RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_5RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_6RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_7RANKS + * @arg @ref LL_ADC_REG_SEQ_DISCONT_8RANKS + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerDiscont(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_DISCEN | ADC_CR1_DISCNUM)); +} + +/** + * @brief Set ADC group regular sequence: channel on the selected + * scan sequence rank. + * @note This function performs configuration of: + * - Channels ordering into each rank of scan sequence: + * whatever channel can be placed into whatever rank. + * @note On this STM32 serie, ADC group regular sequencer is + * fully configurable: sequencer length and each rank + * affectation to a channel are configurable. + * Refer to description of function @ref LL_ADC_REG_SetSequencerLength(). + * @note Depending on devices and packages, some channels may not be available. + * Refer to device datasheet for channels availability. + * @note On this STM32 serie, to measure internal channels (VrefInt, + * TempSensor, ...), measurement paths to internal channels must be + * enabled separately. + * This can be done using function @ref LL_ADC_SetCommonPathInternalCh(). + * @rmtoll SQR3 SQ1 LL_ADC_REG_SetSequencerRanks\n + * SQR3 SQ2 LL_ADC_REG_SetSequencerRanks\n + * SQR3 SQ3 LL_ADC_REG_SetSequencerRanks\n + * SQR3 SQ4 LL_ADC_REG_SetSequencerRanks\n + * SQR3 SQ5 LL_ADC_REG_SetSequencerRanks\n + * SQR3 SQ6 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ7 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ8 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ9 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ10 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ11 LL_ADC_REG_SetSequencerRanks\n + * SQR2 SQ12 LL_ADC_REG_SetSequencerRanks\n + * SQR1 SQ13 LL_ADC_REG_SetSequencerRanks\n + * SQR1 SQ14 LL_ADC_REG_SetSequencerRanks\n + * SQR1 SQ15 LL_ADC_REG_SetSequencerRanks\n + * SQR1 SQ16 LL_ADC_REG_SetSequencerRanks + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_RANK_1 + * @arg @ref LL_ADC_REG_RANK_2 + * @arg @ref LL_ADC_REG_RANK_3 + * @arg @ref LL_ADC_REG_RANK_4 + * @arg @ref LL_ADC_REG_RANK_5 + * @arg @ref LL_ADC_REG_RANK_6 + * @arg @ref LL_ADC_REG_RANK_7 + * @arg @ref LL_ADC_REG_RANK_8 + * @arg @ref LL_ADC_REG_RANK_9 + * @arg @ref LL_ADC_REG_RANK_10 + * @arg @ref LL_ADC_REG_RANK_11 + * @arg @ref LL_ADC_REG_RANK_12 + * @arg @ref LL_ADC_REG_RANK_13 + * @arg @ref LL_ADC_REG_RANK_14 + * @arg @ref LL_ADC_REG_RANK_15 + * @arg @ref LL_ADC_REG_RANK_16 + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t Channel) +{ + /* Set bits with content of parameter "Channel" with bits position */ + /* in register and register position depending on parameter "Rank". */ + /* Parameters "Rank" and "Channel" are used with masks because containing */ + /* other bits reserved for other purpose. */ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SQR1, __ADC_MASK_SHIFT(Rank, ADC_REG_SQRX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + ADC_CHANNEL_ID_NUMBER_MASK << (Rank & ADC_REG_RANK_ID_SQRX_MASK), + (Channel & ADC_CHANNEL_ID_NUMBER_MASK) << (Rank & ADC_REG_RANK_ID_SQRX_MASK)); +} + +/** + * @brief Get ADC group regular sequence: channel on the selected + * scan sequence rank. + * @note On this STM32 serie, ADC group regular sequencer is + * fully configurable: sequencer length and each rank + * affectation to a channel are configurable. + * Refer to description of function @ref LL_ADC_REG_SetSequencerLength(). + * @note Depending on devices and packages, some channels may not be available. + * Refer to device datasheet for channels availability. + * @note Usage of the returned channel number: + * - To reinject this channel into another function LL_ADC_xxx: + * the returned channel number is only partly formatted on definition + * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared + * with parts of literals LL_ADC_CHANNEL_x or using + * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * Then the selected literal LL_ADC_CHANNEL_x can be used + * as parameter for another function. + * - To get the channel number in decimal format: + * process the returned value with the helper macro + * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * @rmtoll SQR3 SQ1 LL_ADC_REG_GetSequencerRanks\n + * SQR3 SQ2 LL_ADC_REG_GetSequencerRanks\n + * SQR3 SQ3 LL_ADC_REG_GetSequencerRanks\n + * SQR3 SQ4 LL_ADC_REG_GetSequencerRanks\n + * SQR3 SQ5 LL_ADC_REG_GetSequencerRanks\n + * SQR3 SQ6 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ7 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ8 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ9 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ10 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ11 LL_ADC_REG_GetSequencerRanks\n + * SQR2 SQ12 LL_ADC_REG_GetSequencerRanks\n + * SQR1 SQ13 LL_ADC_REG_GetSequencerRanks\n + * SQR1 SQ14 LL_ADC_REG_GetSequencerRanks\n + * SQR1 SQ15 LL_ADC_REG_GetSequencerRanks\n + * SQR1 SQ16 LL_ADC_REG_GetSequencerRanks + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_RANK_1 + * @arg @ref LL_ADC_REG_RANK_2 + * @arg @ref LL_ADC_REG_RANK_3 + * @arg @ref LL_ADC_REG_RANK_4 + * @arg @ref LL_ADC_REG_RANK_5 + * @arg @ref LL_ADC_REG_RANK_6 + * @arg @ref LL_ADC_REG_RANK_7 + * @arg @ref LL_ADC_REG_RANK_8 + * @arg @ref LL_ADC_REG_RANK_9 + * @arg @ref LL_ADC_REG_RANK_10 + * @arg @ref LL_ADC_REG_RANK_11 + * @arg @ref LL_ADC_REG_RANK_12 + * @arg @ref LL_ADC_REG_RANK_13 + * @arg @ref LL_ADC_REG_RANK_14 + * @arg @ref LL_ADC_REG_RANK_15 + * @arg @ref LL_ADC_REG_RANK_16 + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n + * (1) For ADC channel read back from ADC register, + * comparison with internal channel parameter to be done + * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SQR1, __ADC_MASK_SHIFT(Rank, ADC_REG_SQRX_REGOFFSET_MASK)); + + return (uint32_t) (READ_BIT(*preg, + ADC_CHANNEL_ID_NUMBER_MASK << (Rank & ADC_REG_RANK_ID_SQRX_MASK)) + >> (Rank & ADC_REG_RANK_ID_SQRX_MASK) + ); +} + +/** + * @brief Set ADC continuous conversion mode on ADC group regular. + * @note Description of ADC continuous conversion mode: + * - single mode: one conversion per trigger + * - continuous mode: after the first trigger, following + * conversions launched successively automatically. + * @note It is not possible to enable both ADC group regular + * continuous mode and sequencer discontinuous mode. + * @rmtoll CR2 CONT LL_ADC_REG_SetContinuousMode + * @param ADCx ADC instance + * @param Continuous This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_CONV_SINGLE + * @arg @ref LL_ADC_REG_CONV_CONTINUOUS + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetContinuousMode(ADC_TypeDef *ADCx, uint32_t Continuous) +{ + MODIFY_REG(ADCx->CR2, ADC_CR2_CONT, Continuous); +} + +/** + * @brief Get ADC continuous conversion mode on ADC group regular. + * @note Description of ADC continuous conversion mode: + * - single mode: one conversion per trigger + * - continuous mode: after the first trigger, following + * conversions launched successively automatically. + * @rmtoll CR2 CONT LL_ADC_REG_GetContinuousMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_CONV_SINGLE + * @arg @ref LL_ADC_REG_CONV_CONTINUOUS + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetContinuousMode(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_CONT)); +} + +/** + * @brief Set ADC group regular conversion data transfer: no transfer or + * transfer by DMA, and DMA requests mode. + * @note If transfer by DMA selected, specifies the DMA requests + * mode: + * - Limited mode (One shot mode): DMA transfer requests are stopped + * when number of DMA data transfers (number of + * ADC conversions) is reached. + * This ADC mode is intended to be used with DMA mode non-circular. + * - Unlimited mode: DMA transfer requests are unlimited, + * whatever number of DMA data transfers (number of + * ADC conversions). + * This ADC mode is intended to be used with DMA mode circular. + * @note If ADC DMA requests mode is set to unlimited and DMA is set to + * mode non-circular: + * when DMA transfers size will be reached, DMA will stop transfers of + * ADC conversions data ADC will raise an overrun error + * (overrun flag and interruption if enabled). + * @note For devices with several ADC instances: ADC multimode DMA + * settings are available using function @ref LL_ADC_SetMultiDMATransfer(). + * @note To configure DMA source address (peripheral address), + * use function @ref LL_ADC_DMA_GetRegAddr(). + * @rmtoll CR2 DMA LL_ADC_REG_SetDMATransfer\n + * CR2 DDS LL_ADC_REG_SetDMATransfer + * @param ADCx ADC instance + * @param DMATransfer This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_DMA_TRANSFER_NONE + * @arg @ref LL_ADC_REG_DMA_TRANSFER_LIMITED + * @arg @ref LL_ADC_REG_DMA_TRANSFER_UNLIMITED + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetDMATransfer(ADC_TypeDef *ADCx, uint32_t DMATransfer) +{ + MODIFY_REG(ADCx->CR2, ADC_CR2_DMA | ADC_CR2_DDS, DMATransfer); +} + +/** + * @brief Get ADC group regular conversion data transfer: no transfer or + * transfer by DMA, and DMA requests mode. + * @note If transfer by DMA selected, specifies the DMA requests + * mode: + * - Limited mode (One shot mode): DMA transfer requests are stopped + * when number of DMA data transfers (number of + * ADC conversions) is reached. + * This ADC mode is intended to be used with DMA mode non-circular. + * - Unlimited mode: DMA transfer requests are unlimited, + * whatever number of DMA data transfers (number of + * ADC conversions). + * This ADC mode is intended to be used with DMA mode circular. + * @note If ADC DMA requests mode is set to unlimited and DMA is set to + * mode non-circular: + * when DMA transfers size will be reached, DMA will stop transfers of + * ADC conversions data ADC will raise an overrun error + * (overrun flag and interruption if enabled). + * @note For devices with several ADC instances: ADC multimode DMA + * settings are available using function @ref LL_ADC_GetMultiDMATransfer(). + * @note To configure DMA source address (peripheral address), + * use function @ref LL_ADC_DMA_GetRegAddr(). + * @rmtoll CR2 DMA LL_ADC_REG_GetDMATransfer\n + * CR2 DDS LL_ADC_REG_GetDMATransfer + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_DMA_TRANSFER_NONE + * @arg @ref LL_ADC_REG_DMA_TRANSFER_LIMITED + * @arg @ref LL_ADC_REG_DMA_TRANSFER_UNLIMITED + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetDMATransfer(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_DMA | ADC_CR2_DDS)); +} + +/** + * @brief Specify which ADC flag between EOC (end of unitary conversion) + * or EOS (end of sequence conversions) is used to indicate + * the end of conversion. + * @note This feature is aimed to be set when using ADC with + * programming model by polling or interruption + * (programming model by DMA usually uses DMA interruptions + * to indicate end of conversion and data transfer). + * @note For ADC group injected, end of conversion (flag&IT) is raised + * only at the end of the sequence. + * @rmtoll CR2 EOCS LL_ADC_REG_SetFlagEndOfConversion + * @param ADCx ADC instance + * @param EocSelection This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV + * @arg @ref LL_ADC_REG_FLAG_EOC_UNITARY_CONV + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_SetFlagEndOfConversion(ADC_TypeDef *ADCx, uint32_t EocSelection) +{ + MODIFY_REG(ADCx->CR2, ADC_CR2_EOCS, EocSelection); +} + +/** + * @brief Get which ADC flag between EOC (end of unitary conversion) + * or EOS (end of sequence conversions) is used to indicate + * the end of conversion. + * @rmtoll CR2 EOCS LL_ADC_REG_GetFlagEndOfConversion + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV + * @arg @ref LL_ADC_REG_FLAG_EOC_UNITARY_CONV + */ +__STATIC_INLINE uint32_t LL_ADC_REG_GetFlagEndOfConversion(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_EOCS)); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_Group_Injected Configuration of ADC hierarchical scope: group injected + * @{ + */ + +/** + * @brief Set ADC group injected conversion trigger source: + * internal (SW start) or from external IP (timer event, + * external interrupt line). + * @note On this STM32 serie, setting of external trigger edge is performed + * using function @ref LL_ADC_INJ_StartConversionExtTrig(). + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR2 JEXTSEL LL_ADC_INJ_SetTriggerSource\n + * CR2 JEXTEN LL_ADC_INJ_SetTriggerSource + * @param ADCx ADC instance + * @param TriggerSource This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_SOFTWARE + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_CH1 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH1 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH3 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH3 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetTriggerSource(ADC_TypeDef *ADCx, uint32_t TriggerSource) +{ +/* Note: On this STM32 serie, ADC group injected external trigger edge */ +/* is used to perform a ADC conversion start. */ +/* This function does not set external trigger edge. */ +/* This feature is set using function */ +/* @ref LL_ADC_INJ_StartConversionExtTrig(). */ + MODIFY_REG(ADCx->CR2, ADC_CR2_JEXTSEL, (TriggerSource & ADC_CR2_JEXTSEL)); +} + +/** + * @brief Get ADC group injected conversion trigger source: + * internal (SW start) or from external IP (timer event, + * external interrupt line). + * @note To determine whether group injected trigger source is + * internal (SW start) or external, without detail + * of which peripheral is selected as external trigger, + * (equivalent to + * "if(LL_ADC_INJ_GetTriggerSource(ADC1) == LL_ADC_INJ_TRIG_SOFTWARE)") + * use function @ref LL_ADC_INJ_IsTriggerSourceSWStart. + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR2 JEXTSEL LL_ADC_INJ_GetTriggerSource\n + * CR2 JEXTEN LL_ADC_INJ_GetTriggerSource + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_SOFTWARE + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM1_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_CH1 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM3_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH1 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_CH3 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM4_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM5_TRGO + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH2 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH3 + * @arg @ref LL_ADC_INJ_TRIG_EXT_TIM8_CH4 + * @arg @ref LL_ADC_INJ_TRIG_EXT_EXTI_LINE15 + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetTriggerSource(ADC_TypeDef *ADCx) +{ + register uint32_t TriggerSource = READ_BIT(ADCx->CR2, ADC_CR2_JEXTSEL | ADC_CR2_JEXTEN); + + /* Value for shift of {0; 4; 8; 12} depending on value of bitfield */ + /* corresponding to ADC_CR2_JEXTEN {0; 1; 2; 3}. */ + register uint32_t ShiftExten = ((TriggerSource & ADC_CR2_JEXTEN) >> (ADC_INJ_TRIG_EXTEN_BITOFFSET_POS - 2U)); + + /* Set bitfield corresponding to ADC_CR2_JEXTEN and ADC_CR2_JEXTSEL */ + /* to match with triggers literals definition. */ + return ((TriggerSource + & (ADC_INJ_TRIG_SOURCE_MASK << ShiftExten) & ADC_CR2_JEXTSEL) + | ((ADC_INJ_TRIG_EDGE_MASK << ShiftExten) & ADC_CR2_JEXTEN) + ); +} + +/** + * @brief Get ADC group injected conversion trigger source internal (SW start) + or external + * @note In case of group injected trigger source set to external trigger, + * to determine which peripheral is selected as external trigger, + * use function @ref LL_ADC_INJ_GetTriggerSource. + * @rmtoll CR2 JEXTEN LL_ADC_INJ_IsTriggerSourceSWStart + * @param ADCx ADC instance + * @retval Value "0" if trigger source external trigger + * Value "1" if trigger source SW start. + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_IsTriggerSourceSWStart(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR2, ADC_CR2_JEXTEN) == (LL_ADC_INJ_TRIG_SOFTWARE & ADC_CR2_JEXTEN)); +} + +/** + * @brief Get ADC group injected conversion trigger polarity. + * Applicable only for trigger source set to external trigger. + * @rmtoll CR2 JEXTEN LL_ADC_INJ_GetTriggerEdge + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_EXT_RISING + * @arg @ref LL_ADC_INJ_TRIG_EXT_FALLING + * @arg @ref LL_ADC_INJ_TRIG_EXT_RISINGFALLING + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetTriggerEdge(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_JEXTEN)); +} + +/** + * @brief Set ADC group injected sequencer length and scan direction. + * @note This function performs configuration of: + * - Sequence length: Number of ranks in the scan sequence. + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from rank 1 to rank n). + * @note On this STM32 serie, group injected sequencer configuration + * is conditioned to ADC instance sequencer mode. + * If ADC instance sequencer mode is disabled, sequencers of + * all groups (group regular, group injected) can be configured + * but their execution is disabled (limited to rank 1). + * Refer to function @ref LL_ADC_SetSequencersScanMode(). + * @note Sequencer disabled is equivalent to sequencer of 1 rank: + * ADC conversion on only 1 channel. + * @rmtoll JSQR JL LL_ADC_INJ_SetSequencerLength + * @param ADCx ADC instance + * @param SequencerNbRanks This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetSequencerLength(ADC_TypeDef *ADCx, uint32_t SequencerNbRanks) +{ + MODIFY_REG(ADCx->JSQR, ADC_JSQR_JL, SequencerNbRanks); +} + +/** + * @brief Get ADC group injected sequencer length and scan direction. + * @note This function retrieves: + * - Sequence length: Number of ranks in the scan sequence. + * - Sequence direction: Unless specified in parameters, sequencer + * scan direction is forward (from rank 1 to rank n). + * @note On this STM32 serie, group injected sequencer configuration + * is conditioned to ADC instance sequencer mode. + * If ADC instance sequencer mode is disabled, sequencers of + * all groups (group regular, group injected) can be configured + * but their execution is disabled (limited to rank 1). + * Refer to function @ref LL_ADC_SetSequencersScanMode(). + * @note Sequencer disabled is equivalent to sequencer of 1 rank: + * ADC conversion on only 1 channel. + * @rmtoll JSQR JL LL_ADC_INJ_GetSequencerLength + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_INJ_SEQ_SCAN_DISABLE + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS + * @arg @ref LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerLength(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->JSQR, ADC_JSQR_JL)); +} + +/** + * @brief Set ADC group injected sequencer discontinuous mode: + * sequence subdivided and scan conversions interrupted every selected + * number of ranks. + * @note It is not possible to enable both ADC group injected + * auto-injected mode and sequencer discontinuous mode. + * @rmtoll CR1 DISCEN LL_ADC_INJ_SetSequencerDiscont + * @param ADCx ADC instance + * @param SeqDiscont This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_SEQ_DISCONT_DISABLE + * @arg @ref LL_ADC_INJ_SEQ_DISCONT_1RANK + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetSequencerDiscont(ADC_TypeDef *ADCx, uint32_t SeqDiscont) +{ + MODIFY_REG(ADCx->CR1, ADC_CR1_JDISCEN, SeqDiscont); +} + +/** + * @brief Get ADC group injected sequencer discontinuous mode: + * sequence subdivided and scan conversions interrupted every selected + * number of ranks. + * @rmtoll CR1 DISCEN LL_ADC_REG_GetSequencerDiscont + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_INJ_SEQ_DISCONT_DISABLE + * @arg @ref LL_ADC_INJ_SEQ_DISCONT_1RANK + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerDiscont(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_JDISCEN)); +} + +/** + * @brief Set ADC group injected sequence: channel on the selected + * sequence rank. + * @note Depending on devices and packages, some channels may not be available. + * Refer to device datasheet for channels availability. + * @note On this STM32 serie, to measure internal channels (VrefInt, + * TempSensor, ...), measurement paths to internal channels must be + * enabled separately. + * This can be done using function @ref LL_ADC_SetCommonPathInternalCh(). + * @rmtoll JSQR JSQ1 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ2 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ3 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ4 LL_ADC_INJ_SetSequencerRanks + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t Channel) +{ + /* Set bits with content of parameter "Channel" with bits position */ + /* in register depending on parameter "Rank". */ + /* Parameters "Rank" and "Channel" are used with masks because containing */ + /* other bits reserved for other purpose. */ + register uint32_t tmpreg1 = (READ_BIT(ADCx->JSQR, ADC_JSQR_JL) >> ADC_JSQR_JL_Pos) + 1U; + + MODIFY_REG(ADCx->JSQR, + ADC_CHANNEL_ID_NUMBER_MASK << (5U * (uint8_t)(((Rank) + 3U) - (tmpreg1))), + (Channel & ADC_CHANNEL_ID_NUMBER_MASK) << (5U * (uint8_t)(((Rank) + 3U) - (tmpreg1)))); +} + +/** + * @brief Get ADC group injected sequence: channel on the selected + * sequence rank. + * @note Depending on devices and packages, some channels may not be available. + * Refer to device datasheet for channels availability. + * @note Usage of the returned channel number: + * - To reinject this channel into another function LL_ADC_xxx: + * the returned channel number is only partly formatted on definition + * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared + * with parts of literals LL_ADC_CHANNEL_x or using + * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * Then the selected literal LL_ADC_CHANNEL_x can be used + * as parameter for another function. + * - To get the channel number in decimal format: + * process the returned value with the helper macro + * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * @rmtoll JSQR JSQ1 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ2 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ3 LL_ADC_INJ_SetSequencerRanks\n + * JSQR JSQ4 LL_ADC_INJ_SetSequencerRanks + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled.\n + * (1) For ADC channel read back from ADC register, + * comparison with internal channel parameter to be done + * using helper macro @ref __LL_ADC_CHANNEL_INTERNAL_TO_EXTERNAL(). + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetSequencerRanks(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t tmpreg1 = (READ_BIT(ADCx->JSQR, ADC_JSQR_JL) >> ADC_JSQR_JL_Pos) + 1U; + + return (uint32_t)(READ_BIT(ADCx->JSQR, + ADC_CHANNEL_ID_NUMBER_MASK << (5U * (uint8_t)(((Rank) + 3U) - (tmpreg1)))) + >> (5U * (uint8_t)(((Rank) + 3U) - (tmpreg1))) + ); +} + +/** + * @brief Set ADC group injected conversion trigger: + * independent or from ADC group regular. + * @note This mode can be used to extend number of data registers + * updated after one ADC conversion trigger and with data + * permanently kept (not erased by successive conversions of scan of + * ADC sequencer ranks), up to 5 data registers: + * 1 data register on ADC group regular, 4 data registers + * on ADC group injected. + * @note If ADC group injected injected trigger source is set to an + * external trigger, this feature must be must be set to + * independent trigger. + * ADC group injected automatic trigger is compliant only with + * group injected trigger source set to SW start, without any + * further action on ADC group injected conversion start or stop: + * in this case, ADC group injected is controlled only + * from ADC group regular. + * @note It is not possible to enable both ADC group injected + * auto-injected mode and sequencer discontinuous mode. + * @rmtoll CR1 JAUTO LL_ADC_INJ_SetTrigAuto + * @param ADCx ADC instance + * @param TrigAuto This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_INDEPENDENT + * @arg @ref LL_ADC_INJ_TRIG_FROM_GRP_REGULAR + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetTrigAuto(ADC_TypeDef *ADCx, uint32_t TrigAuto) +{ + MODIFY_REG(ADCx->CR1, ADC_CR1_JAUTO, TrigAuto); +} + +/** + * @brief Get ADC group injected conversion trigger: + * independent or from ADC group regular. + * @rmtoll CR1 JAUTO LL_ADC_INJ_GetTrigAuto + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_INDEPENDENT + * @arg @ref LL_ADC_INJ_TRIG_FROM_GRP_REGULAR + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetTrigAuto(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_JAUTO)); +} + +/** + * @brief Set ADC group injected offset. + * @note It sets: + * - ADC group injected rank to which the offset programmed + * will be applied + * - Offset level (offset to be subtracted from the raw + * converted data). + * Caution: Offset format is dependent to ADC resolution: + * offset has to be left-aligned on bit 11, the LSB (right bits) + * are set to 0. + * @note Offset cannot be enabled or disabled. + * To emulate offset disabled, set an offset value equal to 0. + * @rmtoll JOFR1 JOFFSET1 LL_ADC_INJ_SetOffset\n + * JOFR2 JOFFSET2 LL_ADC_INJ_SetOffset\n + * JOFR3 JOFFSET3 LL_ADC_INJ_SetOffset\n + * JOFR4 JOFFSET4 LL_ADC_INJ_SetOffset + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @param OffsetLevel Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_SetOffset(ADC_TypeDef *ADCx, uint32_t Rank, uint32_t OffsetLevel) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JOFR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JOFRX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + ADC_JOFR1_JOFFSET1, + OffsetLevel); +} + +/** + * @brief Get ADC group injected offset. + * @note It gives offset level (offset to be subtracted from the raw converted data). + * Caution: Offset format is dependent to ADC resolution: + * offset has to be left-aligned on bit 11, the LSB (right bits) + * are set to 0. + * @rmtoll JOFR1 JOFFSET1 LL_ADC_INJ_GetOffset\n + * JOFR2 JOFFSET2 LL_ADC_INJ_GetOffset\n + * JOFR3 JOFFSET3 LL_ADC_INJ_GetOffset\n + * JOFR4 JOFFSET4 LL_ADC_INJ_GetOffset + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_GetOffset(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JOFR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JOFRX_REGOFFSET_MASK)); + + return (uint32_t)(READ_BIT(*preg, + ADC_JOFR1_JOFFSET1) + ); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_Channels Configuration of ADC hierarchical scope: channels + * @{ + */ + +/** + * @brief Set sampling time of the selected ADC channel + * Unit: ADC clock cycles. + * @note On this device, sampling time is on channel scope: independently + * of channel mapped on ADC group regular or injected. + * @note In case of internal channel (VrefInt, TempSensor, ...) to be + * converted: + * sampling time constraints must be respected (sampling time can be + * adjusted in function of ADC clock frequency and sampling time + * setting). + * Refer to device datasheet for timings values (parameters TS_vrefint, + * TS_temp, ...). + * @note Conversion time is the addition of sampling time and processing time. + * Refer to reference manual for ADC processing time of + * this STM32 serie. + * @note In case of ADC conversion of internal channel (VrefInt, + * temperature sensor, ...), a sampling time minimum value + * is required. + * Refer to device datasheet. + * @rmtoll SMPR1 SMP18 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP17 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP16 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP15 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP14 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP13 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP12 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP11 LL_ADC_SetChannelSamplingTime\n + * SMPR1 SMP10 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP9 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP8 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP7 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP6 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP5 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP4 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP3 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP2 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP1 LL_ADC_SetChannelSamplingTime\n + * SMPR2 SMP0 LL_ADC_SetChannelSamplingTime + * @param ADCx ADC instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @param SamplingTime This parameter can be one of the following values: + * @arg @ref LL_ADC_SAMPLINGTIME_3CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_15CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_28CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_56CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_84CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_112CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_144CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_480CYCLES + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetChannelSamplingTime(ADC_TypeDef *ADCx, uint32_t Channel, uint32_t SamplingTime) +{ + /* Set bits with content of parameter "SamplingTime" with bits position */ + /* in register and register position depending on parameter "Channel". */ + /* Parameter "Channel" is used with masks because containing */ + /* other bits reserved for other purpose. */ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SMPR1, __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPRX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + ADC_SMPR2_SMP0 << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK), + SamplingTime << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK)); +} + +/** + * @brief Get sampling time of the selected ADC channel + * Unit: ADC clock cycles. + * @note On this device, sampling time is on channel scope: independently + * of channel mapped on ADC group regular or injected. + * @note Conversion time is the addition of sampling time and processing time. + * Refer to reference manual for ADC processing time of + * this STM32 serie. + * @rmtoll SMPR1 SMP18 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP17 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP16 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP15 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP14 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP13 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP12 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP11 LL_ADC_GetChannelSamplingTime\n + * SMPR1 SMP10 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP9 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP8 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP7 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP6 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP5 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP4 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP3 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP2 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP1 LL_ADC_GetChannelSamplingTime\n + * SMPR2 SMP0 LL_ADC_GetChannelSamplingTime + * @param ADCx ADC instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_ADC_CHANNEL_0 + * @arg @ref LL_ADC_CHANNEL_1 + * @arg @ref LL_ADC_CHANNEL_2 + * @arg @ref LL_ADC_CHANNEL_3 + * @arg @ref LL_ADC_CHANNEL_4 + * @arg @ref LL_ADC_CHANNEL_5 + * @arg @ref LL_ADC_CHANNEL_6 + * @arg @ref LL_ADC_CHANNEL_7 + * @arg @ref LL_ADC_CHANNEL_8 + * @arg @ref LL_ADC_CHANNEL_9 + * @arg @ref LL_ADC_CHANNEL_10 + * @arg @ref LL_ADC_CHANNEL_11 + * @arg @ref LL_ADC_CHANNEL_12 + * @arg @ref LL_ADC_CHANNEL_13 + * @arg @ref LL_ADC_CHANNEL_14 + * @arg @ref LL_ADC_CHANNEL_15 + * @arg @ref LL_ADC_CHANNEL_16 + * @arg @ref LL_ADC_CHANNEL_17 + * @arg @ref LL_ADC_CHANNEL_18 + * @arg @ref LL_ADC_CHANNEL_VREFINT (1) + * @arg @ref LL_ADC_CHANNEL_TEMPSENSOR (1)(2) + * @arg @ref LL_ADC_CHANNEL_VBAT (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_SAMPLINGTIME_3CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_15CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_28CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_56CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_84CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_112CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_144CYCLES + * @arg @ref LL_ADC_SAMPLINGTIME_480CYCLES + */ +__STATIC_INLINE uint32_t LL_ADC_GetChannelSamplingTime(ADC_TypeDef *ADCx, uint32_t Channel) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->SMPR1, __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPRX_REGOFFSET_MASK)); + + return (uint32_t)(READ_BIT(*preg, + ADC_SMPR2_SMP0 << __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK)) + >> __ADC_MASK_SHIFT(Channel, ADC_CHANNEL_SMPx_BITOFFSET_MASK) + ); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_AnalogWatchdog Configuration of ADC transversal scope: analog watchdog + * @{ + */ + +/** + * @brief Set ADC analog watchdog monitored channels: + * a single channel or all channels, + * on ADC groups regular and-or injected. + * @note Once monitored channels are selected, analog watchdog + * is enabled. + * @note In case of need to define a single channel to monitor + * with analog watchdog from sequencer channel definition, + * use helper macro @ref __LL_ADC_ANALOGWD_CHANNEL_GROUP(). + * @note On this STM32 serie, there is only 1 kind of analog watchdog + * instance: + * - AWD standard (instance AWD1): + * - channels monitored: can monitor 1 channel or all channels. + * - groups monitored: ADC groups regular and-or injected. + * - resolution: resolution is not limited (corresponds to + * ADC resolution configured). + * @rmtoll CR1 AWD1CH LL_ADC_SetAnalogWDMonitChannels\n + * CR1 AWD1SGL LL_ADC_SetAnalogWDMonitChannels\n + * CR1 AWD1EN LL_ADC_SetAnalogWDMonitChannels + * @param ADCx ADC instance + * @param AWDChannelGroup This parameter can be one of the following values: + * @arg @ref LL_ADC_AWD_DISABLE + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG + * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG + * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG + * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG + * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG + * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG + * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG + * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG + * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG + * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG + * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG + * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG + * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG + * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG + * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG + * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG + * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG + * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG + * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG + * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ + * @arg @ref LL_ADC_AWD_CH_VREFINT_REG (1) + * @arg @ref LL_ADC_AWD_CH_VREFINT_INJ (1) + * @arg @ref LL_ADC_AWD_CH_VREFINT_REG_INJ (1) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG (1)(2) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_INJ (1)(2) + * @arg @ref LL_ADC_AWD_CH_TEMPSENSOR_REG_INJ (1)(2) + * @arg @ref LL_ADC_AWD_CH_VBAT_REG (1) + * @arg @ref LL_ADC_AWD_CH_VBAT_INJ (1) + * @arg @ref LL_ADC_AWD_CH_VBAT_REG_INJ (1) + * + * (1) On STM32F4, parameter available only on ADC instance: ADC1.\n + * (2) On devices STM32F42x and STM32F43x, limitation: this internal channel is shared between temperature sensor and Vbat, only 1 measurement path must be enabled. + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetAnalogWDMonitChannels(ADC_TypeDef *ADCx, uint32_t AWDChannelGroup) +{ + MODIFY_REG(ADCx->CR1, + (ADC_CR1_AWDEN | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL | ADC_CR1_AWDCH), + AWDChannelGroup); +} + +/** + * @brief Get ADC analog watchdog monitored channel. + * @note Usage of the returned channel number: + * - To reinject this channel into another function LL_ADC_xxx: + * the returned channel number is only partly formatted on definition + * of literals LL_ADC_CHANNEL_x. Therefore, it has to be compared + * with parts of literals LL_ADC_CHANNEL_x or using + * helper macro @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * Then the selected literal LL_ADC_CHANNEL_x can be used + * as parameter for another function. + * - To get the channel number in decimal format: + * process the returned value with the helper macro + * @ref __LL_ADC_CHANNEL_TO_DECIMAL_NB(). + * Applicable only when the analog watchdog is set to monitor + * one channel. + * @note On this STM32 serie, there is only 1 kind of analog watchdog + * instance: + * - AWD standard (instance AWD1): + * - channels monitored: can monitor 1 channel or all channels. + * - groups monitored: ADC groups regular and-or injected. + * - resolution: resolution is not limited (corresponds to + * ADC resolution configured). + * @rmtoll CR1 AWD1CH LL_ADC_GetAnalogWDMonitChannels\n + * CR1 AWD1SGL LL_ADC_GetAnalogWDMonitChannels\n + * CR1 AWD1EN LL_ADC_GetAnalogWDMonitChannels + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_AWD_DISABLE + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_INJ + * @arg @ref LL_ADC_AWD_ALL_CHANNELS_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG + * @arg @ref LL_ADC_AWD_CHANNEL_0_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_0_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG + * @arg @ref LL_ADC_AWD_CHANNEL_1_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_1_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG + * @arg @ref LL_ADC_AWD_CHANNEL_2_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_2_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG + * @arg @ref LL_ADC_AWD_CHANNEL_3_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_3_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG + * @arg @ref LL_ADC_AWD_CHANNEL_4_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_4_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG + * @arg @ref LL_ADC_AWD_CHANNEL_5_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_5_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG + * @arg @ref LL_ADC_AWD_CHANNEL_6_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_6_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG + * @arg @ref LL_ADC_AWD_CHANNEL_7_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_7_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG + * @arg @ref LL_ADC_AWD_CHANNEL_8_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_8_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG + * @arg @ref LL_ADC_AWD_CHANNEL_9_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_9_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG + * @arg @ref LL_ADC_AWD_CHANNEL_10_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_10_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG + * @arg @ref LL_ADC_AWD_CHANNEL_11_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_11_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG + * @arg @ref LL_ADC_AWD_CHANNEL_12_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_12_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG + * @arg @ref LL_ADC_AWD_CHANNEL_13_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_13_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG + * @arg @ref LL_ADC_AWD_CHANNEL_14_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_14_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG + * @arg @ref LL_ADC_AWD_CHANNEL_15_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_15_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG + * @arg @ref LL_ADC_AWD_CHANNEL_16_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_16_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG + * @arg @ref LL_ADC_AWD_CHANNEL_17_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_17_REG_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG + * @arg @ref LL_ADC_AWD_CHANNEL_18_INJ + * @arg @ref LL_ADC_AWD_CHANNEL_18_REG_INJ + */ +__STATIC_INLINE uint32_t LL_ADC_GetAnalogWDMonitChannels(ADC_TypeDef *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, (ADC_CR1_AWDEN | ADC_CR1_JAWDEN | ADC_CR1_AWDSGL | ADC_CR1_AWDCH))); +} + +/** + * @brief Set ADC analog watchdog threshold value of threshold + * high or low. + * @note In case of ADC resolution different of 12 bits, + * analog watchdog thresholds data require a specific shift. + * Use helper macro @ref __LL_ADC_ANALOGWD_SET_THRESHOLD_RESOLUTION(). + * @note On this STM32 serie, there is only 1 kind of analog watchdog + * instance: + * - AWD standard (instance AWD1): + * - channels monitored: can monitor 1 channel or all channels. + * - groups monitored: ADC groups regular and-or injected. + * - resolution: resolution is not limited (corresponds to + * ADC resolution configured). + * @rmtoll HTR HT LL_ADC_SetAnalogWDThresholds\n + * LTR LT LL_ADC_SetAnalogWDThresholds + * @param ADCx ADC instance + * @param AWDThresholdsHighLow This parameter can be one of the following values: + * @arg @ref LL_ADC_AWD_THRESHOLD_HIGH + * @arg @ref LL_ADC_AWD_THRESHOLD_LOW + * @param AWDThresholdValue: Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetAnalogWDThresholds(ADC_TypeDef *ADCx, uint32_t AWDThresholdsHighLow, uint32_t AWDThresholdValue) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->HTR, AWDThresholdsHighLow); + + MODIFY_REG(*preg, + ADC_HTR_HT, + AWDThresholdValue); +} + +/** + * @brief Get ADC analog watchdog threshold value of threshold high or + * threshold low. + * @note In case of ADC resolution different of 12 bits, + * analog watchdog thresholds data require a specific shift. + * Use helper macro @ref __LL_ADC_ANALOGWD_GET_THRESHOLD_RESOLUTION(). + * @rmtoll HTR HT LL_ADC_GetAnalogWDThresholds\n + * LTR LT LL_ADC_GetAnalogWDThresholds + * @param ADCx ADC instance + * @param AWDThresholdsHighLow This parameter can be one of the following values: + * @arg @ref LL_ADC_AWD_THRESHOLD_HIGH + * @arg @ref LL_ADC_AWD_THRESHOLD_LOW + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF +*/ +__STATIC_INLINE uint32_t LL_ADC_GetAnalogWDThresholds(ADC_TypeDef *ADCx, uint32_t AWDThresholdsHighLow) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->HTR, AWDThresholdsHighLow); + + return (uint32_t)(READ_BIT(*preg, ADC_HTR_HT)); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Configuration_ADC_Multimode Configuration of ADC hierarchical scope: multimode + * @{ + */ + +#if defined(ADC_MULTIMODE_SUPPORT) +/** + * @brief Set ADC multimode configuration to operate in independent mode + * or multimode (for devices with several ADC instances). + * @note If multimode configuration: the selected ADC instance is + * either master or slave depending on hardware. + * Refer to reference manual. + * @rmtoll CCR MULTI LL_ADC_SetMultimode + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param Multimode This parameter can be one of the following values: + * @arg @ref LL_ADC_MULTI_INDEPENDENT + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIMULT + * @arg @ref LL_ADC_MULTI_DUAL_REG_INTERL + * @arg @ref LL_ADC_MULTI_DUAL_INJ_SIMULT + * @arg @ref LL_ADC_MULTI_DUAL_INJ_ALTERN + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT + * @arg @ref LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT + * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_SIMULT + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIMULT + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_INTERL + * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_ALTERN + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetMultimode(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t Multimode) +{ + MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_MULTI, Multimode); +} + +/** + * @brief Get ADC multimode configuration to operate in independent mode + * or multimode (for devices with several ADC instances). + * @note If multimode configuration: the selected ADC instance is + * either master or slave depending on hardware. + * Refer to reference manual. + * @rmtoll CCR MULTI LL_ADC_GetMultimode + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_MULTI_INDEPENDENT + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIMULT + * @arg @ref LL_ADC_MULTI_DUAL_REG_INTERL + * @arg @ref LL_ADC_MULTI_DUAL_INJ_SIMULT + * @arg @ref LL_ADC_MULTI_DUAL_INJ_ALTERN + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM + * @arg @ref LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT + * @arg @ref LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT + * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_SIMULT + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_SIMULT + * @arg @ref LL_ADC_MULTI_TRIPLE_REG_INTERL + * @arg @ref LL_ADC_MULTI_TRIPLE_INJ_ALTERN + */ +__STATIC_INLINE uint32_t LL_ADC_GetMultimode(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_MULTI)); +} + +/** + * @brief Set ADC multimode conversion data transfer: no transfer + * or transfer by DMA. + * @note If ADC multimode transfer by DMA is not selected: + * each ADC uses its own DMA channel, with its individual + * DMA transfer settings. + * If ADC multimode transfer by DMA is selected: + * One DMA channel is used for both ADC (DMA of ADC master) + * Specifies the DMA requests mode: + * - Limited mode (One shot mode): DMA transfer requests are stopped + * when number of DMA data transfers (number of + * ADC conversions) is reached. + * This ADC mode is intended to be used with DMA mode non-circular. + * - Unlimited mode: DMA transfer requests are unlimited, + * whatever number of DMA data transfers (number of + * ADC conversions). + * This ADC mode is intended to be used with DMA mode circular. + * @note If ADC DMA requests mode is set to unlimited and DMA is set to + * mode non-circular: + * when DMA transfers size will be reached, DMA will stop transfers of + * ADC conversions data ADC will raise an overrun error + * (overrun flag and interruption if enabled). + * @note How to retrieve multimode conversion data: + * Whatever multimode transfer by DMA setting: using function + * @ref LL_ADC_REG_ReadMultiConversionData32(). + * If ADC multimode transfer by DMA is selected: conversion data + * is a raw data with ADC master and slave concatenated. + * A macro is available to get the conversion data of + * ADC master or ADC slave: see helper macro + * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). + * @rmtoll CCR MDMA LL_ADC_SetMultiDMATransfer\n + * CCR DDS LL_ADC_SetMultiDMATransfer + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param MultiDMATransfer This parameter can be one of the following values: + * @arg @ref LL_ADC_MULTI_REG_DMA_EACH_ADC + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_1 + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_2 + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_3 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_1 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_2 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_3 + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetMultiDMATransfer(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t MultiDMATransfer) +{ + MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_DMA | ADC_CCR_DDS, MultiDMATransfer); +} + +/** + * @brief Get ADC multimode conversion data transfer: no transfer + * or transfer by DMA. + * @note If ADC multimode transfer by DMA is not selected: + * each ADC uses its own DMA channel, with its individual + * DMA transfer settings. + * If ADC multimode transfer by DMA is selected: + * One DMA channel is used for both ADC (DMA of ADC master) + * Specifies the DMA requests mode: + * - Limited mode (One shot mode): DMA transfer requests are stopped + * when number of DMA data transfers (number of + * ADC conversions) is reached. + * This ADC mode is intended to be used with DMA mode non-circular. + * - Unlimited mode: DMA transfer requests are unlimited, + * whatever number of DMA data transfers (number of + * ADC conversions). + * This ADC mode is intended to be used with DMA mode circular. + * @note If ADC DMA requests mode is set to unlimited and DMA is set to + * mode non-circular: + * when DMA transfers size will be reached, DMA will stop transfers of + * ADC conversions data ADC will raise an overrun error + * (overrun flag and interruption if enabled). + * @note How to retrieve multimode conversion data: + * Whatever multimode transfer by DMA setting: using function + * @ref LL_ADC_REG_ReadMultiConversionData32(). + * If ADC multimode transfer by DMA is selected: conversion data + * is a raw data with ADC master and slave concatenated. + * A macro is available to get the conversion data of + * ADC master or ADC slave: see helper macro + * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). + * @rmtoll CCR MDMA LL_ADC_GetMultiDMATransfer\n + * CCR DDS LL_ADC_GetMultiDMATransfer + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_MULTI_REG_DMA_EACH_ADC + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_1 + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_2 + * @arg @ref LL_ADC_MULTI_REG_DMA_LIMIT_3 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_1 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_2 + * @arg @ref LL_ADC_MULTI_REG_DMA_UNLMT_3 + */ +__STATIC_INLINE uint32_t LL_ADC_GetMultiDMATransfer(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_DMA | ADC_CCR_DDS)); +} + +/** + * @brief Set ADC multimode delay between 2 sampling phases. + * @note The sampling delay range depends on ADC resolution: + * - ADC resolution 12 bits can have maximum delay of 12 cycles. + * - ADC resolution 10 bits can have maximum delay of 10 cycles. + * - ADC resolution 8 bits can have maximum delay of 8 cycles. + * - ADC resolution 6 bits can have maximum delay of 6 cycles. + * @rmtoll CCR DELAY LL_ADC_SetMultiTwoSamplingDelay + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param MultiTwoSamplingDelay This parameter can be one of the following values: + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES + * @retval None + */ +__STATIC_INLINE void LL_ADC_SetMultiTwoSamplingDelay(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t MultiTwoSamplingDelay) +{ + MODIFY_REG(ADCxy_COMMON->CCR, ADC_CCR_DELAY, MultiTwoSamplingDelay); +} + +/** + * @brief Get ADC multimode delay between 2 sampling phases. + * @rmtoll CCR DELAY LL_ADC_GetMultiTwoSamplingDelay + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval Returned value can be one of the following values: + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES + * @arg @ref LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES + */ +__STATIC_INLINE uint32_t LL_ADC_GetMultiTwoSamplingDelay(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CCR, ADC_CCR_DELAY)); +} +#endif /* ADC_MULTIMODE_SUPPORT */ + +/** + * @} + */ +/** @defgroup ADC_LL_EF_Operation_ADC_Instance Operation on ADC hierarchical scope: ADC instance + * @{ + */ + +/** + * @brief Enable the selected ADC instance. + * @note On this STM32 serie, after ADC enable, a delay for + * ADC internal analog stabilization is required before performing a + * ADC conversion start. + * Refer to device datasheet, parameter tSTAB. + * @rmtoll CR2 ADON LL_ADC_Enable + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_Enable(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR2, ADC_CR2_ADON); +} + +/** + * @brief Disable the selected ADC instance. + * @rmtoll CR2 ADON LL_ADC_Disable + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_Disable(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR2, ADC_CR2_ADON); +} + +/** + * @brief Get the selected ADC instance enable state. + * @rmtoll CR2 ADON LL_ADC_IsEnabled + * @param ADCx ADC instance + * @retval 0: ADC is disabled, 1: ADC is enabled. + */ +__STATIC_INLINE uint32_t LL_ADC_IsEnabled(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR2, ADC_CR2_ADON) == (ADC_CR2_ADON)); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Operation_ADC_Group_Regular Operation on ADC hierarchical scope: group regular + * @{ + */ + +/** + * @brief Start ADC group regular conversion. + * @note On this STM32 serie, this function is relevant only for + * internal trigger (SW start), not for external trigger: + * - If ADC trigger has been set to software start, ADC conversion + * starts immediately. + * - If ADC trigger has been set to external trigger, ADC conversion + * start must be performed using function + * @ref LL_ADC_REG_StartConversionExtTrig(). + * (if external trigger edge would have been set during ADC other + * settings, ADC conversion would start at trigger event + * as soon as ADC is enabled). + * @rmtoll CR2 SWSTART LL_ADC_REG_StartConversionSWStart + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_StartConversionSWStart(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR2, ADC_CR2_SWSTART); +} + +/** + * @brief Start ADC group regular conversion from external trigger. + * @note ADC conversion will start at next trigger event (on the selected + * trigger edge) following the ADC start conversion command. + * @note On this STM32 serie, this function is relevant for + * ADC conversion start from external trigger. + * If internal trigger (SW start) is needed, perform ADC conversion + * start using function @ref LL_ADC_REG_StartConversionSWStart(). + * @rmtoll CR2 EXTEN LL_ADC_REG_StartConversionExtTrig + * @param ExternalTriggerEdge This parameter can be one of the following values: + * @arg @ref LL_ADC_REG_TRIG_EXT_RISING + * @arg @ref LL_ADC_REG_TRIG_EXT_FALLING + * @arg @ref LL_ADC_REG_TRIG_EXT_RISINGFALLING + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_StartConversionExtTrig(ADC_TypeDef *ADCx, uint32_t ExternalTriggerEdge) +{ + SET_BIT(ADCx->CR2, ExternalTriggerEdge); +} + +/** + * @brief Stop ADC group regular conversion from external trigger. + * @note No more ADC conversion will start at next trigger event + * following the ADC stop conversion command. + * If a conversion is on-going, it will be completed. + * @note On this STM32 serie, there is no specific command + * to stop a conversion on-going or to stop ADC converting + * in continuous mode. These actions can be performed + * using function @ref LL_ADC_Disable(). + * @rmtoll CR2 EXTEN LL_ADC_REG_StopConversionExtTrig + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_REG_StopConversionExtTrig(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR2, ADC_CR2_EXTEN); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * all ADC configurations: all ADC resolutions and + * all oversampling increased data width (for devices + * with feature oversampling). + * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData32 + * @param ADCx ADC instance + * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_ADC_REG_ReadConversionData32(ADC_TypeDef *ADCx) +{ + return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * ADC resolution 12 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_REG_ReadConversionData32. + * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData12 + * @param ADCx ADC instance + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData12(ADC_TypeDef *ADCx) +{ + return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * ADC resolution 10 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_REG_ReadConversionData32. + * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData10 + * @param ADCx ADC instance + * @retval Value between Min_Data=0x000 and Max_Data=0x3FF + */ +__STATIC_INLINE uint16_t LL_ADC_REG_ReadConversionData10(ADC_TypeDef *ADCx) +{ + return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * ADC resolution 8 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_REG_ReadConversionData32. + * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData8 + * @param ADCx ADC instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData8(ADC_TypeDef *ADCx) +{ + return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * ADC resolution 6 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_REG_ReadConversionData32. + * @rmtoll DR RDATA LL_ADC_REG_ReadConversionData6 + * @param ADCx ADC instance + * @retval Value between Min_Data=0x00 and Max_Data=0x3F + */ +__STATIC_INLINE uint8_t LL_ADC_REG_ReadConversionData6(ADC_TypeDef *ADCx) +{ + return (uint16_t)(READ_BIT(ADCx->DR, ADC_DR_DATA)); +} + +#if defined(ADC_MULTIMODE_SUPPORT) +/** + * @brief Get ADC multimode conversion data of ADC master, ADC slave + * or raw data with ADC master and slave concatenated. + * @note If raw data with ADC master and slave concatenated is retrieved, + * a macro is available to get the conversion data of + * ADC master or ADC slave: see helper macro + * @ref __LL_ADC_MULTI_CONV_DATA_MASTER_SLAVE(). + * (however this macro is mainly intended for multimode + * transfer by DMA, because this function can do the same + * by getting multimode conversion data of ADC master or ADC slave + * separately). + * @rmtoll CDR DATA1 LL_ADC_REG_ReadMultiConversionData32\n + * CDR DATA2 LL_ADC_REG_ReadMultiConversionData32 + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param ConversionData This parameter can be one of the following values: + * @arg @ref LL_ADC_MULTI_MASTER + * @arg @ref LL_ADC_MULTI_SLAVE + * @arg @ref LL_ADC_MULTI_MASTER_SLAVE + * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_ADC_REG_ReadMultiConversionData32(ADC_Common_TypeDef *ADCxy_COMMON, uint32_t ConversionData) +{ + return (uint32_t)(READ_BIT(ADCxy_COMMON->CDR, + ADC_DR_ADC2DATA) + >> POSITION_VAL(ConversionData) + ); +} +#endif /* ADC_MULTIMODE_SUPPORT */ + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_Operation_ADC_Group_Injected Operation on ADC hierarchical scope: group injected + * @{ + */ + +/** + * @brief Start ADC group injected conversion. + * @note On this STM32 serie, this function is relevant only for + * internal trigger (SW start), not for external trigger: + * - If ADC trigger has been set to software start, ADC conversion + * starts immediately. + * - If ADC trigger has been set to external trigger, ADC conversion + * start must be performed using function + * @ref LL_ADC_INJ_StartConversionExtTrig(). + * (if external trigger edge would have been set during ADC other + * settings, ADC conversion would start at trigger event + * as soon as ADC is enabled). + * @rmtoll CR2 JSWSTART LL_ADC_INJ_StartConversionSWStart + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_StartConversionSWStart(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR2, ADC_CR2_JSWSTART); +} + +/** + * @brief Start ADC group injected conversion from external trigger. + * @note ADC conversion will start at next trigger event (on the selected + * trigger edge) following the ADC start conversion command. + * @note On this STM32 serie, this function is relevant for + * ADC conversion start from external trigger. + * If internal trigger (SW start) is needed, perform ADC conversion + * start using function @ref LL_ADC_INJ_StartConversionSWStart(). + * @rmtoll CR2 JEXTEN LL_ADC_INJ_StartConversionExtTrig + * @param ExternalTriggerEdge This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_TRIG_EXT_RISING + * @arg @ref LL_ADC_INJ_TRIG_EXT_FALLING + * @arg @ref LL_ADC_INJ_TRIG_EXT_RISINGFALLING + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_StartConversionExtTrig(ADC_TypeDef *ADCx, uint32_t ExternalTriggerEdge) +{ + SET_BIT(ADCx->CR2, ExternalTriggerEdge); +} + +/** + * @brief Stop ADC group injected conversion from external trigger. + * @note No more ADC conversion will start at next trigger event + * following the ADC stop conversion command. + * If a conversion is on-going, it will be completed. + * @note On this STM32 serie, there is no specific command + * to stop a conversion on-going or to stop ADC converting + * in continuous mode. These actions can be performed + * using function @ref LL_ADC_Disable(). + * @rmtoll CR2 JEXTEN LL_ADC_INJ_StopConversionExtTrig + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_INJ_StopConversionExtTrig(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR2, ADC_CR2_JEXTEN); +} + +/** + * @brief Get ADC group regular conversion data, range fit for + * all ADC configurations: all ADC resolutions and + * all oversampling increased data width (for devices + * with feature oversampling). + * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData32\n + * JDR2 JDATA LL_ADC_INJ_ReadConversionData32\n + * JDR3 JDATA LL_ADC_INJ_ReadConversionData32\n + * JDR4 JDATA LL_ADC_INJ_ReadConversionData32 + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x00000000 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_ADC_INJ_ReadConversionData32(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); + + return (uint32_t)(READ_BIT(*preg, + ADC_JDR1_JDATA) + ); +} + +/** + * @brief Get ADC group injected conversion data, range fit for + * ADC resolution 12 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_INJ_ReadConversionData32. + * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData12\n + * JDR2 JDATA LL_ADC_INJ_ReadConversionData12\n + * JDR3 JDATA LL_ADC_INJ_ReadConversionData12\n + * JDR4 JDATA LL_ADC_INJ_ReadConversionData12 + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +__STATIC_INLINE uint16_t LL_ADC_INJ_ReadConversionData12(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); + + return (uint16_t)(READ_BIT(*preg, + ADC_JDR1_JDATA) + ); +} + +/** + * @brief Get ADC group injected conversion data, range fit for + * ADC resolution 10 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_INJ_ReadConversionData32. + * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData10\n + * JDR2 JDATA LL_ADC_INJ_ReadConversionData10\n + * JDR3 JDATA LL_ADC_INJ_ReadConversionData10\n + * JDR4 JDATA LL_ADC_INJ_ReadConversionData10 + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x000 and Max_Data=0x3FF + */ +__STATIC_INLINE uint16_t LL_ADC_INJ_ReadConversionData10(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); + + return (uint16_t)(READ_BIT(*preg, + ADC_JDR1_JDATA) + ); +} + +/** + * @brief Get ADC group injected conversion data, range fit for + * ADC resolution 8 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_INJ_ReadConversionData32. + * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData8\n + * JDR2 JDATA LL_ADC_INJ_ReadConversionData8\n + * JDR3 JDATA LL_ADC_INJ_ReadConversionData8\n + * JDR4 JDATA LL_ADC_INJ_ReadConversionData8 + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_ADC_INJ_ReadConversionData8(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); + + return (uint8_t)(READ_BIT(*preg, + ADC_JDR1_JDATA) + ); +} + +/** + * @brief Get ADC group injected conversion data, range fit for + * ADC resolution 6 bits. + * @note For devices with feature oversampling: Oversampling + * can increase data width, function for extended range + * may be needed: @ref LL_ADC_INJ_ReadConversionData32. + * @rmtoll JDR1 JDATA LL_ADC_INJ_ReadConversionData6\n + * JDR2 JDATA LL_ADC_INJ_ReadConversionData6\n + * JDR3 JDATA LL_ADC_INJ_ReadConversionData6\n + * JDR4 JDATA LL_ADC_INJ_ReadConversionData6 + * @param ADCx ADC instance + * @param Rank This parameter can be one of the following values: + * @arg @ref LL_ADC_INJ_RANK_1 + * @arg @ref LL_ADC_INJ_RANK_2 + * @arg @ref LL_ADC_INJ_RANK_3 + * @arg @ref LL_ADC_INJ_RANK_4 + * @retval Value between Min_Data=0x00 and Max_Data=0x3F + */ +__STATIC_INLINE uint8_t LL_ADC_INJ_ReadConversionData6(ADC_TypeDef *ADCx, uint32_t Rank) +{ + register uint32_t *preg = __ADC_PTR_REG_OFFSET(ADCx->JDR1, __ADC_MASK_SHIFT(Rank, ADC_INJ_JDRX_REGOFFSET_MASK)); + + return (uint8_t)(READ_BIT(*preg, + ADC_JDR1_JDATA) + ); +} + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_FLAG_Management ADC flag management + * @{ + */ + +/** + * @brief Get flag ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll SR EOC LL_ADC_IsActiveFlag_EOCS + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_EOCS(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->SR, LL_ADC_FLAG_EOCS) == (LL_ADC_FLAG_EOCS)); +} + +/** + * @brief Get flag ADC group regular overrun. + * @rmtoll SR OVR LL_ADC_IsActiveFlag_OVR + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_OVR(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->SR, LL_ADC_FLAG_OVR) == (LL_ADC_FLAG_OVR)); +} + + +/** + * @brief Get flag ADC group injected end of sequence conversions. + * @rmtoll SR JEOC LL_ADC_IsActiveFlag_JEOS + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_JEOS(ADC_TypeDef *ADCx) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + return (READ_BIT(ADCx->SR, LL_ADC_FLAG_JEOS) == (LL_ADC_FLAG_JEOS)); +} + +/** + * @brief Get flag ADC analog watchdog 1 flag + * @rmtoll SR AWD LL_ADC_IsActiveFlag_AWD1 + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_AWD1(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->SR, LL_ADC_FLAG_AWD1) == (LL_ADC_FLAG_AWD1)); +} + +/** + * @brief Clear flag ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll SR EOC LL_ADC_ClearFlag_EOCS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_ClearFlag_EOCS(ADC_TypeDef *ADCx) +{ + WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_EOCS); +} + +/** + * @brief Clear flag ADC group regular overrun. + * @rmtoll SR OVR LL_ADC_ClearFlag_OVR + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_ClearFlag_OVR(ADC_TypeDef *ADCx) +{ + WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_OVR); +} + + +/** + * @brief Clear flag ADC group injected end of sequence conversions. + * @rmtoll SR JEOC LL_ADC_ClearFlag_JEOS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_ClearFlag_JEOS(ADC_TypeDef *ADCx) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_JEOS); +} + +/** + * @brief Clear flag ADC analog watchdog 1. + * @rmtoll SR AWD LL_ADC_ClearFlag_AWD1 + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_ClearFlag_AWD1(ADC_TypeDef *ADCx) +{ + WRITE_REG(ADCx->SR, ~LL_ADC_FLAG_AWD1); +} + +#if defined(ADC_MULTIMODE_SUPPORT) +/** + * @brief Get flag multimode ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration, of the ADC master. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll CSR EOC1 LL_ADC_IsActiveFlag_MST_EOCS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_EOCS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADC1->SR, LL_ADC_FLAG_EOCS) == (LL_ADC_FLAG_EOCS)); +} + +/** + * @brief Get flag multimode ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration, of the ADC slave 1. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll CSR EOC2 LL_ADC_IsActiveFlag_SLV1_EOCS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_EOCS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_EOCS_SLV1) == (LL_ADC_FLAG_EOCS_SLV1)); +} + +/** + * @brief Get flag multimode ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration, of the ADC slave 2. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll CSR EOC3 LL_ADC_IsActiveFlag_SLV2_EOCS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_EOCS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_EOCS_SLV2) == (LL_ADC_FLAG_EOCS_SLV2)); +} +/** + * @brief Get flag multimode ADC group regular overrun of the ADC master. + * @rmtoll CSR OVR1 LL_ADC_IsActiveFlag_MST_OVR + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_OVR(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_MST) == (LL_ADC_FLAG_OVR_MST)); +} + +/** + * @brief Get flag multimode ADC group regular overrun of the ADC slave 1. + * @rmtoll CSR OVR2 LL_ADC_IsActiveFlag_SLV1_OVR + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_OVR(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_SLV1) == (LL_ADC_FLAG_OVR_SLV1)); +} + +/** + * @brief Get flag multimode ADC group regular overrun of the ADC slave 2. + * @rmtoll CSR OVR3 LL_ADC_IsActiveFlag_SLV2_OVR + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_OVR(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_OVR_SLV2) == (LL_ADC_FLAG_OVR_SLV2)); +} + + +/** + * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC master. + * @rmtoll CSR JEOC LL_ADC_IsActiveFlag_MST_EOCS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_JEOS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC1) == (ADC_CSR_JEOC1)); +} + +/** + * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC slave 1. + * @rmtoll CSR JEOC2 LL_ADC_IsActiveFlag_SLV1_JEOS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_JEOS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC2) == (ADC_CSR_JEOC2)); +} + +/** + * @brief Get flag multimode ADC group injected end of sequence conversions of the ADC slave 2. + * @rmtoll CSR JEOC3 LL_ADC_IsActiveFlag_SLV2_JEOS + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_JEOS(ADC_Common_TypeDef *ADCxy_COMMON) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + return (READ_BIT(ADCxy_COMMON->CSR, ADC_CSR_JEOC3) == (ADC_CSR_JEOC3)); +} + +/** + * @brief Get flag multimode ADC analog watchdog 1 of the ADC master. + * @rmtoll CSR AWD1 LL_ADC_IsActiveFlag_MST_AWD1 + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_MST_AWD1(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_MST) == (LL_ADC_FLAG_AWD1_MST)); +} + +/** + * @brief Get flag multimode analog watchdog 1 of the ADC slave 1. + * @rmtoll CSR AWD2 LL_ADC_IsActiveFlag_SLV1_AWD1 + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV1_AWD1(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_SLV1) == (LL_ADC_FLAG_AWD1_SLV1)); +} + +/** + * @brief Get flag multimode analog watchdog 1 of the ADC slave 2. + * @rmtoll CSR AWD3 LL_ADC_IsActiveFlag_SLV2_AWD1 + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsActiveFlag_SLV2_AWD1(ADC_Common_TypeDef *ADCxy_COMMON) +{ + return (READ_BIT(ADCxy_COMMON->CSR, LL_ADC_FLAG_AWD1_SLV2) == (LL_ADC_FLAG_AWD1_SLV2)); +} + +#endif /* ADC_MULTIMODE_SUPPORT */ + +/** + * @} + */ + +/** @defgroup ADC_LL_EF_IT_Management ADC IT management + * @{ + */ + +/** + * @brief Enable interruption ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll CR1 EOCIE LL_ADC_EnableIT_EOCS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_EnableIT_EOCS(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR1, LL_ADC_IT_EOCS); +} + +/** + * @brief Enable ADC group regular interruption overrun. + * @rmtoll CR1 OVRIE LL_ADC_EnableIT_OVR + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_EnableIT_OVR(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR1, LL_ADC_IT_OVR); +} + + +/** + * @brief Enable interruption ADC group injected end of sequence conversions. + * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_EnableIT_JEOS(ADC_TypeDef *ADCx) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + SET_BIT(ADCx->CR1, LL_ADC_IT_JEOS); +} + +/** + * @brief Enable interruption ADC analog watchdog 1. + * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_EnableIT_AWD1(ADC_TypeDef *ADCx) +{ + SET_BIT(ADCx->CR1, LL_ADC_IT_AWD1); +} + +/** + * @brief Disable interruption ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * @rmtoll CR1 EOCIE LL_ADC_DisableIT_EOCS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_DisableIT_EOCS(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR1, LL_ADC_IT_EOCS); +} + +/** + * @brief Disable interruption ADC group regular overrun. + * @rmtoll CR1 OVRIE LL_ADC_DisableIT_OVR + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_DisableIT_OVR(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR1, LL_ADC_IT_OVR); +} + + +/** + * @brief Disable interruption ADC group injected end of sequence conversions. + * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_DisableIT_JEOS(ADC_TypeDef *ADCx) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + CLEAR_BIT(ADCx->CR1, LL_ADC_IT_JEOS); +} + +/** + * @brief Disable interruption ADC analog watchdog 1. + * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void LL_ADC_DisableIT_AWD1(ADC_TypeDef *ADCx) +{ + CLEAR_BIT(ADCx->CR1, LL_ADC_IT_AWD1); +} + +/** + * @brief Get state of interruption ADC group regular end of unitary conversion + * or end of sequence conversions, depending on + * ADC configuration. + * @note To configure flag of end of conversion, + * use function @ref LL_ADC_REG_SetFlagEndOfConversion(). + * (0: interrupt disabled, 1: interrupt enabled) + * @rmtoll CR1 EOCIE LL_ADC_IsEnabledIT_EOCS + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_EOCS(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR1, LL_ADC_IT_EOCS) == (LL_ADC_IT_EOCS)); +} + +/** + * @brief Get state of interruption ADC group regular overrun + * (0: interrupt disabled, 1: interrupt enabled). + * @rmtoll CR1 OVRIE LL_ADC_IsEnabledIT_OVR + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_OVR(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR1, LL_ADC_IT_OVR) == (LL_ADC_IT_OVR)); +} + + +/** + * @brief Get state of interruption ADC group injected end of sequence conversions + * (0: interrupt disabled, 1: interrupt enabled). + * @rmtoll CR1 JEOCIE LL_ADC_EnableIT_JEOS + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_JEOS(ADC_TypeDef *ADCx) +{ + /* Note: on this STM32 serie, there is no flag ADC group injected */ + /* end of unitary conversion. */ + /* Flag noted as "JEOC" is corresponding to flag "JEOS" */ + /* in other STM32 families). */ + return (READ_BIT(ADCx->CR1, LL_ADC_IT_JEOS) == (LL_ADC_IT_JEOS)); +} + +/** + * @brief Get state of interruption ADC analog watchdog 1 + * (0: interrupt disabled, 1: interrupt enabled). + * @rmtoll CR1 AWDIE LL_ADC_EnableIT_AWD1 + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_ADC_IsEnabledIT_AWD1(ADC_TypeDef *ADCx) +{ + return (READ_BIT(ADCx->CR1, LL_ADC_IT_AWD1) == (LL_ADC_IT_AWD1)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup ADC_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +/* Initialization of some features of ADC common parameters and multimode */ +ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON); +ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); +void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); + +/* De-initialization of ADC instance, ADC group regular and ADC group injected */ +/* (availability of ADC group injected depends on STM32 families) */ +ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx); + +/* Initialization of some features of ADC instance */ +ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct); +void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct); + +/* Initialization of some features of ADC instance and ADC group regular */ +ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct); +void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct); + +/* Initialization of some features of ADC instance and ADC group injected */ +ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct); +void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* ADC1 || ADC2 || ADC3 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_ADC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h new file mode 100644 index 0000000..28bcc1d --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h @@ -0,0 +1,2126 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_bus.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of BUS LL module. + + @verbatim + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (++) AHB & APB peripherals, 1 dummy read is necessary + + [..] + Workarounds: + (#) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each LL_{BUS}_GRP{x}_EnableClock() function. + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_BUS_H +#define __STM32F4xx_LL_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup BUS_LL BUS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Constants BUS Exported Constants + * @{ + */ + +/** @defgroup BUS_LL_EC_AHB1_GRP1_PERIPH AHB1 GRP1 PERIPH + * @{ + */ +#define LL_AHB1_GRP1_PERIPH_ALL 0xFFFFFFFFU +#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHB1ENR_GPIOAEN +#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHB1ENR_GPIOBEN +#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHB1ENR_GPIOCEN +#if defined(GPIOD) +#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHB1ENR_GPIODEN +#endif /* GPIOD */ +#if defined(GPIOE) +#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHB1ENR_GPIOEEN +#endif /* GPIOE */ +#if defined(GPIOF) +#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHB1ENR_GPIOFEN +#endif /* GPIOF */ +#if defined(GPIOG) +#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHB1ENR_GPIOGEN +#endif /* GPIOG */ +#if defined(GPIOH) +#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHB1ENR_GPIOHEN +#endif /* GPIOH */ +#if defined(GPIOI) +#define LL_AHB1_GRP1_PERIPH_GPIOI RCC_AHB1ENR_GPIOIEN +#endif /* GPIOI */ +#if defined(GPIOJ) +#define LL_AHB1_GRP1_PERIPH_GPIOJ RCC_AHB1ENR_GPIOJEN +#endif /* GPIOJ */ +#if defined(GPIOK) +#define LL_AHB1_GRP1_PERIPH_GPIOK RCC_AHB1ENR_GPIOKEN +#endif /* GPIOK */ +#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHB1ENR_CRCEN +#if defined(RCC_AHB1ENR_BKPSRAMEN) +#define LL_AHB1_GRP1_PERIPH_BKPSRAM RCC_AHB1ENR_BKPSRAMEN +#endif /* RCC_AHB1ENR_BKPSRAMEN */ +#if defined(RCC_AHB1ENR_CCMDATARAMEN) +#define LL_AHB1_GRP1_PERIPH_CCMDATARAM RCC_AHB1ENR_CCMDATARAMEN +#endif /* RCC_AHB1ENR_CCMDATARAMEN */ +#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHB1ENR_DMA1EN +#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHB1ENR_DMA2EN +#if defined(RCC_AHB1ENR_RNGEN) +#define LL_AHB1_GRP1_PERIPH_RNG RCC_AHB1ENR_RNGEN +#endif /* RCC_AHB1ENR_RNGEN */ +#if defined(DMA2D) +#define LL_AHB1_GRP1_PERIPH_DMA2D RCC_AHB1ENR_DMA2DEN +#endif /* DMA2D */ +#if defined(ETH) +#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHB1ENR_ETHMACEN +#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHB1ENR_ETHMACTXEN +#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHB1ENR_ETHMACRXEN +#define LL_AHB1_GRP1_PERIPH_ETHMACPTP RCC_AHB1ENR_ETHMACPTPEN +#endif /* ETH */ +#if defined(USB_OTG_HS) +#define LL_AHB1_GRP1_PERIPH_OTGHS RCC_AHB1ENR_OTGHSEN +#define LL_AHB1_GRP1_PERIPH_OTGHSULPI RCC_AHB1ENR_OTGHSULPIEN +#endif /* USB_OTG_HS */ +#define LL_AHB1_GRP1_PERIPH_FLITF RCC_AHB1LPENR_FLITFLPEN +#define LL_AHB1_GRP1_PERIPH_SRAM1 RCC_AHB1LPENR_SRAM1LPEN +#if defined(RCC_AHB1LPENR_SRAM2LPEN) +#define LL_AHB1_GRP1_PERIPH_SRAM2 RCC_AHB1LPENR_SRAM2LPEN +#endif /* RCC_AHB1LPENR_SRAM2LPEN */ +#if defined(RCC_AHB1LPENR_SRAM3LPEN) +#define LL_AHB1_GRP1_PERIPH_SRAM3 RCC_AHB1LPENR_SRAM3LPEN +#endif /* RCC_AHB1LPENR_SRAM3LPEN */ +/** + * @} + */ + +#if defined(RCC_AHB2_SUPPORT) +/** @defgroup BUS_LL_EC_AHB2_GRP1_PERIPH AHB2 GRP1 PERIPH + * @{ + */ +#define LL_AHB2_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(DCMI) +#define LL_AHB2_GRP1_PERIPH_DCMI RCC_AHB2ENR_DCMIEN +#endif /* DCMI */ +#if defined(CRYP) +#define LL_AHB2_GRP1_PERIPH_CRYP RCC_AHB2ENR_CRYPEN +#endif /* CRYP */ +#if defined(AES) +#define LL_AHB2_GRP1_PERIPH_AES RCC_AHB2ENR_AESEN +#endif /* AES */ +#if defined(HASH) +#define LL_AHB2_GRP1_PERIPH_HASH RCC_AHB2ENR_HASHEN +#endif /* HASH */ +#if defined(RCC_AHB2ENR_RNGEN) +#define LL_AHB2_GRP1_PERIPH_RNG RCC_AHB2ENR_RNGEN +#endif /* RCC_AHB2ENR_RNGEN */ +#if defined(USB_OTG_FS) +#define LL_AHB2_GRP1_PERIPH_OTGFS RCC_AHB2ENR_OTGFSEN +#endif /* USB_OTG_FS */ +/** + * @} + */ +#endif /* RCC_AHB2_SUPPORT */ + +#if defined(RCC_AHB3_SUPPORT) +/** @defgroup BUS_LL_EC_AHB3_GRP1_PERIPH AHB3 GRP1 PERIPH + * @{ + */ +#define LL_AHB3_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(FSMC_Bank1) +#define LL_AHB3_GRP1_PERIPH_FSMC RCC_AHB3ENR_FSMCEN +#endif /* FSMC_Bank1 */ +#if defined(FMC_Bank1) +#define LL_AHB3_GRP1_PERIPH_FMC RCC_AHB3ENR_FMCEN +#endif /* FMC_Bank1 */ +#if defined(QUADSPI) +#define LL_AHB3_GRP1_PERIPH_QSPI RCC_AHB3ENR_QSPIEN +#endif /* QUADSPI */ +/** + * @} + */ +#endif /* RCC_AHB3_SUPPORT */ + +/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH + * @{ + */ +#define LL_APB1_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(TIM2) +#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN +#endif /* TIM2 */ +#if defined(TIM3) +#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN +#endif /* TIM3 */ +#if defined(TIM4) +#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN +#endif /* TIM4 */ +#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN +#if defined(TIM6) +#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN +#endif /* TIM6 */ +#if defined(TIM7) +#define LL_APB1_GRP1_PERIPH_TIM7 RCC_APB1ENR_TIM7EN +#endif /* TIM7 */ +#if defined(TIM12) +#define LL_APB1_GRP1_PERIPH_TIM12 RCC_APB1ENR_TIM12EN +#endif /* TIM12 */ +#if defined(TIM13) +#define LL_APB1_GRP1_PERIPH_TIM13 RCC_APB1ENR_TIM13EN +#endif /* TIM13 */ +#if defined(TIM14) +#define LL_APB1_GRP1_PERIPH_TIM14 RCC_APB1ENR_TIM14EN +#endif /* TIM14 */ +#if defined(LPTIM1) +#define LL_APB1_GRP1_PERIPH_LPTIM1 RCC_APB1ENR_LPTIM1EN +#endif /* LPTIM1 */ +#if defined(RCC_APB1ENR_RTCAPBEN) +#define LL_APB1_GRP1_PERIPH_RTCAPB RCC_APB1ENR_RTCAPBEN +#endif /* RCC_APB1ENR_RTCAPBEN */ +#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN +#if defined(SPI2) +#define LL_APB1_GRP1_PERIPH_SPI2 RCC_APB1ENR_SPI2EN +#endif /* SPI2 */ +#if defined(SPI3) +#define LL_APB1_GRP1_PERIPH_SPI3 RCC_APB1ENR_SPI3EN +#endif /* SPI3 */ +#if defined(SPDIFRX) +#define LL_APB1_GRP1_PERIPH_SPDIFRX RCC_APB1ENR_SPDIFRXEN +#endif /* SPDIFRX */ +#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN +#if defined(USART3) +#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN +#endif /* USART3 */ +#if defined(UART4) +#define LL_APB1_GRP1_PERIPH_UART4 RCC_APB1ENR_UART4EN +#endif /* UART4 */ +#if defined(UART5) +#define LL_APB1_GRP1_PERIPH_UART5 RCC_APB1ENR_UART5EN +#endif /* UART5 */ +#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN +#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN +#if defined(I2C3) +#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN +#endif /* I2C3 */ +#if defined(FMPI2C1) +#define LL_APB1_GRP1_PERIPH_FMPI2C1 RCC_APB1ENR_FMPI2C1EN +#endif /* FMPI2C1 */ +#if defined(CAN1) +#define LL_APB1_GRP1_PERIPH_CAN1 RCC_APB1ENR_CAN1EN +#endif /* CAN1 */ +#if defined(CAN2) +#define LL_APB1_GRP1_PERIPH_CAN2 RCC_APB1ENR_CAN2EN +#endif /* CAN2 */ +#if defined(CAN3) +#define LL_APB1_GRP1_PERIPH_CAN3 RCC_APB1ENR_CAN3EN +#endif /* CAN3 */ +#if defined(CEC) +#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN +#endif /* CEC */ +#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN +#if defined(DAC1) +#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN +#endif /* DAC1 */ +#if defined(UART7) +#define LL_APB1_GRP1_PERIPH_UART7 RCC_APB1ENR_UART7EN +#endif /* UART7 */ +#if defined(UART8) +#define LL_APB1_GRP1_PERIPH_UART8 RCC_APB1ENR_UART8EN +#endif /* UART8 */ +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH + * @{ + */ +#define LL_APB2_GRP1_PERIPH_ALL 0xFFFFFFFFU +#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN +#if defined(TIM8) +#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN +#endif /* TIM8 */ +#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN +#if defined(USART6) +#define LL_APB2_GRP1_PERIPH_USART6 RCC_APB2ENR_USART6EN +#endif /* USART6 */ +#if defined(UART9) +#define LL_APB2_GRP1_PERIPH_UART9 RCC_APB2ENR_UART9EN +#endif /* UART9 */ +#if defined(UART10) +#define LL_APB2_GRP1_PERIPH_UART10 RCC_APB2ENR_UART10EN +#endif /* UART10 */ +#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN +#if defined(ADC2) +#define LL_APB2_GRP1_PERIPH_ADC2 RCC_APB2ENR_ADC2EN +#endif /* ADC2 */ +#if defined(ADC3) +#define LL_APB2_GRP1_PERIPH_ADC3 RCC_APB2ENR_ADC3EN +#endif /* ADC3 */ +#if defined(SDIO) +#define LL_APB2_GRP1_PERIPH_SDIO RCC_APB2ENR_SDIOEN +#endif /* SDIO */ +#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN +#if defined(SPI4) +#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN +#endif /* SPI4 */ +#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN +#if defined(RCC_APB2ENR_EXTITEN) +#define LL_APB2_GRP1_PERIPH_EXTI RCC_APB2ENR_EXTITEN +#endif /* RCC_APB2ENR_EXTITEN */ +#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN +#if defined(TIM10) +#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN +#endif /* TIM10 */ +#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN +#if defined(SPI5) +#define LL_APB2_GRP1_PERIPH_SPI5 RCC_APB2ENR_SPI5EN +#endif /* SPI5 */ +#if defined(SPI6) +#define LL_APB2_GRP1_PERIPH_SPI6 RCC_APB2ENR_SPI6EN +#endif /* SPI6 */ +#if defined(SAI1) +#define LL_APB2_GRP1_PERIPH_SAI1 RCC_APB2ENR_SAI1EN +#endif /* SAI1 */ +#if defined(SAI2) +#define LL_APB2_GRP1_PERIPH_SAI2 RCC_APB2ENR_SAI2EN +#endif /* SAI2 */ +#if defined(LTDC) +#define LL_APB2_GRP1_PERIPH_LTDC RCC_APB2ENR_LTDCEN +#endif /* LTDC */ +#if defined(DSI) +#define LL_APB2_GRP1_PERIPH_DSI RCC_APB2ENR_DSIEN +#endif /* DSI */ +#if defined(DFSDM1_Channel0) +#define LL_APB2_GRP1_PERIPH_DFSDM1 RCC_APB2ENR_DFSDM1EN +#endif /* DFSDM1_Channel0 */ +#if defined(DFSDM2_Channel0) +#define LL_APB2_GRP1_PERIPH_DFSDM2 RCC_APB2ENR_DFSDM2EN +#endif /* DFSDM2_Channel0 */ +#define LL_APB2_GRP1_PERIPH_ADC RCC_APB2RSTR_ADCRST +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions + * @{ + */ + +/** @defgroup BUS_LL_EF_AHB1 AHB1 + * @{ + */ + +/** + * @brief Enable AHB1 peripherals clock. + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB1ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB1 peripheral clock is enabled or not + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB1ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB1 peripherals clock. + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1ENR, Periphs); +} + +/** + * @brief Force AHB1 peripherals reset. + * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIODRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOERST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR CRCRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA1RST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA2RST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR RNGRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_ALL + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB1RSTR, Periphs); +} + +/** + * @brief Release AHB1 peripherals reset. + * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR CRCRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA1RST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA2RST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR RNGRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_ALL + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1RSTR, Periphs); +} + +/** + * @brief Enable AHB1 peripheral clocks in low-power mode + * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR CRCLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR RNGLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB1LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB1 peripheral clocks in low-power mode + * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR CRCLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR RNGLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1LPENR, Periphs); +} + +/** + * @} + */ + +#if defined(RCC_AHB2_SUPPORT) +/** @defgroup BUS_LL_EF_AHB2 AHB2 + * @{ + */ + +/** + * @brief Enable AHB2 peripherals clock. + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB2ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB2ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB2 peripheral clock is enabled or not + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB2_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB2ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB2 peripherals clock. + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2ENR, Periphs); +} + +/** + * @brief Force AHB2 peripherals reset. + * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR CRYPRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR AESRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR HASHRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR RNGRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB2RSTR, Periphs); +} + +/** + * @brief Release AHB2 peripherals reset. + * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR CRYPRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR AESRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR HASHRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR RNGRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2RSTR, Periphs); +} + +/** + * @brief Enable AHB2 peripheral clocks in low-power mode + * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR AESLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR HASHLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR RNGLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB2LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB2LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB2 peripheral clocks in low-power mode + * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR AESLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR HASHLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR RNGLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2LPENR, Periphs); +} + +/** + * @} + */ +#endif /* RCC_AHB2_SUPPORT */ + +#if defined(RCC_AHB3_SUPPORT) +/** @defgroup BUS_LL_EF_AHB3 AHB3 + * @{ + */ + +/** + * @brief Enable AHB3 peripherals clock. + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_EnableClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_EnableClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB3ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB3ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB3 peripheral clock is enabled or not + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_IsEnabledClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_IsEnabledClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB3_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB3ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB3 peripherals clock. + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_DisableClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_DisableClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3ENR, Periphs); +} + +/** + * @brief Force AHB3 peripherals reset. + * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ForceReset\n + * AHB3RSTR FSMCRST LL_AHB3_GRP1_ForceReset\n + * AHB3RSTR QSPIRST LL_AHB3_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_ALL + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB3RSTR, Periphs); +} + +/** + * @brief Release AHB3 peripherals reset. + * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ReleaseReset\n + * AHB3RSTR FSMCRST LL_AHB3_GRP1_ReleaseReset\n + * AHB3RSTR QSPIRST LL_AHB3_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3RSTR, Periphs); +} + +/** + * @brief Enable AHB3 peripheral clocks in low-power mode + * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n + * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n + * AHB3LPENR QSPILPEN LL_AHB3_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB3LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB3LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB3 peripheral clocks in low-power mode + * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n + * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n + * AHB3LPENR QSPILPEN LL_AHB3_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3LPENR, Periphs); +} + +/** + * @} + */ +#endif /* RCC_AHB3_SUPPORT */ + +/** @defgroup BUS_LL_EF_APB1 APB1 + * @{ + */ + +/** + * @brief Enable APB1 peripherals clock. + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_EnableClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART4EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n + * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n + * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART7EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART8EN LL_APB1_GRP1_EnableClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB1ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB1ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if APB1 peripheral clock is enabled or not + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART4EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART7EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART8EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_APB1_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->APB1ENR, Periphs) == Periphs); +} + +/** + * @brief Disable APB1 peripherals clock. + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_DisableClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART4EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n + * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n + * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART7EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART8EN LL_APB1_GRP1_DisableClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1ENR, Periphs); +} + +/** + * @brief Force APB1 peripherals reset. + * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM4RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM5RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM6RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM7RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM12RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM13RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM14RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR LPTIM1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART4RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART7RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART8RST LL_APB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @brief Release APB1 peripherals reset. + * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM4RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM5RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM6RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM7RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM12RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM13RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM14RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR LPTIM1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART4RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART7RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART8RST LL_APB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @brief Enable APB1 peripheral clocks in low-power mode + * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM4LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM5LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM6LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM7LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM12LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM13LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM14LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR WWDGLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPI2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPI3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR USART2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR USART3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART4LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART5LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CECLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR PWRLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR DACLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART7LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART8LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB1LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB1LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable APB1 peripheral clocks in low-power mode + * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM4LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM5LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM6LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM7LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM12LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM13LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM14LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR WWDGLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPI2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPI3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR USART2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR USART3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART4LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART5LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CECLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR PWRLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR DACLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART7LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART8LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1LPENR, Periphs); +} + +/** + * @} + */ + +/** @defgroup BUS_LL_EF_APB2 APB2 + * @{ + */ + +/** + * @brief Enable APB2 peripherals clock. + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART6EN LL_APB2_GRP1_EnableClock\n + * APB2ENR UART9EN LL_APB2_GRP1_EnableClock\n + * APB2ENR UART10EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_EnableClock\n + * APB2ENR DSIEN LL_APB2_GRP1_EnableClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB2ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if APB2 peripheral clock is enabled or not + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART6EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR UART9EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR UART10EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DSIEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_APB2_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->APB2ENR, Periphs) == Periphs); +} + +/** + * @brief Disable APB2 peripherals clock. + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART6EN LL_APB2_GRP1_DisableClock\n + * APB2ENR UART9EN LL_APB2_GRP1_DisableClock\n + * APB2ENR UART10EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_DisableClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_DisableClock\n + * APB2ENR DSIEN LL_APB2_GRP1_DisableClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2ENR, Periphs); +} + +/** + * @brief Force APB2 peripherals reset. + * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART6RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR UART9RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR UART10RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR ADCRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SDIORST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SYSCFGRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI5RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI6RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SAI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SAI2RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR LTDCRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DSIRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DFSDM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DFSDM2RST LL_APB2_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_ALL + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @brief Release APB2 peripherals reset. + * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART6RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR UART9RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR UART10RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR ADCRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SDIORST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SYSCFGRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI5RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI6RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SAI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SAI2RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR LTDCRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DSIRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DFSDM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DFSDM2RST LL_APB2_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_ALL + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @brief Enable APB2 peripheral clocks in low-power mode + * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM8LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR USART1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR USART6LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR UART9LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR UART10LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC2LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC3LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SDIOLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI4LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR EXTITLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM9LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM10LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM11LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI5LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI6LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SAI1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SAI2LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR LTDCLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB2LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable APB2 peripheral clocks in low-power mode + * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM8LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR USART1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR USART6LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR UART9LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR UART10LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC2LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC3LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SDIOLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI4LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR EXTITLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM9LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM10LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM11LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI5LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI6LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SAI1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SAI2LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR LTDCLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2LPENR, Periphs); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_BUS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h new file mode 100644 index 0000000..d63fb85 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h @@ -0,0 +1,658 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_cortex.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of CORTEX LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL CORTEX driver contains a set of generic APIs that can be + used by user: + (+) SYSTICK configuration used by @ref LL_mDelay and @ref LL_Init1msTick + functions + (+) Low power mode configuration (SCB register of Cortex-MCU) + (+) MPU API to configure and enable regions + (MPU services provided only on some devices) + (+) API to access to MCU info (CPUID register) + (+) API to enable fault handler (SHCSR accesses) + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_CORTEX_H +#define __STM32F4xx_LL_CORTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @defgroup CORTEX_LL CORTEX + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source + * @{ + */ +#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ +#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type + * @{ + */ +#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ +#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ +#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ +/** + * @} + */ + +#if __MPU_PRESENT + +/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control + * @{ + */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ +#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ +#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION MPU Region Number + * @{ + */ +#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ +#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ +#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ +#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ +#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ +#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ +#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ +#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size + * @{ + */ +#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges + * @{ + */ +#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ +#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ +#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ +#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ +#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ +#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level + * @{ + */ +#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ +#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ +#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ +#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access + * @{ + */ +#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ +#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access + * @{ + */ +#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ +#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access + * @{ + */ +#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ +#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access + * @{ + */ +#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ +#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ +/** + * @} + */ +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions + * @{ + */ + +/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK + * @{ + */ + +/** + * @brief This function checks if the Systick counter flag is active or not. + * @note It can be used in timeout function on application side. + * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) +{ + return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); +} + +/** + * @brief Configures the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) +{ + if (Source == LL_SYSTICK_CLKSOURCE_HCLK) + { + SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } + else + { + CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } +} + +/** + * @brief Get the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + */ +__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) +{ + return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); +} + +/** + * @brief Enable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_EnableIT(void) +{ + SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Disable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_DisableIT(void) +{ + CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Checks if the SYSTICK interrupt is enabled or disabled. + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) +{ + return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE + * @{ + */ + +/** + * @brief Processor uses sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleep(void) +{ + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Processor uses deep sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) +{ + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. + * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an + * empty main application. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Do not sleep when returning to Thread mode. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the + * processor. + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) +{ + /* Set SEVEONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are + * excluded + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) +{ + /* Clear SEVEONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_HANDLER HANDLER + * @{ + */ + +/** + * @brief Enable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) +{ + /* Enable the system handler fault */ + SET_BIT(SCB->SHCSR, Fault); +} + +/** + * @brief Disable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) +{ + /* Disable the system handler fault */ + CLEAR_BIT(SCB->SHCSR, Fault); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO + * @{ + */ + +/** + * @brief Get Implementer code + * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer + * @retval Value should be equal to 0x41 for ARM + */ +__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); +} + +/** + * @brief Get Variant number (The r value in the rnpn product revision identifier) + * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant + * @retval Value between 0 and 255 (0x0: revision 0) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); +} + +/** + * @brief Get Constant number + * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant + * @retval Value should be equal to 0xF for Cortex-M4 devices + */ +__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); +} + +/** + * @brief Get Part number + * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo + * @retval Value should be equal to 0xC24 for Cortex-M4 + */ +__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); +} + +/** + * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) + * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision + * @retval Value between 0 and 255 (0x1: patch 1) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); +} + +/** + * @} + */ + +#if __MPU_PRESENT +/** @defgroup CORTEX_LL_EF_MPU MPU + * @{ + */ + +/** + * @brief Enable MPU with input options + * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable + * @param Options This parameter can be one of the following values: + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE + * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI + * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF + * @retval None + */ +__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) +{ + /* Enable the MPU*/ + WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); + /* Ensure MPU settings take effects */ + __DSB(); + /* Sequence instruction fetches using update settings */ + __ISB(); +} + +/** + * @brief Disable MPU + * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable + * @retval None + */ +__STATIC_INLINE void LL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + /* Disable MPU*/ + WRITE_REG(MPU->CTRL, 0U); +} + +/** + * @brief Check if MPU is enabled or not + * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) +{ + return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); +} + +/** + * @brief Enable a MPU region + * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Enable the MPU region */ + SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Configure and enable a region + * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR ADDR LL_MPU_ConfigRegion\n + * MPU_RASR XN LL_MPU_ConfigRegion\n + * MPU_RASR AP LL_MPU_ConfigRegion\n + * MPU_RASR S LL_MPU_ConfigRegion\n + * MPU_RASR C LL_MPU_ConfigRegion\n + * MPU_RASR B LL_MPU_ConfigRegion\n + * MPU_RASR SIZE LL_MPU_ConfigRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @param Address Value of region base address + * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF + * @param Attributes This parameter can be a combination of the following values: + * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B + * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB + * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB + * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB + * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB + * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB + * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS + * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO + * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 + * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE + * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE + * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE + * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE + * @retval None + */ +__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Set base address */ + WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); + /* Configure MPU */ + WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | SubRegionDisable << MPU_RASR_SRD_Pos)); +} + +/** + * @brief Disable a region + * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n + * MPU_RASR ENABLE LL_MPU_DisableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Disable the MPU region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @} + */ + +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_CORTEX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h new file mode 100644 index 0000000..32dd1d4 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_crc.h @@ -0,0 +1,212 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_crc.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of CRC LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_CRC_H +#define __STM32F4xx_LL_CRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(CRC) + +/** @defgroup CRC_LL CRC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup CRC_LL_Exported_Macros CRC Exported Macros + * @{ + */ + +/** @defgroup CRC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in CRC register + * @param __INSTANCE__ CRC Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_CRC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in CRC register + * @param __INSTANCE__ CRC Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_CRC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup CRC_LL_Exported_Functions CRC Exported Functions + * @{ + */ + +/** @defgroup CRC_LL_EF_Configuration CRC Configuration functions + * @{ + */ + +/** + * @brief Reset the CRC calculation unit. + * @rmtoll CR RESET LL_CRC_ResetCRCCalculationUnit + * @param CRCx CRC Instance + * @retval None + */ +__STATIC_INLINE void LL_CRC_ResetCRCCalculationUnit(CRC_TypeDef *CRCx) +{ + WRITE_REG(CRCx->CR, CRC_CR_RESET); +} + +/** + * @} + */ + +/** @defgroup CRC_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Write given 32-bit data to the CRC calculator + * @rmtoll DR DR LL_CRC_FeedData32 + * @param CRCx CRC Instance + * @param InData value to be provided to CRC calculator between between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_CRC_FeedData32(CRC_TypeDef *CRCx, uint32_t InData) +{ + WRITE_REG(CRCx->DR, InData); +} + +/** + * @brief Return current CRC calculation result. 32 bits value is returned. + * @rmtoll DR DR LL_CRC_ReadData32 + * @param CRCx CRC Instance + * @retval Current CRC calculation result as stored in CRC_DR register (32 bits). + */ +__STATIC_INLINE uint32_t LL_CRC_ReadData32(CRC_TypeDef *CRCx) +{ + return (uint32_t)(READ_REG(CRCx->DR)); +} + +/** + * @brief Return data stored in the Independent Data(IDR) register. + * @note This register can be used as a temporary storage location for one byte. + * @rmtoll IDR IDR LL_CRC_Read_IDR + * @param CRCx CRC Instance + * @retval Value stored in CRC_IDR register (General-purpose 8-bit data register). + */ +__STATIC_INLINE uint32_t LL_CRC_Read_IDR(CRC_TypeDef *CRCx) +{ + return (uint32_t)(READ_REG(CRCx->IDR)); +} + +/** + * @brief Store data in the Independent Data(IDR) register. + * @note This register can be used as a temporary storage location for one byte. + * @rmtoll IDR IDR LL_CRC_Write_IDR + * @param CRCx CRC Instance + * @param InData value to be stored in CRC_IDR register (8-bit) between between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_CRC_Write_IDR(CRC_TypeDef *CRCx, uint32_t InData) +{ + *((uint8_t __IO *)(&CRCx->IDR)) = (uint8_t) InData; +} +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup CRC_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(CRC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_CRC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dac.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dac.h new file mode 100644 index 0000000..4c9e8de --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dac.h @@ -0,0 +1,1440 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dac.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of DAC LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_DAC_H +#define __STM32F4xx_LL_DAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(DAC) + +/** @defgroup DAC_LL DAC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup DAC_LL_Private_Constants DAC Private Constants + * @{ + */ + +/* Internal masks for DAC channels definition */ +/* To select into literal LL_DAC_CHANNEL_x the relevant bits for: */ +/* - channel bits position into register CR */ +/* - channel bits position into register SWTRIG */ +/* - channel register offset of data holding register DHRx */ +/* - channel register offset of data output register DORx */ +#define DAC_CR_CH1_BITOFFSET 0U /* Position of channel bits into registers CR, MCR, CCR, SHHR, SHRR of channel 1 */ +#define DAC_CR_CH2_BITOFFSET 16U /* Position of channel bits into registers CR, MCR, CCR, SHHR, SHRR of channel 2 */ +#define DAC_CR_CHX_BITOFFSET_MASK (DAC_CR_CH1_BITOFFSET | DAC_CR_CH2_BITOFFSET) + +#define DAC_SWTR_CH1 (DAC_SWTRIGR_SWTRIG1) /* Channel bit into register SWTRIGR of channel 1. This bit is into area of LL_DAC_CR_CHx_BITOFFSET but excluded by mask DAC_CR_CHX_BITOFFSET_MASK (done to be enable to trig SW start of both DAC channels simultaneously). */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define DAC_SWTR_CH2 (DAC_SWTRIGR_SWTRIG2) /* Channel bit into register SWTRIGR of channel 2. This bit is into area of LL_DAC_CR_CHx_BITOFFSET but excluded by mask DAC_CR_CHX_BITOFFSET_MASK (done to be enable to trig SW start of both DAC channels simultaneously). */ +#define DAC_SWTR_CHX_MASK (DAC_SWTR_CH1 | DAC_SWTR_CH2) +#else +#define DAC_SWTR_CHX_MASK (DAC_SWTR_CH1) +#endif /* DAC_CHANNEL2_SUPPORT */ + +#define DAC_REG_DHR12R1_REGOFFSET 0x00000000U /* Register DHR12Rx channel 1 taken as reference */ +#define DAC_REG_DHR12L1_REGOFFSET 0x00100000U /* Register offset of DHR12Lx channel 1 versus DHR12Rx channel 1 (shifted left of 20 bits) */ +#define DAC_REG_DHR8R1_REGOFFSET 0x02000000U /* Register offset of DHR8Rx channel 1 versus DHR12Rx channel 1 (shifted left of 24 bits) */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define DAC_REG_DHR12R2_REGOFFSET 0x00030000U /* Register offset of DHR12Rx channel 2 versus DHR12Rx channel 1 (shifted left of 16 bits) */ +#define DAC_REG_DHR12L2_REGOFFSET 0x00400000U /* Register offset of DHR12Lx channel 2 versus DHR12Rx channel 1 (shifted left of 20 bits) */ +#define DAC_REG_DHR8R2_REGOFFSET 0x05000000U /* Register offset of DHR8Rx channel 2 versus DHR12Rx channel 1 (shifted left of 24 bits) */ +#endif /* DAC_CHANNEL2_SUPPORT */ +#define DAC_REG_DHR12RX_REGOFFSET_MASK 0x000F0000U +#define DAC_REG_DHR12LX_REGOFFSET_MASK 0x00F00000U +#define DAC_REG_DHR8RX_REGOFFSET_MASK 0x0F000000U +#define DAC_REG_DHRX_REGOFFSET_MASK (DAC_REG_DHR12RX_REGOFFSET_MASK | DAC_REG_DHR12LX_REGOFFSET_MASK | DAC_REG_DHR8RX_REGOFFSET_MASK) + +#define DAC_REG_DOR1_REGOFFSET 0x00000000U /* Register DORx channel 1 taken as reference */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define DAC_REG_DOR2_REGOFFSET 0x10000000U /* Register offset of DORx channel 1 versus DORx channel 2 (shifted left of 28 bits) */ +#define DAC_REG_DORX_REGOFFSET_MASK (DAC_REG_DOR1_REGOFFSET | DAC_REG_DOR2_REGOFFSET) +#else +#define DAC_REG_DORX_REGOFFSET_MASK (DAC_REG_DOR1_REGOFFSET) +#endif /* DAC_CHANNEL2_SUPPORT */ + +/* DAC registers bits positions */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define DAC_DHR12RD_DACC2DHR_BITOFFSET_POS 16U /* Value equivalent to POSITION_VAL(DAC_DHR12RD_DACC2DHR) */ +#define DAC_DHR12LD_DACC2DHR_BITOFFSET_POS 20U /* Value equivalent to POSITION_VAL(DAC_DHR12LD_DACC2DHR) */ +#define DAC_DHR8RD_DACC2DHR_BITOFFSET_POS 8U /* Value equivalent to POSITION_VAL(DAC_DHR8RD_DACC2DHR) */ +#endif /* DAC_CHANNEL2_SUPPORT */ + +/* Miscellaneous data */ +#define DAC_DIGITAL_SCALE_12BITS 4095U /* Full-scale digital value with a resolution of 12 bits (voltage range determined by analog voltage references Vref+ and Vref-, refer to reference manual) */ + +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DAC_LL_Private_Macros DAC Private Macros + * @{ + */ + +/** + * @brief Driver macro reserved for internal use: isolate bits with the + * selected mask and shift them to the register LSB + * (shift mask on register position bit 0). + * @param __BITS__ Bits in register 32 bits + * @param __MASK__ Mask in register 32 bits + * @retval Bits in register 32 bits +*/ +#define __DAC_MASK_SHIFT(__BITS__, __MASK__) \ + (((__BITS__) & (__MASK__)) >> POSITION_VAL((__MASK__))) + +/** + * @brief Driver macro reserved for internal use: set a pointer to + * a register from a register basis from which an offset + * is applied. + * @param __REG__ Register basis from which the offset is applied. + * @param __REG_OFFFSET__ Offset to be applied (unit: number of registers). + * @retval Pointer to register address +*/ +#define __DAC_PTR_REG_OFFSET(__REG__, __REG_OFFFSET__) \ + ((uint32_t *)((uint32_t) ((uint32_t)(&(__REG__)) + ((__REG_OFFFSET__) << 2U)))) + +/** + * @} + */ + + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DAC_LL_ES_INIT DAC Exported Init structure + * @{ + */ + +/** + * @brief Structure definition of some features of DAC instance. + */ +typedef struct +{ + uint32_t TriggerSource; /*!< Set the conversion trigger source for the selected DAC channel: internal (SW start) or from external IP (timer event, external interrupt line). + This parameter can be a value of @ref DAC_LL_EC_TRIGGER_SOURCE + + This feature can be modified afterwards using unitary function @ref LL_DAC_SetTriggerSource(). */ + + uint32_t WaveAutoGeneration; /*!< Set the waveform automatic generation mode for the selected DAC channel. + This parameter can be a value of @ref DAC_LL_EC_WAVE_AUTO_GENERATION_MODE + + This feature can be modified afterwards using unitary function @ref LL_DAC_SetWaveAutoGeneration(). */ + + uint32_t WaveAutoGenerationConfig; /*!< Set the waveform automatic generation mode for the selected DAC channel. + If waveform automatic generation mode is set to noise, this parameter can be a value of @ref DAC_LL_EC_WAVE_NOISE_LFSR_UNMASK_BITS + If waveform automatic generation mode is set to triangle, this parameter can be a value of @ref DAC_LL_EC_WAVE_TRIANGLE_AMPLITUDE + @note If waveform automatic generation mode is disabled, this parameter is discarded. + + This feature can be modified afterwards using unitary function @ref LL_DAC_SetWaveNoiseLFSR() or @ref LL_DAC_SetWaveTriangleAmplitude(), depending on the wave automatic generation selected. */ + + uint32_t OutputBuffer; /*!< Set the output buffer for the selected DAC channel. + This parameter can be a value of @ref DAC_LL_EC_OUTPUT_BUFFER + + This feature can be modified afterwards using unitary function @ref LL_DAC_SetOutputBuffer(). */ + +} LL_DAC_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DAC_LL_Exported_Constants DAC Exported Constants + * @{ + */ + +/** @defgroup DAC_LL_EC_GET_FLAG DAC flags + * @brief Flags defines which can be used with LL_DAC_ReadReg function + * @{ + */ +/* DAC channel 1 flags */ +#define LL_DAC_FLAG_DMAUDR1 (DAC_SR_DMAUDR1) /*!< DAC channel 1 flag DMA underrun */ + +#if defined(DAC_CHANNEL2_SUPPORT) +/* DAC channel 2 flags */ +#define LL_DAC_FLAG_DMAUDR2 (DAC_SR_DMAUDR2) /*!< DAC channel 2 flag DMA underrun */ +#endif /* DAC_CHANNEL2_SUPPORT */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_IT DAC interruptions + * @brief IT defines which can be used with LL_DAC_ReadReg and LL_DAC_WriteReg functions + * @{ + */ +#define LL_DAC_IT_DMAUDRIE1 (DAC_CR_DMAUDRIE1) /*!< DAC channel 1 interruption DMA underrun */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define LL_DAC_IT_DMAUDRIE2 (DAC_CR_DMAUDRIE2) /*!< DAC channel 2 interruption DMA underrun */ +#endif /* DAC_CHANNEL2_SUPPORT */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_CHANNEL DAC channels + * @{ + */ +#define LL_DAC_CHANNEL_1 (DAC_REG_DOR1_REGOFFSET | DAC_REG_DHR12R1_REGOFFSET | DAC_REG_DHR12L1_REGOFFSET | DAC_REG_DHR8R1_REGOFFSET | DAC_CR_CH1_BITOFFSET | DAC_SWTR_CH1) /*!< DAC channel 1 */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define LL_DAC_CHANNEL_2 (DAC_REG_DOR2_REGOFFSET | DAC_REG_DHR12R2_REGOFFSET | DAC_REG_DHR12L2_REGOFFSET | DAC_REG_DHR8R2_REGOFFSET | DAC_CR_CH2_BITOFFSET | DAC_SWTR_CH2) /*!< DAC channel 2 */ +#endif /* DAC_CHANNEL2_SUPPORT */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_TRIGGER_SOURCE DAC trigger source + * @{ + */ +#define LL_DAC_TRIG_SOFTWARE (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0) /*!< DAC channel conversion trigger internal (SW start) */ +#define LL_DAC_TRIG_EXT_TIM2_TRGO (DAC_CR_TSEL1_2 ) /*!< DAC channel conversion trigger from external IP: TIM2 TRGO. */ +#define LL_DAC_TRIG_EXT_TIM8_TRGO ( DAC_CR_TSEL1_0) /*!< DAC channel conversion trigger from external IP: TIM8 TRGO. */ +#define LL_DAC_TRIG_EXT_TIM4_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0) /*!< DAC channel conversion trigger from external IP: TIM4 TRGO. */ +#define LL_DAC_TRIG_EXT_TIM6_TRGO 0x00000000U /*!< DAC channel conversion trigger from external IP: TIM6 TRGO. */ +#define LL_DAC_TRIG_EXT_TIM7_TRGO ( DAC_CR_TSEL1_1 ) /*!< DAC channel conversion trigger from external IP: TIM7 TRGO. */ +#define LL_DAC_TRIG_EXT_TIM5_TRGO ( DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0) /*!< DAC channel conversion trigger from external IP: TIM5 TRGO. */ +#define LL_DAC_TRIG_EXT_EXTI_LINE9 (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 ) /*!< DAC channel conversion trigger from external IP: external interrupt line 9. */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_WAVE_AUTO_GENERATION_MODE DAC waveform automatic generation mode + * @{ + */ +#define LL_DAC_WAVE_AUTO_GENERATION_NONE 0x00000000U /*!< DAC channel wave auto generation mode disabled. */ +#define LL_DAC_WAVE_AUTO_GENERATION_NOISE (DAC_CR_WAVE1_0) /*!< DAC channel wave auto generation mode enabled, set generated noise waveform. */ +#define LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE (DAC_CR_WAVE1_1) /*!< DAC channel wave auto generation mode enabled, set generated triangle waveform. */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_WAVE_NOISE_LFSR_UNMASK_BITS DAC wave generation - Noise LFSR unmask bits + * @{ + */ +#define LL_DAC_NOISE_LFSR_UNMASK_BIT0 0x00000000U /*!< Noise wave generation, unmask LFSR bit0, for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS1_0 ( DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[1:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS2_0 ( DAC_CR_MAMP1_1 ) /*!< Noise wave generation, unmask LFSR bits[2:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS3_0 ( DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[3:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS4_0 ( DAC_CR_MAMP1_2 ) /*!< Noise wave generation, unmask LFSR bits[4:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS5_0 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[5:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS6_0 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 ) /*!< Noise wave generation, unmask LFSR bits[6:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS7_0 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[7:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS8_0 (DAC_CR_MAMP1_3 ) /*!< Noise wave generation, unmask LFSR bits[8:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS9_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[9:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS10_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 ) /*!< Noise wave generation, unmask LFSR bits[10:0], for the selected DAC channel */ +#define LL_DAC_NOISE_LFSR_UNMASK_BITS11_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Noise wave generation, unmask LFSR bits[11:0], for the selected DAC channel */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_WAVE_TRIANGLE_AMPLITUDE DAC wave generation - Triangle amplitude + * @{ + */ +#define LL_DAC_TRIANGLE_AMPLITUDE_1 0x00000000U /*!< Triangle wave generation, amplitude of 1 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_3 ( DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 3 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_7 ( DAC_CR_MAMP1_1 ) /*!< Triangle wave generation, amplitude of 7 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_15 ( DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 15 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_31 ( DAC_CR_MAMP1_2 ) /*!< Triangle wave generation, amplitude of 31 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_63 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 63 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_127 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 ) /*!< Triangle wave generation, amplitude of 127 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_255 ( DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 255 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_511 (DAC_CR_MAMP1_3 ) /*!< Triangle wave generation, amplitude of 512 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_1023 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 1023 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_2047 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 ) /*!< Triangle wave generation, amplitude of 2047 LSB of DAC output range, for the selected DAC channel */ +#define LL_DAC_TRIANGLE_AMPLITUDE_4095 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Triangle wave generation, amplitude of 4095 LSB of DAC output range, for the selected DAC channel */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_OUTPUT_BUFFER DAC channel output buffer + * @{ + */ +#define LL_DAC_OUTPUT_BUFFER_ENABLE 0x00000000U /*!< The selected DAC channel output is buffered: higher drive current capability, but also higher current consumption */ +#define LL_DAC_OUTPUT_BUFFER_DISABLE (DAC_CR_BOFF1) /*!< The selected DAC channel output is not buffered: lower drive current capability, but also lower current consumption */ +/** + * @} + */ + + +/** @defgroup DAC_LL_EC_RESOLUTION DAC channel output resolution + * @{ + */ +#define LL_DAC_RESOLUTION_12B 0x00000000U /*!< DAC channel resolution 12 bits */ +#define LL_DAC_RESOLUTION_8B 0x00000002U /*!< DAC channel resolution 8 bits */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_REGISTERS DAC registers compliant with specific purpose + * @{ + */ +/* List of DAC registers intended to be used (most commonly) with */ +/* DMA transfer. */ +/* Refer to function @ref LL_DAC_DMA_GetRegAddr(). */ +#define LL_DAC_DMA_REG_DATA_12BITS_RIGHT_ALIGNED DAC_REG_DHR12RX_REGOFFSET_MASK /*!< DAC channel data holding register 12 bits right aligned */ +#define LL_DAC_DMA_REG_DATA_12BITS_LEFT_ALIGNED DAC_REG_DHR12LX_REGOFFSET_MASK /*!< DAC channel data holding register 12 bits left aligned */ +#define LL_DAC_DMA_REG_DATA_8BITS_RIGHT_ALIGNED DAC_REG_DHR8RX_REGOFFSET_MASK /*!< DAC channel data holding register 8 bits right aligned */ +/** + * @} + */ + +/** @defgroup DAC_LL_EC_HW_DELAYS Definitions of DAC hardware constraints delays + * @note Only DAC IP HW delays are defined in DAC LL driver driver, + * not timeout values. + * For details on delays values, refer to descriptions in source code + * above each literal definition. + * @{ + */ + +/* Delay for DAC channel voltage settling time from DAC channel startup */ +/* (transition from disable to enable). */ +/* Note: DAC channel startup time depends on board application environment: */ +/* impedance connected to DAC channel output. */ +/* The delay below is specified under conditions: */ +/* - voltage maximum transition (lowest to highest value) */ +/* - until voltage reaches final value +-1LSB */ +/* - DAC channel output buffer enabled */ +/* - load impedance of 5kOhm (min), 50pF (max) */ +/* Literal set to maximum value (refer to device datasheet, */ +/* parameter "tWAKEUP"). */ +/* Unit: us */ +#define LL_DAC_DELAY_STARTUP_VOLTAGE_SETTLING_US 15U /*!< Delay for DAC channel voltage settling time from DAC channel startup (transition from disable to enable) */ + +/* Delay for DAC channel voltage settling time. */ +/* Note: DAC channel startup time depends on board application environment: */ +/* impedance connected to DAC channel output. */ +/* The delay below is specified under conditions: */ +/* - voltage maximum transition (lowest to highest value) */ +/* - until voltage reaches final value +-1LSB */ +/* - DAC channel output buffer enabled */ +/* - load impedance of 5kOhm min, 50pF max */ +/* Literal set to maximum value (refer to device datasheet, */ +/* parameter "tSETTLING"). */ +/* Unit: us */ +#define LL_DAC_DELAY_VOLTAGE_SETTLING_US 12U /*!< Delay for DAC channel voltage settling time */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DAC_LL_Exported_Macros DAC Exported Macros + * @{ + */ + +/** @defgroup DAC_LL_EM_WRITE_READ Common write and read registers macros + * @{ + */ + +/** + * @brief Write a value in DAC register + * @param __INSTANCE__ DAC Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_DAC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in DAC register + * @param __INSTANCE__ DAC Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_DAC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) + +/** + * @} + */ + +/** @defgroup DAC_LL_EM_HELPER_MACRO DAC helper macro + * @{ + */ + +/** + * @brief Helper macro to get DAC channel number in decimal format + * from literals LL_DAC_CHANNEL_x. + * Example: + * __LL_DAC_CHANNEL_TO_DECIMAL_NB(LL_DAC_CHANNEL_1) + * will return decimal number "1". + * @note The input can be a value from functions where a channel + * number is returned. + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval 1...2 (value "2" depending on DAC channel 2 availability) + */ +#define __LL_DAC_CHANNEL_TO_DECIMAL_NB(__CHANNEL__) \ + ((__CHANNEL__) & DAC_SWTR_CHX_MASK) + +/** + * @brief Helper macro to get DAC channel in literal format LL_DAC_CHANNEL_x + * from number in decimal format. + * Example: + * __LL_DAC_DECIMAL_NB_TO_CHANNEL(1) + * will return a data equivalent to "LL_DAC_CHANNEL_1". + * @note If the input parameter does not correspond to a DAC channel, + * this macro returns value '0'. + * @param __DECIMAL_NB__ 1...2 (value "2" depending on DAC channel 2 availability) + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + */ +#if defined(DAC_CHANNEL2_SUPPORT) +#define __LL_DAC_DECIMAL_NB_TO_CHANNEL(__DECIMAL_NB__) \ + (((__DECIMAL_NB__) == 1U) \ + ? ( \ + LL_DAC_CHANNEL_1 \ + ) \ + : \ + (((__DECIMAL_NB__) == 2U) \ + ? ( \ + LL_DAC_CHANNEL_2 \ + ) \ + : \ + ( \ + 0 \ + ) \ + ) \ + ) +#else +#define __LL_DAC_DECIMAL_NB_TO_CHANNEL(__DECIMAL_NB__) \ + (((__DECIMAL_NB__) == 1U) \ + ? ( \ + LL_DAC_CHANNEL_1 \ + ) \ + : \ + ( \ + 0 \ + ) \ + ) +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @brief Helper macro to define the DAC conversion data full-scale digital + * value corresponding to the selected DAC resolution. + * @note DAC conversion data full-scale corresponds to voltage range + * determined by analog voltage references Vref+ and Vref- + * (refer to reference manual). + * @param __DAC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_DAC_RESOLUTION_12B + * @arg @ref LL_DAC_RESOLUTION_8B + * @retval ADC conversion data equivalent voltage value (unit: mVolt) + */ +#define __LL_DAC_DIGITAL_SCALE(__DAC_RESOLUTION__) \ + ((0x00000FFFU) >> ((__DAC_RESOLUTION__) << 1U)) + +/** + * @brief Helper macro to calculate the DAC conversion data (unit: digital + * value) corresponding to a voltage (unit: mVolt). + * @note This helper macro is intended to provide input data in voltage + * rather than digital value, + * to be used with LL DAC functions such as + * @ref LL_DAC_ConvertData12RightAligned(). + * @note Analog reference voltage (Vref+) must be either known from + * user board environment or can be calculated using ADC measurement + * and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE(). + * @param __VREFANALOG_VOLTAGE__ Analog reference voltage (unit: mV) + * @param __DAC_VOLTAGE__ Voltage to be generated by DAC channel + * (unit: mVolt). + * @param __DAC_RESOLUTION__ This parameter can be one of the following values: + * @arg @ref LL_DAC_RESOLUTION_12B + * @arg @ref LL_DAC_RESOLUTION_8B + * @retval DAC conversion data (unit: digital value) + */ +#define __LL_DAC_CALC_VOLTAGE_TO_DATA(__VREFANALOG_VOLTAGE__,\ + __DAC_VOLTAGE__,\ + __DAC_RESOLUTION__) \ + ((__DAC_VOLTAGE__) * __LL_DAC_DIGITAL_SCALE(__DAC_RESOLUTION__) \ + / (__VREFANALOG_VOLTAGE__) \ + ) + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DAC_LL_Exported_Functions DAC Exported Functions + * @{ + */ +/** @defgroup DAC_LL_EF_Configuration Configuration of DAC channels + * @{ + */ + +/** + * @brief Set the conversion trigger source for the selected DAC channel. + * @note For conversion trigger source to be effective, DAC trigger + * must be enabled using function @ref LL_DAC_EnableTrigger(). + * @note To set conversion trigger source, DAC channel must be disabled. + * Otherwise, the setting is discarded. + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR TSEL1 LL_DAC_SetTriggerSource\n + * CR TSEL2 LL_DAC_SetTriggerSource + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param TriggerSource This parameter can be one of the following values: + * @arg @ref LL_DAC_TRIG_SOFTWARE + * @arg @ref LL_DAC_TRIG_EXT_TIM8_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM7_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM6_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM5_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM4_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_DAC_TRIG_EXT_EXTI_LINE9 + * @retval None + */ +__STATIC_INLINE void LL_DAC_SetTriggerSource(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t TriggerSource) +{ + MODIFY_REG(DACx->CR, + DAC_CR_TSEL1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK), + TriggerSource << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get the conversion trigger source for the selected DAC channel. + * @note For conversion trigger source to be effective, DAC trigger + * must be enabled using function @ref LL_DAC_EnableTrigger(). + * @note Availability of parameters of trigger sources from timer + * depends on timers availability on the selected device. + * @rmtoll CR TSEL1 LL_DAC_GetTriggerSource\n + * CR TSEL2 LL_DAC_GetTriggerSource + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_TRIG_SOFTWARE + * @arg @ref LL_DAC_TRIG_EXT_TIM8_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM7_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM6_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM5_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM4_TRGO + * @arg @ref LL_DAC_TRIG_EXT_TIM2_TRGO + * @arg @ref LL_DAC_TRIG_EXT_EXTI_LINE9 + */ +__STATIC_INLINE uint32_t LL_DAC_GetTriggerSource(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (uint32_t)(READ_BIT(DACx->CR, DAC_CR_TSEL1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + >> (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); +} + +/** + * @brief Set the waveform automatic generation mode + * for the selected DAC channel. + * @rmtoll CR WAVE1 LL_DAC_SetWaveAutoGeneration\n + * CR WAVE2 LL_DAC_SetWaveAutoGeneration + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param WaveAutoGeneration This parameter can be one of the following values: + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_NONE + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_NOISE + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE + * @retval None + */ +__STATIC_INLINE void LL_DAC_SetWaveAutoGeneration(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t WaveAutoGeneration) +{ + MODIFY_REG(DACx->CR, + DAC_CR_WAVE1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK), + WaveAutoGeneration << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get the waveform automatic generation mode + * for the selected DAC channel. + * @rmtoll CR WAVE1 LL_DAC_GetWaveAutoGeneration\n + * CR WAVE2 LL_DAC_GetWaveAutoGeneration + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_NONE + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_NOISE + * @arg @ref LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE + */ +__STATIC_INLINE uint32_t LL_DAC_GetWaveAutoGeneration(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (uint32_t)(READ_BIT(DACx->CR, DAC_CR_WAVE1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + >> (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); +} + +/** + * @brief Set the noise waveform generation for the selected DAC channel: + * Noise mode and parameters LFSR (linear feedback shift register). + * @note For wave generation to be effective, DAC channel + * wave generation mode must be enabled using + * function @ref LL_DAC_SetWaveAutoGeneration(). + * @note This setting can be set when the selected DAC channel is disabled + * (otherwise, the setting operation is ignored). + * @rmtoll CR MAMP1 LL_DAC_SetWaveNoiseLFSR\n + * CR MAMP2 LL_DAC_SetWaveNoiseLFSR + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param NoiseLFSRMask This parameter can be one of the following values: + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BIT0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS1_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS2_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS3_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS4_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS5_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS6_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS7_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS8_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS9_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS10_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS11_0 + * @retval None + */ +__STATIC_INLINE void LL_DAC_SetWaveNoiseLFSR(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t NoiseLFSRMask) +{ + MODIFY_REG(DACx->CR, + DAC_CR_MAMP1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK), + NoiseLFSRMask << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Set the noise waveform generation for the selected DAC channel: + * Noise mode and parameters LFSR (linear feedback shift register). + * @rmtoll CR MAMP1 LL_DAC_GetWaveNoiseLFSR\n + * CR MAMP2 LL_DAC_GetWaveNoiseLFSR + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BIT0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS1_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS2_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS3_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS4_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS5_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS6_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS7_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS8_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS9_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS10_0 + * @arg @ref LL_DAC_NOISE_LFSR_UNMASK_BITS11_0 + */ +__STATIC_INLINE uint32_t LL_DAC_GetWaveNoiseLFSR(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (uint32_t)(READ_BIT(DACx->CR, DAC_CR_MAMP1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + >> (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); +} + +/** + * @brief Set the triangle waveform generation for the selected DAC channel: + * triangle mode and amplitude. + * @note For wave generation to be effective, DAC channel + * wave generation mode must be enabled using + * function @ref LL_DAC_SetWaveAutoGeneration(). + * @note This setting can be set when the selected DAC channel is disabled + * (otherwise, the setting operation is ignored). + * @rmtoll CR MAMP1 LL_DAC_SetWaveTriangleAmplitude\n + * CR MAMP2 LL_DAC_SetWaveTriangleAmplitude + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param TriangleAmplitude This parameter can be one of the following values: + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_1 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_3 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_7 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_15 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_31 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_63 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_127 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_255 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_511 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_1023 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_2047 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_4095 + * @retval None + */ +__STATIC_INLINE void LL_DAC_SetWaveTriangleAmplitude(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t TriangleAmplitude) +{ + MODIFY_REG(DACx->CR, + DAC_CR_MAMP1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK), + TriangleAmplitude << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Set the triangle waveform generation for the selected DAC channel: + * triangle mode and amplitude. + * @rmtoll CR MAMP1 LL_DAC_GetWaveTriangleAmplitude\n + * CR MAMP2 LL_DAC_GetWaveTriangleAmplitude + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_1 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_3 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_7 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_15 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_31 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_63 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_127 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_255 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_511 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_1023 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_2047 + * @arg @ref LL_DAC_TRIANGLE_AMPLITUDE_4095 + */ +__STATIC_INLINE uint32_t LL_DAC_GetWaveTriangleAmplitude(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (uint32_t)(READ_BIT(DACx->CR, DAC_CR_MAMP1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + >> (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); +} + +/** + * @brief Set the output buffer for the selected DAC channel. + * @rmtoll CR BOFF1 LL_DAC_SetOutputBuffer\n + * CR BOFF2 LL_DAC_SetOutputBuffer + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param OutputBuffer This parameter can be one of the following values: + * @arg @ref LL_DAC_OUTPUT_BUFFER_ENABLE + * @arg @ref LL_DAC_OUTPUT_BUFFER_DISABLE + * @retval None + */ +__STATIC_INLINE void LL_DAC_SetOutputBuffer(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t OutputBuffer) +{ + MODIFY_REG(DACx->CR, + DAC_CR_BOFF1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK), + OutputBuffer << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get the output buffer state for the selected DAC channel. + * @rmtoll CR BOFF1 LL_DAC_GetOutputBuffer\n + * CR BOFF2 LL_DAC_GetOutputBuffer + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Returned value can be one of the following values: + * @arg @ref LL_DAC_OUTPUT_BUFFER_ENABLE + * @arg @ref LL_DAC_OUTPUT_BUFFER_DISABLE + */ +__STATIC_INLINE uint32_t LL_DAC_GetOutputBuffer(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (uint32_t)(READ_BIT(DACx->CR, DAC_CR_BOFF1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + >> (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); +} + +/** + * @} + */ + +/** @defgroup DAC_LL_EF_DMA_Management DMA Management + * @{ + */ + +/** + * @brief Enable DAC DMA transfer request of the selected channel. + * @note To configure DMA source address (peripheral address), + * use function @ref LL_DAC_DMA_GetRegAddr(). + * @rmtoll CR DMAEN1 LL_DAC_EnableDMAReq\n + * CR DMAEN2 LL_DAC_EnableDMAReq + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_EnableDMAReq(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + SET_BIT(DACx->CR, + DAC_CR_DMAEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Disable DAC DMA transfer request of the selected channel. + * @note To configure DMA source address (peripheral address), + * use function @ref LL_DAC_DMA_GetRegAddr(). + * @rmtoll CR DMAEN1 LL_DAC_DisableDMAReq\n + * CR DMAEN2 LL_DAC_DisableDMAReq + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_DisableDMAReq(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + CLEAR_BIT(DACx->CR, + DAC_CR_DMAEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get DAC DMA transfer request state of the selected channel. + * (0: DAC DMA transfer request is disabled, 1: DAC DMA transfer request is enabled) + * @rmtoll CR DMAEN1 LL_DAC_IsDMAReqEnabled\n + * CR DMAEN2 LL_DAC_IsDMAReqEnabled + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsDMAReqEnabled(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (READ_BIT(DACx->CR, + DAC_CR_DMAEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + == (DAC_CR_DMAEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK))); +} + +/** + * @brief Function to help to configure DMA transfer to DAC: retrieve the + * DAC register address from DAC instance and a list of DAC registers + * intended to be used (most commonly) with DMA transfer. + * @note These DAC registers are data holding registers: + * when DAC conversion is requested, DAC generates a DMA transfer + * request to have data available in DAC data holding registers. + * @note This macro is intended to be used with LL DMA driver, refer to + * function "LL_DMA_ConfigAddresses()". + * Example: + * LL_DMA_ConfigAddresses(DMA1, + * LL_DMA_CHANNEL_1, + * (uint32_t)&< array or variable >, + * LL_DAC_DMA_GetRegAddr(DAC1, LL_DAC_CHANNEL_1, LL_DAC_DMA_REG_DATA_12BITS_RIGHT_ALIGNED), + * LL_DMA_DIRECTION_MEMORY_TO_PERIPH); + * @rmtoll DHR12R1 DACC1DHR LL_DAC_DMA_GetRegAddr\n + * DHR12L1 DACC1DHR LL_DAC_DMA_GetRegAddr\n + * DHR8R1 DACC1DHR LL_DAC_DMA_GetRegAddr\n + * DHR12R2 DACC2DHR LL_DAC_DMA_GetRegAddr\n + * DHR12L2 DACC2DHR LL_DAC_DMA_GetRegAddr\n + * DHR8R2 DACC2DHR LL_DAC_DMA_GetRegAddr + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param Register This parameter can be one of the following values: + * @arg @ref LL_DAC_DMA_REG_DATA_12BITS_RIGHT_ALIGNED + * @arg @ref LL_DAC_DMA_REG_DATA_12BITS_LEFT_ALIGNED + * @arg @ref LL_DAC_DMA_REG_DATA_8BITS_RIGHT_ALIGNED + * @retval DAC register address + */ +__STATIC_INLINE uint32_t LL_DAC_DMA_GetRegAddr(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t Register) +{ + /* Retrieve address of register DHR12Rx, DHR12Lx or DHR8Rx depending on */ + /* DAC channel selected. */ + return ((uint32_t)(__DAC_PTR_REG_OFFSET((DACx)->DHR12R1, __DAC_MASK_SHIFT(DAC_Channel, Register)))); +} +/** + * @} + */ + +/** @defgroup DAC_LL_EF_Operation Operation on DAC channels + * @{ + */ + +/** + * @brief Enable DAC selected channel. + * @rmtoll CR EN1 LL_DAC_Enable\n + * CR EN2 LL_DAC_Enable + * @note After enable from off state, DAC channel requires a delay + * for output voltage to reach accuracy +/- 1 LSB. + * Refer to device datasheet, parameter "tWAKEUP". + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_Enable(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + SET_BIT(DACx->CR, + DAC_CR_EN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Disable DAC selected channel. + * @rmtoll CR EN1 LL_DAC_Disable\n + * CR EN2 LL_DAC_Disable + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_Disable(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + CLEAR_BIT(DACx->CR, + DAC_CR_EN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get DAC enable state of the selected channel. + * (0: DAC channel is disabled, 1: DAC channel is enabled) + * @rmtoll CR EN1 LL_DAC_IsEnabled\n + * CR EN2 LL_DAC_IsEnabled + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsEnabled(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (READ_BIT(DACx->CR, + DAC_CR_EN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + == (DAC_CR_EN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK))); +} + +/** + * @brief Enable DAC trigger of the selected channel. + * @note - If DAC trigger is disabled, DAC conversion is performed + * automatically once the data holding register is updated, + * using functions "LL_DAC_ConvertData{8; 12}{Right; Left} Aligned()": + * @ref LL_DAC_ConvertData12RightAligned(), ... + * - If DAC trigger is enabled, DAC conversion is performed + * only when a hardware of software trigger event is occurring. + * Select trigger source using + * function @ref LL_DAC_SetTriggerSource(). + * @rmtoll CR TEN1 LL_DAC_EnableTrigger\n + * CR TEN2 LL_DAC_EnableTrigger + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_EnableTrigger(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + SET_BIT(DACx->CR, + DAC_CR_TEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Disable DAC trigger of the selected channel. + * @rmtoll CR TEN1 LL_DAC_DisableTrigger\n + * CR TEN2 LL_DAC_DisableTrigger + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_DisableTrigger(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + CLEAR_BIT(DACx->CR, + DAC_CR_TEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)); +} + +/** + * @brief Get DAC trigger state of the selected channel. + * (0: DAC trigger is disabled, 1: DAC trigger is enabled) + * @rmtoll CR TEN1 LL_DAC_IsTriggerEnabled\n + * CR TEN2 LL_DAC_IsTriggerEnabled + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsTriggerEnabled(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + return (READ_BIT(DACx->CR, + DAC_CR_TEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK)) + == (DAC_CR_TEN1 << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK))); +} + +/** + * @brief Trig DAC conversion by software for the selected DAC channel. + * @note Preliminarily, DAC trigger must be set to software trigger + * using function @ref LL_DAC_SetTriggerSource() + * with parameter "LL_DAC_TRIGGER_SOFTWARE". + * and DAC trigger must be enabled using + * function @ref LL_DAC_EnableTrigger(). + * @note For devices featuring DAC with 2 channels: this function + * can perform a SW start of both DAC channels simultaneously. + * Two channels can be selected as parameter. + * Example: (LL_DAC_CHANNEL_1 | LL_DAC_CHANNEL_2) + * @rmtoll SWTRIGR SWTRIG1 LL_DAC_TrigSWConversion\n + * SWTRIGR SWTRIG2 LL_DAC_TrigSWConversion + * @param DACx DAC instance + * @param DAC_Channel This parameter can a combination of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval None + */ +__STATIC_INLINE void LL_DAC_TrigSWConversion(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + SET_BIT(DACx->SWTRIGR, + (DAC_Channel & DAC_SWTR_CHX_MASK)); +} + +/** + * @brief Set the data to be loaded in the data holding register + * in format 12 bits left alignment (LSB aligned on bit 0), + * for the selected DAC channel. + * @rmtoll DHR12R1 DACC1DHR LL_DAC_ConvertData12RightAligned\n + * DHR12R2 DACC2DHR LL_DAC_ConvertData12RightAligned + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param Data Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertData12RightAligned(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t Data) +{ + register uint32_t *preg = __DAC_PTR_REG_OFFSET(DACx->DHR12R1, __DAC_MASK_SHIFT(DAC_Channel, DAC_REG_DHR12RX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + DAC_DHR12R1_DACC1DHR, + Data); +} + +/** + * @brief Set the data to be loaded in the data holding register + * in format 12 bits left alignment (MSB aligned on bit 15), + * for the selected DAC channel. + * @rmtoll DHR12L1 DACC1DHR LL_DAC_ConvertData12LeftAligned\n + * DHR12L2 DACC2DHR LL_DAC_ConvertData12LeftAligned + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param Data Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertData12LeftAligned(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t Data) +{ + register uint32_t *preg = __DAC_PTR_REG_OFFSET(DACx->DHR12R1, __DAC_MASK_SHIFT(DAC_Channel, DAC_REG_DHR12LX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + DAC_DHR12L1_DACC1DHR, + Data); +} + +/** + * @brief Set the data to be loaded in the data holding register + * in format 8 bits left alignment (LSB aligned on bit 0), + * for the selected DAC channel. + * @rmtoll DHR8R1 DACC1DHR LL_DAC_ConvertData8RightAligned\n + * DHR8R2 DACC2DHR LL_DAC_ConvertData8RightAligned + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param Data Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertData8RightAligned(DAC_TypeDef *DACx, uint32_t DAC_Channel, uint32_t Data) +{ + register uint32_t *preg = __DAC_PTR_REG_OFFSET(DACx->DHR12R1, __DAC_MASK_SHIFT(DAC_Channel, DAC_REG_DHR8RX_REGOFFSET_MASK)); + + MODIFY_REG(*preg, + DAC_DHR8R1_DACC1DHR, + Data); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Set the data to be loaded in the data holding register + * in format 12 bits left alignment (LSB aligned on bit 0), + * for both DAC channels. + * @rmtoll DHR12RD DACC1DHR LL_DAC_ConvertDualData12RightAligned\n + * DHR12RD DACC2DHR LL_DAC_ConvertDualData12RightAligned + * @param DACx DAC instance + * @param DataChannel1 Value between Min_Data=0x000 and Max_Data=0xFFF + * @param DataChannel2 Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertDualData12RightAligned(DAC_TypeDef *DACx, uint32_t DataChannel1, uint32_t DataChannel2) +{ + MODIFY_REG(DACx->DHR12RD, + (DAC_DHR12RD_DACC2DHR | DAC_DHR12RD_DACC1DHR), + ((DataChannel2 << DAC_DHR12RD_DACC2DHR_BITOFFSET_POS) | DataChannel1)); +} + +/** + * @brief Set the data to be loaded in the data holding register + * in format 12 bits left alignment (MSB aligned on bit 15), + * for both DAC channels. + * @rmtoll DHR12LD DACC1DHR LL_DAC_ConvertDualData12LeftAligned\n + * DHR12LD DACC2DHR LL_DAC_ConvertDualData12LeftAligned + * @param DACx DAC instance + * @param DataChannel1 Value between Min_Data=0x000 and Max_Data=0xFFF + * @param DataChannel2 Value between Min_Data=0x000 and Max_Data=0xFFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertDualData12LeftAligned(DAC_TypeDef *DACx, uint32_t DataChannel1, uint32_t DataChannel2) +{ + /* Note: Data of DAC channel 2 shift value subtracted of 4 because */ + /* data on 16 bits and DAC channel 2 bits field is on the 12 MSB, */ + /* the 4 LSB must be taken into account for the shift value. */ + MODIFY_REG(DACx->DHR12LD, + (DAC_DHR12LD_DACC2DHR | DAC_DHR12LD_DACC1DHR), + ((DataChannel2 << (DAC_DHR12LD_DACC2DHR_BITOFFSET_POS - 4U)) | DataChannel1)); +} + +/** + * @brief Set the data to be loaded in the data holding register + * in format 8 bits left alignment (LSB aligned on bit 0), + * for both DAC channels. + * @rmtoll DHR8RD DACC1DHR LL_DAC_ConvertDualData8RightAligned\n + * DHR8RD DACC2DHR LL_DAC_ConvertDualData8RightAligned + * @param DACx DAC instance + * @param DataChannel1 Value between Min_Data=0x00 and Max_Data=0xFF + * @param DataChannel2 Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DAC_ConvertDualData8RightAligned(DAC_TypeDef *DACx, uint32_t DataChannel1, uint32_t DataChannel2) +{ + MODIFY_REG(DACx->DHR8RD, + (DAC_DHR8RD_DACC2DHR | DAC_DHR8RD_DACC1DHR), + ((DataChannel2 << DAC_DHR8RD_DACC2DHR_BITOFFSET_POS) | DataChannel1)); +} + +#endif /* DAC_CHANNEL2_SUPPORT */ +/** + * @brief Retrieve output data currently generated for the selected DAC channel. + * @note Whatever alignment and resolution settings + * (using functions "LL_DAC_ConvertData{8; 12}{Right; Left} Aligned()": + * @ref LL_DAC_ConvertData12RightAligned(), ...), + * output data format is 12 bits right aligned (LSB aligned on bit 0). + * @rmtoll DOR1 DACC1DOR LL_DAC_RetrieveOutputData\n + * DOR2 DACC2DOR LL_DAC_RetrieveOutputData + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @retval Value between Min_Data=0x000 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_DAC_RetrieveOutputData(DAC_TypeDef *DACx, uint32_t DAC_Channel) +{ + register uint32_t *preg = __DAC_PTR_REG_OFFSET(DACx->DOR1, __DAC_MASK_SHIFT(DAC_Channel, DAC_REG_DORX_REGOFFSET_MASK)); + + return (uint16_t) READ_BIT(*preg, DAC_DOR1_DACC1DOR); +} + +/** + * @} + */ + +/** @defgroup DAC_LL_EF_FLAG_Management FLAG Management + * @{ + */ +/** + * @brief Get DAC underrun flag for DAC channel 1 + * @rmtoll SR DMAUDR1 LL_DAC_IsActiveFlag_DMAUDR1 + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsActiveFlag_DMAUDR1(DAC_TypeDef *DACx) +{ + return (READ_BIT(DACx->SR, LL_DAC_FLAG_DMAUDR1) == (LL_DAC_FLAG_DMAUDR1)); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Get DAC underrun flag for DAC channel 2 + * @rmtoll SR DMAUDR2 LL_DAC_IsActiveFlag_DMAUDR2 + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsActiveFlag_DMAUDR2(DAC_TypeDef *DACx) +{ + return (READ_BIT(DACx->SR, LL_DAC_FLAG_DMAUDR2) == (LL_DAC_FLAG_DMAUDR2)); +} +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @brief Clear DAC underrun flag for DAC channel 1 + * @rmtoll SR DMAUDR1 LL_DAC_ClearFlag_DMAUDR1 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_ClearFlag_DMAUDR1(DAC_TypeDef *DACx) +{ + WRITE_REG(DACx->SR, LL_DAC_FLAG_DMAUDR1); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Clear DAC underrun flag for DAC channel 2 + * @rmtoll SR DMAUDR2 LL_DAC_ClearFlag_DMAUDR2 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_ClearFlag_DMAUDR2(DAC_TypeDef *DACx) +{ + WRITE_REG(DACx->SR, LL_DAC_FLAG_DMAUDR2); +} +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @} + */ + +/** @defgroup DAC_LL_EF_IT_Management IT management + * @{ + */ + +/** + * @brief Enable DMA underrun interrupt for DAC channel 1 + * @rmtoll CR DMAUDRIE1 LL_DAC_EnableIT_DMAUDR1 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_EnableIT_DMAUDR1(DAC_TypeDef *DACx) +{ + SET_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE1); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Enable DMA underrun interrupt for DAC channel 2 + * @rmtoll CR DMAUDRIE2 LL_DAC_EnableIT_DMAUDR2 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_EnableIT_DMAUDR2(DAC_TypeDef *DACx) +{ + SET_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE2); +} +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @brief Disable DMA underrun interrupt for DAC channel 1 + * @rmtoll CR DMAUDRIE1 LL_DAC_DisableIT_DMAUDR1 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_DisableIT_DMAUDR1(DAC_TypeDef *DACx) +{ + CLEAR_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE1); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Disable DMA underrun interrupt for DAC channel 2 + * @rmtoll CR DMAUDRIE2 LL_DAC_DisableIT_DMAUDR2 + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void LL_DAC_DisableIT_DMAUDR2(DAC_TypeDef *DACx) +{ + CLEAR_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE2); +} +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @brief Get DMA underrun interrupt for DAC channel 1 + * @rmtoll CR DMAUDRIE1 LL_DAC_IsEnabledIT_DMAUDR1 + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsEnabledIT_DMAUDR1(DAC_TypeDef *DACx) +{ + return (READ_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE1) == (LL_DAC_IT_DMAUDRIE1)); +} + +#if defined(DAC_CHANNEL2_SUPPORT) +/** + * @brief Get DMA underrun interrupt for DAC channel 2 + * @rmtoll CR DMAUDRIE2 LL_DAC_IsEnabledIT_DMAUDR2 + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DAC_IsEnabledIT_DMAUDR2(DAC_TypeDef *DACx) +{ + return (READ_BIT(DACx->CR, LL_DAC_IT_DMAUDRIE2) == (LL_DAC_IT_DMAUDRIE2)); +} +#endif /* DAC_CHANNEL2_SUPPORT */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DAC_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_DAC_DeInit(DAC_TypeDef* DACx); +ErrorStatus LL_DAC_Init(DAC_TypeDef* DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef* DAC_InitStruct); +void LL_DAC_StructInit(LL_DAC_InitTypeDef* DAC_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DAC */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_DAC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h new file mode 100644 index 0000000..91ea4fc --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h @@ -0,0 +1,2878 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dma.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of DMA LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_DMA_H +#define __STM32F4xx_LL_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (DMA1) || defined (DMA2) + +/** @defgroup DMA_LL DMA + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup DMA_LL_Private_Variables DMA Private Variables + * @{ + */ +/* Array used to get the DMA stream register offset versus stream index LL_DMA_STREAM_x */ +static const uint8_t STREAM_OFFSET_TAB[] = +{ + (uint8_t)(DMA1_Stream0_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream1_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream2_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream3_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream4_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream5_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream6_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream7_BASE - DMA1_BASE) +}; + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup DMA_LL_Private_Constants DMA Private Constants + * @{ + */ +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure + * @{ + */ +typedef struct +{ + uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer + or as Source base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer + or as Destination base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_LL_EC_DIRECTION + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ + + uint32_t Mode; /*!< Specifies the normal or circular operation mode. + This parameter can be a value of @ref DMA_LL_EC_MODE + @note The circular buffer mode cannot be used if the memory to memory + data transfer direction is configured on the selected Stream + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ + + uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_PERIPH + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ + + uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_MEMORY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ + + uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ + + uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ + + uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. + The data unit is equal to the source buffer configuration set in PeripheralSize + or MemorySize parameters depending in the transfer direction. + This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ + + uint32_t Channel; /*!< Specifies the peripheral channel. + This parameter can be a value of @ref DMA_LL_EC_CHANNEL + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelSelection(). */ + + uint32_t Priority; /*!< Specifies the channel priority level. + This parameter can be a value of @ref DMA_LL_EC_PRIORITY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetStreamPriorityLevel(). */ + + uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. + This parameter can be a value of @ref DMA_LL_FIFOMODE + @note The Direct mode (FIFO mode disabled) cannot be used if the + memory-to-memory data transfer is configured on the selected stream + + This feature can be modified afterwards using unitary functions @ref LL_DMA_EnableFifoMode() or @ref LL_DMA_EnableFifoMode() . */ + + uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. + This parameter can be a value of @ref DMA_LL_EC_FIFOTHRESHOLD + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetFIFOThreshold(). */ + + uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_LL_EC_MBURST + @note The burst mode is possible only if the address Increment mode is enabled. + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryBurstxfer(). */ + + uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_LL_EC_PBURST + @note The burst mode is possible only if the address Increment mode is enabled. + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphBurstxfer(). */ + +} LL_DMA_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants + * @{ + */ + +/** @defgroup DMA_LL_EC_STREAM STREAM + * @{ + */ +#define LL_DMA_STREAM_0 0x00000000U +#define LL_DMA_STREAM_1 0x00000001U +#define LL_DMA_STREAM_2 0x00000002U +#define LL_DMA_STREAM_3 0x00000003U +#define LL_DMA_STREAM_4 0x00000004U +#define LL_DMA_STREAM_5 0x00000005U +#define LL_DMA_STREAM_6 0x00000006U +#define LL_DMA_STREAM_7 0x00000007U +#define LL_DMA_STREAM_ALL 0xFFFF0000U +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DIRECTION DIRECTION + * @{ + */ +#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_SxCR_DIR_0 /*!< Memory to peripheral direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_SxCR_DIR_1 /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MODE MODE + * @{ + */ +#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ +#define LL_DMA_MODE_CIRCULAR DMA_SxCR_CIRC /*!< Circular Mode */ +#define LL_DMA_MODE_PFCTRL DMA_SxCR_PFCTRL /*!< Peripheral flow control mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DOUBLEBUFFER_MODE DOUBLEBUFFER MODE + * @{ + */ +#define LL_DMA_DOUBLEBUFFER_MODE_DISABLE 0x00000000U /*!< Disable double buffering mode */ +#define LL_DMA_DOUBLEBUFFER_MODE_ENABLE DMA_SxCR_DBM /*!< Enable double buffering mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PERIPH PERIPH + * @{ + */ +#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ +#define LL_DMA_PERIPH_INCREMENT DMA_SxCR_PINC /*!< Peripheral increment mode Enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MEMORY MEMORY + * @{ + */ +#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ +#define LL_DMA_MEMORY_INCREMENT DMA_SxCR_MINC /*!< Memory increment mode Enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PDATAALIGN PDATAALIGN + * @{ + */ +#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ +#define LL_DMA_PDATAALIGN_HALFWORD DMA_SxCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ +#define LL_DMA_PDATAALIGN_WORD DMA_SxCR_PSIZE_1 /*!< Peripheral data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MDATAALIGN MDATAALIGN + * @{ + */ +#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ +#define LL_DMA_MDATAALIGN_HALFWORD DMA_SxCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ +#define LL_DMA_MDATAALIGN_WORD DMA_SxCR_MSIZE_1 /*!< Memory data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_OFFSETSIZE OFFSETSIZE + * @{ + */ +#define LL_DMA_OFFSETSIZE_PSIZE 0x00000000U /*!< Peripheral increment offset size is linked to the PSIZE */ +#define LL_DMA_OFFSETSIZE_FIXEDTO4 DMA_SxCR_PINCOS /*!< Peripheral increment offset size is fixed to 4 (32-bit alignment) */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PRIORITY PRIORITY + * @{ + */ +#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ +#define LL_DMA_PRIORITY_MEDIUM DMA_SxCR_PL_0 /*!< Priority level : Medium */ +#define LL_DMA_PRIORITY_HIGH DMA_SxCR_PL_1 /*!< Priority level : High */ +#define LL_DMA_PRIORITY_VERYHIGH DMA_SxCR_PL /*!< Priority level : Very_High */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CHANNEL CHANNEL + * @{ + */ +#define LL_DMA_CHANNEL_0 0x00000000U /* Select Channel0 of DMA Instance */ +#define LL_DMA_CHANNEL_1 DMA_SxCR_CHSEL_0 /* Select Channel1 of DMA Instance */ +#define LL_DMA_CHANNEL_2 DMA_SxCR_CHSEL_1 /* Select Channel2 of DMA Instance */ +#define LL_DMA_CHANNEL_3 (DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1) /* Select Channel3 of DMA Instance */ +#define LL_DMA_CHANNEL_4 DMA_SxCR_CHSEL_2 /* Select Channel4 of DMA Instance */ +#define LL_DMA_CHANNEL_5 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel5 of DMA Instance */ +#define LL_DMA_CHANNEL_6 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel6 of DMA Instance */ +#define LL_DMA_CHANNEL_7 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel7 of DMA Instance */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MBURST MBURST + * @{ + */ +#define LL_DMA_MBURST_SINGLE 0x00000000U /*!< Memory burst single transfer configuration */ +#define LL_DMA_MBURST_INC4 DMA_SxCR_MBURST_0 /*!< Memory burst of 4 beats transfer configuration */ +#define LL_DMA_MBURST_INC8 DMA_SxCR_MBURST_1 /*!< Memory burst of 8 beats transfer configuration */ +#define LL_DMA_MBURST_INC16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) /*!< Memory burst of 16 beats transfer configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PBURST PBURST + * @{ + */ +#define LL_DMA_PBURST_SINGLE 0x00000000U /*!< Peripheral burst single transfer configuration */ +#define LL_DMA_PBURST_INC4 DMA_SxCR_PBURST_0 /*!< Peripheral burst of 4 beats transfer configuration */ +#define LL_DMA_PBURST_INC8 DMA_SxCR_PBURST_1 /*!< Peripheral burst of 8 beats transfer configuration */ +#define LL_DMA_PBURST_INC16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) /*!< Peripheral burst of 16 beats transfer configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_FIFOMODE DMA_LL_FIFOMODE + * @{ + */ +#define LL_DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable (direct mode is enabled) */ +#define LL_DMA_FIFOMODE_ENABLE DMA_SxFCR_DMDIS /*!< FIFO mode enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_FIFOSTATUS_0 FIFOSTATUS 0 + * @{ + */ +#define LL_DMA_FIFOSTATUS_0_25 0x00000000U /*!< 0 < fifo_level < 1/4 */ +#define LL_DMA_FIFOSTATUS_25_50 DMA_SxFCR_FS_0 /*!< 1/4 < fifo_level < 1/2 */ +#define LL_DMA_FIFOSTATUS_50_75 DMA_SxFCR_FS_1 /*!< 1/2 < fifo_level < 3/4 */ +#define LL_DMA_FIFOSTATUS_75_100 (DMA_SxFCR_FS_1 | DMA_SxFCR_FS_0) /*!< 3/4 < fifo_level < full */ +#define LL_DMA_FIFOSTATUS_EMPTY DMA_SxFCR_FS_2 /*!< FIFO is empty */ +#define LL_DMA_FIFOSTATUS_FULL (DMA_SxFCR_FS_2 | DMA_SxFCR_FS_0) /*!< FIFO is full */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_FIFOTHRESHOLD FIFOTHRESHOLD + * @{ + */ +#define LL_DMA_FIFOTHRESHOLD_1_4 0x00000000U /*!< FIFO threshold 1 quart full configuration */ +#define LL_DMA_FIFOTHRESHOLD_1_2 DMA_SxFCR_FTH_0 /*!< FIFO threshold half full configuration */ +#define LL_DMA_FIFOTHRESHOLD_3_4 DMA_SxFCR_FTH_1 /*!< FIFO threshold 3 quarts full configuration */ +#define LL_DMA_FIFOTHRESHOLD_FULL DMA_SxFCR_FTH /*!< FIFO threshold full configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CURRENTTARGETMEM CURRENTTARGETMEM + * @{ + */ +#define LL_DMA_CURRENTTARGETMEM0 0x00000000U /*!< Set CurrentTarget Memory to Memory 0 */ +#define LL_DMA_CURRENTTARGETMEM1 DMA_SxCR_CT /*!< Set CurrentTarget Memory to Memory 1 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros + * @{ + */ + +/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros + * @{ + */ +/** + * @brief Write a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxStreamy + * @{ + */ +/** + * @brief Convert DMAx_Streamy into DMAx + * @param __STREAM_INSTANCE__ DMAx_Streamy + * @retval DMAx + */ +#define __LL_DMA_GET_INSTANCE(__STREAM_INSTANCE__) \ +(((uint32_t)(__STREAM_INSTANCE__) > ((uint32_t)DMA1_Stream7)) ? DMA2 : DMA1) + +/** + * @brief Convert DMAx_Streamy into LL_DMA_STREAM_y + * @param __STREAM_INSTANCE__ DMAx_Streamy + * @retval LL_DMA_CHANNEL_y + */ +#define __LL_DMA_GET_STREAM(__STREAM_INSTANCE__) \ +(((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream0)) ? LL_DMA_STREAM_0 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream0)) ? LL_DMA_STREAM_0 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream1)) ? LL_DMA_STREAM_1 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream1)) ? LL_DMA_STREAM_1 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream2)) ? LL_DMA_STREAM_2 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream2)) ? LL_DMA_STREAM_2 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream3)) ? LL_DMA_STREAM_3 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream3)) ? LL_DMA_STREAM_3 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream4)) ? LL_DMA_STREAM_4 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream4)) ? LL_DMA_STREAM_4 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream5)) ? LL_DMA_STREAM_5 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream5)) ? LL_DMA_STREAM_5 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream6)) ? LL_DMA_STREAM_6 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream6)) ? LL_DMA_STREAM_6 : \ + LL_DMA_STREAM_7) + +/** + * @brief Convert DMA Instance DMAx and LL_DMA_STREAM_y into DMAx_Streamy + * @param __DMA_INSTANCE__ DMAx + * @param __STREAM__ LL_DMA_STREAM_y + * @retval DMAx_Streamy + */ +#define __LL_DMA_GET_STREAM_INSTANCE(__DMA_INSTANCE__, __STREAM__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA1_Stream0 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA2_Stream0 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA1_Stream1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA2_Stream1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA1_Stream2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA2_Stream2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA1_Stream3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA2_Stream3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA1_Stream4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA2_Stream4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA1_Stream5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA2_Stream5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA1_Stream6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA2_Stream6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_7))) ? DMA1_Stream7 : \ + DMA2_Stream7) + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + /** @defgroup DMA_LL_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enable DMA stream. + * @rmtoll CR EN LL_DMA_EnableStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); +} + +/** + * @brief Disable DMA stream. + * @rmtoll CR EN LL_DMA_DisableStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); +} + +/** + * @brief Check if DMA stream is enabled or disabled. + * @rmtoll CR EN LL_DMA_IsEnabledStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN) == (DMA_SxCR_EN)); +} + +/** + * @brief Configure all parameters linked to DMA transfer. + * @rmtoll CR DIR LL_DMA_ConfigTransfer\n + * CR CIRC LL_DMA_ConfigTransfer\n + * CR PINC LL_DMA_ConfigTransfer\n + * CR MINC LL_DMA_ConfigTransfer\n + * CR PSIZE LL_DMA_ConfigTransfer\n + * CR MSIZE LL_DMA_ConfigTransfer\n + * CR PL LL_DMA_ConfigTransfer\n + * CR PFCTRL LL_DMA_ConfigTransfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR or @ref LL_DMA_MODE_PFCTRL + * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD + * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD + * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH + *@retval None + */ +__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Configuration) +{ + MODIFY_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, + DMA_SxCR_DIR | DMA_SxCR_CIRC | DMA_SxCR_PINC | DMA_SxCR_MINC | DMA_SxCR_PSIZE | DMA_SxCR_MSIZE | DMA_SxCR_PL | DMA_SxCR_PFCTRL, + Configuration); +} + +/** + * @brief Set Data transfer direction (read from peripheral or from memory). + * @rmtoll CR DIR LL_DMA_SetDataTransferDirection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Direction) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR, Direction); +} + +/** + * @brief Get Data transfer direction (read from peripheral or from memory). + * @rmtoll CR DIR LL_DMA_GetDataTransferDirection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR)); +} + +/** + * @brief Set DMA mode normal, circular or peripheral flow control. + * @rmtoll CR CIRC LL_DMA_SetMode\n + * CR PFCTRL LL_DMA_SetMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @arg @ref LL_DMA_MODE_PFCTRL + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL, Mode); +} + +/** + * @brief Get DMA mode normal, circular or peripheral flow control. + * @rmtoll CR CIRC LL_DMA_GetMode\n + * CR PFCTRL LL_DMA_GetMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @arg @ref LL_DMA_MODE_PFCTRL + */ +__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL)); +} + +/** + * @brief Set Peripheral increment mode. + * @rmtoll CR PINC LL_DMA_SetPeriphIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param IncrementMode This parameter can be one of the following values: + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC, IncrementMode); +} + +/** + * @brief Get Peripheral increment mode. + * @rmtoll CR PINC LL_DMA_GetPeriphIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_PERIPH_INCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC)); +} + +/** + * @brief Set Memory increment mode. + * @rmtoll CR MINC LL_DMA_SetMemoryIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param IncrementMode This parameter can be one of the following values: + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC, IncrementMode); +} + +/** + * @brief Get Memory increment mode. + * @rmtoll CR MINC LL_DMA_GetMemoryIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC)); +} + +/** + * @brief Set Peripheral size. + * @rmtoll CR PSIZE LL_DMA_SetPeriphSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Size This parameter can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE, Size); +} + +/** + * @brief Get Peripheral size. + * @rmtoll CR PSIZE LL_DMA_GetPeriphSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE)); +} + +/** + * @brief Set Memory size. + * @rmtoll CR MSIZE LL_DMA_SetMemorySize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Size This parameter can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE, Size); +} + +/** + * @brief Get Memory size. + * @rmtoll CR MSIZE LL_DMA_GetMemorySize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE)); +} + +/** + * @brief Set Peripheral increment offset size. + * @rmtoll CR PINCOS LL_DMA_SetIncOffsetSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param OffsetSize This parameter can be one of the following values: + * @arg @ref LL_DMA_OFFSETSIZE_PSIZE + * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t OffsetSize) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS, OffsetSize); +} + +/** + * @brief Get Peripheral increment offset size. + * @rmtoll CR PINCOS LL_DMA_GetIncOffsetSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_OFFSETSIZE_PSIZE + * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 + */ +__STATIC_INLINE uint32_t LL_DMA_GetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS)); +} + +/** + * @brief Set Stream priority level. + * @rmtoll CR PL LL_DMA_SetStreamPriorityLevel + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Priority This parameter can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Priority) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL, Priority); +} + +/** + * @brief Get Stream priority level. + * @rmtoll CR PL LL_DMA_GetStreamPriorityLevel + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + */ +__STATIC_INLINE uint32_t LL_DMA_GetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL)); +} + +/** + * @brief Set Number of data to transfer. + * @rmtoll NDTR NDT LL_DMA_SetDataLength + * @note This action has no effect if + * stream is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param NbData Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT, NbData); +} + +/** + * @brief Get Number of data to transfer. + * @rmtoll NDTR NDT LL_DMA_GetDataLength + * @note Once the stream is enabled, the return value indicate the + * remaining bytes to be transmitted. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT)); +} + +/** + * @brief Select Channel number associated to the Stream. + * @rmtoll CR CHSEL LL_DMA_SetChannelSelection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_0 + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Channel) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL, Channel); +} + +/** + * @brief Get the Channel number associated to the Stream. + * @rmtoll CR CHSEL LL_DMA_GetChannelSelection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_0 + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + */ +__STATIC_INLINE uint32_t LL_DMA_GetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL)); +} + +/** + * @brief Set Memory burst transfer configuration. + * @rmtoll CR MBURST LL_DMA_SetMemoryBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Mburst This parameter can be one of the following values: + * @arg @ref LL_DMA_MBURST_SINGLE + * @arg @ref LL_DMA_MBURST_INC4 + * @arg @ref LL_DMA_MBURST_INC8 + * @arg @ref LL_DMA_MBURST_INC16 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mburst) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST, Mburst); +} + +/** + * @brief Get Memory burst transfer configuration. + * @rmtoll CR MBURST LL_DMA_GetMemoryBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MBURST_SINGLE + * @arg @ref LL_DMA_MBURST_INC4 + * @arg @ref LL_DMA_MBURST_INC8 + * @arg @ref LL_DMA_MBURST_INC16 + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST)); +} + +/** + * @brief Set Peripheral burst transfer configuration. + * @rmtoll CR PBURST LL_DMA_SetPeriphBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Pburst This parameter can be one of the following values: + * @arg @ref LL_DMA_PBURST_SINGLE + * @arg @ref LL_DMA_PBURST_INC4 + * @arg @ref LL_DMA_PBURST_INC8 + * @arg @ref LL_DMA_PBURST_INC16 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Pburst) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST, Pburst); +} + +/** + * @brief Get Peripheral burst transfer configuration. + * @rmtoll CR PBURST LL_DMA_GetPeriphBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PBURST_SINGLE + * @arg @ref LL_DMA_PBURST_INC4 + * @arg @ref LL_DMA_PBURST_INC8 + * @arg @ref LL_DMA_PBURST_INC16 + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST)); +} + +/** + * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. + * @rmtoll CR CT LL_DMA_SetCurrentTargetMem + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param CurrentMemory This parameter can be one of the following values: + * @arg @ref LL_DMA_CURRENTTARGETMEM0 + * @arg @ref LL_DMA_CURRENTTARGETMEM1 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t CurrentMemory) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT, CurrentMemory); +} + +/** + * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. + * @rmtoll CR CT LL_DMA_GetCurrentTargetMem + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_CURRENTTARGETMEM0 + * @arg @ref LL_DMA_CURRENTTARGETMEM1 + */ +__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); +} + +/** + * @brief Enable the double buffer mode. + * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Disable the double buffer mode. + * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Get FIFO status. + * @rmtoll FCR FS LL_DMA_GetFIFOStatus + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOSTATUS_0_25 + * @arg @ref LL_DMA_FIFOSTATUS_25_50 + * @arg @ref LL_DMA_FIFOSTATUS_50_75 + * @arg @ref LL_DMA_FIFOSTATUS_75_100 + * @arg @ref LL_DMA_FIFOSTATUS_EMPTY + * @arg @ref LL_DMA_FIFOSTATUS_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); +} + +/** + * @brief Disable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Enable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Select FIFO threshold. + * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Threshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); +} + +/** + * @brief Get FIFO threshold. + * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); +} + +/** + * @brief Configure the FIFO . + * @rmtoll FCR FTH LL_DMA_ConfigFifo\n + * FCR DMDIS LL_DMA_ConfigFifo + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param FifoMode This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOMODE_ENABLE + * @arg @ref LL_DMA_FIFOMODE_DISABLE + * @param FifoThreshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); +} + +/** + * @brief Configure the Source and Destination addresses. + * @note This API must not be called when the DMA stream is enabled. + * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n + * PAR PA LL_DMA_ConfigAddresses + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param SrcAddress Between 0 to 0xFFFFFFFF + * @param DstAddress Between 0 to 0xFFFFFFFF + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) +{ + /* Direction Memory to Periph */ + if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); + } + /* Direction Periph to Memory and Memory to Memory */ + else + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); + } +} + +/** + * @brief Set the Memory address. + * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); +} + +/** + * @brief Set the Peripheral address. + * @rmtoll PAR PA LL_DMA_SetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param PeriphAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); +} + +/** + * @brief Get the Memory address. + * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Get the Peripheral address. + * @rmtoll PAR PA LL_DMA_GetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); +} + +/** + * @brief Set the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); +} + +/** + * @brief Set the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); + } + +/** + * @brief Get the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) + { + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); + } + +/** + * @brief Get the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Set Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_SetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Address Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, DMA_SxM1AR_M1A, Address); +} + +/** + * @brief Get Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_GetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Stream 0 half transfer flag. + * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); +} + +/** + * @brief Get Stream 1 half transfer flag. + * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); +} + +/** + * @brief Get Stream 2 half transfer flag. + * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); +} + +/** + * @brief Get Stream 3 half transfer flag. + * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); +} + +/** + * @brief Get Stream 4 half transfer flag. + * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); +} + +/** + * @brief Get Stream 5 half transfer flag. + * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); +} + +/** + * @brief Get Stream 6 half transfer flag. + * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); +} + +/** + * @brief Get Stream 7 half transfer flag. + * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); +} + +/** + * @brief Get Stream 0 transfer complete flag. + * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); +} + +/** + * @brief Get Stream 1 transfer complete flag. + * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); +} + +/** + * @brief Get Stream 2 transfer complete flag. + * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); +} + +/** + * @brief Get Stream 3 transfer complete flag. + * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); +} + +/** + * @brief Get Stream 4 transfer complete flag. + * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); +} + +/** + * @brief Get Stream 5 transfer complete flag. + * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); +} + +/** + * @brief Get Stream 6 transfer complete flag. + * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); +} + +/** + * @brief Get Stream 7 transfer complete flag. + * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); +} + +/** + * @brief Get Stream 0 transfer error flag. + * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); +} + +/** + * @brief Get Stream 1 transfer error flag. + * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); +} + +/** + * @brief Get Stream 2 transfer error flag. + * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); +} + +/** + * @brief Get Stream 3 transfer error flag. + * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); +} + +/** + * @brief Get Stream 4 transfer error flag. + * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); +} + +/** + * @brief Get Stream 5 transfer error flag. + * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); +} + +/** + * @brief Get Stream 6 transfer error flag. + * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); +} + +/** + * @brief Get Stream 7 transfer error flag. + * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); +} + +/** + * @brief Get Stream 0 direct mode error flag. + * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); +} + +/** + * @brief Get Stream 1 direct mode error flag. + * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); +} + +/** + * @brief Get Stream 2 direct mode error flag. + * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); +} + +/** + * @brief Get Stream 3 direct mode error flag. + * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); +} + +/** + * @brief Get Stream 4 direct mode error flag. + * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); +} + +/** + * @brief Get Stream 5 direct mode error flag. + * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); +} + +/** + * @brief Get Stream 6 direct mode error flag. + * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); +} + +/** + * @brief Get Stream 7 direct mode error flag. + * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); +} + +/** + * @brief Get Stream 0 FIFO error flag. + * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); +} + +/** + * @brief Get Stream 1 FIFO error flag. + * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); +} + +/** + * @brief Get Stream 2 FIFO error flag. + * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); +} + +/** + * @brief Get Stream 3 FIFO error flag. + * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); +} + +/** + * @brief Get Stream 4 FIFO error flag. + * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); +} + +/** + * @brief Get Stream 5 FIFO error flag. + * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); +} + +/** + * @brief Get Stream 6 FIFO error flag. + * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); +} + +/** + * @brief Get Stream 7 FIFO error flag. + * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); +} + +/** + * @brief Clear Stream 0 half transfer flag. + * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CHTIF0); +} + +/** + * @brief Clear Stream 1 half transfer flag. + * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CHTIF1); +} + +/** + * @brief Clear Stream 2 half transfer flag. + * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CHTIF2); +} + +/** + * @brief Clear Stream 3 half transfer flag. + * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CHTIF3); +} + +/** + * @brief Clear Stream 4 half transfer flag. + * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CHTIF4); +} + +/** + * @brief Clear Stream 5 half transfer flag. + * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CHTIF5); +} + +/** + * @brief Clear Stream 6 half transfer flag. + * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CHTIF6); +} + +/** + * @brief Clear Stream 7 half transfer flag. + * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CHTIF7); +} + +/** + * @brief Clear Stream 0 transfer complete flag. + * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTCIF0); +} + +/** + * @brief Clear Stream 1 transfer complete flag. + * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTCIF1); +} + +/** + * @brief Clear Stream 2 transfer complete flag. + * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTCIF2); +} + +/** + * @brief Clear Stream 3 transfer complete flag. + * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTCIF3); +} + +/** + * @brief Clear Stream 4 transfer complete flag. + * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTCIF4); +} + +/** + * @brief Clear Stream 5 transfer complete flag. + * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTCIF5); +} + +/** + * @brief Clear Stream 6 transfer complete flag. + * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTCIF6); +} + +/** + * @brief Clear Stream 7 transfer complete flag. + * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTCIF7); +} + +/** + * @brief Clear Stream 0 transfer error flag. + * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTEIF0); +} + +/** + * @brief Clear Stream 1 transfer error flag. + * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTEIF1); +} + +/** + * @brief Clear Stream 2 transfer error flag. + * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTEIF2); +} + +/** + * @brief Clear Stream 3 transfer error flag. + * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CTEIF3); +} + +/** + * @brief Clear Stream 4 transfer error flag. + * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTEIF4); +} + +/** + * @brief Clear Stream 5 transfer error flag. + * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTEIF5); +} + +/** + * @brief Clear Stream 6 transfer error flag. + * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTEIF6); +} + +/** + * @brief Clear Stream 7 transfer error flag. + * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CTEIF7); +} + +/** + * @brief Clear Stream 0 direct mode error flag. + * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); +} + +/** + * @brief Clear Stream 1 direct mode error flag. + * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); +} + +/** + * @brief Clear Stream 2 direct mode error flag. + * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); +} + +/** + * @brief Clear Stream 3 direct mode error flag. + * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); +} + +/** + * @brief Clear Stream 4 direct mode error flag. + * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); +} + +/** + * @brief Clear Stream 5 direct mode error flag. + * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); +} + +/** + * @brief Clear Stream 6 direct mode error flag. + * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); +} + +/** + * @brief Clear Stream 7 direct mode error flag. + * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); +} + +/** + * @brief Clear Stream 0 FIFO error flag. + * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CFEIF0); +} + +/** + * @brief Clear Stream 1 FIFO error flag. + * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CFEIF1); +} + +/** + * @brief Clear Stream 2 FIFO error flag. + * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CFEIF2); +} + +/** + * @brief Clear Stream 3 FIFO error flag. + * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->LIFCR , DMA_LIFCR_CFEIF3); +} + +/** + * @brief Clear Stream 4 FIFO error flag. + * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CFEIF4); +} + +/** + * @brief Clear Stream 5 FIFO error flag. + * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CFEIF5); +} + +/** + * @brief Clear Stream 6 FIFO error flag. + * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CFEIF6); +} + +/** + * @brief Clear Stream 7 FIFO error flag. + * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) +{ + SET_BIT(DMAx->HIFCR , DMA_HIFCR_CFEIF7); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_EnableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Enable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_EnableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Enable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_EnableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Enable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_EnableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Enable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_EnableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Disable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_DisableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Disable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_DisableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Disable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_DisableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Disable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_DisableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Disable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_DisableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Check if Half transfer interrup is enabled. + * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); +} + +/** + * @brief Check if Transfer error nterrup is enabled. + * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); +} + +/** + * @brief Check if Transfer complete interrup is enabled. + * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); +} + +/** + * @brief Check if Direct mode error interrupt is enabled. + * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); +} + +/** + * @brief Check if FIFO error interrup is enabled. + * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_DMA_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h new file mode 100644 index 0000000..560c8a5 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma2d.h @@ -0,0 +1,1851 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dma2d.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of DMA2D LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_DMA2D_H +#define __STM32F4xx_LL_DMA2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (DMA2D) + +/** @defgroup DMA2D_LL DMA2D + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA2D_LL_Private_Macros DMA2D Private Macros + * @{ + */ + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA2D_LL_ES_Init_Struct DMA2D Exported Init structures + * @{ + */ + +/** + * @brief LL DMA2D Init Structure Definition + */ +typedef struct +{ + uint32_t Mode; /*!< Specifies the DMA2D transfer mode. + - This parameter can be one value of @ref DMA2D_LL_EC_MODE. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetMode().*/ + + uint32_t ColorMode; /*!< Specifies the color format of the output image. + - This parameter can be one value of @ref DMA2D_LL_EC_OUTPUT_COLOR_MODE. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColorMode(). */ + + uint32_t OutputBlue; /*!< Specifies the Blue value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputGreen; /*!< Specifies the Green value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x3F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputRed; /*!< Specifies the Red value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputAlpha; /*!< Specifies the Alpha channel of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x01 if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + - This parameter is not considered if RGB888 or RGB565 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputMemoryAddress; /*!< Specifies the memory address. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputMemAddr(). */ + + uint32_t LineOffset; /*!< Specifies the output line offset value. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetLineOffset(). */ + + uint32_t NbrOfLines; /*!< Specifies the number of lines of the area to be transferred. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetNbrOfLines(). */ + + uint32_t NbrOfPixelsPerLines; /*!< Specifies the number of pixels per lines of the area to be transfered. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetNbrOfPixelsPerLines(). */ + +} LL_DMA2D_InitTypeDef; + +/** + * @brief LL DMA2D Layer Configuration Structure Definition + */ +typedef struct +{ + uint32_t MemoryAddress; /*!< Specifies the foreground or background memory address. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetMemAddr() for foreground layer, + - @ref LL_DMA2D_BGND_SetMemAddr() for background layer. */ + + uint32_t LineOffset; /*!< Specifies the foreground or background line offset value. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x3FFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetLineOffset() for foreground layer, + - @ref LL_DMA2D_BGND_SetLineOffset() for background layer. */ + + uint32_t ColorMode; /*!< Specifies the foreground or background color mode. + - This parameter can be one value of @ref DMA2D_LL_EC_INPUT_COLOR_MODE. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetColorMode() for foreground layer, + - @ref LL_DMA2D_BGND_SetColorMode() for background layer. */ + + uint32_t CLUTColorMode; /*!< Specifies the foreground or background CLUT color mode. + - This parameter can be one value of @ref DMA2D_LL_EC_CLUT_COLOR_MODE. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetCLUTColorMode() for foreground layer, + - @ref LL_DMA2D_BGND_SetCLUTColorMode() for background layer. */ + + uint32_t CLUTSize; /*!< Specifies the foreground or background CLUT size. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetCLUTSize() for foreground layer, + - @ref LL_DMA2D_BGND_SetCLUTSize() for background layer. */ + + uint32_t AlphaMode; /*!< Specifies the foreground or background alpha mode. + - This parameter can be one value of @ref DMA2D_LL_EC_ALPHA_MODE. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetAlphaMode() for foreground layer, + - @ref LL_DMA2D_BGND_SetAlphaMode() for background layer. */ + + uint32_t Alpha; /*!< Specifies the foreground or background Alpha value. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetAlpha() for foreground layer, + - @ref LL_DMA2D_BGND_SetAlpha() for background layer. */ + + uint32_t Blue; /*!< Specifies the foreground or background Blue color value. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetBlueColor() for foreground layer, + - @ref LL_DMA2D_BGND_SetBlueColor() for background layer. */ + + uint32_t Green; /*!< Specifies the foreground or background Green color value. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetGreenColor() for foreground layer, + - @ref LL_DMA2D_BGND_SetGreenColor() for background layer. */ + + uint32_t Red; /*!< Specifies the foreground or background Red color value. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetRedColor() for foreground layer, + - @ref LL_DMA2D_BGND_SetRedColor() for background layer. */ + + uint32_t CLUTMemoryAddress; /*!< Specifies the foreground or background CLUT memory address. + - This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFFFFFF. + + This parameter can be modified afterwards using unitary functions + - @ref LL_DMA2D_FGND_SetCLUTMemAddr() for foreground layer, + - @ref LL_DMA2D_BGND_SetCLUTMemAddr() for background layer. */ + +} LL_DMA2D_LayerCfgTypeDef; + +/** + * @brief LL DMA2D Output Color Structure Definition + */ +typedef struct +{ + uint32_t ColorMode; /*!< Specifies the color format of the output image. + - This parameter can be one value of @ref DMA2D_LL_EC_OUTPUT_COLOR_MODE. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColorMode(). */ + + uint32_t OutputBlue; /*!< Specifies the Blue value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputGreen; /*!< Specifies the Green value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x3F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputRed; /*!< Specifies the Red value of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if RGB888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if RGB565 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + + uint32_t OutputAlpha; /*!< Specifies the Alpha channel of the output image. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF if ARGB8888 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x01 if ARGB1555 color mode is selected. + - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x0F if ARGB4444 color mode is selected. + - This parameter is not considered if RGB888 or RGB565 color mode is selected. + + This parameter can be modified afterwards using unitary function @ref LL_DMA2D_SetOutputColor() or configuration + function @ref LL_DMA2D_ConfigOutputColor(). */ + +} LL_DMA2D_ColorTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DMA2D_LL_Exported_Constants DMA2D Exported Constants + * @{ + */ + +/** @defgroup DMA2D_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_DMA2D_ReadReg function + * @{ + */ +#define LL_DMA2D_FLAG_CEIF DMA2D_ISR_CEIF /*!< Configuration Error Interrupt Flag */ +#define LL_DMA2D_FLAG_CTCIF DMA2D_ISR_CTCIF /*!< CLUT Transfer Complete Interrupt Flag */ +#define LL_DMA2D_FLAG_CAEIF DMA2D_ISR_CAEIF /*!< CLUT Access Error Interrupt Flag */ +#define LL_DMA2D_FLAG_TWIF DMA2D_ISR_TWIF /*!< Transfer Watermark Interrupt Flag */ +#define LL_DMA2D_FLAG_TCIF DMA2D_ISR_TCIF /*!< Transfer Complete Interrupt Flag */ +#define LL_DMA2D_FLAG_TEIF DMA2D_ISR_TEIF /*!< Transfer Error Interrupt Flag */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_DMA2D_ReadReg and LL_DMA2D_WriteReg functions + * @{ + */ +#define LL_DMA2D_IT_CEIE DMA2D_CR_CEIE /*!< Configuration Error Interrupt */ +#define LL_DMA2D_IT_CTCIE DMA2D_CR_CTCIE /*!< CLUT Transfer Complete Interrupt */ +#define LL_DMA2D_IT_CAEIE DMA2D_CR_CAEIE /*!< CLUT Access Error Interrupt */ +#define LL_DMA2D_IT_TWIE DMA2D_CR_TWIE /*!< Transfer Watermark Interrupt */ +#define LL_DMA2D_IT_TCIE DMA2D_CR_TCIE /*!< Transfer Complete Interrupt */ +#define LL_DMA2D_IT_TEIE DMA2D_CR_TEIE /*!< Transfer Error Interrupt */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_MODE Mode + * @{ + */ +#define LL_DMA2D_MODE_M2M 0x00000000U /*!< DMA2D memory to memory transfer mode */ +#define LL_DMA2D_MODE_M2M_PFC DMA2D_CR_MODE_0 /*!< DMA2D memory to memory with pixel format conversion transfer mode */ +#define LL_DMA2D_MODE_M2M_BLEND DMA2D_CR_MODE_1 /*!< DMA2D memory to memory with blending transfer mode */ +#define LL_DMA2D_MODE_R2M DMA2D_CR_MODE /*!< DMA2D register to memory transfer mode */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_OUTPUT_COLOR_MODE Output Color Mode + * @{ + */ +#define LL_DMA2D_OUTPUT_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ +#define LL_DMA2D_OUTPUT_MODE_RGB888 DMA2D_OPFCCR_CM_0 /*!< RGB888 */ +#define LL_DMA2D_OUTPUT_MODE_RGB565 DMA2D_OPFCCR_CM_1 /*!< RGB565 */ +#define LL_DMA2D_OUTPUT_MODE_ARGB1555 (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /*!< ARGB1555 */ +#define LL_DMA2D_OUTPUT_MODE_ARGB4444 DMA2D_OPFCCR_CM_2 /*!< ARGB4444 */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_INPUT_COLOR_MODE Input Color Mode + * @{ + */ +#define LL_DMA2D_INPUT_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ +#define LL_DMA2D_INPUT_MODE_RGB888 DMA2D_FGPFCCR_CM_0 /*!< RGB888 */ +#define LL_DMA2D_INPUT_MODE_RGB565 DMA2D_FGPFCCR_CM_1 /*!< RGB565 */ +#define LL_DMA2D_INPUT_MODE_ARGB1555 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_1) /*!< ARGB1555 */ +#define LL_DMA2D_INPUT_MODE_ARGB4444 DMA2D_FGPFCCR_CM_2 /*!< ARGB4444 */ +#define LL_DMA2D_INPUT_MODE_L8 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_2) /*!< L8 */ +#define LL_DMA2D_INPUT_MODE_AL44 (DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_2) /*!< AL44 */ +#define LL_DMA2D_INPUT_MODE_AL88 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_2) /*!< AL88 */ +#define LL_DMA2D_INPUT_MODE_L4 DMA2D_FGPFCCR_CM_3 /*!< L4 */ +#define LL_DMA2D_INPUT_MODE_A8 (DMA2D_FGPFCCR_CM_0|DMA2D_FGPFCCR_CM_3) /*!< A8 */ +#define LL_DMA2D_INPUT_MODE_A4 (DMA2D_FGPFCCR_CM_1|DMA2D_FGPFCCR_CM_3) /*!< A4 */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_ALPHA_MODE Alpha Mode + * @{ + */ +#define LL_DMA2D_ALPHA_MODE_NO_MODIF 0x00000000U /*!< No modification of the alpha channel value */ +#define LL_DMA2D_ALPHA_MODE_REPLACE DMA2D_FGPFCCR_AM_0 /*!< Replace original alpha channel value by programmed alpha value */ +#define LL_DMA2D_ALPHA_MODE_COMBINE DMA2D_FGPFCCR_AM_1 /*!< Replace original alpha channel value by programmed alpha value + with original alpha channel value */ +/** + * @} + */ + +/** @defgroup DMA2D_LL_EC_CLUT_COLOR_MODE CLUT Color Mode + * @{ + */ +#define LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 0x00000000U /*!< ARGB8888 */ +#define LL_DMA2D_CLUT_COLOR_MODE_RGB888 DMA2D_FGPFCCR_CCM /*!< RGB888 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DMA2D_LL_Exported_Macros DMA2D Exported Macros + * @{ + */ + +/** @defgroup DMA2D_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in DMA2D register. + * @param __INSTANCE__ DMA2D Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_DMA2D_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in DMA2D register. + * @param __INSTANCE__ DMA2D Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_DMA2D_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMA2D_LL_Exported_Functions DMA2D Exported Functions + * @{ + */ + +/** @defgroup DMA2D_LL_EF_Configuration Configuration Functions + * @{ + */ + +/** + * @brief Start a DMA2D transfer. + * @rmtoll CR START LL_DMA2D_Start + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_Start(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_START); +} + +/** + * @brief Indicate if a DMA2D transfer is ongoing. + * @rmtoll CR START LL_DMA2D_IsTransferOngoing + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsTransferOngoing(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_START) == (DMA2D_CR_START)); +} + +/** + * @brief Suspend DMA2D transfer. + * @note This API can be used to suspend automatic foreground or background CLUT loading. + * @rmtoll CR SUSP LL_DMA2D_Suspend + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_Suspend(DMA2D_TypeDef *DMA2Dx) +{ + MODIFY_REG(DMA2Dx->CR, DMA2D_CR_SUSP | DMA2D_CR_START, DMA2D_CR_SUSP); +} + +/** + * @brief Resume DMA2D transfer. + * @note This API can be used to resume automatic foreground or background CLUT loading. + * @rmtoll CR SUSP LL_DMA2D_Resume + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_Resume(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_SUSP | DMA2D_CR_START); +} + +/** + * @brief Indicate if DMA2D transfer is suspended. + * @note This API can be used to indicate whether or not automatic foreground or + * background CLUT loading is suspended. + * @rmtoll CR SUSP LL_DMA2D_IsSuspended + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsSuspended(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_SUSP) == (DMA2D_CR_SUSP)); +} + +/** + * @brief Abort DMA2D transfer. + * @note This API can be used to abort automatic foreground or background CLUT loading. + * @rmtoll CR ABORT LL_DMA2D_Abort + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_Abort(DMA2D_TypeDef *DMA2Dx) +{ + MODIFY_REG(DMA2Dx->CR, DMA2D_CR_ABORT | DMA2D_CR_START, DMA2D_CR_ABORT); +} + +/** + * @brief Indicate if DMA2D transfer is aborted. + * @note This API can be used to indicate whether or not automatic foreground or + * background CLUT loading is aborted. + * @rmtoll CR ABORT LL_DMA2D_IsAborted + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsAborted(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_ABORT) == (DMA2D_CR_ABORT)); +} + +/** + * @brief Set DMA2D mode. + * @rmtoll CR MODE LL_DMA2D_SetMode + * @param DMA2Dx DMA2D Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_MODE_M2M + * @arg @ref LL_DMA2D_MODE_M2M_PFC + * @arg @ref LL_DMA2D_MODE_M2M_BLEND + * @arg @ref LL_DMA2D_MODE_R2M + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetMode(DMA2D_TypeDef *DMA2Dx, uint32_t Mode) +{ + MODIFY_REG(DMA2Dx->CR, DMA2D_CR_MODE, Mode); +} + +/** + * @brief Return DMA2D mode + * @rmtoll CR MODE LL_DMA2D_GetMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_MODE_M2M + * @arg @ref LL_DMA2D_MODE_M2M_PFC + * @arg @ref LL_DMA2D_MODE_M2M_BLEND + * @arg @ref LL_DMA2D_MODE_R2M + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->CR, DMA2D_CR_MODE)); +} + +/** + * @brief Set DMA2D output color mode. + * @rmtoll OPFCCR CM LL_DMA2D_SetOutputColorMode + * @param DMA2Dx DMA2D Instance + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetOutputColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + MODIFY_REG(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM, ColorMode); +} + +/** + * @brief Return DMA2D output color mode. + * @rmtoll OPFCCR CM LL_DMA2D_GetOutputColorMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetOutputColorMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM)); +} + +/** + * @brief Set DMA2D line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll OOR LO LL_DMA2D_SetLineOffset + * @param DMA2Dx DMA2D Instance + * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) +{ + MODIFY_REG(DMA2Dx->OOR, DMA2D_OOR_LO, LineOffset); +} + +/** + * @brief Return DMA2D line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll OOR LO LL_DMA2D_GetLineOffset + * @param DMA2Dx DMA2D Instance + * @retval Line offset value between Min_Data=0 and Max_Data=0x3FFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetLineOffset(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->OOR, DMA2D_OOR_LO)); +} + +/** + * @brief Set DMA2D number of pixels per lines, expressed on 14 bits ([13:0] bits). + * @rmtoll NLR PL LL_DMA2D_SetNbrOfPixelsPerLines + * @param DMA2Dx DMA2D Instance + * @param NbrOfPixelsPerLines Value between Min_Data=0 and Max_Data=0x3FFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetNbrOfPixelsPerLines(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfPixelsPerLines) +{ + MODIFY_REG(DMA2Dx->NLR, DMA2D_NLR_PL, (NbrOfPixelsPerLines << DMA2D_NLR_PL_Pos)); +} + +/** + * @brief Return DMA2D number of pixels per lines, expressed on 14 bits ([13:0] bits) + * @rmtoll NLR PL LL_DMA2D_GetNbrOfPixelsPerLines + * @param DMA2Dx DMA2D Instance + * @retval Number of pixels per lines value between Min_Data=0 and Max_Data=0x3FFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetNbrOfPixelsPerLines(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->NLR, DMA2D_NLR_PL) >> DMA2D_NLR_PL_Pos); +} + +/** + * @brief Set DMA2D number of lines, expressed on 16 bits ([15:0] bits). + * @rmtoll NLR NL LL_DMA2D_SetNbrOfLines + * @param DMA2Dx DMA2D Instance + * @param NbrOfLines Value between Min_Data=0 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetNbrOfLines(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines) +{ + MODIFY_REG(DMA2Dx->NLR, DMA2D_NLR_NL, NbrOfLines); +} + +/** + * @brief Return DMA2D number of lines, expressed on 16 bits ([15:0] bits). + * @rmtoll NLR NL LL_DMA2D_GetNbrOfLines + * @param DMA2Dx DMA2D Instance + * @retval Number of lines value between Min_Data=0 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetNbrOfLines(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->NLR, DMA2D_NLR_NL)); +} + +/** + * @brief Set DMA2D output memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll OMAR MA LL_DMA2D_SetOutputMemAddr + * @param DMA2Dx DMA2D Instance + * @param OutputMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetOutputMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t OutputMemoryAddress) +{ + LL_DMA2D_WriteReg(DMA2Dx, OMAR, OutputMemoryAddress); +} + +/** + * @brief Get DMA2D output memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll OMAR MA LL_DMA2D_GetOutputMemAddr + * @param DMA2Dx DMA2D Instance + * @retval Output memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetOutputMemAddr(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, OMAR)); +} + +/** + * @brief Set DMA2D output color, expressed on 32 bits ([31:0] bits). + * @note Output color format depends on output color mode, ARGB8888, RGB888, + * RGB565, ARGB1555 or ARGB4444. + * @note LL_DMA2D_ConfigOutputColor() API may be used instead if colors values formatting + * with respect to color mode is not done by the user code. + * @rmtoll OCOLR BLUE LL_DMA2D_SetOutputColor\n + * OCOLR GREEN LL_DMA2D_SetOutputColor\n + * OCOLR RED LL_DMA2D_SetOutputColor\n + * OCOLR ALPHA LL_DMA2D_SetOutputColor + * @param DMA2Dx DMA2D Instance + * @param OutputColor Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetOutputColor(DMA2D_TypeDef *DMA2Dx, uint32_t OutputColor) +{ + MODIFY_REG(DMA2Dx->OCOLR, (DMA2D_OCOLR_BLUE_1 | DMA2D_OCOLR_GREEN_1 | DMA2D_OCOLR_RED_1 | DMA2D_OCOLR_ALPHA_1), \ + OutputColor); +} + +/** + * @brief Get DMA2D output color, expressed on 32 bits ([31:0] bits). + * @note Alpha channel and red, green, blue color values must be retrieved from the returned + * value based on the output color mode (ARGB8888, RGB888, RGB565, ARGB1555 or ARGB4444) + * as set by @ref LL_DMA2D_SetOutputColorMode. + * @rmtoll OCOLR BLUE LL_DMA2D_GetOutputColor\n + * OCOLR GREEN LL_DMA2D_GetOutputColor\n + * OCOLR RED LL_DMA2D_GetOutputColor\n + * OCOLR ALPHA LL_DMA2D_GetOutputColor + * @param DMA2Dx DMA2D Instance + * @retval Output color value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetOutputColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->OCOLR, \ + (DMA2D_OCOLR_BLUE_1 | DMA2D_OCOLR_GREEN_1 | DMA2D_OCOLR_RED_1 | DMA2D_OCOLR_ALPHA_1))); +} + +/** + * @brief Set DMA2D line watermark, expressed on 16 bits ([15:0] bits). + * @rmtoll LWR LW LL_DMA2D_SetLineWatermark + * @param DMA2Dx DMA2D Instance + * @param LineWatermark Value between Min_Data=0 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetLineWatermark(DMA2D_TypeDef *DMA2Dx, uint32_t LineWatermark) +{ + MODIFY_REG(DMA2Dx->LWR, DMA2D_LWR_LW, LineWatermark); +} + +/** + * @brief Return DMA2D line watermark, expressed on 16 bits ([15:0] bits). + * @rmtoll LWR LW LL_DMA2D_GetLineWatermark + * @param DMA2Dx DMA2D Instance + * @retval Line watermark value between Min_Data=0 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetLineWatermark(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->LWR, DMA2D_LWR_LW)); +} + +/** + * @brief Set DMA2D dead time, expressed on 8 bits ([7:0] bits). + * @rmtoll AMTCR DT LL_DMA2D_SetDeadTime + * @param DMA2Dx DMA2D Instance + * @param DeadTime Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_SetDeadTime(DMA2D_TypeDef *DMA2Dx, uint32_t DeadTime) +{ + MODIFY_REG(DMA2Dx->AMTCR, DMA2D_AMTCR_DT, (DeadTime << DMA2D_AMTCR_DT_Pos)); +} + +/** + * @brief Return DMA2D dead time, expressed on 8 bits ([7:0] bits). + * @rmtoll AMTCR DT LL_DMA2D_GetDeadTime + * @param DMA2Dx DMA2D Instance + * @retval Dead time value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_GetDeadTime(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_DT) >> DMA2D_AMTCR_DT_Pos); +} + +/** + * @brief Enable DMA2D dead time functionality. + * @rmtoll AMTCR EN LL_DMA2D_EnableDeadTime + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableDeadTime(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN); +} + +/** + * @brief Disable DMA2D dead time functionality. + * @rmtoll AMTCR EN LL_DMA2D_DisableDeadTime + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableDeadTime(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN); +} + +/** + * @brief Indicate if DMA2D dead time functionality is enabled. + * @rmtoll AMTCR EN LL_DMA2D_IsEnabledDeadTime + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledDeadTime(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->AMTCR, DMA2D_AMTCR_EN) == (DMA2D_AMTCR_EN)); +} + +/** @defgroup DMA2D_LL_EF_FGND_Configuration Foreground Configuration Functions + * @{ + */ + +/** + * @brief Set DMA2D foreground memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll FGMAR MA LL_DMA2D_FGND_SetMemAddr + * @param DMA2Dx DMA2D Instance + * @param MemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t MemoryAddress) +{ + LL_DMA2D_WriteReg(DMA2Dx, FGMAR, MemoryAddress); +} + +/** + * @brief Get DMA2D foreground memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll FGMAR MA LL_DMA2D_FGND_GetMemAddr + * @param DMA2Dx DMA2D Instance + * @retval Foreground memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetMemAddr(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, FGMAR)); +} + +/** + * @brief Enable DMA2D foreground CLUT loading. + * @rmtoll FGPFCCR START LL_DMA2D_FGND_EnableCLUTLoad + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_EnableCLUTLoad(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_START); +} + +/** + * @brief Indicate if DMA2D foreground CLUT loading is enabled. + * @rmtoll FGPFCCR START LL_DMA2D_FGND_IsEnabledCLUTLoad + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_IsEnabledCLUTLoad(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_START) == (DMA2D_FGPFCCR_START)); +} + +/** + * @brief Set DMA2D foreground color mode. + * @rmtoll FGPFCCR CM LL_DMA2D_FGND_SetColorMode + * @param DMA2Dx DMA2D Instance + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 + * @arg @ref LL_DMA2D_INPUT_MODE_L8 + * @arg @ref LL_DMA2D_INPUT_MODE_AL44 + * @arg @ref LL_DMA2D_INPUT_MODE_AL88 + * @arg @ref LL_DMA2D_INPUT_MODE_L4 + * @arg @ref LL_DMA2D_INPUT_MODE_A8 + * @arg @ref LL_DMA2D_INPUT_MODE_A4 + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CM, ColorMode); +} + +/** + * @brief Return DMA2D foreground color mode. + * @rmtoll FGPFCCR CM LL_DMA2D_FGND_GetColorMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 + * @arg @ref LL_DMA2D_INPUT_MODE_L8 + * @arg @ref LL_DMA2D_INPUT_MODE_AL44 + * @arg @ref LL_DMA2D_INPUT_MODE_AL88 + * @arg @ref LL_DMA2D_INPUT_MODE_L4 + * @arg @ref LL_DMA2D_INPUT_MODE_A8 + * @arg @ref LL_DMA2D_INPUT_MODE_A4 + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetColorMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CM)); +} + +/** + * @brief Set DMA2D foreground alpha mode. + * @rmtoll FGPFCCR AM LL_DMA2D_FGND_SetAlphaMode + * @param DMA2Dx DMA2D Instance + * @param AphaMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF + * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE + * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetAlphaMode(DMA2D_TypeDef *DMA2Dx, uint32_t AphaMode) +{ + MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_AM, AphaMode); +} + +/** + * @brief Return DMA2D foreground alpha mode. + * @rmtoll FGPFCCR AM LL_DMA2D_FGND_GetAlphaMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF + * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE + * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetAlphaMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_AM)); +} + +/** + * @brief Set DMA2D foreground alpha value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGPFCCR ALPHA LL_DMA2D_FGND_SetAlpha + * @param DMA2Dx DMA2D Instance + * @param Alpha Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetAlpha(DMA2D_TypeDef *DMA2Dx, uint32_t Alpha) +{ + MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_ALPHA, (Alpha << DMA2D_FGPFCCR_ALPHA_Pos)); +} + +/** + * @brief Return DMA2D foreground alpha value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGPFCCR ALPHA LL_DMA2D_FGND_GetAlpha + * @param DMA2Dx DMA2D Instance + * @retval Alpha value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetAlpha(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_ALPHA) >> DMA2D_FGPFCCR_ALPHA_Pos); +} + +/** + * @brief Set DMA2D foreground line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll FGOR LO LL_DMA2D_FGND_SetLineOffset + * @param DMA2Dx DMA2D Instance + * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) +{ + MODIFY_REG(DMA2Dx->FGOR, DMA2D_FGOR_LO, LineOffset); +} + +/** + * @brief Return DMA2D foreground line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll FGOR LO LL_DMA2D_FGND_GetLineOffset + * @param DMA2Dx DMA2D Instance + * @retval Foreground line offset value between Min_Data=0 and Max_Data=0x3FF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetLineOffset(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGOR, DMA2D_FGOR_LO)); +} + +/** + * @brief Set DMA2D foreground color values, expressed on 24 bits ([23:0] bits). + * @rmtoll FGCOLR RED LL_DMA2D_FGND_SetColor + * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_SetColor + * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_SetColor + * @param DMA2Dx DMA2D Instance + * @param Red Value between Min_Data=0 and Max_Data=0xFF + * @param Green Value between Min_Data=0 and Max_Data=0xFF + * @param Blue Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red, uint32_t Green, uint32_t Blue) +{ + MODIFY_REG(DMA2Dx->FGCOLR, (DMA2D_FGCOLR_RED | DMA2D_FGCOLR_GREEN | DMA2D_FGCOLR_BLUE), \ + ((Red << DMA2D_FGCOLR_RED_Pos) | (Green << DMA2D_FGCOLR_GREEN_Pos) | Blue)); +} + +/** + * @brief Set DMA2D foreground red color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR RED LL_DMA2D_FGND_SetRedColor + * @param DMA2Dx DMA2D Instance + * @param Red Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red) +{ + MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_RED, (Red << DMA2D_FGCOLR_RED_Pos)); +} + +/** + * @brief Return DMA2D foreground red color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR RED LL_DMA2D_FGND_GetRedColor + * @param DMA2Dx DMA2D Instance + * @retval Red color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetRedColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_RED) >> DMA2D_FGCOLR_RED_Pos); +} + +/** + * @brief Set DMA2D foreground green color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_SetGreenColor + * @param DMA2Dx DMA2D Instance + * @param Green Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t Green) +{ + MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_GREEN, (Green << DMA2D_FGCOLR_GREEN_Pos)); +} + +/** + * @brief Return DMA2D foreground green color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR GREEN LL_DMA2D_FGND_GetGreenColor + * @param DMA2Dx DMA2D Instance + * @retval Green color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetGreenColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_GREEN) >> DMA2D_FGCOLR_GREEN_Pos); +} + +/** + * @brief Set DMA2D foreground blue color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_SetBlueColor + * @param DMA2Dx DMA2D Instance + * @param Blue Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t Blue) +{ + MODIFY_REG(DMA2Dx->FGCOLR, DMA2D_FGCOLR_BLUE, Blue); +} + +/** + * @brief Return DMA2D foreground blue color value, expressed on 8 bits ([7:0] bits). + * @rmtoll FGCOLR BLUE LL_DMA2D_FGND_GetBlueColor + * @param DMA2Dx DMA2D Instance + * @retval Blue color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetBlueColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGCOLR, DMA2D_FGCOLR_BLUE)); +} + +/** + * @brief Set DMA2D foreground CLUT memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll FGCMAR MA LL_DMA2D_FGND_SetCLUTMemAddr + * @param DMA2Dx DMA2D Instance + * @param CLUTMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTMemoryAddress) +{ + LL_DMA2D_WriteReg(DMA2Dx, FGCMAR, CLUTMemoryAddress); +} + +/** + * @brief Get DMA2D foreground CLUT memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll FGCMAR MA LL_DMA2D_FGND_GetCLUTMemAddr + * @param DMA2Dx DMA2D Instance + * @retval Foreground CLUT memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, FGCMAR)); +} + +/** + * @brief Set DMA2D foreground CLUT size, expressed on 8 bits ([7:0] bits). + * @rmtoll FGPFCCR CS LL_DMA2D_FGND_SetCLUTSize + * @param DMA2Dx DMA2D Instance + * @param CLUTSize Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTSize(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTSize) +{ + MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CS, (CLUTSize << DMA2D_FGPFCCR_CS_Pos)); +} + +/** + * @brief Get DMA2D foreground CLUT size, expressed on 8 bits ([7:0] bits). + * @rmtoll FGPFCCR CS LL_DMA2D_FGND_GetCLUTSize + * @param DMA2Dx DMA2D Instance + * @retval Foreground CLUT size value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTSize(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CS) >> DMA2D_FGPFCCR_CS_Pos); +} + +/** + * @brief Set DMA2D foreground CLUT color mode. + * @rmtoll FGPFCCR CCM LL_DMA2D_FGND_SetCLUTColorMode + * @param DMA2Dx DMA2D Instance + * @param CLUTColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_FGND_SetCLUTColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTColorMode) +{ + MODIFY_REG(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CCM, CLUTColorMode); +} + +/** + * @brief Return DMA2D foreground CLUT color mode. + * @rmtoll FGPFCCR CCM LL_DMA2D_FGND_GetCLUTColorMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 + */ +__STATIC_INLINE uint32_t LL_DMA2D_FGND_GetCLUTColorMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->FGPFCCR, DMA2D_FGPFCCR_CCM)); +} + +/** + * @} + */ + +/** @defgroup DMA2D_LL_EF_BGND_Configuration Background Configuration Functions + * @{ + */ + +/** + * @brief Set DMA2D background memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll BGMAR MA LL_DMA2D_BGND_SetMemAddr + * @param DMA2Dx DMA2D Instance + * @param MemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t MemoryAddress) +{ + LL_DMA2D_WriteReg(DMA2Dx, BGMAR, MemoryAddress); +} + +/** + * @brief Get DMA2D background memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll BGMAR MA LL_DMA2D_BGND_GetMemAddr + * @param DMA2Dx DMA2D Instance + * @retval Background memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetMemAddr(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, BGMAR)); +} + +/** + * @brief Enable DMA2D background CLUT loading. + * @rmtoll BGPFCCR START LL_DMA2D_BGND_EnableCLUTLoad + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_EnableCLUTLoad(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_START); +} + +/** + * @brief Indicate if DMA2D background CLUT loading is enabled. + * @rmtoll BGPFCCR START LL_DMA2D_BGND_IsEnabledCLUTLoad + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_IsEnabledCLUTLoad(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_START) == (DMA2D_BGPFCCR_START)); +} + +/** + * @brief Set DMA2D background color mode. + * @rmtoll BGPFCCR CM LL_DMA2D_BGND_SetColorMode + * @param DMA2Dx DMA2D Instance + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 + * @arg @ref LL_DMA2D_INPUT_MODE_L8 + * @arg @ref LL_DMA2D_INPUT_MODE_AL44 + * @arg @ref LL_DMA2D_INPUT_MODE_AL88 + * @arg @ref LL_DMA2D_INPUT_MODE_L4 + * @arg @ref LL_DMA2D_INPUT_MODE_A8 + * @arg @ref LL_DMA2D_INPUT_MODE_A4 + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CM, ColorMode); +} + +/** + * @brief Return DMA2D background color mode. + * @rmtoll BGPFCCR CM LL_DMA2D_BGND_GetColorMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_INPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_INPUT_MODE_ARGB4444 + * @arg @ref LL_DMA2D_INPUT_MODE_L8 + * @arg @ref LL_DMA2D_INPUT_MODE_AL44 + * @arg @ref LL_DMA2D_INPUT_MODE_AL88 + * @arg @ref LL_DMA2D_INPUT_MODE_L4 + * @arg @ref LL_DMA2D_INPUT_MODE_A8 + * @arg @ref LL_DMA2D_INPUT_MODE_A4 + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetColorMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CM)); +} + +/** + * @brief Set DMA2D background alpha mode. + * @rmtoll BGPFCCR AM LL_DMA2D_BGND_SetAlphaMode + * @param DMA2Dx DMA2D Instance + * @param AphaMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF + * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE + * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetAlphaMode(DMA2D_TypeDef *DMA2Dx, uint32_t AphaMode) +{ + MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_AM, AphaMode); +} + +/** + * @brief Return DMA2D background alpha mode. + * @rmtoll BGPFCCR AM LL_DMA2D_BGND_GetAlphaMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_ALPHA_MODE_NO_MODIF + * @arg @ref LL_DMA2D_ALPHA_MODE_REPLACE + * @arg @ref LL_DMA2D_ALPHA_MODE_COMBINE + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetAlphaMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_AM)); +} + +/** + * @brief Set DMA2D background alpha value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGPFCCR ALPHA LL_DMA2D_BGND_SetAlpha + * @param DMA2Dx DMA2D Instance + * @param Alpha Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetAlpha(DMA2D_TypeDef *DMA2Dx, uint32_t Alpha) +{ + MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_ALPHA, (Alpha << DMA2D_BGPFCCR_ALPHA_Pos)); +} + +/** + * @brief Return DMA2D background alpha value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGPFCCR ALPHA LL_DMA2D_BGND_GetAlpha + * @param DMA2Dx DMA2D Instance + * @retval Alpha value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetAlpha(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_ALPHA) >> DMA2D_BGPFCCR_ALPHA_Pos); +} + +/** + * @brief Set DMA2D background line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll BGOR LO LL_DMA2D_BGND_SetLineOffset + * @param DMA2Dx DMA2D Instance + * @param LineOffset Value between Min_Data=0 and Max_Data=0x3FF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetLineOffset(DMA2D_TypeDef *DMA2Dx, uint32_t LineOffset) +{ + MODIFY_REG(DMA2Dx->BGOR, DMA2D_BGOR_LO, LineOffset); +} + +/** + * @brief Return DMA2D background line offset, expressed on 14 bits ([13:0] bits). + * @rmtoll BGOR LO LL_DMA2D_BGND_GetLineOffset + * @param DMA2Dx DMA2D Instance + * @retval Background line offset value between Min_Data=0 and Max_Data=0x3FF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetLineOffset(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGOR, DMA2D_BGOR_LO)); +} + +/** + * @brief Set DMA2D background color values, expressed on 24 bits ([23:0] bits). + * @rmtoll BGCOLR RED LL_DMA2D_BGND_SetColor + * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_SetColor + * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_SetColor + * @param DMA2Dx DMA2D Instance + * @param Red Value between Min_Data=0 and Max_Data=0xFF + * @param Green Value between Min_Data=0 and Max_Data=0xFF + * @param Blue Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red, uint32_t Green, uint32_t Blue) +{ + MODIFY_REG(DMA2Dx->BGCOLR, (DMA2D_BGCOLR_RED | DMA2D_BGCOLR_GREEN | DMA2D_BGCOLR_BLUE), \ + ((Red << DMA2D_BGCOLR_RED_Pos) | (Green << DMA2D_BGCOLR_GREEN_Pos) | Blue)); +} + +/** + * @brief Set DMA2D background red color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR RED LL_DMA2D_BGND_SetRedColor + * @param DMA2Dx DMA2D Instance + * @param Red Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t Red) +{ + MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_RED, (Red << DMA2D_BGCOLR_RED_Pos)); +} + +/** + * @brief Return DMA2D background red color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR RED LL_DMA2D_BGND_GetRedColor + * @param DMA2Dx DMA2D Instance + * @retval Red color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetRedColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_RED) >> DMA2D_BGCOLR_RED_Pos); +} + +/** + * @brief Set DMA2D background green color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_SetGreenColor + * @param DMA2Dx DMA2D Instance + * @param Green Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t Green) +{ + MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_GREEN, (Green << DMA2D_BGCOLR_GREEN_Pos)); +} + +/** + * @brief Return DMA2D background green color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR GREEN LL_DMA2D_BGND_GetGreenColor + * @param DMA2Dx DMA2D Instance + * @retval Green color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetGreenColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_GREEN) >> DMA2D_BGCOLR_GREEN_Pos); +} + +/** + * @brief Set DMA2D background blue color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_SetBlueColor + * @param DMA2Dx DMA2D Instance + * @param Blue Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t Blue) +{ + MODIFY_REG(DMA2Dx->BGCOLR, DMA2D_BGCOLR_BLUE, Blue); +} + +/** + * @brief Return DMA2D background blue color value, expressed on 8 bits ([7:0] bits). + * @rmtoll BGCOLR BLUE LL_DMA2D_BGND_GetBlueColor + * @param DMA2Dx DMA2D Instance + * @retval Blue color value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetBlueColor(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGCOLR, DMA2D_BGCOLR_BLUE)); +} + +/** + * @brief Set DMA2D background CLUT memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll BGCMAR MA LL_DMA2D_BGND_SetCLUTMemAddr + * @param DMA2Dx DMA2D Instance + * @param CLUTMemoryAddress Value between Min_Data=0 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTMemoryAddress) +{ + LL_DMA2D_WriteReg(DMA2Dx, BGCMAR, CLUTMemoryAddress); +} + +/** + * @brief Get DMA2D background CLUT memory address, expressed on 32 bits ([31:0] bits). + * @rmtoll BGCMAR MA LL_DMA2D_BGND_GetCLUTMemAddr + * @param DMA2Dx DMA2D Instance + * @retval Background CLUT memory address value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTMemAddr(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(LL_DMA2D_ReadReg(DMA2Dx, BGCMAR)); +} + +/** + * @brief Set DMA2D background CLUT size, expressed on 8 bits ([7:0] bits). + * @rmtoll BGPFCCR CS LL_DMA2D_BGND_SetCLUTSize + * @param DMA2Dx DMA2D Instance + * @param CLUTSize Value between Min_Data=0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTSize(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTSize) +{ + MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CS, (CLUTSize << DMA2D_BGPFCCR_CS_Pos)); +} + +/** + * @brief Get DMA2D background CLUT size, expressed on 8 bits ([7:0] bits). + * @rmtoll BGPFCCR CS LL_DMA2D_BGND_GetCLUTSize + * @param DMA2Dx DMA2D Instance + * @retval Background CLUT size value between Min_Data=0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTSize(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CS) >> DMA2D_BGPFCCR_CS_Pos); +} + +/** + * @brief Set DMA2D background CLUT color mode. + * @rmtoll BGPFCCR CCM LL_DMA2D_BGND_SetCLUTColorMode + * @param DMA2Dx DMA2D Instance + * @param CLUTColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_BGND_SetCLUTColorMode(DMA2D_TypeDef *DMA2Dx, uint32_t CLUTColorMode) +{ + MODIFY_REG(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CCM, CLUTColorMode); +} + +/** + * @brief Return DMA2D background CLUT color mode. + * @rmtoll BGPFCCR CCM LL_DMA2D_BGND_GetCLUTColorMode + * @param DMA2Dx DMA2D Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_ARGB8888 + * @arg @ref LL_DMA2D_CLUT_COLOR_MODE_RGB888 + */ +__STATIC_INLINE uint32_t LL_DMA2D_BGND_GetCLUTColorMode(DMA2D_TypeDef *DMA2Dx) +{ + return (uint32_t)(READ_BIT(DMA2Dx->BGPFCCR, DMA2D_BGPFCCR_CCM)); +} + +/** + * @} + */ + +/** + * @} + */ + + +/** @defgroup DMA2D_LL_EF_FLAG_MANAGEMENT Flag Management + * @{ + */ + +/** + * @brief Check if the DMA2D Configuration Error Interrupt Flag is set or not + * @rmtoll ISR CEIF LL_DMA2D_IsActiveFlag_CE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CEIF) == (DMA2D_ISR_CEIF)); +} + +/** + * @brief Check if the DMA2D CLUT Transfer Complete Interrupt Flag is set or not + * @rmtoll ISR CTCIF LL_DMA2D_IsActiveFlag_CTC + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CTC(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CTCIF) == (DMA2D_ISR_CTCIF)); +} + +/** + * @brief Check if the DMA2D CLUT Access Error Interrupt Flag is set or not + * @rmtoll ISR CAEIF LL_DMA2D_IsActiveFlag_CAE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_CAE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_CAEIF) == (DMA2D_ISR_CAEIF)); +} + +/** + * @brief Check if the DMA2D Transfer Watermark Interrupt Flag is set or not + * @rmtoll ISR TWIF LL_DMA2D_IsActiveFlag_TW + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TW(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TWIF) == (DMA2D_ISR_TWIF)); +} + +/** + * @brief Check if the DMA2D Transfer Complete Interrupt Flag is set or not + * @rmtoll ISR TCIF LL_DMA2D_IsActiveFlag_TC + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TC(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TCIF) == (DMA2D_ISR_TCIF)); +} + +/** + * @brief Check if the DMA2D Transfer Error Interrupt Flag is set or not + * @rmtoll ISR TEIF LL_DMA2D_IsActiveFlag_TE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsActiveFlag_TE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->ISR, DMA2D_ISR_TEIF) == (DMA2D_ISR_TEIF)); +} + +/** + * @brief Clear DMA2D Configuration Error Interrupt Flag + * @rmtoll IFCR CCEIF LL_DMA2D_ClearFlag_CE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_CE(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CCEIF); +} + +/** + * @brief Clear DMA2D CLUT Transfer Complete Interrupt Flag + * @rmtoll IFCR CCTCIF LL_DMA2D_ClearFlag_CTC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_CTC(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CCTCIF); +} + +/** + * @brief Clear DMA2D CLUT Access Error Interrupt Flag + * @rmtoll IFCR CAECIF LL_DMA2D_ClearFlag_CAE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_CAE(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CAECIF); +} + +/** + * @brief Clear DMA2D Transfer Watermark Interrupt Flag + * @rmtoll IFCR CTWIF LL_DMA2D_ClearFlag_TW + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_TW(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTWIF); +} + +/** + * @brief Clear DMA2D Transfer Complete Interrupt Flag + * @rmtoll IFCR CTCIF LL_DMA2D_ClearFlag_TC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_TC(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTCIF); +} + +/** + * @brief Clear DMA2D Transfer Error Interrupt Flag + * @rmtoll IFCR CTEIF LL_DMA2D_ClearFlag_TE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_ClearFlag_TE(DMA2D_TypeDef *DMA2Dx) +{ + WRITE_REG(DMA2Dx->IFCR, DMA2D_IFCR_CTEIF); +} + +/** + * @} + */ + +/** @defgroup DMA2D_LL_EF_IT_MANAGEMENT Interruption Management + * @{ + */ + +/** + * @brief Enable Configuration Error Interrupt + * @rmtoll CR CEIE LL_DMA2D_EnableIT_CE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_CE(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_CEIE); +} + +/** + * @brief Enable CLUT Transfer Complete Interrupt + * @rmtoll CR CTCIE LL_DMA2D_EnableIT_CTC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_CTC(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE); +} + +/** + * @brief Enable CLUT Access Error Interrupt + * @rmtoll CR CAEIE LL_DMA2D_EnableIT_CAE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_CAE(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE); +} + +/** + * @brief Enable Transfer Watermark Interrupt + * @rmtoll CR TWIE LL_DMA2D_EnableIT_TW + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_TW(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_TWIE); +} + +/** + * @brief Enable Transfer Complete Interrupt + * @rmtoll CR TCIE LL_DMA2D_EnableIT_TC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_TC(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_TCIE); +} + +/** + * @brief Enable Transfer Error Interrupt + * @rmtoll CR TEIE LL_DMA2D_EnableIT_TE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_EnableIT_TE(DMA2D_TypeDef *DMA2Dx) +{ + SET_BIT(DMA2Dx->CR, DMA2D_CR_TEIE); +} + +/** + * @brief Disable Configuration Error Interrupt + * @rmtoll CR CEIE LL_DMA2D_DisableIT_CE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_CE(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CEIE); +} + +/** + * @brief Disable CLUT Transfer Complete Interrupt + * @rmtoll CR CTCIE LL_DMA2D_DisableIT_CTC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_CTC(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE); +} + +/** + * @brief Disable CLUT Access Error Interrupt + * @rmtoll CR CAEIE LL_DMA2D_DisableIT_CAE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_CAE(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE); +} + +/** + * @brief Disable Transfer Watermark Interrupt + * @rmtoll CR TWIE LL_DMA2D_DisableIT_TW + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_TW(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TWIE); +} + +/** + * @brief Disable Transfer Complete Interrupt + * @rmtoll CR TCIE LL_DMA2D_DisableIT_TC + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_TC(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TCIE); +} + +/** + * @brief Disable Transfer Error Interrupt + * @rmtoll CR TEIE LL_DMA2D_DisableIT_TE + * @param DMA2Dx DMA2D Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA2D_DisableIT_TE(DMA2D_TypeDef *DMA2Dx) +{ + CLEAR_BIT(DMA2Dx->CR, DMA2D_CR_TEIE); +} + +/** + * @brief Check if the DMA2D Configuration Error interrupt source is enabled or disabled. + * @rmtoll CR CEIE LL_DMA2D_IsEnabledIT_CE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_CEIE) == (DMA2D_CR_CEIE)); +} + +/** + * @brief Check if the DMA2D CLUT Transfer Complete interrupt source is enabled or disabled. + * @rmtoll CR CTCIE LL_DMA2D_IsEnabledIT_CTC + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CTC(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_CTCIE) == (DMA2D_CR_CTCIE)); +} + +/** + * @brief Check if the DMA2D CLUT Access Error interrupt source is enabled or disabled. + * @rmtoll CR CAEIE LL_DMA2D_IsEnabledIT_CAE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_CAE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_CAEIE) == (DMA2D_CR_CAEIE)); +} + +/** + * @brief Check if the DMA2D Transfer Watermark interrupt source is enabled or disabled. + * @rmtoll CR TWIE LL_DMA2D_IsEnabledIT_TW + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TW(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_TWIE) == (DMA2D_CR_TWIE)); +} + +/** + * @brief Check if the DMA2D Transfer Complete interrupt source is enabled or disabled. + * @rmtoll CR TCIE LL_DMA2D_IsEnabledIT_TC + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TC(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_TCIE) == (DMA2D_CR_TCIE)); +} + +/** + * @brief Check if the DMA2D Transfer Error interrupt source is enabled or disabled. + * @rmtoll CR TEIE LL_DMA2D_IsEnabledIT_TE + * @param DMA2Dx DMA2D Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA2D_IsEnabledIT_TE(DMA2D_TypeDef *DMA2Dx) +{ + return (READ_BIT(DMA2Dx->CR, DMA2D_CR_TEIE) == (DMA2D_CR_TEIE)); +} + + + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA2D_LL_EF_Init_Functions Initialization and De-initialization Functions + * @{ + */ + +ErrorStatus LL_DMA2D_DeInit(DMA2D_TypeDef *DMA2Dx); +ErrorStatus LL_DMA2D_Init(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_InitTypeDef *DMA2D_InitStruct); +void LL_DMA2D_StructInit(LL_DMA2D_InitTypeDef *DMA2D_InitStruct); +void LL_DMA2D_ConfigLayer(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg, uint32_t LayerIdx); +void LL_DMA2D_LayerCfgStructInit(LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg); +void LL_DMA2D_ConfigOutputColor(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_ColorTypeDef *DMA2D_ColorStruct); +uint32_t LL_DMA2D_GetOutputBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); +uint32_t LL_DMA2D_GetOutputGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); +uint32_t LL_DMA2D_GetOutputRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); +uint32_t LL_DMA2D_GetOutputAlphaColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode); +void LL_DMA2D_ConfigSize(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines, uint32_t NbrOfPixelsPerLines); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (DMA2D) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_DMA2D_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h new file mode 100644 index 0000000..a5e236e --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h @@ -0,0 +1,974 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_exti.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of EXTI LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_EXTI_H +#define __STM32F4xx_LL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (EXTI) + +/** @defgroup EXTI_LL EXTI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private Macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_Private_Macros EXTI Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_ES_INIT EXTI Exported Init structure + * @{ + */ +typedef struct +{ + + uint32_t Line_0_31; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 0 to 31 + This parameter can be any combination of @ref EXTI_LL_EC_LINE */ + + FunctionalState LineCommand; /*!< Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ + + uint8_t Mode; /*!< Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTI_LL_EC_MODE. */ + + uint8_t Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTI_LL_EC_TRIGGER. */ +} LL_EXTI_InitTypeDef; + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Constants EXTI Exported Constants + * @{ + */ + +/** @defgroup EXTI_LL_EC_LINE LINE + * @{ + */ +#define LL_EXTI_LINE_0 EXTI_IMR_IM0 /*!< Extended line 0 */ +#define LL_EXTI_LINE_1 EXTI_IMR_IM1 /*!< Extended line 1 */ +#define LL_EXTI_LINE_2 EXTI_IMR_IM2 /*!< Extended line 2 */ +#define LL_EXTI_LINE_3 EXTI_IMR_IM3 /*!< Extended line 3 */ +#define LL_EXTI_LINE_4 EXTI_IMR_IM4 /*!< Extended line 4 */ +#define LL_EXTI_LINE_5 EXTI_IMR_IM5 /*!< Extended line 5 */ +#define LL_EXTI_LINE_6 EXTI_IMR_IM6 /*!< Extended line 6 */ +#define LL_EXTI_LINE_7 EXTI_IMR_IM7 /*!< Extended line 7 */ +#define LL_EXTI_LINE_8 EXTI_IMR_IM8 /*!< Extended line 8 */ +#define LL_EXTI_LINE_9 EXTI_IMR_IM9 /*!< Extended line 9 */ +#define LL_EXTI_LINE_10 EXTI_IMR_IM10 /*!< Extended line 10 */ +#define LL_EXTI_LINE_11 EXTI_IMR_IM11 /*!< Extended line 11 */ +#define LL_EXTI_LINE_12 EXTI_IMR_IM12 /*!< Extended line 12 */ +#define LL_EXTI_LINE_13 EXTI_IMR_IM13 /*!< Extended line 13 */ +#define LL_EXTI_LINE_14 EXTI_IMR_IM14 /*!< Extended line 14 */ +#define LL_EXTI_LINE_15 EXTI_IMR_IM15 /*!< Extended line 15 */ +#if defined(EXTI_IMR_IM16) +#define LL_EXTI_LINE_16 EXTI_IMR_IM16 /*!< Extended line 16 */ +#endif +#define LL_EXTI_LINE_17 EXTI_IMR_IM17 /*!< Extended line 17 */ +#if defined(EXTI_IMR_IM18) +#define LL_EXTI_LINE_18 EXTI_IMR_IM18 /*!< Extended line 18 */ +#endif +#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ +#if defined(EXTI_IMR_IM20) +#define LL_EXTI_LINE_20 EXTI_IMR_IM20 /*!< Extended line 20 */ +#endif +#if defined(EXTI_IMR_IM21) +#define LL_EXTI_LINE_21 EXTI_IMR_IM21 /*!< Extended line 21 */ +#endif +#if defined(EXTI_IMR_IM22) +#define LL_EXTI_LINE_22 EXTI_IMR_IM22 /*!< Extended line 22 */ +#endif +#if defined(EXTI_IMR_IM23) +#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ +#endif +#if defined(EXTI_IMR_IM24) +#define LL_EXTI_LINE_24 EXTI_IMR_IM24 /*!< Extended line 24 */ +#endif +#if defined(EXTI_IMR_IM25) +#define LL_EXTI_LINE_25 EXTI_IMR_IM25 /*!< Extended line 25 */ +#endif +#if defined(EXTI_IMR_IM26) +#define LL_EXTI_LINE_26 EXTI_IMR_IM26 /*!< Extended line 26 */ +#endif +#if defined(EXTI_IMR_IM27) +#define LL_EXTI_LINE_27 EXTI_IMR_IM27 /*!< Extended line 27 */ +#endif +#if defined(EXTI_IMR_IM28) +#define LL_EXTI_LINE_28 EXTI_IMR_IM28 /*!< Extended line 28 */ +#endif +#if defined(EXTI_IMR_IM29) +#define LL_EXTI_LINE_29 EXTI_IMR_IM29 /*!< Extended line 29 */ +#endif +#if defined(EXTI_IMR_IM30) +#define LL_EXTI_LINE_30 EXTI_IMR_IM30 /*!< Extended line 30 */ +#endif +#if defined(EXTI_IMR_IM31) +#define LL_EXTI_LINE_31 EXTI_IMR_IM31 /*!< Extended line 31 */ +#endif +#define LL_EXTI_LINE_ALL_0_31 EXTI_IMR_IM /*!< All Extended line not reserved*/ + + +#define LL_EXTI_LINE_ALL ((uint32_t)0xFFFFFFFFU) /*!< All Extended line */ + +#if defined(USE_FULL_LL_DRIVER) +#define LL_EXTI_LINE_NONE ((uint32_t)0x00000000U) /*!< None Extended line */ +#endif /*USE_FULL_LL_DRIVER*/ + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup EXTI_LL_EC_MODE Mode + * @{ + */ +#define LL_EXTI_MODE_IT ((uint8_t)0x00U) /*!< Interrupt Mode */ +#define LL_EXTI_MODE_EVENT ((uint8_t)0x01U) /*!< Event Mode */ +#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02U) /*!< Interrupt & Event Mode */ +/** + * @} + */ + +/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger + * @{ + */ +#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00U) /*!< No Trigger Mode */ +#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01U) /*!< Trigger Rising Mode */ +#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02U) /*!< Trigger Falling Mode */ +#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03U) /*!< Trigger Rising & Falling Mode */ + +/** + * @} + */ + + +#endif /*USE_FULL_LL_DRIVER*/ + + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Macros EXTI Exported Macros + * @{ + */ + +/** @defgroup EXTI_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in EXTI register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) + +/** + * @brief Read a value in EXTI register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_EXTI_ReadReg(__REG__) READ_REG(EXTI->__REG__) +/** + * @} + */ + + +/** + * @} + */ + + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Functions EXTI Exported Functions + * @{ + */ +/** @defgroup EXTI_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Interrupt request for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_EnableIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->IMR, ExtiLine); +} + +/** + * @brief Disable ExtiLine Interrupt request for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_DisableIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->IMR, ExtiLine); +} + + +/** + * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_IsEnabledIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Event_Management Event_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Event request for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_EnableEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->EMR, ExtiLine); + +} + + +/** + * @brief Disable ExtiLine Event request for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_DisableEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->EMR, ExtiLine); +} + + +/** + * @brief Indicate if ExtiLine Event request is enabled for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_IsEnabledEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); + +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Rising_Trigger_Management Rising_Trigger_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a rising edge on a configurable interrupt + * line occurs during a write operation in the EXTI_RTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll RTSR RTx LL_EXTI_EnableRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableRisingTrig_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->RTSR, ExtiLine); + +} + + +/** + * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a rising edge on a configurable interrupt + * line occurs during a write operation in the EXTI_RTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll RTSR RTx LL_EXTI_DisableRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableRisingTrig_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->RTSR, ExtiLine); + +} + + +/** + * @brief Check if rising edge trigger is enabled for Lines in range 0 to 31 + * @rmtoll RTSR RTx LL_EXTI_IsEnabledRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Falling_Trigger_Management Falling_Trigger_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a falling edge on a configurable interrupt + * line occurs during a write operation in the EXTI_FTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll FTSR FTx LL_EXTI_EnableFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableFallingTrig_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->FTSR, ExtiLine); +} + + +/** + * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a Falling edge on a configurable interrupt + * line occurs during a write operation in the EXTI_FTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for the same interrupt line. + * In this case, both generate a trigger condition. + * @rmtoll FTSR FTx LL_EXTI_DisableFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableFallingTrig_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->FTSR, ExtiLine); +} + + +/** + * @brief Check if falling edge trigger is enabled for Lines in range 0 to 31 + * @rmtoll FTSR FTx LL_EXTI_IsEnabledFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Software_Interrupt_Management Software_Interrupt_Management + * @{ + */ + +/** + * @brief Generate a software Interrupt Event for Lines in range 0 to 31 + * @note If the interrupt is enabled on this line in the EXTI_IMR, writing a 1 to + * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR + * resulting in an interrupt request generation. + * This bit is cleared by clearing the corresponding bit in the EXTI_PR + * register (by writing a 1 into the bit) + * @rmtoll SWIER SWIx LL_EXTI_GenerateSWI_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->SWIER, ExtiLine); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Flag_Management Flag_Management + * @{ + */ + +/** + * @brief Check if the ExtLine Flag is set or not for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_IsActiveFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); +} + + +/** + * @brief Read ExtLine Combination Flag for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_ReadFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval @note This bit is set when the selected edge event arrives on the interrupt + */ +__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_0_31(uint32_t ExtiLine) +{ + return (uint32_t)(READ_BIT(EXTI->PR, ExtiLine)); +} + + +/** + * @brief Clear ExtLine Flags for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_ClearFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine) +{ + WRITE_REG(EXTI->PR, ExtiLine); +} + + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct); +uint32_t LL_EXTI_DeInit(void); +void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct); + + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* EXTI */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_EXTI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h index 9726356..01a3c10 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_ll_fmc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FMC HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -352,10 +352,10 @@ typedef struct /** @defgroup FMC_NORSRAM_Bank FMC NOR/SRAM Bank * @{ */ -#define FMC_NORSRAM_BANK1 ((uint32_t)0x00000000U) -#define FMC_NORSRAM_BANK2 ((uint32_t)0x00000002U) -#define FMC_NORSRAM_BANK3 ((uint32_t)0x00000004U) -#define FMC_NORSRAM_BANK4 ((uint32_t)0x00000006U) +#define FMC_NORSRAM_BANK1 0x00000000U +#define FMC_NORSRAM_BANK2 0x00000002U +#define FMC_NORSRAM_BANK3 0x00000004U +#define FMC_NORSRAM_BANK4 0x00000006U /** * @} */ @@ -363,8 +363,8 @@ typedef struct /** @defgroup FMC_Data_Address_Bus_Multiplexing FMC Data Address Bus Multiplexing * @{ */ -#define FMC_DATA_ADDRESS_MUX_DISABLE ((uint32_t)0x00000000U) -#define FMC_DATA_ADDRESS_MUX_ENABLE ((uint32_t)0x00000002U) +#define FMC_DATA_ADDRESS_MUX_DISABLE 0x00000000U +#define FMC_DATA_ADDRESS_MUX_ENABLE 0x00000002U /** * @} */ @@ -372,9 +372,9 @@ typedef struct /** @defgroup FMC_Memory_Type FMC Memory Type * @{ */ -#define FMC_MEMORY_TYPE_SRAM ((uint32_t)0x00000000U) -#define FMC_MEMORY_TYPE_PSRAM ((uint32_t)0x00000004U) -#define FMC_MEMORY_TYPE_NOR ((uint32_t)0x00000008U) +#define FMC_MEMORY_TYPE_SRAM 0x00000000U +#define FMC_MEMORY_TYPE_PSRAM 0x00000004U +#define FMC_MEMORY_TYPE_NOR 0x00000008U /** * @} */ @@ -382,9 +382,9 @@ typedef struct /** @defgroup FMC_NORSRAM_Data_Width FMC NORSRAM Data Width * @{ */ -#define FMC_NORSRAM_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) -#define FMC_NORSRAM_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) -#define FMC_NORSRAM_MEM_BUS_WIDTH_32 ((uint32_t)0x00000020U) +#define FMC_NORSRAM_MEM_BUS_WIDTH_8 0x00000000U +#define FMC_NORSRAM_MEM_BUS_WIDTH_16 0x00000010U +#define FMC_NORSRAM_MEM_BUS_WIDTH_32 0x00000020U /** * @} */ @@ -392,8 +392,8 @@ typedef struct /** @defgroup FMC_NORSRAM_Flash_Access FMC NOR/SRAM Flash Access * @{ */ -#define FMC_NORSRAM_FLASH_ACCESS_ENABLE ((uint32_t)0x00000040U) -#define FMC_NORSRAM_FLASH_ACCESS_DISABLE ((uint32_t)0x00000000U) +#define FMC_NORSRAM_FLASH_ACCESS_ENABLE 0x00000040U +#define FMC_NORSRAM_FLASH_ACCESS_DISABLE 0x00000000U /** * @} */ @@ -401,8 +401,8 @@ typedef struct /** @defgroup FMC_Burst_Access_Mode FMC Burst Access Mode * @{ */ -#define FMC_BURST_ACCESS_MODE_DISABLE ((uint32_t)0x00000000U) -#define FMC_BURST_ACCESS_MODE_ENABLE ((uint32_t)0x00000100U) +#define FMC_BURST_ACCESS_MODE_DISABLE 0x00000000U +#define FMC_BURST_ACCESS_MODE_ENABLE 0x00000100U /** * @} */ @@ -410,8 +410,8 @@ typedef struct /** @defgroup FMC_Wait_Signal_Polarity FMC Wait Signal Polarity * @{ */ -#define FMC_WAIT_SIGNAL_POLARITY_LOW ((uint32_t)0x00000000U) -#define FMC_WAIT_SIGNAL_POLARITY_HIGH ((uint32_t)0x00000200U) +#define FMC_WAIT_SIGNAL_POLARITY_LOW 0x00000000U +#define FMC_WAIT_SIGNAL_POLARITY_HIGH 0x00000200U /** * @} */ @@ -421,8 +421,8 @@ typedef struct */ /** @note This mode is not available for the STM32F446/469/479xx devices */ -#define FMC_WRAP_MODE_DISABLE ((uint32_t)0x00000000U) -#define FMC_WRAP_MODE_ENABLE ((uint32_t)0x00000400U) +#define FMC_WRAP_MODE_DISABLE 0x00000000U +#define FMC_WRAP_MODE_ENABLE 0x00000400U /** * @} */ @@ -430,8 +430,8 @@ typedef struct /** @defgroup FMC_Wait_Timing FMC Wait Timing * @{ */ -#define FMC_WAIT_TIMING_BEFORE_WS ((uint32_t)0x00000000U) -#define FMC_WAIT_TIMING_DURING_WS ((uint32_t)0x00000800U) +#define FMC_WAIT_TIMING_BEFORE_WS 0x00000000U +#define FMC_WAIT_TIMING_DURING_WS 0x00000800U /** * @} */ @@ -439,8 +439,8 @@ typedef struct /** @defgroup FMC_Write_Operation FMC Write Operation * @{ */ -#define FMC_WRITE_OPERATION_DISABLE ((uint32_t)0x00000000U) -#define FMC_WRITE_OPERATION_ENABLE ((uint32_t)0x00001000U) +#define FMC_WRITE_OPERATION_DISABLE 0x00000000U +#define FMC_WRITE_OPERATION_ENABLE 0x00001000U /** * @} */ @@ -448,8 +448,8 @@ typedef struct /** @defgroup FMC_Wait_Signal FMC Wait Signal * @{ */ -#define FMC_WAIT_SIGNAL_DISABLE ((uint32_t)0x00000000U) -#define FMC_WAIT_SIGNAL_ENABLE ((uint32_t)0x00002000U) +#define FMC_WAIT_SIGNAL_DISABLE 0x00000000U +#define FMC_WAIT_SIGNAL_ENABLE 0x00002000U /** * @} */ @@ -457,8 +457,8 @@ typedef struct /** @defgroup FMC_Extended_Mode FMC Extended Mode * @{ */ -#define FMC_EXTENDED_MODE_DISABLE ((uint32_t)0x00000000U) -#define FMC_EXTENDED_MODE_ENABLE ((uint32_t)0x00004000U) +#define FMC_EXTENDED_MODE_DISABLE 0x00000000U +#define FMC_EXTENDED_MODE_ENABLE 0x00004000U /** * @} */ @@ -466,8 +466,8 @@ typedef struct /** @defgroup FMC_AsynchronousWait FMC Asynchronous Wait * @{ */ -#define FMC_ASYNCHRONOUS_WAIT_DISABLE ((uint32_t)0x00000000U) -#define FMC_ASYNCHRONOUS_WAIT_ENABLE ((uint32_t)0x00008000U) +#define FMC_ASYNCHRONOUS_WAIT_DISABLE 0x00000000U +#define FMC_ASYNCHRONOUS_WAIT_ENABLE 0x00008000U /** * @} */ @@ -475,7 +475,7 @@ typedef struct /** @defgroup FMC_Page_Size FMC Page Size * @{ */ -#define FMC_PAGE_SIZE_NONE ((uint32_t)0x00000000U) +#define FMC_PAGE_SIZE_NONE 0x00000000U #define FMC_PAGE_SIZE_128 ((uint32_t)FMC_BCR1_CPSIZE_0) #define FMC_PAGE_SIZE_256 ((uint32_t)FMC_BCR1_CPSIZE_1) #define FMC_PAGE_SIZE_512 ((uint32_t)(FMC_BCR1_CPSIZE_0 | FMC_BCR1_CPSIZE_1)) @@ -489,7 +489,7 @@ typedef struct * @{ */ #define FMC_WRITE_FIFO_DISABLE ((uint32_t)FMC_BCR1_WFDIS) -#define FMC_WRITE_FIFO_ENABLE ((uint32_t)0x00000000U) +#define FMC_WRITE_FIFO_ENABLE 0x00000000U /** * @} */ @@ -497,8 +497,8 @@ typedef struct /** @defgroup FMC_Write_Burst FMC Write Burst * @{ */ -#define FMC_WRITE_BURST_DISABLE ((uint32_t)0x00000000U) -#define FMC_WRITE_BURST_ENABLE ((uint32_t)0x00080000U) +#define FMC_WRITE_BURST_DISABLE 0x00000000U +#define FMC_WRITE_BURST_ENABLE 0x00080000U /** * @} */ @@ -506,8 +506,8 @@ typedef struct /** @defgroup FMC_Continous_Clock FMC Continuous Clock * @{ */ -#define FMC_CONTINUOUS_CLOCK_SYNC_ONLY ((uint32_t)0x00000000U) -#define FMC_CONTINUOUS_CLOCK_SYNC_ASYNC ((uint32_t)0x00100000U) +#define FMC_CONTINUOUS_CLOCK_SYNC_ONLY 0x00000000U +#define FMC_CONTINUOUS_CLOCK_SYNC_ASYNC 0x00100000U /** * @} */ @@ -515,10 +515,10 @@ typedef struct /** @defgroup FMC_Access_Mode FMC Access Mode * @{ */ -#define FMC_ACCESS_MODE_A ((uint32_t)0x00000000U) -#define FMC_ACCESS_MODE_B ((uint32_t)0x10000000U) -#define FMC_ACCESS_MODE_C ((uint32_t)0x20000000U) -#define FMC_ACCESS_MODE_D ((uint32_t)0x30000000U) +#define FMC_ACCESS_MODE_A 0x00000000U +#define FMC_ACCESS_MODE_B 0x10000000U +#define FMC_ACCESS_MODE_C 0x20000000U +#define FMC_ACCESS_MODE_D 0x30000000U /** * @} */ @@ -533,8 +533,8 @@ typedef struct /** @defgroup FMC_NAND_Bank FMC NAND Bank * @{ */ -#define FMC_NAND_BANK2 ((uint32_t)0x00000010U) -#define FMC_NAND_BANK3 ((uint32_t)0x00000100U) +#define FMC_NAND_BANK2 0x00000010U +#define FMC_NAND_BANK3 0x00000100U /** * @} */ @@ -542,8 +542,8 @@ typedef struct /** @defgroup FMC_Wait_feature FMC Wait feature * @{ */ -#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE ((uint32_t)0x00000000U) -#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE ((uint32_t)0x00000002U) +#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE 0x00000000U +#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE 0x00000002U /** * @} */ @@ -551,8 +551,8 @@ typedef struct /** @defgroup FMC_PCR_Memory_Type FMC PCR Memory Type * @{ */ -#define FMC_PCR_MEMORY_TYPE_PCCARD ((uint32_t)0x00000000U) -#define FMC_PCR_MEMORY_TYPE_NAND ((uint32_t)0x00000008U) +#define FMC_PCR_MEMORY_TYPE_PCCARD 0x00000000U +#define FMC_PCR_MEMORY_TYPE_NAND 0x00000008U /** * @} */ @@ -560,8 +560,8 @@ typedef struct /** @defgroup FMC_NAND_Data_Width FMC NAND Data Width * @{ */ -#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) -#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) +#define FMC_NAND_PCC_MEM_BUS_WIDTH_8 0x00000000U +#define FMC_NAND_PCC_MEM_BUS_WIDTH_16 0x00000010U /** * @} */ @@ -569,8 +569,8 @@ typedef struct /** @defgroup FMC_ECC FMC ECC * @{ */ -#define FMC_NAND_ECC_DISABLE ((uint32_t)0x00000000U) -#define FMC_NAND_ECC_ENABLE ((uint32_t)0x00000040U) +#define FMC_NAND_ECC_DISABLE 0x00000000U +#define FMC_NAND_ECC_ENABLE 0x00000040U /** * @} */ @@ -578,12 +578,12 @@ typedef struct /** @defgroup FMC_ECC_Page_Size FMC ECC Page Size * @{ */ -#define FMC_NAND_ECC_PAGE_SIZE_256BYTE ((uint32_t)0x00000000U) -#define FMC_NAND_ECC_PAGE_SIZE_512BYTE ((uint32_t)0x00020000U) -#define FMC_NAND_ECC_PAGE_SIZE_1024BYTE ((uint32_t)0x00040000U) -#define FMC_NAND_ECC_PAGE_SIZE_2048BYTE ((uint32_t)0x00060000U) -#define FMC_NAND_ECC_PAGE_SIZE_4096BYTE ((uint32_t)0x00080000U) -#define FMC_NAND_ECC_PAGE_SIZE_8192BYTE ((uint32_t)0x000A0000U) +#define FMC_NAND_ECC_PAGE_SIZE_256BYTE 0x00000000U +#define FMC_NAND_ECC_PAGE_SIZE_512BYTE 0x00020000U +#define FMC_NAND_ECC_PAGE_SIZE_1024BYTE 0x00040000U +#define FMC_NAND_ECC_PAGE_SIZE_2048BYTE 0x00060000U +#define FMC_NAND_ECC_PAGE_SIZE_4096BYTE 0x00080000U +#define FMC_NAND_ECC_PAGE_SIZE_8192BYTE 0x000A0000U /** * @} */ @@ -598,8 +598,8 @@ typedef struct /** @defgroup FMC_SDRAM_Bank FMC SDRAM Bank * @{ */ -#define FMC_SDRAM_BANK1 ((uint32_t)0x00000000U) -#define FMC_SDRAM_BANK2 ((uint32_t)0x00000001U) +#define FMC_SDRAM_BANK1 0x00000000U +#define FMC_SDRAM_BANK2 0x00000001U /** * @} */ @@ -607,10 +607,10 @@ typedef struct /** @defgroup FMC_SDRAM_Column_Bits_number FMC SDRAM Column Bits number * @{ */ -#define FMC_SDRAM_COLUMN_BITS_NUM_8 ((uint32_t)0x00000000U) -#define FMC_SDRAM_COLUMN_BITS_NUM_9 ((uint32_t)0x00000001U) -#define FMC_SDRAM_COLUMN_BITS_NUM_10 ((uint32_t)0x00000002U) -#define FMC_SDRAM_COLUMN_BITS_NUM_11 ((uint32_t)0x00000003U) +#define FMC_SDRAM_COLUMN_BITS_NUM_8 0x00000000U +#define FMC_SDRAM_COLUMN_BITS_NUM_9 0x00000001U +#define FMC_SDRAM_COLUMN_BITS_NUM_10 0x00000002U +#define FMC_SDRAM_COLUMN_BITS_NUM_11 0x00000003U /** * @} */ @@ -618,9 +618,9 @@ typedef struct /** @defgroup FMC_SDRAM_Row_Bits_number FMC SDRAM Row Bits number * @{ */ -#define FMC_SDRAM_ROW_BITS_NUM_11 ((uint32_t)0x00000000U) -#define FMC_SDRAM_ROW_BITS_NUM_12 ((uint32_t)0x00000004U) -#define FMC_SDRAM_ROW_BITS_NUM_13 ((uint32_t)0x00000008U) +#define FMC_SDRAM_ROW_BITS_NUM_11 0x00000000U +#define FMC_SDRAM_ROW_BITS_NUM_12 0x00000004U +#define FMC_SDRAM_ROW_BITS_NUM_13 0x00000008U /** * @} */ @@ -628,9 +628,9 @@ typedef struct /** @defgroup FMC_SDRAM_Memory_Bus_Width FMC SDRAM Memory Bus Width * @{ */ -#define FMC_SDRAM_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) -#define FMC_SDRAM_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) -#define FMC_SDRAM_MEM_BUS_WIDTH_32 ((uint32_t)0x00000020U) +#define FMC_SDRAM_MEM_BUS_WIDTH_8 0x00000000U +#define FMC_SDRAM_MEM_BUS_WIDTH_16 0x00000010U +#define FMC_SDRAM_MEM_BUS_WIDTH_32 0x00000020U /** * @} */ @@ -638,8 +638,8 @@ typedef struct /** @defgroup FMC_SDRAM_Internal_Banks_Number FMC SDRAM Internal Banks Number * @{ */ -#define FMC_SDRAM_INTERN_BANKS_NUM_2 ((uint32_t)0x00000000U) -#define FMC_SDRAM_INTERN_BANKS_NUM_4 ((uint32_t)0x00000040U) +#define FMC_SDRAM_INTERN_BANKS_NUM_2 0x00000000U +#define FMC_SDRAM_INTERN_BANKS_NUM_4 0x00000040U /** * @} */ @@ -647,9 +647,9 @@ typedef struct /** @defgroup FMC_SDRAM_CAS_Latency FMC SDRAM CAS Latency * @{ */ -#define FMC_SDRAM_CAS_LATENCY_1 ((uint32_t)0x00000080U) -#define FMC_SDRAM_CAS_LATENCY_2 ((uint32_t)0x00000100U) -#define FMC_SDRAM_CAS_LATENCY_3 ((uint32_t)0x00000180U) +#define FMC_SDRAM_CAS_LATENCY_1 0x00000080U +#define FMC_SDRAM_CAS_LATENCY_2 0x00000100U +#define FMC_SDRAM_CAS_LATENCY_3 0x00000180U /** * @} */ @@ -657,8 +657,8 @@ typedef struct /** @defgroup FMC_SDRAM_Write_Protection FMC SDRAM Write Protection * @{ */ -#define FMC_SDRAM_WRITE_PROTECTION_DISABLE ((uint32_t)0x00000000U) -#define FMC_SDRAM_WRITE_PROTECTION_ENABLE ((uint32_t)0x00000200U) +#define FMC_SDRAM_WRITE_PROTECTION_DISABLE 0x00000000U +#define FMC_SDRAM_WRITE_PROTECTION_ENABLE 0x00000200U /** * @} @@ -667,9 +667,9 @@ typedef struct /** @defgroup FMC_SDRAM_Clock_Period FMC SDRAM Clock Period * @{ */ -#define FMC_SDRAM_CLOCK_DISABLE ((uint32_t)0x00000000U) -#define FMC_SDRAM_CLOCK_PERIOD_2 ((uint32_t)0x00000800U) -#define FMC_SDRAM_CLOCK_PERIOD_3 ((uint32_t)0x00000C00U) +#define FMC_SDRAM_CLOCK_DISABLE 0x00000000U +#define FMC_SDRAM_CLOCK_PERIOD_2 0x00000800U +#define FMC_SDRAM_CLOCK_PERIOD_3 0x00000C00U /** * @} */ @@ -677,8 +677,8 @@ typedef struct /** @defgroup FMC_SDRAM_Read_Burst FMC SDRAM Read Burst * @{ */ -#define FMC_SDRAM_RBURST_DISABLE ((uint32_t)0x00000000U) -#define FMC_SDRAM_RBURST_ENABLE ((uint32_t)0x00001000U) +#define FMC_SDRAM_RBURST_DISABLE 0x00000000U +#define FMC_SDRAM_RBURST_ENABLE 0x00001000U /** * @} */ @@ -686,9 +686,9 @@ typedef struct /** @defgroup FMC_SDRAM_Read_Pipe_Delay FMC SDRAM Read Pipe Delay * @{ */ -#define FMC_SDRAM_RPIPE_DELAY_0 ((uint32_t)0x00000000U) -#define FMC_SDRAM_RPIPE_DELAY_1 ((uint32_t)0x00002000U) -#define FMC_SDRAM_RPIPE_DELAY_2 ((uint32_t)0x00004000U) +#define FMC_SDRAM_RPIPE_DELAY_0 0x00000000U +#define FMC_SDRAM_RPIPE_DELAY_1 0x00002000U +#define FMC_SDRAM_RPIPE_DELAY_2 0x00004000U /** * @} */ @@ -696,13 +696,13 @@ typedef struct /** @defgroup FMC_SDRAM_Command_Mode FMC SDRAM Command Mode * @{ */ -#define FMC_SDRAM_CMD_NORMAL_MODE ((uint32_t)0x00000000U) -#define FMC_SDRAM_CMD_CLK_ENABLE ((uint32_t)0x00000001U) -#define FMC_SDRAM_CMD_PALL ((uint32_t)0x00000002U) -#define FMC_SDRAM_CMD_AUTOREFRESH_MODE ((uint32_t)0x00000003U) -#define FMC_SDRAM_CMD_LOAD_MODE ((uint32_t)0x00000004U) -#define FMC_SDRAM_CMD_SELFREFRESH_MODE ((uint32_t)0x00000005U) -#define FMC_SDRAM_CMD_POWERDOWN_MODE ((uint32_t)0x00000006U) +#define FMC_SDRAM_CMD_NORMAL_MODE 0x00000000U +#define FMC_SDRAM_CMD_CLK_ENABLE 0x00000001U +#define FMC_SDRAM_CMD_PALL 0x00000002U +#define FMC_SDRAM_CMD_AUTOREFRESH_MODE 0x00000003U +#define FMC_SDRAM_CMD_LOAD_MODE 0x00000004U +#define FMC_SDRAM_CMD_SELFREFRESH_MODE 0x00000005U +#define FMC_SDRAM_CMD_POWERDOWN_MODE 0x00000006U /** * @} */ @@ -712,7 +712,7 @@ typedef struct */ #define FMC_SDRAM_CMD_TARGET_BANK2 FMC_SDCMR_CTB2 #define FMC_SDRAM_CMD_TARGET_BANK1 FMC_SDCMR_CTB1 -#define FMC_SDRAM_CMD_TARGET_BANK1_2 ((uint32_t)0x00000018U) +#define FMC_SDRAM_CMD_TARGET_BANK1_2 0x00000018U /** * @} */ @@ -720,7 +720,7 @@ typedef struct /** @defgroup FMC_SDRAM_Mode_Status FMC SDRAM Mode Status * @{ */ -#define FMC_SDRAM_NORMAL_MODE ((uint32_t)0x00000000U) +#define FMC_SDRAM_NORMAL_MODE 0x00000000U #define FMC_SDRAM_SELF_REFRESH_MODE FMC_SDSR_MODES1_0 #define FMC_SDRAM_POWER_DOWN_MODE FMC_SDSR_MODES1_1 /** @@ -734,10 +734,10 @@ typedef struct /** @defgroup FMC_LL_Interrupt_definition FMC Interrupt definition * @{ */ -#define FMC_IT_RISING_EDGE ((uint32_t)0x00000008U) -#define FMC_IT_LEVEL ((uint32_t)0x00000010U) -#define FMC_IT_FALLING_EDGE ((uint32_t)0x00000020U) -#define FMC_IT_REFRESH_ERROR ((uint32_t)0x00004000U) +#define FMC_IT_RISING_EDGE 0x00000008U +#define FMC_IT_LEVEL 0x00000010U +#define FMC_IT_FALLING_EDGE 0x00000020U +#define FMC_IT_REFRESH_ERROR 0x00004000U /** * @} */ @@ -745,10 +745,10 @@ typedef struct /** @defgroup FMC_LL_Flag_definition FMC Flag definition * @{ */ -#define FMC_FLAG_RISING_EDGE ((uint32_t)0x00000001U) -#define FMC_FLAG_LEVEL ((uint32_t)0x00000002U) -#define FMC_FLAG_FALLING_EDGE ((uint32_t)0x00000004U) -#define FMC_FLAG_FEMPT ((uint32_t)0x00000040U) +#define FMC_FLAG_RISING_EDGE 0x00000001U +#define FMC_FLAG_LEVEL 0x00000002U +#define FMC_FLAG_FALLING_EDGE 0x00000004U +#define FMC_FLAG_FEMPT 0x00000040U #define FMC_SDRAM_FLAG_REFRESH_IT FMC_SDSR_RE #define FMC_SDRAM_FLAG_BUSY FMC_SDSR_BUSY #define FMC_SDRAM_FLAG_REFRESH_ERROR FMC_SDRTR_CRE diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fsmc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fsmc.h index 2653ac4..922247e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fsmc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fsmc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_ll_fsmc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of FSMC HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -271,10 +271,10 @@ typedef struct /** @defgroup FSMC_NORSRAM_Bank FSMC NOR/SRAM Bank * @{ */ -#define FSMC_NORSRAM_BANK1 ((uint32_t)0x00000000U) -#define FSMC_NORSRAM_BANK2 ((uint32_t)0x00000002U) -#define FSMC_NORSRAM_BANK3 ((uint32_t)0x00000004U) -#define FSMC_NORSRAM_BANK4 ((uint32_t)0x00000006U) +#define FSMC_NORSRAM_BANK1 0x00000000U +#define FSMC_NORSRAM_BANK2 0x00000002U +#define FSMC_NORSRAM_BANK3 0x00000004U +#define FSMC_NORSRAM_BANK4 0x00000006U /** * @} */ @@ -282,8 +282,8 @@ typedef struct /** @defgroup FSMC_Data_Address_Bus_Multiplexing FSMC Data Address Bus Multiplexing * @{ */ -#define FSMC_DATA_ADDRESS_MUX_DISABLE ((uint32_t)0x00000000U) -#define FSMC_DATA_ADDRESS_MUX_ENABLE ((uint32_t)0x00000002U) +#define FSMC_DATA_ADDRESS_MUX_DISABLE 0x00000000U +#define FSMC_DATA_ADDRESS_MUX_ENABLE 0x00000002U /** * @} */ @@ -291,9 +291,9 @@ typedef struct /** @defgroup FSMC_Memory_Type FSMC Memory Type * @{ */ -#define FSMC_MEMORY_TYPE_SRAM ((uint32_t)0x00000000U) -#define FSMC_MEMORY_TYPE_PSRAM ((uint32_t)0x00000004U) -#define FSMC_MEMORY_TYPE_NOR ((uint32_t)0x00000008U) +#define FSMC_MEMORY_TYPE_SRAM 0x00000000U +#define FSMC_MEMORY_TYPE_PSRAM 0x00000004U +#define FSMC_MEMORY_TYPE_NOR 0x00000008U /** * @} */ @@ -301,9 +301,9 @@ typedef struct /** @defgroup FSMC_NORSRAM_Data_Width FSMC NOR/SRAM Data Width * @{ */ -#define FSMC_NORSRAM_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) -#define FSMC_NORSRAM_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) -#define FSMC_NORSRAM_MEM_BUS_WIDTH_32 ((uint32_t)0x00000020U) +#define FSMC_NORSRAM_MEM_BUS_WIDTH_8 0x00000000U +#define FSMC_NORSRAM_MEM_BUS_WIDTH_16 0x00000010U +#define FSMC_NORSRAM_MEM_BUS_WIDTH_32 0x00000020U /** * @} */ @@ -311,8 +311,8 @@ typedef struct /** @defgroup FSMC_NORSRAM_Flash_Access FSMC NOR/SRAM Flash Access * @{ */ -#define FSMC_NORSRAM_FLASH_ACCESS_ENABLE ((uint32_t)0x00000040U) -#define FSMC_NORSRAM_FLASH_ACCESS_DISABLE ((uint32_t)0x00000000U) +#define FSMC_NORSRAM_FLASH_ACCESS_ENABLE 0x00000040U +#define FSMC_NORSRAM_FLASH_ACCESS_DISABLE 0x00000000U /** * @} */ @@ -320,8 +320,8 @@ typedef struct /** @defgroup FSMC_Burst_Access_Mode FSMC Burst Access Mode * @{ */ -#define FSMC_BURST_ACCESS_MODE_DISABLE ((uint32_t)0x00000000U) -#define FSMC_BURST_ACCESS_MODE_ENABLE ((uint32_t)0x00000100U) +#define FSMC_BURST_ACCESS_MODE_DISABLE 0x00000000U +#define FSMC_BURST_ACCESS_MODE_ENABLE 0x00000100U /** * @} */ @@ -329,8 +329,8 @@ typedef struct /** @defgroup FSMC_Wait_Signal_Polarity FSMC Wait Signal Polarity * @{ */ -#define FSMC_WAIT_SIGNAL_POLARITY_LOW ((uint32_t)0x00000000U) -#define FSMC_WAIT_SIGNAL_POLARITY_HIGH ((uint32_t)0x00000200U) +#define FSMC_WAIT_SIGNAL_POLARITY_LOW 0x00000000U +#define FSMC_WAIT_SIGNAL_POLARITY_HIGH 0x00000200U /** * @} */ @@ -339,8 +339,8 @@ typedef struct * @note These values are available only for the STM32F405/415/407/417xx devices. * @{ */ -#define FSMC_WRAP_MODE_DISABLE ((uint32_t)0x00000000U) -#define FSMC_WRAP_MODE_ENABLE ((uint32_t)0x00000400U) +#define FSMC_WRAP_MODE_DISABLE 0x00000000U +#define FSMC_WRAP_MODE_ENABLE 0x00000400U /** * @} */ @@ -348,8 +348,8 @@ typedef struct /** @defgroup FSMC_Wait_Timing FSMC Wait Timing * @{ */ -#define FSMC_WAIT_TIMING_BEFORE_WS ((uint32_t)0x00000000U) -#define FSMC_WAIT_TIMING_DURING_WS ((uint32_t)0x00000800U) +#define FSMC_WAIT_TIMING_BEFORE_WS 0x00000000U +#define FSMC_WAIT_TIMING_DURING_WS 0x00000800U /** * @} */ @@ -357,8 +357,8 @@ typedef struct /** @defgroup FSMC_Write_Operation FSMC Write Operation * @{ */ -#define FSMC_WRITE_OPERATION_DISABLE ((uint32_t)0x00000000U) -#define FSMC_WRITE_OPERATION_ENABLE ((uint32_t)0x00001000U) +#define FSMC_WRITE_OPERATION_DISABLE 0x00000000U +#define FSMC_WRITE_OPERATION_ENABLE 0x00001000U /** * @} */ @@ -366,8 +366,8 @@ typedef struct /** @defgroup FSMC_Wait_Signal FSMC Wait Signal * @{ */ -#define FSMC_WAIT_SIGNAL_DISABLE ((uint32_t)0x00000000U) -#define FSMC_WAIT_SIGNAL_ENABLE ((uint32_t)0x00002000U) +#define FSMC_WAIT_SIGNAL_DISABLE 0x00000000U +#define FSMC_WAIT_SIGNAL_ENABLE 0x00002000U /** * @} */ @@ -375,8 +375,8 @@ typedef struct /** @defgroup FSMC_Extended_Mode FSMC Extended Mode * @{ */ -#define FSMC_EXTENDED_MODE_DISABLE ((uint32_t)0x00000000U) -#define FSMC_EXTENDED_MODE_ENABLE ((uint32_t)0x00004000U) +#define FSMC_EXTENDED_MODE_DISABLE 0x00000000U +#define FSMC_EXTENDED_MODE_ENABLE 0x00004000U /** * @} */ @@ -384,8 +384,8 @@ typedef struct /** @defgroup FSMC_AsynchronousWait FSMC Asynchronous Wait * @{ */ -#define FSMC_ASYNCHRONOUS_WAIT_DISABLE ((uint32_t)0x00000000U) -#define FSMC_ASYNCHRONOUS_WAIT_ENABLE ((uint32_t)0x00008000U) +#define FSMC_ASYNCHRONOUS_WAIT_DISABLE 0x00000000U +#define FSMC_ASYNCHRONOUS_WAIT_ENABLE 0x00008000U /** * @} */ @@ -393,7 +393,7 @@ typedef struct /** @defgroup FSMC_Page_Size FSMC Page Size * @{ */ -#define FSMC_PAGE_SIZE_NONE ((uint32_t)0x00000000U) +#define FSMC_PAGE_SIZE_NONE 0x00000000U #define FSMC_PAGE_SIZE_128 ((uint32_t)FSMC_BCR1_CPSIZE_0) #define FSMC_PAGE_SIZE_256 ((uint32_t)FSMC_BCR1_CPSIZE_1) #define FSMC_PAGE_SIZE_512 ((uint32_t)(FSMC_BCR1_CPSIZE_0 | FSMC_BCR1_CPSIZE_1)) @@ -407,7 +407,7 @@ typedef struct * @{ */ #define FSMC_WRITE_FIFO_DISABLE ((uint32_t)FSMC_BCR1_WFDIS) -#define FSMC_WRITE_FIFO_ENABLE ((uint32_t)0x00000000U) +#define FSMC_WRITE_FIFO_ENABLE 0x00000000U /** * @} */ @@ -415,8 +415,8 @@ typedef struct /** @defgroup FSMC_Write_Burst FSMC Write Burst * @{ */ -#define FSMC_WRITE_BURST_DISABLE ((uint32_t)0x00000000U) -#define FSMC_WRITE_BURST_ENABLE ((uint32_t)0x00080000U) +#define FSMC_WRITE_BURST_DISABLE 0x00000000U +#define FSMC_WRITE_BURST_ENABLE 0x00080000U /** * @} */ @@ -425,8 +425,8 @@ typedef struct * @note These values are available only for the STM32F412Vx/Zx/Rx devices. * @{ */ -#define FSMC_CONTINUOUS_CLOCK_SYNC_ONLY ((uint32_t)0x00000000U) -#define FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC ((uint32_t)0x00100000U) +#define FSMC_CONTINUOUS_CLOCK_SYNC_ONLY 0x00000000U +#define FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC 0x00100000U /** * @} */ @@ -434,10 +434,10 @@ typedef struct /** @defgroup FSMC_Access_Mode FSMC Access Mode * @{ */ -#define FSMC_ACCESS_MODE_A ((uint32_t)0x00000000U) -#define FSMC_ACCESS_MODE_B ((uint32_t)0x10000000U) -#define FSMC_ACCESS_MODE_C ((uint32_t)0x20000000U) -#define FSMC_ACCESS_MODE_D ((uint32_t)0x30000000U) +#define FSMC_ACCESS_MODE_A 0x00000000U +#define FSMC_ACCESS_MODE_B 0x10000000U +#define FSMC_ACCESS_MODE_C 0x20000000U +#define FSMC_ACCESS_MODE_D 0x30000000U /** * @} */ @@ -452,8 +452,8 @@ typedef struct /** @defgroup FSMC_NAND_Bank FSMC NAND Bank * @{ */ -#define FSMC_NAND_BANK2 ((uint32_t)0x00000010U) -#define FSMC_NAND_BANK3 ((uint32_t)0x00000100U) +#define FSMC_NAND_BANK2 0x00000010U +#define FSMC_NAND_BANK3 0x00000100U /** * @} */ @@ -461,8 +461,8 @@ typedef struct /** @defgroup FSMC_Wait_feature FSMC Wait feature * @{ */ -#define FSMC_NAND_PCC_WAIT_FEATURE_DISABLE ((uint32_t)0x00000000U) -#define FSMC_NAND_PCC_WAIT_FEATURE_ENABLE ((uint32_t)0x00000002U) +#define FSMC_NAND_PCC_WAIT_FEATURE_DISABLE 0x00000000U +#define FSMC_NAND_PCC_WAIT_FEATURE_ENABLE 0x00000002U /** * @} */ @@ -470,8 +470,8 @@ typedef struct /** @defgroup FSMC_PCR_Memory_Type FSMC PCR Memory Type * @{ */ -#define FSMC_PCR_MEMORY_TYPE_PCCARD ((uint32_t)0x00000000U) -#define FSMC_PCR_MEMORY_TYPE_NAND ((uint32_t)0x00000008U) +#define FSMC_PCR_MEMORY_TYPE_PCCARD 0x00000000U +#define FSMC_PCR_MEMORY_TYPE_NAND 0x00000008U /** * @} */ @@ -479,8 +479,8 @@ typedef struct /** @defgroup FSMC_NAND_Data_Width FSMC NAND Data Width * @{ */ -#define FSMC_NAND_PCC_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) -#define FSMC_NAND_PCC_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) +#define FSMC_NAND_PCC_MEM_BUS_WIDTH_8 0x00000000U +#define FSMC_NAND_PCC_MEM_BUS_WIDTH_16 0x00000010U /** * @} */ @@ -488,8 +488,8 @@ typedef struct /** @defgroup FSMC_ECC FSMC ECC * @{ */ -#define FSMC_NAND_ECC_DISABLE ((uint32_t)0x00000000U) -#define FSMC_NAND_ECC_ENABLE ((uint32_t)0x00000040U) +#define FSMC_NAND_ECC_DISABLE 0x00000000U +#define FSMC_NAND_ECC_ENABLE 0x00000040U /** * @} */ @@ -497,12 +497,12 @@ typedef struct /** @defgroup FSMC_ECC_Page_Size FSMC ECC Page Size * @{ */ -#define FSMC_NAND_ECC_PAGE_SIZE_256BYTE ((uint32_t)0x00000000U) -#define FSMC_NAND_ECC_PAGE_SIZE_512BYTE ((uint32_t)0x00020000U) -#define FSMC_NAND_ECC_PAGE_SIZE_1024BYTE ((uint32_t)0x00040000U) -#define FSMC_NAND_ECC_PAGE_SIZE_2048BYTE ((uint32_t)0x00060000U) -#define FSMC_NAND_ECC_PAGE_SIZE_4096BYTE ((uint32_t)0x00080000U) -#define FSMC_NAND_ECC_PAGE_SIZE_8192BYTE ((uint32_t)0x000A0000U) +#define FSMC_NAND_ECC_PAGE_SIZE_256BYTE 0x00000000U +#define FSMC_NAND_ECC_PAGE_SIZE_512BYTE 0x00020000U +#define FSMC_NAND_ECC_PAGE_SIZE_1024BYTE 0x00040000U +#define FSMC_NAND_ECC_PAGE_SIZE_2048BYTE 0x00060000U +#define FSMC_NAND_ECC_PAGE_SIZE_4096BYTE 0x00080000U +#define FSMC_NAND_ECC_PAGE_SIZE_8192BYTE 0x000A0000U /** * @} */ @@ -514,10 +514,10 @@ typedef struct /** @defgroup FSMC_LL_Interrupt_definition FSMC Interrupt definition * @{ */ -#define FSMC_IT_RISING_EDGE ((uint32_t)0x00000008U) -#define FSMC_IT_LEVEL ((uint32_t)0x00000010U) -#define FSMC_IT_FALLING_EDGE ((uint32_t)0x00000020U) -#define FSMC_IT_REFRESH_ERROR ((uint32_t)0x00004000U) +#define FSMC_IT_RISING_EDGE 0x00000008U +#define FSMC_IT_LEVEL 0x00000010U +#define FSMC_IT_FALLING_EDGE 0x00000020U +#define FSMC_IT_REFRESH_ERROR 0x00004000U /** * @} */ @@ -525,10 +525,10 @@ typedef struct /** @defgroup FSMC_LL_Flag_definition FSMC Flag definition * @{ */ -#define FSMC_FLAG_RISING_EDGE ((uint32_t)0x00000001U) -#define FSMC_FLAG_LEVEL ((uint32_t)0x00000002U) -#define FSMC_FLAG_FALLING_EDGE ((uint32_t)0x00000004U) -#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040U) +#define FSMC_FLAG_RISING_EDGE 0x00000001U +#define FSMC_FLAG_LEVEL 0x00000002U +#define FSMC_FLAG_FALLING_EDGE 0x00000004U +#define FSMC_FLAG_FEMPT 0x00000040U /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h new file mode 100644 index 0000000..1b4f1ef --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h @@ -0,0 +1,1000 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_gpio.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of GPIO LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_GPIO_H +#define __STM32F4xx_LL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) + +/** @defgroup GPIO_LL GPIO + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_Private_Macros GPIO Private Macros + * @{ + */ + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures + * @{ + */ + +/** + * @brief LL GPIO Init Structure definition + */ +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_LL_EC_PIN */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_MODE. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_SPEED. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/ + + uint32_t OutputType; /*!< Specifies the operating output type for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_OUTPUT. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/ + + uint32_t Pull; /*!< Specifies the operating Pull-up/Pull down for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_PULL. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/ + + uint32_t Alternate; /*!< Specifies the Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_AF. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/ +} LL_GPIO_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_LL_EC_PIN PIN + * @{ + */ +#define LL_GPIO_PIN_0 GPIO_BSRR_BS_0 /*!< Select pin 0 */ +#define LL_GPIO_PIN_1 GPIO_BSRR_BS_1 /*!< Select pin 1 */ +#define LL_GPIO_PIN_2 GPIO_BSRR_BS_2 /*!< Select pin 2 */ +#define LL_GPIO_PIN_3 GPIO_BSRR_BS_3 /*!< Select pin 3 */ +#define LL_GPIO_PIN_4 GPIO_BSRR_BS_4 /*!< Select pin 4 */ +#define LL_GPIO_PIN_5 GPIO_BSRR_BS_5 /*!< Select pin 5 */ +#define LL_GPIO_PIN_6 GPIO_BSRR_BS_6 /*!< Select pin 6 */ +#define LL_GPIO_PIN_7 GPIO_BSRR_BS_7 /*!< Select pin 7 */ +#define LL_GPIO_PIN_8 GPIO_BSRR_BS_8 /*!< Select pin 8 */ +#define LL_GPIO_PIN_9 GPIO_BSRR_BS_9 /*!< Select pin 9 */ +#define LL_GPIO_PIN_10 GPIO_BSRR_BS_10 /*!< Select pin 10 */ +#define LL_GPIO_PIN_11 GPIO_BSRR_BS_11 /*!< Select pin 11 */ +#define LL_GPIO_PIN_12 GPIO_BSRR_BS_12 /*!< Select pin 12 */ +#define LL_GPIO_PIN_13 GPIO_BSRR_BS_13 /*!< Select pin 13 */ +#define LL_GPIO_PIN_14 GPIO_BSRR_BS_14 /*!< Select pin 14 */ +#define LL_GPIO_PIN_15 GPIO_BSRR_BS_15 /*!< Select pin 15 */ +#define LL_GPIO_PIN_ALL (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1 | GPIO_BSRR_BS_2 | \ + GPIO_BSRR_BS_3 | GPIO_BSRR_BS_4 | GPIO_BSRR_BS_5 | \ + GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_8 | \ + GPIO_BSRR_BS_9 | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \ + GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \ + GPIO_BSRR_BS_15) /*!< Select all pins */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_MODE Mode + * @{ + */ +#define LL_GPIO_MODE_INPUT (0x00000000U) /*!< Select input mode */ +#define LL_GPIO_MODE_OUTPUT GPIO_MODER_MODER0_0 /*!< Select output mode */ +#define LL_GPIO_MODE_ALTERNATE GPIO_MODER_MODER0_1 /*!< Select alternate function mode */ +#define LL_GPIO_MODE_ANALOG GPIO_MODER_MODER0 /*!< Select analog mode */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_OUTPUT Output Type + * @{ + */ +#define LL_GPIO_OUTPUT_PUSHPULL (0x00000000U) /*!< Select push-pull as output type */ +#define LL_GPIO_OUTPUT_OPENDRAIN GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_SPEED Output Speed + * @{ + */ +#define LL_GPIO_SPEED_FREQ_LOW (0x00000000U) /*!< Select I/O low output speed */ +#define LL_GPIO_SPEED_FREQ_MEDIUM GPIO_OSPEEDER_OSPEEDR0_0 /*!< Select I/O medium output speed */ +#define LL_GPIO_SPEED_FREQ_HIGH GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed */ +#define LL_GPIO_SPEED_FREQ_VERY_HIGH GPIO_OSPEEDER_OSPEEDR0 /*!< Select I/O high output speed */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down + * @{ + */ +#define LL_GPIO_PULL_NO (0x00000000U) /*!< Select I/O no pull */ +#define LL_GPIO_PULL_UP GPIO_PUPDR_PUPDR0_0 /*!< Select I/O pull up */ +#define LL_GPIO_PULL_DOWN GPIO_PUPDR_PUPDR0_1 /*!< Select I/O pull down */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_AF Alternate Function + * @{ + */ +#define LL_GPIO_AF_0 (0x0000000U) /*!< Select alternate function 0 */ +#define LL_GPIO_AF_1 (0x0000001U) /*!< Select alternate function 1 */ +#define LL_GPIO_AF_2 (0x0000002U) /*!< Select alternate function 2 */ +#define LL_GPIO_AF_3 (0x0000003U) /*!< Select alternate function 3 */ +#define LL_GPIO_AF_4 (0x0000004U) /*!< Select alternate function 4 */ +#define LL_GPIO_AF_5 (0x0000005U) /*!< Select alternate function 5 */ +#define LL_GPIO_AF_6 (0x0000006U) /*!< Select alternate function 6 */ +#define LL_GPIO_AF_7 (0x0000007U) /*!< Select alternate function 7 */ +#define LL_GPIO_AF_8 (0x0000008U) /*!< Select alternate function 8 */ +#define LL_GPIO_AF_9 (0x0000009U) /*!< Select alternate function 9 */ +#define LL_GPIO_AF_10 (0x000000AU) /*!< Select alternate function 10 */ +#define LL_GPIO_AF_11 (0x000000BU) /*!< Select alternate function 11 */ +#define LL_GPIO_AF_12 (0x000000CU) /*!< Select alternate function 12 */ +#define LL_GPIO_AF_13 (0x000000DU) /*!< Select alternate function 13 */ +#define LL_GPIO_AF_14 (0x000000EU) /*!< Select alternate function 14 */ +#define LL_GPIO_AF_15 (0x000000FU) /*!< Select alternate function 15 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros + * @{ + */ + +/** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in GPIO register + * @param __INSTANCE__ GPIO Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in GPIO register + * @param __INSTANCE__ GPIO Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration + * @{ + */ + +/** + * @brief Configure gpio mode for a dedicated pin on dedicated port. + * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll MODER MODEy LL_GPIO_SetPinMode + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + * @arg @ref LL_GPIO_MODE_ANALOG + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) +{ + MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio mode for a dedicated pin on dedicated port. + * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll MODER MODEy LL_GPIO_GetPinMode + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + * @arg @ref LL_GPIO_MODE_ANALOG + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->MODER, + (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio output type for several pins on dedicated port. + * @note Output type as to be set when gpio pin is in output or + * alternate modes. Possible type are Push-pull or Open-drain. + * @rmtoll OTYPER OTy LL_GPIO_SetPinOutputType + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @param OutputType This parameter can be one of the following values: + * @arg @ref LL_GPIO_OUTPUT_PUSHPULL + * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) +{ + MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType)); +} + +/** + * @brief Return gpio output type for several pins on dedicated port. + * @note Output type as to be set when gpio pin is in output or + * alternate modes. Possible type are Push-pull or Open-drain. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll OTYPER OTy LL_GPIO_GetPinOutputType + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_OUTPUT_PUSHPULL + * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin)); +} + +/** + * @brief Configure gpio speed for a dedicated pin on dedicated port. + * @note I/O speed can be Low, Medium, Fast or High speed. + * @note Warning: only one pin can be passed as parameter. + * @note Refer to datasheet for frequency specifications and the power + * supply and load conditions for each speed. + * @rmtoll OSPEEDR OSPEEDy LL_GPIO_SetPinSpeed + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Speed This parameter can be one of the following values: + * @arg @ref LL_GPIO_SPEED_FREQ_LOW + * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM + * @arg @ref LL_GPIO_SPEED_FREQ_HIGH + * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Speed) +{ + MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)), + (Speed << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio speed for a dedicated pin on dedicated port. + * @note I/O speed can be Low, Medium, Fast or High speed. + * @note Warning: only one pin can be passed as parameter. + * @note Refer to datasheet for frequency specifications and the power + * supply and load conditions for each speed. + * @rmtoll OSPEEDR OSPEEDy LL_GPIO_GetPinSpeed + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_SPEED_FREQ_LOW + * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM + * @arg @ref LL_GPIO_SPEED_FREQ_HIGH + * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, + (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll PUPDR PUPDy LL_GPIO_SetPinPull + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Pull This parameter can be one of the following values: + * @arg @ref LL_GPIO_PULL_NO + * @arg @ref LL_GPIO_PULL_UP + * @arg @ref LL_GPIO_PULL_DOWN + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) +{ + MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio pull-up or pull-down for a dedicated pin on a dedicated port + * @note Warning: only one pin can be passed as parameter. + * @rmtoll PUPDR PUPDy LL_GPIO_GetPinPull + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_PULL_NO + * @arg @ref LL_GPIO_PULL_UP + * @arg @ref LL_GPIO_PULL_DOWN + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->PUPDR, + (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll AFRL AFSELy LL_GPIO_SetAFPin_0_7 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @param Alternate This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) +{ + MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)), + (Alternate << (POSITION_VAL(Pin) * 4U))); +} + +/** + * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. + * @rmtoll AFRL AFSELy LL_GPIO_GetAFPin_0_7 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + */ +__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->AFR[0], + (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); +} + +/** + * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll AFRH AFSELy LL_GPIO_SetAFPin_8_15 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Alternate This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) +{ + MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)), + (Alternate << (POSITION_VAL(Pin >> 8U) * 4U))); +} + +/** + * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @rmtoll AFRH AFSELy LL_GPIO_GetAFPin_8_15 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + */ +__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->AFR[1], + (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U)); +} + + +/** + * @brief Lock configuration of several pins for a dedicated port. + * @note When the lock sequence has been applied on a port bit, the + * value of this port bit can no longer be modified until the + * next reset. + * @note Each lock bit freezes a specific configuration register + * (control and alternate function registers). + * @rmtoll LCKR LCKK LL_GPIO_LockPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + __IO uint32_t temp; + WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); + WRITE_REG(GPIOx->LCKR, PinMask); + WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); + temp = READ_REG(GPIOx->LCKR); + (void) temp; +} + +/** + * @brief Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0. + * @rmtoll LCKR LCKy LL_GPIO_IsPinLocked + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)); +} + +/** + * @brief Return 1 if one of the pin of a dedicated port is locked. else return 0. + * @rmtoll LCKR LCKK LL_GPIO_IsAnyPinLocked + * @param GPIOx GPIO Port + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx) +{ + return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)); +} + +/** + * @} + */ + +/** @defgroup GPIO_LL_EF_Data_Access Data Access + * @{ + */ + +/** + * @brief Return full input data register value for a dedicated port. + * @rmtoll IDR IDy LL_GPIO_ReadInputPort + * @param GPIOx GPIO Port + * @retval Input data register value of port + */ +__STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx) +{ + return (uint32_t)(READ_REG(GPIOx->IDR)); +} + +/** + * @brief Return if input data level for several pins of dedicated port is high or low. + * @rmtoll IDR IDy LL_GPIO_IsInputPinSet + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask)); +} + +/** + * @brief Write output data register for the port. + * @rmtoll ODR ODy LL_GPIO_WriteOutputPort + * @param GPIOx GPIO Port + * @param PortValue Level value for each pin of the port + * @retval None + */ +__STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue) +{ + WRITE_REG(GPIOx->ODR, PortValue); +} + +/** + * @brief Return full output data register value for a dedicated port. + * @rmtoll ODR ODy LL_GPIO_ReadOutputPort + * @param GPIOx GPIO Port + * @retval Output data register value of port + */ +__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx) +{ + return (uint32_t)(READ_REG(GPIOx->ODR)); +} + +/** + * @brief Return if input data level for several pins of dedicated port is high or low. + * @rmtoll ODR ODy LL_GPIO_IsOutputPinSet + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask)); +} + +/** + * @brief Set several pins to high level on dedicated gpio port. + * @rmtoll BSRR BSy LL_GPIO_SetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BSRR, PinMask); +} + +/** + * @brief Set several pins to low level on dedicated gpio port. + * @rmtoll BSRR BRy LL_GPIO_ResetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BSRR, (PinMask << 16)); +} + +/** + * @brief Toggle data value for several pin of dedicated port. + * @rmtoll ODR ODy LL_GPIO_TogglePin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->ODR, READ_REG(GPIOx->ODR) ^ PinMask); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx); +ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct); +void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_GPIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h new file mode 100644 index 0000000..4777720 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_i2c.h @@ -0,0 +1,1910 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_i2c.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of I2C LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_I2C_H +#define __STM32F4xx_LL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (I2C1) || defined (I2C2) || defined (I2C3) + +/** @defgroup I2C_LL I2C + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2C_LL_Private_Constants I2C Private Constants + * @{ + */ + +/* Defines used to perform compute and check in the macros */ +#define LL_I2C_MAX_SPEED_STANDARD 100000U +#define LL_I2C_MAX_SPEED_FAST 400000U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_Private_Macros I2C Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_ES_INIT I2C Exported Init structure + * @{ + */ +typedef struct +{ + uint32_t PeripheralMode; /*!< Specifies the peripheral mode. + This parameter can be a value of @ref I2C_LL_EC_PERIPHERAL_MODE + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetMode(). */ + + uint32_t ClockSpeed; /*!< Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz (in Hz) + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetClockPeriod() + or @ref LL_I2C_SetDutyCycle() or @ref LL_I2C_SetClockSpeedMode() or @ref LL_I2C_ConfigSpeed(). */ + + uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_LL_EC_DUTYCYCLE + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetDutyCycle(). */ + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) + uint32_t AnalogFilter; /*!< Enables or disables analog noise filter. + This parameter can be a value of @ref I2C_LL_EC_ANALOGFILTER_SELECTION + + This feature can be modified afterwards using unitary functions @ref LL_I2C_EnableAnalogFilter() or LL_I2C_DisableAnalogFilter(). */ + + uint32_t DigitalFilter; /*!< Configures the digital noise filter. + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0x0F + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetDigitalFilter(). */ + +#endif + uint32_t OwnAddress1; /*!< Specifies the device own address 1. + This parameter must be a value between Min_Data = 0x00 and Max_Data = 0x3FF + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ + + uint32_t TypeAcknowledge; /*!< Specifies the ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. + This parameter can be a value of @ref I2C_LL_EC_I2C_ACKNOWLEDGE + + This feature can be modified afterwards using unitary function @ref LL_I2C_AcknowledgeNextData(). */ + + uint32_t OwnAddrSize; /*!< Specifies the device own address 1 size (7-bit or 10-bit). + This parameter can be a value of @ref I2C_LL_EC_OWNADDRESS1 + + This feature can be modified afterwards using unitary function @ref LL_I2C_SetOwnAddress1(). */ +} LL_I2C_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2C_LL_Exported_Constants I2C Exported Constants + * @{ + */ + +/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2C_ReadReg function + * @{ + */ +#define LL_I2C_SR1_SB I2C_SR1_SB /*!< Start Bit (master mode) */ +#define LL_I2C_SR1_ADDR I2C_SR1_ADDR /*!< Address sent (master mode) or + Address matched flag (slave mode) */ +#define LL_I2C_SR1_BTF I2C_SR1_BTF /*!< Byte Transfer Finished flag */ +#define LL_I2C_SR1_ADD10 I2C_SR1_ADD10 /*!< 10-bit header sent (master mode) */ +#define LL_I2C_SR1_STOPF I2C_SR1_STOPF /*!< Stop detection flag (slave mode) */ +#define LL_I2C_SR1_RXNE I2C_SR1_RXNE /*!< Data register not empty (receivers) */ +#define LL_I2C_SR1_TXE I2C_SR1_TXE /*!< Data register empty (transmitters) */ +#define LL_I2C_SR1_BERR I2C_SR1_BERR /*!< Bus error */ +#define LL_I2C_SR1_ARLO I2C_SR1_ARLO /*!< Arbitration lost */ +#define LL_I2C_SR1_AF I2C_SR1_AF /*!< Acknowledge failure flag */ +#define LL_I2C_SR1_OVR I2C_SR1_OVR /*!< Overrun/Underrun */ +#define LL_I2C_SR1_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ +#define LL_I2C_SR1_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ +#define LL_I2C_SR1_SMALERT I2C_ISR_SMALERT /*!< SMBus alert (SMBus mode) */ +#define LL_I2C_SR2_MSL I2C_SR2_MSL /*!< Master/Slave flag */ +#define LL_I2C_SR2_BUSY I2C_SR2_BUSY /*!< Bus busy flag */ +#define LL_I2C_SR2_TRA I2C_SR2_TRA /*!< Transmitter/receiver direction */ +#define LL_I2C_SR2_GENCALL I2C_SR2_GENCALL /*!< General call address (Slave mode) */ +#define LL_I2C_SR2_SMBDEFAULT I2C_SR2_SMBDEFAULT /*!< SMBus Device default address (Slave mode) */ +#define LL_I2C_SR2_SMBHOST I2C_SR2_SMBHOST /*!< SMBus Host address (Slave mode) */ +#define LL_I2C_SR2_DUALF I2C_SR2_DUALF /*!< Dual flag (Slave mode) */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_I2C_ReadReg and LL_I2C_WriteReg functions + * @{ + */ +#define LL_I2C_CR2_ITEVTEN I2C_CR2_ITEVTEN /*!< Events interrupts enable */ +#define LL_I2C_CR2_ITBUFEN I2C_CR2_ITBUFEN /*!< Buffer interrupts enable */ +#define LL_I2C_CR2_ITERREN I2C_CR2_ITERREN /*!< Error interrupts enable */ +/** + * @} + */ + +#if defined(I2C_FLTR_ANOFF) +/** @defgroup I2C_LL_EC_ANALOGFILTER_SELECTION Analog Filter Selection + * @{ + */ +#define LL_I2C_ANALOGFILTER_ENABLE 0x00000000U /*!< Analog filter is enabled. */ +#define LL_I2C_ANALOGFILTER_DISABLE I2C_FLTR_ANOFF /*!< Analog filter is disabled.*/ +/** + * @} + */ + +#endif +/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length + * @{ + */ +#define LL_I2C_OWNADDRESS1_7BIT 0x00004000U /*!< Own address 1 is a 7-bit address. */ +#define LL_I2C_OWNADDRESS1_10BIT (uint32_t)(I2C_OAR1_ADDMODE | 0x00004000U) /*!< Own address 1 is a 10-bit address. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DUTYCYCLE Fast Mode Duty Cycle + * @{ + */ +#define LL_I2C_DUTYCYCLE_2 0x00000000U /*!< I2C fast mode Tlow/Thigh = 2 */ +#define LL_I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY /*!< I2C fast mode Tlow/Thigh = 16/9 */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_CLOCK_SPEED_MODE Master Clock Speed Mode + * @{ + */ +#define LL_I2C_CLOCK_SPEED_STANDARD_MODE 0x00000000U /*!< Master clock speed range is standard mode */ +#define LL_I2C_CLOCK_SPEED_FAST_MODE I2C_CCR_FS /*!< Master clock speed range is fast mode */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_PERIPHERAL_MODE Peripheral Mode + * @{ + */ +#define LL_I2C_MODE_I2C 0x00000000U /*!< I2C Master or Slave mode */ +#define LL_I2C_MODE_SMBUS_HOST (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP) /*!< SMBus Host address acknowledge */ +#define LL_I2C_MODE_SMBUS_DEVICE I2C_CR1_SMBUS /*!< SMBus Device default mode (Default address not acknowledge) */ +#define LL_I2C_MODE_SMBUS_DEVICE_ARP (uint32_t)(I2C_CR1_SMBUS | I2C_CR1_ENARP) /*!< SMBus Device Default address acknowledge */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation + * @{ + */ +#define LL_I2C_ACK I2C_CR1_ACK /*!< ACK is sent after current received byte. */ +#define LL_I2C_NACK 0x00000000U /*!< NACK is sent after current received byte.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction + * @{ + */ +#define LL_I2C_DIRECTION_WRITE I2C_SR2_TRA /*!< Bus is in write transfer */ +#define LL_I2C_DIRECTION_READ 0x00000000U /*!< Bus is in read transfer */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2C_LL_Exported_Macros I2C Exported Macros + * @{ + */ + +/** @defgroup I2C_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in I2C register + * @param __INSTANCE__ I2C Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_I2C_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in I2C register + * @param __INSTANCE__ I2C Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_I2C_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup I2C_LL_EM_Exported_Macros_Helper Exported_Macros_Helper + * @{ + */ + +/** + * @brief Convert Peripheral Clock Frequency in Mhz. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @retval Value of peripheral clock (in Mhz) + */ +#define __LL_I2C_FREQ_HZ_TO_MHZ(__PCLK__) (uint32_t)((__PCLK__)/1000000U) + +/** + * @brief Convert Peripheral Clock Frequency in Hz. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Mhz). + * @retval Value of peripheral clock (in Hz) + */ +#define __LL_I2C_FREQ_MHZ_TO_HZ(__PCLK__) (uint32_t)((__PCLK__)*1000000U) + +/** + * @brief Compute I2C Clock rising time. + * @param __FREQRANGE__ This parameter must be a value of peripheral clock (in Mhz). + * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). + * @retval Value between Min_Data=0x02 and Max_Data=0x3F + */ +#define __LL_I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U)) + +/** + * @brief Compute Speed clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value lower than 400kHz (in Hz). + * @param __DUTYCYCLE__ This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + */ +#define __LL_I2C_SPEED_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__SPEED__) <= LL_I2C_MAX_SPEED_STANDARD)? \ + (__LL_I2C_SPEED_STANDARD_TO_CCR((__PCLK__), (__SPEED__))) : \ + (__LL_I2C_SPEED_FAST_TO_CCR((__PCLK__), (__SPEED__), (__DUTYCYCLE__)))) + +/** + * @brief Compute Speed Standard clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value lower than 100kHz (in Hz). + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF. + */ +#define __LL_I2C_SPEED_STANDARD_TO_CCR(__PCLK__, __SPEED__) (uint32_t)(((((__PCLK__)/((__SPEED__) << 1U)) & I2C_CCR_CCR) < 4U)? 4U:((__PCLK__) / ((__SPEED__) << 1U))) + +/** + * @brief Compute Speed Fast clock range to a Clock Control Register (I2C_CCR_CCR) value. + * @param __PCLK__ This parameter must be a value of peripheral clock (in Hz). + * @param __SPEED__ This parameter must be a value between Min_Data=100Khz and Max_Data=400Khz (in Hz). + * @param __DUTYCYCLE__ This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval Value between Min_Data=0x001 and Max_Data=0xFFF + */ +#define __LL_I2C_SPEED_FAST_TO_CCR(__PCLK__, __SPEED__, __DUTYCYCLE__) (uint32_t)(((__DUTYCYCLE__) == LL_I2C_DUTYCYCLE_2)? \ + (((((__PCLK__) / ((__SPEED__) * 3U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 3U))) : \ + (((((__PCLK__) / ((__SPEED__) * 25U)) & I2C_CCR_CCR) == 0U)? 1U:((__PCLK__) / ((__SPEED__) * 25U)))) + +/** + * @brief Get the Least significant bits of a 10-Bits address. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +#define __LL_I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) + +/** + * @brief Convert a 10-Bits address to a 10-Bits header with Write direction. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0xF0 and Max_Data=0xF6 + */ +#define __LL_I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) + +/** + * @brief Convert a 10-Bits address to a 10-Bits header with Read direction. + * @param __ADDRESS__ This parameter must be a value of a 10-Bits slave address. + * @retval Value between Min_Data=0xF1 and Max_Data=0xF7 + */ +#define __LL_I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2C_LL_Exported_Functions I2C Exported Functions + * @{ + */ + +/** @defgroup I2C_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable I2C peripheral (PE = 1). + * @rmtoll CR1 PE LL_I2C_Enable + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_Enable(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Disable I2C peripheral (PE = 0). + * @rmtoll CR1 PE LL_I2C_Disable + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_Disable(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Check if the I2C peripheral is enabled or disabled. + * @rmtoll CR1 PE LL_I2C_IsEnabled + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabled(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_PE) == (I2C_CR1_PE)); +} + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) +/** + * @brief Configure Noise Filters (Analog and Digital). + * @note If the analog filter is also enabled, the digital filter is added to analog filter. + * The filters can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_ConfigFilters\n + * FLTR DNF LL_I2C_ConfigFilters + * @param I2Cx I2C Instance. + * @param AnalogFilter This parameter can be one of the following values: + * @arg @ref LL_I2C_ANALOGFILTER_ENABLE + * @arg @ref LL_I2C_ANALOGFILTER_DISABLE + * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) + * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->FLTR, I2C_FLTR_ANOFF | I2C_FLTR_DNF, AnalogFilter | DigitalFilter); +} +#endif +#if defined(I2C_FLTR_DNF) + +/** + * @brief Configure Digital Noise Filter. + * @note If the analog filter is also enabled, the digital filter is added to analog filter. + * This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR DNF LL_I2C_SetDigitalFilter + * @param I2Cx I2C Instance. + * @param DigitalFilter This parameter must be a value between Min_Data=0x00 (Digital filter disabled) and Max_Data=0x0F (Digital filter enabled and filtering capability up to 15*TPCLK1) + * This parameter is used to configure the digital noise filter on SDA and SCL input. The digital filter will suppress the spikes with a length of up to DNF[3:0]*TPCLK1. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->FLTR, I2C_FLTR_DNF, DigitalFilter); +} + +/** + * @brief Get the current Digital Noise Filter configuration. + * @rmtoll FLTR DNF LL_I2C_GetDigitalFilter + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_I2C_GetDigitalFilter(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->FLTR, I2C_FLTR_DNF)); +} +#endif +#if defined(I2C_FLTR_ANOFF) + +/** + * @brief Enable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_EnableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); +} + +/** + * @brief Disable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll FLTR ANOFF LL_I2C_DisableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF); +} + +/** + * @brief Check if Analog Noise Filter is enabled or disabled. + * @rmtoll FLTR ANOFF LL_I2C_IsEnabledAnalogFilter + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledAnalogFilter(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->FLTR, I2C_FLTR_ANOFF) == (I2C_FLTR_ANOFF)); +} +#endif + +/** + * @brief Enable DMA transmission requests. + * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Disable DMA transmission requests. + * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Check if DMA transmission requests are enabled or disabled. + * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_TX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_TX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); +} + +/** + * @brief Enable DMA reception requests. + * @rmtoll CR2 DMAEN LL_I2C_EnableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Disable DMA reception requests. + * @rmtoll CR2 DMAEN LL_I2C_DisableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_DMAEN); +} + +/** + * @brief Check if DMA reception requests are enabled or disabled. + * @rmtoll CR2 DMAEN LL_I2C_IsEnabledDMAReq_RX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledDMAReq_RX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_DMAEN) == (I2C_CR2_DMAEN)); +} + +/** + * @brief Get the data register address used for DMA transfer. + * @rmtoll DR DR LL_I2C_DMA_GetRegAddr + * @param I2Cx I2C Instance. + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx) +{ + return (uint32_t) & (I2Cx->DR); +} + +/** + * @brief Enable Clock stretching. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 NOSTRETCH LL_I2C_EnableClockStretching + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableClockStretching(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); +} + +/** + * @brief Disable Clock stretching. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 NOSTRETCH LL_I2C_DisableClockStretching + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableClockStretching(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH); +} + +/** + * @brief Check if Clock stretching is enabled or disabled. + * @rmtoll CR1 NOSTRETCH LL_I2C_IsEnabledClockStretching + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledClockStretching(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_NOSTRETCH) != (I2C_CR1_NOSTRETCH)); +} + +/** + * @brief Enable General Call. + * @note When enabled the Address 0x00 is ACKed. + * @rmtoll CR1 ENGC LL_I2C_EnableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ENGC); +} + +/** + * @brief Disable General Call. + * @note When disabled the Address 0x00 is NACKed. + * @rmtoll CR1 ENGC LL_I2C_DisableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENGC); +} + +/** + * @brief Check if General Call is enabled or disabled. + * @rmtoll CR1 ENGC LL_I2C_IsEnabledGeneralCall + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledGeneralCall(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ENGC) == (I2C_CR1_ENGC)); +} + +/** + * @brief Set the Own Address1. + * @rmtoll OAR1 ADD0 LL_I2C_SetOwnAddress1\n + * OAR1 ADD1_7 LL_I2C_SetOwnAddress1\n + * OAR1 ADD8_9 LL_I2C_SetOwnAddress1\n + * OAR1 ADDMODE LL_I2C_SetOwnAddress1 + * @param I2Cx I2C Instance. + * @param OwnAddress1 This parameter must be a value between Min_Data=0 and Max_Data=0x3FF. + * @param OwnAddrSize This parameter can be one of the following values: + * @arg @ref LL_I2C_OWNADDRESS1_7BIT + * @arg @ref LL_I2C_OWNADDRESS1_10BIT + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetOwnAddress1(I2C_TypeDef *I2Cx, uint32_t OwnAddress1, uint32_t OwnAddrSize) +{ + MODIFY_REG(I2Cx->OAR1, I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE, OwnAddress1 | OwnAddrSize); +} + +/** + * @brief Set the 7bits Own Address2. + * @note This action has no effect if own address2 is enabled. + * @rmtoll OAR2 ADD2 LL_I2C_SetOwnAddress2 + * @param I2Cx I2C Instance. + * @param OwnAddress2 This parameter must be a value between Min_Data=0 and Max_Data=0x7F. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2) +{ + MODIFY_REG(I2Cx->OAR2, I2C_OAR2_ADD2, OwnAddress2); +} + +/** + * @brief Enable acknowledge on Own Address2 match address. + * @rmtoll OAR2 ENDUAL LL_I2C_EnableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); +} + +/** + * @brief Disable acknowledge on Own Address2 match address. + * @rmtoll OAR2 ENDUAL LL_I2C_DisableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL); +} + +/** + * @brief Check if Own Address1 acknowledge is enabled or disabled. + * @rmtoll OAR2 ENDUAL LL_I2C_IsEnabledOwnAddress2 + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress2(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->OAR2, I2C_OAR2_ENDUAL) == (I2C_OAR2_ENDUAL)); +} + +/** + * @brief Configure the Peripheral clock frequency. + * @rmtoll CR2 FREQ LL_I2C_SetPeriphClock + * @param I2Cx I2C Instance. + * @param PeriphClock Peripheral Clock (in Hz) + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetPeriphClock(I2C_TypeDef *I2Cx, uint32_t PeriphClock) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock)); +} + +/** + * @brief Get the Peripheral clock frequency. + * @rmtoll CR2 FREQ LL_I2C_GetPeriphClock + * @param I2Cx I2C Instance. + * @retval Value of Peripheral Clock (in Hz) + */ +__STATIC_INLINE uint32_t LL_I2C_GetPeriphClock(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(__LL_I2C_FREQ_MHZ_TO_HZ(READ_BIT(I2Cx->CR2, I2C_CR2_FREQ))); +} + +/** + * @brief Configure the Duty cycle (Fast mode only). + * @rmtoll CCR DUTY LL_I2C_SetDutyCycle + * @param I2Cx I2C Instance. + * @param DutyCycle This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetDutyCycle(I2C_TypeDef *I2Cx, uint32_t DutyCycle) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_DUTY, DutyCycle); +} + +/** + * @brief Get the Duty cycle (Fast mode only). + * @rmtoll CCR DUTY LL_I2C_GetDutyCycle + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + */ +__STATIC_INLINE uint32_t LL_I2C_GetDutyCycle(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_DUTY)); +} + +/** + * @brief Configure the I2C master clock speed mode. + * @rmtoll CCR FS LL_I2C_SetClockSpeedMode + * @param I2Cx I2C Instance. + * @param ClockSpeedMode This parameter can be one of the following values: + * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE + * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetClockSpeedMode(I2C_TypeDef *I2Cx, uint32_t ClockSpeedMode) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_FS, ClockSpeedMode); +} + +/** + * @brief Get the the I2C master speed mode. + * @rmtoll CCR FS LL_I2C_GetClockSpeedMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_CLOCK_SPEED_STANDARD_MODE + * @arg @ref LL_I2C_CLOCK_SPEED_FAST_MODE + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockSpeedMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_FS)); +} + +/** + * @brief Configure the SCL, SDA rising time. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll TRISE TRISE LL_I2C_SetRiseTime + * @param I2Cx I2C Instance. + * @param RiseTime This parameter must be a value between Min_Data=0x02 and Max_Data=0x3F. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetRiseTime(I2C_TypeDef *I2Cx, uint32_t RiseTime) +{ + MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, RiseTime); +} + +/** + * @brief Get the SCL, SDA rising time. + * @rmtoll TRISE TRISE LL_I2C_GetRiseTime + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x02 and Max_Data=0x3F + */ +__STATIC_INLINE uint32_t LL_I2C_GetRiseTime(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TRISE, I2C_TRISE_TRISE)); +} + +/** + * @brief Configure the SCL high and low period. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CCR CCR LL_I2C_SetClockPeriod + * @param I2Cx I2C Instance. + * @param ClockPeriod This parameter must be a value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetClockPeriod(I2C_TypeDef *I2Cx, uint32_t ClockPeriod) +{ + MODIFY_REG(I2Cx->CCR, I2C_CCR_CCR, ClockPeriod); +} + +/** + * @brief Get the SCL high and low period. + * @rmtoll CCR CCR LL_I2C_GetClockPeriod + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x004 and Max_Data=0xFFF, except in FAST DUTY mode where Min_Data=0x001. + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockPeriod(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CCR, I2C_CCR_CCR)); +} + +/** + * @brief Configure the SCL speed. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR2 FREQ LL_I2C_ConfigSpeed\n + * TRISE TRISE LL_I2C_ConfigSpeed\n + * CCR FS LL_I2C_ConfigSpeed\n + * CCR DUTY LL_I2C_ConfigSpeed\n + * CCR CCR LL_I2C_ConfigSpeed + * @param I2Cx I2C Instance. + * @param PeriphClock Peripheral Clock (in Hz) + * @param ClockSpeed This parameter must be a value lower than 400kHz (in Hz). + * @param DutyCycle This parameter can be one of the following values: + * @arg @ref LL_I2C_DUTYCYCLE_2 + * @arg @ref LL_I2C_DUTYCYCLE_16_9 + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigSpeed(I2C_TypeDef *I2Cx, uint32_t PeriphClock, uint32_t ClockSpeed, + uint32_t DutyCycle) +{ + register uint32_t freqrange = 0x0U; + register uint32_t clockconfig = 0x0U; + + /* Compute frequency range */ + freqrange = __LL_I2C_FREQ_HZ_TO_MHZ(PeriphClock); + + /* Configure I2Cx: Frequency range register */ + MODIFY_REG(I2Cx->CR2, I2C_CR2_FREQ, freqrange); + + /* Configure I2Cx: Rise Time register */ + MODIFY_REG(I2Cx->TRISE, I2C_TRISE_TRISE, __LL_I2C_RISE_TIME(freqrange, ClockSpeed)); + + /* Configure Speed mode, Duty Cycle and Clock control register value */ + if (ClockSpeed > LL_I2C_MAX_SPEED_STANDARD) + { + /* Set Speed mode at fast and duty cycle for Clock Speed request in fast clock range */ + clockconfig = LL_I2C_CLOCK_SPEED_FAST_MODE | \ + __LL_I2C_SPEED_FAST_TO_CCR(PeriphClock, ClockSpeed, DutyCycle) | \ + DutyCycle; + } + else + { + /* Set Speed mode at standard for Clock Speed request in standard clock range */ + clockconfig = LL_I2C_CLOCK_SPEED_STANDARD_MODE | \ + __LL_I2C_SPEED_STANDARD_TO_CCR(PeriphClock, ClockSpeed); + } + + /* Configure I2Cx: Clock control register */ + MODIFY_REG(I2Cx->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), clockconfig); +} + +/** + * @brief Configure peripheral mode. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBUS LL_I2C_SetMode\n + * CR1 SMBTYPE LL_I2C_SetMode\n + * CR1 ENARP LL_I2C_SetMode + * @param I2Cx I2C Instance. + * @param PeripheralMode This parameter can be one of the following values: + * @arg @ref LL_I2C_MODE_I2C + * @arg @ref LL_I2C_MODE_SMBUS_HOST + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetMode(I2C_TypeDef *I2Cx, uint32_t PeripheralMode) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP, PeripheralMode); +} + +/** + * @brief Get peripheral mode. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBUS LL_I2C_GetMode\n + * CR1 SMBTYPE LL_I2C_GetMode\n + * CR1 ENARP LL_I2C_GetMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_MODE_I2C + * @arg @ref LL_I2C_MODE_SMBUS_HOST + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE + * @arg @ref LL_I2C_MODE_SMBUS_DEVICE_ARP + */ +__STATIC_INLINE uint32_t LL_I2C_GetMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR1, I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP)); +} + +/** + * @brief Enable SMBus alert (Host or Device mode) + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note SMBus Device mode: + * - SMBus Alert pin is drived low and + * Alert Response Address Header acknowledge is enabled. + * SMBus Host mode: + * - SMBus Alert pin management is supported. + * @rmtoll CR1 ALERT LL_I2C_EnableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ALERT); +} + +/** + * @brief Disable SMBus alert (Host or Device mode) + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note SMBus Device mode: + * - SMBus Alert pin is not drived (can be used as a standard GPIO) and + * Alert Response Address Header acknowledge is disabled. + * SMBus Host mode: + * - SMBus Alert pin management is not supported. + * @rmtoll CR1 ALERT LL_I2C_DisableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERT); +} + +/** + * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ALERT LL_I2C_IsEnabledSMBusAlert + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusAlert(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ALERT) == (I2C_CR1_ALERT)); +} + +/** + * @brief Enable SMBus Packet Error Calculation (PEC). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_EnableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ENPEC); +} + +/** + * @brief Disable SMBus Packet Error Calculation (PEC). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_DisableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ENPEC); +} + +/** + * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ENPEC LL_I2C_IsEnabledSMBusPEC + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPEC(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_ENPEC) == (I2C_CR1_ENPEC)); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable TXE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_TX\n + * CR2 ITBUFEN LL_I2C_EnableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable TXE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_TX\n + * CR2 ITBUFEN LL_I2C_DisableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if the TXE Interrupt is enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_TX\n + * CR2 ITBUFEN LL_I2C_IsEnabledIT_TX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable RXNE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_RX\n + * CR2 ITBUFEN LL_I2C_EnableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable RXNE interrupt. + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_RX\n + * CR2 ITBUFEN LL_I2C_DisableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if the RXNE Interrupt is enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_RX\n + * CR2 ITBUFEN LL_I2C_IsEnabledIT_RX + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_RX(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN) == (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable Events interrupts. + * @note Any of these events will generate interrupt : + * Start Bit (SB) + * Address sent, Address matched (ADDR) + * 10-bit header sent (ADD10) + * Stop detection (STOPF) + * Byte transfer finished (BTF) + * + * @note Any of these events will generate interrupt if Buffer interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_BUF()) : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITEVTEN LL_I2C_EnableIT_EVT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_EVT(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); +} + +/** + * @brief Disable Events interrupts. + * @note Any of these events will generate interrupt : + * Start Bit (SB) + * Address sent, Address matched (ADDR) + * 10-bit header sent (ADD10) + * Stop detection (STOPF) + * Byte transfer finished (BTF) + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITEVTEN LL_I2C_DisableIT_EVT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_EVT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN); +} + +/** + * @brief Check if Events interrupts are enabled or disabled. + * @rmtoll CR2 ITEVTEN LL_I2C_IsEnabledIT_EVT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_EVT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITEVTEN) == (I2C_CR2_ITEVTEN)); +} + +/** + * @brief Enable Buffer interrupts. + * @note Any of these Buffer events will generate interrupt if Events interrupts are enabled too(using unitary function @ref LL_I2C_EnableIT_EVT()) : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITBUFEN LL_I2C_EnableIT_BUF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_BUF(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); +} + +/** + * @brief Disable Buffer interrupts. + * @note Any of these Buffer events will generate interrupt : + * Receive buffer not empty (RXNE) + * Transmit buffer empty (TXE) + * @rmtoll CR2 ITBUFEN LL_I2C_DisableIT_BUF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_BUF(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN); +} + +/** + * @brief Check if Buffer interrupts are enabled or disabled. + * @rmtoll CR2 ITBUFEN LL_I2C_IsEnabledIT_BUF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_BUF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITBUFEN) == (I2C_CR2_ITBUFEN)); +} + +/** + * @brief Enable Error interrupts. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note Any of these errors will generate interrupt : + * Bus Error detection (BERR) + * Arbitration Loss (ARLO) + * Acknowledge Failure(AF) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (SMBALERT) + * @rmtoll CR2 ITERREN LL_I2C_EnableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_ITERREN); +} + +/** + * @brief Disable Error interrupts. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note Any of these errors will generate interrupt : + * Bus Error detection (BERR) + * Arbitration Loss (ARLO) + * Acknowledge Failure(AF) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (SMBALERT) + * @rmtoll CR2 ITERREN LL_I2C_DisableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_ITERREN); +} + +/** + * @brief Check if Error interrupts are enabled or disabled. + * @rmtoll CR2 ITERREN LL_I2C_IsEnabledIT_ERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_ITERREN) == (I2C_CR2_ITERREN)); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_FLAG_management FLAG_management + * @{ + */ + +/** + * @brief Indicate the status of Transmit data register empty flag. + * @note RESET: When next data is written in Transmit data register. + * SET: When Transmit data register is empty. + * @rmtoll SR1 TXE LL_I2C_IsActiveFlag_TXE + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXE(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_TXE) == (I2C_SR1_TXE)); +} + +/** + * @brief Indicate the status of Byte Transfer Finished flag. + * RESET: When Data byte transfer not done. + * SET: When Data byte transfer succeeded. + * @rmtoll SR1 BTF LL_I2C_IsActiveFlag_BTF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BTF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_BTF) == (I2C_SR1_BTF)); +} + +/** + * @brief Indicate the status of Receive data register not empty flag. + * @note RESET: When Receive data register is read. + * SET: When the received data is copied in Receive data register. + * @rmtoll SR1 RXNE LL_I2C_IsActiveFlag_RXNE + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_RXNE(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_RXNE) == (I2C_SR1_RXNE)); +} + +/** + * @brief Indicate the status of Start Bit (master mode). + * @note RESET: When No Start condition. + * SET: When Start condition is generated. + * @rmtoll SR1 SB LL_I2C_IsActiveFlag_SB + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_SB(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_SB) == (I2C_SR1_SB)); +} + +/** + * @brief Indicate the status of Address sent (master mode) or Address matched flag (slave mode). + * @note RESET: Clear default value. + * SET: When the address is fully sent (master mode) or when the received slave address matched with one of the enabled slave address (slave mode). + * @rmtoll SR1 ADDR LL_I2C_IsActiveFlag_ADDR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADDR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ADDR) == (I2C_SR1_ADDR)); +} + +/** + * @brief Indicate the status of 10-bit header sent (master mode). + * @note RESET: When no ADD10 event occured. + * SET: When the master has sent the first address byte (header). + * @rmtoll SR1 ADD10 LL_I2C_IsActiveFlag_ADD10 + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ADD10(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ADD10) == (I2C_SR1_ADD10)); +} + +/** + * @brief Indicate the status of Acknowledge failure flag. + * @note RESET: No acknowledge failure. + * SET: When an acknowledge failure is received after a byte transmission. + * @rmtoll SR1 AF LL_I2C_IsActiveFlag_AF + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_AF(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_AF) == (I2C_SR1_AF)); +} + +/** + * @brief Indicate the status of Stop detection flag (slave mode). + * @note RESET: Clear default value. + * SET: When a Stop condition is detected. + * @rmtoll SR1 STOPF LL_I2C_IsActiveFlag_STOP + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_STOP(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_STOPF) == (I2C_SR1_STOPF)); +} + +/** + * @brief Indicate the status of Bus error flag. + * @note RESET: Clear default value. + * SET: When a misplaced Start or Stop condition is detected. + * @rmtoll SR1 BERR LL_I2C_IsActiveFlag_BERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_BERR) == (I2C_SR1_BERR)); +} + +/** + * @brief Indicate the status of Arbitration lost flag. + * @note RESET: Clear default value. + * SET: When arbitration lost. + * @rmtoll SR1 ARLO LL_I2C_IsActiveFlag_ARLO + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_ARLO(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_ARLO) == (I2C_SR1_ARLO)); +} + +/** + * @brief Indicate the status of Overrun/Underrun flag. + * @note RESET: Clear default value. + * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). + * @rmtoll SR1 OVR LL_I2C_IsActiveFlag_OVR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_OVR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_OVR) == (I2C_SR1_OVR)); +} + +/** + * @brief Indicate the status of SMBus PEC error flag in reception. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 PECERR LL_I2C_IsActiveSMBusFlag_PECERR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_PECERR(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_PECERR) == (I2C_SR1_PECERR)); +} + +/** + * @brief Indicate the status of SMBus Timeout detection flag. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 TIMEOUT LL_I2C_IsActiveSMBusFlag_TIMEOUT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT) == (I2C_SR1_TIMEOUT)); +} + +/** + * @brief Indicate the status of SMBus alert flag. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 SMBALERT LL_I2C_IsActiveSMBusFlag_ALERT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_ALERT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR1, I2C_SR1_SMBALERT) == (I2C_SR1_SMBALERT)); +} + +/** + * @brief Indicate the status of Bus Busy flag. + * @note RESET: Clear default value. + * SET: When a Start condition is detected. + * @rmtoll SR2 BUSY LL_I2C_IsActiveFlag_BUSY + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_BUSY(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_BUSY) == (I2C_SR2_BUSY)); +} + +/** + * @brief Indicate the status of Dual flag. + * @note RESET: Received address matched with OAR1. + * SET: Received address matched with OAR2. + * @rmtoll SR2 DUALF LL_I2C_IsActiveFlag_DUAL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_DUAL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_DUALF) == (I2C_SR2_DUALF)); +} + +/** + * @brief Indicate the status of SMBus Host address reception (Slave mode). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: No SMBus Host address + * SET: SMBus Host address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 SMBHOST LL_I2C_IsActiveSMBusFlag_SMBHOST + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBHOST(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBHOST) == (I2C_SR2_SMBHOST)); +} + +/** + * @brief Indicate the status of SMBus Device default address reception (Slave mode). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: No SMBus Device default address + * SET: SMBus Device default address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 SMBDEFAULT LL_I2C_IsActiveSMBusFlag_SMBDEFAULT + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveSMBusFlag_SMBDEFAULT(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_SMBDEFAULT) == (I2C_SR2_SMBDEFAULT)); +} + +/** + * @brief Indicate the status of General call address reception (Slave mode). + * @note RESET: No Generall call address + * SET: General call address received. + * @note This status is cleared by hardware after a STOP condition or repeated START condition. + * @rmtoll SR2 GENCALL LL_I2C_IsActiveFlag_GENCALL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_GENCALL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_GENCALL) == (I2C_SR2_GENCALL)); +} + +/** + * @brief Indicate the status of Master/Slave flag. + * @note RESET: Slave Mode. + * SET: Master Mode. + * @rmtoll SR2 MSL LL_I2C_IsActiveFlag_MSL + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_MSL(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->SR2, I2C_SR2_MSL) == (I2C_SR2_MSL)); +} + +/** + * @brief Clear Address Matched flag. + * @note Clearing this flag is done by a read access to the I2Cx_SR1 + * register followed by a read access to the I2Cx_SR2 register. + * @rmtoll SR1 ADDR LL_I2C_ClearFlag_ADDR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) +{ + __IO uint32_t tmpreg; + tmpreg = I2Cx->SR1; + (void) tmpreg; + tmpreg = I2Cx->SR2; + (void) tmpreg; +} + +/** + * @brief Clear Acknowledge failure flag. + * @rmtoll SR1 AF LL_I2C_ClearFlag_AF + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_AF(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_AF); +} + +/** + * @brief Clear Stop detection flag. + * @note Clearing this flag is done by a read access to the I2Cx_SR1 + * register followed by a write access to I2Cx_CR1 register. + * @rmtoll SR1 STOPF LL_I2C_ClearFlag_STOP\n + * CR1 PE LL_I2C_ClearFlag_STOP + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) +{ + __IO uint32_t tmpreg; + tmpreg = I2Cx->SR1; + (void) tmpreg; + SET_BIT(I2Cx->CR1, I2C_CR1_PE); +} + +/** + * @brief Clear Bus error flag. + * @rmtoll SR1 BERR LL_I2C_ClearFlag_BERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_BERR); +} + +/** + * @brief Clear Arbitration lost flag. + * @rmtoll SR1 ARLO LL_I2C_ClearFlag_ARLO + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_ARLO); +} + +/** + * @brief Clear Overrun/Underrun flag. + * @rmtoll SR1 OVR LL_I2C_ClearFlag_OVR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_OVR); +} + +/** + * @brief Clear SMBus PEC error flag. + * @rmtoll SR1 PECERR LL_I2C_ClearSMBusFlag_PECERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_PECERR); +} + +/** + * @brief Clear SMBus Timeout detection flag. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 TIMEOUT LL_I2C_ClearSMBusFlag_TIMEOUT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_TIMEOUT); +} + +/** + * @brief Clear SMBus Alert flag. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR1 SMBALERT LL_I2C_ClearSMBusFlag_ALERT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->SR1, I2C_SR1_SMBALERT); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Enable Reset of I2C peripheral. + * @rmtoll CR1 SWRST LL_I2C_EnableReset + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableReset(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_SWRST); +} + +/** + * @brief Disable Reset of I2C peripheral. + * @rmtoll CR1 SWRST LL_I2C_DisableReset + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableReset(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_SWRST); +} + +/** + * @brief Check if the I2C peripheral is under reset state or not. + * @rmtoll CR1 SWRST LL_I2C_IsResetEnabled + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsResetEnabled(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_SWRST) == (I2C_CR1_SWRST)); +} + +/** + * @brief Prepare the generation of a ACKnowledge or Non ACKnowledge condition after the address receive match code or next received byte. + * @note Usage in Slave or Master mode. + * @rmtoll CR1 ACK LL_I2C_AcknowledgeNextData + * @param I2Cx I2C Instance. + * @param TypeAcknowledge This parameter can be one of the following values: + * @arg @ref LL_I2C_ACK + * @arg @ref LL_I2C_NACK + * @retval None + */ +__STATIC_INLINE void LL_I2C_AcknowledgeNextData(I2C_TypeDef *I2Cx, uint32_t TypeAcknowledge) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_ACK, TypeAcknowledge); +} + +/** + * @brief Generate a START or RESTART condition + * @note The START bit can be set even if bus is BUSY or I2C is in slave mode. + * This action has no effect when RELOAD is set. + * @rmtoll CR1 START LL_I2C_GenerateStartCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_START); +} + +/** + * @brief Generate a STOP condition after the current byte transfer (master mode). + * @rmtoll CR1 STOP LL_I2C_GenerateStopCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_STOP); +} + +/** + * @brief Enable bit POS (master/host mode). + * @note In that case, the ACK bit controls the (N)ACK of the next byte received or the PEC bit indicates that the next byte in shift register is a PEC. + * @rmtoll CR1 POS LL_I2C_EnableBitPOS + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableBitPOS(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_POS); +} + +/** + * @brief Disable bit POS (master/host mode). + * @note In that case, the ACK bit controls the (N)ACK of the current byte received or the PEC bit indicates that the current byte in shift register is a PEC. + * @rmtoll CR1 POS LL_I2C_DisableBitPOS + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableBitPOS(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_POS); +} + +/** + * @brief Check if bit POS is enabled or disabled. + * @rmtoll CR1 POS LL_I2C_IsEnabledBitPOS + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledBitPOS(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_POS) == (I2C_CR1_POS)); +} + +/** + * @brief Indicate the value of transfer direction. + * @note RESET: Bus is in read transfer (peripheral point of view). + * SET: Bus is in write transfer (peripheral point of view). + * @rmtoll SR2 TRA LL_I2C_GetTransferDirection + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_DIRECTION_WRITE + * @arg @ref LL_I2C_DIRECTION_READ + */ +__STATIC_INLINE uint32_t LL_I2C_GetTransferDirection(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_TRA)); +} + +/** + * @brief Enable DMA last transfer. + * @note This action mean that next DMA EOT is the last transfer. + * @rmtoll CR2 LAST LL_I2C_EnableLastDMA + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableLastDMA(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_LAST); +} + +/** + * @brief Disable DMA last transfer. + * @note This action mean that next DMA EOT is not the last transfer. + * @rmtoll CR2 LAST LL_I2C_DisableLastDMA + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableLastDMA(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_LAST); +} + +/** + * @brief Check if DMA last transfer is enabled or disabled. + * @rmtoll CR2 LAST LL_I2C_IsEnabledLastDMA + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledLastDMA(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR2, I2C_CR2_LAST) == (I2C_CR2_LAST)); +} + +/** + * @brief Enable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note This feature is cleared by hardware when the PEC byte is transferred or compared, + * or by a START or STOP condition, it is also cleared by software. + * @rmtoll CR1 PEC LL_I2C_EnableSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_PEC); +} + +/** + * @brief Disable transfer or internal comparison of the SMBus Packet Error byte (transmission or reception mode). + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PEC LL_I2C_DisableSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_PEC); +} + +/** + * @brief Check if the SMBus Packet Error byte transfer or internal comparison is requested or not. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PEC LL_I2C_IsEnabledSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + return (READ_BIT(I2Cx->CR1, I2C_CR1_PEC) == (I2C_CR1_PEC)); +} + +/** + * @brief Get the SMBus Packet Error byte calculated. + * @note Macro @ref IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll SR2 PEC LL_I2C_GetSMBusPEC + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetSMBusPEC(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SR2, I2C_SR2_PEC) >> I2C_SR2_PEC_Pos); +} + +/** + * @brief Read Receive Data register. + * @rmtoll DR DR LL_I2C_ReceiveData8 + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) +{ + return (uint8_t)(READ_BIT(I2Cx->DR, I2C_DR_DR)); +} + +/** + * @brief Write in Transmit Data Register . + * @rmtoll DR DR LL_I2C_TransmitData8 + * @param I2Cx I2C Instance. + * @param Data Value between Min_Data=0x0 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) +{ + MODIFY_REG(I2Cx->DR, I2C_DR_DR, Data); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); +uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx); +void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct); + + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* I2C1 || I2C2 || I2C3 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_I2C_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_iwdg.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_iwdg.h new file mode 100644 index 0000000..631a156 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_iwdg.h @@ -0,0 +1,329 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_iwdg.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of IWDG LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_IWDG_H +#define __STM32F4xx_LL_IWDG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(IWDG) + +/** @defgroup IWDG_LL IWDG + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup IWDG_LL_Private_Constants IWDG Private Constants + * @{ + */ + +#define LL_IWDG_KEY_RELOAD 0x0000AAAAU /*!< IWDG Reload Counter Enable */ +#define LL_IWDG_KEY_ENABLE 0x0000CCCCU /*!< IWDG Peripheral Enable */ +#define LL_IWDG_KEY_WR_ACCESS_ENABLE 0x00005555U /*!< IWDG KR Write Access Enable */ +#define LL_IWDG_KEY_WR_ACCESS_DISABLE 0x00000000U /*!< IWDG KR Write Access Disable */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup IWDG_LL_Exported_Constants IWDG Exported Constants + * @{ + */ + +/** @defgroup IWDG_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_IWDG_ReadReg function + * @{ + */ +#define LL_IWDG_SR_PVU IWDG_SR_PVU /*!< Watchdog prescaler value update */ +#define LL_IWDG_SR_RVU IWDG_SR_RVU /*!< Watchdog counter reload value update */ + +/** + * @} + */ + +/** @defgroup IWDG_LL_EC_PRESCALER Prescaler Divider + * @{ + */ +#define LL_IWDG_PRESCALER_4 0x00000000U /*!< Divider by 4 */ +#define LL_IWDG_PRESCALER_8 (IWDG_PR_PR_0) /*!< Divider by 8 */ +#define LL_IWDG_PRESCALER_16 (IWDG_PR_PR_1) /*!< Divider by 16 */ +#define LL_IWDG_PRESCALER_32 (IWDG_PR_PR_1 | IWDG_PR_PR_0) /*!< Divider by 32 */ +#define LL_IWDG_PRESCALER_64 (IWDG_PR_PR_2) /*!< Divider by 64 */ +#define LL_IWDG_PRESCALER_128 (IWDG_PR_PR_2 | IWDG_PR_PR_0) /*!< Divider by 128 */ +#define LL_IWDG_PRESCALER_256 (IWDG_PR_PR_2 | IWDG_PR_PR_1) /*!< Divider by 256 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup IWDG_LL_Exported_Macros IWDG Exported Macros + * @{ + */ + +/** @defgroup IWDG_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in IWDG register + * @param __INSTANCE__ IWDG Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_IWDG_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in IWDG register + * @param __INSTANCE__ IWDG Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_IWDG_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup IWDG_LL_Exported_Functions IWDG Exported Functions + * @{ + */ +/** @defgroup IWDG_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Start the Independent Watchdog + * @note Except if the hardware watchdog option is selected + * @rmtoll KR KEY LL_IWDG_Enable + * @param IWDGx IWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_IWDG_Enable(IWDG_TypeDef *IWDGx) +{ + WRITE_REG(IWDG->KR, LL_IWDG_KEY_ENABLE); +} + +/** + * @brief Reloads IWDG counter with value defined in the reload register + * @rmtoll KR KEY LL_IWDG_ReloadCounter + * @param IWDGx IWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_IWDG_ReloadCounter(IWDG_TypeDef *IWDGx) +{ + WRITE_REG(IWDG->KR, LL_IWDG_KEY_RELOAD); +} + +/** + * @brief Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers + * @rmtoll KR KEY LL_IWDG_EnableWriteAccess + * @param IWDGx IWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_IWDG_EnableWriteAccess(IWDG_TypeDef *IWDGx) +{ + WRITE_REG(IWDG->KR, LL_IWDG_KEY_WR_ACCESS_ENABLE); +} + +/** + * @brief Disable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers + * @rmtoll KR KEY LL_IWDG_DisableWriteAccess + * @param IWDGx IWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_IWDG_DisableWriteAccess(IWDG_TypeDef *IWDGx) +{ + WRITE_REG(IWDG->KR, LL_IWDG_KEY_WR_ACCESS_DISABLE); +} + +/** + * @brief Select the prescaler of the IWDG + * @rmtoll PR PR LL_IWDG_SetPrescaler + * @param IWDGx IWDG Instance + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_IWDG_PRESCALER_4 + * @arg @ref LL_IWDG_PRESCALER_8 + * @arg @ref LL_IWDG_PRESCALER_16 + * @arg @ref LL_IWDG_PRESCALER_32 + * @arg @ref LL_IWDG_PRESCALER_64 + * @arg @ref LL_IWDG_PRESCALER_128 + * @arg @ref LL_IWDG_PRESCALER_256 + * @retval None + */ +__STATIC_INLINE void LL_IWDG_SetPrescaler(IWDG_TypeDef *IWDGx, uint32_t Prescaler) +{ + WRITE_REG(IWDGx->PR, IWDG_PR_PR & Prescaler); +} + +/** + * @brief Get the selected prescaler of the IWDG + * @rmtoll PR PR LL_IWDG_GetPrescaler + * @param IWDGx IWDG Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_IWDG_PRESCALER_4 + * @arg @ref LL_IWDG_PRESCALER_8 + * @arg @ref LL_IWDG_PRESCALER_16 + * @arg @ref LL_IWDG_PRESCALER_32 + * @arg @ref LL_IWDG_PRESCALER_64 + * @arg @ref LL_IWDG_PRESCALER_128 + * @arg @ref LL_IWDG_PRESCALER_256 + */ +__STATIC_INLINE uint32_t LL_IWDG_GetPrescaler(IWDG_TypeDef *IWDGx) +{ + return (uint32_t)(READ_REG(IWDGx->PR)); +} + +/** + * @brief Specify the IWDG down-counter reload value + * @rmtoll RLR RL LL_IWDG_SetReloadCounter + * @param IWDGx IWDG Instance + * @param Counter Value between Min_Data=0 and Max_Data=0x0FFF + * @retval None + */ +__STATIC_INLINE void LL_IWDG_SetReloadCounter(IWDG_TypeDef *IWDGx, uint32_t Counter) +{ + WRITE_REG(IWDGx->RLR, IWDG_RLR_RL & Counter); +} + +/** + * @brief Get the specified IWDG down-counter reload value + * @rmtoll RLR RL LL_IWDG_GetReloadCounter + * @param IWDGx IWDG Instance + * @retval Value between Min_Data=0 and Max_Data=0x0FFF + */ +__STATIC_INLINE uint32_t LL_IWDG_GetReloadCounter(IWDG_TypeDef *IWDGx) +{ + return (uint32_t)(READ_REG(IWDGx->RLR)); +} + + +/** + * @} + */ + +/** @defgroup IWDG_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Check if flag Prescaler Value Update is set or not + * @rmtoll SR PVU LL_IWDG_IsActiveFlag_PVU + * @param IWDGx IWDG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_PVU(IWDG_TypeDef *IWDGx) +{ + return (READ_BIT(IWDGx->SR, IWDG_SR_PVU) == (IWDG_SR_PVU)); +} + +/** + * @brief Check if flag Reload Value Update is set or not + * @rmtoll SR RVU LL_IWDG_IsActiveFlag_RVU + * @param IWDGx IWDG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_IWDG_IsActiveFlag_RVU(IWDG_TypeDef *IWDGx) +{ + return (READ_BIT(IWDGx->SR, IWDG_SR_RVU) == (IWDG_SR_RVU)); +} + + +/** + * @brief Check if all flags Prescaler, Reload & Window Value Update are reset or not + * @rmtoll SR PVU LL_IWDG_IsReady\n + * SR RVU LL_IWDG_IsReady + * @param IWDGx IWDG Instance + * @retval State of bits (1 or 0). + */ +__STATIC_INLINE uint32_t LL_IWDG_IsReady(IWDG_TypeDef *IWDGx) +{ + return (READ_BIT(IWDGx->SR, IWDG_SR_PVU | IWDG_SR_RVU) == 0U); +} + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* IWDG) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_IWDG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_lptim.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_lptim.h new file mode 100644 index 0000000..8d58d98 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_lptim.h @@ -0,0 +1,1377 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_lptim.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of LPTIM LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_LPTIM_H +#define __STM32F4xx_LL_LPTIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ +#if defined (LPTIM1) + +/** @defgroup LPTIM_LL LPTIM + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup LPTIM_LL_Private_Macros LPTIM Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup LPTIM_LL_ES_INIT LPTIM Exported Init structure + * @{ + */ + +/** + * @brief LPTIM Init structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< Specifies the source of the clock used by the LPTIM instance. + This parameter can be a value of @ref LPTIM_LL_EC_CLK_SOURCE. + + This feature can be modified afterwards using unitary function @ref LL_LPTIM_SetClockSource().*/ + + uint32_t Prescaler; /*!< Specifies the prescaler division ratio. + This parameter can be a value of @ref LPTIM_LL_EC_PRESCALER. + + This feature can be modified afterwards using using unitary function @ref LL_LPTIM_SetPrescaler().*/ + + uint32_t Waveform; /*!< Specifies the waveform shape. + This parameter can be a value of @ref LPTIM_LL_EC_OUTPUT_WAVEFORM. + + This feature can be modified afterwards using unitary function @ref LL_LPTIM_ConfigOutput().*/ + + uint32_t Polarity; /*!< Specifies waveform polarity. + This parameter can be a value of @ref LPTIM_LL_EC_OUTPUT_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_LPTIM_ConfigOutput().*/ +} LL_LPTIM_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup LPTIM_LL_Exported_Constants LPTIM Exported Constants + * @{ + */ + +/** @defgroup LPTIM_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_LPTIM_ReadReg function + * @{ + */ +#define LL_LPTIM_ISR_CMPM LPTIM_ISR_CMPM /*!< Compare match */ +#define LL_LPTIM_ISR_ARRM LPTIM_ISR_ARRM /*!< Autoreload match */ +#define LL_LPTIM_ISR_EXTTRIG LPTIM_ISR_EXTTRIG /*!< External trigger edge event */ +#define LL_LPTIM_ISR_CMPOK LPTIM_ISR_CMPOK /*!< Compare register update OK */ +#define LL_LPTIM_ISR_ARROK LPTIM_ISR_ARROK /*!< Autoreload register update OK */ +#define LL_LPTIM_ISR_UP LPTIM_ISR_UP /*!< Counter direction change down to up */ +#define LL_LPTIM_ISR_DOWN LPTIM_ISR_DOWN /*!< Counter direction change up to down */ +/** + * @} + */ + +/** @defgroup LPTIM_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_LPTIM_ReadReg and LL_LPTIM_WriteReg functions + * @{ + */ +#define LL_LPTIM_IER_CMPMIE LPTIM_IER_CMPMIE /*!< Compare match Interrupt Enable */ +#define LL_LPTIM_IER_ARRMIE LPTIM_IER_ARRMIE /*!< Autoreload match Interrupt Enable */ +#define LL_LPTIM_IER_EXTTRIGIE LPTIM_IER_EXTTRIGIE /*!< External trigger valid edge Interrupt Enable */ +#define LL_LPTIM_IER_CMPOKIE LPTIM_IER_CMPOKIE /*!< Compare register update OK Interrupt Enable */ +#define LL_LPTIM_IER_ARROKIE LPTIM_IER_ARROKIE /*!< Autoreload register update OK Interrupt Enable */ +#define LL_LPTIM_IER_UPIE LPTIM_IER_UPIE /*!< Direction change to UP Interrupt Enable */ +#define LL_LPTIM_IER_DOWNIE LPTIM_IER_DOWNIE /*!< Direction change to down Interrupt Enable */ +/** + * @} + */ + +/** @defgroup LPTIM_LL_EC_OPERATING_MODE Operating Mode + * @{ + */ +#define LL_LPTIM_OPERATING_MODE_CONTINUOUS LPTIM_CR_CNTSTRT /*!__REG__, (__VALUE__)) + +/** + * @brief Read a value in LPTIM register + * @param __INSTANCE__ LPTIM Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_LPTIM_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup LPTIM_LL_Exported_Functions LPTIM Exported Functions + * @{ + */ + +/** @defgroup LPTIM_LL_EF_LPTIM_Configuration LPTIM Configuration + * @{ + */ + +/** + * @brief Enable the LPTIM instance + * @note After setting the ENABLE bit, a delay of two counter clock is needed + * before the LPTIM instance is actually enabled. + * @rmtoll CR ENABLE LL_LPTIM_Enable + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_Enable(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->CR, LPTIM_CR_ENABLE); +} + +/** + * @brief Disable the LPTIM instance + * @rmtoll CR ENABLE LL_LPTIM_Disable + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_Disable(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->CR, LPTIM_CR_ENABLE); +} + +/** + * @brief Indicates whether the LPTIM instance is enabled. + * @rmtoll CR ENABLE LL_LPTIM_IsEnabled + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabled(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->CR, LPTIM_CR_ENABLE) == (LPTIM_CR_ENABLE)); +} + +/** + * @brief Starts the LPTIM counter in the desired mode. + * @note LPTIM instance must be enabled before starting the counter. + * @note It is possible to change on the fly from One Shot mode to + * Continuous mode. + * @rmtoll CR CNTSTRT LL_LPTIM_StartCounter\n + * CR SNGSTRT LL_LPTIM_StartCounter + * @param LPTIMx Low-Power Timer instance + * @param OperatingMode This parameter can be one of the following values: + * @arg @ref LL_LPTIM_OPERATING_MODE_CONTINUOUS + * @arg @ref LL_LPTIM_OPERATING_MODE_ONESHOT + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_StartCounter(LPTIM_TypeDef *LPTIMx, uint32_t OperatingMode) +{ + MODIFY_REG(LPTIMx->CR, LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT, OperatingMode); +} + + +/** + * @brief Set the LPTIM registers update mode (enable/disable register preload) + * @note This function must be called when the LPTIM instance is disabled. + * @rmtoll CFGR PRELOAD LL_LPTIM_SetUpdateMode + * @param LPTIMx Low-Power Timer instance + * @param UpdateMode This parameter can be one of the following values: + * @arg @ref LL_LPTIM_UPDATE_MODE_IMMEDIATE + * @arg @ref LL_LPTIM_UPDATE_MODE_ENDOFPERIOD + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetUpdateMode(LPTIM_TypeDef *LPTIMx, uint32_t UpdateMode) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_PRELOAD, UpdateMode); +} + +/** + * @brief Get the LPTIM registers update mode + * @rmtoll CFGR PRELOAD LL_LPTIM_GetUpdateMode + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_UPDATE_MODE_IMMEDIATE + * @arg @ref LL_LPTIM_UPDATE_MODE_ENDOFPERIOD + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetUpdateMode(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_PRELOAD)); +} + +/** + * @brief Set the auto reload value + * @note The LPTIMx_ARR register content must only be modified when the LPTIM is enabled + * @note After a write to the LPTIMx_ARR register a new write operation to the + * same register can only be performed when the previous write operation + * is completed. Any successive write before the ARROK flag be set, will + * lead to unpredictable results. + * @note autoreload value be strictly greater than the compare value. + * @rmtoll ARR ARR LL_LPTIM_SetAutoReload + * @param LPTIMx Low-Power Timer instance + * @param AutoReload Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetAutoReload(LPTIM_TypeDef *LPTIMx, uint32_t AutoReload) +{ + MODIFY_REG(LPTIMx->ARR, LPTIM_ARR_ARR, AutoReload); +} + +/** + * @brief Get actual auto reload value + * @rmtoll ARR ARR LL_LPTIM_GetAutoReload + * @param LPTIMx Low-Power Timer instance + * @retval AutoReload Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetAutoReload(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->ARR, LPTIM_ARR_ARR)); +} + +/** + * @brief Set the compare value + * @note After a write to the LPTIMx_CMP register a new write operation to the + * same register can only be performed when the previous write operation + * is completed. Any successive write before the CMPOK flag be set, will + * lead to unpredictable results. + * @rmtoll CMP CMP LL_LPTIM_SetCompare + * @param LPTIMx Low-Power Timer instance + * @param CompareValue Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetCompare(LPTIM_TypeDef *LPTIMx, uint32_t CompareValue) +{ + MODIFY_REG(LPTIMx->CMP, LPTIM_CMP_CMP, CompareValue); +} + +/** + * @brief Get actual compare value + * @rmtoll CMP CMP LL_LPTIM_GetCompare + * @param LPTIMx Low-Power Timer instance + * @retval CompareValue Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetCompare(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CMP, LPTIM_CMP_CMP)); +} + +/** + * @brief Get actual counter value + * @note When the LPTIM instance is running with an asynchronous clock, reading + * the LPTIMx_CNT register may return unreliable values. So in this case + * it is necessary to perform two consecutive read accesses and verify + * that the two returned values are identical. + * @rmtoll CNT CNT LL_LPTIM_GetCounter + * @param LPTIMx Low-Power Timer instance + * @retval Counter value + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetCounter(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CNT, LPTIM_CNT_CNT)); +} + +/** + * @brief Set the counter mode (selection of the LPTIM counter clock source). + * @note The counter mode can be set only when the LPTIM instance is disabled. + * @rmtoll CFGR COUNTMODE LL_LPTIM_SetCounterMode + * @param LPTIMx Low-Power Timer instance + * @param CounterMode This parameter can be one of the following values: + * @arg @ref LL_LPTIM_COUNTER_MODE_INTERNAL + * @arg @ref LL_LPTIM_COUNTER_MODE_EXTERNAL + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetCounterMode(LPTIM_TypeDef *LPTIMx, uint32_t CounterMode) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_COUNTMODE, CounterMode); +} + +/** + * @brief Get the counter mode + * @rmtoll CFGR COUNTMODE LL_LPTIM_GetCounterMode + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_COUNTER_MODE_INTERNAL + * @arg @ref LL_LPTIM_COUNTER_MODE_EXTERNAL + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetCounterMode(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_COUNTMODE)); +} + +/** + * @brief Configure the LPTIM instance output (LPTIMx_OUT) + * @note This function must be called when the LPTIM instance is disabled. + * @note Regarding the LPTIM output polarity the change takes effect + * immediately, so the output default value will change immediately after + * the polarity is re-configured, even before the timer is enabled. + * @rmtoll CFGR WAVE LL_LPTIM_ConfigOutput\n + * CFGR WAVPOL LL_LPTIM_ConfigOutput + * @param LPTIMx Low-Power Timer instance + * @param Waveform This parameter can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_PWM + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_SETONCE + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_REGULAR + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_INVERSE + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ConfigOutput(LPTIM_TypeDef *LPTIMx, uint32_t Waveform, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_WAVE | LPTIM_CFGR_WAVPOL, Waveform | Polarity); +} + +/** + * @brief Set waveform shape + * @rmtoll CFGR WAVE LL_LPTIM_SetWaveform + * @param LPTIMx Low-Power Timer instance + * @param Waveform This parameter can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_PWM + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_SETONCE + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetWaveform(LPTIM_TypeDef *LPTIMx, uint32_t Waveform) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_WAVE, Waveform); +} + +/** + * @brief Get actual waveform shape + * @rmtoll CFGR WAVE LL_LPTIM_GetWaveform + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_PWM + * @arg @ref LL_LPTIM_OUTPUT_WAVEFORM_SETONCE + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetWaveform(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_WAVE)); +} + +/** + * @brief Set output polarity + * @rmtoll CFGR WAVPOL LL_LPTIM_SetPolarity + * @param LPTIMx Low-Power Timer instance + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_REGULAR + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_INVERSE + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetPolarity(LPTIM_TypeDef *LPTIMx, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_WAVPOL, Polarity); +} + +/** + * @brief Get actual output polarity + * @rmtoll CFGR WAVPOL LL_LPTIM_GetPolarity + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_REGULAR + * @arg @ref LL_LPTIM_OUTPUT_POLARITY_INVERSE + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetPolarity(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_WAVPOL)); +} + +/** + * @brief Set actual prescaler division ratio. + * @note This function must be called when the LPTIM instance is disabled. + * @note When the LPTIM is configured to be clocked by an internal clock source + * and the LPTIM counter is configured to be updated by active edges + * detected on the LPTIM external Input1, the internal clock provided to + * the LPTIM must be not be prescaled. + * @rmtoll CFGR PRESC LL_LPTIM_SetPrescaler + * @param LPTIMx Low-Power Timer instance + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_LPTIM_PRESCALER_DIV1 + * @arg @ref LL_LPTIM_PRESCALER_DIV2 + * @arg @ref LL_LPTIM_PRESCALER_DIV4 + * @arg @ref LL_LPTIM_PRESCALER_DIV8 + * @arg @ref LL_LPTIM_PRESCALER_DIV16 + * @arg @ref LL_LPTIM_PRESCALER_DIV32 + * @arg @ref LL_LPTIM_PRESCALER_DIV64 + * @arg @ref LL_LPTIM_PRESCALER_DIV128 + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetPrescaler(LPTIM_TypeDef *LPTIMx, uint32_t Prescaler) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_PRESC, Prescaler); +} + +/** + * @brief Get actual prescaler division ratio. + * @rmtoll CFGR PRESC LL_LPTIM_GetPrescaler + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_PRESCALER_DIV1 + * @arg @ref LL_LPTIM_PRESCALER_DIV2 + * @arg @ref LL_LPTIM_PRESCALER_DIV4 + * @arg @ref LL_LPTIM_PRESCALER_DIV8 + * @arg @ref LL_LPTIM_PRESCALER_DIV16 + * @arg @ref LL_LPTIM_PRESCALER_DIV32 + * @arg @ref LL_LPTIM_PRESCALER_DIV64 + * @arg @ref LL_LPTIM_PRESCALER_DIV128 + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetPrescaler(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_PRESC)); +} + + +/** + * @} + */ + +/** @defgroup LPTIM_LL_EF_Trigger_Configuration Trigger Configuration + * @{ + */ + +/** + * @brief Enable the timeout function + * @note This function must be called when the LPTIM instance is disabled. + * @note The first trigger event will start the timer, any successive trigger + * event will reset the counter and the timer will restart. + * @note The timeout value corresponds to the compare value; if no trigger + * occurs within the expected time frame, the MCU is waked-up by the + * compare match event. + * @rmtoll CFGR TIMOUT LL_LPTIM_EnableTimeout + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableTimeout(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->CFGR, LPTIM_CFGR_TIMOUT); +} + +/** + * @brief Disable the timeout function + * @note This function must be called when the LPTIM instance is disabled. + * @note A trigger event arriving when the timer is already started will be + * ignored. + * @rmtoll CFGR TIMOUT LL_LPTIM_DisableTimeout + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableTimeout(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->CFGR, LPTIM_CFGR_TIMOUT); +} + +/** + * @brief Indicate whether the timeout function is enabled. + * @rmtoll CFGR TIMOUT LL_LPTIM_IsEnabledTimeout + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledTimeout(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_TIMOUT) == (LPTIM_CFGR_TIMOUT)); +} + +/** + * @brief Start the LPTIM counter + * @note This function must be called when the LPTIM instance is disabled. + * @rmtoll CFGR TRIGEN LL_LPTIM_TrigSw + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_TrigSw(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->CFGR, LPTIM_CFGR_TRIGEN); +} + +/** + * @brief Configure the external trigger used as a trigger event for the LPTIM. + * @note This function must be called when the LPTIM instance is disabled. + * @note An internal clock source must be present when a digital filter is + * required for the trigger. + * @rmtoll CFGR TRIGSEL LL_LPTIM_ConfigTrigger\n + * CFGR TRGFLT LL_LPTIM_ConfigTrigger\n + * CFGR TRIGEN LL_LPTIM_ConfigTrigger + * @param LPTIMx Low-Power Timer instance + * @param Source This parameter can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_SOURCE_GPIO + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCALARMA + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCALARMB + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCTAMP1 + * @arg @ref LL_LPTIM_TRIG_SOURCE_TIM1_TRGO + * @arg @ref LL_LPTIM_TRIG_SOURCE_TIM5_TRGO + * @param Filter This parameter can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_FILTER_NONE + * @arg @ref LL_LPTIM_TRIG_FILTER_2 + * @arg @ref LL_LPTIM_TRIG_FILTER_4 + * @arg @ref LL_LPTIM_TRIG_FILTER_8 + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_POLARITY_RISING + * @arg @ref LL_LPTIM_TRIG_POLARITY_FALLING + * @arg @ref LL_LPTIM_TRIG_POLARITY_RISING_FALLING + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ConfigTrigger(LPTIM_TypeDef *LPTIMx, uint32_t Source, uint32_t Filter, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_TRIGSEL | LPTIM_CFGR_TRGFLT | LPTIM_CFGR_TRIGEN, Source | Filter | Polarity); +} + +/** + * @brief Get actual external trigger source. + * @rmtoll CFGR TRIGSEL LL_LPTIM_GetTriggerSource + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_SOURCE_GPIO + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCALARMA + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCALARMB + * @arg @ref LL_LPTIM_TRIG_SOURCE_RTCTAMP1 + * @arg @ref LL_LPTIM_TRIG_SOURCE_TIM1_TRGO + * @arg @ref LL_LPTIM_TRIG_SOURCE_TIM5_TRGO + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetTriggerSource(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_TRIGSEL)); +} + +/** + * @brief Get actual external trigger filter. + * @rmtoll CFGR TRGFLT LL_LPTIM_GetTriggerFilter + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_FILTER_NONE + * @arg @ref LL_LPTIM_TRIG_FILTER_2 + * @arg @ref LL_LPTIM_TRIG_FILTER_4 + * @arg @ref LL_LPTIM_TRIG_FILTER_8 + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetTriggerFilter(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_TRGFLT)); +} + +/** + * @brief Get actual external trigger polarity. + * @rmtoll CFGR TRIGEN LL_LPTIM_GetTriggerPolarity + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_TRIG_POLARITY_RISING + * @arg @ref LL_LPTIM_TRIG_POLARITY_FALLING + * @arg @ref LL_LPTIM_TRIG_POLARITY_RISING_FALLING + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetTriggerPolarity(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_TRIGEN)); +} + +/** + * @} + */ + +/** @defgroup LPTIM_LL_EF_Clock_Configuration Clock Configuration + * @{ + */ + +/** + * @brief Set the source of the clock used by the LPTIM instance. + * @note This function must be called when the LPTIM instance is disabled. + * @rmtoll CFGR CKSEL LL_LPTIM_SetClockSource + * @param LPTIMx Low-Power Timer instance + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_LPTIM_CLK_SOURCE_INTERNAL + * @arg @ref LL_LPTIM_CLK_SOURCE_EXTERNAL + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetClockSource(LPTIM_TypeDef *LPTIMx, uint32_t ClockSource) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_CKSEL, ClockSource); +} + +/** + * @brief Get actual LPTIM instance clock source. + * @rmtoll CFGR CKSEL LL_LPTIM_GetClockSource + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_CLK_SOURCE_INTERNAL + * @arg @ref LL_LPTIM_CLK_SOURCE_EXTERNAL + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetClockSource(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_CKSEL)); +} + +/** + * @brief Configure the active edge or edges used by the counter when the LPTIM is clocked by an external clock source. + * @note This function must be called when the LPTIM instance is disabled. + * @note When both external clock signal edges are considered active ones, + * the LPTIM must also be clocked by an internal clock source with a + * frequency equal to at least four times the external clock frequency. + * @note An internal clock source must be present when a digital filter is + * required for external clock. + * @rmtoll CFGR CKFLT LL_LPTIM_ConfigClock\n + * CFGR CKPOL LL_LPTIM_ConfigClock + * @param LPTIMx Low-Power Timer instance + * @param ClockFilter This parameter can be one of the following values: + * @arg @ref LL_LPTIM_CLK_FILTER_NONE + * @arg @ref LL_LPTIM_CLK_FILTER_2 + * @arg @ref LL_LPTIM_CLK_FILTER_4 + * @arg @ref LL_LPTIM_CLK_FILTER_8 + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_LPTIM_CLK_POLARITY_RISING + * @arg @ref LL_LPTIM_CLK_POLARITY_FALLING + * @arg @ref LL_LPTIM_CLK_POLARITY_RISING_FALLING + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ConfigClock(LPTIM_TypeDef *LPTIMx, uint32_t ClockFilter, uint32_t ClockPolarity) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_CKFLT | LPTIM_CFGR_CKPOL, ClockFilter | ClockPolarity); +} + +/** + * @brief Get actual clock polarity + * @rmtoll CFGR CKPOL LL_LPTIM_GetClockPolarity + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_CLK_POLARITY_RISING + * @arg @ref LL_LPTIM_CLK_POLARITY_FALLING + * @arg @ref LL_LPTIM_CLK_POLARITY_RISING_FALLING + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetClockPolarity(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_CKPOL)); +} + +/** + * @brief Get actual clock digital filter + * @rmtoll CFGR CKFLT LL_LPTIM_GetClockFilter + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_CLK_FILTER_NONE + * @arg @ref LL_LPTIM_CLK_FILTER_2 + * @arg @ref LL_LPTIM_CLK_FILTER_4 + * @arg @ref LL_LPTIM_CLK_FILTER_8 + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetClockFilter(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_CKFLT)); +} + +/** + * @} + */ + +/** @defgroup LPTIM_LL_EF_Encoder_Mode Encoder Mode + * @{ + */ + +/** + * @brief Configure the encoder mode. + * @note This function must be called when the LPTIM instance is disabled. + * @rmtoll CFGR CKPOL LL_LPTIM_SetEncoderMode + * @param LPTIMx Low-Power Timer instance + * @param EncoderMode This parameter can be one of the following values: + * @arg @ref LL_LPTIM_ENCODER_MODE_RISING + * @arg @ref LL_LPTIM_ENCODER_MODE_FALLING + * @arg @ref LL_LPTIM_ENCODER_MODE_RISING_FALLING + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_SetEncoderMode(LPTIM_TypeDef *LPTIMx, uint32_t EncoderMode) +{ + MODIFY_REG(LPTIMx->CFGR, LPTIM_CFGR_CKPOL, EncoderMode); +} + +/** + * @brief Get actual encoder mode. + * @rmtoll CFGR CKPOL LL_LPTIM_GetEncoderMode + * @param LPTIMx Low-Power Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_LPTIM_ENCODER_MODE_RISING + * @arg @ref LL_LPTIM_ENCODER_MODE_FALLING + * @arg @ref LL_LPTIM_ENCODER_MODE_RISING_FALLING + */ +__STATIC_INLINE uint32_t LL_LPTIM_GetEncoderMode(LPTIM_TypeDef *LPTIMx) +{ + return (uint32_t)(READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_CKPOL)); +} + +/** + * @brief Enable the encoder mode + * @note This function must be called when the LPTIM instance is disabled. + * @note In this mode the LPTIM instance must be clocked by an internal clock + * source. Also, the prescaler division ratio must be equal to 1. + * @note LPTIM instance must be configured in continuous mode prior enabling + * the encoder mode. + * @rmtoll CFGR ENC LL_LPTIM_EnableEncoderMode + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableEncoderMode(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->CFGR, LPTIM_CFGR_ENC); +} + +/** + * @brief Disable the encoder mode + * @note This function must be called when the LPTIM instance is disabled. + * @rmtoll CFGR ENC LL_LPTIM_DisableEncoderMode + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableEncoderMode(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->CFGR, LPTIM_CFGR_ENC); +} + +/** + * @brief Indicates whether the LPTIM operates in encoder mode. + * @rmtoll CFGR ENC LL_LPTIM_IsEnabledEncoderMode + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledEncoderMode(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->CFGR, LPTIM_CFGR_ENC) == (LPTIM_CFGR_ENC)); +} + +/** + * @} + */ + +/** @defgroup LPTIM_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Clear the compare match flag (CMPMCF) + * @rmtoll ICR CMPMCF LL_LPTIM_ClearFLAG_CMPM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFLAG_CMPM(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_CMPMCF); +} + +/** + * @brief Inform application whether a compare match interrupt has occurred. + * @rmtoll ISR CMPM LL_LPTIM_IsActiveFlag_CMPM + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_CMPM(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_CMPM) == (LPTIM_ISR_CMPM)); +} + +/** + * @brief Clear the autoreload match flag (ARRMCF) + * @rmtoll ICR ARRMCF LL_LPTIM_ClearFLAG_ARRM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFLAG_ARRM(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_ARRMCF); +} + +/** + * @brief Inform application whether a autoreload match interrupt has occured. + * @rmtoll ISR ARRM LL_LPTIM_IsActiveFlag_ARRM + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_ARRM(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_ARRM) == (LPTIM_ISR_ARRM)); +} + +/** + * @brief Clear the external trigger valid edge flag(EXTTRIGCF). + * @rmtoll ICR EXTTRIGCF LL_LPTIM_ClearFlag_EXTTRIG + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFlag_EXTTRIG(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_EXTTRIGCF); +} + +/** + * @brief Inform application whether a valid edge on the selected external trigger input has occurred. + * @rmtoll ISR EXTTRIG LL_LPTIM_IsActiveFlag_EXTTRIG + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_EXTTRIG(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_EXTTRIG) == (LPTIM_ISR_EXTTRIG)); +} + +/** + * @brief Clear the compare register update interrupt flag (CMPOKCF). + * @rmtoll ICR CMPOKCF LL_LPTIM_ClearFlag_CMPOK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFlag_CMPOK(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_CMPOKCF); +} + +/** + * @brief Informs application whether the APB bus write operation to the LPTIMx_CMP register has been successfully completed; If so, a new one can be initiated. + * @rmtoll ISR CMPOK LL_LPTIM_IsActiveFlag_CMPOK + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_CMPOK(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_CMPOK) == (LPTIM_ISR_CMPOK)); +} + +/** + * @brief Clear the autoreload register update interrupt flag (ARROKCF). + * @rmtoll ICR ARROKCF LL_LPTIM_ClearFlag_ARROK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFlag_ARROK(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_ARROKCF); +} + +/** + * @brief Informs application whether the APB bus write operation to the LPTIMx_ARR register has been successfully completed; If so, a new one can be initiated. + * @rmtoll ISR ARROK LL_LPTIM_IsActiveFlag_ARROK + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_ARROK(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_ARROK) == (LPTIM_ISR_ARROK)); +} + +/** + * @brief Clear the counter direction change to up interrupt flag (UPCF). + * @rmtoll ICR UPCF LL_LPTIM_ClearFlag_UP + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFlag_UP(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_UPCF); +} + +/** + * @brief Informs the application whether the counter direction has changed from down to up (when the LPTIM instance operates in encoder mode). + * @rmtoll ISR UP LL_LPTIM_IsActiveFlag_UP + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_UP(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_UP) == (LPTIM_ISR_UP)); +} + +/** + * @brief Clear the counter direction change to down interrupt flag (DOWNCF). + * @rmtoll ICR DOWNCF LL_LPTIM_ClearFlag_DOWN + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_ClearFlag_DOWN(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->ICR, LPTIM_ICR_DOWNCF); +} + +/** + * @brief Informs the application whether the counter direction has changed from up to down (when the LPTIM instance operates in encoder mode). + * @rmtoll ISR DOWN LL_LPTIM_IsActiveFlag_DOWN + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsActiveFlag_DOWN(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->ISR, LPTIM_ISR_DOWN) == (LPTIM_ISR_DOWN)); +} + +/** + * @} + */ + +/** @defgroup LPTIM_LL_EF_IT_Management Interrupt Management + * @{ + */ + +/** + * @brief Enable compare match interrupt (CMPMIE). + * @rmtoll IER CMPMIE LL_LPTIM_EnableIT_CMPM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_CMPM(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_CMPMIE); +} + +/** + * @brief Disable compare match interrupt (CMPMIE). + * @rmtoll IER CMPMIE LL_LPTIM_DisableIT_CMPM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_CMPM(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_CMPMIE); +} + +/** + * @brief Indicates whether the compare match interrupt (CMPMIE) is enabled. + * @rmtoll IER CMPMIE LL_LPTIM_IsEnabledIT_CMPM + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_CMPM(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_CMPMIE) == (LPTIM_IER_CMPMIE)); +} + +/** + * @brief Enable autoreload match interrupt (ARRMIE). + * @rmtoll IER ARRMIE LL_LPTIM_EnableIT_ARRM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_ARRM(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_ARRMIE); +} + +/** + * @brief Disable autoreload match interrupt (ARRMIE). + * @rmtoll IER ARRMIE LL_LPTIM_DisableIT_ARRM + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_ARRM(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_ARRMIE); +} + +/** + * @brief Indicates whether the autoreload match interrupt (ARRMIE) is enabled. + * @rmtoll IER ARRMIE LL_LPTIM_IsEnabledIT_ARRM + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_ARRM(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_ARRMIE) == (LPTIM_IER_ARRMIE)); +} + +/** + * @brief Enable external trigger valid edge interrupt (EXTTRIGIE). + * @rmtoll IER EXTTRIGIE LL_LPTIM_EnableIT_EXTTRIG + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_EXTTRIG(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_EXTTRIGIE); +} + +/** + * @brief Disable external trigger valid edge interrupt (EXTTRIGIE). + * @rmtoll IER EXTTRIGIE LL_LPTIM_DisableIT_EXTTRIG + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_EXTTRIG(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_EXTTRIGIE); +} + +/** + * @brief Indicates external trigger valid edge interrupt (EXTTRIGIE) is enabled. + * @rmtoll IER EXTTRIGIE LL_LPTIM_IsEnabledIT_EXTTRIG + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_EXTTRIG(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_EXTTRIGIE) == (LPTIM_IER_EXTTRIGIE)); +} + +/** + * @brief Enable compare register write completed interrupt (CMPOKIE). + * @rmtoll IER CMPOKIE LL_LPTIM_EnableIT_CMPOK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_CMPOK(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_CMPOKIE); +} + +/** + * @brief Disable compare register write completed interrupt (CMPOKIE). + * @rmtoll IER CMPOKIE LL_LPTIM_DisableIT_CMPOK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_CMPOK(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_CMPOKIE); +} + +/** + * @brief Indicates whether the compare register write completed interrupt (CMPOKIE) is enabled. + * @rmtoll IER CMPOKIE LL_LPTIM_IsEnabledIT_CMPOK + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_CMPOK(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_CMPOKIE) == (LPTIM_IER_CMPOKIE)); +} + +/** + * @brief Enable autoreload register write completed interrupt (ARROKIE). + * @rmtoll IER ARROKIE LL_LPTIM_EnableIT_ARROK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_ARROK(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_ARROKIE); +} + +/** + * @brief Disable autoreload register write completed interrupt (ARROKIE). + * @rmtoll IER ARROKIE LL_LPTIM_DisableIT_ARROK + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_ARROK(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_ARROKIE); +} + +/** + * @brief Indicates whether the autoreload register write completed interrupt (ARROKIE) is enabled. + * @rmtoll IER ARROKIE LL_LPTIM_IsEnabledIT_ARROK + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_ARROK(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_ARROKIE) == (LPTIM_IER_ARROKIE)); +} + +/** + * @brief Enable direction change to up interrupt (UPIE). + * @rmtoll IER UPIE LL_LPTIM_EnableIT_UP + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_UP(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_UPIE); +} + +/** + * @brief Disable direction change to up interrupt (UPIE). + * @rmtoll IER UPIE LL_LPTIM_DisableIT_UP + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_UP(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_UPIE); +} + +/** + * @brief Indicates whether the direction change to up interrupt (UPIE) is enabled. + * @rmtoll IER UPIE LL_LPTIM_IsEnabledIT_UP + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_UP(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_UPIE) == (LPTIM_IER_UPIE)); +} + +/** + * @brief Enable direction change to down interrupt (DOWNIE). + * @rmtoll IER DOWNIE LL_LPTIM_EnableIT_DOWN + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_EnableIT_DOWN(LPTIM_TypeDef *LPTIMx) +{ + SET_BIT(LPTIMx->IER, LPTIM_IER_DOWNIE); +} + +/** + * @brief Disable direction change to down interrupt (DOWNIE). + * @rmtoll IER DOWNIE LL_LPTIM_DisableIT_DOWN + * @param LPTIMx Low-Power Timer instance + * @retval None + */ +__STATIC_INLINE void LL_LPTIM_DisableIT_DOWN(LPTIM_TypeDef *LPTIMx) +{ + CLEAR_BIT(LPTIMx->IER, LPTIM_IER_DOWNIE); +} + +/** + * @brief Indicates whether the direction change to down interrupt (DOWNIE) is enabled. + * @rmtoll IER DOWNIE LL_LPTIM_IsEnabledIT_DOWN + * @param LPTIMx Low-Power Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_LPTIM_IsEnabledIT_DOWN(LPTIM_TypeDef *LPTIMx) +{ + return (READ_BIT(LPTIMx->IER, LPTIM_IER_DOWNIE) == (LPTIM_IER_DOWNIE)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup LPTIM_LL_EF_Init Initialisation and deinitialisation functions + * @{ + */ + +ErrorStatus LL_LPTIM_DeInit(LPTIM_TypeDef *LPTIMx); +void LL_LPTIM_StructInit(LL_LPTIM_InitTypeDef *LPTIM_InitStruct); +ErrorStatus LL_LPTIM_Init(LPTIM_TypeDef *LPTIMx, LL_LPTIM_InitTypeDef *LPTIM_InitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* LPTIM1 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_LPTIM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h new file mode 100644 index 0000000..ae18285 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h @@ -0,0 +1,1007 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_pwr.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of PWR LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_PWR_H +#define __STM32F4xx_LL_PWR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(PWR) + +/** @defgroup PWR_LL PWR + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_PWR_WriteReg function + * @{ + */ +#define LL_PWR_CR_CSBF PWR_CR_CSBF /*!< Clear standby flag */ +#define LL_PWR_CR_CWUF PWR_CR_CWUF /*!< Clear wakeup flag */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_PWR_ReadReg function + * @{ + */ +#define LL_PWR_CSR_WUF PWR_CSR_WUF /*!< Wakeup flag */ +#define LL_PWR_CSR_SBF PWR_CSR_SBF /*!< Standby flag */ +#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ +#define LL_PWR_CSR_VOS PWR_CSR_VOSRDY /*!< Voltage scaling select flag */ +#if defined(PWR_CSR_EWUP) +#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin */ +#elif defined(PWR_CSR_EWUP1) +#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ +#endif /* PWR_CSR_EWUP */ +#if defined(PWR_CSR_EWUP2) +#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ +#endif /* PWR_CSR_EWUP2 */ +#if defined(PWR_CSR_EWUP3) +#define LL_PWR_CSR_EWUP3 PWR_CSR_EWUP3 /*!< Enable WKUP pin 3 */ +#endif /* PWR_CSR_EWUP3 */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_REGU_VOLTAGE Regulator Voltage + * @{ + */ +#if defined(PWR_CR_VOS_0) +#define LL_PWR_REGU_VOLTAGE_SCALE3 (PWR_CR_VOS_0) +#define LL_PWR_REGU_VOLTAGE_SCALE2 (PWR_CR_VOS_1) +#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS_0 | PWR_CR_VOS_1) /* The SCALE1 is not available for STM32F401xx devices */ +#else +#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS) +#define LL_PWR_REGU_VOLTAGE_SCALE2 0x00000000U +#endif /* PWR_CR_VOS_0 */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_MODE_PWR Mode Power + * @{ + */ +#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) +#define LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (PWR_CR_MRUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in under-drive mode) when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in under-drive mode) when the CPU enters deepsleep */ +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +#if defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) +#define LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (PWR_CR_MRLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in Deep Sleep mode) when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (PWR_CR_LPDS | PWR_CR_LPLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in Deep Sleep mode) when the CPU enters deepsleep */ +#endif /* PWR_CR_MRLVDS && PWR_CR_LPLVDS && PWR_CR_FPDS */ +#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_REGU_MODE_DS_MODE Regulator Mode In Deep Sleep Mode + * @{ + */ +#define LL_PWR_REGU_DSMODE_MAIN 0x00000000U /*!< Voltage Regulator in main mode during deepsleep mode */ +#define LL_PWR_REGU_DSMODE_LOW_POWER (PWR_CR_LPDS) /*!< Voltage Regulator in low-power mode during deepsleep mode */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level + * @{ + */ +#define LL_PWR_PVDLEVEL_0 (PWR_CR_PLS_LEV0) /*!< Voltage threshold detected by PVD 2.2 V */ +#define LL_PWR_PVDLEVEL_1 (PWR_CR_PLS_LEV1) /*!< Voltage threshold detected by PVD 2.3 V */ +#define LL_PWR_PVDLEVEL_2 (PWR_CR_PLS_LEV2) /*!< Voltage threshold detected by PVD 2.4 V */ +#define LL_PWR_PVDLEVEL_3 (PWR_CR_PLS_LEV3) /*!< Voltage threshold detected by PVD 2.5 V */ +#define LL_PWR_PVDLEVEL_4 (PWR_CR_PLS_LEV4) /*!< Voltage threshold detected by PVD 2.6 V */ +#define LL_PWR_PVDLEVEL_5 (PWR_CR_PLS_LEV5) /*!< Voltage threshold detected by PVD 2.7 V */ +#define LL_PWR_PVDLEVEL_6 (PWR_CR_PLS_LEV6) /*!< Voltage threshold detected by PVD 2.8 V */ +#define LL_PWR_PVDLEVEL_7 (PWR_CR_PLS_LEV7) /*!< Voltage threshold detected by PVD 2.9 V */ +/** + * @} + */ +/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins + * @{ + */ +#if defined(PWR_CSR_EWUP) +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin : PA0 */ +#endif /* PWR_CSR_EWUP */ +#if defined(PWR_CSR_EWUP1) +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ +#endif /* PWR_CSR_EWUP1 */ +#if defined(PWR_CSR_EWUP2) +#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC0 or PC13 according to device */ +#endif /* PWR_CSR_EWUP2 */ +#if defined(PWR_CSR_EWUP3) +#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PC1 */ +#endif /* PWR_CSR_EWUP3 */ +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros + * @{ + */ + +/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in PWR register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) + +/** + * @brief Read a value in PWR register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_LL_EF_Configuration Configuration + * @{ + */ +#if defined(PWR_CR_FISSR) +/** + * @brief Enable FLASH interface STOP while system Run is ON + * @rmtoll CR FISSR LL_PWR_EnableFLASHInterfaceSTOP + * @note This mode is enabled only with STOP low power mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFLASHInterfaceSTOP(void) +{ + SET_BIT(PWR->CR, PWR_CR_FISSR); +} + +/** + * @brief Disable FLASH Interface STOP while system Run is ON + * @rmtoll CR FISSR LL_PWR_DisableFLASHInterfaceSTOP + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFLASHInterfaceSTOP(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FISSR); +} + +/** + * @brief Check if FLASH Interface STOP while system Run feature is enabled + * @rmtoll CR FISSR LL_PWR_IsEnabledFLASHInterfaceSTOP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHInterfaceSTOP(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FISSR) == (PWR_CR_FISSR)); +} +#endif /* PWR_CR_FISSR */ + +#if defined(PWR_CR_FMSSR) +/** + * @brief Enable FLASH Memory STOP while system Run is ON + * @rmtoll CR FMSSR LL_PWR_EnableFLASHMemorySTOP + * @note This mode is enabled only with STOP low power mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFLASHMemorySTOP(void) +{ + SET_BIT(PWR->CR, PWR_CR_FMSSR); +} + +/** + * @brief Disable FLASH Memory STOP while system Run is ON + * @rmtoll CR FMSSR LL_PWR_DisableFLASHMemorySTOP + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFLASHMemorySTOP(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); +} + +/** + * @brief Check if FLASH Memory STOP while system Run feature is enabled + * @rmtoll CR FMSSR LL_PWR_IsEnabledFLASHMemorySTOP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHMemorySTOP(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FMSSR) == (PWR_CR_FMSSR)); +} +#endif /* PWR_CR_FMSSR */ +#if defined(PWR_CR_UDEN) +/** + * @brief Enable Under Drive Mode + * @rmtoll CR UDEN LL_PWR_EnableUnderDriveMode + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main Regulator or the low power Regulator + * is in low voltage mode. + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage Regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableUnderDriveMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_UDEN); +} + +/** + * @brief Disable Under Drive Mode + * @rmtoll CR UDEN LL_PWR_DisableUnderDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableUnderDriveMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_UDEN); +} + +/** + * @brief Check if Under Drive Mode is enabled + * @rmtoll CR UDEN LL_PWR_IsEnabledUnderDriveMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledUnderDriveMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_UDEN) == (PWR_CR_UDEN)); +} +#endif /* PWR_CR_UDEN */ + +#if defined(PWR_CR_ODSWEN) +/** + * @brief Enable Over drive switching + * @rmtoll CR ODSWEN LL_PWR_EnableOverDriveSwitching + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableOverDriveSwitching(void) +{ + SET_BIT(PWR->CR, PWR_CR_ODSWEN); +} + +/** + * @brief Disable Over drive switching + * @rmtoll CR ODSWEN LL_PWR_DisableOverDriveSwitching + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableOverDriveSwitching(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_ODSWEN); +} + +/** + * @brief Check if Over drive switching is enabled + * @rmtoll CR ODSWEN LL_PWR_IsEnabledOverDriveSwitching + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveSwitching(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_ODSWEN) == (PWR_CR_ODSWEN)); +} +#endif /* PWR_CR_ODSWEN */ +#if defined(PWR_CR_ODEN) +/** + * @brief Enable Over drive Mode + * @rmtoll CR ODEN LL_PWR_EnableOverDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableOverDriveMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_ODEN); +} + +/** + * @brief Disable Over drive Mode + * @rmtoll CR ODEN LL_PWR_DisableOverDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableOverDriveMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_ODEN); +} + +/** + * @brief Check if Over drive switching is enabled + * @rmtoll CR ODEN LL_PWR_IsEnabledOverDriveMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_ODEN) == (PWR_CR_ODEN)); +} +#endif /* PWR_CR_ODEN */ +#if defined(PWR_CR_MRUDS) +/** + * @brief Enable Main Regulator in deepsleep under-drive Mode + * @rmtoll CR MRUDS LL_PWR_EnableMainRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableMainRegulatorDeepSleepUDMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_MRUDS); +} + +/** + * @brief Disable Main Regulator in deepsleep under-drive Mode + * @rmtoll CR MRUDS LL_PWR_DisableMainRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableMainRegulatorDeepSleepUDMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_MRUDS); +} + +/** + * @brief Check if Main Regulator in deepsleep under-drive Mode is enabled + * @rmtoll CR MRUDS LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_MRUDS) == (PWR_CR_MRUDS)); +} +#endif /* PWR_CR_MRUDS */ + +#if defined(PWR_CR_LPUDS) +/** + * @brief Enable Low Power Regulator in deepsleep under-drive Mode + * @rmtoll CR LPUDS LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_LPUDS); +} + +/** + * @brief Disable Low Power Regulator in deepsleep under-drive Mode + * @rmtoll CR LPUDS LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_LPUDS); +} + +/** + * @brief Check if Low Power Regulator in deepsleep under-drive Mode is enabled + * @rmtoll CR LPUDS LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_LPUDS) == (PWR_CR_LPUDS)); +} +#endif /* PWR_CR_LPUDS */ + +#if defined(PWR_CR_MRLVDS) +/** + * @brief Enable Main Regulator low voltage Mode + * @rmtoll CR MRLVDS LL_PWR_EnableMainRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableMainRegulatorLowVoltageMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_MRLVDS); +} + +/** + * @brief Disable Main Regulator low voltage Mode + * @rmtoll CR MRLVDS LL_PWR_DisableMainRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableMainRegulatorLowVoltageMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_MRLVDS); +} + +/** + * @brief Check if Main Regulator low voltage Mode is enabled + * @rmtoll CR MRLVDS LL_PWR_IsEnabledMainRegulatorLowVoltageMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorLowVoltageMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_MRLVDS) == (PWR_CR_MRLVDS)); +} +#endif /* PWR_CR_MRLVDS */ + +#if defined(PWR_CR_LPLVDS) +/** + * @brief Enable Low Power Regulator low voltage Mode + * @rmtoll CR LPLVDS LL_PWR_EnableLowPowerRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorLowVoltageMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_LPLVDS); +} + +/** + * @brief Disable Low Power Regulator low voltage Mode + * @rmtoll CR LPLVDS LL_PWR_DisableLowPowerRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorLowVoltageMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_LPLVDS); +} + +/** + * @brief Check if Low Power Regulator low voltage Mode is enabled + * @rmtoll CR LPLVDS LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_LPLVDS) == (PWR_CR_LPLVDS)); +} +#endif /* PWR_CR_LPLVDS */ +/** + * @brief Set the main internal Regulator output voltage + * @rmtoll CR VOS LL_PWR_SetRegulVoltageScaling + * @param VoltageScaling This parameter can be one of the following values: + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 + * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetRegulVoltageScaling(uint32_t VoltageScaling) +{ + MODIFY_REG(PWR->CR, PWR_CR_VOS, VoltageScaling); +} + +/** + * @brief Get the main internal Regulator output voltage + * @rmtoll CR VOS LL_PWR_GetRegulVoltageScaling + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 + * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices + */ +__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); +} +/** + * @brief Enable the Flash Power Down in Stop Mode + * @rmtoll CR FPDS LL_PWR_EnableFlashPowerDown + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFlashPowerDown(void) +{ + SET_BIT(PWR->CR, PWR_CR_FPDS); +} + +/** + * @brief Disable the Flash Power Down in Stop Mode + * @rmtoll CR FPDS LL_PWR_DisableFlashPowerDown + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFlashPowerDown(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FPDS); +} + +/** + * @brief Check if the Flash Power Down in Stop Mode is enabled + * @rmtoll CR FPDS LL_PWR_IsEnabledFlashPowerDown + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFlashPowerDown(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FPDS) == (PWR_CR_FPDS)); +} + +/** + * @brief Enable access to the backup domain + * @rmtoll CR DBP LL_PWR_EnableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) +{ + SET_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Disable access to the backup domain + * @rmtoll CR DBP LL_PWR_DisableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Check if the backup domain is enabled + * @rmtoll CR DBP LL_PWR_IsEnabledBkUpAccess + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); +} +/** + * @brief Enable the backup Regulator + * @rmtoll CSR BRE LL_PWR_EnableBkUpRegulator + * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. + * The LL_PWR_EnableBkUpAccess() must be called before using this API. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableBkUpRegulator(void) +{ + SET_BIT(PWR->CSR, PWR_CSR_BRE); +} + +/** + * @brief Disable the backup Regulator + * @rmtoll CSR BRE LL_PWR_DisableBkUpRegulator + * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. + * The LL_PWR_EnableBkUpAccess() must be called before using this API. + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableBkUpRegulator(void) +{ + CLEAR_BIT(PWR->CSR, PWR_CSR_BRE); +} + +/** + * @brief Check if the backup Regulator is enabled + * @rmtoll CSR BRE LL_PWR_IsEnabledBkUpRegulator + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpRegulator(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_BRE) == (PWR_CSR_BRE)); +} + +/** + * @brief Set voltage Regulator mode during deep sleep mode + * @rmtoll CR LPDS LL_PWR_SetRegulModeDS + * @param RegulMode This parameter can be one of the following values: + * @arg @ref LL_PWR_REGU_DSMODE_MAIN + * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetRegulModeDS(uint32_t RegulMode) +{ + MODIFY_REG(PWR->CR, PWR_CR_LPDS, RegulMode); +} + +/** + * @brief Get voltage Regulator mode during deep sleep mode + * @rmtoll CR LPDS LL_PWR_GetRegulModeDS + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_REGU_DSMODE_MAIN + * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER + */ +__STATIC_INLINE uint32_t LL_PWR_GetRegulModeDS(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPDS)); +} + +/** + * @brief Set Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_SetPowerMode\n + * @rmtoll CR MRUDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPUDS LL_PWR_SetPowerMode\n + * @rmtoll CR FPDS LL_PWR_SetPowerMode\n + * @rmtoll CR MRLVDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPlVDS LL_PWR_SetPowerMode\n + * @rmtoll CR FPDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPDS LL_PWR_SetPowerMode + * @param PDMode This parameter can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) + * + * (*) not available on all devices + * @arg @ref LL_PWR_MODE_STANDBY + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) +{ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS), PDMode); +#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS), PDMode); +#else + MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +} + +/** + * @brief Get Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_GetPowerMode\n + * @rmtoll CR MRUDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPUDS LL_PWR_GetPowerMode\n + * @rmtoll CR FPDS LL_PWR_GetPowerMode\n + * @rmtoll CR MRLVDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPLVDS LL_PWR_GetPowerMode\n + * @rmtoll CR FPDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPDS LL_PWR_GetPowerMode + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) + * + * (*) not available on all devices + * @arg @ref LL_PWR_MODE_STANDBY + */ +__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) +{ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS))); +#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS))); +#else + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +} + +/** + * @brief Configure the voltage threshold detected by the Power Voltage Detector + * @rmtoll CR PLS LL_PWR_SetPVDLevel + * @param PVDLevel This parameter can be one of the following values: + * @arg @ref LL_PWR_PVDLEVEL_0 + * @arg @ref LL_PWR_PVDLEVEL_1 + * @arg @ref LL_PWR_PVDLEVEL_2 + * @arg @ref LL_PWR_PVDLEVEL_3 + * @arg @ref LL_PWR_PVDLEVEL_4 + * @arg @ref LL_PWR_PVDLEVEL_5 + * @arg @ref LL_PWR_PVDLEVEL_6 + * @arg @ref LL_PWR_PVDLEVEL_7 + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPVDLevel(uint32_t PVDLevel) +{ + MODIFY_REG(PWR->CR, PWR_CR_PLS, PVDLevel); +} + +/** + * @brief Get the voltage threshold detection + * @rmtoll CR PLS LL_PWR_GetPVDLevel + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_PVDLEVEL_0 + * @arg @ref LL_PWR_PVDLEVEL_1 + * @arg @ref LL_PWR_PVDLEVEL_2 + * @arg @ref LL_PWR_PVDLEVEL_3 + * @arg @ref LL_PWR_PVDLEVEL_4 + * @arg @ref LL_PWR_PVDLEVEL_5 + * @arg @ref LL_PWR_PVDLEVEL_6 + * @arg @ref LL_PWR_PVDLEVEL_7 + */ +__STATIC_INLINE uint32_t LL_PWR_GetPVDLevel(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PLS)); +} + +/** + * @brief Enable Power Voltage Detector + * @rmtoll CR PVDE LL_PWR_EnablePVD + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnablePVD(void) +{ + SET_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief Disable Power Voltage Detector + * @rmtoll CR PVDE LL_PWR_DisablePVD + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisablePVD(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief Check if Power Voltage Detector is enabled + * @rmtoll CR PVDE LL_PWR_IsEnabledPVD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledPVD(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_PVDE) == (PWR_CR_PVDE)); +} + +/** + * @brief Enable the WakeUp PINx functionality + * @rmtoll CSR EWUP LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_EnableWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableWakeUpPin(uint32_t WakeUpPin) +{ + SET_BIT(PWR->CSR, WakeUpPin); +} + +/** + * @brief Disable the WakeUp PINx functionality + * @rmtoll CSR EWUP LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_DisableWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableWakeUpPin(uint32_t WakeUpPin) +{ + CLEAR_BIT(PWR->CSR, WakeUpPin); +} + +/** + * @brief Check if the WakeUp PINx functionality is enabled + * @rmtoll CSR EWUP LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_IsEnabledWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledWakeUpPin(uint32_t WakeUpPin) +{ + return (READ_BIT(PWR->CSR, WakeUpPin) == (WakeUpPin)); +} + + +/** + * @} + */ + +/** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Wake-up Flag + * @rmtoll CSR WUF LL_PWR_IsActiveFlag_WU + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_WU(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_WUF) == (PWR_CSR_WUF)); +} + +/** + * @brief Get Standby Flag + * @rmtoll CSR SBF LL_PWR_IsActiveFlag_SB + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_SB(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_SBF) == (PWR_CSR_SBF)); +} + +/** + * @brief Get Backup Regulator ready Flag + * @rmtoll CSR BRR LL_PWR_IsActiveFlag_BRR + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_BRR(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_BRR) == (PWR_CSR_BRR)); +} +/** + * @brief Indicate whether VDD voltage is below the selected PVD threshold + * @rmtoll CSR PVDO LL_PWR_IsActiveFlag_PVDO + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_PVDO(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_PVDO) == (PWR_CSR_PVDO)); +} + +/** + * @brief Indicate whether the Regulator is ready in the selected voltage range or if its output voltage is still changing to the required voltage level + * @rmtoll CSR VOS LL_PWR_IsActiveFlag_VOS + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VOS(void) +{ + return (READ_BIT(PWR->CSR, LL_PWR_CSR_VOS) == (LL_PWR_CSR_VOS)); +} +#if defined(PWR_CR_ODEN) +/** + * @brief Indicate whether the Over-Drive mode is ready or not + * @rmtoll CSR ODRDY LL_PWR_IsActiveFlag_OD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_OD(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_ODRDY) == (PWR_CSR_ODRDY)); +} +#endif /* PWR_CR_ODEN */ + +#if defined(PWR_CR_ODSWEN) +/** + * @brief Indicate whether the Over-Drive mode switching is ready or not + * @rmtoll CSR ODSWRDY LL_PWR_IsActiveFlag_ODSW + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_ODSW(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_ODSWRDY) == (PWR_CSR_ODSWRDY)); +} +#endif /* PWR_CR_ODSWEN */ + +#if defined(PWR_CR_UDEN) +/** + * @brief Indicate whether the Under-Drive mode is ready or not + * @rmtoll CSR UDRDY LL_PWR_IsActiveFlag_UD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_UD(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_UDRDY) == (PWR_CSR_UDRDY)); +} +#endif /* PWR_CR_UDEN */ +/** + * @brief Clear Standby Flag + * @rmtoll CR CSBF LL_PWR_ClearFlag_SB + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) +{ + SET_BIT(PWR->CR, PWR_CR_CSBF); +} + +/** + * @brief Clear Wake-up Flags + * @rmtoll CR CWUF LL_PWR_ClearFlag_WU + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) +{ + SET_BIT(PWR->CR, PWR_CR_CWUF); +} +#if defined(PWR_CSR_UDRDY) +/** + * @brief Clear Under-Drive ready Flag + * @rmtoll CSR UDRDY LL_PWR_ClearFlag_UD + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_UD(void) +{ + WRITE_REG(PWR->CSR, PWR_CSR_UDRDY); +} +#endif /* PWR_CSR_UDRDY */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup PWR_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_PWR_DeInit(void); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(PWR) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_PWR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h new file mode 100644 index 0000000..63b238f --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h @@ -0,0 +1,7104 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rcc.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of RCC LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_RCC_H +#define __STM32F4xx_LL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup RCC_LL RCC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_LL_Private_Variables RCC Private Variables + * @{ + */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Private_Macros RCC Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Exported_Types RCC Exported Types + * @{ + */ + +/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure + * @{ + */ + +/** + * @brief RCC Clocks Frequency Structure + */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ + uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ + uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ + uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ +} LL_RCC_ClocksTypeDef; + +/** + * @} + */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation + * @brief Defines used to adapt values of different oscillators + * @note These values could be modified in the user environment according to + * HW set-up. + * @{ + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ +#endif /* HSI_VALUE */ + +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSI_VALUE) +#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ +#endif /* LSI_VALUE */ + +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ +#endif /* EXTERNAL_CLOCK_VALUE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_RCC_WriteReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ +#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ +#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ +#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ +#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_RCC_ReadReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ +#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ +#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ +#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ +#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ +#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ +#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ +#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ +#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ +#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ +#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ +#if defined(RCC_CSR_BORRSTF) +#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ +#endif /* RCC_CSR_BORRSTF */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions + * @{ + */ +#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ +#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ +#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ +#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ +#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ +#if defined(RCC_CFGR_SW_PLLR) +#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ +#endif /* RCC_CFGR_SW_PLLR */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler + * @{ + */ +#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) + * @{ + */ +#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) + * @{ + */ +#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection + * @{ + */ +#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ +#if defined(RCC_CFGR_MCO2) +#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ +#endif /* RCC_CFGR_MCO2 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler + * @{ + */ +#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ +#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ +#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ +#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ +#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ +#if defined(RCC_CFGR_MCO2PRE) +#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ +#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ +#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ +#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ +#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ +#endif /* RCC_CFGR_MCO2PRE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock + * @{ + */ +#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ +#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ +#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ +#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ +#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ +#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ +#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ +#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ +#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ +#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ +#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ +#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ +#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ +#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ +#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ +#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ +#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ +#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ +#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ +#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ +#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ +#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ +#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ +#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ +#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ +#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ +#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ +#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ +#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ +#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ +#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency + * @{ + */ +#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ +#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ +#else +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ +#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ +#else +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ +#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection + * @{ + */ +#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ +#else +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ +#endif /* RCC_DCKCFGR_SDIOSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ +#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ +#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ +#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection + * @{ + */ +#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection + * @{ + */ +#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ +#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ +#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(SDIO) +/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ +#elif defined(RCC_DCKCFGR2_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ +#else +#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ +#endif +/** + * @} + */ +#endif /* SDIO */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ +#else +#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ +#else +#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(LTDC) +/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source + * @{ + */ +#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ +/** + * @} + */ +#endif /* LTDC */ + + +/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection + * @{ + */ +#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection + * @{ + */ +#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ +#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source + * @{ + */ +#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) +#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor + * @{ + */ +#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ +#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ +#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ +#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ +#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ +#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ +#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ +#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ +#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ +#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ +#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ +#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ +#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ +#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ +#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ +#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ +#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ +#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ +#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ +#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ +#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ +#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ +#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ +#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ +#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ +#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ +#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ +#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ +#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ +#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ +#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ +#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ +#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ +#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ +#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ +#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ +#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ +#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ +#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ +#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ +#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ +#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ +#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ +#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ +#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ +#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ +#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ +#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ +#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ +#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ +#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ +#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ +#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ +#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ +#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ +#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ +#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ +#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ +#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ +#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ +#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ +#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ +/** + * @} + */ + +#if defined(RCC_PLLCFGR_PLLR) +/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) + * @{ + */ +#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ +#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ +#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ +#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ +#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ +#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ +/** + * @} + */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) + * @{ + */ +#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ +#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ +#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ +#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ +#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ +#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ +#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ +#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ +#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ +#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ +#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ +#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ +#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ +#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ +#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ +#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ +#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ +#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ +#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ +#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ +#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ +#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ +#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ +#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ +#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ +#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ +#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ +#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ +#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ +#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ +#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) + * @{ + */ +#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ +#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ +#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ +#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) + * @{ + */ +#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ +#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ +#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ +#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ +#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ +#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ +#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ +#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ +#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ +#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ +#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ +#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ +#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ +#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection + * @{ + */ +#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ +#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) + * @{ + */ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) +#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#else +#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) + * @{ + */ +#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ +#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ +#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ +#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ +#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ +#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ +#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ +#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ +#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ +#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ +#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ +#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ +#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ +#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) + * @{ + */ +#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ +#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ +#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ +#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ +#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ +#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ +#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ +#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ +#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ +#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ +#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ +#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ +#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ +#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ +#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ +#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ +#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ +#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ +#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ +#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ +#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ +#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ +#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ +#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ +#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ +#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ +#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ +#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ +#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ +#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ +#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ +#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) + * @{ + */ +#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ +#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ +#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ +#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ +#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ +#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ +#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ +#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ +#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ +#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ +#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ +#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ +#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ +#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ +#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ +#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ +#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ +#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ +#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ +#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ +#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ +#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ +#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ +#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ +#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ +#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ +#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ +#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ +#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ +#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ +#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) + * @{ + */ +#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ +#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ +#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ +#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ +#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ +#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) + * @{ + */ +#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ +#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ +#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ +#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) + * @{ + */ +#if defined(RCC_PLLSAICFGR_PLLSAIM) +#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#else +#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) + * @{ + */ +#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ +#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ +#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ +#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ +#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ +#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ +#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ +#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ +#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ +#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ +#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ +#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ +#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ +#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVQ) +/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) + * @{ + */ +#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ +#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ +#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ +#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ +#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ +#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ +#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ +#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ +#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ +#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ +#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ +#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ +#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ +#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ +#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ +#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ +#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ +#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ +#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ +#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ +#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ +#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ +#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ +#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ +#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ +#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ +#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ +#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ +#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ +#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ +#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ +#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) + * @{ + */ +#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ +#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ +#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ +#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ +#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ +#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) + * @{ + */ +#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ +#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ +#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ +#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) + * @{ + */ +#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ +#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ +#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ +#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RCC register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RCC register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) +/** + * @} + */ + +/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies + * @{ + */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) + +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +/** + * @brief Helper macro to calculate the PLLRCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) + +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) + +#if defined(DSI) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on DSI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on I2S + * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SAI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param __PLLDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLL clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) +#else +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_DCKCFGR_PLLDIVR */ +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param __PLLSAIDIVQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 50 and 432 + * @param __PLLSAIP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param __PLLSAIDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) +#endif /* LTDC */ +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLLI2S clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) +#else +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) + +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) + +#endif /* SPDIFRX */ + +/** + * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) + +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_PLLI2S_SUPPORT */ + +/** + * @brief Helper macro to calculate the HCLK frequency + * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) + * @param __AHBPRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval HCLK clock frequency (in Hz) + */ +#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) + +/** + * @brief Helper macro to calculate the PCLK1 frequency (ABP1) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB1PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval PCLK1 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) + +/** + * @brief Helper macro to calculate the PCLK2 frequency (ABP2) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB2PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval PCLK2 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_LL_EF_HSE HSE + * @{ + */ + +/** + * @brief Enable the Clock Security System. + * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) +{ + SET_BIT(RCC->CR, RCC_CR_CSSON); +} + +/** + * @brief Enable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Disable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Enable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Disable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Check if HSE oscillator Ready + * @rmtoll CR HSERDY LL_RCC_HSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_HSI HSI + * @{ + */ + +/** + * @brief Enable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Disable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Check if HSI clock is ready + * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); +} + +/** + * @brief Get HSI Calibration value + * @note When HSITRIM is written, HSICAL is updated with the sum of + * HSITRIM and the factory trim value + * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration + * @retval Between Min_Data = 0x00 and Max_Data = 0xFF + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); +} + +/** + * @brief Set HSI Calibration trimming + * @note user-programmable trimming value that is added to the HSICAL + * @note Default value is 16, which, when added to the HSICAL value, + * should trim the HSI to 16 MHz +/- 1 % + * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming + * @param Value Between Min_Data = 0 and Max_Data = 31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) +{ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); +} + +/** + * @brief Get HSI Calibration trimming + * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming + * @retval Between Min_Data = 0 and Max_Data = 31 + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSE LSE + * @{ + */ + +/** + * @brief Enable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Enable(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Disable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Disable(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Enable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Disable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Check if LSE oscillator Ready + * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); +} + +#if defined(RCC_BDCR_LSEMOD) +/** + * @brief Enable LSE high drive mode. + * @note LSE high drive mode can be enabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} + +/** + * @brief Disable LSE high drive mode. + * @note LSE high drive mode can be disabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} +#endif /* RCC_BDCR_LSEMOD */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSI LSI + * @{ + */ + +/** + * @brief Enable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Enable(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Disable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Disable(void) +{ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Check if LSI is Ready + * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_System System + * @{ + */ + +/** + * @brief Configure the system clock source + * @rmtoll CFGR SW LL_RCC_SetSysClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); +} + +/** + * @brief Get the system clock source + * @rmtoll CFGR SWS LL_RCC_GetSysClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); +} + +/** + * @brief Set AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); +} + +/** + * @brief Set APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); +} + +/** + * @brief Set APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); +} + +/** + * @brief Get AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); +} + +/** + * @brief Get APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); +} + +/** + * @brief Get APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_MCO MCO + * @{ + */ + +#if defined(RCC_CFGR_MCO1EN) +/** + * @brief Enable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} + +/** + * @brief Disable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} +#endif /* RCC_CFGR_MCO1EN */ + +#if defined(RCC_CFGR_MCO2EN) +/** + * @brief Enable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} + +/** + * @brief Disable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} +#endif /* RCC_CFGR_MCO2EN */ + +/** + * @brief Configure MCOx + * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n + * CFGR MCO1PRE LL_RCC_ConfigMCO\n + * CFGR MCO2 LL_RCC_ConfigMCO\n + * CFGR MCO2PRE LL_RCC_ConfigMCO + * @param MCOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1SOURCE_HSI + * @arg @ref LL_RCC_MCO1SOURCE_LSE + * @arg @ref LL_RCC_MCO1SOURCE_HSE + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK + * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK + * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S + * @arg @ref LL_RCC_MCO2SOURCE_HSE + * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK + * @param MCOxPrescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1_DIV_1 + * @arg @ref LL_RCC_MCO1_DIV_2 + * @arg @ref LL_RCC_MCO1_DIV_3 + * @arg @ref LL_RCC_MCO1_DIV_4 + * @arg @ref LL_RCC_MCO1_DIV_5 + * @arg @ref LL_RCC_MCO2_DIV_1 + * @arg @ref LL_RCC_MCO2_DIV_2 + * @arg @ref LL_RCC_MCO2_DIV_3 + * @arg @ref LL_RCC_MCO2_DIV_4 + * @arg @ref LL_RCC_MCO2_DIV_5 + * @retval None + */ +__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) +{ + MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source + * @{ + */ +#if defined(FMPI2C1) +/** + * @brief Configure FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource + * @param FMPI2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Configure LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource + * @param LPTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Configure SAIx clock source + * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource + * @param SAIxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) +{ + MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Configure SDIO clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource + * @param SDIOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Configure 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource + * @param CK48MxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Configure RNG clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource + * @param RNGxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Configure USB clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Configure CEC clock source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); +} +#endif /* CEC */ + +/** + * @brief Configure I2S clock source + * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) +{ +#if defined(RCC_CFGR_I2SSRC) + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); +#else + MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DSI) +/** + * @brief Configure DSI clock source + * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); +} +#endif /* DSI */ + +#if defined(DFSDM1_Channel0) +/** + * @brief Configure DFSDM Audio clock source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); +} + +/** + * @brief Configure DFSDM Kernel clock source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Configure SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource + * @param SPDIFRXxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); +} +#endif /* SPDIFRX */ + +#if defined(FMPI2C1) +/** + * @brief Get FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource + * @param FMPI2Cx This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + */ +__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Get LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource + * @param LPTIMx This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Get SAIx clock source + * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource + * @param SAIx This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Get SDIOx clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource + * @param SDIOx This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + */ +__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Get 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource + * @param CK48Mx This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Get RNGx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource + * @param RNGx This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Get USBx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource + * @param USBx This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Get CEC Clock Source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource + * @param CECx This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); +} +#endif /* CEC */ + +/** + * @brief Get I2S Clock Source + * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource + * @param I2Sx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE + * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) +{ +#if defined(RCC_CFGR_I2SSRC) + return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DFSDM1_Channel0) +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); +} + +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Get SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource + * @param SPDIFRXx This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); +} +#endif /* SPDIFRX */ + +#if defined(DSI) +/** + * @brief Get DSI Clock Source + * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource + * @param DSIx This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + */ +__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); +} +#endif /* DSI */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_RTC RTC + * @{ + */ + +/** + * @brief Set RTC Clock Source + * @note Once the RTC clock source has been selected, it cannot be changed anymore unless + * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is + * set). The BDRST bit can be used to reset them. + * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); +} + +/** + * @brief Get RTC Clock Source + * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) +{ + return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); +} + +/** + * @brief Enable RTC + * @rmtoll BDCR RTCEN LL_RCC_EnableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableRTC(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Disable RTC + * @rmtoll BDCR RTCEN LL_RCC_DisableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableRTC(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Check if RTC has been enabled or not + * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); +} + +/** + * @brief Force the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Release the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Set HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); +} + +/** + * @brief Get HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); +} + +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM + * @{ + */ + +/** + * @brief Set Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); +} + +/** + * @brief Get Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + */ +__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); +} + +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EF_PLL PLL + * @{ + */ + +/** + * @brief Enable PLL + * @rmtoll CR PLLON LL_RCC_PLL_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Disable PLL + * @note Cannot be disabled if the PLL clock is used as the system clock + * @rmtoll CR PLLON LL_RCC_PLL_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Check if PLL Ready + * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); +} + +/** + * @brief Configure PLL used for SYSCLK Domain + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLL is disabled + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLP_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @arg @ref LL_RCC_PLLR_DIV_2 (*) + * @arg @ref LL_RCC_PLLR_DIV_3 (*) + * @arg @ref LL_RCC_PLLR_DIV_4 (*) + * @arg @ref LL_RCC_PLLR_DIV_5 (*) + * @arg @ref LL_RCC_PLLR_DIV_6 (*) + * @arg @ref LL_RCC_PLLR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); +#if defined(RCC_PLLR_SYSCLK_SUPPORT) + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +} + +/** + * @brief Configure PLL used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLL is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); +} + +#if defined(DSI) +/** + * @brief Configure PLL used for DSI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for DSI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Configure PLL used for I2S clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLL used for SPDIFRX clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Configure PLL used for SAI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n + * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, uint32_t PLLDIVR) +#else +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +#endif /* RCC_DCKCFGR_PLLDIVR */ +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +#if defined(RCC_DCKCFGR_PLLDIVR) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); +#endif /* RCC_DCKCFGR_PLLDIVR */ +} +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +/** + * @brief Get Main PLL multiplication factor for VCO + * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); +} + +/** + * @brief Get Main PLL division factor for PLLP + * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); +} + +/** + * @brief Get Main PLL division factor for PLLQ + * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) + * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); +} + +#if defined(RCC_PLLCFGR_PLLR) +/** + * @brief Get Main PLL division factor for PLLR + * @note used for PLLCLK (system clock) + * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); +} +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** + * @brief Get Main PLL division factor for PLLDIVR + * @note used for PLLSAICLK (SAI1 and SAI2 clock) + * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 + * @arg @ref LL_RCC_PLLDIVR_DIV_2 + * @arg @ref LL_RCC_PLLDIVR_DIV_3 + * @arg @ref LL_RCC_PLLDIVR_DIV_4 + * @arg @ref LL_RCC_PLLDIVR_DIV_5 + * @arg @ref LL_RCC_PLLDIVR_DIV_6 + * @arg @ref LL_RCC_PLLDIVR_DIV_7 + * @arg @ref LL_RCC_PLLDIVR_DIV_8 + * @arg @ref LL_RCC_PLLDIVR_DIV_9 + * @arg @ref LL_RCC_PLLDIVR_DIV_10 + * @arg @ref LL_RCC_PLLDIVR_DIV_11 + * @arg @ref LL_RCC_PLLDIVR_DIV_12 + * @arg @ref LL_RCC_PLLDIVR_DIV_13 + * @arg @ref LL_RCC_PLLDIVR_DIV_14 + * @arg @ref LL_RCC_PLLDIVR_DIV_15 + * @arg @ref LL_RCC_PLLDIVR_DIV_16 + * @arg @ref LL_RCC_PLLDIVR_DIV_17 + * @arg @ref LL_RCC_PLLDIVR_DIV_18 + * @arg @ref LL_RCC_PLLDIVR_DIV_19 + * @arg @ref LL_RCC_PLLDIVR_DIV_20 + * @arg @ref LL_RCC_PLLDIVR_DIV_21 + * @arg @ref LL_RCC_PLLDIVR_DIV_22 + * @arg @ref LL_RCC_PLLDIVR_DIV_23 + * @arg @ref LL_RCC_PLLDIVR_DIV_24 + * @arg @ref LL_RCC_PLLDIVR_DIV_25 + * @arg @ref LL_RCC_PLLDIVR_DIV_26 + * @arg @ref LL_RCC_PLLDIVR_DIV_27 + * @arg @ref LL_RCC_PLLDIVR_DIV_28 + * @arg @ref LL_RCC_PLLDIVR_DIV_29 + * @arg @ref LL_RCC_PLLDIVR_DIV_30 + * @arg @ref LL_RCC_PLLDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); +} +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +} + +/** + * @brief Get Division factor for the main PLL and other PLL + * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +} + +/** + * @brief Configure Spread Spectrum used for PLL + * @note These bits must be written before enabling PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum + * @param Mod Between Min_Data=0 and Max_Data=8191 + * @param Inc Between Min_Data=0 and Max_Data=32767 + * @param Sel This parameter can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) +{ + MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); +} + +/** + * @brief Get Spread Spectrum Modulation Period for PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation + * @retval Between Min_Data=0 and Max_Data=8191 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); +} + +/** + * @brief Get Spread Spectrum Incrementation Step for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation + * @retval Between Min_Data=0 and Max_Data=32767 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); +} + +/** + * @brief Get Spread Spectrum Selection for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); +} + +/** + * @brief Enable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) +{ + SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @brief Disable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) +{ + CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EF_PLLI2S PLLI2S + * @{ + */ + +/** + * @brief Enable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Disable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Check if PLLI2S Ready + * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); +} + +#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) +/** + * @brief Configure PLLI2S used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param PLLDIVQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, uint32_t PLLDIVQ_R) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); +#else + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Configure PLLI2S used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLI2S is disabled + * @note This can be selected for RNG, USB, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLLI2S used for SPDIFRX domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLI2S is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); +} +#endif /* SPDIFRX */ + +/** + * @brief Configure PLLI2S used for I2S1 domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); +} + +/** + * @brief Get I2SPLL multiplication factor for VCO + * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** + * @brief Get I2SPLL division factor for PLLI2SQ + * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +/** + * @brief Get I2SPLL division factor for PLLI2SR + * @note used for PLLI2SCLK (I2S clock) + * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** + * @brief Get I2SPLL division factor for PLLI2SP + * @note used for PLLSPDIFRXCLK (SPDIFRX clock) + * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVR + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** + * @brief Get division factor for PLLI2S input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + register uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); + register uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); + register uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; + return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +} + +/** + * @} + */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EF_PLLSAI PLLSAI + * @{ + */ + +/** + * @brief Enable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Disable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Check if PLLSAI Ready + * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); +} + +/** + * @brief Configure PLLSAI used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLSAI is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n + * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param PLLDIVQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, uint32_t PLLDIVQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Configure PLLSAI used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLSAI is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Configure PLLSAI used for LTDC domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLSAI is disabled + * @note This can be selected for LTDC + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, uint32_t PLLDIVR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); +} +#endif /* LTDC */ + +/** + * @brief Get division factor for PLLSAI input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) +{ +#if defined(RCC_PLLSAICFGR_PLLSAIM) + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +} + +/** + * @brief Get SAIPLL multiplication factor for VCO + * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN + * @retval Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); +} + +/** + * @brief Get SAIPLL division factor for PLLSAIQ + * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** + * @brief Get SAIPLL division factor for PLLSAIR + * @note used for PLLSAICLK (SAI clock) + * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Get SAIPLL division factor for PLLSAIP + * @note used for PLL48MCLK (48M domain clock) + * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +/** + * @brief Get SAIPLL division factor for PLLSAIDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); +} + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** + * @brief Get SAIPLL division factor for PLLSAIDIVR + * @note used for LTDC domain clock + * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); +} +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +/** + * @} + */ +#endif /* RCC_PLLSAI_SUPPORT */ + +/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Clear LSI ready interrupt flag + * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); +} + +/** + * @brief Clear LSE ready interrupt flag + * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); +} + +/** + * @brief Clear HSI ready interrupt flag + * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); +} + +/** + * @brief Clear HSE ready interrupt flag + * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); +} + +/** + * @brief Clear PLL ready interrupt flag + * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Clear PLLI2S ready interrupt flag + * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Clear PLLSAI ready interrupt flag + * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Clear Clock security system interrupt flag + * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_CSSC); +} + +/** + * @brief Check if LSI ready interrupt occurred or not + * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); +} + +/** + * @brief Check if LSE ready interrupt occurred or not + * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); +} + +/** + * @brief Check if HSI ready interrupt occurred or not + * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); +} + +/** + * @brief Check if HSE ready interrupt occurred or not + * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); +} + +/** + * @brief Check if PLL ready interrupt occurred or not + * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Check if PLLI2S ready interrupt occurred or not + * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Check if PLLSAI ready interrupt occurred or not + * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Check if Clock security system interrupt occurred or not + * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); +} + +/** + * @brief Check if RCC flag Independent Watchdog reset is set or not. + * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); +} + +/** + * @brief Check if RCC flag Low Power reset is set or not. + * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); +} + +/** + * @brief Check if RCC flag Pin reset is set or not. + * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); +} + +/** + * @brief Check if RCC flag POR/PDR reset is set or not. + * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); +} + +/** + * @brief Check if RCC flag Software reset is set or not. + * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); +} + +/** + * @brief Check if RCC flag Window Watchdog reset is set or not. + * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); +} + +#if defined(RCC_CSR_BORRSTF) +/** + * @brief Check if RCC flag BOR reset is set or not. + * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); +} +#endif /* RCC_CSR_BORRSTF */ + +/** + * @brief Set RMVF bit to clear the reset flags. + * @rmtoll CSR RMVF LL_RCC_ClearResetFlags + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearResetFlags(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_IT_Management IT Management + * @{ + */ + +/** + * @brief Enable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Enable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Enable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Enable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Enable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Disable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Disable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Disable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Disable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Disable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Disable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Disable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Checks if LSI ready interrupt source is enabled or disabled. + * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); +} + +/** + * @brief Checks if LSE ready interrupt source is enabled or disabled. + * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); +} + +/** + * @brief Checks if HSI ready interrupt source is enabled or disabled. + * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); +} + +/** + * @brief Checks if HSE ready interrupt source is enabled or disabled. + * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); +} + +/** + * @brief Checks if PLL ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_RCC_DeInit(void); +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions + * @{ + */ +void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); +#if defined(FMPI2C1) +uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); +#endif /* FMPI2C1 */ +#if defined(LPTIM1) +uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); +#endif /* LPTIM1 */ +#if defined(SAI1) +uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); +#endif /* SAI1 */ +#if defined(SDIO) +uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); +#endif /* SDIO */ +#if defined(RNG) +uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); +#endif /* RNG */ +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); +#endif /* USB_OTG_FS || USB_OTG_HS */ +#if defined(DFSDM1_Channel0) +uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); +uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); +#endif /* DFSDM1_Channel0 */ +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); +#if defined(CEC) +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); +#endif /* CEC */ +#if defined(LTDC) +uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); +#endif /* LTDC */ +#if defined(SPDIFRX) +uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); +#endif /* SPDIFRX */ +#if defined(DSI) +uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); +#endif /* DSI */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_RCC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rng.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rng.h new file mode 100644 index 0000000..5431bf4 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rng.h @@ -0,0 +1,355 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rng.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of RNG LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_RNG_H +#define __STM32F4xx_LL_RNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RNG) + +/** @defgroup RNG_LL RNG + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RNG_LL_Exported_Constants RNG Exported Constants + * @{ + */ + +/** @defgroup RNG_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_RNG_ReadReg function + * @{ + */ +#define LL_RNG_SR_DRDY RNG_SR_DRDY /*!< Register contains valid random data */ +#define LL_RNG_SR_CECS RNG_SR_CECS /*!< Clock error current status */ +#define LL_RNG_SR_SECS RNG_SR_SECS /*!< Seed error current status */ +#define LL_RNG_SR_CEIS RNG_SR_CEIS /*!< Clock error interrupt status */ +#define LL_RNG_SR_SEIS RNG_SR_SEIS /*!< Seed error interrupt status */ +/** + * @} + */ + +/** @defgroup RNG_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_RNG_ReadReg and LL_RNG_WriteReg macros + * @{ + */ +#define LL_RNG_CR_IE RNG_CR_IE /*!< RNG Interrupt enable */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RNG_LL_Exported_Macros RNG Exported Macros + * @{ + */ + +/** @defgroup RNG_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RNG register + * @param __INSTANCE__ RNG Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RNG_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RNG register + * @param __INSTANCE__ RNG Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RNG_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RNG_LL_Exported_Functions RNG Exported Functions + * @{ + */ +/** @defgroup RNG_LL_EF_Configuration RNG Configuration functions + * @{ + */ + +/** + * @brief Enable Random Number Generation + * @rmtoll CR RNGEN LL_RNG_Enable + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_Enable(RNG_TypeDef *RNGx) +{ + SET_BIT(RNGx->CR, RNG_CR_RNGEN); +} + +/** + * @brief Disable Random Number Generation + * @rmtoll CR RNGEN LL_RNG_Disable + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_Disable(RNG_TypeDef *RNGx) +{ + CLEAR_BIT(RNGx->CR, RNG_CR_RNGEN); +} + +/** + * @brief Check if Random Number Generator is enabled + * @rmtoll CR RNGEN LL_RNG_IsEnabled + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsEnabled(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->CR, RNG_CR_RNGEN) == (RNG_CR_RNGEN)); +} + +/** + * @} + */ + +/** @defgroup RNG_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Indicate if the RNG Data ready Flag is set or not + * @rmtoll SR DRDY LL_RNG_IsActiveFlag_DRDY + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsActiveFlag_DRDY(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->SR, RNG_SR_DRDY) == (RNG_SR_DRDY)); +} + +/** + * @brief Indicate if the Clock Error Current Status Flag is set or not + * @rmtoll SR CECS LL_RNG_IsActiveFlag_CECS + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsActiveFlag_CECS(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->SR, RNG_SR_CECS) == (RNG_SR_CECS)); +} + +/** + * @brief Indicate if the Seed Error Current Status Flag is set or not + * @rmtoll SR SECS LL_RNG_IsActiveFlag_SECS + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsActiveFlag_SECS(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->SR, RNG_SR_SECS) == (RNG_SR_SECS)); +} + +/** + * @brief Indicate if the Clock Error Interrupt Status Flag is set or not + * @rmtoll SR CEIS LL_RNG_IsActiveFlag_CEIS + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsActiveFlag_CEIS(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->SR, RNG_SR_CEIS) == (RNG_SR_CEIS)); +} + +/** + * @brief Indicate if the Seed Error Interrupt Status Flag is set or not + * @rmtoll SR SEIS LL_RNG_IsActiveFlag_SEIS + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsActiveFlag_SEIS(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->SR, RNG_SR_SEIS) == (RNG_SR_SEIS)); +} + +/** + * @brief Clear Clock Error interrupt Status (CEIS) Flag + * @rmtoll SR CEIS LL_RNG_ClearFlag_CEIS + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_ClearFlag_CEIS(RNG_TypeDef *RNGx) +{ + WRITE_REG(RNGx->SR, ~RNG_SR_CEIS); +} + +/** + * @brief Clear Seed Error interrupt Status (SEIS) Flag + * @rmtoll SR SEIS LL_RNG_ClearFlag_SEIS + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_ClearFlag_SEIS(RNG_TypeDef *RNGx) +{ + WRITE_REG(RNGx->SR, ~RNG_SR_SEIS); +} + +/** + * @} + */ + +/** @defgroup RNG_LL_EF_IT_Management IT Management + * @{ + */ + +/** + * @brief Enable Random Number Generator Interrupt + * (applies for either Seed error, Clock Error or Data ready interrupts) + * @rmtoll CR IE LL_RNG_EnableIT + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_EnableIT(RNG_TypeDef *RNGx) +{ + SET_BIT(RNGx->CR, RNG_CR_IE); +} + +/** + * @brief Disable Random Number Generator Interrupt + * (applies for either Seed error, Clock Error or Data ready interrupts) + * @rmtoll CR IE LL_RNG_DisableIT + * @param RNGx RNG Instance + * @retval None + */ +__STATIC_INLINE void LL_RNG_DisableIT(RNG_TypeDef *RNGx) +{ + CLEAR_BIT(RNGx->CR, RNG_CR_IE); +} + +/** + * @brief Check if Random Number Generator Interrupt is enabled + * (applies for either Seed error, Clock Error or Data ready interrupts) + * @rmtoll CR IE LL_RNG_IsEnabledIT + * @param RNGx RNG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RNG_IsEnabledIT(RNG_TypeDef *RNGx) +{ + return (READ_BIT(RNGx->CR, RNG_CR_IE) == (RNG_CR_IE)); +} + +/** + * @} + */ + +/** @defgroup RNG_LL_EF_Data_Management Data Management + * @{ + */ + +/** + * @brief Return32-bit Random Number value + * @rmtoll DR RNDATA LL_RNG_ReadRandData32 + * @param RNGx RNG Instance + * @retval Generated 32-bit random value + */ +__STATIC_INLINE uint32_t LL_RNG_ReadRandData32(RNG_TypeDef *RNGx) +{ + return (uint32_t)(READ_REG(RNGx->DR)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RNG_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_RNG_DeInit(RNG_TypeDef *RNGx); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RNG) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_RNG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rtc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rtc.h new file mode 100644 index 0000000..50a1015 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rtc.h @@ -0,0 +1,3850 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rtc.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of RTC LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_RTC_H +#define __STM32F4xx_LL_RTC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RTC) + +/** @defgroup RTC_LL RTC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RTC_LL_Private_Constants RTC Private Constants + * @{ + */ +/* Masks Definition */ +#define RTC_INIT_MASK 0xFFFFFFFFU +#define RTC_RSF_MASK 0xFFFFFF5FU + +/* Write protection defines */ +#define RTC_WRITE_PROTECTION_DISABLE ((uint8_t)0xFFU) +#define RTC_WRITE_PROTECTION_ENABLE_1 ((uint8_t)0xCAU) +#define RTC_WRITE_PROTECTION_ENABLE_2 ((uint8_t)0x53U) + +/* Defines used to combine date & time */ +#define RTC_OFFSET_WEEKDAY 24U +#define RTC_OFFSET_DAY 16U +#define RTC_OFFSET_MONTH 8U +#define RTC_OFFSET_HOUR 16U +#define RTC_OFFSET_MINUTE 8U + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RTC_LL_Private_Macros RTC Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RTC_LL_ES_INIT RTC Exported Init structure + * @{ + */ + +/** + * @brief RTC Init structures definition + */ +typedef struct +{ + uint32_t HourFormat; /*!< Specifies the RTC Hours Format. + This parameter can be a value of @ref RTC_LL_EC_HOURFORMAT + + This feature can be modified afterwards using unitary function + @ref LL_RTC_SetHourFormat(). */ + + uint32_t AsynchPrescaler; /*!< Specifies the RTC Asynchronous Predivider value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7F + + This feature can be modified afterwards using unitary function + @ref LL_RTC_SetAsynchPrescaler(). */ + + uint32_t SynchPrescaler; /*!< Specifies the RTC Synchronous Predivider value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7FFF + + This feature can be modified afterwards using unitary function + @ref LL_RTC_SetSynchPrescaler(). */ +} LL_RTC_InitTypeDef; + +/** + * @brief RTC Time structure definition + */ +typedef struct +{ + uint32_t TimeFormat; /*!< Specifies the RTC AM/PM Time. + This parameter can be a value of @ref RTC_LL_EC_TIME_FORMAT + + This feature can be modified afterwards using unitary function @ref LL_RTC_TIME_SetFormat(). */ + + uint8_t Hours; /*!< Specifies the RTC Time Hours. + This parameter must be a number between Min_Data = 0 and Max_Data = 12 if the @ref LL_RTC_TIME_FORMAT_PM is selected. + This parameter must be a number between Min_Data = 0 and Max_Data = 23 if the @ref LL_RTC_TIME_FORMAT_AM_OR_24 is selected. + + This feature can be modified afterwards using unitary function @ref LL_RTC_TIME_SetHour(). */ + + uint8_t Minutes; /*!< Specifies the RTC Time Minutes. + This parameter must be a number between Min_Data = 0 and Max_Data = 59 + + This feature can be modified afterwards using unitary function @ref LL_RTC_TIME_SetMinute(). */ + + uint8_t Seconds; /*!< Specifies the RTC Time Seconds. + This parameter must be a number between Min_Data = 0 and Max_Data = 59 + + This feature can be modified afterwards using unitary function @ref LL_RTC_TIME_SetSecond(). */ +} LL_RTC_TimeTypeDef; + +/** + * @brief RTC Date structure definition + */ +typedef struct +{ + uint8_t WeekDay; /*!< Specifies the RTC Date WeekDay. + This parameter can be a value of @ref RTC_LL_EC_WEEKDAY + + This feature can be modified afterwards using unitary function @ref LL_RTC_DATE_SetWeekDay(). */ + + uint8_t Month; /*!< Specifies the RTC Date Month. + This parameter can be a value of @ref RTC_LL_EC_MONTH + + This feature can be modified afterwards using unitary function @ref LL_RTC_DATE_SetMonth(). */ + + uint8_t Day; /*!< Specifies the RTC Date Day. + This parameter must be a number between Min_Data = 1 and Max_Data = 31 + + This feature can be modified afterwards using unitary function @ref LL_RTC_DATE_SetDay(). */ + + uint8_t Year; /*!< Specifies the RTC Date Year. + This parameter must be a number between Min_Data = 0 and Max_Data = 99 + + This feature can be modified afterwards using unitary function @ref LL_RTC_DATE_SetYear(). */ +} LL_RTC_DateTypeDef; + +/** + * @brief RTC Alarm structure definition + */ +typedef struct +{ + LL_RTC_TimeTypeDef AlarmTime; /*!< Specifies the RTC Alarm Time members. */ + + uint32_t AlarmMask; /*!< Specifies the RTC Alarm Masks. + This parameter can be a value of @ref RTC_LL_EC_ALMA_MASK for ALARM A or @ref RTC_LL_EC_ALMB_MASK for ALARM B. + + This feature can be modified afterwards using unitary function @ref LL_RTC_ALMA_SetMask() for ALARM A + or @ref LL_RTC_ALMB_SetMask() for ALARM B + */ + + uint32_t AlarmDateWeekDaySel; /*!< Specifies the RTC Alarm is on day or WeekDay. + This parameter can be a value of @ref RTC_LL_EC_ALMA_WEEKDAY_SELECTION for ALARM A or @ref RTC_LL_EC_ALMB_WEEKDAY_SELECTION for ALARM B + + This feature can be modified afterwards using unitary function @ref LL_RTC_ALMA_EnableWeekday() or @ref LL_RTC_ALMA_DisableWeekday() + for ALARM A or @ref LL_RTC_ALMB_EnableWeekday() or @ref LL_RTC_ALMB_DisableWeekday() for ALARM B + */ + + uint8_t AlarmDateWeekDay; /*!< Specifies the RTC Alarm Day/WeekDay. + If AlarmDateWeekDaySel set to day, this parameter must be a number between Min_Data = 1 and Max_Data = 31. + + This feature can be modified afterwards using unitary function @ref LL_RTC_ALMA_SetDay() + for ALARM A or @ref LL_RTC_ALMB_SetDay() for ALARM B. + + If AlarmDateWeekDaySel set to Weekday, this parameter can be a value of @ref RTC_LL_EC_WEEKDAY. + + This feature can be modified afterwards using unitary function @ref LL_RTC_ALMA_SetWeekDay() + for ALARM A or @ref LL_RTC_ALMB_SetWeekDay() for ALARM B. + */ +} LL_RTC_AlarmTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RTC_LL_Exported_Constants RTC Exported Constants + * @{ + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RTC_LL_EC_FORMAT FORMAT + * @{ + */ +#define LL_RTC_FORMAT_BIN 0x000000000U /*!< Binary data format */ +#define LL_RTC_FORMAT_BCD 0x000000001U /*!< BCD data format */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMA_WEEKDAY_SELECTION RTC Alarm A Date WeekDay + * @{ + */ +#define LL_RTC_ALMA_DATEWEEKDAYSEL_DATE 0x00000000U /*!< Alarm A Date is selected */ +#define LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY RTC_ALRMAR_WDSEL /*!< Alarm A WeekDay is selected */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMB_WEEKDAY_SELECTION RTC Alarm B Date WeekDay + * @{ + */ +#define LL_RTC_ALMB_DATEWEEKDAYSEL_DATE 0x00000000U /*!< Alarm B Date is selected */ +#define LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY RTC_ALRMBR_WDSEL /*!< Alarm B WeekDay is selected */ +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/** @defgroup RTC_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_RTC_ReadReg function + * @{ + */ +#define LL_RTC_ISR_RECALPF RTC_ISR_RECALPF +#define LL_RTC_ISR_TAMP3F RTC_ISR_TAMP3F +#define LL_RTC_ISR_TAMP2F RTC_ISR_TAMP2F +#define LL_RTC_ISR_TAMP1F RTC_ISR_TAMP1F +#define LL_RTC_ISR_TSOVF RTC_ISR_TSOVF +#define LL_RTC_ISR_TSF RTC_ISR_TSF +#define LL_RTC_ISR_WUTF RTC_ISR_WUTF +#define LL_RTC_ISR_ALRBF RTC_ISR_ALRBF +#define LL_RTC_ISR_ALRAF RTC_ISR_ALRAF +#define LL_RTC_ISR_INITF RTC_ISR_INITF +#define LL_RTC_ISR_RSF RTC_ISR_RSF +#define LL_RTC_ISR_INITS RTC_ISR_INITS +#define LL_RTC_ISR_SHPF RTC_ISR_SHPF +#define LL_RTC_ISR_WUTWF RTC_ISR_WUTWF +#define LL_RTC_ISR_ALRBWF RTC_ISR_ALRBWF +#define LL_RTC_ISR_ALRAWF RTC_ISR_ALRAWF +/** + * @} + */ + +/** @defgroup RTC_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_RTC_ReadReg and LL_RTC_WriteReg functions + * @{ + */ +#define LL_RTC_CR_TSIE RTC_CR_TSIE +#define LL_RTC_CR_WUTIE RTC_CR_WUTIE +#define LL_RTC_CR_ALRBIE RTC_CR_ALRBIE +#define LL_RTC_CR_ALRAIE RTC_CR_ALRAIE +#define LL_RTC_TAFCR_TAMPIE RTC_TAFCR_TAMPIE +/** + * @} + */ + +/** @defgroup RTC_LL_EC_WEEKDAY WEEK DAY + * @{ + */ +#define LL_RTC_WEEKDAY_MONDAY ((uint8_t)0x01U) /*!< Monday */ +#define LL_RTC_WEEKDAY_TUESDAY ((uint8_t)0x02U) /*!< Tuesday */ +#define LL_RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03U) /*!< Wednesday */ +#define LL_RTC_WEEKDAY_THURSDAY ((uint8_t)0x04U) /*!< Thrusday */ +#define LL_RTC_WEEKDAY_FRIDAY ((uint8_t)0x05U) /*!< Friday */ +#define LL_RTC_WEEKDAY_SATURDAY ((uint8_t)0x06U) /*!< Saturday */ +#define LL_RTC_WEEKDAY_SUNDAY ((uint8_t)0x07U) /*!< Sunday */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_MONTH MONTH + * @{ + */ +#define LL_RTC_MONTH_JANUARY ((uint8_t)0x01U) /*!< January */ +#define LL_RTC_MONTH_FEBRUARY ((uint8_t)0x02U) /*!< February */ +#define LL_RTC_MONTH_MARCH ((uint8_t)0x03U) /*!< March */ +#define LL_RTC_MONTH_APRIL ((uint8_t)0x04U) /*!< April */ +#define LL_RTC_MONTH_MAY ((uint8_t)0x05U) /*!< May */ +#define LL_RTC_MONTH_JUNE ((uint8_t)0x06U) /*!< June */ +#define LL_RTC_MONTH_JULY ((uint8_t)0x07U) /*!< July */ +#define LL_RTC_MONTH_AUGUST ((uint8_t)0x08U) /*!< August */ +#define LL_RTC_MONTH_SEPTEMBER ((uint8_t)0x09U) /*!< September */ +#define LL_RTC_MONTH_OCTOBER ((uint8_t)0x10U) /*!< October */ +#define LL_RTC_MONTH_NOVEMBER ((uint8_t)0x11U) /*!< November */ +#define LL_RTC_MONTH_DECEMBER ((uint8_t)0x12U) /*!< December */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_HOURFORMAT HOUR FORMAT + * @{ + */ +#define LL_RTC_HOURFORMAT_24HOUR 0x00000000U /*!< 24 hour/day format */ +#define LL_RTC_HOURFORMAT_AMPM RTC_CR_FMT /*!< AM/PM hour format */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALARMOUT ALARM OUTPUT + * @{ + */ +#define LL_RTC_ALARMOUT_DISABLE 0x00000000U /*!< Output disabled */ +#define LL_RTC_ALARMOUT_ALMA RTC_CR_OSEL_0 /*!< Alarm A output enabled */ +#define LL_RTC_ALARMOUT_ALMB RTC_CR_OSEL_1 /*!< Alarm B output enabled */ +#define LL_RTC_ALARMOUT_WAKEUP RTC_CR_OSEL /*!< Wakeup output enabled */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALARM_OUTPUTTYPE ALARM OUTPUT TYPE + * @{ + */ +#define LL_RTC_ALARM_OUTPUTTYPE_OPENDRAIN 0x00000000U /*!< RTC_ALARM, when mapped on PC13, is open-drain output */ +#define LL_RTC_ALARM_OUTPUTTYPE_PUSHPULL RTC_TAFCR_ALARMOUTTYPE /*!< RTC_ALARM, when mapped on PC13, is push-pull output */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_PIN PIN + * @{ + */ +#define LL_RTC_PIN_PC13 RTC_TAFCR_PC13MODE /*!< PC13 is forced to push-pull output if all RTC alternate functions are disabled */ +#define LL_RTC_PIN_PC14 RTC_TAFCR_PC14MODE /*!< PC14 is forced to push-pull output if LSE is disabled */ +#define LL_RTC_PIN_PC15 RTC_TAFCR_PC15MODE /*!< PC15 is forced to push-pull output if LSE is disabled */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_OUTPUTPOLARITY_PIN OUTPUT POLARITY PIN + * @{ + */ +#define LL_RTC_OUTPUTPOLARITY_PIN_HIGH 0x00000000U /*!< Pin is high when ALRAF/ALRBF/WUTF is asserted (depending on OSEL)*/ +#define LL_RTC_OUTPUTPOLARITY_PIN_LOW RTC_CR_POL /*!< Pin is low when ALRAF/ALRBF/WUTF is asserted (depending on OSEL) */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TIME_FORMAT TIME FORMAT + * @{ + */ +#define LL_RTC_TIME_FORMAT_AM_OR_24 0x00000000U /*!< AM or 24-hour format */ +#define LL_RTC_TIME_FORMAT_PM RTC_TR_PM /*!< PM */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_SHIFT_SECOND SHIFT SECOND + * @{ + */ +#define LL_RTC_SHIFT_SECOND_DELAY 0x00000000U /* Delay (seconds) = SUBFS / (PREDIV_S + 1) */ +#define LL_RTC_SHIFT_SECOND_ADVANCE RTC_SHIFTR_ADD1S /* Advance (seconds) = (1 - (SUBFS / (PREDIV_S + 1))) */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMA_MASK ALARMA MASK + * @{ + */ +#define LL_RTC_ALMA_MASK_NONE 0x00000000U /*!< No masks applied on Alarm A*/ +#define LL_RTC_ALMA_MASK_DATEWEEKDAY RTC_ALRMAR_MSK4 /*!< Date/day do not care in Alarm A comparison */ +#define LL_RTC_ALMA_MASK_HOURS RTC_ALRMAR_MSK3 /*!< Hours do not care in Alarm A comparison */ +#define LL_RTC_ALMA_MASK_MINUTES RTC_ALRMAR_MSK2 /*!< Minutes do not care in Alarm A comparison */ +#define LL_RTC_ALMA_MASK_SECONDS RTC_ALRMAR_MSK1 /*!< Seconds do not care in Alarm A comparison */ +#define LL_RTC_ALMA_MASK_ALL (RTC_ALRMAR_MSK4 | RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2 | RTC_ALRMAR_MSK1) /*!< Masks all */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMA_TIME_FORMAT ALARMA TIME FORMAT + * @{ + */ +#define LL_RTC_ALMA_TIME_FORMAT_AM 0x00000000U /*!< AM or 24-hour format */ +#define LL_RTC_ALMA_TIME_FORMAT_PM RTC_ALRMAR_PM /*!< PM */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMB_MASK ALARMB MASK + * @{ + */ +#define LL_RTC_ALMB_MASK_NONE 0x00000000U /*!< No masks applied on Alarm B*/ +#define LL_RTC_ALMB_MASK_DATEWEEKDAY RTC_ALRMBR_MSK4 /*!< Date/day do not care in Alarm B comparison */ +#define LL_RTC_ALMB_MASK_HOURS RTC_ALRMBR_MSK3 /*!< Hours do not care in Alarm B comparison */ +#define LL_RTC_ALMB_MASK_MINUTES RTC_ALRMBR_MSK2 /*!< Minutes do not care in Alarm B comparison */ +#define LL_RTC_ALMB_MASK_SECONDS RTC_ALRMBR_MSK1 /*!< Seconds do not care in Alarm B comparison */ +#define LL_RTC_ALMB_MASK_ALL (RTC_ALRMBR_MSK4 | RTC_ALRMBR_MSK3 | RTC_ALRMBR_MSK2 | RTC_ALRMBR_MSK1) /*!< Masks all */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_ALMB_TIME_FORMAT ALARMB TIME FORMAT + * @{ + */ +#define LL_RTC_ALMB_TIME_FORMAT_AM 0x00000000U /*!< AM or 24-hour format */ +#define LL_RTC_ALMB_TIME_FORMAT_PM RTC_ALRMBR_PM /*!< PM */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TIMESTAMP_EDGE TIMESTAMP EDGE + * @{ + */ +#define LL_RTC_TIMESTAMP_EDGE_RISING 0x00000000U /*!< RTC_TS input rising edge generates a time-stamp event */ +#define LL_RTC_TIMESTAMP_EDGE_FALLING RTC_CR_TSEDGE /*!< RTC_TS input falling edge generates a time-stamp even */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TS_TIME_FORMAT TIMESTAMP TIME FORMAT + * @{ + */ +#define LL_RTC_TS_TIME_FORMAT_AM 0x00000000U /*!< AM or 24-hour format */ +#define LL_RTC_TS_TIME_FORMAT_PM RTC_TSTR_PM /*!< PM */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TAMPER TAMPER + * @{ + */ +#define LL_RTC_TAMPER_1 RTC_TAFCR_TAMP1E /*!< RTC_TAMP1 input detection */ +#if defined(RTC_TAMPER2_SUPPORT) +#define LL_RTC_TAMPER_2 RTC_TAFCR_TAMP2E /*!< RTC_TAMP2 input detection */ +#endif /* RTC_TAMPER2_SUPPORT */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TAMPER_MASK TAMPER MASK + * @{ + */ +#define LL_RTC_TAMPER_MASK_TAMPER1 RTC_TAFCR_TAMP1MF /*!< Tamper 1 event generates a trigger event. TAMP1F is masked and internally cleared by hardware.The backup registers are not erased */ +#if defined(RTC_TAMPER2_SUPPORT) +#define LL_RTC_TAMPER_MASK_TAMPER2 RTC_TAFCR_TAMP2MF /*!< Tamper 2 event generates a trigger event. TAMP2F is masked and internally cleared by hardware. The backup registers are not erased. */ +#endif /* RTC_TAMPER2_SUPPORT */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TAMPER_NOERASE TAMPER NO ERASE + * @{ + */ +#define LL_RTC_TAMPER_NOERASE_TAMPER1 RTC_TAFCR_TAMP1NOERASE /*!< Tamper 1 event does not erase the backup registers. */ +#if defined(RTC_TAMPER2_SUPPORT) +#define LL_RTC_TAMPER_NOERASE_TAMPER2 RTC_TAFCR_TAMP2NOERASE /*!< Tamper 2 event does not erase the backup registers. */ +#endif /* RTC_TAMPER2_SUPPORT */ +/** + * @} + */ + +#if defined(RTC_TAFCR_TAMPPRCH) +/** @defgroup RTC_LL_EC_TAMPER_DURATION TAMPER DURATION + * @{ + */ +#define LL_RTC_TAMPER_DURATION_1RTCCLK 0x00000000U /*!< Tamper pins are pre-charged before sampling during 1 RTCCLK cycle */ +#define LL_RTC_TAMPER_DURATION_2RTCCLK RTC_TAFCR_TAMPPRCH_0 /*!< Tamper pins are pre-charged before sampling during 2 RTCCLK cycles */ +#define LL_RTC_TAMPER_DURATION_4RTCCLK RTC_TAFCR_TAMPPRCH_1 /*!< Tamper pins are pre-charged before sampling during 4 RTCCLK cycles */ +#define LL_RTC_TAMPER_DURATION_8RTCCLK RTC_TAFCR_TAMPPRCH /*!< Tamper pins are pre-charged before sampling during 8 RTCCLK cycles */ +/** + * @} + */ +#endif /* RTC_TAFCR_TAMPPRCH */ + +#if defined(RTC_TAFCR_TAMPFLT) +/** @defgroup RTC_LL_EC_TAMPER_FILTER TAMPER FILTER + * @{ + */ +#define LL_RTC_TAMPER_FILTER_DISABLE 0x00000000U /*!< Tamper filter is disabled */ +#define LL_RTC_TAMPER_FILTER_2SAMPLE RTC_TAFCR_TAMPFLT_0 /*!< Tamper is activated after 2 consecutive samples at the active level */ +#define LL_RTC_TAMPER_FILTER_4SAMPLE RTC_TAFCR_TAMPFLT_1 /*!< Tamper is activated after 4 consecutive samples at the active level */ +#define LL_RTC_TAMPER_FILTER_8SAMPLE RTC_TAFCR_TAMPFLT /*!< Tamper is activated after 8 consecutive samples at the active level. */ +/** + * @} + */ +#endif /* RTC_TAFCR_TAMPFLT */ + +#if defined(RTC_TAFCR_TAMPFREQ) +/** @defgroup RTC_LL_EC_TAMPER_SAMPLFREQDIV TAMPER SAMPLING FREQUENCY DIVIDER + * @{ + */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_32768 0x00000000U /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 32768 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_16384 RTC_TAFCR_TAMPFREQ_0 /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 16384 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_8192 RTC_TAFCR_TAMPFREQ_1 /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 8192 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_4096 (RTC_TAFCR_TAMPFREQ_1 | RTC_TAFCR_TAMPFREQ_0) /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 4096 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_2048 RTC_TAFCR_TAMPFREQ_2 /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 2048 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_1024 (RTC_TAFCR_TAMPFREQ_2 | RTC_TAFCR_TAMPFREQ_0) /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 1024 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_512 (RTC_TAFCR_TAMPFREQ_2 | RTC_TAFCR_TAMPFREQ_1) /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 512 */ +#define LL_RTC_TAMPER_SAMPLFREQDIV_256 RTC_TAFCR_TAMPFREQ /*!< Each of the tamper inputs are sampled with a frequency = RTCCLK / 256 */ +/** + * @} + */ +#endif /* RTC_TAFCR_TAMPFREQ */ + +/** @defgroup RTC_LL_EC_TAMPER_ACTIVELEVEL TAMPER ACTIVE LEVEL + * @{ + */ +#define LL_RTC_TAMPER_ACTIVELEVEL_TAMP1 RTC_TAFCR_TAMP1TRG /*!< RTC_TAMP1 input falling edge (if TAMPFLT = 00) or staying high (if TAMPFLT != 00) triggers a tamper detection event*/ +#if defined(RTC_TAMPER2_SUPPORT) +#define LL_RTC_TAMPER_ACTIVELEVEL_TAMP2 RTC_TAFCR_TAMP2TRG /*!< RTC_TAMP2 input falling edge (if TAMPFLT = 00) or staying high (if TAMPFLT != 00) triggers a tamper detection event*/ +#endif /* RTC_TAMPER2_SUPPORT */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_WAKEUPCLOCK_DIV WAKEUP CLOCK DIV + * @{ + */ +#define LL_RTC_WAKEUPCLOCK_DIV_16 0x00000000U /*!< RTC/16 clock is selected */ +#define LL_RTC_WAKEUPCLOCK_DIV_8 (RTC_CR_WUCKSEL_0) /*!< RTC/8 clock is selected */ +#define LL_RTC_WAKEUPCLOCK_DIV_4 (RTC_CR_WUCKSEL_1) /*!< RTC/4 clock is selected */ +#define LL_RTC_WAKEUPCLOCK_DIV_2 (RTC_CR_WUCKSEL_1 | RTC_CR_WUCKSEL_0) /*!< RTC/2 clock is selected */ +#define LL_RTC_WAKEUPCLOCK_CKSPRE (RTC_CR_WUCKSEL_2) /*!< ck_spre (usually 1 Hz) clock is selected */ +#define LL_RTC_WAKEUPCLOCK_CKSPRE_WUT (RTC_CR_WUCKSEL_2 | RTC_CR_WUCKSEL_1) /*!< ck_spre (usually 1 Hz) clock is selected and 2exp16 is added to the WUT counter value*/ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_BKP BACKUP + * @{ + */ +#define LL_RTC_BKP_DR0 0x00000000U +#define LL_RTC_BKP_DR1 0x00000001U +#define LL_RTC_BKP_DR2 0x00000002U +#define LL_RTC_BKP_DR3 0x00000003U +#define LL_RTC_BKP_DR4 0x00000004U +#if RTC_BKP_NUMBER > 5 +#define LL_RTC_BKP_DR5 0x00000005U +#define LL_RTC_BKP_DR6 0x00000006U +#define LL_RTC_BKP_DR7 0x00000007U +#define LL_RTC_BKP_DR8 0x00000008U +#define LL_RTC_BKP_DR9 0x00000009U +#define LL_RTC_BKP_DR10 0x0000000AU +#define LL_RTC_BKP_DR11 0x0000000BU +#define LL_RTC_BKP_DR12 0x0000000CU +#define LL_RTC_BKP_DR13 0x0000000DU +#define LL_RTC_BKP_DR14 0x0000000EU +#define LL_RTC_BKP_DR15 0x0000000FU +#endif /* RTC_BKP_NUMBER > 5 */ + +#if RTC_BKP_NUMBER > 16 +#define LL_RTC_BKP_DR16 0x00000010U +#define LL_RTC_BKP_DR17 0x00000011U +#define LL_RTC_BKP_DR18 0x00000012U +#define LL_RTC_BKP_DR19 0x00000013U +#endif /* RTC_BKP_NUMBER > 16 */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_CALIB_OUTPUT Calibration output + * @{ + */ +#define LL_RTC_CALIB_OUTPUT_NONE 0x00000000U /*!< Calibration output disabled */ +#define LL_RTC_CALIB_OUTPUT_1HZ (RTC_CR_COE | RTC_CR_COSEL) /*!< Calibration output is 1 Hz */ +#define LL_RTC_CALIB_OUTPUT_512HZ (RTC_CR_COE) /*!< Calibration output is 512 Hz */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_CALIB_SIGN Coarse digital calibration sign + * @{ + */ +#define LL_RTC_CALIB_SIGN_POSITIVE 0x00000000U /*!< Positive calibration: calendar update frequency is increased */ +#define LL_RTC_CALIB_SIGN_NEGATIVE RTC_CALIBR_DCS /*!< Negative calibration: calendar update frequency is decreased */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_CALIB_INSERTPULSE Calibration pulse insertion + * @{ + */ +#define LL_RTC_CALIB_INSERTPULSE_NONE 0x00000000U /*!< No RTCCLK pulses are added */ +#define LL_RTC_CALIB_INSERTPULSE_SET RTC_CALR_CALP /*!< One RTCCLK pulse is effectively inserted every 2exp11 pulses (frequency increased by 488.5 ppm) */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_CALIB_PERIOD Calibration period + * @{ + */ +#define LL_RTC_CALIB_PERIOD_32SEC 0x00000000U /*!< Use a 32-second calibration cycle period */ +#define LL_RTC_CALIB_PERIOD_16SEC RTC_CALR_CALW16 /*!< Use a 16-second calibration cycle period */ +#define LL_RTC_CALIB_PERIOD_8SEC RTC_CALR_CALW8 /*!< Use a 8-second calibration cycle period */ +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TSINSEL TIMESTAMP mapping + * @{ + */ +#define LL_RTC_TimeStampPin_Default 0x00000000U /*!< Use RTC_AF1 as TIMESTAMP */ +#if defined(RTC_AF2_SUPPORT) +#define LL_RTC_TimeStampPin_Pos1 RTC_TAFCR_TSINSEL /*!< Use RTC_AF2 as TIMESTAMP */ +#endif +/** + * @} + */ + +/** @defgroup RTC_LL_EC_TAMP1INSEL TAMPER1 mapping + * @{ + */ +#define LL_RTC_TamperPin_Default 0x00000000U /*!< Use RTC_AF1 as TAMPER1 */ +#if defined(RTC_AF2_SUPPORT) +#define LL_RTC_TamperPin_Pos1 RTC_TAFCR_TAMP1INSEL /*!< Use RTC_AF2 as TAMPER1 */ +#endif +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RTC_LL_Exported_Macros RTC Exported Macros + * @{ + */ + +/** @defgroup RTC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RTC register + * @param __INSTANCE__ RTC Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RTC_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RTC register + * @param __INSTANCE__ RTC Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RTC_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup RTC_LL_EM_Convert Convert helper Macros + * @{ + */ + +/** + * @brief Helper macro to convert a value from 2 digit decimal format to BCD format + * @param __VALUE__ Byte to be converted + * @retval Converted byte + */ +#define __LL_RTC_CONVERT_BIN2BCD(__VALUE__) (uint8_t)((((__VALUE__) / 10U) << 4U) | ((__VALUE__) % 10U)) + +/** + * @brief Helper macro to convert a value from BCD format to 2 digit decimal format + * @param __VALUE__ BCD value to be converted + * @retval Converted byte + */ +#define __LL_RTC_CONVERT_BCD2BIN(__VALUE__) (uint8_t)(((uint8_t)((__VALUE__) & (uint8_t)0xF0U) >> (uint8_t)0x4U) * 10U + ((__VALUE__) & (uint8_t)0x0FU)) + +/** + * @} + */ + +/** @defgroup RTC_LL_EM_Date Date helper Macros + * @{ + */ + +/** + * @brief Helper macro to retrieve weekday. + * @param __RTC_DATE__ Date returned by @ref LL_RTC_DATE_Get function. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + */ +#define __LL_RTC_GET_WEEKDAY(__RTC_DATE__) (((__RTC_DATE__) >> RTC_OFFSET_WEEKDAY) & 0x000000FFU) + +/** + * @brief Helper macro to retrieve Year in BCD format + * @param __RTC_DATE__ Value returned by @ref LL_RTC_DATE_Get + * @retval Year in BCD format (0x00 . . . 0x99) + */ +#define __LL_RTC_GET_YEAR(__RTC_DATE__) ((__RTC_DATE__) & 0x000000FFU) + +/** + * @brief Helper macro to retrieve Month in BCD format + * @param __RTC_DATE__ Value returned by @ref LL_RTC_DATE_Get + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_MONTH_JANUARY + * @arg @ref LL_RTC_MONTH_FEBRUARY + * @arg @ref LL_RTC_MONTH_MARCH + * @arg @ref LL_RTC_MONTH_APRIL + * @arg @ref LL_RTC_MONTH_MAY + * @arg @ref LL_RTC_MONTH_JUNE + * @arg @ref LL_RTC_MONTH_JULY + * @arg @ref LL_RTC_MONTH_AUGUST + * @arg @ref LL_RTC_MONTH_SEPTEMBER + * @arg @ref LL_RTC_MONTH_OCTOBER + * @arg @ref LL_RTC_MONTH_NOVEMBER + * @arg @ref LL_RTC_MONTH_DECEMBER + */ +#define __LL_RTC_GET_MONTH(__RTC_DATE__) (((__RTC_DATE__) >>RTC_OFFSET_MONTH) & 0x000000FFU) + +/** + * @brief Helper macro to retrieve Day in BCD format + * @param __RTC_DATE__ Value returned by @ref LL_RTC_DATE_Get + * @retval Day in BCD format (0x01 . . . 0x31) + */ +#define __LL_RTC_GET_DAY(__RTC_DATE__) (((__RTC_DATE__) >>RTC_OFFSET_DAY) & 0x000000FFU) + +/** + * @} + */ + +/** @defgroup RTC_LL_EM_Time Time helper Macros + * @{ + */ + +/** + * @brief Helper macro to retrieve hour in BCD format + * @param __RTC_TIME__ RTC time returned by @ref LL_RTC_TIME_Get function + * @retval Hours in BCD format (0x01. . .0x12 or between Min_Data=0x00 and Max_Data=0x23) + */ +#define __LL_RTC_GET_HOUR(__RTC_TIME__) (((__RTC_TIME__) >> RTC_OFFSET_HOUR) & 0x000000FFU) + +/** + * @brief Helper macro to retrieve minute in BCD format + * @param __RTC_TIME__ RTC time returned by @ref LL_RTC_TIME_Get function + * @retval Minutes in BCD format (0x00. . .0x59) + */ +#define __LL_RTC_GET_MINUTE(__RTC_TIME__) (((__RTC_TIME__) >> RTC_OFFSET_MINUTE) & 0x000000FFU) + +/** + * @brief Helper macro to retrieve second in BCD format + * @param __RTC_TIME__ RTC time returned by @ref LL_RTC_TIME_Get function + * @retval Seconds in format (0x00. . .0x59) + */ +#define __LL_RTC_GET_SECOND(__RTC_TIME__) ((__RTC_TIME__) & 0x000000FFU) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RTC_LL_Exported_Functions RTC Exported Functions + * @{ + */ + +/** @defgroup RTC_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Set Hours format (24 hour/day or AM/PM hour format) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CR FMT LL_RTC_SetHourFormat + * @param RTCx RTC Instance + * @param HourFormat This parameter can be one of the following values: + * @arg @ref LL_RTC_HOURFORMAT_24HOUR + * @arg @ref LL_RTC_HOURFORMAT_AMPM + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetHourFormat(RTC_TypeDef *RTCx, uint32_t HourFormat) +{ + MODIFY_REG(RTCx->CR, RTC_CR_FMT, HourFormat); +} + +/** + * @brief Get Hours format (24 hour/day or AM/PM hour format) + * @rmtoll CR FMT LL_RTC_GetHourFormat + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_HOURFORMAT_24HOUR + * @arg @ref LL_RTC_HOURFORMAT_AMPM + */ +__STATIC_INLINE uint32_t LL_RTC_GetHourFormat(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_FMT)); +} + +/** + * @brief Select the flag to be routed to RTC_ALARM output + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR OSEL LL_RTC_SetAlarmOutEvent + * @param RTCx RTC Instance + * @param AlarmOutput This parameter can be one of the following values: + * @arg @ref LL_RTC_ALARMOUT_DISABLE + * @arg @ref LL_RTC_ALARMOUT_ALMA + * @arg @ref LL_RTC_ALARMOUT_ALMB + * @arg @ref LL_RTC_ALARMOUT_WAKEUP + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetAlarmOutEvent(RTC_TypeDef *RTCx, uint32_t AlarmOutput) +{ + MODIFY_REG(RTCx->CR, RTC_CR_OSEL, AlarmOutput); +} + +/** + * @brief Get the flag to be routed to RTC_ALARM output + * @rmtoll CR OSEL LL_RTC_GetAlarmOutEvent + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_ALARMOUT_DISABLE + * @arg @ref LL_RTC_ALARMOUT_ALMA + * @arg @ref LL_RTC_ALARMOUT_ALMB + * @arg @ref LL_RTC_ALARMOUT_WAKEUP + */ +__STATIC_INLINE uint32_t LL_RTC_GetAlarmOutEvent(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_OSEL)); +} + +/** + * @brief Set RTC_ALARM output type (ALARM in push-pull or open-drain output) + * @note Used only when RTC_ALARM is mapped on PC13 + * @note If all RTC alternate functions are disabled and PC13MODE = 1, PC13VALUE configures the + * PC13 output data + * @rmtoll TAFCR ALARMOUTTYPE LL_RTC_SetAlarmOutputType + * @param RTCx RTC Instance + * @param Output This parameter can be one of the following values: + * @arg @ref LL_RTC_ALARM_OUTPUTTYPE_OPENDRAIN + * @arg @ref LL_RTC_ALARM_OUTPUTTYPE_PUSHPULL + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetAlarmOutputType(RTC_TypeDef *RTCx, uint32_t Output) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_ALARMOUTTYPE, Output); +} + +/** + * @brief Get RTC_ALARM output type (ALARM in push-pull or open-drain output) + * @note used only when RTC_ALARM is mapped on PC13 + * @note If all RTC alternate functions are disabled and PC13MODE = 1, PC13VALUE configures the + * PC13 output data + * @rmtoll TAFCR ALARMOUTTYPE LL_RTC_GetAlarmOutputType + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_ALARM_OUTPUTTYPE_OPENDRAIN + * @arg @ref LL_RTC_ALARM_OUTPUTTYPE_PUSHPULL + */ +__STATIC_INLINE uint32_t LL_RTC_GetAlarmOutputType(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_ALARMOUTTYPE)); +} + +/** + * @brief Enable push-pull output on PC13, PC14 and/or PC15 + * @note PC13 forced to push-pull output if all RTC alternate functions are disabled + * @note PC14 and PC15 forced to push-pull output if LSE is disabled + * @rmtoll TAFCR PC13MODE LL_RTC_EnablePushPullMode\n + * @rmtoll TAFCR PC14MODE LL_RTC_EnablePushPullMode\n + * @rmtoll TAFCR PC15MODE LL_RTC_EnablePushPullMode + * @param RTCx RTC Instance + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_PIN_PC13 + * @arg @ref LL_RTC_PIN_PC14 + * @arg @ref LL_RTC_PIN_PC15 + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnablePushPullMode(RTC_TypeDef *RTCx, uint32_t PinMask) +{ + SET_BIT(RTCx->TAFCR, PinMask); +} + +/** + * @brief Disable push-pull output on PC13, PC14 and/or PC15 + * @note PC13, PC14 and/or PC15 are controlled by the GPIO configuration registers. + * Consequently PC13, PC14 and/or PC15 are floating in Standby mode. + * @rmtoll TAFCR PC13MODE LL_RTC_DisablePushPullMode\n + * TAFCR PC14MODE LL_RTC_DisablePushPullMode\n + * TAFCR PC15MODE LL_RTC_DisablePushPullMode + * @param RTCx RTC Instance + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_PIN_PC13 + * @arg @ref LL_RTC_PIN_PC14 + * @arg @ref LL_RTC_PIN_PC15 + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisablePushPullMode(RTC_TypeDef* RTCx, uint32_t PinMask) +{ + CLEAR_BIT(RTCx->TAFCR, PinMask); +} + +/** + * @brief Set PC14 and/or PC15 to high level. + * @note Output data configuration is possible if the LSE is disabled and PushPull output is enabled (through @ref LL_RTC_EnablePushPullMode) + * @rmtoll TAFCR PC14VALUE LL_RTC_SetOutputPin\n + * TAFCR PC15VALUE LL_RTC_SetOutputPin + * @param RTCx RTC Instance + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_PIN_PC14 + * @arg @ref LL_RTC_PIN_PC15 + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetOutputPin(RTC_TypeDef* RTCx, uint32_t PinMask) +{ + SET_BIT(RTCx->TAFCR, (PinMask >> 1)); +} + +/** + * @brief Set PC14 and/or PC15 to low level. + * @note Output data configuration is possible if the LSE is disabled and PushPull output is enabled (through @ref LL_RTC_EnablePushPullMode) + * @rmtoll TAFCR PC14VALUE LL_RTC_ResetOutputPin\n + * TAFCR PC15VALUE LL_RTC_ResetOutputPin + * @param RTCx RTC Instance + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_PIN_PC14 + * @arg @ref LL_RTC_PIN_PC15 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ResetOutputPin(RTC_TypeDef* RTCx, uint32_t PinMask) +{ + CLEAR_BIT(RTCx->TAFCR, (PinMask >> 1)); +} + +/** + * @brief Enable initialization mode + * @note Initialization mode is used to program time and date register (RTC_TR and RTC_DR) + * and prescaler register (RTC_PRER). + * Counters are stopped and start counting from the new value when INIT is reset. + * @rmtoll ISR INIT LL_RTC_EnableInitMode + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableInitMode(RTC_TypeDef *RTCx) +{ + /* Set the Initialization mode */ + WRITE_REG(RTCx->ISR, RTC_INIT_MASK); +} + +/** + * @brief Disable initialization mode (Free running mode) + * @rmtoll ISR INIT LL_RTC_DisableInitMode + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableInitMode(RTC_TypeDef *RTCx) +{ + /* Exit Initialization mode */ + WRITE_REG(RTCx->ISR, (uint32_t)~RTC_ISR_INIT); +} + +/** + * @brief Set Output polarity (pin is low when ALRAF/ALRBF/WUTF is asserted) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR POL LL_RTC_SetOutputPolarity + * @param RTCx RTC Instance + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_RTC_OUTPUTPOLARITY_PIN_HIGH + * @arg @ref LL_RTC_OUTPUTPOLARITY_PIN_LOW + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetOutputPolarity(RTC_TypeDef *RTCx, uint32_t Polarity) +{ + MODIFY_REG(RTCx->CR, RTC_CR_POL, Polarity); +} + +/** + * @brief Get Output polarity + * @rmtoll CR POL LL_RTC_GetOutputPolarity + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_OUTPUTPOLARITY_PIN_HIGH + * @arg @ref LL_RTC_OUTPUTPOLARITY_PIN_LOW + */ +__STATIC_INLINE uint32_t LL_RTC_GetOutputPolarity(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_POL)); +} + +/** + * @brief Enable Bypass the shadow registers + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR BYPSHAD LL_RTC_EnableShadowRegBypass + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableShadowRegBypass(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_BYPSHAD); +} + +/** + * @brief Disable Bypass the shadow registers + * @rmtoll CR BYPSHAD LL_RTC_DisableShadowRegBypass + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableShadowRegBypass(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_BYPSHAD); +} + +/** + * @brief Check if Shadow registers bypass is enabled or not. + * @rmtoll CR BYPSHAD LL_RTC_IsShadowRegBypassEnabled + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsShadowRegBypassEnabled(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_BYPSHAD) == (RTC_CR_BYPSHAD)); +} + +/** + * @brief Enable RTC_REFIN reference clock detection (50 or 60 Hz) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CR REFCKON LL_RTC_EnableRefClock + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableRefClock(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_REFCKON); +} + +/** + * @brief Disable RTC_REFIN reference clock detection (50 or 60 Hz) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CR REFCKON LL_RTC_DisableRefClock + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableRefClock(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_REFCKON); +} + +/** + * @brief Set Asynchronous prescaler factor + * @rmtoll PRER PREDIV_A LL_RTC_SetAsynchPrescaler + * @param RTCx RTC Instance + * @param AsynchPrescaler Value between Min_Data = 0 and Max_Data = 0x7F + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetAsynchPrescaler(RTC_TypeDef *RTCx, uint32_t AsynchPrescaler) +{ + MODIFY_REG(RTCx->PRER, RTC_PRER_PREDIV_A, AsynchPrescaler << RTC_PRER_PREDIV_A_Pos); +} + +/** + * @brief Set Synchronous prescaler factor + * @rmtoll PRER PREDIV_S LL_RTC_SetSynchPrescaler + * @param RTCx RTC Instance + * @param SynchPrescaler Value between Min_Data = 0 and Max_Data = 0x7FFF + * @retval None + */ +__STATIC_INLINE void LL_RTC_SetSynchPrescaler(RTC_TypeDef *RTCx, uint32_t SynchPrescaler) +{ + MODIFY_REG(RTCx->PRER, RTC_PRER_PREDIV_S, SynchPrescaler); +} + +/** + * @brief Get Asynchronous prescaler factor + * @rmtoll PRER PREDIV_A LL_RTC_GetAsynchPrescaler + * @param RTCx RTC Instance + * @retval Value between Min_Data = 0 and Max_Data = 0x7F + */ +__STATIC_INLINE uint32_t LL_RTC_GetAsynchPrescaler(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->PRER, RTC_PRER_PREDIV_A) >> RTC_PRER_PREDIV_A_Pos); +} + +/** + * @brief Get Synchronous prescaler factor + * @rmtoll PRER PREDIV_S LL_RTC_GetSynchPrescaler + * @param RTCx RTC Instance + * @retval Value between Min_Data = 0 and Max_Data = 0x7FFF + */ +__STATIC_INLINE uint32_t LL_RTC_GetSynchPrescaler(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->PRER, RTC_PRER_PREDIV_S)); +} + +/** + * @brief Enable the write protection for RTC registers. + * @rmtoll WPR KEY LL_RTC_EnableWriteProtection + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableWriteProtection(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->WPR, RTC_WRITE_PROTECTION_DISABLE); +} + +/** + * @brief Disable the write protection for RTC registers. + * @rmtoll WPR KEY LL_RTC_DisableWriteProtection + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableWriteProtection(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->WPR, RTC_WRITE_PROTECTION_ENABLE_1); + WRITE_REG(RTCx->WPR, RTC_WRITE_PROTECTION_ENABLE_2); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Time Time + * @{ + */ + +/** + * @brief Set time format (AM/24-hour or PM notation) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll TR PM LL_RTC_TIME_SetFormat + * @param RTCx RTC Instance + * @param TimeFormat This parameter can be one of the following values: + * @arg @ref LL_RTC_TIME_FORMAT_AM_OR_24 + * @arg @ref LL_RTC_TIME_FORMAT_PM + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_SetFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat) +{ + MODIFY_REG(RTCx->TR, RTC_TR_PM, TimeFormat); +} + +/** + * @brief Get time format (AM or PM notation) + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note Read either RTC_SSR or RTC_TR locks the values in the higher-order calendar + * shadow registers until RTC_DR is read (LL_RTC_ReadReg(RTC, DR)). + * @rmtoll TR PM LL_RTC_TIME_GetFormat + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TIME_FORMAT_AM_OR_24 + * @arg @ref LL_RTC_TIME_FORMAT_PM + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_GetFormat(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TR, RTC_TR_PM)); +} + +/** + * @brief Set Hours in BCD format + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert hour from binary to BCD format + * @rmtoll TR HT LL_RTC_TIME_SetHour\n + * TR HU LL_RTC_TIME_SetHour + * @param RTCx RTC Instance + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_SetHour(RTC_TypeDef *RTCx, uint32_t Hours) +{ + MODIFY_REG(RTCx->TR, (RTC_TR_HT | RTC_TR_HU), + (((Hours & 0xF0U) << (RTC_TR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_TR_HU_Pos))); +} + +/** + * @brief Get Hours in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note Read either RTC_SSR or RTC_TR locks the values in the higher-order calendar + * shadow registers until RTC_DR is read (LL_RTC_ReadReg(RTC, DR)). + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert hour from BCD to + * Binary format + * @rmtoll TR HT LL_RTC_TIME_GetHour\n + * TR HU LL_RTC_TIME_GetHour + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_GetHour(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->TR, (RTC_TR_HT | RTC_TR_HU)); + return (uint32_t)((((temp & RTC_TR_HT) >> RTC_TR_HT_Pos) << 4U) | ((temp & RTC_TR_HU) >> RTC_TR_HU_Pos)); +} + +/** + * @brief Set Minutes in BCD format + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Minutes from binary to BCD format + * @rmtoll TR MNT LL_RTC_TIME_SetMinute\n + * TR MNU LL_RTC_TIME_SetMinute + * @param RTCx RTC Instance + * @param Minutes Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes) +{ + MODIFY_REG(RTCx->TR, (RTC_TR_MNT | RTC_TR_MNU), + (((Minutes & 0xF0U) << (RTC_TR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_TR_MNU_Pos))); +} + +/** + * @brief Get Minutes in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note Read either RTC_SSR or RTC_TR locks the values in the higher-order calendar + * shadow registers until RTC_DR is read (LL_RTC_ReadReg(RTC, DR)). + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert minute from BCD + * to Binary format + * @rmtoll TR MNT LL_RTC_TIME_GetMinute\n + * TR MNU LL_RTC_TIME_GetMinute + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_GetMinute(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->TR, (RTC_TR_MNT | RTC_TR_MNU)); + return (uint32_t)((((temp & RTC_TR_MNT) >> RTC_TR_MNT_Pos) << 4U) | ((temp & RTC_TR_MNU) >> RTC_TR_MNU_Pos)); +} + +/** + * @brief Set Seconds in BCD format + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Seconds from binary to BCD format + * @rmtoll TR ST LL_RTC_TIME_SetSecond\n + * TR SU LL_RTC_TIME_SetSecond + * @param RTCx RTC Instance + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds) +{ + MODIFY_REG(RTCx->TR, (RTC_TR_ST | RTC_TR_SU), + (((Seconds & 0xF0U) << (RTC_TR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_TR_SU_Pos))); +} + +/** + * @brief Get Seconds in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note Read either RTC_SSR or RTC_TR locks the values in the higher-order calendar + * shadow registers until RTC_DR is read (LL_RTC_ReadReg(RTC, DR)). + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Seconds from BCD + * to Binary format + * @rmtoll TR ST LL_RTC_TIME_GetSecond\n + * TR SU LL_RTC_TIME_GetSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_GetSecond(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->TR, (RTC_TR_ST | RTC_TR_SU)); + return (uint32_t)((((temp & RTC_TR_ST) >> RTC_TR_ST_Pos) << 4U) | ((temp & RTC_TR_SU) >> RTC_TR_SU_Pos)); +} + +/** + * @brief Set time (hour, minute and second) in BCD format + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @note TimeFormat and Hours should follow the same format + * @rmtoll TR PM LL_RTC_TIME_Config\n + * TR HT LL_RTC_TIME_Config\n + * TR HU LL_RTC_TIME_Config\n + * TR MNT LL_RTC_TIME_Config\n + * TR MNU LL_RTC_TIME_Config\n + * TR ST LL_RTC_TIME_Config\n + * TR SU LL_RTC_TIME_Config + * @param RTCx RTC Instance + * @param Format12_24 This parameter can be one of the following values: + * @arg @ref LL_RTC_TIME_FORMAT_AM_OR_24 + * @arg @ref LL_RTC_TIME_FORMAT_PM + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @param Minutes Value between Min_Data=0x00 and Max_Data=0x59 + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_Config(RTC_TypeDef *RTCx, uint32_t Format12_24, uint32_t Hours, uint32_t Minutes, uint32_t Seconds) +{ + register uint32_t temp = 0U; + + temp = Format12_24 | \ + (((Hours & 0xF0U) << (RTC_TR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_TR_HU_Pos)) | \ + (((Minutes & 0xF0U) << (RTC_TR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_TR_MNU_Pos)) | \ + (((Seconds & 0xF0U) << (RTC_TR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_TR_SU_Pos)); + MODIFY_REG(RTCx->TR, (RTC_TR_PM | RTC_TR_HT | RTC_TR_HU | RTC_TR_MNT | RTC_TR_MNU | RTC_TR_ST | RTC_TR_SU), temp); +} + +/** + * @brief Get time (hour, minute and second) in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note Read either RTC_SSR or RTC_TR locks the values in the higher-order calendar + * shadow registers until RTC_DR is read (LL_RTC_ReadReg(RTC, DR)). + * @note helper macros __LL_RTC_GET_HOUR, __LL_RTC_GET_MINUTE and __LL_RTC_GET_SECOND + * are available to get independently each parameter. + * @rmtoll TR HT LL_RTC_TIME_Get\n + * TR HU LL_RTC_TIME_Get\n + * TR MNT LL_RTC_TIME_Get\n + * TR MNU LL_RTC_TIME_Get\n + * TR ST LL_RTC_TIME_Get\n + * TR SU LL_RTC_TIME_Get + * @param RTCx RTC Instance + * @retval Combination of hours, minutes and seconds (Format: 0x00HHMMSS). + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_Get(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->TR, (RTC_TR_HT | RTC_TR_HU | RTC_TR_MNT | RTC_TR_MNU | RTC_TR_ST | RTC_TR_SU)); + return (uint32_t)((((((temp & RTC_TR_HT) >> RTC_TR_HT_Pos) << 4U) | ((temp & RTC_TR_HU) >> RTC_TR_HU_Pos)) << RTC_OFFSET_HOUR) | \ + (((((temp & RTC_TR_MNT) >> RTC_TR_MNT_Pos) << 4U) | ((temp & RTC_TR_MNU) >> RTC_TR_MNU_Pos)) << RTC_OFFSET_MINUTE) | \ + ((((temp & RTC_TR_ST) >> RTC_TR_ST_Pos) << 4U) | ((temp & RTC_TR_SU) >> RTC_TR_SU_Pos))); +} + +/** + * @brief Memorize whether the daylight saving time change has been performed + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR BKP LL_RTC_TIME_EnableDayLightStore + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_EnableDayLightStore(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_BKP); +} + +/** + * @brief Disable memorization whether the daylight saving time change has been performed. + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR BKP LL_RTC_TIME_DisableDayLightStore + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_DisableDayLightStore(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_BKP); +} + +/** + * @brief Check if RTC Day Light Saving stored operation has been enabled or not + * @rmtoll CR BKP LL_RTC_TIME_IsDayLightStoreEnabled + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_IsDayLightStoreEnabled(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_BKP) == (RTC_CR_BKP)); +} + +/** + * @brief Subtract 1 hour (winter time change) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR SUB1H LL_RTC_TIME_DecHour + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_DecHour(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_SUB1H); +} + +/** + * @brief Add 1 hour (summer time change) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ADD1H LL_RTC_TIME_IncHour + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_IncHour(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_ADD1H); +} + +/** + * @brief Get Sub second value in the synchronous prescaler counter. + * @note You can use both SubSeconds value and SecondFraction (PREDIV_S through + * LL_RTC_GetSynchPrescaler function) terms returned to convert Calendar + * SubSeconds value in second fraction ratio with time unit following + * generic formula: + * ==> Seconds fraction ratio * time_unit= [(SecondFraction-SubSeconds)/(SecondFraction+1)] * time_unit + * This conversion can be performed only if no shift operation is pending + * (ie. SHFP=0) when PREDIV_S >= SS. + * @rmtoll SSR SS LL_RTC_TIME_GetSubSecond + * @param RTCx RTC Instance + * @retval Sub second value (number between 0 and 65535) + */ +__STATIC_INLINE uint32_t LL_RTC_TIME_GetSubSecond(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->SSR, RTC_SSR_SS)); +} + +/** + * @brief Synchronize to a remote clock with a high degree of precision. + * @note This operation effectively subtracts from (delays) or advance the clock of a fraction of a second. + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note When REFCKON is set, firmware must not write to Shift control register. + * @rmtoll SHIFTR ADD1S LL_RTC_TIME_Synchronize\n + * SHIFTR SUBFS LL_RTC_TIME_Synchronize + * @param RTCx RTC Instance + * @param ShiftSecond This parameter can be one of the following values: + * @arg @ref LL_RTC_SHIFT_SECOND_DELAY + * @arg @ref LL_RTC_SHIFT_SECOND_ADVANCE + * @param Fraction Number of Seconds Fractions (any value from 0 to 0x7FFF) + * @retval None + */ +__STATIC_INLINE void LL_RTC_TIME_Synchronize(RTC_TypeDef *RTCx, uint32_t ShiftSecond, uint32_t Fraction) +{ + WRITE_REG(RTCx->SHIFTR, ShiftSecond | Fraction); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Date Date + * @{ + */ + +/** + * @brief Set Year in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Year from binary to BCD format + * @rmtoll DR YT LL_RTC_DATE_SetYear\n + * DR YU LL_RTC_DATE_SetYear + * @param RTCx RTC Instance + * @param Year Value between Min_Data=0x00 and Max_Data=0x99 + * @retval None + */ +__STATIC_INLINE void LL_RTC_DATE_SetYear(RTC_TypeDef *RTCx, uint32_t Year) +{ + MODIFY_REG(RTCx->DR, (RTC_DR_YT | RTC_DR_YU), + (((Year & 0xF0U) << (RTC_DR_YT_Pos - 4U)) | ((Year & 0x0FU) << RTC_DR_YU_Pos))); +} + +/** + * @brief Get Year in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Year from BCD to Binary format + * @rmtoll DR YT LL_RTC_DATE_GetYear\n + * DR YU LL_RTC_DATE_GetYear + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x99 + */ +__STATIC_INLINE uint32_t LL_RTC_DATE_GetYear(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->DR, (RTC_DR_YT | RTC_DR_YU)); + return (uint32_t)((((temp & RTC_DR_YT) >> RTC_DR_YT_Pos) << 4U) | ((temp & RTC_DR_YU) >> RTC_DR_YU_Pos)); +} + +/** + * @brief Set Week day + * @rmtoll DR WDU LL_RTC_DATE_SetWeekDay + * @param RTCx RTC Instance + * @param WeekDay This parameter can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + * @retval None + */ +__STATIC_INLINE void LL_RTC_DATE_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay) +{ + MODIFY_REG(RTCx->DR, RTC_DR_WDU, WeekDay << RTC_DR_WDU_Pos); +} + +/** + * @brief Get Week day + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @rmtoll DR WDU LL_RTC_DATE_GetWeekDay + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + */ +__STATIC_INLINE uint32_t LL_RTC_DATE_GetWeekDay(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->DR, RTC_DR_WDU) >> RTC_DR_WDU_Pos); +} + +/** + * @brief Set Month in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Month from binary to BCD format + * @rmtoll DR MT LL_RTC_DATE_SetMonth\n + * DR MU LL_RTC_DATE_SetMonth + * @param RTCx RTC Instance + * @param Month This parameter can be one of the following values: + * @arg @ref LL_RTC_MONTH_JANUARY + * @arg @ref LL_RTC_MONTH_FEBRUARY + * @arg @ref LL_RTC_MONTH_MARCH + * @arg @ref LL_RTC_MONTH_APRIL + * @arg @ref LL_RTC_MONTH_MAY + * @arg @ref LL_RTC_MONTH_JUNE + * @arg @ref LL_RTC_MONTH_JULY + * @arg @ref LL_RTC_MONTH_AUGUST + * @arg @ref LL_RTC_MONTH_SEPTEMBER + * @arg @ref LL_RTC_MONTH_OCTOBER + * @arg @ref LL_RTC_MONTH_NOVEMBER + * @arg @ref LL_RTC_MONTH_DECEMBER + * @retval None + */ +__STATIC_INLINE void LL_RTC_DATE_SetMonth(RTC_TypeDef *RTCx, uint32_t Month) +{ + MODIFY_REG(RTCx->DR, (RTC_DR_MT | RTC_DR_MU), + (((Month & 0xF0U) << (RTC_DR_MT_Pos - 4U)) | ((Month & 0x0FU) << RTC_DR_MU_Pos))); +} + +/** + * @brief Get Month in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Month from BCD to Binary format + * @rmtoll DR MT LL_RTC_DATE_GetMonth\n + * DR MU LL_RTC_DATE_GetMonth + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_MONTH_JANUARY + * @arg @ref LL_RTC_MONTH_FEBRUARY + * @arg @ref LL_RTC_MONTH_MARCH + * @arg @ref LL_RTC_MONTH_APRIL + * @arg @ref LL_RTC_MONTH_MAY + * @arg @ref LL_RTC_MONTH_JUNE + * @arg @ref LL_RTC_MONTH_JULY + * @arg @ref LL_RTC_MONTH_AUGUST + * @arg @ref LL_RTC_MONTH_SEPTEMBER + * @arg @ref LL_RTC_MONTH_OCTOBER + * @arg @ref LL_RTC_MONTH_NOVEMBER + * @arg @ref LL_RTC_MONTH_DECEMBER + */ +__STATIC_INLINE uint32_t LL_RTC_DATE_GetMonth(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->DR, (RTC_DR_MT | RTC_DR_MU)); + return (uint32_t)((((temp & RTC_DR_MT) >> RTC_DR_MT_Pos) << 4U) | ((temp & RTC_DR_MU) >> RTC_DR_MU_Pos)); +} + +/** + * @brief Set Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Day from binary to BCD format + * @rmtoll DR DT LL_RTC_DATE_SetDay\n + * DR DU LL_RTC_DATE_SetDay + * @param RTCx RTC Instance + * @param Day Value between Min_Data=0x01 and Max_Data=0x31 + * @retval None + */ +__STATIC_INLINE void LL_RTC_DATE_SetDay(RTC_TypeDef *RTCx, uint32_t Day) +{ + MODIFY_REG(RTCx->DR, (RTC_DR_DT | RTC_DR_DU), + (((Day & 0xF0U) << (RTC_DR_DT_Pos - 4U)) | ((Day & 0x0FU) << RTC_DR_DU_Pos))); +} + +/** + * @brief Get Day in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Day from BCD to Binary format + * @rmtoll DR DT LL_RTC_DATE_GetDay\n + * DR DU LL_RTC_DATE_GetDay + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x31 + */ +__STATIC_INLINE uint32_t LL_RTC_DATE_GetDay(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->DR, (RTC_DR_DT | RTC_DR_DU)); + return (uint32_t)((((temp & RTC_DR_DT) >> RTC_DR_DT_Pos) << 4U) | ((temp & RTC_DR_DU) >> RTC_DR_DU_Pos)); +} + +/** + * @brief Set date (WeekDay, Day, Month and Year) in BCD format + * @rmtoll DR WDU LL_RTC_DATE_Config\n + * DR MT LL_RTC_DATE_Config\n + * DR MU LL_RTC_DATE_Config\n + * DR DT LL_RTC_DATE_Config\n + * DR DU LL_RTC_DATE_Config\n + * DR YT LL_RTC_DATE_Config\n + * DR YU LL_RTC_DATE_Config + * @param RTCx RTC Instance + * @param WeekDay This parameter can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + * @param Day Value between Min_Data=0x01 and Max_Data=0x31 + * @param Month This parameter can be one of the following values: + * @arg @ref LL_RTC_MONTH_JANUARY + * @arg @ref LL_RTC_MONTH_FEBRUARY + * @arg @ref LL_RTC_MONTH_MARCH + * @arg @ref LL_RTC_MONTH_APRIL + * @arg @ref LL_RTC_MONTH_MAY + * @arg @ref LL_RTC_MONTH_JUNE + * @arg @ref LL_RTC_MONTH_JULY + * @arg @ref LL_RTC_MONTH_AUGUST + * @arg @ref LL_RTC_MONTH_SEPTEMBER + * @arg @ref LL_RTC_MONTH_OCTOBER + * @arg @ref LL_RTC_MONTH_NOVEMBER + * @arg @ref LL_RTC_MONTH_DECEMBER + * @param Year Value between Min_Data=0x00 and Max_Data=0x99 + * @retval None + */ +__STATIC_INLINE void LL_RTC_DATE_Config(RTC_TypeDef *RTCx, uint32_t WeekDay, uint32_t Day, uint32_t Month, uint32_t Year) +{ + register uint32_t temp = 0U; + + temp = (WeekDay << RTC_DR_WDU_Pos) | \ + (((Year & 0xF0U) << (RTC_DR_YT_Pos - 4U)) | ((Year & 0x0FU) << RTC_DR_YU_Pos)) | \ + (((Month & 0xF0U) << (RTC_DR_MT_Pos - 4U)) | ((Month & 0x0FU) << RTC_DR_MU_Pos)) | \ + (((Day & 0xF0U) << (RTC_DR_DT_Pos - 4U)) | ((Day & 0x0FU) << RTC_DR_DU_Pos)); + + MODIFY_REG(RTCx->DR, (RTC_DR_WDU | RTC_DR_MT | RTC_DR_MU | RTC_DR_DT | RTC_DR_DU | RTC_DR_YT | RTC_DR_YU), temp); +} + +/** + * @brief Get date (WeekDay, Day, Month and Year) in BCD format + * @note if shadow mode is disabled (BYPSHAD=0), need to check if RSF flag is set + * before reading this bit + * @note helper macros __LL_RTC_GET_WEEKDAY, __LL_RTC_GET_YEAR, __LL_RTC_GET_MONTH, + * and __LL_RTC_GET_DAY are available to get independently each parameter. + * @rmtoll DR WDU LL_RTC_DATE_Get\n + * DR MT LL_RTC_DATE_Get\n + * DR MU LL_RTC_DATE_Get\n + * DR DT LL_RTC_DATE_Get\n + * DR DU LL_RTC_DATE_Get\n + * DR YT LL_RTC_DATE_Get\n + * DR YU LL_RTC_DATE_Get + * @param RTCx RTC Instance + * @retval Combination of WeekDay, Day, Month and Year (Format: 0xWWDDMMYY). + */ +__STATIC_INLINE uint32_t LL_RTC_DATE_Get(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->DR, (RTC_DR_WDU | RTC_DR_MT | RTC_DR_MU | RTC_DR_DT | RTC_DR_DU | RTC_DR_YT | RTC_DR_YU)); + return (uint32_t)((((temp & RTC_DR_WDU) >> RTC_DR_WDU_Pos) << RTC_OFFSET_WEEKDAY) | \ + (((((temp & RTC_DR_DT) >> RTC_DR_DT_Pos) << 4U) | ((temp & RTC_DR_DU) >> RTC_DR_DU_Pos)) << RTC_OFFSET_DAY) | \ + (((((temp & RTC_DR_MT) >> RTC_DR_MT_Pos) << 4U) | ((temp & RTC_DR_MU) >> RTC_DR_MU_Pos)) << RTC_OFFSET_MONTH) | \ + ((((temp & RTC_DR_YT) >> RTC_DR_YT_Pos) << 4U) | ((temp & RTC_DR_YU) >> RTC_DR_YU_Pos))); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_ALARMA ALARMA + * @{ + */ + +/** + * @brief Enable Alarm A + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRAE LL_RTC_ALMA_Enable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_Enable(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_ALRAE); +} + +/** + * @brief Disable Alarm A + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRAE LL_RTC_ALMA_Disable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_Disable(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_ALRAE); +} + +/** + * @brief Specify the Alarm A masks. + * @rmtoll ALRMAR MSK4 LL_RTC_ALMA_SetMask\n + * ALRMAR MSK3 LL_RTC_ALMA_SetMask\n + * ALRMAR MSK2 LL_RTC_ALMA_SetMask\n + * ALRMAR MSK1 LL_RTC_ALMA_SetMask + * @param RTCx RTC Instance + * @param Mask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_ALMA_MASK_NONE + * @arg @ref LL_RTC_ALMA_MASK_DATEWEEKDAY + * @arg @ref LL_RTC_ALMA_MASK_HOURS + * @arg @ref LL_RTC_ALMA_MASK_MINUTES + * @arg @ref LL_RTC_ALMA_MASK_SECONDS + * @arg @ref LL_RTC_ALMA_MASK_ALL + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetMask(RTC_TypeDef *RTCx, uint32_t Mask) +{ + MODIFY_REG(RTCx->ALRMAR, RTC_ALRMAR_MSK4 | RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2 | RTC_ALRMAR_MSK1, Mask); +} + +/** + * @brief Get the Alarm A masks. + * @rmtoll ALRMAR MSK4 LL_RTC_ALMA_GetMask\n + * ALRMAR MSK3 LL_RTC_ALMA_GetMask\n + * ALRMAR MSK2 LL_RTC_ALMA_GetMask\n + * ALRMAR MSK1 LL_RTC_ALMA_GetMask + * @param RTCx RTC Instance + * @retval Returned value can be can be a combination of the following values: + * @arg @ref LL_RTC_ALMA_MASK_NONE + * @arg @ref LL_RTC_ALMA_MASK_DATEWEEKDAY + * @arg @ref LL_RTC_ALMA_MASK_HOURS + * @arg @ref LL_RTC_ALMA_MASK_MINUTES + * @arg @ref LL_RTC_ALMA_MASK_SECONDS + * @arg @ref LL_RTC_ALMA_MASK_ALL + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetMask(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMAR, RTC_ALRMAR_MSK4 | RTC_ALRMAR_MSK3 | RTC_ALRMAR_MSK2 | RTC_ALRMAR_MSK1)); +} + +/** + * @brief Enable AlarmA Week day selection (DU[3:0] represents the week day. DT[1:0] is do not care) + * @rmtoll ALRMAR WDSEL LL_RTC_ALMA_EnableWeekday + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_EnableWeekday(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->ALRMAR, RTC_ALRMAR_WDSEL); +} + +/** + * @brief Disable AlarmA Week day selection (DU[3:0] represents the date ) + * @rmtoll ALRMAR WDSEL LL_RTC_ALMA_DisableWeekday + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_DisableWeekday(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->ALRMAR, RTC_ALRMAR_WDSEL); +} + +/** + * @brief Set ALARM A Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Day from binary to BCD format + * @rmtoll ALRMAR DT LL_RTC_ALMA_SetDay\n + * ALRMAR DU LL_RTC_ALMA_SetDay + * @param RTCx RTC Instance + * @param Day Value between Min_Data=0x01 and Max_Data=0x31 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetDay(RTC_TypeDef *RTCx, uint32_t Day) +{ + MODIFY_REG(RTCx->ALRMAR, (RTC_ALRMAR_DT | RTC_ALRMAR_DU), + (((Day & 0xF0U) << (RTC_ALRMAR_DT_Pos - 4U)) | ((Day & 0x0FU) << RTC_ALRMAR_DU_Pos))); +} + +/** + * @brief Get ALARM A Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Day from BCD to Binary format + * @rmtoll ALRMAR DT LL_RTC_ALMA_GetDay\n + * ALRMAR DU LL_RTC_ALMA_GetDay + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x31 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetDay(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMAR, (RTC_ALRMAR_DT | RTC_ALRMAR_DU)); + return (uint32_t)((((temp & RTC_ALRMAR_DT) >> RTC_ALRMAR_DT_Pos) << 4U) | ((temp & RTC_ALRMAR_DU) >> RTC_ALRMAR_DU_Pos)); +} + +/** + * @brief Set ALARM A Weekday + * @rmtoll ALRMAR DU LL_RTC_ALMA_SetWeekDay + * @param RTCx RTC Instance + * @param WeekDay This parameter can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay) +{ + MODIFY_REG(RTCx->ALRMAR, RTC_ALRMAR_DU, WeekDay << RTC_ALRMAR_DU_Pos); +} + +/** + * @brief Get ALARM A Weekday + * @rmtoll ALRMAR DU LL_RTC_ALMA_GetWeekDay + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetWeekDay(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMAR, RTC_ALRMAR_DU) >> RTC_ALRMAR_DU_Pos); +} + +/** + * @brief Set Alarm A time format (AM/24-hour or PM notation) + * @rmtoll ALRMAR PM LL_RTC_ALMA_SetTimeFormat + * @param RTCx RTC Instance + * @param TimeFormat This parameter can be one of the following values: + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_PM + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetTimeFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat) +{ + MODIFY_REG(RTCx->ALRMAR, RTC_ALRMAR_PM, TimeFormat); +} + +/** + * @brief Get Alarm A time format (AM or PM notation) + * @rmtoll ALRMAR PM LL_RTC_ALMA_GetTimeFormat + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_PM + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetTimeFormat(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMAR, RTC_ALRMAR_PM)); +} + +/** + * @brief Set ALARM A Hours in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Hours from binary to BCD format + * @rmtoll ALRMAR HT LL_RTC_ALMA_SetHour\n + * ALRMAR HU LL_RTC_ALMA_SetHour + * @param RTCx RTC Instance + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetHour(RTC_TypeDef *RTCx, uint32_t Hours) +{ + MODIFY_REG(RTCx->ALRMAR, (RTC_ALRMAR_HT | RTC_ALRMAR_HU), + (((Hours & 0xF0U) << (RTC_ALRMAR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_ALRMAR_HU_Pos))); +} + +/** + * @brief Get ALARM A Hours in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Hours from BCD to Binary format + * @rmtoll ALRMAR HT LL_RTC_ALMA_GetHour\n + * ALRMAR HU LL_RTC_ALMA_GetHour + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetHour(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMAR, (RTC_ALRMAR_HT | RTC_ALRMAR_HU)); + return (uint32_t)((((temp & RTC_ALRMAR_HT) >> RTC_ALRMAR_HT_Pos) << 4U) | ((temp & RTC_ALRMAR_HU) >> RTC_ALRMAR_HU_Pos)); +} + +/** + * @brief Set ALARM A Minutes in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Minutes from binary to BCD format + * @rmtoll ALRMAR MNT LL_RTC_ALMA_SetMinute\n + * ALRMAR MNU LL_RTC_ALMA_SetMinute + * @param RTCx RTC Instance + * @param Minutes Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes) +{ + MODIFY_REG(RTCx->ALRMAR, (RTC_ALRMAR_MNT | RTC_ALRMAR_MNU), + (((Minutes & 0xF0U) << (RTC_ALRMAR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_ALRMAR_MNU_Pos))); +} + +/** + * @brief Get ALARM A Minutes in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Minutes from BCD to Binary format + * @rmtoll ALRMAR MNT LL_RTC_ALMA_GetMinute\n + * ALRMAR MNU LL_RTC_ALMA_GetMinute + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetMinute(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMAR, (RTC_ALRMAR_MNT | RTC_ALRMAR_MNU)); + return (uint32_t)((((temp & RTC_ALRMAR_MNT) >> RTC_ALRMAR_MNT_Pos) << 4U) | ((temp & RTC_ALRMAR_MNU) >> RTC_ALRMAR_MNU_Pos)); +} + +/** + * @brief Set ALARM A Seconds in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Seconds from binary to BCD format + * @rmtoll ALRMAR ST LL_RTC_ALMA_SetSecond\n + * ALRMAR SU LL_RTC_ALMA_SetSecond + * @param RTCx RTC Instance + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds) +{ + MODIFY_REG(RTCx->ALRMAR, (RTC_ALRMAR_ST | RTC_ALRMAR_SU), + (((Seconds & 0xF0U) << (RTC_ALRMAR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_ALRMAR_SU_Pos))); +} + +/** + * @brief Get ALARM A Seconds in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Seconds from BCD to Binary format + * @rmtoll ALRMAR ST LL_RTC_ALMA_GetSecond\n + * ALRMAR SU LL_RTC_ALMA_GetSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetSecond(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMAR, (RTC_ALRMAR_ST | RTC_ALRMAR_SU)); + return (uint32_t)((((temp & RTC_ALRMAR_ST) >> RTC_ALRMAR_ST_Pos) << 4U) | ((temp & RTC_ALRMAR_SU) >> RTC_ALRMAR_SU_Pos)); +} + +/** + * @brief Set Alarm A Time (hour, minute and second) in BCD format + * @rmtoll ALRMAR PM LL_RTC_ALMA_ConfigTime\n + * ALRMAR HT LL_RTC_ALMA_ConfigTime\n + * ALRMAR HU LL_RTC_ALMA_ConfigTime\n + * ALRMAR MNT LL_RTC_ALMA_ConfigTime\n + * ALRMAR MNU LL_RTC_ALMA_ConfigTime\n + * ALRMAR ST LL_RTC_ALMA_ConfigTime\n + * ALRMAR SU LL_RTC_ALMA_ConfigTime + * @param RTCx RTC Instance + * @param Format12_24 This parameter can be one of the following values: + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMA_TIME_FORMAT_PM + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @param Minutes Value between Min_Data=0x00 and Max_Data=0x59 + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_ConfigTime(RTC_TypeDef *RTCx, uint32_t Format12_24, uint32_t Hours, uint32_t Minutes, uint32_t Seconds) +{ + register uint32_t temp = 0U; + + temp = Format12_24 | (((Hours & 0xF0U) << (RTC_ALRMAR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_ALRMAR_HU_Pos)) | \ + (((Minutes & 0xF0U) << (RTC_ALRMAR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_ALRMAR_MNU_Pos)) | \ + (((Seconds & 0xF0U) << (RTC_ALRMAR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_ALRMAR_SU_Pos)); + + MODIFY_REG(RTCx->ALRMAR, RTC_ALRMAR_PM | RTC_ALRMAR_HT | RTC_ALRMAR_HU | RTC_ALRMAR_MNT | RTC_ALRMAR_MNU | RTC_ALRMAR_ST | RTC_ALRMAR_SU, temp); +} + +/** + * @brief Get Alarm B Time (hour, minute and second) in BCD format + * @note helper macros __LL_RTC_GET_HOUR, __LL_RTC_GET_MINUTE and __LL_RTC_GET_SECOND + * are available to get independently each parameter. + * @rmtoll ALRMAR HT LL_RTC_ALMA_GetTime\n + * ALRMAR HU LL_RTC_ALMA_GetTime\n + * ALRMAR MNT LL_RTC_ALMA_GetTime\n + * ALRMAR MNU LL_RTC_ALMA_GetTime\n + * ALRMAR ST LL_RTC_ALMA_GetTime\n + * ALRMAR SU LL_RTC_ALMA_GetTime + * @param RTCx RTC Instance + * @retval Combination of hours, minutes and seconds. + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetTime(RTC_TypeDef *RTCx) +{ + return (uint32_t)((LL_RTC_ALMA_GetHour(RTCx) << RTC_OFFSET_HOUR) | (LL_RTC_ALMA_GetMinute(RTCx) << RTC_OFFSET_MINUTE) | LL_RTC_ALMA_GetSecond(RTCx)); +} + +/** + * @brief Set Alarm A Mask the most-significant bits starting at this bit + * @note This register can be written only when ALRAE is reset in RTC_CR register, + * or in initialization mode. + * @rmtoll ALRMASSR MASKSS LL_RTC_ALMA_SetSubSecondMask + * @param RTCx RTC Instance + * @param Mask Value between Min_Data=0x00 and Max_Data=0xF + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetSubSecondMask(RTC_TypeDef *RTCx, uint32_t Mask) +{ + MODIFY_REG(RTCx->ALRMASSR, RTC_ALRMASSR_MASKSS, Mask << RTC_ALRMASSR_MASKSS_Pos); +} + +/** + * @brief Get Alarm A Mask the most-significant bits starting at this bit + * @rmtoll ALRMASSR MASKSS LL_RTC_ALMA_GetSubSecondMask + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetSubSecondMask(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMASSR, RTC_ALRMASSR_MASKSS) >> RTC_ALRMASSR_MASKSS_Pos); +} + +/** + * @brief Set Alarm A Sub seconds value + * @rmtoll ALRMASSR SS LL_RTC_ALMA_SetSubSecond + * @param RTCx RTC Instance + * @param Subsecond Value between Min_Data=0x00 and Max_Data=0x7FFF + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMA_SetSubSecond(RTC_TypeDef *RTCx, uint32_t Subsecond) +{ + MODIFY_REG(RTCx->ALRMASSR, RTC_ALRMASSR_SS, Subsecond); +} + +/** + * @brief Get Alarm A Sub seconds value + * @rmtoll ALRMASSR SS LL_RTC_ALMA_GetSubSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x7FFF + */ +__STATIC_INLINE uint32_t LL_RTC_ALMA_GetSubSecond(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMASSR, RTC_ALRMASSR_SS)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_ALARMB ALARMB + * @{ + */ + +/** + * @brief Enable Alarm B + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRBE LL_RTC_ALMB_Enable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_Enable(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_ALRBE); +} + +/** + * @brief Disable Alarm B + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRBE LL_RTC_ALMB_Disable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_Disable(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_ALRBE); +} + +/** + * @brief Specify the Alarm B masks. + * @rmtoll ALRMBR MSK4 LL_RTC_ALMB_SetMask\n + * ALRMBR MSK3 LL_RTC_ALMB_SetMask\n + * ALRMBR MSK2 LL_RTC_ALMB_SetMask\n + * ALRMBR MSK1 LL_RTC_ALMB_SetMask + * @param RTCx RTC Instance + * @param Mask This parameter can be a combination of the following values: + * @arg @ref LL_RTC_ALMB_MASK_NONE + * @arg @ref LL_RTC_ALMB_MASK_DATEWEEKDAY + * @arg @ref LL_RTC_ALMB_MASK_HOURS + * @arg @ref LL_RTC_ALMB_MASK_MINUTES + * @arg @ref LL_RTC_ALMB_MASK_SECONDS + * @arg @ref LL_RTC_ALMB_MASK_ALL + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetMask(RTC_TypeDef *RTCx, uint32_t Mask) +{ + MODIFY_REG(RTCx->ALRMBR, RTC_ALRMBR_MSK4 | RTC_ALRMBR_MSK3 | RTC_ALRMBR_MSK2 | RTC_ALRMBR_MSK1, Mask); +} + +/** + * @brief Get the Alarm B masks. + * @rmtoll ALRMBR MSK4 LL_RTC_ALMB_GetMask\n + * ALRMBR MSK3 LL_RTC_ALMB_GetMask\n + * ALRMBR MSK2 LL_RTC_ALMB_GetMask\n + * ALRMBR MSK1 LL_RTC_ALMB_GetMask + * @param RTCx RTC Instance + * @retval Returned value can be can be a combination of the following values: + * @arg @ref LL_RTC_ALMB_MASK_NONE + * @arg @ref LL_RTC_ALMB_MASK_DATEWEEKDAY + * @arg @ref LL_RTC_ALMB_MASK_HOURS + * @arg @ref LL_RTC_ALMB_MASK_MINUTES + * @arg @ref LL_RTC_ALMB_MASK_SECONDS + * @arg @ref LL_RTC_ALMB_MASK_ALL + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetMask(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMBR, RTC_ALRMBR_MSK4 | RTC_ALRMBR_MSK3 | RTC_ALRMBR_MSK2 | RTC_ALRMBR_MSK1)); +} + +/** + * @brief Enable AlarmB Week day selection (DU[3:0] represents the week day. DT[1:0] is do not care) + * @rmtoll ALRMBR WDSEL LL_RTC_ALMB_EnableWeekday + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_EnableWeekday(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->ALRMBR, RTC_ALRMBR_WDSEL); +} + +/** + * @brief Disable AlarmB Week day selection (DU[3:0] represents the date ) + * @rmtoll ALRMBR WDSEL LL_RTC_ALMB_DisableWeekday + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_DisableWeekday(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->ALRMBR, RTC_ALRMBR_WDSEL); +} + +/** + * @brief Set ALARM B Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Day from binary to BCD format + * @rmtoll ALRMBR DT LL_RTC_ALMB_SetDay\n + * ALRMBR DU LL_RTC_ALMB_SetDay + * @param RTCx RTC Instance + * @param Day Value between Min_Data=0x01 and Max_Data=0x31 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetDay(RTC_TypeDef *RTCx, uint32_t Day) +{ + MODIFY_REG(RTC->ALRMBR, (RTC_ALRMBR_DT | RTC_ALRMBR_DU), + (((Day & 0xF0U) << (RTC_ALRMBR_DT_Pos - 4U)) | ((Day & 0x0FU) << RTC_ALRMBR_DU_Pos))); +} + +/** + * @brief Get ALARM B Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Day from BCD to Binary format + * @rmtoll ALRMBR DT LL_RTC_ALMB_GetDay\n + * ALRMBR DU LL_RTC_ALMB_GetDay + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x31 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetDay(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMBR, (RTC_ALRMBR_DT | RTC_ALRMBR_DU)); + return (uint32_t)((((temp & RTC_ALRMBR_DT) >> RTC_ALRMBR_DT_Pos) << 4U) | ((temp & RTC_ALRMBR_DU) >> RTC_ALRMBR_DU_Pos)); +} + +/** + * @brief Set ALARM B Weekday + * @rmtoll ALRMBR DU LL_RTC_ALMB_SetWeekDay + * @param RTCx RTC Instance + * @param WeekDay This parameter can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetWeekDay(RTC_TypeDef *RTCx, uint32_t WeekDay) +{ + MODIFY_REG(RTCx->ALRMBR, RTC_ALRMBR_DU, WeekDay << RTC_ALRMBR_DU_Pos); +} + +/** + * @brief Get ALARM B Weekday + * @rmtoll ALRMBR DU LL_RTC_ALMB_GetWeekDay + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetWeekDay(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMBR, RTC_ALRMBR_DU) >> RTC_ALRMBR_DU_Pos); +} + +/** + * @brief Set ALARM B time format (AM/24-hour or PM notation) + * @rmtoll ALRMBR PM LL_RTC_ALMB_SetTimeFormat + * @param RTCx RTC Instance + * @param TimeFormat This parameter can be one of the following values: + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_PM + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetTimeFormat(RTC_TypeDef *RTCx, uint32_t TimeFormat) +{ + MODIFY_REG(RTCx->ALRMBR, RTC_ALRMBR_PM, TimeFormat); +} + +/** + * @brief Get ALARM B time format (AM or PM notation) + * @rmtoll ALRMBR PM LL_RTC_ALMB_GetTimeFormat + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_PM + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetTimeFormat(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMBR, RTC_ALRMBR_PM)); +} + +/** + * @brief Set ALARM B Hours in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Hours from binary to BCD format + * @rmtoll ALRMBR HT LL_RTC_ALMB_SetHour\n + * ALRMBR HU LL_RTC_ALMB_SetHour + * @param RTCx RTC Instance + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetHour(RTC_TypeDef *RTCx, uint32_t Hours) +{ + MODIFY_REG(RTCx->ALRMBR, (RTC_ALRMBR_HT | RTC_ALRMBR_HU), + (((Hours & 0xF0U) << (RTC_ALRMBR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_ALRMBR_HU_Pos))); +} + +/** + * @brief Get ALARM B Hours in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Hours from BCD to Binary format + * @rmtoll ALRMBR HT LL_RTC_ALMB_GetHour\n + * ALRMBR HU LL_RTC_ALMB_GetHour + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetHour(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMBR, (RTC_ALRMBR_HT | RTC_ALRMBR_HU)); + return (uint32_t)((((temp & RTC_ALRMBR_HT) >> RTC_ALRMBR_HT_Pos) << 4U) | ((temp & RTC_ALRMBR_HU) >> RTC_ALRMBR_HU_Pos)); +} + +/** + * @brief Set ALARM B Minutes in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Minutes from binary to BCD format + * @rmtoll ALRMBR MNT LL_RTC_ALMB_SetMinute\n + * ALRMBR MNU LL_RTC_ALMB_SetMinute + * @param RTCx RTC Instance + * @param Minutes between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetMinute(RTC_TypeDef *RTCx, uint32_t Minutes) +{ + MODIFY_REG(RTCx->ALRMBR, (RTC_ALRMBR_MNT | RTC_ALRMBR_MNU), + (((Minutes & 0xF0U) << (RTC_ALRMBR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_ALRMBR_MNU_Pos))); +} + +/** + * @brief Get ALARM B Minutes in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Minutes from BCD to Binary format + * @rmtoll ALRMBR MNT LL_RTC_ALMB_GetMinute\n + * ALRMBR MNU LL_RTC_ALMB_GetMinute + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetMinute(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMBR, (RTC_ALRMBR_MNT | RTC_ALRMBR_MNU)); + return (uint32_t)((((temp & RTC_ALRMBR_MNT) >> RTC_ALRMBR_MNT_Pos) << 4U) | ((temp & RTC_ALRMBR_MNU) >> RTC_ALRMBR_MNU_Pos)); +} + +/** + * @brief Set ALARM B Seconds in BCD format + * @note helper macro __LL_RTC_CONVERT_BIN2BCD is available to convert Seconds from binary to BCD format + * @rmtoll ALRMBR ST LL_RTC_ALMB_SetSecond\n + * ALRMBR SU LL_RTC_ALMB_SetSecond + * @param RTCx RTC Instance + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetSecond(RTC_TypeDef *RTCx, uint32_t Seconds) +{ + MODIFY_REG(RTCx->ALRMBR, (RTC_ALRMBR_ST | RTC_ALRMBR_SU), + (((Seconds & 0xF0U) << (RTC_ALRMBR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_ALRMBR_SU_Pos))); +} + +/** + * @brief Get ALARM B Seconds in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Seconds from BCD to Binary format + * @rmtoll ALRMBR ST LL_RTC_ALMB_GetSecond\n + * ALRMBR SU LL_RTC_ALMB_GetSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetSecond(RTC_TypeDef *RTCx) +{ + register uint32_t temp = 0U; + + temp = READ_BIT(RTCx->ALRMBR, (RTC_ALRMBR_ST | RTC_ALRMBR_SU)); + return (uint32_t)((((temp & RTC_ALRMBR_ST) >> RTC_ALRMBR_ST_Pos) << 4U) | ((temp & RTC_ALRMBR_SU) >> RTC_ALRMBR_SU_Pos)); +} + +/** + * @brief Set Alarm B Time (hour, minute and second) in BCD format + * @rmtoll ALRMBR PM LL_RTC_ALMB_ConfigTime\n + * ALRMBR HT LL_RTC_ALMB_ConfigTime\n + * ALRMBR HU LL_RTC_ALMB_ConfigTime\n + * ALRMBR MNT LL_RTC_ALMB_ConfigTime\n + * ALRMBR MNU LL_RTC_ALMB_ConfigTime\n + * ALRMBR ST LL_RTC_ALMB_ConfigTime\n + * ALRMBR SU LL_RTC_ALMB_ConfigTime + * @param RTCx RTC Instance + * @param Format12_24 This parameter can be one of the following values: + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_AM + * @arg @ref LL_RTC_ALMB_TIME_FORMAT_PM + * @param Hours Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + * @param Minutes Value between Min_Data=0x00 and Max_Data=0x59 + * @param Seconds Value between Min_Data=0x00 and Max_Data=0x59 + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_ConfigTime(RTC_TypeDef *RTCx, uint32_t Format12_24, uint32_t Hours, uint32_t Minutes, uint32_t Seconds) +{ + register uint32_t temp = 0U; + + temp = Format12_24 | (((Hours & 0xF0U) << (RTC_ALRMBR_HT_Pos - 4U)) | ((Hours & 0x0FU) << RTC_ALRMBR_HU_Pos)) | \ + (((Minutes & 0xF0U) << (RTC_ALRMBR_MNT_Pos - 4U)) | ((Minutes & 0x0FU) << RTC_ALRMBR_MNU_Pos)) | \ + (((Seconds & 0xF0U) << (RTC_ALRMBR_ST_Pos - 4U)) | ((Seconds & 0x0FU) << RTC_ALRMBR_SU_Pos)); + + MODIFY_REG(RTCx->ALRMBR, RTC_ALRMBR_PM| RTC_ALRMBR_HT | RTC_ALRMBR_HU | RTC_ALRMBR_MNT | RTC_ALRMBR_MNU | RTC_ALRMBR_ST | RTC_ALRMBR_SU, temp); +} + +/** + * @brief Get Alarm B Time (hour, minute and second) in BCD format + * @note helper macros __LL_RTC_GET_HOUR, __LL_RTC_GET_MINUTE and __LL_RTC_GET_SECOND + * are available to get independently each parameter. + * @rmtoll ALRMBR HT LL_RTC_ALMB_GetTime\n + * ALRMBR HU LL_RTC_ALMB_GetTime\n + * ALRMBR MNT LL_RTC_ALMB_GetTime\n + * ALRMBR MNU LL_RTC_ALMB_GetTime\n + * ALRMBR ST LL_RTC_ALMB_GetTime\n + * ALRMBR SU LL_RTC_ALMB_GetTime + * @param RTCx RTC Instance + * @retval Combination of hours, minutes and seconds. + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetTime(RTC_TypeDef *RTCx) +{ + return (uint32_t)((LL_RTC_ALMB_GetHour(RTCx) << RTC_OFFSET_HOUR) | (LL_RTC_ALMB_GetMinute(RTCx) << RTC_OFFSET_MINUTE) | LL_RTC_ALMB_GetSecond(RTCx)); +} + +/** + * @brief Set Alarm B Mask the most-significant bits starting at this bit + * @note This register can be written only when ALRBE is reset in RTC_CR register, + * or in initialization mode. + * @rmtoll ALRMBSSR MASKSS LL_RTC_ALMB_SetSubSecondMask + * @param RTCx RTC Instance + * @param Mask Value between Min_Data=0x00 and Max_Data=0xF + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetSubSecondMask(RTC_TypeDef *RTCx, uint32_t Mask) +{ + MODIFY_REG(RTCx->ALRMBSSR, RTC_ALRMBSSR_MASKSS, Mask << RTC_ALRMBSSR_MASKSS_Pos); +} + +/** + * @brief Get Alarm B Mask the most-significant bits starting at this bit + * @rmtoll ALRMBSSR MASKSS LL_RTC_ALMB_GetSubSecondMask + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetSubSecondMask(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMBSSR, RTC_ALRMBSSR_MASKSS) >> RTC_ALRMBSSR_MASKSS_Pos); +} + +/** + * @brief Set Alarm B Sub seconds value + * @rmtoll ALRMBSSR SS LL_RTC_ALMB_SetSubSecond + * @param RTCx RTC Instance + * @param Subsecond Value between Min_Data=0x00 and Max_Data=0x7FFF + * @retval None + */ +__STATIC_INLINE void LL_RTC_ALMB_SetSubSecond(RTC_TypeDef *RTCx, uint32_t Subsecond) +{ + MODIFY_REG(RTCx->ALRMBSSR, RTC_ALRMBSSR_SS, Subsecond); +} + +/** + * @brief Get Alarm B Sub seconds value + * @rmtoll ALRMBSSR SS LL_RTC_ALMB_GetSubSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x7FFF + */ +__STATIC_INLINE uint32_t LL_RTC_ALMB_GetSubSecond(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->ALRMBSSR, RTC_ALRMBSSR_SS)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Timestamp Timestamp + * @{ + */ + +/** + * @brief Enable Timestamp + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR TSE LL_RTC_TS_Enable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_Enable(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_TSE); +} + +/** + * @brief Disable Timestamp + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR TSE LL_RTC_TS_Disable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_Disable(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_TSE); +} + +/** + * @brief Set Time-stamp event active edge + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note TSE must be reset when TSEDGE is changed to avoid unwanted TSF setting + * @rmtoll CR TSEDGE LL_RTC_TS_SetActiveEdge + * @param RTCx RTC Instance + * @param Edge This parameter can be one of the following values: + * @arg @ref LL_RTC_TIMESTAMP_EDGE_RISING + * @arg @ref LL_RTC_TIMESTAMP_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_SetActiveEdge(RTC_TypeDef *RTCx, uint32_t Edge) +{ + MODIFY_REG(RTCx->CR, RTC_CR_TSEDGE, Edge); +} + +/** + * @brief Get Time-stamp event active edge + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR TSEDGE LL_RTC_TS_GetActiveEdge + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TIMESTAMP_EDGE_RISING + * @arg @ref LL_RTC_TIMESTAMP_EDGE_FALLING + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetActiveEdge(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_TSEDGE)); +} + +/** + * @brief Get Timestamp AM/PM notation (AM or 24-hour format) + * @rmtoll TSTR PM LL_RTC_TS_GetTimeFormat + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TS_TIME_FORMAT_AM + * @arg @ref LL_RTC_TS_TIME_FORMAT_PM + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetTimeFormat(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSTR, RTC_TSTR_PM)); +} + +/** + * @brief Get Timestamp Hours in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Hours from BCD to Binary format + * @rmtoll TSTR HT LL_RTC_TS_GetHour\n + * TSTR HU LL_RTC_TS_GetHour + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x12 or between Min_Data=0x00 and Max_Data=0x23 + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetHour(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSTR, RTC_TSTR_HT | RTC_TSTR_HU) >> RTC_TSTR_HU_Pos); +} + +/** + * @brief Get Timestamp Minutes in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Minutes from BCD to Binary format + * @rmtoll TSTR MNT LL_RTC_TS_GetMinute\n + * TSTR MNU LL_RTC_TS_GetMinute + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetMinute(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSTR, RTC_TSTR_MNT | RTC_TSTR_MNU) >> RTC_TSTR_MNU_Pos); +} + +/** + * @brief Get Timestamp Seconds in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Seconds from BCD to Binary format + * @rmtoll TSTR ST LL_RTC_TS_GetSecond\n + * TSTR SU LL_RTC_TS_GetSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x59 + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetSecond(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSTR, RTC_TSTR_ST | RTC_TSTR_SU)); +} + +/** + * @brief Get Timestamp time (hour, minute and second) in BCD format + * @note helper macros __LL_RTC_GET_HOUR, __LL_RTC_GET_MINUTE and __LL_RTC_GET_SECOND + * are available to get independently each parameter. + * @rmtoll TSTR HT LL_RTC_TS_GetTime\n + * TSTR HU LL_RTC_TS_GetTime\n + * TSTR MNT LL_RTC_TS_GetTime\n + * TSTR MNU LL_RTC_TS_GetTime\n + * TSTR ST LL_RTC_TS_GetTime\n + * TSTR SU LL_RTC_TS_GetTime + * @param RTCx RTC Instance + * @retval Combination of hours, minutes and seconds. + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetTime(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSTR, + RTC_TSTR_HT | RTC_TSTR_HU | RTC_TSTR_MNT | RTC_TSTR_MNU | RTC_TSTR_ST | RTC_TSTR_SU)); +} + +/** + * @brief Get Timestamp Week day + * @rmtoll TSDR WDU LL_RTC_TS_GetWeekDay + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WEEKDAY_MONDAY + * @arg @ref LL_RTC_WEEKDAY_TUESDAY + * @arg @ref LL_RTC_WEEKDAY_WEDNESDAY + * @arg @ref LL_RTC_WEEKDAY_THURSDAY + * @arg @ref LL_RTC_WEEKDAY_FRIDAY + * @arg @ref LL_RTC_WEEKDAY_SATURDAY + * @arg @ref LL_RTC_WEEKDAY_SUNDAY + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetWeekDay(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSDR, RTC_TSDR_WDU) >> RTC_TSDR_WDU_Pos); +} + +/** + * @brief Get Timestamp Month in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Month from BCD to Binary format + * @rmtoll TSDR MT LL_RTC_TS_GetMonth\n + * TSDR MU LL_RTC_TS_GetMonth + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_MONTH_JANUARY + * @arg @ref LL_RTC_MONTH_FEBRUARY + * @arg @ref LL_RTC_MONTH_MARCH + * @arg @ref LL_RTC_MONTH_APRIL + * @arg @ref LL_RTC_MONTH_MAY + * @arg @ref LL_RTC_MONTH_JUNE + * @arg @ref LL_RTC_MONTH_JULY + * @arg @ref LL_RTC_MONTH_AUGUST + * @arg @ref LL_RTC_MONTH_SEPTEMBER + * @arg @ref LL_RTC_MONTH_OCTOBER + * @arg @ref LL_RTC_MONTH_NOVEMBER + * @arg @ref LL_RTC_MONTH_DECEMBER + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetMonth(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSDR, RTC_TSDR_MT | RTC_TSDR_MU) >> RTC_TSDR_MU_Pos); +} + +/** + * @brief Get Timestamp Day in BCD format + * @note helper macro __LL_RTC_CONVERT_BCD2BIN is available to convert Day from BCD to Binary format + * @rmtoll TSDR DT LL_RTC_TS_GetDay\n + * TSDR DU LL_RTC_TS_GetDay + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x01 and Max_Data=0x31 + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetDay(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSDR, RTC_TSDR_DT | RTC_TSDR_DU)); +} + +/** + * @brief Get Timestamp date (WeekDay, Day and Month) in BCD format + * @note helper macros __LL_RTC_GET_WEEKDAY, __LL_RTC_GET_MONTH, + * and __LL_RTC_GET_DAY are available to get independently each parameter. + * @rmtoll TSDR WDU LL_RTC_TS_GetDate\n + * TSDR MT LL_RTC_TS_GetDate\n + * TSDR MU LL_RTC_TS_GetDate\n + * TSDR DT LL_RTC_TS_GetDate\n + * TSDR DU LL_RTC_TS_GetDate + * @param RTCx RTC Instance + * @retval Combination of Weekday, Day and Month + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetDate(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSDR, RTC_TSDR_WDU | RTC_TSDR_MT | RTC_TSDR_MU | RTC_TSDR_DT | RTC_TSDR_DU)); +} + +/** + * @brief Get time-stamp sub second value + * @rmtoll TSSSR SS LL_RTC_TS_GetSubSecond + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_RTC_TS_GetSubSecond(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TSSSR, RTC_TSSSR_SS)); +} + +#if defined(RTC_TAFCR_TAMPTS) +/** + * @brief Activate timestamp on tamper detection event + * @rmtoll TAFCR TAMPTS LL_RTC_TS_EnableOnTamper + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_EnableOnTamper(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPTS); +} + +/** + * @brief Disable timestamp on tamper detection event + * @rmtoll TAFCR TAMPTS LL_RTC_TS_DisableOnTamper + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_DisableOnTamper(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPTS); +} +#endif /* RTC_TAFCR_TAMPTS */ + +/** + * @brief Set timestamp Pin + * @rmtoll TAFCR TSINSEL LL_RTC_TS_SetPin + * @param RTCx RTC Instance + * @param TSPin: specifies the RTC TimeStamp Pin. + * This parameter can be one of the following values: + * @arg LL_RTC_TimeStampPin_Default: RTC_AF1 is used as RTC TimeStamp. + * @arg LL_RTC_TimeStampPin_Pos1: RTC_AF2 is selected as RTC TimeStamp. (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TS_SetPin(RTC_TypeDef *RTCx, uint32_t TSPin) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_TSINSEL , TSPin); +} + +/** + * @brief Get timestamp Pin + * @rmtoll TAFCR TSINSEL LL_RTC_TS_GetPin + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg LL_RTC_TimeStampPin_Default: RTC_AF1 is used as RTC TimeStamp Pin. + * @arg LL_RTC_TimeStampPin_Pos1: RTC_AF2 is selected as RTC TimeStamp Pin. (*) + * + * (*) value not defined in all devices. + * @retval None + */ + +__STATIC_INLINE uint32_t LL_RTC_TS_GetPin(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_TSINSEL)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Tamper Tamper + * @{ + */ + +/** + * @brief Enable RTC_TAMPx input detection + * @rmtoll TAFCR TAMP1E LL_RTC_TAMPER_Enable\n + * TAFCR TAMP2E LL_RTC_TAMPER_Enable\n + * @param RTCx RTC Instance + * @param Tamper This parameter can be a combination of the following values: + * @arg @ref LL_RTC_TAMPER_1 + * @arg @ref LL_RTC_TAMPER_2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_Enable(RTC_TypeDef *RTCx, uint32_t Tamper) +{ + SET_BIT(RTCx->TAFCR, Tamper); +} + +/** + * @brief Clear RTC_TAMPx input detection + * @rmtoll TAFCR TAMP1E LL_RTC_TAMPER_Disable\n + * TAFCR TAMP2E LL_RTC_TAMPER_Disable\n + * @param RTCx RTC Instance + * @param Tamper This parameter can be a combination of the following values: + * @arg @ref LL_RTC_TAMPER_1 + * @arg @ref LL_RTC_TAMPER_2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_Disable(RTC_TypeDef *RTCx, uint32_t Tamper) +{ + CLEAR_BIT(RTCx->TAFCR, Tamper); +} + +#if defined(RTC_TAFCR_TAMPPUDIS) +/** + * @brief Disable RTC_TAMPx pull-up disable (Disable precharge of RTC_TAMPx pins) + * @rmtoll TAFCR TAMPPUDIS LL_RTC_TAMPER_DisablePullUp + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_DisablePullUp(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPPUDIS); +} + +/** + * @brief Enable RTC_TAMPx pull-up disable ( Precharge RTC_TAMPx pins before sampling) + * @rmtoll TAFCR TAMPPUDIS LL_RTC_TAMPER_EnablePullUp + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_EnablePullUp(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPPUDIS); +} +#endif /* RTC_TAFCR_TAMPPUDIS */ + +#if defined(RTC_TAFCR_TAMPPRCH) +/** + * @brief Set RTC_TAMPx precharge duration + * @rmtoll TAFCR TAMPPRCH LL_RTC_TAMPER_SetPrecharge + * @param RTCx RTC Instance + * @param Duration This parameter can be one of the following values: + * @arg @ref LL_RTC_TAMPER_DURATION_1RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_2RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_4RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_8RTCCLK + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_SetPrecharge(RTC_TypeDef *RTCx, uint32_t Duration) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_TAMPPRCH, Duration); +} + +/** + * @brief Get RTC_TAMPx precharge duration + * @rmtoll TAFCR TAMPPRCH LL_RTC_TAMPER_GetPrecharge + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TAMPER_DURATION_1RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_2RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_4RTCCLK + * @arg @ref LL_RTC_TAMPER_DURATION_8RTCCLK + */ +__STATIC_INLINE uint32_t LL_RTC_TAMPER_GetPrecharge(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPPRCH)); +} +#endif /* RTC_TAFCR_TAMPPRCH */ + +#if defined(RTC_TAFCR_TAMPFLT) +/** + * @brief Set RTC_TAMPx filter count + * @rmtoll TAFCR TAMPFLT LL_RTC_TAMPER_SetFilterCount + * @param RTCx RTC Instance + * @param FilterCount This parameter can be one of the following values: + * @arg @ref LL_RTC_TAMPER_FILTER_DISABLE + * @arg @ref LL_RTC_TAMPER_FILTER_2SAMPLE + * @arg @ref LL_RTC_TAMPER_FILTER_4SAMPLE + * @arg @ref LL_RTC_TAMPER_FILTER_8SAMPLE + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_SetFilterCount(RTC_TypeDef *RTCx, uint32_t FilterCount) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_TAMPFLT, FilterCount); +} + +/** + * @brief Get RTC_TAMPx filter count + * @rmtoll TAFCR TAMPFLT LL_RTC_TAMPER_GetFilterCount + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TAMPER_FILTER_DISABLE + * @arg @ref LL_RTC_TAMPER_FILTER_2SAMPLE + * @arg @ref LL_RTC_TAMPER_FILTER_4SAMPLE + * @arg @ref LL_RTC_TAMPER_FILTER_8SAMPLE + */ +__STATIC_INLINE uint32_t LL_RTC_TAMPER_GetFilterCount(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPFLT)); +} +#endif /* RTC_TAFCR_TAMPFLT */ + +#if defined(RTC_TAFCR_TAMPFREQ) +/** + * @brief Set Tamper sampling frequency + * @rmtoll TAFCR TAMPFREQ LL_RTC_TAMPER_SetSamplingFreq + * @param RTCx RTC Instance + * @param SamplingFreq This parameter can be one of the following values: + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_32768 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_16384 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_8192 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_4096 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_2048 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_1024 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_512 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_256 + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_SetSamplingFreq(RTC_TypeDef *RTCx, uint32_t SamplingFreq) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_TAMPFREQ, SamplingFreq); +} + +/** + * @brief Get Tamper sampling frequency + * @rmtoll TAFCR TAMPFREQ LL_RTC_TAMPER_GetSamplingFreq + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_32768 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_16384 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_8192 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_4096 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_2048 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_1024 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_512 + * @arg @ref LL_RTC_TAMPER_SAMPLFREQDIV_256 + */ +__STATIC_INLINE uint32_t LL_RTC_TAMPER_GetSamplingFreq(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPFREQ)); +} +#endif /* RTC_TAFCR_TAMPFREQ */ + +/** + * @brief Enable Active level for Tamper input + * @rmtoll TAFCR TAMP1TRG LL_RTC_TAMPER_EnableActiveLevel\n + * TAFCR TAMP2TRG LL_RTC_TAMPER_EnableActiveLevel\n + * @param RTCx RTC Instance + * @param Tamper This parameter can be a combination of the following values: + * @arg @ref LL_RTC_TAMPER_ACTIVELEVEL_TAMP1 + * @arg @ref LL_RTC_TAMPER_ACTIVELEVEL_TAMP2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_EnableActiveLevel(RTC_TypeDef *RTCx, uint32_t Tamper) +{ + SET_BIT(RTCx->TAFCR, Tamper); +} + +/** + * @brief Disable Active level for Tamper input + * @rmtoll TAFCR TAMP1TRG LL_RTC_TAMPER_DisableActiveLevel\n + * TAFCR TAMP2TRG LL_RTC_TAMPER_DisableActiveLevel\n + * @param RTCx RTC Instance + * @param Tamper This parameter can be a combination of the following values: + * @arg @ref LL_RTC_TAMPER_ACTIVELEVEL_TAMP1 + * @arg @ref LL_RTC_TAMPER_ACTIVELEVEL_TAMP2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_DisableActiveLevel(RTC_TypeDef *RTCx, uint32_t Tamper) +{ + CLEAR_BIT(RTCx->TAFCR, Tamper); +} + +/** + * @brief Set Tamper Pin + * @rmtoll TAFCR TAMP1INSEL LL_RTC_TAMPER_SetPin + * @param RTCx RTC Instance + * @param TamperPin: specifies the RTC Tamper Pin. + * This parameter can be one of the following values: + * @arg LL_RTC_TamperPin_Default: RTC_AF1 is used as RTC Tamper. + * @arg LL_RTC_TamperPin_Pos1: RTC_AF2 is selected as RTC Tamper. (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RTC_TAMPER_SetPin(RTC_TypeDef *RTCx, uint32_t TamperPin) +{ + MODIFY_REG(RTCx->TAFCR, RTC_TAFCR_TAMP1INSEL , TamperPin); +} + +/** + * @brief Get Tamper Pin + * @rmtoll TAFCR TAMP1INSEL LL_RTC_TAMPER_GetPin + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg LL_RTC_TamperPin_Default: RTC_AF1 is used as RTC Tamper Pin. + * @arg LL_RTC_TamperPin_Pos1: RTC_AF2 is selected as RTC Tamper Pin. (*) + * + * (*) value not defined in all devices. + * @retval None + */ + +__STATIC_INLINE uint32_t LL_RTC_TAMPER_GetPin(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->TAFCR, RTC_TAFCR_TAMP1INSEL)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Wakeup Wakeup + * @{ + */ + +/** + * @brief Enable Wakeup timer + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR WUTE LL_RTC_WAKEUP_Enable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_WAKEUP_Enable(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_WUTE); +} + +/** + * @brief Disable Wakeup timer + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR WUTE LL_RTC_WAKEUP_Disable + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_WAKEUP_Disable(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_WUTE); +} + +/** + * @brief Check if Wakeup timer is enabled or not + * @rmtoll CR WUTE LL_RTC_WAKEUP_IsEnabled + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_WAKEUP_IsEnabled(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)); +} + +/** + * @brief Select Wakeup clock + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note Bit can be written only when RTC_CR WUTE bit = 0 and RTC_ISR WUTWF bit = 1 + * @rmtoll CR WUCKSEL LL_RTC_WAKEUP_SetClock + * @param RTCx RTC Instance + * @param WakeupClock This parameter can be one of the following values: + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_16 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_8 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_4 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_2 + * @arg @ref LL_RTC_WAKEUPCLOCK_CKSPRE + * @arg @ref LL_RTC_WAKEUPCLOCK_CKSPRE_WUT + * @retval None + */ +__STATIC_INLINE void LL_RTC_WAKEUP_SetClock(RTC_TypeDef *RTCx, uint32_t WakeupClock) +{ + MODIFY_REG(RTCx->CR, RTC_CR_WUCKSEL, WakeupClock); +} + +/** + * @brief Get Wakeup clock + * @rmtoll CR WUCKSEL LL_RTC_WAKEUP_GetClock + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_16 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_8 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_4 + * @arg @ref LL_RTC_WAKEUPCLOCK_DIV_2 + * @arg @ref LL_RTC_WAKEUPCLOCK_CKSPRE + * @arg @ref LL_RTC_WAKEUPCLOCK_CKSPRE_WUT + */ +__STATIC_INLINE uint32_t LL_RTC_WAKEUP_GetClock(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_WUCKSEL)); +} + +/** + * @brief Set Wakeup auto-reload value + * @note Bit can be written only when WUTWF is set to 1 in RTC_ISR + * @rmtoll WUTR WUT LL_RTC_WAKEUP_SetAutoReload + * @param RTCx RTC Instance + * @param Value Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_RTC_WAKEUP_SetAutoReload(RTC_TypeDef *RTCx, uint32_t Value) +{ + MODIFY_REG(RTCx->WUTR, RTC_WUTR_WUT, Value); +} + +/** + * @brief Get Wakeup auto-reload value + * @rmtoll WUTR WUT LL_RTC_WAKEUP_GetAutoReload + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_RTC_WAKEUP_GetAutoReload(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->WUTR, RTC_WUTR_WUT)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Backup_Registers Backup_Registers + * @{ + */ + +/** + * @brief Writes a data in a specified RTC Backup data register. + * @rmtoll BKPxR BKP LL_RTC_BAK_SetRegister + * @param RTCx RTC Instance + * @param BackupRegister This parameter can be one of the following values: + * @arg @ref LL_RTC_BKP_DR0 + * @arg @ref LL_RTC_BKP_DR1 + * @arg @ref LL_RTC_BKP_DR2 + * @arg @ref LL_RTC_BKP_DR3 + * @arg @ref LL_RTC_BKP_DR4 + * @arg @ref LL_RTC_BKP_DR5 + * @arg @ref LL_RTC_BKP_DR6 + * @arg @ref LL_RTC_BKP_DR7 + * @arg @ref LL_RTC_BKP_DR8 + * @arg @ref LL_RTC_BKP_DR9 + * @arg @ref LL_RTC_BKP_DR10 + * @arg @ref LL_RTC_BKP_DR11 + * @arg @ref LL_RTC_BKP_DR12 + * @arg @ref LL_RTC_BKP_DR13 + * @arg @ref LL_RTC_BKP_DR14 + * @arg @ref LL_RTC_BKP_DR15 + * @arg @ref LL_RTC_BKP_DR16 + * @arg @ref LL_RTC_BKP_DR17 + * @arg @ref LL_RTC_BKP_DR18 + * @arg @ref LL_RTC_BKP_DR19 + * @param Data Value between Min_Data=0x00 and Max_Data=0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_RTC_BAK_SetRegister(RTC_TypeDef *RTCx, uint32_t BackupRegister, uint32_t Data) +{ + register uint32_t tmp = 0U; + + tmp = (uint32_t)(&(RTCx->BKP0R)); + tmp += (BackupRegister * 4U); + + /* Write the specified register */ + *(__IO uint32_t *)tmp = (uint32_t)Data; +} + +/** + * @brief Reads data from the specified RTC Backup data Register. + * @rmtoll BKPxR BKP LL_RTC_BAK_GetRegister + * @param RTCx RTC Instance + * @param BackupRegister This parameter can be one of the following values: + * @arg @ref LL_RTC_BKP_DR0 + * @arg @ref LL_RTC_BKP_DR1 + * @arg @ref LL_RTC_BKP_DR2 + * @arg @ref LL_RTC_BKP_DR3 + * @arg @ref LL_RTC_BKP_DR4 + * @arg @ref LL_RTC_BKP_DR5 + * @arg @ref LL_RTC_BKP_DR6 + * @arg @ref LL_RTC_BKP_DR7 + * @arg @ref LL_RTC_BKP_DR8 + * @arg @ref LL_RTC_BKP_DR9 + * @arg @ref LL_RTC_BKP_DR10 + * @arg @ref LL_RTC_BKP_DR11 + * @arg @ref LL_RTC_BKP_DR12 + * @arg @ref LL_RTC_BKP_DR13 + * @arg @ref LL_RTC_BKP_DR14 + * @arg @ref LL_RTC_BKP_DR15 + * @arg @ref LL_RTC_BKP_DR16 + * @arg @ref LL_RTC_BKP_DR17 + * @arg @ref LL_RTC_BKP_DR18 + * @arg @ref LL_RTC_BKP_DR19 + * @retval Value between Min_Data=0x00 and Max_Data=0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_RTC_BAK_GetRegister(RTC_TypeDef *RTCx, uint32_t BackupRegister) +{ + register uint32_t tmp = 0U; + + tmp = (uint32_t)(&(RTCx->BKP0R)); + tmp += (BackupRegister * 4U); + + /* Read the specified register */ + return (*(__IO uint32_t *)tmp); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_Calibration Calibration + * @{ + */ + +/** + * @brief Set Calibration output frequency (1 Hz or 512 Hz) + * @note Bits are write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR COE LL_RTC_CAL_SetOutputFreq\n + * CR COSEL LL_RTC_CAL_SetOutputFreq + * @param RTCx RTC Instance + * @param Frequency This parameter can be one of the following values: + * @arg @ref LL_RTC_CALIB_OUTPUT_NONE + * @arg @ref LL_RTC_CALIB_OUTPUT_1HZ + * @arg @ref LL_RTC_CALIB_OUTPUT_512HZ + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_SetOutputFreq(RTC_TypeDef *RTCx, uint32_t Frequency) +{ + MODIFY_REG(RTCx->CR, RTC_CR_COE | RTC_CR_COSEL, Frequency); +} + +/** + * @brief Get Calibration output frequency (1 Hz or 512 Hz) + * @rmtoll CR COE LL_RTC_CAL_GetOutputFreq\n + * CR COSEL LL_RTC_CAL_GetOutputFreq + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_CALIB_OUTPUT_NONE + * @arg @ref LL_RTC_CALIB_OUTPUT_1HZ + * @arg @ref LL_RTC_CALIB_OUTPUT_512HZ + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_GetOutputFreq(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CR, RTC_CR_COE | RTC_CR_COSEL)); +} + +/** + * @brief Enable Coarse digital calibration + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CR DCE LL_RTC_CAL_EnableCoarseDigital + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_EnableCoarseDigital(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_DCE); +} + +/** + * @brief Disable Coarse digital calibration + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CR DCE LL_RTC_CAL_DisableCoarseDigital + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_DisableCoarseDigital(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_DCE); +} + +/** + * @brief Set the coarse digital calibration + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note It can be written in initialization mode only (@ref LL_RTC_EnableInitMode function) + * @rmtoll CALIBR DCS LL_RTC_CAL_ConfigCoarseDigital\n + * CALIBR DC LL_RTC_CAL_ConfigCoarseDigital + * @param RTCx RTC Instance + * @param Sign This parameter can be one of the following values: + * @arg @ref LL_RTC_CALIB_SIGN_POSITIVE + * @arg @ref LL_RTC_CALIB_SIGN_NEGATIVE + * @param Value value of coarse calibration expressed in ppm (coded on 5 bits) + * @note This Calibration value should be between 0 and 63 when using negative sign with a 2-ppm step. + * @note This Calibration value should be between 0 and 126 when using positive sign with a 4-ppm step. + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_ConfigCoarseDigital(RTC_TypeDef* RTCx, uint32_t Sign, uint32_t Value) +{ + MODIFY_REG(RTCx->CALIBR, RTC_CALIBR_DCS | RTC_CALIBR_DC, Sign | Value); +} + +/** + * @brief Get the coarse digital calibration value + * @rmtoll CALIBR DC LL_RTC_CAL_GetCoarseDigitalValue + * @param RTCx RTC Instance + * @retval value of coarse calibration expressed in ppm (coded on 5 bits) + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_GetCoarseDigitalValue(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CALIBR, RTC_CALIBR_DC)); +} + +/** + * @brief Get the coarse digital calibration sign + * @rmtoll CALIBR DCS LL_RTC_CAL_GetCoarseDigitalSign + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_CALIB_SIGN_POSITIVE + * @arg @ref LL_RTC_CALIB_SIGN_NEGATIVE + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_GetCoarseDigitalSign(RTC_TypeDef* RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CALIBR, RTC_CALIBR_DCS)); +} + +/** + * @brief Insert or not One RTCCLK pulse every 2exp11 pulses (frequency increased by 488.5 ppm) + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note Bit can be written only when RECALPF is set to 0 in RTC_ISR + * @rmtoll CALR CALP LL_RTC_CAL_SetPulse + * @param RTCx RTC Instance + * @param Pulse This parameter can be one of the following values: + * @arg @ref LL_RTC_CALIB_INSERTPULSE_NONE + * @arg @ref LL_RTC_CALIB_INSERTPULSE_SET + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_SetPulse(RTC_TypeDef *RTCx, uint32_t Pulse) +{ + MODIFY_REG(RTCx->CALR, RTC_CALR_CALP, Pulse); +} + +/** + * @brief Check if one RTCCLK has been inserted or not every 2exp11 pulses (frequency increased by 488.5 ppm) + * @rmtoll CALR CALP LL_RTC_CAL_IsPulseInserted + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_IsPulseInserted(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CALR, RTC_CALR_CALP) == (RTC_CALR_CALP)); +} + +/** + * @brief Set the calibration cycle period + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note Bit can be written only when RECALPF is set to 0 in RTC_ISR + * @rmtoll CALR CALW8 LL_RTC_CAL_SetPeriod\n + * CALR CALW16 LL_RTC_CAL_SetPeriod + * @param RTCx RTC Instance + * @param Period This parameter can be one of the following values: + * @arg @ref LL_RTC_CALIB_PERIOD_32SEC + * @arg @ref LL_RTC_CALIB_PERIOD_16SEC + * @arg @ref LL_RTC_CALIB_PERIOD_8SEC + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_SetPeriod(RTC_TypeDef *RTCx, uint32_t Period) +{ + MODIFY_REG(RTCx->CALR, RTC_CALR_CALW8 | RTC_CALR_CALW16, Period); +} + +/** + * @brief Get the calibration cycle period + * @rmtoll CALR CALW8 LL_RTC_CAL_GetPeriod\n + * CALR CALW16 LL_RTC_CAL_GetPeriod + * @param RTCx RTC Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_RTC_CALIB_PERIOD_32SEC + * @arg @ref LL_RTC_CALIB_PERIOD_16SEC + * @arg @ref LL_RTC_CALIB_PERIOD_8SEC + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_GetPeriod(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CALR, RTC_CALR_CALW8 | RTC_CALR_CALW16)); +} + +/** + * @brief Set Calibration minus + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @note Bit can be written only when RECALPF is set to 0 in RTC_ISR + * @rmtoll CALR CALM LL_RTC_CAL_SetMinus + * @param RTCx RTC Instance + * @param CalibMinus Value between Min_Data=0x00 and Max_Data=0x1FF + * @retval None + */ +__STATIC_INLINE void LL_RTC_CAL_SetMinus(RTC_TypeDef *RTCx, uint32_t CalibMinus) +{ + MODIFY_REG(RTCx->CALR, RTC_CALR_CALM, CalibMinus); +} + +/** + * @brief Get Calibration minus + * @rmtoll CALR CALM LL_RTC_CAL_GetMinus + * @param RTCx RTC Instance + * @retval Value between Min_Data=0x00 and Max_Data= 0x1FF + */ +__STATIC_INLINE uint32_t LL_RTC_CAL_GetMinus(RTC_TypeDef *RTCx) +{ + return (uint32_t)(READ_BIT(RTCx->CALR, RTC_CALR_CALM)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Recalibration pending Flag + * @rmtoll ISR RECALPF LL_RTC_IsActiveFlag_RECALP + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_RECALP(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_RECALPF) == (RTC_ISR_RECALPF)); +} + + +#if defined(RTC_TAMPER2_SUPPORT) +/** + * @brief Get RTC_TAMP2 detection flag + * @rmtoll ISR TAMP2F LL_RTC_IsActiveFlag_TAMP2 + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_TAMP2(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_TAMP2F) == (RTC_ISR_TAMP2F)); +} +#endif /* RTC_TAMPER2_SUPPORT */ + +/** + * @brief Get RTC_TAMP1 detection flag + * @rmtoll ISR TAMP1F LL_RTC_IsActiveFlag_TAMP1 + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_TAMP1(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_TAMP1F) == (RTC_ISR_TAMP1F)); +} + +/** + * @brief Get Time-stamp overflow flag + * @rmtoll ISR TSOVF LL_RTC_IsActiveFlag_TSOV + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_TSOV(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_TSOVF) == (RTC_ISR_TSOVF)); +} + +/** + * @brief Get Time-stamp flag + * @rmtoll ISR TSF LL_RTC_IsActiveFlag_TS + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_TS(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_TSF) == (RTC_ISR_TSF)); +} + +/** + * @brief Get Wakeup timer flag + * @rmtoll ISR WUTF LL_RTC_IsActiveFlag_WUT + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_WUT(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_WUTF) == (RTC_ISR_WUTF)); +} + +/** + * @brief Get Alarm B flag + * @rmtoll ISR ALRBF LL_RTC_IsActiveFlag_ALRB + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_ALRB(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_ALRBF) == (RTC_ISR_ALRBF)); +} + +/** + * @brief Get Alarm A flag + * @rmtoll ISR ALRAF LL_RTC_IsActiveFlag_ALRA + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_ALRA(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_ALRAF) == (RTC_ISR_ALRAF)); +} + + +#if defined(RTC_TAMPER2_SUPPORT) +/** + * @brief Clear RTC_TAMP2 detection flag + * @rmtoll ISR TAMP2F LL_RTC_ClearFlag_TAMP2 + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_TAMP2(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_TAMP2F | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} +#endif /* RTC_TAMPER2_SUPPORT */ + +/** + * @brief Clear RTC_TAMP1 detection flag + * @rmtoll ISR TAMP1F LL_RTC_ClearFlag_TAMP1 + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_TAMP1(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_TAMP1F | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Clear Time-stamp overflow flag + * @rmtoll ISR TSOVF LL_RTC_ClearFlag_TSOV + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_TSOV(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_TSOVF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Clear Time-stamp flag + * @rmtoll ISR TSF LL_RTC_ClearFlag_TS + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_TS(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_TSF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Clear Wakeup timer flag + * @rmtoll ISR WUTF LL_RTC_ClearFlag_WUT + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_WUT(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_WUTF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Clear Alarm B flag + * @rmtoll ISR ALRBF LL_RTC_ClearFlag_ALRB + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_ALRB(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_ALRBF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Clear Alarm A flag + * @rmtoll ISR ALRAF LL_RTC_ClearFlag_ALRA + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_ALRA(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_ALRAF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Get Initialization flag + * @rmtoll ISR INITF LL_RTC_IsActiveFlag_INIT + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_INIT(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_INITF) == (RTC_ISR_INITF)); +} + +/** + * @brief Get Registers synchronization flag + * @rmtoll ISR RSF LL_RTC_IsActiveFlag_RS + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_RS(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_RSF) == (RTC_ISR_RSF)); +} + +/** + * @brief Clear Registers synchronization flag + * @rmtoll ISR RSF LL_RTC_ClearFlag_RS + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_ClearFlag_RS(RTC_TypeDef *RTCx) +{ + WRITE_REG(RTCx->ISR, (~((RTC_ISR_RSF | RTC_ISR_INIT) & 0x0000FFFFU) | (RTCx->ISR & RTC_ISR_INIT))); +} + +/** + * @brief Get Initialization status flag + * @rmtoll ISR INITS LL_RTC_IsActiveFlag_INITS + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_INITS(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_INITS) == (RTC_ISR_INITS)); +} + +/** + * @brief Get Shift operation pending flag + * @rmtoll ISR SHPF LL_RTC_IsActiveFlag_SHP + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_SHP(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_SHPF) == (RTC_ISR_SHPF)); +} + +/** + * @brief Get Wakeup timer write flag + * @rmtoll ISR WUTWF LL_RTC_IsActiveFlag_WUTW + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_WUTW(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_WUTWF) == (RTC_ISR_WUTWF)); +} + +/** + * @brief Get Alarm B write flag + * @rmtoll ISR ALRBWF LL_RTC_IsActiveFlag_ALRBW + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_ALRBW(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_ALRBWF) == (RTC_ISR_ALRBWF)); +} + +/** + * @brief Get Alarm A write flag + * @rmtoll ISR ALRAWF LL_RTC_IsActiveFlag_ALRAW + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsActiveFlag_ALRAW(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->ISR, RTC_ISR_ALRAWF) == (RTC_ISR_ALRAWF)); +} + +/** + * @} + */ + +/** @defgroup RTC_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable Time-stamp interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR TSIE LL_RTC_EnableIT_TS + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableIT_TS(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_TSIE); +} + +/** + * @brief Disable Time-stamp interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR TSIE LL_RTC_DisableIT_TS + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableIT_TS(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_TSIE); +} + +/** + * @brief Enable Wakeup timer interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR WUTIE LL_RTC_EnableIT_WUT + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableIT_WUT(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_WUTIE); +} + +/** + * @brief Disable Wakeup timer interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR WUTIE LL_RTC_DisableIT_WUT + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableIT_WUT(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_WUTIE); +} + +/** + * @brief Enable Alarm B interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRBIE LL_RTC_EnableIT_ALRB + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableIT_ALRB(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_ALRBIE); +} + +/** + * @brief Disable Alarm B interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRBIE LL_RTC_DisableIT_ALRB + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableIT_ALRB(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_ALRBIE); +} + +/** + * @brief Enable Alarm A interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRAIE LL_RTC_EnableIT_ALRA + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableIT_ALRA(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->CR, RTC_CR_ALRAIE); +} + +/** + * @brief Disable Alarm A interrupt + * @note Bit is write-protected. @ref LL_RTC_DisableWriteProtection function should be called before. + * @rmtoll CR ALRAIE LL_RTC_DisableIT_ALRA + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableIT_ALRA(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->CR, RTC_CR_ALRAIE); +} + +/** + * @brief Enable all Tamper Interrupt + * @rmtoll TAFCR TAMPIE LL_RTC_EnableIT_TAMP + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_EnableIT_TAMP(RTC_TypeDef *RTCx) +{ + SET_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPIE); +} + +/** + * @brief Disable all Tamper Interrupt + * @rmtoll TAFCR TAMPIE LL_RTC_DisableIT_TAMP + * @param RTCx RTC Instance + * @retval None + */ +__STATIC_INLINE void LL_RTC_DisableIT_TAMP(RTC_TypeDef *RTCx) +{ + CLEAR_BIT(RTCx->TAFCR, RTC_TAFCR_TAMPIE); +} + +/** + * @brief Check if Time-stamp interrupt is enabled or not + * @rmtoll CR TSIE LL_RTC_IsEnabledIT_TS + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsEnabledIT_TS(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_TSIE) == (RTC_CR_TSIE)); +} + +/** + * @brief Check if Wakeup timer interrupt is enabled or not + * @rmtoll CR WUTIE LL_RTC_IsEnabledIT_WUT + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsEnabledIT_WUT(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_WUTIE) == (RTC_CR_WUTIE)); +} + +/** + * @brief Check if Alarm B interrupt is enabled or not + * @rmtoll CR ALRBIE LL_RTC_IsEnabledIT_ALRB + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsEnabledIT_ALRB(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_ALRBIE) == (RTC_CR_ALRBIE)); +} + +/** + * @brief Check if Alarm A interrupt is enabled or not + * @rmtoll CR ALRAIE LL_RTC_IsEnabledIT_ALRA + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsEnabledIT_ALRA(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->CR, RTC_CR_ALRAIE) == (RTC_CR_ALRAIE)); +} + +/** + * @brief Check if all the TAMPER interrupts are enabled or not + * @rmtoll TAFCR TAMPIE LL_RTC_IsEnabledIT_TAMP + * @param RTCx RTC Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RTC_IsEnabledIT_TAMP(RTC_TypeDef *RTCx) +{ + return (READ_BIT(RTCx->TAFCR, + RTC_TAFCR_TAMPIE) == (RTC_TAFCR_TAMPIE)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RTC_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx); +ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct); +void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct); +ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct); +void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct); +ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct); +void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct); +ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct); +ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct); +void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct); +void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct); +ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx); +ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx); +ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RTC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_RTC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h index c25cb3c..9a83851 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_ll_sdmmc.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of SDMMC HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -42,11 +42,13 @@ #ifdef __cplusplus extern "C" { #endif + #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal_def.h" @@ -69,56 +71,56 @@ typedef struct { uint32_t ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref SDIO_Clock_Edge */ + This parameter can be a value of @ref SDMMC_LL_Clock_Edge */ - uint32_t ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is + uint32_t ClockBypass; /*!< Specifies whether the SDMMC Clock divider bypass is enabled or disabled. - This parameter can be a value of @ref SDIO_Clock_Bypass */ + This parameter can be a value of @ref SDMMC_LL_Clock_Bypass */ - uint32_t ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or + uint32_t ClockPowerSave; /*!< Specifies whether SDMMC Clock output is enabled or disabled when the bus is idle. - This parameter can be a value of @ref SDIO_Clock_Power_Save */ + This parameter can be a value of @ref SDMMC_LL_Clock_Power_Save */ - uint32_t BusWide; /*!< Specifies the SDIO bus width. - This parameter can be a value of @ref SDIO_Bus_Wide */ + uint32_t BusWide; /*!< Specifies the SDMMC bus width. + This parameter can be a value of @ref SDMMC_LL_Bus_Wide */ - uint32_t HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. - This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + uint32_t HardwareFlowControl; /*!< Specifies whether the SDMMC hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDMMC_LL_Hardware_Flow_Control */ - uint32_t ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. - This parameter can be a value between Min_Data = 0 and Max_Data = 255 */ + uint32_t ClockDiv; /*!< Specifies the clock frequency of the SDMMC controller. + This parameter can be a value between Min_Data = 0 and Max_Data = 255 */ }SDIO_InitTypeDef; /** - * @brief SDIO Command Control structure + * @brief SDMMC Command Control structure */ -typedef struct +typedef struct { - uint32_t Argument; /*!< Specifies the SDIO command argument which is sent + uint32_t Argument; /*!< Specifies the SDMMC command argument which is sent to a card as part of a command message. If a command contains an argument, it must be loaded into this register before writing the command to the command register. */ - uint32_t CmdIndex; /*!< Specifies the SDIO command index. It must be Min_Data = 0 and + uint32_t CmdIndex; /*!< Specifies the SDMMC command index. It must be Min_Data = 0 and Max_Data = 64 */ - uint32_t Response; /*!< Specifies the SDIO response type. - This parameter can be a value of @ref SDIO_Response_Type */ + uint32_t Response; /*!< Specifies the SDMMC response type. + This parameter can be a value of @ref SDMMC_LL_Response_Type */ - uint32_t WaitForInterrupt; /*!< Specifies whether SDIO wait for interrupt request is + uint32_t WaitForInterrupt; /*!< Specifies whether SDMMC wait for interrupt request is enabled or disabled. - This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + This parameter can be a value of @ref SDMMC_LL_Wait_Interrupt_State */ - uint32_t CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) + uint32_t CPSM; /*!< Specifies whether SDMMC Command path state machine (CPSM) is enabled or disabled. - This parameter can be a value of @ref SDIO_CPSM_State */ + This parameter can be a value of @ref SDMMC_LL_CPSM_State */ }SDIO_CmdInitTypeDef; /** - * @brief SDIO Data Control structure + * @brief SDMMC Data Control structure */ typedef struct { @@ -127,18 +129,18 @@ typedef struct uint32_t DataLength; /*!< Specifies the number of data bytes to be transferred. */ uint32_t DataBlockSize; /*!< Specifies the data block size for block transfer. - This parameter can be a value of @ref SDIO_Data_Block_Size */ + This parameter can be a value of @ref SDMMC_LL_Data_Block_Size */ uint32_t TransferDir; /*!< Specifies the data transfer direction, whether the transfer is a read or write. - This parameter can be a value of @ref SDIO_Transfer_Direction */ + This parameter can be a value of @ref SDMMC_LL_Transfer_Direction */ uint32_t TransferMode; /*!< Specifies whether data transfer is in stream or block mode. - This parameter can be a value of @ref SDIO_Transfer_Type */ + This parameter can be a value of @ref SDMMC_LL_Transfer_Type */ - uint32_t DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) + uint32_t DPSM; /*!< Specifies whether SDMMC Data path state machine (DPSM) is enabled or disabled. - This parameter can be a value of @ref SDIO_DPSM_State */ + This parameter can be a value of @ref SDMMC_LL_DPSM_State */ }SDIO_DataInitTypeDef; /** @@ -149,70 +151,260 @@ typedef struct /** @defgroup SDMMC_LL_Exported_Constants SDMMC_LL Exported Constants * @{ */ +#define SDMMC_ERROR_NONE 0x00000000U /*!< No error */ +#define SDMMC_ERROR_CMD_CRC_FAIL 0x00000001U /*!< Command response received (but CRC check failed) */ +#define SDMMC_ERROR_DATA_CRC_FAIL 0x00000002U /*!< Data block sent/received (CRC check failed) */ +#define SDMMC_ERROR_CMD_RSP_TIMEOUT 0x00000004U /*!< Command response timeout */ +#define SDMMC_ERROR_DATA_TIMEOUT 0x00000008U /*!< Data timeout */ +#define SDMMC_ERROR_TX_UNDERRUN 0x00000010U /*!< Transmit FIFO underrun */ +#define SDMMC_ERROR_RX_OVERRUN 0x00000020U /*!< Receive FIFO overrun */ +#define SDMMC_ERROR_ADDR_MISALIGNED 0x00000040U /*!< Misaligned address */ +#define SDMMC_ERROR_BLOCK_LEN_ERR 0x00000080U /*!< Transferred block length is not allowed for the card or the + number of transferred bytes does not match the block length */ +#define SDMMC_ERROR_ERASE_SEQ_ERR 0x00000100U /*!< An error in the sequence of erase command occurs */ +#define SDMMC_ERROR_BAD_ERASE_PARAM 0x00000200U /*!< An invalid selection for erase groups */ +#define SDMMC_ERROR_WRITE_PROT_VIOLATION 0x00000400U /*!< Attempt to program a write protect block */ +#define SDMMC_ERROR_LOCK_UNLOCK_FAILED 0x00000800U /*!< Sequence or password error has been detected in unlock + command or if there was an attempt to access a locked card */ +#define SDMMC_ERROR_COM_CRC_FAILED 0x00001000U /*!< CRC check of the previous command failed */ +#define SDMMC_ERROR_ILLEGAL_CMD 0x00002000U /*!< Command is not legal for the card state */ +#define SDMMC_ERROR_CARD_ECC_FAILED 0x00004000U /*!< Card internal ECC was applied but failed to correct the data */ +#define SDMMC_ERROR_CC_ERR 0x00008000U /*!< Internal card controller error */ +#define SDMMC_ERROR_GENERAL_UNKNOWN_ERR 0x00010000U /*!< General or unknown error */ +#define SDMMC_ERROR_STREAM_READ_UNDERRUN 0x00020000U /*!< The card could not sustain data reading in stream rmode */ +#define SDMMC_ERROR_STREAM_WRITE_OVERRUN 0x00040000U /*!< The card could not sustain data programming in stream mode */ +#define SDMMC_ERROR_CID_CSD_OVERWRITE 0x00080000U /*!< CID/CSD overwrite error */ +#define SDMMC_ERROR_WP_ERASE_SKIP 0x00100000U /*!< Only partial address space was erased */ +#define SDMMC_ERROR_CARD_ECC_DISABLED 0x00200000U /*!< Command has been executed without using internal ECC */ +#define SDMMC_ERROR_ERASE_RESET 0x00400000U /*!< Erase sequence was cleared before executing because an out + of erase sequence command was received */ +#define SDMMC_ERROR_AKE_SEQ_ERR 0x00800000U /*!< Error in sequence of authentication */ +#define SDMMC_ERROR_INVALID_VOLTRANGE 0x01000000U /*!< Error in case of invalid voltage range */ +#define SDMMC_ERROR_ADDR_OUT_OF_RANGE 0x02000000U /*!< Error when addressed block is out of range */ +#define SDMMC_ERROR_REQUEST_NOT_APPLICABLE 0x04000000U /*!< Error when command request is not applicable */ +#define SDMMC_ERROR_INVALID_PARAMETER 0x08000000U /*!< the used parameter is not valid */ +#define SDMMC_ERROR_UNSUPPORTED_FEATURE 0x10000000U /*!< Error when feature is not insupported */ +#define SDMMC_ERROR_BUSY 0x20000000U /*!< Error when transfer process is busy */ +#define SDMMC_ERROR_DMA 0x40000000U /*!< Error while DMA transfer */ +#define SDMMC_ERROR_TIMEOUT 0x80000000U /*!< Timeout error */ + +/** + * @brief SDMMC Commands Index + */ +#define SDMMC_CMD_GO_IDLE_STATE ((uint8_t)0) /*!< Resets the SD memory card. */ +#define SDMMC_CMD_SEND_OP_COND ((uint8_t)1) /*!< Sends host capacity support information and activates the card's initialization process. */ +#define SDMMC_CMD_ALL_SEND_CID ((uint8_t)2) /*!< Asks any card connected to the host to send the CID numbers on the CMD line. */ +#define SDMMC_CMD_SET_REL_ADDR ((uint8_t)3) /*!< Asks the card to publish a new relative address (RCA). */ +#define SDMMC_CMD_SET_DSR ((uint8_t)4) /*!< Programs the DSR of all cards. */ +#define SDMMC_CMD_SDMMC_SEN_OP_COND ((uint8_t)5) /*!< Sends host capacity support information (HCS) and asks the accessed card to send its + operating condition register (OCR) content in the response on the CMD line. */ +#define SDMMC_CMD_HS_SWITCH ((uint8_t)6) /*!< Checks switchable function (mode 0) and switch card function (mode 1). */ +#define SDMMC_CMD_SEL_DESEL_CARD ((uint8_t)7) /*!< Selects the card by its own relative address and gets deselected by any other address */ +#define SDMMC_CMD_HS_SEND_EXT_CSD ((uint8_t)8) /*!< Sends SD Memory Card interface condition, which includes host supply voltage information + and asks the card whether card supports voltage. */ +#define SDMMC_CMD_SEND_CSD ((uint8_t)9) /*!< Addressed card sends its card specific data (CSD) on the CMD line. */ +#define SDMMC_CMD_SEND_CID ((uint8_t)10) /*!< Addressed card sends its card identification (CID) on the CMD line. */ +#define SDMMC_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11) /*!< SD card doesn't support it. */ +#define SDMMC_CMD_STOP_TRANSMISSION ((uint8_t)12) /*!< Forces the card to stop transmission. */ +#define SDMMC_CMD_SEND_STATUS ((uint8_t)13) /*!< Addressed card sends its status register. */ +#define SDMMC_CMD_HS_BUSTEST_READ ((uint8_t)14) /*!< Reserved */ +#define SDMMC_CMD_GO_INACTIVE_STATE ((uint8_t)15) /*!< Sends an addressed card into the inactive state. */ +#define SDMMC_CMD_SET_BLOCKLEN ((uint8_t)16) /*!< Sets the block length (in bytes for SDSC) for all following block commands + (read, write, lock). Default block length is fixed to 512 Bytes. Not effective + for SDHS and SDXC. */ +#define SDMMC_CMD_READ_SINGLE_BLOCK ((uint8_t)17) /*!< Reads single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of + fixed 512 bytes in case of SDHC and SDXC. */ +#define SDMMC_CMD_READ_MULT_BLOCK ((uint8_t)18) /*!< Continuously transfers data blocks from card to host until interrupted by + STOP_TRANSMISSION command. */ +#define SDMMC_CMD_HS_BUSTEST_WRITE ((uint8_t)19) /*!< 64 bytes tuning pattern is sent for SDR50 and SDR104. */ +#define SDMMC_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /*!< Speed class control command. */ +#define SDMMC_CMD_SET_BLOCK_COUNT ((uint8_t)23) /*!< Specify block count for CMD18 and CMD25. */ +#define SDMMC_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24) /*!< Writes single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of + fixed 512 bytes in case of SDHC and SDXC. */ +#define SDMMC_CMD_WRITE_MULT_BLOCK ((uint8_t)25) /*!< Continuously writes blocks of data until a STOP_TRANSMISSION follows. */ +#define SDMMC_CMD_PROG_CID ((uint8_t)26) /*!< Reserved for manufacturers. */ +#define SDMMC_CMD_PROG_CSD ((uint8_t)27) /*!< Programming of the programmable bits of the CSD. */ +#define SDMMC_CMD_SET_WRITE_PROT ((uint8_t)28) /*!< Sets the write protection bit of the addressed group. */ +#define SDMMC_CMD_CLR_WRITE_PROT ((uint8_t)29) /*!< Clears the write protection bit of the addressed group. */ +#define SDMMC_CMD_SEND_WRITE_PROT ((uint8_t)30) /*!< Asks the card to send the status of the write protection bits. */ +#define SDMMC_CMD_SD_ERASE_GRP_START ((uint8_t)32) /*!< Sets the address of the first write block to be erased. (For SD card only). */ +#define SDMMC_CMD_SD_ERASE_GRP_END ((uint8_t)33) /*!< Sets the address of the last write block of the continuous range to be erased. */ +#define SDMMC_CMD_ERASE_GRP_START ((uint8_t)35) /*!< Sets the address of the first write block to be erased. Reserved for each command + system set by switch function command (CMD6). */ +#define SDMMC_CMD_ERASE_GRP_END ((uint8_t)36) /*!< Sets the address of the last write block of the continuous range to be erased. + Reserved for each command system set by switch function command (CMD6). */ +#define SDMMC_CMD_ERASE ((uint8_t)38) /*!< Reserved for SD security applications. */ +#define SDMMC_CMD_FAST_IO ((uint8_t)39) /*!< SD card doesn't support it (Reserved). */ +#define SDMMC_CMD_GO_IRQ_STATE ((uint8_t)40) /*!< SD card doesn't support it (Reserved). */ +#define SDMMC_CMD_LOCK_UNLOCK ((uint8_t)42) /*!< Sets/resets the password or lock/unlock the card. The size of the data block is set by + the SET_BLOCK_LEN command. */ +#define SDMMC_CMD_APP_CMD ((uint8_t)55) /*!< Indicates to the card that the next command is an application specific command rather + than a standard command. */ +#define SDMMC_CMD_GEN_CMD ((uint8_t)56) /*!< Used either to transfer a data block to the card or to get a data block from the card + for general purpose/application specific commands. */ +#define SDMMC_CMD_NO_CMD ((uint8_t)64) /*!< No command */ + +/** + * @brief Following commands are SD Card Specific commands. + * SDMMC_APP_CMD should be sent before sending these commands. + */ +#define SDMMC_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /*!< (ACMD6) Defines the data bus width to be used for data transfer. The allowed data bus + widths are given in SCR register. */ +#define SDMMC_CMD_SD_APP_STATUS ((uint8_t)13) /*!< (ACMD13) Sends the SD status. */ +#define SDMMC_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /*!< (ACMD22) Sends the number of the written (without errors) write blocks. Responds with + 32bit+CRC data block. */ +#define SDMMC_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< (ACMD41) Sends host capacity support information (HCS) and asks the accessed card to + send its operating condition register (OCR) content in the response on the CMD line. */ +#define SDMMC_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /*!< (ACMD42) Connect/Disconnect the 50 KOhm pull-up resistor on CD/DAT3 (pin 1) of the card */ +#define SDMMC_CMD_SD_APP_SEND_SCR ((uint8_t)51) /*!< Reads the SD Configuration Register (SCR). */ +#define SDMMC_CMD_SDMMC_RW_DIRECT ((uint8_t)52) /*!< For SD I/O card only, reserved for security specification. */ +#define SDMMC_CMD_SDMMC_RW_EXTENDED ((uint8_t)53) /*!< For SD I/O card only, reserved for security specification. */ + +/** + * @brief Following commands are SD Card Specific security commands. + * SDMMC_CMD_APP_CMD should be sent before sending these commands. + */ +#define SDMMC_CMD_SD_APP_GET_MKB ((uint8_t)43) +#define SDMMC_CMD_SD_APP_GET_MID ((uint8_t)44) +#define SDMMC_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45) +#define SDMMC_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46) +#define SDMMC_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47) +#define SDMMC_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48) +#define SDMMC_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) +#define SDMMC_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) +#define SDMMC_CMD_SD_APP_SECURE_ERASE ((uint8_t)38) +#define SDMMC_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) +#define SDMMC_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) + +/** + * @brief Masks for errors Card Status R1 (OCR Register) + */ +#define SDMMC_OCR_ADDR_OUT_OF_RANGE 0x80000000U +#define SDMMC_OCR_ADDR_MISALIGNED 0x40000000U +#define SDMMC_OCR_BLOCK_LEN_ERR 0x20000000U +#define SDMMC_OCR_ERASE_SEQ_ERR 0x10000000U +#define SDMMC_OCR_BAD_ERASE_PARAM 0x08000000U +#define SDMMC_OCR_WRITE_PROT_VIOLATION 0x04000000U +#define SDMMC_OCR_LOCK_UNLOCK_FAILED 0x01000000U +#define SDMMC_OCR_COM_CRC_FAILED 0x00800000U +#define SDMMC_OCR_ILLEGAL_CMD 0x00400000U +#define SDMMC_OCR_CARD_ECC_FAILED 0x00200000U +#define SDMMC_OCR_CC_ERROR 0x00100000U +#define SDMMC_OCR_GENERAL_UNKNOWN_ERROR 0x00080000U +#define SDMMC_OCR_STREAM_READ_UNDERRUN 0x00040000U +#define SDMMC_OCR_STREAM_WRITE_OVERRUN 0x00020000U +#define SDMMC_OCR_CID_CSD_OVERWRITE 0x00010000U +#define SDMMC_OCR_WP_ERASE_SKIP 0x00008000U +#define SDMMC_OCR_CARD_ECC_DISABLED 0x00004000U +#define SDMMC_OCR_ERASE_RESET 0x00002000U +#define SDMMC_OCR_AKE_SEQ_ERROR 0x00000008U +#define SDMMC_OCR_ERRORBITS 0xFDFFE008U + +/** + * @brief Masks for R6 Response + */ +#define SDMMC_R6_GENERAL_UNKNOWN_ERROR 0x00002000U +#define SDMMC_R6_ILLEGAL_CMD 0x00004000U +#define SDMMC_R6_COM_CRC_FAILED 0x00008000U + +#define SDMMC_VOLTAGE_WINDOW_SD 0x80100000U +#define SDMMC_HIGH_CAPACITY 0x40000000U +#define SDMMC_STD_CAPACITY 0x00000000U +#define SDMMC_CHECK_PATTERN 0x000001AAU + +#define SDMMC_MAX_VOLT_TRIAL 0x0000FFFFU + +#define SDMMC_MAX_TRIAL 0x0000FFFFU + +#define SDMMC_ALLZERO 0x00000000U + +#define SDMMC_WIDE_BUS_SUPPORT 0x00040000U +#define SDMMC_SINGLE_BUS_SUPPORT 0x00010000U +#define SDMMC_CARD_LOCKED 0x02000000U + +#define SDMMC_DATATIMEOUT 0xFFFFFFFFU + +#define SDMMC_0TO7BITS 0x000000FFU +#define SDMMC_8TO15BITS 0x0000FF00U +#define SDMMC_16TO23BITS 0x00FF0000U +#define SDMMC_24TO31BITS 0xFF000000U +#define SDMMC_MAX_DATA_LENGTH 0x01FFFFFFU + +#define SDMMC_HALFFIFO 0x00000008U +#define SDMMC_HALFFIFOBYTES 0x00000020U + +/** + * @brief Command Class supported + */ +#define SDIO_CCCC_ERASE 0x00000020U + +#define SDIO_CMDTIMEOUT 5000U /* Command send and response timeout */ +#define SDIO_MAXERASETIMEOUT 63000U /* Max erase Timeout 63 s */ -/** @defgroup SDIO_Clock_Edge Clock Edge + +/** @defgroup SDIO_LL_Clock_Edge Clock Edge * @{ */ -#define SDIO_CLOCK_EDGE_RISING ((uint32_t)0x00000000U) +#define SDIO_CLOCK_EDGE_RISING 0x00000000U #define SDIO_CLOCK_EDGE_FALLING SDIO_CLKCR_NEGEDGE #define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_CLOCK_EDGE_RISING) || \ - ((EDGE) == SDIO_CLOCK_EDGE_FALLING)) + ((EDGE) == SDIO_CLOCK_EDGE_FALLING)) /** * @} */ -/** @defgroup SDIO_Clock_Bypass Clock Bypass +/** @defgroup SDIO_LL_Clock_Bypass Clock Bypass * @{ */ -#define SDIO_CLOCK_BYPASS_DISABLE ((uint32_t)0x00000000U) +#define SDIO_CLOCK_BYPASS_DISABLE 0x00000000U #define SDIO_CLOCK_BYPASS_ENABLE SDIO_CLKCR_BYPASS #define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_CLOCK_BYPASS_DISABLE) || \ - ((BYPASS) == SDIO_CLOCK_BYPASS_ENABLE)) + ((BYPASS) == SDIO_CLOCK_BYPASS_ENABLE)) /** * @} */ -/** @defgroup SDIO_Clock_Power_Save Clock Power Saving +/** @defgroup SDIO_LL_Clock_Power_Save Clock Power Saving * @{ */ -#define SDIO_CLOCK_POWER_SAVE_DISABLE ((uint32_t)0x00000000U) +#define SDIO_CLOCK_POWER_SAVE_DISABLE 0x00000000U #define SDIO_CLOCK_POWER_SAVE_ENABLE SDIO_CLKCR_PWRSAV #define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_CLOCK_POWER_SAVE_DISABLE) || \ - ((SAVE) == SDIO_CLOCK_POWER_SAVE_ENABLE)) + ((SAVE) == SDIO_CLOCK_POWER_SAVE_ENABLE)) /** * @} */ -/** @defgroup SDIO_Bus_Wide Bus Width +/** @defgroup SDIO_LL_Bus_Wide Bus Width * @{ */ -#define SDIO_BUS_WIDE_1B ((uint32_t)0x00000000U) +#define SDIO_BUS_WIDE_1B 0x00000000U #define SDIO_BUS_WIDE_4B SDIO_CLKCR_WIDBUS_0 #define SDIO_BUS_WIDE_8B SDIO_CLKCR_WIDBUS_1 #define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BUS_WIDE_1B) || \ - ((WIDE) == SDIO_BUS_WIDE_4B) || \ - ((WIDE) == SDIO_BUS_WIDE_8B)) + ((WIDE) == SDIO_BUS_WIDE_4B) || \ + ((WIDE) == SDIO_BUS_WIDE_8B)) /** * @} */ -/** @defgroup SDIO_Hardware_Flow_Control Hardware Flow Control +/** @defgroup SDIO_LL_Hardware_Flow_Control Hardware Flow Control * @{ */ -#define SDIO_HARDWARE_FLOW_CONTROL_DISABLE ((uint32_t)0x00000000U) +#define SDIO_HARDWARE_FLOW_CONTROL_DISABLE 0x00000000U #define SDIO_HARDWARE_FLOW_CONTROL_ENABLE SDIO_CLKCR_HWFC_EN #define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HARDWARE_FLOW_CONTROL_DISABLE) || \ - ((CONTROL) == SDIO_HARDWARE_FLOW_CONTROL_ENABLE)) + ((CONTROL) == SDIO_HARDWARE_FLOW_CONTROL_ENABLE)) /** * @} */ -/** @defgroup SDIO_Clock_Division Clock Division +/** @defgroup SDIO_LL_Clock_Division Clock Division * @{ */ #define IS_SDIO_CLKDIV(DIV) ((DIV) <= 0xFFU) @@ -220,7 +412,7 @@ typedef struct * @} */ -/** @defgroup SDIO_Command_Index Command Index +/** @defgroup SDIO_LL_Command_Index Command Index * @{ */ #define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40U) @@ -228,63 +420,63 @@ typedef struct * @} */ -/** @defgroup SDIO_Response_Type Response Type +/** @defgroup SDIO_LL_Response_Type Response Type * @{ */ -#define SDIO_RESPONSE_NO ((uint32_t)0x00000000U) +#define SDIO_RESPONSE_NO 0x00000000U #define SDIO_RESPONSE_SHORT SDIO_CMD_WAITRESP_0 #define SDIO_RESPONSE_LONG SDIO_CMD_WAITRESP #define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_RESPONSE_NO) || \ - ((RESPONSE) == SDIO_RESPONSE_SHORT) || \ - ((RESPONSE) == SDIO_RESPONSE_LONG)) + ((RESPONSE) == SDIO_RESPONSE_SHORT) || \ + ((RESPONSE) == SDIO_RESPONSE_LONG)) /** * @} */ -/** @defgroup SDIO_Wait_Interrupt_State Wait Interrupt +/** @defgroup SDIO_LL_Wait_Interrupt_State Wait Interrupt * @{ */ -#define SDIO_WAIT_NO ((uint32_t)0x00000000U) +#define SDIO_WAIT_NO 0x00000000U #define SDIO_WAIT_IT SDIO_CMD_WAITINT #define SDIO_WAIT_PEND SDIO_CMD_WAITPEND #define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_WAIT_NO) || \ - ((WAIT) == SDIO_WAIT_IT) || \ - ((WAIT) == SDIO_WAIT_PEND)) + ((WAIT) == SDIO_WAIT_IT) || \ + ((WAIT) == SDIO_WAIT_PEND)) /** * @} */ -/** @defgroup SDIO_CPSM_State CPSM State +/** @defgroup SDIO_LL_CPSM_State CPSM State * @{ */ -#define SDIO_CPSM_DISABLE ((uint32_t)0x00000000U) +#define SDIO_CPSM_DISABLE 0x00000000U #define SDIO_CPSM_ENABLE SDIO_CMD_CPSMEN #define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_DISABLE) || \ - ((CPSM) == SDIO_CPSM_ENABLE)) + ((CPSM) == SDIO_CPSM_ENABLE)) /** * @} */ -/** @defgroup SDIO_Response_Registers Response Register +/** @defgroup SDIO_LL_Response_Registers Response Register * @{ */ -#define SDIO_RESP1 ((uint32_t)0x00000000U) -#define SDIO_RESP2 ((uint32_t)0x00000004U) -#define SDIO_RESP3 ((uint32_t)0x00000008U) -#define SDIO_RESP4 ((uint32_t)0x0000000CU) +#define SDIO_RESP1 0x00000000U +#define SDIO_RESP2 0x00000004U +#define SDIO_RESP3 0x00000008U +#define SDIO_RESP4 0x0000000CU #define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || \ - ((RESP) == SDIO_RESP2) || \ - ((RESP) == SDIO_RESP3) || \ - ((RESP) == SDIO_RESP4)) + ((RESP) == SDIO_RESP2) || \ + ((RESP) == SDIO_RESP3) || \ + ((RESP) == SDIO_RESP4)) /** * @} */ -/** @defgroup SDIO_Data_Length Data Lenght +/** @defgroup SDIO_LL_Data_Length Data Lenght * @{ */ #define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFFU) @@ -292,85 +484,85 @@ typedef struct * @} */ -/** @defgroup SDIO_Data_Block_Size Data Block Size +/** @defgroup SDIO_LL_Data_Block_Size Data Block Size * @{ */ -#define SDIO_DATABLOCK_SIZE_1B ((uint32_t)0x00000000U) +#define SDIO_DATABLOCK_SIZE_1B 0x00000000U #define SDIO_DATABLOCK_SIZE_2B SDIO_DCTRL_DBLOCKSIZE_0 #define SDIO_DATABLOCK_SIZE_4B SDIO_DCTRL_DBLOCKSIZE_1 -#define SDIO_DATABLOCK_SIZE_8B ((uint32_t)0x00000030U) +#define SDIO_DATABLOCK_SIZE_8B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_1) #define SDIO_DATABLOCK_SIZE_16B SDIO_DCTRL_DBLOCKSIZE_2 -#define SDIO_DATABLOCK_SIZE_32B ((uint32_t)0x00000050U) -#define SDIO_DATABLOCK_SIZE_64B ((uint32_t)0x00000060U) -#define SDIO_DATABLOCK_SIZE_128B ((uint32_t)0x00000070U) +#define SDIO_DATABLOCK_SIZE_32B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_2) +#define SDIO_DATABLOCK_SIZE_64B (SDIO_DCTRL_DBLOCKSIZE_1|SDIO_DCTRL_DBLOCKSIZE_2) +#define SDIO_DATABLOCK_SIZE_128B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_1|SDIO_DCTRL_DBLOCKSIZE_2) #define SDIO_DATABLOCK_SIZE_256B SDIO_DCTRL_DBLOCKSIZE_3 -#define SDIO_DATABLOCK_SIZE_512B ((uint32_t)0x00000090U) -#define SDIO_DATABLOCK_SIZE_1024B ((uint32_t)0x000000A0U) -#define SDIO_DATABLOCK_SIZE_2048B ((uint32_t)0x000000B0U) -#define SDIO_DATABLOCK_SIZE_4096B ((uint32_t)0x000000C0U) -#define SDIO_DATABLOCK_SIZE_8192B ((uint32_t)0x000000D0U) -#define SDIO_DATABLOCK_SIZE_16384B ((uint32_t)0x000000E0U) +#define SDIO_DATABLOCK_SIZE_512B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_3) +#define SDIO_DATABLOCK_SIZE_1024B (SDIO_DCTRL_DBLOCKSIZE_1|SDIO_DCTRL_DBLOCKSIZE_3) +#define SDIO_DATABLOCK_SIZE_2048B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_1|SDIO_DCTRL_DBLOCKSIZE_3) +#define SDIO_DATABLOCK_SIZE_4096B (SDIO_DCTRL_DBLOCKSIZE_2|SDIO_DCTRL_DBLOCKSIZE_3) +#define SDIO_DATABLOCK_SIZE_8192B (SDIO_DCTRL_DBLOCKSIZE_0|SDIO_DCTRL_DBLOCKSIZE_2|SDIO_DCTRL_DBLOCKSIZE_3) +#define SDIO_DATABLOCK_SIZE_16384B (SDIO_DCTRL_DBLOCKSIZE_1|SDIO_DCTRL_DBLOCKSIZE_2|SDIO_DCTRL_DBLOCKSIZE_3) #define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DATABLOCK_SIZE_1B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_2B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_4B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_8B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_16B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_32B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_64B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_128B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_256B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_512B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_1024B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_2048B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_4096B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_8192B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_16384B)) + ((SIZE) == SDIO_DATABLOCK_SIZE_2B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_4B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_8B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_16B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_32B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_64B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_128B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_256B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_512B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_1024B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_2048B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_4096B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_8192B) || \ + ((SIZE) == SDIO_DATABLOCK_SIZE_16384B)) /** * @} */ -/** @defgroup SDIO_Transfer_Direction Transfer Direction +/** @defgroup SDIO_LL_Transfer_Direction Transfer Direction * @{ */ -#define SDIO_TRANSFER_DIR_TO_CARD ((uint32_t)0x00000000U) +#define SDIO_TRANSFER_DIR_TO_CARD 0x00000000U #define SDIO_TRANSFER_DIR_TO_SDIO SDIO_DCTRL_DTDIR #define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TRANSFER_DIR_TO_CARD) || \ - ((DIR) == SDIO_TRANSFER_DIR_TO_SDIO)) + ((DIR) == SDIO_TRANSFER_DIR_TO_SDIO)) /** * @} */ -/** @defgroup SDIO_Transfer_Type Transfer Type +/** @defgroup SDIO_LL_Transfer_Type Transfer Type * @{ */ -#define SDIO_TRANSFER_MODE_BLOCK ((uint32_t)0x00000000U) +#define SDIO_TRANSFER_MODE_BLOCK 0x00000000U #define SDIO_TRANSFER_MODE_STREAM SDIO_DCTRL_DTMODE #define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TRANSFER_MODE_BLOCK) || \ - ((MODE) == SDIO_TRANSFER_MODE_STREAM)) + ((MODE) == SDIO_TRANSFER_MODE_STREAM)) /** * @} */ -/** @defgroup SDIO_DPSM_State DPSM State +/** @defgroup SDIO_LL_DPSM_State DPSM State * @{ */ -#define SDIO_DPSM_DISABLE ((uint32_t)0x00000000U) +#define SDIO_DPSM_DISABLE 0x00000000U #define SDIO_DPSM_ENABLE SDIO_DCTRL_DTEN #define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_DISABLE) ||\ - ((DPSM) == SDIO_DPSM_ENABLE)) + ((DPSM) == SDIO_DPSM_ENABLE)) /** * @} */ -/** @defgroup SDIO_Read_Wait_Mode Read Wait Mode +/** @defgroup SDIO_LL_Read_Wait_Mode Read Wait Mode * @{ */ -#define SDIO_READ_WAIT_MODE_DATA2 ((uint32_t)0x00000000U) -#define SDIO_READ_WAIT_MODE_CLK ((uint32_t)0x00000001U) +#define SDIO_READ_WAIT_MODE_DATA2 0x00000000U +#define SDIO_READ_WAIT_MODE_CLK (SDIO_DCTRL_RWMOD) #define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_READ_WAIT_MODE_CLK) || \ ((MODE) == SDIO_READ_WAIT_MODE_DATA2)) @@ -378,7 +570,7 @@ typedef struct * @} */ -/** @defgroup SDIO_Interrupt_sources Interrupt Sources +/** @defgroup SDIO_LL_Interrupt_sources Interrupt Sources * @{ */ #define SDIO_IT_CCRCFAIL SDIO_STA_CCRCFAIL @@ -409,7 +601,7 @@ typedef struct * @} */ -/** @defgroup SDIO_Flags Flags +/** @defgroup SDIO_LL_Flags Flags * @{ */ #define SDIO_FLAG_CCRCFAIL SDIO_STA_CCRCFAIL @@ -436,6 +628,10 @@ typedef struct #define SDIO_FLAG_RXDAVL SDIO_STA_RXDAVL #define SDIO_FLAG_SDIOIT SDIO_STA_SDIOIT #define SDIO_FLAG_CEATAEND SDIO_STA_CEATAEND +#define SDIO_STATIC_FLAGS ((uint32_t)(SDIO_FLAG_CCRCFAIL | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_CTIMEOUT |\ + SDIO_FLAG_DTIMEOUT | SDIO_FLAG_TXUNDERR | SDIO_FLAG_RXOVERR |\ + SDIO_FLAG_CMDREND | SDIO_FLAG_CMDSENT | SDIO_FLAG_DATAEND |\ + SDIO_FLAG_DBCKEND)) /** * @} */ @@ -443,8 +639,9 @@ typedef struct /** * @} */ + /* Exported macro ------------------------------------------------------------*/ -/** @defgroup SDMMC_LL_Exported_macros SDMMC_LL Exported Macros +/** @defgroup SDIO_LL_Exported_macros SDIO_LL Exported Macros * @{ */ @@ -503,11 +700,10 @@ typedef struct * @} */ -/** @defgroup SDMMC_LL_Register Bits And Addresses Definitions - * @brief SDMMC_LL registers bit address in the alias region +/** @defgroup SDIO_LL_Register Bits And Addresses Definitions + * @brief SDIO_LL registers bit address in the alias region * @{ */ - /* ---------------------- SDIO registers bit mask --------------------------- */ /* --- CLKCR Register ---*/ /* CLKCR register clear mask */ @@ -515,7 +711,6 @@ typedef struct SDIO_CLKCR_BYPASS | SDIO_CLKCR_WIDBUS |\ SDIO_CLKCR_NEGEDGE | SDIO_CLKCR_HWFC_EN)) -/* --- PWRCTRL Register ---*/ /* --- DCTRL Register ---*/ /* SDIO DCTRL Clear Mask */ #define DCTRL_CLEAR_MASK ((uint32_t)(SDIO_DCTRL_DTEN | SDIO_DCTRL_DTDIR |\ @@ -527,46 +722,47 @@ typedef struct SDIO_CMD_WAITINT | SDIO_CMD_WAITPEND |\ SDIO_CMD_CPSMEN | SDIO_CMD_SDIOSUSPEND)) -/* SDIO RESP Registers Address */ -#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14U)) - /* SDIO Initialization Frequency (400KHz max) */ -#define SDIO_INIT_CLK_DIV ((uint8_t)0x76U) +#define SDIO_INIT_CLK_DIV ((uint8_t)0x76) /* SDIO Data Transfer Frequency (25MHz max) */ -#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x00U) +#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x0) + /** * @} */ -/** @defgroup SDMMC_LL_Interrupt_Clock Interrupt And Clock Configuration - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ - +/** @defgroup SDIO_LL_Interrupt_Clock Interrupt And Clock Configuration + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ + /** * @brief Enable the SDIO device. + * @param __INSTANCE__: SDIO Instance * @retval None */ -#define __SDIO_ENABLE() (*(__IO uint32_t *)CLKCR_CLKEN_BB = ENABLE) +#define __SDIO_ENABLE(__INSTANCE__) (*(__IO uint32_t *)CLKCR_CLKEN_BB = ENABLE) /** * @brief Disable the SDIO device. + * @param __INSTANCE__: SDIO Instance * @retval None */ -#define __SDIO_DISABLE() (*(__IO uint32_t *)CLKCR_CLKEN_BB = DISABLE) +#define __SDIO_DISABLE(__INSTANCE__) (*(__IO uint32_t *)CLKCR_CLKEN_BB = DISABLE) /** * @brief Enable the SDIO DMA transfer. + * @param __INSTANCE__: SDIO Instance * @retval None */ -#define __SDIO_DMA_ENABLE() (*(__IO uint32_t *)DCTRL_DMAEN_BB = ENABLE) - +#define __SDIO_DMA_ENABLE(__INSTANCE__) (*(__IO uint32_t *)DCTRL_DMAEN_BB = ENABLE) /** * @brief Disable the SDIO DMA transfer. + * @param __INSTANCE__: SDIO Instance * @retval None */ -#define __SDIO_DMA_DISABLE() (*(__IO uint32_t *)DCTRL_DMAEN_BB = DISABLE) +#define __SDIO_DMA_DISABLE(__INSTANCE__) (*(__IO uint32_t *)DCTRL_DMAEN_BB = DISABLE) /** * @brief Enable the SDIO device interrupt. @@ -582,8 +778,6 @@ typedef struct * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -596,8 +790,7 @@ typedef struct * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt * @retval None */ #define __SDIO_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->MASK |= (__INTERRUPT__)) @@ -616,8 +809,6 @@ typedef struct * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -630,8 +821,7 @@ typedef struct * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt + * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt * @retval None */ #define __SDIO_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->MASK &= ~(__INTERRUPT__)) @@ -650,7 +840,6 @@ typedef struct * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode. * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) * @arg SDIO_FLAG_CMDACT: Command transfer in progress * @arg SDIO_FLAG_TXACT: Data transmit in progress @@ -664,10 +853,9 @@ typedef struct * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval The new state of SDIO_FLAG (SET or RESET). */ -#define __SDIO_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)->STA &(__FLAG__)) != RESET) +#define __SDIO_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)->STA &(__FLAG__)) != RESET) /** @@ -684,13 +872,11 @@ typedef struct * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval None */ -#define __SDIO_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->ICR = (__FLAG__)) +#define __SDIO_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->ICR = (__FLAG__)) /** * @brief Checks whether the specified SDIO interrupt has occurred or not. @@ -706,8 +892,6 @@ typedef struct * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt * @arg SDIO_IT_TXACT: Data transmit in progress interrupt @@ -721,10 +905,9 @@ typedef struct * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt * @retval The new state of SDIO_IT (SET or RESET). */ -#define __SDIO_GET_IT (__INSTANCE__, __INTERRUPT__) (((__INSTANCE__)->STA &(__INTERRUPT__)) == (__INTERRUPT__)) +#define __SDIO_GET_IT (__INSTANCE__, __INTERRUPT__) (((__INSTANCE__)->STA &(__INTERRUPT__)) == (__INTERRUPT__)) /** * @brief Clears the SDIO's interrupt pending bits. @@ -740,66 +923,70 @@ typedef struct * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt * @arg SDIO_IT_DATAEND: Data end (data counter, SDIO_DCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 * @retval None */ -#define __SDIO_CLEAR_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->ICR = (__INTERRUPT__)) +#define __SDIO_CLEAR_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->ICR = (__INTERRUPT__)) /** * @brief Enable Start the SD I/O Read Wait operation. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_START_READWAIT_ENABLE() (*(__IO uint32_t *) DCTRL_RWSTART_BB = ENABLE) +#define __SDIO_START_READWAIT_ENABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_RWSTART_BB = ENABLE) /** * @brief Disable Start the SD I/O Read Wait operations. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_START_READWAIT_DISABLE() (*(__IO uint32_t *) DCTRL_RWSTART_BB = DISABLE) +#define __SDIO_START_READWAIT_DISABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_RWSTART_BB = DISABLE) /** * @brief Enable Start the SD I/O Read Wait operation. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_STOP_READWAIT_ENABLE() (*(__IO uint32_t *) DCTRL_RWSTOP_BB = ENABLE) +#define __SDIO_STOP_READWAIT_ENABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_RWSTOP_BB = ENABLE) /** * @brief Disable Stop the SD I/O Read Wait operations. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_STOP_READWAIT_DISABLE() (*(__IO uint32_t *) DCTRL_RWSTOP_BB = DISABLE) +#define __SDIO_STOP_READWAIT_DISABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_RWSTOP_BB = DISABLE) /** * @brief Enable the SD I/O Mode Operation. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_OPERATION_ENABLE() (*(__IO uint32_t *) DCTRL_SDIOEN_BB = ENABLE) +#define __SDIO_OPERATION_ENABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_SDIOEN_BB = ENABLE) /** * @brief Disable the SD I/O Mode Operation. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_OPERATION_DISABLE() (*(__IO uint32_t *) DCTRL_SDIOEN_BB = DISABLE) +#define __SDIO_OPERATION_DISABLE(__INSTANCE__) (*(__IO uint32_t *) DCTRL_SDIOEN_BB = DISABLE) /** * @brief Enable the SD I/O Suspend command sending. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_SUSPEND_CMD_ENABLE() (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = ENABLE) +#define __SDIO_SUSPEND_CMD_ENABLE(__INSTANCE__) (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = ENABLE) /** * @brief Disable the SD I/O Suspend command sending. + * @param __INSTANCE__ : Pointer to SDIO register base * @retval None */ -#define __SDIO_SUSPEND_CMD_DISABLE() (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = DISABLE) - +#define __SDIO_SUSPEND_CMD_DISABLE(__INSTANCE__) (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = DISABLE) + #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) /** * @brief Enable the command completion signal. * @retval None @@ -836,8 +1023,8 @@ typedef struct */ #define __SDIO_CEATA_SENDCMD_DISABLE() (*(__IO uint32_t *) CMD_ATACMD_BB = DISABLE) #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE ||\ - STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ - STM32F412Cx */ + STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + /** * @} */ @@ -864,7 +1051,6 @@ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init); /** @addtogroup HAL_SDMMC_LL_Group2 * @{ */ -/* Blocking mode: Polling */ uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx); HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData); /** @@ -880,17 +1066,45 @@ HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx); uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx); /* Command path state machine (CPSM) management functions */ -HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *Command); uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx); -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); +uint32_t SDIO_GetResponse(SDIO_TypeDef *SDIOx, uint32_t Response); /* Data path state machine (DPSM) management functions */ -HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDIO_DataInitStruct); +HAL_StatusTypeDef SDIO_ConfigData(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* Data); uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx); uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx); -/* SDIO IO Cards mode management functions */ -HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +/* SDMMC Cards mode management functions */ +HAL_StatusTypeDef SDIO_SetSDMMCReadWaitMode(SDIO_TypeDef *SDIOx, uint32_t SDIO_ReadWaitMode); + +/* SDMMC Commands management functions */ +uint32_t SDMMC_CmdBlockLength(SDIO_TypeDef *SDIOx, uint32_t BlockSize); +uint32_t SDMMC_CmdReadSingleBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd); +uint32_t SDMMC_CmdReadMultiBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd); +uint32_t SDMMC_CmdWriteSingleBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd); +uint32_t SDMMC_CmdWriteMultiBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd); +uint32_t SDMMC_CmdSDEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd); +uint32_t SDMMC_CmdSDEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd); +uint32_t SDMMC_CmdErase(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdStopTransfer(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdSelDesel(SDIO_TypeDef *SDIOx, uint64_t Addr); +uint32_t SDMMC_CmdGoIdleState(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdOperCond(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdAppCommand(SDIO_TypeDef *SDIOx, uint32_t Argument); +uint32_t SDMMC_CmdAppOperCommand(SDIO_TypeDef *SDIOx, uint32_t SdType); +uint32_t SDMMC_CmdBusWidth(SDIO_TypeDef *SDIOx, uint32_t BusWidth); +uint32_t SDMMC_CmdSendSCR(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdSendCID(SDIO_TypeDef *SDIOx); +uint32_t SDMMC_CmdSendCSD(SDIO_TypeDef *SDIOx, uint32_t Argument); +uint32_t SDMMC_CmdSetRelAdd(SDIO_TypeDef *SDIOx, uint16_t *pRCA); +uint32_t SDMMC_CmdSendStatus(SDIO_TypeDef *SDIOx, uint32_t Argument); +uint32_t SDMMC_CmdStatusRegister(SDIO_TypeDef *SDIOx); + +uint32_t SDMMC_CmdOpCondition(SDIO_TypeDef *SDIOx, uint32_t Argument); +uint32_t SDMMC_CmdSwitch(SDIO_TypeDef *SDIOx, uint32_t Argument); +uint32_t SDMMC_CmdEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd); +uint32_t SDMMC_CmdEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd); /** * @} @@ -907,9 +1121,11 @@ HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); /** * @} */ + #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + #ifdef __cplusplus } #endif diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h new file mode 100644 index 0000000..0f86df8 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h @@ -0,0 +1,2038 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_spi.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of SPI LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_SPI_H +#define __STM32F4xx_LL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) + +/** @defgroup SPI_LL SPI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_ES_INIT SPI Exported Init structure + * @{ + */ + +/** + * @brief SPI Init structures definition + */ +typedef struct +{ + uint32_t TransferDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_LL_EC_TRANSFER_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferDirection().*/ + + uint32_t Mode; /*!< Specifies the SPI mode (Master/Slave). + This parameter can be a value of @ref SPI_LL_EC_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetMode().*/ + + uint32_t DataWidth; /*!< Specifies the SPI data width. + This parameter can be a value of @ref SPI_LL_EC_DATAWIDTH. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetDataWidth().*/ + + uint32_t ClockPolarity; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_LL_EC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPolarity().*/ + + uint32_t ClockPhase; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_LL_EC_PHASE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetClockPhase().*/ + + uint32_t NSS; /*!< Specifies whether the NSS signal is managed by hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_LL_EC_NSS_MODE. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetNSSMode().*/ + + uint32_t BaudRate; /*!< Specifies the BaudRate prescaler value which will be used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_LL_EC_BAUDRATEPRESCALER. + @note The communication clock is derived from the master clock. The slave clock does not need to be set. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetBaudRatePrescaler().*/ + + uint32_t BitOrder; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_LL_EC_BIT_ORDER. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetTransferBitOrder().*/ + + uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. + This parameter can be a value of @ref SPI_LL_EC_CRC_CALCULATION. + + This feature can be modified afterwards using unitary functions @ref LL_SPI_EnableCRC() and @ref LL_SPI_DisableCRC().*/ + + uint32_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF. + + This feature can be modified afterwards using unitary function @ref LL_SPI_SetCRCPolynomial().*/ + +} LL_SPI_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Constants SPI Exported Constants + * @{ + */ + +/** @defgroup SPI_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_SPI_ReadReg function + * @{ + */ +#define LL_SPI_SR_RXNE SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_SPI_SR_TXE SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_SPI_SR_BSY SPI_SR_BSY /*!< Busy flag */ +#define LL_SPI_SR_CRCERR SPI_SR_CRCERR /*!< CRC error flag */ +#define LL_SPI_SR_MODF SPI_SR_MODF /*!< Mode fault flag */ +#define LL_SPI_SR_OVR SPI_SR_OVR /*!< Overrun flag */ +#define LL_SPI_SR_FRE SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_SPI_CR2_RXNEIE SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_SPI_CR2_TXEIE SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_SPI_CR2_ERRIE SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) /*!< Master configuration */ +#define LL_SPI_MODE_SLAVE 0x00000000U /*!< Slave configuration */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_PROTOCOL Serial Protocol + * @{ + */ +#define LL_SPI_PROTOCOL_MOTOROLA 0x00000000U /*!< Motorola mode. Used as default value */ +#define LL_SPI_PROTOCOL_TI (SPI_CR2_FRF) /*!< TI mode */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_PHASE Clock Phase + * @{ + */ +#define LL_SPI_PHASE_1EDGE 0x00000000U /*!< First clock transition is the first data capture edge */ +#define LL_SPI_PHASE_2EDGE (SPI_CR1_CPHA) /*!< Second clock transition is the first data capture edge */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_SPI_POLARITY_LOW 0x00000000U /*!< Clock to 0 when idle */ +#define LL_SPI_POLARITY_HIGH (SPI_CR1_CPOL) /*!< Clock to 1 when idle */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BAUDRATEPRESCALER Baud Rate Prescaler + * @{ + */ +#define LL_SPI_BAUDRATEPRESCALER_DIV2 0x00000000U /*!< BaudRate control equal to fPCLK/2 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV4 (SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/4 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV8 (SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/8 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV16 (SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/16 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV32 (SPI_CR1_BR_2) /*!< BaudRate control equal to fPCLK/32 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV64 (SPI_CR1_BR_2 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/64 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV128 (SPI_CR1_BR_2 | SPI_CR1_BR_1) /*!< BaudRate control equal to fPCLK/128 */ +#define LL_SPI_BAUDRATEPRESCALER_DIV256 (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0) /*!< BaudRate control equal to fPCLK/256 */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_BIT_ORDER Transmission Bit Order + * @{ + */ +#define LL_SPI_LSB_FIRST (SPI_CR1_LSBFIRST) /*!< Data is transmitted/received with the LSB first */ +#define LL_SPI_MSB_FIRST 0x00000000U /*!< Data is transmitted/received with the MSB first */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_TRANSFER_MODE Transfer Mode + * @{ + */ +#define LL_SPI_FULL_DUPLEX 0x00000000U /*!< Full-Duplex mode. Rx and Tx transfer on 2 lines */ +#define LL_SPI_SIMPLEX_RX (SPI_CR1_RXONLY) /*!< Simplex Rx mode. Rx transfer only on 1 line */ +#define LL_SPI_HALF_DUPLEX_RX (SPI_CR1_BIDIMODE) /*!< Half-Duplex Rx mode. Rx transfer on 1 line */ +#define LL_SPI_HALF_DUPLEX_TX (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE) /*!< Half-Duplex Tx mode. Tx transfer on 1 line */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_NSS_MODE Slave Select Pin Mode + * @{ + */ +#define LL_SPI_NSS_SOFT (SPI_CR1_SSM) /*!< NSS managed internally. NSS pin not used and free */ +#define LL_SPI_NSS_HARD_INPUT 0x00000000U /*!< NSS pin used in Input. Only used in Master mode */ +#define LL_SPI_NSS_HARD_OUTPUT (((uint32_t)SPI_CR2_SSOE << 16U)) /*!< NSS pin used in Output. Only used in Slave mode as chip select */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_DATAWIDTH Datawidth + * @{ + */ +#define LL_SPI_DATAWIDTH_8BIT 0x00000000U /*!< Data length for SPI transfer: 8 bits */ +#define LL_SPI_DATAWIDTH_16BIT (SPI_CR1_DFF) /*!< Data length for SPI transfer: 16 bits */ +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup SPI_LL_EC_CRC_CALCULATION CRC Calculation + * @{ + */ +#define LL_SPI_CRCCALCULATION_DISABLE 0x00000000U /*!< CRC calculation disabled */ +#define LL_SPI_CRCCALCULATION_ENABLE (SPI_CR1_CRCEN) /*!< CRC calculation enabled */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Macros SPI Exported Macros + * @{ + */ + +/** @defgroup SPI_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_SPI_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in SPI register + * @param __INSTANCE__ SPI Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_SPI_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SPI_LL_Exported_Functions SPI Exported Functions + * @{ + */ + +/** @defgroup SPI_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable SPI peripheral + * @rmtoll CR1 SPE LL_SPI_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Disable SPI peripheral + * @note When disabling the SPI, follow the procedure described in the Reference Manual. + * @rmtoll CR1 SPE LL_SPI_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); +} + +/** + * @brief Check if SPI peripheral is enabled + * @rmtoll CR1 SPE LL_SPI_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabled(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR1, SPI_CR1_SPE) == (SPI_CR1_SPE)); +} + +/** + * @brief Set SPI operation mode to Master or Slave + * @note This bit should not be changed when communication is ongoing. + * @rmtoll CR1 MSTR LL_SPI_SetMode\n + * CR1 SSI LL_SPI_SetMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI, Mode); +} + +/** + * @brief Get SPI operation mode (Master or Slave) + * @rmtoll CR1 MSTR LL_SPI_GetMode\n + * CR1 SSI LL_SPI_GetMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_MODE_MASTER + * @arg @ref LL_SPI_MODE_SLAVE + */ +__STATIC_INLINE uint32_t LL_SPI_GetMode(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSTR | SPI_CR1_SSI)); +} + +/** + * @brief Set serial protocol used + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR2 FRF LL_SPI_SetStandard + * @param SPIx SPI Instance + * @param Standard This parameter can be one of the following values: + * @arg @ref LL_SPI_PROTOCOL_MOTOROLA + * @arg @ref LL_SPI_PROTOCOL_TI + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_FRF, Standard); +} + +/** + * @brief Get serial protocol used + * @rmtoll CR2 FRF LL_SPI_GetStandard + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_PROTOCOL_MOTOROLA + * @arg @ref LL_SPI_PROTOCOL_TI + */ +__STATIC_INLINE uint32_t LL_SPI_GetStandard(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_FRF)); +} + +/** + * @brief Set clock phase + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPHA LL_SPI_SetClockPhase + * @param SPIx SPI Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPhase(SPI_TypeDef *SPIx, uint32_t ClockPhase) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA, ClockPhase); +} + +/** + * @brief Get clock phase + * @rmtoll CR1 CPHA LL_SPI_GetClockPhase + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_PHASE_1EDGE + * @arg @ref LL_SPI_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPhase(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA)); +} + +/** + * @brief Set clock polarity + * @note This bit should not be changed when communication is ongoing. + * This bit is not used in SPI TI mode. + * @rmtoll CR1 CPOL LL_SPI_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL, ClockPolarity); +} + +/** + * @brief Get clock polarity + * @rmtoll CR1 CPOL LL_SPI_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_POLARITY_LOW + * @arg @ref LL_SPI_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_SPI_GetClockPolarity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL)); +} + +/** + * @brief Set baud rate prescaler + * @note These bits should not be changed when communication is ongoing. SPI BaudRate = fPCLK/Prescaler. + * @rmtoll CR1 BR LL_SPI_SetBaudRatePrescaler + * @param SPIx SPI Instance + * @param BaudRate This parameter can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetBaudRatePrescaler(SPI_TypeDef *SPIx, uint32_t BaudRate) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_BR, BaudRate); +} + +/** + * @brief Get baud rate prescaler + * @rmtoll CR1 BR LL_SPI_GetBaudRatePrescaler + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV2 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV4 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV8 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV16 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV32 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV64 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV128 + * @arg @ref LL_SPI_BAUDRATEPRESCALER_DIV256 + */ +__STATIC_INLINE uint32_t LL_SPI_GetBaudRatePrescaler(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BR)); +} + +/** + * @brief Set transfer bit order + * @note This bit should not be changed when communication is ongoing. This bit is not used in SPI TI mode. + * @rmtoll CR1 LSBFIRST LL_SPI_SetTransferBitOrder + * @param SPIx SPI Instance + * @param BitOrder This parameter can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferBitOrder(SPI_TypeDef *SPIx, uint32_t BitOrder) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_LSBFIRST, BitOrder); +} + +/** + * @brief Get transfer bit order + * @rmtoll CR1 LSBFIRST LL_SPI_GetTransferBitOrder + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_LSB_FIRST + * @arg @ref LL_SPI_MSB_FIRST + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferBitOrder(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBFIRST)); +} + +/** + * @brief Set transfer direction mode + * @note For Half-Duplex mode, Rx Direction is set by default. + * In master mode, the MOSI pin is used and in slave mode, the MISO pin is used for Half-Duplex. + * @rmtoll CR1 RXONLY LL_SPI_SetTransferDirection\n + * CR1 BIDIMODE LL_SPI_SetTransferDirection\n + * CR1 BIDIOE LL_SPI_SetTransferDirection + * @param SPIx SPI Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetTransferDirection(SPI_TypeDef *SPIx, uint32_t TransferDirection) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE, TransferDirection); +} + +/** + * @brief Get transfer direction mode + * @rmtoll CR1 RXONLY LL_SPI_GetTransferDirection\n + * CR1 BIDIMODE LL_SPI_GetTransferDirection\n + * CR1 BIDIOE LL_SPI_GetTransferDirection + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_FULL_DUPLEX + * @arg @ref LL_SPI_SIMPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_RX + * @arg @ref LL_SPI_HALF_DUPLEX_TX + */ +__STATIC_INLINE uint32_t LL_SPI_GetTransferDirection(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE)); +} + +/** + * @brief Set frame data width + * @rmtoll CR1 DFF LL_SPI_SetDataWidth + * @param SPIx SPI Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetDataWidth(SPI_TypeDef *SPIx, uint32_t DataWidth) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_DFF, DataWidth); +} + +/** + * @brief Get frame data width + * @rmtoll CR1 DFF LL_SPI_GetDataWidth + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_DATAWIDTH_8BIT + * @arg @ref LL_SPI_DATAWIDTH_16BIT + */ +__STATIC_INLINE uint32_t LL_SPI_GetDataWidth(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_DFF)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_CRC_Management CRC Management + * @{ + */ + +/** + * @brief Enable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_EnableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableCRC(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Disable CRC + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_DisableCRC + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableCRC(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_CRCEN); +} + +/** + * @brief Check if CRC is enabled + * @note This bit should be written only when SPI is disabled (SPE = 0) for correct operation. + * @rmtoll CR1 CRCEN LL_SPI_IsEnabledCRC + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledCRC(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR1, SPI_CR1_CRCEN) == (SPI_CR1_CRCEN)); +} + +/** + * @brief Set CRCNext to transfer CRC on the line + * @note This bit has to be written as soon as the last data is written in the SPIx_DR register. + * @rmtoll CR1 CRCNEXT LL_SPI_SetCRCNext + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT); +} + +/** + * @brief Set polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_SetCRCPolynomial + * @param SPIx SPI Instance + * @param CRCPoly This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetCRCPolynomial(SPI_TypeDef *SPIx, uint32_t CRCPoly) +{ + WRITE_REG(SPIx->CRCPR, (uint16_t)CRCPoly); +} + +/** + * @brief Get polynomial for CRC calculation + * @rmtoll CRCPR CRCPOLY LL_SPI_GetCRCPolynomial + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetCRCPolynomial(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->CRCPR)); +} + +/** + * @brief Get Rx CRC + * @rmtoll RXCRCR RXCRC LL_SPI_GetRxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetRxCRC(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->RXCRCR)); +} + +/** + * @brief Get Tx CRC + * @rmtoll TXCRCR TXCRC LL_SPI_GetTxCRC + * @param SPIx SPI Instance + * @retval Returned value is a number between Min_Data = 0x00 and Max_Data = 0xFFFF + */ +__STATIC_INLINE uint32_t LL_SPI_GetTxCRC(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_REG(SPIx->TXCRCR)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_NSS_Management Slave Select Pin Management + * @{ + */ + +/** + * @brief Set NSS mode + * @note LL_SPI_NSS_SOFT Mode is not used in SPI TI mode. + * @rmtoll CR1 SSM LL_SPI_SetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_SetNSSMode + * @param SPIx SPI Instance + * @param NSS This parameter can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_SPI_SetNSSMode(SPI_TypeDef *SPIx, uint32_t NSS) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_SSM, NSS); + MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, ((uint32_t)(NSS >> 16U))); +} + +/** + * @brief Get NSS mode + * @rmtoll CR1 SSM LL_SPI_GetNSSMode\n + * @rmtoll CR2 SSOE LL_SPI_GetNSSMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_SPI_NSS_SOFT + * @arg @ref LL_SPI_NSS_HARD_INPUT + * @arg @ref LL_SPI_NSS_HARD_OUTPUT + */ +__STATIC_INLINE uint32_t LL_SPI_GetNSSMode(SPI_TypeDef *SPIx) +{ + register uint32_t Ssm = (READ_BIT(SPIx->CR1, SPI_CR1_SSM)); + register uint32_t Ssoe = (READ_BIT(SPIx->CR2, SPI_CR2_SSOE) << 16U); + return (Ssm | Ssoe); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_SPI_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_RXNE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_RXNE) == (SPI_SR_RXNE)); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_SPI_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_TXE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_TXE) == (SPI_SR_TXE)); +} + +/** + * @brief Get CRC error flag + * @rmtoll SR CRCERR LL_SPI_IsActiveFlag_CRCERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_CRCERR(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_CRCERR) == (SPI_SR_CRCERR)); +} + +/** + * @brief Get mode fault error flag + * @rmtoll SR MODF LL_SPI_IsActiveFlag_MODF + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_MODF(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_MODF) == (SPI_SR_MODF)); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_SPI_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_OVR(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_OVR) == (SPI_SR_OVR)); +} + +/** + * @brief Get busy flag + * @note The BSY flag is cleared under any one of the following conditions: + * -When the SPI is correctly disabled + * -When a fault is detected in Master mode (MODF bit set to 1) + * -In Master mode, when it finishes a data transmission and no new data is ready to be + * sent + * -In Slave mode, when the BSY flag is set to '0' for at least one SPI clock cycle between + * each data transfer. + * @rmtoll SR BSY LL_SPI_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_BSY(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_BSY) == (SPI_SR_BSY)); +} + +/** + * @brief Get frame format error flag + * @rmtoll SR FRE LL_SPI_IsActiveFlag_FRE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsActiveFlag_FRE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_FRE) == (SPI_SR_FRE)); +} + +/** + * @brief Clear CRC error flag + * @rmtoll SR CRCERR LL_SPI_ClearFlag_CRCERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_CRCERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->SR, SPI_SR_CRCERR); +} + +/** + * @brief Clear mode fault error flag + * @note Clearing this flag is done by a read access to the SPIx_SR + * register followed by a write access to the SPIx_CR1 register + * @rmtoll SR MODF LL_SPI_ClearFlag_MODF + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_MODF(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; + tmpreg = CLEAR_BIT(SPIx->CR1, SPI_CR1_SPE); + (void) tmpreg; +} + +/** + * @brief Clear overrun error flag + * @note Clearing this flag is done by a read access to the SPIx_DR + * register followed by a read access to the SPIx_SR register + * @rmtoll SR OVR LL_SPI_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_OVR(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->DR; + (void) tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @brief Clear frame format error flag + * @note Clearing this flag is done by reading SPIx_SR register + * @rmtoll SR FRE LL_SPI_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_ClearFlag_FRE(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void) tmpreg; +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_IT_Management Interrupt Management + * @{ + */ + +/** + * @brief Enable error interrupt + * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Enable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Enable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Disable error interrupt + * @note This bit controls the generation of an interrupt when an error condition occurs (CRCERR, OVR, MODF in SPI mode, FRE at TI mode). + * @rmtoll CR2 ERRIE LL_SPI_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_ERRIE); +} + +/** + * @brief Disable Rx buffer not empty interrupt + * @rmtoll CR2 RXNEIE LL_SPI_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXNEIE); +} + +/** + * @brief Disable Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXEIE); +} + +/** + * @brief Check if error interrupt is enabled + * @rmtoll CR2 ERRIE LL_SPI_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_ERR(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR2, SPI_CR2_ERRIE) == (SPI_CR2_ERRIE)); +} + +/** + * @brief Check if Rx buffer not empty interrupt is enabled + * @rmtoll CR2 RXNEIE LL_SPI_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_RXNE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR2, SPI_CR2_RXNEIE) == (SPI_CR2_RXNEIE)); +} + +/** + * @brief Check if Tx buffer empty interrupt + * @rmtoll CR2 TXEIE LL_SPI_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledIT_TXE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR2, SPI_CR2_TXEIE) == (SPI_CR2_TXEIE)); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DMA_Management DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_SPI_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXDMAEN); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_SPI_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_RX(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR2, SPI_CR2_RXDMAEN) == (SPI_CR2_RXDMAEN)); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_SPI_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_SPI_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXDMAEN); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_SPI_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SPI_IsEnabledDMAReq_TX(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->CR2, SPI_CR2_TXDMAEN) == (SPI_CR2_TXDMAEN)); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_SPI_DMA_GetRegAddr + * @param SPIx SPI Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_SPI_DMA_GetRegAddr(SPI_TypeDef *SPIx) +{ + return (uint32_t) & (SPIx->DR); +} + +/** + * @} + */ + +/** @defgroup SPI_LL_EF_DATA_Management DATA Management + * @{ + */ + +/** + * @brief Read 8-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData8 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx) +{ + return (uint8_t)(READ_REG(SPIx->DR)); +} + +/** + * @brief Read 16-Bits in the data register + * @rmtoll DR DR LL_SPI_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx) +{ + return (uint16_t)(READ_REG(SPIx->DR)); +} + +/** + * @brief Write 8-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData8 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData) +{ + SPIx->DR = TxData; +} + +/** + * @brief Write 16-Bits in the data register + * @rmtoll DR DR LL_SPI_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ + SPIx->DR = TxData; +} + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup SPI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_SPI_DeInit(SPI_TypeDef *SPIx); +ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct); +void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup I2S_LL I2S + * @{ + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_ES_INIT I2S Exported Init structure + * @{ + */ + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + uint32_t Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_LL_EC_MODE + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetTransferMode().*/ + + uint32_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_STANDARD + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetStandard().*/ + + + uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_DATA_FORMAT + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetDataFormat().*/ + + + uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_LL_EC_MCLK_OUTPUT + + This feature can be modified afterwards using unitary functions @ref LL_I2S_EnableMasterClock() or @ref LL_I2S_DisableMasterClock.*/ + + + uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_LL_EC_AUDIO_FREQ + + Audio Frequency can be modified afterwards using Reference manual formulas to calculate Prescaler Linear, Parity + and unitary functions @ref LL_I2S_SetPrescalerLinear() and @ref LL_I2S_SetPrescalerParity() to set it.*/ + + + uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_LL_EC_POLARITY + + This feature can be modified afterwards using unitary function @ref LL_I2S_SetClockPolarity().*/ + +} LL_I2S_InitTypeDef; + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Constants I2S Exported Constants + * @{ + */ + +/** @defgroup I2S_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2S_ReadReg function + * @{ + */ +#define LL_I2S_SR_RXNE LL_SPI_SR_RXNE /*!< Rx buffer not empty flag */ +#define LL_I2S_SR_TXE LL_SPI_SR_TXE /*!< Tx buffer empty flag */ +#define LL_I2S_SR_BSY LL_SPI_SR_BSY /*!< Busy flag */ +#define LL_I2S_SR_UDR SPI_SR_UDR /*!< Underrun flag */ +#define LL_I2S_SR_OVR LL_SPI_SR_OVR /*!< Overrun flag */ +#define LL_I2S_SR_FRE LL_SPI_SR_FRE /*!< TI mode frame format error flag */ +/** + * @} + */ + +/** @defgroup SPI_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_SPI_ReadReg and LL_SPI_WriteReg functions + * @{ + */ +#define LL_I2S_CR2_RXNEIE LL_SPI_CR2_RXNEIE /*!< Rx buffer not empty interrupt enable */ +#define LL_I2S_CR2_TXEIE LL_SPI_CR2_TXEIE /*!< Tx buffer empty interrupt enable */ +#define LL_I2S_CR2_ERRIE LL_SPI_CR2_ERRIE /*!< Error interrupt enable */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_DATA_FORMAT Data format + * @{ + */ +#define LL_I2S_DATAFORMAT_16B 0x00000000U /*!< Data length 16 bits, Channel lenght 16bit */ +#define LL_I2S_DATAFORMAT_16B_EXTENDED (SPI_I2SCFGR_CHLEN) /*!< Data length 16 bits, Channel lenght 32bit */ +#define LL_I2S_DATAFORMAT_24B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0) /*!< Data length 24 bits, Channel lenght 32bit */ +#define LL_I2S_DATAFORMAT_32B (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1) /*!< Data length 16 bits, Channel lenght 32bit */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_I2S_POLARITY_LOW 0x00000000U /*!< Clock steady state is low level */ +#define LL_I2S_POLARITY_HIGH (SPI_I2SCFGR_CKPOL) /*!< Clock steady state is high level */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_STANDARD I2s Standard + * @{ + */ +#define LL_I2S_STANDARD_PHILIPS 0x00000000U /*!< I2S standard philips */ +#define LL_I2S_STANDARD_MSB (SPI_I2SCFGR_I2SSTD_0) /*!< MSB justified standard (left justified) */ +#define LL_I2S_STANDARD_LSB (SPI_I2SCFGR_I2SSTD_1) /*!< LSB justified standard (right justified) */ +#define LL_I2S_STANDARD_PCM_SHORT (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1) /*!< PCM standard, short frame synchronization */ +#define LL_I2S_STANDARD_PCM_LONG (SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC) /*!< PCM standard, long frame synchronization */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_MODE Operation Mode + * @{ + */ +#define LL_I2S_MODE_SLAVE_TX 0x00000000U /*!< Slave Tx configuration */ +#define LL_I2S_MODE_SLAVE_RX (SPI_I2SCFGR_I2SCFG_0) /*!< Slave Rx configuration */ +#define LL_I2S_MODE_MASTER_TX (SPI_I2SCFGR_I2SCFG_1) /*!< Master Tx configuration */ +#define LL_I2S_MODE_MASTER_RX (SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1) /*!< Master Rx configuration */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_PRESCALER_FACTOR Prescaler Factor + * @{ + */ +#define LL_I2S_PRESCALER_PARITY_EVEN 0x00000000U /*!< Odd factor: Real divider value is = I2SDIV * 2 */ +#define LL_I2S_PRESCALER_PARITY_ODD (SPI_I2SPR_ODD >> 8U) /*!< Odd factor: Real divider value is = (I2SDIV * 2)+1 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup I2S_LL_EC_MCLK_OUTPUT MCLK Output + * @{ + */ +#define LL_I2S_MCLK_OUTPUT_DISABLE 0x00000000U /*!< Master clock output is disabled */ +#define LL_I2S_MCLK_OUTPUT_ENABLE (SPI_I2SPR_MCKOE) /*!< Master clock output is enabled */ +/** + * @} + */ + +/** @defgroup I2S_LL_EC_AUDIO_FREQ Audio Frequency + * @{ + */ + +#define LL_I2S_AUDIOFREQ_192K 192000U /*!< Audio Frequency configuration 192000 Hz */ +#define LL_I2S_AUDIOFREQ_96K 96000U /*!< Audio Frequency configuration 96000 Hz */ +#define LL_I2S_AUDIOFREQ_48K 48000U /*!< Audio Frequency configuration 48000 Hz */ +#define LL_I2S_AUDIOFREQ_44K 44100U /*!< Audio Frequency configuration 44100 Hz */ +#define LL_I2S_AUDIOFREQ_32K 32000U /*!< Audio Frequency configuration 32000 Hz */ +#define LL_I2S_AUDIOFREQ_22K 22050U /*!< Audio Frequency configuration 22050 Hz */ +#define LL_I2S_AUDIOFREQ_16K 16000U /*!< Audio Frequency configuration 16000 Hz */ +#define LL_I2S_AUDIOFREQ_11K 11025U /*!< Audio Frequency configuration 11025 Hz */ +#define LL_I2S_AUDIOFREQ_8K 8000U /*!< Audio Frequency configuration 8000 Hz */ +#define LL_I2S_AUDIOFREQ_DEFAULT 2U /*!< Audio Freq not specified. Register I2SDIV = 2 */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2S_LL_Exported_Macros I2S Exported Macros + * @{ + */ + +/** @defgroup I2S_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_I2S_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in I2S register + * @param __INSTANCE__ I2S Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_I2S_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup I2S_LL_Exported_Functions I2S Exported Functions + * @{ + */ + +/** @defgroup I2S_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Select I2S mode and Enable I2S peripheral + * @rmtoll I2SCFGR I2SMOD LL_I2S_Enable\n + * I2SCFGR I2SE LL_I2S_Enable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Enable(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Disable I2S peripheral + * @rmtoll I2SCFGR I2SE LL_I2S_Disable + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_Disable(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SE); +} + +/** + * @brief Check if I2S peripheral is enabled + * @rmtoll I2SCFGR I2SE LL_I2S_IsEnabled + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabled(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SE) == (SPI_I2SCFGR_I2SE)); +} + +/** + * @brief Set I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_SetDataFormat\n + * I2SCFGR CHLEN LL_I2S_SetDataFormat + * @param SPIx SPI Instance + * @param DataFormat This parameter can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetDataFormat(SPI_TypeDef *SPIx, uint32_t DataFormat) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN, DataFormat); +} + +/** + * @brief Get I2S data frame length + * @rmtoll I2SCFGR DATLEN LL_I2S_GetDataFormat\n + * I2SCFGR CHLEN LL_I2S_GetDataFormat + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_DATAFORMAT_16B + * @arg @ref LL_I2S_DATAFORMAT_16B_EXTENDED + * @arg @ref LL_I2S_DATAFORMAT_24B + * @arg @ref LL_I2S_DATAFORMAT_32B + */ +__STATIC_INLINE uint32_t LL_I2S_GetDataFormat(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN)); +} + +/** + * @brief Set I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_SetClockPolarity + * @param SPIx SPI Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetClockPolarity(SPI_TypeDef *SPIx, uint32_t ClockPolarity) +{ + SET_BIT(SPIx->I2SCFGR, ClockPolarity); +} + +/** + * @brief Get I2S clock polarity + * @rmtoll I2SCFGR CKPOL LL_I2S_GetClockPolarity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_POLARITY_LOW + * @arg @ref LL_I2S_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_I2S_GetClockPolarity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_CKPOL)); +} + +/** + * @brief Set I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_SetStandard\n + * I2SCFGR PCMSYNC LL_I2S_SetStandard + * @param SPIx SPI Instance + * @param Standard This parameter can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetStandard(SPI_TypeDef *SPIx, uint32_t Standard) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC, Standard); +} + +/** + * @brief Get I2S standard protocol + * @rmtoll I2SCFGR I2SSTD LL_I2S_GetStandard\n + * I2SCFGR PCMSYNC LL_I2S_GetStandard + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_STANDARD_PHILIPS + * @arg @ref LL_I2S_STANDARD_MSB + * @arg @ref LL_I2S_STANDARD_LSB + * @arg @ref LL_I2S_STANDARD_PCM_SHORT + * @arg @ref LL_I2S_STANDARD_PCM_LONG + */ +__STATIC_INLINE uint32_t LL_I2S_GetStandard(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC)); +} + +/** + * @brief Set I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_SetTransferMode + * @param SPIx SPI Instance + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetTransferMode(SPI_TypeDef *SPIx, uint32_t Mode) +{ + MODIFY_REG(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG, Mode); +} + +/** + * @brief Get I2S transfer mode + * @rmtoll I2SCFGR I2SCFG LL_I2S_GetTransferMode + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_MODE_SLAVE_TX + * @arg @ref LL_I2S_MODE_SLAVE_RX + * @arg @ref LL_I2S_MODE_MASTER_TX + * @arg @ref LL_I2S_MODE_MASTER_RX + */ +__STATIC_INLINE uint32_t LL_I2S_GetTransferMode(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SCFG)); +} + +/** + * @brief Set I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_SetPrescalerLinear + * @param SPIx SPI Instance + * @param PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerLinear(SPI_TypeDef *SPIx, uint8_t PrescalerLinear) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV, PrescalerLinear); +} + +/** + * @brief Get I2S linear prescaler + * @rmtoll I2SPR I2SDIV LL_I2S_GetPrescalerLinear + * @param SPIx SPI Instance + * @retval PrescalerLinear Value between Min_Data=0x02 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerLinear(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_I2SDIV)); +} + +/** + * @brief Set I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_SetPrescalerParity + * @param SPIx SPI Instance + * @param PrescalerParity This parameter can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_I2S_SetPrescalerParity(SPI_TypeDef *SPIx, uint32_t PrescalerParity) +{ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_ODD, PrescalerParity << 8U); +} + +/** + * @brief Get I2S parity prescaler + * @rmtoll I2SPR ODD LL_I2S_GetPrescalerParity + * @param SPIx SPI Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_I2S_GetPrescalerParity(SPI_TypeDef *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->I2SPR, SPI_I2SPR_ODD) >> 8U); +} + +/** + * @brief Enable the master clock ouput (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_EnableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableMasterClock(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Disable the master clock ouput (Pin MCK) + * @rmtoll I2SPR MCKOE LL_I2S_DisableMasterClock + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableMasterClock(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE); +} + +/** + * @brief Check if the master clock ouput (Pin MCK) is enabled + * @rmtoll I2SPR MCKOE LL_I2S_IsEnabledMasterClock + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledMasterClock(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->I2SPR, SPI_I2SPR_MCKOE) == (SPI_I2SPR_MCKOE)); +} + +#if defined(SPI_I2SCFGR_ASTRTEN) +/** + * @brief Enable asynchronous start + * @rmtoll I2SCFGR ASTRTEN LL_I2S_EnableAsyncStart + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableAsyncStart(SPI_TypeDef *SPIx) +{ + SET_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); +} + +/** + * @brief Disable asynchronous start + * @rmtoll I2SCFGR ASTRTEN LL_I2S_DisableAsyncStart + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableAsyncStart(SPI_TypeDef *SPIx) +{ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN); +} + +/** + * @brief Check if asynchronous start is enabled + * @rmtoll I2SCFGR ASTRTEN LL_I2S_IsEnabledAsyncStart + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledAsyncStart(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_ASTRTEN) == (SPI_I2SCFGR_ASTRTEN)); +} +#endif /* SPI_I2SCFGR_ASTRTEN */ + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_FLAG FLAG Management + * @{ + */ + +/** + * @brief Check if Rx buffer is not empty + * @rmtoll SR RXNE LL_I2S_IsActiveFlag_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_RXNE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_RXNE(SPIx); +} + +/** + * @brief Check if Tx buffer is empty + * @rmtoll SR TXE LL_I2S_IsActiveFlag_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_TXE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_TXE(SPIx); +} + +/** + * @brief Get busy flag + * @rmtoll SR BSY LL_I2S_IsActiveFlag_BSY + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_BSY(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_BSY(SPIx); +} + +/** + * @brief Get overrun error flag + * @rmtoll SR OVR LL_I2S_IsActiveFlag_OVR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_OVR(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_OVR(SPIx); +} + +/** + * @brief Get underrun error flag + * @rmtoll SR UDR LL_I2S_IsActiveFlag_UDR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_UDR(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_UDR) == (SPI_SR_UDR)); +} + +/** + * @brief Get frame format error flag + * @rmtoll SR FRE LL_I2S_IsActiveFlag_FRE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_FRE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsActiveFlag_FRE(SPIx); +} + +/** + * @brief Get channel side flag. + * @note 0: Channel Left has to be transmitted or has been received\n + * 1: Channel Right has to be transmitted or has been received\n + * It has no significance in PCM mode. + * @rmtoll SR CHSIDE LL_I2S_IsActiveFlag_CHSIDE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsActiveFlag_CHSIDE(SPI_TypeDef *SPIx) +{ + return (READ_BIT(SPIx->SR, SPI_SR_CHSIDE) == (SPI_SR_CHSIDE)); +} + +/** + * @brief Clear overrun error flag + * @rmtoll SR OVR LL_I2S_ClearFlag_OVR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_OVR(SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_OVR(SPIx); +} + +/** + * @brief Clear underrun error flag + * @rmtoll SR UDR LL_I2S_ClearFlag_UDR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_UDR(SPI_TypeDef *SPIx) +{ + __IO uint32_t tmpreg; + tmpreg = SPIx->SR; + (void)tmpreg; +} + +/** + * @brief Clear frame format error flag + * @rmtoll SR FRE LL_I2S_ClearFlag_FRE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_ClearFlag_FRE(SPI_TypeDef *SPIx) +{ + LL_SPI_ClearFlag_FRE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_IT Interrupt Management + * @{ + */ + +/** + * @brief Enable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_EnableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_ERR(SPIx); +} + +/** + * @brief Enable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_EnableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_RXNE(SPIx); +} + +/** + * @brief Enable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_EnableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableIT_TXE(SPIx); +} + +/** + * @brief Disable error IT + * @note This bit controls the generation of an interrupt when an error condition occurs (OVR, UDR and FRE in I2S mode). + * @rmtoll CR2 ERRIE LL_I2S_DisableIT_ERR + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_ERR(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_ERR(SPIx); +} + +/** + * @brief Disable Rx buffer not empty IT + * @rmtoll CR2 RXNEIE LL_I2S_DisableIT_RXNE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_RXNE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_RXNE(SPIx); +} + +/** + * @brief Disable Tx buffer empty IT + * @rmtoll CR2 TXEIE LL_I2S_DisableIT_TXE + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableIT_TXE(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableIT_TXE(SPIx); +} + +/** + * @brief Check if ERR IT is enabled + * @rmtoll CR2 ERRIE LL_I2S_IsEnabledIT_ERR + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_ERR(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_ERR(SPIx); +} + +/** + * @brief Check if RXNE IT is enabled + * @rmtoll CR2 RXNEIE LL_I2S_IsEnabledIT_RXNE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_RXNE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_RXNE(SPIx); +} + +/** + * @brief Check if TXE IT is enabled + * @rmtoll CR2 TXEIE LL_I2S_IsEnabledIT_TXE + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledIT_TXE(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledIT_TXE(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DMA DMA Management + * @{ + */ + +/** + * @brief Enable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_EnableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_RX(SPIx); +} + +/** + * @brief Disable DMA Rx + * @rmtoll CR2 RXDMAEN LL_I2S_DisableDMAReq_RX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_RX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_RX(SPIx); +} + +/** + * @brief Check if DMA Rx is enabled + * @rmtoll CR2 RXDMAEN LL_I2S_IsEnabledDMAReq_RX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_RX(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_RX(SPIx); +} + +/** + * @brief Enable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_EnableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_EnableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_EnableDMAReq_TX(SPIx); +} + +/** + * @brief Disable DMA Tx + * @rmtoll CR2 TXDMAEN LL_I2S_DisableDMAReq_TX + * @param SPIx SPI Instance + * @retval None + */ +__STATIC_INLINE void LL_I2S_DisableDMAReq_TX(SPI_TypeDef *SPIx) +{ + LL_SPI_DisableDMAReq_TX(SPIx); +} + +/** + * @brief Check if DMA Tx is enabled + * @rmtoll CR2 TXDMAEN LL_I2S_IsEnabledDMAReq_TX + * @param SPIx SPI Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2S_IsEnabledDMAReq_TX(SPI_TypeDef *SPIx) +{ + return LL_SPI_IsEnabledDMAReq_TX(SPIx); +} + +/** + * @} + */ + +/** @defgroup I2S_LL_EF_DATA DATA Management + * @{ + */ + +/** + * @brief Read 16-Bits in data register + * @rmtoll DR DR LL_I2S_ReceiveData16 + * @param SPIx SPI Instance + * @retval RxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint16_t LL_I2S_ReceiveData16(SPI_TypeDef *SPIx) +{ + return LL_SPI_ReceiveData16(SPIx); +} + +/** + * @brief Write 16-Bits in data register + * @rmtoll DR DR LL_I2S_TransmitData16 + * @param SPIx SPI Instance + * @param TxData Value between Min_Data=0x0000 and Max_Data=0xFFFF + * @retval None + */ +__STATIC_INLINE void LL_I2S_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData) +{ + LL_SPI_TransmitData16(SPIx, TxData); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2S_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_I2S_DeInit(SPI_TypeDef *SPIx); +ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct); +void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity); +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) +ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct); +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_SPI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h new file mode 100644 index 0000000..1ed6ad4 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h @@ -0,0 +1,1726 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_system.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of SYSTEM LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL SYSTEM driver contains a set of generic APIs that can be + used by user: + (+) Some of the FLASH features need to be handled in the SYSTEM file. + (+) Access to DBGCMU registers + (+) Access to SYSCFG registers + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_SYSTEM_H +#define __STM32F4xx_LL_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) + +/** @defgroup SYSTEM_LL SYSTEM + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Private_Constants SYSTEM Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Exported_Constants SYSTEM Exported Constants + * @{ + */ + +/** @defgroup SYSTEM_LL_EC_REMAP SYSCFG REMAP +* @{ +*/ +#define LL_SYSCFG_REMAP_FLASH (uint32_t)0x00000000 /*!< Main Flash memory mapped at 0x00000000 */ +#define LL_SYSCFG_REMAP_SYSTEMFLASH SYSCFG_MEMRMP_MEM_MODE_0 /*!< System Flash memory mapped at 0x00000000 */ +#if defined(FSMC_Bank1) +#define LL_SYSCFG_REMAP_FSMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FSMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ +#endif /* FSMC_Bank1 */ +#if defined(FMC_Bank1) +#define LL_SYSCFG_REMAP_FMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ +#endif /* FMC_Bank1 */ +#define LL_SYSCFG_REMAP_SRAM (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0) /*!< SRAM1 mapped at 0x00000000 */ +/** + * @} + */ + +#if defined(SYSCFG_PMC_MII_RMII_SEL) + /** @defgroup SYSTEM_LL_EC_PMC SYSCFG PMC +* @{ +*/ +#define LL_SYSCFG_PMC_ETHMII (uint32_t)0x00000000 /*!< ETH Media MII interface */ +#define LL_SYSCFG_PMC_ETHRMII (uint32_t)SYSCFG_PMC_MII_RMII_SEL /*!< ETH Media RMII interface */ + +/** + * @} + */ +#endif /* SYSCFG_PMC_MII_RMII_SEL */ + + + +#if defined(SYSCFG_MEMRMP_UFB_MODE) +/** @defgroup SYSTEM_LL_EC_BANKMODE SYSCFG BANK MODE + * @{ + */ +#define LL_SYSCFG_BANKMODE_BANK1 (uint32_t)0x00000000 /*!< Flash Bank 1 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000 (TCM) + and Flash Bank 2 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000 (TCM)*/ +#define LL_SYSCFG_BANKMODE_BANK2 SYSCFG_MEMRMP_UFB_MODE /*!< Flash Bank 2 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000(TCM) + and Flash Bank 1 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000(TCM) */ +/** + * @} + */ +#endif /* SYSCFG_MEMRMP_UFB_MODE */ +/** @defgroup SYSTEM_LL_EC_I2C_FASTMODEPLUS SYSCFG I2C FASTMODEPLUS + * @{ + */ +#if defined(SYSCFG_CFGR_FMPI2C1_SCL) +#define LL_SYSCFG_I2C_FASTMODEPLUS_SCL SYSCFG_CFGR_FMPI2C1_SCL /*!< Enable Fast Mode Plus on FMPI2C_SCL pin */ +#define LL_SYSCFG_I2C_FASTMODEPLUS_SDA SYSCFG_CFGR_FMPI2C1_SDA /*!< Enable Fast Mode Plus on FMPI2C_SDA pin*/ +#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_EXTI_PORT SYSCFG EXTI PORT + * @{ + */ +#define LL_SYSCFG_EXTI_PORTA (uint32_t)0 /*!< EXTI PORT A */ +#define LL_SYSCFG_EXTI_PORTB (uint32_t)1 /*!< EXTI PORT B */ +#define LL_SYSCFG_EXTI_PORTC (uint32_t)2 /*!< EXTI PORT C */ +#define LL_SYSCFG_EXTI_PORTD (uint32_t)3 /*!< EXTI PORT D */ +#define LL_SYSCFG_EXTI_PORTE (uint32_t)4 /*!< EXTI PORT E */ +#if defined(GPIOF) +#define LL_SYSCFG_EXTI_PORTF (uint32_t)5 /*!< EXTI PORT F */ +#endif /* GPIOF */ +#if defined(GPIOG) +#define LL_SYSCFG_EXTI_PORTG (uint32_t)6 /*!< EXTI PORT G */ +#endif /* GPIOG */ +#define LL_SYSCFG_EXTI_PORTH (uint32_t)7 /*!< EXTI PORT H */ +#if defined(GPIOI) +#define LL_SYSCFG_EXTI_PORTI (uint32_t)8 /*!< EXTI PORT I */ +#endif /* GPIOI */ +#if defined(GPIOJ) +#define LL_SYSCFG_EXTI_PORTJ (uint32_t)9 /*!< EXTI PORT J */ +#endif /* GPIOJ */ +#if defined(GPIOK) +#define LL_SYSCFG_EXTI_PORTK (uint32_t)10 /*!< EXTI PORT k */ +#endif /* GPIOK */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_EXTI_LINE SYSCFG EXTI LINE + * @{ + */ +#define LL_SYSCFG_EXTI_LINE0 (uint32_t)(0x000FU << 16 | 0) /*!< EXTI_POSITION_0 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE1 (uint32_t)(0x00F0U << 16 | 0) /*!< EXTI_POSITION_4 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE2 (uint32_t)(0x0F00U << 16 | 0) /*!< EXTI_POSITION_8 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE3 (uint32_t)(0xF000U << 16 | 0) /*!< EXTI_POSITION_12 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE4 (uint32_t)(0x000FU << 16 | 1) /*!< EXTI_POSITION_0 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE5 (uint32_t)(0x00F0U << 16 | 1) /*!< EXTI_POSITION_4 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE6 (uint32_t)(0x0F00U << 16 | 1) /*!< EXTI_POSITION_8 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE7 (uint32_t)(0xF000U << 16 | 1) /*!< EXTI_POSITION_12 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE8 (uint32_t)(0x000FU << 16 | 2) /*!< EXTI_POSITION_0 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE9 (uint32_t)(0x00F0U << 16 | 2) /*!< EXTI_POSITION_4 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE10 (uint32_t)(0x0F00U << 16 | 2) /*!< EXTI_POSITION_8 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE11 (uint32_t)(0xF000U << 16 | 2) /*!< EXTI_POSITION_12 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE12 (uint32_t)(0x000FU << 16 | 3) /*!< EXTI_POSITION_0 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE13 (uint32_t)(0x00F0U << 16 | 3) /*!< EXTI_POSITION_4 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE14 (uint32_t)(0x0F00U << 16 | 3) /*!< EXTI_POSITION_8 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE15 (uint32_t)(0xF000U << 16 | 3) /*!< EXTI_POSITION_12 | EXTICR[3] */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_TIMBREAK SYSCFG TIMER BREAK + * @{ + */ +#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) +#define LL_SYSCFG_TIMBREAK_LOCKUP SYSCFG_CFGR2_LOCKUP_LOCK /*!< Enables and locks the LOCKUP output of CortexM4 + with Break Input of TIM1/8 */ +#define LL_SYSCFG_TIMBREAK_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Enables and locks the PVD connection with TIM1/8 Break Input + and also the PVDE and PLS bits of the Power Control Interface */ +#endif /* SYSCFG_CFGR2_CLL */ +/** + * @} + */ + +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** @defgroup SYSTEM_LL_DFSDM_BitStream_ClockSource SYSCFG MCHDLY BCKKSEL + * @{ + */ +#define LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 (uint32_t)0x00000000 +#define LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 SYSCFG_MCHDLYCR_BSCKSEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_MCHDLYEN SYSCFG MCHDLY MCHDLYEN + * @{ + */ +#define LL_SYSCFG_DFSDM1_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY1EN +#define LL_SYSCFG_DFSDM2_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY2EN +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_DataIn0_Source SYSCFG MCHDLY DFSDMD0SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_DataIn0 SYSCFG_MCHDLYCR_DFSDM1D0SEL +#define LL_SYSCFG_DFSDM2_DataIn0 SYSCFG_MCHDLYCR_DFSDM2D0SEL + +#define LL_SYSCFG_DFSDM1_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM1_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D0SEL) +#define LL_SYSCFG_DFSDM2_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM2_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D0SEL) +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_DataIn2_Source SYSCFG MCHDLY DFSDMD2SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_DataIn2 SYSCFG_MCHDLYCR_DFSDM1D2SEL +#define LL_SYSCFG_DFSDM2_DataIn2 SYSCFG_MCHDLYCR_DFSDM2D2SEL + +#define LL_SYSCFG_DFSDM1_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM1_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D2SEL) +#define LL_SYSCFG_DFSDM2_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM2_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D2SEL) +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK02SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK13SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_CLKIN_SourceSelection SYSCFG MCHDLY DFSDMCFG + * @{ + */ +#define LL_SYSCFG_DFSDM1_CKIN_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_CKIN_DM SYSCFG_MCHDLYCR_DFSDM1CFG +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM1CKOSEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_CKOUT (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM1CKOSEL +/** + * @} + */ + +/** @defgroup SYSTEM_LL_DFSDM2_DataIn4_SourceSelection SYSCFG MCHDLY DFSDM2D4SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_DataIn4_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_DataIn4_DM SYSCFG_MCHDLYCR_DFSDM2D4SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_DataIn6_SourceSelection SYSCFG MCHDLY DFSDM2D6SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_DataIn6_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_DataIn6_DM SYSCFG_MCHDLYCR_DFSDM2D6SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC4_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK04SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC3_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK15SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK26SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK37SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_CLKIN_SourceSelection SYSCFG MCHDLY DFSDM2CFG + * @{ + */ +#define LL_SYSCFG_DFSDM2_CKIN_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_CKIN_DM SYSCFG_MCHDLYCR_DFSDM2CFG +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM2CKOSEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_CKOUT (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM2CKOSEL +/** + * @} + */ +#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ + +/** @defgroup SYSTEM_LL_EC_TRACE DBGMCU TRACE Pin Assignment + * @{ + */ +#define LL_DBGMCU_TRACE_NONE 0x00000000U /*!< TRACE pins not assigned (default state) */ +#define LL_DBGMCU_TRACE_ASYNCH DBGMCU_CR_TRACE_IOEN /*!< TRACE pin assignment for Asynchronous Mode */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE1 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_0) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 1 */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE2 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_1) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 2 */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE4 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 4 */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_APB1_GRP1_STOP_IP DBGMCU APB1 GRP1 STOP IP + * @{ + */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM2_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM2_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM3_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM3_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM4_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_APB1_FZ_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM4_STOP */ +#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_APB1_FZ_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM6_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM6_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM7_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM7_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM12_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_APB1_FZ_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM12_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM13_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_APB1_FZ_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM13_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM14_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM14_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_LPTIM_STOP) +#define LL_DBGMCU_APB1_GRP1_LPTIM_STOP DBGMCU_APB1_FZ_DBG_LPTIM_STOP /*!< LPTIM counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_LPTIM_STOP */ +#define LL_DBGMCU_APB1_GRP1_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP /*!< RTC counter stopped when core is halted */ +#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ +#if defined(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT) +#define LL_DBGMCU_APB1_GRP1_I2C3_STOP DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT /*!< I2C3 SMBUS timeout mode stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT */ +#if defined(DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT) +#define LL_DBGMCU_APB1_GRP1_I2C4_STOP DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT /*!< I2C4 SMBUS timeout mode stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN1_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN1_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN2_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_APB1_FZ_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN2_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN3_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN3_STOP DBGMCU_APB1_FZ_DBG_CAN3_STOP /*!< CAN3 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN3_STOP */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP + * @{ + */ +#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ +#if defined(DBGMCU_APB2_FZ_DBG_TIM8_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_APB2_FZ_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ +#endif /* DBGMCU_APB2_FZ_DBG_TIM8_STOP */ +#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_APB2_FZ_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ +#if defined(DBGMCU_APB2_FZ_DBG_TIM10_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_APB2_FZ_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ +#endif /* DBGMCU_APB2_FZ_DBG_TIM10_STOP */ +#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_APB2_FZ_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY + * @{ + */ +#define LL_FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /*!< FLASH Zero wait state */ +#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /*!< FLASH One wait state */ +#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /*!< FLASH Two wait states */ +#define LL_FLASH_LATENCY_3 FLASH_ACR_LATENCY_3WS /*!< FLASH Three wait states */ +#define LL_FLASH_LATENCY_4 FLASH_ACR_LATENCY_4WS /*!< FLASH Four wait states */ +#define LL_FLASH_LATENCY_5 FLASH_ACR_LATENCY_5WS /*!< FLASH five wait state */ +#define LL_FLASH_LATENCY_6 FLASH_ACR_LATENCY_6WS /*!< FLASH six wait state */ +#define LL_FLASH_LATENCY_7 FLASH_ACR_LATENCY_7WS /*!< FLASH seven wait states */ +#define LL_FLASH_LATENCY_8 FLASH_ACR_LATENCY_8WS /*!< FLASH eight wait states */ +#define LL_FLASH_LATENCY_9 FLASH_ACR_LATENCY_9WS /*!< FLASH nine wait states */ +#define LL_FLASH_LATENCY_10 FLASH_ACR_LATENCY_10WS /*!< FLASH ten wait states */ +#define LL_FLASH_LATENCY_11 FLASH_ACR_LATENCY_11WS /*!< FLASH eleven wait states */ +#define LL_FLASH_LATENCY_12 FLASH_ACR_LATENCY_12WS /*!< FLASH twelve wait states */ +#define LL_FLASH_LATENCY_13 FLASH_ACR_LATENCY_13WS /*!< FLASH thirteen wait states */ +#define LL_FLASH_LATENCY_14 FLASH_ACR_LATENCY_14WS /*!< FLASH fourteen wait states */ +#define LL_FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /*!< FLASH fifteen wait states */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions + * @{ + */ + +/** @defgroup SYSTEM_LL_EF_SYSCFG SYSCFG + * @{ + */ +/** + * @brief Set memory mapping at address 0x00000000 + * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_SetRemapMemory + * @param Memory This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_REMAP_FLASH + * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH + * @arg @ref LL_SYSCFG_REMAP_SRAM + * @arg @ref LL_SYSCFG_REMAP_FSMC (*) + * @arg @ref LL_SYSCFG_REMAP_FMC (*) + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapMemory(uint32_t Memory) +{ + MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, Memory); +} + +/** + * @brief Get memory mapping at address 0x00000000 + * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_GetRemapMemory + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_REMAP_FLASH + * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH + * @arg @ref LL_SYSCFG_REMAP_SRAM + * @arg @ref LL_SYSCFG_REMAP_FSMC (*) + * @arg @ref LL_SYSCFG_REMAP_FMC (*) + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)); +} + +#if defined(SYSCFG_MEMRMP_SWP_FMC) +/** + * @brief Enables the FMC Memory Mapping Swapping + * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_EnableFMCMemorySwapping + * @note SDRAM is accessible at 0x60000000 and NOR/RAM + * is accessible at 0xC0000000 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableFMCMemorySwapping(void) +{ + SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC_0); +} + +/** + * @brief Disables the FMC Memory Mapping Swapping + * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_DisableFMCMemorySwapping + * @note SDRAM is accessible at 0xC0000000 (default mapping) + * and NOR/RAM is accessible at 0x60000000 (default mapping) + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableFMCMemorySwapping(void) +{ + CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC); +} + +#endif /* SYSCFG_MEMRMP_SWP_FMC */ +/** + * @brief Enables the Compensation cell Power Down + * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_EnableCompensationCell + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableCompensationCell(void) +{ + SET_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); +} + +/** + * @brief Disables the Compensation cell Power Down + * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_DisableCompensationCell + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableCompensationCell(void) +{ + CLEAR_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); +} + +/** + * @brief Get Compensation Cell ready Flag + * @rmtoll SYSCFG_CMPCR READY LL_SYSCFG_IsActiveFlag_CMPCR + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_CMPCR(void) +{ + return (READ_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_READY) == (SYSCFG_CMPCR_READY)); +} + +#if defined(SYSCFG_PMC_MII_RMII_SEL) +/** + * @brief Select Ethernet PHY interface + * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_SetPHYInterface + * @param Interface This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_PMC_ETHMII + * @arg @ref LL_SYSCFG_PMC_ETHRMII + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetPHYInterface(uint32_t Interface) +{ + MODIFY_REG(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL, Interface); +} + +/** + * @brief Get Ethernet PHY interface + * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_GetPHYInterface + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_PMC_ETHMII + * @arg @ref LL_SYSCFG_PMC_ETHRMII + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetPHYInterface(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL)); +} +#endif /* SYSCFG_PMC_MII_RMII_SEL */ + + + +#if defined(SYSCFG_MEMRMP_UFB_MODE) +/** + * @brief Select Flash bank mode (Bank flashed at 0x08000000) + * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_SetFlashBankMode + * @param Bank This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_BANKMODE_BANK1 + * @arg @ref LL_SYSCFG_BANKMODE_BANK2 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetFlashBankMode(uint32_t Bank) +{ + MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE, Bank); +} + +/** + * @brief Get Flash bank mode (Bank flashed at 0x08000000) + * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_GetFlashBankMode + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_BANKMODE_BANK1 + * @arg @ref LL_SYSCFG_BANKMODE_BANK2 + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetFlashBankMode(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE)); +} +#endif /* SYSCFG_MEMRMP_UFB_MODE */ + +#if defined(SYSCFG_CFGR_FMPI2C1_SCL) +/** + * @brief Enable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_EnableFastModePlus + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) +{ + SET_BIT(SYSCFG->CFGR, ConfigFastModePlus); +} + +/** + * @brief Disable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_DisableFastModePlus\n + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) +{ + CLEAR_BIT(SYSCFG->CFGR, ConfigFastModePlus); +} +#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ + +/** + * @brief Configure source input for the EXTI external interrupt. + * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_SetEXTISource + * @param Port This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_PORTA + * @arg @ref LL_SYSCFG_EXTI_PORTB + * @arg @ref LL_SYSCFG_EXTI_PORTC + * @arg @ref LL_SYSCFG_EXTI_PORTD + * @arg @ref LL_SYSCFG_EXTI_PORTE + * @arg @ref LL_SYSCFG_EXTI_PORTF (*) + * @arg @ref LL_SYSCFG_EXTI_PORTG (*) + * @arg @ref LL_SYSCFG_EXTI_PORTH + * + * (*) value not defined in all devices + * @param Line This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_LINE0 + * @arg @ref LL_SYSCFG_EXTI_LINE1 + * @arg @ref LL_SYSCFG_EXTI_LINE2 + * @arg @ref LL_SYSCFG_EXTI_LINE3 + * @arg @ref LL_SYSCFG_EXTI_LINE4 + * @arg @ref LL_SYSCFG_EXTI_LINE5 + * @arg @ref LL_SYSCFG_EXTI_LINE6 + * @arg @ref LL_SYSCFG_EXTI_LINE7 + * @arg @ref LL_SYSCFG_EXTI_LINE8 + * @arg @ref LL_SYSCFG_EXTI_LINE9 + * @arg @ref LL_SYSCFG_EXTI_LINE10 + * @arg @ref LL_SYSCFG_EXTI_LINE11 + * @arg @ref LL_SYSCFG_EXTI_LINE12 + * @arg @ref LL_SYSCFG_EXTI_LINE13 + * @arg @ref LL_SYSCFG_EXTI_LINE14 + * @arg @ref LL_SYSCFG_EXTI_LINE15 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetEXTISource(uint32_t Port, uint32_t Line) +{ + MODIFY_REG(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); +} + +/** + * @brief Get the configured defined for specific EXTI Line + * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_GetEXTISource + * @param Line This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_LINE0 + * @arg @ref LL_SYSCFG_EXTI_LINE1 + * @arg @ref LL_SYSCFG_EXTI_LINE2 + * @arg @ref LL_SYSCFG_EXTI_LINE3 + * @arg @ref LL_SYSCFG_EXTI_LINE4 + * @arg @ref LL_SYSCFG_EXTI_LINE5 + * @arg @ref LL_SYSCFG_EXTI_LINE6 + * @arg @ref LL_SYSCFG_EXTI_LINE7 + * @arg @ref LL_SYSCFG_EXTI_LINE8 + * @arg @ref LL_SYSCFG_EXTI_LINE9 + * @arg @ref LL_SYSCFG_EXTI_LINE10 + * @arg @ref LL_SYSCFG_EXTI_LINE11 + * @arg @ref LL_SYSCFG_EXTI_LINE12 + * @arg @ref LL_SYSCFG_EXTI_LINE13 + * @arg @ref LL_SYSCFG_EXTI_LINE14 + * @arg @ref LL_SYSCFG_EXTI_LINE15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_PORTA + * @arg @ref LL_SYSCFG_EXTI_PORTB + * @arg @ref LL_SYSCFG_EXTI_PORTC + * @arg @ref LL_SYSCFG_EXTI_PORTD + * @arg @ref LL_SYSCFG_EXTI_PORTE + * @arg @ref LL_SYSCFG_EXTI_PORTF (*) + * @arg @ref LL_SYSCFG_EXTI_PORTG (*) + * @arg @ref LL_SYSCFG_EXTI_PORTH + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetEXTISource(uint32_t Line) +{ + return (uint32_t)(READ_BIT(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); +} + +#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) +/** + * @brief Set connections to TIM1/8 break inputs + * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n + * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs + * @param Break This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * @arg @ref LL_SYSCFG_TIMBREAK_PVD + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) +{ + MODIFY_REG(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK, Break); +} + +/** + * @brief Get connections to TIM1/8 Break inputs + * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n + * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs + * @retval Returned value can be can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * @arg @ref LL_SYSCFG_TIMBREAK_PVD + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK)); +} +#endif /* SYSCFG_CFGR2_LOCKUP_LOCK */ +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** + * @brief Select the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. + * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL, ClockSource); +} +/** + * @brief Get the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. + * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL)); +} +/** + * @brief Enables the DFSDM1 or DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLYEN LL_SYSCFG_DFSDM_EnableDelayClock + * @param MCHDLY This paramater can be one of the following values + * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN + * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_EnableDelayClock(uint32_t MCHDLY) +{ + SET_BIT(SYSCFG->MCHDLYCR, MCHDLY); +} + +/** + * @brief Disables the DFSDM1 or the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY1EN LL_SYSCFG_DFSDM1_DisableDelayClock + * @param MCHDLY This paramater can be one of the following values + * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN + * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_DisableDelayClock(uint32_t MCHDLY) +{ + CLEAR_BIT(SYSCFG->MCHDLYCR, MCHDLY); +} + +/** + * @brief Select the source for DFSDM1 or DFSDM2 DatIn0 + * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_SetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn0Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); +} +/** + * @brief Get the source for DFSDM1 or DFSDM2 DatIn0. + * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_GetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0 + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn0Source(uint32_t Source) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); +} +/** + * @brief Select the source for DFSDM1 or DFSDM2 DatIn2 + * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_SetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn2Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); +} +/** + * @brief Get the source for DFSDM1 or DFSDM2 DatIn2. + * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_GetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2 + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn2Source(uint32_t Source) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM4 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK02SEL LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM4 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM4 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK13SEL LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM4 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL)); +} + +/** + * @brief Select the DFSDM1 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_SetClockInSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockInSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG, ClockSource); +} +/** + * @brief GET the DFSDM1 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_GetClockInSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockInSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG)); +} + +/** + * @brief Select the DFSDM1 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_SetClockOutSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockOutSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL, ClockSource); +} +/** + * @brief GET the DFSDM1 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_GetClockOutSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockOutSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL)); +} + +/** + * @brief Enables the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_EnableDelayClock + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_EnableDelayClock(void) +{ + SET_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); +} + +/** + * @brief Disables the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_DisableDelayClock + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_DisableDelayClock(void) +{ + CLEAR_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); +} +/** + * @brief Select the source for DFSDM2 DatIn0 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_SetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn0Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn0. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_GetDataIn0Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn0Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_SetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn2Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn2. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_GetDataIn2Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn2Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_SetDataIn4Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn4Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn4. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_GetDataIn4Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn4Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn6 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_SetDataIn6Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn6Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn6. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_GetDataIn6Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn6Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC3 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK15SEL LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK26SEL LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL)); +} + +/** + * @brief Select the DFSDM2 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_SetClockInSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockInSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG, ClockSource); +} +/** + * @brief GET the DFSDM2 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_GetClockInSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockInSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG)); +} + +/** + * @brief Select the DFSDM2 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_SetClockOutSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockOutSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL, ClockSource); +} +/** + * @brief GET the DFSDM2 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_GetClockOutSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockOutSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL)); +} + +#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ +/** + * @} + */ + + +/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU + * @{ + */ + +/** + * @brief Return the device identifier + * @note For STM32F405/407xx and STM32F415/417xx devices, the device ID is 0x413 + * @note For STM32F42xxx and STM32F43xxx devices, the device ID is 0x419 + * @note For STM32F401xx devices, the device ID is 0x423 + * @note For STM32F401xx devices, the device ID is 0x433 + * @note For STM32F411xx devices, the device ID is 0x431 + * @note For STM32F410xx devices, the device ID is 0x458 + * @note For STM32F412xx devices, the device ID is 0x441 + * @note For STM32F413xx and STM32423xx devices, the device ID is 0x463 + * @note For STM32F446xx devices, the device ID is 0x421 + * @note For STM32F469xx and STM32F479xx devices, the device ID is 0x434 + * @rmtoll DBGMCU_IDCODE DEV_ID LL_DBGMCU_GetDeviceID + * @retval Values between Min_Data=0x00 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetDeviceID(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); +} + +/** + * @brief Return the device revision identifier + * @note This field indicates the revision of the device. + For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001, rev1 -> 0x1003, rev2 ->0x1007, revY -> 0x100F for STM32F405/407xx and STM32F415/417xx devices + For example, it is read as RevA -> 0x1000, Cat 2 revY -> 0x1003, rev1 -> 0x1007, rev3 ->0x2001 for STM32F42xxx and STM32F43xxx devices + For example, it is read as RevZ -> 0x1000, Cat 2 revA -> 0x1001 for STM32F401xB/C devices + For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001 for STM32F401xD/E devices + For example, it is read as RevA -> 0x1000 for STM32F411xx,STM32F413/423xx,STM32F469/423xx, STM32F446xx and STM32F410xx devices + For example, it is read as RevZ -> 0x1001, Cat 2 revB -> 0x2000, revC -> 0x3000 for STM32F412xx devices + * @rmtoll DBGMCU_IDCODE REV_ID LL_DBGMCU_GetRevisionID + * @retval Values between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetRevisionID(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_REV_ID) >> DBGMCU_IDCODE_REV_ID_Pos); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_EnableDBGSleepMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_DisableDBGSleepMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_EnableDBGStopMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_DisableDBGStopMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_EnableDBGStandbyMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_DisableDBGStandbyMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Set Trace pin assignment control + * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_SetTracePinAssignment\n + * DBGMCU_CR TRACE_MODE LL_DBGMCU_SetTracePinAssignment + * @param PinAssignment This parameter can be one of the following values: + * @arg @ref LL_DBGMCU_TRACE_NONE + * @arg @ref LL_DBGMCU_TRACE_ASYNCH + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_SetTracePinAssignment(uint32_t PinAssignment) +{ + MODIFY_REG(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE, PinAssignment); +} + +/** + * @brief Get Trace pin assignment control + * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_GetTracePinAssignment\n + * DBGMCU_CR TRACE_MODE LL_DBGMCU_GetTracePinAssignment + * @retval Returned value can be one of the following values: + * @arg @ref LL_DBGMCU_TRACE_NONE + * @arg @ref LL_DBGMCU_TRACE_ASYNCH + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetTracePinAssignment(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE)); +} + +/** + * @brief Freeze APB1 peripherals (group1 peripherals) + * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->APB1FZ, Periphs); +} + +/** + * @brief Unfreeze APB1 peripherals (group1 peripherals) + * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->APB1FZ, Periphs); +} + +/** + * @brief Freeze APB2 peripherals + * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->APB2FZ, Periphs); +} + +/** + * @brief Unfreeze APB2 peripherals + * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->APB2FZ, Periphs); +} +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EF_FLASH FLASH + * @{ + */ + +/** + * @brief Set FLASH Latency + * @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency + * @param Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0 + * @arg @ref LL_FLASH_LATENCY_1 + * @arg @ref LL_FLASH_LATENCY_2 + * @arg @ref LL_FLASH_LATENCY_3 + * @arg @ref LL_FLASH_LATENCY_4 + * @arg @ref LL_FLASH_LATENCY_5 + * @arg @ref LL_FLASH_LATENCY_6 + * @arg @ref LL_FLASH_LATENCY_7 + * @arg @ref LL_FLASH_LATENCY_8 + * @arg @ref LL_FLASH_LATENCY_9 + * @arg @ref LL_FLASH_LATENCY_10 + * @arg @ref LL_FLASH_LATENCY_11 + * @arg @ref LL_FLASH_LATENCY_12 + * @arg @ref LL_FLASH_LATENCY_13 + * @arg @ref LL_FLASH_LATENCY_14 + * @arg @ref LL_FLASH_LATENCY_15 + * @retval None + */ +__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) +{ + MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); +} + +/** + * @brief Get FLASH Latency + * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0 + * @arg @ref LL_FLASH_LATENCY_1 + * @arg @ref LL_FLASH_LATENCY_2 + * @arg @ref LL_FLASH_LATENCY_3 + * @arg @ref LL_FLASH_LATENCY_4 + * @arg @ref LL_FLASH_LATENCY_5 + * @arg @ref LL_FLASH_LATENCY_6 + * @arg @ref LL_FLASH_LATENCY_7 + * @arg @ref LL_FLASH_LATENCY_8 + * @arg @ref LL_FLASH_LATENCY_9 + * @arg @ref LL_FLASH_LATENCY_10 + * @arg @ref LL_FLASH_LATENCY_11 + * @arg @ref LL_FLASH_LATENCY_12 + * @arg @ref LL_FLASH_LATENCY_13 + * @arg @ref LL_FLASH_LATENCY_14 + * @arg @ref LL_FLASH_LATENCY_15 + */ +__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) +{ + return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); +} + +/** + * @brief Enable Prefetch + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_EnablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); +} + +/** + * @brief Disable Prefetch + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_DisablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); +} + +/** + * @brief Check if Prefetch buffer is enabled + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_IsPrefetchEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) +{ + return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)); +} + +/** + * @brief Enable Instruction cache + * @rmtoll FLASH_ACR ICEN LL_FLASH_EnableInstCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableInstCache(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_ICEN); +} + +/** + * @brief Disable Instruction cache + * @rmtoll FLASH_ACR ICEN LL_FLASH_DisableInstCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableInstCache(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN); +} + +/** + * @brief Enable Data cache + * @rmtoll FLASH_ACR DCEN LL_FLASH_EnableDataCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableDataCache(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_DCEN); +} + +/** + * @brief Disable Data cache + * @rmtoll FLASH_ACR DCEN LL_FLASH_DisableDataCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableDataCache(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN); +} + +/** + * @brief Enable Instruction cache reset + * @note bit can be written only when the instruction cache is disabled + * @rmtoll FLASH_ACR ICRST LL_FLASH_EnableInstCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableInstCacheReset(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_ICRST); +} + +/** + * @brief Disable Instruction cache reset + * @rmtoll FLASH_ACR ICRST LL_FLASH_DisableInstCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableInstCacheReset(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); +} + +/** + * @brief Enable Data cache reset + * @note bit can be written only when the data cache is disabled + * @rmtoll FLASH_ACR DCRST LL_FLASH_EnableDataCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableDataCacheReset(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_DCRST); +} + +/** + * @brief Disable Data cache reset + * @rmtoll FLASH_ACR DCRST LL_FLASH_DisableDataCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableDataCacheReset(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_SYSTEM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h new file mode 100644 index 0000000..ed4a67b --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h @@ -0,0 +1,3971 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_tim.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of TIM LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_TIM_H +#define __STM32F4xx_LL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM5) || defined (TIM6) || defined (TIM7) || defined (TIM8) || defined (TIM9) || defined (TIM10) || defined (TIM11) || defined (TIM12) || defined (TIM13) || defined (TIM14) + +/** @defgroup TIM_LL TIM + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Variables TIM Private Variables + * @{ + */ +static const uint8_t OFFSET_TAB_CCMRx[] = +{ + 0x00U, /* 0: TIMx_CH1 */ + 0x00U, /* 1: TIMx_CH1N */ + 0x00U, /* 2: TIMx_CH2 */ + 0x00U, /* 3: TIMx_CH2N */ + 0x04U, /* 4: TIMx_CH3 */ + 0x04U, /* 5: TIMx_CH3N */ + 0x04U /* 6: TIMx_CH4 */ +}; + +static const uint8_t SHIFT_TAB_OCxx[] = +{ + 0U, /* 0: OC1M, OC1FE, OC1PE */ + 0U, /* 1: - NA */ + 8U, /* 2: OC2M, OC2FE, OC2PE */ + 0U, /* 3: - NA */ + 0U, /* 4: OC3M, OC3FE, OC3PE */ + 0U, /* 5: - NA */ + 8U /* 6: OC4M, OC4FE, OC4PE */ +}; + +static const uint8_t SHIFT_TAB_ICxx[] = +{ + 0U, /* 0: CC1S, IC1PSC, IC1F */ + 0U, /* 1: - NA */ + 8U, /* 2: CC2S, IC2PSC, IC2F */ + 0U, /* 3: - NA */ + 0U, /* 4: CC3S, IC3PSC, IC3F */ + 0U, /* 5: - NA */ + 8U /* 6: CC4S, IC4PSC, IC4F */ +}; + +static const uint8_t SHIFT_TAB_CCxP[] = +{ + 0U, /* 0: CC1P */ + 2U, /* 1: CC1NP */ + 4U, /* 2: CC2P */ + 6U, /* 3: CC2NP */ + 8U, /* 4: CC3P */ + 10U, /* 5: CC3NP */ + 12U /* 6: CC4P */ +}; + +static const uint8_t SHIFT_TAB_OISx[] = +{ + 0U, /* 0: OIS1 */ + 1U, /* 1: OIS1N */ + 2U, /* 2: OIS2 */ + 3U, /* 3: OIS2N */ + 4U, /* 4: OIS3 */ + 5U, /* 5: OIS3N */ + 6U /* 6: OIS4 */ +}; +/** + * @} + */ + + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Constants TIM Private Constants + * @{ + */ + + +/* Remap mask definitions */ +#define TIMx_OR_RMP_SHIFT 16U +#define TIMx_OR_RMP_MASK 0x0000FFFFU +#define TIM2_OR_RMP_MASK (TIM_OR_ITR1_RMP << TIMx_OR_RMP_SHIFT) +#define TIM5_OR_RMP_MASK (TIM_OR_TI4_RMP << TIMx_OR_RMP_SHIFT) +#define TIM11_OR_RMP_MASK (TIM_OR_TI1_RMP << TIMx_OR_RMP_SHIFT) + +/* Mask used to set the TDG[x:0] of the DTG bits of the TIMx_BDTR register */ +#define DT_DELAY_1 ((uint8_t)0x7FU) +#define DT_DELAY_2 ((uint8_t)0x3FU) +#define DT_DELAY_3 ((uint8_t)0x1FU) +#define DT_DELAY_4 ((uint8_t)0x1FU) + +/* Mask used to set the DTG[7:5] bits of the DTG bits of the TIMx_BDTR register */ +#define DT_RANGE_1 ((uint8_t)0x00U) +#define DT_RANGE_2 ((uint8_t)0x80U) +#define DT_RANGE_3 ((uint8_t)0xC0U) +#define DT_RANGE_4 ((uint8_t)0xE0U) + + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_LL_Private_Macros TIM Private Macros + * @{ + */ +/** @brief Convert channel id into channel index. + * @param __CHANNEL__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval none + */ +#define TIM_GET_CHANNEL_INDEX( __CHANNEL__) \ +(((__CHANNEL__) == LL_TIM_CHANNEL_CH1) ? 0U :\ +((__CHANNEL__) == LL_TIM_CHANNEL_CH1N) ? 1U :\ +((__CHANNEL__) == LL_TIM_CHANNEL_CH2) ? 2U :\ +((__CHANNEL__) == LL_TIM_CHANNEL_CH2N) ? 3U :\ +((__CHANNEL__) == LL_TIM_CHANNEL_CH3) ? 4U :\ +((__CHANNEL__) == LL_TIM_CHANNEL_CH3N) ? 5U : 6U) + +/** @brief Calculate the deadtime sampling period(in ps). + * @param __TIMCLK__ timer input clock frequency (in Hz). + * @param __CKD__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @retval none + */ +#define TIM_CALC_DTS(__TIMCLK__, __CKD__) \ + (((__CKD__) == LL_TIM_CLOCKDIVISION_DIV1) ? ((uint64_t)1000000000000U/(__TIMCLK__)) : \ + ((__CKD__) == LL_TIM_CLOCKDIVISION_DIV2) ? ((uint64_t)1000000000000U/((__TIMCLK__) >> 1U)) : \ + ((uint64_t)1000000000000U/((__TIMCLK__) >> 2U))) +/** + * @} + */ + + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_ES_INIT TIM Exported Init structure + * @{ + */ + +/** + * @brief TIM Time Base configuration structure definition. + */ +typedef struct +{ + uint16_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetPrescaler().*/ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_LL_EC_COUNTERMODE. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetCounterMode().*/ + + uint32_t Autoreload; /*!< Specifies the auto reload value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between Min_Data=0x0000 and Max_Data=0xFFFF. + Some timer instances may support 32 bits counters. In that case this parameter must be a number between 0x0000 and 0xFFFFFFFF. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetAutoReload().*/ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_LL_EC_CLOCKDIVISION. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetClockDivision().*/ + + uint8_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetRepetitionCounter().*/ +} LL_TIM_InitTypeDef; + +/** + * @brief TIM Output Compare configuration structure definition. + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the output mode. + This parameter can be a value of @ref TIM_LL_EC_OCMODE. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetMode().*/ + + uint32_t OCState; /*!< Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_LL_EC_OCSTATE. + + This feature can be modified afterwards using unitary functions @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ + + uint32_t OCNState; /*!< Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_LL_EC_OCSTATE. + + This feature can be modified afterwards using unitary functions @ref LL_TIM_CC_EnableChannel() or @ref LL_TIM_CC_DisableChannel().*/ + + uint32_t CompareValue; /*!< Specifies the Compare value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data=0x0000 and Max_Data=0xFFFF. + + This feature can be modified afterwards using unitary function LL_TIM_OC_SetCompareCHx (x=1..6).*/ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetPolarity().*/ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_LL_EC_OCPOLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetPolarity().*/ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetIdleState().*/ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_LL_EC_OCIDLESTATE. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetIdleState().*/ +} LL_TIM_OC_InitTypeDef; + +/** + * @brief TIM Input Capture configuration structure definition. + */ + +typedef struct +{ + + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t ICActiveInput; /*!< Specifies the input. + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetFilter().*/ +} LL_TIM_IC_InitTypeDef; + + +/** + * @brief TIM Encoder interface configuration structure definition. + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the encoder resolution (x2 or x4). + This parameter can be a value of @ref TIM_LL_EC_ENCODERMODE. + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetEncoderMode().*/ + + uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC1ActiveInput; /*!< Specifies the TI1 input source + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC1Filter; /*!< Specifies the TI1 input filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetFilter().*/ + + uint32_t IC2Polarity; /*!< Specifies the active edge of TI2 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC2ActiveInput; /*!< Specifies the TI2 input source + This parameter can be a value of @ref TIM_LL_EC_ACTIVEINPUT. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetActiveInput().*/ + + uint32_t IC2Prescaler; /*!< Specifies the TI2 input prescaler value. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC2Filter; /*!< Specifies the TI2 input filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetFilter().*/ + +} LL_TIM_ENCODER_InitTypeDef; + +/** + * @brief TIM Hall sensor interface configuration structure definition. + */ +typedef struct +{ + + uint32_t IC1Polarity; /*!< Specifies the active edge of TI1 input. + This parameter can be a value of @ref TIM_LL_EC_IC_POLARITY. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPolarity().*/ + + uint32_t IC1Prescaler; /*!< Specifies the TI1 input prescaler value. + Prescaler must be set to get a maximum counter period longer than the + time interval between 2 consecutive changes on the Hall inputs. + This parameter can be a value of @ref TIM_LL_EC_ICPSC. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetPrescaler().*/ + + uint32_t IC1Filter; /*!< Specifies the TI1 input filter. + This parameter can be a value of @ref TIM_LL_EC_IC_FILTER. + + This feature can be modified afterwards using unitary function @ref LL_TIM_IC_SetFilter().*/ + + uint32_t CommutationDelay; /*!< Specifies the compare value to be loaded into the Capture Compare Register. + A positive pulse (TRGO event) is generated with a programmable delay every time + a change occurs on the Hall inputs. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetCompareCH2().*/ +} LL_TIM_HALLSENSOR_InitTypeDef; + +/** + * @brief BDTR (Break and Dead Time) structure definition + */ +typedef struct +{ + uint32_t OSSRState; /*!< Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref TIM_LL_EC_OSSR + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetOffStates() + + @note This bit-field cannot be modified as long as LOCK level 2 has been programmed. */ + + uint32_t OSSIState; /*!< Specifies the Off-State used in Idle state. + This parameter can be a value of @ref TIM_LL_EC_OSSI + + This feature can be modified afterwards using unitary function @ref LL_TIM_SetOffStates() + + @note This bit-field cannot be modified as long as LOCK level 2 has been programmed. */ + + uint32_t LockLevel; /*!< Specifies the LOCK level parameters. + This parameter can be a value of @ref TIM_LL_EC_LOCKLEVEL + + @note The LOCK bits can be written only once after the reset. Once the TIMx_BDTR register + has been written, their content is frozen until the next reset.*/ + + uint8_t DeadTime; /*!< Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF. + + This feature can be modified afterwards using unitary function @ref LL_TIM_OC_SetDeadTime() + + @note This bit-field can not be modified as long as LOCK level 1, 2 or 3 has been programmed. */ + + uint16_t BreakState; /*!< Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref TIM_LL_EC_BREAK_ENABLE + + This feature can be modified afterwards using unitary functions @ref LL_TIM_EnableBRK() or @ref LL_TIM_DisableBRK() + + @note This bit-field can not be modified as long as LOCK level 1 has been programmed. */ + + uint32_t BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref TIM_LL_EC_BREAK_POLARITY + + This feature can be modified afterwards using unitary function @ref LL_TIM_ConfigBRK() + + @note This bit-field can not be modified as long as LOCK level 1 has been programmed. */ + + uint32_t AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_LL_EC_AUTOMATICOUTPUT_ENABLE + + This feature can be modified afterwards using unitary functions @ref LL_TIM_EnableAutomaticOutput() or @ref LL_TIM_DisableAutomaticOutput() + + @note This bit-field can not be modified as long as LOCK level 1 has been programmed. */ +} LL_TIM_BDTR_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_LL_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_TIM_ReadReg function. + * @{ + */ +#define LL_TIM_SR_UIF TIM_SR_UIF /*!< Update interrupt flag */ +#define LL_TIM_SR_CC1IF TIM_SR_CC1IF /*!< Capture/compare 1 interrupt flag */ +#define LL_TIM_SR_CC2IF TIM_SR_CC2IF /*!< Capture/compare 2 interrupt flag */ +#define LL_TIM_SR_CC3IF TIM_SR_CC3IF /*!< Capture/compare 3 interrupt flag */ +#define LL_TIM_SR_CC4IF TIM_SR_CC4IF /*!< Capture/compare 4 interrupt flag */ +#define LL_TIM_SR_COMIF TIM_SR_COMIF /*!< COM interrupt flag */ +#define LL_TIM_SR_TIF TIM_SR_TIF /*!< Trigger interrupt flag */ +#define LL_TIM_SR_BIF TIM_SR_BIF /*!< Break interrupt flag */ +#define LL_TIM_SR_CC1OF TIM_SR_CC1OF /*!< Capture/Compare 1 overcapture flag */ +#define LL_TIM_SR_CC2OF TIM_SR_CC2OF /*!< Capture/Compare 2 overcapture flag */ +#define LL_TIM_SR_CC3OF TIM_SR_CC3OF /*!< Capture/Compare 3 overcapture flag */ +#define LL_TIM_SR_CC4OF TIM_SR_CC4OF /*!< Capture/Compare 4 overcapture flag */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_EC_BREAK_ENABLE Break Enable + * @{ + */ +#define LL_TIM_BREAK_DISABLE 0x00000000U /*!< Break function disabled */ +#define LL_TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break function enabled */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_AUTOMATICOUTPUT_ENABLE Automatic output enable + * @{ + */ +#define LL_TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define LL_TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** @defgroup TIM_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_TIM_ReadReg and LL_TIM_WriteReg functions. + * @{ + */ +#define LL_TIM_DIER_UIE TIM_DIER_UIE /*!< Update interrupt enable */ +#define LL_TIM_DIER_CC1IE TIM_DIER_CC1IE /*!< Capture/compare 1 interrupt enable */ +#define LL_TIM_DIER_CC2IE TIM_DIER_CC2IE /*!< Capture/compare 2 interrupt enable */ +#define LL_TIM_DIER_CC3IE TIM_DIER_CC3IE /*!< Capture/compare 3 interrupt enable */ +#define LL_TIM_DIER_CC4IE TIM_DIER_CC4IE /*!< Capture/compare 4 interrupt enable */ +#define LL_TIM_DIER_COMIE TIM_DIER_COMIE /*!< COM interrupt enable */ +#define LL_TIM_DIER_TIE TIM_DIER_TIE /*!< Trigger interrupt enable */ +#define LL_TIM_DIER_BIE TIM_DIER_BIE /*!< Break interrupt enable */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_UPDATESOURCE Update Source + * @{ + */ +#define LL_TIM_UPDATESOURCE_REGULAR 0x00000000U /*!< Counter overflow/underflow, Setting the UG bit or Update generation through the slave mode controller generates an update request */ +#define LL_TIM_UPDATESOURCE_COUNTER TIM_CR1_URS /*!< Only counter overflow/underflow generates an update request */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_ONEPULSEMODE One Pulse Mode + * @{ + */ +#define LL_TIM_ONEPULSEMODE_SINGLE TIM_CR1_OPM /*!< Counter is not stopped at update event */ +#define LL_TIM_ONEPULSEMODE_REPETITIVE 0x00000000U /*!< Counter stops counting at the next update event */ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_COUNTERMODE Counter Mode + * @{ + */ +#define LL_TIM_COUNTERMODE_UP 0x00000000U /*!TIMx_CCRy else active.*/ +#define LL_TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!TIMx_CCRy else inactive*/ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_OCPOLARITY Output Configuration Polarity + * @{ + */ +#define LL_TIM_OCPOLARITY_HIGH 0x00000000U /*!< OCxactive high*/ +#define LL_TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< OCxactive low*/ +/** + * @} + */ + +/** @defgroup TIM_LL_EC_OCIDLESTATE Output Configuration Idle State + * @{ + */ +#define LL_TIM_OCIDLESTATE_LOW 0x00000000U /*!__REG__, (__VALUE__)) + +/** + * @brief Read a value in TIM register. + * @param __INSTANCE__ TIM Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_TIM_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup TIM_LL_EM_Exported_Macros Exported_Macros + * @{ + */ + +/** + * @brief HELPER macro calculating DTG[0:7] in the TIMx_BDTR register to achieve the requested dead time duration. + * @note ex: @ref __LL_TIM_CALC_DEADTIME (80000000, @ref LL_TIM_GetClockDivision (), 120); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __CKD__ This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @param __DT__ deadtime duration (in ns) + * @retval DTG[0:7] + */ +#define __LL_TIM_CALC_DEADTIME(__TIMCLK__, __CKD__, __DT__) \ + ( (((uint64_t)((__DT__)*1000U)) < ((DT_DELAY_1+1U) * TIM_CALC_DTS((__TIMCLK__), (__CKD__)))) ? (uint8_t)(((uint64_t)((__DT__)*1000U) / TIM_CALC_DTS((__TIMCLK__), (__CKD__))) & DT_DELAY_1) : \ + (((uint64_t)((__DT__)*1000U)) < (64U + (DT_DELAY_2+1U)) * 2U * TIM_CALC_DTS((__TIMCLK__), (__CKD__))) ? (uint8_t)(DT_RANGE_2 | ((uint8_t)((uint8_t)((((uint64_t)((__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), (__CKD__))) >> 1U) - (uint8_t) 64U) & DT_DELAY_2)) :\ + (((uint64_t)((__DT__)*1000U)) < (32U + (DT_DELAY_3+1U)) * 8U * TIM_CALC_DTS((__TIMCLK__), (__CKD__))) ? (uint8_t)(DT_RANGE_3 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), (__CKD__))) >> 3U) - (uint8_t) 32U) & DT_DELAY_3)) :\ + (((uint64_t)((__DT__)*1000U)) < (32U + (DT_DELAY_4+1U)) * 16U * TIM_CALC_DTS((__TIMCLK__), (__CKD__))) ? (uint8_t)(DT_RANGE_4 | ((uint8_t)((uint8_t)(((((uint64_t)(__DT__)*1000U))/ TIM_CALC_DTS((__TIMCLK__), (__CKD__))) >> 4U) - (uint8_t) 32U) & DT_DELAY_4)) :\ + 0U) + +/** + * @brief HELPER macro calculating the prescaler value to achieve the required counter clock frequency. + * @note ex: @ref __LL_TIM_CALC_PSC (80000000, 1000000); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __CNTCLK__ counter clock frequency (in Hz) + * @retval Prescaler value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_PSC(__TIMCLK__, __CNTCLK__) \ + ((__TIMCLK__) >= (__CNTCLK__)) ? (uint32_t)((__TIMCLK__)/(__CNTCLK__) - 1U) : 0U + +/** + * @brief HELPER macro calculating the auto-reload value to achieve the required output signal frequency. + * @note ex: @ref __LL_TIM_CALC_ARR (1000000, @ref LL_TIM_GetPrescaler (), 10000); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __FREQ__ output signal frequency (in Hz) + * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_ARR(__TIMCLK__, __PSC__, __FREQ__) \ + (((__TIMCLK__)/((__PSC__) + 1U)) >= (__FREQ__)) ? ((__TIMCLK__)/((__FREQ__) * ((__PSC__) + 1U)) - 1U) : 0U + +/** + * @brief HELPER macro calculating the compare value required to achieve the required timer output compare active/inactive delay. + * @note ex: @ref __LL_TIM_CALC_DELAY (1000000, @ref LL_TIM_GetPrescaler (), 10); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __DELAY__ timer output compare active/inactive delay (in us) + * @retval Compare value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_DELAY(__TIMCLK__, __PSC__, __DELAY__) \ +((uint32_t)(((uint64_t)(__TIMCLK__) * (uint64_t)(__DELAY__)) \ + / ((uint64_t)1000000U * (uint64_t)((__PSC__) + 1U)))) + +/** + * @brief HELPER macro calculating the auto-reload value to achieve the required pulse duration (when the timer operates in one pulse mode). + * @note ex: @ref __LL_TIM_CALC_PULSE (1000000, @ref LL_TIM_GetPrescaler (), 10, 20); + * @param __TIMCLK__ timer input clock frequency (in Hz) + * @param __PSC__ prescaler + * @param __DELAY__ timer output compare active/inactive delay (in us) + * @param __PULSE__ pulse duration (in us) + * @retval Auto-reload value (between Min_Data=0 and Max_Data=65535) + */ +#define __LL_TIM_CALC_PULSE(__TIMCLK__, __PSC__, __DELAY__, __PULSE__) \ + ((uint32_t)(__LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__PULSE__)) \ + + __LL_TIM_CALC_DELAY((__TIMCLK__), (__PSC__), (__DELAY__)))) + +/** + * @brief HELPER macro retrieving the ratio of the input capture prescaler + * @note ex: @ref __LL_TIM_GET_ICPSC_RATIO (@ref LL_TIM_IC_GetPrescaler ()); + * @param __ICPSC__ This parameter can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + * @retval Input capture prescaler ratio (1, 2, 4 or 8) + */ +#define __LL_TIM_GET_ICPSC_RATIO(__ICPSC__) \ + ((uint32_t)(0x01U << (((__ICPSC__) >> 16U) >> TIM_CCMR1_IC1PSC_Pos))) + + +/** + * @} + */ + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIM_LL_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @defgroup TIM_LL_EF_Time_Base Time Base configuration + * @{ + */ +/** + * @brief Enable timer counter. + * @rmtoll CR1 CEN LL_TIM_EnableCounter + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableCounter(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_CEN); +} + +/** + * @brief Disable timer counter. + * @rmtoll CR1 CEN LL_TIM_DisableCounter + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableCounter(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_CEN); +} + +/** + * @brief Indicates whether the timer counter is enabled. + * @rmtoll CR1 CEN LL_TIM_IsEnabledCounter + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledCounter(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->CR1, TIM_CR1_CEN) == (TIM_CR1_CEN)); +} + +/** + * @brief Enable update event generation. + * @rmtoll CR1 UDIS LL_TIM_EnableUpdateEvent + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableUpdateEvent(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_UDIS); +} + +/** + * @brief Disable update event generation. + * @rmtoll CR1 UDIS LL_TIM_DisableUpdateEvent + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableUpdateEvent(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_UDIS); +} + +/** + * @brief Indicates whether update event generation is enabled. + * @rmtoll CR1 UDIS LL_TIM_IsEnabledUpdateEvent + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledUpdateEvent(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->CR1, TIM_CR1_UDIS) == (TIM_CR1_UDIS)); +} + +/** + * @brief Set update event source + * @note Update event source set to LL_TIM_UPDATESOURCE_REGULAR: any of the following events + * generate an update interrupt or DMA request if enabled: + * - Counter overflow/underflow + * - Setting the UG bit + * - Update generation through the slave mode controller + * @note Update event source set to LL_TIM_UPDATESOURCE_COUNTER: only counter + * overflow/underflow generates an update interrupt or DMA request if enabled. + * @rmtoll CR1 URS LL_TIM_SetUpdateSource + * @param TIMx Timer instance + * @param UpdateSource This parameter can be one of the following values: + * @arg @ref LL_TIM_UPDATESOURCE_REGULAR + * @arg @ref LL_TIM_UPDATESOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetUpdateSource(TIM_TypeDef *TIMx, uint32_t UpdateSource) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_URS, UpdateSource); +} + +/** + * @brief Get actual event update source + * @rmtoll CR1 URS LL_TIM_GetUpdateSource + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_UPDATESOURCE_REGULAR + * @arg @ref LL_TIM_UPDATESOURCE_COUNTER + */ +__STATIC_INLINE uint32_t LL_TIM_GetUpdateSource(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_URS)); +} + +/** + * @brief Set one pulse mode (one shot v.s. repetitive). + * @rmtoll CR1 OPM LL_TIM_SetOnePulseMode + * @param TIMx Timer instance + * @param OnePulseMode This parameter can be one of the following values: + * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE + * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetOnePulseMode(TIM_TypeDef *TIMx, uint32_t OnePulseMode) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_OPM, OnePulseMode); +} + +/** + * @brief Get actual one pulse mode. + * @rmtoll CR1 OPM LL_TIM_GetOnePulseMode + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ONEPULSEMODE_SINGLE + * @arg @ref LL_TIM_ONEPULSEMODE_REPETITIVE + */ +__STATIC_INLINE uint32_t LL_TIM_GetOnePulseMode(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_OPM)); +} + +/** + * @brief Set the timer counter counting mode. + * @note Macro @ref IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to + * check whether or not the counter mode selection feature is supported + * by a timer instance. + * @rmtoll CR1 DIR LL_TIM_SetCounterMode\n + * CR1 CMS LL_TIM_SetCounterMode + * @param TIMx Timer instance + * @param CounterMode This parameter can be one of the following values: + * @arg @ref LL_TIM_COUNTERMODE_UP + * @arg @ref LL_TIM_COUNTERMODE_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP + * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetCounterMode(TIM_TypeDef *TIMx, uint32_t CounterMode) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_DIR | TIM_CR1_CMS, CounterMode); +} + +/** + * @brief Get actual counter mode. + * @note Macro @ref IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx) can be used to + * check whether or not the counter mode selection feature is supported + * by a timer instance. + * @rmtoll CR1 DIR LL_TIM_GetCounterMode\n + * CR1 CMS LL_TIM_GetCounterMode + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_COUNTERMODE_UP + * @arg @ref LL_TIM_COUNTERMODE_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP + * @arg @ref LL_TIM_COUNTERMODE_CENTER_DOWN + * @arg @ref LL_TIM_COUNTERMODE_CENTER_UP_DOWN + */ +__STATIC_INLINE uint32_t LL_TIM_GetCounterMode(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR | TIM_CR1_CMS)); +} + +/** + * @brief Enable auto-reload (ARR) preload. + * @rmtoll CR1 ARPE LL_TIM_EnableARRPreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableARRPreload(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR1, TIM_CR1_ARPE); +} + +/** + * @brief Disable auto-reload (ARR) preload. + * @rmtoll CR1 ARPE LL_TIM_DisableARRPreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableARRPreload(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR1, TIM_CR1_ARPE); +} + +/** + * @brief Indicates whether auto-reload (ARR) preload is enabled. + * @rmtoll CR1 ARPE LL_TIM_IsEnabledARRPreload + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledARRPreload(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->CR1, TIM_CR1_ARPE) == (TIM_CR1_ARPE)); +} + +/** + * @brief Set the division ratio between the timer clock and the sampling clock used by the dead-time generators (when supported) and the digital filters. + * @note Macro @ref IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check + * whether or not the clock division feature is supported by the timer + * instance. + * @rmtoll CR1 CKD LL_TIM_SetClockDivision + * @param TIMx Timer instance + * @param ClockDivision This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetClockDivision(TIM_TypeDef *TIMx, uint32_t ClockDivision) +{ + MODIFY_REG(TIMx->CR1, TIM_CR1_CKD, ClockDivision); +} + +/** + * @brief Get the actual division ratio between the timer clock and the sampling clock used by the dead-time generators (when supported) and the digital filters. + * @note Macro @ref IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx) can be used to check + * whether or not the clock division feature is supported by the timer + * instance. + * @rmtoll CR1 CKD LL_TIM_GetClockDivision + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_CLOCKDIVISION_DIV1 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV2 + * @arg @ref LL_TIM_CLOCKDIVISION_DIV4 + */ +__STATIC_INLINE uint32_t LL_TIM_GetClockDivision(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_CKD)); +} + +/** + * @brief Set the counter value. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @rmtoll CNT CNT LL_TIM_SetCounter + * @param TIMx Timer instance + * @param Counter Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetCounter(TIM_TypeDef *TIMx, uint32_t Counter) +{ + WRITE_REG(TIMx->CNT, Counter); +} + +/** + * @brief Get the counter value. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @rmtoll CNT CNT LL_TIM_GetCounter + * @param TIMx Timer instance + * @retval Counter value (between Min_Data=0 and Max_Data=0xFFFF or 0xFFFFFFFF) + */ +__STATIC_INLINE uint32_t LL_TIM_GetCounter(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CNT)); +} + +/** + * @brief Get the current direction of the counter + * @rmtoll CR1 DIR LL_TIM_GetDirection + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_COUNTERDIRECTION_UP + * @arg @ref LL_TIM_COUNTERDIRECTION_DOWN + */ +__STATIC_INLINE uint32_t LL_TIM_GetDirection(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, TIM_CR1_DIR)); +} + +/** + * @brief Set the prescaler value. + * @note The counter clock frequency CK_CNT is equal to fCK_PSC / (PSC[15:0] + 1). + * @note The prescaler can be changed on the fly as this control register is buffered. The new + * prescaler ratio is taken into account at the next update event. + * @note Helper macro @ref __LL_TIM_CALC_PSC can be used to calculate the Prescaler parameter + * @rmtoll PSC PSC LL_TIM_SetPrescaler + * @param TIMx Timer instance + * @param Prescaler between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Prescaler) +{ + WRITE_REG(TIMx->PSC, Prescaler); +} + +/** + * @brief Get the prescaler value. + * @rmtoll PSC PSC LL_TIM_GetPrescaler + * @param TIMx Timer instance + * @retval Prescaler value between Min_Data=0 and Max_Data=65535 + */ +__STATIC_INLINE uint32_t LL_TIM_GetPrescaler(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->PSC)); +} + +/** + * @brief Set the auto-reload value. + * @note The counter is blocked while the auto-reload value is null. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Helper macro @ref __LL_TIM_CALC_ARR can be used to calculate the AutoReload parameter + * @rmtoll ARR ARR LL_TIM_SetAutoReload + * @param TIMx Timer instance + * @param AutoReload between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetAutoReload(TIM_TypeDef *TIMx, uint32_t AutoReload) +{ + WRITE_REG(TIMx->ARR, AutoReload); +} + +/** + * @brief Get the auto-reload value. + * @rmtoll ARR ARR LL_TIM_GetAutoReload + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @param TIMx Timer instance + * @retval Auto-reload value + */ +__STATIC_INLINE uint32_t LL_TIM_GetAutoReload(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->ARR)); +} + +/** + * @brief Set the repetition counter value. + * @note Macro @ref IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a repetition counter. + * @rmtoll RCR REP LL_TIM_SetRepetitionCounter + * @param TIMx Timer instance + * @param RepetitionCounter between Min_Data=0 and Max_Data=255 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetRepetitionCounter(TIM_TypeDef *TIMx, uint32_t RepetitionCounter) +{ + WRITE_REG(TIMx->RCR, RepetitionCounter); +} + +/** + * @brief Get the repetition counter value. + * @note Macro @ref IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a repetition counter. + * @rmtoll RCR REP LL_TIM_GetRepetitionCounter + * @param TIMx Timer instance + * @retval Repetition counter value + */ +__STATIC_INLINE uint32_t LL_TIM_GetRepetitionCounter(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->RCR)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Capture_Compare Capture Compare configuration + * @{ + */ +/** + * @brief Enable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. + * @note CCxE, CCxNE and OCxM bits are preloaded, after having been written, + * they are updated only when a commutation event (COM) occurs. + * @note Only on channels that have a complementary output. + * @note Macro @ref IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCPC LL_TIM_CC_EnablePreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_EnablePreload(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR2, TIM_CR2_CCPC); +} + +/** + * @brief Disable the capture/compare control bits (CCxE, CCxNE and OCxM) preload. + * @note Macro @ref IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCPC LL_TIM_CC_DisablePreload + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_DisablePreload(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR2, TIM_CR2_CCPC); +} + +/** + * @brief Set the updated source of the capture/compare control bits (CCxE, CCxNE and OCxM). + * @note Macro @ref IS_TIM_COMMUTATION_EVENT_INSTANCE(TIMx) can be used to check + * whether or not a timer instance is able to generate a commutation event. + * @rmtoll CR2 CCUS LL_TIM_CC_SetUpdate + * @param TIMx Timer instance + * @param CCUpdateSource This parameter can be one of the following values: + * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_ONLY + * @arg @ref LL_TIM_CCUPDATESOURCE_COMG_AND_TRGI + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetUpdate(TIM_TypeDef *TIMx, uint32_t CCUpdateSource) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_CCUS, CCUpdateSource); +} + +/** + * @brief Set the trigger of the capture/compare DMA request. + * @rmtoll CR2 CCDS LL_TIM_CC_SetDMAReqTrigger + * @param TIMx Timer instance + * @param DMAReqTrigger This parameter can be one of the following values: + * @arg @ref LL_TIM_CCDMAREQUEST_CC + * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetDMAReqTrigger(TIM_TypeDef *TIMx, uint32_t DMAReqTrigger) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_CCDS, DMAReqTrigger); +} + +/** + * @brief Get actual trigger of the capture/compare DMA request. + * @rmtoll CR2 CCDS LL_TIM_CC_GetDMAReqTrigger + * @param TIMx Timer instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_CCDMAREQUEST_CC + * @arg @ref LL_TIM_CCDMAREQUEST_UPDATE + */ +__STATIC_INLINE uint32_t LL_TIM_CC_GetDMAReqTrigger(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, TIM_CR2_CCDS)); +} + +/** + * @brief Set the lock level to freeze the + * configuration of several capture/compare parameters. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * the lock mechanism is supported by a timer instance. + * @rmtoll BDTR LOCK LL_TIM_CC_SetLockLevel + * @param TIMx Timer instance + * @param LockLevel This parameter can be one of the following values: + * @arg @ref LL_TIM_LOCKLEVEL_OFF + * @arg @ref LL_TIM_LOCKLEVEL_1 + * @arg @ref LL_TIM_LOCKLEVEL_2 + * @arg @ref LL_TIM_LOCKLEVEL_3 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_SetLockLevel(TIM_TypeDef *TIMx, uint32_t LockLevel) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_LOCK, LockLevel); +} + +/** + * @brief Enable capture/compare channels. + * @rmtoll CCER CC1E LL_TIM_CC_EnableChannel\n + * CCER CC1NE LL_TIM_CC_EnableChannel\n + * CCER CC2E LL_TIM_CC_EnableChannel\n + * CCER CC2NE LL_TIM_CC_EnableChannel\n + * CCER CC3E LL_TIM_CC_EnableChannel\n + * CCER CC3NE LL_TIM_CC_EnableChannel\n + * CCER CC4E LL_TIM_CC_EnableChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_EnableChannel(TIM_TypeDef *TIMx, uint32_t Channels) +{ + SET_BIT(TIMx->CCER, Channels); +} + +/** + * @brief Disable capture/compare channels. + * @rmtoll CCER CC1E LL_TIM_CC_DisableChannel\n + * CCER CC1NE LL_TIM_CC_DisableChannel\n + * CCER CC2E LL_TIM_CC_DisableChannel\n + * CCER CC2NE LL_TIM_CC_DisableChannel\n + * CCER CC3E LL_TIM_CC_DisableChannel\n + * CCER CC3NE LL_TIM_CC_DisableChannel\n + * CCER CC4E LL_TIM_CC_DisableChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_CC_DisableChannel(TIM_TypeDef *TIMx, uint32_t Channels) +{ + CLEAR_BIT(TIMx->CCER, Channels); +} + +/** + * @brief Indicate whether channel(s) is(are) enabled. + * @rmtoll CCER CC1E LL_TIM_CC_IsEnabledChannel\n + * CCER CC1NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC2E LL_TIM_CC_IsEnabledChannel\n + * CCER CC2NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC3E LL_TIM_CC_IsEnabledChannel\n + * CCER CC3NE LL_TIM_CC_IsEnabledChannel\n + * CCER CC4E LL_TIM_CC_IsEnabledChannel + * @param TIMx Timer instance + * @param Channels This parameter can be a combination of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_CC_IsEnabledChannel(TIM_TypeDef *TIMx, uint32_t Channels) +{ + return (READ_BIT(TIMx->CCER, Channels) == (Channels)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Output_Channel Output channel configuration + * @{ + */ +/** + * @brief Configure an output channel. + * @rmtoll CCMR1 CC1S LL_TIM_OC_ConfigOutput\n + * CCMR1 CC2S LL_TIM_OC_ConfigOutput\n + * CCMR2 CC3S LL_TIM_OC_ConfigOutput\n + * CCMR2 CC4S LL_TIM_OC_ConfigOutput\n + * CCER CC1P LL_TIM_OC_ConfigOutput\n + * CCER CC2P LL_TIM_OC_ConfigOutput\n + * CCER CC3P LL_TIM_OC_ConfigOutput\n + * CCER CC4P LL_TIM_OC_ConfigOutput\n + * CR2 OIS1 LL_TIM_OC_ConfigOutput\n + * CR2 OIS2 LL_TIM_OC_ConfigOutput\n + * CR2 OIS3 LL_TIM_OC_ConfigOutput\n + * CR2 OIS4 LL_TIM_OC_ConfigOutput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH or @ref LL_TIM_OCPOLARITY_LOW + * @arg @ref LL_TIM_OCIDLESTATE_LOW or @ref LL_TIM_OCIDLESTATE_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_ConfigOutput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_CC1S << SHIFT_TAB_OCxx[iChannel])); + MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), + (Configuration & TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]); + MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), + (Configuration & TIM_CR2_OIS1) << SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Define the behavior of the output reference signal OCxREF from which + * OCx and OCxN (when relevant) are derived. + * @rmtoll CCMR1 OC1M LL_TIM_OC_SetMode\n + * CCMR1 OC2M LL_TIM_OC_SetMode\n + * CCMR2 OC3M LL_TIM_OC_SetMode\n + * CCMR2 OC4M LL_TIM_OC_SetMode + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_TIM_OCMODE_FROZEN + * @arg @ref LL_TIM_OCMODE_ACTIVE + * @arg @ref LL_TIM_OCMODE_INACTIVE + * @arg @ref LL_TIM_OCMODE_TOGGLE + * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE + * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE + * @arg @ref LL_TIM_OCMODE_PWM1 + * @arg @ref LL_TIM_OCMODE_PWM2 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetMode(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Mode) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel]), Mode << SHIFT_TAB_OCxx[iChannel]); +} + +/** + * @brief Get the output compare mode of an output channel. + * @rmtoll CCMR1 OC1M LL_TIM_OC_GetMode\n + * CCMR1 OC2M LL_TIM_OC_GetMode\n + * CCMR2 OC3M LL_TIM_OC_GetMode\n + * CCMR2 OC4M LL_TIM_OC_GetMode + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCMODE_FROZEN + * @arg @ref LL_TIM_OCMODE_ACTIVE + * @arg @ref LL_TIM_OCMODE_INACTIVE + * @arg @ref LL_TIM_OCMODE_TOGGLE + * @arg @ref LL_TIM_OCMODE_FORCED_INACTIVE + * @arg @ref LL_TIM_OCMODE_FORCED_ACTIVE + * @arg @ref LL_TIM_OCMODE_PWM1 + * @arg @ref LL_TIM_OCMODE_PWM2 + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetMode(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return (READ_BIT(*pReg, ((TIM_CCMR1_OC1M | TIM_CCMR1_CC1S) << SHIFT_TAB_OCxx[iChannel])) >> SHIFT_TAB_OCxx[iChannel]); +} + +/** + * @brief Set the polarity of an output channel. + * @rmtoll CCER CC1P LL_TIM_OC_SetPolarity\n + * CCER CC1NP LL_TIM_OC_SetPolarity\n + * CCER CC2P LL_TIM_OC_SetPolarity\n + * CCER CC2NP LL_TIM_OC_SetPolarity\n + * CCER CC3P LL_TIM_OC_SetPolarity\n + * CCER CC3NP LL_TIM_OC_SetPolarity\n + * CCER CC4P LL_TIM_OC_SetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH + * @arg @ref LL_TIM_OCPOLARITY_LOW + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Polarity) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel]), Polarity << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Get the polarity of an output channel. + * @rmtoll CCER CC1P LL_TIM_OC_GetPolarity\n + * CCER CC1NP LL_TIM_OC_GetPolarity\n + * CCER CC2P LL_TIM_OC_GetPolarity\n + * CCER CC2NP LL_TIM_OC_GetPolarity\n + * CCER CC3P LL_TIM_OC_GetPolarity\n + * CCER CC3NP LL_TIM_OC_GetPolarity\n + * CCER CC4P LL_TIM_OC_GetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCPOLARITY_HIGH + * @arg @ref LL_TIM_OCPOLARITY_LOW + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetPolarity(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CCER, (TIM_CCER_CC1P << SHIFT_TAB_CCxP[iChannel])) >> SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Set the IDLE state of an output channel + * @note This function is significant only for the timer instances + * supporting the break feature. Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) + * can be used to check whether or not a timer instance provides + * a break input. + * @rmtoll CR2 OIS1 LL_TIM_OC_SetIdleState\n + * CR2 OIS1N LL_TIM_OC_SetIdleState\n + * CR2 OIS2 LL_TIM_OC_SetIdleState\n + * CR2 OIS2N LL_TIM_OC_SetIdleState\n + * CR2 OIS3 LL_TIM_OC_SetIdleState\n + * CR2 OIS3N LL_TIM_OC_SetIdleState\n + * CR2 OIS4 LL_TIM_OC_SetIdleState + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param IdleState This parameter can be one of the following values: + * @arg @ref LL_TIM_OCIDLESTATE_LOW + * @arg @ref LL_TIM_OCIDLESTATE_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetIdleState(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t IdleState) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel]), IdleState << SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Get the IDLE state of an output channel + * @rmtoll CR2 OIS1 LL_TIM_OC_GetIdleState\n + * CR2 OIS1N LL_TIM_OC_GetIdleState\n + * CR2 OIS2 LL_TIM_OC_GetIdleState\n + * CR2 OIS2N LL_TIM_OC_GetIdleState\n + * CR2 OIS3 LL_TIM_OC_GetIdleState\n + * CR2 OIS3N LL_TIM_OC_GetIdleState\n + * CR2 OIS4 LL_TIM_OC_GetIdleState + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH1N + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH2N + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH3N + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_OCIDLESTATE_LOW + * @arg @ref LL_TIM_OCIDLESTATE_HIGH + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetIdleState(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CR2, (TIM_CR2_OIS1 << SHIFT_TAB_OISx[iChannel])) >> SHIFT_TAB_OISx[iChannel]); +} + +/** + * @brief Enable fast mode for the output channel. + * @note Acts only if the channel is configured in PWM1 or PWM2 mode. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_EnableFast\n + * CCMR1 OC2FE LL_TIM_OC_EnableFast\n + * CCMR2 OC3FE LL_TIM_OC_EnableFast\n + * CCMR2 OC4FE LL_TIM_OC_EnableFast + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnableFast(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); + +} + +/** + * @brief Disable fast mode for the output channel. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_DisableFast\n + * CCMR1 OC2FE LL_TIM_OC_DisableFast\n + * CCMR2 OC3FE LL_TIM_OC_DisableFast\n + * CCMR2 OC4FE LL_TIM_OC_DisableFast + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisableFast(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel])); + +} + +/** + * @brief Indicates whether fast mode is enabled for the output channel. + * @rmtoll CCMR1 OC1FE LL_TIM_OC_IsEnabledFast\n + * CCMR1 OC2FE LL_TIM_OC_IsEnabledFast\n + * CCMR2 OC3FE LL_TIM_OC_IsEnabledFast\n + * CCMR2 OC4FE LL_TIM_OC_IsEnabledFast\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledFast(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + register uint32_t bitfield = TIM_CCMR1_OC1FE << SHIFT_TAB_OCxx[iChannel]; + return (READ_BIT(*pReg, bitfield) == bitfield); +} + +/** + * @brief Enable compare register (TIMx_CCRx) preload for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_EnablePreload\n + * CCMR1 OC2PE LL_TIM_OC_EnablePreload\n + * CCMR2 OC3PE LL_TIM_OC_EnablePreload\n + * CCMR2 OC4PE LL_TIM_OC_EnablePreload + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnablePreload(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Disable compare register (TIMx_CCRx) preload for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_DisablePreload\n + * CCMR1 OC2PE LL_TIM_OC_DisablePreload\n + * CCMR2 OC3PE LL_TIM_OC_DisablePreload\n + * CCMR2 OC4PE LL_TIM_OC_DisablePreload + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisablePreload(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Indicates whether compare register (TIMx_CCRx) preload is enabled for the output channel. + * @rmtoll CCMR1 OC1PE LL_TIM_OC_IsEnabledPreload\n + * CCMR1 OC2PE LL_TIM_OC_IsEnabledPreload\n + * CCMR2 OC3PE LL_TIM_OC_IsEnabledPreload\n + * CCMR2 OC4PE LL_TIM_OC_IsEnabledPreload\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledPreload(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + register uint32_t bitfield = TIM_CCMR1_OC1PE << SHIFT_TAB_OCxx[iChannel]; + return (READ_BIT(*pReg, bitfield) == bitfield); +} + +/** + * @brief Enable clearing the output channel on an external event. + * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. + * @note Macro @ref IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_EnableClear\n + * CCMR1 OC2CE LL_TIM_OC_EnableClear\n + * CCMR2 OC3CE LL_TIM_OC_EnableClear\n + * CCMR2 OC4CE LL_TIM_OC_EnableClear + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_EnableClear(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + SET_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Disable clearing the output channel on an external event. + * @note Macro @ref IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_DisableClear\n + * CCMR1 OC2CE LL_TIM_OC_DisableClear\n + * CCMR2 OC3CE LL_TIM_OC_DisableClear\n + * CCMR2 OC4CE LL_TIM_OC_DisableClear + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_DisableClear(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + CLEAR_BIT(*pReg, (TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel])); +} + +/** + * @brief Indicates clearing the output channel on an external event is enabled for the output channel. + * @note This function enables clearing the output channel on an external event. + * @note This function can only be used in Output compare and PWM modes. It does not work in Forced mode. + * @note Macro @ref IS_TIM_OCXREF_CLEAR_INSTANCE(TIMx) can be used to check whether + * or not a timer instance can clear the OCxREF signal on an external event. + * @rmtoll CCMR1 OC1CE LL_TIM_OC_IsEnabledClear\n + * CCMR1 OC2CE LL_TIM_OC_IsEnabledClear\n + * CCMR2 OC3CE LL_TIM_OC_IsEnabledClear\n + * CCMR2 OC4CE LL_TIM_OC_IsEnabledClear\n + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_OC_IsEnabledClear(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + register uint32_t bitfield = TIM_CCMR1_OC1CE << SHIFT_TAB_OCxx[iChannel]; + return (READ_BIT(*pReg, bitfield) == bitfield); +} + +/** + * @brief Set the dead-time delay (delay inserted between the rising edge of the OCxREF signal and the rising edge if the Ocx and OCxN signals). + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * dead-time insertion feature is supported by a timer instance. + * @note Helper macro @ref __LL_TIM_CALC_DEADTIME can be used to calculate the DeadTime parameter + * @rmtoll BDTR DTG LL_TIM_OC_SetDeadTime + * @param TIMx Timer instance + * @param DeadTime between Min_Data=0 and Max_Data=255 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetDeadTime(TIM_TypeDef *TIMx, uint32_t DeadTime) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_DTG, DeadTime); +} + +/** + * @brief Set compare value for output channel 1 (TIMx_CCR1). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * output channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_OC_SetCompareCH1 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH1(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR1, CompareValue); +} + +/** + * @brief Set compare value for output channel 2 (TIMx_CCR2). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * output channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_OC_SetCompareCH2 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH2(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR2, CompareValue); +} + +/** + * @brief Set compare value for output channel 3 (TIMx_CCR3). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * output channel is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_OC_SetCompareCH3 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH3(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR3, CompareValue); +} + +/** + * @brief Set compare value for output channel 4 (TIMx_CCR4). + * @note In 32-bit timer implementations compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * output channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_OC_SetCompareCH4 + * @param TIMx Timer instance + * @param CompareValue between Min_Data=0 and Max_Data=65535 + * @retval None + */ +__STATIC_INLINE void LL_TIM_OC_SetCompareCH4(TIM_TypeDef *TIMx, uint32_t CompareValue) +{ + WRITE_REG(TIMx->CCR4, CompareValue); +} + +/** + * @brief Get compare value (TIMx_CCR1) set for output channel 1. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * output channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_OC_GetCompareCH1 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH1(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR1)); +} + +/** + * @brief Get compare value (TIMx_CCR2) set for output channel 2. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * output channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_OC_GetCompareCH2 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH2(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR2)); +} + +/** + * @brief Get compare value (TIMx_CCR3) set for output channel 3. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * output channel 3 is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_OC_GetCompareCH3 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH3(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR3)); +} + +/** + * @brief Get compare value (TIMx_CCR4) set for output channel 4. + * @note In 32-bit timer implementations returned compare value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * output channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_OC_GetCompareCH4 + * @param TIMx Timer instance + * @retval CompareValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_OC_GetCompareCH4(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR4)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Input_Channel Input channel configuration + * @{ + */ +/** + * @brief Configure input channel. + * @rmtoll CCMR1 CC1S LL_TIM_IC_Config\n + * CCMR1 IC1PSC LL_TIM_IC_Config\n + * CCMR1 IC1F LL_TIM_IC_Config\n + * CCMR1 CC2S LL_TIM_IC_Config\n + * CCMR1 IC2PSC LL_TIM_IC_Config\n + * CCMR1 IC2F LL_TIM_IC_Config\n + * CCMR2 CC3S LL_TIM_IC_Config\n + * CCMR2 IC3PSC LL_TIM_IC_Config\n + * CCMR2 IC3F LL_TIM_IC_Config\n + * CCMR2 CC4S LL_TIM_IC_Config\n + * CCMR2 IC4PSC LL_TIM_IC_Config\n + * CCMR2 IC4F LL_TIM_IC_Config\n + * CCER CC1P LL_TIM_IC_Config\n + * CCER CC1NP LL_TIM_IC_Config\n + * CCER CC2P LL_TIM_IC_Config\n + * CCER CC2NP LL_TIM_IC_Config\n + * CCER CC3P LL_TIM_IC_Config\n + * CCER CC3NP LL_TIM_IC_Config\n + * CCER CC4P LL_TIM_IC_Config\n + * CCER CC4NP LL_TIM_IC_Config + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI or @ref LL_TIM_ACTIVEINPUT_INDIRECTTI or @ref LL_TIM_ACTIVEINPUT_TRC + * @arg @ref LL_TIM_ICPSC_DIV1 or ... or @ref LL_TIM_ICPSC_DIV8 + * @arg @ref LL_TIM_IC_FILTER_FDIV1 or ... or @ref LL_TIM_IC_FILTER_FDIV32_N8 + * @arg @ref LL_TIM_IC_POLARITY_RISING or @ref LL_TIM_IC_POLARITY_FALLING or @ref LL_TIM_IC_POLARITY_BOTHEDGE + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_Config(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t Configuration) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), + ((Configuration >> 16U) & (TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC | TIM_CCMR1_CC1S)) << SHIFT_TAB_ICxx[iChannel]); + MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), + (Configuration & (TIM_CCER_CC1NP | TIM_CCER_CC1P)) << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Set the active input. + * @rmtoll CCMR1 CC1S LL_TIM_IC_SetActiveInput\n + * CCMR1 CC2S LL_TIM_IC_SetActiveInput\n + * CCMR2 CC3S LL_TIM_IC_SetActiveInput\n + * CCMR2 CC4S LL_TIM_IC_SetActiveInput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICActiveInput This parameter can be one of the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_TRC + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetActiveInput(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICActiveInput) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel]), (ICActiveInput >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the current active input. + * @rmtoll CCMR1 CC1S LL_TIM_IC_GetActiveInput\n + * CCMR1 CC2S LL_TIM_IC_GetActiveInput\n + * CCMR2 CC3S LL_TIM_IC_GetActiveInput\n + * CCMR2 CC4S LL_TIM_IC_GetActiveInput + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ACTIVEINPUT_DIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_INDIRECTTI + * @arg @ref LL_TIM_ACTIVEINPUT_TRC + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetActiveInput(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_CC1S) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the prescaler of input channel. + * @rmtoll CCMR1 IC1PSC LL_TIM_IC_SetPrescaler\n + * CCMR1 IC2PSC LL_TIM_IC_SetPrescaler\n + * CCMR2 IC3PSC LL_TIM_IC_SetPrescaler\n + * CCMR2 IC4PSC LL_TIM_IC_SetPrescaler + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICPrescaler This parameter can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetPrescaler(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPrescaler) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel]), (ICPrescaler >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the current prescaler value acting on an input channel. + * @rmtoll CCMR1 IC1PSC LL_TIM_IC_GetPrescaler\n + * CCMR1 IC2PSC LL_TIM_IC_GetPrescaler\n + * CCMR2 IC3PSC LL_TIM_IC_GetPrescaler\n + * CCMR2 IC4PSC LL_TIM_IC_GetPrescaler + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_ICPSC_DIV1 + * @arg @ref LL_TIM_ICPSC_DIV2 + * @arg @ref LL_TIM_ICPSC_DIV4 + * @arg @ref LL_TIM_ICPSC_DIV8 + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetPrescaler(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1PSC) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the input filter duration. + * @rmtoll CCMR1 IC1F LL_TIM_IC_SetFilter\n + * CCMR1 IC2F LL_TIM_IC_SetFilter\n + * CCMR2 IC3F LL_TIM_IC_SetFilter\n + * CCMR2 IC4F LL_TIM_IC_SetFilter + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICFilter This parameter can be one of the following values: + * @arg @ref LL_TIM_IC_FILTER_FDIV1 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetFilter(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICFilter) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + MODIFY_REG(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel]), (ICFilter >> 16U) << SHIFT_TAB_ICxx[iChannel]); +} + +/** + * @brief Get the input filter duration. + * @rmtoll CCMR1 IC1F LL_TIM_IC_GetFilter\n + * CCMR1 IC2F LL_TIM_IC_GetFilter\n + * CCMR2 IC3F LL_TIM_IC_GetFilter\n + * CCMR2 IC4F LL_TIM_IC_GetFilter + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_IC_FILTER_FDIV1 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_IC_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_IC_FILTER_FDIV32_N8 + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetFilter(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&TIMx->CCMR1) + OFFSET_TAB_CCMRx[iChannel])); + return ((READ_BIT(*pReg, ((TIM_CCMR1_IC1F) << SHIFT_TAB_ICxx[iChannel])) >> SHIFT_TAB_ICxx[iChannel]) << 16U); +} + +/** + * @brief Set the input channel polarity. + * @rmtoll CCER CC1P LL_TIM_IC_SetPolarity\n + * CCER CC1NP LL_TIM_IC_SetPolarity\n + * CCER CC2P LL_TIM_IC_SetPolarity\n + * CCER CC2NP LL_TIM_IC_SetPolarity\n + * CCER CC3P LL_TIM_IC_SetPolarity\n + * CCER CC3NP LL_TIM_IC_SetPolarity\n + * CCER CC4P LL_TIM_IC_SetPolarity\n + * CCER CC4NP LL_TIM_IC_SetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param ICPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_IC_POLARITY_RISING + * @arg @ref LL_TIM_IC_POLARITY_FALLING + * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_SetPolarity(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ICPolarity) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + MODIFY_REG(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel]), + ICPolarity << SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Get the current input channel polarity. + * @rmtoll CCER CC1P LL_TIM_IC_GetPolarity\n + * CCER CC1NP LL_TIM_IC_GetPolarity\n + * CCER CC2P LL_TIM_IC_GetPolarity\n + * CCER CC2NP LL_TIM_IC_GetPolarity\n + * CCER CC3P LL_TIM_IC_GetPolarity\n + * CCER CC3NP LL_TIM_IC_GetPolarity\n + * CCER CC4P LL_TIM_IC_GetPolarity\n + * CCER CC4NP LL_TIM_IC_GetPolarity + * @param TIMx Timer instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @retval Returned value can be one of the following values: + * @arg @ref LL_TIM_IC_POLARITY_RISING + * @arg @ref LL_TIM_IC_POLARITY_FALLING + * @arg @ref LL_TIM_IC_POLARITY_BOTHEDGE + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetPolarity(TIM_TypeDef *TIMx, uint32_t Channel) +{ + register uint8_t iChannel = TIM_GET_CHANNEL_INDEX(Channel); + return (READ_BIT(TIMx->CCER, ((TIM_CCER_CC1NP | TIM_CCER_CC1P) << SHIFT_TAB_CCxP[iChannel])) >> + SHIFT_TAB_CCxP[iChannel]); +} + +/** + * @brief Connect the TIMx_CH1, CH2 and CH3 pins to the TI1 input (XOR combination). + * @note Macro @ref IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_EnableXORCombination + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_EnableXORCombination(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->CR2, TIM_CR2_TI1S); +} + +/** + * @brief Disconnect the TIMx_CH1, CH2 and CH3 pins from the TI1 input. + * @note Macro @ref IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_DisableXORCombination + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_IC_DisableXORCombination(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->CR2, TIM_CR2_TI1S); +} + +/** + * @brief Indicates whether the TIMx_CH1, CH2 and CH3 pins are connectected to the TI1 input. + * @note Macro @ref IS_TIM_XOR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an XOR input. + * @rmtoll CR2 TI1S LL_TIM_IC_IsEnabledXORCombination + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IC_IsEnabledXORCombination(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->CR2, TIM_CR2_TI1S) == (TIM_CR2_TI1S)); +} + +/** + * @brief Get captured value for input channel 1. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC1_INSTANCE(TIMx) can be used to check whether or not + * input channel 1 is supported by a timer instance. + * @rmtoll CCR1 CCR1 LL_TIM_IC_GetCaptureCH1 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH1(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR1)); +} + +/** + * @brief Get captured value for input channel 2. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC2_INSTANCE(TIMx) can be used to check whether or not + * input channel 2 is supported by a timer instance. + * @rmtoll CCR2 CCR2 LL_TIM_IC_GetCaptureCH2 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH2(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR2)); +} + +/** + * @brief Get captured value for input channel 3. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC3_INSTANCE(TIMx) can be used to check whether or not + * input channel 3 is supported by a timer instance. + * @rmtoll CCR3 CCR3 LL_TIM_IC_GetCaptureCH3 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH3(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR3)); +} + +/** + * @brief Get captured value for input channel 4. + * @note In 32-bit timer implementations returned captured value can be between 0x00000000 and 0xFFFFFFFF. + * @note Macro @ref IS_TIM_32B_COUNTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports a 32 bits counter. + * @note Macro @ref IS_TIM_CC4_INSTANCE(TIMx) can be used to check whether or not + * input channel 4 is supported by a timer instance. + * @rmtoll CCR4 CCR4 LL_TIM_IC_GetCaptureCH4 + * @param TIMx Timer instance + * @retval CapturedValue (between Min_Data=0 and Max_Data=65535) + */ +__STATIC_INLINE uint32_t LL_TIM_IC_GetCaptureCH4(TIM_TypeDef *TIMx) +{ + return (uint32_t)(READ_REG(TIMx->CCR4)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Clock_Selection Counter clock selection + * @{ + */ +/** + * @brief Enable external clock mode 2. + * @note When external clock mode 2 is enabled the counter is clocked by any active edge on the ETRF signal. + * @note Macro @ref IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_EnableExternalClock + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableExternalClock(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->SMCR, TIM_SMCR_ECE); +} + +/** + * @brief Disable external clock mode 2. + * @note Macro @ref IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_DisableExternalClock + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableExternalClock(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, TIM_SMCR_ECE); +} + +/** + * @brief Indicate whether external clock mode 2 is enabled. + * @note Macro @ref IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR ECE LL_TIM_IsEnabledExternalClock + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledExternalClock(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SMCR, TIM_SMCR_ECE) == (TIM_SMCR_ECE)); +} + +/** + * @brief Set the clock source of the counter clock. + * @note when selected clock source is external clock mode 1, the timer input + * the external clock is applied is selected by calling the @ref LL_TIM_SetTriggerInput() + * function. This timer input must be configured by calling + * the @ref LL_TIM_IC_Config() function. + * @note Macro @ref IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode1. + * @note Macro @ref IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports external clock mode2. + * @rmtoll SMCR SMS LL_TIM_SetClockSource\n + * SMCR ECE LL_TIM_SetClockSource + * @param TIMx Timer instance + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_TIM_CLOCKSOURCE_INTERNAL + * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE1 + * @arg @ref LL_TIM_CLOCKSOURCE_EXT_MODE2 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetClockSource(TIM_TypeDef *TIMx, uint32_t ClockSource) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS | TIM_SMCR_ECE, ClockSource); +} + +/** + * @brief Set the encoder interface mode. + * @note Macro @ref IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx) can be used to check + * whether or not a timer instance supports the encoder mode. + * @rmtoll SMCR SMS LL_TIM_SetEncoderMode + * @param TIMx Timer instance + * @param EncoderMode This parameter can be one of the following values: + * @arg @ref LL_TIM_ENCODERMODE_X2_TI1 + * @arg @ref LL_TIM_ENCODERMODE_X2_TI2 + * @arg @ref LL_TIM_ENCODERMODE_X4_TI12 + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetEncoderMode(TIM_TypeDef *TIMx, uint32_t EncoderMode) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, EncoderMode); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Timer_Synchronization Timer synchronisation configuration + * @{ + */ +/** + * @brief Set the trigger output (TRGO) used for timer synchronization . + * @note Macro @ref IS_TIM_MASTER_INSTANCE(TIMx) can be used to check + * whether or not a timer instance can operate as a master timer. + * @rmtoll CR2 MMS LL_TIM_SetTriggerOutput + * @param TIMx Timer instance + * @param TimerSynchronization This parameter can be one of the following values: + * @arg @ref LL_TIM_TRGO_RESET + * @arg @ref LL_TIM_TRGO_ENABLE + * @arg @ref LL_TIM_TRGO_UPDATE + * @arg @ref LL_TIM_TRGO_CC1IF + * @arg @ref LL_TIM_TRGO_OC1REF + * @arg @ref LL_TIM_TRGO_OC2REF + * @arg @ref LL_TIM_TRGO_OC3REF + * @arg @ref LL_TIM_TRGO_OC4REF + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetTriggerOutput(TIM_TypeDef *TIMx, uint32_t TimerSynchronization) +{ + MODIFY_REG(TIMx->CR2, TIM_CR2_MMS, TimerSynchronization); +} + +/** + * @brief Set the synchronization mode of a slave timer. + * @note Macro @ref IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR SMS LL_TIM_SetSlaveMode + * @param TIMx Timer instance + * @param SlaveMode This parameter can be one of the following values: + * @arg @ref LL_TIM_SLAVEMODE_DISABLED + * @arg @ref LL_TIM_SLAVEMODE_RESET + * @arg @ref LL_TIM_SLAVEMODE_GATED + * @arg @ref LL_TIM_SLAVEMODE_TRIGGER + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetSlaveMode(TIM_TypeDef *TIMx, uint32_t SlaveMode) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_SMS, SlaveMode); +} + +/** + * @brief Set the selects the trigger input to be used to synchronize the counter. + * @note Macro @ref IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR TS LL_TIM_SetTriggerInput + * @param TIMx Timer instance + * @param TriggerInput This parameter can be one of the following values: + * @arg @ref LL_TIM_TS_ITR0 + * @arg @ref LL_TIM_TS_ITR1 + * @arg @ref LL_TIM_TS_ITR2 + * @arg @ref LL_TIM_TS_ITR3 + * @arg @ref LL_TIM_TS_TI1F_ED + * @arg @ref LL_TIM_TS_TI1FP1 + * @arg @ref LL_TIM_TS_TI2FP2 + * @arg @ref LL_TIM_TS_ETRF + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetTriggerInput(TIM_TypeDef *TIMx, uint32_t TriggerInput) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_TS, TriggerInput); +} + +/** + * @brief Enable the Master/Slave mode. + * @note Macro @ref IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_EnableMasterSlaveMode + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableMasterSlaveMode(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->SMCR, TIM_SMCR_MSM); +} + +/** + * @brief Disable the Master/Slave mode. + * @note Macro @ref IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_DisableMasterSlaveMode + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableMasterSlaveMode(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, TIM_SMCR_MSM); +} + +/** + * @brief Indicates whether the Master/Slave mode is enabled. + * @note Macro @ref IS_TIM_SLAVE_INSTANCE(TIMx) can be used to check whether or not + * a timer instance can operate as a slave timer. + * @rmtoll SMCR MSM LL_TIM_IsEnabledMasterSlaveMode + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledMasterSlaveMode(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SMCR, TIM_SMCR_MSM) == (TIM_SMCR_MSM)); +} + +/** + * @brief Configure the external trigger (ETR) input. + * @note Macro @ref IS_TIM_ETR_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides an external trigger input. + * @rmtoll SMCR ETP LL_TIM_ConfigETR\n + * SMCR ETPS LL_TIM_ConfigETR\n + * SMCR ETF LL_TIM_ConfigETR + * @param TIMx Timer instance + * @param ETRPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_POLARITY_NONINVERTED + * @arg @ref LL_TIM_ETR_POLARITY_INVERTED + * @param ETRPrescaler This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_PRESCALER_DIV1 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV2 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV4 + * @arg @ref LL_TIM_ETR_PRESCALER_DIV8 + * @param ETRFilter This parameter can be one of the following values: + * @arg @ref LL_TIM_ETR_FILTER_FDIV1 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N2 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N4 + * @arg @ref LL_TIM_ETR_FILTER_FDIV1_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV2_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV4_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV8_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N5 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV16_N8 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N5 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N6 + * @arg @ref LL_TIM_ETR_FILTER_FDIV32_N8 + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigETR(TIM_TypeDef *TIMx, uint32_t ETRPolarity, uint32_t ETRPrescaler, + uint32_t ETRFilter) +{ + MODIFY_REG(TIMx->SMCR, TIM_SMCR_ETP | TIM_SMCR_ETPS | TIM_SMCR_ETF, ETRPolarity | ETRPrescaler | ETRFilter); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Break_Function Break function configuration + * @{ + */ +/** + * @brief Enable the break function. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR BKE LL_TIM_EnableBRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableBRK(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->BDTR, TIM_BDTR_BKE); +} + +/** + * @brief Disable the break function. + * @rmtoll BDTR BKE LL_TIM_DisableBRK + * @param TIMx Timer instance + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableBRK(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_BKE); +} + +/** + * @brief Configure the break input. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR BKP LL_TIM_ConfigBRK + * @param TIMx Timer instance + * @param BreakPolarity This parameter can be one of the following values: + * @arg @ref LL_TIM_BREAK_POLARITY_LOW + * @arg @ref LL_TIM_BREAK_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigBRK(TIM_TypeDef *TIMx, uint32_t BreakPolarity) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_BKP, BreakPolarity); +} + +/** + * @brief Select the outputs off state (enabled v.s. disabled) in Idle and Run modes. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR OSSI LL_TIM_SetOffStates\n + * BDTR OSSR LL_TIM_SetOffStates + * @param TIMx Timer instance + * @param OffStateIdle This parameter can be one of the following values: + * @arg @ref LL_TIM_OSSI_DISABLE + * @arg @ref LL_TIM_OSSI_ENABLE + * @param OffStateRun This parameter can be one of the following values: + * @arg @ref LL_TIM_OSSR_DISABLE + * @arg @ref LL_TIM_OSSR_ENABLE + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetOffStates(TIM_TypeDef *TIMx, uint32_t OffStateIdle, uint32_t OffStateRun) +{ + MODIFY_REG(TIMx->BDTR, TIM_BDTR_OSSI | TIM_BDTR_OSSR, OffStateIdle | OffStateRun); +} + +/** + * @brief Enable automatic output (MOE can be set by software or automatically when a break input is active). + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_EnableAutomaticOutput + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableAutomaticOutput(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->BDTR, TIM_BDTR_AOE); +} + +/** + * @brief Disable automatic output (MOE can be set only by software). + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_DisableAutomaticOutput + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableAutomaticOutput(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_AOE); +} + +/** + * @brief Indicate whether automatic output is enabled. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR AOE LL_TIM_IsEnabledAutomaticOutput + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledAutomaticOutput(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->BDTR, TIM_BDTR_AOE) == (TIM_BDTR_AOE)); +} + +/** + * @brief Enable the outputs (set the MOE bit in TIMx_BDTR register). + * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by + * software and is reset in case of break or break2 event + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_EnableAllOutputs + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableAllOutputs(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->BDTR, TIM_BDTR_MOE); +} + +/** + * @brief Disable the outputs (reset the MOE bit in TIMx_BDTR register). + * @note The MOE bit in TIMx_BDTR register allows to enable /disable the outputs by + * software and is reset in case of break or break2 event. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_DisableAllOutputs + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableAllOutputs(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, TIM_BDTR_MOE); +} + +/** + * @brief Indicates whether outputs are enabled. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @rmtoll BDTR MOE LL_TIM_IsEnabledAllOutputs + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledAllOutputs(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->BDTR, TIM_BDTR_MOE) == (TIM_BDTR_MOE)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_DMA_Burst_Mode DMA burst mode configuration + * @{ + */ +/** + * @brief Configures the timer DMA burst feature. + * @note Macro @ref IS_TIM_DMABURST_INSTANCE(TIMx) can be used to check whether or + * not a timer instance supports the DMA burst mode. + * @rmtoll DCR DBL LL_TIM_ConfigDMABurst\n + * DCR DBA LL_TIM_ConfigDMABurst + * @param TIMx Timer instance + * @param DMABurstBaseAddress This parameter can be one of the following values: + * @arg @ref LL_TIM_DMABURST_BASEADDR_CR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_SMCR + * @arg @ref LL_TIM_DMABURST_BASEADDR_DIER + * @arg @ref LL_TIM_DMABURST_BASEADDR_SR + * @arg @ref LL_TIM_DMABURST_BASEADDR_EGR + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCMR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCER + * @arg @ref LL_TIM_DMABURST_BASEADDR_CNT + * @arg @ref LL_TIM_DMABURST_BASEADDR_PSC + * @arg @ref LL_TIM_DMABURST_BASEADDR_ARR + * @arg @ref LL_TIM_DMABURST_BASEADDR_RCR + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR1 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR2 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR3 + * @arg @ref LL_TIM_DMABURST_BASEADDR_CCR4 + * @arg @ref LL_TIM_DMABURST_BASEADDR_BDTR + * @arg @ref LL_TIM_DMABURST_BASEADDR_OR + * @param DMABurstLength This parameter can be one of the following values: + * @arg @ref LL_TIM_DMABURST_LENGTH_1TRANSFER + * @arg @ref LL_TIM_DMABURST_LENGTH_2TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_3TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_4TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_5TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_6TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_7TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_8TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_9TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_10TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_11TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_12TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_13TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_14TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_15TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_16TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_17TRANSFERS + * @arg @ref LL_TIM_DMABURST_LENGTH_18TRANSFERS + * @retval None + */ +__STATIC_INLINE void LL_TIM_ConfigDMABurst(TIM_TypeDef *TIMx, uint32_t DMABurstBaseAddress, uint32_t DMABurstLength) +{ + MODIFY_REG(TIMx->DCR, TIM_DCR_DBL | TIM_DCR_DBA, DMABurstBaseAddress | DMABurstLength); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_Timer_Inputs_Remapping Timer input remapping + * @{ + */ +/** + * @brief Remap TIM inputs (input channel, internal/external triggers). + * @note Macro @ref IS_TIM_REMAP_INSTANCE(TIMx) can be used to check whether or not + * a some timer inputs can be remapped. + * @rmtoll TIM2_OR ITR1_RMP LL_TIM_SetRemap\n + * TIM5_OR TI4_RMP LL_TIM_SetRemap\n + * TIM11_OR TI1_RMP LL_TIM_SetRemap + * @param TIMx Timer instance + * @param Remap Remap param depends on the TIMx. Description available only + * in CHM version of the User Manual (not in .pdf). + * Otherwise see Reference Manual description of OR registers. + * + * Below description summarizes "Timer Instance" and "Remap" param combinations: + * + * TIM2: one of the following values + * + * ITR1_RMP can be one of the following values + * @arg @ref LL_TIM_TIM2_ITR1_RMP_TIM8_TRGO + * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_FS_SOF + * @arg @ref LL_TIM_TIM2_ITR1_RMP_OTG_HS_SOF + * + * TIM5: one of the following values + * + * @arg @ref LL_TIM_TIM5_TI4_RMP_GPIO + * @arg @ref LL_TIM_TIM5_TI4_RMP_LSI + * @arg @ref LL_TIM_TIM5_TI4_RMP_LSE + * @arg @ref LL_TIM_TIM5_TI4_RMP_RTC + * + * TIM11: one of the following values + * + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO1 + * @arg @ref LL_TIM_TIM11_TI1_RMP_HSE_RTC + * @arg @ref LL_TIM_TIM11_TI1_RMP_GPIO2 + * + * @retval None + */ +__STATIC_INLINE void LL_TIM_SetRemap(TIM_TypeDef *TIMx, uint32_t Remap) +{ + MODIFY_REG(TIMx->OR, (Remap >> TIMx_OR_RMP_SHIFT), (Remap & TIMx_OR_RMP_MASK)); +} + +/** + * @} + */ + + +/** @defgroup TIM_LL_EF_FLAG_Management FLAG-Management + * @{ + */ +/** + * @brief Clear the update interrupt flag (UIF). + * @rmtoll SR UIF LL_TIM_ClearFlag_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_UPDATE(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_UIF)); +} + +/** + * @brief Indicate whether update interrupt flag (UIF) is set (update interrupt is pending). + * @rmtoll SR UIF LL_TIM_IsActiveFlag_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_UPDATE(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_UIF) == (TIM_SR_UIF)); +} + +/** + * @brief Clear the Capture/Compare 1 interrupt flag (CC1F). + * @rmtoll SR CC1IF LL_TIM_ClearFlag_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC1(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC1IF)); +} + +/** + * @brief Indicate whether Capture/Compare 1 interrupt flag (CC1F) is set (Capture/Compare 1 interrupt is pending). + * @rmtoll SR CC1IF LL_TIM_IsActiveFlag_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC1IF) == (TIM_SR_CC1IF)); +} + +/** + * @brief Clear the Capture/Compare 2 interrupt flag (CC2F). + * @rmtoll SR CC2IF LL_TIM_ClearFlag_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC2(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC2IF)); +} + +/** + * @brief Indicate whether Capture/Compare 2 interrupt flag (CC2F) is set (Capture/Compare 2 interrupt is pending). + * @rmtoll SR CC2IF LL_TIM_IsActiveFlag_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC2IF) == (TIM_SR_CC2IF)); +} + +/** + * @brief Clear the Capture/Compare 3 interrupt flag (CC3F). + * @rmtoll SR CC3IF LL_TIM_ClearFlag_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC3(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC3IF)); +} + +/** + * @brief Indicate whether Capture/Compare 3 interrupt flag (CC3F) is set (Capture/Compare 3 interrupt is pending). + * @rmtoll SR CC3IF LL_TIM_IsActiveFlag_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC3IF) == (TIM_SR_CC3IF)); +} + +/** + * @brief Clear the Capture/Compare 4 interrupt flag (CC4F). + * @rmtoll SR CC4IF LL_TIM_ClearFlag_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC4(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC4IF)); +} + +/** + * @brief Indicate whether Capture/Compare 4 interrupt flag (CC4F) is set (Capture/Compare 4 interrupt is pending). + * @rmtoll SR CC4IF LL_TIM_IsActiveFlag_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC4IF) == (TIM_SR_CC4IF)); +} + +/** + * @brief Clear the commutation interrupt flag (COMIF). + * @rmtoll SR COMIF LL_TIM_ClearFlag_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_COM(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_COMIF)); +} + +/** + * @brief Indicate whether commutation interrupt flag (COMIF) is set (commutation interrupt is pending). + * @rmtoll SR COMIF LL_TIM_IsActiveFlag_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_COM(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_COMIF) == (TIM_SR_COMIF)); +} + +/** + * @brief Clear the trigger interrupt flag (TIF). + * @rmtoll SR TIF LL_TIM_ClearFlag_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_TRIG(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_TIF)); +} + +/** + * @brief Indicate whether trigger interrupt flag (TIF) is set (trigger interrupt is pending). + * @rmtoll SR TIF LL_TIM_IsActiveFlag_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_TRIG(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_TIF) == (TIM_SR_TIF)); +} + +/** + * @brief Clear the break interrupt flag (BIF). + * @rmtoll SR BIF LL_TIM_ClearFlag_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_BRK(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_BIF)); +} + +/** + * @brief Indicate whether break interrupt flag (BIF) is set (break interrupt is pending). + * @rmtoll SR BIF LL_TIM_IsActiveFlag_BRK + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_BRK(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_BIF) == (TIM_SR_BIF)); +} + +/** + * @brief Clear the Capture/Compare 1 over-capture interrupt flag (CC1OF). + * @rmtoll SR CC1OF LL_TIM_ClearFlag_CC1OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC1OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC1OF)); +} + +/** + * @brief Indicate whether Capture/Compare 1 over-capture interrupt flag (CC1OF) is set (Capture/Compare 1 interrupt is pending). + * @rmtoll SR CC1OF LL_TIM_IsActiveFlag_CC1OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC1OVR(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC1OF) == (TIM_SR_CC1OF)); +} + +/** + * @brief Clear the Capture/Compare 2 over-capture interrupt flag (CC2OF). + * @rmtoll SR CC2OF LL_TIM_ClearFlag_CC2OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC2OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC2OF)); +} + +/** + * @brief Indicate whether Capture/Compare 2 over-capture interrupt flag (CC2OF) is set (Capture/Compare 2 over-capture interrupt is pending). + * @rmtoll SR CC2OF LL_TIM_IsActiveFlag_CC2OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC2OVR(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC2OF) == (TIM_SR_CC2OF)); +} + +/** + * @brief Clear the Capture/Compare 3 over-capture interrupt flag (CC3OF). + * @rmtoll SR CC3OF LL_TIM_ClearFlag_CC3OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC3OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC3OF)); +} + +/** + * @brief Indicate whether Capture/Compare 3 over-capture interrupt flag (CC3OF) is set (Capture/Compare 3 over-capture interrupt is pending). + * @rmtoll SR CC3OF LL_TIM_IsActiveFlag_CC3OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC3OVR(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC3OF) == (TIM_SR_CC3OF)); +} + +/** + * @brief Clear the Capture/Compare 4 over-capture interrupt flag (CC4OF). + * @rmtoll SR CC4OF LL_TIM_ClearFlag_CC4OVR + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_ClearFlag_CC4OVR(TIM_TypeDef *TIMx) +{ + WRITE_REG(TIMx->SR, ~(TIM_SR_CC4OF)); +} + +/** + * @brief Indicate whether Capture/Compare 4 over-capture interrupt flag (CC4OF) is set (Capture/Compare 4 over-capture interrupt is pending). + * @rmtoll SR CC4OF LL_TIM_IsActiveFlag_CC4OVR + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsActiveFlag_CC4OVR(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->SR, TIM_SR_CC4OF) == (TIM_SR_CC4OF)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_IT_Management IT-Management + * @{ + */ +/** + * @brief Enable update interrupt (UIE). + * @rmtoll DIER UIE LL_TIM_EnableIT_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_UIE); +} + +/** + * @brief Disable update interrupt (UIE). + * @rmtoll DIER UIE LL_TIM_DisableIT_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_UPDATE(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_UIE); +} + +/** + * @brief Indicates whether the update interrupt (UIE) is enabled. + * @rmtoll DIER UIE LL_TIM_IsEnabledIT_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_UPDATE(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_UIE) == (TIM_DIER_UIE)); +} + +/** + * @brief Enable capture/compare 1 interrupt (CC1IE). + * @rmtoll DIER CC1IE LL_TIM_EnableIT_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC1IE); +} + +/** + * @brief Disable capture/compare 1 interrupt (CC1IE). + * @rmtoll DIER CC1IE LL_TIM_DisableIT_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC1(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1IE); +} + +/** + * @brief Indicates whether the capture/compare 1 interrupt (CC1IE) is enabled. + * @rmtoll DIER CC1IE LL_TIM_IsEnabledIT_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC1(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC1IE) == (TIM_DIER_CC1IE)); +} + +/** + * @brief Enable capture/compare 2 interrupt (CC2IE). + * @rmtoll DIER CC2IE LL_TIM_EnableIT_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC2IE); +} + +/** + * @brief Disable capture/compare 2 interrupt (CC2IE). + * @rmtoll DIER CC2IE LL_TIM_DisableIT_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC2(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2IE); +} + +/** + * @brief Indicates whether the capture/compare 2 interrupt (CC2IE) is enabled. + * @rmtoll DIER CC2IE LL_TIM_IsEnabledIT_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC2(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC2IE) == (TIM_DIER_CC2IE)); +} + +/** + * @brief Enable capture/compare 3 interrupt (CC3IE). + * @rmtoll DIER CC3IE LL_TIM_EnableIT_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC3IE); +} + +/** + * @brief Disable capture/compare 3 interrupt (CC3IE). + * @rmtoll DIER CC3IE LL_TIM_DisableIT_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC3(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3IE); +} + +/** + * @brief Indicates whether the capture/compare 3 interrupt (CC3IE) is enabled. + * @rmtoll DIER CC3IE LL_TIM_IsEnabledIT_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC3(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC3IE) == (TIM_DIER_CC3IE)); +} + +/** + * @brief Enable capture/compare 4 interrupt (CC4IE). + * @rmtoll DIER CC4IE LL_TIM_EnableIT_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC4IE); +} + +/** + * @brief Disable capture/compare 4 interrupt (CC4IE). + * @rmtoll DIER CC4IE LL_TIM_DisableIT_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_CC4(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4IE); +} + +/** + * @brief Indicates whether the capture/compare 4 interrupt (CC4IE) is enabled. + * @rmtoll DIER CC4IE LL_TIM_IsEnabledIT_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_CC4(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC4IE) == (TIM_DIER_CC4IE)); +} + +/** + * @brief Enable commutation interrupt (COMIE). + * @rmtoll DIER COMIE LL_TIM_EnableIT_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_COMIE); +} + +/** + * @brief Disable commutation interrupt (COMIE). + * @rmtoll DIER COMIE LL_TIM_DisableIT_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_COM(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_COMIE); +} + +/** + * @brief Indicates whether the commutation interrupt (COMIE) is enabled. + * @rmtoll DIER COMIE LL_TIM_IsEnabledIT_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_COM(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_COMIE) == (TIM_DIER_COMIE)); +} + +/** + * @brief Enable trigger interrupt (TIE). + * @rmtoll DIER TIE LL_TIM_EnableIT_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_TIE); +} + +/** + * @brief Disable trigger interrupt (TIE). + * @rmtoll DIER TIE LL_TIM_DisableIT_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_TRIG(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_TIE); +} + +/** + * @brief Indicates whether the trigger interrupt (TIE) is enabled. + * @rmtoll DIER TIE LL_TIM_IsEnabledIT_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_TRIG(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_TIE) == (TIM_DIER_TIE)); +} + +/** + * @brief Enable break interrupt (BIE). + * @rmtoll DIER BIE LL_TIM_EnableIT_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableIT_BRK(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_BIE); +} + +/** + * @brief Disable break interrupt (BIE). + * @rmtoll DIER BIE LL_TIM_DisableIT_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableIT_BRK(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_BIE); +} + +/** + * @brief Indicates whether the break interrupt (BIE) is enabled. + * @rmtoll DIER BIE LL_TIM_IsEnabledIT_BRK + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledIT_BRK(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_BIE) == (TIM_DIER_BIE)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_DMA_Management DMA-Management + * @{ + */ +/** + * @brief Enable update DMA request (UDE). + * @rmtoll DIER UDE LL_TIM_EnableDMAReq_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_UDE); +} + +/** + * @brief Disable update DMA request (UDE). + * @rmtoll DIER UDE LL_TIM_DisableDMAReq_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_UPDATE(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_UDE); +} + +/** + * @brief Indicates whether the update DMA request (UDE) is enabled. + * @rmtoll DIER UDE LL_TIM_IsEnabledDMAReq_UPDATE + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_UPDATE(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_UDE) == (TIM_DIER_UDE)); +} + +/** + * @brief Enable capture/compare 1 DMA request (CC1DE). + * @rmtoll DIER CC1DE LL_TIM_EnableDMAReq_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC1DE); +} + +/** + * @brief Disable capture/compare 1 DMA request (CC1DE). + * @rmtoll DIER CC1DE LL_TIM_DisableDMAReq_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC1(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC1DE); +} + +/** + * @brief Indicates whether the capture/compare 1 DMA request (CC1DE) is enabled. + * @rmtoll DIER CC1DE LL_TIM_IsEnabledDMAReq_CC1 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC1(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC1DE) == (TIM_DIER_CC1DE)); +} + +/** + * @brief Enable capture/compare 2 DMA request (CC2DE). + * @rmtoll DIER CC2DE LL_TIM_EnableDMAReq_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC2DE); +} + +/** + * @brief Disable capture/compare 2 DMA request (CC2DE). + * @rmtoll DIER CC2DE LL_TIM_DisableDMAReq_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC2(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC2DE); +} + +/** + * @brief Indicates whether the capture/compare 2 DMA request (CC2DE) is enabled. + * @rmtoll DIER CC2DE LL_TIM_IsEnabledDMAReq_CC2 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC2(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC2DE) == (TIM_DIER_CC2DE)); +} + +/** + * @brief Enable capture/compare 3 DMA request (CC3DE). + * @rmtoll DIER CC3DE LL_TIM_EnableDMAReq_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC3DE); +} + +/** + * @brief Disable capture/compare 3 DMA request (CC3DE). + * @rmtoll DIER CC3DE LL_TIM_DisableDMAReq_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC3(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC3DE); +} + +/** + * @brief Indicates whether the capture/compare 3 DMA request (CC3DE) is enabled. + * @rmtoll DIER CC3DE LL_TIM_IsEnabledDMAReq_CC3 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC3(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC3DE) == (TIM_DIER_CC3DE)); +} + +/** + * @brief Enable capture/compare 4 DMA request (CC4DE). + * @rmtoll DIER CC4DE LL_TIM_EnableDMAReq_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_CC4DE); +} + +/** + * @brief Disable capture/compare 4 DMA request (CC4DE). + * @rmtoll DIER CC4DE LL_TIM_DisableDMAReq_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_CC4(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_CC4DE); +} + +/** + * @brief Indicates whether the capture/compare 4 DMA request (CC4DE) is enabled. + * @rmtoll DIER CC4DE LL_TIM_IsEnabledDMAReq_CC4 + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_CC4(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_CC4DE) == (TIM_DIER_CC4DE)); +} + +/** + * @brief Enable commutation DMA request (COMDE). + * @rmtoll DIER COMDE LL_TIM_EnableDMAReq_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_COMDE); +} + +/** + * @brief Disable commutation DMA request (COMDE). + * @rmtoll DIER COMDE LL_TIM_DisableDMAReq_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_COM(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_COMDE); +} + +/** + * @brief Indicates whether the commutation DMA request (COMDE) is enabled. + * @rmtoll DIER COMDE LL_TIM_IsEnabledDMAReq_COM + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_COM(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_COMDE) == (TIM_DIER_COMDE)); +} + +/** + * @brief Enable trigger interrupt (TDE). + * @rmtoll DIER TDE LL_TIM_EnableDMAReq_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_EnableDMAReq_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->DIER, TIM_DIER_TDE); +} + +/** + * @brief Disable trigger interrupt (TDE). + * @rmtoll DIER TDE LL_TIM_DisableDMAReq_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_DisableDMAReq_TRIG(TIM_TypeDef *TIMx) +{ + CLEAR_BIT(TIMx->DIER, TIM_DIER_TDE); +} + +/** + * @brief Indicates whether the trigger interrupt (TDE) is enabled. + * @rmtoll DIER TDE LL_TIM_IsEnabledDMAReq_TRIG + * @param TIMx Timer instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_TIM_IsEnabledDMAReq_TRIG(TIM_TypeDef *TIMx) +{ + return (READ_BIT(TIMx->DIER, TIM_DIER_TDE) == (TIM_DIER_TDE)); +} + +/** + * @} + */ + +/** @defgroup TIM_LL_EF_EVENT_Management EVENT-Management + * @{ + */ +/** + * @brief Generate an update event. + * @rmtoll EGR UG LL_TIM_GenerateEvent_UPDATE + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_UPDATE(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_UG); +} + +/** + * @brief Generate Capture/Compare 1 event. + * @rmtoll EGR CC1G LL_TIM_GenerateEvent_CC1 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC1(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC1G); +} + +/** + * @brief Generate Capture/Compare 2 event. + * @rmtoll EGR CC2G LL_TIM_GenerateEvent_CC2 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC2(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC2G); +} + +/** + * @brief Generate Capture/Compare 3 event. + * @rmtoll EGR CC3G LL_TIM_GenerateEvent_CC3 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC3(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC3G); +} + +/** + * @brief Generate Capture/Compare 4 event. + * @rmtoll EGR CC4G LL_TIM_GenerateEvent_CC4 + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_CC4(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_CC4G); +} + +/** + * @brief Generate commutation event. + * @rmtoll EGR COMG LL_TIM_GenerateEvent_COM + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_COM(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_COMG); +} + +/** + * @brief Generate trigger event. + * @rmtoll EGR TG LL_TIM_GenerateEvent_TRIG + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_TRIG(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_TG); +} + +/** + * @brief Generate break event. + * @rmtoll EGR BG LL_TIM_GenerateEvent_BRK + * @param TIMx Timer instance + * @retval None + */ +__STATIC_INLINE void LL_TIM_GenerateEvent_BRK(TIM_TypeDef *TIMx) +{ + SET_BIT(TIMx->EGR, TIM_EGR_BG); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup TIM_LL_EF_Init Initialisation and deinitialisation functions + * @{ + */ + +ErrorStatus LL_TIM_DeInit(TIM_TypeDef *TIMx); +void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct); +ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, LL_TIM_InitTypeDef *TIM_InitStruct); +void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); +ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct); +void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct); +void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); +ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct); +void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); +ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct); +void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); +ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM5 || TIM6 || TIM7 || TIM8 || TIM9 || TIM10 || TIM11 || TIM12 || TIM13 || TIM14 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_TIM_H */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h new file mode 100644 index 0000000..ed6c4a8 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h @@ -0,0 +1,2539 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_usart.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of USART LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_USART_H +#define __STM32F4xx_LL_USART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART6) || defined (UART4) || defined (UART5) || defined (UART7) || defined (UART8) || defined (UART9) || defined (UART10) + +/** @defgroup USART_LL USART + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup USART_LL_Private_Constants USART Private Constants + * @{ + */ + +/* Defines used for the bit position in the register and perform offsets*/ +#define USART_POSITION_GTPR_GT USART_GTPR_GT_Pos +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_Private_Macros USART Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_ES_INIT USART Exported Init structures + * @{ + */ + +/** + * @brief LL USART Init Structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This field defines expected Usart communication baud rate. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetBaudRate().*/ + + uint32_t DataWidth; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_LL_EC_DATAWIDTH. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetDataWidth().*/ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_LL_EC_STOPBITS. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetStopBitsLength().*/ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_LL_EC_PARITY. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetParity().*/ + + uint32_t TransferDirection; /*!< Specifies whether the Receive and/or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_DIRECTION. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetTransferDirection().*/ + + uint32_t HardwareFlowControl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_HWCONTROL. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetHWFlowCtrl().*/ + + uint32_t OverSampling; /*!< Specifies whether USART oversampling mode is 16 or 8. + This parameter can be a value of @ref USART_LL_EC_OVERSAMPLING. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetOverSampling().*/ + +} LL_USART_InitTypeDef; + +/** + * @brief LL USART Clock Init Structure definition + */ +typedef struct +{ + uint32_t ClockOutput; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_CLOCK. + + USART HW configuration can be modified afterwards using unitary functions + @ref LL_USART_EnableSCLKOutput() or @ref LL_USART_DisableSCLKOutput(). + For more details, refer to description of this function. */ + + uint32_t ClockPolarity; /*!< Specifies the steady state of the serial clock. + This parameter can be a value of @ref USART_LL_EC_POLARITY. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPolarity(). + For more details, refer to description of this function. */ + + uint32_t ClockPhase; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_LL_EC_PHASE. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPhase(). + For more details, refer to description of this function. */ + + uint32_t LastBitClockPulse; /*!< Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_LL_EC_LASTCLKPULSE. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetLastClkPulseOutput(). + For more details, refer to description of this function. */ + +} LL_USART_ClockInitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup USART_LL_Exported_Constants USART Exported Constants + * @{ + */ + +/** @defgroup USART_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_USART_ReadReg function + * @{ + */ +#define LL_USART_SR_PE USART_SR_PE /*!< Parity error flag */ +#define LL_USART_SR_FE USART_SR_FE /*!< Framing error flag */ +#define LL_USART_SR_NE USART_SR_NE /*!< Noise detected flag */ +#define LL_USART_SR_ORE USART_SR_ORE /*!< Overrun error flag */ +#define LL_USART_SR_IDLE USART_SR_IDLE /*!< Idle line detected flag */ +#define LL_USART_SR_RXNE USART_SR_RXNE /*!< Read data register not empty flag */ +#define LL_USART_SR_TC USART_SR_TC /*!< Transmission complete flag */ +#define LL_USART_SR_TXE USART_SR_TXE /*!< Transmit data register empty flag */ +#define LL_USART_SR_LBD USART_SR_LBD /*!< LIN break detection flag */ +#define LL_USART_SR_CTS USART_SR_CTS /*!< CTS flag */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_USART_ReadReg and LL_USART_WriteReg functions + * @{ + */ +#define LL_USART_CR1_IDLEIE USART_CR1_IDLEIE /*!< IDLE interrupt enable */ +#define LL_USART_CR1_RXNEIE USART_CR1_RXNEIE /*!< Read data register not empty interrupt enable */ +#define LL_USART_CR1_TCIE USART_CR1_TCIE /*!< Transmission complete interrupt enable */ +#define LL_USART_CR1_TXEIE USART_CR1_TXEIE /*!< Transmit data register empty interrupt enable */ +#define LL_USART_CR1_PEIE USART_CR1_PEIE /*!< Parity error */ +#define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ +#define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ +#define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_DIRECTION Communication Direction + * @{ + */ +#define LL_USART_DIRECTION_NONE 0x00000000U /*!< Transmitter and Receiver are disabled */ +#define LL_USART_DIRECTION_RX USART_CR1_RE /*!< Transmitter is disabled and Receiver is enabled */ +#define LL_USART_DIRECTION_TX USART_CR1_TE /*!< Transmitter is enabled and Receiver is disabled */ +#define LL_USART_DIRECTION_TX_RX (USART_CR1_TE |USART_CR1_RE) /*!< Transmitter and Receiver are enabled */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_PARITY Parity Control + * @{ + */ +#define LL_USART_PARITY_NONE 0x00000000U /*!< Parity control disabled */ +#define LL_USART_PARITY_EVEN USART_CR1_PCE /*!< Parity control enabled and Even Parity is selected */ +#define LL_USART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS) /*!< Parity control enabled and Odd Parity is selected */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_WAKEUP Wakeup + * @{ + */ +#define LL_USART_WAKEUP_IDLELINE 0x00000000U /*!< USART wake up from Mute mode on Idle Line */ +#define LL_USART_WAKEUP_ADDRESSMARK USART_CR1_WAKE /*!< USART wake up from Mute mode on Address Mark */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_DATAWIDTH Datawidth + * @{ + */ +#define LL_USART_DATAWIDTH_8B 0x00000000U /*!< 8 bits word length : Start bit, 8 data bits, n stop bits */ +#define LL_USART_DATAWIDTH_9B USART_CR1_M /*!< 9 bits word length : Start bit, 9 data bits, n stop bits */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_OVERSAMPLING Oversampling + * @{ + */ +#define LL_USART_OVERSAMPLING_16 0x00000000U /*!< Oversampling by 16 */ +#define LL_USART_OVERSAMPLING_8 USART_CR1_OVER8 /*!< Oversampling by 8 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_EC_CLOCK Clock Signal + * @{ + */ + +#define LL_USART_CLOCK_DISABLE 0x00000000U /*!< Clock signal not provided */ +#define LL_USART_CLOCK_ENABLE USART_CR2_CLKEN /*!< Clock signal provided */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/** @defgroup USART_LL_EC_LASTCLKPULSE Last Clock Pulse + * @{ + */ +#define LL_USART_LASTCLKPULSE_NO_OUTPUT 0x00000000U /*!< The clock pulse of the last data bit is not output to the SCLK pin */ +#define LL_USART_LASTCLKPULSE_OUTPUT USART_CR2_LBCL /*!< The clock pulse of the last data bit is output to the SCLK pin */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_PHASE Clock Phase + * @{ + */ +#define LL_USART_PHASE_1EDGE 0x00000000U /*!< The first clock transition is the first data capture edge */ +#define LL_USART_PHASE_2EDGE USART_CR2_CPHA /*!< The second clock transition is the first data capture edge */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_USART_POLARITY_LOW 0x00000000U /*!< Steady low value on SCLK pin outside transmission window*/ +#define LL_USART_POLARITY_HIGH USART_CR2_CPOL /*!< Steady high value on SCLK pin outside transmission window */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_STOPBITS Stop Bits + * @{ + */ +#define LL_USART_STOPBITS_0_5 USART_CR2_STOP_0 /*!< 0.5 stop bit */ +#define LL_USART_STOPBITS_1 0x00000000U /*!< 1 stop bit */ +#define LL_USART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< 1.5 stop bits */ +#define LL_USART_STOPBITS_2 USART_CR2_STOP_1 /*!< 2 stop bits */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_HWCONTROL Hardware Control + * @{ + */ +#define LL_USART_HWCONTROL_NONE 0x00000000U /*!< CTS and RTS hardware flow control disabled */ +#define LL_USART_HWCONTROL_RTS USART_CR3_RTSE /*!< RTS output enabled, data is only requested when there is space in the receive buffer */ +#define LL_USART_HWCONTROL_CTS USART_CR3_CTSE /*!< CTS mode enabled, data is only transmitted when the nCTS input is asserted (tied to 0) */ +#define LL_USART_HWCONTROL_RTS_CTS (USART_CR3_RTSE | USART_CR3_CTSE) /*!< CTS and RTS hardware flow control enabled */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_IRDA_POWER IrDA Power + * @{ + */ +#define LL_USART_IRDA_POWER_NORMAL 0x00000000U /*!< IrDA normal power mode */ +#define LL_USART_IRDA_POWER_LOW USART_CR3_IRLP /*!< IrDA low power mode */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_LINBREAK_DETECT LIN Break Detection Length + * @{ + */ +#define LL_USART_LINBREAK_DETECT_10B 0x00000000U /*!< 10-bit break detection method selected */ +#define LL_USART_LINBREAK_DETECT_11B USART_CR2_LBDL /*!< 11-bit break detection method selected */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup USART_LL_Exported_Macros USART Exported Macros + * @{ + */ + +/** @defgroup USART_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in USART register + * @param __INSTANCE__ USART Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_USART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in USART register + * @param __INSTANCE__ USART Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_USART_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup USART_LL_EM_Exported_Macros_Helper Exported_Macros_Helper + * @{ + */ + +/** + * @brief Compute USARTDIV value according to Peripheral Clock and + * expected Baud Rate in 8 bits sampling mode (32 bits value of USARTDIV is returned) + * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance + * @param __BAUDRATE__ Baud rate value to achieve + * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case + */ +#define __LL_USART_DIV_SAMPLING8_100(__PERIPHCLK__, __BAUDRATE__) (((__PERIPHCLK__)*25)/(2*(__BAUDRATE__))) +#define __LL_USART_DIVMANT_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__))/100) +#define __LL_USART_DIVFRAQ_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 8 + 50) / 100) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07) */ +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ + ((__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0xF8) << 1)) + \ + (__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0x07)) + +/** + * @brief Compute USARTDIV value according to Peripheral Clock and + * expected Baud Rate in 16 bits sampling mode (32 bits value of USARTDIV is returned) + * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance + * @param __BAUDRATE__ Baud rate value to achieve + * @retval USARTDIV value to be used for BRR register filling in OverSampling_16 case + */ +#define __LL_USART_DIV_SAMPLING16_100(__PERIPHCLK__, __BAUDRATE__) (((__PERIPHCLK__)*25)/(4*(__BAUDRATE__))) +#define __LL_USART_DIVMANT_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__))/100) +#define __LL_USART_DIVFRAQ_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 16 + 50) / 100) +/* USART BRR = mantissa + overflow + fraction + = (USART DIVMANT << 4) + (USART DIVFRAQ & 0xF0) + (USART DIVFRAQ & 0x0F) */ +#define __LL_USART_DIV_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ + (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0xF0)) + \ + (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0x0F)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup USART_LL_Exported_Functions USART Exported Functions + * @{ + */ + +/** @defgroup USART_LL_EF_Configuration Configuration functions + * @{ + */ + +/** + * @brief USART Enable + * @rmtoll CR1 UE LL_USART_Enable + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UE); +} + +/** + * @brief USART Disable (all USART prescalers and outputs are disabled) + * @note When USART is disabled, USART prescalers and outputs are stopped immediately, + * and current operations are discarded. The configuration of the USART is kept, but all the status + * flags, in the USARTx_SR are set to their default values. + * @rmtoll CR1 UE LL_USART_Disable + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_Disable(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UE); +} + +/** + * @brief Indicate if USART is enabled + * @rmtoll CR1 UE LL_USART_IsEnabled + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)); +} + +/** + * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) + * @rmtoll CR1 RE LL_USART_EnableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionRx(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Receiver Disable + * @rmtoll CR1 RE LL_USART_DisableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionRx(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Transmitter Enable + * @rmtoll CR1 TE LL_USART_EnableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionTx(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Transmitter Disable + * @rmtoll CR1 TE LL_USART_DisableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionTx(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Configure simultaneously enabled/disabled states + * of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_SetTransferDirection\n + * CR1 TE LL_USART_SetTransferDirection + * @param USARTx USART Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + * @retval None + */ +__STATIC_INLINE void LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_RE | USART_CR1_TE, TransferDirection); +} + +/** + * @brief Return enabled/disabled states of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_GetTransferDirection\n + * CR1 TE LL_USART_GetTransferDirection + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + */ +__STATIC_INLINE uint32_t LL_USART_GetTransferDirection(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_RE | USART_CR1_TE)); +} + +/** + * @brief Configure Parity (enabled/disabled and parity mode if enabled). + * @note This function selects if hardware parity control (generation and detection) is enabled or disabled. + * When the parity control is enabled (Odd or Even), computed parity bit is inserted at the MSB position + * (9th or 8th bit depending on data width) and parity is checked on the received data. + * @rmtoll CR1 PS LL_USART_SetParity\n + * CR1 PCE LL_USART_SetParity + * @param USARTx USART Instance + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE, Parity); +} + +/** + * @brief Return Parity configuration (enabled/disabled and parity mode if enabled) + * @rmtoll CR1 PS LL_USART_GetParity\n + * CR1 PCE LL_USART_GetParity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_USART_GetParity(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE)); +} + +/** + * @brief Set Receiver Wake Up method from Mute mode. + * @rmtoll CR1 WAKE LL_USART_SetWakeUpMethod + * @param USARTx USART Instance + * @param Method This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWakeUpMethod(USART_TypeDef *USARTx, uint32_t Method) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_WAKE, Method); +} + +/** + * @brief Return Receiver Wake Up method from Mute mode + * @rmtoll CR1 WAKE LL_USART_GetWakeUpMethod + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + */ +__STATIC_INLINE uint32_t LL_USART_GetWakeUpMethod(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_WAKE)); +} + +/** + * @brief Set Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_SetDataWidth + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_M, DataWidth); +} + +/** + * @brief Return Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_GetDataWidth + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + */ +__STATIC_INLINE uint32_t LL_USART_GetDataWidth(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_M)); +} + +/** + * @brief Set Oversampling to 8-bit or 16-bit mode + * @rmtoll CR1 OVER8 LL_USART_SetOverSampling + * @param USARTx USART Instance + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_OVER8, OverSampling); +} + +/** + * @brief Return Oversampling mode + * @rmtoll CR1 OVER8 LL_USART_GetOverSampling + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + */ +__STATIC_INLINE uint32_t LL_USART_GetOverSampling(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_OVER8)); +} + +/** + * @brief Configure if Clock pulse of the last data bit is output to the SCLK pin or not + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_SetLastClkPulseOutput + * @param USARTx USART Instance + * @param LastBitClockPulse This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLastClkPulseOutput(USART_TypeDef *USARTx, uint32_t LastBitClockPulse) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBCL, LastBitClockPulse); +} + +/** + * @brief Retrieve Clock pulse of the last data bit output configuration + * (Last bit Clock pulse output to the SCLK pin or not) + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_GetLastClkPulseOutput + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + */ +__STATIC_INLINE uint32_t LL_USART_GetLastClkPulseOutput(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBCL)); +} + +/** + * @brief Select the phase of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_SetClockPhase + * @param USARTx USART Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPhase(USART_TypeDef *USARTx, uint32_t ClockPhase) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA, ClockPhase); +} + +/** + * @brief Return phase of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_GetClockPhase + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPhase(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPHA)); +} + +/** + * @brief Select the polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_SetClockPolarity + * @param USARTx USART Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPolarity(USART_TypeDef *USARTx, uint32_t ClockPolarity) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPOL, ClockPolarity); +} + +/** + * @brief Return polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_GetClockPolarity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPolarity(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPOL)); +} + +/** + * @brief Configure Clock signal format (Phase Polarity and choice about output of last bit clock pulse) + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clock Phase configuration using @ref LL_USART_SetClockPhase() function + * - Clock Polarity configuration using @ref LL_USART_SetClockPolarity() function + * - Output of Last bit Clock pulse configuration using @ref LL_USART_SetLastClkPulseOutput() function + * @rmtoll CR2 CPHA LL_USART_ConfigClock\n + * CR2 CPOL LL_USART_ConfigClock\n + * CR2 LBCL LL_USART_ConfigClock + * @param USARTx USART Instance + * @param Phase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @param LBCPOutput This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigClock(USART_TypeDef *USARTx, uint32_t Phase, uint32_t Polarity, uint32_t LBCPOutput) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, Phase | Polarity | LBCPOutput); +} + +/** + * @brief Enable Clock output on SCLK pin + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_EnableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSCLKOutput(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Disable Clock output on SCLK pin + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_DisableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSCLKOutput(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Indicate if Clock output on SCLK pin is enabled + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_IsEnabledSCLKOutput + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSCLKOutput(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_CLKEN) == (USART_CR2_CLKEN)); +} + +/** + * @brief Set the length of the stop bits + * @rmtoll CR2 STOP LL_USART_SetStopBitsLength + * @param USARTx USART Instance + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Retrieve the length of the stop bits + * @rmtoll CR2 STOP LL_USART_GetStopBitsLength + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + */ +__STATIC_INLINE uint32_t LL_USART_GetStopBitsLength(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_STOP)); +} + +/** + * @brief Configure Character frame format (Datawidth, Parity control, Stop Bits) + * @note Call of this function is equivalent to following function call sequence : + * - Data Width configuration using @ref LL_USART_SetDataWidth() function + * - Parity Control and mode configuration using @ref LL_USART_SetParity() function + * - Stop bits configuration using @ref LL_USART_SetStopBitsLength() function + * @rmtoll CR1 PS LL_USART_ConfigCharacter\n + * CR1 PCE LL_USART_ConfigCharacter\n + * CR1 M LL_USART_ConfigCharacter\n + * CR2 STOP LL_USART_ConfigCharacter + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigCharacter(USART_TypeDef *USARTx, uint32_t DataWidth, uint32_t Parity, + uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE | USART_CR1_M, Parity | DataWidth); + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Set Address of the USART node. + * @note This is used in multiprocessor communication during Mute mode or Stop mode, + * for wake up with address mark detection. + * @rmtoll CR2 ADD LL_USART_SetNodeAddress + * @param USARTx USART Instance + * @param NodeAddress 4 bit Address of the USART node. + * @retval None + */ +__STATIC_INLINE void LL_USART_SetNodeAddress(USART_TypeDef *USARTx, uint32_t NodeAddress) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_ADD, (NodeAddress & USART_CR2_ADD)); +} + +/** + * @brief Return 4 bit Address of the USART node as set in ADD field of CR2. + * @note only 4bits (b3-b0) of returned value are relevant (b31-b4 are not relevant) + * @rmtoll CR2 ADD LL_USART_GetNodeAddress + * @param USARTx USART Instance + * @retval Address of the USART node (Value between Min_Data=0 and Max_Data=255) + */ +__STATIC_INLINE uint32_t LL_USART_GetNodeAddress(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_ADD)); +} + +/** + * @brief Enable RTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_EnableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Disable RTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_DisableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Enable CTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_EnableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Disable CTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_DisableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Configure HW Flow Control mode (both CTS and RTS) + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_SetHWFlowCtrl\n + * CR3 CTSE LL_USART_SetHWFlowCtrl + * @param USARTx USART Instance + * @param HardwareFlowControl This parameter can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + * @retval None + */ +__STATIC_INLINE void LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE, HardwareFlowControl); +} + +/** + * @brief Return HW Flow Control configuration (both CTS and RTS) + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_GetHWFlowCtrl\n + * CR3 CTSE LL_USART_GetHWFlowCtrl + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + */ +__STATIC_INLINE uint32_t LL_USART_GetHWFlowCtrl(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE)); +} + +/** + * @brief Enable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_EnableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableOneBitSamp(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Disable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_DisableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableOneBitSamp(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Indicate if One bit sampling method is enabled + * @rmtoll CR3 ONEBIT LL_USART_IsEnabledOneBitSamp + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledOneBitSamp(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_ONEBIT) == (USART_CR3_ONEBIT)); +} + +/** + * @brief Configure USART BRR register for achieving expected Baud Rate value. + * @note Compute and set USARTDIV value in BRR Register (full BRR content) + * according to used Peripheral Clock, Oversampling mode, and expected Baud Rate values + * @note Peripheral clock and Baud rate values provided as function parameters should be valid + * (Baud rate value != 0) + * @rmtoll BRR BRR LL_USART_SetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @param BaudRate Baud Rate + * @retval None + */ +__STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, + uint32_t BaudRate) +{ + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING8(PeriphClk, BaudRate)); + } + else + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(PeriphClk, BaudRate)); + } +} + +/** + * @brief Return current Baud Rate value, according to USARTDIV present in BRR register + * (full BRR content), and to used Peripheral Clock and Oversampling mode values + * @note In case of non-initialized or invalid value stored in BRR register, value 0 will be returned. + * @rmtoll BRR BRR LL_USART_GetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval Baud Rate + */ +__STATIC_INLINE uint32_t LL_USART_GetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling) +{ + register uint32_t usartdiv = 0x0U; + register uint32_t brrresult = 0x0U; + + usartdiv = USARTx->BRR; + + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + if ((usartdiv & 0xFFF7U) != 0U) + { + usartdiv = (uint16_t)((usartdiv & 0xFFF0U) | ((usartdiv & 0x0007U) << 1U)) ; + brrresult = (PeriphClk * 2U) / usartdiv; + } + } + else + { + if ((usartdiv & 0xFFFFU) != 0U) + { + brrresult = PeriphClk / usartdiv; + } + } + return (brrresult); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_IRDA Configuration functions related to Irda feature + * @{ + */ + +/** + * @brief Enable IrDA mode + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_EnableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIrda(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Disable IrDA mode + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_DisableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIrda(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Indicate if IrDA mode is enabled + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_IsEnabledIrda + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIrda(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_IREN) == (USART_CR3_IREN)); +} + +/** + * @brief Configure IrDA Power Mode (Normal or Low Power) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_SetIrdaPowerMode + * @param USARTx USART Instance + * @param PowerMode This parameter can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_IRDA_POWER_LOW + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPowerMode(USART_TypeDef *USARTx, uint32_t PowerMode) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_IRLP, PowerMode); +} + +/** + * @brief Retrieve IrDA Power Mode configuration (Normal or Low Power) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_GetIrdaPowerMode + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPowerMode(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_IRLP)); +} + +/** + * @brief Set Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetIrdaPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetIrdaPrescaler + * @param USARTx USART Instance + * @retval Irda prescaler value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPrescaler(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_Smartcard Configuration functions related to Smartcard feature + * @{ + */ + +/** + * @brief Enable Smartcard NACK transmission + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_EnableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcardNACK(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Disable Smartcard NACK transmission + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_DisableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcardNACK(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Indicate if Smartcard NACK transmission is enabled + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_IsEnabledSmartcardNACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcardNACK(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_NACK) == (USART_CR3_NACK)); +} + +/** + * @brief Enable Smartcard mode + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_EnableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcard(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Disable Smartcard mode + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_DisableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcard(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Indicate if Smartcard mode is enabled + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_IsEnabledSmartcard + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcard(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_SCEN) == (USART_CR3_SCEN)); +} + +/** + * @brief Set Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetSmartcardPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0 and Max_Data=31 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetSmartcardPrescaler + * @param USARTx USART Instance + * @retval Smartcard prescaler value (Value between Min_Data=0 and Max_Data=31) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardPrescaler(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @brief Set Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_SetSmartcardGuardTime + * @param USARTx USART Instance + * @param GuardTime Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardGuardTime(USART_TypeDef *USARTx, uint32_t GuardTime) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_GT, GuardTime << USART_POSITION_GTPR_GT); +} + +/** + * @brief Return Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_GetSmartcardGuardTime + * @param USARTx USART Instance + * @retval Smartcard Guard time value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardGuardTime(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_GT) >> USART_POSITION_GTPR_GT); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_HalfDuplex Configuration functions related to Half Duplex feature + * @{ + */ + +/** + * @brief Enable Single Wire Half-Duplex mode + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_EnableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableHalfDuplex(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Disable Single Wire Half-Duplex mode + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_DisableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableHalfDuplex(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Indicate if Single Wire Half-Duplex mode is enabled + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_IsEnabledHalfDuplex + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledHalfDuplex(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_HDSEL) == (USART_CR3_HDSEL)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_LIN Configuration functions related to LIN feature + * @{ + */ + +/** + * @brief Set LIN Break Detection Length + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_SetLINBrkDetectionLen + * @param USARTx USART Instance + * @param LINBDLength This parameter can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLINBrkDetectionLen(USART_TypeDef *USARTx, uint32_t LINBDLength) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBDL, LINBDLength); +} + +/** + * @brief Return LIN Break Detection Length + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_GetLINBrkDetectionLen + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + */ +__STATIC_INLINE uint32_t LL_USART_GetLINBrkDetectionLen(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBDL)); +} + +/** + * @brief Enable LIN mode + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_EnableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableLIN(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Disable LIN mode + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_DisableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableLIN(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Indicate if LIN mode is enabled + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_IsEnabledLIN + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledLIN(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LINEN) == (USART_CR2_LINEN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_AdvancedConfiguration Advanced Configurations services + * @{ + */ + +/** + * @brief Perform basic configuration of USART for enabling use in Asynchronous Mode (UART) + * @note In UART mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Asynchronous Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigAsyncMode\n + * CR2 CLKEN LL_USART_ConfigAsyncMode\n + * CR3 SCEN LL_USART_ConfigAsyncMode\n + * CR3 IREN LL_USART_ConfigAsyncMode\n + * CR3 HDSEL LL_USART_ConfigAsyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) +{ + /* In Asynchronous mode, the following bits must be kept cleared: + - LINEN, CLKEN bits in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Synchronous Mode + * @note In Synchronous mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the USART in Synchronous mode. + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * @note Other remaining configurations items related to Synchronous Mode + * (as Baud Rate, Word length, Parity, Clock Polarity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSyncMode\n + * CR2 CLKEN LL_USART_ConfigSyncMode\n + * CR3 SCEN LL_USART_ConfigSyncMode\n + * CR3 IREN LL_USART_ConfigSyncMode\n + * CR3 HDSEL LL_USART_ConfigSyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) +{ + /* In Synchronous mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); + /* set the UART/USART in Synchronous mode */ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in LIN Mode + * @note In LIN mode, the following bits must be kept cleared: + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also set the UART/USART in LIN mode. + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set LINEN in CR2 using @ref LL_USART_EnableLIN() function + * @note Other remaining configurations items related to LIN Mode + * (as Baud Rate, Word length, LIN Break Detection Length, ...) should be set using + * dedicated functions + * @rmtoll CR2 CLKEN LL_USART_ConfigLINMode\n + * CR2 STOP LL_USART_ConfigLINMode\n + * CR2 LINEN LL_USART_ConfigLINMode\n + * CR3 IREN LL_USART_ConfigLINMode\n + * CR3 SCEN LL_USART_ConfigLINMode\n + * CR3 HDSEL LL_USART_ConfigLINMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) +{ + /* In LIN mode, the following bits must be kept cleared: + - STOP and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); + /* Set the UART/USART in LIN mode */ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Half Duplex Mode + * @note In Half Duplex mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * This function also sets the UART/USART in Half Duplex mode. + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Set HDSEL in CR3 using @ref LL_USART_EnableHalfDuplex() function + * @note Other remaining configurations items related to Half Duplex Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigHalfDuplexMode\n + * CR2 CLKEN LL_USART_ConfigHalfDuplexMode\n + * CR3 HDSEL LL_USART_ConfigHalfDuplexMode\n + * CR3 SCEN LL_USART_ConfigHalfDuplexMode\n + * CR3 IREN LL_USART_ConfigHalfDuplexMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) +{ + /* In Half Duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); + /* set the UART/USART in Half Duplex mode */ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Smartcard Mode + * @note In Smartcard mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also configures Stop bits to 1.5 bits and + * sets the USART in Smartcard mode (SCEN bit). + * Clock Output is also enabled (CLKEN). + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * - Set SCEN in CR3 using @ref LL_USART_EnableSmartcard() function + * @note Other remaining configurations items related to Smartcard Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSmartcardMode\n + * CR2 STOP LL_USART_ConfigSmartcardMode\n + * CR2 CLKEN LL_USART_ConfigSmartcardMode\n + * CR3 HDSEL LL_USART_ConfigSmartcardMode\n + * CR3 SCEN LL_USART_ConfigSmartcardMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) +{ + /* In Smartcard mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); + /* Configure Stop bits to 1.5 bits */ + /* Synchronous mode is activated by default */ + SET_BIT(USARTx->CR2, (USART_CR2_STOP_0 | USART_CR2_STOP_1 | USART_CR2_CLKEN)); + /* set the UART/USART in Smartcard mode */ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Irda Mode + * @note In IRDA mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the UART/USART in IRDA mode (IREN bit). + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set IREN in CR3 using @ref LL_USART_EnableIrda() function + * @note Other remaining configurations items related to Irda Mode + * (as Baud Rate, Word length, Power mode, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigIrdaMode\n + * CR2 CLKEN LL_USART_ConfigIrdaMode\n + * CR2 STOP LL_USART_ConfigIrdaMode\n + * CR3 SCEN LL_USART_ConfigIrdaMode\n + * CR3 HDSEL LL_USART_ConfigIrdaMode\n + * CR3 IREN LL_USART_ConfigIrdaMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) +{ + /* In IRDA mode, the following bits must be kept cleared: + - LINEN, STOP and CLKEN bits in the USART_CR2 register, + - SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); + /* set the UART/USART in IRDA mode */ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Multi processor Mode + * (several USARTs connected in a network, one of the USARTs can be the master, + * its TX output connected to the RX inputs of the other slaves USARTs). + * @note In MultiProcessor mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Multi processor Mode + * (as Baud Rate, Wake Up Method, Node address, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigMultiProcessMode\n + * CR2 CLKEN LL_USART_ConfigMultiProcessMode\n + * CR3 SCEN LL_USART_ConfigMultiProcessMode\n + * CR3 HDSEL LL_USART_ConfigMultiProcessMode\n + * CR3 IREN LL_USART_ConfigMultiProcessMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) +{ + /* In Multi Processor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Check if the USART Parity Error Flag is set or not + * @rmtoll SR PE LL_USART_IsActiveFlag_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_PE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_PE) == (USART_SR_PE)); +} + +/** + * @brief Check if the USART Framing Error Flag is set or not + * @rmtoll SR FE LL_USART_IsActiveFlag_FE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_FE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_FE) == (USART_SR_FE)); +} + +/** + * @brief Check if the USART Noise error detected Flag is set or not + * @rmtoll SR NF LL_USART_IsActiveFlag_NE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_NE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_NE) == (USART_SR_NE)); +} + +/** + * @brief Check if the USART OverRun Error Flag is set or not + * @rmtoll SR ORE LL_USART_IsActiveFlag_ORE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_ORE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_ORE) == (USART_SR_ORE)); +} + +/** + * @brief Check if the USART IDLE line detected Flag is set or not + * @rmtoll SR IDLE LL_USART_IsActiveFlag_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_IDLE) == (USART_SR_IDLE)); +} + +/** + * @brief Check if the USART Read Data Register Not Empty Flag is set or not + * @rmtoll SR RXNE LL_USART_IsActiveFlag_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RXNE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_RXNE) == (USART_SR_RXNE)); +} + +/** + * @brief Check if the USART Transmission Complete Flag is set or not + * @rmtoll SR TC LL_USART_IsActiveFlag_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TC(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TC) == (USART_SR_TC)); +} + +/** + * @brief Check if the USART Transmit Data Register Empty Flag is set or not + * @rmtoll SR TXE LL_USART_IsActiveFlag_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TXE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TXE) == (USART_SR_TXE)); +} + +/** + * @brief Check if the USART LIN Break Detection Flag is set or not + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_IsActiveFlag_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_LBD(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_LBD) == (USART_SR_LBD)); +} + +/** + * @brief Check if the USART CTS Flag is set or not + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_IsActiveFlag_nCTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_nCTS(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_CTS) == (USART_SR_CTS)); +} + +/** + * @brief Check if the USART Send Break Flag is set or not + * @rmtoll CR1 SBK LL_USART_IsActiveFlag_SBK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_SBK(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_SBK) == (USART_CR1_SBK)); +} + +/** + * @brief Check if the USART Receive Wake Up from mute mode Flag is set or not + * @rmtoll CR1 RWU LL_USART_IsActiveFlag_RWU + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RWU) == (USART_CR1_RWU)); +} + +/** + * @brief Clear Parity Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * NE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR PE LL_USART_ClearFlag_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_PE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Framing Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, ORE, IDLE would also be cleared. + * @rmtoll SR FE LL_USART_ClearFlag_FE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_FE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Noise detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR NF LL_USART_ClearFlag_NE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_NE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear OverRun Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, IDLE would also be cleared. + * @rmtoll SR ORE LL_USART_ClearFlag_ORE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_ORE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear IDLE line detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, ORE would also be cleared. + * @rmtoll SR IDLE LL_USART_ClearFlag_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Transmission Complete Flag + * @rmtoll SR TC LL_USART_ClearFlag_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_TC(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR , ~(USART_SR_TC)); +} + +/** + * @brief Clear RX Not Empty Flag + * @rmtoll SR RXNE LL_USART_ClearFlag_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_RXNE(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR , ~(USART_SR_RXNE)); +} + +/** + * @brief Clear LIN Break Detection Flag + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_ClearFlag_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_LBD(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR , ~(USART_SR_LBD)); +} + +/** + * @brief Clear CTS Interrupt Flag + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_ClearFlag_nCTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_nCTS(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR , ~(USART_SR_CTS)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_EnableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Enable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_EnableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Enable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_EnableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TC(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Enable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_EnableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TXE(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Enable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_EnableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_PE(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Enable LIN Break Detection Interrupt + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_EnableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_LBD(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Enable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_EnableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_ERROR(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Enable CTS Interrupt + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_EnableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Disable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_DisableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_IDLE(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Disable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_DisableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_RXNE(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Disable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_DisableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TC(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Disable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_DisableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TXE(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Disable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_DisableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_PE(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Disable LIN Break Detection Interrupt + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_DisableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_LBD(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Disable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_DisableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_ERROR(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Disable CTS Interrupt + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_DisableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Check if the USART IDLE Interrupt source is enabled or disabled. + * @rmtoll CR1 IDLEIE LL_USART_IsEnabledIT_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_IDLE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_IDLEIE) == (USART_CR1_IDLEIE)); +} + +/** + * @brief Check if the USART RX Not Empty Interrupt is enabled or disabled. + * @rmtoll CR1 RXNEIE LL_USART_IsEnabledIT_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_RXNE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)); +} + +/** + * @brief Check if the USART Transmission Complete Interrupt is enabled or disabled. + * @rmtoll CR1 TCIE LL_USART_IsEnabledIT_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TC(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TCIE) == (USART_CR1_TCIE)); +} + +/** + * @brief Check if the USART TX Empty Interrupt is enabled or disabled. + * @rmtoll CR1 TXEIE LL_USART_IsEnabledIT_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TXE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TXEIE) == (USART_CR1_TXEIE)); +} + +/** + * @brief Check if the USART Parity Error Interrupt is enabled or disabled. + * @rmtoll CR1 PEIE LL_USART_IsEnabledIT_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_PE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_PEIE) == (USART_CR1_PEIE)); +} + +/** + * @brief Check if the USART LIN Break Detection Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_IsEnabledIT_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_LBD(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LBDIE) == (USART_CR2_LBDIE)); +} + +/** + * @brief Check if the USART Error Interrupt is enabled or disabled. + * @rmtoll CR3 EIE LL_USART_IsEnabledIT_ERROR + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_ERROR(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_EIE) == (USART_CR3_EIE)); +} + +/** + * @brief Check if the USART CTS Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_IsEnabledIT_CTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_DMA_Management DMA_Management + * @{ + */ + +/** + * @brief Enable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_EnableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Disable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_DisableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Check if DMA Mode is enabled for reception + * @rmtoll CR3 DMAR LL_USART_IsEnabledDMAReq_RX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR)); +} + +/** + * @brief Enable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_EnableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Disable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_DisableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Check if DMA Mode is enabled for transmission + * @rmtoll CR3 DMAT LL_USART_IsEnabledDMAReq_TX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAT) == (USART_CR3_DMAT)); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_USART_DMA_GetRegAddr + * @note Address of Data Register is valid for both Transmit and Receive transfers. + * @param USARTx USART Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx) +{ + /* return address of DR register */ + return ((uint32_t) &(USARTx->DR)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Read Receiver Data register (Receive Data value, 8 bits) + * @rmtoll DR DR LL_USART_ReceiveData8 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) +{ + return (uint8_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Read Receiver Data register (Receive Data value, 9 bits) + * @rmtoll DR DR LL_USART_ReceiveData9 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x1FF + */ +__STATIC_INLINE uint16_t LL_USART_ReceiveData9(USART_TypeDef *USARTx) +{ + return (uint16_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 8 bits) + * @rmtoll DR DR LL_USART_TransmitData8 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value) +{ + USARTx->DR = Value; +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 9 bits) + * @rmtoll DR DR LL_USART_TransmitData9 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0x1FF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value) +{ + USARTx->DR = Value & 0x1FFU; +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Execution Execution + * @{ + */ + +/** + * @brief Request Break sending + * @rmtoll CR1 SBK LL_USART_RequestBreakSending + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestBreakSending(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_SBK); +} + +/** + * @brief Put USART in Mute mode + * @rmtoll CR1 RWU LL_USART_RequestEnterMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestEnterMuteMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @brief Put USART in Active mode + * @rmtoll CR1 RWU LL_USART_RequestExitMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestExitMuteMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_EF_Init Initialization and de-initialization functions + * @{ + */ +ErrorStatus LL_USART_DeInit(USART_TypeDef *USARTx); +ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct); +void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct); +ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_USART_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h index 6bab2af..0c8fa99 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usb.h @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_ll_usb.h * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Header file of USB Core HAL module. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -379,10 +379,10 @@ typedef struct #define HC_PID_DATA1 2U #define HC_PID_SETUP 3U -#define GRXSTS_PKTSTS_IN 2 -#define GRXSTS_PKTSTS_IN_XFER_COMP 3 -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 -#define GRXSTS_PKTSTS_CH_HALTED 7 +#define GRXSTS_PKTSTS_IN 2U +#define GRXSTS_PKTSTS_IN_XFER_COMP 3U +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U +#define GRXSTS_PKTSTS_CH_HALTED 7U #define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx + USB_OTG_PCGCCTL_BASE) #define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx + USB_OTG_HOST_PORT_BASE) diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h new file mode 100644 index 0000000..90ad880 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h @@ -0,0 +1,327 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_utils.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of UTILS LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL UTILS driver contains a set of generic APIs that can be + used by user: + (+) Device electronic signature + (+) Timing functions + (+) PLL configuration functions + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_UTILS_H +#define __STM32F4xx_LL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @defgroup UTILS_LL UTILS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants + * @{ + */ + +/* Max delay can be used in LL_mDelay */ +#define LL_MAX_DELAY 0xFFFFFFFFU + +/** + * @brief Unique device ID register base address + */ +#define UID_BASE_ADDRESS UID_BASE + +/** + * @brief Flash size data register base address + */ +#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE + +/** + * @brief Package data register base address + */ +#define PACKAGE_BASE_ADDRESS PACKAGE_BASE + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros + * @{ + */ +/** + * @} + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures + * @{ + */ +/** + * @brief UTILS PLL structure definition + */ +typedef struct +{ + uint32_t PLLM; /*!< Division factor for PLL VCO input clock. + This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + + uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = @ref RCC_PLLN_MIN_VALUE + and Max_Data = @ref RCC_PLLN_MIN_VALUE + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + + uint32_t PLLP; /*!< Division for the main system clock. + This parameter can be a value of @ref RCC_LL_EC_PLLP_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ +} LL_UTILS_PLLInitTypeDef; + +/** + * @brief UTILS System, AHB and APB buses clock configuration structure definition + */ +typedef struct +{ + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAHBPrescaler(). */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB1_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB1Prescaler(). */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB2_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB2Prescaler(). */ + +} LL_UTILS_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants + * @{ + */ + +/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation + * @{ + */ +#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ +#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ +/** + * @} + */ + +/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE + * @{ + */ +#define LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 0x00000000U /*!< WLCSP36 or UFQFPN48 or LQFP64 package type */ +#define LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 0x00000100U /*!< WLCSP168 or FBGA169 or LQFP100 or LQFP64 or UFQFPN48 package type */ +#define LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 0x00000200U /*!< WLCSP64 or WLCSP81 or LQFP176 or UFBGA176 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 0x00000300U /*!< LQFP144 or UFBGA144 or UFBGA144 or UFBGA100 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 0x00000400U /*!< LQFP100 or LQFP208 or TFBGA216 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 0x00000500U /*!< LQFP208 or TFBGA216 package type */ +#define LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 0x00000700U /*!< TQFP64 or UFBGA144 or LQFP144 package type */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions + * @{ + */ + +/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE + * @{ + */ + +/** + * @brief Get Word0 of the unique device identifier (UID based on 96 bits) + * @retval UID[31:0] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word0(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); +} + +/** + * @brief Get Word1 of the unique device identifier (UID based on 96 bits) + * @retval UID[63:32] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word1(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 4U)))); +} + +/** + * @brief Get Word2 of the unique device identifier (UID based on 96 bits) + * @retval UID[95:64] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word2(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U)))); +} + +/** + * @brief Get Flash memory size + * @note This bitfield indicates the size of the device Flash memory expressed in + * Kbytes. As an example, 0x040 corresponds to 64 Kbytes. + * @retval FLASH_SIZE[15:0]: Flash memory size + */ +__STATIC_INLINE uint32_t LL_GetFlashSize(void) +{ + return (uint16_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS))); +} + +/** + * @brief Get Package type + * @retval Returned value can be one of the following values: + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_GetPackageType(void) +{ + return (uint8_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x0700U); +} + +/** + * @} + */ + +/** @defgroup UTILS_LL_EF_DELAY DELAY + * @{ + */ + +/** + * @brief This function configures the Cortex-M SysTick source of the time base. + * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) + * @note When a RTOS is used, it is recommended to avoid changing the SysTick + * configuration by calling this function, for a delay use rather osDelay RTOS service. + * @param Ticks Number of ticks + * @retval None + */ +__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) +{ + /* Configure the SysTick to have interrupt in 1ms time base */ + SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ +} + +void LL_Init1msTick(uint32_t HCLKFrequency); +void LL_mDelay(uint32_t Delay); + +/** + * @} + */ + +/** @defgroup UTILS_EF_SYSTEM SYSTEM + * @{ + */ + +void LL_SetSystemCoreClock(uint32_t HCLKFrequency); +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_UTILS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_wwdg.h b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_wwdg.h new file mode 100644 index 0000000..4ee05c2 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_wwdg.h @@ -0,0 +1,342 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_wwdg.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief Header file of WWDG LL module. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_WWDG_H +#define __STM32F4xx_LL_WWDG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (WWDG) + +/** @defgroup WWDG_LL WWDG + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup WWDG_LL_Exported_Constants WWDG Exported Constants + * @{ + */ + + +/** @defgroup WWDG_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_WWDG_ReadReg and LL_WWDG_WriteReg functions + * @{ + */ +#define LL_WWDG_CFR_EWI WWDG_CFR_EWI +/** + * @} + */ + +/** @defgroup WWDG_LL_EC_PRESCALER PRESCALER +* @{ +*/ +#define LL_WWDG_PRESCALER_1 (uint32_t)0x00000000U /*!< WWDG counter clock = (PCLK1/4096)/1 */ +#define LL_WWDG_PRESCALER_2 WWDG_CFR_WDGTB_0 /*!< WWDG counter clock = (PCLK1/4096)/2 */ +#define LL_WWDG_PRESCALER_4 WWDG_CFR_WDGTB_1 /*!< WWDG counter clock = (PCLK1/4096)/4 */ +#define LL_WWDG_PRESCALER_8 (WWDG_CFR_WDGTB_0 | WWDG_CFR_WDGTB_1) /*!< WWDG counter clock = (PCLK1/4096)/8 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup WWDG_LL_Exported_Macros WWDG Exported Macros + * @{ + */ +/** @defgroup WWDG_LL_EM_WRITE_READ Common Write and read registers macros + * @{ + */ +/** + * @brief Write a value in WWDG register + * @param __INSTANCE__ WWDG Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_WWDG_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in WWDG register + * @param __INSTANCE__ WWDG Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_WWDG_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup WWDG_LL_Exported_Functions WWDG Exported Functions + * @{ + */ + +/** @defgroup WWDG_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enable Window Watchdog. The watchdog is always disabled after a reset. + * @note It is enabled by setting the WDGA bit in the WWDG_CR register, + * then it cannot be disabled again except by a reset. + * This bit is set by software and only cleared by hardware after a reset. + * When WDGA = 1, the watchdog can generate a reset. + * @rmtoll CR WDGA LL_WWDG_Enable + * @param WWDGx WWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_WWDG_Enable(WWDG_TypeDef *WWDGx) +{ + SET_BIT(WWDGx->CR, WWDG_CR_WDGA); +} + +/** + * @brief Checks if Window Watchdog is enabled + * @rmtoll CR WDGA LL_WWDG_IsEnabled + * @param WWDGx WWDG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_WWDG_IsEnabled(WWDG_TypeDef *WWDGx) +{ + return (READ_BIT(WWDGx->CR, WWDG_CR_WDGA) == (WWDG_CR_WDGA)); +} + +/** + * @brief Set the Watchdog counter value to provided value (7-bits T[6:0]) + * @note When writing to the WWDG_CR register, always write 1 in the MSB b6 to avoid generating an immediate reset + * This counter is decremented every (4096 x 2expWDGTB) PCLK cycles + * A reset is produced when it rolls over from 0x40 to 0x3F (bit T6 becomes cleared) + * Setting the counter lower then 0x40 causes an immediate reset (if WWDG enabled) + * @rmtoll CR T LL_WWDG_SetCounter + * @param WWDGx WWDG Instance + * @param Counter 0..0x7F (7 bit counter value) + * @retval None + */ +__STATIC_INLINE void LL_WWDG_SetCounter(WWDG_TypeDef *WWDGx, uint32_t Counter) +{ + MODIFY_REG(WWDGx->CR, WWDG_CR_T, Counter); +} + +/** + * @brief Return current Watchdog Counter Value (7 bits counter value) + * @rmtoll CR T LL_WWDG_GetCounter + * @param WWDGx WWDG Instance + * @retval 7 bit Watchdog Counter value + */ +__STATIC_INLINE uint32_t LL_WWDG_GetCounter(WWDG_TypeDef *WWDGx) +{ + return (uint32_t)(READ_BIT(WWDGx->CR, WWDG_CR_T)); +} + +/** + * @brief Set the time base of the prescaler (WDGTB). + * @note Prescaler is used to apply ratio on PCLK clock, so that Watchdog counter + * is decremented every (4096 x 2expWDGTB) PCLK cycles + * @rmtoll CFR WDGTB LL_WWDG_SetPrescaler + * @param WWDGx WWDG Instance + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_WWDG_PRESCALER_1 + * @arg @ref LL_WWDG_PRESCALER_2 + * @arg @ref LL_WWDG_PRESCALER_4 + * @arg @ref LL_WWDG_PRESCALER_8 + * @retval None + */ +__STATIC_INLINE void LL_WWDG_SetPrescaler(WWDG_TypeDef *WWDGx, uint32_t Prescaler) +{ + MODIFY_REG(WWDGx->CFR, WWDG_CFR_WDGTB, Prescaler); +} + +/** + * @brief Return current Watchdog Prescaler Value + * @rmtoll CFR WDGTB LL_WWDG_GetPrescaler + * @param WWDGx WWDG Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_WWDG_PRESCALER_1 + * @arg @ref LL_WWDG_PRESCALER_2 + * @arg @ref LL_WWDG_PRESCALER_4 + * @arg @ref LL_WWDG_PRESCALER_8 + */ +__STATIC_INLINE uint32_t LL_WWDG_GetPrescaler(WWDG_TypeDef *WWDGx) +{ + return (uint32_t)(READ_BIT(WWDGx->CFR, WWDG_CFR_WDGTB)); +} + +/** + * @brief Set the Watchdog Window value to be compared to the downcounter (7-bits W[6:0]). + * @note This window value defines when write in the WWDG_CR register + * to program Watchdog counter is allowed. + * Watchdog counter value update must occur only when the counter value + * is lower than the Watchdog window register value. + * Otherwise, a MCU reset is generated if the 7-bit Watchdog counter value + * (in the control register) is refreshed before the downcounter has reached + * the watchdog window register value. + * Physically is possible to set the Window lower then 0x40 but it is not recommended. + * To generate an immediate reset, it is possible to set the Counter lower than 0x40. + * @rmtoll CFR W LL_WWDG_SetWindow + * @param WWDGx WWDG Instance + * @param Window 0x00..0x7F (7 bit Window value) + * @retval None + */ +__STATIC_INLINE void LL_WWDG_SetWindow(WWDG_TypeDef *WWDGx, uint32_t Window) +{ + MODIFY_REG(WWDGx->CFR, WWDG_CFR_W, Window); +} + +/** + * @brief Return current Watchdog Window Value (7 bits value) + * @rmtoll CFR W LL_WWDG_GetWindow + * @param WWDGx WWDG Instance + * @retval 7 bit Watchdog Window value + */ +__STATIC_INLINE uint32_t LL_WWDG_GetWindow(WWDG_TypeDef *WWDGx) +{ + return (uint32_t)(READ_BIT(WWDGx->CFR, WWDG_CFR_W)); +} + +/** + * @} + */ + +/** @defgroup WWDG_LL_EF_FLAG_Management FLAG_Management + * @{ + */ +/** + * @brief Indicates if the WWDG Early Wakeup Interrupt Flag is set or not. + * @note This bit is set by hardware when the counter has reached the value 0x40. + * It must be cleared by software by writing 0. + * A write of 1 has no effect. This bit is also set if the interrupt is not enabled. + * @rmtoll SR EWIF LL_WWDG_IsActiveFlag_EWKUP + * @param WWDGx WWDG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_WWDG_IsActiveFlag_EWKUP(WWDG_TypeDef *WWDGx) +{ + return (READ_BIT(WWDGx->SR, WWDG_SR_EWIF) == (WWDG_SR_EWIF)); +} + +/** + * @brief Clear WWDG Early Wakeup Interrupt Flag (EWIF) + * @rmtoll SR EWIF LL_WWDG_ClearFlag_EWKUP + * @param WWDGx WWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_WWDG_ClearFlag_EWKUP(WWDG_TypeDef *WWDGx) +{ + WRITE_REG(WWDGx->SR, ~WWDG_SR_EWIF); +} + +/** + * @} + */ + +/** @defgroup WWDG_LL_EF_IT_Management IT_Management + * @{ + */ +/** + * @brief Enable the Early Wakeup Interrupt. + * @note When set, an interrupt occurs whenever the counter reaches value 0x40. + * This interrupt is only cleared by hardware after a reset + * @rmtoll CFR EWI LL_WWDG_EnableIT_EWKUP + * @param WWDGx WWDG Instance + * @retval None + */ +__STATIC_INLINE void LL_WWDG_EnableIT_EWKUP(WWDG_TypeDef *WWDGx) +{ + SET_BIT(WWDGx->CFR, WWDG_CFR_EWI); +} + +/** + * @brief Check if Early Wakeup Interrupt is enabled + * @rmtoll CFR EWI LL_WWDG_IsEnabledIT_EWKUP + * @param WWDGx WWDG Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_WWDG_IsEnabledIT_EWKUP(WWDG_TypeDef *WWDGx) +{ + return (READ_BIT(WWDGx->CFR, WWDG_CFR_EWI) == (WWDG_CFR_EWI)); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* WWDG */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_WWDG_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html b/system/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html index 64c19c1..1c64828 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html +++ b/system/Drivers/STM32F4xx_HAL_Driver/Release_Notes.html @@ -913,7 +913,7 @@

Release Notes for STM32F4xx HAL Drivers

Copyright - 2016 STMicroelectronics

+ 2017 STMicroelectronics

@@ -922,7 +922,47 @@

-

Update History

V1.6.0 / 04-November-2016

Main +

Update History

V1.7.1 / 14-April-2017

Main +Changes

+ +
  • Update CHM UserManuals to support LL drivers
  • General updates +to fix known defects and enhancements implementation
  • HAL CAN update
    • Add + management of overrun error. 
    • Allow + possibility to receive messages from the 2 RX FIFOs in parallel via + interrupt.
    • Fix message + lost issue with specific sequence of transmit requests.
    • Handle + transmission failure with error callback, when NART is enabled.
    • Add __HAL_CAN_CANCEL_TRANSMIT() call to abort transmission when + timeout is reached
+
  • HAL PWR update
    • HAL_PWREx_EnterUnderDriveSTOPMode() API: remove check on UDRDY flag
+
  • LL ADC update
    • Fix wrong ADC group injected sequence configuration
      • LL_ADC_INJ_SetSequencerRanks() +and LL_ADC_INJ_GetSequencerRanks() API's update to take in +consideration the ADC number of conversions
      • Update the defined values for ADC group injected seqencer ranks 

V1.7.0 / 17-February-2017

Main +Changes

+ +
  • Add Low Layer drivers allowing performance and footprint optimization
    • Low +Layer drivers APIs provide register level programming: require deep +knowledge of peripherals described in STM32F4xx Reference Manuals
    • Low +Layer drivers are available for: ADC, Cortex, CRC, DAC, DMA, +DMA2D, EXTI, GPIO, I2C, IWDG, LPTIM, PWR, RCC, RNG, RTC, SPI, TIM, +USART, WWDG peripherals and additionnal Low Level Bus, System and +Utilities APIs.
    • Low Layer drivers APIs are implemented as static inline function in new Inc/stm32f4xx_ll_ppp.h files for PPP peripherals, there is no configuration file and each stm32f4xx_ll_ppp.h file must be included in user code.
  • General updates to fix known defects and enhancements implementation
  • Fix extra warnings with GCC compiler
  • HAL drivers clean up: remove double casting 'uint32_t' and 'U'
  • Add new HAL MMC driver
  • The following changes done on the HAL drivers require an update on the application code based on older HAL versions
    • HAL SD update
      • Overall rework of the driver for a more efficient implementation
        • Modify initialization API and structures
        • Modify Read / Write sequences: separate transfer process and SD Cards state management 
        • Adding interrupt mode for Read / Write operations
        • Update the HAL_SD_IRQHandler function by optimizing the management of interrupt errors
      • Refer to the following example to identify the changes: BSP example and USB_Device/MSC_Standalone application
    • HAL NAND update
      • Modify NAND_AddressTypeDef, NAND_DeviceConfigTypeDef and NAND_HandleTypeDef structures fields
      • Add new HAL_NAND_ConfigDevice API
    • HAL DFSDM update
      • Add support of Multichannel Delay feature
        • Add HAL_DFSDM_ConfigMultiChannelDelay API
        • The following APIs are moved to internal static functions: +HAL_DFSDM_ClockIn_SourceSelection, HAL_DFSDM_ClockOut_SourceSelection, +HAL_DFSDM_DataInX_SourceSelection (X=0,2,4,6), +HAL_DFSDM_BitStreamClkDistribution_Config
    • HAL I2S update
      • Add specific callback API to manage I2S full duplex end of transfer process:
        • HAL_I2S_TxCpltCallback() and +HAL_I2S_RxCpltCallback() API's will be replaced with only HAL_I2SEx_TxRxCpltCallback() API. 
  • HAL update
    • Modifiy default HAL_Delay implementation to guarantee minimum delay 
  • HAL Cortex update
    • Move HAL_MPU_Disable() and HAL_MPU_Enable() from stm32f4xx_hal_cortex.h to stm32f4xx_hal_cortex.c
    • Clear the whole MPU control register in HAL_MPU_Disable() API
  • HAL FLASH update
    • IS_FLASH_ADDRESS() macro update to support OTP range
    • FLASH_Program_DoubleWord(): Replace 64-bit accesses with 2 double-words operations
  • LL GPIO update
    • Update IS_GPIO_PIN() macro implementation to be more safe
  • LL RCC update
    • Update IS_RCC_PLLQ_VALUE() macro implementation: the minimum accepted value is 2 instead of 4
    • Rename RCC_LPTIM1CLKSOURCE_PCLK define to RCC_LPTIM1CLKSOURCE_PCLK1
    • Fix +compilation issue w/ __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() and +__HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() macros for STM32F401xx devices
    • Add the following is clock enabled macros for STM32F401xx devices
      •  __HAL_RCC_SDIO_IS_CLK_ENABLED()
      • __HAL_RCC_SPI4_IS_CLK_ENABLED()
      • __HAL_RCC_TIM10_IS_CLK_ENABLED()
    • Add the following is clock enabled macros for STM32F410xx devices
      •  __HAL_RCC_CRC_IS_CLK_ENABLED()
      • __HAL_RCC_RNG_IS_CLK_ENABLED()
    • Update HAL_RCC_DeInit() to reset the RCC clock configuration to the default reset state.
    • Remove macros to configure BKPSRAM from STM32F401xx devices 
    • Update to refer to AHBPrescTable[] and APBPrescTable[] tables defined in system_stm32f4xx.c file instead of APBAHBPrescTable[] table.
  • HAL FMPI2C update
    • Add FMPI2C_FIRST_AND_NEXT_FRAME define in Sequential Transfer Options
  • HAL ADC update
    • HAL_ADCEx_InjectedConfigChannel(): update the external trigger injected condition
  • HAL DMA update
    • HAL_DMA_Init(): update to check compatibility between FIFO threshold level and size of the memory burst 
  • HAL QSPI update
    • QSPI_HandleTypeDef structure: Update transfer parameters on uint32_t instead of uint16_t
  • HAL UART/USART/IrDA/SMARTCARD update
    • DMA Receive process; the code +has been updated to clear the USART OVR flag before enabling DMA receive request.

    • UART_SetConfig() update to manage correctly USART6 instance that is not available on STM32F410Tx devices
  • HAL CAN update
    • Remove Lock mechanism from HAL_CAN_Transmit_IT() and HAL_CAN_Receive_IT() processes
  • HAL TIM update
    • Add __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY() macro to disable Master output without check on TIM channel state. 

    • Update HAL_TIMEx_ConfigBreakDeadTime() to fix TIM BDTR register corruption.
  • HAL I2C update
    • Update +HAL_I2C_Master_Transmit() and HAL_I2C_Slave_Transmit() to avoid sending +extra bytes at the end of the transmit processes
    • Update + HAL_I2C_Mem_Read() API to fix wrong check on misused parameter “Size”
    • Update + I2C_MasterReceive_RXNE() and I2C_MasterReceive_BTF() static APIs to + enhance Master sequential reception process.
  • HAL SPI update
    • Add transfer abort APIs and associated callbacks in interrupt mode
      • HAL_SPI_Abort()
      • HAL_SPI_Abort_IT()
      • HAL_SPI_AbortCpltCallback()
  • HAL I2S update
    • Add specific callback API to manage I2S full duplex end of transfer process:
      • HAL_I2S_TxCpltCallback() and +HAL_I2S_RxCpltCallback() API's will be replaced with only HAL_I2SEx_TxRxCpltCallback() API. 
    • Update I2S Transmit/Receive polling process to manage Overrun and Underrun errors
    • Move +the I2S clock input frequency +calculation to HAL RCC driver.
    • Update the +HAL I2SEx driver to keep only full duplex feature.
    • HAL_I2S_Init() API updated to
      • Fix wrong I2S clock calculation when PCM mode is used.
      • Return state HAL_I2S_ERROR_PRESCALER when the I2S clock is wrongly configured
+
  • HAL LTDC update
    • Optimize HAL_LTDC_IRQHandler() function by using direct register read
    • Rename the following API's
      • HAL_LTDC_Relaod() by HAL_LTDC_Reload() 
      • HAL_LTDC_StructInitFromVideoConfig() by HAL_LTDCEx_StructInitFromVideoConfig()
      • HAL_LTDC_StructInitFromAdaptedCommandConfig() by HAL_LTDCEx_StructInitFromAdaptedCommandConfig()
    • Add new defines for LTDC layers (LTDC_LAYER_1 / LTDC_LAYER_2)
    • Remove unused asserts
  • HAL USB PCD update
    • Flush all TX FIFOs on USB Reset
    • Remove Lock mechanism from HAL_PCD_EP_Transmit() and HAL_PCD_EP_Receive() API's
  • LL USB update
    • Enable DMA Burst mode for USB OTG HS
    • Fix SD card detection issue
  • LL SDMMC update
    • Add new SDMMC_CmdSDEraseStartAdd, SDMMC_CmdSDEraseEndAdd, SDMMC_CmdOpCondition and SDMMC_CmdSwitch functions

V1.6.0 / 04-November-2016

Main Changes

  • Add support of STM32F413xx and STM32F423xx devices
  • General updates to fix known defects and enhancements implementation
  • HAL CAN update
    • Update to add the support of 3 CAN management
  • HAL CRYP update
    • Update to add the support of AES features
  • HAL DFSDM update
    • Add definitions for new external trigger filters
    • Add definition for new Channels 4, 5, 6 and 7
    • Add functions and API for Filter state configuration and management
    • Add new functions: 
      • HAL_DFSDM_BitstreamClock_Start()
      • HAL_DFSDM_BitstreamClock_Stop()
      • HAL_DFSDM_BitStreamClkDistribution_Config() 
  • HAL DMA
    • Add the support of DMA Channels from 8 to 15
    • Update HAL_DMA_DeInit() function with the check on DMA stream instance
  • HAL DSI update
    • Update HAL_DSI_ConfigHostTimeouts() and HAL_DSI_Init() functions to avoid scratch in DSI_CCR register
  • HAL FLASH update
    • Enhance FLASH_WaitForLastOperation() function implementation
    • Update __HAL_FLASH_GET_FLAG() macro implementation
  • HAL GPIO update
    • Add specific alternate functions definitions
  • HAL I2C update
    • Update I2C_DMAError() function implementation to ignore DMA FIFO error
  • HAL I2S update
    • Enhance HAL_I2S_Init() implementation to test on PCM_SHORT and PCM_LONG standards
  • HAL IRDA update
    • Add new functions and call backs for Transfer Abort
      • HAL_IRDA_Abort()
      • HAL_IRDA_AbortTransmit()
      • HAL_IRDA_AbortReceive()
      • HAL_IRDA_Abort_IT()
      • HAL_IRDA_AbortTransmit_IT()
      • HAL_IRDA_AbortReceive_IT()
      • HAL_IRDA_AbortCpltCallback()
      • HAL_IRDA_AbortTransmitCpltCallback()
      • HAL_IRDA_AbortReceiveCpltCallback()
  • HAL PCD update
    • Update HAL_PCD_GetRxCount()  function implementation
  • HAL RCC update
    • Update __HAL_RCC_HSE_CONFIG() macro implementation
    • Update __HAL_RCC_LSE_CONFIG() macro implementation
  • HAL SMARTCARD update
    • Add new functions and call backs for Transfer Abort
      • HAL_ SMARTCARD_Abort()
      • HAL_ SMARTCARD_AbortTransmit()
      • HAL_ SMARTCARD_AbortReceive()
      • HAL_ SMARTCARD_Abort_IT()
      • HAL_ SMARTCARD_AbortTransmit_IT()
      • HAL_ SMARTCARD_AbortReceive_IT()
      • HAL_ SMARTCARD_AbortCpltCallback()
      • HAL_ SMARTCARD_AbortTransmitCpltCallback()
      • HAL_ SMARTCARD_AbortReceiveCpltCallback()
  • HAL TIM update
    • Update HAL_TIMEx_RemapConfig() function to manage TIM internal trigger remap: LPTIM or TIM3_TRGO
  • HAL UART update
    • Add Transfer abort functions and callbacks
  • HAL USART update
    • Add Transfer abort functions and callbacks

V1.5.2 / 22-September-2016

Main diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c index cb0e5cc..bd1dc7d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HAL module driver. * This is the common part of the HAL initialization * @@ -23,7 +23,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -68,18 +68,18 @@ * @{ */ /** - * @brief STM32F4xx HAL Driver version number V1.6.0 + * @brief STM32F4xx HAL Driver version number V1.7.1 */ -#define __STM32F4xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F4xx_HAL_VERSION_SUB1 (0x06) /*!< [23:16] sub1 version */ -#define __STM32F4xx_HAL_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F4xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_HAL_VERSION_SUB2 (0x01U) /*!< [15:8] sub2 version */ +#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ #define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ |(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ |(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ |(__STM32F4xx_HAL_VERSION_RC)) -#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFFU) +#define IDCODE_DEVID_MASK 0x00000FFFU /* ------------ RCC registers bit address in the alias region ----------- */ #define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) @@ -272,7 +272,7 @@ __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) HAL_SYSTICK_Config(SystemCoreClock/1000U); /*Configure the SysTick IRQ priority */ - HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0U); + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); /* Return function status */ return HAL_OK; @@ -331,7 +331,7 @@ __weak uint32_t HAL_GetTick(void) } /** - * @brief This function provides accurate delay (in milliseconds) based + * @brief This function provides minimum delay (in milliseconds) based * on variable incremented. * @note In the default implementation , SysTick timer is the source of time base. * It is used to generate interrupts at regular time intervals where uwTick @@ -343,9 +343,16 @@ __weak uint32_t HAL_GetTick(void) */ __weak void HAL_Delay(__IO uint32_t Delay) { - uint32_t tickstart = 0U; - tickstart = HAL_GetTick(); - while((HAL_GetTick() - tickstart) < Delay) + uint32_t tickstart = HAL_GetTick(); + uint32_t wait = Delay; + + /* Add a period to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + { + wait++; + } + + while((HAL_GetTick() - tickstart) < wait) { } } @@ -485,6 +492,18 @@ void HAL_DisableCompensationCell(void) *(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; } +/** + * @brief Return the unique device identifier (UID based on 96 bits) + * @param UID: pointer to 3 words array. + * @retval Device identifier + */ +void HAL_GetUID(uint32_t *UID) +{ + UID[0] = (uint32_t)(READ_REG(*((uint32_t *)UID_BASE))); + UID[1] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 4U)))); + UID[2] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 8U)))); +} + #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ defined(STM32F469xx) || defined(STM32F479xx) /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c index a6cd67f..3be6a01 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_adc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file provides firmware functions to manage the following * functionalities of the Analog to Digital Convertor (ADC) peripheral: * + Initialization and de-initialization functions @@ -164,7 +164,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -437,6 +437,7 @@ __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) { __IO uint32_t counter = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); @@ -489,19 +490,24 @@ HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) { /* Reset ADC all error code fields */ ADC_CLEAR_ERRORCODE(hadc); - } - + } + /* Process unlocked */ /* Unlock before starting ADC conversions: in case of potential */ /* interruption, to let the process to ADC IRQ Handler. */ __HAL_UNLOCK(hadc); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Clear regular group conversion flag and overrun flag */ /* (To ensure of no unknown state from potential previous ADC operations) */ __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); /* Check if Multimode enabled */ - if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI)) + if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) { /* if no external trigger present enable software conversion of regular channels */ if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) @@ -728,6 +734,7 @@ HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventTy HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) { __IO uint32_t counter = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); @@ -781,12 +788,17 @@ HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) /* Reset ADC all error code fields */ ADC_CLEAR_ERRORCODE(hadc); } - + /* Process unlocked */ /* Unlock before starting ADC conversions: in case of potential */ /* interruption, to let the process to ADC IRQ Handler. */ __HAL_UNLOCK(hadc); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Clear regular group conversion flag and overrun flag */ /* (To ensure of no unknown state from potential previous ADC operations) */ __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); @@ -795,7 +807,7 @@ HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_OVR)); /* Check if Multimode enabled */ - if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI)) + if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) { /* if no external trigger present enable software conversion of regular channels */ if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) @@ -1013,6 +1025,7 @@ void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc) HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) { __IO uint32_t counter = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); @@ -1066,12 +1079,17 @@ HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, ui /* Reset ADC all error code fields */ ADC_CLEAR_ERRORCODE(hadc); } - + /* Process unlocked */ /* Unlock before starting ADC conversions: in case of potential */ /* interruption, to let the process to ADC IRQ Handler. */ __HAL_UNLOCK(hadc); + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Set the DMA transfer complete callback */ hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; @@ -1099,7 +1117,7 @@ HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, ui HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length); /* Check if Multimode enabled */ - if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI)) + if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) { /* if no external trigger present enable software conversion of regular channels */ if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) @@ -1279,6 +1297,7 @@ __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig) { __IO uint32_t counter = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_ADC_CHANNEL(sConfig->Channel)); @@ -1333,19 +1352,24 @@ HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConf /* Set the SQx bits for the selected rank */ hadc->Instance->SQR1 |= ADC_SQR1_RK(sConfig->Channel, sConfig->Rank); } - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* if ADC1 Channel_18 is selected enable VBAT Channel */ if ((hadc->Instance == ADC1) && (sConfig->Channel == ADC_CHANNEL_VBAT)) { /* Enable the VBAT channel*/ - ADC->CCR |= ADC_CCR_VBATE; + tmpADC_Common->CCR |= ADC_CCR_VBATE; } /* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */ if ((hadc->Instance == ADC1) && ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) || (sConfig->Channel == ADC_CHANNEL_VREFINT))) { /* Enable the TSVREFE channel*/ - ADC->CCR |= ADC_CCR_TSVREFE; + tmpADC_Common->CCR |= ADC_CCR_TSVREFE; if((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)) { @@ -1498,10 +1522,17 @@ uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc) */ static void ADC_Init(ADC_HandleTypeDef* hadc) { + ADC_Common_TypeDef *tmpADC_Common; + /* Set ADC parameters */ + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADCs and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Set the ADC clock prescaler */ - ADC->CCR &= ~(ADC_CCR_ADCPRE); - ADC->CCR |= hadc->Init.ClockPrescaler; + tmpADC_Common->CCR &= ~(ADC_CCR_ADCPRE); + tmpADC_Common->CCR |= hadc->Init.ClockPrescaler; /* Set ADC scan mode */ hadc->Instance->CR1 &= ~(ADC_CR1_SCAN); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c index bf3e98c..27708fc 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_adc_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file provides firmware functions to manage the following * functionalities of the ADC extension peripheral: * + Extended features functions @@ -86,7 +86,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -178,6 +178,7 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc) { __IO uint32_t counter = 0U; uint32_t tmp1 = 0U, tmp2 = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Process locked */ __HAL_LOCK(hadc); @@ -228,9 +229,14 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc) /* Clear injected group conversion flag */ /* (To ensure of no unknown state from potential previous ADC operations) */ __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Check if Multimode enabled */ - if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI)) + if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) { tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); @@ -267,6 +273,7 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc) { __IO uint32_t counter = 0U; uint32_t tmp1 = 0U, tmp2 = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Process locked */ __HAL_LOCK(hadc); @@ -320,9 +327,14 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc) /* Enable end of conversion interrupt for injected channels */ __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC); + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); /* Check if Multimode enabled */ - if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI)) + if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) { tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN); tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); @@ -597,6 +609,7 @@ uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRa HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) { __IO uint32_t counter = 0U; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); @@ -674,20 +687,25 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t /* Enable ADC overrun interrupt */ __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + if (hadc->Init.DMAContinuousRequests != DISABLE) { /* Enable the selected ADC DMA request after last transfer */ - ADC->CCR |= ADC_CCR_DDS; + tmpADC_Common->CCR |= ADC_CCR_DDS; } else { /* Disable the selected ADC EOC rising on each regular channel conversion */ - ADC->CCR &= ~ADC_CCR_DDS; + tmpADC_Common->CCR &= ~ADC_CCR_DDS; } /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&ADC->CDR, (uint32_t)pData, Length); + HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&tmpADC_Common->CDR, (uint32_t)pData, Length); /* if no external trigger present enable software conversion of regular channels */ if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) @@ -710,6 +728,7 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef* hadc) { HAL_StatusTypeDef tmp_hal_status = HAL_OK; + ADC_Common_TypeDef *tmpADC_Common; /* Check the parameters */ assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); @@ -720,12 +739,17 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef* hadc) /* Stop potential conversion on going, on regular and injected groups */ /* Disable ADC peripheral */ __HAL_ADC_DISABLE(hadc); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Check if ADC is effectively disabled */ if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) { /* Disable the selected ADC DMA mode for multimode */ - ADC->CCR &= ~ADC_CCR_DDS; + tmpADC_Common->CCR &= ~ADC_CCR_DDS; /* Disable the DMA channel (in case of DMA in circular mode or stop while */ /* DMA transfer is on going) */ @@ -756,8 +780,15 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef* hadc) */ uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef* hadc) { + ADC_Common_TypeDef *tmpADC_Common; + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Return the multi mode conversion value */ - return ADC->CDR; + return tmpADC_Common->CDR; } /** @@ -788,8 +819,11 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_I #ifdef USE_FULL_ASSERT uint32_t tmp = 0U; -#endif /* USE_FULL_ASSERT */ +#endif /* USE_FULL_ASSERT */ + + ADC_Common_TypeDef *tmpADC_Common; + /* Check the parameters */ assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel)); assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank)); @@ -804,7 +838,7 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_I assert_param(IS_ADC_RANGE(tmp, sConfigInjected->InjectedOffset)); #endif /* USE_FULL_ASSERT */ - if(sConfigInjected->ExternalTrigInjecConvEdge != ADC_INJECTED_SOFTWARE_START) + if(sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START) { assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(sConfigInjected->ExternalTrigInjecConvEdge)); } @@ -909,19 +943,24 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_I hadc->Instance->JOFR4 |= sConfigInjected->InjectedOffset; break; } - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* if ADC1 Channel_18 is selected enable VBAT Channel */ if ((hadc->Instance == ADC1) && (sConfigInjected->InjectedChannel == ADC_CHANNEL_VBAT)) { /* Enable the VBAT channel*/ - ADC->CCR |= ADC_CCR_VBATE; + tmpADC_Common->CCR |= ADC_CCR_VBATE; } /* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */ if ((hadc->Instance == ADC1) && ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT))) { /* Enable the TSVREFE channel*/ - ADC->CCR |= ADC_CCR_TSVREFE; + tmpADC_Common->CCR |= ADC_CCR_TSVREFE; } /* Process unlocked */ @@ -941,6 +980,9 @@ HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_I */ HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_MultiModeTypeDef* multimode) { + + ADC_Common_TypeDef *tmpADC_Common; + /* Check the parameters */ assert_param(IS_ADC_MODE(multimode->Mode)); assert_param(IS_ADC_DMA_ACCESS_MODE(multimode->DMAAccessMode)); @@ -948,18 +990,23 @@ HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_ /* Process locked */ __HAL_LOCK(hadc); - + + /* Pointer to the common control register to which is belonging hadc */ + /* (Depending on STM32F4 product, there may be up to 3 ADC and 1 common */ + /* control register) */ + tmpADC_Common = ADC_COMMON_REGISTER(hadc); + /* Set ADC mode */ - ADC->CCR &= ~(ADC_CCR_MULTI); - ADC->CCR |= multimode->Mode; + tmpADC_Common->CCR &= ~(ADC_CCR_MULTI); + tmpADC_Common->CCR |= multimode->Mode; /* Set the ADC DMA access mode */ - ADC->CCR &= ~(ADC_CCR_DMA); - ADC->CCR |= multimode->DMAAccessMode; + tmpADC_Common->CCR &= ~(ADC_CCR_DMA); + tmpADC_Common->CCR |= multimode->DMAAccessMode; /* Set delay between two sampling phases */ - ADC->CCR &= ~(ADC_CCR_DELAY); - ADC->CCR |= multimode->TwoSamplingDelay; + tmpADC_Common->CCR &= ~(ADC_CCR_DELAY); + tmpADC_Common->CCR |= multimode->TwoSamplingDelay; /* Process unlocked */ __HAL_UNLOCK(hadc); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c index 3030a94..d1c9c41 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_can.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file provides firmware functions to manage the following * functionalities of the Controller Area Network (CAN) peripheral: * + Initialization and de-initialization functions @@ -77,7 +77,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -360,6 +360,9 @@ HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTy uint32_t filternbrbitpos = 0U; CAN_TypeDef *can_ip; + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + /* Check the parameters */ assert_param(IS_CAN_FILTER_NUMBER(sFilterConfig->FilterNumber)); assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); @@ -368,7 +371,7 @@ HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTy assert_param(IS_FUNCTIONAL_STATE(sFilterConfig->FilterActivation)); assert_param(IS_CAN_BANKNUMBER(sFilterConfig->BankNumber)); - filternbrbitpos = ((uint32_t)1U) << sFilterConfig->FilterNumber; + filternbrbitpos = 1U << sFilterConfig->FilterNumber; #if defined (CAN3) /* Check the CAN instance */ if(hcan->Instance == CAN3) @@ -561,7 +564,7 @@ __weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) { uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX; - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Check the parameters */ assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE)); @@ -575,15 +578,21 @@ HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) /* Process locked */ __HAL_LOCK(hcan); - if(hcan->State == HAL_CAN_STATE_BUSY_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else + /* Change CAN state */ + switch(hcan->State) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; + case(HAL_CAN_STATE_BUSY_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + case(HAL_CAN_STATE_BUSY_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; } /* Select one empty transmit mailbox */ @@ -617,7 +626,7 @@ HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) } /* Set up the DLC */ - hcan->pTxMsg->DLC &= (uint8_t)0x0000000FU; + hcan->pTxMsg->DLC &= (uint8_t)0x0000000F; hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U; hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC; @@ -633,7 +642,7 @@ HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) /* Request transmission */ hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; - /* Get tick */ + /* Get tick */ tickstart = HAL_GetTick(); /* Check End of transmission flag */ @@ -645,23 +654,33 @@ HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) { hcan->State = HAL_CAN_STATE_TIMEOUT; + + __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox); + /* Process unlocked */ __HAL_UNLOCK(hcan); return HAL_TIMEOUT; } } } - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - else + + /* Change CAN state */ + switch(hcan->State) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + default: /* HAL_CAN_STATE_BUSY_TX */ + hcan->State = HAL_CAN_STATE_READY; + break; } - + /* Process unlocked */ __HAL_UNLOCK(hcan); @@ -699,7 +718,7 @@ HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan) { /* Process Locked */ __HAL_LOCK(hcan); - + /* Select one empty transmit mailbox */ if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) { @@ -731,48 +750,54 @@ HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan) } /* Set up the DLC */ - hcan->pTxMsg->DLC &= (uint8_t)0x0000000FU; + hcan->pTxMsg->DLC &= (uint8_t)0x0000000F; hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0U; hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC; /* Set up the data field */ - hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) | + hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3U] << 24U) | ((uint32_t)hcan->pTxMsg->Data[2U] << 16U) | ((uint32_t)hcan->pTxMsg->Data[1U] << 8U) | ((uint32_t)hcan->pTxMsg->Data[0U])); - hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) | + hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7U] << 24U) | ((uint32_t)hcan->pTxMsg->Data[6U] << 16U) | ((uint32_t)hcan->pTxMsg->Data[5U] << 8U) | ((uint32_t)hcan->pTxMsg->Data[4U])); - - if(hcan->State == HAL_CAN_STATE_BUSY_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else + + /* Change CAN state */ + switch(hcan->State) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; + case(HAL_CAN_STATE_BUSY_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + case(HAL_CAN_STATE_BUSY_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; } - + /* Set CAN error code to none */ hcan->ErrorCode = HAL_CAN_ERROR_NONE; - + /* Process Unlocked */ __HAL_UNLOCK(hcan); - + + /* Request transmission */ + hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; + /* Enable Error warning, Error passive, Bus-off, - Last error and Error Interrupts */ + Last error and Error Interrupts */ __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR | CAN_IT_TME); - - /* Request transmission */ - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; } else { @@ -797,24 +822,70 @@ HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan) HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, uint32_t Timeout) { uint32_t tickstart = 0U; - + CanRxMsgTypeDef* pRxMsg = NULL; + /* Check the parameters */ assert_param(IS_CAN_FIFO(FIFONumber)); - + + /* Check if CAN state is not busy for RX FIFO0 */ + if ((FIFONumber == CAN_FIFO0) && ((hcan->State == HAL_CAN_STATE_BUSY_RX0) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0) || \ + (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1))) + { + return HAL_BUSY; + } + + /* Check if CAN state is not busy for RX FIFO1 */ + if ((FIFONumber == CAN_FIFO1) && ((hcan->State == HAL_CAN_STATE_BUSY_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1))) + { + return HAL_BUSY; + } + /* Process locked */ __HAL_LOCK(hcan); - - if(hcan->State == HAL_CAN_STATE_BUSY_TX) + + /* Change CAN state */ + if (FIFONumber == CAN_FIFO0) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + case(HAL_CAN_STATE_BUSY_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; + } } - else + else /* FIFONumber == CAN_FIFO1 */ { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + case(HAL_CAN_STATE_BUSY_RX0): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; + } } - + /* Get tick */ tickstart = HAL_GetTick(); @@ -833,35 +904,45 @@ HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, u } } } - + + /* Set RxMsg pointer */ + if(FIFONumber == CAN_FIFO0) + { + pRxMsg = hcan->pRxMsg; + } + else /* FIFONumber == CAN_FIFO1 */ + { + pRxMsg = hcan->pRx1Msg; + } + /* Get the Id */ - hcan->pRxMsg->IDE = (uint8_t)0x04U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - if (hcan->pRxMsg->IDE == CAN_ID_STD) + pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; + if (pRxMsg->IDE == CAN_ID_STD) { - hcan->pRxMsg->StdId = (uint32_t)0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U); + pRxMsg->StdId = 0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U); } else { - hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U); + pRxMsg->ExtId = 0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U); } - hcan->pRxMsg->RTR = (uint8_t)0x02U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; + pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; /* Get the DLC */ - hcan->pRxMsg->DLC = (uint8_t)0x0FU & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; + pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; /* Get the FMI */ - hcan->pRxMsg->FMI = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U); + pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U); /* Get the FIFONumber */ - hcan->pRxMsg->FIFONumber = FIFONumber; + pRxMsg->FIFONumber = FIFONumber; /* Get the data field */ - hcan->pRxMsg->Data[0U] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; - hcan->pRxMsg->Data[1U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U); - hcan->pRxMsg->Data[2U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U); - hcan->pRxMsg->Data[3U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U); - hcan->pRxMsg->Data[4U] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; - hcan->pRxMsg->Data[5U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U); - hcan->pRxMsg->Data[6U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U); - hcan->pRxMsg->Data[7U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U); - + pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; + pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U); + pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U); + pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U); + pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; + pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U); + pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U); + pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U); + /* Release the FIFO */ if(FIFONumber == CAN_FIFO0) { @@ -873,18 +954,45 @@ HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, u /* Release FIFO1 */ __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1); } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) + + /* Change CAN state */ + if (FIFONumber == CAN_FIFO0) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + default: /* HAL_CAN_STATE_BUSY_RX0 */ + hcan->State = HAL_CAN_STATE_READY; + break; + } } - else + else /* FIFONumber == CAN_FIFO1 */ { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + default: /* HAL_CAN_STATE_BUSY_RX1 */ + hcan->State = HAL_CAN_STATE_READY; + break; + } } - + /* Process unlocked */ __HAL_UNLOCK(hcan); @@ -901,59 +1009,98 @@ HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, u */ HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber) { - uint32_t tmp = 0U; - /* Check the parameters */ assert_param(IS_CAN_FIFO(FIFONumber)); - tmp = hcan->State; - if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_TX)) + /* Check if CAN state is not busy for RX FIFO0 */ + if((FIFONumber == CAN_FIFO0) && ((hcan->State == HAL_CAN_STATE_BUSY_RX0) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0) || \ + (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1))) { - /* Process locked */ - __HAL_LOCK(hcan); - - if(hcan->State == HAL_CAN_STATE_BUSY_TX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - - /* Set CAN error code to none */ - hcan->ErrorCode = HAL_CAN_ERROR_NONE; + return HAL_BUSY; + } - /* Enable Error warning, Error passive, Bus-off, - Last error and Error Interrupts */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG | - CAN_IT_EPV | - CAN_IT_BOF | - CAN_IT_LEC | - CAN_IT_ERR); + /* Check if CAN state is not busy for RX FIFO1 */ + if((FIFONumber == CAN_FIFO1) && ((hcan->State == HAL_CAN_STATE_BUSY_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) || \ + (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1))) + { + return HAL_BUSY; + } - /* Process unlocked */ - __HAL_UNLOCK(hcan); + /* Process locked */ + __HAL_LOCK(hcan); - if(FIFONumber == CAN_FIFO0) + /* Change CAN state */ + if(FIFONumber == CAN_FIFO0) + { + switch(hcan->State) { - /* Enable FIFO 0 message pending Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0); + case(HAL_CAN_STATE_BUSY_TX): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + case(HAL_CAN_STATE_BUSY_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; } - else + } + else /* FIFONumber == CAN_FIFO1 */ + { + switch(hcan->State) { - /* Enable FIFO 1 message pending Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP1); + case(HAL_CAN_STATE_BUSY_TX): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + case(HAL_CAN_STATE_BUSY_RX0): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0_RX1; + break; + default: /* HAL_CAN_STATE_READY */ + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; } - + } + /* Set CAN error code to none */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Enable interrupts: */ + /* - Enable Error warning Interrupt */ + /* - Enable Error passive Interrupt */ + /* - Enable Bus-off Interrupt */ + /* - Enable Last error code Interrupt */ + /* - Enable Error Interrupt */ + /* - Enable Transmit mailbox empty Interrupt */ + __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG | + CAN_IT_EPV | + CAN_IT_BOF | + CAN_IT_LEC | + CAN_IT_ERR | + CAN_IT_TME); + + /* Process unlocked */ + __HAL_UNLOCK(hcan); + + if(FIFONumber == CAN_FIFO0) + { + /* Enable FIFO 0 overrun and message pending Interrupt */ + __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0); } else { - return HAL_BUSY; + /* Enable FIFO 1 overrun and message pending Interrupt */ + __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1); } - + /* Return function status */ return HAL_OK; } @@ -976,7 +1123,7 @@ HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan) /* Request Sleep mode */ hcan->Instance->MCR = (((hcan->Instance->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - + /* Sleep mode status */ if ((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK) { @@ -986,8 +1133,8 @@ HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan) /* Return function status */ return HAL_ERROR; } - - /* Get tick */ + + /* Get tick */ tickstart = HAL_GetTick(); /* Wait the acknowledge */ @@ -1001,13 +1148,13 @@ HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan) return HAL_TIMEOUT; } } - + /* Change CAN state */ hcan->State = HAL_CAN_STATE_READY; - + /* Process unlocked */ __HAL_UNLOCK(hcan); - + /* Return function status */ return HAL_OK; } @@ -1074,7 +1221,32 @@ HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef* hcan) void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) { uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U; - + uint32_t errorcode = HAL_CAN_ERROR_NONE; + + /* Check Overrun flag for FIFO0 */ + tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0); + tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV0); + if(tmp1 && tmp2) + { + /* Set CAN error code to FOV0 error */ + errorcode |= HAL_CAN_ERROR_FOV0; + + /* Clear FIFO0 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0); + } + /* Check Overrun flag for FIFO1 */ + tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1); + tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV1); + + if(tmp1 && tmp2) + { + /* Set CAN error code to FOV1 error */ + errorcode |= HAL_CAN_ERROR_FOV1; + + /* Clear FIFO1 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1); + } + /* Check End of transmission flag */ if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME)) { @@ -1083,11 +1255,27 @@ void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2); if(tmp1 || tmp2 || tmp3) { - /* Call transmit function */ - CAN_Transmit_IT(hcan); + tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0); + tmp2 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1); + tmp3 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2); + /* Check Transmit success */ + if(tmp1 || tmp2 || tmp3) + { + /* Call transmit function */ + CAN_Transmit_IT(hcan); + } + else /* Transmit failure */ + { + /* Set CAN error code to TXFAIL error */ + errorcode |= HAL_CAN_ERROR_TXFAIL; + } + + /* Clear transmission status flags (RQCPx and TXOKx) */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \ + CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TXOK2); } } - + tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0); tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0); /* Check End of reception flag for FIFO0 */ @@ -1096,7 +1284,7 @@ void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) /* Call receive function */ CAN_Receive_IT(hcan, CAN_FIFO0); } - + tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1); tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1); /* Check End of reception flag for FIFO1 */ @@ -1105,7 +1293,10 @@ void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) /* Call receive function */ CAN_Receive_IT(hcan, CAN_FIFO1); } - + + /* Set error code in handle */ + hcan->ErrorCode |= errorcode; + tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EWG); tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EWG); tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR); @@ -1184,6 +1375,29 @@ void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) hcan->Instance->MSR = CAN_MSR_ERRI; /* Set the CAN state ready to be able to start again the process */ hcan->State = HAL_CAN_STATE_READY; + + /* Disable interrupts: */ + /* - Disable Error warning Interrupt */ + /* - Disable Error passive Interrupt */ + /* - Disable Bus-off Interrupt */ + /* - Disable Last error code Interrupt */ + /* - Disable Error Interrupt */ + /* - Disable FIFO 0 message pending Interrupt */ + /* - Disable FIFO 0 Overrun Interrupt */ + /* - Disable FIFO 1 message pending Interrupt */ + /* - Disable FIFO 1 Overrun Interrupt */ + /* - Disable Transmit mailbox empty Interrupt */ + __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG | + CAN_IT_EPV | + CAN_IT_BOF | + CAN_IT_LEC | + CAN_IT_ERR | + CAN_IT_FMP0| + CAN_IT_FOV0| + CAN_IT_FMP1| + CAN_IT_FOV1| + CAN_IT_TME); + /* Call Error callback function */ HAL_CAN_ErrorCallback(hcan); } @@ -1239,8 +1453,8 @@ __weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) */ /** @defgroup CAN_Exported_Functions_Group3 Peripheral State and Error functions - * @brief CAN Peripheral State functions - * + * @brief CAN Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State and Error functions ##### @@ -1294,25 +1508,31 @@ static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan) if(hcan->State == HAL_CAN_STATE_BUSY_TX) { /* Disable Error warning, Error passive, Bus-off, Last error code - and Error Interrupts */ + and Error Interrupts */ __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR ); } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - else + + /* Change CAN state */ + switch(hcan->State) { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0_RX1; + break; + default: /* HAL_CAN_STATE_BUSY_TX */ + hcan->State = HAL_CAN_STATE_READY; + break; } - + /* Transmission complete callback */ HAL_CAN_TxCpltCallback(hcan); @@ -1329,52 +1549,66 @@ static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan) */ static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber) { + uint32_t tmp1 = 0U; + CanRxMsgTypeDef* pRxMsg = NULL; + + /* Set RxMsg pointer */ + if(FIFONumber == CAN_FIFO0) + { + pRxMsg = hcan->pRxMsg; + } + else /* FIFONumber == CAN_FIFO1 */ + { + pRxMsg = hcan->pRx1Msg; + } + /* Get the Id */ - hcan->pRxMsg->IDE = (uint8_t)0x04U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - if (hcan->pRxMsg->IDE == CAN_ID_STD) + pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; + if (pRxMsg->IDE == CAN_ID_STD) { - hcan->pRxMsg->StdId = (uint32_t)0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U); + pRxMsg->StdId = 0x000007FFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21U); } else { - hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U); + pRxMsg->ExtId = 0x1FFFFFFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3U); } - hcan->pRxMsg->RTR = (uint8_t)0x02U & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; + pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; /* Get the DLC */ - hcan->pRxMsg->DLC = (uint8_t)0x0FU & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; + pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; /* Get the FIFONumber */ - hcan->pRxMsg->FIFONumber = FIFONumber; + pRxMsg->FIFONumber = FIFONumber; /* Get the FMI */ - hcan->pRxMsg->FMI = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U); + pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8U); /* Get the data field */ - hcan->pRxMsg->Data[0U] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; - hcan->pRxMsg->Data[1U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U); - hcan->pRxMsg->Data[2U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U); - hcan->pRxMsg->Data[3U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U); - hcan->pRxMsg->Data[4U] = (uint8_t)0xFFU & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; - hcan->pRxMsg->Data[5U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U); - hcan->pRxMsg->Data[6U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U); - hcan->pRxMsg->Data[7U] = (uint8_t)0xFFU & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U); + pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; + pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8U); + pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16U); + pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24U); + pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; + pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8U); + pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16U); + pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24U); /* Release the FIFO */ /* Release FIFO0 */ if (FIFONumber == CAN_FIFO0) { __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0); - - /* Disable FIFO 0 message pending Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP0); + + /* Disable FIFO 0 overrun and message pending Interrupt */ + __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0); } /* Release FIFO1 */ else /* FIFONumber == CAN_FIFO1 */ { __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1); - - /* Disable FIFO 1 message pending Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP1); + + /* Disable FIFO 1 overrun and message pending Interrupt */ + __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1); } - - if(hcan->State == HAL_CAN_STATE_BUSY_RX) + + tmp1 = hcan->State; + if((tmp1 == HAL_CAN_STATE_BUSY_RX0) || (tmp1 == HAL_CAN_STATE_BUSY_RX1)) { /* Disable Error warning, Error passive, Bus-off, Last error code and Error Interrupts */ @@ -1384,16 +1618,43 @@ static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONum CAN_IT_LEC | CAN_IT_ERR); } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) + + /* Change CAN state */ + if (FIFONumber == CAN_FIFO0) { - /* Disable CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX_RX0): + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX1; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX1; + break; + default: /* HAL_CAN_STATE_BUSY_RX0 */ + hcan->State = HAL_CAN_STATE_READY; + break; + } } - else + else /* FIFONumber == CAN_FIFO1 */ { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; + switch(hcan->State) + { + case(HAL_CAN_STATE_BUSY_TX_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX; + break; + case(HAL_CAN_STATE_BUSY_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_RX0; + break; + case(HAL_CAN_STATE_BUSY_TX_RX0_RX1): + hcan->State = HAL_CAN_STATE_BUSY_TX_RX0; + break; + default: /* HAL_CAN_STATE_BUSY_RX1 */ + hcan->State = HAL_CAN_STATE_READY; + break; + } } /* Receive complete callback */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c index 70d2e17..5df403e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_cec.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief CEC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the High Definition Multimedia Interface @@ -42,14 +42,14 @@ (#) Initialize the CEC registers by calling the HAL_CEC_Init() API. [..] - (@) This API (HAL_CEC_Init()) configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + (@) This API (HAL_CEC_Init()) configures also the low level Hardware (GPIO, CLOCK, CORTEX...) by calling the customed HAL_CEC_MspInit() API. @endverbatim ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -287,7 +287,7 @@ HAL_StatusTypeDef HAL_CEC_SetDeviceAddress(CEC_HandleTypeDef *hcec, uint16_t CEC if(CEC_OwnAddress != CEC_OWN_ADDRESS_NONE) { - hcec->Instance->CFGR |= ((uint32_t)CEC_OwnAddress<<16); + hcec->Instance->CFGR |= ((uint32_t)CEC_OwnAddress<<16U); } else { diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c index ff7571f..9a7d1c9 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_cortex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief CORTEX HAL module driver. * This file provides firmware functions to manage the following * functionalities of the CORTEX: @@ -26,7 +26,7 @@ function according to the following table. (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). - (#) please refer to programing manual for details in how to configure priority. + (#) please refer to programming manual for details in how to configure priority. -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. The pending IRQ priority will be managed only by the sub priority. @@ -45,7 +45,7 @@ (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which is a CMSIS function that: (++) Configures the SysTick Reload register with value passed as function parameter. - (++) Configures the SysTick IRQ priority to the lowest value (0x0FU). + (++) Configures the SysTick IRQ priority to the lowest value 0x0F. (++) Resets the SysTick Counter register. (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). (++) Enables the SysTick Interrupt. @@ -70,7 +70,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -269,6 +269,46 @@ uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) */ #if (__MPU_PRESENT == 1U) +/** + * @brief Disables the MPU + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + +/** + * @brief Enable the MPU. + * @param MPU_Control: Specifies the control mode of the MPU during hard fault, + * NMI, FAULTMASK and privileged access to the default memory + * This parameter can be one of the following values: + * @arg MPU_HFNMI_PRIVDEF_NONE + * @arg MPU_HARDFAULT_NMI + * @arg MPU_PRIVILEGED_DEFAULT + * @arg MPU_HFNMI_PRIVDEF + * @retval None + */ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + /** * @brief Initializes and configures the Region and the memory to be protected. * @param MPU_Init: Pointer to a MPU_Region_InitTypeDef structure that contains diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c index acf4a87..4b6802d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_crc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief CRC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Cyclic Redundancy Check (CRC) peripheral: @@ -32,7 +32,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c index 2717ac4..2836acd 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_cryp.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief CRYP HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Cryptography (CRYP) peripheral: @@ -70,7 +70,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -4071,8 +4071,8 @@ HAL_StatusTypeDef HAL_CRYP_Init(CRYP_HandleTypeDef *hcryp) #endif /* Reset CrypInCount and CrypOutCount */ - hcryp->CrypInCount = 0; - hcryp->CrypOutCount = 0; + hcryp->CrypInCount = 0U; + hcryp->CrypOutCount = 0U; /* Reset ErrorCode field */ hcryp->ErrorCode = HAL_CRYP_ERROR_NONE; @@ -4111,8 +4111,8 @@ HAL_StatusTypeDef HAL_CRYP_DeInit(CRYP_HandleTypeDef *hcryp) hcryp->Phase = HAL_CRYP_PHASE_READY; /* Reset CrypInCount and CrypOutCount */ - hcryp->CrypInCount = 0; - hcryp->CrypOutCount = 0; + hcryp->CrypInCount = 0U; + hcryp->CrypOutCount = 0U; /* Disable the CRYP Peripheral Clock */ __HAL_CRYP_DISABLE(); @@ -4956,7 +4956,7 @@ uint32_t HAL_CRYP_GetError(CRYP_HandleTypeDef *hcryp) */ static HAL_StatusTypeDef CRYP_SetKey(CRYP_HandleTypeDef *hcryp) { - uint32_t keyaddr = 0x0; + uint32_t keyaddr = 0x0U; if ((uint32_t)(hcryp->Init.pKey == NULL)) { @@ -4969,21 +4969,21 @@ static HAL_StatusTypeDef CRYP_SetKey(CRYP_HandleTypeDef *hcryp) if (hcryp->Init.KeySize == CRYP_KEYSIZE_256B) { hcryp->Instance->KEYR7 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR6 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR5 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR4 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; } hcryp->Instance->KEYR3 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR2 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR1 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR0 = __REV(*(uint32_t*)(keyaddr)); return HAL_OK; @@ -4997,15 +4997,15 @@ static HAL_StatusTypeDef CRYP_SetKey(CRYP_HandleTypeDef *hcryp) */ static HAL_StatusTypeDef CRYP_SetInitVector(CRYP_HandleTypeDef *hcryp) { - uint32_t ivaddr = 0x0; + uint32_t ivaddr = 0x0U; #if !defined(AES_CR_NPBLB) if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) { - hcryp->Instance->IVR3 = 0; - hcryp->Instance->IVR2 = 0; - hcryp->Instance->IVR1 = 0; - hcryp->Instance->IVR0 = 0; + hcryp->Instance->IVR3 = 0U; + hcryp->Instance->IVR2 = 0U; + hcryp->Instance->IVR1 = 0U; + hcryp->Instance->IVR0 = 0U; } else #endif @@ -5018,11 +5018,11 @@ static HAL_StatusTypeDef CRYP_SetInitVector(CRYP_HandleTypeDef *hcryp) ivaddr = (uint32_t)(hcryp->Init.pInitVect); hcryp->Instance->IVR3 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR2 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR1 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR0 = __REV(*(uint32_t*)(ivaddr)); } return HAL_OK; @@ -5040,8 +5040,8 @@ static HAL_StatusTypeDef CRYP_SetInitVector(CRYP_HandleTypeDef *hcryp) */ static HAL_StatusTypeDef CRYP_AES_IT(CRYP_HandleTypeDef *hcryp) { - uint32_t inputaddr = 0; - uint32_t outputaddr = 0; + uint32_t inputaddr = 0U; + uint32_t outputaddr = 0U; if(hcryp->State == HAL_CRYP_STATE_BUSY) { @@ -5052,14 +5052,14 @@ static HAL_StatusTypeDef CRYP_AES_IT(CRYP_HandleTypeDef *hcryp) /* Read the last available output block from the Data Output Register */ *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; + hcryp->pCrypOutBuffPtr += 16U; + hcryp->CrypOutCount -= 16U; } else @@ -5068,27 +5068,27 @@ static HAL_StatusTypeDef CRYP_AES_IT(CRYP_HandleTypeDef *hcryp) if (hcryp->Init.KeySize == CRYP_KEYSIZE_256B) { *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR7); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR6); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR5); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR4); - outputaddr+=4; + outputaddr+=4U; } *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR3); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR2); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR1); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR0); } /* In case of ciphering or deciphering, check if all output text has been retrieved; In case of key derivation, stop right there */ - if ((hcryp->CrypOutCount == 0) || (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)) + if ((hcryp->CrypOutCount == 0U) || (hcryp->Init.OperatingMode == CRYP_ALGOMODE_KEYDERIVATION)) { /* Disable Computation Complete Flag and Errors Interrupts */ __HAL_CRYP_DISABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE); @@ -5125,16 +5125,16 @@ static HAL_StatusTypeDef CRYP_AES_IT(CRYP_HandleTypeDef *hcryp) inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; /* Increment/decrement instance pointer/counter */ - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; /* Write the next input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); return HAL_OK; @@ -5146,10 +5146,6 @@ static HAL_StatusTypeDef CRYP_AES_IT(CRYP_HandleTypeDef *hcryp) } } -/** - * @} - */ - /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c index c34e6ff..41be67b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_cryp_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Extended CRYP HAL module driver * This file provides firmware functions to manage the following * functionalities of CRYP extension peripheral: @@ -69,7 +69,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -354,6 +354,9 @@ static HAL_StatusTypeDef CRYPEx_GCMCCM_SetHeaderPhase(CRYP_HandleTypeDef *hcryp, uint32_t loopcounter = 0U; uint32_t headeraddr = (uint32_t)Input; + /* Prevent unused argument(s) compilation warning */ + UNUSED(Ilength); + /***************************** Header phase *********************************/ if(hcryp->Init.HeaderSize != 0U) { @@ -507,8 +510,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t * uint32_t headeraddr = (uint32_t)hcryp->Init.Header; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; /* Process Locked */ @@ -526,8 +529,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t * /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -567,8 +570,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t * } /* Flags byte */ /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07U) */ - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2U))) >> 1U) & (uint8_t)0x07U) << 3U); - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15U) - hcryp->Init.IVSize) - (uint8_t)1U) & (uint8_t)0x07U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1U) & (uint8_t)0x07) << 3U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07); for (loopcounter = 0U; loopcounter < hcryp->Init.IVSize; loopcounter++) { @@ -1155,8 +1158,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t * uint32_t headeraddr = (uint32_t)hcryp->Init.Header; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; /* Process Locked */ @@ -1174,8 +1177,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t * /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -1560,8 +1563,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ uint32_t headeraddr = (uint32_t)hcryp->Init.Header; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; if(hcryp->State == HAL_CRYP_STATE_READY) @@ -1586,8 +1589,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -1627,8 +1630,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ } /* Flags byte */ /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07U) */ - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2U))) >> 1U) & (uint8_t)0x07U) << 3U); - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15U) - hcryp->Init.IVSize) - (uint8_t)1U) & (uint8_t)0x07U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1U) & (uint8_t)0x07) << 3U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07); for (loopcounter = 0U; loopcounter < hcryp->Init.IVSize; loopcounter++) { @@ -2006,8 +2009,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ uint32_t headeraddr = (uint32_t)hcryp->Init.Header; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; if(hcryp->State == HAL_CRYP_STATE_READY) @@ -2032,8 +2035,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -2073,8 +2076,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_ } /* Flags byte */ /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07U) */ - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2U))) >> 1U) & (uint8_t)0x07U) << 3U); - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15U) - hcryp->Init.IVSize) - (uint8_t)1U) & (uint8_t)0x07U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1U) & (uint8_t)0x07) << 3U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07); for (loopcounter = 0U; loopcounter < hcryp->Init.IVSize; loopcounter++) { @@ -2393,8 +2396,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 uint32_t headeraddr; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) @@ -2425,8 +2428,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -2466,8 +2469,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 } /* Flags byte */ /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07U) */ - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2U))) >> 1U) & (uint8_t)0x07U) << 3U); - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15U) - hcryp->Init.IVSize) - (uint8_t)1U) & (uint8_t)0x07U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07) << 3); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07); for (loopcounter = 0U; loopcounter < hcryp->Init.IVSize; loopcounter++) { @@ -2737,8 +2740,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 uint32_t headeraddr; uint32_t loopcounter = 0U; uint32_t bufferidx = 0U; - uint8_t blockb0[16U] = {0U};/* Block B0 */ - uint8_t ctr[16U] = {0U}; /* Counter */ + uint8_t blockb0[16U] = {0};/* Block B0 */ + uint8_t ctr[16U] = {0}; /* Counter */ uint32_t b0addr = (uint32_t)blockb0; if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) @@ -2769,8 +2772,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 /* Check that the associated data (or header) length is lower than 2^16 - 2^8 = 65536 - 256 = 65280 */ if(headersize < 65280U) { - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8U) & 0xFFU); - hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFFU); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize >> 8) & 0xFF); + hcryp->Init.pScratch[bufferidx++] = (uint8_t) ((headersize) & 0xFF); headersize += 2U; } else @@ -2810,8 +2813,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AESCCM_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8 } /* Flags byte */ /* blockb0[0] |= 0u | (((( (uint8_t) hcryp->Init.TagSize - 2) / 2) & 0x07 ) << 3 ) | ( ( (uint8_t) (15 - hcryp->Init.IVSize) - 1) & 0x07U) */ - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2U))) >> 1U) & (uint8_t)0x07U) << 3U); - blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15U) - hcryp->Init.IVSize) - (uint8_t)1U) & (uint8_t)0x07U); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)(((uint8_t)(hcryp->Init.TagSize - (uint8_t)(2))) >> 1) & (uint8_t)0x07) << 3); + blockb0[0U] |= (uint8_t)((uint8_t)((uint8_t)((uint8_t)(15) - hcryp->Init.IVSize) - (uint8_t)1) & (uint8_t)0x07); for (loopcounter = 0U; loopcounter < hcryp->Init.IVSize; loopcounter++) { @@ -3036,11 +3039,11 @@ void HAL_CRYPEx_GCMCCM_IRQHandler(CRYP_HandleTypeDef *hcryp) /** @defgroup CRYPEx_Private_Constants CRYPEx Private Constants * @{ */ -#define CRYP_CCF_TIMEOUTVALUE 22000 /*!< CCF flag raising time-out value */ -#define CRYP_BUSY_TIMEOUTVALUE 22000 /*!< BUSY flag reset time-out value */ +#define CRYP_CCF_TIMEOUTVALUE 22000U /*!< CCF flag raising time-out value */ +#define CRYP_BUSY_TIMEOUTVALUE 22000U /*!< BUSY flag reset time-out value */ -#define CRYP_POLLING_OFF 0x0 /*!< No polling when padding */ -#define CRYP_POLLING_ON 0x1 /*!< Polling when padding */ +#define CRYP_POLLING_OFF 0x0U /*!< No polling when padding */ +#define CRYP_POLLING_ON 0x1U /*!< Polling when padding */ /** * @} */ @@ -3169,7 +3172,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, } else { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -3216,8 +3219,6 @@ HAL_StatusTypeDef HAL_CRYPEx_AES(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, } } - - /** * @brief Carry out in interrupt mode the ciphering or deciphering operation according to * hcryp->Init structure fields, all operating modes (encryption, key derivation and/or decryption) and @@ -3236,7 +3237,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, */ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint16_t Size, uint8_t *pOutputData) { - uint32_t inputaddr = 0; + uint32_t inputaddr = 0U; if(hcryp->State == HAL_CRYP_STATE_READY) { @@ -3250,7 +3251,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputD } else { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -3277,8 +3278,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputD /* Enable Computation Complete Flag and Error Interrupts */ __HAL_CRYP_ENABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE); - - + /* If operating mode is key derivation only, the input data have already been entered during the initialization process. For the other operating modes, they are fed to the CRYP hardware @@ -3289,15 +3289,15 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputD the first input data */ inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; /* Increment/decrement instance pointer/counter */ - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; /* Write the first input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } @@ -3309,10 +3309,6 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputD return HAL_BUSY; } } - - - - /** * @brief Carry out in DMA mode the ciphering or deciphering operation according to @@ -3335,8 +3331,8 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputD */ HAL_StatusTypeDef HAL_CRYPEx_AES_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint16_t Size, uint8_t *pOutputData) { - uint32_t inputaddr = 0; - uint32_t outputaddr = 0; + uint32_t inputaddr = 0U; + uint32_t outputaddr = 0U; if (hcryp->State == HAL_CRYP_STATE_READY) { @@ -3349,13 +3345,12 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInput } else { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } } - - + /* Process Locked */ __HAL_LOCK(hcryp); @@ -3379,11 +3374,6 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInput return HAL_BUSY; } } - - - - - /** * @brief Carry out in polling mode the authentication tag generation as well as the ciphering or deciphering @@ -3413,22 +3403,22 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInput */ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData, uint32_t Timeout) { - uint32_t index = 0; - uint32_t inputaddr = 0; - uint32_t outputaddr = 0; - uint32_t tagaddr = 0; - uint64_t headerlength = 0; - uint64_t inputlength = 0; - uint64_t payloadlength = 0; - uint32_t difflength = 0; - uint32_t addhoc_process = 0; + uint32_t index = 0U; + uint32_t inputaddr = 0U; + uint32_t outputaddr = 0U; + uint32_t tagaddr = 0U; + uint64_t headerlength = 0U; + uint64_t inputlength = 0U; + uint64_t payloadlength = 0U; + uint32_t difflength = 0U; + uint32_t addhoc_process = 0U; if (hcryp->State == HAL_CRYP_STATE_READY) { /* input/output parameters check */ if (hcryp->Init.GCMCMACPhase == CRYP_HEADER_PHASE) { - if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0)) + if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0U)) { return HAL_ERROR; } @@ -3439,7 +3429,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput #endif { /* In case of CMAC (or CCM) header phase resumption, we can have pInputData = NULL and Size = 0 */ - if (((pInputData != NULL) && (Size == 0)) || ((pInputData == NULL) && (Size != 0))) + if (((pInputData != NULL) && (Size == 0U)) || ((pInputData == NULL) && (Size != 0U))) { return HAL_ERROR; } @@ -3447,7 +3437,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput } else if (hcryp->Init.GCMCMACPhase == CRYP_PAYLOAD_PHASE) { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -3467,8 +3457,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput return HAL_ERROR; } } - - + /* Process Locked */ __HAL_LOCK(hcryp); @@ -3518,21 +3507,21 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* in case of CMAC, enter B0 block in header phase, before the header itself. */ /* If Size = 0 (possible case of resumption after CMAC header phase suspension), skip these steps and go directly to header buffer feeding to the HW */ - if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (Size != 0)) + if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) && (Size != 0U)) { inputaddr = (uint32_t)pInputData; - for(index=0; (index < Size); index += 16) + for(index=0U; (index < Size); index += 16U) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK) { @@ -3545,7 +3534,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* If the suspension flag has been raised and if the processing is not about to end, suspend processing */ - if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < Size)) + if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16U) < Size)) { /* reset SuspendRequest */ hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE; @@ -3558,7 +3547,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; /* Save the total number of bytes (B blocks + header) that remain to be processed at this point */ - hcryp->CrypInCount = hcryp->Init.HeaderSize + Size - (index+16); + hcryp->CrypInCount = hcryp->Init.HeaderSize + Size - (index+16U); /* Process Unlocked */ __HAL_UNLOCK(hcryp); @@ -3573,22 +3562,22 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput inputaddr = (uint32_t)hcryp->Init.Header; /* Local variable headerlength is a number of bytes multiple of 128 bits, remaining header data (if any) are handled after this loop */ - headerlength = (((hcryp->Init.HeaderSize)/16)*16) ; - if ((hcryp->Init.HeaderSize % 16) != 0) + headerlength = (((hcryp->Init.HeaderSize)/16U)*16U) ; + if ((hcryp->Init.HeaderSize % 16U) != 0U) { difflength = (uint32_t) (hcryp->Init.HeaderSize - headerlength); } - for(index=0; index < headerlength; index += 16) + for(index=0U; index < headerlength; index += 16U) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK) { @@ -3601,7 +3590,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* If the suspension flag has been raised and if the processing is not about to end, suspend processing */ - if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < headerlength)) + if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16U) < headerlength)) { /* reset SuspendRequest */ hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE; @@ -3613,7 +3602,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Save current reading and writing locations of Input and Output buffers */ hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; /* Save the total number of bytes that remain to be processed at this point */ - hcryp->CrypInCount = hcryp->Init.HeaderSize - (index+16); + hcryp->CrypInCount = hcryp->Init.HeaderSize - (index+16U); /* Process Unlocked */ __HAL_UNLOCK(hcryp); @@ -3623,7 +3612,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput } /* Case header length is not a multiple of 16 bytes */ - if (difflength != 0) + if (difflength != 0U) { hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; CRYP_Padding(hcryp, difflength, CRYP_POLLING_ON); @@ -3651,30 +3640,30 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Enter payload */ /* Specific handling to manage payload last block size less than 128 bits */ - if ((Size % 16) != 0) + if ((Size % 16U) != 0U) { - payloadlength = (Size/16) * 16; + payloadlength = (Size/16U) * 16U; difflength = (uint32_t) (Size - payloadlength); - addhoc_process = 1; + addhoc_process = 1U; } else { payloadlength = Size; - addhoc_process = 0; + addhoc_process = 0U; } /* Feed payload */ - for(index=0; index < payloadlength; index += 16) + for(index=0U; index < payloadlength; index += 16U) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK) { @@ -3689,17 +3678,17 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Retrieve output data: read the output block from the Data Output Register */ *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; /* If the suspension flag has been raised and if the processing is not about to end, suspend processing */ - if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < payloadlength)) + if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16U) < payloadlength)) { /* no flag waiting under IRQ handling */ if (hcryp->Init.OperatingMode == CRYP_ALGOMODE_ENCRYPT) @@ -3723,7 +3712,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput hcryp->pCrypOutBuffPtr = (uint8_t *)outputaddr; hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; /* Save the number of bytes that remain to be processed at this point */ - hcryp->CrypInCount = Size - (index+16); + hcryp->CrypInCount = Size - (index+16U); /* Process Unlocked */ __HAL_UNLOCK(hcryp); @@ -3735,13 +3724,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Additional processing to manage GCM(/CCM) encryption and decryption cases when payload last block size less than 128 bits */ - if (addhoc_process == 1) + if (addhoc_process == 1U) { - hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; hcryp->pCrypOutBuffPtr = (uint8_t *)outputaddr; CRYP_Padding(hcryp, difflength, CRYP_POLLING_ON); - } /* (addhoc_process == 1) */ /* Mark that the payload phase is over */ @@ -3769,36 +3756,36 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC) { - headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */ - inputlength = Size * 8; /* input length in bits */ + headerlength = hcryp->Init.HeaderSize * 8U; /* Header length in bits */ + inputlength = Size * 8U; /* input length in bits */ if(hcryp->Init.DataType == CRYP_DATATYPE_1B) { - hcryp->Instance->DINR = __RBIT((headerlength)>>32); + hcryp->Instance->DINR = __RBIT((headerlength)>>32U); hcryp->Instance->DINR = __RBIT(headerlength); - hcryp->Instance->DINR = __RBIT((inputlength)>>32); + hcryp->Instance->DINR = __RBIT((inputlength)>>32U); hcryp->Instance->DINR = __RBIT(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_8B) { - hcryp->Instance->DINR = __REV((headerlength)>>32); + hcryp->Instance->DINR = __REV((headerlength)>>32U); hcryp->Instance->DINR = __REV(headerlength); - hcryp->Instance->DINR = __REV((inputlength)>>32); + hcryp->Instance->DINR = __REV((inputlength)>>32U); hcryp->Instance->DINR = __REV(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_16B) { - hcryp->Instance->DINR = __ROR((headerlength)>>32, 16); - hcryp->Instance->DINR = __ROR(headerlength, 16); - hcryp->Instance->DINR = __ROR((inputlength)>>32, 16); - hcryp->Instance->DINR = __ROR(inputlength, 16); + hcryp->Instance->DINR = __ROR((headerlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(headerlength, 16U); + hcryp->Instance->DINR = __ROR((inputlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(inputlength, 16U); } else if(hcryp->Init.DataType == CRYP_DATATYPE_32B) { - hcryp->Instance->DINR = (uint32_t)(headerlength>>32); + hcryp->Instance->DINR = (uint32_t)(headerlength>>32U); hcryp->Instance->DINR = (uint32_t)(headerlength); - hcryp->Instance->DINR = (uint32_t)(inputlength>>32); + hcryp->Instance->DINR = (uint32_t)(inputlength>>32U); hcryp->Instance->DINR = (uint32_t)(inputlength); } } @@ -3809,11 +3796,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Enter the last block made of a 128-bit value formatted from the original B0 packet. */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } #endif @@ -3828,11 +3815,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput /* Read the Auth TAG in the Data Out register */ *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; @@ -3898,14 +3885,14 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth(CRYP_HandleTypeDef *hcryp, uint8_t *pInput HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData) { - uint32_t inputaddr = 0; - uint64_t headerlength = 0; - uint64_t inputlength = 0; - uint32_t index = 0; - uint32_t addhoc_process = 0; - uint32_t difflength = 0; - uint32_t difflengthmod4 = 0; - uint32_t mask[3] = {0x0FF, 0x0FFFF, 0x0FFFFFF}; + uint32_t inputaddr = 0U; + uint64_t headerlength = 0U; + uint64_t inputlength = 0U; + uint32_t index = 0U; + uint32_t addhoc_process = 0U; + uint32_t difflength = 0U; + uint32_t difflengthmod4 = 0U; + uint32_t mask[3U] = {0x0FFU, 0x0FFFFU, 0x0FFFFFFU}; if (hcryp->State == HAL_CRYP_STATE_READY) @@ -3913,7 +3900,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn /* input/output parameters check */ if (hcryp->Init.GCMCMACPhase == CRYP_HEADER_PHASE) { - if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0)) + if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0U)) { return HAL_ERROR; } @@ -3924,7 +3911,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn #endif { /* In case of CMAC header phase resumption, we can have pInputData = NULL and Size = 0 */ - if (((pInputData != NULL) && (Size == 0)) || ((pInputData == NULL) && (Size != 0))) + if (((pInputData != NULL) && (Size == 0U)) || ((pInputData == NULL) && (Size != 0U))) { return HAL_ERROR; } @@ -3932,7 +3919,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn } else if (hcryp->Init.GCMCMACPhase == CRYP_PAYLOAD_PHASE) { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -3953,7 +3940,6 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn } } - /* Process Locked */ __HAL_LOCK(hcryp); @@ -3966,8 +3952,6 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn /* Enable Computation Complete Flag and Error Interrupts */ __HAL_CRYP_ENABLE_IT(CRYP_IT_CCFIE|CRYP_IT_ERRIE); - - /*==============================================*/ /* GCM/GMAC (or CCM when applicable) init phase */ /*==============================================*/ @@ -3996,7 +3980,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn However, in case of resumption after suspension, if all the B blocks have been entered (in that case, Size = 0), only the remainder of the non-processed header bytes are entered. */ - if (Size != 0) + if (Size != 0U) { hcryp->CrypInCount = Size + hcryp->Init.HeaderSize; hcryp->pCrypInBuffPtr = pInputData; @@ -4030,26 +4014,25 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn __HAL_CRYP_ENABLE(); /* Increment/decrement instance pointer/counter */ - if (hcryp->CrypInCount == 0) + if (hcryp->CrypInCount == 0U) { /* Case of no header */ hcryp->State = HAL_CRYP_STATE_READY; return HAL_OK; } - else if (hcryp->CrypInCount < 16) + else if (hcryp->CrypInCount < 16U) { - hcryp->CrypInCount = 0; - addhoc_process = 1; + hcryp->CrypInCount = 0U; + addhoc_process = 1U; difflength = (uint32_t) (hcryp->Init.HeaderSize); - difflengthmod4 = difflength%4; + difflengthmod4 = difflength%4U; } else { - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; } - - + #if defined(AES_CR_NPBLB) if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CCM_CMAC) #else @@ -4067,37 +4050,37 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn /* Enter header first block to initiate the process in the Data Input register */ - if (addhoc_process == 0) + if (addhoc_process == 0U) { /* Header has size equal or larger than 128 bits */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } else { /* Header has size less than 128 bits */ /* Enter complete words when possible */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } /* Enter incomplete word padded with zeroes if applicable (case of header length not a multiple of 32-bits) */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { - hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1]); + hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1U]); } /* Pad with zero-words to reach 128-bit long block and wrap-up header feeding to the IP */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - hcryp->Instance->DINR = 0; + hcryp->Instance->DINR = 0U; } } @@ -4124,7 +4107,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn } /* Specific handling to manage payload size less than 128 bits */ - if (Size < 16) + if (Size < 16U) { #if defined(AES_CR_NPBLB) /* In case of GCM encryption or CCM decryption, specify the number of padding @@ -4138,7 +4121,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn { /* Set NPBLB field in writing the number of padding bytes for the last block of payload */ - MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16 - difflength); + MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16U - difflength); } } #else @@ -4150,47 +4133,46 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn } #endif - /* Set hcryp->CrypInCount to 0 (no more data to enter) */ - hcryp->CrypInCount = 0; + hcryp->CrypInCount = 0U; /* Insert the last block (which size is inferior to 128 bits) padded with zeroes, to have a complete block of 128 bits */ difflength = (uint32_t) (Size); - difflengthmod4 = difflength%4; + difflengthmod4 = difflength%4U; /* Insert the last block (which size is inferior to 128 bits) padded with zeroes to have a complete block of 128 bits */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } /* If required, manage input data size not multiple of 32 bits */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { - hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1]); + hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1U]); } /* Wrap-up in padding with zero-words if applicable */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - hcryp->Instance->DINR = 0; + hcryp->Instance->DINR = 0U; } } else { /* Increment/decrement instance pointer/counter */ - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; /* Enter payload first block to initiate the process in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } } @@ -4216,36 +4198,36 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC) { - headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */ - inputlength = Size * 8; /* Input length in bits */ + headerlength = hcryp->Init.HeaderSize * 8U; /* Header length in bits */ + inputlength = Size * 8U; /* Input length in bits */ /* Write the number of bits in the header on 64 bits followed by the number of bits in the payload on 64 bits as well */ if(hcryp->Init.DataType == CRYP_DATATYPE_1B) { - hcryp->Instance->DINR = __RBIT((headerlength)>>32); + hcryp->Instance->DINR = __RBIT((headerlength)>>32U); hcryp->Instance->DINR = __RBIT(headerlength); - hcryp->Instance->DINR = __RBIT((inputlength)>>32); + hcryp->Instance->DINR = __RBIT((inputlength)>>32U); hcryp->Instance->DINR = __RBIT(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_8B) { - hcryp->Instance->DINR = __REV((headerlength)>>32); + hcryp->Instance->DINR = __REV((headerlength)>>32U); hcryp->Instance->DINR = __REV(headerlength); - hcryp->Instance->DINR = __REV((inputlength)>>32); + hcryp->Instance->DINR = __REV((inputlength)>>32U); hcryp->Instance->DINR = __REV(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_16B) { - hcryp->Instance->DINR = __ROR((headerlength)>>32, 16); - hcryp->Instance->DINR = __ROR(headerlength, 16); - hcryp->Instance->DINR = __ROR((inputlength)>>32, 16); - hcryp->Instance->DINR = __ROR(inputlength, 16); + hcryp->Instance->DINR = __ROR((headerlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(headerlength, 16U); + hcryp->Instance->DINR = __ROR((inputlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(inputlength, 16U); } else if(hcryp->Init.DataType == CRYP_DATATYPE_32B) { - hcryp->Instance->DINR = (uint32_t)(headerlength>>32); + hcryp->Instance->DINR = (uint32_t)(headerlength>>32U); hcryp->Instance->DINR = (uint32_t)(headerlength); - hcryp->Instance->DINR = (uint32_t)(inputlength>>32); + hcryp->Instance->DINR = (uint32_t)(inputlength>>32U); hcryp->Instance->DINR = (uint32_t)(inputlength); } } @@ -4256,13 +4238,13 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn /* Enter the last block made of a 128-bit value formatted from the original B0 packet. */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } #endif } @@ -4314,12 +4296,12 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pIn */ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pInputData, uint64_t Size, uint8_t *pOutputData) { - uint32_t inputaddr = 0; - uint32_t outputaddr = 0; - uint32_t tagaddr = 0; - uint64_t headerlength = 0; - uint64_t inputlength = 0; - uint64_t payloadlength = 0; + uint32_t inputaddr = 0U; + uint32_t outputaddr = 0U; + uint32_t tagaddr = 0U; + uint64_t headerlength = 0U; + uint64_t inputlength = 0U; + uint64_t payloadlength = 0U; if (hcryp->State == HAL_CRYP_STATE_READY) @@ -4327,7 +4309,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI /* input/output parameters check */ if (hcryp->Init.GCMCMACPhase == CRYP_HEADER_PHASE) { - if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0)) + if ((hcryp->Init.Header != NULL) && (hcryp->Init.HeaderSize == 0U)) { return HAL_ERROR; } @@ -4337,7 +4319,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_CMAC) #endif { - if ((pInputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -4345,7 +4327,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI } else if (hcryp->Init.GCMCMACPhase == CRYP_PAYLOAD_PHASE) { - if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0)) + if ((pInputData == NULL) || (pOutputData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -4365,8 +4347,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI return HAL_ERROR; } } - - + /* Process Locked */ __HAL_LOCK(hcryp); @@ -4420,11 +4401,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI inputaddr = (uint32_t)pInputData; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); if(CRYP_WaitOnCCFlag(hcryp, CRYP_CCF_TIMEOUTVALUE) != HAL_OK) @@ -4451,10 +4432,10 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI } inputaddr = (uint32_t)hcryp->Init.Header; - if ((hcryp->Init.HeaderSize % 16) != 0) + if ((hcryp->Init.HeaderSize % 16U) != 0U) { - if (hcryp->Init.HeaderSize < 16) + if (hcryp->Init.HeaderSize < 16U) { CRYP_Padding(hcryp, (uint32_t) (hcryp->Init.HeaderSize), CRYP_POLLING_OFF); @@ -4471,7 +4452,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI { /* Local variable headerlength is a number of bytes multiple of 128 bits, remaining header data (if any) are handled after this loop */ - headerlength = (((hcryp->Init.HeaderSize)/16)*16) ; + headerlength = (((hcryp->Init.HeaderSize)/16U)*16U) ; /* Store the ending transfer point */ hcryp->pCrypInBuffPtr = hcryp->Init.Header + headerlength; hcryp->CrypInCount = (uint32_t)(hcryp->Init.HeaderSize - headerlength); /* remainder */ @@ -4479,16 +4460,15 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI /* Set the input and output addresses and start DMA transfer */ /* (incomplete DMA transfer, will be wrapped up after completion of the first one (initiated here) with data padding */ - CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, headerlength, 0); + CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, headerlength, 0U); } } else { - hcryp->CrypInCount = 0; + hcryp->CrypInCount = 0U; /* Set the input address and start DMA transfer */ - CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, hcryp->Init.HeaderSize, 0); + CRYP_GCMCMAC_SetDMAConfig(hcryp, inputaddr, hcryp->Init.HeaderSize, 0U); } - } /*============================================*/ @@ -4518,11 +4498,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI MODIFY_REG(hcryp->Instance->CR, AES_CR_GCMPH, CRYP_PAYLOAD_PHASE); /* Specific handling to manage payload size less than 128 bits */ - if ((Size % 16) != 0) + if ((Size % 16U) != 0U) { inputaddr = (uint32_t)pInputData; outputaddr = (uint32_t)pOutputData; - if (Size < 16) + if (Size < 16U) { /* Block is now entered in polling mode, no actual gain in resorting to DMA */ hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; @@ -4540,7 +4520,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI } else { - payloadlength = (Size/16) * 16; + payloadlength = (Size/16U) * 16U; /* Store the ending transfer points */ hcryp->pCrypInBuffPtr = pInputData + payloadlength; @@ -4555,7 +4535,7 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI } else { - hcryp->CrypInCount = 0; + hcryp->CrypInCount = 0U; inputaddr = (uint32_t)pInputData; outputaddr = (uint32_t)pOutputData; @@ -4594,36 +4574,36 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI if (hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC) { - headerlength = hcryp->Init.HeaderSize * 8; /* Header length in bits */ - inputlength = Size * 8; /* input length in bits */ + headerlength = hcryp->Init.HeaderSize * 8U; /* Header length in bits */ + inputlength = Size * 8U; /* input length in bits */ /* Write the number of bits in the header on 64 bits followed by the number of bits in the payload on 64 bits as well */ if(hcryp->Init.DataType == CRYP_DATATYPE_1B) { - hcryp->Instance->DINR = __RBIT((headerlength)>>32); + hcryp->Instance->DINR = __RBIT((headerlength)>>32U); hcryp->Instance->DINR = __RBIT(headerlength); - hcryp->Instance->DINR = __RBIT((inputlength)>>32); + hcryp->Instance->DINR = __RBIT((inputlength)>>32U); hcryp->Instance->DINR = __RBIT(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_8B) { - hcryp->Instance->DINR = __REV((headerlength)>>32); + hcryp->Instance->DINR = __REV((headerlength)>>32U); hcryp->Instance->DINR = __REV(headerlength); - hcryp->Instance->DINR = __REV((inputlength)>>32); + hcryp->Instance->DINR = __REV((inputlength)>>32U); hcryp->Instance->DINR = __REV(inputlength); } else if(hcryp->Init.DataType == CRYP_DATATYPE_16B) { - hcryp->Instance->DINR = __ROR((headerlength)>>32, 16); - hcryp->Instance->DINR = __ROR(headerlength, 16); - hcryp->Instance->DINR = __ROR((inputlength)>>32, 16); - hcryp->Instance->DINR = __ROR(inputlength, 16); + hcryp->Instance->DINR = __ROR((headerlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(headerlength, 16U); + hcryp->Instance->DINR = __ROR((inputlength)>>32U, 16U); + hcryp->Instance->DINR = __ROR(inputlength, 16U); } else if(hcryp->Init.DataType == CRYP_DATATYPE_32B) { - hcryp->Instance->DINR = (uint32_t)(headerlength>>32); + hcryp->Instance->DINR = (uint32_t)(headerlength>>32U); hcryp->Instance->DINR = (uint32_t)(headerlength); - hcryp->Instance->DINR = (uint32_t)(inputlength>>32); + hcryp->Instance->DINR = (uint32_t)(inputlength>>32U); hcryp->Instance->DINR = (uint32_t)(inputlength); } } @@ -4636,13 +4616,13 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI /* Enter the last block made of a 128-bit value formatted from the original B0 packet. */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } #endif @@ -4658,11 +4638,11 @@ HAL_StatusTypeDef HAL_CRYPEx_AES_Auth_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pI __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR); /* Read the Auth TAG in the IN FIFO */ *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; - tagaddr+=4; + tagaddr+=4U; *(uint32_t*)(tagaddr) = hcryp->Instance->DOUTR; /* Mark that the final phase is over */ @@ -4730,11 +4710,11 @@ void HAL_CRYPEx_Read_IVRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output) uint32_t outputaddr = (uint32_t)Output; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR3); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR2); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR1); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->IVR0); } @@ -4754,11 +4734,11 @@ void HAL_CRYPEx_Write_IVRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input) uint32_t ivaddr = (uint32_t)Input; hcryp->Instance->IVR3 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR2 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR1 = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->IVR0 = __REV(*(uint32_t*)(ivaddr)); } @@ -4794,19 +4774,19 @@ void HAL_CRYPEx_Read_SuspendRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output } *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP7R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP6R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP5R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP4R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP3R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP2R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP1R); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->SUSP0R); } @@ -4824,19 +4804,19 @@ void HAL_CRYPEx_Write_SuspendRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input uint32_t ivaddr = (uint32_t)Input; hcryp->Instance->SUSP7R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP6R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP5R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP4R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP3R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP2R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP1R = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; + ivaddr+=4U; hcryp->Instance->SUSP0R = __REV(*(uint32_t*)(ivaddr)); } @@ -4858,21 +4838,21 @@ void HAL_CRYPEx_Read_KeyRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Output, ui if (KeySize == CRYP_KEYSIZE_256B) { *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR7); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR6); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR5); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR4); - keyaddr+=4; + keyaddr+=4U; } *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR3); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR2); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR1); - keyaddr+=4; + keyaddr+=4U; *(uint32_t*)(keyaddr) = __REV(hcryp->Instance->KEYR0); } @@ -4893,21 +4873,21 @@ void HAL_CRYPEx_Write_KeyRegisters(CRYP_HandleTypeDef *hcryp, uint8_t* Input, ui if (KeySize == CRYP_KEYSIZE_256B) { hcryp->Instance->KEYR7 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR6 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR5 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR4 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; } hcryp->Instance->KEYR3 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR2 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR1 = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; + keyaddr+=4U; hcryp->Instance->KEYR0 = __REV(*(uint32_t*)(keyaddr)); } @@ -4984,7 +4964,7 @@ void HAL_CRYPEx_ProcessSuspend(CRYP_HandleTypeDef *hcryp) */ static void CRYP_GCMCMAC_DMAInCplt(DMA_HandleTypeDef *hdma) { - uint32_t difflength = 0; + uint32_t difflength = 0U; CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; @@ -4994,11 +4974,11 @@ static void CRYP_GCMCMAC_DMAInCplt(DMA_HandleTypeDef *hdma) if (hcryp->Init.GCMCMACPhase == CRYP_HEADER_PHASE) { - if (hcryp->CrypInCount != 0) + if (hcryp->CrypInCount != 0U) { /* Last block is now entered in polling mode, no actual gain in resorting to DMA */ difflength = hcryp->CrypInCount; - hcryp->CrypInCount = 0; + hcryp->CrypInCount = 0U; CRYP_Padding(hcryp, difflength, CRYP_POLLING_OFF); } @@ -5025,7 +5005,7 @@ static void CRYP_GCMCMAC_DMAInCplt(DMA_HandleTypeDef *hdma) */ static void CRYP_GCMCMAC_DMAOutCplt(DMA_HandleTypeDef *hdma) { - uint32_t difflength = 0; + uint32_t difflength = 0U; CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; /* Disable the DMA transfer for output request */ @@ -5035,11 +5015,11 @@ static void CRYP_GCMCMAC_DMAOutCplt(DMA_HandleTypeDef *hdma) __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR); /* Initiate additional transfer to wrap-up data feeding to the IP */ - if (hcryp->CrypInCount != 0) + if (hcryp->CrypInCount != 0U) { /* Last block is now entered in polling mode, no actual gain in resorting to DMA */ difflength = hcryp->CrypInCount; - hcryp->CrypInCount = 0; + hcryp->CrypInCount = 0U; CRYP_Padding(hcryp, difflength, CRYP_POLLING_ON); } @@ -5070,8 +5050,6 @@ static void CRYP_GCMCMAC_DMAError(DMA_HandleTypeDef *hdma) __HAL_CRYP_CLEAR_FLAG(CRYP_ERR_CLEAR); } - - /** * @brief Handle CRYP block input/output data handling under interruption * for GCM, GMAC or CMAC chaining modes. @@ -5083,14 +5061,14 @@ static void CRYP_GCMCMAC_DMAError(DMA_HandleTypeDef *hdma) */ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) { - uint32_t inputaddr = 0x0; - uint32_t outputaddr = 0x0; - uint32_t index = 0x0; - uint32_t addhoc_process = 0; - uint32_t difflength = 0; - uint32_t difflengthmod4 = 0; - uint32_t mask[3] = {0x0FF, 0x0FFFF, 0x0FFFFFF}; - uint32_t intermediate_data[4] = {0}; + uint32_t inputaddr = 0x0U; + uint32_t outputaddr = 0x0U; + uint32_t index = 0x0U; + uint32_t addhoc_process = 0U; + uint32_t difflength = 0U; + uint32_t difflengthmod4 = 0U; + uint32_t mask[3] = {0x0FFU, 0x0FFFFU, 0x0FFFFFFU}; + uint32_t intermediate_data[4U] = {0U}; if(hcryp->State == HAL_CRYP_STATE_BUSY) { @@ -5121,7 +5099,7 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) else if (hcryp->Init.GCMCMACPhase == CRYP_HEADER_PHASE) { /* Check if all input header data have been entered */ - if (hcryp->CrypInCount == 0) + if (hcryp->CrypInCount == 0U) { /* Clear Computation Complete Flag */ __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR); @@ -5168,17 +5146,17 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; /* Increment/decrement instance pointer/counter */ - if (hcryp->CrypInCount < 16) + if (hcryp->CrypInCount < 16U) { difflength = hcryp->CrypInCount; - hcryp->CrypInCount = 0; - addhoc_process = 1; - difflengthmod4 = difflength%4; + hcryp->CrypInCount = 0U; + addhoc_process = 1U; + difflengthmod4 = difflength%4U; } else { - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; } #if defined(AES_CR_NPBLB) @@ -5197,36 +5175,36 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) } /* Write the Input block in the Data Input register */ - if (addhoc_process == 0) + if (addhoc_process == 0U) { hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } else { /* Header remainder has size less than 128 bits */ /* Enter complete words when possible */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } /* Enter incomplete word padded with zeroes if applicable (case of header length not a multiple of 32-bits) */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1]); } /* Pad with zero-words to reach 128-bit long block and wrap-up header feeding to the IP */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - hcryp->Instance->DINR = 0; + hcryp->Instance->DINR = 0U; } } @@ -5245,38 +5223,38 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) when GCM (or CCM when applicable) encryption or decryption is selected. Check here if the last block output data are read */ #if defined(AES_CR_NPBLB) - if ((hcryp->CrypOutCount < 16) && \ - (hcryp->CrypOutCount > 0)) + if ((hcryp->CrypOutCount < 16U) && \ + (hcryp->CrypOutCount > 0U)) #else if ((hcryp->Init.ChainingMode == CRYP_CHAINMODE_AES_GCM_GMAC) && \ - (hcryp->CrypOutCount < 16) && \ - (hcryp->CrypOutCount > 0)) + (hcryp->CrypOutCount < 16U) && \ + (hcryp->CrypOutCount > 0U)) #endif { - addhoc_process = 1; + addhoc_process = 1U; difflength = hcryp->CrypOutCount; - difflengthmod4 = difflength%4; - hcryp->CrypOutCount = 0; /* mark that no more output data will be needed */ + difflengthmod4 = difflength%4U; + hcryp->CrypOutCount = 0U; /* mark that no more output data will be needed */ /* Retrieve intermediate data */ - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { intermediate_data[index] = hcryp->Instance->DOUTR; } /* Retrieve last words of cyphered data */ /* First, retrieve complete output words */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { *(uint32_t*)(outputaddr) = intermediate_data[index]; - outputaddr+=4; + outputaddr+=4U; } /* Next, retrieve partial output word if applicable; at the same time, start masking intermediate data with a mask of zeros of same size than the padding applied to the last block of payload */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { - intermediate_data[difflength/4] &= mask[difflengthmod4-1]; - *(uint32_t*)(outputaddr) = intermediate_data[difflength/4]; + intermediate_data[difflength/4U] &= mask[difflengthmod4-1U]; + *(uint32_t*)(outputaddr) = intermediate_data[difflength/4U]; } #if !defined(AES_CR_NPBLB) @@ -5290,15 +5268,15 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) /* Before inserting the intermediate data, carry on masking operation with a mask of zeros of same size than the padding applied to the last block of payload */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - intermediate_data[(difflength+3)/4+index] = 0; + intermediate_data[(difflength+3U)/4U+index] = 0U; } /* Insert intermediate data to trigger an additional DOUTR reading round */ /* Clear Computation Complete Flag before entering new block */ __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR); - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { hcryp->Instance->DINR = intermediate_data[index]; } @@ -5326,28 +5304,28 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) } else { - if (hcryp->CrypOutCount != 0) + if (hcryp->CrypOutCount != 0U) { /* Usual case (different than GCM/CCM last block < 128 bits ciphering) */ /* Retrieve the last block available from the CRYP hardware block: read the output block from the Data Output Register */ *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; /* Increment/decrement instance pointer/counter */ - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; + hcryp->pCrypOutBuffPtr += 16U; + hcryp->CrypOutCount -= 16U; } #if !defined(AES_CR_NPBLB) else { /* Software work-around: additional DOUTR reading round to discard the data */ - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { intermediate_data[index] = hcryp->Instance->DOUTR; } @@ -5356,14 +5334,14 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) } /* Check if all output text has been retrieved */ - if (hcryp->CrypOutCount == 0) + if (hcryp->CrypOutCount == 0U) { #if !defined(AES_CR_NPBLB) /* Make sure that software-work around is not running before disabling the interruptions (indeed, if software work-around is running, the interruptions must not be disabled to allow the additional DOUTR reading round */ - if (addhoc_process == 0) + if (addhoc_process == 0U) #endif { /* Clear Computation Complete Flag */ @@ -5413,11 +5391,11 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; /* Usual input data feeding case */ - if (hcryp->CrypInCount < 16) + if (hcryp->CrypInCount < 16U) { difflength = (uint32_t) (hcryp->CrypInCount); - difflengthmod4 = difflength%4; - hcryp->CrypInCount = 0; + difflengthmod4 = difflength%4U; + hcryp->CrypInCount = 0U; #if defined(AES_CR_NPBLB) /* In case of GCM encryption or CCM decryption, specify the number of padding @@ -5429,7 +5407,7 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) { /* Set NPBLB field in writing the number of padding bytes for the last block of payload */ - MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16 - difflength); + MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16U - difflength); } #else /* Software workaround applied to GCM encryption only */ @@ -5442,40 +5420,38 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) /* Insert the last block (which size is inferior to 128 bits) padded with zeroes to have a complete block of 128 bits */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } /* If required, manage input data size not multiple of 32 bits */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { - hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1]); + hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1U]); } /* Wrap-up in padding with zero-words if applicable */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - hcryp->Instance->DINR = 0; - } - + hcryp->Instance->DINR = 0U; + } } else { - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; + hcryp->pCrypInBuffPtr += 16U; + hcryp->CrypInCount -= 16U; /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); } - - + return HAL_OK; } } @@ -5493,11 +5469,11 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) /* Retrieve the last expected data from the CRYP hardware block: read the output block from the Data Output Register */ *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; /* Disable Computation Complete Flag and Errors Interrupts */ @@ -5531,9 +5507,7 @@ HAL_StatusTypeDef CRYP_AES_Auth_IT(CRYP_HandleTypeDef *hcryp) return HAL_BUSY; } } - - - + /** * @brief Set the DMA configuration and start the DMA transfer * for GCM, GMAC or CMAC chainging modes. @@ -5553,7 +5527,7 @@ static void CRYP_GCMCMAC_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputa /* Set the DMA error callback */ hcryp->hdmain->XferErrorCallback = CRYP_GCMCMAC_DMAError; - if (outputaddr != 0) + if (outputaddr != 0U) { /* Set the output CRYP DMA transfer complete callback */ hcryp->hdmaout->XferCpltCallback = CRYP_GCMCMAC_DMAOutCplt; @@ -5565,24 +5539,22 @@ static void CRYP_GCMCMAC_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputa __HAL_CRYP_ENABLE(); /* Enable the DMA input stream */ - HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4); + HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4U); /* Enable the DMA input request */ SET_BIT(hcryp->Instance->CR, AES_CR_DMAINEN); - if (outputaddr != 0) + if (outputaddr != 0U) { /* Enable the DMA output stream */ - HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4); + HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4U); /* Enable the DMA output request */ SET_BIT(hcryp->Instance->CR, AES_CR_DMAOUTEN); } } - - /** * @brief Write/read input/output data in polling mode. * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains @@ -5595,22 +5567,22 @@ static void CRYP_GCMCMAC_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputa */ static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout) { - uint32_t index = 0; + uint32_t index = 0U; uint32_t inputaddr = (uint32_t)Input; uint32_t outputaddr = (uint32_t)Output; - for(index=0; (index < Ilength); index += 16) + for(index=0U; (index < Ilength); index += 16U) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; /* Wait for CCF flag to be raised */ if(CRYP_WaitOnCCFlag(hcryp, Timeout) != HAL_OK) @@ -5625,17 +5597,17 @@ static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* In /* Read the Output block from the Data Output Register */ *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = hcryp->Instance->DOUTR; - outputaddr+=4; + outputaddr+=4U; /* If the suspension flag has been raised and if the processing is not about to end, suspend processing */ - if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16) < Ilength)) + if ((hcryp->SuspendRequest == HAL_CRYP_SUSPEND) && ((index+16U) < Ilength)) { /* Reset SuspendRequest */ hcryp->SuspendRequest = HAL_CRYP_SUSPEND_NONE; @@ -5644,25 +5616,20 @@ static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* In hcryp->pCrypOutBuffPtr = (uint8_t *)outputaddr; hcryp->pCrypInBuffPtr = (uint8_t *)inputaddr; /* Save the number of bytes that remain to be processed at this point */ - hcryp->CrypInCount = Ilength - (index+16); + hcryp->CrypInCount = Ilength - (index+16U); /* Change the CRYP state */ hcryp->State = HAL_CRYP_STATE_SUSPENDED; return HAL_OK; } - - + } /* Return function status */ return HAL_OK; } - - - - /** * @brief Read derivative key in polling mode when CRYP hardware block is set * in key derivation operating mode (mode 2). @@ -5690,24 +5657,23 @@ static HAL_StatusTypeDef CRYP_ReadKey(CRYP_HandleTypeDef *hcryp, uint8_t* Output if (hcryp->Init.KeySize == CRYP_KEYSIZE_256B) { *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR7); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR6); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR5); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR4); - outputaddr+=4; + outputaddr+=4U; } *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR3); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR2); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR1); - outputaddr+=4; + outputaddr+=4U; *(uint32_t*)(outputaddr) = __REV(hcryp->Instance->KEYR0); - /* Return function status */ return HAL_OK; } @@ -5734,10 +5700,10 @@ static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uin hcryp->hdmaout->XferErrorCallback = CRYP_DMAError; /* Enable the DMA input stream */ - HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4); + HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DINR, Size/4U); /* Enable the DMA output stream */ - HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4); + HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUTR, outputaddr, Size/4U); /* Enable In and Out DMA requests */ SET_BIT(hcryp->Instance->CR, (AES_CR_DMAINEN | AES_CR_DMAOUTEN)); @@ -5746,7 +5712,6 @@ static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uin __HAL_CRYP_ENABLE(); } - /** * @brief Handle CRYP hardware block Timeout when waiting for CCF flag to be raised. * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains @@ -5756,7 +5721,7 @@ static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uin */ static HAL_StatusTypeDef CRYP_WaitOnCCFlag(CRYP_HandleTypeDef *hcryp, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Get timeout */ tickstart = HAL_GetTick(); @@ -5784,7 +5749,7 @@ static HAL_StatusTypeDef CRYP_WaitOnCCFlag(CRYP_HandleTypeDef *hcryp, uint32_t T */ static HAL_StatusTypeDef CRYP_WaitOnBusyFlagReset(CRYP_HandleTypeDef *hcryp, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Get timeout */ tickstart = HAL_GetTick(); @@ -5803,7 +5768,6 @@ static HAL_StatusTypeDef CRYP_WaitOnBusyFlagReset(CRYP_HandleTypeDef *hcryp, uin return HAL_OK; } - /** * @brief DMA CRYP Input Data process complete callback. * @param hdma: DMA handle. @@ -5872,12 +5836,12 @@ static void CRYP_DMAError(DMA_HandleTypeDef *hdma) */ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_t polling) { - uint32_t index = 0; - uint32_t difflengthmod4 = difflength%4; + uint32_t index = 0U; + uint32_t difflengthmod4 = difflength%4U; uint32_t inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; uint32_t outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - uint32_t mask[3] = {0x0FF, 0x0FFFF, 0x0FFFFFF}; - uint32_t intermediate_data[4] = {0}; + uint32_t mask[3U] = {0x0FFU, 0x0FFFFU, 0x0FFFFFFU}; + uint32_t intermediate_data[4U] = {0U}; #if defined(AES_CR_NPBLB) /* In case of GCM encryption or CCM decryption, specify the number of padding @@ -5891,7 +5855,7 @@ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_ { /* Set NPBLB field in writing the number of padding bytes for the last block of payload */ - MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16 - difflength); + MODIFY_REG(hcryp->Instance->CR, AES_CR_NPBLB, 16U - difflength); } } #else @@ -5906,22 +5870,22 @@ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_ /* Wrap-up entering header or payload data */ /* Enter complete words when possible */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { /* Write the Input block in the Data Input register */ hcryp->Instance->DINR = *(uint32_t*)(inputaddr); - inputaddr+=4; + inputaddr+=4U; } /* Enter incomplete word padded with zeroes if applicable (case of header length not a multiple of 32-bits) */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { hcryp->Instance->DINR = ((*(uint32_t*)(inputaddr)) & mask[difflengthmod4-1]); } /* Pad with zero-words to reach 128-bit long block and wrap-up header feeding to the IP */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - hcryp->Instance->DINR = 0; + hcryp->Instance->DINR = 0U; } if (polling == CRYP_POLLING_ON) @@ -5942,28 +5906,27 @@ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_ { /* Retrieve intermediate data */ - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { intermediate_data[index] = hcryp->Instance->DOUTR; } /* Retrieve last words of cyphered data */ /* First, retrieve complete output words */ - for(index=0; index < (difflength/4); index ++) + for(index=0U; index < (difflength/4U); index ++) { *(uint32_t*)(outputaddr) = intermediate_data[index]; - outputaddr+=4; + outputaddr+=4U; } /* Next, retrieve partial output word if applicable; at the same time, start masking intermediate data with a mask of zeros of same size than the padding applied to the last block of payload */ - if (difflengthmod4 != 0) + if (difflengthmod4 != 0U) { - intermediate_data[difflength/4] &= mask[difflengthmod4-1]; - *(uint32_t*)(outputaddr) = intermediate_data[difflength/4]; - } - - + intermediate_data[difflength/4U] &= mask[difflengthmod4-1U]; + *(uint32_t*)(outputaddr) = intermediate_data[difflength/4U]; + } + #if !defined(AES_CR_NPBLB) /* Software workaround applied to GCM encryption only, applicable for AES IP v2 version (where NPBLB is not defined) */ @@ -5977,12 +5940,12 @@ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_ /* Before inserting the intermediate data, carry on masking operation with a mask of zeros of same size than the padding applied to the last block of payload */ - for(index=0; index < (4 - ((difflength+3)/4)); index ++) + for(index=0U; index < (4U - ((difflength+3U)/4U)); index ++) { - intermediate_data[(difflength+3)/4+index] = 0; + intermediate_data[(difflength+3U)/4U+index] = 0U; } /* Insert intermediate data */ - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { hcryp->Instance->DINR = intermediate_data[index]; } @@ -5998,7 +5961,7 @@ static void CRYP_Padding(CRYP_HandleTypeDef *hcryp, uint32_t difflength, uint32_ /* Read data to discard */ /* Clear CCF Flag */ __HAL_CRYP_CLEAR_FLAG(CRYP_CCF_CLEAR); - for(index=0; index < 4; index ++) + for(index=0U; index < 4U; index ++) { intermediate_data[index] = hcryp->Instance->DOUTR; } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c index e8a08c7..58d1d34 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dac.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DAC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Digital to Analog Converter (DAC) peripheral: @@ -141,7 +141,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c index e53d701..fa77f7e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dac_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DAC HAL module driver. * This file provides firmware functions to manage the following * functionalities of DAC extension peripheral: @@ -25,7 +25,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c index 8f74012..06c45dd 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dcmi.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DCMI HAL module driver * This file provides firmware functions to manage the following * functionalities of the Digital Camera Interface (DCMI) peripheral: @@ -63,7 +63,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -108,7 +108,7 @@ defined(STM32F479xx) /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ -#define HAL_TIMEOUT_DCMI_STOP ((uint32_t)14U) /* Set timeout to 1s */ +#define HAL_TIMEOUT_DCMI_STOP 14U /* Set timeout to 1s */ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ @@ -317,8 +317,8 @@ HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mo hdcmi->DMA_Handle->XferAbortCallback = NULL; /* Reset transfer counters value */ - hdcmi->XferCount = 0; - hdcmi->XferTransferNumber = 0; + hdcmi->XferCount = 0U; + hdcmi->XferTransferNumber = 0U; if(Length <= 0xFFFFU) { @@ -386,7 +386,7 @@ HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi) /* Check if the DCMI capture effectively disabled */ do { - if (count-- == 0) + if (count-- == 0U) { /* Update error code */ hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT; @@ -394,7 +394,7 @@ HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi) status = HAL_TIMEOUT; } } - while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0); + while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U); /* Disable the DCMI */ __HAL_DCMI_DISABLE(hdcmi); @@ -415,6 +415,12 @@ HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi) return status; } +/** + * @brief Suspend DCMI capture + * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi) { __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP; @@ -434,7 +440,7 @@ HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi) /* Check if the DCMI capture effectively disabled */ do { - if (count-- == 0) + if (count-- == 0U) { /* Update error code */ hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT; @@ -794,7 +800,7 @@ static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma) DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - if(hdcmi->XferCount != 0) + if(hdcmi->XferCount != 0U) { /* Update memory 0 address location */ tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.c index 858c318..cc084aa 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dcmi_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DCMI Extension HAL module driver * This file provides firmware functions to manage the following * functionalities of DCMI extension peripheral: @@ -27,7 +27,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -80,18 +80,11 @@ * @{ */ -/** @defgroup DCMIEx_Exported_Functions_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the DCMI - (+) De-initialize the DCMI - -@endverbatim +/** + * @} + */ + +/** @addtogroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions * @{ */ @@ -172,10 +165,6 @@ HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi) return HAL_OK; } - -/** - * @} - */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c index 112135c..245e33b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dfsdm.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file provides firmware functions to manage the following * functionalities of the Digital Filter for Sigma-Delta Modulators * (DFSDM) peripherals: @@ -161,7 +161,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -234,10 +234,17 @@ #if defined (DFSDM2_Channel0) #define DFSDM2_CHANNEL_NUMBER 8U #endif /* DFSDM2_Channel0 */ + /** * @} */ +/** @addtogroup DFSDM_Private_Macros +* @{ +*/ +/** + * @} + */ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /** @defgroup DFSDM_Private_Variables DFSDM Private Variables @@ -269,6 +276,7 @@ static void DFSDM_DMARegularConvCplt(DMA_HandleTypeDef *hdma); static void DFSDM_DMAInjectedHalfConvCplt(DMA_HandleTypeDef *hdma); static void DFSDM_DMAInjectedConvCplt(DMA_HandleTypeDef *hdma); static void DFSDM_DMAError(DMA_HandleTypeDef *hdma); + /** * @} */ @@ -2132,7 +2140,7 @@ int32_t HAL_DFSDM_FilterGetRegularValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filte uint32_t *Channel) { uint32_t reg = 0U; - int32_t value = 0U; + int32_t value = 0; /* Check parameters */ assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); @@ -2143,7 +2151,7 @@ int32_t HAL_DFSDM_FilterGetRegularValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filte /* Extract channel and regular conversion value */ *Channel = (reg & DFSDM_FLTRDATAR_RDATACH); - value = ((reg & DFSDM_FLTRDATAR_RDATA) >> DFSDM_FLTRDATAR_DATA_OFFSET); + value = ((int32_t)(reg & DFSDM_FLTRDATAR_RDATA) >> DFSDM_FLTRDATAR_DATA_OFFSET); /* return regular conversion value */ return value; @@ -2542,7 +2550,7 @@ int32_t HAL_DFSDM_FilterGetInjectedValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filt uint32_t *Channel) { uint32_t reg = 0U; - int32_t value = 0U; + int32_t value = 0; /* Check parameters */ assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); @@ -2553,7 +2561,7 @@ int32_t HAL_DFSDM_FilterGetInjectedValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filt /* Extract channel and injected conversion value */ *Channel = (reg & DFSDM_FLTJDATAR_JDATACH); - value = ((reg & DFSDM_FLTJDATAR_JDATA) >> DFSDM_FLTJDATAR_DATA_OFFSET); + value = ((int32_t)(reg & DFSDM_FLTJDATAR_JDATA) >> DFSDM_FLTJDATAR_DATA_OFFSET); /* return regular conversion value */ return value; @@ -2727,7 +2735,7 @@ int32_t HAL_DFSDM_FilterGetExdMaxValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter uint32_t *Channel) { uint32_t reg = 0U; - int32_t value = 0U; + int32_t value = 0; /* Check parameters */ assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); @@ -2738,7 +2746,7 @@ int32_t HAL_DFSDM_FilterGetExdMaxValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter /* Extract channel and extreme detector maximum value */ *Channel = (reg & DFSDM_FLTEXMAX_EXMAXCH); - value = ((reg & DFSDM_FLTEXMAX_EXMAX) >> DFSDM_FLTEXMAX_DATA_OFFSET); + value = ((int32_t)(reg & DFSDM_FLTEXMAX_EXMAX) >> DFSDM_FLTEXMAX_DATA_OFFSET); /* return extreme detector maximum value */ return value; @@ -2755,7 +2763,7 @@ int32_t HAL_DFSDM_FilterGetExdMinValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter uint32_t *Channel) { uint32_t reg = 0U; - int32_t value = 0U; + int32_t value = 0; /* Check parameters */ assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance)); @@ -2766,7 +2774,7 @@ int32_t HAL_DFSDM_FilterGetExdMinValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter /* Extract channel and extreme detector minimum value */ *Channel = (reg & DFSDM_FLTEXMIN_EXMINCH); - value = ((reg & DFSDM_FLTEXMIN_EXMIN) >> DFSDM_FLTEXMIN_DATA_OFFSET); + value = ((int32_t)(reg & DFSDM_FLTEXMIN_EXMIN) >> DFSDM_FLTEXMIN_DATA_OFFSET); /* return extreme detector minimum value */ return value; @@ -3152,7 +3160,7 @@ uint32_t HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) * @verbatim ============================================================================== - ##### Filter state functions ##### + ##### Filter MultiChannel operation functions ##### ============================================================================== [..] This section provides functions allowing to: (+) Control the DFSDM Multi channel delay block @@ -3162,7 +3170,8 @@ uint32_t HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDef *hdfsdm_filter) #if defined(SYSCFG_MCHDLYCR_BSCKSEL) /** * @brief Select the DFSDM2 as clock source for the bitstream clock. - * @retval None + * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called + * before HAL_DFSDM_BitstreamClock_Start() */ void HAL_DFSDM_BitstreamClock_Start(void) { @@ -3176,11 +3185,13 @@ void HAL_DFSDM_BitstreamClock_Start(void) /** * @brief Stop the DFSDM2 as clock source for the bitstream clock. + * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called + * before HAL_DFSDM_BitstreamClock_Stop() * @retval None */ void HAL_DFSDM_BitstreamClock_Stop(void) { - uint32_t tmp = 0; + uint32_t tmp = 0U; tmp = SYSCFG->MCHDLYCR; tmp = (tmp &(~SYSCFG_MCHDLYCR_BSCKSEL)); @@ -3192,11 +3203,13 @@ void HAL_DFSDM_BitstreamClock_Stop(void) * @brief Disable Delay Clock for DFSDM1/2. * @param MCHDLY: HAL_MCHDLY_CLOCK_DFSDM2. * HAL_MCHDLY_CLOCK_DFSDM1. + * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called + * before HAL_DFSDM_DisableDelayClock() * @retval None */ void HAL_DFSDM_DisableDelayClock(uint32_t MCHDLY) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DELAY_CLOCK(MCHDLY)); @@ -3216,12 +3229,14 @@ void HAL_DFSDM_DisableDelayClock(uint32_t MCHDLY) /** * @brief Enable Delay Clock for DFSDM1/2. * @param MCHDLY: HAL_MCHDLY_CLOCK_DFSDM2. - * HAL_MCHDLY_CLOCK_DFSDM1. + * HAL_MCHDLY_CLOCK_DFSDM1. + * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called + * before HAL_DFSDM_EnableDelayClock() * @retval None */ void HAL_DFSDM_EnableDelayClock(uint32_t MCHDLY) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DELAY_CLOCK(MCHDLY)); @@ -3233,26 +3248,27 @@ void HAL_DFSDM_EnableDelayClock(uint32_t MCHDLY) /** * @brief Select the source for CKin signals for DFSDM1/2. - * @param source: HAL_DFSDM2_CKIN_PAD. - * HAL_DFSDM2_CKIN_DM. - * HAL_DFSDM1_CKIN_PAD. - * HAL_DFSDM1_CKIN_DM. + * @param source: DFSDM2_CKIN_PAD. + * DFSDM2_CKIN_DM. + * DFSDM1_CKIN_PAD. + * DFSDM1_CKIN_DM. * @retval None */ void HAL_DFSDM_ClockIn_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_CLOCKIN_SELECTION(source)); tmp = SYSCFG->MCHDLYCR; + if((source == HAL_DFSDM2_CKIN_PAD) || (source == HAL_DFSDM2_CKIN_DM)) { tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CFG); if(source == HAL_DFSDM2_CKIN_PAD) { - source = 0x000000; + source = 0x000000U; } } else @@ -3265,15 +3281,15 @@ void HAL_DFSDM_ClockIn_SourceSelection(uint32_t source) /** * @brief Select the source for CKOut signals for DFSDM1/2. - * @param source: HAL_DFSDM2_CKOUT_DFSDM2. - * HAL_DFSDM2_CKOUT_M27. - * HAL_DFSDM1_CKOUT_DFSDM1. - * HAL_DFSDM1_CKOUT_M27. + * @param source: DFSDM2_CKOUT_DFSDM2. + * DFSDM2_CKOUT_M27. + * DFSDM1_CKOUT_DFSDM1. + * DFSDM1_CKOUT_M27. * @retval None */ void HAL_DFSDM_ClockOut_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_CLOCKOUT_SELECTION(source)); @@ -3285,7 +3301,7 @@ void HAL_DFSDM_ClockOut_SourceSelection(uint32_t source) if(source == HAL_DFSDM2_CKOUT_DFSDM2) { - source = 0x000; + source = 0x000U; } } else @@ -3298,15 +3314,15 @@ void HAL_DFSDM_ClockOut_SourceSelection(uint32_t source) /** * @brief Select the source for DataIn0 signals for DFSDM1/2. - * @param source: HAL_DATAIN0_DFSDM2_PAD. - * HAL_DATAIN0_DFSDM2_DATAIN1. - * HAL_DATAIN0_DFSDM1_PAD. - * HAL_DATAIN0_DFSDM1_DATAIN1. + * @param source: DATAIN0_DFSDM2_PAD. + * DATAIN0_DFSDM2_DATAIN1. + * DATAIN0_DFSDM1_PAD. + * DATAIN0_DFSDM1_DATAIN1. * @retval None */ void HAL_DFSDM_DataIn0_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DATAIN0_SRC_SELECTION(source)); @@ -3317,7 +3333,7 @@ void HAL_DFSDM_DataIn0_SourceSelection(uint32_t source) tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D0SEL); if(source == HAL_DATAIN0_DFSDM2_PAD) { - source = 0x00000; + source = 0x00000U; } } else @@ -3329,15 +3345,15 @@ void HAL_DFSDM_DataIn0_SourceSelection(uint32_t source) /** * @brief Select the source for DataIn2 signals for DFSDM1/2. - * @param source: HAL_DATAIN2_DFSDM2_PAD. - * HAL_DATAIN2_DFSDM2_DATAIN3. - * HAL_DATAIN2_DFSDM1_PAD. - * HAL_DATAIN2_DFSDM1_DATAIN3. + * @param source: DATAIN2_DFSDM2_PAD. + * DATAIN2_DFSDM2_DATAIN3. + * DATAIN2_DFSDM1_PAD. + * DATAIN2_DFSDM1_DATAIN3. * @retval None */ void HAL_DFSDM_DataIn2_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DATAIN2_SRC_SELECTION(source)); @@ -3348,7 +3364,7 @@ void HAL_DFSDM_DataIn2_SourceSelection(uint32_t source) tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2D2SEL); if (source == HAL_DATAIN2_DFSDM2_PAD) { - source = 0x0000; + source = 0x0000U; } } else @@ -3360,13 +3376,13 @@ void HAL_DFSDM_DataIn2_SourceSelection(uint32_t source) /** * @brief Select the source for DataIn4 signals for DFSDM2. - * @param source: HAL_DATAIN4_DFSDM2_PAD. - * HAL_DATAIN4_DFSDM2_DATAIN5 + * @param source: DATAIN4_DFSDM2_PAD. + * DATAIN4_DFSDM2_DATAIN5 * @retval None */ void HAL_DFSDM_DataIn4_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DATAIN4_SRC_SELECTION(source)); @@ -3378,13 +3394,13 @@ void HAL_DFSDM_DataIn4_SourceSelection(uint32_t source) /** * @brief Select the source for DataIn6 signals for DFSDM2. - * @param source: HAL_DATAIN6_DFSDM2_PAD. - * HAL_DATAIN6_DFSDM2_DATAIN7. + * @param source: DATAIN6_DFSDM2_PAD. + * DATAIN6_DFSDM2_DATAIN7. * @retval None */ void HAL_DFSDM_DataIn6_SourceSelection(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_DATAIN6_SRC_SELECTION(source)); @@ -3398,31 +3414,25 @@ void HAL_DFSDM_DataIn6_SourceSelection(uint32_t source) /** * @brief Configure the distribution of the bitstream clock gated from TIM4_OC * for DFSDM1 or TIM3_OC for DFSDM2 - * @param source: HAL_DFSDM1_CLKIN0_TIM4OC2 - * HAL_DFSDM1_CLKIN2_TIM4OC2 - * HAL_DFSDM1_CLKIN1_TIM4OC1 - * HAL_DFSDM1_CLKIN3_TIM4OC1 - * HAL_DFSDM2_CLKIN0_TIM3OC4 - * HAL_DFSDM2_CLKIN4_TIM3OC4 - * HAL_DFSDM2_CLKIN1_TIM3OC3 - * HAL_DFSDM2_CLKIN5_TIM3OC3 - * HAL_DFSDM2_CLKIN2_TIM3OC2 - * HAL_DFSDM2_CLKIN6_TIM3OC2 - * HAL_DFSDM2_CLKIN3_TIM3OC1 - * HAL_DFSDM2_CLKIN7_TIM3OC1 + * @param source: DFSDM1_CLKIN0_TIM4OC2 + * DFSDM1_CLKIN2_TIM4OC2 + * DFSDM1_CLKIN1_TIM4OC1 + * DFSDM1_CLKIN3_TIM4OC1 + * DFSDM2_CLKIN0_TIM3OC4 + * DFSDM2_CLKIN4_TIM3OC4 + * DFSDM2_CLKIN1_TIM3OC3 + * DFSDM2_CLKIN5_TIM3OC3 + * DFSDM2_CLKIN2_TIM3OC2 + * DFSDM2_CLKIN6_TIM3OC2 + * DFSDM2_CLKIN3_TIM3OC1 + * DFSDM2_CLKIN7_TIM3OC1 * @retval None */ void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source) { - uint32_t tmp = 0; + uint32_t tmp = 0U; assert_param(IS_DFSDM_BITSTREM_CLK_DISTRIBUTION(source)); - if((source == HAL_DFSDM1_CLKIN0_TIM4OC2) ||(source == HAL_DFSDM1_CLKIN1_TIM4OC1)|| - (source == HAL_DFSDM2_CLKIN0_TIM3OC4) ||(source == HAL_DFSDM2_CLKIN1_TIM3OC3)|| - (source == HAL_DFSDM2_CLKIN2_TIM3OC2) ||(source == HAL_DFSDM2_CLKIN3_TIM3OC1)) - { - source = 0x0000; - } tmp = SYSCFG->MCHDLYCR; @@ -3450,10 +3460,53 @@ void HAL_DFSDM_BitStreamClkDistribution_Config(uint32_t source) { tmp = (tmp & ~SYSCFG_MCHDLYCR_DFSDM2CK37SEL); } - + + if((source == HAL_DFSDM1_CLKIN0_TIM4OC2) ||(source == HAL_DFSDM1_CLKIN1_TIM4OC1)|| + (source == HAL_DFSDM2_CLKIN0_TIM3OC4) ||(source == HAL_DFSDM2_CLKIN1_TIM3OC3)|| + (source == HAL_DFSDM2_CLKIN2_TIM3OC2) ||(source == HAL_DFSDM2_CLKIN3_TIM3OC1)) + { + source = 0x0000U; + } + SYSCFG->MCHDLYCR = (source|tmp); } +/** + * @brief Configure multi channel delay block: Use DFSDM2 audio clock source as input + * clock for DFSDM1 and DFSDM2 filters to Synchronize DFSDMx filters. + * Set the path of the DFSDM2 clock output (dfsdm2_ckout) to the + * DFSDM1/2 CkInx and data inputs channels by configuring following MCHDLY muxes + * or demuxes: M1, M2, M3, M4, M5, M6, M7, M8, DM1, DM2, DM3, DM4, DM5, DM6, + * M9, M10, M11, M12, M13, M14, M15, M16, M17, M18, M19, M20 based on the + * contains of the DFSDM_MultiChannelConfigTypeDef structure + * @param mchdlystruct: Structure of multi channel configuration + * @retval None + * @note The SYSCFG clock marco __HAL_RCC_SYSCFG_CLK_ENABLE() must be called + * before HAL_DFSDM_ConfigMultiChannelDelay() + * @note The HAL_DFSDM_ConfigMultiChannelDelay() function clears the SYSCFG-MCHDLYCR + * register before setting the new configuration. + */ +void HAL_DFSDM_ConfigMultiChannelDelay(DFSDM_MultiChannelConfigTypeDef* mchdlystruct) +{ + uint32_t mchdlyreg = 0U; + + assert_param(IS_DFSDM_DFSDM1_CLKOUT(mchdlystruct->DFSDM1ClockOut)); + assert_param(IS_DFSDM_DFSDM2_CLKOUT(mchdlystruct->DFSDM2ClockOut)); + assert_param(IS_DFSDM_DFSDM1_CLKIN(mchdlystruct->DFSDM1ClockIn)); + assert_param(IS_DFSDM_DFSDM2_CLKIN(mchdlystruct->DFSDM2ClockIn)); + assert_param(IS_DFSDM_DFSDM1_BIT_CLK((mchdlystruct->DFSDM1BitClkDistribution))); + assert_param(IS_DFSDM_DFSDM2_BIT_CLK(mchdlystruct->DFSDM2BitClkDistribution)); + assert_param(IS_DFSDM_DFSDM1_DATA_DISTRIBUTION(mchdlystruct->DFSDM1DataDistribution)); + assert_param(IS_DFSDM_DFSDM2_DATA_DISTRIBUTION(mchdlystruct->DFSDM2DataDistribution)); + + mchdlyreg = (SYSCFG->MCHDLYCR & 0x80103U); + + SYSCFG->MCHDLYCR = (mchdlyreg |(mchdlystruct->DFSDM1ClockOut)|(mchdlystruct->DFSDM2ClockOut)| + (mchdlystruct->DFSDM1ClockIn)|(mchdlystruct->DFSDM2ClockIn)| + (mchdlystruct->DFSDM1BitClkDistribution)| (mchdlystruct->DFSDM2BitClkDistribution)| + (mchdlystruct->DFSDM1DataDistribution)| (mchdlystruct->DFSDM2DataDistribution)); + +} #endif /* SYSCFG_MCHDLYCR_BSCKSEL */ /** * @} @@ -3789,7 +3842,6 @@ static void DFSDM_InjConvStop(DFSDM_Filter_HandleTypeDef* hdfsdm_filter) hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \ HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG; } - /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c index 45d3084..ca14c5a 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dma.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DMA HAL module driver. * * This file provides firmware functions to manage the following @@ -85,7 +85,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -139,7 +139,7 @@ typedef struct /** @addtogroup DMA_Private_Constants * @{ */ - #define HAL_TIMEOUT_DMA_ABORT ((uint32_t)5) /* 5 ms */ + #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ /** * @} */ @@ -155,8 +155,8 @@ static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); /** * @} */ - -/* Exported functions --------------------------------------------------------*/ + +/* Exported functions ---------------------------------------------------------*/ /** @addtogroup DMA_Exported_Functions * @{ */ @@ -180,7 +180,7 @@ static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); */ /** - * @brief Initializes the DMA according to the specified + * @brief Initialize the DMA according to the specified * parameters in the DMA_InitTypeDef and create the associated handle. * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA Stream. @@ -277,21 +277,26 @@ HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) /* Prepare the DMA Stream FIFO configuration */ tmp |= hdma->Init.FIFOMode; - /* the FIFO threshold is not used when the FIFO mode is disabled */ + /* The FIFO threshold is not used when the FIFO mode is disabled */ if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) { /* Get the FIFO threshold */ tmp |= hdma->Init.FIFOThreshold; - if(DMA_CheckFifoParam(hdma) != HAL_OK) + /* Check compatibility between FIFO threshold level and size of the memory burst */ + /* for INCR4, INCR8, INCR16 bursts */ + if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) { - /* Update error code */ - hdma->ErrorCode = HAL_DMA_ERROR_PARAM; - - /* Change the DMA state */ - hdma->State = HAL_DMA_STATE_READY; - - return HAL_ERROR; + if (DMA_CheckFifoParam(hdma) != HAL_OK) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_ERROR; + } } } @@ -359,7 +364,7 @@ HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) hdma->Instance->M1AR = 0U; /* Reset DMA Streamx FIFO control register */ - hdma->Instance->FCR = (uint32_t)0x00000021U; + hdma->Instance->FCR = 0x00000021U; /* Get DMA steam Base Address */ regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); @@ -446,7 +451,7 @@ HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, ui } /** - * @brief Starts the DMA Transfer with interrupt enabled. + * @brief Start the DMA Transfer with interrupt enabled. * @param hdma: pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA Stream. * @param SrcAddress: The source memory Buffer address @@ -659,7 +664,7 @@ HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_Level /* Check for the Timeout (Not applicable in circular mode)*/ if(Timeout != HAL_MAX_DELAY) { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) { /* Update error code */ hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; @@ -753,8 +758,8 @@ HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_Level void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) { uint32_t tmpisr; - __IO uint32_t count = 0; - uint32_t timeout = SystemCoreClock / 9600; + __IO uint32_t count = 0U; + uint32_t timeout = SystemCoreClock / 9600U; /* calculate DMA base and stream number */ DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; @@ -1210,7 +1215,7 @@ static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) } /** - * @brief Checks compatibility between FIFO threshold level and size of the memory burst + * @brief Check compatibility between FIFO threshold level and size of the memory burst * @param hdma: pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA Stream. * @retval HAL status @@ -1225,28 +1230,23 @@ static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) { switch (tmp) { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - if((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if(hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: - if((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_FULL: - break; - default: - break; + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + break; + default: + break; } } @@ -1255,26 +1255,24 @@ static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) { switch (tmp) { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_HALFFULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + } + break; + case DMA_FIFO_THRESHOLD_FULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if (hdma->Init.MemBurst == DMA_MBURST_INC16) - { - status = HAL_ERROR; - } - break; - default: - break; + } + break; + default: + break; } } @@ -1283,19 +1281,19 @@ static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) { switch (tmp) { - case DMA_FIFO_THRESHOLD_1QUARTERFULL: - case DMA_FIFO_THRESHOLD_HALFFULL: - case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_HALFFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_FULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { status = HAL_ERROR; - break; - case DMA_FIFO_THRESHOLD_FULL: - if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) - { - status = HAL_ERROR; - } - break; - default: - break; + } + break; + default: + break; } } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c index b01f1b3..5983927 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dma2d.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DMA2D HAL module driver. * This file provides firmware functions to manage the following * functionalities of the DMA2D peripheral: @@ -98,7 +98,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -150,8 +150,8 @@ /** @defgroup DMA2D_TimeOut DMA2D Time Out * @{ */ -#define DMA2D_TIMEOUT_ABORT ((uint32_t)1000U) /*!< 1s */ -#define DMA2D_TIMEOUT_SUSPEND ((uint32_t)1000U) /*!< 1s */ +#define DMA2D_TIMEOUT_ABORT 1000U /*!< 1s */ +#define DMA2D_TIMEOUT_SUSPEND 1000U /*!< 1s */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c index 9bb6d40..2c839a3 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dma_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DMA Extension HAL module driver * This file provides firmware functions to manage the following * functionalities of the DMA Extension peripheral: @@ -27,7 +27,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c index f19a104..8789a85 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_dsi.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief DSI HAL module driver. * This file provides firmware functions to manage the following * functionalities of the DSI peripheral: @@ -14,7 +14,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -600,11 +600,7 @@ __weak void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi) @verbatim =============================================================================== ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) - (+) - (+) + =============================================================================== @endverbatim * @{ @@ -1235,8 +1231,9 @@ HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi, uint32_t Param1, uint8_t* ParametersTable) { - uint32_t uicounter = 0U; + uint32_t uicounter = 0U, nbBytes = 0U, count = 0U; uint32_t tickstart = 0U; + uint32_t fifoword = 0U; /* Process locked */ __HAL_LOCK(hdsi); @@ -1260,25 +1257,31 @@ HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi, } } - /* Set the DCS code hexadecimal on payload byte 1, and the other parameters on the write FIFO command*/ - while(uicounter < NbParams) + /* Set the DCS code on payload byte 1, and the other parameters on the write FIFO command*/ + fifoword = Param1; + nbBytes = (NbParams < 3U) ? NbParams : 3U; + + for(count = 0U; count < nbBytes; count++) { - if(uicounter == 0x00U) - { - hdsi->Instance->GPDR=(Param1 | \ - ((uint32_t)(*(ParametersTable + uicounter)) << 8U) | \ - ((uint32_t)(*(ParametersTable + uicounter+1U))<<16U) | \ - ((uint32_t)(*(ParametersTable + uicounter+2U))<<24U)); - uicounter+=3U; - } - else + fifoword |= (((uint32_t)(*(ParametersTable + count))) << (8U + (8U*count))); + } + hdsi->Instance->GPDR = fifoword; + + uicounter = NbParams - nbBytes; + ParametersTable += nbBytes; + /* Set the Next parameters on the write FIFO command*/ + while(uicounter != 0U) + { + nbBytes = (uicounter < 4U) ? uicounter : 4U; + fifoword = 0U; + for(count = 0U; count < nbBytes; count++) { - hdsi->Instance->GPDR=((uint32_t)(*(ParametersTable + uicounter)) | \ - ((uint32_t)(*(ParametersTable + uicounter+1U)) << 8U) | \ - ((uint32_t)(*(ParametersTable + uicounter+2U)) << 16U) | \ - ((uint32_t)(*(ParametersTable + uicounter+3U)) << 24U)); - uicounter+=4U; + fifoword |= (((uint32_t)(*(ParametersTable + count))) << (8U*count)); } + hdsi->Instance->GPDR = fifoword; + + uicounter -= nbBytes; + ParametersTable += nbBytes; } /* Configure the packet to send a long DCS command */ @@ -1519,6 +1522,9 @@ HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi) } } } + + /* wait for 1 ms*/ + HAL_Delay(1U); /* De-assert the ULPM requests and the ULPM exit bits */ hdsi->Instance->PUCR = 0U; @@ -1663,6 +1669,9 @@ HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi) } } + /* wait for 1 ms*/ + HAL_Delay(1U); + /* De-assert the ULPM requests and the ULPM exit bits */ hdsi->Instance->PUCR = 0U; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c index 62a51b2..c7cd0b4 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_eth.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief ETH HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Ethernet (ETH) peripheral: @@ -71,7 +71,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -120,9 +120,9 @@ /** @defgroup ETH_Private_Constants ETH Private Constants * @{ */ -#define ETH_TIMEOUT_SWRESET ((uint32_t)500U) -#define ETH_TIMEOUT_LINKED_STATE ((uint32_t)5000U) -#define ETH_TIMEOUT_AUTONEGO_COMPLETED ((uint32_t)5000U) +#define ETH_TIMEOUT_SWRESET 500U +#define ETH_TIMEOUT_LINKED_STATE 5000U +#define ETH_TIMEOUT_AUTONEGO_COMPLETED 5000U /** * @} @@ -1082,8 +1082,8 @@ HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYR /* Prepare the MII address register value */ tmpreg1 |=(((uint32_t)heth->Init.PhyAddress << 11U) & ETH_MACMIIAR_PA); /* Set the PHY device address */ tmpreg1 |=(((uint32_t)PHYReg<<6U) & ETH_MACMIIAR_MR); /* Set the PHY register address */ - tmpreg1 &= ~ETH_MACMIIAR_MW; /* Set the read mode */ - tmpreg1 |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + tmpreg1 &= ~ETH_MACMIIAR_MW; /* Set the read mode */ + tmpreg1 |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ /* Write the result value into the MII Address register */ heth->Instance->MACMIIAR = tmpreg1; @@ -1436,7 +1436,7 @@ HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef tmpreg1 = (heth->Instance)->MACCR; /* Clear FES and DM bits */ - tmpreg1 &= ~((uint32_t)0x00004800U); + tmpreg1 &= ~(0x00004800U); tmpreg1 |= (uint32_t)(heth->Init.Speed | heth->Init.DuplexMode); @@ -1866,6 +1866,9 @@ static void ETH_MACAddressConfig(ETH_HandleTypeDef *heth, uint32_t MacAddr, uint { uint32_t tmpreg1; + /* Prevent unused argument(s) compilation warning */ + UNUSED(heth); + /* Check the parameters */ assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); @@ -2035,7 +2038,7 @@ static void ETH_FlushTransmitFIFO(ETH_HandleTypeDef *heth) */ static void ETH_Delay(uint32_t mdelay) { - __IO uint32_t Delay = mdelay * (SystemCoreClock / 8 / 1000); + __IO uint32_t Delay = mdelay * (SystemCoreClock / 8U / 1000U); do { __NOP(); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c index ddc5eab..977c76c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_flash.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FLASH HAL module driver. * This file provides firmware functions to manage the following * functionalities of the internal FLASH memory: @@ -65,7 +65,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -111,7 +111,7 @@ /** @addtogroup FLASH_Private_Constants * @{ */ -#define FLASH_TIMEOUT_VALUE ((uint32_t)50000U)/* 50 s */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ /** * @} */ @@ -281,8 +281,13 @@ void HAL_FLASH_IRQHandler(void) uint32_t addresstmp = 0U; /* Check FLASH operation error flags */ +#if defined(FLASH_SR_RDERR) if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ { if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) { @@ -588,9 +593,13 @@ HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) /* Clear FLASH End of Operation pending bit */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); } - +#if defined(FLASH_SR_RDERR) if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) +#else + if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ + FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) +#endif /* FLASH_SR_RDERR */ { /*Save the error code*/ FLASH_SetErrorCode(); @@ -624,7 +633,9 @@ static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; FLASH->CR |= FLASH_CR_PG; - *(__IO uint64_t*)Address = Data; + /* Program the double-word */ + *(__IO uint32_t*)Address = (uint32_t)Data; + *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); } @@ -740,7 +751,7 @@ static void FLASH_SetErrorCode(void) /* Clear FLASH Programming sequence error pending bit */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); } - +#if defined(FLASH_SR_RDERR) if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) { pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; @@ -748,7 +759,7 @@ static void FLASH_SetErrorCode(void) /* Clear FLASH Proprietary readout protection error pending bit */ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); } - +#endif /* FLASH_SR_RDERR */ if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) { pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c index 303c79f..8c56ce0 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_flash_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Extended FLASH HAL module driver. * This file provides firmware functions to manage the following * functionalities of the FLASH extension peripheral: @@ -51,7 +51,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -97,7 +97,7 @@ /** @addtogroup FLASHEx_Private_Constants * @{ */ -#define FLASH_TIMEOUT_VALUE ((uint32_t)50000U)/* 50 s */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ /** * @} */ @@ -479,10 +479,10 @@ void HAL_FLASHEx_AdvOBGetConfig(FLASH_AdvOBProgramInitTypeDef *pAdvOBInit) */ HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) { - uint8_t optiontmp = 0xFFU; + uint8_t optiontmp = 0xFF; /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7FU); + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); /* Update Option Byte */ *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_SELECTED | optiontmp); @@ -504,10 +504,10 @@ HAL_StatusTypeDef HAL_FLASHEx_OB_SelectPCROP(void) */ HAL_StatusTypeDef HAL_FLASHEx_OB_DeSelectPCROP(void) { - uint8_t optiontmp = 0xFFU; + uint8_t optiontmp = 0xFF; /* Mask SPRMOD bit */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7FU); + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE3_ADDRESS) & (uint8_t)0x7F); /* Update Option Byte */ *(__IO uint8_t *)OPTCR_BYTE3_ADDRESS = (uint8_t)(OB_PCROP_DESELECTED | optiontmp); @@ -680,7 +680,7 @@ static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) if(WRPSector == OB_WRP_SECTOR_All) { /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12U)); + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~(WRPSector>>12)); } else { @@ -691,7 +691,7 @@ static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) else { /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12U)); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); } /*Write protection on all sector of BANK2*/ @@ -702,7 +702,7 @@ static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks) if(status == HAL_OK) { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12U)); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS &= (~(WRPSector>>12)); } } @@ -751,7 +751,7 @@ static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) if(WRPSector == OB_WRP_SECTOR_All) { /*Write protection on all sector of BANK1*/ - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); + *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); } else { @@ -762,7 +762,7 @@ static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) else { /*Write protection done on sectors of BANK2*/ - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); } /*Write protection on all sector of BANK2*/ @@ -773,7 +773,7 @@ static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks) if(status == HAL_OK) { - *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12U); + *(__IO uint16_t*)OPTCR1_BYTE2_ADDRESS |= (uint16_t)(WRPSector>>12); } } @@ -1213,7 +1213,7 @@ static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level) */ static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby) { - uint8_t optiontmp = 0xFFU; + uint8_t optiontmp = 0xFF; HAL_StatusTypeDef status = HAL_OK; /* Check the parameters */ @@ -1227,7 +1227,7 @@ static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t if(status == HAL_OK) { /* Mask OPTLOCK, OPTSTRT, BOR_LEV and BFB2 bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1FU); + optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x1F); /* Update User Option Byte */ *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = Iwdg | (uint8_t)(Stdby | (uint8_t)(Stop | ((uint8_t)optiontmp))); @@ -1267,7 +1267,7 @@ static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level) static uint8_t FLASH_OB_GetUser(void) { /* Return the User Option Byte */ - return ((uint8_t)(FLASH->OPTCR & 0xE0U)); + return ((uint8_t)(FLASH->OPTCR & 0xE0)); } /** @@ -1319,7 +1319,7 @@ static uint8_t FLASH_OB_GetRDP(void) static uint8_t FLASH_OB_GetBOR(void) { /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0CU); + return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); } /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c index 5707d80..1b19e62 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_flash_ramfunc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FLASH RAMFUNC module driver. * This file provides a FLASH firmware functions which should be * executed from internal SRAM @@ -36,7 +36,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.c index b6b6115..59c3502 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_fmpi2c.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FMPI2C HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Inter Integrated Circuit (FMPI2C) peripheral: @@ -98,6 +98,9 @@ (++) FMPI2C_FIRST_AND_LAST_FRAME: No sequential usage, functionnal is same as associated interfaces in no sequential mode (++) FMPI2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address and data to transfer without a final stop condition + (++) FMPI2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address + and data to transfer without a final stop condition, an then permit a call the same master sequential interface + several times (like HAL_FMPI2C_Master_Sequential_Transmit_IT() then HAL_FMPI2C_Master_Sequential_Transmit_IT()) (++) FMPI2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address and with new data to transfer if the direction change or manage only the new data to transfer if no direction change and without a final stop condition in both cases @@ -212,7 +215,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -262,24 +265,24 @@ /** @defgroup FMPI2C_Private_Define FMPI2C Private Define * @{ */ -#define TIMING_CLEAR_MASK ((uint32_t)0xF0FFFFFFU) /*!< FMPI2C TIMING clear register Mask */ -#define FMPI2C_TIMEOUT_ADDR ((uint32_t)10000U) /*!< 10 s */ -#define FMPI2C_TIMEOUT_BUSY ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_DIR ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_RXNE ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_STOPF ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_TC ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_TCR ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_TXIS ((uint32_t)25U) /*!< 25 ms */ -#define FMPI2C_TIMEOUT_FLAG ((uint32_t)25U) /*!< 25 ms */ - -#define MAX_NBYTE_SIZE 255U -#define SlaveAddr_SHIFT 7U -#define SlaveAddr_MSK 0x06U +#define TIMING_CLEAR_MASK 0xF0FFFFFFU /*!< FMPI2C TIMING clear register Mask */ +#define FMPI2C_TIMEOUT_ADDR 10000U /*!< 10 s */ +#define FMPI2C_TIMEOUT_BUSY 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_DIR 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_RXNE 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_STOPF 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_TC 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_TCR 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_TXIS 25U /*!< 25 ms */ +#define FMPI2C_TIMEOUT_FLAG 25U /*!< 25 ms */ + +#define MAX_NBYTE_SIZE 255U +#define SlaveAddr_SHIFT 7U +#define SlaveAddr_MSK 0x06U /* Private define for @ref PreviousState usage */ -#define FMPI2C_STATE_MSK ((uint32_t)((HAL_FMPI2C_STATE_BUSY_TX | HAL_FMPI2C_STATE_BUSY_RX) & (~HAL_FMPI2C_STATE_READY))) /*!< Mask State define, keep only RX and TX bits */ -#define FMPI2C_STATE_NONE ((uint32_t)(HAL_FMPI2C_MODE_NONE)) /*!< Default Value */ +#define FMPI2C_STATE_MSK ((uint32_t)((HAL_FMPI2C_STATE_BUSY_TX | HAL_FMPI2C_STATE_BUSY_RX) & (~((uint32_t)HAL_FMPI2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits */ +#define FMPI2C_STATE_NONE ((uint32_t)(HAL_FMPI2C_MODE_NONE)) /*!< Default Value */ #define FMPI2C_STATE_MASTER_BUSY_TX ((uint32_t)((HAL_FMPI2C_STATE_BUSY_TX & FMPI2C_STATE_MSK) | HAL_FMPI2C_MODE_MASTER)) /*!< Master Busy TX, combinaison of State LSB and Mode enum */ #define FMPI2C_STATE_MASTER_BUSY_RX ((uint32_t)((HAL_FMPI2C_STATE_BUSY_RX & FMPI2C_STATE_MSK) | HAL_FMPI2C_MODE_MASTER)) /*!< Master Busy RX, combinaison of State LSB and Mode enum */ #define FMPI2C_STATE_SLAVE_BUSY_TX ((uint32_t)((HAL_FMPI2C_STATE_BUSY_TX & FMPI2C_STATE_MSK) | HAL_FMPI2C_MODE_SLAVE)) /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ @@ -289,16 +292,16 @@ /* Private define to centralize the enable/disable of Interrupts */ -#define FMPI2C_XFER_TX_IT ((uint32_t)0x00000001U) -#define FMPI2C_XFER_RX_IT ((uint32_t)0x00000002U) -#define FMPI2C_XFER_LISTEN_IT ((uint32_t)0x00000004U) +#define FMPI2C_XFER_TX_IT 0x00000001U +#define FMPI2C_XFER_RX_IT 0x00000002U +#define FMPI2C_XFER_LISTEN_IT 0x00000004U -#define FMPI2C_XFER_ERROR_IT ((uint32_t)0x00000011U) -#define FMPI2C_XFER_CPLT_IT ((uint32_t)0x00000012U) -#define FMPI2C_XFER_RELOAD_IT ((uint32_t)0x00000012U) +#define FMPI2C_XFER_ERROR_IT 0x00000011U +#define FMPI2C_XFER_CPLT_IT 0x00000012U +#define FMPI2C_XFER_RELOAD_IT 0x00000012U /* Private define Sequential Transfer Options default/reset value */ -#define FMPI2C_NO_OPTION_FRAME ((uint32_t)0xFFFF0000U) +#define FMPI2C_NO_OPTION_FRAME 0xFFFF0000U /** * @} */ @@ -638,7 +641,7 @@ __weak void HAL_FMPI2C_MspDeInit(FMPI2C_HandleTypeDef *hfmpi2c) */ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -675,7 +678,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint FMPI2C_TransferConfig(hfmpi2c, DevAddress, hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_WRITE); } - while(hfmpi2c->XferSize > 0) + while(hfmpi2c->XferSize > 0U) { /* Wait until TXIS flag is set */ if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, tickstart) != HAL_OK) @@ -694,7 +697,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint hfmpi2c->XferCount--; hfmpi2c->XferSize--; - if((hfmpi2c->XferSize == 0) && (hfmpi2c->XferCount!=0)) + if((hfmpi2c->XferSize == 0U) && (hfmpi2c->XferCount!=0U)) { /* Wait until TCR flag is set */ if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) @@ -762,7 +765,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint */ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -799,7 +802,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint1 FMPI2C_TransferConfig(hfmpi2c, DevAddress, hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_START_READ); } - while(hfmpi2c->XferSize > 0) + while(hfmpi2c->XferSize > 0U) { /* Wait until RXNE flag is set */ if(FMPI2C_WaitOnRXNEFlagUntilTimeout(hfmpi2c, Timeout, tickstart) != HAL_OK) @@ -819,7 +822,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint1 hfmpi2c->XferSize--; hfmpi2c->XferCount--; - if((hfmpi2c->XferSize == 0) && (hfmpi2c->XferCount != 0)) + if((hfmpi2c->XferSize == 0U) && (hfmpi2c->XferCount != 0U)) { /* Wait until TCR flag is set */ if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) @@ -885,11 +888,11 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint1 */ HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { - if((pData == NULL ) || (Size == 0)) + if((pData == NULL ) || (Size == 0U)) { return HAL_ERROR; } @@ -945,7 +948,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint8 return HAL_TIMEOUT; } - while(hfmpi2c->XferCount > 0) + while(hfmpi2c->XferCount > 0U) { /* Wait until TXIS flag is set */ if(FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, tickstart) != HAL_OK) @@ -1025,11 +1028,11 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint8 */ HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { - if((pData == NULL ) || (Size == 0)) + if((pData == NULL ) || (Size == 0U)) { return HAL_ERROR; } @@ -1070,7 +1073,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint8_ return HAL_TIMEOUT; } - while(hfmpi2c->XferCount > 0) + while(hfmpi2c->XferCount > 0U) { /* Wait until RXNE flag is set */ if(FMPI2C_WaitOnRXNEFlagUntilTimeout(hfmpi2c, Timeout, tickstart) != HAL_OK) @@ -1157,7 +1160,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint8_ */ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -1226,7 +1229,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, u */ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -1393,7 +1396,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uin */ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -1478,7 +1481,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, */ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -1511,7 +1514,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, u xfermode = FMPI2C_AUTOEND_MODE; } - if(hfmpi2c->XferSize > 0) + if(hfmpi2c->XferSize > 0U) { /* Set the FMPI2C DMA transfer complete callback */ hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMasterReceiveCplt; @@ -1706,7 +1709,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, ui */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -1787,7 +1790,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t D hfmpi2c->XferCount--; hfmpi2c->XferSize--; - if((hfmpi2c->XferSize == 0) && (hfmpi2c->XferCount!=0)) + if((hfmpi2c->XferSize == 0U) && (hfmpi2c->XferCount!=0U)) { /* Wait until TCR flag is set */ if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) @@ -1807,7 +1810,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t D } } - }while(hfmpi2c->XferCount > 0); + }while(hfmpi2c->XferCount > 0U); /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ /* Wait until STOPF flag is reset */ @@ -1857,7 +1860,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t D */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -1932,7 +1935,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t De hfmpi2c->XferSize--; hfmpi2c->XferCount--; - if((hfmpi2c->XferSize == 0) && (hfmpi2c->XferCount != 0)) + if((hfmpi2c->XferSize == 0U) && (hfmpi2c->XferCount != 0U)) { /* Wait until TCR flag is set */ if(FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) @@ -1951,7 +1954,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t De FMPI2C_TransferConfig(hfmpi2c, DevAddress, hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP); } } - }while(hfmpi2c->XferCount > 0); + }while(hfmpi2c->XferCount > 0U); /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ /* Wait until STOPF flag is reset */ @@ -1999,8 +2002,8 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t De */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { - uint32_t tickstart = 0; - uint32_t xfermode = 0; + uint32_t tickstart = 0U; + uint32_t xfermode = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -2097,8 +2100,8 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_ */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { - uint32_t tickstart = 0; - uint32_t xfermode = 0; + uint32_t tickstart = 0U; + uint32_t xfermode = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -2194,8 +2197,8 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { - uint32_t tickstart = 0; - uint32_t xfermode = 0; + uint32_t tickstart = 0U; + uint32_t xfermode = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -2309,8 +2312,8 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16 */ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { - uint32_t tickstart = 0; - uint32_t xfermode = 0; + uint32_t tickstart = 0U; + uint32_t xfermode = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_MEMADD_SIZE(MemAddSize)); @@ -2422,9 +2425,9 @@ HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_ */ HAL_StatusTypeDef HAL_FMPI2C_IsDeviceReady(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) { - uint32_t tickstart = 0; + uint32_t tickstart = 0U; - __IO uint32_t FMPI2C_Trials = 0; + __IO uint32_t FMPI2C_Trials = 0U; if(hfmpi2c->State == HAL_FMPI2C_STATE_READY) { @@ -2451,7 +2454,7 @@ HAL_StatusTypeDef HAL_FMPI2C_IsDeviceReady(FMPI2C_HandleTypeDef *hfmpi2c, uint16 { if(Timeout != HAL_MAX_DELAY) { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) { /* Device is ready */ hfmpi2c->State = HAL_FMPI2C_STATE_READY; @@ -2541,7 +2544,7 @@ HAL_StatusTypeDef HAL_FMPI2C_IsDeviceReady(FMPI2C_HandleTypeDef *hfmpi2c, uint16 */ HAL_StatusTypeDef HAL_FMPI2C_Master_Sequential_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; uint32_t xferrequest = FMPI2C_GENERATE_START_WRITE; /* Check the parameters */ @@ -2572,15 +2575,14 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Sequential_Transmit_IT(FMPI2C_HandleTypeDef { hfmpi2c->XferSize = hfmpi2c->XferCount; xfermode = hfmpi2c->XferOptions; - - /* If transfer direction not change, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if(hfmpi2c->PreviousState == FMPI2C_STATE_SLAVE_BUSY_TX) - { - xferrequest = FMPI2C_NO_STARTSTOP; - } } + /* If transfer direction not change, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if(hfmpi2c->PreviousState == FMPI2C_STATE_SLAVE_BUSY_TX) + { + xferrequest = FMPI2C_NO_STARTSTOP; + } /* Send Slave Address and set NBYTES to write */ FMPI2C_TransferConfig(hfmpi2c, DevAddress, hfmpi2c->XferSize, xfermode, xferrequest); @@ -2615,7 +2617,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Sequential_Transmit_IT(FMPI2C_HandleTypeDef */ HAL_StatusTypeDef HAL_FMPI2C_Master_Sequential_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) { - uint32_t xfermode = 0; + uint32_t xfermode = 0U; uint32_t xferrequest = FMPI2C_GENERATE_START_READ; /* Check the parameters */ @@ -2646,13 +2648,13 @@ HAL_StatusTypeDef HAL_FMPI2C_Master_Sequential_Receive_IT(FMPI2C_HandleTypeDef * { hfmpi2c->XferSize = hfmpi2c->XferCount; xfermode = hfmpi2c->XferOptions; + } - /* If transfer direction not change, do not generate Restart Condition */ - /* Mean Previous state is same as current state */ - if(hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_RX) - { - xferrequest = FMPI2C_NO_STARTSTOP; - } + /* If transfer direction not change, do not generate Restart Condition */ + /* Mean Previous state is same as current state */ + if(hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_RX) + { + xferrequest = FMPI2C_NO_STARTSTOP; } /* Send Slave Address and set NBYTES to read */ @@ -2689,7 +2691,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Sequential_Transmit_IT(FMPI2C_HandleTypeDef * /* Check the parameters */ assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - if(hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN) + if((hfmpi2c->State & HAL_FMPI2C_STATE_LISTEN) == HAL_FMPI2C_STATE_LISTEN) { if((pData == NULL) || (Size == 0)) { @@ -2702,6 +2704,14 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Sequential_Transmit_IT(FMPI2C_HandleTypeDef * /* Process Locked */ __HAL_LOCK(hfmpi2c); + /* FMPI2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave RX state to TX state */ + if(hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX_LISTEN) + { + /* Disable associated Interrupts */ + FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT); + } + hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX_LISTEN; hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE; hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE; @@ -2755,7 +2765,7 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Sequential_Receive_IT(FMPI2C_HandleTypeDef *h /* Check the parameters */ assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); - if(hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN) + if((hfmpi2c->State & HAL_FMPI2C_STATE_LISTEN) == HAL_FMPI2C_STATE_LISTEN) { if((pData == NULL) || (Size == 0)) { @@ -2768,6 +2778,14 @@ HAL_StatusTypeDef HAL_FMPI2C_Slave_Sequential_Receive_IT(FMPI2C_HandleTypeDef *h /* Process Locked */ __HAL_LOCK(hfmpi2c); + /* FMPI2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave TX state to RX state */ + if(hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN) + { + /* Disable associated Interrupts */ + FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT); + } + hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX_LISTEN; hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE; hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE; @@ -3249,7 +3267,7 @@ static HAL_StatusTypeDef FMPI2C_Master_ISR_IT(struct __FMPI2C_HandleTypeDef *hfm } else if(((ITFlags & FMPI2C_FLAG_TCR) != RESET) && ((ITSources & FMPI2C_IT_TCI) != RESET)) { - if((hfmpi2c->XferSize == 0) && (hfmpi2c->XferCount != 0)) + if((hfmpi2c->XferSize == 0U) && (hfmpi2c->XferCount != 0U)) { devaddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD); @@ -3289,7 +3307,7 @@ static HAL_StatusTypeDef FMPI2C_Master_ISR_IT(struct __FMPI2C_HandleTypeDef *hfm } else if(((ITFlags & FMPI2C_FLAG_TC) != RESET) && ((ITSources & FMPI2C_IT_TCI) != RESET)) { - if(hfmpi2c->XferCount == 0) + if(hfmpi2c->XferCount == 0U) { if((FMPI2C_GET_STOP_MODE(hfmpi2c) != FMPI2C_AUTOEND_MODE)&&(hfmpi2c->Mode == HAL_FMPI2C_MODE_MASTER)) { @@ -3336,7 +3354,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(struct __FMPI2C_HandleTypeDef *hfmp /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ /* Mean XferCount == 0*/ /* So clear Flag NACKF only */ - if(hfmpi2c->XferCount == 0) + if(hfmpi2c->XferCount == 0U) { if(((hfmpi2c->XferOptions == FMPI2C_FIRST_AND_LAST_FRAME) || (hfmpi2c->XferOptions == FMPI2C_LAST_FRAME)) && \ (hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN)) @@ -3374,7 +3392,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(struct __FMPI2C_HandleTypeDef *hfmp } else if(((ITFlags & FMPI2C_FLAG_RXNE) != RESET) && ((ITSources & FMPI2C_IT_RXI) != RESET)) { - if(hfmpi2c->XferCount > 0) + if(hfmpi2c->XferCount > 0U) { /* Read data from RXDR */ (*hfmpi2c->pBuffPtr++) = hfmpi2c->Instance->RXDR; @@ -3382,7 +3400,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(struct __FMPI2C_HandleTypeDef *hfmp hfmpi2c->XferCount--; } - if((hfmpi2c->XferCount == 0) && \ + if((hfmpi2c->XferCount == 0U) && \ (hfmpi2c->XferOptions != FMPI2C_NO_OPTION_FRAME)) { /* Call FMPI2C Slave Sequential complete process */ @@ -3399,7 +3417,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(struct __FMPI2C_HandleTypeDef *hfmp /* A TXIS flag can be set, during STOP treatment */ /* Check if all Datas have already been sent */ /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */ - if(hfmpi2c->XferCount > 0) + if(hfmpi2c->XferCount > 0U) { /* Write data to TXDR */ hfmpi2c->Instance->TXDR = (*hfmpi2c->pBuffPtr++); @@ -3441,7 +3459,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(struct __FMPI2C_HandleTypeDef *hfmp static HAL_StatusTypeDef FMPI2C_Master_ISR_DMA(struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags, uint32_t ITSources) { uint16_t devaddress = 0; - uint32_t xfermode = 0; + uint32_t xfermode = 0U; /* Process Locked */ __HAL_LOCK(hfmpi2c); @@ -3467,7 +3485,7 @@ static HAL_StatusTypeDef FMPI2C_Master_ISR_DMA(struct __FMPI2C_HandleTypeDef *hf /* Disable TC interrupt */ __HAL_FMPI2C_DISABLE_IT(hfmpi2c, FMPI2C_IT_TCI); - if(hfmpi2c->XferCount != 0) + if(hfmpi2c->XferCount != 0U) { /* Recover Slave address */ devaddress = (hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD); @@ -3538,7 +3556,7 @@ static HAL_StatusTypeDef FMPI2C_Slave_ISR_DMA(struct __FMPI2C_HandleTypeDef *hfm /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ /* Mean XferCount == 0 */ /* So clear Flag NACKF only */ - if(FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c) == 0) + if(FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c) == 0U) { /* Clear NACK Flag */ __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF); @@ -3730,10 +3748,10 @@ static void FMPI2C_ITAddrCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags) { slaveaddrcode = ownadd1code; hfmpi2c->AddrEventCount++; - if(hfmpi2c->AddrEventCount == 2) + if(hfmpi2c->AddrEventCount == 2U) { /* Reset Address Event counter */ - hfmpi2c->AddrEventCount = 0; + hfmpi2c->AddrEventCount = 0U; /* Clear ADDR flag */ __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c,FMPI2C_FLAG_ADDR); @@ -3997,7 +4015,7 @@ static void FMPI2C_ITSlaveCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags) } /* All data are not transferred, so set error code accordingly */ - if(hfmpi2c->XferCount != 0) + if(hfmpi2c->XferCount != 0U) { /* Set ErrorCode corresponding to a Non-Acknowledge */ hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF; @@ -4009,7 +4027,7 @@ static void FMPI2C_ITSlaveCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags) /* Read data from RXDR */ (*hfmpi2c->pBuffPtr++) = hfmpi2c->Instance->RXDR; - if((hfmpi2c->XferSize > 0)) + if((hfmpi2c->XferSize > 0U)) { hfmpi2c->XferSize--; hfmpi2c->XferCount--; @@ -4090,7 +4108,7 @@ static void FMPI2C_ITListenCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags) /* Read data from RXDR */ (*hfmpi2c->pBuffPtr++) = hfmpi2c->Instance->RXDR; - if((hfmpi2c->XferSize > 0)) + if((hfmpi2c->XferSize > 0U)) { hfmpi2c->XferSize--; hfmpi2c->XferCount--; @@ -4124,7 +4142,7 @@ static void FMPI2C_ITError(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ErrorCode) /* Reset handle parameters */ hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE; hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME; - hfmpi2c->XferCount = 0; + hfmpi2c->XferCount = 0U; /* Set new error code */ hfmpi2c->ErrorCode |= ErrorCode; @@ -4225,7 +4243,7 @@ static void FMPI2C_Flush_TXDR(FMPI2C_HandleTypeDef *hfmpi2c) /* Write a dummy data in TXDR to clear it */ if(__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) != RESET) { - hfmpi2c->Instance->TXDR = 0x00; + hfmpi2c->Instance->TXDR = 0x00U; } /* Flush TX register if not empty */ @@ -4248,7 +4266,7 @@ static void FMPI2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma) hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN; /* If last transfer, enable STOP interrupt */ - if(hfmpi2c->XferCount == 0) + if(hfmpi2c->XferCount == 0U) { /* Enable STOP interrupt */ FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT); @@ -4302,7 +4320,7 @@ static void FMPI2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma) hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN; /* If last transfer, enable STOP interrupt */ - if(hfmpi2c->XferCount == 0) + if(hfmpi2c->XferCount == 0U) { /* Enable STOP interrupt */ FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT); @@ -4408,7 +4426,7 @@ static HAL_StatusTypeDef FMPI2C_WaitOnFlagUntilTimeout(FMPI2C_HandleTypeDef *hfm /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { - if((Timeout == 0)||((HAL_GetTick() - Tickstart ) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout)) { hfmpi2c->State= HAL_FMPI2C_STATE_READY; hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE; @@ -4443,7 +4461,7 @@ static HAL_StatusTypeDef FMPI2C_WaitOnTXISFlagUntilTimeout(FMPI2C_HandleTypeDef /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { - if((Timeout == 0)||((HAL_GetTick() - Tickstart) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout)) { hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT; hfmpi2c->State= HAL_FMPI2C_STATE_READY; @@ -4478,7 +4496,7 @@ static HAL_StatusTypeDef FMPI2C_WaitOnSTOPFlagUntilTimeout(FMPI2C_HandleTypeDef } /* Check for the Timeout */ - if((Timeout == 0)||((HAL_GetTick() - Tickstart) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout)) { hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT; hfmpi2c->State= HAL_FMPI2C_STATE_READY; @@ -4531,7 +4549,7 @@ static HAL_StatusTypeDef FMPI2C_WaitOnRXNEFlagUntilTimeout(FMPI2C_HandleTypeDef } /* Check for the Timeout */ - if((Timeout == 0)||((HAL_GetTick() - Tickstart) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout)) { hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT; hfmpi2c->State= HAL_FMPI2C_STATE_READY; @@ -4564,7 +4582,7 @@ static HAL_StatusTypeDef FMPI2C_IsAcknowledgeFailed(FMPI2C_HandleTypeDef *hfmpi2 /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { - if((Timeout == 0)||((HAL_GetTick() - Tickstart) > Timeout)) + if((Timeout == 0U)||((HAL_GetTick() - Tickstart) > Timeout)) { hfmpi2c->State= HAL_FMPI2C_STATE_READY; hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE; @@ -4621,7 +4639,7 @@ static HAL_StatusTypeDef FMPI2C_IsAcknowledgeFailed(FMPI2C_HandleTypeDef *hfmpi2 */ static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request) { - uint32_t tmpreg = 0; + uint32_t tmpreg = 0U; /* Check the parameters */ assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance)); @@ -4635,7 +4653,7 @@ static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAd tmpreg &= (uint32_t)~((uint32_t)(FMPI2C_CR2_SADD | FMPI2C_CR2_NBYTES | FMPI2C_CR2_RELOAD | FMPI2C_CR2_AUTOEND | FMPI2C_CR2_RD_WRN | FMPI2C_CR2_START | FMPI2C_CR2_STOP)); /* update tmpreg */ - tmpreg |= (uint32_t)(((uint32_t)DevAddress & FMPI2C_CR2_SADD) | (((uint32_t)Size << 16 ) & FMPI2C_CR2_NBYTES) | \ + tmpreg |= (uint32_t)(((uint32_t)DevAddress & FMPI2C_CR2_SADD) | (((uint32_t)Size << 16U) & FMPI2C_CR2_NBYTES) | \ (uint32_t)Mode | (uint32_t)Request); /* update CR2 register */ @@ -4651,7 +4669,7 @@ static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAd */ static HAL_StatusTypeDef FMPI2C_Enable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest) { - uint32_t tmpisr = 0; + uint32_t tmpisr = 0U; if((hfmpi2c->XferISR == FMPI2C_Master_ISR_DMA) || \ (hfmpi2c->XferISR == FMPI2C_Slave_ISR_DMA)) @@ -4724,7 +4742,7 @@ static HAL_StatusTypeDef FMPI2C_Enable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16 */ static HAL_StatusTypeDef FMPI2C_Disable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest) { - uint32_t tmpisr = 0; + uint32_t tmpisr = 0U; if((InterruptRequest & FMPI2C_XFER_TX_IT) == FMPI2C_XFER_TX_IT) { diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.c index c0fef23..e26125e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_fmpi2c_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FMPI2C Extended HAL module driver. * This file provides firmware functions to manage the following * functionalities of FMPI2C Extended peripheral: @@ -36,7 +36,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c index 785c3d7..aeaafea 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_gpio.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief GPIO HAL module driver. * This file provides firmware functions to manage the following * functionalities of the General Purpose Input/Output (GPIO) peripheral: @@ -95,7 +95,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -141,15 +141,15 @@ /** @addtogroup GPIO_Private_Constants GPIO Private Constants * @{ */ -#define GPIO_MODE ((uint32_t)0x00000003U) -#define EXTI_MODE ((uint32_t)0x10000000U) -#define GPIO_MODE_IT ((uint32_t)0x00010000U) -#define GPIO_MODE_EVT ((uint32_t)0x00020000U) -#define RISING_EDGE ((uint32_t)0x00100000U) -#define FALLING_EDGE ((uint32_t)0x00200000U) -#define GPIO_OUTPUT_TYPE ((uint32_t)0x00000010U) - -#define GPIO_NUMBER ((uint32_t)16U) +#define GPIO_MODE 0x00000003U +#define EXTI_MODE 0x10000000U +#define GPIO_MODE_IT 0x00010000U +#define GPIO_MODE_EVT 0x00020000U +#define RISING_EDGE 0x00100000U +#define FALLING_EDGE 0x00200000U +#define GPIO_OUTPUT_TYPE 0x00000010U + +#define GPIO_NUMBER 16U /** * @} */ @@ -203,7 +203,7 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) for(position = 0U; position < GPIO_NUMBER; position++) { /* Get the IO position */ - ioposition = ((uint32_t)0x01U) << position; + ioposition = 0x01U << position; /* Get the current IO position */ iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; @@ -217,8 +217,8 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); /* Configure Alternate function mapped with the current IO */ temp = GPIOx->AFR[position >> 3U]; - temp &= ~((uint32_t)0xFU << ((uint32_t)(position & (uint32_t)0x07U) * 4U)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07U) * 4U)); + temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); GPIOx->AFR[position >> 3U] = temp; } @@ -261,7 +261,7 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) __HAL_RCC_SYSCFG_CLK_ENABLE(); temp = SYSCFG->EXTICR[position >> 2U]; - temp &= ~(((uint32_t)0x0FU) << (4U * (position & 0x03U))); + temp &= ~(0x0FU << (4U * (position & 0x03U))); temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); SYSCFG->EXTICR[position >> 2U] = temp; @@ -325,7 +325,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) for(position = 0U; position < GPIO_NUMBER; position++) { /* Get the IO position */ - ioposition = ((uint32_t)0x01U) << position; + ioposition = 0x01U << position; /* Get the current IO position */ iocurrent = (GPIO_Pin) & ioposition; @@ -336,7 +336,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); /* Configure the default Alternate Function in current IO */ - GPIOx->AFR[position >> 3U] &= ~((uint32_t)0xFU << ((uint32_t)(position & (uint32_t)0x07U) * 4U)) ; + GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; /* Configure the default value for IO Speed */ GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); @@ -349,11 +349,11 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /*------------------------- EXTI Mode Configuration --------------------*/ tmp = SYSCFG->EXTICR[position >> 2U]; - tmp &= (((uint32_t)0x0FU) << (4U * (position & 0x03U))); + tmp &= (0x0FU << (4U * (position & 0x03U))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) { /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0FU) << (4U * (position & 0x03U)); + tmp = 0x0FU << (4U * (position & 0x03U)); SYSCFG->EXTICR[position >> 2U] &= ~tmp; /* Clear EXTI line configuration */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.c index c4bd039..9e2ce6c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_hash.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HASH HAL module driver. * This file provides firmware functions to manage the following * functionalities of the HASH peripheral: @@ -68,7 +68,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.c index a9a74f5..c6ebcf9 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_hash_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HASH HAL Extension module driver. * This file provides firmware functions to manage the following * functionalities of HASH peripheral: @@ -65,7 +65,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c index 446ce0d..6733529 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_hcd.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HCD HAL module driver. * This file provides firmware functions to manage the following * functionalities of the USB Peripheral Controller: @@ -44,7 +44,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -201,8 +201,8 @@ HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, hhcd->hc[ch_num].max_packet = mps; hhcd->hc[ch_num].ch_num = ch_num; hhcd->hc[ch_num].ep_type = ep_type; - hhcd->hc[ch_num].ep_num = epnum & 0x7FU; - hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U); + hhcd->hc[ch_num].ep_num = epnum & 0x7F; + hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80); hhcd->hc[ch_num].speed = speed; status = USB_HC_Init(hhcd->Instance, @@ -342,7 +342,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, hhcd->hc[ch_num].ep_is_in = direction; hhcd->hc[ch_num].ep_type = ep_type; - if(token == 0U) + if(token == 0) { hhcd->hc[ch_num].data_pid = HC_PID_SETUP; } @@ -355,15 +355,15 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, switch(ep_type) { case EP_TYPE_CTRL: - if((token == 1U) && (direction == 0U)) /*send data */ + if((token == 1) && (direction == 0)) /*send data */ { - if (length == 0U) + if (length == 0) { /* For Status OUT stage, Length==0, Status Out PID = 1 */ - hhcd->hc[ch_num].toggle_out = 1U; + hhcd->hc[ch_num].toggle_out = 1; } /* Set the Data Toggle bit as per the Flag */ - if (hhcd->hc[ch_num].toggle_out == 0U) + if (hhcd->hc[ch_num].toggle_out == 0) { /* Put the PID 0 */ hhcd->hc[ch_num].data_pid = HC_PID_DATA0; } @@ -379,10 +379,10 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, break; case EP_TYPE_BULK: - if(direction == 0U) + if(direction == 0) { /* Set the Data Toggle bit as per the Flag */ - if ( hhcd->hc[ch_num].toggle_out == 0U) + if ( hhcd->hc[ch_num].toggle_out == 0) { /* Put the PID 0 */ hhcd->hc[ch_num].data_pid = HC_PID_DATA0; } @@ -397,7 +397,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, } else { - if( hhcd->hc[ch_num].toggle_in == 0U) + if( hhcd->hc[ch_num].toggle_in == 0) { hhcd->hc[ch_num].data_pid = HC_PID_DATA0; } @@ -409,10 +409,10 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, break; case EP_TYPE_INTR: - if(direction == 0U) + if(direction == 0) { /* Set the Data Toggle bit as per the Flag */ - if ( hhcd->hc[ch_num].toggle_out == 0U) + if ( hhcd->hc[ch_num].toggle_out == 0) { /* Put the PID 0 */ hhcd->hc[ch_num].data_pid = HC_PID_DATA0; } @@ -423,7 +423,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, } else { - if( hhcd->hc[ch_num].toggle_in == 0U) + if( hhcd->hc[ch_num].toggle_in == 0) { hhcd->hc[ch_num].data_pid = HC_PID_DATA0; } @@ -442,7 +442,7 @@ HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, hhcd->hc[ch_num].xfer_buff = pbuff; hhcd->hc[ch_num].xfer_len = length; hhcd->hc[ch_num].urb_state = URB_IDLE; - hhcd->hc[ch_num].xfer_count = 0U; + hhcd->hc[ch_num].xfer_count = 0; hhcd->hc[ch_num].ch_num = ch_num; hhcd->hc[ch_num].state = HC_IDLE; @@ -920,7 +920,12 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) __HAL_HCD_UNMASK_HALT_HC_INT(chnum); USB_HC_Halt(hhcd->Instance, chnum); } - else if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)|| + + /* Clear the NAK flag before re-enabling the channel for new IN request */ + hhcd->hc[chnum].state = HC_NAK; + __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); + + if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)|| (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)) { /* re-activate the channel */ @@ -929,8 +934,6 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) tmpreg |= USB_OTG_HCCHAR_CHENA; USBx_HC(chnum)->HCCHAR = tmpreg; } - hhcd->hc[chnum].state = HC_NAK; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); } } @@ -944,7 +947,6 @@ static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum) { USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint32_t tmpreg = 0U; if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR) { @@ -1066,12 +1068,6 @@ static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum) { hhcd->hc[chnum].urb_state = URB_NOTREADY; } - - /* re-activate the channel */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; } __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); @@ -1087,7 +1083,7 @@ static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum) static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) { USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint8_t channelnum = 0U; + uint8_t channelnum = 0; uint32_t pktsts; uint32_t pktcnt; uint32_t temp = 0U; @@ -1102,7 +1098,7 @@ static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) { case GRXSTS_PKTSTS_IN: /* Read the data into the host buffer. */ - if ((pktcnt > 0U) && (hhcd->hc[channelnum].xfer_buff != (void *)0U)) + if ((pktcnt > 0U) && (hhcd->hc[channelnum].xfer_buff != (void *)0)) { USB_ReadPacket(hhcd->Instance, hhcd->hc[channelnum].xfer_buff, pktcnt); @@ -1111,14 +1107,14 @@ static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) hhcd->hc[channelnum].xfer_buff += pktcnt; hhcd->hc[channelnum].xfer_count += pktcnt; - if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0U) + if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0) { /* re-activate the channel when more packets are expected */ tmpreg = USBx_HC(channelnum)->HCCHAR; tmpreg &= ~USB_OTG_HCCHAR_CHDIS; tmpreg |= USB_OTG_HCCHAR_CHENA; USBx_HC(channelnum)->HCCHAR = tmpreg; - hhcd->hc[channelnum].toggle_in ^= 1U; + hhcd->hc[channelnum].toggle_in ^= 1; } } break; @@ -1183,7 +1179,7 @@ static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd) { if(hhcd->Init.speed == HCD_SPEED_FULL) { - USBx_HOST->HFIR = (uint32_t)60000U; + USBx_HOST->HFIR = 60000U; } } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c index eca376f..f12c50d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_i2c.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief I2C HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Inter Integrated Circuit (I2C) peripheral: @@ -203,7 +203,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -249,9 +249,9 @@ /** @addtogroup I2C_Private_Define * @{ */ -#define I2C_TIMEOUT_FLAG ((uint32_t)35U) /*!< Timeout 35 ms */ -#define I2C_TIMEOUT_BUSY_FLAG ((uint32_t)25U) /*!< Timeout 25 ms */ -#define I2C_NO_OPTION_FRAME ((uint32_t)0xFFFF0000U) /*!< XferOptions default value */ +#define I2C_TIMEOUT_FLAG 35U /*!< Timeout 35 ms */ +#define I2C_TIMEOUT_BUSY_FLAG 25U /*!< Timeout 25 ms */ +#define I2C_NO_OPTION_FRAME 0xFFFF0000U /*!< XferOptions default value */ /* Private define for @ref PreviousState usage */ #define I2C_STATE_MSK ((uint32_t)((HAL_I2C_STATE_BUSY_TX | HAL_I2C_STATE_BUSY_RX) & (~(uint32_t)HAL_I2C_STATE_READY))) /*!< Mask State define, keep only RX and TX bits */ @@ -654,7 +654,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevA hi2c->XferCount--; hi2c->XferSize--; - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U)) + if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) { /* Write data to DR */ hi2c->Instance->DR = (*hi2c->pBuffPtr++); @@ -1022,7 +1022,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData hi2c->XferCount--; hi2c->XferSize--; - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U)) + if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U)) { /* Write data to DR */ hi2c->Instance->DR = (*hi2c->pBuffPtr++); @@ -1075,7 +1075,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, if(hi2c->State == HAL_I2C_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -1419,7 +1419,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, /* Generate Start */ hi2c->Instance->CR1 |= I2C_CR1_START; } - else if(Prev_State == I2C_STATE_MASTER_BUSY_RX) + else { /* Generate ReStart */ hi2c->Instance->CR1 |= I2C_CR1_START; @@ -2158,6 +2158,9 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t D */ HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) { + /* Prevent unused argument(s) compilation warning */ + UNUSED(DevAddress); + /* Abort Master transfer during Receive or Transmit process */ if(hi2c->Mode == HAL_I2C_MODE_MASTER) { @@ -2652,7 +2655,7 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, hi2c->XferCount--; } /* Two bytes */ - else if(Size == 2U) + else if(hi2c->XferSize == 2U) { /* Wait until BTF flag is set */ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK) @@ -3065,12 +3068,11 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAdd HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) { uint32_t tickstart = 0x00U; + __IO uint32_t count = 0U; /* Init tickstart for timeout management*/ tickstart = HAL_GetTick(); - __IO uint32_t count = 0U; - /* Check the parameters */ assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); @@ -3937,34 +3939,24 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) } else if((tmp == 2U) || (tmp == 3U)) { - if(hi2c->XferOptions != I2C_NEXT_FRAME) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Enable Pos */ - hi2c->Instance->CR1 |= I2C_CR1_POS; - } - else - { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - } + /* Disable Acknowledge */ + hi2c->Instance->CR1 &= ~I2C_CR1_ACK; + + /* Enable Pos */ + hi2c->Instance->CR1 |= I2C_CR1_POS; /* Disable BUF interrupt */ __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); } else { - if(hi2c->XferOptions != I2C_NEXT_FRAME) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - } - else + /* Disable Acknowledge */ + hi2c->Instance->CR1 &= ~I2C_CR1_ACK; + + if(hi2c->XferOptions == I2C_NEXT_FRAME) { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; + /* Enable Pos */ + hi2c->Instance->CR1 |= I2C_CR1_POS; } /* Disable EVT, BUF and ERR interrupt */ @@ -3975,16 +3967,15 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) hi2c->XferCount--; hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; if(hi2c->Mode == HAL_I2C_MODE_MEM) { - hi2c->PreviousState = I2C_STATE_NONE; hi2c->Mode = HAL_I2C_MODE_NONE; HAL_I2C_MemRxCpltCallback(hi2c); } else { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; hi2c->Mode = HAL_I2C_MODE_NONE; HAL_I2C_MasterRxCpltCallback(hi2c); } @@ -4021,15 +4012,13 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) /* Prepare next transfer or stop current transfer */ if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME)) { - if(CurrentXferOptions != I2C_NEXT_FRAME) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - } - else + /* Disable Acknowledge */ + hi2c->Instance->CR1 &= ~I2C_CR1_ACK; + + if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME)) { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; + /* Generate ReStart */ + hi2c->Instance->CR1 |= I2C_CR1_START; } } else @@ -4050,17 +4039,16 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); hi2c->State = HAL_I2C_STATE_READY; - + hi2c->PreviousState = I2C_STATE_NONE; + if(hi2c->Mode == HAL_I2C_MODE_MEM) { - hi2c->PreviousState = I2C_STATE_NONE; hi2c->Mode = HAL_I2C_MODE_NONE; HAL_I2C_MemRxCpltCallback(hi2c); } else { - hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; hi2c->Mode = HAL_I2C_MODE_NONE; HAL_I2C_MasterRxCpltCallback(hi2c); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c index 6fdec61..74a099d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_i2c_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief I2C Extension HAL module driver. * This file provides firmware functions to manage the following * functionalities of I2C extension peripheral: @@ -30,7 +30,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -146,7 +146,7 @@ HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t */ HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) { - uint16_t tmpreg = 0U; + uint16_t tmpreg = 0; /* Check the parameters */ assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c index b2a5ec3..539f3ca 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c @@ -2,10 +2,10 @@ ****************************************************************************** * @file stm32f4xx_hal_i2s.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief I2S HAL module driver. - * This file provides firmware functions to manage the following + * This file provides firmware functions to manage the following * functionalities of the Integrated Interchip Sound (I2S) peripheral: * + Initialization and de-initialization functions * + IO operation functions @@ -16,10 +16,10 @@ =============================================================================== [..] The I2S HAL driver can be used as follow: - + (#) Declare a I2S_HandleTypeDef handle structure. (#) Initialize the I2S low level resources by implement the HAL_I2S_MspInit() API: - (##) Enable the SPIx interface clock. + (##) Enable the SPIx interface clock. (##) I2S pins configuration: (+++) Enable the clock for the I2S GPIOs. (+++) Configure these I2S pins as alternate function pull-up. @@ -34,58 +34,58 @@ (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. (+++) Configure the DMA Tx/Rx Stream. (+++) Associate the initialized DMA handle to the I2S DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the + (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream. - + (#) Program the Mode, Standard, Data Format, MCLK Output, Audio frequency and Polarity using HAL_I2S_Init() function. - -@- The specific I2S interrupts (Transmission complete interrupt, + -@- The specific I2S interrupts (Transmission complete interrupt, RXNE interrupt and Error Interrupts) will be managed using the macros - __I2S_ENABLE_IT() and __I2S_DISABLE_IT() inside the transmit and receive process. + __HAL_I2S_ENABLE_IT() and __HAL_I2S_DISABLE_IT() inside the transmit and receive process. -@- Make sure that either: - (+@) I2S PLL is configured or - (+@) External clock source is configured after setting correctly - the define constant EXTERNAL_CLOCK_VALUE in the stm32f4xx_hal_conf.h file. - + (+@) I2S PLL is configured or + (+@) External clock source is configured after setting correctly + the define constant EXTERNAL_CLOCK_VALUE in the stm32f4xx_hal_conf.h file. + (#) Three operation modes are available within this driver : - + *** Polling mode IO operation *** ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_I2S_Transmit() + [..] + (+) Send an amount of data in blocking mode using HAL_I2S_Transmit() (+) Receive an amount of data in blocking mode using HAL_I2S_Receive() - + *** Interrupt mode IO operation *** =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_I2S_Transmit_IT() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can + [..] + (+) Send an amount of data in non blocking mode using HAL_I2S_Transmit_IT() + (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback + (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_I2S_Receive_IT() - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can + (+) Receive an amount of data in non blocking mode using HAL_I2S_Receive_IT() + (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback + (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can + (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can add his own code by customization of function pointer HAL_I2S_ErrorCallback *** DMA mode IO operation *** ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_I2S_Transmit_DMA() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can + [..] + (+) Send an amount of data in non blocking mode (DMA) using HAL_I2S_Transmit_DMA() + (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback + (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_I2S_Receive_DMA() - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can + (+) Receive an amount of data in non blocking mode (DMA) using HAL_I2S_Receive_DMA() + (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback + (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can + (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can add his own code by customization of function pointer HAL_I2S_ErrorCallback (+) Pause the DMA Transfer using HAL_I2S_DMAPause() (+) Resume the DMA Transfer using HAL_I2S_DMAResume() @@ -94,9 +94,9 @@ *** I2S HAL driver macros list *** ============================================= [..] - Below the list of most used macros in USART HAL driver. - - (+) __HAL_I2S_ENABLE: Enable the specified SPI peripheral (in I2S mode) + Below the list of most used macros in I2S HAL driver. + + (+) __HAL_I2S_ENABLE: Enable the specified SPI peripheral (in I2S mode) (+) __HAL_I2S_DISABLE: Disable the specified SPI peripheral (in I2S mode) (+) __HAL_I2S_ENABLE_IT : Enable the specified I2S interrupts (+) __HAL_I2S_DISABLE_IT : Disable the specified I2S interrupts @@ -109,7 +109,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -134,7 +134,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** - */ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" @@ -143,77 +143,88 @@ * @{ */ +#ifdef HAL_I2S_MODULE_ENABLED + /** @defgroup I2S I2S * @brief I2S HAL module driver * @{ */ -#ifdef HAL_I2S_MODULE_ENABLED - /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ + /** @addtogroup I2S_Private_Functions * @{ */ - +static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma); +static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma); +static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma); +static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma); +static void I2S_DMAError(DMA_HandleTypeDef *hdma); +static void I2S_Transmit_IT(I2S_HandleTypeDef *hi2s); +static void I2S_Receive_IT(I2S_HandleTypeDef *hi2s); +static void I2S_IRQHandler(I2S_HandleTypeDef *hi2s); +static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t State, + uint32_t Timeout); /** * @} */ - + /* Exported functions --------------------------------------------------------*/ -/** @defgroup I2S_Exported_Functions I2S Exported Functions +/** @addtogroup I2S_Exported_Functions I2S Exported Functions * @{ */ -/** @defgroup I2S_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim +/** @addtogroup I2S_Exported_Functions_Group1 + * @brief Initialization and Configuration functions + * +@verbatim =============================================================================== ##### Initialization and de-initialization functions ##### =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and + [..] This subsection provides a set of functions allowing to initialize and de-initialize the I2Sx peripheral in simplex mode: - (+) User must Implement HAL_I2S_MspInit() function in which he configures + (+) User must Implement HAL_I2S_MspInit() function in which he configures all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - (+) Call the function HAL_I2S_Init() to configure the selected device with + (+) Call the function HAL_I2S_Init() to configure the selected device with the selected configuration: (++) Mode - (++) Standard + (++) Standard (++) Data Format (++) MCLK Output (++) Audio frequency (++) Polarity + (++) Full duplex mode - (+) Call the function HAL_I2S_DeInit() to restore the default configuration - of the selected I2Sx peripheral. + (+) Call the function HAL_I2S_DeInit() to restore the default configuration + of the selected I2Sx peripheral. @endverbatim * @{ */ /** - * @brief Initializes the I2S according to the specified parameters + * @brief Initializes the I2S according to the specified parameters * in the I2S_InitTypeDef and create the associated handle. * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @retval HAL status */ -__weak HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) +HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) { - uint32_t tmpreg = 0U, i2sdiv = 2U, i2sodd = 0U, packetlength = 1U; + uint32_t tmpreg = 0U, i2sdiv = 2U, i2sodd = 0U, packetlength = 16U; uint32_t tmp = 0U, i2sclk = 0U; - + /* Check the I2S handle allocation */ if(hi2s == NULL) { return HAL_ERROR; } - + /* Check the I2S parameters */ assert_param(IS_I2S_ALL_INSTANCE(hi2s->Instance)); assert_param(IS_I2S_MODE(hi2s->Init.Mode)); @@ -221,24 +232,22 @@ __weak HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) assert_param(IS_I2S_DATA_FORMAT(hi2s->Init.DataFormat)); assert_param(IS_I2S_MCLK_OUTPUT(hi2s->Init.MCLKOutput)); assert_param(IS_I2S_AUDIO_FREQ(hi2s->Init.AudioFreq)); - assert_param(IS_I2S_CPOL(hi2s->Init.CPOL)); + assert_param(IS_I2S_CPOL(hi2s->Init.CPOL)); assert_param(IS_I2S_CLOCKSOURCE(hi2s->Init.ClockSource)); - - if(hi2s->State == HAL_I2S_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2s->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ - HAL_I2S_MspInit(hi2s); - } - + hi2s->State = HAL_I2S_STATE_BUSY; - + + /* Initialize Default I2S IrqHandler ISR */ + hi2s->IrqHandlerISR = I2S_IRQHandler; + + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + HAL_I2S_MspInit(hi2s); + /*----------------------- SPIx I2SCFGR & I2SPR Configuration ---------------*/ /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - hi2s->Instance->I2SCFGR &= ~(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ - SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ - SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD); + CLEAR_BIT(hi2s->Instance->I2SCFGR,(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ + SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ + SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD)); hi2s->Instance->I2SPR = 0x0002U; /* Get the I2SCFGR register value */ @@ -249,37 +258,66 @@ __weak HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) if(hi2s->Init.AudioFreq != I2S_AUDIOFREQ_DEFAULT) { /* Check the frame length (For the Prescaler computing) *******************/ + /* Set I2S Packet Length value*/ if(hi2s->Init.DataFormat != I2S_DATAFORMAT_16B) { /* Packet length is 32 bits */ - packetlength = 2U; + packetlength = 32U; + } + else + { + /* Packet length is 16 bits */ + packetlength = 16U; } - /* Get I2S source Clock frequency ****************************************/ - /* If an external I2S clock has to be used, the specific define should be set - in the project configuration or in the stm32f4xx_conf.h file */ - i2sclk = I2S_GetInputClock(hi2s); + /* I2S standard */ + if(hi2s->Init.Standard <= I2S_STANDARD_LSB) + { + /* In I2S standard packet lenght is multiplied by 2 */ + packetlength = packetlength * 2U; + } + + /* Get I2S source Clock frequency from RCC ********************************/ +#if defined(I2S_APB1_APB2_FEATURE) + if(IS_I2S_APB1_INSTANCE(hi2s->Instance)) + { + i2sclk = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2S_APB1); + } + else + { + i2sclk = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2S_APB2); + } +#else + i2sclk = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_I2S); +#endif /* Compute the Real divider depending on the MCLK output state, with a floating point */ if(hi2s->Init.MCLKOutput == I2S_MCLKOUTPUT_ENABLE) { /* MCLK output is enabled */ - tmp = (uint32_t)(((((i2sclk / 256U) * 10U) / hi2s->Init.AudioFreq)) + 5U); + if (hi2s->Init.DataFormat != I2S_DATAFORMAT_16B) + { + tmp = (uint32_t)(((((i2sclk / (packetlength*4)) * 10) / hi2s->Init.AudioFreq)) + 5); + } + else + { + tmp = (uint32_t)(((((i2sclk / (packetlength*8)) * 10) / hi2s->Init.AudioFreq)) + 5); + } } else { /* MCLK output is disabled */ - tmp = (uint32_t)(((((i2sclk / (32U * packetlength)) *10U) / hi2s->Init.AudioFreq)) + 5U); + tmp = (uint32_t)(((((i2sclk / packetlength) *10 ) / hi2s->Init.AudioFreq)) + 5); } /* Remove the flatting point */ - tmp = tmp / 10U; + tmp = tmp / 10U; /* Check the parity of the divider */ - i2sodd = (uint32_t)(tmp & (uint32_t)1U); + i2sodd = (uint16_t)(tmp & (uint16_t)1U); /* Compute the i2sdiv prescaler */ - i2sdiv = (uint32_t)((tmp - i2sodd) / 2U); + i2sdiv = (uint16_t)((tmp - i2sodd) / 2U); /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ i2sodd = (uint32_t) (i2sodd << 8U); @@ -291,38 +329,84 @@ __weak HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) /* Set the default values */ i2sdiv = 2U; i2sodd = 0U; + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_PRESCALER); + HAL_I2S_ErrorCallback(hi2s); + return HAL_ERROR; } - + /* Write to SPIx I2SPR register the computed value */ hi2s->Instance->I2SPR = (uint32_t)((uint32_t)i2sdiv | (uint32_t)(i2sodd | (uint32_t)hi2s->Init.MCLKOutput)); - + /* Configure the I2S with the I2S_InitStruct values */ - tmpreg |= (uint32_t)(SPI_I2SCFGR_I2SMOD | hi2s->Init.Mode | hi2s->Init.Standard | hi2s->Init.DataFormat | hi2s->Init.CPOL); - + tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | (uint16_t)(hi2s->Init.Mode | \ + (uint16_t)(hi2s->Init.Standard | (uint16_t)(hi2s->Init.DataFormat | \ + (uint16_t)hi2s->Init.CPOL)))); + #if defined(SPI_I2SCFGR_ASTRTEN) - if (hi2s->Init.Standard == I2S_STANDARD_PCM_SHORT) + if ((hi2s->Init.Standard == I2S_STANDARD_PCM_SHORT) ||(hi2s->Init.Standard == I2S_STANDARD_PCM_LONG)) { - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg | SPI_I2SCFGR_ASTRTEN; + /* Write to SPIx I2SCFGR */ + WRITE_REG(hi2s->Instance->I2SCFGR,(tmpreg | SPI_I2SCFGR_ASTRTEN)); } else { - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg; + /* Write to SPIx I2SCFGR */ + WRITE_REG(hi2s->Instance->I2SCFGR,tmpreg); } #else - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg; + /* Write to SPIx I2SCFGR */ + WRITE_REG(hi2s->Instance->I2SCFGR, tmpreg); #endif - + +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) + + /* Configure the I2S extended if the full duplex mode is enabled */ + assert_param(IS_I2S_FULLDUPLEX_MODE(hi2s->Init.FullDuplexMode)); + + if(hi2s->Init.FullDuplexMode == I2S_FULLDUPLEXMODE_ENABLE) + { + /* Set FullDuplex I2S IrqHandler ISR if FULLDUPLEXMODE is enabled */ + hi2s->IrqHandlerISR = HAL_I2SEx_FullDuplex_IRQHandler; + + /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ + CLEAR_BIT(I2SxEXT(hi2s->Instance)->I2SCFGR,(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ + SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ + SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD)); + I2SxEXT(hi2s->Instance)->I2SPR = 2U; + + /* Get the I2SCFGR register value */ + tmpreg = I2SxEXT(hi2s->Instance)->I2SCFGR; + + /* Get the mode to be configured for the extended I2S */ + if((hi2s->Init.Mode == I2S_MODE_MASTER_TX) || (hi2s->Init.Mode == I2S_MODE_SLAVE_TX)) + { + tmp = I2S_MODE_SLAVE_RX; + } + else /* I2S_MODE_MASTER_RX || I2S_MODE_SLAVE_RX */ + { + tmp = I2S_MODE_SLAVE_TX; + } + + /* Configure the I2S Slave with the I2S Master parameter values */ + tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | (uint16_t)(tmp | \ + (uint16_t)(hi2s->Init.Standard | (uint16_t)(hi2s->Init.DataFormat | \ + (uint16_t)hi2s->Init.CPOL)))); + + /* Write to SPIx I2SCFGR */ + WRITE_REG(I2SxEXT(hi2s->Instance)->I2SCFGR,tmpreg); + } +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ + hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - hi2s->State= HAL_I2S_STATE_READY; - + hi2s->State = HAL_I2S_STATE_READY; + return HAL_OK; } - + /** - * @brief DeInitializes the I2S peripheral + * @brief DeInitializes the I2S peripheral * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @retval HAL status @@ -334,14 +418,14 @@ HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) { return HAL_ERROR; } - + hi2s->State = HAL_I2S_STATE_BUSY; - + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ HAL_I2S_MspDeInit(hi2s); hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - hi2s->State = HAL_I2S_STATE_RESET; + hi2s->State = HAL_I2S_STATE_RESET; /* Release Lock */ __HAL_UNLOCK(hi2s); @@ -361,7 +445,7 @@ HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) UNUSED(hi2s); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_I2S_MspInit could be implemented in the user file - */ + */ } /** @@ -376,37 +460,37 @@ HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) UNUSED(hi2s); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_I2S_MspDeInit could be implemented in the user file - */ + */ } /** * @} */ -/** @defgroup I2S_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim +/** @addtogroup I2S_Exported_Functions_Group2 + * @brief Data transfers functions + * +@verbatim =============================================================================== ##### IO operation functions ##### =============================================================================== [..] - This subsection provides a set of functions allowing to manage the I2S data + This subsection provides a set of functions allowing to manage the I2S data transfers. (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts + (++) Blocking mode : The communication is performed in the polling mode. + The status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode : The communication is performed using Interrupts or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when + The end of the data processing will be indicated through the + dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. (#) Blocking mode functions are : (++) HAL_I2S_Transmit() (++) HAL_I2S_Receive() - + (#) No-Blocking mode functions with Interrupt are : (++) HAL_I2S_Transmit_IT() (++) HAL_I2S_Receive_IT() @@ -431,72 +515,88 @@ HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) * @param pData: a 16-bit pointer to data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. * @param Timeout: Timeout duration - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tmp1 = 0U; - if((pData == NULL ) || (Size == 0U)) + uint32_t tmp1 = 0U; + + if((pData == NULL ) || (Size == 0U)) { return HAL_ERROR; } - + if(hi2s->State == HAL_I2S_STATE_READY) - { + { tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); + if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; } - + /* Process Locked */ __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_TX; - - /* Check if the I2S is already enabled */ + + hi2s->ErrorCode = HAL_I2S_ERROR_NONE; + hi2s->State = HAL_I2S_STATE_BUSY_TX; + + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ __HAL_I2S_ENABLE(hi2s); } - + while(hi2s->TxXferCount > 0U) { hi2s->Instance->DR = (*pData++); - hi2s->TxXferCount--; + hi2s->TxXferCount--; + /* Wait until TXE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, RESET, Timeout) != HAL_OK) + if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout) != HAL_OK) { + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); return HAL_TIMEOUT; } - } - /* Check if Slave mode is selected */ - if(((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX) || ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_RX)) - { - /* Wait until Busy flag is reset */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_BSY, SET, Timeout) != HAL_OK) + + /* Check if an underrun occurs */ + if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET) { - return HAL_TIMEOUT; + /* Clear underrun flag */ + __HAL_I2S_CLEAR_UDRFLAG(hi2s); + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); + + return HAL_ERROR; } } - hi2s->State = HAL_I2S_STATE_READY; - + hi2s->State = HAL_I2S_STATE_READY; + /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } else @@ -506,49 +606,51 @@ HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uin } /** - * @brief Receive an amount of data in blocking mode + * @brief Receive an amount of data in blocking mode * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module - * @param pData: a 16-bit pointer to data buffer. + * @param pData: a 16-bit pointer to data buffer * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. * @param Timeout: Timeout duration - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * between Master and Slave(example: audio streaming) * @note In I2S Master Receiver mode, just after enabling the peripheral the clock will be generate - * in continuous way and as the I2S is not disabled at the end of the I2S transaction. + * in continuous way and as the I2S is not disabled at the end of the I2S transaction * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout) { - uint32_t tmp1 = 0U; - if((pData == NULL ) || (Size == 0U)) + uint32_t tmp1 = 0U; + + if((pData == NULL ) || (Size == 0U)) { return HAL_ERROR; } - + if(hi2s->State == HAL_I2S_STATE_READY) - { + { tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); } else { - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - hi2s->State = HAL_I2S_STATE_BUSY_RX; + hi2s->ErrorCode = HAL_I2S_ERROR_NONE; + hi2s->State = HAL_I2S_STATE_BUSY_RX; - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ @@ -559,7 +661,7 @@ HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) { /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ + access to the SPI_SR register. */ __HAL_I2S_CLEAR_OVRFLAG(hi2s); } @@ -567,20 +669,42 @@ HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint while(hi2s->RxXferCount > 0U) { /* Wait until RXNE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, RESET, Timeout) != HAL_OK) + if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout) != HAL_OK) { + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); return HAL_TIMEOUT; } + /* Check if an overrun occurs */ + if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET) + { + /* Clear overrun flag */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); + + return HAL_ERROR; + } + (*pData++) = hi2s->Instance->DR; hi2s->RxXferCount--; } - hi2s->State = HAL_I2S_STATE_READY; - + hi2s->State = HAL_I2S_STATE_READY; + /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } else @@ -596,19 +720,20 @@ HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint * @param pData: a 16-bit pointer to data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) { - uint32_t tmp1 = 0U; + uint32_t tmp1 = 0U; + if(hi2s->State == HAL_I2S_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -617,25 +742,25 @@ HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - hi2s->State = HAL_I2S_STATE_BUSY_TX; + hi2s->State = HAL_I2S_STATE_BUSY_TX; hi2s->ErrorCode = HAL_I2S_ERROR_NONE; /* Enable TXE and ERR interrupt */ __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ @@ -644,7 +769,7 @@ HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } else @@ -660,21 +785,22 @@ HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, * @param pData: a 16-bit pointer to the Receive data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). - * @note It is recommended to use DMA for the I2S receiver to avoid de-synchronisation - * between Master and Slave otherwise the I2S interrupt should be optimized. + * @note It is recommended to use DMA for the I2S receiver to avoid de-synchronisation + * between Master and Slave otherwise the I2S interrupt should be optimized. * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) { - uint32_t tmp1 = 0U; + uint32_t tmp1 = 0U; + if(hi2s->State == HAL_I2S_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0U)) { return HAL_ERROR; } @@ -683,24 +809,24 @@ HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, u tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); } else { - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_RX; + + hi2s->State = HAL_I2S_STATE_BUSY_RX; hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - + /* Enable TXE and ERR interrupt */ __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - - /* Check if the I2S is already enabled */ + + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ @@ -715,8 +841,8 @@ HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, u else { - return HAL_BUSY; - } + return HAL_BUSY; + } } /** @@ -726,43 +852,43 @@ HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, u * @param pData: a 16-bit pointer to the Transmit data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) { - uint32_t *tmp; - uint32_t tmp1 = 0U; - - if((pData == NULL) || (Size == 0U)) + uint32_t *tmp = NULL; + uint32_t tmp1 = 0U; + + if((pData == NULL) || (Size == 0U)) { return HAL_ERROR; } if(hi2s->State == HAL_I2S_STATE_READY) - { + { hi2s->pTxBuffPtr = pData; tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - hi2s->State = HAL_I2S_STATE_BUSY_TX; hi2s->ErrorCode = HAL_I2S_ERROR_NONE; + hi2s->State = HAL_I2S_STATE_BUSY_TX; /* Set the I2S Tx DMA Half transfer complete callback */ hi2s->hdmatx->XferHalfCpltCallback = I2S_DMATxHalfCplt; @@ -777,23 +903,23 @@ HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, tmp = (uint32_t*)&pData; HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t*)tmp, (uint32_t)&hi2s->Instance->DR, hi2s->TxXferSize); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ __HAL_I2S_ENABLE(hi2s); } - /* Check if the I2S Tx request is already enabled */ + /* Check if the I2S Tx request is already enabled */ if((hi2s->Instance->CR2 & SPI_CR2_TXDMAEN) != SPI_CR2_TXDMAEN) { - /* Enable Tx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; + /* Enable Tx DMA Request */ + SET_BIT(hi2s->Instance->CR2, SPI_CR2_TXDMAEN); } /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } else @@ -803,24 +929,24 @@ HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, } /** - * @brief Receive an amount of data in non-blocking mode with DMA + * @brief Receive an amount of data in non-blocking mode with DMA * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @param pData: a 16-bit pointer to the Receive data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) { - uint32_t *tmp; - uint32_t tmp1 = 0U; - + uint32_t *tmp = NULL; + uint32_t tmp1 = 0U; + if((pData == NULL) || (Size == 0U)) { return HAL_ERROR; @@ -832,53 +958,53 @@ HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); } else { - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_RX; + + hi2s->State = HAL_I2S_STATE_BUSY_RX; hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - + /* Set the I2S Rx DMA Half transfer complete callback */ hi2s->hdmarx->XferHalfCpltCallback = I2S_DMARxHalfCplt; - + /* Set the I2S Rx DMA transfer complete callback */ hi2s->hdmarx->XferCpltCallback = I2S_DMARxCplt; - + /* Set the DMA error callback */ hi2s->hdmarx->XferErrorCallback = I2S_DMAError; - + /* Check if Master Receiver mode is selected */ if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) { /* Clear the Overrun Flag by a read operation to the SPI_DR register followed by a read - access to the SPI_SR register. */ + access to the SPI_SR register. */ __HAL_I2S_CLEAR_OVRFLAG(hi2s); } - + /* Enable the Rx DMA Stream */ tmp = (uint32_t*)&pData; HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&hi2s->Instance->DR, *(uint32_t*)tmp, hi2s->RxXferSize); - - /* Check if the I2S is already enabled */ + + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2S peripheral */ __HAL_I2S_ENABLE(hi2s); } - /* Check if the I2S Rx request is already enabled */ + /* Check if the I2S Rx request is already enabled */ if((hi2s->Instance->CR2 &SPI_CR2_RXDMAEN) != SPI_CR2_RXDMAEN) { - /* Enable Rx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; + /* Enable Rx DMA Request */ + SET_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); } /* Process Unlocked */ @@ -898,39 +1024,34 @@ HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, * the configuration information for I2S module * @retval HAL status */ -__weak HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s) +HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s) { /* Process Locked */ __HAL_LOCK(hi2s); - + if(hi2s->State == HAL_I2S_STATE_BUSY_TX) { /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); } else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) { /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); } +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) - { - /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } - else - { - /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } + /* Pause the audio file playing by disabling the I2S DMA request */ + CLEAR_BIT(hi2s->Instance->CR2,(SPI_CR2_TXDMAEN|SPI_CR2_RXDMAEN)); + CLEAR_BIT(I2SxEXT(hi2s->Instance)->CR2,(SPI_CR2_TXDMAEN|SPI_CR2_RXDMAEN)); } +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ /* Process Unlocked */ __HAL_UNLOCK(hi2s); - - return HAL_OK; + + return HAL_OK; } /** @@ -939,45 +1060,47 @@ __weak HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s) * the configuration information for I2S module * @retval HAL status */ -__weak HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s) +HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s) { /* Process Locked */ __HAL_LOCK(hi2s); - + if(hi2s->State == HAL_I2S_STATE_BUSY_TX) { /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; + SET_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); } else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) { /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; + SET_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); } +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) - { - /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - } - else + /* Pause the audio file playing by disabling the I2S DMA request */ + SET_BIT(hi2s->Instance->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); + SET_BIT(I2SxEXT(hi2s->Instance)->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); + + /* If the I2Sext peripheral is still not enabled, enable it */ + if ((I2SxEXT(hi2s->Instance)->I2SCFGR & SPI_I2SCFGR_I2SE) == 0U) { - /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; + /* Enable I2Sext peripheral */ + __HAL_I2SEXT_ENABLE(hi2s); } } +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ /* If the I2S peripheral is still not enabled, enable it */ if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) == 0U) { - /* Enable I2S peripheral */ + /* Enable I2S peripheral */ __HAL_I2S_ENABLE(hi2s); } - + /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } @@ -987,34 +1110,51 @@ __weak HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s) * the configuration information for I2S module * @retval HAL status */ -__weak HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s) +HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s) { /* Process Locked */ __HAL_LOCK(hi2s); - - /* Disable the I2S Tx/Rx DMA requests */ - hi2s->Instance->CR2 &= ~SPI_CR2_TXDMAEN; - hi2s->Instance->CR2 &= ~SPI_CR2_RXDMAEN; - /* Abort the I2S DMA Stream tx */ - if(hi2s->hdmatx != NULL) + if(hi2s->State == HAL_I2S_STATE_BUSY_TX) { + /* Disable the I2S DMA requests */ + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); + + /* Disable the I2S DMA Channel */ HAL_DMA_Abort(hi2s->hdmatx); } - /* Abort the I2S DMA Stream rx */ - if(hi2s->hdmarx != NULL) + else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) { + /* Disable the I2S DMA requests */ + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); + + /* Disable the I2S DMA Channel */ HAL_DMA_Abort(hi2s->hdmarx); } +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) + else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) + { + /* Disable the I2S DMA requests */ + CLEAR_BIT(hi2s->Instance->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); + CLEAR_BIT(I2SxEXT(hi2s->Instance)->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); + + /* Disable the I2S DMA Channels */ + HAL_DMA_Abort(hi2s->hdmatx); + HAL_DMA_Abort(hi2s->hdmarx); + + /* Disable I2Sext peripheral */ + __HAL_I2SEXT_DISABLE(hi2s); + } +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ /* Disable I2S peripheral */ __HAL_I2S_DISABLE(hi2s); - + hi2s->State = HAL_I2S_STATE_READY; - + /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } @@ -1024,57 +1164,10 @@ __weak HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s) * the configuration information for I2S module * @retval None */ -__weak void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) -{ - uint32_t tmp1 = 0U, tmp2 = 0U; - - if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE); - /* I2S in mode Receiver ------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Receive_IT(hi2s); - } - - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Overrun error interrupt occurred ---------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_OVR; - } - } - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE); - /* I2S in mode Transmitter -----------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Transmit_IT(hi2s); - } - - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Underrun error interrupt occurred --------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_UDRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_UDR; - } - } - - /* Call the Error call Back in case of Errors */ - if(hi2s->ErrorCode != HAL_I2S_ERROR_NONE) - { - /* Set the I2S state ready to be able to start again the process */ - hi2s->State= HAL_I2S_STATE_READY; - HAL_I2S_ErrorCallback(hi2s); - } +void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) +{ + /* Call the IrqHandler ISR set during HAL_I2S_INIT */ + hi2s->IrqHandlerISR(hi2s); } /** @@ -1089,7 +1182,7 @@ __weak void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) UNUSED(hi2s); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_I2S_TxHalfCpltCallback could be implemented in the user file - */ + */ } /** @@ -1104,7 +1197,7 @@ __weak void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) UNUSED(hi2s); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_I2S_TxCpltCallback could be implemented in the user file - */ + */ } /** @@ -1149,21 +1242,22 @@ __weak void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) UNUSED(hi2s); /* NOTE : This function Should not be modified, when the callback is needed, the HAL_I2S_ErrorCallback could be implemented in the user file - */ + */ } /** * @} */ -/** @defgroup I2S_Exported_Functions_Group3 Peripheral State and Errors functions +/** @addtogroup I2S_Exported_Functions_Group3 * @brief Peripheral State functions -@verbatim + * +@verbatim =============================================================================== ##### Peripheral State and Errors functions ##### - =============================================================================== + =============================================================================== [..] - This subsection permits to get in run-time the status of the peripheral + This subsection permits to get in run-time the status of the peripheral and the data flow. @endverbatim @@ -1196,12 +1290,39 @@ uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s) */ /** - * @brief DMA I2S transmit process half complete callback + * @} + */ + +/** @addtogroup I2S_Private_Functions I2S Private Functions + * @{ + */ +/** + * @brief DMA I2S transmit process complete callback + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma) +{ + I2S_HandleTypeDef* hi2s = ( I2S_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + + if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + /* Disable Tx DMA Request */ + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); + + hi2s->TxXferCount = 0U; + hi2s->State = HAL_I2S_STATE_READY; + } + HAL_I2S_TxCpltCallback(hi2s); +} +/** + * @brief DMA I2S transmit process half complete callback * @param hdma: pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA module. * @retval None */ - void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma) +static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma) { I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; @@ -1209,34 +1330,56 @@ uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s) } /** - * @brief DMA I2S receive process half complete callback + * @brief DMA I2S receive process complete callback * @param hdma: pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA module. * @retval None */ -void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma) +static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma) +{ + I2S_HandleTypeDef* hi2s = ( I2S_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + + if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + /* Disable Rx DMA Request */ + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); + hi2s->RxXferCount = 0U; + hi2s->State = HAL_I2S_STATE_READY; + } + HAL_I2S_RxCpltCallback(hi2s); +} + +/** + * @brief DMA I2S receive process half complete callback + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma) { I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - HAL_I2S_RxHalfCpltCallback(hi2s); + HAL_I2S_RxHalfCpltCallback(hi2s); } /** - * @brief DMA I2S communication error callback + * @brief DMA I2S communication error callback * @param hdma: pointer to a DMA_HandleTypeDef structure that contains * the configuration information for the specified DMA module. * @retval None */ -void I2S_DMAError(DMA_HandleTypeDef *hdma) +static void I2S_DMAError(DMA_HandleTypeDef *hdma) { I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; + /* Disable Rx and Tx DMA Request */ + CLEAR_BIT(hi2s->Instance->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); hi2s->TxXferCount = 0U; hi2s->RxXferCount = 0U; hi2s->State= HAL_I2S_STATE_READY; - hi2s->ErrorCode |= HAL_I2S_ERROR_DMA; + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_DMA); HAL_I2S_ErrorCallback(hi2s); } @@ -1246,41 +1389,19 @@ void I2S_DMAError(DMA_HandleTypeDef *hdma) * the configuration information for I2S module * @retval HAL status */ -HAL_StatusTypeDef I2S_Transmit_IT(I2S_HandleTypeDef *hi2s) +static void I2S_Transmit_IT(I2S_HandleTypeDef *hi2s) { - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Process Locked */ - __HAL_LOCK(hi2s); - - /* Transmit data */ - hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); - - hi2s->TxXferCount--; - - if(hi2s->TxXferCount == 0U) - { - /* Disable TXE and ERR interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - HAL_I2S_TxCpltCallback(hi2s); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - } + /* Transmit data */ + hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); + hi2s->TxXferCount--; - return HAL_OK; - } - - else + if(hi2s->TxXferCount == 0U) { - return HAL_BUSY; + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2S_TxCpltCallback(hi2s); } } @@ -1290,50 +1411,84 @@ HAL_StatusTypeDef I2S_Transmit_IT(I2S_HandleTypeDef *hi2s) * the configuration information for I2S module * @retval HAL status */ -HAL_StatusTypeDef I2S_Receive_IT(I2S_HandleTypeDef *hi2s) +static void I2S_Receive_IT(I2S_HandleTypeDef *hi2s) { - if(hi2s->State == HAL_I2S_STATE_BUSY_RX) + /* Receive data */ + (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR; + hi2s->RxXferCount--; + + if(hi2s->RxXferCount == 0U) { - /* Process Locked */ - __HAL_LOCK(hi2s); + /* Disable RXNE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - /* Receive data */ - (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR; + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2S_RxCpltCallback(hi2s); + } +} - hi2s->RxXferCount--; +/** + * @brief This function handles I2S interrupt request. + * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains + * the configuration information for I2S module + * @retval None + */ +static void I2S_IRQHandler(I2S_HandleTypeDef *hi2s) +{ + __IO uint32_t i2ssr = hi2s->Instance->SR; - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) + if(hi2s->State == HAL_I2S_STATE_BUSY_RX) + { + /* I2S in mode Receiver ------------------------------------------------*/ + if(((i2ssr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE) != RESET)) { - /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); + I2S_Receive_IT(hi2s); } - if(hi2s->RxXferCount == 0U) + /* I2S Overrun error interrupt occured -------------------------------------*/ + if(((i2ssr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) { /* Disable RXNE and ERR interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, I2S_IT_RXNE | I2S_IT_ERR); + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); + + /* Clear Overrun flag */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); + /* Set the I2S State ready */ hi2s->State = HAL_I2S_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - HAL_I2S_RxCpltCallback(hi2s); + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); + } } - else + + if(hi2s->State == HAL_I2S_STATE_BUSY_TX) { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - } + /* I2S in mode Transmitter -----------------------------------------------*/ + if(((i2ssr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE) != RESET)) + { + I2S_Transmit_IT(hi2s); + } + + /* I2S Underrun error interrupt occurred --------------------------------*/ + if(((i2ssr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) + { + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + + /* Clear Underrun flag */ + __HAL_I2S_CLEAR_UDRFLAG(hi2s); - return HAL_OK; + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); + } } - else - { - return HAL_BUSY; - } } /** @@ -1341,53 +1496,29 @@ HAL_StatusTypeDef I2S_Receive_IT(I2S_HandleTypeDef *hi2s) * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @param Flag: Flag checked - * @param Status: Value of the flag expected + * @param State: Value of the flag expected * @param Timeout: Duration of the timeout * @retval HAL status */ -HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t Status, uint32_t Timeout) +static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t State, + uint32_t Timeout) { - uint32_t tickstart = 0U; + uint32_t tickstart = HAL_GetTick(); - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_I2S_GET_FLAG(hi2s, Flag) == RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Set the I2S State ready */ - hi2s->State= HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_TIMEOUT; - } - } - } - } - else + /* Wait until flag is set to status*/ + while(((__HAL_I2S_GET_FLAG(hi2s, Flag)) ? SET : RESET) != State) { - while(__HAL_I2S_GET_FLAG(hi2s, Flag) != RESET) + if(Timeout != HAL_MAX_DELAY) { - if(Timeout != HAL_MAX_DELAY) + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Set the I2S State ready */ - hi2s->State= HAL_I2S_STATE_READY; + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); - return HAL_TIMEOUT; - } + return HAL_TIMEOUT; } } } @@ -1397,12 +1528,12 @@ HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_ /** * @} */ - -#endif /* HAL_I2S_MODULE_ENABLED */ + /** * @} */ +#endif /* HAL_I2S_MODULE_ENABLED */ /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c index 4a1bdb4..04e8112 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c @@ -2,20 +2,20 @@ ****************************************************************************** * @file stm32f4xx_hal_i2s_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief I2S HAL module driver. - * This file provides firmware functions to manage the following + * This file provides firmware functions to manage the following * functionalities of I2S extension peripheral: * + Extension features Functions - * + * @verbatim ============================================================================== ##### I2S Extension features ##### ============================================================================== [..] - (#) In I2S full duplex mode, each SPI peripheral is able to manage sending and receiving - data simultaneously using two data lines. Each SPI peripheral has an extended block + (#) In I2S full duplex mode, each SPI peripheral is able to manage sending and receiving + data simultaneously using two data lines. Each SPI peripheral has an extended block called I2Sxext (i.e I2S2ext for SPI2 and I2S3ext for SPI3). (#) The extension block is not a full SPI IP, it is used only as I2S slave to implement full duplex mode. The extension block uses the same clock sources @@ -24,57 +24,57 @@ (#) Both I2Sx and I2Sx_ext can be configured as transmitters or receivers. [..] - (@) Only I2Sx can deliver SCK and WS to I2Sx_ext in full duplex mode, where + (@) Only I2Sx can deliver SCK and WS to I2Sx_ext in full duplex mode, where I2Sx can be I2S2 or I2S3. ##### How to use this driver ##### =============================================================================== - [..] - Three operation modes are available within this driver : - + [..] + Three operation modes are available within this driver : + *** Polling mode IO operation *** ================================= - [..] - (+) Send and receive in the same time an amount of data in blocking mode using HAL_I2S_TransmitReceive() - - *** Interrupt mode IO operation *** + [..] + (+) Send and receive in the same time an amount of data in blocking mode using HAL_I2SEx_TransmitReceive() + + *** Interrupt mode IO operation *** =================================== - [..] - (+) Send and receive in the same time an amount of data in non blocking mode using HAL_I2S_TransmitReceive_IT() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can + [..] + (+) Send and receive in the same time an amount of data in non blocking mode using HAL_I2SEx_TransmitReceive_IT() + (+) At transmission/reception end of transfer HAL_I2SEx_TxRxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2SEx_TxRxCpltCallback + (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can add his own code by customization of function pointer HAL_I2S_ErrorCallback - *** DMA mode IO operation *** + *** DMA mode IO operation *** ============================== - [..] - (+) Send and receive an amount of data in non blocking mode (DMA) using HAL_I2S_TransmitReceive_DMA() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can + [..] + (+) Send and receive an amount of data in non blocking mode (DMA) using HAL_I2SEx_TransmitReceive_DMA() + (+) At transmission/reception end of transfer HAL_I2SEx_TxRxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_I2S_TxRxCpltCallback + (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can add his own code by customization of function pointer HAL_I2S_ErrorCallback - (+) Pause the DMA Transfer using HAL_I2S_DMAPause() - (+) Resume the DMA Transfer using HAL_I2S_DMAResume() - (+) Stop the DMA Transfer using HAL_I2S_DMAStop() - @endverbatim + + Additional Figure: The Extended block uses the same clock sources as its master. + + +-----------------------+ + I2Sx_SCK | | + ----------+-->| I2Sx |------------------->I2Sx_SD(in/out) + +--|-->| | + | | +-----------------------+ + | | + I2S_WS | | + ------>| | + | | +-----------------------+ + | +-->| | + | | I2Sx_ext |------------------->I2Sx_extSD(in/out) + +----->| | + +-----------------------+ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -99,7 +99,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** - */ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" @@ -108,228 +108,95 @@ * @{ */ +#ifdef HAL_I2S_MODULE_ENABLED + /** @defgroup I2SEx I2SEx - * @brief I2S HAL module driver + * @brief I2S Extended HAL module driver * @{ */ -#ifdef HAL_I2S_MODULE_ENABLED +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) + /* Private typedef -----------------------------------------------------------*/ +/** @defgroup I2SEx_Private_Typedef I2S Extended Private Typedef + * @{ + */ +typedef enum +{ + I2S_USE_I2S = 0x00U, /*!< I2Sx should be used */ + I2S_USE_I2SEXT = 0x01U, /*!< I2Sx_ext should be used */ +}I2S_UseTypeDef; +/** + * @} + */ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup I2SEx_Private_Functions +/** @defgroup I2SEx_Private_Functions I2S Extended Private Functions * @{ */ +static void I2SEx_TxRxDMACplt(DMA_HandleTypeDef *hdma); +static void I2SEx_TxRxDMAError(DMA_HandleTypeDef *hdma); +static void I2SEx_FullDuplexTx_IT(I2S_HandleTypeDef *hi2s, I2S_UseTypeDef i2sUsed); +static void I2SEx_FullDuplexRx_IT(I2S_HandleTypeDef *hi2s, I2S_UseTypeDef i2sUsed); +static HAL_StatusTypeDef I2SEx_FullDuplexWaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, + uint32_t State, uint32_t Timeout, I2S_UseTypeDef i2sUsed); +/** + * @} + */ + /** * @} */ +/* Private functions ---------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/ -/** @defgroup I2SEx_Exported_Functions I2S Exported Functions + +/** @addtogroup I2SEx I2SEx * @{ */ -/** @defgroup I2SEx_Group1 Extension features functions - * @brief Extension features functions +/** @addtogroup I2SEx_Exported_Functions I2S Extended Exported Functions + * @{ + */ + +/** @defgroup I2SEx_Exported_Functions_Group1 I2S Extended IO operation functions + * @brief I2SEx IO operation functions * -@verbatim +@verbatim =============================================================================== - ##### Extension features Functions ##### + ##### IO operation functions##### =============================================================================== [..] - This subsection provides a set of functions allowing to manage the I2S data + This subsection provides a set of functions allowing to manage the I2S data transfers. (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts + (++) Blocking mode : The communication is performed in the polling mode. + The status of all data processing is returned by the same function + after finishing transfer. + (++) No-Blocking mode : The communication is performed using Interrupts or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when + The end of the data processing will be indicated through the + dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. (#) Blocking mode functions are : - (++) HAL_I2S_TransmitReceive() - + (++) HAL_I2SEx_TransmitReceive() + (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2S_TransmitReceive_IT() + (++) HAL_I2SEx_TransmitReceive_IT() + (++) HAL_I2SEx_FullDuplex_IRQHandler() (#) No-Blocking mode functions with DMA are : - (++) HAL_I2S_TransmitReceive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2S_TxCpltCallback() - (++) HAL_I2S_RxCpltCallback() - (++) HAL_I2S_ErrorCallback() + (++) HAL_I2SEx_TransmitReceive_DMA() + (#) A set of Transfer Complete Callback are provided in non Blocking mode: + (++) HAL_I2SEx_TxRxCpltCallback() @endverbatim * @{ */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Initializes the I2S according to the specified parameters - * in the I2S_InitTypeDef and create the associated handle. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) -{ - uint32_t tmpreg = 0U, i2sdiv = 2U, i2sodd = 0U, packetlength = 1U; - uint32_t tmp = 0U, i2sclk = 0U; - - /* Check the I2S handle allocation */ - if(hi2s == NULL) - { - return HAL_ERROR; - } - - /* Check the I2S parameters */ - assert_param(IS_I2S_MODE(hi2s->Init.Mode)); - assert_param(IS_I2S_STANDARD(hi2s->Init.Standard)); - assert_param(IS_I2S_DATA_FORMAT(hi2s->Init.DataFormat)); - assert_param(IS_I2S_MCLK_OUTPUT(hi2s->Init.MCLKOutput)); - assert_param(IS_I2S_AUDIO_FREQ(hi2s->Init.AudioFreq)); - assert_param(IS_I2S_CPOL(hi2s->Init.CPOL)); - assert_param(IS_I2S_CLOCKSOURCE(hi2s->Init.ClockSource)); - - if(hi2s->State == HAL_I2S_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2s->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, CORTEX */ - HAL_I2S_MspInit(hi2s); - } - - hi2s->State = HAL_I2S_STATE_BUSY; - - /*----------------------- SPIx I2SCFGR & I2SPR Configuration ---------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - hi2s->Instance->I2SCFGR &= ~(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ - SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ - SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD); - hi2s->Instance->I2SPR = 0x0002U; - - /* Get the I2SCFGR register value */ - tmpreg = hi2s->Instance->I2SCFGR; - - /* If the default frequency value has to be written, reinitialize i2sdiv and i2sodd */ - /* If the requested audio frequency is not the default, compute the prescaler */ - if(hi2s->Init.AudioFreq != I2S_AUDIOFREQ_DEFAULT) - { - /* Check the frame length (For the Prescaler computing) *******************/ - if(hi2s->Init.DataFormat != I2S_DATAFORMAT_16B) - { - /* Packet length is 32 bits */ - packetlength = 2U; - } - - /* Get I2S source Clock frequency ****************************************/ - i2sclk = I2S_GetInputClock(hi2s); - - /* Compute the Real divider depending on the MCLK output state, with a floating point */ - if(hi2s->Init.MCLKOutput == I2S_MCLKOUTPUT_ENABLE) - { - /* MCLK output is enabled */ - tmp = (uint32_t)(((((i2sclk / 256U) * 10U) / hi2s->Init.AudioFreq)) + 5U); - } - else - { - /* MCLK output is disabled */ - tmp = (uint32_t)(((((i2sclk / (32U * packetlength)) * 10U) / hi2s->Init.AudioFreq)) + 5U); - } - - /* Remove the flatting point */ - tmp = tmp / 10U; - - /* Check the parity of the divider */ - i2sodd = (uint32_t)(tmp & (uint32_t)1U); - - /* Compute the i2sdiv prescaler */ - i2sdiv = (uint32_t)((tmp - i2sodd) / 2U); - - /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ - i2sodd = (uint32_t) (i2sodd << 8U); - } - - /* Test if the divider is 1 or 0 or greater than 0xFF */ - if((i2sdiv < 2U) || (i2sdiv > 0xFFU)) - { - /* Set the default values */ - i2sdiv = 2U; - i2sodd = 0U; - } - - /* Write to SPIx I2SPR register the computed value */ - hi2s->Instance->I2SPR = (uint32_t)((uint32_t)i2sdiv | (uint32_t)(i2sodd | (uint32_t)hi2s->Init.MCLKOutput)); - - /* Configure the I2S with the I2S_InitStruct values */ - tmpreg |= (uint32_t)(SPI_I2SCFGR_I2SMOD | hi2s->Init.Mode | hi2s->Init.Standard | hi2s->Init.DataFormat | hi2s->Init.CPOL); - -#if defined(SPI_I2SCFGR_ASTRTEN) - if ((hi2s->Init.Standard == I2S_STANDARD_PCM_SHORT) ||(hi2s->Init.Standard == I2S_STANDARD_PCM_LONG)) - { - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg | SPI_I2SCFGR_ASTRTEN; - } - else - { - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg; - } -#else - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg; -#endif - - /* Configure the I2S extended if the full duplex mode is enabled */ - assert_param(IS_I2S_FULLDUPLEX_MODE(hi2s->Init.FullDuplexMode)); - if(hi2s->Init.FullDuplexMode == I2S_FULLDUPLEXMODE_ENABLE) - { - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - I2SxEXT(hi2s->Instance)->I2SCFGR &= ~(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ - SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ - SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD); - I2SxEXT(hi2s->Instance)->I2SPR = 2U; - - /* Get the I2SCFGR register value */ - tmpreg = I2SxEXT(hi2s->Instance)->I2SCFGR; - - /* Get the mode to be configured for the extended I2S */ - if((hi2s->Init.Mode == I2S_MODE_MASTER_TX) || (hi2s->Init.Mode == I2S_MODE_SLAVE_TX)) - { - tmp = I2S_MODE_SLAVE_RX; - } - else - { - if((hi2s->Init.Mode == I2S_MODE_MASTER_RX) || (hi2s->Init.Mode == I2S_MODE_SLAVE_RX)) - { - tmp = I2S_MODE_SLAVE_TX; - } - } - - /* Configure the I2S Slave with the I2S Master parameter values */ - tmpreg |= (uint32_t)(SPI_I2SCFGR_I2SMOD | tmp | hi2s->Init.Standard | hi2s->Init.DataFormat | hi2s->Init.CPOL); - - /* Write to SPIx I2SCFGR */ - I2SxEXT(hi2s->Instance)->I2SCFGR = tmpreg; - } - - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - hi2s->State= HAL_I2S_STATE_READY; - - return HAL_OK; -} - /** * @brief Full-Duplex Transmit/Receive data in blocking mode. * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains @@ -338,161 +205,245 @@ HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) * @param pRxData: a 16-bit pointer to the Receive data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. * @param Timeout: Timeout duration - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size, uint32_t Timeout) +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size, uint32_t Timeout) { - uint32_t tickstart = 0U; uint32_t tmp1 = 0U; - - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) + + if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) { return HAL_ERROR; } /* Check the I2S State */ if(hi2s->State == HAL_I2S_STATE_READY) - { + { tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended + /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S configuration phase, the Size parameter means the number - of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data + of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data frame is selected the Size parameter means the number of 16-bit data length. */ if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } - + /* Process Locked */ __HAL_LOCK(hi2s); - + + hi2s->ErrorCode = HAL_I2S_ERROR_NONE; + /* Set the I2S State busy TX/RX */ hi2s->State = HAL_I2S_STATE_BUSY_TX_RX; - + tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG; /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ if((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX)) - { - /* Check if the I2S is already enabled: The I2S is kept enabled at the end of transaction - to avoid the clock de-synchronization between Master and Slave. */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2Sext(receiver) before enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; + { + /* Prepare the First Data before enabling the I2S */ + hi2s->Instance->DR = (*pTxData++); + hi2s->TxXferCount--; - /* Enable I2Sx peripheral */ - __HAL_I2S_ENABLE(hi2s); + /* Enable I2Sext(receiver) before enabling I2Sx peripheral */ + __HAL_I2SEXT_ENABLE(hi2s); + + /* Enable I2Sx peripheral */ + __HAL_I2S_ENABLE(hi2s); + + /* Check if Master Receiver mode is selected */ + if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) + { + /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read + access to the SPI_SR register. */ + __HAL_I2SEXT_CLEAR_OVRFLAG(hi2s); } - - while(hi2s->TxXferCount > 0U) + + while((hi2s->RxXferCount > 0U) || (hi2s->TxXferCount > 0U)) { - /* Wait until TXE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, RESET, Timeout) != HAL_OK) + if(hi2s->TxXferCount > 0U) { - return HAL_TIMEOUT; - } - hi2s->Instance->DR = (*pTxData++); + /* Wait until TXE flag is set */ + if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout, I2S_USE_I2S) != HAL_OK) + { + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode, HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); + return HAL_TIMEOUT; + } + /* Write Data on DR register */ + hi2s->Instance->DR = (*pTxData++); + hi2s->TxXferCount--; - /* Get tick */ - tickstart = HAL_GetTick(); + /* Check if an underrun occurs */ + if((__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET) && (tmp1 == I2S_MODE_SLAVE_TX)) + { + /* Clear Underrun flag */ + __HAL_I2S_CLEAR_UDRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); - /* Wait until RXNE flag is set */ - while((I2SxEXT(hi2s->Instance)->SR & SPI_SR_RXNE) != SPI_SR_RXNE) + return HAL_ERROR; + } + } + if(hi2s->RxXferCount > 0U) { - if(Timeout != HAL_MAX_DELAY) + /* Wait until RXNE flag is set */ + if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout, I2S_USE_I2SEXT) != HAL_OK) { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); + return HAL_TIMEOUT; + } + /* Read Data from DR register */ + (*pRxData++) = I2SxEXT(hi2s->Instance)->DR; + hi2s->RxXferCount--; - return HAL_TIMEOUT; - } + /* Check if an overrun occurs */ + if(__HAL_I2SEXT_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET) + { + /* Clear Overrun flag */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); + + return HAL_ERROR; } } - (*pRxData++) = I2SxEXT(hi2s->Instance)->DR; - - hi2s->TxXferCount--; - hi2s->RxXferCount--; } } /* The I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX Mode is selected */ else { - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral before the I2Sext*/ - __HAL_I2S_ENABLE(hi2s); + /* Prepare the First Data before enabling the I2S */ + I2SxEXT(hi2s->Instance)->DR = (*pTxData++); + hi2s->TxXferCount--; - /* Enable I2Sext(transmitter) after enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; - } - else + /* Enable I2Sext(transmitter) after enabling I2Sx peripheral */ + __HAL_I2SEXT_ENABLE(hi2s); + + /* Enable I2S peripheral before the I2Sext*/ + __HAL_I2S_ENABLE(hi2s); + + /* Check if Master Receiver mode is selected */ + if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) { - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) - { - /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - } + /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read + access to the SPI_SR register. */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); } - while(hi2s->TxXferCount > 0U) - { - /* Get tick */ - tickstart = HAL_GetTick(); - /* Wait until TXE flag is set */ - while((I2SxEXT(hi2s->Instance)->SR & SPI_SR_TXE) != SPI_SR_TXE) + while((hi2s->RxXferCount > 0U) || (hi2s->TxXferCount > 0U)) + { + if(hi2s->TxXferCount > 0U) { - if(Timeout != HAL_MAX_DELAY) + /* Wait until TXE flag is set */ + if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, SET, Timeout, I2S_USE_I2SEXT) != HAL_OK) { - if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); + return HAL_TIMEOUT; + } + /* Write Data on DR register */ + I2SxEXT(hi2s->Instance)->DR = (*pTxData++); + hi2s->TxXferCount--; - return HAL_TIMEOUT; - } + /* Check if an underrun occurs */ + if((__HAL_I2SEXT_GET_FLAG(hi2s, I2S_FLAG_UDR) == SET) && (tmp1 == I2S_MODE_SLAVE_RX)) + { + /* Clear Underrun flag */ + __HAL_I2S_CLEAR_UDRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); + + return HAL_ERROR; } } - I2SxEXT(hi2s->Instance)->DR = (*pTxData++); - - /* Wait until RXNE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, RESET, Timeout) != HAL_OK) + if(hi2s->RxXferCount > 0U) { - return HAL_TIMEOUT; - } - (*pRxData++) = hi2s->Instance->DR; + /* Wait until RXNE flag is set */ + if (I2SEx_FullDuplexWaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, SET, Timeout, I2S_USE_I2S) != HAL_OK) + { + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_TIMEOUT); + HAL_I2S_ErrorCallback(hi2s); + return HAL_TIMEOUT; + } + /* Read Data from DR register */ + (*pRxData++) = hi2s->Instance->DR; + hi2s->RxXferCount--; - hi2s->TxXferCount--; - hi2s->RxXferCount--; + /* Check if an overrun occurs */ + if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR) == SET) + { + /* Clear Overrun flag */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); + + return HAL_ERROR; + } + } } } /* Set the I2S State ready */ - hi2s->State = HAL_I2S_STATE_READY; + hi2s->State = HAL_I2S_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hi2s); - + return HAL_OK; } else @@ -502,27 +453,28 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *p } /** - * @brief Full-Duplex Transmit/Receive data in non-blocking mode using Interrupt + * @brief Full-Duplex Transmit/Receive data in non-blocking mode using Interrupt * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @param pTxData: a 16-bit pointer to the Transmit data buffer. * @param pRxData: a 16-bit pointer to the Receive data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size) +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size) { uint32_t tmp1 = 0U; - + if(hi2s->State == HAL_I2S_STATE_READY) { - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) + if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) { return HAL_ERROR; } @@ -531,46 +483,71 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t hi2s->pRxBuffPtr = pRxData; tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended - is selected during the I2S configuration phase, the Size parameter means the number - of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data - frame is selected the Size parameter means the number of 16-bit data length. */ + /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended + is selected during the I2S configuration phase, the Size parameter means the number + of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data + frame is selected the Size parameter means the number of 16-bit data length. */ if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; - } + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); + } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } - + /* Process Locked */ __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_TX_RX; + hi2s->ErrorCode = HAL_I2S_ERROR_NONE; + hi2s->State = HAL_I2S_STATE_BUSY_TX_RX; tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG; /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ if((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX)) - { + { /* Enable I2Sext RXNE and ERR interrupts */ - I2SxEXT(hi2s->Instance)->CR2 |= (I2S_IT_RXNE | I2S_IT_ERR); + __HAL_I2SEXT_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); /* Enable I2Sx TXE and ERR interrupts */ __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { + if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX) + { + /* Prepare the First Data before enabling the I2S */ + if(hi2s->TxXferCount != 0U) + { + /* Transmit First data */ + hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); + hi2s->TxXferCount--; + + if(hi2s->TxXferCount == 0U) + { + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + + if(hi2s->RxXferCount == 0U) + { + /* Disable I2Sext RXNE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE| I2S_IT_ERR)); + + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); + } + } + } + } /* Enable I2Sext(receiver) before enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; + __HAL_I2SEXT_ENABLE(hi2s); /* Enable I2Sx peripheral */ __HAL_I2S_ENABLE(hi2s); @@ -580,36 +557,44 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t else { /* Enable I2Sext TXE and ERR interrupts */ - I2SxEXT(hi2s->Instance)->CR2 |= (I2S_IT_TXE |I2S_IT_ERR); + __HAL_I2SEXT_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); /* Enable I2Sext RXNE and ERR interrupts */ __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Check if the I2S_MODE_MASTER_RX is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) + if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) { /* Prepare the First Data before enabling the I2S */ if(hi2s->TxXferCount != 0U) { /* Transmit First data */ I2SxEXT(hi2s->Instance)->DR = (*hi2s->pTxBuffPtr++); - hi2s->TxXferCount--; + hi2s->TxXferCount--; if(hi2s->TxXferCount == 0U) { - /* Disable I2Sext TXE interrupt */ - I2SxEXT(hi2s->Instance)->CR2 &= ~I2S_IT_TXE; + /* Disable I2Sext TXE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + if(hi2s->RxXferCount == 0U) + { + /* Disable RXNE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE| I2S_IT_ERR)); + + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); + } } } } + /* Enable I2Sext(transmitter) after enabling I2Sx peripheral */ + __HAL_I2SEXT_ENABLE(hi2s); + /* Enable I2S peripheral */ __HAL_I2S_ENABLE(hi2s); - - /* Enable I2Sext(transmitter) after enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; } } /* Process Unlocked */ @@ -624,26 +609,27 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t } /** - * @brief Full-Duplex Transmit/Receive data in non-blocking mode using DMA + * @brief Full-Duplex Transmit/Receive data in non-blocking mode using DMA * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains * the configuration information for I2S module * @param pTxData: a 16-bit pointer to the Transmit data buffer. * @param pRxData: a 16-bit pointer to the Receive data buffer. * @param Size: number of data sample to be sent: * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization + * configuration phase, the Size parameter means the number of 16-bit data length + * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected + * the Size parameter means the number of 16-bit data length. + * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization * between Master and Slave(example: audio streaming). * @retval HAL status */ -HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size) +HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, + uint16_t Size) { - uint32_t *tmp; + uint32_t *tmp = NULL; uint32_t tmp1 = 0U; - - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) + + if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) { return HAL_ERROR; } @@ -654,48 +640,42 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_ hi2s->pRxBuffPtr = pRxData; tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended - is selected during the I2S configuration phase, the Size parameter means the number - of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data - frame is selected the Size parameter means the number of 16-bit data length. */ + /* Check the Data format: When a 16-bit data frame or a 16-bit data frame extended + is selected during the I2S configuration phase, the Size parameter means the number + of 16-bit data length in the transaction and when a 24-bit data frame or a 32-bit data + frame is selected the Size parameter means the number of 16-bit data length. */ if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) { - hi2s->TxXferSize = Size*2U; - hi2s->TxXferCount = Size*2U; - hi2s->RxXferSize = Size*2U; - hi2s->RxXferCount = Size*2U; + hi2s->TxXferSize = (Size << 1U); + hi2s->TxXferCount = (Size << 1U); + hi2s->RxXferSize = (Size << 1U); + hi2s->RxXferCount = (Size << 1U); } else { - hi2s->TxXferSize = Size; + hi2s->TxXferSize = Size; hi2s->TxXferCount = Size; - hi2s->RxXferSize = Size; + hi2s->RxXferSize = Size; hi2s->RxXferCount = Size; } /* Process Locked */ __HAL_LOCK(hi2s); - hi2s->State = HAL_I2S_STATE_BUSY_TX_RX; hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - - /* Set the I2S Rx DMA Half transfer complete callback */ - hi2s->hdmarx->XferHalfCpltCallback = I2S_DMARxHalfCplt; + hi2s->State = HAL_I2S_STATE_BUSY_TX_RX; /* Set the I2S Rx DMA transfer complete callback */ - hi2s->hdmarx->XferCpltCallback = I2S_DMARxCplt; + hi2s->hdmarx->XferCpltCallback = I2SEx_TxRxDMACplt; /* Set the I2S Rx DMA error callback */ - hi2s->hdmarx->XferErrorCallback = I2S_DMAError; - - /* Set the I2S Tx DMA Half transfer complete callback */ - hi2s->hdmatx->XferHalfCpltCallback = I2S_DMATxHalfCplt; + hi2s->hdmarx->XferErrorCallback = I2SEx_TxRxDMAError; /* Set the I2S Tx DMA transfer complete callback */ - hi2s->hdmatx->XferCpltCallback = I2S_DMATxCplt; + hi2s->hdmatx->XferCpltCallback = I2SEx_TxRxDMACplt; /* Set the I2S Tx DMA error callback */ - hi2s->hdmatx->XferErrorCallback = I2S_DMAError; + hi2s->hdmatx->XferErrorCallback = I2SEx_TxRxDMAError; tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG; /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ @@ -705,21 +685,21 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_ tmp = (uint32_t*)&pRxData; HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&I2SxEXT(hi2s->Instance)->DR, *(uint32_t*)tmp, hi2s->RxXferSize); - /* Enable Rx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 |= SPI_CR2_RXDMAEN; + /* Enable Rx DMA Request */ + SET_BIT(I2SxEXT(hi2s->Instance)->CR2,SPI_CR2_RXDMAEN); /* Enable the Tx DMA Stream */ tmp = (uint32_t*)&pTxData; HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t*)tmp, (uint32_t)&hi2s->Instance->DR, hi2s->TxXferSize); - /* Enable Tx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; + /* Enable Tx DMA Request */ + SET_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { /* Enable I2Sext(receiver) before enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; + __HAL_I2SEXT_ENABLE(hi2s); /* Enable I2S peripheral after the I2Sext */ __HAL_I2S_ENABLE(hi2s); @@ -727,38 +707,34 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_ } else { + /* Check if Master Receiver mode is selected */ + if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) + { + /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read + access to the SPI_SR register. */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); + } /* Enable the Tx DMA Stream */ tmp = (uint32_t*)&pTxData; HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t*)tmp, (uint32_t)&I2SxEXT(hi2s->Instance)->DR, hi2s->TxXferSize); - /* Enable Tx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 |= SPI_CR2_TXDMAEN; + /* Enable Tx DMA Request */ + SET_BIT(I2SxEXT(hi2s->Instance)->CR2,SPI_CR2_TXDMAEN); /* Enable the Rx DMA Stream */ tmp = (uint32_t*)&pRxData; HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&hi2s->Instance->DR, *(uint32_t*)tmp, hi2s->RxXferSize); - /* Enable Rx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; + /* Enable Rx DMA Request */ + SET_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); - /* Check if the I2S is already enabled */ + /* Check if the I2S is already enabled */ if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) { + /* Enable I2Sext(transmitter) before enabling I2Sx peripheral */ + __HAL_I2SEXT_ENABLE(hi2s); /* Enable I2S peripheral before the I2Sext */ __HAL_I2S_ENABLE(hi2s); - - /* Enable I2Sext(transmitter) after enabling I2Sx peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE; - } - else - { - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) - { - /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - } } } @@ -774,302 +750,143 @@ HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_ } /** - * @brief Pauses the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module + * @brief This function handles I2S/I2Sext interrupt requests in full-duplex mode. + * @param hi2s: I2S handle * @retval HAL status */ -HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s) +void HAL_I2SEx_FullDuplex_IRQHandler(I2S_HandleTypeDef *hi2s) { - /* Process Locked */ - __HAL_LOCK(hi2s); - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) + __IO uint32_t i2ssr = hi2s->Instance->SR ; + __IO uint32_t i2sextsr = I2SxEXT(hi2s->Instance)->SR; + + /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ + if (((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) + || ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX)) { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) - { - /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - /* Disable the I2SEx Rx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - else + /* I2S in mode Transmitter -------------------------------------------------*/ + if(((i2ssr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE) != RESET)) { - /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - /* Disable the I2SEx Tx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); + /* When the I2S mode is configured as I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX, + the I2S TXE interrupt will be generated to manage the full-duplex transmit phase. */ + I2SEx_FullDuplexTx_IT(hi2s, I2S_USE_I2S); } - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} -/** - * @brief Resumes the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s) -{ - /* Process Locked */ - __HAL_LOCK(hi2s); - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) + /* I2Sext in mode Receiver -----------------------------------------------*/ + if(((i2sextsr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && (__HAL_I2SEXT_GET_IT_SOURCE(hi2s, I2S_IT_RXNE) != RESET)) { - /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - /* Disable the I2SEx Rx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 |= SPI_CR2_RXDMAEN; + /* When the I2S mode is configured as I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX, + the I2Sext RXNE interrupt will be generated to manage the full-duplex receive phase. */ + I2SEx_FullDuplexRx_IT(hi2s, I2S_USE_I2SEXT); } - else + + /* I2Sext Overrun error interrupt occured --------------------------------*/ + if(((i2sextsr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && (__HAL_I2SEXT_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) { - /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; - /* Enable the I2SEx Tx DMA Request */ - I2SxEXT(hi2s->Instance)->CR2 |= SPI_CR2_TXDMAEN; - } - } + /* Disable RXNE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - /* If the I2S peripheral is still not enabled, enable it */ - if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) == 0U) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); -/** - * @brief Resumes the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s) -{ - /* Process Locked */ - __HAL_LOCK(hi2s); - - /* Disable the I2S Tx/Rx DMA requests */ - hi2s->Instance->CR2 &= ~SPI_CR2_TXDMAEN; - hi2s->Instance->CR2 &= ~SPI_CR2_RXDMAEN; - - if(hi2s->Init.FullDuplexMode == I2S_FULLDUPLEXMODE_ENABLE) - { - /* Disable the I2S extended Tx/Rx DMA requests */ - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - - /* Abort the I2S DMA Stream tx */ - if(hi2s->hdmatx != NULL) - { - HAL_DMA_Abort(hi2s->hdmatx); - } - /* Abort the I2S DMA Stream rx */ - if(hi2s->hdmarx != NULL) - { - HAL_DMA_Abort(hi2s->hdmarx); - } + /* Clear Overrun flag */ + __HAL_I2S_CLEAR_OVRFLAG(hi2s); - /* Disable I2S peripheral */ - __HAL_I2S_DISABLE(hi2s); - - if(hi2s->Init.FullDuplexMode == I2S_FULLDUPLEXMODE_ENABLE) - { - /* Disable the I2Sext peripheral */ - I2SxEXT(hi2s->Instance)->I2SCFGR &= ~SPI_I2SCFGR_I2SE; - } - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; -/** - * @brief This function handles I2S interrupt request. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ -void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) -{ - uint32_t tmp1 = 0U, tmp2 = 0U; - __IO uint32_t tmpreg1 = 0U; - if(hi2s->Init.FullDuplexMode != I2S_FULLDUPLEXMODE_ENABLE) - { - if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE); - /* I2S in mode Receiver ------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Receive_IT(hi2s); - } - - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Overrun error interrupt occurred ---------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_OVR; - } + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); } - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) + /* I2S Underrun error interrupt occured ----------------------------------*/ + if(((i2ssr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE); - /* I2S in mode Tramitter -----------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Transmit_IT(hi2s); - } + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Underrun error interrupt occurred --------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_UDRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_UDR; - } + /* Disable RXNE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); + + /* Clear underrun flag */ + __HAL_I2S_CLEAR_UDRFLAG(hi2s); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); } } + /* The I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX Mode is selected */ else { - tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG; - /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ - if((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX)) - { - tmp1 = I2SxEXT(hi2s->Instance)->SR & SPI_SR_RXNE; - tmp2 = I2SxEXT(hi2s->Instance)->CR2 & I2S_IT_RXNE; - /* I2Sext in mode Receiver ---------------------------------------------*/ - if((tmp1 == SPI_SR_RXNE) && (tmp2 == I2S_IT_RXNE)) - { - /* When the I2S mode is configured as I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX, - the I2Sext RXNE interrupt will be generated to manage the full-duplex receive phase. */ - I2SEx_TransmitReceive_IT(hi2s); - } + /* I2Sext in mode Transmitter ----------------------------------------------*/ + if(((i2sextsr & I2S_FLAG_TXE) == I2S_FLAG_TXE) && (__HAL_I2SEXT_GET_IT_SOURCE(hi2s, I2S_IT_TXE) != RESET)) + { + /* When the I2S mode is configured as I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX, + the I2Sext TXE interrupt will be generated to manage the full-duplex transmit phase. */ + I2SEx_FullDuplexTx_IT(hi2s, I2S_USE_I2SEXT); + } - tmp1 = I2SxEXT(hi2s->Instance)->SR & SPI_SR_OVR; - tmp2 = I2SxEXT(hi2s->Instance)->CR2 & I2S_IT_ERR; - /* I2Sext Overrun error interrupt occurred -----------------------------*/ - if((tmp1 == SPI_SR_OVR) && (tmp2 == I2S_IT_ERR)) - { - /* Clear I2Sext OVR Flag */ - tmpreg1 = I2SxEXT(hi2s->Instance)->DR; - tmpreg1 = I2SxEXT(hi2s->Instance)->SR; - hi2s->ErrorCode |= HAL_I2SEX_ERROR_OVR; - UNUSED(tmpreg1); - } + /* I2S in mode Receiver --------------------------------------------------*/ + if(((i2ssr & I2S_FLAG_RXNE) == I2S_FLAG_RXNE) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE) != RESET)) + { + /* When the I2S mode is configured as I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX, + the I2S RXNE interrupt will be generated to manage the full-duplex receive phase. */ + I2SEx_FullDuplexRx_IT(hi2s, I2S_USE_I2S); + } - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE); - /* I2S in mode Tramitter -----------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - /* When the I2S mode is configured as I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX, - the I2S TXE interrupt will be generated to manage the full-duplex transmit phase. */ - I2SEx_TransmitReceive_IT(hi2s); - } + /* I2S Overrun error interrupt occured -------------------------------------*/ + if(((i2ssr & I2S_FLAG_OVR) == I2S_FLAG_OVR) && (__HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) + { + /* Disable RXNE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Underrun error interrupt occurred -------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_UDRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_UDR; - } + /* Disable TXE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_OVR); + HAL_I2S_ErrorCallback(hi2s); } - /* The I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX Mode is selected */ - else + + /* I2Sext Underrun error interrupt occured -------------------------------*/ + if(((i2sextsr & I2S_FLAG_UDR) == I2S_FLAG_UDR) && (__HAL_I2SEXT_GET_IT_SOURCE(hi2s, I2S_IT_ERR) != RESET)) { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE); - /* I2S in mode Receiver ------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - /* When the I2S mode is configured as I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX, - the I2S RXNE interrupt will be generated to manage the full-duplex receive phase. */ - I2SEx_TransmitReceive_IT(hi2s); - } + /* Disable TXE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Overrun error interrupt occurred --------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_OVR; - } + /* Disable RXNE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - tmp1 = I2SxEXT(hi2s->Instance)->SR & SPI_SR_TXE; - tmp2 = I2SxEXT(hi2s->Instance)->CR2 & I2S_IT_TXE; - /* I2Sext in mode Tramitter --------------------------------------------*/ - if((tmp1 == SPI_SR_TXE) && (tmp2 == I2S_IT_TXE)) - { - /* When the I2S mode is configured as I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX, - the I2Sext TXE interrupt will be generated to manage the full-duplex transmit phase. */ - I2SEx_TransmitReceive_IT(hi2s); - } + /* Set the I2S State ready */ + hi2s->State = HAL_I2S_STATE_READY; - tmp1 = I2SxEXT(hi2s->Instance)->SR & SPI_SR_UDR; - tmp2 = I2SxEXT(hi2s->Instance)->CR2 & I2S_IT_ERR; - /* I2Sext Underrun error interrupt occurred ----------------------------*/ - if((tmp1 == SPI_SR_UDR) && (tmp2 == I2S_IT_ERR)) - { - /* Clear I2Sext UDR Flag */ - tmpreg1 = I2SxEXT(hi2s->Instance)->SR; - hi2s->ErrorCode |= HAL_I2SEX_ERROR_UDR; - UNUSED(tmpreg1); - } + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_UDR); + HAL_I2S_ErrorCallback(hi2s); } } +} - /* Call the Error call Back in case of Errors */ - if(hi2s->ErrorCode != HAL_I2S_ERROR_NONE) - { - /* Set the I2S state ready to be able to start again the process */ - hi2s->State= HAL_I2S_STATE_READY; - HAL_I2S_ErrorCallback(hi2s); - } +/** + * @brief Tx and Rx Transfer completed callback + * @param hi2s: I2S handle + * @retval None + */ +__weak void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hi2s); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_I2SEx_TxRxCpltCallback could be implenetd in the user file + */ } /** @@ -1077,402 +894,255 @@ void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) */ /** - * @brief Full-Duplex Transmit/Receive data in non-blocking mode using Interrupt - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status + * @} + */ + +/** @addtogroup I2SEx_Private_Functions I2S Extended Private Functions + * @{ */ -HAL_StatusTypeDef I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s) + +/** + * @brief DMA I2S transmit receive process complete callback + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void I2SEx_TxRxDMACplt(DMA_HandleTypeDef *hdma) { - uint32_t tmp1 = 0U, tmp2 = 0U; - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - /* Process Locked */ - __HAL_LOCK(hi2s); + I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - tmp1 = hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG; - /* Check if the I2S_MODE_MASTER_TX or I2S_MODE_SLAVE_TX Mode is selected */ - if((tmp1 == I2S_MODE_MASTER_TX) || (tmp1 == I2S_MODE_SLAVE_TX)) + /* if DMA is not configured in DMA_CIRCULAR mode */ + if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + if (hi2s->hdmarx == hdma) { - if(hi2s->TxXferCount != 0U) + /* Disable Rx DMA Request */ + if (((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) ||\ + ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX)) { - if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE) != RESET) - { - /* Transmit data */ - hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); - hi2s->TxXferCount--; - - if(hi2s->TxXferCount == 0U) - { - /* Disable TXE interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, I2S_IT_TXE); - } - } + CLEAR_BIT(I2SxEXT(hi2s->Instance)->CR2,SPI_CR2_RXDMAEN); + } + else + { + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_RXDMAEN); } - if(hi2s->RxXferCount != 0U) + hi2s->RxXferCount = 0U; + + if (hi2s->TxXferCount == 0U) { - if((I2SxEXT(hi2s->Instance)->SR & SPI_SR_RXNE) == SPI_SR_RXNE) - { - /* Receive data */ - (*hi2s->pRxBuffPtr++) = I2SxEXT(hi2s->Instance)->DR; - hi2s->RxXferCount--; + hi2s->State = HAL_I2S_STATE_READY; - if(hi2s->RxXferCount == 0U) - { - /* Disable I2Sext RXNE interrupt */ - I2SxEXT(hi2s->Instance)->CR2 &= ~I2S_IT_RXNE; - } - } + HAL_I2SEx_TxRxCpltCallback(hi2s); } } - /* The I2S_MODE_MASTER_RX or I2S_MODE_SLAVE_RX Mode is selected */ - else + + if (hi2s->hdmatx == hdma) { - if(hi2s->TxXferCount != 0U) + /* Disable Tx DMA Request */ + if (((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) ||\ + ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX)) { - if((I2SxEXT(hi2s->Instance)->SR & SPI_SR_TXE) == SPI_SR_TXE) - { - /* Transmit data */ - I2SxEXT(hi2s->Instance)->DR = (*hi2s->pTxBuffPtr++); - hi2s->TxXferCount--; - - if(hi2s->TxXferCount == 0U) - { - /* Disable I2Sext TXE interrupt */ - I2SxEXT(hi2s->Instance)->CR2 &= ~I2S_IT_TXE; - - HAL_I2S_TxCpltCallback(hi2s); - } - } + CLEAR_BIT(hi2s->Instance->CR2,SPI_CR2_TXDMAEN); } - if(hi2s->RxXferCount != 0U) + else { - if(__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE) != RESET) - { - /* Receive data */ - (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR; - hi2s->RxXferCount--; + CLEAR_BIT(I2SxEXT(hi2s->Instance)->CR2,SPI_CR2_TXDMAEN); + } - if(hi2s->RxXferCount == 0U) - { - /* Disable RXNE interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, I2S_IT_RXNE); + hi2s->TxXferCount = 0U; - HAL_I2S_RxCpltCallback(hi2s); - } - } + if (hi2s->RxXferCount == 0U) + { + hi2s->State = HAL_I2S_STATE_READY; + + HAL_I2SEx_TxRxCpltCallback(hi2s); } } + } +} - tmp1 = hi2s->RxXferCount; - tmp2 = hi2s->TxXferCount; - if((tmp1 == 0U) && (tmp2 == 0U)) - { - /* Disable I2Sx ERR interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, I2S_IT_ERR); - /* Disable I2Sext ERR interrupt */ - I2SxEXT(hi2s->Instance)->CR2 &= ~I2S_IT_ERR; - - hi2s->State = HAL_I2S_STATE_READY; - } +/** + * @brief DMA I2S communication error callback + * @param hdma : DMA handle + * @retval None + */ +static void I2SEx_TxRxDMAError(DMA_HandleTypeDef *hdma) +{ + I2S_HandleTypeDef* hi2s = ( I2S_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); + /* Disable Rx and Tx DMA Request */ + CLEAR_BIT(hi2s->Instance->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); + CLEAR_BIT(I2SxEXT(hi2s->Instance)->CR2,(SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN)); - return HAL_OK; - } - else - { - return HAL_BUSY; - } + hi2s->TxXferCount = 0U; + hi2s->RxXferCount = 0U; + + hi2s->State= HAL_I2S_STATE_READY; + + /* Set the error code and execute error callback*/ + SET_BIT(hi2s->ErrorCode,HAL_I2S_ERROR_DMA); + HAL_I2S_ErrorCallback(hi2s); } -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F401xx ||\ - STM32F411xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + /** - * @brief DMA I2S transmit process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief Full-Duplex IT handler transmit function + * @param hi2s: I2S handle + * @param i2sUsed: indicate if I2Sx or I2Sx_ext is concerned * @retval None */ -void I2S_DMATxCplt(DMA_HandleTypeDef *hdma) +static void I2SEx_FullDuplexTx_IT(I2S_HandleTypeDef *hi2s, I2S_UseTypeDef i2sUsed) { - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + if(i2sUsed == I2S_USE_I2S) { - if(hi2s->Init.FullDuplexMode != I2S_FULLDUPLEXMODE_ENABLE) - { - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - - /* FullDuplexMode feature enabled */ - else + /* Write Data on DR register */ + hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); + hi2s->TxXferCount--; + + if(hi2s->TxXferCount == 0U) { - if(((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) || ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX)) - { - /* Disable Tx DMA Request for the I2S Master*/ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } - else + /* Disable TXE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + + if(hi2s->RxXferCount == 0U) { - /* Disable Tx DMA Request for the I2SEx Slave */ - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); } } -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F401xx || STM32F411xx ||\ - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx ||\ - STM32F413xx || STM32F423xx */ - hi2s->TxXferCount = 0U; - if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) + } + else + { + /* Write Data on DR register */ + I2SxEXT(hi2s->Instance)->DR = (*hi2s->pTxBuffPtr++); + hi2s->TxXferCount--; + + if(hi2s->TxXferCount == 0U) { + /* Disable I2Sext TXE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); + if(hi2s->RxXferCount == 0U) { hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); } } - else - { - hi2s->State = HAL_I2S_STATE_READY; - } } - HAL_I2S_TxCpltCallback(hi2s); } /** - * @brief DMA I2S receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief Full-Duplex IT handler receive function + * @param hi2s: I2S handle + * @param i2sUsed: indicate if I2Sx or I2Sx_ext is concerned * @retval None */ -void I2S_DMARxCplt(DMA_HandleTypeDef *hdma) +static void I2SEx_FullDuplexRx_IT(I2S_HandleTypeDef *hi2s, I2S_UseTypeDef i2sUsed) { - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + if(i2sUsed == I2S_USE_I2S) { - if(hi2s->Init.FullDuplexMode != I2S_FULLDUPLEXMODE_ENABLE) - { - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ - defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ - defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - /* FullDuplexMode feature enabled */ - else + /* Read Data from DR register */ + (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR; + hi2s->RxXferCount--; + + if(hi2s->RxXferCount == 0U) { - if(((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_TX) || ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX)) - { - /* Disable Rx DMA Request for the I2SEx Slave */ - I2SxEXT(hi2s->Instance)->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - else + /* Disable RXNE and ERR interrupt */ + __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); + + if(hi2s->TxXferCount == 0U) { - /* Disable Rx DMA Request for the I2S Master*/ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); + hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); } } -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F401xx || STM32F411xx ||\ - STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx ||\ - STM32F413xx || STM32F423xx */ - hi2s->RxXferCount = 0U; - if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) + } + else + { + /* Read Data from DR register */ + (*hi2s->pRxBuffPtr++) = I2SxEXT(hi2s->Instance)->DR; + hi2s->RxXferCount--; + + if(hi2s->RxXferCount == 0U) { + /* Disable I2Sext RXNE and ERR interrupt */ + __HAL_I2SEXT_DISABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); + if(hi2s->TxXferCount == 0U) { hi2s->State = HAL_I2S_STATE_READY; + HAL_I2SEx_TxRxCpltCallback(hi2s); } } - else - { - hi2s->State = HAL_I2S_STATE_READY; - } } - HAL_I2S_RxCpltCallback(hi2s); } /** - * @brief Get I2S clock Input based on Source clock selection in RCC - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval I2S Clock Input + * @brief This function handles I2S Communication Timeout. + * @param hi2s: I2S handle + * @param Flag: Flag checked + * @param State: Value of the flag expected + * @param Timeout: Duration of the timeout + * @param i2sUsed: I2S instance reference + * @retval HAL status */ -uint32_t I2S_GetInputClock(I2S_HandleTypeDef *hi2s) +static HAL_StatusTypeDef I2SEx_FullDuplexWaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, + uint32_t State, uint32_t Timeout, I2S_UseTypeDef i2sUsed) { - /* This variable used to store the VCO Input (value in Hz) */ - uint32_t vcoinput = 0U; - /* This variable used to store the VCO Output (value in Hz) */ - uint32_t vcooutput = 0U; - /* This variable used to store the I2S_CK_x (value in Hz) */ - uint32_t i2ssourceclock = 0U; - - /* Configure 12S Clock based on I2S source clock selection */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) - switch(hi2s->Init.ClockSource) + uint32_t tickstart = HAL_GetTick(); + + if(i2sUsed == I2S_USE_I2S) { - case I2S_CLOCK_EXTERNAL : + /* Wait until flag is reset */ + while(((__HAL_I2S_GET_FLAG(hi2s, Flag)) ? SET : RESET) != State) { - /* Set the I2S clock to the external clock value */ - i2ssourceclock = EXTERNAL_CLOCK_VALUE; - break; - } -#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || \ - defined(STM32F423xx) - case I2S_CLOCK_PLL : - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else + if(Timeout != HAL_MAX_DELAY) { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - i2ssourceclock = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - break; - } -#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - case I2S_CLOCK_PLLR : - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - i2ssourceclock = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); - break; - } - case I2S_CLOCK_PLLSRC : - { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - i2ssourceclock = (uint32_t)(HSE_VALUE); - } - else - { - /* Get the I2S source clock value */ - i2ssourceclock = (uint32_t)(HSI_VALUE); + if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) + { + /* Set the I2S State ready */ + hi2s->State= HAL_I2S_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + return HAL_TIMEOUT; + } } - break; - } - default : - { - break; } } -#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F469xx) || defined(STM32F479xx) - - /* If an external I2S clock has to be used, the specific define should be set - in the project configuration or in the stm32f4xx_conf.h file */ - if(hi2s->Init.ClockSource == I2S_CLOCK_EXTERNAL) + else /* i2sUsed == I2S_USE_I2SEXT */ { - /* Set the I2S clock to the external clock value */ - i2ssourceclock = EXTERNAL_CLOCK_VALUE; - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else + /* Wait until flag is reset */ + while(((__HAL_I2SEXT_GET_FLAG(hi2s, Flag)) ? SET : RESET) != State) { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - i2ssourceclock = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); - } -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) + { + /* Set the I2S State ready */ + hi2s->State= HAL_I2S_STATE_READY; -#if defined(STM32F411xE) - - /* If an external I2S clock has to be used, the specific define should be set - in the project configuration or in the stm32f4xx_conf.h file */ - if(hi2s->Init.ClockSource == I2S_CLOCK_EXTERNAL) - { - /* Set the I2S clock to the external clock value */ - i2ssourceclock = EXTERNAL_CLOCK_VALUE; - } - else - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); - } - else - { - /* Get the I2S source clock value */ - vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + /* Process Unlocked */ + __HAL_UNLOCK(hi2s); + + return HAL_TIMEOUT; + } + } } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); - /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ - i2ssourceclock = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); } -#endif /* STM32F411xE */ - - /* the return result is the value of I2S clock */ - return i2ssourceclock; + return HAL_OK; } + /** * @} */ - -/** - * @} - */ - -#endif /* HAL_I2S_MODULE_ENABLED */ +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ + /** * @} */ +#endif /* HAL_I2S_MODULE_ENABLED */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.c index b5ed4e2..25b7dd0 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_irda.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief IRDA HAL module driver. * This file provides firmware functions to manage the following * functionalities of the IrDA SIR ENDEC block (IrDA): @@ -90,14 +90,15 @@ (+) __HAL_IRDA_CLEAR_FLAG : Clears the specified IRDA pending flag (+) __HAL_IRDA_ENABLE_IT: Enables the specified IRDA interrupt (+) __HAL_IRDA_DISABLE_IT: Disables the specified IRDA interrupt - + + [..] (@) You can refer to the IRDA HAL driver header file for more useful macros @endverbatim ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -248,7 +249,7 @@ HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda) /* In IrDA mode, the following bits must be kept cleared: - LINEN, STOP and CLKEN bits in the USART_CR2 register, - SCEN and HDSEL bits in the USART_CR3 register.*/ - CLEAR_BIT(hirda->Instance->CR3, USART_CR2_LINEN | USART_CR2_STOP | USART_CR2_CLKEN); + CLEAR_BIT(hirda->Instance->CR2, USART_CR2_LINEN | USART_CR2_STOP | USART_CR2_CLKEN); CLEAR_BIT(hirda->Instance->CR3, USART_CR3_SCEN | USART_CR3_HDSEL); /* Enable the IRDA peripheral */ @@ -403,12 +404,12 @@ __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda) HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout) { uint16_t* tmp; - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Check that a Tx process is not already ongoing */ if(hirda->gState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -434,14 +435,14 @@ HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, u return HAL_TIMEOUT; } tmp = (uint16_t*) pData; - hirda->Instance->DR = (*tmp & (uint16_t)0x01FFU); + hirda->Instance->DR = (*tmp & (uint16_t)0x01FF); if(hirda->Init.Parity == IRDA_PARITY_NONE) { - pData +=2U; + pData +=2; } else { - pData +=1U; + pData +=1; } } else @@ -450,7 +451,7 @@ HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, u { return HAL_TIMEOUT; } - hirda->Instance->DR = (*pData++ & (uint8_t)0xFFU); + hirda->Instance->DR = (*pData++ & (uint8_t)0xFF); } } @@ -485,12 +486,12 @@ HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, u HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout) { uint16_t* tmp; - uint32_t tickstart = 0; + uint32_t tickstart = 0U; /* Check that a Rx process is not already ongoing */ if(hirda->RxState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -519,13 +520,13 @@ HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, ui tmp = (uint16_t*) pData ; if(hirda->Init.Parity == IRDA_PARITY_NONE) { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FFU); - pData +=2U; + *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF); + pData +=2; } else { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FFU); - pData +=1U; + *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF); + pData +=1; } } else @@ -536,11 +537,11 @@ HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, ui } if(hirda->Init.Parity == IRDA_PARITY_NONE) { - *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FFU); + *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF); } else { - *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007FU); + *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F); } } } @@ -572,7 +573,7 @@ HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData /* Check that a Tx process is not already ongoing */ if(hirda->gState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -612,7 +613,7 @@ HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, /* Check that a Rx process is not already ongoing */ if(hirda->RxState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -658,7 +659,7 @@ HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pDat /* Check that a Tx process is not already ongoing */ if(hirda->gState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -722,7 +723,7 @@ HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData /* Check that a Rx process is not already ongoing */ if(hirda->RxState == HAL_IRDA_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -750,6 +751,9 @@ HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData /* Enable the DMA Stream */ tmp = (uint32_t*)&pData; HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->DR, *(uint32_t*)tmp, Size); + + /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ + __HAL_IRDA_CLEAR_OREFLAG(hirda); /* Process Unlocked */ __HAL_UNLOCK(hirda); @@ -1054,7 +1058,7 @@ HAL_StatusTypeDef HAL_IRDA_AbortReceive(IRDA_HandleTypeDef *hirda) */ HAL_StatusTypeDef HAL_IRDA_Abort_IT(IRDA_HandleTypeDef *hirda) { - uint32_t AbortCplt = 1; + uint32_t AbortCplt = 1U; /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); @@ -1915,7 +1919,7 @@ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B) { tmp = (uint16_t*) hirda->pTxBuffPtr; - hirda->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FFU); + hirda->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); if(hirda->Init.Parity == IRDA_PARITY_NONE) { hirda->pTxBuffPtr += 2U; @@ -1927,7 +1931,7 @@ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) } else { - hirda->Instance->DR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0x00FFU); + hirda->Instance->DR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0x00FF); } if(--hirda->TxXferCount == 0U) @@ -1989,12 +1993,12 @@ static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda) tmp = (uint16_t*) hirda->pRxBuffPtr; if(hirda->Init.Parity == IRDA_PARITY_NONE) { - *tmp = (uint16_t)(uhdata & (uint16_t)0x01FFU); + *tmp = (uint16_t)(uhdata & (uint16_t)0x01FF); hirda->pRxBuffPtr += 2U; } else { - *tmp = (uint16_t)(uhdata & (uint16_t)0x00FFU); + *tmp = (uint16_t)(uhdata & (uint16_t)0x00FF); hirda->pRxBuffPtr += 1U; } } @@ -2002,11 +2006,11 @@ static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda) { if(hirda->Init.Parity == IRDA_PARITY_NONE) { - *hirda->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)0x00FFU); + *hirda->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)0x00FF); } else { - *hirda->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)0x007FU); + *hirda->pRxBuffPtr++ = (uint8_t)(uhdata & (uint8_t)0x007F); } } @@ -2071,10 +2075,17 @@ static void IRDA_SetConfig(IRDA_HandleTypeDef *hirda) CLEAR_BIT(hirda->Instance->CR3, USART_CR3_RTSE | USART_CR3_CTSE); /*-------------------------- USART BRR Configuration -----------------------*/ +#if defined(USART6) if((hirda->Instance == USART1) || (hirda->Instance == USART6)) { SET_BIT(hirda->Instance->BRR, IRDA_BRR(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate)); } +#else + if(hirda->Instance == USART1) + { + SET_BIT(hirda->Instance->BRR, IRDA_BRR(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate)); + } +#endif /* USART6 */ else { SET_BIT(hirda->Instance->BRR, IRDA_BRR(HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate)); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c index 9b69f3a..f65b5fe 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_iwdg.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief IWDG HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Independent Watchdog (IWDG) peripheral: @@ -74,7 +74,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -109,7 +109,7 @@ */ #ifdef HAL_IWDG_MODULE_ENABLED -/** @addtogroup IWDG +/** @defgroup IWDG IWDG * @brief IWDG HAL module driver. * @{ */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c index 9462449..641ee96 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_lptim.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief LPTIM HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Low Power Timer (LPTIM) peripheral: @@ -92,7 +92,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c index c91b9de..2ba4180 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_ltdc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief LTDC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the LTDC peripheral: @@ -44,15 +44,15 @@ functions: HAL_LTDC_SetPixelFormat(), HAL_LTDC_SetAlpha(), HAL_LTDC_SetWindowSize(), HAL_LTDC_SetWindowPosition(), HAL_LTDC_SetAddress. - (#) Variant functions with "_NoReload" post fix allows to set the LTDC configuration/settings without immediate reload. + (#) Variant functions with “_NoReload” post fix allows to set the LTDC configuration/settings without immediate reload. This is useful in case when the program requires to modify serval LTDC settings (on one or both layers) - then applying(reload) these settings in one shot by calling the function "HAL_LTDC_Relaod" + then applying(reload) these settings in one shot by calling the function “HAL_LTDC_Reload” - After calling the "_NoReload" functions to set different color/format/layer settings, - the program can call the function "HAL_LTDC_Relaod" To apply(Reload) these settings. - Function "HAL_LTDC_Relaod" can be called with the parameter "ReloadType" + After calling the “_NoReload” functions to set different color/format/layer settings, + the program can call the function “HAL_LTDC_Reload” To apply(Reload) these settings. + Function “HAL_LTDC_Reload” can be called with the parameter “ReloadType” set to LTDC_RELOAD_IMMEDIATE if an immediate reload is required. - Function "HAL_LTDC_Relaod" can be called with the parameter "ReloadType" + Function “HAL_LTDC_Reload” can be called with the parameter “ReloadType” set to LTDC_RELOAD_VERTICAL_BLANKING if the reload should be done in the next vertical blanking period, this option allows to avoid display flicker by applying the new settings during the vertical blanking period. @@ -66,14 +66,11 @@ (+) __HAL_LTDC_ENABLE: Enable the LTDC. (+) __HAL_LTDC_DISABLE: Disable the LTDC. - (+) __HAL_LTDC_LAYER_ENABLE: Enable the LTDC Layer. - (+) __HAL_LTDC_LAYER_DISABLE: Disable the LTDC Layer. - (+) __HAL_LTDC_RELOAD_CONFIG: Reload Layer Configuration. - (+) __HAL_LTDC_GET_FLAG: Get the LTDC pending flags. + (+) __HAL_LTDC_LAYER_ENABLE: Enable a LTDC Layer. + (+) __HAL_LTDC_LAYER_DISABLE: Disable a LTDC Layer. (+) __HAL_LTDC_CLEAR_FLAG: Clear the LTDC pending flags. (+) __HAL_LTDC_ENABLE_IT: Enable the specified LTDC interrupts. (+) __HAL_LTDC_DISABLE_IT: Disable the specified LTDC interrupts. - (+) __HAL_LTDC_GET_IT_SOURCE: Check whether the specified LTDC interrupt has occurred or not. [..] (@) You can refer to the LTDC HAL driver header file for more useful macros @@ -82,7 +79,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -152,9 +149,8 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay */ /** - * @brief Initializes the LTDC according to the specified - * parameters in the LTDC_InitTypeDef and create the associated handle. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief Initialize the LTDC according to the specified parameters in the LTDC_InitTypeDef. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval HAL status */ @@ -194,42 +190,39 @@ HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc) /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Configures the HS, VS, DE and PC polarity */ + /* Configure the HS, VS, DE and PC polarity */ hltdc->Instance->GCR &= ~(LTDC_GCR_HSPOL | LTDC_GCR_VSPOL | LTDC_GCR_DEPOL | LTDC_GCR_PCPOL); hltdc->Instance->GCR |= (uint32_t)(hltdc->Init.HSPolarity | hltdc->Init.VSPolarity | \ hltdc->Init.DEPolarity | hltdc->Init.PCPolarity); - /* Sets Synchronization size */ + /* Set Synchronization size */ hltdc->Instance->SSCR &= ~(LTDC_SSCR_VSH | LTDC_SSCR_HSW); tmp = (hltdc->Init.HorizontalSync << 16U); hltdc->Instance->SSCR |= (tmp | hltdc->Init.VerticalSync); - /* Sets Accumulated Back porch */ + /* Set Accumulated Back porch */ hltdc->Instance->BPCR &= ~(LTDC_BPCR_AVBP | LTDC_BPCR_AHBP); tmp = (hltdc->Init.AccumulatedHBP << 16U); hltdc->Instance->BPCR |= (tmp | hltdc->Init.AccumulatedVBP); - /* Sets Accumulated Active Width */ + /* Set Accumulated Active Width */ hltdc->Instance->AWCR &= ~(LTDC_AWCR_AAH | LTDC_AWCR_AAW); tmp = (hltdc->Init.AccumulatedActiveW << 16U); hltdc->Instance->AWCR |= (tmp | hltdc->Init.AccumulatedActiveH); - /* Sets Total Width */ + /* Set Total Width */ hltdc->Instance->TWCR &= ~(LTDC_TWCR_TOTALH | LTDC_TWCR_TOTALW); tmp = (hltdc->Init.TotalWidth << 16U); hltdc->Instance->TWCR |= (tmp | hltdc->Init.TotalHeigh); - /* Sets the background color value */ + /* Set the background color value */ tmp = ((uint32_t)(hltdc->Init.Backcolor.Green) << 8U); tmp1 = ((uint32_t)(hltdc->Init.Backcolor.Red) << 16U); hltdc->Instance->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED); hltdc->Instance->BCCR |= (tmp1 | tmp | hltdc->Init.Backcolor.Blue); - /* Enable the transfer Error interrupt */ - __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_TE); - - /* Enable the FIFO underrun interrupt */ - __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_FU); + /* Enable the Transfer Error and FIFO underrun interrupts */ + __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_TE | LTDC_IT_FU); /* Enable LTDC by setting LTDCEN bit */ __HAL_LTDC_ENABLE(hltdc); @@ -244,9 +237,8 @@ HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc) } /** - * @brief Deinitializes the LTDC peripheral registers to their default reset - * values. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief De-initialize the LTDC peripheral. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -269,8 +261,8 @@ HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc) } /** - * @brief Initializes the LTDC MSP. - * @param hltdc : pointer to a LTDC_HandleTypeDef structure that contains + * @brief Initialize the LTDC MSP. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -278,14 +270,15 @@ __weak void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc) { /* Prevent unused argument(s) compilation warning */ UNUSED(hltdc); - /* NOTE : This function Should not be modified, when the callback is needed, + + /* NOTE : This function should not be modified, when the callback is needed, the HAL_LTDC_MspInit could be implemented in the user file */ } /** - * @brief DeInitializes the LTDC MSP. - * @param hltdc : pointer to a LTDC_HandleTypeDef structure that contains + * @brief De-initialize the LTDC MSP. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -293,7 +286,8 @@ __weak void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) { /* Prevent unused argument(s) compilation warning */ UNUSED(hltdc); - /* NOTE : This function Should not be modified, when the callback is needed, + + /* NOTE : This function should not be modified, when the callback is needed, the HAL_LTDC_MspDeInit could be implemented in the user file */ } @@ -316,108 +310,102 @@ __weak void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) * @{ */ /** - * @brief Handles LTDC interrupt request. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief Handle LTDC interrupt request. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval HAL status */ void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc) { + uint32_t isrflags = READ_REG(hltdc->Instance->ISR); + uint32_t itsources = READ_REG(hltdc->Instance->IER); + /* Transfer Error Interrupt management ***************************************/ - if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_TE) != RESET) + if(((isrflags & LTDC_ISR_TERRIF) != RESET) && ((itsources & LTDC_IER_TERRIE) != RESET)) { - if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_TE) != RESET) - { - /* Disable the transfer Error interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_TE); + /* Disable the transfer Error interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_TE); - /* Clear the transfer error flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_TE); + /* Clear the transfer error flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_TE); - /* Update error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_TE; + /* Update error code */ + hltdc->ErrorCode |= HAL_LTDC_ERROR_TE; - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_ERROR; + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_ERROR; - /* Process unlocked */ - __HAL_UNLOCK(hltdc); + /* Process unlocked */ + __HAL_UNLOCK(hltdc); - /* Transfer error Callback */ - HAL_LTDC_ErrorCallback(hltdc); - } + /* Transfer error Callback */ + HAL_LTDC_ErrorCallback(hltdc); } + /* FIFO underrun Interrupt management ***************************************/ - if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_FU) != RESET) + if(((isrflags & LTDC_ISR_FUIF) != RESET) && ((itsources & LTDC_IER_FUIE) != RESET)) { - if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_FU) != RESET) - { - /* Disable the FIFO underrun interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_FU); + /* Disable the FIFO underrun interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_FU); - /* Clear the FIFO underrun flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_FU); + /* Clear the FIFO underrun flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_FU); - /* Update error code */ - hltdc->ErrorCode |= HAL_LTDC_ERROR_FU; + /* Update error code */ + hltdc->ErrorCode |= HAL_LTDC_ERROR_FU; - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_ERROR; + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_ERROR; - /* Process unlocked */ - __HAL_UNLOCK(hltdc); + /* Process unlocked */ + __HAL_UNLOCK(hltdc); - /* Transfer error Callback */ - HAL_LTDC_ErrorCallback(hltdc); - } + /* Transfer error Callback */ + HAL_LTDC_ErrorCallback(hltdc); } + /* Line Interrupt management ************************************************/ - if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_LI) != RESET) + if(((isrflags & LTDC_ISR_LIF) != RESET) && ((itsources & LTDC_IER_LIE) != RESET)) { - if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_LI) != RESET) - { - /* Disable the Line interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); + /* Disable the Line interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); - /* Clear the Line interrupt flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_LI); + /* Clear the Line interrupt flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_LI); - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_READY; + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_READY; - /* Process unlocked */ - __HAL_UNLOCK(hltdc); + /* Process unlocked */ + __HAL_UNLOCK(hltdc); - /* Line interrupt Callback */ - HAL_LTDC_LineEventCallback(hltdc); - } + /* Line interrupt Callback */ + HAL_LTDC_LineEventCallback(hltdc); } + /* Register reload Interrupt management ***************************************/ - if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_RR) != RESET) + if(((isrflags & LTDC_ISR_RRIF) != RESET) && ((itsources & LTDC_IER_RRIE) != RESET)) { - if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_RR) != RESET) - { - /* Disable the register reload interrupt */ - __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_RR); + /* Disable the register reload interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_RR); - /* Clear the register reload flag */ - __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_RR); + /* Clear the register reload flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_RR); - /* Change LTDC state */ - hltdc->State = HAL_LTDC_STATE_READY; + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_READY; - /* Process unlocked */ - __HAL_UNLOCK(hltdc); + /* Process unlocked */ + __HAL_UNLOCK(hltdc); - /* Register reload interrupt Callback */ - HAL_LTDC_ReloadEventCallback(hltdc); - } - } + /* Register reload interrupt Callback */ + HAL_LTDC_ReloadEventCallback(hltdc); + } } /** * @brief Error LTDC callback. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -425,14 +413,15 @@ __weak void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc) { /* Prevent unused argument(s) compilation warning */ UNUSED(hltdc); - /* NOTE : This function Should not be modified, when the callback is needed, + + /* NOTE : This function should not be modified, when the callback is needed, the HAL_LTDC_ErrorCallback could be implemented in the user file */ } /** * @brief Line Event callback. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -441,14 +430,14 @@ __weak void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) /* Prevent unused argument(s) compilation warning */ UNUSED(hltdc); - /* NOTE : This function Should not be modified, when the callback is needed, + /* NOTE : This function should not be modified, when the callback is needed, the HAL_LTDC_LineEventCallback could be implemented in the user file */ } /** * @brief Reload Event callback. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval None */ @@ -457,7 +446,7 @@ __weak void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc) /* Prevent unused argument(s) compilation warning */ UNUSED(hltdc); - /* NOTE : This function Should not be modified, when the callback is needed, + /* NOTE : This function should not be modified, when the callback is needed, the HAL_LTDC_ReloadEvenCallback could be implemented in the user file */ } @@ -493,43 +482,44 @@ __weak void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc) /** * @brief Configure the LTDC Layer according to the specified * parameters in the LTDC_InitTypeDef and create the associated handle. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param pLayerCfg: pointer to a LTDC_LayerCfgTypeDef structure that contains + * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains * the configuration information for the Layer. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) { - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); - assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); - assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); + assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); - assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); + assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); + assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); + assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + /* Copy new layer configuration into handle structure */ hltdc->LayerCfg[LayerIdx] = *pLayerCfg; /* Configure the LTDC Layer */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Initialize the LTDC state*/ @@ -543,30 +533,30 @@ HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgT /** * @brief Configure the color keying. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param RGBValue: the color key value - * @param LayerIdx: LTDC Layer index. + * @param RGBValue the color key value + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Configures the default color values */ + /* Configure the default color values */ LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -580,13 +570,13 @@ HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t /** * @brief Load the color lookup table. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param pCLUT: pointer to the color lookup table address. - * @param CLUTSize: the color lookup table size. - * @param LayerIdx: LTDC Layer index. + * @param pCLUT pointer to the color lookup table address. + * @param CLUTSize the color lookup table size. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT, uint32_t CLUTSize, uint32_t LayerIdx) @@ -595,15 +585,15 @@ HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT uint32_t counter = 0U; uint32_t pcounter = 0U; + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - for(counter = 0U; (counter < CLUTSize); counter++) { if(hltdc->LayerCfg[LayerIdx].PixelFormat == LTDC_PIXEL_FORMAT_AL44) @@ -632,28 +622,28 @@ HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT /** * @brief Enable the color keying. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Enable LTDC color keying by setting COLKEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -667,28 +657,28 @@ HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t /** * @brief Disable the color keying. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Disable LTDC color keying by setting COLKEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -702,15 +692,17 @@ HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_ /** * @brief Enable the color lookup table. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -718,13 +710,10 @@ HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerI /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Disable LTDC color lookup table by setting CLUTEN bit */ + /* Enable LTDC color lookup table by setting CLUTEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -738,15 +727,17 @@ HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerI /** * @brief Disable the color lookup table. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -754,13 +745,10 @@ HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t Layer /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Disable LTDC color lookup table by setting CLUTEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -773,8 +761,8 @@ HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t Layer } /** - * @brief Enables Dither. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief Enable Dither. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval HAL status */ @@ -788,7 +776,7 @@ HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc) hltdc->State = HAL_LTDC_STATE_BUSY; /* Enable Dither by setting DTEN bit */ - LTDC->GCR |= (uint32_t)LTDC_GCR_DTEN; + LTDC->GCR |= (uint32_t)LTDC_GCR_DEN; /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -800,8 +788,8 @@ HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc) } /** - * @brief Disables Dither. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief Disable Dither. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval HAL status */ @@ -815,7 +803,7 @@ HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc) hltdc->State = HAL_LTDC_STATE_BUSY; /* Disable Dither by setting DTEN bit */ - LTDC->GCR &= ~(uint32_t)LTDC_GCR_DTEN; + LTDC->GCR &= ~(uint32_t)LTDC_GCR_DEN; /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -828,19 +816,24 @@ HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc) /** * @brief Set the LTDC window size. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param XSize: LTDC Pixel per line - * @param YSize: LTDC Line number - * @param LayerIdx: LTDC Layer index. + * @param XSize LTDC Pixel per line + * @param YSize LTDC Line number + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters (Layers parameters)*/ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(XSize)); + assert_param(IS_LTDC_CFBLNBR(YSize)); + /* Process locked */ __HAL_LOCK(hltdc); @@ -850,21 +843,10 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSi /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - /* Check the parameters (Layers parameters)*/ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - assert_param(IS_LTDC_CFBLL(XSize)); - assert_param(IS_LTDC_CFBLNBR(YSize)); - - /* update horizontal start/stop */ - pLayerCfg->WindowX0 = 0U; + /* update horizontal stop */ pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; - /* update vertical start/stop */ - pLayerCfg->WindowY0 = 0U; + /* update vertical stop */ pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; /* Reconfigures the color frame buffer pitch in byte */ @@ -876,7 +858,7 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSi /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -890,19 +872,24 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSi /** * @brief Set the LTDC window position. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param X0: LTDC window X offset - * @param Y0: LTDC window Y offset - * @param LayerIdx: LTDC Layer index. + * @param X0 LTDC window X offset + * @param Y0 LTDC window Y offset + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(X0)); + assert_param(IS_LTDC_CFBLNBR(Y0)); + /* Process locked */ __HAL_LOCK(hltdc); @@ -912,13 +899,6 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - /* update horizontal start/stop */ pLayerCfg->WindowX0 = X0; pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; @@ -930,7 +910,7 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -944,28 +924,28 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t /** * @brief Reconfigure the pixel format. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param Pixelformat: new pixel format value. - * @param LayerIdx: LTDC Layer index. + * @param Pixelformat new pixel format value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1. + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -975,7 +955,7 @@ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pi /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -989,28 +969,28 @@ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pi /** * @brief Reconfigure the layer alpha value. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param Alpha: new alpha value. - * @param LayerIdx: LTDC Layer index. + * @param Alpha new alpha value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_ALPHA(Alpha)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_ALPHA(Alpha)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -1020,7 +1000,7 @@ HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, u /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -1033,27 +1013,27 @@ HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, u } /** * @brief Reconfigure the frame buffer Address. - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param Address: new address value. - * @param LayerIdx: LTDC Layer index. + * @param Address new address value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1. + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -1063,7 +1043,7 @@ HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Addres /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Sets the Reload type */ + /* Set the Immediate Reload type */ hltdc->Instance->SRCR = LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -1080,12 +1060,12 @@ HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Addres * larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to layer for which we * want to read and display on screen only a portion 320x240 taken in the center of the buffer. The pitch in pixels * will be in that case 800 pixels and not 320 pixels as initially configured by previous call to HAL_LTDC_ConfigLayer(). - * Note : this function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch - * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch + * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LinePitchInPixels: New line pitch in pixels to configure for LTDC layer 'LayerIdx'. - * @param LayerIdx: LTDC layer index concerned by the modification of line pitch. + * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. + * @param LayerIdx LTDC layer index concerned by the modification of line pitch. * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) @@ -1093,6 +1073,9 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitc uint32_t tmp = 0U; uint32_t pitchUpdate = 0U; uint32_t pixelFormat = 0U; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -1100,9 +1083,6 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitc /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* get LayerIdx used pixel format */ pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; @@ -1131,13 +1111,13 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitc /* Clear previously set standard pitch */ LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; - /* Sets the Reload type as immediate update of LTDC pitch configured above */ + /* Set the Reload type as immediate update of LTDC pitch configured above */ LTDC->SRCR |= LTDC_SRCR_IMR; /* Set new line pitch value */ LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; - /* Sets the Reload type as immediate update of LTDC pitch configured above */ + /* Set the Reload type as immediate update of LTDC pitch configured above */ LTDC->SRCR |= LTDC_SRCR_IMR; /* Change the LTDC state*/ @@ -1150,29 +1130,33 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitc } /** - * @brief Define the position of the line interrupt . - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param Line: Line Interrupt Position. + * @brief Define the position of the line interrupt. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Line Line Interrupt Position. + * @note User application may resort to HAL_LTDC_LineEventCallback() at line interrupt generation. * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line) { + /* Check the parameters */ + assert_param(IS_LTDC_LIPOS(Line)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LIPOS(Line)); + /* Disable the Line interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); + + /* Set the Line Interrupt position */ + LTDC->LIPCR = (uint32_t)Line; /* Enable the Line interrupt */ __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_LI); - /* Sets the Line Interrupt position */ - LTDC->LIPCR = (uint32_t)Line; - /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1183,17 +1167,19 @@ HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t } /** - * @brief LTDC configuration relaod . - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param ReloadType: This parameter can be one of the following values : - * LTDC_RELOAD_IMMEDIATE : Immediate Reload - * LTDC_SRCR_VBR : Reload in the next Vertical Blanking + * @brief Reload LTDC Layers configuration. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param ReloadType This parameter can be one of the following values : + * LTDC_RELOAD_IMMEDIATE : Immediate Reload + * LTDC_RELOAD_VERTICAL_BLANKING : Reload in the next Vertical Blanking + * @note User application may resort to HAL_LTDC_ReloadEventCallback() at reload interrupt generation. * @retval HAL status */ -HAL_StatusTypeDef HAL_LTDC_Relaod(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType) +HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType) { - assert_param(IS_LTDC_RELAOD(ReloadType)); + /* Check the parameters */ + assert_param(IS_LTDC_RELOAD(ReloadType)); /* Process locked */ __HAL_LOCK(hltdc); @@ -1219,44 +1205,45 @@ HAL_StatusTypeDef HAL_LTDC_Relaod(LTDC_HandleTypeDef *hltdc, uint32_t ReloadTyp /** * @brief Configure the LTDC Layer according to the specified without reloading * parameters in the LTDC_InitTypeDef and create the associated handle. - * Variant of the function HAL_LTDC_ConfigLayer without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_ConfigLayer without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param pLayerCfg: pointer to a LTDC_LayerCfgTypeDef structure that contains + * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains * the configuration information for the Layer. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) { - /* Process locked */ - __HAL_LOCK(hltdc); - - /* Change LTDC peripheral state */ - hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); - assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); - assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); + assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); - assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); + assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); + assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); + assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + /* Copy new layer configuration into handle structure */ hltdc->LayerCfg[LayerIdx] = *pLayerCfg; /* Configure the LTDC Layer */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Initialize the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1269,20 +1256,25 @@ HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_ /** * @brief Set the LTDC window size without reloading. - * Variant of the function HAL_LTDC_SetWindowSize without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_SetWindowSize without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param XSize: LTDC Pixel per line - * @param YSize: LTDC Line number - * @param LayerIdx: LTDC Layer index. + * @param XSize LTDC Pixel per line + * @param YSize LTDC Line number + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters (Layers parameters)*/ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(XSize)); + assert_param(IS_LTDC_CFBLNBR(YSize)); + /* Process locked */ __HAL_LOCK(hltdc); @@ -1292,21 +1284,10 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uin /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - /* Check the parameters (Layers parameters)*/ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - assert_param(IS_LTDC_CFBLL(XSize)); - assert_param(IS_LTDC_CFBLNBR(YSize)); - - /* update horizontal start/stop */ - pLayerCfg->WindowX0 = 0; + /* update horizontal stop */ pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; - /* update vertical start/stop */ - pLayerCfg->WindowY0 = 0; + /* update vertical stop */ pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; /* Reconfigures the color frame buffer pitch in byte */ @@ -1318,7 +1299,7 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uin /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1331,20 +1312,25 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uin /** * @brief Set the LTDC window position without reloading. - * Variant of the function HAL_LTDC_SetWindowPosition without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_SetWindowPosition without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param X0: LTDC window X offset - * @param Y0: LTDC window Y offset - * @param LayerIdx: LTDC Layer index. + * @param X0 LTDC window X offset + * @param Y0 LTDC window Y offset + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(X0)); + assert_param(IS_LTDC_CFBLNBR(Y0)); + /* Process locked */ __HAL_LOCK(hltdc); @@ -1354,13 +1340,6 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); - assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); - assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); - assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); - /* update horizontal start/stop */ pLayerCfg->WindowX0 = X0; pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; @@ -1372,7 +1351,7 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1385,29 +1364,29 @@ HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, /** * @brief Reconfigure the pixel format without reloading. - * Variant of the function HAL_LTDC_SetPixelFormat without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDfef structure that contains + * Variant of the function HAL_LTDC_SetPixelFormat without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDfef structure that contains * the configuration information for the LTDC. - * @param Pixelformat: new pixel format value. - * @param LayerIdx: LTDC Layer index. + * @param Pixelformat new pixel format value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1. + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -1417,7 +1396,7 @@ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, ui /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1430,29 +1409,29 @@ HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, ui /** * @brief Reconfigure the layer alpha value without reloading. - * Variant of the function HAL_LTDC_SetAlpha without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_SetAlpha without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param Alpha: new alpha value. - * @param LayerIdx: LTDC Layer index. + * @param Alpha new alpha value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_ALPHA(Alpha)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_ALPHA(Alpha)); - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -1462,7 +1441,7 @@ HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1475,28 +1454,28 @@ HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t /** * @brief Reconfigure the frame buffer Address without reloading. - * Variant of the function HAL_LTDC_SetAddress without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_SetAddress without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param Address: new address value. - * @param LayerIdx: LTDC Layer index. + * @param Address new address value. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1. + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx) { LTDC_LayerCfgTypeDef *pLayerCfg; + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Get layer configuration from handle structure */ pLayerCfg = &hltdc->LayerCfg[LayerIdx]; @@ -1506,7 +1485,7 @@ HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32 /* Set LTDC parameters */ LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1522,20 +1501,23 @@ HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32 * larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to layer for which we * want to read and display on screen only a portion 320x240 taken in the center of the buffer. The pitch in pixels * will be in that case 800 pixels and not 320 pixels as initially configured by previous call to HAL_LTDC_ConfigLayer(). - * Note : this function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch - * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). - * Variant of the function HAL_LTDC_SetPitch without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch + * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). + * Variant of the function HAL_LTDC_SetPitch without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LinePitchInPixels: New line pitch in pixels to configure for LTDC layer 'LayerIdx'. - * @param LayerIdx: LTDC layer index concerned by the modification of line pitch. + * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. + * @param LayerIdx LTDC layer index concerned by the modification of line pitch. * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) { - uint32_t tmp = 0; - uint32_t pitchUpdate = 0; - uint32_t pixelFormat = 0; + uint32_t tmp = 0U; + uint32_t pitchUpdate = 0U; + uint32_t pixelFormat = 0U; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -1543,33 +1525,30 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* get LayerIdx used pixel format */ pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; if(pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) { - tmp = 4; + tmp = 4U; } else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888) { - tmp = 3; + tmp = 3U; } else if((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ (pixelFormat == LTDC_PIXEL_FORMAT_AL88)) { - tmp = 2; + tmp = 2U; } else { - tmp = 1; + tmp = 1U; } - pitchUpdate = ((LinePitchInPixels * tmp) << 16); + pitchUpdate = ((LinePitchInPixels * tmp) << 16U); /* Clear previously set standard pitch */ LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; @@ -1577,7 +1556,7 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t /* Set new line pitch value */ LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1591,31 +1570,31 @@ HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t /** * @brief Configure the color keying without reloading. - * Variant of the function HAL_LTDC_ConfigColorKeying without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_ConfigColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param RGBValue: the color key value - * @param LayerIdx: LTDC Layer index. + * @param RGBValue the color key value + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - - /* Configures the default color values */ + /* Configure the default color values */ LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1628,29 +1607,29 @@ HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, /** * @brief Enable the color keying without reloading. - * Variant of the function HAL_LTDC_EnableColorKeying without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_EnableColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Enable LTDC color keying by setting COLKEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1663,29 +1642,29 @@ HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, /** * @brief Disable the color keying without reloading. - * Variant of the function HAL_LTDC_DisableColorKeying without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_DisableColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + /* Process locked */ __HAL_LOCK(hltdc); /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Disable LTDC color keying by setting COLKEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1698,16 +1677,18 @@ HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc /** * @brief Enable the color lookup table without reloading. - * Variant of the function HAL_LTDC_EnableCLUT without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_EnableCLUT without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -1715,13 +1696,10 @@ HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32 /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Disable LTDC color lookup table by setting CLUTEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1734,16 +1712,18 @@ HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32 /** * @brief Disable the color lookup table without reloading. - * Variant of the function HAL_LTDC_DisableCLUT without immediate reload - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * Variant of the function HAL_LTDC_DisableCLUT without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param LayerIdx: LTDC Layer index. + * @param LayerIdx LTDC Layer index. * This parameter can be one of the following values: - * 0 or 1 + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval HAL status */ HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) { + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); /* Process locked */ __HAL_LOCK(hltdc); @@ -1751,13 +1731,10 @@ HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint3 /* Change LTDC peripheral state */ hltdc->State = HAL_LTDC_STATE_BUSY; - /* Check the parameters */ - assert_param(IS_LTDC_LAYER(LayerIdx)); - /* Disable LTDC color lookup table by setting CLUTEN bit */ LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; - /* Do not Sets the Reload */ + /* Do not set the Immediate Reload */ /* Change the LTDC state*/ hltdc->State = HAL_LTDC_STATE_READY; @@ -1781,16 +1758,16 @@ HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint3 =============================================================================== [..] This subsection provides functions allowing to - (+) Check the LTDC state. - (+) Get error code. + (+) Check the LTDC handle state. + (+) Get the LTDC handle error code. @endverbatim * @{ */ /** - * @brief Return the LTDC state - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains + * @brief Return the LTDC handle state. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval HAL state */ @@ -1800,8 +1777,8 @@ HAL_LTDC_StateTypeDef HAL_LTDC_GetState(LTDC_HandleTypeDef *hltdc) } /** -* @brief Return the LTDC error code -* @param hltdc : pointer to a LTDC_HandleTypeDef structure that contains + * @brief Return the LTDC handle error code. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. * @retval LTDC Error Code */ @@ -1815,12 +1792,20 @@ uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc) */ /** - * @brief Configures the LTDC peripheral - * @param hltdc : Pointer to a LTDC_HandleTypeDef structure that contains + * @} + */ + +/** @defgroup LTDC_Private_Functions LTDC Private Functions + * @{ + */ + +/** + * @brief Configure the LTDC peripheral + * @param hltdc Pointer to a LTDC_HandleTypeDef structure that contains * the configuration information for the LTDC. - * @param pLayerCfg: Pointer LTDC Layer Configuration structure - * @param LayerIdx: LTDC Layer index. - * This parameter can be one of the following values: 0 or 1 + * @param pLayerCfg Pointer LTDC Layer Configuration structure + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) * @retval None */ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) @@ -1829,12 +1814,12 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay uint32_t tmp1 = 0U; uint32_t tmp2 = 0U; - /* Configures the horizontal start and stop position */ + /* Configure the horizontal start and stop position */ tmp = ((pLayerCfg->WindowX1 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U)) << 16U); LTDC_LAYER(hltdc, LayerIdx)->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS); LTDC_LAYER(hltdc, LayerIdx)->WHPCR = ((pLayerCfg->WindowX0 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U) + 1U) | tmp); - /* Configures the vertical start and stop position */ + /* Configure the vertical start and stop position */ tmp = ((pLayerCfg->WindowY1 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP)) << 16U); LTDC_LAYER(hltdc, LayerIdx)->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS); LTDC_LAYER(hltdc, LayerIdx)->WVPCR = ((pLayerCfg->WindowY0 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP) + 1U) | tmp); @@ -1843,7 +1828,7 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay LTDC_LAYER(hltdc, LayerIdx)->PFCR &= ~(LTDC_LxPFCR_PF); LTDC_LAYER(hltdc, LayerIdx)->PFCR = (pLayerCfg->PixelFormat); - /* Configures the default color values */ + /* Configure the default color values */ tmp = ((uint32_t)(pLayerCfg->Backcolor.Green) << 8U); tmp1 = ((uint32_t)(pLayerCfg->Backcolor.Red) << 16U); tmp2 = (pLayerCfg->Alpha0 << 24U); @@ -1858,7 +1843,7 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay LTDC_LAYER(hltdc, LayerIdx)->BFCR &= ~(LTDC_LxBFCR_BF2 | LTDC_LxBFCR_BF1); LTDC_LAYER(hltdc, LayerIdx)->BFCR = (pLayerCfg->BlendingFactor1 | pLayerCfg->BlendingFactor2); - /* Configures the color frame buffer start address */ + /* Configure the color frame buffer start address */ LTDC_LAYER(hltdc, LayerIdx)->CFBAR &= ~(LTDC_LxCFBAR_CFBADD); LTDC_LAYER(hltdc, LayerIdx)->CFBAR = (pLayerCfg->FBStartAdress); @@ -1882,11 +1867,11 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay tmp = 1U; } - /* Configures the color frame buffer pitch in byte */ + /* Configure the color frame buffer pitch in byte */ LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~(LTDC_LxCFBLR_CFBLL | LTDC_LxCFBLR_CFBP); LTDC_LAYER(hltdc, LayerIdx)->CFBLR = (((pLayerCfg->ImageWidth * tmp) << 16U) | (((pLayerCfg->WindowX1 - pLayerCfg->WindowX0) * tmp) + 3U)); - /* Configures the frame buffer line number */ + /* Configure the frame buffer line number */ LTDC_LAYER(hltdc, LayerIdx)->CFBLNR &= ~(LTDC_LxCFBLNR_CFBLNBR); LTDC_LAYER(hltdc, LayerIdx)->CFBLNR = (pLayerCfg->ImageHeight); @@ -1899,6 +1884,7 @@ static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLay */ #endif /* STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ #endif /* HAL_LTDC_MODULE_ENABLED */ + /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c index 1681f0a..685e67e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c @@ -2,13 +2,13 @@ ****************************************************************************** * @file stm32f4xx_hal_ltdc_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief LTDC Extension HAL module driver. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -75,15 +75,15 @@ #if defined(STM32F469xx) || defined(STM32F479xx) /** * @brief Retrieve common parameters from DSI Video mode configuration structure - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param VidCfg: pointer to a DSI_VidCfgTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param VidCfg pointer to a DSI_VidCfgTypeDef structure that contains * the DSI video mode configuration parameters * @note The implementation of this function is taking into account the LTDC * polarities inversion as described in the current LTDC specification * @retval HAL status */ -HAL_StatusTypeDef HAL_LTDC_StructInitFromVideoConfig(LTDC_HandleTypeDef* hltdc, DSI_VidCfgTypeDef *VidCfg) +HAL_StatusTypeDef HAL_LTDCEx_StructInitFromVideoConfig(LTDC_HandleTypeDef* hltdc, DSI_VidCfgTypeDef *VidCfg) { /* Retrieve signal polarities from DSI */ @@ -111,22 +111,22 @@ HAL_StatusTypeDef HAL_LTDC_StructInitFromVideoConfig(LTDC_HandleTypeDef* hltdc, /** * @brief Retrieve common parameters from DSI Adapted command mode configuration structure - * @param hltdc: pointer to a LTDC_HandleTypeDef structure that contains - * the configuration information for the LTDC. - * @param CmdCfg: pointer to a DSI_CmdCfgTypeDef structure that contains + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param CmdCfg pointer to a DSI_CmdCfgTypeDef structure that contains * the DSI command mode configuration parameters * @note The implementation of this function is taking into account the LTDC * polarities inversion as described in the current LTDC specification * @retval HAL status */ -HAL_StatusTypeDef HAL_LTDC_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef* hltdc, DSI_CmdCfgTypeDef *CmdCfg) +HAL_StatusTypeDef HAL_LTDCEx_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef* hltdc, DSI_CmdCfgTypeDef *CmdCfg) { /* Retrieve signal polarities from DSI */ /* The following polarities are inverted: LTDC_DEPOLARITY_AL <-> LTDC_DEPOLARITY_AH - LTDC_VSPOLARITY_AL <-> LTDC_VSPOLARITY_AH - LTDC_HSPOLARITY_AL <-> LTDC_HSPOLARITY_AH)*/ + LTDC_VSPOLARITY_AL <-> LTDC_VSPOLARITY_AH + LTDC_HSPOLARITY_AL <-> LTDC_HSPOLARITY_AH)*/ /* Note 1 : Code in line w/ Current LTDC specification */ hltdc->Init.DEPolarity = (CmdCfg->DEPolarity == DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.c new file mode 100644 index 0000000..66e4f4b --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_mmc.c @@ -0,0 +1,2604 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_mmc.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief MMC card HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Secure Digital (MMC) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + MMC card Control functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + This driver implements a high level communication layer for read and write from/to + this memory. The needed STM32 hardware resources (SDMMC and GPIO) are performed by + the user in HAL_MMC_MspInit() function (MSP layer). + Basically, the MSP layer configuration should be the same as we provide in the + examples. + You can easily tailor this configuration according to hardware resources. + + [..] + This driver is a generic layered driver for SDMMC memories which uses the HAL + SDMMC driver functions to interface with MMC and eMMC cards devices. + It is used as follows: + + (#)Initialize the SDMMC low level resources by implement the HAL_MMC_MspInit() API: + (##) Enable the SDMMC interface clock using __HAL_RCC_SDMMC_CLK_ENABLE(); + (##) SDMMC pins configuration for MMC card + (+++) Enable the clock for the SDMMC GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these SDMMC pins as alternate function pull-up using HAL_GPIO_Init() + and according to your pin assignment; + (##) DMA Configuration if you need to use DMA process (HAL_MMC_ReadBlocks_DMA() + and HAL_MMC_WriteBlocks_DMA() APIs). + (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE(); + (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled. + (##) NVIC configuration if you need to use interrupt process when using DMA transfer. + (+++) Configure the SDMMC and DMA interrupt priorities using functions + HAL_NVIC_SetPriority(); DMA priority is superior to SDMMC's priority + (+++) Enable the NVIC DMA and SDMMC IRQs using function HAL_NVIC_EnableIRQ() + (+++) SDMMC interrupts are managed using the macros __HAL_MMC_ENABLE_IT() + and __HAL_MMC_DISABLE_IT() inside the communication process. + (+++) SDMMC interrupts pending bits are managed using the macros __HAL_MMC_GET_IT() + and __HAL_MMC_CLEAR_IT() + (##) NVIC configuration if you need to use interrupt process (HAL_MMC_ReadBlocks_IT() + and HAL_MMC_WriteBlocks_IT() APIs). + (+++) Configure the SDMMC interrupt priorities using function + HAL_NVIC_SetPriority(); + (+++) Enable the NVIC SDMMC IRQs using function HAL_NVIC_EnableIRQ() + (+++) SDMMC interrupts are managed using the macros __HAL_MMC_ENABLE_IT() + and __HAL_MMC_DISABLE_IT() inside the communication process. + (+++) SDMMC interrupts pending bits are managed using the macros __HAL_MMC_GET_IT() + and __HAL_MMC_CLEAR_IT() + (#) At this stage, you can perform MMC read/write/erase operations after MMC card initialization + + + *** MMC Card Initialization and configuration *** + ================================================ + [..] + To initialize the MMC Card, use the HAL_MMC_Init() function. It Initializes + SDMMC IP (STM32 side) and the MMC Card, and put it into StandBy State (Ready for data transfer). + This function provide the following operations: + + (#) Initialize the SDMMC peripheral interface with defaullt configuration. + The initialization process is done at 400KHz. You can change or adapt + this frequency by adjusting the "ClockDiv" field. + The MMC Card frequency (SDMMC_CK) is computed as follows: + + SDMMC_CK = SDMMCCLK / (ClockDiv + 2) + + In initialization mode and according to the MMC Card standard, + make sure that the SDMMC_CK frequency doesn't exceed 400KHz. + + This phase of initialization is done through SDMMC_Init() and + SDMMC_PowerState_ON() SDMMC low level APIs. + + (#) Initialize the MMC card. The API used is HAL_MMC_InitCard(). + This phase allows the card initialization and identification + and check the MMC Card type (Standard Capacity or High Capacity) + The initialization flow is compatible with MMC standard. + + This API (HAL_MMC_InitCard()) could be used also to reinitialize the card in case + of plug-off plug-in. + + (#) Configure the MMC Card Data transfer frequency. By Default, the card transfer + frequency is set to 24MHz. You can change or adapt this frequency by adjusting + the "ClockDiv" field. + In transfer mode and according to the MMC Card standard, make sure that the + SDMMC_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch. + To be able to use a frequency higher than 24MHz, you should use the SDMMC + peripheral in bypass mode. Refer to the corresponding reference manual + for more details. + + (#) Select the corresponding MMC Card according to the address read with the step 2. + + (#) Configure the MMC Card in wide bus mode: 4-bits data. + + *** MMC Card Read operation *** + ============================== + [..] + (+) You can read from MMC card in polling mode by using function HAL_MMC_ReadBlocks(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + + (+) You can read from MMC card in DMA mode by using function HAL_MMC_ReadBlocks_DMA(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + You could also check the DMA transfer process through the MMC Rx interrupt event. + + (+) You can read from MMC card in Interrupt mode by using function HAL_MMC_ReadBlocks_IT(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + You could also check the IT transfer process through the MMC Rx interrupt event. + + *** MMC Card Write operation *** + =============================== + [..] + (+) You can write to MMC card in polling mode by using function HAL_MMC_WriteBlocks(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + + (+) You can write to MMC card in DMA mode by using function HAL_MMC_WriteBlocks_DMA(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + You could also check the DMA transfer process through the MMC Tx interrupt event. + + (+) You can write to MMC card in Interrupt mode by using function HAL_MMC_WriteBlocks_IT(). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_MMC_GetCardState() function for MMC card state. + You could also check the IT transfer process through the MMC Tx interrupt event. + + *** MMC card status *** + ====================== + [..] + (+) The MMC Status contains status bits that are related to the MMC Memory + Card proprietary features. To get MMC card status use the HAL_MMC_GetCardStatus(). + + *** MMC card information *** + =========================== + [..] + (+) To get MMC card information, you can use the function HAL_MMC_GetCardInfo(). + It returns useful information about the MMC card such as block size, card type, + block number ... + + *** MMC card CSD register *** + ============================ + [..] + (+) The HAL_MMC_GetCardCSD() API allows to get the parameters of the CSD register. + Some of the CSD parameters are useful for card initialization and identification. + + *** MMC card CID register *** + ============================ + [..] + (+) The HAL_MMC_GetCardCID() API allows to get the parameters of the CID register. + Some of the CID parameters are useful for card initialization and identification. + + *** MMC HAL driver macros list *** + ================================== + [..] + Below the list of most used macros in MMC HAL driver. + + (+) __HAL_MMC_ENABLE : Enable the MMC device + (+) __HAL_MMC_DISABLE : Disable the MMC device + (+) __HAL_MMC_DMA_ENABLE: Enable the SDMMC DMA transfer + (+) __HAL_MMC_DMA_DISABLE: Disable the SDMMC DMA transfer + (+) __HAL_MMC_ENABLE_IT: Enable the MMC device interrupt + (+) __HAL_MMC_DISABLE_IT: Disable the MMC device interrupt + (+) __HAL_MMC_GET_FLAG:Check whether the specified MMC flag is set or not + (+) __HAL_MMC_CLEAR_FLAG: Clear the MMC's pending flags + + [..] + (@) You can refer to the MMC HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup MMC + * @{ + */ + +#ifdef HAL_MMC_MODULE_ENABLED + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup MMC_Private_Defines + * @{ + */ + +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup MMC_Private_Functions MMC Private Functions + * @{ + */ +static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc); +static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc); +static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus); +static HAL_StatusTypeDef MMC_PowerOFF(MMC_HandleTypeDef *hmmc); +static HAL_StatusTypeDef MMC_Write_IT(MMC_HandleTypeDef *hmmc); +static HAL_StatusTypeDef MMC_Read_IT(MMC_HandleTypeDef *hmmc); +static void MMC_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void MMC_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void MMC_DMAError(DMA_HandleTypeDef *hdma); +static void MMC_DMATxAbort(DMA_HandleTypeDef *hdma); +static void MMC_DMARxAbort(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup MMC_Exported_Functions + * @{ + */ + +/** @addtogroup MMC_Exported_Functions_Group1 + * @brief Initialization and de-initialization functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] + This section provides functions allowing to initialize/de-initialize the MMC + card device to be ready for use. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the MMC according to the specified parameters in the + MMC_HandleTypeDef and create the associated handle. + * @param hmmc: Pointer to the MMC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_Init(MMC_HandleTypeDef *hmmc) +{ + /* Check the MMC handle allocation */ + if(hmmc == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance)); + assert_param(IS_SDIO_CLOCK_EDGE(hmmc->Init.ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(hmmc->Init.ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(hmmc->Init.ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(hmmc->Init.BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hmmc->Init.HardwareFlowControl)); + assert_param(IS_SDIO_CLKDIV(hmmc->Init.ClockDiv)); + + if(hmmc->State == HAL_MMC_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hmmc->Lock = HAL_UNLOCKED; + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + HAL_MMC_MspInit(hmmc); + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize the Card parameters */ + HAL_MMC_InitCard(hmmc); + + /* Initialize the error code */ + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the MMC operation */ + hmmc->Context = MMC_CONTEXT_NONE; + + /* Initialize the MMC state */ + hmmc->State = HAL_MMC_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initializes the MMC Card. + * @param hmmc: Pointer to MMC handle + * @note This function initializes the MMC card. It could be used when a card + re-initialization is needed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_InitCard(MMC_HandleTypeDef *hmmc) +{ + uint32_t errorstate = HAL_MMC_ERROR_NONE; + MMC_InitTypeDef Init; + + /* Default SDMMC peripheral configuration for MMC card initialization */ + Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + Init.BusWide = SDIO_BUS_WIDE_1B; + Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + Init.ClockDiv = SDIO_INIT_CLK_DIV; + + /* Initialize SDMMC peripheral interface with default configuration */ + SDIO_Init(hmmc->Instance, Init); + + /* Disable SDMMC Clock */ + __HAL_MMC_DISABLE(hmmc); + + /* Set Power State to ON */ + SDIO_PowerState_ON(hmmc->Instance); + + /* Enable SDMMC Clock */ + __HAL_MMC_ENABLE(hmmc); + + /* Required power up waiting time before starting the SD initialization + sequence */ + HAL_Delay(2U); + + /* Identify card operating voltage */ + errorstate = MMC_PowerON(hmmc); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->State = HAL_MMC_STATE_READY; + hmmc->ErrorCode |= errorstate; + return HAL_ERROR; + } + + /* Card initialization */ + errorstate = MMC_InitCard(hmmc); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->State = HAL_MMC_STATE_READY; + hmmc->ErrorCode |= errorstate; + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief De-Initializes the MMC card. + * @param hmmc: Pointer to MMC handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_DeInit(MMC_HandleTypeDef *hmmc) +{ + /* Check the MMC handle allocation */ + if(hmmc == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SDIO_ALL_INSTANCE(hmmc->Instance)); + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Set SD power state to off */ + MMC_PowerOFF(hmmc); + + /* De-Initialize the MSP layer */ + HAL_MMC_MspDeInit(hmmc); + + hmmc->ErrorCode = HAL_MMC_ERROR_NONE; + hmmc->State = HAL_MMC_STATE_RESET; + + return HAL_OK; +} + + +/** + * @brief Initializes the MMC MSP. + * @param hmmc: Pointer to MMC handle + * @retval None + */ +__weak void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_MMC_MspInit could be implemented in the user file + */ +} + +/** + * @brief De-Initialize MMC MSP. + * @param hmmc: Pointer to MMC handle + * @retval None + */ +__weak void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_MMC_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @addtogroup MMC_Exported_Functions_Group2 + * @brief Data transfer functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to manage the data + transfer from/to MMC card. + +@endverbatim + * @{ + */ + +/** + * @brief Reads block(s) from a specified address in a card. The Data transfer + * is managed by polling mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @param hmmc: Pointer to MMC handle + * @param pData: pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read + * @param NumberOfBlocks: Number of MMC blocks to read + * @param Timeout: Specify timeout value + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); + uint32_t count = 0U, *tempbuff = (uint32_t *)pData; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = NumberOfBlocks * BLOCKSIZE; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + /* Read block(s) in polling mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK; + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = MMC_CONTEXT_READ_SINGLE_BLOCK; + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Poll on SDMMC flags */ +#ifdef SDIO_STA_STBITERR + while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_STA_STBITERR)) +#else /* SDIO_STA_STBITERR not defined */ + while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) +#endif /* SDIO_STA_STBITERR */ + { + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF)) + { + /* Read data from SDMMC Rx FIFO */ + for(count = 0U; count < 8U; count++) + { + *(tempbuff + count) = SDIO_ReadFIFO(hmmc->Instance); + } + tempbuff += 8U; + } + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT; + hmmc->State= HAL_MMC_STATE_READY; + return HAL_TIMEOUT; + } + } + + /* Send stop transmission command in case of multiblock read */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) + { + /* Send stop transmission command */ + errorstate = SDMMC_CmdStopTransfer(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + } + + /* Get error state */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Empty FIFO if there is still any data */ + while ((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXDAVL))) + { + *tempbuff = SDIO_ReadFIFO(hmmc->Instance); + tempbuff++; + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT; + hmmc->State= HAL_MMC_STATE_READY; + return HAL_ERROR; + } + } + + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + + hmmc->State = HAL_MMC_STATE_READY; + + return HAL_OK; + } + else + { + hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY; + return HAL_ERROR; + } +} + +/** + * @brief Allows to write block(s) to a specified address in a card. The Data + * transfer is managed by polling mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @param hmmc: Pointer to MMC handle + * @param pData: pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written + * @param NumberOfBlocks: Number of MMC blocks to write + * @param Timeout: Specify timeout value + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); + uint32_t count = 0U; + uint32_t *tempbuff = (uint32_t *)pData; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK; + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = MMC_CONTEXT_WRITE_SINGLE_BLOCK; + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = NumberOfBlocks * BLOCKSIZE; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + /* Write block(s) in polling mode */ +#ifdef SDIO_STA_STBITERR + while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) +#else /* SDIO_STA_STBITERR not defined */ + while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) +#endif /* SDIO_STA_STBITERR */ + { + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE)) + { + /* Write data to SDIO Tx FIFO */ + for(count = 0U; count < 8U; count++) + { + SDIO_WriteFIFO(hmmc->Instance, (tempbuff + count)); + } + tempbuff += 8U; + } + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_TIMEOUT; + } + } + + /* Send stop transmission command in case of multiblock write */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) + { + /* Send stop transmission command */ + errorstate = SDMMC_CmdStopTransfer(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + } + + /* Get error state */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR)) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + hmmc->State = HAL_MMC_STATE_READY; + + return HAL_OK; + } + else + { + hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY; + return HAL_ERROR; + } +} + +/** + * @brief Reads block(s) from a specified address in a card. The Data transfer + * is managed in interrupt mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @note You could also check the IT transfer process through the MMC Rx + * interrupt event. + * @param hmmc: Pointer to MMC handle + * @param pData: Pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read + * @param NumberOfBlocks: Number of blocks to read. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + + hmmc->pRxBuffPtr = (uint32_t *)pData; + hmmc->RxXferSize = BLOCKSIZE * NumberOfBlocks; + + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF)); + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Read Blocks in IT mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_IT); + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_IT); + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Writes block(s) to a specified address in a card. The Data transfer + * is managed in interrupt mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @note You could also check the IT transfer process through the MMC Tx + * interrupt event. + * @param hmmc: Pointer to MMC handle + * @param pData: Pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written + * @param NumberOfBlocks: Number of blocks to write + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + + hmmc->pTxBuffPtr = (uint32_t *)pData; + hmmc->TxXferSize = BLOCKSIZE * NumberOfBlocks; + + /* Enable transfer interrupts */ + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE)); + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK| MMC_CONTEXT_IT); + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_IT); + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Reads block(s) from a specified address in a card. The Data transfer + * is managed by DMA mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @note You could also check the DMA transfer process through the MMC Rx + * interrupt event. + * @param hmmc: Pointer MMC handle + * @param pData: Pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read + * @param NumberOfBlocks: Number of blocks to read. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + +#ifdef SDIO_STA_STBITER + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR)); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND)); +#endif /* SDIO_STA_STBITERR */ + + /* Set the DMA transfer complete callback */ + hmmc->hdmarx->XferCpltCallback = MMC_DMAReceiveCplt; + + /* Set the DMA error callback */ + hmmc->hdmarx->XferErrorCallback = MMC_DMAError; + + /* Set the DMA Abort callback */ + hmmc->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA Channel */ + HAL_DMA_Start_IT(hmmc->hdmarx, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4); + + /* Enable MMC DMA transfer */ + __HAL_MMC_DMA_ENABLE(hmmc); + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Read Blocks in DMA mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA); + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_DMA); + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Writes block(s) to a specified address in a card. The Data transfer + * is managed by DMA mode. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @note You could also check the DMA transfer process through the MMC Tx + * interrupt event. + * @param hmmc: Pointer to MMC handle + * @param pData: Pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written + * @param NumberOfBlocks: Number of blocks to write + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(NULL == pData) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Initialize data control register */ + hmmc->Instance->DCTRL = 0U; + + /* Enable MMC Error interrupts */ +#ifdef SDIO_STA_STBITER + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR)); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR)); +#endif /* SDIO_STA_STBITERR */ + + /* Set the DMA transfer complete callback */ + hmmc->hdmatx->XferCpltCallback = MMC_DMATransmitCplt; + + /* Set the DMA error callback */ + hmmc->hdmatx->XferErrorCallback = MMC_DMAError; + + /* Set the DMA Abort callback */ + hmmc->hdmatx->XferAbortCallback = NULL; + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hmmc->Instance, BLOCKSIZE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_DMA); + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, BlockAdd); + } + else + { + hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_DMA); + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, BlockAdd); + } + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Enable SDIO DMA transfer */ + __HAL_MMC_DMA_ENABLE(hmmc); + + /* Enable the DMA Channel */ + HAL_DMA_Start_IT(hmmc->hdmatx, (uint32_t)pData, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4); + + /* Configure the MMC DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hmmc->Instance, &config); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Erases the specified memory area of the given MMC card. + * @note This API should be followed by a check on the card state through + * HAL_MMC_GetCardState(). + * @param hmmc: Pointer to MMC handle + * @param BlockStartAdd: Start Block address + * @param BlockEndAdd: End Block address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd) +{ + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(hmmc->State == HAL_MMC_STATE_READY) + { + hmmc->ErrorCode = HAL_DMA_ERROR_NONE; + + if(BlockEndAdd < BlockStartAdd) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + return HAL_ERROR; + } + + if(BlockEndAdd > (hmmc->MmcCard.LogBlockNbr)) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Check if the card command class supports erase command */ + if((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE == 0U) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + if((SDIO_GetResponse(hmmc->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Check the Card capacity in term of Logical number of blocks */ + if ((hmmc->MmcCard.LogBlockNbr) < CAPACITY) + { + BlockStartAdd *= 512U; + BlockEndAdd *= 512U; + } + + /* Send CMD35 MMC_ERASE_GRP_START with argument as addr */ + errorstate = SDMMC_CmdEraseStartAdd(hmmc->Instance, BlockStartAdd); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Send CMD36 MMC_ERASE_GRP_END with argument as addr */ + errorstate = SDMMC_CmdEraseEndAdd(hmmc->Instance, BlockEndAdd); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + /* Send CMD38 ERASE */ + errorstate = SDMMC_CmdErase(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS); + hmmc->ErrorCode |= errorstate; + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + + hmmc->State = HAL_MMC_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief This function handles MMC card interrupt request. + * @param hmmc: Pointer to MMC handle + * @retval None + */ +void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc) +{ + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + /* Check for SDIO interrupt flags */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DATAEND) != RESET) + { + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_DATAEND); + +#ifdef SDIO_STA_STBITERR + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_STBITERR); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR); +#endif + + if((hmmc->Context & MMC_CONTEXT_IT) != RESET) + { + if(((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != RESET) || ((hmmc->Context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET)) + { + errorstate = SDMMC_CmdStopTransfer(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + HAL_MMC_ErrorCallback(hmmc); + } + } + + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + hmmc->State = HAL_MMC_STATE_READY; + if(((hmmc->Context & MMC_CONTEXT_READ_SINGLE_BLOCK) != RESET) || ((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != RESET)) + { + HAL_MMC_RxCpltCallback(hmmc); + } + else + { + HAL_MMC_TxCpltCallback(hmmc); + } + } + else if((hmmc->Context & MMC_CONTEXT_DMA) != RESET) + { + if((hmmc->Context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET) + { + errorstate = SDMMC_CmdStopTransfer(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + HAL_MMC_ErrorCallback(hmmc); + } + } + if(((hmmc->Context & MMC_CONTEXT_READ_SINGLE_BLOCK) == RESET) && ((hmmc->Context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) == RESET)) + { + /* Disable the DMA transfer for transmit request by setting the DMAEN bit + in the MMC DCTRL register */ + hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + hmmc->State = HAL_MMC_STATE_READY; + + HAL_MMC_TxCpltCallback(hmmc); + } + } + } + + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXFIFOHE) != RESET) + { + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_TXFIFOHE); + + MMC_Write_IT(hmmc); + } + + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXFIFOHF) != RESET) + { + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_RXFIFOHF); + + MMC_Read_IT(hmmc); + } + +#ifdef SDIO_STA_STBITERR + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR) != RESET) + { + /* Set Error code */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DTIMEOUT) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXOVERR) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXUNDERR) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_STBITERR) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT; + } + + /* Clear All flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS | SDIO_FLAG_STBITERR); + + /* Disable all interrupts */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR |SDIO_IT_STBITERR); + + if((hmmc->Context & MMC_CONTEXT_DMA) != RESET) + { + /* Abort the MMC DMA Streams */ + if(hmmc->hdmatx != NULL) + { + /* Set the DMA Tx abort callback */ + hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK) + { + MMC_DMATxAbort(hmmc->hdmatx); + } + } + else if(hmmc->hdmarx != NULL) + { + /* Set the DMA Rx abort callback */ + hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK) + { + MMC_DMARxAbort(hmmc->hdmarx); + } + } + else + { + hmmc->ErrorCode = HAL_MMC_ERROR_NONE; + hmmc->State = HAL_MMC_STATE_READY; + HAL_MMC_AbortCallback(hmmc); + } + } + else if((hmmc->Context & MMC_CONTEXT_IT) != RESET) + { + /* Set the MMC state to ready to be able to start again the process */ + hmmc->State = HAL_MMC_STATE_READY; + HAL_MMC_ErrorCallback(hmmc); + } + } +#else /* SDIO_STA_STBITERR not defined */ + else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR) != RESET) + { + /* Set Error code */ + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DCRCFAIL) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_DTIMEOUT) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_RXOVERR) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN; + } + if(__HAL_MMC_GET_FLAG(hmmc, SDIO_IT_TXUNDERR) != RESET) + { + hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN; + } + + /* Clear All flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + /* Disable all interrupts */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); + + if((hmmc->Context & MMC_CONTEXT_DMA) != RESET) + { + /* Abort the MMC DMA Streams */ + if(hmmc->hdmatx != NULL) + { + /* Set the DMA Tx abort callback */ + hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK) + { + MMC_DMATxAbort(hmmc->hdmatx); + } + } + else if(hmmc->hdmarx != NULL) + { + /* Set the DMA Rx abort callback */ + hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK) + { + MMC_DMARxAbort(hmmc->hdmarx); + } + } + else + { + hmmc->ErrorCode = HAL_MMC_ERROR_NONE; + hmmc->State = HAL_MMC_STATE_READY; + HAL_MMC_AbortCallback(hmmc); + } + } + else if((hmmc->Context & MMC_CONTEXT_IT) != RESET) + { + /* Set the MMC state to ready to be able to start again the process */ + hmmc->State = HAL_MMC_STATE_READY; + HAL_MMC_ErrorCallback(hmmc); + } + } +#endif /* SDIO_STA_STBITERR */ +} + +/** + * @brief return the MMC state + * @param hmmc: Pointer to mmc handle + * @retval HAL state + */ +HAL_MMC_StateTypeDef HAL_MMC_GetState(MMC_HandleTypeDef *hmmc) +{ + return hmmc->State; +} + +/** +* @brief Return the MMC error code +* @param hmmc : Pointer to a MMC_HandleTypeDef structure that contains + * the configuration information. +* @retval MMC Error Code +*/ +uint32_t HAL_MMC_GetError(MMC_HandleTypeDef *hmmc) +{ + return hmmc->ErrorCode; +} + +/** + * @brief Tx Transfer completed callbacks + * @param hmmc: Pointer to MMC handle + * @retval None + */ + __weak void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MMC_TxCpltCallback can be implemented in the user file + */ +} + +/** + * @brief Rx Transfer completed callbacks + * @param hmmc: Pointer MMC handle + * @retval None + */ +__weak void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MMC_RxCpltCallback can be implemented in the user file + */ +} + +/** + * @brief MMC error callbacks + * @param hmmc: Pointer MMC handle + * @retval None + */ +__weak void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MMC_ErrorCallback can be implemented in the user file + */ +} + +/** + * @brief MMC Abort callbacks + * @param hmmc: Pointer MMC handle + * @retval None + */ +__weak void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hmmc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MMC_ErrorCallback can be implemented in the user file + */ +} + + +/** + * @} + */ + +/** @addtogroup MMC_Exported_Functions_Group3 + * @brief management functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the MMC card + operations and get the related information + +@endverbatim + * @{ + */ + +/** + * @brief Returns information the information of the card which are stored on + * the CID register. + * @param hmmc: Pointer to MMC handle + * @param pCID: Pointer to a HAL_MMC_CIDTypedef structure that + * contains all CID register parameters + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_GetCardCID(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID) +{ + uint32_t tmp = 0U; + + /* Byte 0 */ + tmp = (uint8_t)((hmmc->CID[0U] & 0xFF000000U) >> 24U); + pCID->ManufacturerID = tmp; + + /* Byte 1 */ + tmp = (uint8_t)((hmmc->CID[0U] & 0x00FF0000U) >> 16U); + pCID->OEM_AppliID = tmp << 8U; + + /* Byte 2 */ + tmp = (uint8_t)((hmmc->CID[0U] & 0x000000FF00U) >> 8U); + pCID->OEM_AppliID |= tmp; + + /* Byte 3 */ + tmp = (uint8_t)(hmmc->CID[0U] & 0x000000FFU); + pCID->ProdName1 = tmp << 24U; + + /* Byte 4 */ + tmp = (uint8_t)((hmmc->CID[1U] & 0xFF000000U) >> 24U); + pCID->ProdName1 |= tmp << 16U; + + /* Byte 5 */ + tmp = (uint8_t)((hmmc->CID[1U] & 0x00FF0000U) >> 16U); + pCID->ProdName1 |= tmp << 8U; + + /* Byte 6 */ + tmp = (uint8_t)((hmmc->CID[1U] & 0x0000FF00U) >> 8U); + pCID->ProdName1 |= tmp; + + /* Byte 7 */ + tmp = (uint8_t)(hmmc->CID[1U] & 0x000000FFU); + pCID->ProdName2 = tmp; + + /* Byte 8 */ + tmp = (uint8_t)((hmmc->CID[2U] & 0xFF000000U) >> 24U); + pCID->ProdRev = tmp; + + /* Byte 9 */ + tmp = (uint8_t)((hmmc->CID[2U] & 0x00FF0000U) >> 16U); + pCID->ProdSN = tmp << 24U; + + /* Byte 10 */ + tmp = (uint8_t)((hmmc->CID[2U] & 0x0000FF00U) >> 8U); + pCID->ProdSN |= tmp << 16U; + + /* Byte 11 */ + tmp = (uint8_t)(hmmc->CID[2U] & 0x000000FFU); + pCID->ProdSN |= tmp << 8U; + + /* Byte 12 */ + tmp = (uint8_t)((hmmc->CID[3U] & 0xFF000000U) >> 24U); + pCID->ProdSN |= tmp; + + /* Byte 13 */ + tmp = (uint8_t)((hmmc->CID[3U] & 0x00FF0000U) >> 16U); + pCID->Reserved1 |= (tmp & 0xF0U) >> 4U; + pCID->ManufactDate = (tmp & 0x0FU) << 8U; + + /* Byte 14 */ + tmp = (uint8_t)((hmmc->CID[3U] & 0x0000FF00U) >> 8U); + pCID->ManufactDate |= tmp; + + /* Byte 15 */ + tmp = (uint8_t)(hmmc->CID[3U] & 0x000000FFU); + pCID->CID_CRC = (tmp & 0xFEU) >> 1U; + pCID->Reserved2 = 1U; + + return HAL_OK; +} + +/** + * @brief Returns information the information of the card which are stored on + * the CSD register. + * @param hmmc: Pointer to MMC handle + * @param pCSD: Pointer to a HAL_MMC_CardInfoTypeDef structure that + * contains all CSD register parameters + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD) +{ + uint32_t tmp = 0U; + + /* Byte 0 */ + tmp = (hmmc->CSD[0U] & 0xFF000000U) >> 24U; + pCSD->CSDStruct = (uint8_t)((tmp & 0xC0U) >> 6U); + pCSD->SysSpecVersion = (uint8_t)((tmp & 0x3CU) >> 2U); + pCSD->Reserved1 = tmp & 0x03U; + + /* Byte 1 */ + tmp = (hmmc->CSD[0U] & 0x00FF0000U) >> 16U; + pCSD->TAAC = (uint8_t)tmp; + + /* Byte 2 */ + tmp = (hmmc->CSD[0U] & 0x0000FF00U) >> 8U; + pCSD->NSAC = (uint8_t)tmp; + + /* Byte 3 */ + tmp = hmmc->CSD[0U] & 0x000000FFU; + pCSD->MaxBusClkFrec = (uint8_t)tmp; + + /* Byte 4 */ + tmp = (hmmc->CSD[1U] & 0xFF000000U) >> 24U; + pCSD->CardComdClasses = (uint16_t)(tmp << 4U); + + /* Byte 5 */ + tmp = (hmmc->CSD[1U] & 0x00FF0000U) >> 16U; + pCSD->CardComdClasses |= (uint16_t)((tmp & 0xF0U) >> 4U); + pCSD->RdBlockLen = (uint8_t)(tmp & 0x0FU); + + /* Byte 6 */ + tmp = (hmmc->CSD[1U] & 0x0000FF00U) >> 8U; + pCSD->PartBlockRead = (uint8_t)((tmp & 0x80U) >> 7U); + pCSD->WrBlockMisalign = (uint8_t)((tmp & 0x40U) >> 6U); + pCSD->RdBlockMisalign = (uint8_t)((tmp & 0x20U) >> 5U); + pCSD->DSRImpl = (uint8_t)((tmp & 0x10U) >> 4U); + pCSD->Reserved2 = 0; /*!< Reserved */ + + pCSD->DeviceSize = (tmp & 0x03U) << 10U; + + /* Byte 7 */ + tmp = (uint8_t)(hmmc->CSD[1U] & 0x000000FFU); + pCSD->DeviceSize |= (tmp) << 2U; + + /* Byte 8 */ + tmp = (uint8_t)((hmmc->CSD[2U] & 0xFF000000U) >> 24U); + pCSD->DeviceSize |= (tmp & 0xC0U) >> 6U; + + pCSD->MaxRdCurrentVDDMin = (tmp & 0x38U) >> 3U; + pCSD->MaxRdCurrentVDDMax = (tmp & 0x07U); + + /* Byte 9 */ + tmp = (uint8_t)((hmmc->CSD[2U] & 0x00FF0000U) >> 16U); + pCSD->MaxWrCurrentVDDMin = (tmp & 0xE0U) >> 5U; + pCSD->MaxWrCurrentVDDMax = (tmp & 0x1CU) >> 2U; + pCSD->DeviceSizeMul = (tmp & 0x03U) << 1U; + /* Byte 10 */ + tmp = (uint8_t)((hmmc->CSD[2] & 0x0000FF00U) >> 8U); + pCSD->DeviceSizeMul |= (tmp & 0x80U) >> 7U; + + hmmc->MmcCard.BlockNbr = (pCSD->DeviceSize + 1U) ; + hmmc->MmcCard.BlockNbr *= (1U << (pCSD->DeviceSizeMul + 2U)); + hmmc->MmcCard.BlockSize = 1U << (pCSD->RdBlockLen); + + hmmc->MmcCard.LogBlockNbr = (hmmc->MmcCard.BlockNbr) * ((hmmc->MmcCard.BlockSize) / 512U); + hmmc->MmcCard.LogBlockSize = 512U; + + pCSD->EraseGrSize = (tmp & 0x40U) >> 6U; + pCSD->EraseGrMul = (tmp & 0x3FU) << 1U; + + /* Byte 11 */ + tmp = (uint8_t)(hmmc->CSD[2U] & 0x000000FFU); + pCSD->EraseGrMul |= (tmp & 0x80U) >> 7U; + pCSD->WrProtectGrSize = (tmp & 0x7FU); + + /* Byte 12 */ + tmp = (uint8_t)((hmmc->CSD[3U] & 0xFF000000U) >> 24U); + pCSD->WrProtectGrEnable = (tmp & 0x80U) >> 7U; + pCSD->ManDeflECC = (tmp & 0x60U) >> 5U; + pCSD->WrSpeedFact = (tmp & 0x1CU) >> 2U; + pCSD->MaxWrBlockLen = (tmp & 0x03U) << 2U; + + /* Byte 13 */ + tmp = (uint8_t)((hmmc->CSD[3U] & 0x00FF0000U) >> 16U); + pCSD->MaxWrBlockLen |= (tmp & 0xC0U) >> 6U; + pCSD->WriteBlockPaPartial = (tmp & 0x20U) >> 5U; + pCSD->Reserved3 = 0U; + pCSD->ContentProtectAppli = (tmp & 0x01U); + + /* Byte 14 */ + tmp = (uint8_t)((hmmc->CSD[3U] & 0x0000FF00U) >> 8U); + pCSD->FileFormatGrouop = (tmp & 0x80U) >> 7U; + pCSD->CopyFlag = (tmp & 0x40U) >> 6U; + pCSD->PermWrProtect = (tmp & 0x20U) >> 5U; + pCSD->TempWrProtect = (tmp & 0x10U) >> 4U; + pCSD->FileFormat = (tmp & 0x0CU) >> 2U; + pCSD->ECC = (tmp & 0x03U); + + /* Byte 15 */ + tmp = (uint8_t)(hmmc->CSD[3U] & 0x000000FFU); + pCSD->CSD_CRC = (tmp & 0xFEU) >> 1U; + pCSD->Reserved4 = 1U; + + return HAL_OK; +} + +/** + * @brief Gets the MMC card info. + * @param hmmc: Pointer to MMC handle + * @param pCardInfo: Pointer to the HAL_MMC_CardInfoTypeDef structure that + * will contain the MMC card status information + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_GetCardInfo(MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo) +{ + pCardInfo->CardType = (uint32_t)(hmmc->MmcCard.CardType); + pCardInfo->Class = (uint32_t)(hmmc->MmcCard.Class); + pCardInfo->RelCardAdd = (uint32_t)(hmmc->MmcCard.RelCardAdd); + pCardInfo->BlockNbr = (uint32_t)(hmmc->MmcCard.BlockNbr); + pCardInfo->BlockSize = (uint32_t)(hmmc->MmcCard.BlockSize); + pCardInfo->LogBlockNbr = (uint32_t)(hmmc->MmcCard.LogBlockNbr); + pCardInfo->LogBlockSize = (uint32_t)(hmmc->MmcCard.LogBlockSize); + + return HAL_OK; +} + +/** + * @brief Enables wide bus operation for the requested card if supported by + * card. + * @param hmmc: Pointer to MMC handle + * @param WideMode: Specifies the MMC card wide bus mode + * This parameter can be one of the following values: + * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer + * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer + * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode) +{ + __IO uint32_t count = 0U; + SDIO_InitTypeDef Init; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + uint32_t response = 0U, busy = 0U; + + /* Check the parameters */ + assert_param(IS_SDIO_BUS_WIDE(WideMode)); + + /* Chnage Satte */ + hmmc->State = HAL_MMC_STATE_BUSY; + + /* Update Clock for Bus mode update */ + Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + Init.BusWide = WideMode; + Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + Init.ClockDiv = SDIO_INIT_CLK_DIV; + /* Initialize SDIO*/ + SDIO_Init(hmmc->Instance, Init); + + if(WideMode == SDIO_BUS_WIDE_8B) + { + errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70200U); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + } + } + else if(WideMode == SDIO_BUS_WIDE_4B) + { + errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70100U); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + } + } + else if(WideMode == SDIO_BUS_WIDE_1B) + { + errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70000U); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + } + } + else + { + /* WideMode is not a valid argument*/ + hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM; + } + + /* Check for switch error and violation of the trial number of sending CMD 13 */ + while(busy == 0U) + { + if(count++ == SDMMC_MAX_TRIAL) + { + hmmc->State = HAL_MMC_STATE_READY; + hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE; + return HAL_ERROR; + } + + /* While card is not ready for data and trial number for sending CMD13 is not exceeded */ + errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U)); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + } + + /* Get command response */ + response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + + /* Get operating voltage*/ + busy = (((response >> 7U) == 1U) ? 0U : 1U); + } + + /* While card is not ready for data and trial number for sending CMD13 is not exceeded */ + count = SDMMC_DATATIMEOUT; + while((response & 0x00000100U) == 0U) + { + if(count-- == 0U) + { + hmmc->State = HAL_MMC_STATE_READY; + hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE; + return HAL_ERROR; + } + + /* While card is not ready for data and trial number for sending CMD13 is not exceeded */ + errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U)); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + } + + /* Get command response */ + response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + } + + if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + hmmc->State = HAL_MMC_STATE_READY; + return HAL_ERROR; + } + else + { + /* Configure the SDIO peripheral */ + Init.ClockEdge = hmmc->Init.ClockEdge; + Init.ClockBypass = hmmc->Init.ClockBypass; + Init.ClockPowerSave = hmmc->Init.ClockPowerSave; + Init.BusWide = WideMode; + Init.HardwareFlowControl = hmmc->Init.HardwareFlowControl; + Init.ClockDiv = hmmc->Init.ClockDiv; + SDIO_Init(hmmc->Instance, Init); + } + + /* Change State */ + hmmc->State = HAL_MMC_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief Gets the current mmc card data state. + * @param hmmc: pointer to MMC handle + * @retval Card state + */ +HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc) +{ + HAL_MMC_CardStateTypeDef cardstate = HAL_MMC_CARD_TRANSFER; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + uint32_t resp1 = 0U; + + errorstate = MMC_SendStatus(hmmc, &resp1); + if(errorstate != HAL_OK) + { + hmmc->ErrorCode |= errorstate; + } + + cardstate = (HAL_MMC_CardStateTypeDef)((resp1 >> 9U) & 0x0FU); + + return cardstate; +} + +/** + * @brief Abort the current transfer and disable the MMC. + * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains + * the configuration information for MMC module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_Abort(MMC_HandleTypeDef *hmmc) +{ + HAL_MMC_CardStateTypeDef CardState; + + /* DIsable All interrupts */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); + + /* Clear All flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL)) + { + /* Disable the MMC DMA request */ + hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + /* Abort the MMC DMA Tx Stream */ + if(hmmc->hdmatx != NULL) + { + HAL_DMA_Abort(hmmc->hdmatx); + } + /* Abort the MMC DMA Rx Stream */ + if(hmmc->hdmarx != NULL) + { + HAL_DMA_Abort(hmmc->hdmarx); + } + } + + hmmc->State = HAL_MMC_STATE_READY; + CardState = HAL_MMC_GetCardState(hmmc); + if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING)) + { + hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance); + } + if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE) + { + return HAL_ERROR; + } + return HAL_OK; +} + +/** + * @brief Abort the current transfer and disable the MMC (IT mode). + * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains + * the configuration information for MMC module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MMC_Abort_IT(MMC_HandleTypeDef *hmmc) +{ + HAL_MMC_CardStateTypeDef CardState; + + /* DIsable All interrupts */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); + + /* Clear All flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL)) + { + /* Disable the MMC DMA request */ + hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + /* Abort the MMC DMA Tx Stream */ + if(hmmc->hdmatx != NULL) + { + hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort; + if(HAL_DMA_Abort_IT(hmmc->hdmatx) != HAL_OK) + { + hmmc->hdmatx = NULL; + } + } + /* Abort the MMC DMA Rx Stream */ + if(hmmc->hdmarx != NULL) + { + hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort; + if(HAL_DMA_Abort_IT(hmmc->hdmarx) != HAL_OK) + { + hmmc->hdmarx = NULL; + } + } + } + + /* No transfer ongoing on both DMA channels*/ + if((hmmc->hdmatx == NULL) && (hmmc->hdmarx == NULL)) + { + CardState = HAL_MMC_GetCardState(hmmc); + hmmc->State = HAL_MMC_STATE_READY; + if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING)) + { + hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance); + } + if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE) + { + return HAL_ERROR; + } + else + { + HAL_MMC_AbortCallback(hmmc); + } + } + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private function ----------------------------------------------------------*/ +/** @addtogroup MMC_Private_Functions + * @{ + */ + +/** + * @brief DMA MMC transmit process complete callback + * @param hdma: DMA handle + * @retval None + */ +static void MMC_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent); + + /* Enable DATAEND Interrupt */ + __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DATAEND)); +} + +/** + * @brief DMA MMC receive process complete callback + * @param hdma: DMA handle + * @retval None + */ +static void MMC_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent); + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + /* Send stop command in multiblock write */ + if(hmmc->Context == (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA)) + { + errorstate = SDMMC_CmdStopTransfer(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + hmmc->ErrorCode |= errorstate; + HAL_MMC_ErrorCallback(hmmc); + } + } + + /* Disable the DMA transfer for transmit request by setting the DMAEN bit + in the MMC DCTRL register */ + hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + /* Clear all the static flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + hmmc->State = HAL_MMC_STATE_READY; + + HAL_MMC_RxCpltCallback(hmmc); +} + +/** + * @brief DMA MMC communication error callback + * @param hdma: DMA handle + * @retval None + */ +static void MMC_DMAError(DMA_HandleTypeDef *hdma) +{ + MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent); + HAL_MMC_CardStateTypeDef CardState; + + if((hmmc->hdmarx->ErrorCode == HAL_DMA_ERROR_TE) || (hmmc->hdmatx->ErrorCode == HAL_DMA_ERROR_TE)) + { + /* Clear All flags */ + __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS); + + /* Disable All interrupts */ + __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); + + hmmc->ErrorCode |= HAL_MMC_ERROR_DMA; + CardState = HAL_MMC_GetCardState(hmmc); + if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING)) + { + hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance); + } + + hmmc->State= HAL_MMC_STATE_READY; + } + + HAL_MMC_ErrorCallback(hmmc); +} + +/** + * @brief DMA MMC Tx Abort callback + * @param hdma: DMA handle + * @retval None + */ +static void MMC_DMATxAbort(DMA_HandleTypeDef *hdma) +{ + MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent); + HAL_MMC_CardStateTypeDef CardState; + + if(hmmc->hdmatx != NULL) + { + hmmc->hdmatx = NULL; + } + + /* All DMA channels are aborted */ + if(hmmc->hdmarx == NULL) + { + CardState = HAL_MMC_GetCardState(hmmc); + hmmc->ErrorCode = HAL_MMC_ERROR_NONE; + hmmc->State = HAL_MMC_STATE_READY; + if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING)) + { + hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance); + + if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE) + { + HAL_MMC_AbortCallback(hmmc); + } + else + { + HAL_MMC_ErrorCallback(hmmc); + } + } + } +} + +/** + * @brief DMA MMC Rx Abort callback + * @param hdma: DMA handle + * @retval None + */ +static void MMC_DMARxAbort(DMA_HandleTypeDef *hdma) +{ + MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->Parent); + HAL_MMC_CardStateTypeDef CardState; + + if(hmmc->hdmarx != NULL) + { + hmmc->hdmarx = NULL; + } + + /* All DMA channels are aborted */ + if(hmmc->hdmatx == NULL) + { + CardState = HAL_MMC_GetCardState(hmmc); + hmmc->ErrorCode = HAL_MMC_ERROR_NONE; + hmmc->State = HAL_MMC_STATE_READY; + if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING)) + { + hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance); + + if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE) + { + HAL_MMC_AbortCallback(hmmc); + } + else + { + HAL_MMC_ErrorCallback(hmmc); + } + } + } +} + + +/** + * @brief Initializes the mmc card. + * @param hmmc: Pointer to MMC handle + * @retval MMC Card error state + */ +static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc) +{ + HAL_MMC_CardCSDTypeDef CSD; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + uint16_t mmc_rca = 1; + + /* Check the power State */ + if(SDIO_GetPowerState(hmmc->Instance) == 0U) + { + /* Power off */ + return HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE; + } + + /* Send CMD2 ALL_SEND_CID */ + errorstate = SDMMC_CmdSendCID(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return errorstate; + } + else + { + /* Get Card identification number data */ + hmmc->CID[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + hmmc->CID[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2); + hmmc->CID[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3); + hmmc->CID[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4); + } + + /* Send CMD3 SET_REL_ADDR with argument 0 */ + /* MMC Card publishes its RCA. */ + errorstate = SDMMC_CmdSetRelAdd(hmmc->Instance, &mmc_rca); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return errorstate; + } + + /* Get the MMC card RCA */ + hmmc->MmcCard.RelCardAdd = mmc_rca; + + /* Send CMD9 SEND_CSD with argument as card's RCA */ + errorstate = SDMMC_CmdSendCSD(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U)); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return errorstate; + } + else + { + /* Get Card Specific Data */ + hmmc->CSD[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + hmmc->CSD[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2); + hmmc->CSD[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3); + hmmc->CSD[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4); + } + + /* Get the Card Class */ + hmmc->MmcCard.Class = (SDIO_GetResponse(hmmc->Instance, SDIO_RESP2) >> 20U); + + /* Get CSD parameters */ + HAL_MMC_GetCardCSD(hmmc, &CSD); + + /* Select the Card */ + errorstate = SDMMC_CmdSelDesel(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U)); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return errorstate; + } + + /* Configure SDIO peripheral interface */ + SDIO_Init(hmmc->Instance, hmmc->Init); + + /* All cards are initialized */ + return HAL_MMC_ERROR_NONE; +} + +/** + * @brief Enquires cards about their operating voltage and configures clock + * controls and stores MMC information that will be needed in future + * in the MMC handle. + * @param hmmc: Pointer to MMC handle + * @retval error state + */ +static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc) +{ + __IO uint32_t count = 0U; + uint32_t response = 0U, validvoltage = 0U; + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + /* CMD0: GO_IDLE_STATE */ + errorstate = SDMMC_CmdGoIdleState(hmmc->Instance); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return errorstate; + } + + while(validvoltage == 0U) + { + if(count++ == SDMMC_MAX_VOLT_TRIAL) + { + return HAL_MMC_ERROR_INVALID_VOLTRANGE; + } + + /* SEND CMD1 APP_CMD with MMC_HIGH_VOLTAGE_RANGE(0xC0FF8000) as argument */ + errorstate = SDMMC_CmdOpCondition(hmmc->Instance, eMMC_HIGH_VOLTAGE_RANGE); + if(errorstate != HAL_MMC_ERROR_NONE) + { + return HAL_MMC_ERROR_UNSUPPORTED_FEATURE; + } + + /* Get command response */ + response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + + /* Get operating voltage*/ + validvoltage = (((response >> 31U) == 1U) ? 1U : 0U); + } + + /* When power routine is finished and command returns valid voltage */ + if ((response & eMMC_HIGH_VOLTAGE_RANGE) == MMC_HIGH_VOLTAGE_RANGE) + { + /* When voltage range of the card is within 2.7V and 3.6V */ + hmmc->MmcCard.CardType = MMC_HIGH_VOLTAGE_CARD; + } + else + { + /* When voltage range of the card is within 1.65V and 1.95V or 2.7V and 3.6V */ + hmmc->MmcCard.CardType = MMC_DUAL_VOLTAGE_CARD; + } + + return HAL_MMC_ERROR_NONE; +} + +/** + * @brief Turns the SDIO output signals off. + * @param hmmc: Pointer to MMC handle + * @retval HAL status + */ +static HAL_StatusTypeDef MMC_PowerOFF(MMC_HandleTypeDef *hmmc) +{ + /* Set Power State to OFF */ + SDIO_PowerState_OFF(hmmc->Instance); + + return HAL_OK; +} + +/** + * @brief Returns the current card's status. + * @param hmmc: Pointer to MMC handle + * @param pCardStatus: pointer to the buffer that will contain the MMC card + * status (Card Status register) + * @retval error state + */ +static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus) +{ + uint32_t errorstate = HAL_MMC_ERROR_NONE; + + if(pCardStatus == NULL) + { + return HAL_MMC_ERROR_PARAM; + } + + /* Send Status command */ + errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U)); + if(errorstate != HAL_OK) + { + return errorstate; + } + + /* Get MMC card status */ + *pCardStatus = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1); + + return HAL_MMC_ERROR_NONE; +} + +/** + * @brief Wrap up reading in non-blocking mode. + * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains + * the configuration information. + * @retval HAL status + */ +static HAL_StatusTypeDef MMC_Read_IT(MMC_HandleTypeDef *hmmc) +{ + uint32_t count = 0U; + uint32_t* tmp; + + tmp = (uint32_t*)hmmc->pRxBuffPtr; + + /* Read data from SDMMC Rx FIFO */ + for(count = 0U; count < 8U; count++) + { + *(tmp + count) = SDIO_ReadFIFO(hmmc->Instance); + } + + hmmc->pRxBuffPtr += 8U; + + return HAL_OK; +} + +/** + * @brief Wrap up writing in non-blocking mode. + * @param hmmc: pointer to a MMC_HandleTypeDef structure that contains + * the configuration information. + * @retval HAL status + */ +static HAL_StatusTypeDef MMC_Write_IT(MMC_HandleTypeDef *hmmc) +{ + uint32_t count = 0U; + uint32_t* tmp; + + tmp = (uint32_t*)hmmc->pTxBuffPtr; + + /* Write data to SDMMC Tx FIFO */ + for(count = 0U; count < 8U; count++) + { + SDIO_WriteFIFO(hmmc->Instance, (tmp + count)); + } + + hmmc->pTxBuffPtr += 8U; + + return HAL_OK; +} + +/** + * @} + */ + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#endif /* HAL_MMC_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.c index 9d33119..4a912e0 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_msp_template.c @@ -2,15 +2,15 @@ ****************************************************************************** * @file stm32f4xx_hal_msp_template.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file contains the HAL System and Peripheral (PPP) MSP initialization * and de-initialization functions. * It should be copied to the application folder and renamed into 'stm32f4xx_hal_msp.c'. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c index 0611767..059a579 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_nand.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief NAND HAL module driver. * This file provides a generic firmware to drive NAND memories mounted * as external device. @@ -25,7 +25,10 @@ structure declared by the function caller. (+) Access NAND flash memory by read/write operations using the functions - HAL_NAND_Read_Page()/HAL_NAND_Read_SpareArea(), HAL_NAND_Write_Page()/HAL_NAND_Write_SpareArea() + HAL_NAND_Read_Page_8b()/HAL_NAND_Read_SpareArea_8b(), + HAL_NAND_Write_Page_8b()/HAL_NAND_Write_SpareArea_8b(), + HAL_NAND_Read_Page_16b()/HAL_NAND_Read_SpareArea_16b(), + HAL_NAND_Write_Page_16b()/HAL_NAND_Write_SpareArea_16b() to read/write page(s)/spare area(s). These functions use specific device information (Block, page size..) predefined by the user in the HAL_NAND_Info_TypeDef structure. The read/write address information is contained by the Nand_Address_Typedef @@ -55,7 +58,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -283,8 +286,7 @@ void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand) /* Clear NAND interrupt FIFO empty pending bit */ __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT); - } - + } } /** @@ -331,6 +333,7 @@ __weak void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand) HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID) { __IO uint32_t data = 0U; + __IO uint32_t data1 = 0U; uint32_t deviceaddress = 0U; /* Process Locked */ @@ -357,16 +360,34 @@ HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pN /* Send Read ID command sequence */ *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_READID; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + + /* Read the electronic signature from NAND flash */ +#ifdef FSMC_PCR2_PWID + if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8) +#else /* FMC_PCR2_PWID is defined */ + if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8) +#endif + { + data = *(__IO uint32_t *)deviceaddress; - /* Read the electronic signature from NAND flash */ - data = *(__IO uint32_t *)deviceaddress; - - /* Return the data read */ - pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); - pNAND_ID->Device_Id = ADDR_2ND_CYCLE(data); - pNAND_ID->Third_Id = ADDR_3RD_CYCLE(data); - pNAND_ID->Fourth_Id = ADDR_4TH_CYCLE(data); + /* Return the data read */ + pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); + pNAND_ID->Device_Id = ADDR_2ND_CYCLE(data); + pNAND_ID->Third_Id = ADDR_3RD_CYCLE(data); + pNAND_ID->Fourth_Id = ADDR_4TH_CYCLE(data); + } + else + { + data = *(__IO uint32_t *)deviceaddress; + data1 = *((__IO uint32_t *)deviceaddress + 4U); + + /* Return the data read */ + pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); + pNAND_ID->Device_Id = ADDR_3RD_CYCLE(data); + pNAND_ID->Third_Id = ADDR_1ST_CYCLE(data1); + pNAND_ID->Fourth_Id = ADDR_3RD_CYCLE(data1); + } /* Update the NAND controller state */ hnand->State = HAL_NAND_STATE_READY; @@ -410,7 +431,7 @@ HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand) hnand->State = HAL_NAND_STATE_BUSY; /* Send NAND reset command */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = 0xFFU; + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = 0xFF; /* Update the NAND controller state */ @@ -422,9 +443,29 @@ HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand) return HAL_OK; } + +/** + * @brief Configure the device: Enter the physical parameters of the device + * @param hnand: pointer to a NAND_HandleTypeDef structure that contains + * the configuration information for NAND module. + * @param pDeviceConfig : pointer to NAND_DeviceConfigTypeDef structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_NAND_ConfigDevice(NAND_HandleTypeDef *hnand, NAND_DeviceConfigTypeDef *pDeviceConfig) +{ + hnand->Config.PageSize = pDeviceConfig->PageSize; + hnand->Config.SpareAreaSize = pDeviceConfig->SpareAreaSize; + hnand->Config.BlockSize = pDeviceConfig->BlockSize; + hnand->Config.BlockNbr = pDeviceConfig->BlockNbr; + hnand->Config.PlaneSize = pDeviceConfig->PlaneSize; + hnand->Config.PlaneNbr = pDeviceConfig->PlaneNbr; + hnand->Config.ExtraCommandEnable = pDeviceConfig->ExtraCommandEnable; + + return HAL_OK; +} /** - * @brief Read Page(s) from NAND memory block + * @brief Read Page(s) from NAND memory block (8-bits addressing) * @param hnand: pointer to a NAND_HandleTypeDef structure that contains * the configuration information for NAND module. * @param pAddress : pointer to NAND address structure @@ -432,12 +473,11 @@ HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand) * @param NumPageToRead : number of pages to read from block * @retval HAL status */ -HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead) +HAL_StatusTypeDef HAL_NAND_Read_Page_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead) { __IO uint32_t index = 0U; - uint32_t deviceaddress = 0U, size = 0U, numpagesread = 0U, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numPagesRead = 0U, nandaddress = 0U; /* Process Locked */ __HAL_LOCK(hnand); @@ -461,36 +501,76 @@ HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressType /* Update the NAND controller state */ hnand->State = HAL_NAND_STATE_BUSY; - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); /* Page(s) read loop */ - while((NumPageToRead != 0U) && (addressstatus == NAND_VALID_ADDRESS)) - { + while((NumPageToRead != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) + { /* update the buffer size */ - size = hnand->Info.PageSize + ((hnand->Info.PageSize) * numpagesread); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); + size = (hnand->Config.PageSize) + ((hnand->Config.PageSize) * numPagesRead); /* Send read page command sequence */ *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024U) + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } } *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; + /* Check if an extra command is needed for reading pages */ + if(hnand->Config.ExtraCommandEnable == ENABLE) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Go back to read mode */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); + __DSB(); + } + /* Get Data into Buffer */ for(; index < size; index++) { @@ -498,13 +578,13 @@ HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressType } /* Increment read pages number */ - numpagesread++; + numPagesRead++; /* Decrement pages to read */ NumPageToRead--; /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); + nandaddress = (uint32_t)(nandaddress + 1U); } /* Update the NAND controller state */ @@ -514,11 +594,141 @@ HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressType __HAL_UNLOCK(hnand); return HAL_OK; +} +/** + * @brief Read Page(s) from NAND memory block (16-bits addressing) + * @param hnand: pointer to a NAND_HandleTypeDef structure that contains + * the configuration information for NAND module. + * @param pAddress : pointer to NAND address structure + * @param pBuffer : pointer to destination read buffer. pBuffer should be 16bits aligned + * @param NumPageToRead : number of pages to read from block + * @retval HAL status + */ +HAL_StatusTypeDef HAL_NAND_Read_Page_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumPageToRead) +{ + __IO uint32_t index = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numPagesRead = 0U, nandaddress = 0U; + + /* Process Locked */ + __HAL_LOCK(hnand); + + /* Check the NAND controller state */ + if(hnand->State == HAL_NAND_STATE_BUSY) + { + return HAL_BUSY; + } + + /* Identify the device address */ + if(hnand->Init.NandBank == FMC_NAND_BANK2) + { + deviceaddress = NAND_DEVICE1; + } + else + { + deviceaddress = NAND_DEVICE2; + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_BUSY; + + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Page(s) read loop */ + while((NumPageToRead != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) + { + /* update the buffer size */ + size = (hnand->Config.PageSize) + ((hnand->Config.PageSize) * numPagesRead); + + /* Send read page command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + __DSB(); + + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; + + if(hnand->Config.ExtraCommandEnable == ENABLE) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Go back to read mode */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); + } + + /* Get Data into Buffer */ + for(; index < size; index++) + { + *(uint16_t *)pBuffer++ = *(uint16_t *)deviceaddress; + } + + /* Increment read pages number */ + numPagesRead++; + + /* Decrement pages to read */ + NumPageToRead--; + + /* Increment the NAND address */ + nandaddress = (uint32_t)(nandaddress + 1U); + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hnand); + + return HAL_OK; } /** - * @brief Write Page(s) to NAND memory block + * @brief Write Page(s) to NAND memory block (8-bits addressing) * @param hnand: pointer to a NAND_HandleTypeDef structure that contains * the configuration information for NAND module. * @param pAddress : pointer to NAND address structure @@ -526,13 +736,11 @@ HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressType * @param NumPageToWrite : number of pages to write to block * @retval HAL status */ -HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite) +HAL_StatusTypeDef HAL_NAND_Write_Page_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite) { - __IO uint32_t index = 0U; + __IO uint32_t index = 0U; uint32_t tickstart = 0U; - uint32_t deviceaddress = 0U , size = 0U, numpageswritten = 0U, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0U; + uint32_t deviceaddress = 0U, size = 0U, numPagesWritten = 0U, nandaddress = 0U; /* Process Locked */ __HAL_LOCK(hnand); @@ -556,35 +764,58 @@ HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTyp /* Update the NAND controller state */ hnand->State = HAL_NAND_STATE_BUSY; - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); /* Page(s) write loop */ - while((NumPageToWrite != 0U) && (addressstatus == NAND_VALID_ADDRESS)) + while((NumPageToWrite != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) { /* update the buffer size */ - size = hnand->Info.PageSize + ((hnand->Info.PageSize) * numpageswritten); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); + size = hnand->Config.PageSize + ((hnand->Config.PageSize) * numPagesWritten); /* Send write page command sequence */ *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024U) + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + __DSB(); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + __DSB(); + } } + /* Write data to memory */ for(; index < size; index++) { @@ -593,12 +824,12 @@ HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTyp *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - /* Get tick */ - tickstart = HAL_GetTick(); - /* Read status until NAND is ready */ while(HAL_NAND_Read_Status(hnand) != NAND_READY) { + /* Get tick */ + tickstart = HAL_GetTick(); + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) { return HAL_TIMEOUT; @@ -606,13 +837,13 @@ HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTyp } /* Increment written pages number */ - numpageswritten++; + numPagesWritten++; /* Decrement pages to write */ NumPageToWrite--; /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); + nandaddress = (uint32_t)(nandaddress + 1U); } /* Update the NAND controller state */ @@ -624,6 +855,133 @@ HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTyp return HAL_OK; } +/** + * @brief Write Page(s) to NAND memory block (16-bits addressing) + * @param hnand: pointer to a NAND_HandleTypeDef structure that contains + * the configuration information for NAND module. + * @param pAddress : pointer to NAND address structure + * @param pBuffer : pointer to source buffer to write. pBuffer should be 16bits aligned + * @param NumPageToWrite : number of pages to write to block + * @retval HAL status + */ +HAL_StatusTypeDef HAL_NAND_Write_Page_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumPageToWrite) +{ + __IO uint32_t index = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numPagesWritten = 0U, nandaddress = 0U; + + /* Process Locked */ + __HAL_LOCK(hnand); + + /* Check the NAND controller state */ + if(hnand->State == HAL_NAND_STATE_BUSY) + { + return HAL_BUSY; + } + + /* Identify the device address */ + if(hnand->Init.NandBank == FMC_NAND_BANK2) + { + deviceaddress = NAND_DEVICE1; + } + else + { + deviceaddress = NAND_DEVICE2; + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_BUSY; + + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Page(s) write loop */ + while((NumPageToWrite != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) + { + /* update the buffer size */ + size = (hnand->Config.PageSize) + ((hnand->Config.PageSize) * numPagesWritten); + + /* Send write page command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + __DSB(); + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + __DSB(); + + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ + { + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + + /* Write data to memory */ + for(; index < size; index++) + { + *(__IO uint16_t *)deviceaddress = *(uint16_t *)pBuffer++; + } + + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Increment written pages number */ + numPagesWritten++; + + /* Decrement pages to write */ + NumPageToWrite--; + + /* Increment the NAND address */ + nandaddress = (uint32_t)(nandaddress + 1U); + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hnand); + + return HAL_OK; +} + /** * @brief Read Spare area(s) from NAND memory * @param hnand: pointer to a NAND_HandleTypeDef structure that contains @@ -633,12 +991,11 @@ HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTyp * @param NumSpareAreaToRead: Number of spare area to read * @retval HAL status */ -HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead) +HAL_StatusTypeDef HAL_NAND_Read_SpareArea_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead) { - __IO uint32_t index = 0U; - uint32_t deviceaddress = 0U, size = 0U, num_spare_area_read = 0U, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0U; + __IO uint32_t index = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numSpareAreaRead = 0U, nandaddress = 0U, columnaddress = 0U; /* Process Locked */ __HAL_LOCK(hnand); @@ -662,57 +1019,237 @@ HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_Addres /* Update the NAND controller state */ hnand->State = HAL_NAND_STATE_BUSY; - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Column in page address */ + columnaddress = COLUMN_ADDRESS(hnand); /* Spare area(s) read loop */ - while((NumSpareAreaToRead != 0U) && (addressstatus == NAND_VALID_ADDRESS)) + while((NumSpareAreaToRead != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) { /* update the buffer size */ - size = (hnand->Info.SpareAreaSize) + ((hnand->Info.SpareAreaSize) * num_spare_area_read); + size = (hnand->Config.SpareAreaSize) + ((hnand->Config.SpareAreaSize) * numSpareAreaRead); + + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + /* Send read spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ + { + /* Send read spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; + + if(hnand->Config.ExtraCommandEnable == ENABLE) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Go back to read mode */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); + } + + /* Get Data into Buffer */ + for(; index < size; index++) + { + *(uint8_t *)pBuffer++ = *(uint8_t *)deviceaddress; + } + + /* Increment read spare areas number */ + numSpareAreaRead++; + + /* Decrement spare areas to read */ + NumSpareAreaToRead--; - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; + /* Increment the NAND address */ + nandaddress = (uint32_t)(nandaddress + 1U); + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hnand); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); + return HAL_OK; +} + +/** + * @brief Read Spare area(s) from NAND memory (16-bits addressing) + * @param hnand: pointer to a NAND_HandleTypeDef structure that contains + * the configuration information for NAND module. + * @param pAddress : pointer to NAND address structure + * @param pBuffer: pointer to source buffer to write. pBuffer should be 16bits aligned. + * @param NumSpareAreaToRead: Number of spare area to read + * @retval HAL status +*/ +HAL_StatusTypeDef HAL_NAND_Read_SpareArea_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumSpareAreaToRead) +{ + __IO uint32_t index = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numSpareAreaRead = 0U, nandaddress = 0U, columnaddress = 0U; + + /* Process Locked */ + __HAL_LOCK(hnand); + + /* Check the NAND controller state */ + if(hnand->State == HAL_NAND_STATE_BUSY) + { + return HAL_BUSY; + } + + /* Identify the device address */ + if(hnand->Init.NandBank == FMC_NAND_BANK2) + { + deviceaddress = NAND_DEVICE1; + } + else + { + deviceaddress = NAND_DEVICE2; + } - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024U) + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_BUSY; + + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Column in page address */ + columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand) * 2U); + + /* Spare area(s) read loop */ + while((NumSpareAreaToRead != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) + { + /* update the buffer size */ + size = (hnand->Config.SpareAreaSize) + ((hnand->Config.SpareAreaSize) * numSpareAreaRead); + + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); - } + /* Send read spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ + { + /* Send read spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; + + if(hnand->Config.ExtraCommandEnable == ENABLE) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Go back to read mode */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00); + } /* Get Data into Buffer */ for(; index < size; index++) { - *(uint8_t *)pBuffer++ = *(uint8_t *)deviceaddress; + *(uint16_t *)pBuffer++ = *(uint16_t *)deviceaddress; } /* Increment read spare areas number */ - num_spare_area_read++; + numSpareAreaRead++; /* Decrement spare areas to read */ NumSpareAreaToRead--; /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); + nandaddress = (uint32_t)(nandaddress + 1U); } /* Update the NAND controller state */ hnand->State = HAL_NAND_STATE_READY; /* Process unlocked */ - __HAL_UNLOCK(hnand); + __HAL_UNLOCK(hnand); return HAL_OK; } @@ -726,13 +1263,11 @@ HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_Addres * @param NumSpareAreaTowrite : number of spare areas to write to block * @retval HAL status */ -HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite) +HAL_StatusTypeDef HAL_NAND_Write_SpareArea_8b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite) { __IO uint32_t index = 0U; uint32_t tickstart = 0U; - uint32_t deviceaddress = 0U, size = 0U, num_spare_area_written = 0U, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0U; + uint32_t deviceaddress = 0U, size = 0U, numSpareAreaWritten = 0U, nandaddress = 0U, columnaddress = 0U; /* Process Locked */ __HAL_LOCK(hnand); @@ -756,33 +1291,60 @@ HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_Addre /* Update the FMC_NAND controller state */ hnand->State = HAL_NAND_STATE_BUSY; - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; + /* Page address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Column in page address */ + columnaddress = COLUMN_ADDRESS(hnand); /* Spare area(s) write loop */ - while((NumSpareAreaTowrite != 0U) && (addressstatus == NAND_VALID_ADDRESS)) + while((NumSpareAreaTowrite != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) { /* update the buffer size */ - size = (hnand->Info.SpareAreaSize) + ((hnand->Info.SpareAreaSize) * num_spare_area_written); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); - - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + size = (hnand->Config.SpareAreaSize) + ((hnand->Config.SpareAreaSize) * numSpareAreaWritten); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024U) + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + /* Send write Spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); + /* Send write Spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } } /* Write data to memory */ @@ -806,13 +1368,13 @@ HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_Addre } /* Increment written spare areas number */ - num_spare_area_written++; + numSpareAreaWritten++; /* Decrement spare areas to write */ NumSpareAreaTowrite--; /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); + nandaddress = (uint32_t)(nandaddress + 1U); } /* Update the NAND controller state */ @@ -824,6 +1386,138 @@ HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_Addre return HAL_OK; } +/** + * @brief Write Spare area(s) to NAND memory (16-bits addressing) + * @param hnand: pointer to a NAND_HandleTypeDef structure that contains + * the configuration information for NAND module. + * @param pAddress : pointer to NAND address structure + * @param pBuffer : pointer to source buffer to write. pBuffer should be 16bits aligned. + * @param NumSpareAreaTowrite : number of spare areas to write to block + * @retval HAL status + */ +HAL_StatusTypeDef HAL_NAND_Write_SpareArea_16b(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint16_t *pBuffer, uint32_t NumSpareAreaTowrite) +{ + __IO uint32_t index = 0U; + uint32_t tickstart = 0U; + uint32_t deviceaddress = 0U, size = 0U, numSpareAreaWritten = 0U, nandaddress = 0U, columnaddress = 0U; + + /* Process Locked */ + __HAL_LOCK(hnand); + + /* Check the NAND controller state */ + if(hnand->State == HAL_NAND_STATE_BUSY) + { + return HAL_BUSY; + } + + /* Identify the device address */ + if(hnand->Init.NandBank == FMC_NAND_BANK2) + { + deviceaddress = NAND_DEVICE1; + } + else + { + deviceaddress = NAND_DEVICE2; + } + + /* Update the FMC_NAND controller state */ + hnand->State = HAL_NAND_STATE_BUSY; + + /* NAND raw address calculation */ + nandaddress = ARRAY_ADDRESS(pAddress, hnand); + + /* Column in page address */ + columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand) * 2U); + + /* Spare area(s) write loop */ + while((NumSpareAreaTowrite != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)))) + { + /* update the buffer size */ + size = (hnand->Config.SpareAreaSize) + ((hnand->Config.SpareAreaSize) * numSpareAreaWritten); + + /* Cards with page size <= 512 bytes */ + if((hnand->Config.PageSize) <= 512U) + { + /* Send write Spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + else /* (hnand->Config.PageSize) > 512 */ + { + /* Send write Spare area command sequence */ + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; + + if (((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) <= 65535U) + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + } + else /* ((hnand->Config.BlockSize)*(hnand->Config.BlockNbr)) > 65535 */ + { + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress); + *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress); + } + } + + /* Write data to memory */ + for(; index < size; index++) + { + *(__IO uint16_t *)deviceaddress = *(uint16_t *)pBuffer++; + } + + *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; + + /* Read status until NAND is ready */ + while(HAL_NAND_Read_Status(hnand) != NAND_READY) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) + { + return HAL_TIMEOUT; + } + } + + /* Increment written spare areas number */ + numSpareAreaWritten++; + + /* Decrement spare areas to write */ + NumSpareAreaTowrite--; + + /* Increment the NAND address */ + nandaddress = (uint32_t)(nandaddress + 1U); + } + + /* Update the NAND controller state */ + hnand->State = HAL_NAND_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hnand); + + return HAL_OK; +} + /** * @brief NAND memory Block erase * @param hnand: pointer to a NAND_HandleTypeDef structure that contains @@ -864,12 +1558,6 @@ HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, NAND_AddressTy *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024U) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - } *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE1; @@ -954,17 +1642,17 @@ uint32_t HAL_NAND_Address_Inc(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pA pAddress->Page++; /* Check NAND address is valid */ - if(pAddress->Page == hnand->Info.BlockSize) + if(pAddress->Page == hnand->Config.BlockSize) { pAddress->Page = 0U; pAddress->Block++; - if(pAddress->Block == hnand->Info.ZoneSize) + if(pAddress->Block == hnand->Config.PlaneSize) { pAddress->Block = 0U; - pAddress->Zone++; + pAddress->Plane++; - if(pAddress->Zone == (hnand->Info.ZoneSize/ hnand->Info.BlockNbr)) + if(pAddress->Plane == (hnand->Config.PlaneNbr)) { status = NAND_INVALID_ADDRESS; } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c index 57b9b7e..cd58501 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_nor.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief NOR HAL module driver. * This file provides a generic firmware to drive NOR memories mounted * as external device. @@ -55,7 +55,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -106,33 +106,33 @@ */ /* Constants to define address to set to write a command */ -#define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555U -#define NOR_CMD_ADDRESS_FIRST_CFI (uint16_t)0x0055U -#define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AAU -#define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555U -#define NOR_CMD_ADDRESS_FOURTH (uint16_t)0x0555U -#define NOR_CMD_ADDRESS_FIFTH (uint16_t)0x02AAU -#define NOR_CMD_ADDRESS_SIXTH (uint16_t)0x0555U +#define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555 +#define NOR_CMD_ADDRESS_FIRST_CFI (uint16_t)0x0055 +#define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AA +#define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555 +#define NOR_CMD_ADDRESS_FOURTH (uint16_t)0x0555 +#define NOR_CMD_ADDRESS_FIFTH (uint16_t)0x02AA +#define NOR_CMD_ADDRESS_SIXTH (uint16_t)0x0555 /* Constants to define data to program a command */ -#define NOR_CMD_DATA_READ_RESET (uint16_t)0x00F0U -#define NOR_CMD_DATA_FIRST (uint16_t)0x00AAU -#define NOR_CMD_DATA_SECOND (uint16_t)0x0055U -#define NOR_CMD_DATA_AUTO_SELECT (uint16_t)0x0090U -#define NOR_CMD_DATA_PROGRAM (uint16_t)0x00A0U -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (uint16_t)0x0080U -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (uint16_t)0x00AAU -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (uint16_t)0x0055U -#define NOR_CMD_DATA_CHIP_ERASE (uint16_t)0x0010U -#define NOR_CMD_DATA_CFI (uint16_t)0x0098U +#define NOR_CMD_DATA_READ_RESET (uint16_t)0x00F0 +#define NOR_CMD_DATA_FIRST (uint16_t)0x00AA +#define NOR_CMD_DATA_SECOND (uint16_t)0x0055 +#define NOR_CMD_DATA_AUTO_SELECT (uint16_t)0x0090 +#define NOR_CMD_DATA_PROGRAM (uint16_t)0x00A0 +#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (uint16_t)0x0080 +#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (uint16_t)0x00AA +#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (uint16_t)0x0055 +#define NOR_CMD_DATA_CHIP_ERASE (uint16_t)0x0010 +#define NOR_CMD_DATA_CFI (uint16_t)0x0098 -#define NOR_CMD_DATA_BUFFER_AND_PROG (uint8_t)0x25U -#define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM (uint8_t)0x29U -#define NOR_CMD_DATA_BLOCK_ERASE (uint8_t)0x30U +#define NOR_CMD_DATA_BUFFER_AND_PROG (uint8_t)0x25 +#define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM (uint8_t)0x29 +#define NOR_CMD_DATA_BLOCK_ERASE (uint8_t)0x30 /* Mask on NOR STATUS REGISTER */ -#define NOR_MASK_STATUS_DQ5 (uint16_t)0x0020U -#define NOR_MASK_STATUS_DQ6 (uint16_t)0x0040U +#define NOR_MASK_STATUS_DQ5 (uint16_t)0x0020 +#define NOR_MASK_STATUS_DQ6 (uint16_t)0x0040 /** * @} @@ -173,7 +173,8 @@ static uint32_t uwNORMemoryDataWidth = NOR_MEMORY_8B; /** * @brief Perform the NOR memory Initialization sequence - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param Timing: pointer to NOR control timing structure * @param ExtTiming: pointer to NOR extended mode timing structure * @retval HAL status @@ -205,8 +206,8 @@ HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDe /* Enable the NORSRAM device */ __FMC_NORSRAM_ENABLE(hnor->Instance, hnor->Init.NSBank); - - /* Initialize NOR Memory Data Width*/ + + /* Initialize NOR Memory Data Width*/ if (hnor->Init.MemoryDataWidth == FMC_NORSRAM_MEM_BUS_WIDTH_8) { uwNORMemoryDataWidth = NOR_MEMORY_8B; @@ -276,7 +277,7 @@ __weak void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor) } /** - * @brief NOR BSP Wait for Ready/Busy signal + * @brief NOR MSP Wait for Ready/Busy signal * @param hnor: pointer to a NOR_HandleTypeDef structure that contains * the configuration information for NOR module. * @param Timeout: Maximum timeout value @@ -286,8 +287,10 @@ __weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) { /* Prevent unused argument(s) compilation warning */ UNUSED(hnor); + UNUSED(Timeout); + /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_BspWait could be implemented in the user file + the HAL_NOR_MspWait could be implemented in the user file */ } @@ -311,7 +314,8 @@ __weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) /** * @brief Read NOR flash IDs - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param pNOR_ID : pointer to NOR ID structure * @retval HAL status */ @@ -325,7 +329,7 @@ HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_I /* Check the NOR controller state */ if(hnor->State == HAL_NOR_STATE_BUSY) { - return HAL_BUSY; + return HAL_BUSY; } /* Select the NOR device address */ @@ -371,7 +375,8 @@ HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_I /** * @brief Returns the NOR memory to Read mode. - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @retval HAL status */ HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor) @@ -418,7 +423,8 @@ HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor) /** * @brief Read data from NOR memory - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param pAddress: pointer to Device address * @param pData : pointer to read data * @retval HAL status @@ -460,10 +466,10 @@ HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint /* Send read data command */ NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE((uint32_t)pAddress, NOR_CMD_DATA_READ_RESET); + NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET); /* Read the data */ - *pData = *(__IO uint32_t *)(uint32_t)pAddress; + *pData = *(__IO uint32_t *)(uint32_t)pAddress; /* Check the NOR controller state */ hnor->State = HAL_NOR_STATE_READY; @@ -476,7 +482,8 @@ HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint /** * @brief Program data to NOR memory - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param pAddress: Device address * @param pData : pointer to the data to write * @retval HAL status @@ -578,7 +585,7 @@ HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress /* Send read data command */ NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(uwAddress, 0x00F0U); + NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET); /* Read buffer */ while( uwBufferSize > 0U) @@ -680,7 +687,8 @@ HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddr /** * @brief Erase the specified block of the NOR memory - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param BlockAddress : Block to erase address * @param Address: Device address * @retval HAL status @@ -739,7 +747,8 @@ HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAdd /** * @brief Erase the entire NOR chip. - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param Address : Device address * @retval HAL status */ @@ -747,6 +756,9 @@ HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address) { uint32_t deviceaddress = 0U; + /* Prevent unused argument(s) compilation warning */ + UNUSED(Address); + /* Process Locked */ __HAL_LOCK(hnor); @@ -796,7 +808,8 @@ HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address) /** * @brief Read NOR flash CFI IDs - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param pNOR_CFI : pointer to NOR CFI IDs structure * @retval HAL status */ @@ -856,7 +869,7 @@ HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR * @} */ -/** @defgroup NOR_Exported_Functions_Group3 Control functions +/** @defgroup NOR_Exported_Functions_Group3 NOR Control functions * @brief management functions * @verbatim @@ -873,7 +886,8 @@ HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR /** * @brief Enables dynamically NOR write operation. - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @retval HAL status */ HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor) @@ -895,7 +909,8 @@ HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor) /** * @brief Disables dynamically NOR write operation. - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @retval HAL status */ HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) @@ -922,7 +937,7 @@ HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) * @} */ -/** @defgroup NOR_Exported_Functions_Group4 State functions +/** @defgroup NOR_Exported_Functions_Group4 NOR State functions * @brief Peripheral State functions * @verbatim @@ -939,7 +954,8 @@ HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) /** * @brief return the NOR controller state - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @retval NOR controller state */ HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor) @@ -949,7 +965,8 @@ HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor) /** * @brief Returns the NOR operation status. - * @param hnor: pointer to the NOR handle + * @param hnor: pointer to a NOR_HandleTypeDef structure that contains + * the configuration information for NOR module. * @param Address: Device address * @param Timeout: NOR programming Timeout * @retval NOR_Status: The returned value can be: HAL_NOR_STATUS_SUCCESS, HAL_NOR_STATUS_ERROR @@ -958,7 +975,7 @@ HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor) HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout) { HAL_NOR_StatusTypeDef status = HAL_NOR_STATUS_ONGOING; - uint16_t tmpSR1 = 0U, tmpSR2 = 0U; + uint16_t tmpSR1 = 0, tmpSR2 = 0; uint32_t tickstart = 0U; /* Poll on NOR memory Ready/Busy signal ------------------------------------*/ @@ -1015,7 +1032,6 @@ HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Addres /** * @} */ - /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c index d89ed9f..098a4b8 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_pccard.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief PCCARD HAL module driver. * This file provides a generic firmware to drive PCCARD memories mounted * as external device. @@ -50,7 +50,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -97,13 +97,13 @@ /** @defgroup PCCARD_Private_Defines PCCARD Private Defines * @{ */ -#define PCCARD_TIMEOUT_READ_ID (uint32_t)0x0000FFFFU -#define PCCARD_TIMEOUT_READ_WRITE_SECTOR (uint32_t)0x0000FFFFU -#define PCCARD_TIMEOUT_ERASE_SECTOR (uint32_t)0x00000400U -#define PCCARD_TIMEOUT_STATUS (uint32_t)0x01000000U +#define PCCARD_TIMEOUT_READ_ID 0x0000FFFFU +#define PCCARD_TIMEOUT_READ_WRITE_SECTOR 0x0000FFFFU +#define PCCARD_TIMEOUT_ERASE_SECTOR 0x00000400U +#define PCCARD_TIMEOUT_STATUS 0x01000000U -#define PCCARD_STATUS_OK (uint8_t)0x58U -#define PCCARD_STATUS_WRITE_OK (uint8_t)0x50U +#define PCCARD_STATUS_OK (uint8_t)0x58 +#define PCCARD_STATUS_WRITE_OK (uint8_t)0x50 /** * @} */ @@ -264,7 +264,7 @@ __weak void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard) HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus) { uint32_t timeout = PCCARD_TIMEOUT_READ_ID, index = 0U; - uint8_t status = 0U; + uint8_t status = 0; /* Process Locked */ __HAL_LOCK(hpccard); @@ -282,7 +282,7 @@ HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t Comp *pStatus = PCCARD_READY; /* Send the Identify Command */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = 0xECECU; + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = 0xECEC; /* Read PCCARD IDs and timeout treatment */ do @@ -327,7 +327,7 @@ HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t Comp HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, uint8_t *pStatus) { uint32_t timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR, index = 0U; - uint8_t status = 0U; + uint8_t status = 0; /* Process Locked */ __HAL_LOCK(hpccard); @@ -345,16 +345,16 @@ HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pStatus = PCCARD_READY; /* Set the parameters to write a sector */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00U; - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100U ) | ((uint16_t)SectorAddress); - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0U; + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00; + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress); + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0; do { /* wait till the Status = 0x80 */ status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE); timeout--; - }while((status == 0x80U) && timeout); + }while((status == 0x80) && timeout); if(timeout == 0U) { @@ -403,7 +403,7 @@ HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, uint8_t *pStatus) { uint32_t timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR, index = 0U; - uint8_t status = 0U; + uint8_t status = 0; /* Process Locked */ __HAL_LOCK(hpccard); @@ -421,9 +421,9 @@ HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_ *pStatus = PCCARD_READY; /* Set the parameters to write a sector */ - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00U; - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100U ) | ((uint16_t)SectorAddress); - *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0U; + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00; + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress); + *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0; do { @@ -476,7 +476,7 @@ HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_ HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus) { uint32_t timeout = PCCARD_TIMEOUT_ERASE_SECTOR; - uint8_t status = 0U; + uint8_t status = 0; /* Process Locked */ __HAL_LOCK(hpccard); @@ -494,11 +494,11 @@ HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16 *pStatus = PCCARD_READY; /* Set the parameters to write a sector */ - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00U; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00U; + *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00; + *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00; *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_NUMBER) = SectorAddress; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01U; - *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0U; + *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01; + *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0; *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = ATA_ERASE_SECTOR_CMD; /* wait till the PCCARD is ready */ @@ -551,7 +551,7 @@ HAL_StatusTypeDef HAL_PCCARD_Reset(PCCARD_HandleTypeDef *hpccard) /* Check the PCCARD controller state */ hpccard->State = HAL_PCCARD_STATE_BUSY; - *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION ) = 0x01U; + *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION ) = 0x01; /* Check the PCCARD controller state */ hpccard->State = HAL_PCCARD_STATE_READY; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c index 7628f2d..c524f97 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_pcd.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief PCD HAL module driver. * This file provides firmware functions to manage the following * functionalities of the USB Peripheral Controller: @@ -45,7 +45,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -329,7 +329,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) uint32_t i = 0U, ep_intr = 0U, epint = 0U, epnum = 0U; uint32_t fifoemptymsk = 0U, temp = 0U; USB_OTG_EPTypeDef *ep; - uint32_t hclk = 180000000; + uint32_t hclk = 180000000U; /* ensure that we are in device mode */ if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) @@ -508,7 +508,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if( hpcd->LPM_State == LPM_L0) { hpcd->LPM_State = LPM_L1; - hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >>2 ; + hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U; HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE); } else @@ -522,7 +522,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) { USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - USB_FlushTxFifo(hpcd->Instance , 0U); + USB_FlushTxFifo(hpcd->Instance , 0x10U); for (i = 0U; i < hpcd->Init.dev_endpoints; i++) { @@ -578,64 +578,67 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access latency to the Data FIFO */ - if((hclk >= 14200000)&&(hclk < 15000000)) + /* Get hclk frequency value */ + hclk = HAL_RCC_GetHCLKFreq(); + + if((hclk >= 14200000U)&&(hclk < 15000000U)) { /* hclk Clock Range between 14.2-15 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xF << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xFU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 15000000)&&(hclk < 16000000)) + else if((hclk >= 15000000U)&&(hclk < 16000000U)) { /* hclk Clock Range between 15-16 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xE << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xEU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 16000000)&&(hclk < 17200000)) + else if((hclk >= 16000000U)&&(hclk < 17200000U)) { /* hclk Clock Range between 16-17.2 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xD << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xDU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 17200000)&&(hclk < 18500000)) + else if((hclk >= 17200000U)&&(hclk < 18500000U)) { /* hclk Clock Range between 17.2-18.5 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xC << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xCU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 18500000)&&(hclk < 20000000)) + else if((hclk >= 18500000U)&&(hclk < 20000000U)) { /* hclk Clock Range between 18.5-20 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xB << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xBU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 20000000)&&(hclk < 21800000)) + else if((hclk >= 20000000U)&&(hclk < 21800000U)) { /* hclk Clock Range between 20-21.8 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0xA << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0xAU << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 21800000)&&(hclk < 24000000)) + else if((hclk >= 21800000U)&&(hclk < 24000000U)) { /* hclk Clock Range between 21.8-24 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0x9 << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0x9U << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 24000000)&&(hclk < 27700000)) + else if((hclk >= 24000000U)&&(hclk < 27700000U)) { /* hclk Clock Range between 24-27.7 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0x8 << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0x8U << 10U) & USB_OTG_GUSBCFG_TRDT); } - else if((hclk >= 27700000)&&(hclk < 32000000)) + else if((hclk >= 27700000U)&&(hclk < 32000000U)) { /* hclk Clock Range between 27.7-32 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0x7 << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0x7U << 10U) & USB_OTG_GUSBCFG_TRDT); } else /* if(hclk >= 32000000) */ { /* hclk Clock Range between 32-180 MHz */ - hpcd->Instance->GUSBCFG |= (uint32_t)((0x6 << 10) & USB_OTG_GUSBCFG_TRDT); + hpcd->Instance->GUSBCFG |= (uint32_t)((0x6U << 10U) & USB_OTG_GUSBCFG_TRDT); } } @@ -944,17 +947,17 @@ HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint HAL_StatusTypeDef ret = HAL_OK; USB_OTG_EPTypeDef *ep; - if ((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80) == 0x80) { - ep = &hpcd->IN_ep[ep_addr & 0x7FU]; + ep = &hpcd->IN_ep[ep_addr & 0x7F]; } else { - ep = &hpcd->OUT_ep[ep_addr & 0x7FU]; + ep = &hpcd->OUT_ep[ep_addr & 0x7F]; } - ep->num = ep_addr & 0x7FU; + ep->num = ep_addr & 0x7F; - ep->is_in = (0x80U & ep_addr) != 0U; + ep->is_in = (0x80 & ep_addr) != 0; ep->maxpacket = ep_mps; ep->type = ep_type; if (ep->is_in) @@ -985,17 +988,17 @@ HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) { USB_OTG_EPTypeDef *ep; - if ((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80) == 0x80) { - ep = &hpcd->IN_ep[ep_addr & 0x7FU]; + ep = &hpcd->IN_ep[ep_addr & 0x7F]; } else { - ep = &hpcd->OUT_ep[ep_addr & 0x7FU]; + ep = &hpcd->OUT_ep[ep_addr & 0x7F]; } - ep->num = ep_addr & 0x7FU; + ep->num = ep_addr & 0x7F; - ep->is_in = (0x80U & ep_addr) != 0U; + ep->is_in = (0x80 & ep_addr) != 0; __HAL_LOCK(hpcd); USB_DeactivateEndpoint(hpcd->Instance , ep); @@ -1016,23 +1019,21 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u { USB_OTG_EPTypeDef *ep; - ep = &hpcd->OUT_ep[ep_addr & 0x7FU]; + ep = &hpcd->OUT_ep[ep_addr & 0x7F]; /*setup and start the Xfer */ ep->xfer_buff = pBuf; ep->xfer_len = len; ep->xfer_count = 0U; ep->is_in = 0U; - ep->num = ep_addr & 0x7FU; + ep->num = ep_addr & 0x7F; if (hpcd->Init.dma_enable == 1U) { ep->dma_addr = (uint32_t)pBuf; } - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x7FU) == 0U) + if ((ep_addr & 0x7F) == 0) { USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); } @@ -1040,7 +1041,6 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u { USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); } - __HAL_UNLOCK(hpcd); return HAL_OK; } @@ -1053,7 +1053,7 @@ HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, u */ uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) { - return hpcd->OUT_ep[ep_addr & 0xFU].xfer_count; + return hpcd->OUT_ep[ep_addr & 0xF].xfer_count; } /** * @brief Send an amount of data. @@ -1067,23 +1067,21 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, { USB_OTG_EPTypeDef *ep; - ep = &hpcd->IN_ep[ep_addr & 0x7FU]; + ep = &hpcd->IN_ep[ep_addr & 0x7F]; /*setup and start the Xfer */ ep->xfer_buff = pBuf; ep->xfer_len = len; ep->xfer_count = 0U; ep->is_in = 1U; - ep->num = ep_addr & 0x7FU; + ep->num = ep_addr & 0x7F; if (hpcd->Init.dma_enable == 1U) { ep->dma_addr = (uint32_t)pBuf; } - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x7FU) == 0U) + if ((ep_addr & 0x7F) == 0) { USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); } @@ -1092,8 +1090,6 @@ HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); } - __HAL_UNLOCK(hpcd); - return HAL_OK; } @@ -1107,9 +1103,9 @@ HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) { USB_OTG_EPTypeDef *ep; - if ((0x80U & ep_addr) == 0x80U) + if ((0x80 & ep_addr) == 0x80) { - ep = &hpcd->IN_ep[ep_addr & 0x7FU]; + ep = &hpcd->IN_ep[ep_addr & 0x7F]; } else { @@ -1117,13 +1113,13 @@ HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) } ep->is_stall = 1U; - ep->num = ep_addr & 0x7FU; - ep->is_in = ((ep_addr & 0x80U) == 0x80U); + ep->num = ep_addr & 0x7F; + ep->is_in = ((ep_addr & 0x80) == 0x80); __HAL_LOCK(hpcd); USB_EPSetStall(hpcd->Instance , ep); - if((ep_addr & 0x7FU) == 0U) + if((ep_addr & 0x7F) == 0) { USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); } @@ -1142,9 +1138,9 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) { USB_OTG_EPTypeDef *ep; - if ((0x80U & ep_addr) == 0x80U) + if ((0x80 & ep_addr) == 0x80) { - ep = &hpcd->IN_ep[ep_addr & 0x7FU]; + ep = &hpcd->IN_ep[ep_addr & 0x7F]; } else { @@ -1152,8 +1148,8 @@ HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) } ep->is_stall = 0U; - ep->num = ep_addr & 0x7FU; - ep->is_in = ((ep_addr & 0x80U) == 0x80U); + ep->num = ep_addr & 0x7F; + ep->is_in = ((ep_addr & 0x80) == 0x80); __HAL_LOCK(hpcd); USB_EPClearStall(hpcd->Instance , ep); @@ -1172,9 +1168,9 @@ HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) { __HAL_LOCK(hpcd); - if ((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80) == 0x80) { - USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7FU); + USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7F); } else { @@ -1282,9 +1278,9 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t len32b = (len + 3U) / 4U; - while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b && - ep->xfer_count < ep->xfer_len && - ep->xfer_len != 0U) + while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b) && + (ep->xfer_count < ep->xfer_len) && + (ep->xfer_len != 0U)) { /* Write the FIFO */ len = ep->xfer_len - ep->xfer_count; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c index de660fe..db3e04f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_pcd_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief PCD HAL module driver. * This file provides firmware functions to manage the following * functionalities of the USB Peripheral Controller: @@ -12,7 +12,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -90,7 +90,7 @@ */ HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) { - uint8_t i = 0U; + uint8_t i = 0; uint32_t Tx_Offset = 0U; /* TXn min size = 16 words. (n : Transmit FIFO index) @@ -105,20 +105,20 @@ HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uin Tx_Offset = hpcd->Instance->GRXFSIZ; - if(fifo == 0U) + if(fifo == 0) { hpcd->Instance->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((uint32_t)size << 16U) | Tx_Offset); } else { Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16U; - for (i = 0U; i < (fifo - 1U); i++) + for (i = 0; i < (fifo - 1); i++) { Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16U); } /* Multiply Tx_Size by 2 to get higher performance */ - hpcd->Instance->DIEPTXF[fifo - 1U] = (uint32_t)(((uint32_t)size << 16U) | Tx_Offset); + hpcd->Instance->DIEPTXF[fifo - 1] = (uint32_t)(((uint32_t)size << 16U) | Tx_Offset); } return HAL_OK; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c index dbc155a..18e5cc2 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_pwr.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief PWR HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Power Controller (PWR) peripheral: @@ -13,7 +13,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -63,10 +63,10 @@ /** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask * @{ */ -#define PVD_MODE_IT ((uint32_t)0x00010000U) -#define PVD_MODE_EVT ((uint32_t)0x00020000U) -#define PVD_RISING_EDGE ((uint32_t)0x00000001U) -#define PVD_FALLING_EDGE ((uint32_t)0x00000002U) +#define PVD_MODE_IT 0x00010000U +#define PVD_MODE_EVT 0x00020000U +#define PVD_RISING_EDGE 0x00000001U +#define PVD_FALLING_EDGE 0x00000002U /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c index 25e5d2e..a1d353f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_pwr_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Extended PWR HAL module driver. * This file provides firmware functions to manage the following * functionalities of PWR extension peripheral: @@ -12,7 +12,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -537,7 +537,7 @@ HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) /** * @brief Enters in Under-Drive STOP mode. * - * @note This mode is only available for STM32F42xxx/STM324F3xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. * * @note This mode can be selected only when the Under-Drive is already active * @@ -576,8 +576,7 @@ HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) { uint32_t tmpreg1 = 0U; - uint32_t tickstart = 0U; - + /* Check the parameters */ assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); @@ -591,18 +590,6 @@ HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t /* Enable the Under-drive */ __HAL_PWR_UNDERDRIVE_ENABLE(); - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait for UnderDrive mode is ready */ - while(__HAL_PWR_GET_FLAG(PWR_FLAG_UDRDY)) - { - if((HAL_GetTick() - tickstart) > PWR_UDERDRIVE_TIMEOUT_VALUE) - { - return HAL_TIMEOUT; - } - } - /* Select the regulator state in STOP mode ---------------------------------*/ tmpreg1 = PWR->CR; /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c index d6600f7..c9be944 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_qspi.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief QSPI HAL module driver. * This file provides firmware functions to manage the following * functionalities of the QuadSPI interface (QSPI). @@ -138,7 +138,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -186,7 +186,7 @@ /** @addtogroup QSPI_Private_Constants * @{ */ -#define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE ((uint32_t)0x00000000U) /*!Instance->CR, QUADSPI_CR_FTHRES, ((hqspi->Init.FifoThreshold - 1) << 8)); + MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES, ((hqspi->Init.FifoThreshold - 1U) << 8U)); /* Wait till BUSY flag reset */ status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout); @@ -302,11 +302,11 @@ HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi) { /* Configure QSPI Clock Prescaler and Sample Shift */ - MODIFY_REG(hqspi->Instance->CR,(QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM), ((hqspi->Init.ClockPrescaler << 24)| hqspi->Init.SampleShifting | hqspi->Init.FlashID| hqspi->Init.DualFlash )); + MODIFY_REG(hqspi->Instance->CR,(QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM), ((hqspi->Init.ClockPrescaler << 24U)| hqspi->Init.SampleShifting | hqspi->Init.FlashID| hqspi->Init.DualFlash )); /* Configure QSPI Flash Size, CS High Time and Clock Mode */ MODIFY_REG(hqspi->Instance->DCR, (QUADSPI_DCR_FSIZE | QUADSPI_DCR_CSHT | QUADSPI_DCR_CKMODE), - ((hqspi->Init.FlashSize << 16) | hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode)); + ((hqspi->Init.FlashSize << 16U) | hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode)); /* Enable the QSPI peripheral */ __HAL_QSPI_ENABLE(hqspi); @@ -432,9 +432,9 @@ void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi) if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX) { /* Transmission process */ - while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0) + while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0U) { - if (hqspi->TxXferCount > 0) + if (hqspi->TxXferCount > 0U) { /* Fill the FIFO until it is full */ *(__IO uint8_t *)data_reg = *hqspi->pTxBuffPtr++; @@ -452,9 +452,9 @@ void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi) else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX) { /* Receiving Process */ - while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0) + while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != 0U) { - if (hqspi->RxXferCount > 0) + if (hqspi->RxXferCount > 0U) { /* Read the FIFO until it is empty */ *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg; @@ -517,9 +517,9 @@ void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi) else { data_reg = &hqspi->Instance->DR; - while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0) + while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0U) { - if (hqspi->RxXferCount > 0) + if (hqspi->RxXferCount > 0U) { /* Read the last data received in the FIFO until it is empty */ *hqspi->pRxBuffPtr++ = *(__IO uint8_t *)data_reg; @@ -578,7 +578,7 @@ void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi) WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM); /* Check if the automatic poll mode stop is activated */ - if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0) + if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0U) { /* Disable the QSPI Transfer Error and Status Match Interrupts */ __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE)); @@ -776,7 +776,7 @@ HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTyp count = (hqspi->Timeout) * (SystemCoreClock / 16U / 1000U); do { - if (count-- == 0) + if (count-- == 0U) { hqspi->State = HAL_QSPI_STATE_ERROR; hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT; @@ -860,14 +860,14 @@ HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, u hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX; /* Configure counters and size of the handle */ - hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1; - hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1; + hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U; + hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U; hqspi->pTxBuffPtr = pData; /* Configure QSPI: CCR register with functional as indirect write */ MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE); - while(hqspi->TxXferCount > 0) + while(hqspi->TxXferCount > 0U) { /* Wait until FT flag is set to send data */ status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout); @@ -944,8 +944,8 @@ HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, ui hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX; /* Configure counters and size of the handle */ - hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1; - hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1; + hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U; + hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U; hqspi->pRxBuffPtr = pData; /* Configure QSPI: CCR register with functional as indirect read */ @@ -954,7 +954,7 @@ HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, ui /* Start the transfer by re-writing the address in AR register */ WRITE_REG(hqspi->Instance->AR, addr_reg); - while(hqspi->RxXferCount > 0) + while(hqspi->RxXferCount > 0U) { /* Wait until FT or TC flag is set to read received data */ status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout); @@ -1026,8 +1026,8 @@ HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX; /* Configure counters and size of the handle */ - hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1; - hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1; + hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U; + hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U; hqspi->pTxBuffPtr = pData; /* Configure QSPI: CCR register with functional as indirect write */ @@ -1088,8 +1088,8 @@ HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData) hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX; /* Configure counters and size of the handle */ - hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1; - hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1; + hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U; + hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U; hqspi->pRxBuffPtr = pData; /* Configure QSPI: CCR register with functional as indirect read */ @@ -1142,7 +1142,7 @@ HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pDat { HAL_StatusTypeDef status = HAL_OK; uint32_t *tmp; - uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1); + uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U); /* Process locked */ __HAL_LOCK(hqspi); @@ -1161,7 +1161,7 @@ HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pDat } else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD) { - if (((data_size % 2) != 0) || ((hqspi->Init.FifoThreshold % 2) != 0)) + if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U)) { /* The number of data or the fifo threshold is not aligned on halfword => no transfer possible with DMA peripheral access configured as halfword */ @@ -1178,7 +1178,7 @@ HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pDat } else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD) { - if (((data_size % 4) != 0) || ((hqspi->Init.FifoThreshold % 4) != 0)) + if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U)) { /* The number of data or the fifo threshold is not aligned on word => no transfer possible with DMA peripheral access configured as word */ @@ -1190,7 +1190,7 @@ HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pDat } else { - hqspi->TxXferCount = (data_size >> 2); + hqspi->TxXferCount = (data_size >> 2U); } } @@ -1299,7 +1299,7 @@ HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData HAL_StatusTypeDef status = HAL_OK; uint32_t *tmp; uint32_t addr_reg = READ_REG(hqspi->Instance->AR); - uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1); + uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U); /* Process locked */ __HAL_LOCK(hqspi); @@ -1317,7 +1317,7 @@ HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData } else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD) { - if (((data_size % 2) != 0) || ((hqspi->Init.FifoThreshold % 2) != 0)) + if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U)) { /* The number of data or the fifo threshold is not aligned on halfword => no transfer possible with DMA peripheral access configured as halfword */ @@ -1329,12 +1329,12 @@ HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData } else { - hqspi->RxXferCount = (data_size >> 1); + hqspi->RxXferCount = (data_size >> 1U); } } else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD) { - if (((data_size % 4) != 0) || ((hqspi->Init.FifoThreshold % 4) != 0)) + if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U)) { /* The number of data or the fifo threshold is not aligned on word => no transfer possible with DMA peripheral access configured as word */ @@ -1346,7 +1346,7 @@ HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData } else { - hqspi->RxXferCount = (data_size >> 2); + hqspi->RxXferCount = (data_size >> 2U); } } @@ -1398,7 +1398,7 @@ HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData /* 4 Extra words (32-bits) are needed for read operation to guarantee the last data is transferred from DMA FIFO to RAM memory */ - WRITE_REG(hqspi->Instance->DLR, (data_size - 1 + 16)); + WRITE_REG(hqspi->Instance->DLR, (data_size - 1U + 16U)); /* Update direction mode bit */ MODIFY_REG(hqspi->hdma->Instance->CR, DMA_SxCR_DIR, hqspi->hdma->Init.Direction); @@ -1627,7 +1627,7 @@ HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_Comman count = (hqspi->Timeout) * (SystemCoreClock / 16U / 1000U); do { - if (count-- == 0) + if (count-- == 0U) { hqspi->State = HAL_QSPI_STATE_ERROR; hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT; @@ -1975,7 +1975,7 @@ HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi) uint32_t tickstart = HAL_GetTick(); /* Check if the state is in one of the busy states */ - if ((hqspi->State & 0x2) != 0) + if ((hqspi->State & 0x2U) != 0U) { /* Process unlocked */ __HAL_UNLOCK(hqspi); @@ -2027,7 +2027,7 @@ HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi) HAL_StatusTypeDef status = HAL_OK; /* Check if the state is in one of the busy states */ - if ((hqspi->State & 0x2) != 0) + if ((hqspi->State & 0x2U) != 0U) { /* Process unlocked */ __HAL_UNLOCK(hqspi); @@ -2092,7 +2092,7 @@ HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t /* Configure QSPI FIFO Threshold */ MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES, - ((hqspi->Init.FifoThreshold - 1) << POSITION_VAL(QUADSPI_CR_FTHRES))); + ((hqspi->Init.FifoThreshold - 1U) << POSITION_VAL(QUADSPI_CR_FTHRES))); } else { @@ -2112,7 +2112,7 @@ HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t */ uint32_t HAL_QSPI_GetFifoThreshold(QSPI_HandleTypeDef *hqspi) { - return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> POSITION_VAL(QUADSPI_CR_FTHRES)) + 1); + return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> POSITION_VAL(QUADSPI_CR_FTHRES)) + 1U); } /** @@ -2129,7 +2129,7 @@ uint32_t HAL_QSPI_GetFifoThreshold(QSPI_HandleTypeDef *hqspi) static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma) { QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hqspi->RxXferCount = 0; + hqspi->RxXferCount = 0U; /* Enable the QSPI transfer complete Interrupt */ __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC); @@ -2143,7 +2143,7 @@ static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma) static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma) { QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hqspi->TxXferCount = 0; + hqspi->TxXferCount = 0U; /* Enable the QSPI transfer complete Interrupt */ __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC); @@ -2185,8 +2185,8 @@ static void QSPI_DMAError(DMA_HandleTypeDef *hdma) /* if DMA error is FIFO error ignore it */ if(HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE) { - hqspi->RxXferCount = 0; - hqspi->TxXferCount = 0; + hqspi->RxXferCount = 0U; + hqspi->TxXferCount = 0U; hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA; /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */ @@ -2206,8 +2206,8 @@ static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma) { QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hqspi->RxXferCount = 0; - hqspi->TxXferCount = 0; + hqspi->RxXferCount = 0U; + hqspi->TxXferCount = 0U; if(hqspi->State == HAL_QSPI_STATE_ABORT) { @@ -2249,7 +2249,7 @@ static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqsp /* Check for the Timeout */ if (Timeout != HAL_MAX_DELAY) { - if((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout)) + if((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) { hqspi->State = HAL_QSPI_STATE_ERROR; hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT; @@ -2280,7 +2280,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)) { /* Configure QSPI: DLR register with the number of data to read or write */ - WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1)); + WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1U)); } if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE) @@ -2295,7 +2295,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with instruction, address and alternate bytes ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateBytesSize | cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode | cmd->Instruction | FunctionalMode)); @@ -2310,7 +2310,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with instruction and alternate bytes ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateBytesSize | cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode | cmd->Instruction | FunctionalMode)); } @@ -2322,7 +2322,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with instruction and address ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode | cmd->Instruction | FunctionalMode)); @@ -2337,7 +2337,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with only instruction ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode | cmd->Instruction | FunctionalMode)); } @@ -2355,7 +2355,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with address and alternate bytes ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateBytesSize | cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode | FunctionalMode)); @@ -2370,7 +2370,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with only alternate bytes ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateBytesSize | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateBytesSize | cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode | FunctionalMode)); } @@ -2382,7 +2382,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin /*---- Command with only address ----*/ /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode | FunctionalMode)); @@ -2399,7 +2399,7 @@ static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uin { /* Configure QSPI: CCR register with all communications parameters */ WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode | - cmd->DataMode | (cmd->DummyCycles << 18) | cmd->AlternateByteMode | + cmd->DataMode | (cmd->DummyCycles << 18U) | cmd->AlternateByteMode | cmd->AddressMode | cmd->InstructionMode | FunctionalMode)); } } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c index 7a86486..af8ea2f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_rcc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief RCC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Reset and Clock Control (RCC) peripheral: @@ -56,7 +56,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -102,7 +102,7 @@ /** @addtogroup RCC_Private_Constants * @{ */ -#define CLOCKSWITCH_TIMEOUT_VALUE ((uint32_t)5000U) /* 5 s */ +#define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */ /* Private macro -------------------------------------------------------------*/ #define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() @@ -120,11 +120,9 @@ /** @defgroup RCC_Private_Variables RCC Private Variables * @{ */ -const uint8_t APBAHBPrescTable[16] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; /** * @} */ - /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ @@ -701,7 +699,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> APBAHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> POSITION_VAL(RCC_CFGR_HPRE)]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> POSITION_VAL(RCC_CFGR_HPRE)]; /* Configure the source of time base considering new system clocks settings*/ HAL_InitTick (TICK_INT_PRIORITY); @@ -937,7 +935,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBAHBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> POSITION_VAL(RCC_CFGR_PPRE1)]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> POSITION_VAL(RCC_CFGR_PPRE1)]); } /** @@ -949,7 +947,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBAHBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> POSITION_VAL(RCC_CFGR_PPRE2)]); + return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> POSITION_VAL(RCC_CFGR_PPRE2)]); } /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c index be251ef..ab7691c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_rcc_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief Extension RCC HAL module driver. * This file provides firmware functions to manage the following * functionalities RCC extension peripheral: @@ -12,7 +12,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -88,103 +88,6 @@ @endverbatim * @{ */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL and PLLI2S OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval None - */ -void HAL_RCC_DeInit(void) -{ - /* Set HSION bit */ - SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Reset HSEON, CSSON, PLLON, PLLI2S */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON| RCC_CR_PLLI2SON); - - /* Reset PLLCFGR register */ - CLEAR_REG(RCC->PLLCFGR); -#if defined(STM32F413xx) || defined(STM32F423xx) - SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1); -#else - SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2); -#endif /* STM32F413xx || STM32F423xx */ - - /* Reset PLLI2SCFGR register */ - CLEAR_REG(RCC->PLLI2SCFGR); -#if defined(STM32F413xx) || defined(STM32F423xx) - SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1); -#else - SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); -#endif /* STM32F413xx || STM32F423xx */ - - /* Reset HSEBYP bit */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); - - /* Disable all interrupts */ - CLEAR_REG(RCC->CIR); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; -} -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || - STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || - STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE and PLL OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @retval None - */ -void HAL_RCC_DeInit(void) -{ - /* Set HSION bit */ - SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); - - /* Reset CFGR register */ - CLEAR_REG(RCC->CFGR); - - /* Reset HSEON, CSSON, PLLON */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_CSSON | RCC_CR_PLLON); - - /* Reset PLLCFGR register */ - CLEAR_REG(RCC->PLLCFGR); - SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2); - - /* Reset HSEBYP bit */ - CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); - - /* Disable all interrupts */ - CLEAR_REG(RCC->CIR); - - /* Update the SystemCoreClock global variable */ - SystemCoreClock = HSI_VALUE; -} -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ #if defined(STM32F446xx) /** @@ -679,6 +582,8 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) * This parameter can be one of the following values: * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock * @retval Frequency in KHz */ uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) @@ -690,112 +595,277 @@ uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) uint32_t vcoinput = 0U; /* This variable used to store the SAI clock source */ uint32_t saiclocksource = 0U; - if ((PeriphClk == RCC_PERIPHCLK_SAI1) || (PeriphClk == RCC_PERIPHCLK_SAI2)) + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) { - saiclocksource = RCC->DCKCFGR; - saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); - switch (saiclocksource) + case RCC_PERIPHCLK_SAI1: + case RCC_PERIPHCLK_SAI2: { - case 0U: /* PLLSAI is the clock source for SAI*/ + saiclocksource = RCC->DCKCFGR; + saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); + switch (saiclocksource) { - /* Configure the PLLSAI division factor */ - /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + case 0U: /* PLLSAI is the clock source for SAI*/ { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + /* Configure the PLLSAI division factor */ + /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); + } + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); + frequency = frequency/(tmpreg1); + break; } - else - { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); - } - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ - /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ - tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ - tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); - frequency = frequency/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ - { - /* Configure the PLLI2S division factor */ - /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + /* Configure the PLLI2S division factor */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + /* SAI_CLK_x = PLL_VCO Output/PLLR */ + tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; + frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); + break; } - else + case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + frequency = EXTERNAL_CLOCK_VALUE; + break; } - - /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ - /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ - tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; - frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); - - /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ - tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); - frequency = frequency/(tmpreg1); - break; + case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + frequency = (uint32_t)(HSI_VALUE); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + frequency = (uint32_t)(HSE_VALUE); + } + break; + } + default : + { + break; + } } - case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ - case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ + break; + } + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) { - /* Configure the PLLI2S division factor */ - /* PLL_VCO Input = PLL_SOURCE/PLLM */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: { - /* In Case the PLL Source is HSI (Internal Clock) */ - vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; } - else + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: { - /* In Case the PLL Source is HSE (External Clock) */ - vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; } - - /* PLL_VCO Output = PLL_VCO Input * PLLN */ - /* SAI_CLK_x = PLL_VCO Output/PLLR */ - tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; - frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); - break; - } - case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ - { - frequency = EXTERNAL_CLOCK_VALUE; - break; } - case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) { - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: { - /* In Case the PLL Source is HSI (Internal Clock) */ - frequency = (uint32_t)(HSI_VALUE); + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; } - else + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: { - /* In Case the PLL Source is HSE (External Clock) */ - frequency = (uint32_t)(HSE_VALUE); + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; } - break; - } - default : - { - break; - } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; } } - return frequency; + return frequency; } - #endif /* STM32F446xx */ #if defined(STM32F469xx) || defined(STM32F479xx) @@ -1139,6 +1209,73 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; } } + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk: Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} #endif /* STM32F469xx || STM32F479xx */ #if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) @@ -1600,6 +1737,202 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; } } + +/** + * @brief Return the peripheral clock frequency for a given peripheral(I2S..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk: Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + if((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SSRC) == RCC_PLLI2SCFGR_PLLI2SSRC) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(EXTERNAL_CLOCK_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + } + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} #endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) @@ -1751,11 +2084,90 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) } -#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) /** - * @brief Initializes the RCC extended peripherals clocks according to the specified + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk: Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPBCLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPBCLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified * parameters in the RCC_PeriphCLKInitTypeDef. * @param PeriphClkInit: pointer to an RCC_PeriphCLKInitTypeDef structure that * contains the configuration information for the Extended Peripherals @@ -2024,6 +2436,72 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) } } +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk: Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S */ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ @@ -2049,7 +2527,8 @@ HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClk assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); /*---------------------------- I2S configuration ---------------------------*/ - if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == (RCC_PERIPHCLK_I2S)) + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) || + (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S)) { /* check for Parameters */ assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); @@ -2196,8 +2675,343 @@ void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) } #endif /* STM32F401xC || STM32F401xE || STM32F411xE */ } + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk: Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_I2S: I2S peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* This variable used to store the I2S clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SCLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SCLKSOURCE_PLLI2S: + { +#if defined(STM32F411xE) + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } +#else + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } +#endif /* STM32F411xE */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + return frequency; +} #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Select LSE mode + * + * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * + * @param Mode: specifies the LSE mode. + * This parameter can be one of the following values: + * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection + * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection + * @retval None + */ +void HAL_RCCEx_SelectLSEMode(uint8_t Mode) +{ + /* Check the parameters */ + assert_param(IS_RCC_LSE_MODE(Mode)); + if(Mode == RCC_LSE_HIGHDRIVE_MODE) + { + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } + else + { + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); + } +} + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F446xx) +/** + * @brief Returns the SYSCLK frequency + * + * @note This function implementation is valid only for STM32F446xx devices. + * @note This function add the PLL/PLLR System clock source + * + * @note The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) + * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baudrate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t pllm = 0U; + uint32_t pllvco = 0U; + uint32_t pllp = 0U; + uint32_t pllr = 0U; + uint32_t sysclockfreq = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + break; + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLP */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); + } + else + { + /* HSI used as PLL clock source */ + pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> POSITION_VAL(RCC_PLLCFGR_PLLP)) + 1U) *2U); + + sysclockfreq = pllvco/pllp; + break; + } + case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ + { + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR */ + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source */ + pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); + } + else + { + /* HSI used as PLL clock source */ + pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); + } + pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> POSITION_VAL(RCC_PLLCFGR_PLLR)); + + sysclockfreq = pllvco/pllr; + break; + } + default: + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} +#endif /* STM32F446xx */ + +/** + * @} + */ + +/** + * @} + */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE, PLL, PLLI2S and PLLSAI OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval None + */ +void HAL_RCC_DeInit(void) +{ + /* Set HSION bit */ + SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Reset HSEON, CSSON, PLLON, PLLI2S bits */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON | RCC_CR_PLLON | RCC_CR_PLLI2SON); + +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + /* Reset PLLSAI bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + + /* Reset PLLCFGR register */ + CLEAR_REG(RCC->PLLCFGR); +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLR_1); +#else + SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_2); +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx || STM32F469xx || STM32F479xx */ + + /* Reset PLLI2SCFGR register */ + CLEAR_REG(RCC->PLLI2SCFGR); +#if defined(STM32F412Cx) || defined(STM32F412Rx) || defined(STM32F412Vx) || defined(STM32F412Zx) || defined(STM32F413xx) || \ + defined(STM32F423xx) || defined(STM32F446xx) + SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1); +#elif defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) + SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); +#elif defined(STM32F411xE) + SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SR_1); +#else + SET_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN_6 | RCC_PLLI2SCFGR_PLLI2SN_7 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SR_1); +#endif /* STM32F412Cx || STM32F412Rx || STM32F412Vx || STM32F412Zx || STM32F413xx || STM32F423xx || STM32F446xx */ + + /* Reset PLLSAICFGR register */ +#if defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + CLEAR_REG(RCC->PLLSAICFGR); + SET_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIR_1); +#elif defined(STM32F446xx) + CLEAR_REG(RCC->PLLSAICFGR); + SET_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIN_6 | RCC_PLLSAICFGR_PLLSAIN_7 | RCC_PLLSAICFGR_PLLSAIQ_2); +#endif /* STM32F427xx || STM32F429xx || STM32F437xx || STM32F439xx || STM32F469xx || STM32F479xx */ + + /* Disable all interrupts */ + CLEAR_REG(RCC->CIR); + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval None + */ +void HAL_RCC_DeInit(void) +{ + /* Set HSION bit */ + SET_BIT(RCC->CR, RCC_CR_HSION | RCC_CR_HSITRIM_4); + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Reset HSEON, HSEBYP, CSSON, PLLON */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_CSSON | RCC_CR_PLLON); + + /* Reset PLLCFGR register */ + CLEAR_REG(RCC->PLLCFGR); + SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR_0 | RCC_PLLCFGR_PLLR_1 | RCC_PLLCFGR_PLLR_2 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLQ_0 | RCC_PLLCFGR_PLLQ_1 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLQ_3); + + /* Disable all interrupts */ + CLEAR_REG(RCC->CIR); + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; +} +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + #if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) /** @@ -2610,148 +3424,6 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ -#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ - defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) -/** - * @brief Select LSE mode - * - * @note This mode is only available for STM32F410xx/STM32F411xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. - * - * @param Mode: specifies the LSE mode. - * This parameter can be one of the following values: - * @arg RCC_LSE_LOWPOWER_MODE: LSE oscillator in low power mode selection - * @arg RCC_LSE_HIGHDRIVE_MODE: LSE oscillator in High Drive mode selection - * @retval None - */ -void HAL_RCCEx_SelectLSEMode(uint8_t Mode) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE_MODE(Mode)); - if(Mode == RCC_LSE_HIGHDRIVE_MODE) - { - SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } - else - { - CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); - } -} - -#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ - -#if defined(STM32F446xx) -/** - * @brief Returns the SYSCLK frequency - * - * @note This function implementation is valid only for STM32F446xx devices. - * @note This function add the PLL/PLLR System clock source - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL or PLLR, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * - * @note Each time SYSCLK changes, this function must be called to update the - * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. - * - * - * @retval SYSCLK frequency - */ -uint32_t HAL_RCC_GetSysClockFreq(void) -{ - uint32_t pllm = 0U; - uint32_t pllvco = 0U; - uint32_t pllp = 0U; - uint32_t pllr = 0U; - uint32_t sysclockfreq = 0U; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ - { - sysclockfreq = HSI_VALUE; - break; - } - case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ - { - sysclockfreq = HSE_VALUE; - break; - } - case RCC_CFGR_SWS_PLL: /* PLL/PLLP used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); - } - else - { - /* HSI used as PLL clock source */ - pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); - } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> POSITION_VAL(RCC_PLLCFGR_PLLP)) + 1U) *2U); - - sysclockfreq = pllvco/pllp; - break; - } - case RCC_CFGR_SWS_PLLR: /* PLL/PLLR used as system clock source */ - { - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR */ - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - { - /* HSE used as PLL clock source */ - pllvco = ((HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); - } - else - { - /* HSI used as PLL clock source */ - pllvco = ((HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> POSITION_VAL(RCC_PLLCFGR_PLLN))); - } - pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> POSITION_VAL(RCC_PLLCFGR_PLLR)); - - sysclockfreq = pllvco/pllr; - break; - } - default: - { - sysclockfreq = HSI_VALUE; - break; - } - } - return sysclockfreq; -} -#endif /* STM32F446xx */ - -/** - * @} - */ - -/** - * @} - */ - #endif /* HAL_RCC_MODULE_ENABLED */ /** * @} diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c index f679cff..bc9bb92 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_rng.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief RNG HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Random Number Generator (RNG) peripheral: @@ -29,7 +29,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c index a2bb2e2..5f6bc1d 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_rtc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief RTC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Real Time Clock (RTC) peripheral: @@ -108,7 +108,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -299,10 +299,10 @@ HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc) else { /* Reset TR, DR and CR registers */ - hrtc->Instance->TR = (uint32_t)0x00000000U; - hrtc->Instance->DR = (uint32_t)0x00002101U; + hrtc->Instance->TR = 0x00000000U; + hrtc->Instance->DR = 0x00002101U; /* Reset All CR bits except CR[2:0] */ - hrtc->Instance->CR &= (uint32_t)0x00000007U; + hrtc->Instance->CR &= 0x00000007U; /* Get tick */ tickstart = HAL_GetTick(); @@ -323,19 +323,19 @@ HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc) } /* Reset all RTC CR register bits */ - hrtc->Instance->CR &= (uint32_t)0x00000000U; - hrtc->Instance->WUTR = (uint32_t)0x0000FFFFU; - hrtc->Instance->PRER = (uint32_t)0x007F00FFU; - hrtc->Instance->CALIBR = (uint32_t)0x00000000U; - hrtc->Instance->ALRMAR = (uint32_t)0x00000000U; - hrtc->Instance->ALRMBR = (uint32_t)0x00000000U; - hrtc->Instance->SHIFTR = (uint32_t)0x00000000U; - hrtc->Instance->CALR = (uint32_t)0x00000000U; - hrtc->Instance->ALRMASSR = (uint32_t)0x00000000U; - hrtc->Instance->ALRMBSSR = (uint32_t)0x00000000U; + hrtc->Instance->CR &= 0x00000000U; + hrtc->Instance->WUTR = 0x0000FFFFU; + hrtc->Instance->PRER = 0x007F00FFU; + hrtc->Instance->CALIBR = 0x00000000U; + hrtc->Instance->ALRMAR = 0x00000000U; + hrtc->Instance->ALRMBR = 0x00000000U; + hrtc->Instance->SHIFTR = 0x00000000U; + hrtc->Instance->CALR = 0x00000000U; + hrtc->Instance->ALRMASSR = 0x00000000U; + hrtc->Instance->ALRMBSSR = 0x00000000U; /* Reset ISR register and exit initialization mode */ - hrtc->Instance->ISR = (uint32_t)0x00000000U; + hrtc->Instance->ISR = 0x00000000U; /* Reset Tamper and alternate functions configuration register */ hrtc->Instance->TAFCR = 0x00000000U; @@ -578,7 +578,7 @@ HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTim /* Fill the structure fields with the read parameters */ sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16U); - sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8U); + sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >> 8U); sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16U); @@ -1060,7 +1060,7 @@ HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef /* Wait till RTC ALRAWF flag is set and if Time out is reached exit */ do { - if (count-- == 0) + if (count-- == 0U) { /* Enable the write protection for RTC registers */ __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); @@ -1094,7 +1094,7 @@ HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef /* Wait till RTC ALRBWF flag is set and if Time out is reached exit */ do { - if (count-- == 0) + if (count-- == 0U) { /* Enable the write protection for RTC registers */ __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc); @@ -1527,8 +1527,8 @@ uint8_t RTC_ByteToBcd2(uint8_t Value) uint8_t RTC_Bcd2ToByte(uint8_t Value) { uint32_t tmp = 0U; - tmp = ((uint8_t)(Value & (uint8_t)0xF0U) >> (uint8_t)0x4U) * 10U; - return (tmp + (Value & (uint8_t)0x0FU)); + tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; + return (tmp + (Value & (uint8_t)0x0F)); } /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c index 76b712e..01e047b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_rtc_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief RTC HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Real Time Clock (RTC) Extension peripheral: @@ -69,7 +69,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c index 1d18858..86a0e20 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_sai.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SAI HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Serial Audio Interface (SAI) peripheral: @@ -145,7 +145,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -631,7 +631,7 @@ HAL_StatusTypeDef HAL_SAI_Transmit(SAI_HandleTypeDef *hsai, uint8_t* pData, uint { uint32_t tickstart = HAL_GetTick(); - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -731,7 +731,7 @@ HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint1 { uint32_t tickstart = HAL_GetTick(); - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -826,7 +826,7 @@ HAL_StatusTypeDef HAL_SAI_Receive(SAI_HandleTypeDef *hsai, uint8_t *pData, uint1 */ HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -888,7 +888,7 @@ HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, u */ HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -1090,7 +1090,7 @@ HAL_StatusTypeDef HAL_SAI_Abort(SAI_HandleTypeDef *hsai) */ HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -1852,7 +1852,7 @@ static uint32_t SAI_InterruptFlag(SAI_HandleTypeDef *hsai, uint32_t mode) */ static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai) { - register uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock /7/1000); + register uint32_t count = SAI_DEFAULT_TIMEOUT * (SystemCoreClock /7U/1000U); HAL_StatusTypeDef status = HAL_OK; /* Disable the SAI instance */ @@ -1861,7 +1861,7 @@ static HAL_StatusTypeDef SAI_Disable(SAI_HandleTypeDef *hsai) do { /* Check for the Timeout */ - if (count-- == 0) + if (count-- == 0U) { /* Update error code */ hsai->ErrorCode |= HAL_SAI_ERROR_TIMEOUT; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c index 2e5d02c..67ae832 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_sai_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SAI Extension HAL module driver. * This file provides firmware functions to manage the following * functionalities of SAI extension peripheral: @@ -27,7 +27,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c index 9ca7045..27097f6 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c @@ -2,15 +2,15 @@ ****************************************************************************** * @file stm32f4xx_hal_sd.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SD card HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Secure Digital (SD) peripheral: * + Initialization and de-initialization functions * + IO operation functions * + Peripheral Control functions - * + Peripheral State functions + * + SD card Control functions * @verbatim ============================================================================== @@ -43,35 +43,49 @@ (+++) Configure the SDIO and DMA interrupt priorities using functions HAL_NVIC_SetPriority(); DMA priority is superior to SDIO's priority (+++) Enable the NVIC DMA and SDIO IRQs using function HAL_NVIC_EnableIRQ() - (+++) SDIO interrupts are managed using the macros __HAL_SD_SDIO_ENABLE_IT() - and __HAL_SD_SDIO_DISABLE_IT() inside the communication process. - (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_SDIO_GET_IT() - and __HAL_SD_SDIO_CLEAR_IT() + (+++) SDIO interrupts are managed using the macros __HAL_SD_ENABLE_IT() + and __HAL_SD_DISABLE_IT() inside the communication process. + (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_GET_IT() + and __HAL_SD_CLEAR_IT() + (##) NVIC configuration if you need to use interrupt process (HAL_SD_ReadBlocks_IT() + and HAL_SD_WriteBlocks_IT() APIs). + (+++) Configure the SDIO interrupt priorities using function + HAL_NVIC_SetPriority(); + (+++) Enable the NVIC SDIO IRQs using function HAL_NVIC_EnableIRQ() + (+++) SDIO interrupts are managed using the macros __HAL_SD_ENABLE_IT() + and __HAL_SD_DISABLE_IT() inside the communication process. + (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_GET_IT() + and __HAL_SD_CLEAR_IT() (#) At this stage, you can perform SD read/write/erase operations after SD card initialization *** SD Card Initialization and configuration *** ================================================ [..] - To initialize the SD Card, use the HAL_SD_Init() function. It Initializes - the SD Card and put it into Standby State (Ready for data transfer). + To initialize the SD Card, use the HAL_SD_Init() function. It Initializes + SDIO IP(STM32 side) and the SD Card, and put it into StandBy State (Ready for data transfer). This function provide the following operations: - - (#) Apply the SD Card initialization process at 400KHz and check the SD Card - type (Standard Capacity or High Capacity). You can change or adapt this - frequency by adjusting the "ClockDiv" field. + + (#) Initialize the SDIO peripheral interface with defaullt configuration. + The initialization process is done at 400KHz. You can change or adapt + this frequency by adjusting the "ClockDiv" field. The SD Card frequency (SDIO_CK) is computed as follows: SDIO_CK = SDIOCLK / (ClockDiv + 2) In initialization mode and according to the SD Card standard, make sure that the SDIO_CK frequency doesn't exceed 400KHz. - - (#) Get the SD CID and CSD data. All these information are managed by the SDCardInfo - structure. This structure provide also ready computed SD Card capacity - and Block size. - - -@- These information are stored in SD handle structure in case of future use. + + This phase of initialization is done through SDIO_Init() and + SDIO_PowerState_ON() SDIO low level APIs. + + (#) Initialize the SD card. The API used is HAL_SD_InitCard(). + This phase allows the card initialization and identification + and check the SD Card type (Standard Capacity or High Capacity) + The initialization flow is compatible with SD standard. + + This API (HAL_SD_InitCard()) could be used also to reinitialize the card in case + of plug-off plug-in. (#) Configure the SD Card Data transfer frequency. By Default, the card transfer frequency is set to 24MHz. You can change or adapt this frequency by adjusting @@ -90,66 +104,101 @@ ============================== [..] (+) You can read from SD card in polling mode by using function HAL_SD_ReadBlocks(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). + This function allows the read of 512 bytes blocks. You can choose either one block read operation or multiple block read operation by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. (+) You can read from SD card in DMA mode by using function HAL_SD_ReadBlocks_DMA(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. + You could also check the DMA transfer process through the SD Rx interrupt event. + + (+) You can read from SD card in Interrupt mode by using function HAL_SD_ReadBlocks_IT(). + This function allows the read of 512 bytes blocks. You can choose either one block read operation or multiple block read operation by adjusting the "NumberOfBlocks" parameter. - After this, you have to call the function HAL_SD_CheckReadOperation(), to insure - that the read transfer is done correctly in both DMA and SD sides. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. + You could also check the IT transfer process through the SD Rx interrupt event. *** SD Card Write operation *** =============================== [..] (+) You can write to SD card in polling mode by using function HAL_SD_WriteBlocks(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). + This function allows the read of 512 bytes blocks. You can choose either one block read operation or multiple block read operation by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. (+) You can write to SD card in DMA mode by using function HAL_SD_WriteBlocks_DMA(). - This function support only 512-bytes block length (the block size should be - chosen as 512 byte). + This function allows the read of 512 bytes blocks. + You can choose either one block read operation or multiple block read operation + by adjusting the "NumberOfBlocks" parameter. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. + You could also check the DMA transfer process through the SD Tx interrupt event. + + (+) You can write to SD card in Interrupt mode by using function HAL_SD_WriteBlocks_IT(). + This function allows the read of 512 bytes blocks. You can choose either one block read operation or multiple block read operation by adjusting the "NumberOfBlocks" parameter. - After this, you have to call the function HAL_SD_CheckWriteOperation(), to insure - that the write transfer is done correctly in both DMA and SD sides. + After this, you have to ensure that the transfer is done correctly. The check is done + through HAL_SD_GetCardState() function for SD card state. + You could also check the IT transfer process through the SD Tx interrupt event. *** SD card status *** ====================== [..] - (+) At any time, you can check the SD Card status and get the SD card state - by using the HAL_SD_GetStatus() function. This function checks first if the - SD card is still connected and then get the internal SD Card transfer state. - (+) You can also get the SD card SD Status register by using the HAL_SD_SendSDStatus() - function. + (+) The SD Status contains status bits that are related to the SD Memory + Card proprietary features. To get SD card status use the HAL_SD_GetCardStatus(). + + *** SD card information *** + =========================== + [..] + (+) To get SD card information, you can use the function HAL_SD_GetCardInfo(). + It returns useful information about the SD card such as block size, card type, + block number ... + + *** SD card CSD register *** + ============================ + [..] + (+) The HAL_SD_GetCardCSD() API allows to get the parameters of the CSD register. + Some of the CSD parameters are useful for card initialization and identification. + + *** SD card CID register *** + ============================ + [..] + (+) The HAL_SD_GetCardCID() API allows to get the parameters of the CID register. + Some of the CSD parameters are useful for card initialization and identification. *** SD HAL driver macros list *** ================================== [..] Below the list of most used macros in SD HAL driver. - - (+) __HAL_SD_SDIO_ENABLE : Enable the SD device - (+) __HAL_SD_SDIO_DISABLE : Disable the SD device - (+) __HAL_SD_SDIO_DMA_ENABLE: Enable the SDIO DMA transfer - (+) __HAL_SD_SDIO_DMA_DISABLE: Disable the SDIO DMA transfer - (+) __HAL_SD_SDIO_ENABLE_IT: Enable the SD device interrupt - (+) __HAL_SD_SDIO_DISABLE_IT: Disable the SD device interrupt - (+) __HAL_SD_SDIO_GET_FLAG:Check whether the specified SD flag is set or not - (+) __HAL_SD_SDIO_CLEAR_FLAG: Clear the SD's pending flags - + + (+) __HAL_SD_ENABLE : Enable the SD device + (+) __HAL_SD_DISABLE : Disable the SD device + (+) __HAL_SD_DMA_ENABLE: Enable the SDIO DMA transfer + (+) __HAL_SD_DMA_DISABLE: Disable the SDIO DMA transfer + (+) __HAL_SD_ENABLE_IT: Enable the SD device interrupt + (+) __HAL_SD_DISABLE_IT: Disable the SD device interrupt + (+) __HAL_SD_GET_FLAG:Check whether the specified SD flag is set or not + (+) __HAL_SD_CLEAR_FLAG: Clear the SD's pending flags + + [..] (@) You can refer to the SD HAL driver header file for more useful macros @endverbatim ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -179,12 +228,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" -#ifdef HAL_SD_MODULE_ENABLED -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ - defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ - defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ - defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ - defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) /** @addtogroup STM32F4xx_HAL_Driver * @{ */ @@ -193,91 +236,20 @@ * @{ */ +#ifdef HAL_SD_MODULE_ENABLED + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /** @addtogroup SD_Private_Defines * @{ */ -/** - * @brief SDIO Data block size - */ -#define DATA_BLOCK_SIZE ((uint32_t)(9U << 4U)) -/** - * @brief SDIO Static flags, Timeout, FIFO Address - */ -#define SDIO_STATIC_FLAGS ((uint32_t)(SDIO_FLAG_CCRCFAIL | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_CTIMEOUT |\ - SDIO_FLAG_DTIMEOUT | SDIO_FLAG_TXUNDERR | SDIO_FLAG_RXOVERR |\ - SDIO_FLAG_CMDREND | SDIO_FLAG_CMDSENT | SDIO_FLAG_DATAEND |\ - SDIO_FLAG_DBCKEND)) - -#define SDIO_CMD0TIMEOUT ((uint32_t)0x00010000U) - -/** - * @brief Mask for errors Card Status R1 (OCR Register) - */ -#define SD_OCR_ADDR_OUT_OF_RANGE ((uint32_t)0x80000000U) -#define SD_OCR_ADDR_MISALIGNED ((uint32_t)0x40000000U) -#define SD_OCR_BLOCK_LEN_ERR ((uint32_t)0x20000000U) -#define SD_OCR_ERASE_SEQ_ERR ((uint32_t)0x10000000U) -#define SD_OCR_BAD_ERASE_PARAM ((uint32_t)0x08000000U) -#define SD_OCR_WRITE_PROT_VIOLATION ((uint32_t)0x04000000U) -#define SD_OCR_LOCK_UNLOCK_FAILED ((uint32_t)0x01000000U) -#define SD_OCR_COM_CRC_FAILED ((uint32_t)0x00800000U) -#define SD_OCR_ILLEGAL_CMD ((uint32_t)0x00400000U) -#define SD_OCR_CARD_ECC_FAILED ((uint32_t)0x00200000U) -#define SD_OCR_CC_ERROR ((uint32_t)0x00100000U) -#define SD_OCR_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00080000U) -#define SD_OCR_STREAM_READ_UNDERRUN ((uint32_t)0x00040000U) -#define SD_OCR_STREAM_WRITE_OVERRUN ((uint32_t)0x00020000U) -#define SD_OCR_CID_CSD_OVERWRITE ((uint32_t)0x00010000U) -#define SD_OCR_WP_ERASE_SKIP ((uint32_t)0x00008000U) -#define SD_OCR_CARD_ECC_DISABLED ((uint32_t)0x00004000U) -#define SD_OCR_ERASE_RESET ((uint32_t)0x00002000U) -#define SD_OCR_AKE_SEQ_ERROR ((uint32_t)0x00000008U) -#define SD_OCR_ERRORBITS ((uint32_t)0xFDFFE008U) - -/** - * @brief Masks for R6 Response - */ -#define SD_R6_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00002000U) -#define SD_R6_ILLEGAL_CMD ((uint32_t)0x00004000U) -#define SD_R6_COM_CRC_FAILED ((uint32_t)0x00008000U) - -#define SD_VOLTAGE_WINDOW_SD ((uint32_t)0x80100000U) -#define SD_HIGH_CAPACITY ((uint32_t)0x40000000U) -#define SD_STD_CAPACITY ((uint32_t)0x00000000U) -#define SD_CHECK_PATTERN ((uint32_t)0x000001AAU) - -#define SD_MAX_VOLT_TRIAL ((uint32_t)0x0000FFFFU) -#define SD_ALLZERO ((uint32_t)0x00000000U) - -#define SD_WIDE_BUS_SUPPORT ((uint32_t)0x00040000U) -#define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000U) -#define SD_CARD_LOCKED ((uint32_t)0x02000000U) - -#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFFU) -#define SD_0TO7BITS ((uint32_t)0x000000FFU) -#define SD_8TO15BITS ((uint32_t)0x0000FF00U) -#define SD_16TO23BITS ((uint32_t)0x00FF0000U) -#define SD_24TO31BITS ((uint32_t)0xFF000000U) -#define SD_MAX_DATA_LENGTH ((uint32_t)0x01FFFFFFU) - -#define SD_HALFFIFO ((uint32_t)0x00000008U) -#define SD_HALFFIFOBYTES ((uint32_t)0x00000020U) - -/** - * @brief Command Class Supported - */ -#define SD_CCCC_LOCK_UNLOCK ((uint32_t)0x00000080U) -#define SD_CCCC_WRITE_PROT ((uint32_t)0x00000040U) -#define SD_CCCC_ERASE ((uint32_t)0x00000020U) - -/** - * @brief Following commands are SD Card Specific commands. - * SDIO_APP_CMD should be sent before sending these commands. - */ -#define SD_SDIO_SEND_IF_COND ((uint32_t)SD_CMD_HS_SEND_EXT_CSD) - + /** * @} */ @@ -285,32 +257,29 @@ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SD_Private_Functions_Prototypes +/* Private functions ---------------------------------------------------------*/ +/** @defgroup SD_Private_Functions SD Private Functions * @{ */ -static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr); -static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus); -static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus); -static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD); -static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA); -static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR); -static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma); -static void SD_DMA_RxError(DMA_HandleTypeDef *hdma); -static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma); -static void SD_DMA_TxError(DMA_HandleTypeDef *hdma); +static uint32_t SD_InitCard(SD_HandleTypeDef *hsd); +static uint32_t SD_PowerON(SD_HandleTypeDef *hsd); +static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus); +static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus); +static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd); +static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd); +static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR); +static HAL_StatusTypeDef SD_PowerOFF(SD_HandleTypeDef *hsd); +static HAL_StatusTypeDef SD_Write_IT(SD_HandleTypeDef *hsd); +static HAL_StatusTypeDef SD_Read_IT(SD_HandleTypeDef *hsd); +static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void SD_DMAError(DMA_HandleTypeDef *hdma); +static void SD_DMATxAbort(DMA_HandleTypeDef *hdma); +static void SD_DMARxAbort(DMA_HandleTypeDef *hdma); /** * @} */ + /* Exported functions --------------------------------------------------------*/ /** @addtogroup SD_Exported_Functions * @{ @@ -319,85 +288,140 @@ static void SD_DMA_TxError(DMA_HandleTypeDef *hdma); /** @addtogroup SD_Exported_Functions_Group1 * @brief Initialization and de-initialization functions * -@verbatim +@verbatim ============================================================================== ##### Initialization and de-initialization functions ##### ============================================================================== [..] This section provides functions allowing to initialize/de-initialize the SD card device to be ready for use. - - + @endverbatim * @{ */ /** - * @brief Initializes the SD card according to the specified parameters in the + * @brief Initializes the SD according to the specified parameters in the SD_HandleTypeDef and create the associated handle. - * @param hsd: SD handle - * @param SDCardInfo: HAL_SD_CardInfoTypedef structure for SD card information - * @retval HAL SD error state + * @param hsd: Pointer to the SD handle + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo) -{ - __IO HAL_SD_ErrorTypedef errorstate = SD_OK; - SD_InitTypeDef tmpinit; +HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd) +{ + /* Check the SD handle allocation */ + if(hsd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance)); + assert_param(IS_SDIO_CLOCK_EDGE(hsd->Init.ClockEdge)); + assert_param(IS_SDIO_CLOCK_BYPASS(hsd->Init.ClockBypass)); + assert_param(IS_SDIO_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave)); + assert_param(IS_SDIO_BUS_WIDE(hsd->Init.BusWide)); + assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl)); + assert_param(IS_SDIO_CLKDIV(hsd->Init.ClockDiv)); + + if(hsd->State == HAL_SD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hsd->Lock = HAL_UNLOCKED; + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + HAL_SD_MspInit(hsd); + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize the Card parameters */ + HAL_SD_InitCard(hsd); + + /* Initialize the error code */ + hsd->ErrorCode = HAL_DMA_ERROR_NONE; - /* Allocate lock resource and initialize it */ - hsd->Lock = HAL_UNLOCKED; - /* Initialize the low level hardware (MSP) */ - HAL_SD_MspInit(hsd); + /* Initialize the SD operation */ + hsd->Context = SD_CONTEXT_NONE; + + /* Initialize the SD state */ + hsd->State = HAL_SD_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initializes the SD Card. + * @param hsd: Pointer to SD handle + * @note This function initializes the SD card. It could be used when a card + re-initialization is needed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd) +{ + uint32_t errorstate = HAL_SD_ERROR_NONE; + SD_InitTypeDef Init; /* Default SDIO peripheral configuration for SD card initialization */ - tmpinit.ClockEdge = SDIO_CLOCK_EDGE_RISING; - tmpinit.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - tmpinit.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - tmpinit.BusWide = SDIO_BUS_WIDE_1B; - tmpinit.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; - tmpinit.ClockDiv = SDIO_INIT_CLK_DIV; - + Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + Init.BusWide = SDIO_BUS_WIDE_1B; + Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + Init.ClockDiv = SDIO_INIT_CLK_DIV; + /* Initialize SDIO peripheral interface with default configuration */ - SDIO_Init(hsd->Instance, tmpinit); + SDIO_Init(hsd->Instance, Init); + + /* Disable SDIO Clock */ + __HAL_SD_DISABLE(hsd); - /* Identify card operating voltage */ - errorstate = SD_PowerON(hsd); + /* Set Power State to ON */ + SDIO_PowerState_ON(hsd->Instance); - if(errorstate != SD_OK) - { - return errorstate; - } + /* Enable SDIO Clock */ + __HAL_SD_ENABLE(hsd); - /* Initialize the present SDIO card(s) and put them in idle state */ - errorstate = SD_Initialize_Cards(hsd); + /* Required power up waiting time before starting the SD initialization + sequence */ + HAL_Delay(2U); - if (errorstate != SD_OK) + /* Identify card operating voltage */ + errorstate = SD_PowerON(hsd); + if(errorstate != HAL_SD_ERROR_NONE) { - return errorstate; + hsd->State = HAL_SD_STATE_READY; + hsd->ErrorCode |= errorstate; + return HAL_ERROR; } - - /* Read CSD/CID MSD registers */ - errorstate = HAL_SD_Get_CardInfo(hsd, SDCardInfo); - - if (errorstate == SD_OK) + + /* Card initialization */ + errorstate = SD_InitCard(hsd); + if(errorstate != HAL_SD_ERROR_NONE) { - /* Select the Card */ - errorstate = SD_Select_Deselect(hsd, (uint32_t)(((uint32_t)SDCardInfo->RCA) << 16U)); + hsd->State = HAL_SD_STATE_READY; + hsd->ErrorCode |= errorstate; + return HAL_ERROR; } - - /* Configure SDIO peripheral interface */ - SDIO_Init(hsd->Instance, hsd->Init); - - return errorstate; + + return HAL_OK; } /** * @brief De-Initializes the SD card. - * @param hsd: SD handle + * @param hsd: Pointer to SD handle * @retval HAL status */ HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd) { + /* Check the SD handle allocation */ + if(hsd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance)); + + hsd->State = HAL_SD_STATE_BUSY; /* Set SD power state to off */ SD_PowerOFF(hsd); @@ -405,19 +429,23 @@ HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd) /* De-Initialize the MSP layer */ HAL_SD_MspDeInit(hsd); + hsd->ErrorCode = HAL_SD_ERROR_NONE; + hsd->State = HAL_SD_STATE_RESET; + return HAL_OK; } /** * @brief Initializes the SD MSP. - * @param hsd: SD handle + * @param hsd: Pointer to SD handle * @retval None */ __weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ UNUSED(hsd); + /* NOTE : This function Should not be modified, when the callback is needed, the HAL_SD_MspInit could be implemented in the user file */ @@ -425,13 +453,14 @@ __weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd) /** * @brief De-Initialize SD MSP. - * @param hsd: SD handle + * @param hsd: Pointer to SD handle * @retval None */ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ UNUSED(hsd); + /* NOTE : This function Should not be modified, when the callback is needed, the HAL_SD_MspDeInit could be implemented in the user file */ @@ -458,1075 +487,1223 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd) /** * @brief Reads block(s) from a specified address in a card. The Data transfer - * is managed by polling mode. - * @param hsd: SD handle - * @param pReadBuffer: pointer to the buffer that will contain the received data - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of SD blocks to read - * @retval SD Card error state + * is managed by polling mode. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @param hsd: Pointer to SD handle + * @param pData: pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read + * @param NumberOfBlocks: Number of SD blocks to read + * @param Timeout: Specify timeout value + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) +HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t count = 0U, *tempbuff = (uint32_t *)pReadBuffer; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0U; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512U; - ReadAddr /= 512U; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t) BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); + uint32_t count = 0U, *tempbuff = (uint32_t *)pData; - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize; - sdio_datainitstructure.DataBlockSize = DATA_BLOCK_SIZE; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - if(NumberOfBlocks > 1U) - { - /* Send CMD18 READ_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK; - } - else + if(NULL == pData) { - /* Send CMD17 READ_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; } - - sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Read block(s) in polling mode */ - if(NumberOfBlocks > 1U) + + if(hsd->State == HAL_SD_STATE_READY) { - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK); + hsd->ErrorCode = HAL_DMA_ERROR_NONE; - if (errorstate != SD_OK) + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) { - return errorstate; + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; + + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; } + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = NumberOfBlocks * BLOCKSIZE; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); + + /* Read block(s) in polling mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK; + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK; + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + /* Poll on SDIO flags */ #ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_STA_STBITERR)) #else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) #endif /* SDIO_STA_STBITERR */ { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) { /* Read data from SDIO Rx FIFO */ - for (count = 0U; count < 8U; count++) + for(count = 0U; count < 8U; count++) { *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); } - tempbuff += 8U; } - } + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT; + hsd->State= HAL_SD_STATE_READY; + return HAL_TIMEOUT; + } + } + + /* Send stop transmission command in case of multiblock read */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) + { + if(hsd->SdCard.CardType != CARD_SECURED) + { + /* Send stop transmission command */ + errorstate = SDMMC_CmdStopTransfer(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + } + } + + /* Get error state */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Empty FIFO if there is still any data */ + while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))) + { + *tempbuff = SDIO_ReadFIFO(hsd->Instance); + tempbuff++; + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT; + hsd->State= HAL_SD_STATE_READY; + return HAL_ERROR; + } + } + + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + + hsd->State = HAL_SD_STATE_READY; + + return HAL_OK; } else { - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK); + hsd->ErrorCode |= HAL_SD_ERROR_BUSY; + return HAL_ERROR; + } +} + +/** + * @brief Allows to write block(s) to a specified address in a card. The Data + * transfer is managed by polling mode. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @param hsd: Pointer to SD handle + * @param pData: pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written + * @param NumberOfBlocks: Number of SD blocks to write + * @param Timeout: Specify timeout value + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); + uint32_t count = 0U; + uint32_t *tempbuff = (uint32_t *)pData; + + if(NULL == pData) + { + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; + } + + if(hsd->State == HAL_SD_STATE_READY) + { + hsd->ErrorCode = HAL_DMA_ERROR_NONE; - if (errorstate != SD_OK) + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) { - return errorstate; - } + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; + + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK; + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK; + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = NumberOfBlocks * BLOCKSIZE; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); - /* In case of single block transfer, no need of stop transfer at all */ + /* Write block(s) in polling mode */ #ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) #else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) #endif /* SDIO_STA_STBITERR */ { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE)) { - /* Read data from SDIO Rx FIFO */ - for (count = 0U; count < 8U; count++) + /* Write data to SDIO Tx FIFO */ + for(count = 0U; count < 8U; count++) { - *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); + SDIO_WriteFIFO(hsd->Instance, (tempbuff + count)); } - tempbuff += 8U; } + + if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_TIMEOUT; + } } - } - - /* Send stop transmission command in case of multiblock read */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) - { - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) ||\ - (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send stop transmission command */ - errorstate = HAL_SD_StopTransfer(hsd); - } - } - - /* Get error state */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); + /* Send stop transmission command in case of multiblock write */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) + { + if(hsd->SdCard.CardType != CARD_SECURED) + { + /* Send stop transmission command */ + errorstate = SDMMC_CmdStopTransfer(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + } + } - errorstate = SD_RX_OVERRUN; + /* Get error state */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR)) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } - return errorstate; - } -#ifdef SDIO_STA_STBITERR - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - errorstate = SD_START_BIT_ERR; + hsd->State = HAL_SD_STATE_READY; - return errorstate; + return HAL_OK; } -#endif /* SDIO_STA_STBITERR */ else { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - - /* Empty FIFO if there is still any data */ - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0U)) - { - *tempbuff = SDIO_ReadFIFO(hsd->Instance); - tempbuff++; - count--; + hsd->ErrorCode |= HAL_SD_ERROR_BUSY; + return HAL_ERROR; } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; } /** - * @brief Allows to write block(s) to a specified address in a card. The Data - * transfer is managed by polling mode. - * @param hsd: SD handle - * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of SD blocks to write - * @retval SD Card error state + * @brief Reads block(s) from a specified address in a card. The Data transfer + * is managed in interrupt mode. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @note You could also check the IT transfer process through the SD Rx + * interrupt event. + * @param hsd: Pointer to SD handle + * @param pData: Pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read + * @param NumberOfBlocks: Number of blocks to read. + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) +HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t totalnumberofbytes = 0U, bytestransferred = 0U, count = 0U, restwords = 0U; - uint32_t *tempbuff = (uint32_t *)pWriteBuffer; - uint8_t cardstate = 0U; + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; - /* Initialize data control register */ - hsd->Instance->DCTRL = 0U; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) + if(NULL == pData) { - BlockSize = 512U; - WriteAddr /= 512U; + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; } - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) + if(hsd->State == HAL_SD_STATE_READY) { - return errorstate; - } - - if(NumberOfBlocks > 1U) - { - /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK; + hsd->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) + { + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; + + hsd->pRxBuffPtr = (uint32_t *)pData; + hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks; + +#ifdef SDIO_STA_STBITER + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR)); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF)); +#endif /* SDIO_STA_STBITERR */ + + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } + + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Read Blocks in IT mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT); + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT); + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + return HAL_OK; } else { - /* Send CMD24 WRITE_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - if(NumberOfBlocks > 1U) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK); + return HAL_BUSY; } - else - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK); - } +} + +/** + * @brief Writes block(s) to a specified address in a card. The Data transfer + * is managed in interrupt mode. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @note You could also check the IT transfer process through the SD Tx + * interrupt event. + * @param hsd: Pointer to SD handle + * @param pData: Pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written + * @param NumberOfBlocks: Number of blocks to write + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) +{ + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; - if (errorstate != SD_OK) + if(NULL == pData) { - return errorstate; + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; } - /* Set total number of bytes to write */ - totalnumberofbytes = NumberOfBlocks * BlockSize; - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Write block(s) in polling mode */ - if(NumberOfBlocks > 1U) + if(hsd->State == HAL_SD_STATE_READY) { -#ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) -#else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)) -#endif /* SDIO_STA_STBITERR */ - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE)) - { - if ((totalnumberofbytes - bytestransferred) < 32U) - { - restwords = ((totalnumberofbytes - bytestransferred) % 4U == 0U) ? ((totalnumberofbytes - bytestransferred) / 4U) : (( totalnumberofbytes - bytestransferred) / 4U + 1U); - - /* Write data to SDIO Tx FIFO */ - for (count = 0U; count < restwords; count++) - { - SDIO_WriteFIFO(hsd->Instance, tempbuff); - tempbuff++; - bytestransferred += 4U; - } - } - else - { - /* Write data to SDIO Tx FIFO */ - for (count = 0U; count < 8U; count++) - { - SDIO_WriteFIFO(hsd->Instance, (tempbuff + count)); - } - - tempbuff += 8U; - bytestransferred += 32U; - } - } - } - } - else - { - /* In case of single data block transfer no need of stop command at all */ -#ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) -#else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) -#endif /* SDIO_STA_STBITERR */ - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE)) - { - if ((totalnumberofbytes - bytestransferred) < 32U) - { - restwords = ((totalnumberofbytes - bytestransferred) % 4U == 0U) ? ((totalnumberofbytes - bytestransferred) / 4U) : (( totalnumberofbytes - bytestransferred) / 4U + 1U); - - /* Write data to SDIO Tx FIFO */ - for (count = 0U; count < restwords; count++) - { - SDIO_WriteFIFO(hsd->Instance, tempbuff); - tempbuff++; - bytestransferred += 4U; - } - } - else - { - /* Write data to SDIO Tx FIFO */ - for (count = 0U; count < 8U; count++) - { - SDIO_WriteFIFO(hsd->Instance, (tempbuff + count)); - } - - tempbuff += 8U; - bytestransferred += 32U; - } - } - } - } - - /* Send stop transmission command in case of multiblock write */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U)) - { - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) + hsd->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) { - /* Send stop transmission command */ - errorstate = HAL_SD_StopTransfer(hsd); + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; } - } - - /* Get error state */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - errorstate = SD_DATA_TIMEOUT; + hsd->State = HAL_SD_STATE_BUSY; - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; - errorstate = SD_DATA_CRC_FAIL; + hsd->pTxBuffPtr = (uint32_t *)pData; + hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks; - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR); + /* Enable transfer interrupts */ +#ifdef SDIO_STA_STBITER + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR)); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE)); +#endif /* SDIO_STA_STBITERR */ - errorstate = SD_TX_UNDERRUN; + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } - return errorstate; - } -#ifdef SDIO_STA_STBITERR - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK| SD_CONTEXT_IT); + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT); + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } - errorstate = SD_START_BIT_ERR; + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); - return errorstate; + return HAL_OK; } -#endif /* SDIO_STA_STBITERR */ else { - /* No error flag set */ - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Wait till the card is in programming state */ - errorstate = SD_IsCardProgramming(hsd, &cardstate); - - while ((errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) - { - errorstate = SD_IsCardProgramming(hsd, &cardstate); + return HAL_BUSY; } - - return errorstate; } /** * @brief Reads block(s) from a specified address in a card. The Data transfer * is managed by DMA mode. - * @note This API should be followed by the function HAL_SD_CheckReadOperation() - * to check the completion of the read process - * @param hsd: SD handle - * @param pReadBuffer: Pointer to the buffer that will contain the received data - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @note You could also check the DMA transfer process through the SD Rx + * interrupt event. + * @param hsd: Pointer SD handle + * @param pData: Pointer to the buffer that will contain the received data + * @param BlockAdd: Block Address from where data is to be read * @param NumberOfBlocks: Number of blocks to read. - * @retval SD Card error state + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) +HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0U; - - /* Initialize handle flags */ - hsd->SdTransferCplt = 0U; - hsd->DmaTransferCplt = 0U; - hsd->SdTransferErr = SD_OK; + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; - /* Initialize SD Read operation */ - if(NumberOfBlocks > 1U) + if(NULL == pData) { - hsd->SdOperation = SD_READ_MULTIPLE_BLOCK; - } - else - { - hsd->SdOperation = SD_READ_SINGLE_BLOCK; + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; } - /* Enable transfer interrupts */ -#ifdef SDIO_STA_STBITERR - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_RXOVERR |\ - SDIO_IT_STBITERR)); + if(hsd->State == HAL_SD_STATE_READY) + { + hsd->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) + { + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; + +#ifdef SDIO_STA_STBITER + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR)); #else /* SDIO_STA_STBITERR not defined */ - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_RXOVERR)); + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND)); #endif /* SDIO_STA_STBITERR */ - - /* Enable SDIO DMA transfer */ - __HAL_SD_SDIO_DMA_ENABLE(); - - /* Configure DMA user callbacks */ - hsd->hdmarx->XferCpltCallback = SD_DMA_RxCplt; - hsd->hdmarx->XferErrorCallback = SD_DMA_RxError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4); - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512U; - ReadAddr /= 512U; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Check number of blocks command */ - if(NumberOfBlocks > 1U) - { - /* Send CMD18 READ_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK; - } - else - { - /* Send CMD17 READ_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - if(NumberOfBlocks > 1U) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK); + + /* Set the DMA transfer complete callback */ + hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt; + + /* Set the DMA error callback */ + hsd->hdmarx->XferErrorCallback = SD_DMAError; + + /* Set the DMA Abort callback */ + hsd->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA Channel */ + HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4); + + /* Enable SD DMA transfer */ + __HAL_SD_DMA_ENABLE(hsd); + + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } + + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Read Blocks in DMA mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA); + + /* Read Multi Block command */ + errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA); + + /* Read Single Block command */ + errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + return HAL_OK; } else { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK); + return HAL_BUSY; } - - /* Update the SD transfer error in SD handle */ - hsd->SdTransferErr = errorstate; - - return errorstate; } - /** * @brief Writes block(s) to a specified address in a card. The Data transfer * is managed by DMA mode. - * @note This API should be followed by the function HAL_SD_CheckWriteOperation() - * to check the completion of the write process (by SD current status polling). - * @param hsd: SD handle - * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be read - * @param BlockSize: the SD card Data block size - * @note BlockSize must be 512 bytes. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @note You could also check the DMA transfer process through the SD Tx + * interrupt event. + * @param hsd: Pointer to SD handle + * @param pData: Pointer to the buffer that will contain the data to transmit + * @param BlockAdd: Block Address where data will be written * @param NumberOfBlocks: Number of blocks to write - * @retval SD Card error state + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) +HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0U; + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; - /* Initialize handle flags */ - hsd->SdTransferCplt = 0U; - hsd->DmaTransferCplt = 0U; - hsd->SdTransferErr = SD_OK; - - /* Initialize SD Write operation */ - if(NumberOfBlocks > 1U) + if(NULL == pData) { - hsd->SdOperation = SD_WRITE_MULTIPLE_BLOCK; + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; } - else - { - hsd->SdOperation = SD_WRITE_SINGLE_BLOCK; - } - /* Enable transfer interrupts */ -#ifdef SDIO_STA_STBITERR - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_TXUNDERR |\ - SDIO_IT_STBITERR)); + if(hsd->State == HAL_SD_STATE_READY) + { + hsd->ErrorCode = HAL_DMA_ERROR_NONE; + + if((BlockAdd + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr)) + { + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } + + hsd->State = HAL_SD_STATE_BUSY; + + /* Initialize data control register */ + hsd->Instance->DCTRL = 0U; + + /* Enable SD Error interrupts */ +#ifdef SDIO_STA_STBITER + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR)); #else /* SDIO_STA_STBITERR not defined */ - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_TXUNDERR)); + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR)); #endif /* SDIO_STA_STBITERR */ - - /* Configure DMA user callbacks */ - hsd->hdmatx->XferCpltCallback = SD_DMA_TxCplt; - hsd->hdmatx->XferErrorCallback = SD_DMA_TxError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4); - - /* Enable SDIO DMA transfer */ - __HAL_SD_SDIO_DMA_ENABLE(); - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512U; - WriteAddr /= 512U; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Check number of blocks command */ - if(NumberOfBlocks <= 1U) - { - /* Send CMD24 WRITE_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; - } - else - { - /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - if(NumberOfBlocks > 1U) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK); + + /* Set the DMA transfer complete callback */ + hsd->hdmatx->XferCpltCallback = SD_DMATransmitCplt; + + /* Set the DMA error callback */ + hsd->hdmatx->XferErrorCallback = SD_DMAError; + + /* Set the DMA Abort callback */ + hsd->hdmatx->XferAbortCallback = NULL; + + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockAdd *= 512U; + } + + /* Set Block Size for Card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Write Blocks in Polling mode */ + if(NumberOfBlocks > 1U) + { + hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA); + + /* Write Multi Block command */ + errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, BlockAdd); + } + else + { + hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA); + + /* Write Single Block command */ + errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, BlockAdd); + } + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Enable SDIO DMA transfer */ + __HAL_SD_DMA_ENABLE(hsd); + + /* Enable the DMA Channel */ + HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pData, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4); + + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = BLOCKSIZE * NumberOfBlocks; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); + + return HAL_OK; } else { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK); - } - - if (errorstate != SD_OK) - { - return errorstate; + return HAL_BUSY; } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - hsd->SdTransferErr = errorstate; - - return errorstate; } /** - * @brief This function waits until the SD DMA data read transfer is finished. - * This API should be called after HAL_SD_ReadBlocks_DMA() function - * to insure that all data sent by the card is already transferred by the - * DMA controller. - * @param hsd: SD handle - * @param Timeout: Timeout duration - * @retval SD Card error state + * @brief Erases the specified memory area of the given SD card. + * @note This API should be followed by a check on the card state through + * HAL_SD_GetCardState(). + * @param hsd: Pointer to SD handle + * @param BlockStartAdd: Start Block address + * @param BlockEndAdd: End Block address + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout) +HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd) { - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout = Timeout; - uint32_t tmp1, tmp2; - HAL_SD_ErrorTypedef tmp3; - - /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */ - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - - while ((tmp1 == 0U) && (tmp2 == 0U) && (tmp3 == SD_OK) && (timeout > 0U)) - { - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - timeout--; - } - - timeout = Timeout; - - /* Wait until the Rx transfer is no longer active */ - while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0U)) - { - timeout--; - } - - /* Send stop command in multiblock read */ - if (hsd->SdOperation == SD_READ_MULTIPLE_BLOCK) - { - errorstate = HAL_SD_StopTransfer(hsd); - } + uint32_t errorstate = HAL_SD_ERROR_NONE; - if ((timeout == 0U) && (errorstate == SD_OK)) + if(hsd->State == HAL_SD_STATE_READY) { - errorstate = SD_DATA_TIMEOUT; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Return error state */ - if (hsd->SdTransferErr != SD_OK) - { - return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr); - } - - return errorstate; -} - -/** - * @brief This function waits until the SD DMA data write transfer is finished. - * This API should be called after HAL_SD_WriteBlocks_DMA() function - * to insure that all data sent by the card is already transferred by the - * DMA controller. - * @param hsd: SD handle - * @param Timeout: Timeout duration - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout = Timeout; - uint32_t tmp1, tmp2; - HAL_SD_ErrorTypedef tmp3; - - /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */ - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; + hsd->ErrorCode = HAL_DMA_ERROR_NONE; - while ((tmp1 == 0U) && (tmp2 == 0U) && (tmp3 == SD_OK) && (timeout > 0U)) - { - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - timeout--; - } - - timeout = Timeout; - - /* Wait until the Tx transfer is no longer active */ - while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXACT)) && (timeout > 0U)) - { - timeout--; - } - - /* Send stop command in multiblock write */ - if (hsd->SdOperation == SD_WRITE_MULTIPLE_BLOCK) - { - errorstate = HAL_SD_StopTransfer(hsd); - } - - if ((timeout == 0U) && (errorstate == SD_OK)) - { - errorstate = SD_DATA_TIMEOUT; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Return error state */ - if (hsd->SdTransferErr != SD_OK) - { - return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr); - } - - /* Wait until write is complete */ - while(HAL_SD_GetStatus(hsd) != SD_TRANSFER_OK) - { - } - - return errorstate; -} - -/** - * @brief Erases the specified memory area of the given SD card. - * @param hsd: SD handle - * @param startaddr: Start byte address - * @param endaddr: End byte address - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - - uint32_t delay = 0U; - __IO uint32_t maxdelay = 0U; - uint8_t cardstate = 0U; - - /* Check if the card command class supports erase command */ - if (((hsd->CSD[1U] >> 20U) & SD_CCCC_ERASE) == 0U) - { - errorstate = SD_REQUEST_NOT_APPLICABLE; + if(BlockEndAdd < BlockStartAdd) + { + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; + return HAL_ERROR; + } - return errorstate; - } - - /* Get max delay value */ - maxdelay = 120000U / (((hsd->Instance->CLKCR) & 0xFFU) + 2U); - - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; + if(BlockEndAdd > (hsd->SdCard.LogBlockNbr)) + { + hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE; + return HAL_ERROR; + } - return errorstate; - } - - /* Get start and end block for high capacity cards */ - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - startaddr /= 512U; - endaddr /= 512U; - } - - /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send CMD32 SD_ERASE_GRP_START with argument as addr */ - sdio_cmdinitstructure.Argument =(uint32_t)startaddr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_START; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + hsd->State = HAL_SD_STATE_BUSY; - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_START); + /* Check if the card command class supports erase command */ + if(((hsd->SdCard.Class) & SDIO_CCCC_ERASE) == 0U) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } - if (errorstate != SD_OK) + if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED) { - return errorstate; + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; } - /* Send CMD33 SD_ERASE_GRP_END with argument as addr */ - sdio_cmdinitstructure.Argument = (uint32_t)endaddr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_END; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + /* Get start and end block for high capacity cards */ + if(hsd->SdCard.CardType != CARD_SDHC_SDXC) + { + BlockStartAdd *= 512U; + BlockEndAdd *= 512U; + } - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_END); + /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ + if(hsd->SdCard.CardType != CARD_SECURED) + { + /* Send CMD32 SD_ERASE_GRP_START with argument as addr */ + errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, BlockStartAdd); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + + /* Send CMD33 SD_ERASE_GRP_END with argument as addr */ + errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, BlockEndAdd); + if(errorstate != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + } - if (errorstate != SD_OK) + /* Send CMD38 ERASE */ + errorstate = SDMMC_CmdErase(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) { - return errorstate; + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; } + + hsd->State = HAL_SD_STATE_READY; + + return HAL_OK; } - - /* Send CMD38 ERASE */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_ERASE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_ERASE); - - if (errorstate != SD_OK) - { - return errorstate; - } - - for (; delay < maxdelay; delay++) - { - } - - /* Wait until the card is in programming state */ - errorstate = SD_IsCardProgramming(hsd, &cardstate); - - delay = SD_DATATIMEOUT; - - while ((delay > 0U) && (errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) + else { - errorstate = SD_IsCardProgramming(hsd, &cardstate); - delay--; + return HAL_BUSY; } - - return errorstate; } /** * @brief This function handles SD card interrupt request. - * @param hsd: SD handle + * @param hsd: Pointer to SD handle * @retval None */ void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd) -{ +{ + uint32_t errorstate = HAL_SD_ERROR_NONE; + /* Check for SDIO interrupt flags */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DATAEND)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_IT_DATAEND); - - /* SD transfer is complete */ - hsd->SdTransferCplt = 1U; - - /* No transfer error */ - hsd->SdTransferErr = SD_OK; - - HAL_SD_XferCpltCallback(hsd); - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DCRCFAIL)) + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DATAEND) != RESET) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - hsd->SdTransferErr = SD_DATA_CRC_FAIL; + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DATAEND); - HAL_SD_XferErrorCallback(hsd); +#ifdef SDIO_STA_STBITERR + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR); +#else /* SDIO_STA_STBITERR not defined */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); +#endif + if((hsd->Context & SD_CONTEXT_IT) != RESET) + { + if(((hsd->Context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != RESET) || ((hsd->Context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET)) + { + errorstate = SDMMC_CmdStopTransfer(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + hsd->ErrorCode |= errorstate; + HAL_SD_ErrorCallback(hsd); + } + } + + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + + hsd->State = HAL_SD_STATE_READY; + if(((hsd->Context & SD_CONTEXT_READ_SINGLE_BLOCK) != RESET) || ((hsd->Context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != RESET)) + { + HAL_SD_RxCpltCallback(hsd); + } + else + { + HAL_SD_TxCpltCallback(hsd); + } + } + else if((hsd->Context & SD_CONTEXT_DMA) != RESET) + { + if((hsd->Context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != RESET) + { + errorstate = SDMMC_CmdStopTransfer(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + hsd->ErrorCode |= errorstate; + HAL_SD_ErrorCallback(hsd); + } + } + if(((hsd->Context & SD_CONTEXT_READ_SINGLE_BLOCK) == RESET) && ((hsd->Context & SD_CONTEXT_READ_MULTIPLE_BLOCK) == RESET)) + { + /* Disable the DMA transfer for transmit request by setting the DMAEN bit + in the SD DCTRL register */ + hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + hsd->State = HAL_SD_STATE_READY; + + HAL_SD_TxCpltCallback(hsd); + } + } } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DTIMEOUT)) + + else if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_TXFIFOHE) != RESET) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - hsd->SdTransferErr = SD_DATA_TIMEOUT; + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_TXFIFOHE); - HAL_SD_XferErrorCallback(hsd); + SD_Write_IT(hsd); } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_RXOVERR)) + + else if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_RXFIFOHF) != RESET) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - hsd->SdTransferErr = SD_RX_OVERRUN; + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXFIFOHF); - HAL_SD_XferErrorCallback(hsd); + SD_Read_IT(hsd); } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_TXUNDERR)) + +#ifdef SDIO_STA_STBITERR + else if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR) != RESET) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR); + /* Set Error code */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DCRCFAIL) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DTIMEOUT) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_RXOVERR) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_TXUNDERR) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_STBITERR) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT; + } + + /* Clear All flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS | SDIO_FLAG_STBITERR); - hsd->SdTransferErr = SD_TX_UNDERRUN; + /* Disable all interrupts */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR |SDIO_IT_STBITERR); - HAL_SD_XferErrorCallback(hsd); + if((hsd->Context & SD_CONTEXT_DMA) != RESET) + { + /* Abort the SD DMA Streams */ + if(hsd->hdmatx != NULL) + { + /* Set the DMA Tx abort callback */ + hsd->hdmatx->XferAbortCallback = SD_DMATxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK) + { + SD_DMATxAbort(hsd->hdmatx); + } + } + else if(hsd->hdmarx != NULL) + { + /* Set the DMA Rx abort callback */ + hsd->hdmarx->XferAbortCallback = SD_DMARxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK) + { + SD_DMARxAbort(hsd->hdmarx); + } + } + else + { + hsd->ErrorCode = HAL_SD_ERROR_NONE; + hsd->State = HAL_SD_STATE_READY; + HAL_SD_AbortCallback(hsd); + } + } + else if((hsd->Context & SD_CONTEXT_IT) != RESET) + { + /* Set the SD state to ready to be able to start again the process */ + hsd->State = HAL_SD_STATE_READY; + HAL_SD_ErrorCallback(hsd); + } } -#ifdef SDIO_STA_STBITERR - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_STBITERR)) +#else /* SDIO_STA_STBITERR not defined */ + else if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_TXUNDERR) != RESET) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); + /* Set Error code */ + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DCRCFAIL) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_DTIMEOUT) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_RXOVERR) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN; + } + if(__HAL_SD_GET_FLAG(hsd, SDIO_IT_TXUNDERR) != RESET) + { + hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN; + } + + /* Clear All flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - hsd->SdTransferErr = SD_START_BIT_ERR; + /* Disable all interrupts */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); - HAL_SD_XferErrorCallback(hsd); - } -#endif /* SDIO_STA_STBITERR */ - else - { - /* No error flag set */ + if((hsd->Context & SD_CONTEXT_DMA) != RESET) + { + /* Abort the SD DMA Streams */ + if(hsd->hdmatx != NULL) + { + /* Set the DMA Tx abort callback */ + hsd->hdmatx->XferAbortCallback = SD_DMATxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK) + { + SD_DMATxAbort(hsd->hdmatx); + } + } + else if(hsd->hdmarx != NULL) + { + /* Set the DMA Rx abort callback */ + hsd->hdmarx->XferAbortCallback = SD_DMARxAbort; + /* Abort DMA in IT mode */ + if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK) + { + SD_DMARxAbort(hsd->hdmarx); + } + } + else + { + hsd->ErrorCode = HAL_SD_ERROR_NONE; + hsd->State = HAL_SD_STATE_READY; + HAL_SD_AbortCallback(hsd); + } + } + else if((hsd->Context & SD_CONTEXT_IT) != RESET) + { + /* Set the SD state to ready to be able to start again the process */ + hsd->State = HAL_SD_STATE_READY; + HAL_SD_ErrorCallback(hsd); + } } - - /* Disable all SDIO peripheral interrupt sources */ -#ifdef SDIO_STA_STBITERR - __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |\ - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\ - SDIO_IT_RXOVERR | SDIO_IT_STBITERR); -#else /* SDIO_STA_STBITERR not defined */ - __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |\ - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\ - SDIO_IT_RXOVERR); -#endif /* SDIO_STA_STBITERR */ +#endif } - /** - * @brief SD end of transfer callback. - * @param hsd: SD handle - * @retval None + * @brief return the SD state + * @param hsd: Pointer to sd handle + * @retval HAL state */ -__weak void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd) +HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsd); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_XferCpltCallback could be implemented in the user file - */ + return hsd->State; } /** - * @brief SD Transfer Error callback. - * @param hsd: SD handle - * @retval None - */ -__weak void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd) +* @brief Return the SD error code +* @param hsd : Pointer to a SD_HandleTypeDef structure that contains + * the configuration information. +* @retval SD Error Code +*/ +uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hsd); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_XferErrorCallback could be implemented in the user file - */ + return hsd->ErrorCode; } /** - * @brief SD Transfer complete Rx callback in non blocking mode. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief Tx Transfer completed callbacks + * @param hsd: Pointer to SD handle * @retval None */ -__weak void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma) + __weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_RxCpltCallback could be implemented in the user file - */ -} + UNUSED(hsd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SD_TxCpltCallback can be implemented in the user file + */ +} /** - * @brief SD DMA transfer complete Rx error callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief Rx Transfer completed callbacks + * @param hsd: Pointer SD handle * @retval None */ -__weak void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma) +__weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_RxErrorCallback could be implemented in the user file - */ + UNUSED(hsd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SD_RxCpltCallback can be implemented in the user file + */ } /** - * @brief SD Transfer complete Tx callback in non blocking mode. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief SD error callbacks + * @param hsd: Pointer SD handle * @retval None */ -__weak void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma) +__weak void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_TxCpltCallback could be implemented in the user file + UNUSED(hsd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SD_ErrorCallback can be implemented in the user file */ -} +} /** - * @brief SD DMA transfer complete error Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. + * @brief SD Abort callbacks + * @param hsd: Pointer SD handle * @retval None */ -__weak void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma) +__weak void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd) { /* Prevent unused argument(s) compilation warning */ - UNUSED(hdma); - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_TxErrorCallback could be implemented in the user file + UNUSED(hsd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SD_ErrorCallback can be implemented in the user file */ } + /** * @} */ @@ -1540,1963 +1717,1303 @@ __weak void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma) ============================================================================== [..] This subsection provides a set of functions allowing to control the SD card - operations. + operations and get the related information @endverbatim * @{ */ /** - * @brief Returns information about specific card. - * @param hsd: SD handle - * @param pCardInfo: Pointer to a HAL_SD_CardInfoTypedef structure that - * contains all SD cardinformation - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t tmp = 0U; - - pCardInfo->CardType = (uint8_t)(hsd->CardType); - pCardInfo->RCA = (uint16_t)(hsd->RCA); - - /* Byte 0 */ - tmp = (hsd->CSD[0U] & 0xFF000000U) >> 24U; - pCardInfo->SD_csd.CSDStruct = (uint8_t)((tmp & 0xC0U) >> 6U); - pCardInfo->SD_csd.SysSpecVersion = (uint8_t)((tmp & 0x3CU) >> 2U); - pCardInfo->SD_csd.Reserved1 = tmp & 0x03U; - - /* Byte 1 */ - tmp = (hsd->CSD[0U] & 0x00FF0000U) >> 16U; - pCardInfo->SD_csd.TAAC = (uint8_t)tmp; - - /* Byte 2 */ - tmp = (hsd->CSD[0U] & 0x0000FF00U) >> 8U; - pCardInfo->SD_csd.NSAC = (uint8_t)tmp; - - /* Byte 3 */ - tmp = hsd->CSD[0U] & 0x000000FFU; - pCardInfo->SD_csd.MaxBusClkFrec = (uint8_t)tmp; - - /* Byte 4 */ - tmp = (hsd->CSD[1U] & 0xFF000000U) >> 24U; - pCardInfo->SD_csd.CardComdClasses = (uint16_t)(tmp << 4U); - - /* Byte 5 */ - tmp = (hsd->CSD[1U] & 0x00FF0000U) >> 16U; - pCardInfo->SD_csd.CardComdClasses |= (uint16_t)((tmp & 0xF0) >> 4U); - pCardInfo->SD_csd.RdBlockLen = (uint8_t)(tmp & 0x0FU); - - /* Byte 6 */ - tmp = (hsd->CSD[1U] & 0x0000FF00U) >> 8U; - pCardInfo->SD_csd.PartBlockRead = (uint8_t)((tmp & 0x80U) >> 7U); - pCardInfo->SD_csd.WrBlockMisalign = (uint8_t)((tmp & 0x40U) >> 6U); - pCardInfo->SD_csd.RdBlockMisalign = (uint8_t)((tmp & 0x20U) >> 5U); - pCardInfo->SD_csd.DSRImpl = (uint8_t)((tmp & 0x10U) >> 4U); - pCardInfo->SD_csd.Reserved2 = 0U; /*!< Reserved */ - - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0)) - { - pCardInfo->SD_csd.DeviceSize = (tmp & 0x03U) << 10U; - - /* Byte 7 */ - tmp = (uint8_t)(hsd->CSD[1U] & 0x000000FFU); - pCardInfo->SD_csd.DeviceSize |= (tmp) << 2U; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0xFF000000U) >> 24U); - pCardInfo->SD_csd.DeviceSize |= (tmp & 0xC0U) >> 6U; - - pCardInfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38U) >> 3U; - pCardInfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07U); - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0U) >> 5U; - pCardInfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1CU) >> 2U; - pCardInfo->SD_csd.DeviceSizeMul = (tmp & 0x03U) << 1U; - /* Byte 10 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_csd.DeviceSizeMul |= (tmp & 0x80U) >> 7U; - - pCardInfo->CardCapacity = (pCardInfo->SD_csd.DeviceSize + 1U) ; - pCardInfo->CardCapacity *= (1U << (pCardInfo->SD_csd.DeviceSizeMul + 2U)); - pCardInfo->CardBlockSize = 1U << (pCardInfo->SD_csd.RdBlockLen); - pCardInfo->CardCapacity *= pCardInfo->CardBlockSize; - } - else if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - /* Byte 7 */ - tmp = (uint8_t)(hsd->CSD[1U] & 0x000000FFU); - pCardInfo->SD_csd.DeviceSize = (tmp & 0x3FU) << 16U; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0xFF000000U) >> 24U); - - pCardInfo->SD_csd.DeviceSize |= (tmp << 8U); - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0x00FF0000U) >> 16U); - - pCardInfo->SD_csd.DeviceSize |= (tmp); - - /* Byte 10 */ - tmp = (uint8_t)((hsd->CSD[2U] & 0x0000FF00U) >> 8U); - - pCardInfo->CardCapacity = (uint64_t)((((uint64_t)pCardInfo->SD_csd.DeviceSize + 1U)) * 512U * 1024U); - pCardInfo->CardBlockSize = 512U; - } - else - { - /* Not supported card type */ - errorstate = SD_ERROR; - } - - pCardInfo->SD_csd.EraseGrSize = (tmp & 0x40U) >> 6U; - pCardInfo->SD_csd.EraseGrMul = (tmp & 0x3FU) << 1U; - - /* Byte 11 */ - tmp = (uint8_t)(hsd->CSD[2U] & 0x000000FFU); - pCardInfo->SD_csd.EraseGrMul |= (tmp & 0x80U) >> 7U; - pCardInfo->SD_csd.WrProtectGrSize = (tmp & 0x7FU); - - /* Byte 12 */ - tmp = (uint8_t)((hsd->CSD[3U] & 0xFF000000U) >> 24U); - pCardInfo->SD_csd.WrProtectGrEnable = (tmp & 0x80U) >> 7U; - pCardInfo->SD_csd.ManDeflECC = (tmp & 0x60U) >> 5U; - pCardInfo->SD_csd.WrSpeedFact = (tmp & 0x1CU) >> 2U; - pCardInfo->SD_csd.MaxWrBlockLen = (tmp & 0x03U) << 2U; - - /* Byte 13 */ - tmp = (uint8_t)((hsd->CSD[3U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_csd.MaxWrBlockLen |= (tmp & 0xC0U) >> 6U; - pCardInfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20U) >> 5U; - pCardInfo->SD_csd.Reserved3 = 0U; - pCardInfo->SD_csd.ContentProtectAppli = (tmp & 0x01U); - - /* Byte 14 */ - tmp = (uint8_t)((hsd->CSD[3U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_csd.FileFormatGrouop = (tmp & 0x80U) >> 7U; - pCardInfo->SD_csd.CopyFlag = (tmp & 0x40U) >> 6U; - pCardInfo->SD_csd.PermWrProtect = (tmp & 0x20U) >> 5U; - pCardInfo->SD_csd.TempWrProtect = (tmp & 0x10U) >> 4U; - pCardInfo->SD_csd.FileFormat = (tmp & 0x0CU) >> 2U; - pCardInfo->SD_csd.ECC = (tmp & 0x03U); - - /* Byte 15 */ - tmp = (uint8_t)(hsd->CSD[3U] & 0x000000FFU); - pCardInfo->SD_csd.CSD_CRC = (tmp & 0xFEU) >> 1U; - pCardInfo->SD_csd.Reserved4 = 1U; - - /* Byte 0 */ - tmp = (uint8_t)((hsd->CID[0U] & 0xFF000000U) >> 24U); - pCardInfo->SD_cid.ManufacturerID = tmp; - - /* Byte 1 */ - tmp = (uint8_t)((hsd->CID[0U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_cid.OEM_AppliID = tmp << 8U; - - /* Byte 2 */ - tmp = (uint8_t)((hsd->CID[0U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_cid.OEM_AppliID |= tmp; - - /* Byte 3 */ - tmp = (uint8_t)(hsd->CID[0U] & 0x000000FFU); - pCardInfo->SD_cid.ProdName1 = tmp << 24U; - - /* Byte 4 */ - tmp = (uint8_t)((hsd->CID[1U] & 0xFF000000U) >> 24U); - pCardInfo->SD_cid.ProdName1 |= tmp << 16U; - - /* Byte 5 */ - tmp = (uint8_t)((hsd->CID[1U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_cid.ProdName1 |= tmp << 8U; - - /* Byte 6 */ - tmp = (uint8_t)((hsd->CID[1U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_cid.ProdName1 |= tmp; - - /* Byte 7 */ - tmp = (uint8_t)(hsd->CID[1U] & 0x000000FFU); - pCardInfo->SD_cid.ProdName2 = tmp; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CID[2U] & 0xFF000000U) >> 24U); - pCardInfo->SD_cid.ProdRev = tmp; - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CID[2U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_cid.ProdSN = tmp << 24U; - - /* Byte 10 */ - tmp = (uint8_t)((hsd->CID[2U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_cid.ProdSN |= tmp << 16U; - - /* Byte 11 */ - tmp = (uint8_t)(hsd->CID[2U] & 0x000000FFU); - pCardInfo->SD_cid.ProdSN |= tmp << 8U; - - /* Byte 12 */ - tmp = (uint8_t)((hsd->CID[3U] & 0xFF000000U) >> 24U); - pCardInfo->SD_cid.ProdSN |= tmp; - - /* Byte 13 */ - tmp = (uint8_t)((hsd->CID[3U] & 0x00FF0000U) >> 16U); - pCardInfo->SD_cid.Reserved1 |= (tmp & 0xF0U) >> 4U; - pCardInfo->SD_cid.ManufactDate = (tmp & 0x0FU) << 8U; - - /* Byte 14 */ - tmp = (uint8_t)((hsd->CID[3U] & 0x0000FF00U) >> 8U); - pCardInfo->SD_cid.ManufactDate |= tmp; - - /* Byte 15 */ - tmp = (uint8_t)(hsd->CID[3U] & 0x000000FFU); - pCardInfo->SD_cid.CID_CRC = (tmp & 0xFEU) >> 1U; - pCardInfo->SD_cid.Reserved2 = 1U; - - return errorstate; -} - -/** - * @brief Enables wide bus operation for the requested card if supported by - * card. - * @param hsd: SD handle - * @param WideMode: Specifies the SD card wide bus mode - * This parameter can be one of the following values: - * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer (Only for MMC) - * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer - * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_InitTypeDef tmpinit; - - /* MMC Card does not support this feature */ - if (hsd->CardType == MULTIMEDIA_CARD) - { - errorstate = SD_UNSUPPORTED_FEATURE; - - return errorstate; - } - else if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - if (WideMode == SDIO_BUS_WIDE_8B) - { - errorstate = SD_UNSUPPORTED_FEATURE; - } - else if (WideMode == SDIO_BUS_WIDE_4B) - { - errorstate = SD_WideBus_Enable(hsd); - } - else if (WideMode == SDIO_BUS_WIDE_1B) - { - errorstate = SD_WideBus_Disable(hsd); - } - else - { - /* WideMode is not a valid argument*/ - errorstate = SD_INVALID_PARAMETER; - } - - if (errorstate == SD_OK) - { - /* Configure the SDIO peripheral */ - tmpinit.ClockEdge = hsd->Init.ClockEdge; - tmpinit.ClockBypass = hsd->Init.ClockBypass; - tmpinit.ClockPowerSave = hsd->Init.ClockPowerSave; - tmpinit.BusWide = WideMode; - tmpinit.HardwareFlowControl = hsd->Init.HardwareFlowControl; - tmpinit.ClockDiv = hsd->Init.ClockDiv; - SDIO_Init(hsd->Instance, tmpinit); - } - } - - return errorstate; -} - -/** - * @brief Aborts an ongoing data transfer. - * @param hsd: SD handle - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Send CMD12 STOP_TRANSMISSION */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_STOP_TRANSMISSION; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_STOP_TRANSMISSION); - - return errorstate; -} - -/** - * @brief Switches the SD card to High Speed mode. - * This API must be used after "Transfer State" - * @note This operation should be followed by the configuration - * of PLL to have SDIOCK clock between 67 and 75 MHz - * @param hsd: SD handle - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - - uint8_t SD_hs[64U] = {0U}; - uint32_t SD_scr[2U] = {0U, 0U}; - uint32_t SD_SPEC = 0U; - uint32_t count = 0U, *tempbuff = (uint32_t *)SD_hs; - - /* Initialize the Data control register */ - hsd->Instance->DCTRL = 0U; - - /* Get SCR Register */ - errorstate = SD_FindSCR(hsd, SD_scr); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Test the Version supported by the card*/ - SD_SPEC = (SD_scr[1U] & 0x01000000U) | (SD_scr[1U] & 0x02000000U); - - if (SD_SPEC != SD_ALLZERO) - { - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)64U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 64U; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B ; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Send CMD6 switch mode */ - sdio_cmdinitstructure.Argument = 0x80FFFF01U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_HS_SWITCH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_HS_SWITCH); - - if (errorstate != SD_OK) - { - return errorstate; - } -#ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) -#else /* SDIO_STA_STBITERR */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) -#endif /* SDIO_STA_STBITERR */ - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - for (count = 0U; count < 8U; count++) - { - *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); - } - - tempbuff += 8U; - } - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } -#ifdef SDIO_STA_STBITERR - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } -#endif /* SDIO_STA_STBITERR */ - else - { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0U)) - { - *tempbuff = SDIO_ReadFIFO(hsd->Instance); - tempbuff++; - count--; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Test if the switch mode HS is ok */ - if ((SD_hs[13U]& 2U) != 2U) - { - errorstate = SD_UNSUPPORTED_FEATURE; - } - } - - return errorstate; -} - -/** - * @} - */ - -/** @addtogroup SD_Exported_Functions_Group4 - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in runtime the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the current SD card's status. - * @param hsd: SD handle - * @param pSDstatus: Pointer to the buffer that will contain the SD card status - * SD Status register) - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t count = 0U; - - /* Check SD response */ - if ((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; - } - - /* Set block size for card if it is not equal to current block size for card */ - sdio_cmdinitstructure.Argument = 64U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD55 */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 64U; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Send ACMD13 (SD_APP_STATUS) with argument as card's RCA */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_STATUS; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_STATUS); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Get status data */ -#ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) -#else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) -#endif /* SDIO_STA_STBITERR */ - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - for (count = 0U; count < 8U; count++) - { - *(pSDstatus + count) = SDIO_ReadFIFO(hsd->Instance); - } - - pSDstatus += 8U; - } - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } -#ifdef SDIO_STA_STBITERR - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } -#endif /* SDIO_STA_STBITERR */ - else - { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0U)) - { - *pSDstatus = SDIO_ReadFIFO(hsd->Instance); - pSDstatus++; - count--; - } - - /* Clear all the static status flags*/ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Gets the current sd card data status. - * @param hsd: SD handle - * @retval Data Transfer state - */ -HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd) -{ - HAL_SD_CardStateTypedef cardstate = SD_CARD_TRANSFER; - - /* Get SD card state */ - cardstate = SD_GetState(hsd); - - /* Find SD status according to card state*/ - if (cardstate == SD_CARD_TRANSFER) - { - return SD_TRANSFER_OK; - } - else if(cardstate == SD_CARD_ERROR) - { - return SD_TRANSFER_ERROR; - } - else - { - return SD_TRANSFER_BUSY; - } -} - -/** - * @brief Gets the SD card status. - * @param hsd: SD handle - * @param pCardStatus: Pointer to the HAL_SD_CardStatusTypedef structure that - * will contain the SD card status information - * @retval SD Card error state + * @brief Returns information the information of the card which are stored on + * the CID register. + * @param hsd: Pointer to SD handle + * @param pCID: Pointer to a HAL_SD_CIDTypeDef structure that + * contains all CID register parameters + * @retval HAL status */ -HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus) +HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID) { - HAL_SD_ErrorTypedef errorstate = SD_OK; uint32_t tmp = 0U; - uint32_t sd_status[16U]; - - errorstate = HAL_SD_SendSDStatus(hsd, sd_status); - - if (errorstate != SD_OK) - { - return errorstate; - } /* Byte 0 */ - tmp = (sd_status[0U] & 0xC0U) >> 6U; - pCardStatus->DAT_BUS_WIDTH = (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[0U] & 0xFF000000U) >> 24U); + pCID->ManufacturerID = tmp; - /* Byte 0 */ - tmp = (sd_status[0U] & 0x20U) >> 5U; - pCardStatus->SECURED_MODE = (uint8_t)tmp; + /* Byte 1 */ + tmp = (uint8_t)((hsd->CID[0U] & 0x00FF0000U) >> 16U); + pCID->OEM_AppliID = tmp << 8U; /* Byte 2 */ - tmp = (sd_status[2U] & 0xFFU); - pCardStatus->SD_CARD_TYPE = (uint8_t)(tmp << 8U); + tmp = (uint8_t)((hsd->CID[0U] & 0x000000FF00U) >> 8U); + pCID->OEM_AppliID |= tmp; /* Byte 3 */ - tmp = (sd_status[3U] & 0xFFU); - pCardStatus->SD_CARD_TYPE |= (uint8_t)tmp; + tmp = (uint8_t)(hsd->CID[0U] & 0x000000FFU); + pCID->ProdName1 = tmp << 24U; /* Byte 4 */ - tmp = (sd_status[4U] & 0xFFU); - pCardStatus->SIZE_OF_PROTECTED_AREA = (uint8_t)(tmp << 24U); + tmp = (uint8_t)((hsd->CID[1U] & 0xFF000000U) >> 24U); + pCID->ProdName1 |= tmp << 16; /* Byte 5 */ - tmp = (sd_status[5U] & 0xFFU); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 16U); + tmp = (uint8_t)((hsd->CID[1U] & 0x00FF0000U) >> 16U); + pCID->ProdName1 |= tmp << 8U; /* Byte 6 */ - tmp = (sd_status[6U] & 0xFFU); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 8U); + tmp = (uint8_t)((hsd->CID[1U] & 0x0000FF00U) >> 8U); + pCID->ProdName1 |= tmp; /* Byte 7 */ - tmp = (sd_status[7U] & 0xFFU); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)tmp; + tmp = (uint8_t)(hsd->CID[1U] & 0x000000FFU); + pCID->ProdName2 = tmp; /* Byte 8 */ - tmp = (sd_status[8U] & 0xFFU); - pCardStatus->SPEED_CLASS = (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[2U] & 0xFF000000U) >> 24U); + pCID->ProdRev = tmp; /* Byte 9 */ - tmp = (sd_status[9U] & 0xFFU); - pCardStatus->PERFORMANCE_MOVE = (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[2U] & 0x00FF0000U) >> 16U); + pCID->ProdSN = tmp << 24U; /* Byte 10 */ - tmp = (sd_status[10U] & 0xF0U) >> 4U; - pCardStatus->AU_SIZE = (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[2U] & 0x0000FF00U) >> 8U); + pCID->ProdSN |= tmp << 16U; /* Byte 11 */ - tmp = (sd_status[11U] & 0xFFU); - pCardStatus->ERASE_SIZE = (uint8_t)(tmp << 8U); + tmp = (uint8_t)(hsd->CID[2U] & 0x000000FFU); + pCID->ProdSN |= tmp << 8U; /* Byte 12 */ - tmp = (sd_status[12U] & 0xFFU); - pCardStatus->ERASE_SIZE |= (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[3U] & 0xFF000000U) >> 24U); + pCID->ProdSN |= tmp; /* Byte 13 */ - tmp = (sd_status[13U] & 0xFCU) >> 2U; - pCardStatus->ERASE_TIMEOUT = (uint8_t)tmp; + tmp = (uint8_t)((hsd->CID[3U] & 0x00FF0000U) >> 16U); + pCID->Reserved1 |= (tmp & 0xF0U) >> 4U; + pCID->ManufactDate = (tmp & 0x0FU) << 8U; - /* Byte 13 */ - tmp = (sd_status[13U] & 0x3U); - pCardStatus->ERASE_OFFSET = (uint8_t)tmp; + /* Byte 14 */ + tmp = (uint8_t)((hsd->CID[3U] & 0x0000FF00U) >> 8U); + pCID->ManufactDate |= tmp; - return errorstate; + /* Byte 15 */ + tmp = (uint8_t)(hsd->CID[3U] & 0x000000FFU); + pCID->CID_CRC = (tmp & 0xFEU) >> 1U; + pCID->Reserved2 = 1U; + + return HAL_OK; } - -/** - * @} - */ - -/** - * @} - */ -/* Private function ----------------------------------------------------------*/ -/** @addtogroup SD_Private_Functions - * @{ - */ - /** - * @brief SD DMA transfer complete Rx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None + * @brief Returns information the information of the card which are stored on + * the CSD register. + * @param hsd: Pointer to SD handle + * @param pCSD: Pointer to a HAL_SD_CardCSDTypeDef structure that + * contains all CSD register parameters + * @retval HAL status */ -static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma) +HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD) { - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; + uint32_t tmp = 0U; - /* DMA transfer is complete */ - hsd->DmaTransferCplt = 1U; + /* Byte 0 */ + tmp = (hsd->CSD[0U] & 0xFF000000U) >> 24U; + pCSD->CSDStruct = (uint8_t)((tmp & 0xC0U) >> 6U); + pCSD->SysSpecVersion = (uint8_t)((tmp & 0x3CU) >> 2U); + pCSD->Reserved1 = tmp & 0x03U; - /* Wait until SD transfer is complete */ - while(hsd->SdTransferCplt == 0U) - { - } + /* Byte 1 */ + tmp = (hsd->CSD[0U] & 0x00FF0000U) >> 16U; + pCSD->TAAC = (uint8_t)tmp; - /* Disable the DMA channel */ - HAL_DMA_Abort(hdma); - - /* Transfer complete user callback */ - HAL_SD_DMA_RxCpltCallback(hsd->hdmarx); -} - -/** - * @brief SD DMA transfer Error Rx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_RxError(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; + /* Byte 2 */ + tmp = (hsd->CSD[0U] & 0x0000FF00U) >> 8U; + pCSD->NSAC = (uint8_t)tmp; - /* Transfer complete user callback */ - HAL_SD_DMA_RxErrorCallback(hsd->hdmarx); -} - -/** - * @brief SD DMA transfer complete Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; + /* Byte 3 */ + tmp = hsd->CSD[0U] & 0x000000FFU; + pCSD->MaxBusClkFrec = (uint8_t)tmp; - /* DMA transfer is complete */ - hsd->DmaTransferCplt = 1U; + /* Byte 4 */ + tmp = (hsd->CSD[1U] & 0xFF000000U) >> 24U; + pCSD->CardComdClasses = (uint16_t)(tmp << 4U); - /* Wait until SD transfer is complete */ - while(hsd->SdTransferCplt == 0U) - { - } - - /* Disable the DMA channel */ - HAL_DMA_Abort(hdma); - - /* Transfer complete user callback */ - HAL_SD_DMA_TxCpltCallback(hsd->hdmatx); -} - -/** - * @brief SD DMA transfer Error Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_TxError(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = ( SD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + /* Byte 5 */ + tmp = (hsd->CSD[1U] & 0x00FF0000U) >> 16U; + pCSD->CardComdClasses |= (uint16_t)((tmp & 0xF0U) >> 4U); + pCSD->RdBlockLen = (uint8_t)(tmp & 0x0FU); - /* Transfer complete user callback */ - HAL_SD_DMA_TxErrorCallback(hsd->hdmatx); -} + /* Byte 6 */ + tmp = (hsd->CSD[1U] & 0x0000FF00U) >> 8U; + pCSD->PartBlockRead = (uint8_t)((tmp & 0x80U) >> 7U); + pCSD->WrBlockMisalign = (uint8_t)((tmp & 0x40U) >> 6U); + pCSD->RdBlockMisalign = (uint8_t)((tmp & 0x20U) >> 5U); + pCSD->DSRImpl = (uint8_t)((tmp & 0x10U) >> 4U); + pCSD->Reserved2 = 0U; /*!< Reserved */ + + if(hsd->SdCard.CardType == CARD_SDSC) + { + pCSD->DeviceSize = (tmp & 0x03U) << 10U; + + /* Byte 7 */ + tmp = (uint8_t)(hsd->CSD[1U] & 0x000000FFU); + pCSD->DeviceSize |= (tmp) << 2U; + + /* Byte 8 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0xFF000000U) >> 24U); + pCSD->DeviceSize |= (tmp & 0xC0U) >> 6U; + + pCSD->MaxRdCurrentVDDMin = (tmp & 0x38U) >> 3U; + pCSD->MaxRdCurrentVDDMax = (tmp & 0x07U); + + /* Byte 9 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0x00FF0000U) >> 16U); + pCSD->MaxWrCurrentVDDMin = (tmp & 0xE0U) >> 5U; + pCSD->MaxWrCurrentVDDMax = (tmp & 0x1CU) >> 2U; + pCSD->DeviceSizeMul = (tmp & 0x03U) << 1U; + /* Byte 10 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0x0000FF00U) >> 8U); + pCSD->DeviceSizeMul |= (tmp & 0x80U) >> 7U; + + hsd->SdCard.BlockNbr = (pCSD->DeviceSize + 1U) ; + hsd->SdCard.BlockNbr *= (1U << (pCSD->DeviceSizeMul + 2U)); + hsd->SdCard.BlockSize = 1U << (pCSD->RdBlockLen); -/** - * @brief Returns the SD current state. - * @param hsd: SD handle - * @retval SD card current state - */ -static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd) -{ - uint32_t resp1 = 0U; - - if (SD_SendStatus(hsd, &resp1) != SD_OK) + hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U); + hsd->SdCard.LogBlockSize = 512U; + } + else if(hsd->SdCard.CardType == CARD_SDHC_SDXC) { - return SD_CARD_ERROR; + /* Byte 7 */ + tmp = (uint8_t)(hsd->CSD[1U] & 0x000000FFU); + pCSD->DeviceSize = (tmp & 0x3FU) << 16U; + + /* Byte 8 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0xFF000000U) >> 24U); + + pCSD->DeviceSize |= (tmp << 8U); + + /* Byte 9 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0x00FF0000U) >> 16U); + + pCSD->DeviceSize |= (tmp); + + /* Byte 10 */ + tmp = (uint8_t)((hsd->CSD[2U] & 0x0000FF00U) >> 8U); + + hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr = (((uint64_t)pCSD->DeviceSize + 1U) * 1024U); + hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize = 512U; } else { - return (HAL_SD_CardStateTypedef)((resp1 >> 9U) & 0x0FU); + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; } + + pCSD->EraseGrSize = (tmp & 0x40U) >> 6U; + pCSD->EraseGrMul = (tmp & 0x3FU) << 1U; + + /* Byte 11 */ + tmp = (uint8_t)(hsd->CSD[2U] & 0x000000FFU); + pCSD->EraseGrMul |= (tmp & 0x80U) >> 7U; + pCSD->WrProtectGrSize = (tmp & 0x7FU); + + /* Byte 12 */ + tmp = (uint8_t)((hsd->CSD[3U] & 0xFF000000U) >> 24U); + pCSD->WrProtectGrEnable = (tmp & 0x80U) >> 7U; + pCSD->ManDeflECC = (tmp & 0x60U) >> 5U; + pCSD->WrSpeedFact = (tmp & 0x1CU) >> 2U; + pCSD->MaxWrBlockLen = (tmp & 0x03U) << 2U; + + /* Byte 13 */ + tmp = (uint8_t)((hsd->CSD[3U] & 0x00FF0000U) >> 16U); + pCSD->MaxWrBlockLen |= (tmp & 0xC0U) >> 6U; + pCSD->WriteBlockPaPartial = (tmp & 0x20U) >> 5U; + pCSD->Reserved3 = 0U; + pCSD->ContentProtectAppli = (tmp & 0x01U); + + /* Byte 14 */ + tmp = (uint8_t)((hsd->CSD[3U] & 0x0000FF00U) >> 8U); + pCSD->FileFormatGrouop = (tmp & 0x80U) >> 7U; + pCSD->CopyFlag = (tmp & 0x40U) >> 6U; + pCSD->PermWrProtect = (tmp & 0x20U) >> 5U; + pCSD->TempWrProtect = (tmp & 0x10U) >> 4U; + pCSD->FileFormat = (tmp & 0x0CU) >> 2U; + pCSD->ECC = (tmp & 0x03U); + + /* Byte 15 */ + tmp = (uint8_t)(hsd->CSD[3U] & 0x000000FFU); + pCSD->CSD_CRC = (tmp & 0xFEU) >> 1U; + pCSD->Reserved4 = 1U; + + return HAL_OK; } /** - * @brief Initializes all cards or single card as the case may be Card(s) come - * into standby state. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Gets the SD status info. + * @param hsd: Pointer to SD handle + * @param pStatus: Pointer to the HAL_SD_CardStatusTypeDef structure that + * will contain the SD card status information + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd) +HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint16_t sd_rca = 1U; + uint32_t tmp = 0U; + uint32_t sd_status[16U]; + uint32_t errorstate = HAL_SD_ERROR_NONE; - if(SDIO_GetPowerState(hsd->Instance) == 0U) /* Power off */ + errorstate = SD_SendSDStatus(hsd, sd_status); + if(errorstate != HAL_OK) { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->ErrorCode |= errorstate; + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; } - - if(hsd->CardType != SECURE_DIGITAL_IO_CARD) + else { - /* Send CMD2 ALL_SEND_CID */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_ALL_SEND_CID; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + /* Byte 0 */ + tmp = (sd_status[0U] & 0xC0U) >> 6U; + pStatus->DataBusWidth = (uint8_t)tmp; - /* Check for error conditions */ - errorstate = SD_CmdResp2Error(hsd); + /* Byte 0 */ + tmp = (sd_status[0U] & 0x20U) >> 5U; + pStatus->SecuredMode = (uint8_t)tmp; - if(errorstate != SD_OK) - { - return errorstate; - } + /* Byte 2 */ + tmp = (sd_status[0U] & 0x00FF0000U) >> 16U; + pStatus->CardType = (uint16_t)(tmp << 8U); - /* Get Card identification number data */ - hsd->CID[0U] = SDIO_GetResponse(SDIO_RESP1); - hsd->CID[1U] = SDIO_GetResponse(SDIO_RESP2); - hsd->CID[2U] = SDIO_GetResponse(SDIO_RESP3); - hsd->CID[3U] = SDIO_GetResponse(SDIO_RESP4); - } - - if((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == SECURE_DIGITAL_IO_COMBO_CARD) || (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send CMD3 SET_REL_ADDR with argument 0 */ - /* SD Card publishes its RCA. */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_REL_ADDR; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + /* Byte 3 */ + tmp = (sd_status[0U] & 0xFF000000U) >> 24U; + pStatus->CardType |= (uint16_t)tmp; - /* Check for error conditions */ - errorstate = SD_CmdResp6Error(hsd, SD_CMD_SET_REL_ADDR, &sd_rca); + /* Byte 4 */ + tmp = (sd_status[1U] & 0xFFU); + pStatus->ProtectedAreaSize = (uint32_t)(tmp << 24U); - if(errorstate != SD_OK) - { - return errorstate; - } - } - - if (hsd->CardType != SECURE_DIGITAL_IO_CARD) - { - /* Get the SD card RCA */ - hsd->RCA = sd_rca; + /* Byte 5 */ + tmp = (sd_status[1U] & 0xFF00U) >> 8U; + pStatus->ProtectedAreaSize |= (uint32_t)(tmp << 16U); - /* Send CMD9 SEND_CSD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_CSD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + /* Byte 6 */ + tmp = (sd_status[1U] & 0xFF0000U) >> 16U; + pStatus->ProtectedAreaSize |= (uint32_t)(tmp << 8U); - /* Check for error conditions */ - errorstate = SD_CmdResp2Error(hsd); + /* Byte 7 */ + tmp = (sd_status[1U] & 0xFF000000U) >> 24U; + pStatus->ProtectedAreaSize |= (uint32_t)tmp; - if(errorstate != SD_OK) - { - return errorstate; - } + /* Byte 8 */ + tmp = (sd_status[2U] & 0xFFU); + pStatus->SpeedClass = (uint8_t)tmp; + + /* Byte 9 */ + tmp = (sd_status[2U] & 0xFF00U) >> 8U; + pStatus->PerformanceMove = (uint8_t)tmp; + + /* Byte 10 */ + tmp = (sd_status[2U] & 0xF00000U) >> 20U; + pStatus->AllocationUnitSize = (uint8_t)tmp; + + /* Byte 11 */ + tmp = (sd_status[2U] & 0xFF000000U) >> 24U; + pStatus->EraseSize = (uint16_t)(tmp << 8U); + + /* Byte 12 */ + tmp = (sd_status[3U] & 0xFFU); + pStatus->EraseSize |= (uint16_t)tmp; + + /* Byte 13 */ + tmp = (sd_status[3U] & 0xFC00U) >> 10U; + pStatus->EraseTimeout = (uint8_t)tmp; - /* Get Card Specific Data */ - hsd->CSD[0U] = SDIO_GetResponse(SDIO_RESP1); - hsd->CSD[1U] = SDIO_GetResponse(SDIO_RESP2); - hsd->CSD[2U] = SDIO_GetResponse(SDIO_RESP3); - hsd->CSD[3U] = SDIO_GetResponse(SDIO_RESP4); + /* Byte 13 */ + tmp = (sd_status[3U] & 0x0300U) >> 8U; + pStatus->EraseOffset = (uint8_t)tmp; } - /* All cards are initialized */ - return errorstate; + return HAL_OK; } /** - * @brief Selects of Deselects the corresponding card. - * @param hsd: SD handle - * @param addr: Address of the card to be selected - * @retval SD Card error state + * @brief Gets the SD card info. + * @param hsd: Pointer to SD handle + * @param pCardInfo: Pointer to the HAL_SD_CardInfoTypeDef structure that + * will contain the SD card status information + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr) +HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Send CMD7 SDIO_SEL_DESEL_CARD */ - sdio_cmdinitstructure.Argument = (uint32_t)addr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEL_DESEL_CARD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + pCardInfo->CardType = (uint32_t)(hsd->SdCard.CardType); + pCardInfo->CardVersion = (uint32_t)(hsd->SdCard.CardVersion); + pCardInfo->Class = (uint32_t)(hsd->SdCard.Class); + pCardInfo->RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd); + pCardInfo->BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr); + pCardInfo->BlockSize = (uint32_t)(hsd->SdCard.BlockSize); + pCardInfo->LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr); + pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize); - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEL_DESEL_CARD); - - return errorstate; + return HAL_OK; } /** - * @brief Enquires cards about their operating voltage and configures clock - * controls and stores SD information that will be needed in future - * in the SD handle. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Enables wide bus operation for the requested card if supported by + * card. + * @param hsd: Pointer to SD handle + * @param WideMode: Specifies the SD card wide bus mode + * This parameter can be one of the following values: + * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer + * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer + * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd) +HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - __IO HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response = 0U, count = 0U, validvoltage = 0U; - uint32_t sdtype = SD_STD_CAPACITY; - - /* Power ON Sequence -------------------------------------------------------*/ - /* Disable SDIO Clock */ - __HAL_SD_SDIO_DISABLE(); - - /* Set Power State to ON */ - SDIO_PowerState_ON(hsd->Instance); - - /* 1ms: required power up waiting time before starting the SD initialization - sequence */ - HAL_Delay(1); - - /* Enable SDIO Clock */ - __HAL_SD_SDIO_ENABLE(); - - /* CMD0: GO_IDLE_STATE -----------------------------------------------------*/ - /* No CMD response required */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_GO_IDLE_STATE; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_NO; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdError(hsd); - - if(errorstate != SD_OK) - { - /* CMD Response Timeout (wait for CMDSENT flag) */ - return errorstate; - } - - /* CMD8: SEND_IF_COND ------------------------------------------------------*/ - /* Send CMD8 to verify SD card interface operating condition */ - /* Argument: - [31:12]: Reserved (shall be set to '0') - - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V) - - [7:0]: Check Pattern (recommended 0xAA) */ - /* CMD Response: R7 */ - sdio_cmdinitstructure.Argument = SD_CHECK_PATTERN; - sdio_cmdinitstructure.CmdIndex = SD_SDIO_SEND_IF_COND; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp7Error(hsd); - - if (errorstate == SD_OK) - { - /* SD Card 2.0 */ - hsd->CardType = STD_CAPACITY_SD_CARD_V2_0; - sdtype = SD_HIGH_CAPACITY; - } + SDIO_InitTypeDef Init; + uint32_t errorstate = HAL_SD_ERROR_NONE; - /* Send CMD55 */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + /* Check the parameters */ + assert_param(IS_SDIO_BUS_WIDE(WideMode)); - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); + /* Chnage Satte */ + hsd->State = HAL_SD_STATE_BUSY; - /* If errorstate is Command Timeout, it is a MMC card */ - /* If errorstate is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) - or SD card 1.x */ - if(errorstate == SD_OK) + if(hsd->SdCard.CardType != CARD_SECURED) { - /* SD CARD */ - /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */ - while((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) + if(WideMode == SDIO_BUS_WIDE_8B) { + hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE; + } + else if(WideMode == SDIO_BUS_WIDE_4B) + { + errorstate = SD_WideBus_Enable(hsd); - /* SEND CMD55 APP_CMD with RCA as 0 */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD41 */ - sdio_cmdinitstructure.Argument = SD_VOLTAGE_WINDOW_SD | sdtype; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_OP_COND; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp3Error(hsd); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Get command response */ - response = SDIO_GetResponse(SDIO_RESP1); - - /* Get operating voltage*/ - validvoltage = (((response >> 31U) == 1U) ? 1U : 0U); - - count++; + hsd->ErrorCode |= errorstate; } - - if(count >= SD_MAX_VOLT_TRIAL) + else if(WideMode == SDIO_BUS_WIDE_1B) { - errorstate = SD_INVALID_VOLTRANGE; + errorstate = SD_WideBus_Disable(hsd); - return errorstate; + hsd->ErrorCode |= errorstate; } - - if((response & SD_HIGH_CAPACITY) == SD_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */ + else { - hsd->CardType = HIGH_CAPACITY_SD_CARD; + /* WideMode is not a valid argument*/ + hsd->ErrorCode |= HAL_SD_ERROR_PARAM; } - - } /* else MMC Card */ + } + else + { + /* MMC Card does not support this feature */ + hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE; + } + + if(hsd->ErrorCode != HAL_SD_ERROR_NONE) + { + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + hsd->State = HAL_SD_STATE_READY; + return HAL_ERROR; + } + else + { + /* Configure the SDIO peripheral */ + Init.ClockEdge = hsd->Init.ClockEdge; + Init.ClockBypass = hsd->Init.ClockBypass; + Init.ClockPowerSave = hsd->Init.ClockPowerSave; + Init.BusWide = WideMode; + Init.HardwareFlowControl = hsd->Init.HardwareFlowControl; + Init.ClockDiv = hsd->Init.ClockDiv; + SDIO_Init(hsd->Instance, Init); + } + + /* Change State */ + hsd->State = HAL_SD_STATE_READY; - return errorstate; + return HAL_OK; } + /** - * @brief Turns the SDIO output signals off. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Gets the current sd card data state. + * @param hsd: pointer to SD handle + * @retval Card state */ -static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd) +HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd) { - HAL_SD_ErrorTypedef errorstate = SD_OK; + HAL_SD_CardStateTypeDef cardstate = HAL_SD_CARD_TRANSFER; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint32_t resp1 = 0; - /* Set Power State to OFF */ - SDIO_PowerState_OFF(hsd->Instance); + errorstate = SD_SendStatus(hsd, &resp1); + if(errorstate != HAL_OK) + { + hsd->ErrorCode |= errorstate; + } + + cardstate = (HAL_SD_CardStateTypeDef)((resp1 >> 9U) & 0x0FU); - return errorstate; + return cardstate; } /** - * @brief Returns the current card's status. - * @param hsd: SD handle - * @param pCardStatus: pointer to the buffer that will contain the SD card - * status (Card Status register) - * @retval SD Card error state + * @brief Abort the current transfer and disable the SD. + * @param hsd: pointer to a SD_HandleTypeDef structure that contains + * the configuration information for SD module. + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus) +HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; + HAL_SD_CardStateTypeDef CardState; - if(pCardStatus == NULL) + /* DIsable All interrupts */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); + + /* Clear All flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + + if((hsd->hdmatx != NULL) || (hsd->hdmarx != NULL)) { - errorstate = SD_INVALID_PARAMETER; + /* Disable the SD DMA request */ + hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); - return errorstate; + /* Abort the SD DMA Tx Stream */ + if(hsd->hdmatx != NULL) + { + HAL_DMA_Abort(hsd->hdmatx); + } + /* Abort the SD DMA Rx Stream */ + if(hsd->hdmarx != NULL) + { + HAL_DMA_Abort(hsd->hdmarx); + } } - /* Send Status command */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEND_STATUS); - - if(errorstate != SD_OK) + hsd->State = HAL_SD_STATE_READY; + CardState = HAL_SD_GetCardState(hsd); + if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING)) { - return errorstate; + hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance); } - - /* Get SD card status */ - *pCardStatus = SDIO_GetResponse(SDIO_RESP1); - - return errorstate; + if(hsd->ErrorCode != HAL_SD_ERROR_NONE) + { + return HAL_ERROR; + } + return HAL_OK; } /** - * @brief Checks for error conditions for CMD0. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Abort the current transfer and disable the SD (IT mode). + * @param hsd: pointer to a SD_HandleTypeDef structure that contains + * the configuration information for SD module. + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd) +HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd) { - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout, tmp; + HAL_SD_CardStateTypeDef CardState; + + /* DIsable All interrupts */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); - timeout = SDIO_CMD0TIMEOUT; + /* Clear All flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT); - - while((timeout > 0U) && (!tmp)) + if((hsd->hdmatx != NULL) || (hsd->hdmarx != NULL)) { - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT); - timeout--; + /* Disable the SD DMA request */ + hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + /* Abort the SD DMA Tx Stream */ + if(hsd->hdmatx != NULL) + { + hsd->hdmatx->XferAbortCallback = SD_DMATxAbort; + if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK) + { + hsd->hdmatx = NULL; + } + } + /* Abort the SD DMA Rx Stream */ + if(hsd->hdmarx != NULL) + { + hsd->hdmarx->XferAbortCallback = SD_DMARxAbort; + if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK) + { + hsd->hdmarx = NULL; + } + } } - if(timeout == 0U) + /* No transfer ongoing on both DMA channels*/ + if((hsd->hdmatx == NULL) && (hsd->hdmarx == NULL)) { - errorstate = SD_CMD_RSP_TIMEOUT; - return errorstate; + CardState = HAL_SD_GetCardState(hsd); + hsd->State = HAL_SD_STATE_READY; + if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING)) + { + hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance); + } + if(hsd->ErrorCode != HAL_SD_ERROR_NONE) + { + return HAL_ERROR; + } + else + { + HAL_SD_AbortCallback(hsd); + } } - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; + return HAL_OK; } /** - * @brief Checks for error conditions for R7 response. - * @param hsd: SD handle - * @retval SD Card error state + * @} */ -static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_ERROR; - uint32_t timeout = SDIO_CMD0TIMEOUT, tmp; - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT); +/** + * @} + */ - while((!tmp) && (timeout > 0U)) - { - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT); - timeout--; - } +/* Private function ----------------------------------------------------------*/ +/** @addtogroup SD_Private_Functions + * @{ + */ + +/** + * @brief DMA SD transmit process complete callback + * @param hdma: DMA handle + * @retval None + */ +static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent); - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT); + /* Enable DATAEND Interrupt */ + __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DATAEND)); +} + +/** + * @brief DMA SD receive process complete callback + * @param hdma: DMA handle + * @retval None + */ +static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent); + uint32_t errorstate = HAL_SD_ERROR_NONE; - if((timeout == 0U) || tmp) + /* Send stop command in multiblock write */ + if(hsd->Context == (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA)) { - /* Card is not V2.0 compliant or card does not support the set voltage range */ - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; + errorstate = SDMMC_CmdStopTransfer(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + hsd->ErrorCode |= errorstate; + HAL_SD_ErrorCallback(hsd); + } } - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDREND)) - { - /* Card is SD V2.0 compliant */ - errorstate = SD_OK; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CMDREND); - - return errorstate; - } + /* Disable the DMA transfer for transmit request by setting the DMAEN bit + in the SD DCTRL register */ + hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN); + + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - return errorstate; + hsd->State = HAL_SD_STATE_READY; + + HAL_SD_RxCpltCallback(hsd); } /** - * @brief Checks for error conditions for R1 response. - * @param hsd: SD handle - * @param SD_CMD: The sent command index - * @retval SD Card error state + * @brief DMA SD communication error callback + * @param hdma: DMA handle + * @retval None */ -static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD) +static void SD_DMAError(DMA_HandleTypeDef *hdma) { - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response_r1; + SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent); + HAL_SD_CardStateTypeDef CardState; - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) + if((hsd->hdmarx->ErrorCode == HAL_DMA_ERROR_TE) || (hsd->hdmatx->ErrorCode == HAL_DMA_ERROR_TE)) { - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; + /* Clear All flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); + /* Disable All interrupts */ + __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\ + SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR); - return errorstate; - } - - /* Check response received is of desired command */ - if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD) - { - errorstate = SD_ILLEGAL_CMD; + hsd->ErrorCode |= HAL_SD_ERROR_DMA; + CardState = HAL_SD_GetCardState(hsd); + if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING)) + { + hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance); + } - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it for analysis */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return errorstate; - } - - if((response_r1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if((response_r1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if((response_r1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if((response_r1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if((response_r1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if((response_r1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); + hsd->State= HAL_SD_STATE_READY; } + + HAL_SD_ErrorCallback(hsd); +} + +/** + * @brief DMA SD Tx Abort callback + * @param hdma: DMA handle + * @retval None + */ +static void SD_DMATxAbort(DMA_HandleTypeDef *hdma) +{ + SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent); + HAL_SD_CardStateTypeDef CardState; - if((response_r1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED) + if(hsd->hdmatx != NULL) { - return(SD_LOCK_UNLOCK_FAILED); + hsd->hdmatx = NULL; } - if((response_r1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED) + /* All DMA channels are aborted */ + if(hsd->hdmarx == NULL) { - return(SD_COM_CRC_FAILED); + CardState = HAL_SD_GetCardState(hsd); + hsd->ErrorCode = HAL_SD_ERROR_NONE; + hsd->State = HAL_SD_STATE_READY; + if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING)) + { + hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance); + + if(hsd->ErrorCode != HAL_SD_ERROR_NONE) + { + HAL_SD_AbortCallback(hsd); + } + else + { + HAL_SD_ErrorCallback(hsd); + } + } } +} + +/** + * @brief DMA SD Rx Abort callback + * @param hdma: DMA handle + * @retval None + */ +static void SD_DMARxAbort(DMA_HandleTypeDef *hdma) +{ + SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent); + HAL_SD_CardStateTypeDef CardState; - if((response_r1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD) + if(hsd->hdmarx != NULL) { - return(SD_ILLEGAL_CMD); + hsd->hdmarx = NULL; } - if((response_r1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED) + /* All DMA channels are aborted */ + if(hsd->hdmatx == NULL) { - return(SD_CARD_ECC_FAILED); + CardState = HAL_SD_GetCardState(hsd); + hsd->ErrorCode = HAL_SD_ERROR_NONE; + hsd->State = HAL_SD_STATE_READY; + if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING)) + { + hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance); + + if(hsd->ErrorCode != HAL_SD_ERROR_NONE) + { + HAL_SD_AbortCallback(hsd); + } + else + { + HAL_SD_ErrorCallback(hsd); + } + } } +} + + +/** + * @brief Initializes the sd card. + * @param hsd: Pointer to SD handle + * @retval SD Card error state + */ +static uint32_t SD_InitCard(SD_HandleTypeDef *hsd) +{ + HAL_SD_CardCSDTypeDef CSD; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint16_t sd_rca = 1U; - if((response_r1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR) + /* Check the power State */ + if(SDIO_GetPowerState(hsd->Instance) == 0U) { - return(SD_CC_ERROR); + /* Power off */ + return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE; } - if((response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR) + if(hsd->SdCard.CardType != CARD_SECURED) { - return(SD_GENERAL_UNKNOWN_ERROR); + /* Send CMD2 ALL_SEND_CID */ + errorstate = SDMMC_CmdSendCID(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) + { + return errorstate; + } + else + { + /* Get Card identification number data */ + hsd->CID[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1); + hsd->CID[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2); + hsd->CID[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3); + hsd->CID[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4); + } } - if((response_r1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN) + if(hsd->SdCard.CardType != CARD_SECURED) { - return(SD_STREAM_READ_UNDERRUN); + /* Send CMD3 SET_REL_ADDR with argument 0 */ + /* SD Card publishes its RCA. */ + errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca); + if(errorstate != HAL_SD_ERROR_NONE) + { + return errorstate; + } } - - if((response_r1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN) + if(hsd->SdCard.CardType != CARD_SECURED) { - return(SD_STREAM_WRITE_OVERRUN); + /* Get the SD card RCA */ + hsd->SdCard.RelCardAdd = sd_rca; + + /* Send CMD9 SEND_CSD with argument as card's RCA */ + errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U)); + if(errorstate != HAL_SD_ERROR_NONE) + { + return errorstate; + } + else + { + /* Get Card Specific Data */ + hsd->CSD[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1); + hsd->CSD[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2); + hsd->CSD[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3); + hsd->CSD[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4); + } } - if((response_r1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE) - { - return(SD_CID_CSD_OVERWRITE); - } + /* Get the Card Class */ + hsd->SdCard.Class = (SDIO_GetResponse(hsd->Instance, SDIO_RESP2) >> 20U); - if((response_r1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP) + /* Get CSD parameters */ + HAL_SD_GetCardCSD(hsd, &CSD); + + /* Select the Card */ + errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U)); + if(errorstate != HAL_SD_ERROR_NONE) { - return(SD_WP_ERASE_SKIP); + return errorstate; } + + /* Configure SDIO peripheral interface */ + SDIO_Init(hsd->Instance, hsd->Init); + + /* All cards are initialized */ + return HAL_SD_ERROR_NONE; +} + +/** + * @brief Enquires cards about their operating voltage and configures clock + * controls and stores SD information that will be needed in future + * in the SD handle. + * @param hsd: Pointer to SD handle + * @retval error state + */ +static uint32_t SD_PowerON(SD_HandleTypeDef *hsd) +{ + __IO uint32_t count = 0U; + uint32_t response = 0U, validvoltage = 0U; + uint32_t errorstate = HAL_SD_ERROR_NONE; - if((response_r1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED) + /* CMD0: GO_IDLE_STATE */ + errorstate = SDMMC_CmdGoIdleState(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) { - return(SD_CARD_ECC_DISABLED); + return errorstate; } - if((response_r1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET) + /* CMD8: SEND_IF_COND: Command available only on V2.0 cards */ + errorstate = SDMMC_CmdOperCond(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) { - return(SD_ERASE_RESET); + hsd->SdCard.CardVersion = CARD_V1_X; + + /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */ + while(validvoltage == 0U) + { + if(count++ == SDMMC_MAX_VOLT_TRIAL) + { + return HAL_SD_ERROR_INVALID_VOLTRANGE; + } + + /* SEND CMD55 APP_CMD with RCA as 0 */ + errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0U); + if(errorstate != HAL_SD_ERROR_NONE) + { + return HAL_SD_ERROR_UNSUPPORTED_FEATURE; + } + + /* Send CMD41 */ + errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_STD_CAPACITY); + if(errorstate != HAL_SD_ERROR_NONE) + { + return HAL_SD_ERROR_UNSUPPORTED_FEATURE; + } + + /* Get command response */ + response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1); + + /* Get operating voltage*/ + validvoltage = (((response >> 31U) == 1U) ? 1U : 0U); + } + /* Card type is SDSC */ + hsd->SdCard.CardType = CARD_SDSC; } - - if((response_r1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR) + else { - return(SD_AKE_SEQ_ERROR); + hsd->SdCard.CardVersion = CARD_V2_X; + + /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */ + while(validvoltage == 0U) + { + if(count++ == SDMMC_MAX_VOLT_TRIAL) + { + return HAL_SD_ERROR_INVALID_VOLTRANGE; + } + + /* SEND CMD55 APP_CMD with RCA as 0 */ + errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0U); + if(errorstate != HAL_SD_ERROR_NONE) + { + return errorstate; + } + + /* Send CMD41 */ + errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_HIGH_CAPACITY); + if(errorstate != HAL_SD_ERROR_NONE) + { + return errorstate; + } + + /* Get command response */ + response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1); + + /* Get operating voltage*/ + validvoltage = (((response >> 31U) == 1U) ? 1U : 0U); + } + + if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */ + { + hsd->SdCard.CardType = CARD_SDHC_SDXC; + } + else + { + hsd->SdCard.CardType = CARD_SDSC; + } } - return errorstate; + return HAL_SD_ERROR_NONE; } /** - * @brief Checks for error conditions for R3 (OCR) response. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Turns the SDIO output signals off. + * @param hsd: Pointer to SD handle + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd) +static HAL_StatusTypeDef SD_PowerOFF(SD_HandleTypeDef *hsd) { - HAL_SD_ErrorTypedef errorstate = SD_OK; - - while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + /* Set Power State to OFF */ + SDIO_PowerState_OFF(hsd->Instance); - return errorstate; + return HAL_OK; } /** - * @brief Checks for error conditions for R2 (CID or CSD) response. - * @param hsd: SD handle - * @retval SD Card error state + * @brief Send Status info command. + * @param hsd: pointer to SD handle + * @param pSDstatus: Pointer to the buffer that will contain the SD card status + * SD Status register) + * @retval error state */ -static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd) +static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus) { - HAL_SD_ErrorTypedef errorstate = SD_OK; + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); + uint32_t count = 0U; - while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) + /* Check SD response */ + if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED) { + return HAL_SD_ERROR_LOCK_UNLOCK_FAILED; } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) + + /* Set block size for card if it is not equal to current block size for card */ + errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U); + if(errorstate != HAL_SD_ERROR_NONE) { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - + hsd->ErrorCode |= HAL_SD_ERROR_NONE; return errorstate; } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) + + /* Send CMD55 */ + errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U)); + if(errorstate != HAL_SD_ERROR_NONE) { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - + hsd->ErrorCode |= HAL_SD_ERROR_NONE; return errorstate; } - else - { - /* No error flag set */ - } - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Checks for error conditions for R6 (RCA) response. - * @param hsd: SD handle - * @param SD_CMD: The sent command index - * @param pRCA: Pointer to the variable that will contain the SD card relative - * address RCA - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response_r1; + /* Configure the SD DPSM (Data Path State Machine) */ + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = 64U; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_64B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) + /* Send ACMD13 (SD_APP_STAUS) with argument as card's RCA */ + errorstate = SDMMC_CmdStatusRegister(hsd->Instance); + if(errorstate != HAL_SD_ERROR_NONE) { + hsd->ErrorCode |= HAL_SD_ERROR_NONE; + return errorstate; } - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) + /* Get status data */ + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) + { + for(count = 0U; count < 8U; count++) + { + *(pSDstatus + count) = SDIO_ReadFIFO(hsd->Instance); + } + + pSDstatus += 8U; + } - return errorstate; + if((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT) + { + return HAL_SD_ERROR_TIMEOUT; + } } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) + + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; + return HAL_SD_ERROR_DATA_TIMEOUT; } - else + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) { - /* No error flag set */ + return HAL_SD_ERROR_DATA_CRC_FAIL; } - - /* Check response received is of desired command */ - if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD) + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) { - errorstate = SD_ILLEGAL_CMD; - - return errorstate; + return HAL_SD_ERROR_RX_OVERRUN; } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it. */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if((response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED)) == SD_ALLZERO) + + while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))) { - *pRCA = (uint16_t) (response_r1 >> 16U); + *pSDstatus = SDIO_ReadFIFO(hsd->Instance); + pSDstatus++; - return errorstate; + if((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT) + { + return HAL_SD_ERROR_TIMEOUT; + } } - if((response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR) == SD_R6_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } + /* Clear all the static status flags*/ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - if((response_r1 & SD_R6_ILLEGAL_CMD) == SD_R6_ILLEGAL_CMD) + return HAL_SD_ERROR_NONE; +} + +/** + * @brief Returns the current card's status. + * @param hsd: Pointer to SD handle + * @param pCardStatus: pointer to the buffer that will contain the SD card + * status (Card Status register) + * @retval error state + */ +static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus) +{ + uint32_t errorstate = HAL_SD_ERROR_NONE; + + if(pCardStatus == NULL) { - return(SD_ILLEGAL_CMD); + return HAL_SD_ERROR_PARAM; } - if((response_r1 & SD_R6_COM_CRC_FAILED) == SD_R6_COM_CRC_FAILED) + /* Send Status command */ + errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U)); + if(errorstate != HAL_OK) { - return(SD_COM_CRC_FAILED); + return errorstate; } - return errorstate; + /* Get SD card status */ + *pCardStatus = SDIO_GetResponse(hsd->Instance, SDIO_RESP1); + + return HAL_SD_ERROR_NONE; } /** * @brief Enables the SDIO wide bus mode. - * @param hsd: SD handle - * @retval SD Card error state + * @param hsd: pointer to SD handle + * @retval error state */ -static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd) +static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t scr[2U] = {0U, 0U}; + uint32_t errorstate = HAL_SD_ERROR_NONE; - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) + if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED) { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; + return HAL_SD_ERROR_LOCK_UNLOCK_FAILED; } /* Get SCR Register */ errorstate = SD_FindSCR(hsd, scr); - - if(errorstate != SD_OK) + if(errorstate != HAL_OK) { return errorstate; } /* If requested card supports wide bus operation */ - if((scr[1U] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO) + if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO) { /* Send CMD55 APP_CMD with argument as card's RCA.*/ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U)); + if(errorstate != HAL_OK) { return errorstate; } /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */ - sdio_cmdinitstructure.Argument = 2U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U); + if(errorstate != HAL_OK) { return errorstate; } - - return errorstate; + + return HAL_SD_ERROR_NONE; } else { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; + return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE; } -} +} /** * @brief Disables the SDIO wide bus mode. - * @param hsd: SD handle - * @retval SD Card error state + * @param hsd: Pointer to SD handle + * @retval error state */ -static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd) +static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t scr[2U] = {0U, 0U}; + uint32_t errorstate = HAL_SD_ERROR_NONE; - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) + if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED) { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; + return HAL_SD_ERROR_LOCK_UNLOCK_FAILED; } /* Get SCR Register */ errorstate = SD_FindSCR(hsd, scr); - - if(errorstate != SD_OK) + if(errorstate != HAL_OK) { return errorstate; } /* If requested card supports 1 bit mode operation */ - if((scr[1U] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO) + if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO) { /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U)); + if(errorstate != HAL_OK) { return errorstate; } /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U); + if(errorstate != HAL_OK) { return errorstate; } - return errorstate; + return HAL_SD_ERROR_NONE; } else { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; + return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE; } } /** * @brief Finds the SD card SCR register value. - * @param hsd: SD handle + * @param hsd: Pointer to SD handle * @param pSCR: pointer to the buffer that will contain the SCR value - * @retval SD Card error state + * @retval error state */ -static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR) +static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; + SDIO_DataInitTypeDef config; + uint32_t errorstate = HAL_SD_ERROR_NONE; + uint32_t tickstart = HAL_GetTick(); uint32_t index = 0U; uint32_t tempscr[2U] = {0U, 0U}; /* Set Block Size To 8 Bytes */ - /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)8U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U); + if(errorstate != HAL_OK) { return errorstate; } - + /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)((hsd->RCA) << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U)); + if(errorstate != HAL_OK) { return errorstate; } - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 8U; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_8B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); + + config.DataTimeOut = SDMMC_DATATIMEOUT; + config.DataLength = 8U; + config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B; + config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; + config.TransferMode = SDIO_TRANSFER_MODE_BLOCK; + config.DPSM = SDIO_DPSM_ENABLE; + SDIO_ConfigData(hsd->Instance, &config); /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */ - sdio_cmdinitstructure.Argument = 0U; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_SEND_SCR; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_SEND_SCR); - - if(errorstate != SD_OK) + errorstate = SDMMC_CmdSendSCR(hsd->Instance); + if(errorstate != HAL_OK) { return errorstate; } -#ifdef SDIO_STA_STBITERR - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) -#else /* SDIO_STA_STBITERR not defined */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) -#endif /* SDIO_STA_STBITERR */ + + while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND)) { - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) { *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance); index++; } - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - errorstate = SD_DATA_TIMEOUT; - - return errorstate; + if((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT) + { + return HAL_SD_ERROR_TIMEOUT; + } } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) + + if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - return errorstate; + return HAL_SD_ERROR_DATA_TIMEOUT; } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - return errorstate; + return HAL_SD_ERROR_DATA_CRC_FAIL; } -#ifdef SDIO_STA_STBITERR - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) + else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); + __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - errorstate = SD_START_BIT_ERR; - - return errorstate; + return HAL_SD_ERROR_RX_OVERRUN; } -#endif /* SDIO_STA_STBITERR */ else { /* No error flag set */ + /* Clear all the static flags */ + __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); + + *(pSCR + 1U) = ((tempscr[0U] & SDMMC_0TO7BITS) << 24U) | ((tempscr[0U] & SDMMC_8TO15BITS) << 8U) |\ + ((tempscr[0U] & SDMMC_16TO23BITS) >> 8U) | ((tempscr[0U] & SDMMC_24TO31BITS) >> 24U); + + *(pSCR) = ((tempscr[1U] & SDMMC_0TO7BITS) << 24U) | ((tempscr[1U] & SDMMC_8TO15BITS) << 8U) |\ + ((tempscr[1U] & SDMMC_16TO23BITS) >> 8U) | ((tempscr[1U] & SDMMC_24TO31BITS) >> 24U); } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - *(pSCR + 1U) = ((tempscr[0U] & SD_0TO7BITS) << 24U) | ((tempscr[0U] & SD_8TO15BITS) << 8U) |\ - ((tempscr[0U] & SD_16TO23BITS) >> 8U) | ((tempscr[0U] & SD_24TO31BITS) >> 24U); - - *(pSCR) = ((tempscr[1U] & SD_0TO7BITS) << 24U) | ((tempscr[1U] & SD_8TO15BITS) << 8U) |\ - ((tempscr[1U] & SD_16TO23BITS) >> 8U) | ((tempscr[1U] & SD_24TO31BITS) >> 24U); - - return errorstate; + + return HAL_SD_ERROR_NONE; } /** - * @brief Checks if the SD card is in programming state. - * @param hsd: SD handle - * @param pStatus: pointer to the variable that will contain the SD card state - * @retval SD Card error state + * @brief Wrap up reading in non-blocking mode. + * @param hsd: pointer to a SD_HandleTypeDef structure that contains + * the configuration information. + * @retval HAL status */ -static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus) +static HAL_StatusTypeDef SD_Read_IT(SD_HandleTypeDef *hsd) { - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - __IO uint32_t responseR1 = 0U; - - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16U); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Check response received is of desired command */ - if((uint32_t)SDIO_GetCommandResponse(hsd->Instance) != SD_CMD_SEND_STATUS) - { - errorstate = SD_ILLEGAL_CMD; - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - - /* We have received response, retrieve it for analysis */ - responseR1 = SDIO_GetResponse(SDIO_RESP1); - - /* Find out card status */ - *pStatus = (uint8_t)((responseR1 >> 9U) & 0x0000000FU); - - if((responseR1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return errorstate; - } - - if((responseR1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if((responseR1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if((responseR1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if((responseR1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if((responseR1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if((responseR1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } - - if((responseR1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } - - if((responseR1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - if((responseR1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if((responseR1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } - - if((responseR1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } - - if((responseR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if((responseR1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } + uint32_t count = 0U; + uint32_t* tmp; + + tmp = (uint32_t*)hsd->pRxBuffPtr; - if((responseR1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN) + /* Read data from SDIO Rx FIFO */ + for(count = 0U; count < 8U; count++) { - return(SD_STREAM_WRITE_OVERRUN); + *(tmp + count) = SDIO_ReadFIFO(hsd->Instance); } - if((responseR1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE) - { - return(SD_CID_CSD_OVERWRITE); - } + hsd->pRxBuffPtr += 8U; - if((responseR1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } + return HAL_OK; +} + +/** + * @brief Wrap up writing in non-blocking mode. + * @param hsd: pointer to a SD_HandleTypeDef structure that contains + * the configuration information. + * @retval HAL status + */ +static HAL_StatusTypeDef SD_Write_IT(SD_HandleTypeDef *hsd) +{ + uint32_t count = 0U; + uint32_t* tmp; - if((responseR1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } + tmp = (uint32_t*)hsd->pTxBuffPtr; - if((responseR1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET) + /* Write data to SDIO Tx FIFO */ + for(count = 0U; count < 8U; count++) { - return(SD_ERASE_RESET); + SDIO_WriteFIFO(hsd->Instance, (tmp + count)); } - if((responseR1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } + hsd->pTxBuffPtr += 8U; - return errorstate; -} + return HAL_OK; +} /** * @} */ + #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + #endif /* HAL_SD_MODULE_ENABLED */ /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c index eb2a006..e5f1136 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_sdram.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SDRAM HAL module driver. * This file provides a generic firmware to drive SDRAM memories mounted * as external device. @@ -63,7 +63,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.c index 123f7af..7b20e13 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_smartcard.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SMARTCARD HAL module driver. * This file provides firmware functions to manage the following * functionalities of the SMARTCARD peripheral: @@ -100,7 +100,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -199,13 +199,6 @@ static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDe (++) Word Length => Should be 9 bits (8 bits + parity) (++) Stop Bit (++) Parity: => Should be enabled - - (+++) +-------------------------------------------------------------+ - (+++) | M bit | PCE bit | SMARTCARD frame | - (+++) |---------------------|---------------------------------------| - (+++) | 1 | 1 | | SB | 8 bit data | PB | STB | | - (+++) +-------------------------------------------------------------+ - (++) USART polarity (++) USART phase (++) USART LastBit @@ -232,6 +225,13 @@ static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDe procedure (details for the procedure are available in reference manual (RM0329)). @endverbatim + + The SMARTCARD frame format is given in the following table: + +-------------------------------------------------------------+ + | M bit | PCE bit | SMARTCARD frame | + |---------------------|---------------------------------------| + | 1 | 1 | | SB | 8 bit data | PB | STB | | + +-------------------------------------------------------------+ * @{ */ @@ -268,7 +268,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc) MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_PSC, hsc->Init.Prescaler); /* Set the Guard Time */ - MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8)); + MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8U)); /* Set the Smartcard Communication parameters */ SMARTCARD_SetConfig(hsc); @@ -379,11 +379,14 @@ HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc) ##### IO operation functions ##### =============================================================================== [..] This subsection provides a set of functions allowing to manage the SMARTCARD data transfers. - Smartcard is a single wire half duplex communication protocol. + + [..] + (#) Smartcard is a single wire half duplex communication protocol. The Smartcard interface is designed to support asynchronous protocol Smartcards as - defined in the ISO 7816-3 standard. The USART should be configured as: - (+) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register - (+) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register. + defined in the ISO 7816-3 standard. + (#) The USART should be configured as: + (++) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register + (++) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register. (#) There are two modes of transfer: (++) Blocking mode: The communication is performed in polling mode. @@ -436,7 +439,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t * if(hsc->gState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -460,7 +463,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t * return HAL_TIMEOUT; } tmp = (uint16_t*) pData; - hsc->Instance->DR = (*tmp & (uint16_t)0x01FFU); + hsc->Instance->DR = (*tmp & (uint16_t)0x01FF); pData +=1U; } @@ -499,7 +502,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *p if(hsc->RxState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -525,7 +528,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *p return HAL_TIMEOUT; } tmp = (uint16_t*) pData; - *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFFU); + *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFF); pData +=1U; } @@ -556,7 +559,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_ /* Check that a Tx process is not already ongoing */ if(hsc->gState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -604,7 +607,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t /* Check that a Rx process is not already ongoing */ if(hsc->RxState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -651,7 +654,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8 /* Check that a Tx process is not already ongoing */ if(hsc->gState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -713,7 +716,7 @@ HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_ /* Check that a Rx process is not already ongoing */ if(hsc->RxState == HAL_SMARTCARD_STATE_READY) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -740,6 +743,9 @@ HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_ tmp = (uint32_t*)&pData; HAL_DMA_Start_IT(hsc->hdmarx, (uint32_t)&hsc->Instance->DR, *(uint32_t*)tmp, Size); + /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ + __HAL_SMARTCARD_CLEAR_OREFLAG(hsc); + /* Process Unlocked */ __HAL_UNLOCK(hsc); @@ -1583,7 +1589,7 @@ static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc) if(hsc->gState == HAL_SMARTCARD_STATE_BUSY_TX) { tmp = (uint16_t*) hsc->pTxBuffPtr; - hsc->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FFU); + hsc->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); hsc->pTxBuffPtr += 1U; if(--hsc->TxXferCount == 0U) @@ -1639,7 +1645,7 @@ static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc) if(hsc->RxState == HAL_SMARTCARD_STATE_BUSY_RX) { tmp = (uint16_t*) hsc->pRxBuffPtr; - *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0x00FFU); + *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0x00FF); hsc->pRxBuffPtr += 1U; if(--hsc->RxXferCount == 0U) @@ -1872,10 +1878,17 @@ static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc) CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE)); /*-------------------------- USART BRR Configuration -----------------------*/ +#if defined(USART6) if((hsc->Instance == USART1) || (hsc->Instance == USART6)) { hsc->Instance->BRR = SMARTCARD_BRR(HAL_RCC_GetPCLK2Freq(), hsc->Init.BaudRate); } +#else + if(hsc->Instance == USART1) + { + hsc->Instance->BRR = SMARTCARD_BRR(HAL_RCC_GetPCLK2Freq(), hsc->Init.BaudRate); + } +#endif /* USART6 */ else { hsc->Instance->BRR = SMARTCARD_BRR(HAL_RCC_GetPCLK1Freq(), hsc->Init.BaudRate); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c index 4256657..b6716e0 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_spdifrx.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief This file provides firmware functions to manage the following * functionalities of the SPDIFRX audio interface: * + Initialization and Configuration @@ -94,7 +94,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -437,7 +437,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_SetDataFormat(SPDIFRX_HandleTypeDef *hspdif, SPDIF */ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size, uint32_t Timeout) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -462,7 +462,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow(SPDIFRX_HandleTypeDef *hspdif, uin __HAL_SPDIFRX_RCV(hspdif); /* Receive data flow */ - while(Size > 0U) + while(Size > 0) { /* Wait until RXNE flag is set */ if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_RXNE, RESET, Timeout) != HAL_OK) @@ -499,7 +499,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow(SPDIFRX_HandleTypeDef *hspdif, uin */ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow(SPDIFRX_HandleTypeDef *hspdif, uint32_t *pData, uint16_t Size, uint32_t Timeout) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -524,7 +524,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow(SPDIFRX_HandleTypeDef *hspdif, __HAL_SPDIFRX_RCV(hspdif); /* Receive control flow */ - while(Size > 0U) + while(Size > 0) { /* Wait until CSRNE flag is set */ if(SPDIFRX_WaitOnFlagUntilTimeout(hspdif, SPDIFRX_FLAG_CSRNE, RESET, Timeout) != HAL_OK) @@ -562,7 +562,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_IT(SPDIFRX_HandleTypeDef *hspdif, if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_CX)) { - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -599,7 +599,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_IT(SPDIFRX_HandleTypeDef *hspdif, /* Wait until SYNCD flag is set */ do { - if (count-- == 0) + if (count-- == 0U) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE); @@ -645,7 +645,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_IT(SPDIFRX_HandleTypeDef *hspdi if((hspdif->State == HAL_SPDIFRX_STATE_READY) || (hspdif->State == HAL_SPDIFRX_STATE_BUSY_RX)) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -682,7 +682,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_IT(SPDIFRX_HandleTypeDef *hspdi /* Wait until SYNCD flag is set */ do { - if (count-- == 0) + if (count-- == 0U) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE); @@ -726,7 +726,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_DMA(SPDIFRX_HandleTypeDef *hspdif, { __IO uint32_t count = SPDIFRX_TIMEOUT_VALUE * (SystemCoreClock / 24U / 1000U); - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -766,7 +766,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveDataFlow_DMA(SPDIFRX_HandleTypeDef *hspdif, /* Wait until SYNCD flag is set */ do { - if (count-- == 0) + if (count-- == 0U) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE); @@ -813,7 +813,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_DMA(SPDIFRX_HandleTypeDef *hspd { __IO uint32_t count = SPDIFRX_TIMEOUT_VALUE * (SystemCoreClock / 24U / 1000U); - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -853,7 +853,7 @@ HAL_StatusTypeDef HAL_SPDIFRX_ReceiveControlFlow_DMA(SPDIFRX_HandleTypeDef *hspd /* Wait until SYNCD flag is set */ do { - if (count-- == 0) + if (count-- == 0U) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SPDIFRX_DISABLE_IT(hspdif, SPDIFRX_IT_RXNE); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c index cffb349..4774dc2 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_spi.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SPI HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Serial Peripheral Interface (SPI) peripheral: @@ -59,72 +59,73 @@ does not initiate a new transfer the following procedure has to be respected: (##) HAL_SPI_DeInit() (##) HAL_SPI_Init() - [..] - Using the HAL it is not possible to reach all supported SPI frequency with the differents SPI Modes, - the following table resume the max SPI frequency reached with data size 8bits/16bits, - according to frequency used on APBx Peripheral Clock (fPCLK) used by the SPI instance : - - DataSize = SPI_DATASIZE_8BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Tranfert mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - - DataSize = SPI_DATASIZE_16BIT: - +----------------------------------------------------------------------------------------------+ - | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | - | Process | Tranfert mode |---------------------|----------------------|----------------------| - | | | Master | Slave | Master | Slave | Master | Slave | - |==============================================================================================| - | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | - | R |----------------|----------|----------|-----------|----------|-----------|----------| - | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | - |=========|================|==========|==========|===========|==========|===========|==========| - | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | - | |----------------|----------|----------|-----------|----------|-----------|----------| - | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | - | X |----------------|----------|----------|-----------|----------|-----------|----------| - | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| - +----------------------------------------------------------------------------------------------+ - @note The max SPI frequency depend on SPI data size (8bits, 16bits), - SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). - @note - (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() - (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() - (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() @endverbatim + + Using the HAL it is not possible to reach all supported SPI frequency with the differents SPI Modes, + the following tables resume the max SPI frequency reached with data size 8bits/16bits, + according to frequency used on APBx Peripheral Clock (fPCLK) used by the SPI instance : + + DataSize = SPI_DATASIZE_8BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Tranfert mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/8 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/2 | Fpclk/64 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| + +----------------------------------------------------------------------------------------------+ + + DataSize = SPI_DATASIZE_16BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Tranfert mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/4 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/32 | Fpclk/2 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/4 | Fpclk/4 | Fpclk/64 | Fpclk/2 | Fpclk/64 | Fpclk/2 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | Fpclk/64 | Fpclk/2 | Fpclk/128 | Fpclk/2 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/32 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/64 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/2 | Fpclk/128| + +----------------------------------------------------------------------------------------------+ + [..] + (@) The max SPI frequency depend on SPI data size (8bits, 16bits), + SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). + (@) + (+@) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() + (+@) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() + (+@) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -187,6 +188,8 @@ static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); static void SPI_DMAError(DMA_HandleTypeDef *hdma); static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, uint32_t State, uint32_t Timeout, uint32_t Tickstart); static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); @@ -202,6 +205,8 @@ static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); #endif /* USE_SPI_CRC */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); @@ -461,7 +466,7 @@ HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint goto error; } - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -638,7 +643,7 @@ HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint1 goto error; } - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -771,6 +776,7 @@ HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint1 } #endif /* USE_SPI_CRC */ + /* Check the end of the transaction */ if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) { /* Disable SPI peripheral */ @@ -837,7 +843,7 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxD goto error; } - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -880,7 +886,7 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxD /* Transmit and Receive data in 16 Bit mode */ if(hspi->Init.DataSize == SPI_DATASIZE_16BIT) { - if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01)) + if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01U)) { hspi->Instance->DR = *((uint16_t *)pTxData); pTxData += sizeof(uint16_t); @@ -925,7 +931,7 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxD /* Transmit and Receive data in 8 Bit mode */ else { - if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01)) + if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01U)) { *((__IO uint8_t*)&hspi->Instance->DR) = (*pTxData); pTxData += sizeof(uint8_t); @@ -1040,7 +1046,7 @@ HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, u /* Process Locked */ __HAL_LOCK(hspi); - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1140,7 +1146,7 @@ HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, ui goto error; } - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1233,7 +1239,7 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *p goto error; } - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) + if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1314,7 +1320,7 @@ HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, goto error; } - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1411,7 +1417,7 @@ HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, u goto error; } - if((pData == NULL) || (Size == 0U)) + if((pData == NULL) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1508,7 +1514,7 @@ HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t * goto error; } - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0U)) + if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0)) { errorcode = HAL_ERROR; goto error; @@ -1595,6 +1601,258 @@ error : return errorcode; } +/** + * @brief Abort ongoing transfer (blocking mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @note Once transfer is aborted, the __HAL_SPI_CLEAR_OVRFLAG() macro must be called in user application + * before starting new SPI receive process. + * @retval HAL status +*/ +HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + } + + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + } + + /* Clear ERRIE interrupts in case of DMA Mode */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + /* Disable the SPI DMA Tx or SPI DMA Rx request if enabled */ + if ((HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))) + { + /* Abort the SPI DMA Tx channel : use blocking DMA Abort API (no callback) */ + if(hspi->hdmatx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmatx->XferAbortCallback = NULL; + + /* Abort DMA Tx Handle linked to SPI Peripheral */ + HAL_DMA_Abort(hspi->hdmatx); + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); + + /* Wait until TXE flag is set */ + do + { + if(count-- == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + break; + } + } + while((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + } + /* Abort the SPI DMA Rx channel : use blocking DMA Abort API (no callback) */ + if(hspi->hdmarx != NULL) + { + /* Set the SPI DMA Abort callback : + will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ + hspi->hdmarx->XferAbortCallback = NULL; + + /* Abort DMA Rx Handle linked to SPI Peripheral */ + HAL_DMA_Abort(hspi->hdmarx); + + /* Disable peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); + + } + } + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->state to ready */ + hspi->State = HAL_SPI_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfer (Interrupt mode). + * @param hspi SPI handle. + * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), + * started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable SPI Interrupts (depending of transfer direction) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @note Once transfer is aborted, the __HAL_SPI_CLEAR_OVRFLAG() macro must be called in user application + * before starting new SPI receive process. + * @retval HAL status +*/ +HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) +{ + uint32_t abortcplt; + + /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) + { + hspi->TxISR = SPI_AbortTx_ISR; + } + + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + hspi->RxISR = SPI_AbortRx_ISR; + } + + /* Clear ERRIE interrupts in case of DMA Mode */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); + + abortcplt = 1U; + + /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if(hspi->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; + } + else + { + hspi->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if(hspi->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if(HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; + } + else + { + hspi->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the SPI DMA Tx or the SPI Rx request if enabled */ + if((HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) && (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))) + { + /* Abort the SPI DMA Tx channel */ + if(hspi->hdmatx != NULL) + { + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if(HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) + { + hspi->hdmatx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + /* Abort the SPI DMA Rx channel */ + if(hspi->hdmarx != NULL) + { + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if(HAL_DMA_Abort_IT(hspi->hdmarx)!= HAL_OK) + { + hspi->hdmarx->XferAbortCallback = NULL; + abortcplt = 1U; + } + else + { + abortcplt = 0U; + } + } + } + + /* Disable the SPI DMA Tx or the SPI Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) + { + /* Abort the SPI DMA Tx channel */ + if(hspi->hdmatx != NULL) + { + /* Abort DMA Tx Handle linked to SPI Peripheral */ + if(HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) + { + hspi->hdmatx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + } + /* Disable the SPI DMA Tx or the SPI Rx request if enabled */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + { + /* Abort the SPI DMA Rx channel */ + if(hspi->hdmarx != NULL) + { + /* Abort DMA Rx Handle linked to SPI Peripheral */ + if(HAL_DMA_Abort_IT(hspi->hdmarx)!= HAL_OK) + { + hspi->hdmarx->XferAbortCallback = NULL; + } + else + { + abortcplt = 0U; + } + } + } + + if(abortcplt == 1U) + { + /* Reset Tx and Rx transfer counters */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ + HAL_SPI_AbortCpltCallback(hspi); + } + return HAL_OK; +} + /** * @brief Pause the DMA Transfer. * @param hspi: pointer to a SPI_HandleTypeDef structure that contains @@ -1870,6 +2128,21 @@ __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) */ } +/** + * @brief SPI Abort Complete callback. + * @param hspi SPI handle. + * @retval None + */ +__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_SPI_AbortCpltCallback can be implemented in the user file. + */ +} + /** * @} */ @@ -1986,7 +2259,7 @@ static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) /* Init tickstart for timeout management*/ tickstart = HAL_GetTick(); #endif /* USE_SPI_CRC */ - + if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) { #if (USE_SPI_CRC != 0U) @@ -2009,6 +2282,7 @@ static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */ CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); + /* Check the end of the transaction */ if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) { /* Disable SPI peripheral */ @@ -2166,12 +2440,114 @@ static void SPI_DMAError(DMA_HandleTypeDef *hdma) static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) { SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hspi->RxXferCount = 0; - hspi->TxXferCount = 0; + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; HAL_SPI_ErrorCallback(hspi); } +/** + * @brief DMA SPI Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + + hspi->hdmatx->XferAbortCallback = NULL; + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN ); + + /* Wait until TXE flag is set */ + do + { + if(count-- == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + break; + } + } + while((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Check if an Abort process is still ongoing */ + if(hspi->hdmarx != NULL) + { + if(hspi->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ + HAL_SPI_AbortCpltCallback(hspi); +} + +/** + * @brief DMA SPI Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma DMA handle. + * @retval None + */ +static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + hspi->hdmarx->XferAbortCallback = NULL; + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Check if an Abort process is still ongoing */ + if(hspi->hdmatx != NULL) + { + if(hspi->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + hspi->RxXferCount = 0U; + hspi->TxXferCount = 0U; + + /* Reset errorCode */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + + /* Clear the Error flags in the SR register */ + __HAL_SPI_CLEAR_OVRFLAG(hspi); + __HAL_SPI_CLEAR_FREFLAG(hspi); + + /* Restore hspi->State to Ready */ + hspi->State = HAL_SPI_STATE_READY; + + /* Call user Abort complete callback */ + HAL_SPI_AbortCpltCallback(hspi); +} + /** * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. * @param hspi: pointer to a SPI_HandleTypeDef structure that contains @@ -2596,7 +2972,7 @@ static HAL_StatusTypeDef SPI_CheckFlag_BSY(SPI_HandleTypeDef *hspi, uint32_t Tim static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) { uint32_t tickstart = 0U; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24 / 1000); + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); /* Init tickstart for timeout managment*/ tickstart = HAL_GetTick(); @@ -2606,7 +2982,7 @@ static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) /* Wait until TXE flag is set */ do { - if(count-- == 0) + if(count-- == 0U) { SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); break; @@ -2719,7 +3095,7 @@ static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) { uint32_t tickstart = 0U; - __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24 / 1000); + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); /* Init tickstart for timeout management*/ tickstart = HAL_GetTick(); @@ -2727,7 +3103,7 @@ static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) /* Wait until TXE flag is set */ do { - if(count-- == 0) + if(count-- == 0U) { SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); break; @@ -2765,6 +3141,58 @@ static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) * @} */ +/** + * @brief Handle abort a Tx or Rx transaction. + * @param hspi: pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg = 0U; + __IO uint32_t count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Wait until TXE flag is set */ + do + { + if(count-- == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + break; + } + } + while((hspi->Instance->SR & SPI_FLAG_TXE) == RESET); + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); + + /* Flush DR Register */ + tmpreg = (*(__IO uint32_t *)&hspi->Instance->DR); + + /* To avoid GCC warning */ + UNUSED(tmpreg); +} + +/** + * @brief Handle abort a Tx or Rx transaction. + * @param hspi: pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @retval None + */ +static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) +{ + /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE | SPI_CR2_RXNEIE | SPI_CR2_ERRIE)); + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); +} +/** + * @} + */ #endif /* HAL_SPI_MODULE_ENABLED */ /** diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c index 2601477..4e95521 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_sram.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SRAM HAL module driver. * This file provides a generic firmware to drive SRAM memories * mounted as external device. @@ -64,7 +64,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c index 6304c27..03d699b 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_tim.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief TIM HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Timer (TIM) peripheral: @@ -98,7 +98,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -404,7 +404,7 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat } else if((htim->State == HAL_TIM_STATE_READY)) { - if((pData == 0U) && (Length > 0U)) + if((pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -803,7 +803,7 @@ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel } else if((htim->State == HAL_TIM_STATE_READY)) { - if(((uint32_t)pData == 0U) && (Length > 0U)) + if(((uint32_t)pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -1163,7 +1163,7 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) * @brief Starts the PWM signal generation in interrupt mode. * @param htim: pointer to a TIM_HandleTypeDef structure that contains * the configuration information for TIM module. - * @param Channel: TIM Channel to be disabled. + * @param Channel: TIM Channel to be enabled. * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected @@ -1318,7 +1318,7 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe } else if((htim->State == HAL_TIM_STATE_READY)) { - if(((uint32_t)pData == 0U) && (Length > 0U)) + if(((uint32_t)pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -1806,7 +1806,7 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel } else if((htim->State == HAL_TIM_STATE_READY)) { - if((pData == 0U) && (Length > 0U)) + if((pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -2106,6 +2106,9 @@ __weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) */ HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) { + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + /* Enable the Capture compare and the Input Capture channels (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and @@ -2140,6 +2143,9 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t Outpu */ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) { + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + /* Disable the Capture compare and the Input Capture channels (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and @@ -2182,7 +2188,10 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t Ou No need to enable the counter, it's enabled automatically by hardware (the counter starts in response to a stimulus and generate a pulse */ - + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + /* Enable the TIM Capture/Compare 1 interrupt */ __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); @@ -2214,6 +2223,9 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t Ou */ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) { + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + /* Disable the TIM Capture/Compare 1 interrupt */ __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); @@ -2626,7 +2638,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch } else if((htim->State == HAL_TIM_STATE_READY)) { - if((((pData1 == 0U) || (pData2 == 0U) )) && (Length > 0U)) + if((((pData1 == 0U) || (pData2 == 0U) )) && (Length > 0)) { return HAL_ERROR; } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c index d9e4484..7294400 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_tim_ex.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief TIM HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Timer extension peripheral: @@ -69,7 +69,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -394,7 +394,7 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 } else if((htim->State == HAL_TIM_STATE_READY)) { - if(((uint32_t)pData == 0U) && (Length > 0U)) + if(((uint32_t)pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -701,7 +701,7 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan } else if((htim->State == HAL_TIM_STATE_READY)) { - if(((uint32_t)pData == 0U) && (Length > 0U)) + if(((uint32_t)pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -1119,7 +1119,7 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha } else if((htim->State == HAL_TIM_STATE_READY)) { - if(((uint32_t)pData == 0U) && (Length > 0U)) + if(((uint32_t)pData == 0U) && (Length > 0)) { return HAL_ERROR; } @@ -1655,39 +1655,42 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * contains the BDTR Register configuration information for the TIM peripheral. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, - TIM_BreakDeadTimeConfigTypeDef * sBreakDeadTimeConfig) +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef * sBreakDeadTimeConfig) { + uint32_t tmpbdtr = 0U; + /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput)); - assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); - /* Process Locked */ + /* Check input state */ __HAL_LOCK(htim); - htim->State = HAL_TIM_STATE_BUSY; - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - htim->Instance->BDTR = (uint32_t)sBreakDeadTimeConfig->OffStateRunMode | - sBreakDeadTimeConfig->OffStateIDLEMode | - sBreakDeadTimeConfig->LockLevel | - sBreakDeadTimeConfig->DeadTime | - sBreakDeadTimeConfig->BreakState | - sBreakDeadTimeConfig->BreakPolarity | - sBreakDeadTimeConfig->AutomaticOutput; - - - htim->State = HAL_TIM_STATE_READY; + the OSSI State, the dead time value and the Automatic Output Enable Bit */ - __HAL_UNLOCK(htim); + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + MODIFY_REG(tmpbdtr, TIM_BDTR_MOE, sBreakDeadTimeConfig->AutomaticOutput); + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = tmpbdtr; + __HAL_UNLOCK(htim); + return HAL_OK; } @@ -1730,7 +1733,7 @@ HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) { __HAL_RCC_LPTIM1_CLK_ENABLE(); - LPTIM1->OR = (Remap& 0xEFFFFFFF); + LPTIM1->OR = (Remap& 0xEFFFFFFFU); } else { diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_alarm_template.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_alarm_template.c index f666ea3..3226ef6 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_alarm_template.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_alarm_template.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_timebase_rtc_alarm_template.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HAL time base based on the hardware RTC_ALARM Template. * * This file override the native HAL time base functions (defined as weak) @@ -34,7 +34,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_wakeup_template.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_wakeup_template.c index ab366e0..a58f82e 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_wakeup_template.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_rtc_wakeup_template.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_timebase_rtc_wakeup_template.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HAL time base based on the hardware RTC_WAKEUP Template. * * This file overrides the native HAL time base functions (defined as weak) @@ -35,7 +35,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -200,7 +200,7 @@ HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority) __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hRTC_Handle, RTC_FLAG_WUTF); /* Configure the Wake-up Timer counter */ - hRTC_Handle.Instance->WUTR = (uint32_t)0U; + hRTC_Handle.Instance->WUTR = 0U; /* Clear the Wake-up Timer clock source bits in CR register */ hRTC_Handle.Instance->CR &= (uint32_t)~RTC_CR_WUCKSEL; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_tim_template.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_tim_template.c index 643024b..edaec8c 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_tim_template.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_timebase_tim_template.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_timebase_tim_template.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief HAL time base based on the hardware TIM Template. * * This file overrides the native HAL time base functions (defined as weak) @@ -14,7 +14,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -116,7 +116,7 @@ HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority) */ TimHandle.Init.Period = (1000000U / 1000U) - 1U; TimHandle.Init.Prescaler = uwPrescalerValue; - TimHandle.Init.ClockDivision = 0; + TimHandle.Init.ClockDivision = 0U; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_Base_Init(&TimHandle) == HAL_OK) { diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c index a0224e1..1519db1 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_uart.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief UART HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Universal Asynchronous Receiver Transmitter (UART) peripheral: @@ -126,7 +126,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -623,7 +623,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /* Check that a Tx process is not already ongoing */ if(huart->gState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -649,7 +649,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u return HAL_TIMEOUT; } tmp = (uint16_t*) pData; - huart->Instance->DR = (*tmp & (uint16_t)0x01FFU); + huart->Instance->DR = (*tmp & (uint16_t)0x01FF); if(huart->Init.Parity == UART_PARITY_NONE) { pData +=2U; @@ -665,7 +665,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u { return HAL_TIMEOUT; } - huart->Instance->DR = (*pData++ & (uint8_t)0xFFU); + huart->Instance->DR = (*pData++ & (uint8_t)0xFF); } } @@ -705,7 +705,7 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /* Check that a Rx process is not already ongoing */ if(huart->RxState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -735,12 +735,12 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui tmp = (uint16_t*) pData; if(huart->Init.Parity == UART_PARITY_NONE) { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FFU); + *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); pData +=2U; } else { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FFU); + *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF); pData +=1U; } @@ -753,11 +753,11 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui } if(huart->Init.Parity == UART_PARITY_NONE) { - *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FFU); + *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); } else { - *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007FU); + *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); } } @@ -790,7 +790,7 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData /* Check that a Tx process is not already ongoing */ if(huart->gState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -832,7 +832,7 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, /* Check that a Rx process is not already ongoing */ if(huart->RxState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -879,7 +879,7 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Check that a Tx process is not already ongoing */ if(huart->gState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -944,7 +944,7 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Check that a Rx process is not already ongoing */ if(huart->RxState == HAL_UART_STATE_READY) { - if((pData == NULL ) || (Size == 0U)) + if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } @@ -972,7 +972,13 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Enable the DMA Stream */ tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size); + HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size); + + /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ + __HAL_UART_CLEAR_OREFLAG(huart); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); /* Enable the UART Parity Error Interrupt */ SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); @@ -983,10 +989,7 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Enable the DMA transfer for the receiver request by setting the DMAR bit in the UART CR3 register */ SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - + return HAL_OK; } else @@ -2170,8 +2173,8 @@ static void UART_EndRxTransfer(UART_HandleTypeDef *huart) static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma) { UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - huart->RxXferCount = 0; - huart->TxXferCount = 0; + huart->RxXferCount = 0U; + huart->TxXferCount = 0U; HAL_UART_ErrorCallback(huart); } @@ -2310,7 +2313,7 @@ static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) if(huart->Init.WordLength == UART_WORDLENGTH_9B) { tmp = (uint16_t*) huart->pTxBuffPtr; - huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FFU); + huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); if(huart->Init.Parity == UART_PARITY_NONE) { huart->pTxBuffPtr += 2U; @@ -2322,7 +2325,7 @@ static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) } else { - huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FFU); + huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF); } if(--huart->TxXferCount == 0U) @@ -2378,12 +2381,12 @@ static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) tmp = (uint16_t*) huart->pRxBuffPtr; if(huart->Init.Parity == UART_PARITY_NONE) { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FFU); + *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); huart->pRxBuffPtr += 2U; } else { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FFU); + *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF); huart->pRxBuffPtr += 1U; } } @@ -2391,11 +2394,11 @@ static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) { if(huart->Init.Parity == UART_PARITY_NONE) { - *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FFU); + *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); } else { - *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007FU); + *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); } } @@ -2483,10 +2486,17 @@ static void UART_SetConfig(UART_HandleTypeDef *huart) if(huart->Init.OverSampling == UART_OVERSAMPLING_8) { /*-------------------------- USART BRR Configuration ---------------------*/ +#if defined(USART6) if((huart->Instance == USART1) || (huart->Instance == USART6)) { huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); } +#else + if(huart->Instance == USART1) + { + huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); + } +#endif /* USART6 */ else { huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); @@ -2495,10 +2505,17 @@ static void UART_SetConfig(UART_HandleTypeDef *huart) else { /*-------------------------- USART BRR Configuration ---------------------*/ +#if defined(USART6) if((huart->Instance == USART1) || (huart->Instance == USART6)) { huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); } +#else + if(huart->Instance == USART1) + { + huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); + } +#endif /* USART6 */ else { huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c index 33c5819..48a996f 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_usart.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief USART HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Universal Synchronous Asynchronous Receiver Transmitter (USART) peripheral: @@ -105,7 +105,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -410,7 +410,7 @@ HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxDa if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -437,7 +437,7 @@ HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxDa return HAL_TIMEOUT; } tmp = (uint16_t*) pTxData; - husart->Instance->DR = (*tmp & (uint16_t)0x01FFU); + husart->Instance->DR = (*tmp & (uint16_t)0x01FF); if(husart->Init.Parity == USART_PARITY_NONE) { pTxData += 2U; @@ -453,7 +453,7 @@ HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxDa { return HAL_TIMEOUT; } - husart->Instance->DR = (*pTxData++ & (uint8_t)0xFFU); + husart->Instance->DR = (*pTxData++ & (uint8_t)0xFF); } } @@ -491,7 +491,7 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxDat if(husart->State == HAL_USART_STATE_READY) { - if((pRxData == NULL) || (Size == 0U)) + if((pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -518,7 +518,7 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxDat return HAL_TIMEOUT; } /* Send dummy byte in order to generate clock */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FFU); + husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); /* Wait for RXNE Flag */ if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) @@ -528,13 +528,13 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxDat tmp = (uint16_t*) pRxData ; if(husart->Init.Parity == USART_PARITY_NONE) { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FFU); - pRxData +=2; + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); + pRxData +=2U; } else { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FFU); - pRxData +=1; + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); + pRxData +=1U; } } else @@ -546,7 +546,7 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxDat } /* Send Dummy Byte in order to generate clock */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FFU); + husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF); /* Wait until RXNE flag is set to receive the byte */ if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) @@ -556,12 +556,12 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxDat if(husart->Init.Parity == USART_PARITY_NONE) { /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FFU); + *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); } else { /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007FU); + *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); } } @@ -597,7 +597,7 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -628,7 +628,7 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t return HAL_TIMEOUT; } tmp = (uint16_t*) pTxData; - husart->Instance->DR = (*tmp & (uint16_t)0x01FFU); + husart->Instance->DR = (*tmp & (uint16_t)0x01FF); if(husart->Init.Parity == USART_PARITY_NONE) { pTxData += 2U; @@ -646,12 +646,12 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t tmp = (uint16_t*) pRxData ; if(husart->Init.Parity == USART_PARITY_NONE) { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); pRxData += 2U; } else { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); pRxData += 1U; } } @@ -662,7 +662,7 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t { return HAL_TIMEOUT; } - husart->Instance->DR = (*pTxData++ & (uint8_t)0x00FFU); + husart->Instance->DR = (*pTxData++ & (uint8_t)0x00FF); /* Wait for RXNE Flag */ if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) @@ -672,12 +672,12 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t if(husart->Init.Parity == USART_PARITY_NONE) { /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FFU); + *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); } else { /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007FU); + *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); } } } @@ -708,7 +708,7 @@ HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *pT { if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -757,7 +757,7 @@ HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRx { if(husart->State == HAL_USART_STATE_READY) { - if((pRxData == NULL) || (Size == 0U)) + if((pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -781,7 +781,7 @@ HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRx SET_BIT(husart->Instance->CR3, USART_CR3_EIE); /* Send dummy byte in order to generate the clock for the slave to send data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FFU); + husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); return HAL_OK; } @@ -804,7 +804,7 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, uint { if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -858,7 +858,7 @@ HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *p if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -922,7 +922,7 @@ HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pR if(husart->State == HAL_USART_STATE_READY) { - if((pRxData == NULL) || (Size == 0U)) + if((pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -970,8 +970,7 @@ HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pR this mode isn't a simplex receive mode but a full-duplex receive one */ HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->DR, Size); - /* Clear the Overrun flag just before enabling the DMA Rx request: mandatory for the second transfer - when using the USART in circular mode */ + /* Clear the Overrun flag just before enabling the DMA Rx request: mandatory for the second transfer */ __HAL_USART_CLEAR_OREFLAG(husart); /* Process Unlocked */ @@ -1015,7 +1014,7 @@ HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, uin if(husart->State == HAL_USART_STATE_READY) { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) { return HAL_ERROR; } @@ -1985,7 +1984,7 @@ static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart) if(husart->Init.WordLength == USART_WORDLENGTH_9B) { tmp = (uint16_t*) husart->pTxBuffPtr; - husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FFU); + husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); if(husart->Init.Parity == USART_PARITY_NONE) { husart->pTxBuffPtr += 2U; @@ -1997,7 +1996,7 @@ static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart) } else { - husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FFU); + husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF); } if(--husart->TxXferCount == 0U) @@ -2053,35 +2052,35 @@ static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart) tmp = (uint16_t*) husart->pRxBuffPtr; if(husart->Init.Parity == USART_PARITY_NONE) { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); husart->pRxBuffPtr += 2U; } else { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); husart->pRxBuffPtr += 1U; } if(--husart->RxXferCount != 0x00U) { /* Send dummy byte in order to generate the clock for the slave to send the next data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FFU); + husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); } } else { if(husart->Init.Parity == USART_PARITY_NONE) { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FFU); + *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); } else { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007FU); + *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); } if(--husart->RxXferCount != 0x00U) { /* Send dummy byte in order to generate the clock for the slave to send the next data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FFU); + husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF); } } @@ -2128,7 +2127,7 @@ static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart) if(husart->Init.WordLength == USART_WORDLENGTH_9B) { tmp = (uint16_t*) husart->pTxBuffPtr; - husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FFU); + husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); if(husart->Init.Parity == USART_PARITY_NONE) { husart->pTxBuffPtr += 2U; @@ -2140,7 +2139,7 @@ static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart) } else { - husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FFU); + husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF); } husart->TxXferCount--; @@ -2161,12 +2160,12 @@ static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart) tmp = (uint16_t*) husart->pRxBuffPtr; if(husart->Init.Parity == USART_PARITY_NONE) { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); husart->pRxBuffPtr += 2U; } else { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FFU); + *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); husart->pRxBuffPtr += 1U; } } @@ -2174,11 +2173,11 @@ static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart) { if(husart->Init.Parity == USART_PARITY_NONE) { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FFU); + *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); } else { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007FU); + *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); } } husart->RxXferCount--; @@ -2273,10 +2272,17 @@ static void USART_SetConfig(USART_HandleTypeDef *husart) CLEAR_BIT(husart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE)); /*-------------------------- USART BRR Configuration -----------------------*/ +#if defined(USART6) if((husart->Instance == USART1) || (husart->Instance == USART6)) { husart->Instance->BRR = USART_BRR(HAL_RCC_GetPCLK2Freq(), husart->Init.BaudRate); } +#else + if(husart->Instance == USART1) + { + husart->Instance->BRR = USART_BRR(HAL_RCC_GetPCLK2Freq(), husart->Init.BaudRate); + } +#endif /* USART6 */ else { husart->Instance->BRR = USART_BRR(HAL_RCC_GetPCLK1Freq(), husart->Init.BaudRate); diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c index ee07895..0c2dc15 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_wwdg.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief WWDG HAL module driver. * This file provides firmware functions to manage the following * functionalities of the Window Watchdog (WWDG) peripheral: @@ -90,7 +90,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c new file mode 100644 index 0000000..6483def --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c @@ -0,0 +1,934 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_adc.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief ADC LL module driver + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_adc.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT + #include "stm32_assert.h" +#else + #define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (ADC1) || defined (ADC2) || defined (ADC3) + +/** @addtogroup ADC_LL ADC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup ADC_LL_Private_Macros + * @{ + */ + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* common to several ADC instances. */ +#define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \ + ( ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) \ + || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) \ + || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV6) \ + || ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV8) \ + ) + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* ADC instance. */ +#define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \ + ( ((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) \ + || ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B) \ + ) + +#define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \ + ( ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) \ + || ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT) \ + ) + +#define IS_LL_ADC_SCAN_SELECTION(__SCAN_SELECTION__) \ + ( ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_DISABLE) \ + || ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_ENABLE) \ + ) + +#define IS_LL_ADC_SEQ_SCAN_MODE(__SEQ_SCAN_MODE__) \ + ( ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_DISABLE) \ + || ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_ENABLE) \ + ) + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* ADC group regular */ +#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \ + ( ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH4) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH1) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH1) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH2) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH3) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_CH1) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO) \ + || ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \ + ) +#define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \ + ( ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) \ + || ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS) \ + ) + +#define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \ + ( ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) \ + || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) \ + || ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED) \ + ) + +#define IS_LL_ADC_REG_FLAG_EOC_SELECTION(__REG_FLAG_EOC_SELECTION__) \ + ( ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV) \ + || ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_UNITARY_CONV) \ + ) + +#define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \ + ( ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) \ + || ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS) \ + ) + +#define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \ + ( ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS) \ + || ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS) \ + ) + +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* ADC group injected */ +#define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__) \ + ( ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH2) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH1) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH2) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH3) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_CH4) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_TRGO) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH2) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH3) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4) \ + || ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15) \ + ) + +#define IS_LL_ADC_INJ_TRIG_EXT_EDGE(__INJ_TRIG_EXT_EDGE__) \ + ( ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISING) \ + || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_FALLING) \ + || ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISINGFALLING) \ + ) + +#define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__) \ + ( ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT) \ + || ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR) \ + ) + +#define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__) \ + ( ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE) \ + || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS) \ + || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS) \ + || ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS) \ + ) + +#define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__) \ + ( ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE) \ + || ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK) \ + ) + +#if defined(ADC_MULTIMODE_SUPPORT) +/* Check of parameters for configuration of ADC hierarchical scope: */ +/* multimode. */ +#if defined(ADC3) +#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \ + ( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_INTERL) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_ALTERN) \ + ) +#else +#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \ + ( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \ + || ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \ + ) +#endif + +#define IS_LL_ADC_MULTI_DMA_TRANSFER(__MULTI_DMA_TRANSFER__) \ + ( ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_EACH_ADC) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_1) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_2) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_3) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_1) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_2) \ + || ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_3) \ + ) + +#define IS_LL_ADC_MULTI_TWOSMP_DELAY(__MULTI_TWOSMP_DELAY__) \ + ( ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES) \ + || ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES) \ + ) + +#define IS_LL_ADC_MULTI_MASTER_SLAVE(__MULTI_MASTER_SLAVE__) \ + ( ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER) \ + || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_SLAVE) \ + || ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER_SLAVE) \ + ) + +#endif /* ADC_MULTIMODE_SUPPORT */ +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup ADC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup ADC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize registers of all ADC instances belonging to + * the same ADC common instance to their default reset values. + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC common registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON) +{ + /* Check the parameters */ + assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); + + + /* Force reset of ADC clock (core clock) */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_ADC); + + /* Release reset of ADC clock (core clock) */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_ADC); + + return SUCCESS; +} + +/** + * @brief Initialize some features of ADC common parameters + * (all ADC instances belonging to the same ADC common instance) + * and multimode (for devices with several ADC instances available). + * @note The setting of ADC common parameters is conditioned to + * ADC instances state: + * All ADC instances belonging to the same ADC common instance + * must be disabled. + * @param ADCxy_COMMON ADC common instance + * (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() ) + * @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC common registers are initialized + * - ERROR: ADC common registers are not initialized + */ +ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON)); + assert_param(IS_LL_ADC_COMMON_CLOCK(ADC_CommonInitStruct->CommonClock)); + +#if defined(ADC_MULTIMODE_SUPPORT) + assert_param(IS_LL_ADC_MULTI_MODE(ADC_CommonInitStruct->Multimode)); + if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT) + { + assert_param(IS_LL_ADC_MULTI_DMA_TRANSFER(ADC_CommonInitStruct->MultiDMATransfer)); + assert_param(IS_LL_ADC_MULTI_TWOSMP_DELAY(ADC_CommonInitStruct->MultiTwoSamplingDelay)); + } +#endif /* ADC_MULTIMODE_SUPPORT */ + + /* Note: Hardware constraint (refer to description of functions */ + /* "LL_ADC_SetCommonXXX()" and "LL_ADC_SetMultiXXX()"): */ + /* On this STM32 serie, setting of these features is conditioned to */ + /* ADC state: */ + /* All ADC instances of the ADC common group must be disabled. */ + if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0U) + { + /* Configuration of ADC hierarchical scope: */ + /* - common to several ADC */ + /* (all ADC instances belonging to the same ADC common instance) */ + /* - Set ADC clock (conversion clock) */ + /* - multimode (if several ADC instances available on the */ + /* selected device) */ + /* - Set ADC multimode configuration */ + /* - Set ADC multimode DMA transfer */ + /* - Set ADC multimode: delay between 2 sampling phases */ +#if defined(ADC_MULTIMODE_SUPPORT) + if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT) + { + MODIFY_REG(ADCxy_COMMON->CCR, + ADC_CCR_ADCPRE + | ADC_CCR_MULTI + | ADC_CCR_DMA + | ADC_CCR_DDS + | ADC_CCR_DELAY + , + ADC_CommonInitStruct->CommonClock + | ADC_CommonInitStruct->Multimode + | ADC_CommonInitStruct->MultiDMATransfer + | ADC_CommonInitStruct->MultiTwoSamplingDelay + ); + } + else + { + MODIFY_REG(ADCxy_COMMON->CCR, + ADC_CCR_ADCPRE + | ADC_CCR_MULTI + | ADC_CCR_DMA + | ADC_CCR_DDS + | ADC_CCR_DELAY + , + ADC_CommonInitStruct->CommonClock + | LL_ADC_MULTI_INDEPENDENT + ); + } +#else + LL_ADC_SetCommonClock(ADCxy_COMMON, ADC_CommonInitStruct->CommonClock); +#endif + } + else + { + /* Initialization error: One or several ADC instances belonging to */ + /* the same ADC common instance are not disabled. */ + status = ERROR; + } + + return status; +} + +/** + * @brief Set each @ref LL_ADC_CommonInitTypeDef field to default value. + * @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) +{ + /* Set ADC_CommonInitStruct fields to default values */ + /* Set fields of ADC common */ + /* (all ADC instances belonging to the same ADC common instance) */ + ADC_CommonInitStruct->CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV2; + +#if defined(ADC_MULTIMODE_SUPPORT) + /* Set fields of ADC multimode */ + ADC_CommonInitStruct->Multimode = LL_ADC_MULTI_INDEPENDENT; + ADC_CommonInitStruct->MultiDMATransfer = LL_ADC_MULTI_REG_DMA_EACH_ADC; + ADC_CommonInitStruct->MultiTwoSamplingDelay = LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES; +#endif /* ADC_MULTIMODE_SUPPORT */ +} + +/** + * @brief De-initialize registers of the selected ADC instance + * to their default reset values. + * @note To reset all ADC instances quickly (perform a hard reset), + * use function @ref LL_ADC_CommonDeInit(). + * @param ADCx ADC instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are de-initialized + * - ERROR: ADC registers are not de-initialized + */ +ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + + /* Disable ADC instance if not already disabled. */ + if(LL_ADC_IsEnabled(ADCx) == 1U) + { + /* Set ADC group regular trigger source to SW start to ensure to not */ + /* have an external trigger event occurring during the conversion stop */ + /* ADC disable process. */ + LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE); + + /* Set ADC group injected trigger source to SW start to ensure to not */ + /* have an external trigger event occurring during the conversion stop */ + /* ADC disable process. */ + LL_ADC_INJ_SetTriggerSource(ADCx, LL_ADC_INJ_TRIG_SOFTWARE); + + /* Disable the ADC instance */ + LL_ADC_Disable(ADCx); + } + + /* Check whether ADC state is compliant with expected state */ + /* (hardware requirements of bits state to reset registers below) */ + if(READ_BIT(ADCx->CR2, ADC_CR2_ADON) == 0U) + { + /* ========== Reset ADC registers ========== */ + /* Reset register SR */ + CLEAR_BIT(ADCx->SR, + ( LL_ADC_FLAG_STRT + | LL_ADC_FLAG_JSTRT + | LL_ADC_FLAG_EOCS + | LL_ADC_FLAG_OVR + | LL_ADC_FLAG_JEOS + | LL_ADC_FLAG_AWD1 ) + ); + + /* Reset register CR1 */ + CLEAR_BIT(ADCx->CR1, + ( ADC_CR1_OVRIE | ADC_CR1_RES | ADC_CR1_AWDEN + | ADC_CR1_JAWDEN + | ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN + | ADC_CR1_JAUTO | ADC_CR1_AWDSGL | ADC_CR1_SCAN + | ADC_CR1_JEOCIE | ADC_CR1_AWDIE | ADC_CR1_EOCIE + | ADC_CR1_AWDCH ) + ); + + /* Reset register CR2 */ + CLEAR_BIT(ADCx->CR2, + ( ADC_CR2_SWSTART | ADC_CR2_EXTEN | ADC_CR2_EXTSEL + | ADC_CR2_JSWSTART | ADC_CR2_JEXTEN | ADC_CR2_JEXTSEL + | ADC_CR2_ALIGN | ADC_CR2_EOCS + | ADC_CR2_DDS | ADC_CR2_DMA + | ADC_CR2_CONT | ADC_CR2_ADON ) + ); + + /* Reset register SMPR1 */ + CLEAR_BIT(ADCx->SMPR1, + ( ADC_SMPR1_SMP18 | ADC_SMPR1_SMP17 | ADC_SMPR1_SMP16 + | ADC_SMPR1_SMP15 | ADC_SMPR1_SMP14 | ADC_SMPR1_SMP13 + | ADC_SMPR1_SMP12 | ADC_SMPR1_SMP11 | ADC_SMPR1_SMP10) + ); + + /* Reset register SMPR2 */ + CLEAR_BIT(ADCx->SMPR2, + ( ADC_SMPR2_SMP9 + | ADC_SMPR2_SMP8 | ADC_SMPR2_SMP7 | ADC_SMPR2_SMP6 + | ADC_SMPR2_SMP5 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP3 + | ADC_SMPR2_SMP2 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP0) + ); + + /* Reset register JOFR1 */ + CLEAR_BIT(ADCx->JOFR1, ADC_JOFR1_JOFFSET1); + /* Reset register JOFR2 */ + CLEAR_BIT(ADCx->JOFR2, ADC_JOFR2_JOFFSET2); + /* Reset register JOFR3 */ + CLEAR_BIT(ADCx->JOFR3, ADC_JOFR3_JOFFSET3); + /* Reset register JOFR4 */ + CLEAR_BIT(ADCx->JOFR4, ADC_JOFR4_JOFFSET4); + + /* Reset register HTR */ + SET_BIT(ADCx->HTR, ADC_HTR_HT); + /* Reset register LTR */ + CLEAR_BIT(ADCx->LTR, ADC_LTR_LT); + + /* Reset register SQR1 */ + CLEAR_BIT(ADCx->SQR1, + ( ADC_SQR1_L + | ADC_SQR1_SQ16 + | ADC_SQR1_SQ15 | ADC_SQR1_SQ14 | ADC_SQR1_SQ13) + ); + + /* Reset register SQR2 */ + CLEAR_BIT(ADCx->SQR2, + ( ADC_SQR2_SQ12 | ADC_SQR2_SQ11 | ADC_SQR2_SQ10 + | ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7) + ); + + + /* Reset register JSQR */ + CLEAR_BIT(ADCx->JSQR, + ( ADC_JSQR_JL + | ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3 + | ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1 ) + ); + + /* Reset register DR */ + /* bits in access mode read only, no direct reset applicable */ + + /* Reset registers JDR1, JDR2, JDR3, JDR4 */ + /* bits in access mode read only, no direct reset applicable */ + + /* Reset register CCR */ + CLEAR_BIT(ADC->CCR, ADC_CCR_TSVREFE | ADC_CCR_ADCPRE); + } + + return status; +} + +/** + * @brief Initialize some features of ADC instance. + * @note These parameters have an impact on ADC scope: ADC instance. + * Affects both group regular and group injected (availability + * of ADC group injected depends on STM32 families). + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Instance . + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + * @note After using this function, some other features must be configured + * using LL unitary functions. + * The minimum configuration remaining to be done is: + * - Set ADC group regular or group injected sequencer: + * map channel on the selected sequencer rank. + * Refer to function @ref LL_ADC_REG_SetSequencerRanks(). + * - Set ADC channel sampling time + * Refer to function LL_ADC_SetChannelSamplingTime(); + * @param ADCx ADC instance + * @param ADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are initialized + * - ERROR: ADC registers are not initialized + */ +ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + + assert_param(IS_LL_ADC_RESOLUTION(ADC_InitStruct->Resolution)); + assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment)); + assert_param(IS_LL_ADC_SCAN_SELECTION(ADC_InitStruct->SequencersScanMode)); + + /* Note: Hardware constraint (refer to description of this function): */ + /* ADC instance must be disabled. */ + if(LL_ADC_IsEnabled(ADCx) == 0U) + { + /* Configuration of ADC hierarchical scope: */ + /* - ADC instance */ + /* - Set ADC data resolution */ + /* - Set ADC conversion data alignment */ + MODIFY_REG(ADCx->CR1, + ADC_CR1_RES + | ADC_CR1_SCAN + , + ADC_InitStruct->Resolution + | ADC_InitStruct->SequencersScanMode + ); + + MODIFY_REG(ADCx->CR2, + ADC_CR2_ALIGN + , + ADC_InitStruct->DataAlignment + ); + + } + else + { + /* Initialization error: ADC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_ADC_InitTypeDef field to default value. + * @param ADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct) +{ + /* Set ADC_InitStruct fields to default values */ + /* Set fields of ADC instance */ + ADC_InitStruct->Resolution = LL_ADC_RESOLUTION_12B; + ADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; + + /* Enable scan mode to have a generic behavior with ADC of other */ + /* STM32 families, without this setting available: */ + /* ADC group regular sequencer and ADC group injected sequencer depend */ + /* only of their own configuration. */ + ADC_InitStruct->SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE; + +} + +/** + * @brief Initialize some features of ADC group regular. + * @note These parameters have an impact on ADC scope: ADC group regular. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Group_Regular + * (functions with prefix "REG"). + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + * @note After using this function, other features must be configured + * using LL unitary functions. + * The minimum configuration remaining to be done is: + * - Set ADC group regular or group injected sequencer: + * map channel on the selected sequencer rank. + * Refer to function @ref LL_ADC_REG_SetSequencerRanks(). + * - Set ADC channel sampling time + * Refer to function LL_ADC_SetChannelSamplingTime(); + * @param ADCx ADC instance + * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are initialized + * - ERROR: ADC registers are not initialized + */ +ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource)); + assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength)); + if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) + { + assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont)); + } + assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode)); + assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer)); + + /* Note: Hardware constraint (refer to description of this function): */ + /* ADC instance must be disabled. */ + if(LL_ADC_IsEnabled(ADCx) == 0U) + { + /* Configuration of ADC hierarchical scope: */ + /* - ADC group regular */ + /* - Set ADC group regular trigger source */ + /* - Set ADC group regular sequencer length */ + /* - Set ADC group regular sequencer discontinuous mode */ + /* - Set ADC group regular continuous mode */ + /* - Set ADC group regular conversion data transfer: no transfer or */ + /* transfer by DMA, and DMA requests mode */ + /* Note: On this STM32 serie, ADC trigger edge is set when starting */ + /* ADC conversion. */ + /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */ + if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) + { + MODIFY_REG(ADCx->CR1, + ADC_CR1_DISCEN + | ADC_CR1_DISCNUM + , + ADC_REG_InitStruct->SequencerLength + | ADC_REG_InitStruct->SequencerDiscont + ); + } + else + { + MODIFY_REG(ADCx->CR1, + ADC_CR1_DISCEN + | ADC_CR1_DISCNUM + , + ADC_REG_InitStruct->SequencerLength + | LL_ADC_REG_SEQ_DISCONT_DISABLE + ); + } + + MODIFY_REG(ADCx->CR2, + ADC_CR2_EXTSEL + | ADC_CR2_EXTEN + | ADC_CR2_CONT + | ADC_CR2_DMA + | ADC_CR2_DDS + , + (ADC_REG_InitStruct->TriggerSource & ADC_CR2_EXTSEL) + | ADC_REG_InitStruct->ContinuousMode + | ADC_REG_InitStruct->DMATransfer + ); + + /* Set ADC group regular sequencer length and scan direction */ + /* Note: Hardware constraint (refer to description of this function): */ + /* Note: If ADC instance feature scan mode is disabled */ + /* (refer to ADC instance initialization structure */ + /* parameter @ref SequencersScanMode */ + /* or function @ref LL_ADC_SetSequencersScanMode() ), */ + /* this parameter is discarded. */ + LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength); + } + else + { + /* Initialization error: ADC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_ADC_REG_InitTypeDef field to default value. + * @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct) +{ + /* Set ADC_REG_InitStruct fields to default values */ + /* Set fields of ADC group regular */ + /* Note: On this STM32 serie, ADC trigger edge is set when starting */ + /* ADC conversion. */ + /* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */ + ADC_REG_InitStruct->TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; + ADC_REG_InitStruct->SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; + ADC_REG_InitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; + ADC_REG_InitStruct->ContinuousMode = LL_ADC_REG_CONV_SINGLE; + ADC_REG_InitStruct->DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE; +} + +/** + * @brief Initialize some features of ADC group injected. + * @note These parameters have an impact on ADC scope: ADC group injected. + * Refer to corresponding unitary functions into + * @ref ADC_LL_EF_Configuration_ADC_Group_Regular + * (functions with prefix "INJ"). + * @note The setting of these parameters by function @ref LL_ADC_Init() + * is conditioned to ADC state: + * ADC instance must be disabled. + * This condition is applied to all ADC features, for efficiency + * and compatibility over all STM32 families. However, the different + * features can be set under different ADC state conditions + * (setting possible with ADC enabled without conversion on going, + * ADC enabled with conversion on going, ...) + * Each feature can be updated afterwards with a unitary function + * and potentially with ADC in a different state than disabled, + * refer to description of each function for setting + * conditioned to ADC state. + * @note After using this function, other features must be configured + * using LL unitary functions. + * The minimum configuration remaining to be done is: + * - Set ADC group injected sequencer: + * map channel on the selected sequencer rank. + * Refer to function @ref LL_ADC_INJ_SetSequencerRanks(). + * - Set ADC channel sampling time + * Refer to function LL_ADC_SetChannelSamplingTime(); + * @param ADCx ADC instance + * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ADC registers are initialized + * - ERROR: ADC registers are not initialized + */ +ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_ADC_ALL_INSTANCE(ADCx)); + assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADC_INJ_InitStruct->TriggerSource)); + assert_param(IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(ADC_INJ_InitStruct->SequencerLength)); + if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_INJ_SEQ_SCAN_DISABLE) + { + assert_param(IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(ADC_INJ_InitStruct->SequencerDiscont)); + } + assert_param(IS_LL_ADC_INJ_TRIG_AUTO(ADC_INJ_InitStruct->TrigAuto)); + + /* Note: Hardware constraint (refer to description of this function): */ + /* ADC instance must be disabled. */ + if(LL_ADC_IsEnabled(ADCx) == 0U) + { + /* Configuration of ADC hierarchical scope: */ + /* - ADC group injected */ + /* - Set ADC group injected trigger source */ + /* - Set ADC group injected sequencer length */ + /* - Set ADC group injected sequencer discontinuous mode */ + /* - Set ADC group injected conversion trigger: independent or */ + /* from ADC group regular */ + /* Note: On this STM32 serie, ADC trigger edge is set when starting */ + /* ADC conversion. */ + /* Refer to function @ref LL_ADC_INJ_StartConversionExtTrig(). */ + if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE) + { + MODIFY_REG(ADCx->CR1, + ADC_CR1_JDISCEN + | ADC_CR1_JAUTO + , + ADC_INJ_InitStruct->SequencerDiscont + | ADC_INJ_InitStruct->TrigAuto + ); + } + else + { + MODIFY_REG(ADCx->CR1, + ADC_CR1_JDISCEN + | ADC_CR1_JAUTO + , + LL_ADC_REG_SEQ_DISCONT_DISABLE + | ADC_INJ_InitStruct->TrigAuto + ); + } + + MODIFY_REG(ADCx->CR2, + ADC_CR2_JEXTSEL + | ADC_CR2_JEXTEN + , + (ADC_INJ_InitStruct->TriggerSource & ADC_CR2_JEXTSEL) + ); + + /* Note: Hardware constraint (refer to description of this function): */ + /* Note: If ADC instance feature scan mode is disabled */ + /* (refer to ADC instance initialization structure */ + /* parameter @ref SequencersScanMode */ + /* or function @ref LL_ADC_SetSequencersScanMode() ), */ + /* this parameter is discarded. */ + LL_ADC_INJ_SetSequencerLength(ADCx, ADC_INJ_InitStruct->SequencerLength); + } + else + { + /* Initialization error: ADC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_ADC_INJ_InitTypeDef field to default value. + * @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct) +{ + /* Set ADC_INJ_InitStruct fields to default values */ + /* Set fields of ADC group injected */ + ADC_INJ_InitStruct->TriggerSource = LL_ADC_INJ_TRIG_SOFTWARE; + ADC_INJ_InitStruct->SequencerLength = LL_ADC_INJ_SEQ_SCAN_DISABLE; + ADC_INJ_InitStruct->SequencerDiscont = LL_ADC_INJ_SEQ_DISCONT_DISABLE; + ADC_INJ_InitStruct->TrigAuto = LL_ADC_INJ_TRIG_INDEPENDENT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* ADC1 || ADC2 || ADC3 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_crc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_crc.c new file mode 100644 index 0000000..84ad9b8 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_crc.c @@ -0,0 +1,125 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_crc.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief CRC LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_crc.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (CRC) + +/** @addtogroup CRC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CRC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup CRC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize CRC registers (Registers restored to their default values). + * @param CRCx CRC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: CRC registers are de-initialized + * - ERROR: CRC registers are not de-initialized + */ +ErrorStatus LL_CRC_DeInit(CRC_TypeDef *CRCx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_CRC_ALL_INSTANCE(CRCx)); + + if (CRCx == CRC) + { + /* Force CRC reset */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_CRC); + + /* Release CRC reset */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_CRC); + } + else + { + status = ERROR; + } + + return (status); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (CRC) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dac.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dac.c new file mode 100644 index 0000000..352f9af --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dac.c @@ -0,0 +1,283 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dac.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief DAC LL module driver + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_dac.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT + #include "stm32_assert.h" +#else + #define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(DAC) + +/** @addtogroup DAC_LL DAC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup DAC_LL_Private_Macros + * @{ + */ + +#if defined(DAC_CHANNEL2_SUPPORT) +#define IS_LL_DAC_CHANNEL(__DACX__, __DAC_CHANNEL__) \ + ( \ + ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1) \ + || ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_2) \ + ) +#else +#define IS_LL_DAC_CHANNEL(__DACX__, __DAC_CHANNEL__) \ + ( \ + ((__DAC_CHANNEL__) == LL_DAC_CHANNEL_1) \ + ) +#endif /* DAC_CHANNEL2_SUPPORT */ + +#define IS_LL_DAC_TRIGGER_SOURCE(__TRIGGER_SOURCE__) \ + ( ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_SOFTWARE) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM2_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM4_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM5_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM6_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM7_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_TIM8_TRGO) \ + || ((__TRIGGER_SOURCE__) == LL_DAC_TRIG_EXT_EXTI_LINE9) \ + ) + +#define IS_LL_DAC_WAVE_AUTO_GENER_MODE(__WAVE_AUTO_GENERATION_MODE__) \ + ( ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NONE) \ + || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_NOISE) \ + || ((__WAVE_AUTO_GENERATION_MODE__) == LL_DAC_WAVE_AUTO_GENERATION_TRIANGLE) \ + ) + +#define IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(__WAVE_AUTO_GENERATION_CONFIG__) \ + ( ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BIT0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS1_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS2_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS3_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS4_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS5_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS6_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS7_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS8_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS9_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS10_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_NOISE_LFSR_UNMASK_BITS11_0) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_3) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_7) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_15) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_31) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_63) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_127) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_255) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_511) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_1023) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_2047) \ + || ((__WAVE_AUTO_GENERATION_CONFIG__) == LL_DAC_TRIANGLE_AMPLITUDE_4095) \ + ) + +#define IS_LL_DAC_OUTPUT_BUFFER(__OUTPUT_BUFFER__) \ + ( ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_ENABLE) \ + || ((__OUTPUT_BUFFER__) == LL_DAC_OUTPUT_BUFFER_DISABLE) \ + ) + +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DAC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup DAC_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize registers of the selected DAC instance + * to their default reset values. + * @param DACx DAC instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DAC registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_DAC_DeInit(DAC_TypeDef *DACx) +{ + /* Check the parameters */ + assert_param(IS_DAC_ALL_INSTANCE(DACx)); + + /* Force reset of DAC1 clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_DAC1); + + /* Release reset of DAC1 clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_DAC1); + return SUCCESS; +} + +/** + * @brief Initialize some features of DAC instance. + * @note The setting of these parameters by function @ref LL_DAC_Init() + * is conditioned to DAC state: + * DAC instance must be disabled. + * @param DACx DAC instance + * @param DAC_Channel This parameter can be one of the following values: + * @arg @ref LL_DAC_CHANNEL_1 + * @arg @ref LL_DAC_CHANNEL_2 (1) + * + * (1) On this STM32 serie, parameter not available on all devices. + * Refer to device datasheet for channels availability. + * @param DAC_InitStruct Pointer to a @ref LL_DAC_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DAC registers are initialized + * - ERROR: DAC registers are not initialized + */ +ErrorStatus LL_DAC_Init(DAC_TypeDef *DACx, uint32_t DAC_Channel, LL_DAC_InitTypeDef *DAC_InitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_DAC_ALL_INSTANCE(DACx)); + assert_param(IS_LL_DAC_CHANNEL(DACx, DAC_Channel)); + assert_param(IS_LL_DAC_TRIGGER_SOURCE(DAC_InitStruct->TriggerSource)); + assert_param(IS_LL_DAC_OUTPUT_BUFFER(DAC_InitStruct->OutputBuffer)); + assert_param(IS_LL_DAC_WAVE_AUTO_GENER_MODE(DAC_InitStruct->WaveAutoGeneration)); + if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE) + { + assert_param(IS_LL_DAC_WAVE_AUTO_GENER_CONFIG(DAC_InitStruct->WaveAutoGenerationConfig)); + } + + /* Note: Hardware constraint (refer to description of this function) */ + /* DAC instance must be disabled. */ + if(LL_DAC_IsEnabled(DACx, DAC_Channel) == 0U) + { + /* Configuration of DAC channel: */ + /* - TriggerSource */ + /* - WaveAutoGeneration */ + /* - OutputBuffer */ + if (DAC_InitStruct->WaveAutoGeneration != LL_DAC_WAVE_AUTO_GENERATION_NONE) + { + MODIFY_REG(DACx->CR, + ( DAC_CR_TSEL1 + | DAC_CR_WAVE1 + | DAC_CR_MAMP1 + | DAC_CR_BOFF1 + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + , + ( DAC_InitStruct->TriggerSource + | DAC_InitStruct->WaveAutoGeneration + | DAC_InitStruct->WaveAutoGenerationConfig + | DAC_InitStruct->OutputBuffer + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); + } + else + { + MODIFY_REG(DACx->CR, + ( DAC_CR_TSEL1 + | DAC_CR_WAVE1 + | DAC_CR_BOFF1 + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + , + ( DAC_InitStruct->TriggerSource + | LL_DAC_WAVE_AUTO_GENERATION_NONE + | DAC_InitStruct->OutputBuffer + ) << (DAC_Channel & DAC_CR_CHX_BITOFFSET_MASK) + ); + } + } + else + { + /* Initialization error: DAC instance is not disabled. */ + status = ERROR; + } + return status; +} + +/** + * @brief Set each @ref LL_DAC_InitTypeDef field to default value. + * @param DAC_InitStruct pointer to a @ref LL_DAC_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_DAC_StructInit(LL_DAC_InitTypeDef *DAC_InitStruct) +{ + /* Set DAC_InitStruct fields to default values */ + DAC_InitStruct->TriggerSource = LL_DAC_TRIG_SOFTWARE; + DAC_InitStruct->WaveAutoGeneration = LL_DAC_WAVE_AUTO_GENERATION_NONE; + /* Note: Parameter discarded if wave auto generation is disabled, */ + /* set anyway to its default value. */ + DAC_InitStruct->WaveAutoGenerationConfig = LL_DAC_NOISE_LFSR_UNMASK_BIT0; + DAC_InitStruct->OutputBuffer = LL_DAC_OUTPUT_BUFFER_ENABLE; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DAC */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma.c new file mode 100644 index 0000000..2f4ab11 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma.c @@ -0,0 +1,443 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dma.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief DMA LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_dma.h" +#include "stm32f4xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (DMA1) || defined (DMA2) + +/** @defgroup DMA_LL DMA + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DMA_LL_Private_Macros + * @{ + */ +#define IS_LL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \ + ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) || \ + ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY)) + +#define IS_LL_DMA_MODE(__VALUE__) (((__VALUE__) == LL_DMA_MODE_NORMAL) || \ + ((__VALUE__) == LL_DMA_MODE_CIRCULAR) || \ + ((__VALUE__) == LL_DMA_MODE_PFCTRL)) + +#define IS_LL_DMA_PERIPHINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_PERIPH_INCREMENT) || \ + ((__VALUE__) == LL_DMA_PERIPH_NOINCREMENT)) + +#define IS_LL_DMA_MEMORYINCMODE(__VALUE__) (((__VALUE__) == LL_DMA_MEMORY_INCREMENT) || \ + ((__VALUE__) == LL_DMA_MEMORY_NOINCREMENT)) + +#define IS_LL_DMA_PERIPHDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_PDATAALIGN_BYTE) || \ + ((__VALUE__) == LL_DMA_PDATAALIGN_HALFWORD) || \ + ((__VALUE__) == LL_DMA_PDATAALIGN_WORD)) + +#define IS_LL_DMA_MEMORYDATASIZE(__VALUE__) (((__VALUE__) == LL_DMA_MDATAALIGN_BYTE) || \ + ((__VALUE__) == LL_DMA_MDATAALIGN_HALFWORD) || \ + ((__VALUE__) == LL_DMA_MDATAALIGN_WORD)) + +#define IS_LL_DMA_NBDATA(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) + +#define IS_LL_DMA_CHANNEL(__VALUE__) (((__VALUE__) == LL_DMA_CHANNEL_0) || \ + ((__VALUE__) == LL_DMA_CHANNEL_1) || \ + ((__VALUE__) == LL_DMA_CHANNEL_2) || \ + ((__VALUE__) == LL_DMA_CHANNEL_3) || \ + ((__VALUE__) == LL_DMA_CHANNEL_4) || \ + ((__VALUE__) == LL_DMA_CHANNEL_5) || \ + ((__VALUE__) == LL_DMA_CHANNEL_6) || \ + ((__VALUE__) == LL_DMA_CHANNEL_7)) + +#define IS_LL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == LL_DMA_PRIORITY_LOW) || \ + ((__VALUE__) == LL_DMA_PRIORITY_MEDIUM) || \ + ((__VALUE__) == LL_DMA_PRIORITY_HIGH) || \ + ((__VALUE__) == LL_DMA_PRIORITY_VERYHIGH)) + +#define IS_LL_DMA_ALL_STREAM_INSTANCE(INSTANCE, STREAM) ((((INSTANCE) == DMA1) && \ + (((STREAM) == LL_DMA_STREAM_0) || \ + ((STREAM) == LL_DMA_STREAM_1) || \ + ((STREAM) == LL_DMA_STREAM_2) || \ + ((STREAM) == LL_DMA_STREAM_3) || \ + ((STREAM) == LL_DMA_STREAM_4) || \ + ((STREAM) == LL_DMA_STREAM_5) || \ + ((STREAM) == LL_DMA_STREAM_6) || \ + ((STREAM) == LL_DMA_STREAM_7) || \ + ((STREAM) == LL_DMA_STREAM_ALL))) ||\ + (((INSTANCE) == DMA2) && \ + (((STREAM) == LL_DMA_STREAM_0) || \ + ((STREAM) == LL_DMA_STREAM_1) || \ + ((STREAM) == LL_DMA_STREAM_2) || \ + ((STREAM) == LL_DMA_STREAM_3) || \ + ((STREAM) == LL_DMA_STREAM_4) || \ + ((STREAM) == LL_DMA_STREAM_5) || \ + ((STREAM) == LL_DMA_STREAM_6) || \ + ((STREAM) == LL_DMA_STREAM_7) || \ + ((STREAM) == LL_DMA_STREAM_ALL)))) + +#define IS_LL_DMA_FIFO_MODE_STATE(STATE) (((STATE) == LL_DMA_FIFOMODE_DISABLE ) || \ + ((STATE) == LL_DMA_FIFOMODE_ENABLE)) + +#define IS_LL_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == LL_DMA_FIFOTHRESHOLD_1_4) || \ + ((THRESHOLD) == LL_DMA_FIFOTHRESHOLD_1_2) || \ + ((THRESHOLD) == LL_DMA_FIFOTHRESHOLD_3_4) || \ + ((THRESHOLD) == LL_DMA_FIFOTHRESHOLD_FULL)) + +#define IS_LL_DMA_MEMORY_BURST(BURST) (((BURST) == LL_DMA_MBURST_SINGLE) || \ + ((BURST) == LL_DMA_MBURST_INC4) || \ + ((BURST) == LL_DMA_MBURST_INC8) || \ + ((BURST) == LL_DMA_MBURST_INC16)) + +#define IS_LL_DMA_PERIPHERAL_BURST(BURST) (((BURST) == LL_DMA_PBURST_SINGLE) || \ + ((BURST) == LL_DMA_PBURST_INC4) || \ + ((BURST) == LL_DMA_PBURST_INC8) || \ + ((BURST) == LL_DMA_PBURST_INC16)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA_LL_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the DMA registers to their default reset values. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @arg @ref LL_DMA_STREAM_ALL + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA registers are de-initialized + * - ERROR: DMA registers are not de-initialized + */ +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream) +{ + DMA_Stream_TypeDef *tmp = (DMA_Stream_TypeDef *)DMA1_Stream0; + ErrorStatus status = SUCCESS; + + /* Check the DMA Instance DMAx and Stream parameters*/ + assert_param(IS_LL_DMA_ALL_STREAM_INSTANCE(DMAx, Stream)); + + if (Stream == LL_DMA_STREAM_ALL) + { + if (DMAx == DMA1) + { + /* Force reset of DMA clock */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA1); + + /* Release reset of DMA clock */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA1); + } + else if (DMAx == DMA2) + { + /* Force reset of DMA clock */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA2); + + /* Release reset of DMA clock */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA2); + } + else + { + status = ERROR; + } + } + else + { + /* Disable the selected Stream */ + LL_DMA_DisableStream(DMAx,Stream); + + /* Get the DMA Stream Instance */ + tmp = (DMA_Stream_TypeDef *)(__LL_DMA_GET_STREAM_INSTANCE(DMAx, Stream)); + + /* Reset DMAx_Streamy configuration register */ + LL_DMA_WriteReg(tmp, CR, 0U); + + /* Reset DMAx_Streamy remaining bytes register */ + LL_DMA_WriteReg(tmp, NDTR, 0U); + + /* Reset DMAx_Streamy peripheral address register */ + LL_DMA_WriteReg(tmp, PAR, 0U); + + /* Reset DMAx_Streamy memory address register */ + LL_DMA_WriteReg(tmp, M0AR, 0U); + + /* Reset DMAx_Streamy memory address register */ + LL_DMA_WriteReg(tmp, M1AR, 0U); + + /* Reset DMAx_Streamy FIFO control register */ + LL_DMA_WriteReg(tmp, FCR, 0x00000021U); + + /* Reset Channel register field for DMAx Stream*/ + LL_DMA_SetChannelSelection(DMAx, Stream, LL_DMA_CHANNEL_0); + + if(Stream == LL_DMA_STREAM_0) + { + /* Reset the Stream0 pending flags */ + DMAx->LIFCR = 0x0000003FU; + } + else if(Stream == LL_DMA_STREAM_1) + { + /* Reset the Stream1 pending flags */ + DMAx->LIFCR = 0x00000F40U; + } + else if(Stream == LL_DMA_STREAM_2) + { + /* Reset the Stream2 pending flags */ + DMAx->LIFCR = 0x003F0000U; + } + else if(Stream == LL_DMA_STREAM_3) + { + /* Reset the Stream3 pending flags */ + DMAx->LIFCR = 0x0F400000U; + } + else if(Stream == LL_DMA_STREAM_4) + { + /* Reset the Stream4 pending flags */ + DMAx->HIFCR = 0x0000003FU; + } + else if(Stream == LL_DMA_STREAM_5) + { + /* Reset the Stream5 pending flags */ + DMAx->HIFCR = 0x00000F40U; + } + else if(Stream == LL_DMA_STREAM_6) + { + /* Reset the Stream6 pending flags */ + DMAx->HIFCR = 0x003F0000U; + } + else if(Stream == LL_DMA_STREAM_7) + { + /* Reset the Stream7 pending flags */ + DMAx->HIFCR = 0x0F400000U; + } + else + { + status = ERROR; + } + } + + return status; +} + +/** + * @brief Initialize the DMA registers according to the specified parameters in DMA_InitStruct. + * @note To convert DMAx_Streamy Instance to DMAx Instance and Streamy, use helper macros : + * @arg @ref __LL_DMA_GET_INSTANCE + * @arg @ref __LL_DMA_GET_STREAM + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA registers are initialized + * - ERROR: Not applicable + */ +uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct) +{ + /* Check the DMA Instance DMAx and Stream parameters*/ + assert_param(IS_LL_DMA_ALL_STREAM_INSTANCE(DMAx, Stream)); + + /* Check the DMA parameters from DMA_InitStruct */ + assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction)); + assert_param(IS_LL_DMA_MODE(DMA_InitStruct->Mode)); + assert_param(IS_LL_DMA_PERIPHINCMODE(DMA_InitStruct->PeriphOrM2MSrcIncMode)); + assert_param(IS_LL_DMA_MEMORYINCMODE(DMA_InitStruct->MemoryOrM2MDstIncMode)); + assert_param(IS_LL_DMA_PERIPHDATASIZE(DMA_InitStruct->PeriphOrM2MSrcDataSize)); + assert_param(IS_LL_DMA_MEMORYDATASIZE(DMA_InitStruct->MemoryOrM2MDstDataSize)); + assert_param(IS_LL_DMA_NBDATA(DMA_InitStruct->NbData)); + assert_param(IS_LL_DMA_CHANNEL(DMA_InitStruct->Channel)); + assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority)); + assert_param(IS_LL_DMA_FIFO_MODE_STATE(DMA_InitStruct->FIFOMode)); + /* Check the memory burst, peripheral burst and FIFO threshold parameters only + when FIFO mode is enabled */ + if(DMA_InitStruct->FIFOMode != LL_DMA_FIFOMODE_DISABLE) + { + assert_param(IS_LL_DMA_FIFO_THRESHOLD(DMA_InitStruct->FIFOThreshold)); + assert_param(IS_LL_DMA_MEMORY_BURST(DMA_InitStruct->MemBurst)); + assert_param(IS_LL_DMA_PERIPHERAL_BURST(DMA_InitStruct->PeriphBurst)); + } + + /*---------------------------- DMAx SxCR Configuration ------------------------ + * Configure DMAx_Streamy: data transfer direction, data transfer mode, + * peripheral and memory increment mode, + * data size alignment and priority level with parameters : + * - Direction: DMA_SxCR_DIR[1:0] bits + * - Mode: DMA_SxCR_CIRC bit + * - PeriphOrM2MSrcIncMode: DMA_SxCR_PINC bit + * - MemoryOrM2MDstIncMode: DMA_SxCR_MINC bit + * - PeriphOrM2MSrcDataSize: DMA_SxCR_PSIZE[1:0] bits + * - MemoryOrM2MDstDataSize: DMA_SxCR_MSIZE[1:0] bits + * - Priority: DMA_SxCR_PL[1:0] bits + */ + LL_DMA_ConfigTransfer(DMAx, Stream, DMA_InitStruct->Direction | \ + DMA_InitStruct->Mode | \ + DMA_InitStruct->PeriphOrM2MSrcIncMode | \ + DMA_InitStruct->MemoryOrM2MDstIncMode | \ + DMA_InitStruct->PeriphOrM2MSrcDataSize | \ + DMA_InitStruct->MemoryOrM2MDstDataSize | \ + DMA_InitStruct->Priority + ); + + if(DMA_InitStruct->FIFOMode != LL_DMA_FIFOMODE_DISABLE) + { + /*---------------------------- DMAx SxFCR Configuration ------------------------ + * Configure DMAx_Streamy: fifo mode and fifo threshold with parameters : + * - FIFOMode: DMA_SxFCR_DMDIS bit + * - FIFOThreshold: DMA_SxFCR_FTH[1:0] bits + */ + LL_DMA_ConfigFifo(DMAx, Stream, DMA_InitStruct->FIFOMode, DMA_InitStruct->FIFOThreshold); + + /*---------------------------- DMAx SxCR Configuration -------------------------- + * Configure DMAx_Streamy: memory burst transfer with parameters : + * - MemBurst: DMA_SxCR_MBURST[1:0] bits + */ + LL_DMA_SetMemoryBurstxfer(DMAx,Stream,DMA_InitStruct->MemBurst); + + /*---------------------------- DMAx SxCR Configuration -------------------------- + * Configure DMAx_Streamy: peripheral burst transfer with parameters : + * - PeriphBurst: DMA_SxCR_PBURST[1:0] bits + */ + LL_DMA_SetPeriphBurstxfer(DMAx,Stream,DMA_InitStruct->PeriphBurst); + } + + /*-------------------------- DMAx SxM0AR Configuration -------------------------- + * Configure the memory or destination base address with parameter : + * - MemoryOrM2MDstAddress: DMA_SxM0AR_M0A[31:0] bits + */ + LL_DMA_SetMemoryAddress(DMAx, Stream, DMA_InitStruct->MemoryOrM2MDstAddress); + + /*-------------------------- DMAx SxPAR Configuration --------------------------- + * Configure the peripheral or source base address with parameter : + * - PeriphOrM2MSrcAddress: DMA_SxPAR_PA[31:0] bits + */ + LL_DMA_SetPeriphAddress(DMAx, Stream, DMA_InitStruct->PeriphOrM2MSrcAddress); + + /*--------------------------- DMAx SxNDTR Configuration ------------------------- + * Configure the peripheral base address with parameter : + * - NbData: DMA_SxNDT[15:0] bits + */ + LL_DMA_SetDataLength(DMAx, Stream, DMA_InitStruct->NbData); + + /*--------------------------- DMA SxCR_CHSEL Configuration ---------------------- + * Configure the peripheral base address with parameter : + * - PeriphRequest: DMA_SxCR_CHSEL[2:0] bits + */ + LL_DMA_SetChannelSelection(DMAx, Stream, DMA_InitStruct->Channel); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_DMA_InitTypeDef field to default value. + * @param DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure. + * @retval None + */ +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct) +{ + /* Set DMA_InitStruct fields to default values */ + DMA_InitStruct->PeriphOrM2MSrcAddress = 0x00000000U; + DMA_InitStruct->MemoryOrM2MDstAddress = 0x00000000U; + DMA_InitStruct->Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; + DMA_InitStruct->Mode = LL_DMA_MODE_NORMAL; + DMA_InitStruct->PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + DMA_InitStruct->MemoryOrM2MDstIncMode = LL_DMA_MEMORY_NOINCREMENT; + DMA_InitStruct->PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_BYTE; + DMA_InitStruct->MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_BYTE; + DMA_InitStruct->NbData = 0x00000000U; + DMA_InitStruct->Channel = LL_DMA_CHANNEL_0; + DMA_InitStruct->Priority = LL_DMA_PRIORITY_LOW; + DMA_InitStruct->FIFOMode = LL_DMA_FIFOMODE_DISABLE; + DMA_InitStruct->FIFOThreshold = LL_DMA_FIFOTHRESHOLD_1_4; + DMA_InitStruct->MemBurst = LL_DMA_MBURST_SINGLE; + DMA_InitStruct->PeriphBurst = LL_DMA_PBURST_SINGLE; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c new file mode 100644 index 0000000..cd4fc76 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c @@ -0,0 +1,599 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dma2d.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief DMA2D LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_dma2d.h" +#include "stm32f4xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (DMA2D) + +/** @addtogroup DMA2D_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup DMA2D_LL_Private_Constants DMA2D Private Constants + * @{ + */ +#define LL_DMA2D_COLOR 0xFFU /*!< Maximum output color setting */ +#define LL_DMA2D_NUMBEROFLINES DMA2D_NLR_NL /*!< Maximum number of lines */ +#define LL_DMA2D_NUMBEROFPIXELS (DMA2D_NLR_PL >> DMA2D_NLR_PL_Pos) /*!< Maximum number of pixels per lines */ +#define LL_DMA2D_OFFSET_MAX 0x3FFFU /*!< Maximum output line offset expressed in pixels */ +#define LL_DMA2D_CLUTSIZE_MAX 0xFFU /*!< Maximum CLUT size */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DMA2D_LL_Private_Macros + * @{ + */ +#define IS_LL_DMA2D_MODE(MODE) (((MODE) == LL_DMA2D_MODE_M2M) || \ + ((MODE) == LL_DMA2D_MODE_M2M_PFC) || \ + ((MODE) == LL_DMA2D_MODE_M2M_BLEND) || \ + ((MODE) == LL_DMA2D_MODE_R2M)) + +#define IS_LL_DMA2D_OCMODE(MODE_ARGB) (((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB8888) || \ + ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_RGB888) || \ + ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_RGB565) || \ + ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB1555) || \ + ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB4444)) + +#define IS_LL_DMA2D_GREEN(GREEN) ((GREEN) <= LL_DMA2D_COLOR) +#define IS_LL_DMA2D_RED(RED) ((RED) <= LL_DMA2D_COLOR) +#define IS_LL_DMA2D_BLUE(BLUE) ((BLUE) <= LL_DMA2D_COLOR) +#define IS_LL_DMA2D_ALPHA(ALPHA) ((ALPHA) <= LL_DMA2D_COLOR) + +#define IS_LL_DMA2D_OFFSET(OFFSET) ((OFFSET) <= LL_DMA2D_OFFSET_MAX) + +#define IS_LL_DMA2D_LINE(LINES) ((LINES) <= LL_DMA2D_NUMBEROFLINES) +#define IS_LL_DMA2D_PIXEL(PIXELS) ((PIXELS) <= LL_DMA2D_NUMBEROFPIXELS) + +#define IS_LL_DMA2D_LCMODE(MODE_ARGB) (((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB8888) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_RGB888) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_RGB565) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB1555) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB4444) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_L8) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_AL44) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_AL88) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_L4) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_A8) || \ + ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_A4)) + +#define IS_LL_DMA2D_CLUTCMODE(CLUTCMODE) (((CLUTCMODE) == LL_DMA2D_CLUT_COLOR_MODE_ARGB8888) || \ + ((CLUTCMODE) == LL_DMA2D_CLUT_COLOR_MODE_RGB888)) + +#define IS_LL_DMA2D_CLUTSIZE(SIZE) ((SIZE) <= LL_DMA2D_CLUTSIZE_MAX) + +#define IS_LL_DMA2D_ALPHAMODE(MODE) (((MODE) == LL_DMA2D_ALPHA_MODE_NO_MODIF) || \ + ((MODE) == LL_DMA2D_ALPHA_MODE_REPLACE) || \ + ((MODE) == LL_DMA2D_ALPHA_MODE_COMBINE)) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA2D_LL_Exported_Functions + * @{ + */ + +/** @addtogroup DMA2D_LL_EF_Init_Functions Initialization and De-initialization Functions + * @{ + */ + +/** + * @brief De-initialize DMA2D registers (registers restored to their default values). + * @param DMA2Dx DMA2D Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA2D registers are de-initialized + * - ERROR: DMA2D registers are not de-initialized + */ +ErrorStatus LL_DMA2D_DeInit(DMA2D_TypeDef *DMA2Dx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + + if (DMA2Dx == DMA2D) + { + /* Force reset of DMA2D clock */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA2D); + + /* Release reset of DMA2D clock */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA2D); + } + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize DMA2D registers according to the specified parameters in DMA2D_InitStruct. + * @note DMA2D transfers must be disabled to set initialization bits in configuration registers, + * otherwise ERROR result is returned. + * @param DMA2Dx DMA2D Instance + * @param DMA2D_InitStruct: pointer to a LL_DMA2D_InitTypeDef structure + * that contains the configuration information for the specified DMA2D peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: DMA2D registers are initialized according to DMA2D_InitStruct content + * - ERROR: Issue occurred during DMA2D registers initialization + */ +ErrorStatus LL_DMA2D_Init(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_InitTypeDef *DMA2D_InitStruct) +{ + ErrorStatus status = ERROR; + LL_DMA2D_ColorTypeDef DMA2D_ColorStruct; + uint32_t tmp = 0U, tmp1 = 0U, tmp2 = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_MODE(DMA2D_InitStruct->Mode)); + assert_param(IS_LL_DMA2D_OCMODE(DMA2D_InitStruct->ColorMode)); + assert_param(IS_LL_DMA2D_LINE(DMA2D_InitStruct->NbrOfLines)); + assert_param(IS_LL_DMA2D_PIXEL(DMA2D_InitStruct->NbrOfPixelsPerLines)); + assert_param(IS_LL_DMA2D_GREEN(DMA2D_InitStruct->OutputGreen)); + assert_param(IS_LL_DMA2D_RED(DMA2D_InitStruct->OutputRed)); + assert_param(IS_LL_DMA2D_BLUE(DMA2D_InitStruct->OutputBlue)); + assert_param(IS_LL_DMA2D_ALPHA(DMA2D_InitStruct->OutputAlpha)); + assert_param(IS_LL_DMA2D_OFFSET(DMA2D_InitStruct->LineOffset)); + + /* DMA2D transfers must be disabled to configure bits in initialization registers */ + tmp = LL_DMA2D_IsTransferOngoing(DMA2Dx); + tmp1 = LL_DMA2D_FGND_IsEnabledCLUTLoad(DMA2Dx); + tmp2 = LL_DMA2D_BGND_IsEnabledCLUTLoad(DMA2Dx); + if ((tmp == 0U) && (tmp1 == 0U) && (tmp2 == 0U)) + { + /* DMA2D CR register configuration -------------------------------------------*/ + LL_DMA2D_SetMode(DMA2Dx, DMA2D_InitStruct->Mode); + + /* DMA2D OPFCCR register configuration ---------------------------------------*/ + MODIFY_REG(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM, DMA2D_InitStruct->ColorMode); + + /* DMA2D OOR register configuration ------------------------------------------*/ + LL_DMA2D_SetLineOffset(DMA2Dx, DMA2D_InitStruct->LineOffset); + + /* DMA2D NLR register configuration ------------------------------------------*/ + LL_DMA2D_ConfigSize(DMA2Dx, DMA2D_InitStruct->NbrOfLines, DMA2D_InitStruct->NbrOfPixelsPerLines); + + /* DMA2D OMAR register configuration ------------------------------------------*/ + LL_DMA2D_SetOutputMemAddr(DMA2Dx, DMA2D_InitStruct->OutputMemoryAddress); + + /* DMA2D OCOLR register configuration ------------------------------------------*/ + DMA2D_ColorStruct.ColorMode = DMA2D_InitStruct->ColorMode; + DMA2D_ColorStruct.OutputBlue = DMA2D_InitStruct->OutputBlue; + DMA2D_ColorStruct.OutputGreen = DMA2D_InitStruct->OutputGreen; + DMA2D_ColorStruct.OutputRed = DMA2D_InitStruct->OutputRed; + DMA2D_ColorStruct.OutputAlpha = DMA2D_InitStruct->OutputAlpha; + LL_DMA2D_ConfigOutputColor(DMA2Dx, &DMA2D_ColorStruct); + + status = SUCCESS; + } + /* If DMA2D transfers are not disabled, return ERROR */ + + return (status); +} + +/** + * @brief Set each @ref LL_DMA2D_InitTypeDef field to default value. + * @param DMA2D_InitStruct: pointer to a @ref LL_DMA2D_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_DMA2D_StructInit(LL_DMA2D_InitTypeDef *DMA2D_InitStruct) +{ + /* Set DMA2D_InitStruct fields to default values */ + DMA2D_InitStruct->Mode = LL_DMA2D_MODE_M2M; + DMA2D_InitStruct->ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB8888; + DMA2D_InitStruct->NbrOfLines = 0x0U; + DMA2D_InitStruct->NbrOfPixelsPerLines = 0x0U; + DMA2D_InitStruct->LineOffset = 0x0U; + DMA2D_InitStruct->OutputBlue = 0x0U; + DMA2D_InitStruct->OutputGreen = 0x0U; + DMA2D_InitStruct->OutputRed = 0x0U; + DMA2D_InitStruct->OutputAlpha = 0x0U; + DMA2D_InitStruct->OutputMemoryAddress = 0x0U; +} + +/** + * @brief Configure the foreground or background according to the specified parameters + * in the LL_DMA2D_LayerCfgTypeDef structure. + * @param DMA2Dx DMA2D Instance + * @param DMA2D_LayerCfg: pointer to a LL_DMA2D_LayerCfgTypeDef structure that contains + * the configuration information for the specified layer. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval None + */ +void LL_DMA2D_ConfigLayer(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LL_DMA2D_OFFSET(DMA2D_LayerCfg->LineOffset)); + assert_param(IS_LL_DMA2D_LCMODE(DMA2D_LayerCfg->ColorMode)); + assert_param(IS_LL_DMA2D_CLUTCMODE(DMA2D_LayerCfg->CLUTColorMode)); + assert_param(IS_LL_DMA2D_CLUTSIZE(DMA2D_LayerCfg->CLUTSize)); + assert_param(IS_LL_DMA2D_ALPHAMODE(DMA2D_LayerCfg->AlphaMode)); + assert_param(IS_LL_DMA2D_GREEN(DMA2D_LayerCfg->Green)); + assert_param(IS_LL_DMA2D_RED(DMA2D_LayerCfg->Red)); + assert_param(IS_LL_DMA2D_BLUE(DMA2D_LayerCfg->Blue)); + assert_param(IS_LL_DMA2D_ALPHA(DMA2D_LayerCfg->Alpha)); + + if (LayerIdx == 0U) + { + /* Configure the background memory address */ + LL_DMA2D_BGND_SetMemAddr(DMA2Dx, DMA2D_LayerCfg->MemoryAddress); + + /* Configure the background line offset */ + LL_DMA2D_BGND_SetLineOffset(DMA2Dx, DMA2D_LayerCfg->LineOffset); + + /* Configure the background Alpha value, Alpha mode, CLUT size, CLUT Color mode and Color mode */ + MODIFY_REG(DMA2Dx->BGPFCCR, \ + (DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM | DMA2D_BGPFCCR_CM), \ + ((DMA2D_LayerCfg->Alpha << DMA2D_BGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->AlphaMode | \ + (DMA2D_LayerCfg->CLUTSize << DMA2D_BGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \ + DMA2D_LayerCfg->ColorMode)); + + /* Configure the background color */ + LL_DMA2D_BGND_SetColor(DMA2Dx, DMA2D_LayerCfg->Red, DMA2D_LayerCfg->Green, DMA2D_LayerCfg->Blue); + + /* Configure the background CLUT memory address */ + LL_DMA2D_BGND_SetCLUTMemAddr(DMA2Dx, DMA2D_LayerCfg->CLUTMemoryAddress); + } + else + { + /* Configure the foreground memory address */ + LL_DMA2D_FGND_SetMemAddr(DMA2Dx, DMA2D_LayerCfg->MemoryAddress); + + /* Configure the foreground line offset */ + LL_DMA2D_FGND_SetLineOffset(DMA2Dx, DMA2D_LayerCfg->LineOffset); + + /* Configure the foreground Alpha value, Alpha mode, CLUT size, CLUT Color mode and Color mode */ + MODIFY_REG(DMA2Dx->FGPFCCR, \ + (DMA2D_FGPFCCR_ALPHA | DMA2D_FGPFCCR_AM | DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM | DMA2D_FGPFCCR_CM), \ + ((DMA2D_LayerCfg->Alpha << DMA2D_FGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->AlphaMode | \ + (DMA2D_LayerCfg->CLUTSize << DMA2D_FGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \ + DMA2D_LayerCfg->ColorMode)); + + /* Configure the foreground color */ + LL_DMA2D_FGND_SetColor(DMA2Dx, DMA2D_LayerCfg->Red, DMA2D_LayerCfg->Green, DMA2D_LayerCfg->Blue); + + /* Configure the foreground CLUT memory address */ + LL_DMA2D_FGND_SetCLUTMemAddr(DMA2Dx, DMA2D_LayerCfg->CLUTMemoryAddress); + } +} + +/** + * @brief Set each @ref LL_DMA2D_LayerCfgTypeDef field to default value. + * @param DMA2D_LayerCfg: pointer to a @ref LL_DMA2D_LayerCfgTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_DMA2D_LayerCfgStructInit(LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg) +{ + /* Set DMA2D_LayerCfg fields to default values */ + DMA2D_LayerCfg->MemoryAddress = 0x0U; + DMA2D_LayerCfg->ColorMode = LL_DMA2D_INPUT_MODE_ARGB8888; + DMA2D_LayerCfg->LineOffset = 0x0U; + DMA2D_LayerCfg->CLUTColorMode = LL_DMA2D_CLUT_COLOR_MODE_ARGB8888; + DMA2D_LayerCfg->CLUTSize = 0x0U; + DMA2D_LayerCfg->AlphaMode = LL_DMA2D_ALPHA_MODE_NO_MODIF; + DMA2D_LayerCfg->Alpha = 0x0U; + DMA2D_LayerCfg->Blue = 0x0U; + DMA2D_LayerCfg->Green = 0x0U; + DMA2D_LayerCfg->Red = 0x0U; + DMA2D_LayerCfg->CLUTMemoryAddress = 0x0U; +} + +/** + * @brief Initialize DMA2D output color register according to the specified parameters + * in DMA2D_ColorStruct. + * @param DMA2Dx DMA2D Instance + * @param DMA2D_ColorStruct: pointer to a LL_DMA2D_ColorTypeDef structure that contains + * the color configuration information for the specified DMA2D peripheral. + * @retval None + */ +void LL_DMA2D_ConfigOutputColor(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_ColorTypeDef *DMA2D_ColorStruct) +{ + uint32_t outgreen = 0U; + uint32_t outred = 0U; + uint32_t outalpha = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_OCMODE(DMA2D_ColorStruct->ColorMode)); + assert_param(IS_LL_DMA2D_GREEN(DMA2D_ColorStruct->OutputGreen)); + assert_param(IS_LL_DMA2D_RED(DMA2D_ColorStruct->OutputRed)); + assert_param(IS_LL_DMA2D_BLUE(DMA2D_ColorStruct->OutputBlue)); + assert_param(IS_LL_DMA2D_ALPHA(DMA2D_ColorStruct->OutputAlpha)); + + /* DMA2D OCOLR register configuration ------------------------------------------*/ + if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888) + { + outgreen = DMA2D_ColorStruct->OutputGreen << 8U; + outred = DMA2D_ColorStruct->OutputRed << 16U; + outalpha = DMA2D_ColorStruct->OutputAlpha << 24U; + } + else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) + { + outgreen = DMA2D_ColorStruct->OutputGreen << 8U; + outred = DMA2D_ColorStruct->OutputRed << 16U; + outalpha = 0x00000000U; + } + else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565) + { + outgreen = DMA2D_ColorStruct->OutputGreen << 5U; + outred = DMA2D_ColorStruct->OutputRed << 11U; + outalpha = 0x00000000U; + } + else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555) + { + outgreen = DMA2D_ColorStruct->OutputGreen << 5U; + outred = DMA2D_ColorStruct->OutputRed << 10U; + outalpha = DMA2D_ColorStruct->OutputAlpha << 15U; + } + else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */ + { + outgreen = DMA2D_ColorStruct->OutputGreen << 4U; + outred = DMA2D_ColorStruct->OutputRed << 8U; + outalpha = DMA2D_ColorStruct->OutputAlpha << 12U; + } + LL_DMA2D_SetOutputColor(DMA2Dx, (outgreen | outred | DMA2D_ColorStruct->OutputBlue | outalpha)); +} + +/** + * @brief Return DMA2D output Blue color. + * @param DMA2Dx DMA2D Instance. + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + * @retval Output Blue color value between Min_Data=0 and Max_Data=0xFF + */ +uint32_t LL_DMA2D_GetOutputBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + uint32_t color = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_OCMODE(ColorMode)); + + /* DMA2D OCOLR register reading ------------------------------------------*/ + if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFFU)); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFFU)); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x1FU)); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x1FU)); + } + else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */ + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFU)); + } + + return color; +} + +/** + * @brief Return DMA2D output Green color. + * @param DMA2Dx DMA2D Instance. + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + * @retval Output Green color value between Min_Data=0 and Max_Data=0xFF + */ +uint32_t LL_DMA2D_GetOutputGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + uint32_t color = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_OCMODE(ColorMode)); + + /* DMA2D OCOLR register reading ------------------------------------------*/ + if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF00U) >> 8U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF00U) >> 8U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x7E0U) >> 5U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x3E0U) >> 5U); + } + else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */ + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF0U) >> 4U); + } + + return color; +} + +/** + * @brief Return DMA2D output Red color. + * @param DMA2Dx DMA2D Instance. + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + * @retval Output Red color value between Min_Data=0 and Max_Data=0xFF + */ +uint32_t LL_DMA2D_GetOutputRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + uint32_t color = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_OCMODE(ColorMode)); + + /* DMA2D OCOLR register reading ------------------------------------------*/ + if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF0000U) >> 16U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF0000U) >> 16U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF800U) >> 11U); + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x7C00U) >> 10U); + } + else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */ + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF00U) >> 8U); + } + + return color; +} + +/** + * @brief Return DMA2D output Alpha color. + * @param DMA2Dx DMA2D Instance. + * @param ColorMode This parameter can be one of the following values: + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888 + * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555 + * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444 + * @retval Output Alpha color value between Min_Data=0 and Max_Data=0xFF + */ +uint32_t LL_DMA2D_GetOutputAlphaColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode) +{ + uint32_t color = 0U; + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx)); + assert_param(IS_LL_DMA2D_OCMODE(ColorMode)); + + /* DMA2D OCOLR register reading ------------------------------------------*/ + if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF000000U) >> 24U); + } + else if ((ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) || (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565)) + { + color = 0x0U; + } + else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555) + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x8000U) >> 15U); + } + else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */ + { + color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF000U) >> 12U); + } + + return color; +} + +/** + * @brief Configure DMA2D transfer size. + * @param DMA2Dx DMA2D Instance + * @param NbrOfLines Value between Min_Data=0 and Max_Data=0xFFFF + * @param NbrOfPixelsPerLines Value between Min_Data=0 and Max_Data=0x3FFF + * @retval None + */ +void LL_DMA2D_ConfigSize(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines, uint32_t NbrOfPixelsPerLines) +{ + MODIFY_REG(DMA2Dx->NLR, (DMA2D_NLR_PL | DMA2D_NLR_NL), \ + ((NbrOfPixelsPerLines << DMA2D_NLR_PL_Pos) | NbrOfLines)); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (DMA2D) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c new file mode 100644 index 0000000..32e52d4 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c @@ -0,0 +1,232 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_exti.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief EXTI LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_exti.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (EXTI) + +/** @defgroup EXTI_LL EXTI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup EXTI_LL_Private_Macros + * @{ + */ + +#define IS_LL_EXTI_LINE_0_31(__VALUE__) (((__VALUE__) & ~LL_EXTI_LINE_ALL_0_31) == 0x00000000U) + +#define IS_LL_EXTI_MODE(__VALUE__) (((__VALUE__) == LL_EXTI_MODE_IT) \ + || ((__VALUE__) == LL_EXTI_MODE_EVENT) \ + || ((__VALUE__) == LL_EXTI_MODE_IT_EVENT)) + + +#define IS_LL_EXTI_TRIGGER(__VALUE__) (((__VALUE__) == LL_EXTI_TRIGGER_NONE) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_RISING) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_FALLING) \ + || ((__VALUE__) == LL_EXTI_TRIGGER_RISING_FALLING)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup EXTI_LL_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the EXTI registers to their default reset values. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: EXTI registers are de-initialized + * - ERROR: not applicable + */ +uint32_t LL_EXTI_DeInit(void) +{ + /* Interrupt mask register set to default reset values */ + LL_EXTI_WriteReg(IMR, 0x00000000U); + /* Event mask register set to default reset values */ + LL_EXTI_WriteReg(EMR, 0x00000000U); + /* Rising Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(RTSR, 0x00000000U); + /* Falling Trigger selection register set to default reset values */ + LL_EXTI_WriteReg(FTSR, 0x00000000U); + /* Software interrupt event register set to default reset values */ + LL_EXTI_WriteReg(SWIER, 0x00000000U); + /* Pending register set to default reset values */ + LL_EXTI_WriteReg(PR, 0x00FFFFFFU); + + return SUCCESS; +} + +/** + * @brief Initialize the EXTI registers according to the specified parameters in EXTI_InitStruct. + * @param EXTI_InitStruct pointer to a @ref LL_EXTI_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: EXTI registers are initialized + * - ERROR: not applicable + */ +uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + ErrorStatus status = SUCCESS; + /* Check the parameters */ + assert_param(IS_LL_EXTI_LINE_0_31(EXTI_InitStruct->Line_0_31)); + assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->LineCommand)); + assert_param(IS_LL_EXTI_MODE(EXTI_InitStruct->Mode)); + + /* ENABLE LineCommand */ + if (EXTI_InitStruct->LineCommand != DISABLE) + { + assert_param(IS_LL_EXTI_TRIGGER(EXTI_InitStruct->Trigger)); + + /* Configure EXTI Lines in range from 0 to 31 */ + if (EXTI_InitStruct->Line_0_31 != LL_EXTI_LINE_NONE) + { + switch (EXTI_InitStruct->Mode) + { + case LL_EXTI_MODE_IT: + /* First Disable Event on provided Lines */ + LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable IT on provided Lines */ + LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_MODE_EVENT: + /* First Disable IT on provided Lines */ + LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Event on provided Lines */ + LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_MODE_IT_EVENT: + /* Directly Enable IT & Event on provided Lines */ + LL_EXTI_EnableIT_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_EnableEvent_0_31(EXTI_InitStruct->Line_0_31); + break; + default: + status = ERROR; + break; + } + if (EXTI_InitStruct->Trigger != LL_EXTI_TRIGGER_NONE) + { + switch (EXTI_InitStruct->Trigger) + { + case LL_EXTI_TRIGGER_RISING: + /* First Disable Falling Trigger on provided Lines */ + LL_EXTI_DisableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Rising Trigger on provided Lines */ + LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_TRIGGER_FALLING: + /* First Disable Rising Trigger on provided Lines */ + LL_EXTI_DisableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + /* Then Enable Falling Trigger on provided Lines */ + LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + case LL_EXTI_TRIGGER_RISING_FALLING: + LL_EXTI_EnableRisingTrig_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_EnableFallingTrig_0_31(EXTI_InitStruct->Line_0_31); + break; + default: + status = ERROR; + break; + } + } + } + } + /* DISABLE LineCommand */ + else + { + /* De-configure EXTI Lines in range from 0 to 31 */ + LL_EXTI_DisableIT_0_31(EXTI_InitStruct->Line_0_31); + LL_EXTI_DisableEvent_0_31(EXTI_InitStruct->Line_0_31); + } + return status; +} + +/** + * @brief Set each @ref LL_EXTI_InitTypeDef field to default value. + * @param EXTI_InitStruct Pointer to a @ref LL_EXTI_InitTypeDef structure. + * @retval None + */ +void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + EXTI_InitStruct->Line_0_31 = LL_EXTI_LINE_NONE; + EXTI_InitStruct->LineCommand = DISABLE; + EXTI_InitStruct->Mode = LL_EXTI_MODE_IT; + EXTI_InitStruct->Trigger = LL_EXTI_TRIGGER_FALLING; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (EXTI) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c index fc07477..13fc530 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_ll_fmc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FMC Low Layer HAL module driver. * * This file provides firmware functions to manage the following @@ -46,7 +46,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -282,8 +282,8 @@ HAL_StatusTypeDef FMC_NORSRAM_DeInit(FMC_NORSRAM_TypeDef *Device, FMC_NORSRAM_EX Device->BTCR[Bank] = 0x000030D2U; } - Device->BTCR[Bank + 1] = 0x0FFFFFFFU; - ExDevice->BWTR[Bank] = 0x0FFFFFFFU; + Device->BTCR[Bank + 1U] = 0x0FFFFFFFU; + ExDevice->BWTR[Bank] = 0x0FFFFFFFU; return HAL_OK; } @@ -333,7 +333,7 @@ HAL_StatusTypeDef FMC_NORSRAM_Timing_Init(FMC_NORSRAM_TypeDef *Device, FMC_NORSR /* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */ if(HAL_IS_BIT_SET(Device->BTCR[FMC_NORSRAM_BANK1], FMC_BCR1_CCLKEN)) { - tmpr = (uint32_t)(Device->BTCR[FMC_NORSRAM_BANK1 + 1U] & ~(((uint32_t)0x0FU) << 20U)); + tmpr = (uint32_t)(Device->BTCR[FMC_NORSRAM_BANK1 + 1U] & ~(0x0FU << 20U)); tmpr |= (uint32_t)(((Timing->CLKDivision) - 1U) << 20U); Device->BTCR[FMC_NORSRAM_BANK1 + 1U] = tmpr; } @@ -1474,8 +1474,8 @@ HAL_StatusTypeDef FMC_SDRAM_Timing_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_Tim /* Clear TRC and TRP bits */ tmpr1 &= ((uint32_t)~(FMC_SDTR1_TRC | FMC_SDTR1_TRP)); - tmpr1 |= (uint32_t)((((Timing->RowCycleDelay)-1) << 12) |\ - (((Timing->RPDelay)-1) << 20)); + tmpr1 |= (uint32_t)((((Timing->RowCycleDelay)-1U) << 12U) |\ + (((Timing->RPDelay)-1U) << 20U)); tmpr2 = Device->SDTR[FMC_SDRAM_BANK2]; @@ -1484,11 +1484,11 @@ HAL_StatusTypeDef FMC_SDRAM_Timing_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_Tim FMC_SDTR1_TRC | FMC_SDTR1_TWR | FMC_SDTR1_TRP | \ FMC_SDTR1_TRCD)); - tmpr2 |= (uint32_t)((((Timing->LoadToActiveDelay)-1) |\ - (((Timing->ExitSelfRefreshDelay)-1) << 4) |\ - (((Timing->SelfRefreshTime)-1) << 8) |\ - (((Timing->WriteRecoveryTime)-1) <<16) |\ - (((Timing->RCDDelay)-1) << 24))); + tmpr2 |= (uint32_t)((((Timing->LoadToActiveDelay)-1U) |\ + (((Timing->ExitSelfRefreshDelay)-1U) << 4U) |\ + (((Timing->SelfRefreshTime)-1U) << 8U) |\ + (((Timing->WriteRecoveryTime)-1U) <<16U) |\ + (((Timing->RCDDelay)-1U) << 24U))); Device->SDTR[FMC_SDRAM_BANK1] = tmpr1; Device->SDTR[FMC_SDRAM_BANK2] = tmpr2; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c index 772a8b8..1b8f9af 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_ll_fsmc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief FSMC Low Layer HAL module driver. * * This file provides firmware functions to manage the following @@ -44,7 +44,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -328,7 +328,7 @@ HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NO /* Configure Clock division value (in NORSRAM bank 1) when continuous clock is enabled */ if(HAL_IS_BIT_SET(Device->BTCR[FSMC_NORSRAM_BANK1], FSMC_BCR1_CCLKEN)) { - tmpr = (uint32_t)(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] & ~(((uint32_t)0x0FU) << 20U)); + tmpr = (uint32_t)(Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] & ~(0x0FU << 20U)); tmpr |= (uint32_t)(((Timing->CLKDivision)-1U) << 20U); Device->BTCR[FSMC_NORSRAM_BANK1 + 1U] = tmpr; } diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c new file mode 100644 index 0000000..54353be --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c @@ -0,0 +1,325 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_gpio.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief GPIO LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_gpio.h" +#include "stm32f4xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) + +/** @addtogroup GPIO_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup GPIO_LL_Private_Macros + * @{ + */ +#define IS_LL_GPIO_PIN(__VALUE__) (((0x00000000U) < (__VALUE__)) && ((__VALUE__) <= (LL_GPIO_PIN_ALL))) + +#define IS_LL_GPIO_MODE(__VALUE__) (((__VALUE__) == LL_GPIO_MODE_INPUT) ||\ + ((__VALUE__) == LL_GPIO_MODE_OUTPUT) ||\ + ((__VALUE__) == LL_GPIO_MODE_ALTERNATE) ||\ + ((__VALUE__) == LL_GPIO_MODE_ANALOG)) + +#define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__) (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL) ||\ + ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN)) + +#define IS_LL_GPIO_SPEED(__VALUE__) (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH) ||\ + ((__VALUE__) == LL_GPIO_SPEED_FREQ_VERY_HIGH)) + +#define IS_LL_GPIO_PULL(__VALUE__) (((__VALUE__) == LL_GPIO_PULL_NO) ||\ + ((__VALUE__) == LL_GPIO_PULL_UP) ||\ + ((__VALUE__) == LL_GPIO_PULL_DOWN)) + +#define IS_LL_GPIO_ALTERNATE(__VALUE__) (((__VALUE__) == LL_GPIO_AF_0 ) ||\ + ((__VALUE__) == LL_GPIO_AF_1 ) ||\ + ((__VALUE__) == LL_GPIO_AF_2 ) ||\ + ((__VALUE__) == LL_GPIO_AF_3 ) ||\ + ((__VALUE__) == LL_GPIO_AF_4 ) ||\ + ((__VALUE__) == LL_GPIO_AF_5 ) ||\ + ((__VALUE__) == LL_GPIO_AF_6 ) ||\ + ((__VALUE__) == LL_GPIO_AF_7 ) ||\ + ((__VALUE__) == LL_GPIO_AF_8 ) ||\ + ((__VALUE__) == LL_GPIO_AF_9 ) ||\ + ((__VALUE__) == LL_GPIO_AF_10 ) ||\ + ((__VALUE__) == LL_GPIO_AF_11 ) ||\ + ((__VALUE__) == LL_GPIO_AF_12 ) ||\ + ((__VALUE__) == LL_GPIO_AF_13 ) ||\ + ((__VALUE__) == LL_GPIO_AF_14 ) ||\ + ((__VALUE__) == LL_GPIO_AF_15 )) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_LL_Exported_Functions + * @{ + */ + +/** @addtogroup GPIO_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize GPIO registers (Registers restored to their default values). + * @param GPIOx GPIO Port + * @retval An ErrorStatus enumeration value: + * - SUCCESS: GPIO registers are de-initialized + * - ERROR: Wrong GPIO Port + */ +ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + + /* Force and Release reset on clock of GPIOx Port */ + if (GPIOx == GPIOA) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOA); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOA); + } + else if (GPIOx == GPIOB) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOB); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOB); + } + else if (GPIOx == GPIOC) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOC); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOC); + } +#if defined(GPIOD) + else if (GPIOx == GPIOD) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOD); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOD); + } +#endif /* GPIOD */ +#if defined(GPIOE) + else if (GPIOx == GPIOE) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOE); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOE); + } +#endif /* GPIOE */ +#if defined(GPIOF) + else if (GPIOx == GPIOF) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOF); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOF); + } +#endif /* GPIOF */ +#if defined(GPIOG) + else if (GPIOx == GPIOG) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOG); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOG); + } +#endif /* GPIOG */ +#if defined(GPIOH) + else if (GPIOx == GPIOH) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOH); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOH); + } +#endif /* GPIOH */ +#if defined(GPIOI) + else if (GPIOx == GPIOI) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOI); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOI); + } +#endif /* GPIOI */ +#if defined(GPIOJ) + else if (GPIOx == GPIOJ) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOJ); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOJ); + } +#endif /* GPIOJ */ +#if defined(GPIOK) + else if (GPIOx == GPIOK) + { + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOK); + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOK); + } +#endif /* GPIOK */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize GPIO registers according to the specified parameters in GPIO_InitStruct. + * @param GPIOx GPIO Port + * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure + * that contains the configuration information for the specified GPIO peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: GPIO registers are initialized according to GPIO_InitStruct content + * - ERROR: Not applicable + */ +ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct) +{ + uint32_t pinpos = 0x00000000U; + uint32_t currentpin = 0x00000000U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin)); + assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode)); + assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull)); + + /* ------------------------- Configure the port pins ---------------- */ + /* Initialize pinpos on first pin set */ + pinpos = POSITION_VAL(GPIO_InitStruct->Pin); + + /* Configure the port pins */ + while (((GPIO_InitStruct->Pin) >> pinpos) != 0x00000000U) + { + /* Get current io position */ + currentpin = (GPIO_InitStruct->Pin) & (0x00000001U << pinpos); + + if (currentpin) + { + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); + + if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) + { + /* Check Speed mode parameters */ + assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed)); + + /* Speed mode configuration */ + LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + } + + /* Pull-up Pull down resistor configuration*/ + LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull); + + if (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE) + { + /* Check Alternate parameter */ + assert_param(IS_LL_GPIO_ALTERNATE(GPIO_InitStruct->Alternate)); + + /* Speed mode configuration */ + if (POSITION_VAL(currentpin) < 0x00000008U) + { + LL_GPIO_SetAFPin_0_7(GPIOx, currentpin, GPIO_InitStruct->Alternate); + } + else + { + LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); + } + } + } + pinpos++; + } + + if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) + { + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); + + } + return (SUCCESS); +} + +/** + * @brief Set each @ref LL_GPIO_InitTypeDef field to default value. + * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ + +void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct) +{ + /* Reset GPIO init structure parameters values */ + GPIO_InitStruct->Pin = LL_GPIO_PIN_ALL; + GPIO_InitStruct->Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct->Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct->OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct->Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct->Alternate = LL_GPIO_AF_0; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_i2c.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_i2c.c new file mode 100644 index 0000000..d81c2f8 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_i2c.c @@ -0,0 +1,271 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_i2c.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief I2C LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_i2c.h" +#include "stm32f4xx_ll_bus.h" +#include "stm32f4xx_ll_rcc.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (I2C1) || defined (I2C2) || defined (I2C3) + +/** @defgroup I2C_LL I2C + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup I2C_LL_Private_Macros + * @{ + */ + +#define IS_LL_I2C_PERIPHERAL_MODE(__VALUE__) (((__VALUE__) == LL_I2C_MODE_I2C) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_HOST) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE) || \ + ((__VALUE__) == LL_I2C_MODE_SMBUS_DEVICE_ARP)) + +#define IS_I2C_CLOCK_SPEED(__VALUE__) (((__VALUE__) > 0U) && ((__VALUE__) <= LL_I2C_MAX_SPEED_FAST)) + +#define IS_I2C_DUTY_CYCLE(__VALUE__) (((__VALUE__) == LL_I2C_DUTYCYCLE_2) || \ + ((__VALUE__) == LL_I2C_DUTYCYCLE_16_9)) + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) +#define IS_LL_I2C_ANALOG_FILTER(__VALUE__) (((__VALUE__) == LL_I2C_ANALOGFILTER_ENABLE) || \ + ((__VALUE__) == LL_I2C_ANALOGFILTER_DISABLE)) + +#define IS_LL_I2C_DIGITAL_FILTER(__VALUE__) ((__VALUE__) <= 0x0000000FU) + +#endif +#define IS_LL_I2C_OWN_ADDRESS1(__VALUE__) ((__VALUE__) <= 0x000003FFU) + +#define IS_LL_I2C_TYPE_ACKNOWLEDGE(__VALUE__) (((__VALUE__) == LL_I2C_ACK) || \ + ((__VALUE__) == LL_I2C_NACK)) + +#define IS_LL_I2C_OWN_ADDRSIZE(__VALUE__) (((__VALUE__) == LL_I2C_OWNADDRESS1_7BIT) || \ + ((__VALUE__) == LL_I2C_OWNADDRESS1_10BIT)) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2C_LL_Exported_Functions + * @{ + */ + +/** @addtogroup I2C_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the I2C registers to their default reset values. + * @param I2Cx I2C Instance. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: I2C registers are de-initialized + * - ERROR: I2C registers are not de-initialized + */ +uint32_t LL_I2C_DeInit(I2C_TypeDef *I2Cx) +{ + ErrorStatus status = SUCCESS; + + /* Check the I2C Instance I2Cx */ + assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); + + if (I2Cx == I2C1) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C1); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C1); + } + else if (I2Cx == I2C2) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C2); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C2); + + } +#if defined(I2C3) + else if (I2Cx == I2C3) + { + /* Force reset of I2C clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_I2C3); + + /* Release reset of I2C clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_I2C3); + } +#endif + else + { + status = ERROR; + } + + return status; +} + +/** + * @brief Initialize the I2C registers according to the specified parameters in I2C_InitStruct. + * @param I2Cx I2C Instance. + * @param I2C_InitStruct pointer to a @ref LL_I2C_InitTypeDef structure. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: I2C registers are initialized + * - ERROR: Not applicable + */ +uint32_t LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct) +{ + LL_RCC_ClocksTypeDef rcc_clocks; + + /* Check the I2C Instance I2Cx */ + assert_param(IS_I2C_ALL_INSTANCE(I2Cx)); + + /* Check the I2C parameters from I2C_InitStruct */ + assert_param(IS_LL_I2C_PERIPHERAL_MODE(I2C_InitStruct->PeripheralMode)); + assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->ClockSpeed)); + assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->DutyCycle)); +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) + assert_param(IS_LL_I2C_ANALOG_FILTER(I2C_InitStruct->AnalogFilter)); + assert_param(IS_LL_I2C_DIGITAL_FILTER(I2C_InitStruct->DigitalFilter)); +#endif + assert_param(IS_LL_I2C_OWN_ADDRESS1(I2C_InitStruct->OwnAddress1)); + assert_param(IS_LL_I2C_TYPE_ACKNOWLEDGE(I2C_InitStruct->TypeAcknowledge)); + assert_param(IS_LL_I2C_OWN_ADDRSIZE(I2C_InitStruct->OwnAddrSize)); + + /* Disable the selected I2Cx Peripheral */ + LL_I2C_Disable(I2Cx); + + /* Retrieve Clock frequencies */ + LL_RCC_GetSystemClocksFreq(&rcc_clocks); + +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) + /*---------------------------- I2Cx FLTR Configuration ----------------------- + * Configure the analog and digital noise filters with parameters : + * - AnalogFilter: I2C_FLTR_ANFOFF bit + * - DigitalFilter: I2C_FLTR_DNF[3:0] bits + */ + LL_I2C_ConfigFilters(I2Cx, I2C_InitStruct->AnalogFilter, I2C_InitStruct->DigitalFilter); + +#endif + /*---------------------------- I2Cx SCL Clock Speed Configuration ------------ + * Configure the SCL speed : + * - ClockSpeed: I2C_CR2_FREQ[5:0], I2C_TRISE_TRISE[5:0], I2C_CCR_FS, + * and I2C_CCR_CCR[11:0] bits + * - DutyCycle: I2C_CCR_DUTY[7:0] bits + */ + LL_I2C_ConfigSpeed(I2Cx, rcc_clocks.PCLK1_Frequency, I2C_InitStruct->ClockSpeed, I2C_InitStruct->DutyCycle); + + /*---------------------------- I2Cx OAR1 Configuration ----------------------- + * Disable, Configure and Enable I2Cx device own address 1 with parameters : + * - OwnAddress1: I2C_OAR1_ADD[9:8], I2C_OAR1_ADD[7:1] and I2C_OAR1_ADD0 bits + * - OwnAddrSize: I2C_OAR1_ADDMODE bit + */ + LL_I2C_SetOwnAddress1(I2Cx, I2C_InitStruct->OwnAddress1, I2C_InitStruct->OwnAddrSize); + + /*---------------------------- I2Cx MODE Configuration ----------------------- + * Configure I2Cx peripheral mode with parameter : + * - PeripheralMode: I2C_CR1_SMBUS, I2C_CR1_SMBTYPE and I2C_CR1_ENARP bits + */ + LL_I2C_SetMode(I2Cx, I2C_InitStruct->PeripheralMode); + + /* Enable the selected I2Cx Peripheral */ + LL_I2C_Enable(I2Cx); + + /*---------------------------- I2Cx CR2 Configuration ------------------------ + * Configure the ACKnowledge or Non ACKnowledge condition + * after the address receive match code or next received byte with parameter : + * - TypeAcknowledge: I2C_CR2_NACK bit + */ + LL_I2C_AcknowledgeNextData(I2Cx, I2C_InitStruct->TypeAcknowledge); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_I2C_InitTypeDef field to default value. + * @param I2C_InitStruct Pointer to a @ref LL_I2C_InitTypeDef structure. + * @retval None + */ +void LL_I2C_StructInit(LL_I2C_InitTypeDef *I2C_InitStruct) +{ + /* Set I2C_InitStruct fields to default values */ + I2C_InitStruct->PeripheralMode = LL_I2C_MODE_I2C; + I2C_InitStruct->ClockSpeed = 5000U; + I2C_InitStruct->DutyCycle = LL_I2C_DUTYCYCLE_2; +#if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF) + I2C_InitStruct->AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; + I2C_InitStruct->DigitalFilter = 0U; +#endif + I2C_InitStruct->OwnAddress1 = 0U; + I2C_InitStruct->TypeAcknowledge = LL_I2C_NACK; + I2C_InitStruct->OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* I2C1 || I2C2 || I2C3 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_lptim.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_lptim.c new file mode 100644 index 0000000..7c56f7c --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_lptim.c @@ -0,0 +1,212 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_lptim.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief LPTIM LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_lptim.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT + #include "stm32_assert.h" +#else + #define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (LPTIM1) || defined (LPTIM2) + +/** @addtogroup LPTIM_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPTIM_LL_Private_Macros + * @{ + */ +#define IS_LPTIM_CLOCK_SOURCE(__VALUE__) (((__VALUE__) == LL_LPTIM_CLK_SOURCE_INTERNAL) \ + || ((__VALUE__) == LL_LPTIM_CLK_SOURCE_EXTERNAL)) + +#define IS_LPTIM_CLOCK_PRESCALER(__VALUE__) (((__VALUE__) == LL_LPTIM_PRESCALER_DIV1) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV2) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV4) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV8) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV16) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV32) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV64) \ + || ((__VALUE__) == LL_LPTIM_PRESCALER_DIV128)) + +#define IS_LPTIM_WAVEFORM(__VALUE__) (((__VALUE__) == LL_LPTIM_OUTPUT_WAVEFORM_PWM) \ + || ((__VALUE__) == LL_LPTIM_OUTPUT_WAVEFORM_SETONCE)) + +#define IS_LPTIM_OUTPUT_POLARITY(__VALUE__) (((__VALUE__) == LL_LPTIM_OUTPUT_POLARITY_REGULAR) \ + || ((__VALUE__) == LL_LPTIM_OUTPUT_POLARITY_INVERSE)) +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPTIM_LL_Exported_Functions + * @{ + */ + +/** @addtogroup LPTIM_LL_EF_Init + * @{ + */ + +/** + * @brief Set LPTIMx registers to their reset values. + * @param LPTIMx LP Timer instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPTIMx registers are de-initialized + * - ERROR: invalid LPTIMx instance + */ +ErrorStatus LL_LPTIM_DeInit(LPTIM_TypeDef* LPTIMx) +{ + ErrorStatus result = SUCCESS; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(LPTIMx)); + + if (LPTIMx == LPTIM1) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPTIM1); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPTIM1); + } +#if defined(LPTIM2) + else if (LPTIMx == LPTIM2) + { + LL_APB1_GRP2_ForceReset(LL_APB1_GRP2_PERIPH_LPTIM2); + LL_APB1_GRP2_ReleaseReset(LL_APB1_GRP2_PERIPH_LPTIM2); + } +#endif + else + { + result = ERROR; + } + + return result; +} + +/** + * @brief Set each fields of the LPTIM_InitStruct structure to its default + * value. + * @param LPTIM_InitStruct pointer to a @ref LL_LPTIM_InitTypeDef structure + * @retval None + */ +void LL_LPTIM_StructInit(LL_LPTIM_InitTypeDef* LPTIM_InitStruct) +{ + /* Set the default configuration */ + LPTIM_InitStruct->ClockSource = LL_LPTIM_CLK_SOURCE_INTERNAL; + LPTIM_InitStruct->Prescaler = LL_LPTIM_PRESCALER_DIV1; + LPTIM_InitStruct->Waveform = LL_LPTIM_OUTPUT_WAVEFORM_PWM; + LPTIM_InitStruct->Polarity = LL_LPTIM_OUTPUT_POLARITY_REGULAR; +} + +/** + * @brief Configure the LPTIMx peripheral according to the specified parameters. + * @note LL_LPTIM_Init can only be called when the LPTIM instance is disabled. + * @note LPTIMx can be disabled using unitary function @ref LL_LPTIM_Disable(). + * @param LPTIMx LP Timer Instance + * @param LPTIM_InitStruct pointer to a @ref LL_LPTIM_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: LPTIMx instance has been initialized + * - ERROR: LPTIMx instance hasn't been initialized + */ +ErrorStatus LL_LPTIM_Init(LPTIM_TypeDef * LPTIMx, LL_LPTIM_InitTypeDef* LPTIM_InitStruct) +{ + ErrorStatus result = SUCCESS; + + /* The LPTIMx_CFGR register must only be modified when the LPTIM is disabled + (ENABLE bit is reset to 0). + */ + if (LL_LPTIM_IsEnabled(LPTIMx)) + { + result = ERROR; + } + else + { + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(LPTIMx)); + assert_param(IS_LPTIM_CLOCK_SOURCE(LPTIM_InitStruct->ClockSource)); + assert_param(IS_LPTIM_CLOCK_PRESCALER(LPTIM_InitStruct->Prescaler)); + assert_param(IS_LPTIM_WAVEFORM(LPTIM_InitStruct->Waveform)); + assert_param(IS_LPTIM_OUTPUT_POLARITY(LPTIM_InitStruct->Polarity)); + + /* Set CKSEL bitfield according to ClockSource value */ + /* Set PRESC bitfield according to Prescaler value */ + /* Set WAVE bitfield according to Waveform value */ + /* Set WAVEPOL bitfield according to Polarity value */ + MODIFY_REG(LPTIMx->CFGR, + (LPTIM_CFGR_CKSEL | LPTIM_CFGR_PRESC | LPTIM_CFGR_WAVE| LPTIM_CFGR_WAVPOL), + LPTIM_InitStruct->ClockSource | \ + LPTIM_InitStruct->Prescaler | \ + LPTIM_InitStruct->Waveform | \ + LPTIM_InitStruct->Polarity); + } + + return result; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (LPTIM1) || defined (LPTIM2) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_pwr.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_pwr.c new file mode 100644 index 0000000..83ea463 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_pwr.c @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_pwr.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief PWR LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_pwr.h" +#include "stm32f4xx_ll_bus.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(PWR) + +/** @defgroup PWR_LL PWR + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWR_LL_Exported_Functions + * @{ + */ + +/** @addtogroup PWR_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the PWR registers to their default reset values. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: PWR registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_PWR_DeInit(void) +{ + /* Force reset of PWR clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_PWR); + + /* Release reset of PWR clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_PWR); + + return SUCCESS; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined(PWR) */ +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rcc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rcc.c new file mode 100644 index 0000000..265027e --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rcc.c @@ -0,0 +1,1649 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rcc.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief RCC LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_rcc.h" +#ifdef USE_FULL_ASSERT + #include "stm32_assert.h" +#else + #define assert_param(expr) ((void)0U) +#endif +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @addtogroup RCC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RCC_LL_Private_Macros + * @{ + */ +#if defined(FMPI2C1) +#define IS_LL_RCC_FMPI2C_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_FMPI2C1_CLKSOURCE) +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +#define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE)) +#endif /* LPTIM1 */ + +#if defined(SAI1) +#if defined(RCC_DCKCFGR_SAI1SRC) +#define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE)) +#elif defined(RCC_DCKCFGR_SAI1ASRC) +#define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_A_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_SAI1_B_CLKSOURCE)) +#endif /* RCC_DCKCFGR_SAI1SRC */ +#endif /* SAI1 */ + +#if defined(SDIO) +#define IS_LL_RCC_SDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDIO_CLKSOURCE)) +#endif /* SDIO */ + +#if defined(RNG) +#define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE)) +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +#define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE)) +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#if defined(DFSDM2_Channel0) +#define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE)) + +#define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_DFSDM2_AUDIO_CLKSOURCE)) +#elif defined(DFSDM1_Channel0) +#define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE)) + +#define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE)) +#endif /* DFSDM2_Channel0 */ + +#if defined(RCC_DCKCFGR_I2S2SRC) +#define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \ + || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE)) +#else +#define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE)) +#endif /* RCC_DCKCFGR_I2S2SRC */ + +#if defined(CEC) +#define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE)) +#endif /* CEC */ + +#if defined(DSI) +#define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DSI_CLKSOURCE)) +#endif /* DSI */ + +#if defined(LTDC) +#define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE)) +#endif /* LTDC */ + +#if defined(SPDIFRX) +#define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE)) +#endif /* SPDIFRX */ +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup RCC_LL_Private_Functions RCC Private functions + * @{ + */ +uint32_t RCC_GetSystemClockFreq(void); +uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency); +uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency); +uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency); +uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source); +uint32_t RCC_PLL_GetFreqDomain_48M(void); +#if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC) +uint32_t RCC_PLL_GetFreqDomain_I2S(void); +#endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */ +#if defined(SPDIFRX) +uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void); +#endif /* SPDIFRX */ +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +uint32_t RCC_PLL_GetFreqDomain_SAI(void); +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ +#if defined(DSI) +uint32_t RCC_PLL_GetFreqDomain_DSI(void); +#endif /* DSI */ +#if defined(RCC_PLLSAI_SUPPORT) +uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void); +#if defined(RCC_PLLSAICFGR_PLLSAIP) +uint32_t RCC_PLLSAI_GetFreqDomain_48M(void); +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#if defined(LTDC) +uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void); +#endif /* LTDC */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2S_SUPPORT) +uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void); +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +uint32_t RCC_PLLI2S_GetFreqDomain_48M(void); +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#if defined(SAI1) +uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void); +#endif /* SAI1 */ +#if defined(SPDIFRX) +uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void); +#endif /* SPDIFRX */ +#endif /* RCC_PLLI2S_SUPPORT */ +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_LL_EF_Init + * @{ + */ + +/** + * @brief Reset the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RCC registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_RCC_DeInit(void) +{ + uint32_t vl_mask = 0U; + + /* Set HSION bit */ + LL_RCC_HSI_Enable(); + + /* Reset CFGR register */ + LL_RCC_WriteReg(CFGR, 0x00000000U); + + vl_mask = 0xFFFFFFFFU; + + /* Reset HSEON, PLLSYSON bits */ + CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON)); + +#if defined(RCC_PLLSAI_SUPPORT) + /* Reset PLLSAION bit */ + CLEAR_BIT(vl_mask, RCC_CR_PLLSAION); +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) + /* Reset PLLI2SON bit */ + CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON); +#endif /* RCC_PLLI2S_SUPPORT */ + + /* Write new mask in CR register */ + LL_RCC_WriteReg(CR, vl_mask); + + /* Set HSITRIM bits to the reset value*/ + LL_RCC_HSI_SetCalibTrimming(0x10U); + + /* Reset PLLCFGR register */ + LL_RCC_WriteReg(PLLCFGR, RCC_PLLCFGR_RST_VALUE); + +#if defined(RCC_PLLI2S_SUPPORT) + /* Reset PLLI2SCFGR register */ + LL_RCC_WriteReg(PLLI2SCFGR, RCC_PLLI2SCFGR_RST_VALUE); +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) + /* Reset PLLSAICFGR register */ + LL_RCC_WriteReg(PLLSAICFGR, RCC_PLLSAICFGR_RST_VALUE); +#endif /* RCC_PLLSAI_SUPPORT */ + + /* Reset HSEBYP bit */ + LL_RCC_HSE_DisableBypass(); + + /* Disable all interrupts */ + LL_RCC_WriteReg(CIR, 0x00000000U); + + return SUCCESS; +} + +/** + * @} + */ + +/** @addtogroup RCC_LL_EF_Get_Freq + * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks + * and different peripheral clocks available on the device. + * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**) + * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***) + * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***) + * or HSI_VALUE(**) multiplied/divided by the PLL factors. + * @note (**) HSI_VALUE is a constant defined in this file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (***) HSE_VALUE is a constant defined in this file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * @note The result of this function could be incorrect when using fractional + * value for HSE crystal. + * @note This function can be used by the user application to compute the + * baud-rate for the communication peripherals or configure other parameters. + * @{ + */ + +/** + * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks + * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function + * must be called to update structure fields. Otherwise, any + * configuration based on this function will be incorrect. + * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies + * @retval None + */ +void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks) +{ + /* Get SYSCLK frequency */ + RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq(); + + /* HCLK clock frequency */ + RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency); + + /* PCLK1 clock frequency */ + RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency); + + /* PCLK2 clock frequency */ + RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency); +} + +#if defined(FMPI2C1) +/** + * @brief Return FMPI2Cx clock frequency + * @param FMPI2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE + * @retval FMPI2C clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready + */ +uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource) +{ + uint32_t FMPI2C_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_FMPI2C_CLKSOURCE(FMPI2CxSource)); + + if (FMPI2CxSource == LL_RCC_FMPI2C1_CLKSOURCE) + { + /* FMPI2C1 CLK clock frequency */ + switch (LL_RCC_GetFMPI2CClockSource(FMPI2CxSource)) + { + case LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK: /* FMPI2C1 Clock is System Clock */ + FMPI2C_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_FMPI2C1_CLKSOURCE_HSI: /* FMPI2C1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady()) + { + FMPI2C_frequency = HSI_VALUE; + } + break; + + case LL_RCC_FMPI2C1_CLKSOURCE_PCLK1: /* FMPI2C1 Clock is PCLK1 */ + default: + FMPI2C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } + + return FMPI2C_frequency; +} +#endif /* FMPI2C1 */ + +/** + * @brief Return I2Sx clock frequency + * @param I2SxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE + * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval I2S clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource) +{ + uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource)); + + if (I2SxSource == LL_RCC_I2S1_CLKSOURCE) + { + /* I2S1 CLK clock frequency */ + switch (LL_RCC_GetI2SClockSource(I2SxSource)) + { +#if defined(RCC_PLLI2S_SUPPORT) + case LL_RCC_I2S1_CLKSOURCE_PLLI2S: /* I2S1 Clock is PLLI2S */ + if (LL_RCC_PLLI2S_IsReady()) + { + i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S(); + } + break; +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC) + case LL_RCC_I2S1_CLKSOURCE_PLL: /* I2S1 Clock is PLL */ + if (LL_RCC_PLL_IsReady()) + { + i2s_frequency = RCC_PLL_GetFreqDomain_I2S(); + } + break; + + case LL_RCC_I2S1_CLKSOURCE_PLLSRC: /* I2S1 Clock is PLL Main source */ + switch (LL_RCC_PLL_GetMainSource()) + { + case LL_RCC_PLLSOURCE_HSE: /* I2S1 Clock is HSE Osc. */ + if (LL_RCC_HSE_IsReady()) + { + i2s_frequency = HSE_VALUE; + } + break; + + case LL_RCC_PLLSOURCE_HSI: /* I2S1 Clock is HSI Osc. */ + default: + if (LL_RCC_HSI_IsReady()) + { + i2s_frequency = HSI_VALUE; + } + break; + } + break; +#endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */ + + case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */ + default: + i2s_frequency = EXTERNAL_CLOCK_VALUE; + break; + } + } +#if defined(RCC_DCKCFGR_I2S2SRC) + else + { + /* I2S2 CLK clock frequency */ + switch (LL_RCC_GetI2SClockSource(I2SxSource)) + { + case LL_RCC_I2S2_CLKSOURCE_PLLI2S: /* I2S2 Clock is PLLI2S */ + if (LL_RCC_PLLI2S_IsReady()) + { + i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S(); + } + break; + + case LL_RCC_I2S2_CLKSOURCE_PLL: /* I2S2 Clock is PLL */ + if (LL_RCC_PLL_IsReady()) + { + i2s_frequency = RCC_PLL_GetFreqDomain_I2S(); + } + break; + + case LL_RCC_I2S2_CLKSOURCE_PLLSRC: /* I2S2 Clock is PLL Main source */ + switch (LL_RCC_PLL_GetMainSource()) + { + case LL_RCC_PLLSOURCE_HSE: /* I2S2 Clock is HSE Osc. */ + if (LL_RCC_HSE_IsReady()) + { + i2s_frequency = HSE_VALUE; + } + break; + + case LL_RCC_PLLSOURCE_HSI: /* I2S2 Clock is HSI Osc. */ + default: + if (LL_RCC_HSI_IsReady()) + { + i2s_frequency = HSI_VALUE; + } + break; + } + break; + + case LL_RCC_I2S2_CLKSOURCE_PIN: /* I2S2 Clock is External clock */ + default: + i2s_frequency = EXTERNAL_CLOCK_VALUE; + break; + } + } +#endif /* RCC_DCKCFGR_I2S2SRC */ + + return i2s_frequency; +} + +#if defined(LPTIM1) +/** + * @brief Return LPTIMx clock frequency + * @param LPTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE + * @retval LPTIM clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready + */ +uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource) +{ + uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource)); + + if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE) + { + /* LPTIM1CLK clock frequency */ + switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource)) + { + case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */ + if (LL_RCC_LSI_IsReady()) + { + lptim_frequency = LSI_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */ + if (LL_RCC_HSI_IsReady()) + { + lptim_frequency = HSI_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady()) + { + lptim_frequency = LSE_VALUE; + } + break; + + case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */ + default: + lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } + + return lptim_frequency; +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Return SAIx clock frequency + * @param SAIxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval SAI clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource) +{ + uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource)); + +#if defined(RCC_DCKCFGR_SAI1SRC) + if ((SAIxSource == LL_RCC_SAI1_CLKSOURCE) || (SAIxSource == LL_RCC_SAI2_CLKSOURCE)) + { + /* SAI1CLK clock frequency */ + switch (LL_RCC_GetSAIClockSource(SAIxSource)) + { + case LL_RCC_SAI1_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 clock source */ + case LL_RCC_SAI2_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI2 clock source */ + if (LL_RCC_PLLSAI_IsReady()) + { + sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI(); + } + break; + + case LL_RCC_SAI1_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 clock source */ + case LL_RCC_SAI2_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI2 clock source */ + if (LL_RCC_PLLI2S_IsReady()) + { + sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI(); + } + break; + + case LL_RCC_SAI1_CLKSOURCE_PLL: /* PLL clock used as SAI1 clock source */ + case LL_RCC_SAI2_CLKSOURCE_PLL: /* PLL clock used as SAI2 clock source */ + if (LL_RCC_PLL_IsReady()) + { + sai_frequency = RCC_PLL_GetFreqDomain_SAI(); + } + break; + + case LL_RCC_SAI2_CLKSOURCE_PLLSRC: + switch (LL_RCC_PLL_GetMainSource()) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI2 clock source */ + if (LL_RCC_HSE_IsReady()) + { + sai_frequency = HSE_VALUE; + } + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI2 clock source */ + default: + if (LL_RCC_HSI_IsReady()) + { + sai_frequency = HSI_VALUE; + } + break; + } + break; + + case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */ + default: + sai_frequency = EXTERNAL_CLOCK_VALUE; + break; + } + } +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI1ASRC) + if ((SAIxSource == LL_RCC_SAI1_A_CLKSOURCE) || (SAIxSource == LL_RCC_SAI1_B_CLKSOURCE)) + { + /* SAI1CLK clock frequency */ + switch (LL_RCC_GetSAIClockSource(SAIxSource)) + { +#if defined(RCC_PLLSAI_SUPPORT) + case LL_RCC_SAI1_A_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block A clock source */ + case LL_RCC_SAI1_B_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block B clock source */ + if (LL_RCC_PLLSAI_IsReady()) + { + sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI(); + } + break; +#endif /* RCC_PLLSAI_SUPPORT */ + + case LL_RCC_SAI1_A_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block A clock source */ + case LL_RCC_SAI1_B_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block B clock source */ + if (LL_RCC_PLLI2S_IsReady()) + { + sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI(); + } + break; + +#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) + case LL_RCC_SAI1_A_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block A clock source */ + case LL_RCC_SAI1_B_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block B clock source */ + if (LL_RCC_PLL_IsReady()) + { + sai_frequency = RCC_PLL_GetFreqDomain_SAI(); + } + break; + + case LL_RCC_SAI1_A_CLKSOURCE_PLLSRC: + case LL_RCC_SAI1_B_CLKSOURCE_PLLSRC: + switch (LL_RCC_PLL_GetMainSource()) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI1 Block A or B clock source */ + if (LL_RCC_HSE_IsReady()) + { + sai_frequency = HSE_VALUE; + } + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI1 Block A or B clock source */ + default: + if (LL_RCC_HSI_IsReady()) + { + sai_frequency = HSI_VALUE; + } + break; + } + break; +#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ + + case LL_RCC_SAI1_A_CLKSOURCE_PIN: /* External input clock used as SAI1 Block A clock source */ + case LL_RCC_SAI1_B_CLKSOURCE_PIN: /* External input clock used as SAI1 Block B clock source */ + default: + sai_frequency = EXTERNAL_CLOCK_VALUE; + break; + } + } +#endif /* RCC_DCKCFGR_SAI1ASRC */ + + return sai_frequency; +} +#endif /* SAI1 */ + +#if defined(SDIO) +/** + * @brief Return SDIOx clock frequency + * @param SDIOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE + * @retval SDIO clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource) +{ + uint32_t SDIO_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_SDIO_CLKSOURCE(SDIOxSource)); + + if (SDIOxSource == LL_RCC_SDIO_CLKSOURCE) + { +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) + /* SDIOCLK clock frequency */ + switch (LL_RCC_GetSDIOClockSource(SDIOxSource)) + { + case LL_RCC_SDIO_CLKSOURCE_PLL48CLK: /* PLL48M clock used as SDIO clock source */ + switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE)) + { + case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */ + if (LL_RCC_PLL_IsReady()) + { + SDIO_frequency = RCC_PLL_GetFreqDomain_48M(); + } + break; + +#if defined(RCC_PLLSAI_SUPPORT) + case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */ + default: + if (LL_RCC_PLLSAI_IsReady()) + { + SDIO_frequency = RCC_PLLSAI_GetFreqDomain_48M(); + } + break; +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) + case LL_RCC_CK48M_CLKSOURCE_PLLI2S: /* PLLI2S clock used as 48Mhz domain clock */ + default: + if (LL_RCC_PLLI2S_IsReady()) + { + SDIO_frequency = RCC_PLLI2S_GetFreqDomain_48M(); + } + break; +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + } + break; + + case LL_RCC_SDIO_CLKSOURCE_SYSCLK: /* PLL clock used as SDIO clock source */ + default: + SDIO_frequency = RCC_GetSystemClockFreq(); + break; + } +#else + /* PLL clock used as 48Mhz domain clock */ + if (LL_RCC_PLL_IsReady()) + { + SDIO_frequency = RCC_PLL_GetFreqDomain_48M(); + } +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + } + + return SDIO_frequency; +} +#endif /* SDIO */ + +#if defined(RNG) +/** + * @brief Return RNGx clock frequency + * @param RNGxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE + * @retval RNG clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource) +{ + uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource)); + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) + /* RNGCLK clock frequency */ + switch (LL_RCC_GetRNGClockSource(RNGxSource)) + { +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) + case LL_RCC_RNG_CLKSOURCE_PLLI2S: /* PLLI2S clock used as RNG clock source */ + if (LL_RCC_PLLI2S_IsReady()) + { + rng_frequency = RCC_PLLI2S_GetFreqDomain_48M(); + } + break; +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_PLLSAI_SUPPORT) + case LL_RCC_RNG_CLKSOURCE_PLLSAI: /* PLLSAI clock used as RNG clock source */ + if (LL_RCC_PLLSAI_IsReady()) + { + rng_frequency = RCC_PLLSAI_GetFreqDomain_48M(); + } + break; +#endif /* RCC_PLLSAI_SUPPORT */ + + case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */ + default: + if (LL_RCC_PLL_IsReady()) + { + rng_frequency = RCC_PLL_GetFreqDomain_48M(); + } + break; + } +#else + /* PLL clock used as RNG clock source */ + if (LL_RCC_PLL_IsReady()) + { + rng_frequency = RCC_PLL_GetFreqDomain_48M(); + } +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + + return rng_frequency; +} +#endif /* RNG */ + +#if defined(CEC) +/** + * @brief Return CEC clock frequency + * @param CECxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE + * @retval CEC clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready + */ +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource) +{ + uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource)); + + /* CECCLK clock frequency */ + switch (LL_RCC_GetCECClockSource(CECxSource)) + { + case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */ + if (LL_RCC_LSE_IsReady()) + { + cec_frequency = LSE_VALUE; + } + break; + + case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */ + default: + if (LL_RCC_HSI_IsReady()) + { + cec_frequency = HSI_VALUE/488U; + } + break; + } + + return cec_frequency; +} +#endif /* CEC */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Return USBx clock frequency + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval USB clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource) +{ + uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource)); + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) + /* USBCLK clock frequency */ + switch (LL_RCC_GetUSBClockSource(USBxSource)) + { +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) + case LL_RCC_USB_CLKSOURCE_PLLI2S: /* PLLI2S clock used as USB clock source */ + if (LL_RCC_PLLI2S_IsReady()) + { + usb_frequency = RCC_PLLI2S_GetFreqDomain_48M(); + } + break; + +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_PLLSAI_SUPPORT) + case LL_RCC_USB_CLKSOURCE_PLLSAI: /* PLLSAI clock used as USB clock source */ + if (LL_RCC_PLLSAI_IsReady()) + { + usb_frequency = RCC_PLLSAI_GetFreqDomain_48M(); + } + break; +#endif /* RCC_PLLSAI_SUPPORT */ + + case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */ + default: + if (LL_RCC_PLL_IsReady()) + { + usb_frequency = RCC_PLL_GetFreqDomain_48M(); + } + break; + } +#else + /* PLL clock used as USB clock source */ + if (LL_RCC_PLL_IsReady()) + { + usb_frequency = RCC_PLL_GetFreqDomain_48M(); + } +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + + return usb_frequency; +} +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#if defined(DFSDM1_Channel0) +/** + * @brief Return DFSDMx clock frequency + * @param DFSDMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval DFSDM clock frequency (in Hz) + */ +uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource) +{ + uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource)); + + if (DFSDMxSource == LL_RCC_DFSDM1_CLKSOURCE) + { + /* DFSDM1CLK clock frequency */ + switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource)) + { + case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: /* DFSDM1 Clock is SYSCLK */ + dfsdm_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: /* DFSDM1 Clock is PCLK2 */ + default: + dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#if defined(DFSDM2_Channel0) + else + { + /* DFSDM2CLK clock frequency */ + switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource)) + { + case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK: /* DFSDM2 Clock is SYSCLK */ + dfsdm_frequency = RCC_GetSystemClockFreq(); + break; + + case LL_RCC_DFSDM2_CLKSOURCE_PCLK2: /* DFSDM2 Clock is PCLK2 */ + default: + dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq())); + break; + } + } +#endif /* DFSDM2_Channel0 */ + + return dfsdm_frequency; +} + +/** + * @brief Return DFSDMx Audio clock frequency + * @param DFSDMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval DFSDM clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource) +{ + uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource)); + + if (DFSDMxSource == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) + { + /* DFSDM1CLK clock frequency */ + switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource)) + { + case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM1 clock */ + dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE); + break; + + case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM1 clock */ + default: + dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE); + break; + } + } +#if defined(DFSDM2_Channel0) + else + { + /* DFSDM2CLK clock frequency */ + switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource)) + { + case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM2 clock */ + dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE); + break; + + case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM2 clock */ + default: + dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE); + break; + } + } +#endif /* DFSDM2_Channel0 */ + + return dfsdm_frequency; +} +#endif /* DFSDM1_Channel0 */ + +#if defined(DSI) +/** + * @brief Return DSI clock frequency + * @param DSIxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE + * @retval DSI clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used + */ +uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource) +{ + uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource)); + + /* DSICLK clock frequency */ + switch (LL_RCC_GetDSIClockSource(DSIxSource)) + { + case LL_RCC_DSI_CLKSOURCE_PLL: /* DSI Clock is PLL Osc. */ + if (LL_RCC_PLL_IsReady()) + { + dsi_frequency = RCC_PLL_GetFreqDomain_DSI(); + } + break; + + case LL_RCC_DSI_CLKSOURCE_PHY: /* DSI Clock is DSI physical clock. */ + default: + dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA; + break; + } + + return dsi_frequency; +} +#endif /* DSI */ + +#if defined(LTDC) +/** + * @brief Return LTDC clock frequency + * @param LTDCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LTDC_CLKSOURCE + * @retval LTDC clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready + */ +uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource) +{ + uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource)); + + if (LL_RCC_PLLSAI_IsReady()) + { + ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC(); + } + + return ltdc_frequency; +} +#endif /* LTDC */ + +#if defined(SPDIFRX) +/** + * @brief Return SPDIFRX clock frequency + * @param SPDIFRXxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE + * @retval SPDIFRX clock frequency (in Hz) + * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready + */ +uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource) +{ + uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO; + + /* Check parameter */ + assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource)); + + /* SPDIFRX1CLK clock frequency */ + switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource)) + { + case LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S: /* SPDIFRX Clock is PLLI2S Osc. */ + if (LL_RCC_PLLI2S_IsReady()) + { + spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX(); + } + break; + + case LL_RCC_SPDIFRX1_CLKSOURCE_PLL: /* SPDIFRX Clock is PLL Osc. */ + default: + if (LL_RCC_PLL_IsReady()) + { + spdifrx_frequency = RCC_PLL_GetFreqDomain_SPDIFRX(); + } + break; + } + + return spdifrx_frequency; +} +#endif /* SPDIFRX */ + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup RCC_LL_Private_Functions + * @{ + */ + +/** + * @brief Return SYSTEM clock frequency + * @retval SYSTEM clock frequency (in Hz) + */ +uint32_t RCC_GetSystemClockFreq(void) +{ + uint32_t frequency = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (LL_RCC_GetSysClkSource()) + { + case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ + frequency = HSI_VALUE; + break; + + case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ + frequency = HSE_VALUE; + break; + + case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */ + frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLL); + break; + +#if defined(RCC_PLLR_SYSCLK_SUPPORT) + case LL_RCC_SYS_CLKSOURCE_STATUS_PLLR: /* PLLR used as system clock source */ + frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLLR); + break; +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ + + default: + frequency = HSI_VALUE; + break; + } + + return frequency; +} + +/** + * @brief Return HCLK clock frequency + * @param SYSCLK_Frequency SYSCLK clock frequency + * @retval HCLK clock frequency (in Hz) + */ +uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency) +{ + /* HCLK clock frequency */ + return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler()); +} + +/** + * @brief Return PCLK1 clock frequency + * @param HCLK_Frequency HCLK clock frequency + * @retval PCLK1 clock frequency (in Hz) + */ +uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency) +{ + /* PCLK1 clock frequency */ + return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler()); +} + +/** + * @brief Return PCLK2 clock frequency + * @param HCLK_Frequency HCLK clock frequency + * @retval PCLK2 clock frequency (in Hz) + */ +uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency) +{ + /* PCLK2 clock frequency */ + return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler()); +} + +/** + * @brief Return PLL clock frequency used for system domain + * @param SYSCLK_Source System clock source + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / (PLLP or PLLR) + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + + if (SYSCLK_Source == LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + plloutputfreq = __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP()); + } +#if defined(RCC_PLLR_SYSCLK_SUPPORT) + else + { + plloutputfreq = __LL_RCC_CALC_PLLRCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); + } +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ + + return plloutputfreq; +} + +/** + * @brief Return PLL clock frequency used for 48 MHz domain + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_48M(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN + 48M Domain clock = PLL_VCO / PLLQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ()); +} + +#if defined(DSI) +/** + * @brief Return PLL clock frequency used for DSI clock + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_DSI(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + DSICLK = PLL_VCO / PLLR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); +} +#endif /* DSI */ + +#if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC) +/** + * @brief Return PLL clock frequency used for I2S clock + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_I2S(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + I2SCLK = PLL_VCO / PLLR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); +} +#endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */ + +#if defined(SPDIFRX) +/** + * @brief Return PLL clock frequency used for SPDIFRX clock + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SPDIFRXCLK = PLL_VCO / PLLR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); +} +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Return PLL clock frequency used for SAI clock + * @retval PLL clock frequency (in Hz) + */ +uint32_t RCC_PLL_GetFreqDomain_SAI(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U; + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SAICLK = (PLL_VCO / PLLR) / PLLDIVR + or + SAICLK = PLL_VCO / PLLR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + +#if defined(RCC_DCKCFGR_PLLDIVR) + plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR(), LL_RCC_PLL_GetDIVR()); +#else + plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(), + LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR()); +#endif /* RCC_DCKCFGR_PLLDIVR */ + + return plloutputfreq; +} +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Return PLLSAI clock frequency used for SAI domain + * @retval PLLSAI clock frequency (in Hz) + */ +uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN + SAI domain clock = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(), + LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ()); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Return PLLSAI clock frequency used for 48Mhz domain + * @retval PLLSAI clock frequency (in Hz) + */ +uint32_t RCC_PLLSAI_GetFreqDomain_48M(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN + 48M Domain clock = PLLSAI_VCO / PLLSAIP + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(), + LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP()); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Return PLLSAI clock frequency used for LTDC domain + * @retval PLLSAI clock frequency (in Hz) + */ +uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN + LTDC Domain clock = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR + */ + pllsource = LL_RCC_PLL_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */ + pllinputfreq = HSI_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */ + pllinputfreq = HSE_VALUE; + break; + + default: + pllinputfreq = HSI_VALUE; + break; + } + return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(), + LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR()); +} +#endif /* LTDC */ +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) +#if defined(SAI1) +/** + * @brief Return PLLI2S clock frequency used for SAI domains + * @retval PLLI2S clock frequency (in Hz) + */ +uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void) +{ + uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U; + + /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN + SAI domain clock = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ + or + SAI domain clock = (PLLI2S_VCO / PLLI2SR) / PLLI2SDIVR + */ + plli2ssource = LL_RCC_PLLI2S_GetMainSource(); + + switch (plli2ssource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */ + plli2sinputfreq = HSE_VALUE; + break; + +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */ + plli2sinputfreq = EXTERNAL_CLOCK_VALUE; + break; +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */ + default: + plli2sinputfreq = HSI_VALUE; + break; + } + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) + plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(), + LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ()); +#else + plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(), + LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR(), LL_RCC_PLLI2S_GetDIVR()); +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + + return plli2soutputfreq; +} +#endif /* SAI1 */ + +#if defined(SPDIFRX) +/** + * @brief Return PLLI2S clock frequency used for SPDIFRX domain + * @retval PLLI2S clock frequency (in Hz) + */ +uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void) +{ + uint32_t pllinputfreq = 0U, pllsource = 0U; + + /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN + SPDIFRX Domain clock = PLLI2S_VCO / PLLI2SP + */ + pllsource = LL_RCC_PLLI2S_GetMainSource(); + + switch (pllsource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */ + pllinputfreq = HSE_VALUE; + break; + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */ + default: + pllinputfreq = HSI_VALUE; + break; + } + + return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLLI2S_GetDivider(), + LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP()); +} +#endif /* SPDIFRX */ + +/** + * @brief Return PLLI2S clock frequency used for I2S domain + * @retval PLLI2S clock frequency (in Hz) + */ +uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void) +{ + uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U; + + /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN + I2S Domain clock = PLLI2S_VCO / PLLI2SR + */ + plli2ssource = LL_RCC_PLLI2S_GetMainSource(); + + switch (plli2ssource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */ + plli2sinputfreq = HSE_VALUE; + break; + +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */ + plli2sinputfreq = EXTERNAL_CLOCK_VALUE; + break; +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */ + default: + plli2sinputfreq = HSI_VALUE; + break; + } + + plli2soutputfreq = __LL_RCC_CALC_PLLI2S_I2S_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(), + LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR()); + + return plli2soutputfreq; +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Return PLLI2S clock frequency used for 48Mhz domain + * @retval PLLI2S clock frequency (in Hz) + */ +uint32_t RCC_PLLI2S_GetFreqDomain_48M(void) +{ + uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U; + + /* PLL48M_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN + 48M Domain clock = PLLI2S_VCO / PLLI2SQ + */ + plli2ssource = LL_RCC_PLLI2S_GetMainSource(); + + switch (plli2ssource) + { + case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */ + plli2sinputfreq = HSE_VALUE; + break; + +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */ + plli2sinputfreq = EXTERNAL_CLOCK_VALUE; + break; +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ + + case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */ + default: + plli2sinputfreq = HSI_VALUE; + break; + } + + plli2soutputfreq = __LL_RCC_CALC_PLLI2S_48M_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(), + LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ()); + + return plli2soutputfreq; +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_PLLI2S_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rng.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rng.c new file mode 100644 index 0000000..b18a929 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rng.c @@ -0,0 +1,124 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rng.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief RNG LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_rng.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (RNG) + +/** @addtogroup RNG_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RNG_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RNG_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize RNG registers (Registers restored to their default values). + * @param RNGx RNG Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RNG registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_RNG_DeInit(RNG_TypeDef *RNGx) +{ + /* Check the parameters */ + assert_param(IS_RNG_ALL_INSTANCE(RNGx)); + +#if !defined (RCC_AHB2_SUPPORT) + /* Enable RNG reset state */ + LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_RNG); + + /* Release RNG from reset state */ + LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_RNG); +#else + /* Enable RNG reset state */ + LL_AHB2_GRP1_ForceReset(LL_AHB2_GRP1_PERIPH_RNG); + + /* Release RNG from reset state */ + LL_AHB2_GRP1_ReleaseReset(LL_AHB2_GRP1_PERIPH_RNG); +#endif + + return (SUCCESS); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (RNG) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rtc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rtc.c new file mode 100644 index 0000000..94e21ae --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_rtc.c @@ -0,0 +1,894 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rtc.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief RTC LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_rtc.h" +#include "stm32f4xx_ll_cortex.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RTC) + +/** @addtogroup RTC_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup RTC_LL_Private_Constants + * @{ + */ +/* Default values used for prescaler */ +#define RTC_ASYNCH_PRESC_DEFAULT 0x0000007FU +#define RTC_SYNCH_PRESC_DEFAULT 0x000000FFU + +/* Values used for timeout */ +#define RTC_INITMODE_TIMEOUT 1000U /* 1s when tick set to 1ms */ +#define RTC_SYNCHRO_TIMEOUT 1000U /* 1s when tick set to 1ms */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RTC_LL_Private_Macros + * @{ + */ + +#define IS_LL_RTC_HOURFORMAT(__VALUE__) (((__VALUE__) == LL_RTC_HOURFORMAT_24HOUR) \ + || ((__VALUE__) == LL_RTC_HOURFORMAT_AMPM)) + +#define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FU) + +#define IS_LL_RTC_SYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FFFU) + +#define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \ + || ((__VALUE__) == LL_RTC_FORMAT_BCD)) + +#define IS_LL_RTC_TIME_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_TIME_FORMAT_AM_OR_24) \ + || ((__VALUE__) == LL_RTC_TIME_FORMAT_PM)) + +#define IS_LL_RTC_HOUR12(__HOUR__) (((__HOUR__) > 0U) && ((__HOUR__) <= 12U)) +#define IS_LL_RTC_HOUR24(__HOUR__) ((__HOUR__) <= 23U) +#define IS_LL_RTC_MINUTES(__MINUTES__) ((__MINUTES__) <= 59U) +#define IS_LL_RTC_SECONDS(__SECONDS__) ((__SECONDS__) <= 59U) + +#define IS_LL_RTC_WEEKDAY(__VALUE__) (((__VALUE__) == LL_RTC_WEEKDAY_MONDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_TUESDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_WEDNESDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_THURSDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_FRIDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_SATURDAY) \ + || ((__VALUE__) == LL_RTC_WEEKDAY_SUNDAY)) + +#define IS_LL_RTC_DAY(__DAY__) (((__DAY__) >= 1U) && ((__DAY__) <= 31U)) + +#define IS_LL_RTC_MONTH(__VALUE__) (((__VALUE__) == LL_RTC_MONTH_JANUARY) \ + || ((__VALUE__) == LL_RTC_MONTH_FEBRUARY) \ + || ((__VALUE__) == LL_RTC_MONTH_MARCH) \ + || ((__VALUE__) == LL_RTC_MONTH_APRIL) \ + || ((__VALUE__) == LL_RTC_MONTH_MAY) \ + || ((__VALUE__) == LL_RTC_MONTH_JUNE) \ + || ((__VALUE__) == LL_RTC_MONTH_JULY) \ + || ((__VALUE__) == LL_RTC_MONTH_AUGUST) \ + || ((__VALUE__) == LL_RTC_MONTH_SEPTEMBER) \ + || ((__VALUE__) == LL_RTC_MONTH_OCTOBER) \ + || ((__VALUE__) == LL_RTC_MONTH_NOVEMBER) \ + || ((__VALUE__) == LL_RTC_MONTH_DECEMBER)) + +#define IS_LL_RTC_YEAR(__YEAR__) ((__YEAR__) <= 99U) + +#define IS_LL_RTC_ALMA_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMA_MASK_NONE) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_DATEWEEKDAY) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_HOURS) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_MINUTES) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_SECONDS) \ + || ((__VALUE__) == LL_RTC_ALMA_MASK_ALL)) + +#define IS_LL_RTC_ALMB_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMB_MASK_NONE) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_DATEWEEKDAY) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_HOURS) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_MINUTES) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_SECONDS) \ + || ((__VALUE__) == LL_RTC_ALMB_MASK_ALL)) + + +#define IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) || \ + ((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY)) + +#define IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) || \ + ((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY)) + + +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RTC_LL_Exported_Functions + * @{ + */ + +/** @addtogroup RTC_LL_EF_Init + * @{ + */ + +/** + * @brief De-Initializes the RTC registers to their default reset values. + * @note This function doesn't reset the RTC Clock source and RTC Backup Data + * registers. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are de-initialized + * - ERROR: RTC registers are not de-initialized + */ +ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx) +{ + ErrorStatus status = ERROR; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Reset TR, DR and CR registers */ + LL_RTC_WriteReg(RTCx, TR, 0x00000000U); +#if defined(RTC_WAKEUP_SUPPORT) + LL_RTC_WriteReg(RTCx, WUTR, RTC_WUTR_WUT); +#endif /* RTC_WAKEUP_SUPPORT */ + LL_RTC_WriteReg(RTCx, DR , (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0)); + /* Reset All CR bits except CR[2:0] */ +#if defined(RTC_WAKEUP_SUPPORT) + LL_RTC_WriteReg(RTCx, CR, (LL_RTC_ReadReg(RTCx, CR) & RTC_CR_WUCKSEL)); +#else + LL_RTC_WriteReg(RTCx, CR, 0x00000000U); +#endif /* RTC_WAKEUP_SUPPORT */ + LL_RTC_WriteReg(RTCx, PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT)); + LL_RTC_WriteReg(RTCx, ALRMAR, 0x00000000U); + LL_RTC_WriteReg(RTCx, ALRMBR, 0x00000000U); + LL_RTC_WriteReg(RTCx, SHIFTR, 0x00000000U); + LL_RTC_WriteReg(RTCx, CALR, 0x00000000U); + LL_RTC_WriteReg(RTCx, ALRMASSR, 0x00000000U); + LL_RTC_WriteReg(RTCx, ALRMBSSR, 0x00000000U); + + /* Reset ISR register and exit initialization mode */ + LL_RTC_WriteReg(RTCx, ISR, 0x00000000U); + + /* Reset Tamper and alternate functions configuration register */ + LL_RTC_WriteReg(RTCx, TAFCR, 0x00000000U); + + /* Wait till the RTC RSF flag is set */ + status = LL_RTC_WaitForSynchro(RTCx); + } + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Initializes the RTC registers according to the specified parameters + * in RTC_InitStruct. + * @param RTCx RTC Instance + * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains + * the configuration information for the RTC peripheral. + * @note The RTC Prescaler register is write protected and can be written in + * initialization mode only. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are initialized + * - ERROR: RTC registers are not initialized + */ +ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat)); + assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler)); + assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Set Hour Format */ + LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat); + + /* Configure Synchronous and Asynchronous prescaler factor */ + LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler); + LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler); + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + status = SUCCESS; + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_InitTypeDef field to default value. + * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct) +{ + /* Set RTC_InitStruct fields to default values */ + RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR; + RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT; + RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT; +} + +/** + * @brief Set the RTC current time. + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains + * the time configuration information for the RTC. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Time register is configured + * - ERROR: RTC Time register is not configured + */ +ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); + } + else + { + RTC_TimeStruct->TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds)); + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat)); + } + else + { + RTC_TimeStruct->TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours))); + } + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds))); + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Check the input parameters format */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours, + RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds); + } + else + { + LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds)); + } + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTC); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) + { + status = LL_RTC_WaitForSynchro(RTCx); + } + else + { + status = SUCCESS; + } + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec). + * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct) +{ + /* Time = 00h:00min:00sec */ + RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24; + RTC_TimeStruct->Hours = 0U; + RTC_TimeStruct->Minutes = 0U; + RTC_TimeStruct->Seconds = 0U; +} + +/** + * @brief Set the RTC current date. + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains + * the date configuration information for the RTC. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC Day register is configured + * - ERROR: RTC Day register is not configured + */ +ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + + if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U)) + { + RTC_DateStruct->Month = (RTC_DateStruct->Month & (uint32_t)~(0x10U)) + 0x0AU; + } + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year)); + assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month)); + assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day)); + } + else + { + assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year))); + assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month))); + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day))); + } + assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay)); + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Set Initialization mode */ + if (LL_RTC_EnterInitMode(RTCx) != ERROR) + { + /* Check the input parameters format */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year); + } + else + { + LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day), + __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year)); + } + + /* Exit Initialization mode */ + LL_RTC_DisableInitMode(RTC); + + /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */ + if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U) + { + status = LL_RTC_WaitForSynchro(RTCx); + } + else + { + status = SUCCESS; + } + } + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return status; +} + +/** + * @brief Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00) + * @param RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct) +{ + /* Monday, January 01 xx00 */ + RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY; + RTC_DateStruct->Day = 1U; + RTC_DateStruct->Month = LL_RTC_MONTH_JANUARY; + RTC_DateStruct->Year = 0U; +} + +/** + * @brief Set the RTC Alarm A. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (Use @ref LL_RTC_ALMA_Disable function). + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that + * contains the alarm configuration parameters. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ALARMA registers are configured + * - ERROR: ALARMA registers are not configured + */ +ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask)); + assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + } + + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Select weekday selection */ + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) + { + /* Set the date for ALARM */ + LL_RTC_ALMA_DisableWeekday(RTCx); + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + else + { + LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + /* Set the week day for ALARM */ + LL_RTC_ALMA_EnableWeekday(RTCx); + LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + + /* Configure the Alarm register */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, + RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); + } + else + { + LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); + } + /* Set ALARM mask */ + LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return SUCCESS; +} + +/** + * @brief Set the RTC Alarm B. + * @note The Alarm register can only be written when the corresponding Alarm + * is disabled (@ref LL_RTC_ALMB_Disable function). + * @param RTCx RTC Instance + * @param RTC_Format This parameter can be one of the following values: + * @arg @ref LL_RTC_FORMAT_BIN + * @arg @ref LL_RTC_FORMAT_BCD + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that + * contains the alarm configuration parameters. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: ALARMB registers are configured + * - ERROR: ALARMB registers are not configured + */ +ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Check the parameters */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + assert_param(IS_LL_RTC_FORMAT(RTC_Format)); + assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask)); + assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel)); + + if (RTC_Format == LL_RTC_FORMAT_BIN) + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours)); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours)); + } + assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes)); + assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds)); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR) + { + assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat)); + } + else + { + RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U; + assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours))); + } + + assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes))); + assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))); + + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + else + { + assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay))); + } + } + + /* Disable the write protection for RTC registers */ + LL_RTC_DisableWriteProtection(RTCx); + + /* Select weekday selection */ + if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) + { + /* Set the date for ALARM */ + LL_RTC_ALMB_DisableWeekday(RTCx); + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + else + { + LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay)); + } + } + else + { + /* Set the week day for ALARM */ + LL_RTC_ALMB_EnableWeekday(RTCx); + LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay); + } + + /* Configure the Alarm register */ + if (RTC_Format != LL_RTC_FORMAT_BIN) + { + LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours, + RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds); + } + else + { + LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes), + __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds)); + } + /* Set ALARM mask */ + LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask); + + /* Enable the write protection for RTC registers */ + LL_RTC_EnableWriteProtection(RTCx); + + return SUCCESS; +} + +/** + * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / + * Day = 1st day of the month/Mask = all fields are masked). + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM; + RTC_AlarmStruct->AlarmTime.Hours = 0U; + RTC_AlarmStruct->AlarmTime.Minutes = 0U; + RTC_AlarmStruct->AlarmTime.Seconds = 0U; + + /* Alarm Day Settings : Day = 1st day of the month */ + RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE; + RTC_AlarmStruct->AlarmDateWeekDay = 1U; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->AlarmMask = LL_RTC_ALMA_MASK_NONE; +} + +/** + * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec / + * Day = 1st day of the month/Mask = all fields are masked). + * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized. + * @retval None + */ +void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM; + RTC_AlarmStruct->AlarmTime.Hours = 0U; + RTC_AlarmStruct->AlarmTime.Minutes = 0U; + RTC_AlarmStruct->AlarmTime.Seconds = 0U; + + /* Alarm Day Settings : Day = 1st day of the month */ + RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; + RTC_AlarmStruct->AlarmDateWeekDay = 1U; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->AlarmMask = LL_RTC_ALMB_MASK_NONE; +} + +/** + * @brief Enters the RTC Initialization mode. + * @note The RTC Initialization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC is in Init mode + * - ERROR: RTC is not in Init mode + */ +ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx) +{ + __IO uint32_t timeout = RTC_INITMODE_TIMEOUT; + ErrorStatus status = SUCCESS; + uint32_t tmp = 0U; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Check if the Initialization mode is set */ + if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U) + { + /* Set the Initialization mode */ + LL_RTC_EnableInitMode(RTCx); + + /* Wait till RTC is in INIT state and if Time out is reached exit */ + tmp = LL_RTC_IsActiveFlag_INIT(RTCx); + while ((timeout != 0U) && (tmp != 1U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout --; + } + tmp = LL_RTC_IsActiveFlag_INIT(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + } + return status; +} + +/** + * @brief Exit the RTC Initialization mode. + * @note When the initialization sequence is complete, the calendar restarts + * counting after 4 RTCCLK cycles. + * @note The RTC Initialization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC exited from in Init mode + * - ERROR: Not applicable + */ +ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx) +{ + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Disable initialization mode */ + LL_RTC_DisableInitMode(RTCx); + + return SUCCESS; +} + +/** + * @brief Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are + * synchronized with RTC APB clock. + * @note The RTC Resynchronization mode is write protected, use the + * @ref LL_RTC_DisableWriteProtection before calling this function. + * @note To read the calendar through the shadow registers after Calendar + * initialization, calendar update or after wakeup from low power modes + * the software must first clear the RSF flag. + * The software must then wait until it is set again before reading + * the calendar, which means that the calendar registers have been + * correctly copied into the RTC_TR and RTC_DR shadow registers. + * @param RTCx RTC Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: RTC registers are synchronised + * - ERROR: RTC registers are not synchronised + */ +ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx) +{ + __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT; + ErrorStatus status = SUCCESS; + uint32_t tmp = 0U; + + /* Check the parameter */ + assert_param(IS_RTC_ALL_INSTANCE(RTCx)); + + /* Clear RSF flag */ + LL_RTC_ClearFlag_RS(RTCx); + + /* Wait the registers to be synchronised */ + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + while ((timeout != 0U) && (tmp != 0U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout--; + } + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + + if (status != ERROR) + { + timeout = RTC_SYNCHRO_TIMEOUT; + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + while ((timeout != 0U) && (tmp != 1U)) + { + if (LL_SYSTICK_IsActiveCounterFlag() == 1U) + { + timeout--; + } + tmp = LL_RTC_IsActiveFlag_RS(RTCx); + if (timeout == 0U) + { + status = ERROR; + } + } + } + + return (status); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RTC) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c index f4acb79..5d1f187 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_ll_sdmmc.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief SDMMC Low Layer HAL module driver. * * This file provides firmware functions to manage the following @@ -17,11 +17,11 @@ ============================================================================== ##### SDMMC peripheral features ##### ============================================================================== - [..] The SD/SDIO MMC card host interface (SDIO) provides an interface between the APB2 - peripheral bus and MultiMedia cards (MMCs), SD memory cards, SDIO cards and CE-ATA + [..] The SD/SDMMC MMC card host interface (SDMMC) provides an interface between the APB2 + peripheral bus and MultiMedia cards (MMCs), SD memory cards, SDMMC cards and CE-ATA devices. - - [..] The SDIO features include the following: + + [..] The SDMMC features include the following: (+) Full compliance with MultiMedia Card System Specification Version 4.2. Card support for three different databus modes: 1-bit (default), 4-bit and 8-bit (+) Full compatibility with previous versions of MultiMedia Cards (forward compatibility) @@ -38,34 +38,34 @@ ============================================================================== [..] This driver is a considered as a driver of service for external devices drivers - that interfaces with the SDIO peripheral. - According to the device used (SD card/ MMC card / SDIO card ...), a set of APIs - is used in the device's driver to perform SDIO operations and functionalities. + that interfaces with the SDMMC peripheral. + According to the device used (SD card/ MMC card / SDMMC card ...), a set of APIs + is used in the device's driver to perform SDMMC operations and functionalities. This driver is almost transparent for the final user, it is only used to implement other functionalities of the external device. [..] - (+) The SDIO clock (SDIOCLK = 48 MHz) is coming from a specific output of PLL - (PLL48CLK). Before start working with SDIO peripheral make sure that the + (+) The SDMMC clock (SDMMCCLK = 48 MHz) is coming from a specific output of PLL + (PLL48CLK). Before start working with SDMMC peripheral make sure that the PLL is well configured. - The SDIO peripheral uses two clock signals: - (++) SDIO adapter clock (SDIOCLK = 48 MHz) + The SDMMC peripheral uses two clock signals: + (++) SDMMC adapter clock (SDMMCCLK = 48 MHz) (++) APB2 bus clock (PCLK2) - -@@- PCLK2 and SDIO_CK clock frequencies must respect the following condition: - Frequency(PCLK2) >= (3 / 8 x Frequency(SDIO_CK)) + -@@- PCLK2 and SDMMC_CK clock frequencies must respect the following condition: + Frequency(PCLK2) >= (3 / 8 x Frequency(SDMMC_CK)) - (+) Enable/Disable peripheral clock using RCC peripheral macros related to SDIO + (+) Enable/Disable peripheral clock using RCC peripheral macros related to SDMMC peripheral. (+) Enable the Power ON State using the SDIO_PowerState_ON(SDIOx) - function and disable it using the function SDIO_PowerState_OFF(SDIOx). + function and disable it using the function SDIO_PowerState_ON(SDIOx). (+) Enable/Disable the clock using the __SDIO_ENABLE()/__SDIO_DISABLE() macros. - (+) Enable/Disable the peripheral interrupts using the macros __SDIO_ENABLE_IT(hsdio, IT) - and __SDIO_DISABLE_IT(hsdio, IT) if you need to use interrupt mode. + (+) Enable/Disable the peripheral interrupts using the macros __SDIO_ENABLE_IT(hSDIO, IT) + and __SDIO_DISABLE_IT(hSDIO, IT) if you need to use interrupt mode. (+) When using the DMA mode (++) Configure the DMA in the MSP layer of the external device @@ -74,7 +74,7 @@ __SDIO_DMA_DISABLE(). (+) To control the CPSM (Command Path State Machine) and send - commands to the card use the SDIO_SendCommand(SDIOx), + commands to the card use the SDIO_SendCommand(), SDIO_GetCommandResponse() and SDIO_GetResponse() functions. First, user has to fill the command structure (pointer to SDIO_CmdInitTypeDef) according to the selected command to be sent. @@ -87,12 +87,12 @@ -@@- To check if the command is well received, read the SDIO_CMDRESP register using the SDIO_GetCommandResponse(). - The SDIO responses registers (SDIO_RESP1 to SDIO_RESP2), use the + The SDMMC responses registers (SDIO_RESP1 to SDIO_RESP2), use the SDIO_GetResponse() function. (+) To control the DPSM (Data Path State Machine) and send/receive - data to/from the card use the SDIO_DataConfig(), SDIO_GetDataCounter(), - SDIO_ReadFIFO(), DIO_WriteFIFO() and SDIO_GetFIFOCount() functions. + data to/from the card use the SDIO_ConfigData(), SDIO_GetDataCounter(), + SDIO_ReadFIFO(), SDIO_WriteFIFO() and SDIO_GetFIFOCount() functions. *** Read Operations *** ======================= @@ -100,14 +100,14 @@ (#) First, user has to fill the data structure (pointer to SDIO_DataInitTypeDef) according to the selected data type to be received. The parameters that should be filled are: - (++) Data Timeout + (++) Data TimeOut (++) Data Length (++) Data Block size - (++) Data Transfer direction: should be from card (To SDIO) + (++) Data Transfer direction: should be from card (To SDMMC) (++) Data Transfer mode (++) DPSM Status (Enable or Disable) - (#) Configure the SDIO resources to receive the data from the card + (#) Configure the SDMMC resources to receive the data from the card according to selected transfer mode (Refer to Step 8, 9 and 10). (#) Send the selected Read command (refer to step 11). @@ -120,25 +120,34 @@ (#) First, user has to fill the data structure (pointer to SDIO_DataInitTypeDef) according to the selected data type to be received. The parameters that should be filled are: - (++) Data Timeout + (++) Data TimeOut (++) Data Length (++) Data Block size (++) Data Transfer direction: should be to card (To CARD) (++) Data Transfer mode (++) DPSM Status (Enable or Disable) - (#) Configure the SDIO resources to send the data to the card according to + (#) Configure the SDMMC resources to send the data to the card according to selected transfer mode. (#) Send the selected Write command. (#) Use the SDIO flags/interrupts to check the transfer status. + + *** Command management operations *** + ===================================== + [..] + (#) The commands used for Read/Write/Erase operations are managed in + separate functions. + Each function allows to send the needed command with the related argument, + then check the response. + By the same approach, you could implement a command and check the response. @endverbatim ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -173,7 +182,7 @@ */ /** @defgroup SDMMC_LL SDMMC Low Layer - * @brief Low layer module for SD and MMC driver + * @brief Low layer module for SD * @{ */ @@ -183,18 +192,26 @@ defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ +static uint32_t SDMMC_GetCmdError(SDIO_TypeDef *SDIOx); +static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint32_t Timeout); +static uint32_t SDMMC_GetCmdResp2(SDIO_TypeDef *SDIOx); +static uint32_t SDMMC_GetCmdResp3(SDIO_TypeDef *SDIOx); +static uint32_t SDMMC_GetCmdResp7(SDIO_TypeDef *SDIOx); +static uint32_t SDMMC_GetCmdResp6(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint16_t *pRCA); + +/* Exported functions --------------------------------------------------------*/ -/** @defgroup SDMMC_LL_Exported_Functions SDMMC_LL Exported Functions +/** @defgroup SDMMC_LL_Exported_Functions SDMMC Low Layer Exported Functions * @{ */ -/** @defgroup HAL_SDMMC_LL_Group1 Initialization/de-initialization functions +/** @defgroup HAL_SDMMC_LL_Group1 Initialization de-initialization functions * @brief Initialization and Configuration functions * @verbatim @@ -208,15 +225,15 @@ */ /** - * @brief Initializes the SDIO according to the specified - * parameters in the SDIO_InitTypeDef and create the associated handle. - * @param SDIOx: Pointer to SDIO register base - * @param Init: SDIO initialization structure + * @brief Initializes the SDMMC according to the specified + * parameters in the SDMMC_InitTypeDef and create the associated handle. + * @param SDIOx: Pointer to SDMMC register base + * @param Init: SDMMC initialization structure * @retval HAL status */ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) { - uint32_t tmpreg = 0U; + uint32_t tmpreg = 0U; /* Check the parameters */ assert_param(IS_SDIO_ALL_INSTANCE(SDIOx)); @@ -227,7 +244,7 @@ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(Init.HardwareFlowControl)); assert_param(IS_SDIO_CLKDIV(Init.ClockDiv)); - /* Set SDIO configuration parameters */ + /* Set SDMMC configuration parameters */ tmpreg |= (Init.ClockEdge |\ Init.ClockBypass |\ Init.ClockPowerSave |\ @@ -236,17 +253,18 @@ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) Init.ClockDiv ); - /* Write to SDIO CLKCR */ + /* Write to SDMMC CLKCR */ MODIFY_REG(SDIOx->CLKCR, CLKCR_CLEAR_MASK, tmpreg); return HAL_OK; } + /** * @} */ -/** @defgroup HAL_SDMMC_LL_Group2 I/O operation functions +/** @defgroup HAL_SDMMC_LL_Group2 IO operation functions * @brief Data transfers functions * @verbatim @@ -254,7 +272,7 @@ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) ##### I/O operation functions ##### =============================================================================== [..] - This subsection provides a set of functions allowing to manage the SDIO data + This subsection provides a set of functions allowing to manage the SDMMC data transfers. @endverbatim @@ -263,7 +281,7 @@ HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) /** * @brief Read data (word) from Rx FIFO in blocking mode (polling) - * @param SDIOx: Pointer to SDIO register base + * @param SDIOx: Pointer to SDMMC register base * @retval HAL status */ uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx) @@ -274,7 +292,7 @@ uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx) /** * @brief Write data (word) to Tx FIFO in blocking mode (polling) - * @param SDIOx: Pointer to SDIO register base + * @param SDIOx: Pointer to SDMMC register base * @param pWriteData: pointer to data to write * @retval HAL status */ @@ -298,7 +316,7 @@ HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData) ##### Peripheral Control functions ##### =============================================================================== [..] - This subsection provides a set of functions allowing to control the SDIO data + This subsection provides a set of functions allowing to control the SDMMC data transfers. @endverbatim @@ -306,8 +324,8 @@ HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData) */ /** - * @brief Set SDIO Power state to ON. - * @param SDIOx: Pointer to SDIO register base + * @brief Set SDMMC Power state to ON. + * @param SDIOx: Pointer to SDMMC register base * @retval HAL status */ HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx) @@ -315,25 +333,25 @@ HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx) /* Set power state to ON */ SDIOx->POWER = SDIO_POWER_PWRCTRL; - return HAL_OK; + return HAL_OK; } /** - * @brief Set SDIO Power state to OFF. - * @param SDIOx: Pointer to SDIO register base + * @brief Set SDMMC Power state to OFF. + * @param SDIOx: Pointer to SDMMC register base * @retval HAL status */ HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx) { /* Set power state to OFF */ - SDIOx->POWER = (uint32_t)0x00000000U; + SDIOx->POWER = 0x00000000U; return HAL_OK; } /** - * @brief Get SDIO Power state. - * @param SDIOx: Pointer to SDIO register base + * @brief Get SDMMC Power state. + * @param SDIOx: Pointer to SDMMC register base * @retval Power status of the controller. The returned value can be one of the * following values: * - 0x00: Power OFF @@ -346,33 +364,33 @@ uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx) } /** - * @brief Configure the SDIO command path according to the specified parameters in + * @brief Configure the SDMMC command path according to the specified parameters in * SDIO_CmdInitTypeDef structure and send the command - * @param SDIOx: Pointer to SDIO register base - * @param SDIO_CmdInitStruct: pointer to a SDIO_CmdInitTypeDef structure that contains - * the configuration information for the SDIO command + * @param SDIOx: Pointer to SDMMC register base + * @param Command: pointer to a SDIO_CmdInitTypeDef structure that contains + * the configuration information for the SDMMC command * @retval HAL status */ -HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *Command) { uint32_t tmpreg = 0U; /* Check the parameters */ - assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->CmdIndex)); - assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->Response)); - assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->WaitForInterrupt)); - assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->CPSM)); + assert_param(IS_SDIO_CMD_INDEX(Command->CmdIndex)); + assert_param(IS_SDIO_RESPONSE(Command->Response)); + assert_param(IS_SDIO_WAIT(Command->WaitForInterrupt)); + assert_param(IS_SDIO_CPSM(Command->CPSM)); - /* Set the SDIO Argument value */ - SDIOx->ARG = SDIO_CmdInitStruct->Argument; + /* Set the SDMMC Argument value */ + SDIOx->ARG = Command->Argument; - /* Set SDIO command parameters */ - tmpreg |= (uint32_t)(SDIO_CmdInitStruct->CmdIndex |\ - SDIO_CmdInitStruct->Response |\ - SDIO_CmdInitStruct->WaitForInterrupt |\ - SDIO_CmdInitStruct->CPSM); + /* Set SDMMC command parameters */ + tmpreg |= (uint32_t)(Command->CmdIndex |\ + Command->Response |\ + Command->WaitForInterrupt |\ + Command->CPSM); - /* Write to SDIO CMD register */ + /* Write to SDMMC CMD register */ MODIFY_REG(SDIOx->CMD, CMD_CLEAR_MASK, tmpreg); return HAL_OK; @@ -380,7 +398,7 @@ HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDI /** * @brief Return the command index of last command for which response received - * @param SDIOx: Pointer to SDIO register base + * @param SDIOx: Pointer to SDMMC register base * @retval Command index of the last command response received */ uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx) @@ -391,59 +409,60 @@ uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx) /** * @brief Return the response received from the card for the last command - * @param SDIO_RESP: Specifies the SDIO response register. + * @param SDIOx: Pointer to SDMMC register base + * @param Response: Specifies the SDMMC response register. * This parameter can be one of the following values: * @arg SDIO_RESP1: Response Register 1 - * @arg SDIO_RESP2: Response Register 2 - * @arg SDIO_RESP3: Response Register 3 - * @arg SDIO_RESP4: Response Register 4 + * @arg SDIO_RESP1: Response Register 2 + * @arg SDIO_RESP1: Response Register 3 + * @arg SDIO_RESP1: Response Register 4 * @retval The Corresponding response register value */ -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +uint32_t SDIO_GetResponse(SDIO_TypeDef *SDIOx, uint32_t Response) { __IO uint32_t tmp = 0U; /* Check the parameters */ - assert_param(IS_SDIO_RESP(SDIO_RESP)); - + assert_param(IS_SDIO_RESP(Response)); + /* Get the response */ - tmp = SDIO_RESP_ADDR + SDIO_RESP; + tmp = (uint32_t)&(SDIOx->RESP1) + Response; return (*(__IO uint32_t *) tmp); } /** - * @brief Configure the SDIO data path according to the specified + * @brief Configure the SDMMC data path according to the specified * parameters in the SDIO_DataInitTypeDef. - * @param SDIOx: Pointer to SDIO register base - * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure - * that contains the configuration information for the SDIO command. + * @param SDIOx: Pointer to SDMMC register base + * @param Data : pointer to a SDIO_DataInitTypeDef structure + * that contains the configuration information for the SDMMC data. * @retval HAL status */ -HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDIO_DataInitStruct) +HAL_StatusTypeDef SDIO_ConfigData(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* Data) { uint32_t tmpreg = 0U; /* Check the parameters */ - assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->DataLength)); - assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->DataBlockSize)); - assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->TransferDir)); - assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->TransferMode)); - assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->DPSM)); + assert_param(IS_SDIO_DATA_LENGTH(Data->DataLength)); + assert_param(IS_SDIO_BLOCK_SIZE(Data->DataBlockSize)); + assert_param(IS_SDIO_TRANSFER_DIR(Data->TransferDir)); + assert_param(IS_SDIO_TRANSFER_MODE(Data->TransferMode)); + assert_param(IS_SDIO_DPSM(Data->DPSM)); - /* Set the SDIO Data Timeout value */ - SDIOx->DTIMER = SDIO_DataInitStruct->DataTimeOut; + /* Set the SDMMC Data TimeOut value */ + SDIOx->DTIMER = Data->DataTimeOut; - /* Set the SDIO DataLength value */ - SDIOx->DLEN = SDIO_DataInitStruct->DataLength; + /* Set the SDMMC DataLength value */ + SDIOx->DLEN = Data->DataLength; - /* Set the SDIO data configuration parameters */ - tmpreg |= (uint32_t)(SDIO_DataInitStruct->DataBlockSize |\ - SDIO_DataInitStruct->TransferDir |\ - SDIO_DataInitStruct->TransferMode |\ - SDIO_DataInitStruct->DPSM); + /* Set the SDMMC data configuration parameters */ + tmpreg |= (uint32_t)(Data->DataBlockSize |\ + Data->TransferDir |\ + Data->TransferMode |\ + Data->DPSM); - /* Write to SDIO DCTRL */ + /* Write to SDMMC DCTRL */ MODIFY_REG(SDIOx->DCTRL, DCTRL_CLEAR_MASK, tmpreg); return HAL_OK; @@ -452,7 +471,7 @@ HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDI /** * @brief Returns number of remaining data bytes to be transferred. - * @param SDIOx: Pointer to SDIO register base + * @param SDIOx: Pointer to SDMMC register base * @retval Number of remaining data bytes to be transferred */ uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx) @@ -462,7 +481,7 @@ uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx) /** * @brief Get the FIFO data - * @param SDIOx: Pointer to SDIO register base + * @param SDIOx: Pointer to SDMMC register base * @retval Data received */ uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx) @@ -470,21 +489,22 @@ uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx) return (SDIOx->FIFO); } - /** * @brief Sets one of the two options of inserting read wait interval. - * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. + * @param SDIOx: Pointer to SDMMC register base + * @param SDIO_ReadWaitMode: SDMMC Read Wait operation mode. * This parameter can be: - * @arg SDIO_READ_WAIT_MODE_CLK: Read Wait control by stopping SDIOCLK - * @arg SDIO_READ_WAIT_MODE_DATA2: Read Wait control using SDIO_DATA2 + * @arg SDIO_READ_WAIT_MODE_CLK: Read Wait control by stopping SDMMCCLK + * @arg SDIO_READ_WAIT_MODE_DATA2: Read Wait control using SDMMC_DATA2 * @retval None */ -HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +HAL_StatusTypeDef SDIO_SetSDMMCReadWaitMode(SDIO_TypeDef *SDIOx, uint32_t SDIO_ReadWaitMode) { /* Check the parameters */ assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); - - *(__IO uint32_t *)DCTRL_RWMOD_BB = SDIO_ReadWaitMode; + + /* Set SDMMC read wait mode */ + MODIFY_REG(SDIOx->DCTRL, SDIO_DCTRL_RWMOD, SDIO_ReadWaitMode); return HAL_OK; } @@ -493,13 +513,991 @@ HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) * @} */ + +/** @defgroup HAL_SDMMC_LL_Group4 Command management functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### Commands management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the needed commands. + +@endverbatim + * @{ + */ + +/** + * @brief Send the Data Block Lenght command and check the response + * @param SDIOx: Pointer to SDMMC register base + * @retval HAL status + */ +uint32_t SDMMC_CmdBlockLength(SDIO_TypeDef *SDIOx, uint32_t BlockSize) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)BlockSize; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_BLOCKLEN; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SET_BLOCKLEN, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Read Single Block command and check the response + * @param SDIOx: Pointer to SDMMC register base + * @retval HAL status + */ +uint32_t SDMMC_CmdReadSingleBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)ReadAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_READ_SINGLE_BLOCK; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_READ_SINGLE_BLOCK, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Read Multi Block command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdReadMultiBlock(SDIO_TypeDef *SDIOx, uint32_t ReadAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)ReadAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_READ_MULT_BLOCK; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_READ_MULT_BLOCK, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Write Single Block command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdWriteSingleBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)WriteAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_WRITE_SINGLE_BLOCK; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_WRITE_SINGLE_BLOCK, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Write Multi Block command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdWriteMultiBlock(SDIO_TypeDef *SDIOx, uint32_t WriteAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)WriteAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_WRITE_MULT_BLOCK; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_WRITE_MULT_BLOCK, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Start Address Erase command for SD and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSDEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)StartAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_ERASE_GRP_START; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SD_ERASE_GRP_START, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the End Address Erase command for SD and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSDEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)EndAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_ERASE_GRP_END; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SD_ERASE_GRP_END, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Start Address Erase command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdEraseStartAdd(SDIO_TypeDef *SDIOx, uint32_t StartAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)StartAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE_GRP_START; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_ERASE_GRP_START, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the End Address Erase command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdEraseEndAdd(SDIO_TypeDef *SDIOx, uint32_t EndAdd) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = (uint32_t)EndAdd; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE_GRP_END; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_ERASE_GRP_END, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Erase command and check the response + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdErase(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Set Block Size for Card */ + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ERASE; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_ERASE, SDIO_MAXERASETIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Stop Transfer command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdStopTransfer(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD12 STOP_TRANSMISSION */ + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_STOP_TRANSMISSION; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_STOP_TRANSMISSION, 100000000U); + + return errorstate; +} + +/** + * @brief Send the Select Deselect command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @param addr: Address of the card to be selected + * @retval HAL status + */ +uint32_t SDMMC_CmdSelDesel(SDIO_TypeDef *SDIOx, uint64_t Addr) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD7 SDMMC_SEL_DESEL_CARD */ + sdmmc_cmdinit.Argument = (uint32_t)Addr; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEL_DESEL_CARD; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SEL_DESEL_CARD, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Go Idle State command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdGoIdleState(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_GO_IDLE_STATE; + sdmmc_cmdinit.Response = SDIO_RESPONSE_NO; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdError(SDIOx); + + return errorstate; +} + +/** + * @brief Send the Operating Condition command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdOperCond(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD8 to verify SD card interface operating condition */ + /* Argument: - [31:12]: Reserved (shall be set to '0') + - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V) + - [7:0]: Check Pattern (recommended 0xAA) */ + /* CMD Response: R7 */ + sdmmc_cmdinit.Argument = SDMMC_CHECK_PATTERN; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_HS_SEND_EXT_CSD; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp7(SDIOx); + + return errorstate; +} + +/** + * @brief Send the Application command to verify that that the next command + * is an application specific com-mand rather than a standard command + * and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdAppCommand(SDIO_TypeDef *SDIOx, uint32_t Argument) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = (uint32_t)Argument; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_APP_CMD; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + /* If there is a HAL_ERROR, it is a MMC card, else + it is a SD card: SD card 2.0 (voltage range mismatch) + or SD card 1.x */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_APP_CMD, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the command asking the accessed card to send its operating + * condition register (OCR) + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdAppOperCommand(SDIO_TypeDef *SDIOx, uint32_t SdType) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = SDMMC_VOLTAGE_WINDOW_SD | SdType; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_OP_COND; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp3(SDIOx); + + return errorstate; +} + +/** + * @brief Send the Bus Width command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdBusWidth(SDIO_TypeDef *SDIOx, uint32_t BusWidth) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = (uint32_t)BusWidth; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_APP_SD_SET_BUSWIDTH; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_APP_SD_SET_BUSWIDTH, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Send SCR command and check the response. + * @param SDIOx: Pointer to SDMMC register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSendSCR(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD51 SD_APP_SEND_SCR */ + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_SEND_SCR; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SD_APP_SEND_SCR, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Send CID command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSendCID(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD2 ALL_SEND_CID */ + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_ALL_SEND_CID; + sdmmc_cmdinit.Response = SDIO_RESPONSE_LONG; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp2(SDIOx); + + return errorstate; +} + +/** + * @brief Send the Send CSD command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSendCSD(SDIO_TypeDef *SDIOx, uint32_t Argument) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD9 SEND_CSD */ + sdmmc_cmdinit.Argument = (uint32_t)Argument; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_CSD; + sdmmc_cmdinit.Response = SDIO_RESPONSE_LONG; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp2(SDIOx); + + return errorstate; +} + +/** + * @brief Send the Send CSD command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSetRelAdd(SDIO_TypeDef *SDIOx, uint16_t *pRCA) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + /* Send CMD3 SD_CMD_SET_REL_ADDR */ + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SET_REL_ADDR; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp6(SDIOx, SDMMC_CMD_SET_REL_ADDR, pRCA); + + return errorstate; +} + +/** + * @brief Send the Status command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdSendStatus(SDIO_TypeDef *SDIOx, uint32_t Argument) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = (uint32_t)Argument; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_STATUS; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SEND_STATUS, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Send the Status register command and check the response. + * @param SDIOx: Pointer to SDIO register base + * @retval HAL status + */ +uint32_t SDMMC_CmdStatusRegister(SDIO_TypeDef *SDIOx) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = 0U; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SD_APP_STATUS; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_SD_APP_STATUS, SDIO_CMDTIMEOUT); + + return errorstate; +} + +/** + * @brief Sends host capacity support information and activates the card's + * initialization process. Send SDMMC_CMD_SEND_OP_COND command + * @param SDIOx: Pointer to SDIO register base + * @parame Argument: Argument used for the command + * @retval HAL status + */ +uint32_t SDMMC_CmdOpCondition(SDIO_TypeDef *SDIOx, uint32_t Argument) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = Argument; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_SEND_OP_COND; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp3(SDIOx); + + return errorstate; +} + +/** + * @brief Checks switchable function and switch card function. SDMMC_CMD_HS_SWITCH comand + * @param SDIOx: Pointer to SDIO register base + * @parame Argument: Argument used for the command + * @retval HAL status + */ +uint32_t SDMMC_CmdSwitch(SDIO_TypeDef *SDIOx, uint32_t Argument) +{ + SDIO_CmdInitTypeDef sdmmc_cmdinit; + uint32_t errorstate = SDMMC_ERROR_NONE; + + sdmmc_cmdinit.Argument = Argument; + sdmmc_cmdinit.CmdIndex = SDMMC_CMD_HS_SWITCH; + sdmmc_cmdinit.Response = SDIO_RESPONSE_SHORT; + sdmmc_cmdinit.WaitForInterrupt = SDIO_WAIT_NO; + sdmmc_cmdinit.CPSM = SDIO_CPSM_ENABLE; + SDIO_SendCommand(SDIOx, &sdmmc_cmdinit); + + /* Check for error conditions */ + errorstate = SDMMC_GetCmdResp1(SDIOx, SDMMC_CMD_HS_SWITCH, SDIO_CMDTIMEOUT); + + return errorstate; +} + /** * @} */ + +/* Private function ----------------------------------------------------------*/ +/** @addtogroup SD_Private_Functions + * @{ + */ + +/** + * @brief Checks for error conditions for CMD0. + * @param hsd: SD handle + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdError(SDIO_TypeDef *SDIOx) +{ + /* 8 is the number of required instructions cycles for the below loop statement. + The SDMMC_CMDTIMEOUT is expressed in ms */ + register uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CMDSENT)); + + /* Clear all the static flags */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS); + + return SDMMC_ERROR_NONE; +} + +/** + * @brief Checks for error conditions for R1 response. + * @param hsd: SD handle + * @param SD_CMD: The sent command index + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint32_t Timeout) +{ + uint32_t response_r1; + + /* 8 is the number of required instructions cycles for the below loop statement. + The Timeout is expressed in ms */ + register uint32_t count = Timeout * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)); + + if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT); + + return SDMMC_ERROR_CMD_RSP_TIMEOUT; + } + else if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL); + + return SDMMC_ERROR_CMD_CRC_FAIL; + } + + /* Check response received is of desired command */ + if(SDIO_GetCommandResponse(SDIOx) != SD_CMD) + { + return SDMMC_ERROR_CMD_CRC_FAIL; + } + + /* Clear all the static flags */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS); + + /* We have received response, retrieve it for analysis */ + response_r1 = SDIO_GetResponse(SDIOx, SDIO_RESP1); + + if((response_r1 & SDMMC_OCR_ERRORBITS) == SDMMC_ALLZERO) + { + return SDMMC_ERROR_NONE; + } + else if((response_r1 & SDMMC_OCR_ADDR_OUT_OF_RANGE) == SDMMC_OCR_ADDR_OUT_OF_RANGE) + { + return SDMMC_ERROR_ADDR_OUT_OF_RANGE; + } + else if((response_r1 & SDMMC_OCR_ADDR_MISALIGNED) == SDMMC_OCR_ADDR_MISALIGNED) + { + return SDMMC_ERROR_ADDR_MISALIGNED; + } + else if((response_r1 & SDMMC_OCR_BLOCK_LEN_ERR) == SDMMC_OCR_BLOCK_LEN_ERR) + { + return SDMMC_ERROR_BLOCK_LEN_ERR; + } + else if((response_r1 & SDMMC_OCR_ERASE_SEQ_ERR) == SDMMC_OCR_ERASE_SEQ_ERR) + { + return SDMMC_ERROR_ERASE_SEQ_ERR; + } + else if((response_r1 & SDMMC_OCR_BAD_ERASE_PARAM) == SDMMC_OCR_BAD_ERASE_PARAM) + { + return SDMMC_ERROR_BAD_ERASE_PARAM; + } + else if((response_r1 & SDMMC_OCR_WRITE_PROT_VIOLATION) == SDMMC_OCR_WRITE_PROT_VIOLATION) + { + return SDMMC_ERROR_WRITE_PROT_VIOLATION; + } + else if((response_r1 & SDMMC_OCR_LOCK_UNLOCK_FAILED) == SDMMC_OCR_LOCK_UNLOCK_FAILED) + { + return SDMMC_ERROR_LOCK_UNLOCK_FAILED; + } + else if((response_r1 & SDMMC_OCR_COM_CRC_FAILED) == SDMMC_OCR_COM_CRC_FAILED) + { + return SDMMC_ERROR_COM_CRC_FAILED; + } + else if((response_r1 & SDMMC_OCR_ILLEGAL_CMD) == SDMMC_OCR_ILLEGAL_CMD) + { + return SDMMC_ERROR_ILLEGAL_CMD; + } + else if((response_r1 & SDMMC_OCR_CARD_ECC_FAILED) == SDMMC_OCR_CARD_ECC_FAILED) + { + return SDMMC_ERROR_CARD_ECC_FAILED; + } + else if((response_r1 & SDMMC_OCR_CC_ERROR) == SDMMC_OCR_CC_ERROR) + { + return SDMMC_ERROR_CC_ERR; + } + else if((response_r1 & SDMMC_OCR_STREAM_READ_UNDERRUN) == SDMMC_OCR_STREAM_READ_UNDERRUN) + { + return SDMMC_ERROR_STREAM_READ_UNDERRUN; + } + else if((response_r1 & SDMMC_OCR_STREAM_WRITE_OVERRUN) == SDMMC_OCR_STREAM_WRITE_OVERRUN) + { + return SDMMC_ERROR_STREAM_WRITE_OVERRUN; + } + else if((response_r1 & SDMMC_OCR_CID_CSD_OVERWRITE) == SDMMC_OCR_CID_CSD_OVERWRITE) + { + return SDMMC_ERROR_CID_CSD_OVERWRITE; + } + else if((response_r1 & SDMMC_OCR_WP_ERASE_SKIP) == SDMMC_OCR_WP_ERASE_SKIP) + { + return SDMMC_ERROR_WP_ERASE_SKIP; + } + else if((response_r1 & SDMMC_OCR_CARD_ECC_DISABLED) == SDMMC_OCR_CARD_ECC_DISABLED) + { + return SDMMC_ERROR_CARD_ECC_DISABLED; + } + else if((response_r1 & SDMMC_OCR_ERASE_RESET) == SDMMC_OCR_ERASE_RESET) + { + return SDMMC_ERROR_ERASE_RESET; + } + else if((response_r1 & SDMMC_OCR_AKE_SEQ_ERROR) == SDMMC_OCR_AKE_SEQ_ERROR) + { + return SDMMC_ERROR_AKE_SEQ_ERR; + } + else + { + return SDMMC_ERROR_GENERAL_UNKNOWN_ERR; + } +} + +/** + * @brief Checks for error conditions for R2 (CID or CSD) response. + * @param hsd: SD handle + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdResp2(SDIO_TypeDef *SDIOx) +{ + /* 8 is the number of required instructions cycles for the below loop statement. + The SDMMC_CMDTIMEOUT is expressed in ms */ + register uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)); + + if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT); + + return SDMMC_ERROR_CMD_RSP_TIMEOUT; + } + else if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL); + + return SDMMC_ERROR_CMD_CRC_FAIL; + } + else + { + /* No error flag set */ + /* Clear all the static flags */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS); + } + + return SDMMC_ERROR_NONE; +} + +/** + * @brief Checks for error conditions for R3 (OCR) response. + * @param hsd: SD handle + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdResp3(SDIO_TypeDef *SDIOx) +{ + /* 8 is the number of required instructions cycles for the below loop statement. + The SDMMC_CMDTIMEOUT is expressed in ms */ + register uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)); + + if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT); + + return SDMMC_ERROR_CMD_RSP_TIMEOUT; + } + else + + { + /* Clear all the static flags */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS); + } + + return SDMMC_ERROR_NONE; +} + +/** + * @brief Checks for error conditions for R6 (RCA) response. + * @param hsd: SD handle + * @param SD_CMD: The sent command index + * @param pRCA: Pointer to the variable that will contain the SD card relative + * address RCA + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdResp6(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint16_t *pRCA) +{ + uint32_t response_r1; + + /* 8 is the number of required instructions cycles for the below loop statement. + The SDMMC_CMDTIMEOUT is expressed in ms */ + register uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)); + + if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT); + + return SDMMC_ERROR_CMD_RSP_TIMEOUT; + } + else if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL)) + { + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL); + + return SDMMC_ERROR_CMD_CRC_FAIL; + } + + /* Check response received is of desired command */ + if(SDIO_GetCommandResponse(SDIOx) != SD_CMD) + { + return SDMMC_ERROR_CMD_CRC_FAIL; + } + + /* Clear all the static flags */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_STATIC_FLAGS); + + /* We have received response, retrieve it. */ + response_r1 = SDIO_GetResponse(SDIOx, SDIO_RESP1); + + if((response_r1 & (SDMMC_R6_GENERAL_UNKNOWN_ERROR | SDMMC_R6_ILLEGAL_CMD | SDMMC_R6_COM_CRC_FAILED)) == SDMMC_ALLZERO) + { + *pRCA = (uint16_t) (response_r1 >> 16); + + return SDMMC_ERROR_NONE; + } + else if((response_r1 & SDMMC_R6_ILLEGAL_CMD) == SDMMC_R6_ILLEGAL_CMD) + { + return SDMMC_ERROR_ILLEGAL_CMD; + } + else if((response_r1 & SDMMC_R6_COM_CRC_FAILED) == SDMMC_R6_COM_CRC_FAILED) + { + return SDMMC_ERROR_COM_CRC_FAILED; + } + else + { + return SDMMC_ERROR_GENERAL_UNKNOWN_ERR; + } +} + +/** + * @brief Checks for error conditions for R7 response. + * @param hsd: SD handle + * @retval SD Card error state + */ +static uint32_t SDMMC_GetCmdResp7(SDIO_TypeDef *SDIOx) +{ + /* 8 is the number of required instructions cycles for the below loop statement. + The SDIO_CMDTIMEOUT is expressed in ms */ + register uint32_t count = SDIO_CMDTIMEOUT * (SystemCoreClock / 8U /1000U); + + do + { + if (count-- == 0U) + { + return SDMMC_ERROR_TIMEOUT; + } + + }while(!__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)); + + if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT)) + { + /* Card is SD V2.0 compliant */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CMDREND); + + return SDMMC_ERROR_CMD_RSP_TIMEOUT; + } + + if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CMDREND)) + { + /* Card is SD V2.0 compliant */ + __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CMDREND); + } + + return SDMMC_ERROR_NONE; + +} + +/** + * @} + */ + +/** + * @} + */ + #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ #endif /* (HAL_SD_MODULE_ENABLED) || (HAL_MMC_MODULE_ENABLED) */ + /** * @} */ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_spi.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_spi.c new file mode 100644 index 0000000..b292861 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_spi.c @@ -0,0 +1,642 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_spi.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief SPI LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_spi.h" +#include "stm32f4xx_ll_bus.h" +#include "stm32f4xx_ll_rcc.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) + +/** @addtogroup SPI_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup SPI_LL_Private_Constants SPI Private Constants + * @{ + */ +/* SPI registers Masks */ +#define SPI_CR1_CLEAR_MASK (SPI_CR1_CPHA | SPI_CR1_CPOL | SPI_CR1_MSTR | \ + SPI_CR1_BR | SPI_CR1_LSBFIRST | SPI_CR1_SSI | \ + SPI_CR1_SSM | SPI_CR1_RXONLY | SPI_CR1_DFF | \ + SPI_CR1_CRCNEXT | SPI_CR1_CRCEN | SPI_CR1_BIDIOE | \ + SPI_CR1_BIDIMODE) +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup SPI_LL_Private_Macros SPI Private Macros + * @{ + */ +#define IS_LL_SPI_TRANSFER_DIRECTION(__VALUE__) (((__VALUE__) == LL_SPI_FULL_DUPLEX) \ + || ((__VALUE__) == LL_SPI_SIMPLEX_RX) \ + || ((__VALUE__) == LL_SPI_HALF_DUPLEX_RX) \ + || ((__VALUE__) == LL_SPI_HALF_DUPLEX_TX)) + +#define IS_LL_SPI_MODE(__VALUE__) (((__VALUE__) == LL_SPI_MODE_MASTER) \ + || ((__VALUE__) == LL_SPI_MODE_SLAVE)) + +#define IS_LL_SPI_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_SPI_DATAWIDTH_8BIT) \ + || ((__VALUE__) == LL_SPI_DATAWIDTH_16BIT)) + +#define IS_LL_SPI_POLARITY(__VALUE__) (((__VALUE__) == LL_SPI_POLARITY_LOW) \ + || ((__VALUE__) == LL_SPI_POLARITY_HIGH)) + +#define IS_LL_SPI_PHASE(__VALUE__) (((__VALUE__) == LL_SPI_PHASE_1EDGE) \ + || ((__VALUE__) == LL_SPI_PHASE_2EDGE)) + +#define IS_LL_SPI_NSS(__VALUE__) (((__VALUE__) == LL_SPI_NSS_SOFT) \ + || ((__VALUE__) == LL_SPI_NSS_HARD_INPUT) \ + || ((__VALUE__) == LL_SPI_NSS_HARD_OUTPUT)) + +#define IS_LL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV2) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV4) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV8) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV16) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV32) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV64) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV128) \ + || ((__VALUE__) == LL_SPI_BAUDRATEPRESCALER_DIV256)) + +#define IS_LL_SPI_BITORDER(__VALUE__) (((__VALUE__) == LL_SPI_LSB_FIRST) \ + || ((__VALUE__) == LL_SPI_MSB_FIRST)) + +#define IS_LL_SPI_CRCCALCULATION(__VALUE__) (((__VALUE__) == LL_SPI_CRCCALCULATION_ENABLE) \ + || ((__VALUE__) == LL_SPI_CRCCALCULATION_DISABLE)) + +#define IS_LL_SPI_CRC_POLYNOMIAL(__VALUE__) ((__VALUE__) >= 0x1U) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_LL_Exported_Functions + * @{ + */ + +/** @addtogroup SPI_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the SPI registers to their default reset values. + * @param SPIx SPI Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are de-initialized + * - ERROR: SPI registers are not de-initialized + */ +ErrorStatus LL_SPI_DeInit(SPI_TypeDef *SPIx) +{ + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_SPI_ALL_INSTANCE(SPIx)); + +#if defined(SPI1) + if (SPIx == SPI1) + { + /* Force reset of SPI clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI1); + + /* Release reset of SPI clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI1); + + status = SUCCESS; + } +#endif /* SPI1 */ +#if defined(SPI2) + if (SPIx == SPI2) + { + /* Force reset of SPI clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI2); + + /* Release reset of SPI clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI2); + + status = SUCCESS; + } +#endif /* SPI2 */ +#if defined(SPI3) + if (SPIx == SPI3) + { + /* Force reset of SPI clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_SPI3); + + /* Release reset of SPI clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_SPI3); + + status = SUCCESS; + } +#endif /* SPI3 */ +#if defined(SPI4) + if (SPIx == SPI4) + { + /* Force reset of SPI clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI4); + + /* Release reset of SPI clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI4); + + status = SUCCESS; + } +#endif /* SPI4 */ +#if defined(SPI5) + if (SPIx == SPI5) + { + /* Force reset of SPI clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI5); + + /* Release reset of SPI clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI5); + + status = SUCCESS; + } +#endif /* SPI5 */ +#if defined(SPI6) + if (SPIx == SPI6) + { + /* Force reset of SPI clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_SPI6); + + /* Release reset of SPI clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_SPI6); + + status = SUCCESS; + } +#endif /* SPI6 */ + + return status; +} + +/** + * @brief Initialize the SPI registers according to the specified parameters in SPI_InitStruct. + * @note As some bits in SPI configuration registers can only be written when the SPI is disabled (SPI_CR1_SPE bit =0), + * SPI IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @param SPIx SPI Instance + * @param SPI_InitStruct pointer to a @ref LL_SPI_InitTypeDef structure + * @retval An ErrorStatus enumeration value. (Return always SUCCESS) + */ +ErrorStatus LL_SPI_Init(SPI_TypeDef *SPIx, LL_SPI_InitTypeDef *SPI_InitStruct) +{ + ErrorStatus status = ERROR; + + /* Check the SPI Instance SPIx*/ + assert_param(IS_SPI_ALL_INSTANCE(SPIx)); + + /* Check the SPI parameters from SPI_InitStruct*/ + assert_param(IS_LL_SPI_TRANSFER_DIRECTION(SPI_InitStruct->TransferDirection)); + assert_param(IS_LL_SPI_MODE(SPI_InitStruct->Mode)); + assert_param(IS_LL_SPI_DATAWIDTH(SPI_InitStruct->DataWidth)); + assert_param(IS_LL_SPI_POLARITY(SPI_InitStruct->ClockPolarity)); + assert_param(IS_LL_SPI_PHASE(SPI_InitStruct->ClockPhase)); + assert_param(IS_LL_SPI_NSS(SPI_InitStruct->NSS)); + assert_param(IS_LL_SPI_BAUDRATE(SPI_InitStruct->BaudRate)); + assert_param(IS_LL_SPI_BITORDER(SPI_InitStruct->BitOrder)); + assert_param(IS_LL_SPI_CRCCALCULATION(SPI_InitStruct->CRCCalculation)); + + if (LL_SPI_IsEnabled(SPIx) == 0x00000000U) + { + /*---------------------------- SPIx CR1 Configuration ------------------------ + * Configure SPIx CR1 with parameters: + * - TransferDirection: SPI_CR1_BIDIMODE, SPI_CR1_BIDIOE and SPI_CR1_RXONLY bits + * - Master/Slave Mode: SPI_CR1_MSTR bit + * - DataWidth: SPI_CR1_DFF bit + * - ClockPolarity: SPI_CR1_CPOL bit + * - ClockPhase: SPI_CR1_CPHA bit + * - NSS management: SPI_CR1_SSM bit + * - BaudRate prescaler: SPI_CR1_BR[2:0] bits + * - BitOrder: SPI_CR1_LSBFIRST bit + * - CRCCalculation: SPI_CR1_CRCEN bit + */ + MODIFY_REG(SPIx->CR1, + SPI_CR1_CLEAR_MASK, + SPI_InitStruct->TransferDirection | SPI_InitStruct->Mode | SPI_InitStruct->DataWidth | + SPI_InitStruct->ClockPolarity | SPI_InitStruct->ClockPhase | + SPI_InitStruct->NSS | SPI_InitStruct->BaudRate | + SPI_InitStruct->BitOrder | SPI_InitStruct->CRCCalculation); + + /*---------------------------- SPIx CR2 Configuration ------------------------ + * Configure SPIx CR2 with parameters: + * - NSS management: SSOE bit + */ + MODIFY_REG(SPIx->CR2, SPI_CR2_SSOE, (SPI_InitStruct->NSS >> 16U)); + + /*---------------------------- SPIx CRCPR Configuration ---------------------- + * Configure SPIx CRCPR with parameters: + * - CRCPoly: CRCPOLY[15:0] bits + */ + if (SPI_InitStruct->CRCCalculation == LL_SPI_CRCCALCULATION_ENABLE) + { + assert_param(IS_LL_SPI_CRC_POLYNOMIAL(SPI_InitStruct->CRCPoly)); + LL_SPI_SetCRCPolynomial(SPIx, SPI_InitStruct->CRCPoly); + } + status = SUCCESS; + } + + /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ + CLEAR_BIT(SPIx->I2SCFGR, SPI_I2SCFGR_I2SMOD); + return status; +} + +/** + * @brief Set each @ref LL_SPI_InitTypeDef field to default value. + * @param SPI_InitStruct pointer to a @ref LL_SPI_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_SPI_StructInit(LL_SPI_InitTypeDef *SPI_InitStruct) +{ + /* Set SPI_InitStruct fields to default values */ + SPI_InitStruct->TransferDirection = LL_SPI_FULL_DUPLEX; + SPI_InitStruct->Mode = LL_SPI_MODE_SLAVE; + SPI_InitStruct->DataWidth = LL_SPI_DATAWIDTH_8BIT; + SPI_InitStruct->ClockPolarity = LL_SPI_POLARITY_LOW; + SPI_InitStruct->ClockPhase = LL_SPI_PHASE_1EDGE; + SPI_InitStruct->NSS = LL_SPI_NSS_HARD_INPUT; + SPI_InitStruct->BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2; + SPI_InitStruct->BitOrder = LL_SPI_MSB_FIRST; + SPI_InitStruct->CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + SPI_InitStruct->CRCPoly = 7U; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup I2S_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2S_LL_Private_Constants I2S Private Constants + * @{ + */ +/* I2S registers Masks */ +#define I2S_I2SCFGR_CLEAR_MASK (SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | \ + SPI_I2SCFGR_CKPOL | SPI_I2SCFGR_I2SSTD | \ + SPI_I2SCFGR_I2SCFG | SPI_I2SCFGR_I2SMOD ) + +#define I2S_I2SPR_CLEAR_MASK 0x0002U +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2S_LL_Private_Macros I2S Private Macros + * @{ + */ + +#define IS_LL_I2S_DATAFORMAT(__VALUE__) (((__VALUE__) == LL_I2S_DATAFORMAT_16B) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_16B_EXTENDED) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_24B) \ + || ((__VALUE__) == LL_I2S_DATAFORMAT_32B)) + +#define IS_LL_I2S_CPOL(__VALUE__) (((__VALUE__) == LL_I2S_POLARITY_LOW) \ + || ((__VALUE__) == LL_I2S_POLARITY_HIGH)) + +#define IS_LL_I2S_STANDARD(__VALUE__) (((__VALUE__) == LL_I2S_STANDARD_PHILIPS) \ + || ((__VALUE__) == LL_I2S_STANDARD_MSB) \ + || ((__VALUE__) == LL_I2S_STANDARD_LSB) \ + || ((__VALUE__) == LL_I2S_STANDARD_PCM_SHORT) \ + || ((__VALUE__) == LL_I2S_STANDARD_PCM_LONG)) + +#define IS_LL_I2S_MODE(__VALUE__) (((__VALUE__) == LL_I2S_MODE_SLAVE_TX) \ + || ((__VALUE__) == LL_I2S_MODE_SLAVE_RX) \ + || ((__VALUE__) == LL_I2S_MODE_MASTER_TX) \ + || ((__VALUE__) == LL_I2S_MODE_MASTER_RX)) + +#define IS_LL_I2S_MCLK_OUTPUT(__VALUE__) (((__VALUE__) == LL_I2S_MCLK_OUTPUT_ENABLE) \ + || ((__VALUE__) == LL_I2S_MCLK_OUTPUT_DISABLE)) + +#define IS_LL_I2S_AUDIO_FREQ(__VALUE__) ((((__VALUE__) >= LL_I2S_AUDIOFREQ_8K) \ + && ((__VALUE__) <= LL_I2S_AUDIOFREQ_192K)) \ + || ((__VALUE__) == LL_I2S_AUDIOFREQ_DEFAULT)) + +#define IS_LL_I2S_PRESCALER_LINEAR(__VALUE__) ((__VALUE__) >= 0x2U) + +#define IS_LL_I2S_PRESCALER_PARITY(__VALUE__) (((__VALUE__) == LL_I2S_PRESCALER_PARITY_EVEN) \ + || ((__VALUE__) == LL_I2S_PRESCALER_PARITY_ODD)) +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2S_LL_Exported_Functions + * @{ + */ + +/** @addtogroup I2S_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize the SPI/I2S registers to their default reset values. + * @param SPIx SPI Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are de-initialized + * - ERROR: SPI registers are not de-initialized + */ +ErrorStatus LL_I2S_DeInit(SPI_TypeDef *SPIx) +{ + return LL_SPI_DeInit(SPIx); +} + +/** + * @brief Initializes the SPI/I2S registers according to the specified parameters in I2S_InitStruct. + * @note As some bits in SPI configuration registers can only be written when the SPI is disabled (SPI_CR1_SPE bit =0), + * SPI IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @param SPIx SPI Instance + * @param I2S_InitStruct pointer to a @ref LL_I2S_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: SPI registers are Initialized + * - ERROR: SPI registers are not Initialized + */ +ErrorStatus LL_I2S_Init(SPI_TypeDef *SPIx, LL_I2S_InitTypeDef *I2S_InitStruct) +{ + uint16_t i2sdiv = 2U, i2sodd = 0U, packetlength = 1U; + uint32_t tmp = 0U; + uint32_t sourceclock = 0U; + ErrorStatus status = ERROR; + + /* Check the I2S parameters */ + assert_param(IS_I2S_ALL_INSTANCE(SPIx)); + assert_param(IS_LL_I2S_MODE(I2S_InitStruct->Mode)); + assert_param(IS_LL_I2S_STANDARD(I2S_InitStruct->Standard)); + assert_param(IS_LL_I2S_DATAFORMAT(I2S_InitStruct->DataFormat)); + assert_param(IS_LL_I2S_MCLK_OUTPUT(I2S_InitStruct->MCLKOutput)); + assert_param(IS_LL_I2S_AUDIO_FREQ(I2S_InitStruct->AudioFreq)); + assert_param(IS_LL_I2S_CPOL(I2S_InitStruct->ClockPolarity)); + + if (LL_I2S_IsEnabled(SPIx) == 0x00000000U) + { + /*---------------------------- SPIx I2SCFGR Configuration -------------------- + * Configure SPIx I2SCFGR with parameters: + * - Mode: SPI_I2SCFGR_I2SCFG[1:0] bit + * - Standard: SPI_I2SCFGR_I2SSTD[1:0] and SPI_I2SCFGR_PCMSYNC bits + * - DataFormat: SPI_I2SCFGR_CHLEN and SPI_I2SCFGR_DATLEN bits + * - ClockPolarity: SPI_I2SCFGR_CKPOL bit + */ + + /* Write to SPIx I2SCFGR */ + MODIFY_REG(SPIx->I2SCFGR, + I2S_I2SCFGR_CLEAR_MASK, + I2S_InitStruct->Mode | I2S_InitStruct->Standard | + I2S_InitStruct->DataFormat | I2S_InitStruct->ClockPolarity | + SPI_I2SCFGR_I2SMOD); + + /*---------------------------- SPIx I2SPR Configuration ---------------------- + * Configure SPIx I2SPR with parameters: + * - MCLKOutput: SPI_I2SPR_MCKOE bit + * - AudioFreq: SPI_I2SPR_I2SDIV[7:0] and SPI_I2SPR_ODD bits + */ + + /* If the requested audio frequency is not the default, compute the prescaler (i2sodd, i2sdiv) + * else, default values are used: i2sodd = 0U, i2sdiv = 2U. + */ + if (I2S_InitStruct->AudioFreq != LL_I2S_AUDIOFREQ_DEFAULT) + { + /* Check the frame length (For the Prescaler computing) + * Default value: LL_I2S_DATAFORMAT_16B (packetlength = 1U). + */ + if (I2S_InitStruct->DataFormat != LL_I2S_DATAFORMAT_16B) + { + /* Packet length is 32 bits */ + packetlength = 2U; + } + + /* If an external I2S clock has to be used, the specific define should be set + in the project configuration or in the stm32f4xx_ll_rcc.h file */ + /* Get the I2S source clock value */ + sourceclock = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE); + + /* Compute the Real divider depending on the MCLK output state with a floating point */ + if (I2S_InitStruct->MCLKOutput == LL_I2S_MCLK_OUTPUT_ENABLE) + { + /* MCLK output is enabled */ + tmp = (uint16_t)(((((sourceclock / 256U) * 10U) / I2S_InitStruct->AudioFreq)) + 5U); + } + else + { + /* MCLK output is disabled */ + tmp = (uint16_t)(((((sourceclock / (32U * packetlength)) * 10U) / I2S_InitStruct->AudioFreq)) + 5U); + } + + /* Remove the floating point */ + tmp = tmp / 10U; + + /* Check the parity of the divider */ + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001U); + + /* Compute the i2sdiv prescaler */ + i2sdiv = (uint16_t)((tmp - i2sodd) / 2U); + + /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ + i2sodd = (uint16_t)(i2sodd << 8U); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2U) || (i2sdiv > 0xFFU)) + { + /* Set the default values */ + i2sdiv = 2U; + i2sodd = 0U; + } + + /* Write to SPIx I2SPR register the computed value */ + WRITE_REG(SPIx->I2SPR, i2sdiv | i2sodd | I2S_InitStruct->MCLKOutput); + + status = SUCCESS; + } + return status; +} + +/** + * @brief Set each @ref LL_I2S_InitTypeDef field to default value. + * @param I2S_InitStruct pointer to a @ref LL_I2S_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_I2S_StructInit(LL_I2S_InitTypeDef *I2S_InitStruct) +{ + /*--------------- Reset I2S init structure parameters values -----------------*/ + I2S_InitStruct->Mode = LL_I2S_MODE_SLAVE_TX; + I2S_InitStruct->Standard = LL_I2S_STANDARD_PHILIPS; + I2S_InitStruct->DataFormat = LL_I2S_DATAFORMAT_16B; + I2S_InitStruct->MCLKOutput = LL_I2S_MCLK_OUTPUT_DISABLE; + I2S_InitStruct->AudioFreq = LL_I2S_AUDIOFREQ_DEFAULT; + I2S_InitStruct->ClockPolarity = LL_I2S_POLARITY_LOW; +} + +/** + * @brief Set linear and parity prescaler. + * @note To calculate value of PrescalerLinear(I2SDIV[7:0] bits) and PrescalerParity(ODD bit)\n + * Check Audio frequency table and formulas inside Reference Manual (SPI/I2S). + * @param SPIx SPI Instance + * @param PrescalerLinear value: Min_Data=0x02 and Max_Data=0xFF. + * @param PrescalerParity This parameter can be one of the following values: + * @arg @ref LL_I2S_PRESCALER_PARITY_EVEN + * @arg @ref LL_I2S_PRESCALER_PARITY_ODD + * @retval None + */ +void LL_I2S_ConfigPrescaler(SPI_TypeDef *SPIx, uint32_t PrescalerLinear, uint32_t PrescalerParity) +{ + /* Check the I2S parameters */ + assert_param(IS_I2S_ALL_INSTANCE(SPIx)); + assert_param(IS_LL_I2S_PRESCALER_LINEAR(PrescalerLinear)); + assert_param(IS_LL_I2S_PRESCALER_PARITY(PrescalerParity)); + + /* Write to SPIx I2SPR */ + MODIFY_REG(SPIx->I2SPR, SPI_I2SPR_I2SDIV | SPI_I2SPR_ODD, PrescalerLinear | (PrescalerParity << 8U)); +} + +#if defined (SPI_I2S_FULLDUPLEX_SUPPORT) +/** + * @brief Configures the full duplex mode for the I2Sx peripheral using its extension + * I2Sxext according to the specified parameters in the I2S_InitStruct. + * @note The structure pointed by I2S_InitStruct parameter should be the same + * used for the master I2S peripheral. In this case, if the master is + * configured as transmitter, the slave will be receiver and vice versa. + * Or you can force a different mode by modifying the field I2S_Mode to the + * value I2S_SlaveRx or I2S_SlaveTx independently of the master configuration. + * @param I2Sxext SPI Instance + * @param I2S_InitStruct pointer to a @ref LL_I2S_InitTypeDef structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: I2Sxext registers are Initialized + * - ERROR: I2Sxext registers are not Initialized + */ +ErrorStatus LL_I2S_InitFullDuplex(SPI_TypeDef *I2Sxext, LL_I2S_InitTypeDef *I2S_InitStruct) +{ + uint16_t mode = 0U; + ErrorStatus status = ERROR; + + /* Check the I2S parameters */ + assert_param(IS_I2S_EXT_ALL_INSTANCE(I2Sxext)); + assert_param(IS_LL_I2S_MODE(I2S_InitStruct->Mode)); + assert_param(IS_LL_I2S_STANDARD(I2S_InitStruct->Standard)); + assert_param(IS_LL_I2S_DATAFORMAT(I2S_InitStruct->DataFormat)); + assert_param(IS_LL_I2S_CPOL(I2S_InitStruct->ClockPolarity)); + + if (LL_I2S_IsEnabled(I2Sxext) == 0x00000000U) + { + /*---------------------------- SPIx I2SCFGR Configuration -------------------- + * Configure SPIx I2SCFGR with parameters: + * - Mode: SPI_I2SCFGR_I2SCFG[1:0] bit + * - Standard: SPI_I2SCFGR_I2SSTD[1:0] and SPI_I2SCFGR_PCMSYNC bits + * - DataFormat: SPI_I2SCFGR_CHLEN and SPI_I2SCFGR_DATLEN bits + * - ClockPolarity: SPI_I2SCFGR_CKPOL bit + */ + + /* Reset I2SPR registers */ + WRITE_REG(I2Sxext->I2SPR, I2S_I2SPR_CLEAR_MASK); + + /* Get the mode to be configured for the extended I2S */ + if ((I2S_InitStruct->Mode == LL_I2S_MODE_MASTER_TX) || (I2S_InitStruct->Mode == LL_I2S_MODE_SLAVE_TX)) + { + mode = LL_I2S_MODE_SLAVE_RX; + } + else + { + if ((I2S_InitStruct->Mode == LL_I2S_MODE_MASTER_RX) || (I2S_InitStruct->Mode == LL_I2S_MODE_SLAVE_RX)) + { + mode = LL_I2S_MODE_SLAVE_TX; + } + } + + /* Write to SPIx I2SCFGR */ + MODIFY_REG(I2Sxext->I2SCFGR, + I2S_I2SCFGR_CLEAR_MASK, + I2S_InitStruct->Standard | + I2S_InitStruct->DataFormat | I2S_InitStruct->ClockPolarity | + SPI_I2SCFGR_I2SMOD | mode); + + status = SUCCESS; + } + return status; +} +#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (SPI1) || defined (SPI2) || defined (SPI3) || defined (SPI4) || defined (SPI5) || defined(SPI6) */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c new file mode 100644 index 0000000..f59374b --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c @@ -0,0 +1,1198 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_tim.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief TIM LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_tim.h" +#include "stm32f4xx_ll_bus.h" + +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (TIM1) || defined (TIM2) || defined (TIM3) || defined (TIM4) || defined (TIM5) || defined (TIM6) || defined (TIM7) || defined (TIM8) || defined (TIM9) || defined (TIM10) || defined (TIM11) || defined (TIM12) || defined (TIM13) || defined (TIM14) + +/** @addtogroup TIM_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup TIM_LL_Private_Macros + * @{ + */ +#define IS_LL_TIM_COUNTERMODE(__VALUE__) (((__VALUE__) == LL_TIM_COUNTERMODE_UP) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_DOWN) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_DOWN) \ + || ((__VALUE__) == LL_TIM_COUNTERMODE_CENTER_UP_DOWN)) + +#define IS_LL_TIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV1) \ + || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV2) \ + || ((__VALUE__) == LL_TIM_CLOCKDIVISION_DIV4)) + +#define IS_LL_TIM_OCMODE(__VALUE__) (((__VALUE__) == LL_TIM_OCMODE_FROZEN) \ + || ((__VALUE__) == LL_TIM_OCMODE_ACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_INACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_TOGGLE) \ + || ((__VALUE__) == LL_TIM_OCMODE_FORCED_INACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_FORCED_ACTIVE) \ + || ((__VALUE__) == LL_TIM_OCMODE_PWM1) \ + || ((__VALUE__) == LL_TIM_OCMODE_PWM2)) + +#define IS_LL_TIM_OCSTATE(__VALUE__) (((__VALUE__) == LL_TIM_OCSTATE_DISABLE) \ + || ((__VALUE__) == LL_TIM_OCSTATE_ENABLE)) + +#define IS_LL_TIM_OCPOLARITY(__VALUE__) (((__VALUE__) == LL_TIM_OCPOLARITY_HIGH) \ + || ((__VALUE__) == LL_TIM_OCPOLARITY_LOW)) + +#define IS_LL_TIM_OCIDLESTATE(__VALUE__) (((__VALUE__) == LL_TIM_OCIDLESTATE_LOW) \ + || ((__VALUE__) == LL_TIM_OCIDLESTATE_HIGH)) + +#define IS_LL_TIM_ACTIVEINPUT(__VALUE__) (((__VALUE__) == LL_TIM_ACTIVEINPUT_DIRECTTI) \ + || ((__VALUE__) == LL_TIM_ACTIVEINPUT_INDIRECTTI) \ + || ((__VALUE__) == LL_TIM_ACTIVEINPUT_TRC)) + +#define IS_LL_TIM_ICPSC(__VALUE__) (((__VALUE__) == LL_TIM_ICPSC_DIV1) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV2) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV4) \ + || ((__VALUE__) == LL_TIM_ICPSC_DIV8)) + +#define IS_LL_TIM_IC_FILTER(__VALUE__) (((__VALUE__) == LL_TIM_IC_FILTER_FDIV1) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N2) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N4) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV1_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV2_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV4_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV8_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N5) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV16_N8) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N5) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N6) \ + || ((__VALUE__) == LL_TIM_IC_FILTER_FDIV32_N8)) + +#define IS_LL_TIM_IC_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_BOTHEDGE)) + +#define IS_LL_TIM_ENCODERMODE(__VALUE__) (((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI1) \ + || ((__VALUE__) == LL_TIM_ENCODERMODE_X2_TI2) \ + || ((__VALUE__) == LL_TIM_ENCODERMODE_X4_TI12)) + +#define IS_LL_TIM_IC_POLARITY_ENCODER(__VALUE__) (((__VALUE__) == LL_TIM_IC_POLARITY_RISING) \ + || ((__VALUE__) == LL_TIM_IC_POLARITY_FALLING)) + +#define IS_LL_TIM_OSSR_STATE(__VALUE__) (((__VALUE__) == LL_TIM_OSSR_DISABLE) \ + || ((__VALUE__) == LL_TIM_OSSR_ENABLE)) + +#define IS_LL_TIM_OSSI_STATE(__VALUE__) (((__VALUE__) == LL_TIM_OSSI_DISABLE) \ + || ((__VALUE__) == LL_TIM_OSSI_ENABLE)) + +#define IS_LL_TIM_LOCK_LEVEL(__VALUE__) (((__VALUE__) == LL_TIM_LOCKLEVEL_OFF) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_1) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_2) \ + || ((__VALUE__) == LL_TIM_LOCKLEVEL_3)) + +#define IS_LL_TIM_BREAK_STATE(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_DISABLE) \ + || ((__VALUE__) == LL_TIM_BREAK_ENABLE)) + +#define IS_LL_TIM_BREAK_POLARITY(__VALUE__) (((__VALUE__) == LL_TIM_BREAK_POLARITY_LOW) \ + || ((__VALUE__) == LL_TIM_BREAK_POLARITY_HIGH)) + +#define IS_LL_TIM_AUTOMATIC_OUTPUT_STATE(__VALUE__) (((__VALUE__) == LL_TIM_AUTOMATICOUTPUT_DISABLE) \ + || ((__VALUE__) == LL_TIM_AUTOMATICOUTPUT_ENABLE)) +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup TIM_LL_Private_Functions TIM Private Functions + * @{ + */ +static ErrorStatus OC1Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC2Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC3Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus OC4Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct); +static ErrorStatus IC1Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC2Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC3Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +static ErrorStatus IC4Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_LL_Exported_Functions + * @{ + */ + +/** @addtogroup TIM_LL_EF_Init + * @{ + */ + +/** + * @brief Set TIMx registers to their reset values. + * @param TIMx Timer instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: invalid TIMx instance + */ +ErrorStatus LL_TIM_DeInit(TIM_TypeDef *TIMx) +{ + ErrorStatus result = SUCCESS; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(TIMx)); + + if (TIMx == TIM1) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM1); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM1); + } +#if defined(TIM2) + else if (TIMx == TIM2) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM2); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM2); + } +#endif +#if defined(TIM3) + else if (TIMx == TIM3) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM3); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM3); + } +#endif +#if defined(TIM4) + else if (TIMx == TIM4) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM4); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM4); + } +#endif +#if defined(TIM5) + else if (TIMx == TIM5) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM5); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM5); + } +#endif +#if defined(TIM6) + else if (TIMx == TIM6) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM6); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM6); + } +#endif +#if defined (TIM7) + else if (TIMx == TIM7) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM7); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM7); + } +#endif +#if defined(TIM8) + else if (TIMx == TIM8) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM8); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM8); + } +#endif +#if defined(TIM9) + else if (TIMx == TIM9) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM9); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM9); + } +#endif +#if defined(TIM10) + else if (TIMx == TIM10) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM10); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM10); + } +#endif +#if defined(TIM11) + else if (TIMx == TIM11) + { + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_TIM11); + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_TIM11); + } +#endif +#if defined(TIM12) + else if (TIMx == TIM12) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM12); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM12); + } +#endif +#if defined(TIM13) + else if (TIMx == TIM13) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM13); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM13); + } +#endif +#if defined(TIM14) + else if (TIMx == TIM14) + { + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_TIM14); + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_TIM14); + } +#endif + else + { + result = ERROR; + } + + return result; +} + +/** + * @brief Set the fields of the time base unit configuration data structure + * to their default values. + * @param TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure (time base unit configuration data structure) + * @retval None + */ +void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct) +{ + /* Set the default configuration */ + TIM_InitStruct->Prescaler = (uint16_t)0x0000U; + TIM_InitStruct->CounterMode = LL_TIM_COUNTERMODE_UP; + TIM_InitStruct->Autoreload = 0xFFFFFFFFU; + TIM_InitStruct->ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; + TIM_InitStruct->RepetitionCounter = (uint8_t)0x00U; +} + +/** + * @brief Configure the TIMx time base unit. + * @param TIMx Timer Instance + * @param TIM_InitStruct pointer to a @ref LL_TIM_InitTypeDef structure (TIMx time base unit configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_Init(TIM_TypeDef *TIMx, LL_TIM_InitTypeDef *TIM_InitStruct) +{ + uint32_t tmpcr1 = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_COUNTERMODE(TIM_InitStruct->CounterMode)); + assert_param(IS_LL_TIM_CLOCKDIVISION(TIM_InitStruct->ClockDivision)); + + tmpcr1 = LL_TIM_ReadReg(TIMx, CR1); + + if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx)) + { + /* Select the Counter Mode */ + MODIFY_REG(tmpcr1, (TIM_CR1_DIR | TIM_CR1_CMS), TIM_InitStruct->CounterMode); + } + + if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx)) + { + /* Set the clock division */ + MODIFY_REG(tmpcr1, TIM_CR1_CKD, TIM_InitStruct->ClockDivision); + } + + /* Write to TIMx CR1 */ + LL_TIM_WriteReg(TIMx, CR1, tmpcr1); + + /* Set the Autoreload value */ + LL_TIM_SetAutoReload(TIMx, TIM_InitStruct->Autoreload); + + /* Set the Prescaler value */ + LL_TIM_SetPrescaler(TIMx, TIM_InitStruct->Prescaler); + + if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx)) + { + /* Set the Repetition Counter value */ + LL_TIM_SetRepetitionCounter(TIMx, TIM_InitStruct->RepetitionCounter); + } + + /* Generate an update event to reload the Prescaler + and the repetition counter value (if applicable) immediately */ + LL_TIM_GenerateEvent_UPDATE(TIMx); + + return SUCCESS; +} + +/** + * @brief Set the fields of the TIMx output channel configuration data + * structure to their default values. + * @param TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure (the output channel configuration data structure) + * @retval None + */ +void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + /* Set the default configuration */ + TIM_OC_InitStruct->OCMode = LL_TIM_OCMODE_FROZEN; + TIM_OC_InitStruct->OCState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct->OCNState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct->CompareValue = 0x00000000U; + TIM_OC_InitStruct->OCPolarity = LL_TIM_OCPOLARITY_HIGH; + TIM_OC_InitStruct->OCNPolarity = LL_TIM_OCPOLARITY_HIGH; + TIM_OC_InitStruct->OCIdleState = LL_TIM_OCIDLESTATE_LOW; + TIM_OC_InitStruct->OCNIdleState = LL_TIM_OCIDLESTATE_LOW; +} + +/** + * @brief Configure the TIMx output channel. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param TIM_OC_InitStruct pointer to a @ref LL_TIM_OC_InitTypeDef structure (TIMx output channel configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx output channel is initialized + * - ERROR: TIMx output channel is not initialized + */ +ErrorStatus LL_TIM_OC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + ErrorStatus result = ERROR; + + switch (Channel) + { + case LL_TIM_CHANNEL_CH1: + result = OC1Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH2: + result = OC2Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH3: + result = OC3Config(TIMx, TIM_OC_InitStruct); + break; + case LL_TIM_CHANNEL_CH4: + result = OC4Config(TIMx, TIM_OC_InitStruct); + break; + default: + break; + } + + return result; +} + +/** + * @brief Set the fields of the TIMx input channel configuration data + * structure to their default values. + * @param TIM_ICInitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (the input channel configuration data structure) + * @retval None + */ +void LL_TIM_IC_StructInit(LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->ICPolarity = LL_TIM_IC_POLARITY_RISING; + TIM_ICInitStruct->ICActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_ICInitStruct->ICPrescaler = LL_TIM_ICPSC_DIV1; + TIM_ICInitStruct->ICFilter = LL_TIM_IC_FILTER_FDIV1; +} + +/** + * @brief Configure the TIMx input channel. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_TIM_CHANNEL_CH1 + * @arg @ref LL_TIM_CHANNEL_CH2 + * @arg @ref LL_TIM_CHANNEL_CH3 + * @arg @ref LL_TIM_CHANNEL_CH4 + * @param TIM_IC_InitStruct pointer to a @ref LL_TIM_IC_InitTypeDef structure (TIMx input channel configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx output channel is initialized + * - ERROR: TIMx output channel is not initialized + */ +ErrorStatus LL_TIM_IC_Init(TIM_TypeDef *TIMx, uint32_t Channel, LL_TIM_IC_InitTypeDef *TIM_IC_InitStruct) +{ + ErrorStatus result = ERROR; + + switch (Channel) + { + case LL_TIM_CHANNEL_CH1: + result = IC1Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH2: + result = IC2Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH3: + result = IC3Config(TIMx, TIM_IC_InitStruct); + break; + case LL_TIM_CHANNEL_CH4: + result = IC4Config(TIMx, TIM_IC_InitStruct); + break; + default: + break; + } + + return result; +} + +/** + * @brief Fills each TIM_EncoderInitStruct field with its default value + * @param TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (encoder interface configuration data structure) + * @retval None + */ +void LL_TIM_ENCODER_StructInit(LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) +{ + /* Set the default configuration */ + TIM_EncoderInitStruct->EncoderMode = LL_TIM_ENCODERMODE_X2_TI1; + TIM_EncoderInitStruct->IC1Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_EncoderInitStruct->IC1ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_EncoderInitStruct->IC1Prescaler = LL_TIM_ICPSC_DIV1; + TIM_EncoderInitStruct->IC1Filter = LL_TIM_IC_FILTER_FDIV1; + TIM_EncoderInitStruct->IC2Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_EncoderInitStruct->IC2ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI; + TIM_EncoderInitStruct->IC2Prescaler = LL_TIM_ICPSC_DIV1; + TIM_EncoderInitStruct->IC2Filter = LL_TIM_IC_FILTER_FDIV1; +} + +/** + * @brief Configure the encoder interface of the timer instance. + * @param TIMx Timer Instance + * @param TIM_EncoderInitStruct pointer to a @ref LL_TIM_ENCODER_InitTypeDef structure (TIMx encoder interface configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_ENCODER_Init(TIM_TypeDef *TIMx, LL_TIM_ENCODER_InitTypeDef *TIM_EncoderInitStruct) +{ + uint32_t tmpccmr1 = 0U; + uint32_t tmpccer = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_ENCODERMODE(TIM_EncoderInitStruct->EncoderMode)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC1Polarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC1ActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC1Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC1Filter)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_EncoderInitStruct->IC2Polarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_EncoderInitStruct->IC2ActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_EncoderInitStruct->IC2Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_EncoderInitStruct->IC2Filter)); + + /* Disable the CC1 and CC2: Reset the CC1E and CC2E Bits */ + TIMx->CCER &= (uint32_t)~(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Configure TI1 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1ActiveInput >> 16U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Filter >> 16U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC1Prescaler >> 16U); + + /* Configure TI2 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC2S | TIM_CCMR1_IC2F | TIM_CCMR1_IC2PSC); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2ActiveInput >> 8U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Filter >> 8U); + tmpccmr1 |= (uint32_t)(TIM_EncoderInitStruct->IC2Prescaler >> 8U); + + /* Set TI1 and TI2 polarity and enable TI1 and TI2 */ + tmpccer &= (uint32_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP | TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC1Polarity); + tmpccer |= (uint32_t)(TIM_EncoderInitStruct->IC2Polarity << 4U); + tmpccer |= (uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Set encoder mode */ + LL_TIM_SetEncoderMode(TIMx, TIM_EncoderInitStruct->EncoderMode); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Set the fields of the TIMx Hall sensor interface configuration data + * structure to their default values. + * @param TIM_HallSensorInitStruct pointer to a @ref LL_TIM_HALLSENSOR_InitTypeDef structure (HALL sensor interface configuration data structure) + * @retval None + */ +void LL_TIM_HALLSENSOR_StructInit(LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct) +{ + /* Set the default configuration */ + TIM_HallSensorInitStruct->IC1Polarity = LL_TIM_IC_POLARITY_RISING; + TIM_HallSensorInitStruct->IC1Prescaler = LL_TIM_ICPSC_DIV1; + TIM_HallSensorInitStruct->IC1Filter = LL_TIM_IC_FILTER_FDIV1; + TIM_HallSensorInitStruct->CommutationDelay = 0U; +} + +/** + * @brief Configure the Hall sensor interface of the timer instance. + * @note TIMx CH1, CH2 and CH3 inputs connected through a XOR + * to the TI1 input channel + * @note TIMx slave mode controller is configured in reset mode. + Selected internal trigger is TI1F_ED. + * @note Channel 1 is configured as input, IC1 is mapped on TRC. + * @note Captured value stored in TIMx_CCR1 correspond to the time elapsed + * between 2 changes on the inputs. It gives information about motor speed. + * @note Channel 2 is configured in output PWM 2 mode. + * @note Compare value stored in TIMx_CCR2 corresponds to the commutation delay. + * @note OC2REF is selected as trigger output on TRGO. + * @note LL_TIM_IC_POLARITY_BOTHEDGE must not be used for TI1 when it is used + * when TIMx operates in Hall sensor interface mode. + * @param TIMx Timer Instance + * @param TIM_HallSensorInitStruct pointer to a @ref LL_TIM_HALLSENSOR_InitTypeDef structure (TIMx HALL sensor interface configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_HALLSENSOR_Init(TIM_TypeDef *TIMx, LL_TIM_HALLSENSOR_InitTypeDef *TIM_HallSensorInitStruct) +{ + uint32_t tmpcr2 = 0U; + uint32_t tmpccmr1 = 0U; + uint32_t tmpccer = 0U; + uint32_t tmpsmcr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY_ENCODER(TIM_HallSensorInitStruct->IC1Polarity)); + assert_param(IS_LL_TIM_ICPSC(TIM_HallSensorInitStruct->IC1Prescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_HallSensorInitStruct->IC1Filter)); + + /* Disable the CC1 and CC2: Reset the CC1E and CC2E Bits */ + TIMx->CCER &= (uint32_t)~(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx SMCR register value */ + tmpsmcr = LL_TIM_ReadReg(TIMx, SMCR); + + /* Connect TIMx_CH1, CH2 and CH3 pins to the TI1 input */ + tmpcr2 |= TIM_CR2_TI1S; + + /* OC2REF signal is used as trigger output (TRGO) */ + tmpcr2 |= LL_TIM_TRGO_OC2REF; + + /* Configure the slave mode controller */ + tmpsmcr &= (uint32_t)~(TIM_SMCR_TS | TIM_SMCR_SMS); + tmpsmcr |= LL_TIM_TS_TI1F_ED; + tmpsmcr |= LL_TIM_SLAVEMODE_RESET; + + /* Configure input channel 1 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC); + tmpccmr1 |= (uint32_t)(LL_TIM_ACTIVEINPUT_TRC >> 16U); + tmpccmr1 |= (uint32_t)(TIM_HallSensorInitStruct->IC1Filter >> 16U); + tmpccmr1 |= (uint32_t)(TIM_HallSensorInitStruct->IC1Prescaler >> 16U); + + /* Configure input channel 2 */ + tmpccmr1 &= (uint32_t)~(TIM_CCMR1_OC2M | TIM_CCMR1_OC2FE | TIM_CCMR1_OC2PE | TIM_CCMR1_OC2CE); + tmpccmr1 |= (uint32_t)(LL_TIM_OCMODE_PWM2 << 8U); + + /* Set Channel 1 polarity and enable Channel 1 and Channel2 */ + tmpccer &= (uint32_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP | TIM_CCER_CC2P | TIM_CCER_CC2NP); + tmpccer |= (uint32_t)(TIM_HallSensorInitStruct->IC1Polarity); + tmpccer |= (uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E); + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx SMCR */ + LL_TIM_WriteReg(TIMx, SMCR, tmpsmcr); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + /* Write to TIMx CCR2 */ + LL_TIM_OC_SetCompareCH2(TIMx, TIM_HallSensorInitStruct->CommutationDelay); + + return SUCCESS; +} + +/** + * @brief Set the fields of the Break and Dead Time configuration data structure + * to their default values. + * @param TIM_BDTRInitStruct pointer to a @ref LL_TIM_BDTR_InitTypeDef structure (Break and Dead Time configuration data structure) + * @retval None + */ +void LL_TIM_BDTR_StructInit(LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct) +{ + /* Set the default configuration */ + TIM_BDTRInitStruct->OSSRState = LL_TIM_OSSR_DISABLE; + TIM_BDTRInitStruct->OSSIState = LL_TIM_OSSI_DISABLE; + TIM_BDTRInitStruct->LockLevel = LL_TIM_LOCKLEVEL_OFF; + TIM_BDTRInitStruct->DeadTime = (uint8_t)0x00U; + TIM_BDTRInitStruct->BreakState = LL_TIM_BREAK_DISABLE; + TIM_BDTRInitStruct->BreakPolarity = LL_TIM_BREAK_POLARITY_LOW; + TIM_BDTRInitStruct->AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE; +} + +/** + * @brief Configure the Break and Dead Time feature of the timer instance. + * @note As the bits AOE, BKP, BKE, OSSR, OSSI and DTG[7:0] can be write-locked + * depending on the LOCK configuration, it can be necessary to configure all of + * them during the first write access to the TIMx_BDTR register. + * @note Macro @ref IS_TIM_BREAK_INSTANCE(TIMx) can be used to check whether or not + * a timer instance provides a break input. + * @param TIMx Timer Instance + * @param TIM_BDTRInitStruct pointer to a @ref LL_TIM_BDTR_InitTypeDef structure(Break and Dead Time configuration data structure) + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Break and Dead Time is initialized + * - ERROR: not applicable + */ +ErrorStatus LL_TIM_BDTR_Init(TIM_TypeDef *TIMx, LL_TIM_BDTR_InitTypeDef *TIM_BDTRInitStruct) +{ + uint32_t tmpbdtr = 0; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OSSR_STATE(TIM_BDTRInitStruct->OSSRState)); + assert_param(IS_LL_TIM_OSSI_STATE(TIM_BDTRInitStruct->OSSIState)); + assert_param(IS_LL_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->LockLevel)); + assert_param(IS_LL_TIM_BREAK_STATE(TIM_BDTRInitStruct->BreakState)); + assert_param(IS_LL_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->BreakPolarity)); + assert_param(IS_LL_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->AutomaticOutput)); + + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, + the OSSI State, the dead time value and the Automatic Output Enable Bit */ + + /* Set the BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, TIM_BDTRInitStruct->DeadTime); + MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, TIM_BDTRInitStruct->LockLevel); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, TIM_BDTRInitStruct->OSSIState); + MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, TIM_BDTRInitStruct->OSSRState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, TIM_BDTRInitStruct->BreakState); + MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, TIM_BDTRInitStruct->BreakPolarity); + MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, TIM_BDTRInitStruct->AutomaticOutput); + MODIFY_REG(tmpbdtr, TIM_BDTR_MOE, TIM_BDTRInitStruct->AutomaticOutput); + + /* Set TIMx_BDTR */ + LL_TIM_WriteReg(TIMx, BDTR, tmpbdtr); + + return SUCCESS; +} +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup TIM_LL_Private_Functions TIM Private Functions + * @brief Private functions + * @{ + */ +/** + * @brief Configure the TIMx output channel 1. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 1 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC1Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr1 = 0U; + uint32_t tmpccer = 0U; + uint32_t tmpcr2 = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 1: Reset the CC1E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC1E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC1S); + + /* Set the Output Compare Mode */ + MODIFY_REG(tmpccmr1, TIM_CCMR1_OC1M, TIM_OCInitStruct->OCMode); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC1P, TIM_OCInitStruct->OCPolarity); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC1E, TIM_OCInitStruct->OCState); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC1NP, TIM_OCInitStruct->OCNPolarity << 2U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC1NE, TIM_OCInitStruct->OCNState << 2U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS1, TIM_OCInitStruct->OCIdleState); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS1N, TIM_OCInitStruct->OCNIdleState << 1U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH1(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 2. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 2 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC2Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr1 = 0U; + uint32_t tmpccer = 0U; + uint32_t tmpcr2 = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 2: Reset the CC2E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC2E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = LL_TIM_ReadReg(TIMx, CCMR1); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr1, TIM_CCMR1_CC2S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr1, TIM_CCMR1_OC2M, TIM_OCInitStruct->OCMode << 8U); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC2P, TIM_OCInitStruct->OCPolarity << 4U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC2E, TIM_OCInitStruct->OCState << 4U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC2NP, TIM_OCInitStruct->OCNPolarity << 6U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC2NE, TIM_OCInitStruct->OCNState << 6U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS2, TIM_OCInitStruct->OCIdleState << 2U); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS2N, TIM_OCInitStruct->OCNIdleState << 3U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR1 */ + LL_TIM_WriteReg(TIMx, CCMR1, tmpccmr1); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH2(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 3. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 3 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC3Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr2 = 0U; + uint32_t tmpccer = 0U; + uint32_t tmpcr2 = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + + /* Disable the Channel 3: Reset the CC3E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC3E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC3S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr2, TIM_CCMR2_OC3M, TIM_OCInitStruct->OCMode); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC3P, TIM_OCInitStruct->OCPolarity << 8U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC3E, TIM_OCInitStruct->OCState << 8U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the complementary output Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC3NP, TIM_OCInitStruct->OCNPolarity << 10U); + + /* Set the complementary output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC3NE, TIM_OCInitStruct->OCNState << 10U); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS3, TIM_OCInitStruct->OCIdleState << 4U); + + /* Set the complementary output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS3N, TIM_OCInitStruct->OCNIdleState << 5U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR2 */ + LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH3(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx output channel 4. + * @param TIMx Timer Instance + * @param TIM_OCInitStruct pointer to the the TIMx output channel 4 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus OC4Config(TIM_TypeDef *TIMx, LL_TIM_OC_InitTypeDef *TIM_OCInitStruct) +{ + uint32_t tmpccmr2 = 0U; + uint32_t tmpccer = 0U; + uint32_t tmpcr2 = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_OCMODE(TIM_OCInitStruct->OCMode)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCState)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCPolarity)); + assert_param(IS_LL_TIM_OCPOLARITY(TIM_OCInitStruct->OCNPolarity)); + assert_param(IS_LL_TIM_OCSTATE(TIM_OCInitStruct->OCNState)); + + /* Disable the Channel 4: Reset the CC4E Bit */ + CLEAR_BIT(TIMx->CCER, TIM_CCER_CC4E); + + /* Get the TIMx CCER register value */ + tmpccer = LL_TIM_ReadReg(TIMx, CCER); + + /* Get the TIMx CR2 register value */ + tmpcr2 = LL_TIM_ReadReg(TIMx, CR2); + + /* Get the TIMx CCMR2 register value */ + tmpccmr2 = LL_TIM_ReadReg(TIMx, CCMR2); + + /* Reset Capture/Compare selection Bits */ + CLEAR_BIT(tmpccmr2, TIM_CCMR2_CC4S); + + /* Select the Output Compare Mode */ + MODIFY_REG(tmpccmr2, TIM_CCMR2_OC4M, TIM_OCInitStruct->OCMode << 8U); + + /* Set the Output Compare Polarity */ + MODIFY_REG(tmpccer, TIM_CCER_CC4P, TIM_OCInitStruct->OCPolarity << 12U); + + /* Set the Output State */ + MODIFY_REG(tmpccer, TIM_CCER_CC4E, TIM_OCInitStruct->OCState << 12U); + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCNIdleState)); + assert_param(IS_LL_TIM_OCIDLESTATE(TIM_OCInitStruct->OCIdleState)); + + /* Set the Output Idle state */ + MODIFY_REG(tmpcr2, TIM_CR2_OIS4, TIM_OCInitStruct->OCIdleState << 6U); + } + + /* Write to TIMx CR2 */ + LL_TIM_WriteReg(TIMx, CR2, tmpcr2); + + /* Write to TIMx CCMR2 */ + LL_TIM_WriteReg(TIMx, CCMR2, tmpccmr2); + + /* Set the Capture Compare Register value */ + LL_TIM_OC_SetCompareCH4(TIMx, TIM_OCInitStruct->CompareValue); + + /* Write to TIMx CCER */ + LL_TIM_WriteReg(TIMx, CCER, tmpccer); + + return SUCCESS; +} + + +/** + * @brief Configure the TIMx input channel 1. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 1 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC1Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC1E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR1, + (TIM_CCMR1_CC1S | TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); + + /* Select the Polarity and set the CC1E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC1P | TIM_CCER_CC1NP), + (TIM_ICInitStruct->ICPolarity | TIM_CCER_CC1E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 2. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 2 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC2Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC2E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR1, + (TIM_CCMR1_CC2S | TIM_CCMR1_IC2F | TIM_CCMR1_IC2PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); + + /* Select the Polarity and set the CC2E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC2P | TIM_CCER_CC2NP), + ((TIM_ICInitStruct->ICPolarity << 4U) | TIM_CCER_CC2E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 3. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 3 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC3Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC3E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR2, + (TIM_CCMR2_CC3S | TIM_CCMR2_IC3F | TIM_CCMR2_IC3PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 16U); + + /* Select the Polarity and set the CC3E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC3P | TIM_CCER_CC3NP), + ((TIM_ICInitStruct->ICPolarity << 8U) | TIM_CCER_CC3E)); + + return SUCCESS; +} + +/** + * @brief Configure the TIMx input channel 4. + * @param TIMx Timer Instance + * @param TIM_ICInitStruct pointer to the the TIMx input channel 4 configuration data structure + * @retval An ErrorStatus enumeration value: + * - SUCCESS: TIMx registers are de-initialized + * - ERROR: not applicable + */ +static ErrorStatus IC4Config(TIM_TypeDef *TIMx, LL_TIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(TIMx)); + assert_param(IS_LL_TIM_IC_POLARITY(TIM_ICInitStruct->ICPolarity)); + assert_param(IS_LL_TIM_ACTIVEINPUT(TIM_ICInitStruct->ICActiveInput)); + assert_param(IS_LL_TIM_ICPSC(TIM_ICInitStruct->ICPrescaler)); + assert_param(IS_LL_TIM_IC_FILTER(TIM_ICInitStruct->ICFilter)); + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCER &= (uint32_t)~TIM_CCER_CC4E; + + /* Select the Input and set the filter and the prescaler value */ + MODIFY_REG(TIMx->CCMR2, + (TIM_CCMR2_CC4S | TIM_CCMR2_IC4F | TIM_CCMR2_IC4PSC), + (TIM_ICInitStruct->ICActiveInput | TIM_ICInitStruct->ICFilter | TIM_ICInitStruct->ICPrescaler) >> 8U); + + /* Select the Polarity and set the CC2E Bit */ + MODIFY_REG(TIMx->CCER, + (TIM_CCER_CC4P | TIM_CCER_CC4NP), + ((TIM_ICInitStruct->ICPolarity << 12U) | TIM_CCER_CC4E)); + + return SUCCESS; +} + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* TIM1 || TIM2 || TIM3 || TIM4 || TIM5 || TIM6 || TIM7 || TIM8 || TIM9 || TIM10 || TIM11 || TIM12 || TIM13 || TIM14 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usart.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usart.c new file mode 100644 index 0000000..00cc5f3 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usart.c @@ -0,0 +1,513 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_usart.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief USART LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +#if defined(USE_FULL_LL_DRIVER) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_usart.h" +#include "stm32f4xx_ll_rcc.h" +#include "stm32f4xx_ll_bus.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART6) || defined (UART4) || defined (UART5) || defined (UART7) || defined (UART8) || defined (UART9) || defined (UART10) + +/** @addtogroup USART_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup USART_LL_Private_Constants + * @{ + */ + +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup USART_LL_Private_Macros + * @{ + */ + +/* __BAUDRATE__ The maximum Baud Rate is derived from the maximum clock available + * divided by the smallest oversampling used on the USART (i.e. 8) */ +#define IS_LL_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 10000000U) + +#define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + +#define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) + +#define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + +#define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + +#define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + +#define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + +#define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + +#define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + +#define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) + +#define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup USART_LL_Exported_Functions + * @{ + */ + +/** @addtogroup USART_LL_EF_Init + * @{ + */ + +/** + * @brief De-initialize USART registers (Registers restored to their default values). + * @param USARTx USART Instance + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers are de-initialized + * - ERROR: USART registers are not de-initialized + */ +ErrorStatus LL_USART_DeInit(USART_TypeDef *USARTx) +{ + ErrorStatus status = SUCCESS; + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + + if (USARTx == USART1) + { + /* Force reset of USART clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART1); + + /* Release reset of USART clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART1); + } + else if (USARTx == USART2) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART2); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART2); + } +#if defined(USART3) + else if (USARTx == USART3) + { + /* Force reset of USART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART3); + + /* Release reset of USART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART3); + } +#endif /* USART3 */ +#if defined(USART6) + else if (USARTx == USART6) + { + /* Force reset of USART clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART6); + + /* Release reset of USART clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART6); + } +#endif /* USART6 */ +#if defined(UART4) + else if (USARTx == UART4) + { + /* Force reset of UART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART4); + + /* Release reset of UART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART4); + } +#endif /* UART4 */ +#if defined(UART5) + else if (USARTx == UART5) + { + /* Force reset of UART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART5); + + /* Release reset of UART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART5); + } +#endif /* UART5 */ +#if defined(UART7) + else if (USARTx == UART7) + { + /* Force reset of UART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART7); + + /* Release reset of UART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART7); + } +#endif /* UART7 */ +#if defined(UART8) + else if (USARTx == UART8) + { + /* Force reset of UART clock */ + LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART8); + + /* Release reset of UART clock */ + LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART8); + } +#endif /* UART8 */ +#if defined(UART9) + else if (USARTx == UART9) + { + /* Force reset of UART clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_UART9); + + /* Release reset of UART clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_UART9); + } +#endif /* UART9 */ +#if defined(UART10) + else if (USARTx == UART10) + { + /* Force reset of UART clock */ + LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_UART10); + + /* Release reset of UART clock */ + LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_UART10); + } +#endif /* UART10 */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Initialize USART registers according to the specified + * parameters in USART_InitStruct. + * @note As some bits in USART configuration registers can only be written when the USART is disabled (USART_CR1_UE bit =0), + * USART IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @note Baud rate value stored in USART_InitStruct BaudRate field, should be valid (different from 0). + * @param USARTx USART Instance + * @param USART_InitStruct: pointer to a LL_USART_InitTypeDef structure + * that contains the configuration information for the specified USART peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers are initialized according to USART_InitStruct content + * - ERROR: Problem occurred during USART Registers initialization + */ +ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct) +{ + ErrorStatus status = ERROR; + uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO; + LL_RCC_ClocksTypeDef rcc_clocks; + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + assert_param(IS_LL_USART_BAUDRATE(USART_InitStruct->BaudRate)); + assert_param(IS_LL_USART_DATAWIDTH(USART_InitStruct->DataWidth)); + assert_param(IS_LL_USART_STOPBITS(USART_InitStruct->StopBits)); + assert_param(IS_LL_USART_PARITY(USART_InitStruct->Parity)); + assert_param(IS_LL_USART_DIRECTION(USART_InitStruct->TransferDirection)); + assert_param(IS_LL_USART_HWCONTROL(USART_InitStruct->HardwareFlowControl)); + assert_param(IS_LL_USART_OVERSAMPLING(USART_InitStruct->OverSampling)); + + /* USART needs to be in disabled state, in order to be able to configure some bits in + CRx registers */ + if (LL_USART_IsEnabled(USARTx) == 0U) + { + /*---------------------------- USART CR1 Configuration ----------------------- + * Configure USARTx CR1 (USART Word Length, Parity, Mode and Oversampling bits) with parameters: + * - DataWidth: USART_CR1_M bits according to USART_InitStruct->DataWidth value + * - Parity: USART_CR1_PCE, USART_CR1_PS bits according to USART_InitStruct->Parity value + * - TransferDirection: USART_CR1_TE, USART_CR1_RE bits according to USART_InitStruct->TransferDirection value + * - Oversampling: USART_CR1_OVER8 bit according to USART_InitStruct->OverSampling value. + */ + MODIFY_REG(USARTx->CR1, + (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | + USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), + (USART_InitStruct->DataWidth | USART_InitStruct->Parity | + USART_InitStruct->TransferDirection | USART_InitStruct->OverSampling)); + + /*---------------------------- USART CR2 Configuration ----------------------- + * Configure USARTx CR2 (Stop bits) with parameters: + * - Stop Bits: USART_CR2_STOP bits according to USART_InitStruct->StopBits value. + * - CLKEN, CPOL, CPHA and LBCL bits are to be configured using LL_USART_ClockInit(). + */ + LL_USART_SetStopBitsLength(USARTx, USART_InitStruct->StopBits); + + /*---------------------------- USART CR3 Configuration ----------------------- + * Configure USARTx CR3 (Hardware Flow Control) with parameters: + * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according to USART_InitStruct->HardwareFlowControl value. + */ + LL_USART_SetHWFlowCtrl(USARTx, USART_InitStruct->HardwareFlowControl); + + /*---------------------------- USART BRR Configuration ----------------------- + * Retrieve Clock frequency used for USART Peripheral + */ + LL_RCC_GetSystemClocksFreq(&rcc_clocks); + if (USARTx == USART1) + { + periphclk = rcc_clocks.PCLK2_Frequency; + } + else if (USARTx == USART2) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#if defined(USART3) + else if (USARTx == USART3) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* USART3 */ +#if defined(USART6) + else if (USARTx == USART6) + { + periphclk = rcc_clocks.PCLK2_Frequency; + } +#endif /* USART6 */ +#if defined(UART4) + else if (USARTx == UART4) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART4 */ +#if defined(UART5) + else if (USARTx == UART5) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART5 */ +#if defined(UART7) + else if (USARTx == UART7) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART7 */ +#if defined(UART8) + else if (USARTx == UART8) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART8 */ +#if defined(UART9) + else if (USARTx == UART9) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART9 */ +#if defined(UART10) + else if (USARTx == UART5) + { + periphclk = rcc_clocks.PCLK1_Frequency; + } +#endif /* UART10 */ + else + { + /* Nothing to do, as error code is already assigned to ERROR value */ + } + + /* Configure the USART Baud Rate : + - valid baud rate value (different from 0) is required + - Peripheral clock as returned by RCC service, should be valid (different from 0). + */ + if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO) + && (USART_InitStruct->BaudRate != 0U)) + { + status = SUCCESS; + LL_USART_SetBaudRate(USARTx, + periphclk, + USART_InitStruct->OverSampling, + USART_InitStruct->BaudRate); + } + } + /* Endif (=> USART not in Disabled state => return ERROR) */ + + return (status); +} + +/** + * @brief Set each @ref LL_USART_InitTypeDef field to default value. + * @param USART_InitStruct: pointer to a @ref LL_USART_InitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ + +void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct) +{ + /* Set USART_InitStruct fields to default values */ + USART_InitStruct->BaudRate = 9600U; + USART_InitStruct->DataWidth = LL_USART_DATAWIDTH_8B; + USART_InitStruct->StopBits = LL_USART_STOPBITS_1; + USART_InitStruct->Parity = LL_USART_PARITY_NONE ; + USART_InitStruct->TransferDirection = LL_USART_DIRECTION_TX_RX; + USART_InitStruct->HardwareFlowControl = LL_USART_HWCONTROL_NONE; + USART_InitStruct->OverSampling = LL_USART_OVERSAMPLING_16; +} + +/** + * @brief Initialize USART Clock related settings according to the + * specified parameters in the USART_ClockInitStruct. + * @note As some bits in USART configuration registers can only be written when the USART is disabled (USART_CR1_UE bit =0), + * USART IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned. + * @param USARTx USART Instance + * @param USART_ClockInitStruct: pointer to a @ref LL_USART_ClockInitTypeDef structure + * that contains the Clock configuration information for the specified USART peripheral. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: USART registers related to Clock settings are initialized according to USART_ClockInitStruct content + * - ERROR: Problem occurred during USART Registers initialization + */ +ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + ErrorStatus status = SUCCESS; + + /* Check USART Instance and Clock signal output parameters */ + assert_param(IS_UART_INSTANCE(USARTx)); + assert_param(IS_LL_USART_CLOCKOUTPUT(USART_ClockInitStruct->ClockOutput)); + + /* USART needs to be in disabled state, in order to be able to configure some bits in + CRx registers */ + if (LL_USART_IsEnabled(USARTx) == 0U) + { + /*---------------------------- USART CR2 Configuration -----------------------*/ + /* If Clock signal has to be output */ + if (USART_ClockInitStruct->ClockOutput == LL_USART_CLOCK_DISABLE) + { + /* Deactivate Clock signal delivery : + * - Disable Clock Output: USART_CR2_CLKEN cleared + */ + LL_USART_DisableSCLKOutput(USARTx); + } + else + { + /* Ensure USART instance is USART capable */ + assert_param(IS_USART_INSTANCE(USARTx)); + + /* Check clock related parameters */ + assert_param(IS_LL_USART_CLOCKPOLARITY(USART_ClockInitStruct->ClockPolarity)); + assert_param(IS_LL_USART_CLOCKPHASE(USART_ClockInitStruct->ClockPhase)); + assert_param(IS_LL_USART_LASTBITCLKOUTPUT(USART_ClockInitStruct->LastBitClockPulse)); + + /*---------------------------- USART CR2 Configuration ----------------------- + * Configure USARTx CR2 (Clock signal related bits) with parameters: + * - Enable Clock Output: USART_CR2_CLKEN set + * - Clock Polarity: USART_CR2_CPOL bit according to USART_ClockInitStruct->ClockPolarity value + * - Clock Phase: USART_CR2_CPHA bit according to USART_ClockInitStruct->ClockPhase value + * - Last Bit Clock Pulse Output: USART_CR2_LBCL bit according to USART_ClockInitStruct->LastBitClockPulse value. + */ + MODIFY_REG(USARTx->CR2, + USART_CR2_CLKEN | USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, + USART_CR2_CLKEN | USART_ClockInitStruct->ClockPolarity | + USART_ClockInitStruct->ClockPhase | USART_ClockInitStruct->LastBitClockPulse); + } + } + /* Else (USART not in Disabled state => return ERROR */ + else + { + status = ERROR; + } + + return (status); +} + +/** + * @brief Set each field of a @ref LL_USART_ClockInitTypeDef type structure to default value. + * @param USART_ClockInitStruct: pointer to a @ref LL_USART_ClockInitTypeDef structure + * whose fields will be set to default values. + * @retval None + */ +void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + /* Set LL_USART_ClockInitStruct fields with default values */ + USART_ClockInitStruct->ClockOutput = LL_USART_CLOCK_DISABLE; + USART_ClockInitStruct->ClockPolarity = LL_USART_POLARITY_LOW; /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */ + USART_ClockInitStruct->ClockPhase = LL_USART_PHASE_1EDGE; /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */ + USART_ClockInitStruct->LastBitClockPulse = LL_USART_LASTCLKPULSE_NO_OUTPUT; /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */ +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */ + +/** + * @} + */ + +#endif /* USE_FULL_LL_DRIVER */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c index c9f449e..7491fee 100644 --- a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_ll_usb.c * @author MCD Application Team - * @version V1.6.0 - * @date 04-November-2016 + * @version V1.7.1 + * @date 14-April-2017 * @brief USB Low Layer HAL module driver. * * This file provides firmware functions to manage the following @@ -28,7 +28,7 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

© COPYRIGHT(c) 2017 STMicroelectronics

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -135,6 +135,7 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c if(cfg.dma_enable == ENABLE) { + USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2; USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; } @@ -220,17 +221,20 @@ HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; } #else - USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; - if (cfg.vbus_sensing_enable == 0U) { USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; } + else + { + /* Enable VBUS */ + USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; + } #endif /* STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */ - + /* Restart the Phy Clock */ USBx_PCGCCTL = 0U; - + /* Device mode configuration */ USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80; @@ -346,13 +350,13 @@ HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c */ HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num ) { - uint32_t count = 0U; - + uint32_t count = 0; + USBx->GRSTCTL = ( USB_OTG_GRSTCTL_TXFFLSH |(uint32_t)( num << 6)); - + do { - if (++count > 200000U) + if (++count > 200000) { return HAL_TIMEOUT; } @@ -370,13 +374,13 @@ HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num ) */ HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) { - uint32_t count = 0U; + uint32_t count = 0; USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; do { - if (++count > 200000U) + if (++count > 200000) { return HAL_TIMEOUT; } @@ -515,18 +519,65 @@ HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB */ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) { - /* Read DEPCTLn register */ + uint32_t count = 0U; + + /* Disable the IN endpoint */ if (ep->is_in == 1U) { - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)))); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)))); - USBx_INEP(ep->num)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; + USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_USBAEP; + + /* sets the NAK bit for the IN endpoint */ + USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; + + /* Disable IN endpoint */ + USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + + /*Wait for EPDISD endpoint disabled interrupt*/ + while ((USBx_INEP(ep->num)->DIEPINT & USB_OTG_DIEPCTL_EPDIS) == USB_OTG_DIEPCTL_EPDIS); + + + /* Flush any data remaining in the TxFIFO */ + USB_FlushTxFifo(USBx , 0x10U); + + /* Disable endpoint interrupts */ + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)))); + } - else + else /* Disable the OUT endpoint */ { - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U)); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U)); - USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; + + USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; + + /* sets the NAK bit for the OUT endpoint */ + USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; + + /* Disable OUT endpoint */ + USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + + /*Wait for EPDISD endpoint disabled interrupt*/ + while ((USBx_OUTEP(ep->num)->DOEPINT & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS); + + /* Set the "Clear the Global OUT NAK bit" to disable global OUT NAK mode */ + USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK; + + /* Disable endpoint interrupts */ + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U)); } return HAL_OK; } @@ -539,18 +590,68 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP */ HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) { - /* Read DEPCTLn register */ + uint32_t count = 0U; + + /* Disable the IN endpoint */ if (ep->is_in == 1U) { - USBx_INEP(ep->num)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)))); + USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_USBAEP; + + /* sets the NAK bit for the IN endpoint */ + USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; + + /* Disable IN endpoint */ + USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + + /*Wait for EPDISD endpoint disabled interrupt*/ + while ((USBx_INEP(ep->num)->DIEPINT & USB_OTG_DIEPCTL_EPDIS) == USB_OTG_DIEPCTL_EPDIS); + + + /* Flush any data remaining in the TxFIFO */ + USB_FlushTxFifo(USBx , 0x10U); + + /* Disable endpoint interrupts */ + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)))); + } - else + else /* Disable the OUT endpoint */ { - USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U)); + + USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; + + /* sets the NAK bit for the OUT endpoint */ + USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; + + /* Disable OUT endpoint */ + USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + + /*Wait for EPDISD endpoint disabled interrupt*/ + while ((USBx_OUTEP(ep->num)->DOEPINT & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS); + + /* Set the "Clear the Global OUT NAK bit" to disable global OUT NAK mode */ + USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK; + + /* Disable endpoint interrupts */ + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U)); } return HAL_OK; + } /** @@ -716,6 +817,9 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeD } + /* EP enable, IN data in FIFO */ + USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + if (dma == 1) { USBx_INEP(ep->num)->DIEPDMA = (uint32_t)(ep->dma_addr); @@ -728,10 +832,8 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeD USBx_DEVICE->DIEPEMPMSK |= 1U << (ep->num); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } + else /* OUT endpoint */ { /* Program the transfer size and packet count as follows: @@ -1183,14 +1285,14 @@ HAL_StatusTypeDef USB_HostInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef if(USBx == USB_OTG_FS) { /* set Rx FIFO size */ - USBx->GRXFSIZ = (uint32_t )0x80U; + USBx->GRXFSIZ = 0x80U; USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x60U << 16U)& USB_OTG_NPTXFD) | 0x80U); USBx->HPTXFSIZ = (uint32_t )(((0x40U << 16U)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U); } else { /* set Rx FIFO size */ - USBx->GRXFSIZ = (uint32_t )0x200U; + USBx->GRXFSIZ = 0x200U; USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x100U << 16U)& USB_OTG_NPTXFD) | 0x200U); USBx->HPTXFSIZ = (uint32_t )(((0xE0U << 16U)& USB_OTG_HPTXFSIZ_PTXFD) | 0x300U); } @@ -1226,11 +1328,11 @@ HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx , uint8_t freq if (freq == HCFG_48_MHZ) { - USBx_HOST->HFIR = (uint32_t)48000U; + USBx_HOST->HFIR = 48000U; } else if (freq == HCFG_6_MHZ) { - USBx_HOST->HFIR = (uint32_t)6000U; + USBx_HOST->HFIR = 6000U; } return HAL_OK; } @@ -1442,20 +1544,20 @@ HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, #endif /* __CC_ARM */ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma) { - uint8_t is_oddframe = 0U; - uint16_t len_words = 0U; - uint16_t num_packets = 0U; - uint16_t max_hc_pkt_count = 256U; + uint8_t is_oddframe = 0; + uint16_t len_words = 0; + uint16_t num_packets = 0; + uint16_t max_hc_pkt_count = 256; uint32_t tmpreg = 0U; if((USBx != USB_OTG_FS) && (hc->speed == USB_OTG_SPEED_HIGH)) { - if((dma == 0U) && (hc->do_ping == 1U)) + if((dma == 0) && (hc->do_ping == 1U)) { USB_DoPing(USBx, hc->ch_num); return HAL_OK; } - else if(dma == 1U) + else if(dma == 1) { USBx_HC(hc->ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM); hc->do_ping = 0U; @@ -1475,7 +1577,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe } else { - num_packets = 1U; + num_packets = 1; } if (hc->ep_is_in) { @@ -1493,9 +1595,9 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe USBx_HC(hc->ch_num)->HCDMA = (uint32_t)hc->xfer_buff; } - is_oddframe = (USBx_HOST->HFNUM & 0x01U) ? 0U : 1U; + is_oddframe = (USBx_HOST->HFNUM & 0x01) ? 0 : 1; USBx_HC(hc->ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; - USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29U); + USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29); /* Set host channel enable */ tmpreg = USBx_HC(hc->ch_num)->HCCHAR; @@ -1503,7 +1605,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe tmpreg |= USB_OTG_HCCHAR_CHENA; USBx_HC(hc->ch_num)->HCCHAR = tmpreg; - if (dma == 0U) /* Slave mode */ + if (dma == 0) /* Slave mode */ { if((hc->ep_is_in == 0U) && (hc->xfer_len > 0U)) { @@ -1513,10 +1615,10 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe case EP_TYPE_CTRL: case EP_TYPE_BULK: - len_words = (hc->xfer_len + 3U) / 4U; + len_words = (hc->xfer_len + 3) / 4; /* check if there is enough space in FIFO space */ - if(len_words > (USBx->HNPTXSTS & 0xFFFFU)) + if(len_words > (USBx->HNPTXSTS & 0xFFFF)) { /* need to process data in nptxfempty interrupt */ USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; @@ -1525,9 +1627,9 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe /* Periodic transfer */ case EP_TYPE_INTR: case EP_TYPE_ISOC: - len_words = (hc->xfer_len + 3U) / 4U; + len_words = (hc->xfer_len + 3) / 4; /* check if there is enough space in FIFO space */ - if(len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */ + if(len_words > (USBx_HOST->HPTXSTS & 0xFFFF)) /* split the transfer */ { /* need to process data in ptxfempty interrupt */ USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; @@ -1659,7 +1761,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) USB_FlushRxFifo(USBx); /* Flush out any leftover queued requests. */ - for (i = 0U; i <= 15U; i++) + for (i = 0; i <= 15; i++) { value = USBx_HC(i)->HCCHAR ; @@ -1670,7 +1772,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) } /* Halt all channels to put them into a known state. */ - for (i = 0U; i <= 15U; i++) + for (i = 0; i <= 15; i++) { value = USBx_HC(i)->HCCHAR ; diff --git a/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_utils.c b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_utils.c new file mode 100644 index 0000000..4808212 --- /dev/null +++ b/system/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_utils.c @@ -0,0 +1,758 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_utils.c + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief UTILS LL module driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_ll_utils.h" +#include "stm32f4xx_ll_rcc.h" +#include "stm32f4xx_ll_system.h" +#include "stm32f4xx_ll_pwr.h" +#ifdef USE_FULL_ASSERT +#include "stm32_assert.h" +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @addtogroup UTILS_LL + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Private_Constants + * @{ + */ +#if defined(RCC_MAX_FREQUENCY_SCALE1) +#define UTILS_MAX_FREQUENCY_SCALE1 RCC_MAX_FREQUENCY /*!< Maximum frequency for system clock at power scale1, in Hz */ +#endif /*RCC_MAX_FREQUENCY_SCALE1 */ +#define UTILS_MAX_FREQUENCY_SCALE2 RCC_MAX_FREQUENCY_SCALE2 /*!< Maximum frequency for system clock at power scale2, in Hz */ +#if defined(RCC_MAX_FREQUENCY_SCALE3) +#define UTILS_MAX_FREQUENCY_SCALE3 RCC_MAX_FREQUENCY_SCALE3 /*!< Maximum frequency for system clock at power scale3, in Hz */ +#endif /* MAX_FREQUENCY_SCALE3 */ + +/* Defines used for PLL range */ +#define UTILS_PLLVCO_INPUT_MIN RCC_PLLVCO_INPUT_MIN /*!< Frequency min for PLLVCO input, in Hz */ +#define UTILS_PLLVCO_INPUT_MAX RCC_PLLVCO_INPUT_MAX /*!< Frequency max for PLLVCO input, in Hz */ +#define UTILS_PLLVCO_OUTPUT_MIN RCC_PLLVCO_OUTPUT_MIN /*!< Frequency min for PLLVCO output, in Hz */ +#define UTILS_PLLVCO_OUTPUT_MAX RCC_PLLVCO_OUTPUT_MAX /*!< Frequency max for PLLVCO output, in Hz */ + +/* Defines used for HSE range */ +#define UTILS_HSE_FREQUENCY_MIN 4000000U /*!< Frequency min for HSE frequency, in Hz */ +#define UTILS_HSE_FREQUENCY_MAX 26000000U /*!< Frequency max for HSE frequency, in Hz */ + +/* Defines used for FLASH latency according to HCLK Frequency */ +#if defined(FLASH_SCALE1_LATENCY1_FREQ) +#define UTILS_SCALE1_LATENCY1_FREQ FLASH_SCALE1_LATENCY1_FREQ /*!< HCLK frequency to set FLASH latency 1 in power scale 1 */ +#endif +#if defined(FLASH_SCALE1_LATENCY2_FREQ) +#define UTILS_SCALE1_LATENCY2_FREQ FLASH_SCALE1_LATENCY2_FREQ /*!< HCLK frequency to set FLASH latency 2 in power scale 1 */ +#endif +#if defined(FLASH_SCALE1_LATENCY3_FREQ) +#define UTILS_SCALE1_LATENCY3_FREQ FLASH_SCALE1_LATENCY3_FREQ /*!< HCLK frequency to set FLASH latency 3 in power scale 1 */ +#endif +#if defined(FLASH_SCALE1_LATENCY4_FREQ) +#define UTILS_SCALE1_LATENCY4_FREQ FLASH_SCALE1_LATENCY4_FREQ /*!< HCLK frequency to set FLASH latency 4 in power scale 1 */ +#endif +#if defined(FLASH_SCALE1_LATENCY5_FREQ) +#define UTILS_SCALE1_LATENCY5_FREQ FLASH_SCALE1_LATENCY5_FREQ /*!< HCLK frequency to set FLASH latency 5 in power scale 1 */ +#endif +#define UTILS_SCALE2_LATENCY1_FREQ FLASH_SCALE2_LATENCY1_FREQ /*!< HCLK frequency to set FLASH latency 1 in power scale 2 */ +#define UTILS_SCALE2_LATENCY2_FREQ FLASH_SCALE2_LATENCY2_FREQ /*!< HCLK frequency to set FLASH latency 2 in power scale 2 */ +#if defined(FLASH_SCALE2_LATENCY3_FREQ) +#define UTILS_SCALE2_LATENCY3_FREQ FLASH_SCALE2_LATENCY3_FREQ /*!< HCLK frequency to set FLASH latency 2 in power scale 2 */ +#endif +#if defined(FLASH_SCALE2_LATENCY4_FREQ) +#define UTILS_SCALE2_LATENCY4_FREQ FLASH_SCALE2_LATENCY4_FREQ /*!< HCLK frequency to set FLASH latency 4 in power scale 2 */ +#endif +#if defined(FLASH_SCALE2_LATENCY5_FREQ) +#define UTILS_SCALE2_LATENCY5_FREQ FLASH_SCALE2_LATENCY5_FREQ /*!< HCLK frequency to set FLASH latency 5 in power scale 2 */ +#endif +#if defined(FLASH_SCALE3_LATENCY1_FREQ) +#define UTILS_SCALE3_LATENCY1_FREQ FLASH_SCALE3_LATENCY1_FREQ /*!< HCLK frequency to set FLASH latency 1 in power scale 3 */ +#endif +#if defined(FLASH_SCALE3_LATENCY2_FREQ) +#define UTILS_SCALE3_LATENCY2_FREQ FLASH_SCALE3_LATENCY2_FREQ /*!< HCLK frequency to set FLASH latency 2 in power scale 3 */ +#endif +#if defined(FLASH_SCALE3_LATENCY3_FREQ) +#define UTILS_SCALE3_LATENCY3_FREQ FLASH_SCALE3_LATENCY3_FREQ /*!< HCLK frequency to set FLASH latency 3 in power scale 3 */ +#endif +#if defined(FLASH_SCALE3_LATENCY4_FREQ) +#define UTILS_SCALE3_LATENCY4_FREQ FLASH_SCALE3_LATENCY4_FREQ /*!< HCLK frequency to set FLASH latency 4 in power scale 3 */ +#endif +#if defined(FLASH_SCALE3_LATENCY5_FREQ) +#define UTILS_SCALE3_LATENCY5_FREQ FLASH_SCALE3_LATENCY5_FREQ /*!< HCLK frequency to set FLASH latency 5 in power scale 3 */ +#endif +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Private_Macros + * @{ + */ +#define IS_LL_UTILS_SYSCLK_DIV(__VALUE__) (((__VALUE__) == LL_RCC_SYSCLK_DIV_1) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_2) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_4) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_8) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_16) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_64) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_128) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_256) \ + || ((__VALUE__) == LL_RCC_SYSCLK_DIV_512)) + +#define IS_LL_UTILS_APB1_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB1_DIV_1) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_2) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_4) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_8) \ + || ((__VALUE__) == LL_RCC_APB1_DIV_16)) + +#define IS_LL_UTILS_APB2_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB2_DIV_1) \ + || ((__VALUE__) == LL_RCC_APB2_DIV_2) \ + || ((__VALUE__) == LL_RCC_APB2_DIV_4) \ + || ((__VALUE__) == LL_RCC_APB2_DIV_8) \ + || ((__VALUE__) == LL_RCC_APB2_DIV_16)) + +#define IS_LL_UTILS_PLLM_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLM_DIV_2) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_3) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_4) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_5) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_6) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_7) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_8) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_9) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_10) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_11) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_12) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_13) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_14) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_15) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_16) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_17) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_18) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_19) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_20) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_21) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_22) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_23) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_24) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_25) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_26) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_27) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_28) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_29) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_30) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_31) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_32) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_33) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_34) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_35) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_36) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_37) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_38) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_39) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_40) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_41) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_42) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_43) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_44) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_45) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_46) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_47) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_48) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_49) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_50) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_51) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_52) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_53) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_54) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_55) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_56) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_57) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_58) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_59) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_60) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_61) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_62) \ + || ((__VALUE__) == LL_RCC_PLLM_DIV_63)) + +#define IS_LL_UTILS_PLLN_VALUE(__VALUE__) ((RCC_PLLN_MIN_VALUE <= (__VALUE__)) && ((__VALUE__) <= RCC_PLLN_MAX_VALUE)) + +#define IS_LL_UTILS_PLLP_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLP_DIV_2) \ + || ((__VALUE__) == LL_RCC_PLLP_DIV_4) \ + || ((__VALUE__) == LL_RCC_PLLP_DIV_6) \ + || ((__VALUE__) == LL_RCC_PLLP_DIV_8)) + +#define IS_LL_UTILS_PLLVCO_INPUT(__VALUE__) ((UTILS_PLLVCO_INPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_INPUT_MAX)) + +#define IS_LL_UTILS_PLLVCO_OUTPUT(__VALUE__) ((UTILS_PLLVCO_OUTPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_MAX)) + +#if !defined(RCC_MAX_FREQUENCY_SCALE1) +#define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2) : \ + ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE3)) + +#elif defined(RCC_MAX_FREQUENCY_SCALE3) +#define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \ + (LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2) : \ + ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE3)) + +#else +#define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \ + ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2)) + +#endif /* RCC_MAX_FREQUENCY_SCALE1*/ +#define IS_LL_UTILS_HSE_BYPASS(__STATE__) (((__STATE__) == LL_UTILS_HSEBYPASS_ON) \ + || ((__STATE__) == LL_UTILS_HSEBYPASS_OFF)) + +#define IS_LL_UTILS_HSE_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) >= UTILS_HSE_FREQUENCY_MIN) && ((__FREQUENCY__) <= UTILS_HSE_FREQUENCY_MAX)) +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Functions UTILS Private functions + * @{ + */ +static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct); +static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency); +static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +static ErrorStatus UTILS_PLL_IsBusy(void); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UTILS_LL_Exported_Functions + * @{ + */ + +/** @addtogroup UTILS_LL_EF_DELAY + * @{ + */ + +/** + * @brief This function configures the Cortex-M SysTick source to have 1ms time base. + * @note When a RTOS is used, it is recommended to avoid changing the Systick + * configuration by calling this function, for a delay use rather osDelay RTOS service. + * @param HCLKFrequency HCLK frequency in Hz + * @note HCLK frequency can be calculated thanks to RCC helper macro or function @ref LL_RCC_GetSystemClocksFreq + * @retval None + */ +void LL_Init1msTick(uint32_t HCLKFrequency) +{ + /* Use frequency provided in argument */ + LL_InitTick(HCLKFrequency, 1000U); +} + +/** + * @brief This function provides accurate delay (in milliseconds) based + * on SysTick counter flag + * @note When a RTOS is used, it is recommended to avoid using blocking delay + * and use rather osDelay service. + * @note To respect 1ms timebase, user should call @ref LL_Init1msTick function which + * will configure Systick to 1ms + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +void LL_mDelay(uint32_t Delay) +{ + __IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */ + /* Add this code to indicate that local variable is not used */ + ((void)tmp); + + /* Add a period to guaranty minimum wait */ + if(Delay < LL_MAX_DELAY) + { + Delay++; + } + + while (Delay) + { + if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U) + { + Delay--; + } + } +} + +/** + * @} + */ + +/** @addtogroup UTILS_EF_SYSTEM + * @brief System Configuration functions + * + @verbatim + =============================================================================== + ##### System Configuration functions ##### + =============================================================================== + [..] + System, AHB and APB buses clocks configuration + + (+) The maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 is 180000000 Hz. + @endverbatim + @internal + Depending on the device voltage range, the maximum frequency should be + adapted accordingly to the Refenece manual. + @endinternal + * @{ + */ + +/** + * @brief This function sets directly SystemCoreClock CMSIS variable. + * @note Variable can be calculated also through SystemCoreClockUpdate function. + * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) + * @retval None + */ +void LL_SetSystemCoreClock(uint32_t HCLKFrequency) +{ + /* HCLK clock frequency */ + SystemCoreClock = HCLKFrequency; +} + +/** + * @brief This function configures system clock at maximum frequency with HSI as clock source of the PLL + * @note The application need to ensure that PLL is disabled. + * @note Function is based on the following formula: + * - PLL output frequency = (((HSI frequency / PLLM) * PLLN) / PLLP) + * - PLLM: ensure that the VCO input frequency ranges from @ref RCC_PLLVCO_INPUT_MIN to @ref RCC_PLLVCO_INPUT_MAX (PLLVCO_input = HSI frequency / PLLM) + * - PLLN: ensure that the VCO output frequency is between @ref RCC_PLLVCO_OUTPUT_MIN and @ref RCC_PLLVCO_OUTPUT_MAX (PLLVCO_output = PLLVCO_input * PLLN) + * - PLLP: ensure that max frequency at 180000000 Hz is reach (PLLVCO_output / PLLP) + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Max frequency configuration done + * - ERROR: Max frequency configuration not done + */ +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status = SUCCESS; + uint32_t pllfreq = 0U; + + /* Check if one of the PLL is enabled */ + if(UTILS_PLL_IsBusy() == SUCCESS) + { + /* Calculate the new PLL output frequency */ + pllfreq = UTILS_GetPLLOutputFrequency(HSI_VALUE, UTILS_PLLInitStruct); + + /* Enable HSI if not enabled */ + if(LL_RCC_HSI_IsReady() != 1U) + { + LL_RCC_HSI_Enable(); + while (LL_RCC_HSI_IsReady() != 1U) + { + /* Wait for HSI ready */ + } + } + + /* Configure PLL */ + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN, + UTILS_PLLInitStruct->PLLP); + + /* Enable PLL and switch system clock to PLL */ + status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); + } + else + { + /* Current PLL configuration cannot be modified */ + status = ERROR; + } + + return status; +} + +/** + * @brief This function configures system clock with HSE as clock source of the PLL + * @note The application need to ensure that PLL is disabled. + * - PLL output frequency = (((HSI frequency / PLLM) * PLLN) / PLLP) + * - PLLM: ensure that the VCO input frequency ranges from @ref RCC_PLLVCO_INPUT_MIN to @ref RCC_PLLVCO_INPUT_MAX (PLLVCO_input = HSI frequency / PLLM) + * - PLLN: ensure that the VCO output frequency is between @ref RCC_PLLVCO_OUTPUT_MIN and @ref RCC_PLLVCO_OUTPUT_MAX (PLLVCO_output = PLLVCO_input * PLLN) + * - PLLP: ensure that max frequency at 180000000 Hz is reach (PLLVCO_output / PLLP) + * @param HSEFrequency Value between Min_Data = 4000000 and Max_Data = 26000000 + * @param HSEBypass This parameter can be one of the following values: + * @arg @ref LL_UTILS_HSEBYPASS_ON + * @arg @ref LL_UTILS_HSEBYPASS_OFF + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Max frequency configuration done + * - ERROR: Max frequency configuration not done + */ +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status = SUCCESS; + uint32_t pllfreq = 0U; + + /* Check the parameters */ + assert_param(IS_LL_UTILS_HSE_FREQUENCY(HSEFrequency)); + assert_param(IS_LL_UTILS_HSE_BYPASS(HSEBypass)); + + /* Check if one of the PLL is enabled */ + if(UTILS_PLL_IsBusy() == SUCCESS) + { + /* Calculate the new PLL output frequency */ + pllfreq = UTILS_GetPLLOutputFrequency(HSEFrequency, UTILS_PLLInitStruct); + + /* Enable HSE if not enabled */ + if(LL_RCC_HSE_IsReady() != 1U) + { + /* Check if need to enable HSE bypass feature or not */ + if(HSEBypass == LL_UTILS_HSEBYPASS_ON) + { + LL_RCC_HSE_EnableBypass(); + } + else + { + LL_RCC_HSE_DisableBypass(); + } + + /* Enable HSE */ + LL_RCC_HSE_Enable(); + while (LL_RCC_HSE_IsReady() != 1U) + { + /* Wait for HSE ready */ + } + } + + /* Configure PLL */ + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN, + UTILS_PLLInitStruct->PLLP); + + /* Enable PLL and switch system clock to PLL */ + status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct); + } + else + { + /* Current PLL configuration cannot be modified */ + status = ERROR; + } + + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup UTILS_LL_Private_Functions + * @{ + */ +/** + * @brief Update number of Flash wait states in line with new frequency and current + voltage range. + * @note This Function support ONLY devices with supply voltage (voltage range) between 2.7V and 3.6V + * @param HCLK_Frequency HCLK frequency + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Latency has been modified + * - ERROR: Latency cannot be modified + */ +static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency) +{ + ErrorStatus status = SUCCESS; + + uint32_t latency = LL_FLASH_LATENCY_0; /* default value 0WS */ + + /* Frequency cannot be equal to 0 */ + if(HCLK_Frequency == 0U) + { + status = ERROR; + } + else + { + if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) + { +#if defined (UTILS_SCALE1_LATENCY5_FREQ) + if((HCLK_Frequency > UTILS_SCALE1_LATENCY5_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_5; + } +#endif /*UTILS_SCALE1_LATENCY5_FREQ */ +#if defined (UTILS_SCALE1_LATENCY4_FREQ) + if((HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_4; + } +#endif /* UTILS_SCALE1_LATENCY4_FREQ */ +#if defined (UTILS_SCALE1_LATENCY3_FREQ) + if((HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_3; + } +#endif /* UTILS_SCALE1_LATENCY3_FREQ */ +#if defined (UTILS_SCALE1_LATENCY2_FREQ) + if((HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_2; + } + else + { + if((HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_1; + } + } +#endif /* UTILS_SCALE1_LATENCY2_FREQ */ + } + if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) + { +#if defined (UTILS_SCALE2_LATENCY5_FREQ) + if((HCLK_Frequency > UTILS_SCALE2_LATENCY5_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_5; + } +#endif /*UTILS_SCALE1_LATENCY5_FREQ */ +#if defined (UTILS_SCALE2_LATENCY4_FREQ) + if((HCLK_Frequency > UTILS_SCALE2_LATENCY4_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_4; + } +#endif /*UTILS_SCALE1_LATENCY4_FREQ */ +#if defined (UTILS_SCALE2_LATENCY3_FREQ) + if((HCLK_Frequency > UTILS_SCALE2_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_3; + } +#endif /*UTILS_SCALE1_LATENCY3_FREQ */ + if((HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_2; + } + else + { + if((HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_1; + } + } + } +#if defined (LL_PWR_REGU_VOLTAGE_SCALE3) + if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE3) + { +#if defined (UTILS_SCALE3_LATENCY3_FREQ) + if((HCLK_Frequency > UTILS_SCALE3_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_3; + } +#endif /*UTILS_SCALE1_LATENCY3_FREQ */ +#if defined (UTILS_SCALE3_LATENCY2_FREQ) + if((HCLK_Frequency > UTILS_SCALE3_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_2; + } + else + { + if((HCLK_Frequency > UTILS_SCALE3_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0)) + { + latency = LL_FLASH_LATENCY_1; + } + } + } +#endif /*UTILS_SCALE1_LATENCY2_FREQ */ +#endif /* LL_PWR_REGU_VOLTAGE_SCALE3 */ + + LL_FLASH_SetLatency(latency); + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(LL_FLASH_GetLatency() != latency) + { + status = ERROR; + } + } + return status; +} + +/** + * @brief Function to check that PLL can be modified + * @param PLL_InputFrequency PLL input frequency (in Hz) + * @param UTILS_PLLInitStruct pointer to a @ref LL_UTILS_PLLInitTypeDef structure that contains + * the configuration information for the PLL. + * @retval PLL output frequency (in Hz) + */ +static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct) +{ + uint32_t pllfreq = 0U; + + /* Check the parameters */ + assert_param(IS_LL_UTILS_PLLM_VALUE(UTILS_PLLInitStruct->PLLM)); + assert_param(IS_LL_UTILS_PLLN_VALUE(UTILS_PLLInitStruct->PLLN)); + assert_param(IS_LL_UTILS_PLLP_VALUE(UTILS_PLLInitStruct->PLLP)); + + /* Check different PLL parameters according to RM */ + /* - PLLM: ensure that the VCO input frequency ranges from @ref UTILS_PLLVCO_INPUT_MIN to @ref UTILS_PLLVCO_INPUT_MAX MHz. */ + pllfreq = PLL_InputFrequency / (UTILS_PLLInitStruct->PLLM & (RCC_PLLCFGR_PLLM >> RCC_PLLCFGR_PLLM_Pos)); + assert_param(IS_LL_UTILS_PLLVCO_INPUT(pllfreq)); + + /* - PLLN: ensure that the VCO output frequency is between @ref UTILS_PLLVCO_OUTPUT_MIN and @ref UTILS_PLLVCO_OUTPUT_MAX .*/ + pllfreq = pllfreq * (UTILS_PLLInitStruct->PLLN & (RCC_PLLCFGR_PLLN >> RCC_PLLCFGR_PLLN_Pos)); + assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq)); + + /* - PLLP: ensure that max frequency at @ref RCC_MAX_FREQUENCY Hz is reached */ + pllfreq = pllfreq / (((UTILS_PLLInitStruct->PLLP >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); + assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq)); + + return pllfreq; +} + +/** + * @brief Function to check that PLL can be modified + * @retval An ErrorStatus enumeration value: + * - SUCCESS: PLL modification can be done + * - ERROR: PLL is busy + */ +static ErrorStatus UTILS_PLL_IsBusy(void) +{ + ErrorStatus status = SUCCESS; + + /* Check if PLL is busy*/ + if(LL_RCC_PLL_IsReady() != 0U) + { + /* PLL configuration cannot be modified */ + status = ERROR; + } + +#if defined(RCC_PLLSAI_SUPPORT) + /* Check if PLLSAI is busy*/ + if(LL_RCC_PLLSAI_IsReady() != 0U) + { + /* PLLSAI1 configuration cannot be modified */ + status = ERROR; + } +#endif /*RCC_PLLSAI_SUPPORT*/ +#if defined(RCC_PLLI2S_SUPPORT) + /* Check if PLLI2S is busy*/ + if(LL_RCC_PLLI2S_IsReady() != 0U) + { + /* PLLI2S configuration cannot be modified */ + status = ERROR; + } +#endif /*RCC_PLLI2S_SUPPORT*/ + return status; +} + +/** + * @brief Function to enable PLL and switch system clock to PLL + * @param SYSCLK_Frequency SYSCLK frequency + * @param UTILS_ClkInitStruct pointer to a @ref LL_UTILS_ClkInitTypeDef structure that contains + * the configuration information for the BUS prescalers. + * @retval An ErrorStatus enumeration value: + * - SUCCESS: No problem to switch system to PLL + * - ERROR: Problem to switch system to PLL + */ +static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct) +{ + ErrorStatus status = SUCCESS; + uint32_t hclk_frequency = 0U; + + assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider)); + assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider)); + assert_param(IS_LL_UTILS_APB2_DIV(UTILS_ClkInitStruct->APB2CLKDivider)); + + /* Calculate HCLK frequency */ + hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider); + + /* Increasing the number of wait states because of higher CPU frequency */ + if(SystemCoreClock < hclk_frequency) + { + /* Set FLASH latency to highest latency */ + status = UTILS_SetFlashLatency(hclk_frequency); + } + + /* Update system clock configuration */ + if(status == SUCCESS) + { + /* Enable PLL */ + LL_RCC_PLL_Enable(); + while (LL_RCC_PLL_IsReady() != 1U) + { + /* Wait for PLL ready */ + } + + /* Sysclk activation on the main PLL */ + LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + /* Wait for system clock switch to PLL */ + } + + /* Set APB1 & APB2 prescaler*/ + LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider); + LL_RCC_SetAPB2Prescaler(UTILS_ClkInitStruct->APB2CLKDivider); + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if(SystemCoreClock > hclk_frequency) + { + /* Set FLASH latency to lowest latency */ + status = UTILS_SetFlashLatency(hclk_frequency); + } + + /* Update SystemCoreClock variable */ + if(status == SUCCESS) + { + LL_SetSystemCoreClock(hclk_frequency); + } + + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c b/system/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c index d72f0df..2efc3ca 100644 --- a/system/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c +++ b/system/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c @@ -661,12 +661,12 @@ static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) +static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData; PCD_HandleTypeDef *hpcd = pdev->pData; USB_OTG_EPTypeDef *ep; - + if(pdev->pClassData != NULL) { ep = &hpcd->IN_ep[epnum]; @@ -674,13 +674,14 @@ static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { /* Send ZLP */ USBD_LL_Transmit (pdev, epnum, NULL, 0); - } else + } + else { - hcdc->TxState = 0; + hcdc->TxState = 0; } - return USBD_OK; - } else + } + else { return USBD_FAIL; } diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Inc/usbh_audio.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Inc/usbh_audio.h deleted file mode 100644 index 5632ae3..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Inc/usbh_audio.h +++ /dev/null @@ -1,594 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_audio.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_audio.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_AUDIO_H -#define __USBH_AUDIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_AUDIO_CLASS - * @{ - */ - -/** @defgroup USBH_AUDIO_CORE - * @brief This file is the Header file for usbh_audio.c - * @{ - */ - - -/** @defgroup USBH_AUDIO_CORE_Exported_Types - * @{ - */ - -/* States for AUDIO State Machine */ -typedef enum -{ - AUDIO_INIT = 0, - AUDIO_IDLE, - AUDIO_CS_REQUESTS, - AUDIO_SET_DEFAULT_FEATURE_UNIT, - AUDIO_SET_INTERFACE, - AUDIO_SET_STREAMING_INTERFACE, - AUDIO_SET_CUR1, - AUDIO_GET_MIN, - AUDIO_GET_MAX, - AUDIO_GET_RES, - AUDIO_GET_CUR1, - AUDIO_SET_CUR2, - AUDIO_GET_CUR2, - AUDIO_SET_CUR3, - AUDIO_SET_INTERFACE0, - AUDIO_SET_INTERFACE1, - AUDIO_SET_INTERFACE2, - AUDIO_ISOC_OUT, - AUDIO_ISOC_IN, - AUDIO_ISOC_POLL, - AUDIO_ERROR, -} -AUDIO_StateTypeDef; - -typedef enum -{ - AUDIO_REQ_INIT = 1, - AUDIO_REQ_IDLE, - AUDIO_REQ_SET_DEFAULT_IN_INTERFACE, - AUDIO_REQ_SET_DEFAULT_OUT_INTERFACE, - AUDIO_REQ_SET_IN_INTERFACE, - AUDIO_REQ_SET_OUT_INTERFACE, - AUDIO_REQ_CS_REQUESTS, -} -AUDIO_ReqStateTypeDef; - -typedef enum -{ - AUDIO_REQ_SET_VOLUME = 1, - AUDIO_REQ_SET_MUTE, - AUDIO_REQ_GET_CURR_VOLUME, - AUDIO_REQ_GET_MIN_VOLUME, - AUDIO_REQ_GET_MAX_VOLUME, - AUDIO_REQ_GET_VOLUME, - AUDIO_REQ_GET_RESOLUTION, - AUDIO_REQ_CS_IDLE, -} -AUDIO_CSReqStateTypeDef; - -typedef enum -{ - AUDIO_PLAYBACK_INIT = 1, - AUDIO_PLAYBACK_SET_EP, - AUDIO_PLAYBACK_SET_EP_FREQ, - AUDIO_PLAYBACK_PLAY, - AUDIO_PLAYBACK_IDLE, -} -AUDIO_PlayStateTypeDef; - -typedef enum -{ - VOLUME_UP = 1, - VOLUME_DOWN = 2, -} -AUDIO_VolumeCtrlTypeDef; - -typedef enum -{ - AUDIO_CONTROL_INIT = 1, - AUDIO_CONTROL_CHANGE, - AUDIO_CONTROL_IDLE, - AUDIO_CONTROL_VOLUME_UP, - AUDIO_CONTROL_VOLUME_DOWN, -} -AUDIO_ControlStateTypeDef; - - -typedef enum -{ - AUDIO_DATA_START_OUT = 1, - AUDIO_DATA_OUT, -} -AUDIO_ProcessingTypeDef; - -/* Structure for AUDIO process */ -typedef struct -{ - uint8_t Channels; - uint8_t Bits; - uint32_t SampleRate; -} -AUDIO_FormatTypeDef; - -typedef struct -{ - uint8_t Ep; - uint16_t EpSize; - uint8_t AltSettings; - uint8_t interface; - uint8_t valid; - uint16_t Poll; -} -AUDIO_STREAMING_IN_HandleTypeDef; - -typedef struct -{ - uint8_t Ep; - uint16_t EpSize; - uint8_t AltSettings; - uint8_t interface; - uint8_t valid; - uint16_t Poll; -} -AUDIO_STREAMING_OUT_HandleTypeDef; - - -typedef struct -{ - uint8_t mute; - uint32_t volumeMin; - uint32_t volumeMax; - uint32_t volume; - uint32_t resolution; -} -AUDIO_ControlAttributeTypeDef; - -typedef struct -{ - - uint8_t Ep; - uint16_t EpSize; - uint8_t interface; - uint8_t AltSettings; - uint8_t supported; - - uint8_t Pipe; - uint8_t Poll; - uint32_t timer ; - - uint8_t asociated_as; - uint8_t asociated_mixer; - uint8_t asociated_selector; - uint8_t asociated_feature; - uint8_t asociated_terminal; - uint8_t asociated_channels; - - uint32_t frequency; - uint8_t *buf; - uint8_t *cbuf; - uint32_t partial_ptr; - - uint32_t global_ptr; - uint16_t frame_length; - uint32_t total_length; - - AUDIO_ControlAttributeTypeDef attribute; -} -AUDIO_InterfaceStreamPropTypeDef; - -typedef struct -{ - - uint8_t Ep; - uint16_t EpSize; - uint8_t interface; - uint8_t supported; - - uint8_t Pipe; - uint8_t Poll; - uint32_t timer ; -} -AUDIO_InterfaceControlPropTypeDef; - - -#define AUDIO_MAX_AUDIO_STD_INTERFACE 0x05 -#define AUDIO_MAX_FREQ_SUPPORTED 0x05 -#define AUDIO_MAX_STREAMING_INTERFACE 0x05 -#define AUDIO_MAX_NUM_IN_TERMINAL 0x04 -#define AUDIO_MAX_NUM_OUT_TERMINAL 0x04 -#define AUDIO_MAX_NUM_FEATURE_UNIT 0x04 -#define AUDIO_MAX_NUM_MIXER_UNIT 0x04 -#define AUDIO_MAX_NUM_SELECTOR_UNIT 0x04 - -#define HEADPHONE_SUPPORTED 0x01 -#define MICROPHONE_SUPPORTED 0x02 -#define HEADSET_SUPPORTED 0x03 - -#define AUDIO_MAX_SAMFREQ_NBR 5 -#define AUDIO_MAX_INTERFACE_NBR 5 -#define AUDIO_MAX_CONTROLS_NBR 5 - -/*Class-Specific AS(Audio Streaming) Interface Descriptor*/ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalLink; - uint8_t bDelay; - uint8_t wFormatTag[2]; -} -AUDIO_ASGeneralDescTypeDef; - -/*Class-Specific AS(Audio Streaming) Format Type Descriptor*/ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bFormatType; - uint8_t bNrChannels; - uint8_t bSubframeSize; - uint8_t bBitResolution; - uint8_t bSamFreqType; - uint8_t tSamFreq[AUDIO_MAX_SAMFREQ_NBR][3]; -} -AUDIO_ASFormatTypeDescTypeDef; - -/*Class-Specific AS(Audio Streaming) Interface Descriptor*/ -typedef struct -{ - AUDIO_ASGeneralDescTypeDef *GeneralDesc; - AUDIO_ASFormatTypeDescTypeDef *FormatTypeDesc; -} -AUDIO_ASDescTypeDef; - -/* 4.3.2 Class-Specific AC Interface Descriptor */ - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bcdADC[2]; - uint8_t wTotalLength[2]; - uint8_t bInCollection; - uint8_t baInterfaceNr[AUDIO_MAX_INTERFACE_NBR]; -} -AUDIO_HeaderDescTypeDef; - -/* 4.3.2.1 Input Terminal Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint8_t wTerminalType[2]; - uint8_t bAssocTerminal; - uint8_t bNrChannels; - uint8_t wChannelConfig[2]; - uint8_t iChannelNames; - uint8_t iTerminal; -} -AUDIO_ITDescTypeDef; - -/* 4.3.2.2 Output Terminal Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint8_t wTerminalType[2]; - uint8_t bAssocTerminal; - uint8_t bSourceID; - uint8_t iTerminal; -} -AUDIO_OTDescTypeDef; - -/* 4.3.2.3 Feature Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bSourceID; - uint8_t bControlSize; - uint8_t bmaControls[AUDIO_MAX_CONTROLS_NBR][2]; -} -AUDIO_FeatureDescTypeDef; - - -/* 4.3.2.3 Feature Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bNrInPins; - uint8_t bSourceID0; - uint8_t bSourceID1; - uint8_t bNrChannels; - uint8_t bmChannelsConfig[2]; - uint8_t iChannelsNames; - uint8_t bmaControls; - uint8_t iMixer; -} -AUDIO_MixerDescTypeDef; - - - -/* 4.3.2.3 Feature Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bNrInPins; - uint8_t bSourceID0; - uint8_t iSelector; -} -AUDIO_SelectorDescTypeDef; - -/*Class-Specific AC(Audio Control) Interface Descriptor*/ -typedef struct -{ - AUDIO_HeaderDescTypeDef *HeaderDesc; - AUDIO_ITDescTypeDef *InputTerminalDesc [AUDIO_MAX_NUM_IN_TERMINAL]; - AUDIO_OTDescTypeDef *OutputTerminalDesc[AUDIO_MAX_NUM_OUT_TERMINAL]; - AUDIO_FeatureDescTypeDef *FeatureUnitDesc [AUDIO_MAX_NUM_FEATURE_UNIT]; - AUDIO_MixerDescTypeDef *MixerUnitDesc [AUDIO_MAX_NUM_MIXER_UNIT]; - AUDIO_SelectorDescTypeDef *SelectorUnitDesc [AUDIO_MAX_NUM_SELECTOR_UNIT]; -} -AUDIO_ACDescTypeDef; - -/*Class-Specific AC : Global descriptor*/ - -typedef struct -{ - AUDIO_ACDescTypeDef cs_desc; /* Only one control descriptor*/ - AUDIO_ASDescTypeDef as_desc[AUDIO_MAX_STREAMING_INTERFACE]; - - uint16_t ASNum; - uint16_t InputTerminalNum; - uint16_t OutputTerminalNum; - uint16_t FeatureUnitNum; - uint16_t SelectorUnitNum; - uint16_t MixerUnitNum; -} -AUDIO_ClassSpecificDescTypedef; - - -typedef struct _AUDIO_Process -{ - AUDIO_ReqStateTypeDef req_state; - AUDIO_CSReqStateTypeDef cs_req_state; - AUDIO_PlayStateTypeDef play_state; - AUDIO_ControlStateTypeDef control_state; - AUDIO_ProcessingTypeDef processing_state; - - AUDIO_STREAMING_IN_HandleTypeDef stream_in[AUDIO_MAX_AUDIO_STD_INTERFACE]; - AUDIO_STREAMING_OUT_HandleTypeDef stream_out[AUDIO_MAX_AUDIO_STD_INTERFACE]; - AUDIO_ClassSpecificDescTypedef class_desc; - - AUDIO_InterfaceStreamPropTypeDef headphone; - AUDIO_InterfaceStreamPropTypeDef microphone; - AUDIO_InterfaceControlPropTypeDef control; - uint16_t mem [8]; - uint8_t temp_feature; - uint8_t temp_channels; -} -AUDIO_HandleTypeDef; - -/** - * @} - */ - -/** @defgroup USBH_AUDIO_CORE_Exported_Defines - * @{ - */ - - -/*Audio Interface Subclass Codes*/ -#define AC_CLASS 0x01 - -/* A.2 Audio Interface Subclass Codes */ -#define USB_SUBCLASS_AUDIOCONTROL 0x01 -#define USB_SUBCLASS_AUDIOSTREAMING 0x02 -#define USB_SUBCLASS_MIDISTREAMING 0x03 - -#define USB_DESC_TYPE_CS_INTERFACE 0x24 -#define USB_DESC_TYPE_CS_ENDPOINT 0x25 - -/* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */ -#define UAC_HEADER 0x01 -#define UAC_INPUT_TERMINAL 0x02 -#define UAC_OUTPUT_TERMINAL 0x03 -#define UAC_MIXER_UNIT 0x04 -#define UAC_SELECTOR_UNIT 0x05 -#define UAC_FEATURE_UNIT 0x06 -#define UAC_PROCESSING_UNIT 0x07 -#define UAC_EXTENSION_UNIT 0x08 - -/*Audio Class-Specific Endpoint Descriptor Subtypes*/ -#define EP_CONTROL_UNDEFINED 0x00 -#define SAMPLING_FREQ_CONTROL 0x01 -#define PITCH_CONTROL 0x02 - -/*Feature unit control selector*/ -#define FU_CONTROL_UNDEFINED 0x00 -#define MUTE_CONTROL 0x01 -#define VOLUME_CONTROL 0x02 -#define BASS_CONTROL 0x03 -#define MID_CONTROL 0x04 -#define TREBLE_CONTROL 0x05 -#define GRAPHIC_EQUALIZER_CONTROL 0x06 -#define AUTOMATIC_GAIN_CONTROL 0x07 -#define DELAY_CONTROL 0x08 -#define BASS_BOOST_CONTROL 0x09 -#define LOUDNESS_CONTROL 0x0A - -/*Terminal control selector*/ -#define TE_CONTROL_UNDEFINED 0x00 -#define COPY_PROTECT_CONTROL 0x01 - - -/* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ -#define UAC_AS_GENERAL 0x01 -#define UAC_FORMAT_TYPE 0x02 -#define UAC_FORMAT_SPECIFIC 0x03 - -/* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */ -#define UAC_EP_GENERAL 0x01 - -/* A.9 Audio Class-Specific Request Codes */ -#define UAC_SET_ 0x00 -#define UAC_GET_ 0x80 - -#define UAC__CUR 0x1 -#define UAC__MIN 0x2 -#define UAC__MAX 0x3 -#define UAC__RES 0x4 -#define UAC__MEM 0x5 - -#define UAC_SET_CUR (UAC_SET_ | UAC__CUR) -#define UAC_GET_CUR (UAC_GET_ | UAC__CUR) -#define UAC_SET_MIN (UAC_SET_ | UAC__MIN) -#define UAC_GET_MIN (UAC_GET_ | UAC__MIN) -#define UAC_SET_MAX (UAC_SET_ | UAC__MAX) -#define UAC_GET_MAX (UAC_GET_ | UAC__MAX) -#define UAC_SET_RES (UAC_SET_ | UAC__RES) -#define UAC_GET_RES (UAC_GET_ | UAC__RES) -#define UAC_SET_MEM (UAC_SET_ | UAC__MEM) -#define UAC_GET_MEM (UAC_GET_ | UAC__MEM) - -#define UAC_GET_STAT 0xff - -/* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */ -#define UAC_MS_HEADER 0x01 -#define UAC_MIDI_IN_JACK 0x02 -#define UAC_MIDI_OUT_JACK 0x03 - -/* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */ -#define UAC_MS_GENERAL 0x01 - -/* Terminals - 2.1 USB Terminal Types */ -#define UAC_TERMINAL_UNDEFINED 0x100 -#define UAC_TERMINAL_STREAMING 0x101 -#define UAC_TERMINAL_VENDOR_SPEC 0x1FF - -/** - * @} - */ - -/** @defgroup USBH_AUDIO_CORE_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_AUDIO_CORE_Exported_Variables - * @{ - */ -extern USBH_ClassTypeDef AUDIO_Class; -#define USBH_AUDIO_CLASS &AUDIO_Class -/** - * @} - */ - -/** @defgroup USBH_AUDIO_CORE_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_AUDIO_SetFrequency (USBH_HandleTypeDef *phost, - uint16_t sample_rate, - uint8_t channel_num, - uint8_t data_width); - -USBH_StatusTypeDef USBH_AUDIO_Play (USBH_HandleTypeDef *phost, uint8_t *buf, uint32_t length); -USBH_StatusTypeDef USBH_AUDIO_Stop (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_AUDIO_Suspend (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_AUDIO_Resume (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_AUDIO_SetVolume (USBH_HandleTypeDef *phost, AUDIO_VolumeCtrlTypeDef volume_ctl); -USBH_StatusTypeDef USBH_AUDIO_ChangeOutBuffer (USBH_HandleTypeDef *phost, uint8_t *buf); -int32_t USBH_AUDIO_GetOutOffset (USBH_HandleTypeDef *phost); - -void USBH_AUDIO_FrequencySet(USBH_HandleTypeDef *phost); - -#define USBH_AUDIO_FrequencySetCallback USBH_AUDIO_FrequencySet -void USBH_AUDIO_BufferEmptyCallback(USBH_HandleTypeDef *phost); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_AUDIO_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Src/usbh_audio.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Src/usbh_audio.c deleted file mode 100644 index 6e965ff..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/AUDIO/Src/usbh_audio.c +++ /dev/null @@ -1,2024 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_audio.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the AC Layer Handlers for USB Host AC class. - * - * @verbatim - * - * =================================================================== - * AUDIO Class Description - * =================================================================== - * This driver manages the Audio Class 1.0 following the "USB Device - * Class Definition for Audio Devices V1.0 Mar 18, 98". - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_audio.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_AUDIO_CLASS - * @{ - */ - -/** @defgroup USBH_AUDIO_CORE - * @brief This file includes HID Layer Handlers for USB Host HID class. - * @{ - */ - -/** @defgroup USBH_AUDIO_CORE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_AUDIO_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_AUDIO_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_AUDIO_CORE_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_AUDIO_CORE_Private_FunctionPrototypes - * @{ - */ - -static USBH_StatusTypeDef USBH_AUDIO_InterfaceInit (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_InterfaceDeInit (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_Process(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_SOFProcess(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_ClassRequest(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_CSRequest(USBH_HandleTypeDef *phost, - uint8_t feature, - uint8_t channel); - -static USBH_StatusTypeDef USBH_AUDIO_HandleCSRequest(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_AUDIO_FindAudioStreamingIN(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_FindAudioStreamingOUT(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_FindHIDControl(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_ParseCSDescriptors(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_AUDIO_BuildHeadphonePath(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_BuildMicrophonePath(USBH_HandleTypeDef *phost); -int32_t USBH_AUDIO_FindLinkedUnitIN(USBH_HandleTypeDef *phost, uint8_t UnitID); -int32_t USBH_AUDIO_FindLinkedUnitOUT(USBH_HandleTypeDef *phost, uint8_t UnitID); - - - -static USBH_StatusTypeDef ParseCSDescriptors(AUDIO_ClassSpecificDescTypedef *class_desc, - uint8_t ac_subclass, - uint8_t *pdesc); - - -static USBH_StatusTypeDef USBH_AUDIO_Transmit (USBH_HandleTypeDef *phost); - - -static USBH_StatusTypeDef USBH_AC_SetCur(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length); - -static USBH_StatusTypeDef USBH_AC_GetCur(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length); - -static USBH_StatusTypeDef USBH_AC_GetMin(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length); - -static USBH_StatusTypeDef USBH_AC_GetMax(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length); - -static USBH_StatusTypeDef USBH_AC_GetRes(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length); - -static USBH_StatusTypeDef USBH_AUDIO_SetEndpointControls(USBH_HandleTypeDef *phost, - uint8_t Ep, - uint8_t *buff); - -static USBH_StatusTypeDef AUDIO_SetVolume (USBH_HandleTypeDef *phost, uint8_t feature, uint8_t channel, uint16_t volume); - -static USBH_StatusTypeDef USBH_AUDIO_InputStream (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_OutputStream (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_Control (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_AUDIO_SetControlAttribute (USBH_HandleTypeDef *phost, uint8_t attrib); -static int32_t USBH_AUDIO_FindLinkedUnit(USBH_HandleTypeDef *phost, uint8_t UnitID); - -USBH_ClassTypeDef AUDIO_Class = -{ - "AUDIO", - AC_CLASS, - USBH_AUDIO_InterfaceInit, - USBH_AUDIO_InterfaceDeInit, - USBH_AUDIO_ClassRequest, - USBH_AUDIO_Process, - USBH_AUDIO_SOFProcess, - NULL, -}; - -/** - * @} - */ - -/** @defgroup USBH_AUDIO_CORE_Private_Functions - * @{ - */ - -/** - * @brief USBH_AUDIO_InterfaceInit - * The function init the Audio class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_InterfaceInit (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_FAIL ; - USBH_StatusTypeDef out_status, in_status ; - AUDIO_HandleTypeDef *AUDIO_Handle; - uint8_t interface, index; - uint16_t ep_size_out = 0; - uint16_t ep_size_in = 0; - - interface = USBH_FindInterface(phost, AC_CLASS, USB_SUBCLASS_AUDIOCONTROL, 0x00); - - if(interface == 0xFF) /* Not Valid Interface */ - { - USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name); - status = USBH_FAIL; - } - else - { - - - phost->pActiveClass->pData = (AUDIO_HandleTypeDef *)USBH_malloc (sizeof(AUDIO_HandleTypeDef)); - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - USBH_memset(AUDIO_Handle, 0, sizeof(AUDIO_HandleTypeDef)); - - - /* 1st Step: Find Audio Interfaces */ - out_status = USBH_AUDIO_FindAudioStreamingIN (phost); - - in_status = USBH_AUDIO_FindAudioStreamingOUT(phost); - - if((out_status == USBH_FAIL) && (in_status == USBH_FAIL)) - { - USBH_DbgLog ("%s class configuration not supported.", phost->pActiveClass->Name); - } - else - { - /* 2nd Step: Select Audio Streaming Interfaces with largest endpoint size : default behavior*/ - for (index = 0; index < AUDIO_MAX_AUDIO_STD_INTERFACE; index ++) - { - if( AUDIO_Handle->stream_out[index].valid == 1) - { - if(ep_size_out < AUDIO_Handle->stream_out[index].EpSize) - { - ep_size_out = AUDIO_Handle->stream_out[index].EpSize; - AUDIO_Handle->headphone.interface = AUDIO_Handle->stream_out[index].interface; - AUDIO_Handle->headphone.AltSettings = AUDIO_Handle->stream_out[index].AltSettings; - AUDIO_Handle->headphone.Ep = AUDIO_Handle->stream_out[index].Ep; - AUDIO_Handle->headphone.EpSize = AUDIO_Handle->stream_out[index].EpSize; - AUDIO_Handle->headphone.Poll = AUDIO_Handle->stream_out[index].Poll; - AUDIO_Handle->headphone.supported = 1; - } - } - - if( AUDIO_Handle->stream_in[index].valid == 1) - { - if(ep_size_in < AUDIO_Handle->stream_in[index].EpSize) - { - ep_size_in = AUDIO_Handle->stream_in[index].EpSize; - AUDIO_Handle->microphone.interface = AUDIO_Handle->stream_in[index].interface; - AUDIO_Handle->microphone.AltSettings = AUDIO_Handle->stream_in[index].AltSettings; - AUDIO_Handle->microphone.Ep = AUDIO_Handle->stream_in[index].Ep; - AUDIO_Handle->microphone.EpSize = AUDIO_Handle->stream_in[index].EpSize; - AUDIO_Handle->microphone.Poll = AUDIO_Handle->stream_out[index].Poll; - AUDIO_Handle->microphone.supported = 1; - } - } - } - - if(USBH_AUDIO_FindHIDControl(phost) == USBH_OK) - { - AUDIO_Handle->control.supported = 1; - } - - /* 3rd Step: Find and Parse Audio interfaces */ - USBH_AUDIO_ParseCSDescriptors (phost); - - - /* 4th Step: Open the Audio streaming pipes*/ - if(AUDIO_Handle->headphone.supported == 1) - { - USBH_AUDIO_BuildHeadphonePath (phost); - - AUDIO_Handle->headphone.Pipe = USBH_AllocPipe(phost, AUDIO_Handle->headphone.Ep); - - /* Open pipe for IN endpoint */ - USBH_OpenPipe (phost, - AUDIO_Handle->headphone.Pipe, - AUDIO_Handle->headphone.Ep, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_ISOC, - AUDIO_Handle->headphone.EpSize); - - USBH_LL_SetToggle (phost, AUDIO_Handle->headphone.Pipe, 0); - - } - - if(AUDIO_Handle->microphone.supported == 1) - { - USBH_AUDIO_BuildMicrophonePath (phost); - AUDIO_Handle->microphone.Pipe = USBH_AllocPipe(phost, AUDIO_Handle->microphone.Ep); - - /* Open pipe for IN endpoint */ - USBH_OpenPipe (phost, - AUDIO_Handle->microphone.Pipe, - AUDIO_Handle->microphone.Ep, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_ISOC, - AUDIO_Handle->microphone.EpSize); - - USBH_LL_SetToggle (phost, AUDIO_Handle->microphone.Pipe, 0); - } - - if(AUDIO_Handle->control.supported == 1) - { - AUDIO_Handle->control.Pipe = USBH_AllocPipe(phost, AUDIO_Handle->control.Ep); - - /* Open pipe for IN endpoint */ - USBH_OpenPipe (phost, - AUDIO_Handle->control.Pipe, - AUDIO_Handle->control.Ep, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_INTR, - AUDIO_Handle->control.EpSize); - - USBH_LL_SetToggle (phost, AUDIO_Handle->control.Pipe, 0); - - } - - AUDIO_Handle->req_state = AUDIO_REQ_INIT; - AUDIO_Handle->control_state = AUDIO_CONTROL_INIT; - - status = USBH_OK; - } - } - return status; -} - - - -/** - * @brief USBH_AUDIO_InterfaceDeInit - * The function DeInit the Pipes used for the Audio class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - if(AUDIO_Handle->microphone.Pipe != 0x00) - { - USBH_ClosePipe (phost, AUDIO_Handle->microphone.Pipe); - USBH_FreePipe (phost, AUDIO_Handle->microphone.Pipe); - AUDIO_Handle->microphone.Pipe = 0; /* Reset the pipe as Free */ - } - - if( AUDIO_Handle->headphone.Pipe != 0x00) - { - USBH_ClosePipe(phost, AUDIO_Handle->headphone.Pipe); - USBH_FreePipe (phost, AUDIO_Handle->headphone.Pipe); - AUDIO_Handle->headphone.Pipe = 0; /* Reset the pipe as Free */ - } - - if( AUDIO_Handle->control.Pipe != 0x00) - { - USBH_ClosePipe(phost, AUDIO_Handle->control.Pipe); - USBH_FreePipe (phost, AUDIO_Handle->control.Pipe); - AUDIO_Handle->control.Pipe = 0; /* Reset the pipe as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - phost->pActiveClass->pData = 0; - } - return USBH_OK ; -} - -/** - * @brief USBH_AUDIO_ClassRequest - * The function is responsible for handling Standard requests - * for Audio class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_ClassRequest(USBH_HandleTypeDef *phost) -{ - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef req_status = USBH_BUSY; - - /* Switch AUDIO REQ state machine */ - switch (AUDIO_Handle->req_state) - { - case AUDIO_REQ_INIT: - case AUDIO_REQ_SET_DEFAULT_IN_INTERFACE: - if(AUDIO_Handle->microphone.supported == 1) - { - req_status = USBH_SetInterface(phost, - AUDIO_Handle->microphone.interface, - 0); - - if(req_status == USBH_OK) - { - AUDIO_Handle->req_state = AUDIO_REQ_SET_DEFAULT_OUT_INTERFACE; - } - - } - else - { - AUDIO_Handle->req_state = AUDIO_REQ_SET_DEFAULT_OUT_INTERFACE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case AUDIO_REQ_SET_DEFAULT_OUT_INTERFACE: - if(AUDIO_Handle->headphone.supported == 1) - { - req_status = USBH_SetInterface(phost, - AUDIO_Handle->headphone.interface, - 0); - - if(req_status == USBH_OK) - { - AUDIO_Handle->req_state = AUDIO_REQ_CS_REQUESTS; - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_VOLUME; - - AUDIO_Handle->temp_feature = AUDIO_Handle->headphone.asociated_feature; - AUDIO_Handle->temp_channels = AUDIO_Handle->headphone.asociated_channels; - } - } - else - { - AUDIO_Handle->req_state = AUDIO_REQ_CS_REQUESTS; - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_VOLUME; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case AUDIO_REQ_CS_REQUESTS: - if(USBH_AUDIO_HandleCSRequest (phost) == USBH_OK) - { - AUDIO_Handle->req_state = AUDIO_REQ_SET_IN_INTERFACE; - } - break; - - case AUDIO_REQ_SET_IN_INTERFACE: - if(AUDIO_Handle->microphone.supported == 1) - { - req_status = USBH_SetInterface(phost, - AUDIO_Handle->microphone.interface, - AUDIO_Handle->microphone.AltSettings); - - if(req_status == USBH_OK) - { - AUDIO_Handle->req_state = AUDIO_REQ_SET_OUT_INTERFACE; - } - } - else - { - AUDIO_Handle->req_state = AUDIO_REQ_SET_OUT_INTERFACE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - case AUDIO_REQ_SET_OUT_INTERFACE: - if(AUDIO_Handle->headphone.supported == 1) - { - req_status = USBH_SetInterface(phost, - AUDIO_Handle->headphone.interface, - AUDIO_Handle->headphone.AltSettings); - - if(req_status == USBH_OK) - { - AUDIO_Handle->req_state = AUDIO_REQ_IDLE; - } - - } - else - { - AUDIO_Handle->req_state = AUDIO_REQ_IDLE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - case AUDIO_REQ_IDLE: - AUDIO_Handle->play_state = AUDIO_PLAYBACK_INIT; - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - default: - break; - } - return status; -} - -/** - * @brief USBH_AUDIO_CSRequest - * The function is responsible for handling AC Specific requests for a specific feature and channel - * for Audio class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_CSRequest(USBH_HandleTypeDef *phost, uint8_t feature, uint8_t channel) -{ - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef req_status = USBH_BUSY; - - /* Switch AUDIO REQ state machine */ - switch (AUDIO_Handle->cs_req_state) - { - case AUDIO_REQ_GET_VOLUME: - req_status = USBH_AC_GetCur(phost, - UAC_FEATURE_UNIT, /* subtype */ - feature, /* feature */ - VOLUME_CONTROL, /* Selector */ - channel, /* channel */ - 0x02); /* length */ - if(req_status != USBH_BUSY) - { - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_MIN_VOLUME; - AUDIO_Handle->headphone.attribute.volume = LE16(&(AUDIO_Handle->mem[0])); - } - break; - - case AUDIO_REQ_GET_MIN_VOLUME: - req_status = USBH_AC_GetMin(phost, - UAC_FEATURE_UNIT, /* subtype */ - feature, /* feature */ - VOLUME_CONTROL, /* Selector */ - channel, /* channel */ - 0x02); /* length */ - if(req_status != USBH_BUSY) - { - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_MAX_VOLUME; - AUDIO_Handle->headphone.attribute.volumeMin = LE16(&AUDIO_Handle->mem[0]); - } - break; - - case AUDIO_REQ_GET_MAX_VOLUME: - req_status = USBH_AC_GetMax(phost, - UAC_FEATURE_UNIT, /* subtype */ - feature, /* feature */ - VOLUME_CONTROL, /* Selector */ - channel, /* channel */ - 0x02); /* length */ - if(req_status != USBH_BUSY) - { - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_RESOLUTION; - AUDIO_Handle->headphone.attribute.volumeMax = LE16(&AUDIO_Handle->mem[0]); - - if (AUDIO_Handle->headphone.attribute.volumeMax < AUDIO_Handle->headphone.attribute.volumeMin) - { - AUDIO_Handle->headphone.attribute.volumeMax = 0xFF00; - } - } - break; - - case AUDIO_REQ_GET_RESOLUTION: - req_status = USBH_AC_GetRes(phost, - UAC_FEATURE_UNIT, /* subtype */ - feature, /* feature */ - VOLUME_CONTROL, /* Selector */ - channel, /* channel */ - 0x02); /* length */ - if(req_status != USBH_BUSY) - { - AUDIO_Handle->cs_req_state = AUDIO_REQ_CS_IDLE; - AUDIO_Handle->headphone.attribute.resolution = LE16(&AUDIO_Handle->mem[0]); - } - break; - - - case AUDIO_REQ_CS_IDLE: - status = USBH_OK; - default: - break; - } - return status; -} - -/** - * @brief USBH_AUDIO_HandleCSRequest - * The function is responsible for handling AC Specific requests for a all features - * and associated channels for Audio class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_HandleCSRequest(USBH_HandleTypeDef *phost) -{ - - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef cs_status = USBH_BUSY; - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - cs_status = USBH_AUDIO_CSRequest(phost, - AUDIO_Handle->temp_feature, - AUDIO_Handle->temp_channels); - - if(cs_status != USBH_BUSY) - { - - if(AUDIO_Handle->temp_channels == 1) - { - AUDIO_Handle->temp_feature = AUDIO_Handle->headphone.asociated_feature; - AUDIO_Handle->temp_channels = 0; - status = USBH_OK; - } - else - { - AUDIO_Handle->temp_channels--; - } - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_VOLUME; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - return status; -} - -/** - * @brief USBH_AUDIO_Process - * The function is for managing state machine for Audio data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_Process (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY; - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - if(AUDIO_Handle->headphone.supported == 1) - { - USBH_AUDIO_OutputStream (phost); - } - - if(AUDIO_Handle->microphone.supported == 1) - { - USBH_AUDIO_InputStream (phost); - } - - return status; -} - -/** - * @brief USBH_AUDIO_SOFProcess - * The function is for managing the SOF callback - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_SOFProcess (USBH_HandleTypeDef *phost) -{ - return USBH_OK; -} -/** - * @brief Find IN Audio Streaming interfaces - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_FindAudioStreamingIN(USBH_HandleTypeDef *phost) -{ - uint8_t interface, alt_settings; - USBH_StatusTypeDef status = USBH_FAIL ; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - /* Look For AUDIOSTREAMING IN interface */ - alt_settings = 0; - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if((phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == AC_CLASS)&& - (phost->device.CfgDesc.Itf_Desc[interface].bInterfaceSubClass == USB_SUBCLASS_AUDIOSTREAMING)) - { - if((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80)&& - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize > 0)) - { - AUDIO_Handle->stream_in[alt_settings].Ep = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - AUDIO_Handle->stream_in[alt_settings].EpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - AUDIO_Handle->stream_in[alt_settings].interface = phost->device.CfgDesc.Itf_Desc[interface].bInterfaceNumber; - AUDIO_Handle->stream_in[alt_settings].AltSettings = phost->device.CfgDesc.Itf_Desc[interface].bAlternateSetting; - AUDIO_Handle->stream_in[alt_settings].Poll = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bInterval; - AUDIO_Handle->stream_in[alt_settings].valid = 1; - alt_settings++; - } - } - } - - if(alt_settings > 0) - { - status = USBH_OK; - } - - return status; -} - -/** - * @brief Find OUT Audio Streaming interfaces - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_FindAudioStreamingOUT(USBH_HandleTypeDef *phost) -{ - uint8_t interface, alt_settings; - USBH_StatusTypeDef status = USBH_FAIL ; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - /* Look For AUDIOSTREAMING IN interface */ - alt_settings = 0; - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if((phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == AC_CLASS)&& - (phost->device.CfgDesc.Itf_Desc[interface].bInterfaceSubClass == USB_SUBCLASS_AUDIOSTREAMING)) - { - if(((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80) == 0x00)&& - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize > 0)) - { - AUDIO_Handle->stream_out[alt_settings].Ep = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - AUDIO_Handle->stream_out[alt_settings].EpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - AUDIO_Handle->stream_out[alt_settings].interface = phost->device.CfgDesc.Itf_Desc[interface].bInterfaceNumber; - AUDIO_Handle->stream_out[alt_settings].AltSettings = phost->device.CfgDesc.Itf_Desc[interface].bAlternateSetting; - AUDIO_Handle->stream_out[alt_settings].Poll = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bInterval; - AUDIO_Handle->stream_out[alt_settings].valid = 1; - alt_settings++; - } - } - } - - if(alt_settings > 0) - { - status = USBH_OK; - } - - return status; -} - -/** - * @brief Find HID Control interfaces - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_FindHIDControl(USBH_HandleTypeDef *phost) -{ - uint8_t interface; - USBH_StatusTypeDef status = USBH_FAIL ; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - /* Look For AUDIOCONTROL interface */ - interface = USBH_FindInterface(phost, AC_CLASS, USB_SUBCLASS_AUDIOCONTROL, 0xFF); - if(interface != 0xFF) - { - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if((phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == 0x03)&& /*HID*/ - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize > 0)) - { - if((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80) == 0x80) - { - AUDIO_Handle->control.Ep = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - AUDIO_Handle->control.EpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - AUDIO_Handle->control.interface = phost->device.CfgDesc.Itf_Desc[interface].bInterfaceNumber; - AUDIO_Handle->control.Poll = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bInterval; - AUDIO_Handle->control.supported = 1; - status = USBH_OK; - break; - } - } - } - } - return status; -} - -/** - * @brief Parse AC and interfaces Descriptors - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_ParseCSDescriptors(USBH_HandleTypeDef *phost) -{ - USBH_DescHeader_t *pdesc ; - uint16_t ptr; - int8_t itf_index = 0; - int8_t itf_number = 0; - int8_t alt_setting; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - pdesc = (USBH_DescHeader_t *)(phost->device.CfgDesc_Raw); - ptr = USB_LEN_CFG_DESC; - - AUDIO_Handle->class_desc.FeatureUnitNum = 0; - AUDIO_Handle->class_desc.InputTerminalNum = 0; - AUDIO_Handle->class_desc.OutputTerminalNum = 0; - AUDIO_Handle->class_desc.ASNum = 0; - - while(ptr < phost->device.CfgDesc.wTotalLength) - { - pdesc = USBH_GetNextDesc((uint8_t*) pdesc, &ptr); - - switch (pdesc->bDescriptorType) - { - - case USB_DESC_TYPE_INTERFACE: - itf_number = *((uint8_t *)pdesc + 2); - alt_setting = *((uint8_t *)pdesc + 3); - itf_index = USBH_FindInterfaceIndex (phost, itf_number, alt_setting); - break; - - case USB_DESC_TYPE_CS_INTERFACE: - if(itf_number <= phost->device.CfgDesc.bNumInterfaces) - { - - ParseCSDescriptors(&AUDIO_Handle->class_desc, - phost->device.CfgDesc.Itf_Desc[itf_index].bInterfaceSubClass, - (uint8_t *)pdesc); - } - break; - - default: - break; - } - } - return USBH_OK; -} - -/** - * @brief Parse AC interfaces - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef ParseCSDescriptors(AUDIO_ClassSpecificDescTypedef *class_desc, - uint8_t ac_subclass, - uint8_t *pdesc) -{ - if(ac_subclass == USB_SUBCLASS_AUDIOCONTROL) - { - switch(pdesc[2]) - { - case UAC_HEADER: - class_desc->cs_desc.HeaderDesc = (AUDIO_HeaderDescTypeDef *)pdesc; - break; - - case UAC_INPUT_TERMINAL: - class_desc->cs_desc.InputTerminalDesc[class_desc->InputTerminalNum++] = (AUDIO_ITDescTypeDef*) pdesc; - break; - - case UAC_OUTPUT_TERMINAL: - class_desc->cs_desc.OutputTerminalDesc[class_desc->OutputTerminalNum++] = (AUDIO_OTDescTypeDef*) pdesc; - break; - - case UAC_FEATURE_UNIT: - class_desc->cs_desc.FeatureUnitDesc[class_desc->FeatureUnitNum++] = (AUDIO_FeatureDescTypeDef*) pdesc; - break; - - case UAC_SELECTOR_UNIT: - class_desc->cs_desc.SelectorUnitDesc[class_desc->SelectorUnitNum++] = (AUDIO_SelectorDescTypeDef*) pdesc; - break; - - case UAC_MIXER_UNIT: - class_desc->cs_desc.MixerUnitDesc[class_desc->MixerUnitNum++] = (AUDIO_MixerDescTypeDef*) pdesc; - break; - - default: - break; - } - } - else if(ac_subclass == USB_SUBCLASS_AUDIOSTREAMING) - { - switch(pdesc[2]) - { - case UAC_AS_GENERAL: - class_desc->as_desc[class_desc->ASNum].GeneralDesc = (AUDIO_ASGeneralDescTypeDef*) pdesc; - break; - case UAC_FORMAT_TYPE: - class_desc->as_desc[class_desc->ASNum++].FormatTypeDesc = (AUDIO_ASFormatTypeDescTypeDef*) pdesc; - break; - default: - break; - } - } - - return USBH_OK; -} - - -/** - * @brief Link a Unit to next associated one - * @param phost: Host handle - * @param UnitID: Unit identifer - * @retval UnitID, Index and Type of the associated Unit - */ -static int32_t USBH_AUDIO_FindLinkedUnit(USBH_HandleTypeDef *phost, uint8_t UnitID) -{ - uint8_t Index; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef *) phost->pActiveClass->pData; - - /* Find Feature Unit */ - for(Index = 0; Index < AUDIO_Handle->class_desc.FeatureUnitNum; Index ++) - { - if(AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[Index]->bSourceID == UnitID) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[Index]->bUnitID; - - return ((UnitID << 16) | (UAC_FEATURE_UNIT << 8) | Index); - } - } - - /* Find Mixer Unit */ - for(Index = 0; Index < AUDIO_Handle->class_desc.MixerUnitNum; Index ++) - { - if((AUDIO_Handle->class_desc.cs_desc.MixerUnitDesc[Index]->bSourceID0 == UnitID)|| - (AUDIO_Handle->class_desc.cs_desc.MixerUnitDesc[Index]->bSourceID1 == UnitID)) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.MixerUnitDesc[Index]->bUnitID; - - return ((UnitID << 16) | (UAC_MIXER_UNIT << 8) | Index); - } - } - - - /* Find Selector Unit */ - for(Index = 0; Index < AUDIO_Handle->class_desc.SelectorUnitNum; Index ++) - { - if(AUDIO_Handle->class_desc.cs_desc.SelectorUnitDesc[Index]->bSourceID0 == UnitID) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.SelectorUnitDesc[Index]->bUnitID; - - return ((UnitID << 16) | (UAC_SELECTOR_UNIT << 8) | Index); - } - } - - - /* Find OT Unit */ - for(Index = 0; Index < AUDIO_Handle->class_desc.OutputTerminalNum; Index ++) - { - if(AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[Index]->bSourceID == UnitID) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[Index]->bTerminalID; - - return ((UnitID << 16) | (UAC_OUTPUT_TERMINAL << 8) | Index); - } - } - - /* No associated Unit found */ - return -1; -} - -/** - * @brief Build full path for Microphone device - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_BuildMicrophonePath(USBH_HandleTypeDef *phost) -{ - uint8_t UnitID = 0, Type, Index; - uint32_t value; - uint8_t terminalIndex; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - /*Find microphone IT*/ - for(terminalIndex = 0; terminalIndex < AUDIO_Handle->class_desc.InputTerminalNum; terminalIndex++) - { - if(LE16(AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->wTerminalType) == 0x201) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->bTerminalID; - AUDIO_Handle->microphone.asociated_channels = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->bNrChannels; - break; - } - } - - do - { - value = USBH_AUDIO_FindLinkedUnit(phost, UnitID); - Index = value & 0xFF; - Type = (value >> 8) & 0xFF; - UnitID = (value >> 16) & 0xFF; - - switch (Type) - { - case UAC_FEATURE_UNIT: - AUDIO_Handle->microphone.asociated_feature = Index; - break; - - case UAC_MIXER_UNIT: - AUDIO_Handle->microphone.asociated_mixer = Index; - break; - - case UAC_SELECTOR_UNIT: - AUDIO_Handle->microphone.asociated_selector = Index; - break; - - case UAC_OUTPUT_TERMINAL: - AUDIO_Handle->microphone.asociated_terminal = Index; - break; - } - } - while ((Type != UAC_OUTPUT_TERMINAL) && (value > 0)); - - - - return USBH_OK; -} - -/** - * @brief Build full path for Headphone device - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_BuildHeadphonePath(USBH_HandleTypeDef *phost) -{ - uint8_t UnitID = 0, Type, Index; - uint32_t value; - uint8_t terminalIndex; - AUDIO_HandleTypeDef *AUDIO_Handle; - - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - /* Find association between audio streaming and microphone */ - for(terminalIndex = 0; terminalIndex < AUDIO_Handle->class_desc.InputTerminalNum; terminalIndex++) - { - if(LE16(AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->wTerminalType) == 0x101) - { - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->bTerminalID; - AUDIO_Handle->headphone.asociated_channels = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[terminalIndex]->bNrChannels; - break; - } - } - - for(Index = 0; Index < AUDIO_Handle->class_desc.ASNum; Index++) - { - if(AUDIO_Handle->class_desc.as_desc[Index].GeneralDesc->bTerminalLink == UnitID) - { - AUDIO_Handle->headphone.asociated_as = Index; - break; - } - } - - do - { - value = USBH_AUDIO_FindLinkedUnit(phost, UnitID); - Index = value & 0xFF; - Type = (value >> 8) & 0xFF; - UnitID = (value >> 16) & 0xFF; - - switch (Type) - { - case UAC_FEATURE_UNIT: - AUDIO_Handle->headphone.asociated_feature = Index; - break; - - case UAC_MIXER_UNIT: - AUDIO_Handle->headphone.asociated_mixer = Index; - break; - - case UAC_SELECTOR_UNIT: - AUDIO_Handle->headphone.asociated_selector = Index; - break; - - case UAC_OUTPUT_TERMINAL: - AUDIO_Handle->headphone.asociated_terminal = Index; - if(LE16(AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[Index]->wTerminalType) != 0x103) - { - return USBH_OK; - } - break; - } - } - while ((Type != UAC_OUTPUT_TERMINAL) && (value > 0)); - - return USBH_FAIL; -} - - -/** - * @brief Handle Set Cur request - * @param phost: Host handle - * @param subtype: subtype index - * @param feature: feature index - * @param controlSelector: control code - * @param channel: channel index - * @param length: Command length - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AC_SetCur(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length) -{ - uint16_t wValue,wIndex,wLength; - uint8_t UnitID,InterfaceNum; - AUDIO_HandleTypeDef *AUDIO_Handle; - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(subtype) - { - case UAC_INPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - AUDIO_Handle->mem[0] = 0x00; - - wLength = 1; - break; - case UAC_FEATURE_UNIT: - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[feature]->bUnitID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - /*holds the CS(control selector ) and CN (channel number)*/ - wValue = (controlSelector << 8) | channel; - wLength = length; - break; - } - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_SET_CUR; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->mem) , wLength )); - -} - -/** - * @brief Handle Get Cur request - * @param phost: Host handle - * @param subtype: subtype index - * @param feature: feature index - * @param controlSelector: control code - * @param channel: channel index - * @param length: Command length - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AC_GetCur(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length) -{ - uint16_t wValue = 0, wIndex = 0,wLength = 0; - uint8_t UnitID = 0, InterfaceNum = 0; - AUDIO_HandleTypeDef *AUDIO_Handle; - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(subtype) - { - case UAC_INPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - AUDIO_Handle->mem[0] = 0x00; - - wLength = 1; - break; - case UAC_FEATURE_UNIT: - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[feature]->bUnitID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - /*holds the CS(control selector ) and CN (channel number)*/ - wValue = (controlSelector << 8) | channel; - wLength = length; - break; - - case UAC_OUTPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - wLength = 1; - break; - } - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_GET_CUR; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->mem) , wLength )); - -} - - -/** - * @brief Handle Get Max request - * @param phost: Host handle - * @param subtype: subtype index - * @param feature: feature index - * @param controlSelector: control code - * @param channel: channel index - * @param length: Command length - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AC_GetMax(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length) -{ - uint16_t wValue = 0, wIndex = 0, wLength = 0; - uint8_t UnitID = 0, InterfaceNum = 0; - AUDIO_HandleTypeDef *AUDIO_Handle; - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(subtype) - { - case UAC_INPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - AUDIO_Handle->mem[0] = 0x00; - - wLength = 1; - break; - case UAC_FEATURE_UNIT: - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[feature]->bUnitID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - /*holds the CS(control selector ) and CN (channel number)*/ - wValue = (controlSelector << 8) | channel; - wLength = length; - break; - - case UAC_OUTPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - wLength = 1; - break; - } - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_GET_MAX; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->mem) , wLength )); - -} - - - -/** - * @brief Handle Get Res request - * @param phost: Host handle - * @param subtype: subtype index - * @param feature: feature index - * @param controlSelector: control code - * @param channel: channel index - * @param length: Command length - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AC_GetRes(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length) -{ - uint16_t wValue = 0, wIndex = 0, wLength = 0; - uint8_t UnitID = 0, InterfaceNum = 0; - AUDIO_HandleTypeDef *AUDIO_Handle; - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(subtype) - { - case UAC_INPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - AUDIO_Handle->mem[0] = 0x00; - - wLength = 1; - break; - case UAC_FEATURE_UNIT: - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[feature]->bUnitID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - /*holds the CS(control selector ) and CN (channel number)*/ - wValue = (controlSelector << 8) | channel; - wLength = length; - break; - - case UAC_OUTPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - wLength = 1; - break; - } - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_GET_RES; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->mem) , wLength )); - -} - -/** - * @brief Handle Get Min request - * @param phost: Host handle - * @param subtype: subtype index - * @param feature: feature index - * @param controlSelector: control code - * @param channel: channel index - * @param length: Command length - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AC_GetMin(USBH_HandleTypeDef *phost, - uint8_t subtype, - uint8_t feature, - uint8_t controlSelector, - uint8_t channel, - uint16_t length) -{ - uint16_t wValue = 0, wIndex = 0, wLength = 0; - uint8_t UnitID = 0, InterfaceNum = 0; - AUDIO_HandleTypeDef *AUDIO_Handle; - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(subtype) - { - case UAC_INPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.InputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - AUDIO_Handle->mem[0] = 0x00; - - wLength = 1; - break; - case UAC_FEATURE_UNIT: - UnitID = AUDIO_Handle->class_desc.cs_desc.FeatureUnitDesc[feature]->bUnitID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - /*holds the CS(control selector ) and CN (channel number)*/ - wValue = (controlSelector << 8) | channel; - wLength = length; - break; - - case UAC_OUTPUT_TERMINAL: - UnitID = AUDIO_Handle->class_desc.cs_desc.OutputTerminalDesc[0]->bTerminalID; - InterfaceNum = 0; /*Always zero Control Interface */ - wIndex = ( UnitID << 8 ) | InterfaceNum ; - wValue = (COPY_PROTECT_CONTROL << 8 ) ; - wLength = 1; - break; - } - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_GET_MIN; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->mem) , wLength )); - -} - -/** - * @brief Handle Set Endpoint Controls Request - * @param phost: Host handle - * @param Ep: Endpoint address - * @param buf: pointer to data - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_SetEndpointControls(USBH_HandleTypeDef *phost, - uint8_t Ep, - uint8_t *buff) -{ - uint16_t wValue, wIndex, wLength; - - - wValue = SAMPLING_FREQ_CONTROL << 8; - wIndex = Ep; - wLength = 3; /*length of the frequency parameter*/ - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_ENDPOINT | \ - USB_REQ_TYPE_CLASS; - - phost->Control.setup.b.bRequest = UAC_SET_CUR; - phost->Control.setup.b.wValue.w = wValue; - phost->Control.setup.b.wIndex.w = wIndex; - phost->Control.setup.b.wLength.w = wLength; - - return(USBH_CtlReq(phost, (uint8_t *)buff, wLength )); - -} - -/** - * @brief Handle Input stream process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_InputStream (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - - return status; -} - -/** - * @brief Handle HID Control process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_Control (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - uint16_t attribute = 0; - - - switch(AUDIO_Handle->control_state) - { - case AUDIO_CONTROL_INIT: - if((phost->Timer & 1) == 0) - { - AUDIO_Handle->control.timer = phost->Timer; - USBH_InterruptReceiveData(phost, - (uint8_t *)(AUDIO_Handle->mem), - AUDIO_Handle->control.EpSize, - AUDIO_Handle->control.Pipe); - - AUDIO_Handle->temp_feature = AUDIO_Handle->headphone.asociated_feature; - AUDIO_Handle->temp_channels = AUDIO_Handle->headphone.asociated_channels; - - AUDIO_Handle->control_state = AUDIO_CONTROL_CHANGE ; - } - break; - case AUDIO_CONTROL_CHANGE: - if(USBH_LL_GetURBState(phost , AUDIO_Handle->control.Pipe) == USBH_URB_DONE) - { - attribute = LE16(&AUDIO_Handle->mem[0]); - if(USBH_AUDIO_SetControlAttribute (phost, attribute) == USBH_BUSY) - { - break; - } - } - - if(( phost->Timer - AUDIO_Handle->control.timer) >= AUDIO_Handle->control.Poll) - { - AUDIO_Handle->control.timer = phost->Timer; - - USBH_InterruptReceiveData(phost, - (uint8_t *)(AUDIO_Handle->mem), - AUDIO_Handle->control.EpSize, - AUDIO_Handle->control.Pipe); - - } - break; - - case AUDIO_CONTROL_VOLUME_UP: - if( USBH_AUDIO_SetControlAttribute (phost, 1) == USBH_OK) - { - AUDIO_Handle->control_state = AUDIO_CONTROL_INIT; - status = USBH_OK; - } - break; - - case AUDIO_CONTROL_VOLUME_DOWN: - if( USBH_AUDIO_SetControlAttribute (phost, 2) == USBH_OK) - { - AUDIO_Handle->control_state = AUDIO_CONTROL_INIT; - status = USBH_OK; - } - break; - - case AUDIO_CONTROL_IDLE: - default: - break; - } - - return status; -} - -/** - * @brief Handle Output stream process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_OutputStream (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - uint8_t *buff; - - - switch(AUDIO_Handle->play_state) - { - case AUDIO_PLAYBACK_INIT: - - if( AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->bSamFreqType == 0) - { - AUDIO_Handle->play_state = AUDIO_PLAYBACK_SET_EP_FREQ; - } - else - { - AUDIO_Handle->play_state = AUDIO_PLAYBACK_SET_EP; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - break; - - case AUDIO_PLAYBACK_SET_EP_FREQ: - - buff = (uint8_t*)AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->tSamFreq[0]; - - status = USBH_AUDIO_SetEndpointControls(phost, AUDIO_Handle->headphone.Ep, buff); - if(status == USBH_OK) - { - AUDIO_Handle->play_state = AUDIO_PLAYBACK_IDLE; - } - break; - - case AUDIO_PLAYBACK_SET_EP: - buff = (uint8_t *)&AUDIO_Handle->headphone.frequency; - status = USBH_AUDIO_SetEndpointControls(phost,AUDIO_Handle->headphone.Ep, buff); - if(status == USBH_OK) - { - AUDIO_Handle->play_state = AUDIO_PLAYBACK_IDLE; - USBH_AUDIO_FrequencySet(phost); - } - break; - case AUDIO_PLAYBACK_IDLE: -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - status = USBH_OK; - break; - - case AUDIO_PLAYBACK_PLAY: - USBH_AUDIO_Transmit(phost); - status = USBH_OK; - break; - - default: - break; - } - - return status; -} - -/** - * @brief Handle Transmission process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_Transmit (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch(AUDIO_Handle->processing_state) - { - case AUDIO_DATA_START_OUT: - /* Sync with start of Even Frame */ - if((phost->Timer & 1) == 0) - { - AUDIO_Handle->headphone.timer = phost->Timer; - AUDIO_Handle->processing_state = AUDIO_DATA_OUT; - USBH_IsocSendData(phost, - AUDIO_Handle->headphone.buf, - AUDIO_Handle->headphone.frame_length, - AUDIO_Handle->headphone.Pipe); - - AUDIO_Handle->headphone.partial_ptr = AUDIO_Handle->headphone.frame_length; - AUDIO_Handle->headphone.global_ptr = AUDIO_Handle->headphone.frame_length; - AUDIO_Handle->headphone.cbuf = AUDIO_Handle->headphone.buf; - } - else - { -#if (USBH_USE_OS == 1) - osDelay(1); - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - break; - - case AUDIO_DATA_OUT: - if((USBH_LL_GetURBState(phost , AUDIO_Handle->headphone.Pipe) == USBH_URB_DONE)&& - (( phost->Timer - AUDIO_Handle->headphone.timer) >= AUDIO_Handle->headphone.Poll)) - { - AUDIO_Handle->headphone.timer = phost->Timer; - - if(AUDIO_Handle->control.supported == 1) - { - USBH_AUDIO_Control (phost); - } - - if(AUDIO_Handle->headphone.global_ptr <= AUDIO_Handle->headphone.total_length) - { - USBH_IsocSendData(phost, - AUDIO_Handle->headphone.cbuf, - AUDIO_Handle->headphone.frame_length, - AUDIO_Handle->headphone.Pipe); - - AUDIO_Handle->headphone.cbuf += AUDIO_Handle->headphone.frame_length; - AUDIO_Handle->headphone.partial_ptr += AUDIO_Handle->headphone.frame_length; - AUDIO_Handle->headphone.global_ptr += AUDIO_Handle->headphone.frame_length; - } - else - { - AUDIO_Handle->headphone.partial_ptr = 0xFFFFFFFF; - AUDIO_Handle->play_state = AUDIO_PLAYBACK_IDLE; - USBH_AUDIO_BufferEmptyCallback(phost); - } - } - break; - } - return status; -} - -/** - * @brief USBH_AUDIO_SetFrequency - * Set Audio sampling parameters - * @param phost: Host handle - * @param SampleRate: Sample Rate - * @param NbrChannels: Number of Channels - * @param BitPerSample: Bit Per Sample - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_SetFrequency (USBH_HandleTypeDef *phost, - uint16_t SampleRate, - uint8_t NbrChannels, - uint8_t BitPerSample) -{ - USBH_StatusTypeDef Status = USBH_BUSY; - AUDIO_HandleTypeDef *AUDIO_Handle; - uint8_t index; - uint8_t change_freq = FALSE; - uint32_t freq_min, freq_max; - uint8_t num_supported_freq; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_IDLE) - { - - if(AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->bSamFreqType == 0) - { - freq_min = LE24(AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->tSamFreq[0]); - freq_max = LE24(AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->tSamFreq[1]); - - if(( SampleRate >= freq_min)&& (SampleRate <= freq_max)) - { - change_freq = TRUE; - } - } - else - { - - num_supported_freq = (AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->bLength - 8)/3; - - - for(index = 0; index < num_supported_freq; index++) - { - if(SampleRate == LE24(AUDIO_Handle->class_desc.as_desc[AUDIO_Handle->headphone.asociated_as].FormatTypeDesc->tSamFreq[index])) - { - change_freq = TRUE; - break; - } - } - } - - if(change_freq == TRUE) - { - AUDIO_Handle->headphone.frequency = SampleRate; - AUDIO_Handle->headphone.frame_length = (SampleRate * BitPerSample * NbrChannels) / 8000; - AUDIO_Handle->play_state = AUDIO_PLAYBACK_SET_EP; - Status = USBH_OK; - - } - } - } - return Status; -} - -/** - * @brief USBH_AUDIO_Play - * Start playback process - * @param phost: Host handle - * @param buf: pointer to raw audio data - * @param length: total length of the audio data - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_Play (USBH_HandleTypeDef *phost, uint8_t *buf, uint32_t length) -{ - USBH_StatusTypeDef Status = USBH_FAIL; - AUDIO_HandleTypeDef *AUDIO_Handle; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_IDLE) - { - AUDIO_Handle->headphone.buf = buf; - AUDIO_Handle->headphone.total_length = length; - AUDIO_Handle->play_state = AUDIO_PLAYBACK_PLAY; - AUDIO_Handle->control_state = AUDIO_CONTROL_INIT; - AUDIO_Handle->processing_state = AUDIO_DATA_START_OUT; - Status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - } - return Status; -} - -/** - * @brief USBH_AUDIO_Pause - * Stop the playback process - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_Stop (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_FAIL; - Status = USBH_AUDIO_Suspend(phost); - return Status; -} - -/** - * @brief USBH_AUDIO_Suspend - * Suspend the playback process - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_Suspend (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_FAIL; - AUDIO_HandleTypeDef *AUDIO_Handle; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_PLAY) - { - AUDIO_Handle->control_state = AUDIO_CONTROL_IDLE; - AUDIO_Handle->play_state = AUDIO_PLAYBACK_IDLE; - Status = USBH_OK; - } - } - return Status; -} -/** - * @brief USBH_AUDIO_Resume - * Resume the playback process - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_Resume (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_FAIL; - AUDIO_HandleTypeDef *AUDIO_Handle; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_IDLE) - { - AUDIO_Handle->control_state = AUDIO_CONTROL_INIT; - AUDIO_Handle->play_state = AUDIO_PLAYBACK_PLAY; - } - } - return Status; -} -/** - * @brief USBH_AUDIO_GetOutOffset - * return the current buffer pointer for OUT process - * @param phost: Host handle - * @retval USBH Status - */ -int32_t USBH_AUDIO_GetOutOffset (USBH_HandleTypeDef *phost) -{ - AUDIO_HandleTypeDef *AUDIO_Handle; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_PLAY) - { - return AUDIO_Handle->headphone.partial_ptr; - } - } - return -1; -} - -/** - * @brief USBH_AUDIO_ChangeOutBuffer - * Change audio data buffer address - * @param phost: Host handle - * @param buf: buffer address - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_ChangeOutBuffer (USBH_HandleTypeDef *phost, uint8_t *buf) -{ - USBH_StatusTypeDef Status = USBH_FAIL; - AUDIO_HandleTypeDef *AUDIO_Handle; - - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_PLAY) - { - if(AUDIO_Handle->headphone.buf <= buf) - { - AUDIO_Handle->headphone.cbuf = buf; - if ( AUDIO_Handle->headphone.buf == buf) - { - AUDIO_Handle->headphone.partial_ptr = 0; - } - Status = USBH_OK; - } - } - } - return Status; -} - -/** - * @brief USBH_AUDIO_SetControlAttribute - * Set Control Attribute - * @param phost: Host handle - * @param attrib: control attribute - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_AUDIO_SetControlAttribute (USBH_HandleTypeDef *phost, uint8_t attrib) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - AUDIO_HandleTypeDef *AUDIO_Handle; - - - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - switch (attrib) - { - case 0x01: - AUDIO_Handle->headphone.attribute.volume += AUDIO_Handle->headphone.attribute.resolution; - break; - - case 0x02: - AUDIO_Handle->headphone.attribute.volume -= AUDIO_Handle->headphone.attribute.resolution; - break; - - } - - if(AUDIO_Handle->headphone.attribute.volume > AUDIO_Handle->headphone.attribute.volumeMax) - { - AUDIO_Handle->headphone.attribute.volume =AUDIO_Handle->headphone.attribute.volumeMax; - } - - if(AUDIO_Handle->headphone.attribute.volume < AUDIO_Handle->headphone.attribute.volumeMin) - { - AUDIO_Handle->headphone.attribute.volume =AUDIO_Handle->headphone.attribute.volumeMin; - } - - if(AUDIO_SetVolume (phost, - AUDIO_Handle->temp_feature, - AUDIO_Handle->temp_channels, - AUDIO_Handle->headphone.attribute.volume) != USBH_BUSY) - { - - if(AUDIO_Handle->temp_channels == 1) - { - AUDIO_Handle->temp_feature = AUDIO_Handle->headphone.asociated_feature; - AUDIO_Handle->temp_channels = AUDIO_Handle->headphone.asociated_channels; - status = USBH_OK; - } - else - { - AUDIO_Handle->temp_channels--; - } - AUDIO_Handle->cs_req_state = AUDIO_REQ_GET_VOLUME; - } - - - return status; -} - - -/** - * @brief USBH_AUDIO_SetVolume - * Set Volume - * @param phost: Host handle - * @param volume: VOLUME_UP/ VOLUME_DOWN - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_AUDIO_SetVolume (USBH_HandleTypeDef *phost, AUDIO_VolumeCtrlTypeDef volume_ctl) -{ - AUDIO_HandleTypeDef *AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - if((volume_ctl == VOLUME_UP) || (volume_ctl == VOLUME_DOWN)) - { - if(phost->gState == HOST_CLASS) - { - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - if(AUDIO_Handle->play_state == AUDIO_PLAYBACK_PLAY) - { - AUDIO_Handle->control_state = (volume_ctl == VOLUME_UP)? AUDIO_CONTROL_VOLUME_UP : AUDIO_CONTROL_VOLUME_DOWN; - return USBH_OK; - } - } - } - return USBH_FAIL; -} -/** - * @brief AUDIO_SetVolume - * Set Volume - * @param phost: Host handle - * @param feature: feature Unit index - * @param channel: channel index - * @param volume: new volume - * @retval USBH Status - */ -static USBH_StatusTypeDef AUDIO_SetVolume (USBH_HandleTypeDef *phost, uint8_t feature, uint8_t channel, uint16_t volume) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - AUDIO_HandleTypeDef *AUDIO_Handle; - - - AUDIO_Handle = (AUDIO_HandleTypeDef*) phost->pActiveClass->pData; - - AUDIO_Handle->mem[0] = volume; - - status = USBH_AC_SetCur(phost, - UAC_FEATURE_UNIT, - feature, - VOLUME_CONTROL, - channel, - 2); - - return status; -} - -/** - * @brief The function informs user that Settings have been changed - * @param phost: Selected device - * @retval None - */ -__weak void USBH_AUDIO_FrequencySet(USBH_HandleTypeDef *phost) -{ - -} - -/** - * @brief The function informs user that User data are processed - * @param phost: Selected device - * @retval None - */ -__weak void USBH_AUDIO_BufferEmptyCallback(USBH_HandleTypeDef *phost) -{ - -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Inc/usbh_cdc.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Inc/usbh_cdc.h deleted file mode 100644 index 2937540..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Inc/usbh_cdc.h +++ /dev/null @@ -1,456 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_cdc.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_cdc.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_CDC_H -#define __USBH_CDC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_CDC_CLASS -* @{ -*/ - -/** @defgroup USBH_CDC_CORE -* @brief This file is the Header file for usbh_core.c -* @{ -*/ - - - - -/*Communication Class codes*/ -#define USB_CDC_CLASS 0x02 -#define COMMUNICATION_INTERFACE_CLASS_CODE 0x02 - -/*Data Interface Class Codes*/ -#define DATA_INTERFACE_CLASS_CODE 0x0A - -/*Communication sub class codes*/ -#define RESERVED 0x00 -#define DIRECT_LINE_CONTROL_MODEL 0x01 -#define ABSTRACT_CONTROL_MODEL 0x02 -#define TELEPHONE_CONTROL_MODEL 0x03 -#define MULTICHANNEL_CONTROL_MODEL 0x04 -#define CAPI_CONTROL_MODEL 0x05 -#define ETHERNET_NETWORKING_CONTROL_MODEL 0x06 -#define ATM_NETWORKING_CONTROL_MODEL 0x07 - - -/*Communication Interface Class Control Protocol Codes*/ -#define NO_CLASS_SPECIFIC_PROTOCOL_CODE 0x00 -#define COMMON_AT_COMMAND 0x01 -#define VENDOR_SPECIFIC 0xFF - - -#define CS_INTERFACE 0x24 -#define CDC_PAGE_SIZE_64 0x40 - -/*Class-Specific Request Codes*/ -#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 -#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 -#define CDC_SET_COMM_FEATURE 0x02 -#define CDC_GET_COMM_FEATURE 0x03 -#define CDC_CLEAR_COMM_FEATURE 0x04 - -#define CDC_SET_AUX_LINE_STATE 0x10 -#define CDC_SET_HOOK_STATE 0x11 -#define CDC_PULSE_SETUP 0x12 -#define CDC_SEND_PULSE 0x13 -#define CDC_SET_PULSE_TIME 0x14 -#define CDC_RING_AUX_JACK 0x15 - -#define CDC_SET_LINE_CODING 0x20 -#define CDC_GET_LINE_CODING 0x21 -#define CDC_SET_CONTROL_LINE_STATE 0x22 -#define CDC_SEND_BREAK 0x23 - -#define CDC_SET_RINGER_PARMS 0x30 -#define CDC_GET_RINGER_PARMS 0x31 -#define CDC_SET_OPERATION_PARMS 0x32 -#define CDC_GET_OPERATION_PARMS 0x33 -#define CDC_SET_LINE_PARMS 0x34 -#define CDC_GET_LINE_PARMS 0x35 -#define CDC_DIAL_DIGITS 0x36 -#define CDC_SET_UNIT_PARAMETER 0x37 -#define CDC_GET_UNIT_PARAMETER 0x38 -#define CDC_CLEAR_UNIT_PARAMETER 0x39 -#define CDC_GET_PROFILE 0x3A - -#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 -#define CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x41 -#define CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x42 -#define CDC_SET_ETHERNET_PACKET_FILTER 0x43 -#define CDC_GET_ETHERNET_STATISTIC 0x44 - -#define CDC_SET_ATM_DATA_FORMAT 0x50 -#define CDC_GET_ATM_DEVICE_STATISTICS 0x51 -#define CDC_SET_ATM_DEFAULT_VC 0x52 -#define CDC_GET_ATM_VC_STATISTICS 0x53 - - -/* wValue for SetControlLineState*/ -#define CDC_ACTIVATE_CARRIER_SIGNAL_RTS 0x0002 -#define CDC_DEACTIVATE_CARRIER_SIGNAL_RTS 0x0000 -#define CDC_ACTIVATE_SIGNAL_DTR 0x0001 -#define CDC_DEACTIVATE_SIGNAL_DTR 0x0000 - -#define LINE_CODING_STRUCTURE_SIZE 0x07 -/** - * @} - */ - -/** @defgroup USBH_CDC_CORE_Exported_Types -* @{ -*/ - -/* States for CDC State Machine */ -typedef enum -{ - CDC_IDLE= 0, - CDC_SEND_DATA, - CDC_SEND_DATA_WAIT, - CDC_RECEIVE_DATA, - CDC_RECEIVE_DATA_WAIT, -} -CDC_DataStateTypeDef; - -typedef enum -{ - CDC_IDLE_STATE= 0, - CDC_SET_LINE_CODING_STATE, - CDC_GET_LAST_LINE_CODING_STATE, - CDC_TRANSFER_DATA, - CDC_ERROR_STATE, -} -CDC_StateTypeDef; - - -/*Line coding structure*/ -typedef union _CDC_LineCodingStructure -{ - uint8_t Array[LINE_CODING_STRUCTURE_SIZE]; - - struct - { - - uint32_t dwDTERate; /*Data terminal rate, in bits per second*/ - uint8_t bCharFormat; /*Stop bits - 0 - 1 Stop bit - 1 - 1.5 Stop bits - 2 - 2 Stop bits*/ - uint8_t bParityType; /* Parity - 0 - None - 1 - Odd - 2 - Even - 3 - Mark - 4 - Space*/ - uint8_t bDataBits; /* Data bits (5, 6, 7, 8 or 16). */ - }b; -} -CDC_LineCodingTypeDef; - - - -/* Header Functional Descriptor --------------------------------------------------------------------------------- -Offset| field | Size | Value | Description -------|---------------------|-------|------------|------------------------------ -0 | bFunctionLength | 1 | number | Size of this descriptor. -1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) -2 | bDescriptorSubtype | 1 | Constant | Identifier (ID) of functional - | | | | descriptor. -3 | bcdCDC | 2 | | - | | | Number | USB Class Definitions for - | | | | Communication Devices Specification - | | | | release number in binary-coded - | | | | decimal -------|---------------------|-------|------------|------------------------------ -*/ -typedef struct _FunctionalDescriptorHeader -{ - uint8_t bLength; /*Size of this descriptor.*/ - uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ - uint8_t bDescriptorSubType; /* Header functional descriptor subtype as*/ - uint16_t bcdCDC; /* USB Class Definitions for Communication - Devices Specification release number in - binary-coded decimal. */ -} -CDC_HeaderFuncDesc_TypeDef; -/* Call Management Functional Descriptor --------------------------------------------------------------------------------- -Offset| field | Size | Value | Description -------|---------------------|-------|------------|------------------------------ -0 | bFunctionLength | 1 | number | Size of this descriptor. -1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) -2 | bDescriptorSubtype | 1 | Constant | Call Management functional - | | | | descriptor subtype. -3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration - | | | | supports: - | | | | D7..D2: RESERVED (Reset to zero) - | | | | D1: 0 - Device sends/receives call - | | | | management information only over - | | | | the Communication Class - | | | | interface. - | | | | 1 - Device can send/receive call - | \ | | management information over a - | | | | Data Class interface. - | | | | D0: 0 - Device does not handle call - | | | | management itself. - | | | | 1 - Device handles call - | | | | management itself. - | | | | The previous bits, in combination, identify - | | | | which call management scenario is used. If bit - | | | | D0 is reset to 0, then the value of bit D1 is - | | | | ignored. In this case, bit D1 is reset to zero for - | | | | future compatibility. -4 | bDataInterface | 1 | Number | Interface number of Data Class interface - | | | | optionally used for call management. -------|---------------------|-------|------------|------------------------------ -*/ -typedef struct _CallMgmtFunctionalDescriptor -{ - uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ - uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ - uint8_t bDescriptorSubType; /* Call Management functional descriptor subtype*/ - uint8_t bmCapabilities; /* bmCapabilities: D0+D1 */ - uint8_t bDataInterface; /*bDataInterface: 1*/ -} -CDC_CallMgmtFuncDesc_TypeDef; -/* Abstract Control Management Functional Descriptor --------------------------------------------------------------------------------- -Offset| field | Size | Value | Description -------|---------------------|-------|------------|------------------------------ -0 | bFunctionLength | 1 | number | Size of functional descriptor, in bytes. -1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) -2 | bDescriptorSubtype | 1 | Constant | Abstract Control Management - | | | | functional descriptor subtype. -3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration - | | | | supports ((A bit value of zero means that the - | | | | request is not supported.) ) - D7..D4: RESERVED (Reset to zero) - | | | | D3: 1 - Device supports the notification - | | | | Network_Connection. - | | | | D2: 1 - Device supports the request - | | | | Send_Break - | | | | D1: 1 - Device supports the request - | \ | | combination of Set_Line_Coding, - | | | | Set_Control_Line_State, Get_Line_Coding, and the - notification Serial_State. - | | | | D0: 1 - Device supports the request - | | | | combination of Set_Comm_Feature, - | | | | Clear_Comm_Feature, and Get_Comm_Feature. - | | | | The previous bits, in combination, identify - | | | | which requests/notifications are supported by - | | | | a Communication Class interface with the - | | | | SubClass code of Abstract Control Model. -------|---------------------|-------|------------|------------------------------ -*/ -typedef struct _AbstractCntrlMgmtFunctionalDescriptor -{ - uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ - uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ - uint8_t bDescriptorSubType; /* Abstract Control Management functional - descriptor subtype*/ - uint8_t bmCapabilities; /* The capabilities that this configuration supports */ -} -CDC_AbstCntrlMgmtFuncDesc_TypeDef; -/* Union Functional Descriptor --------------------------------------------------------------------------------- -Offset| field | Size | Value | Description -------|---------------------|-------|------------|------------------------------ -0 | bFunctionLength | 1 | number | Size of this descriptor. -1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) -2 | bDescriptorSubtype | 1 | Constant | Union functional - | | | | descriptor subtype. -3 | bMasterInterface | 1 | Constant | The interface number of the - | | | | Communication or Data Class interface -4 | bSlaveInterface0 | 1 | Number | nterface number of first slave or associated - | | | | interface in the union. -------|---------------------|-------|------------|------------------------------ -*/ -typedef struct _UnionFunctionalDescriptor -{ - uint8_t bLength; /*Size of this functional descriptor, in bytes*/ - uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ - uint8_t bDescriptorSubType; /* Union functional descriptor SubType*/ - uint8_t bMasterInterface; /* The interface number of the Communication or - Data Class interface,*/ - uint8_t bSlaveInterface0; /*Interface number of first slave*/ -} -CDC_UnionFuncDesc_TypeDef; - -typedef struct _USBH_CDCInterfaceDesc -{ - CDC_HeaderFuncDesc_TypeDef CDC_HeaderFuncDesc; - CDC_CallMgmtFuncDesc_TypeDef CDC_CallMgmtFuncDesc; - CDC_AbstCntrlMgmtFuncDesc_TypeDef CDC_AbstCntrlMgmtFuncDesc; - CDC_UnionFuncDesc_TypeDef CDC_UnionFuncDesc; -} -CDC_InterfaceDesc_Typedef; - - -/* Structure for CDC process */ -typedef struct -{ - uint8_t NotifPipe; - uint8_t NotifEp; - uint8_t buff[8]; - uint16_t NotifEpSize; -} -CDC_CommItfTypedef ; - -typedef struct -{ - uint8_t InPipe; - uint8_t OutPipe; - uint8_t OutEp; - uint8_t InEp; - uint8_t buff[8]; - uint16_t OutEpSize; - uint16_t InEpSize; -} -CDC_DataItfTypedef ; - -/* Structure for CDC process */ -typedef struct _CDC_Process -{ - CDC_CommItfTypedef CommItf; - CDC_DataItfTypedef DataItf; - uint8_t *pTxData; - uint8_t *pRxData; - uint32_t TxDataLength; - uint32_t RxDataLength; - CDC_InterfaceDesc_Typedef CDC_Desc; - CDC_LineCodingTypeDef LineCoding; - CDC_LineCodingTypeDef *pUserLineCoding; - CDC_StateTypeDef state; - CDC_DataStateTypeDef data_tx_state; - CDC_DataStateTypeDef data_rx_state; - uint8_t Rx_Poll; -} -CDC_HandleTypeDef; - -/** -* @} -*/ - -/** @defgroup USBH_CDC_CORE_Exported_Defines -* @{ -*/ - -/** -* @} -*/ - -/** @defgroup USBH_CDC_CORE_Exported_Macros -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_CDC_CORE_Exported_Variables -* @{ -*/ -extern USBH_ClassTypeDef CDC_Class; -#define USBH_CDC_CLASS &CDC_Class - -/** -* @} -*/ - -/** @defgroup USBH_CDC_CORE_Exported_FunctionsPrototype -* @{ -*/ - -USBH_StatusTypeDef USBH_CDC_SetLineCoding(USBH_HandleTypeDef *phost, - CDC_LineCodingTypeDef *linecoding); - -USBH_StatusTypeDef USBH_CDC_GetLineCoding(USBH_HandleTypeDef *phost, - CDC_LineCodingTypeDef *linecoding); - -USBH_StatusTypeDef USBH_CDC_Transmit(USBH_HandleTypeDef *phost, - uint8_t *pbuff, - uint32_t length); - -USBH_StatusTypeDef USBH_CDC_Receive(USBH_HandleTypeDef *phost, - uint8_t *pbuff, - uint32_t length); - - -uint16_t USBH_CDC_GetLastReceivedDataSize(USBH_HandleTypeDef *phost); - -USBH_StatusTypeDef USBH_CDC_Stop(USBH_HandleTypeDef *phost); - -void USBH_CDC_LineCodingChanged(USBH_HandleTypeDef *phost); - -void USBH_CDC_TransmitCallback(USBH_HandleTypeDef *phost); - -void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost); - -/** -* @} -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CDC_H */ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Src/usbh_cdc.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Src/usbh_cdc.c deleted file mode 100644 index fa578e1..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/CDC/Src/usbh_cdc.c +++ /dev/null @@ -1,775 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_cdc.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the CDC Layer Handlers for USB Host CDC class. - * - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_cdc.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_CDC_CLASS -* @{ -*/ - -/** @defgroup USBH_CDC_CORE -* @brief This file includes CDC Layer Handlers for USB Host CDC class. -* @{ -*/ - -/** @defgroup USBH_CDC_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CDC_CORE_Private_Defines -* @{ -*/ -#define USBH_CDC_BUFFER_SIZE 1024 -/** -* @} -*/ - - -/** @defgroup USBH_CDC_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CDC_CORE_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CDC_CORE_Private_FunctionPrototypes -* @{ -*/ - -static USBH_StatusTypeDef USBH_CDC_InterfaceInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_CDC_InterfaceDeInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_CDC_Process(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_CDC_SOFProcess(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_CDC_ClassRequest (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef GetLineCoding(USBH_HandleTypeDef *phost, - CDC_LineCodingTypeDef *linecoding); - -static USBH_StatusTypeDef SetLineCoding(USBH_HandleTypeDef *phost, - CDC_LineCodingTypeDef *linecoding); - -static void CDC_ProcessTransmission(USBH_HandleTypeDef *phost); - -static void CDC_ProcessReception(USBH_HandleTypeDef *phost); - -USBH_ClassTypeDef CDC_Class = -{ - "CDC", - USB_CDC_CLASS, - USBH_CDC_InterfaceInit, - USBH_CDC_InterfaceDeInit, - USBH_CDC_ClassRequest, - USBH_CDC_Process, - USBH_CDC_SOFProcess, - NULL, -}; -/** -* @} -*/ - - -/** @defgroup USBH_CDC_CORE_Private_Functions -* @{ -*/ - -/** - * @brief USBH_CDC_InterfaceInit - * The function init the CDC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_CDC_InterfaceInit (USBH_HandleTypeDef *phost) -{ - - USBH_StatusTypeDef status = USBH_FAIL ; - uint8_t interface; - CDC_HandleTypeDef *CDC_Handle; - - interface = USBH_FindInterface(phost, - COMMUNICATION_INTERFACE_CLASS_CODE, - ABSTRACT_CONTROL_MODEL, - COMMON_AT_COMMAND); - - if(interface == 0xFF) /* No Valid Interface */ - { - USBH_DbgLog ("Cannot Find the interface for Communication Interface Class.", phost->pActiveClass->Name); - } - else - { - USBH_SelectInterface (phost, interface); - phost->pActiveClass->pData = (CDC_HandleTypeDef *)USBH_malloc (sizeof(CDC_HandleTypeDef)); - CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - /*Collect the notification endpoint address and length*/ - if(phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80) - { - CDC_Handle->CommItf.NotifEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - CDC_Handle->CommItf.NotifEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - } - - /*Allocate the length for host channel number in*/ - CDC_Handle->CommItf.NotifPipe = USBH_AllocPipe(phost, CDC_Handle->CommItf.NotifEp); - - /* Open pipe for Notification endpoint */ - USBH_OpenPipe (phost, - CDC_Handle->CommItf.NotifPipe, - CDC_Handle->CommItf.NotifEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_INTR, - CDC_Handle->CommItf.NotifEpSize); - - USBH_LL_SetToggle (phost, CDC_Handle->CommItf.NotifPipe, 0); - - interface = USBH_FindInterface(phost, - DATA_INTERFACE_CLASS_CODE, - RESERVED, - NO_CLASS_SPECIFIC_PROTOCOL_CODE); - - if(interface == 0xFF) /* No Valid Interface */ - { - USBH_DbgLog ("Cannot Find the interface for Data Interface Class.", phost->pActiveClass->Name); - } - else - { - /*Collect the class specific endpoint address and length*/ - if(phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress & 0x80) - { - CDC_Handle->DataItf.InEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - CDC_Handle->DataItf.InEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - } - else - { - CDC_Handle->DataItf.OutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].bEndpointAddress; - CDC_Handle->DataItf.OutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[0].wMaxPacketSize; - } - - if(phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress & 0x80) - { - CDC_Handle->DataItf.InEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress; - CDC_Handle->DataItf.InEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].wMaxPacketSize; - } - else - { - CDC_Handle->DataItf.OutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].bEndpointAddress; - CDC_Handle->DataItf.OutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[1].wMaxPacketSize; - } - - /*Allocate the length for host channel number out*/ - CDC_Handle->DataItf.OutPipe = USBH_AllocPipe(phost, CDC_Handle->DataItf.OutEp); - - /*Allocate the length for host channel number in*/ - CDC_Handle->DataItf.InPipe = USBH_AllocPipe(phost, CDC_Handle->DataItf.InEp); - - /* Open channel for OUT endpoint */ - USBH_OpenPipe (phost, - CDC_Handle->DataItf.OutPipe, - CDC_Handle->DataItf.OutEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - CDC_Handle->DataItf.OutEpSize); - /* Open channel for IN endpoint */ - USBH_OpenPipe (phost, - CDC_Handle->DataItf.InPipe, - CDC_Handle->DataItf.InEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - CDC_Handle->DataItf.InEpSize); - - CDC_Handle->state = CDC_IDLE_STATE; - - USBH_LL_SetToggle (phost, CDC_Handle->DataItf.OutPipe,0); - USBH_LL_SetToggle (phost, CDC_Handle->DataItf.InPipe,0); - status = USBH_OK; - } - } - return status; -} - - - -/** - * @brief USBH_CDC_InterfaceDeInit - * The function DeInit the Pipes used for the CDC class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CDC_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if ( CDC_Handle->CommItf.NotifPipe) - { - USBH_ClosePipe(phost, CDC_Handle->CommItf.NotifPipe); - USBH_FreePipe (phost, CDC_Handle->CommItf.NotifPipe); - CDC_Handle->CommItf.NotifPipe = 0; /* Reset the Channel as Free */ - } - - if ( CDC_Handle->DataItf.InPipe) - { - USBH_ClosePipe(phost, CDC_Handle->DataItf.InPipe); - USBH_FreePipe (phost, CDC_Handle->DataItf.InPipe); - CDC_Handle->DataItf.InPipe = 0; /* Reset the Channel as Free */ - } - - if ( CDC_Handle->DataItf.OutPipe) - { - USBH_ClosePipe(phost, CDC_Handle->DataItf.OutPipe); - USBH_FreePipe (phost, CDC_Handle->DataItf.OutPipe); - CDC_Handle->DataItf.OutPipe = 0; /* Reset the Channel as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - phost->pActiveClass->pData = 0; - } - - return USBH_OK; -} - -/** - * @brief USBH_CDC_ClassRequest - * The function is responsible for handling Standard requests - * for CDC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_CDC_ClassRequest (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_FAIL ; - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - /*Issue the get line coding request*/ - status = GetLineCoding(phost, &CDC_Handle->LineCoding); - if(status == USBH_OK) - { - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - } - return status; -} - - -/** - * @brief USBH_CDC_Process - * The function is for managing state machine for CDC data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_CDC_Process (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef req_status = USBH_OK; - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - switch(CDC_Handle->state) - { - - case CDC_IDLE_STATE: - status = USBH_OK; - break; - - case CDC_SET_LINE_CODING_STATE: - req_status = SetLineCoding(phost, CDC_Handle->pUserLineCoding); - - if(req_status == USBH_OK) - { - CDC_Handle->state = CDC_GET_LAST_LINE_CODING_STATE; - } - - else if(req_status != USBH_BUSY) - { - CDC_Handle->state = CDC_ERROR_STATE; - } - break; - - - case CDC_GET_LAST_LINE_CODING_STATE: - req_status = GetLineCoding(phost, &(CDC_Handle->LineCoding)); - - if(req_status == USBH_OK) - { - CDC_Handle->state = CDC_IDLE_STATE; - - if((CDC_Handle->LineCoding.b.bCharFormat == CDC_Handle->pUserLineCoding->b.bCharFormat) && - (CDC_Handle->LineCoding.b.bDataBits == CDC_Handle->pUserLineCoding->b.bDataBits) && - (CDC_Handle->LineCoding.b.bParityType == CDC_Handle->pUserLineCoding->b.bParityType) && - (CDC_Handle->LineCoding.b.dwDTERate == CDC_Handle->pUserLineCoding->b.dwDTERate)) - { - USBH_CDC_LineCodingChanged(phost); - } - } - - else if(req_status != USBH_BUSY) - { - CDC_Handle->state = CDC_ERROR_STATE; - } - - break; - - case CDC_TRANSFER_DATA: - CDC_ProcessTransmission(phost); - CDC_ProcessReception(phost); - break; - - case CDC_ERROR_STATE: - req_status = USBH_ClrFeature(phost, 0x00); - - if(req_status == USBH_OK ) - { - /*Change the state to waiting*/ - CDC_Handle->state = CDC_IDLE_STATE ; - } - break; - - default: - break; - - } - - return status; -} - -/** - * @brief USBH_CDC_SOFProcess - * The function is for managing SOF callback - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_CDC_SOFProcess (USBH_HandleTypeDef *phost) -{ - return USBH_OK; -} - - -/** - * @brief USBH_CDC_Stop - * Stop current CDC Transmission - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CDC_Stop(USBH_HandleTypeDef *phost) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - CDC_Handle->state = CDC_IDLE_STATE; - - USBH_ClosePipe(phost, CDC_Handle->CommItf.NotifPipe); - USBH_ClosePipe(phost, CDC_Handle->DataItf.InPipe); - USBH_ClosePipe(phost, CDC_Handle->DataItf.OutPipe); - } - return USBH_OK; -} -/** - * @brief This request allows the host to find out the currently - * configured line coding. - * @param pdev: Selected device - * @retval USBH_StatusTypeDef : USB ctl xfer status - */ -static USBH_StatusTypeDef GetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecoding) -{ - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = CDC_GET_LINE_CODING; - phost->Control.setup.b.wValue.w = 0; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; - - return USBH_CtlReq(phost, linecoding->Array, LINE_CODING_STRUCTURE_SIZE); -} - - -/** - * @brief This request allows the host to specify typical asynchronous - * line-character formatting properties - * This request applies to asynchronous byte stream data class interfaces - * and endpoints - * @param pdev: Selected device - * @retval USBH_StatusTypeDef : USB ctl xfer status - */ -static USBH_StatusTypeDef SetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecodin) -{ - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = CDC_SET_LINE_CODING; - phost->Control.setup.b.wValue.w = 0; - - phost->Control.setup.b.wIndex.w = 0; - - phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; - - return USBH_CtlReq(phost, linecodin->Array , LINE_CODING_STRUCTURE_SIZE ); -} - -/** -* @brief This function prepares the state before issuing the class specific commands -* @param None -* @retval None -*/ -USBH_StatusTypeDef USBH_CDC_SetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecodin) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - if(phost->gState == HOST_CLASS) - { - CDC_Handle->state = CDC_SET_LINE_CODING_STATE; - CDC_Handle->pUserLineCoding = linecodin; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - return USBH_OK; -} - -/** -* @brief This function prepares the state before issuing the class specific commands -* @param None -* @retval None -*/ -USBH_StatusTypeDef USBH_CDC_GetLineCoding(USBH_HandleTypeDef *phost, CDC_LineCodingTypeDef *linecodin) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if((phost->gState == HOST_CLASS) ||(phost->gState == HOST_CLASS_REQUEST)) - { - *linecodin = CDC_Handle->LineCoding; - return USBH_OK; - } - else - { - return USBH_FAIL; - } -} - -/** - * @brief This function return last received data size - * @param None - * @retval None - */ -uint16_t USBH_CDC_GetLastReceivedDataSize(USBH_HandleTypeDef *phost) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - return USBH_LL_GetLastXferSize(phost, CDC_Handle->DataItf.InPipe);; - } - else - { - return 0; - } -} - -/** - * @brief This function prepares the state before issuing the class specific commands - * @param None - * @retval None - */ -USBH_StatusTypeDef USBH_CDC_Transmit(USBH_HandleTypeDef *phost, uint8_t *pbuff, uint32_t length) -{ - USBH_StatusTypeDef Status = USBH_BUSY; - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if((CDC_Handle->state == CDC_IDLE_STATE) || (CDC_Handle->state == CDC_TRANSFER_DATA)) - { - CDC_Handle->pTxData = pbuff; - CDC_Handle->TxDataLength = length; - CDC_Handle->state = CDC_TRANSFER_DATA; - CDC_Handle->data_tx_state = CDC_SEND_DATA; - Status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - return Status; -} - - -/** -* @brief This function prepares the state before issuing the class specific commands -* @param None -* @retval None -*/ -USBH_StatusTypeDef USBH_CDC_Receive(USBH_HandleTypeDef *phost, uint8_t *pbuff, uint32_t length) -{ - USBH_StatusTypeDef Status = USBH_BUSY; - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - - if((CDC_Handle->state == CDC_IDLE_STATE) || (CDC_Handle->state == CDC_TRANSFER_DATA)) - { - CDC_Handle->pRxData = pbuff; - CDC_Handle->RxDataLength = length; - CDC_Handle->state = CDC_TRANSFER_DATA; - CDC_Handle->data_rx_state = CDC_RECEIVE_DATA; - Status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - return Status; -} - -/** -* @brief The function is responsible for sending data to the device -* @param pdev: Selected device -* @retval None -*/ -static void CDC_ProcessTransmission(USBH_HandleTypeDef *phost) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - - switch(CDC_Handle->data_tx_state) - { - - case CDC_SEND_DATA: - if(CDC_Handle->TxDataLength > CDC_Handle->DataItf.OutEpSize) - { - USBH_BulkSendData (phost, - CDC_Handle->pTxData, - CDC_Handle->DataItf.OutEpSize, - CDC_Handle->DataItf.OutPipe, - 1); - } - else - { - USBH_BulkSendData (phost, - CDC_Handle->pTxData, - CDC_Handle->TxDataLength, - CDC_Handle->DataItf.OutPipe, - 1); - } - - CDC_Handle->data_tx_state = CDC_SEND_DATA_WAIT; - - break; - - case CDC_SEND_DATA_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, CDC_Handle->DataItf.OutPipe); - - /*Check the status done for transmission*/ - if(URB_Status == USBH_URB_DONE ) - { - if(CDC_Handle->TxDataLength > CDC_Handle->DataItf.OutEpSize) - { - CDC_Handle->TxDataLength -= CDC_Handle->DataItf.OutEpSize ; - CDC_Handle->pTxData += CDC_Handle->DataItf.OutEpSize; - } - else - { - CDC_Handle->TxDataLength = 0; - } - - if( CDC_Handle->TxDataLength > 0) - { - CDC_Handle->data_tx_state = CDC_SEND_DATA; - } - else - { - CDC_Handle->data_tx_state = CDC_IDLE; - USBH_CDC_TransmitCallback(phost); - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - else if( URB_Status == USBH_URB_NOTREADY ) - { - CDC_Handle->data_tx_state = CDC_SEND_DATA; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - break; - default: - break; - } -} -/** -* @brief This function responsible for reception of data from the device -* @param pdev: Selected device -* @retval None -*/ - -static void CDC_ProcessReception(USBH_HandleTypeDef *phost) -{ - CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef*) phost->pActiveClass->pData; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - uint16_t length; - - switch(CDC_Handle->data_rx_state) - { - - case CDC_RECEIVE_DATA: - - USBH_BulkReceiveData (phost, - CDC_Handle->pRxData, - CDC_Handle->DataItf.InEpSize, - CDC_Handle->DataItf.InPipe); - - CDC_Handle->data_rx_state = CDC_RECEIVE_DATA_WAIT; - - break; - - case CDC_RECEIVE_DATA_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, CDC_Handle->DataItf.InPipe); - - /*Check the status done for reception*/ - if(URB_Status == USBH_URB_DONE ) - { - length = USBH_LL_GetLastXferSize(phost, CDC_Handle->DataItf.InPipe); - - if(((CDC_Handle->RxDataLength - length) > 0) && (length > CDC_Handle->DataItf.InEpSize)) - { - CDC_Handle->RxDataLength -= length ; - CDC_Handle->pRxData += length; - CDC_Handle->data_rx_state = CDC_RECEIVE_DATA; - } - else - { - CDC_Handle->data_rx_state = CDC_IDLE; - USBH_CDC_ReceiveCallback(phost); - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - break; - - default: - break; - } -} - -/** -* @brief The function informs user that data have been received -* @param pdev: Selected device -* @retval None -*/ -__weak void USBH_CDC_TransmitCallback(USBH_HandleTypeDef *phost) -{ - -} - - /** -* @brief The function informs user that data have been sent -* @param pdev: Selected device -* @retval None -*/ -__weak void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost) -{ - -} - - /** -* @brief The function informs user that Settings have been changed -* @param pdev: Selected device -* @retval None -*/ -__weak void USBH_CDC_LineCodingChanged(USBH_HandleTypeDef *phost) -{ - -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h deleted file mode 100644 index 9d4bdd2..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid.h +++ /dev/null @@ -1,350 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_hid.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_HID_H -#define __USBH_HID_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" -#include "usbh_hid_mouse.h" -#include "usbh_hid_keybd.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_CORE - * @brief This file is the Header file for usbh_hid.c - * @{ - */ - - -/** @defgroup USBH_HID_CORE_Exported_Types - * @{ - */ - -#define HID_MIN_POLL 10 -#define HID_REPORT_SIZE 16 -#define HID_MAX_USAGE 10 -#define HID_MAX_NBR_REPORT_FMT 10 -#define HID_QUEUE_SIZE 10 - -#define HID_ITEM_LONG 0xFE - -#define HID_ITEM_TYPE_MAIN 0x00 -#define HID_ITEM_TYPE_GLOBAL 0x01 -#define HID_ITEM_TYPE_LOCAL 0x02 -#define HID_ITEM_TYPE_RESERVED 0x03 - - -#define HID_MAIN_ITEM_TAG_INPUT 0x08 -#define HID_MAIN_ITEM_TAG_OUTPUT 0x09 -#define HID_MAIN_ITEM_TAG_COLLECTION 0x0A -#define HID_MAIN_ITEM_TAG_FEATURE 0x0B -#define HID_MAIN_ITEM_TAG_ENDCOLLECTION 0x0C - - -#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0x00 -#define HID_GLOBAL_ITEM_TAG_LOG_MIN 0x01 -#define HID_GLOBAL_ITEM_TAG_LOG_MAX 0x02 -#define HID_GLOBAL_ITEM_TAG_PHY_MIN 0x03 -#define HID_GLOBAL_ITEM_TAG_PHY_MAX 0x04 -#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 0x05 -#define HID_GLOBAL_ITEM_TAG_UNIT 0x06 -#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 0x07 -#define HID_GLOBAL_ITEM_TAG_REPORT_ID 0x08 -#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 0x09 -#define HID_GLOBAL_ITEM_TAG_PUSH 0x0A -#define HID_GLOBAL_ITEM_TAG_POP 0x0B - - -#define HID_LOCAL_ITEM_TAG_USAGE 0x00 -#define HID_LOCAL_ITEM_TAG_USAGE_MIN 0x01 -#define HID_LOCAL_ITEM_TAG_USAGE_MAX 0x02 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 0x03 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MIN 0x04 -#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAX 0x05 -#define HID_LOCAL_ITEM_TAG_STRING_INDEX 0x07 -#define HID_LOCAL_ITEM_TAG_STRING_MIN 0x08 -#define HID_LOCAL_ITEM_TAG_STRING_MAX 0x09 -#define HID_LOCAL_ITEM_TAG_DELIMITER 0x0A - - -/* States for HID State Machine */ -typedef enum -{ - HID_INIT= 0, - HID_IDLE, - HID_SEND_DATA, - HID_BUSY, - HID_GET_DATA, - HID_SYNC, - HID_POLL, - HID_ERROR, -} -HID_StateTypeDef; - -typedef enum -{ - HID_REQ_INIT = 0, - HID_REQ_IDLE, - HID_REQ_GET_REPORT_DESC, - HID_REQ_GET_HID_DESC, - HID_REQ_SET_IDLE, - HID_REQ_SET_PROTOCOL, - HID_REQ_SET_REPORT, - -} -HID_CtlStateTypeDef; - -typedef enum -{ - HID_MOUSE = 0x01, - HID_KEYBOARD = 0x02, - HID_UNKNOWN = 0xFF, -} -HID_TypeTypeDef; - - -typedef struct _HID_ReportData -{ - uint8_t ReportID; - uint8_t ReportType; - uint16_t UsagePage; - uint32_t Usage[HID_MAX_USAGE]; - uint32_t NbrUsage; - uint32_t UsageMin; - uint32_t UsageMax; - int32_t LogMin; - int32_t LogMax; - int32_t PhyMin; - int32_t PhyMax; - int32_t UnitExp; - uint32_t Unit; - uint32_t ReportSize; - uint32_t ReportCnt; - uint32_t Flag; - uint32_t PhyUsage; - uint32_t AppUsage; - uint32_t LogUsage; -} -HID_ReportDataTypeDef; - -typedef struct _HID_ReportIDTypeDef { - uint8_t Size; /* Report size return by the device id */ - uint8_t ReportID; /* Report Id */ - uint8_t Type; /* Report Type (INPUT/OUTPUT/FEATURE) */ -} HID_ReportIDTypeDef; - -typedef struct _HID_CollectionTypeDef -{ - uint32_t Usage; - uint8_t Type; - struct _HID_CollectionTypeDef *NextPtr; -} HID_CollectionTypeDef; - - -typedef struct _HID_AppCollectionTypeDef { - uint32_t Usage; - uint8_t Type; - uint8_t NbrReportFmt; - HID_ReportDataTypeDef ReportData[HID_MAX_NBR_REPORT_FMT]; -} HID_AppCollectionTypeDef; - - -typedef struct _HIDDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; /* indicates what endpoint this descriptor is describing */ - uint8_t bCountryCode; /* specifies the transfer type. */ - uint8_t bNumDescriptors; /* specifies the transfer type. */ - uint8_t bReportDescriptorType; /* Maximum Packet Size this endpoint is capable of sending or receiving */ - uint16_t wItemLength; /* is used to specify the polling interval of certain transfers. */ -} -HID_DescTypeDef; - - -typedef struct -{ - uint8_t *buf; - uint16_t head; - uint16_t tail; - uint16_t size; - uint8_t lock; -} FIFO_TypeDef; - - -/* Structure for HID process */ -typedef struct _HID_Process -{ - uint8_t OutPipe; - uint8_t InPipe; - HID_StateTypeDef state; - uint8_t OutEp; - uint8_t InEp; - HID_CtlStateTypeDef ctl_state; - FIFO_TypeDef fifo; - uint8_t *pData; - uint16_t length; - uint8_t ep_addr; - uint16_t poll; - uint32_t timer; - uint8_t DataReady; - HID_DescTypeDef HID_Desc; - USBH_StatusTypeDef ( * Init)(USBH_HandleTypeDef *phost); -} -HID_HandleTypeDef; - -/** - * @} - */ - -/** @defgroup USBH_HID_CORE_Exported_Defines - * @{ - */ - -#define USB_HID_GET_REPORT 0x01 -#define USB_HID_GET_IDLE 0x02 -#define USB_HID_GET_PROTOCOL 0x03 -#define USB_HID_SET_REPORT 0x09 -#define USB_HID_SET_IDLE 0x0A -#define USB_HID_SET_PROTOCOL 0x0B - - - - -/* HID Class Codes */ -#define USB_HID_CLASS 0x03 - -/* Interface Descriptor field values for HID Boot Protocol */ -#define HID_BOOT_CODE 0x01 -#define HID_KEYBRD_BOOT_CODE 0x01 -#define HID_MOUSE_BOOT_CODE 0x02 - - -/** - * @} - */ - -/** @defgroup USBH_HID_CORE_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_CORE_Exported_Variables - * @{ - */ -extern USBH_ClassTypeDef HID_Class; -#define USBH_HID_CLASS &HID_Class -/** - * @} - */ - -/** @defgroup USBH_HID_CORE_Exported_FunctionsPrototype - * @{ - */ - -USBH_StatusTypeDef USBH_HID_SetReport (USBH_HandleTypeDef *phost, - uint8_t reportType, - uint8_t reportId, - uint8_t* reportBuff, - uint8_t reportLen); - -USBH_StatusTypeDef USBH_HID_GetReport (USBH_HandleTypeDef *phost, - uint8_t reportType, - uint8_t reportId, - uint8_t* reportBuff, - uint8_t reportLen); - -USBH_StatusTypeDef USBH_HID_GetHIDReportDescriptor (USBH_HandleTypeDef *phost, - uint16_t length); - -USBH_StatusTypeDef USBH_HID_GetHIDDescriptor (USBH_HandleTypeDef *phost, - uint16_t length); - -USBH_StatusTypeDef USBH_HID_SetIdle (USBH_HandleTypeDef *phost, - uint8_t duration, - uint8_t reportId); - -USBH_StatusTypeDef USBH_HID_SetProtocol (USBH_HandleTypeDef *phost, - uint8_t protocol); - -void USBH_HID_EventCallback(USBH_HandleTypeDef *phost); - -HID_TypeTypeDef USBH_HID_GetDeviceType(USBH_HandleTypeDef *phost); - -uint8_t USBH_HID_GetPollInterval(USBH_HandleTypeDef *phost); - -void fifo_init(FIFO_TypeDef * f, uint8_t * buf, uint16_t size); - -uint16_t fifo_read(FIFO_TypeDef * f, void * buf, uint16_t nbytes); - -uint16_t fifo_write(FIFO_TypeDef * f, const void * buf, uint16_t nbytes); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_HID_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_keybd.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_keybd.h deleted file mode 100644 index 29678e0..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_keybd.h +++ /dev/null @@ -1,326 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_keybd.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_hid_keybd.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive -----------------------------------------------*/ -#ifndef __USBH_HID_KEYBD_H -#define __USBH_HID_KEYBD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid.h" -#include "usbh_hid_keybd.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_KEYBD - * @brief This file is the Header file for usbh_hid_keybd.c - * @{ - */ - - -/** @defgroup USBH_HID_KEYBD_Exported_Types - * @{ - */ -#define KEY_NONE 0x00 -#define KEY_ERRORROLLOVER 0x01 -#define KEY_POSTFAIL 0x02 -#define KEY_ERRORUNDEFINED 0x03 -#define KEY_A 0x04 -#define KEY_B 0x05 -#define KEY_C 0x06 -#define KEY_D 0x07 -#define KEY_E 0x08 -#define KEY_F 0x09 -#define KEY_G 0x0A -#define KEY_H 0x0B -#define KEY_I 0x0C -#define KEY_J 0x0D -#define KEY_K 0x0E -#define KEY_L 0x0F -#define KEY_M 0x10 -#define KEY_N 0x11 -#define KEY_O 0x12 -#define KEY_P 0x13 -#define KEY_Q 0x14 -#define KEY_R 0x15 -#define KEY_S 0x16 -#define KEY_T 0x17 -#define KEY_U 0x18 -#define KEY_V 0x19 -#define KEY_W 0x1A -#define KEY_X 0x1B -#define KEY_Y 0x1C -#define KEY_Z 0x1D -#define KEY_1_EXCLAMATION_MARK 0x1E -#define KEY_2_AT 0x1F -#define KEY_3_NUMBER_SIGN 0x20 -#define KEY_4_DOLLAR 0x21 -#define KEY_5_PERCENT 0x22 -#define KEY_6_CARET 0x23 -#define KEY_7_AMPERSAND 0x24 -#define KEY_8_ASTERISK 0x25 -#define KEY_9_OPARENTHESIS 0x26 -#define KEY_0_CPARENTHESIS 0x27 -#define KEY_ENTER 0x28 -#define KEY_ESCAPE 0x29 -#define KEY_BACKSPACE 0x2A -#define KEY_TAB 0x2B -#define KEY_SPACEBAR 0x2C -#define KEY_MINUS_UNDERSCORE 0x2D -#define KEY_EQUAL_PLUS 0x2E -#define KEY_OBRACKET_AND_OBRACE 0x2F -#define KEY_CBRACKET_AND_CBRACE 0x30 -#define KEY_BACKSLASH_VERTICAL_BAR 0x31 -#define KEY_NONUS_NUMBER_SIGN_TILDE 0x32 -#define KEY_SEMICOLON_COLON 0x33 -#define KEY_SINGLE_AND_DOUBLE_QUOTE 0x34 -#define KEY_GRAVE ACCENT AND TILDE 0x35 -#define KEY_COMMA_AND_LESS 0x36 -#define KEY_DOT_GREATER 0x37 -#define KEY_SLASH_QUESTION 0x38 -#define KEY_CAPS LOCK 0x39 -#define KEY_F1 0x3A -#define KEY_F2 0x3B -#define KEY_F3 0x3C -#define KEY_F4 0x3D -#define KEY_F5 0x3E -#define KEY_F6 0x3F -#define KEY_F7 0x40 -#define KEY_F8 0x41 -#define KEY_F9 0x42 -#define KEY_F10 0x43 -#define KEY_F11 0x44 -#define KEY_F12 0x45 -#define KEY_PRINTSCREEN 0x46 -#define KEY_SCROLL LOCK 0x47 -#define KEY_PAUSE 0x48 -#define KEY_INSERT 0x49 -#define KEY_HOME 0x4A -#define KEY_PAGEUP 0x4B -#define KEY_DELETE 0x4C -#define KEY_END1 0x4D -#define KEY_PAGEDOWN 0x4E -#define KEY_RIGHTARROW 0x4F -#define KEY_LEFTARROW 0x50 -#define KEY_DOWNARROW 0x51 -#define KEY_UPARROW 0x52 -#define KEY_KEYPAD_NUM_LOCK_AND_CLEAR 0x53 -#define KEY_KEYPAD_SLASH 0x54 -#define KEY_KEYPAD_ASTERIKS 0x55 -#define KEY_KEYPAD_MINUS 0x56 -#define KEY_KEYPAD_PLUS 0x57 -#define KEY_KEYPAD_ENTER 0x58 -#define KEY_KEYPAD_1_END 0x59 -#define KEY_KEYPAD_2_DOWN_ARROW 0x5A -#define KEY_KEYPAD_3_PAGEDN 0x5B -#define KEY_KEYPAD_4_LEFT_ARROW 0x5C -#define KEY_KEYPAD_5 0x5D -#define KEY_KEYPAD_6_RIGHT_ARROW 0x5E -#define KEY_KEYPAD_7_HOME 0x5F -#define KEY_KEYPAD_8_UP_ARROW 0x60 -#define KEY_KEYPAD_9_PAGEUP 0x61 -#define KEY_KEYPAD_0_INSERT 0x62 -#define KEY_KEYPAD_DECIMAL_SEPARATOR_DELETE 0x63 -#define KEY_NONUS_BACK_SLASH_VERTICAL_BAR 0x64 -#define KEY_APPLICATION 0x65 -#define KEY_POWER 0x66 -#define KEY_KEYPAD_EQUAL 0x67 -#define KEY_F13 0x68 -#define KEY_F14 0x69 -#define KEY_F15 0x6A -#define KEY_F16 0x6B -#define KEY_F17 0x6C -#define KEY_F18 0x6D -#define KEY_F19 0x6E -#define KEY_F20 0x6F -#define KEY_F21 0x70 -#define KEY_F22 0x71 -#define KEY_F23 0x72 -#define KEY_F24 0x73 -#define KEY_EXECUTE 0x74 -#define KEY_HELP 0x75 -#define KEY_MENU 0x76 -#define KEY_SELECT 0x77 -#define KEY_STOP 0x78 -#define KEY_AGAIN 0x79 -#define KEY_UNDO 0x7A -#define KEY_CUT 0x7B -#define KEY_COPY 0x7C -#define KEY_PASTE 0x7D -#define KEY_FIND 0x7E -#define KEY_MUTE 0x7F -#define KEY_VOLUME_UP 0x80 -#define KEY_VOLUME_DOWN 0x81 -#define KEY_LOCKING_CAPS_LOCK 0x82 -#define KEY_LOCKING_NUM_LOCK 0x83 -#define KEY_LOCKING_SCROLL_LOCK 0x84 -#define KEY_KEYPAD_COMMA 0x85 -#define KEY_KEYPAD_EQUAL_SIGN 0x86 -#define KEY_INTERNATIONAL1 0x87 -#define KEY_INTERNATIONAL2 0x88 -#define KEY_INTERNATIONAL3 0x89 -#define KEY_INTERNATIONAL4 0x8A -#define KEY_INTERNATIONAL5 0x8B -#define KEY_INTERNATIONAL6 0x8C -#define KEY_INTERNATIONAL7 0x8D -#define KEY_INTERNATIONAL8 0x8E -#define KEY_INTERNATIONAL9 0x8F -#define KEY_LANG1 0x90 -#define KEY_LANG2 0x91 -#define KEY_LANG3 0x92 -#define KEY_LANG4 0x93 -#define KEY_LANG5 0x94 -#define KEY_LANG6 0x95 -#define KEY_LANG7 0x96 -#define KEY_LANG8 0x97 -#define KEY_LANG9 0x98 -#define KEY_ALTERNATE_ERASE 0x99 -#define KEY_SYSREQ 0x9A -#define KEY_CANCEL 0x9B -#define KEY_CLEAR 0x9C -#define KEY_PRIOR 0x9D -#define KEY_RETURN 0x9E -#define KEY_SEPARATOR 0x9F -#define KEY_OUT 0xA0 -#define KEY_OPER 0xA1 -#define KEY_CLEAR_AGAIN 0xA2 -#define KEY_CRSEL 0xA3 -#define KEY_EXSEL 0xA4 -#define KEY_KEYPAD_00 0xB0 -#define KEY_KEYPAD_000 0xB1 -#define KEY_THOUSANDS_SEPARATOR 0xB2 -#define KEY_DECIMAL_SEPARATOR 0xB3 -#define KEY_CURRENCY_UNIT 0xB4 -#define KEY_CURRENCY_SUB_UNIT 0xB5 -#define KEY_KEYPAD_OPARENTHESIS 0xB6 -#define KEY_KEYPAD_CPARENTHESIS 0xB7 -#define KEY_KEYPAD_OBRACE 0xB8 -#define KEY_KEYPAD_CBRACE 0xB9 -#define KEY_KEYPAD_TAB 0xBA -#define KEY_KEYPAD_BACKSPACE 0xBB -#define KEY_KEYPAD_A 0xBC -#define KEY_KEYPAD_B 0xBD -#define KEY_KEYPAD_C 0xBE -#define KEY_KEYPAD_D 0xBF -#define KEY_KEYPAD_E 0xC0 -#define KEY_KEYPAD_F 0xC1 -#define KEY_KEYPAD_XOR 0xC2 -#define KEY_KEYPAD_CARET 0xC3 -#define KEY_KEYPAD_PERCENT 0xC4 -#define KEY_KEYPAD_LESS 0xC5 -#define KEY_KEYPAD_GREATER 0xC6 -#define KEY_KEYPAD_AMPERSAND 0xC7 -#define KEY_KEYPAD_LOGICAL_AND 0xC8 -#define KEY_KEYPAD_VERTICAL_BAR 0xC9 -#define KEY_KEYPAD_LOGIACL_OR 0xCA -#define KEY_KEYPAD_COLON 0xCB -#define KEY_KEYPAD_NUMBER_SIGN 0xCC -#define KEY_KEYPAD_SPACE 0xCD -#define KEY_KEYPAD_AT 0xCE -#define KEY_KEYPAD_EXCLAMATION_MARK 0xCF -#define KEY_KEYPAD_MEMORY_STORE 0xD0 -#define KEY_KEYPAD_MEMORY_RECALL 0xD1 -#define KEY_KEYPAD_MEMORY_CLEAR 0xD2 -#define KEY_KEYPAD_MEMORY_ADD 0xD3 -#define KEY_KEYPAD_MEMORY_SUBTRACT 0xD4 -#define KEY_KEYPAD_MEMORY_MULTIPLY 0xD5 -#define KEY_KEYPAD_MEMORY_DIVIDE 0xD6 -#define KEY_KEYPAD_PLUSMINUS 0xD7 -#define KEY_KEYPAD_CLEAR 0xD8 -#define KEY_KEYPAD_CLEAR_ENTRY 0xD9 -#define KEY_KEYPAD_BINARY 0xDA -#define KEY_KEYPAD_OCTAL 0xDB -#define KEY_KEYPAD_DECIMAL 0xDC -#define KEY_KEYPAD_HEXADECIMAL 0xDD -#define KEY_LEFTCONTROL 0xE0 -#define KEY_LEFTSHIFT 0xE1 -#define KEY_LEFTALT 0xE2 -#define KEY_LEFT_GUI 0xE3 -#define KEY_RIGHTCONTROL 0xE4 -#define KEY_RIGHTSHIFT 0xE5 -#define KEY_RIGHTALT 0xE6 -#define KEY_RIGHT_GUI 0xE7 - -typedef struct -{ - uint8_t state; - uint8_t lctrl; - uint8_t lshift; - uint8_t lalt; - uint8_t lgui; - uint8_t rctrl; - uint8_t rshift; - uint8_t ralt; - uint8_t rgui; - uint8_t keys[6]; -} -HID_KEYBD_Info_TypeDef; - -USBH_StatusTypeDef USBH_HID_KeybdInit(USBH_HandleTypeDef *phost); -HID_KEYBD_Info_TypeDef *USBH_HID_GetKeybdInfo(USBH_HandleTypeDef *phost); -uint8_t USBH_HID_GetASCIICode(HID_KEYBD_Info_TypeDef *info); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_HID_KEYBD_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_mouse.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_mouse.h deleted file mode 100644 index cf46a40..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_mouse.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_mouse.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_hid_mouse.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_HID_MOUSE_H -#define __USBH_HID_MOUSE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_MOUSE - * @brief This file is the Header file for usbh_hid_mouse.c - * @{ - */ - - -/** @defgroup USBH_HID_MOUSE_Exported_Types - * @{ - */ - -typedef struct _HID_MOUSE_Info -{ - uint8_t x; - uint8_t y; - uint8_t buttons[3]; -} -HID_MOUSE_Info_TypeDef; - -/** - * @} - */ - -/** @defgroup USBH_HID_MOUSE_Exported_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_MOUSE_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_MOUSE_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_MOUSE_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_HID_MouseInit(USBH_HandleTypeDef *phost); -HID_MOUSE_Info_TypeDef *USBH_HID_GetMouseInfo(USBH_HandleTypeDef *phost); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_HID_MOUSE_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_parser.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_parser.h deleted file mode 100644 index 5df2137..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_parser.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_parser.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the header file of the usbh_hid_parser.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive -----------------------------------------------*/ -#ifndef __USBH_HID_PARSER_H -#define __USBH_HID_PARSER_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid.h" -#include "usbh_hid_usage.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_PARSER - * @brief This file is the Header file for usbh_hid_parser.c - * @{ - */ - - -/** @defgroup USBH_HID_PARSER_Exported_Types - * @{ - */ -typedef struct -{ - uint8_t *data; - uint32_t size; - uint8_t shift; - uint8_t count; - uint8_t sign; - uint32_t logical_min; /*min value device can return*/ - uint32_t logical_max; /*max value device can return*/ - uint32_t physical_min; /*min vale read can report*/ - uint32_t physical_max; /*max value read can report*/ - uint32_t resolution; -} -HID_Report_ItemTypedef; - - -uint32_t HID_ReadItem (HID_Report_ItemTypedef *ri, uint8_t ndx); -uint32_t HID_WriteItem(HID_Report_ItemTypedef *ri, uint32_t value, uint8_t ndx); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_HID_PARSER_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_usage.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_usage.h deleted file mode 100644 index 27fc0e9..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Inc/usbh_hid_usage.h +++ /dev/null @@ -1,200 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_usage.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contain the USAGE page codes - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USDH_HID_USAGE_H -#define __USDH_HID_USAGE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_USAGE - * @brief This file is the Header file for usbh_hid_usage.c - * @{ - */ - - -/** @defgroup USBH_HID_USAGE_Exported_Types - * @{ - */ - -/****************************************************/ -/* HID 1.11 usage pages */ -/****************************************************/ - -#define HID_USAGE_PAGE_UNDEFINED uint16_t (0x00) /* Undefined */ -/**** Top level pages */ -#define HID_USAGE_PAGE_GEN_DES uint16_t (0x01) /* Generic Desktop Controls*/ -#define HID_USAGE_PAGE_SIM_CTR uint16_t (0x02) /* Simulation Controls */ -#define HID_USAGE_PAGE_VR_CTR uint16_t (0x03) /* VR Controls */ -#define HID_USAGE_PAGE_SPORT_CTR uint16_t (0x04) /* Sport Controls */ -#define HID_USAGE_PAGE_GAME_CTR uint16_t (0x05) /* Game Controls */ -#define HID_USAGE_PAGE_GEN_DEV uint16_t (0x06) /* Generic Device Controls */ -#define HID_USAGE_PAGE_KEYB uint16_t (0x07) /* Keyboard/Keypad */ -#define HID_USAGE_PAGE_LED uint16_t (0x08) /* LEDs */ -#define HID_USAGE_PAGE_BUTTON uint16_t (0x09) /* Button */ -#define HID_USAGE_PAGE_ORDINAL uint16_t (0x0A) /* Ordinal */ -#define HID_USAGE_PAGE_PHONE uint16_t (0x0B) /* Telephony */ -#define HID_USAGE_PAGE_CONSUMER uint16_t (0x0C) /* Consumer */ -#define HID_USAGE_PAGE_DIGITIZER uint16_t (0x0D) /* Digitizer*/ -/* 0E Reserved */ -#define HID_USAGE_PAGE_PID uint16_t (0x0F) /* PID Page (force feedback and related devices) */ -#define HID_USAGE_PAGE_UNICODE uint16_t (0x10) /* Unicode */ -/* 11-13 Reserved */ -#define HID_USAGE_PAGE_ALNUM_DISP uint16_t (0x14) /* Alphanumeric Display */ -/* 15-1f Reserved */ -/**** END of top level pages */ -/* 25-3f Reserved */ -#define HID_USAGE_PAGE_MEDICAL uint16_t (0x40) /* Medical Instruments */ -/* 41-7F Reserved */ -/*80-83 Monitor pages USB Device Class Definition for Monitor Devices - 84-87 Power pages USB Device Class Definition for Power Devices */ -/* 88-8B Reserved */ -#define HID_USAGE_PAGE_BARCODE uint16_t (0x8C) /* Bar Code Scanner page */ -#define HID_USAGE_PAGE_SCALE uint16_t (0x8D) /* Scale page */ -#define HID_USAGE_PAGE_MSR uint16_t (0x8E) /* Magnetic Stripe Reading (MSR) Devices */ -#define HID_USAGE_PAGE_POS uint16_t (0x8F) /* Reserved Point of Sale pages */ -#define HID_USAGE_PAGE_CAMERA_CTR uint16_t (0x90) /* Camera Control Page */ -#define HID_USAGE_PAGE_ARCADE uint16_t (0x91) /* Arcade Page */ - -/****************************************************/ -/* Usage definitions for the "Generic Desktop" page */ -/****************************************************/ -#define HID_USAGE_UNDEFINED uint16_t (0x00) /* Undefined */ -#define HID_USAGE_POINTER uint16_t (0x01) /* Pointer (Physical Collection) */ -#define HID_USAGE_MOUSE uint16_t (0x02) /* Mouse (Application Collection) */ -/* 03 Reserved */ -#define HID_USAGE_JOYSTICK uint16_t (0x04) /* Joystick (Application Collection) */ -#define HID_USAGE_GAMEPAD uint16_t (0x05) /* Game Pad (Application Collection) */ -#define HID_USAGE_KBD uint16_t (0x06) /* Keyboard (Application Collection) */ -#define HID_USAGE_KEYPAD uint16_t (0x07) /* Keypad (Application Collection) */ -#define HID_USAGE_MAX_CTR uint16_t (0x08) /* Multi-axis Controller (Application Collection) */ -/* 09-2F Reserved */ -#define HID_USAGE_X uint16_t (0x30) /* X (Dynamic Value) */ -#define HID_USAGE_Y uint16_t (0x31) /* Y (Dynamic Value) */ -#define HID_USAGE_Z uint16_t (0x32) /* Z (Dynamic Value) */ -#define HID_USAGE_RX uint16_t (0x33) /* Rx (Dynamic Value) */ -#define HID_USAGE_RY uint16_t (0x34) /* Ry (Dynamic Value) */ -#define HID_USAGE_RZ uint16_t (0x35) /* Rz (Dynamic Value) */ -#define HID_USAGE_SLIDER uint16_t (0x36) /* Slider (Dynamic Value) */ -#define HID_USAGE_DIAL uint16_t (0x37) /* Dial (Dynamic Value) */ -#define HID_USAGE_WHEEL uint16_t (0x38) /* Wheel (Dynamic Value) */ -#define HID_USAGE_HATSW uint16_t (0x39) /* Hat switch (Dynamic Value) */ -#define HID_USAGE_COUNTEDBUF uint16_t (0x3A) /* Counted Buffer (Logical Collection) */ -#define HID_USAGE_BYTECOUNT uint16_t (0x3B) /* Byte Count (Dynamic Value) */ -#define HID_USAGE_MOTIONWAKE uint16_t (0x3C) /* Motion Wakeup (One Shot Control) */ -#define HID_USAGE_START uint16_t (0x3D) /* Start (On/Off Control) */ -#define HID_USAGE_SELECT uint16_t (0x3E) /* Select (On/Off Control) */ -/* 3F Reserved */ -#define HID_USAGE_VX uint16_t (0x40) /* Vx (Dynamic Value) */ -#define HID_USAGE_VY uint16_t (0x41) /* Vy (Dynamic Value) */ -#define HID_USAGE_VZ uint16_t (0x42) /* Vz (Dynamic Value) */ -#define HID_USAGE_VBRX uint16_t (0x43) /* Vbrx (Dynamic Value) */ -#define HID_USAGE_VBRY uint16_t (0x44) /* Vbry (Dynamic Value) */ -#define HID_USAGE_VBRZ uint16_t (0x45) /* Vbrz (Dynamic Value) */ -#define HID_USAGE_VNO uint16_t (0x46) /* Vno (Dynamic Value) */ -#define HID_USAGE_FEATNOTIF uint16_t (0x47) /* Feature Notification (Dynamic Value),(Dynamic Flag) */ -/* 48-7F Reserved */ -#define HID_USAGE_SYSCTL uint16_t (0x80) /* System Control (Application Collection) */ -#define HID_USAGE_PWDOWN uint16_t (0x81) /* System Power Down (One Shot Control) */ -#define HID_USAGE_SLEEP uint16_t (0x82) /* System Sleep (One Shot Control) */ -#define HID_USAGE_WAKEUP uint16_t (0x83) /* System Wake Up (One Shot Control) */ -#define HID_USAGE_CONTEXTM uint16_t (0x84) /* System Context Menu (One Shot Control) */ -#define HID_USAGE_MAINM uint16_t (0x85) /* System Main Menu (One Shot Control) */ -#define HID_USAGE_APPM uint16_t (0x86) /* System App Menu (One Shot Control) */ -#define HID_USAGE_MENUHELP uint16_t (0x87) /* System Menu Help (One Shot Control) */ -#define HID_USAGE_MENUEXIT uint16_t (0x88) /* System Menu Exit (One Shot Control) */ -#define HID_USAGE_MENUSELECT uint16_t (0x89) /* System Menu Select (One Shot Control) */ -#define HID_USAGE_SYSM_RIGHT uint16_t (0x8A) /* System Menu Right (Re-Trigger Control) */ -#define HID_USAGE_SYSM_LEFT uint16_t (0x8B) /* System Menu Left (Re-Trigger Control) */ -#define HID_USAGE_SYSM_UP uint16_t (0x8C) /* System Menu Up (Re-Trigger Control) */ -#define HID_USAGE_SYSM_DOWN uint16_t (0x8D) /* System Menu Down (Re-Trigger Control) */ -#define HID_USAGE_COLDRESET uint16_t (0x8E) /* System Cold Restart (One Shot Control) */ -#define HID_USAGE_WARMRESET uint16_t (0x8F) /* System Warm Restart (One Shot Control) */ -#define HID_USAGE_DUP uint16_t (0x90) /* D-pad Up (On/Off Control) */ -#define HID_USAGE_DDOWN uint16_t (0x91) /* D-pad Down (On/Off Control) */ -#define HID_USAGE_DRIGHT uint16_t (0x92) /* D-pad Right (On/Off Control) */ -#define HID_USAGE_DLEFT uint16_t (0x93) /* D-pad Left (On/Off Control) */ -/* 94-9F Reserved */ -#define HID_USAGE_SYS_DOCK uint16_t (0xA0) /* System Dock (One Shot Control) */ -#define HID_USAGE_SYS_UNDOCK uint16_t (0xA1) /* System Undock (One Shot Control) */ -#define HID_USAGE_SYS_SETUP uint16_t (0xA2) /* System Setup (One Shot Control) */ -#define HID_USAGE_SYS_BREAK uint16_t (0xA3) /* System Break (One Shot Control) */ -#define HID_USAGE_SYS_DBGBRK uint16_t (0xA4) /* System Debugger Break (One Shot Control) */ -#define HID_USAGE_APP_BRK uint16_t (0xA5) /* Application Break (One Shot Control) */ -#define HID_USAGE_APP_DBGBRK uint16_t (0xA6) /* Application Debugger Break (One Shot Control) */ -#define HID_USAGE_SYS_SPKMUTE uint16_t (0xA7) /* System Speaker Mute (One Shot Control) */ -#define HID_USAGE_SYS_HIBERN uint16_t (0xA8) /* System Hibernate (One Shot Control) */ -/* A9-AF Reserved */ -#define HID_USAGE_SYS_SIDPINV uint16_t (0xB0) /* System Display Invert (One Shot Control) */ -#define HID_USAGE_SYS_DISPINT uint16_t (0xB1) /* System Display Internal (One Shot Control) */ -#define HID_USAGE_SYS_DISPEXT uint16_t (0xB2) /* System Display External (One Shot Control) */ -#define HID_USAGE_SYS_DISPBOTH uint16_t (0xB3) /* System Display Both (One Shot Control) */ -#define HID_USAGE_SYS_DISPDUAL uint16_t (0xB4) /* System Display Dual (One Shot Control) */ -#define HID_USAGE_SYS_DISPTGLIE uint16_t (0xB5) /* System Display Toggle Int/Ext (One Shot Control) */ -#define HID_USAGE_SYS_DISP_SWAP uint16_t (0xB6) /* System Display Swap Primary/Secondary (One Shot Control) */ -#define HID_USAGE_SYS_DIPS_LCDA uint16_t (0xB7) /* System Display LCD Autoscale (One Shot Control) */ -/* B8-FFFF Reserved */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USDH_HID_USAGE_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c deleted file mode 100644 index 8b8ea93..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid.c +++ /dev/null @@ -1,824 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the HID Layer Handlers for USB Host HID class. - * - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - The Mouse and Keyboard protocols - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid.h" -#include "usbh_hid_parser.h" - - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_HID_CLASS -* @{ -*/ - -/** @defgroup USBH_HID_CORE -* @brief This file includes HID Layer Handlers for USB Host HID class. -* @{ -*/ - -/** @defgroup USBH_HID_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_HID_CORE_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_HID_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_HID_CORE_Private_Variables -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBH_HID_CORE_Private_FunctionPrototypes -* @{ -*/ - -static USBH_StatusTypeDef USBH_HID_InterfaceInit (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_HID_InterfaceDeInit (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_HID_ClassRequest(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_HID_Process(USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef USBH_HID_SOFProcess(USBH_HandleTypeDef *phost); -static void USBH_HID_ParseHIDDesc (HID_DescTypeDef *desc, uint8_t *buf); - -extern USBH_StatusTypeDef USBH_HID_MouseInit(USBH_HandleTypeDef *phost); -extern USBH_StatusTypeDef USBH_HID_KeybdInit(USBH_HandleTypeDef *phost); - -USBH_ClassTypeDef HID_Class = -{ - "HID", - USB_HID_CLASS, - USBH_HID_InterfaceInit, - USBH_HID_InterfaceDeInit, - USBH_HID_ClassRequest, - USBH_HID_Process, - USBH_HID_SOFProcess, - NULL, -}; -/** -* @} -*/ - - -/** @defgroup USBH_HID_CORE_Private_Functions -* @{ -*/ - - -/** - * @brief USBH_HID_InterfaceInit - * The function init the HID class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_InterfaceInit (USBH_HandleTypeDef *phost) -{ - uint8_t max_ep; - uint8_t num = 0; - uint8_t interface; - - USBH_StatusTypeDef status = USBH_FAIL ; - HID_HandleTypeDef *HID_Handle; - - interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, HID_BOOT_CODE, 0xFF); - - if(interface == 0xFF) /* No Valid Interface */ - { - status = USBH_FAIL; - USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name); - } - else - { - USBH_SelectInterface (phost, interface); - phost->pActiveClass->pData = (HID_HandleTypeDef *)USBH_malloc (sizeof(HID_HandleTypeDef)); - HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - HID_Handle->state = HID_ERROR; - - /*Decode Bootclass Protocol: Mouse or Keyboard*/ - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol == HID_KEYBRD_BOOT_CODE) - { - USBH_UsrLog ("KeyBoard device found!"); - HID_Handle->Init = USBH_HID_KeybdInit; - } - else if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol == HID_MOUSE_BOOT_CODE) - { - USBH_UsrLog ("Mouse device found!"); - HID_Handle->Init = USBH_HID_MouseInit; - } - else - { - USBH_UsrLog ("Protocol not supported."); - return USBH_FAIL; - } - - HID_Handle->state = HID_INIT; - HID_Handle->ctl_state = HID_REQ_INIT; - HID_Handle->ep_addr = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress; - HID_Handle->length = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].wMaxPacketSize; - HID_Handle->poll = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bInterval ; - - if (HID_Handle->poll < HID_MIN_POLL) - { - HID_Handle->poll = HID_MIN_POLL; - } - - /* Check fo available number of endpoints */ - /* Find the number of EPs in the Interface Descriptor */ - /* Choose the lower number in order not to overrun the buffer allocated */ - max_ep = ( (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bNumEndpoints <= USBH_MAX_NUM_ENDPOINTS) ? - phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bNumEndpoints : - USBH_MAX_NUM_ENDPOINTS); - - - /* Decode endpoint IN and OUT address from interface descriptor */ - for ( ;num < max_ep; num++) - { - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[num].bEndpointAddress & 0x80) - { - HID_Handle->InEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[num].bEndpointAddress); - HID_Handle->InPipe =\ - USBH_AllocPipe(phost, HID_Handle->InEp); - - /* Open pipe for IN endpoint */ - USBH_OpenPipe (phost, - HID_Handle->InPipe, - HID_Handle->InEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_INTR, - HID_Handle->length); - - USBH_LL_SetToggle (phost, HID_Handle->InPipe, 0); - - } - else - { - HID_Handle->OutEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[num].bEndpointAddress); - HID_Handle->OutPipe =\ - USBH_AllocPipe(phost, HID_Handle->OutEp); - - /* Open pipe for OUT endpoint */ - USBH_OpenPipe (phost, - HID_Handle->OutPipe, - HID_Handle->OutEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_INTR, - HID_Handle->length); - - USBH_LL_SetToggle (phost, HID_Handle->OutPipe, 0); - } - - } - status = USBH_OK; - } - return status; -} - -/** - * @brief USBH_HID_InterfaceDeInit - * The function DeInit the Pipes used for the HID class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_InterfaceDeInit (USBH_HandleTypeDef *phost ) -{ - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - if(HID_Handle->InPipe != 0x00) - { - USBH_ClosePipe (phost, HID_Handle->InPipe); - USBH_FreePipe (phost, HID_Handle->InPipe); - HID_Handle->InPipe = 0; /* Reset the pipe as Free */ - } - - if(HID_Handle->OutPipe != 0x00) - { - USBH_ClosePipe(phost, HID_Handle->OutPipe); - USBH_FreePipe (phost, HID_Handle->OutPipe); - HID_Handle->OutPipe = 0; /* Reset the pipe as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - } - - return USBH_OK; -} - -/** - * @brief USBH_HID_ClassRequest - * The function is responsible for handling Standard requests - * for HID class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_ClassRequest(USBH_HandleTypeDef *phost) -{ - - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef classReqStatus = USBH_BUSY; - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - /* Switch HID state machine */ - switch (HID_Handle->ctl_state) - { - case HID_REQ_INIT: - case HID_REQ_GET_HID_DESC: - - /* Get HID Desc */ - if (USBH_HID_GetHIDDescriptor (phost, USB_HID_DESC_SIZE)== USBH_OK) - { - - USBH_HID_ParseHIDDesc(&HID_Handle->HID_Desc, phost->device.Data); - HID_Handle->ctl_state = HID_REQ_GET_REPORT_DESC; - } - - break; - case HID_REQ_GET_REPORT_DESC: - - - /* Get Report Desc */ - if (USBH_HID_GetHIDReportDescriptor(phost, HID_Handle->HID_Desc.wItemLength) == USBH_OK) - { - /* The descriptor is available in phost->device.Data */ - - HID_Handle->ctl_state = HID_REQ_SET_IDLE; - } - - break; - - case HID_REQ_SET_IDLE: - - classReqStatus = USBH_HID_SetIdle (phost, 0, 0); - - /* set Idle */ - if (classReqStatus == USBH_OK) - { - HID_Handle->ctl_state = HID_REQ_SET_PROTOCOL; - } - else if(classReqStatus == USBH_NOT_SUPPORTED) - { - HID_Handle->ctl_state = HID_REQ_SET_PROTOCOL; - } - break; - - case HID_REQ_SET_PROTOCOL: - /* set protocol */ - if (USBH_HID_SetProtocol (phost, 0) == USBH_OK) - { - HID_Handle->ctl_state = HID_REQ_IDLE; - - /* all requests performed*/ - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - status = USBH_OK; - } - break; - - case HID_REQ_IDLE: - default: - break; - } - - return status; -} - -/** - * @brief USBH_HID_Process - * The function is for managing state machine for HID data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_Process(USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_OK; - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - switch (HID_Handle->state) - { - case HID_INIT: - HID_Handle->Init(phost); - case HID_IDLE: - if(USBH_HID_GetReport (phost, - 0x01, - 0, - HID_Handle->pData, - HID_Handle->length) == USBH_OK) - { - - fifo_write(&HID_Handle->fifo, HID_Handle->pData, HID_Handle->length); - HID_Handle->state = HID_SYNC; - } - - break; - - case HID_SYNC: - - /* Sync with start of Even Frame */ - if(phost->Timer & 1) - { - HID_Handle->state = HID_GET_DATA; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - break; - - case HID_GET_DATA: - - USBH_InterruptReceiveData(phost, - HID_Handle->pData, - HID_Handle->length, - HID_Handle->InPipe); - - HID_Handle->state = HID_POLL; - HID_Handle->timer = phost->Timer; - HID_Handle->DataReady = 0; - break; - - case HID_POLL: - - if(USBH_LL_GetURBState(phost , HID_Handle->InPipe) == USBH_URB_DONE) - { - if(HID_Handle->DataReady == 0) - { - fifo_write(&HID_Handle->fifo, HID_Handle->pData, HID_Handle->length); - HID_Handle->DataReady = 1; - USBH_HID_EventCallback(phost); -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - } - else if(USBH_LL_GetURBState(phost , HID_Handle->InPipe) == USBH_URB_STALL) /* IN Endpoint Stalled */ - { - - /* Issue Clear Feature on interrupt IN endpoint */ - if(USBH_ClrFeature(phost, - HID_Handle->ep_addr) == USBH_OK) - { - /* Change state to issue next IN token */ - HID_Handle->state = HID_GET_DATA; - } - } - - - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_HID_SOFProcess - * The function is for managing the SOF Process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_SOFProcess(USBH_HandleTypeDef *phost) -{ - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - if(HID_Handle->state == HID_POLL) - { - if(( phost->Timer - HID_Handle->timer) >= HID_Handle->poll) - { - HID_Handle->state = HID_GET_DATA; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - } - return USBH_OK; -} - -/** -* @brief USBH_Get_HID_ReportDescriptor - * Issue report Descriptor command to the device. Once the response - * received, parse the report descriptor and update the status. - * @param phost: Host handle - * @param Length : HID Report Descriptor Length - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_GetHIDReportDescriptor (USBH_HandleTypeDef *phost, - uint16_t length) -{ - - USBH_StatusTypeDef status; - - status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD, - USB_DESC_HID_REPORT, - phost->device.Data, - length); - - /* HID report descriptor is available in phost->device.Data. - In case of USB Boot Mode devices for In report handling , - HID report descriptor parsing is not required. - In case, for supporting Non-Boot Protocol devices and output reports, - user may parse the report descriptor*/ - - - return status; -} - -/** - * @brief USBH_Get_HID_Descriptor - * Issue HID Descriptor command to the device. Once the response - * received, parse the report descriptor and update the status. - * @param phost: Host handle - * @param Length : HID Descriptor Length - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_GetHIDDescriptor (USBH_HandleTypeDef *phost, - uint16_t length) -{ - - USBH_StatusTypeDef status; - - status = USBH_GetDescriptor( phost, - USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD, - USB_DESC_HID, - phost->device.Data, - length); - - return status; -} - -/** - * @brief USBH_Set_Idle - * Set Idle State. - * @param phost: Host handle - * @param duration: Duration for HID Idle request - * @param reportId : Targeted report ID for Set Idle request - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_SetIdle (USBH_HandleTypeDef *phost, - uint8_t duration, - uint8_t reportId) -{ - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\ - USB_REQ_TYPE_CLASS; - - - phost->Control.setup.b.bRequest = USB_HID_SET_IDLE; - phost->Control.setup.b.wValue.w = (duration << 8 ) | reportId; - - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - - return USBH_CtlReq(phost, 0 , 0 ); -} - - -/** - * @brief USBH_HID_Set_Report - * Issues Set Report - * @param phost: Host handle - * @param reportType : Report type to be sent - * @param reportId : Targeted report ID for Set Report request - * @param reportBuff : Report Buffer - * @param reportLen : Length of data report to be send - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_SetReport (USBH_HandleTypeDef *phost, - uint8_t reportType, - uint8_t reportId, - uint8_t* reportBuff, - uint8_t reportLen) -{ - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\ - USB_REQ_TYPE_CLASS; - - - phost->Control.setup.b.bRequest = USB_HID_SET_REPORT; - phost->Control.setup.b.wValue.w = (reportType << 8 ) | reportId; - - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = reportLen; - - return USBH_CtlReq(phost, reportBuff , reportLen ); -} - - -/** - * @brief USBH_HID_GetReport - * retreive Set Report - * @param phost: Host handle - * @param reportType : Report type to be sent - * @param reportId : Targeted report ID for Set Report request - * @param reportBuff : Report Buffer - * @param reportLen : Length of data report to be send - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_GetReport (USBH_HandleTypeDef *phost, - uint8_t reportType, - uint8_t reportId, - uint8_t* reportBuff, - uint8_t reportLen) -{ - - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_RECIPIENT_INTERFACE |\ - USB_REQ_TYPE_CLASS; - - - phost->Control.setup.b.bRequest = USB_HID_GET_REPORT; - phost->Control.setup.b.wValue.w = (reportType << 8 ) | reportId; - - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = reportLen; - - return USBH_CtlReq(phost, reportBuff , reportLen ); -} - -/** - * @brief USBH_Set_Protocol - * Set protocol State. - * @param phost: Host handle - * @param protocol : Set Protocol for HID : boot/report protocol - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_SetProtocol(USBH_HandleTypeDef *phost, - uint8_t protocol) -{ - - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\ - USB_REQ_TYPE_CLASS; - - - phost->Control.setup.b.bRequest = USB_HID_SET_PROTOCOL; - phost->Control.setup.b.wValue.w = protocol != 0 ? 0 : 1; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - - return USBH_CtlReq(phost, 0 , 0 ); - -} - -/** - * @brief USBH_ParseHIDDesc - * This function Parse the HID descriptor - * @param desc: HID Descriptor - * @param buf: Buffer where the source descriptor is available - * @retval None - */ -static void USBH_HID_ParseHIDDesc (HID_DescTypeDef *desc, uint8_t *buf) -{ - - desc->bLength = *(uint8_t *) (buf + 0); - desc->bDescriptorType = *(uint8_t *) (buf + 1); - desc->bcdHID = LE16 (buf + 2); - desc->bCountryCode = *(uint8_t *) (buf + 4); - desc->bNumDescriptors = *(uint8_t *) (buf + 5); - desc->bReportDescriptorType = *(uint8_t *) (buf + 6); - desc->wItemLength = LE16 (buf + 7); -} - -/** - * @brief USBH_HID_GetDeviceType - * Return Device function. - * @param phost: Host handle - * @retval HID function: HID_MOUSE / HID_KEYBOARD - */ -HID_TypeTypeDef USBH_HID_GetDeviceType(USBH_HandleTypeDef *phost) -{ - HID_TypeTypeDef type = HID_UNKNOWN; - - if(phost->gState == HOST_CLASS) - { - - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol \ - == HID_KEYBRD_BOOT_CODE) - { - type = HID_KEYBOARD; - } - else if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol \ - == HID_MOUSE_BOOT_CODE) - { - type= HID_MOUSE; - } - } - return type; -} - - -/** - * @brief USBH_HID_GetPollInterval - * Return HID device poll time - * @param phost: Host handle - * @retval poll time (ms) - */ -uint8_t USBH_HID_GetPollInterval(USBH_HandleTypeDef *phost) -{ - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - if((phost->gState == HOST_CLASS_REQUEST) || - (phost->gState == HOST_INPUT) || - (phost->gState == HOST_SET_CONFIGURATION) || - (phost->gState == HOST_CHECK_CLASS) || - ((phost->gState == HOST_CLASS))) - { - return (HID_Handle->poll); - } - else - { - return 0; - } -} -/** - * @brief fifo_init - * Initialize FIFO. - * @param f: Fifo address - * @param buf: Fifo buffer - * @param size: Fifo Size - * @retval none - */ -void fifo_init(FIFO_TypeDef * f, uint8_t * buf, uint16_t size) -{ - f->head = 0; - f->tail = 0; - f->lock = 0; - f->size = size; - f->buf = buf; -} - -/** - * @brief fifo_read - * Read from FIFO. - * @param f: Fifo address - * @param buf: read buffer - * @param nbytes: number of item to read - * @retval number of read items - */ -uint16_t fifo_read(FIFO_TypeDef * f, void * buf, uint16_t nbytes) -{ - uint16_t i; - uint8_t * p; - p = (uint8_t*) buf; - - if(f->lock == 0) - { - f->lock = 1; - for(i=0; i < nbytes; i++) - { - if( f->tail != f->head ) - { - *p++ = f->buf[f->tail]; - f->tail++; - if( f->tail == f->size ) - { - f->tail = 0; - } - } else - { - f->lock = 0; - return i; - } - } - } - f->lock = 0; - return nbytes; -} - -/** - * @brief fifo_write - * Read from FIFO. - * @param f: Fifo address - * @param buf: read buffer - * @param nbytes: number of item to write - * @retval number of written items - */ -uint16_t fifo_write(FIFO_TypeDef * f, const void * buf, uint16_t nbytes) -{ - uint16_t i; - const uint8_t * p; - p = (const uint8_t*) buf; - if(f->lock == 0) - { - f->lock = 1; - for(i=0; i < nbytes; i++) - { - if( (f->head + 1 == f->tail) || - ( (f->head + 1 == f->size) && (f->tail == 0)) ) - { - f->lock = 0; - return i; - } - else - { - f->buf[f->head] = *p++; - f->head++; - if( f->head == f->size ) - { - f->head = 0; - } - } - } - } - f->lock = 0; - return nbytes; -} - - -/** -* @brief The function is a callback about HID Data events -* @param phost: Selected device -* @retval None -*/ -__weak void USBH_HID_EventCallback(USBH_HandleTypeDef *phost) -{ - -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_keybd.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_keybd.c deleted file mode 100644 index 624f24a..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_keybd.c +++ /dev/null @@ -1,418 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_keybd.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the application layer for USB Host HID Keyboard handling - * QWERTY and AZERTY Keyboard are supported as per the selection in - * usbh_hid_keybd.h - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid_keybd.h" -#include "usbh_hid_parser.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_HID_CLASS -* @{ -*/ - -/** @defgroup USBH_HID_KEYBD -* @brief This file includes HID Layer Handlers for USB Host HID class. -* @{ -*/ - -/** @defgroup USBH_HID_KEYBD_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_HID_KEYBD_Private_Defines -* @{ -*/ -/** -* @} -*/ -#ifndef AZERTY_KEYBOARD - #define QWERTY_KEYBOARD -#endif -#define KBD_LEFT_CTRL 0x01 -#define KBD_LEFT_SHIFT 0x02 -#define KBD_LEFT_ALT 0x04 -#define KBD_LEFT_GUI 0x08 -#define KBD_RIGHT_CTRL 0x10 -#define KBD_RIGHT_SHIFT 0x20 -#define KBD_RIGHT_ALT 0x40 -#define KBD_RIGHT_GUI 0x80 -#define KBR_MAX_NBR_PRESSED 6 - -/** @defgroup USBH_HID_KEYBD_Private_Macros -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_HID_KEYBD_Private_FunctionPrototypes -* @{ -*/ -static USBH_StatusTypeDef USBH_HID_KeybdDecode(USBH_HandleTypeDef *phost); -/** -* @} -*/ - -/** @defgroup USBH_HID_KEYBD_Private_Variables -* @{ -*/ - -HID_KEYBD_Info_TypeDef keybd_info; -uint32_t keybd_report_data[2]; - -static const HID_Report_ItemTypedef imp_0_lctrl={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 0, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_lshift={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 1, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_lalt={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 2, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_lgui={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 3, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_rctrl={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 4, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_rshift={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 5, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_ralt={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 6, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; -static const HID_Report_ItemTypedef imp_0_rgui={ - (uint8_t*)keybd_report_data+0, /*data*/ - 1, /*size*/ - 7, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; - -static const HID_Report_ItemTypedef imp_0_key_array={ - (uint8_t*)keybd_report_data+2, /*data*/ - 8, /*size*/ - 0, /*shift*/ - 6, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 101, /*max value read can return*/ - 0, /*min vale device can report*/ - 101, /*max value device can report*/ - 1 /*resolution*/ -}; - -#ifdef QWERTY_KEYBOARD -static const int8_t HID_KEYBRD_Key[] = { - '\0', '`', '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', '\0', '\r', - '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', - 'i', 'o', 'p', '[', ']', '\\', - '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', - 'k', 'l', ';', '\'', '\0', '\n', - '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', - 'm', ',', '.', '/', '\0', '\0', - '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '7', '4', '1', - '\0', '/', '8', '5', '2', - '0', '*', '9', '6', '3', - '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0' -}; - -static const int8_t HID_KEYBRD_ShiftKey[] = { - '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', - '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', - 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G', - 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', - 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; - -#else - -static const int8_t HID_KEYBRD_Key[] = { - '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u', - 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g', - 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x', - 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1','\0', '/', - '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0', - '\n', '\0', '\0', '\0', '\0', '\0', '\0','\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; - -static const int8_t HID_KEYBRD_ShiftKey[] = { - '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', - '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', - 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K', - 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N', - '?', '.', '/', '\0', '\0', '\0','\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' -}; -#endif - -static const uint8_t HID_KEYBRD_Codes[] = { - 0, 0, 0, 0, 31, 50, 48, 33, - 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */ - 52, 51, 25, 26, 17, 20, 32, 21, - 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */ - 4, 5, 6, 7, 8, 9, 10, 11, - 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */ - 28, 29, 42, 40, 41, 1, 53, 54, - 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */ - 118, 119, 120, 121, 122, 123, 124, 125, - 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */ - 79, 84, 83, 90, 95, 100, 105, 106, - 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */ - 96, 101, 99, 104, 45, 129, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */ - 0, 0, 0, 0, 0, 107, 0, 56, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ - 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */ -}; - -/** - * @brief USBH_HID_KeybdInit - * The function init the HID keyboard. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_KeybdInit(USBH_HandleTypeDef *phost) -{ - uint32_t x; - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - keybd_info.lctrl=keybd_info.lshift= 0; - keybd_info.lalt=keybd_info.lgui= 0; - keybd_info.rctrl=keybd_info.rshift= 0; - keybd_info.ralt=keybd_info.rgui=0; - - - for(x=0; x< (sizeof(keybd_report_data)/sizeof(uint32_t)); x++) - { - keybd_report_data[x]=0; - } - - if(HID_Handle->length > (sizeof(keybd_report_data)/sizeof(uint32_t))) - { - HID_Handle->length = (sizeof(keybd_report_data)/sizeof(uint32_t)); - } - HID_Handle->pData = (uint8_t*)keybd_report_data; - fifo_init(&HID_Handle->fifo, phost->device.Data, HID_QUEUE_SIZE * sizeof(keybd_report_data)); - - return USBH_OK; -} - -/** - * @brief USBH_HID_GetKeybdInfo - * The function return keyboard information. - * @param phost: Host handle - * @retval keyboard information - */ -HID_KEYBD_Info_TypeDef *USBH_HID_GetKeybdInfo(USBH_HandleTypeDef *phost) -{ - if(USBH_HID_KeybdDecode(phost) == USBH_OK) - { - return &keybd_info; - } - else - { - return NULL; - } -} - -/** - * @brief USBH_HID_KeybdDecode - * The function decode keyboard data. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_KeybdDecode(USBH_HandleTypeDef *phost) -{ - uint8_t x; - - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - if(HID_Handle->length == 0) - { - return USBH_FAIL; - } - /*Fill report */ - if(fifo_read(&HID_Handle->fifo, &keybd_report_data, HID_Handle->length) == HID_Handle->length) - { - - keybd_info.lctrl=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lctrl, 0); - keybd_info.lshift=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lshift, 0); - keybd_info.lalt=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lalt, 0); - keybd_info.lgui=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_lgui, 0); - keybd_info.rctrl=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rctrl, 0); - keybd_info.rshift=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rshift, 0); - keybd_info.ralt=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_ralt, 0); - keybd_info.rgui=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_rgui, 0); - - for(x=0; x < sizeof(keybd_info.keys); x++) - { - keybd_info.keys[x]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &imp_0_key_array, x); - } - - return USBH_OK; - } - return USBH_FAIL; -} - -/** - * @brief USBH_HID_GetASCIICode - * The function decode keyboard data into ASCII characters. - * @param phost: Host handle - * @param info: Keyboard information - * @retval ASCII code - */ -uint8_t USBH_HID_GetASCIICode(HID_KEYBD_Info_TypeDef *info) -{ - uint8_t output; - if((info->lshift == 1) || (info->rshift)) - { - output = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[info->keys[0]]]; - } - else - { - output = HID_KEYBRD_Key[HID_KEYBRD_Codes[info->keys[0]]]; - } - return output; -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_mouse.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_mouse.c deleted file mode 100644 index 862fcda..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_mouse.c +++ /dev/null @@ -1,267 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_mouse.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the application layer for USB Host HID Mouse Handling. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid_mouse.h" -#include "usbh_hid_parser.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_MOUSE - * @brief This file includes HID Layer Handlers for USB Host HID class. - * @{ - */ - -/** @defgroup USBH_HID_MOUSE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_HID_MOUSE_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_HID_MOUSE_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_MOUSE_Private_FunctionPrototypes - * @{ - */ -static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost); - -/** - * @} - */ - - -/** @defgroup USBH_HID_MOUSE_Private_Variables - * @{ - */ -HID_MOUSE_Info_TypeDef mouse_info; -uint32_t mouse_report_data[1]; - -/* Structures defining how to access items in a HID mouse report */ -/* Access button 1 state. */ -static const HID_Report_ItemTypedef prop_b1={ - (uint8_t *)mouse_report_data+0, /*data*/ - 1, /*size*/ - 0, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min value device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; - -/* Access button 2 state. */ -static const HID_Report_ItemTypedef prop_b2={ - (uint8_t *)mouse_report_data+0, /*data*/ - 1, /*size*/ - 1, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min value device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; - -/* Access button 3 state. */ -static const HID_Report_ItemTypedef prop_b3={ - (uint8_t *)mouse_report_data+0, /*data*/ - 1, /*size*/ - 2, /*shift*/ - 0, /*count (only for array items)*/ - 0, /*signed?*/ - 0, /*min value read can return*/ - 1, /*max value read can return*/ - 0, /*min vale device can report*/ - 1, /*max value device can report*/ - 1 /*resolution*/ -}; - -/* Access x coordinate change. */ -static const HID_Report_ItemTypedef prop_x={ - (uint8_t *)mouse_report_data+1, /*data*/ - 8, /*size*/ - 0, /*shift*/ - 0, /*count (only for array items)*/ - 1, /*signed?*/ - 0, /*min value read can return*/ - 0xFFFF,/*max value read can return*/ - 0, /*min vale device can report*/ - 0xFFFF,/*max value device can report*/ - 1 /*resolution*/ -}; - -/* Access y coordinate change. */ -static const HID_Report_ItemTypedef prop_y={ - (uint8_t *)mouse_report_data+2, /*data*/ - 8, /*size*/ - 0, /*shift*/ - 0, /*count (only for array items)*/ - 1, /*signed?*/ - 0, /*min value read can return*/ - 0xFFFF,/*max value read can return*/ - 0, /*min vale device can report*/ - 0xFFFF,/*max value device can report*/ - 1 /*resolution*/ -}; - - -/** - * @} - */ - - -/** @defgroup USBH_HID_MOUSE_Private_Functions - * @{ - */ - -/** - * @brief USBH_HID_MouseInit - * The function init the HID mouse. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_HID_MouseInit(USBH_HandleTypeDef *phost) -{ - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - mouse_info.x=0; - mouse_info.y=0; - mouse_info.buttons[0]=0; - mouse_info.buttons[1]=0; - mouse_info.buttons[2]=0; - - mouse_report_data[0]=0; - - if(HID_Handle->length > sizeof(mouse_report_data)) - { - HID_Handle->length = sizeof(mouse_report_data); - } - HID_Handle->pData = (uint8_t *)mouse_report_data; - fifo_init(&HID_Handle->fifo, phost->device.Data, HID_QUEUE_SIZE * sizeof(mouse_report_data)); - - return USBH_OK; -} - -/** - * @brief USBH_HID_GetMouseInfo - * The function return mouse information. - * @param phost: Host handle - * @retval mouse information - */ -HID_MOUSE_Info_TypeDef *USBH_HID_GetMouseInfo(USBH_HandleTypeDef *phost) -{ - if(USBH_HID_MouseDecode(phost)== USBH_OK) - { - return &mouse_info; - } - else - { - return NULL; - } -} - -/** - * @brief USBH_HID_MouseDecode - * The function decode mouse data. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HID_MouseDecode(USBH_HandleTypeDef *phost) -{ - HID_HandleTypeDef *HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; - - if(HID_Handle->length == 0) - { - return USBH_FAIL; - } - /*Fill report */ - if(fifo_read(&HID_Handle->fifo, &mouse_report_data, HID_Handle->length) == HID_Handle->length) - { - - /*Decode report */ - mouse_info.x = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_x, 0); - mouse_info.y = (int16_t )HID_ReadItem((HID_Report_ItemTypedef *) &prop_y, 0); - - mouse_info.buttons[0]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b1, 0); - mouse_info.buttons[1]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b2, 0); - mouse_info.buttons[2]=(uint8_t)HID_ReadItem((HID_Report_ItemTypedef *) &prop_b3, 0); - - return USBH_OK; - } - return USBH_FAIL; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_parser.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_parser.c deleted file mode 100644 index 5b0762d..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/HID/Src/usbh_hid_parser.c +++ /dev/null @@ -1,235 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_hid_parser.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the HID Layer Handlers for USB Host HID class. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ -#include "usbh_hid_parser.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_HID_CLASS - * @{ - */ - -/** @defgroup USBH_HID_PARSER - * @brief This file includes HID parsers for USB Host HID class. - * @{ - */ - -/** @defgroup USBH_HID_PARSER_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_HID_PARSER_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_HID_PARSER_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_HID_PARSER_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_HID_PARSER_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_HID_PARSER_Private_Functions - * @{ - */ - -/** - * @brief HID_ReadItem - * The function read a report item. - * @param ri: report item - * @param ndx: report index -* @retval status (0 : fail / otherwise: item value) - */ -uint32_t HID_ReadItem(HID_Report_ItemTypedef *ri, uint8_t ndx) -{ - uint32_t val=0; - uint32_t x=0; - uint32_t bofs; - uint8_t *data=ri->data; - uint8_t shift=ri->shift; - - /* get the logical value of the item */ - - /* if this is an array, wee may need to offset ri->data.*/ - if (ri->count > 0) - { - /* If app tries to read outside of the array. */ - if (ri->count <= ndx) - { - return(0); - } - - /* calculate bit offset */ - bofs = ndx*ri->size; - bofs += shift; - /* calculate byte offset + shift pair from bit offset. */ - data+=bofs/8; - shift=(uint8_t)(bofs%8); - } - /* read data bytes in little endian order */ - for(x=0; x < ((ri->size & 0x7) ? (ri->size/8)+1 : (ri->size/8)); x++) - { - val=(uint32_t)(*data << (x*8)); - } - val=(val >> shift) & ((1<size)-1); - - if (val < ri->logical_min || val > ri->logical_max) - { - return(0); - } - - /* convert logical value to physical value */ - /* See if the number is negative or not. */ - if ((ri->sign) && (val & (1<<(ri->size-1)))) - { - /* yes, so sign extend value to 32 bits. */ - int vs=(int)((-1 & ~((1<<(ri->size))-1)) | val); - - if(ri->resolution == 1) - { - return((uint32_t)vs); - } - return((uint32_t)(vs*ri->resolution)); - } - else - { - if(ri->resolution == 1) - { - return(val); - } - return(val*ri->resolution); - } -} - -/** - * @brief HID_WriteItem - * The function write a report item. - * @param ri: report item - * @param ndx: report index - * @retval status (1: fail/ 0 : Ok) - */ -uint32_t HID_WriteItem(HID_Report_ItemTypedef *ri, uint32_t value, uint8_t ndx) -{ - uint32_t x; - uint32_t mask; - uint32_t bofs; - uint8_t *data=ri->data; - uint8_t shift=ri->shift; - - if (value < ri->physical_min || value > ri->physical_max) - { - return(1); - } - - /* if this is an array, wee may need to offset ri->data.*/ - if (ri->count > 0) - { - /* If app tries to read outside of the array. */ - if (ri->count >= ndx) - { - return(0); - } - /* calculate bit offset */ - bofs = ndx*ri->size; - bofs += shift; - /* calculate byte offset + shift pair from bit offset. */ - data+=bofs/8; - shift=(uint8_t)(bofs%8); - - } - - /* Convert physical value to logical value. */ - if (ri->resolution != 1) - { - value=value/ri->resolution; - } - - /* Write logical value to report in little endian order. */ - mask=(uint32_t)((1<size)-1); - value = (value & mask) << shift; - - for(x=0; x < ((ri->size & 0x7) ? (ri->size/8)+1 : (ri->size/8)); x++) - { - *(ri->data+x)=(uint8_t)((*(ri->data+x) & ~(mask>>(x*8))) | ((value>>(x*8)) & (mask>>(x*8)))); - } - return(0); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc.h deleted file mode 100644 index 00d2928..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc.h +++ /dev/null @@ -1,233 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_msc.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MSC_H -#define __USBH_MSC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" -#include "usbh_msc_bot.h" -#include "usbh_msc_scsi.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_CORE - * @brief This file is the Header file for usbh_msc.c - * @{ - */ - - -/** @defgroup USBH_MSC_CORE_Exported_Types - * @{ - */ - -typedef enum -{ - MSC_INIT = 0, - MSC_IDLE, - MSC_TEST_UNIT_READY, - MSC_READ_CAPACITY10, - MSC_READ_INQUIRY, - MSC_REQUEST_SENSE, - MSC_READ, - MSC_WRITE, - MSC_UNRECOVERED_ERROR, - MSC_PERIODIC_CHECK, -} -MSC_StateTypeDef; - -typedef enum -{ - MSC_OK, - MSC_NOT_READY, - MSC_ERROR, - -} -MSC_ErrorTypeDef; - -typedef enum -{ - MSC_REQ_IDLE = 0, - MSC_REQ_RESET, - MSC_REQ_GET_MAX_LUN, - MSC_REQ_ERROR, -} -MSC_ReqStateTypeDef; - -#ifndef MAX_SUPPORTED_LUN - #define MAX_SUPPORTED_LUN 2 -#endif - - -/* Structure for LUN */ -typedef struct -{ - MSC_StateTypeDef state; - MSC_ErrorTypeDef error; - USBH_StatusTypeDef prev_ready_state; - SCSI_CapacityTypeDef capacity; - SCSI_SenseTypeDef sense; - SCSI_StdInquiryDataTypeDef inquiry; - uint8_t state_changed; - -} -MSC_LUNTypeDef; - -/* Structure for MSC process */ -typedef struct _MSC_Process -{ - uint32_t max_lun; - uint8_t InPipe; - uint8_t OutPipe; - uint8_t OutEp; - uint8_t InEp; - uint16_t OutEpSize; - uint16_t InEpSize; - MSC_StateTypeDef state; - MSC_ErrorTypeDef error; - MSC_ReqStateTypeDef req_state; - MSC_ReqStateTypeDef prev_req_state; - BOT_HandleTypeDef hbot; - MSC_LUNTypeDef unit[MAX_SUPPORTED_LUN]; - uint16_t current_lun; - uint16_t rw_lun; - uint32_t timer; -} -MSC_HandleTypeDef; - - -/** - * @} - */ - - - -/** @defgroup USBH_MSC_CORE_Exported_Defines - * @{ - */ - -#define USB_REQ_BOT_RESET 0xFF -#define USB_REQ_GET_MAX_LUN 0xFE - - -/* MSC Class Codes */ -#define USB_MSC_CLASS 0x08 - -/* Interface Descriptor field values for HID Boot Protocol */ -#define MSC_BOT 0x50 -#define MSC_TRANSPARENT 0x06 -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Exported_Variables - * @{ - */ -extern USBH_ClassTypeDef USBH_msc; -#define USBH_MSC_CLASS &USBH_msc - -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Exported_FunctionsPrototype - * @{ - */ - -/* Common APIs */ -uint8_t USBH_MSC_IsReady (USBH_HandleTypeDef *phost); - -/* APIs for LUN */ -int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost); - -uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost, uint8_t lun); - -USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info); - -USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); - -USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MSC_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h deleted file mode 100644 index 110ba17..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_bot.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_msc_bot.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MSC_BOT_H -#define __USBH_MSC_BOT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" -#include "usbh_msc_bot.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_BOT - * @brief This file is the Header file for usbh_msc_bot.c - * @{ - */ - - -/** @defgroup USBH_MSC_BOT_Exported_Types - * @{ - */ - -typedef enum { - BOT_OK = 0, - BOT_FAIL = 1, - BOT_PHASE_ERROR = 2, - BOT_BUSY = 3 -} -BOT_StatusTypeDef; - -typedef enum { - BOT_CMD_IDLE = 0, - BOT_CMD_SEND, - BOT_CMD_WAIT, -} -BOT_CMDStateTypeDef; - -/* CSW Status Definitions */ -typedef enum -{ - - BOT_CSW_CMD_PASSED = 0x00, - BOT_CSW_CMD_FAILED = 0x01, - BOT_CSW_PHASE_ERROR = 0x02, -} -BOT_CSWStatusTypeDef; - -typedef enum { - BOT_SEND_CBW = 1, - BOT_SEND_CBW_WAIT, - BOT_DATA_IN, - BOT_DATA_IN_WAIT, - BOT_DATA_OUT, - BOT_DATA_OUT_WAIT, - BOT_RECEIVE_CSW, - BOT_RECEIVE_CSW_WAIT, - BOT_ERROR_IN, - BOT_ERROR_OUT, - BOT_UNRECOVERED_ERROR -} -BOT_StateTypeDef; - -typedef union -{ - struct __CBW - { - uint32_t Signature; - uint32_t Tag; - uint32_t DataTransferLength; - uint8_t Flags; - uint8_t LUN; - uint8_t CBLength; - uint8_t CB[16]; - }field; - uint8_t data[31]; -} -BOT_CBWTypeDef; - -typedef union -{ - struct __CSW - { - uint32_t Signature; - uint32_t Tag; - uint32_t DataResidue; - uint8_t Status; - }field; - uint8_t data[13]; -} -BOT_CSWTypeDef; - -typedef struct -{ - uint32_t data[16]; - BOT_StateTypeDef state; - BOT_StateTypeDef prev_state; - BOT_CMDStateTypeDef cmd_state; - BOT_CBWTypeDef cbw; - uint8_t Reserved1; - BOT_CSWTypeDef csw; - uint8_t Reserved2[3]; - uint8_t *pbuf; -} -BOT_HandleTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBH_MSC_BOT_Exported_Defines - * @{ - */ -#define BOT_CBW_SIGNATURE 0x43425355 -#define BOT_CBW_TAG 0x20304050 -#define BOT_CSW_SIGNATURE 0x53425355 -#define BOT_CBW_LENGTH 31 -#define BOT_CSW_LENGTH 13 - - - -#define BOT_SEND_CSW_DISABLE 0 -#define BOT_SEND_CSW_ENABLE 1 - -#define BOT_DIR_IN 0 -#define BOT_DIR_OUT 1 -#define BOT_DIR_BOTH 2 - -#define BOT_PAGE_LENGTH 512 - - -#define BOT_CBW_CB_LENGTH 16 - - -#define USB_REQ_BOT_RESET 0xFF -#define USB_REQ_GET_MAX_LUN 0xFE - -#define MAX_BULK_STALL_COUNT_LIMIT 0x04 /* If STALL is seen on Bulk - Endpoint continuously, this means - that device and Host has phase error - Hence a Reset is needed */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_BOT_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_BOT_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_BOT_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_MSC_BOT_REQ_Reset(USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_MSC_BOT_REQ_GetMaxLUN(USBH_HandleTypeDef *phost, uint8_t *Maxlun); - -USBH_StatusTypeDef USBH_MSC_BOT_Init(USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_MSC_BOT_Process (USBH_HandleTypeDef *phost, uint8_t lun); -USBH_StatusTypeDef USBH_MSC_BOT_Error(USBH_HandleTypeDef *phost, uint8_t lun); - - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MSC_BOT_H__ */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h deleted file mode 100644 index 424ca08..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h +++ /dev/null @@ -1,226 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_scsi.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_msc_scsi.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MSC_SCSI_H -#define __USBH_MSC_SCSI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_SCSI - * @brief This file is the Header file for usbh_msc_scsi.c - * @{ - */ - - -// Capacity data. -typedef struct -{ - uint32_t block_nbr; - uint16_t block_size; -} SCSI_CapacityTypeDef; - - -// Sense data. -typedef struct -{ - uint8_t key; - uint8_t asc; - uint8_t ascq; -} SCSI_SenseTypeDef; - -// INQUIRY data. -typedef struct -{ - uint8_t PeripheralQualifier; - uint8_t DeviceType; - uint8_t RemovableMedia; - uint8_t vendor_id[9]; - uint8_t product_id[17]; - uint8_t revision_id[5]; -}SCSI_StdInquiryDataTypeDef; - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define OPCODE_TEST_UNIT_READY 0x00 -#define OPCODE_READ_CAPACITY10 0x25 -#define OPCODE_READ10 0x28 -#define OPCODE_WRITE10 0x2A -#define OPCODE_REQUEST_SENSE 0x03 -#define OPCODE_INQUIRY 0x12 - -#define DATA_LEN_MODE_TEST_UNIT_READY 0 -#define DATA_LEN_READ_CAPACITY10 8 -#define DATA_LEN_INQUIRY 36 -#define DATA_LEN_REQUEST_SENSE 14 - -#define CBW_CB_LENGTH 16 -#define CBW_LENGTH 10 - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_SENSE_KEY_NO_SENSE 0x00 -#define SCSI_SENSE_KEY_RECOVERED_ERROR 0x01 -#define SCSI_SENSE_KEY_NOT_READY 0x02 -#define SCSI_SENSE_KEY_MEDIUM_ERROR 0x03 -#define SCSI_SENSE_KEY_HARDWARE_ERROR 0x04 -#define SCSI_SENSE_KEY_ILLEGAL_REQUEST 0x05 -#define SCSI_SENSE_KEY_UNIT_ATTENTION 0x06 -#define SCSI_SENSE_KEY_DATA_PROTECT 0x07 -#define SCSI_SENSE_KEY_BLANK_CHECK 0x08 -#define SCSI_SENSE_KEY_VENDOR_SPECIFIC 0x09 -#define SCSI_SENSE_KEY_COPY_ABORTED 0x0A -#define SCSI_SENSE_KEY_ABORTED_COMMAND 0x0B -#define SCSI_SENSE_KEY_VOLUME_OVERFLOW 0x0D -#define SCSI_SENSE_KEY_MISCOMPARE 0x0E -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_ASC_NO_ADDITIONAL_SENSE_INFORMATION 0x00 -#define SCSI_ASC_LOGICAL_UNIT_NOT_READY 0x04 -#define SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 -#define SCSI_ASC_WRITE_PROTECTED 0x27 -#define SCSI_ASC_FORMAT_ERROR 0x31 -#define SCSI_ASC_INVALID_COMMAND_OPERATION_CODE 0x20 -#define SCSI_ASC_NOT_READY_TO_READY_CHANGE 0x28 -#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_ASCQ_FORMAT_COMMAND_FAILED 0x01 -#define SCSI_ASCQ_INITIALIZING_COMMAND_REQUIRED 0x02 -#define SCSI_ASCQ_OPERATION_IN_PROGRESS 0x07 - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup _Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost, - uint8_t lun); - -USBH_StatusTypeDef USBH_MSC_SCSI_ReadCapacity (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_CapacityTypeDef *capacity); - -USBH_StatusTypeDef USBH_MSC_SCSI_Inquiry (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_StdInquiryDataTypeDef *inquiry); - -USBH_StatusTypeDef USBH_MSC_SCSI_RequestSense (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_SenseTypeDef *sense_data); - -USBH_StatusTypeDef USBH_MSC_SCSI_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); - -USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MSC_SCSI_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c deleted file mode 100644 index c0a4222..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c +++ /dev/null @@ -1,805 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the MSC class driver functions - * =================================================================== - * MSC Class Description - * =================================================================== - * This module manages the MSC class V1.0 following the "Universal - * Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0 - * Sep. 31, 1999". - * This driver implements the following aspects of the specification: - * - Bulk-Only Transport protocol - * - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3)) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_msc.h" -#include "usbh_msc_bot.h" -#include "usbh_msc_scsi.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_CORE - * @brief This file includes the mass storage related functions - * @{ - */ - - -/** @defgroup USBH_MSC_CORE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_FunctionPrototypes - * @{ - */ - -static USBH_StatusTypeDef USBH_MSC_InterfaceInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_InterfaceDeInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_ClassRequest(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_SOFProcess(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_RdWrProcess(USBH_HandleTypeDef *phost, uint8_t lun); - -USBH_ClassTypeDef USBH_msc = -{ - "MSC", - USB_MSC_CLASS, - USBH_MSC_InterfaceInit, - USBH_MSC_InterfaceDeInit, - USBH_MSC_ClassRequest, - USBH_MSC_Process, - USBH_MSC_SOFProcess, - NULL, -}; - - -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Exported_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_Functions - * @{ - */ - - -/** - * @brief USBH_MSC_InterfaceInit - * The function init the MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_InterfaceInit (USBH_HandleTypeDef *phost) -{ - uint8_t interface = 0; - USBH_StatusTypeDef status = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle; - - interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, MSC_TRANSPARENT, MSC_BOT); - - if(interface == 0xFF) /* Not Valid Interface */ - { - USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name); - status = USBH_FAIL; - } - else - { - USBH_SelectInterface (phost, interface); - - phost->pActiveClass->pData = (MSC_HandleTypeDef *)USBH_malloc (sizeof(MSC_HandleTypeDef)); - MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress & 0x80) - { - MSC_Handle->InEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress); - MSC_Handle->InEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].wMaxPacketSize; - } - else - { - MSC_Handle->OutEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress); - MSC_Handle->OutEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].wMaxPacketSize; - } - - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress & 0x80) - { - MSC_Handle->InEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress); - MSC_Handle->InEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].wMaxPacketSize; - } - else - { - MSC_Handle->OutEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress); - MSC_Handle->OutEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].wMaxPacketSize; - } - - MSC_Handle->current_lun = 0; - MSC_Handle->rw_lun = 0; - MSC_Handle->state = MSC_INIT; - MSC_Handle->error = MSC_OK; - MSC_Handle->req_state = MSC_REQ_IDLE; - MSC_Handle->OutPipe = USBH_AllocPipe(phost, MSC_Handle->OutEp); - MSC_Handle->InPipe = USBH_AllocPipe(phost, MSC_Handle->InEp); - - USBH_MSC_BOT_Init(phost); - - /* De-Initialize LUNs information */ - USBH_memset(MSC_Handle->unit, 0, sizeof(MSC_Handle->unit)); - - /* Open the new channels */ - USBH_OpenPipe (phost, - MSC_Handle->OutPipe, - MSC_Handle->OutEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MSC_Handle->OutEpSize); - - USBH_OpenPipe (phost, - MSC_Handle->InPipe, - MSC_Handle->InEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MSC_Handle->InEpSize); - - - USBH_LL_SetToggle (phost, MSC_Handle->InPipe,0); - USBH_LL_SetToggle (phost, MSC_Handle->OutPipe,0); - status = USBH_OK; - } - return status; -} - -/** - * @brief USBH_MSC_InterfaceDeInit - * The function DeInit the Pipes used for the MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ( MSC_Handle->OutPipe) - { - USBH_ClosePipe(phost, MSC_Handle->OutPipe); - USBH_FreePipe (phost, MSC_Handle->OutPipe); - MSC_Handle->OutPipe = 0; /* Reset the Channel as Free */ - } - - if ( MSC_Handle->InPipe) - { - USBH_ClosePipe(phost, MSC_Handle->InPipe); - USBH_FreePipe (phost, MSC_Handle->InPipe); - MSC_Handle->InPipe = 0; /* Reset the Channel as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - phost->pActiveClass->pData = 0; - } - - return USBH_OK; -} - -/** - * @brief USBH_MSC_ClassRequest - * The function is responsible for handling Standard requests - * for MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_ClassRequest(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef status = USBH_BUSY; - uint8_t i; - - /* Switch MSC REQ state machine */ - switch (MSC_Handle->req_state) - { - case MSC_REQ_IDLE: - case MSC_REQ_GET_MAX_LUN: - /* Issue GetMaxLUN request */ - status = USBH_MSC_BOT_REQ_GetMaxLUN(phost, (uint8_t *)&MSC_Handle->max_lun); - - /* When devices do not support the GetMaxLun request, this should - be considred as only one logical unit is supported */ - if(status == USBH_NOT_SUPPORTED) - { - MSC_Handle->max_lun = 0; - status = USBH_OK; - } - - if(status == USBH_OK) - { - MSC_Handle->max_lun = (uint8_t )(MSC_Handle->max_lun) + 1; - USBH_UsrLog ("Number of supported LUN: %lu", (int32_t)(MSC_Handle->max_lun)); - - for(i = 0; i < MSC_Handle->max_lun; i++) - { - MSC_Handle->unit[i].prev_ready_state = USBH_FAIL; - MSC_Handle->unit[i].state_changed = 0; - } - } - break; - - case MSC_REQ_ERROR : - /* a Clear Feature should be issued here */ - if(USBH_ClrFeature(phost, 0x00) == USBH_OK) - { - MSC_Handle->req_state = MSC_Handle->prev_req_state; - } - break; - - default: - break; - } - - return status; -} - -/** - * @brief USBH_MSC_Process - * The function is for managing state machine for MSC data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef error = USBH_BUSY ; - USBH_StatusTypeDef scsi_status = USBH_BUSY ; - USBH_StatusTypeDef ready_status = USBH_BUSY ; - - switch (MSC_Handle->state) - { - case MSC_INIT: - - if(MSC_Handle->current_lun < MSC_Handle->max_lun) - { - - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_NOT_READY; - /* Switch MSC REQ state machine */ - switch (MSC_Handle->unit[MSC_Handle->current_lun].state) - { - case MSC_INIT: - USBH_UsrLog ("LUN #%d: ", MSC_Handle->current_lun); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_INQUIRY; - MSC_Handle->timer = phost->Timer; - - case MSC_READ_INQUIRY: - scsi_status = USBH_MSC_SCSI_Inquiry(phost, MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].inquiry); - - if( scsi_status == USBH_OK) - { - USBH_UsrLog ("Inquiry Vendor : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.vendor_id); - USBH_UsrLog ("Inquiry Product : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.product_id); - USBH_UsrLog ("Inquiry Version : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.revision_id); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_TEST_UNIT_READY; - } - if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_TEST_UNIT_READY: - ready_status = USBH_MSC_SCSI_TestUnitReady(phost, MSC_Handle->current_lun); - - if( ready_status == USBH_OK) - { - if( MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state != USBH_OK) - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 1; - USBH_UsrLog ("MSC Device ready"); - } - else - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 0; - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_CAPACITY10; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_OK; - MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state = USBH_OK; - } - if( ready_status == USBH_FAIL) - { - /* Media not ready, so try to check again during 10s */ - if( MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state != USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 1; - USBH_UsrLog ("MSC Device NOT ready"); - } - else - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 0; - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_NOT_READY; - MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state = USBH_FAIL; - } - else if(ready_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_READ_CAPACITY10: - scsi_status = USBH_MSC_SCSI_ReadCapacity(phost,MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].capacity) ; - - if(scsi_status == USBH_OK) - { - if(MSC_Handle->unit[MSC_Handle->current_lun].state_changed == 1) - { - USBH_UsrLog ("MSC Device capacity : %lu Bytes", \ - (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_nbr * MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_size)); - USBH_UsrLog ("Block number : %lu", (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_nbr)); - USBH_UsrLog ("Block Size : %lu", (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_size)); - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_OK; - MSC_Handle->current_lun++; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_REQUEST_SENSE: - scsi_status = USBH_MSC_SCSI_RequestSense(phost, MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].sense); - - if( scsi_status == USBH_OK) - { - if((MSC_Handle->unit[MSC_Handle->current_lun].sense.key == SCSI_SENSE_KEY_UNIT_ATTENTION) || - (MSC_Handle->unit[MSC_Handle->current_lun].sense.key == SCSI_SENSE_KEY_NOT_READY) ) - { - - if((phost->Timer - MSC_Handle->timer) < 10000) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_TEST_UNIT_READY; - break; - } - } - - USBH_UsrLog ("Sense Key : %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.key); - USBH_UsrLog ("Additional Sense Code : %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.asc); - USBH_UsrLog ("Additional Sense Code Qualifier: %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.ascq); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->current_lun++; - } - if( scsi_status == USBH_FAIL) - { - USBH_UsrLog ("MSC Device NOT ready"); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_UNRECOVERED_ERROR; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_UNRECOVERED_ERROR: - MSC_Handle->current_lun++; - break; - - default: - break; - } - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - else - { - MSC_Handle->current_lun = 0; - MSC_Handle->state = MSC_IDLE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - } - break; - - case MSC_IDLE: - error = USBH_OK; - break; - - default: - break; - } - return error; -} - - -/** - * @brief USBH_MSC_SOFProcess - * The function is for SOF state - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_SOFProcess(USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} -/** - * @brief USBH_MSC_RdWrProcess - * The function is for managing state machine for MSC I/O Process - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_RdWrProcess(USBH_HandleTypeDef *phost, uint8_t lun) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef error = USBH_BUSY ; - USBH_StatusTypeDef scsi_status = USBH_BUSY ; - - /* Switch MSC REQ state machine */ - switch (MSC_Handle->unit[lun].state) - { - - case MSC_READ: - scsi_status = USBH_MSC_SCSI_Read(phost,lun, 0, NULL, 0) ; - - if(scsi_status == USBH_OK) - { - MSC_Handle->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - case MSC_WRITE: - scsi_status = USBH_MSC_SCSI_Write(phost,lun, 0, NULL, 0) ; - - if(scsi_status == USBH_OK) - { - MSC_Handle->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - case MSC_REQUEST_SENSE: - scsi_status = USBH_MSC_SCSI_RequestSense(phost, lun, &MSC_Handle->unit[lun].sense); - - if( scsi_status == USBH_OK) - { - USBH_UsrLog ("Sense Key : %x", MSC_Handle->unit[lun].sense.key); - USBH_UsrLog ("Additional Sense Code : %x", MSC_Handle->unit[lun].sense.asc); - USBH_UsrLog ("Additional Sense Code Qualifier: %x", MSC_Handle->unit[lun].sense.ascq); - MSC_Handle->unit[lun].state = MSC_IDLE; - MSC_Handle->unit[lun].error = MSC_ERROR; - - error = USBH_FAIL; - } - if( scsi_status == USBH_FAIL) - { - USBH_UsrLog ("MSC Device NOT ready"); - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - default: - break; - - } - return error; -} - -/** - * @brief USBH_MSC_IsReady - * The function check if the MSC function is ready - * @param phost: Host handle - * @retval USBH Status - */ -uint8_t USBH_MSC_IsReady (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - return (MSC_Handle->state == MSC_IDLE); - } - else - { - return 0; - } -} - -/** - * @brief USBH_MSC_GetMaxLUN - * The function return the Max LUN supported - * @param phost: Host handle - * @retval logical Unit Number supported - */ -int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->gState == HOST_CLASS) && (MSC_Handle->state == MSC_IDLE)) - { - return MSC_Handle->max_lun; - } - return 0xFF; -} - -/** - * @brief USBH_MSC_UnitIsReady - * The function check whether a LUN is ready - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval Lun status (0: not ready / 1: ready) - */ -uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost, uint8_t lun) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - return (MSC_Handle->unit[lun].error == MSC_OK); - } - else - { - return 0; - } -} - -/** - * @brief USBH_MSC_GetLUNInfo - * The function return a LUN information - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - if(phost->gState == HOST_CLASS) - { - USBH_memcpy(info,&MSC_Handle->unit[lun], sizeof(MSC_LUNTypeDef)); - return USBH_OK; - } - else - { - return USBH_FAIL; - } -} - -/** - * @brief USBH_MSC_Read - * The function performs a Read operation - * @param phost: Host handle - * @param lun: logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to read - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - uint32_t timeout; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->device.is_connected == 0) || - (phost->gState != HOST_CLASS) || - (MSC_Handle->unit[lun].state != MSC_IDLE)) - { - return USBH_FAIL; - } - MSC_Handle->state = MSC_READ; - MSC_Handle->unit[lun].state = MSC_READ; - MSC_Handle->rw_lun = lun; - USBH_MSC_SCSI_Read(phost, - lun, - address, - pbuf, - length); - - timeout = phost->Timer; - - while (USBH_MSC_RdWrProcess(phost, lun) == USBH_BUSY) - { - if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0)) - { - MSC_Handle->state = MSC_IDLE; - return USBH_FAIL; - } - } - MSC_Handle->state = MSC_IDLE; - return USBH_OK; -} - -/** - * @brief USBH_MSC_Write - * The function performs a Write operation - * @param phost: Host handle - * @param lun: logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to write - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - uint32_t timeout; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->device.is_connected == 0) || - (phost->gState != HOST_CLASS) || - (MSC_Handle->unit[lun].state != MSC_IDLE)) - { - return USBH_FAIL; - } - MSC_Handle->state = MSC_WRITE; - MSC_Handle->unit[lun].state = MSC_WRITE; - MSC_Handle->rw_lun = lun; - USBH_MSC_SCSI_Write(phost, - lun, - address, - pbuf, - length); - - timeout = phost->Timer; - while (USBH_MSC_RdWrProcess(phost, lun) == USBH_BUSY) - { - if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0)) - { - MSC_Handle->state = MSC_IDLE; - return USBH_FAIL; - } - } - MSC_Handle->state = MSC_IDLE; - return USBH_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c deleted file mode 100644 index aa5ef2d..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c +++ /dev/null @@ -1,633 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_bot.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file includes the BOT protocol related functions - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_msc_bot.h" -#include "usbh_msc.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_MSC_CLASS -* @{ -*/ - -/** @defgroup USBH_MSC_BOT -* @brief This file includes the mass storage related functions -* @{ -*/ - - -/** @defgroup USBH_MSC_BOT_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MSC_BOT_Private_Defines -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MSC_BOT_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_Variables -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_FunctionPrototypes -* @{ -*/ -static USBH_StatusTypeDef USBH_MSC_BOT_Abort(USBH_HandleTypeDef *phost, uint8_t lun, uint8_t dir); -static BOT_CSWStatusTypeDef USBH_MSC_DecodeCSW(USBH_HandleTypeDef *phost); -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Exported_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_Functions -* @{ -*/ - -/** - * @brief USBH_MSC_BOT_REQ_Reset - * The function the MSC BOT Reset request. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_REQ_Reset(USBH_HandleTypeDef *phost) -{ - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = USB_REQ_BOT_RESET; - phost->Control.setup.b.wValue.w = 0; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_MSC_BOT_REQ_GetMaxLUN - * The function the MSC BOT GetMaxLUN request. - * @param phost: Host handle - * @param Maxlun: pointer to Maxlun variable - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_REQ_GetMaxLUN(USBH_HandleTypeDef *phost, uint8_t *Maxlun) -{ - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = USB_REQ_GET_MAX_LUN; - phost->Control.setup.b.wValue.w = 0; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 1; - - return USBH_CtlReq(phost, Maxlun , 1 ); -} - - - -/** - * @brief USBH_MSC_BOT_Init - * The function Initializes the BOT protocol. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_Init(USBH_HandleTypeDef *phost) -{ - - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - MSC_Handle->hbot.cbw.field.Signature = BOT_CBW_SIGNATURE; - MSC_Handle->hbot.cbw.field.Tag = BOT_CBW_TAG; - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_SEND; - - return USBH_OK; -} - - - -/** - * @brief USBH_MSC_BOT_Process - * The function handle the BOT protocol. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_Process (USBH_HandleTypeDef *phost, uint8_t lun) -{ - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef error = USBH_BUSY; - BOT_CSWStatusTypeDef CSW_Status = BOT_CSW_CMD_FAILED; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - uint8_t toggle = 0; - - switch (MSC_Handle->hbot.state) - { - case BOT_SEND_CBW: - MSC_Handle->hbot.cbw.field.LUN = lun; - MSC_Handle->hbot.state = BOT_SEND_CBW_WAIT; - USBH_BulkSendData (phost, - MSC_Handle->hbot.cbw.data, - BOT_CBW_LENGTH, - MSC_Handle->OutPipe, - 1); - - break; - - case BOT_SEND_CBW_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->OutPipe); - - if(URB_Status == USBH_URB_DONE) - { - if ( MSC_Handle->hbot.cbw.field.DataTransferLength != 0 ) - { - /* If there is Data Transfer Stage */ - if (((MSC_Handle->hbot.cbw.field.Flags) & USB_REQ_DIR_MASK) == USB_D2H) - { - /* Data Direction is IN */ - MSC_Handle->hbot.state = BOT_DATA_IN; - } - else - { - /* Data Direction is OUT */ - MSC_Handle->hbot.state = BOT_DATA_OUT; - } - } - - else - {/* If there is NO Data Transfer Stage */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - - } - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Re-send CBW */ - MSC_Handle->hbot.state = BOT_SEND_CBW; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_DATA_IN: - /* Send first packet */ - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->InEpSize , - MSC_Handle->InPipe); - - MSC_Handle->hbot.state = BOT_DATA_IN_WAIT; - - break; - - case BOT_DATA_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->InPipe); - - if(URB_Status == USBH_URB_DONE) - { - /* Adjust Data pointer and data length */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > MSC_Handle->InEpSize) - { - MSC_Handle->hbot.pbuf += MSC_Handle->InEpSize; - MSC_Handle->hbot.cbw.field.DataTransferLength -= MSC_Handle->InEpSize; - } - else - { - MSC_Handle->hbot.cbw.field.DataTransferLength = 0; - } - - /* More Data To be Received */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > 0) - { - /* Send next packet */ - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->InEpSize , - MSC_Handle->InPipe); - - } - else - { - /* If value was 0, and successful transfer, then change the state */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - } - else if(URB_Status == USBH_URB_STALL) - { - /* This is Data IN Stage STALL Condition */ - MSC_Handle->hbot.state = BOT_ERROR_IN; - - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - 6.7.2 Host expects to receive data from the device - 3. On a STALL condition receiving data, then: - The host shall accept the data received. - The host shall clear the Bulk-In pipe. - 4. The host shall attempt to receive a CSW.*/ - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_DATA_OUT: - - USBH_BulkSendData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->OutEpSize , - MSC_Handle->OutPipe, - 1); - - - MSC_Handle->hbot.state = BOT_DATA_OUT_WAIT; - break; - - case BOT_DATA_OUT_WAIT: - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->OutPipe); - - if(URB_Status == USBH_URB_DONE) - { - /* Adjust Data pointer and data length */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > MSC_Handle->OutEpSize) - { - MSC_Handle->hbot.pbuf += MSC_Handle->OutEpSize; - MSC_Handle->hbot.cbw.field.DataTransferLength -= MSC_Handle->OutEpSize; - } - else - { - MSC_Handle->hbot.cbw.field.DataTransferLength = 0; - } - - /* More Data To be Sent */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > 0) - { - USBH_BulkSendData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->OutEpSize , - MSC_Handle->OutPipe, - 1); - } - else - { - /* If value was 0, and successful transfer, then change the state */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Resend same data */ - MSC_Handle->hbot.state = BOT_DATA_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_OUT; - - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - 6.7.3 Ho - Host expects to send data to the device - 3. On a STALL condition sending data, then: - " The host shall clear the Bulk-Out pipe. - 4. The host shall attempt to receive a CSW. - */ -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_RECEIVE_CSW: - - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.csw.data, - BOT_CSW_LENGTH , - MSC_Handle->InPipe); - - MSC_Handle->hbot.state = BOT_RECEIVE_CSW_WAIT; - break; - - case BOT_RECEIVE_CSW_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->InPipe); - - /* Decode CSW */ - if(URB_Status == USBH_URB_DONE) - { - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_SEND; - CSW_Status = USBH_MSC_DecodeCSW(phost); - - if(CSW_Status == BOT_CSW_CMD_PASSED) - { - status = USBH_OK; - } - else - { - status = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_IN; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_ERROR_IN: - error = USBH_MSC_BOT_Abort(phost, lun, BOT_DIR_IN); - - if (error == USBH_OK) - { - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } - else if (error == USBH_UNRECOVERED_ERROR) - { - /* This means that there is a STALL Error limit, Do Reset Recovery */ - MSC_Handle->hbot.state = BOT_UNRECOVERED_ERROR; - } - break; - - case BOT_ERROR_OUT: - error = USBH_MSC_BOT_Abort(phost, lun, BOT_DIR_OUT); - - if ( error == USBH_OK) - { - - toggle = USBH_LL_GetToggle(phost, MSC_Handle->OutPipe); - USBH_LL_SetToggle(phost, MSC_Handle->OutPipe, 1- toggle); - USBH_LL_SetToggle(phost, MSC_Handle->InPipe, 0); - MSC_Handle->hbot.state = BOT_ERROR_IN; - } - else if (error == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->hbot.state = BOT_UNRECOVERED_ERROR; - } - break; - - - case BOT_UNRECOVERED_ERROR: - status = USBH_MSC_BOT_REQ_Reset(phost); - if ( status == USBH_OK) - { - MSC_Handle->hbot.state = BOT_SEND_CBW; - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_MSC_BOT_Abort - * The function handle the BOT Abort process. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param dir: direction (0: out / 1 : in) - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_BOT_Abort(USBH_HandleTypeDef *phost, uint8_t lun, uint8_t dir) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch (dir) - { - case BOT_DIR_IN : - /* send ClrFeture on Bulk IN endpoint */ - status = USBH_ClrFeature(phost, MSC_Handle->InEp); - - break; - - case BOT_DIR_OUT : - /*send ClrFeature on Bulk OUT endpoint */ - status = USBH_ClrFeature(phost, MSC_Handle->OutEp); - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_MSC_BOT_DecodeCSW - * This function decodes the CSW received by the device and updates the - * same to upper layer. - * @param phost: Host handle - * @retval USBH Status - * @notes - * Refer to USB Mass-Storage Class : BOT (www.usb.org) - * 6.3.1 Valid CSW Conditions : - * The host shall consider the CSW valid when: - * 1. dCSWSignature is equal to 53425355h - * 2. the CSW is 13 (Dh) bytes in length, - * 3. dCSWTag matches the dCBWTag from the corresponding CBW. - */ - -static BOT_CSWStatusTypeDef USBH_MSC_DecodeCSW(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - BOT_CSWStatusTypeDef status = BOT_CSW_CMD_FAILED; - - /*Checking if the transfer length is different than 13*/ - if(USBH_LL_GetLastXferSize(phost, MSC_Handle->InPipe) != BOT_CSW_LENGTH) - { - /*(4) Hi > Dn (Host expects to receive data from the device, - Device intends to transfer no data) - (5) Hi > Di (Host expects to receive data from the device, - Device intends to send data to the host) - (9) Ho > Dn (Host expects to send data to the device, - Device intends to transfer no data) - (11) Ho > Do (Host expects to send data to the device, - Device intends to receive data from the host)*/ - - - status = BOT_CSW_PHASE_ERROR; - } - else - { /* CSW length is Correct */ - - /* Check validity of the CSW Signature and CSWStatus */ - if(MSC_Handle->hbot.csw.field.Signature == BOT_CSW_SIGNATURE) - {/* Check Condition 1. dCSWSignature is equal to 53425355h */ - - if(MSC_Handle->hbot.csw.field.Tag == MSC_Handle->hbot.cbw.field.Tag) - { - /* Check Condition 3. dCSWTag matches the dCBWTag from the - corresponding CBW */ - - if(MSC_Handle->hbot.csw.field.Status == 0) - { - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - - Hn Host expects no data transfers - Hi Host expects to receive data from the device - Ho Host expects to send data to the device - - Dn Device intends to transfer no data - Di Device intends to send data to the host - Do Device intends to receive data from the host - - Section 6.7 - (1) Hn = Dn (Host expects no data transfers, - Device intends to transfer no data) - (6) Hi = Di (Host expects to receive data from the device, - Device intends to send data to the host) - (12) Ho = Do (Host expects to send data to the device, - Device intends to receive data from the host) - - */ - - status = BOT_CSW_CMD_PASSED; - } - else if(MSC_Handle->hbot.csw.field.Status == 1) - { - status = BOT_CSW_CMD_FAILED; - } - - else if(MSC_Handle->hbot.csw.field.Status == 2) - { - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - Section 6.7 - (2) Hn < Di ( Host expects no data transfers, - Device intends to send data to the host) - (3) Hn < Do ( Host expects no data transfers, - Device intends to receive data from the host) - (7) Hi < Di ( Host expects to receive data from the device, - Device intends to send data to the host) - (8) Hi <> Do ( Host expects to receive data from the device, - Device intends to receive data from the host) - (10) Ho <> Di (Host expects to send data to the device, - Di Device intends to send data to the host) - (13) Ho < Do (Host expects to send data to the device, - Device intends to receive data from the host) - */ - - status = BOT_CSW_PHASE_ERROR; - } - } /* CSW Tag Matching is Checked */ - } /* CSW Signature Correct Checking */ - else - { - /* If the CSW Signature is not valid, We sall return the Phase Error to - Upper Layers for Reset Recovery */ - - status = BOT_CSW_PHASE_ERROR; - } - } /* CSW Length Check*/ - - return status; -} - - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c deleted file mode 100644 index 8771d68..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c +++ /dev/null @@ -1,458 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_scsi.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the SCSI commands - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_msc.h" -#include "usbh_msc_scsi.h" -#include "usbh_msc_bot.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_SCSI - * @brief This file includes the mass storage related functions - * @{ - */ - - -/** @defgroup USBH_MSC_SCSI_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Private_Functions - * @{ - */ - - -/** - * @brief USBH_MSC_SCSI_TestUnitReady - * Issue TestUnitReady command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost, - uint8_t lun) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_MODE_TEST_UNIT_READY; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_TEST_UNIT_READY; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_ReadCapacity - * Issue Read Capacity command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the capacity structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_ReadCapacity (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_CapacityTypeDef *capacity) -{ - USBH_StatusTypeDef error = USBH_BUSY ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_READ_CAPACITY10; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_READ_CAPACITY10; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - /*assign the capacity*/ - capacity->block_nbr = MSC_Handle->hbot.pbuf[3] | (MSC_Handle->hbot.pbuf[2] << 8) |\ - (MSC_Handle->hbot.pbuf[1] << 16) | (MSC_Handle->hbot.pbuf[0] << 24); - - /*assign the page length*/ - capacity->block_size = MSC_Handle->hbot.pbuf[7] | (MSC_Handle->hbot.pbuf[6] << 8); - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Inquiry - * Issue Inquiry command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the inquiry structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Inquiry (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_StdInquiryDataTypeDef *inquiry) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_INQUIRY; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_INQUIRY; - MSC_Handle->hbot.cbw.field.CB[1] = (lun << 5); - MSC_Handle->hbot.cbw.field.CB[2] = 0; - MSC_Handle->hbot.cbw.field.CB[3] = 0; - MSC_Handle->hbot.cbw.field.CB[4] = 0x24; - MSC_Handle->hbot.cbw.field.CB[5] = 0; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - USBH_memset(inquiry, 0, sizeof(SCSI_StdInquiryDataTypeDef)); - /*assign Inquiry Data */ - inquiry->DeviceType = MSC_Handle->hbot.pbuf[0] & 0x1F; - inquiry->PeripheralQualifier = MSC_Handle->hbot.pbuf[0] >> 5; - inquiry->RemovableMedia = (MSC_Handle->hbot.pbuf[1] & 0x80)== 0x80; - USBH_memcpy (inquiry->vendor_id, &MSC_Handle->hbot.pbuf[8], 8); - USBH_memcpy (inquiry->product_id, &MSC_Handle->hbot.pbuf[16], 16); - USBH_memcpy (inquiry->revision_id, &MSC_Handle->hbot.pbuf[32], 4); - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_RequestSense - * Issue RequestSense command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the sense data structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_RequestSense (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_SenseTypeDef *sense_data) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.CB[1] = (lun << 5); - MSC_Handle->hbot.cbw.field.CB[2] = 0; - MSC_Handle->hbot.cbw.field.CB[3] = 0; - MSC_Handle->hbot.cbw.field.CB[4] = DATA_LEN_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.CB[5] = 0; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - sense_data->key = MSC_Handle->hbot.pbuf[2] & 0x0F; - sense_data->asc = MSC_Handle->hbot.pbuf[12]; - sense_data->ascq = MSC_Handle->hbot.pbuf[13]; - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Write - * Issue write10 command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to write - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = length * 512; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_WRITE10; - - /*logical block address*/ - MSC_Handle->hbot.cbw.field.CB[2] = (((uint8_t*)&address)[3]); - MSC_Handle->hbot.cbw.field.CB[3] = (((uint8_t*)&address)[2]); - MSC_Handle->hbot.cbw.field.CB[4] = (((uint8_t*)&address)[1]); - MSC_Handle->hbot.cbw.field.CB[5] = (((uint8_t*)&address)[0]); - - - /*Transfer length */ - MSC_Handle->hbot.cbw.field.CB[7] = (((uint8_t *)&length)[1]) ; - MSC_Handle->hbot.cbw.field.CB[8] = (((uint8_t *)&length)[0]) ; - - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = pbuf; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Read - * Issue Read10 command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to read - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = length * 512; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_READ10; - - /*logical block address*/ - MSC_Handle->hbot.cbw.field.CB[2] = (((uint8_t*)&address)[3]); - MSC_Handle->hbot.cbw.field.CB[3] = (((uint8_t*)&address)[2]); - MSC_Handle->hbot.cbw.field.CB[4] = (((uint8_t*)&address)[1]); - MSC_Handle->hbot.cbw.field.CB[5] = (((uint8_t*)&address)[0]); - - - /*Transfer length */ - MSC_Handle->hbot.cbw.field.CB[7] = (((uint8_t *)&length)[1]) ; - MSC_Handle->hbot.cbw.field.CB[8] = (((uint8_t *)&length)[0]) ; - - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = pbuf; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp.h deleted file mode 100644 index 5b516f3..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp.h +++ /dev/null @@ -1,270 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_mtp.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_mtp.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MTP_H -#define __USBH_MTP_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_mtp_ptp.h" -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_MTP_CLASS -* @{ -*/ - -/** @defgroup USBH_MTP_CORE -* @brief This file is the Header file for usbh_mtp.c -* @{ -*/ - - - - -/*Communication Class codes*/ -#define USB_MTP_CLASS 0x06 /* Still Image Class)*/ -#define MTP_MAX_STORAGE_UNITS_NBR PTP_MAX_STORAGE_UNITS_NBR - -/** - * @} - */ - -/** @defgroup USBH_MTP_CORE_Exported_Types -* @{ -*/ -typedef enum -{ - MTP_IDLE = 0, - MTP_GETDEVICEINFO , - MTP_OPENSESSION , - MTP_CLOSESESSION , - MTP_GETSTORAGEIDS , - MTP_GETSTORAGEINFO , -} -MTP_StateTypeDef; - - -typedef enum -{ - MTP_EVENTS_INIT = 0, - MTP_EVENTS_GETDATA , -} -MTP_EventsStateTypeDef; - - -typedef struct -{ - MTP_EventsStateTypeDef state; - uint32_t timer; - uint16_t poll; - PTP_EventContainerTypedef container; -} -MTP_EventHandleTypedef; - -typedef struct -{ - - uint32_t CurrentStorageId; - uint32_t ObjectFormatCode; - uint32_t CurrentObjectHandler; - uint8_t ObjectHandlerNbr; - uint32_t Objdepth; -} -MTP_ParamsTypedef; - - -typedef struct -{ - PTP_DeviceInfoTypedef devinfo; - PTP_StorageIDsTypedef storids; - PTP_StorageInfoTypedef storinfo[MTP_MAX_STORAGE_UNITS_NBR]; - PTP_ObjectHandlesTypedef Handles; -} -MTP_InfoTypedef; - -/* Structure for MTP process */ -typedef struct _MTP_Process -{ - MTP_InfoTypedef info; - MTP_ParamsTypedef params; - - uint8_t DataInPipe; - uint8_t DataOutPipe; - uint8_t NotificationPipe; - - uint8_t DataOutEp; - uint8_t DataInEp; - uint8_t NotificationEp; - - uint16_t DataOutEpSize; - uint16_t DataInEpSize; - uint16_t NotificationEpSize; - MTP_StateTypeDef state; - MTP_EventHandleTypedef events; - PTP_HandleTypeDef ptp; - uint32_t current_storage_unit; - uint32_t is_ready; -} -MTP_HandleTypeDef; - -#define MTP_StorageInfoTypedef PTP_StorageInfoTypedef -#define MTP_ObjectHandlesTypedef PTP_ObjectHandlesTypedef -#define MTP_ObjectInfoTypedef PTP_ObjectInfoTypedef -/** -* @} -*/ - -/** @defgroup USBH_MTP_CORE_Exported_Defines -* @{ -*/ - -/** -* @} -*/ - -/** @defgroup USBH_MTP_CORE_Exported_Macros -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MTP_CORE_Exported_Variables -* @{ -*/ -extern USBH_ClassTypeDef MTP_Class; -#define USBH_MTP_CLASS &MTP_Class - -/** -* @} -*/ - -/** @defgroup USBH_MTP_CORE_Exported_FunctionsPrototype -* @{ -*/ -uint8_t USBH_MTP_IsReady (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_MTP_SelectStorage (USBH_HandleTypeDef *phost, uint8_t storage_idx); -USBH_StatusTypeDef USBH_MTP_GetNumStorage (USBH_HandleTypeDef *phost, uint8_t *storage_num); -USBH_StatusTypeDef USBH_MTP_GetNumObjects (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - uint32_t* numobs); -USBH_StatusTypeDef USBH_MTP_GetStorageInfo (USBH_HandleTypeDef *phost, - uint8_t storage_idx, - MTP_StorageInfoTypedef *info); - -USBH_StatusTypeDef USBH_MTP_GetObjectHandles (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - PTP_ObjectHandlesTypedef* objecthandles); - -USBH_StatusTypeDef USBH_MTP_GetObjectInfo (USBH_HandleTypeDef *phost, - uint32_t handle, - PTP_ObjectInfoTypedef* objectinfo); - -USBH_StatusTypeDef USBH_MTP_DeleteObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t objectformatcode); - -USBH_StatusTypeDef USBH_MTP_GetObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object); - -USBH_StatusTypeDef USBH_MTP_GetPartialObject(USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t offset, - uint32_t maxbytes, - uint8_t *object, - uint32_t *len); - -USBH_StatusTypeDef USBH_MTP_GetObjectPropsSupported (USBH_HandleTypeDef *phost, - uint16_t ofc, - uint32_t *propnum, - uint16_t *props); - -USBH_StatusTypeDef USBH_MTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, - uint16_t opc, - uint16_t ofc, - PTP_ObjectPropDescTypeDef *opd); - -USBH_StatusTypeDef USBH_MTP_GetObjectPropList (USBH_HandleTypeDef *phost, - uint32_t handle, - MTP_PropertiesTypedef *pprops, - uint32_t *nrofprops); - -USBH_StatusTypeDef USBH_MTP_SendObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object, - uint32_t size); - -USBH_StatusTypeDef USBH_MTP_GetDevicePropDesc (USBH_HandleTypeDef *phost, - uint16_t propcode, - PTP_DevicePropDescTypdef* devicepropertydesc); - -void USBH_MTP_EventsCallback(USBH_HandleTypeDef *phost, uint32_t event, uint32_t param); -/** -* @} -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MTP_H */ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp_ptp.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp_ptp.h deleted file mode 100644 index 76d10e7..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Inc/usbh_mtp_ptp.h +++ /dev/null @@ -1,1045 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_mtp_ptp.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_mtp_ptp.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MTP_PTP_H -#define __USBH_MTP_PTP_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MTP_PTP_CLASS - * @{ - */ - -/** @defgroup USBH_MTP_PTP - * @brief This file is the Header file for usbh_mtp_ptp.c - * @{ - */ - - -/* Operation Codes */ - -/* PTP v1.0 operation codes */ -#define PTP_OC_Undefined 0x1000 -#define PTP_OC_GetDeviceInfo 0x1001 -#define PTP_OC_OpenSession 0x1002 -#define PTP_OC_CloseSession 0x1003 -#define PTP_OC_GetStorageIDs 0x1004 -#define PTP_OC_GetStorageInfo 0x1005 -#define PTP_OC_GetNumObjects 0x1006 -#define PTP_OC_GetObjectHandles 0x1007 -#define PTP_OC_GetObjectInfo 0x1008 -#define PTP_OC_GetObject 0x1009 -#define PTP_OC_GetThumb 0x100A -#define PTP_OC_DeleteObject 0x100B -#define PTP_OC_SendObjectInfo 0x100C -#define PTP_OC_SendObject 0x100D -#define PTP_OC_InitiateCapture 0x100E -#define PTP_OC_FormatStore 0x100F -#define PTP_OC_ResetDevice 0x1010 -#define PTP_OC_SelfTest 0x1011 -#define PTP_OC_SetObjectProtection 0x1012 -#define PTP_OC_PowerDown 0x1013 -#define PTP_OC_GetDevicePropDesc 0x1014 -#define PTP_OC_GetDevicePropValue 0x1015 -#define PTP_OC_SetDevicePropValue 0x1016 -#define PTP_OC_ResetDevicePropValue 0x1017 -#define PTP_OC_TerminateOpenCapture 0x1018 -#define PTP_OC_MoveObject 0x1019 -#define PTP_OC_CopyObject 0x101A -#define PTP_OC_GetPartialObject 0x101B -#define PTP_OC_InitiateOpenCapture 0x101C - -/* PTP v1.1 operation codes */ -#define PTP_OC_StartEnumHandles 0x101D -#define PTP_OC_EnumHandles 0x101E -#define PTP_OC_StopEnumHandles 0x101F -#define PTP_OC_GetVendorExtensionMaps 0x1020 -#define PTP_OC_GetVendorDeviceInfo 0x1021 -#define PTP_OC_GetResizedImageObject 0x1022 -#define PTP_OC_GetFilesystemManifest 0x1023 -#define PTP_OC_GetStreamInfo 0x1024 -#define PTP_OC_GetStream 0x1025 - - /* Microsoft / MTP extension codes */ -#define PTP_OC_GetObjectPropsSupported 0x9801 -#define PTP_OC_GetObjectPropDesc 0x9802 -#define PTP_OC_GetObjectPropValue 0x9803 -#define PTP_OC_SetObjectPropValue 0x9804 -#define PTP_OC_GetObjPropList 0x9805 -#define PTP_OC_SetObjPropList 0x9806 -#define PTP_OC_GetInterdependendPropdesc 0x9807 -#define PTP_OC_SendObjectPropList 0x9808 -#define PTP_OC_GetObjectReferences 0x9810 -#define PTP_OC_SetObjectReferences 0x9811 -#define PTP_OC_UpdateDeviceFirmware 0x9812 -#define PTP_OC_Skip 0x9820 - - -/* Response Codes */ - -/* PTP v1.0 response codes */ -#define PTP_RC_Undefined 0x2000 -#define PTP_RC_OK 0x2001 -#define PTP_RC_GeneralError 0x2002 -#define PTP_RC_SessionNotOpen 0x2003 -#define PTP_RC_InvalidTransactionID 0x2004 -#define PTP_RC_OperationNotSupported 0x2005 -#define PTP_RC_ParameterNotSupported 0x2006 -#define PTP_RC_IncompleteTransfer 0x2007 -#define PTP_RC_InvalidStorageId 0x2008 -#define PTP_RC_InvalidObjectHandle 0x2009 -#define PTP_RC_DevicePropNotSupported 0x200A -#define PTP_RC_InvalidObjectFormatCode 0x200B -#define PTP_RC_StoreFull 0x200C -#define PTP_RC_ObjectWriteProtected 0x200D -#define PTP_RC_StoreReadOnly 0x200E -#define PTP_RC_AccessDenied 0x200F -#define PTP_RC_NoThumbnailPresent 0x2010 -#define PTP_RC_SelfTestFailed 0x2011 -#define PTP_RC_PartialDeletion 0x2012 -#define PTP_RC_StoreNotAvailable 0x2013 -#define PTP_RC_SpecificationByFormatUnsupported 0x2014 -#define PTP_RC_NoValidObjectInfo 0x2015 -#define PTP_RC_InvalidCodeFormat 0x2016 -#define PTP_RC_UnknownVendorCode 0x2017 -#define PTP_RC_CaptureAlreadyTerminated 0x2018 -#define PTP_RC_DeviceBusy 0x2019 -#define PTP_RC_InvalidParentObject 0x201A -#define PTP_RC_InvalidDevicePropFormat 0x201B -#define PTP_RC_InvalidDevicePropValue 0x201C -#define PTP_RC_InvalidParameter 0x201D -#define PTP_RC_SessionAlreadyOpened 0x201E -#define PTP_RC_TransactionCanceled 0x201F -#define PTP_RC_SpecificationOfDestinationUnsupported 0x2020 -/* PTP v1.1 response codes */ -#define PTP_RC_InvalidEnumHandle 0x2021 -#define PTP_RC_NoStreamEnabled 0x2022 -#define PTP_RC_InvalidDataSet 0x2023 - -/* USB container types */ - -#define PTP_USB_CONTAINER_UNDEFINED 0x0000 -#define PTP_USB_CONTAINER_COMMAND 0x0001 -#define PTP_USB_CONTAINER_DATA 0x0002 -#define PTP_USB_CONTAINER_RESPONSE 0x0003 -#define PTP_USB_CONTAINER_EVENT 0x0004 - -/* PTP/IP definitions */ -#define PTPIP_INIT_COMMAND_REQUEST 1 -#define PTPIP_INIT_COMMAND_ACK 2 -#define PTPIP_INIT_EVENT_REQUEST 3 -#define PTPIP_INIT_EVENT_ACK 4 -#define PTPIP_INIT_FAIL 5 -#define PTPIP_CMD_REQUEST 6 -#define PTPIP_CMD_RESPONSE 7 -#define PTPIP_EVENT 8 -#define PTPIP_START_DATA_PACKET 9 -#define PTPIP_DATA_PACKET 10 -#define PTPIP_CANCEL_TRANSACTION 11 -#define PTPIP_END_DATA_PACKET 12 -#define PTPIP_PING 13 -#define PTPIP_PONG 14 - -/* Transaction data phase description */ -#define PTP_DP_NODATA 0x0000 /* no data phase */ -#define PTP_DP_SENDDATA 0x0001 /* sending data */ -#define PTP_DP_GETDATA 0x0002 /* receiving data */ -#define PTP_DP_DATA_MASK 0x00ff /* data phase mask */ - -/** @defgroup USBH_MTP_PTP_Exported_Types - * @{ - */ - -typedef enum -{ - PTP_REQ_IDLE = 0, - PTP_REQ_SEND = 1, - PTP_REQ_WAIT, - PTP_REQ_ERROR, -} -PTP_RequestStateTypeDef; - -typedef enum -{ - PTP_IDLE = 0, - PTP_OP_REQUEST_STATE, - PTP_OP_REQUEST_WAIT_STATE, - PTP_DATA_OUT_PHASE_STATE, - PTP_DATA_OUT_PHASE_WAIT_STATE, - PTP_DATA_IN_PHASE_STATE, - PTP_DATA_IN_PHASE_WAIT_STATE, - PTP_RESPONSE_STATE, - PTP_RESPONSE_WAIT_STATE, - PTP_ERROR, -} -PTP_ProcessStateTypeDef; - -/* PTP request/response/event general PTP container (transport independent) */ -typedef struct -{ - uint16_t Code; - uint32_t SessionID; - uint32_t Transaction_ID; - /* params may be of any type of size less or equal to uint32_t */ - uint32_t Param1; - uint32_t Param2; - uint32_t Param3; - /* events can only have three parameters */ - uint32_t Param4; - uint32_t Param5; - /* the number of meaningful parameters */ - uint8_t Nparam; -} -PTP_ContainerTypedef; - -#define PTP_USB_BULK_HS_MAX_PACKET_LEN_WRITE 1024 -#define PTP_USB_BULK_HS_MAX_PACKET_LEN_READ 1024 -#define PTP_USB_BULK_HDR_LEN (2*sizeof(uint32_t)+2*sizeof(uint16_t)) -#define PTP_USB_BULK_PAYLOAD_LEN_WRITE (PTP_USB_BULK_HS_MAX_PACKET_LEN_WRITE-PTP_USB_BULK_HDR_LEN) -#define PTP_USB_BULK_PAYLOAD_LEN_READ (PTP_USB_BULK_HS_MAX_PACKET_LEN_READ-PTP_USB_BULK_HDR_LEN) -#define PTP_USB_BULK_REQ_LEN (PTP_USB_BULK_HDR_LEN+5*sizeof(uint32_t)) -#define PTP_USB_BULK_REQ_RESP_MAX_LEN 63 - -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - uint32_t param1; - uint32_t param2; - uint32_t param3; - uint32_t param4; - uint32_t param5; -} -PTP_RespContainerTypedef; - - -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - uint32_t param1; - uint32_t param2; - uint32_t param3; - uint32_t param4; - uint32_t param5; -} -PTP_OpContainerTypedef; - -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - union { - struct { - uint32_t param1; - uint32_t param2; - uint32_t param3; - uint32_t param4; - uint32_t param5; - } params; - uint8_t data[PTP_USB_BULK_PAYLOAD_LEN_READ]; - }payload; -} -PTP_DataContainerTypedef; - -/* PTP USB Asynchronous Event Interrupt Data Format */ -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - uint32_t param1; - uint32_t param2; - uint32_t param3; -} -PTP_EventContainerTypedef; - -/* Structure for PTP Transport process */ -typedef struct -{ - PTP_ProcessStateTypeDef state; - PTP_RequestStateTypeDef req_state; - PTP_OpContainerTypedef op_container; - PTP_DataContainerTypedef data_container; - PTP_RespContainerTypedef resp_container; - - /* ptp transaction ID */ - uint32_t transaction_id; - - /* ptp session ID */ - uint32_t session_id; - - /* device flags */ - uint32_t flags; - - /****** PTP transfer control *******/ - - /* Data pointer */ - uint8_t *data_ptr; - - /* Data length */ - int32_t data_length; - - /* Data length */ - uint32_t data_packet; - - /* Data length */ - uint32_t iteration; - - /* Packet Index */ - uint32_t data_packet_counter; - - /****** Object transfer control *******/ - - /* object pointer */ - uint8_t *object_ptr; - -} -PTP_HandleTypeDef; - -/* DeviceInfo data offset */ -#define PTP_di_StandardVersion 0 -#define PTP_di_VendorExtensionID 2 -#define PTP_di_VendorExtensionVersion 6 -#define PTP_di_VendorExtensionDesc 8 -#define PTP_di_FunctionalMode 8 -#define PTP_di_OperationsSupported 10 - -/* Max info items size */ -#define PTP_SUPPORTED_OPERATIONS_NBR 100 -#define PTP_SUPPORTED_EVENTS_NBR 100 -#define PTP_SUPPORTED_PROPRIETIES_NBR 100 -#define PTP_CAPTURE_FORMATS_NBR 100 -#define PTP_IMAGE_FORMATS_NBR 100 -#define PTP_MAX_STR_SIZE 255 -/* PTP device info structure */ -typedef struct -{ - uint16_t StandardVersion; - uint32_t VendorExtensionID; - uint16_t VendorExtensionVersion; - uint8_t VendorExtensionDesc[PTP_MAX_STR_SIZE]; - uint16_t FunctionalMode; - uint32_t OperationsSupported_len; - uint16_t OperationsSupported[PTP_SUPPORTED_OPERATIONS_NBR]; - uint32_t EventsSupported_len; - uint16_t EventsSupported[PTP_SUPPORTED_EVENTS_NBR]; - uint32_t DevicePropertiesSupported_len; - uint16_t DevicePropertiesSupported[PTP_SUPPORTED_PROPRIETIES_NBR]; - uint32_t CaptureFormats_len; - uint16_t CaptureFormats[PTP_CAPTURE_FORMATS_NBR]; - uint32_t ImageFormats_len; - uint16_t ImageFormats[PTP_IMAGE_FORMATS_NBR]; - uint8_t Manufacturer[PTP_MAX_STR_SIZE]; - uint8_t Model[PTP_MAX_STR_SIZE]; - uint8_t DeviceVersion[PTP_MAX_STR_SIZE]; - uint8_t SerialNumber[PTP_MAX_STR_SIZE]; -} -PTP_DeviceInfoTypedef; - -#define PTP_MAX_STORAGE_UNITS_NBR 5 -/* PTP storageIDs structute (returned by GetStorageIDs) */ -typedef struct -{ - uint32_t n; - uint32_t Storage [PTP_MAX_STORAGE_UNITS_NBR]; -} -PTP_StorageIDsTypedef; - -/* PTP StorageInfo structure (returned by GetStorageInfo) */ - -#define PTP_si_StorageType 0 -#define PTP_si_FilesystemType 2 -#define PTP_si_AccessCapability 4 -#define PTP_si_MaxCapability 6 -#define PTP_si_FreeSpaceInBytes 14 -#define PTP_si_FreeSpaceInImages 22 -#define PTP_si_StorageDescription 26 - - -/* PTP Storage Types */ - -#define PTP_ST_Undefined 0x0000 -#define PTP_ST_FixedROM 0x0001 -#define PTP_ST_RemovableROM 0x0002 -#define PTP_ST_FixedRAM 0x0003 -#define PTP_ST_RemovableRAM 0x0004 - -/* PTP FilesystemType Values */ - -#define PTP_FST_Undefined 0x0000 -#define PTP_FST_GenericFlat 0x0001 -#define PTP_FST_GenericHierarchical 0x0002 -#define PTP_FST_DCF 0x0003 - -/* PTP StorageInfo AccessCapability Values */ - -#define PTP_AC_ReadWrite 0x0000 -#define PTP_AC_ReadOnly 0x0001 -#define PTP_AC_ReadOnly_with_Object_Deletion 0x0002 - -typedef struct -{ - uint16_t StorageType; - uint16_t FilesystemType; - uint16_t AccessCapability; - uint64_t MaxCapability; - uint64_t FreeSpaceInBytes; - uint32_t FreeSpaceInImages; - uint8_t StorageDescription[PTP_MAX_STR_SIZE]; - uint8_t VolumeLabel[PTP_MAX_STR_SIZE]; -} -PTP_StorageInfoTypedef; - -/* PTP Object Format Codes */ - -/* ancillary formats */ -#define PTP_OFC_Undefined 0x3000 -#define PTP_OFC_Defined 0x3800 -#define PTP_OFC_Association 0x3001 -#define PTP_OFC_Script 0x3002 -#define PTP_OFC_Executable 0x3003 -#define PTP_OFC_Text 0x3004 -#define PTP_OFC_HTML 0x3005 -#define PTP_OFC_DPOF 0x3006 -#define PTP_OFC_AIFF 0x3007 -#define PTP_OFC_WAV 0x3008 -#define PTP_OFC_MP3 0x3009 -#define PTP_OFC_AVI 0x300A -#define PTP_OFC_MPEG 0x300B -#define PTP_OFC_ASF 0x300C -#define PTP_OFC_QT 0x300D /* guessing */ -/* image formats */ -#define PTP_OFC_EXIF_JPEG 0x3801 -#define PTP_OFC_TIFF_EP 0x3802 -#define PTP_OFC_FlashPix 0x3803 -#define PTP_OFC_BMP 0x3804 -#define PTP_OFC_CIFF 0x3805 -#define PTP_OFC_Undefined_0x3806 0x3806 -#define PTP_OFC_GIF 0x3807 -#define PTP_OFC_JFIF 0x3808 -#define PTP_OFC_PCD 0x3809 -#define PTP_OFC_PICT 0x380A -#define PTP_OFC_PNG 0x380B -#define PTP_OFC_Undefined_0x380C 0x380C -#define PTP_OFC_TIFF 0x380D -#define PTP_OFC_TIFF_IT 0x380E -#define PTP_OFC_JP2 0x380F -#define PTP_OFC_JPX 0x3810 -/* ptp v1.1 has only DNG new */ -#define PTP_OFC_DNG 0x3811 - -/* MTP extensions */ -#define PTP_OFC_MTP_MediaCard 0xb211 -#define PTP_OFC_MTP_MediaCardGroup 0xb212 -#define PTP_OFC_MTP_Encounter 0xb213 -#define PTP_OFC_MTP_EncounterBox 0xb214 -#define PTP_OFC_MTP_M4A 0xb215 -#define PTP_OFC_MTP_ZUNEUNDEFINED 0xb217 /* Unknown file type */ -#define PTP_OFC_MTP_Firmware 0xb802 -#define PTP_OFC_MTP_WindowsImageFormat 0xb881 -#define PTP_OFC_MTP_UndefinedAudio 0xb900 -#define PTP_OFC_MTP_WMA 0xb901 -#define PTP_OFC_MTP_OGG 0xb902 -#define PTP_OFC_MTP_AAC 0xb903 -#define PTP_OFC_MTP_AudibleCod 0xb904 -#define PTP_OFC_MTP_FLAC 0xb906 -#define PTP_OFC_MTP_SamsungPlaylist 0xb909 -#define PTP_OFC_MTP_UndefinedVideo 0xb980 -#define PTP_OFC_MTP_WMV 0xb981 -#define PTP_OFC_MTP_MP4 0xb982 -#define PTP_OFC_MTP_MP2 0xb983 -#define PTP_OFC_MTP_3GP 0xb984 -#define PTP_OFC_MTP_UndefinedCollection 0xba00 -#define PTP_OFC_MTP_AbstractMultimediaAlbum 0xba01 -#define PTP_OFC_MTP_AbstractImageAlbum 0xba02 -#define PTP_OFC_MTP_AbstractAudioAlbum 0xba03 -#define PTP_OFC_MTP_AbstractVideoAlbum 0xba04 -#define PTP_OFC_MTP_AbstractAudioVideoPlaylist 0xba05 -#define PTP_OFC_MTP_AbstractContactGroup 0xba06 -#define PTP_OFC_MTP_AbstractMessageFolder 0xba07 -#define PTP_OFC_MTP_AbstractChapteredProduction 0xba08 -#define PTP_OFC_MTP_AbstractAudioPlaylist 0xba09 -#define PTP_OFC_MTP_AbstractVideoPlaylist 0xba0a -#define PTP_OFC_MTP_AbstractMediacast 0xba0b -#define PTP_OFC_MTP_WPLPlaylist 0xba10 -#define PTP_OFC_MTP_M3UPlaylist 0xba11 -#define PTP_OFC_MTP_MPLPlaylist 0xba12 -#define PTP_OFC_MTP_ASXPlaylist 0xba13 -#define PTP_OFC_MTP_PLSPlaylist 0xba14 -#define PTP_OFC_MTP_UndefinedDocument 0xba80 -#define PTP_OFC_MTP_AbstractDocument 0xba81 -#define PTP_OFC_MTP_XMLDocument 0xba82 -#define PTP_OFC_MTP_MSWordDocument 0xba83 -#define PTP_OFC_MTP_MHTCompiledHTMLDocument 0xba84 -#define PTP_OFC_MTP_MSExcelSpreadsheetXLS 0xba85 -#define PTP_OFC_MTP_MSPowerpointPresentationPPT 0xba86 -#define PTP_OFC_MTP_UndefinedMessage 0xbb00 -#define PTP_OFC_MTP_AbstractMessage 0xbb01 -#define PTP_OFC_MTP_UndefinedContact 0xbb80 -#define PTP_OFC_MTP_AbstractContact 0xbb81 -#define PTP_OFC_MTP_vCard2 0xbb82 -#define PTP_OFC_MTP_vCard3 0xbb83 -#define PTP_OFC_MTP_UndefinedCalendarItem 0xbe00 -#define PTP_OFC_MTP_AbstractCalendarItem 0xbe01 -#define PTP_OFC_MTP_vCalendar1 0xbe02 -#define PTP_OFC_MTP_vCalendar2 0xbe03 -#define PTP_OFC_MTP_UndefinedWindowsExecutable 0xbe80 -#define PTP_OFC_MTP_MediaCast 0xbe81 -#define PTP_OFC_MTP_Section 0xbe82 - -/* MTP specific Object Properties */ -#define PTP_OPC_StorageID 0xDC01 -#define PTP_OPC_ObjectFormat 0xDC02 -#define PTP_OPC_ProtectionStatus 0xDC03 -#define PTP_OPC_ObjectSize 0xDC04 -#define PTP_OPC_AssociationType 0xDC05 -#define PTP_OPC_AssociationDesc 0xDC06 -#define PTP_OPC_ObjectFileName 0xDC07 -#define PTP_OPC_DateCreated 0xDC08 -#define PTP_OPC_DateModified 0xDC09 -#define PTP_OPC_Keywords 0xDC0A -#define PTP_OPC_ParentObject 0xDC0B -#define PTP_OPC_AllowedFolderContents 0xDC0C -#define PTP_OPC_Hidden 0xDC0D -#define PTP_OPC_SystemObject 0xDC0E -#define PTP_OPC_PersistantUniqueObjectIdentifier 0xDC41 -#define PTP_OPC_SyncID 0xDC42 -#define PTP_OPC_PropertyBag 0xDC43 -#define PTP_OPC_Name 0xDC44 -#define PTP_OPC_CreatedBy 0xDC45 -#define PTP_OPC_Artist 0xDC46 -#define PTP_OPC_DateAuthored 0xDC47 -#define PTP_OPC_Description 0xDC48 -#define PTP_OPC_URLReference 0xDC49 -#define PTP_OPC_LanguageLocale 0xDC4A -#define PTP_OPC_CopyrightInformation 0xDC4B -#define PTP_OPC_Source 0xDC4C -#define PTP_OPC_OriginLocation 0xDC4D -#define PTP_OPC_DateAdded 0xDC4E -#define PTP_OPC_NonConsumable 0xDC4F -#define PTP_OPC_CorruptOrUnplayable 0xDC50 -#define PTP_OPC_ProducerSerialNumber 0xDC51 -#define PTP_OPC_RepresentativeSampleFormat 0xDC81 -#define PTP_OPC_RepresentativeSampleSize 0xDC82 -#define PTP_OPC_RepresentativeSampleHeight 0xDC83 -#define PTP_OPC_RepresentativeSampleWidth 0xDC84 -#define PTP_OPC_RepresentativeSampleDuration 0xDC85 -#define PTP_OPC_RepresentativeSampleData 0xDC86 -#define PTP_OPC_Width 0xDC87 -#define PTP_OPC_Height 0xDC88 -#define PTP_OPC_Duration 0xDC89 -#define PTP_OPC_Rating 0xDC8A -#define PTP_OPC_Track 0xDC8B -#define PTP_OPC_Genre 0xDC8C -#define PTP_OPC_Credits 0xDC8D -#define PTP_OPC_Lyrics 0xDC8E -#define PTP_OPC_SubscriptionContentID 0xDC8F -#define PTP_OPC_ProducedBy 0xDC90 -#define PTP_OPC_UseCount 0xDC91 -#define PTP_OPC_SkipCount 0xDC92 -#define PTP_OPC_LastAccessed 0xDC93 -#define PTP_OPC_ParentalRating 0xDC94 -#define PTP_OPC_MetaGenre 0xDC95 -#define PTP_OPC_Composer 0xDC96 -#define PTP_OPC_EffectiveRating 0xDC97 -#define PTP_OPC_Subtitle 0xDC98 -#define PTP_OPC_OriginalReleaseDate 0xDC99 -#define PTP_OPC_AlbumName 0xDC9A -#define PTP_OPC_AlbumArtist 0xDC9B -#define PTP_OPC_Mood 0xDC9C -#define PTP_OPC_DRMStatus 0xDC9D -#define PTP_OPC_SubDescription 0xDC9E -#define PTP_OPC_IsCropped 0xDCD1 -#define PTP_OPC_IsColorCorrected 0xDCD2 -#define PTP_OPC_ImageBitDepth 0xDCD3 -#define PTP_OPC_Fnumber 0xDCD4 -#define PTP_OPC_ExposureTime 0xDCD5 -#define PTP_OPC_ExposureIndex 0xDCD6 -#define PTP_OPC_DisplayName 0xDCE0 -#define PTP_OPC_BodyText 0xDCE1 -#define PTP_OPC_Subject 0xDCE2 -#define PTP_OPC_Priority 0xDCE3 -#define PTP_OPC_GivenName 0xDD00 -#define PTP_OPC_MiddleNames 0xDD01 -#define PTP_OPC_FamilyName 0xDD02 -#define PTP_OPC_Prefix 0xDD03 -#define PTP_OPC_Suffix 0xDD04 -#define PTP_OPC_PhoneticGivenName 0xDD05 -#define PTP_OPC_PhoneticFamilyName 0xDD06 -#define PTP_OPC_EmailPrimary 0xDD07 -#define PTP_OPC_EmailPersonal1 0xDD08 -#define PTP_OPC_EmailPersonal2 0xDD09 -#define PTP_OPC_EmailBusiness1 0xDD0A -#define PTP_OPC_EmailBusiness2 0xDD0B -#define PTP_OPC_EmailOthers 0xDD0C -#define PTP_OPC_PhoneNumberPrimary 0xDD0D -#define PTP_OPC_PhoneNumberPersonal 0xDD0E -#define PTP_OPC_PhoneNumberPersonal2 0xDD0F -#define PTP_OPC_PhoneNumberBusiness 0xDD10 -#define PTP_OPC_PhoneNumberBusiness2 0xDD11 -#define PTP_OPC_PhoneNumberMobile 0xDD12 -#define PTP_OPC_PhoneNumberMobile2 0xDD13 -#define PTP_OPC_FaxNumberPrimary 0xDD14 -#define PTP_OPC_FaxNumberPersonal 0xDD15 -#define PTP_OPC_FaxNumberBusiness 0xDD16 -#define PTP_OPC_PagerNumber 0xDD17 -#define PTP_OPC_PhoneNumberOthers 0xDD18 -#define PTP_OPC_PrimaryWebAddress 0xDD19 -#define PTP_OPC_PersonalWebAddress 0xDD1A -#define PTP_OPC_BusinessWebAddress 0xDD1B -#define PTP_OPC_InstantMessengerAddress 0xDD1C -#define PTP_OPC_InstantMessengerAddress2 0xDD1D -#define PTP_OPC_InstantMessengerAddress3 0xDD1E -#define PTP_OPC_PostalAddressPersonalFull 0xDD1F -#define PTP_OPC_PostalAddressPersonalFullLine1 0xDD20 -#define PTP_OPC_PostalAddressPersonalFullLine2 0xDD21 -#define PTP_OPC_PostalAddressPersonalFullCity 0xDD22 -#define PTP_OPC_PostalAddressPersonalFullRegion 0xDD23 -#define PTP_OPC_PostalAddressPersonalFullPostalCode 0xDD24 -#define PTP_OPC_PostalAddressPersonalFullCountry 0xDD25 -#define PTP_OPC_PostalAddressBusinessFull 0xDD26 -#define PTP_OPC_PostalAddressBusinessLine1 0xDD27 -#define PTP_OPC_PostalAddressBusinessLine2 0xDD28 -#define PTP_OPC_PostalAddressBusinessCity 0xDD29 -#define PTP_OPC_PostalAddressBusinessRegion 0xDD2A -#define PTP_OPC_PostalAddressBusinessPostalCode 0xDD2B -#define PTP_OPC_PostalAddressBusinessCountry 0xDD2C -#define PTP_OPC_PostalAddressOtherFull 0xDD2D -#define PTP_OPC_PostalAddressOtherLine1 0xDD2E -#define PTP_OPC_PostalAddressOtherLine2 0xDD2F -#define PTP_OPC_PostalAddressOtherCity 0xDD30 -#define PTP_OPC_PostalAddressOtherRegion 0xDD31 -#define PTP_OPC_PostalAddressOtherPostalCode 0xDD32 -#define PTP_OPC_PostalAddressOtherCountry 0xDD33 -#define PTP_OPC_OrganizationName 0xDD34 -#define PTP_OPC_PhoneticOrganizationName 0xDD35 -#define PTP_OPC_Role 0xDD36 -#define PTP_OPC_Birthdate 0xDD37 -#define PTP_OPC_MessageTo 0xDD40 -#define PTP_OPC_MessageCC 0xDD41 -#define PTP_OPC_MessageBCC 0xDD42 -#define PTP_OPC_MessageRead 0xDD43 -#define PTP_OPC_MessageReceivedTime 0xDD44 -#define PTP_OPC_MessageSender 0xDD45 -#define PTP_OPC_ActivityBeginTime 0xDD50 -#define PTP_OPC_ActivityEndTime 0xDD51 -#define PTP_OPC_ActivityLocation 0xDD52 -#define PTP_OPC_ActivityRequiredAttendees 0xDD54 -#define PTP_OPC_ActivityOptionalAttendees 0xDD55 -#define PTP_OPC_ActivityResources 0xDD56 -#define PTP_OPC_ActivityAccepted 0xDD57 -#define PTP_OPC_Owner 0xDD5D -#define PTP_OPC_Editor 0xDD5E -#define PTP_OPC_Webmaster 0xDD5F -#define PTP_OPC_URLSource 0xDD60 -#define PTP_OPC_URLDestination 0xDD61 -#define PTP_OPC_TimeBookmark 0xDD62 -#define PTP_OPC_ObjectBookmark 0xDD63 -#define PTP_OPC_ByteBookmark 0xDD64 -#define PTP_OPC_LastBuildDate 0xDD70 -#define PTP_OPC_TimetoLive 0xDD71 -#define PTP_OPC_MediaGUID 0xDD72 -#define PTP_OPC_TotalBitRate 0xDE91 -#define PTP_OPC_BitRateType 0xDE92 -#define PTP_OPC_SampleRate 0xDE93 -#define PTP_OPC_NumberOfChannels 0xDE94 -#define PTP_OPC_AudioBitDepth 0xDE95 -#define PTP_OPC_ScanDepth 0xDE97 -#define PTP_OPC_AudioWAVECodec 0xDE99 -#define PTP_OPC_AudioBitRate 0xDE9A -#define PTP_OPC_VideoFourCCCodec 0xDE9B -#define PTP_OPC_VideoBitRate 0xDE9C -#define PTP_OPC_FramesPerThousandSeconds 0xDE9D -#define PTP_OPC_KeyFrameDistance 0xDE9E -#define PTP_OPC_BufferSize 0xDE9F -#define PTP_OPC_EncodingQuality 0xDEA0 -#define PTP_OPC_EncodingProfile 0xDEA1 -#define PTP_OPC_BuyFlag 0xD901 - -/* WiFi Provisioning MTP Extension property codes */ -#define PTP_OPC_WirelessConfigurationFile 0xB104 - - -/* PTP Association Types */ -#define PTP_AT_Undefined 0x0000 -#define PTP_AT_GenericFolder 0x0001 -#define PTP_AT_Album 0x0002 -#define PTP_AT_TimeSequence 0x0003 -#define PTP_AT_HorizontalPanoramic 0x0004 -#define PTP_AT_VerticalPanoramic 0x0005 -#define PTP_AT_2DPanoramic 0x0006 -#define PTP_AT_AncillaryData 0x0007 - -#define PTP_MAX_HANDLER_NBR 0x255 -typedef struct -{ - uint32_t n; - uint32_t Handler[PTP_MAX_HANDLER_NBR]; -} -PTP_ObjectHandlesTypedef; - - -#define PTP_oi_StorageID 0 -#define PTP_oi_ObjectFormat 4 -#define PTP_oi_ProtectionStatus 6 -#define PTP_oi_ObjectCompressedSize 8 -#define PTP_oi_ThumbFormat 12 -#define PTP_oi_ThumbCompressedSize 14 -#define PTP_oi_ThumbPixWidth 18 -#define PTP_oi_ThumbPixHeight 22 -#define PTP_oi_ImagePixWidth 26 -#define PTP_oi_ImagePixHeight 30 -#define PTP_oi_ImageBitDepth 34 -#define PTP_oi_ParentObject 38 -#define PTP_oi_AssociationType 42 -#define PTP_oi_AssociationDesc 44 -#define PTP_oi_SequenceNumber 48 -#define PTP_oi_filenamelen 52 -#define PTP_oi_Filename 53 - -typedef struct -{ - uint32_t StorageID; - uint16_t ObjectFormat; - uint16_t ProtectionStatus; - /* In the regular objectinfo this is 32bit, but we keep the general object size here - that also arrives via other methods and so use 64bit */ - uint64_t ObjectCompressedSize; - uint16_t ThumbFormat; - uint32_t ThumbCompressedSize; - uint32_t ThumbPixWidth; - uint32_t ThumbPixHeight; - uint32_t ImagePixWidth; - uint32_t ImagePixHeight; - uint32_t ImageBitDepth; - uint32_t ParentObject; - uint16_t AssociationType; - uint32_t AssociationDesc; - uint32_t SequenceNumber; - uint8_t Filename[PTP_MAX_STR_SIZE]; - uint32_t CaptureDate; - uint32_t ModificationDate; - uint8_t Keywords[PTP_MAX_STR_SIZE]; -} -PTP_ObjectInfoTypedef; - -/* Object Property Describing Dataset (DevicePropDesc) */ - -typedef union _PTP_PropertyValueTypedef -{ - char str[PTP_MAX_STR_SIZE]; - uint8_t u8; - int8_t i8; - uint16_t u16; - int16_t i16; - uint32_t u32; - int32_t i32; - uint64_t u64; - int64_t i64; - struct array { - uint32_t count; - union _PTP_PropertyValueTypedef *v; - }a; -}PTP_PropertyValueTypedef; - -typedef struct -{ - PTP_PropertyValueTypedef MinimumValue; - PTP_PropertyValueTypedef MaximumValue; - PTP_PropertyValueTypedef StepSize; -} -PTP_PropDescRangeFormTypedef; - -/* Property Describing Dataset, Enum Form */ - -typedef struct -{ - uint16_t NumberOfValues; - PTP_PropertyValueTypedef SupportedValue[PTP_SUPPORTED_PROPRIETIES_NBR]; -} -PTP_PropDescEnumFormTypedef; - -/* (MTP) Object Property pack/unpack */ -#define PTP_opd_ObjectPropertyCode 0 -#define PTP_opd_DataType 2 -#define PTP_opd_GetSet 4 -#define PTP_opd_FactoryDefaultValue 5 - -typedef struct -{ - uint16_t ObjectPropertyCode; - uint16_t DataType; - uint8_t GetSet; - PTP_PropertyValueTypedef FactoryDefaultValue; - uint32_t GroupCode; - uint8_t FormFlag; - union { - PTP_PropDescEnumFormTypedef Enum; - PTP_PropDescRangeFormTypedef Range; - } FORM; -} -PTP_ObjectPropDescTypeDef; - -/* Metadata lists for MTP operations */ -typedef struct -{ - uint16_t property; - uint16_t datatype; - uint32_t ObjectHandle; - PTP_PropertyValueTypedef propval; -} -MTP_PropertiesTypedef; - - -/* Device Property Form Flag */ - -#define PTP_DPFF_None 0x00 -#define PTP_DPFF_Range 0x01 -#define PTP_DPFF_Enumeration 0x02 - -/* Object Property Codes used by MTP (first 3 are same as DPFF codes) */ -#define PTP_OPFF_None 0x00 -#define PTP_OPFF_Range 0x01 -#define PTP_OPFF_Enumeration 0x02 -#define PTP_OPFF_DateTime 0x03 -#define PTP_OPFF_FixedLengthArray 0x04 -#define PTP_OPFF_RegularExpression 0x05 -#define PTP_OPFF_ByteArray 0x06 -#define PTP_OPFF_LongString 0xFF - -/* Device Property pack/unpack */ - -#define PTP_dpd_DevicePropertyCode 0 -#define PTP_dpd_DataType 2 -#define PTP_dpd_GetSet 4 -#define PTP_dpd_FactoryDefaultValue 5 - -/* Device Property Describing Dataset (DevicePropDesc) */ - -typedef struct -{ - uint16_t DevicePropertyCode; - uint16_t DataType; - uint8_t GetSet; - PTP_PropertyValueTypedef FactoryDefaultValue; - PTP_PropertyValueTypedef CurrentValue; - uint8_t FormFlag; - union { - PTP_PropDescEnumFormTypedef Enum; - PTP_PropDescRangeFormTypedef Range; - } FORM; -} -PTP_DevicePropDescTypdef; - -/* DataType Codes */ - -#define PTP_DTC_UNDEF 0x0000 -#define PTP_DTC_INT8 0x0001 -#define PTP_DTC_UINT8 0x0002 -#define PTP_DTC_INT16 0x0003 -#define PTP_DTC_UINT16 0x0004 -#define PTP_DTC_INT32 0x0005 -#define PTP_DTC_UINT32 0x0006 -#define PTP_DTC_INT64 0x0007 -#define PTP_DTC_UINT64 0x0008 -#define PTP_DTC_INT128 0x0009 -#define PTP_DTC_UINT128 0x000A - -#define PTP_DTC_ARRAY_MASK 0x4000 - -#define PTP_DTC_AINT8 (PTP_DTC_ARRAY_MASK | PTP_DTC_INT8) -#define PTP_DTC_AUINT8 (PTP_DTC_ARRAY_MASK | PTP_DTC_UINT8) -#define PTP_DTC_AINT16 (PTP_DTC_ARRAY_MASK | PTP_DTC_INT16) -#define PTP_DTC_AUINT16 (PTP_DTC_ARRAY_MASK | PTP_DTC_UINT16) -#define PTP_DTC_AINT32 (PTP_DTC_ARRAY_MASK | PTP_DTC_INT32) -#define PTP_DTC_AUINT32 (PTP_DTC_ARRAY_MASK | PTP_DTC_UINT32) -#define PTP_DTC_AINT64 (PTP_DTC_ARRAY_MASK | PTP_DTC_INT64) -#define PTP_DTC_AUINT64 (PTP_DTC_ARRAY_MASK | PTP_DTC_UINT64) -#define PTP_DTC_AINT128 (PTP_DTC_ARRAY_MASK | PTP_DTC_INT128) -#define PTP_DTC_AUINT128 (PTP_DTC_ARRAY_MASK | PTP_DTC_UINT128) - -#define PTP_DTC_STR 0xFFFF - -/* PTP Event Codes */ - -#define PTP_EC_Undefined 0x4000 -#define PTP_EC_CancelTransaction 0x4001 -#define PTP_EC_ObjectAdded 0x4002 -#define PTP_EC_ObjectRemoved 0x4003 -#define PTP_EC_StoreAdded 0x4004 -#define PTP_EC_StoreRemoved 0x4005 -#define PTP_EC_DevicePropChanged 0x4006 -#define PTP_EC_ObjectInfoChanged 0x4007 -#define PTP_EC_DeviceInfoChanged 0x4008 -#define PTP_EC_RequestObjectTransfer 0x4009 -#define PTP_EC_StoreFull 0x400A -#define PTP_EC_DeviceReset 0x400B -#define PTP_EC_StorageInfoChanged 0x400C -#define PTP_EC_CaptureComplete 0x400D -#define PTP_EC_UnreportedStatus 0x400E - - -/** - * @} - */ - -/** @defgroup USBH_MTP_PTP_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MTP_PTP_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MTP_PTP_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_PTP_Init(USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_PTP_Process (USBH_HandleTypeDef *phost); - -USBH_StatusTypeDef USBH_PTP_SendRequest (USBH_HandleTypeDef *phost, PTP_ContainerTypedef *req); -USBH_StatusTypeDef USBH_PTP_GetResponse (USBH_HandleTypeDef *phost, PTP_ContainerTypedef *req); - -USBH_StatusTypeDef USBH_PTP_OpenSession (USBH_HandleTypeDef *phost, uint32_t session); -USBH_StatusTypeDef USBH_PTP_GetDeviceInfo (USBH_HandleTypeDef *phost, PTP_DeviceInfoTypedef *dev_info); -USBH_StatusTypeDef USBH_PTP_GetStorageIds (USBH_HandleTypeDef *phost, PTP_StorageIDsTypedef *storage_ids); - -USBH_StatusTypeDef USBH_PTP_GetStorageInfo (USBH_HandleTypeDef *phost, - uint32_t storage_id, - PTP_StorageInfoTypedef *storage_info); - -USBH_StatusTypeDef USBH_PTP_GetNumObjects (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - uint32_t* numobs); - -USBH_StatusTypeDef USBH_PTP_GetObjectHandles (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - PTP_ObjectHandlesTypedef* objecthandles); - -USBH_StatusTypeDef USBH_PTP_GetObjectInfo (USBH_HandleTypeDef *phost, - uint32_t handle, - PTP_ObjectInfoTypedef* objectinfo); - -USBH_StatusTypeDef USBH_PTP_DeleteObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t objectformatcode); - -USBH_StatusTypeDef USBH_PTP_GetObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object); - -USBH_StatusTypeDef USBH_PTP_GetPartialObject(USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t offset, - uint32_t maxbytes, uint8_t *object, - uint32_t *len); - -USBH_StatusTypeDef USBH_PTP_GetObjectPropsSupported (USBH_HandleTypeDef *phost, - uint16_t ofc, - uint32_t *propnum, - uint16_t *props); - -USBH_StatusTypeDef USBH_PTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, - uint16_t opc, - uint16_t ofc, - PTP_ObjectPropDescTypeDef *opd); - -USBH_StatusTypeDef USBH_PTP_GetObjectPropList (USBH_HandleTypeDef *phost, - uint32_t handle, - MTP_PropertiesTypedef *pprops, - uint32_t *nrofprops); - -USBH_StatusTypeDef USBH_PTP_SendObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object, - uint32_t size); - -USBH_StatusTypeDef USBH_PTP_GetDevicePropDesc (USBH_HandleTypeDef *phost, - uint16_t propcode, - PTP_DevicePropDescTypdef* devicepropertydesc); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MTP_PTP_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp.c deleted file mode 100644 index b662afe..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp.c +++ /dev/null @@ -1,1083 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_mtp.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the MTP Layer Handlers for USB Host MTP class. - * - * @verbatim - * - * =================================================================== - * MTP Class Description - * =================================================================== - * This module manages the MTP class following the - * "Media Transfer Protocol (MTP) specification Version 1.11 April 6th, 2011". - * the implmentation is compatible with the PTP model as an extension - * of the existing Picture Transfer Protocol defined by the ISO 15740 specification - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_mtp.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_MTP_CLASS -* @{ -*/ - -/** @defgroup USBH_MTP_CORE -* @brief This file includes MTP Layer Handlers for USB Host MTP class. -* @{ -*/ - -/** @defgroup USBH_MTP_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_CORE_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_CORE_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_CORE_Private_FunctionPrototypes -* @{ -*/ - -static USBH_StatusTypeDef USBH_MTP_InterfaceInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MTP_InterfaceDeInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MTP_Process(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MTP_ClassRequest (USBH_HandleTypeDef *phost); - -static uint8_t MTP_FindCtlEndpoint(USBH_HandleTypeDef *phost); - -static uint8_t MTP_FindDataOutEndpoint(USBH_HandleTypeDef *phost); - -static uint8_t MTP_FindDataInEndpoint(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MTP_SOFProcess (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MTP_Events (USBH_HandleTypeDef *phost); - -static void MTP_DecodeEvent (USBH_HandleTypeDef *phost) ; - -USBH_ClassTypeDef MTP_Class = -{ - "MTP", - USB_MTP_CLASS, - USBH_MTP_InterfaceInit, - USBH_MTP_InterfaceDeInit, - USBH_MTP_ClassRequest, - USBH_MTP_Process, - USBH_MTP_SOFProcess, - NULL, -}; -/** -* @} -*/ - - -/** @defgroup USBH_MTP_CORE_Private_Functions -* @{ -*/ - -/** - * @brief USBH_MTP_InterfaceInit - * The function init the MTP class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MTP_InterfaceInit (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_OK ; - uint8_t interface, endpoint; - - MTP_HandleTypeDef *MTP_Handle; - - interface = USBH_FindInterface(phost, - USB_MTP_CLASS, - 1, - 1); - - if(interface == 0xFF) /* No Valid Interface */ - { - status = USBH_FAIL; - USBH_DbgLog ("Cannot Find the interface for Still Image Class."); - } - else - { - USBH_SelectInterface (phost, interface); - - endpoint = MTP_FindCtlEndpoint(phost); - - phost->pActiveClass->pData = (MTP_HandleTypeDef *)USBH_malloc (sizeof(MTP_HandleTypeDef)); - MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - if( MTP_Handle == NULL) - { - status = USBH_FAIL; - USBH_DbgLog ("Cannot allocate RAM for MTP Handle"); - } - - /*Collect the control endpoint address and length*/ - MTP_Handle->NotificationEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress; - MTP_Handle->NotificationEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize; - MTP_Handle->NotificationPipe = USBH_AllocPipe(phost, MTP_Handle->NotificationEp); - MTP_Handle->events.poll = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bInterval; - - /* Open pipe for Notification endpoint */ - USBH_OpenPipe (phost, - MTP_Handle->NotificationPipe, - MTP_Handle->NotificationEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_INTR, - MTP_Handle->NotificationEpSize); - - USBH_LL_SetToggle (phost, MTP_Handle->NotificationPipe, 0); - - - endpoint = MTP_FindDataInEndpoint(phost); - - /*Collect the control endpoint address and length*/ - MTP_Handle->DataInEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress; - MTP_Handle->DataInEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize; - MTP_Handle->DataInPipe = USBH_AllocPipe(phost, MTP_Handle->DataInEp); - - /* Open pipe for DATA IN endpoint */ - USBH_OpenPipe (phost, - MTP_Handle->DataInPipe, - MTP_Handle->DataInEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MTP_Handle->DataInEpSize); - - USBH_LL_SetToggle (phost, MTP_Handle->DataInPipe, 0); - - endpoint = MTP_FindDataOutEndpoint(phost); - - /*Collect the DATA OUT endpoint address and length*/ - MTP_Handle->DataOutEp = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress; - MTP_Handle->DataOutEpSize = phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize; - MTP_Handle->DataOutPipe = USBH_AllocPipe(phost, MTP_Handle->DataOutEp); - - /* Open pipe for DATA OUT endpoint */ - USBH_OpenPipe (phost, - MTP_Handle->DataOutPipe, - MTP_Handle->DataOutEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MTP_Handle->DataOutEpSize); - - USBH_LL_SetToggle (phost, MTP_Handle->DataOutPipe, 0); - - - MTP_Handle->state = MTP_OPENSESSION; - MTP_Handle->is_ready = 0; - MTP_Handle->events.state = MTP_EVENTS_INIT; - return USBH_PTP_Init(phost); - - } - return status; -} - -/** - * @brief Find MTP Ctl interface - * @param phost: Host handle - * @retval USBH Status - */ -static uint8_t MTP_FindCtlEndpoint(USBH_HandleTypeDef *phost) -{ - uint8_t interface, endpoint; - - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if(phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == USB_MTP_CLASS) - { - for (endpoint = 0; endpoint < USBH_MAX_NUM_ENDPOINTS ; endpoint ++ ) - { - if((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress & 0x80)&& - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize > 0)&& - ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bmAttributes & USBH_EP_INTERRUPT) == USBH_EP_INTERRUPT)) - { - return endpoint; - } - } - } - } - - return 0xFF; /* Invalid Endpoint */ -} - - -/** - * @brief Find MTP DATA OUT interface - * @param phost: Host handle - * @retval USBH Status - */ -static uint8_t MTP_FindDataOutEndpoint(USBH_HandleTypeDef *phost) -{ - uint8_t interface, endpoint; - - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if(phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == USB_MTP_CLASS) - { - for (endpoint = 0; endpoint < USBH_MAX_NUM_ENDPOINTS ; endpoint ++ ) - { - - if(((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress & 0x80) == 0)&& - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize > 0)&& - ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bmAttributes & USBH_EP_BULK) == USBH_EP_BULK)) - { - return endpoint; - } - } - } - } - - return 0xFF; /* Invalid Endpoint */ -} - -/** - * @brief Find MTP DATA IN interface - * @param phost: Host handle - * @retval USBH Status - */ -static uint8_t MTP_FindDataInEndpoint(USBH_HandleTypeDef *phost) -{ - uint8_t interface, endpoint; - - for (interface = 0; interface < USBH_MAX_NUM_INTERFACES ; interface ++ ) - { - if(phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass == USB_MTP_CLASS) - { - for (endpoint = 0; endpoint < USBH_MAX_NUM_ENDPOINTS ; endpoint ++ ) - { - - if((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bEndpointAddress & 0x80)&& - (phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].wMaxPacketSize > 0)&& - ((phost->device.CfgDesc.Itf_Desc[interface].Ep_Desc[endpoint].bmAttributes & USBH_EP_BULK) == USBH_EP_BULK)) - { - return endpoint; - } - } - } - } - - return 0xFF; /* Invalid Endpoint */ -} - - -/** - * @brief USBH_MTP_InterfaceDeInit - * The function DeInit the Pipes used for the MTP class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - if (MTP_Handle->DataOutPipe) - { - USBH_ClosePipe(phost, MTP_Handle->DataOutPipe); - USBH_FreePipe (phost, MTP_Handle->DataOutPipe); - MTP_Handle->DataOutPipe = 0; /* Reset the Channel as Free */ - } - - if (MTP_Handle->DataInPipe) - { - USBH_ClosePipe(phost, MTP_Handle->DataInPipe); - USBH_FreePipe (phost, MTP_Handle->DataInPipe); - MTP_Handle->DataInPipe = 0; /* Reset the Channel as Free */ - } - - if (MTP_Handle->NotificationPipe) - { - USBH_ClosePipe(phost, MTP_Handle->NotificationPipe); - USBH_FreePipe (phost, MTP_Handle->NotificationPipe); - MTP_Handle->NotificationPipe = 0; /* Reset the Channel as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - phost->pActiveClass->pData = 0; - } - return USBH_OK; -} - -/** - * @brief USBH_MTP_ClassRequest - * The function is responsible for handling Standard requests - * for MTP class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MTP_ClassRequest (USBH_HandleTypeDef *phost) -{ -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - return USBH_OK;; -} - - -/** - * @brief USBH_MTP_Process - * The function is for managing state machine for MTP data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MTP_Process (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t idx = 0; - - switch(MTP_Handle->state) - { - case MTP_OPENSESSION: - - status = USBH_PTP_OpenSession (phost, 1); /* Session '0' is not valid */ - - if(status == USBH_OK) - { - USBH_UsrLog("MTP Session #0 Opened"); - MTP_Handle->state = MTP_GETDEVICEINFO; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case MTP_GETDEVICEINFO: - status = USBH_PTP_GetDeviceInfo (phost, &(MTP_Handle->info.devinfo)); - - if(status == USBH_OK) - { - USBH_DbgLog(">>>>> MTP Device Information"); - USBH_DbgLog("Standard version : %x", MTP_Handle->info.devinfo.StandardVersion); - USBH_DbgLog("Vendor ExtID : %s", (MTP_Handle->info.devinfo.VendorExtensionID == 6)?"MTP": "NOT SUPPORTED"); - USBH_DbgLog("Functional mode : %s", (MTP_Handle->info.devinfo.FunctionalMode == 0) ? "Standard" : "Vendor"); - USBH_DbgLog("Number of Supported Operation(s) : %d", MTP_Handle->info.devinfo.OperationsSupported_len); - USBH_DbgLog("Number of Supported Events(s) : %d", MTP_Handle->info.devinfo.EventsSupported_len); - USBH_DbgLog("Number of Supported Proprieties : %d", MTP_Handle->info.devinfo.DevicePropertiesSupported_len); - USBH_DbgLog("Manufacturer : %s", MTP_Handle->info.devinfo.Manufacturer); - USBH_DbgLog("Model : %s", MTP_Handle->info.devinfo.Model); - USBH_DbgLog("Device version : %s", MTP_Handle->info.devinfo.DeviceVersion); - USBH_DbgLog("Serial number : %s", MTP_Handle->info.devinfo.SerialNumber); - - MTP_Handle->state = MTP_GETSTORAGEIDS; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case MTP_GETSTORAGEIDS: - status = USBH_PTP_GetStorageIds (phost, &(MTP_Handle->info.storids)); - - if(status == USBH_OK) - { - USBH_DbgLog("Number of storage ID items : %d", MTP_Handle->info.storids.n); - for (idx = 0; idx < MTP_Handle->info.storids.n; idx ++) - { - USBH_DbgLog("storage#%d ID : %x", idx, MTP_Handle->info.storids.Storage[idx]); - } - - MTP_Handle->current_storage_unit = 0; - MTP_Handle->state = MTP_GETSTORAGEINFO; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case MTP_GETSTORAGEINFO: - status = USBH_PTP_GetStorageInfo (phost, - MTP_Handle->info.storids.Storage[MTP_Handle->current_storage_unit], - &((MTP_Handle->info.storinfo)[MTP_Handle->current_storage_unit])); - - if(status == USBH_OK) - { - USBH_UsrLog("Volume#%lu: %s [%s]", MTP_Handle->current_storage_unit, - MTP_Handle->info.storinfo[MTP_Handle->current_storage_unit].StorageDescription, - MTP_Handle->info.storinfo[MTP_Handle->current_storage_unit].VolumeLabel); - if(++MTP_Handle->current_storage_unit >= MTP_Handle->info.storids.n) - { - MTP_Handle->state = MTP_IDLE; - MTP_Handle->is_ready = 1; - MTP_Handle->current_storage_unit = 0; - MTP_Handle->params.CurrentStorageId = MTP_Handle->info.storids.Storage[0]; - - USBH_UsrLog( "MTP Class initialized."); - USBH_UsrLog("%s is default storage unit", MTP_Handle->info.storinfo[0].StorageDescription); - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case MTP_IDLE: - USBH_MTP_Events(phost); -#if (USBH_USE_OS == 1) - osDelay(10); - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - default: - status = USBH_OK; - break; - } - return status; -} - -/** - * @brief USBH_MTP_SOFProcess - * The function is for managing SOF callback - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MTP_SOFProcess (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_OK; - - return status; -} - -/** - * @brief USBH_MTP_IsReady - * Select the storage Unit to be used - * @param phost: Host handle - * @retval USBH Status - */ -uint8_t USBH_MTP_IsReady (USBH_HandleTypeDef *phost) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - return (MTP_Handle->is_ready); -} - -/** - * @brief USBH_MTP_GetNumStorage - * Select the storage Unit to be used - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetNumStorage (USBH_HandleTypeDef *phost, uint8_t *storage_num) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - if(MTP_Handle->is_ready > 0) - { - *storage_num = MTP_Handle->info.storids.n; - status = USBH_OK; - } - - return status; -} - -/** - * @brief USBH_MTP_SelectStorage - * Select the storage Unit to be used - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_SelectStorage (USBH_HandleTypeDef *phost, uint8_t storage_idx) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - if((storage_idx < MTP_Handle->info.storids.n) && (MTP_Handle->is_ready)) - { - MTP_Handle->params.CurrentStorageId = MTP_Handle->info.storids.Storage[storage_idx]; - status = USBH_OK; - } - - return status; -} - -/** - * @brief USBH_MTP_GetStorageInfo - * Get the storage Unit info - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetStorageInfo (USBH_HandleTypeDef *phost, uint8_t storage_idx, MTP_StorageInfoTypedef *info) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - if((storage_idx < MTP_Handle->info.storids.n) && (MTP_Handle->is_ready)) - { - *info = MTP_Handle->info.storinfo[storage_idx]; - status = USBH_OK; - } - return status; -} - -/** - * @brief USBH_MTP_GetStorageInfo - * Get the storage Unit info - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetNumObjects (USBH_HandleTypeDef *phost, - uint32_t storage_idx, - uint32_t objectformatcode, - uint32_t associationOH, - uint32_t* numobs) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - if((storage_idx < MTP_Handle->info.storids.n) && (MTP_Handle->is_ready)) - { - while ((status = USBH_PTP_GetNumObjects (phost, - MTP_Handle->info.storids.Storage[storage_idx], - objectformatcode, - associationOH, - numobs)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - - -/** - * @brief USBH_MTP_GetStorageInfo - * Get the storage Unit info - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObjectHandles (USBH_HandleTypeDef *phost, - uint32_t storage_idx, - uint32_t objectformatcode, - uint32_t associationOH, - PTP_ObjectHandlesTypedef* objecthandles) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if((storage_idx < MTP_Handle->info.storids.n) && (MTP_Handle->is_ready)) - { - while ((status = USBH_PTP_GetObjectHandles (phost, - MTP_Handle->info.storids.Storage[storage_idx], - objectformatcode, - associationOH, - objecthandles)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectInfo - * Gets objert info - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObjectInfo (USBH_HandleTypeDef *phost, - uint32_t handle, - PTP_ObjectInfoTypedef* objectinfo) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetObjectInfo (phost, handle, objectinfo)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} -/** - * @brief USBH_MTP_DeleteObject - * Delete an object. - * @param phost: Host handle - * @param handle : Object Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_DeleteObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t objectformatcode) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_DeleteObject (phost, handle, objectformatcode)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_GetObject - * Gets object - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetObject (phost, handle, object)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_GetPartialObject - * Gets object - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetPartialObject(USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t offset, - uint32_t maxbytes, - uint8_t *object, - uint32_t *len) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetPartialObject(phost, - handle, - offset, - maxbytes, - object, - len)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_GetObjectPropsSupported - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObjectPropsSupported (USBH_HandleTypeDef *phost, - uint16_t ofc, - uint32_t *propnum, - uint16_t *props) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetObjectPropsSupported (phost, - ofc, - propnum, - props)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_GetObjectPropDesc - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, - uint16_t opc, - uint16_t ofc, - PTP_ObjectPropDescTypeDef *opd) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetObjectPropDesc (phost, - opc, - ofc, - opd)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_GetObjectPropList - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetObjectPropList (USBH_HandleTypeDef *phost, - uint32_t handle, - MTP_PropertiesTypedef *pprops, - uint32_t *nrofprops) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetObjectPropList (phost, - handle, - pprops, - nrofprops)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - -/** - * @brief USBH_MTP_SendObject - * Send an object - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_SendObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object, - uint32_t size) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_SendObject (phost, handle, object, size)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} - - /** - * @brief Handle HID Control process - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MTP_Events (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY ; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - - switch(MTP_Handle->events.state) - { - case MTP_EVENTS_INIT: - if((phost->Timer & 1) == 0) - { - MTP_Handle->events.timer = phost->Timer; - USBH_InterruptReceiveData(phost, - (uint8_t *)&(MTP_Handle->events.container), - MTP_Handle->NotificationEpSize, - MTP_Handle->NotificationPipe); - - - MTP_Handle->events.state = MTP_EVENTS_GETDATA ; - } - break; - case MTP_EVENTS_GETDATA: - if(USBH_LL_GetURBState(phost , MTP_Handle->NotificationPipe) == USBH_URB_DONE) - { - MTP_DecodeEvent(phost); - } - - if(( phost->Timer - MTP_Handle->events.timer) >= MTP_Handle->events.poll) - { - MTP_Handle->events.timer = phost->Timer; - - USBH_InterruptReceiveData(phost, - (uint8_t *)&(MTP_Handle->events.container), - MTP_Handle->NotificationEpSize, - MTP_Handle->NotificationPipe); - - } - break; - - default: - break; - } - - return status; -} - -/** - * @brief MTP_DecodeEvent - * Decode device event sent by responder - * @param phost: Host handle - * @retval None - */ -static void MTP_DecodeEvent (USBH_HandleTypeDef *phost) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - uint16_t code; - uint32_t param1; - - /* Process the event */ - code = MTP_Handle->events.container.code; - param1 = MTP_Handle->events.container.param1; - - switch(code) - { - case PTP_EC_Undefined: - USBH_DbgLog("EVT: PTP_EC_Undefined in session %u", MTP_Handle->ptp.session_id); - break; - case PTP_EC_CancelTransaction: - USBH_DbgLog("EVT: PTP_EC_CancelTransaction in session %u", MTP_Handle->ptp.session_id); - break; - case PTP_EC_ObjectAdded: - USBH_DbgLog("EVT: PTP_EC_ObjectAdded in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_ObjectRemoved: - USBH_DbgLog("EVT: PTP_EC_ObjectRemoved in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_StoreAdded: - USBH_DbgLog("EVT: PTP_EC_StoreAdded in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_StoreRemoved: - USBH_DbgLog("EVT: PTP_EC_StoreRemoved in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_DevicePropChanged: - USBH_DbgLog("EVT: PTP_EC_DevicePropChanged in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_ObjectInfoChanged: - USBH_DbgLog("EVT: PTP_EC_ObjectInfoChanged in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_DeviceInfoChanged: - USBH_DbgLog("EVT: PTP_EC_DeviceInfoChanged in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_RequestObjectTransfer: - USBH_DbgLog("EVT: PTP_EC_RequestObjectTransfer in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_StoreFull: - USBH_DbgLog("EVT: PTP_EC_StoreFull in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_DeviceReset: - USBH_DbgLog("EVT: PTP_EC_DeviceReset in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_StorageInfoChanged : - USBH_DbgLog( "EVT: PTP_EC_StorageInfoChanged in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_CaptureComplete : - USBH_DbgLog( "EVT: PTP_EC_CaptureComplete in session %u", MTP_Handle->ptp.session_id); - break; - - case PTP_EC_UnreportedStatus : - USBH_DbgLog( "EVT: PTP_EC_UnreportedStatus in session %u", MTP_Handle->ptp.session_id); - break; - - default : - USBH_DbgLog( "Received unknown event in session %u", MTP_Handle->ptp.session_id); - break; - } - - USBH_MTP_EventsCallback(phost, code, param1); -} - -/** - * @brief USBH_MTP_GetDevicePropDesc - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MTP_GetDevicePropDesc (USBH_HandleTypeDef *phost, - uint16_t propcode, - PTP_DevicePropDescTypdef* devicepropertydesc) - -{ - USBH_StatusTypeDef status = USBH_FAIL; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint32_t timeout = phost->Timer; - - if(MTP_Handle->is_ready) - { - while ((status = USBH_PTP_GetDevicePropDesc (phost, propcode, devicepropertydesc)) == USBH_BUSY) - { - if(((phost->Timer - timeout) > 5000) || (phost->device.is_connected == 0)) - { - return USBH_FAIL; - } - } - } - return status; -} -/** - * @brief The function informs that host has received an event - * @param pdev: Selected device - * @retval None - */ -__weak void USBH_MTP_EventsCallback(USBH_HandleTypeDef *phost, uint32_t event, uint32_t param) -{ - -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp_ptp.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp_ptp.c deleted file mode 100644 index 1352a32..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/MTP/Src/usbh_mtp_ptp.c +++ /dev/null @@ -1,1814 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_mtp_ptp.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file includes the PTP operations layer - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_mtp_ptp.h" -#include "usbh_mtp.h" -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_MTP_CLASS -* @{ -*/ - -/** @defgroup USBH_MTP_PTP -* @brief This file includes the mass storage related functions -* @{ -*/ - - -/** @defgroup USBH_MTP_PTP_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MTP_PTP_Private_Defines -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MTP_PTP_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_PTP_Private_Variables -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBH_MTP_PTP_Private_FunctionPrototypes -* @{ -*/ -static void PTP_DecodeDeviceInfo (USBH_HandleTypeDef *phost, PTP_DeviceInfoTypedef *dev_info); -static void PTP_GetStorageIDs (USBH_HandleTypeDef *phost, PTP_StorageIDsTypedef *stor_ids); -static void PTP_GetStorageInfo (USBH_HandleTypeDef *phost, uint32_t storage_id, PTP_StorageInfoTypedef *stor_info); -static void PTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, PTP_ObjectPropDescTypeDef *opd, uint32_t opdlen); -static void PTP_DecodeDeviceInfo (USBH_HandleTypeDef *phost, PTP_DeviceInfoTypedef *dev_info); -static void PTP_GetDevicePropValue(USBH_HandleTypeDef *phost, - uint32_t *offset, - uint32_t total, - PTP_PropertyValueTypedef* value, - uint16_t datatype); - -static uint32_t PTP_GetObjectPropList (USBH_HandleTypeDef *phost, - MTP_PropertiesTypedef *props, - uint32_t len); - - -static void PTP_BufferFullCallback(USBH_HandleTypeDef *phost); -static void PTP_GetString(uint8_t *str, uint8_t* data, uint16_t *len); -static uint32_t PTP_GetArray16 (uint16_t *array, uint8_t *data, uint32_t offset); -static uint32_t PTP_GetArray32 (uint32_t *array, uint8_t *data, uint32_t offset); -/** -* @} -*/ - - -/** @defgroup USBH_MTP_PTP_Exported_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MTP_PTP_Private_Functions -* @{ -*/ -/** - * @brief USBH_PTP_Init - * The function Initializes the BOT protocol. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_Init(USBH_HandleTypeDef *phost) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - /* Set state to idle to be ready for operations */ - MTP_Handle->ptp.state = PTP_IDLE; - MTP_Handle->ptp.req_state = PTP_REQ_SEND; - - return USBH_OK; -} - -/** - * @brief USBH_PTP_Process - * The function handle the BOT protocol. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_Process (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef status = USBH_BUSY; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - uint32_t len; - - switch (MTP_Handle->ptp.state) - { - case PTP_IDLE: - /*Do Nothing */ - break; - - case PTP_OP_REQUEST_STATE: - USBH_BulkSendData (phost, - (uint8_t*)&(MTP_Handle->ptp.op_container), - MTP_Handle->ptp.op_container.length, - MTP_Handle->DataOutPipe, - 1); - MTP_Handle->ptp.state = PTP_OP_REQUEST_WAIT_STATE; - break; - - case PTP_OP_REQUEST_WAIT_STATE: - URB_Status = USBH_LL_GetURBState(phost, MTP_Handle->DataOutPipe); - - if(URB_Status == USBH_URB_DONE) - { - if(MTP_Handle->ptp.flags == PTP_DP_NODATA) - { - MTP_Handle->ptp.state = PTP_RESPONSE_STATE; - } - else if(MTP_Handle->ptp.flags == PTP_DP_SENDDATA) - { - MTP_Handle->ptp.state = PTP_DATA_OUT_PHASE_STATE; - } - else if(MTP_Handle->ptp.flags == PTP_DP_GETDATA) - { - MTP_Handle->ptp.state = PTP_DATA_IN_PHASE_STATE; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Resend Request */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - MTP_Handle->ptp.state = PTP_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case PTP_DATA_OUT_PHASE_STATE: - - USBH_BulkSendData (phost, - MTP_Handle->ptp.data_ptr, - MTP_Handle->DataOutEpSize , - MTP_Handle->DataOutPipe, - 1); - - - MTP_Handle->ptp.state = PTP_DATA_OUT_PHASE_WAIT_STATE; - break; - - case PTP_DATA_OUT_PHASE_WAIT_STATE: - URB_Status = USBH_LL_GetURBState(phost, MTP_Handle->DataOutPipe); - - if(URB_Status == USBH_URB_DONE) - { - /* Adjust Data pointer and data length */ - if(MTP_Handle->ptp.data_length > MTP_Handle->DataOutEpSize) - { - MTP_Handle->ptp.data_ptr += MTP_Handle->DataOutEpSize; - MTP_Handle->ptp.data_length -= MTP_Handle->DataOutEpSize; - MTP_Handle->ptp.data_packet += MTP_Handle->DataOutEpSize; - - if(MTP_Handle->ptp.data_packet >= PTP_USB_BULK_PAYLOAD_LEN_READ) - { - PTP_BufferFullCallback (phost); - MTP_Handle->ptp.data_packet = 0; - MTP_Handle->ptp.iteration++; - } - - } - else - { - MTP_Handle->ptp.data_length = 0; - } - - /* More Data To be Sent */ - if(MTP_Handle->ptp.data_length > 0) - { - USBH_BulkSendData (phost, - MTP_Handle->ptp.data_ptr, - MTP_Handle->DataOutEpSize , - MTP_Handle->DataOutPipe, - 1); - } - else - { - /* If value was 0, and successful transfer, then change the state */ - MTP_Handle->ptp.state = PTP_RESPONSE_STATE; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Resend same data */ - MTP_Handle->ptp.state = PTP_DATA_OUT_PHASE_STATE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_STALL) - { - MTP_Handle->ptp.state = PTP_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case PTP_DATA_IN_PHASE_STATE: - /* Send first packet */ - USBH_BulkReceiveData (phost, - MTP_Handle->ptp.data_ptr, - MTP_Handle->DataInEpSize, - MTP_Handle->DataInPipe); - - MTP_Handle->ptp.state = PTP_DATA_IN_PHASE_WAIT_STATE; - break; - - case PTP_DATA_IN_PHASE_WAIT_STATE: - URB_Status = USBH_LL_GetURBState(phost, MTP_Handle->DataInPipe); - - if(URB_Status == USBH_URB_DONE) - { - len = USBH_LL_GetLastXferSize (phost, MTP_Handle->DataInPipe); - - if( MTP_Handle->ptp.data_packet_counter++ == 0) - { - /* This is the first packet; so retrieve exact data length from payload */ - MTP_Handle->ptp.data_length = *(uint32_t*)(MTP_Handle->ptp.data_ptr); - MTP_Handle->ptp.iteration = 0; - } - - if((len >= MTP_Handle->DataInEpSize) && (MTP_Handle->ptp.data_length > 0)) - { - MTP_Handle->ptp.data_ptr += len; - MTP_Handle->ptp.data_length -= len; - MTP_Handle->ptp.data_packet += len; - - if(MTP_Handle->ptp.data_packet >= PTP_USB_BULK_PAYLOAD_LEN_READ) - { - PTP_BufferFullCallback (phost); - MTP_Handle->ptp.data_packet = 0; - MTP_Handle->ptp.iteration++; - } - - /* Continue receiving data*/ - USBH_BulkReceiveData (phost, - MTP_Handle->ptp.data_ptr, - MTP_Handle->DataInEpSize, - MTP_Handle->DataInPipe); - } - else - { - MTP_Handle->ptp.data_length -= len; - MTP_Handle->ptp.state = PTP_RESPONSE_STATE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - } - else if(URB_Status == USBH_URB_STALL) - { - MTP_Handle->ptp.state = PTP_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case PTP_RESPONSE_STATE: - - USBH_BulkReceiveData (phost, - (uint8_t*)&(MTP_Handle->ptp.resp_container), - PTP_USB_BULK_REQ_RESP_MAX_LEN , - MTP_Handle->DataInPipe); - - MTP_Handle->ptp.state = PTP_RESPONSE_WAIT_STATE; - break; - - case PTP_RESPONSE_WAIT_STATE: - URB_Status = USBH_LL_GetURBState(phost, MTP_Handle->DataInPipe); - - if(URB_Status == USBH_URB_DONE) - { - USBH_PTP_GetResponse (phost, &ptp_container); - - if(ptp_container.Code == PTP_RC_OK) - { - status = USBH_OK; - } - else - { - status = USBH_FAIL; - } - MTP_Handle->ptp.req_state = PTP_REQ_SEND; - } - else if(URB_Status == USBH_URB_STALL) - { - MTP_Handle->ptp.state = PTP_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case PTP_ERROR: - MTP_Handle->ptp.req_state = PTP_REQ_SEND; - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_OpenSession - * Open a new session - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_SendRequest (USBH_HandleTypeDef *phost, PTP_ContainerTypedef *req) -{ - USBH_StatusTypeDef status = USBH_OK; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - /* Clear PTP Data container*/ - USBH_memset(&(MTP_Handle->ptp.op_container), 0, sizeof(PTP_OpContainerTypedef)); - - /* build appropriate USB container */ - MTP_Handle->ptp.op_container.length = PTP_USB_BULK_REQ_LEN- (sizeof(uint32_t)*(5-req->Nparam)); - MTP_Handle->ptp.op_container.type = PTP_USB_CONTAINER_COMMAND; - MTP_Handle->ptp.op_container.code = req->Code; - MTP_Handle->ptp.op_container.trans_id = req->Transaction_ID; - MTP_Handle->ptp.op_container.param1 = req->Param1; - MTP_Handle->ptp.op_container.param2 = req->Param2; - MTP_Handle->ptp.op_container.param3 = req->Param3; - MTP_Handle->ptp.op_container.param4 = req->Param4; - MTP_Handle->ptp.op_container.param5 = req->Param5; - - return status; -} - -/** - * @brief USBH_PTP_OpenSession - * Open a new session - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetResponse (USBH_HandleTypeDef *phost, PTP_ContainerTypedef *resp) -{ - USBH_StatusTypeDef status = USBH_OK; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - /* build an appropriate PTPContainer */ - resp->Code = MTP_Handle->ptp.resp_container.code; - resp->SessionID = MTP_Handle->ptp.session_id; - resp->Transaction_ID = MTP_Handle->ptp.resp_container.trans_id; - resp->Param1 = MTP_Handle->ptp.resp_container.param1; - resp->Param2 = MTP_Handle->ptp.resp_container.param2; - resp->Param3 = MTP_Handle->ptp.resp_container.param3; - resp->Param4 = MTP_Handle->ptp.resp_container.param4; - resp->Param5 = MTP_Handle->ptp.resp_container.param5; - - return status; -} - -/** - * @brief The function informs user that data buffer is full - * @param phost: host handle - * @retval None - */ -void PTP_BufferFullCallback(USBH_HandleTypeDef *phost) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - - switch (MTP_Handle->ptp.data_container.code) - { - case PTP_OC_GetDeviceInfo: - PTP_DecodeDeviceInfo (phost, &(MTP_Handle->info.devinfo)); - break; - - case PTP_OC_GetPartialObject: - case PTP_OC_GetObject: - - /* first packet is in the PTP data payload buffer */ - if(MTP_Handle->ptp.iteration == 0) - { - /* copy it to object */ - USBH_memcpy(MTP_Handle->ptp.object_ptr, MTP_Handle->ptp.data_container.payload.data, PTP_USB_BULK_PAYLOAD_LEN_READ); - - /* next packet should be directly copied to object */ - MTP_Handle->ptp.data_ptr = (MTP_Handle->ptp.object_ptr + PTP_USB_BULK_PAYLOAD_LEN_READ); - } - break; - - case PTP_OC_SendObject: - /* first packet is in the PTP data payload buffer */ - if(MTP_Handle->ptp.iteration == 0) - { - /* next packet should be directly copied to object */ - MTP_Handle->ptp.data_ptr = (MTP_Handle->ptp.object_ptr + PTP_USB_BULK_PAYLOAD_LEN_READ); - } - break; - - default: - break; - - - } -} - -/** - * @brief PTP_GetDeviceInfo - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval None - */ -static void PTP_DecodeDeviceInfo (USBH_HandleTypeDef *phost, PTP_DeviceInfoTypedef *dev_info) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - uint32_t totallen; - uint16_t len; - - /* Max device info is PTP_USB_BULK_HS_MAX_PACKET_LEN_READ */ - USBH_DbgLog (" MTP device info size exceeds internal buffer size.\ - only available data are decoded."); - - if(MTP_Handle->ptp.iteration == 0) - { - dev_info->StandardVersion = LE16(&data[PTP_di_StandardVersion]); - dev_info->VendorExtensionID = LE32(&data[PTP_di_VendorExtensionID]); - dev_info->VendorExtensionVersion = LE16(&data[PTP_di_VendorExtensionVersion]); - PTP_GetString(dev_info->VendorExtensionDesc, &data[PTP_di_VendorExtensionDesc], &len); - - totallen=len*2+1; - dev_info->FunctionalMode = LE16(&data[PTP_di_FunctionalMode+totallen]); - dev_info->OperationsSupported_len = PTP_GetArray16 ((uint16_t *)&dev_info->OperationsSupported, - data, - PTP_di_OperationsSupported+totallen); - - totallen=totallen+dev_info->OperationsSupported_len*sizeof(uint16_t)+sizeof(uint32_t); - dev_info->EventsSupported_len = PTP_GetArray16 ((uint16_t *)&dev_info->EventsSupported, - data, - PTP_di_OperationsSupported+totallen); - - totallen=totallen+dev_info->EventsSupported_len*sizeof(uint16_t)+sizeof(uint32_t); - dev_info->DevicePropertiesSupported_len = PTP_GetArray16 ((uint16_t *)&dev_info->DevicePropertiesSupported, - data, - PTP_di_OperationsSupported+totallen); - - totallen=totallen+dev_info->DevicePropertiesSupported_len*sizeof(uint16_t)+sizeof(uint32_t); - - dev_info->CaptureFormats_len = PTP_GetArray16 ((uint16_t *)&dev_info->CaptureFormats, - data, - PTP_di_OperationsSupported+totallen); - - totallen=totallen+dev_info->CaptureFormats_len*sizeof(uint16_t)+sizeof(uint32_t); - dev_info->ImageFormats_len = PTP_GetArray16 ((uint16_t *)&dev_info->ImageFormats, - data, - PTP_di_OperationsSupported+totallen); - - totallen=totallen+dev_info->ImageFormats_len*sizeof(uint16_t)+sizeof(uint32_t); - PTP_GetString(dev_info->Manufacturer, &data[PTP_di_OperationsSupported+totallen], &len); - - totallen+=len*2+1; - PTP_GetString(dev_info->Model, &data[PTP_di_OperationsSupported+totallen], &len); - - totallen+=len*2+1; - PTP_GetString(dev_info->DeviceVersion, &data[PTP_di_OperationsSupported+totallen], &len); - - totallen+=len*2+1; - PTP_GetString(dev_info->SerialNumber, &data[PTP_di_OperationsSupported+totallen], &len); - } -} - -/** - * @brief PTP_GetStorageIDs - * Gets Storage Ids and fills stor_ids structure. - * @param phost: Host handle - * @param stor_ids: Storage IDsstructure - * @retval None - */ -static void PTP_GetStorageIDs (USBH_HandleTypeDef *phost, PTP_StorageIDsTypedef *stor_ids) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - - stor_ids->n = PTP_GetArray32 (stor_ids->Storage, data, 0); -} - - -/** - * @brief PTP_GetStorageInfo - * Gets Storage Info and fills stor_info structure. - * @param phost: Host handle - * @param stor_ids: Storage IDsstructure - * @retval None - */ -static void PTP_GetStorageInfo (USBH_HandleTypeDef *phost, uint32_t storage_id, PTP_StorageInfoTypedef *stor_info) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - - uint16_t len; - - stor_info->StorageType=LE16(&data[PTP_si_StorageType]); - stor_info->FilesystemType=LE16(&data[PTP_si_FilesystemType]); - stor_info->AccessCapability=LE16(&data[PTP_si_AccessCapability]); - stor_info->MaxCapability=LE64(&data[PTP_si_MaxCapability]); - stor_info->FreeSpaceInBytes=LE64(&data[PTP_si_FreeSpaceInBytes]); - stor_info->FreeSpaceInImages=LE32(&data[PTP_si_FreeSpaceInImages]); - - PTP_GetString(stor_info->StorageDescription, &data[PTP_si_StorageDescription], &len); - PTP_GetString(stor_info->VolumeLabel, &data[PTP_si_StorageDescription+len*2+1], &len); -} - -/** - * @brief PTP_GetObjectInfo - * Gets objectInfo and fills object_info structure. - * @param phost: Host handle - * @param object_info: object info structure - * @retval None - */ -static void PTP_GetObjectInfo (USBH_HandleTypeDef *phost, PTP_ObjectInfoTypedef *object_info) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - uint16_t filenamelen; - - object_info->StorageID=LE32(&data[PTP_oi_StorageID]); - object_info->ObjectFormat=LE16(&data[PTP_oi_ObjectFormat]); - object_info->ProtectionStatus=LE16(&data[PTP_oi_ProtectionStatus]); - object_info->ObjectCompressedSize=LE32(&data[PTP_oi_ObjectCompressedSize]); - - /* For Samsung Galaxy */ - if ((data[PTP_oi_filenamelen] == 0) && (data[PTP_oi_filenamelen+4] != 0)) - { - data += 4; - } - object_info->ThumbFormat=LE16(&data[PTP_oi_ThumbFormat]); - object_info->ThumbCompressedSize=LE32(&data[PTP_oi_ThumbCompressedSize]); - object_info->ThumbPixWidth=LE32(&data[PTP_oi_ThumbPixWidth]); - object_info->ThumbPixHeight=LE32(&data[PTP_oi_ThumbPixHeight]); - object_info->ImagePixWidth=LE32(&data[PTP_oi_ImagePixWidth]); - object_info->ImagePixHeight=LE32(&data[PTP_oi_ImagePixHeight]); - object_info->ImageBitDepth=LE32(&data[PTP_oi_ImageBitDepth]); - object_info->ParentObject=LE32(&data[PTP_oi_ParentObject]); - object_info->AssociationType=LE16(&data[PTP_oi_AssociationType]); - object_info->AssociationDesc=LE32(&data[PTP_oi_AssociationDesc]); - object_info->SequenceNumber=LE32(&data[PTP_oi_SequenceNumber]); - PTP_GetString(object_info->Filename, &data[PTP_oi_filenamelen], &filenamelen); -} - - -/** - * @brief PTP_GetObjectPropDesc - * Gets objectInfo and fills object_info structure. - * @param phost: Host handle - * @param opd: object prop descriptor structure - * @retval None - */ -static void PTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, PTP_ObjectPropDescTypeDef *opd, uint32_t opdlen) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - uint32_t offset = 0, i; - - opd->ObjectPropertyCode=LE16(&data[PTP_opd_ObjectPropertyCode]); - opd->DataType=LE16(&data[PTP_opd_DataType]); - opd->GetSet=*(uint8_t *)(&data[PTP_opd_GetSet]); - - offset = PTP_opd_FactoryDefaultValue; - PTP_GetDevicePropValue (phost, &offset, opdlen, &opd->FactoryDefaultValue, opd->DataType); - - opd->GroupCode=LE32(&data[offset]); - offset+=sizeof(uint32_t); - - opd->FormFlag=*(uint8_t *)(&data[offset]); - offset+=sizeof(uint8_t); - - switch (opd->FormFlag) - { - case PTP_OPFF_Range: - PTP_GetDevicePropValue(phost, &offset, opdlen, &opd->FORM.Range.MinimumValue, opd->DataType); - PTP_GetDevicePropValue(phost, &offset, opdlen, &opd->FORM.Range.MaximumValue, opd->DataType); - PTP_GetDevicePropValue(phost, &offset, opdlen, &opd->FORM.Range.StepSize, opd->DataType); - break; - - case PTP_OPFF_Enumeration: - - opd->FORM.Enum.NumberOfValues = LE16(&data[offset]); - offset+=sizeof(uint16_t); - - for (i=0 ; i < opd->FORM.Enum.NumberOfValues ; i++) - { - PTP_GetDevicePropValue(phost, &offset, opdlen, &opd->FORM.Enum.SupportedValue[i], opd->DataType); - } - break; - default: - break; - } -} - -/** - * @brief PTP_GetDevicePropValue - * Gets objectInfo and fills object_info structure. - * @param phost: Host handle - * @param opd: object prop descriptor structure - * @retval None - */ -static void PTP_GetDevicePropValue(USBH_HandleTypeDef *phost, - uint32_t *offset, - uint32_t total, - PTP_PropertyValueTypedef* value, - uint16_t datatype) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - uint16_t len; - switch (datatype) - { - case PTP_DTC_INT8: - value->i8 = *(uint8_t *)&(data[*offset]); - *offset += 1; - break; - case PTP_DTC_UINT8: - value->u8 = *(uint8_t *)&(data[*offset]); - *offset += 1; - break; - case PTP_DTC_INT16: - - value->i16 = LE16(&(data[*offset])); - *offset += 2; - break; - case PTP_DTC_UINT16: - value->u16 = LE16(&(data[*offset])); - *offset += 2; - break; - case PTP_DTC_INT32: - value->i32 = LE32(&(data[*offset])); - *offset += 4; - break; - case PTP_DTC_UINT32: - value->u32 = LE32(&(data[*offset])); - *offset += 4; - break; - case PTP_DTC_INT64: - value->i64 = LE64(&(data[*offset])); - *offset += 8; - break; - case PTP_DTC_UINT64: - value->u64 = LE64(&(data[*offset])); - *offset += 8; - break; - - case PTP_DTC_UINT128: - *offset += 16; - break; - case PTP_DTC_INT128: - *offset += 16; - break; - - case PTP_DTC_STR: - - PTP_GetString((uint8_t *)value->str, (uint8_t *)&(data[*offset]), &len); - *offset += len*2+1; - break; - default: - break; - } -} - - -/** - * @brief PTP_GetDevicePropValue - * Gets objectInfo and fills object_info structure. - * @param phost: Host handle - * @param opd: object prop descriptor structure - * @retval None - */ -static uint32_t PTP_GetObjectPropList (USBH_HandleTypeDef *phost, - MTP_PropertiesTypedef *props, - uint32_t len) -{ - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - uint32_t prop_count; - uint32_t offset = 0, i; - - prop_count = LE32(data); - - - if (prop_count == 0) - { - return 0; - } - - data += sizeof(uint32_t); - len -= sizeof(uint32_t); - - for (i = 0; i < prop_count; i++) - { - if (len <= 0) - { - return 0; - } - - props[i].ObjectHandle = LE32(data); - data += sizeof(uint32_t); - len -= sizeof(uint32_t); - - props[i].property = LE16(data); - data += sizeof(uint16_t); - len -= sizeof(uint16_t); - - props[i].datatype = LE16(data); - data += sizeof(uint16_t); - len -= sizeof(uint16_t); - - offset = 0; - - PTP_GetDevicePropValue(phost, &offset, len, &props[i].propval, props[i].datatype); - - data += offset; - len -= offset; - } - - return prop_count; -} - -/** - * @brief PTP_GetString - * Gets SCII String from. - * @param str: ascii string - * @param data: Device info structure - * @retval None - */ -static void PTP_GetString (uint8_t *str, uint8_t* data, uint16_t *len) -{ - uint16_t strlength; - uint16_t idx; - - *len = data[0]; - strlength = 2 * data[0]; - data ++; /* Adjust the offset ignoring the String Len */ - - for (idx = 0; idx < strlength; idx+=2 ) - { - /* Copy Only the string and ignore the UNICODE ID, hence add the src */ - *str = data[idx]; - str++; - } - *str = 0; /* mark end of string */ -} - -/** - * @brief PTP_GetString - * Gets SCII String from. - * @param str: ascii string - * @param data: Device info structure - * @retval None - */ - -static uint32_t PTP_GetArray16 (uint16_t *array, uint8_t *data, uint32_t offset) -{ - uint32_t size, idx = 0; - - size=LE32(&data[offset]); - while (size > idx) - { - array[idx] = LE16(&data[offset+(sizeof(uint16_t)*(idx+2))]); - idx++; - } - return size; -} - -/** - * @brief PTP_GetString - * Gets SCII String from. - * @param str: ascii string - * @param data: Device info structure - * @retval None - */ - -static uint32_t PTP_GetArray32 (uint32_t *array, uint8_t *data, uint32_t offset) -{ - uint32_t size, idx = 0; - - size=LE32(&data[offset]); - while (size > idx) - { - array[idx] = LE32(&data[offset+(sizeof(uint32_t)*(idx+1))]); - idx++; - } - return size; -} - -/******************************************************************************* - - PTP Requests - -*******************************************************************************/ -/** - * @brief USBH_PTP_OpenSession - * Open a new session - * @param phost: Host handle - * @param session: Session ID (MUST BE > 0) - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_OpenSession (USBH_HandleTypeDef *phost, uint32_t session) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Init session params */ - MTP_Handle->ptp.transaction_id = 0x00000000; - MTP_Handle->ptp.session_id = session; - MTP_Handle->ptp.flags = PTP_DP_NODATA; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_OpenSession; - ptp_container.SessionID = session; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = session; - ptp_container.Nparam = 1; - - /* convert request packet inti USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetDevicePropDesc - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetDevicePropDesc (USBH_HandleTypeDef *phost, - uint16_t propcode, - PTP_DevicePropDescTypdef* devicepropertydesc) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - uint8_t *data = MTP_Handle->ptp.data_container.payload.data; - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetDevicePropDesc; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = propcode; - ptp_container.Nparam = 1; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - devicepropertydesc->DevicePropertyCode = LE16(&data[PTP_dpd_DevicePropertyCode]); - devicepropertydesc->DataType = LE16(&data[PTP_dpd_DataType]); - devicepropertydesc->GetSet = *(uint8_t *)(&data[PTP_dpd_GetSet]); - devicepropertydesc->FormFlag = PTP_DPFF_None; - } - break; - - default: - break; - } - return status; -} -/** - * @brief USBH_PTP_GetDeviceInfo - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetDeviceInfo (USBH_HandleTypeDef *phost, PTP_DeviceInfoTypedef *dev_info) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetDeviceInfo; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Nparam = 0; - - /* convert request packet inti USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_DecodeDeviceInfo (phost, dev_info); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetStorageIds - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetStorageIds (USBH_HandleTypeDef *phost, PTP_StorageIDsTypedef *storage_ids) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetStorageIDs; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Nparam = 0; - - /* convert request packet inti USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_GetStorageIDs (phost, storage_ids); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetDeviceInfo - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetStorageInfo (USBH_HandleTypeDef *phost, uint32_t storage_id, PTP_StorageInfoTypedef *storage_info) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetStorageInfo; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = storage_id; - ptp_container.Nparam = 1; - - /* convert request packet inti USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_GetStorageInfo (phost, storage_id, storage_info); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetNumObjects - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetNumObjects (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - uint32_t* numobs) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_NODATA; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetNumObjects; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = storage_id; - ptp_container.Param2 = objectformatcode; - ptp_container.Param3 = associationOH; - ptp_container.Nparam = 3; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - *numobs = MTP_Handle->ptp.resp_container.param1; - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectHandles - * Gets device info dataset and fills deviceinfo structure. - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObjectHandles (USBH_HandleTypeDef *phost, - uint32_t storage_id, - uint32_t objectformatcode, - uint32_t associationOH, - PTP_ObjectHandlesTypedef* objecthandles) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObjectHandles; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = storage_id; - ptp_container.Param2 = objectformatcode; - ptp_container.Param3 = associationOH; - ptp_container.Nparam = 3; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - objecthandles->n = PTP_GetArray32 (objecthandles->Handler, - MTP_Handle->ptp.data_container.payload.data, - 0); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectInfo - * Gets objert info - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObjectInfo (USBH_HandleTypeDef *phost, - uint32_t handle, - PTP_ObjectInfoTypedef* object_info) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObjectInfo; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = handle; - ptp_container.Nparam = 1; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_GetObjectInfo (phost, object_info); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_DeleteObject - * Delete an object. - * @param phost: Host handle - * @param handle : Object Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_DeleteObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t objectformatcode) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_NODATA; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_DeleteObject; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = handle; - ptp_container.Param2 = objectformatcode; - ptp_container.Nparam = 2; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObject - * Gets object - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* set object control params */ - MTP_Handle->ptp.object_ptr = object; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObject; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = handle; - ptp_container.Nparam = 1; - - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - /* first packet is in the PTP data payload buffer */ - if(MTP_Handle->ptp.iteration == 0) - { - /* copy it to object */ - USBH_memcpy(MTP_Handle->ptp.object_ptr, MTP_Handle->ptp.data_container.payload.data, PTP_USB_BULK_PAYLOAD_LEN_READ); - } - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetPartialObject - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetPartialObject(USBH_HandleTypeDef *phost, - uint32_t handle, - uint32_t offset, - uint32_t maxbytes, - uint8_t *object, - uint32_t *len) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* set object control params */ - MTP_Handle->ptp.object_ptr = object; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetPartialObject; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = handle; - ptp_container.Param2 = offset; - ptp_container.Param3 = maxbytes; - ptp_container.Nparam = 3; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - *len = MTP_Handle->ptp.resp_container.param1; - /* first packet is in the PTP data payload buffer */ - if(MTP_Handle->ptp.iteration == 0) - { - /* copy it to object */ - USBH_memcpy(MTP_Handle->ptp.object_ptr, MTP_Handle->ptp.data_container.payload.data, *len); - } - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectPropsSupported - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObjectPropsSupported (USBH_HandleTypeDef *phost, - uint16_t ofc, - uint32_t *propnum, - uint16_t *props) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObjectPropsSupported; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = ofc; - ptp_container.Nparam = 1; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - *propnum = PTP_GetArray16 (props, MTP_Handle->ptp.data_container.payload.data, 0); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectPropDesc - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObjectPropDesc (USBH_HandleTypeDef *phost, - uint16_t opc, - uint16_t ofc, - PTP_ObjectPropDescTypeDef *opd) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObjectPropDesc; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = opc; - ptp_container.Param2 = ofc; - ptp_container.Nparam = 2; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_GetObjectPropDesc(phost, opd, MTP_Handle->ptp.data_length); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_GetObjectPropList - * Gets object partially - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_GetObjectPropList (USBH_HandleTypeDef *phost, - uint32_t handle, - MTP_PropertiesTypedef *pprops, - uint32_t *nrofprops) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_GETDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_length = 0; - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - - /* copy first packet of the object into data container */ - USBH_memcpy(MTP_Handle->ptp.data_container.payload.data, MTP_Handle->ptp.object_ptr, PTP_USB_BULK_PAYLOAD_LEN_READ); - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_GetObjPropList; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Param1 = handle; - ptp_container.Param2 = 0x00000000U; /* 0x00000000U should be "all formats" */ - ptp_container.Param3 = 0xFFFFFFFFU; /* 0xFFFFFFFFU should be "all properties" */ - ptp_container.Param4 = 0x00000000U; - ptp_container.Param5 = 0xFFFFFFFFU; /* Return full tree below the Param1 handle */ - ptp_container.Nparam = 5; - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - - if(status == USBH_OK) - { - PTP_GetObjectPropList (phost, pprops, MTP_Handle->ptp.data_length); - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_PTP_SendObject - * Send an object - * @param phost: Host handle - * @param dev_info: Device info structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_PTP_SendObject (USBH_HandleTypeDef *phost, - uint32_t handle, - uint8_t *object, - uint32_t size) -{ - USBH_StatusTypeDef status = USBH_BUSY; - MTP_HandleTypeDef *MTP_Handle = (MTP_HandleTypeDef *)phost->pActiveClass->pData; - PTP_ContainerTypedef ptp_container; - - switch(MTP_Handle->ptp.req_state) - { - case PTP_REQ_SEND: - - /* Set operation request type */ - MTP_Handle->ptp.flags = PTP_DP_SENDDATA; - MTP_Handle->ptp.data_ptr = (uint8_t *)&(MTP_Handle->ptp.data_container); - MTP_Handle->ptp.data_packet_counter = 0; - MTP_Handle->ptp.data_packet = 0; - MTP_Handle->ptp.iteration = 0; - - /* set object control params */ - MTP_Handle->ptp.object_ptr = object; - MTP_Handle->ptp.data_length = size; - - /* Fill operation request params */ - ptp_container.Code = PTP_OC_SendObject; - ptp_container.SessionID = MTP_Handle->ptp.session_id; - ptp_container.Transaction_ID = MTP_Handle->ptp.transaction_id ++; - ptp_container.Nparam = 0; - - - /* convert request packet into USB raw packet*/ - USBH_PTP_SendRequest (phost, &ptp_container); - - /* Setup State machine and start transfer */ - MTP_Handle->ptp.state = PTP_OP_REQUEST_STATE; - MTP_Handle->ptp.req_state = PTP_REQ_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case PTP_REQ_WAIT: - status = USBH_PTP_Process(phost); - break; - - default: - break; - } - return status; -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Inc/usbh_template.h b/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Inc/usbh_template.h deleted file mode 100644 index f919740..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Inc/usbh_template.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_template.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file contains all the prototypes for the usbh_template.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_TEMPLATE_H -#define __USBH_TEMPLATE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_TEMPLATE_CLASS -* @{ -*/ - -/** @defgroup USBH_TEMPLATE_CLASS -* @brief This file is the Header file for usbh_template.c -* @{ -*/ - - -/** - * @} - */ - -/** @defgroup USBH_TEMPLATE_CLASS_Exported_Types -* @{ -*/ - -/* States for TEMPLATE State Machine */ - - -/** -* @} -*/ - -/** @defgroup USBH_TEMPLATE_CLASS_Exported_Defines -* @{ -*/ - -/** -* @} -*/ - -/** @defgroup USBH_TEMPLATE_CLASS_Exported_Macros -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_TEMPLATE_CLASS_Exported_Variables -* @{ -*/ -extern USBH_ClassTypeDef TEMPLATE_Class; -#define USBH_TEMPLATE_CLASS &TEMPLATE_Class - -/** -* @} -*/ - -/** @defgroup USBH_TEMPLATE_CLASS_Exported_FunctionsPrototype -* @{ -*/ -USBH_StatusTypeDef USBH_TEMPLATE_IOProcess (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_TEMPLATE_Init (USBH_HandleTypeDef *phost); -/** -* @} -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_TEMPLATE_H */ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Src/usbh_template.c b/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Src/usbh_template.c deleted file mode 100644 index d7060ac..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Class/Template/Src/usbh_template.c +++ /dev/null @@ -1,240 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_mtp.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file is the MTP Layer Handlers for USB Host MTP class. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_template.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_TEMPLATE_CLASS -* @{ -*/ - -/** @defgroup USBH_TEMPLATE_CORE -* @brief This file includes TEMPLATE Layer Handlers for USB Host TEMPLATE class. -* @{ -*/ - -/** @defgroup USBH_TEMPLATE_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_TEMPLATE_CORE_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_TEMPLATE_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_TEMPLATE_CORE_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_TEMPLATE_CORE_Private_FunctionPrototypes -* @{ -*/ - -static USBH_StatusTypeDef USBH_TEMPLATE_InterfaceInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_TEMPLATE_InterfaceDeInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_TEMPLATE_Process(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_TEMPLATE_ClassRequest (USBH_HandleTypeDef *phost); - - -USBH_ClassTypeDef TEMPLATE_Class = -{ - "TEMPLATE", - USB_TEMPLATE_CLASS, - USBH_TEMPLATE_InterfaceInit, - USBH_TEMPLATE_InterfaceDeInit, - USBH_TEMPLATE_ClassRequest, - USBH_TEMPLATE_Process -}; -/** -* @} -*/ - - -/** @defgroup USBH_TEMPLATE_CORE_Private_Functions -* @{ -*/ - -/** - * @brief USBH_TEMPLATE_InterfaceInit - * The function init the TEMPLATE class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_TEMPLATE_InterfaceInit (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - - - -/** - * @brief USBH_TEMPLATE_InterfaceDeInit - * The function DeInit the Pipes used for the TEMPLATE class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_TEMPLATE_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_TEMPLATE_ClassRequest - * The function is responsible for handling Standard requests - * for TEMPLATE class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_TEMPLATE_ClassRequest (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - - -/** - * @brief USBH_TEMPLATE_Process - * The function is for managing state machine for TEMPLATE data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_TEMPLATE_Process (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - - -/** - * @brief USBH_TEMPLATE_Init - * The function Initialize the TEMPLATE function - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_TEMPLATE_Init (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osEvent event; - - event = osMessageGet( phost->class_ready_event, osWaitForever ); - - if( event.status == osEventMessage ) - { - if(event.value.v == USBH_CLASS_EVENT) - { -#else - - while ((Status == USBH_BUSY) || (Status == USBH_FAIL)) - { - /* Host background process */ - USBH_Process(phost); - if(phost->gState == HOST_CLASS) - { -#endif - Status = USBH_OK; - } - } - return Status; -} - -/** - * @brief USBH_TEMPLATE_IOProcess - * TEMPLATE TEMPLATE process - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_TEMPLATE_IOProcess (USBH_HandleTypeDef *phost) -{ - if (phost->device.is_connected == 1) - { - if(phost->gState == HOST_CLASS) - { - USBH_TEMPLATE_Process(phost); - } - } - - return USBH_OK; -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h deleted file mode 100644 index 03cc227..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h +++ /dev/null @@ -1,157 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_conf_template.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_conf_template.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBH_CONF_TEMPLATE_H -#define __USBH_CONF_TEMPLATE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include -#include -#include - -/** @addtogroup USBH_OTG_DRIVER - * @{ - */ - -/** @defgroup USBH_CONF - * @brief usb otg low level driver configuration file - * @{ - */ - -/** @defgroup USBH_CONF_Exported_Defines - * @{ - */ - -#define USBH_MAX_NUM_ENDPOINTS 2 -#define USBH_MAX_NUM_INTERFACES 2 -#define USBH_MAX_NUM_CONFIGURATION 1 -#define USBH_KEEP_CFG_DESCRIPTOR 1 -#define USBH_MAX_NUM_SUPPORTED_CLASS 1 -#define USBH_MAX_SIZE_CONFIGURATION 0x200 -#define USBH_MAX_DATA_BUFFER 0x200 -#define USBH_DEBUG_LEVEL 2 -#define USBH_USE_OS 1 - -/** @defgroup USBH_Exported_Macros - * @{ - */ - - /* Memory management macros */ -#define USBH_malloc malloc -#define USBH_free free -#define USBH_memset memset -#define USBH_memcpy memcpy - - /* DEBUG macros */ - - -#if (USBH_DEBUG_LEVEL > 0) -#define USBH_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_UsrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 1) - -#define USBH_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_ErrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 2) -#define USBH_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_DbgLog(...) -#endif - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CONF_TEMPLATE_H */ - - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h deleted file mode 100644 index de855de..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_core.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_core.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_CORE_H -#define __USBH_CORE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" -#include "usbh_def.h" -#include "usbh_ioreq.h" -#include "usbh_pipes.h" -#include "usbh_ctlreq.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CORE - * @brief This file is the Header file for usbh_core.c - * @{ - */ - - -/** @defgroup USBH_CORE_Exported_Defines - * @{ - */ - -/** - * @} - */ -#define HOST_USER_SELECT_CONFIGURATION 1 -#define HOST_USER_CLASS_ACTIVE 2 -#define HOST_USER_CLASS_SELECTED 3 -#define HOST_USER_CONNECTION 4 -#define HOST_USER_DISCONNECTION 5 -#define HOST_USER_UNRECOVERED_ERROR 6 - - -/** - * @} - */ - - - -/** @defgroup USBH_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_CORE_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_CORE_Exported_FunctionsPrototype - * @{ - */ - - -USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t ), uint8_t id); -USBH_StatusTypeDef USBH_DeInit(USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_RegisterClass(USBH_HandleTypeDef *phost, USBH_ClassTypeDef *pclass); -USBH_StatusTypeDef USBH_SelectInterface(USBH_HandleTypeDef *phost, uint8_t interface); -uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, - uint8_t Class, - uint8_t SubClass, - uint8_t Protocol); -uint8_t USBH_GetActiveClass(USBH_HandleTypeDef *phost); - -uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, - uint8_t interface_number, - uint8_t alt_settings); - -USBH_StatusTypeDef USBH_Start (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_Stop (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_Process (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_ReEnumerate (USBH_HandleTypeDef *phost); - -/* USBH Low Level Driver */ -USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_DeInit (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Start (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Stop (USBH_HandleTypeDef *phost); - -USBH_StatusTypeDef USBH_LL_Connect (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Disconnect (USBH_HandleTypeDef *phost); -USBH_SpeedTypeDef USBH_LL_GetSpeed (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_ResetPort (USBH_HandleTypeDef *phost); -uint32_t USBH_LL_GetLastXferSize (USBH_HandleTypeDef *phost, uint8_t ); -USBH_StatusTypeDef USBH_LL_DriverVBUS (USBH_HandleTypeDef *phost, uint8_t ); - -USBH_StatusTypeDef USBH_LL_OpenPipe (USBH_HandleTypeDef *phost, uint8_t, uint8_t, uint8_t, uint8_t , uint8_t, uint16_t ); -USBH_StatusTypeDef USBH_LL_ClosePipe (USBH_HandleTypeDef *phost, uint8_t ); -USBH_StatusTypeDef USBH_LL_SubmitURB (USBH_HandleTypeDef *phost, uint8_t, uint8_t,uint8_t, uint8_t, uint8_t*, uint16_t, uint8_t ); -USBH_URBStateTypeDef USBH_LL_GetURBState (USBH_HandleTypeDef *phost, uint8_t ); -#if (USBH_USE_OS == 1) -USBH_StatusTypeDef USBH_LL_NotifyURBChange (USBH_HandleTypeDef *phost); -#endif -USBH_StatusTypeDef USBH_LL_SetToggle (USBH_HandleTypeDef *phost, uint8_t , uint8_t ); -uint8_t USBH_LL_GetToggle (USBH_HandleTypeDef *phost, uint8_t ); - -/* USBH Time base */ -void USBH_Delay (uint32_t Delay); -void USBH_LL_SetTimer (USBH_HandleTypeDef *phost, uint32_t ); -void USBH_LL_IncTimer (USBH_HandleTypeDef *phost); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CORE_H */ -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h deleted file mode 100644 index 0959fd1..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ctlreq.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_ctlreq.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_CTLREQ_H -#define __USBH_CTLREQ_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CTLREQ - * @brief This file is the - * @{ - */ - - -/** @defgroup USBH_CTLREQ_Exported_Defines - * @{ - */ -/*Standard Feature Selector for clear feature command*/ -#define FEATURE_SELECTOR_ENDPOINT 0X00 -#define FEATURE_SELECTOR_DEVICE 0X01 - - -#define INTERFACE_DESC_TYPE 0x04 -#define ENDPOINT_DESC_TYPE 0x05 -#define INTERFACE_DESC_SIZE 0x09 - -/** - * @} - */ - - -/** @defgroup USBH_CTLREQ_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CTLREQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CTLREQ_Exported_Variables - * @{ - */ -extern uint8_t USBH_CfgDesc[512]; -/** - * @} - */ - -/** @defgroup USBH_CTLREQ_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_CtlReq (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length); - -USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, - uint8_t req_type, - uint16_t value_idx, - uint8_t* buff, - uint16_t length ); - -USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, - uint8_t length); - -USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost, - uint8_t string_index, - uint8_t *buff, - uint16_t length); - -USBH_StatusTypeDef USBH_SetCfg(USBH_HandleTypeDef *phost, - uint16_t configuration_value); - -USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost, - uint16_t length); - -USBH_StatusTypeDef USBH_SetAddress(USBH_HandleTypeDef *phost, - uint8_t DeviceAddress); - -USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, - uint8_t ep_num, uint8_t altSetting); - -USBH_StatusTypeDef USBH_ClrFeature(USBH_HandleTypeDef *phost, - uint8_t ep_num); - -USBH_DescHeader_t *USBH_GetNextDesc (uint8_t *pbuf, - uint16_t *ptr); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CTLREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h deleted file mode 100644 index 2b1aae8..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h +++ /dev/null @@ -1,490 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_def.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Definitions used in the USB host library - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef USBH_DEF_H -#define USBH_DEF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_DEF - * @brief This file is includes USB descriptors - * @{ - */ - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - - -#define ValBit(VAR,POS) (VAR & (1 << POS)) -#define SetBit(VAR,POS) (VAR |= (1 << POS)) -#define ClrBit(VAR,POS) (VAR &= ((1 << POS)^255)) - -#define LE16(addr) (((uint16_t)(*((uint8_t *)(addr))))\ - + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) - -#define LE16S(addr) (uint16_t)(LE16((addr))) - -#define LE32(addr) ((((uint32_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 1))) << 8) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 2))) << 16) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 3))) << 24))) - -#define LE64(addr) ((((uint64_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint64_t)(*(((uint8_t *)(addr)) + 1))) << 8) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 2))) << 16) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 3))) << 24) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 4))) << 32) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 5))) << 40) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 6))) << 48) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 7))) << 56))) - - -#define LE24(addr) ((((uint32_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 1))) << 8) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 2))) << 16))) - - -#define LE32S(addr) (int32_t)(LE32((addr))) - - - -#define USB_LEN_DESC_HDR 0x02 -#define USB_LEN_DEV_DESC 0x12 -#define USB_LEN_CFG_DESC 0x09 -#define USB_LEN_IF_DESC 0x09 -#define USB_LEN_EP_DESC 0x07 -#define USB_LEN_OTG_DESC 0x03 -#define USB_LEN_SETUP_PKT 0x08 - -/* bmRequestType :D7 Data Phase Transfer Direction */ -#define USB_REQ_DIR_MASK 0x80 -#define USB_H2D 0x00 -#define USB_D2H 0x80 - -/* bmRequestType D6..5 Type */ -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_VENDOR 0x40 -#define USB_REQ_TYPE_RESERVED 0x60 - -/* bmRequestType D4..0 Recipient */ -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_OTHER 0x03 - -/* Table 9-4. Standard Request Codes */ -/* bRequest , Value */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -/* Table 9-5. Descriptor Types of USB Specifications */ -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_INTERFACE 4 -#define USB_DESC_TYPE_ENDPOINT 5 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 -#define USB_DESC_TYPE_INTERFACE_POWER 8 -#define USB_DESC_TYPE_HID 0x21 -#define USB_DESC_TYPE_HID_REPORT 0x22 - - -#define USB_DEVICE_DESC_SIZE 18 -#define USB_CONFIGURATION_DESC_SIZE 9 -#define USB_HID_DESC_SIZE 9 -#define USB_INTERFACE_DESC_SIZE 9 -#define USB_ENDPOINT_DESC_SIZE 7 - -/* Descriptor Type and Descriptor Index */ -/* Use the following values when calling the function USBH_GetDescriptor */ -#define USB_DESC_DEVICE ((USB_DESC_TYPE_DEVICE << 8) & 0xFF00) -#define USB_DESC_CONFIGURATION ((USB_DESC_TYPE_CONFIGURATION << 8) & 0xFF00) -#define USB_DESC_STRING ((USB_DESC_TYPE_STRING << 8) & 0xFF00) -#define USB_DESC_INTERFACE ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) -#define USB_DESC_ENDPOINT ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) -#define USB_DESC_DEVICE_QUALIFIER ((USB_DESC_TYPE_DEVICE_QUALIFIER << 8) & 0xFF00) -#define USB_DESC_OTHER_SPEED_CONFIGURATION ((USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION << 8) & 0xFF00) -#define USB_DESC_INTERFACE_POWER ((USB_DESC_TYPE_INTERFACE_POWER << 8) & 0xFF00) -#define USB_DESC_HID_REPORT ((USB_DESC_TYPE_HID_REPORT << 8) & 0xFF00) -#define USB_DESC_HID ((USB_DESC_TYPE_HID << 8) & 0xFF00) - - -#define USB_EP_TYPE_CTRL 0x00 -#define USB_EP_TYPE_ISOC 0x01 -#define USB_EP_TYPE_BULK 0x02 -#define USB_EP_TYPE_INTR 0x03 - -#define USB_EP_DIR_OUT 0x00 -#define USB_EP_DIR_IN 0x80 -#define USB_EP_DIR_MSK 0x80 - -#ifndef USBH_MAX_PIPES_NBR - #define USBH_MAX_PIPES_NBR 15 -#endif /* USBH_MAX_PIPES_NBR */ - -#define USBH_DEVICE_ADDRESS_DEFAULT 0 -#define USBH_MAX_ERROR_COUNT 2 -#define USBH_DEVICE_ADDRESS 1 - - -/** - * @} - */ - - -#define USBH_CONFIGURATION_DESCRIPTOR_SIZE (USB_CONFIGURATION_DESC_SIZE \ - + USB_INTERFACE_DESC_SIZE\ - + (USBH_MAX_NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE)) - - -#define CONFIG_DESC_wTOTAL_LENGTH (ConfigurationDescriptorData.ConfigDescfield.\ - ConfigurationDescriptor.wTotalLength) - - -typedef union -{ - uint16_t w; - struct BW - { - uint8_t msb; - uint8_t lsb; - } - bw; -} -uint16_t_uint8_t; - - -typedef union _USB_Setup -{ - uint32_t d8[2]; - - struct _SetupPkt_Struc - { - uint8_t bmRequestType; - uint8_t bRequest; - uint16_t_uint8_t wValue; - uint16_t_uint8_t wIndex; - uint16_t_uint8_t wLength; - } b; -} -USB_Setup_TypeDef; - -typedef struct _DescHeader -{ - uint8_t bLength; - uint8_t bDescriptorType; -} -USBH_DescHeader_t; - -typedef struct _DeviceDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdUSB; /* USB Specification Number which device complies too */ - uint8_t bDeviceClass; - uint8_t bDeviceSubClass; - uint8_t bDeviceProtocol; - /* If equal to Zero, each interface specifies its own class - code if equal to 0xFF, the class code is vendor specified. - Otherwise field is valid Class Code.*/ - uint8_t bMaxPacketSize; - uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */ - uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ - uint16_t bcdDevice; /* Device Release Number */ - uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ - uint8_t iProduct; /* Index of Product String Descriptor */ - uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ - uint8_t bNumConfigurations; /* Number of Possible Configurations */ -} -USBH_DevDescTypeDef; - -typedef struct _EndpointDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */ - uint8_t bmAttributes; /* specifies the transfer type. */ - uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */ - uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ -} -USBH_EpDescTypeDef; - -typedef struct _InterfaceDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; /* Value used to select alternative setting */ - uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ - uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */ - uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ - uint8_t bInterfaceProtocol; /* Protocol Code */ - uint8_t iInterface; /* Index of String Descriptor Describing this interface */ - USBH_EpDescTypeDef Ep_Desc[USBH_MAX_NUM_ENDPOINTS]; -} -USBH_InterfaceDescTypeDef; - - -typedef struct _ConfigurationDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; /* Total Length of Data Returned */ - uint8_t bNumInterfaces; /* Number of Interfaces */ - uint8_t bConfigurationValue; /* Value to use as an argument to select this configuration*/ - uint8_t iConfiguration; /*Index of String Descriptor Describing this configuration */ - uint8_t bmAttributes; /* D7 Bus Powered , D6 Self Powered, D5 Remote Wakeup , D4..0 Reserved (0)*/ - uint8_t bMaxPower; /*Maximum Power Consumption */ - USBH_InterfaceDescTypeDef Itf_Desc[USBH_MAX_NUM_INTERFACES]; -} -USBH_CfgDescTypeDef; - - -/* Following USB Host status */ -typedef enum -{ - USBH_OK = 0, - USBH_BUSY, - USBH_FAIL, - USBH_NOT_SUPPORTED, - USBH_UNRECOVERED_ERROR, - USBH_ERROR_SPEED_UNKNOWN, -}USBH_StatusTypeDef; - - -/** @defgroup USBH_CORE_Exported_Types - * @{ - */ - -typedef enum -{ - USBH_SPEED_HIGH = 0, - USBH_SPEED_FULL = 1, - USBH_SPEED_LOW = 2, - -}USBH_SpeedTypeDef; - -/* Following states are used for gState */ -typedef enum -{ - HOST_IDLE =0, - HOST_DEV_WAIT_FOR_ATTACHMENT, - HOST_DEV_ATTACHED, - HOST_DEV_DISCONNECTED, - HOST_DETECT_DEVICE_SPEED, - HOST_ENUMERATION, - HOST_CLASS_REQUEST, - HOST_INPUT, - HOST_SET_CONFIGURATION, - HOST_CHECK_CLASS, - HOST_CLASS, - HOST_SUSPENDED, - HOST_ABORT_STATE, -}HOST_StateTypeDef; - -/* Following states are used for EnumerationState */ -typedef enum -{ - ENUM_IDLE = 0, - ENUM_GET_FULL_DEV_DESC, - ENUM_SET_ADDR, - ENUM_GET_CFG_DESC, - ENUM_GET_FULL_CFG_DESC, - ENUM_GET_MFC_STRING_DESC, - ENUM_GET_PRODUCT_STRING_DESC, - ENUM_GET_SERIALNUM_STRING_DESC, -} ENUM_StateTypeDef; - -/* Following states are used for CtrlXferStateMachine */ -typedef enum -{ - CTRL_IDLE =0, - CTRL_SETUP, - CTRL_SETUP_WAIT, - CTRL_DATA_IN, - CTRL_DATA_IN_WAIT, - CTRL_DATA_OUT, - CTRL_DATA_OUT_WAIT, - CTRL_STATUS_IN, - CTRL_STATUS_IN_WAIT, - CTRL_STATUS_OUT, - CTRL_STATUS_OUT_WAIT, - CTRL_ERROR, - CTRL_STALLED, - CTRL_COMPLETE -}CTRL_StateTypeDef; - - -/* Following states are used for RequestState */ -typedef enum -{ - CMD_IDLE =0, - CMD_SEND, - CMD_WAIT -} CMD_StateTypeDef; - -typedef enum { - USBH_URB_IDLE = 0, - USBH_URB_DONE, - USBH_URB_NOTREADY, - USBH_URB_NYET, - USBH_URB_ERROR, - USBH_URB_STALL -}USBH_URBStateTypeDef; - -typedef enum -{ - USBH_PORT_EVENT = 1, - USBH_URB_EVENT, - USBH_CONTROL_EVENT, - USBH_CLASS_EVENT, - USBH_STATE_CHANGED_EVENT, -} -USBH_OSEventTypeDef; - -/* Control request structure */ -typedef struct -{ - uint8_t pipe_in; - uint8_t pipe_out; - uint8_t pipe_size; - uint8_t *buff; - uint16_t length; - uint16_t timer; - USB_Setup_TypeDef setup; - CTRL_StateTypeDef state; - uint8_t errorcount; - -} USBH_CtrlTypeDef; - -/* Attached device structure */ -typedef struct -{ -#if (USBH_KEEP_CFG_DESCRIPTOR == 1) - uint8_t CfgDesc_Raw[USBH_MAX_SIZE_CONFIGURATION]; -#endif - uint8_t Data[USBH_MAX_DATA_BUFFER]; - uint8_t address; - uint8_t speed; - __IO uint8_t is_connected; - uint8_t current_interface; - USBH_DevDescTypeDef DevDesc; - USBH_CfgDescTypeDef CfgDesc; - -}USBH_DeviceTypeDef; - -struct _USBH_HandleTypeDef; - -/* USB Host Class structure */ -typedef struct -{ - const char *Name; - uint8_t ClassCode; - USBH_StatusTypeDef (*Init) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*DeInit) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*Requests) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*BgndProcess) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*SOFProcess) (struct _USBH_HandleTypeDef *phost); - void* pData; -} USBH_ClassTypeDef; - -/* USB Host handle structure */ -typedef struct _USBH_HandleTypeDef -{ - __IO HOST_StateTypeDef gState; /* Host State Machine Value */ - ENUM_StateTypeDef EnumState; /* Enumeration state Machine */ - CMD_StateTypeDef RequestState; - USBH_CtrlTypeDef Control; - USBH_DeviceTypeDef device; - USBH_ClassTypeDef* pClass[USBH_MAX_NUM_SUPPORTED_CLASS]; - USBH_ClassTypeDef* pActiveClass; - uint32_t ClassNumber; - uint32_t Pipes[15]; - __IO uint32_t Timer; - uint8_t id; - void* pData; - void (* pUser )(struct _USBH_HandleTypeDef *pHandle, uint8_t id); - -#if (USBH_USE_OS == 1) - osMessageQId os_event; - osThreadId thread; -#endif - -} USBH_HandleTypeDef; - - -#if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_DEF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h deleted file mode 100644 index c097031..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ioreq.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_ioreq.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_IOREQ_H -#define __USBH_IOREQ_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_IOREQ - * @brief This file is the header file for usbh_ioreq.c - * @{ - */ - - -/** @defgroup USBH_IOREQ_Exported_Defines - * @{ - */ - -#define USBH_PID_SETUP 0 -#define USBH_PID_DATA 1 - -#define USBH_EP_CONTROL 0 -#define USBH_EP_ISO 1 -#define USBH_EP_BULK 2 -#define USBH_EP_INTERRUPT 3 - -#define USBH_SETUP_PKT_SIZE 8 -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_IOREQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_IOREQ_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_CtlSendSetup (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_CtlSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num, - uint8_t do_ping ); - -USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_BulkSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num, - uint8_t do_ping ); - -USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t hc_num); - - -USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t hc_num); - - -USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t hc_num); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_IOREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h deleted file mode 100644 index ed62719..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_pipes.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_pipes.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_PIPES_H -#define __USBH_PIPES_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_PIPES - * @brief This file is the header file for usbh_pipes.c - * @{ - */ - -/** @defgroup USBH_PIPES_Exported_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_PIPES_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_FunctionsPrototype - * @{ - */ - -USBH_StatusTypeDef USBH_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); - -USBH_StatusTypeDef USBH_ClosePipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num); - -uint8_t USBH_AllocPipe (USBH_HandleTypeDef *phost, - uint8_t ep_addr); - -USBH_StatusTypeDef USBH_FreePipe (USBH_HandleTypeDef *phost, - uint8_t idx); - - - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_PIPES_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c deleted file mode 100644 index cd960e5..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c +++ /dev/null @@ -1,271 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the board support package for the USB host library - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** - * @brief USBH_LL_Init - * Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_DeInit - * De-Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_DeInit (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_Start - * Start the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_Stop - * Stop the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Stop (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetSpeed - * Return the USB Host Speed from the Low Level Driver. - * @param phost: Host handle - * @retval USBH Speeds - */ -USBH_SpeedTypeDef USBH_LL_GetSpeed (USBH_HandleTypeDef *phost) -{ - USBH_SpeedTypeDef speed = USBH_SPEED_FULL; - - - return speed; -} - -/** - * @brief USBH_LL_ResetPort - * Reset the Host Port of the Low Level Driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ResetPort (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetLastXferSize - * Return the last transferred packet size. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval Packet Size - */ -uint32_t USBH_LL_GetLastXferSize (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return 0; -} - -/** - * @brief USBH_LL_OpenPipe - * Open a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @param epnum: Endpoint Number - * @param dev_address: Device USB address - * @param speed: Device Speed - * @param ep_type: Endpoint Type - * @param mps: Endpoint Max Packet Size - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_ClosePipe - * Close a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ClosePipe (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return USBH_OK; -} - -/** - * @brief USBH_LL_SubmitURB - * Submit a new URB to the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @param direction : Channel number - * This parameter can be one of the these values: - * 0 : Output - * 1 : Input - * @param ep_type : Endpoint Type - * This parameter can be one of the these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochronous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param token : Endpoint Type - * This parameter can be one of the these values: - * @arg 0: PID_SETUP - * @arg 1: PID_DATA - * @param pbuff : pointer to URB data - * @param length : Length of URB data - * @param do_ping : activate do ping protocol (for high speed only) - * This parameter can be one of the these values: - * 0 : do ping inactive - * 1 : do ping active - * @retval Status - */ - -USBH_StatusTypeDef USBH_LL_SubmitURB (USBH_HandleTypeDef *phost, - uint8_t pipe, - uint8_t direction , - uint8_t ep_type, - uint8_t token, - uint8_t* pbuff, - uint16_t length, - uint8_t do_ping ) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetURBState - * Get a URB state from the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @retval URB state - * This parameter can be one of the these values: - * @arg URB_IDLE - * @arg URB_DONE - * @arg URB_NOTREADY - * @arg URB_NYET - * @arg URB_ERROR - * @arg URB_STALL - */ -USBH_URBStateTypeDef USBH_LL_GetURBState (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return USBH_URB_IDLE; -} - -/** - * @brief USBH_LL_DriverVBUS - * Drive VBUS. - * @param phost: Host handle - * @param state : VBUS state - * This parameter can be one of the these values: - * 0 : VBUS Active - * 1 : VBUS Inactive - * @retval Status - */ - -USBH_StatusTypeDef USBH_LL_DriverVBUS (USBH_HandleTypeDef *phost, uint8_t state) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_SetToggle - * Set toggle for a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @param pipe_num: Pipe index - * @param toggle: toggle (0/1) - * @retval Status - */ -USBH_StatusTypeDef USBH_LL_SetToggle (USBH_HandleTypeDef *phost, uint8_t pipe, uint8_t toggle) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetToggle - * Return the current toggle of a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval toggle (0/1) - */ -uint8_t USBH_LL_GetToggle (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - uint8_t toggle = 0; - - - return toggle; -} -/** - * @brief USBH_Delay - * Delay routine for the USB Host Library - * @param Delay: Delay in ms - * @retval None - */ -void USBH_Delay (uint32_t Delay) -{ - -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c deleted file mode 100644 index 8df872f..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c +++ /dev/null @@ -1,933 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_core.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the functions for the core state machine process - * the enumeration and the control transfer process - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE - * @{ - */ - -/** @defgroup USBH_CORE - * @brief This file handles the basic enumeration when a device is connected - * to the host. - * @{ - */ - - -/** @defgroup USBH_CORE_Private_Defines - * @{ - */ -#define USBH_ADDRESS_DEFAULT 0 -#define USBH_ADDRESS_ASSIGNED 1 -#define USBH_MPS_DEFAULT 0x40 -/** - * @} - */ - -/** @defgroup USBH_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CORE_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CORE_Private_Functions - * @{ - */ -static USBH_StatusTypeDef USBH_HandleEnum (USBH_HandleTypeDef *phost); -static void USBH_HandleSof (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef DeInitStateMachine(USBH_HandleTypeDef *phost); - -#if (USBH_USE_OS == 1) -static void USBH_Process_OS(void const * argument); -#endif - -/** - * @brief HCD_Init - * Initialize the HOST Core. - * @param phost: Host Handle - * @param pUsrFunc: User Callback - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t ), uint8_t id) -{ - /* Check whether the USB Host handle is valid */ - if(phost == NULL) - { - USBH_ErrLog("Invalid Host handle"); - return USBH_FAIL; - } - - /* Set DRiver ID */ - phost->id = id; - - /* Unlink class*/ - phost->pActiveClass = NULL; - phost->ClassNumber = 0; - - /* Restore default states and prepare EP0 */ - DeInitStateMachine(phost); - - /* Assign User process */ - if(pUsrFunc != NULL) - { - phost->pUser = pUsrFunc; - } - -#if (USBH_USE_OS == 1) - - /* Create USB Host Queue */ - osMessageQDef(USBH_Queue, 10, uint16_t); - phost->os_event = osMessageCreate (osMessageQ(USBH_Queue), NULL); - - /*Create USB Host Task */ -#if defined (USBH_PROCESS_STACK_SIZE) - osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, USBH_PROCESS_STACK_SIZE); -#else - osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, 8 * configMINIMAL_STACK_SIZE); -#endif - phost->thread = osThreadCreate (osThread(USBH_Thread), phost); -#endif - - /* Initialize low level driver */ - USBH_LL_Init(phost); - return USBH_OK; -} - -/** - * @brief HCD_Init - * De-Initialize the Host portion of the driver. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_DeInit(USBH_HandleTypeDef *phost) -{ - DeInitStateMachine(phost); - - if(phost->pData != NULL) - { - phost->pActiveClass->pData = NULL; - USBH_LL_Stop(phost); - } - - return USBH_OK; -} - -/** - * @brief DeInitStateMachine - * De-Initialize the Host state machine. - * @param phost: Host Handle - * @retval USBH Status - */ -static USBH_StatusTypeDef DeInitStateMachine(USBH_HandleTypeDef *phost) -{ - uint32_t i = 0; - - /* Clear Pipes flags*/ - for ( ; i < USBH_MAX_PIPES_NBR; i++) - { - phost->Pipes[i] = 0; - } - - for(i = 0; i< USBH_MAX_DATA_BUFFER; i++) - { - phost->device.Data[i] = 0; - } - - phost->gState = HOST_IDLE; - phost->EnumState = ENUM_IDLE; - phost->RequestState = CMD_SEND; - phost->Timer = 0; - - phost->Control.state = CTRL_SETUP; - phost->Control.pipe_size = USBH_MPS_DEFAULT; - phost->Control.errorcount = 0; - - phost->device.address = USBH_ADDRESS_DEFAULT; - phost->device.speed = USBH_SPEED_FULL; - - return USBH_OK; -} - -/** - * @brief USBH_RegisterClass - * Link class driver to Host Core. - * @param phost : Host Handle - * @param pclass: Class handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_RegisterClass(USBH_HandleTypeDef *phost, USBH_ClassTypeDef *pclass) -{ - USBH_StatusTypeDef status = USBH_OK; - - if(pclass != 0) - { - if(phost->ClassNumber < USBH_MAX_NUM_SUPPORTED_CLASS) - { - /* link the class to the USB Host handle */ - phost->pClass[phost->ClassNumber++] = pclass; - status = USBH_OK; - } - else - { - USBH_ErrLog("Max Class Number reached"); - status = USBH_FAIL; - } - } - else - { - USBH_ErrLog("Invalid Class handle"); - status = USBH_FAIL; - } - - return status; -} - -/** - * @brief USBH_SelectInterface - * Select current interface. - * @param phost: Host Handle - * @param interface: Interface number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SelectInterface(USBH_HandleTypeDef *phost, uint8_t interface) -{ - USBH_StatusTypeDef status = USBH_OK; - - if(interface < phost->device.CfgDesc.bNumInterfaces) - { - phost->device.current_interface = interface; - USBH_UsrLog ("Switching to Interface (#%d)", interface); - USBH_UsrLog ("Class : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass ); - USBH_UsrLog ("SubClass : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceSubClass ); - USBH_UsrLog ("Protocol : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceProtocol ); - } - else - { - USBH_ErrLog ("Cannot Select This Interface."); - status = USBH_FAIL; - } - return status; -} - -/** - * @brief USBH_GetActiveClass - * Return Device Class. - * @param phost: Host Handle - * @param interface: Interface index - * @retval Class Code - */ -uint8_t USBH_GetActiveClass(USBH_HandleTypeDef *phost) -{ - return (phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass); -} -/** - * @brief USBH_FindInterface - * Find the interface index for a specific class. - * @param phost: Host Handle - * @param Class: Class code - * @param SubClass: SubClass code - * @param Protocol: Protocol code - * @retval interface index in the configuration structure - * @note : (1)interface index 0xFF means interface index not found - */ -uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, uint8_t Class, uint8_t SubClass, uint8_t Protocol) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_CfgDescTypeDef *pcfg ; - int8_t if_ix = 0; - - pif = (USBH_InterfaceDescTypeDef *)0; - pcfg = &phost->device.CfgDesc; - - while (if_ix < USBH_MAX_NUM_INTERFACES) - { - pif = &pcfg->Itf_Desc[if_ix]; - if(((pif->bInterfaceClass == Class) || (Class == 0xFF))&& - ((pif->bInterfaceSubClass == SubClass) || (SubClass == 0xFF))&& - ((pif->bInterfaceProtocol == Protocol) || (Protocol == 0xFF))) - { - return if_ix; - } - if_ix++; - } - return 0xFF; -} - -/** - * @brief USBH_FindInterfaceIndex - * Find the interface index for a specific class interface and alternate setting number. - * @param phost: Host Handle - * @param interface_number: interface number - * @param alt_settings : alternate setting number - * @retval interface index in the configuration structure - * @note : (1)interface index 0xFF means interface index not found - */ -uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, uint8_t interface_number, uint8_t alt_settings) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_CfgDescTypeDef *pcfg ; - int8_t if_ix = 0; - - pif = (USBH_InterfaceDescTypeDef *)0; - pcfg = &phost->device.CfgDesc; - - while (if_ix < USBH_MAX_NUM_INTERFACES) - { - pif = &pcfg->Itf_Desc[if_ix]; - if((pif->bInterfaceNumber == interface_number) && (pif->bAlternateSetting == alt_settings)) - { - return if_ix; - } - if_ix++; - } - return 0xFF; -} - -/** - * @brief USBH_Start - * Start the USB Host Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Start (USBH_HandleTypeDef *phost) -{ - /* Start the low level driver */ - USBH_LL_Start(phost); - - /* Activate VBUS on the port */ - USBH_LL_DriverVBUS (phost, TRUE); - - return USBH_OK; -} - -/** - * @brief USBH_Stop - * Stop the USB Host Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Stop (USBH_HandleTypeDef *phost) -{ - /* Stop and cleanup the low level driver */ - USBH_LL_Stop(phost); - - /* DeActivate VBUS on the port */ - USBH_LL_DriverVBUS (phost, FALSE); - - /* FRee Control Pipes */ - USBH_FreePipe (phost, phost->Control.pipe_in); - USBH_FreePipe (phost, phost->Control.pipe_out); - - return USBH_OK; -} - -/** - * @brief HCD_ReEnumerate - * Perform a new Enumeration phase. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_ReEnumerate (USBH_HandleTypeDef *phost) -{ - /*Stop Host */ - USBH_Stop(phost); - - /*Device has disconnected, so wait for 200 ms */ - USBH_Delay(200); - - /* Set State machines in default state */ - DeInitStateMachine(phost); - - /* Start again the host */ - USBH_Start(phost); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - return USBH_OK; -} - -/** - * @brief USBH_Process - * Background process of the USB Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Process(USBH_HandleTypeDef *phost) -{ - __IO USBH_StatusTypeDef status = USBH_FAIL; - uint8_t idx = 0; - - switch (phost->gState) - { - case HOST_IDLE : - - if (phost->device.is_connected) - { - /* Wait for 200 ms after connection */ - phost->gState = HOST_DEV_WAIT_FOR_ATTACHMENT; - USBH_Delay(200); - USBH_LL_ResetPort(phost); -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - } - break; - - case HOST_DEV_WAIT_FOR_ATTACHMENT: - break; - - case HOST_DEV_ATTACHED : - - USBH_UsrLog("USB Device Attached"); - - /* Wait for 100 ms after Reset */ - USBH_Delay(100); - - phost->device.speed = USBH_LL_GetSpeed(phost); - - phost->gState = HOST_ENUMERATION; - - phost->Control.pipe_out = USBH_AllocPipe (phost, 0x00); - phost->Control.pipe_in = USBH_AllocPipe (phost, 0x80); - - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - break; - - case HOST_ENUMERATION: - /* Check for enumeration status */ - if ( USBH_HandleEnum(phost) == USBH_OK) - { - /* The function shall return USBH_OK when full enumeration is complete */ - USBH_UsrLog ("Enumeration done."); - phost->device.current_interface = 0; - if(phost->device.DevDesc.bNumConfigurations == 1) - { - USBH_UsrLog ("This device has only 1 configuration."); - phost->gState = HOST_SET_CONFIGURATION; - - } - else - { - phost->gState = HOST_INPUT; - } - - } - break; - - case HOST_INPUT: - { - /* user callback for end of device basic enumeration */ - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_SELECT_CONFIGURATION); - phost->gState = HOST_SET_CONFIGURATION; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - } - break; - - case HOST_SET_CONFIGURATION: - /* set configuration */ - if (USBH_SetCfg(phost, phost->device.CfgDesc.bConfigurationValue) == USBH_OK) - { - phost->gState = HOST_CHECK_CLASS; - USBH_UsrLog ("Default configuration set."); - - } - - break; - - case HOST_CHECK_CLASS: - - if(phost->ClassNumber == 0) - { - USBH_UsrLog ("No Class has been registered."); - } - else - { - phost->pActiveClass = NULL; - - for (idx = 0; idx < USBH_MAX_NUM_SUPPORTED_CLASS ; idx ++) - { - if(phost->pClass[idx]->ClassCode == phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass) - { - phost->pActiveClass = phost->pClass[idx]; - } - } - - if(phost->pActiveClass != NULL) - { - if(phost->pActiveClass->Init(phost)== USBH_OK) - { - phost->gState = HOST_CLASS_REQUEST; - USBH_UsrLog ("%s class started.", phost->pActiveClass->Name); - - /* Inform user that a class has been activated */ - phost->pUser(phost, HOST_USER_CLASS_SELECTED); - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name); - } - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_UsrLog ("No registered class for this device."); - } - } - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case HOST_CLASS_REQUEST: - /* process class standard control requests state machine */ - if(phost->pActiveClass != NULL) - { - status = phost->pActiveClass->Requests(phost); - - if(status == USBH_OK) - { - phost->gState = HOST_CLASS; - } - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_ErrLog ("Invalid Class Driver."); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - - break; - case HOST_CLASS: - /* process class state machine */ - if(phost->pActiveClass != NULL) - { - phost->pActiveClass->BgndProcess(phost); - } - break; - - case HOST_DEV_DISCONNECTED : - - DeInitStateMachine(phost); - - /* Re-Initilaize Host for new Enumeration */ - if(phost->pActiveClass != NULL) - { - phost->pActiveClass->DeInit(phost); - phost->pActiveClass = NULL; - } - break; - - case HOST_ABORT_STATE: - default : - break; - } - return USBH_OK; -} - - -/** - * @brief USBH_HandleEnum - * This function includes the complete enumeration process - * @param phost: Host Handle - * @retval USBH_Status - */ -static USBH_StatusTypeDef USBH_HandleEnum (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_BUSY; - - switch (phost->EnumState) - { - case ENUM_IDLE: - /* Get Device Desc for only 1st 8 bytes : To get EP0 MaxPacketSize */ - if ( USBH_Get_DevDesc(phost, 8) == USBH_OK) - { - phost->Control.pipe_size = phost->device.DevDesc.bMaxPacketSize; - - phost->EnumState = ENUM_GET_FULL_DEV_DESC; - - /* modify control channels configuration for MaxPacket size */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - } - break; - - case ENUM_GET_FULL_DEV_DESC: - /* Get FULL Device Desc */ - if ( USBH_Get_DevDesc(phost, USB_DEVICE_DESC_SIZE)== USBH_OK) - { - USBH_UsrLog("PID: %xh", phost->device.DevDesc.idProduct ); - USBH_UsrLog("VID: %xh", phost->device.DevDesc.idVendor ); - - phost->EnumState = ENUM_SET_ADDR; - - } - break; - - case ENUM_SET_ADDR: - /* set address */ - if ( USBH_SetAddress(phost, USBH_DEVICE_ADDRESS) == USBH_OK) - { - USBH_Delay(2); - phost->device.address = USBH_DEVICE_ADDRESS; - - /* user callback for device address assigned */ - USBH_UsrLog("Address (#%d) assigned.", phost->device.address); - phost->EnumState = ENUM_GET_CFG_DESC; - - /* modify control channels to update device address */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - } - break; - - case ENUM_GET_CFG_DESC: - /* get standard configuration descriptor */ - if ( USBH_Get_CfgDesc(phost, - USB_CONFIGURATION_DESC_SIZE) == USBH_OK) - { - phost->EnumState = ENUM_GET_FULL_CFG_DESC; - } - break; - - case ENUM_GET_FULL_CFG_DESC: - /* get FULL config descriptor (config, interface, endpoints) */ - if (USBH_Get_CfgDesc(phost, - phost->device.CfgDesc.wTotalLength) == USBH_OK) - { - phost->EnumState = ENUM_GET_MFC_STRING_DESC; - } - break; - - case ENUM_GET_MFC_STRING_DESC: - if (phost->device.DevDesc.iManufacturer != 0) - { /* Check that Manufacturer String is available */ - - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iManufacturer, - phost->device.Data , - 0xff) == USBH_OK) - { - /* User callback for Manufacturing string */ - USBH_UsrLog("Manufacturer : %s", (char *)phost->device.Data); - phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - } - else - { - USBH_UsrLog("Manufacturer : N/A"); - phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case ENUM_GET_PRODUCT_STRING_DESC: - if (phost->device.DevDesc.iProduct != 0) - { /* Check that Product string is available */ - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iProduct, - phost->device.Data, - 0xff) == USBH_OK) - { - /* User callback for Product string */ - USBH_UsrLog("Product : %s", (char *)phost->device.Data); - phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; - } - } - else - { - USBH_UsrLog("Product : N/A"); - phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case ENUM_GET_SERIALNUM_STRING_DESC: - if (phost->device.DevDesc.iSerialNumber != 0) - { /* Check that Serial number string is available */ - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iSerialNumber, - phost->device.Data, - 0xff) == USBH_OK) - { - /* User callback for Serial number string */ - USBH_UsrLog("Serial Number : %s", (char *)phost->device.Data); - Status = USBH_OK; - } - } - else - { - USBH_UsrLog("Serial Number : N/A"); - Status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - default: - break; - } - return Status; -} - -/** - * @brief USBH_LL_SetTimer - * Set the initial Host Timer tick - * @param phost: Host Handle - * @retval None - */ -void USBH_LL_SetTimer (USBH_HandleTypeDef *phost, uint32_t time) -{ - phost->Timer = time; -} -/** - * @brief USBH_LL_IncTimer - * Increment Host Timer tick - * @param phost: Host Handle - * @retval None - */ -void USBH_LL_IncTimer (USBH_HandleTypeDef *phost) -{ - phost->Timer ++; - USBH_HandleSof(phost); -} - -/** - * @brief USBH_HandleSof - * Call SOF process - * @param phost: Host Handle - * @retval None - */ -void USBH_HandleSof (USBH_HandleTypeDef *phost) -{ - if((phost->gState == HOST_CLASS)&&(phost->pActiveClass != NULL)) - { - phost->pActiveClass->SOFProcess(phost); - } -} -/** - * @brief USBH_LL_Connect - * Handle USB Host connexion event - * @param phost: Host Handle - * @retval USBH_Status - */ -USBH_StatusTypeDef USBH_LL_Connect (USBH_HandleTypeDef *phost) -{ - if(phost->gState == HOST_IDLE ) - { - phost->device.is_connected = 1; - - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_CONNECTION); - } - } - else if(phost->gState == HOST_DEV_WAIT_FOR_ATTACHMENT ) - { - phost->gState = HOST_DEV_ATTACHED ; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - return USBH_OK; -} - -/** - * @brief USBH_LL_Disconnect - * Handle USB Host disconnection event - * @param phost: Host Handle - * @retval USBH_Status - */ -USBH_StatusTypeDef USBH_LL_Disconnect (USBH_HandleTypeDef *phost) -{ - /*Stop Host */ - USBH_LL_Stop(phost); - - /* FRee Control Pipes */ - USBH_FreePipe (phost, phost->Control.pipe_in); - USBH_FreePipe (phost, phost->Control.pipe_out); - - phost->device.is_connected = 0; - - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_DISCONNECTION); - } - USBH_UsrLog("USB Device disconnected"); - - /* Start the low level driver */ - USBH_LL_Start(phost); - - phost->gState = HOST_DEV_DISCONNECTED; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - return USBH_OK; -} - - -#if (USBH_USE_OS == 1) -/** - * @brief USB Host Thread task - * @param pvParameters not used - * @retval None - */ -static void USBH_Process_OS(void const * argument) -{ - osEvent event; - - for(;;) - { - event = osMessageGet(((USBH_HandleTypeDef *)argument)->os_event, osWaitForever ); - - if( event.status == osEventMessage ) - { - USBH_Process((USBH_HandleTypeDef *)argument); - } - } -} - -/** -* @brief USBH_LL_NotifyURBChange -* Notify URB state Change -* @param phost: Host handle -* @retval USBH Status -*/ -USBH_StatusTypeDef USBH_LL_NotifyURBChange (USBH_HandleTypeDef *phost) -{ - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); - return USBH_OK; -} -#endif -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c deleted file mode 100644 index ee72d4d..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c +++ /dev/null @@ -1,881 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ctlreq.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the control requests for device enumeration - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_ctlreq.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CTLREQ -* @brief This file implements the standard requests for device enumeration -* @{ -*/ - - -/** @defgroup USBH_CTLREQ_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - - -/** @defgroup USBH_CTLREQ_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_Variables -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_CTLREQ_Private_FunctionPrototypes -* @{ -*/ -static USBH_StatusTypeDef USBH_HandleControl (USBH_HandleTypeDef *phost); - -static void USBH_ParseDevDesc (USBH_DevDescTypeDef* , uint8_t *buf, uint16_t length); - -static void USBH_ParseCfgDesc (USBH_CfgDescTypeDef* cfg_desc, - uint8_t *buf, - uint16_t length); - - -static void USBH_ParseEPDesc (USBH_EpDescTypeDef *ep_descriptor, uint8_t *buf); -static void USBH_ParseStringDesc (uint8_t* psrc, uint8_t* pdest, uint16_t length); -static void USBH_ParseInterfaceDesc (USBH_InterfaceDescTypeDef *if_descriptor, uint8_t *buf); - - -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_Functions -* @{ -*/ - - -/** - * @brief USBH_Get_DevDesc - * Issue Get Device Descriptor command to the device. Once the response - * received, it parses the device descriptor and updates the status. - * @param phost: Host Handle - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, uint8_t length) -{ - USBH_StatusTypeDef status; - - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_DEVICE, - phost->device.Data, - length)) == USBH_OK) - { - /* Commands successfully sent and Response Received */ - USBH_ParseDevDesc(&phost->device.DevDesc, phost->device.Data, length); - } - return status; -} - -/** - * @brief USBH_Get_CfgDesc - * Issues Configuration Descriptor to the device. Once the response - * received, it parses the configuration descriptor and updates the - * status. - * @param phost: Host Handle - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost, - uint16_t length) - -{ - USBH_StatusTypeDef status; - uint8_t *pData; -#if (USBH_KEEP_CFG_DESCRIPTOR == 1) - pData = phost->device.CfgDesc_Raw; -#else - pData = phost->device.Data; -#endif - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_CONFIGURATION, - pData, - length)) == USBH_OK) - { - - /* Commands successfully sent and Response Received */ - USBH_ParseCfgDesc (&phost->device.CfgDesc, - pData, - length); - - } - return status; -} - - -/** - * @brief USBH_Get_StringDesc - * Issues string Descriptor command to the device. Once the response - * received, it parses the string descriptor and updates the status. - * @param phost: Host Handle - * @param string_index: String index for the descriptor - * @param buff: Buffer address for the descriptor - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost, - uint8_t string_index, - uint8_t *buff, - uint16_t length) -{ - USBH_StatusTypeDef status; - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_STRING | string_index, - phost->device.Data, - length)) == USBH_OK) - { - /* Commands successfully sent and Response Received */ - USBH_ParseStringDesc(phost->device.Data,buff, length); - } - return status; -} - -/** - * @brief USBH_GetDescriptor - * Issues Descriptor command to the device. Once the response received, - * it parses the descriptor and updates the status. - * @param phost: Host Handle - * @param req_type: Descriptor type - * @param value_idx: Value for the GetDescriptr request - * @param buff: Buffer to store the descriptor - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, - uint8_t req_type, - uint16_t value_idx, - uint8_t* buff, - uint16_t length ) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_D2H | req_type; - phost->Control.setup.b.bRequest = USB_REQ_GET_DESCRIPTOR; - phost->Control.setup.b.wValue.w = value_idx; - - if ((value_idx & 0xff00) == USB_DESC_STRING) - { - phost->Control.setup.b.wIndex.w = 0x0409; - } - else - { - phost->Control.setup.b.wIndex.w = 0; - } - phost->Control.setup.b.wLength.w = length; - } - return USBH_CtlReq(phost, buff , length ); -} - -/** - * @brief USBH_SetAddress - * This command sets the address to the connected device - * @param phost: Host Handle - * @param DeviceAddress: Device address to assign - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetAddress(USBH_HandleTypeDef *phost, - uint8_t DeviceAddress) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE | \ - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_SET_ADDRESS; - - phost->Control.setup.b.wValue.w = (uint16_t)DeviceAddress; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_SetCfg - * The command sets the configuration value to the connected device - * @param phost: Host Handle - * @param cfg_idx: Configuration value - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetCfg(USBH_HandleTypeDef *phost, - uint16_t cfg_idx) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE |\ - USB_REQ_TYPE_STANDARD; - phost->Control.setup.b.bRequest = USB_REQ_SET_CONFIGURATION; - phost->Control.setup.b.wValue.w = cfg_idx; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - } - - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_SetInterface - * The command sets the Interface value to the connected device - * @param phost: Host Handle - * @param altSetting: Interface value - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, - uint8_t ep_num, uint8_t altSetting) -{ - - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_SET_INTERFACE; - phost->Control.setup.b.wValue.w = altSetting; - phost->Control.setup.b.wIndex.w = ep_num; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_ClrFeature - * This request is used to clear or disable a specific feature. - * @param phost: Host Handle - * @param ep_num: endpoint number - * @param hc_num: Host channel number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_ClrFeature(USBH_HandleTypeDef *phost, - uint8_t ep_num) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | - USB_REQ_RECIPIENT_ENDPOINT | - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_CLEAR_FEATURE; - phost->Control.setup.b.wValue.w = FEATURE_SELECTOR_ENDPOINT; - phost->Control.setup.b.wIndex.w = ep_num; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_ParseDevDesc - * This function Parses the device descriptor - * @param dev_desc: device_descriptor destination address - * @param buf: Buffer where the source descriptor is available - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseDevDesc (USBH_DevDescTypeDef* dev_desc, - uint8_t *buf, - uint16_t length) -{ - dev_desc->bLength = *(uint8_t *) (buf + 0); - dev_desc->bDescriptorType = *(uint8_t *) (buf + 1); - dev_desc->bcdUSB = LE16 (buf + 2); - dev_desc->bDeviceClass = *(uint8_t *) (buf + 4); - dev_desc->bDeviceSubClass = *(uint8_t *) (buf + 5); - dev_desc->bDeviceProtocol = *(uint8_t *) (buf + 6); - dev_desc->bMaxPacketSize = *(uint8_t *) (buf + 7); - - if (length > 8) - { /* For 1st time after device connection, Host may issue only 8 bytes for - Device Descriptor Length */ - dev_desc->idVendor = LE16 (buf + 8); - dev_desc->idProduct = LE16 (buf + 10); - dev_desc->bcdDevice = LE16 (buf + 12); - dev_desc->iManufacturer = *(uint8_t *) (buf + 14); - dev_desc->iProduct = *(uint8_t *) (buf + 15); - dev_desc->iSerialNumber = *(uint8_t *) (buf + 16); - dev_desc->bNumConfigurations = *(uint8_t *) (buf + 17); - } -} - -/** - * @brief USBH_ParseCfgDesc - * This function Parses the configuration descriptor - * @param cfg_desc: Configuration Descriptor address - * @param buf: Buffer where the source descriptor is available - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseCfgDesc (USBH_CfgDescTypeDef* cfg_desc, - uint8_t *buf, - uint16_t length) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_EpDescTypeDef *pep; - USBH_DescHeader_t *pdesc = (USBH_DescHeader_t *)buf; - uint16_t ptr; - int8_t if_ix = 0; - int8_t ep_ix = 0; - - pdesc = (USBH_DescHeader_t *)buf; - - /* Parse configuration descriptor */ - cfg_desc->bLength = *(uint8_t *) (buf + 0); - cfg_desc->bDescriptorType = *(uint8_t *) (buf + 1); - cfg_desc->wTotalLength = LE16 (buf + 2); - cfg_desc->bNumInterfaces = *(uint8_t *) (buf + 4); - cfg_desc->bConfigurationValue = *(uint8_t *) (buf + 5); - cfg_desc->iConfiguration = *(uint8_t *) (buf + 6); - cfg_desc->bmAttributes = *(uint8_t *) (buf + 7); - cfg_desc->bMaxPower = *(uint8_t *) (buf + 8); - - - if (length > USB_CONFIGURATION_DESC_SIZE) - { - ptr = USB_LEN_CFG_DESC; - pif = (USBH_InterfaceDescTypeDef *)0; - - - while ((if_ix < USBH_MAX_NUM_INTERFACES ) && (ptr < cfg_desc->wTotalLength)) - { - pdesc = USBH_GetNextDesc((uint8_t *)pdesc, &ptr); - if (pdesc->bDescriptorType == USB_DESC_TYPE_INTERFACE) - { - pif = &cfg_desc->Itf_Desc[if_ix]; - USBH_ParseInterfaceDesc (pif, (uint8_t *)pdesc); - - ep_ix = 0; - pep = (USBH_EpDescTypeDef *)0; - while ((ep_ix < pif->bNumEndpoints) && (ptr < cfg_desc->wTotalLength)) - { - pdesc = USBH_GetNextDesc((uint8_t*) pdesc, &ptr); - if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) - { - pep = &cfg_desc->Itf_Desc[if_ix].Ep_Desc[ep_ix]; - USBH_ParseEPDesc (pep, (uint8_t *)pdesc); - ep_ix++; - } - } - if_ix++; - } - } - } -} - - - -/** - * @brief USBH_ParseInterfaceDesc - * This function Parses the interface descriptor - * @param if_descriptor : Interface descriptor destination - * @param buf: Buffer where the descriptor data is available - * @retval None - */ -static void USBH_ParseInterfaceDesc (USBH_InterfaceDescTypeDef *if_descriptor, - uint8_t *buf) -{ - if_descriptor->bLength = *(uint8_t *) (buf + 0); - if_descriptor->bDescriptorType = *(uint8_t *) (buf + 1); - if_descriptor->bInterfaceNumber = *(uint8_t *) (buf + 2); - if_descriptor->bAlternateSetting = *(uint8_t *) (buf + 3); - if_descriptor->bNumEndpoints = *(uint8_t *) (buf + 4); - if_descriptor->bInterfaceClass = *(uint8_t *) (buf + 5); - if_descriptor->bInterfaceSubClass = *(uint8_t *) (buf + 6); - if_descriptor->bInterfaceProtocol = *(uint8_t *) (buf + 7); - if_descriptor->iInterface = *(uint8_t *) (buf + 8); -} - -/** - * @brief USBH_ParseEPDesc - * This function Parses the endpoint descriptor - * @param ep_descriptor: Endpoint descriptor destination address - * @param buf: Buffer where the parsed descriptor stored - * @retval None - */ -static void USBH_ParseEPDesc (USBH_EpDescTypeDef *ep_descriptor, - uint8_t *buf) -{ - - ep_descriptor->bLength = *(uint8_t *) (buf + 0); - ep_descriptor->bDescriptorType = *(uint8_t *) (buf + 1); - ep_descriptor->bEndpointAddress = *(uint8_t *) (buf + 2); - ep_descriptor->bmAttributes = *(uint8_t *) (buf + 3); - ep_descriptor->wMaxPacketSize = LE16 (buf + 4); - ep_descriptor->bInterval = *(uint8_t *) (buf + 6); -} - -/** - * @brief USBH_ParseStringDesc - * This function Parses the string descriptor - * @param psrc: Source pointer containing the descriptor data - * @param pdest: Destination address pointer - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseStringDesc (uint8_t* psrc, - uint8_t* pdest, - uint16_t length) -{ - uint16_t strlength; - uint16_t idx; - - /* The UNICODE string descriptor is not NULL-terminated. The string length is - computed by substracting two from the value of the first byte of the descriptor. - */ - - /* Check which is lower size, the Size of string or the length of bytes read - from the device */ - - if ( psrc[1] == USB_DESC_TYPE_STRING) - { /* Make sure the Descriptor is String Type */ - - /* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */ - strlength = ( ( (psrc[0]-2) <= length) ? (psrc[0]-2) :length); - psrc += 2; /* Adjust the offset ignoring the String Len and Descriptor type */ - - for (idx = 0; idx < strlength; idx+=2 ) - {/* Copy Only the string and ignore the UNICODE ID, hence add the src */ - *pdest = psrc[idx]; - pdest++; - } - *pdest = 0; /* mark end of string */ - } -} - -/** - * @brief USBH_GetNextDesc - * This function return the next descriptor header - * @param buf: Buffer where the cfg descriptor is available - * @param ptr: data pointer inside the cfg descriptor - * @retval next header - */ -USBH_DescHeader_t *USBH_GetNextDesc (uint8_t *pbuf, uint16_t *ptr) -{ - USBH_DescHeader_t *pnext; - - *ptr += ((USBH_DescHeader_t *)pbuf)->bLength; - pnext = (USBH_DescHeader_t *)((uint8_t *)pbuf + \ - ((USBH_DescHeader_t *)pbuf)->bLength); - - return(pnext); -} - - -/** - * @brief USBH_CtlReq - * USBH_CtlReq sends a control request and provide the status after - * completion of the request - * @param phost: Host Handle - * @param req: Setup Request Structure - * @param buff: data buffer address to store the response - * @param length: length of the response - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlReq (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length) -{ - USBH_StatusTypeDef status; - status = USBH_BUSY; - - switch (phost->RequestState) - { - case CMD_SEND: - /* Start a SETUP transfer */ - phost->Control.buff = buff; - phost->Control.length = length; - phost->Control.state = CTRL_SETUP; - phost->RequestState = CMD_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - break; - - case CMD_WAIT: - status = USBH_HandleControl(phost); - if (status == USBH_OK) - { - /* Commands successfully sent and Response Received */ - phost->RequestState = CMD_SEND; - phost->Control.state =CTRL_IDLE; - status = USBH_OK; - } - else if (status == USBH_FAIL) - { - /* Failure Mode */ - phost->RequestState = CMD_SEND; - status = USBH_FAIL; - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_HandleControl - * Handles the USB control transfer state machine - * @param phost: Host Handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HandleControl (USBH_HandleTypeDef *phost) -{ - uint8_t direction; - USBH_StatusTypeDef status = USBH_BUSY; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - - switch (phost->Control.state) - { - case CTRL_SETUP: - /* send a SETUP packet */ - USBH_CtlSendSetup (phost, - (uint8_t *)phost->Control.setup.d8 , - phost->Control.pipe_out); - - phost->Control.state = CTRL_SETUP_WAIT; - break; - - case CTRL_SETUP_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, phost->Control.pipe_out); - /* case SETUP packet sent successfully */ - if(URB_Status == USBH_URB_DONE) - { - direction = (phost->Control.setup.b.bmRequestType & USB_REQ_DIR_MASK); - - /* check if there is a data stage */ - if (phost->Control.setup.b.wLength.w != 0 ) - { - if (direction == USB_D2H) - { - /* Data Direction is IN */ - phost->Control.state = CTRL_DATA_IN; - } - else - { - /* Data Direction is OUT */ - phost->Control.state = CTRL_DATA_OUT; - } - } - /* No DATA stage */ - else - { - /* If there is No Data Transfer Stage */ - if (direction == USB_D2H) - { - /* Data Direction is IN */ - phost->Control.state = CTRL_STATUS_OUT; - } - else - { - /* Data Direction is OUT */ - phost->Control.state = CTRL_STATUS_IN; - } - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_DATA_IN: - /* Issue an IN token */ - phost->Control.timer = phost->Timer; - USBH_CtlReceiveData(phost, - phost->Control.buff, - phost->Control.length, - phost->Control.pipe_in); - - phost->Control.state = CTRL_DATA_IN_WAIT; - break; - - case CTRL_DATA_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_in); - - /* check is DATA packet transferred successfully */ - if (URB_Status == USBH_URB_DONE) - { - phost->Control.state = CTRL_STATUS_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - /* manage error cases*/ - if (URB_Status == USBH_URB_STALL) - { - /* In stall case, return to previous machine state*/ - status = USBH_NOT_SUPPORTED; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - /* Device error */ - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_DATA_OUT: - - USBH_CtlSendData (phost, - phost->Control.buff, - phost->Control.length , - phost->Control.pipe_out, - 1); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_DATA_OUT_WAIT; - break; - - case CTRL_DATA_OUT_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_out); - - if (URB_Status == USBH_URB_DONE) - { /* If the Setup Pkt is sent successful, then change the state */ - phost->Control.state = CTRL_STATUS_IN; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - /* handle error cases */ - else if (URB_Status == USBH_URB_STALL) - { - /* In stall case, return to previous machine state*/ - phost->Control.state = CTRL_STALLED; - status = USBH_NOT_SUPPORTED; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_NOTREADY) - { - /* Nack received from device */ - phost->Control.state = CTRL_DATA_OUT; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - /* device error */ - phost->Control.state = CTRL_ERROR; - status = USBH_FAIL; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - - case CTRL_STATUS_IN: - /* Send 0 bytes out packet */ - USBH_CtlReceiveData (phost, - 0, - 0, - phost->Control.pipe_in); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_STATUS_IN_WAIT; - - break; - - case CTRL_STATUS_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_in); - - if ( URB_Status == USBH_URB_DONE) - { /* Control transfers completed, Exit the State Machine */ - phost->Control.state = CTRL_COMPLETE; - status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - else if (URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - /* Control transfers completed, Exit the State Machine */ - status = USBH_NOT_SUPPORTED; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_STATUS_OUT: - USBH_CtlSendData (phost, - 0, - 0, - phost->Control.pipe_out, - 1); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_STATUS_OUT_WAIT; - break; - - case CTRL_STATUS_OUT_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_out); - if (URB_Status == USBH_URB_DONE) - { - status = USBH_OK; - phost->Control.state = CTRL_COMPLETE; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_NOTREADY) - { - phost->Control.state = CTRL_STATUS_OUT; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_ERROR: - /* - After a halt condition is encountered or an error is detected by the - host, a control endpoint is allowed to recover by accepting the next Setup - PID; i.e., recovery actions via some other pipe are not required for control - endpoints. For the Default Control Pipe, a device reset will ultimately be - required to clear the halt or error condition if the next Setup PID is not - accepted. - */ - if (++ phost->Control.errorcount <= USBH_MAX_ERROR_COUNT) - { - /* try to recover control */ - USBH_LL_Stop(phost); - - /* Do the transmission again, starting from SETUP Packet */ - phost->Control.state = CTRL_SETUP; - phost->RequestState = CMD_SEND; - } - else - { - phost->pUser(phost, HOST_USER_UNRECOVERED_ERROR); - phost->Control.errorcount = 0; - USBH_ErrLog("Control error"); - status = USBH_FAIL; - } - break; - - default: - break; - } - return status; -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c deleted file mode 100644 index 1cb1eb3..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c +++ /dev/null @@ -1,358 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ioreq.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file handles the issuing of the USB transactions - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_ioreq.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_IOREQ - * @brief This file handles the standard protocol processing (USB v2.0) - * @{ - */ - - -/** @defgroup USBH_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBH_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_Variables - * @{ - */ -/** - * @} - */ -/** @defgroup USBH_IOREQ_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_Functions - * @{ - */ - - - -/** - * @brief USBH_CtlSendSetup - * Sends the Setup Packet to the Device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be send to Device - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlSendSetup (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t pipe_num) -{ - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_SETUP, /* Type setup */ - buff, /* data buffer */ - USBH_SETUP_PKT_SIZE, /* data length */ - 0); - return USBH_OK; -} - - -/** - * @brief USBH_CtlSendData - * Sends a data Packet to the Device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be sent to Device - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num, - uint8_t do_ping ) -{ - if(phost->device.speed != USBH_SPEED_HIGH) - { - do_ping = 0; - } - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - do_ping); /* do ping (HS Only)*/ - - return USBH_OK; -} - - -/** - * @brief USBH_CtlReceiveData - * Receives the Device Response to the Setup Packet - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, - uint8_t* buff, - uint16_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - return USBH_OK; - -} - - -/** - * @brief USBH_BulkSendData - * Sends the Bulk Packet to the device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be sent to Device - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_BulkSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num, - uint8_t do_ping ) -{ - if(phost->device.speed != USBH_SPEED_HIGH) - { - do_ping = 0; - } - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : IN */ - USBH_EP_BULK, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - do_ping); /* do ping (HS Only)*/ - return USBH_OK; -} - - -/** - * @brief USBH_BulkReceiveData - * Receives IN bulk packet from device - * @param phost: Host Handle - * @param buff: Buffer pointer in which the received data packet to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_BULK, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - return USBH_OK; -} - - -/** - * @brief USBH_InterruptReceiveData - * Receives the Device Response to the Interrupt IN token - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_INTERRUPT, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} - -/** - * @brief USBH_InterruptSendData - * Sends the data on Interrupt OUT Endpoint - * @param phost: Host Handle - * @param buff: Buffer pointer from where the data needs to be copied - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_INTERRUPT, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} - -/** - * @brief USBH_IsocReceiveData - * Receives the Device Response to the Isochronous IN token - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_ISO, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - - return USBH_OK; -} - -/** - * @brief USBH_IsocSendData - * Sends the data on Isochronous OUT Endpoint - * @param phost: Host Handle - * @param buff: Buffer pointer from where the data needs to be copied - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_ISO, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c b/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c deleted file mode 100644 index 4f235cb..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c +++ /dev/null @@ -1,204 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_pipes.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements functions for opening and closing Pipes - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_pipes.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_PIPES - * @brief This file includes opening and closing Pipes - * @{ - */ - -/** @defgroup USBH_PIPES_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_PIPES_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_PIPES_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_PIPES_Private_Functions - * @{ - */ -static uint16_t USBH_GetFreePipe (USBH_HandleTypeDef *phost); - - -/** - * @brief USBH_Open_Pipe - * Open a pipe - * @param phost: Host Handle - * @param pipe_num: Pipe Number - * @param dev_address: USB Device address allocated to attached device - * @param speed : USB device speed (Full/Low) - * @param ep_type: end point type (Bulk/int/ctl) - * @param mps: max pkt size - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - - USBH_LL_OpenPipe(phost, - pipe_num, - epnum, - dev_address, - speed, - ep_type, - mps); - - return USBH_OK; - -} - -/** - * @brief USBH_ClosePipe - * Close a pipe - * @param phost: Host Handle - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_ClosePipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num) -{ - - USBH_LL_ClosePipe(phost, pipe_num); - - return USBH_OK; - -} - -/** - * @brief USBH_Alloc_Pipe - * Allocate a new Pipe - * @param phost: Host Handle - * @param ep_addr: End point for which the Pipe to be allocated - * @retval Pipe number - */ -uint8_t USBH_AllocPipe (USBH_HandleTypeDef *phost, uint8_t ep_addr) -{ - uint16_t pipe; - - pipe = USBH_GetFreePipe(phost); - - if (pipe != 0xFFFF) - { - phost->Pipes[pipe] = 0x8000 | ep_addr; - } - return pipe; -} - -/** - * @brief USBH_Free_Pipe - * Free the USB Pipe - * @param phost: Host Handle - * @param idx: Pipe number to be freed - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_FreePipe (USBH_HandleTypeDef *phost, uint8_t idx) -{ - if(idx < 11) - { - phost->Pipes[idx] &= 0x7FFF; - } - return USBH_OK; -} - -/** - * @brief USBH_GetFreePipe - * @param phost: Host Handle - * Get a free Pipe number for allocation to a device endpoint - * @retval idx: Free Pipe number - */ -static uint16_t USBH_GetFreePipe (USBH_HandleTypeDef *phost) -{ - uint8_t idx = 0; - - for (idx = 0 ; idx < 11 ; idx++) - { - if ((phost->Pipes[idx] & 0x8000) == 0) - { - return idx; - } - } - return 0xFFFF; -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/system/Middlewares/ST/STM32_USB_Host_Library/Release_Notes.html b/system/Middlewares/ST/STM32_USB_Host_Library/Release_Notes.html deleted file mode 100644 index ce52ddf..0000000 --- a/system/Middlewares/ST/STM32_USB_Host_Library/Release_Notes.html +++ /dev/null @@ -1,1194 +0,0 @@ - - - - - - - - - - - - - -Release Notes for STM32 USB Host Library - - - - - - - - - -
- -

 

- -
- - - - - -
- - - - - - - -
-

Back to Release page

-
-

Release Notes for STM32 USB Host Library

-

Copyright - 2015 STMicroelectronics

-

-
-

 

- - - - -
-

Update History

V3.2.2 / 07-July-2015
-

- - - - - - - - - - - - - - - -

Main -Changes

- - - - - - - - - - - - - - - - - - - -
  • MSC Class
    • usbh_msc.c
      • Fix MSC Get Ready Delay issue

V3.2.1 / 26-June-2015
-

- - - - - - - - - - - - - - - -

Main -Changes

- - - - - - - - - - - - - - - - - - - -
    -
  • Core driver
  • -
      -
    • usbh_def.h: -update USBH_MAX_PIPES_NBR literal definition to be conditioned by -#ifndef directive, to allow application code to change its value (i.e. -in the compiler preprocessor)
      -
    • -
    -
  • MSC Class
  • -
      -
    • usbh_msc.c
    • -
        -
      • Update USBH_MSC_GetMaxLUN() to  return the correct number of supported LUNs (was returning 0xFF)
      • -
      • Fix timeout calculation issue
      • -
      - -
    -
      -
    • usbh_msc.h: -update MAX_SUPPORTED_LUN literal definition to be conditioned by -#ifndef directive, to allow application code to change its value -(i.e.in the compiler preprocessor)
    • -
    -
  • HID Class
  • -
      -
    • usbh_hid.h: fix HID's handle “timer” type to uint32_t instead of uint16_t
    -
  • MTP Class
  • -
      -
    • usbh_mtp.c : Fix timeout calculation issue
    • - - -
    - -
- -

V3.2.0 / 04-November-2014
-

- - - - - - - - - - - - - -

Main -Changes

- - - - - - - - - - - - - - - - - -
    -
  • Update all drivers to be C++ compliant
    -
  • -
  • Core driver
  • -
      -
    • usbh_core.c: remove HOST_IDLE state in USBH_LL_Connect() function
      -
    • -
    -
  • MSC class
  • -
      -
    • Update to manage correctly older USB Keys that do not support GetMaxLun request
    • -
    -
  • Miscellaneous source code comments update
  • -
- -

V3.1.0 / 19-June-2014

- - - - - -

Main -Changes

- - - - - - - - - -
    -
  • Core driver
  • -
      -
    • Add a new define USBH_PROCESS_STACK_SIZE in the usbh_conf.h -file to change the default internal USB host process stack. Note that -by omitting this define, the default stack size (2KB) is used
      -
    • -
    • Add a user callback to handle unrecoverable error case in the application
    • -
    -
      -
    • Remove the wrong check on the interface descriptor index in the USBH_FindInterface() function
      -
    • -
    -
  • All classes
  • -
      -
    • Update class description in files comment by adding reference to the used USB class specification revision
    • -
    -
  • Audio, CDC and MTP classes
    -
  • -
      -
    • Add full RTOS support by handling state transitions through OS messages
      -
    • -
    -
  • HID class
  • -
      -
    • Add new API USBH_HID_GetPollInterval() to allow user to retrieve the needed poll time (interval between two USBD_HID_SendReport())
    • -
    -
  • Audio class
  • -
      -
    • Add a new weak callback USBH_AUDIO_BufferEmptyCallback() to indicate the end of audio data processing on the user buffer
    • -
    -
  • MSC class
  • -
      -
    • Return mass storage device capacity in Bytes in the user log message instead of MBytes
    • -
    -
- - - -

V3.0.0 / 18-February-2014

- - - -

Main -Changes

- - - - - - - -
    -
  • Major update -based on STM32Cube specification: Library Core, Classes architecture and APIs -modified vs. V2.1.0, and thus the 2 versions are not compatible.
    -
  • -
  • This version has to be used only with STM32Cube based development
  • -
-

V2.1.0 / 19-March-2012

-

Main -Changes

- -
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet
  • Add ISR structure to link the low level driver to the Host library
  • Change length parameter in the I/O operations to handle large amount of data
  • Enhance the configuration descriptor parsing method to take into account multi interface devices
  • HID class
    • Remove blocking even frame synchronization loop
  • MSC class
    • Handle correctly the BOT transfer with length < max length
    • Handle multi sector length data in the FAT FS interface
  • Miscellaneous bug fix

V2.0.0 / 22-July-2011

Main -Changes

-
  • Second official version supporting STM32F105/7 and STM32F2xx devices
  • Add support for STM32F2xx devices
  • Add multi interface feature
  • Add dynamic configuration parsing
  • Add -USBH_DeAllocate_AllChannel function in the Host channel management -layer to clean up channels allocation table when de-initializing the -library
  • Change the core layer to stop correctly the host core and free all allocated channels
  • Add usbh_conf.h file in the application layer to customize some user parameters

V1.0.0 - 11/29/2010

-
  • Created 

License

-

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


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.
-
-
-
-

For - complete documentation on STM32 - Microcontrollers visit www.st.com/STM32

-
-

-
- -
- -

 

- -
- - \ No newline at end of file diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c b/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c deleted file mode 100644 index cb16735..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c +++ /dev/null @@ -1,199 +0,0 @@ -/** - ****************************************************************************** - * @file sd_diskio.c - * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 - * @brief SD Disk I/O driver - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include -#include "ff_gen_drv.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Block Size in Bytes */ -#define BLOCK_SIZE 512 - -/* Private variables ---------------------------------------------------------*/ -/* Disk status */ -static volatile DSTATUS Stat = STA_NOINIT; - -/* Private function prototypes -----------------------------------------------*/ -DSTATUS SD_initialize (BYTE); -DSTATUS SD_status (BYTE); -DRESULT SD_read (BYTE, BYTE*, DWORD, UINT); -#if _USE_WRITE == 1 - DRESULT SD_write (BYTE, const BYTE*, DWORD, UINT); -#endif /* _USE_WRITE == 1 */ -#if _USE_IOCTL == 1 - DRESULT SD_ioctl (BYTE, BYTE, void*); -#endif /* _USE_IOCTL == 1 */ - -const Diskio_drvTypeDef SD_Driver = -{ - SD_initialize, - SD_status, - SD_read, -#if _USE_WRITE == 1 - SD_write, -#endif /* _USE_WRITE == 1 */ - -#if _USE_IOCTL == 1 - SD_ioctl, -#endif /* _USE_IOCTL == 1 */ -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Initializes a Drive - * @param lun : not used - * @retval DSTATUS: Operation status - */ -DSTATUS SD_initialize(BYTE lun) -{ - Stat = STA_NOINIT; - - /* Configure the uSD device */ - if(BSP_SD_Init() == MSD_OK) - { - Stat &= ~STA_NOINIT; - } - - return Stat; -} - -/** - * @brief Gets Disk Status - * @param lun : not used - * @retval DSTATUS: Operation status - */ -DSTATUS SD_status(BYTE lun) -{ - Stat = STA_NOINIT; - - if(BSP_SD_GetStatus() == MSD_OK) - { - Stat &= ~STA_NOINIT; - } - - return Stat; -} - -/** - * @brief Reads Sector(s) - * @param lun : not used - * @param *buff: Data buffer to store read data - * @param sector: Sector address (LBA) - * @param count: Number of sectors to read (1..128) - * @retval DRESULT: Operation result - */ -DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count) -{ - DRESULT res = RES_OK; - - if(BSP_SD_ReadBlocks((uint32_t*)buff, - (uint64_t) (sector * BLOCK_SIZE), - BLOCK_SIZE, - count) != MSD_OK) - { - res = RES_ERROR; - } - - return res; -} - -/** - * @brief Writes Sector(s) - * @param lun : not used - * @param *buff: Data to be written - * @param sector: Sector address (LBA) - * @param count: Number of sectors to write (1..128) - * @retval DRESULT: Operation result - */ -#if _USE_WRITE == 1 -DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count) -{ - DRESULT res = RES_OK; - - if(BSP_SD_WriteBlocks((uint32_t*)buff, - (uint64_t)(sector * BLOCK_SIZE), - BLOCK_SIZE, count) != MSD_OK) - { - res = RES_ERROR; - } - - return res; -} -#endif /* _USE_WRITE == 1 */ - -/** - * @brief I/O control operation - * @param lun : not used - * @param cmd: Control code - * @param *buff: Buffer to send/receive control data - * @retval DRESULT: Operation result - */ -#if _USE_IOCTL == 1 -DRESULT SD_ioctl(BYTE lun, BYTE cmd, void *buff) -{ - DRESULT res = RES_ERROR; - SD_CardInfo CardInfo; - - if (Stat & STA_NOINIT) return RES_NOTRDY; - - switch (cmd) - { - /* Make sure that no pending write process */ - case CTRL_SYNC : - res = RES_OK; - break; - - /* Get number of sectors on the disk (DWORD) */ - case GET_SECTOR_COUNT : - BSP_SD_GetCardInfo(&CardInfo); - *(DWORD*)buff = CardInfo.CardCapacity / BLOCK_SIZE; - res = RES_OK; - break; - - /* Get R/W sector size (WORD) */ - case GET_SECTOR_SIZE : - *(WORD*)buff = BLOCK_SIZE; - res = RES_OK; - break; - - /* Get erase block size in unit of sector (DWORD) */ - case GET_BLOCK_SIZE : - *(DWORD*)buff = BLOCK_SIZE; - break; - - default: - res = RES_PARERR; - } - - return res; -} -#endif /* _USE_IOCTL == 1 */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.h b/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.h deleted file mode 100644 index bdf9d65..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file sd_diskio.h - * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 - * @brief Header for sd_diskio.c module - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SD_DISKIO_H -#define __SD_DISKIO_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern Diskio_drvTypeDef SD_Driver; - -#endif /* __SD_DISKIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.h b/system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.h deleted file mode 100644 index e40e2c0..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sdram_diskio.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file sdram_diskio.h - * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 - * @brief Header for sdram_diskio.c module - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SDRAM_DISKIO_H -#define __SDRAM_DISKIO_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern Diskio_drvTypeDef SDRAMDISK_Driver; - -#endif /* __SDRAM_DISKIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.h b/system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.h deleted file mode 100644 index 67c07ba..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/sram_diskio.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file sram_diskio.h - * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 - * @brief Header for sram_diskio.c module - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SRAM_DISKIO_H -#define __SRAM_DISKIO_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern Diskio_drvTypeDef SRAMDISK_Driver; - -#endif /* __SRAM_DISKIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.h b/system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.h deleted file mode 100644 index da3ae31..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_diskio.h - * @author MCD Application Team - * @version V1.3.0 - * @date 08-May-2015 - * @brief Header for usbh_diskio.c module - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (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.st.com/software_license_agreement_liberty_v2 - * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBH_DISKIO_H -#define __USBH_DISKIO_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern Diskio_drvTypeDef USBH_Driver; - -#endif /* __USBH_DISKIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/system/Middlewares/Third_Party/FatFs/src/option/unicode.c b/system/Middlewares/Third_Party/FatFs/src/option/unicode.c deleted file mode 100644 index 170e2e0..0000000 --- a/system/Middlewares/Third_Party/FatFs/src/option/unicode.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "../ff.h" - -#if _USE_LFN != 0 - -#if _CODE_PAGE == 932 /* Japanese Shift_JIS */ -#include "cc932.c" -#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ -#include "cc936.c" -#elif _CODE_PAGE == 949 /* Korean */ -#include "cc949.c" -#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ -#include "cc950.c" -#else /* Single Byte Character-Set */ -#include "ccsbcs.c" -#endif - -#endif diff --git a/variants/otto/system_stm32f4xx.c b/system/STM32F4xx/system_stm32f4xx.c similarity index 63% rename from variants/otto/system_stm32f4xx.c rename to system/STM32F4xx/system_stm32f4xx.c index b00227b..9f7bc75 100644 --- a/variants/otto/system_stm32f4xx.c +++ b/system/STM32F4xx/system_stm32f4xx.c @@ -1,603 +1,773 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.c - * @author MCD Application Team - * @version V1.0.1 - * @date 09-October-2015 - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - -#include "stm32f4xx.h" - -#if !defined (HSE_VALUE) -#if defined(USE_STM32469I_DISCO_REVA) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#else - #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz */ -#endif /* USE_STM32469I_DISCO_REVA */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412xG) -/* #define DATA_IN_ExtSRAM */ -#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -/* #define DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ - STM32F479xx */ - -#if defined(DATA_IN_ExtSRAM) && defined(DATA_IN_ExtSDRAM) - #error "Please select DATA_IN_ExtSRAM or DATA_IN_ExtSDRAM " -#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ -uint32_t SystemCoreClock = 18000000; -const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the FPU setting, vector table location and External memory - * configuration. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value - * depends on the application requirements), user has to ensure that HSE_VALUE - * is same as the real frequency of the crystal used. Otherwise, this function - * may have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external memories (SRAM/SDRAM) - * This SRAM/SDRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register uint32_t index; - -#if defined(STM32F446xx) - /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface - clock */ - RCC->AHB1ENR |= 0x0000007D; -#else - /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface - clock */ - RCC->AHB1ENR |= 0x000001F8; -#endif /* STM32F446xx */ - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(HAL_RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - /* Connect PAx pins to FMC Alternate function */ - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOA->MODER |= 0x00008000; - /* Configure PDx pins speed to 50 MHz */ - GPIOA->OSPEEDR |= 0x00008000; - /* Configure PDx pins Output type to push-pull */ - GPIOA->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOA->PUPDR |= 0x00000000; - - /* Connect PCx pins to FMC Alternate function */ - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - /* Configure PDx pins in Alternate function mode */ - GPIOC->MODER |= 0x00000A00; - /* Configure PDx pins speed to 50 MHz */ - GPIOC->OSPEEDR |= 0x00000A00; - /* Configure PDx pins Output type to push-pull */ - GPIOC->OTYPER |= 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOC->PUPDR |= 0x00000000; -#endif /* STM32F446xx */ - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xA02A000A; - /* Configure PDx pins speed to 50 MHz */ - GPIOD->OSPEEDR = 0xA02A000A; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA800A; - /* Configure PEx pins speed to 50 MHz */ - GPIOE->OSPEEDR = 0xAAAA800A; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA800AAA; - /* Configure PFx pins speed to 50 MHz */ - GPIOF->OSPEEDR = 0xAA800AAA; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0xAAAAAAAA; - /* Configure PGx pins speed to 50 MHz */ - GPIOG->OSPEEDR = 0xAAAAAAAA; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - /* Connect PHx pins to FMC Alternate function */ - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - /* Configure PHx pins in Alternate function mode */ - GPIOH->MODER = 0xAAAA08A0; - /* Configure PHx pins speed to 50 MHz */ - GPIOH->OSPEEDR = 0xAAAA08A0; - /* Configure PHx pins Output type to push-pull */ - GPIOH->OTYPER = 0x00000000; - /* No pull-up, pull-down for PHx pins */ - GPIOH->PUPDR = 0x00000000; - - /* Connect PIx pins to FMC Alternate function */ - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - /* Configure PIx pins in Alternate function mode */ - GPIOI->MODER = 0x0028AAAA; - /* Configure PIx pins speed to 50 MHz */ - GPIOI->OSPEEDR = 0x0028AAAA; - /* Configure PIx pins Output type to push-pull */ - GPIOI->OTYPER = 0x00000000; - /* No pull-up, pull-down for PIx pins */ - GPIOI->PUPDR = 0x00000000; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ - -/*-- FMC Configuration -------------------------------------------------------*/ - /* Enable the FMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(HAL_RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - /* Configure and enable SDRAM bank1 */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif /* STM32F446xx */ - FMC_Bank5_6->SDTR[0] = 0x01115351; - - /* SDRAM initialization sequence */ - /* Clock enable command */ - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Delay */ - for (index = 0; index<1000; index++); - - /* PALL command */ - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Auto refresh command */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* MRD register program */ -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif /* STM32F446xx */ - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - /* Set refresh count */ - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif /* STM32F446xx */ - - /* Disable write protection */ - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif /* DATA_IN_ExtSDRAM */ -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412xG) - -#if defined(DATA_IN_ExtSRAM) -/*-- GPIOs Configuration -----------------------------------------------------*/ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR |= 0x00000078; - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(HAL_RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - /* Connect PDx pins to FMC Alternate function */ - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xAAAA0A8A; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xFFFF0FCF; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FMC Alternate function */ - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xAAAA828A; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xFFFFC3CF; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FMC Alternate function */ - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xAA000AAA; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xFF000FFF; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FMC Alternate function */ - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00085AAA; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000CAFFF; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - -/*-- FMC/FSMC Configuration --------------------------------------------------*/ - /* Enable the FMC/FSMC interface clock */ - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ -#if defined(STM32F469xx) || defined(STM32F479xx) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - /* Configure and enable Bank1_SRAM2 */ - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif /* STM32F469xx || STM32F479xx */ -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) || defined(STM32F412xG) - /* Delay after an RCC peripheral clock enabling */ - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412xG */ - -#endif /* DATA_IN_ExtSRAM */ -#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ - STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412xG */ - (void)(tmp); -} -#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V2.6.1 + * @date 14-February-2017 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +void enterSysROM(void); + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = F_CPU; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* Check if we are coming from a DFU enter request (see usbd_cdc_if.c) + * This MUST be done before any other board configuration + */ + if(*((unsigned int*)0x2004FFF0) == 0xb311a21a) { + *((unsigned int*)0x2004FFF0) = 0; + enterSysROM(); + } + + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/system/libstm32f4/build_gcc/.gitignore b/system/libstm32f4/build_gcc/.gitignore deleted file mode 100644 index 6b58f01..0000000 --- a/system/libstm32f4/build_gcc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -release_* diff --git a/system/libstm32f4/build_gcc/Makefile b/system/libstm32f4/build_gcc/Makefile deleted file mode 100644 index 7831467..0000000 --- a/system/libstm32f4/build_gcc/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Makefile for compiling libchip - -SUBMAKE_OPTIONS=--no-builtin-rules --no-builtin-variables --no-print-directory - -#------------------------------------------------------------------------------- -# Rules -#------------------------------------------------------------------------------- - -all : otto - -.PHONY: all -otto: - @echo ------------------------------------------------------------------------ - @echo --- Making $@ - @echo --- - @$(MAKE) CHIP=STM32F469xx LIBNAME=libstm32f4 CHIP_NAME=stm32F469bi VARIANTS_PATH=../../../variants/otto $(SUBMAKE_OPTIONS) -f stm32f4.mk - @echo ------------------------------------------------------------------------ - -.PHONY: clean -clean: - @echo ------------------------------------------------------------------------ - @echo --- Cleaning lib release and debug - @$(MAKE) CHIP=STM32F469xx LIBNAME=libstm32f4 CHIP_NAME=stm32F469bi VARIANTS_PATH=../../../variants/otto $(SUBMAKE_OPTIONS) -f stm32f4.mk $@ - @echo ------------------------------------------------------------------------ diff --git a/system/libstm32f4/build_gcc/debug.mk b/system/libstm32f4/build_gcc/debug.mk deleted file mode 100644 index d071674..0000000 --- a/system/libstm32f4/build_gcc/debug.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Optimization level -# -O1 Optimize -# -O2 Optimize even more -# -O3 Optimize yet more -# -O0 Reduce compilation time and make debugging produce the expected results -# -Os Optimize for size -OPTIMIZATION = -g -O0 -DDEBUG diff --git a/system/libstm32f4/build_gcc/gcc.mk b/system/libstm32f4/build_gcc/gcc.mk deleted file mode 100644 index b87a31a..0000000 --- a/system/libstm32f4/build_gcc/gcc.mk +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Tool suffix when cross-compiling -ifndef ARM_GCC_TOOLCHAIN -ARM_GCC_TOOLCHAIN = /usr/bin -endif -CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi- - -# Compilation tools -AR = $(CROSS_COMPILE)ar -CC = $(CROSS_COMPILE)gcc -AS = $(CROSS_COMPILE)as -NM = $(CROSS_COMPILE)nm -ifeq ($(OS),Windows_NT) -RM=cs-rm -Rf -#RM=del /s /f -else -RM=rm -Rf -endif - -SEP=/ - -# --------------------------------------------------------------------------------------- -# C Flags - -CFLAGS += -Wall -Wformat=2 -Wuninitialized -CFLAGS += -Wmain -Wparentheses -Wsequence-point -Wswitch -Wtrigraphs -CFLAGS += -Wunknown-pragmas -Wformat -Wchar-subscripts -Wcomment -Wimplicit-int -#CFLAGS += -Wpedantic -#CFLAGS += -Wextra -CFLAGS += -Winit-self -Wswitch-default -Wlogical-op -Wvla -Wwrite-strings -CFLAGS += -Werror-implicit-function-declaration -Wsign-compare -Wstrict-prototypes -CFLAGS += -Wreturn-type -Wunused -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -CFLAGS += -Waggregate-return -Wstrict-prototypes -Wunreachable-code -Wpacked -CFLAGS += -Wmissing-format-attribute -Wno-deprecated-declarations -Wnested-externs -CFLAGS += -Winline -Wlong-long -Winvalid-pch -Wmissing-include-dirs -CFLAGS += -Os - -# Cause too many warnings or false positives -#CFLAGS += -Wconversion -Wunused-parameter -Wmissing-prototypes -Wmissing-declarations -#CFLAGS += -Wmissing-noreturn -Wredundant-decls -Wbad-function-cast -Wcast-align - -# Enable by -Wall -#CFLAGS += -Wmain -Wparentheses -Wsequence-point -Wswitch -Wtrigraphs -#CFLAGS += -Wunknown-pragmas -Wformat -Wchar-subscripts -Wcomment -Wimplicit-int - -# To reduce application size use only integer printf function. -CFLAGS += -Dprintf=iprintf - -CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m4 -mthumb -mlong-calls -ffunction-sections -fdata-sections -std=c99 -msoft-float -mfloat-abi=soft -CFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) - - -# --------------------------------------------------------------------------------------- -# ASM Flags - -ASFLAGS = -mcpu=cortex-m4 -mthumb -#-Wall -a $(INCLUDES) diff --git a/system/libstm32f4/build_gcc/readme.md b/system/libstm32f4/build_gcc/readme.md deleted file mode 100644 index 36009a0..0000000 --- a/system/libstm32f4/build_gcc/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -***** Build environment ***** - -This build process has been done to work under Linux OS but without any -gurantees. - -Build process options: - make all Build library for all target - make otto Build library for one target - make clean Delete all files created (.o, .a) - -The build process create one library per target and copy the library inside the -variant folder of each target. -This library is used by Arduino IDE to generate the compiled code. diff --git a/system/libstm32f4/build_gcc/release.mk b/system/libstm32f4/build_gcc/release.mk deleted file mode 100644 index 2659255..0000000 --- a/system/libstm32f4/build_gcc/release.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Optimization level -# -O1 Optimize -# -O2 Optimize even more -# -O3 Optimize yet more -# -O0 Reduce compilation time and make debugging produce the expected results -# -Os Optimize for size -OPTIMIZATION = -Os diff --git a/system/libstm32f4/build_gcc/stm32f4.mk b/system/libstm32f4/build_gcc/stm32f4.mk deleted file mode 100644 index 625d2e6..0000000 --- a/system/libstm32f4/build_gcc/stm32f4.mk +++ /dev/null @@ -1,227 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Makefile for compiling libchip -.SUFFIXES: .o .a .c .s -SUB_MAKEFILES= debug.mk gcc.mk release.mk stm32f4.mk - -TOOLCHAIN=gcc - -ifeq ($(OS),Windows_NT) -DEV_NUL=null.txt -else -DEV_NUL=/dev/null -endif - -ifeq ($(CHIP),) -$(error CHIP not defined) -endif - -#CHIP_NAME=$(subst __,,$(CHIP)) -#CHIP_NAME=$(subst __,,$(call lc,$(CHIP))) - -#------------------------------------------------------------------------------- -# Path -#------------------------------------------------------------------------------- - -# Board options -CHIP_SERIE=STM32F4xx -OUTPUT_BIN = $(VARIANTS_PATH) -CFLAGS += -D$(CHIP) -DHSE_VALUE=8000000 - -# Libraries -PROJECT_BASE_PATH = .. -CMSIS_ROOT_PATH = $(PROJECT_BASE_PATH)/../Drivers/CMSIS -HAL_ROOT_PATH = $(PROJECT_BASE_PATH)/../Drivers/STM32F4xx_HAL_Driver -BSP_ROOT_PATH = $(PROJECT_BASE_PATH)/../Drivers/BSP -MIDDLEWARES_ROOT_PATH = $(PROJECT_BASE_PATH)/../Middlewares -MIDDLEWARES_USBD_ROOT_PATH = $(MIDDLEWARES_ROOT_PATH)/ST/STM32_USB_Device_Library -MIDDLEWARES_USBD_CORE_PATH = $(MIDDLEWARES_USBD_ROOT_PATH)/Core -MIDDLEWARES_USBD_CDC_CLASS_PATH = $(MIDDLEWARES_USBD_ROOT_PATH)/Class/CDC -MIDDLEWARES_FATFS_ROOT_PATH = $(MIDDLEWARES_ROOT_PATH)/Third_Party/FatFs -BSP_COMPONENTS_PATH = $(BSP_ROOT_PATH)/Components - - -CMSIS_ARM_PATH=$(CMSIS_ROOT_PATH)/Include -CMSIS_ST_PATH=$(CMSIS_ROOT_PATH)/Device/ST/ -CMSIS_CHIP_PATH=$(CMSIS_ROOT_PATH)/Device/ST/$(CHIP_SERIE) - -#------------------------------------------------------------------------------- -# Files -#------------------------------------------------------------------------------- - -vpath %.h $(PROJECT_BASE_PATH)/include $(CMSIS_ST_PATH) $(CMSIS_CHIP_PATH)/include -vpath %.c $(PROJECT_BASE_PATH)/source $(CMSIS_ARM_PATH) $(CMSIS_CHIP_PATH)/source - -VPATH+=$(HAL_ROOT_PATH)/Src -VPATH+=$(PROJECT_BASE_PATH)/source -VPATH+=$(CMSIS_ARM_PATH) -VPATH+=$(CMSIS_CHIP_PATH)/Include -VPATH+=$(CMSIS_CHIP_PATH)/Source/ - -VPATH+=$(MIDDLEWARES_USBD_CDC_CLASS_PATH)/Src -VPATH+=$(MIDDLEWARES_USBD_CDC_CLASS_PATH)/Inc -VPATH+=$(MIDDLEWARES_USBD_CORE_PATH)/Src -VPATH+=$(MIDDLEWARES_USBD_CORE_PATH)/Inc - -VPATH+=$(MIDDLEWARES_FATFS_ROOT_PATH)/src -VPATH+=$(MIDDLEWARES_FATFS_ROOT_PATH)/src/drivers -VPATH+=$(MIDDLEWARES_FATFS_ROOT_PATH)/src/option -VPATH+=$(BSP_COMPONENTS_PATH)/wm8994 - -INCLUDES = -I$(PROJECT_BASE_PATH) -INCLUDES += -I$(HAL_ROOT_PATH)/Inc -INCLUDES += -I$(CMSIS_ARM_PATH) -INCLUDES += -I$(CMSIS_ST_PATH) -INCLUDES += -I$(CMSIS_CHIP_PATH)/Include -INCLUDES += -I$(MIDDLEWARES_USBD_CDC_CLASS_PATH)/Inc -INCLUDES += -I$(MIDDLEWARES_USBD_CORE_PATH)/Inc -INCLUDES += -I$(MIDDLEWARES_FATFS_ROOT_PATH)/src -INCLUDES += -I$(MIDDLEWARES_FATFS_ROOT_PATH)/src/drivers -INCLUDES += -I$(BSP_COMPONENTS_PATH)/wm8994 -INCLUDES += -I$(VARIANTS_PATH) -INCLUDES += -I$(VARIANTS_PATH)/usb - - -#------------------------------------------------------------------------------- -ifdef DEBUG -include debug.mk -else -include release.mk -endif - -#------------------------------------------------------------------------------- -# Tools -#------------------------------------------------------------------------------- - -include $(TOOLCHAIN).mk - -#------------------------------------------------------------------------------- -ifdef DEBUG -OUTPUT_OBJ=debug -OUTPUT_LIB=$(LIBNAME)_otto_$(TOOLCHAIN)_dbg.a -else -OUTPUT_OBJ=release -OUTPUT_LIB=$(LIBNAME)_otto_$(TOOLCHAIN)_rel.a -endif - -OUTPUT_PATH=$(OUTPUT_OBJ)_otto - -#------------------------------------------------------------------------------- -# C source files and objects -#------------------------------------------------------------------------------- -C_SRC= stm32f4xx_hal_adc.c stm32f4xx_hal_dcmi.c stm32f4xx_hal_fmpi2c.c\ - stm32f4xx_hal_iwdg.c stm32f4xx_hal_pwr_ex.c stm32f4xx_hal_smartcard.c\ - stm32f4xx_hal_wwdg.c stm32f4xx_hal_adc_ex.c stm32f4xx_hal_dcmi_ex.c\ - stm32f4xx_hal_fmpi2c_ex.c stm32f4xx_hal_lptim.c stm32f4xx_hal_qspi.c\ - stm32f4xx_hal_spdifrx.c stm32f4xx_ll_fmc.c stm32f4xx_hal.c\ - stm32f4xx_hal_dfsdm.c stm32f4xx_hal_gpio.c stm32f4xx_hal_ltdc.c\ - stm32f4xx_hal_rcc.c stm32f4xx_hal_spi.c stm32f4xx_ll_fsmc.c\ - stm32f4xx_hal_can.c stm32f4xx_hal_dma2d.c stm32f4xx_hal_hash.c\ - stm32f4xx_hal_ltdc_ex.c stm32f4xx_hal_rcc_ex.c stm32f4xx_hal_sram.c\ - stm32f4xx_ll_sdmmc.c stm32f4xx_hal_cec.c stm32f4xx_hal_dma.c\ - stm32f4xx_hal_hash_ex.c stm32f4xx_hal_rng.c stm32f4xx_hal_tim.c\ - stm32f4xx_ll_usb.c stm32f4xx_hal_cortex.c stm32f4xx_hal_dma_ex.c\ - stm32f4xx_hal_hcd.c stm32f4xx_hal_nand.c stm32f4xx_hal_rtc.c\ - stm32f4xx_hal_crc.c stm32f4xx_hal_dsi.c stm32f4xx_hal_i2c.c\ - stm32f4xx_hal_nor.c stm32f4xx_hal_rtc_ex.c stm32f4xx_hal_cryp.c\ - stm32f4xx_hal_eth.c stm32f4xx_hal_i2c_ex.c stm32f4xx_hal_pccard.c\ - stm32f4xx_hal_sai.c stm32f4xx_hal_cryp_ex.c stm32f4xx_hal_flash.c\ - stm32f4xx_hal_i2s.c stm32f4xx_hal_pcd.c stm32f4xx_hal_sai_ex.c\ - stm32f4xx_hal_tim_ex.c stm32f4xx_hal_dac.c stm32f4xx_hal_flash_ex.c\ - stm32f4xx_hal_i2s_ex.c stm32f4xx_hal_pcd_ex.c stm32f4xx_hal_sd.c\ - stm32f4xx_hal_uart.c stm32f4xx_hal_dac_ex.c stm32f4xx_hal_flash_ramfunc.c\ - stm32f4xx_hal_irda.c stm32f4xx_hal_pwr.c stm32f4xx_hal_sdram.c\ - stm32f4xx_hal_usart.c -C_SRC+=$(wildcard $(PROJECT_BASE_PATH)/source/*.c) -C_SRC+=$(wildcard $(CMSIS_CHIP_PATH)/source/*.c) -C_SRC+=$(wildcard $(CMSIS_CHIP_PATH)/source/gcc/*.c) -C_SRC+= usbd_core.c usbd_ctlreq.c usbd_ioreq.c usbd_cdc.c -C_SRC+= diskio.c ff.c ff_gen_drv.c sd_diskio.c ccsbcs.c -C_SRC+= wm8994.c -C_OBJ_TEMP=$(patsubst %.c, %.o, $(notdir $(C_SRC))) - -# during development, remove some files -C_OBJ_FILTER= - -C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) - -#------------------------------------------------------------------------------- -# Assembler source files and objects -#------------------------------------------------------------------------------- -A_SRC=$(wildcard $(PROJECT_BASE_PATH)/source/*.s) - - -A_OBJ_TEMP=$(patsubst %.s, %.o, $(notdir $(A_SRC))) - -# during development, remove some files -A_OBJ_FILTER= - -A_OBJ=$(filter-out $(A_OBJ_FILTER), $(A_OBJ_TEMP)) - -#------------------------------------------------------------------------------- -# Rules -#------------------------------------------------------------------------------- -all: $(CHIP) - -$(CHIP): create_output $(OUTPUT_LIB) - -.PHONY: create_output -create_output: - @echo ------------------------------------------------------------------------ - @echo --- Preparing $(CHIP) files $(OUTPUT_PATH) to $(OUTPUT_BIN) -# @echo ------------------------- -# @echo *$(C_SRC) -# @echo ------------------------- -# @echo *$(C_OBJ) -# @echo ------------------------- -# @echo *$(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) -# @echo ------------------------- -# @echo *$(A_SRC) -# @echo ------------------------- - - -@mkdir -p $(subst /,$(SEP),$(OUTPUT_BIN)) 1>$(DEV_NUL) 2>&1 - -@mkdir -p $(OUTPUT_PATH) 1>$(DEV_NUL) 2>&1 - @echo ------------------------------------------------------------------------ - -$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c -# "$(CC)" -v -c $(CFLAGS) -Wa,aln=$(subst .o,.s,$@) $< -o $@ - @echo " CC " $< $(CFLAGS) - @"$(CC)" -c $(CFLAGS) $< -o $@ -# "$(CC)" -c $(CFLAGS) $< -o $@ - -$(addprefix $(OUTPUT_PATH)/,$(A_OBJ)): $(OUTPUT_PATH)/%.o: %.s - @echo " AS " $< $(ASFLAGS) - @"$(AS)" -c $(ASFLAGS) $< -o $@ -# @"$(AS)" -c $(ASFLAGS) $< -o $@ - -$(OUTPUT_LIB): $(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(A_OBJ)) - @"$(AR)" -r "$(OUTPUT_BIN)/$@" $^ - @"$(NM)" "$(OUTPUT_BIN)/$@" > "$(OUTPUT_BIN)/$@.txt" - -.PHONY: clean -clean: - @echo ------------------------------------------------------------------------ - @echo --- Cleaning $(CHIP) files $(OUTPUT_PATH) $(subst /,$(SEP),$(OUTPUT_BIN)/$(OUTPUT_LIB)) - -@$(RM) $(OUTPUT_PATH) 1>$(DEV_NUL) 2>&1 - -@$(RM) $(subst /,$(SEP),$(OUTPUT_BIN)/$(OUTPUT_LIB)) 1>$(DEV_NUL) 2>&1 - -@$(RM) $(subst /,$(SEP),$(OUTPUT_BIN)/$(OUTPUT_LIB)).txt 1>$(DEV_NUL) 2>&1 - @echo ------------------------------------------------------------------------ - -# dependencies -$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: $(wildcard $(PROJECT_BASE_PATH)/include/*.h) $(wildcard $(CMSIS_BASE_PATH)/*.h) diff --git a/variants/otto/PeripheralPins.c b/variants/otto/PeripheralPins.c new file mode 100644 index 0000000..2ada458 --- /dev/null +++ b/variants/otto/PeripheralPins.c @@ -0,0 +1,385 @@ +/* + ******************************************************************************* + * Copyright (c) 2016, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +// ===== +// Note: Commented lines are alternative possibilities which are not used per default. +// If you change them, you will have to know what you do +// ===== + +//*** ADC *** + +const PinMap PinMap_ADC[] = { +// {PA0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - D1 / TX +// {PA0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - D1 / Tx +// {PA0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - D1 / TX +// {PA1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - D0 / RX +// {PA1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - D0 / RX +// {PA1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - D0 / RX +// {PA2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - D59/A5 + {PA2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - D59/A5 +// {PA2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - D59/A5 +// {PA3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - D58/A4 +// {PA3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - D58/A4 + {PA3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - D58/A4 +// {PA4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - D66/A12 / DAC0 + {PA4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - D66/A12 / DAC0 +// {PA5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - D67/A13 / DAC1 + {PA5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - D67/A13 / DAC1 +// {PA6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - PAR_PCLK +// {PA6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - PAR_PCLK + {PA7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - D61/A7 +// {PA7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - D61/A7 + {PB0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - D54/A0 +// {PB0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - D54/A0 + {PB1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - D55/A1 +// {PB1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - D55/A1 +// {PC0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - SDNWE +// {PC0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - SDNWE +// {PC0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - SDNWE +// {PC1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - D65/A11 +// {PC1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - D65/A11 + {PC1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - D65/A11 +// {PC2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - D62/A8 + {PC2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - D62/A8 +// {PC2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - D62/A8 +// {PC3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - D74 / MOSI +// {PC3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - D74 / MOSI +// {PC3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - D74 / MOSI + {PC4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - D63/A9 +// {PC4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - D63/A9 + {PC5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - D57/A3 +// {PC5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - D57/A3 +// {PF3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 - SDRAM +// {PF4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 - SDRAM +// {PF5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - SDRAM + {PF6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - D56/A2 + {PF7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - D64/A10 +// {PF8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - SAI1_SCKB +// {PF9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - SAI1_FSB + {PF10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - D60/A6 + {NC, NC, 0} +}; + +//*** DAC *** + +const PinMap PinMap_DAC[] = { + {PA4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - D66/A12 / DAC0 + {PA5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - D67/A13 / DAC1 + {NC, NC, 0} +}; + +//*** I2C *** + +const PinMap PinMap_I2C_SDA[] = { + {PB7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C1)}, // D70 / SDA +// {PB9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // D68 / CANTX +// {PB11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // D19 / RX1 +// {PC9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // uSD_D1 +// {PF0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // SDRAM + {PH5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C2)}, // D20 / SDA1 + {PH8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C3)}, // I2C3_SDA + {NC, NC, 0} +}; + +const PinMap PinMap_I2C_SCL[] = { +// {PA8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // D8 + {PB6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C1)}, // D71 / SCL +// {PB8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // D69 / CANRX +// {PB10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // D18 / TX1 +// {PF1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // SDRAM + {PH4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C2)}, // D21 / SCL + {PH7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF4_I2C3)}, // I2C3_SCL + {NC, NC, 0} +}; + +//*** PWM *** + +const PinMap PinMap_PWM[] = { +// {PA0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - D1 / TX + {PA0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - D1 / TX +// {PA1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - D0 / RX + {PA1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - D0 / RX +// {PA2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - D59/A5 + {PA2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - D59/A5 +// {PA2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - D59/A5 +// {PA3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - D58/A4 + {PA3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - D58/A4 +// {PA3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - D58/A4 +// {PA5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - D67/A13 / DAC1 + {PA5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - D67/A13 / DAC1 +// {PA6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - PAR_PCLK +// {PA6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - PAR_PCLK +// {PA7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - D61/A7 +// {PA7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - D61/A7 +// {PA7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - D61/A7 +// {PA7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - D61/A7 + {PA8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - D8 + {PA9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - D9 +// {PA10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - USB_OTG_FS_ID +// {PA11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - USB_OTG_FS_DM + {PA15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - D10 +// {PB0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - D54/A0 + {PB0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - D54/A0 +// {PB0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - D54/A0 +// {PB1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - D55/A1 + {PB1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - D55/A1 +// {PB1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - D55/A1 + {PB3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - D13 / SCK1 + {PB4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - D12 / MISO1 + {PB5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - D11 / MOSI1 +// {PB6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - D71 / SCL +// {PB7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - D70 / SDA +// {PB8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - D69 / CANRX + {PB8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - D69 / CANRX +// {PB9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - D68 / CANTX + {PB9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - D68 / CANTX + {PB10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - D18 / TX1 + {PB11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - D19 / RX1 + {PB13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - D51 +// {PB14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - D72 / MISO +// {PB14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - D72 / MISO +// {PB14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - D72 / MISO + {PB15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - D3 +// {PB15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - D3 +// {PB15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - D3 +// {PC6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - D5 + {PC6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - D5 +// {PC7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - D4 + {PC7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - D4 +// {PC8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - uSD_D0 +// {PC8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - uSD_D0 +// {PC9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - uSD_D1 +// {PC9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - uSD_D1 + {PD12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - D7 + {PD13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - D6 +// {PD14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - SDRAM +// {PD15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - SDRAM +// {PE5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - D22 +// {PE6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - D23 / SS +// {PE8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - SDRAM +// {PE9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - SDRAM +// {PE10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - SDRAM +// {PE11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - SDRAM +// {PE12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - SDRAM +// {PE13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - SDRAM +// {PE14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - SDRAM + {PF6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - D56/A2 + {PF7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - D64/A10 +// {PF8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - SAI1_SCKB +// {PF9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - SAI1_FSB + {PH6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - D2 +// {PH9, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - PAR +// {PH10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - PAR +// {PH11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - PAR +// {PH12, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - PAR +// {PH13, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - D75 / WIFI_PWR +// {PH14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - PAR +// {PH15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - PAR +// {PI0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - TOUCH_INT +// {PI2, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - PAR +// {PI5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - PAR +// {PI6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - PAR +// {PI7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - PAR + {NC, NC, 0} +}; + +//*** SERIAL *** + +const PinMap PinMap_UART_TX[] = { + {PA0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // D1 / TX + {PA2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D59/A5 +// {PA9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // D9 +// {PB6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // D71 / SCL + {PB10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D18 / TX1 + {PC6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D5 +// {PC10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // uSD_D2 +// {PC10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // uSD_D2 +// {PC12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // uSD_CLK + {PD5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D16 / TX2 +// {PD8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // SDRAM +// {PE1, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // FMC_NBL1 +// {PE8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // SDRAM +// {PF7, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // D64/A10 + {PG14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D14 / TX3 + {NC, NC, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {PA1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // D0 / RX + {PA3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D58/A4 +// {PA10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB_OTG_FS_ID +// {PB7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // D70 / SDA + {PB11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D19 / RX1 + {PC7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D4 +// {PC11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // uSD_D3 +// {PC11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // uSD_D3 +// {PD2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // uSD_CMD + {PD6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D17 / RX2 +// {PD9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // SDRAM +// {PE0, UART8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // FMC_NBL0 +// {PE7, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // SDRAM +// {PF6, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // D56/A2 + {PG9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D15 / RX3 + {NC, NC, 0} +}; + +const PinMap PinMap_UART_RTS[] = { + {PA1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D0 / RX +// {PA12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB_OTG_FS_DP + {PB14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D72 / MISO + {PD4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D45 + {PD12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D7 +// {PG8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // SDCLK + {PG12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D50 + {NC, NC, 0} +}; + +const PinMap PinMap_UART_CTS[] = { + {PA0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D1 / TX +// {PA11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // USB_OTG_FS_DM + {PB13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D51 +// {PD3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // D73 / SCK + {PD11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // D40 + {PG13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // D52 +// {PG15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // SDNCAS + {NC, NC, 0} +}; + +//*** SPI *** + +const PinMap PinMap_SPI_MOSI[] = { +// {PA7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D61/A7 + {PB5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D11 / MOSI1 +// {PB5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // D11 / MOSI1 +// {PB15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D3 +// {PC1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D65/A11 + {PC3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D74 / MOSI +// {PC12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // uSD_CLK +// {PD6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, // D17 / RX2 +// {PE6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // D23 / SS +// {PE14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // SDRAM +// {PF9, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // SAI1_FSB +// {PF11, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // SDNRAS +// {PG14, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // D14 / TX3 +// {PI3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // PAR + {NC, NC, 0} +}; + +const PinMap PinMap_SPI_MISO[] = { +// {PA6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // PAR_PCLK + {PB4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D12 / MISO1 +// {PB4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // D12 / MISO1 + {PB14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D72 / MISO +// {PC2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D62/A8 +// {PC11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // uSD_D3 +// {PE5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // D22 +// {PE13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // SDRAM +// {PF8, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // SAI1_SCKB +// {PG12, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // D50 +// {PH7, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // I2C3SCL +// {PI2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // PAR + {NC, NC, 0} +}; + +const PinMap PinMap_SPI_SCLK[] = { +// {PA5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D67/A13 / DAC1 +// {PA9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D9 + {PB3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D13 / SCK1 +// {PB3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // D13 / SCK1 +// {PB10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D18 / TX1 +// {PB13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D51 +// {PC10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // uSD_D2 + {PD3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D73 / SCK +// {PE2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // D24 +// {PE12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // SDRAM +// {PF7, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // D64/A10 +// {PG13, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // D52 +// {PH6, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // D2 +// {PI1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // PAR + {NC, NC, 0} +}; + +const PinMap PinMap_SPI_SSEL[] = { +// {PA4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // D66/A12 / DAC0 +// {PA4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // D66/A12 / DAC0 + {PA15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // D10 / SS1 +// {PA15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // D10 / SS1 +// {PB9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D68 / CANTX +// {PB12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // D53 +// {PE4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // D25 +// {PE11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // SDRAM +// {PF6, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // D56/A2 +// {PG8, SPI6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // SDCLK +// {PH5, SPI5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // D20 / SDA1 +// {PI0, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // TOUCH_INT + {NC, NC, 0} +}; + +//*** CAN *** + +const PinMap PinMap_CAN_RD[] = { +// {PA11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // USB_OTG_FS_DM +// {PB5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // D11 / MOSI1 + {PB8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // D69 / CANRX +// {PB12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // D53 +// {PD0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // SDRAM +// {PI9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // PAR + {NC, NC, 0} +}; + +const PinMap PinMap_CAN_TD[] = { +// {PA12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // USB_OTG_FS_DP +// {PB6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // D71 / SCL + {PB9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // D68 / CANTX +// {PB13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // D51 +// {PD1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // SDRAM +// {PH13, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // D75 / WIFI_PWR + {NC, NC, 0} +}; + +const TimerMap TimerMap_CONFIG[] = { + {TIM1, TIM1_UP_TIM10_IRQn, 2}, + {TIM2, TIM2_IRQn, 1}, + {TIM3, TIM3_IRQn, 1}, + {TIM4, TIM4_IRQn, 1}, + {TIM5, TIM5_IRQn, 1}, + {TIM6, TIM6_DAC_IRQn, 1}, + {TIM7, TIM7_IRQn, 1}, + {TIM8, TIM8_UP_TIM13_IRQn, 2}, + {TIM9, TIM1_BRK_TIM9_IRQn, 2}, + {TIM10, TIM1_UP_TIM10_IRQn, 2}, + {TIM11, TIM1_TRG_COM_TIM11_IRQn, 2}, + {TIM12, TIM8_BRK_TIM12_IRQn, 1}, + {TIM13, TIM8_UP_TIM13_IRQn, 1}, + {TIM14, TIM8_TRG_COM_TIM14_IRQn, 1}, + {NULL, 0, 0} +}; diff --git a/variants/otto/ffconf.h b/variants/otto/ffconf.h old mode 100755 new mode 100644 index c7c455a..6227bcf --- a/variants/otto/ffconf.h +++ b/variants/otto/ffconf.h @@ -12,8 +12,8 @@ /*-----------------------------------------------------------------------------/ / Additional user header to be used /-----------------------------------------------------------------------------*/ -#include "stm32f4xx_hal.h" -#include "otto_sd.h" +#include "stm32_def.h" +#include "bsp_sd.h" /*-----------------------------------------------------------------------------/ / Functions and Buffer Configurations /-----------------------------------------------------------------------------*/ diff --git a/variants/otto/ldscript.ld b/variants/otto/ldscript.ld new file mode 100644 index 0000000..1d73a5e --- /dev/null +++ b/variants/otto/ldscript.ld @@ -0,0 +1,190 @@ + +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F469NIHx Device with +** 2048KByte FLASH, 320KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +** (c)Copyright Ac6. +** You may use this file as-is or modify it according to the needs of your +** project. Distribution of this file (unmodified or modified) is not +** permitted. Ac6 permit registered System Workbench for MCU users the +** rights to distribute the assembled, compiled & linked contents of this +** file as part of an application binary file, provided that it is built +** using the System Workbench for MCU toolchain. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20050000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 319K +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(8); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(8); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(8); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(8); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(8); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(8); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(8); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(8); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + + diff --git a/variants/otto/libstm32f4_otto_gcc_rel.a b/variants/otto/libstm32f4_otto_gcc_rel.a deleted file mode 100644 index 48c88f8..0000000 Binary files a/variants/otto/libstm32f4_otto_gcc_rel.a and /dev/null differ diff --git a/variants/otto/libstm32f4_otto_gcc_rel.a.txt b/variants/otto/libstm32f4_otto_gcc_rel.a.txt deleted file mode 100644 index f14c35c..0000000 --- a/variants/otto/libstm32f4_otto_gcc_rel.a.txt +++ /dev/null @@ -1,1366 +0,0 @@ - -stm32f4xx_hal_adc.o: -00000000 t ADC_DMAConvCplt -00000000 t ADC_DMAError -00000000 t ADC_DMAHalfConvCplt - U HAL_ADCEx_InjectedConvCpltCallback -00000000 T HAL_ADC_AnalogWDGConfig -00000000 T HAL_ADC_ConfigChannel -00000000 W HAL_ADC_ConvCpltCallback -00000000 W HAL_ADC_ConvHalfCpltCallback -00000000 T HAL_ADC_DeInit -00000000 W HAL_ADC_ErrorCallback -00000000 T HAL_ADC_GetError -00000000 T HAL_ADC_GetState -00000000 T HAL_ADC_GetValue -00000000 T HAL_ADC_IRQHandler -00000000 T HAL_ADC_Init -00000000 W HAL_ADC_LevelOutOfWindowCallback -00000000 W HAL_ADC_MspDeInit -00000000 W HAL_ADC_MspInit -00000000 T HAL_ADC_PollForConversion -00000000 T HAL_ADC_PollForEvent -00000000 T HAL_ADC_Start -00000000 T HAL_ADC_Start_DMA -00000000 T HAL_ADC_Start_IT -00000000 T HAL_ADC_Stop -00000000 T HAL_ADC_Stop_DMA -00000000 T HAL_ADC_Stop_IT - U HAL_DMA_Abort - U HAL_DMA_Start_IT - U HAL_GetTick - U SystemCoreClock - -stm32f4xx_hal_dcmi.o: - -stm32f4xx_hal_fmpi2c.o: - -stm32f4xx_hal_iwdg.o: - -stm32f4xx_hal_pwr_ex.o: - U HAL_GetTick -00000000 T HAL_PWREx_ControlVoltageScaling -00000000 T HAL_PWREx_DisableBkUpReg -00000000 T HAL_PWREx_DisableFlashPowerDown -00000000 T HAL_PWREx_DisableOverDrive -00000000 T HAL_PWREx_EnableBkUpReg -00000000 T HAL_PWREx_EnableFlashPowerDown -00000000 T HAL_PWREx_EnableOverDrive -00000000 T HAL_PWREx_EnableWakeUpPinPolarityFallingEdge -00000000 T HAL_PWREx_EnableWakeUpPinPolarityRisingEdge -00000000 T HAL_PWREx_EnterUnderDriveSTOPMode -00000000 T HAL_PWREx_GetVoltageRange - -stm32f4xx_hal_smartcard.o: - -stm32f4xx_hal_wwdg.o: - -stm32f4xx_hal_adc_ex.o: -00000000 t ADC_MultiModeDMAConvCplt -00000000 t ADC_MultiModeDMAError -00000000 t ADC_MultiModeDMAHalfConvCplt -00000000 T HAL_ADCEx_InjectedConfigChannel -00000000 W HAL_ADCEx_InjectedConvCpltCallback -00000000 T HAL_ADCEx_InjectedGetValue -00000000 T HAL_ADCEx_InjectedPollForConversion -00000000 T HAL_ADCEx_InjectedStart -00000000 T HAL_ADCEx_InjectedStart_IT -00000000 T HAL_ADCEx_InjectedStop -00000000 T HAL_ADCEx_InjectedStop_IT -00000000 T HAL_ADCEx_MultiModeConfigChannel -00000000 T HAL_ADCEx_MultiModeGetValue -00000000 T HAL_ADCEx_MultiModeStart_DMA -00000000 T HAL_ADCEx_MultiModeStop_DMA - U HAL_ADC_ConvCpltCallback - U HAL_ADC_ConvHalfCpltCallback - U HAL_ADC_ErrorCallback - U HAL_DMA_Abort - U HAL_DMA_Start_IT - U HAL_GetTick - U SystemCoreClock - -stm32f4xx_hal_dcmi_ex.o: - -stm32f4xx_hal_fmpi2c_ex.o: - -stm32f4xx_hal_lptim.o: - -stm32f4xx_hal_qspi.o: - -stm32f4xx_hal_spdifrx.o: - -stm32f4xx_ll_fmc.o: -00000000 T FMC_NAND_AttributeSpace_Timing_Init -00000000 T FMC_NAND_CommonSpace_Timing_Init -00000000 T FMC_NAND_DeInit -00000000 T FMC_NAND_ECC_Disable -00000000 T FMC_NAND_ECC_Enable -00000000 T FMC_NAND_GetECC -00000000 T FMC_NAND_Init -00000000 T FMC_NORSRAM_DeInit -00000000 T FMC_NORSRAM_Extended_Timing_Init -00000000 T FMC_NORSRAM_Init -00000000 T FMC_NORSRAM_Timing_Init -00000000 T FMC_NORSRAM_WriteOperation_Disable -00000000 T FMC_NORSRAM_WriteOperation_Enable -00000000 T FMC_SDRAM_DeInit -00000000 T FMC_SDRAM_GetModeStatus -00000000 T FMC_SDRAM_Init -00000000 T FMC_SDRAM_ProgramRefreshRate -00000000 T FMC_SDRAM_SendCommand -00000000 T FMC_SDRAM_SetAutoRefreshNumber -00000000 T FMC_SDRAM_Timing_Init -00000000 T FMC_SDRAM_WriteProtection_Disable -00000000 T FMC_SDRAM_WriteProtection_Enable - U HAL_GetTick - -stm32f4xx_hal.o: -00000000 T HAL_DBGMCU_DisableDBGSleepMode -00000000 T HAL_DBGMCU_DisableDBGStandbyMode -00000000 T HAL_DBGMCU_DisableDBGStopMode -00000000 T HAL_DBGMCU_EnableDBGSleepMode -00000000 T HAL_DBGMCU_EnableDBGStandbyMode -00000000 T HAL_DBGMCU_EnableDBGStopMode -00000000 T HAL_DeInit -00000000 W HAL_Delay -00000000 T HAL_DisableCompensationCell -00000000 T HAL_DisableMemorySwappingBank -00000000 T HAL_EnableCompensationCell -00000000 T HAL_EnableMemorySwappingBank -00000000 T HAL_GetDEVID -00000000 T HAL_GetHalVersion -00000000 T HAL_GetREVID -00000000 W HAL_GetTick -00000000 W HAL_IncTick -00000000 T HAL_Init -00000000 W HAL_InitTick -00000000 W HAL_MspDeInit -00000000 W HAL_MspInit - U HAL_NVIC_SetPriority - U HAL_NVIC_SetPriorityGrouping -00000000 W HAL_ResumeTick - U HAL_SYSTICK_Config -00000000 W HAL_SuspendTick - U SystemCoreClock -00000004 C uwTick - -stm32f4xx_hal_dfsdm.o: - -stm32f4xx_hal_gpio.o: -00000000 T HAL_GPIO_DeInit -00000000 W HAL_GPIO_EXTI_Callback -00000000 T HAL_GPIO_EXTI_IRQHandler -00000000 T HAL_GPIO_Init -00000000 T HAL_GPIO_LockPin -00000000 T HAL_GPIO_ReadPin -00000000 T HAL_GPIO_TogglePin -00000000 T HAL_GPIO_WritePin - -stm32f4xx_hal_ltdc.o: -00000000 T HAL_LTDC_ConfigCLUT -00000000 T HAL_LTDC_ConfigColorKeying -00000000 T HAL_LTDC_ConfigColorKeying_NoReload -00000000 T HAL_LTDC_ConfigLayer -00000000 T HAL_LTDC_ConfigLayer_NoReload -00000000 T HAL_LTDC_DeInit -00000000 T HAL_LTDC_DisableCLUT -00000000 T HAL_LTDC_DisableCLUT_NoReload -00000000 T HAL_LTDC_DisableColorKeying -00000000 T HAL_LTDC_DisableColorKeying_NoReload -00000000 T HAL_LTDC_DisableDither -00000000 T HAL_LTDC_EnableCLUT -00000000 T HAL_LTDC_EnableCLUT_NoReload -00000000 T HAL_LTDC_EnableColorKeying -00000000 T HAL_LTDC_EnableColorKeying_NoReload -00000000 T HAL_LTDC_EnableDither -00000000 W HAL_LTDC_ErrorCallback -00000000 T HAL_LTDC_GetError -00000000 T HAL_LTDC_GetState -00000000 T HAL_LTDC_IRQHandler -00000000 T HAL_LTDC_Init -00000000 W HAL_LTDC_LineEventCallback -00000000 W HAL_LTDC_MspDeInit -00000000 W HAL_LTDC_MspInit -00000000 T HAL_LTDC_ProgramLineEvent -00000000 T HAL_LTDC_Relaod -00000000 W HAL_LTDC_ReloadEventCallback -00000000 T HAL_LTDC_SetAddress -00000000 T HAL_LTDC_SetAddress_NoReload -00000000 T HAL_LTDC_SetAlpha -00000000 T HAL_LTDC_SetAlpha_NoReload -00000000 T HAL_LTDC_SetPitch -00000000 T HAL_LTDC_SetPitch_NoReload -00000000 T HAL_LTDC_SetPixelFormat -00000000 T HAL_LTDC_SetPixelFormat_NoReload -00000000 T HAL_LTDC_SetWindowPosition -00000000 T HAL_LTDC_SetWindowPosition_NoReload -00000000 T HAL_LTDC_SetWindowSize -00000000 T HAL_LTDC_SetWindowSize_NoReload -00000000 t LTDC_SetConfig - -stm32f4xx_hal_rcc.o: -00000000 R APBAHBPrescTable - U HAL_GPIO_Init - U HAL_GetTick - U HAL_InitTick -00000000 W HAL_RCC_CSSCallback -00000000 T HAL_RCC_ClockConfig -00000000 W HAL_RCC_DeInit -00000000 T HAL_RCC_DisableCSS -00000000 T HAL_RCC_EnableCSS -00000000 T HAL_RCC_GetClockConfig -00000000 T HAL_RCC_GetHCLKFreq -00000000 W HAL_RCC_GetOscConfig -00000000 T HAL_RCC_GetPCLK1Freq -00000000 T HAL_RCC_GetPCLK2Freq -00000000 W HAL_RCC_GetSysClockFreq -00000000 T HAL_RCC_MCOConfig -00000000 T HAL_RCC_NMI_IRQHandler -00000000 W HAL_RCC_OscConfig - U SystemCoreClock - -stm32f4xx_hal_spi.o: - U HAL_DMA_Abort - U HAL_DMA_Abort_IT - U HAL_DMA_Start_IT - U HAL_GetTick -00000000 T HAL_SPI_DMAPause -00000000 T HAL_SPI_DMAResume -00000000 T HAL_SPI_DMAStop -00000000 T HAL_SPI_DeInit -00000000 W HAL_SPI_ErrorCallback -00000000 T HAL_SPI_GetError -00000000 T HAL_SPI_GetState -00000000 T HAL_SPI_IRQHandler -00000000 T HAL_SPI_Init -00000000 W HAL_SPI_MspDeInit -00000000 W HAL_SPI_MspInit -00000000 T HAL_SPI_Receive -00000000 T HAL_SPI_Receive_DMA -00000000 T HAL_SPI_Receive_IT -00000000 W HAL_SPI_RxCpltCallback -00000000 W HAL_SPI_RxHalfCpltCallback -00000000 T HAL_SPI_Transmit -00000000 T HAL_SPI_TransmitReceive -00000000 T HAL_SPI_TransmitReceive_DMA -00000000 T HAL_SPI_TransmitReceive_IT -00000000 T HAL_SPI_Transmit_DMA -00000000 T HAL_SPI_Transmit_IT -00000000 W HAL_SPI_TxCpltCallback -00000000 W HAL_SPI_TxHalfCpltCallback -00000000 W HAL_SPI_TxRxCpltCallback -00000000 W HAL_SPI_TxRxHalfCpltCallback -00000000 t SPI_2linesRxISR_16BIT -00000000 t SPI_2linesRxISR_16BITCRC -00000000 t SPI_2linesRxISR_8BIT -00000000 t SPI_2linesRxISR_8BITCRC -00000000 t SPI_2linesTxISR_16BIT -00000000 t SPI_2linesTxISR_8BIT -00000000 t SPI_CheckFlag_BSY -00000000 t SPI_CloseRxTx_ISR -00000000 t SPI_CloseRx_ISR -00000000 t SPI_CloseTx_ISR -00000000 t SPI_DMAAbortOnError -00000000 t SPI_DMAError -00000000 t SPI_DMAHalfReceiveCplt -00000000 t SPI_DMAHalfTransmitCplt -00000000 t SPI_DMAHalfTransmitReceiveCplt -00000000 t SPI_DMAReceiveCplt -00000000 t SPI_DMATransmitCplt -00000000 t SPI_DMATransmitReceiveCplt -00000000 t SPI_RxISR_16BIT -00000000 t SPI_RxISR_16BITCRC -00000000 t SPI_RxISR_8BIT -00000000 t SPI_RxISR_8BITCRC -00000000 t SPI_TxISR_16BIT -00000000 t SPI_TxISR_8BIT -00000000 t SPI_WaitFlagStateUntilTimeout - U SystemCoreClock - -stm32f4xx_ll_fsmc.o: - -stm32f4xx_hal_can.o: - -stm32f4xx_hal_dma2d.o: -00000000 t DMA2D_SetConfig -00000000 T HAL_DMA2D_Abort -00000000 T HAL_DMA2D_BlendingStart -00000000 T HAL_DMA2D_BlendingStart_IT -00000000 T HAL_DMA2D_CLUTLoad -00000000 T HAL_DMA2D_CLUTLoad_IT -00000000 W HAL_DMA2D_CLUTLoadingCpltCallback -00000000 T HAL_DMA2D_CLUTLoading_Abort -00000000 T HAL_DMA2D_CLUTLoading_Resume -00000000 T HAL_DMA2D_CLUTLoading_Suspend -00000000 T HAL_DMA2D_ConfigCLUT -00000000 T HAL_DMA2D_ConfigDeadTime -00000000 T HAL_DMA2D_ConfigLayer -00000000 T HAL_DMA2D_DeInit -00000000 T HAL_DMA2D_DisableDeadTime -00000000 T HAL_DMA2D_EnableCLUT -00000000 T HAL_DMA2D_EnableDeadTime -00000000 T HAL_DMA2D_GetError -00000000 T HAL_DMA2D_GetState -00000000 T HAL_DMA2D_IRQHandler -00000000 T HAL_DMA2D_Init -00000000 W HAL_DMA2D_LineEventCallback -00000000 W HAL_DMA2D_MspDeInit -00000000 W HAL_DMA2D_MspInit -00000000 T HAL_DMA2D_PollForTransfer -00000000 T HAL_DMA2D_ProgramLineEvent -00000000 T HAL_DMA2D_Resume -00000000 T HAL_DMA2D_Start -00000000 T HAL_DMA2D_Start_IT -00000000 T HAL_DMA2D_Suspend - U HAL_GetTick - -stm32f4xx_hal_hash.o: - -stm32f4xx_hal_ltdc_ex.o: -00000000 T HAL_LTDC_StructInitFromAdaptedCommandConfig -00000000 T HAL_LTDC_StructInitFromVideoConfig - -stm32f4xx_hal_rcc_ex.o: - U HAL_GetTick -00000000 T HAL_RCCEx_GetPeriphCLKConfig -00000000 T HAL_RCCEx_PeriphCLKConfig -00000000 T HAL_RCCEx_SelectLSEMode -00000000 T HAL_RCC_DeInit -00000000 T HAL_RCC_GetOscConfig -00000000 T HAL_RCC_OscConfig - U SystemCoreClock - -stm32f4xx_hal_sram.o: - U FMC_NORSRAM_DeInit - U FMC_NORSRAM_Extended_Timing_Init - U FMC_NORSRAM_Init - U FMC_NORSRAM_Timing_Init - U FMC_NORSRAM_WriteOperation_Disable - U FMC_NORSRAM_WriteOperation_Enable - U HAL_DMA_Start_IT -00000000 W HAL_SRAM_DMA_XferCpltCallback -00000000 W HAL_SRAM_DMA_XferErrorCallback -00000000 T HAL_SRAM_DeInit -00000000 T HAL_SRAM_GetState -00000000 T HAL_SRAM_Init -00000000 W HAL_SRAM_MspDeInit -00000000 W HAL_SRAM_MspInit -00000000 T HAL_SRAM_Read_16b -00000000 T HAL_SRAM_Read_32b -00000000 T HAL_SRAM_Read_8b -00000000 T HAL_SRAM_Read_DMA -00000000 T HAL_SRAM_WriteOperation_Disable -00000000 T HAL_SRAM_WriteOperation_Enable -00000000 T HAL_SRAM_Write_16b -00000000 T HAL_SRAM_Write_32b -00000000 T HAL_SRAM_Write_8b -00000000 T HAL_SRAM_Write_DMA - -stm32f4xx_ll_sdmmc.o: -00000000 T SDIO_DataConfig -00000000 T SDIO_GetCommandResponse -00000000 T SDIO_GetDataCounter -00000000 T SDIO_GetFIFOCount -00000000 T SDIO_GetPowerState -00000000 T SDIO_GetResponse -00000000 T SDIO_Init -00000000 T SDIO_PowerState_OFF -00000000 T SDIO_PowerState_ON -00000000 T SDIO_ReadFIFO -00000000 T SDIO_SendCommand -00000000 T SDIO_SetSDIOReadWaitMode -00000000 T SDIO_WriteFIFO - -stm32f4xx_hal_cec.o: - -stm32f4xx_hal_dma.o: -00000000 t DMA_CalcBaseAndBitshift -00000000 T HAL_DMA_Abort -00000000 T HAL_DMA_Abort_IT -00000000 T HAL_DMA_DeInit -00000000 T HAL_DMA_GetError -00000000 T HAL_DMA_GetState -00000000 T HAL_DMA_IRQHandler -00000000 T HAL_DMA_Init -00000000 T HAL_DMA_PollForTransfer -00000000 T HAL_DMA_RegisterCallback -00000000 T HAL_DMA_Start -00000000 T HAL_DMA_Start_IT -00000000 T HAL_DMA_UnRegisterCallback - U HAL_GetTick - U SystemCoreClock -00000000 r flagBitshiftOffset.9686 - -stm32f4xx_hal_hash_ex.o: - -stm32f4xx_hal_rng.o: - -stm32f4xx_hal_tim.o: - U HAL_DMA_Abort - U HAL_DMA_Start_IT - U HAL_TIMEx_BreakCallback - U HAL_TIMEx_CommutationCallback -00000000 T HAL_TIM_Base_DeInit -00000000 T HAL_TIM_Base_GetState -00000000 T HAL_TIM_Base_Init -00000000 W HAL_TIM_Base_MspDeInit -00000000 W HAL_TIM_Base_MspInit -00000000 T HAL_TIM_Base_Start -00000000 T HAL_TIM_Base_Start_DMA -00000000 T HAL_TIM_Base_Start_IT -00000000 T HAL_TIM_Base_Stop -00000000 T HAL_TIM_Base_Stop_DMA -00000000 T HAL_TIM_Base_Stop_IT -00000000 T HAL_TIM_ConfigClockSource -00000000 T HAL_TIM_ConfigOCrefClear -00000000 T HAL_TIM_ConfigTI1Input -00000000 T HAL_TIM_DMABurst_ReadStart -00000000 T HAL_TIM_DMABurst_ReadStop -00000000 T HAL_TIM_DMABurst_WriteStart -00000000 T HAL_TIM_DMABurst_WriteStop -00000000 T HAL_TIM_Encoder_DeInit -00000000 T HAL_TIM_Encoder_GetState -00000000 T HAL_TIM_Encoder_Init -00000000 W HAL_TIM_Encoder_MspDeInit -00000000 W HAL_TIM_Encoder_MspInit -00000000 T HAL_TIM_Encoder_Start -00000000 T HAL_TIM_Encoder_Start_DMA -00000000 T HAL_TIM_Encoder_Start_IT -00000000 T HAL_TIM_Encoder_Stop -00000000 T HAL_TIM_Encoder_Stop_DMA -00000000 T HAL_TIM_Encoder_Stop_IT -00000000 W HAL_TIM_ErrorCallback -00000000 T HAL_TIM_GenerateEvent -00000000 W HAL_TIM_IC_CaptureCallback -00000000 T HAL_TIM_IC_ConfigChannel -00000000 T HAL_TIM_IC_DeInit -00000000 T HAL_TIM_IC_GetState -00000000 T HAL_TIM_IC_Init -00000000 W HAL_TIM_IC_MspDeInit -00000000 W HAL_TIM_IC_MspInit -00000000 T HAL_TIM_IC_Start -00000000 T HAL_TIM_IC_Start_DMA -00000000 T HAL_TIM_IC_Start_IT -00000000 T HAL_TIM_IC_Stop -00000000 T HAL_TIM_IC_Stop_DMA -00000000 T HAL_TIM_IC_Stop_IT -00000000 T HAL_TIM_IRQHandler -00000000 T HAL_TIM_OC_ConfigChannel -00000000 T HAL_TIM_OC_DeInit -00000000 W HAL_TIM_OC_DelayElapsedCallback -00000000 T HAL_TIM_OC_GetState -00000000 T HAL_TIM_OC_Init -00000000 W HAL_TIM_OC_MspDeInit -00000000 W HAL_TIM_OC_MspInit -00000000 T HAL_TIM_OC_Start -00000000 T HAL_TIM_OC_Start_DMA -00000000 T HAL_TIM_OC_Start_IT -00000000 T HAL_TIM_OC_Stop -00000000 T HAL_TIM_OC_Stop_DMA -00000000 T HAL_TIM_OC_Stop_IT -00000000 T HAL_TIM_OnePulse_ConfigChannel -00000000 T HAL_TIM_OnePulse_DeInit -00000000 T HAL_TIM_OnePulse_GetState -00000000 T HAL_TIM_OnePulse_Init -00000000 W HAL_TIM_OnePulse_MspDeInit -00000000 W HAL_TIM_OnePulse_MspInit -00000000 T HAL_TIM_OnePulse_Start -00000000 T HAL_TIM_OnePulse_Start_IT -00000000 T HAL_TIM_OnePulse_Stop -00000000 T HAL_TIM_OnePulse_Stop_IT -00000000 T HAL_TIM_PWM_ConfigChannel -00000000 T HAL_TIM_PWM_DeInit -00000000 T HAL_TIM_PWM_GetState -00000000 T HAL_TIM_PWM_Init -00000000 W HAL_TIM_PWM_MspDeInit -00000000 W HAL_TIM_PWM_MspInit -00000000 W HAL_TIM_PWM_PulseFinishedCallback -00000000 T HAL_TIM_PWM_Start -00000000 T HAL_TIM_PWM_Start_DMA -00000000 T HAL_TIM_PWM_Start_IT -00000000 T HAL_TIM_PWM_Stop -00000000 T HAL_TIM_PWM_Stop_DMA -00000000 T HAL_TIM_PWM_Stop_IT -00000000 W HAL_TIM_PeriodElapsedCallback -00000000 T HAL_TIM_ReadCapturedValue -00000000 T HAL_TIM_SlaveConfigSynchronization -00000000 T HAL_TIM_SlaveConfigSynchronization_IT -00000000 W HAL_TIM_TriggerCallback - U TIMEx_DMACommutationCplt -00000000 T TIM_Base_SetConfig -00000000 T TIM_CCxChannelCmd -00000000 T TIM_DMACaptureCplt -00000000 T TIM_DMADelayPulseCplt -00000000 T TIM_DMAError -00000000 t TIM_DMAPeriodElapsedCplt -00000000 t TIM_DMATriggerCplt -00000000 t TIM_OC1_SetConfig -00000000 T TIM_OC2_SetConfig -00000000 t TIM_OC3_SetConfig -00000000 t TIM_OC4_SetConfig -00000000 t TIM_SlaveTimer_SetConfig -00000000 T TIM_TI1_SetConfig - -stm32f4xx_ll_usb.o: - U HAL_Delay -00000000 T USB_ActivateDedicatedEndpoint -00000000 T USB_ActivateEndpoint -00000000 T USB_ActivateSetup -00000000 T USB_ClearInterrupts -00000000 T USB_CoreInit -00000000 t USB_CoreReset -00000000 T USB_DeactivateDedicatedEndpoint -00000000 T USB_DeactivateEndpoint -00000000 T USB_DevConnect -00000000 T USB_DevDisconnect -00000000 T USB_DevInit -00000000 T USB_DisableGlobalInt -00000000 T USB_DoPing -00000000 T USB_DriveVbus -00000000 T USB_EP0StartXfer -00000000 T USB_EP0_OutStart -00000000 T USB_EPClearStall -00000000 T USB_EPSetStall -00000000 T USB_EPStartXfer -00000000 T USB_EnableGlobalInt -00000000 T USB_FlushRxFifo -00000000 T USB_FlushTxFifo -00000000 T USB_GetCurrentFrame -00000000 T USB_GetDevSpeed -00000000 T USB_GetHostSpeed -00000000 T USB_GetMode -00000000 T USB_HC_Halt -00000000 T USB_HC_Init -00000000 T USB_HC_ReadInterrupt -00000000 T USB_HC_StartXfer -00000000 T USB_HostInit -00000000 T USB_InitFSLSPClkSel -00000000 T USB_ReadDevAllInEpInterrupt -00000000 T USB_ReadDevAllOutEpInterrupt -00000000 T USB_ReadDevInEPInterrupt -00000000 T USB_ReadDevOutEPInterrupt -00000000 T USB_ReadInterrupts -00000000 T USB_ReadPacket -00000000 T USB_ResetPort -00000000 T USB_SetCurrentMode -00000000 T USB_SetDevAddress -00000000 T USB_SetDevSpeed -00000000 T USB_StopDevice -00000000 T USB_StopHost -00000000 T USB_WritePacket -00000000 b debug.9622 - -stm32f4xx_hal_cortex.o: -00000000 T HAL_MPU_ConfigRegion -00000000 T HAL_NVIC_ClearPendingIRQ -00000000 T HAL_NVIC_DisableIRQ -00000000 T HAL_NVIC_EnableIRQ -00000000 T HAL_NVIC_GetActive -00000000 T HAL_NVIC_GetPendingIRQ -00000000 T HAL_NVIC_GetPriority -00000000 T HAL_NVIC_GetPriorityGrouping -00000000 T HAL_NVIC_SetPendingIRQ -00000000 T HAL_NVIC_SetPriority -00000000 T HAL_NVIC_SetPriorityGrouping -00000000 T HAL_NVIC_SystemReset -00000000 T HAL_SYSTICK_CLKSourceConfig -00000000 W HAL_SYSTICK_Callback -00000000 T HAL_SYSTICK_Config -00000000 T HAL_SYSTICK_IRQHandler - -stm32f4xx_hal_dma_ex.o: -00000000 T HAL_DMAEx_ChangeMemory -00000000 T HAL_DMAEx_MultiBufferStart -00000000 T HAL_DMAEx_MultiBufferStart_IT - -stm32f4xx_hal_hcd.o: -00000000 W HAL_HCD_Connect_Callback -00000000 T HAL_HCD_DeInit -00000000 W HAL_HCD_Disconnect_Callback -00000000 T HAL_HCD_GetCurrentFrame -00000000 T HAL_HCD_GetCurrentSpeed -00000000 T HAL_HCD_GetState -00000000 T HAL_HCD_HC_GetState -00000000 T HAL_HCD_HC_GetURBState -00000000 T HAL_HCD_HC_GetXferCount -00000000 T HAL_HCD_HC_Halt -00000000 T HAL_HCD_HC_Init -00000000 W HAL_HCD_HC_NotifyURBChange_Callback -00000000 T HAL_HCD_HC_SubmitRequest -00000000 T HAL_HCD_IRQHandler -00000000 T HAL_HCD_Init -00000000 W HAL_HCD_MspDeInit -00000000 W HAL_HCD_MspInit -00000000 T HAL_HCD_ResetPort -00000000 W HAL_HCD_SOF_Callback -00000000 T HAL_HCD_Start -00000000 T HAL_HCD_Stop - U USB_CoreInit - U USB_DisableGlobalInt - U USB_DriveVbus - U USB_EnableGlobalInt - U USB_GetCurrentFrame - U USB_GetHostSpeed - U USB_GetMode - U USB_HC_Halt - U USB_HC_Init - U USB_HC_ReadInterrupt - U USB_HC_StartXfer - U USB_HostInit - U USB_InitFSLSPClkSel - U USB_ReadInterrupts - U USB_ReadPacket - U USB_ResetPort - U USB_SetCurrentMode - U USB_StopHost - -stm32f4xx_hal_nand.o: - -stm32f4xx_hal_rtc.o: - -stm32f4xx_hal_crc.o: - -stm32f4xx_hal_dsi.o: -00000000 T HAL_DSI_ColorMode -00000000 T HAL_DSI_ConfigAdaptedCommandMode -00000000 T HAL_DSI_ConfigCommand -00000000 T HAL_DSI_ConfigErrorMonitor -00000000 T HAL_DSI_ConfigFlowControl -00000000 T HAL_DSI_ConfigHostTimeouts -00000000 T HAL_DSI_ConfigPhyTimer -00000000 T HAL_DSI_ConfigVideoMode -00000000 T HAL_DSI_DeInit -00000000 W HAL_DSI_EndOfRefreshCallback -00000000 T HAL_DSI_EnterULPM -00000000 T HAL_DSI_EnterULPMData -00000000 W HAL_DSI_ErrorCallback -00000000 T HAL_DSI_ExitULPM -00000000 T HAL_DSI_ExitULPMData -00000000 T HAL_DSI_ForceDataLanesInRX -00000000 T HAL_DSI_ForceRXLowPower -00000000 T HAL_DSI_ForceTXStopMode -00000000 T HAL_DSI_GetError -00000000 T HAL_DSI_GetState -00000000 T HAL_DSI_IRQHandler -00000000 T HAL_DSI_Init -00000000 T HAL_DSI_LongWrite -00000000 W HAL_DSI_MspDeInit -00000000 W HAL_DSI_MspInit -00000000 T HAL_DSI_PatternGeneratorStart -00000000 T HAL_DSI_PatternGeneratorStop -00000000 T HAL_DSI_Read -00000000 T HAL_DSI_Refresh -00000000 T HAL_DSI_SetContentionDetectionOff -00000000 T HAL_DSI_SetGenericVCID -00000000 T HAL_DSI_SetLanePinsConfiguration -00000000 T HAL_DSI_SetLowPowerRXFilter -00000000 T HAL_DSI_SetPHYTimings -00000000 T HAL_DSI_SetPullDown -00000000 T HAL_DSI_SetSDD -00000000 T HAL_DSI_SetSlewRateAndDelayTuning -00000000 T HAL_DSI_ShortWrite -00000000 T HAL_DSI_Shutdown -00000000 T HAL_DSI_Start -00000000 T HAL_DSI_Stop -00000000 W HAL_DSI_TearingEffectCallback - U HAL_GetTick - -stm32f4xx_hal_i2c.o: - U HAL_DMA_Abort_IT - U HAL_DMA_GetError - U HAL_DMA_Start_IT - U HAL_GetTick -00000000 W HAL_I2C_AbortCpltCallback -00000000 W HAL_I2C_AddrCallback -00000000 T HAL_I2C_DeInit -00000000 T HAL_I2C_DisableListen_IT -00000000 T HAL_I2C_ER_IRQHandler -00000000 T HAL_I2C_EV_IRQHandler -00000000 T HAL_I2C_EnableListen_IT -00000000 W HAL_I2C_ErrorCallback -00000000 T HAL_I2C_GetError -00000000 T HAL_I2C_GetMode -00000000 T HAL_I2C_GetState -00000000 T HAL_I2C_Init -00000000 T HAL_I2C_IsDeviceReady -00000000 W HAL_I2C_ListenCpltCallback -00000000 W HAL_I2C_MasterRxCpltCallback -00000000 W HAL_I2C_MasterTxCpltCallback -00000000 T HAL_I2C_Master_Abort_IT -00000000 T HAL_I2C_Master_Receive -00000000 T HAL_I2C_Master_Receive_DMA -00000000 T HAL_I2C_Master_Receive_IT -00000000 T HAL_I2C_Master_Sequential_Receive_IT -00000000 T HAL_I2C_Master_Sequential_Transmit_IT -00000000 T HAL_I2C_Master_Transmit -00000000 T HAL_I2C_Master_Transmit_DMA -00000000 T HAL_I2C_Master_Transmit_IT -00000000 W HAL_I2C_MemRxCpltCallback -00000000 W HAL_I2C_MemTxCpltCallback -00000000 T HAL_I2C_Mem_Read -00000000 T HAL_I2C_Mem_Read_DMA -00000000 T HAL_I2C_Mem_Read_IT -00000000 T HAL_I2C_Mem_Write -00000000 T HAL_I2C_Mem_Write_DMA -00000000 T HAL_I2C_Mem_Write_IT -00000000 W HAL_I2C_MspDeInit -00000000 W HAL_I2C_MspInit -00000000 W HAL_I2C_SlaveRxCpltCallback -00000000 W HAL_I2C_SlaveTxCpltCallback -00000000 T HAL_I2C_Slave_Receive -00000000 T HAL_I2C_Slave_Receive_DMA -00000000 T HAL_I2C_Slave_Receive_IT -00000000 T HAL_I2C_Slave_Sequential_Receive_IT -00000000 T HAL_I2C_Slave_Sequential_Transmit_IT -00000000 T HAL_I2C_Slave_Transmit -00000000 T HAL_I2C_Slave_Transmit_DMA -00000000 T HAL_I2C_Slave_Transmit_IT - U HAL_RCC_GetPCLK1Freq -00000000 t I2C_DMAAbort -00000000 t I2C_DMAError -00000000 t I2C_DMAXferCplt -00000000 t I2C_ITError -00000000 t I2C_IsAcknowledgeFailed -00000000 t I2C_RequestMemoryRead -00000000 t I2C_RequestMemoryWrite -00000000 t I2C_WaitOnBTFFlagUntilTimeout -00000000 t I2C_WaitOnFlagUntilTimeout -00000000 t I2C_WaitOnMasterAddressFlagUntilTimeout -00000000 t I2C_WaitOnRXNEFlagUntilTimeout -00000000 t I2C_WaitOnTXEFlagUntilTimeout - U SystemCoreClock - -stm32f4xx_hal_nor.o: - -stm32f4xx_hal_rtc_ex.o: - -stm32f4xx_hal_cryp.o: - -stm32f4xx_hal_eth.o: - -stm32f4xx_hal_i2c_ex.o: -00000000 T HAL_I2CEx_ConfigAnalogFilter -00000000 T HAL_I2CEx_ConfigDigitalFilter - -stm32f4xx_hal_pccard.o: - -stm32f4xx_hal_sai.o: - U HAL_DMA_Abort - U HAL_DMA_Abort_IT - U HAL_DMA_Start_IT - U HAL_GetTick -00000000 T HAL_SAI_Abort -00000000 T HAL_SAI_DMAPause -00000000 T HAL_SAI_DMAResume -00000000 T HAL_SAI_DMAStop -00000000 T HAL_SAI_DeInit -00000000 T HAL_SAI_DisableRxMuteMode -00000000 T HAL_SAI_DisableTxMuteMode -00000000 T HAL_SAI_EnableRxMuteMode -00000000 T HAL_SAI_EnableTxMuteMode -00000000 W HAL_SAI_ErrorCallback -00000000 T HAL_SAI_GetError -00000000 T HAL_SAI_GetState -00000000 T HAL_SAI_IRQHandler -00000000 T HAL_SAI_Init -00000000 T HAL_SAI_InitProtocol -00000000 W HAL_SAI_MspDeInit -00000000 W HAL_SAI_MspInit -00000000 T HAL_SAI_Receive -00000000 T HAL_SAI_Receive_DMA -00000000 T HAL_SAI_Receive_IT -00000000 W HAL_SAI_RxCpltCallback -00000000 W HAL_SAI_RxHalfCpltCallback -00000000 T HAL_SAI_Transmit -00000000 T HAL_SAI_Transmit_DMA -00000000 T HAL_SAI_Transmit_IT -00000000 W HAL_SAI_TxCpltCallback -00000000 W HAL_SAI_TxHalfCpltCallback - U SAI_BlockSynchroConfig -00000000 t SAI_DMAAbort -00000000 t SAI_DMAError -00000000 t SAI_DMARxCplt -00000000 t SAI_DMARxHalfCplt -00000000 t SAI_DMATxCplt -00000000 t SAI_DMATxHalfCplt -00000000 t SAI_Disable -00000000 t SAI_FillFifo - U SAI_GetInputClock -00000000 t SAI_InterruptFlag -00000000 t SAI_Receive_IT16Bit -00000000 t SAI_Receive_IT32Bit -00000000 t SAI_Receive_IT8Bit -00000000 t SAI_Transmit_IT16Bit -00000000 t SAI_Transmit_IT32Bit -00000000 t SAI_Transmit_IT8Bit - U SystemCoreClock - -stm32f4xx_hal_cryp_ex.o: - -stm32f4xx_hal_flash.o: - U FLASH_Erase_Sector - U FLASH_FlushCaches -00000000 t FLASH_Program_HalfWord -00000000 t FLASH_Program_Word -00000000 t FLASH_SetErrorCode -00000000 T FLASH_WaitForLastOperation -00000000 W HAL_FLASH_EndOfOperationCallback -00000000 T HAL_FLASH_GetError -00000000 T HAL_FLASH_IRQHandler -00000000 T HAL_FLASH_Lock -00000000 T HAL_FLASH_OB_Launch -00000000 T HAL_FLASH_OB_Lock -00000000 T HAL_FLASH_OB_Unlock -00000000 W HAL_FLASH_OperationErrorCallback -00000000 T HAL_FLASH_Program -00000000 T HAL_FLASH_Program_IT -00000000 T HAL_FLASH_Unlock - U HAL_GetTick -00000020 C pFlash - -stm32f4xx_hal_i2s.o: - -stm32f4xx_hal_pcd.o: - U HAL_PCDEx_ActivateLPM - U HAL_PCDEx_LPM_Callback -00000000 T HAL_PCD_ActivateRemoteWakeup -00000000 W HAL_PCD_ConnectCallback -00000000 W HAL_PCD_DataInStageCallback -00000000 W HAL_PCD_DataOutStageCallback -00000000 T HAL_PCD_DeActivateRemoteWakeup -00000000 T HAL_PCD_DeInit -00000000 T HAL_PCD_DevConnect -00000000 T HAL_PCD_DevDisconnect -00000000 W HAL_PCD_DisconnectCallback -00000000 T HAL_PCD_EP_Close -00000000 T HAL_PCD_EP_ClrStall -00000000 T HAL_PCD_EP_Flush -00000000 T HAL_PCD_EP_GetRxCount -00000000 T HAL_PCD_EP_Open -00000000 T HAL_PCD_EP_Receive -00000000 T HAL_PCD_EP_SetStall -00000000 T HAL_PCD_EP_Transmit -00000000 T HAL_PCD_GetState -00000000 T HAL_PCD_IRQHandler -00000000 W HAL_PCD_ISOINIncompleteCallback -00000000 W HAL_PCD_ISOOUTIncompleteCallback -00000000 T HAL_PCD_Init -00000000 W HAL_PCD_MspDeInit -00000000 W HAL_PCD_MspInit -00000000 W HAL_PCD_ResetCallback -00000000 W HAL_PCD_ResumeCallback -00000000 W HAL_PCD_SOFCallback -00000000 T HAL_PCD_SetAddress -00000000 W HAL_PCD_SetupStageCallback -00000000 T HAL_PCD_Start -00000000 T HAL_PCD_Stop -00000000 W HAL_PCD_SuspendCallback - U USB_ActivateEndpoint - U USB_ActivateSetup - U USB_CoreInit - U USB_DeactivateEndpoint - U USB_DevConnect - U USB_DevDisconnect - U USB_DevInit - U USB_DisableGlobalInt - U USB_EP0StartXfer - U USB_EP0_OutStart - U USB_EPClearStall - U USB_EPSetStall - U USB_EPStartXfer - U USB_EnableGlobalInt - U USB_FlushRxFifo - U USB_FlushTxFifo - U USB_GetDevSpeed - U USB_GetMode - U USB_ReadDevAllInEpInterrupt - U USB_ReadDevAllOutEpInterrupt - U USB_ReadDevInEPInterrupt - U USB_ReadDevOutEPInterrupt - U USB_ReadInterrupts - U USB_ReadPacket - U USB_SetCurrentMode - U USB_SetDevAddress - U USB_StopDevice - U USB_WritePacket - -stm32f4xx_hal_sai_ex.o: -00000000 T SAI_BlockSynchroConfig -00000000 T SAI_GetInputClock - -stm32f4xx_hal_tim_ex.o: - U HAL_DMA_Start_IT -00000000 W HAL_TIMEx_BreakCallback -00000000 W HAL_TIMEx_CommutationCallback -00000000 T HAL_TIMEx_ConfigBreakDeadTime -00000000 T HAL_TIMEx_ConfigCommutationEvent -00000000 T HAL_TIMEx_ConfigCommutationEvent_DMA -00000000 T HAL_TIMEx_ConfigCommutationEvent_IT -00000000 T HAL_TIMEx_HallSensor_DeInit -00000000 T HAL_TIMEx_HallSensor_GetState -00000000 T HAL_TIMEx_HallSensor_Init -00000000 W HAL_TIMEx_HallSensor_MspDeInit -00000000 W HAL_TIMEx_HallSensor_MspInit -00000000 T HAL_TIMEx_HallSensor_Start -00000000 T HAL_TIMEx_HallSensor_Start_DMA -00000000 T HAL_TIMEx_HallSensor_Start_IT -00000000 T HAL_TIMEx_HallSensor_Stop -00000000 T HAL_TIMEx_HallSensor_Stop_DMA -00000000 T HAL_TIMEx_HallSensor_Stop_IT -00000000 T HAL_TIMEx_MasterConfigSynchronization -00000000 T HAL_TIMEx_OCN_Start -00000000 T HAL_TIMEx_OCN_Start_DMA -00000000 T HAL_TIMEx_OCN_Start_IT -00000000 T HAL_TIMEx_OCN_Stop -00000000 T HAL_TIMEx_OCN_Stop_DMA -00000000 T HAL_TIMEx_OCN_Stop_IT -00000000 T HAL_TIMEx_OnePulseN_Start -00000000 T HAL_TIMEx_OnePulseN_Start_IT -00000000 T HAL_TIMEx_OnePulseN_Stop -00000000 T HAL_TIMEx_OnePulseN_Stop_IT -00000000 T HAL_TIMEx_PWMN_Start -00000000 T HAL_TIMEx_PWMN_Start_DMA -00000000 T HAL_TIMEx_PWMN_Start_IT -00000000 T HAL_TIMEx_PWMN_Stop -00000000 T HAL_TIMEx_PWMN_Stop_DMA -00000000 T HAL_TIMEx_PWMN_Stop_IT -00000000 T HAL_TIMEx_RemapConfig -00000000 T TIMEx_DMACommutationCplt - U TIM_Base_SetConfig - U TIM_CCxChannelCmd -00000000 t TIM_CCxNChannelCmd - U TIM_DMACaptureCplt - U TIM_DMADelayPulseCplt - U TIM_DMAError - U TIM_OC2_SetConfig - U TIM_TI1_SetConfig - -stm32f4xx_hal_dac.o: -00000000 t DAC_DMAConvCpltCh1 - U DAC_DMAConvCpltCh2 -00000000 t DAC_DMAErrorCh1 - U DAC_DMAErrorCh2 -00000000 t DAC_DMAHalfConvCpltCh1 - U DAC_DMAHalfConvCpltCh2 - U HAL_DACEx_DMAUnderrunCallbackCh2 -00000000 T HAL_DAC_ConfigChannel -00000000 W HAL_DAC_ConvCpltCallbackCh1 -00000000 W HAL_DAC_ConvHalfCpltCallbackCh1 -00000000 W HAL_DAC_DMAUnderrunCallbackCh1 -00000000 T HAL_DAC_DeInit -00000000 W HAL_DAC_ErrorCallbackCh1 -00000000 T HAL_DAC_GetError -00000000 T HAL_DAC_GetState -00000000 T HAL_DAC_GetValue -00000000 T HAL_DAC_IRQHandler -00000000 T HAL_DAC_Init -00000000 W HAL_DAC_MspDeInit -00000000 W HAL_DAC_MspInit -00000000 T HAL_DAC_SetValue -00000000 T HAL_DAC_Start -00000000 T HAL_DAC_Start_DMA -00000000 T HAL_DAC_Stop -00000000 T HAL_DAC_Stop_DMA - U HAL_DMA_Abort - U HAL_DMA_Start_IT - -stm32f4xx_hal_flash_ex.o: -00000000 T FLASH_Erase_Sector -00000000 T FLASH_FlushCaches -00000000 t FLASH_MassErase - U FLASH_WaitForLastOperation -00000000 T HAL_FLASHEx_AdvOBGetConfig -00000000 T HAL_FLASHEx_AdvOBProgram -00000000 T HAL_FLASHEx_Erase -00000000 T HAL_FLASHEx_Erase_IT -00000000 T HAL_FLASHEx_OBGetConfig -00000000 T HAL_FLASHEx_OBProgram -00000000 T HAL_FLASHEx_OB_DeSelectPCROP -00000000 T HAL_FLASHEx_OB_GetBank2WRP -00000000 T HAL_FLASHEx_OB_SelectPCROP - U pFlash - -stm32f4xx_hal_i2s_ex.o: - -stm32f4xx_hal_pcd_ex.o: -00000000 T HAL_PCDEx_ActivateLPM -00000000 T HAL_PCDEx_DeActivateLPM -00000000 W HAL_PCDEx_LPM_Callback -00000000 T HAL_PCDEx_SetRxFiFo -00000000 T HAL_PCDEx_SetTxFiFo - -stm32f4xx_hal_sd.o: - U HAL_DMA_Abort - U HAL_DMA_Start_IT - U HAL_Delay -00000000 T HAL_SD_CheckReadOperation -00000000 T HAL_SD_CheckWriteOperation -00000000 W HAL_SD_DMA_RxCpltCallback -00000000 W HAL_SD_DMA_RxErrorCallback -00000000 W HAL_SD_DMA_TxCpltCallback -00000000 W HAL_SD_DMA_TxErrorCallback -00000000 T HAL_SD_DeInit -00000000 T HAL_SD_Erase -00000000 T HAL_SD_GetCardStatus -00000000 T HAL_SD_GetStatus -00000000 T HAL_SD_Get_CardInfo -00000000 T HAL_SD_HighSpeed -00000000 T HAL_SD_IRQHandler -00000000 T HAL_SD_Init -00000000 W HAL_SD_MspDeInit -00000000 W HAL_SD_MspInit -00000000 T HAL_SD_ReadBlocks -00000000 T HAL_SD_ReadBlocks_DMA -00000000 T HAL_SD_SendSDStatus -00000000 T HAL_SD_StopTransfer -00000000 T HAL_SD_WideBusOperation_Config -00000000 T HAL_SD_WriteBlocks -00000000 T HAL_SD_WriteBlocks_DMA -00000000 W HAL_SD_XferCpltCallback -00000000 W HAL_SD_XferErrorCallback - U SDIO_DataConfig - U SDIO_GetCommandResponse - U SDIO_GetPowerState - U SDIO_GetResponse - U SDIO_Init - U SDIO_PowerState_OFF - U SDIO_PowerState_ON - U SDIO_ReadFIFO - U SDIO_SendCommand - U SDIO_WriteFIFO -00000000 t SD_CmdResp1Error -00000000 t SD_CmdResp2Error -00000000 t SD_DMA_RxCplt -00000000 t SD_DMA_RxError -00000000 t SD_DMA_TxCplt -00000000 t SD_DMA_TxError -00000000 t SD_FindSCR -00000000 t SD_IsCardProgramming - U memset - -stm32f4xx_hal_uart.o: - U HAL_DMA_Abort - U HAL_DMA_Abort_IT - U HAL_DMA_Start_IT - U HAL_GetTick -00000000 T HAL_HalfDuplex_EnableReceiver -00000000 T HAL_HalfDuplex_EnableTransmitter -00000000 T HAL_HalfDuplex_Init -00000000 T HAL_LIN_Init -00000000 T HAL_LIN_SendBreak -00000000 T HAL_MultiProcessor_EnterMuteMode -00000000 T HAL_MultiProcessor_ExitMuteMode -00000000 T HAL_MultiProcessor_Init - U HAL_RCC_GetPCLK1Freq - U HAL_RCC_GetPCLK2Freq -00000000 T HAL_UART_Abort -00000000 W HAL_UART_AbortCpltCallback -00000000 T HAL_UART_AbortReceive -00000000 W HAL_UART_AbortReceiveCpltCallback -00000000 T HAL_UART_AbortReceive_IT -00000000 T HAL_UART_AbortTransmit -00000000 W HAL_UART_AbortTransmitCpltCallback -00000000 T HAL_UART_AbortTransmit_IT -00000000 T HAL_UART_Abort_IT -00000000 T HAL_UART_DMAPause -00000000 T HAL_UART_DMAResume -00000000 T HAL_UART_DMAStop -00000000 T HAL_UART_DeInit -00000000 W HAL_UART_ErrorCallback -00000000 T HAL_UART_GetError -00000000 T HAL_UART_GetState -00000000 T HAL_UART_IRQHandler -00000000 T HAL_UART_Init -00000000 W HAL_UART_MspDeInit -00000000 W HAL_UART_MspInit -00000000 T HAL_UART_Receive -00000000 T HAL_UART_Receive_DMA -00000000 T HAL_UART_Receive_IT -00000000 W HAL_UART_RxCpltCallback -00000000 W HAL_UART_RxHalfCpltCallback -00000000 T HAL_UART_Transmit -00000000 T HAL_UART_Transmit_DMA -00000000 T HAL_UART_Transmit_IT -00000000 W HAL_UART_TxCpltCallback -00000000 W HAL_UART_TxHalfCpltCallback -00000000 t UART_DMAAbortOnError -00000000 t UART_DMAError -00000000 t UART_DMAReceiveCplt -00000000 t UART_DMARxAbortCallback -00000000 t UART_DMARxHalfCplt -00000000 t UART_DMARxOnlyAbortCallback -00000000 t UART_DMATransmitCplt -00000000 t UART_DMATxAbortCallback -00000000 t UART_DMATxHalfCplt -00000000 t UART_DMATxOnlyAbortCallback -00000000 t UART_EndRxTransfer -00000000 t UART_Receive_IT -00000000 t UART_SetConfig -00000000 t UART_WaitOnFlagUntilTimeout.constprop.2 - -stm32f4xx_hal_dac_ex.o: -00000000 T DAC_DMAConvCpltCh2 -00000000 T DAC_DMAErrorCh2 -00000000 T DAC_DMAHalfConvCpltCh2 -00000000 W HAL_DACEx_ConvCpltCallbackCh2 -00000000 W HAL_DACEx_ConvHalfCpltCallbackCh2 -00000000 W HAL_DACEx_DMAUnderrunCallbackCh2 -00000000 T HAL_DACEx_DualGetValue -00000000 T HAL_DACEx_DualSetValue -00000000 W HAL_DACEx_ErrorCallbackCh2 -00000000 T HAL_DACEx_NoiseWaveGenerate -00000000 T HAL_DACEx_TriangleWaveGenerate - -stm32f4xx_hal_flash_ramfunc.o: - -stm32f4xx_hal_irda.o: - -stm32f4xx_hal_pwr.o: -00000000 T HAL_PWR_ConfigPVD -00000000 T HAL_PWR_DeInit -00000000 T HAL_PWR_DisableBkUpAccess -00000000 T HAL_PWR_DisablePVD -00000000 T HAL_PWR_DisableSEVOnPend -00000000 T HAL_PWR_DisableSleepOnExit -00000000 T HAL_PWR_DisableWakeUpPin -00000000 T HAL_PWR_EnableBkUpAccess -00000000 T HAL_PWR_EnablePVD -00000000 T HAL_PWR_EnableSEVOnPend -00000000 T HAL_PWR_EnableSleepOnExit -00000000 T HAL_PWR_EnableWakeUpPin -00000000 T HAL_PWR_EnterSLEEPMode -00000000 T HAL_PWR_EnterSTANDBYMode -00000000 T HAL_PWR_EnterSTOPMode -00000000 W HAL_PWR_PVDCallback -00000000 T HAL_PWR_PVD_IRQHandler - -stm32f4xx_hal_sdram.o: - -stm32f4xx_hal_usart.o: - -usbd_core.o: -00000000 T USBD_ClrClassConfig - U USBD_CtlContinueRx - U USBD_CtlContinueSendData - U USBD_CtlReceiveStatus - U USBD_CtlSendStatus -00000000 T USBD_DeInit -00000000 T USBD_Init -00000000 T USBD_LL_DataInStage -00000000 T USBD_LL_DataOutStage - U USBD_LL_DeInit -00000000 T USBD_LL_DevConnected -00000000 T USBD_LL_DevDisconnected - U USBD_LL_Init -00000000 T USBD_LL_IsoINIncomplete -00000000 T USBD_LL_IsoOUTIncomplete - U USBD_LL_OpenEP - U USBD_LL_PrepareReceive -00000000 T USBD_LL_Reset -00000000 T USBD_LL_Resume -00000000 T USBD_LL_SOF -00000000 T USBD_LL_SetSpeed -00000000 T USBD_LL_SetupStage - U USBD_LL_StallEP - U USBD_LL_Start - U USBD_LL_Stop -00000000 T USBD_LL_Suspend - U USBD_ParseSetupRequest -00000000 T USBD_RegisterClass -00000000 T USBD_RunTestMode -00000000 T USBD_SetClassConfig -00000000 T USBD_Start - U USBD_StdDevReq - U USBD_StdEPReq - U USBD_StdItfReq -00000000 T USBD_Stop - -usbd_ctlreq.o: - U USBD_ClrClassConfig -00000000 T USBD_CtlError - U USBD_CtlSendData - U USBD_CtlSendStatus -00000000 T USBD_GetString - U USBD_LL_ClearStallEP - U USBD_LL_IsStallEP - U USBD_LL_SetUSBAddress - U USBD_LL_StallEP -00000000 T USBD_ParseSetupRequest - U USBD_SetClassConfig -00000000 T USBD_StdDevReq -00000000 T USBD_StdEPReq -00000000 T USBD_StdItfReq -00000000 b cfgidx.10192 - -usbd_ioreq.o: -00000000 T USBD_CtlContinueRx -00000000 T USBD_CtlContinueSendData -00000000 T USBD_CtlPrepareRx -00000000 T USBD_CtlReceiveStatus -00000000 T USBD_CtlSendData -00000000 T USBD_CtlSendStatus -00000000 T USBD_GetRxCount - U USBD_LL_GetRxDataSize - U USBD_LL_PrepareReceive - U USBD_LL_Transmit - -usbd_cdc.o: -00000000 D USBD_CDC -00000000 D USBD_CDC_CfgFSDesc -00000000 D USBD_CDC_CfgHSDesc -00000000 t USBD_CDC_DataIn -00000000 t USBD_CDC_DataOut -00000000 t USBD_CDC_DeInit -00000000 d USBD_CDC_DeviceQualifierDesc -00000000 t USBD_CDC_EP0_RxReady -00000000 T USBD_CDC_GetDeviceQualifierDescriptor -00000000 t USBD_CDC_GetFSCfgDesc -00000000 t USBD_CDC_GetHSCfgDesc -00000000 t USBD_CDC_GetOtherSpeedCfgDesc -00000000 t USBD_CDC_Init -00000000 D USBD_CDC_OtherSpeedCfgDesc -00000000 T USBD_CDC_ReceivePacket -00000000 T USBD_CDC_RegisterInterface -00000000 T USBD_CDC_SetRxBuffer -00000000 T USBD_CDC_SetTxBuffer -00000000 t USBD_CDC_Setup -00000000 T USBD_CDC_TransmitPacket - U USBD_CtlPrepareRx - U USBD_CtlSendData - U USBD_LL_CloseEP - U USBD_LL_GetRxDataSize - U USBD_LL_OpenEP - U USBD_LL_PrepareReceive - U USBD_LL_Transmit - U free -00000000 b ifalt.10186 - U malloc - -diskio.o: - U disk -00000000 T disk_initialize -00000000 T disk_ioctl -00000000 T disk_read -00000000 T disk_status -00000000 T disk_write -00000000 W get_fattime - -ff.o: -00000000 r .LC0 -00000009 r .LC1 -00000000 r ExCvt -00000000 b FatFs -00000000 b Fsid -00000000 b LfnBuf -00000000 r LfnOfs -00000000 t check_fs -00000000 t clmt_clust -00000000 T clust2sect -00000000 t create_chain -00000000 r cst.10413 -00000000 t dir_find.part.6 -00000000 t dir_next -00000000 t dir_read.constprop.9 -00000000 t dir_register -00000000 t dir_remove -00000000 t dir_sdi - U disk_initialize - U disk_ioctl - U disk_read - U disk_status - U disk_write -00000000 T f_chmod -00000000 T f_close -00000000 T f_closedir -00000000 T f_getfree -00000000 T f_gets -00000000 T f_lseek -00000000 T f_mkdir -00000000 T f_mkfs -00000000 T f_mount -00000000 T f_open -00000000 T f_opendir -00000000 T f_printf -00000000 T f_putc -00000000 T f_puts -00000000 T f_read -00000000 T f_readdir -00000000 T f_rename -00000000 T f_stat -00000000 T f_sync -00000000 T f_truncate -00000000 T f_unlink -00000000 T f_utime -00000000 T f_write - U ff_convert - U ff_wtoupper -00000000 t find_volume -00000000 t follow_path -00000000 T get_fat - U get_fattime -00000000 t get_fileinfo -00000000 t get_ldnumber -00000000 t ld_clust.isra.0 -00000000 t mem_cpy -00000000 t mem_set -00000000 t move_window -00000000 T put_fat -00000000 t putc_bfd -00000000 t remove_chain -00000000 t sum_sfn -00000000 t sync_fs -00000000 t sync_window -00000000 t sync_window.part.1 -00000000 t validate -00000000 r vst.10412 - -ff_gen_drv.o: -00000000 T FATFS_GetAttachedDriversNbr -00000000 T FATFS_LinkDriver -00000000 T FATFS_LinkDriverEx -00000000 T FATFS_UnLinkDriver -00000000 T FATFS_UnLinkDriverEx -00000000 B disk - -sd_diskio.o: - U BSP_SD_GetCardInfo - U BSP_SD_GetStatus - U BSP_SD_Init - U BSP_SD_ReadBlocks - U BSP_SD_WriteBlocks -00000000 R SD_Driver -00000000 T SD_initialize -00000000 T SD_ioctl -00000000 T SD_read -00000000 T SD_status -00000000 T SD_write -00000000 d Stat - -ccsbcs.o: -00000000 r Tbl -00000000 T ff_convert -00000000 T ff_wtoupper -00000000 r tbl_lower.9823 -00000000 r tbl_upper.9824 - -wm8994.o: - U AUDIO_IO_DeInit - U AUDIO_IO_Delay - U AUDIO_IO_Init - U AUDIO_IO_Read - U AUDIO_IO_Write -00000000 b inputEnabled -00000000 b outputEnabled -00000000 T wm8994_DeInit -00000000 T wm8994_Init -00000000 T wm8994_Pause -00000000 T wm8994_Play -00000000 T wm8994_ReadID -00000000 T wm8994_Reset -00000000 T wm8994_Resume -00000000 T wm8994_SetFrequency -00000000 T wm8994_SetMute -00000000 T wm8994_SetOutputMode -00000000 T wm8994_SetVolume -00000000 T wm8994_Stop -00000000 D wm8994_drv diff --git a/variants/otto/link-tools/common.inc b/variants/otto/link-tools/common.inc deleted file mode 100755 index 1d70fde..0000000 --- a/variants/otto/link-tools/common.inc +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Linker script for libmaple. - * - * Original author "lanchon" from ST forums, with modifications by LeafLabs. - */ - -OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") - -/* - * Configure other libraries we want in the link. - * - * libgcc, libc, and libm are common across supported toolchains. - * However, some toolchains require additional archives which aren't - * present everywhere (e.g. ARM's gcc-arm-embedded releases). - * - * To hack around this, we let the build system specify additional - * archives by putting the right extra_libs.inc (in a directory under - * toolchains/) in our search path. - */ -GROUP(libgcc.a libc.a libm.a) -INCLUDE extra_libs.inc - -/* - * These force the linker to search for vector table symbols. - * - * These symbols vary by STM32 family (and also within families). - * It's up to the build system to configure the link's search path - * properly for the target MCU. - */ -INCLUDE vector_symbols.inc - -/* STM32 vector table. */ -EXTERN(__stm32_vector_table) - -/* C runtime initialization function. */ -EXTERN(start_c) - -/* main entry point */ -EXTERN(main) - -/* Initial stack pointer value. */ -EXTERN(__msp_init) -PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); - -/* Reset vector and chip reset entry point */ -EXTERN(__start__) -ENTRY(__start__) -PROVIDE(__exc_reset = __start__); - -/* Heap boundaries, for libmaple */ -EXTERN(_lm_heap_start); -EXTERN(_lm_heap_end); - -SECTIONS -{ - .text : - { - __text_start__ = .; - /* - * STM32 vector table. Leave this here. Yes, really. - */ - *(.stm32.interrupt_vector) - - /* - * Program code and vague linking - */ - *(.text .text.* .gnu.linkonce.t.*) - *(.plt) - *(.gnu.warning) - *(.glue_7t) *(.glue_7) *(.vfp11_veneer) - - *(.ARM.extab* .gnu.linkonce.armextab.*) - *(.gcc_except_table) - *(.eh_frame_hdr) - *(.eh_frame) - - . = ALIGN(4); - KEEP(*(.init)) - - . = ALIGN(4); - __preinit_array_start = .; - KEEP (*(.preinit_array)) - __preinit_array_end = .; - - . = ALIGN(4); - __init_array_start = .; - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - __init_array_end = .; - - . = ALIGN(0x4); - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*crtend.o(.ctors)) - - . = ALIGN(4); - KEEP(*(.fini)) - - . = ALIGN(4); - __fini_array_start = .; - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - __fini_array_end = .; - - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*crtend.o(.dtors)) - } > REGION_TEXT - - /* - * End of text - */ - .text.align : - { - . = ALIGN(8); - __text_end__ = .; - } > REGION_TEXT - - /* - * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI - */ - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > REGION_RODATA - __exidx_end = .; - - /* - * .data - */ - .data : - { - . = ALIGN(8); - __data_start__ = .; - - *(.got.plt) *(.got) - *(.data .data.* .gnu.linkonce.d.*) - - . = ALIGN(8); - __data_end__ = .; - } > REGION_DATA AT> REGION_RODATA - - /* - * Read-only data - */ - .rodata : - { - *(.rodata .rodata.* .gnu.linkonce.r.*) - /* .USER_FLASH: We allow users to allocate into Flash here */ - *(.USER_FLASH) - /* ROM image configuration; for C startup */ - . = ALIGN(4); - _lm_rom_img_cfgp = .; - LONG(LOADADDR(.data)); - } > REGION_RODATA - - /* - * .bss - */ - .bss : - { - . = ALIGN(8); - __bss_start__ = .; - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - . = ALIGN (8); - __bss_end__ = .; - _end = __bss_end__; - } > REGION_BSS - - - .heap : { - __heap_start__ = .; - end = __heap_start__; - _end = end; - __end = end; - KEEP(*(.heap)) - __heap_end__ = .; - __HeapLimit = __heap_end__; - } > REGION_HEAP - - /* - * Debugging sections - */ - .stab 0 (NOLOAD) : { *(.stab) } - .stabstr 0 (NOLOAD) : { *(.stabstr) } - /* DWARF debug sections. - * Symbols in the DWARF debugging sections are relative to the beginning - * of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - - .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } - .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } - /DISCARD/ : { *(.note.GNU-stack) } -} - - - /* - * Heap: Linker scripts may choose a custom heap by overriding - * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in - * internal SRAM, beginning after .bss, and growing towards - * the stack. - * - * I'm shoving these here naively; there's probably a cleaner way - * to go about this. [mbolivar] - */ - _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; - _lm_heap_end = __msp_init - 128K; diff --git a/variants/otto/link-tools/extra_libs.inc b/variants/otto/link-tools/extra_libs.inc deleted file mode 100755 index dd2c84f..0000000 --- a/variants/otto/link-tools/extra_libs.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- - * releases (https://launchpad.net/gcc-arm-embedded/). - */ - -/* This is for the provided newlib. */ -GROUP(libnosys.a) diff --git a/variants/otto/link-tools/flash.ld b/variants/otto/link-tools/flash.ld deleted file mode 100755 index a9085bf..0000000 --- a/variants/otto/link-tools/flash.ld +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Discovery F4 (STM32F407VGT6, high density) linker script for - * Flash builds. - */ - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 125K - rom (rx) : ORIGIN = 0x08010000, LENGTH = 960K /* ala42 */ -} - -/* GROUP(libcs4_stm32_high_density.a) */ - -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); -REGION_ALIAS("REGION_HEAP", ram); - -_FLASH_BUILD = 1; -INCLUDE common.inc diff --git a/variants/otto/link-tools/jtag.ld b/variants/otto/link-tools/jtag.ld deleted file mode 100755 index 8d7a127..0000000 --- a/variants/otto/link-tools/jtag.ld +++ /dev/null @@ -1,23 +0,0 @@ -/* - * aeroquad32 (STM32F469BIT6) linker script for - * JTAG (bare metal, no bootloader) builds. - */ - -MEMORY -{ - /* As per Keil linker script we have 320kB RAM. - * Leave last 4kB free for housekeeping variables, e.g.: DFU */ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 316K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 2048K -} - -/* GROUP(libcs3_stm32_high_density.a) */ - -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); -REGION_ALIAS("REGION_HEAP", ram); - -_FLASH_BUILD = 1; -INCLUDE common.inc diff --git a/variants/otto/link-tools/names.inc b/variants/otto/link-tools/names.inc deleted file mode 100755 index 6d7ff6e..0000000 --- a/variants/otto/link-tools/names.inc +++ /dev/null @@ -1,78 +0,0 @@ -EXTERN(__cs3_stack) -EXTERN(__cs3_reset) -EXTERN(__exc_nmi) -EXTERN(__exc_hardfault) -EXTERN(__exc_memmanage) -EXTERN(__exc_busfault) -EXTERN(__exc_usagefault) -EXTERN(__stm32reservedexception7) -EXTERN(__stm32reservedexception8) -EXTERN(__stm32reservedexception9) -EXTERN(__stm32reservedexception10) -EXTERN(__exc_svc) -EXTERN(__exc_debug_monitor) -EXTERN(__stm32reservedexception13) -EXTERN(__exc_pendsv) -EXTERN(__exc_systick) - -EXTERN(__irq_wwdg) -EXTERN(__irq_pvd) -EXTERN(__irq_tamper) -EXTERN(__irq_rtc) -EXTERN(__irq_flash) -EXTERN(__irq_rcc) -EXTERN(__irq_exti0) -EXTERN(__irq_exti1) -EXTERN(__irq_exti2) -EXTERN(__irq_exti3) -EXTERN(__irq_exti4) -EXTERN(__irq_dma1_channel1) -EXTERN(__irq_dma1_channel2) -EXTERN(__irq_dma1_channel3) -EXTERN(__irq_dma1_channel4) -EXTERN(__irq_dma1_channel5) -EXTERN(__irq_dma1_channel6) -EXTERN(__irq_dma1_channel7) -EXTERN(__irq_adc) -EXTERN(__irq_usb_hp_can_tx) -EXTERN(__irq_usb_lp_can_rx0) -EXTERN(__irq_can_rx1) -EXTERN(__irq_can_sce) -EXTERN(__irq_exti9_5) -EXTERN(__irq_tim1_brk) -EXTERN(__irq_tim1_up) -EXTERN(__irq_tim1_trg_com) -EXTERN(__irq_tim1_cc) -EXTERN(__irq_tim2) -EXTERN(__irq_tim3) -EXTERN(__irq_tim4) -EXTERN(__irq_i2c1_ev) -EXTERN(__irq_i2c1_er) -EXTERN(__irq_i2c2_ev) -EXTERN(__irq_i2c2_er) -EXTERN(__irq_spi1) -EXTERN(__irq_spi2) -EXTERN(__irq_usart1) -EXTERN(__irq_usart2) -EXTERN(__irq_usart3) -EXTERN(__irq_exti15_10) -EXTERN(__irq_rtcalarm) -EXTERN(__irq_usbwakeup) - -EXTERN(__irq_tim8_brk) -EXTERN(__irq_tim8_up) -EXTERN(__irq_tim8_trg_com) -EXTERN(__irq_tim8_cc) -EXTERN(__irq_adc3) -EXTERN(__irq_fsmc) -EXTERN(__irq_sdio) -EXTERN(__irq_tim5) -EXTERN(__irq_spi3) -EXTERN(__irq_uart4) -EXTERN(__irq_uart5) -EXTERN(__irq_tim6) -EXTERN(__irq_tim7) -EXTERN(__irq_dma2_channel1) -EXTERN(__irq_dma2_channel2) -EXTERN(__irq_dma2_channel3) -EXTERN(__irq_dma2_channel4_5) diff --git a/variants/otto/link-tools/ram.ld b/variants/otto/link-tools/ram.ld deleted file mode 100755 index a9d6def..0000000 --- a/variants/otto/link-tools/ram.ld +++ /dev/null @@ -1,21 +0,0 @@ -/* - * aeroquad32 (STM32F103VET6, high density) linker script for - * RAM builds. - */ - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K - /* rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K ala42 */ - rom (rx) : ORIGIN = 0x08010000, LENGTH = 0K /* ala42 */ -} - -GROUP(libcs3_stm32_high_density.a) - -REGION_ALIAS("REGION_TEXT", ram); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", ram); -REGION_ALIAS("REGION_HEAP", ram); - -INCLUDE common.inc diff --git a/variants/otto/link-tools/vector_symbols.inc b/variants/otto/link-tools/vector_symbols.inc deleted file mode 100755 index f8519bb..0000000 --- a/variants/otto/link-tools/vector_symbols.inc +++ /dev/null @@ -1,78 +0,0 @@ -EXTERN(__msp_init) -EXTERN(__exc_reset) -EXTERN(__exc_nmi) -EXTERN(__exc_hardfault) -EXTERN(__exc_memmanage) -EXTERN(__exc_busfault) -EXTERN(__exc_usagefault) -EXTERN(__stm32reservedexception7) -EXTERN(__stm32reservedexception8) -EXTERN(__stm32reservedexception9) -EXTERN(__stm32reservedexception10) -EXTERN(__exc_svc) -EXTERN(__exc_debug_monitor) -EXTERN(__stm32reservedexception13) -EXTERN(__exc_pendsv) -EXTERN(__exc_systick) - -EXTERN(__irq_wwdg) -EXTERN(__irq_pvd) -EXTERN(__irq_tamper) -EXTERN(__irq_rtc) -EXTERN(__irq_flash) -EXTERN(__irq_rcc) -EXTERN(__irq_exti0) -EXTERN(__irq_exti1) -EXTERN(__irq_exti2) -EXTERN(__irq_exti3) -EXTERN(__irq_exti4) -EXTERN(__irq_dma1_channel1) -EXTERN(__irq_dma1_channel2) -EXTERN(__irq_dma1_channel3) -EXTERN(__irq_dma1_channel4) -EXTERN(__irq_dma1_channel5) -EXTERN(__irq_dma1_channel6) -EXTERN(__irq_dma1_channel7) -EXTERN(__irq_adc) -EXTERN(__irq_usb_hp_can_tx) -EXTERN(__irq_usb_lp_can_rx0) -EXTERN(__irq_can_rx1) -EXTERN(__irq_can_sce) -EXTERN(__irq_exti9_5) -EXTERN(__irq_tim1_brk) -EXTERN(__irq_tim1_up) -EXTERN(__irq_tim1_trg_com) -EXTERN(__irq_tim1_cc) -EXTERN(__irq_tim2) -EXTERN(__irq_tim3) -EXTERN(__irq_tim4) -EXTERN(__irq_i2c1_ev) -EXTERN(__irq_i2c1_er) -EXTERN(__irq_i2c2_ev) -EXTERN(__irq_i2c2_er) -EXTERN(__irq_spi1) -EXTERN(__irq_spi2) -EXTERN(__irq_usart1) -EXTERN(__irq_usart2) -EXTERN(__irq_usart3) -EXTERN(__irq_exti15_10) -EXTERN(__irq_rtcalarm) -EXTERN(__irq_usbwakeup) - -EXTERN(__irq_tim8_brk) -EXTERN(__irq_tim8_up) -EXTERN(__irq_tim8_trg_com) -EXTERN(__irq_tim8_cc) -EXTERN(__irq_adc3) -EXTERN(__irq_fsmc) -EXTERN(__irq_sdio) -EXTERN(__irq_tim5) -EXTERN(__irq_spi3) -EXTERN(__irq_uart4) -EXTERN(__irq_uart5) -EXTERN(__irq_tim6) -EXTERN(__irq_tim7) -EXTERN(__irq_dma2_channel1) -EXTERN(__irq_dma2_channel2) -EXTERN(__irq_dma2_channel3) -EXTERN(__irq_dma2_channel4_5) diff --git a/variants/otto/sd_conf.h b/variants/otto/sd_conf.h new file mode 100644 index 0000000..318e132 --- /dev/null +++ b/variants/otto/sd_conf.h @@ -0,0 +1,51 @@ +/** + ****************************************************************************** + * @file sd_conf.h + * @author fpiSTM + * @date 2017 + * @brief This file contains hw config for SD + ******************************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SD_CONF_H +#define __SD_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" + +#define SD_DATATIMEOUT ((uint32_t)100000000) + +/*SD-detect signal */ +#define SD_DETECT_PIN GPIO_PIN_10 +#define SD_DETECT_GPIO_PORT GPIOG +#define SD_DETECT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE() +#define SD_DETECT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE() +#define SD_DETECT_EXTI_IRQn EXTI2_IRQn + +/* Definition for BSP SD */ +#define SD_INSTANCE SDIO + +#define SD_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE +#define SD_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE +#define SD_CLK_EDGE SDIO_CLOCK_EDGE_RISING +#define SD_CLK_BYPASS SDIO_CLOCK_BYPASS_DISABLE +#define SD_CLK_PWR_SAVE SDIO_CLOCK_POWER_SAVE_DISABLE +#define SD_BUS_WIDE_1B SDIO_BUS_WIDE_1B +#define SD_BUS_WIDE_4B SDIO_BUS_WIDE_4B +#define SD_HW_FLOW_CTRL SDIO_HARDWARE_FLOW_CONTROL_ENABLE +#define SD_CLK_DIV SDIO_TRANSFER_CLK_DIV + +/* Definition for MSP SD */ +#define SD_AF GPIO_AF12_SDIO + + +#ifdef __cplusplus +} +#endif + +#endif /* __SD_CONF_H */ diff --git a/variants/otto/start.S b/variants/otto/start.S deleted file mode 100755 index 8b181aa..0000000 --- a/variants/otto/start.S +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - - .text - .code 16 - .thumb_func - - .globl __start__ - .type __start__, %function -__start__: - .fnstart - ldr r1,=__msp_init - mov sp,r1 - ldr r1,=start_c - bx r1 - .pool - .cantunwind - .fnend diff --git a/variants/otto/start_c.c b/variants/otto/start_c.c deleted file mode 100644 index 655fefb..0000000 --- a/variants/otto/start_c.c +++ /dev/null @@ -1,95 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * Copyright (c) 2006, 2007 CodeSourcery Inc - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - -#include - -extern void __libc_init_array(void); - -extern int main(int, char**, char**); - -extern void exit(int) __attribute__((noreturn, weak)); - -/* The linker must ensure that these are at least 4-byte aligned. */ -extern char __data_start__, __data_end__; -extern char __bss_start__, __bss_end__; - -struct rom_img_cfg { - int *img_start; -}; - -extern char _lm_rom_img_cfgp; - -void __attribute__((noreturn)) start_c(void) { - struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; - int *src = img_cfg->img_start; - int *dst = (int*)&__data_start__; - int exit_code; - - /* Initialize .data, if necessary. */ - if (src != dst) { - int *end = (int*)&__data_end__; - while (dst < end) { - *dst++ = *src++; - } - } - - /* Zero .bss. */ - dst = (int*)&__bss_start__; - while (dst < (int*)&__bss_end__) { - *dst++ = 0; - } - - /* Run initializers. */ - __libc_init_array(); - - /* Jump to main. */ - exit_code = main(0, 0, 0); - if (exit) { - exit(exit_code); - } - - /* If exit is NULL, make sure we don't return. */ - for (;;) - continue; -} diff --git a/variants/otto/stm32_isrs.S b/variants/otto/stm32_isrs.S deleted file mode 100755 index 6e3ef1e..0000000 --- a/variants/otto/stm32_isrs.S +++ /dev/null @@ -1,450 +0,0 @@ -/* STM32 ISR weak declarations */ - - .thumb - -/* Default handler for all non-overridden interrupts and exceptions */ - .globl __default_handler - .type __default_handler, %function - -__default_handler: - b . - - .weak __exc_nmi - .globl __exc_nmi - .set __exc_nmi, __default_handler - - .weak __exc_hardfault - .globl __exc_hardfault - .set __exc_hardfault, __default_handler - - .weak __exc_memmanage - .globl __exc_memmanage - .set __exc_memmanage, __default_handler - - .weak __exc_busfault - .globl __exc_busfault - .set __exc_busfault, __default_handler - - .weak __exc_usagefault - .globl __exc_usagefault - .set __exc_usagefault, __default_handler - - .weak __stm32reservedexception7 - .globl __stm32reservedexception7 - .set __stm32reservedexception7, __default_handler - - .weak __stm32reservedexception8 - .globl __stm32reservedexception8 - .set __stm32reservedexception8, __default_handler - - .weak __stm32reservedexception9 - .globl __stm32reservedexception9 - .set __stm32reservedexception9, __default_handler - - .weak __stm32reservedexception10 - .globl __stm32reservedexception10 - .set __stm32reservedexception10, __default_handler - - .weak __exc_svc - .globl __exc_svc - .set __exc_svc, __default_handler - - .weak __exc_debug_monitor - .globl __exc_debug_monitor - .set __exc_debug_monitor, __default_handler - - .weak __stm32reservedexception13 - .globl __stm32reservedexception13 - .set __stm32reservedexception13, __default_handler - - .weak __exc_pendsv - .globl __exc_pendsv - .set __exc_pendsv, __default_handler - - .weak __exc_systick - .globl __exc_systick - .set __exc_systick, __default_handler - - .weak __irq_wwdg - .globl __irq_wwdg - .set __irq_wwdg, __default_handler - - .weak __irq_pvd - .globl __irq_pvd - .set __irq_pvd, __default_handler - - .weak __irq_tamper - .globl __irq_tamper - .set __irq_tamper, __default_handler - - .weak __irq_rtc - .globl __irq_rtc - .set __irq_rtc, __default_handler - - .weak __irq_flash - .globl __irq_flash - .set __irq_flash, __default_handler - - .weak __irq_rcc - .globl __irq_rcc - .set __irq_rcc, __default_handler - - .weak __irq_exti0 - .globl __irq_exti0 - .set __irq_exti0, __default_handler - - .weak __irq_exti1 - .globl __irq_exti1 - .set __irq_exti1, __default_handler - - .weak __irq_exti2 - .globl __irq_exti2 - .set __irq_exti2, __default_handler - - .weak __irq_exti3 - .globl __irq_exti3 - .set __irq_exti3, __default_handler - - .weak __irq_exti4 - .globl __irq_exti4 - .set __irq_exti4, __default_handler - - .weak __irq_dma1_channel1 - .globl __irq_dma1_channel1 - .set __irq_dma1_channel1, __default_handler - - .weak __irq_dma1_channel2 - .globl __irq_dma1_channel2 - .set __irq_dma1_channel2, __default_handler - - .weak __irq_dma1_channel3 - .globl __irq_dma1_channel3 - .set __irq_dma1_channel3, __default_handler - - .weak __irq_dma1_channel4 - .globl __irq_dma1_channel4 - .set __irq_dma1_channel4, __default_handler - - .weak __irq_dma1_channel5 - .globl __irq_dma1_channel5 - .set __irq_dma1_channel5, __default_handler - - .weak __irq_dma1_channel6 - .globl __irq_dma1_channel6 - .set __irq_dma1_channel6, __default_handler - - .weak __irq_dma1_channel7 - .globl __irq_dma1_channel7 - .set __irq_dma1_channel7, __default_handler - - .weak __irq_adc - .globl __irq_adc - .set __irq_adc, __default_handler - - .weak __irq_usb_hp_can_tx - .globl __irq_usb_hp_can_tx - .set __irq_usb_hp_can_tx, __default_handler - - .weak __irq_usb_lp_can_rx0 - .globl __irq_usb_lp_can_rx0 - .set __irq_usb_lp_can_rx0, __default_handler - - .weak __irq_can_rx1 - .globl __irq_can_rx1 - .set __irq_can_rx1, __default_handler - - .weak __irq_can_sce - .globl __irq_can_sce - .set __irq_can_sce, __default_handler - - .weak __irq_exti9_5 - .globl __irq_exti9_5 - .set __irq_exti9_5, __default_handler - - .weak __irq_tim1_brk - .globl __irq_tim1_brk - .set __irq_tim1_brk, __default_handler - - .weak __irq_tim1_up - .globl __irq_tim1_up - .set __irq_tim1_up, __default_handler - - .weak __irq_tim1_trg_com - .globl __irq_tim1_trg_com - .set __irq_tim1_trg_com, __default_handler - - .weak __irq_tim1_cc - .globl __irq_tim1_cc - .set __irq_tim1_cc, __default_handler - - .weak __irq_tim2 - .globl __irq_tim2 - .set __irq_tim2, __default_handler - - .weak __irq_tim3 - .globl __irq_tim3 - .set __irq_tim3, __default_handler - - .weak __irq_tim4 - .globl __irq_tim4 - .set __irq_tim4, __default_handler - - .weak __irq_i2c1_ev - .globl __irq_i2c1_ev - .set __irq_i2c1_ev, __default_handler - - .weak __irq_i2c1_er - .globl __irq_i2c1_er - .set __irq_i2c1_er, __default_handler - - .weak __irq_i2c2_ev - .globl __irq_i2c2_ev - .set __irq_i2c2_ev, __default_handler - - .weak __irq_i2c2_er - .globl __irq_i2c2_er - .set __irq_i2c2_er, __default_handler - - .weak __irq_spi1 - .globl __irq_spi1 - .set __irq_spi1, __default_handler - - .weak __irq_spi2 - .globl __irq_spi2 - .set __irq_spi2, __default_handler - - .weak __irq_usart1 - .globl __irq_usart1 - .set __irq_usart1, __default_handler - - .weak __irq_usart2 - .globl __irq_usart2 - .set __irq_usart2, __default_handler - - .weak __irq_usart3 - .globl __irq_usart3 - .set __irq_usart3, __default_handler - - .weak __irq_exti15_10 - .globl __irq_exti15_10 - .set __irq_exti15_10, __default_handler - - .weak __irq_rtcalarm - .globl __irq_rtcalarm - .set __irq_rtcalarm, __default_handler - - .weak __irq_usbwakeup - .globl __irq_usbwakeup - .set __irq_usbwakeup, __default_handler - - .weak __irq_tim8_brk - .globl __irq_tim8_brk - .set __irq_tim8_brk, __default_handler - - .weak __irq_tim8_up - .globl __irq_tim8_up - .set __irq_tim8_up, __default_handler - - .weak __irq_tim8_trg_com - .globl __irq_tim8_trg_com - .set __irq_tim8_trg_com, __default_handler - - .weak __irq_tim8_cc - .globl __irq_tim8_cc - .set __irq_tim8_cc, __default_handler - - .weak __irq_adc3 - .globl __irq_adc3 - .set __irq_adc3, __default_handler - - .weak __irq_fsmc - .globl __irq_fsmc - .set __irq_fsmc, __default_handler - - .weak __irq_sdio - .globl __irq_sdio - .set __irq_sdio, __default_handler - - .weak __irq_tim5 - .globl __irq_tim5 - .set __irq_tim5, __default_handler - - .weak __irq_spi3 - .globl __irq_spi3 - .set __irq_spi3, __default_handler - - .weak __irq_uart4 - .globl __irq_uart4 - .set __irq_uart4, __default_handler - - .weak __irq_uart5 - .globl __irq_uart5 - .set __irq_uart5, __default_handler - - .weak __irq_tim6 - .globl __irq_tim6 - .set __irq_tim6, __default_handler - - .weak __irq_tim7 - .globl __irq_tim7 - .set __irq_tim7, __default_handler - - .weak __irq_dma2_channel1 - .globl __irq_dma2_channel1 - .set __irq_dma2_channel1, __default_handler - - .weak __irq_dma2_channel2 - .globl __irq_dma2_channel2 - .set __irq_dma2_channel2, __default_handler - - .weak __irq_dma2_channel3 - .globl __irq_dma2_channel3 - .set __irq_dma2_channel3, __default_handler - - .weak __irq_dma2_channel4_5 - .globl __irq_dma2_channel4_5 - .set __irq_dma2_channel4_5, __default_handler - - .weak __irq_DMA2_Stream4_IRQHandler - .globl __irq_DMA2_Stream4_IRQHandler - .set __irq_DMA2_Stream4_IRQHandler, __default_handler - - .weak __irq_ETH_IRQHandler - .globl __irq_ETH_IRQHandler - .set __irq_ETH_IRQHandler, __default_handler - - .weak __irq_ETH_WKUP_IRQHandler - .globl __irq_ETH_WKUP_IRQHandler - .set __irq_ETH_WKUP_IRQHandler, __default_handler - - .weak __irq_CAN2_TX_IRQHandler - .globl __irq_CAN2_TX_IRQHandler - .set __irq_CAN2_TX_IRQHandler, __default_handler - - .weak __irq_CAN2_RX0_IRQHandler - .globl __irq_CAN2_RX0_IRQHandler - .set __irq_CAN2_RX0_IRQHandler, __default_handler - - .weak __irq_CAN2_RX1_IRQHandler - .globl __irq_CAN2_RX1_IRQHandler - .set __irq_CAN2_RX1_IRQHandler, __default_handler - - .weak __irq_CAN2_SCE_IRQHandler - .globl __irq_CAN2_SCE_IRQHandler - .set __irq_CAN2_SCE_IRQHandler, __default_handler - - .weak __irq_OTG_FS_IRQHandler - .globl __irq_OTG_FS_IRQHandler - .set __irq_OTG_FS_IRQHandler, __default_handler - - .weak __irq_DMA2_Stream5_IRQHandler - .globl __irq_DMA2_Stream5_IRQHandler - .set __irq_DMA2_Stream5_IRQHandler, __default_handler - - .weak __irq_DMA2_Stream6_IRQHandler - .globl __irq_DMA2_Stream6_IRQHandler - .set __irq_DMA2_Stream6_IRQHandler, __default_handler - - .weak __irq_DMA2_Stream7_IRQHandler - .globl __irq_DMA2_Stream7_IRQHandler - .set __irq_DMA2_Stream7_IRQHandler, __default_handler - - .weak __irq_USART6_IRQHandler - .globl __irq_USART6_IRQHandler - .set __irq_USART6_IRQHandler, __default_handler - - .weak __irq_I2C3_EV_IRQHandler - .globl __irq_I2C3_EV_IRQHandler - .set __irq_I2C3_EV_IRQHandler, __default_handler - - .weak __irq_I2C3_ER_IRQHandler - .globl __irq_I2C3_ER_IRQHandler - .set __irq_I2C3_ER_IRQHandler, __default_handler - - .weak __irq_OTG_HS_EP1_OUT_IRQHandler - .globl __irq_OTG_HS_EP1_OUT_IRQHandler - .set __irq_OTG_HS_EP1_OUT_IRQHandler, __default_handler - - .weak __irq_OTG_HS_EP1_IN_IRQHandler - .globl __irq_OTG_HS_EP1_IN_IRQHandler - .set __irq_OTG_HS_EP1_IN_IRQHandler, __default_handler - - .weak __irq_OTG_HS_WKUP_IRQHandler - .globl __irq_OTG_HS_WKUP_IRQHandler - .set __irq_OTG_HS_WKUP_IRQHandler, __default_handler - - .weak __irq_OTG_HS_IRQHandler - .globl __irq_OTG_HS_IRQHandler - .set __irq_OTG_HS_IRQHandler, __default_handler - - .weak __irq_DCMI_IRQHandler - .globl __irq_DCMI_IRQHandler - .set __irq_DCMI_IRQHandler, __default_handler - - .weak __irq_CRYP_IRQHandler - .globl __irq_CRYP_IRQHandler - .set __irq_CRYP_IRQHandler, __default_handler - - .weak __irq_HASH_RNG_IRQHandler - .globl __irq_HASH_RNG_IRQHandler - .set __irq_HASH_RNG_IRQHandler, __default_handler - - .weak __irq_FPU_IRQHandler - .globl __irq_FPU_IRQHandler - .set __irq_FPU_IRQHandler, __default_handler - - .weak __irq_UART7_IRQHandler - .globl __irq_UART7_IRQHandler - .set __irq_UART7_IRQHandler, __default_handler - - .weak __irq_UART8_IRQHandler - .globl __irq_UART8_IRQHandler - .set __irq_UART8_IRQHandler, __default_handler - - .weak __irq_fmc - .globl __irq_fmc - .set __irq_fmc, __default_handler - - .weak __irq_dma1_channel8 - .globl __irq_dma1_channel8 - .set __irq_dma1_channel8, __default_handler - - .weak __irq_dma2_channel4 - .globl __irq_dma2_channel4 - .set __irq_dma2_channel4, __default_handler - - .weak __irq_SPI4_IRQHandler - .globl __irq_SPI4_IRQHandler - .set __irq_SPI4_IRQHandler, __default_handler - - .weak __irq_SPI5_IRQHandler - .globl __irq_SPI5_IRQHandler - .set __irq_SPI5_IRQHandler, __default_handler - - .weak __irq_SPI6_IRQHandler - .globl __irq_SPI6_IRQHandler - .set __irq_SPI6_IRQHandler, __default_handler - - .weak __irq_SAI1_IRQHandler - .globl __irq_SAI1_IRQHandler - .set __irq_SAI1_IRQHandler, __default_handler - - .weak __irq_LTDC_IRQHandler - .globl __irq_LTDC_IRQHandler - .set __irq_LTDC_IRQHandler, __default_handler - - .weak __irq_LTDC_ER_IRQHandler - .globl __irq_LTDC_ER_IRQHandler - .set __irq_LTDC_ER_IRQHandler, __default_handler - - .weak __irq_DMA2D_IRQHandler - .globl __irq_DMA2D_IRQHandler - .set __irq_DMA2D_IRQHandler, __default_handler - - .weak __irq_QUADSPI_IRQHandler - .globl __irq_QUADSPI_IRQHandler - .set __irq_QUADSPI_IRQHandler, __default_handler - - .weak __irq_DSI_IRQHandler - .globl __irq_DSI_IRQHandler - .set __irq_DSI_IRQHandler, __default_handler diff --git a/variants/otto/stm32_vector_table.S b/variants/otto/stm32_vector_table.S deleted file mode 100755 index 59a2b2f..0000000 --- a/variants/otto/stm32_vector_table.S +++ /dev/null @@ -1,242 +0,0 @@ -/* STM32 vector table */ - - .section ".stm32.interrupt_vector" - - .globl __stm32_vector_table - .type __stm32_vector_table, %object - -__stm32_vector_table: - -#ifdef MCU_STM32F469NI -/* STM32F469NI interrupts */ - -/* Core interrupts */ - - .long __msp_init - .long __exc_reset - .long __exc_nmi - .long __exc_hardfault - .long __exc_memmanage - .long __exc_busfault - .long __exc_usagefault - .long __stm32reservedexception7 - .long __stm32reservedexception8 - .long __stm32reservedexception9 - .long __stm32reservedexception10 - .long __exc_svc - .long __exc_debug_monitor - .long __stm32reservedexception13 - .long __exc_pendsv - .long __exc_systick - -/* Peripheral interrupts */ - - .long __irq_wwdg - .long __irq_pvd - .long __irq_tamper - .long __irq_rtc - .long __irq_flash - .long __irq_rcc - .long __irq_exti0 - .long __irq_exti1 - .long __irq_exti2 - .long __irq_exti3 - .long __irq_exti4 - .long __irq_dma1_channel1 - .long __irq_dma1_channel2 - .long __irq_dma1_channel3 - .long __irq_dma1_channel4 - .long __irq_dma1_channel5 - .long __irq_dma1_channel6 - .long __irq_dma1_channel7 - .long __irq_adc - .long __irq_usb_hp_can_tx - .long __irq_usb_lp_can_rx0 - .long __irq_can_rx1 - .long __irq_can_sce - .long __irq_exti9_5 - .long __irq_tim1_brk - .long __irq_tim1_up - .long __irq_tim1_trg_com - .long __irq_tim1_cc - .long __irq_tim2 - .long __irq_tim3 - .long __irq_tim4 - .long __irq_i2c1_ev - .long __irq_i2c1_er - .long __irq_i2c2_ev - .long __irq_i2c2_er - .long __irq_spi1 - .long __irq_spi2 - .long __irq_usart1 - .long __irq_usart2 - .long __irq_usart3 - .long __irq_exti15_10 - .long __irq_rtcalarm - .long __irq_usbwakeup - .long __irq_tim8_brk - .long __irq_tim8_up - .long __irq_tim8_trg_com - .long __irq_tim8_cc - .long __irq_dma1_channel8 - .long __irq_fmc - .long __irq_sdio - .long __irq_tim5 - .long __irq_spi3 - .long __irq_uart4 - .long __irq_uart5 - .long __irq_tim6 - .long __irq_tim7 - .long __irq_dma2_channel1 - .long __irq_dma2_channel2 - .long __irq_dma2_channel3 - .long __irq_dma2_channel4_5 - .long __irq_DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .long __irq_ETH_IRQHandler /* Ethernet */ - .long __irq_ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .long __irq_CAN2_TX_IRQHandler /* CAN2 TX */ - .long __irq_CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .long __irq_CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .long __irq_CAN2_SCE_IRQHandler /* CAN2 SCE */ - .long __irq_OTG_FS_IRQHandler /* USB OTG FS */ - .long __irq_DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .long __irq_DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .long __irq_DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .long __irq_USART6_IRQHandler /* USART6 */ - .long __irq_I2C3_EV_IRQHandler /* I2C3 event */ - .long __irq_I2C3_ER_IRQHandler /* I2C3 error */ - .long __irq_OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .long __irq_OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .long __irq_OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .long __irq_OTG_HS_IRQHandler /* USB OTG HS */ - .long __irq_DCMI_IRQHandler /* DCMI */ - .long __irq_CRYP_IRQHandler /* CRYP crypto */ - .long __irq_HASH_RNG_IRQHandler /* Hash and Rng */ - .long __irq_FPU_IRQHandler /* FPU */ - .long __irq_UART7_IRQHandler /* UART7 */ - .long __irq_UART8_IRQHandler /* UART8 */ - .long __irq_SPI4_IRQHandler /* SPI4 */ - .long __irq_SPI5_IRQHandler /* SPI5 */ - .long __irq_SPI6_IRQHandler /* SPI6 */ - .long __irq_SAI1_IRQHandler /* SAI1 */ - .long __irq_LTDC_IRQHandler /* LCD-TFT LTDC */ - .long __irq_LTDC_ER_IRQHandler /* LCD-TFT LTDC Global Error */ - .long __irq_DMA2D_IRQHandler /* DMA2D */ - .long __irq_QUADSPI_IRQHandler /* QUADSPI */ - .long __irq_DSI_IRQHandler /* DSI */ - -#else - -/* CM3 core interrupts */ - - .long __msp_init - .long __exc_reset - .long __exc_nmi - .long __exc_hardfault - .long __exc_memmanage - .long __exc_busfault - .long __exc_usagefault - .long __stm32reservedexception7 - .long __stm32reservedexception8 - .long __stm32reservedexception9 - .long __stm32reservedexception10 - .long __exc_svc - .long __exc_debug_monitor - .long __stm32reservedexception13 - .long __exc_pendsv - .long __exc_systick - -/* Peripheral interrupts */ - - .long __irq_wwdg - .long __irq_pvd - .long __irq_tamper - .long __irq_rtc - .long __irq_flash - .long __irq_rcc - .long __irq_exti0 - .long __irq_exti1 - .long __irq_exti2 - .long __irq_exti3 - .long __irq_exti4 - .long __irq_dma1_channel1 - .long __irq_dma1_channel2 - .long __irq_dma1_channel3 - .long __irq_dma1_channel4 - .long __irq_dma1_channel5 - .long __irq_dma1_channel6 - .long __irq_dma1_channel7 - .long __irq_adc - .long __irq_usb_hp_can_tx - .long __irq_usb_lp_can_rx0 - .long __irq_can_rx1 - .long __irq_can_sce - .long __irq_exti9_5 - .long __irq_tim1_brk - .long __irq_tim1_up - .long __irq_tim1_trg_com - .long __irq_tim1_cc - .long __irq_tim2 - .long __irq_tim3 - .long __irq_tim4 - .long __irq_i2c1_ev - .long __irq_i2c1_er - .long __irq_i2c2_ev - .long __irq_i2c2_er - .long __irq_spi1 - .long __irq_spi2 - .long __irq_usart1 - .long __irq_usart2 - .long __irq_usart3 - .long __irq_exti15_10 - .long __irq_rtcalarm - .long __irq_usbwakeup - -#if defined (STM32_HIGH_DENSITY) - - .long __irq_tim8_brk - .long __irq_tim8_up - .long __irq_tim8_trg_com - .long __irq_tim8_cc - .long __irq_adc3 - .long __irq_fsmc - .long __irq_sdio - .long __irq_tim5 - .long __irq_spi3 - .long __irq_uart4 - .long __irq_uart5 - .long __irq_tim6 - .long __irq_tim7 - .long __irq_dma2_channel1 - .long __irq_dma2_channel2 - .long __irq_dma2_channel3 - .long __irq_dma2_channel4_5 - -#endif /* STM32_HIGH_DENSITY */ - - .long __irq_DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .long __irq_ETH_IRQHandler /* Ethernet */ - .long __irq_ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .long __irq_CAN2_TX_IRQHandler /* CAN2 TX */ - .long __irq_CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .long __irq_CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .long __irq_CAN2_SCE_IRQHandler /* CAN2 SCE */ - .long __irq_OTG_FS_IRQHandler /* USB OTG FS */ - .long __irq_DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .long __irq_DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .long __irq_DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .long __irq_USART6_IRQHandler /* USART6 */ - .long __irq_I2C3_EV_IRQHandler /* I2C3 event */ - .long __irq_I2C3_ER_IRQHandler /* I2C3 error */ - .long __irq_OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .long __irq_OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .long __irq_OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .long __irq_OTG_HS_IRQHandler /* USB OTG HS */ - .long __irq_DCMI_IRQHandler /* DCMI */ - .long __irq_CRYP_IRQHandler /* CRYP crypto */ - .long __irq_HASH_RNG_IRQHandler /* Hash and Rng */ - .long __irq_FPU_IRQHandler /* FPU */ - -#endif - - .size __stm32_vector_table, . - __stm32_vector_table diff --git a/variants/otto/stm32f4xx_hal_conf.h b/variants/otto/stm32f4xx_hal_conf.h index 1ab9487..546e06d 100644 --- a/variants/otto/stm32f4xx_hal_conf.h +++ b/variants/otto/stm32f4xx_hal_conf.h @@ -1,454 +1,459 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf_template.h - * @author MCD Application Team - * @version V1.5.1 - * @date 01-July-2016 - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32f4xx_hal_conf.h. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -// #define HAL_CAN_MODULE_ENABLED -// #define HAL_CRC_MODULE_ENABLED -// #define HAL_CEC_MODULE_ENABLED -// #define HAL_CRYP_MODULE_ENABLED -#define HAL_DAC_MODULE_ENABLED -// #define HAL_DCMI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_DMA2D_MODULE_ENABLED -// #define HAL_ETH_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -// #define HAL_NAND_MODULE_ENABLED -// #define HAL_NOR_MODULE_ENABLED -// #define HAL_PCCARD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -// #define HAL_SDRAM_MODULE_ENABLED -// #define HAL_HASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -// #define HAL_I2S_MODULE_ENABLED -// #define HAL_IWDG_MODULE_ENABLED -#define HAL_LTDC_MODULE_ENABLED -#define HAL_DSI_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -// #define HAL_QSPI_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -// #define HAL_RNG_MODULE_ENABLED -// #define HAL_RTC_MODULE_ENABLED -#define HAL_SAI_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_UART_MODULE_ENABLED -// #define HAL_USART_MODULE_ENABLED -// #define HAL_IRDA_MODULE_ENABLED -// #define HAL_SMARTCARD_MODULE_ENABLED -// #define HAL_WWDG_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_PCD_MODULE_ENABLED -#define HAL_HCD_MODULE_ENABLED -// #define HAL_FMPI2C_MODULE_ENABLED -// #define HAL_SPDIFRX_MODULE_ENABLED -// #define HAL_DFSDM_MODULE_ENABLED -// #define HAL_LPTIM_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0x0FU) /*!< tick interrupt priority */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 1U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848 PHY Address*/ -#define DP83848_PHY_ADDRESS 0x01U -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) - -#define PHY_READ_TO ((uint32_t)0x0000FFFFU) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ - -#define PHY_SR ((uint16_t)0x0010U) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x0011U) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x0012U) /*!< MII Interrupt Status and Misc. Control Register */ - -#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ - -#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ - -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000U) /*!< PHY link status interrupt mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 1U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED - #include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED - #include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED - #include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED - #include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED - #include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED - #include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED - #include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @version V1.7.1 + * @date 14-April-2017 + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +// #define HAL_CAN_MODULE_ENABLED +// #define HAL_CRC_MODULE_ENABLED +// #define HAL_CEC_MODULE_ENABLED +// #define HAL_CRYP_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +// #define HAL_DCMI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_DMA2D_MODULE_ENABLED +// #define HAL_ETH_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +// #define HAL_NAND_MODULE_ENABLED +// #define HAL_NOR_MODULE_ENABLED +// #define HAL_PCCARD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +// #define HAL_SDRAM_MODULE_ENABLED +// #define HAL_HASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +// #define HAL_I2S_MODULE_ENABLED +// #define HAL_IWDG_MODULE_ENABLED +#define HAL_LTDC_MODULE_ENABLED +#define HAL_DSI_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +// #define HAL_QSPI_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +// #define HAL_RNG_MODULE_ENABLED +// #define HAL_RTC_MODULE_ENABLED +#define HAL_SAI_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +// #define HAL_USART_MODULE_ENABLED +// #define HAL_IRDA_MODULE_ENABLED +// #define HAL_SMARTCARD_MODULE_ENABLED +// #define HAL_WWDG_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +// #define HAL_FMPI2C_MODULE_ENABLED +// #define HAL_SPDIFRX_MODULE_ENABLED +// #define HAL_DFSDM_MODULE_ENABLED +// #define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 5000U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 1U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usb_device.c b/variants/otto/usb/usb_device.c deleted file mode 100644 index 8d611c0..0000000 --- a/variants/otto/usb/usb_device.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - ****************************************************************************** - * @file : USB_DEVICE - * @version : v1.0_Cube - * @brief : This file implements the USB Device - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Includes ------------------------------------------------------------------*/ - -#include "usb_device.h" -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_cdc.h" -#include "usbd_cdc_if.h" - -/* USB Device Core handle declaration */ -//USBD_HandleTypeDef hUsbDeviceFS; - -/* init function */ -void MX_USB_DEVICE_Init(void) -{ - - /* Init Device Library */ - USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); - - /* Add Supported Class */ - USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC); - - /* Add CDC Interface Class */ - USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS); - - /* Start Device Process */ - USBD_Start(&hUsbDeviceFS); - -} -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usbd_conf.c b/variants/otto/usb/usbd_conf.c index b0c34c2..1979e9e 100644 --- a/variants/otto/usb/usbd_conf.c +++ b/variants/otto/usb/usbd_conf.c @@ -1,83 +1,91 @@ /** ****************************************************************************** - * @file : usbd_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB device library + * @file USB_Device/CDC_Standalone/Src/usbd_conf.c + * @author MCD Application Team + * @version V1.0.6 + * @date 04-November-2016 + * @brief This file implements the USB Device library callbacks and MSP ****************************************************************************** + * @attention * - * COPYRIGHT(c) 2016 STMicroelectronics + *

© Copyright ? 2016 STMicroelectronics International N.V. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ +#ifdef USBCON #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #include "usbd_def.h" #include "usbd_core.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ PCD_HandleTypeDef hpcd; __IO uint32_t device_connection_status; - - /* External functions --------------------------------------------------------*/ -void SystemClock_Config(void); - -/* Dummy entry */ -void SystemClock_Config(void) -{ - -} - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ - /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ /******************************************************************************* - LL Driver Callbacks (PCD -> USB Device Library) + PCD BSP Routines *******************************************************************************/ -/* MSP Init */ +/** + * @brief Initializes the PCD MSP. + * @param hpcd: PCD handle + * @retval None + */ void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) { GPIO_InitTypeDef GPIO_InitStruct; + if(hpcd->Instance==USB_OTG_FS) { - /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ - - /* USER CODE END USB_OTG_FS_MspInit 0 */ + /* Configure USB FS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + /* Configure DM DP Pins */ /**USB_OTG_FS GPIO Configuration PA11 ------> USB_OTG_FS_DM PA12 ------> USB_OTG_FS_DP */ - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12); GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; @@ -100,28 +108,116 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } - /* Peripheral clock enable */ - __USB_OTG_FS_CLK_ENABLE(); + /* Enable USB FS Clock */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - /* Peripheral interrupt init*/ + /* Set USBFS Interrupt priority */ HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); + + /* Enable USBFS Interrupt */ HAL_NVIC_EnableIRQ(OTG_FS_IRQn); - /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ + } + else if(hpcd->Instance == USB_OTG_HS) + { +#ifdef USE_USB_HS_IN_FS + + __HAL_RCC_GPIOB_CLK_ENABLE(); - /* USER CODE END USB_OTG_FS_MspInit 1 */ + /*Configure GPIO for HS on FS mode*/ + GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_14 |GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Configure VBUS Pin */ + if(hpcd->Init.vbus_sensing_enable == 1) + { + GPIO_InitStruct.Pin = GPIO_PIN_13 ; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } +#else + /* Configure USB FS GPIOs */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + + /* CLK */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* D0 */ + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* D1 D2 D3 D4 D5 D6 D7 */ + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 |\ + GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* STP */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* NXT */ + GPIO_InitStruct.Pin = GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + /* DIR */ + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + + __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); +#endif + + /* Enable USB HS Clocks */ + __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); + + /* Set USBHS Interrupt to the lowest priority */ + HAL_NVIC_SetPriority(OTG_HS_IRQn, 0, 0); + + /* Enable USBHS Interrupt */ + HAL_NVIC_EnableIRQ(OTG_HS_IRQn); } } +/** + * @brief De-Initializes the PCD MSP. + * @param hpcd: PCD handle + * @retval None + */ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) { -// if(hpcd->Instance==USB_OTG_FS) -// { - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 0 */ - /* Peripheral clock disable */ - __USB_OTG_FS_CLK_DISABLE(); - + if(hpcd->Instance == USB_OTG_FS) + { + /* Disable USB FS Clock */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); + __HAL_RCC_SYSCFG_CLK_DISABLE(); /**USB_OTG_FS GPIO Configuration PA11 ------> USB_OTG_FS_DM PA12 ------> USB_OTG_FS_DP @@ -130,15 +226,34 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) /* Peripheral interrupt Deinit*/ HAL_NVIC_DisableIRQ(OTG_FS_IRQn); - - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 1 */ -// } + } + else if(hpcd->Instance == USB_OTG_HS) + { + /* Disable USB HS Clocks */ + __HAL_RCC_USB_OTG_HS_CLK_DISABLE(); + __HAL_RCC_SYSCFG_CLK_DISABLE(); +#ifdef USE_USB_HS_IN_FS + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12 | GPIO_PIN_14 |GPIO_PIN_15); +#else + __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE(); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3 | GPIO_PIN_5); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 |\ + GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13); + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0); + HAL_GPIO_DeInit(GPIOH, GPIO_PIN_4); + HAL_GPIO_DeInit(GPIOI, GPIO_PIN_11); +#endif + /* Peripheral interrupt Deinit*/ + HAL_NVIC_DisableIRQ(OTG_HS_IRQn); + } } +/******************************************************************************* + LL Driver Callbacks (PCD -> USB Device Library) +*******************************************************************************/ + /** - * @brief Setup stage callback + * @brief SetupStage callback. * @param hpcd: PCD handle * @retval None */ @@ -148,7 +263,7 @@ void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) } /** - * @brief Data Out stage callback. + * @brief DataOut Stage callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None @@ -159,7 +274,7 @@ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) } /** - * @brief Data In stage callback.. + * @brief DataIn Stage callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None @@ -194,6 +309,7 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) case PCD_SPEED_HIGH: speed = USBD_SPEED_HIGH; break; + case PCD_SPEED_FULL: speed = USBD_SPEED_FULL; break; @@ -202,10 +318,11 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) speed = USBD_SPEED_FULL; break; } - USBD_LL_SetSpeed(hpcd->pData, speed); /*Reset Device*/ USBD_LL_Reset(hpcd->pData); + + USBD_LL_SetSpeed(hpcd->pData, speed); } /** @@ -220,13 +337,11 @@ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) USBD_LL_Suspend(hpcd->pData); __HAL_PCD_GATE_PHYCLOCK(hpcd); /*Enter in STOP mode */ - /* USER CODE BEGIN 2 */ if (hpcd->Init.low_power_enable) { /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register */ SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); } - /* USER CODE END 2 */ } /** @@ -237,13 +352,11 @@ void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) { - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ USBD_LL_Resume(hpcd->pData); } /** - * @brief ISOC Out Incomplete callback. + * @brief ISOOUTIncomplete callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None @@ -254,7 +367,7 @@ void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) } /** - * @brief ISOC In Incomplete callback. + * @brief ISOINIncomplete callback. * @param hpcd: PCD handle * @param epnum: Endpoint Number * @retval None @@ -265,33 +378,14 @@ void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) } /** - * @brief Connect callback. + * @brief ConnectCallback callback. * @param hpcd: PCD handle * @retval None */ void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) { - GPIO_InitTypeDef gpio_init_structure; - - - __HAL_RCC_GPIOK_CLK_ENABLE(); - - gpio_init_structure.Pin = GPIO_PIN_3; - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - - HAL_GPIO_Init(GPIOK, &gpio_init_structure); - - - device_connection_status = 1; - - /* By default, turn off LED by setting a high level on corresponding GPIO */ - //HAL_GPIO_WritePin(HAL_GPIOK, GPIO_PIN_3, GPIO_PIN_SET); - - //HAL_GPIOK->ODR ^= GPIO_PIN_3; - //HAL_GPIOK->ODR ^= GPIO_PIN_3; - USBD_LL_DevConnected(hpcd->pData); + device_connection_status = 1; + USBD_LL_DevConnected(hpcd->pData); } /** @@ -304,9 +398,24 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) USBD_LL_DevDisconnected(hpcd->pData); } +/** + * @brief This function handles USB-On-The-Go FS/HS global interrupt request. + * @param None + * @retval None + */ +#ifdef USE_USB_FS +void OTG_FS_IRQHandler(void) +#else +void OTG_HS_IRQHandler(void) +#endif +{ + HAL_PCD_IRQHandler(&hpcd); +} + /******************************************************************************* LL Driver Interface (USB Device Library --> PCD) *******************************************************************************/ + /** * @brief Initializes the Low Level portion of the Device driver. * @param pdev: Device handle @@ -315,29 +424,69 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ - //if (pdev->id == DEVICE_FS) { - /* Link The driver to the stack */ - hpcd.pData = pdev; - pdev->pData = &hpcd; - +#ifdef USE_USB_FS + /* Set LL Driver parameters */ hpcd.Instance = USB_OTG_FS; hpcd.Init.dev_endpoints = 7; - hpcd.Init.speed = PCD_SPEED_FULL; - hpcd.Init.dma_enable = DISABLE; + hpcd.Init.use_dedicated_ep1 = DISABLE; hpcd.Init.ep0_mps = DEP0CTL_MPS_64; + hpcd.Init.dma_enable = DISABLE; + hpcd.Init.low_power_enable = DISABLE; hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd.Init.Sof_enable = DISABLE; - hpcd.Init.low_power_enable = DISABLE; + hpcd.Init.speed = PCD_SPEED_FULL; + hpcd.Init.vbus_sensing_enable = DISABLE; hpcd.Init.lpm_enable = DISABLE; - hpcd.Init.vbus_sensing_enable = 0; - //hpcd.Init.vbus_sensing_enable = 1; - hpcd.Init.use_dedicated_ep1 = DISABLE; + + /* Link the driver to the stack */ + hpcd.pData = pdev; + pdev->pData = &hpcd; + + /* Initialize LL Driver */ HAL_PCD_Init(&hpcd); - HAL_PCD_SetRxFiFo(&hpcd, 0x80); - HAL_PCD_SetTxFiFo(&hpcd, 0, 0x40); - HAL_PCD_SetTxFiFo(&hpcd, 1, 0x80); - //} + HAL_PCDEx_SetRxFiFo(&hpcd, 0x80); + HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40); + HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80); +#endif + +#ifdef USE_USB_HS + /* Set LL Driver parameters */ + hpcd.Instance = USB_OTG_HS; + hpcd.Init.dev_endpoints = 6; + hpcd.Init.use_dedicated_ep1 = 0; + hpcd.Init.ep0_mps = 0x40; + + /* Be aware that enabling DMA mode will result in data being sent only by + multiple of 4 packet sizes. This is due to the fact that USB DMA does + not allow sending data from non word-aligned addresses. + For this specific application, it is advised to not enable this option + unless required. */ + hpcd.Init.dma_enable = 0; + hpcd.Init.low_power_enable = 0; + hpcd.Init.lpm_enable = 0; + +#ifdef USE_USB_HS_IN_FS + hpcd.Init.phy_itface = PCD_PHY_EMBEDDED; +#else + hpcd.Init.phy_itface = PCD_PHY_ULPI; +#endif + hpcd.Init.Sof_enable = 0; + hpcd.Init.speed = PCD_SPEED_HIGH; + hpcd.Init.vbus_sensing_enable = 1; + + /* Link The driver to the stack */ + hpcd.pData = pdev; + pdev->pData = &hpcd; + + /* Initialize LL Driver */ + HAL_PCD_Init(&hpcd); + + HAL_PCDEx_SetRxFiFo(&hpcd, 0x200); + HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x80); + HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x174); +#endif + return USBD_OK; } @@ -387,7 +536,6 @@ USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, uint8_t ep_type, uint16_t ep_mps) { - HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, @@ -404,7 +552,6 @@ USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, */ USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { - HAL_PCD_EP_Close(pdev->pData, ep_addr); return USBD_OK; } @@ -417,7 +564,6 @@ USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) */ USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { - HAL_PCD_EP_Flush(pdev->pData, ep_addr); return USBD_OK; } @@ -430,7 +576,6 @@ USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) */ USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { - HAL_PCD_EP_SetStall(pdev->pData, ep_addr); return USBD_OK; } @@ -443,7 +588,6 @@ USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) */ USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { - HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); return USBD_OK; } @@ -467,6 +611,7 @@ uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; } } + /** * @brief Assigns a USB address to the device. * @param pdev: Device handle @@ -475,7 +620,6 @@ uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) */ USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr) { - HAL_PCD_SetAddress(pdev->pData, dev_addr); return USBD_OK; } @@ -493,7 +637,6 @@ USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t size) { - HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); return USBD_OK; } @@ -511,16 +654,15 @@ USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t size) { - HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); return USBD_OK; } /** - * @brief Returns the last transfered packet size. + * @brief Returns the last transferred packet size. * @param pdev: Device handle * @param ep_addr: Endpoint Number - * @retval Recived Data Size + * @retval Received Data Size */ uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr) { @@ -572,4 +714,6 @@ void USBD_LL_Delay (uint32_t Delay) { HAL_Delay(Delay); } + +#endif // USBCON /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usbd_conf.h b/variants/otto/usb/usbd_conf.h index 7d8f1dd..080210d 100644 --- a/variants/otto/usb/usbd_conf.h +++ b/variants/otto/usb/usbd_conf.h @@ -1,35 +1,49 @@ /** ****************************************************************************** - * @file : usbd_conf.h - * @version : v1.0_Cube - * @brief : Header for usbd_conf file. + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.0.2 + * @date 06-May-2016 + * @brief General low level driver configuration ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics + * @attention * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** -*/ + */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __USBD_CONF__H__ #define __USBD_CONF__H__ @@ -37,52 +51,32 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ +#include "stm32_def.h" #include #include #include -#include "stm32f4xx.h" -#include "stm32f4xx_hal.h" - -/** @addtogroup USBD_OTG_DRIVER - * @{ - */ - -/** @defgroup USBD_CONF - * @brief usb otg low level driver configuration file - * @{ - */ +#ifdef USBCON +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ -/** @defgroup USBD_CONF_Exported_Defines - * @{ - */ +#define USBD_LPM_ENABLED 1 -/*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 1 -/*---------- -----------*/ -#define USBD_MAX_NUM_CONFIGURATION 1 -/*---------- -----------*/ +/* Common Config */ +#define USBD_MAX_NUM_INTERFACES 1 +#define USBD_MAX_NUM_CONFIGURATION 1 #define USBD_MAX_STR_DESC_SIZ 512 -/*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0 -/*---------- -----------*/ +#define USBD_SUPPORT_USER_STRING 0 +#define USBD_SELF_POWERED 1 #define USBD_DEBUG_LEVEL 0 -/*---------- -----------*/ -#define USBD_LPM_ENABLED 1 -/*---------- -----------*/ -#define USBD_SELF_POWERED 1 -/*---------- -----------*/ #define USBD_CDC_INTERVAL 1000 + +/* Exported macro ------------------------------------------------------------*/ /****************************************/ /* #define for FS and HS identification */ #define DEVICE_FS 0 #define DEVICE_HS 1 - -/** @defgroup USBD_Exported_Macros - * @{ - */ - - /* Memory management macros */ +/* Memory management macros */ #define USBD_malloc malloc #define USBD_free free #define USBD_memset memset @@ -90,83 +84,38 @@ #define USBD_Delay HAL_Delay - /* DEBUG macros */ - +/* DEBUG macros */ #if (USBD_DEBUG_LEVEL > 0) #define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); + printf("\n\r"); #else #define USBD_UsrLog(...) #endif - #if (USBD_DEBUG_LEVEL > 1) #define USBD_ErrLog(...) printf("ERROR: ") ;\ printf(__VA_ARGS__);\ - printf("\n"); + printf("\n\r"); #else #define USBD_ErrLog(...) #endif - #if (USBD_DEBUG_LEVEL > 2) #define USBD_DbgLog(...) printf("DEBUG : ") ;\ printf(__VA_ARGS__);\ - printf("\n"); + printf("\n\r"); #else #define USBD_DbgLog(...) #endif -/** - * @} - */ - - +/* Exported functions ------------------------------------------------------- */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ #ifdef __cplusplus } #endif +#endif // USBCON #endif //__USBD_CONF__H__ -/** - * @} - */ - -/** - * @} - */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/variants/otto/usb/usbd_desc.c b/variants/otto/usb/usbd_desc.c index 558a532..fc340af 100644 --- a/variants/otto/usb/usbd_desc.c +++ b/variants/otto/usb/usbd_desc.c @@ -1,157 +1,146 @@ /** ****************************************************************************** - * @file : usbd_desc.c - * @version : v1.0_Cube - * @brief : This file implements the USB Device descriptors + * @file USB_Device/HID_Standalone/Src/usbd_desc.c + * @author MCD Application Team + * @version V1.0.2 + * @date 06-May-2016 + * @brief This file provides the USBD descriptors and string formatting method. ****************************************************************************** + * @attention * - * COPYRIGHT(c) 2016 STMicroelectronics + *

© Copyright � 2016 STMicroelectronics International N.V. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** -*/ - + */ /* Includes ------------------------------------------------------------------*/ +#ifdef USBCON #include "usbd_core.h" #include "usbd_desc.h" #include "usbd_conf.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_DESC - * @brief USBD descriptors module - * @{ - */ - -/** @defgroup USBD_DESC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Defines - * @{ - */ -#define USBD_VID 0x2A03 // 1155 -#define USBD_LANGID_STRING 1033 -#define USBD_MANUFACTURER_STRING "Arduino srl" //"STMicroelectronics" -#define USBD_PID_FS 0x0058 // 22336 -#define USBD_PRODUCT_STRING_FS "Arduino Star OTTO" // "STM32 Virtual ComPort" -/* USER CODE BEGIN SERIALNUMBER_STRING_FS */ -#define USBD_SERIALNUMBER_STRING_FS "00000000001A" -/* USER CODE END SERIALNUMBER_STRING_FS */ -#define USBD_CONFIGURATION_STRING_FS "CDC Config" -#define USBD_INTERFACE_STRING_FS "CDC Interface" - +//ID +#define USBD_LANGID_STRING 0x409 //1033 +#if USBD_VID == 0x2A03 +#define USBD_MANUFACTURER_STRING "Arduino srl" +#elif USBD_VID == 0x0483 +#define USBD_MANUFACTURER_STRING "STMicroelectronics" +#elif !defined(USB_MANUFACTURER) +// Fall through to unknown if no manufacturer name was provided in a macro +#define USBD_MANUFACTURER_STRING "Unknown" +#endif +#define USBD_CDC_PRODUCT_HS_STRING "Arduino Star OTTO" // "STM32 Virtual ComPort" +#define USBD_CDC_PRODUCT_FS_STRING "Arduino Star OTTO" // "STM32 Virtual ComPort" +#define USBD_CDC_CONFIGURATION_HS_STRING "CDC Config" +#define USBD_CDC_INTERFACE_HS_STRING "CDC Interface" +#define USBD_CDC_CONFIGURATION_FS_STRING "CDC Config" +#define USBD_CDC_INTERFACE_FS_STRING "CDC Interface" +#define USBD_CDC_SERIALNUMBER_HS_STRING "00000000001A" +#define USBD_CDC_SERIALNUMBER_FS_STRING "00000000001A" #define USB_SIZ_BOS_DESC 0x0C -/** - * @} - */ -/** @defgroup USBD_DESC_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables - * @{ - */ -uint8_t * USBD_FS_DeviceDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_LangIDStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ManufacturerStrDescriptor ( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ProductStrDescriptor ( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_InterfaceStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); +/* Private macro -------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static uint8_t *USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_ManufacturerStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_ProductStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); #ifdef USB_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx , uint16_t *length); +static uint8_t *USBD_CDC_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); #endif /* USB_SUPPORT_USER_STRING_DESC */ #if (USBD_LPM_ENABLED == 1) -uint8_t *USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length); +uint8_t *USBD_CDC_USR_BOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length); #endif - -USBD_DescriptorsTypeDef FS_Desc = +/* Private variables ---------------------------------------------------------*/ +USBD_DescriptorsTypeDef CDC_Desc = { - USBD_FS_DeviceDescriptor, - USBD_FS_LangIDStrDescriptor, - USBD_FS_ManufacturerStrDescriptor, - USBD_FS_ProductStrDescriptor, - USBD_FS_SerialStrDescriptor, - USBD_FS_ConfigStrDescriptor, - USBD_FS_InterfaceStrDescriptor, + USBD_CDC_DeviceDescriptor, + USBD_CDC_LangIDStrDescriptor, + USBD_CDC_ManufacturerStrDescriptor, + USBD_CDC_ProductStrDescriptor, + USBD_CDC_SerialStrDescriptor, + USBD_CDC_ConfigStrDescriptor, + USBD_CDC_InterfaceStrDescriptor, #if (USBD_LPM_ENABLED == 1) - USBD_FS_USR_BOSDescriptor, + USBD_CDC_USR_BOSDescriptor, #endif }; +/* USB Standard Device Descriptor */ #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = - { - 0x12, /*bLength */ - USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { + 0x12, /* bLength */ + USB_DESC_TYPE_DEVICE, /* bDescriptorType */ #if (USBD_LPM_ENABLED == 1) 0x01, /*bcdUSB */ /* changed to USB version 2.01 in order to support LPM L1 suspend resume test of USBCV3.0*/ #else - 0x00, /* bcdUSB */ + 0x00, /* bcdUSB */ #endif - 0x02, - 0x00, /*bDeviceClass*/ - 0x00, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID_FS), /*idVendor*/ - HIBYTE(USBD_PID_FS), /*idVendor*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ - } ; -/* USB_DeviceDescriptor */ + 0x02, + 0x00, /* bDeviceClass */ + 0x00, /* bDeviceSubClass */ + 0x00, /* bDeviceProtocol */ + USB_MAX_EP0_SIZE, /* bMaxPacketSize */ + LOBYTE(USBD_VID), /* idVendor */ + HIBYTE(USBD_VID), /* idVendor */ + LOBYTE(USBD_PID), /* idVendor */ + HIBYTE(USBD_PID), /* idVendor */ + 0x00, /* bcdDevice rel. 2.00 */ + 0x02, + USBD_IDX_MFC_STR, /* Index of manufacturer string */ + USBD_IDX_PRODUCT_STR, /* Index of product string */ + USBD_IDX_SERIAL_STR, /* Index of serial number string */ + USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ +}; /* USB_DeviceDescriptor */ /* BOS descriptor */ #if (USBD_LPM_ENABLED == 1) #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif -__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = -{ +__ALIGN_BEGIN uint8_t USBD_CDC_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = { 0x5, USB_DESC_TYPE_BOS, 0xC, @@ -168,180 +157,146 @@ __ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = }; #endif +/* USB Standard Device Descriptor */ #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = -{ - USB_LEN_LANGID_STR_DESC, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = { + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), }; #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; -/** - * @} - */ -/** @defgroup USBD_DESC_Private_FunctionPrototypes - * @{ - */ /** - * @} - */ - -/** @defgroup USBD_DESC_Private_Functions - * @{ + * @brief Returns the device descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer */ - -/** -* @brief USBD_FS_DeviceDescriptor -* return the device descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_DeviceDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) +uint8_t *USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - *length = sizeof(USBD_FS_DeviceDesc); - return USBD_FS_DeviceDesc; + *length = sizeof(USBD_DeviceDesc); + return (uint8_t*)USBD_DeviceDesc; } /** -* @brief USBD_FS_LangIDStrDescriptor -* return the LangID string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_LangIDStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the LangID string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - *length = sizeof(USBD_LangIDDesc); - return USBD_LangIDDesc; + *length = sizeof(USBD_LangIDDesc); + return (uint8_t*)USBD_LangIDDesc; } /** -* @brief USBD_FS_ProductStrDescriptor -* return the product string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ProductStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the product string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - if(speed == 0) + if(speed == USBD_SPEED_HIGH) { - USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_CDC_PRODUCT_HS_STRING, USBD_StrDesc, length); } else { - USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_CDC_PRODUCT_FS_STRING, USBD_StrDesc, length); } return USBD_StrDesc; } /** -* @brief USBD_FS_ManufacturerStrDescriptor -* return the manufacturer string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ManufacturerStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the manufacturer string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); return USBD_StrDesc; } /** -* @brief USBD_FS_SerialStrDescriptor -* return the serial number string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the serial number string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { if(speed == USBD_SPEED_HIGH) { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); + USBD_GetString (USBD_CDC_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); } else { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); + USBD_GetString (USBD_CDC_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); } - return USBD_StrDesc; + return (uint8_t*)USBD_StrDesc; } /** -* @brief USBD_FS_ConfigStrDescriptor -* return the configuration string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the configuration string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - if(speed == USBD_SPEED_HIGH) + if(speed == USBD_SPEED_HIGH) { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + USBD_GetString(USBD_CDC_CONFIGURATION_HS_STRING, USBD_StrDesc, length); } else { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + USBD_GetString(USBD_CDC_CONFIGURATION_FS_STRING, USBD_StrDesc, length); } return USBD_StrDesc; } /** -* @brief USBD_HS_InterfaceStrDescriptor -* return the interface string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_InterfaceStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) + * @brief Returns the interface string descriptor. + * @param speed: Current device speed + * @param length: Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t *USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - if(speed == 0) + if(speed == USBD_SPEED_HIGH) { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_CDC_INTERFACE_HS_STRING, USBD_StrDesc, length); } else { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_CDC_INTERFACE_FS_STRING, USBD_StrDesc, length); } return USBD_StrDesc; } #if (USBD_LPM_ENABLED == 1) /** - * @brief USBD_FS_USR_BOSDescriptor + * @brief USBD_CDC_USR_BOSDescriptor * return the BOS descriptor * @param speed : current device speed * @param length : pointer to data length variable * @retval pointer to descriptor buffer */ -uint8_t *USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length) +uint8_t *USBD_CDC_USR_BOSDescriptor(USBD_SpeedTypeDef speed , uint16_t *length) { - *length = sizeof(USBD_FS_BOSDesc); - return (uint8_t*)USBD_FS_BOSDesc; -} + *length = sizeof(USBD_CDC_BOSDesc); + return (uint8_t*)USBD_CDC_BOSDesc; + } #endif -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - +#endif // USBCON /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/usb/usbd_desc.h b/variants/otto/usb/usbd_desc.h index 37d0a27..5a73ead 100644 --- a/variants/otto/usb/usbd_desc.h +++ b/variants/otto/usb/usbd_desc.h @@ -1,103 +1,64 @@ /** ****************************************************************************** - * @file : usbd_desc.h - * @version : v1.0_Cube - * @brief : Header for usbd_desc file. + * @file USB_Device/HID_Standalone/Inc/usbd_desc.h + * @author MCD Application Team + * @version V1.0.2 + * @date 06-May-2016 + * @brief Header for usbd_desc.c module ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics + * @attention * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** -*/ - + */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DESC__H__ -#define __USBD_DESC__H__ - -#ifdef __cplusplus - extern "C" { -#endif +#ifndef __USBD_DESC_H +#define __USBD_DESC_H +#ifdef USBCON /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DESC - * @brief general defines for the usb device library file - * @{ - */ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ -/** @defgroup USB_DESC_Exported_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Variables - * @{ - */ -extern USBD_DescriptorsTypeDef FS_Desc; -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +extern USBD_DescriptorsTypeDef CDC_Desc; +#endif // USBCON #endif /* __USBD_DESC_H */ -/** - * @} - */ - -/** -* @} -*/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/variants/otto/variant.cpp b/variants/otto/variant.cpp index 8e4dcfe..c078845 100644 --- a/variants/otto/variant.cpp +++ b/variants/otto/variant.cpp @@ -1,151 +1,229 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ +/* + Copyright (c) 2011 Arduino. All right reserved. -/** - * @file discovery_f4.cpp - * @author ala42 - * @brief discovery_f4 board file. - */ + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - /* - * Arduino srl - * Firmware and Library Development Team - * - * Francesco Alessi (alfran) - francesco@arduino.org - * 2016 Jun 9: Edited for Arduino STAR OTTO first release - * 2016 Jul 21: Renamed and reorganized Pin info structure - * 2016 Dec 20: Modified for HW rev 3 - */ + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "variant.h" -#include "gpio.h" -#include "rcc.h" -#include "timer.h" -#include "wiring_types.h" - -extern const stm32_pin_info PIN_MAP[GPIO_PINS] = { - -// GPIO BIT TIMER TIM_CH AF ADC ADC_CH -// D0...D13 NAME - IRQ - TIMER - ADC - ALTERNATE - - {GPIOA_dev, 1, TIMER5, 2, 2, NULL, ADCx}, // PA1: D00 - - TIM2_CH2/TIM5_CH2 - ADC123_IN1 - UART4_RX (Serial0) - - {GPIOA_dev, 0, TIMER5, 1, 2, NULL, ADCx}, // PA0: D01 - - TIM2_CH1/TIM5_CH1 - ADC123_IN0 - UART4_TX (Serial0) - - {GPIOH_dev, 6, TIMER12, 1, 9, NULL, ADCx}, // PH6: D02 - - TIM12_CH1 - - - {GPIOB_dev, 15, TIMER12, 2, 9, NULL, ADCx}, // PB15: D03 - - TIM1_CH3N/TIM8_CH3N/TIM12_CH2 - - - {GPIOC_dev, 7, TIMER8, 2, 3, NULL, ADCx}, // PC7: D04 - - TIM3_CH2/TIM8_CH2 - - - {GPIOC_dev, 6, TIMER8, 1, 3, NULL, ADCx}, // PC6: D05 - - TIM3_CH1/TIM8_CH1 - - - {GPIOD_dev, 13, TIMER4, 2, 2, NULL, ADCx}, // PD13: D06 - - TIM4_CH2 - - - {GPIOD_dev, 12, TIMER4, 1, 2, NULL, ADCx}, // PD12: D07 - - TIM4_CH1 - - - {GPIOA_dev, 8, TIMER1, 1, 1, NULL, ADCx}, // PA8: D08 - - TIM1_CH1 - - - {GPIOA_dev, 9, TIMER1, 2, 1, NULL, ADCx}, // PA9: D09 - - TIM1_CH2 - - - {GPIOA_dev, 15, TIMER2, 1, 1, NULL, ADCx}, // PA15: D10 - - TIM2_CH1 - - SPI1_NSS - {GPIOB_dev, 5, TIMER3, 2, 2, NULL, ADCx}, // PB5: D11 - - TIM3_CH2 - - SPI1_MOSI - {GPIOB_dev, 4, TIMER3, 1, 2, NULL, ADCx}, // PB4: D12 - - TIM3_CH1 - - SPI1_MISO - {GPIOB_dev, 3, TIMER2, 2, 1, NULL, ADCx}, // PB3: D13 - - TIM2_CH2 - - SPI1_SCK -// D14...D21 - {GPIOG_dev, 14, NULL, 0, AFx, NULL, ADCx}, // PG14: D14 - - - - USART6_TX (Serial3) - - {GPIOG_dev, 9, NULL, 0, AFx, NULL, ADCx}, // PG9: D15 - - - - USART6_RX (Serial3) - - {GPIOD_dev, 5, NULL, 0, AFx, NULL, ADCx}, // PD5: D16 - - - - USART2_TX (Serial2) - - {GPIOD_dev, 6, NULL, 0, AFx, NULL, ADCx}, // PD6: D17 - - - - USART2_RX (Serial2) - - {GPIOB_dev, 10, TIMER2, 3, 1, NULL, ADCx}, // PB10: D18 - - TIM2_CH3 - - USART3_TX (Serial1) - - {GPIOB_dev, 11, TIMER2, 4, 1, NULL, ADCx}, // PB11: D19 - - TIM2_CH4 - - USART3_RX (Serial1) - - {GPIOH_dev, 5, NULL, 0, AFx, NULL, ADCx}, // PH5: D20 - - - - I2C2_SDA - - {GPIOH_dev, 4, NULL, 0, AFx, NULL, ADCx}, // PH4: D21 - - - - I2C2_SCL - -// D22...D53 - {GPIOJ_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PE5: D22 - - - - - {GPIOG_dev, 11, NULL, 0, AFx, NULL, ADCx}, // PE6: D23 - - - - - {GPIOE_dev, 2, NULL, 0, AFx, NULL, ADCx}, // PE2: D24 - - - - - {GPIOE_dev, 4, NULL, 0, AFx, NULL, ADCx}, // PE4: D25 - - - - - {GPIOI_dev, 8, NULL, 0, AFx, NULL, ADCx}, // PI8: D26 - - - - - {GPIOC_dev, 13, NULL, 0, AFx, NULL, ADCx}, // PC13: D27 - - - - - {GPIOI_dev, 11, NULL, 0, AFx, NULL, ADCx}, // PI11: D28 - - - - - {GPIOI_dev, 12, NULL, 0, AFx, NULL, ADCx}, // PI12: D29 - - - - - {GPIOI_dev, 13, NULL, 0, AFx, NULL, ADCx}, // PI13: D30 - - - - - {GPIOI_dev, 14, NULL, 0, AFx, NULL, ADCx}, // PI14: D31 - - - - - {GPIOI_dev, 15, NULL, 0, AFx, NULL, ADCx}, // PI15: D32 - - - - - {GPIOJ_dev, 0, NULL, 0, AFx, NULL, ADCx}, // PJ0: D33 - - - - - {GPIOJ_dev, 1, NULL, 0, AFx, NULL, ADCx}, // PJ1: D34 - - - - - {GPIOI_dev, 10, NULL, 0, AFx, NULL, ADCx}, // PI10: D35 - - - - - {GPIOK_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PK3: D36 - - - - - {GPIOJ_dev, 4, NULL, 0, AFx, NULL, ADCx}, // PJ4: D37 - - - - - {GPIOK_dev, 5, NULL, 0, AFx, NULL, ADCx}, // PK5: D38 - - - - - {GPIOJ_dev, 5, NULL, 0, AFx, NULL, ADCx}, // PJ5: D39 - - - - - {GPIOD_dev, 11, NULL, 0, AFx, NULL, ADCx}, // PD11: D40 - - - - - {GPIOG_dev, 2, NULL, 0, AFx, NULL, ADCx}, // PG2: D41 - - - - - {GPIOG_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PG3: D42 - - - - - {GPIOG_dev, 6, NULL, 0, AFx, NULL, ADCx}, // PG6: D43 - - - - - {GPIOG_dev, 7, NULL, 0, AFx, NULL, ADCx}, // PG7: D44 - - - - - {GPIOD_dev, 4, NULL, 0, AFx, NULL, ADCx}, // PD4: D45 - - - - - {GPIOJ_dev, 12, NULL, 0, AFx, NULL, ADCx}, // PJ12: D46 - - - - - {GPIOJ_dev, 13, NULL, 0, AFx, NULL, ADCx}, // PJ13: D47 - - - - - {GPIOJ_dev, 14, NULL, 0, AFx, NULL, ADCx}, // PJ14: D48 - - - - - {GPIOJ_dev, 15, NULL, 0, AFx, NULL, ADCx}, // PJ15: D49 - - - - - {GPIOG_dev, 12, NULL, 0, AFx, NULL, ADCx}, // PG12: D50 - - - - - {GPIOB_dev, 13, TIMER1, 5, 1, NULL, ADCx}, // PB13: D51 - - TIM1_CH1N - - - {GPIOG_dev, 13, NULL, 0, AFx, NULL, ADCx}, // PG13: D52 - - - - - {GPIOB_dev, 12, NULL, 0, AFx, NULL, ADCx}, // PB12: D53 - - - - -// A0...A11 (D54...D65) - {GPIOB_dev, 0, TIMER3, 3, 2, ADC1_dev, 8}, // PB0: D54 / A0 - INT - TIM1_CH2N/TIM3_CH3/TIM8_CH2N - ADC12_IN8 - - {GPIOB_dev, 1, TIMER3, 4, 2, ADC1_dev, 9}, // PB1: D55 / A1 - INT - TIM1_CH3N/TIM3_CH4/TIM8_CH3N - ADC12_IN9 - - {GPIOF_dev, 6, TIMER10, 1, 3, ADC3_dev, 4}, // PF6: D56 / A2 - INT - TIM10_CH1 - ADC3_IN4 - - {GPIOC_dev, 5, NULL, 0, AFx, ADC1_dev, 15}, // PC5: D57 / A3 - INT - - ADC12_IN15 - - {GPIOA_dev, 3, TIMER5, 4, 2, ADC3_dev, 3}, // PA3: D58 / A4 - - TIM2_CH4/TIM5_CH4/TIM9_CH2 - ADC123_IN3 - - {GPIOA_dev, 2, TIMER5, 3, 2, ADC2_dev, 2}, // PA2: D59 / A5 - INT - TIM2_CH3/TIM5_CH3/TIM9_CH1 - ADC123_IN1 - - {GPIOF_dev, 10, NULL, 0, AFx, ADC3_dev, 8}, // PF10: D60 / A6 - INT - - ADC3_IN8 - - {GPIOA_dev, 7, NULL, 0, AFx, ADC1_dev, 7}, // PA7: D61 / A7 - INT - TIM1_CH1N/TIM3_CH1/TIM8_CH1N - ADC12_IN - - {GPIOC_dev, 2, NULL, 0, AFx, ADC2_dev, 12}, // PC2: D62 / A8 - INT - - ADC123_IN12 - - {GPIOC_dev, 4, NULL, 0, AFx, ADC1_dev, 14}, // PC4: D63 / A9 - - - ADC12_IN14 - - {GPIOF_dev, 7, TIMER11, 1, 3, ADC3_dev, 5}, // PF7: D64 / A10 - - TIM11_CH1 - ADC3_IN5 - - {GPIOC_dev, 1, NULL, 0, AFx, ADC3_dev, 11}, // PC1: D65 / A11 - - - ADC123_IN11 - -// DAC0 - DAC1 (D66 - D67) - {GPIOA_dev, 4, NULL, 0, AFx, ADC2_dev, 4}, // PA4: D66 / A12 - INT - - ADC12_IN4 - DAC_OUT1 - {GPIOA_dev, 5, TIMER8, 5, 3, ADC2_dev, 5}, // PA5: D67 / A13 - INT - TIM2_CH1/TIM8_CH1N - ADC12_IN5 - DAC_OUT2 -// CANRX - CANTX (D68 - D69) - {GPIOB_dev, 9, TIMER4, 4, 2, NULL, ADCx}, // PB9: D68 - INT - TIM4_CH4/TIM11_CH1 - - - {GPIOB_dev, 8, TIMER4, 3, 2, NULL, ADCx}, // PB8: D69 - INT - TIM4_CH3/TIM10_CH1 - - -// I2CB - (D70 - D71) - {GPIOB_dev, 7, TIMER4, 2, 2, NULL, ADCx}, // PB7: D70 - - TIM4_CH2 - - I2C1_SDA - {GPIOB_dev, 6, TIMER4, 1, 2, NULL, ADCx}, // PB6: D71 - - TIM4_CH1 - - I2C1_SCL -// SPI - (D72 - D74) - {GPIOB_dev, 14, NULL, 0, AFx, NULL, ADCx}, // PB14: D72 / MISO - - - - SPI2_MISO - {GPIOD_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PD3: D73 / SCK - - - - SPI2_SCK - {GPIOC_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PC3: D74 / MOSI - - - - SPI2_MOSI -// ESP8266 POWER (D75) - {GPIOH_dev, 13, NULL, 0, AFx, NULL, ADCx}, // PH13: D75 / WIFI_PWR - - - - -// USB POWER ENABLE (D76) - {GPIOK_dev, 4, NULL, 0, AFx, NULL, ADCx}, // PK4: D76 / USB_PWR - - - - -// LCD BACK LIGHT CONTROL (D77) - {GPIOJ_dev, 3, NULL, 0, AFx, NULL, ADCx}, // PJ3: D77 / LCD_BL - - - - -// AUDIO SELECTION PIN (D78) - {GPIOD_dev, 7, NULL, 0, AFx, NULL, ADCx}, // PD7: D78 / AUDIO_SEL- - - - -}; -extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 19, 51, 54, 55, 56, 58, 59, 64, 67, 68, 69 -}; +#ifdef __cplusplus +extern "C" { +#endif -extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67 +// Pin number +const PinName digitalPin[] = { + PA1, //D0 + PA0, //D1 + PH6, //D2 + PB15, //D3 + PC7, //D4 + PC6, //D5 + PD13, //D6 + PD12, //D7 + PA8, //D8 + PA9, //D9 + PA15, //D10 + PB5, //D11 + PB4, //D12 + PB3, //D13 + PG14, //D14 + PG9, //D15 + PD5, //D16 + PD6, //D17 + PB10, //D18 + PB11, //D19 + PH5, //D20 + PH4, //D21 + PJ3, //D22 + PG11, //D23 + PE2, //D24 + PE4, //D25 + PI8, //D26 + PC13, //D27 + PI11, //D28 + PI12, //D29 + PI13, //D30 + PI14, //D31 + PI15, //D32 + PJ0, //D33 + PJ1, //D34 + PI10, //D35 + PK3, //D36 + PJ4, //D37 + PK5, //D38 + PJ5, //D39 + PD11, //D40 + PG2, //D41 + PG3, //D42 + PG6, //D43 + PG7, //D44 + PD4, //D45 + PJ12, //D46 + PJ13, //D47 + PJ14, //D48 + PJ15, //D49 + PG12, //D50 + PB13, //D51 + PG13, //D52 + PB12, //D53 + PB0, //D54/A0 + PB1, //D55/A1 + PF6, //D56/A2 + PC5, //D57/A3 + PA3, //D58/A4 + PA2, //D59/A5 + PF10, //D60/A6 + PA7, //D61/A7 + PC2, //D62/A8 + PC4, //D63/A9 + PF7, //D64/A10 + PC1, //D65/A11 + PA4, //D66/A12 + PA5, //D67/A13 + PB9, //D68 + PB8, //D69 + PB7, //D70 + PB6, //D71 + PB14, //D72 + PD3, //D73 + PC3, //D74 + PH13, //D75 + PK4, //D76 + PJ3, //D77 + PD7, //D78 + PH8, //D79 + PH7, //D80 }; + +#ifdef __cplusplus +} +#endif + +/* + * UART objects + */ +HardwareSerial Serial(PA1, PA0); // RX/TX +HardwareSerial Serial1(PB11, PB10); // RX1/TX1 +HardwareSerial Serial2(PD6, PD5); // RX2/TX2 +HardwareSerial Serial3(PG9, PG14); // RX3/TX3 + +void serialEvent() __attribute__((weak)); +void serialEvent() { } + +void serialEvent1() __attribute__((weak)); +void serialEvent1() { } + +void serialEvent2() __attribute__((weak)); +void serialEvent2() { } + +void serialEvent3() __attribute__((weak)); +void serialEvent3() { } + +void serialEventRun(void) +{ + if (Serial.available()) serialEvent(); + if (Serial1.available()) serialEvent1(); + if (Serial2.available()) serialEvent2(); + if (Serial3.available()) serialEvent2(); +} + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + HAL_StatusTypeDef ret = HAL_OK; + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 180; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 3; + RCC_OscInitStruct.PLL.PLLR = 2; + + ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); + if(ret != HAL_OK) + { + while(1) { ; } + } + + /* Activate the OverDrive to reach the 180 MHz Frequency */ + ret = HAL_PWREx_EnableOverDrive(); + if(ret != HAL_OK) + { + while(1) { ; } + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV16; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + if(ret != HAL_OK) + { + while(1) { ; } + } + + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; + PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8; + PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLSAIP; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + HAL_RCC_EnableCSS(); + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; + PeriphClkInitStruct.PLLSAI.PLLSAIR = 7; + PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); + + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/variants/otto/variant.h b/variants/otto/variant.h index d9b56f8..5046504 100644 --- a/variants/otto/variant.h +++ b/variants/otto/variant.h @@ -1,213 +1,178 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - - /** - * @file aeroquad32.h - * @author Marti Bolivar - * @brief Private include file for Maple Native in boards.h - * - * See maple.h for more information on these definitions. - */ - - /* - * 2016 May 31 first release for: - * Adruino OTTO serial ports interface definitions - * - * Arduino srl - * - * Francesco Alessi (alfran) - francesco@arduino.org - */ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef _VARIANT_ARDUINO_STM32_ #define _VARIANT_ARDUINO_STM32_ -#ifndef _OTTO_H_ -#define _OTTO_H_ - - -#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) -#define portOutputRegister(port) ( &(port->regs->ODR) ) -#define portInputRegister(port) ( &(port->regs->IDR) ) -#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) -#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) -#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) - -#include "stm32f4xx_hal.h" - -#define Port2Pin(port, bit) ((port-'A')*16+bit) -#define CYCLES_PER_MICROSECOND 180 - -#undef STM32_PCLK1 -#undef STM32_PCLK2 -#define STM32_PCLK1 (CYCLES_PER_MICROSECOND*1000000/4) -#define STM32_PCLK2 (CYCLES_PER_MICROSECOND*1000000/2) - -#define SYSTICK_RELOAD_VAL (CYCLES_PER_MICROSECOND*1000-1) - -// PINs definition - -// USART1 - NOT USED -#define USART1_TX_GPIO_DEV GPIOB_dev -#define USART1_TX_GPIO_PIN 6 -#define USART1_TX_AF 7 -#define USART1_RX_GPIO_DEV GPIOB_dev -#define USART1_RX_GPIO_PIN 7 -#define USART1_RX_AF 7 - -// USART2 - Serial2 -#define USART2_TX_GPIO_DEV GPIOD_dev -#define USART2_TX_GPIO_PIN 5 -#define USART2_TX_AF 7 -#define USART2_RX_GPIO_DEV GPIOD_dev -#define USART2_RX_GPIO_PIN 6 -#define USART2_RX_AF 7 - -// USART3 - Serial1 / SerialWiFi -#define USART3_TX_GPIO_DEV GPIOB_dev -#define USART3_TX_GPIO_PIN 10 -#define USART3_TX_AF 7 -#define USART3_RX_GPIO_DEV GPIOB_dev -#define USART3_RX_GPIO_PIN 11 -#define USART3_RX_AF 7 - -// UART4 - Serial -#define UART4_TX_GPIO_DEV GPIOA_dev -#define UART4_TX_GPIO_PIN 0 -#define UART4_TX_AF 8 -#define UART4_RX_GPIO_DEV GPIOA_dev -#define UART4_RX_GPIO_PIN 1 -#define UART4_RX_AF 8 - -// UART5 - NOT USED -#define UART5_TX_GPIO_DEV GPIOD_dev -#define UART5_TX_GPIO_PIN 2 -#define UART5_TX_AF 8 -#define UART5_RX_GPIO_DEV GPIOC_dev -#define UART5_RX_GPIO_PIN 12 -#define UART5_RX_AF 8 - -// USART6 - Serial3 -#define USART6_TX_GPIO_DEV GPIOG_dev -#define USART6_TX_GPIO_PIN 14 -#define USART6_TX_AF 8 -#define USART6_RX_GPIO_DEV GPIOG_dev -#define USART6_RX_GPIO_PIN 9 -#define USART6_RX_AF 8 - -// UART7 - NOT USED -#define UART7_TX_GPIO_DEV GPIOF_dev -#define UART7_TX_GPIO_PIN 7 -#define UART7_TX_AF 8 -#define UART7_RX_GPIO_DEV GPIOF_dev -#define UART7_RX_GPIO_PIN 6 -#define UART7_RX_AF 8 - -// UART8 - NOT USED -#define UART8_TX_GPIO_DEV GPIOE_dev -#define UART8_TX_GPIO_PIN 0 -#define UART8_TX_AF 8 -#define UART8_RX_GPIO_DEV GPIOE_dev -#define UART8_RX_GPIO_PIN 1 -#define UART8_RX_AF 8 - -#define GPIO_PINS 165 -#define BOARD_NR_PWM_PINS 26 -#define BOARD_NR_ADC_PINS 14 -#define BOARD_NR_USED_PINS 80 - -// Analog PIN Definition -#define A0 D54 -#define A1 D55 -#define A2 D56 -#define A3 D57 -#define A4 D58 -#define A5 D59 -#define A6 D60 -#define A7 D61 -#define A8 D62 -#define A9 D63 -#define A10 D64 -#define A11 D65 -#define A12 D66 -#define A13 D67 +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ -// DAC PIN Definition -#define DAC0 D66 -#define DAC1 D67 +#include "Arduino.h" -// LEDs PIN Definition -#define LED_L D13 -#define LED_BUILTIN D13 +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#include "PeripheralPins.h" + +extern const PinName digitalPin[]; + +enum { + D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, + D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, + D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, + D30, D31, D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, D48, D49, + D50, D51, D52, D53, D54, D55, D56, D57, D58, D59, + D60, D61, D62, D63, D64, D65, D66, D67, D68, D69, + D70, D71, D72, D73, D74, D75, D76, D77, D78, D79, + D80, + DEND +}; + +enum { + A_START_AFTER = D53, + A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, + A10, A11, A12, A13, + AEND +}; + +//ADC resolution is 12bits +#define ADC_RESOLUTION 12 +#define DACC_RESOLUTION 12 + +//PWR resolution +#define PWM_RESOLUTION 8 +#define PWM_FREQUENCY 1000 +#define PWM_MAX_DUTY_CYCLE 255 + +//On-board LED pin number +#define LED_BUILTIN D13 +#define LED_L LED_BUILTIN -// CAN PIN -#define CANTX D68 -#define CANRX D69 -#define CANTX1 D51 -#define CANRX1 D53 + +//SPI definitions +//define 16 channels. As many channel as digital IOs +#define SPI_CHANNELS_NUM 16 + +//default chip salect pin +#define BOARD_SPI_DEFAULT_SS D23 + +//In case SPI CS channel is not used we define a default one +#define BOARD_SPI_OWN_SS SPI_CHANNELS_NUM // SPI PIN -#define MISO D72 -#define SCK D73 -#define MOSI D74 -#define SS D23 -#define MISO1 D12 -#define SCK1 D13 -#define MOSI1 D11 -#define SS1 D10 +#define MISO D72 +#define SCK D73 +#define SCLK SCK +#define MOSI D74 +#define SS D23 +#define MISO1 D12 +#define SCK1 D13 +#define SCLK1 SCK1 +#define MOSI1 D11 +#define SS1 D10 + +// DAC PIN Definition +#define DAC_0 D66 +#define DAC_1 D67 + +// CAN PIN +#define CANRX D69 +#define CANTX D68 // I2C PIN -#define SCL D71 -#define SDA D70 -#define SCL1 D20 -#define SDA1 D21 +#define SCL D71 +#define SDA D70 +#define SCL1 D21 +#define SDA1 D20 +#define SCL2 D80 +#define SDA2 D79 + +//Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM. +#define TIMER_TONE TIM2 +#define TIMER_UART_EMULATED TIM7 + +//Do not use basic timer: OC is required +#define TIMER_SERVO TIM2 //TODO: advanced-control timers don't work + +#define DEBUG_UART ((USART_TypeDef *) USART6) // SERIAL PORT PIN -#define RX D0 -#define TX D1 -#define RX1 D19 -#define TX1 D18 -#define RX2 D17 -#define TX2 D16 -#define RX3 D15 -#define TX3 D14 +#define RX D0 +#define TX D1 +#define RX1 D19 +#define TX1 D18 +#define RX2 D17 +#define TX2 D16 +#define RX3 D15 +#define TX3 D14 // WIFI POWER PIN -#define WIFI_PWR D75 +#define WIFI_PWR D75 // USB POWER PIN -#define USB_PWR D76 +#define USB_PWR D76 // LCD CONTROL -#define LCD_BL D77 +#define LCD_BL D77 // MIC SEL -#define MIC_SEL D78 -#define CODEC 0 -#define MCU 1 +#define MIC_SEL D78 +#define CODEC 0 +#define MCU 1 + +#ifdef __cplusplus +} // extern "C" #endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern HardwareSerial Serial; +extern HardwareSerial Serial1; +extern HardwareSerial Serial2; +extern HardwareSerial Serial3; + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial3 +#define SERIAL_PORT_HARDWARE Serial3 #endif + +#endif /* _VARIANT_ARDUINO_STM32_ */